pax_global_header00006660000000000000000000000064131256702420014514gustar00rootroot0000000000000052 comment=ff4ea4b104a00dfb57fec519cee35220c8b330c0 gImageReader-3.2.3/000077500000000000000000000000001312567024200140355ustar00rootroot00000000000000gImageReader-3.2.3/.gitignore000066400000000000000000000000061312567024200160210ustar00rootroot00000000000000build gImageReader-3.2.3/AUTHORS000066400000000000000000000000421312567024200151010ustar00rootroot00000000000000Sandro Mani gImageReader-3.2.3/CMakeLists.txt000066400000000000000000000243221312567024200166000ustar00rootroot00000000000000CMAKE_MINIMUM_REQUIRED(VERSION 2.8.11) LIST(APPEND CMAKE_MODULE_PATH ${CMAKE_CURRENT_SOURCE_DIR}/cmake) INCLUDE(GSettings) SET(ENV{LC_ALL} "C") # Project properties PROJECT(gimagereader) SET(PACKAGE_NAME gImageReader) SET(PACKAGE_VERSION 3.2.3) SET(PACKAGE_LOCALE_DIR "${CMAKE_INSTALL_PREFIX}/share/locale") # Variables SET(INTERFACE_TYPE "qt5" CACHE STRING "Select interface type: qt4/qt5/gtk") MESSAGE(STATUS "${INTERFACE_TYPE} interface will be built") SET(MANUAL_DIR "share/doc/gimagereader" CACHE PATH "Path where manual will be installed") SET(ENABLE_VERSIONCHECK 1 CACHE BOOL "Enable version check") EXECUTE_PROCESS(COMMAND date +%a\ %b\ %d\ %Y OUTPUT_VARIABLE PACKAGE_DATE OUTPUT_STRIP_TRAILING_WHITESPACE) EXECUTE_PROCESS(COMMAND date -R OUTPUT_VARIABLE PACKAGE_RFC_DATE OUTPUT_STRIP_TRAILING_WHITESPACE) EXECUTE_PROCESS(COMMAND git rev-parse HEAD OUTPUT_VARIABLE PACKAGE_REVISION OUTPUT_STRIP_TRAILING_WHITESPACE) IF(NOT IS_ABSOLUTE "${MANUAL_DIR}") SET(MANUAL_DIR "${CMAKE_INSTALL_PREFIX}/${MANUAL_DIR}") ENDIF() # Configure files CONFIGURE_FILE(data/gimagereader.appdata.xml.in data/gimagereader-${INTERFACE_TYPE}.appdata.xml @ONLY) CONFIGURE_FILE(data/gimagereader.desktop.in data/gimagereader-${INTERFACE_TYPE}.desktop @ONLY) CONFIGURE_FILE(packaging/gimagereader.spec.in packaging/gimagereader.spec @ONLY) CONFIGURE_FILE(packaging/debian/changelog.in packaging/debian/changelog @ONLY) FILE(GLOB gimagereader_HTML RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} data/manual*.html.in) SET(manualFiles) FOREACH(inFile ${gimagereader_HTML}) STRING(REGEX REPLACE ".in\$" "" outFile "${inFile}") CONFIGURE_FILE(${inFile} ${outFile} @ONLY) SET(manualFiles ${manualFiles} "${CMAKE_CURRENT_BINARY_DIR}/${outFile}") ENDFOREACH() # Definitions ADD_DEFINITIONS(-DPACKAGE_NAME=\"${PACKAGE_NAME}\") ADD_DEFINITIONS(-DPACKAGE_VERSION=\"${PACKAGE_VERSION}\") ADD_DEFINITIONS(-DPACKAGE_REVISION=\"${PACKAGE_REVISION}\") ADD_DEFINITIONS(-DGETTEXT_PACKAGE=\"${CMAKE_PROJECT_NAME}\") ADD_DEFINITIONS(-DENABLE_VERSIONCHECK=${ENABLE_VERSIONCHECK}) ADD_DEFINITIONS(-DMANUAL_DIR=\"${MANUAL_DIR}\") SET(CMAKE_CXX_STANDARD 11) SET(CXX_STANDARD_REQUIRED ON) # Dependencies FIND_PACKAGE(Gettext REQUIRED) FIND_PACKAGE(PkgConfig REQUIRED) PKG_CHECK_MODULES(TESSERACT tesseract) IF(NOT TESSERACT_FOUND) MESSAGE(WARNING "Using hardcoded cflags and ldflags for tesseract") SET(TESSERACT_INCLUDE_DIRS /usr/include/tesseract) SET(TESSERACT_LDFLAGS -ltesseract) ENDIF(NOT TESSERACT_FOUND) IF(UNIX) PKG_CHECK_MODULES(SANE sane-backends) ENDIF(UNIX) SET(PODOFO_LDFLAGS -lpodofo) INCLUDE_DIRECTORIES(${CMAKE_SOURCE_DIR}/common ${CMAKE_BINARY_DIR} ${TESSERACT_INCLUDE_DIRS} ${SANE_INCLUDE_DIRS}) IF("${INTERFACE_TYPE}" STREQUAL "gtk") PKG_CHECK_MODULES(GTKMM REQUIRED gtkmm-3.0) PKG_CHECK_MODULES(GTKSOURCEVIEWMM REQUIRED gtksourceviewmm-3.0) PKG_CHECK_MODULES(GTKSPELLMM REQUIRED gtkspellmm-3.0>=3.0.5) PKG_CHECK_MODULES(CAIROMM REQUIRED cairomm-1.0) PKG_CHECK_MODULES(PANGOMM REQUIRED pangomm-1.4) PKG_CHECK_MODULES(POPPLER REQUIRED poppler-glib) PKG_CHECK_MODULES(JSONGLIB REQUIRED json-glib-1.0) PKG_CHECK_MODULES(LIBXMLPP REQUIRED libxml++-2.6) FIND_PACKAGE(JPEG) IF(JPEG_FOUND) SET(LIBJPEG_INCLUDE_DIRS ${JPEG_INCLUDE_DIRS}) SET(LIBJPEG_LDFLAGS ${JPEG_LIBRARIES}) ELSE() PKG_CHECK_MODULES(LIBJPEG libjpeg) IF(NOT LIBJPEG_FOUND) MESSAGE(WARNING "Using hardcoded cflags and ldflags for libjpeg") SET(LIBJPEG_LDFLAGS "-ljpeg") ENDIF() ENDIF() PKG_CHECK_MODULES(FONTCONFIG REQUIRED fontconfig) INCLUDE_DIRECTORIES( ${GTKMM_INCLUDE_DIRS} ${GTKSOURCEVIEWMM_INCLUDE_DIRS} ${GTKSPELLMM_INCLUDE_DIRS} ${CAIROMM_INCLUDE_DIRS} ${PANGOMM_INCLUDE_DIRS} ${POPPLER_INCLUDE_DIRS} ${JSONGLIB_INCLUDE_DIRS} ${LIBXMLPP_INCLUDE_DIRS} ${LIBJPEG_INCLUDE_DIRS} ${FONTCONFIG_INCLUDE_DIRS} ) SET(gimagereader_LIBS ${GTKMM_LDFLAGS} ${GTKSOURCEVIEWMM_LDFLAGS} ${GTKSPELLMM_LDFLAGS} ${CAIROMM_LDFLAGS} ${PANGOMM_LDFLAGS} ${POPPLER_LDFLAGS} ${JSONGLIB_LDFLAGS} ${LIBXMLPP_LDFLAGS} ${LIBJPEG_LDFLAGS} ${PODOFO_LDFLAGS} ${FONTCONFIG_LDFLAGS} ) SET(srcdir "gtk") ELSEIF("${INTERFACE_TYPE}" STREQUAL "qt4") SET(CMAKE_AUTOMOC ON) FIND_PACKAGE(Qt4 REQUIRED) PKG_CHECK_MODULES(QTSPELL REQUIRED QtSpell-qt4>=0.8.0) PKG_CHECK_MODULES(POPPLER REQUIRED poppler-qt4) PKG_CHECK_MODULES(QJSON REQUIRED QJson) INCLUDE_DIRECTORIES(${QTSPELL_INCLUDE_DIRS} ${POPPLER_INCLUDE_DIRS} ${QJSON_INCLUDE_DIRS}) SET(gimagereader_LIBS ${QTSPELL_LDFLAGS} ${POPPLER_LDFLAGS} ${QJSON_LDFLAGS} ${PODOFO_LDFLAGS}) SET(srcdir "qt") ELSEIF("${INTERFACE_TYPE}" STREQUAL "qt5") SET(CMAKE_AUTOMOC ON) FIND_PACKAGE(Qt5DBus REQUIRED) FIND_PACKAGE(Qt5Network REQUIRED) FIND_PACKAGE(Qt5Widgets REQUIRED) FIND_PACKAGE(Qt5Xml REQUIRED) FIND_PACKAGE(Qt5PrintSupport REQUIRED) PKG_CHECK_MODULES(QTSPELL REQUIRED QtSpell-qt5>=0.8.0) PKG_CHECK_MODULES(POPPLER REQUIRED poppler-qt5) INCLUDE_DIRECTORIES(${QTSPELL_INCLUDE_DIRS} ${POPPLER_INCLUDE_DIRS}) SET(gimagereader_LIBS ${QTSPELL_LDFLAGS} ${POPPLER_LDFLAGS} ${PODOFO_LDFLAGS}) SET(srcdir "qt") ELSE() MESSAGE(FATAL_ERROR "Invalid interface type ${INTERFACE_TYPE}") ENDIF() INCLUDE_DIRECTORIES(${CMAKE_SOURCE_DIR}/${srcdir}/src/ ) # Files FILE(GLOB gimagereader_SRCS ${srcdir}/src/*.cc common/*.cc) # sort lists to avoid dependency on readdir() order and make build reproducible LIST(SORT gimagereader_SRCS) FILE(GLOB gimagereader_HDRS ${srcdir}/src/*.hh common/*.hh) LIST(SORT gimagereader_HDRS) FILE(GLOB gimagereader_FORMS ${srcdir}/data/*.ui) LIST(SORT gimagereader_FORMS) FILE(GLOB gimagereader_ICONS data/icons/*.png) LIST(SORT gimagereader_ICONS) IF("${srcdir}" STREQUAL "qt") FILE(GLOB gimagereader_RESOURCES qt/data/*.qrc) LIST(SORT gimagereader_RESOURCES) ENDIF() IF(UNIX) LIST(APPEND gimagereader_SRCS ${srcdir}/src/scanner/ScannerSane.cc) LIST(APPEND gimagereader_HDRS ${srcdir}/src/scanner/ScannerSane.hh) ELSE(UNIX) LIST(APPEND gimagereader_SRCS ${srcdir}/src/scanner/ScannerTwain.cc) LIST(APPEND gimagereader_HDRS ${srcdir}/src/scanner/ScannerTwain.hh) ENDIF(UNIX) IF("${srcdir}" STREQUAL "gtk") ADD_SCHEMA("gtk/data/org.gnome.gimagereader.gschema.xml") ADD_CUSTOM_COMMAND( OUTPUT gimagereader.gresource.c COMMAND glib-compile-resources gimagereader.gresource.xml --target=${CMAKE_CURRENT_BINARY_DIR}/gimagereader.gresource.c --generate-source WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}/gtk/data/ DEPENDS ${CMAKE_SOURCE_DIR}/gtk/data/gimagereader.gresource.xml ${CMAKE_SOURCE_DIR}/gtk/data/gimagereader.ui ${CMAKE_SOURCE_DIR}/gtk/data/crashhandler.ui ${CMAKE_SOURCE_DIR}/gtk/data/appmenu.ui ${CMAKE_SOURCE_DIR}/gtk/data/editor_text.ui ${CMAKE_SOURCE_DIR}/gtk/data/editor_hocr.ui) LIST(APPEND gimagereader_SRCS gimagereader.gresource.c) ELSEIF("${INTERFACE_TYPE}" STREQUAL "qt4") QT4_WRAP_UI(gimagereader_FORMS_HEADERS ${gimagereader_FORMS}) QT4_ADD_RESOURCES(gimagereader_RESOURCES_RCC ${gimagereader_RESOURCES}) ELSEIF("${INTERFACE_TYPE}" STREQUAL "qt5") QT5_WRAP_UI(gimagereader_FORMS_HEADERS ${gimagereader_FORMS}) QT5_ADD_RESOURCES(gimagereader_RESOURCES_RCC ${gimagereader_RESOURCES}) ENDIF() IF("${srcdir}" STREQUAL "qt") # Gettextize ui files ADD_CUSTOM_TARGET( gettextizeui COMMAND ${CMAKE_COMMAND} -P ${CMAKE_CURRENT_SOURCE_DIR}/cmake/gettextizeui.cmake ${gimagereader_FORMS_HEADERS} DEPENDS ${gimagereader_FORMS_HEADERS} ) ENDIF() FILE(READ po/LINGUAS langs_string) STRING(REGEX MATCHALL "[a-zA-Z_]+" langs "${langs_string}") FOREACH(lang ${langs}) CONFIGURE_FILE(po/${lang}.po ${lang}.po COPYONLY) ENDFOREACH() GETTEXT_PROCESS_POT_FILE(po/gimagereader.pot ALL INSTALL_DESTINATION ${PACKAGE_LOCALE_DIR} LANGUAGES ${langs}) IF(MINGW) ENABLE_LANGUAGE(RC) SET(CMAKE_RC_COMPILER_INIT ${CMAKE_GENERATOR_RC}) SET(CMAKE_RC_COMPILE_OBJECT " -O coff -i -o ") SET(gimagereader_SRCS ${gimagereader_SRCS} packaging/win32/gimagereader-icon.rc) LIST(APPEND gimagereader_LIBS -lintl -mwindows) ENDIF(MINGW) # Build and install IF("${srcdir}" STREQUAL "qt") STRING(TOLOWER "${CMAKE_BUILD_TYPE}" CMAKE_BUILD_TYPE_TOLOWER) IF(NOT CMAKE_BUILD_TYPE_TOLOWER MATCHES "debug") ADD_DEFINITIONS(-DQT_NO_DEBUG_OUTPUT) ENDIF() ENDIF() ADD_EXECUTABLE(gimagereader ${gimagereader_HDRS} ${gimagereader_SRCS} ${gimagereader_FORMS_HEADERS} ${gimagereader_RESOURCES_RCC} ) TARGET_LINK_LIBRARIES(gimagereader ${TESSERACT_LDFLAGS} ${gimagereader_LIBS} ${SANE_LDFLAGS} -ldl -lgomp ) IF("${CMAKE_CXX_COMPILER_ID}" STREQUAL "Clang") ELSE() SET_TARGET_PROPERTIES(gimagereader PROPERTIES COMPILE_FLAGS "-fopenmp") ENDIF() SET_TARGET_PROPERTIES(gimagereader PROPERTIES OUTPUT_NAME gimagereader-${INTERFACE_TYPE}) IF("${INTERFACE_TYPE}" STREQUAL "qt4") TARGET_LINK_LIBRARIES(gimagereader Qt4::QtCore Qt4::QtGui Qt4::QtNetwork Qt4::QtDBus Qt4::QtXml) ADD_DEPENDENCIES(gimagereader gettextizeui) ELSEIF("${INTERFACE_TYPE}" STREQUAL "qt5") TARGET_LINK_LIBRARIES(gimagereader Qt5::Widgets Qt5::Network Qt5::DBus Qt5::Xml Qt5::PrintSupport) ADD_DEPENDENCIES(gimagereader gettextizeui) ENDIF() INSTALL(TARGETS gimagereader DESTINATION bin) INSTALL(FILES data/icons/48x48/gimagereader.png DESTINATION share/icons/hicolor/48x48/apps/) INSTALL(FILES data/icons/128x128/gimagereader.png DESTINATION share/icons/hicolor/128x128/apps/) INSTALL(FILES data/icons/256x256/gimagereader.png DESTINATION share/icons/hicolor/256x256/apps/) INSTALL(FILES ${CMAKE_CURRENT_BINARY_DIR}/data/gimagereader-${INTERFACE_TYPE}.appdata.xml DESTINATION share/appdata) INSTALL(FILES ${CMAKE_CURRENT_BINARY_DIR}/data/gimagereader-${INTERFACE_TYPE}.desktop DESTINATION share/applications) INSTALL(FILES ${manualFiles} DESTINATION "${MANUAL_DIR}") # Dist ADD_CUSTOM_TARGET(dist COMMAND git archive --format=tar --prefix=${CMAKE_PROJECT_NAME}-${PACKAGE_VERSION}/ HEAD | xz > ${CMAKE_BINARY_DIR}/${CMAKE_PROJECT_NAME}-${PACKAGE_VERSION}.tar.xz WORKING_DIRECTORY ${CMAKE_SOURCE_DIR} ) gImageReader-3.2.3/COPYING000066400000000000000000001045141312567024200150750ustar00rootroot00000000000000 GNU GENERAL PUBLIC LICENSE Version 3, 29 June 2007 Copyright (C) 2007 Free Software Foundation, Inc. Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. Preamble The GNU General Public License is a free, copyleft license for software and other kinds of works. The licenses for most software and other practical works are designed to take away your freedom to share and change the works. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change all versions of a program--to make sure it remains free software for all its users. We, the Free Software Foundation, use the GNU General Public License for most of our software; it applies also to any other work released this way by its authors. You can apply it to your programs, too. When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for them if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs, and that you know you can do these things. To protect your rights, we need to prevent others from denying you these rights or asking you to surrender the rights. Therefore, you have certain responsibilities if you distribute copies of the software, or if you modify it: responsibilities to respect the freedom of others. For example, if you distribute copies of such a program, whether gratis or for a fee, you must pass on to the recipients the same freedoms that you received. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights. Developers that use the GNU GPL protect your rights with two steps: (1) assert copyright on the software, and (2) offer you this License giving you legal permission to copy, distribute and/or modify it. For the developers' and authors' protection, the GPL clearly explains that there is no warranty for this free software. For both users' and authors' sake, the GPL requires that modified versions be marked as changed, so that their problems will not be attributed erroneously to authors of previous versions. Some devices are designed to deny users access to install or run modified versions of the software inside them, although the manufacturer can do so. This is fundamentally incompatible with the aim of protecting users' freedom to change the software. The systematic pattern of such abuse occurs in the area of products for individuals to use, which is precisely where it is most unacceptable. Therefore, we have designed this version of the GPL to prohibit the practice for those products. If such problems arise substantially in other domains, we stand ready to extend this provision to those domains in future versions of the GPL, as needed to protect the freedom of users. Finally, every program is threatened constantly by software patents. States should not allow patents to restrict development and use of software on general-purpose computers, but in those that do, we wish to avoid the special danger that patents applied to a free program could make it effectively proprietary. To prevent this, the GPL assures that patents cannot be used to render the program non-free. The precise terms and conditions for copying, distribution and modification follow. TERMS AND CONDITIONS 0. Definitions. "This License" refers to version 3 of the GNU General Public License. "Copyright" also means copyright-like laws that apply to other kinds of works, such as semiconductor masks. "The Program" refers to any copyrightable work licensed under this License. Each licensee is addressed as "you". "Licensees" and "recipients" may be individuals or organizations. To "modify" a work means to copy from or adapt all or part of the work in a fashion requiring copyright permission, other than the making of an exact copy. The resulting work is called a "modified version" of the earlier work or a work "based on" the earlier work. A "covered work" means either the unmodified Program or a work based on the Program. To "propagate" a work means to do anything with it that, without permission, would make you directly or secondarily liable for infringement under applicable copyright law, except executing it on a computer or modifying a private copy. Propagation includes copying, distribution (with or without modification), making available to the public, and in some countries other activities as well. To "convey" a work means any kind of propagation that enables other parties to make or receive copies. Mere interaction with a user through a computer network, with no transfer of a copy, is not conveying. An interactive user interface displays "Appropriate Legal Notices" to the extent that it includes a convenient and prominently visible feature that (1) displays an appropriate copyright notice, and (2) tells the user that there is no warranty for the work (except to the extent that warranties are provided), that licensees may convey the work under this License, and how to view a copy of this License. If the interface presents a list of user commands or options, such as a menu, a prominent item in the list meets this criterion. 1. Source Code. The "source code" for a work means the preferred form of the work for making modifications to it. "Object code" means any non-source form of a work. A "Standard Interface" means an interface that either is an official standard defined by a recognized standards body, or, in the case of interfaces specified for a particular programming language, one that is widely used among developers working in that language. The "System Libraries" of an executable work include anything, other than the work as a whole, that (a) is included in the normal form of packaging a Major Component, but which is not part of that Major Component, and (b) serves only to enable use of the work with that Major Component, or to implement a Standard Interface for which an implementation is available to the public in source code form. A "Major Component", in this context, means a major essential component (kernel, window system, and so on) of the specific operating system (if any) on which the executable work runs, or a compiler used to produce the work, or an object code interpreter used to run it. The "Corresponding Source" for a work in object code form means all the source code needed to generate, install, and (for an executable work) run the object code and to modify the work, including scripts to control those activities. However, it does not include the work's System Libraries, or general-purpose tools or generally available free programs which are used unmodified in performing those activities but which are not part of the work. For example, Corresponding Source includes interface definition files associated with source files for the work, and the source code for shared libraries and dynamically linked subprograms that the work is specifically designed to require, such as by intimate data communication or control flow between those subprograms and other parts of the work. The Corresponding Source need not include anything that users can regenerate automatically from other parts of the Corresponding Source. The Corresponding Source for a work in source code form is that same work. 2. Basic Permissions. All rights granted under this License are granted for the term of copyright on the Program, and are irrevocable provided the stated conditions are met. This License explicitly affirms your unlimited permission to run the unmodified Program. The output from running a covered work is covered by this License only if the output, given its content, constitutes a covered work. This License acknowledges your rights of fair use or other equivalent, as provided by copyright law. You may make, run and propagate covered works that you do not convey, without conditions so long as your license otherwise remains in force. You may convey covered works to others for the sole purpose of having them make modifications exclusively for you, or provide you with facilities for running those works, provided that you comply with the terms of this License in conveying all material for which you do not control copyright. Those thus making or running the covered works for you must do so exclusively on your behalf, under your direction and control, on terms that prohibit them from making any copies of your copyrighted material outside their relationship with you. Conveying under any other circumstances is permitted solely under the conditions stated below. Sublicensing is not allowed; section 10 makes it unnecessary. 3. Protecting Users' Legal Rights From Anti-Circumvention Law. No covered work shall be deemed part of an effective technological measure under any applicable law fulfilling obligations under article 11 of the WIPO copyright treaty adopted on 20 December 1996, or similar laws prohibiting or restricting circumvention of such measures. When you convey a covered work, you waive any legal power to forbid circumvention of technological measures to the extent such circumvention is effected by exercising rights under this License with respect to the covered work, and you disclaim any intention to limit operation or modification of the work as a means of enforcing, against the work's users, your or third parties' legal rights to forbid circumvention of technological measures. 4. Conveying Verbatim Copies. You may convey verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice; keep intact all notices stating that this License and any non-permissive terms added in accord with section 7 apply to the code; keep intact all notices of the absence of any warranty; and give all recipients a copy of this License along with the Program. You may charge any price or no price for each copy that you convey, and you may offer support or warranty protection for a fee. 5. Conveying Modified Source Versions. You may convey a work based on the Program, or the modifications to produce it from the Program, in the form of source code under the terms of section 4, provided that you also meet all of these conditions: a) The work must carry prominent notices stating that you modified it, and giving a relevant date. b) The work must carry prominent notices stating that it is released under this License and any conditions added under section 7. This requirement modifies the requirement in section 4 to "keep intact all notices". c) You must license the entire work, as a whole, under this License to anyone who comes into possession of a copy. This License will therefore apply, along with any applicable section 7 additional terms, to the whole of the work, and all its parts, regardless of how they are packaged. This License gives no permission to license the work in any other way, but it does not invalidate such permission if you have separately received it. d) If the work has interactive user interfaces, each must display Appropriate Legal Notices; however, if the Program has interactive interfaces that do not display Appropriate Legal Notices, your work need not make them do so. A compilation of a covered work with other separate and independent works, which are not by their nature extensions of the covered work, and which are not combined with it such as to form a larger program, in or on a volume of a storage or distribution medium, is called an "aggregate" if the compilation and its resulting copyright are not used to limit the access or legal rights of the compilation's users beyond what the individual works permit. Inclusion of a covered work in an aggregate does not cause this License to apply to the other parts of the aggregate. 6. Conveying Non-Source Forms. You may convey a covered work in object code form under the terms of sections 4 and 5, provided that you also convey the machine-readable Corresponding Source under the terms of this License, in one of these ways: a) Convey the object code in, or embodied in, a physical product (including a physical distribution medium), accompanied by the Corresponding Source fixed on a durable physical medium customarily used for software interchange. b) Convey the object code in, or embodied in, a physical product (including a physical distribution medium), accompanied by a written offer, valid for at least three years and valid for as long as you offer spare parts or customer support for that product model, to give anyone who possesses the object code either (1) a copy of the Corresponding Source for all the software in the product that is covered by this License, on a durable physical medium customarily used for software interchange, for a price no more than your reasonable cost of physically performing this conveying of source, or (2) access to copy the Corresponding Source from a network server at no charge. c) Convey individual copies of the object code with a copy of the written offer to provide the Corresponding Source. This alternative is allowed only occasionally and noncommercially, and only if you received the object code with such an offer, in accord with subsection 6b. d) Convey the object code by offering access from a designated place (gratis or for a charge), and offer equivalent access to the Corresponding Source in the same way through the same place at no further charge. You need not require recipients to copy the Corresponding Source along with the object code. If the place to copy the object code is a network server, the Corresponding Source may be on a different server (operated by you or a third party) that supports equivalent copying facilities, provided you maintain clear directions next to the object code saying where to find the Corresponding Source. Regardless of what server hosts the Corresponding Source, you remain obligated to ensure that it is available for as long as needed to satisfy these requirements. e) Convey the object code using peer-to-peer transmission, provided you inform other peers where the object code and Corresponding Source of the work are being offered to the general public at no charge under subsection 6d. A separable portion of the object code, whose source code is excluded from the Corresponding Source as a System Library, need not be included in conveying the object code work. A "User Product" is either (1) a "consumer product", which means any tangible personal property which is normally used for personal, family, or household purposes, or (2) anything designed or sold for incorporation into a dwelling. In determining whether a product is a consumer product, doubtful cases shall be resolved in favor of coverage. For a particular product received by a particular user, "normally used" refers to a typical or common use of that class of product, regardless of the status of the particular user or of the way in which the particular user actually uses, or expects or is expected to use, the product. A product is a consumer product regardless of whether the product has substantial commercial, industrial or non-consumer uses, unless such uses represent the only significant mode of use of the product. "Installation Information" for a User Product means any methods, procedures, authorization keys, or other information required to install and execute modified versions of a covered work in that User Product from a modified version of its Corresponding Source. The information must suffice to ensure that the continued functioning of the modified object code is in no case prevented or interfered with solely because modification has been made. If you convey an object code work under this section in, or with, or specifically for use in, a User Product, and the conveying occurs as part of a transaction in which the right of possession and use of the User Product is transferred to the recipient in perpetuity or for a fixed term (regardless of how the transaction is characterized), the Corresponding Source conveyed under this section must be accompanied by the Installation Information. But this requirement does not apply if neither you nor any third party retains the ability to install modified object code on the User Product (for example, the work has been installed in ROM). The requirement to provide Installation Information does not include a requirement to continue to provide support service, warranty, or updates for a work that has been modified or installed by the recipient, or for the User Product in which it has been modified or installed. Access to a network may be denied when the modification itself materially and adversely affects the operation of the network or violates the rules and protocols for communication across the network. Corresponding Source conveyed, and Installation Information provided, in accord with this section must be in a format that is publicly documented (and with an implementation available to the public in source code form), and must require no special password or key for unpacking, reading or copying. 7. Additional Terms. "Additional permissions" are terms that supplement the terms of this License by making exceptions from one or more of its conditions. Additional permissions that are applicable to the entire Program shall be treated as though they were included in this License, to the extent that they are valid under applicable law. If additional permissions apply only to part of the Program, that part may be used separately under those permissions, but the entire Program remains governed by this License without regard to the additional permissions. When you convey a copy of a covered work, you may at your option remove any additional permissions from that copy, or from any part of it. (Additional permissions may be written to require their own removal in certain cases when you modify the work.) You may place additional permissions on material, added by you to a covered work, for which you have or can give appropriate copyright permission. Notwithstanding any other provision of this License, for material you add to a covered work, you may (if authorized by the copyright holders of that material) supplement the terms of this License with terms: a) Disclaiming warranty or limiting liability differently from the terms of sections 15 and 16 of this License; or b) Requiring preservation of specified reasonable legal notices or author attributions in that material or in the Appropriate Legal Notices displayed by works containing it; or c) Prohibiting misrepresentation of the origin of that material, or requiring that modified versions of such material be marked in reasonable ways as different from the original version; or d) Limiting the use for publicity purposes of names of licensors or authors of the material; or e) Declining to grant rights under trademark law for use of some trade names, trademarks, or service marks; or f) Requiring indemnification of licensors and authors of that material by anyone who conveys the material (or modified versions of it) with contractual assumptions of liability to the recipient, for any liability that these contractual assumptions directly impose on those licensors and authors. All other non-permissive additional terms are considered "further restrictions" within the meaning of section 10. If the Program as you received it, or any part of it, contains a notice stating that it is governed by this License along with a term that is a further restriction, you may remove that term. If a license document contains a further restriction but permits relicensing or conveying under this License, you may add to a covered work material governed by the terms of that license document, provided that the further restriction does not survive such relicensing or conveying. If you add terms to a covered work in accord with this section, you must place, in the relevant source files, a statement of the additional terms that apply to those files, or a notice indicating where to find the applicable terms. Additional terms, permissive or non-permissive, may be stated in the form of a separately written license, or stated as exceptions; the above requirements apply either way. 8. Termination. You may not propagate or modify a covered work except as expressly provided under this License. Any attempt otherwise to propagate or modify it is void, and will automatically terminate your rights under this License (including any patent licenses granted under the third paragraph of section 11). However, if you cease all violation of this License, then your license from a particular copyright holder is reinstated (a) provisionally, unless and until the copyright holder explicitly and finally terminates your license, and (b) permanently, if the copyright holder fails to notify you of the violation by some reasonable means prior to 60 days after the cessation. Moreover, your license from a particular copyright holder is reinstated permanently if the copyright holder notifies you of the violation by some reasonable means, this is the first time you have received notice of violation of this License (for any work) from that copyright holder, and you cure the violation prior to 30 days after your receipt of the notice. Termination of your rights under this section does not terminate the licenses of parties who have received copies or rights from you under this License. If your rights have been terminated and not permanently reinstated, you do not qualify to receive new licenses for the same material under section 10. 9. Acceptance Not Required for Having Copies. You are not required to accept this License in order to receive or run a copy of the Program. Ancillary propagation of a covered work occurring solely as a consequence of using peer-to-peer transmission to receive a copy likewise does not require acceptance. However, nothing other than this License grants you permission to propagate or modify any covered work. These actions infringe copyright if you do not accept this License. Therefore, by modifying or propagating a covered work, you indicate your acceptance of this License to do so. 10. Automatic Licensing of Downstream Recipients. Each time you convey a covered work, the recipient automatically receives a license from the original licensors, to run, modify and propagate that work, subject to this License. You are not responsible for enforcing compliance by third parties with this License. An "entity transaction" is a transaction transferring control of an organization, or substantially all assets of one, or subdividing an organization, or merging organizations. If propagation of a covered work results from an entity transaction, each party to that transaction who receives a copy of the work also receives whatever licenses to the work the party's predecessor in interest had or could give under the previous paragraph, plus a right to possession of the Corresponding Source of the work from the predecessor in interest, if the predecessor has it or can get it with reasonable efforts. You may not impose any further restrictions on the exercise of the rights granted or affirmed under this License. For example, you may not impose a license fee, royalty, or other charge for exercise of rights granted under this License, and you may not initiate litigation (including a cross-claim or counterclaim in a lawsuit) alleging that any patent claim is infringed by making, using, selling, offering for sale, or importing the Program or any portion of it. 11. Patents. A "contributor" is a copyright holder who authorizes use under this License of the Program or a work on which the Program is based. The work thus licensed is called the contributor's "contributor version". A contributor's "essential patent claims" are all patent claims owned or controlled by the contributor, whether already acquired or hereafter acquired, that would be infringed by some manner, permitted by this License, of making, using, or selling its contributor version, but do not include claims that would be infringed only as a consequence of further modification of the contributor version. For purposes of this definition, "control" includes the right to grant patent sublicenses in a manner consistent with the requirements of this License. Each contributor grants you a non-exclusive, worldwide, royalty-free patent license under the contributor's essential patent claims, to make, use, sell, offer for sale, import and otherwise run, modify and propagate the contents of its contributor version. In the following three paragraphs, a "patent license" is any express agreement or commitment, however denominated, not to enforce a patent (such as an express permission to practice a patent or covenant not to sue for patent infringement). To "grant" such a patent license to a party means to make such an agreement or commitment not to enforce a patent against the party. If you convey a covered work, knowingly relying on a patent license, and the Corresponding Source of the work is not available for anyone to copy, free of charge and under the terms of this License, through a publicly available network server or other readily accessible means, then you must either (1) cause the Corresponding Source to be so available, or (2) arrange to deprive yourself of the benefit of the patent license for this particular work, or (3) arrange, in a manner consistent with the requirements of this License, to extend the patent license to downstream recipients. "Knowingly relying" means you have actual knowledge that, but for the patent license, your conveying the covered work in a country, or your recipient's use of the covered work in a country, would infringe one or more identifiable patents in that country that you have reason to believe are valid. If, pursuant to or in connection with a single transaction or arrangement, you convey, or propagate by procuring conveyance of, a covered work, and grant a patent license to some of the parties receiving the covered work authorizing them to use, propagate, modify or convey a specific copy of the covered work, then the patent license you grant is automatically extended to all recipients of the covered work and works based on it. A patent license is "discriminatory" if it does not include within the scope of its coverage, prohibits the exercise of, or is conditioned on the non-exercise of one or more of the rights that are specifically granted under this License. You may not convey a covered work if you are a party to an arrangement with a third party that is in the business of distributing software, under which you make payment to the third party based on the extent of your activity of conveying the work, and under which the third party grants, to any of the parties who would receive the covered work from you, a discriminatory patent license (a) in connection with copies of the covered work conveyed by you (or copies made from those copies), or (b) primarily for and in connection with specific products or compilations that contain the covered work, unless you entered into that arrangement, or that patent license was granted, prior to 28 March 2007. Nothing in this License shall be construed as excluding or limiting any implied license or other defenses to infringement that may otherwise be available to you under applicable patent law. 12. No Surrender of Others' Freedom. If conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot convey a covered work so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not convey it at all. For example, if you agree to terms that obligate you to collect a royalty for further conveying from those to whom you convey the Program, the only way you could satisfy both those terms and this License would be to refrain entirely from conveying the Program. 13. Use with the GNU Affero General Public License. Notwithstanding any other provision of this License, you have permission to link or combine any covered work with a work licensed under version 3 of the GNU Affero General Public License into a single combined work, and to convey the resulting work. The terms of this License will continue to apply to the part which is the covered work, but the special requirements of the GNU Affero General Public License, section 13, concerning interaction through a network will apply to the combination as such. 14. Revised Versions of this License. The Free Software Foundation may publish revised and/or new versions of the GNU General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Program specifies that a certain numbered version of the GNU General Public License "or any later version" applies to it, you have the option of following the terms and conditions either of that numbered version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of the GNU General Public License, you may choose any version ever published by the Free Software Foundation. If the Program specifies that a proxy can decide which future versions of the GNU General Public License can be used, that proxy's public statement of acceptance of a version permanently authorizes you to choose that version for the Program. Later license versions may give you additional or different permissions. However, no additional obligations are imposed on any author or copyright holder as a result of your choosing to follow a later version. 15. Disclaimer of Warranty. THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 16. Limitation of Liability. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. 17. Interpretation of Sections 15 and 16. If the disclaimer of warranty and limitation of liability provided above cannot be given local legal effect according to their terms, reviewing courts shall apply local law that most closely approximates an absolute waiver of all civil liability in connection with the Program, unless a warranty or assumption of liability accompanies a copy of the Program in return for a fee. END OF TERMS AND CONDITIONS How to Apply These Terms to Your New Programs If you develop a new program, and you want it to be of the greatest possible use to the public, the best way to achieve this is to make it free software which everyone can redistribute and change under these terms. To do so, attach the following notices to the program. It is safest to attach them to the start of each source file to most effectively state the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. Copyright (C) This program 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. This program 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 this program. If not, see . Also add information on how to contact you by electronic and paper mail. If the program does terminal interaction, make it output a short notice like this when it starts in an interactive mode: Copyright (C) This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. This is free software, and you are welcome to redistribute it under certain conditions; type `show c' for details. The hypothetical commands `show w' and `show c' should show the appropriate parts of the General Public License. Of course, your program's commands might be different; for a GUI interface, you would use an "about box". You should also get your employer (if you work as a programmer) or school, if any, to sign a "copyright disclaimer" for the program, if necessary. For more information on this, and how to apply and follow the GNU GPL, see . The GNU General Public License does not permit incorporating your program into proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the library. If this is what you want to do, use the GNU Lesser General Public License instead of this License. But first, please read . gImageReader-3.2.3/ChangeLog000066400000000000000000000003721312567024200156110ustar00rootroot00000000000000For a detailed list of changes, please refer to the commit browser on the project website, at https://github.com/manisandro/gImageReader/commits/master . For an overview of the most important changes between versions, please refer to the NEWS file. gImageReader-3.2.3/LATEST000066400000000000000000000000061312567024200147500ustar00rootroot000000000000003.2.3 gImageReader-3.2.3/NEWS000066400000000000000000000177111312567024200145430ustar00rootroot00000000000000gImageReader 3.2.3 (Jul 01 2017): * Fix broken hOCR export * Add option to prepend source filename / page to plain text output gImageReader 3.2.2 (Jun 30 2017): * Attempt to use original source image for PDF output * Allow collapsing/expanding branches of hOCR tree via context menu * Recognize guillemets as quote characters * Fix crash when adding zero-page sources * Fix possible crash when rapidly switching documents * [Gtk] Fix output pane orientation not properly restored * [Gtk] Don't crash when rendering of image fails * [Gtk] Fix icons not appearing with recent Gtk versions * [Qt] Don't display empty image if rendering of downscaled image fails gImageReader 3.2.1 (Feb 10 2017): * Add possibility to rotate individual pages of multipage documents * Ensure the tessdata manager downloads compatible tesseract languge definitions * Add CCITT Group4 compression option for monochrome PDF export * Allow choosing between diffuse and threshold dithering for monochrome PDF export * Preview JPEG compression quality in PDF output preview * Make brightness/contrast/resolution changes affect all selected sources * [Qt] Support multipage images through QImageReader (Qt5.9+ will support multipage TIFFs) * [Gtk] Fix hang when saving selection image * [Qt] Fix possible deadlock when rapidly switching sources * Updated translations gImageReader 3.2.0 (Nov 23 2016): * gImageReader 3.2.0 stable * Add PageUp / PageDown keyboard accelerators for browsing multipage documents * See 3.1.9x changelogs for all other feature changes since previous stable * Many bug fixes since 3.1.99 - special thanks to Daniel Plakhotich * Full details in commit log: https://github.com/manisandro/gImageReader/commits/master gImageReader 3.1.99 (Oct 13 2016): * gImageReader 3.2 release candidate * General improvements: - Catch critical tesseract errors which otherwise result in the application crashing - Improve spelling dictionary auto-installation logic - Allow choosing whether to store language files (language definitions, spelling dictionaries) in system-wide or user-local directories * Plain text mode improvements: - Allow recognizing user-defined regions on multiple pages - Also treat \u2014 character as a hyphen - Make preserve paragraphs option correctly deal with trailing whitespace * hOCR editor improvements: - Add "Add to dictionary" and "Ignore word" actions to spell-checking menu in hOCR editor - Exclude non-word characters from spell-checking - Allow merging adjacent word items - Allow adjusting bounding boxes of document elements by resizing the selection in the canvas - Allow removing arbitrary items from the document tree - Allow defining custom graphic regions from context-menu of the respective page item * PDF export improvements: - Add previewing capability - Take into account baseline information to better position the words in the generated PDF - Add options to choose color format and compression of images written to PDF, allowing to greatly reduce the size of PDF - Correctly handle paper size and DPI - Improve logic for uniformizing word and line spacing - Make sure correct hypen character is used, allowing PDF applications to correctly find hyphenated words * New and updated translations * Various bug fixes * Full details in commit log: https://github.com/manisandro/gImageReader/commits/master gImageReader 3.1.91 (May 03 2016): * gImageReader 3.2 beta 2 * Fix crash when editing items in the hOCR editor * Fix build with Ubuntu 14.04 * Updated czech translation * Fix some string typos * Full details in commit log: https://github.com/manisandro/gImageReader/commits/master gImageReader 3.1.90 (Apr 28 2016): * gImageReader 3.2 beta 1 * Add an initial hOCR editor implementation, with possibility to save as hOCR HTML, PDF with invisible text overlay, or a PDF reconstructed from the extracted text and graphics * Allow selecting and working on multiple sources at once * Add a tessdata manager, to conveniently manage tesseract language definitions directly from the application * Show a progress bar when recognizing, add a cancel button * Modernized Gtk UI * Expose script and orientation detection support * Possiblity to pan via middle button drag * Remove the need to specify the culture code in custom language definitions, and use a built-in language-culture mapping instead to search for spelling dictionaries * Various bug fixes * Full details in commit log: https://github.com/manisandro/gImageReader/commits/master gImageReader 3.1.2 (Jun 30 2015): * Fix incorrect behavior of "Append to current text" with multiple recognition areas * Full details in commit log: https://github.com/manisandro/gImageReader/commits/master gImageReader 3.1.1 (Jun 11 2015): * Fix titlebar now shown when window maximized in Gnome 3 * New translations: Chinese (Hong Kong), Chinese (Taiwan) * Updated translations: Russian, Portoguese gImageReader 3.1 (May 1 2015): * Add option to draw whitespace * Allow searching and replacing only in selected portion of output text * Add "preserve paragraphs" postprocessing option * Allow to open files via drag and drop * Improve rendering of certain PDF files with the Qt interface * Fix scanning broken with certain scanners under Windows * Support automatic spelling dictionary installation under Windows * Allow saving scans in other formats than png * Handful of bugs fixed * Full details in commit log: https://github.com/manisandro/gImageReader/commits/master gImageReader 3.0.1 (Jan 4 2015): * Fix a bug in the Qt interface when loading substitutions list from file * Improve behaviour of strip line breaks functionality with multiple line breaks * Small UI improvements * Full details in commit log: https://github.com/manisandro/gImageReader/commits/master gImageReader 3.0 (Dec 12 2014): * gImageReader 3.0 stable * New Qt4/5 interface, as alternative to the Gtk interface * Fixed scanning on Windows * Memorize image settings (brightness, contrast, etc) when switching images * Search forward and backward, replace all, case sensitive search * Many bug fixes * Translation updates * Full details in commit log: https://github.com/manisandro/gImageReader/commits/master gImageReader 2.93 (Apr 30 2014): * gImageReader 3.0 beta 4 * Add possibility to choose multiple recognition languages * Add button to show/hide output pane * Fix a crash when loading a scanned document * Allow toggling spell checking from context menu * Full details in commit log: https://github.com/manisandro/gImageReader/commits/master gImageReader 2.92 (Mar 19 2014): * gImageReader 3.0 beta 3 * Add replacement-list feature, allowing the user to specify a list of replacements to perform on the recognized text * Fix saving output resulting in empty files * Fix crashes when rendering PDF files * Keep line-breaks if preeded by line-break * Fix localization not working on Windows * Full details in commit log: https://github.com/manisandro/gImageReader/commits/master gImageReader 2.91 (Feb 20 2014): * gImageReader 3.0 beta 2 * Improve page-layout autodetection by merging overlapping regions * Use native file-chooser dialogs on Gnome/KDE/Windows * Allow performing multipage-recognition with page-layout autodetection * Fix broken search/replace which caused the application to crash * Add Win64 packages * Fix some other bugs, full details in commit log: https://github.com/manisandro/gImageReader/commits/master gImageReader 2.90 (Feb 11 2014): * First beta of the grand new gImageReader: - Support multiple selections (via CTRL-key). Rightclicking a selection opens a context menu which allows to: - Deleted and reordered individual selections. - Recognize the selected text, either to clipboard or to the output pane. - Basic automatic page layout detection. - The output pane now supports undo and redo. - Configuration is now automatic. - Proper arbitrary rotation of images. - Detect deleted/renamed files. - Cleaner UI. - Port to Gtk+3, rewrite in C++ using the Gtkmm bindings. gImageReader-3.2.3/README000066400000000000000000000007351312567024200147220ustar00rootroot00000000000000gImageReader is a simple Gtk/Qt front-end to tesseract. Features include: - Import PDF documents and images from disk, scanning devices, clipboard and screenshots - Process multiple images and documents in one go - Manual or automatic recognition area definition - Recognize to plain text or to hOCR documents - Recognized text displayed directly next to the image - Post-process the recognized text, including spellchecking - Generate PDF documents from hOCR documents gImageReader-3.2.3/README.md000066400000000000000000000057061312567024200153240ustar00rootroot00000000000000gImageReader ============ gImageReader is a simple Gtk/Qt front-end to [tesseract-ocr](https://github.com/tesseract-ocr/tesseract). ![Logo](https://raw.githubusercontent.com/manisandro/gImageReader/gh-pages/gimagereader.jpg) Features: ------------ - Import PDF documents and images from disk, scanning devices, clipboard and screenshots - Process multiple images and documents in one go - Manual or automatic recognition area definition - Recognize to plain text or to hOCR documents - Recognized text displayed directly next to the image - Post-process the recognized text, including spellchecking - Generate PDF documents from hOCR documents Installation: --------------- - ![Source](https://raw.githubusercontent.com/manisandro/gImageReader/gh-pages/icons/source.png) **Source**: Download from the [releases page](https://github.com/manisandro/gImageReader/releases) - ![Windows](https://raw.githubusercontent.com/manisandro/gImageReader/gh-pages/icons/windows.png) **Windows**: Download from the [releases page](https://github.com/manisandro/gImageReader/releases) - ![Fedora](https://raw.githubusercontent.com/manisandro/gImageReader/gh-pages/icons/fedora.png) **Fedora**: Available from the [official repositories](https://apps.fedoraproject.org/packages/gimagereader) - ![Debian](https://raw.githubusercontent.com/manisandro/gImageReader/gh-pages/icons/debian.png) **Debian**: Available from the [official repositories](https://packages.debian.org/unstable/main/gimagereader) - ![Ubuntu](https://raw.githubusercontent.com/manisandro/gImageReader/gh-pages/icons/ubuntu.png) **Ubuntu**: Available from [ppa:sandromani/gimagereader](https://launchpad.net/~sandromani/+archive/ubuntu/gimagereader) - ![OpenSUSE](https://raw.githubusercontent.com/manisandro/gImageReader/gh-pages/icons/opensuse.png) **OpenSUSE**: Available from [OpenSUSE Build Service](https://build.opensuse.org/project/show/home:sandromani) - ![ArchLinux](https://raw.githubusercontent.com/manisandro/gImageReader/gh-pages/icons/arch.png) **ArchLinux**: Available from [AUR (Gtk version)](https://aur.archlinux.org/packages/gimagereader/) and [AUR (Qt version)](https://aur.archlinux.org/packages/gimagereader-qt5/) Compilation: -------------- The steps for compiling gImageReader from source are documented in the [wiki](https://github.com/manisandro/gImageReader/wiki/Compiling-gImageReader). Support: ---------- If you encounter issues, please file a ticket in the [issue tracker](https://github.com/manisandro/gImageReader/issues), or feel free to mail me directly at `manisandro(at)gmail(dot)com`. Be sure to also consult the [FAQ](https://github.com/manisandro/gImageReader/wiki/FAQ). Contributing: --------------- Contributions are always welcome, ideally in the form of pull-requests. Especially welcome are translations. These can be created as follows: 1. Copy `po/gimagereader.pot` file to `po/.po` (i.e. `po/de.po`) 2. Translate the strings in `po/.po` 3. Add the language to `po/LINGUAS` gImageReader-3.2.3/TODO000066400000000000000000000000001312567024200145130ustar00rootroot00000000000000gImageReader-3.2.3/astyle.options000066400000000000000000000001201312567024200167440ustar00rootroot00000000000000--preserve-date --indent-preprocessor --style=java --indent=tab#4 --suffix=none gImageReader-3.2.3/cmake/000077500000000000000000000000001312567024200151155ustar00rootroot00000000000000gImageReader-3.2.3/cmake/GSettings.cmake000066400000000000000000000037351312567024200200360ustar00rootroot00000000000000# GSettings.cmake, CMake macros written for Marlin, feel free to re-use them. option (GSETTINGS_LOCALINSTALL "Install GSettings Schemas locally instead of to the GLib prefix" ON) option (GSETTINGS_COMPILE "Compile GSettings Schemas after installation" ${GSETTINGS_LOCALINSTALL}) if(GSETTINGS_LOCALINSTALL) message(STATUS "GSettings schemas will be installed locally.") endif() if(GSETTINGS_COMPILE) message(STATUS "GSettings shemas will be compiled.") endif() macro(add_schema SCHEMA_NAME) set(PKG_CONFIG_EXECUTABLE pkg-config) # Have an option to not install the schema into where GLib is if (GSETTINGS_LOCALINSTALL) SET (GSETTINGS_DIR "${CMAKE_INSTALL_PREFIX}/share/glib-2.0/schemas/") else (GSETTINGS_LOCALINSTALL) execute_process (COMMAND ${PKG_CONFIG_EXECUTABLE} glib-2.0 --variable prefix OUTPUT_VARIABLE _glib_prefix OUTPUT_STRIP_TRAILING_WHITESPACE) SET (GSETTINGS_DIR "${_glib_prefix}/share/glib-2.0/schemas/") endif (GSETTINGS_LOCALINSTALL) # Run the validator and error if it fails execute_process (COMMAND ${PKG_CONFIG_EXECUTABLE} gio-2.0 --variable glib_compile_schemas OUTPUT_VARIABLE _glib_comple_schemas OUTPUT_STRIP_TRAILING_WHITESPACE) execute_process (COMMAND ${_glib_comple_schemas} --dry-run --schema-file=${CMAKE_CURRENT_SOURCE_DIR}/${SCHEMA_NAME} ERROR_VARIABLE _schemas_invalid OUTPUT_STRIP_TRAILING_WHITESPACE) if (_schemas_invalid) message (SEND_ERROR "Schema validation error: ${_schemas_invalid}") endif (_schemas_invalid) # Actually install and recomple schemas message (STATUS "GSettings schemas will be installed into ${GSETTINGS_DIR}") install (FILES ${CMAKE_CURRENT_SOURCE_DIR}/${SCHEMA_NAME} DESTINATION ${GSETTINGS_DIR} OPTIONAL) if (GSETTINGS_COMPILE) install (CODE " if(\"\$ENV{DESTDIR}\" STREQUAL \"\") message (STATUS \"Compiling GSettings schemas\") execute_process (COMMAND ${_glib_comple_schemas} ${GSETTINGS_DIR}) endif() ") endif () endmacro() gImageReader-3.2.3/cmake/gettextizeui.cmake000066400000000000000000000010231312567024200206450ustar00rootroot00000000000000# Function to replace QApplication::translate with gettext() in ui headers # 3: argv0 = cmake, argv1 = -P, argv2 = gettextizeui.cmake FOREACH(i RANGE 3 ${CMAKE_ARGC}) SET(form_header "${CMAKE_ARGV${i}}") IF(NOT "${form_header}" STREQUAL "") MESSAGE(STATUS "Gettextizing ${form_header}") FILE(READ ${form_header} _text) STRING(REGEX REPLACE "QApplication::translate\\(\"[^\"]+\", \"((\\\\.|[^\\\"])*)\", [^\\)]+\\)" "gettext(\"\\1\")" _text_out "${_text}") FILE(WRITE ${form_header} "${_text_out}") ENDIF() ENDFOREACH() gImageReader-3.2.3/common/000077500000000000000000000000001312567024200153255ustar00rootroot00000000000000gImageReader-3.2.3/common/CCITTFax4Encoder.cc000066400000000000000000000351471312567024200205370ustar00rootroot00000000000000/* -*- Mode: C++; indent-tabs-mode: t; c-basic-offset: 4; tab-width: 4 -*- */ /* * CCITTFax4Encoder.cc * Based on code from libtiff/tif_fax3.c, which is: * Copyright (c) 1990-1997 Sam Leffler * Copyright (c) 1991-1997 Silicon Graphics, Inc. * Permission to use, copy, modify, distribute, and sell this software and * its documentation for any purpose is hereby granted without fee, provided * that (i) the above copyright notices and this permission notice appear in * all copies of the software and related documentation, and (ii) the names of * Sam Leffler and Silicon Graphics may not be used in any advertising or * publicity relating to the software without the specific, prior written * permission of Sam Leffler and Silicon Graphics. * * Modifications are: * Copyright (C) 2016-2017 Sandro Mani * * gImageReader 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. * * gImageReader 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 this program. If not, see . */ #include "CCITTFax4Encoder.hh" #include #include struct CCITTFax4Encoder::TableEntry { unsigned short length; /* bit length of g3 code */ unsigned short code; /* g3 code */ short runlen; /* run length in bits */ }; #define EOL 0x001 /* EOL code value - 0000 0000 0000 1 */ // Status values returned instead of a run length #define G3CODE_EOL -1 /* NB: ACT_EOL - ACT_WRUNT */ #define G3CODE_INVALID -2 /* NB: ACT_INVALID - ACT_WRUNT */ #define G3CODE_EOF -3 /* end of input data */ #define G3CODE_INCOMP -4 /* incomplete run code */ const CCITTFax4Encoder::TableEntry CCITTFax4Encoder::whiteCodes[] = { { 8, 0x35, 0 }, /* 0011 0101 */ { 6, 0x7, 1 }, /* 0001 11 */ { 4, 0x7, 2 }, /* 0111 */ { 4, 0x8, 3 }, /* 1000 */ { 4, 0xB, 4 }, /* 1011 */ { 4, 0xC, 5 }, /* 1100 */ { 4, 0xE, 6 }, /* 1110 */ { 4, 0xF, 7 }, /* 1111 */ { 5, 0x13, 8 }, /* 1001 1 */ { 5, 0x14, 9 }, /* 1010 0 */ { 5, 0x7, 10 }, /* 0011 1 */ { 5, 0x8, 11 }, /* 0100 0 */ { 6, 0x8, 12 }, /* 0010 00 */ { 6, 0x3, 13 }, /* 0000 11 */ { 6, 0x34, 14 }, /* 1101 00 */ { 6, 0x35, 15 }, /* 1101 01 */ { 6, 0x2A, 16 }, /* 1010 10 */ { 6, 0x2B, 17 }, /* 1010 11 */ { 7, 0x27, 18 }, /* 0100 111 */ { 7, 0xC, 19 }, /* 0001 100 */ { 7, 0x8, 20 }, /* 0001 000 */ { 7, 0x17, 21 }, /* 0010 111 */ { 7, 0x3, 22 }, /* 0000 011 */ { 7, 0x4, 23 }, /* 0000 100 */ { 7, 0x28, 24 }, /* 0101 000 */ { 7, 0x2B, 25 }, /* 0101 011 */ { 7, 0x13, 26 }, /* 0010 011 */ { 7, 0x24, 27 }, /* 0100 100 */ { 7, 0x18, 28 }, /* 0011 000 */ { 8, 0x2, 29 }, /* 0000 0010 */ { 8, 0x3, 30 }, /* 0000 0011 */ { 8, 0x1A, 31 }, /* 0001 1010 */ { 8, 0x1B, 32 }, /* 0001 1011 */ { 8, 0x12, 33 }, /* 0001 0010 */ { 8, 0x13, 34 }, /* 0001 0011 */ { 8, 0x14, 35 }, /* 0001 0100 */ { 8, 0x15, 36 }, /* 0001 0101 */ { 8, 0x16, 37 }, /* 0001 0110 */ { 8, 0x17, 38 }, /* 0001 0111 */ { 8, 0x28, 39 }, /* 0010 1000 */ { 8, 0x29, 40 }, /* 0010 1001 */ { 8, 0x2A, 41 }, /* 0010 1010 */ { 8, 0x2B, 42 }, /* 0010 1011 */ { 8, 0x2C, 43 }, /* 0010 1100 */ { 8, 0x2D, 44 }, /* 0010 1101 */ { 8, 0x4, 45 }, /* 0000 0100 */ { 8, 0x5, 46 }, /* 0000 0101 */ { 8, 0xA, 47 }, /* 0000 1010 */ { 8, 0xB, 48 }, /* 0000 1011 */ { 8, 0x52, 49 }, /* 0101 0010 */ { 8, 0x53, 50 }, /* 0101 0011 */ { 8, 0x54, 51 }, /* 0101 0100 */ { 8, 0x55, 52 }, /* 0101 0101 */ { 8, 0x24, 53 }, /* 0010 0100 */ { 8, 0x25, 54 }, /* 0010 0101 */ { 8, 0x58, 55 }, /* 0101 1000 */ { 8, 0x59, 56 }, /* 0101 1001 */ { 8, 0x5A, 57 }, /* 0101 1010 */ { 8, 0x5B, 58 }, /* 0101 1011 */ { 8, 0x4A, 59 }, /* 0100 1010 */ { 8, 0x4B, 60 }, /* 0100 1011 */ { 8, 0x32, 61 }, /* 0011 0010 */ { 8, 0x33, 62 }, /* 0011 0011 */ { 8, 0x34, 63 }, /* 0011 0100 */ { 5, 0x1B, 64 }, /* 1101 1 */ { 5, 0x12, 128 }, /* 1001 0 */ { 6, 0x17, 192 }, /* 0101 11 */ { 7, 0x37, 256 }, /* 0110 111 */ { 8, 0x36, 320 }, /* 0011 0110 */ { 8, 0x37, 384 }, /* 0011 0111 */ { 8, 0x64, 448 }, /* 0110 0100 */ { 8, 0x65, 512 }, /* 0110 0101 */ { 8, 0x68, 576 }, /* 0110 1000 */ { 8, 0x67, 640 }, /* 0110 0111 */ { 9, 0xCC, 704 }, /* 0110 0110 0 */ { 9, 0xCD, 768 }, /* 0110 0110 1 */ { 9, 0xD2, 832 }, /* 0110 1001 0 */ { 9, 0xD3, 896 }, /* 0110 1001 1 */ { 9, 0xD4, 960 }, /* 0110 1010 0 */ { 9, 0xD5, 1024 }, /* 0110 1010 1 */ { 9, 0xD6, 1088 }, /* 0110 1011 0 */ { 9, 0xD7, 1152 }, /* 0110 1011 1 */ { 9, 0xD8, 1216 }, /* 0110 1100 0 */ { 9, 0xD9, 1280 }, /* 0110 1100 1 */ { 9, 0xDA, 1344 }, /* 0110 1101 0 */ { 9, 0xDB, 1408 }, /* 0110 1101 1 */ { 9, 0x98, 1472 }, /* 0100 1100 0 */ { 9, 0x99, 1536 }, /* 0100 1100 1 */ { 9, 0x9A, 1600 }, /* 0100 1101 0 */ { 6, 0x18, 1664 }, /* 0110 00 */ { 9, 0x9B, 1728 }, /* 0100 1101 1 */ { 11, 0x8, 1792 }, /* 0000 0001 000 */ { 11, 0xC, 1856 }, /* 0000 0001 100 */ { 11, 0xD, 1920 }, /* 0000 0001 101 */ { 12, 0x12, 1984 }, /* 0000 0001 0010 */ { 12, 0x13, 2048 }, /* 0000 0001 0011 */ { 12, 0x14, 2112 }, /* 0000 0001 0100 */ { 12, 0x15, 2176 }, /* 0000 0001 0101 */ { 12, 0x16, 2240 }, /* 0000 0001 0110 */ { 12, 0x17, 2304 }, /* 0000 0001 0111 */ { 12, 0x1C, 2368 }, /* 0000 0001 1100 */ { 12, 0x1D, 2432 }, /* 0000 0001 1101 */ { 12, 0x1E, 2496 }, /* 0000 0001 1110 */ { 12, 0x1F, 2560 }, /* 0000 0001 1111 */ { 12, 0x1, G3CODE_EOL }, /* 0000 0000 0001 */ { 9, 0x1, G3CODE_INVALID }, /* 0000 0000 1 */ { 10, 0x1, G3CODE_INVALID }, /* 0000 0000 01 */ { 11, 0x1, G3CODE_INVALID }, /* 0000 0000 001 */ { 12, 0x0, G3CODE_INVALID }, /* 0000 0000 0000 */ }; const CCITTFax4Encoder::TableEntry CCITTFax4Encoder::blackCodes[] = { { 10, 0x37, 0 }, /* 0000 1101 11 */ { 3, 0x2, 1 }, /* 010 */ { 2, 0x3, 2 }, /* 11 */ { 2, 0x2, 3 }, /* 10 */ { 3, 0x3, 4 }, /* 011 */ { 4, 0x3, 5 }, /* 0011 */ { 4, 0x2, 6 }, /* 0010 */ { 5, 0x3, 7 }, /* 0001 1 */ { 6, 0x5, 8 }, /* 0001 01 */ { 6, 0x4, 9 }, /* 0001 00 */ { 7, 0x4, 10 }, /* 0000 100 */ { 7, 0x5, 11 }, /* 0000 101 */ { 7, 0x7, 12 }, /* 0000 111 */ { 8, 0x4, 13 }, /* 0000 0100 */ { 8, 0x7, 14 }, /* 0000 0111 */ { 9, 0x18, 15 }, /* 0000 1100 0 */ { 10, 0x17, 16 }, /* 0000 0101 11 */ { 10, 0x18, 17 }, /* 0000 0110 00 */ { 10, 0x8, 18 }, /* 0000 0010 00 */ { 11, 0x67, 19 }, /* 0000 1100 111 */ { 11, 0x68, 20 }, /* 0000 1101 000 */ { 11, 0x6C, 21 }, /* 0000 1101 100 */ { 11, 0x37, 22 }, /* 0000 0110 111 */ { 11, 0x28, 23 }, /* 0000 0101 000 */ { 11, 0x17, 24 }, /* 0000 0010 111 */ { 11, 0x18, 25 }, /* 0000 0011 000 */ { 12, 0xCA, 26 }, /* 0000 1100 1010 */ { 12, 0xCB, 27 }, /* 0000 1100 1011 */ { 12, 0xCC, 28 }, /* 0000 1100 1100 */ { 12, 0xCD, 29 }, /* 0000 1100 1101 */ { 12, 0x68, 30 }, /* 0000 0110 1000 */ { 12, 0x69, 31 }, /* 0000 0110 1001 */ { 12, 0x6A, 32 }, /* 0000 0110 1010 */ { 12, 0x6B, 33 }, /* 0000 0110 1011 */ { 12, 0xD2, 34 }, /* 0000 1101 0010 */ { 12, 0xD3, 35 }, /* 0000 1101 0011 */ { 12, 0xD4, 36 }, /* 0000 1101 0100 */ { 12, 0xD5, 37 }, /* 0000 1101 0101 */ { 12, 0xD6, 38 }, /* 0000 1101 0110 */ { 12, 0xD7, 39 }, /* 0000 1101 0111 */ { 12, 0x6C, 40 }, /* 0000 0110 1100 */ { 12, 0x6D, 41 }, /* 0000 0110 1101 */ { 12, 0xDA, 42 }, /* 0000 1101 1010 */ { 12, 0xDB, 43 }, /* 0000 1101 1011 */ { 12, 0x54, 44 }, /* 0000 0101 0100 */ { 12, 0x55, 45 }, /* 0000 0101 0101 */ { 12, 0x56, 46 }, /* 0000 0101 0110 */ { 12, 0x57, 47 }, /* 0000 0101 0111 */ { 12, 0x64, 48 }, /* 0000 0110 0100 */ { 12, 0x65, 49 }, /* 0000 0110 0101 */ { 12, 0x52, 50 }, /* 0000 0101 0010 */ { 12, 0x53, 51 }, /* 0000 0101 0011 */ { 12, 0x24, 52 }, /* 0000 0010 0100 */ { 12, 0x37, 53 }, /* 0000 0011 0111 */ { 12, 0x38, 54 }, /* 0000 0011 1000 */ { 12, 0x27, 55 }, /* 0000 0010 0111 */ { 12, 0x28, 56 }, /* 0000 0010 1000 */ { 12, 0x58, 57 }, /* 0000 0101 1000 */ { 12, 0x59, 58 }, /* 0000 0101 1001 */ { 12, 0x2B, 59 }, /* 0000 0010 1011 */ { 12, 0x2C, 60 }, /* 0000 0010 1100 */ { 12, 0x5A, 61 }, /* 0000 0101 1010 */ { 12, 0x66, 62 }, /* 0000 0110 0110 */ { 12, 0x67, 63 }, /* 0000 0110 0111 */ { 10, 0xF, 64 }, /* 0000 0011 11 */ { 12, 0xC8, 128 }, /* 0000 1100 1000 */ { 12, 0xC9, 192 }, /* 0000 1100 1001 */ { 12, 0x5B, 256 }, /* 0000 0101 1011 */ { 12, 0x33, 320 }, /* 0000 0011 0011 */ { 12, 0x34, 384 }, /* 0000 0011 0100 */ { 12, 0x35, 448 }, /* 0000 0011 0101 */ { 13, 0x6C, 512 }, /* 0000 0011 0110 0 */ { 13, 0x6D, 576 }, /* 0000 0011 0110 1 */ { 13, 0x4A, 640 }, /* 0000 0010 0101 0 */ { 13, 0x4B, 704 }, /* 0000 0010 0101 1 */ { 13, 0x4C, 768 }, /* 0000 0010 0110 0 */ { 13, 0x4D, 832 }, /* 0000 0010 0110 1 */ { 13, 0x72, 896 }, /* 0000 0011 1001 0 */ { 13, 0x73, 960 }, /* 0000 0011 1001 1 */ { 13, 0x74, 1024 }, /* 0000 0011 1010 0 */ { 13, 0x75, 1088 }, /* 0000 0011 1010 1 */ { 13, 0x76, 1152 }, /* 0000 0011 1011 0 */ { 13, 0x77, 1216 }, /* 0000 0011 1011 1 */ { 13, 0x52, 1280 }, /* 0000 0010 1001 0 */ { 13, 0x53, 1344 }, /* 0000 0010 1001 1 */ { 13, 0x54, 1408 }, /* 0000 0010 1010 0 */ { 13, 0x55, 1472 }, /* 0000 0010 1010 1 */ { 13, 0x5A, 1536 }, /* 0000 0010 1101 0 */ { 13, 0x5B, 1600 }, /* 0000 0010 1101 1 */ { 13, 0x64, 1664 }, /* 0000 0011 0010 0 */ { 13, 0x65, 1728 }, /* 0000 0011 0010 1 */ { 11, 0x8, 1792 }, /* 0000 0001 000 */ { 11, 0xC, 1856 }, /* 0000 0001 100 */ { 11, 0xD, 1920 }, /* 0000 0001 101 */ { 12, 0x12, 1984 }, /* 0000 0001 0010 */ { 12, 0x13, 2048 }, /* 0000 0001 0011 */ { 12, 0x14, 2112 }, /* 0000 0001 0100 */ { 12, 0x15, 2176 }, /* 0000 0001 0101 */ { 12, 0x16, 2240 }, /* 0000 0001 0110 */ { 12, 0x17, 2304 }, /* 0000 0001 0111 */ { 12, 0x1C, 2368 }, /* 0000 0001 1100 */ { 12, 0x1D, 2432 }, /* 0000 0001 1101 */ { 12, 0x1E, 2496 }, /* 0000 0001 1110 */ { 12, 0x1F, 2560 }, /* 0000 0001 1111 */ { 12, 0x1, G3CODE_EOL }, /* 0000 0000 0001 */ { 9, 0x1, G3CODE_INVALID }, /* 0000 0000 1 */ { 10, 0x1, G3CODE_INVALID }, /* 0000 0000 01 */ { 11, 0x1, G3CODE_INVALID }, /* 0000 0000 001 */ { 12, 0x0, G3CODE_INVALID }, /* 0000 0000 0000 */ }; const CCITTFax4Encoder::TableEntry CCITTFax4Encoder::horizcode = { 3, 0x1, 0 }; /* 001 */ const CCITTFax4Encoder::TableEntry CCITTFax4Encoder::passcode = { 4, 0x1, 0 }; /* 0001 */ const CCITTFax4Encoder::TableEntry CCITTFax4Encoder::vcodes[7] = { { 7, 0x03, 0 }, /* 0000 011 */ { 6, 0x03, 0 }, /* 0000 11 */ { 3, 0x03, 0 }, /* 011 */ { 1, 0x1, 0 }, /* 1 */ { 3, 0x2, 0 }, /* 010 */ { 6, 0x02, 0 }, /* 0000 10 */ { 7, 0x02, 0 } /* 0000 010 */ }; struct CCITTFax4Encoder::EncoderState { std::vector buf; uint8_t data = 0; uint8_t bit = 8; }; CCITTFax4Encoder::CCITTFax4Encoder() : m_state(new EncoderState) {} CCITTFax4Encoder::~CCITTFax4Encoder() { delete m_state; } uint8_t* CCITTFax4Encoder::encode(const uint8_t *buffer, uint32_t width, uint32_t height, uint32_t rowbytes, uint32_t &outputSize) { m_state->buf.resize(0); m_state->data = 0; m_state->bit = 8; uint8_t whiteline[rowbytes]; std::fill_n(whiteline, rowbytes, 0); const uint8_t* refline = whiteline; for(uint32_t y = 0; y < height; ++y) { encode2DRow(buffer, refline, width); refline = buffer; buffer += rowbytes; } putbits(EOL, 12); putbits(EOL, 12); if(m_state->bit != 8) { flushbits(); } outputSize = m_state->buf.size(); return m_state->buf.data(); } void CCITTFax4Encoder::putspan(int32_t span, const TableEntry* tab) { while (span >= 2624) { const TableEntry& te = tab[63 + (2560>>6)]; putbits(te.code, te.length); span -= te.runlen; } if (span >= 64) { const TableEntry& te = tab[63 + (span>>6)]; assert(te.runlen == 64*(span>>6)); putbits(te.code, te.length); span -= te.runlen; } const TableEntry& te = tab[span]; putbits(te.code, te.length); } void CCITTFax4Encoder::putbits(uint16_t bits, uint16_t length) { static const int msbmask[9] = { 0x00, 0x01, 0x03, 0x07, 0x0f, 0x1f, 0x3f, 0x7f, 0xff }; while (length > m_state->bit) { m_state->data |= bits >> (length - m_state->bit); length -= m_state->bit; flushbits(); } assert(length < 9); m_state->data |= (bits & msbmask[length]) << (m_state->bit - length); m_state->bit -= length; if (m_state->bit == 0) { flushbits(); } } void CCITTFax4Encoder::flushbits() { m_state->buf.push_back(m_state->data); m_state->data = 0; m_state->bit = 8; } static inline uint8_t pixel(const uint8_t* line, uint32_t i) { return !(((line[i>>3]) >> (7 - (i&7))) & 1); } static inline uint32_t findpixel(const uint8_t* line, uint32_t start, uint32_t length, uint8_t color) { for(uint32_t pos = start; pos < length; ++pos) { if(pixel(line, pos) == color) { return pos; } } return length; } void CCITTFax4Encoder::encode2DRow(const uint8_t* codeline, const uint8_t* refline, uint32_t linebits) { uint32_t a0 = 0; uint32_t a1 = findpixel(codeline, 0, linebits, 1); uint32_t b1 = findpixel(refline, 0, linebits, 1); uint32_t b2 = findpixel(refline, b1 + 1, linebits, !pixel(refline, b1)); while(true) { if (b2 < a1) { /* pass mode */ putbits(passcode.code, passcode.length); a0 = b2; } else { int32_t d = b1 - a1; if (-3 <= d && d <= 3) { /* vertical mode */ putbits(vcodes[d+3].code, vcodes[d+3].length); a0 = a1; } else { /* horizontal mode */ uint32_t a2 = findpixel(codeline, a1 + 1, linebits, !pixel(codeline, a1)); putbits(horizcode.code, horizcode.length); if (a0+a1 == 0 || pixel(codeline, a0) == 0) { putspan(a1-a0, whiteCodes); putspan(a2-a1, blackCodes); } else { putspan(a1-a0, blackCodes); putspan(a2-a1, whiteCodes); } a0 = a2; } } if (a0 >= linebits) break; // Next changing pixel on codeline right of a0 a1 = findpixel(codeline, a0 + 1, linebits, !pixel(codeline, a0)); // Next changing pixel on refline right of a0 and of opposite color than a0 b1 = findpixel(refline, a0 + 1, linebits, !pixel(refline, a0)); if(pixel(refline, b1) == pixel(codeline, a0)) { b1 = findpixel(refline, b1 + 1, linebits, !pixel(codeline, a0)); } // Next changing pixel on refline right of b1 b2 = findpixel(refline, b1 + 1, linebits, !pixel(refline, b1)); } } gImageReader-3.2.3/common/CCITTFax4Encoder.hh000066400000000000000000000043521312567024200205430ustar00rootroot00000000000000/* -*- Mode: C++; indent-tabs-mode: t; c-basic-offset: 4; tab-width: 4 -*- */ /* * CCITTFax4Encoder.hh * Based on code from libtiff/tif_fax3.c, which is: * Copyright (c) 1990-1997 Sam Leffler * Copyright (c) 1991-1997 Silicon Graphics, Inc. * Permission to use, copy, modify, distribute, and sell this software and * its documentation for any purpose is hereby granted without fee, provided * that (i) the above copyright notices and this permission notice appear in * all copies of the software and related documentation, and (ii) the names of * Sam Leffler and Silicon Graphics may not be used in any advertising or * publicity relating to the software without the specific, prior written * permission of Sam Leffler and Silicon Graphics. * * Modifications are: * Copyright (C) 2016-2017 Sandro Mani * * gImageReader 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. * * gImageReader 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 this program. If not, see . */ #ifndef FAX4ENCODER_HH #define FAX4ENCODER_HH #include class CCITTFax4Encoder { public: CCITTFax4Encoder(); ~CCITTFax4Encoder(); uint8_t* encode(const uint8_t* buffer, uint32_t width, uint32_t height, uint32_t rowbytes, uint32_t& outputSize); private: struct EncoderState; struct TableEntry; EncoderState* m_state; void encode2DRow(const uint8_t* codeline, const uint8_t* refline, uint32_t linebits); inline void putspan(int32_t span, const TableEntry* tab); inline void putbits(uint16_t bits, uint16_t length); inline void flushbits(); static const TableEntry whiteCodes[]; static const TableEntry blackCodes[]; static const TableEntry horizcode; static const TableEntry passcode; static const TableEntry vcodes[]; }; #endif // CCITT_HH gImageReader-3.2.3/data/000077500000000000000000000000001312567024200147465ustar00rootroot00000000000000gImageReader-3.2.3/data/gimagereader.appdata.xml.in000066400000000000000000000050461312567024200221270ustar00rootroot00000000000000 gimagereader-@INTERFACE_TYPE@.desktop CC0-1.0 GPL-3.0+ gImageReader gImageReader A graphical frontend to tesseract-ocr Grafická nadstavba pro engine tesseract-ocr ocr optical recognition tesseract pdf

gImageReader is a simple optical character recognition (OCR) application which acts as a frontend to the tesseract OCR engine. Features include:

  • Import PDF documents and images from disk, scanning devices, clipboard and screenshots
  • Process multiple images and documents in one go
  • Manual or automatic recognition area definition
  • Recognize to plain text or to hOCR documents
  • Recognized text displayed directly next to the image
  • Post-process the recognized text, including spellchecking
  • Generate PDF documents from hOCR documents

gImageReader je jednoduše použitelná aplikace pro rozpoznávání textu z obrázků, využívající OCR engine tesseract. Mezi funkce patří:

  • SamoÄinné rozpoznání rozvržení strany
  • Možnost ruÄnÄ› urÄit a upravit oblasti pro rozpoznání
  • Import obrázků ze souborů, skenovacích zařízení, schránky a snímků obrazovky
  • Rozpoznávání z vícestránkových PDF dokumentů
  • Rozpoznaný text je zobrazen hned vedle zdrojového obrázku
  • Základní úprava výstupního textu, vÄetnÄ› hledání/nahrazování a odebírání konců řádků
  • Kontrola pÅ™eklepů ve výstupním textu (pokud jsou nainstalovány přísluÅ¡né slovníky)
https://raw.githubusercontent.com/manisandro/gImageReader/gh-pages/gimagereader-@INTERFACE_TYPE@.jpg gImageReader-@INTERFACE_TYPE@ https://github.com/manisandro/gImageReader https://github.com/manisandro/gImageReader/blob/master/README.md manisandro@gmail.com
gImageReader-3.2.3/data/gimagereader.desktop.in000066400000000000000000000007211312567024200213620ustar00rootroot00000000000000[Desktop Entry] Name=gImageReader GenericName=OCR application GenericName[cs]=optické rozpoznávání znaků (OCR) Exec=gimagereader-@INTERFACE_TYPE@ %U Icon=gimagereader Terminal=false Type=Application StartupNotify=true Categories=Graphics;OCR;Scanning; MimeType=image/bmp;image/jpeg;image/gif;image/png;image/tiff;image/x-bmp;image/x-ico;image/x-png;image/x-pcx;image/x-tga;image/xpm;image/svg+xml; Keywords=OCR;optical character recognition;Scanner;tesseract; gImageReader-3.2.3/data/icons/000077500000000000000000000000001312567024200160615ustar00rootroot00000000000000gImageReader-3.2.3/data/icons/128x128/000077500000000000000000000000001312567024200170165ustar00rootroot00000000000000gImageReader-3.2.3/data/icons/128x128/gimagereader.png000066400000000000000000000323401312567024200221420ustar00rootroot00000000000000‰PNG  IHDR€€Ã>aËbKGDÿÿÿ ½§“ IDATxœíw|\å•þ¿·L/ê½K#K¶e¹a\h óKè$!ÒØ$›º$!›ì®7›lH#›%¤°Ù°ébŠZ(6`Û¸Ûê½êÌhú̽÷÷ÇH²z±5¶Éò|>cÉW·¼sïsÏûœóž÷¼qƆ÷ÜU¨Ó„OŠ¢p»(ЇEQxNV´g_Øñ›îx_ûÌ !^'®¼î‹IöÿF¯×m[^R$%Ø,´u÷âÐDÄc¢,>‹Æ³ Š÷Àã?®Ä«-ï`fÄëÞ}{¦A–ºwþê§ ÐÑÞÎàà `ˆ¶'íÝ}töö…EÑ/ â>QvI:ÝŽ§ûq{¼Úõ&"~ØüîLƒÝÞýúÓ¿Û* {èîqÒÜÜ„ÏëÅãõÓÙÛGWß Ýýƒ¨š†(ŠM¢(í’igŠÚóè£FâÕÎÿ눖o~wf‚ÕÚ½wçgÜ'ĬCG'mm­„ÂaœC8]ôºðøƒ‚0(‰ÒË‚ÈK’NÝõ‡ý¨+^mþ¿ˆ¸Àj2u¿ùìóÚ_UUÜÝÝÝ475ź‹P˜ÞA=ƒ.<èª¦Š¢tT…—dYØUœdÛ·}ûv5^ßáÿâJ³ÁÐ}ðùgu|(b``€Î®.ðûýx|œCn<^ü¡0‚ ôK¢ô*»ÌzaçO|ph‘¿Æß<âF€Šk¯Í0H¶ž·^xòœÏ¥ªng“ÖÖÚÛÛ G¢ ûöáöP5MEñ˜(J»…?ðßÚ¹“¿mÄë¯ÍÐÙ-=G^|zÑωD¤­­•ÚÚZ¼^/¾`—/Èp „?AE§(J/ ’°SÖi/<¼}»gÑò7€¸ hýµv‹©çØË;ãu‰1 ÓÝÝCKK3„Âa†ƒa|¡¾pU#*ŠÂA”v ²øÒýËWǽQoÄ•V“¡çÄ«‰×%¦…¢( ÒÜÒBmM5CCC#Q|á(Á¨BXÕ±I¥—$QÜeúþº}ûöàymäE„¸ÀlÐõœÚó\¼.1/øÏ¢™ššjÁ !E%U‰h"š $QÜ‹(î’eõ©oÞëmðyFÜPR¹)]o·9«^~AÇ=ò«=ètëWR±$I­Mš¦100HSsõuõtvvU5š@UD±I…]’,îÄùÚöíw„­!âJÉbvÖîû낎ûÊwžæàñØKhÐË,_’ÅÆÕE\±®„´Û¢¶1 ÑÕÝEScUÕUx‡‡Q EPe‚(ùDAzU”Ø)ê…¿|íŸè\Ô\ˆ2*7¥ÛLFgý›//è¸ñ˜Œ‚œd6®)bmE>+—æ,ªuˆD£ôööÒÒÒJSc(š†*êÐ$A§G”¤*IwÊ¢ü’¯·m÷öíÛ£‹Ö€ „¸Àj48¼² ãf#ÀxØ­FV/ÏcÃêB6®)Æf1œmSP5 %%ª(„Âá˜vè즵µ…¶Öüþš,#è 12Èr§$ˆÏJ²¸ó ½7þ®NœW˜ :gÓÁÝ :n¾Qp¤±au×QZ˜ŽpßLQ¢ŠB$!Ž ‡ ‡Ã±¨äÐ=]Ýôõ:ñ¸]$gdÑç "Š"‚ üÌ×ÕúÉ·cXZŽçÉUõüÜUÕ¨k¹—_í8@fšKV䳦"KWb2êæuQ5 I’dY•PU E‘I°Û1èõ¤ed00䦣¥‘J‡ƒ“m pŸ5«À|)¾ßtñ7 éX¦³[zÛ¿¾ ãÎÆ̆ñBòòu%¤Ï!$UU%‰F ‡#1 0b‚¡Á`@ H‡³—¨o˜äŒLN7¶ Š"’$ýÃ?~ìC,ZãÏOEMM½ð¡øP8Ê‘Sí<òë׸û3ñÏÿ’G~µ‡#§Ú‰*S-”(Š£Y–äØON‡N–ÑÉ:tz)I øƒAÊ‹ ÉIOEUUEùÁ÷~ö?—_€¯yÖˆo ]xLFw¯›/gÇ Çg’¢$u²$£J*ª¤¢Óéˆ* :E‡ÅhB2™éëëã’åå¸<‡ðC:Mÿø½Ÿýlåý÷Ý׿ê¼7xÛyÒg 7Èžõì9P?EH祌X5¦TY‘@QE‡ÅbcÐå"??Ÿõ+–±ûðq”¨š(ÿJÓ´A¸øÞ€I¸èD šNù5e¨ªBÈë%àd¸¯€Ç q´(“…dFªµyT.ͦ²< Y’P% ,£È:‚,ˈ¢„Ñh$%9‰Ê’ŽÔ6¢ªÜðŸþϧ€Å­Á‹„¸‰@Û’µ©&Yìsž>¸ ãøÏ¿Lw 3š'l†B¸zºpwvàîéž“ ¢¬C.N*¡A/³¤8UK³XUžÅ$ †¨kmÅ,K\yÙ&¼^/:yšÎ¾ADQ ’´þ¿ÿÈñEiDœWè­¯¿fa#¯ÿü_/âM¤ædÍ„”©FJTC<­èµ0‰IfÌ‚@4ª00àåø±VHʧëÔ 4mñ»¡´d ¥©¤§Baº•«®¸œ`0ˆÛí¦¯¯×ŽÇŠ bUX§­Û~ß}þEoÄ"!®]ÀÙÀ’•MV~ÑH”æªzÔ@k²A0õ¤%Ë”®(ÄhÒÐéÑ#Š©¦(eå7–²ãM?ÑPg]Í¢·±oÐÇ«|”êÈM)E’$ôz=f³»ÝΊ’"TÕ¢jê2CTú:pÿ¢7b‘pÑÀÓÒŒ³»ìütÒR-l¹<-ä㱟ï&QQƒ^æ%YA#'/‰¼Âl²E4 dZ£‚QD½…¬¥Ëjo%Ä¥­ÂÈ¿£n£ÑhÄjµ’‘–JIÖõNÐøüƒ?úé3üÃß¿—Fœ#.:”.Í¢¼2UQ9r¤™¿¾xŸ74¶O0&-5åË IJ¶ÑÓ3Dmã1–TR/AtdŽ‘(Ëä­¾„Æý¯Ç%;P’4DQ@„A#AQn=.<âÿ~÷»¿ZñÅ/~зø­87Ä•ÚY¨ö–F'Õõ=ƒazû,¿båë Ô9Åð{l¿¾~7»_;,Kd™“ލWñ…'ƶ²²I+YB_CÝ9ŸÉPAˆ‘@–e ‹…„„–çsàTŠª Þ¯ÿ¸è8GÄ/(úÎêÓ%¥£Ë($(Úp»¼ìßõ2îþA–mX…=%iêþ:{‚žKÖfqÍ2‰ò,ÐO¢unÅJ,É)gõ5f‚%9Ñ€(KÂÔ® =5•¢¬T4UASµÏ}ã‡?»è¢„]ìï#hKeÅåëXqÅ:º›Zi¯k¡ùÅ7PNbåªV¯)$)Ù‚ÝsCá(-} ¨ŒäíÁ;èCgI@gµ#J2K®¼_OQ¯UU ‚ý~ü¡ÀÂRõf3iù¹èän„+'š¦!Ë2ªªb2™°Ùl#]ÁÞPDDŒþü¡‡Zý…/|!>¢ä,pÑ@àÄÞ#Ô¼ušü²BòËKØxc1J$г½ gKuN¿Õ„ѤÇhÔ( ÇîiFAë®»’Ìcì|@(¬ «X¬$QÀj’0¤±kºú8ðìn¼îùeއý~ˆø‘,$ùÌ-FÆ Gµ€Åb!11‘eÅ<]¢©eâáËÀöE¹Y‹€øj€³P^¹…ÜxËZ0½½^zz:ih¨G•ͤd³úšM„Ca\Î~Bþ^—‡C/¾ÆeÛ¶ ˆ"`Ô‹õ" #_WQT4±œ½Ñ¸à¶ºÚ1GôˆbÎØ¶Qˆ¢8A¦§¦’Ÿ>@³sà«_ÿþOžþ—üÄÑßœ8ࢳi6Ìf=……É&³ˆDZZh:݆+ `¶'œ•Nz~ö‚¯1šJ&¨ bpú:Y³±KF6:£‘h8‚×妳¡•–ªzTejéYÔP"!ÄI™'£‚prl $?—žA7HTŽŠ‘ŸýéOÚxÇw\ðšq#€à•4Ìsï7Áàô‘;N¢´4ÒÒt††üôôõvëhíôŽŠ$¥'cKN@§Ÿ9ĤS±êUŒ V½‚€JJô‹´ Éè zÌ6 éyÙ$g¦ñÖ_§æ4È’Š,ÉH’4åo£‚p¼HJJbYqoU7¢"®;ÙÞýYà¡…ß¡ÅÅEgº»ýØ ¤§ÎΞ¤$3II±}V–'Žh´¶öÓßí¤ßFd$NbpÀƒ )äØ(.M'ÁnšöœÉf•¢ÐãYˆ¶šFjÞŠ…òÓJèÍVüƒ¸ÝÈr,NУí $)–G`4±Ùld¦¥‘ÑÓK÷qûöoÿן¶ù3g}³qŽ,ü˜ˆ*ñÛ§š(É·‘Ÿc!;ÃLJ’ Iš}ØB¯(u¤QêH›ò·êZ‰§ž:ɪõDLVº=AÔ “^#)Á4!p¼ý‘ :!F†¾¦li$çî(EíØƒQ/#Ë3[›Ñ®Àh4‰DFb… =IXQm‘ÿnXÈýYlÄm0Èž»û9â爢v6cšhAUðT±«-£^euÊR0ÊÕÖ.Ò¤^„QŸ]…P½žC56¢²CR9Ž2Vy¥:ÈÊò ö뢦©Ì4#Ù&r2̤¥Ä4…N'RR˜HIa"o˜ÖV7ee´¶ Q’—LEY ¾À05µCx#œ‘‚¨úÑË&Ãô^À„û0Sl =¼´^Zœý  ÷>ð­üþÁ¯|þ¥ß°sÄEgä°““îBLz«rÆú¨ò7í9•¼Ð‘DšÐ‰ FIÈ–:H•€j¦íÍ~6| QE"Y¿"«ÅȾãÝx†#ì;:€¦A¢M&5É@Z²‘ÔdI z¬zV,OcÅò˜ì ÐÔÚK“ÞÀËÍ“MØä>ÌÆ0bnò¼:ÑɃEf³™»¥ŽBº E¢?þüC­üÁy_tpù9 áU}—޳9¿ ½ë .ÍìâPnÑŠA Ñé_ÁqU%Is’E+iB7²¨ðîâvÊ3üø£õ6‚žì6 kŠM¬( FTÞ¬ r²1D}[¸´"·×ÅÇOFºGI ’ ')% ‰¶7½~$½MS áy§¾OHINfiQ‡k›Ð Tà«À×âww§iW¼Nœ¿"IÓ ƒî†…¥ÄýàëŸ$0ØSÐSЍ¨\NFŠ‘~§Ÿ'@¯y7–µ¢hUC™ D30èuÔ8uô K\žÝ̵yMΫ]¾D^kM§Ý—FnŠ»Y`_uo@%;ÕÄÒB;éIF|‚LRº}ìXUÕØÿz=„ÂQTO5c³I"%ÁNNf:ù™,)Î!'=uÆI«£^A8&àr¹èq:yy߆bÓÌ¢¢(¬ûîW¿tlÁ7ü,qÑà‡ßø4¾þæØÍÒb7MÓ Ñj¡¼(IèPsqÙÖ°)ßI‰½Mƒ–~@—DRr:uýlbK§–#D s&sÈ™M‡ÇÊÊì® @ƒS¹–JR¢+/+$Án âòa’TŒã<‹Ý¯>‡³·“QD¯—@ÓPUðûÃ(Häd’–˜ÀÊ%yåç`³X€Ñ( ápx,‘´¾©™=‡O€ ˆâë}íKWqžRÊgW0çSR¶Qµ¾ò™O,踷ö¾HÈ7ˆ-!³ÙL8AUTüÁ‡ëÚiëÀålÄß¶—ÚÇìóªåXI±„ð ¶!ûÛYZ’ÍpHÏÀp½¤!‹±û™œQBg‡‹4ÏAtz"iܶ6Â{V…±\!n45»QTä ¢AÏpH£ß¥{(L{[ ^¯Ÿa”pDAAAÖ‰èuƒ.7§jÛikoåÈñ㯪£ÇÙK0Âl2a0èǾ¯¦iÈ¢Hÿ_ .m_ë¾Ý/+7 X¸*Q•Ô¡…Z€ïý“ÔÕœ"=ÉBFzV«¯ÏG¿³EUéspûCØÍz’­fŒz™ôä²R±˜ 䦞n'VôIJN#99…A×p€Òâ"t:™½Gºð·$ªéyKÞFQŽ…w/ó‘hR9Ý£co£‘ªn‰ˆ*’“m£¨0Ô3 øqv¶0ÐÝ«ÏI$›M,¢¢× H’€ªhH˜tª¦¢¨*jTAQìv–â(, #% ÇC[G»öìGÕ@…^0•ýçöÏ»âótÎࢋUÓhèÂ9è##ÉŒ<âk‹‚@z¢³Q¦Ï õ‘žh¦µ»Ÿ–®>$Q"¡ÚLvV•ùäf'~z:‡héÑXwI%:]ì+_¶&›Ãâ ú›ª)×fcšÆPL‡‚#ÛΊ¬0aE Ã­ÇŽÒëõÓY#”̤¤ÙÈw,#ß±Œh4Â`O'ý= ôtàqyv‡"¤›@ ‰kšhƒCC¼qp€×öÄfµ²qÍJr3R)ÎΠ®½ ÓE1¸ø\¼ï÷Eg~÷ã¯ÑÕRCKw?ƒÞ –`&Ñb@ÓbbNÓ4¢* ye™D»…Üül$Q$ŽP_ß‚ªBZ𵕅x½!^ÝW$I¬¨(gÕªeT,/Å`Ðsäè)Nž¨á¦kÏDó"ª„›ŠrÐ:X¤aÐLT´ ¨õ}ƒQI)RRLcဟ¡¾j«0øº@ ¡ªJÌ(*Šª DUTU!ª*¨Q•H4B¢ÝÆ•ëVóâÞƒ(±‚ÙŠ,Ëkú—â:±ä¢#À?ßNaQ>ý½Nö¿ñ:ƒÃ~<0’ ’™dF–¤q1FA)[æ@–$ú‡hmíˆb¡XbUµqÇÈ’Lyy1åKKhkiåÊõ?ÝÁú ëÑ 0ŠNŠ`IÎ'Í~fÀÇy¹ÎNÛ°‰ ›Fs?x`K0’`7`·0tˆ¢Àc£:DCk M­ôôõ¡DU5Š¢¨#ŸØïáH8–àšE{ß’("ˆâ ýk×/ꃙ„¸‰@cbæY‰ÀæÚcô÷´‘_@À7Œd1b1èQTmÌÅÒY'£©ªª†IL²#Ë2}½ƒèôz.ݸžöÖØÒ²,a±è±Z X­zŒF­m=œ8YG[G¯¿YG]£“†¦NJŠ )/+Â`0ÑÝÙÙjC7’ü©—4ÊÓƒä%†©rp$DÔˆBy– “ ÑÑa€K äg&’›•Éò%¥”;бX,#eó}¨š:æhZ¬>²$Æf8„¯ÞòÆ=¯4/Þ“™ˆøyÉ9MPL€%+6]°œ¾.üZÐKEq.yÉdgÇf -Y¶œ+WSZ^†ÏëÃív †e›Í‚¢(ƒa6]±‰þÞ~"$&š1bE²,! à19Žãv³oÿ1^ã¾@ˆò²’¬SÚi3(¬Êò£× 8&$QÄ9&VH±ÐË"å¹V,£Ö#–0š–’Œ£0Ÿ²âBL¡p¯?€†Š¦‚Ùd É áÄH AÚ¡×_ýíY>†9·. ©xm‚"D\ í&#è÷Ruà9:k0Û¬šŠÏç§®±‰în'‘H”o½$a6è).ÉÇj5qêT—]q9v›•7÷íÁbµ¢ªƒƒC±7Ð"2z“Gº…ˆ¢ÄúrMë6@¤¤8‡5«–²fõRr²Ó§´±Õmâ…Æ4BQu$& ªwlÊ$'Ù€Q¡X͡Ѫ#Á`@0DÿЧ«ë¨ki%ÉjÆ®p£x ¢(F~ò­5@|âœO?ý4§OŸ&33‡ÃAii)™™™cƒ(ãF¨?þ­Õéíl¥¦©MÓ†£ôºcó/m&#«V”â÷p ù¸þ¦­Øÿ}N7ùYÈ:U§›ÃS´D A$¤IºáŒ~ÈHKfÙ²ÊÊ Xº¤ˆ´´Ø\…^ŸÌóÍy„•Qhܼ6ì$äâSaB#¥gFK΃±ŸÎ¾~j"A†\¡¢(’m’¤x ºàxøá‡ž°Íb±PRR‚Ãá ¨¨ƒaúp=ÍTŸx“ªcûin¨¦Ïã'U0éuä¤%âõÉÈLC'«8Ê—ãÆïu qâD#š¦a6é †£„à A%‚¤ XÍF‚á(‘¨:…ã#”ÙÙX­fúñ‡£øÃ±ûÑÑPûïUUU›]ÀxôõõÑÐÐ@}}=ÓçJZ,ŠŠŠ(--¥¤¤½^?eÇEcÍ1jOæÔÑý {\Èzë.½‡£€Ý¯î%èë'V0𬤥&`2ë%% âqŽ„ôãVùÈGî@E=Í«»L° ’šDNN:ºúV>ý•orÝ–kÇÚ)D‰œ©AGÆ´@0¤«³‹ÚêSô{ôûBˆ¢HQ¢I¯ª¤qL‘5´…UèHKK#--7â÷ûill¤¡¡¦¦&B¡Øì`ŸÏÇ©S§8uê²,“——‡Ãá ¬¬ »=6‚g·'²úÒͬ¾t3š¦ÑÚX͉#û8qxÍ-l¼l=6®å©;)(È"9)–è„È’ˆÙbÁh2S]ÝJ0¤ j*ƒƒ.dYÂÙ;0¥íš¦ÑÛ7ˆ³w`,vr²Ðø:„£Å§IEÖéÐÔ’dqì|£%vv/è.. q³©ee¶pÔà9W/byucÖ¡¿úô¹ÄÄDJKKq8L›®Õïìâäá½ôvÖÒÔXª†Ñëdœ½Cür³b…(DIÄnOÆ`Ò³çõ„”(¨ ¨…ùI tGT̨Œ× Ÿýê7Ùr͵®?^N´!‚¡ mmíœ~˜#örèÍ×9pèÄ„ê'f³™ò²N×Ô Š*¡ ( X 3ßÞÑ®`´þ "Ǭ€,*íUg‰IDATëT f¼ý,¹MvƒÏ?—Ð4ÖÖÖ1Å?00Ua¤¤¤Œ‘!//oÎ|üɈF£´··ÓÒÒB]]ÝŒ×IMM¥´´”ÂÂÂi…¤¢(Ôלfÿ¯p`ïú{{¸õ½[).Îá¥W÷qªª†`@áý—nœ¹(Èt‚°±¡‘×ö즽ˆÎA¢(¶êŒÏ=üphÆâG€ÂB£]²êŒkÇ»ã1Ó[»Œ’­­­ÓV5’£!j£Ñ8eŸöÖfÞ:°—·ÞÜK‚6\Z‰^'óì‹{ÙvûÇX·á²Û0!B8â Ô7Ô³û•Whë¤}À$Š ‹aÓîÿý߸¬lvÑ`<ë­ @€–––±ëø|S‹y ‚0­·kˆ#‡ösòÈ~û:¹éörÉúM³^[™;F …ÃÔÕÕñÊK/Ñ꤭Q±„læÇÿA\æ ćÁ®™ƒ‹Åb½µ³aTHÖ××S__OOOÏ´û%&&RTT„Ãá ¸¸xÊ ¡aOLרì s^sL†#ÔÖÖñן§Å9@kï ¢(b‹$¼ °|¹Þ”B‹I€ñƒ477Ÿó[;f’ã¡ÓéÈÍÍÅápP^^ŽÍ¶°ÕÍTUë jjjxþ¹çhîé§Å9ˆ( ìzËÎGK¹Ùø`íZÝ ÏE€}ûöqúôirssÇ̸DADo߆àvÉ^R¯Uâ£"/œêõœ«Àƒù I³ÙLAAÁØ›;SBÊLP…ÖÖÖ1B¸\±ùW\qW\qÅŒÇi@uU5O=õ$õ=4tõ! ¢.jÛýøãÞ5bžˆ#í%•ÊÙˆ@MÓèèè˜uôOrrrƬCjjꂯ3Ò¿ŽÃá -mj ¢¹ÐßßÛí¦¸¸xNËR]]ÓOî ®½‡úN'¢  a±ï}æóx–¸( 03þÇ|†‚gÃù’s¡¦¦†;vPÛÖM]GO¬µ´ï}æ™·{I¥ºØnà¨ûï®ÂívÓÔÔDKKˬB²  `Œx ’Óa”5­]Ô¶w#Š"šjH8ðÜoçWÇvˆ'°—Tj“ 04KálêHNÀø®¢¹¹yÚ·v1ºŠ³’yyy ¾œ!@uK'5m]±¥i1ýí øáÈï™@P”rîµë].טuhnnž³«ÈÏÏ?+>š»ØÒÒ2«,..¦´´”ââây ÉQT5wPÝÚ…( hŠ.ñðK»ç>záˆ7TwÃñ ×O€ñ°K€åÄHq®ÖÁçóÑØØ8F†éL¸Åba,..F§›ßÃã1<<<¦ö[ZZ¦uÿt:ÅÅÅ\{íµ$&&Îz¾ššZvìø3§›Ú©j錭H¢âF€‹fz¸8:òbD¨rY8S- •••TVVNpËêëëÇò|>Ççøñãq÷Ýw/¸Ý6›Õ«W³zõj¢Ñè÷oô:‘H„ÚÚZ¬V+[·nãŒãRÇUA‰ÄíE7bùÒ „ ´|žl@912,æ•ÇjöS\\Ìu×]Gooﺺºb³‹¦“ …,Ë”””PRRÂÖ­[ÇºŠ††|>eeeó8KìviÚ™…7ÅøMß8/8g ‡F>: ˜˜nXdœÅùÒÓÓIOOgÓ¦Møý~ºººÈÉÉ™ûÀb|šû|¡M± ½Í-À<¡ìé$PÑ%§cJ˜¾¢w¨ù<¤#C1Ïb¡ïŠÙlÆáp,ð¨øaôIkÄæ‚Š ¨o[Ì Å]Íѯmçôvâé?3ämÈ*!óòÍl{/ŽÛ®ÇbšþÑûF>zbB²‚˜˜œ{$þâÃèsÆHq\Ûë‚Z€pËÓìX}'}®©i_¡îFZo¤õñÿágQ|ßçXÿ¯Ÿ%9ifN|àŒ›Yg—g‘0f&ˆÀhÜš?jÅ037/¬ß´2Ô`7 ?ü2¿Ï.埾<ï‹÷/ÿ üðp¸hòeªPÎbö…à‚už§?HKïÔG!gmdågï!9ÛŠ¿á8íyœ¶Ãm¨ÁvŽ~b {¿Í­¿ü"ºy¬0ŠÅv3ãØ bAU_ó.XÐòµ½S¶éroå}õÄníïïaÍ¿}÷+¿àå|†ÎîØxßo¾Ìï‡>ðäWXÆ0ÙÍL&æf–qvnf< ™„‘n N¸`]Àé¶©ƒ[Ëžüɸ‡ ×|˜÷Ôî£(Û2¶Íýô?±ã«óïfà 1ù±®âb]Gýì0™ òöÔÂLÐBôû'†L]×Ì…Õ0Q'ÿÎéi®eφiþtÍŒºi}ì[ìXšÍ®Ooh~Æ~&7ó\fpLˆŽÔŠ'âÛ3‹À²\+]î31Õ7ÏÌ!A¦0ÙÄ©î3†qøÏOÀ.°›o÷Ç8U5ÍÃMäÝr7Ùù¨ÃNz¼FÛÞªØV4ÿèKtìxŠmU¯’“0ÿéé“ÝÌBÎä:,$5d|@SUÔ‘õã… Ƚ¿îÝ3öÿ¨ëe|a‹~n£”džØìhï€ïLØÖú…¿L9N4•pݾ7)]5Ql†›rü[ÿÌÁ_üUÕˆtí£Ëš@އßnùEÛ¶Q´m¹«‹flŸ 4|`næ¨ÕªŠ¿ÁÀ çÚo{h‚¢G qàØü–ΛlÕP;ÈĈÙÉÆ©ÞAÁÏ_˜òðôÅ—²î¿_àÃ~CfÆ ©(š‚û­—8ö¯ŸåÉ5Åü,¯‚>ñêžÝG(2{´n¼›ù/#?gÚyœ%AÈ 7^ÆÛ3Øñžqü×Ïâήĺ‰iTËHÛµ±ªª¢©j¬‰âL€ÙëÛýâO$˜Î˜óÀ±¯òú®öYϨEiêŸ$³“îÌWÑ”á)âIJ¹ ó<ºѲ„w:BÞ,ƒNSÚì§óé_òÚoä±ä^¸ÿ!\ÃçVÔk,gï.`ö‹[×rË㟛0YâÄí—Su¨oÆc¼ÏŠPt¢É•,«Ñ[\zÔÍœp-ÓôëûNÁP@æd/eHIW‘Y61%E tR÷ýä·ÙË8ôçªy_sÜÕÇ~­$GpGG`½ñ»Üú½;Çþ¯ÛxeS/ã7xýËn…ëŸã/wï˜rý’OMÚ"‘eŸô«‹?½^_p?·×ôðѺƒ\ó­ûIË>£TooÞ^ÉË.pí§I’?Þnà'@Ö~Ï?ÿúÑ*™Ñ!ªþùþ79›7ÞÁžÏ|š—n¿\~}Þ©Ù½ÅM]}iñIJ1ÊðÁ³iÿ¼`*]Çò¾Ë--lx︀–¦PõÉMTO3î1#âüÀ'#¾˜%0ù:ú$%—œ™¬…úè|öqN<ü#ªŸx‰à4jÛXù6_™5e{ö×ÖLø¿â~\ÊíŽAÐ¥qÉÞ˜ kPì»ë‚­?'λ0‹©Oû·Š›y÷¡n{ü‡oœ;OÏ´ö}ܺïûÓ Ûnø1fý8ZSØ÷üìs1 è³X_:±¤]àЗ'z)³àü¾ÿ œK,dóEàbQ²‰ÏO"ë¶Ïpã¾z>VkÚNÙ-דZ^‚9=Kƒìî`Ó/žãÞC¿%Ù2},K0qç–OØÖñ‰/¢Ä7ÁsöÄ„V-ê¢Ý5¿P÷ùNL¹ !"±ŸGŒÃ@51߸½UFÇ:–}~Ë>vÏzðY²+¡k$í,Úûgžþ·W¸åß®9»NFdúu›§nBÑóýnÏqm]s*Yp)p/ð ±Õ·m;únÜóИ¸èü÷ëØóßÎñÌ1NßÃÏò+yá“ÿDíÓ¯0XWKç¿ÉÞú©ci–…O;;ˆó`ð…WÝð~I·lÝ|¥|ßïæÒ5+1›¦Ïù‡#‹G>7¯%6[ .@n¬ü$wý¡ßÝùm¢ŠšÂ‰o``ßv6÷’SÏ-,Ü~’ºŸœ¤î'ßšq]öß‘f/Îo'p^®f[²6UTÂïÕáf4¶äå?ñwïgÛu×’“•1ïzÉGO±÷h,`¬B†·ñD\2ÔÎ2ìæÍ²­mhƒ h·kp‹N’roÛv÷Þu•ËËgµ“1œ$¦˜;e+Ú³Ÿ×?ôaN½P3ç¹7´zX—?;L•OðÞéizò N?ú{†}g¿¢!—Kþó{”¿ÿlSßþ‹…ç?¼{wt¸éøžÆŸn,+ kÑ«þøÔ®ïo½ëCµY+6påÍwñ«?í «Ç9§vH6Ÿ¾ILClfª,gnäêç«yÿ ±äšŠW›Ñ@ÊÛX÷Ð/¹§ó(e㲉ÔPÇ~qãq~ßÉ <5ìqÅ[ÏkÀkÀýÖ’ÊôãUÕ×úŸ¾~¨[-f³ý®÷ÞÌÿïݬ®X6ëúf`õÈG:8£š™èŽ$_÷!¶^÷!®n>BÓ;iß³‡Þc§q·÷ÅH'èøÜ¤„å\»ÿIÚ³¶àÇlQ¨êw<ñÞMÜûìäPõl8¿ÞÂÅ6â Fº Dn4íf`éêËùÄß½-W]FÊ<Ö…¨çL>ߌ£J„H ˆd¶MYðiÚ.`ÕN>zô¦ Ûº¾PÉŸpr¶uÇúÙ°2e¶™º€ªêjž:]ÀŸ:#vïŽÃÄ>$,YQ|ìä©-ÿâW·¡qÕbÖÿÝ·ð[ßÃ’’¢YËËZ9cT …j‰Mƒ¤C7oµ>=2ÿý·˜~´š@äŒ"9q×÷ÙPýó;Áy\Ðáà…À]w²ÉÝxòQOÉm& ÉÃ~ÿÍ?úÅoÝtãm)åk¹áî³ë¯¯àrÏ^KiÔͼ™X4r;p1rÌêŠFäyLC-+Øzoé„m¡šoq¸vú Ñ…ÆÅkfóÄ °säƒÕ±rùþƒoÝ´ïÐámÀƤÄñï?x7·Ü¸•’±%ç§C21ḉؤ&b–á$à·ŸdßÄ}C­´ÿeÍ;wÒüìË3zÙßûú_\Nx\ÞÂÑ»aíѯÎýåÎs§|ñj€³„mÉÚTQ _­iÂ6`¸åŠM|üƒw³ñ’ÕØPËoV7S 2x2@òÊéµHËûKÏL`ÁUMn*‹b>ÊÅâþÍ`r7šìzïÕâ  Ý”ädfò±{îäÿ]¿…¼ÜyW uÄ´Ãi`® iŠë¯<š²•è¸É/æ ?à#ûc“Zf#µ‚_?r’}ÇbEï`‘`)ªÈDq+7ö.Qo¸ö*>öþ;¹tÍJ,æù§ë&F„ZbÆtƒŒ-Ÿ½…WÛ…w4?PÙÒîfiŽuN/àÄ·K %5«4A؆ÆMÀšüÜlá“z?ÛÞu-9Ù™óù˜h&T=Pýôí~žæ]»hÞ¹ _Î7øðîÏbªxê©§Þ!ÀùÆdë Ibâ{®»ç.VU,Ã4ÏzÃ*ÐÉ™˜C=;íaLekyït1¦Z‡2G±ð÷ÞÃuW_NFZÚ¼­ÃL¹ïh€·¬%•é"\?j z]ân}¼ã½”—:0ç7¤&¦NËuØ<Í>ït=¦Z‡5+– Ÿº÷ý\¹q=i©)ç4ÈôÞf°–T¦K‚vÕHÜá&›ÅœôÑ÷ßÉ­7]ÏG1†.€ýÞÖ˜j®Üp‰ð±Üɦu—’œ4§u8ßx[†‚/^<®¸9 ¶[K*Ó_?pèª×Þ|kpSRbBÒ}¸“÷ÜpŽâÂiËÓŸçy!ïX€ó‡˜u@c‹&Û€M[®Ø$Ü÷Á»¸tÍ*ìvA ªªŠ'žø3yý5ͱ±Êwº€¿A$®*ÔDõ-–Mù’Ëç>ö!øæý_ ÐÀ#ƒòœ>=uNÜ"à\˜bïxŒÊâõàGñÿQX‡Æ“YÑœIEND®B`‚gImageReader-3.2.3/data/icons/256x256/000077500000000000000000000000001312567024200170225ustar00rootroot00000000000000gImageReader-3.2.3/data/icons/256x256/gimagereader.png000066400000000000000000000765521312567024200221630ustar00rootroot00000000000000‰PNG  IHDR\r¨fbKGDÿÿÿ ½§“ IDATxœì½w”\×uæû;çÞ[9wÎhdFEÓ²ä(yìg{Í[“l$K²dKY‡5|K-Û²fä(ËÉQ"mZ")Q$!Ì`&ˆÐ:çîê®®®n8ïêêŒD¢ÕÖEwW¸çœ[u¾»÷wöÞGðÁÞŸû9WÌ2~F¢>†ÐÂBˆïjB}מ{öرcÖõîß&6ñf„¸Þx£xÇÏüL‹céB|H š…,?$âaMÊïʲó½‡ÿíïã׻ϛØÄ›5K·ýÄϾ!~U ~\!…¸ ƒH(@"™‚%X"BŠ¡x@¢ÝR™'î¹çžòõË&6q½P“pëþì%Ô‰êÄn¬‹rËþ=ìÚÒ¦i˜¦ÅÈTœ¡ñI†'¦É +I@D…¦<(¤ö]Ë~ä[_ûÚüõÛ&6q-Q“päÇ~öPêe¿ÏË_ü¯ÿAz>ÉÔÔŽã ”Xüé(Åôì£SqF¦âÄ•9¾Œª‡#„xÁQ]jÞÚúÌ]wÝå\·Anb×µIïyÿ!4íåX$ÄCßøŽ£ÈòÌÎÌ02:Jbv¥ÔB0M‹éD’±é†'§IesËô`‘f5!SR> Lyÿwþé/’×i¸›ØÄ†¡f @Iùr,æáo~mÝט¦É|*E|zš¡¡! …ÀBHgóLÌÌ21“`,žÀ²ìÕ–B[ ñªâ”¸ÿ[_ÿ‹—u-ƺ‰Ml$j’ßùS7)M¾‹„yäî¯_òõJ)ò…333LŒ311ã8‹ÏUÚŽÃt"ÉD<ÁTb޹tv5 „@ 9P ¡Ýï+Їþñ¿œÞÐob„š$€wþÔMš/E#a¾Ïß]ñûmÛ&•J1=gppL&½Æ2PJ‘͘˜™cznžé¹$¦e¯C¢(„xJqTSÚ}ßüê—z®ê`7±‰ DÍ€¼„yô_þþ Ÿ¯X,2;›`bbœ¡¡!lÛ^+&:ÉL–‰™9&gçHå*.Å2"XpBUhd\ÖÃ~ùË¥7ÜÁMlbƒP“°ÿ‡~â°âÅh$ÌcÿúWõÜŽãÉd™™‰344Äôô4°V;(–ÊÌ̧™J$™žKaÚÖ*2!òRˆg„8ˆ{¿ñç_½ªÝÄ&Þ j–¼„9vï?nh[¥R™¹¹9&&&¤Ï+ A)Å|6Çì|šé¹Ée+ r¥Ë0 àMÊû=¥ôã_ùÊWÌ íü&6q Ô, Ô‹ÑpˆÇ¿õÏ׬]¥ ŸÏÇfttt]1±lY$RfSfæ3”-k H!æâûqÔ–úýÿð¥ß›¼fÙÄ&P“°ïÝ?~Å Ñp'¾ýëÖ˲˜K&™œ˜ ¿¿Ÿtz}11/Hg™Kg™_ÐVYŽâ8*¥z 3èÝ BÚÄ5AÍ€Rê…h(Ä“÷]?Xb±Äìì CÃà ô÷cYÖB°l›d&Ïl:C2“_ge„3BÈcÀŽãºïk_ºk3Dy‚š$€]oû‘#𦽠…xúþo^ïî¬ Çq˜ŸO155Éàà ““ 5!Je™s™¹B ÅÚ $!Ä«RŠ)îÿêï~3iW 5I;ïøÑ›5M= …x滯ww. eÓd&ghh˜þu#mÇ!“/’̘Ï0íµqBˆ!|XJu´äø¿÷·_ølæzŽkµ%€¾YJíùH(ij߹çzw犡”"›Í219ÉÐà ###ض½ø\õgÉ´H勤 E²…ò:ÖÌÁ#ñ]éVþé]wM\Çam¢Q³ „|>qü;ÿr½»ó†aÛ6‰D‚¡áaz{{I§Rk\ÛqÈ•L2…Ùb™Ò:Q‰•eFyTh<@2ôð—¿üÉÍ ¤M\5K ž‡‚<ÿà½×»;W…B©©)†††èííÅ4Í5„P²lrÅ2¹’I®l-³­„¼@<ƒè.uïû·7ƒ6±µI·ßy‹B<yá{ÿv½»³¡p‡Dbޱ±1úûû.(&æË"È—MLG+­)Ä„¸ÉÑ\cìñ¯|ä#›AH›¨Mè¾ýÎ[4Ås‘PˆzkÀj”Ëe¦ãq†‡†9wî,ÙlX-&*ò¦EÞ´)ZÎz+ sRˆï+)ŽÚ÷é·>µ„ôŠÚ$€#wÞ"5õ\$âŇ¿u½»sÝ €T*ÅØØ}½½ŒŽŽbY•ÈKIL Óq(XEÛÁrX¬—X B’B¼ò¨ÐÔðÙ_!6—@P“°åðÝ*5އC^~ä¾ëÝ7 lÛfvv–ááaΜ9ÃÜÜÜ:b¢¢ä(J¶¢¬@±FHœ’cRð€Ë÷Ýõ©Om!½…Q³ ¤:xåèýÚÖÏ÷qêÜ·êæÀîVt]ÛÐö®&r¹cããô÷÷3ÐßO±X\["ÍQ˜JPvÀB®®†d !Žƒ¸_ÓÄÑÏÿú'_Þ´ÞZ¨Qxû­íx8äÕïo,ÜûÐ þìïÀehìÛÕÊá}¼íÈV:Z¢ÚöÕ„Rй¹99{¶‡ééé‰LJ)PvÀ B®ÜcAŠ!‰|XŽ-ß÷¾ðÙn!Õ8j“nzÛmJhφCAN<úÀ†¶µœV£¥1Ì퇶pûM[9°§ ]“Ú—«‰b©Äøø8ƒœ?žL&³Ö]P` [H©¯vŠBȧ¤G¥R÷ýΧ>¾Y ©Q“ÐvÓÛnÓφ‚Nûu1X¯ÇàÆ=íÜ~S7·ßÔM]Ä¿¡ýºÚH§Óô pþìÙÅÈÄ*@Ep´…†#5i€”« a@yT Q~ø“ŸÜ BªÔ,H%ž œzüÁ mër `9„ìØÒÀm‡*d°cK#¢®´£Êq(—ËLNM348ÀÀÀñøÚÝÔ”8ÒÀ–:B7V­,‚gÚJê÷þöÇi3éMŠøZ®EÛ¡;nÈgB?§ŸøÞ†¶õz`5"!/7èâö›º¹ùÆ.|×UêÝÕ‡ã8•C)ÇÁ¶R©4##à 1>:J©´êæ.Jj8RÝš¶Ò:@œÑ¤¼_"†4óñl!½iP» Ä3Á`€35@˱\H¼ãðV:[ß\B¢Z˜øU¨€½p8X–Ålb–Ñ‘1&ÆÇ˜ššB©•µK” (Í@¸\ˆeb¢bNù})8ªaÜÿ©üÇÍ ¤ëˆš%ž ô<õІ¶uµ `5V‰o’eÆÕ°’l,{éïB¡ÀäÄ$ãLMN,¦9/BÐ Ð]H—g…v …0…à)‰¸ûSú/%6—¯9j’Z÷Ý~’§C=O?¼¡mm4,‡Çmpð†ë/$*¥V€rì°–AÕ*°mÓ²°,‹t&C|j’é©)³³‹K†aбm'ÃñY`ex²|3£ó_îúÅ_,^—Aÿ€¢¦ è÷sö™G6´­kIËq½…Ä*¨ešÀšÉo-· l¬°¬ !”Í2‰Ùs‰ɹù\MÓ¸ímoçùÓçp”Z½’pT†}ïÿôÏÿ|áÒ=ÜÄÕÀõ·7_¼õA—ËÅ'>øŸ6´­žþi^81¼¡m\‰ù'zÆùΣ§¸ïèk Ž&°‡Æº †±±Xm”ª¬VêËO«…§*ÿ Àãñâöûñ‡¢DêÈe3ÌÆ§¹ãæÃŒNÍà8+¬þ­¢T¾áŽÃ‡î9vìØ¦;p  _ï¼^T¢×~p çΧ <òÔYyêì5ïÌR")åÂu ‡ÄQ ¹I¨iZÅ})%RjH©ð¹ÝhR0—¶¨ïèbü|™Ô· o(Âtb†l6‹×ëeÏÖ.r…“‰$‚Å;S£²åý_üâÝ·~úÓ›+š$LPšÚÜã ñz…D+cýa™ X%'U¬ÂJA°* ꚆÇdppƒbYvn#óê)²…"ÎB»ö[Ü^“‹ô†šÔÜu­RðK†aðkþÅ m«4€×ƒ+/&ªÅÿW¯®+Ë„•ÙBÛ¶È¥SìÙ³gQ< y=LÌ$pVú+G~äýè;zÿ}'¯Öø7QAjJ(@9?8Ë€ÉxŠ{:Ágþ׿ñ…ßú£ûyàÑS$’¹Å׬³Á’¿âXÐ ªw~­âÿkZUÐ0t·×O:•BJ‰ËåÂår ‡¸ak'À M‡¿üƒ?ÿ›]×ëú¼UQ›.›"àF¢*$e/-D$Þ´¯ƒÛu³g{óbÙ0)J¤(¡VެèU `ul€¡i %¯\.‡ßïÇåraY- õÌ¥2ŒNÏVü€ÊBÜýÅ/Þ}Û¦põPÛp-ÚAP¿u;þHiX¥å|–r>O9—¥J­ˆw«a=!ñÈþNn=ØÅM{ÛñxŒ‹UAMV@µ@º®#xý~ …ápÃ0I`GG+©LŽt~Å\?`z3ŸþÛuºo9Ô$(¥„àÚXyG£óÐá ÷ÅvÈ'd³äfgÈÌÎâXoÝt÷ùt£OŸãèÓçÐ4É®­Ürc7ïo§¥1X™ð«V*n@…ª¢ &%…Ëí¡X,¢ë:¶mãv»ó nØÚÉ‹gz±Vì§ÿÏ¿úØç>ö_¿s½®Á[ 5™ Ù±ÿ =îóz?ñ솶uïC'xxHlhº¬×+Ç!“œ%=1޹ºxÆ[MõAŽìoçÐÞ6vm‰`EêaZ63ÉyƧã¸%limæàÁƒ”ËeÊå2Åb‘|>O6—cd|’žáñÕÛžÅmƒ¿õ¡M_ï1×:jÒ°í¹ýÏ—_þ2—BîÇ͇ÿ~³~ÀëCmºB¨ÕùhÝ1É¥³øC5Ϲ}^öÞ~ˆé‘ Î>õ,ûöwâQ.¦&SLǓħç©kÒØBk ãk ‘$D}}mÙ,WÀù„›²]yÌk8Ôy-ê}öЏ4)iêjg2 [·17<@.™Üðk°T'÷R”a5¼XÓ´u]ŽæF’™鲪aïv5¶þðÅë2GmÀ5„PÝ}?»o¾‘–î<RjØf MYx Åmû‚üè­?ÀcžæÕýƒ^š[¢äs%ÎäÔÉ¥Òøš”Ô7ilÓÜ¡­-Ê–ŽFæËy‚)3]ÄsŠŽp™»"øe‹0®vLÐqèg=ʵ"ë M(¥¢2ñW“@•ÇYA;:ZxµwÛQKABŠßý½?ýÊ¿ù+>]Uƒ¨M¸†@©P$=6@WÌbGKá°·Úª2ŠRŠï=x‚§Ÿ<@&S “Y b©«ÑÒ#05•`h$ÎôtŠ“'F€ )´wÖqËmÛÙ¶s ‰‚FÙÑžwÑ)ãX6/ÂòH_4FÃÖmÌ ô]‹ËpUQ)~¬—ö€E!°*ðVW Àã!è÷ÓÙXÇÀäÌòÓy¯Ý}÷ÝïøùŸÿù7ßòÈ›µI ¸‹R“|ôã?B[{삯ÉåJ|ë__ §gü‚¯I̦I̦ñz]¼q;?òžÃd³††§žf|"ÁðÐ ÃC3tíMR¿ûF¤4ñ0< ekýó¶ì=@rb «X[Åt¥¬|~rY^AÕï_¾"P­L¼Ü hi¨c.%™+,Of¹½wzþW€ÿ}}FT›¨Q°ÔµÊcBÐzTÙrÙâ¥yìû§Èç/O‘/Ê<{ü ÇŸëa÷®î¸ýÞ÷Þ#”M‹Ñц†§H¸›+{ñ9»D‘î2èºéfúŸyò Gv}¡ µHU¬v„+¬€ÅUÓdk[3¯öU\¥úÎï}þÿåwçW7W.µ¹ kìˆêºÎg>¾±«gz'¹ïá×½(¥ÈfŠŒŒÌòô“ç9öÔ"ÔD][ >¿\:‹m]¾:;›â•Wû8sf˜bÉ$òÑÕÑH8d&wé÷Wá ) ækGlˆUƒ[ë´6ÕÓÜܼøÜz©ÇUëÀqœñÐA*E2³âBBpø]·ÞüµÍUËCmZB\Ój =§Çè9=¶æñHCÍ]mxü>n|×­ ž:OÏó¯R*\¾I>O2ýèÒämmòî÷ÎOK.·èQLJÈ%S©Ën÷zBÓ–V4mé>Tu–ëÕUÕ®@S}”ÙT†ù• CwhÑæ_¾ÖcªEÔ¨ÐÔ!Ô4Ï|üÃÚVOœ©¢¤¾¥©ë”òÅÅ»Q1_ ÿµ³äRi¤¦á ©ki¤{ß.2ói2É+›Œš&¹íöíüÜÏßFsL£- é"\Žw!¤$ÜÔÌÜÈð›2Lx94 ꣕»ü––m-Ô×ׯ¸óWuåXm8ŽƒÇЉϧ ˆ,°¥à]ïú©¿ûØw¿;wMTèI @píö³¥Î-ï}'ÕmylËbv|šÁÓç™Á±m†{úîéC7tbÍ Äšˆ6Ö110rI¥ÒãqÑÖeçîöíï ö¡LßíðÎ]ÈBïL¦.~:—?ÀÖÛßNßÓOàXP ¯'t8D!1æJã Ñt}K“ý¢±A¿Î†S3, lõI[üµRêÎÍý/Žš$×ÌГ§î{„ÃwÞ7@ÓušºÚhêj£Ë3r¦—¡ž>²ói,Ó">:I|te„^¬.À­·nÇçwáö¸]¯‹@ÀM8ì[Û¨‚Ñ´A®¬áÑü†×œ!þÊiJÂG¤½ƒ@]ëErêØñŽwÓ÷ôØo²Pa©øë(ÏV&½”å¬ €*–ßýWÇTÁª+Ð\c6•&]X¦˜:¼ûwÿÏ_| ø³k0´šEMæ„v¸‡ãn—‹ø™6´­{øöwO"umûw±ãÐÞEŸ¿ ¥`nrš¡ž>Æû1KkëèºdÇÎöîkgç®V|¾ çX–ÃÔTšé¬†5 „\l';ŸÂ2-[¸0AÉZû1êš ä¶Ñe…)Ír™R¡D¹P¢\,R.Ȩ́É.ficÉBs¹7µà ‰Å4üj«Tâ–-n9|ˆÎÎί_žìµ|‡bÓ4)—Ë”J%òù<¹|žt:Mb.Ék#«÷ÌI©ßø;ŸüHÿ†®†Q›€%òe ‰Ð4”‚¾gé?užöm]l¹a;u­ÕòXP×ÚD]k7ýÐíÌMÍ0=:ÁôÈÉ©”RX–CÏ™qzÎTb"MÍa £ò8¶"—+’É™ŸÏãØ•"‘†:n~ï;ÕE‚Ñðš.*¥(” %›bÙ¡\v°lE² ñ{5ÂA8xá1*Eb2ÎȹOŸßZ‹v¹ÌÜè0;váõû! ºÛ¾ÊXŽå‚`õ¨Š«]PÀO[]„áø\%º°£åWXÿø‰«> ·jSŒ6·!ø¦iüƯl¬xnp†—NO€x=.”©D’᳌œëÇ,–ñ|¸<•Ì>!¾`€†öº÷îdûÁ¨kmªäA©P@9ŠbÑ$1›%O§™™I“Jå)Ê+ˆ­˜/0|¦ÍЈ5¯¿C°C—ø<!¿N8hàuKt]bZŠù´I±l£ÉÊëÖ9¾`€–îÜ>/Sƒ£k_s•KÎ*\  3bÐÑÞF °2×âB‚`•V ‚¶ãàÖ5’é,åeú‡‚w¾ï'‡Ž=ô6¨FmZ×0XÈŠ2ÿîwïÀã6€JäßÔTŠññ$££ ž¸÷,h„¶Ý´t¶â[–8d¸]´twÐÒÝT*ÍÏ$™›Ž“NÌ“O‘žKQ\™å¶¶móÚ“/ŒÏrË{ßź,° R€×­áuWø]¶­(™¶£Ðä…ß_¾‚åË×¥ÈMBÐ'D¾‹Z•·¬× öz1M“ím¼60º¢¬¸#œ/þÏ/}é{¿õk¿¶YAhj“®!¤¦ñžÞ¾ìÎé÷»Ù¶­‘mÛJ¾þðp‚¾¾8¯>rž¢%iÚÒJsG+±æzIJûBJ¢MuD›êV´c–L2ó"(æòóEJùÅ\ˬÜÑ”¥b ·×sEcT4ý­rrE߉Î<÷êûõ@ÓV©H¶\BʺKnfz!Apyõ ÅU@€ÖX„ÑÙAQ1ÓÖþø7d@5Œš$¥òšhº[_1ù׃¦I¶nm`ëÖÞûÞ½ÌÏè훦ïü^9–"ÒÔHc[õmMø‚þuÏa¸ bMõ1„K"›H0ôÚ)ú{†Ð öí;ˆ4Æð‡‚¸ÈƱmr© ¹Tš¹x‚Ù±ÉEbºšæ —&Ö­}ýÚåVÀêB¢eÓ¤½©žd&Kv™ëñïïúã/ã®_ÿÄ}WÜé·0jr ¼uß%ä †®3{ö¥ më{Ïn^g©î2aÛCC úúgèíS0õ-Ô·VÏ{é“l¤PD¼6 > ŸQýÛa|¦ÄŒDè¯t¤‡‘sœ9þ2ùÌåÇ-»tèh­‡ßãâÇnßÉm·ÝF(ºx{+7]S=hy!Ñt:M|v–SCãÀŠLFŠ–oß>ûÁÌewø-Žš´¸†Áê âš&Ù¶­mÛxß{o`>™§·–ó½Cœ|æ%¡Áh˜pC„HCáº0RnŒ6+%„\6aEØc£­¢©I:š½´+›ùb‰‰Œ±X¤d5„”tíÙNó–vž¸÷{¤——‡`• ?ŠŠ+p) `E›—á x, Óã! ÑI3•\1×;=zþŸ¼¬P» ¸&.€c)r¹2~ÿ•Õþ»"Q7éäæ#€ÀÅ2LN¦xñ…^ž¾œP,D¸>J¤!J0".®2\ „Pø ‡ Û!è²ñÎ¥ôÃÅ÷E½6!ÍÀœ›lùÂÔíõкµó² @×b¸¸ô¥­Ã/ݧ•®À¥ ‰–M“®æFæ²yJ¦½-¨ññßù“/óóŸúÄÓ—Õá·8j“®%„ä‰ããüØwoÀÉš²ð°½ÓÏöÎýXö>†‡çM23;Éùs½$Y4à  ˆ„‚¸½\7bÙmÜ,–ñ{%± Ag«ˆ_CÆ’&`K¤Ì©øúnŠiš Ÿî¥÷ÕÓ‹yCat«T¦”ͬÉK0´¥ø ·¡/®í_.®$YÈ4M¶4Ösnl …@ @JÛù³ÿÕ_Ýü•|ä­»ƒËe¢& @ ®Ý®Bpúü<š>»noÃíÚØÐ ]lÛZǶ­K«¶ãLH$r‹&¶å€(áó*|~‘ WT IDAT)$©TG÷˜Í•<û®-1vílf×î¢Ñ×§cšZˆ¼^i:ô¾ršžç_Yõnk§yçn¤®£‡b6Cjbœ¹‘aŠ™4ºî,€[¿l .-®®`–Ë4Ä"ÄçRÌåò‹œÁéâoÿßëº(o!Ô$\Kˆ…HÀ“çæéJ³wWŒvDi¨»vâ&%õu~êëÖ_AhoðÄ“½MÇåÒ¹õûÙ²­PÄGÙQ NgfP@#ö\–+à8¬™üP‰H¬h+ `ªç43}½Ôuumïīǻ;LóîHMNb> v±²  ë‹ùrqEÉB ®@w[©…â!Ëð›¿óû_ü—ÏîÓ§×¶òƒƒšŒôÔµ4+¥~YHÁg?ñËÚVßD†ýó)±l˜Œx­gŽ“çæ˜ž)Ζ±…®K\ÆõÝm]HÉðH—ÇÃÛï™Ä6MË¢«µŽÆº[º.½ãÒš±®Ã`Ë-„ªePM¶-“ùìŠ`+MIy¸ùC¿ôÏÜsÏlÆà¦p !‘š^1‚Ô+¥¹"œÌrv T].I,ì"q »‰F]„n~M ܆D\d²½Q¹©ƒ;yúø ÷|ý(m[šØwh[º›WD:hxc ”Ãôè$Ù¹9š›45­\ŽÓ…Z(¼»†a°ýÆ=l?°›‰¡QFÏ0=4†i.Yå|¾BCƒèº¢µ¡( ‡`(¸˜èt%¸\W d–Ë´750“Ê+.•€[w M~Œàâ!5éÞ{£#µW5M2wî• më{/Lñõ‡Ekb…ÇPhR-ææ—-E<¥˜Í( ¥ÊGU¥nµô»ð„ƒ.š½47úhn𠬽þQ”J&'NNqòô$ù¢Ãî½]too¥©%zÁP⡾ N¼pl“–汨Ÿ`ÐMÁÛ‚%/w#›™‘IƆ™YQÉë¶iˆ™xBaÜ~oÛÕLK,ÀÛï¸ýŠÇ·æN¿,cpõÎB¹\ŽT:ÍT|†“£ VÄä¤Ô÷ÿîg>1xÅx `Ó¸„”H]çÃï,ó®] ¨¨K MÀsýð—³òå°@Š€G²»Õ 9­1“–H—K§èHò¶FÁÖ(9r]¿ûJàvÜr¤ƒ[Žt0—,pºgš£§Pvèên¢{{ ][š0ÜKä³e{+[¶·2Ø;Îã¼L21J¡»ì£kw÷%c4M£¹»æîvÔw075Ãìø3cÓ”ÓcøcA4—¥*«—-F¬ÂòÕ¸¼B¢uÑÑÓÉôòSùÇú3àÇ_WGj5©x£MMJˆ !øÜkSyNgi‹*ö¶^¼Ô–Â>ØÛóþY¥¨¤ Éá>~òÖÛ[ÝÄ‚:†.Bá’~Í&b˜Ä\&>ÍÂB JöÚòXW¯× «#‘›ÚéIç8ybˆ§ïa|8N6[@Ó$~¿!ѺûïÀëó051_ÙÎ{l𑾤#AäêýËÖ»Bà ú©om¢s÷64Cb—+“O{Úc¸]ím?ÑEοÞïU¬)!fÛx ƒ©ä<öBÊó»v¼ó=ïë}òèC'_WGj5J׎¦‹dç'81îÅ놭õë“@!GÓ]©1™üós:%[«ø¸²J’á‹c'rŒÏY  .¤­É΀!>Í&l˜4¸ËœHñ|Ojá®Éë^Ž ø]twE9r¨›nl%à×™IñÜ3çyáøy&Çç(J¸].¶îheßÁ­”M‹Ùx Û´™™ˆ3t¦Ÿ|6ÇëÁ㻼Ä$GA|´U®† +öuÖ!5íu@"ÇÕnBEtÊ!‘Ê®>ÉÛÞó?ú7Çz¨¶6Xxƒ¨I ,„ºVÌ¥-l]õ¹;^àɱ¾:×À”h,s”"Ÿž¦™á\v'_>B¹\¢Å=GL&ѤR’²Ò0 ÛÑõpn؇-Üìépsh››}]n<Æú_æ;v{Ie2Ô#H)8×›`r6MS½‡Ö&?áЕG*ú|»wÖ³{g=ï»s+cY†“ôžä©ÇNâõyhm‹ÑÔ¥³»•‘¡i@á(HNΚžAóx¨oi¤¹³™Plm±’*¤Ÿ^¢¨ƒc܆†z– \™ èñx(›&- õL&æIåWÌõæbIý1ðÁ7Ô¡CMŠ€möI8)¥$y~cEÀc§æ¸û©)ÔOñÿìè!k¹xv¼•‰bÛ!âµñÉ,[Ý=äLƒz±‰#òI.§fƒ àxÉÙ>’N#POSKÛ·6Ñ[)*÷¾ Ø»£©ÒV¡ÌCO 1<™Æeb^Zš¼´7ûhmòãq¿~š,›“i†Fæ™gr:»X‘T Á/|à0]í1”‚d*Çdð¹On¬ 02SäüDŽ™BŒéf_ÝÛ#óì«›ÀíÌS.fèòM ËŠEàÒºÊ<6±?iÜââ[ûÀ%LüZžz=IÔÇ•:Çô@ÏœLsz6D¦$±lE¶àðj_†‚%iˆzq»·ÖáréŒNçHeM&ãEÎõ§yéT‚ÁÑ ‰d‘RÉAJÇ­]¶– i‚HØÃ–Î÷7³wO#õu~4]#›39qfœÁ‘ hªÑÖa×¶&¶·E˜™äÙ'^%1=G¹lâò¸R‘;»pv…ËÐØÑE¡ÑÙÞúú? å×ò2b7 …"éE+@·ÿÈ;îøê±cÇÞ„e•¯>jÓØ~ã^©Ô)!ó½[À⩞$ß~>ŽZH>:Ò0Ê{;Ï]ò}§fùçž‹­r˜F1IL&аȩ~‘½ä9 Ž—Ç³w0i6RABðC75qÃÖ¥-ËÆ¦sÜ÷ø –]ý‚¯\‚D)\†¤>桱ÎMcÌCC½‡ú¨ç¢@ëÁq“ÓY†FS §gioÑÙ¥³-Bkc˜l®Ä?}ëEæSy@áó@Ø=…a¸0Ü ??|` ŽæâŽ›oº¢ö/„Ë-$šÏçI¥ÓÌÏÏóìÉs˜¶½"Á)ïúÂÿõˆ0áM¸þå_ïá䔎ÚƒB¢€ƒu#¼§íÜ%mþñìAÎ'c‹äRh˜”•Ÿ­r„V9BƒŒ/,"®[é<˜}/³vlÑ WJ±µ-À­{ꈅ+kô¯œKðÔ‰išÂ’h@+*fÓ6ù¢½‚[­¤¶4Q4u±¨›XØE8ä&v »p—g æ Ãóô $éœÃvÀï5(M,ËYü2¾Ø‡ö¦ïç~LtÞqÛwª×¤ú³z·¯n1^%€ÅºÙ,étš¾‘1ÎN® !D]?ø…Ï~ªçªtìMŒšA*¸6»ß¤§Îãé{—Ân¸»îfNÍwQ°½üXÇkòÂý¸¥yœÁL}å ‰X  C)J*ÊQú¸ì"Íb”9B³G__¯ ‹¾anm)õѤC¦d0—wóÂËÓÌ;|.鼉Ô4‚>Üꥳ¡òñÎf¦Ê¼Ò_¢g¸LÙqÕ;¥R̤,fæÍ…Í:A“`Z>¯V!ƒ  @ÇïÑ©ùðû \†@×$ÊQH)ØÞe{w”R¹‹£O Ó?8„¦ gâJ(Ü®…jÈ—»÷Ùeàrª­;[š˜H$Éä‹Ë6Å%,ë/QêÝײöÄõ@@×¢€\²D96þ0ÚØÃ8¾fÆêrOa?ïî§Õ·~.|³?ƒË(U™ü9üz™xÁO¢àÇrXxÎÇ;W;‘¶MãÔ‹)‚$ÑpH«õÍ1ÞÓ=¼n;–#M8—ˆ0”s>âîÏÓQ'¹m‡Á¾Nƒ[vx¸e‡‡BYñÜùŸ,O[+›}nÿüS»pé’l¡ÌÐx†3 Nõ¥ <üäOî#¨,ûÙ ‡rSS)â Ì˵8ñÅ‚û!ªo‚ùl‰ÉDšºèú;/¿^¼žB¢»:Ûx±§8,& ¾ó3¿÷‡¿ø‡ð·Wµƒo2Ô¦ °cßéÈ3©¾­öüõ¯|‰ž'*wïóuÑ­»èÞ³—[¶Ag©4–ã(ÎKúãLábBÛû:GØ hô¥83×È`:Æ Í&n]qnÚ Y‹nÂçÀ–P’_Úwy+–Ò8¯ã•©:ÎÌF1mI{L°§]g{³Fw£†K¼Ð_æ[Ç ¤ ö‚k¡èhôsÇþ&bKëûc)fKŠö^B¬SŠ¡¡Y{ô\% š´­n{ÍI‚RH!*…AEkC„[ÚÙÖÙʶ®ÚšêÞPÐS¥¹õ]j˜p©TZ Îf³¤Òi^îée:™Zí Ìa‰=t×gâo¨CobÔ´p-pÑrUÊdÏœ¡ÿYI˶´umÅ-A%úV‰ê”i¶ûx|êߣIØžÀ£™ì‹M°/6AÁ2xm®9«‰Þ^ÄŠWÇݼ<æf6WÙ”d<ãô\#{c—þ.êÂæ`SœƒMqʶƙDŒ—§yìtŒ£§,‚ÖÔ….ÎŒ™‹06[âžG‡©ºén ÒÞॣ9H›[)œ‹Lβi£l›ÎÖP¥fP,™äŠåùʽUHÁ–Žàb°íØœäµóç)–lʦCc]Œ›ngk{ mu4Ä"Wt§z=…D÷tw0›J¯NŽ ?þã4_S¨I ¸eÿn¡‰Øx àŸþï—~íèúÀâOµâ±›÷lÃíZ›àóJø?Q”Av…Æxgã™5ú­$g“ÍÌÛõܲ͠9d12oðꘛãJ–Í/l™Vz͹/é²›ç'›yb¤¼©/Y°¾H¸èb)ã‚{<üI&ÆÇÈLtb×b˜Äâ”[h¯T¶ÉæM”’x¼.Â!mM lii¢1¡»½‰ ÿÒN®´hOß½ãÓ«­%5ñCø›¿ñø^îš@MƸ£ÍuBð+ÿý“ÝжN¿öóSW¶µ\6_$ôa,³J–bd|YN1W r.סkÔyÒ‹,,…¢Ñ›¡Ã7Åpï ^>9@sÌÇ-Û Þ±-Ï–P†žd™²F½7sYì-¤F_º…Gú›è™‘,(;&:R îÜUæïγ£ÉF ™Ík8,„./ c¶™Ççs‹.Cq•Ê4…×¥!/bLMŽb–òø½%Ó!•)ãuk‹–Àòû®&Ž×£áØ63³FÆg978ÆK=½|ë¡g&—Ï`Ù^wq‹µ5ã¿H˜ðŠaÇÁëv1ŸÅ\YÆLo?òÓïÿÊó>øæÞwýu 6-€î»„ä,l¼p÷?üý/=¸dšfàØv%¡d À²ærb?m aÜ.“³I ¹è‹w] ñqÇ-»Ø¹½uÝ 4=“bh<ÍÎ]{Ù¾£R—жlFâ˜å õþ"ÚE„ê@¬ —7ƒOŒàš}‰A41îlaJub+É»wøÙƒy4 ESð∋Çιš«j¬°š|¾±™XÌSQÎ騔 &¶í`™¦iS2mòy“L¡ÌXß R‰1LÛÆ±ª‹Š%ôUòVŒbUÑ·rÙf.Y$›·EsÌKSÔS ìAðûhoifkGí­Ô×Å*u VÅT­Ë²(•Jkbú‡G9Ñ;´Ú @Jñ¹?úÏþÁ•~Þì¨MØzãN!Ô9Øxø—úKz_x`‘¢±:±PÙq7—É2ŸLbÙö · ™-O€JõÛ€×EØëBJ±8‘ Mcï¶vŒ…̺@ÈKWW±ºÀšÂ!ùB™¡Ñ9BÑföî߇®W¬‹R±ÀøÈ `²ÞNãîP;P¥¾à±g1'O,Æ”ðrNfHí¦-bógh‹,Ý䆿t?ïæùae›d€‚ÖÖ ûöÔ­°.„ÑÞÓœ?ñ¶íTHÂr0M Ót°¿Gè+ǽŒt«(ä-¦Ãnš¢n¥PŽZuGwƒtµ·ÒÕÞÆöî.ÂÁຂàòºUWà±ç_%S("W’@Vi®ÝòÛŸ¿ä`kµì|6Þ8×ó*Ã}'™M¢²Ë­Bár»Ñ ÏK(ÅBañ}—ŽÏí¢P21m‡BÙ"/#xª;+ÅÌ|)%‘ Cj¤’y&'æÉ¤ó†ŽÛ£ÃÐh¨ òÃØð“SSø¼|þÑú¢uÍ=@<‘e&Y$SÒɘ>|þ0>o%PhKG”™RÒüDe»0,š¡AL2`mçÙ‘ESгÐ%D¼ÛMîÜU¢> È–%Ù’†¦ ¤äre†RÄgóhš p]Ð䄣蚆c›ØV—KÃãÖñù\ün4]'[t(+¸Ú²jÇË—{uCðêØ–ÂïÕ—½¦j‰U(£X*195ÙÞ>žzþENöœ#1?‚P0°X‡pùŠ )ÃRÀøLbEÿ¸„²[ž=öý}}ߤ7'jÒm=¸ᜇ·¾}ÏßòÌ#ÿÌH¼²Á„Ç¥Óñò¸qû¼øý~ÜžJ‰î|.ÇÄØÄÒK­`&•'_Ê pa%fñ á€úH€†HÀBš­‚¶ŽõMáukg˜¦¦éhšÀmÇí»ôºú‰óI¦N=ƒ¦–ÊcÍim¼¬ÿ$Ž‚€ÛáGwç8Ò^`u½ÎÑy—GÝœœ0˜Li(–Ü·K§½=HG[ˆXôÂiÂùlŠøØ0³£¤“ œUÛ‘Û–C±XF)—.𸴅oê” 6õAJ9Ëüx-€j=Àjì¿RŽSyL“’í[:Ù»k»¶nÁqœEW Z=èØ ¯2—ÎV“„–\¡îüâÿø­Ç.y‘k›p <ðo_çµÇïáÜx’²¹dû=-±.M®Ñ–@e‚@¾lŸÏcÙ•/»¦IZ£EÕ¼z“«ÞÉܺA8è#ôùñû\ìØÕJ4záÊÀé¬I¤i'ÑèÅ·ÙèÍpî¥çqÛK+ gC?Í{ºhðdÉšnÆò D"nhÕÖ%ŸÙ¬ÆDÆ×ëa*cÏTJ£Ï9¶– ­­A¢‘ “m[¤fgHL37=Af~nÅ]Ù²r¹…¢…&+B©i)b£â8K¥°]‚åÄ –½Î©¼Æ®<çõ¸¹qïnï»C×Èçód²Y†ÆÆyza¿ƒUzÀé|KÝ¡·ÊžµéÄêb ? ïô?Éôði|.ƒù|yñËiZóÙ ðº´K–¶24 ·’³_4m”R”L‹ ×`=¶m‡l¡Äì|–±é$ƒ£3¼tb‰ø<·A4XÓäl"Å—þô› c¸ êc,¹ »ñúý Ïà–³»µ5È–p —fSïI ÎD"G¢à&êw¯hÓçR4Mê<êƒ|ÉZ¼‹+ _2ÉL܆¾(æ]ð¹ |.ƒ’iS¶l Mõ è¹ ƒÆ¦zêêhl¬£±©Žú†Á t*‡£É,§zÆ8yv Ûr¨‹ù—ÀNŸ£o0N<>ÇË/Ÿæ©§_"›Í ú …kú¨oªãɧ^Â0t\Dk¿^­ŒWÍ1“L3›w ºÖP–KW\&^‘'-“+ :\ìk—ܼU5JLN¦8}>Å|ÆB×£¯Ñ —›P´ž¦Žnºv ±µ¯/P ÉWe¢Í´uïdëžiéì& #-β•‚Åù¿ð×â BÕB¨>¶œ –™ E±T¢§²e±½«x"¹žàF{îØ£ß¾àŪÔ¤Þ¾o›R²6^xîØ¿ñòSßææ;ÞÀ|b–/?O6“c.S$™-bÚK“ÎÐ$-±@E¸Z¦ÀrÅy¹5ºôX(¤«»}MÎö PÈVܱ–¢÷Vê‹&1«&òÇë8°û÷íbû¶N¤&éí¦ÿÜ+Ü|piÄñ©y|(¯4ʱñˆ,R8(%H¨6¶µÇÐ/QOàlÜÃgäË:íuдDÀk(ž<¯89Zç‚7ш—pÄM8ìÅç½p¤z9‘æÝÛ= Ñ;0ÌàØ©TzÙ² áo™PÕœêßË´{Yý{!¨¡.Æ Û»9~²gA\¡8šäÖ?¹ë·_¼èàßä¨Í\)Ô5ÊFJ\&ã8•庺zn{Ç<ýØ#ÔKA}ÈC®d‘.”ÉÊ”-‡‘™ Ñ€‹†Ð•íÇ—NgÈesø+…>M_{§•R®Ùxór'xäèÓ<|ôi M§¥µ‘úº(™ÔÝõÄg3<~¼—|Añ›Ÿý0ÀÒ:¿RŠÉx³˜¦^cltžhCaß…¿J»‹ì¨/r|ÄÏãýAúg*çÑD}ŸJ– P0ÉçËŒWˆÊ04‚a7ုOÇíÖAA©lÑh8¸Ý.¶woakW'–eŸM00› èó"(GáV@ ¤£øðö×õ!¼IP›.@}s‡_…w¦F{é=õºn‰Ujt]GJ™ø 0t‰ßc xûݸ Ór°lëÊ86ΆW”Ývl‡ô2Àãñðã?õc -ÜX @Ó%.CÃåÖñxt|^~¯ ÕÄU‰Ž›Oe˜œœa6™áéçû9qz”d*O.›çù_£±!Fss}å¼B øˆD¢LÏ•ÁÊa—æ±(Þ‹l&tFLnl+.éÌ „T–ýÿÿöÎ;¼­úÞÿ¯s$y[ž‰W¼G¦³HB²€+”–ÙB[Ú_{o´½´”ÒÒ–{{ÛKi e•Q ¡PBX²éìx¯ØŽ÷e­s~K–ä¥e["z=ž8òÑ9Ç’Îû|öW@% ¨D¥ 8.ZòÂrS"ˆ S¡×©ªí¤îBº¹xQG~r89Éý+áa¤$M`j~.3§L&>.ž=f³Å.[ã°úʲͭ‘imï$9>aà„0!ã²e+÷Üõ©{µâ~D€ @RÜX €d1ÓÒXCuù9â P¾t‚ PSU1`{QÓ¨‰ ר ~l£RJHh(’ÙìPè"I“‘ØØþ »!¡!´4·õ­sÑÚh¦Ï˜NxD85Õ5û UF\\ÑQ¡DF„®!ھΎ¾3úî>iiÉ$Nˆ·¿¹¹•êªzd`„ ¬^·Y–ùðý¸ØØ„ @¬6œ°p×–khìBo0¨]pN¥9×3ÄÆjY¼h6Ë®˜KrR¢Wï©Á,òQYgšÂí9P‰‰ÚcBˆ A£èè1qä|K¦Ä²lzœRèÓç¿K²Œ¹Ï‡·˜-6Þb±Øž7›Í4µ´r®¼’óUèõ=vñ€þâ!‹dÆbVÒµSÒ“‘Í&ºŒÚzÍûaí“=ü¡WoÆ8˜1€q 2*–Y—¯ÖÒÓÕJÌ„óˆ!—¶Ù! IDATñ”œªÎÁ]ûi‹òc¸¼ èn5ßÚ~-ö®€ds”GßÏ3¦¾çL&3åÕ5œ8W‚®[‡Ù"1yÒds¿ÅTÙ®‡´ 4—NWoÞ|kÀÍ È `x|BŒ,ˆÿ Þ;::xíµ×øè£8p൵µ "## smÝ;{"¢cIŸ<ŸœÂe$eÏ¥³SGsc=ºŽ6BÔ"bµ„…jhjï²½F"C5Ìf,’ŒÙ"Ñc0£7š$ ½ø¸¥z.<Œ‹[Ñéz !qB"¢(ÒÕÙIOO7Ýݽ\¼ØABB aa!$Nˆ£·×DG‡Î¥»¾‹,a‘•4™ZpïkÒÙ¥ãô™ v|VÄþ'hné@–ebã¢Q#°*A&'®‡nsÆP%+ r̨D• ÒÂH³›[8X)öÀ¿×íïµÈØM?ê{ALt™©©têzèìîf‚6Ù®ÀªMop}ÛÎGOŸ>p@` @ÜDŸ À–-[¨®®”;I[[eeeqöìY:;;Q«ÕhµZ·‡UjBBIÉšÂä¹+˜¼p-¢6…‹­44^¤«ÛÑïúDÀh¶ØJ%YFo4Ó£7`2ôF£¦««ƒÑÄÅú&&'I[[ ]HttöÐÑÑE\\ jµŠø8-²¬¤]E’e,²„€ŒZôÜSìêÒq®¤ŠÏ÷eë{»)>YÂ…úfººt¨Õ*BÃB¬.Q€´(=õ=‘˜dµíâE¡/K üœFj\¨í½sx/qîp|ôÿe«Â6O%V–4£Ñ€(Y¥þ›{›Þˆ³¼ä¦&ýò³Ï>jýx¿% c‚cCþ®©©‰¦¦&öíÛGxx8999äåå‘““CxøÈC0ìQ©ÔäN™Cî”9Êq/TræøNÛKmå9¬+þLÐFЮ3ЩïoÖMT\h¦§ÇHFf²íy‹$±óÓ]¬¹z5m-Íäåç}±ƒ–æJÎW“‘•LtT™Ituëho¿òu³ÙÌÙ³•œ9[ám %:&Y®ƒY$}Æ2f.'~RöS’•XÀ€•Ç  c, (¨s@P%ª”€¡JìÛND’Uˆ¢òûYS§pöÔI,v½²lø¤ ˆÎƒb<&55•sçF^êK¯×sêÔ)N:… Lš4‰¼¼J J÷`[Þ¶p†Ù"ÑÔÑ…¥ÜâðÕ³XÌس Q­6†ì¼¦Lï7kªë¨®*'1AKnNGŽœ·E° &&œØ˜0ºuF.6÷‹CÿœB%ö Õ†¢ ¡½Ã@W·Ñë·?3#…uë–Ñ«7ÐÞÞESKU•u4÷t`¶X(+ú€Òƒï•LÖ¬+Éšµ”¨øT[,`°%Õ2 ¨$ ˆvb ªTˆ}AQEQT¡edQTj5*§Y’m‹X.\HEL >I+Á÷À{ ##ƒºº::IÅ Ggg'•••9r„ââbZ[[­V;d îP„††“–™Ïì…+XºúF2²§‰±»¾G™=ˆÒt¤R‰ÃF%I¦GoÄl˜1{±±±ûŽ‰Ñ’6)ŠŠ*"ÂCèÕéé[S« %>6AµJ ½Ó®éE0ËBD¥¹Éd”Hž…6:”m˜Rï`ìoˆr—öŽnNœ8‡Ñl&=-‰Óó™5s2—]VHZZ*•ŠŽŽnzº:h,?ɹ}ïÑPz $31‰)¤%D3ÁiIôá\4Ùá'‡ÔˆÝ› `­”e™æÆFL¦þá)-ºÍAt$Æ>vú³Ï.ª^0+Mc‘kÁwY€žžÊÊÊ(--¥¼¼ƒaøU}‡BÒÒÒÈÏÏ'??ŸÄDÏ‹edY¦ªì ï½ó îÁ`0ªQ1h3‚Àüs™2uò€‹A–e@sC%²,sæL%±ñÑXÌÝ:==}ëÈ@k[/²€‡=&“³g«˜:5 •JdBb qQ4µµ# ’]_½’ˆ, X$HžAb|8u 4·*7K•FÂbô@\¨ÊL”•™†)P0pâ³µÂZ qº˜ Œ‚(ú¥Ø£V«ÉÎÎ&;;›+V8«ªª,†1íííQTTäU 1$4”Yó¯`Öü+e™ò’ÓÞ˱C{hl¨àëMªë:”¥Í¢B S¡Ñ¨Ÿ¼½›cÅåÌ™ƒ(ˆÄ'hiiëB–dQY¯A•A¨«ï$*2µJ 3-†˜èPªêº0£ ‘0Ý»~\-˶oVfy9ÉNÅA*Ù®HT!‰2No‹R6òÒWHDì‰z½žÊÊJ›u Ó¹^£oH|ÿý÷IJJ²¥Ý $ ‚@nÁtr ¦³ñK÷q±¡Žã‡öpìÐ^JΞpÈtMZÚz¤õ½+®¤pZ¦]QDDÅ_d”Ý`”,”Uµ“—‹( ÄjÈŒÐPVÓ‰Á¤G &ƒàra‘«m®K†­¢JF%‹"eƒõÚ€<騼9DÙrÆ7è |HŒŒŒ$;;›üü|rss ùEƒ ëîäÄÑ+Úˉ£”#C·kÔ*dYÉ÷[·Y´h.“ ²Ñë{©©màôéRš[Ú U“•CX¨âÆÈ’ÌÙŠVŒ¥†Àd¤þiIÖã9/»òjþë៻ü7 4hîZkv~ò ¶}­T>#û `H”:êåÿþoוÜOH @EsñÎFvìØÁùóçÑjµ¶H|JJŠÛÝžàHìèè ¼¼œÊÊJ·‰:ÎHT«Õ¤§§“••EAA .ï'2JËåKWsùÒÕ˜Í&Î:ÎÑ¢=-ÚCKÓÀæ)“É2 7 ¬¬šÜÜ RS“HMMbá‚™œ/©d×®Cœ)k!16œø¸0"Â4¤'k9WÙŒZ#£ “1„?^w?›Aã‚8 (‹ýñUŸ+àŠÐÛÓ7Ó€<éè‚y‰‚ÅÔÞ[Û¶mãøñûˆŒŒtèþó&-ç)Ö@bii)çÎs»_Áû@bff¦Ûý Vš/p´h/Çíå̉c˜-vsSy‚@ZêDòó²ÈÍË$F…Ñhfû;9{¶¢ïØîì*µò0̦þ}9[‹V^ËO~ú°[çîlH%ÂS„f³³ÅÌÇ|à`*¿à0µ%zóŸÿp+¦L™’ ˜BšÁ{xòÉ'é²Ëñ†(Šddd››K^^ž[wS_âM Ñžððp²²²lÖAd¤k€Îèº;9uü0GŠörøÀnô=Ý`߯€ ¡a¡$&Äa‘,ÔÕ]¤ïi‡:•ZF­Qvb±X]‚°dÕµ<ôc÷ÀaÅàA*ÍNb`­üðýíttô @Q™2~Ízñ‹‚€Ñ¡Ýòüï†ÿ"ù!ét«d|tCŽQ$I²ívìØA\\yyy¥å¼a°@¢Uz{]¯AÑëõœ9s†3gÎØ‰Ö¬BrròÈ;è#2JËÂ%+X¸d&“‰s§säàíÛEsÓÅÛ÷ö¨­mm°¢R« ¥× C­‘Q©@ “1Àlq¼WEº¹ÞômƒDéÚ§íç(–ÒÀ4`ßO€€DGêòf'“Q'k„VðÞhlläõ×_w«¤×ž[>//Ï㻩7øc ±¶º‚#÷räànÎ9©ŒÝ†a+çÏ›Îê«ÓÞÞÅž}‡8WRb “ŒÁöÿµ×ÞÀ·¿÷Gçæ´u šÍ ïm{—ŽövÛë”Ô²C0¢Wóê«Oz¼€âk[ï¤ååån¥åœIII±‰AJJŠ×çæ Ö@bII •••˜Íž·óòò˜ƒ¶ ;™þö.Á¶­[ioo³½~ÿùJÀ±H£¶Än~晎!ꧤÄfÍŽ•TRŒNÐß|moð·@¢ÁÐËÉc‡9t`‡ö玲­ÅÁ*ÐFGqóMkHNê³´wt²ýƒ]ÔÔ]@eÌ&¸rÕF¾ý=ÏF *s­?oyçßÀ¾³8 @Hˆ€±".g^ŒE0µÃè×xãkÛ#‚Ǿ¶/ijj¢´´”ÊÊJŸˆ[^^ùùùMP–$‰Ê²ØÍž];¨©ª”ŽÅU+.cîÜ©K­_ljå­;©o¸ÈÚk=·À1 (I}+1Jü·ß¢ÝNöœ)Ç*ÖL€(„ÇýûÅ?´}Dÿ$  >ï2­YÖwÀØù£¯í ===TUUù¸5Ö_ hÿnØÃÉãG˜ÇK柗‰Ø×Åh¶H¼ûÞNÒ² ùæwèÑq¬8Ï ª[ðí·Þ¢½­ßØ}º g @6«â·ýã/mCÍ? €ø›¯í ²,S[[Kii)^‰[LL 999deey,n];LѾݜ‹À |íÕWàÓâó ÷— ‚€Yc ÀX‘š:/¢;ܤƒÀgüÉ×ö{q+))¡¹¹Ùã}ùjœº;Ø»ý}¯¼ü²C!Ð'ÇÏ €P!dÂÖמñü'óÚ™´(\ªëh/9æUÛ®$I>SÙ>`—|ù¥—,€ÇÎÚ €"jIœ¸}ó M£rb£È%/Ÿ~ú)ûöísxN­V“‘‘aóµÇãn _,_Û›qêÎØSŸ4i’Oç6 üû‹/:ÀÇGÏ ¬ À˜‘•¦Uiõà½<õÔS­žƒ1qâDÛÅ“šš:&ƒBœù¢øÚÐ_Peµjkk=ÞWDD™™™äååQPPàõÜ瀠$I¼ð Y€Žœ@°«P™å¤ß~y` ¤Ÿ˜—ª•#zÁ{xþùçÝ ÄEDDØš}rrrÆ%ðè¾¶3ííí6·§ªªÊë•—¦M›Æ´iÓ=DÛ«2€÷PZZÊ›o¾éQž^¥R‘‘‘a³œWæ+ÍדÉDEE…M øì³Ï:ÀûE'q•YJÞ±%(cüym»²`»/Àû ÈÝ‘Ýöør!POñg_Ût:m ÷ŠŠŠã ÷ÜsW3¬ðÌ3Ï8”o?xè+²Š€:$å³Í/z^Ô1N¦\y¥Z[Ójß €=¾êþó— ¾žžÛT^^î“@¢'K—ùI’¨®®¦¬¬Œ’’Z[«pSSS¹ë®»¼únX­€§Ÿ~ÚAÞ;P 8 €,ªR?ë•z6N¦p‹J›{Î £+ÎØwÿyãkûC+°$IÔÕÕÙ,w–.sƉmmm67!!! øä}•$‰¿>ý´C`Û~¥Í~Ì8*uPÆŽñ{|åkÛWðWà § UWW{‰O×ǗȲÌ_ÿúW‡À»ûŽv•€Èi{¶üóÂx§§¨ jsgZ`üÀ_ ±¼¹³Ô—/ñ•¸Y]O–.ó'þüç?;¸[÷Aƒ0†ÚÜ™ø‡8ã+W!""¶RÑx¹ ¾7û¿g¼[ñgزç`/2ò¤}ïn®¯sôÿºrÜ@›;Sÿ{FÃU¯fP"ñååå”––º½t™=¢(’šš:®DWq€wv Œ%"öŒ†«0žÍ>Ö)HÖU޽ $Z]Ÿ±\lÅœËÅÿ½«ì¦ ‚€,Ié¶¿åyžuœŒ+gÜ ûËcd|5SÐrôà»qêþHt€·wÝ0AÌšŒ¢ÿY3ާé, ¸"{ÉÀ ` þ·&šÙlv(õ´ØÞ´vwU`_b§nµ<-¨ò‡ gx볃@¶X2Š>|'(cE_@tU¶Úý?Ȧ³€¸Ñ:I/°oö¦‚ÏŒú8ugø×§ú\»™€fuæá7WúÉø˜KRœIF± &y€ÿxŸ ¾ ¼ùÃ\èw}*++½ú{¬QëÊK£eíüéOr˜òüæ'ûíbôYš Œ%ÚÜ™f@å °'E¬îÂøÄÚ‡Æ~üøÙ³g=vü¡œÀ`0ØÄÍ_×et€Í;ö I­Ê:úÞ[U>;èÈ`Ô¾{`ŠÌèûÙŸÞ0Y–mbPZZêÕ\€¤¤$òòò˜5kÖ¸µ5˲L}}½-ØØèysÝâÅ‹¹òÊ+}r^ÎðÆÇ{² kÔ)þ sÏzvÝ<@Mßc;@´ÃGûF@222ÈÈÈ`åÊ•´µµ9”óº…oll¤±±‘°iÓ&233GñÌGRSSIMMeùòåtuu9tÿ™L&—÷µwï^fÏž=*b6XK²,Iþtop™@€1§ (ê{ˆ@ý±(r‹‹cáÂ…,\¸ÐfZ—””PVV†^¯wif³™Ý»w‹8ÍìÙ³™={6f³™êêj›µc_˜3ÝÝÝ>ç ^V–3¶C@’,AcFÝ (ï{$à_iÆÐÐP¦NÊÔ©SÝ!æiPn4Q«Õää䓓Ú5khnn¶‰AmmíkG«Õú4`ÏàCIòú÷ï©7Œ«8Ó‚Rk°ÿK3 ‚@zz:ééé¬X±bÄοÂÂÂq:S×ILL$11‘Ë/¿œÞÞ^[ ±¹¹­VËŠ+F­šP¹þ¬IH À(`Îõ=ÞB±¬DH3ÆÆÆ²`Á,X`s¬vòóó™1cÆ8Ÿ¡{„……ÙŽ\€A h’`gßÃßÒŒö®B×è;Zc‹`â£8Ú÷°¦­bM ÞG.-`lqŽÃ"öiÆ(`*þ“f 28ý `ýäÕO À‘nü;Íx©2r0{d䀕].Í8û¥KƒX‘e{‘ý²ÝÜW„ÑudC#Uÿz›šŸpñäy:+k1ÌȨ ›0‘ˆ”tâ g2aÖl’—¯$iòè䜭ا5@þ“f¼Ôp€¾ç‚À˜3* ë9ùð9ô§7èî¼ôÔØÑBgé>ÿ3}Ï…LšFæ†È¿uÙËg"Žâ×Á„§¿è €€¼öÀŸÓ{üŸlYûU{Ü~­±ö4%9MÉ_~&m6Ó¾ù…”™Ý%ûIDATß¼“¸øÑŸÎcŸf òQÄ`:3êG¿ô°Ådûç³ P]|ìÙó¿¼¼à+]üΘêŽqü¿îçÕä4>øþïik»ÒZpø'ð3à ` J,!àÓ&~‚,+"àð4A[Ÿ}ŸÍ[xcÕè5y6¾{(dS çÿ}þ‘šÇç|Ë_Ö4ãÇÀ€Ÿ/×Zƒ‚À`•€ò€‡ÿëŸp…ÝÐd3{VÞCW¯g9]Aê­áØÜÀ óo£®ÖóÞÒR€ô ðcQøE$‚¸Ž$IŠ€ŒdÀt.ù€nçŸnyC ?ò:ÿÎÛÃÂî`Á crÌ¡pN3Æ£M¦¡Ä‚ Î`…@J €OÞùÃw¿î‹Ý¸Œd¨eÿ3èøï÷Xõ½Uczìáheð4ãLq¸”Ìd› 0¦(õ^ai{ŸãÕnÎÔ’7~“Y÷ÜFÒÌ<4 }]M÷RµåMÊ>:„EáÄdg¾¿ƒþC®ýéjÏÿ€Q"˜f«‚ ü˜!€¯/èz÷q·’ ‚ZË‚7öqÙFǶӈ”4æ_Á”~„©ºˆcþ”ƒÏŒ4¾Ëÿk ïGdÝwxtþc…}š1(àÒN3ʲÜáÓ·"Ü<–¹î Gÿ=§_~›®N×\‰ð¼¹¤_u×\OÞúÅhF³{‰ÁÓŒ“BÀ3i?”‘€Ž_¿€¼ú¹„]Ùâ†ÿ?u7‡`ææŸ¸¥ë üžÏZħ^wùâЗáüÓOðñõWð·„\ÞàgT›¥í¬iÆ-À¯€_ÿê{Î·ÅØ¾aÐR`å‡` `ñê]T®¯9~™÷‹N†d>ÀœÌ‘Íîú‡¾†y¤:@6Ö±se>=ö*³ë+ †¥½‚’¿ü’­—eòÊʯpöãÓ^íÏ]¬iƧ€gP,×%zŒ±ë°Š€ëkù,^!¨]_ S“ëºX GácsGÜÆÒ±‡=ÇFXãOÒñùòyï¬óÉyÙÓöé«|´z:/.º•ò#®»I¾"ÒŒ2Ü ÀàÝ%„¦¢víÏ£}3€+ꚺ´]Ùÿ{oØß×üh9Ç÷{¾p¦+tíß̶“ØòÀïèì½F©‘*Íè}Ó¶ëØ›ø²ó…OÐ'¼mIц¸´¥lôÎĶ¢Š¿†„ȑŤçðO1 á˜Þ`ëÿñÉùŒˆd¢ê/òʤœÜY;6Çû4ãO¿4ã€" 1<¶¯ X|ð™gÆ»6xÛÒÔëí¡lLMŠqÙPÇ‘ªÁ{JïüþȽ>ÆÒvŒOWæòÁ#¯ùLƒ¡°¦·£Á/£„ëÕbá÷ÇÒä4 ×$] O¶¸ñtçˆÛ¸Jâ´(yeÛê-5\öÝéÏIúóìüä‚GÇ#’I]±”ø¼I¨CÀØÒHûéS4:É• ¢däü/nǸlV¦ ¾¹ “‹F5öׂýÊÍ£f”Á*‚€ Ë äõ¸ ×’sç\xòÔˆÛé÷W‹¼<šBha,¼[5âvÿ8Nг÷AŒ÷Ü!$…ÙO<É‚6:HÌC6¶raëœ~ö9J><<¢ua1 }|SÃs<3å÷¤]}-Ù6½~-Ú1˜‰8à<èïfÜ‚÷+7ÚÜwáÛDÀÛ“'.i lÆÏQ¹Pcºð¦·‡²¡NqÍí0Õ|8๖'ÜóýUQ³¸æôY®øÎMƒ^üBH4ds´Ñ¡Ä¼ÅV@0 ÐLûÝ’‘7’Íì?Úä“ãÉ=® ‰¤?; àVÙêú½K»á%fÍñ¬€)tÊjV¼š›ž{ˆÈßÿè-?ÂÙÿ{”í«ðŒ6ßz?Ç_ÞJg먇í|Šý…oMšŒY ÈàÙ^ÿ”K_òÚï Ÿ›wSµ‹CAe ½Ý”bÙÔ@·‹ÍKsŸÚàî© õÞÇùʉ·HK9sá.’®žšÍc××Ù\…}¿ûK[|~,oj*°S6 èŒ1>!4‹µ_›<âvú¢ïÐÐå}ϾáÈÈYÛ¶f»ƒë³{UÚENòMõbHÁuÜpî 3Fq2`Ÿ«pèÁûy=?‘ç®aÿ^¡Ãg$ H(,>#ù7Ï®Þ -:>úîG^«¦Äõ wûtšlq½ö-$ç[nÓHˆQÓXsø8Óç¹^>í ]G?¢è?ïàåÄd¶ÞûêΜ6ª”À`©¢/gÃOGžË×þ÷[8SáEM€¹Sõ®¯ n¹]O§…/Ësç¬\B™ÄŠ=G˜œîËÂds•/<Î[S'òö]ÓtÑwYnÇ0¸-ÌŒ1>^xâOß%kÄñ]zv.½“n£gýñ]îÜò,1dˆâ›Aëö¹¹‚šÎÔiã°±d¢ö¥Çx##=ñÞ ó5A `|ðé».¨X³ó¨G¨b3սëD¯Ùýßúê[.o«ŠYîx~¡“†Ìå;#Æù¦yÉß uy` ÿ¸ågè‡)H â:,>'tò}Üô?GÜN·ë÷¼²ä^šZ\O_évüˆ}ÇGhóµC“u­Ó3©1.ºÿ¿8’þç™}ÏFb&¸VeOË›¿äÕ%÷Óã£&-ŸÌŒ5¾[Ôž‰ßýWÝ=cÄíô_äÌìýË»˜Fèé=þ*o®ÿ_·Î#æ¾™žËMv-gªËfYψZwKŸ‹;;ùʾí,yèëLta`Š}Ñsüóê_ŒI'^ ›ø#À0zŸÊ´ç±øæ‘×î“t¥~`ϦÍⓇ~GÕîãí*õåÇ(~ø^š'n.>:óºŒÏ%Þ:ð¹Á0›µ}‚ &îòuÌ}ü¯lªhá–·ž$-3Ú¥—ê>y”­<1Ê'øÅ&€`Å_eÞëÇXrû,—677žàÔodËÒÙ<Æ3 x&:Œgsç°ó±ÝÙ¥™ø% 1c¾²Ö¥×ëïwëx~ƒ &yã·ÙXR¼5“\zIõƒWÓ:ŽKl]€/b8s_=ÊÕoT–~rÙŒ¡µC·çå­ézlÐçC2LTèÈU‹æú¿úMß¾'š$mÙëRÌC6ÔñÑÿœƒ³úbÈàòW<ÈÄ“ÑÍy¾Åïýx§y‹:i«oÌü—ªh®X’2â>¤Þ*Ž×¸¹è©Ÿ!„¦³âÑÙ.mÛúŽê¹cþˆuS€ï£L޹XŒ{‹ZƬû·ÕcáËܳÜE gñŽ¿2L*2ýÿ¾âÒ®N?:FcÃF‘è›nui;sóÛ>)ÓöuÐðwBP†BÜüeùªëP¦ÇŒôé©´S¹ìï;¹ëó×(Xžïû“¦?{YÓ‡/´ ›þ+r'ŽP°tüãkŸ+£æ»¼íÙFÿÏ|ø#+>(NVÿ2~ú`0Üå½dk?;ÏŸ¾ÆŒK\(2‚&žù¯cå=#§Adéß®q+I_Ê{ pߨâzÙu{ÙØ¸<_4o pÀÇE$0¸E ~\?ì½ò6V¼µ›û«qÕ?!cAžGîAüš¯qÙJÝ>0ï?ÑþNAÚÈ5ù o ÁÕ‚ÆýÁãGˆT+ÿåòþ$7вÜÅ¥@€fv&àh¢Šé}«QÖµ;‹2cî4ŽSgÕi3™öƒ™LûÁ¯07–P»c5;÷Ò|ü8-'Ï¢×9^€‚&íô¹Lºj5ùwÞGúÌd÷OPаü½‡)™ýа_N©·šmWÿ‚{vÿŠQ^úÏm.ÜsûV²m~`Öµk‰I ³ý^65qàöw\ÞŸ76AÚ/, 7õ[|õö[X4.q±î„ö\'%p¸eàd9Šœì—çP'å“u{>Y·Ãöœ¹³}S’ ¢ ‹&"%Ñ'cØÌ±îîØþÂÙa·ëÙûkÞzp7ÿîïêc¤žjþõ5ÿzŽ]‚š˜Â$NËE£2вk;M5Ý.ï+.tW;þ¢° ÀvY&ëã]{"?Þ¥ÌÏ‹ŽŒàŽ[oä¦k×R8u ¡¡¾¿+hP&ÌNF ¶ ˆÁIà ·Tkã‰ÖŽÎ0ܧw’ûQ.eµÃ_(õOld[Ô®ý™÷S‚F ÙLGñ>:Š÷¹ÿZ1ŒÙ“\«5Ôél  £¬ø‡j1<¸ eúso—®‡?¿ð WÝ|§/àšÛïåõw¶ÑpÑ7óü#Å2¸ø-ž¥=EÐLdÍÁ7ˆ ¹û¯üç×±ùÞßÑëåB¢þHä$&Ìw³ /%Öh-=Ð ¼¼”8yr´ÉvŒt#°힃‡Ùsð0q±1Üyël¼f …S P«}ÿ§[ÓŒÖX~=p ÅB(Á7ÓhQ§\ÍÍ»~ÏK‹¾‹q„‹»á…ùûÎ÷Yö·§™ºrR™ã€–ɪÝ9Þ§°¬àLó¹s]eÇ_ï,;±©³ìDœ€<_‡ÚÚ;øã3/på _"aÊ<®½ý«¼õÞ´´Þ¸)kšñ[À¯p-Íè áó¿Í—·ýÊ¥yÆòOùøª^]õeNoÝ;¡lå•þSa¨N^ÈU{“a< âm ƒÔQvâ0ÊÅÿHLAaŽl6 °Xhv<ÄHMNâžÛnfÚ•äå }¯‹Ö4ãK %np¨ÅûΦ¨5ñåÃxãêÒm¹9¦uÇ?رã|ŸCæúkH_¹œ‰³f›3‰0­"QÆæ tž?EÃÞÏ©Üò6•»O1i{9Yãäo‹Â’&?k>×obÆW7®ñ“{˜˜‹äI{ƒvÒôx!L¼J–… (q<w]EÖ­XÆ›ndÉ‚¹h£GÿËÞ…@<Õ÷¯7“ï²ué&.4x^'¨Õ`± šbL¿šÖ¦ú:Síó×t×–@Ï:pœYû¨Øº•òH·nø¹úbh*…¿yš¥ÿ±Þë/íã(‚ì*¿þõ¯m?K’Ì/¾1p#E¥Å׆é'ò9vtÖžjí(=±¹³¬øÎÎ²É ²,,•á·ÀyI’xoÇgÜvÿwHŸs3–¯ãO¿@Yeõ¨5…D Q\„_¡¸ «ðlQ˼õl,?Á‚[çx|>²Ù<ê 0ª¨426}导ËÝí¹îÙG™8ôt Épãÿ¹WoxØa\zï¸äÀ‘Í–®òã»»J?ÔYV<‘ËAþ%p„>«¼¦®žŸ?ñæ®Ú@”¹ÜýòÙžtë\ŸîëÖ4ãuÀOŸ£ô.ÌÀuM Ïáò×pË«¿&1ÁÿýcAKæWæÖêSÌZ1üðÓ¶wãëþ 7×HõW…088ð‘:KŠt–øYgYñ< –DAo•ž,‰·ßûëﺟ´Y‹Y¸n#{ùŸÔÔÕÚÓ>Íøë`9àÊÜßäÛÌmu¥,ûáí„ûp‰¯ÑB Ïfé‡ÅL)þ¯ëÞñk6wë•y™MP†Àê*t•ÿzgÙäINYà\i9?øÅãÌX¾Ž¤é ø?y„ý‡¢ïùõ!(ÖÁMÀ£ôw3NfèRMcÖï^垆“,{ð.bbü»dVPÇsågÏ2BF£é©^}Ç¥BP\b³¥£ìÄáÎÒâG:ËŠç[$)¸ „Í(1< F/½ñ6k7ÝMòŒË¸rãí¼ò¯w¸ÐÐ8jdƒ¥ƒŪâ¦0ë7/rgs×½øyWÍõI'ãh I¹‰«ïa&£láе÷ŒØP4f›.t'é+@"++,FŒ¾BÅUòõÈL8zâßzðgDE„s禛”åiS ñý]Øå4£:ŽÌ»~@æ]?ÀÒRJåÖíÔ~¶“º;i©t}lùh3é^!äù…Ã7™›¶±í/gØøíicxf_,Rµü§šƒe(–»‹Ìã¾;6±ì²$&Œâ¢›}¸šf4^¨ ­¼‚®ª*ºjê•@› "j‰ÌÌ!&/Øé“ Üpt' ˜{ª™k¦ ¿|yéõÙlßR9ì6bätîn-&rˆs wÒ€²,óøãÛþ/É2O¼00 (#-é*;¹×å“ð‚€é8¢ø#ðǤ™3#{zX‰,¬×©{‹³·¨¿Dù¾/oâºu«˜Z‡Zåû`5͸Å:¨¤ß:h°Û.$5›¤Ôl’®ðù)xDæ_­÷ ;úAÒâƒgÏqãSÇîÄ%8,ˆÅź®Òâ­J ±8]@ž/ÈòCÀú¬ò¶ö~÷Ô3\±áV&Ïå¦{¾ÉÖwÐÚîú*Âî ¢Œ@»ø ž¥Ç MÊ]\>}d ©áÇ÷a–ü$`øÛgþEƾ<ù·1“gfËfùZ®®Â>þ|/®X’¶åµW197qJ”­iÆÅ€¨@± Š6ŸÍ}f¼xûçÿ~Øm,{ølW=«®L£³úâ´Æ‰ŽsÅe'þÔYV|ugz|tE¢|ںͅ†F~õ‡§¸üêI˜2/}ý»lÿd']Ý®Êpû4ã/pL3ºâ˜ˆ1˘qÛ:¢|˜j Ÿ÷yFnŸ*¿ÿ)ŸóR" ý–/:1…9XX% ÂdVVÈÈHKá«·+±ƒìŒI£;®èAik¶?v\§¤§i×TnÝJÅ»ïÒxþâ€M\ Zéxã:^Ú4ráϪún¦º°~b0ØOPüœÔÔy]¦«…õ _#À€5³T*‘ëÖ®âžÛnfþìB"#|Ýp숌’Z´ŠAÃw3êϤ¢O ªwÇ,Én æV^M¦u„†¡˜›·rçæõ#îÎ$™ßü&(Aü„¨¼YÓU’´^„ À"qã r³¹ÿ+·±vå2ÒSSFÝ:°O3žôÃl+uÖPóÞ6ô+ïdŠ ëX¹øð\^ìè°Ûš ÜÑY?ât ·@–ù`‘$þûÅͶ“yqWé æ™/A`âsg¤[P]##_ƒÌU¿×áá|éÆë¸iýZæÍœAXèÈëíyƒ}šñPã«ýêŽñlì¼ZM}ê47tÏøÍo~cûP‚ø)·¨brÏÎFî‹(ýŸïœÂéܵé&®^¹Œä‰Fý¬ì‡¦žC™ªì)e7æðÞÛÃn£Š_Ç7š·;yy4 Pçà JTÞœ *ÌWö >Y Xs,*"œM¯ã+7]GáÔ)h4£›¶ŽT÷4Íhn|•¿¦Ü1bçå¬CY6ohq¹¼³¤ø€‹»õ‚pI X}Y…õÀ\ùìçÍœÁ7ïþ2+¯XDBüðkú‚”µN¥ ©>G—ç°{×ðV@ø¬ßñµcC—$ Ÿ \‚DåΜ(*““׃¼šAÆ ÄÅÆðµÛoåÆk×R—3*%Êö¸“fì9w@É*lÝJõîXœ«뛺Ébʨ€$\ÖYqü ‹»õ‚pÉãšu°jébîùÒÍ,Y8ÔV`²âNšÑÒ^MÍ6E *·JwßZˆq_û„¯ümÅ ¯ @?Aâ@döŒ$•(®í³Ö0È'©IIÜ}ÛMÜpõjòr²Feв=Ý(k2Ž˜f”zhúì}*¶n¥ê£\{ä ƒt ŽŠÈâÂÎòcE.îÖo @¡¹òJutuÛ刬dyƒX*•Èš+—rϦ›Y¼p.ÑQ#¯Zì î¤%™A³Aè'Ø dh>ûÌÜ»QÄfÍÎ’U–52â*Ö‚ µX$¶ïØÉö;Ș”Ê7îü2Ö¬`RjŠÏ˜¬ÝŒ9}ÿ·¦[¹y, æ¨â Ä3Zóœ7Q©Dn^5wßv3§M%*rtK”]M3ކ Ïïëö (‚@Ïp²b&ÏÌÆ,¯V¬ym±H¼þÎ6^g3¦pß—7±réâQ)Q¶_¹ù&øt|º €Ô¤‰Ü{û-\¿v9Y™¨Õc¸ ªÙ´‚+"³¦'«Tª5Cõ,XK”¿ú¥[¸lÞl´ÑÑCìix\µT’4«­âd±GG‚@€DWyªëúŒƒt4Z,’`_¢œžšÂ×ï¼ k®"=-Õ(·7 A ÈލܙU‚¼|¨iHj•ЛםãîÛnfÆÔ‚a˜\µ,²}7v—\ÅÏ @K1&·pNŸu° XŽÒS€ ,˜=“¢cŃ"xWFþu Ž·€ AúˆÌšž,ªÄuÂ:V#3ØÒÄfß’‘ÿˆ+9€ A† ¦ 0G6 XL®€ü´E^DS(þ?· ›ßXJIEND®B`‚gImageReader-3.2.3/data/icons/48x48/000077500000000000000000000000001312567024200166605ustar00rootroot00000000000000gImageReader-3.2.3/data/icons/48x48/gimagereader.png000066400000000000000000000066671312567024200220210ustar00rootroot00000000000000‰PNG  IHDR00Wù‡bKGDÿÿÿ ½§“ lIDAThÕ™}t”ÕÇ?Ï3ï“—Éd&™0 $“Ì$$ä… AP)hŪxvk«®Öv B]=v‹Z»xJ×SeOYuëÖº[¨/ˆŠbYb”‘ ˜&™¼’7’L&É$™ÌÛ3wÿb((Úî÷œçœ™ûÜû»¿ÏýÝß}ž{‰Z°ì¶+¾5ÞÖÁ¡HgÿÀvIð–18X¹mÛ6%VÛoBR¬ o¾mí¡]o<;66†ÇÓ»±‘•Ÿ„»ûj}#/ë ò››ó›ß„³çRL€²ëo]sdÏÎçÎ.‹F£ ù|tuuñIU µ žá@è­h”×ãÕû·­_úú\ž¬˜Å×|gMMÅ;ϯN ¤··‡†Æ&ŽÖ|9BÚ¬ª]O¯ÿ—ŽKçîTÅȽòú5õí™ÐÒÑÏèh× dy² !>Ÿ¶'¨­«§®©µ;*±S­Ó½9è۷jÕªð7 ]víýMGÞþì²w?øœ/V Óª)3“…ó,(ÍÂjŽŸÒ> ÑØÜD}½›æŽŽÑ`8òοÅMؽvíí#)€:V…pôÏX0ápU ‡«ZÈLOfá< KÌÉ$IètZòrs±Ûí”xâš›[nîèê¼Ù;æ«}þù—­YsçÀ× „ÅtµuziëôòÚ®c$%(+Îdá<—ebÐ뉋‹#=ÝÎÈØ6›vNmSû„·J’4í>. ŒL1>¦¨È¼|>cƒ vuòûÏÜ”ƒ¾1ö¬cïÁ:T*™üó 3˜•„99™4K2}ž[žþÏß?üêbbæ€uö¼÷}yì…³Ëvî«§ª$%B8"H1Œ‘žnA’%öí¡ö£#pž1ÍÍJàŸt * ^Ùµ'¤Òjæ¯[ýÚ‹/¦‘V¤Êƒx::¨|ïí«eïîOq{õèmRÎó¶÷ Œ©©©\YR  ¶¼ð š¯ zޱŒ(ÐÐA›`Æ–iÇj‰ÇéJAê‚éùy{ yes±¦Ï˜bÓœaG¥R¡Óé(,ÈÇ’WtÒyäbbæ€N)‹K4°rYÝ'}´XõŒ†d¼A¤'=;f|0•€F<ÞÁ™ø|c4VG$ÆßÛ…J%£R©HLLäÛW/äåïþ|ý¦ßîXÿO«¿¸¤ç’*¾lð’acaij•L0¤ÐÕ3ÌèX¾ž²¤1#žÔ~¡§±GÐÝÒŽ¬5`ÔzÐh´ã¨ÕØívæçk?>^÷œâÚ Y•¦0ŘV«aNÒfzÙø:d¤j¹j®•Ô5x5s\fú½côö890Llj&Tñf–¬øƒ/Jo jµ Y–1 Ì›[BM{ÉÏžþ÷UÀo§ pQILx˜O?ñázJS{I ÔÒS¹ƒÎ#ÿKKÃIÞ­èæ³º¼ƒaâtŸ›ŠÕÁ×ÖLWsrx •JuÆ YÆl6sÃâ«„‚O?¾acút]™ÆƒLLI_g5µïoa(·”M/ÊŒ9˜õ ôù \™êff¼Ö+ûÚ3ii•Œ_æ$èó£ÕôÑ^œ-o—“•žÆ¬©ä92Ðiµd;Ìž•žP×Öý ð½Kp.I(ŒÃt5Õà&ª ;ÝŠËi’„ݪan-=r"¹Ù<~Š™ôÜ L–Åô´7ÓRYM(– Æl61kF…ùùÔŸè¼ãá_üÛ–O<¶;¶/1”]ô_Óñ—Î.«>ôz•–ÖLF ‘(hµZ2fÚijlC§UŒ òs …BÌ.È!%-{š‘ý­&NãH1iòô¥ï㋺úú½ƒ!ì)IœùªŠ­_¿~ê2x–Tç»  3ÛJ}ðþ[Oÿ¤eä`µ¦b‰W“ž–B‚)‰Î®“¨Õ*LI&A£–i;ÑEsk7ÇŽ}I[k'QE!;=‰Ë3ƒˆ¨ Ã«!-ÙÄÍWæ1'×EZŠ…H$ÂÉ^RTIQäÊ#>l<Ÿ<…¶mÛÆèè(.—‹‚Eß'##ƒîv7Éö”—ïBV‚äåºÕ*ú0è4ø"¼^Ýú.¯m}³ÅLaQ!£"Q| Z­ £ÑÀ¬ ;½›%‰Ž# (i±ü‰ M^Fï¾ûn†††hnn¦ªªŠ;wb³ÙÈÊ*âgO݆$Â|þéÇt¶Õ’—%àF–eT*¨ww‘7'ŸOŽgÏŸ>À`4ÐÝÚÄí×=V«Åh0’˜”€QG"1Ý»àtwwc6›)--¥´´”H$B{{;¼úê«È²ŒËåbÁuw’šbåËÏŽòi徬9J$¥¡¾‰d“ž@ ÀèˆË©áѨÕ z‚!F£EQboÞ¦0ù©X]]M]]©©©8NœN'‡‡ÃÁÒ¥KÄívsøðaº»»ÉÈÈ lñ-|ÿG3èíãðÁ¨úäctCaLI*tò™‚£Á@D‰ _€Éºé¦›¸ñÆéééÁívóÖ[o1<<ŒÃáÀår‘““CYYeeeŒÑÚÚJkk+ >>‡ÃÁꇗ"åøÑýø†G'l«d½^Á` ¢(„BÁ˜«dLé+¯uuu$''“––FZZ‹-šÈ‰ºº:öìÙƒÍfÃét’——G~~>ùùù“ ÷îÝ;]\v9Á`N€V£A¯×¡(Q¡¯!^¯—ýû÷‡'¦Pffæ9sbóæÍ9qºÞih¯×‹Ûí¦ªªŠ÷Þ{»îº‹ÔÔT$IB«ÑUÂÓ˜B1C”è,¹{È]½ù«å£££477ÓØØHKK V«—ËEnn.‹e¢^__¸Ýn¼^/™™™8N\.z½€H$‚J¥B’ÆÝéééå¡Çÿ•Ž>ï¾ýúK_íûlM;}À1`ÄÅÅQTTDQQÑŸ]‰NzJJ .Äï÷ÓÖÖ†Ûí¦¼¼‹Å‚ËåÂáp–vfÉ—$P”(¡Pä/ÏÓò»O]F ïÔU$ªÕ+Ñu×]Gww7n·›ŠŠ B¡«V­B–eŒFãDN„ÃaZ[[illdûöí¬X±›Í6Ñßt§ÐEíÙïóñiF²,“qŒC’°ÛíØív/^L8F–§¾µk4\..—kj’D$zé&ɽu+{ï½% Înç²uë<@;P$³OÁÌ š‹Ú«_ÂD£“"pèÑGQ–ïÞÚ`àåËéèàª_í Ÿœºd ‹q˜9ÀÔíý¹%q:”K—§åkmEk2‘yÓM®^MÕ3ÏÏ=$ …àà z‹…f x°pfªÍŽÑy4%¬ÄŽÀt¶”“" 3™ÎšÓÖ’D4JãoÐQQÁïív~gµòbJ úSýýô‡€ÿÖÏç:U¢QÂáØ.xO<ãê«  0Ò1~ì/«ÇÇq¸­ €×®e¬·—6ð÷ûö¡ƒ”ßwá‘6çä°ÿÁi//'¨(ÔoO÷éN$‰h4Šržƒå‹({üqTZ-5›6p²²£Í†PP”=öÉ,~öYJ~ò†š›ù⥗8´nÈÉ¡iûv¢@+Ð~ÚÆ¿3„§‘Ó˜ü6š¶`Ëvì á•WØZVÆñgŸE¥Õâºã$• ½Å‚¬V#Ä™f3—.ø­·XøîÑ£d-[Æî•+éÜ·ï<}_Â)4¸(ò—-ãš›™ÿÄ,Ú¸‘;ª«±0ë†ù|xª«Ïkϱ|9AýÿxŽ»1~B±Udéø»v7_Uv™c¾-UºBߢuhµÔ/_Îç@ g2ýŠ'Ÿ¤õw8úÔS\¿e *½Ί† 2ÚÕ…÷‹ñDé9iúþ_ˆVª²K®~è‰_lýðàÇ#>ß°8­a!ħBˆÍBˆG„ß«®I.—°‹¢5kDÁ}÷‰ÕÃÃ*­VhM&“Ó)V>,B< „xÿ”½>G\»|…0åýøkA0åe_¾ôÖÇ^|ùµÖ–¶v¡(ŠBEÑ$„Ø©(âž;Ä܇ßÚ´i !3S¬ …DÑš5ÂRX(þÑã™àù&&ÁÌ*2›œE+ï䉊‰ŒŒŽNDÇ#„øHñb$"–üú×"ï®»ÄBˆûý~?s¦È»óο>À$eeé%7,ºå»ÿ½åõ7}íÑ !ê„o!~.„X¶}»Ð''‹Û++ÿ†¾¢8G¡-­hÁ½6þGÕ‘cUʨß?):åá°ØÐÑ!šÐ  dÕ_ÛÿÉZ²D]rõßýàþ—^ßùŽ·«û¤ˆF£B!†„}§úûÿV¾"S^±cæÜ+×<½é…šêÏj£~ÿØÿ/€³eξÌdr¯xdý/÷=÷»ÿñ§]q(ÞU˜«Ýÿ?ÞrtXrrIEND®B`‚gImageReader-3.2.3/data/icons/angle.png000066400000000000000000000013241312567024200176550ustar00rootroot00000000000000‰PNG  IHDRóÿabKGDÿÿÿ ½§“‰IDAT8RMKQ½oÞ›—Q3ik-IЊ 1ŠY„P®E]T²nºi þ‡6 WîºèA7E\#d!t‘ÑT ¶¤†´éP“4$“÷n7&´V[ïî~œË¹ç€[F<ç×ÕÉÿ€Édò¾”ò"&¥”Ó4ï+7çææX"‘x!¥ü¨ëºÛãñ¬BÖod°µµUCD X,B.—ƒ¡¡!‡Ã000ívvvv Àðððùòòò ë.@DRZÚßß×[­[XX(ƒÁSÎù7ÆX‘1ö¥R©ôíîî®ú|¾Ñ.Ž] t'›ÍÂÙÙ™/6"‘H™sÞ”RªBNqQJ]‹‹‹Ÿöööóù|obF¨¿¿ÿÀ0Œv8n_jÃQ.!„†ˆÚÒÒÒÛ|>†ax»"z(¥Z,·Û B©‚I)U)%GD"jRʾX,VJi €Z–U˜™™‰ !###H)„¡(JGQ” BÈ´(¥ JiCÓ´z­VKyƒÁà{ Ùl¾ÌårP­V‰‚^epy††ˆ}¥RéÞññ1€¦(ŠÞ{c*•ÂF£!çççÛªª¶8çuUU«ªªþPUõ;¥ôëöööèÁÁÁã±±±»'''LÓ´{Fš˜˜Û¶±P(P!ít:=–eù×ÖÖžX–õpzzúi(Ó4í?|Àû999©§Óiðù|îN§ã.—ËÞt: ¶mÃÔÔøý~/¼#„œÿåÄn¾²²òavvö‘ã8õl6« !Þ8Žózss³~åÙ•Çy–Éd2œó´ã8Ï766>_ügÄãñÁÛÎþ¼&+ôŒ‚1cIEND®B`‚gImageReader-3.2.3/data/icons/angle.svg000066400000000000000000000115471312567024200177000ustar00rootroot00000000000000 image/svg+xml gImageReader-3.2.3/data/icons/autolayout.png000066400000000000000000000021351312567024200207760ustar00rootroot00000000000000‰PNG  IHDRàw=øbKGDÿÿÿ ½§“IDATH‰••]hUÇ÷ÎìÎî&Ùhš¦mšjkú±¢F…D¤ ä把-JILó X1PT¢¡‚‚/¾XkÞlÅ'?`I+ ´¨PJ*6% ‘|µ›ÝMvgwgîø°»ÉfwðÀpgæÎýsþçž;‚íÍ”ûP¬óÀ`n`¸›™s²@Š(å”àU ¬UˆM@è†y/õΞ߮;Èíµ‘L倆^;ʃŸN²$z°²@ë§§#°Î¤T $ÍB cŒß¹ÆÝ¿®òï©NÄ"ùÕŸ }ñS ýÄA\_¶°;PÁQNˆÏ¹²)ƒ|ÂA8¶eâX&ÊN"Å\Ìã`|PÆãï5ˆ¦°ªü¸<p1N Åh.«À” …BY ìT 3b-¼€iFHZ6q åõ!½õèÞUô‡%@ Ã~æ<³›x›#M‚ áX$Ì0¡¥ –fGˆ®,€JN’BeB«vdîãJ±p vZQšLg KV"JxyŠ•åi±ÖOSQ‚_š{ià–ìzå Ï¥4 ¤–5—†a¸ÜnÜ/¾?½OŒðÉs3¸Њ:¨ß“—^盞cÔ®«[lSGA*ñY>«íããGû‡œ´žŒ23j9σ$Ô8£R£QôÓT0àÏ/v61Àh®ãØt”“ÉAÞÜëÁ£tð5’n; j”SĤ‰$‰!%~LÀM±8ßÄ[Íü"%M8x»ál#ø^"Ý×ÜÇâ £¸˜=¨ì¢}o]-œ÷¸yþÀn<ËQøg Âaß‚¿YÅæíÜæÊ—`[ël¥C“|zd¥.¸t­’ze¶!I)ŠÛ¢—î-SßÞÞÄ ._ìÃçu§ß-†QË•âg.‹Ë‡{97ÙͰ¹¿0r)"v0P¾¥ƒö&êt›uÕøË¼éw‘Ü›#ü#ÁòîŽ ¡è™­~îÂô?&dÁW@g;ukµ•”dáñŒÍw/G©)ñF£j9Ôï¶aE°ÊÏŽÊòt,Ffˆ9Ðuñ*7òפOß <Ó°[9k6—Ê=ªÙ‰  O³f;|ýý~(Ï=ò3Ø´M»Zèñ¸i~d%ÙâŒÏOX/öóQ.lså‘Å$êlá´&y¿®šR™¡O.‘ˆÆQIN“óÌ…ç^Åj t´ò´€ u5”èýîG°#„$m}˜E¥)yÑ „â)MndÃĦ£hî`~+i "Ï©Åz ë5qJH¾Û[‰wf™„R¼Ú÷;Á¢ðãCQ¥œÒbsYÓ¤XµƒÍ't{3õgZ™<ÓÂÙíÿûómn’O?hâIEND®B`‚gImageReader-3.2.3/data/icons/autolayout.svg000066400000000000000000000224471312567024200210210ustar00rootroot00000000000000 image/svg+xml gImageReader-3.2.3/data/icons/brightness.png000066400000000000000000000007751312567024200207500ustar00rootroot00000000000000‰PNG  IHDRóÿabKGDÿÿÿ ½§“²IDAT8…ÓOKÔaðÏoWÈab¿@oFxÛ× à%\!ƒèôz¢{·N :¸E™–J=lõ–Ø!©Õý­ÖÁu:ì©m``fžïÌ33Ï÷aˆD¦™•a˜~àû8”ÄDˆØ®4>D£U8׎§šæä”Š·µ“¼.õCYfV´pE窚 ÎTâ«)pÔVÄSS¾«Èdª»’q MEM;šfœy~{ç—5P÷\fFfÇOÅdZF:í%“j±k^ÞKœB²àVßø§6ä-%wÕþ¿Ø}‹Qñ%–íÅC ÿÂåâD)2uÇ"êÝg{‚iÜhÛâR<ñJÄg™•œ0:xu×ÏõE[vr{Ñÿ˱lØÉ@Ò®Tâ²ä¦;g•0f½ä~o‰Ý6ãPê’²¼YZ$‰×Jñ¦»“ÔUs®(Çjl9ˆš)9# òªò-’¸ì¶QKàš¢1Uã ®÷‘ âÄz‰øf»ŸÊ±%b«÷bUŸlÇžˆc{#„SyÎÍ'“}$™hkga jÆÌ·)i‘m¨DÝZÔ½†ùäÙÄb·îÚÏIEND®B`‚gImageReader-3.2.3/data/icons/brightness.svg000066400000000000000000000226051312567024200207570ustar00rootroot00000000000000 image/svg+xml gImageReader-3.2.3/data/icons/contrast.png000066400000000000000000000012011312567024200204160ustar00rootroot00000000000000‰PNG  IHDRóÿabKGDÿÿÿ ½§“6IDAT8’ÏkÓ`ÆŸ7oJ’.»6®0ZGŠÓB@¼¶^„ž&Š;‰¢=ÏûzQ†žŠxt€ÖK/"ö"ñÇAO…5n£¦°ÃhmóŽ$íÚ&ñbGm;ñ Ïá…çûáù>¼sfmmíœëº›®ë®,--Õ%Iú> Þ•ËekÚK'ù|~U’¤/†al^ît:(¥tqqñ¼ã8ÏUU]‘eùs»Ýîw¸‰å[ÕjugooOcŒÁqœçyÜÁÁÁûR©tm4% !¥ôÛòòò¥¿blll蚦y±XÌF£ÁXªªñxüñ¤W×õ»‰D”eY=I°»»[î÷û DEŒÅóüL?µZí%€7”Ò'À …”a)Qéäòi „<pÀž1v_„‘(Š3nß÷1gÍf³«(ÊGWyÛ¶W9ŽãDQœ1ƒ¹ ‚+<ð¿Úh4Þš¦™ŠD"£ããc~aaák*•ê0Æ2GGG¯»Ýîƒz½þë¤Ìy7®¯¯Ÿµ,k³×ë]ŒF£F8þÄ«T*gÚû2Úðœ'IEND®B`‚gImageReader-3.2.3/data/icons/contrast.svg000066400000000000000000000077711312567024200204530ustar00rootroot00000000000000 image/svg+xml gImageReader-3.2.3/data/icons/controls.png000066400000000000000000000015361312567024200204370ustar00rootroot00000000000000‰PNG  IHDRÄ´l;bKGDÿÿÿ ½§“IDAT8µÓÏoTUÆñϽm‡I;#-¥#tZBÔ@1±š(Ø€@c‹npA…btUؘþ̨k&n@â„!¸n˜°‰H­M]8Š•¡3Ó†ëtŽ‹òK‹ñINrß÷ÜóÍ›ç9‡ÿ °hOX´ç¡?MLLlÚ¾}û¥åÁÁÁÆò;wîühhh¨÷6¨ìh(;~—Pr=”T!ÌÉ„EgBÅQˆáðáÃc“““ßÏÎÎ>S©T⥥¥¨ÑhŒFQÔEÑ7«W¯~²ÅÞ­nŸ`*ÌÉÈKÉK‡ÏeÌ›R´»!ÊårñéÓ§o‹ÅD!†‚«W¯F0444Q(&J¥Ò‹á7½"Sþ4¬îk?Ø„`Æœ¬­².Ë‹6[ˆ¯]»ön­VKtuuÅ©TJ*•ú›E333'‘ÄŽ¨ßÆÕ]¤t9ä†Cº\qÁ¼ñh³ˆËåòx{{{¸½Œ€©—F¼•­Rð˜z½'å”E§\qLÁF …PR e£íÐÑÑ¥ÓéÛ¤ùùù{ÂÛÄè‘Ä­|š›ÚhU ‘¶¸§§g²^¯{ÈÄƾ:ïTÔ-åe³äÔÔí õr2f-ÉDk¤¢nSq__ß'KÕjµ‘N§Ý99lÙ²ånâ|¨Z‹I¶ jjNètB솬­7~´â\.×Ù[(B>Ÿ_n4`ÿþýûvíúG–——ßDœÔaX´Èk²ºeõè³×zÓú ësòö=>~üøÔèèèÓÉdrúâÅ‹d2â8þ2„P!¼P©T~ ç´;+2=¥`ƒš ®Go+ȳÆYÁ¹{Z©BÑžPü‡'}½‚o[küŽþø¯>Ê0¸¢y‡Cë»ëðK«WÆ¡âôŸEïõ<‡çÑ×êuãõ•NÜŸ‰×µ ùVoï¬LÓãK­u·Çï{DÿW½…ïð™fÛð¦·1² þYÓË*^nÕ |OQÔ ó¾j¸Úßį(`.k¸M3Ôk=ŽaG«N`ðßþ P“æH%|¤IEND®B`‚gImageReader-3.2.3/data/icons/controls.svg000066400000000000000000000425511312567024200204540ustar00rootroot00000000000000 image/svg+xml gImageReader-3.2.3/data/icons/filtering.png000066400000000000000000000005501312567024200205520ustar00rootroot00000000000000‰PNG  IHDRóÿabKGDÿÿÿ ½§“IDAT8ÓMJAàob¼IvºÔhÝ›Ü{‡¸\™K¸SüÁƒøsŒìB•I\Lw¦3$š‚MM½Çëªé5d8Ç&^UX™Ï1½DùÑ~ù 4°V",°j’ð­ mD>Ã).1ÄQ²ê=îÂYø6 ÚnÂϰWÒ•6ïÖ›– éà%ÔÉ_ÍÑÕ¥¨GÕWÅXx†èêM­9Ã#’Uã$µ\ùoOp• Îñ*} ×A;F¯©2뉰ÀO8§oá=h§˜Äøº¸UE¹ÿ »a\ÆÛE¶IEND®B`‚gImageReader-3.2.3/data/icons/filtering.svg000066400000000000000000000106351312567024200205720ustar00rootroot00000000000000 image/svg+xml gImageReader-3.2.3/data/icons/gimagereader.svg000066400000000000000000000755241312567024200212330ustar00rootroot00000000000000 image/svg+xml OCR gImageReader-3.2.3/data/icons/ins_append.png000066400000000000000000000006741312567024200207160ustar00rootroot00000000000000‰PNG  IHDRVÎŽWbKGDÿÿÿ ½§“qIDAT8­“¿JAÆwÔâRl,lL%bá ‚­­ø'´ðÔ¼),l´4&Q c#%·»—ËÝå,r1gLîBðƒe˜ùvf>f០ììn7ÚAÛˆOÔ¬³ÓBúù)€ZíÍÈ展¶m”²CÛñmeS)W ÙìBÃoû±‰º¦[ÕêóÐŽ´¿”D -N£P›i`n@x>´ï?åò9¤XB -!$¥Ç’´ `¦ï¡À5Šh³ \™HØÖ»AÜ8ŸŽN>pÞ Œ´G‘Ê÷À,ð,…]õöèàp%RÊŽU %%R*ÊOån(Ç¡5u”´G&k`hŽ(ÉPLô_h{ÅL#Høk1°N6êéÀçKËØÜÊãz-¯‰ë9áiâú®Û¤å‡~4æ9Ôl@øzõÆl¦ÇÕVÖ¦¾Œ5š®Öí•“NÎß<:ÒlÄ$7<IEND®B`‚gImageReader-3.2.3/data/icons/ins_append.svg000066400000000000000000000341771312567024200207360ustar00rootroot00000000000000 image/svg+xml gImageReader-3.2.3/data/icons/ins_cursor.png000066400000000000000000000012261312567024200207560ustar00rootroot00000000000000‰PNG  IHDRVÎŽWbKGDÿÿÿ ½§“KIDAT8­“?LSQÆ÷ùik[I¨2‚”ÄÅhX –I‹qÑÄø‘„EW£6jÄ͸ $2:°¹9 Rÿ`¼…wK_ûJ¯ƒ}õ_ ~ÉInrîù¾óœÿ àfßfI—BÕ>89Gii½=444V-ŸJ¥¦šššº €ÕÕ•ÐÙsgè9Õ͉öã´µµÒØxˆp8D:F"‘p2™ÜBð{ôöö"„¨0ÖRiûþÝU;B£ü~ÿÇŽŽŽ€ÖšÉÉÉB"‘¨›`}}ýÓ^íÀ~ uddäÞôôt6ëååå °*ÝzÕ°©kÌ@— —)‘1¦(ê.d!»ö²þ‹åöó ßÂ&€üP]¼>ˆ[ÌS(:¸Å|9Üí<ù|ùUÚ:ˆa˜>‹Ì¢òÚ&³XÜ«ÍàÕš›+Ûö“KOk[ÓP,hŽ Òsµ€ó½È»gLKÛ¢·¯sá]„÷‘+çO_®³|€ÀáHtaæÓ¨ Qµ…{lôÅn˜ðs!ûúo e)%RJæfæjZ­I´–JÛÿ(4„a{OÀ\×µ¼¼ÖZ ¸&Àüüû,øF º±±q L@™´¹,ô¹æŒ<89G5G[î LLL¤”Äb±¨Ö:émeFƒd•ÂVЬ­PJ¡T–¥Å¥àÉ®î`2™Üêìì uBâñ8ããã{?Ú`0¸äíßðŽVì0F¹ «üþ%Û@pBóJƦšIEND®B`‚gImageReader-3.2.3/data/icons/ins_cursor.svg000066400000000000000000000311001312567024200207630ustar00rootroot00000000000000 image/svg+xml gImageReader-3.2.3/data/icons/ins_replace.png000066400000000000000000000004451312567024200210560ustar00rootroot00000000000000‰PNG  IHDRVÎŽWbKGDÿÿÿ ½§“ÚIDAT8Í“A ‚@†¥M ]v”ŽÐ„jWm¢º“wèÝ Uµ¬”Phé̼1[èˆJ£Býð~æ=hIÌ×=?Iž–ælà:ž­L®Ga¦KÉ (‚±ÒKÙ‡¥Å&ÜNRû”êŒýA×e¢uši&ÁvÃíï¿Rj%ZJ9µádNp ÁE˜¾ª þ¼»¿]¨MíS¯6µÿ§¥Ô$kJëxvNm<[$‡ $yV ó4gqæ‹’Ã;DÐ kJj¶vÖ”Z§ø»ö¸cù77-IEND®B`‚gImageReader-3.2.3/data/icons/ins_replace.svg000066400000000000000000000423351312567024200210750ustar00rootroot00000000000000 image/svg+xml gImageReader-3.2.3/data/icons/item_block.png000066400000000000000000000003651312567024200207030ustar00rootroot00000000000000‰PNG  IHDRàw=øbKGDÿÿÿ ½§“ªIDATH‰í”Ñ ƒ0 Dï¬nCç`nкë0G™~hã–Ø±%úS°„ˆž”;sqÎúûâ{Õ?ç]•Ç+à¢ÙãÖ¹{D!Àõ-Rg÷a*{¢ ‘룄,öÑTTüÕ©°[,e@*©WXØ€ß":‡¥ j™Kƒ… Z1x¬i GOÇË5ÈŒ£ÍLƒì8Zç`d2§Ãì/HŒã&ãüügwÖj¨ò ú„\lüIEND®B`‚gImageReader-3.2.3/data/icons/item_block.svg000066400000000000000000000142271312567024200207200ustar00rootroot00000000000000 image/svg+xml gImageReader-3.2.3/data/icons/item_halftone.png000066400000000000000000000007111312567024200214040ustar00rootroot00000000000000‰PNG  IHDRàw=øbKGDÿÿÿ ½§“~IDATH‰í”½KBQÆW¯×k•¨!‡Ô \[š²!šú‚&·–  µ ¡Qú Ü%$›‚ ¡¡¥Aû RDAÉ«×Ópýº)ê KùLïyÏÃó¼çœ÷=0ß‡Ô …˜°´ ÷¦b±ÉHG£ÝØ6Œèp€Ü*aaü~°Û­ç…pøçe †<(érA$^¯¹n6ÁÖ*%“TªËÝÞÞBÓ^ ….‰ÇÓ㨪ù"…‚Y±Û N§¹—ËY¹BHý£ ŠEH$~eÓÔ0¬ùdòš@àŠ÷÷Ѻ¨òV»'S»%]Kò¡?Ó]EERXwﳩ Ù—(•Vyz:èpêâP;kK›ÊÇüŠ› ³BPm°¢€ÒÃ(pSvòPµ±6·Ç†vHÙÈ“ÕÉêwdõ¾YŒÓ:í6µÎÁ‘DlyàI-hÝW‹²ŠOiàSªø8Ïg‚s0.4;ìÎרЇr‡ÎÁ$0uƒ¾+Š~NÖ`êŸÝ ÿ? ÷pÛdµIEND®B`‚gImageReader-3.2.3/data/icons/item_halftone.svg000066400000000000000000000162141312567024200214240ustar00rootroot00000000000000 image/svg+xml gImageReader-3.2.3/data/icons/item_line.png000066400000000000000000000001541312567024200205340ustar00rootroot00000000000000‰PNG  IHDRàw=øbKGDÿÿÿ ½§“!IDATH‰c`£`Œ‚Œ8ÄÿSÙ¼Q0 FÁ(À¨¼;`üIEND®B`‚gImageReader-3.2.3/data/icons/item_line.svg000066400000000000000000000124641312567024200205560ustar00rootroot00000000000000 image/svg+xml gImageReader-3.2.3/data/icons/item_page.png000066400000000000000000000003461312567024200205240ustar00rootroot00000000000000‰PNG  IHDRóÿabKGDÿÿÿ ½§“›IDAT8Í’Í !…Ÿ1°*¶‹œÒ†Ex² ±=RØcFrJ`G…u/Ƀ¹È|Ÿü:®·˜s~xÖZ’°UJùr×|÷Þo!„e]WˆDª AJi×ßœs¯­‹Hîú/V ªCø€äžôàÂ<}[ªz^ð9Õ)ÁÔ7Z}›fH"ÆØŒ¯Ýùò®»ÓAMiHIEND®B`‚gImageReader-3.2.3/data/icons/item_page.svg000066400000000000000000000072301312567024200205360ustar00rootroot00000000000000 image/svg+xml gImageReader-3.2.3/data/icons/item_par.png000066400000000000000000000004561312567024200203740ustar00rootroot00000000000000‰PNG  IHDRàw=øbKGDÿÿÿ ½§“ãIDATH‰íT» Â@ õ³² ÌÁ H¬ÀH© EÄTÔH(sÀ:rð9÷KJ“×ÄyJlßóó-˜è£ÍÃý4s·Q¥¹z¿ÊþÇLÄø<¡bÍšç÷û1MI"0à'לFJThnŽPTàâVy7œðY‰z)´ œæŠ À&ÑÝ&¸¼DgpîÜ@¢è Jìâì ‚•Ú1&W²€¸Aw˜âØKÍ@ÜpÜ–Í ½¿ˆžE“‹&Ýœ®.«9Øì„:eT¢1vHS²¡­œÂyM÷ÑŸ®ëóã ßgò1ß—IEND®B`‚gImageReader-3.2.3/data/icons/item_par.svg000066400000000000000000000155771312567024200204210ustar00rootroot00000000000000 image/svg+xml gImageReader-3.2.3/data/icons/item_word.png000066400000000000000000000004761312567024200205670ustar00rootroot00000000000000‰PNG  IHDRàw=øbKGDÿÿÿ ½§“óIDATH‰íÓ±.QÆñQ<€R¼F6•ŽVÇ+l)^@t¢Ýr·Rk•4" ÕIHŒÂg'w’±3•Ì—ÜäÞïžùþgNfhÕ 3" «×$`¿žáóM @†£&—ñBÂþ¦ ÀI|Çv8c¥.à6^a /ÁëÖ _5:óÜ?ÞcÀib:÷;ðú8á“x!—…»8¦‹q›ÒŸfj½ùýK;MéðÍ,`·ìr"áÍâsùù÷‰º-,æû>öªvt`t%ug¡æKU×áÁ'é·„µB#ÇU­þ™~¿3W^5eÑÚIEND®B`‚gImageReader-3.2.3/data/icons/item_word.svg000066400000000000000000000135751312567024200206060ustar00rootroot00000000000000 image/svg+xml A gImageReader-3.2.3/data/icons/page.png000066400000000000000000000005261312567024200175060ustar00rootroot00000000000000‰PNG  IHDRóÿabKGDÿÿÿ ½§“ IDAT8­“1j…@†EyB`çÄ2ÒØÛ[yµµ°O¯"‚–» 㮦É}»ûšdà‡m¾™aøc9êQUÕ;€¯ó<œs¨0ÆÀ9G]׎IàýÀ®ë~&Iòð}ëºÞÒuÝëêºfq¿Ap—eÁ0 R‚ˆ´4Mãxp‡ÏóŒišç9Â0„”Bˆß”e p€s®µ=Ž#²,3ÂBÑkQa5’U°mˆÈ ïû~0Æn0çDd…­(x]WMp…µ<Ãjl\âsJ`‚¯Oí m[\O8MS+¬ ú¾×N,¥¼ÿSŠ¢0žð¿Ö7ÖŸ"ùòGIEND®B`‚gImageReader-3.2.3/data/icons/page.svg000066400000000000000000000114701312567024200175210ustar00rootroot00000000000000 image/svg+xml gImageReader-3.2.3/data/icons/resolution.png000066400000000000000000000005011312567024200207660ustar00rootroot00000000000000‰PNG  IHDRóÿabKGDÿÿÿ ½§“öIDAT8½Ò½JQàÏ/+7ˆO  VVv±ÓÞF; y3ŸÀR­µ›%þ%)„¬ÅNØ› ÄÃ…3sçÎ9s[jä8à ¼[Wâ+bˆ‹¹š]ÐÎpØ0ÕZ’;Ak.·Žn–‹P&gSÍR yÔ´›$L›\F“qD“‰á^˜˜Ž•«5ßâ¹iä?EêìΑáeÕF=ÕÅyü)Ýà¶ÑÇVÚ u¸TãAÂÁ½©Œ~ã.C¹€›¨¤Ïäzª½ÿ¨V8•p/8 ®ƒl2»Æ}ìá.âð ÏÅM‰ˆ=ߨIEND®B`‚gImageReader-3.2.3/data/icons/resolution.svg000066400000000000000000000077051312567024200210160ustar00rootroot00000000000000 image/svg+xml gImageReader-3.2.3/data/icons/rotate_page.png000066400000000000000000000011041312567024200210550ustar00rootroot00000000000000‰PNG  IHDRóÿabKGDÿÿÿ ½§“ùIDAT8Å’1h"Q†¿'îîÜÀ’ gLÄ€¬B›#ePP.X§»úÚ믴Ià ˜ÊÖ,˜"J° [„¼&xr ¹ì\s.’ìÕ÷àñæÍ›ÿ›7ÌÀÿ^ àòòò'Š ‚ àþþÏó~Õjµ÷«ïÉ¿gÊu]LÓdmm-ÚZkšÍ&"B.—c0¼{ ¹z ‚a±X0 ‚€B¡ÀÞÞJ)úý>õz]\×Yoa¢µ¦×ë±»»K¹\Ʋ,LÓÄ4M*• WWW8Ž“zóƒñxŒïû8ŽCµZessÃ0Ã0 òù<ív›Éd%MŒF#|ß§P(pxxÈúú:"‚ˆD€%¤T*1©V«vp]———lÛŽ­úÒé4™LÃ0¾F˲ØÚÚâîî.V´ô-íýý}”RŸŽ³‰e-žçZëXÑ*øáá¥Ôoù¸ÌžžžØÞÞ¦Óéü³„ÇÇGNOOiµZÌçó“F£ñM­¶ñââB®¯¯ñ<¨}J)nnnèt:‹EÊå²z3J©Y6›Mù¾mÛ†Áx<¦Ûíâ8$ ”R³Hóz4jµZsccãÃt:u‹…‘“³³³Û¸Ødœóùùù³ÖúG†_ÎÏÏ¿ðÖG+(U›:IEND®B`‚gImageReader-3.2.3/data/icons/rotate_page.svg000066400000000000000000000143331312567024200211000ustar00rootroot00000000000000 image/svg+xml gImageReader-3.2.3/data/icons/rotate_pages.png000066400000000000000000000012651312567024200212500ustar00rootroot00000000000000‰PNG  IHDRóÿabKGDÿÿÿ ½§“jIDAT8u“±KaÆßåî†ËE ^›A\ä"‘ †& ââÒA°ÁhCf·n…]ú´K&é ^‡•8¸G!UAI‰˜!z”‚©I¸¯SBZ¯ïô}Ïû=ÏËû=‚ÿ—ØØØÈªªú®Ýn¿vç‡Iõs¹\RQ0 ÃýY«Õ>˾*»»»MÀlµZ\^^R¯×I§ÓÌÎÎP(PU•t:ý˜ÏçƒÏH)M×u9==ejjеµ5LÓäöö–½½= ƒ\\\Ïd³ÙåR$azz)%ýNR©333!ØÚÚ"322ò°ººPu]ÿ277‡mÛÜÜÜÐuÇÉd2„B!t]G×u²Ù,ûûûX–eöFRªCCCT«UÊå2–e±¾¾N$AÓ4<ÏÃó<¤”$ Êå2×××½‰D"Úh4^V«UR©óóó†A   ( Š¢ôîccc”J%lÛþ|~~þ[ét:šÍ&N‡p8Œ”²§ÚUîÇ¢Ñ(hšö@qç—mÛ¨ªÊÙÙ™oSëžB¼Éår1`||]ש×븮ëÛÔÿp£Ñ@Ñ‘R¾R„“““f³Ù¤R©°²²â;ÂÝÝ\]]ñôô´é8NQôŠb±(I&“ضÝ[Ÿ‚ããc*• KKKd2ñ, BˆÇX,f‡Ñ4Z­ÆÉÉ –e±¸¸ˆ¢(!þÊ¿•ÏçKÃÃÃ/îïï­V«åJ)7···¿ûq}ÓØn·ßº®ûÍó¼÷;;;_éÇø¼œ>f‚PÍsIEND®B`‚gImageReader-3.2.3/data/icons/rotate_pages.svg000066400000000000000000000164001312567024200212600ustar00rootroot00000000000000 image/svg+xml gImageReader-3.2.3/data/icons/select.png000066400000000000000000000004761312567024200200550ustar00rootroot00000000000000‰PNG  IHDRàw=øbKGDÿÿÿ ½§“óIDATH‰c`Ã0ÂYže~3²QÅTÖÿ¿¶ë?AXà~M’‘áÿcnæo$»SìË÷¿\ÿevj=ga`````f`ãdaú^¦Î‹Ï &&(†²q‰UμñåËïÿl Lĺn#„O ´€‘É&,c#ÖFtC‚ŸÑ>€iB1„3ÌÑň²€`0à#hLz0\È‘€aÌËØ‚kp¡[†Ï¤&G\ñ€ÓRœ2€ää¿ ¿¾ÿýÇÙ¹âægtaŒ T¹/ßÿq100þBUB£ÂnŒdÑ+¸­7IEND®B`‚gImageReader-3.2.3/data/icons/select.svg000066400000000000000000000140211312567024200200570ustar00rootroot00000000000000 image/svg+xml gImageReader-3.2.3/data/icons/stripcrlf.png000066400000000000000000000007421312567024200206020ustar00rootroot00000000000000‰PNG  IHDRóÿabKGDÿÿÿ ½§“—IDAT8µÒ=hSaà'M¢bC\,êP„ Ý"V«"H'E‚ m‹PtPź uÐIq\Ć+'#U¤DÄÁâO¦ÅÜô:$ëM¼Ë{Î{8ßáã1ʶ>®¯H^$¿Ÿáµ<éIòØSc&"èçr—A‘KADpŸcqn‚‘%J_y7O¥Àt—Á9†:= 0ßÞ¥ Mc†Óe–ãqƒ]xÖ$ºËÕÕüIwæ%·†¨#7è image/svg+xml ↵ ✘ gImageReader-3.2.3/data/manual-cs.html.in000066400000000000000000000516201312567024200201250ustar00rootroot00000000000000 PříruÄka k aplikaci @PACKAGE_NAME@ @PACKAGE_VERSION@

PříruÄka k aplikaci @PACKAGE_NAME@ @PACKAGE_VERSION@

Obsah

O aplikaci

gImageReader je grafická nadstavba pro engine tesseract-ocr.

Funkce

  • Možnost ruÄnÄ› oznaÄit Äásti obrázku, které mají být rozpoznány, případnÄ› nechat rozpoznat celou plochu obrázku.
  • SamoÄinné rozpoznání rozvržení strany.
  • Otevírání obrázků a PDF dokumentů, dále import obrázků ze skenovacích zařízení, ze schránky a zachycených snímků obrazovky.
  • Rozpoznaný text je možné nechat zobrazit hned vedle zdrojového obrázku, případnÄ› nasmÄ›rovat do schránky.
  • Rozpoznání vícejazyÄného textu.
  • Základní úpravy výstupního textu, vÄetnÄ› funkce vyhledání/nahrazení a odebrání konců řádků.
  • Kontrola výstupního textu na pÅ™eklepy ve zvoleném jazyce, pokud je nainstalován přísluÅ¡ný slovník.
  • UpozornÄ›ní uživatele na chybÄ›jící slovníky a navržení jejich instalace.

Novinky

Podrobný seznam změn je k dispozici v protokolu úprav: https://github.com/manisandro/gImageReader/commits/master

gImageReader 3.1.2 (30. Äerven 2015):

  • Opravuje nesprávné chování funkce „PÅ™ipojit ke stávajícímu textu“ v případech, kdy je rozpoznáváno z vícero oblastí textu
  • Podrobnosti viz protokol úprav: https://github.com/manisandro/gImageReader/commits/master

gImageReader 3.1.1 (11. Äerven 2015):

  • Opraveno zobrazování titulku maximalizovaného okna aplikace v prostÅ™edí Gnome 3
  • PÅ™idány nové pÅ™eklady: ÄínÅ¡tina – honkongský a taiwanský dialekt
  • Aktualizovány pÅ™eklady: ruský a portugalský

gImageReader 3.1 (1. květen 2015):

  • PÅ™idána volba zvýrazňování prázdných míst
  • Umožňuje omezit oblast nahrazování textu pouze na oznaÄenou Äást výstupního textu
  • Do následného zpracování pÅ™idána volba pro zachování odstavců
  • Soubory je nyní možné otevírat i jejich pÅ™etažením do okna aplikace
  • ZlepÅ¡eno vykreslování nÄ›kterých PDF souborů v Qt variantÄ› uživatelského rozhraní
  • V systému MS Windows opraveno nefunkÄní skenování s nÄ›kterými modely skenerů
  • V systému MS Windows již podporována automatická instalace slovíků pro kontrolu pÅ™eklepů
  • Naskenované obrázky je možné ukládat i v jiných datových formátech, než png
  • Opraveno vícero dalších chyb

gImageReader 3.0.1 (4. leden 2015):

  • Opravena chyba v Qt variantÄ› uživatelského rozhraní, projevující se pÅ™i naÄítání souboru se seznamem pro nahrazování textu
  • ZlepÅ¡eno chování funkce odebírání konců řádků v případÄ› vícero po sobÄ› jdoucích konců řádků
  • Provedena drobná vylepÅ¡ení uživatelského rozhraní
  • Podrobnosti viz protokol úprav: https://github.com/manisandro/gImageReader/commits/master

gImageReader 3.0 (12. prosinec 2014):

  • gImageReader 3.0 koneÄné
  • PÅ™idáno nové, alternativní uživatelské rozhraní, založené na jiných softwarových knihovnách – Qt4/5, namísto Gtk
  • Opravaveno skenování pÅ™i provozování v operaÄním systému Microsoft Windows
  • PÅ™i pÅ™epínání mezi obrázky si aplikace již pamatuje nastavení obrazu pro konkrétní obrázek (svÄ›tlost, kontrast, atd)
  • Vyhledávání textu je nyní možné smÄ›rem ke konci i zaÄátku, lze nahrazovat vÅ¡echny výskyty vyhledaného, pÅ™i vyhledávání (volitelnÄ›) rozliÅ¡ovat mezi malými a velkými písmeny
  • Opraveno mnoho dalších chyb
  • Zaktualizovány pÅ™eklady textů rozhraní aplikace do ostatních jazyků
  • Podrobnosti viz protokol úprav: https://github.com/manisandro/gImageReader/commits/master

gImageReader 2.93 (30. duben 2014):

  • gImageReader 3.0 test 4
  • PÅ™idána možnost rozpoznávání ve vícero jazycích naráz
  • PÅ™idáno tlaÄítko pro zobrazení/skrytí podokna s výstupním textem
  • Zapínání / vypínání kontroly pÅ™eklepů je nyní možné z kontextové nabídky
  • Opraven pád pÅ™i naÄítání naskenovaného dokumentu

gImageReader 2.92 (19. březen 2014):

  • gImageReader 3.0 test 3
  • PÅ™idána funkce seznamu nahrazování, umožňující uživatelům vytvářet seznamy nahrazení, která mají být provedena v rozpoznaném textu
  • Opravena chyba v ukládání, mající za následek prázdné soubory
  • Opraveny pády aplikace pÅ™i vykreslování obsahu PDF souborů
  • Konce řádků, kterým pÅ™edchází konec řádku, jsou nyní zachovávány
  • Ve verzi pro systém Microsoft Windows opraveno zobrazení textů rozhraní v pÅ™ekladech do ostatních jazyků

gImageReader 2.91 (20. únor 2014):

  • gImageReader 3.0 test 2
  • ZlepÅ¡eno samoÄinné rozpoznávání rozvržení strany díky spojení pÅ™ekrývajících se oblastí
  • Proveden pÅ™echod na standardní dialog pro otevírání souborů z daného desktopového prostÅ™edí / operaÄního systému (Gnome/KDE / Microsoft Windows)
  • ZprovoznÄ›no rozpoznávání více stran i se samoÄinným rozpoznáváním rozvržením strany
  • Opravena funkce vyhledávání/nahrazování, která dříve způsobovala pády aplikace
  • PÅ™idána verze pro 64bit verzi systému Windows

gImageReader 2.90 (11. únor 2014):

  • gImageReader 3.0 test 1
  • PÅ™idána možnost vytvoÅ™it výbÄ›ry vícero oblastí k rozpoznání (druhý a další výbÄ›ry pÅ™idržením klávesy CTRL). Dále pÅ™ibyla kontextová nabídka, vyvolávaná kliknutím pravým tlaÄítkem myÅ¡i na výbÄ›ru. Z této nabídky lze:
    • Mazat a pÅ™euspořádávat jednotlivé výbÄ›ry
    • Nechat rozpoznat text v oznaÄené oblasti – buÄ do schránky, nebo do podokna s výstupním textem
  • PÅ™idáno základní samoÄinné rozpoznávání rozvržení strany
  • V podoknÄ› s výstupním textem pÅ™ibyla funkce ZpÄ›t a Znovu
  • Nastavení nyní probíhá samoÄinnÄ›
  • NatáÄení obrázků o libovolný úhel nyní funguje tak, jak má
  • PÅ™idáno zjišťování (externÄ›) smazaných/pÅ™ejmenovaných souborů
  • ZpÅ™ehlednÄ›no uživatelské rozhraní
  • Rozhraní aplikace pÅ™eneseno na knihovny Gtk+ verze 3, a její zdrojové kódy pÅ™epsány do jazyka C++ s použitím můstků Gtkmm

Jak s aplikací pracovat

Otevírání a import obrázků

  • Obrázky lze otevírat/importovat prostÅ™ednictvím podokna Zdroje, na které se dostanete kliknutím na tlaÄítko vlevo nahoÅ™e na hlavní liÅ¡tÄ›.
  • Obrázek Äi PDF dokument otevÅ™ete kliknutím na tlaÄítko Otevřít na panelu Obrázky.
  • K zachycení snímku obrazovky, vložení obrázku ze schránky, Äi otevÅ™ení nedávno používaného souboru, slouží Å¡ipka vedle tlaÄítka otevřít.
  • Seznam otevÅ™ených obrázků je možné spravovat pomocí tlaÄítek, následujících za tím pro otevírání souborů. DoÄasné soubory (jako jsou snímky obrazovky a data ze schránky) jsou pÅ™i ukonÄení aplikace samoÄinnÄ› smazány.
  • Přímo ze skenovacího zařízení získáte obrázek kliknutím na panel Získat v podoknÄ› Zdroje.

Prohlížení obrázků a úprava jejich parametrů

  • TlaÄítka na hlavní liÅ¡tÄ› slouží k pÅ™ibližování a oddalování, dále k pootoÄení obrázku o libovolný úhel. ZmÄ›ny pÅ™iblížení je možné dosáhnout též umístÄ›ním ukazatele na obrázek, stisknutím klávesy CTRL a otáÄením koleÄkem myÅ¡i.
  • Nástroje pro základní úpravy obrázku se nacházejí na liÅ¡tÄ› Úpravy obrázku, která se zapíná klikutím na tlaÄítko Úpravy obrázku, nacházejícím se na hlavní liÅ¡tÄ›. Mezi nástroje, které jsou zde v souÄasnosti k dispozici, patří úprava jasu a kontrastu a zmÄ›na rozliÅ¡ení (pomocí interpolace).

Rozpoznávání textu

  • Oblasti, ve kterých má být rozpoznán text, lze oznaÄit natažením (kliknutí levým tlaÄítkem + pohyb myší) obdélníku nad přísluÅ¡nou Äástí obrázku. Takových výbÄ›rů je možné vytvoÅ™it více, jen je tÅ™eba pÅ™i vytváření dalších pÅ™idržet klávesu CTRL.
  • AlternativnÄ› je možné použít tlaÄítko SamoÄinné rozpoznání rozvržení strany, které se nachází na hlavní liÅ¡tÄ›. Aplikace se tak pokusí samoÄinnÄ› urÄit pÅ™isluÅ¡né oblasti k rozpoznání a případnÄ› srovnat řádky pootoÄením obrázku.
  • VýbÄ›ry mohou být mazány a pÅ™euspořádávány prostÅ™ednictvím kontextové nabídky, která se objeví poté, co na nÄ› kliknete pravým tlaÄítkem. Je též možné zmÄ›nit velikost výbÄ›ru tažením za rohy obdélníku, který jej oznaÄuje.
  • Jazyk rozpoznávaného textu se vybírá z rozbalovací nabídky tlaÄítka Rozpoznat, nacházejícího se na hlavní liÅ¡tÄ›. Je-li nainstalován přísluÅ¡ný slovník pro kontrolu pÅ™eklepů, je též možné volit mezi dostupnými místními variantami daného jazyka. Toto ovlivňuje pouze kontrolu pÅ™eklepů v rozpoznaném textu. Nerozpoznané jazykové definice pro tesseract se objeví pod pÅ™edponou názvu souboru, uživatelsky je ale možné nauÄit aplikaci tyto soubory rozpoznávat urÄením přísluÅ¡ných pravidel v nastavení aplikace (viz níže). Rozpoznávání ve vícero jazycích naráz je možné urÄit v podnabídce VícejazyÄné rozbalovací nabídky.
  • Rozpoznávání oznaÄených Äásti obrázku (nebo celého obrázku, pokud nebyl proveden výbÄ›r oblastí) zahájíte kliknutím na tlaÄítko Rozpoznat na hlavní liÅ¡tÄ›. PřípadnÄ›, jednotlivé oblasti mohou být rozpoznány též kliknutím pravého tlaÄítka myÅ¡i na požadovaný výbÄ›r. Z této kontextové nabídky je též možné rozpoznaný text nasmÄ›rovat do schránky, namísto do podokna výstupu.

Následné zpracování rozpoznaného textu

  • Jakmile je rozpoznán, text se objeví v podoknÄ› výstupního textu (pokud nebyl pÅ™esmÄ›rován do schránky).
  • Je-li k dispozici slovník pro kontrolu pÅ™eklepů pro rozpoznávaný jazyk, bude rozpoznaný text takto zkontrolován. Jaký slovník bude ve výsledku použit, je možné zmÄ›nit buÄ z nabídky jazyka vedle tlaÄítka Rozpoznat, nebo z nabídky, která se objeví po kliknutí pravým tlaÄítkem myÅ¡i na oblasti textu.
  • PÅ™i rozpoznávání dalšího textu, může tento být buÄ pÅ™ipojen, vložen na pozici kurzoru, nebo může zcela nahradit stávající rozpoznaný text. Záleží dle režimu, zvoleného v nabídce Režim pÅ™ipojování, která se nachází na liÅ¡tÄ› podokna výstupního textu.
  • Mezi další nástroje pro následné zpracování textu patří odebírání konců řádků, ruÅ¡ení prázdného místa a další (dostupné od druhého tlaÄítka dále na liÅ¡tÄ› podokna výstupního textu). Dále lze v textu vyhledávat a nahrazovat. Seznam pravidel nahrazování lze vytvoÅ™it kliknutím na tlaÄítko Najít a nahradit na liÅ¡tÄ› podokna výstupního textu a poté kliknutím na tlaÄtko Dosazování.
  • ZmÄ›ny, provedené na rozpoznaném textu, mohou být brány zpÄ›t a též opakovány, pomocí přísluÅ¡ných tlaÄítek na liÅ¡tÄ› podokna výstupního textu.
  • Rozpoznaný text je možné uložit do souboru kliknutím na tlaÄítko Uložit na liÅ¡tÄ› podoka výstupního textu.
  • Podokno výstupu lze skrýt klikutím na tlaÄítko úplnÄ› vpravo na liÅ¡tÄ› podokna výstupu. Pozor, tato operace též vymaže dosavadní rozpoznaný text, takže o nÄ›j pÅ™ijdete, pokud jste ho mezitím napÅ™. neuložili do souboru.

Nastavení aplikace

  • Nastavení jsou dostupná z nabídky Aplikace, dostupné jako tlaÄítko úplnÄ› vpravo na hlavní liÅ¡tÄ›. Pokud je aplikace provozována v prostÅ™edí Gnome 3, nabídka Aplikace je souÄástí horní liÅ¡ty tohoto prostÅ™edí.
  • Co je možné nastavit: písmo v podoknÄ› výstupního textu, zda má aplikace hlásit chybÄ›jící slovníky pro kontrolu pÅ™eklepů, hlášení vydání nových verzí aplikace.
  • V případÄ› Gtk+ varianty uživatelského rozhraní aplikace, je souÄástí nastavení též orientace podokna výstupního textu (svislá zabere pravou stranu okna aplikace, vodorovná spodní). U Qt varianty rozhraní může být pozice podokna výstupu libovolná, staÄí pÅ™etáhnout jeho titulní liÅ¡tu.
  • Dále, je možné vytvoÅ™it vlastní pravidla pro párování jazykových definic engine tesseract a jazyka (data pro tesseract tuto informaci žel neobsahují). Seznam pÅ™edurÄených pravidel se nachází v sekci PÅ™edurÄené jazykové definice. Další definice lze pÅ™idat kliknutím na tlaÄítko PÅ™idat, které se nachází níže. Pravidla pro urÄení jazyka se sestávají z tÄ›chto tří polí:
    • PÅ™edpona názvu souboru: Název souboru s jazykovými daty pro tesseract má podobu <predpona>.traineddata, tj. pro ÄeÅ¡tinu, je soubor nazýván cs.traineddata a pÅ™edpona je cs.
    • Kód dle normy ISO: Jedná se o kombinaci kódu jazyka dle normy ISO 639-1 a kódu zemÄ› dle normy ISO 3166-2, oddÄ›lené podtržítkem (tj. cs_CZ). Tato informace je nezbytná pro urÄení slovníku pro kontrolu pÅ™eklepů v daném jazyce. Volba zemÄ› má význam pro samoÄinnou instalaci slovníků pro kontrolu pÅ™eklepů, kde je nutná nalezení přísluÅ¡ného balíÄku se slovníky. V případÄ›, že žádná z kombinací v normách nevyhovuje, lze použít kód smyÅ¡lený, jen pak nebude možné urÄit odpovídající slovník pro kontrolu pÅ™eklepů.
    • Obecný název jazyka: ÄŒlovÄ›kem používaný název jazyka, který slouží jako oznaÄení položky pro daný jazyk v nabídce Jazyk.

Instalace jazykových definic rozpoznávacího engine tesseract

  • V systému GNU/Linux staÄí spustit správce balíÄků a nainstalovat ty, které obsahují požadované jazykové definice (balíÄky nejspíš budou nazvány ve stylu tesseract-langpack-<jazyk>).
  • V systému Microsoft Windows je tÅ™eba si stáhnout definice požadovaných jazyků ze stránek projektu, jejich soubory (<jazyk>.traineddata) pak umístit tam, kam odkazuje (nabídka) Start→VÅ¡echny programy→gImageReader→Jazykové definice pro Tesseract.
  • Aby se instalace nových jazykových definic projevila, je tÅ™eba buÄ aplikaci ukonÄit a spustit znovu, nebo použít v nabídce aplikace kliknout na Znovu zkontrolovat přítomnost jazykových dat.

Instalace slovníků pro kontrolu překlepů

  • V systému GNU/Linux, pokud daná distribuce podporuje technologii PackageKit, aplikace v případÄ› potÅ™eby nabídne samoÄinnou instalaci nezbytných slovníků. A pokud snad samoÄinná instalace z nÄ›jakého důvodu nefunguje, můžete slovníky nainstalovat pomocí správce balíÄků v systému (balíÄky budou nazvané nÄ›co jako hunspell-<jazyk> nebo aspell-<jazyk>).
  • V systému MS Windows, se aplikace pokusí automaticky stáhnout přísluÅ¡ný slovník pro kontrolu pÅ™eklepů z http://cgit.freedesktop.org/libreoffice/dictionaries/tree. Slovníky též mohou být nainstalovány ruÄnÄ›: pro přísluÅ¡ný jazyk (tj. napÅ™. cs_CZ), stáhnÄ›te soubory s příponami .dic a .aff a umístÄ›te je tam, kam odkazuje (nabídka) Start→VÅ¡echny programy→gImageReader→Slovníky pro kontrolu pÅ™eklepů.

Jak se zapojit do vývoje

Pro své návrhy a příspÄ›vky vÅ¡eho druhu, vyplňte formulář a nebo požadavek na zaÄlenÄ›ní na stránce projektu na portálu GitHub, nebo napiÅ¡te na manisandro@gmail.com. ZvláštÄ› cenÄ›ny jsou pÅ™eklady textů uživatelského rozhraní aplikace. Jak takový pÅ™eklad vytvoÅ™it (v bodech):

  1. Stáhněte si nejnovější zdrojové kódy.
  2. Přejděte do složky po.
  3. Pokud pÅ™eklad do přísluÅ¡ného jazyka jeÅ¡tÄ› nebyl založen, vytvoÅ™te kopii souboru gimagereader.pot a nazvÄ›te ji <standardni_zkratka_jazyka>.po (tj. napÅ™. de.po pro nÄ›mÄinu). V již existujícím pÅ™ekladu pokraÄujte upravováním přísluÅ¡ného souboru.
  4. Doplňte překlad řetězců v <jazyk>.po.
  5. Výsledný po soubor pošlete na manisandro@gmail.com. Díky!

Ladění a podpora

Pokud narazíte na problém Äi máte nÄ›jaký nápad na zleÅ¡ení aplikace, vyplňte prosím formulář v systému správy hlášení chyb pro gImageReader, nebo napiÅ¡te přímo na manisandro@gmail.com. Pokud se setkáváte s pády aplikace Äi tím, že pÅ™estává reagovat, pokuste se do svého hlášení zahrnout též následující údaje:

  • Pokud se objeví komponenta pro obsluhu chyby, pÅ™ipojte do své zprávy též ladicí informace, které vypíše. Aby tyto informace byly úplné, je v případÄ› provozování pod systémem GNU/Linux tÅ™eba, aby byl nainstalován ladicí nástroj gdb a přísluÅ¡né ladicí symboly. BalíÄek, obsahující ladicí symboly bývá obvykle nazván <nazevbalicku>-debuginfo nebo <nazevbalicku>-dbg. V případÄ› verze pro systém Microsoft Windows jsou ladicí symboly přítomny již ve výchozí instalaci.
  • Pokud aplikaci provozujete v systému Microsoft Windows, pÅ™ipojte ke zprávÄ› soubory protokolů %ProgramFiles%\gImageReader\gimagereader.log a %ProgramFiles%\gImageReader\twain.log.
  • Pokud aplikaci provozujete v systému GNU/Linux, spusÅ¥te ji z emulátoru terminálu a ke zprávÄ› pÅ™ipojte cokoli, co se v terminálu objevilo.
  • Pokuste se co možná nejlépe popsat, co jste s aplikací dÄ›lali a zda se daří situaci navodit opakovanÄ›.

Copyright ©2009-2015 Sandro Mani, revize: pondÄ›lí, 20. duben 2015

gImageReader-3.2.3/data/manual.html.in000066400000000000000000000666601312567024200175340ustar00rootroot00000000000000 @PACKAGE_NAME@ @PACKAGE_VERSION@ Manual

@PACKAGE_NAME@ @PACKAGE_VERSION@ Manual

Contents

About

gImageReader is a frontent to tesseract-ocr written in C++.

Features

  • Import PDF documents and images from disk, scanning devices, clipboard and screenshots
  • Process multiple images and documents in one go
  • Manual or automatic recognition area definition
  • Recognize to plain text or to hOCR documents
  • Recognized text displayed directly next to the image
  • Post-process the recognized text, including spellchecking
  • Generate PDF documents from hOCR documents

News

A detailed list of changes can be found in the commit log: https://github.com/manisandro/gImageReader/commits/master

gImageReader 3.2.3 (Jul 01 2017):
* Fix broken hOCR export
* Add option to prepend source filename / page to plain text output

gImageReader 3.2.2 (Jun 30 2017):
* Attempt to use original source image for PDF output
* Allow collapsing/expanding branches of hOCR tree via context menu
* Recognize guillemets as quote characters
* Fix crash when adding zero-page sources
* Fix possible crash when rapidly switching documents
* [Gtk] Fix output pane orientation not properly restored
* [Gtk] Don't crash when rendering of image fails
* [Gtk] Fix icons not appearing with recent Gtk versions
* [Qt] Don't display empty image if rendering of downscaled image fails

gImageReader 3.2.1 (Feb 10 2017):
* Add possibility to rotate individual pages of multipage documents
* Ensure the tessdata manager downloads compatible tesseract languge definitions
* Add CCITT Group4 compression option for monochrome PDF export
* Allow choosing between diffuse and threshold dithering for monochrome PDF export
* Preview JPEG compression quality in PDF output preview
* Make brightness/contrast/resolution changes affect all selected sources
* [Qt] Support multipage images through QImageReader (Qt5.9+ will support multipage TIFFs)
* [Gtk] Fix hang when saving selection image
* [Qt] Fix possible deadlock when rapidly switching sources
* Updated translations

gImageReader 3.2.0 (Nov 23 2016):
 * gImageReader 3.2.0 stable
 * Add PageUp / PageDown keyboard accelerators for browsing multipage documents
 * See 3.1.9x changelogs for all other feature changes since previous stable
 * Many bug fixes since 3.1.99 - special thanks to Daniel Plakhotich
 * Full details in commit log: https://github.com/manisandro/gImageReader/commits/master

gImageReader 3.1.99 (Oct 13 2016):
 * gImageReader 3.2 release candidate
 * General improvements:
   - Catch critical tesseract errors which otherwise result in the application crashing
   - Improve spelling dictionary auto-installation logic
   - Allow choosing whether to store language files (language definitions, spelling dictionaries) in system-wide or user-local directories
 * Plain text mode improvements:
   - Allow recognizing user-defined regions on multiple pages
   - Also treat \u2014 character as a hyphen
   - Make preserve paragraphs option correctly deal with trailing whitespace
 * hOCR editor improvements:
   - Add "Add to dictionary" and "Ignore word" actions to spell-checking menu in hOCR editor
   - Exclude non-word characters from spell-checking
   - Allow merging adjacent word items
   - Allow adjusting bounding boxes of document elements by resizing the selection in the canvas
   - Allow removing arbitrary items from the document tree
   - Allow defining custom graphic regions from context-menu of the respective page item
 * PDF export improvements:
   - Add previewing capability
   - Take into account baseline information to better position the words in the generated PDF
   - Add options to choose color format and compression of images written to PDF, allowing to greatly reduce the size of PDF
   - Correctly handle paper size and DPI
   - Improve logic for uniformizing word and line spacing
   - Make sure correct hypen character is used, allowing PDF applications to correctly find hyphenated words
 * New and updated translations
 * Various bug fixes
 * Full details in commit log: https://github.com/manisandro/gImageReader/commits/master

gImageReader 3.1.91 (May 03 2016):
 * gImageReader 3.2 beta 2
 * Fix crash when editing items in the hOCR editor
 * Fix build with Ubuntu 14.04
 * Updated czech translation
 * Fix some string typos
 * Full details in commit log: https://github.com/manisandro/gImageReader/commits/master

gImageReader 3.1.90 (Apr 28 2016):
 * gImageReader 3.2 beta 1
 * Add an initial hOCR editor implementation, with possibility to save as hOCR HTML, PDF with invisible text overlay, or a PDF reconstructed from the extracted text and graphics
 * Allow selecting and working on multiple sources at once
 * Add a tessdata manager, to conveniently manage tesseract language definitions directly from the application
 * Show a progress bar when recognizing, add a cancel button
 * Modernized Gtk UI
 * Expose script and orientation detection support
 * Possiblity to pan via middle button drag
 * Remove the need to specify the culture code in custom language definitions, and use a built-in language-culture mapping instead to search for spelling dictionaries
 * Various bug fixes
 * Full details in commit log: https://github.com/manisandro/gImageReader/commits/master

gImageReader 3.1.2 (Jun 30 2015):
 * Fix incorrect behavior of "Append to current text" with multiple recognition areas
 * Full details in commit log: https://github.com/manisandro/gImageReader/commits/master

gImageReader 3.1.1 (Jun 11 2015):
 * Fix titlebar now shown when window maximized in Gnome 3
 * New translations: Chinese (Hong Kong), Chinese (Taiwan)
 * Updated translations: Russian, Portoguese

gImageReader 3.1 (May 1 2015):
 * Add option to draw whitespace
 * Allow searching and replacing only in selected portion of output text
 * Add "preserve paragraphs" postprocessing option
 * Allow to open files via drag and drop
 * Improve rendering of certain PDF files with the Qt interface
 * Fix scanning broken with certain scanners under Windows
 * Support automatic spelling dictionary installation under Windows
 * Allow saving scans in other formats than png
 * Handful of bugs fixed
 * Full details in commit log: https://github.com/manisandro/gImageReader/commits/master

gImageReader 3.0.1 (Jan 4 2015):
 * Fix a bug in the Qt interface when loading substitutions list from file
 * Improve behaviour of strip line breaks functionality with multiple line breaks
 * Small UI improvements
 * Full details in commit log: https://github.com/manisandro/gImageReader/commits/master

gImageReader 3.0 (Dec 12 2014):
 * gImageReader 3.0 stable
 * New Qt4/5 interface, as alternative to the Gtk interface
 * Fixed scanning on Windows
 * Memorize image settings (brightness, contrast, etc) when switching images
 * Search forward and backward, replace all, case sensitive search
 * Many bug fixes
 * Translation updates
 * Full details in commit log: https://github.com/manisandro/gImageReader/commits/master

gImageReader 2.93 (Apr 30 2014):
 * gImageReader 3.0 beta 4
 * Add possibility to choose multiple recognition languages
 * Add button to show/hide output pane
 * Fix a crash when loading a scanned document
 * Allow toggling spell checking from context menu
 * Full details in commit log: https://github.com/manisandro/gImageReader/commits/master

gImageReader 2.92 (Mar 19 2014):
 * gImageReader 3.0 beta 3
 * Add replacement-list feature, allowing the user to specify a list of replacements to perform on the recognized text
 * Fix saving output resulting in empty files
 * Fix crashes when rendering PDF files
 * Keep line-breaks if preeded by line-break
 * Fix localization not working on Windows
 * Full details in commit log: https://github.com/manisandro/gImageReader/commits/master

gImageReader 2.91 (Feb 20 2014):
 * gImageReader 3.0 beta 2
 * Improve page-layout autodetection by merging overlapping regions
 * Use native file-chooser dialogs on Gnome/KDE/Windows
 * Allow performing multipage-recognition with page-layout autodetection
 * Fix broken search/replace which caused the application to crash
 * Add Win64 packages
 * Fix some other bugs, full details in commit log: https://github.com/manisandro/gImageReader/commits/master

gImageReader 2.90 (Feb 11 2014):
 * First beta of the grand new gImageReader:
   - Support multiple selections (via CTRL-key). Rightclicking a selection opens a context menu which allows to:
     - Deleted and reordered individual selections.
     - Recognize the selected text, either to clipboard or to the output pane.
   - Basic automatic page layout detection.
   - The output pane now supports undo and redo.
   - Configuration is now automatic.
   - Proper arbitrary rotation of images.
   - Detect deleted/renamed files.
   - Cleaner UI.
   - Port to Gtk+3, rewrite in C++ using the Gtkmm bindings.

Usage

Opening and importing images

  • Images can be opened/imported from the sources pane, which is activated by clicking on the top-left button in the main toolbar.
  • To open an existing image or PDF document, click on the open button in the images tab.
  • To capture a screenshot, paste image data from the clipboard, or open a recently opened file, click on the arrow next to the open button.
  • You can manage the list of opened images with the buttons next to the open button. Temporary files (such as screenshots and clipboard data) are automatically deleted when the program exists.
  • To acquire an image from a scanning device, click on the acquire tab in the sources pane.

Viewing and adjusting images

  • Use the buttons in the main toolbar to zoom in and out as well as rotate the image by an arbitrary angle. Zooming can also be performed by scrolling on the image with the CTRL key pressed.
  • Basic image manipulation tools are provided in the image controls toolbar, which is activated by clicking on the image controls button in the main toolbar. The provided tools currently allow brightness and contrast adjustments as well as adjusting the image resolution (through interpolation).
  • Multiple images can be selected, which allowes the user to process multiple images in one go (see below).

Preparing for recognition

  • To perform OCR on an image, the user needs to specify:
    • The input images (e.g. images to recognize),
    • The recognition mode (e.g. plain text vs hOCR, PDF)
    • The recognition language(s).
  • The input images correspond to the selected entries in the images tab in the sources pane. If multiple images are selected, the program will treat the set of images as multipage document and ask the user which pages to process when recognition is started.
  • The recognition mode can be selected in the OCR mode combobox in the main toolbar:
    • The plain text mode makes the OCR engine extract only the plain text, without formatting and layout information.
    • The hOCR, PDF mode makes the OCR engine return the recognized text as a hOCR html document, which includes formatting and layout information for the recognized page. hOCR is a standard format for storing recognition results and can be used to interoperate with other application supporting this standard. gImageReader can process hOCR documents further to generate a PDF document for the recognition result.
  • The recognition language can be selected from the drop-down menu of the recognize button in the main toolbar. If a spelling dictionary is installed for a tesseract language definition, it is possible to choose between available regional flavors of the language. This will only affect the language for spell-checking the recognized text. Unrecognized tesseract language definitions will appear by their filename prefix, one can however teach the program to recognize such files by defining appropriate rules in the program configuration (see below). Multiple recognition languages can be specified at once from the Multilingual submenu of the drop-down menu. The installed tesseract language definitions can be managed from the Manage languages... menu entry in the drop-down menu of the recognize button, see also below.

Recognizing and post-processing in plain text mode

  • Areas to be recognized can be selected by dragging (left click + mouse move) a rectangular area around portions of the image. Multiple selections are possible by pressing the CTRL key while selecting.
  • Alternatively, the automatic layout detection button, accessible from the main toolbar will attempt to automatically define appropriate recognition areas, as well as adjust the rotation of the image if necessary.
  • Selections can be deleted and reordered via the context menu which appears when right-clicking on them. It is also possible to resize existing selections by dragging the corners of the selection rectangle.
  • The selected portions of the image (or the entire image, if no selections are defined) can be recognized by pressing on the recognize button in the main toolbar. Alternatively, individual areas can be recognized by right-clicking a selection. From the selection context menu, it is also possible to redirect the recognized text to the clipboard, instead of the output pane.
  • If multiple pages are selected for recognition, the program allows the user to choose between either recognizing the full resp. manually selected area for each individual page, or performing a page-layout analysis on each page to automatically detect appropriate recognition areas.
  • Recognized text will appear in the output pane (unless the text was redirected to the clipboard), which is shown automatically as soon as some text was recognized.
  • If a spelling dictionary for the recognition language is available, automatic spell-checking will be enabled for the outputted text. The used spelling dictionary can be changed either from the language menu next to the recognize button, or from the menu which appears when right-clicking in the text area.
  • When additional text is recognized, it will either get appended, inserted at cursor position, or replace the previous content of the text buffer, depending on the mode selected in the append mode menu, which can be found in the output pane toolbar.
  • Other post-processing tools include stripping line breaks, collapsing spaces and more (available from the second button in the output pane toolbar), as well as searching and replacing text. A list of search and replace rules can be defined by clicking on the Find and replace button in the output pane toolbar and then clicking on the Substitutions button.
  • Changes to the text buffer can be undone and redone by clicking on the appropriate buttons in the output pane toolbar.
  • The contents of the text buffer can be saved to a file by clicking on the save button in the output pane toolbar.

Recognizing and post-processing in hOCR, PDF mode

  • In hOCR mode, always the entire page of the selected source(s) is recognized.
  • The recognition result is presented in the output pane as a tree-structure, divided in pages, paragraphs, textlines, words and graphics.
  • When an entry in the tree-structure is selected, the corresponding area is highlighted in the image. Additionally, formatting and layout properties of the entry are shown in the Properties tab below the document tree. The raw hOCR source is visible in the Source tab below the document tree.
  • The word text in the document tree can be edited by double-clicking the respective word entry. If a word is mis-spelled, it will be rendered red. Right-clicking a word in the document tree will show a menu with spelling suggestions.
  • Properties for a selected entry can be modified by double clicking the desired property value in the Properties tab. Interesting actions for text entries are tweaking the bounding area, changing the language and modifying the font size. The language property also definies the spelling language used to check the respective word. The bounding area can also be edited by resizing the selection rectangle in the canvas.
  • Adjacent word items can be merged by rightclicking the respective selected items.
  • Arbitrary items can be removed from the document via right-click on the respective item.
  • New graphic areas can be defined by selecting the Add graphic region entry of the context menu of the respective page item and drawing a rectangle on the canvas.
  • The document tree can be saved as a hOCR HTML document via the Save as hOCR text button in the output pane toolbar. Existing documents can be imported via the Open hOCR file button in the output pane toolbar.
  • PDF files can be generated from the PDF export menu in the output pane toolbar. Two modes are available:
    • PDF will generate a reconstructed PDF the same layout and graphics/pictures as the source document.
    • PDF with invisible text overlay will generate a PDF with the unmodified source image as background and invisible (but selectable) text overlayed above the respective source text in the image. This export mode is usefull for generating a document which is visually identical to the input, but with searchable and selectable text.
  • When exporting to PDF, the user is prompted for the font family to use, whether to honour the font sizes detected by the OCR engine, and whether to attempt to homogenize the text line spacing. Also, the user can select the color format, resolution and compression method to use for images in the PDF document to control the size of the generated output.

Program options

  • The program options can be accessed from the application menu, which opens when clicking the right-most button of the main toolbar. When running the application within the Gnome 3 desktop environment, the application menu is part of the top bar of the desktop shell.
  • Options allow setting the font of the output pane, as well as determining whether the application will notify about missing spelling dictionaries and new program versions.
  • When running the Gtk+ interface, the options also allow setting the orientation of the output pane (if vertical, it will occupy the right portion of the application, if horizontal, it will occupy the lower portion). When running the Qt interface, the position of the output pane can be freely moved around by dragging on the title bar of the output pane.
  • The language data location setting allows to control whether tesseract language definitions and spelling dictionaries are saved in system-wide (i.e. %ProgramFiles% under Windows or typically below /usr on Linux) or user-local (i.e. below the current user's home directory) directories. This is usefull if the user does not have writing privileges in system-wide locations.
  • Additionally, one can define new rules to match tesseract language definitions to a language (unfortunately, the tesseract language definitions do not include this information). The list of predefined rules can be seen in the Predefined language definitions section. Additional definitions can be added clicking on the Add button below. The rules for a language definition, which consists of three fields, are as follows:
    • Filename prefix: The filename of tesseract language data files is of the format <prefix>.traineddata, i.e. for English, the file is called eng.traineddata and the prefix is eng.
    • ISO code: This is the ISO 639-1 language code (i.e. en), optionally combined by an underscore with the ISO 3166-2 country code (i.e. en_US). This information is necessary to match spelling dictionaries to the language. The choice of the actual country code is not strictly relevant, but it is necessary for the automatic installation of spelling dictionaries to find a relevant package of dictionaries. This code can also be made up if no appropriate choices exist, the only result being that no relevant spelling-dictionaries will be matched with the language.
    • Native name: The native name of the language simply determines the label of the entry for the language in the language menu.

Installation of tesseract language definitions

  • The Tessdata manager, available from the drop-down menu of the recognize button in the main toolbar allows the user to manage the available recognition languages.
  • To install the languages manually:
    • On Linux, it's sufficient to install the package corresponding to the language definition one wants to install via the package management application (the packages may be called something like tesseract-langpack-<lang>).
    • On Windows, first, in the gImageReader about dialog, check which version of tesseract is used. Then go to the project tessdata page, and in the branch selection button, under tags, select the version which is less or equal the tesseract version in use. Then download the desired language definitions (*.traineddata along with any supplementary files which certain languages need) and save them to Start→All Programs→gImageReader→Tesseract language definitions.
  • To re-detect the available languages, one can restart the program, or select Redetect Languages from the application menu.

Installation of spelling dictionaries

  • On Linux, if your distribution supports PackageKit, the program will offer to automatically install missing dictionaries when necessary. If automatic installation does not work for some reason, you can install the spelling dictionaries from the package management application (the packages may be called something like hunspell-<lang>).
  • On Windows, the program will attempt to automaticallly download the desired spelling dictionary from http://cgit.freedesktop.org/libreoffice/dictionaries/tree. Dictionaries can also be installed manually: for a desired language (i.e. it_IT), download the *.dic and *.aff files and place them in Start→All Programs→gImageReader→Spelling dictionaries.

Contributing

For suggestions and contributions of any kind, please file tickets and/or pull-requests on the GitHub project page, or contact me at manisandro@gmail.com. I'd especially appreciate translations - here are the main steps for creating a translation:

  1. Download the latest source archive.
  2. Enter the po folder.
  3. To create a new translation, copy the gimagereader.pot file to <language>.po (i.e. de.po for German). To edit an existing translation, simply pick the corresponding file.
  4. Translate the strings in <language>.po.
  5. Send the po file to manisandro@gmail.com. Thanks!

Debugging and support

If you find an issue or have a suggestion, please file a ticket to the gImageReader issue tracker, or contact me directly at manisandro@gmail.com. Be sure to also consult the FAQ. If you are experiencing crashes or hangs, please also try to include the following information in the ticket/email:

  • If the crash handler appears, include the backtrace which is shown there. To make sure that the backtrace is complete, if you are running the application under Linux, make sure that the gdb debugger as well as the debugging symbols are installed if your distribution provides them. The package containing the debugging symbols is usually called <packagename>-debuginfo or <packagename>-dbg. If you are running the application under Windows, some debugging symbols are installed by default.
  • If you are running under Windows, include the %ProgramFiles%\gImageReader\gimagereader.log and %ProgramFiles%\gImageReader\twain.log log files.
  • If you are running under Linux, run the application from a terminal and include any output which appears on the terminal.
  • Try to describe as best as you can what you were doing and whether the problem is reproducible.

Copyright ©2009-2017 Sandro Mani, revision: Fri, Jun 30 2017

gImageReader-3.2.3/formatSourceFiles.sh000077500000000000000000000002601312567024200200260ustar00rootroot00000000000000#!/bin/sh which astyle &> /dev/null || echo "Please install astyle." && exit 1 find gtk qt \( -name '*.cc' -or -name '*.hh' \) -exec astyle --options=$dir/astyle.options {} \; gImageReader-3.2.3/gtk/000077500000000000000000000000001312567024200146225ustar00rootroot00000000000000gImageReader-3.2.3/gtk/data/000077500000000000000000000000001312567024200155335ustar00rootroot00000000000000gImageReader-3.2.3/gtk/data/appmenu.ui000066400000000000000000000015561312567024200175460ustar00rootroot00000000000000
Redetect Languages app.redetectLangs Preferences app.preferences
Help app.help About app.about Quit app.quit
gImageReader-3.2.3/gtk/data/crashhandler.ui000066400000000000000000000141361312567024200205350ustar00rootroot00000000000000 True False view-refresh False 480 640 emblem-important dialog False vertical 2 False Regenerate backtrace True True True image:backtrace:regenerate True True 0 gtk-close True True True True False True 1 False True end 0 True False <b>The application has crashed</b> True True 0 False True 0 True True Apologies for the inconvenience. To help improve the application, please consider reporting the issue to <a href="mailto:manisandro@gmail.com?subject=gImageReader%20Crash">manisandro@gmail.com</a>. Please try to describe what you were doing before the application crashed. Also, include the information below. Thank you. True True 0 False True 2 True False True 0 False True 3 True True in True True False True True 4 False False True 5 button:crashhandler.close gImageReader-3.2.3/gtk/data/editor_hocr.ui000066400000000000000000001050021312567024200203710ustar00rootroot00000000000000 50 1200 300 10 50 50 200 100 1 10 1 99 4.0000000002235172 1 10 100 90 1 10 False PDF Export False center-on-parent True normal True True False vertical 2 False end Cancel True True True True True 0 OK True True True True True 1 False False 0 True False 4 2 True False Output mode: 0 0 0 True False 0 PDF PDF with invisible text overlay 1 0 True False 0 in True False 12 True False 2 2 True False True 1 0 True False Format: 0 0 0 True False Compression: 0 0 3 True False True 1 3 True False Compression quality: 0 0 4 True True True adjustment:pdfoptions.quality 1 4 True False DPI: 0 0 2 True True adjustment:pdfoptions.dpi 1 2 True False Dithering algorithm: 0 0 1 True False 1 1 True False Image settings: 0 1 2 True False 0 in True False 12 True False 2 2 True False Document font: 0 0 0 True True True True Sans 12 1 0 Uniformize line and word spacing True True False True 0 True 0 3 2 Use detected font sizes True True False True 0 True 0 1 2 True False False 20 2 True False 20 Preserve spaces wider than: 0 False True 0 True True True 2 2 adjustment:pdfoptions.preserve True True False True 1 True False characters False True 2 0 4 2 True False False True False 20 Scale: 0 True True 0 True True adjustment:pdfoptions.fontscale True True 1 0 2 2 True False Text settings: 0 0 2 2 Show preview True True False 0 True 0 3 2 False True 1 button:pdfoptions.cancel button:pdfoptions.ok True False edit-clear-symbolic True False x-office-document-symbolic True False document-open-symbolic True False document-save-as-symbolic True False vertical True False True True True image:hocr.open none False True 0 True False True True Save output image:hocr.save none False True 1 True False True True Export to PDF image:hocr.export none False True 2 True True True Clear output image:hocr.clear none False True 3 False True 0 True True never in True True False False True True 1 True True True True never in True True False 0 True False both True False Properties False True True in True True False word 2 2 True 1 True False Source 1 False True True 2 True False True False PDF True False PDF with invisible text overlay gImageReader-3.2.3/gtk/data/editor_text.ui000066400000000000000000001015721312567024200204320ustar00rootroot00000000000000 True False edit-clear-symbolic True False edit-find-replace-symbolic True False /org/gnome/gimagereader/ins_append.png True False /org/gnome/gimagereader/ins_cursor.png True False /org/gnome/gimagereader/ins_replace.png True False Append to current text True False image:output.insert.append False True Insert at cursor True False image:output.insert.cursor False True Replace current text True False image:output.insert.replace False True True False edit-redo-symbolic True False document-save-as-symbolic True False /org/gnome/gimagereader/stripcrlf.png True False text-editor-symbolic True False edit-undo-symbolic True False object-select-symbolic True False edit-delete-symbolic False Substitutions center-on-parent 320 240 document-properties True False vertical True False 1 True False Open Open True document-open-symbolic False True True False Save Save True document-save-as-symbolic False True True False Clear Clear True edit-clear-symbolic False True True False False True True False Add Add True list-add-symbolic False True True False False Remove Remove True list-remove-symbolic False True False True 0 True True never in True True True False False both multiple True True 1 True False end Apply True True True image:postproc.apply True True 0 Close True True True image:postproc.close True True 1 False True 2 True False True False False Keep line break if... True False Preceded by end mark (.?!) True False Preceded or succeeded by quote True False True False False Other options True False Join hyphenated words True False Collapse whitespace True False Preserve paragraphs True False True False False Visual aids True False Draw whitespace True False vertical True False 2 2 2 True True False Select insert mode none menu:output.insert False True False True False True Select insert mode /org/gnome/gimagereader/ins_append.png False True 0 True False down False True 1 False True 0 True False True True True Strip line breaks on selected text image:output.stripcrlf none False True 0 True True False none menu:output.stripcrlf False True False 4 down False True 1 False True 1 True True True Find and replace image:output.findreplace none False True 2 True True True Undo image:output.undo none False True 3 True True True Redo image:output.redo none False True 4 True True True Save output image:output.save none False True 5 True True True Clear output image:output.clear none False True 6 False True 0 False vertical True False 10 True True True â— 2 Find 0 0 10 True True True â— 2 Replace 0 1 True True True Replace True False 16 edit-find-replace-symbolic 1 1 True True True Replace all True False 16 edit-find-replace-symbolic 2 1 True True True Find previous True False 16 go-up-symbolic 2 0 True True True Find next True False 16 go-down-symbolic 1 0 False True 0 Match case True True False 0 True False True 1 Substitutions True True True image:output.substitutions False True 2 False True 1 True True in True True word 2 2 True True 2 gImageReader-3.2.3/gtk/data/gimagereader.gresource.xml000066400000000000000000000044741312567024200226770ustar00rootroot00000000000000 crashhandler.ui gimagereader.ui appmenu.ui editor_text.ui editor_hocr.ui ../../data/icons/angle.png ../../data/icons/autolayout.png ../../data/icons/brightness.png ../../data/icons/contrast.png ../../data/icons/controls.png ../../data/icons/filtering.png ../../data/icons/ins_append.png ../../data/icons/ins_cursor.png ../../data/icons/ins_replace.png ../../data/icons/page.png ../../data/icons/resolution.png ../../data/icons/stripcrlf.png ../../data/icons/item_block.png ../../data/icons/item_halftone.png ../../data/icons/item_line.png ../../data/icons/item_page.png ../../data/icons/item_par.png ../../data/icons/item_word.png ../../data/icons/rotate_page.png ../../data/icons/rotate_pages.png gImageReader-3.2.3/gtk/data/gimagereader.ui000066400000000000000000003556601312567024200205250ustar00rootroot00000000000000 -10 10 0.10000000000000001 1 -100 100 1 10 -100 100 1 10 1 1 1 10 50 600 100 10 50 359.89999999999998 0.10000000000000001 1 1 1 1 1 1 image/png *.png True False help-contents-symbolic True False action-unavailable-symbolic True False object-select-symbolic True False list-add-symbolic True False list-remove-symbolic True False object-select-symbolic True False /org/gnome/gimagereader/rotate_pages.png True False /org/gnome/gimagereader/rotate_page.png True False Rotate current page True False image:display.rotate.current False True Rotate all pages True False image:display.rotate.all False True True False /org/gnome/gimagereader/autolayout.png True False /org/gnome/gimagereader/controls.png True False Toggle output pane text-editor-symbolic True False edit-delete-symbolic True False document-new-symbolic True False zoom-fit-best-symbolic True False zoom-in-symbolic True False zoom-original-symbolic True False zoom-out-symbolic True False action-unavailable-symbolic True False object-select-symbolic True False edit-copy-symbolic True False edit-delete-symbolic True False 16 insert-text-symbolic True False document-save-as-symbolic True False scanner-symbolic True False document-open-symbolic True False edit-clear-symbolic True False user-trash-symbolic True False edit-paste True False 16 document-open-recent True False list-remove-symbolic True False 16 camera-photo True False Recent True False image:sources.images.recent False True False Paste True False image:sources.images.paste False Take Screenshot True False image:sources.images.screenshot False True False object-select-symbolic True False edit-delete-symbolic True False view-refresh-symbolic True False False True False vertical True True 99999 True True True True True True True True False vertical True False 2 2 2 2 2 True False True True True Add images image:sources.images.add False True 0 True True False Add Images menu:sources.images.add False True False 4 down False True 1 False True 0 True False True True Remove image from list image:sources.images.remove none False True 1 True False True True Delete image image:sources.images.delete none False True 2 True False True True Clear list image:sources.images.clear none False True 3 False True 0 True True in True True False True False 0 2 multiple True True 1 True False Files False True False 2 2 2 2 True True False Device: 0 0 0 True False True False liststore:sources.acquire.device False True True 0 True True True Refresh True False 16 view-refresh-symbolic 1 False True 1 True False True False True 2 1 0 True False Output: 0 0 1 True True True True False 2 True False True start True True True 0 True False document-open-symbolic False True 1 1 1 True False Mode: 0 0 2 True False 0 Color Grayscale 1 2 True False Resolution: 0 0 3 True False 2 75 dpi 100 dpi 200 dpi 300 dpi 600 dpi 1200 dpi 1 3 True False True 0 4 2 True False vertical start Scan True False True True image:sources.acquire.scan False True 0 0 5 2 1 True False Acquire 1 False False False True False vertical False False True False True Brightness True True â— 7 0 True False adjustment:display.brightness True True False False True False True Contrast True True â— 7 0 True False adjustment:display.contrast True True False False True False True Resolution True True â— 7 200 True False adjustment:display.resolution True True 100 False False True False Invert colors True True False 0 True False False True False True False False True 0 True True in False True True GDK_POINTER_MOTION_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK | GDK_STRUCTURE_MASK none True center center True True 1 True False True False True True 0 True False True False True True 0 False True False center False True 0 True True True image:main.progress.cancel False True 1 False True 1 False True 2 True False gImageReader True True True False image:main.sources True True False True True False Zoom in image:main.zoomin False True 0 True True False Zoom out image:main.zoomout False True 1 True True False Normal size image:main.zoomnormsize False True 2 True True False Best fit image:main.zoomfit False True 3 1 True False True True False Select rotation mode menu:display.rotate.mode False True False True False True Select insert mode /org/gnome/gimagereader/rotate_pages.png False True 0 True False down False True 1 False True 0 True True 5 • 10 5 0.0 0.5 True object-rotate-left-symbolic object-rotate-right-symbolic adjustment:display.rotate 1 1 True True True False True 1 2 True â— 6 1 True False view-paged-symbolic False adjustment:display.page 1 3 True True False Image controls image:main.controls 4 True False True False Plain text hOCR, PDF False True 0 True True Autodetect layout image:main.autolayout False True 1 True True True True False True True False <small>Recognize all</small> True center 1 0 True False <small>English (en_US)</small> True 1 1 True False insert-text-symbolic 2 0 0 2 False True 2 True True False Select language menu:main.languages False True False 4 down False True 3 5 True True False image:main.outputpane 6 True False none True False applications-system-symbolic end 7 False 5 False center-on-parent True help-about menu True True applicationwindow:main gImageReader Copyright © 2009-2017 Sandro Mani A graphical frontend to tesseract-ocr https://github.com/manisandro/gImageReader/ Sandro Mani <manisandro@gmail.com> Chinese (CN): Timothy Lee <timothy.ty.lee@gmail.com> Chinese (HK): Timothy Lee <timothy.ty.lee@gmail.com> Chinese (TW): Timothy Lee <timothy.ty.lee@gmail.com> Czech: Pavel Borecki <pavel.borecki@gmail.com> French: Sandro Mani <manisandro@gmail.com> German: Sandro Mani <manisandro@gmail.com> Greek: Dimitris Spingos <dmtrs32@gmail.com> Italian: Sandro Mani <manisandro@gmail.com> Polish: Piotr Brol <peterb@inetia.pl> Portuguese (BR): André Alencar <andre.tre@gmail.com>, Felipe Braga <fbobraga@gmail.com> Russian: Oleg Moiseichuk <berroll@mail.ru> Slovenian: Bernard Banko <beernarrd@gmail.com> Spanish: Antonio Trujillo <lunatc@gmail.com> Swedish: Mats Olofsson <mats.olofsson@bokforlaget-alerta.se> Turkish: Necdet Yucel <necdetyucel@gmail.com> Ukranian: Yuriy Bahriy <yhmtargaryen@gmail.com> gimagereader gpl-3-0 False vertical 2 False end False True end 0 True False False True 2 False 5 Preferences center-on-parent 500 True preferences-system dialog applicationwindow:main False vertical 2 False end Help True True True image:config.help False True 0 OK True True True image:config.ok False True 2 True True end 0 True False 3 True False Output pane orientation: 0 0 0 True False True Horizontal Vertical 1 0 Query to install missing spellcheck dictionaries True True False 0 True 0 2 2 Automatically check for new program versions True True False 0 True 0 3 2 True False 0 4 2 True False Predefined language definitions: True 0 0 9 2 75 True True True never always in True True 0 10 2 True False Additional language definitions: True True 0 0 11 2 75 True True True never always in True True 0 12 2 True False 3 True start Add True True True image:config.langs.custom.edit.add False True 0 Remove True False True True image:config.langs.custom.edit.remove False True 1 0 13 2 False 3 True True True The prefix of the tesseract language data file â— 2 Prefix True True 0 10 True True True The ISO 639-1 language code followed by the country code â— 2 ISO Code True True 1 10 True True True The name of the language â— 2 Name True True 2 OK True True True image:config.langs.custom.add.ok False True 3 Cancel True True True image:config.langs.custom.add.cancel 0.56000000238418579 False True 4 0 14 2 True False Output pane font: 0 0 1 True False 3 Default True True False 0 True True False True 0 True False True True Sans 12 True True 1 1 1 True False Language data locations: 0 0 5 True False 10 Language definitions path: 0 0 6 True False 10 Spelling dictionaries path: 0 0 7 True False vertical 0 8 2 True False System-wide paths User paths 1 5 True True False 1 6 True True False 1 7 True True 1 button:config.help button:config.ok vertical False 5 Page Range False center-on-parent True edit-copy dialog True True applicationwindow:main True False vertical 2 True False end Cancel True True True image:pages:cancel False False 0 OK True True True image:pages:ok False False 1 False True end 4 True False 2 2 True True True â— 1 0 True False Page range: True 0 0 0 True False True <small><b>Example:</b> 1-10, 13, 14-18</small> True 0 1 1 True False Recognition area: True 0 0 2 True False True Entire page Autodetect 1 2 True False 0 1 False True 0 True False vertical True False Prepend to output text: 0 False True 0 Source filename True True False True False True 1 Source page True True False True False True 2 False True 2 button:pages:cancel button:pages:ok False Tessdata Manager center-on-parent 320 320 True dialog True True applicationwindow:main False vertical 2 False end Apply True True True image:tessdatamanager.apply True True 0 Close True True True image:tessdatamanager.close True True 1 Refresh True True True image:tessdatamanager.refresh True True 2 False False 0 True False vertical True False Manage installed languages: 0 False True 0 True True never in True True False 1 False True True 1 True True 1 button:tessdatamanager.apply button:tessdatamanager.close button:tessdatamanager.refresh both False True True True 2 popup False True True popup-menu True True True False False viewport:display True False 2 Delete True True True image:selectionmenu.delete none 0 True 0 2 2 True False Order: 0 0 True True True True â— 2 number adjustment:selectionmenu.order True 1 0 Recognize True True True image:selectionmenu.recognize none 0 True 0 3 2 Recognize to clipboard True True True image:selectionmenu.clipboard none 0 True 0 4 2 True False 0 1 2 Save as image True True True image:selectionmenu:save none 0 True 0 5 2 True False True False Current Page True True False Multiple Pages... True gImageReader-3.2.3/gtk/data/org.gnome.gimagereader.gschema.xml000066400000000000000000000232441312567024200241760ustar00rootroot00000000000000 1 Output pane orientation Output pane orientation. true Whether to use the system default font in the output pane Whether to use the system default font in the output pane. "Sans 10" Output pane font Output pane font. false Show advanced controls Show advanced controls. true Autoinstall missing spelling dictionaries Autoinstall missing spelling dictionaries. true Automatically check for updates Automatically check for updates. "eng:en_EN" Default recongition language Default recongition language. "" Custom language definitions Custom language definitions. 150 Scanning resolution Scanning resolution in dpi. 0 Scanning device Scanning device. 0 Scanning mode Scanning mode. "" Output path for scanned files Output path for scanned files. [0,0,640,480] Window geometry Window geometry. true Keep line break if preceded by dot Keep line break if preceded by dot. false Keep line break if preceded by quote Keep line break if preceded by quote. true Join word split by hypen Join word split by hyphen. true Clean whitespace Clean whitespace. true Preserve paragraphs Preserve paragraphs. false Draw whitespace Draw whitespace. 0 OCR Page Region Strategy Whether to recognize the entire page or peform page layout autodetection. "" Replacement list List of search-replace strings. "" Path of replacement list Path of replacement list. "" Path for saving selections Path for saving selections. false Match case when searching Match case when searching. "" Output directory for OCR output Output directory for OCR output. 6 Page segmentation mode Page segmentation mode. 0 Default output editor Default output editor. 0 PDF export mode PDF export mode. "Sans 10" Font to use for PDFs Font to use for PDFs. true Use detected font sizes in PDFs Whether to use detected font sizes when generating PDFs. false Uniformize line spacing Whether to uniformize line spacing when generating PDFs. 4 Preserve spaces wider than Preserve spaces wider than the specified number of characters when generating PDFs with uniformized spacing. 0 Image color format for PDF output Image color format for PDF output: color (0), grayscale (1) or monochrome (2). 0 Compression for images in PDF output Compression for images in PDF output: Zip (0) or Jpeg (1). 90 Compression quality for images in PDF output Compression quality for images in PDF output: [0-100]. false Whether to display a preview when exporting to PDF Whether to display a preview when exporting to PDF. 0 Where to look for tessdata and spelling files Whether to look in system-wide (0) or user paths (1) for tessdata and spelling files. 100 Scaling factor for detected font sizes Scaling factor for detected font sizes. 300 Resolution at which to export images in the PDF Resolution at which to export images in the PDF. 0 Image conversion flags Image conversion flags. false Prepend filename to output Whether to prepend the filename to the output text. false Prepend page number to output Whether to prepend the page number to the output text. gImageReader-3.2.3/gtk/src/000077500000000000000000000000001312567024200154115ustar00rootroot00000000000000gImageReader-3.2.3/gtk/src/Acquirer.cc000066400000000000000000000167231312567024200175040ustar00rootroot00000000000000/* -*- Mode: C++; indent-tabs-mode: t; c-basic-offset: 4; tab-width: 4 -*- */ /* * Acquirer.cc * Copyright (C) 2013-2017 Sandro Mani * * gImageReader 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. * * gImageReader 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 this program. If not, see . */ #include "Acquirer.hh" #include "Config.hh" #include "FileDialogs.hh" #include "MainWindow.hh" #include "Utils.hh" #ifdef G_OS_WIN32 #include "scanner/ScannerTwain.hh" #else #include "scanner/ScannerSane.hh" #endif Acquirer::Acquirer() { m_devCombo = MAIN->getWidget("combo:sources.acquire.device"); m_refreshButton = MAIN->getWidget("button:inpute.acquire.device.refresh"); m_refreshSpinner = MAIN->getWidget("spinner:sources.acquire.device"); m_resCombo = MAIN->getWidget("combo:sources.acquire.resolution"); m_modeCombo = MAIN->getWidget("combo:sources.acquire.mode"); m_msgLabel = MAIN->getWidget("label:sources.acquire.message"); m_outputLabel = MAIN->getWidget("label:sources.acquire.outputname"); m_buttonBox = MAIN->getWidget("buttonbox:sources.acquire"); m_scanButton = MAIN->getWidget("button:sources.acquire.scan"); m_cancelButton = Gtk::manage(new Gtk::Button(_("Cancel"))); m_cancelButton->set_image_from_icon_name("dialog-cancel", Gtk::ICON_SIZE_BUTTON); m_cancelButton->show(); m_devCombo->set_model(Gtk::ListStore::create(m_devComboCols)); Gtk::CellRendererText* cell = Gtk::manage(new Gtk::CellRendererText); cell->property_ellipsize() = Pango::ELLIPSIZE_END; m_devCombo->pack_start(*cell, true); m_devCombo->add_attribute(*cell, "text", 0); if(m_resCombo->get_active_row_number() == -1) m_resCombo->set_active(2); if(m_modeCombo->get_active_row_number() == -1) m_modeCombo->set_active(0); m_scanner = new ScannerImpl; CONNECT(m_refreshButton, clicked, [this] { startDetectDevices(); }); CONNECT(m_scanButton, clicked, [this] { startScan(); }); CONNECT(m_cancelButton, clicked, [this] { cancelScan(); }); CONNECT(MAIN->getWidget("button:sources.acquire.output").as(), clicked, [this] { selectOutputPath(); }); CONNECT(m_devCombo, changed, [this] { setDeviceComboTooltip(); }); CONNECT(m_scanner, initFailed, [this] { scanInitFailed(); }); CONNECT(m_scanner, devicesDetected, [this](const std::vector& devices) { doneDetectDevices(devices); }); CONNECT(m_scanner, scanFailed, [this](const std::string& msg) { scanFailed(msg); }); CONNECT(m_scanner, scanStateChanged, [this](Scanner::State state) { setScanState(state); }); CONNECT(m_scanner, pageAvailable, [this](const std::string& file) { m_signal_scanPageAvailable.emit(file); }); MAIN->getConfig()->addSetting(new ComboSetting("scanres", MAIN->getWidget("combo:sources.acquire.resolution"))); MAIN->getConfig()->addSetting(new ComboSetting("scanmode", MAIN->getWidget("combo:sources.acquire.mode"))); MAIN->getConfig()->addSetting(new VarSetting("scanoutput")); MAIN->getConfig()->addSetting(new ComboSetting("scandev", MAIN->getWidget("combo:sources.acquire.device"))); m_outputPath = MAIN->getConfig()->getSetting>("scanoutput")->getValue(); if(m_outputPath.empty()) { m_outputPath = Glib::build_filename(Utils::get_documents_dir(), _("scan.png")); } genOutputPath(); m_scanner->init(); } Acquirer::~Acquirer() { m_scanner->close(); delete m_scanner; } void Acquirer::selectOutputPath() { FileDialogs::FileFilter filter = FileDialogs::FileFilter::pixbuf_formats(); filter.name = _("Images"); std::string filename = FileDialogs::save_dialog(_("Choose Output Filename..."), m_outputPath, filter); if(!filename.empty()) { m_outputPath = filename; genOutputPath(); } } void Acquirer::genOutputPath() { m_outputPath = Utils::make_output_filename(m_outputPath); m_outputLabel->set_text(m_outputPath); m_outputLabel->set_tooltip_text(m_outputPath); MAIN->getConfig()->getSetting>("scanoutput")->setValue(m_outputPath); } void Acquirer::scanInitFailed() { m_msgLabel->set_markup(Glib::ustring::compose("%1", _("Failed to initialize the scanning backend."))); m_scanButton->set_sensitive(false); m_refreshButton->set_sensitive(false); m_refreshButton->show(); m_refreshSpinner->hide(); m_refreshSpinner->stop(); } void Acquirer::scanFailed(const Glib::ustring &msg) { m_msgLabel->set_markup(Glib::ustring::compose("%1: %2", _("Scan failed"), msg)); } void Acquirer::startDetectDevices() { m_refreshButton->hide(); m_refreshSpinner->show(); m_refreshSpinner->start(); m_msgLabel->set_text(""); m_devCombo->set_model(Gtk::ListStore::create(m_devComboCols)); m_scanButton->set_sensitive(false); m_scanner->redetect(); } void Acquirer::doneDetectDevices(const std::vector& devices) { m_refreshButton->show(); m_refreshSpinner->hide(); m_refreshSpinner->stop(); if(devices.empty()) { m_msgLabel->set_markup(Glib::ustring::compose("%1", _("No scanners were detected."))); } else { Glib::RefPtr store = Glib::RefPtr::cast_static(m_devCombo->get_model()); for(const Scanner::Device& device : devices) { Gtk::TreeIter it = store->append(); it->set_value(m_devComboCols.label, device.label); it->set_value(m_devComboCols.name, device.name); } m_devCombo->set_active(0); m_scanButton->set_sensitive(true); } } void Acquirer::startScan() { m_buttonBox->remove(*m_scanButton); m_cancelButton->set_sensitive(true); m_buttonBox->pack_start(*m_cancelButton, false, true); m_msgLabel->set_text(_("Starting scan...")); double res[] = {75., 100., 200., 300., 600., 1200.}; Scanner::ScanMode modes[] = {Scanner::ScanMode::COLOR, Scanner::ScanMode::GRAY}; genOutputPath(); std::string device = (*m_devCombo->get_active())[m_devComboCols.name]; Scanner::Params params = {device, m_outputPath, res[m_resCombo->get_active_row_number()], modes[m_modeCombo->get_active_row_number()], 8, Scanner::ScanType::SINGLE, 0, 0}; m_scanner->scan(params); genOutputPath(); } void Acquirer::setScanState(Scanner::State state) { if(state == Scanner::State::OPEN) { m_msgLabel->set_text(_("Opening device...")); } else if(state == Scanner::State::SET_OPTIONS) { m_msgLabel->set_text(_("Setting options...")); } else if(state == Scanner::State::START) { m_msgLabel->set_text(_("Starting scan...")); } else if(state == Scanner::State::GET_PARAMETERS) { m_msgLabel->set_text(_("Getting parameters...")); } else if(state == Scanner::State::READ) { m_msgLabel->set_text(_("Transferring data...")); } else if(state == Scanner::State::IDLE) { doneScan(); } } void Acquirer::cancelScan() { m_msgLabel->set_text(_("Canceling scan...")); m_scanner->cancel(); m_cancelButton->set_sensitive(false); } void Acquirer::doneScan() { m_buttonBox->remove(*m_cancelButton); m_buttonBox->pack_start(*m_scanButton, false, true); m_msgLabel->set_text(""); } void Acquirer::setDeviceComboTooltip() { auto it = m_devCombo->get_active(); m_devCombo->set_tooltip_text(it ? static_cast((*it)[m_devComboCols.label]) : ""); } gImageReader-3.2.3/gtk/src/Acquirer.hh000066400000000000000000000040761312567024200175140ustar00rootroot00000000000000/* -*- Mode: C++; indent-tabs-mode: t; c-basic-offset: 4; tab-width: 4 -*- */ /* * Acquirer.hh * Copyright (C) 2013-2017 Sandro Mani * * gImageReader 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. * * gImageReader 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 this program. If not, see . */ #ifndef ACQUIRER_HH #define ACQUIRER_HH #include "common.hh" #include "Scanner.hh" class Acquirer { public: Acquirer(); ~Acquirer(); sigc::signal signal_scanPageAvailable() const { return m_signal_scanPageAvailable; } private: class DevicesComboColumns : public Gtk::TreeModel::ColumnRecord { public: Gtk::TreeModelColumn label; Gtk::TreeModelColumn name; DevicesComboColumns() { add(label); add(name); } }; Gtk::Button* m_refreshButton; Gtk::Button* m_scanButton; Gtk::Button* m_cancelButton; Gtk::ButtonBox* m_buttonBox; Gtk::ComboBox* m_devCombo; Gtk::ComboBox* m_modeCombo; Gtk::ComboBox* m_resCombo; Gtk::Label* m_msgLabel; Gtk::Label* m_outputLabel; Gtk::Spinner* m_refreshSpinner; DevicesComboColumns m_devComboCols; std::string m_outputPath; sigc::signal m_signal_scanPageAvailable; Scanner* m_scanner = nullptr; void genOutputPath(); void cancelScan(); void doneDetectDevices(const std::vector& devices); void doneScan(); void scanInitFailed(); void scanFailed(const Glib::ustring& msg); void selectOutputPath(); void setDeviceComboTooltip(); void setScanState(Scanner::State state); void startDetectDevices(); void startScan(); }; #endif // ACQUIRER_HH gImageReader-3.2.3/gtk/src/Application.hh000066400000000000000000000052301312567024200201750ustar00rootroot00000000000000/* -*- Mode: C++; indent-tabs-mode: t; c-basic-offset: 4; tab-width: 4 -*- */ /* * Application.hh * Copyright (C) 2013-2017 Sandro Mani * * gImageReader 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. * * gImageReader 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 this program. If not, see . */ #ifndef APPLICATION_HPP #define APPLICATION_HPP #include "common.hh" #include "MainWindow.hh" class Application : public Gtk::Application { public: Application(int &argc, char **&argv, const Glib::ustring &application_id, Gio::ApplicationFlags flags) : Gtk::Application(argc, argv, application_id, flags) { Glib::set_application_name(PACKAGE_NAME); } private: void on_activate() override { if(m_mainWindow) { m_mainWindow->getWindow()->present(); } } void on_startup() override { Gtk::Application::on_startup(); add_action("redetectLangs", [this] { m_mainWindow->redetectLanguages(); }); add_action("preferences", [this] { m_mainWindow->showConfig(); }); add_action("help", [this] { m_mainWindow->showHelp(); }); add_action("about", [this] { m_mainWindow->showAbout(); }); add_action("quit", [this] { on_quit(); }); Glib::RefPtr appMenuBuilder = Gtk::Builder::create_from_resource("/org/gnome/gimagereader/appmenu.ui"); Glib::RefPtr menuModel = Glib::RefPtr::cast_static(appMenuBuilder->get_object("appmenu")); bool appMenu = false; #if GTK_CHECK_VERSION(3,14,0) appMenu = prefers_app_menu(); #endif if(appMenu) { set_app_menu(menuModel); } g_assert(m_mainWindow == nullptr); m_mainWindow = new MainWindow(); CONNECT(m_mainWindow->getWindow(), hide, [this] { on_quit(); }); if(!appMenu) { m_mainWindow->setMenuModel(menuModel); } add_window(*m_mainWindow->getWindow()); m_mainWindow->getWindow()->show(); } void on_open(const type_vec_files& files, const Glib::ustring& /*hint*/) override { m_mainWindow->openFiles(files); m_mainWindow->getWindow()->present(); } void on_quit() { if(m_mainWindow) { remove_window(*m_mainWindow->getWindow()); delete m_mainWindow; m_mainWindow = nullptr; } } MainWindow* m_mainWindow = nullptr; }; #endif // APPLICATION_HPP gImageReader-3.2.3/gtk/src/Config.cc000066400000000000000000000564571312567024200171460ustar00rootroot00000000000000/* -*- Mode: C++; indent-tabs-mode: t; c-basic-offset: 4; tab-width: 4 -*- */ /* * Config.cc * Copyright (C) 2013-2017 Sandro Mani * * gImageReader 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. * * gImageReader 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 this program. If not, see . */ #include "Config.hh" #include "MainWindow.hh" #include "Utils.hh" #include const std::vector Config::LANGUAGES = { // {ISO 639-2, ISO 639-1, name} {"afr", "af", "Afrikaans"}, // Afrikaans {"amh", "am", "\u12a0\u121b\u122d\u129b"}, // Amharic {"ara", "ar", "\u0627\u0644\u0639\u0631\u0628\u064a\u0629"}, // Arabic {"asm", "as", "\u0985\u09b8\u09ae\u09c0\u09af\u09bc\u09be"}, // Assamese {"aze", "az", "\u0622\u0630\u0631\u0628\u0627\u06cc\u062c\u0627\u0646"}, // Azerbaijani {"aze_cyrl", "az", "Az\u0259rbaycan dili"}, // Azerbaijani (Cyrillic) {"bel", "be", "\u0431\u0435\u043b\u0430\u0440\u0443\u0441\u043a\u0430\u044f \u043c\u043e\u0432\u0430"}, // Belarusian {"ben", "bn", "\u09ac\u09be\u0982\u09b2\u09be"}, // Bengali {"bod", "bo", "\u0f56\u0f7c\u0f51\u0f0b\u0f61\u0f72\u0f42"}, // "Tibetan (Standard)" {"bos", "bs", "Bosanski jezik"}, // Bosnian {"bul", "bg", "\u0431\u044a\u043b\u0433\u0430\u0440\u0441\u043a\u0438 \u0435\u0437\u0438\u043a"}, // Bulgarian {"cat", "ca", "Catal\u00e0"}, // Catalan {"ceb", "", "Cebuano"}, // Cebuano {"ces", "cs", "\u010ce\u0161tina"}, // Czech {"chi_sim", "zh_CN", "\u7b80\u4f53\u5b57"}, // Chinese (Simplified) {"chi_tra", "zh_TW", "\u7e41\u9ad4\u5b57"}, // Chinese (Traditional) {"chr", "", "\u13e3\u13b3\u13a9 \u13a6\u13ec\u13c2\u13af\u13cd\u13d7"}, // Cherokee {"cym", "cy", "Cymraeg"}, // Welsh {"dan", "da", "Dansk"}, // Danish {"dan_frak", "da", "Dansk (Fraktur)"}, // Danish (Fraktur) {"deu", "de", "Deutsch"}, // German {"deu_frak", "de", "Deutsch (Fraktur)"}, // German (Fraktur) {"dzo", "dz", "\u0f62\u0fab\u0f7c\u0f44\u0f0b\u0f41"}, // Dzongkha {"ell", "el", "\u03b5\u03bb\u03bb\u03b7\u03bd\u03b9\u03ba\u03ac"}, // Greek {"eng", "en", "English"}, {"enm", "en", "Middle English (1100-1500)"}, // Middle English (1100-1500) {"epo", "eo", "Esperanto"}, // Esperanto {"equ", "", "Math / Equations"}, // Math / equation {"est", "et", "Eesti keel"}, // Estonian {"eus", "eu", "Euskara"}, // Basque {"fas", "fa", "\u0641\u0627\u0631\u0633\u06cc"}, // Persian (Farsi) {"fin", "fi", "Suomen kieli"}, // Finnish {"fra", "fr", "Fran\u00e7ais"}, // French {"frk", "", "Frankish"}, // Frankish {"frm", "fr", "Moyen fran\u00e7ais (ca. 1400-1600)"}, // Middle French (ca. 1400-1600) {"gle", "ga", "Gaeilge"}, // Irish {"glg", "gl", "Galego"}, // Galician {"grc", "el", "\u1f19\u03bb\u03bb\u03b7\u03bd\u03b9\u03ba\u03ae"}, // Ancient Greek {"guj", "gu", "\u0a97\u0ac1\u0a9c\u0ab0\u0abe\u0aa4\u0ac0"}, // Gujarati {"hat", "ht", "Krey\u00f2l ayisyen"}, // Haitian {"heb", "he", "\u05e2\u05d1\u05e8\u05d9\u05ea"}, // Hebrew {"hin", "hi", "\u0939\u093f\u0928\u094d\u0926\u0940"}, // Hindi {"hrv", "hr", "Hrvatski"}, // Croatian {"hun", "hu", "Magyar"}, // Hungarian {"iku", "iu", "Inuktitut"}, // Inuktitut {"ind", "id", "Bahasa indonesia"}, // Indonesian {"isl", "is", "\u00cdslenska"}, // Icelandic {"ita", "it", "Italiano"}, // Italian {"ita_old", "it", "Italiano (Antico)"}, // Italian (Old) {"jav", "jv", "Basa jawa"}, // Javanese {"jpn", "ja", "\u65e5\u672c\u8a9e"}, // Japanese {"kan", "kn", "\u0c95\u0ca8\u0ccd\u0ca8\u0ca1"}, // Kannada {"kat", "ka", "\u10e5\u10d0\u10e0\u10d7\u10e3\u10da\u10d8"}, // Georgian {"kat_old", "ka", "\u10d4\u10dc\u10d0\u10f2 \u10e5\u10d0\u10e0\u10d7\u10e3\u10da\u10d8"}, // Georgian (Old) {"kaz", "kk", "\u049b\u0430\u0437\u0430\u049b \u0442\u0456\u043b\u0456"}, // Kazakh {"khm", "km", "\u1781\u17d2\u1798\u17c2\u179a"}, // Khmer {"kir", "ky", "\u041a\u044b\u0440\u0433\u044b\u0437\u0447\u0430"}, // Kyrgyz {"kor", "ko", "\ud55c\uad6d\uc5b4"}, // Korean {"kur", "ku", "\u0643\u0648\u0631\u062f\u06cc"}, // Kurdish {"lao", "lo", "\u0e9e\u0eb2\u0eaa\u0eb2\u0ea5\u0eb2\u0ea7"}, // Lao {"lat", "la", "Latina"}, // Latin {"lav", "lv", "Latvie\u0161u valoda"}, // Latvian {"lit", "lt", "Lietuvos"}, // Lithuanian {"mal", "ml", "\u0d2e\u0d32\u0d2f\u0d3e\u0d33\u0d02"}, // Malayalam {"mar", "mr", "\u092e\u0930\u093e\u0920\u0940"}, // Marathi {"mkd", "mk", "\u043c\u0430\u043a\u0435\u0434\u043e\u043d\u0441\u043a\u0438 \u0458\u0430\u0437\u0438\u043a"}, // Macedonian {"mlt", "mt", "Malti"}, // Maltese {"msa", "ms", "Melayu"}, // Malay {"mya", "my", "\u1017\u1019\u102c\u1005\u102c"}, // Burmese {"nep", "ne", "\u0928\u0947\u092a\u093e\u0932\u0940"}, // Nepali {"nld", "nl", "Nederlands"}, // Dutch {"nor", "no", "Norsk"}, // Norwegian {"ori", "or", "\u0b13\u0b21\u0b3c\u0b3f\u0b06"}, // Oriya {"pan", "pa", "\u0a2a\u0a70\u0a1c\u0a3e\u0a2c\u0a40"}, // Panjabi {"pol", "pl", "Polskie"}, // Polish {"por", "pt", "Portugu\u00eas"}, // Portuguese {"pus", "ps", "\u067e\u069a\u062a\u0648"}, // Pashto {"ron", "ro", "Limba rom\u00e2n\u0103"}, // Romanian {"rus", "ru", "\u0420\u0443\u0441\u0441\u043a\u0438\u0439"}, // Russian {"san", "sa", "\u0938\u0902\u0938\u094d\u0915\u0943\u0924\u092e\u094d"}, // Sanskrit {"sin", "si", "\u0dc3\u0dd2\u0d82\u0dc4\u0dbd"}, // Sinhala {"slk", "sk", "Sloven\u010dina"}, // Slovak {"slk_frak", "sk", "Sloven\u010dina (Frakt\u00far)"}, // Slovak (Fraktur) {"slv", "sl", "Sloven\u0161\u010dina"}, // Slovene {"spa", "es", "Espa\u00f1ol"}, // Spanish {"spa_old", "es", "Espa\u00f1ol (Antiguo)"}, // Spanish (Old) {"sqi", "sq", "Shqip"}, // Albanian {"srp", "sr", "\u0441\u0440\u043f\u0441\u043a\u0438 \u0458\u0435\u0437\u0438\u043a"}, // Serbian {"srp_latn", "sr", "Srpski"}, // Serbian (Latin) {"swa", "sw", "Swahili"}, // Swahili {"swe", "sv", "Svenska"}, // Swedish {"syr", "", "\u0720\u072b\u0722\u0710 \u0723\u0718\u072a\u071d\u071d\u0710"}, // Syriac {"tam", "ta", "\u0ba4\u0bae\u0bbf\u0bb4\u0bcd"}, // Tamil {"tel", "te", "\u0c24\u0c46\u0c32\u0c41\u0c17\u0c41"}, // Telugu {"tgk", "tg", "\u0442\u043e\u04b7\u0438\u043a\u04e3"}, // Tajik {"tgl", "tl", "Tagalog"}, // Tagalog {"tha", "th", "\u0e44\u0e17\u0e22"}, // Thai {"tir", "ti", "\u1275\u130d\u122d\u129b"}, // Tigrinya {"tur", "tr", "T\u00fcrk\u00e7e"}, // Turkish {"uig", "ug", "\u0626\u06c7\u064a\u063a\u06c7\u0631\u0686\u06d5\u200e"}, // Uyghur {"ukr", "uk", "\u0443\u043a\u0440\u0430\u0457\u043d\u0441\u044c\u043a\u0430 \u043c\u043e\u0432\u0430"}, // Ukrainian {"urd", "ur", "\u0627\u0631\u062f\u0648"}, // Urdu {"uzb", "uz", "O\u02bbzbek"}, // Uzbek {"uzb_cyrl", "uz", "\u040e\u0437\u0431\u0435\u043a"}, // Uzbek (Cyrillic) {"vie", "vi", "Vi\u1ec7t Nam"}, // Vietnamese {"yid", "yi", "\u05d9\u05d9\u05b4\u05d3\u05d9\u05e9"}, // Yiddish }; std::multimap Config::buildLanguageCultureTable() { std::multimap map; map.insert(std::make_pair("af", "af_ZA")); map.insert(std::make_pair("ar", "ar_AE")); map.insert(std::make_pair("ar", "ar_BH")); map.insert(std::make_pair("ar", "ar_DZ")); map.insert(std::make_pair("ar", "ar_EG")); map.insert(std::make_pair("ar", "ar_IQ")); map.insert(std::make_pair("ar", "ar_JO")); map.insert(std::make_pair("ar", "ar_KW")); map.insert(std::make_pair("ar", "ar_LB")); map.insert(std::make_pair("ar", "ar_LY")); map.insert(std::make_pair("ar", "ar_MA")); map.insert(std::make_pair("ar", "ar_OM")); map.insert(std::make_pair("ar", "ar_QA")); map.insert(std::make_pair("ar", "ar_SA")); map.insert(std::make_pair("ar", "ar_SY")); map.insert(std::make_pair("ar", "ar_TN")); map.insert(std::make_pair("ar", "ar_YE")); map.insert(std::make_pair("az", "az_AZ")); map.insert(std::make_pair("az", "az_AZ")); map.insert(std::make_pair("be", "be_BY")); map.insert(std::make_pair("bg", "bg_BG")); map.insert(std::make_pair("ca", "ca_ES")); map.insert(std::make_pair("cs", "cs_CZ")); map.insert(std::make_pair("da", "da_DK")); map.insert(std::make_pair("de", "de_AT")); map.insert(std::make_pair("de", "de_CH")); map.insert(std::make_pair("de", "de_DE")); map.insert(std::make_pair("de", "de_LI")); map.insert(std::make_pair("de", "de_LU")); map.insert(std::make_pair("div", "div_MV)")); map.insert(std::make_pair("el", "el_GR")); map.insert(std::make_pair("en", "en_AU")); map.insert(std::make_pair("en", "en_BZ")); map.insert(std::make_pair("en", "en_CA")); map.insert(std::make_pair("en", "en_CB")); map.insert(std::make_pair("en", "en_GB")); map.insert(std::make_pair("en", "en_IE")); map.insert(std::make_pair("en", "en_JM")); map.insert(std::make_pair("en", "en_NZ")); map.insert(std::make_pair("en", "en_PH")); map.insert(std::make_pair("en", "en_TT")); map.insert(std::make_pair("en", "en_US")); map.insert(std::make_pair("en", "en_ZA")); map.insert(std::make_pair("en", "en_ZW")); map.insert(std::make_pair("es", "es_AR")); map.insert(std::make_pair("es", "es_BO")); map.insert(std::make_pair("es", "es_CL")); map.insert(std::make_pair("es", "es_CO")); map.insert(std::make_pair("es", "es_CR")); map.insert(std::make_pair("es", "es_DO")); map.insert(std::make_pair("es", "es_EC")); map.insert(std::make_pair("es", "es_ES")); map.insert(std::make_pair("es", "es_GT")); map.insert(std::make_pair("es", "es_HN")); map.insert(std::make_pair("es", "es_MX")); map.insert(std::make_pair("es", "es_NI")); map.insert(std::make_pair("es", "es_PA")); map.insert(std::make_pair("es", "es_PE")); map.insert(std::make_pair("es", "es_PR")); map.insert(std::make_pair("es", "es_PY")); map.insert(std::make_pair("es", "es_SV")); map.insert(std::make_pair("es", "es_UY")); map.insert(std::make_pair("es", "es_VE")); map.insert(std::make_pair("et", "et_EE")); map.insert(std::make_pair("eu", "eu_ES")); map.insert(std::make_pair("fa", "fa_IR")); map.insert(std::make_pair("fi", "fi_FI")); map.insert(std::make_pair("fo", "fo_FO")); map.insert(std::make_pair("fr", "fr_BE")); map.insert(std::make_pair("fr", "fr_CA")); map.insert(std::make_pair("fr", "fr_CH")); map.insert(std::make_pair("fr", "fr_FR")); map.insert(std::make_pair("fr", "fr_LU")); map.insert(std::make_pair("fr", "fr_MC")); map.insert(std::make_pair("gl", "gl_ES")); map.insert(std::make_pair("gu", "gu_IN")); map.insert(std::make_pair("he", "he_IL")); map.insert(std::make_pair("hi", "hi_IN")); map.insert(std::make_pair("hr", "hr_HR")); map.insert(std::make_pair("hu", "hu_HU")); map.insert(std::make_pair("hy", "hy_AM")); map.insert(std::make_pair("id", "id_ID")); map.insert(std::make_pair("is", "is_IS")); map.insert(std::make_pair("it", "it_CH")); map.insert(std::make_pair("it", "it_IT")); map.insert(std::make_pair("ja", "ja_JP")); map.insert(std::make_pair("ka", "ka_GE")); map.insert(std::make_pair("kk", "kk_KZ")); map.insert(std::make_pair("kn", "kn_IN")); map.insert(std::make_pair("kok", "kok_IN")); map.insert(std::make_pair("ko", "ko_KR")); map.insert(std::make_pair("ky", "ky_KZ")); map.insert(std::make_pair("lt", "lt_LT")); map.insert(std::make_pair("lv", "lv_LV")); map.insert(std::make_pair("mk", "mk_MK")); map.insert(std::make_pair("mn", "mn_MN")); map.insert(std::make_pair("mr", "mr_IN")); map.insert(std::make_pair("ms", "ms_BN")); map.insert(std::make_pair("ms", "ms_MY")); map.insert(std::make_pair("nb", "nb_NO")); map.insert(std::make_pair("nl", "nl_BE")); map.insert(std::make_pair("nl", "nl_NL")); map.insert(std::make_pair("nn", "nn_NO")); map.insert(std::make_pair("pa", "pa_IN")); map.insert(std::make_pair("pl", "pl_PL")); map.insert(std::make_pair("pt", "pt_BR")); map.insert(std::make_pair("pt", "pt_PT")); map.insert(std::make_pair("ro", "ro_RO")); map.insert(std::make_pair("ru", "ru_RU")); map.insert(std::make_pair("sa", "sa_IN")); map.insert(std::make_pair("sk", "sk_SK")); map.insert(std::make_pair("sl", "sl_SI")); map.insert(std::make_pair("sq", "sq_AL")); map.insert(std::make_pair("sr", "sr_SP")); map.insert(std::make_pair("sr", "sr_SP")); map.insert(std::make_pair("sv", "sv_FI")); map.insert(std::make_pair("sv", "sv_SE")); map.insert(std::make_pair("sw", "sw_KE")); map.insert(std::make_pair("syr", "syr_SY")); map.insert(std::make_pair("ta", "ta_IN")); map.insert(std::make_pair("te", "te_IN")); map.insert(std::make_pair("th", "th_TH")); map.insert(std::make_pair("tr", "tr_TR")); map.insert(std::make_pair("tt", "tt_RU")); map.insert(std::make_pair("uk", "uk_UA")); map.insert(std::make_pair("ur", "ur_PK")); map.insert(std::make_pair("uz", "uz_UZ")); map.insert(std::make_pair("uz", "uz_UZ")); map.insert(std::make_pair("vi", "vi_VN")); map.insert(std::make_pair("zh", "zh_CHS")); map.insert(std::make_pair("zh", "zh_CHT")); map.insert(std::make_pair("zh", "zh_CN")); map.insert(std::make_pair("zh", "zh_HK")); map.insert(std::make_pair("zh", "zh_MO")); map.insert(std::make_pair("zh", "zh_SG")); map.insert(std::make_pair("zh", "zh_TW")); return map; } const std::multimap Config::LANGUAGE_CULTURES = Config::buildLanguageCultureTable(); Config::Config() { m_dialog = MAIN->getWidget("dialog:config"); m_addLangBox = MAIN->getWidget("box:config.langs.custom.add"); m_addLangPrefix = MAIN->getWidget("entry:config.langs.custom.add.prefix"); m_addLangName = MAIN->getWidget("entry:config.langs.custom.add.name"); m_addLangCode = MAIN->getWidget("entry:config.langs.custom.add.code"); m_editLangBox = MAIN->getWidget("buttonbox:config.langs.custom.edit"); m_addLangButton = MAIN->getWidget("button:config.langs.custom.edit.add"); m_addLangButtonOk = MAIN->getWidget("button:config.langs.custom.add.ok"); m_removeLangButton = MAIN->getWidget("button:config.langs.custom.edit.remove"); m_predefLangView = MAIN->getWidget("treeview:config.langs.predef"); m_customLangView = MAIN->getWidget("treeview:config.langs.custom"); m_dialogOkButton = MAIN->getWidget("button:config.ok"); for(Gtk::TreeView* view : { m_predefLangView, m_customLangView }) { view->set_model(Gtk::ListStore::create(m_langViewCols)); view->append_column_editable(_("Filename prefix"), m_langViewCols.prefix); view->append_column_editable(_("Code"), m_langViewCols.code); view->append_column_editable(_("Native name"), m_langViewCols.name); for(int i=0; i<3; ++i) { view->get_column(i)->set_sizing(Gtk::TREE_VIEW_COLUMN_FIXED); view->get_column(i)->set_expand(true); } view->set_fixed_height_mode(true); } Glib::RefPtr store = Glib::RefPtr::cast_static(m_predefLangView->get_model()); for(const auto& lang : LANGUAGES) { Gtk::TreeIter it = store->append(); (*it)[m_langViewCols.prefix] = lang.prefix; (*it)[m_langViewCols.code] = lang.code; (*it)[m_langViewCols.name] = lang.name; } CONNECTS(MAIN->getWidget("checkbutton:config.settings.defaultoutputfont").as(), toggled, [](Gtk::CheckButton* btn) { MAIN->getWidget("fontbutton:config.settings.customoutputfont").as()->set_sensitive(!btn->get_active()); }); CONNECT(m_addLangButton, clicked, [this] { toggleAddLanguage(); }); CONNECT(m_removeLangButton, clicked, [this] { removeLanguage(); }); CONNECT(m_addLangButtonOk, clicked, [this] { addLanguage(); }); CONNECT(MAIN->getWidget("button:config.langs.custom.add.cancel").as(), clicked, [this] { toggleAddLanguage(); }); CONNECT(m_customLangView->get_selection(), changed, [this] { langTableSelectionChanged(); }); CONNECT(MAIN->getWidget("button:config.help").as(), clicked, [] { MAIN->showHelp("#Usage_Options"); }); CONNECT(m_addLangPrefix, focus_in_event, [this](GdkEventFocus*) { Utils::clear_error_state(m_addLangPrefix); return false; }); CONNECT(m_addLangName, focus_in_event, [this](GdkEventFocus*) { Utils::clear_error_state(m_addLangName); return false; }); CONNECT(m_addLangCode, focus_in_event, [this](GdkEventFocus*) { Utils::clear_error_state(m_addLangCode); return false; }); CONNECTS(MAIN->getWidget("combo:config.datadirs").as(), changed, [this](Gtk::ComboBox* combo) { setDataLocations(combo->get_active_row_number()); }); addSetting(new SwitchSettingT("dictinstall", MAIN->getWidget("check:config.settings.dictinstall"))); addSetting(new SwitchSettingT("updatecheck", MAIN->getWidget("check:config.settings.update"))); addSetting(new ListStoreSetting("customlangs", Glib::RefPtr::cast_static(m_customLangView->get_model()))); addSetting(new SwitchSettingT("systemoutputfont", MAIN->getWidget("checkbutton:config.settings.defaultoutputfont"))); addSetting(new FontSetting("customoutputfont", MAIN->getWidget("fontbutton:config.settings.customoutputfont"))); addSetting(new ComboSetting("outputorient", MAIN->getWidget("combo:config.settings.paneorient"))); addSetting(new ComboSetting("datadirs", MAIN->getWidget("combo:config.datadirs"))); } Config::~Config() { for(const auto& keyVal : m_settings) { delete keyVal.second; } } bool Config::searchLangSpec(Lang& lang) const { for(const Glib::RefPtr& model : { m_predefLangView->get_model(), m_customLangView->get_model() }) { Gtk::TreeIter it = std::find_if(model->children().begin(), model->children().end(), [this, &lang](const Gtk::TreeRow& row) { return row[m_langViewCols.prefix] == lang.prefix; }); if(it) { lang = {(*it)[m_langViewCols.prefix], (*it)[m_langViewCols.code], (*it)[m_langViewCols.name]}; return true; } } return false; } std::vector Config::searchLangCultures(const Glib::ustring& code) const { std::vector result; auto ii = LANGUAGE_CULTURES.equal_range(code); for(auto it = ii.first; it != ii.second; ++it) { result.push_back(it->second); } return result; } bool Config::useSystemDataLocations() const { return MAIN->getWidget("combo:config.datadirs").as()->get_active_row_number() == 0; } std::string Config::tessdataLocation() const { return MAIN->getWidget("entry:config.tessdatadir").as()->get_text(); } std::string Config::spellingLocation() const { return MAIN->getWidget("entry:config.spelldir").as()->get_text(); } void Config::showDialog() { toggleAddLanguage(true); while(m_dialog->run() == Gtk::RESPONSE_HELP); getSetting("customlangs")->serialize(); m_dialog->hide(); } void Config::setDataLocations(int idx) { if(idx == 0) { #ifdef G_OS_WIN32 std::string dataDir = Glib::build_filename(pkgDir, "share"); Glib::setenv("TESSDATA_PREFIX", dataDir); #else std::string dataDir("/usr/share"); Glib::unsetenv("TESSDATA_PREFIX"); #endif Glib::RefPtr dictDir = Gio::File::create_for_path(Glib::build_filename(dataDir, "myspell", "dicts")); if(!dictDir->query_exists()) { dictDir = Gio::File::create_for_path(Glib::build_filename(dataDir, "myspell")); } MAIN->getWidget("entry:config.spelldir").as()->set_text(dictDir->get_path()); } else { std::string configDir = Glib::get_user_config_dir(); Glib::setenv("TESSDATA_PREFIX", Glib::build_filename(configDir, "tessdata")); MAIN->getWidget("entry:config.spelldir").as()->set_text(Glib::build_filename(configDir, "enchant", "myspell")); } tesseract::TessBaseAPI tess; std::string current = setlocale(LC_NUMERIC, NULL); setlocale(LC_NUMERIC, "C"); tess.Init(nullptr, nullptr); setlocale(LC_NUMERIC, current.c_str()); MAIN->getWidget("entry:config.tessdatadir").as()->set_text(tess.GetDatapath()); } void Config::openTessdataDir() { int idx = Gio::Settings::create(APPLICATION_ID)->get_int("datadirs"); if(idx == 0) { #ifdef G_OS_WIN32 std::string dataDir = Glib::build_filename(pkgDir, "share"); Glib::setenv("TESSDATA_PREFIX", dataDir); #else Glib::unsetenv("TESSDATA_PREFIX"); #endif } else { std::string configDir = Glib::get_user_config_dir(); Glib::setenv("TESSDATA_PREFIX", Glib::build_filename(configDir, "tessdata")); } tesseract::TessBaseAPI tess; std::string current = setlocale(LC_NUMERIC, NULL); setlocale(LC_NUMERIC, "C"); tess.Init(nullptr, nullptr); setlocale(LC_NUMERIC, current.c_str()); Utils::openUri(Glib::filename_to_uri(tess.GetDatapath())); } void Config::openSpellingDir() { int idx = Gio::Settings::create(APPLICATION_ID)->get_int("datadirs"); if(idx == 0) { #ifdef G_OS_WIN32 std::string dataDir = Glib::build_filename(pkgDir, "share"); #else std::string dataDir("/usr/share"); #endif Glib::RefPtr dictDir = Gio::File::create_for_path(Glib::build_filename(dataDir, "myspell", "dicts")); if(!dictDir->query_exists()) { dictDir = Gio::File::create_for_path(Glib::build_filename(dataDir, "myspell")); } Utils::openUri(Glib::filename_to_uri(dictDir->get_path())); } else { std::string configDir = Glib::get_user_config_dir(); Utils::openUri(Glib::filename_to_uri(Glib::build_filename(configDir, "enchant", "myspell"))); } } void Config::toggleAddLanguage(bool forceHide) { bool addVisible = forceHide ? true : m_addLangBox->get_visible(); m_addLangBox->set_visible(!addVisible); m_editLangBox->set_visible(addVisible); if(addVisible) { m_addLangButton->grab_focus(); } else { m_addLangButtonOk->grab_focus(); } m_addLangPrefix->set_text(""); m_addLangCode->set_text(""); m_addLangName->set_text(""); Utils::clear_error_state(m_addLangPrefix); Utils::clear_error_state(m_addLangCode); Utils::clear_error_state(m_addLangName); } void Config::addLanguage() { bool invalid = false; if(!Glib::Regex::create("^\\w+$")->match(m_addLangPrefix->get_text())) { invalid = true; Utils::set_error_state(m_addLangPrefix); } if(!Glib::Regex::create("^.+$")->match(m_addLangName->get_text())) { invalid = true; Utils::set_error_state(m_addLangName); } if(!Glib::Regex::create("^[a-z]{2}$")->match(m_addLangCode->get_text()) && !Glib::Regex::create("^[a-z]{2}_[A-Z]{2}$")->match(m_addLangCode->get_text())) { invalid = true; Utils::set_error_state(m_addLangCode); } if(!invalid) { Glib::RefPtr store = Glib::RefPtr::cast_static(m_customLangView->get_model()); Gtk::TreeIter it = store->append(); (*it)[m_langViewCols.prefix] = m_addLangPrefix->get_text(); (*it)[m_langViewCols.code] = m_addLangCode->get_text(); (*it)[m_langViewCols.name] = m_addLangName->get_text(); m_addLangPrefix->set_text(""); m_addLangCode->set_text(""); m_addLangName->set_text(""); toggleAddLanguage(); } } void Config::removeLanguage() { if(m_customLangView->get_selection()->count_selected_rows() != 0) { Glib::RefPtr store = Glib::RefPtr::cast_static(m_customLangView->get_model()); store->erase(m_customLangView->get_selection()->get_selected()); } } void Config::langTableSelectionChanged() { m_removeLangButton->set_sensitive(m_customLangView->get_selection()->count_selected_rows() != 0); } gImageReader-3.2.3/gtk/src/Config.hh000066400000000000000000000063361312567024200171470ustar00rootroot00000000000000/* -*- Mode: C++; indent-tabs-mode: t; c-basic-offset: 4; tab-width: 4 -*- */ /* * Config.hh * Copyright (C) 2013-2017 Sandro Mani * * gImageReader 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. * * gImageReader 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 this program. If not, see . */ #ifndef CONFIG_HH #define CONFIG_HH #include #include #include #include "common.hh" #include "ConfigSettings.hh" class Config { public: struct Lang { Glib::ustring prefix, code, name; Lang(const Glib::ustring& _prefix = Glib::ustring(), const Glib::ustring& _code = Glib::ustring(), const Glib::ustring& _name = Glib::ustring()) : prefix(_prefix), code(_code), name(_name) {} }; Config(); ~Config(); void addSetting(AbstractSetting* setting) { auto it = m_settings.find(setting->key()); if(it != m_settings.end()) { delete it->second; it->second = setting; } else { m_settings.insert(std::make_pair(setting->key(), setting)); } } template T* getSetting(const Glib::ustring& key) const { auto it = m_settings.find(key); return it == m_settings.end() ? nullptr : static_cast(it->second); } void removeSetting(const Glib::ustring& key) { auto it = m_settings.find(key); if(it != m_settings.end()) { delete it->second; m_settings.erase(it); } } bool searchLangSpec(Lang& lang) const; std::vector searchLangCultures(const Glib::ustring& code) const; void showDialog(); bool useSystemDataLocations() const; std::string tessdataLocation() const; std::string spellingLocation() const; static void openTessdataDir(); static void openSpellingDir(); private: struct LangViewColumns : public Gtk::TreeModel::ColumnRecord { Gtk::TreeModelColumn prefix; Gtk::TreeModelColumn code; Gtk::TreeModelColumn name; LangViewColumns() { add(prefix); add(code); add(name); } }; static const std::vector LANGUAGES; static const std::multimap LANGUAGE_CULTURES ; Gtk::Dialog* m_dialog; Gtk::Box* m_addLangBox; Gtk::Entry* m_addLangPrefix; Gtk::Entry* m_addLangName; Gtk::Entry* m_addLangCode; Gtk::ButtonBox* m_editLangBox; Gtk::Button* m_addLangButton; Gtk::Button* m_addLangButtonOk; Gtk::Button* m_removeLangButton; Gtk::TreeView* m_predefLangView; Gtk::TreeView* m_customLangView; Gtk::Button* m_dialogOkButton; LangViewColumns m_langViewCols; std::map m_settings; static std::multimap buildLanguageCultureTable(); void addLanguage(); void removeLanguage(); void langTableSelectionChanged(); void setDataLocations(int idx); void toggleAddLanguage(bool forceHide = false); }; #endif // CONFIG_HH gImageReader-3.2.3/gtk/src/ConfigSettings.cc000066400000000000000000000042001312567024200206420ustar00rootroot00000000000000/* -*- Mode: C++; indent-tabs-mode: t; c-basic-offset: 4; tab-width: 4 -*- */ /* * ConfigSettings.cc * Copyright (C) 2013-2017 Sandro Mani * * gImageReader 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. * * gImageReader 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 this program. If not, see . */ #include "ConfigSettings.hh" #include "Utils.hh" Glib::RefPtr get_default_settings() { static Glib::RefPtr settings = Gio::Settings::create(APPLICATION_ID); return settings; } ListStoreSetting::ListStoreSetting(const Glib::ustring &key, Glib::RefPtr liststore) : AbstractSetting(key), m_liststore(liststore) { Glib::ustring str = get_default_settings()->get_string(m_key); m_liststore->clear(); std::size_t nCols = m_liststore->get_n_columns(); for(const Glib::ustring& row : Utils::string_split(str, ';', false)) { int colidx = 0; std::vector cols = Utils::string_split(row, ',', true); if(cols.size() != nCols) { continue; } Gtk::TreeModel::Row treerow = *(m_liststore->append()); for(const Glib::ustring& col : cols) { treerow.set_value(colidx++, col); } } } void ListStoreSetting::serialize() { // Serialized string has format a11,a12,a13;a21,a22,a23;... Glib::ustring str; int nCols = m_liststore->get_n_columns(); for(const Gtk::TreeModel::Row& row : m_liststore->children()) { for(int col = 0; col < nCols; ++col) { Glib::ustring field; row.get_value(col, field); str += field + (col == nCols - 1 ? ";" : ","); } } Glib::Variant v = Glib::Variant::create(str); get_default_settings()->set_value(m_key, v); } gImageReader-3.2.3/gtk/src/ConfigSettings.hh000066400000000000000000000077671312567024200207010ustar00rootroot00000000000000/* -*- Mode: C++; indent-tabs-mode: t; c-basic-offset: 4; tab-width: 4 -*- */ /* * ConfigSettings.hh * Copyright (C) 2013-2017 Sandro Mani * * gImageReader 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. * * gImageReader 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 this program. If not, see . */ #ifndef CONFIGSETTINGS_HH #define CONFIGSETTINGS_HH #include #include #include #include "common.hh" Glib::RefPtr get_default_settings(); class AbstractSetting { public: AbstractSetting(const Glib::ustring& key) : m_key(key) {} virtual ~AbstractSetting() {} const Glib::ustring& key() const { return m_key; } virtual void serialize() {} protected: Glib::ustring m_key; }; template class VarSetting : public AbstractSetting { public: using AbstractSetting::AbstractSetting; T getValue() const { Glib::Variant v; get_default_settings()->get_value(m_key, v); return v.get(); } void setValue(const T& value) { get_default_settings()->set_value(m_key, Glib::Variant::create(value)); } }; class FontSetting : public AbstractSetting { public: FontSetting(const Glib::ustring& key, Gtk::FontButton* widget) : AbstractSetting(key), m_widget(widget) { m_widget->set_font_name(get_default_settings()->get_string(m_key)); CONNECTP(m_widget, font_name, [this] { serialize(); }); } void serialize() override { get_default_settings()->set_string(m_key, m_widget->get_font_name()); } Glib::ustring getValue() const { return m_widget->get_font_name(); } private: Gtk::FontButton* m_widget; }; class SwitchSetting : public AbstractSetting { public: using AbstractSetting::AbstractSetting; virtual void setValue(bool value) = 0; virtual bool getValue() const = 0; }; template class SwitchSettingT : public SwitchSetting { public: SwitchSettingT(const Glib::ustring& key, T* widget) : SwitchSetting(key), m_widget(widget) { m_widget->set_active(get_default_settings()->get_boolean(m_key)); CONNECT(m_widget, toggled, [this] { serialize(); }); } void serialize() override { get_default_settings()->set_boolean(m_key, m_widget->get_active()); } void setValue(bool value) override { m_widget->set_active(value); } bool getValue() const override { return m_widget->get_active(); } private: T* m_widget; }; class ComboSetting : public AbstractSetting { public: ComboSetting(const Glib::ustring& key, Gtk::ComboBox* widget) : AbstractSetting(key), m_widget(widget) { int idx = get_default_settings()->get_int(m_key); int nrows = m_widget->get_model()->children().size(); m_widget->set_active(std::min(std::max(0, idx), nrows - 1)); CONNECT(m_widget, changed, [this] { serialize(); }); } void serialize() override { get_default_settings()->set_int(m_key, m_widget->get_active_row_number()); } private: Gtk::ComboBox* m_widget; }; class SpinSetting : public AbstractSetting { public: SpinSetting(const Glib::ustring& key, Gtk::SpinButton* widget) : AbstractSetting(key), m_widget(widget) { int value = get_default_settings()->get_int(m_key); m_widget->set_value(value); CONNECT(m_widget, value_changed, [this] { serialize(); }); } void serialize() override { get_default_settings()->set_int(m_key, m_widget->get_value()); } private: Gtk::SpinButton* m_widget; }; class ListStoreSetting : public AbstractSetting { public: ListStoreSetting(const Glib::ustring& key, Glib::RefPtr liststore); void serialize() override; private: Glib::RefPtr m_liststore; }; #endif // CONFIGSETTINGS_HH gImageReader-3.2.3/gtk/src/CrashHandler.cc000066400000000000000000000123201312567024200202540ustar00rootroot00000000000000/* -*- Mode: C++; indent-tabs-mode: t; c-basic-offset: 4; tab-width: 4 -*- */ /* * CrashHandler.cc * Copyright (C) 2013-2017 Sandro Mani * * gImageReader 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. * * gImageReader 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 this program. If not, see . */ #include "CrashHandler.hh" #include "Utils.hh" CrashHandler::CrashHandler(int argc, char* argv[]) : Gtk::Application(argc, argv, APPLICATION_ID".crashhandler", Gio::APPLICATION_HANDLES_COMMAND_LINE) , m_builder("/org/gnome/gimagereader/crashhandler.ui") { Glib::set_application_name(Glib::ustring::compose("%1 - %2", PACKAGE_NAME, _("Crash Handler"))); if(argc > 2) { m_pid = std::atoi(argv[2]); } if(argc > 3) { m_saveFile = argv[3]; } } void CrashHandler::on_startup() { Gtk::Application::on_startup(); m_dialog = m_builder("dialog:crashhandler"); m_progressBar = m_builder("progressbar:backtrace"); m_progressBar->hide(); m_textview = m_builder("textview:backtrace"); m_refreshButton = m_builder("button:backtrace.regenerate"); m_dialog->set_title(Glib::ustring::compose("%1 %2", PACKAGE_NAME, _("Crash Handler"))); if(!m_saveFile.empty()) { m_builder("label:crashhandler.autosave").as()->set_markup(Glib::ustring::compose(_("Your work has been saved under %1."), m_saveFile)); } else { m_builder("label:crashhandler.autosave").as()->set_text(_("There was no unsaved work.")); } CONNECT(m_dialog, delete_event, [this](GdkEventAny* /*ev*/) { quit(); return true; }); CONNECT(m_builder("button:crashhandler.close").as(), clicked, [this] { quit(); }); CONNECT(m_refreshButton, clicked, [this] { generate_backtrace(); }); add_window(*m_dialog); m_dialog->show_all(); #ifndef G_OS_WIN32 generate_backtrace(); #else m_refreshButton->hide(); m_progressBar->hide(); #endif } void CrashHandler::generate_backtrace() { m_progressConnection = Glib::signal_timeout().connect([this] { return pulse_progress(); }, 200); m_refreshButton->set_sensitive(false); m_textview->set_sensitive(false); m_textview->get_buffer()->set_text(Glib::ustring::compose("%1 %2 (rev %3)\n\n", PACKAGE_NAME, PACKAGE_VERSION, PACKAGE_REVISION)); m_progressBar->show(); GPid child_pid; int child_stdin; int child_stdout; try { Glib::spawn_async_with_pipes("", std::vector {"gdb", "-q", "-p", Glib::ustring::compose("%1", m_pid)}, Glib::SPAWN_DO_NOT_REAP_CHILD|Glib::SPAWN_SEARCH_PATH|Glib::SPAWN_STDERR_TO_DEV_NULL, sigc::slot(), &child_pid, &child_stdin, &child_stdout); } catch(Glib::Error&) { generate_backtrace_end(false); return; } g_child_watch_add(child_pid, handle_child_exit, this); Glib::RefPtr ch_out = Glib::IOChannel::create_from_fd(child_stdout); Glib::RefPtr src_out = ch_out->create_watch(Glib::IO_IN|Glib::IO_HUP); src_out->connect([this, ch_out](Glib::IOCondition cond) { return handle_stdout(cond, ch_out); }); src_out->attach(Glib::MainContext::get_default()); Glib::RefPtr ch_in = Glib::IOChannel::create_from_fd(child_stdin); ch_in->write("set pagination off\n"); ch_in->write("bt\n"); ch_in->write("thread apply all bt full\n"); ch_in->write("quit\n"); } void CrashHandler::generate_backtrace_end(bool success) { m_progressConnection.disconnect(); m_progressBar->hide(); m_textview->set_sensitive(true); m_refreshButton->set_sensitive(true); if(!success) { m_textview->get_buffer()->set_text(_("Failed to obtain backtrace. Is gdb installed?")); } else { std::vector lines = Utils::string_split(m_textview->get_buffer()->get_text(false), '\n', false); Glib::ustring text = Glib::ustring::compose("%1\n\n", lines[0]); for(int i = 1, n = lines.size(); i < n; ++i) { if(lines[i].substr(0, 6) == "Thread") { text += Glib::ustring::compose("\n%1\n", lines[i]); } else if(lines[i].substr(0, 1) == "#") { text += Glib::ustring::compose("%1\n", lines[i]); } } m_textview->get_buffer()->set_text(text); } auto begin = m_textview->get_buffer()->begin(); m_textview->scroll_to(begin); } bool CrashHandler::pulse_progress() { m_progressBar->pulse(); return true; } bool CrashHandler::handle_stdout(Glib::IOCondition cond, Glib::RefPtr ch) { if(cond == Glib::IO_HUP) { return false; } Glib::ustring text; ch->read_line(text); m_textview->get_buffer()->insert(m_textview->get_buffer()->end(), text); auto end = m_textview->get_buffer()->end(); m_textview->scroll_to(end); return true; } void CrashHandler::handle_child_exit(GPid pid, gint status, void* data) { CrashHandler* instance = reinterpret_cast(data); bool success = g_spawn_check_exit_status(status, nullptr); instance->generate_backtrace_end(success); Glib::spawn_close_pid(pid); } gImageReader-3.2.3/gtk/src/CrashHandler.hh000066400000000000000000000027371312567024200203010ustar00rootroot00000000000000/* -*- Mode: C++; indent-tabs-mode: t; c-basic-offset: 4; tab-width: 4 -*- */ /* * CrashHandler.hh * Copyright (C) 2013-2017 Sandro Mani * * gImageReader 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. * * gImageReader 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 this program. If not, see . */ #ifndef CRASHHANDLER_HH #define CRASHHANDLER_HH #include "common.hh" class CrashHandler : public Gtk::Application { public: CrashHandler(int argc, char* argv[]); void on_startup(); private: Builder m_builder; Gtk::Dialog* m_dialog; Gtk::ProgressBar* m_progressBar; Gtk::Button* m_refreshButton; Gtk::TextView* m_textview; sigc::connection m_progressConnection; std::string m_saveFile; int m_pid = 0; void generate_backtrace(); void generate_backtrace_end(bool success); bool pulse_progress(); bool handle_stdout(Glib::IOCondition cond, Glib::RefPtr ch); static void handle_child_exit(GPid pid, gint status, void* data); }; #endif // CRASH_HANDLER_HH gImageReader-3.2.3/gtk/src/DisplayRenderer.cc000066400000000000000000000102571312567024200210210ustar00rootroot00000000000000/* -*- Mode: C++; indent-tabs-mode: t; c-basic-offset: 4; tab-width: 4 -*- */ /* * DisplayRenderer.cc * Copyright (C) 2013-2017 Sandro Mani * * gImageReader 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. * * gImageReader 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 this program. If not, see . */ #include "DisplayRenderer.hh" #include "Utils.hh" #include #include void DisplayRenderer::adjustImage(const Cairo::RefPtr &surf, int brightness, int contrast, bool invert) const { if(brightness == 0 && contrast == 0 && !invert) { return; } float kBr = 1.f - std::abs(brightness / 200.f); float dBr = brightness > 0 ? 255.f : 0.f; float kCn = contrast * 2.55f; // http://thecryptmag.com/Online/56/imgproc_5.html float FCn = (259.f * (kCn + 255.f)) / (255.f * (259.f - kCn)); int n = surf->get_height() * surf->get_width(); uint8_t* data = surf->get_data(); #pragma omp parallel for schedule(static) for(int i = 0; i < n; ++i) { uint8_t& r = data[4*i + 2]; uint8_t& g = data[4*i + 1]; uint8_t& b = data[4*i + 0]; // Brightness r = dBr * (1.f - kBr) + r * kBr; g = dBr * (1.f - kBr) + g * kBr; b = dBr * (1.f - kBr) + b * kBr; // Contrast r = std::max(0.f, std::min(FCn * (r - 128.f) + 128.f, 255.f)); g = std::max(0.f, std::min(FCn * (g - 128.f) + 128.f, 255.f)); b = std::max(0.f, std::min(FCn * (b - 128.f) + 128.f, 255.f)); // Invert if(invert) { r = 255 - r; g = 255 - g; b = 255 - b; } } } Cairo::RefPtr ImageRenderer::render(int /*page*/, double resolution) const { Glib::RefPtr pixbuf; try { pixbuf = Gdk::Pixbuf::create_from_file(m_filename); } catch(const Glib::Error&) { return Cairo::RefPtr(); } double scale = resolution / 100.; int w = Utils::round(pixbuf->get_width() * scale); int h = Utils::round(pixbuf->get_height() * scale); Cairo::RefPtr surf; try { surf = Cairo::ImageSurface::create(Cairo::FORMAT_ARGB32, w, h); } catch(const std::exception&) { return Cairo::RefPtr(); } Cairo::RefPtr ctx = Cairo::Context::create(surf); if(pixbuf->get_has_alpha()) { ctx->set_source_rgba(1., 1., 1., 1.); ctx->paint(); } ctx->scale(scale, scale); try { Gdk::Cairo::set_source_pixbuf(ctx, pixbuf); } catch(const std::exception&) { return Cairo::RefPtr(); } ctx->paint(); return surf; } PDFRenderer::PDFRenderer(const std::string& filename) : DisplayRenderer(filename) { m_document = poppler_document_new_from_file(Glib::filename_to_uri(m_filename).c_str(), 0, 0); } PDFRenderer::~PDFRenderer() { if(m_document) g_object_unref(m_document); } Cairo::RefPtr PDFRenderer::render(int page, double resolution) const { if(!m_document) { return Cairo::RefPtr(); } m_mutex.lock(); double scale = resolution / 72; PopplerPage* poppage = poppler_document_get_page(m_document, page - 1); double width, height; poppler_page_get_size(poppage, &width, &height); int w = Utils::round(width * scale); int h = Utils::round(height * scale); Cairo::RefPtr surf; try { surf = Cairo::ImageSurface::create(Cairo::FORMAT_ARGB32, w, h); } catch(const std::exception&) { m_mutex.unlock(); return Cairo::RefPtr(); } Cairo::RefPtr ctx = Cairo::Context::create(surf); ctx->set_source_rgba(1., 1., 1., 1.); ctx->paint(); ctx->scale(scale, scale); poppler_page_render(poppage, ctx->cobj()); g_object_unref(poppage); m_mutex.unlock(); return surf; } int PDFRenderer::getNPages() const { return m_document ? poppler_document_get_n_pages(m_document) : 1; } gImageReader-3.2.3/gtk/src/DisplayRenderer.hh000066400000000000000000000036751312567024200210410ustar00rootroot00000000000000/* -*- Mode: C++; indent-tabs-mode: t; c-basic-offset: 4; tab-width: 4 -*- */ /* * DisplayRenderer.hh * Copyright (C) 2013-2017 Sandro Mani * * gImageReader 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. * * gImageReader 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 this program. If not, see . */ #ifndef DISPLAYRENDERER_HH #define DISPLAYRENDERER_HH #include "common.hh" typedef struct _PopplerDocument PopplerDocument; class DisplayRenderer { public: DisplayRenderer(const std::string& filename) : m_filename(filename) {} virtual ~DisplayRenderer() {} virtual Cairo::RefPtr render(int page, double resolution) const = 0; virtual int getNPages() const = 0; void adjustImage(const Cairo::RefPtr& surf, int brightness, int contrast, bool invert) const; protected: std::string m_filename; }; class ImageRenderer : public DisplayRenderer { public: ImageRenderer(const std::string& filename) : DisplayRenderer(filename) {} Cairo::RefPtr render(int page, double resolution) const override; int getNPages() const override { return 1; } }; class PDFRenderer : public DisplayRenderer { public: PDFRenderer(const std::string& filename); ~PDFRenderer(); Cairo::RefPtr render(int page, double resolution) const override; int getNPages() const override; private: PopplerDocument* m_document; mutable Glib::Threads::Mutex m_mutex; }; #endif // IMAGERENDERER_HH gImageReader-3.2.3/gtk/src/Displayer.cc000066400000000000000000000711471312567024200176660ustar00rootroot00000000000000/* -*- Mode: C++; indent-tabs-mode: t; c-basic-offset: 4; tab-width: 4 -*- */ /* * Displayer.cc * Copyright (C) 2013-2017 Sandro Mani * * gImageReader 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. * * gImageReader 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 this program. If not, see . */ #include "MainWindow.hh" #include "Config.hh" #include "Displayer.hh" #include "DisplayRenderer.hh" #include "Recognizer.hh" #include "SourceManager.hh" #include "Utils.hh" #include "FileDialogs.hh" #include Displayer::Displayer() { m_canvas = MAIN->getWidget("drawingarea:display"); m_viewport = MAIN->getWidget("viewport:display"); m_scrollwin = MAIN->getWidget("scrollwin:display"); m_hadj = m_scrollwin->get_hadjustment(); m_vadj = m_scrollwin->get_vadjustment(); m_zoominbtn = MAIN->getWidget("button:main.zoomin"); m_zoomoutbtn = MAIN->getWidget("button:main.zoomout"); m_zoomonebtn = MAIN->getWidget("button:main.zoomnormsize"); m_zoomfitbtn = MAIN->getWidget("button:main.zoomfit"); m_rotimage = MAIN->getWidget("image:display.rotate.mode"); m_rotspin = MAIN->getWidget("spin:display.rotate"); m_pagespin = MAIN->getWidget("spin:display.page"); m_resspin = MAIN->getWidget("spin:display.resolution"); m_brispin = MAIN->getWidget("spin:display.brightness"); m_conspin = MAIN->getWidget("spin:display.contrast"); m_invcheck = MAIN->getWidget("check:display.invert"); m_rotateMode = RotateMode::AllPages; #if GTKMM_CHECK_VERSION(3,12,0) m_pagespin->set_icon_from_pixbuf(Gdk::Pixbuf::create_from_resource("/org/gnome/gimagereader/page.png")); m_resspin->set_icon_from_pixbuf(Gdk::Pixbuf::create_from_resource("/org/gnome/gimagereader/resolution.png")); m_brispin->set_icon_from_pixbuf(Gdk::Pixbuf::create_from_resource("/org/gnome/gimagereader/brightness.png")); m_conspin->set_icon_from_pixbuf(Gdk::Pixbuf::create_from_resource("/org/gnome/gimagereader/contrast.png")); #else m_pagespin->set_icon_from_pixbuf(Glib::wrap(gdk_pixbuf_new_from_resource("/org/gnome/gimagereader/page.png", 0))); m_resspin->set_icon_from_pixbuf(Glib::wrap(gdk_pixbuf_new_from_resource("/org/gnome/gimagereader/resolution.png", 0))); m_brispin->set_icon_from_pixbuf(Glib::wrap(gdk_pixbuf_new_from_resource("/org/gnome/gimagereader/brightness.png", 0))); m_conspin->set_icon_from_pixbuf(Glib::wrap(gdk_pixbuf_new_from_resource("/org/gnome/gimagereader/contrast.png", 0))); #endif m_scrollwin->drag_dest_set({Gtk::TargetEntry("text/uri-list")}, Gtk::DEST_DEFAULT_MOTION | Gtk::DEST_DEFAULT_DROP, Gdk::ACTION_COPY | Gdk::ACTION_MOVE); m_viewport->override_background_color(Gdk::RGBA("#a0a0a4")); CONNECT(MAIN->getWidget("menuitem:display.rotate.current").as(), activate, [this] { setRotateMode(RotateMode::CurrentPage, "rotate_page.png"); }); CONNECT(MAIN->getWidget("menuitem:display.rotate.all").as(), activate, [this] { setRotateMode(RotateMode::AllPages, "rotate_pages.png"); }); m_connection_rotSpinChanged = CONNECT(m_rotspin, value_changed, [this] { setAngle(m_rotspin->get_value()); }); m_connection_pageSpinChanged = CONNECT(m_pagespin, value_changed, [this] { setCurrentPage(m_pagespin->get_value_as_int()); }); m_connection_briSpinChanged = CONNECT(m_brispin, value_changed, [this] { brightnessChanged(); }); m_connection_conSpinChanged = CONNECT(m_conspin, value_changed, [this] { contrastChanged(); }); m_connection_resSpinChanged = CONNECT(m_resspin, value_changed, [this] { resolutionChanged(); }); m_connection_invcheckToggled = CONNECT(m_invcheck, toggled, [this] { invertColorsChanged(); }); CONNECT(m_viewport, size_allocate, [this](Gdk::Rectangle&) { resizeEvent(); }); CONNECT(m_viewport, key_press_event, [this](GdkEventKey* ev) { return keyPressEvent(ev); }); CONNECT(m_viewport, motion_notify_event, [this](GdkEventMotion* ev) { return mouseMoveEvent(ev); }); CONNECT(m_viewport, button_press_event, [this](GdkEventButton* ev) { return mousePressEvent(ev); }); CONNECT(m_viewport, button_release_event, [this](GdkEventButton* ev) { return mouseReleaseEvent(ev); }); CONNECT(m_viewport, scroll_event, [this](GdkEventScroll* ev) { return scrollEvent(ev); }); CONNECT(m_canvas, draw, [this](const Cairo::RefPtr& ctx) { drawCanvas(ctx); return false; }); CONNECT(m_zoominbtn, clicked, [this] { setZoom(Zoom::In); }); CONNECT(m_zoomoutbtn, clicked, [this] { setZoom(Zoom::Out); }); m_connection_zoomfitClicked = CONNECT(m_zoomfitbtn, clicked, [this] { setZoom(Zoom::Fit); }); m_connection_zoomoneClicked = CONNECT(m_zoomonebtn, clicked, [this] { setZoom(Zoom::One); }); CONNECT(MAIN->getWidget("spin:display.rotate").as(), icon_press, [this](Gtk::EntryIconPosition pos, const GdkEventButton*) { setAngle(m_rotspin->get_value() + (pos == Gtk::ENTRY_ICON_PRIMARY ? -90 : 90)); }); CONNECT(MAIN->getWidget("applicationwindow:main").as()->get_style_context(), changed, [this] { m_canvas->queue_draw(); }); CONNECT(m_scrollwin, drag_data_received, sigc::ptr_fun(Utils::handle_drag_drop)); } void Displayer::drawCanvas(const Cairo::RefPtr &ctx) { if(!m_imageItem) { return; } Gtk::Allocation alloc = m_canvas->get_allocation(); ctx->translate(Utils::round(0.5 * alloc.get_width()), Utils::round(0.5 * alloc.get_height())); ctx->scale(m_scale, m_scale); m_imageItem->draw(ctx); for(const DisplayerItem* item : m_items) { if(item->visible()) { item->draw(ctx); } } } void Displayer::positionCanvas() { Geometry::Rectangle bb = getSceneBoundingRect(); m_canvas->set_size_request(Utils::round(bb.width * m_scale), Utils::round(bb.height * m_scale)); // Immediately resize viewport, so that adjustment values are correct below m_viewport->size_allocate(m_viewport->get_allocation()); m_viewport->set_allocation(m_viewport->get_allocation()); m_hadj->set_value(m_scrollPos[0] *(m_hadj->get_upper() - m_hadj->get_page_size())); m_vadj->set_value(m_scrollPos[1] *(m_vadj->get_upper() - m_vadj->get_page_size())); m_canvas->queue_draw(); } std::string Displayer::getCurrentImage(int& page) const { auto it = m_pageMap.find(m_pagespin->get_value_as_int()); if(it != m_pageMap.end()) { page = it->second.second; return it->second.first->file->get_path(); } return ""; } bool Displayer::setCurrentPage(int page) { if(m_sources.empty()) { return false; } if(m_tool) { m_tool->pageChanged(); } Source* source = m_pageMap[page].first; if(source != m_currentSource) { sendScaleRequest({ScaleRequest::Abort}); sendScaleRequest({ScaleRequest::Quit}); m_scaleThread->join(); m_scaleThread = nullptr; delete m_renderer; std::string filename = source->file->get_path(); #ifdef G_OS_WIN32 if(Glib::ustring(filename.substr(filename.length() - 4)).lowercase() == ".pdf") { #else if(Utils::get_content_type(filename) == "application/pdf") { #endif m_renderer = new PDFRenderer(filename); if(source->resolution == -1) source->resolution = 300; } else { m_renderer = new ImageRenderer(filename); if(source->resolution == -1) source->resolution = 100; } Utils::set_spin_blocked(m_brispin, source->brightness, m_connection_briSpinChanged); Utils::set_spin_blocked(m_conspin, source->contrast, m_connection_conSpinChanged); Utils::set_spin_blocked(m_resspin, source->resolution, m_connection_resSpinChanged); m_connection_invcheckToggled.block(true); m_invcheck->set_active(source->invert); m_connection_invcheckToggled.block(false); m_currentSource = source; m_scaleThread = Glib::Threads::Thread::create(sigc::mem_fun(this, &Displayer::scaleThread)); } Utils::set_spin_blocked(m_rotspin, source->angle[m_pageMap[page].second - 1] / M_PI * 180., m_connection_rotSpinChanged); Utils::set_spin_blocked(m_pagespin, page, m_connection_pageSpinChanged); return renderImage(); } bool Displayer::setSources(std::vector sources) { if(sources == m_sources) { return true; } if(m_scaleThread) { sendScaleRequest({ScaleRequest::Abort}); sendScaleRequest({ScaleRequest::Quit}); m_scaleThread->join(); m_scaleThread = nullptr; } m_scale = 1.0; m_scrollPos[0] = m_scrollPos[1] = 0.5; if(m_tool) { m_tool->reset(); } m_renderTimer.disconnect(); delete m_imageItem; m_imageItem = nullptr; m_image.clear(); delete m_renderer; m_renderer = 0; m_currentSource = nullptr; m_sources.clear(); m_pageMap.clear(); m_canvas->hide(); m_pagespin->set_range(1, 1); m_rotspin->set_value(0); m_brispin->set_value(0); m_conspin->set_value(0); m_resspin->set_value(100); m_invcheck->set_active(false); m_zoomfitbtn->set_active(true); m_zoomonebtn->set_active(false); m_zoominbtn->set_sensitive(true); m_zoomoutbtn->set_sensitive(true); if(m_viewport->get_window()) m_viewport->get_window()->set_cursor(); m_sources = sources; if(sources.empty()) { return false; } int page = 0; for(Source* source : m_sources) { DisplayRenderer* renderer; std::string filename = source->file->get_path(); #ifdef G_OS_WIN32 if(Glib::ustring(filename.substr(filename.length() - 4)).lowercase() == ".pdf") { #else if(Utils::get_content_type(filename) == "application/pdf") { #endif renderer = new PDFRenderer(filename); } else { renderer = new ImageRenderer(filename); } source->angle.resize(renderer->getNPages(), 0.); for(int iPage = 1, nPages = renderer->getNPages(); iPage <= nPages; ++iPage) { m_pageMap.insert(std::make_pair(++page, std::make_pair(source, iPage))); } delete renderer; } if(page == 0) { m_pageMap.clear(); m_sources.clear(); return false; } m_connection_pageSpinChanged.block(); m_pagespin->get_adjustment()->set_upper(page); m_connection_pageSpinChanged.unblock(); m_pagespin->set_visible(page > 1); m_viewport->get_window()->set_cursor(Gdk::Cursor::create(Gdk::TCROSS)); m_canvas->show(); m_scaleThread = Glib::Threads::Thread::create(sigc::mem_fun(this, &Displayer::scaleThread)); m_imageItem = new DisplayerImageItem; if(!setCurrentPage(1)) { g_assert_nonnull(m_currentSource); Utils::message_dialog(Gtk::MESSAGE_ERROR, _("Failed to load image"), Glib::ustring::compose(_("The file might not be an image or be corrupt:\n%1"), m_currentSource->displayname)); setSources(std::vector()); return false; } return true; } bool Displayer::hasMultipleOCRAreas() { return m_tool->hasMultipleOCRAreas(); } std::vector> Displayer::getOCRAreas() { return m_tool->getOCRAreas(); } bool Displayer::allowAutodetectOCRAreas() const { return m_tool->allowAutodetectOCRAreas(); } void Displayer::autodetectOCRAreas() { m_tool->autodetectOCRAreas(); } bool Displayer::renderImage() { sendScaleRequest({ScaleRequest::Abort}); if(m_currentSource->resolution != m_resspin->get_value_as_int()) { double factor = double(m_resspin->get_value_as_int()) / double(m_currentSource->resolution); if(m_tool) { m_tool->resolutionChanged(factor); } } m_currentSource->page = m_pageMap[m_pagespin->get_value_as_int()].second; m_currentSource->brightness = m_brispin->get_value_as_int(); m_currentSource->contrast = m_conspin->get_value_as_int(); m_currentSource->resolution = m_resspin->get_value_as_int(); m_currentSource->invert = m_invcheck->get_active(); Cairo::RefPtr image = m_renderer->render(m_currentSource->page, m_currentSource->resolution); m_renderer->adjustImage(image, m_currentSource->brightness, m_currentSource->contrast, m_currentSource->invert); if(!bool(image)) { return false; } m_image = image; m_imageItem->setImage(m_image); m_imageItem->setRect(Geometry::Rectangle(-0.5 * m_image->get_width(), -0.5 * m_image->get_height(), m_image->get_width(), m_image->get_height())); setAngle(m_rotspin->get_value()); if(m_scale < 1.0) { ScaleRequest request = {ScaleRequest::Scale, m_scale, m_currentSource->resolution, m_currentSource->page, m_currentSource->brightness, m_currentSource->contrast, m_currentSource->invert}; m_scaleTimer = Glib::signal_timeout().connect([this,request] { sendScaleRequest(request); return false; }, 100); } return true; } void Displayer::setZoom(Zoom zoom) { if(!m_image) { return; } sendScaleRequest({ScaleRequest::Abort}); m_connection_zoomfitClicked.block(true); m_connection_zoomoneClicked.block(true); Gtk::Allocation alloc = m_viewport->get_allocation(); Geometry::Rectangle bb = getSceneBoundingRect(); double fit = std::min(alloc.get_width() / bb.width, alloc.get_height() / bb.height); if(zoom == Zoom::In) { m_scale = std::min(10., m_scale * 1.25); } else if(zoom == Zoom::Out) { m_scale = std::max(0.05, m_scale * 0.8); } else if(zoom == Zoom::One) { m_scale = 1.0; } m_zoomfitbtn->set_active(false); if(zoom == Zoom::Fit || (m_scale / fit >= 0.9 && m_scale / fit <= 1.09)) { m_scale = fit; m_zoomfitbtn->set_active(true); } bool scrollVisible = m_scale > fit; m_scrollwin->get_hscrollbar()->set_visible(scrollVisible); m_scrollwin->get_vscrollbar()->set_visible(scrollVisible); m_zoomoutbtn->set_sensitive(m_scale > 0.05); m_zoominbtn->set_sensitive(m_scale < 10.); m_zoomonebtn->set_active(m_scale == 1.); if(m_scale < 1.0) { ScaleRequest request = {ScaleRequest::Scale, m_scale, m_currentSource->resolution, m_currentSource->page, m_currentSource->brightness, m_currentSource->contrast, m_currentSource->invert}; m_scaleTimer = Glib::signal_timeout().connect([this,request] { sendScaleRequest(request); return false; }, 100); } else { m_imageItem->setImage(m_image); } positionCanvas(); m_connection_zoomfitClicked.block(false); m_connection_zoomoneClicked.block(false); } void Displayer::setRotateMode(RotateMode mode, const std::string& iconName) { m_rotateMode = mode; #if GTKMM_CHECK_VERSION(3,12,0) m_rotimage->set(Gdk::Pixbuf::create_from_resource(Glib::ustring::compose("/org/gnome/gimagereader/%1", iconName))); #else m_rotimage->set(Glib::wrap(gdk_pixbuf_new_from_resource(Glib::ustring::compose("/org/gnome/gimagereader/%1", iconName).c_str(), 0))); #endif } void Displayer::setAngle(double angle) { if(m_image) { angle = angle < 0 ? angle + 360. : angle >= 360 ? angle - 360 : angle, Utils::set_spin_blocked(m_rotspin, angle, m_connection_rotSpinChanged); angle *= M_PI / 180.; int sourcePage = m_pageMap[getCurrentPage()].second; double delta = angle - m_currentSource->angle[sourcePage - 1]; if(m_rotateMode == RotateMode::CurrentPage) { m_currentSource->angle[sourcePage - 1] = angle; } else if(delta != 0) { for(const auto& keyval : m_pageMap) { auto pair = keyval.second; pair.first->angle[pair.second - 1] += delta; } } m_imageItem->setRotation(angle); if(m_tool) { m_tool->rotationChanged(delta); } if(m_zoomfitbtn->get_active() == true) { setZoom(Zoom::Fit); } else { positionCanvas(); } } } void Displayer::brightnessChanged() { int brightness = m_brispin->get_value_as_int(); for(const auto& keyval : m_pageMap) { keyval.second.first->brightness = brightness; } queueRenderImage(); } void Displayer::contrastChanged() { int contrast = m_conspin->get_value_as_int(); for(const auto& keyval : m_pageMap) { keyval.second.first->contrast = contrast; } queueRenderImage(); } void Displayer::resolutionChanged() { int resolution = m_resspin->get_value_as_int(); for(const auto& keyval : m_pageMap) { keyval.second.first->resolution = resolution; } queueRenderImage(); } void Displayer::invertColorsChanged() { bool invert = m_invcheck->get_active(); for(const auto& keyval : m_pageMap) { keyval.second.first->invert = invert; } queueRenderImage(); } void Displayer::setResolution(int resolution) { Utils::set_spin_blocked(m_resspin, resolution, m_connection_resSpinChanged); renderImage(); } void Displayer::setCursor(Glib::RefPtr cursor) { if(cursor) { m_viewport->get_window()->set_cursor(cursor); } else { m_viewport->get_window()->set_cursor(Gdk::Cursor::create(Gdk::TCROSS)); } } void Displayer::queueRenderImage() { if(m_image) { m_renderTimer.disconnect(); m_renderTimer = Glib::signal_timeout().connect([this] { renderImage(); return false; }, 200); } } void Displayer::resizeEvent() { if(m_zoomfitbtn->get_active() == true) { setZoom(Zoom::Fit); } } bool Displayer::mousePressEvent(GdkEventButton* ev) { m_viewport->grab_focus(); if(ev->button == 2) { m_panPos[0] = ev->x_root; m_panPos[1] = ev->y_root; return true; } Geometry::Point scenePos = mapToSceneClamped(Geometry::Point(ev->x, ev->y)); for(DisplayerItem* item : Utils::reverse(m_items)) { if(item->rect().contains(scenePos)) { m_activeItem = item; break; } } if(m_activeItem && m_activeItem->mousePressEvent(ev)) { return true; } if(m_tool && m_currentSource) { return m_tool->mousePressEvent(ev); } return false; } bool Displayer::keyPressEvent(GdkEventKey* ev) { if(ev->keyval == GDK_KEY_Page_Up) { m_pagespin->set_value(m_pagespin->get_value_as_int() - 1); return true; } else if(ev->keyval == GDK_KEY_Page_Down) { m_pagespin->set_value(m_pagespin->get_value_as_int() + 1); return true; } else { return false; } } bool Displayer::mouseMoveEvent(GdkEventMotion *ev) { if(ev->state & Gdk::BUTTON2_MASK) { double dx = m_panPos[0] - ev->x_root; double dy = m_panPos[1] - ev->y_root; m_hadj->set_value(m_hadj->get_value() + dx); m_vadj->set_value(m_vadj->get_value() + dy); m_panPos[0] = ev->x_root; m_panPos[1] = ev->y_root; return true; } if(m_activeItem && m_activeItem->mouseMoveEvent(ev)) { return true; } bool overItem = false; Geometry::Point scenePos = mapToSceneClamped(Geometry::Point(ev->x, ev->y)); for(DisplayerItem* item : Utils::reverse(m_items)) { if(item->rect().contains(scenePos)) { overItem = true; if(item->mouseMoveEvent(ev)) { return true; } break; } } if(!overItem) { setCursor(Glib::RefPtr(0)); } if(m_tool && m_currentSource) { return m_tool->mouseMoveEvent(ev); } return false; } bool Displayer::mouseReleaseEvent(GdkEventButton* ev) { if(m_activeItem) { bool accepted = m_activeItem->mouseReleaseEvent(ev); m_activeItem = nullptr; if(accepted) { return true; } } if(m_tool && m_currentSource) { return m_tool->mouseReleaseEvent(ev); } return false; } bool Displayer::scrollEvent(GdkEventScroll *ev) { if((ev->state & Gdk::CONTROL_MASK) != 0) { if((ev->direction == GDK_SCROLL_UP || (ev->direction == GDK_SCROLL_SMOOTH && ev->delta_y < 0)) && m_scale * 1.25 < 10) { Gtk::Allocation alloc = m_canvas->get_allocation(); m_scrollPos[0] = std::max(0., std::min((ev->x + m_hadj->get_value() - alloc.get_x())/alloc.get_width(), 1.0)); m_scrollPos[1] = std::max(0., std::min((ev->y + m_vadj->get_value() - alloc.get_y())/alloc.get_height(), 1.0)); setZoom(Zoom::In); } else if((ev->direction == GDK_SCROLL_DOWN || (ev->direction == GDK_SCROLL_SMOOTH && ev->delta_y > 0)) && m_scale * 0.8 > 0.05) { setZoom(Zoom::Out); } return true; } else if((ev->state & Gdk::SHIFT_MASK) != 0) { if(ev->direction == GDK_SCROLL_UP || (ev->direction == GDK_SCROLL_SMOOTH && ev->delta_y < 0)) { m_hadj->set_value(m_hadj->get_value() - m_hadj->get_step_increment()); } else if(ev->direction == GDK_SCROLL_DOWN || (ev->direction == GDK_SCROLL_SMOOTH && ev->delta_y > 0)) { m_hadj->set_value(m_hadj->get_value() + m_hadj->get_step_increment()); } return true; } return false; } void Displayer::ensureVisible(double evx, double evy) { if(evx - 30. < m_hadj->get_value()) { m_hadj->set_value(std::max(0., evx - 30.)); } else if(evx + 30. > m_hadj->get_value() + m_hadj->get_page_size()) { m_hadj->set_value(std::min(m_hadj->get_upper(), evx + 30.) - m_hadj->get_page_size()); } if(evy - 30.< m_vadj->get_value()) { m_vadj->set_value(std::max(0., evy - 30.)); } else if(evy + 30. > m_vadj->get_value() + m_vadj->get_page_size()) { m_vadj->set_value(std::min(m_vadj->get_upper(), evy + 30.) - m_vadj->get_page_size()); } } void Displayer::addItem(DisplayerItem* item) { if(!m_items.empty()) item->setZIndex(m_items.back()->zIndex() + 1); m_items.push_back(item); item->m_displayer = this; invalidateRect(item->rect()); } void Displayer::removeItem(DisplayerItem* item) { if(item == m_activeItem) { m_activeItem = nullptr; } m_items.erase(std::remove(m_items.begin(), m_items.end(), item), m_items.end()); item->m_displayer = nullptr; invalidateRect(item->rect()); } void Displayer::invalidateRect(const Geometry::Rectangle &rect) { Gtk::Allocation alloc = m_canvas->get_allocation(); Geometry::Rectangle canvasRect = rect; canvasRect.x = (canvasRect.x * m_scale + 0.5 * alloc.get_width()) - 2; canvasRect.y = (canvasRect.y * m_scale + 0.5 * alloc.get_height()) - 2; canvasRect.width = canvasRect.width * m_scale + 4; canvasRect.height = canvasRect.height * m_scale + 4; m_canvas->queue_draw_area(canvasRect.x, canvasRect.y, canvasRect.width, canvasRect.height); } void Displayer::resortItems() { std::sort(m_items.begin(), m_items.end(), DisplayerItem::zIndexCmp); } Geometry::Rectangle Displayer::getSceneBoundingRect() const { int w = m_image->get_width(); int h = m_image->get_height(); Geometry::Rotation R(m_rotspin->get_value() / 180. * M_PI); int width = std::abs(R(0, 0) * w) + std::abs(R(0, 1) * h); int height = std::abs(R(1, 0) * w) + std::abs(R(1, 1) * h); return Geometry::Rectangle(-0.5 * width, -0.5 * height, width, height); } Geometry::Point Displayer::mapToSceneClamped(const Geometry::Point& p) const { // Selection coordinates are with respect to the center of the image in unscaled (but rotated) coordinates Gtk::Allocation alloc = m_canvas->get_allocation(); double x = (std::max(0., std::min(p.x - alloc.get_x(), double(alloc.get_width()))) - 0.5 * alloc.get_width()) / m_scale; double y = (std::max(0., std::min(p.y - alloc.get_y(), double(alloc.get_height()))) - 0.5 * alloc.get_height()) / m_scale; return Geometry::Point(x, y); } Cairo::RefPtr Displayer::getImage(const Geometry::Rectangle &rect) const { Cairo::RefPtr surf = Cairo::ImageSurface::create(Cairo::FORMAT_ARGB32, std::ceil(rect.width), std::ceil(rect.height)); Cairo::RefPtr ctx = Cairo::Context::create(surf); ctx->set_source_rgba(1., 1., 1., 1.); ctx->paint(); ctx->translate(-rect.x, -rect.y); ctx->rotate(m_rotspin->get_value() / 180. * M_PI); ctx->translate(-0.5 * m_image->get_width(), -0.5 * m_image->get_height()); ctx->set_source(m_image, 0, 0); ctx->paint(); return surf; } void Displayer::sendScaleRequest(const ScaleRequest& request) { m_scaleTimer.disconnect(); m_scaleMutex.lock(); m_scaleRequests.push(request); m_scaleCond.signal(); m_scaleMutex.unlock(); } void Displayer::scaleThread() { m_scaleMutex.lock(); while(true) { while(m_scaleRequests.empty()) { m_scaleCond.wait(m_scaleMutex); } ScaleRequest req = m_scaleRequests.front(); m_scaleRequests.pop(); if(req.type == ScaleRequest::Quit) { m_connection_setScaledImage.disconnect(); break; } else if(req.type == ScaleRequest::Scale) { m_scaleMutex.unlock(); Cairo::RefPtr image = m_renderer->render(req.page, 2 * req.scale * req.resolution); m_scaleMutex.lock(); if(!m_scaleRequests.empty() && m_scaleRequests.front().type == ScaleRequest::Abort) { m_scaleRequests.pop(); continue; } m_scaleMutex.unlock(); m_renderer->adjustImage(image, req.brightness, req.contrast, req.invert); m_scaleMutex.lock(); if(!m_scaleRequests.empty() && m_scaleRequests.front().type == ScaleRequest::Abort) { m_scaleRequests.pop(); continue; } m_scaleMutex.unlock(); double scale = req.scale; m_connection_setScaledImage = Glib::signal_idle().connect([this,image,scale] { setScaledImage(image); return false; }); m_scaleMutex.lock(); } }; m_scaleMutex.unlock(); } void Displayer::setScaledImage(Cairo::RefPtr image) { m_scaleMutex.lock(); if(!m_scaleRequests.empty() && m_scaleRequests.front().type == ScaleRequest::Abort) { m_scaleRequests.pop(); } else { m_imageItem->setImage(image); m_canvas->queue_draw(); } m_scaleMutex.unlock(); } /////////////////////////////////////////////////////////////////////////////// void DisplayerItem::setZIndex(int zIndex) { m_zIndex = zIndex; if(m_displayer) { m_displayer->invalidateRect(m_rect); m_displayer->resortItems(); } } void DisplayerItem::setRect(const Geometry::Rectangle &rect) { Geometry::Rectangle invalidateArea = m_rect.unite(rect); m_rect = rect; if(m_displayer) m_displayer->invalidateRect(invalidateArea); } void DisplayerItem::setVisible(bool visible) { m_visible = visible; update(); } void DisplayerItem::update() { if(m_displayer) m_displayer->invalidateRect(m_rect); } void DisplayerImageItem::draw(Cairo::RefPtr ctx) const { if(m_image) { double sx = rect().width / m_image->get_width(); double sy = rect().height / m_image->get_height(); ctx->save(); ctx->rotate(m_rotation); ctx->scale(sx, sy); ctx->translate(rect().x / sx, rect().y / sy); ctx->set_source(m_image, 0, 0); ctx->paint(); ctx->restore(); } } void DisplayerSelection::draw(Cairo::RefPtr ctx) const { Gdk::RGBA bgcolor("#4A90D9"); double scale = displayer()->getCurrentScale(); double d = 0.5 / scale; double x1 = Utils::round(rect().x * scale) / scale + d; double y1 = Utils::round(rect().y * scale) / scale + d; double x2 = Utils::round((rect().x + rect().width) * scale) / scale - d; double y2 = Utils::round((rect().y + rect().height) * scale) / scale - d; Geometry::Rectangle paintrect(x1, y1, x2 - x1, y2 - y1); ctx->save(); // Semitransparent rectangle with frame ctx->set_line_width(2. * d); ctx->rectangle(paintrect.x, paintrect.y, paintrect.width, paintrect.height); ctx->set_source_rgba(bgcolor.get_red(), bgcolor.get_green(), bgcolor.get_blue(), 0.25); ctx->fill_preserve(); ctx->set_source_rgba(bgcolor.get_red(), bgcolor.get_green(), bgcolor.get_blue(), 1.0); ctx->stroke(); ctx->restore(); } bool DisplayerSelection::mousePressEvent(GdkEventButton *event) { if(event->button == 1) { Geometry::Point p = displayer()->mapToSceneClamped(Geometry::Point(event->x, event->y)); double tol = 10.0 / displayer()->getCurrentScale(); m_resizeOffset = Geometry::Point(0., 0.); if(std::abs(m_point.x - p.x) < tol) { // pointx m_resizeHandlers.push_back(resizePointX); m_resizeOffset.x = p.x - m_point.x; } else if(std::abs(m_anchor.x - p.x) < tol) { // anchorx m_resizeHandlers.push_back(resizeAnchorX); m_resizeOffset.x = p.x - m_anchor.x; } if(std::abs(m_point.y - p.y) < tol) { // pointy m_resizeHandlers.push_back(resizePointY); m_resizeOffset.y = p.y - m_point.y; } else if(std::abs(m_anchor.y - p.y) < tol) { // anchory m_resizeHandlers.push_back(resizeAnchorY); m_resizeOffset.y = p.y - m_anchor.y; } return true; } else if(event->button == 3) { showContextMenu(event); } return false; } bool DisplayerSelection::mouseReleaseEvent(GdkEventButton */*event*/) { m_resizeHandlers.clear(); return false; } bool DisplayerSelection::mouseMoveEvent(GdkEventMotion *event) { Geometry::Point p = displayer()->mapToSceneClamped(Geometry::Point(event->x, event->y)); if(m_resizeHandlers.empty()) { double tol = 10.0 / displayer()->getCurrentScale(); bool left = std::abs(rect().x - p.x) < tol; bool right = std::abs(rect().x + rect().width - p.x) < tol; bool top = std::abs(rect().y - p.y) < tol; bool bottom = std::abs(rect().y + rect().height - p.y) < tol; if((top && left) || (bottom && right)) { displayer()->setCursor(Gdk::Cursor::create(MAIN->getWindow()->get_display(), "nwse-resize")); } else if((top && right) || (bottom && left)) { displayer()->setCursor(Gdk::Cursor::create(MAIN->getWindow()->get_display(), "nesw-resize")); } else if(top || bottom) { displayer()->setCursor(Gdk::Cursor::create(MAIN->getWindow()->get_display(), "ns-resize")); } else if(left || right) { displayer()->setCursor(Gdk::Cursor::create(MAIN->getWindow()->get_display(), "ew-resize")); } else { displayer()->setCursor(Glib::RefPtr(0)); } } Geometry::Point movePos(p.x - m_resizeOffset.x, p.y - m_resizeOffset.y); Geometry::Rectangle bb = displayer()->getSceneBoundingRect(); movePos.x = std::min(std::max(bb.x, movePos.x), bb.x + bb.width); movePos.y = std::min(std::max(bb.y, movePos.y), bb.y + bb.height); if(!m_resizeHandlers.empty()) { for(const ResizeHandler& handler : m_resizeHandlers) { handler(movePos, m_anchor, m_point); } setRect(Geometry::Rectangle(m_anchor, m_point)); m_signalGeometryChanged.emit(rect()); displayer()->ensureVisible(event->x, event->y); return true; } return false; } gImageReader-3.2.3/gtk/src/Displayer.hh000066400000000000000000000226261312567024200176760ustar00rootroot00000000000000/* -*- Mode: C++; indent-tabs-mode: t; c-basic-offset: 4; tab-width: 4 -*- */ /* * Displayer.hh * Copyright (C) 2013-2017 Sandro Mani * * gImageReader 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. * * gImageReader 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 this program. If not, see . */ #ifndef DISPLAYER_HH #define DISPLAYER_HH #include "common.hh" #include "Geometry.hh" #include #include #include #include class DisplayerItem; class DisplayerImageItem; class DisplayerTool; class DisplayRenderer; class Source; class Displayer { public: Displayer(); ~Displayer() { setSources(std::vector()); } void setTool(DisplayerTool* tool) { m_tool = tool; } bool setSources(const std::vector sources); int getCurrentPage() const { return m_pagespin->get_value_as_int(); } bool setCurrentPage(int page); double getCurrentAngle() const { return m_rotspin->get_value(); } double getCurrentScale() const { return m_scale; } void setAngle(double angle); int getCurrentResolution() { return m_resspin->get_value_as_int(); } void setResolution(int resolution); std::string getCurrentImage(int& page) const; Cairo::RefPtr getImage(const Geometry::Rectangle& rect) const; Geometry::Rectangle getSceneBoundingRect() const; Geometry::Point mapToSceneClamped(const Geometry::Point& p) const; int getNPages() { double min, max; m_pagespin->get_range(min, max); return int(max); } bool hasMultipleOCRAreas(); std::vector> getOCRAreas(); bool allowAutodetectOCRAreas() const; void autodetectOCRAreas(); void setCursor(Glib::RefPtr cursor); void ensureVisible(double evx, double evy); void addItem(DisplayerItem* item); void removeItem(DisplayerItem* item); void invalidateRect(const Geometry::Rectangle& rect); void resortItems(); private: enum class Zoom { In, Out, Fit, One }; enum class RotateMode { CurrentPage, AllPages } m_rotateMode; Gtk::DrawingArea* m_canvas; Gtk::Viewport* m_viewport; Glib::RefPtr m_hadj; Glib::RefPtr m_vadj; Gtk::Button* m_zoominbtn; Gtk::Button* m_zoomoutbtn; Gtk::ToggleButton* m_zoomfitbtn; Gtk::ToggleButton* m_zoomonebtn; Gtk::Image* m_rotimage; Gtk::SpinButton* m_rotspin; Gtk::SpinButton* m_pagespin; Gtk::SpinButton* m_resspin; Gtk::SpinButton* m_brispin; Gtk::SpinButton* m_conspin; Gtk::ScrolledWindow* m_scrollwin; Gtk::CheckButton* m_invcheck; std::vector m_sources; std::map> m_pageMap; Source* m_currentSource = nullptr; DisplayRenderer* m_renderer = nullptr; Cairo::RefPtr m_image; double m_scale = 1.0; double m_scrollPos[2] = {0.5, 0.5}; DisplayerTool* m_tool = nullptr; DisplayerImageItem* m_imageItem = nullptr; std::vector m_items; DisplayerItem* m_activeItem = nullptr; double m_panPos[2] = {0., 0.}; sigc::connection m_renderTimer; sigc::connection m_connection_pageSpinChanged; sigc::connection m_connection_rotSpinChanged; sigc::connection m_connection_resSpinChanged; sigc::connection m_connection_briSpinChanged; sigc::connection m_connection_conSpinChanged; sigc::connection m_connection_invcheckToggled; sigc::connection m_connection_zoomfitClicked; sigc::connection m_connection_zoomoneClicked; sigc::connection m_connection_setScaledImage; void resizeEvent(); bool keyPressEvent(GdkEventKey* ev); bool mouseMoveEvent(GdkEventMotion* ev); bool mousePressEvent(GdkEventButton* ev); bool mouseReleaseEvent(GdkEventButton* ev); bool scrollEvent(GdkEventScroll* ev); void setZoom(Zoom zoom); bool renderImage(); void brightnessChanged(); void contrastChanged(); void resolutionChanged(); void invertColorsChanged(); void drawCanvas(const Cairo::RefPtr& ctx); void positionCanvas(); void queueRenderImage(); void setRotateMode(RotateMode mode, const std::string& iconName); struct ScaleRequest { enum Request { Scale, Abort, Quit } type; double scale; int resolution; int page; int brightness; int contrast; bool invert; ScaleRequest(Request _type, double _scale = 0., int _resolution = 0, int _page = 0, int _brightness = 0, int _contrast = 0, bool _invert = 0) : type(_type), scale(_scale), resolution(_resolution), page(_page), brightness(_brightness), contrast(_contrast), invert(_invert) {} }; Glib::Threads::Thread* m_scaleThread = nullptr; Glib::Threads::Mutex m_scaleMutex; Glib::Threads::Cond m_scaleCond; std::queue m_scaleRequests; sigc::connection m_scaleTimer; void sendScaleRequest(const ScaleRequest& request); void scaleThread(); void setScaledImage(Cairo::RefPtr image); }; class DisplayerItem { public: friend class Displayer; virtual ~DisplayerItem() {} Displayer* displayer() const { return m_displayer; } void setZIndex(int zIndex); double zIndex() const { return m_zIndex; } void setRect(const Geometry::Rectangle& rect); const Geometry::Rectangle& rect() const { return m_rect; } void setVisible(bool visible); bool visible() const { return m_visible; } void update(); virtual void draw(Cairo::RefPtr ctx) const = 0; virtual bool mousePressEvent(GdkEventButton */*event*/) { return false; } virtual bool mouseMoveEvent(GdkEventMotion */*event*/) { return false; } virtual bool mouseReleaseEvent(GdkEventButton */*event*/) { return false; } static bool zIndexCmp(const DisplayerItem* lhs, const DisplayerItem* rhs) { return lhs->m_zIndex < rhs->m_zIndex; } private: Displayer* m_displayer = nullptr; Geometry::Rectangle m_rect; int m_zIndex = 0; bool m_visible = true; }; class DisplayerImageItem : public DisplayerItem { public: using DisplayerItem::DisplayerItem; void draw(Cairo::RefPtr ctx) const override; void setImage(Cairo::RefPtr image) { m_image = image; } void setRotation(double rotation) { m_rotation = rotation; } protected: Cairo::RefPtr m_image; double m_rotation = 0.; }; class DisplayerSelection : public DisplayerItem { public: DisplayerSelection(DisplayerTool* tool, const Geometry::Point& anchor) : m_tool(tool), m_anchor(anchor), m_point(anchor) { setRect(Geometry::Rectangle(anchor, anchor)); } void setPoint(const Geometry::Point& point) { m_point = point; setRect(Geometry::Rectangle(m_anchor, m_point)); } void setAnchorAndPoint(const Geometry::Point& anchor, const Geometry::Point& point) { m_anchor = anchor; m_point = point; setRect(Geometry::Rectangle(m_anchor, m_point)); } void rotate(const Geometry::Rotation &R) { m_anchor = R.rotate(m_anchor); m_point = R.rotate(m_point); setRect(Geometry::Rectangle(m_anchor, m_point)); } void scale(double factor) { m_anchor = Geometry::Point(m_anchor.x * factor, m_anchor.y * factor); m_point = Geometry::Point(m_point.x * factor, m_point.y * factor); } sigc::signal signal_geometry_changed() { return m_signalGeometryChanged; } void draw(Cairo::RefPtr ctx) const override; bool mousePressEvent(GdkEventButton *event) override; bool mouseReleaseEvent(GdkEventButton *event) override; bool mouseMoveEvent(GdkEventMotion *event) override; protected: DisplayerTool* m_tool; virtual void showContextMenu(GdkEventButton* /*event*/) {} private: typedef void(*ResizeHandler)(const Geometry::Point&, Geometry::Point&, Geometry::Point&); Geometry::Point m_anchor; Geometry::Point m_point; std::vector m_resizeHandlers; Geometry::Point m_resizeOffset; sigc::signal m_signalGeometryChanged; static void resizeAnchorX(const Geometry::Point& pos, Geometry::Point& anchor, Geometry::Point& /*point*/) { anchor.x = pos.x; } static void resizeAnchorY(const Geometry::Point& pos, Geometry::Point& anchor, Geometry::Point& /*point*/) { anchor.y = pos.y; } static void resizePointX(const Geometry::Point& pos, Geometry::Point& /*anchor*/, Geometry::Point& point) { point.x = pos.x; } static void resizePointY(const Geometry::Point& pos, Geometry::Point& /*anchor*/, Geometry::Point& point) { point.y = pos.y; } }; class DisplayerTool { public: DisplayerTool(Displayer* displayer) : m_displayer(displayer) {} virtual ~DisplayerTool() {} virtual bool mousePressEvent(GdkEventButton */*event*/) { return false; } virtual bool mouseMoveEvent(GdkEventMotion */*event*/) { return false; } virtual bool mouseReleaseEvent(GdkEventButton */*event*/) { return false; } virtual void pageChanged() {} virtual void resolutionChanged(double /*factor*/) {} virtual void rotationChanged(double /*delta*/) {} virtual std::vector> getOCRAreas() = 0; virtual bool hasMultipleOCRAreas() const { return false; } virtual bool allowAutodetectOCRAreas() const { return false; } virtual void autodetectOCRAreas() {} virtual void reset() {} protected: Displayer* m_displayer; }; #endif // IMAGEDISPLAYER_HH gImageReader-3.2.3/gtk/src/DisplayerToolHOCR.cc000066400000000000000000000075171312567024200212000ustar00rootroot00000000000000/* -*- Mode: C++; indent-tabs-mode: t; c-basic-offset: 4; tab-width: 4 -*- */ /* * DisplayerToolHOCR.cc * Copyright (C) 2016-2017 Sandro Mani * * gImageReader 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. * * gImageReader 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 this program. If not, see . */ #include "DisplayerToolHOCR.hh" #include "MainWindow.hh" #include "Recognizer.hh" #include "Utils.hh" DisplayerToolHOCR::DisplayerToolHOCR(Displayer *displayer) : DisplayerTool(displayer) { MAIN->getRecognizer()->setRecognizeMode(_("Recognize")); } DisplayerToolHOCR::~DisplayerToolHOCR() { clearSelection(); } std::vector> DisplayerToolHOCR::getOCRAreas() { std::vector> surfaces; surfaces.push_back(m_displayer->getImage(m_displayer->getSceneBoundingRect())); return surfaces; } bool DisplayerToolHOCR::mousePressEvent(GdkEventButton* event) { if(event->button == 1 && m_drawingSelection) { clearSelection(); m_selection = new DisplayerSelection(this, m_displayer->mapToSceneClamped(Geometry::Point(event->x, event->y))); m_displayer->addItem(m_selection); return true; } return false; } bool DisplayerToolHOCR::mouseMoveEvent(GdkEventMotion* event) { if(m_selection && m_drawingSelection) { Geometry::Point p = m_displayer->mapToSceneClamped(Geometry::Point(event->x, event->y)); m_selection->setPoint(p); m_displayer->ensureVisible(event->x, event->y); return true; } return false; } bool DisplayerToolHOCR::mouseReleaseEvent(GdkEventButton* /*event*/) { if(m_selection && m_drawingSelection) { if(m_selection->rect().width < 5. || m_selection->rect().height < 5.) { clearSelection(); } else { Geometry::Rectangle sceneRect = m_displayer->getSceneBoundingRect(); Geometry::Rectangle r = m_selection->rect().translate(-sceneRect.x, -sceneRect.y); m_signalSelectionDrawn.emit(Geometry::Rectangle(int(r.x), int(r.y), int(r.width), int(r.height))); } m_drawingSelection = false; return true; } m_drawingSelection = false; return false; } void DisplayerToolHOCR::setSelection(const Geometry::Rectangle& rect) { m_drawingSelection = false; Geometry::Rectangle sceneRect = m_displayer->getSceneBoundingRect(); Geometry::Rectangle r = rect.translate(sceneRect.x, sceneRect.y); if(!m_selection) { m_selection = new DisplayerSelection(this, Geometry::Point(r.x, r.y)); CONNECT(m_selection, geometry_changed, [this](const Geometry::Rectangle& rect) { selectionChanged(rect); }); m_displayer->addItem(m_selection); } m_selection->setAnchorAndPoint(Geometry::Point(r.x, r.y), Geometry::Point(r.x + r.width, r.y + r.height)); } Cairo::RefPtr DisplayerToolHOCR::getSelection(const Geometry::Rectangle& rect) { Geometry::Rectangle sceneRect = m_displayer->getSceneBoundingRect(); return m_displayer->getImage(rect.translate(sceneRect.x, sceneRect.y)); } void DisplayerToolHOCR::clearSelection() { if(m_selection) { m_displayer->removeItem(m_selection); delete m_selection; m_selection = nullptr; } } void DisplayerToolHOCR::selectionChanged(const Geometry::Rectangle& rect) { Geometry::Rectangle sceneRect = m_displayer->getSceneBoundingRect(); Geometry::Rectangle r = rect.translate(-sceneRect.x, -sceneRect.y); m_signalSelectionGeometryChanged.emit(Geometry::Rectangle(int(r.x), int(r.y), int(r.width), int(r.height))); } gImageReader-3.2.3/gtk/src/DisplayerToolHOCR.hh000066400000000000000000000044411312567024200212030ustar00rootroot00000000000000/* -*- Mode: C++; indent-tabs-mode: t; c-basic-offset: 4; tab-width: 4 -*- */ /* * DisplayerToolHOCR.hh * Copyright (C) 2016-2017 Sandro Mani * * gImageReader 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. * * gImageReader 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 this program. If not, see . */ #ifndef DISPLAYERTOOLHOCR_HH #define DISPLAYERTOOLHOCR_HH #include "Displayer.hh" namespace Geometry { class Rectangle; } class DisplayerToolHOCR : public DisplayerTool { public: DisplayerToolHOCR(Displayer* displayer); ~DisplayerToolHOCR(); std::vector> getOCRAreas() override; void pageChanged() override { clearSelection(); } void resolutionChanged(double /*factor*/) override { clearSelection(); } void rotationChanged(double /*delta*/) override { clearSelection(); } void reset() override { clearSelection(); } bool mousePressEvent(GdkEventButton *event) override; bool mouseMoveEvent(GdkEventMotion *event) override; bool mouseReleaseEvent(GdkEventButton *event) override; void activateDrawSelection() { m_drawingSelection = true; } void setSelection(const Geometry::Rectangle& rect); Cairo::RefPtr getSelection(const Geometry::Rectangle& rect); void clearSelection(); sigc::signal signal_selection_drawn() { return m_signalSelectionDrawn; } sigc::signal signal_selection_geometry_changed() { return m_signalSelectionGeometryChanged; } private: DisplayerSelection* m_selection = nullptr; bool m_drawingSelection = false; sigc::signal m_signalSelectionDrawn; sigc::signal m_signalSelectionGeometryChanged; void selectionChanged(const Geometry::Rectangle& rect); }; #endif // DISPLAYERTOOLHOCR_HH gImageReader-3.2.3/gtk/src/DisplayerToolSelect.cc000066400000000000000000000305341312567024200216570ustar00rootroot00000000000000/* -*- Mode: C++; indent-tabs-mode: t; c-basic-offset: 4; tab-width: 4 -*- */ /* * DisplayerToolSelect.cc * Copyright (C) 2013-2017 Sandro Mani * * gImageReader 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. * * gImageReader 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 this program. If not, see . */ #include "DisplayerToolSelect.hh" #include "Displayer.hh" #include "FileDialogs.hh" #include "MainWindow.hh" #include "Recognizer.hh" #include "Utils.hh" #include #include DisplayerToolSelect::DisplayerToolSelect(Displayer *displayer) : DisplayerTool(displayer) { Gtk::Button* autolayoutButton = MAIN->getWidget("button:main.autolayout"); m_connectionAutolayout = CONNECT(autolayoutButton, clicked, [this] { autodetectLayout(); }); MAIN->getConfig()->addSetting(new VarSetting("selectionsavefile")); std::string selectionsavefile = MAIN->getConfig()->getSetting>("selectionsavefile")->getValue(); if(selectionsavefile.empty()) { selectionsavefile = Glib::build_filename(Utils::get_documents_dir(), _("selection.png")); MAIN->getConfig()->getSetting>("selectionsavefile")->setValue(selectionsavefile); } autolayoutButton->set_visible(true); updateRecognitionModeLabel(); } DisplayerToolSelect::~DisplayerToolSelect() { clearSelections(); MAIN->getWidget("button:main.autolayout").as()->set_visible(false); m_connectionAutolayout.disconnect(); } bool DisplayerToolSelect::mousePressEvent(GdkEventButton* event) { if(event->button == 1 && m_curSel == nullptr) { if((event->state & Gdk::CONTROL_MASK) == 0) { clearSelections(); } m_curSel = new NumberedDisplayerSelection(this, 1 + m_selections.size(), m_displayer->mapToSceneClamped(Geometry::Point(event->x, event->y))); m_curSel->setZIndex(1 + m_selections.size()); m_displayer->addItem(m_curSel); return true; } return false; } bool DisplayerToolSelect::mouseMoveEvent(GdkEventMotion* event) { if(m_curSel) { Geometry::Point p = m_displayer->mapToSceneClamped(Geometry::Point(event->x, event->y)); m_curSel->setPoint(p); m_displayer->ensureVisible(event->x, event->y); return true; } return false; } bool DisplayerToolSelect::mouseReleaseEvent(GdkEventButton* /*event*/) { if(m_curSel) { if(m_curSel->rect().width < 5. || m_curSel->rect().height < 5.) { m_displayer->removeItem(m_curSel); delete m_curSel; } else { m_selections.push_back(m_curSel); updateRecognitionModeLabel(); } m_curSel = nullptr; return true; } return false; } void DisplayerToolSelect::resolutionChanged(double factor) { for(NumberedDisplayerSelection* sel : m_selections) { sel->scale(factor); } } void DisplayerToolSelect::rotationChanged(double delta) { Geometry::Rotation R(delta); for(NumberedDisplayerSelection* sel : m_selections) { sel->rotate(R); } } std::vector> DisplayerToolSelect::getOCRAreas() { std::vector> images; if(m_selections.empty()) { images.push_back(m_displayer->getImage(m_displayer->getSceneBoundingRect())); } else { for(const NumberedDisplayerSelection* sel : m_selections) { images.push_back(m_displayer->getImage(sel->rect())); } } return images; } void DisplayerToolSelect::clearSelections() { for(NumberedDisplayerSelection* sel : m_selections) { m_displayer->removeItem(sel); delete sel; } m_selections.clear(); updateRecognitionModeLabel(); } void DisplayerToolSelect::removeSelection(int num) { m_displayer->removeItem(m_selections[num - 1]); delete m_selections[num - 1]; m_selections.erase(m_selections.begin() + num - 1); for(int i = 0, n = m_selections.size(); i < n; ++i) { m_selections[i]->setNumber(1 + i); m_selections[i]->setZIndex(1 + i); } } void DisplayerToolSelect::reorderSelection(int oldNum, int newNum) { NumberedDisplayerSelection* sel = m_selections[oldNum - 1]; m_selections.erase(m_selections.begin() + oldNum - 1); m_selections.insert(m_selections.begin() + newNum - 1, sel); for(int i = 0, n = m_selections.size(); i < n; ++i) { m_selections[i]->setNumber(1 + i); m_selections[i]->setZIndex(1 + i); } } void DisplayerToolSelect::saveSelection(NumberedDisplayerSelection* selection) { Cairo::RefPtr img = m_displayer->getImage(selection->rect()); std::string filename = Utils::make_output_filename(MAIN->getConfig()->getSetting>("selectionsavefile")->getValue()); FileDialogs::FileFilter filter = {_("PNG Images"), {"image/png"}, {"*.png"}}; filename = FileDialogs::save_dialog(_("Save Selection Image"), filename, filter); if(!filename.empty()) { MAIN->getConfig()->getSetting>("selectionsavefile")->setValue(filename); img->write_to_png(filename); } } void DisplayerToolSelect::updateRecognitionModeLabel() { MAIN->getRecognizer()->setRecognizeMode(m_selections.empty() ? _("Recognize all") : _("Recognize selection")); } void DisplayerToolSelect::autodetectLayout(bool noDeskew) { clearSelections(); double avgDeskew = 0.; int nDeskew = 0; std::vector rects; Cairo::RefPtr img = m_displayer->getImage(m_displayer->getSceneBoundingRect()); // Perform layout analysis Utils::busyTask([this,&nDeskew,&avgDeskew,&rects,&img] { tesseract::TessBaseAPI tess; tess.InitForAnalysePage(); tess.SetPageSegMode(tesseract::PSM_AUTO_ONLY); tess.SetImage(img->get_data(), img->get_width(), img->get_height(), 4, 4 * img->get_width()); tesseract::PageIterator* it = tess.AnalyseLayout(); if(it && !it->Empty(tesseract::RIL_BLOCK)) { do { int x1, y1, x2, y2; tesseract::Orientation orient; tesseract::WritingDirection wdir; tesseract::TextlineOrder tlo; float deskew; it->BoundingBox(tesseract::RIL_BLOCK, &x1, &y1, &x2, &y2); it->Orientation(&orient, &wdir, &tlo, &deskew); avgDeskew += deskew; ++nDeskew; float width = x2 - x1, height = y2 - y1; if(width > 10 && height > 10) { rects.push_back(Geometry::Rectangle(x1 - 0.5 * img->get_width(), y1 - 0.5 * img->get_height(), width, height)); } } while(it->Next(tesseract::RIL_BLOCK)); } delete it; return true; }, _("Performing layout analysis")); // If a somewhat large deskew angle is detected, automatically rotate image and redetect layout, // unless we already attempted to rotate (to prevent endless loops) avgDeskew = Utils::round(((avgDeskew/nDeskew)/M_PI * 180.) * 10.) / 10.; if(std::abs(avgDeskew) > .1 && !noDeskew) { m_displayer->setAngle(m_displayer->getCurrentAngle() - avgDeskew); autodetectLayout(true); } else { // Merge overlapping rectangles for(int i = rects.size(); i-- > 1;) { for(int j = i; j-- > 0;) { if(rects[j].overlaps(rects[i])) { rects[j] = rects[j].unite(rects[i]); rects.erase(rects.begin() + i); break; } } } for(int i = 0, n = rects.size(); i < n; ++i) { m_selections.push_back(new NumberedDisplayerSelection(this, 1 + i, Geometry::Point(rects[i].x, rects[i].y))); m_selections.back()->setPoint(Geometry::Point(rects[i].x + rects[i].width, rects[i].y + rects[i].height)); m_displayer->addItem(m_selections.back()); } updateRecognitionModeLabel(); } } /////////////////////////////////////////////////////////////////////////////// void NumberedDisplayerSelection::showContextMenu(GdkEventButton* event) { Gtk::Window* selmenu = MAIN->getWidget("window:selectionmenu"); Gtk::SpinButton* spin = MAIN->getWidget("spin:selectionmenu.order"); spin->get_adjustment()->set_upper(static_cast(m_tool)->m_selections.size()); spin->get_adjustment()->set_value(m_number); Glib::RefPtr loop = Glib::MainLoop::create(); std::vector selmenuConnections = { CONNECT(spin, value_changed, [&]{ reorderSelection(spin->get_value()); }), CONNECT(MAIN->getWidget("button:selectionmenu.delete").as(), clicked, [&]{ loop->quit(); static_cast(m_tool)->removeSelection(m_number); }), CONNECT(MAIN->getWidget("button:selectionmenu.recognize").as(), clicked, [&]{ loop->quit(); MAIN->getRecognizer()->recognizeImage(displayer()->getImage(rect()), Recognizer::OutputDestination::Buffer); }), CONNECT(MAIN->getWidget("button:selectionmenu.clipboard").as(), clicked, [&]{ loop->quit(); MAIN->getRecognizer()->recognizeImage(displayer()->getImage(rect()), Recognizer::OutputDestination::Clipboard); }), CONNECT(MAIN->getWidget("button:selectionmenu.save").as(), clicked, [&]{ loop->quit(); // Explicitly hide (and wait for hide event to be processed) to avoid key/mouse-grab conflicts with file dialog which pops up selmenu->hide(); while(Gtk::Main::events_pending()) { Gtk::Main::iteration(false); } static_cast(m_tool)->saveSelection(this); }), CONNECT(selmenu, button_press_event, [&](GdkEventButton* ev) { Gtk::Allocation a = selmenu->get_allocation(); if(ev->x < a.get_x() || ev->x > a.get_x() + a.get_width() || ev->y < a.get_y() || ev->y > a.get_y() + a.get_height()) { loop->quit(); } return true; }), CONNECT(selmenu, key_press_event, [&](GdkEventKey* ev) { if(ev->keyval == GDK_KEY_Escape) loop->quit(); return true; }) }; Glib::RefPtr screen = MAIN->getWindow()->get_screen(); Gdk::Rectangle rect = screen->get_monitor_workarea(screen->get_monitor_at_point(event->x_root, event->y_root)); selmenu->show_all(); int w, h, trash; selmenu->get_preferred_width(trash, w); selmenu->get_preferred_height(trash, h); int x = std::min(std::max(int(event->x_root), rect.get_x()), rect.get_x() + rect.get_width() - w); int y = std::min(std::max(int(event->y_root), rect.get_y()), rect.get_y() + rect.get_height() - h); selmenu->move(x, y); GdkWindow* gdkwin = selmenu->get_window()->gobj(); #if GTK_CHECK_VERSION(3,20,0) gdk_seat_grab(gdk_device_get_seat(gtk_get_current_event_device()), gdkwin, GDK_SEAT_CAPABILITY_ALL, true, nullptr, nullptr, nullptr, nullptr); #else gdk_device_grab(gtk_get_current_event_device(), gdkwin, GDK_OWNERSHIP_APPLICATION, true, GDK_BUTTON_PRESS_MASK, nullptr, event->time); #endif loop->run(); selmenu->hide(); for(sigc::connection& conn : selmenuConnections) { conn.disconnect(); } #if GTK_CHECK_VERSION(3,20,0) gdk_seat_ungrab(gdk_device_get_seat(gtk_get_current_event_device())); #else gdk_device_ungrab(gtk_get_current_event_device(), gtk_get_current_event_time()); #endif } void NumberedDisplayerSelection::reorderSelection(int newNumber) { static_cast(m_tool)->reorderSelection(m_number, newNumber); } void NumberedDisplayerSelection::draw(Cairo::RefPtr ctx) const { DisplayerSelection::draw(ctx); Gdk::RGBA fgcolor("#FFFFFF"); Gdk::RGBA bgcolor("#4A90D9"); double scale = displayer()->getCurrentScale(); Glib::ustring idx = Glib::ustring::compose("%1", m_number); double d = 0.5 / scale; double x1 = Utils::round(rect().x * scale) / scale + d; double y1 = Utils::round(rect().y * scale) / scale + d; double x2 = Utils::round((rect().x + rect().width) * scale) / scale - d; double y2 = Utils::round((rect().y + rect().height) * scale) / scale - d; Geometry::Rectangle paintrect(x1, y1, x2 - x1, y2 - y1); ctx->save(); // Text box double w = std::min(std::min(40. * d, paintrect.width), paintrect.height); ctx->rectangle(paintrect.x, paintrect.y, w - d, w - d); ctx->set_source_rgba(bgcolor.get_red(), bgcolor.get_green(), bgcolor.get_blue(), 1.0); ctx->fill(); // Text ctx->select_font_face("sans", Cairo::FONT_SLANT_NORMAL, Cairo::FONT_WEIGHT_BOLD); ctx->set_font_size(0.7 * w); Cairo::TextExtents ext; ctx->get_text_extents(idx, ext); ctx->translate(paintrect.x + .5 * w, paintrect.y + .5 * w); ctx->translate(-ext.x_bearing - .5 * ext.width, -ext.y_bearing - .5 * ext.height); ctx->set_source_rgba(fgcolor.get_red(), fgcolor.get_green(), bgcolor.get_blue(), 1.0); ctx->show_text(idx); ctx->restore(); } gImageReader-3.2.3/gtk/src/DisplayerToolSelect.hh000066400000000000000000000051141312567024200216650ustar00rootroot00000000000000/* -*- Mode: C++; indent-tabs-mode: t; c-basic-offset: 4; tab-width: 4 -*- */ /* * DisplayerToolSelect.hh * Copyright (C) 2013-2017 Sandro Mani * * gImageReader 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. * * gImageReader 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 this program. If not, see . */ #ifndef DISPLAYERTOOLSELECT_HH #define DISPLAYERTOOLSELECT_HH #include "Displayer.hh" class NumberedDisplayerSelection; class DisplayerToolSelect : public DisplayerTool { public: DisplayerToolSelect(Displayer* displayer); ~DisplayerToolSelect(); bool mousePressEvent(GdkEventButton *event) override; bool mouseMoveEvent(GdkEventMotion *event) override; bool mouseReleaseEvent(GdkEventButton *event) override; void resolutionChanged(double factor) override; void rotationChanged(double delta) override; std::vector> getOCRAreas() override; bool hasMultipleOCRAreas() const override { return !m_selections.empty(); } bool allowAutodetectOCRAreas() const override { return true; } void autodetectOCRAreas() override { autodetectLayout(); } void reset() override { clearSelections(); } private: friend class NumberedDisplayerSelection; NumberedDisplayerSelection* m_curSel = nullptr; std::vector m_selections; sigc::connection m_connectionAutolayout; void clearSelections(); void removeSelection(int num); void reorderSelection(int oldNum, int newNum); void saveSelection(NumberedDisplayerSelection* selection); void updateRecognitionModeLabel(); void autodetectLayout(bool noDeskew = false); }; class NumberedDisplayerSelection : public DisplayerSelection { public: NumberedDisplayerSelection(DisplayerToolSelect* selectTool, int number, const Geometry::Point& anchor) : DisplayerSelection(selectTool, anchor), m_number(number) { } void setNumber(int number) { m_number = number; } void reorderSelection(int newNumber); void draw(Cairo::RefPtr ctx) const override; private: int m_number; void showContextMenu(GdkEventButton *event) override; }; #endif // DISPLAYERTOOLSELECT_HH gImageReader-3.2.3/gtk/src/FileDialogs.cc000066400000000000000000000251201312567024200201020ustar00rootroot00000000000000/* -*- Mode: C++; indent-tabs-mode: t; c-basic-offset: 4; tab-width: 4 -*- */ /* * FileDialogs.cc * Copyright (C) 2013-2017 Sandro Mani * * gImageReader 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. * * gImageReader 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 this program. If not, see . */ #include "FileDialogs.hh" #include "MainWindow.hh" #include "Utils.hh" #include #ifdef G_OS_WIN32 #include #include #include #else #include #endif #ifdef G_OS_WIN32 static std::wstring s2ws(const std::string& s) { g_assert(sizeof(wchar_t) == sizeof(gunichar2)); const char* in = s.c_str(); wchar_t* buf = reinterpret_cast(g_utf8_to_utf16(in, -1, nullptr, nullptr, nullptr)); std::wstring out(buf); g_free(buf); return out; } static std::string ws2s(const std::wstring& s) { g_assert(sizeof(wchar_t) == sizeof(gunichar2)); const gunichar2* in = reinterpret_cast(s.c_str()); char* buf = g_utf16_to_utf8(in, -1, nullptr, nullptr, nullptr); std::string out(buf); g_free(buf); return out; } std::wstring FileDialogs::FileFilter::to_win32_filter() const { std::wstring filterstr = s2ws(name); filterstr += L'\0'; for(const std::string& pattern : patterns) { filterstr += s2ws(pattern) + L';'; } if(filterstr.back() == L';') { filterstr.back() = L'\0'; } return filterstr; } static std::vector> win32_open_dialog(const Glib::ustring &title, const std::string& initialDirectory, const std::wstring& filter, bool multiple, Gtk::Window *parent) { wchar_t wfile[1024] = {}; std::wstring winitialDirectory = s2ws(initialDirectory); std::wstring wtitle = s2ws(title); OPENFILENAMEW ofn = {}; ofn.lStructSize = sizeof(OPENFILENAME); ofn.hwndOwner = gdk_win32_window_get_impl_hwnd(parent->get_window()->gobj()); ofn.lpstrFilter = filter.c_str(); ofn.nFilterIndex = 0; ofn.lpstrFile = wfile; ofn.nMaxFile = sizeof(wfile); ofn.lpstrInitialDir = winitialDirectory.c_str(); ofn.lpstrTitle = wtitle.c_str(); ofn.Flags = OFN_NONETWORKBUTTON|OFN_EXPLORER; if(multiple) ofn.Flags |= OFN_ALLOWMULTISELECT; bool ok = GetOpenFileNameW(&ofn); std::vector> files; if(ok) { if(ofn.nFileOffset == 0) { // One file only std::string filename = ws2s(ofn.lpstrFile); files.push_back(Gio::File::create_for_path(filename)); } else { std::string directory = ws2s(ofn.lpstrFile); size_t offset = ofn.nFileOffset; while(true) { size_t len = wcslen(ofn.lpstrFile + offset); if(len == 0) { break; } else { std::string filename = ws2s(ofn.lpstrFile + offset); files.push_back(Gio::File::create_for_path(filename)); offset += len + 1; // +1: string length + terminator, end of string is doubly terminated } } } } return files; } static std::string win32_save_dialog(const Glib::ustring &title, const std::string &suggestedFile, const std::wstring& filter, Gtk::Window *parent) { std::wstring wsuggestedFile = s2ws(suggestedFile); std::wstring wtitle = s2ws(title); std::wstring suggestedName = s2ws(Glib::path_get_basename(suggestedFile)); wchar_t wfile[MAX_PATH] = {}; wcsncpy(wfile, suggestedName.c_str(), sizeof(wfile) / sizeof(wfile[0])); OPENFILENAMEW ofn = {}; ofn.lStructSize = sizeof(OPENFILENAME); ofn.hwndOwner = gdk_win32_window_get_impl_hwnd(parent->get_window()->gobj()); ofn.lpstrFilter = filter.c_str(); ofn.lpstrFile = wfile; ofn.nMaxFile = sizeof(wfile); ofn.lpstrInitialDir = wsuggestedFile.c_str(); ofn.lpstrTitle = wtitle.c_str(); ofn.Flags = OFN_NONETWORKBUTTON|OFN_EXPLORER|OFN_OVERWRITEPROMPT; bool ok = GetSaveFileNameW(&ofn); std::string filename; if(ok) { filename = ws2s(ofn.lpstrFile); } return filename; } #else Glib::RefPtr FileDialogs::FileFilter::to_gnome_filter() const { Glib::RefPtr filefilter = Gtk::FileFilter::create(); filefilter->set_name(name); for(const std::string& mime_type : mime_types) { filefilter->add_mime_type(mime_type); } for(const std::string& pattern : patterns) { filefilter->add_pattern(pattern); } return filefilter; } static std::vector> gnome_open_dialog(const std::string& title, const std::string& initialDirectory, Glib::RefPtr filter, bool multiple, Gtk::Window* parent) { Gtk::FileChooserDialog dialog(*parent, title); dialog.add_button(_("Cancel"), Gtk::RESPONSE_CANCEL); dialog.add_button(_("OK"), Gtk::RESPONSE_OK); dialog.set_select_multiple(multiple); dialog.set_local_only(false); dialog.set_filter(filter); dialog.set_current_folder(initialDirectory); if(dialog.run() == Gtk::RESPONSE_OK) { return dialog.get_files(); } return std::vector>(); } static std::string gnome_save_dialog(const Glib::ustring &title, const std::string &suggestedFile, Glib::RefPtr filter, Gtk::Window *parent) { Gtk::FileChooserDialog dialog(*parent, title, Gtk::FILE_CHOOSER_ACTION_SAVE); dialog.add_button("gtk-cancel", Gtk::RESPONSE_CANCEL); dialog.add_button("gtk-ok", Gtk::RESPONSE_OK); dialog.set_select_multiple(false); dialog.set_create_folders(true); dialog.set_do_overwrite_confirmation(true); dialog.set_local_only(false); dialog.set_current_folder(Glib::path_get_dirname(suggestedFile)); dialog.set_current_name(Glib::path_get_basename(suggestedFile)); dialog.set_filter(filter); if(dialog.run() == Gtk::RESPONSE_OK) { return dialog.get_filename(); } return ""; } Glib::ustring FileDialogs::FileFilter::to_kde_filter() const { Glib::ustring filter; for(const std::string& mime_type : mime_types) { filter += mime_type + " "; } return filter; } static std::vector> kde_open_dialog(const Glib::ustring& title, const std::string& initialDirectory, const Glib::ustring& filter, bool multiple, Gtk::Window* parent) { // Command line std::vector argv = { "/usr/bin/kdialog", "--getopenfilename", initialDirectory, filter, multiple ? "--multiple" : "", "--separate-output", "--attach", Glib::ustring::compose("%1", gdk_x11_window_get_xid(parent->get_window()->gobj())), "--title", title/*, "--caption", PACKAGE_NAME*/ }; // Spawn process std::string stdout; int exit_status = -1; Glib::spawn_sync("", argv, /*Glib::SPAWN_DEFAULT*/Glib::SpawnFlags(0), sigc::slot(), &stdout, nullptr, &exit_status); std::vector> files; if(exit_status == 0) { std::istringstream iss(stdout); std::string filename; while(std::getline(iss, filename)) { files.push_back(Gio::File::create_for_path(filename)); } } return files; } static std::string kde_save_dialog(const Glib::ustring &title, const std::string &suggestedFile, const Glib::ustring& filter, Gtk::Window *parent) { std::string filename = suggestedFile; do { std::vector argv = { "/usr/bin/kdialog", "--getsavefilename", filename, filter, "--attach", Glib::ustring::compose("%1", gdk_x11_window_get_xid(parent->get_window()->gobj())), "--title", title/*, "--caption", PACKAGE_NAME*/ }; int exit_status = -1; std::string stdout; Glib::spawn_sync("", argv, /*Glib::SPAWN_DEFAULT*/Glib::SpawnFlags(0), sigc::slot(), &stdout, nullptr, &exit_status); if(exit_status != 0) { break; } std::istringstream iss(stdout); std::getline(iss, filename); if(Glib::file_test(filename, Glib::FILE_TEST_EXISTS)) { std::vector argv = { "/usr/bin/kdialog", "--yesno", Glib::ustring::compose(_("A file named \"%1\" already exists. Are you sure you want to overwrite it?"), Glib::path_get_basename(filename)), "--attach", Glib::ustring::compose("%1", gdk_x11_window_get_xid(parent->get_window()->gobj())), "--title", _("Overwrite File?")/*, "--caption", PACKAGE_NAME*/ }; Glib::spawn_sync("", argv, /*Glib::SPAWN_DEFAULT*/Glib::SpawnFlags(0), sigc::slot(), nullptr, nullptr, &exit_status); if(exit_status != 0) { continue; } } return filename; } while(true); return std::string(); } static bool is_kde() { static bool is_kde = Glib::ustring(Glib::getenv("XDG_CURRENT_DESKTOP")).lowercase() == "kde" && Glib::file_test("/usr/bin/kdialog", Glib::FILE_TEST_EXISTS); return is_kde; } #endif FileDialogs::FileFilter FileDialogs::FileFilter::pixbuf_formats() { FileFilter filter; for(const Gdk::PixbufFormat& format : Gdk::Pixbuf::get_formats()) { for(const Glib::ustring& mime : format.get_mime_types()) { filter.mime_types.push_back(mime); } for(const Glib::ustring& extension : format.get_extensions()) { filter.patterns.push_back(Glib::ustring::compose("*.%1", extension)); } } return filter; } namespace FileDialogs { std::vector> open_dialog(const Glib::ustring &title, const std::string& initialDirectory, const FileFilter &filter, bool multiple, Gtk::Window *parent) { std::vector> filenames; parent = parent == nullptr ? MAIN->getWindow() : parent; std::string initialDir = initialDirectory.empty() ? Glib::get_home_dir() : initialDirectory; #ifdef G_OS_WIN32 filenames = win32_open_dialog(title, initialDir, filter.to_win32_filter(), multiple, parent); #else if(is_kde()) { filenames = kde_open_dialog(title, initialDir, filter.to_kde_filter(), multiple, parent); } else { filenames = gnome_open_dialog(title, initialDir, filter.to_gnome_filter(), multiple, parent); } #endif return filenames; } std::string save_dialog(const Glib::ustring &title, const std::string& suggestedFile, const FileFilter& filter, Gtk::Window *parent) { std::string filename; parent = parent == nullptr ? MAIN->getWindow() : parent; #ifdef G_OS_WIN32 filename = win32_save_dialog(title, suggestedFile, filter.to_win32_filter(), parent); #else if(is_kde()) { filename = kde_save_dialog(title, suggestedFile, filter.to_kde_filter(), parent); } else { filename = gnome_save_dialog(title, suggestedFile, filter.to_gnome_filter(), parent); } #endif if(!filename.empty()) { std::string sbase, sext; std::string base, ext; Utils::get_filename_parts(suggestedFile, sbase, sext); Utils::get_filename_parts(filename, base, ext); if(ext.empty()) { filename = base + "." + sext; } } return filename; } } // FileDialogs gImageReader-3.2.3/gtk/src/FileDialogs.hh000066400000000000000000000030771312567024200201230ustar00rootroot00000000000000/* -*- Mode: C++; indent-tabs-mode: t; c-basic-offset: 4; tab-width: 4 -*- */ /* * FileDialogs.hh * Copyright (C) 2013-2017 Sandro Mani * * gImageReader 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. * * gImageReader 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 this program. If not, see . */ #ifndef FILEDIALOGS_HH #define FILEDIALOGS_HH #include "common.hh" namespace FileDialogs { struct FileFilter { std::string name; std::vector mime_types; std::vector patterns; #ifdef G_OS_WIN32 std::wstring to_win32_filter() const; #endif Glib::RefPtr to_gnome_filter() const; Glib::ustring to_kde_filter() const; static FileFilter pixbuf_formats(); }; std::vector > open_dialog(const Glib::ustring& title, const std::string& initialDirectory, const FileFilter& filter, bool multiple, Gtk::Window* parent = nullptr); std::string save_dialog(const Glib::ustring &title, const std::string& suggestedFile, const FileFilter& filter, Gtk::Window *parent = nullptr); } // FileDialogs #endif // FILEDIALOGS_HH gImageReader-3.2.3/gtk/src/Geometry.hh000066400000000000000000000050261312567024200175300ustar00rootroot00000000000000/* -*- Mode: C++; indent-tabs-mode: t; c-basic-offset: 4; tab-width: 4 -*- */ /* * Geometry.hh * Copyright (C) 2013-2017 Sandro Mani * * gImageReader 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. * * gImageReader 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 this program. If not, see . */ #ifndef GEOMETRY_HH #define GEOMETRY_HH #include "common.hh" namespace Geometry { class Point { public: union { double data[2]; struct { double x, y; }; }; Point(double _x = 0., double _y = 0.) : x(_x), y(_y) {} double operator[](int i) const { return data[i]; } double& operator[](int i) { return data[i]; } }; class Rotation { public: Rotation(double angle = 0.) { double cosa = std::cos(angle), sina = std::sin(angle); m_data[0] = cosa; m_data[1] = -sina; m_data[2] = sina; m_data[3] = cosa; } Point rotate(const Point& p) const { return Point(m_data[0] * p.x + m_data[1] * p.y, m_data[2] * p.x + m_data[3] * p.y); } double operator()(int i, int j) const { return m_data[2*i + j]; } private: double m_data[4]; }; class Rectangle { public: double x, y; double width, height; Rectangle(double _x = 0., double _y = 0., double _width = 0., double _height = 0.) : x(_x), y(_y), width(_width), height(_height) {} Rectangle(const Point& p1, const Point& p2) : x(std::min(p1.x, p2.x)), y(std::min(p1.y, p2.y)), width(std::abs(p2.x - p1.x)), height(std::abs(p2.y - p1.y)) {} bool contains(const Point& p) const { return p.x >= x && p.x <= x + width && p.y >= y && p.y <= y + height; } bool overlaps(const Rectangle& r) const { return x < r.x + r.width && x + width > r.x && y < r.y + r.height && y + height > r.y; } Rectangle unite(const Rectangle& r) const { double _x = std::min(x, r.x); double _y = std::min(y, r.y); double _w = std::max(x + width, r.x + r.width) - _x; double _h = std::max(y + height, r.y + r.height) - _y; return Rectangle(_x, _y, _w, _h); } Rectangle translate(double dx, double dy) const { return Rectangle(x + dx, y + dy, width, height); } }; } #endif // GEOMETRY_HH gImageReader-3.2.3/gtk/src/Image.cc000066400000000000000000000163201312567024200167440ustar00rootroot00000000000000/* -*- Mode: C++; indent-tabs-mode: t; c-basic-offset: 4; tab-width: 4 -*- */ /* * Geometry.hh * Copyright (C) 2016-2017 Sandro Mani * * gImageReader 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. * * gImageReader 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 this program. If not, see . */ #include "Image.hh" #include #include #if __BYTE_ORDER__ == __ORDER_BIG_ENDIAN__ # define PIXEL_A(x) x[3] # define PIXEL_R(x) x[2] # define PIXEL_G(x) x[1] # define PIXEL_B(x) x[0] #else # define PIXEL_A(x) x[3] # define PIXEL_R(x) x[2] # define PIXEL_G(x) x[1] # define PIXEL_B(x) x[0] #endif static inline uint8_t clamp(int val) { return val > 255 ? 255 : val < 0 ? 0 : val; } Image::Image(Cairo::RefPtr src, Format targetFormat, ConversionFlags flags) { width = src->get_width(); height = src->get_height(); format = targetFormat; int stride = src->get_stride(); if(format == Format_RGB24) { sampleSize = 8; bytesPerLine = 3 * width; data = new uint8_t[width * height * 3]; #pragma omp parallel for schedule(static) for(int y = 0; y < height; ++y) { for(int x = 0; x < width; ++x) { uint8_t* srcpx = &src->get_data()[y * stride + 4 * x]; uint8_t* dstpx = &data[y * bytesPerLine + 3 * x]; dstpx[0] = PIXEL_R(srcpx); dstpx[1] = PIXEL_G(srcpx); dstpx[2] = PIXEL_B(srcpx); } } } else if(format == Format_Gray8 || format == Format_Mono) { sampleSize = 8; bytesPerLine = width; data = new uint8_t[width * height]; #pragma omp parallel for schedule(static) for(int y = 0; y < height; ++y) { for(int x = 0; x < width; ++x) { uint8_t* srcpx = &src->get_data()[y * stride + 4 * x]; data[y * bytesPerLine + x] = 0.21 * PIXEL_R(srcpx) + 0.72 * PIXEL_G(srcpx) + 0.07 * PIXEL_B(srcpx); } } if(format == Format_Mono) { sampleSize = 1; bytesPerLine = width / 8 + (width % 8 != 0); uint8_t* newdata = new uint8_t[height * bytesPerLine]; std::memset(newdata, 0, height * bytesPerLine); // Dithering: https://en.wikipedia.org/wiki/Floyd%E2%80%93Steinberg_dithering for(int y = 0; y < height; ++y) { for(int x = 0; x < width; ++x) { uint8_t oldpixel = data[y * width + x]; uint8_t newpixel = oldpixel > 127 ? 255 : 0; int err = int(oldpixel) - int(newpixel); if(newpixel == 255) { newdata[y * bytesPerLine + x/8] |= 0x80 >> x%8; } if(flags == DiffuseDithering) { if(x + 1 < width) { // right neighbor uint8_t& pxr = data[y * width + (x + 1)]; pxr = clamp(pxr + ((err * 7) >> 4)); } if(y + 1 == height) { continue; // last line } if(x > 0) { // bottom left and bottom neighbor uint8_t& pxbl = data[(y + 1) * width + (x - 1)]; pxbl = clamp(pxbl + ((err * 3) >> 4)); uint8_t& pxb = data[(y + 1) * width + x]; pxb = clamp(pxb + ((err * 5) >> 4)); } if(x + 1 < width) { // bottom right neighbor uint8_t& pxbr = data[(y + 1) * width + (x + 1)]; pxbr = clamp(pxbr + ((err * 1) >> 4)); } } } } delete[] data; data = newdata; } } } void Image::writeJpeg(int quality, uint8_t*& buf, unsigned long& bufLen) { buf = nullptr; bufLen = 0; if(format == Format_Mono) { return; // not supported by jpeg } // https://github.com/LuaDist/libjpeg/blob/master/example.c jpeg_compress_struct cinfo; jpeg_error_mgr jerr; cinfo.err = jpeg_std_error(&jerr); jpeg_create_compress(&cinfo); jpeg_mem_dest(&cinfo, &buf, &bufLen); cinfo.image_width = width; cinfo.image_height = height; cinfo.input_components = format == Format_RGB24 ? 3 : 1; cinfo.in_color_space = format == Format_RGB24 ? JCS_RGB : JCS_GRAYSCALE; jpeg_set_defaults(&cinfo); jpeg_set_quality(&cinfo, quality, true); jpeg_start_compress(&cinfo, true); JSAMPROW row_pointer[1]; while (cinfo.next_scanline < cinfo.image_height) { row_pointer[0] = &data[cinfo.next_scanline * bytesPerLine]; jpeg_write_scanlines(&cinfo, row_pointer, 1); } jpeg_finish_compress(&cinfo); jpeg_destroy_compress(&cinfo); } Cairo::RefPtr Image::simulateFormat(Cairo::RefPtr src, Format format, ConversionFlags flags) { int imgw = src->get_width(); int imgh = src->get_height(); int stride = src->get_stride(); if(format == Format_Gray8 || format == Format_Mono) { Cairo::RefPtr dst = Cairo::ImageSurface::create(Cairo::FORMAT_ARGB32, imgw, imgh); dst->flush(); #pragma omp parallel for schedule(static) for(int y = 0; y < imgh; ++y) { for(int x = 0; x < imgw; ++x) { int offset = y * stride + 4 * x; uint8_t* srcpx = &src->get_data()[offset]; uint8_t* dstpx = &dst->get_data()[offset]; uint8_t gray = 0.21 * PIXEL_R(srcpx) + 0.72 * PIXEL_G(srcpx) + 0.07 * PIXEL_B(srcpx); PIXEL_A(dstpx) = 255; PIXEL_R(dstpx) = gray; PIXEL_G(dstpx) = gray; PIXEL_B(dstpx) = gray; } } if(format == Format_Mono) { // Dithering: https://en.wikipedia.org/wiki/Floyd%E2%80%93Steinberg_dithering for(int y = 0; y < imgh; ++y) { for(int x = 0; x < imgw; ++x) { uint8_t* px = &dst->get_data()[y * stride + 4 * x]; uint8_t newpixel = PIXEL_R(px) > 127 ? 255 : 0; int err = int(PIXEL_R(px)) - int(newpixel); PIXEL_R(px) = PIXEL_G(px) = PIXEL_B(px) = newpixel; if(flags == DiffuseDithering) { if(x + 1 < imgw) { // right neighbor px = &dst->get_data()[y * stride + 4 * (x + 1)]; PIXEL_R(px) = PIXEL_G(px) = PIXEL_B(px) = clamp(PIXEL_R(px) + ((err * 7) >> 4)); } if(y + 1 == imgh) { continue; // last line } if(x > 0) { // bottom left and bottom neighbor px = &dst->get_data()[(y + 1) * stride + 4 * (x - 1)]; PIXEL_R(px) = PIXEL_G(px) = PIXEL_B(px) = clamp(PIXEL_R(px) + ((err * 3) >> 4)); px = &dst->get_data()[(y + 1) * stride + 4 * x]; PIXEL_R(px) = PIXEL_G(px) = PIXEL_B(px) = clamp(PIXEL_R(px) + ((err * 5) >> 4)); } if(x + 1 < imgw) { // bottom right neighbor px = &dst->get_data()[(y + 1) * stride + 4 * (x + 1)]; PIXEL_R(px) = PIXEL_G(px) = PIXEL_B(px) = clamp(PIXEL_R(px) + ((err * 1) >> 4)); } } } } } dst->mark_dirty(); return dst; } return src; } Cairo::RefPtr Image::scale(Cairo::RefPtr src, double scaleFactor) { if(scaleFactor == 1.0) { return src; } Cairo::RefPtr dst = Cairo::ImageSurface::create(src->get_format(), std::ceil(src->get_width() * scaleFactor), std::ceil(src->get_height() * scaleFactor)); Cairo::RefPtr ctx = Cairo::Context::create(dst); ctx->scale(scaleFactor, scaleFactor); ctx->set_source(src, 0, 0); Cairo::RefPtr::cast_static(ctx->get_source())->set_filter(Cairo::FILTER_BEST); ctx->paint(); dst->flush(); return dst; } gImageReader-3.2.3/gtk/src/Image.hh000066400000000000000000000032531312567024200167570ustar00rootroot00000000000000/* -*- Mode: C++; indent-tabs-mode: t; c-basic-offset: 4; tab-width: 4 -*- */ /* * Geometry.hh * Copyright (C) 2016-2017 Sandro Mani * * gImageReader 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. * * gImageReader 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 this program. If not, see . */ #ifndef IMAGE_HH #define IMAGE_HH #include class Image { public: enum Format {Format_RGB24 = 0, Format_Gray8 = 1, Format_Mono = 2} format; // This order needs to be the same as combo:pdfoptions.imageformat enum ConversionFlags { AutoColor = 0, ThresholdDithering = 1, DiffuseDithering = 2} conversionFlags; int width; int height; int sampleSize; int bytesPerLine; unsigned char* data = nullptr; Image(Cairo::RefPtr src, Format targetFormat, ConversionFlags flags); ~Image() { delete[] data; } void writeJpeg(int quality, uint8_t*& buf, unsigned long& bufLen); static Cairo::RefPtr simulateFormat(Cairo::RefPtr src, Format format, ConversionFlags flags); static Cairo::RefPtr scale(Cairo::RefPtr src, double scaleFactor); }; #endif // IMAGEUTILS_HH gImageReader-3.2.3/gtk/src/MainWindow.cc000066400000000000000000000574401312567024200200060ustar00rootroot00000000000000/* -*- Mode: C++; indent-tabs-mode: t; c-basic-offset: 4; tab-width: 4 -*- */ /* * MainWindow.cc * Copyright (C) 2013-2017 Sandro Mani * * gImageReader 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. * * gImageReader 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 this program. If not, see . */ #include "Application.hh" #include "MainWindow.hh" #include "Acquirer.hh" #include "Config.hh" #include "Displayer.hh" #include "DisplayerToolHOCR.hh" #include "DisplayerToolSelect.hh" #include "OutputEditorHOCR.hh" #include "OutputEditorText.hh" #include "Recognizer.hh" #include "SourceManager.hh" #include "Utils.hh" #include #include #include #include #include #include #include #include #ifdef G_OS_WIN32 #include #endif #ifdef G_OS_UNIX #include #endif #ifdef __linux__ #include #include #endif #include #if ENABLE_VERSIONCHECK #define CHECKURL "https://raw.githubusercontent.com/manisandro/gImageReader/master/LATEST" #define DOWNLOADURL "https://github.com/manisandro/gImageReader/releases" #define CHANGELOGURL "https://raw.githubusercontent.com/manisandro/gImageReader/master/NEWS" #endif // ENABLE_VERSIONCHECK static Glib::Quark notificationHandleKey("handle"); void MainWindow::signalHandler(int sig) { std::signal(sig, nullptr); std::string filename; if(MAIN->getOutputEditor() && MAIN->getOutputEditor()->getModified()) { filename = Glib::build_filename(g_get_home_dir(), Glib::ustring::compose("%1_crash-save.txt", PACKAGE_NAME)); int i = 0; while(Glib::file_test(filename, Glib::FILE_TEST_EXISTS)) { ++i; filename = Glib::build_filename(g_get_home_dir(), Glib::ustring::compose("%1_crash-save_%2.txt", PACKAGE_NAME, i)); } MAIN->getOutputEditor()->save(filename); } Glib::Pid pid; Glib::spawn_async("", std::vector {pkgExePath, "crashhandle", Glib::ustring::compose("%1", getpid()), filename}, Glib::SPAWN_DO_NOT_REAP_CHILD, sigc::slot(), &pid); #ifdef G_OS_WIN32 WaitForSingleObject((HANDLE)pid, 0); #elif __linux__ // Allow crash handler spawned debugger to attach to the crashed process prctl(PR_SET_PTRACER, pid, 0, 0, 0); waitpid(pid, 0, 0); #endif std::raise(sig); } #ifndef __ARMEL__ static void terminateHandler() { std::set_terminate(nullptr); std::exception_ptr exptr = std::current_exception(); if (exptr != 0) { try { std::rethrow_exception(exptr); } catch (std::exception &ex) { std::cerr << "Terminated due to exception: " << ex.what() << std::endl; } catch (...) { std::cerr << "Terminated due to unknown exception" << std::endl; } } else { std::cerr << "Terminated due to unknown reason:" << std::endl; } MainWindow::signalHandler(SIGABRT); } #endif MainWindow* MainWindow::s_instance = nullptr; MainWindow::MainWindow() : m_builder("/org/gnome/gimagereader/gimagereader.ui") { s_instance = this; std::signal(SIGSEGV, signalHandler); std::signal(SIGABRT, signalHandler); #ifndef __ARMEL__ std::set_terminate(terminateHandler); #endif m_window = getWidget("applicationwindow:main"); m_headerbar = getWidget("headerbar:main"); m_aboutdialog = getWidget("dialog:about"); m_statusbar = getWidget("statusbar:main"); m_ocrModeCombo = getWidget("combo:main.ocrmode"); m_outputPaneToggleButton = getWidget("button:main.outputpane"); m_window->set_icon_name("gimagereader"); m_aboutdialog->set_version(PACKAGE_VERSION); getWidget("label:about.tesseractver").as()->set_markup(Glib::ustring::compose("%1 %2", _("Using tesseract"), TESSERACT_VERSION_STR)); m_config = new Config; m_acquirer = new Acquirer; m_displayer = new Displayer; m_recognizer = new Recognizer; m_sourceManager = new SourceManager; m_idlegroup.push_back(getWidget("button:main.zoomin")); m_idlegroup.push_back(getWidget("button:main.zoomout")); m_idlegroup.push_back(getWidget("button:main.zoomnormsize")); m_idlegroup.push_back(getWidget("button:main.zoomfit")); m_idlegroup.push_back(getWidget("button:main.recognize")); m_idlegroup.push_back(getWidget("menubutton:display.rotate.mode")); m_idlegroup.push_back(getWidget("spin:display.rotate")); m_idlegroup.push_back(getWidget("spin:display.page")); m_idlegroup.push_back(getWidget("spin:display.brightness")); m_idlegroup.push_back(getWidget("spin:display.contrast")); m_idlegroup.push_back(getWidget("spin:display.resolution")); m_idlegroup.push_back(getWidget("button:main.autolayout")); m_idlegroup.push_back(getWidget("menubutton:main.languages")); #if GTKMM_CHECK_VERSION(3,12,0) getWidget("image:main.controls").as()->set(Gdk::Pixbuf::create_from_resource("/org/gnome/gimagereader/controls.png")); getWidget("image:display.rotate.mode").as()->set(Gdk::Pixbuf::create_from_resource("/org/gnome/gimagereader/rotate_pages.png")); getWidget("image:display.rotate.all").as()->set(Gdk::Pixbuf::create_from_resource("/org/gnome/gimagereader/rotate_pages.png")); getWidget("image:display.rotate.current").as()->set(Gdk::Pixbuf::create_from_resource("/org/gnome/gimagereader/rotate_page.png")); getWidget("image:main.autolayout").as()->set(Gdk::Pixbuf::create_from_resource("/org/gnome/gimagereader/autolayout.png")); #else getWidget("image:main.controls").as()->set(Glib::wrap(gdk_pixbuf_new_from_resource("/org/gnome/gimagereader/controls.png", 0))); getWidget("image:display.rotate.mode").as()->set(Glib::wrap(gdk_pixbuf_new_from_resource("/org/gnome/gimagereader/rotate_pages.png", 0))); getWidget("image:display.rotate.all").as()->set(Glib::wrap(gdk_pixbuf_new_from_resource("/org/gnome/gimagereader/rotate_pages.png", 0))); getWidget("image:display.rotate.current").as()->set(Glib::wrap(gdk_pixbuf_new_from_resource("/org/gnome/gimagereader/rotate_page.png", 0))); getWidget("image:main.autolayout").as()->set(Glib::wrap(gdk_pixbuf_new_from_resource("/org/gnome/gimagereader/autolayout.png", 0))); #endif CONNECT(m_window, delete_event, [this](GdkEventAny* ev) { return closeEvent(ev); }); CONNECTS(getWidget("button:main.controls").as(), toggled, [this](Gtk::ToggleButton* b) { getWidget("toolbar:display").as()->set_visible(b->get_active()); }); CONNECT(m_acquirer, scanPageAvailable, [this](const std::string& filename) { m_sourceManager->addSources({Gio::File::create_for_path(filename)}); }); CONNECT(m_sourceManager, sourceChanged, [this] { onSourceChanged(); }); CONNECT(m_outputPaneToggleButton, toggled, [this] { m_outputEditor->getUI()->set_visible(m_outputPaneToggleButton->get_active()); }); m_connection_setOCRMode = CONNECT(m_ocrModeCombo, changed, [this] { setOCRMode(m_ocrModeCombo->get_active_row_number()); }); CONNECT(m_recognizer, languageChanged, [this] (const Config::Lang& /*lang*/ ) { languageChanged(); }); CONNECTS(getWidget("combo:config.settings.paneorient").as(), changed, [this](Gtk::ComboBoxText* combo) { getWidget("paned:output").as()->set_orientation(static_cast(!combo->get_active_row_number())); }); CONNECT(getWidget("button:main.progress.cancel").as(), clicked, [this] { progressCancel(); }); m_config->addSetting(new VarSetting>("wingeom")); m_config->addSetting(new SwitchSettingT("showcontrols", m_builder("button:main.controls"))); m_config->addSetting(new VarSetting("outputdir")); m_config->addSetting(new ComboSetting("outputeditor", m_builder("combo:main.ocrmode"))); m_recognizer->updateLanguagesMenu(); pushState(State::Idle, _("Select an image to begin...")); const std::vector& geom = m_config->getSetting>>("wingeom")->getValue(); if(geom.size() == 4) { m_window->resize(geom[2], geom[3]); m_window->move(geom[0], geom[1]); } getWidget("paned:output").as()->set_orientation(static_cast(!getWidget("combo:config.settings.paneorient").as()->get_active_row_number())); #if ENABLE_VERSIONCHECK if(m_config->getSetting("updatecheck")->getValue()) { m_newVerThread = Glib::Threads::Thread::create([this] { getNewestVersion(); }); } #else getWidget("check:config.settings.update")->hide(); #endif } MainWindow::~MainWindow() { delete m_acquirer; delete m_outputEditor; delete m_sourceManager; m_displayer->setTool(nullptr); delete m_displayerTool; delete m_displayer; delete m_recognizer; delete m_config; s_instance = nullptr; } void MainWindow::setMenuModel(const Glib::RefPtr &menuModel) { getWidget("menubutton:main.options").as()->set_menu_model(menuModel); getWidget("menubutton:main.options").as()->set_visible(true); } void MainWindow::openFiles(const std::vector>& files) { m_sourceManager->addSources(files); } void MainWindow::setOutputPaneVisible(bool visible) { m_outputPaneToggleButton->set_active(visible); } void MainWindow::pushState(State state, const Glib::ustring &msg) { m_stateStack.push_back(state); m_statusbar->push(msg); setState(state); } void MainWindow::popState() { m_statusbar->pop(); m_stateStack.pop_back(); setState(m_stateStack.back()); } void MainWindow::setState(State state) { bool isIdle = state == State::Idle; bool isBusy = state == State::Busy; for(Gtk::Widget* w : m_idlegroup) { w->set_sensitive(!isIdle); } getWidget("paned:output").as()->set_sensitive(!isBusy); m_headerbar->set_sensitive(!isBusy); if(m_window->get_window()) { m_window->get_window()->set_cursor(isBusy ? Gdk::Cursor::create(Gdk::WATCH) : Glib::RefPtr()); } } void MainWindow::showProgress(ProgressMonitor* monitor, int updateInterval) { m_progressMonitor = monitor; m_connection_progressUpdate = Glib::signal_timeout().connect([this] { progressUpdate(); return true; }, updateInterval); getWidget("progressbar:main.progress").as()->set_fraction(0); getWidget("button:main.progress.cancel").as()->set_sensitive(true); getWidget("box:main.progress").as()->set_visible(true); } void MainWindow::hideProgress() { getWidget("box:main.progress").as()->set_visible(false); m_connection_progressUpdate.disconnect(); m_progressMonitor = nullptr; } void MainWindow::progressCancel() { if(m_progressMonitor) { getWidget("button:main.progress.cancel").as()->set_sensitive(true); m_progressMonitor->cancel(); } } void MainWindow::progressUpdate() { if(m_progressMonitor) { getWidget("progressbar:main.progress").as()->set_fraction(m_progressMonitor->getProgress() / 100.); } } bool MainWindow::closeEvent(GdkEventAny*) { if(!m_outputEditor->clear()) { return true; } if((m_window->get_window()->get_state() & Gdk::WINDOW_STATE_MAXIMIZED) == 0) { std::vector geom(4); m_window->get_position(geom[0], geom[1]); m_window->get_size(geom[2], geom[3]); m_config->getSetting>>("wingeom")->setValue(geom); } m_window->hide(); return false; } void MainWindow::onSourceChanged() { if(m_stateStack.back() == State::Normal) { popState(); } std::vector sources = m_sourceManager->getSelectedSources(); if(m_displayer->setSources(sources)) { m_headerbar->set_subtitle(sources.size() == 1 ? sources.front()->displayname : _("Multiple sources")); pushState(State::Normal, _("Ready")); } else { m_headerbar->set_subtitle(""); } } void MainWindow::showAbout() { m_aboutdialog->run(); m_aboutdialog->hide(); } void MainWindow::showHelp(const std::string& chapter) { #ifdef G_OS_WIN32 std::string manualDir = Glib::build_filename(pkgDir, "share", "doc", "gimagereader"); char* locale = g_win32_getlocale(); std::string language(locale, 2); g_free(locale); #else std::string manualDir = MANUAL_DIR; std::string language = Glib::getenv("LANG").substr(0, 2); #endif std::string manualFile = Utils::make_absolute_path(Glib::build_filename(manualDir, Glib::ustring::compose("manual-%1.html", language))); if(!Glib::file_test(manualFile, Glib::FILE_TEST_EXISTS)) { manualFile = Utils::make_absolute_path(Glib::build_filename(manualDir,"manual.html")); } Utils::openUri(Glib::filename_to_uri(manualFile) + chapter); } void MainWindow::showConfig() { m_config->showDialog(); m_recognizer->updateLanguagesMenu(); } void MainWindow::setOCRMode(int idx) { if(m_outputEditor && !m_outputEditor->clear()) { m_connection_setOCRMode.block(true); if(dynamic_cast(m_outputEditor)) { m_ocrModeCombo->set_active(0); } else if(dynamic_cast(m_outputEditor)) { m_ocrModeCombo->set_active(1); } m_connection_setOCRMode.block(false); } else { if(m_outputEditor) { m_connection_setOutputEditorLanguage.disconnect(); m_connection_setOutputEditorVisibility.disconnect(); getWidget("paned:output").as()->remove(*m_outputEditor->getUI()); delete m_outputEditor; } delete m_displayerTool; if(idx == 0) { m_displayerTool = new DisplayerToolSelect(m_displayer); m_outputEditor = new OutputEditorText(); } else { /*if(idx == 1)*/ m_displayerTool = new DisplayerToolHOCR(m_displayer); m_outputEditor = new OutputEditorHOCR(static_cast(m_displayerTool)); } m_displayer->setTool(m_displayerTool); m_connection_setOutputEditorLanguage = CONNECT(m_recognizer, languageChanged, [this](const Config::Lang& lang) { m_outputEditor->setLanguage(lang); }); m_outputEditor->setLanguage(m_recognizer->getSelectedLanguage()); m_connection_setOutputEditorVisibility = CONNECT(m_outputPaneToggleButton, toggled, [this] { m_outputEditor->onVisibilityChanged(m_outputPaneToggleButton->get_active()); }); getWidget("paned:output").as()->pack2(*m_outputEditor->getUI(), true, false); m_outputEditor->getUI()->set_visible(m_outputPaneToggleButton->get_active()); } } void MainWindow::redetectLanguages() { m_recognizer->updateLanguagesMenu(); } void MainWindow::addNotification(const Glib::ustring &title, const Glib::ustring &message, const std::vector &actions, Notification* handle) { Gtk::Frame* frame = Gtk::manage(new Gtk::Frame); frame->set_data(notificationHandleKey, handle); frame->set_shadow_type(Gtk::SHADOW_OUT); Gtk::Box* box = Gtk::manage(new Gtk::Box(Gtk::ORIENTATION_HORIZONTAL, 5)); box->override_background_color(Gdk::RGBA("#FFD000"), Gtk::STATE_FLAG_NORMAL); frame->add(*box); Gtk::Label* titlelabel = Gtk::manage(new Gtk::Label); titlelabel->set_markup(Glib::ustring::compose("%1:", title)); box->pack_start(*titlelabel, false, true); box->pack_start(*Gtk::manage(new Gtk::Label(message, Gtk::ALIGN_START)), true, true); Gtk::Button* closebtn = Gtk::manage(new Gtk::Button()); closebtn->set_image_from_icon_name("window-close", Gtk::ICON_SIZE_MENU); CONNECT(closebtn, clicked, [this,frame] { hideNotification(frame); }); box->pack_end(*closebtn, false, true); for(const NotificationAction& action : actions) { Gtk::Button* btn = Gtk::manage(new Gtk::Button(action.label)); btn->set_relief(Gtk::RELIEF_NONE); CONNECT(btn, clicked, [this,frame,action] { if(action.action()) { hideNotification(frame); } }); box->pack_start(*btn, false, true); btn->get_child()->override_color(Gdk::RGBA("#0000FF"), Gtk::STATE_FLAG_NORMAL); } frame->show_all(); getWidget("box:main").as()->pack_end(*frame, false, true); if(handle != nullptr) { *handle = frame; } } void MainWindow::hideNotification(Notification handle) { if(handle) { Gtk::Frame* frame = static_cast(handle); Notification* h = reinterpret_cast(frame->get_data(notificationHandleKey)); if(h) { *h = nullptr; } getWidget("box:main").as()->remove(*frame); delete frame; } } #if ENABLE_VERSIONCHECK void MainWindow::getNewestVersion() { char buf[16] = {}; try { Glib::RefPtr file = Gio::File::create_for_uri(CHECKURL); Glib::RefPtr stream = file->read(); stream->read(buf, 16); } catch (const Glib::Error&) { return; } std::string newver(buf); g_debug("Newest version is: %s", newver.c_str()); newver.erase(std::remove_if(newver.begin(), newver.end(), ::isspace), newver.end()); if(Glib::Regex::create(R"(^[\d+\.]+\d+$)")->match(newver, 0, Glib::RegexMatchFlags(0))) { Glib::signal_idle().connect_once([this,newver] { checkVersion(newver); }); } } void MainWindow::checkVersion(const Glib::ustring& newver) { m_newVerThread->join(); Glib::ustring curver = PACKAGE_VERSION; if(newver.compare(curver) > 0) { addNotification(_("New version"), Glib::ustring::compose(_("gImageReader %1 is available"), newver), { {_("Download"), [=]{ gtk_show_uri_on_window(static_cast(m_window)->gobj(), DOWNLOADURL, GDK_CURRENT_TIME, 0); return false; }}, {_("Changelog"), [=]{ gtk_show_uri_on_window(static_cast(m_window)->gobj(), CHANGELOGURL, GDK_CURRENT_TIME, 0); return false; }}, {_("Don't notify again"), [this]{ m_config->getSetting("updatecheck")->setValue(false); return true; }} }); } } #endif // ENABLE_VERSIONCHECK void MainWindow::languageChanged() { hideNotification(m_notifierHandle); m_notifierHandle = nullptr; const Config::Lang& lang = m_recognizer->getSelectedLanguage(); std::string code = lang.code; if(code.empty()) { return; } GtkSpell::Checker checker; try { checker.set_language(code); } catch(const GtkSpell::Error& /*e*/) { if(getConfig()->getSetting("dictinstall")->getValue()) { NotificationAction actionDontShowAgain = {_("Don't show again"), [this]{ m_config->getSetting("dictinstall")->setValue(false); return true; }}; NotificationAction actionInstall = NotificationAction{_("Install"), [this,lang]{ dictionaryAutoinstall(lang.code); return false; }}; #ifdef G_OS_UNIX if(getConfig()->useSystemDataLocations()) { // Try initiating a DBUS connection for PackageKit Glib::RefPtr proxy; Glib::ustring service_owner; try { proxy = Gio::DBus::Proxy::create_for_bus_sync(Gio::DBus::BUS_TYPE_SESSION, "org.freedesktop.PackageKit", "/org/freedesktop/PackageKit", "org.freedesktop.PackageKit.Modify"); service_owner = proxy->get_name_owner(); } catch(...) { } if(!service_owner.empty()) { actionInstall = MainWindow::NotificationAction{_("Install"), [this,proxy,lang]{ dictionaryAutoinstall(proxy, lang.code); return false; }}; } else { actionInstall = {_("Help"), [this]{ showHelp("#InstallSpelling"); return false; }}; g_warning("Could not find PackageKit on DBus, dictionary autoinstallation will not work"); } } #endif addNotification(_("Spelling dictionary missing"), Glib::ustring::compose(_("The spellcheck dictionary for %1 is not installed"), lang.name), {actionInstall, actionDontShowAgain}, &m_notifierHandle); } } } #ifdef G_OS_UNIX void MainWindow::dictionaryAutoinstall(Glib::RefPtr proxy, const Glib::ustring &code) { pushState(State::Busy, Glib::ustring::compose(_("Installing spelling dictionary for '%1'"), code)); std::uint32_t xid = gdk_x11_window_get_xid(getWindow()->get_window()->gobj()); std::vector files; for(const Glib::ustring& langCulture : m_config->searchLangCultures(code)) { files.push_back("/usr/share/myspell/" + langCulture + ".dic"); files.push_back("/usr/share/hunspell/" + langCulture + ".dic"); } std::vector params = { Glib::Variant::create(xid), Glib::Variant>::create(files), Glib::Variant::create("always") }; proxy->call("InstallProvideFiles", [proxy,this](Glib::RefPtr r) { dictionaryAutoinstallDone(proxy, r); }, Glib::VariantContainerBase::create_tuple(params), 3600000); } void MainWindow::dictionaryAutoinstallDone(Glib::RefPtr proxy, Glib::RefPtr& result) { try { proxy->call_finish(result); } catch (const Glib::Error& e) { Utils::message_dialog(Gtk::MESSAGE_ERROR, _("Error"), Glib::ustring::compose(_("Failed to install spelling dictionary: %1"), e.what())); } getRecognizer()->updateLanguagesMenu(); popState(); } #endif void MainWindow::dictionaryAutoinstall(Glib::ustring code) { std::vector codes = m_config->searchLangCultures(code); code = codes.empty() ? code : codes.front(); pushState(State::Busy, Glib::ustring::compose(_("Installing spelling dictionary for '%1'"), code)); Glib::ustring url= "https://cgit.freedesktop.org/libreoffice/dictionaries/tree/"; Glib::ustring plainurl = "https://cgit.freedesktop.org/libreoffice/dictionaries/plain/"; Glib::ustring urlcode = code; std::string dictPath = getConfig()->spellingLocation(); Glib::RefPtr dictDir = Gio::File::create_for_path(dictPath); bool dirExists = false; try { dirExists = dictDir->make_directory_with_parents(); } catch(...) { dirExists = dictDir->query_exists(); } if(!dirExists) { popState(); Utils::message_dialog(Gtk::MESSAGE_ERROR, _("Error"), _("Failed to create directory for spelling dictionaries.")); return; } Glib::ustring messages; Glib::RefPtr html = Utils::download(url, messages); if(!html) { popState(); Utils::message_dialog(Gtk::MESSAGE_ERROR, _("Error"), Glib::ustring::compose(_("Could not read %1: %2."), url, messages)); return; } Glib::ustring htmls(reinterpret_cast(html->get_data()), html->size()); if(htmls.find(Glib::ustring::compose(">%1<", code)) != Glib::ustring::npos) { // Ok } else if(htmls.find(Glib::ustring::compose(">%1<", code.substr(0, 2))) != Glib::ustring::npos) { urlcode = code.substr(0, 2); } else { popState(); Utils::message_dialog(Gtk::MESSAGE_ERROR, _("Error"), Glib::ustring::compose(_("No spelling dictionaries found for '%1'."), code)); return; } html = Utils::download(url + urlcode + "/", messages); if(!html) { popState(); Utils::message_dialog(Gtk::MESSAGE_ERROR, _("Error"), Glib::ustring::compose(_("Could not read %1: %2."), url + urlcode + "/", messages)); return; } Glib::RefPtr pat = Glib::Regex::create(Glib::ustring::compose(">(%1[^<]*\\.(dic|aff))<", code.substr(0, 2))); htmls = Glib::ustring(reinterpret_cast(html->get_data()), html->size()); Glib::ustring downloaded; int pos = 0; Glib::MatchInfo matchInfo; while(pat->match(htmls, pos, matchInfo)) { pushState(State::Busy, Glib::ustring::compose(_("Downloading '%1'..."), matchInfo.fetch(1))); Glib::RefPtr data = Utils::download(plainurl + urlcode + "/" + matchInfo.fetch(1), messages); if(data) { std::ofstream file(Glib::build_filename(dictPath, matchInfo.fetch(1)), std::ios::binary); if(file.is_open()) { file.write(reinterpret_cast(data->get_data()), data->size()); downloaded.append(Glib::ustring::compose("\n%1", matchInfo.fetch(1))); } } popState(); int start; matchInfo.fetch_pos(0, start, pos); } if(!downloaded.empty()) { getRecognizer()->updateLanguagesMenu(); popState(); Utils::message_dialog(Gtk::MESSAGE_INFO, _("Dictionaries installed"), Glib::ustring::compose(_("The following dictionaries were installed:%1"), downloaded)); } else { popState(); Utils::message_dialog(Gtk::MESSAGE_ERROR, _("Error"), Glib::ustring::compose(_("No spelling dictionaries found for '%1'."), code)); } } gImageReader-3.2.3/gtk/src/MainWindow.hh000066400000000000000000000101021312567024200200000ustar00rootroot00000000000000/* -*- Mode: C++; indent-tabs-mode: t; c-basic-offset: 4; tab-width: 4 -*- */ /* * MainWindow.hh * Copyright (C) 2013-2017 Sandro Mani * * gImageReader 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. * * gImageReader 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 this program. If not, see . */ #ifndef MAINWINDOW_HH #define MAINWINDOW_HH #include "common.hh" #define MAIN MainWindow::getInstance() class Config; class Acquirer; class Displayer; class DisplayerTool; class OutputEditor; class Recognizer; class Source; class SourceManager; class MainWindow { public: enum class State { Idle, Normal, Busy }; struct NotificationAction { Glib::ustring label; std::function action; }; struct ProgressMonitor { virtual ~ProgressMonitor() {} virtual int getProgress() = 0; virtual void cancel() = 0; }; typedef void* Notification; static MainWindow* getInstance() { return s_instance; } static void signalHandler(int signal); MainWindow(); ~MainWindow(); Config* getConfig() { return m_config; } Displayer* getDisplayer() { return m_displayer; } OutputEditor* getOutputEditor() { return m_outputEditor; } Recognizer* getRecognizer() { return m_recognizer; } SourceManager* getSourceManager() { return m_sourceManager; } Gtk::Window* getWindow() const { return m_window; } Builder::CastProxy getWidget(const Glib::ustring& name) const { return m_builder(name); } void setMenuModel(const Glib::RefPtr& menuModel); void redetectLanguages(); void showConfig(); void showHelp(const std::string& chapter = ""); void showAbout(); void addNotification(const Glib::ustring& title, const Glib::ustring& message, const std::vector& actions, Notification* handle = nullptr); void hideNotification(Notification handle); void openFiles(const std::vector>& files); void setOutputPaneVisible(bool visible); void pushState(State state, const Glib::ustring& msg); void popState(); void showProgress(ProgressMonitor* monitor, int updateInterval = 500); void hideProgress(); private: static MainWindow* s_instance; Builder m_builder; Gtk::ApplicationWindow* m_window; Gtk::HeaderBar* m_headerbar; Gtk::AboutDialog* m_aboutdialog; Gtk::Statusbar* m_statusbar; Gtk::ComboBoxText* m_ocrModeCombo; Gtk::ToggleButton* m_outputPaneToggleButton; Config* m_config = nullptr; Acquirer* m_acquirer = nullptr; Displayer* m_displayer = nullptr; DisplayerTool* m_displayerTool = nullptr; OutputEditor* m_outputEditor = nullptr; Recognizer* m_recognizer = nullptr; SourceManager* m_sourceManager = nullptr; Glib::Threads::Thread* m_newVerThread = nullptr; MainWindow::Notification m_notifierHandle = nullptr; ProgressMonitor* m_progressMonitor = nullptr; std::vector m_idlegroup; std::vector m_stateStack; sigc::connection m_connection_setOCRMode; sigc::connection m_connection_setOutputEditorLanguage; sigc::connection m_connection_setOutputEditorVisibility; sigc::connection m_connection_progressUpdate; bool closeEvent(GdkEventAny*); void languageChanged(); void onSourceChanged(); void setOCRMode(int idx); void setState(State state); void progressCancel(); void progressUpdate(); #if ENABLE_VERSIONCHECK void getNewestVersion(); void checkVersion(const Glib::ustring& newver); #endif #ifdef G_OS_UNIX void dictionaryAutoinstall(Glib::RefPtr proxy, const Glib::ustring& lang); void dictionaryAutoinstallDone(Glib::RefPtr proxy, Glib::RefPtr& result); #endif void dictionaryAutoinstall(Glib::ustring lang); }; #endif gImageReader-3.2.3/gtk/src/OutputBuffer.cc000066400000000000000000000123151312567024200203540ustar00rootroot00000000000000/* -*- Mode: C++; indent-tabs-mode: t; c-basic-offset: 4; tab-width: 4 -*- */ /* * OutputBuffer.cc * Copyright (C) 2013-2017 Sandro Mani * * gImageReader 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. * * gImageReader 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 this program. If not, see . */ #include "OutputBuffer.hh" OutputBuffer::OutputBuffer() : Gsv::Buffer() { m_regionBeginMark = Gtk::TextMark::create(true); m_regionEndMark = Gtk::TextMark::create(false); add_mark(m_regionBeginMark, begin()); add_mark(m_regionEndMark, end()); set_highlight_matching_brackets(false); m_regionTag = create_tag("selection"); Gtk::Label label; Glib::RefPtr styleContext = label.get_style_context(); styleContext->set_state(Gtk::STATE_FLAG_SELECTED); Gdk::RGBA selColor = styleContext->get_background_color(styleContext->get_state()); selColor.set_red(std::min(1.0, selColor.get_red() * 1.6)); selColor.set_green(std::min(1.0, selColor.get_green() * 1.6)); selColor.set_blue(std::min(1.0, selColor.get_blue() * 1.6)); m_regionTag->property_background_rgba() = selColor; } void OutputBuffer::save_region_bounds(bool viewSelected) { Gtk::TextIter start = get_iter_at_mark(get_insert()); Gtk::TextIter stop = get_iter_at_mark(get_selection_bound()); if(viewSelected) { bool entireRegion = false; if(start.get_offset() > stop.get_offset()) { std::swap(start, stop); } // If nothing or only one word is selected, set region to entire document if(start.get_offset() == stop.get_offset() || !Glib::Regex::create("\\s")->match(get_text(start, stop))) { start = begin(); stop = end(); entireRegion = true; } remove_tag(m_regionTag, get_iter_at_mark(m_regionBeginMark), get_iter_at_mark(m_regionEndMark)); move_mark(m_regionBeginMark, start); move_mark(m_regionEndMark, stop); if(!entireRegion) { apply_tag(m_regionTag, start, stop); } } } void OutputBuffer::get_region_bounds(Gtk::TextIter& start, Gtk::TextIter& stop) { start = get_iter_at_mark(m_regionBeginMark); stop = get_iter_at_mark(m_regionEndMark); } Gtk::TextIter OutputBuffer::replace_range(const Glib::ustring &text, const Gtk::TextIter& start, const Gtk::TextIter& end) { return insert(erase(start, end), text); } bool OutputBuffer::findReplace(bool backwards, bool replace, bool matchCase, const Glib::ustring& searchstr, const Glib::ustring& replacestr, Gtk::TextView* view) { if(searchstr.empty()) { return false; } Gtk::TextSearchFlags flags = Gtk::TEXT_SEARCH_VISIBLE_ONLY|Gtk::TEXT_SEARCH_TEXT_ONLY; auto comparator = matchCase ? [](const Glib::ustring& s1, const Glib::ustring& s2) { return s1 == s2; } : [](const Glib::ustring& s1, const Glib::ustring& s2) { return s1.lowercase() == s2.lowercase(); }; if(!matchCase) { flags |= Gtk::TEXT_SEARCH_CASE_INSENSITIVE; } Gtk::TextIter rstart, rend; get_region_bounds(rstart, rend); Gtk::TextIter start, end; get_selection_bounds(start, end); if(comparator(get_text(start, end, false), searchstr)) { if(replace) { start = end = insert(erase(start, end), replacestr); start.backward_chars(replacestr.length()); select_range(start, end); view->scroll_to(end); return true; } if(backwards) { end.backward_char(); } else { start.forward_char(); } } Gtk::TextIter matchStart, matchEnd; if(backwards) { if(!end.backward_search(searchstr, flags, matchStart, matchEnd, rstart) && !rend.backward_search(searchstr, flags, matchStart, matchEnd, rstart)) { return false; } } else { if(!start.forward_search(searchstr, flags, matchStart, matchEnd, rend) && !rstart.forward_search(searchstr, flags, matchStart, matchEnd, rend)) { return false; } } // FIXME: backward_search appears to be buggy? matchEnd = matchStart; matchEnd.forward_chars(searchstr.length()); select_range(matchStart, matchEnd); view->scroll_to(matchStart); return true; } bool OutputBuffer::replaceAll(const Glib::ustring& searchstr, const Glib::ustring& replacestr, bool matchCase) { Gtk::TextIter start, end; get_region_bounds(start, end); int startpos = start.get_offset(); int endpos = end.get_offset(); Gtk::TextSearchFlags flags = Gtk::TEXT_SEARCH_VISIBLE_ONLY|Gtk::TEXT_SEARCH_TEXT_ONLY; if(!matchCase) { flags |= Gtk::TEXT_SEARCH_CASE_INSENSITIVE; } int diff = replacestr.length() - searchstr.length(); int count = 0; Gtk::TextIter it = get_iter_at_offset(startpos); while(true) { Gtk::TextIter matchStart, matchEnd; if(!it.forward_search(searchstr, flags, matchStart, matchEnd) || matchEnd.get_offset() > endpos) { break; } it = insert(erase(matchStart, matchEnd), replacestr); endpos += diff; ++count; while(Gtk::Main::events_pending()) { Gtk::Main::iteration(); } } if(count == 0) { return false; } return true; } gImageReader-3.2.3/gtk/src/OutputBuffer.hh000066400000000000000000000033231312567024200203650ustar00rootroot00000000000000/* -*- Mode: C++; indent-tabs-mode: t; c-basic-offset: 4; tab-width: 4 -*- */ /* * OutputBuffer.hh * Copyright (C) 2013-2017 Sandro Mani * * gImageReader 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. * * gImageReader 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 this program. If not, see . */ #ifndef OUTPUTBUFFER_HH #define OUTPUTBUFFER_HH #include "common.hh" #include class OutputBuffer : public Gsv::Buffer { public: void save_region_bounds(bool viewSelected); void get_region_bounds(Gtk::TextIter& start, Gtk::TextIter& stop); Gtk::TextIter replace_range(const Glib::ustring& text, const Gtk::TextIter& start, const Gtk::TextIter& end); bool findReplace(bool backwards, bool replace, bool matchCase, const Glib::ustring& searchstr, const Glib::ustring& replacestr, Gtk::TextView* view); bool replaceAll(const Glib::ustring& searchstr, const Glib::ustring& replacestr, bool matchCase); static Glib::RefPtr create() { return Glib::RefPtr(new OutputBuffer()); } private: OutputBuffer(); Glib::RefPtr m_regionTag; Glib::RefPtr m_regionBeginMark; Glib::RefPtr m_regionEndMark; }; #endif // OUTPUTBUFFER_HH gImageReader-3.2.3/gtk/src/OutputEditor.hh000066400000000000000000000034131312567024200204020ustar00rootroot00000000000000/* -*- Mode: C++; indent-tabs-mode: t; c-basic-offset: 4; tab-width: 4 -*- */ /* * OutputEditor.hh * Copyright (C) 2013-2017 Sandro Mani * * gImageReader 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. * * gImageReader 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 this program. If not, see . */ #ifndef OUTPUTEDITOR_HH #define OUTPUTEDITOR_HH #include "Config.hh" namespace tesseract { class TessBaseAPI; } class OutputEditor { public: struct ReadSessionData { virtual ~ReadSessionData() = default; bool prependFile; bool prependPage; int page; std::string file; double angle; int resolution; }; OutputEditor() {} virtual ~OutputEditor() {} virtual Gtk::Box* getUI() = 0; virtual ReadSessionData* initRead(tesseract::TessBaseAPI& tess) = 0; virtual void read(tesseract::TessBaseAPI& tess, ReadSessionData* data) = 0; virtual void readError(const Glib::ustring& errorMsg, ReadSessionData* data) = 0; virtual void finalizeRead(ReadSessionData* data) { delete data; } virtual bool getModified() const = 0; virtual void onVisibilityChanged(bool /*visible*/) {} virtual bool clear(bool hide = true) = 0; virtual bool save(const std::string& filename = "") = 0; virtual void setLanguage(const Config::Lang &/*lang*/) {} }; #endif // OUTPUTEDITOR_HH gImageReader-3.2.3/gtk/src/OutputEditorHOCR.cc000066400000000000000000002123071312567024200210500ustar00rootroot00000000000000/* -*- Mode: C++; indent-tabs-mode: t; c-basic-offset: 4; tab-width: 4 -*- */ /* * OutputEditorHOCR.cc * Copyright (C) 2013-2017 Sandro Mani * * gImageReader 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. * * gImageReader 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 this program. If not, see . */ #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include "CCITTFax4Encoder.hh" #include "DisplayerToolHOCR.hh" #include "FileDialogs.hh" #include "MainWindow.hh" #include "OutputEditorHOCR.hh" #include "Recognizer.hh" #include "SourceManager.hh" #include "Utils.hh" const Glib::RefPtr OutputEditorHOCR::s_bboxRx = Glib::Regex::create("bbox\\s+(\\d+)\\s+(\\d+)\\s+(\\d+)\\s+(\\d+)"); const Glib::RefPtr OutputEditorHOCR::s_pageTitleRx = Glib::Regex::create("image\\s+'(.+)';\\s+bbox\\s+\\d+\\s+\\d+\\s+\\d+\\s+\\d+;\\s+pageno\\s+(\\d+);\\s+rot\\s+(\\d+\\.?\\d*);\\s+res\\s+(\\d+\\.?\\d*)"); const Glib::RefPtr OutputEditorHOCR::s_idRx = Glib::Regex::create("(\\w+)_\\d+_(\\d+)"); const Glib::RefPtr OutputEditorHOCR::s_fontSizeRx = Glib::Regex::create("x_fsize\\s+(\\d+)"); const Glib::RefPtr OutputEditorHOCR::s_baseLineRx = Glib::Regex::create("baseline\\s+(-?\\d+\\.?\\d*)\\s+(-?\\d+)"); static inline Glib::ustring getAttribute(const xmlpp::Element* element, const Glib::ustring& name) { if(!element) return Glib::ustring(); xmlpp::Attribute* attrib = element->get_attribute(name); return attrib ? attrib->get_value() : Glib::ustring(); } static inline Glib::ustring getElementText(const xmlpp::Element* element) { if(!element) return Glib::ustring(); Glib::ustring text; for(xmlpp::Node* node : element->get_children()) { if(dynamic_cast(node)) { text += static_cast(node)->get_content(); } else if(dynamic_cast(node)) { text += getElementText(static_cast(node)); } } return Utils::string_trim(text); } static inline xmlpp::Element* getFirstChildElement(xmlpp::Node* node, const Glib::ustring& name = Glib::ustring()) { if(!node) return nullptr; xmlpp::Node* child = node->get_first_child(name); while(child && !dynamic_cast(child)) { child = child->get_next_sibling(); } return child ? dynamic_cast(child) : nullptr; } static inline xmlpp::Element* getNextSiblingElement(xmlpp::Node* node, const Glib::ustring& name = Glib::ustring()) { if(!node) return nullptr; xmlpp::Node* child = node->get_next_sibling(); if(name != "") { while(child && (child->get_name() != name || !dynamic_cast(child))) { child = child->get_next_sibling(); } } else { while(child && !dynamic_cast(child)) { child = child->get_next_sibling(); } } return child ? dynamic_cast(child) : nullptr; } static inline Glib::ustring getDocumentXML(xmlpp::Document* doc) { Glib::ustring xml = doc->write_to_string(); // Strip entity declaration if(xml.substr(0, 5) == "\n"); xml = xml.substr(pos + 3); } return xml; } static inline Glib::ustring getElementXML(const xmlpp::Element* element) { xmlpp::Document doc; doc.create_root_node_by_import(element); return getDocumentXML(&doc); } class OutputEditorHOCR::TreeView : public Gtk::TreeView { public: TreeView(BaseObjectType* cobject, const Glib::RefPtr& /*builder*/) : Gtk::TreeView(cobject) {} sigc::signal signal_context_menu_requested() { return m_signal_context_menu; } protected: bool on_button_press_event(GdkEventButton *button_event) { bool rightclick = (button_event->type == GDK_BUTTON_PRESS && button_event->button == 3); Gtk::TreePath path; Gtk::TreeViewColumn* col; int cell_x, cell_y; get_path_at_pos(int(button_event->x), int(button_event->y), path, col, cell_x, cell_y); if(!path) { return false; } std::vector selection = get_selection()->get_selected_rows(); bool selected = std::find(selection.begin(), selection.end(), path) != selection.end(); if(!rightclick || (rightclick && !selected)) { Gtk::TreeView::on_button_press_event(button_event); } if(rightclick) { m_signal_context_menu.emit(button_event); } return true; } private: sigc::signal m_signal_context_menu; }; class OutputEditorHOCR::CairoPDFPainter : public OutputEditorHOCR::PDFPainter { public: CairoPDFPainter(Cairo::RefPtr context) : m_context(context) { } void setFontSize(double pointSize) override { m_context->set_font_size(pointSize); } void drawText(double x, double y, const Glib::ustring& text) override { m_context->move_to(x, y/* - ext.y_bearing*/); m_context->show_text(text); } void drawImage(const Geometry::Rectangle& bbox, const Cairo::RefPtr& image, const PDFSettings& settings) override { m_context->save(); m_context->move_to(bbox.x, bbox.y); if(settings.compression == PDFSettings::CompressJpeg) { Image img(image, settings.colorFormat, settings.conversionFlags); uint8_t* buf = nullptr; unsigned long bufLen = 0; img.writeJpeg(settings.compressionQuality, buf, bufLen); Glib::RefPtr loader = Gdk::PixbufLoader::create("jpeg"); loader->write(buf, bufLen); loader->close(); std::free(buf); Gdk::Cairo::set_source_pixbuf(m_context, loader->get_pixbuf(), bbox.x, bbox.y); } else { Cairo::RefPtr img = Image::simulateFormat(image, settings.colorFormat, settings.conversionFlags); m_context->set_source(img, bbox.x, bbox.y); } m_context->paint(); m_context->restore(); } double getAverageCharWidth() const override { Cairo::TextExtents ext; m_context->get_text_extents("x ", ext); return ext.x_advance - ext.width; // spaces are ignored in width but counted in advance } double getTextWidth(const Glib::ustring& text) const override { Cairo::TextExtents ext; m_context->get_text_extents(text, ext); return ext.x_advance; } private: Cairo::RefPtr m_context; }; #if PODOFO_VERSION < PODOFO_MAKE_VERSION(0,9,3) namespace PoDoFo { class PdfImageCompat : public PoDoFo::PdfImage { using PdfImage::PdfImage; public: void SetImageDataRaw( unsigned int nWidth, unsigned int nHeight, unsigned int nBitsPerComponent, PdfInputStream* pStream ) { m_rRect.SetWidth( nWidth ); m_rRect.SetHeight( nHeight ); this->GetObject()->GetDictionary().AddKey( "Width", PdfVariant( static_cast(nWidth) ) ); this->GetObject()->GetDictionary().AddKey( "Height", PdfVariant( static_cast(nHeight) ) ); this->GetObject()->GetDictionary().AddKey( "BitsPerComponent", PdfVariant( static_cast(nBitsPerComponent) ) ); PdfVariant var; m_rRect.ToVariant( var ); this->GetObject()->GetDictionary().AddKey( "BBox", var ); this->GetObject()->GetStream()->SetRawData( pStream, -1 ); } }; } #endif class OutputEditorHOCR::PoDoFoPDFPainter : public OutputEditorHOCR::PDFPainter { public: PoDoFoPDFPainter(PoDoFo::PdfDocument* document, PoDoFo::PdfPainter* painter, double scaleFactor) : m_document(document), m_painter(painter), m_scaleFactor(scaleFactor) { m_pageHeight = m_painter->GetPage()->GetPageSize().GetHeight(); } void setFontSize(double pointSize) override { m_painter->GetFont()->SetFontSize(pointSize); } void drawText(double x, double y, const Glib::ustring& text) override { PoDoFo::PdfString pdfString(reinterpret_cast(text.c_str())); m_painter->DrawText(x * m_scaleFactor, m_pageHeight - y * m_scaleFactor, pdfString); } void drawImage(const Geometry::Rectangle& bbox, const Cairo::RefPtr& image, const PDFSettings& settings) override { Image img(image, settings.colorFormat, settings.conversionFlags); #if PODOFO_VERSION >= PODOFO_MAKE_VERSION(0,9,3) PoDoFo::PdfImage pdfImage(m_document); #else PoDoFo::PdfImageCompat pdfImage(m_document); #endif pdfImage.SetImageColorSpace(settings.colorFormat == Image::Format_RGB24 ? PoDoFo::ePdfColorSpace_DeviceRGB : PoDoFo::ePdfColorSpace_DeviceGray); if(settings.compression == PDFSettings::CompressZip) { PoDoFo::PdfMemoryInputStream is(reinterpret_cast(img.data), img.bytesPerLine * img.height); pdfImage.SetImageData(img.width, img.height, img.sampleSize, &is, {PoDoFo::ePdfFilter_FlateDecode}); } else if(settings.compression == PDFSettings::CompressJpeg) { PoDoFo::PdfName dctFilterName(PoDoFo::PdfFilterFactory::FilterTypeToName(PoDoFo::ePdfFilter_DCTDecode)); pdfImage.GetObject()->GetDictionary().AddKey(PoDoFo::PdfName::KeyFilter, dctFilterName); uint8_t* buf = nullptr; unsigned long bufLen = 0; img.writeJpeg(settings.compressionQuality, buf, bufLen); PoDoFo::PdfMemoryInputStream is(reinterpret_cast(buf), bufLen); pdfImage.SetImageDataRaw(img.width, img.height, img.sampleSize, &is); std::free(buf); } else if(settings.compression == PDFSettings::CompressFax4) { PoDoFo::PdfName faxFilterName(PoDoFo::PdfFilterFactory::FilterTypeToName(PoDoFo::ePdfFilter_CCITTFaxDecode)); pdfImage.GetObject()->GetDictionary().AddKey(PoDoFo::PdfName::KeyFilter, faxFilterName); PoDoFo::PdfDictionary decodeParams; decodeParams.AddKey("Columns", PoDoFo::PdfObject(PoDoFo::pdf_int64(img.width))); decodeParams.AddKey("Rows", PoDoFo::PdfObject(PoDoFo::pdf_int64(img.height))); decodeParams.AddKey("K", PoDoFo::PdfObject(PoDoFo::pdf_int64(-1))); // K < 0 --- Pure two-dimensional encoding (Group 4) pdfImage.GetObject()->GetDictionary().AddKey("DecodeParms", PoDoFo::PdfObject(decodeParams)); CCITTFax4Encoder encoder; uint32_t encodedLen = 0; uint8_t* encoded = encoder.encode(img.data, img.width, img.height, img.bytesPerLine, encodedLen); PoDoFo::PdfMemoryInputStream is(reinterpret_cast(encoded), encodedLen); pdfImage.SetImageDataRaw(img.width, img.height, img.sampleSize, &is); } m_painter->DrawImage(bbox.x * m_scaleFactor, m_pageHeight - (bbox.y + bbox.height) * m_scaleFactor, &pdfImage, m_scaleFactor * bbox.width / double(image->get_width()), m_scaleFactor * bbox.height / double(image->get_height())); } double getAverageCharWidth() const override { return m_painter->GetFont()->GetFontMetrics()->CharWidth(static_cast('x')) / m_scaleFactor; } double getTextWidth(const Glib::ustring& text) const override { PoDoFo::PdfString pdfString(reinterpret_cast(text.c_str())); return m_painter->GetFont()->GetFontMetrics()->StringWidth(pdfString) / m_scaleFactor; } private: PoDoFo::PdfDocument* m_document; PoDoFo::PdfPainter* m_painter; double m_scaleFactor; double m_imageScale; double m_pageHeight; }; OutputEditorHOCR::OutputEditorHOCR(DisplayerToolHOCR* tool) : m_builder("/org/gnome/gimagereader/editor_hocr.ui") { m_tool = tool; m_widget = m_builder("box:hocr"); Gtk::Button* openButton = m_builder("button:hocr.open"); Gtk::Button* saveButton = m_builder("button:hocr.save"); Gtk::Button* clearButton = m_builder("button:hocr.clear"); Gtk::Button* exportButton = m_builder("button:hocr.export"); m_itemView = nullptr; m_builder.get_derived("treeview:hocr.items", m_itemView); m_itemStore = Gtk::TreeStore::create(m_itemStoreCols); m_itemView->set_model(m_itemStore); m_itemView->get_selection()->set_mode(Gtk::SELECTION_MULTIPLE); Gtk::TreeViewColumn *itemViewCol = Gtk::manage(new Gtk::TreeViewColumn("")); itemViewCol->pack_start(m_itemStoreCols.selected, false); Gtk::TreeView_Private::_connect_auto_store_editable_signal_handler(m_itemView, itemViewCol->get_cells()[0], m_itemStoreCols.selected); itemViewCol->pack_start(m_itemStoreCols.icon, false); itemViewCol->pack_start(m_itemStoreCols.text, true); itemViewCol->add_attribute(*itemViewCol->get_cells()[0], "visible", m_itemStoreCols.checkboxVisible); itemViewCol->add_attribute(*itemViewCol->get_cells()[1], "visible", m_itemStoreCols.iconVisible); Gtk::TreeView_Private::_connect_auto_store_editable_signal_handler(m_itemView, itemViewCol->get_cells()[2], m_itemStoreCols.text); m_itemView->append_column(*itemViewCol); m_itemView->set_expander_column(*m_itemView->get_column(0)); Gtk::CellRendererText* textRenderer = dynamic_cast(itemViewCol->get_cells()[2]); if(textRenderer) { itemViewCol->add_attribute(textRenderer->property_foreground(), m_itemStoreCols.textColor); itemViewCol->add_attribute(textRenderer->property_editable(), m_itemStoreCols.editable); } Gtk::TreeIter rootItem = m_itemStore->append(); rootItem->set_value(m_itemStoreCols.text, Glib::ustring(_("Document"))); rootItem->set_value(m_itemStoreCols.checkboxVisible, false); rootItem->set_value(m_itemStoreCols.iconVisible, false); m_rootItem = m_itemStore->get_path(rootItem); m_propView = m_builder("treeview:hocr.properties"); m_propStore = Gtk::TreeStore::create(m_propStoreCols); m_propView->set_model(m_propStore); Gtk::CellRendererText* nameRenderer = Gtk::manage(new Gtk::CellRendererText()); nameRenderer->property_ellipsize() = Pango::ELLIPSIZE_END; Gtk::TreeViewColumn* nameCol = Gtk::manage(new Gtk::TreeViewColumn("")); nameCol->pack_start(*nameRenderer); nameCol->set_renderer(*nameRenderer, m_propStoreCols.name); nameCol->set_sizing(Gtk::TREE_VIEW_COLUMN_FIXED); nameCol->set_expand(true); m_propView->append_column(*nameCol); Gtk::CellRendererText* valueRenderer = Gtk::manage(new Gtk::CellRendererText()); valueRenderer->property_ellipsize() = Pango::ELLIPSIZE_END; Gtk::TreeViewColumn* valueCol = Gtk::manage(new Gtk::TreeViewColumn("")); valueCol->pack_start(*valueRenderer); valueCol->set_renderer(*valueRenderer, m_propStoreCols.value); valueCol->set_sizing(Gtk::TREE_VIEW_COLUMN_FIXED); valueCol->set_expand(true); Gtk::TreeView_Private::_connect_auto_store_editable_signal_handler(m_propView, valueRenderer, m_propStoreCols.value); m_propView->append_column(*valueCol); m_sourceView = m_builder("textview:hocr.source"); Glib::RefPtr buffer = Gsv::Buffer::create(); buffer->set_highlight_syntax(true); buffer->set_language(Gsv::LanguageManager::get_default()->get_language("xml")); m_sourceView->set_buffer(buffer); Glib::RefPtr group = MAIN->getWindow()->get_accel_group(); saveButton->add_accelerator("clicked", group, GDK_KEY_S, Gdk::CONTROL_MASK, Gtk::AccelFlags(0)); m_pdfExportDialog = m_builder("dialog:pdfoptions"); m_pdfExportDialog->set_transient_for(*MAIN->getWindow()); Gtk::ComboBox* imageFormatCombo = m_builder("combo:pdfoptions.imageformat"); Glib::RefPtr formatComboModel = Gtk::ListStore::create(m_formatComboCols); imageFormatCombo->set_model(formatComboModel); Gtk::TreeModel::Row row = *(formatComboModel->append()); row[m_formatComboCols.format] = Image::Format_RGB24; row[m_formatComboCols.label] = _("Color"); row = *(formatComboModel->append()); row[m_formatComboCols.format] = Image::Format_Gray8; row[m_formatComboCols.label] = _("Grayscale"); row = *(formatComboModel->append()); row[m_formatComboCols.format] = Image::Format_Mono; row[m_formatComboCols.label] = _("Monochrome"); imageFormatCombo->pack_start(m_formatComboCols.label); imageFormatCombo->set_active(-1); Gtk::ComboBox* ditheringCombo = m_builder("combo:pdfoptions.dithering"); Glib::RefPtr ditheringComboModel = Gtk::ListStore::create(m_ditheringComboCols); ditheringCombo->set_model(ditheringComboModel); row = *(ditheringComboModel->append()); row[m_ditheringComboCols.conversionFlags] = Image::ThresholdDithering; row[m_ditheringComboCols.label] = _("Threshold (closest color)"); row = *(ditheringComboModel->append()); row[m_ditheringComboCols.conversionFlags] = Image::DiffuseDithering; row[m_ditheringComboCols.label] = _("Diffuse"); ditheringCombo->pack_start(m_ditheringComboCols.label); ditheringCombo->set_active(-1); Gtk::ComboBox* compressionCombo = m_builder("combo:pdfoptions.compression"); Glib::RefPtr compressionModel = Gtk::ListStore::create(m_compressionComboCols); compressionCombo->set_model(compressionModel); row = *(compressionModel->append()); row[m_compressionComboCols.mode] = PDFSettings::CompressZip; row[m_compressionComboCols.label] = _("Zip (lossless)"); row[m_compressionComboCols.sensitive] = true; row = *(compressionModel->append()); row[m_compressionComboCols.mode] = PDFSettings::CompressFax4; row[m_compressionComboCols.label] = _("CCITT Group 4 (lossless)"); row[m_compressionComboCols.sensitive] = true; row = *(compressionModel->append()); row[m_compressionComboCols.mode] = PDFSettings::CompressJpeg; row[m_compressionComboCols.label] = _("Jpeg (lossy)"); row[m_compressionComboCols.sensitive] = true; compressionCombo->pack_start(m_compressionComboCols.label); compressionCombo->set_active(-1); Gtk::CellRendererText* compressionTextRenderer = dynamic_cast(compressionCombo->get_cells()[0]); if(compressionTextRenderer) { compressionCombo->add_attribute(compressionTextRenderer->property_sensitive(), m_compressionComboCols.sensitive); } CONNECT(openButton, clicked, [this] { open(); }); CONNECT(saveButton, clicked, [this] { save(); }); CONNECT(clearButton, clicked, [this] { clear(); }); CONNECT(exportButton, clicked, [this] { savePDF(); }); m_connectionCustomFont = CONNECTP(MAIN->getWidget("fontbutton:config.settings.customoutputfont").as(), font_name, [this] { setFont(); }); m_connectionDefaultFont = CONNECT(MAIN->getWidget("checkbutton:config.settings.defaultoutputfont").as(), toggled, [this] { setFont(); }); m_connectionSelectionChanged = CONNECT(m_itemView->get_selection(), changed, [this] { showItemProperties(currentItem()); }); m_connectionItemViewRowEdited = CONNECT(m_itemStore, row_changed, [this](const Gtk::TreeModel::Path&, const Gtk::TreeIter& iter) { itemChanged(iter); }); m_connectionPropViewRowEdited = CONNECT(m_propStore, row_changed, [this](const Gtk::TreeModel::Path&, const Gtk::TreeIter& iter) { propertyCellChanged(iter); }); CONNECT(m_itemView, context_menu_requested, [this](GdkEventButton* ev) { showContextMenu(ev); }); CONNECT(m_tool, selection_geometry_changed, [this](const Geometry::Rectangle& rect) { updateCurrentItemBBox(rect); }); CONNECT(m_tool, selection_drawn, [this](const Geometry::Rectangle& rect) { addGraphicRection(rect); }); CONNECT(m_builder("combo:pdfoptions.mode").as(), changed, [this] { updatePreview(); }); CONNECT(imageFormatCombo, changed, [this] { imageFormatChanged(); updatePreview(); }); CONNECT(ditheringCombo, changed, [this] { updatePreview(); }); CONNECT(compressionCombo, changed, [this] { imageCompressionChanged(); }); CONNECT(m_builder("spin:pdfoptions.quality").as(), value_changed, [this] { updatePreview(); }); CONNECT(m_builder("fontbutton:pdfoptions").as(), font_set, [this] { updatePreview(); }); CONNECT(m_builder("checkbox:pdfoptions.usedetectedfontsizes").as(), toggled, [this] { updatePreview(); }); CONNECTS(m_builder("checkbox:pdfoptions.usedetectedfontsizes").as(), toggled, [this](Gtk::CheckButton* button) { updatePreview(); m_builder("box:pdfoptions.fontscale")->set_sensitive(button->get_active()); }); CONNECT(m_builder("spin:pdfoptions.fontscale").as(), value_changed, [this] { updatePreview(); }); CONNECTS(m_builder("checkbox:pdfoptions.uniformlinespacing").as(), toggled, [this](Gtk::CheckButton* button) { updatePreview(); m_builder("box:pdfoptions.preserve")->set_sensitive(button->get_active()); }); CONNECT(m_builder("spin:pdfoptions.preserve").as(), value_changed, [this] { updatePreview(); }); CONNECT(m_builder("checkbox:pdfoptions.preview").as(), toggled, [this] { updatePreview(); }); if(MAIN->getConfig()->getSetting>("outputdir")->getValue().empty()) { MAIN->getConfig()->getSetting>("outputdir")->setValue(Utils::get_documents_dir()); } MAIN->getConfig()->addSetting(new ComboSetting("pdfexportmode", m_builder("combo:pdfoptions.mode"))); MAIN->getConfig()->addSetting(new SpinSetting("pdfimagecompressionquality", m_builder("spin:pdfoptions.quality"))); MAIN->getConfig()->addSetting(new ComboSetting("pdfimagecompression", m_builder("combo:pdfoptions.compression"))); MAIN->getConfig()->addSetting(new ComboSetting("pdfimageformat", m_builder("combo:pdfoptions.imageformat"))); MAIN->getConfig()->addSetting(new ComboSetting("pdfimageconversionflags", m_builder("combo:pdfoptions.dithering"))); MAIN->getConfig()->addSetting(new SpinSetting("pdfimagedpi", m_builder("spin:pdfoptions.dpi"))); MAIN->getConfig()->addSetting(new FontSetting("pdffont", m_builder("fontbutton:pdfoptions"))); MAIN->getConfig()->addSetting(new SwitchSettingT("pdfusedetectedfontsizes", m_builder("checkbox:pdfoptions.usedetectedfontsizes"))); MAIN->getConfig()->addSetting(new SwitchSettingT("pdfuniformizelinespacing", m_builder("checkbox:pdfoptions.uniformlinespacing"))); MAIN->getConfig()->addSetting(new SpinSetting("pdfpreservespaces", m_builder("spin:pdfoptions.preserve"))); MAIN->getConfig()->addSetting(new SpinSetting("pdffontscale", m_builder("spin:pdfoptions.fontscale"))); MAIN->getConfig()->addSetting(new SwitchSettingT("pdfpreview", m_builder("checkbox:pdfoptions.preview"))); #ifndef MAKE_VERSION #define MAKE_VERSION(...) 0 #endif #if !defined(TESSERACT_VERSION) || TESSERACT_VERSION < MAKE_VERSION(3,04,00) m_builder("checkbox:pdfoptions.usedetectedfontsizes").as()->set_active(false); m_builder("checkbox:pdfoptions.usedetectedfontsizes")->set_visible(false); m_builder("box:pdfoptions.fontscale")->set_visible(false); #endif setFont(); } OutputEditorHOCR::~OutputEditorHOCR() { delete m_currentParser; m_connectionCustomFont.disconnect(); m_connectionDefaultFont.disconnect(); MAIN->getConfig()->removeSetting("pdfexportmode"); MAIN->getConfig()->removeSetting("pdfimagecompressionquality"); MAIN->getConfig()->removeSetting("pdfimagecompression"); MAIN->getConfig()->removeSetting("pdfimageformat"); MAIN->getConfig()->removeSetting("pdfimagedpi"); MAIN->getConfig()->removeSetting("pdffont"); MAIN->getConfig()->removeSetting("pdfusedetectedfontsizes"); MAIN->getConfig()->removeSetting("pdfuniformizelinespacing"); MAIN->getConfig()->removeSetting("pdfpreservespaces"); MAIN->getConfig()->removeSetting("pdffontscale"); MAIN->getConfig()->removeSetting("pdfpreview"); } void OutputEditorHOCR::setFont() { if(MAIN->getWidget("checkbutton:config.settings.defaultoutputfont").as()->get_active()) { m_builder("textview:hocr.source").as()->unset_font(); } else { Gtk::FontButton* fontBtn = MAIN->getWidget("fontbutton:config.settings.customoutputfont"); m_builder("textview:hocr.source").as()->override_font(Pango::FontDescription(fontBtn->get_font_name())); } } void OutputEditorHOCR::imageFormatChanged() { Gtk::ComboBox* formatCombo = m_builder("combo:pdfoptions.imageformat"); Gtk::ComboBox* compressionCombo = m_builder("combo:pdfoptions.compression"); Glib::RefPtr compressionStore = Glib::RefPtr::cast_static(compressionCombo->get_model()); Image::Format format = (*formatCombo->get_active())[m_formatComboCols.format]; if(format == Image::Format_Mono) { if((*compressionCombo->get_active())[m_compressionComboCols.mode] == PDFSettings::CompressJpeg) { compressionCombo->set_active(PDFSettings::CompressZip); } (*compressionStore->children()[PDFSettings::CompressFax4])[m_compressionComboCols.sensitive] = true; (*compressionStore->children()[PDFSettings::CompressJpeg])[m_compressionComboCols.sensitive] = false; m_builder("label:pdfoptions.dithering")->set_sensitive(true); m_builder("combo:pdfoptions.dithering")->set_sensitive(true); } else { if((*compressionCombo->get_active())[m_compressionComboCols.mode] == PDFSettings::CompressFax4) { compressionCombo->set_active(PDFSettings::CompressZip); } (*compressionStore->children()[PDFSettings::CompressFax4])[m_compressionComboCols.sensitive] = false; (*compressionStore->children()[PDFSettings::CompressJpeg])[m_compressionComboCols.sensitive] = true; m_builder("label:pdfoptions.dithering")->set_sensitive(false); m_builder("combo:pdfoptions.dithering")->set_sensitive(false); } } void OutputEditorHOCR::imageCompressionChanged() { PDFSettings::Compression compression = (*m_builder("combo:pdfoptions.compression").as()->get_active())[m_compressionComboCols.mode]; bool jpegCompression = compression == PDFSettings::CompressJpeg; m_builder("spin:pdfoptions.quality").as()->set_sensitive(jpegCompression); m_builder("label:pdfoptions.quality").as()->set_sensitive(jpegCompression); } OutputEditorHOCR::ReadSessionData* OutputEditorHOCR::initRead(tesseract::TessBaseAPI &tess) { tess.SetPageSegMode(tesseract::PSM_AUTO_ONLY); return new HOCRReadSessionData; } void OutputEditorHOCR::read(tesseract::TessBaseAPI &tess, ReadSessionData *data) { tess.SetVariable("hocr_font_info", "true"); char* text = tess.GetHOCRText(data->page); Utils::runInMainThreadBlocking([&] { addPage(text, *data); }); delete[] text; } void OutputEditorHOCR::readError(const Glib::ustring &errorMsg, ReadSessionData *data) { static_cast(data)->errors.push_back(Glib::ustring::compose("%1[%2]: %3", data->file, data->page, errorMsg)); } void OutputEditorHOCR::finalizeRead(ReadSessionData *data) { HOCRReadSessionData* hdata = static_cast(data); if(!hdata->errors.empty()) { Glib::ustring message = Glib::ustring::compose(_("The following pages could not be processed:\n%1"), Utils::string_join(hdata->errors, "\n")); Utils::message_dialog(Gtk::MESSAGE_WARNING, _("Recognition errors"), message); } OutputEditor::finalizeRead(data); } void OutputEditorHOCR::addPage(const Glib::ustring& hocrText, ReadSessionData data) { xmlpp::DomParser parser; parser.parse_memory(hocrText); xmlpp::Document* doc = parser.get_document(); if(!doc || !doc->get_root_node()) return; xmlpp::Element* pageDiv = dynamic_cast(doc->get_root_node()); if(!pageDiv || pageDiv->get_name() != "div") return; Glib::MatchInfo matchInfo; Glib::ustring titleAttr = getAttribute(pageDiv, "title"); s_bboxRx->match(titleAttr, matchInfo); int x1 = std::atoi(matchInfo.fetch(1).c_str()); int y1 = std::atoi(matchInfo.fetch(2).c_str()); int x2 = std::atoi(matchInfo.fetch(3).c_str()); int y2 = std::atoi(matchInfo.fetch(4).c_str()); Glib::ustring pageTitle = Glib::ustring::compose("image '%1'; bbox %2 %3 %4 %5; pageno %6; rot %7; res %8", data.file, x1, y1, x2, y2, data.page, data.angle, data.resolution); pageDiv->set_attribute("title", pageTitle); addPage(pageDiv, Gio::File::create_for_path(data.file)->get_basename(), data.page, true); } void OutputEditorHOCR::addPage(xmlpp::Element* pageDiv, const Glib::ustring& filename, int page, bool cleanGraphics) { m_connectionItemViewRowEdited.block(true); pageDiv->set_attribute("id", Glib::ustring::compose("page_%1", ++m_idCounter)); Glib::MatchInfo matchInfo; Glib::ustring titleAttr = getAttribute(pageDiv, "title"); s_bboxRx->match(titleAttr, matchInfo); int x1 = std::atoi(matchInfo.fetch(1).c_str()); int y1 = std::atoi(matchInfo.fetch(2).c_str()); int x2 = std::atoi(matchInfo.fetch(3).c_str()); int y2 = std::atoi(matchInfo.fetch(4).c_str()); Gtk::TreeIter pageItem = m_itemStore->append(m_itemStore->get_iter(m_rootItem)->children()); pageItem->set_value(m_itemStoreCols.text, Glib::ustring::compose("%1 [%2]", filename, page)); pageItem->set_value(m_itemStoreCols.id, getAttribute(pageDiv, "id")); pageItem->set_value(m_itemStoreCols.bbox, Geometry::Rectangle(x1, y1, x2-x1, y2-y1)); pageItem->set_value(m_itemStoreCols.itemClass, Glib::ustring("ocr_page")); #if GTKMM_CHECK_VERSION(3,12,0) pageItem->set_value(m_itemStoreCols.icon, Gdk::Pixbuf::create_from_resource("/org/gnome/gimagereader/item_page.png")); #else pageItem->set_value(m_itemStoreCols.icon, Glib::wrap(gdk_pixbuf_new_from_resource("/org/gnome/gimagereader/item_page.png", 0))); #endif pageItem->set_value(m_itemStoreCols.selected, true); pageItem->set_value(m_itemStoreCols.editable, false); pageItem->set_value(m_itemStoreCols.textColor, Glib::ustring("#000")); pageItem->set_value(m_itemStoreCols.checkboxVisible, true); pageItem->set_value(m_itemStoreCols.iconVisible, true); std::map langCache; std::vector> graphicElements; xmlpp::Element* element = getFirstChildElement(pageDiv, "div"); while(element) { // Boxes without text are images titleAttr = getAttribute(element, "title"); if(!addChildItems(getFirstChildElement(element), pageItem, langCache) && s_bboxRx->match(titleAttr, matchInfo)) { x1 = std::atoi(matchInfo.fetch(1).c_str()); y1 = std::atoi(matchInfo.fetch(2).c_str()); x2 = std::atoi(matchInfo.fetch(3).c_str()); y2 = std::atoi(matchInfo.fetch(4).c_str()); graphicElements.push_back(std::make_pair(element, Geometry::Rectangle(x1, y1, x2-x1, y2-y1))); } element = getNextSiblingElement(element); } // Discard graphic elements which intersect with text block or which are too small int numTextBlocks = pageItem->children().size(); for(const std::pair& pair : graphicElements) { xmlpp::Element* element = pair.first; const Geometry::Rectangle& bbox = pair.second; bool deleteGraphic = false; if(cleanGraphics) { if(bbox.width < 10 || bbox.height < 10) { deleteGraphic = true; } else { for(int i = 0; i < numTextBlocks; ++i) { if(bbox.overlaps((*pageItem->children()[i])[m_itemStoreCols.bbox])) { deleteGraphic = true; break; } } } } if(!deleteGraphic) { Gtk::TreeIter item = m_itemStore->append(pageItem->children()); item->set_value(m_itemStoreCols.text, Glib::ustring(_("Graphic"))); item->set_value(m_itemStoreCols.selected, true); item->set_value(m_itemStoreCols.editable, false); #if GTKMM_CHECK_VERSION(3,12,0) item->set_value(m_itemStoreCols.icon, Gdk::Pixbuf::create_from_resource("/org/gnome/gimagereader/item_halftone.png")); #else item->set_value(m_itemStoreCols.icon, Glib::wrap(gdk_pixbuf_new_from_resource("/org/gnome/gimagereader/item_halftone.png", 0))); #endif item->set_value(m_itemStoreCols.id, getAttribute(element, "id")); item->set_value(m_itemStoreCols.itemClass, Glib::ustring("ocr_graphic")); item->set_value(m_itemStoreCols.textColor, Glib::ustring("#000")); item->set_value(m_itemStoreCols.bbox, Geometry::Rectangle(x1, y1, x2-x1, y2-y1)); item->set_value(m_itemStoreCols.checkboxVisible, true); item->set_value(m_itemStoreCols.iconVisible, true); } else { element->get_parent()->remove_child(element); } } pageItem->set_value(m_itemStoreCols.source, getElementXML(pageDiv)); m_itemView->expand_to_path(Gtk::TreePath(pageItem)); m_itemView->expand_row(Gtk::TreePath(pageItem), true); MAIN->setOutputPaneVisible(true); m_modified = true; m_connectionItemViewRowEdited.block(false); m_builder("button:hocr.save")->set_sensitive(true); m_builder("button:hocr.export")->set_sensitive(true); } Gtk::TreeIter OutputEditorHOCR::currentItem() { std::vector items = m_itemView->get_selection()->get_selected_rows(); if(!items.empty()) { return m_itemStore->get_iter(items[0]); } return Gtk::TreeIter(); } bool OutputEditorHOCR::addChildItems(xmlpp::Element* element, Gtk::TreeIter parentItem, std::map& langCache) { bool haveWord = false; while(element) { xmlpp::Element* nextElement = getNextSiblingElement(element); Glib::MatchInfo matchInfo; Glib::ustring idAttr = getAttribute(element, "id"); if(s_idRx->match(idAttr, matchInfo)) { Glib::ustring newId = Glib::ustring::compose("%1_%2_%3", matchInfo.fetch(1), m_idCounter, matchInfo.fetch(2)); element->set_attribute("id", newId); } Glib::ustring titleAttr = getAttribute(element, "title"); if(s_bboxRx->match(titleAttr, matchInfo)) { Glib::ustring type = getAttribute(element, "class"); Glib::ustring icon; Glib::ustring title; int x1 = std::atoi(matchInfo.fetch(1).c_str()); int y1 = std::atoi(matchInfo.fetch(2).c_str()); int x2 = std::atoi(matchInfo.fetch(3).c_str()); int y2 = std::atoi(matchInfo.fetch(4).c_str()); if(type == "ocr_par") { title = _("Paragraph"); icon = "par"; } else if(type == "ocr_line") { title = _("Textline"); icon = "line"; } else if(type == "ocrx_word") { title = getElementText(element); icon = "word"; } if(title != "") { Gtk::TreeIter item = m_itemStore->append(parentItem->children()); if(type == "ocrx_word" || addChildItems(getFirstChildElement(element), item, langCache)) { item->set_value(m_itemStoreCols.selected, true); item->set_value(m_itemStoreCols.id, getAttribute(element, "id")); if(!icon.empty()) { #if GTKMM_CHECK_VERSION(3,12,0) item->set_value(m_itemStoreCols.icon, Gdk::Pixbuf::create_from_resource(Glib::ustring::compose("/org/gnome/gimagereader/item_%1.png", icon))); #else item->set_value(m_itemStoreCols.icon, Glib::wrap(gdk_pixbuf_new_from_resource(Glib::ustring::compose("/org/gnome/gimagereader/item_%1.png", icon).c_str(), 0))); #endif } item->set_value(m_itemStoreCols.bbox, Geometry::Rectangle(x1, y1, x2 - x1, y2 - y1)); item->set_value(m_itemStoreCols.itemClass, type); item->set_value(m_itemStoreCols.textColor, Glib::ustring("#000")); item->set_value(m_itemStoreCols.editable, type == "ocrx_word"); haveWord = true; if(type == "ocr_line") { if(s_baseLineRx->match(titleAttr, matchInfo)) { item->set_value(m_itemStoreCols.baseLine, std::atoi(matchInfo.fetch(2).c_str())); } } else if(type == "ocrx_word") { // Ensure correct hyphen char is used on last word of line if(!nextElement) { title = Glib::Regex::create("[-\u2014]\\s*$")->replace(title, 0, "-", static_cast(0)); element->remove_child(element->get_first_child()); element->add_child_text(title); } if(s_fontSizeRx->match(titleAttr, matchInfo)) { item->set_value(m_itemStoreCols.fontSize, std::atof(matchInfo.fetch(1).c_str())); } Glib::ustring lang = getAttribute(element, "lang"); auto it = langCache.find(lang); if(it == langCache.end()) { it = langCache.insert(std::make_pair(lang, Utils::getSpellingLanguage(lang))).first; } Glib::ustring spellingLang = it->second; if(m_spell.get_language() != spellingLang) { m_spell.set_language(spellingLang); } if(!m_spell.check_word(trimWord(title))) { item->set_value(m_itemStoreCols.textColor, Glib::ustring("#F00")); } } item->set_value(m_itemStoreCols.text, title); item->set_value(m_itemStoreCols.checkboxVisible, true); item->set_value(m_itemStoreCols.iconVisible, true); } else { m_itemStore->erase(item); } } } element = nextElement; } return haveWord; } void OutputEditorHOCR::showItemProperties(Gtk::TreeIter item) { m_connectionPropViewRowEdited.block(true); m_propStore->clear(); m_connectionPropViewRowEdited.block(false); m_sourceView->get_buffer()->set_text(""); m_tool->clearSelection(); m_currentPageItem = Gtk::TreePath(); m_currentItem = Gtk::TreePath(); m_currentElement = nullptr; delete m_currentParser; m_currentParser = nullptr; Gtk::TreeIter rootIter = m_itemStore->get_iter(m_rootItem); if(!item || item == rootIter) { return; } m_currentItem = m_itemStore->get_path(item); Gtk::TreeIter parentItem = item; while(parentItem->parent() != rootIter) { parentItem = parentItem->parent(); } m_currentPageItem = m_itemStore->get_path(parentItem); Glib::ustring id = (*item)[m_itemStoreCols.id]; m_currentParser = new xmlpp::DomParser(); m_currentParser->parse_memory((*parentItem)[m_itemStoreCols.source]); xmlpp::Document* doc = m_currentParser->get_document(); if(doc->get_root_node()) { xmlpp::NodeSet nodes = doc->get_root_node()->find(Glib::ustring::compose("//*[@id='%1']", id)); m_currentElement = nodes.empty() ? nullptr : dynamic_cast(nodes.front()); } if(!m_currentElement) { delete m_currentParser; m_currentParser = nullptr; m_currentPageItem = Gtk::TreePath(); m_currentItem = Gtk::TreePath(); } m_connectionPropViewRowEdited.block(true); for(xmlpp::Attribute* attrib : m_currentElement->get_attributes()) { if(attrib->get_name() == "title") { for(Glib::ustring attr : Utils::string_split(attrib->get_value(), ';')) { attr = Utils::string_trim(attr); std::size_t splitPos = attr.find(" "); Gtk::TreeIter item = m_propStore->append(); item->set_value(m_propStoreCols.parentAttr, Glib::ustring("title")); item->set_value(m_propStoreCols.name, Utils::string_trim(attr.substr(0, splitPos))); item->set_value(m_propStoreCols.value, Utils::string_trim(attr.substr(splitPos + 1))); } } else { Gtk::TreeIter item = m_propStore->append(); item->set_value(m_propStoreCols.name, attrib->get_name()); item->set_value(m_propStoreCols.value, attrib->get_value()); } } m_connectionPropViewRowEdited.block(false); m_sourceView->get_buffer()->set_text(getElementXML(m_currentElement)); Glib::MatchInfo matchInfo; xmlpp::Element* pageElement = dynamic_cast(m_currentParser->get_document()->get_root_node()); Glib::ustring titleAttr = getAttribute(m_currentElement, "title"); if(pageElement && pageElement->get_name() == "div" && setCurrentSource(pageElement) && s_bboxRx->match(titleAttr, matchInfo)) { int x1 = std::atoi(matchInfo.fetch(1).c_str()); int y1 = std::atoi(matchInfo.fetch(2).c_str()); int x2 = std::atoi(matchInfo.fetch(3).c_str()); int y2 = std::atoi(matchInfo.fetch(4).c_str()); m_tool->setSelection(Geometry::Rectangle(x1, y1, x2-x1, y2-y1)); } } bool OutputEditorHOCR::setCurrentSource(xmlpp::Element* pageElement, int* pageDpi, int* overrideDpi) const { Glib::MatchInfo matchInfo; Glib::ustring titleAttr = getAttribute(pageElement, "title"); if(s_pageTitleRx->match(titleAttr, matchInfo)) { Glib::ustring filename = matchInfo.fetch(1); int page = std::atoi(matchInfo.fetch(2).c_str()); double angle = std::atof(matchInfo.fetch(3).c_str()); int res = std::atoi(matchInfo.fetch(4).c_str()); if(pageDpi) { *pageDpi = res; } if(overrideDpi) { res = *overrideDpi; } MAIN->getSourceManager()->addSources({Gio::File::create_for_path(filename)}); while(Gtk::Main::events_pending()) { Gtk::Main::iteration(); } int dummy; // TODO: Handle this better if(MAIN->getDisplayer()->getCurrentImage(dummy) != filename) { return false; } if(MAIN->getDisplayer()->getCurrentPage() != page) { MAIN->getDisplayer()->setCurrentPage(page); } if(MAIN->getDisplayer()->getCurrentAngle() != angle) { MAIN->getDisplayer()->setAngle(angle); } if(MAIN->getDisplayer()->getCurrentResolution() != res) { MAIN->getDisplayer()->setResolution(res); } return true; } return false; } void OutputEditorHOCR::itemChanged(const Gtk::TreeIter& iter) { if(m_itemStore->get_path(iter) != m_currentItem) { return; } m_connectionItemViewRowEdited.block(true); bool isWord = (*iter)[m_itemStoreCols.itemClass] == "ocrx_word"; bool selected = (*iter)[m_itemStoreCols.selected]; if( isWord && selected) { // Update text updateCurrentItemText(); } else if(!selected) { m_itemView->collapse_row(m_itemStore->get_path(iter)); } m_connectionItemViewRowEdited.block(false); } void OutputEditorHOCR::propertyCellChanged(const Gtk::TreeIter &iter) { Glib::ustring parentAttr = (*iter)[m_propStoreCols.parentAttr]; Glib::ustring key = (*iter)[m_propStoreCols.name]; Glib::ustring value = (*iter)[m_propStoreCols.value]; if(!parentAttr.empty()) { updateCurrentItemAttribute(parentAttr, key, value); } else { updateCurrentItemAttribute(key, "", value); } } void OutputEditorHOCR::updateCurrentItemText() { if(m_currentItem) { Gtk::TreeIter item = m_itemStore->get_iter(m_currentItem); Glib::ustring newText = (*item)[m_itemStoreCols.text]; m_currentElement->remove_child(m_currentElement->get_first_child()); m_currentElement->add_child_text(newText); updateCurrentItem(); } } void OutputEditorHOCR::updateCurrentItemAttribute(const Glib::ustring& key, const Glib::ustring& subkey, const Glib::ustring& newvalue, bool update) { if(m_currentItem) { if(subkey.empty()) { m_currentElement->set_attribute(key, newvalue); } else { Glib::ustring value = getAttribute(m_currentElement, key); std::vector subattrs = Utils::string_split(value, ';'); for(int i = 0, n = subattrs.size(); i < n; ++i) { Glib::ustring attr = Utils::string_trim(subattrs[i]); std::size_t splitPos = attr.find(" "); if(attr.substr(0, splitPos) == subkey) { subattrs[i] = subkey + " " + newvalue; break; } } m_currentElement->set_attribute(key, Utils::string_join(subattrs, ";")); } if(update) { updateCurrentItem(); } } } void OutputEditorHOCR::updateCurrentItemBBox(const Geometry::Rectangle &rect) { if(m_currentItem) { Gtk::TreeIter item = m_itemStore->get_iter(m_currentItem); m_connectionItemViewRowEdited.block(true); item->set_value(m_itemStoreCols.bbox, rect); m_connectionItemViewRowEdited.block(false); Glib::ustring bboxstr = Glib::ustring::compose("%1 %2 %3 %4", rect.x, rect.y, rect.x + rect.width, rect.y + rect.height); for(Gtk::TreeIter it : m_propStore->children()) { if((*it)[m_propStoreCols.name] == "bbox" and (*it)[m_propStoreCols.parentAttr] == "title") { m_connectionPropViewRowEdited.block(true); (*it)[m_propStoreCols.value] = bboxstr; m_connectionPropViewRowEdited.block(false); break; } } updateCurrentItemAttribute("title", "bbox", bboxstr, false); Gtk::TreeIter toplevelItem = m_itemStore->get_iter(m_currentPageItem); toplevelItem->set_value(m_itemStoreCols.source, getDocumentXML(m_currentParser->get_document())); m_sourceView->get_buffer()->set_text(getElementXML(m_currentElement)); } } void OutputEditorHOCR::updateCurrentItem() { Gtk::TreeIter item = m_itemStore->get_iter(m_currentItem); Glib::ustring spellLang = Utils::getSpellingLanguage(getAttribute(m_currentElement, "lang")); if(m_spell.get_language() != spellLang) { m_spell.set_language(spellLang); } m_connectionItemViewRowEdited.block(true); // prevent row edited signal if(m_spell.check_word(trimWord((*item)[m_itemStoreCols.text]))) { item->set_value(m_itemStoreCols.textColor, Glib::ustring("#000")); } else { item->set_value(m_itemStoreCols.textColor, Glib::ustring("#F00")); } m_connectionItemViewRowEdited.block(false); Gtk::TreeIter toplevelItem = m_itemStore->get_iter(m_currentPageItem); toplevelItem->set_value(m_itemStoreCols.source, getDocumentXML(m_currentParser->get_document())); m_sourceView->get_buffer()->set_text(getElementXML(m_currentElement)); Glib::MatchInfo matchInfo; xmlpp::Element* pageElement = dynamic_cast(m_currentParser->get_document()->get_root_node()); Glib::ustring titleAttr = getAttribute(m_currentElement, "title"); if(pageElement && pageElement->get_name() == "div" && setCurrentSource(pageElement) && s_bboxRx->match(titleAttr, matchInfo)) { int x1 = std::atoi(matchInfo.fetch(1).c_str()); int y1 = std::atoi(matchInfo.fetch(2).c_str()); int x2 = std::atoi(matchInfo.fetch(3).c_str()); int y2 = std::atoi(matchInfo.fetch(4).c_str()); m_tool->setSelection(Geometry::Rectangle(x1, y1, x2-x1, y2-y1)); } m_modified = true; } void OutputEditorHOCR::removeCurrentItem() { if(m_currentItem) { g_assert_nonnull(m_currentElement); m_currentElement->get_parent()->remove_child(m_currentElement); Gtk::TreeIter toplevelItem = m_itemStore->get_iter(m_currentPageItem); toplevelItem->set_value(m_itemStoreCols.source, getDocumentXML(m_currentParser->get_document())); m_itemStore->erase(m_itemStore->get_iter(m_currentItem)); // m_currentItem updated by m_itemView->get_selection()->signal_changed() } } void OutputEditorHOCR::addGraphicRection(const Geometry::Rectangle &rect) { if(!m_currentParser) { return; } xmlpp::Document* doc = m_currentParser->get_document(); xmlpp::Element* pageDiv = dynamic_cast(doc ? doc->get_root_node() : nullptr); if(!pageDiv || pageDiv->get_name() != "div") return; // Determine a free block id int pageId = 0; int blockId = 0; xmlpp::Element* blockEl = getFirstChildElement(pageDiv, "div"); while(blockEl) { Glib::MatchInfo matchInfo; Glib::ustring idAttr = getAttribute(blockEl, "id"); if(s_idRx->match(idAttr, matchInfo)) { pageId = std::max(pageId, std::atoi(matchInfo.fetch(1).c_str()) + 1); blockId = std::max(blockId, std::atoi(matchInfo.fetch(2).c_str()) + 1); } blockEl = getNextSiblingElement(blockEl); } // Add html element xmlpp::Element* graphicElement = pageDiv->add_child("div"); graphicElement->set_attribute("title", Glib::ustring::compose("bbox %1 %2 %3 %4", rect.x, rect.y, rect.x + rect.width, rect.y + rect.height)); graphicElement->set_attribute("class", "ocr_carea"); graphicElement->set_attribute("id", Glib::ustring::compose("block_%1_%2", pageId, blockId)); Gtk::TreeIter toplevelItem = m_itemStore->get_iter(m_currentPageItem); toplevelItem->set_value(m_itemStoreCols.source, getDocumentXML(m_currentParser->get_document())); // Add tree item Gtk::TreeIter item = m_itemStore->append(toplevelItem->children()); item->set_value(m_itemStoreCols.text, Glib::ustring(_("Graphic"))); item->set_value(m_itemStoreCols.selected, true); item->set_value(m_itemStoreCols.editable, false); #if GTKMM_CHECK_VERSION(3,12,0) item->set_value(m_itemStoreCols.icon, Gdk::Pixbuf::create_from_resource("/org/gnome/gimagereader/item_halftone.png")); #else item->set_value(m_itemStoreCols.icon, Glib::wrap(gdk_pixbuf_new_from_resource("/org/gnome/gimagereader/item_halftone.png", 0))); #endif item->set_value(m_itemStoreCols.id, getAttribute(graphicElement, "id")); item->set_value(m_itemStoreCols.itemClass, Glib::ustring("ocr_graphic")); item->set_value(m_itemStoreCols.textColor, Glib::ustring("#000")); item->set_value(m_itemStoreCols.bbox, rect); item->set_value(m_itemStoreCols.checkboxVisible, true); item->set_value(m_itemStoreCols.iconVisible, true); m_itemView->get_selection()->unselect_all(); m_itemView->get_selection()->select(item); m_itemView->scroll_to_row(m_itemStore->get_path(item)); } Glib::ustring OutputEditorHOCR::trimWord(const Glib::ustring& word, Glib::ustring* prefix, Glib::ustring* suffix) { Glib::RefPtr re = Glib::Regex::create("^(\\W*)(.*\\w)(\\W*)$"); Glib::MatchInfo match_info; if(re->match(word, -1, 0, match_info, static_cast(0))) { if(prefix) *prefix = match_info.fetch(1); if(suffix) *suffix = match_info.fetch(3); return match_info.fetch(2); } return word; } void OutputEditorHOCR::mergeItems(const std::vector& items) { Gtk::TreeIter it = m_itemStore->get_iter(items.front()); if(!it) { return; } Geometry::Rectangle bbox = (*it)[m_itemStoreCols.bbox]; Glib::ustring text = (*it)[m_itemStoreCols.text]; xmlpp::Document* doc = m_currentParser->get_document(); for(int i = 1, n = items.size(); i < n; ++i) { it = m_itemStore->get_iter(items[i]); if(it) { bbox = bbox.unite((*it)[m_itemStoreCols.bbox]); text += (*it)[m_itemStoreCols.text]; Glib::ustring id = (*it)[m_itemStoreCols.id]; xmlpp::NodeSet nodes = doc->get_root_node()->find(Glib::ustring::compose("//*[@id='%1']", id)); xmlpp::Element* element = nodes.empty() ? nullptr : dynamic_cast(nodes.front()); element->get_parent()->remove_child(element); } } for(int i = 1, n = items.size(); i < n; ++i) { it = m_itemStore->get_iter(items[n - i]); if(it) { m_itemStore->erase(it); } } m_itemView->get_selection()->unselect_all(); m_itemView->get_selection()->select(items.front()); it = m_itemStore->get_iter(items.front()); (*it)[m_itemStoreCols.text] = text; (*it)[m_itemStoreCols.bbox] = bbox; updateCurrentItemText(); updateCurrentItemAttribute("title", "bbox", Glib::ustring::compose("%1 %2 %3 %4", bbox.x, bbox.y, bbox.x + bbox.width, bbox.y + bbox.height)); showItemProperties(m_itemStore->get_iter(m_currentItem)); } void OutputEditorHOCR::showContextMenu(GdkEventButton* ev) { std::vector items = m_itemView->get_selection()->get_selected_rows(); bool wordsSelected = true; for(const Gtk::TreePath& path : items) { Gtk::TreeIter it = m_itemStore->get_iter(path); if(it) { Glib::ustring itemClass = (*it)[m_itemStoreCols.itemClass]; if(itemClass != "ocrx_word") { wordsSelected = false; break; } } } bool consecutive = true; for(int i = 1, n = items.size(); i < n; ++i) { Gtk::TreePath path = items[i]; path.prev(); if(path != items[i - 1]) { consecutive = false; break; } } if(items.size() > 1 && consecutive && wordsSelected) { Gtk::Menu menu; Glib::RefPtr loop = Glib::MainLoop::create(); Gtk::MenuItem* mergeItem = Gtk::manage(new Gtk::MenuItem(_("Merge"))); menu.append(*mergeItem); CONNECT(mergeItem, activate, [&] { mergeItems(items); }); CONNECT(&menu, hide, [&] { loop->quit(); }); menu.show_all(); menu.popup(ev->button, ev->time); loop->run(); return; } else if(items.size() > 1) { return; } Gtk::TreePath path; Gtk::TreeViewColumn* col; int cell_x, cell_y; m_itemView->get_path_at_pos(int(ev->x), int(ev->y), path, col, cell_x, cell_y); if(!path) { return; } Gtk::TreeIter it = m_itemStore->get_iter(path); if(!it) { return; } Glib::ustring itemClass = (*it)[m_itemStoreCols.itemClass]; Gtk::Menu menu; if(itemClass == "ocr_page") { Gtk::MenuItem* addGraphicItem = Gtk::manage(new Gtk::MenuItem(_("Add graphic region"))); menu.append(*addGraphicItem); CONNECT(addGraphicItem, activate, [this] { m_tool->clearSelection(); m_tool->activateDrawSelection(); }); } if(itemClass == "ocrx_word") { Glib::ustring prefix, suffix, trimmed = trimWord((*it)[m_itemStoreCols.text], &prefix, &suffix); for(const Glib::ustring& suggestion : m_spell.get_suggestions(trimmed)) { Glib::ustring replacement = prefix + suggestion + suffix; Gtk::MenuItem* item = Gtk::manage(new Gtk::MenuItem(replacement)); CONNECT(item, activate, [this, replacement, it] { (*it)[m_itemStoreCols.text] = replacement; }); menu.append(*item); } if(menu.get_children().empty()) { Gtk::MenuItem* item = Gtk::manage(new Gtk::MenuItem(_("No suggestions"))); item->set_sensitive(false); menu.append(*item); } if(!m_spell.check_word(trimWord((*it)[m_itemStoreCols.text]))) { menu.append(*Gtk::manage(new Gtk::SeparatorMenuItem)); Gtk::MenuItem* additem = Gtk::manage(new Gtk::MenuItem(_("Add to dictionary"))); CONNECT(additem, activate, [this, it] { m_spell.add_to_dictionary((*it)[m_itemStoreCols.text]); it->set_value(m_itemStoreCols.textColor, Glib::ustring("#000")); }); menu.append(*additem); Gtk::MenuItem* ignoreitem = Gtk::manage(new Gtk::MenuItem(_("Ignore word"))); CONNECT(ignoreitem, activate, [this, it] { m_spell.ignore_word((*it)[m_itemStoreCols.text]); it->set_value(m_itemStoreCols.textColor, Glib::ustring("#000")); }); menu.append(*ignoreitem); } } if(path != m_rootItem) { if(!menu.get_children().empty()) { menu.append(*Gtk::manage(new Gtk::SeparatorMenuItem)); } if(itemClass == "ocr_page") { Gtk::MenuItem* removeItem = Gtk::manage(new Gtk::MenuItem(_("Remove"))); menu.append(*removeItem); CONNECT(removeItem, activate, [&] { m_itemStore->erase(it); m_connectionPropViewRowEdited.block(true); m_propStore->clear(); m_connectionPropViewRowEdited.block(false); m_builder("button:hocr.save")->set_sensitive(!m_itemStore->get_iter(m_rootItem)->children().empty()); m_builder("button:hocr.export")->set_sensitive(!m_itemStore->get_iter(m_rootItem)->children().empty()); }); } else { Gtk::MenuItem* removeItem = Gtk::manage(new Gtk::MenuItem(_("Remove"))); menu.append(*removeItem); CONNECT(removeItem, activate, [this] { removeCurrentItem(); }); } } if(itemClass != "ocrx_word" && itemClass != "ocr_graphic") { if(!menu.get_children().empty()) { menu.append(*Gtk::manage(new Gtk::SeparatorMenuItem)); } Gtk::MenuItem* expandItem = Gtk::manage(new Gtk::MenuItem(_("Expand all"))); menu.append(*expandItem); CONNECT(expandItem, activate, [this, path] { m_itemView->expand_row(path, true); }); Gtk::MenuItem* collapseItem = Gtk::manage(new Gtk::MenuItem(_("Collapse all"))); menu.append(*collapseItem); CONNECT(collapseItem, activate, [this, path] { m_itemView->collapse_row(path); }); } Glib::RefPtr loop = Glib::MainLoop::create(); CONNECT(&menu, hide, [&] { loop->quit(); }); menu.show_all(); menu.popup(ev->button, ev->time); loop->run(); } void OutputEditorHOCR::checkCellEditable(const Glib::ustring& path, Gtk::CellRenderer* renderer) { Gtk::TreeIter it = m_itemStore->get_iter(path); if((*it)[m_itemStoreCols.itemClass] != "ocrx_word") { renderer->stop_editing(true); } } void OutputEditorHOCR::open() { if(!clear(false)) { return; } Glib::ustring dir = MAIN->getConfig()->getSetting>("outputdir")->getValue(); FileDialogs::FileFilter filter = {_("hOCR HTML Files"), {"text/html","text/xml", "text/plain"}, {"*.html"}}; std::vector> files = FileDialogs::open_dialog(_("Open hOCR File"), dir, filter, false); if(files.empty()) { return; } std::string filename = files.front()->get_path(); std::string source; try { source = Glib::file_get_contents(filename); } catch(Glib::Error&) { Utils::message_dialog(Gtk::MESSAGE_ERROR, _("Failed to open file"), Glib::ustring::compose(_("The file could not be opened: %1."), filename)); return; } xmlpp::DomParser parser; parser.parse_memory(source); xmlpp::Document* doc = parser.get_document(); xmlpp::Element* div = getFirstChildElement(getFirstChildElement(doc->get_root_node(), "body"), "div"); if(!div || getAttribute(div, "class") != "ocr_page") { Utils::message_dialog(Gtk::MESSAGE_ERROR, _("Invalid hOCR file"), Glib::ustring::compose(_("The file does not appear to contain valid hOCR HTML: %1"), filename)); return; } int page = 0; while(div) { ++page; addPage(div, files.front()->get_basename(), page, false); div = getNextSiblingElement(div, "div"); } } bool OutputEditorHOCR::save(const std::string& filename) { std::string outname = filename; if(outname.empty()) { std::vector sources = MAIN->getSourceManager()->getSelectedSources(); std::string ext, base; std::string name = !sources.empty() ? sources.front()->displayname : _("output"); Utils::get_filename_parts(name, base, ext); outname = Glib::build_filename(MAIN->getConfig()->getSetting>("outputdir")->getValue(), base + ".html"); FileDialogs::FileFilter filter = {_("hOCR HTML Files"), {"text/html"}, {"*.html"}}; outname = FileDialogs::save_dialog(_("Save hOCR Output..."), outname, filter); if(outname.empty()) { return false; } MAIN->getConfig()->getSetting>("outputdir")->setValue(Glib::path_get_dirname(outname)); } std::ofstream file(outname); if(!file.is_open()) { Utils::message_dialog(Gtk::MESSAGE_ERROR, _("Failed to save output"), _("Check that you have writing permissions in the selected folder.")); return false; } tesseract::TessBaseAPI tess; Glib::ustring header = Glib::ustring::compose( "\n" "\n" " \n" " \n" " \n" " \n" " \n" " \n" "\n", tess.Version()); file.write(header.data(), header.bytes()); for(Gtk::TreeIter item : m_itemStore->get_iter(m_rootItem)->children()) { Glib::ustring itemSource = (*item)[m_itemStoreCols.source]; file.write(itemSource.data(), itemSource.bytes()); } Glib::ustring footer = "\n\n"; file.write(footer.data(), footer.bytes()); m_modified = false; return true; } void OutputEditorHOCR::savePDF() { m_preview = new DisplayerImageItem(); updatePreview(); MAIN->getDisplayer()->addItem(m_preview); bool accepted = false; PoDoFo::PdfStreamedDocument* document = nullptr; PoDoFo::PdfFont* font = nullptr; #if PODOFO_VERSION >= PODOFO_MAKE_VERSION(0,9,3) const PoDoFo::PdfEncoding* pdfEncoding = PoDoFo::PdfEncodingFactory::GlobalIdentityEncodingInstance(); #else const PoDoFo::PdfEncoding* pdfEncoding = new PoDoFo::PdfIdentityEncoding; #endif double fontSize = 0; while(true) { accepted = m_pdfExportDialog->run() == Gtk::RESPONSE_OK; m_pdfExportDialog->hide(); if(!accepted) { break; } std::vector sources = MAIN->getSourceManager()->getSelectedSources(); std::string ext, base; std::string name = !sources.empty() ? sources.front()->displayname : _("output"); Utils::get_filename_parts(name, base, ext); std::string outname = Glib::build_filename(MAIN->getConfig()->getSetting>("outputdir")->getValue(), base + ".pdf"); FileDialogs::FileFilter filter = {_("PDF Files"), {"application/pdf"}, {"*.pdf"}}; outname = FileDialogs::save_dialog(_("Save PDF Output..."), outname, filter); if(outname.empty()) { accepted = false; break; } MAIN->getConfig()->getSetting>("outputdir")->setValue(Glib::path_get_dirname(outname)); try { document = new PoDoFo::PdfStreamedDocument(outname.c_str()); } catch(...) { Utils::message_dialog(Gtk::MESSAGE_ERROR, _("Failed to save output"), _("Check that you have writing permissions in the selected folder.")); continue; } try { Glib::ustring fontName = m_builder("fontbutton:pdfoptions").as()->get_font_name(); Pango::FontDescription fontDesc = Pango::FontDescription(fontName); bool italic = fontDesc.get_style() == Pango::STYLE_OBLIQUE; bool bold = fontDesc.get_weight() == Pango::WEIGHT_BOLD; fontSize = fontDesc.get_size() / double(PANGO_SCALE); #if PODOFO_VERSION >= PODOFO_MAKE_VERSION(0,9,3) font = document->CreateFontSubset(Utils::resolveFontName(fontDesc.get_family()).c_str(), bold, italic, false, pdfEncoding); #else font = document->CreateFontSubset(Utils::resolveFontName(fontDesc.get_family()).c_str(), bold, italic, pdfEncoding); #endif } catch(...) { font = nullptr; } if(!font) { Utils::message_dialog(Gtk::MESSAGE_ERROR, _("Error"), _("The PDF library does not support the selected font.")); document->Close(); delete document; continue; } break; } MAIN->getDisplayer()->removeItem(m_preview); delete m_preview; m_preview = nullptr; if(!accepted) { return; } PoDoFo::PdfPainter painter; PDFSettings pdfSettings; pdfSettings.colorFormat = (*m_builder("combo:pdfoptions.imageformat").as()->get_active())[m_formatComboCols.format]; pdfSettings.conversionFlags = pdfSettings.colorFormat == Image::Format_Mono ? (*m_builder("combo:pdfoptions.dithering").as()->get_active())[m_ditheringComboCols.conversionFlags] : Image::AutoColor; pdfSettings.compression = (*m_builder("combo:pdfoptions.compression").as()->get_active())[m_compressionComboCols.mode]; pdfSettings.compressionQuality = m_builder("spin:pdfoptions.quality").as()->get_value(); pdfSettings.useDetectedFontSizes = m_builder("checkbox:pdfoptions.usedetectedfontsizes").as()->get_active(); pdfSettings.uniformizeLineSpacing = m_builder("checkbox:pdfoptions.uniformlinespacing").as()->get_active(); pdfSettings.preserveSpaceWidth = m_builder("spin:pdfoptions.preserve").as()->get_value(); pdfSettings.overlay = m_builder("combo:pdfoptions.mode").as()->get_active_row_number() == 1; pdfSettings.detectedFontScaling = m_builder("spin:pdfoptions.fontscale").as()->get_value() / 100.; std::vector failed; for(Gtk::TreeIter item : m_itemStore->get_iter(m_rootItem)->children()) { if(!(*item)[m_itemStoreCols.selected]) { continue; } Geometry::Rectangle bbox = (*item)[m_itemStoreCols.bbox]; xmlpp::DomParser parser; parser.parse_memory((*item)[m_itemStoreCols.source]); xmlpp::Document* doc = parser.get_document(); int sourceDpi = -1; int outputDpi = m_builder("spin:pdfoptions.dpi").as()->get_value(); if(doc->get_root_node() && doc->get_root_node()->get_name() == "div" && setCurrentSource(doc->get_root_node(), &sourceDpi, &outputDpi)) { double docScale = (72. / sourceDpi); double imgScale = double(outputDpi) / sourceDpi; PoDoFo::PdfPage* page = document->CreatePage(PoDoFo::PdfRect(0, 0, bbox.width * docScale, bbox.height * docScale)); painter.SetPage(page); painter.SetFont(font); PoDoFoPDFPainter pdfprinter(document, &painter, docScale); pdfprinter.setFontSize(fontSize); printChildren(pdfprinter, item, pdfSettings, imgScale); if(pdfSettings.overlay) { Geometry::Rectangle scaledBBox(imgScale * bbox.x, imgScale * bbox.y, imgScale * bbox.width, imgScale * bbox.height); pdfprinter.drawImage(bbox, m_tool->getSelection(scaledBBox), pdfSettings); } MAIN->getDisplayer()->setResolution(sourceDpi); painter.FinishPage(); } else { failed.push_back((*item)[m_itemStoreCols.text]); } } if(!failed.empty()) { Utils::message_dialog(Gtk::MESSAGE_ERROR, _("Errors occurred"), Glib::ustring::compose(_("The following pages could not be rendered:\n%1"), Utils::string_join(failed, "\n"))); } document->Close(); delete document; } void OutputEditorHOCR::printChildren(PDFPainter& painter, Gtk::TreeIter item, const PDFSettings& pdfSettings, double imgScale) const { if(!(*item)[m_itemStoreCols.selected]) { return; } Glib::ustring itemClass = (*item)[m_itemStoreCols.itemClass]; Geometry::Rectangle itemRect = (*item)[m_itemStoreCols.bbox]; if(itemClass == "ocr_par" && pdfSettings.uniformizeLineSpacing) { double yInc = double(itemRect.height) / item->children().size(); double y = itemRect.y + yInc; int baseLine = item->children().empty() ? 0 : (*(*item->children().begin()))[m_itemStoreCols.baseLine]; for(Gtk::TreeIter lineItem : item->children()) { double x = itemRect.x; double prevWordRight = itemRect.x; for(Gtk::TreeIter wordItem : lineItem->children()) { if((*wordItem)[m_itemStoreCols.selected]) { Geometry::Rectangle wordRect = (*wordItem)[m_itemStoreCols.bbox]; if(pdfSettings.useDetectedFontSizes) { painter.setFontSize((*wordItem)[m_itemStoreCols.fontSize] * pdfSettings.detectedFontScaling); } // If distance from previous word is large, keep the space if(wordRect.x - prevWordRight > pdfSettings.preserveSpaceWidth * painter.getAverageCharWidth()) { x = wordRect.x; } prevWordRight = wordRect.x + wordRect.width; painter.drawText(x, y + baseLine, Glib::ustring((*wordItem)[m_itemStoreCols.text])); x += painter.getTextWidth(Glib::ustring((*wordItem)[m_itemStoreCols.text]) + " "); } } y += yInc; } } else if(itemClass == "ocr_line" && !pdfSettings.uniformizeLineSpacing) { int baseLine = (*item)[m_itemStoreCols.baseLine]; double y = itemRect.y + itemRect.height + baseLine; for(Gtk::TreeIter wordItem : item->children()) { Geometry::Rectangle wordRect = (*wordItem)[m_itemStoreCols.bbox]; if(pdfSettings.useDetectedFontSizes) { painter.setFontSize((*wordItem)[m_itemStoreCols.fontSize] * pdfSettings.detectedFontScaling); } painter.drawText(wordRect.x, y, Glib::ustring((*wordItem)[m_itemStoreCols.text])); } } else if(itemClass == "ocr_graphic" && !pdfSettings.overlay) { Geometry::Rectangle scaledItemRect(imgScale * itemRect.x, imgScale * itemRect.y, imgScale * itemRect.width, imgScale * itemRect.height); painter.drawImage(itemRect, m_tool->getSelection(scaledItemRect), pdfSettings); } else { for(Gtk::TreeIter child : item->children()) { printChildren(painter, child, pdfSettings, imgScale); } } } void OutputEditorHOCR::updatePreview() { if(!m_preview) { return; } bool visible = m_builder("checkbox:pdfoptions.preview").as()->get_active(); m_preview->setVisible(visible); if(m_itemStore->get_iter(m_rootItem)->children().empty()|| !visible) { return; } Gtk::TreeIter item = currentItem(); if(!item) { item = *m_itemStore->get_iter(m_rootItem)->children().begin(); } else { while(item->parent()) { item = item->parent(); } } Geometry::Rectangle bbox = (*item)[m_itemStoreCols.bbox]; xmlpp::DomParser parser; parser.parse_memory((*item)[m_itemStoreCols.source]); xmlpp::Document* doc = parser.get_document(); int pageDpi = -1; setCurrentSource(doc->get_root_node(), &pageDpi); Cairo::RefPtr image = Cairo::ImageSurface::create(Cairo::FORMAT_ARGB32, bbox.width, bbox.height); Cairo::RefPtr context = Cairo::Context::create(image); Glib::ustring fontName = m_builder("fontbutton:pdfoptions").as()->get_font_name(); Pango::FontDescription fontDesc = Pango::FontDescription(fontName); Cairo::FontSlant fontSlant = fontDesc.get_style() == Pango::STYLE_OBLIQUE ? Cairo::FONT_SLANT_OBLIQUE : fontDesc.get_style() == Pango::STYLE_ITALIC ? Cairo::FONT_SLANT_ITALIC : Cairo::FONT_SLANT_NORMAL; Cairo::FontWeight fontWeight = fontDesc.get_weight() == Pango::WEIGHT_BOLD ? Cairo::FONT_WEIGHT_BOLD : Cairo::FONT_WEIGHT_NORMAL; double fontSize = fontDesc.get_size() / double(PANGO_SCALE); context->select_font_face(fontDesc.get_family(), fontSlant, fontWeight); context->set_font_size(fontSize * pageDpi / 72.); PDFSettings pdfSettings; pdfSettings.colorFormat = (*m_builder("combo:pdfoptions.imageformat").as()->get_active())[m_formatComboCols.format]; pdfSettings.conversionFlags = pdfSettings.colorFormat == Image::Format_Mono ? (*m_builder("combo:pdfoptions.dithering").as()->get_active())[m_ditheringComboCols.conversionFlags] : Image::AutoColor; pdfSettings.compression = (*m_builder("combo:pdfoptions.compression").as()->get_active())[m_compressionComboCols.mode]; pdfSettings.compressionQuality = m_builder("spin:pdfoptions.quality").as()->get_value(); pdfSettings.useDetectedFontSizes = m_builder("checkbox:pdfoptions.usedetectedfontsizes").as()->get_active(); pdfSettings.uniformizeLineSpacing = m_builder("checkbox:pdfoptions.uniformlinespacing").as()->get_active(); pdfSettings.preserveSpaceWidth = m_builder("spin:pdfoptions.preserve").as()->get_value(); pdfSettings.overlay = m_builder("combo:pdfoptions.mode").as()->get_active_row_number() == 1; pdfSettings.detectedFontScaling = (pageDpi / 72.) * m_builder("spin:pdfoptions.fontscale").as()->get_value() / 100.; CairoPDFPainter painter(context); if(pdfSettings.overlay) { painter.drawImage(bbox, m_tool->getSelection(bbox), pdfSettings); context->save(); context->rectangle(0, 0, image->get_width(), image->get_height()); context->set_source_rgba(1., 1., 1., 0.5); context->fill(); context->restore(); } else { context->save(); context->rectangle(0, 0, image->get_width(), image->get_height()); context->set_source_rgba(1., 1., 1., 1.); context->fill(); context->restore(); } printChildren(painter, item, pdfSettings); m_preview->setImage(image); m_preview->setRect(Geometry::Rectangle(-0.5 * image->get_width(), -0.5 * image->get_height(), image->get_width(), image->get_height())); } bool OutputEditorHOCR::clear(bool hide) { if(!m_widget->get_visible()) { return true; } if(getModified()) { int response = Utils::question_dialog(_("Output not saved"), _("Save output before proceeding?"), Utils::Button::Save|Utils::Button::Discard|Utils::Button::Cancel); if(response == Utils::Button::Save) { if(!save()) { return false; } } else if(response != Utils::Button::Discard) { return false; } } m_idCounter = 0; m_connectionSelectionChanged.block(); Gtk::TreeIter rootIter = m_itemStore->get_iter(m_rootItem); while(!rootIter->children().empty()) { m_itemStore->erase(*rootIter->children()[0]); } m_connectionSelectionChanged.unblock(); m_propStore->clear(); m_sourceView->get_buffer()->set_text(""); m_tool->clearSelection(); m_modified = false; m_builder("button:hocr.save")->set_sensitive(false); m_builder("button:hocr.export")->set_sensitive(false); if(hide) MAIN->setOutputPaneVisible(false); return true; } bool OutputEditorHOCR::getModified() const { return m_modified; } gImageReader-3.2.3/gtk/src/OutputEditorHOCR.hh000066400000000000000000000162201312567024200210560ustar00rootroot00000000000000/* -*- Mode: C++; indent-tabs-mode: t; c-basic-offset: 4; tab-width: 4 -*- */ /* * OutputEditorHOCR.hh * Copyright (C) 2013-2017 Sandro Mani * * gImageReader 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. * * gImageReader 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 this program. If not, see . */ #ifndef OUTPUTEDITORHOCR_HH #define OUTPUTEDITORHOCR_HH #include "OutputEditor.hh" #include "Geometry.hh" #include "Image.hh" #include #include class DisplayerImageItem; class DisplayerToolHOCR; namespace xmlpp { class DomParser; class Element; } class OutputEditorHOCR : public OutputEditor { public: OutputEditorHOCR(DisplayerToolHOCR* tool); ~OutputEditorHOCR(); Gtk::Box* getUI() override { return m_widget; } ReadSessionData* initRead(tesseract::TessBaseAPI& tess) override; void read(tesseract::TessBaseAPI& tess, ReadSessionData* data) override; void readError(const Glib::ustring& errorMsg, ReadSessionData* data) override; void finalizeRead(ReadSessionData *data) override; bool getModified() const override; bool clear(bool hide = true) override; void open(); bool save(const std::string& filename = "") override; void savePDF(); private: class TreeView; static const Glib::RefPtr s_bboxRx; static const Glib::RefPtr s_pageTitleRx; static const Glib::RefPtr s_idRx; static const Glib::RefPtr s_fontSizeRx; static const Glib::RefPtr s_baseLineRx; struct HOCRReadSessionData : ReadSessionData { std::vector errors; }; struct PDFSettings { Image::Format colorFormat; Image::ConversionFlags conversionFlags; enum Compression { CompressZip=0, CompressFax4=1, CompressJpeg=2 } compression; // This order needs to be the same as combo:pdfoptions.compression int compressionQuality; bool useDetectedFontSizes; bool uniformizeLineSpacing; int preserveSpaceWidth; bool overlay; double detectedFontScaling; }; class PDFPainter { public: virtual void setFontSize(double pointSize) = 0; virtual void drawText(double x, double y, const Glib::ustring& text) = 0; virtual void drawImage(const Geometry::Rectangle& bbox, const Cairo::RefPtr& image, const PDFSettings& settings) = 0; virtual double getAverageCharWidth() const = 0; virtual double getTextWidth(const Glib::ustring& text) const = 0; }; class PoDoFoPDFPainter; class CairoPDFPainter; struct ItemStoreColumns : public Gtk::TreeModel::ColumnRecord { Gtk::TreeModelColumn selected; Gtk::TreeModelColumn editable; Gtk::TreeModelColumn> icon; Gtk::TreeModelColumn text; Gtk::TreeModelColumn id; Gtk::TreeModelColumn source; Gtk::TreeModelColumn bbox; Gtk::TreeModelColumn itemClass; Gtk::TreeModelColumn fontSize; Gtk::TreeModelColumn baseLine; Gtk::TreeModelColumn textColor; Gtk::TreeModelColumn checkboxVisible; Gtk::TreeModelColumn iconVisible; ItemStoreColumns() { add(selected); add(editable); add(icon); add(text); add(id); add(source); add(bbox); add(itemClass); add(fontSize); add(baseLine); add(textColor); add(checkboxVisible); add(iconVisible); } } m_itemStoreCols; struct PropStoreColumns : public Gtk::TreeModel::ColumnRecord { Gtk::TreeModelColumn name; Gtk::TreeModelColumn parentAttr; Gtk::TreeModelColumn value; PropStoreColumns() { add(name); add(parentAttr); add(value); } } m_propStoreCols; struct FormatComboColums : public Gtk::TreeModel::ColumnRecord { Gtk::TreeModelColumn format; Gtk::TreeModelColumn label; FormatComboColums() { add(format); add(label); } } m_formatComboCols; struct DitheringComboColums : public Gtk::TreeModel::ColumnRecord { Gtk::TreeModelColumn conversionFlags; Gtk::TreeModelColumn label; DitheringComboColums() { add(conversionFlags); add(label); } } m_ditheringComboCols; struct CompressionComboColums : public Gtk::TreeModel::ColumnRecord { Gtk::TreeModelColumn mode; Gtk::TreeModelColumn label; Gtk::TreeModelColumn sensitive; CompressionComboColums() { add(mode); add(label); add(sensitive); } } m_compressionComboCols; Builder m_builder; Gtk::Box* m_widget = nullptr; TreeView* m_itemView; Glib::RefPtr m_itemStore; Gtk::TreeView* m_propView; Glib::RefPtr m_propStore; Gsv::View* m_sourceView; int m_idCounter = 0; DisplayerToolHOCR* m_tool; GtkSpell::Checker m_spell; bool m_modified = false; Gtk::Dialog* m_pdfExportDialog = nullptr; DisplayerImageItem* m_preview = nullptr; Gtk::TreePath m_rootItem; Gtk::TreePath m_currentItem; Gtk::TreePath m_currentPageItem; xmlpp::DomParser* m_currentParser = nullptr; xmlpp::Element* m_currentElement = nullptr; sigc::connection m_connectionCustomFont; sigc::connection m_connectionDefaultFont; sigc::connection m_connectionSelectionChanged; sigc::connection m_connectionItemViewRowEdited; sigc::connection m_connectionPropViewRowEdited; Gtk::TreeIter currentItem(); void addPage(xmlpp::Element* pageDiv, const Glib::ustring& filename, int page, bool cleanGraphics); bool addChildItems(xmlpp::Element* element, Gtk::TreeIter parentItem, std::map& langCache); void printChildren(PDFPainter& painter, Gtk::TreeIter item, const PDFSettings& pdfSettings, double imgScale = 1.) const; bool setCurrentSource(xmlpp::Element* pageElement, int* pageDpi = 0, int* overrideDpi = 0) const; void updateCurrentItemText(); void updateCurrentItemAttribute(const Glib::ustring& key, const Glib::ustring& subkey, const Glib::ustring& newvalue, bool update=true); void updateCurrentItem(); void removeCurrentItem(); Glib::ustring trimWord(const Glib::ustring& word, Glib::ustring* prefix = nullptr, Glib::ustring* suffix = nullptr); void mergeItems(const std::vector& items); void addGraphicRection(const Geometry::Rectangle& rect); void addPage(const Glib::ustring& hocrText, ReadSessionData data); void setFont(); void imageFormatChanged(); void imageCompressionChanged(); void showItemProperties(Gtk::TreeIter item); void itemChanged(const Gtk::TreeIter& iter); void propertyCellChanged(const Gtk::TreeIter& iter); void showContextMenu(GdkEventButton* ev); void checkCellEditable(const Glib::ustring& path, Gtk::CellRenderer* renderer); void updatePreview(); void updateCurrentItemBBox(const Geometry::Rectangle& rect); }; #endif // OUTPUTEDITORHOCR_HH gImageReader-3.2.3/gtk/src/OutputEditorText.cc000066400000000000000000000405761312567024200212500ustar00rootroot00000000000000/* -*- Mode: C++; indent-tabs-mode: t; c-basic-offset: 4; tab-width: 4 -*- */ /* * OutputEditorText.cc * Copyright (C) 2013-2017 Sandro Mani * * gImageReader 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. * * gImageReader 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 this program. If not, see . */ #include #include "FileDialogs.hh" #include "OutputBuffer.hh" #include "OutputEditorText.hh" #include "Recognizer.hh" #include "SourceManager.hh" #include "SubstitutionsManager.hh" #include "Utils.hh" #include OutputEditorText::OutputEditorText() : m_builder("/org/gnome/gimagereader/editor_text.ui") { m_paneWidget = m_builder("box:output"); m_insButton = m_builder("menubutton:output.insert"); m_insImage = m_builder("image:output.insert"); m_replaceBox = m_builder("box:output.findreplace"); m_outputBox = m_builder("box:output"); m_textView = m_builder("textview:output"); m_searchEntry = m_builder("entry:output.search"); m_replaceEntry = m_builder("entry:output.replace"); m_filterKeepIfEndMark = m_builder("menuitem:output.stripcrlf.keependmark"); m_filterKeepIfQuote = m_builder("menuitem:output.stripcrlf.keepquote"); m_filterJoinHyphen = m_builder("menuitem:output.stripcrlf.joinhyphen"); m_filterJoinSpace = m_builder("menuitem:output.stripcrlf.joinspace"); m_filterKeepParagraphs = m_builder("menuitem:output.stripcrlf.keepparagraphs"); m_toggleSearchButton = m_builder("button:output.findreplace"); m_undoButton = m_builder("button:output.undo"); m_redoButton = m_builder("button:output.redo"); m_csCheckBox = m_builder("checkbutton:output.matchcase"); m_textBuffer = OutputBuffer::create(); m_textView->set_source_buffer(m_textBuffer); Gtk::Button* saveButton = m_builder("button:output.save"); Glib::RefPtr group = MAIN->getWindow()->get_accel_group(); m_undoButton->add_accelerator("clicked", group, GDK_KEY_Z, Gdk::CONTROL_MASK, Gtk::AccelFlags(0)); m_redoButton->add_accelerator("clicked", group, GDK_KEY_Z, Gdk::CONTROL_MASK|Gdk::SHIFT_MASK, Gtk::AccelFlags(0)); m_toggleSearchButton->add_accelerator("clicked", group, GDK_KEY_F, Gdk::CONTROL_MASK, Gtk::AccelFlags(0)); saveButton->add_accelerator("clicked", group, GDK_KEY_S, Gdk::CONTROL_MASK, Gtk::AccelFlags(0)); m_builder("image:output.insert").as()->set(Gdk::Pixbuf::create_from_resource("/org/gnome/gimagereader/ins_append.png")); m_builder("image:output.stripcrlf").as()->set(Gdk::Pixbuf::create_from_resource("/org/gnome/gimagereader/stripcrlf.png")); m_builder("image:output.insert.append").as()->set(Gdk::Pixbuf::create_from_resource("/org/gnome/gimagereader/ins_append.png")); m_builder("image:output.insert.cursor").as()->set(Gdk::Pixbuf::create_from_resource("/org/gnome/gimagereader/ins_cursor.png")); m_builder("image:output.insert.replace").as()->set(Gdk::Pixbuf::create_from_resource("/org/gnome/gimagereader/ins_replace.png")); m_substitutionsManager = new SubstitutionsManager(m_builder, m_textBuffer); m_insertMode = InsertMode::Append; m_spell.attach(*m_textView); m_spell.property_decode_language_codes() = true; CONNECT(m_builder("menuitem:output.insert.append").as(), activate, [this] { setInsertMode(InsertMode::Append, "ins_append.png"); }); CONNECT(m_builder("menuitem:output.insert.cursor").as(), activate, [this] { setInsertMode(InsertMode::Cursor, "ins_cursor.png"); }); CONNECT(m_builder("menuitem:output.insert.replace").as(), activate, [this] { setInsertMode(InsertMode::Replace, "ins_replace.png"); }); CONNECT(m_builder("button:output.stripcrlf").as(), clicked, [this] { filterBuffer(); }); CONNECT(m_toggleSearchButton, toggled, [this] { toggleReplaceBox(); }); CONNECT(m_undoButton, clicked, [this] { m_textBuffer->undo(); scrollCursorIntoView(); }); CONNECT(m_redoButton, clicked, [this] { m_textBuffer->redo(); scrollCursorIntoView(); }); CONNECT(saveButton, clicked, [this] { save(); }); CONNECT(m_builder("button:output.clear").as(), clicked, [this] { clear(); }); CONNECTP(m_textBuffer, can_undo, [this] { m_undoButton->set_sensitive(m_textBuffer->can_undo()); }); CONNECTP(m_textBuffer, can_redo, [this] { m_redoButton->set_sensitive(m_textBuffer->can_redo()); }); CONNECT(m_csCheckBox, toggled, [this] { Utils::clear_error_state(m_searchEntry); }); CONNECT(m_searchEntry, changed, [this] { Utils::clear_error_state(m_searchEntry); }); CONNECT(m_searchEntry, activate, [this] { findReplace(false, false); }); CONNECT(m_replaceEntry, activate, [this] { findReplace(false, true); }); CONNECT(m_builder("button:output.searchnext").as(), clicked, [this] { findReplace(false, false); }); CONNECT(m_builder("button:output.searchprev").as(), clicked, [this] { findReplace(true, false); }); CONNECT(m_builder("button:output.replace").as(), clicked, [this] { findReplace(false, true); }); CONNECT(m_builder("button:output.replaceall").as(), clicked, [this] { replaceAll(); }); m_connectionCustomFont = CONNECTP(MAIN->getWidget("fontbutton:config.settings.customoutputfont").as(), font_name, [this] { setFont(); }); m_connectionDefaultFont = CONNECT(MAIN->getWidget("checkbutton:config.settings.defaultoutputfont").as(), toggled, [this] { setFont(); }); CONNECT(m_builder("button:output.substitutions").as(), clicked, [this] { m_substitutionsManager->set_visible(true); }); CONNECT(m_textView, populate_popup, [this](Gtk::Menu* menu) { completeTextViewMenu(menu); }); CONNECTS(m_builder("menuitem:output.stripcrlf.drawwhitespace").as(), toggled, [this](Gtk::CheckMenuItem* item) { m_textView->set_draw_spaces(item->get_active() ? (Gsv::DRAW_SPACES_NEWLINE|Gsv::DRAW_SPACES_TAB|Gsv::DRAW_SPACES_SPACE) : Gsv::DrawSpacesFlags(0)); }); // If the insert or selection mark change save the bounds either if the view is focused or the selection is non-empty CONNECTP(m_textBuffer, cursor_position, [this] { m_textBuffer->save_region_bounds(m_textView->is_focus()); }); CONNECTP(m_textBuffer, has_selection, [this] { m_textBuffer->save_region_bounds(m_textView->is_focus()); }); MAIN->getConfig()->addSetting(new SwitchSettingT("keepdot", m_builder("menuitem:output.stripcrlf.keependmark"))); MAIN->getConfig()->addSetting(new SwitchSettingT("keepquote", m_builder("menuitem:output.stripcrlf.keepquote"))); MAIN->getConfig()->addSetting(new SwitchSettingT("joinhyphen", m_builder("menuitem:output.stripcrlf.joinhyphen"))); MAIN->getConfig()->addSetting(new SwitchSettingT("joinspace", m_builder("menuitem:output.stripcrlf.joinspace"))); MAIN->getConfig()->addSetting(new SwitchSettingT("keepparagraphs", m_builder("menuitem:output.stripcrlf.keepparagraphs"))); MAIN->getConfig()->addSetting(new SwitchSettingT("drawwhitespace", m_builder("menuitem:output.stripcrlf.drawwhitespace"))); MAIN->getConfig()->addSetting(new SwitchSettingT("searchmatchcase", m_builder("checkbutton:output.matchcase"))); if(MAIN->getConfig()->getSetting>("outputdir")->getValue().empty()) { MAIN->getConfig()->getSetting>("outputdir")->setValue(Utils::get_documents_dir()); } setFont(); } OutputEditorText::~OutputEditorText() { delete m_substitutionsManager; m_connectionCustomFont.disconnect(); m_connectionDefaultFont.disconnect(); MAIN->getConfig()->removeSetting("keepdot"); MAIN->getConfig()->removeSetting("keepquote"); MAIN->getConfig()->removeSetting("joinhyphen"); MAIN->getConfig()->removeSetting("joinspace"); MAIN->getConfig()->removeSetting("keepparagraphs"); MAIN->getConfig()->removeSetting("drawwhitespace"); MAIN->getConfig()->removeSetting("searchmatchcase"); } void OutputEditorText::setFont() { if(MAIN->getWidget("checkbutton:config.settings.defaultoutputfont").as()->get_active()) { m_builder("textview:output").as()->unset_font(); } else { Gtk::FontButton* fontBtn = MAIN->getWidget("fontbutton:config.settings.customoutputfont"); m_builder("textview:output").as()->override_font(Pango::FontDescription(fontBtn->get_font_name())); } } void OutputEditorText::scrollCursorIntoView() { m_textView->scroll_to(m_textView->get_buffer()->get_insert()); m_textView->grab_focus(); } void OutputEditorText::setInsertMode(InsertMode mode, const std::string& iconName) { m_insertMode = mode; #if GTKMM_CHECK_VERSION(3,12,0) m_insImage->set(Gdk::Pixbuf::create_from_resource(Glib::ustring::compose("/org/gnome/gimagereader/%1", iconName))); #else m_insImage->set(Glib::wrap(gdk_pixbuf_new_from_resource(Glib::ustring::compose("/org/gnome/gimagereader/%1", iconName).c_str(), 0))); #endif } void OutputEditorText::filterBuffer() { Gtk::TextIter start, end; m_textBuffer->get_region_bounds(start, end); Glib::ustring txt = m_textBuffer->get_text(start, end); Utils::busyTask([this,&txt] { // Always remove trailing whitespace txt = Glib::Regex::create("\\s+$")->replace(txt, 0, "", static_cast(0)); if(m_filterJoinHyphen->get_active()) { txt = Glib::Regex::create("[-\u2014]\\s*\\n\\s*")->replace(txt, 0, "", static_cast(0)); } Glib::ustring preChars, sucChars; if(m_filterKeepParagraphs->get_active()) { preChars += "\\n"; // Keep if preceded by line break } if(m_filterKeepIfEndMark->get_active()) { preChars += "\\.\\?!"; // Keep if preceded by end mark (.?!) } if(m_filterKeepIfQuote->get_active()) { preChars += "'\"\u00BB\u00AB"; // Keep if preceded by quote sucChars += "'\"\u00AB\u00BB"; // Keep if succeeded by quote } if(m_filterKeepParagraphs->get_active()) { sucChars += "\\n"; // Keep if succeeded by line break } if(!preChars.empty()) { preChars = "([^" + preChars + "])"; } if(!sucChars.empty()) { sucChars = "(?![" + sucChars + "])"; } Glib::ustring expr = preChars + "\\n" + sucChars; txt = Glib::Regex::create(expr)->replace(txt, 0, preChars.empty() ? " " : "\\1 ", static_cast(0)); if(m_filterJoinSpace->get_active()) { txt = Glib::Regex::create("[ \t]+")->replace(txt, 0, " ", static_cast(0)); } return true; }, _("Stripping line breaks...")); start = end = m_textBuffer->insert(m_textBuffer->erase(start, end), txt); start.backward_chars(txt.size()); m_textBuffer->select_range(start, end); } void OutputEditorText::toggleReplaceBox() { m_searchEntry->set_text(""); m_replaceEntry->set_text(""); m_replaceBox->set_visible(m_toggleSearchButton->get_active()); } void OutputEditorText::completeTextViewMenu(Gtk::Menu *menu) { Gtk::CheckMenuItem* item = Gtk::manage(new Gtk::CheckMenuItem(_("Check spelling"))); item->set_active(bool(GtkSpell::Checker::get_from_text_view(*m_textView))); CONNECT(item, toggled, [this, item] { if(item->get_active()) { m_spell.attach(*m_textView); } else { m_spell.detach(); } }); menu->prepend(*Gtk::manage(new Gtk::SeparatorMenuItem())); menu->prepend(*item); menu->show_all(); } void OutputEditorText::findNext() { findReplace(false, false); } void OutputEditorText::findPrev() { findReplace(true, false); } void OutputEditorText::replaceNext() { findReplace(false, true); } void OutputEditorText::replaceAll() { MAIN->pushState(MainWindow::State::Busy, _("Replacing...")); Glib::ustring searchstr = m_searchEntry->get_text(); Glib::ustring replacestr = m_replaceEntry->get_text(); if(!m_textBuffer->replaceAll(searchstr, replacestr, m_csCheckBox->get_active())) { Utils::set_error_state(m_searchEntry); } MAIN->popState(); } void OutputEditorText::findReplace(bool backwards, bool replace) { Utils::clear_error_state(m_searchEntry); Glib::ustring searchstr = m_searchEntry->get_text(); Glib::ustring replacestr = m_replaceEntry->get_text(); if(!m_textBuffer->findReplace(backwards, replace, m_csCheckBox->get_active(), searchstr, replacestr, m_textView)) { Utils::set_error_state(m_searchEntry); } } void OutputEditorText::read(tesseract::TessBaseAPI &tess, ReadSessionData *data) { char* textbuf = tess.GetUTF8Text(); Glib::ustring text = Glib::ustring(textbuf); if(!text.empty() && *--text.end() != '\n') text.append("\n"); if(data->prependFile || data->prependPage) { std::vector prepend; if(data->prependFile) { prepend.push_back(Glib::ustring::compose(_("File: %1"), data->file)); } if(data->prependPage) { prepend.push_back(Glib::ustring::compose(_("Page: %1"), data->page)); } text = Glib::ustring::compose("[%1]\n", Utils::string_join(prepend, "; ")) + text; } bool& insertText = static_cast(data)->insertText; Utils::runInMainThreadBlocking([&] { addText(text, insertText); }); delete[] textbuf; insertText = true; } void OutputEditorText::readError(const Glib::ustring &errorMsg, ReadSessionData *data) { bool& insertText = static_cast(data)->insertText; Utils::runInMainThreadBlocking([&] { addText(Glib::ustring::compose(_("\n[Failed to recognize page %1]\n"), errorMsg), insertText); }); insertText = true; } void OutputEditorText::addText(const Glib::ustring& text, bool insert) { if(insert) { m_textBuffer->insert_at_cursor(text); } else { if(m_insertMode == InsertMode::Append) { m_textBuffer->place_cursor(m_textBuffer->insert(m_textBuffer->end(), text)); } else if(m_insertMode == InsertMode::Cursor) { Gtk::TextIter start, end; m_textBuffer->get_region_bounds(start, end); m_textBuffer->place_cursor(m_textBuffer->insert(m_textBuffer->erase(start, end), text)); } else if(m_insertMode == InsertMode::Replace) { m_textBuffer->place_cursor(m_textBuffer->insert(m_textBuffer->erase(m_textBuffer->begin(), m_textBuffer->end()), text)); } } MAIN->setOutputPaneVisible(true); } bool OutputEditorText::save(const std::string& filename) { std::string outname = filename; if(outname.empty()) { std::vector sources = MAIN->getSourceManager()->getSelectedSources(); std::string ext, base; std::string name = !sources.empty() ? sources.front()->displayname : _("output"); Utils::get_filename_parts(name, base, ext); outname = Glib::build_filename(MAIN->getConfig()->getSetting>("outputdir")->getValue(), base + ".txt"); FileDialogs::FileFilter filter = {_("Text Files"), {"text/plain"}, {"*.txt"}}; outname = FileDialogs::save_dialog(_("Save Output..."), outname, filter); if(outname.empty()) { return false; } MAIN->getConfig()->getSetting>("outputdir")->setValue(Glib::path_get_dirname(outname)); } std::ofstream file(outname); if(!file.is_open()) { Utils::message_dialog(Gtk::MESSAGE_ERROR, _("Failed to save output"), _("Check that you have writing permissions in the selected folder.")); return false; } Glib::ustring txt = m_textBuffer->get_text(false); file.write(txt.data(), txt.bytes()); m_textBuffer->set_modified(false); return true; } bool OutputEditorText::clear(bool hide) { if(!m_outputBox->get_visible()) { return true; } if(getModified()) { int response = Utils::question_dialog(_("Output not saved"), _("Save output before proceeding?"), Utils::Button::Save|Utils::Button::Discard|Utils::Button::Cancel); if(response == Utils::Button::Save) { if(!save()) { return false; } } else if(response != Utils::Button::Discard) { return false; } } m_textBuffer->begin_not_undoable_action(); m_textBuffer->set_text(""); m_textBuffer->end_not_undoable_action(); m_textBuffer->set_modified(false); if(hide) MAIN->setOutputPaneVisible(false); return true; } bool OutputEditorText::getModified() const { return m_textBuffer->get_modified(); } void OutputEditorText::onVisibilityChanged(bool /*visibile*/) { m_substitutionsManager->set_visible(false); } void OutputEditorText::setLanguage(const Config::Lang& lang) { try { m_spell.set_language(lang.code.empty() ? Utils::getSpellingLanguage() : lang.code); } catch(const GtkSpell::Error& /*e*/) {} } gImageReader-3.2.3/gtk/src/OutputEditorText.hh000066400000000000000000000060221312567024200212460ustar00rootroot00000000000000/* -*- Mode: C++; indent-tabs-mode: t; c-basic-offset: 4; tab-width: 4 -*- */ /* * OutputEditorText.hh * Copyright (C) 2013-2017 Sandro Mani * * gImageReader 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. * * gImageReader 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 this program. If not, see . */ #ifndef OUTPUTEDITORTEXT_HH #define OUTPUTEDITORTEXT_HH #include #include #include "Config.hh" #include "MainWindow.hh" #include "OutputBuffer.hh" #include "OutputEditor.hh" class SubstitutionsManager; class OutputEditorText : public OutputEditor { public: OutputEditorText(); ~OutputEditorText(); Gtk::Box* getUI() override { return m_paneWidget; } ReadSessionData* initRead(tesseract::TessBaseAPI& /*tess*/) override { return new TextReadSessionData; } bool clear(bool hide = true) override; void read(tesseract::TessBaseAPI& tess, ReadSessionData* data) override; void readError(const Glib::ustring& errorMsg, ReadSessionData* data) override; bool getModified() const override; void onVisibilityChanged(bool visible) override; bool save(const std::string& filename = "") override; void setLanguage(const Config::Lang &lang) override; private: struct TextReadSessionData : ReadSessionData { bool insertText = false; }; enum class InsertMode { Append, Cursor, Replace }; Builder m_builder; Gtk::Box* m_paneWidget; Gtk::MenuButton* m_insButton; Gtk::Image* m_insImage; Gtk::EventBox* m_replaceBox; Gtk::Box* m_outputBox; Gsv::View* m_textView; Gtk::Entry* m_searchEntry; Gtk::Entry* m_replaceEntry; Gtk::CheckMenuItem* m_filterKeepIfEndMark; Gtk::CheckMenuItem* m_filterKeepIfQuote; Gtk::CheckMenuItem* m_filterJoinHyphen; Gtk::CheckMenuItem* m_filterJoinSpace; Gtk::CheckMenuItem* m_filterKeepParagraphs; Gtk::ToggleButton* m_toggleSearchButton; Gtk::Button* m_undoButton; Gtk::Button* m_redoButton; Gtk::CheckButton* m_csCheckBox; sigc::connection m_connectionCustomFont; sigc::connection m_connectionDefaultFont; Glib::RefPtr m_textBuffer; InsertMode m_insertMode; GtkSpell::Checker m_spell; SubstitutionsManager* m_substitutionsManager; void addText(const Glib::ustring& text, bool insert); void completeTextViewMenu(Gtk::Menu *menu); void filterBuffer(); void findNext(); void findPrev(); void findReplace(bool backwards, bool replace); void replaceAll(); void replaceNext(); void scrollCursorIntoView(); void setFont(); void setInsertMode(InsertMode mode, const std::string& iconName); void toggleReplaceBox(); }; #endif // OUTPUTEDITORTEXT_HH gImageReader-3.2.3/gtk/src/Recognizer.cc000066400000000000000000000547021312567024200200370ustar00rootroot00000000000000/* -*- Mode: C++; indent-tabs-mode: t; c-basic-offset: 4; tab-width: 4 -*- */ /* * Recognizer.cc * Copyright (C) 2013-2017 Sandro Mani * * gImageReader 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. * * gImageReader 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 this program. If not, see . */ #include "MainWindow.hh" #include "Config.hh" #include "Displayer.hh" #include "OutputEditor.hh" #include "Recognizer.hh" #include "TessdataManager.hh" #include "Utils.hh" #include #include #include #include #include #include #include #include #include #ifdef G_OS_WIN32 #include #define pipe(fds) _pipe(fds, 5000, _O_BINARY) #endif struct Recognizer::ProgressMonitor : public MainWindow::ProgressMonitor { ETEXT_DESC desc; bool canceled = false; int donePages = 0; int nPages; ProgressMonitor(int _nPages) { desc.progress = 0; desc.cancel = cancelCallback; desc.cancel_this = this; nPages = _nPages; } int getProgress() { return 100 * ((donePages + desc.progress / 100.) / nPages); } void cancel() { canceled = true; } static bool cancelCallback(void* instance, int /*words*/) { return reinterpret_cast(instance)->canceled; } }; class Recognizer::MultilingualMenuItem : public Gtk::RadioMenuItem { public: MultilingualMenuItem(Group& groupx, const Glib::ustring& label) : Gtk::RadioMenuItem(groupx, label) { CONNECT(this, select, [this] { if(!m_selected) { m_ignoreNextActivate = true; } m_selected = true; }); CONNECT(this, deselect, [this] { m_selected = false; m_ignoreNextActivate = false; }); this->signal_button_press_event().connect([this](GdkEventButton* /*ev*/) { set_active(true); return true; }, false); } protected: void on_activate() override { if(!m_ignoreNextActivate) { Gtk::RadioMenuItem::on_activate(); } m_ignoreNextActivate = false; } private: bool m_selected = false; bool m_ignoreNextActivate = false; }; Recognizer::Recognizer() { m_menuPages = MAIN->getWidget("menu:recognize.pages"); m_menuLanguages = MAIN->getWidget("menu:main.languages"); m_pagesDialog = MAIN->getWidget("dialog:recognize.pages"); m_pagesEntry = MAIN->getWidget("entry:dialog.pages"); m_langLabel = MAIN->getWidget("label:main.recognize.lang"); m_modeLabel = MAIN->getWidget("label:main.recognize.mode"); m_pageAreaLabel = MAIN->getWidget("label:dialog.regions"); m_pageAreaCombo = MAIN->getWidget("comboboxtext:dialog.regions"); Gtk::MenuButton* recognizeBtn = MAIN->getWidget("menubutton:main.languages"); recognizeBtn->set_menu(*m_menuLanguages); m_recognizeBtn = MAIN->getWidget("button:main.recognize"); CONNECT(m_recognizeBtn, clicked, [this] { recognizeButtonClicked(); }); CONNECT(MAIN->getWidget("menuitem:recognize.pages.current").as(), activate, [this] { recognizeCurrentPage(); }); CONNECT(MAIN->getWidget("menuitem:recognize.pages.multiple").as(), activate, [this] { recognizeMultiplePages();; }); CONNECTS(m_pagesEntry, focus_in_event, [](GdkEventFocus*, Gtk::Entry* e) { Utils::clear_error_state(e); return false; }); MAIN->getConfig()->addSetting(new VarSetting("language")); MAIN->getConfig()->addSetting(new ComboSetting("ocrregionstrategy", MAIN->getWidget("comboboxtext:dialog.regions"))); MAIN->getConfig()->addSetting(new SwitchSettingT("ocraddsourcefilename", MAIN->getWidget("checkbutton:dialog.pages.prepend.filename"))); MAIN->getConfig()->addSetting(new SwitchSettingT("ocraddsourcepage", MAIN->getWidget("checkbutton:dialog.pages.prepend.page"))); MAIN->getConfig()->addSetting(new VarSetting("psm")); } std::vector Recognizer::getAvailableLanguages() const { tesseract::TessBaseAPI tess; initTesseract(tess); GenericVector availLanguages; tess.GetAvailableLanguagesAsVector(&availLanguages); std::vector result; for(int i = 0; i < availLanguages.size(); ++i) { result.push_back(availLanguages[i].string()); } return result; } static int g_pipe[2]; static jmp_buf g_restore_point; static void tessCrashHandler(int /*signal*/) { fflush(stderr); char buf[1025]; int bytesRead = 0; Glib::ustring captured; do { if((bytesRead = read(g_pipe[0], buf, sizeof(buf)-1)) > 0) { buf[bytesRead] = 0; captured += buf; } } while(bytesRead == sizeof(buf)-1); tesseract::TessBaseAPI tess; Glib::ustring errMsg = Glib::ustring::compose(_("Tesseract crashed with the following message:\n\n" "%1\n\n" "This typically happens for one of the following reasons:\n" "- Outdated traineddata files are used.\n" "- Auxiliary language data files are missing.\n" "- Corrupt language data files.\n\n" "Make sure your language data files are valid and compatible with tesseract %2."), captured, tess.Version()); Utils::message_dialog(Gtk::MESSAGE_ERROR, _("Error"), errMsg); longjmp(g_restore_point, SIGSEGV); } bool Recognizer::initTesseract(tesseract::TessBaseAPI& tess, const char* language) const { std::string current = setlocale(LC_NUMERIC, NULL); setlocale(LC_NUMERIC, "C"); // unfortunately tesseract creates deliberate segfaults when an error occurs std::signal(SIGSEGV, tessCrashHandler); pipe(g_pipe); fflush(stderr); int oldstderr = dup(fileno(stderr)); dup2(g_pipe[1], fileno(stderr)); int ret = -1; int fault_code = setjmp(g_restore_point); if(fault_code == 0) { ret = tess.Init(nullptr, language); } else { ret = -1; } dup2(oldstderr, fileno(stderr)); std::signal(SIGSEGV, MainWindow::signalHandler); setlocale(LC_NUMERIC, current.c_str()); close(g_pipe[0]); close(g_pipe[1]); return ret != -1; } void Recognizer::updateLanguagesMenu() { m_menuLanguages->foreach([this](Gtk::Widget& w) { m_menuLanguages->remove(w); }); m_langMenuRadioGroup = Gtk::RadioButtonGroup(); m_langMenuCheckGroup = std::vector>(); m_psmRadioGroup = Gtk::RadioButtonGroup(); m_curLang = Config::Lang(); Gtk::RadioMenuItem* curitem = nullptr; Gtk::RadioMenuItem* activeitem = nullptr; bool haveOsd = false; std::vector parts = Utils::string_split(MAIN->getConfig()->getSetting>("language")->getValue(), ':'); Config::Lang curlang = {parts.empty() ? "eng" : parts[0], parts.size() < 2 ? "" : parts[1]}; std::vector dicts = GtkSpell::Checker::get_language_list(); std::vector availLanguages = getAvailableLanguages(); if(availLanguages.empty()) { Utils::message_dialog(Gtk::MESSAGE_ERROR, _("No languages available"), _("No tesseract languages are available for use. Recognition will not work.")); m_langLabel->set_text(""); } // Add menu items for languages, with spelling submenu if available for(const Glib::ustring& langprefix : availLanguages) { if(langprefix == "osd") { haveOsd = true; continue; } Config::Lang lang = {langprefix}; if(!MAIN->getConfig()->searchLangSpec(lang)) { lang.name = lang.prefix; } std::vector spelldicts; if(!lang.code.empty()) { for(const Glib::ustring& dict : dicts) { if(dict.substr(0, 2) == lang.code.substr(0, 2)) { spelldicts.push_back(dict); } } std::sort(spelldicts.begin(), spelldicts.end()); } if(!spelldicts.empty()) { Gtk::MenuItem* item = Gtk::manage(new Gtk::MenuItem(lang.name)); Gtk::Menu* submenu = Gtk::manage(new Gtk::Menu); for(const Glib::ustring& dict : spelldicts) { Config::Lang itemlang = {lang.prefix, dict, lang.name}; curitem = Gtk::manage(new Gtk::RadioMenuItem(m_langMenuRadioGroup, GtkSpell::Checker::decode_language_code(dict))); CONNECT(curitem, toggled, [this, curitem, itemlang] { setLanguage(curitem, itemlang); }); if(curlang.prefix == lang.prefix && ( curlang.code == dict || (!activeitem && (curlang.code == dict.substr(0, 2) || curlang.code.empty())))) { curlang = itemlang; activeitem = curitem; } submenu->append(*curitem); } item->set_submenu(*submenu); m_menuLanguages->append(*item); } else { curitem = Gtk::manage(new Gtk::RadioMenuItem(m_langMenuRadioGroup, lang.name)); CONNECT(curitem, toggled, [this, curitem, lang] { setLanguage(curitem, lang); }); if(curlang.prefix == lang.prefix) { curlang = lang; activeitem = curitem; } m_menuLanguages->append(*curitem); } } // Add multilanguage menu bool isMultilingual = false; if(!availLanguages.empty()) { m_menuLanguages->append(*Gtk::manage(new Gtk::SeparatorMenuItem())); m_multilingualRadio = Gtk::manage(new MultilingualMenuItem(m_langMenuRadioGroup, _("Multilingual"))); Gtk::Menu* submenu = Gtk::manage(new Gtk::Menu); isMultilingual = curlang.prefix.find('+') != curlang.prefix.npos; std::vector sellangs = Utils::string_split(curlang.prefix, '+', false); for(const Glib::ustring& langprefix : availLanguages) { if(langprefix == "osd") { continue; } Config::Lang lang = {langprefix}; if(!MAIN->getConfig()->searchLangSpec(lang)) { lang.name = lang.prefix; } Gtk::CheckMenuItem* item = Gtk::manage(new Gtk::CheckMenuItem(lang.name)); item->set_active(isMultilingual && std::find(sellangs.begin(), sellangs.end(), lang.prefix) != sellangs.end()); CONNECT(item, button_press_event, [this,item](GdkEventButton* ev) { return onMultilingualItemButtonEvent(ev, item); }, false); CONNECT(item, button_release_event, [this,item](GdkEventButton* ev) { return onMultilingualItemButtonEvent(ev, item); }, false); // CONNECT(item, toggled, [this]{ setMultiLanguage(); }); submenu->append(*item); m_langMenuCheckGroup.push_back(std::make_pair(item, lang.prefix)); } m_multilingualRadio->set_submenu(*submenu); CONNECT(m_multilingualRadio, toggled, [this] { if(m_multilingualRadio->get_active()) setMultiLanguage(); }); CONNECT(submenu, button_press_event, [this](GdkEventButton* ev) { return onMultilingualMenuButtonEvent(ev); }, false); CONNECT(submenu, button_release_event, [this](GdkEventButton* ev) { return onMultilingualMenuButtonEvent(ev); }, false); m_menuLanguages->append(*m_multilingualRadio); } if(isMultilingual) { activeitem = m_multilingualRadio; setMultiLanguage(); } else if(activeitem == nullptr) { activeitem = curitem; } // Add PSM items m_menuLanguages->append(*Gtk::manage(new Gtk::SeparatorMenuItem())); Gtk::Menu* psmMenu = Gtk::manage(new Gtk::Menu); m_currentPsmMode = MAIN->getConfig()->getSetting>("psm")->getValue(); struct PsmEntry { Glib::ustring label; tesseract::PageSegMode psmMode; bool requireOsd; }; std::vector psmModes = { PsmEntry{_("Automatic page segmentation"), tesseract::PSM_AUTO, false}, PsmEntry{_("Page segmentation with orientation and script detection"), tesseract::PSM_AUTO_OSD, true}, PsmEntry{_("Assume single column of text"), tesseract::PSM_SINGLE_COLUMN, false}, PsmEntry{_("Assume single block of vertically aligned text"), tesseract::PSM_SINGLE_BLOCK_VERT_TEXT, false}, PsmEntry{_("Assume a single uniform block of text"), tesseract::PSM_SINGLE_BLOCK, false}, PsmEntry{_("Assume a line of text"), tesseract::PSM_SINGLE_LINE, false}, PsmEntry{_("Assume a single word"), tesseract::PSM_SINGLE_WORD, false}, PsmEntry{_("Assume a single word in a circle"), tesseract::PSM_CIRCLE_WORD, false}, PsmEntry{_("Sparse text in no particular order"), tesseract::PSM_SPARSE_TEXT, false}, PsmEntry{_("Sparse text with orientation and script detection"), tesseract::PSM_SPARSE_TEXT_OSD, true}}; for(const auto& entry : psmModes) { Gtk::RadioMenuItem* item = Gtk::manage(new Gtk::RadioMenuItem(m_psmRadioGroup, entry.label)); item->set_sensitive(!entry.requireOsd || haveOsd); item->set_active(entry.psmMode == m_currentPsmMode); CONNECT(item, toggled, [this, entry, item] { if(item->get_active()) { m_currentPsmMode = entry.psmMode; MAIN->getConfig()->getSetting>("psm")->setValue(entry.psmMode); } }); psmMenu->append(*item); } Gtk::MenuItem* psmItem = Gtk::manage(new Gtk::MenuItem(_("Page segmentation mode"))); psmItem->set_submenu(*psmMenu); m_menuLanguages->append(*psmItem); // Add installer item m_menuLanguages->append(*Gtk::manage(new Gtk::SeparatorMenuItem())); Gtk::MenuItem* manageItem = Gtk::manage(new Gtk::MenuItem(_("Manage languages..."))); CONNECT(manageItem, activate, [this] { manageInstalledLanguages(); }); m_menuLanguages->append(*manageItem); m_menuLanguages->show_all(); if(activeitem) { activeitem->set_active(true); activeitem->toggled(); // Ensure signal is emitted } } void Recognizer::setLanguage(const Gtk::RadioMenuItem* item, const Config::Lang &lang) { if(item->get_active()) { if(!lang.code.empty()) { m_langLabel->set_markup(Glib::ustring::compose(" %1 (%2)", lang.name, lang.code)); } else { m_langLabel->set_markup(Glib::ustring::compose(" %1", lang.name)); } m_curLang = lang; MAIN->getConfig()->getSetting>("language")->setValue(lang.prefix + ":" + lang.code); m_signal_languageChanged.emit(m_curLang); } } void Recognizer::setMultiLanguage() { m_multilingualRadio->set_active(true); Glib::ustring langs; for(const auto& pair : m_langMenuCheckGroup) { if(pair.first->get_active()) { langs += pair.second + "+"; } } if(langs.empty()) { langs = "eng+"; } langs = langs.substr(0, langs.length() - 1); m_langLabel->set_markup("" + langs + ""); m_curLang = {langs, "", "Multilingual"}; MAIN->getConfig()->getSetting>("language")->setValue(langs + ":"); m_signal_languageChanged.emit(m_curLang); } void Recognizer::setRecognizeMode(const Glib::ustring& mode) { m_modeLabel->set_markup(Glib::ustring::compose("%1", mode)); } std::vector Recognizer::selectPages(bool& autodetectLayout) { int nPages = MAIN->getDisplayer()->getNPages(); m_pagesEntry->set_text(Glib::ustring::compose("1-%1", nPages)); m_pagesEntry->grab_focus(); m_pageAreaLabel->set_visible(MAIN->getDisplayer()->allowAutodetectOCRAreas()); m_pageAreaCombo->set_visible(MAIN->getDisplayer()->allowAutodetectOCRAreas()); MAIN->getWidget("box:dialog.pages.prepend")->set_visible(MAIN->getDisplayer()->allowAutodetectOCRAreas()); Glib::RefPtr store = Glib::RefPtr::cast_static(m_pageAreaCombo->get_model()); int col = m_pageAreaCombo->get_entry_text_column(); store->children()[0]->set_value(col, MAIN->getDisplayer()->hasMultipleOCRAreas() ? _("Current selection") : _("Entire page")); std::vector pages; if(m_pagesDialog->run() == Gtk::RESPONSE_OK) { Glib::ustring text = m_pagesEntry->get_text(); text = Glib::Regex::create("\\s+")->replace(text, 0, "", static_cast(0)); std::vector&& blocks = Utils::string_split(text, ',', false); for(const Glib::ustring& block : blocks) { std::vector&& ranges = Utils::string_split(block, '-', false); if(ranges.size() == 1) { int page = atoi(ranges[0].c_str()); if(page > 0 && page <= nPages) { pages.push_back(page); } } else if(ranges.size() == 2) { int start = std::max(1, atoi(ranges[0].c_str())); int end = std::min(nPages, atoi(ranges[1].c_str())); for(int page = start; page <= end; ++page) { pages.push_back(page); } } else { pages.clear(); break; } } if(pages.empty()) { Utils::set_error_state(m_pagesEntry); } } autodetectLayout = m_pageAreaCombo->get_visible() ? m_pageAreaCombo->get_active_row_number() == 1 : false; m_pagesDialog->hide(); std::sort(pages.begin(), pages.end()); return pages; } void Recognizer::recognizeButtonClicked() { int nPages = MAIN->getDisplayer()->getNPages(); if(nPages == 1) { recognize({MAIN->getDisplayer()->getCurrentPage()}); } else { auto positioner = sigc::bind(sigc::ptr_fun(Utils::popup_positioner), m_recognizeBtn, m_menuPages, false, true); m_menuPages->popup(positioner, 0, gtk_get_current_event_time()); } } void Recognizer::recognizeCurrentPage() { recognize({MAIN->getDisplayer()->getCurrentPage()}); } void Recognizer::recognizeMultiplePages() { bool autodetectLayout = false; std::vector pages = selectPages(autodetectLayout); recognize(pages, autodetectLayout); } void Recognizer::recognize(const std::vector &pages, bool autodetectLayout) { tesseract::TessBaseAPI tess; bool prependFile = pages.size() > 1 && MAIN->getConfig()->getSetting("ocraddsourcefilename")->getValue(); bool prependPage = pages.size() > 1 && MAIN->getConfig()->getSetting("ocraddsourcepage")->getValue(); if(initTesseract(tess, m_curLang.prefix.c_str())) { Glib::ustring failed; tess.SetPageSegMode(static_cast(m_currentPsmMode)); OutputEditor::ReadSessionData* readSessionData = MAIN->getOutputEditor()->initRead(tess); ProgressMonitor monitor(pages.size()); MAIN->showProgress(&monitor); Utils::busyTask([&] { int npages = pages.size(); int idx = 0; std::string prevFile; for(int page : pages) { monitor.desc.progress = 0; ++idx; Glib::signal_idle().connect_once([=] { MAIN->pushState(MainWindow::State::Busy, Glib::ustring::compose(_("Recognizing page %1 (%2 of %3)"), page, idx, npages)); }); bool success = false; Utils::runInMainThreadBlocking([&] { success = setPage(page, autodetectLayout); }); if(!success) { failed.append(Glib::ustring::compose(_("\n- Page %1: failed to render page"), page)); MAIN->getOutputEditor()->readError(_("\n[Failed to recognize page %1]\n"), readSessionData); continue; } readSessionData->file = MAIN->getDisplayer()->getCurrentImage(readSessionData->page); readSessionData->angle = MAIN->getDisplayer()->getCurrentAngle(); readSessionData->resolution = MAIN->getDisplayer()->getCurrentResolution(); bool firstChunk = true; bool newFile = readSessionData->file != prevFile; prevFile = readSessionData->file; for(const Cairo::RefPtr& image : MAIN->getDisplayer()->getOCRAreas()) { readSessionData->prependPage = prependPage && firstChunk; readSessionData->prependFile = prependFile && (readSessionData->prependPage || newFile); firstChunk = false; newFile = false; tess.SetImage(image->get_data(), image->get_width(), image->get_height(), 4, image->get_stride()); tess.SetSourceResolution(MAIN->getDisplayer()->getCurrentResolution()); tess.Recognize(&monitor.desc); if(!monitor.canceled) { MAIN->getOutputEditor()->read(tess, readSessionData); } } Glib::signal_idle().connect_once([] { MAIN->popState(); }); ++monitor.donePages; if(monitor.canceled) { break; } } return true; }, _("Recognizing...")); MAIN->hideProgress(); MAIN->getOutputEditor()->finalizeRead(readSessionData); if(!failed.empty()) { Utils::message_dialog(Gtk::MESSAGE_ERROR, _("Recognition errors occurred"), Glib::ustring::compose(_("The following errors occurred:%1"), failed)); } } } bool Recognizer::recognizeImage(const Cairo::RefPtr &img, OutputDestination dest) { tesseract::TessBaseAPI tess; if(!initTesseract(tess, m_curLang.prefix.c_str())) { Utils::message_dialog(Gtk::MESSAGE_ERROR, _("Recognition errors occurred"), _("Failed to initialize tesseract")); return false; } tess.SetImage(img->get_data(), img->get_width(), img->get_height(), 4, 4 * img->get_width()); ProgressMonitor monitor(1); MAIN->showProgress(&monitor); if(dest == OutputDestination::Buffer) { OutputEditor::ReadSessionData* readSessionData = MAIN->getOutputEditor()->initRead(tess); readSessionData->file = MAIN->getDisplayer()->getCurrentImage(readSessionData->page); readSessionData->angle = MAIN->getDisplayer()->getCurrentAngle(); readSessionData->resolution = MAIN->getDisplayer()->getCurrentResolution(); Utils::busyTask([&] { tess.Recognize(&monitor.desc); if(!monitor.canceled) { MAIN->getOutputEditor()->read(tess, readSessionData); } return true; }, _("Recognizing...")); MAIN->getOutputEditor()->finalizeRead(readSessionData); } else if(dest == OutputDestination::Clipboard) { Glib::ustring output; if(Utils::busyTask([&] { tess.Recognize(&monitor.desc); if(!monitor.canceled) { char* text = tess.GetUTF8Text(); output = text; delete[] text; return true; } return false; }, _("Recognizing..."))) { Gtk::Clipboard::get()->set_text(output); } } MAIN->hideProgress(); return true; } bool Recognizer::setPage(int page, bool autodetectLayout) { bool success = true; if(page != MAIN->getDisplayer()->getCurrentPage()) { success = MAIN->getDisplayer()->setCurrentPage(page); } if(autodetectLayout) { MAIN->getDisplayer()->autodetectOCRAreas(); } return success; } bool Recognizer::onMultilingualMenuButtonEvent(GdkEventButton* ev) { Gtk::Allocation alloc = m_multilingualRadio->get_allocation(); int radio_x_root, radio_y_root; m_multilingualRadio->get_window()->get_root_coords(alloc.get_x(), alloc.get_y(), radio_x_root, radio_y_root); if(ev->x_root >= radio_x_root && ev->x_root <= radio_x_root + alloc.get_width() && ev->y_root >= radio_y_root && ev->y_root <= radio_y_root + alloc.get_height()) { if(ev->type == GDK_BUTTON_PRESS) { m_multilingualRadio->set_active(true); } return true; } return false; } bool Recognizer::onMultilingualItemButtonEvent(GdkEventButton* ev, Gtk::CheckMenuItem* item) { Gtk::Allocation alloc = item->get_allocation(); int item_x_root, item_y_root; item->get_window()->get_root_coords(alloc.get_x(), alloc.get_y(), item_x_root, item_y_root); if(ev->x_root >= item_x_root && ev->x_root <= item_x_root + alloc.get_width() && ev->y_root >= item_y_root && ev->y_root <= item_y_root + alloc.get_height()) { if(ev->type == GDK_BUTTON_RELEASE) { item->set_active(!item->get_active()); setMultiLanguage(); } return true; } return false; } void Recognizer::manageInstalledLanguages() { TessdataManager::exec(); } gImageReader-3.2.3/gtk/src/Recognizer.hh000066400000000000000000000055351312567024200200510ustar00rootroot00000000000000/* -*- Mode: C++; indent-tabs-mode: t; c-basic-offset: 4; tab-width: 4 -*- */ /* * Recognizer.hh * Copyright (C) 2013-2017 Sandro Mani * * gImageReader 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. * * gImageReader 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 this program. If not, see . */ #ifndef RECOGNIZER_HH #define RECOGNIZER_HH #include "common.hh" #include "Config.hh" #include namespace tesseract { class TessBaseAPI; } class Recognizer { public: enum class OutputDestination { Buffer, Clipboard }; Recognizer(); std::vector getAvailableLanguages() const; const Config::Lang& getSelectedLanguage() const { return m_curLang; } void setRecognizeMode(const Glib::ustring& mode); void updateLanguagesMenu(); bool recognizeImage(const Cairo::RefPtr& img, OutputDestination dest); sigc::signal signal_languageChanged() const { return m_signal_languageChanged; } private: struct ProgressMonitor; class MultilingualMenuItem; enum class PageArea { EntirePage, Autodetect }; enum class TaskState { Waiting, Succeeded, Failed }; Gtk::Menu* m_menuLanguages; Gtk::Menu* m_menuPages; Gtk::Dialog* m_pagesDialog; Gtk::Entry* m_pagesEntry; Gtk::Label* m_langLabel; Gtk::Label* m_modeLabel; Gtk::Button* m_recognizeBtn; Gtk::Label* m_pageAreaLabel; Gtk::ComboBoxText* m_pageAreaCombo; sigc::signal m_signal_languageChanged; Gtk::RadioButtonGroup m_langMenuRadioGroup; Gtk::RadioButtonGroup m_psmRadioGroup; int m_currentPsmMode; std::vector> m_langMenuCheckGroup; MultilingualMenuItem* m_multilingualRadio = nullptr; Config::Lang m_curLang; bool initTesseract(tesseract::TessBaseAPI& tess, const char* language = nullptr) const; void recognizeButtonClicked(); void recognizeCurrentPage(); void recognizeMultiplePages(); void recognize(const std::vector& pages, bool autodetectLayout = false); std::vector selectPages(bool& autodetectLayout); void setLanguage(const Gtk::RadioMenuItem *item, const Config::Lang& lang); void setMultiLanguage(); bool setPage(int page, bool autodetectLayout); bool onMultilingualMenuButtonEvent(GdkEventButton* ev); bool onMultilingualItemButtonEvent(GdkEventButton* ev, Gtk::CheckMenuItem* item); void manageInstalledLanguages(); }; #endif // RECOGNIZER_HH gImageReader-3.2.3/gtk/src/Scanner.hh000066400000000000000000000044621312567024200173310ustar00rootroot00000000000000/* -*- Mode: C++; indent-tabs-mode: t; c-basic-offset: 4; tab-width: 4 -*- */ /* * Scanner.hh * Copyright (C) 2013-2017 Sandro Mani * * gImageReader 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. * * gImageReader 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 this program. If not, see . */ #ifndef SCANNER_HH #define SCANNER_HH #include "common.hh" class Scanner { public: enum class State { IDLE = 0, OPEN, SET_OPTIONS, START, GET_PARAMETERS, READ }; enum class ScanMode { DEFAULT = 0, COLOR, GRAY, LINEART }; enum class ScanType { SINGLE = 0, ADF_FRONT, ADF_BACK, ADF_BOTH }; struct Device { std::string name; std::string label; }; struct Params { std::string device; std::string filename; double dpi; ScanMode scan_mode; int depth; ScanType type; int page_width; int page_height; }; virtual ~Scanner() { } virtual void init() = 0; virtual void redetect() = 0; virtual void scan(const Params& params) = 0; virtual void cancel() = 0; virtual void close() = 0; sigc::signal signal_initFailed() const { return m_signal_initFailed; } sigc::signal> signal_devicesDetected() const { return m_signal_devicesDetected; } sigc::signal signal_scanFailed() const { return m_signal_scanFailed; } sigc::signal signal_scanStateChanged() const { return m_signal_scanStateChanged; } sigc::signal signal_pageAvailable() const { return m_signal_pageAvailable; } protected: sigc::signal m_signal_initFailed; sigc::signal> m_signal_devicesDetected; sigc::signal m_signal_scanFailed; sigc::signal m_signal_scanStateChanged; sigc::signal m_signal_pageAvailable; }; #endif // SCANNER_HH gImageReader-3.2.3/gtk/src/SourceManager.cc000066400000000000000000000267271312567024200204710ustar00rootroot00000000000000/* -*- Mode: C++; indent-tabs-mode: t; c-basic-offset: 4; tab-width: 4 -*- */ /* * SourceManager.cc * Copyright (C) 2013-2017 Sandro Mani * * gImageReader 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. * * gImageReader 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 this program. If not, see . */ #include "FileDialogs.hh" #include "MainWindow.hh" #include "SourceManager.hh" #include "Utils.hh" #include SourceManager::SourceManager() { m_notebook = MAIN->getWidget("notebook:sources"); m_listView = MAIN->getWidget("treeview:input.images"); m_addButton = MAIN->getWidget("button:sources.images.add"); m_addButtonMenu = MAIN->getWidget("menubutton:sources.images.add"); m_removeButton = MAIN->getWidget("button:sources.images.remove"); m_deleteButton = MAIN->getWidget("button:sources.images.delete"); m_clearButton = MAIN->getWidget("button:sources.images.clear"); m_pasteItem = MAIN->getWidget("menuitem:sources.images.paste"); m_listView->set_model(Gtk::ListStore::create(m_listViewCols)); m_listView->append_column("", m_listViewCols.filename); Gtk::TreeViewColumn* col = m_listView->get_column(0); col->set_sizing(Gtk::TREE_VIEW_COLUMN_FIXED); Gtk::CellRendererText* cell = static_cast(col->get_cells().front()); cell->property_ellipsize() = Pango::ELLIPSIZE_END; m_listView->set_fixed_height_mode(); Glib::RefPtr recentFilter = Gtk::RecentFilter::create(); recentFilter->add_pixbuf_formats(); recentFilter->add_mime_type("application/pdf"); recentFilter->add_pattern("*.pdf"); Gtk::RecentChooserMenu* recentChooser = Gtk::manage(new Gtk::RecentChooserMenu()); recentChooser->set_filter(recentFilter); recentChooser->set_local_only(false); recentChooser->set_show_not_found(false); recentChooser->set_show_tips(true); recentChooser->set_sort_type(Gtk::RECENT_SORT_MRU); MAIN->getWidget("menuitem:sources.images.recent").as()->set_submenu(*recentChooser); m_clipboard = Gtk::Clipboard::get_for_display(Gdk::Display::get_default()); Gtk::ToggleButton* toggleSourcesBtn = MAIN->getWidget("button:main.sources"); CONNECTS(toggleSourcesBtn, toggled, [this](Gtk::ToggleButton* b) { m_notebook->set_visible(b->get_active()); }); CONNECT(m_addButton, clicked, [this] { openSources(); }); CONNECT(m_addButtonMenu, clicked, [this] { m_pasteItem->set_sensitive(m_clipboard->wait_is_image_available()); }); CONNECT(m_pasteItem, activate, [this] { pasteClipboard(); }); CONNECT(MAIN->getWidget("menuitem:sources.images.screenshot").as(), activate, [this] { takeScreenshot(); }); CONNECT(m_removeButton, clicked, [this] { removeSource(false); }); CONNECT(m_deleteButton, clicked, [this] { removeSource(true); }); CONNECT(m_clearButton, clicked, [this] { clearSources(); }); m_connectionSelectionChanged = CONNECT(m_listView->get_selection(), changed, [this] { selectionChanged(); }); CONNECT(recentChooser, item_activated, [this, recentChooser] { addSources({Gio::File::create_for_uri(recentChooser->get_current_uri())}); }); // Handle drops on the scrolled window Gtk::ScrolledWindow* scollWin = MAIN->getWidget("scrollwin:sources.images"); scollWin->drag_dest_set({Gtk::TargetEntry("text/uri-list")}, Gtk::DEST_DEFAULT_MOTION | Gtk::DEST_DEFAULT_DROP, Gdk::ACTION_COPY | Gdk::ACTION_MOVE); CONNECT(scollWin, drag_data_received, sigc::ptr_fun(Utils::handle_drag_drop)); } SourceManager::~SourceManager() { clearSources(); } void SourceManager::addSources(const std::vector>& files) { Glib::ustring failed; Glib::RefPtr store = Glib::RefPtr::cast_static(m_listView->get_model()); Gtk::TreeIter it = store->children().end(); for(Glib::RefPtr file : files) { if(!file->query_exists()) { failed += "\n\t" + file->get_path(); continue; } bool contains = false; for(const Gtk::TreeModel::Row& row : store->children()) { if(row.get_value(m_listViewCols.source)->file->get_uri() == file->get_uri()) { contains = true; break; } } if(contains) { continue; } it = store->append(); it->set_value(m_listViewCols.filename, file->get_basename()); Source* source = new Source(file, file->get_basename(), file->monitor_file(Gio::FILE_MONITOR_SEND_MOVED), false); it->set_value(m_listViewCols.source, source); it->set_value(m_listViewCols.path, file->get_path()); CONNECT(source->monitor, changed, sigc::bind(sigc::mem_fun(*this, &SourceManager::fileChanged), it)); Gtk::RecentManager::get_default()->add_item(file->get_uri()); } if(it) { m_connectionSelectionChanged.block(true); m_listView->get_selection()->unselect_all(); m_connectionSelectionChanged.block(false); m_listView->get_selection()->select(it); } if(!failed.empty()) { Utils::message_dialog(Gtk::MESSAGE_ERROR, _("Unable to open files"), Glib::ustring::compose(_("The following files could not be opened:%1"), failed)); } } std::vector SourceManager::getSelectedSources() const { std::vector selectedSources; for(const Gtk::TreeModel::Path& path : m_listView->get_selection()->get_selected_rows()) { selectedSources.push_back(m_listView->get_model()->get_iter(path)->get_value(m_listViewCols.source)); } return selectedSources; } void SourceManager::openSources() { std::vector curSrc = getSelectedSources(); std::string initialFolder = !curSrc.empty() ? Glib::path_get_dirname(curSrc.front()->file->get_path()) : ""; FileDialogs::FileFilter filter = FileDialogs::FileFilter::pixbuf_formats(); filter.name = _("Images and PDFs"); filter.mime_types.push_back("application/pdf"); filter.patterns.push_back("*.pdf"); addSources(FileDialogs::open_dialog(_("Select Files"), initialFolder, filter, true)); } void SourceManager::pasteClipboard() { Glib::RefPtr pixbuf = m_clipboard->wait_for_image(); if(!pixbuf) { Utils::message_dialog(Gtk::MESSAGE_ERROR, _("Clipboard Error"), _("Failed to read the clipboard.")); return; } ++m_pasteCount; std::string displayname = Glib::ustring::compose(_("Pasted %1"), m_pasteCount); savePixbuf(pixbuf, displayname); } void SourceManager::takeScreenshot() { Glib::RefPtr root = Gdk::Window::get_default_root_window(); int x, y, w, h; root->get_origin(x, y); w = root->get_width(); h = root->get_height(); Glib::RefPtr pixbuf = Gdk::Pixbuf::create(root, x, y, w, h); if(!pixbuf) { Utils::message_dialog(Gtk::MESSAGE_ERROR, _("Screenshot Error"), _("Failed to take screenshot.")); return; } ++m_screenshotCount; std::string displayname = Glib::ustring::compose(_("Screenshot %1"), m_screenshotCount); savePixbuf(pixbuf, displayname); } void SourceManager::savePixbuf(const Glib::RefPtr &pixbuf, const std::string &displayname) { MAIN->pushState(MainWindow::State::Busy, _("Saving image...")); std::string filename; try { int fd = Glib::file_open_tmp(filename, PACKAGE_NAME); close(fd); pixbuf->save(filename, "png"); } catch(Glib::FileError&) { Utils::message_dialog(Gtk::MESSAGE_ERROR, _("Cannot Write File"), Glib::ustring::compose(_("Could not write to %1."), filename)); MAIN->popState(); return; } MAIN->popState(); Glib::RefPtr store = Glib::RefPtr::cast_static(m_listView->get_model()); Glib::RefPtr file = Gio::File::create_for_path(filename); Source* source = new Source(file, displayname, file->monitor_file(Gio::FILE_MONITOR_SEND_MOVED), true); Gtk::TreeIter it = store->append(); it->set_value(m_listViewCols.filename, displayname); it->set_value(m_listViewCols.path, filename); it->set_value(m_listViewCols.source, source); CONNECT(source->monitor, changed, sigc::bind(sigc::mem_fun(*this, &SourceManager::fileChanged), it)); m_connectionSelectionChanged.block(true); m_listView->get_selection()->unselect_all(); m_connectionSelectionChanged.block(false); m_listView->get_selection()->select(it); } void SourceManager::removeSource(bool deleteFile) { std::string paths; for(const Gtk::TreeModel::Path& path : m_listView->get_selection()->get_selected_rows()) { paths += std::string("\n") + m_listView->get_model()->get_iter(path)->get_value(m_listViewCols.source)->file->get_path(); } if(paths.empty()) { return; } if(deleteFile && Utils::Button::Yes != Utils::question_dialog(_("Delete File?"), Glib::ustring::compose(_("The following files will be deleted:%1"), paths), Utils::Button::Yes|Utils::Button::No)) { return; } // Avoid multiple sourceChanged emissions when removing items m_connectionSelectionChanged.block(true); Glib::RefPtr store = Glib::RefPtr::cast_static(m_listView->get_model()); Gtk::TreeIter it; std::vector selected = m_listView->get_selection()->get_selected_rows(); while(!selected.empty()) { it = m_listView->get_model()->get_iter(selected.back()); selected.pop_back(); Source* source = it->get_value(m_listViewCols.source); if(deleteFile || source->isTemp) { source->file->remove(); } delete source; it = store->erase(it); } if(!it && store->children().size() > 0) { it = --store->children().end(); } if(it) { m_listView->get_selection()->select(it); } m_connectionSelectionChanged.block(false); selectionChanged(); } void SourceManager::clearSources() { Glib::RefPtr store = Glib::RefPtr::cast_static(m_listView->get_model()); for(const Gtk::TreeModel::Row& row : store->children()) { Source* source = row.get_value(m_listViewCols.source); if(source->isTemp) { source->file->remove(); } delete source; } m_connectionSelectionChanged.block(true); store->clear(); m_connectionSelectionChanged.block(false); selectionChanged(); } void SourceManager::selectionChanged() { bool enabled = !m_listView->get_selection()->get_selected_rows().empty(); m_removeButton->set_sensitive(enabled); m_deleteButton->set_sensitive(enabled); m_clearButton->set_sensitive(enabled); m_signal_sourceChanged.emit(); } void SourceManager::fileChanged(const Glib::RefPtr& file, const Glib::RefPtr& otherFile, Gio::FileMonitorEvent event, Gtk::TreeIter it) { Glib::RefPtr store = Glib::RefPtr::cast_static(m_listView->get_model()); Source* source = it->get_value(m_listViewCols.source); if(event == Gio::FILE_MONITOR_EVENT_MOVED) { source->file = otherFile; source->monitor = otherFile->monitor_file(Gio::FILE_MONITOR_SEND_MOVED); it->set_value(m_listViewCols.filename, otherFile->get_basename()); it->set_value(m_listViewCols.path, otherFile->get_path()); CONNECT(source->monitor, changed, sigc::bind(sigc::mem_fun(*this, &SourceManager::fileChanged), it)); if(it == m_listView->get_selection()->get_selected()) { m_signal_sourceChanged.emit(); } } else if(event == Gio::FILE_MONITOR_EVENT_DELETED) { Utils::message_dialog(Gtk::MESSAGE_ERROR, _("Missing File"), Glib::ustring::compose(_("The following file has been deleted or moved:\n%1"), file->get_path())); delete source; it = store->erase(it); if(!it) { it = store->children().begin(); } if(it) { m_listView->get_selection()->select(it); } } } gImageReader-3.2.3/gtk/src/SourceManager.hh000066400000000000000000000054001312567024200204640ustar00rootroot00000000000000/* -*- Mode: C++; indent-tabs-mode: t; c-basic-offset: 4; tab-width: 4 -*- */ /* * SourceManager.hh * Copyright (C) 2013-2017 Sandro Mani * * gImageReader 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. * * gImageReader 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 this program. If not, see . */ #ifndef SOURCEMANAGER_HH #define SOURCEMANAGER_HH #include "common.hh" struct Source { Source(const Glib::RefPtr& _file, const std::string& _displayname, const Glib::RefPtr& _monitor, bool _isTemp = false) : file(_file), displayname(_displayname), monitor(_monitor), isTemp(_isTemp) {} Glib::RefPtr file; std::string displayname; Glib::RefPtr monitor; bool isTemp; int brightness = 0; int contrast = 0; int resolution = -1; int page = 1; std::vector angle; bool invert = false; }; class SourceManager { public: SourceManager(); ~SourceManager(); void addSources(const std::vector>& files); std::vector getSelectedSources() const; sigc::signal signal_sourceChanged() { return m_signal_sourceChanged; } private: class ListViewColumns : public Gtk::TreeModel::ColumnRecord { public: Gtk::TreeModelColumn filename; Gtk::TreeModelColumn source; Gtk::TreeModelColumn path; ListViewColumns() { add(filename); add(source); add(path); } }; Gtk::Notebook* m_notebook; Gtk::TreeView* m_listView; Gtk::Button* m_addButton; Gtk::MenuButton* m_addButtonMenu; Gtk::Button* m_removeButton; Gtk::Button* m_deleteButton; Gtk::Button* m_clearButton; Gtk::MenuItem* m_pasteItem; Glib::RefPtr m_clipboard; ListViewColumns m_listViewCols; int m_screenshotCount = 0; int m_pasteCount = 0; sigc::signal m_signal_sourceChanged; sigc::connection m_connectionSelectionChanged; void clearSources(); void fileChanged(const Glib::RefPtr& file, const Glib::RefPtr& otherFile, Gio::FileMonitorEvent event, Gtk::TreeIter it); void openSources(); void pasteClipboard(); void removeSource(bool deleteFile); void savePixbuf(const Glib::RefPtr& pixbuf, const std::string& displayname); void selectionChanged(); void takeScreenshot(); }; #endif // SOURCEMANAGER_HH gImageReader-3.2.3/gtk/src/SubstitutionsManager.cc000066400000000000000000000201011312567024200221040ustar00rootroot00000000000000/* -*- Mode: C++; indent-tabs-mode: t; c-basic-offset: 4; tab-width: 4 -*- */ /* * SubstitutionsManager.cc * Copyright (C) 2013-2017 Sandro Mani * * gImageReader 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. * * gImageReader 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 this program. If not, see . */ #include "SubstitutionsManager.hh" #include "MainWindow.hh" #include "Config.hh" #include "ConfigSettings.hh" #include "FileDialogs.hh" #include "OutputBuffer.hh" #include "Utils.hh" #include SubstitutionsManager::SubstitutionsManager(const Builder& builder, const Glib::RefPtr& buffer) : m_buffer(buffer) { m_dialog = builder("window:postproc"); m_listView = builder("treeview:postproc"); m_removeButton = builder("toolbutton:postproc.remove"); m_csCheckBox = builder("checkbutton:output.matchcase"); m_listStore = Gtk::ListStore::create(m_viewCols); m_listView->set_model(m_listStore); m_listView->append_column_editable(_("Search for"), m_viewCols.search); m_listView->append_column_editable(_("Replace with"), m_viewCols.replace); m_listView->get_column(0)->set_sizing(Gtk::TREE_VIEW_COLUMN_FIXED); m_listView->get_column(1)->set_sizing(Gtk::TREE_VIEW_COLUMN_FIXED); m_listView->get_column(0)->set_expand(true); m_listView->get_column(1)->set_expand(true); m_listView->set_fixed_height_mode(); CONNECT(builder("toolbutton:postproc.open").as(), clicked, [this] { openList(); }); CONNECT(builder("toolbutton:postproc.save").as(), clicked, [this] { saveList(); }); CONNECT(builder("toolbutton:postproc.clear").as(), clicked, [this] { clearList(); }); CONNECT(builder("toolbutton:postproc.add").as(), clicked, [this] { addRow(); }); CONNECT(builder("button:postproc.apply").as(), clicked, [this] { applySubstitutions(); }); CONNECT(builder("button:postproc.close").as(), clicked, [this] { m_dialog->hide(); }); CONNECT(m_removeButton, clicked, [this] { removeRows(); }); CONNECT(m_listView->get_selection(), changed, [this] { m_removeButton->set_sensitive(m_listView->get_selection()->count_selected_rows() != 0); }); CONNECT(m_dialog, hide, [this] { dialogClosed(); }); MAIN->getConfig()->addSetting(new ListStoreSetting("replacelist", Glib::RefPtr::cast_static(m_listView->get_model()))); MAIN->getConfig()->addSetting(new VarSetting("replacelistfile")); m_currentFile = MAIN->getConfig()->getSetting>("replacelistfile")->getValue(); if(m_currentFile.empty()) { m_currentFile = Glib::build_filename(Utils::get_documents_dir(), _("substitution_list.txt")); MAIN->getConfig()->getSetting>("replacelistfile")->setValue(m_currentFile); } } SubstitutionsManager::~SubstitutionsManager() { MAIN->getConfig()->removeSetting("replacelist"); MAIN->getConfig()->removeSetting("replacelistfile"); } void SubstitutionsManager::set_visible(bool visible) { m_dialog->set_visible(visible); if(visible && m_dialog->is_visible()) { m_dialog->raise(); } } void SubstitutionsManager::openList() { if(!clearList()) { return; } std::string dir = Glib::path_get_dirname(m_currentFile); FileDialogs::FileFilter filter = { _("Substitutions List"), {"text/plain"}, {"*.txt"}}; std::vector> files = FileDialogs::open_dialog(_("Open Substitutions List"), dir, filter, false, m_dialog); if(!files.empty()) { std::ifstream file(files.front()->get_path()); if(!file.is_open()) { Utils::message_dialog(Gtk::MESSAGE_ERROR, _("Error Reading File"), Glib::ustring::compose(_("Unable to read '%1'."), files.front()->get_path())); return; } m_currentFile = files.front()->get_path(); MAIN->getConfig()->getSetting>("replacelistfile")->setValue(m_currentFile); std::string line; bool errors = false; while(std::getline(file, line)) { Glib::ustring text = line.data(); if(text.empty()) { continue; } std::vector fields = Utils::string_split(text, '\t', true); if(fields.size() < 2) { errors = true; continue; } Gtk::TreeIter it = m_listStore->append(); (*it)[m_viewCols.search] = fields[0]; (*it)[m_viewCols.replace] = fields[1]; } if(errors) { Utils::message_dialog(Gtk::MESSAGE_WARNING, _("Errors Occurred Reading File"), _("Some entries of the substitutions list could not be read.")); } } } bool SubstitutionsManager::saveList() { FileDialogs::FileFilter filter = { _("Substitutions List"), {"text/plain"}, {"*.txt"} }; std::string filename = FileDialogs::save_dialog(_("Save Substitutions List"), m_currentFile, filter, m_dialog); if(filename.empty()) { return false; } std::ofstream file(filename); if(!file.is_open()) { Utils::message_dialog(Gtk::MESSAGE_ERROR, _("Error Saving File"), Glib::ustring::compose(_("Unable to write to '%1'."), filename)); return false; } m_currentFile = filename; MAIN->getConfig()->getSetting>("replacelistfile")->setValue(m_currentFile); Glib::ustring str; for(const Gtk::TreeModel::Row& row : m_listStore->children()) { Glib::ustring search, replace; row.get_value(0, search); row.get_value(1, replace); str += Glib::ustring::compose("%1\t%2\n", search, replace); } file.write(str.data(), str.bytes()); return true; } bool SubstitutionsManager::clearList() { if(m_listStore->children().size() > 0) { int response = Utils::question_dialog(_("Save List?"), _("Do you want to save the current list?"), Utils::Button::Save|Utils::Button::Discard|Utils::Button::Cancel, m_dialog); if(response == Utils::Button::Save) { if(!saveList()) { return false; } } else if(response != Utils::Button::Discard) { return false; } } m_listStore->clear(); return true; } void SubstitutionsManager::addRow() { Gtk::TreeIter it = m_listStore->append(); m_listView->set_cursor(m_listStore->get_path(it), *m_listView->get_column(0), true); } void SubstitutionsManager::removeRows() { if(m_listView->get_selection()->count_selected_rows() != 0) { std::vector rows; for(const Gtk::ListStore::TreeModel::Path& path : m_listView->get_selection()->get_selected_rows()) { rows.push_back(Gtk::ListStore::RowReference(m_listStore, path)); } for(const Gtk::ListStore::RowReference& row : rows) { m_listStore->erase(m_listStore->get_iter(row.get_path())); } } } void SubstitutionsManager::dialogClosed() { MAIN->getConfig()->getSetting("replacelist")->serialize(); } void SubstitutionsManager::applySubstitutions() { MAIN->pushState(MainWindow::State::Busy, _("Applying substitutions...")); Gtk::TextIter start, end; m_buffer->get_region_bounds(start, end); int startpos = start.get_offset(); int endpos = end.get_offset(); Gtk::TextSearchFlags flags = Gtk::TEXT_SEARCH_VISIBLE_ONLY|Gtk::TEXT_SEARCH_TEXT_ONLY; if(!m_csCheckBox->get_active()) { flags |= Gtk::TEXT_SEARCH_CASE_INSENSITIVE; } for(const Gtk::TreeModel::Row& row : m_listStore->children()) { Glib::ustring search, replace; row.get_value(0, search); row.get_value(1, replace); int diff = replace.length() - search.length(); Gtk::TextIter it = m_buffer->get_iter_at_offset(startpos); while(true) { Gtk::TextIter matchStart, matchEnd; if(!it.forward_search(search, flags, matchStart, matchEnd) || matchEnd.get_offset() > endpos) { break; } it = m_buffer->insert(m_buffer->erase(matchStart, matchEnd), replace); endpos += diff; } while(Gtk::Main::events_pending()) { Gtk::Main::iteration(); } } m_buffer->select_range(m_buffer->get_iter_at_offset(startpos), m_buffer->get_iter_at_offset(endpos)); MAIN->popState(); } gImageReader-3.2.3/gtk/src/SubstitutionsManager.hh000066400000000000000000000034011312567024200221220ustar00rootroot00000000000000/* -*- Mode: C++; indent-tabs-mode: t; c-basic-offset: 4; tab-width: 4 -*- */ /* * SubstitutionsManager.hh * Copyright (C) 2013-2017 Sandro Mani * * gImageReader 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. * * gImageReader 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 this program. If not, see . */ #ifndef SUBSTITUTIONS_MANAGER_HH #define SUBSTITUTIONS_MANAGER_HH #include "common.hh" class OutputBuffer; class SubstitutionsManager { public: SubstitutionsManager(const Builder& builder, const Glib::RefPtr& buffer); ~SubstitutionsManager(); void set_visible(bool visible); private: struct ReplaceListColumns : public Gtk::TreeModel::ColumnRecord { Gtk::TreeModelColumn search; Gtk::TreeModelColumn replace; ReplaceListColumns() { add(search); add(replace); } }; std::string m_currentFile; ReplaceListColumns m_viewCols; Gtk::Window* m_dialog; Gtk::TreeView* m_listView; Gtk::Button* m_removeButton; Glib::RefPtr m_listStore; Glib::RefPtr m_buffer; Gtk::CheckButton* m_csCheckBox; void addRow(); void applySubstitutions(); bool clearList(); void dialogClosed(); void openList(); void removeRows(); bool saveList(); }; #endif // SUBSTITUTIONS_MANAGER_HH gImageReader-3.2.3/gtk/src/TessdataManager.cc000066400000000000000000000272421312567024200207720ustar00rootroot00000000000000/* -*- Mode: C++; indent-tabs-mode: t; c-basic-offset: 4; tab-width: 4 -*- */ /* * TessdataManager.hh * Copyright (C) 2013-2017 Sandro Mani * * gImageReader 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. * * gImageReader 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 this program. If not, see . */ #include "Config.hh" #include "MainWindow.hh" #include "Recognizer.hh" #include "TessdataManager.hh" #include "Utils.hh" #include #include #ifdef G_OS_UNIX #include #endif #include void TessdataManager::exec() { static TessdataManager instance; instance.run(); } TessdataManager::TessdataManager() { m_dialog = MAIN->getWidget("dialog:tessdatamanager"); m_languageList = MAIN->getWidget("treeview:tessdatamanager"); m_languageListStore = Gtk::ListStore::create(m_viewCols); m_languageList->set_model(m_languageListStore); m_languageList->append_column_editable("selected", m_viewCols.selected); m_languageList->append_column("label", m_viewCols.label); } void TessdataManager::run() { #ifdef G_OS_UNIX if(MAIN->getConfig()->useSystemDataLocations()) { Glib::ustring service_owner; try { m_dbusProxy = Gio::DBus::Proxy::create_for_bus_sync(Gio::DBus::BUS_TYPE_SESSION, "org.freedesktop.PackageKit", "/org/freedesktop/PackageKit", "org.freedesktop.PackageKit.Modify"); service_owner = m_dbusProxy->get_name_owner(); } catch(...) { } if(service_owner.empty()) { Utils::message_dialog(Gtk::MESSAGE_ERROR, _("Error"), _("PackageKit is required for managing system-wide tesseract language packs, but it was not found. Please use the system package management software to manage the tesseract language packs, or switch to use the user tessdata path in the configuration dialog.")); return; } } #endif MAIN->pushState(MainWindow::State::Busy, _("Fetching available languages")); Glib::ustring messages; bool success = fetchLanguageList(messages); MAIN->popState(); if(!success) { Utils::message_dialog(Gtk::MESSAGE_ERROR,_("Error"), Glib::ustring::compose(_("Failed to fetch list of available languages: %1"), messages)); return; } while(true) { int response = m_dialog->run(); if(response == Gtk::RESPONSE_APPLY) { applyChanges(); } else if(response == 1) { refresh(); } else { break; } } m_dialog->hide(); } bool TessdataManager::fetchLanguageList(Glib::ustring& messages) { m_languageListStore->clear(); Glib::RefPtr data = Utils::download("https://api.github.com/repos/tesseract-ocr/tessdata/tags", messages); if(!data) { messages = Glib::ustring::compose(_("Failed to fetch list of available languages: %1"), messages); return false; } Glib::ustring tessdataVer; Glib::ustring tessVer(TESSERACT_VERSION_STR); JsonParser* parser = json_parser_new(); GError* parserError = nullptr; json_parser_load_from_data(parser, reinterpret_cast(data->get_data()), data->size(), &parserError); if(parserError) { messages = Glib::ustring::compose(_("Parsing error: %1"), parserError->message); g_object_unref(parser); return false; } JsonNode* root = json_parser_get_root(parser); JsonArray* array = json_node_get_array(root); GList* elementArray = json_array_get_elements(array); for(GList* l = elementArray; l; l = l->next) { JsonNode* value = static_cast(l->data); JsonObject* tagObj = json_node_get_object(value); Glib::ustring tag = json_object_get_string_member(tagObj, "name"); if(tag <= tessVer && tag > tessdataVer) { tessdataVer = tag; } } g_list_free(elementArray); g_object_unref(parser); data = Utils::download("https://api.github.com/repos/tesseract-ocr/tessdata/contents?ref=" + tessdataVer, messages); if(!data) { messages = Glib::ustring::compose(_("Failed to fetch list of available languages: %1"), messages); return false; } parser = json_parser_new(); parserError = nullptr; json_parser_load_from_data(parser, reinterpret_cast(data->get_data()), data->size(), &parserError); if(parserError) { messages = Glib::ustring::compose(_("Parsing error: %1"), parserError->message); g_object_unref(parser); return false; } std::vector> extraFiles; root = json_parser_get_root(parser); array = json_node_get_array(root); elementArray = json_array_get_elements(array); for(GList* l = elementArray; l; l = l->next) { JsonNode* value = static_cast(l->data); JsonObject* treeObj = json_node_get_object(value); Glib::ustring name = json_object_get_string_member(treeObj, "name"); Glib::ustring url = json_object_get_string_member(treeObj, "download_url"); if(name.length() > 12 && name.compare(name.length() - 12, name.npos, "traineddata")) { Glib::ustring key = name.substr(0, name.find(".")); auto it = m_languageFiles.find(key); if(it == m_languageFiles.end()) { it = m_languageFiles.insert(std::make_pair(key, std::vector())).first; } it->second.push_back({name, url}); } else { // Delay decision to determine whether file is a supplementary language file extraFiles.push_back(std::make_pair(name, url)); } } g_list_free(elementArray); g_object_unref(parser); for(const std::pair& extraFile : extraFiles) { Glib::ustring lang = extraFile.first.substr(0, extraFile.first.find(".")); auto it = m_languageFiles.find(lang); if(it != m_languageFiles.end()) { it->second.push_back({extraFile.first,extraFile.second}); } } std::vector availableLanguages = MAIN->getRecognizer()->getAvailableLanguages(); std::vector languages; for(auto it : m_languageFiles) { languages.push_back(it.first); } std::sort(languages.begin(), languages.end()); for(const Glib::ustring& prefix : languages) { Config::Lang lang; lang.prefix = prefix; Glib::ustring label; if(MAIN->getConfig()->searchLangSpec(lang)) { label = Glib::ustring::compose("%1 (%2)", lang.name, lang.prefix); } else { label = lang.prefix; } Gtk::TreeIter it = m_languageListStore->append(); bool installed = std::find(availableLanguages.begin(), availableLanguages.end(), prefix) != availableLanguages.end(); (*it)[m_viewCols.selected] = installed; (*it)[m_viewCols.label] = label; (*it)[m_viewCols.prefix] = prefix; } return true; } void TessdataManager::applyChanges() { MAIN->pushState(MainWindow::State::Busy, _("Applying changes...")); m_dialog->set_sensitive(false); m_dialog->get_window()->set_cursor(Gdk::Cursor::create(Gdk::WATCH)); Glib::ustring errorMsg; std::vector availableLanguages = MAIN->getRecognizer()->getAvailableLanguages(); std::string tessDataPath = MAIN->getConfig()->tessdataLocation(); #ifdef G_OS_WIN32 bool isWindows = true; #else bool isWindows = false; #endif if(!isWindows && MAIN->getConfig()->useSystemDataLocations()) { // Place this in a ifdef since DBus stuff cannot be compiled on Windows #ifdef G_OS_UNIX std::vector installFiles; std::vector removeFiles; for(const Gtk::TreeModel::Row& row : m_languageListStore->children()) { Glib::ustring prefix = row.get_value(m_viewCols.prefix); bool selected = row.get_value(m_viewCols.selected); bool installed = std::find(availableLanguages.begin(), availableLanguages.end(), prefix) != availableLanguages.end(); if(selected && !installed) { installFiles.push_back(Glib::build_filename(tessDataPath, prefix + ".traineddata")); } else if(!selected && installed) { removeFiles.push_back(Glib::build_filename(tessDataPath, prefix + ".traineddata")); } } std::uint32_t xid = gdk_x11_window_get_xid(m_dialog->get_window()->gobj()); if(!installFiles.empty()) { std::vector params = { Glib::Variant::create(xid), Glib::Variant>::create(installFiles), Glib::Variant::create("always") }; try { m_dbusProxy->call_sync("InstallProvideFiles", Glib::VariantContainerBase::create_tuple(params), 3600000); } catch(const Glib::Error& e) { errorMsg = e.what(); } } if(errorMsg.empty() && !removeFiles.empty()) { std::vector params = { Glib::Variant::create(xid), Glib::Variant>::create(removeFiles), Glib::Variant::create("always") }; try { m_dbusProxy->call_sync("RemovePackageByFiles", Glib::VariantContainerBase::create_tuple(params), 3600000); } catch(const Glib::Error& e) { errorMsg = e.what(); } } #endif } else { Glib::ustring errors; Glib::RefPtr tessDataDir = Gio::File::create_for_path(tessDataPath); bool dirExists = false; try { dirExists = tessDataDir->make_directory_with_parents(); } catch(...) { dirExists = tessDataDir->query_exists(); } if(!dirExists) { errors.append(Glib::ustring(_("Failed to create directory for tessdata files.")) + "\n"); } else { for(const Gtk::TreeModel::Row& row : m_languageListStore->children()) { Glib::ustring prefix = row.get_value(m_viewCols.prefix); bool selected = row.get_value(m_viewCols.selected); auto it = m_languageFiles.find(prefix); bool installed = std::find(availableLanguages.begin(), availableLanguages.end(), prefix) != availableLanguages.end(); if(selected && !installed) { for(const LangFile& langFile : it->second) { MAIN->pushState(MainWindow::State::Busy, Glib::ustring::compose(_("Downloading %1..."), langFile.name)); Glib::ustring messages; Glib::RefPtr data = Utils::download(langFile.url, messages); std::ofstream file(Glib::build_filename(tessDataPath, langFile.name)); if(!data || !file.is_open()) { errors.append(langFile.name + "\n"); } else { file.write(reinterpret_cast(data->get_data()), data->size()); } MAIN->popState(); } } else if(!selected && installed) { for(const std::string& file : Glib::Dir(tessDataPath)) { if(file.size() > 4 && file.compare(0, 4, prefix + ".") == 0) { Gio::File::create_for_path(Glib::build_filename(tessDataPath, file))->remove(); } } } } if(!errors.empty()) { errorMsg = Glib::ustring::compose(_("The following files could not be downloaded or removed:\n%1\n\nCheck the connectivity and directory permissions."), errors); } } } m_dialog->get_window()->set_cursor(Glib::RefPtr()); m_dialog->set_sensitive(true); MAIN->popState(); refresh(); if(!errorMsg.empty()) { Utils::message_dialog(Gtk::MESSAGE_ERROR, _("Error"), errorMsg, m_dialog); } } void TessdataManager::refresh() { MAIN->getRecognizer()->updateLanguagesMenu(); std::vector availableLanguages = MAIN->getRecognizer()->getAvailableLanguages(); for(const Gtk::TreeModel::Row& row : m_languageListStore->children()) { Glib::ustring prefix = row.get_value(m_viewCols.prefix); bool installed = std::find(availableLanguages.begin(), availableLanguages.end(), prefix) != availableLanguages.end(); row.set_value(m_viewCols.selected, installed); } } gImageReader-3.2.3/gtk/src/TessdataManager.hh000066400000000000000000000032111312567024200207720ustar00rootroot00000000000000/* -*- Mode: C++; indent-tabs-mode: t; c-basic-offset: 4; tab-width: 4 -*- */ /* * TessdataManager.hh * Copyright (C) 2013-2017 Sandro Mani * * gImageReader 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. * * gImageReader 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 this program. If not, see . */ #ifndef TESSDATAMANAGER_HH #define TESSDATAMANAGER_HH #include class TessdataManager { public: static void exec(); private: TessdataManager(); void run(); struct LangFile { Glib::ustring name; Glib::ustring url; }; struct ViewColumns : public Gtk::TreeModel::ColumnRecord { Gtk::TreeModelColumn selected; Gtk::TreeModelColumn label; Gtk::TreeModelColumn prefix; ViewColumns() { add(selected); add(label); add(prefix); } } m_viewCols; Gtk::Dialog* m_dialog; Gtk::TreeView* m_languageList; Glib::RefPtr m_languageListStore; std::map> m_languageFiles; Glib::RefPtr m_dbusProxy; bool fetchLanguageList(Glib::ustring& messages); void applyChanges(); void refresh(); }; #endif // TESSDATAMANAGER_HH gImageReader-3.2.3/gtk/src/Utils.cc000066400000000000000000000265721312567024200170340ustar00rootroot00000000000000/* -*- Mode: C++; indent-tabs-mode: t; c-basic-offset: 4; tab-width: 4 -*- */ /* * Utils.cc * Copyright (C) 2013-2017 Sandro Mani * * gImageReader 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. * * gImageReader 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 this program. If not, see . */ #include "Utils.hh" #include "Config.hh" #include "MainWindow.hh" #include "SourceManager.hh" #include #include #include void Utils::popup_positioner(int& x, int& y, bool& push_in, Gtk::Widget* ref, Gtk::Menu* menu, bool alignRight, bool alignBottom) { ref->get_window()->get_origin(x, y); x += ref->get_allocation().get_x(); if(alignRight) { x += ref->get_allocation().get_width(); x -= menu->get_width(); } y += ref->get_allocation().get_y(); if(alignBottom) { y += ref->get_allocation().get_height(); } push_in = true; } void Utils::message_dialog(Gtk::MessageType message, const Glib::ustring &title, const Glib::ustring &text, Gtk::Window *parent) { if(!parent) { parent = MAIN->getWindow(); } Gtk::MessageDialog dialog(*parent, title, false, message, Gtk::BUTTONS_OK, true); dialog.set_secondary_text(text); dialog.run(); } Utils::Button::Type Utils::question_dialog(const Glib::ustring &title, const Glib::ustring &text, int buttons, Gtk::Window *parent) { if(!parent) { parent = MAIN->getWindow(); } Gtk::MessageDialog dialog(*parent, title, false, Gtk::MESSAGE_QUESTION, Gtk::BUTTONS_NONE, true); dialog.set_position(Gtk::WIN_POS_CENTER_ON_PARENT); if((buttons & Button::Ok) != 0) { dialog.add_button(_("OK"), Button::Type::Ok); } if((buttons & Button::Yes) != 0) { dialog.add_button(_("Yes"), Button::Type::Yes); } if((buttons & Button::No) != 0) { dialog.add_button(_("No"), Button::Type::No); } if((buttons & Button::Cancel) != 0) { dialog.add_button(_("Cancel"), Button::Type::Cancel); } if((buttons & Button::Save) != 0) { dialog.add_button(_("Save"), Button::Type::Save); } if((buttons & Button::Discard) != 0) { dialog.add_button(_("Discard"), Button::Type::Discard); } dialog.set_secondary_text(text); return static_cast(dialog.run()); } void Utils::set_spin_blocked(Gtk::SpinButton *spin, double value, sigc::connection &conn) { conn.block(true); spin->set_value(value); conn.block(false); } static Glib::RefPtr createErrorStyleProvider() { Glib::RefPtr provider = Gtk::CssProvider::create(); provider->load_from_data("GtkEntry { background: #FF7777; color: #FFFFFF; }"); return provider; } static Glib::RefPtr getErrorStyleProvider() { static Glib::RefPtr provider = createErrorStyleProvider(); return provider; } void Utils::set_error_state(Gtk::Entry *entry) { entry->get_style_context()->add_provider(getErrorStyleProvider(), GTK_STYLE_PROVIDER_PRIORITY_APPLICATION); } void Utils::clear_error_state(Gtk::Entry *entry) { entry->get_style_context()->remove_provider(getErrorStyleProvider()); } Glib::ustring Utils::get_content_type(const std::string &filename) { gboolean uncertain; gchar* type = g_content_type_guess(filename.c_str(), 0, 0, &uncertain); Glib::ustring contenttype(type); g_free(type); return contenttype; } void Utils::get_filename_parts(const std::string& filename, std::string& base, std::string& ext) { std::string::size_type pos = filename.rfind('.'); if(pos == std::string::npos) { base = filename; ext = ""; return; } base = filename.substr(0, pos); ext = filename.substr(pos + 1); if(base.size() > 3 && base.substr(pos - 4) == ".tar") { base = base.substr(0, pos - 4); ext = "tar." + ext; } } std::string Utils::make_absolute_path(const std::string& path) { if(Glib::path_is_absolute(path)) { return path; } return Glib::build_path("/", std::vector {Glib::get_current_dir(), path}); } std::string Utils::get_documents_dir() { std::string dir = Glib::get_user_special_dir(G_USER_DIRECTORY_DOCUMENTS); if(Glib::file_test(dir, Glib::FILE_TEST_IS_DIR)) { return dir; } return Glib::get_home_dir(); } std::string Utils::make_output_filename(const std::string& filename) { // Ensure directory exists std::string dirname = Glib::path_get_dirname(filename); std::string basename = Glib::path_get_basename(filename); if(!Glib::file_test(dirname, Glib::FILE_TEST_IS_DIR)) { dirname = get_documents_dir(); } std::string newfilename = Glib::build_filename(dirname, basename); // Generate non-existing file int i = 0; std::string base, ext; Utils::get_filename_parts(newfilename, base, ext); base = Glib::Regex::create("_[0-9]+$")->replace(base, 0, "", static_cast(0)); newfilename = Glib::ustring::compose("%1.%2", base, ext); while(Glib::file_test(newfilename, Glib::FILE_TEST_EXISTS)) { newfilename = Glib::ustring::compose("%1_%2.%3", base, ++i, ext); } return newfilename; } std::vector Utils::string_split(const Glib::ustring &text, char delim, bool keepEmpty) { std::vector parts; Glib::ustring::size_type startPos = 0, endPos = 0; Glib::ustring::size_type npos = Glib::ustring::npos; while(true) { startPos = endPos; endPos = text.find(delim, startPos); Glib::ustring::size_type n = endPos == npos ? npos : endPos - startPos; if(n > 0 || keepEmpty) { parts.push_back(text.substr(startPos, n)); } if(endPos == npos) break; ++endPos; } return parts; } Glib::ustring Utils::string_join(const std::vector& strings, const Glib::ustring& joiner ) { Glib::ustring result; if(!strings.empty()) { result = strings.front(); for(std::size_t i = 1, n = strings.size(); i < n; ++i) { result += joiner + strings[i]; } } return result; } Glib::ustring Utils::string_trim(const Glib::ustring &str) { Glib::ustring ret = str; ret.erase(0, ret.find_first_not_of(' ')); std::size_t rpos = ret.find_last_not_of(' '); if(rpos != Glib::ustring::npos) { ret.erase(rpos + 1); } return ret; } void Utils::handle_drag_drop(const Glib::RefPtr &context, int /*x*/, int /*y*/, const Gtk::SelectionData &selection_data, guint /*info*/, guint time) { if ((selection_data.get_length() >= 0) && (selection_data.get_format() == 8)) { std::vector> files; for(const Glib::ustring& uri : selection_data.get_uris()) { files.push_back(Gio::File::create_for_uri(uri)); } if(!files.empty()) { MAIN->getSourceManager()->addSources(files); } } context->drag_finish(false, false, time); } Glib::RefPtr Utils::download(const std::string &url, Glib::ustring& messages, unsigned timeout) { enum Status { Waiting, Ready, Failed, Eos } status = Waiting; Glib::RefPtr result = Glib::ByteArray::create(); Glib::RefPtr stream; Glib::RefPtr cancellable = Gio::Cancellable::create(); sigc::connection timeoutConnection; try { Glib::RefPtr file = Gio::File::create_for_uri(url); file->read_async([&](Glib::RefPtr& asyncResult) { try { stream = file->read_finish(asyncResult); status = stream ? Ready : Failed; } catch(Glib::Error&) { status = Failed; } }, cancellable); timeoutConnection = Glib::signal_timeout().connect([&] { cancellable->cancel(); return false; }, timeout); while(status == Waiting) { Gtk::Main::iteration(); } timeoutConnection.disconnect(); if(status == Failed) { return Glib::RefPtr(); } while(true) { status = Waiting; stream->read_bytes_async(4096, [&](Glib::RefPtr& asyncResult) { try { Glib::RefPtr bytes = stream->read_bytes_finish(asyncResult); if(!bytes) { status = Eos; } gsize size; result->append(reinterpret_cast(bytes->get_data(size)), bytes->get_size()); status = size == 0 ? Eos : Ready; } catch(Glib::Error&) { status = Failed; } }, cancellable); timeoutConnection = Glib::signal_timeout().connect([&] { cancellable->cancel(); return false; }, timeout); while(status == Waiting) { Gtk::Main::iteration(); } timeoutConnection.disconnect(); if(status == Failed) { return Glib::RefPtr(); } else if(status == Eos) { break; } } } catch (const Glib::Error& e) { messages = e.what(); return Glib::RefPtr(); } return result; } Glib::ustring Utils::getSpellingLanguage(const Glib::ustring& lang) { // Look in the lang cultures table if a language hint is provided Config::Lang langspec = {lang}; if(!lang.empty() && MAIN->getConfig()->searchLangSpec(langspec)) { std::vector langCultures = MAIN->getConfig()->searchLangCultures(langspec.code); if(!langCultures.empty()) { return langCultures.front(); } } // Use the application locale, if specified, otherwise fall back to en Glib::ustring syslocale = g_getenv ("LANG"); if(syslocale == "c" || syslocale == "C" || syslocale.empty()) { return "en_US"; } return syslocale; } Glib::ustring Utils::resolveFontName(const Glib::ustring& family) { Glib::ustring resolvedName = family; FcPattern *pat = FcNameParse(reinterpret_cast(family.c_str())); FcConfigSubstitute (0, pat, FcMatchPattern); FcFontSet *fs = FcFontSetCreate(); FcResult result; FcPattern *match = FcFontMatch (0, pat, &result); if (match) FcFontSetAdd (fs, match); FcPatternDestroy (pat); FcObjectSet *os = 0; if(fs->nfont > 0) { FcPattern *font = FcPatternFilter (fs->fonts[0], os); FcChar8 *s = FcPatternFormat (font, reinterpret_cast("%{family}")); resolvedName = Glib::ustring(reinterpret_cast(s)); FcStrFree (s); FcPatternDestroy (font); } FcFontSetDestroy (fs); if (os) FcObjectSetDestroy (os); return resolvedName; } void Utils::openUri(const std::string& uri) { #ifdef G_OS_WIN32 ShellExecute(nullptr, "open", uri.c_str(), nullptr, nullptr, SW_SHOWNORMAL); #else gtk_show_uri(nullptr, uri.c_str(), GDK_CURRENT_TIME, 0); #endif } bool Utils::busyTask(const std::function &f, const Glib::ustring &msg) { enum class TaskState { Waiting, Succeeded, Failed }; TaskState taskState = TaskState::Waiting; Glib::Threads::Mutex mutex; MAIN->pushState(MainWindow::State::Busy, msg); Glib::Threads::Thread* thread = Glib::Threads::Thread::create([&] { bool success = f(); mutex.lock(); taskState = success ? TaskState::Succeeded : TaskState::Failed; mutex.unlock(); }); mutex.lock(); while(taskState == TaskState::Waiting) { mutex.unlock(); Gtk::Main::iteration(false); mutex.lock(); } mutex.unlock(); thread->join(); MAIN->popState(); return taskState == TaskState::Succeeded; } void Utils::runInMainThreadBlocking(const std::function& f) { Glib::Threads::Mutex mutex; Glib::Threads::Cond cond; bool finished = false; Glib::signal_idle().connect_once([&] { f(); mutex.lock(); finished = true; cond.signal(); mutex.unlock(); }); mutex.lock(); while(!finished) { cond.wait(mutex); } mutex.unlock(); } gImageReader-3.2.3/gtk/src/Utils.hh000066400000000000000000000075441312567024200170440ustar00rootroot00000000000000/* -*- Mode: C++; indent-tabs-mode: t; c-basic-offset: 4; tab-width: 4 -*- */ /* * Utils.hh * Copyright (C) 2013-2017 Sandro Mani * * gImageReader 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. * * gImageReader 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 this program. If not, see . */ #ifndef UTILS_HH #define UTILS_HH #include #include #include #include #include namespace tesseract { class TessBaseAPI; } namespace Utils { void popup_positioner(int& x, int& y, bool& push_in, Gtk::Widget* ref, Gtk::Menu* menu, bool alignRight, bool alignBottom); void message_dialog(Gtk::MessageType message, const Glib::ustring& title, const Glib::ustring& text, Gtk::Window* parent = 0); struct Button { enum Type { Ok = 1, Yes = 2, No = 4, Cancel = 8, Save = 16, Discard = 32 }; }; Button::Type question_dialog(const Glib::ustring& title, const Glib::ustring& text, int buttons, Gtk::Window *parent = 0); void set_spin_blocked(Gtk::SpinButton* spin, double value, sigc::connection& conn); void set_error_state(Gtk::Entry* entry); void clear_error_state(Gtk::Entry* entry); Glib::ustring get_content_type(const std::string& filename); void get_filename_parts(const std::string& filename, std::string& base, std::string& ext); std::string make_absolute_path(const std::string& path); std::string get_documents_dir(); std::string make_output_filename(const std::string& filename); std::vector string_split(const Glib::ustring& text, char delim, bool keepEmpty = true); Glib::ustring string_join(const std::vector& strings, const Glib::ustring& joiner); Glib::ustring string_trim(const Glib::ustring& str); void handle_drag_drop(const Glib::RefPtr& context, int x, int y, const Gtk::SelectionData& selection_data, guint info, guint time); Glib::RefPtr download(const std::string& url, Glib::ustring& messages, unsigned timeout = 60000); Glib::ustring getSpellingLanguage(const Glib::ustring& lang = Glib::ustring()); Glib::ustring resolveFontName(const Glib::ustring& family); void openUri(const std::string& uri); template::value>::type> T round(T x) { return std::floor(x + T(0.5)); } template struct rev_iters { It _begin, _end; It begin() { return _begin; } It end() { return _end; } }; template> rev_iters reverse(T& t) { return { t.rbegin(), t.rend() }; } template> rev_iters reverse(const T& t) { return { t.crbegin(), t.crend() }; } bool busyTask(const std::function& f, const Glib::ustring& msg); void runInMainThreadBlocking(const std::function& f); template> class AsyncQueue { std::queue queue_; Glib::Mutex mutex_; Glib::Cond cond_; public: bool empty() { Glib::Mutex::Lock queue_guard(mutex_); return queue_.empty(); } void enqueue(const T& item) { Glib::Mutex::Lock queue_guard(mutex_); queue_.push(item); cond_.signal(); } T dequeue() { Glib::Mutex::Lock queue_guard(mutex_); if(queue_.empty()) { while ( queue_.empty() ) cond_.wait(mutex_); } T result(queue_.front()); queue_.pop(); return result; } }; } #endif gImageReader-3.2.3/gtk/src/common.hh000066400000000000000000000061151312567024200172250ustar00rootroot00000000000000/* -*- Mode: C++; indent-tabs-mode: t; c-basic-offset: 4; tab-width: 4 -*- */ /* * common.hh * Copyright (C) 2013-2017 Sandro Mani * * gImageReader 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. * * gImageReader 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 this program. If not, see . */ #ifndef COMMON_HH #define COMMON_HH #include #include #include #include namespace sigc { #ifndef SIGC_FUNCTORS_DEDUCE_RESULT_TYPE_WITH_DECLTYPE #define SIGC_FUNCTORS_DEDUCE_RESULT_TYPE_WITH_DECLTYPE \ template \ struct functor_trait \ { \ typedef typename functor_trait::result_type result_type; \ typedef T_functor functor_type; \ }; #endif SIGC_FUNCTORS_DEDUCE_RESULT_TYPE_WITH_DECLTYPE } #define GTKMM_CHECK_VERSION(major,minor,micro) \ (GTKMM_MAJOR_VERSION > (major) || \ (GTKMM_MAJOR_VERSION == (major) && GTKMM_MINOR_VERSION > (minor)) || \ (GTKMM_MAJOR_VERSION == (major) && GTKMM_MINOR_VERSION == (minor) && \ GTKMM_MICRO_VERSION >= (micro))) #define CONNECT(src, signal, ...) (src)->signal_##signal().connect(__VA_ARGS__) #define CONNECTS(src, signal, ...) (src)->signal_##signal().connect(sigc::bind(__VA_ARGS__, src)) #define CONNECTP(src, property, ...) (src)->property_##property().signal_changed().connect(__VA_ARGS__) #define CONNECTPS(src, property, ...) {auto sender = src; sender->property_##property().signal_changed().connect(sigc::bind(__VA_ARGS__, sender)); } #define APPLICATION_ID "org.gnome.gimagereader" #ifndef M_PI #define M_PI 3.14159265358979323846 #endif class Builder { public: struct CastProxy { CastProxy(Gtk::Widget* widget) : m_widget(widget) {} template operator T*() { return static_cast(m_widget); } template T* as() { return static_cast(m_widget); } Gtk::Widget* operator->() { return m_widget; } Gtk::Widget* m_widget; }; Builder(const Glib::ustring& resourcePath) { m_builder = Gtk::Builder::create_from_resource(resourcePath); m_builder->set_translation_domain(GETTEXT_PACKAGE); } CastProxy operator()(const Glib::ustring& name) const { Gtk::Widget* widget; m_builder->get_widget(name, widget); return CastProxy(widget); } template void get_derived(const Glib::ustring& name, T*& p) { m_builder->get_widget_derived(name, p); } private: Glib::RefPtr m_builder; }; extern std::string pkgExePath; extern std::string pkgDir; #endif gImageReader-3.2.3/gtk/src/main.cc000066400000000000000000000071351312567024200166520ustar00rootroot00000000000000/* -*- Mode: C++; indent-tabs-mode: t; c-basic-offset: 4; tab-width: 4 -*- */ /* * main.cc * Copyright (C) 2013-2017 Sandro Mani * * gImageReader 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. * * gImageReader 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 this program. If not, see . */ #include #include #include #include #include #ifdef G_OS_WIN32 #include #endif #include "common.hh" #include "Application.hh" #include "Config.hh" #include "CrashHandler.hh" std::string pkgDir; std::string pkgExePath; static std::string get_application_dir(char* argv0) { #ifdef G_OS_WIN32 gchar* dir = g_win32_get_package_installation_directory_of_module(0); std::string pathstr = dir; g_free(dir); #else pid_t pid = getpid(); std::string exe = Glib::ustring::compose("/proc/%1/exe", pid); GError* err = nullptr; char* path = g_file_read_link(exe.c_str(), &err); std::string pathstr = Glib::build_filename(Glib::path_get_dirname(path), ".."); g_free(path); if(err) { if(Glib::path_is_absolute(argv0)) { pathstr = Glib::build_filename(Glib::path_get_dirname(argv0), ".."); } else { pathstr = Glib::build_filename(Glib::get_current_dir(), Glib::path_get_dirname(argv0), ".."); } } #endif return pathstr; } static std::string get_application_exec_path(char* argv0) { #ifdef G_OS_WIN32 char buf[MAX_PATH]; bool success = GetModuleFileName(0, buf, MAX_PATH) > 0; std::string pathstr = buf; #else pid_t pid = getpid(); std::string exe = Glib::ustring::compose("/proc/%1/exe", pid); GError* err = nullptr; char* path = g_file_read_link(exe.c_str(), &err); std::string pathstr = path; g_free(path); bool success = err == nullptr; #endif if(!success) { if(Glib::path_is_absolute(argv0)) { pathstr = Glib::path_get_dirname(argv0); } else { pathstr = Glib::build_filename(Glib::get_current_dir(), argv0); } } return pathstr; } int main (int argc, char *argv[]) { pkgDir = get_application_dir(argv[0]); pkgExePath = get_application_exec_path(argv[0]); #ifdef G_OS_WIN32 if(Glib::getenv("LANG").empty()) { gchar* locale = g_win32_getlocale(); Glib::setenv("LANG", locale); g_free(locale); } #endif std::string localeDir = Glib::build_filename(pkgDir, "share", "locale"); bindtextdomain(GETTEXT_PACKAGE, localeDir.c_str()); bind_textdomain_codeset(GETTEXT_PACKAGE, "UTF-8"); textdomain(GETTEXT_PACKAGE); if(argc > 2 && std::strcmp("crashhandle", argv[1]) == 0) { // Run the crash handler CrashHandler app(argc, argv); return app.run(); } else if(argc >= 2 && std::strcmp("tessdatadir", argv[1]) == 0) { Config::openTessdataDir(); return 0; } else if(argc >= 2 && std::strcmp("spellingdir", argv[1]) == 0) { Config::openSpellingDir(); return 0; } else { // Run the normal application #ifdef G_OS_WIN32 Glib::setenv("TWAINDSM_LOG", Glib::build_filename(pkgDir, "twain.log")); std::freopen(Glib::build_filename(pkgDir, "gimagereader.log").c_str(), "w", stderr); #endif GtkSpell::init(); Gsv::init(); Application app(argc, argv, APPLICATION_ID, Gio::APPLICATION_HANDLES_OPEN); return app.run(); } } gImageReader-3.2.3/gtk/src/scanner/000077500000000000000000000000001312567024200170425ustar00rootroot00000000000000gImageReader-3.2.3/gtk/src/scanner/ScannerSane.cc000066400000000000000000000636311312567024200215620ustar00rootroot00000000000000/* -*- Mode: C++; indent-tabs-mode: t; c-basic-offset: 4; tab-width: 4 -*- */ /* * ScannerSane.cc * Based on code from Simple Scan, which is: * Copyright (C) 2009-2013 Canonical Ltd. * Author: Robert Ancell * Modifications are: * Copyright (C) 2013-2017 Sandro Mani * * gImageReader 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. * * gImageReader 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 this program. If not, see . */ #include "ScannerSane.hh" #include #include void ScannerSane::init() { m_thread = Glib::Threads::Thread::create([this] { run(); }); } void ScannerSane::redetect() { m_requestQueue.enqueue({Request::Type::Redetect, 0}); } void ScannerSane::scan(const Params& params) { g_assert(params.depth == 8); // only 8 supported m_requestQueue.enqueue({Request::Type::StartScan, new ScanJob(params)}); } void ScannerSane::cancel() { m_requestQueue.enqueue({Request::Type::Cancel, 0}); } void ScannerSane::close() { m_requestQueue.enqueue({Request::Type::Quit, 0}); while(!m_finished) { if(Gtk::Main::events_pending()) Gtk::Main::iteration(); } m_thread->join(); m_thread = nullptr; } /***************************** Thread functions ******************************/ void ScannerSane::run() { // Initialize sane SANE_Int version_code; SANE_Status status = sane_init(&version_code, nullptr); g_debug("sane_init() -> %s", sane_strstatus(status)); if(status != SANE_STATUS_GOOD) { g_critical("Unable to initialize SANE backend: %s", sane_strstatus(status)); Utils::runInMainThreadBlocking([this] { m_signal_initFailed.emit(); }); return; } g_debug("SANE version %d.%d.%d", SANE_VERSION_MAJOR(version_code), SANE_VERSION_MINOR(version_code), SANE_VERSION_BUILD(version_code)); /* Scan for devices on first start */ doRedetect(); bool need_redetect = false; while(true) { // Fetch request if requests are pending or wait for request if idle if(!m_requestQueue.empty() || m_state == State::IDLE) { Request request = m_requestQueue.dequeue(); if(request.type == Request::Type::Redetect) { need_redetect = true; } else if(request.type == Request::Type::StartScan) { setState(State::OPEN); m_job = request.job; } else if(request.type == Request::Type::Cancel) { failScan(_("Scan canceled")); } else if(request.type == Request::Type::Quit) { doStop(); break; } } // Perform operations according to state if(m_state == State::IDLE) { if(need_redetect) { doRedetect(); need_redetect = false; } } else if(m_state == State::OPEN) { doOpen(); } else if(m_state == State::SET_OPTIONS) { doSetOptions(); } else if(m_state == State::START) { doStart(); } else if(m_state == State::GET_PARAMETERS) { doGetParameters(); } else if(m_state == State::READ) { doRead(); } } g_debug("sane_exit()"); // Commented to prevent crash, see https://bugs.launchpad.net/hplip/+bug/1315858 // sane_exit(); m_finished = true; } void ScannerSane::setState(State state) { m_state = state; Utils::runInMainThreadBlocking([this, state] { m_signal_scanStateChanged.emit(state); }); } void ScannerSane::failScan(const Glib::ustring& errorString) { doStop(); Utils::runInMainThreadBlocking([this, errorString] { m_signal_scanFailed.emit(errorString); }); } void ScannerSane::doRedetect() { std::vector devices; const SANE_Device** device_list = nullptr; SANE_Status status = sane_get_devices(&device_list, false); g_debug("sane_get_devices() -> %s", sane_strstatus(status)); if(status != SANE_STATUS_GOOD) { g_critical("Unable to get SANE devices: %s", sane_strstatus(status)); } else { for(int i = 0; device_list[i] != nullptr; ++i) { g_debug("Device: name=\"%s\" vendor=\"%s\" model=\"%s\" type=\"%s\"", device_list[i]->name, device_list[i]->vendor, device_list[i]->model, device_list[i]->type); Device scan_device; scan_device.name = device_list[i]->name; /* Abbreviate HP as it is a long string and does not match what is on the physical scanner */ std::string vendor = device_list[i]->vendor; if(vendor == "Hewlett-Packard") vendor = "HP"; scan_device.label = Glib::ustring::compose("%1 %2", vendor, device_list[i]->model); std::replace(scan_device.label.begin(), scan_device.label.end(), '_', ' '); devices.push_back(scan_device); } } Utils::runInMainThreadBlocking([this, devices] { m_signal_devicesDetected.emit(devices); }); } void ScannerSane::doOpen() { if(m_job->params.device.empty()) { failScan(_("No scanner specified")); return; } SANE_Status status = sane_open(m_job->params.device.c_str(), &m_job->handle); g_debug("sane_open(\"%s\") -> %s", m_job->params.device.c_str(), sane_strstatus(status)); if(status != SANE_STATUS_GOOD) { g_critical("Unable to get open device: %s", sane_strstatus(status)); m_job->handle = nullptr; failScan(_("Unable to connect to scanner")); return; } setState(State::SET_OPTIONS); } void ScannerSane::doSetOptions() { g_debug("set_options"); int index = 0; const SANE_Option_Descriptor* option; std::map options; /* Build the option table */ while((option = sane_get_option_descriptor(m_job->handle, index)) != nullptr) { logOption(index, option); if( /* Ignore groups */ option->type != SANE_TYPE_GROUP && /* Option disabled */ (option->cap & SANE_CAP_INACTIVE) == 0 && /* Some options are unnamed (e.g. Option 0) */ option->name != nullptr && std::strlen(option->name) > 0 ) { options.insert({option->name, index}); } ++index; } /* Apply settings */ /* Pick source */ option = getOptionByName(options, m_job->handle, SANE_NAME_SCAN_SOURCE, index); if(option != nullptr) { std::vector flatbed_sources = { "Auto", SANE_I18N("Auto"), "Flatbed", SANE_I18N("Flatbed"), "FlatBed", "Normal", SANE_I18N("Normal") }; std::vector adf_sources = { "Automatic Document Feeder", SANE_I18N("Automatic Document Feeder"), "ADF", "Automatic Document Feeder(left aligned)", /* Seen in the proprietary brother3 driver */ "Automatic Document Feeder(centrally aligned)" /* Seen in the proprietary brother3 driver */ }; std::vector adf_front_sources = { "ADF Front", SANE_I18N("ADF Front") }; std::vector adf_back_sources = { "ADF Back", SANE_I18N("ADF Back") }; std::vector adf_duplex_sources = { "ADF Duplex", SANE_I18N("ADF Duplex") }; switch(m_job->params.type) { case ScanType::SINGLE: if(!setDefaultOption(m_job->handle, option, index)) if(!setConstrainedStringOption(m_job->handle, option, index, flatbed_sources, nullptr)) g_warning("Unable to set single page source, please file a bug"); break; case ScanType::ADF_FRONT: if(!setConstrainedStringOption(m_job->handle, option, index, adf_front_sources, nullptr)) if(!setConstrainedStringOption(m_job->handle, option, index, adf_sources, nullptr)) g_warning("Unable to set front ADF source, please file a bug"); break; case ScanType::ADF_BACK: if(!setConstrainedStringOption(m_job->handle, option, index, adf_back_sources, nullptr)) if(!setConstrainedStringOption(m_job->handle, option, index, adf_sources, nullptr)) g_warning("Unable to set back ADF source, please file a bug"); break; case ScanType::ADF_BOTH: if(!setConstrainedStringOption(m_job->handle, option, index, adf_duplex_sources, nullptr)) if(!setConstrainedStringOption(m_job->handle, option, index, adf_sources, nullptr)) g_warning("Unable to set duplex ADF source, please file a bug"); break; } } /* Scan mode (before resolution as it tends to affect that */ option = getOptionByName(options, m_job->handle, SANE_NAME_SCAN_MODE, index); if(option != nullptr) { /* The names of scan modes often used in drivers, as taken from the sane-backends source */ std::vector color_scan_modes = { SANE_VALUE_SCAN_MODE_COLOR, "Color", "24bit Color" /* Seen in the proprietary brother3 driver */ }; std::vector gray_scan_modes = { SANE_VALUE_SCAN_MODE_GRAY, "Gray", "Grayscale", SANE_I18N("Grayscale"), "True Gray" /* Seen in the proprietary brother3 driver */ }; std::vector lineart_scan_modes = { SANE_VALUE_SCAN_MODE_LINEART, "Lineart", "LineArt", SANE_I18N("LineArt"), "Black & White", SANE_I18N("Black & White"), "Binary", SANE_I18N("Binary"), "Thresholded", SANE_VALUE_SCAN_MODE_GRAY, "Gray", "Grayscale", SANE_I18N("Grayscale"), "True Gray" /* Seen in the proprietary brother3 driver */ }; switch(m_job->params.scan_mode) { case ScanMode::COLOR: if(!setConstrainedStringOption(m_job->handle, option, index, color_scan_modes, nullptr)) g_warning("Unable to set Color mode, please file a bug"); break; case ScanMode::GRAY: if(!setConstrainedStringOption(m_job->handle, option, index, gray_scan_modes, nullptr)) g_warning("Unable to set Gray mode, please file a bug"); break; case ScanMode::LINEART: if(!setConstrainedStringOption(m_job->handle, option, index, lineart_scan_modes, nullptr)) g_warning("Unable to set Lineart mode, please file a bug"); break; default: break; } } /* Duplex */ option = getOptionByName(options, m_job->handle, "duplex", index); if(option != nullptr && option->type == SANE_TYPE_BOOL) setBoolOption(m_job->handle, option, index, m_job->params.type == ScanType::ADF_BOTH, nullptr); /* Multi-page options */ option = getOptionByName(options, m_job->handle, "batch-scan", index); if(option != nullptr && option->type == SANE_TYPE_BOOL) setBoolOption(m_job->handle, option, index, m_job->params.type != ScanType::SINGLE, nullptr); /* Disable compression, we will compress after scanning */ option = getOptionByName(options, m_job->handle, "compression", index); if(option != nullptr) { std::vector disable_compression_names = { SANE_I18N("None"), SANE_I18N("none"), "None", "none" }; if(!setConstrainedStringOption(m_job->handle, option, index, disable_compression_names, nullptr)) g_warning("Unable to disable compression, please file a bug"); } /* Set resolution and bit depth */ option = getOptionByName(options, m_job->handle, SANE_NAME_SCAN_RESOLUTION, index); if(option != nullptr) { if(option->type == SANE_TYPE_FIXED) setFixedOption(m_job->handle, option, index, m_job->params.dpi, &m_job->params.dpi); else { int dpi; setIntOption(m_job->handle, option, index, m_job->params.dpi, &dpi); m_job->params.dpi = dpi; } option = getOptionByName(options, m_job->handle, SANE_NAME_BIT_DEPTH, index); if(option != nullptr && m_job->params.depth > 0) setIntOption(m_job->handle, option, index, m_job->params.depth, nullptr); } /* Always use maximum scan area - some scanners default to using partial areas. This should be patched in sane-backends */ option = getOptionByName(options, m_job->handle, SANE_NAME_SCAN_BR_X, index); if(option != nullptr && option->constraint_type == SANE_CONSTRAINT_RANGE) { if(option->type == SANE_TYPE_FIXED) setFixedOption(m_job->handle, option, index, SANE_UNFIX(option->constraint.range->max), nullptr); else setIntOption(m_job->handle, option, index, option->constraint.range->max, nullptr); } option = getOptionByName(options, m_job->handle, SANE_NAME_SCAN_BR_Y, index); if(option != nullptr && option->constraint_type == SANE_CONSTRAINT_RANGE) { if(option->type == SANE_TYPE_FIXED) setFixedOption(m_job->handle, option, index, SANE_UNFIX(option->constraint.range->max), nullptr); else setIntOption(m_job->handle, option, index, option->constraint.range->max, nullptr); } /* Set page dimensions */ option = getOptionByName(options, m_job->handle, SANE_NAME_PAGE_WIDTH, index); if(option != nullptr && m_job->params.page_width > 0.0) { if(option->type == SANE_TYPE_FIXED) setFixedOption(m_job->handle, option, index, m_job->params.page_width / 10.0, nullptr); else setIntOption(m_job->handle, option, index, m_job->params.page_width / 10, nullptr); } option = getOptionByName(options, m_job->handle, SANE_NAME_PAGE_HEIGHT, index); if(option != nullptr && m_job->params.page_height > 0.0) { if(option->type == SANE_TYPE_FIXED) setFixedOption(m_job->handle, option, index, m_job->params.page_height / 10.0, nullptr); else setIntOption(m_job->handle, option, index, m_job->params.page_height / 10, nullptr); } setState(State::START); } void ScannerSane::doStart() { SANE_Status status = sane_start(m_job->handle); g_debug("sane_start -> %s", sane_strstatus(status)); if(status == SANE_STATUS_GOOD) { setState(State::GET_PARAMETERS); } else { doStop(); failScan(_("Unable to start scan")); } } void ScannerSane::doGetParameters() { SANE_Status status = sane_get_parameters(m_job->handle, &m_job->parameters); g_debug("sane_get_parameters() -> %s", sane_strstatus(status)); if(status != SANE_STATUS_GOOD) { failScan(_("Error communicating with scanner")); return; } g_debug("Parameters: format=%s last_frame=%s bytes_per_line=%d pixels_per_line=%d lines=%d depth=%d", getFrameModeString(m_job->parameters.format).c_str(), m_job->parameters.last_frame ? "SANE_TRUE" : "SANE_FALSE", m_job->parameters.bytes_per_line, m_job->parameters.pixels_per_line, m_job->parameters.lines, m_job->parameters.depth); m_job->height = std::max(1, m_job->parameters.lines); m_job->rowstride = m_job->parameters.pixels_per_line * 3; // Buffer is for a 24 bit RGB image m_job->imgbuf.resize(m_job->rowstride * m_job->parameters.lines); /* Prepare for read */ m_job->lineBuffer.resize(m_job->parameters.bytes_per_line); m_job->nUsed = 0; m_job->lineCount = 0; setState(State::READ); } void ScannerSane::doRead() { /* Read as many bytes as we need to complete a line */ int n_to_read = m_job->lineBuffer.size() - m_job->nUsed; SANE_Int n_read; unsigned char* b = &m_job->lineBuffer[m_job->nUsed]; SANE_Status status = sane_read(m_job->handle, b, n_to_read, &n_read); g_debug("sane_read(%d) -> (%s, %d)", n_to_read, sane_strstatus(status), n_read); /* Completed read */ if(status == SANE_STATUS_EOF) { if(m_job->parameters.lines > 0 && m_job->lineCount != m_job->parameters.lines) g_critical("Scan completed with %d lines, expected %d lines", m_job->lineCount, m_job->parameters.lines); if(m_job->nUsed > 0) g_critical("Scan complete with %d bytes of unused data", m_job->nUsed); doCompletePage(); return; } else if(status != SANE_STATUS_GOOD) { g_critical("Unable to read frame from device: %s", sane_strstatus(status)); failScan(_("Error communicating with scanner")); return; } m_job->nUsed += n_read; /* If we completed a line, feed it out */ if(m_job->nUsed >= (int)m_job->lineBuffer.size()) { g_assert(m_job->nUsed == m_job->parameters.bytes_per_line); ++m_job->lineCount; // Resize image if necessary if(m_job->lineCount > m_job->height) { m_job->height = m_job->lineCount; m_job->imgbuf.resize(m_job->rowstride * m_job->height); } // Write data int offset = (m_job->lineCount - 1) * m_job->rowstride; if(m_job->parameters.format == SANE_FRAME_GRAY) { for(std::size_t i = 0; i < m_job->lineBuffer.size(); ++i) { std::memset(&m_job->imgbuf[offset + 3*i], m_job->lineBuffer[i], 3); } } else if(m_job->parameters.format == SANE_FRAME_RGB) { std::memcpy(&m_job->imgbuf[offset], &m_job->lineBuffer[0], m_job->lineBuffer.size()); } else if(m_job->parameters.format == SANE_FRAME_RED) { for(std::size_t i = 0; i < m_job->lineBuffer.size(); ++i) { m_job->imgbuf[offset + 3*i + 0] = m_job->lineBuffer[i]; } } else if(m_job->parameters.format == SANE_FRAME_GREEN) { for(std::size_t i = 0; i < m_job->lineBuffer.size(); ++i) { m_job->imgbuf[offset + 3*i + 1] = m_job->lineBuffer[i]; } } else if(m_job->parameters.format == SANE_FRAME_BLUE) { for(std::size_t i = 0; i < m_job->lineBuffer.size(); ++i) { m_job->imgbuf[offset + 3*i + 2] = m_job->lineBuffer[i]; } } /* Reset buffer */ m_job->nUsed = 0; m_job->lineBuffer.resize(m_job->parameters.bytes_per_line); } } void ScannerSane::doCompletePage() { if(!m_job->parameters.last_frame) { setState(State::GET_PARAMETERS); return; } std::string filename = m_job->params.filename; if(m_job->params.type != ScanType::SINGLE) { std::string base, ext; Utils::get_filename_parts(filename, base, ext); filename = Glib::ustring::compose("%1/%2_%3.%4", base, m_job->pageNumber, ext); } std::string base, ext; Utils::get_filename_parts(filename, base, ext); try { Gdk::Pixbuf::create_from_data(m_job->imgbuf.data(), Gdk::COLORSPACE_RGB, false, 8, m_job->rowstride/3, m_job->height, m_job->rowstride)->save(filename, ext); } catch(const Glib::Error&) { failScan(_("Failed to save image")); return; } m_job->imgbuf.clear(); Utils::runInMainThreadBlocking([this, filename] { m_signal_pageAvailable.emit(filename); }); if(m_job->params.type != ScanType::SINGLE) { ++m_job->pageNumber; setState(State::GET_PARAMETERS); return; } doStop(); } void ScannerSane::doStop() { if(m_job != nullptr) { if(m_job->handle != nullptr) { g_debug("sane_close()"); sane_close(m_job->handle); } delete m_job; m_job = nullptr; setState(State::IDLE); } } /***************************** Sane option stuff *****************************/ const SANE_Option_Descriptor* ScannerSane::getOptionByName(const std::map& options, SANE_Handle, const std::string& name, int &index) { std::map::const_iterator it = options.find(name); if(it != options.end()) { index = it->second; return sane_get_option_descriptor(m_job->handle, index); } index = 0; return nullptr; } bool ScannerSane::setDefaultOption(SANE_Handle handle, const SANE_Option_Descriptor* option, SANE_Int option_index) { /* Check if supports automatic option */ if((option->cap & SANE_CAP_AUTOMATIC) == 0) return false; SANE_Status status = sane_control_option(handle, option_index, SANE_ACTION_SET_AUTO, nullptr, nullptr); g_debug("sane_control_option(%d, SANE_ACTION_SET_AUTO) -> %s", option_index, sane_strstatus(status)); if(status != SANE_STATUS_GOOD) g_warning("Error setting default option %s: %s", option->name, sane_strstatus(status)); return status == SANE_STATUS_GOOD; } void ScannerSane::setBoolOption(SANE_Handle handle, const SANE_Option_Descriptor* option, SANE_Int option_index, bool value, bool* result) { if(option->type != SANE_TYPE_BOOL) { return; } SANE_Bool v = static_cast(value); SANE_Status status = sane_control_option(handle, option_index, SANE_ACTION_SET_VALUE, &v, nullptr); if(result) *result = static_cast(v); g_debug("sane_control_option(%d, SANE_ACTION_SET_VALUE, %s) -> (%s, %s)", option_index, value ? "SANE_TRUE" : "SANE_FALSE", sane_strstatus(status), result ? "SANE_TRUE" : "SANE_FALSE"); } void ScannerSane::setIntOption(SANE_Handle handle, const SANE_Option_Descriptor* option, SANE_Int option_index, int value, int* result) { if(option->type != SANE_TYPE_INT) { return; } SANE_Word v = static_cast(value); if(option->constraint_type == SANE_CONSTRAINT_RANGE) { if(option->constraint.range->quant != 0) v *= option->constraint.range->quant; v = std::max(option->constraint.range->min, std::min(option->constraint.range->max, v)); } else if(option->constraint_type == SANE_CONSTRAINT_WORD_LIST) { int distance = std::numeric_limits::max(); int nearest = 0; /* Find nearest value to requested */ for(int i = 0; i < option->constraint.word_list[0]; ++i) { int x = option->constraint.word_list[i+1]; int d = std::abs(x - v); if(d < distance) { distance = d; nearest = x; } } v = nearest; } SANE_Status status = sane_control_option(handle, option_index, SANE_ACTION_SET_VALUE, &v, nullptr); g_debug("sane_control_option(%d, SANE_ACTION_SET_VALUE, %d) -> (%s, %d)", option_index, value, sane_strstatus(status), v); if(result) *result = v; } void ScannerSane::setFixedOption(SANE_Handle handle, const SANE_Option_Descriptor *option, SANE_Int option_index, double value, double* result) { if(option->type != SANE_TYPE_FIXED) { return; } double v = value; if(option->constraint_type == SANE_CONSTRAINT_RANGE) { double min = SANE_UNFIX(option->constraint.range->min); double max = SANE_UNFIX(option->constraint.range->max); v = std::max(min, std::min(max, v)); } else if(option->constraint_type == SANE_CONSTRAINT_WORD_LIST) { double distance = std::numeric_limits::max(); double nearest = 0.0; /* Find nearest value to requested */ for(int i = 0; i < option->constraint.word_list[0]; ++i) { double x = SANE_UNFIX(option->constraint.word_list[i+1]); double d = std::abs(x - v); if(d < distance) { distance = d; nearest = x; } } v = nearest; } SANE_Fixed v_fixed = SANE_FIX(v); SANE_Status status = sane_control_option(handle, option_index, SANE_ACTION_SET_VALUE, &v_fixed, nullptr); g_debug("sane_control_option(%d, SANE_ACTION_SET_VALUE, %f) -> (%s, %f)", option_index, value, sane_strstatus(status), SANE_UNFIX(v_fixed)); if(result) *result = SANE_UNFIX(v_fixed); } bool ScannerSane::setStringOption(SANE_Handle handle, const SANE_Option_Descriptor *option, SANE_Int option_index, const std::string& value, std::string* result) { if(option->type != SANE_TYPE_STRING) { return false; } char* v = new char[value.size() + 1]; // +1: \0 strncpy(v, value.c_str(), value.size()+1); SANE_Status status = sane_control_option(handle, option_index, SANE_ACTION_SET_VALUE, v, nullptr); g_debug("sane_control_option(%d, SANE_ACTION_SET_VALUE, \"%s\") -> (%s, \"%s\")", option_index, value.c_str(), sane_strstatus(status), v); if(result) *result = v; delete[] v; return status == SANE_STATUS_GOOD; } bool ScannerSane::setConstrainedStringOption(SANE_Handle handle, const SANE_Option_Descriptor *option, SANE_Int option_index, const std::vector& values, std::string* result) { if(option->type != SANE_TYPE_STRING) { return false; } if(option->constraint_type != SANE_CONSTRAINT_STRING_LIST) { return false; } for(const std::string& value : values) { for(int j = 0; option->constraint.string_list[j] != nullptr; ++j) { if(value == option->constraint.string_list[j]) { return setStringOption(handle, option, option_index, value, result); } } } if(result) *result = ""; return false; } void ScannerSane::logOption(SANE_Int index, const SANE_Option_Descriptor *option) { Glib::ustring s = Glib::ustring::compose("Option %1:", index); if(option->name && std::strlen(option->name) > 0) s += Glib::ustring::compose(" name='%1'", option->name); if(option->title && std::strlen(option->title) > 0) s += Glib::ustring::compose(" title='%1'", option->title); Glib::ustring typestr[] = {"bool", "int", "fixed", "string", "button", "group"}; if(option->type <= SANE_TYPE_GROUP) { s += Glib::ustring::compose(" type=%1", typestr[option->type]); } else { s += Glib::ustring::compose(" type=%1", option->type); } s += Glib::ustring::compose(" size=%1", option->size); Glib::ustring unitstr[] = {"none", "pixel", "bit", "mm", "dpi", "percent", "microseconds"}; if(option->unit <= SANE_UNIT_MICROSECOND) { s += Glib::ustring::compose(" unit=%1", unitstr[option->unit]); } else { s += Glib::ustring::compose(" unit=%1", option->unit); } switch(option->constraint_type) { case SANE_CONSTRAINT_RANGE: if(option->type == SANE_TYPE_FIXED) s += Glib::ustring::compose(" min=%1, max=%2, quant=%3", SANE_UNFIX(option->constraint.range->min), SANE_UNFIX(option->constraint.range->max), option->constraint.range->quant); else s += Glib::ustring::compose(" min=%1, max=%2, quant=%3", option->constraint.range->min, option->constraint.range->max, option->constraint.range->quant); break; case SANE_CONSTRAINT_WORD_LIST: s += " values=["; for(int i = 0; i < option->constraint.word_list[0]; ++i) { if(i > 0) s += ", "; if(option->type == SANE_TYPE_INT) s += Glib::ustring::compose("%1", option->constraint.word_list[i+1]); else s += Glib::ustring::compose("%1", SANE_UNFIX(option->constraint.word_list[i+1])); } s += "]"; break; case SANE_CONSTRAINT_STRING_LIST: s += " values=["; for(int i = 0; option->constraint.string_list[i] != nullptr; ++i) { if(i > 0) s += ", "; s += Glib::ustring::compose("\"%1\"", option->constraint.string_list[i]); } s += "]"; break; default: break; } int cap = option->cap; if(cap != 0) { s += " cap="; if((cap & SANE_CAP_SOFT_SELECT) != 0) { s += "soft-select,"; cap &= ~SANE_CAP_SOFT_SELECT; } if((cap & SANE_CAP_HARD_SELECT) != 0) { s += "hard-select,"; cap &= ~SANE_CAP_HARD_SELECT; } if((cap & SANE_CAP_SOFT_DETECT) != 0) { s += "soft-detect,"; cap &= ~SANE_CAP_SOFT_DETECT; } if((cap & SANE_CAP_EMULATED) != 0) { s += "emulated,"; cap &= ~SANE_CAP_EMULATED; } if((cap & SANE_CAP_AUTOMATIC) != 0) { s += "automatic,"; cap &= ~SANE_CAP_AUTOMATIC; } if((cap & SANE_CAP_INACTIVE) != 0) { s += "inactive,"; cap &= ~SANE_CAP_INACTIVE; } if((cap & SANE_CAP_ADVANCED) != 0) { s += "advanced,"; cap &= ~SANE_CAP_ADVANCED; } /* Unknown capabilities */ if(cap != 0) { s += Glib::ustring::compose("unknown (%1)", cap); } } g_debug("%s", s.c_str()); if(option->desc != nullptr) g_debug(" Description: %s", option->desc); } Glib::ustring ScannerSane::getFrameModeString(SANE_Frame frame) { Glib::ustring framestr[] = {"SANE_FRAME_GRAY", "SANE_FRAME_RGB", "SANE_FRAME_RED", "SANE_FRAME_GREEN", "SANE_FRAME_BLUE"}; if(frame <= SANE_FRAME_BLUE) { return framestr[frame]; } else { return Glib::ustring::compose("SANE_FRAME(%1)", frame); } } gImageReader-3.2.3/gtk/src/scanner/ScannerSane.hh000066400000000000000000000064641312567024200215750ustar00rootroot00000000000000/* -*- Mode: C++; indent-tabs-mode: t; c-basic-offset: 4; tab-width: 4 -*- */ /* * ScannerSane.hh * Based on code from Simple Scan, which is: * Copyright (C) 2009-2013 Canonical Ltd. * Author: Robert Ancell * Modifications are: * Copyright (C) 2013-2017 Sandro Mani * * gImageReader 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. * * gImageReader 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 this program. If not, see . */ #ifndef SCANNER_SANE_HH #define SCANNER_SANE_HH #include "../Scanner.hh" #include "../Utils.hh" #include class ScannerSane : public Scanner { public: void init() override; void redetect() override; void scan(const Params& params) override; void cancel() override; void close() override; private: struct ScanJob { ScanJob(const Params& _params) : params(_params) {} Params params; SANE_Handle handle = nullptr; SANE_Parameters parameters; std::vector lineBuffer; std::vector imgbuf; int nUsed = 0; // Number of used bytes in the line buffer int lineCount = 0; // Number of read lines int height = 0; int rowstride = 0; int pageNumber = 0; }; struct Request { enum class Type { Redetect, StartScan, Cancel, Quit } type; ScanJob* job; }; Glib::Threads::Thread* m_thread = nullptr; State m_state = State::IDLE; Utils::AsyncQueue m_requestQueue; ScanJob* m_job = nullptr; bool m_finished = false; void run(); void doRedetect(); void doOpen(); void doSetOptions(); void doStart(); void doGetParameters(); void doRead(); void doCompletePage(); void doStop(); void setState(State state); void failScan(const Glib::ustring& errorString); const SANE_Option_Descriptor* getOptionByName(const std::map& options, SANE_Handle, const std::string& name, int& index); bool setDefaultOption(SANE_Handle m_handle, const SANE_Option_Descriptor *option, SANE_Int option_index); void setBoolOption(SANE_Handle m_handle, const SANE_Option_Descriptor* option, SANE_Int option_index, bool value, bool*result); void setIntOption(SANE_Handle m_handle, const SANE_Option_Descriptor* option, SANE_Int option_index, int value, int* result); void setFixedOption(SANE_Handle m_handle, const SANE_Option_Descriptor* option, SANE_Int option_index, double value, double* result); bool setStringOption(SANE_Handle m_handle, const SANE_Option_Descriptor* option, SANE_Int option_index, const std::string& value, std::string* result); bool setConstrainedStringOption(SANE_Handle m_handle, const SANE_Option_Descriptor* option, SANE_Int option_index, const std::vector& values, std::string *result); void logOption(SANE_Int index, const SANE_Option_Descriptor* option); static Glib::ustring getFrameModeString(SANE_Frame frame); }; typedef ScannerSane ScannerImpl; #endif // SCANNER_SANE_HH gImageReader-3.2.3/gtk/src/scanner/ScannerTwain.cc000066400000000000000000000342601312567024200217520ustar00rootroot00000000000000/* -*- Mode: C++; indent-tabs-mode: t; c-basic-offset: 4; tab-width: 4 -*- */ /* * ScannerTwain.cc * Copyright (C) 2013-2017 Sandro Mani * * gImageReader 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. * * gImageReader 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 this program. If not, see . */ #include "ScannerTwain.hh" #include "../MainWindow.hh" #ifdef G_OS_WIN32 #include #endif #ifdef G_OS_WIN32 bool ScannerTwain::saveDIB(TW_MEMREF hImg, const std::string& filename) { PBITMAPINFOHEADER pDIB = reinterpret_cast(m_entryPoint.DSM_MemLock(hImg)); if(pDIB == nullptr) { return false; } DWORD paletteSize = 0; if(pDIB->biBitCount == 1) { paletteSize = 2; } else if(pDIB->biBitCount == 8) { paletteSize = 256; } else if(pDIB->biBitCount == 24) { paletteSize = 0; } else { // Unsupported m_entryPoint.DSM_MemUnlock(hImg); m_entryPoint.DSM_MemFree(hImg); return false; } // If the driver did not fill in the biSizeImage field, then compute it. // Each scan line of the image is aligned on a DWORD (32bit) boundary. if( pDIB->biSizeImage == 0 ) { pDIB->biSizeImage = ((((pDIB->biWidth * pDIB->biBitCount) + 31) & ~31) / 8) * pDIB->biHeight; // If a compression scheme is used the result may be larger: increase size. if (pDIB->biCompression != 0) { pDIB->biSizeImage = (pDIB->biSizeImage * 3) / 2; } } std::uint64_t imageSize = pDIB->biSizeImage + sizeof(RGBQUAD)*paletteSize + sizeof(BITMAPINFOHEADER); BITMAPFILEHEADER bmpFIH = {0}; bmpFIH.bfType = ( (WORD) ('M' << 8) | 'B'); bmpFIH.bfSize = imageSize + sizeof(BITMAPFILEHEADER); bmpFIH.bfOffBits = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER) + (sizeof(RGBQUAD)*paletteSize); unsigned char* bmpData = new unsigned char[sizeof(BITMAPFILEHEADER) + imageSize]; std::memcpy(bmpData, &bmpFIH, sizeof(BITMAPFILEHEADER)); std::memcpy(bmpData + sizeof(BITMAPFILEHEADER), pDIB, imageSize); bool success = false; Glib::RefPtr stream = Gio::MemoryInputStream::create(); stream->add_data(bmpData, sizeof(BITMAPFILEHEADER) + imageSize); Glib::RefPtr pixbuf(Gdk::Pixbuf::create_from_stream(stream)); if(pixbuf) { try { pixbuf->save(filename, "png"); success = true; } catch(...) { success = false; } } delete[] bmpData; m_entryPoint.DSM_MemUnlock(hImg); m_entryPoint.DSM_MemFree(hImg); return success; } #endif ScannerTwain* ScannerTwain::s_instance = nullptr; void ScannerTwain::init() { if(m_dsmLib != nullptr) { g_critical("Init already called!"); m_signal_initFailed.emit(); return; } #ifdef G_OS_WIN32 std::string twaindsm = Glib::build_filename(pkgDir, "bin", "twaindsm.dll"); #else std::string twaindsm = "libtwaindsm.so.2.2.0"; #endif // State 1 to 2 m_dsmLib = dlopen(twaindsm.c_str(), RTLD_LAZY); if(m_dsmLib == nullptr) { g_critical("LoadLibrary failed on %s", twaindsm.c_str()); m_signal_initFailed.emit(); close(); return; } m_dsmEntry = (DSMENTRYPROC)dlsym(m_dsmLib, "DSM_Entry"); if(m_dsmEntry == nullptr) { g_critical("GetProcAddress failed on %s::DSM_Entry", twaindsm.c_str()); m_signal_initFailed.emit(); close(); return; } m_appID.Id = 0; m_appID.Version.MajorNum = 1; m_appID.Version.MinorNum = 0; m_appID.Version.Language = TWLG_USA; m_appID.Version.Country = TWCY_USA; std::strncpy(m_appID.Version.Info, "TWAIN Interface", sizeof(m_appID.Version.Info)); std::strncpy(m_appID.ProductName, "TWAIN Interface", sizeof(m_appID.ProductName)); std::strncpy(m_appID.Manufacturer, "Sandro Mani", sizeof(m_appID.Manufacturer)); std::strncpy(m_appID.ProductFamily, "Sandro Mani", sizeof(m_appID.ProductFamily)); m_appID.SupportedGroups = DF_APP2 | DG_IMAGE | DG_CONTROL; m_appID.ProtocolMajor = TWON_PROTOCOLMAJOR; m_appID.ProtocolMinor = TWON_PROTOCOLMINOR; m_state = 2; // State 2 to 3 TW_MEMREF phwnd = nullptr; #ifdef G_OS_WIN32 // HWND hwnd = gdk_win32_window_get_impl_hwnd(MAIN->getWindow()->get_window()->gobj()); // phwnd = &hwnd; #endif if(call(nullptr, DG_CONTROL, DAT_PARENT, MSG_OPENDSM, phwnd) != TWRC_SUCCESS) { m_signal_initFailed.emit(); close(); return; } if((m_appID.SupportedGroups & DF_DSM2) == 0) { g_critical("Twain 2.x interface is not supported"); m_signal_initFailed.emit(); close(); return; } // Get entry point of memory management functions m_entryPoint.Size = sizeof(TW_ENTRYPOINT); if(call(nullptr, DG_CONTROL, DAT_ENTRYPOINT, MSG_GET, &m_entryPoint) != TWRC_SUCCESS) { m_signal_initFailed.emit(); close(); return; } m_state = 3; s_instance = this; // Redetect on init redetect(); } void ScannerTwain::redetect() { TW_IDENTITY sourceID; std::vector sources; // Get the first source TW_UINT16 twRC = call(nullptr, DG_CONTROL, DAT_IDENTITY, MSG_GETFIRST, &sourceID); // Loop through all the sources while (twRC == TWRC_SUCCESS) { sources.push_back({sourceID.ProductName, sourceID.ProductName}); twRC = call(nullptr, DG_CONTROL, DAT_IDENTITY, MSG_GETNEXT, &sourceID); } m_signal_devicesDetected.emit(sources); } void ScannerTwain::scan(const Params ¶ms) { if(params.device.empty()) { failScan(_("No scanner specified")); return; } /** Open device **/ m_signal_scanStateChanged.emit(State::OPEN); std::strncpy(m_srcID.ProductName, params.device.c_str(), sizeof(m_srcID.ProductName)); // State 3 to 4 if(call(nullptr, DG_CONTROL, DAT_IDENTITY, MSG_OPENDS, &m_srcID) != TWRC_SUCCESS) { failScan(_("Unable to connect to scanner")); return; } m_state = 4; // Register callback TW_CALLBACK cb = {}; cb.CallBackProc = reinterpret_cast(callback); if(TWRC_SUCCESS == call(&m_srcID, DG_CONTROL, DAT_CALLBACK, MSG_REGISTER_CALLBACK, &cb)) { m_useCallback = true; } else { m_useCallback = false; } /** Set options **/ m_signal_scanStateChanged.emit(State::SET_OPTIONS); #ifndef G_OS_WIN32 // Set the filename TW_SETUPFILEXFER xferFile = {}; std::strncpy(xferFile.FileName, params.filename.c_str(), sizeof(xferFile.FileName)); xferFile.Format = TWFF_PNG; xferFile.VRefNum = TWON_DONTCARE16; if(call(&m_srcID, DG_CONTROL, DAT_SETUPFILEXFER, MSG_SET, &xferFile) != TWRC_SUCCESS) { // Possibly unsupported file format. Get the default format, and try again with that one call(&m_srcID, DG_CONTROL, DAT_SETUPFILEXFER, MSG_GET, &xferFile); std::string defaultfile = xferFile.FileName; params.filename = params.filename.substr(0, params.filename.rfind('.')) + defaultfile.substr(defaultfile.rfind('.')); std::strncpy(xferFile.FileName, params.filename.c_str(), sizeof(xferFile.FileName)); if(call(&m_srcID, DG_CONTROL, DAT_SETUPFILEXFER, MSG_SET, &xferFile) != TWRC_SUCCESS) { // If we failed again, just return the default file... params.filename = defaultfile; } } #endif // Set capabilities setCapability(CAP_XFERCOUNT, CapOneVal(TWTY_INT16, 1)); setCapability(ICAP_XRESOLUTION, CapOneVal(TWTY_FIX32, floatToFix32(params.dpi))); setCapability(ICAP_YRESOLUTION, CapOneVal(TWTY_FIX32, floatToFix32(params.dpi))); setCapability(ICAP_SUPPORTEDSIZES, CapOneVal(TWTY_UINT16, TWSS_NONE)); // Maximum scan area setCapability(ICAP_BITDEPTH, CapOneVal(TWTY_UINT16, params.depth)); if(params.scan_mode != ScanMode::DEFAULT) { if(params.scan_mode == ScanMode::COLOR) setCapability(ICAP_PIXELTYPE, CapOneVal(TWTY_UINT16, TWPT_RGB)); else if(params.scan_mode == ScanMode::GRAY) setCapability(ICAP_PIXELTYPE, CapOneVal(TWTY_UINT16, TWPT_GRAY)); else if(params.scan_mode == ScanMode::LINEART) setCapability(ICAP_PIXELTYPE, CapOneVal(TWTY_UINT16, TWPT_BW)); } // TODO: ADF, duplex, paper size /** Start device **/ m_signal_scanStateChanged.emit(State::START); m_dsMsg = MSG_NULL; m_dsQuit = false; m_ui.ShowUI = true; m_ui.ModalUI = true; m_ui.hParent = nullptr;; #ifdef G_OS_WIN32 m_ui.hParent = gdk_win32_window_get_impl_hwnd(MAIN->getWindow()->get_window()->gobj()); #endif // State 4 to 5 if(call(&m_srcID, DG_CONTROL, DAT_USERINTERFACE, MSG_ENABLEDS, &m_ui) != TWRC_SUCCESS) { failScan(_("Unable to start scan")); return; } m_state = 5; m_cancel = false; #ifdef G_OS_WIN32 MAIN->getWindow()->get_window()->add_filter(eventFilter, nullptr); while(m_dsMsg == 0 && !m_dsQuit && !m_cancel) { while(Gtk::Main::instance()->events_pending()) { Gtk::Main::instance()->iteration(); } } MAIN->getWindow()->get_window()->remove_filter(eventFilter, nullptr); #else m_mutex.lock(); while(m_dsMsg == MSG_NULL) { m_cond.wait(m_mutex); } m_mutex.unlock(); #endif if(m_cancel) { failScan(_("Scan canceled")); } if(m_dsMsg != MSG_XFERREADY) { failScan(_("Unable to start scan")); return; } /** Read **/ m_signal_scanStateChanged.emit(State::READ); m_state = 6; bool saveOk = true; #ifdef G_OS_WIN32 TW_MEMREF hImg = nullptr; TW_UINT16 twRC = call(&m_srcID, DG_IMAGE, DAT_IMAGENATIVEXFER, MSG_GET, (TW_MEMREF)&hImg); if(twRC == TWRC_XFERDONE) { saveOk = saveDIB(hImg, params.filename); } #else TW_UINT16 twRC = call(&m_srcID, DG_IMAGE, DAT_IMAGEFILEXFER, MSG_GET, nullptr); #endif TW_PENDINGXFERS twPendingXFers = {}; call(&m_srcID, DG_CONTROL, DAT_PENDINGXFERS, MSG_ENDXFER, &twPendingXFers); if(twPendingXFers.Count != 0) { // Discard any additional pending transfers std::memset(&twPendingXFers, 0, sizeof(twPendingXFers)); call(&m_srcID, DG_CONTROL, DAT_PENDINGXFERS, MSG_RESET, &twPendingXFers); } if(twRC != TWRC_XFERDONE || !saveOk) { failScan(_("Error communicating with scanner")); return; } m_signal_pageAvailable.emit(params.filename); /** Stop device **/ doStop(); } void ScannerTwain::doStop() { if(m_state == 6) { TW_PENDINGXFERS twPendingXFers = {}; // State 7/6 to 5 call(&m_srcID, DG_CONTROL, DAT_PENDINGXFERS, MSG_RESET, &twPendingXFers); m_state = 5; } if(m_state == 5) { // State 5 to 4 call(&m_srcID, DG_CONTROL, DAT_USERINTERFACE, MSG_DISABLEDS, &m_ui); m_state = 4; } if(m_state == 4) { // State 4 to 3 call(nullptr, DG_CONTROL, DAT_IDENTITY, MSG_CLOSEDS, &m_srcID); m_srcID = {}; m_state = 3; } m_signal_scanStateChanged.emit(State::IDLE); } void ScannerTwain::failScan(const Glib::ustring& errorString) { doStop(); m_signal_scanFailed.emit(errorString); } void ScannerTwain::close() { doStop(); if(m_state == 3) { // State 3 to 2 call(nullptr, DG_CONTROL, DAT_PARENT, MSG_CLOSEDSM, nullptr); m_state = 2; } if(m_state == 2) { dlclose(m_dsmLib); m_dsmLib = nullptr; } m_state = 1; s_instance = nullptr; } #ifdef G_OS_WIN32 GdkFilterReturn ScannerTwain::eventFilter(GdkXEvent *xevent, GdkEvent *event, gpointer data) { LPMSG msg = static_cast(xevent); if(msg->message == WM_CLOSE) { s_instance->m_dsQuit = true; return GDK_FILTER_REMOVE; } TW_EVENT twEvent = {0}; twEvent.pEvent = (TW_MEMREF)msg; twEvent.TWMessage = MSG_NULL; TW_UINT16 twRC = s_instance->m_dsmEntry(&s_instance->m_appID, &s_instance->m_srcID, DG_CONTROL, DAT_EVENT, MSG_PROCESSEVENT, (TW_MEMREF)&twEvent); if(!s_instance->m_useCallback && twRC == TWRC_DSEVENT) { if(twEvent.TWMessage == MSG_XFERREADY || twEvent.TWMessage == MSG_CLOSEDSREQ || twEvent.TWMessage == MSG_CLOSEDSOK || twEvent.TWMessage == MSG_NULL) { s_instance->m_dsMsg = twEvent.TWMessage; } return GDK_FILTER_REMOVE; } return GDK_FILTER_CONTINUE; } #endif /*********************** ScannerTwain internal methods ***********************/ TW_UINT16 ScannerTwain::call(TW_IDENTITY* idDS, TW_UINT32 dataGroup, TW_UINT16 dataType, TW_UINT16 msg, TW_MEMREF data) { TW_UINT16 rc = m_dsmEntry(&m_appID, idDS, dataGroup, dataType, msg, data); if(rc == TWRC_FAILURE) { TW_STATUS status = {}; rc = m_dsmEntry(&m_appID, idDS, DG_CONTROL, DAT_STATUS, MSG_GET, &status); TW_UINT16 cc = rc == TWRC_SUCCESS ? status.ConditionCode : TWCC_BUMMER; g_critical("Call failed with code 0x%x: DataGroup: 0x%x, DataType = 0x%x, Msg = 0x%x", cc, dataGroup, dataType, msg); return TWRC_FAILURE; } return rc; } // TWTY_** size: INT8, INT16, INT32, UINT8, UINT16, UINT32, BOOL, FIX32, FRAME, STR32, STR64, STR128, STR255; static std::size_t TWTY_Size[] = { 1, 2, 4, 1, 2, 4, 2, 4, 16, 32, 64, 128, 255}; void ScannerTwain::setCapability(TW_UINT16 capCode, const CapOneVal& cap) { TW_CAPABILITY twCapability = {capCode, TWON_DONTCARE16, nullptr}; TW_UINT16 rc = call(&m_srcID, DG_CONTROL, DAT_CAPABILITY, MSG_GETCURRENT, &twCapability); // Unsupported capability if(rc != TWRC_SUCCESS) { return; } g_assert(twCapability.ConType == TWON_ONEVALUE); pTW_ONEVALUE val = static_cast(m_entryPoint.DSM_MemLock(twCapability.hContainer)); g_assert(val->ItemType == cap.type && val->ItemType <= TWTY_STR255); // This works because the DSM should return a TW_ONEVALUE container allocated sufficiently large to hold // the value of type ItemType. std::memcpy(&val->Item, &cap.data, TWTY_Size[cap.type]); m_entryPoint.DSM_MemUnlock(twCapability.hContainer); call(&m_srcID, DG_CONTROL, DAT_CAPABILITY, MSG_SET, &twCapability); m_entryPoint.DSM_MemFree(twCapability.hContainer); } TW_UINT16 ScannerTwain::callback(TW_IDENTITY* origin, TW_IDENTITY* /*dest*/, TW_UINT32 /*DG*/, TW_UINT16 /*DAT*/, TW_UINT16 MSG, TW_MEMREF /*data*/) { if(origin == nullptr || origin->Id != s_instance->m_srcID.Id) { return TWRC_FAILURE; } if(MSG == MSG_XFERREADY || MSG == MSG_CLOSEDSREQ || MSG == MSG_CLOSEDSOK || MSG == MSG_NULL) { s_instance->m_dsMsg = MSG; #ifndef G_OS_WIN32 s_instance->m_mutex.lock(); s_instance->m_cond.wakeOne(); s_instance->m_mutex.unlock(); #endif return TWRC_SUCCESS; } return TWRC_FAILURE; } inline TW_FIX32 ScannerTwain::floatToFix32(float float32) { TW_FIX32 fix32; TW_INT32 value = (TW_INT32)(float32 * 65536.0 + 0.5); fix32.Whole = (TW_INT16)((value >> 16) & 0xFFFFL); fix32.Frac = (TW_INT16)(value & 0xFFFFL); return fix32; } inline float ScannerTwain::fix32ToFloat(TW_FIX32 fix32) { return float(fix32.Whole) + float(fix32.Frac) / (1 << 16); } gImageReader-3.2.3/gtk/src/scanner/ScannerTwain.hh000066400000000000000000000057151312567024200217670ustar00rootroot00000000000000/* -*- Mode: C++; indent-tabs-mode: t; c-basic-offset: 4; tab-width: 4 -*- */ /* * ScannerTwain.hh * Copyright (C) 2013-2017 Sandro Mani * * gImageReader 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. * * gImageReader 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 this program. If not, see . */ #ifndef SCANNER_TWAIN_HH #define SCANNER_TWAIN_HH #include "../Scanner.hh" #include #include #include #ifdef G_OS_WIN32 #include #endif #include class ScannerTwain : public Scanner { public: void init() override; void redetect() override; void scan(const Params& params) override; void cancel() override { m_cancel = true; } void close() override; private: void* m_dsmLib = nullptr; DSMENTRYPROC m_dsmEntry = nullptr; TW_IDENTITY m_appID = {}; TW_ENTRYPOINT m_entryPoint = {}; TW_IDENTITY m_srcID = {}; TW_USERINTERFACE m_ui = {}; TW_UINT16 m_dsMsg = MSG_NULL; bool m_dsQuit = false; bool m_cancel = false; bool m_useCallback = false; int m_state = 0; static ScannerTwain* s_instance; #ifndef G_OS_WIN32 Glib::Threads::Mutex m_mutex; Glib::Threads::Cond m_cond; #endif struct CapOneVal { CapOneVal() = default; CapOneVal(TW_UINT16 _type, std::int32_t _integer) : type(_type) { data.integer = _integer; } CapOneVal(TW_UINT16 _type, TW_FIX32 _fix32) : type(_type) { data.fix32 = _fix32; } CapOneVal(TW_UINT16 _type, TW_FIX32(&_frame)[4]) : type(_type) { std::memcpy(&data.frame[0], &_frame[0], sizeof(data.frame)); } CapOneVal(TW_UINT16 _type, const char* _string) : type(_type) { std::strncpy(&data.string[0], &_string[0], sizeof(data.string)); } TW_UINT16 type; union { std::uint32_t integer; TW_FIX32 fix32; TW_FIX32 frame[4]; char string[256]; } data; }; void doStop(); void failScan(const Glib::ustring& errorString); TW_UINT16 call(TW_IDENTITY* idDS, TW_UINT32 dataGroup, TW_UINT16 dataType, TW_UINT16 msg, TW_MEMREF data); void setCapability(TW_UINT16 capCode, const CapOneVal& cap); #ifdef G_OS_WIN32 bool saveDIB(TW_MEMREF hImg, const std::string& filename); static GdkFilterReturn eventFilter(GdkXEvent *xevent, GdkEvent *event, gpointer data); #endif static PASCAL TW_UINT16 callback(TW_IDENTITY* origin, TW_IDENTITY* dest, TW_UINT32 DG, TW_UINT16 DAT, TW_UINT16 MSG, TW_MEMREF data); static inline float fix32ToFloat(TW_FIX32 fix32); static inline TW_FIX32 floatToFix32(float float32); }; typedef ScannerTwain ScannerImpl; #endif // SCANNER_TWAIN_HH gImageReader-3.2.3/packaging/000077500000000000000000000000001312567024200157615ustar00rootroot00000000000000gImageReader-3.2.3/packaging/debian/000077500000000000000000000000001312567024200172035ustar00rootroot00000000000000gImageReader-3.2.3/packaging/debian/changelog.in000066400000000000000000000002361312567024200214630ustar00rootroot00000000000000gimagereader (@PACKAGE_VERSION@-1) experimental; urgency=low * gImageReader @PACKAGE_VERSION@. -- Sandro Mani @PACKAGE_RFC_DATE@ gImageReader-3.2.3/packaging/debian/compat000066400000000000000000000000021312567024200204010ustar00rootroot000000000000009 gImageReader-3.2.3/packaging/debian/control000066400000000000000000000046321312567024200206130ustar00rootroot00000000000000Source: gimagereader Section: graphics Priority: optional Maintainer: Sandro Mani Build-Depends: debhelper (>= 9), cmake, libgtkspellmm-3.0-dev, libgtkmm-3.0-dev, libgtksourceviewmm-3.0-dev, libcairomm-1.0-dev, libpoppler-glib-dev, libtesseract-dev, libsane-dev, qtbase5-dev, qttools5-dev, qttools5-dev-tools, libqtspell-qt5-dev, libpoppler-qt5-dev, libjson-glib-dev, libxml++2.6-dev, libpodofo-dev Standards-Version: 3.9.4 Homepage: https://github.com/manisandro/gImageReader Package: gimagereader-gtk Architecture: any Depends: ${shlibs:Depends}, ${misc:Depends}, gimagereader-common (= ${binary:Version}) Replaces: gimagereader Conflicts: gimagereader Description: A graphical frontend to tesseract-ocr gImageReader is a simple front-end to tesseract. Features include: - Import PDF documents and images from disk, scanning devices, clipboard and screenshots - Process multiple images and documents in one go - Manual or automatic recognition area definition - Recognize to plain text or to hOCR documents - Recognized text displayed directly next to the image - Post-process the recognized text, including spellchecking - Generate PDF documents from hOCR documents This package contains the Gtk+ front-end. Package: gimagereader-qt Architecture: any Depends: ${shlibs:Depends}, ${misc:Depends}, gimagereader-common (= ${binary:Version}) Suggests: qt5-image-formats-plugins Description: A graphical frontend to tesseract-ocr gImageReader is a simple front-end to tesseract. Features include: - Import PDF documents and images from disk, scanning devices, clipboard and screenshots - Process multiple images and documents in one go - Manual or automatic recognition area definition - Recognize to plain text or to hOCR documents - Recognized text displayed directly next to the image - Post-process the recognized text, including spellchecking - Generate PDF documents from hOCR documents This package contains the Qt front-end. Package: gimagereader-common Architecture: all Depends: ${misc:Depends} Conflicts: gimagereader (<< 2.94-1) Description: Common files for gimagereader This package contains common files for gimagereader. Package: gimagereader-dbg Architecture: any Section: debug Priority: extra Depends: ${misc:Depends} Description: Debugging symbols for gimagereader This package contains the debugging symbols for gimagereader. gImageReader-3.2.3/packaging/debian/copyright000066400000000000000000000037051312567024200211430ustar00rootroot00000000000000Format: http://www.debian.org/doc/packaging-manuals/copyright-format/1.0/ Upstream-Name: gimagereader Source: https://github.com/manisandro/gImageReader Files: * Copyright: 2009-2017 Sandro Mani License: GPL-3+ gImageReader 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. . gImageReader 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 this program. If not, see . Files: debian/* Copyright: 2014-2017 Sandro Mani License: GPL-2+ This package 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 2 of the License, or (at your option) any later version. . This package 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 this program. If not, see . On Debian systems, the complete text of the GNU General Public License version 2 can be found in "/usr/share/common-licenses/GPL-2". # Please also look if there are files or directories which have a # different copyright/license attached and list them here. # Please avoid to pick license terms that are more restrictive than the # packaged work, as it may make Debian's contributions unacceptable upstream. gImageReader-3.2.3/packaging/debian/docs000066400000000000000000000000431312567024200200530ustar00rootroot00000000000000AUTHORS ChangeLog NEWS README TODO gImageReader-3.2.3/packaging/debian/gimagereader-common.install000066400000000000000000000002161312567024200244740ustar00rootroot00000000000000usr/share/icons/hicolor/*/apps/gimagereader.png usr/share/locale/*/LC_MESSAGES/gimagereader.mo usr/share/doc/gimagereader-common/manual*.html gImageReader-3.2.3/packaging/debian/gimagereader-gtk.install000066400000000000000000000002661312567024200237760ustar00rootroot00000000000000usr/bin/gimagereader-gtk usr/share/appdata/gimagereader-gtk.appdata.xml usr/share/applications/gimagereader-gtk.desktop usr/share/glib-2.0/schemas/org.gnome.gimagereader.gschema.xml gImageReader-3.2.3/packaging/debian/gimagereader-qt.install000066400000000000000000000001701312567024200236270ustar00rootroot00000000000000usr/bin/gimagereader-qt5 usr/share/appdata/gimagereader-qt5.appdata.xml usr/share/applications/gimagereader-qt5.desktop gImageReader-3.2.3/packaging/debian/rules000077500000000000000000000013651312567024200202700ustar00rootroot00000000000000#!/usr/bin/make -f export DEB_LDFLAGS_MAINT_APPEND=-Wl,--as-needed %: dh $@ override_dh_auto_configure: dh_auto_configure -Bbuild-gtk -- -DINTERFACE_TYPE=gtk -DENABLE_VERSIONCHECK=0 -DMANUAL_DIR="/usr/share/doc/gimagereader-common" dh_auto_configure -Bbuild-qt5 -- -DINTERFACE_TYPE=qt5 -DENABLE_VERSIONCHECK=0 -DMANUAL_DIR="/usr/share/doc/gimagereader-common" override_dh_auto_build: dh_auto_build -Dbuild-gtk dh_auto_build -Dbuild-qt5 override_dh_auto_install: dh_auto_install -Dbuild-gtk dh_auto_install -Dbuild-qt5 override_dh_install: dh_install --list-missing override_dh_strip: dh_strip --dbg-package=gimagereader-dbg .PHONY: override_dh_auto_configure override_dh_auto_build override_dh_install override_dh_install override_dh_strip gImageReader-3.2.3/packaging/debian/source/000077500000000000000000000000001312567024200205035ustar00rootroot00000000000000gImageReader-3.2.3/packaging/debian/source/format000066400000000000000000000000141312567024200217110ustar00rootroot000000000000003.0 (quilt) gImageReader-3.2.3/packaging/debian/watch000066400000000000000000000001741312567024200202360ustar00rootroot00000000000000version=3 http://ftp.gnome.org/pub/GNOME/sources/bijiben/([\d\.]+)/bijiben-(.*)\.(?:zip|tgz|tbz|txz|(?:tar\.(?:gz|bz2|xz))) gImageReader-3.2.3/packaging/gimagereader.spec.in000066400000000000000000000124541312567024200216640ustar00rootroot00000000000000Name: gimagereader Version: @PACKAGE_VERSION@ Release: 1%{?dist} Summary: A front-end to tesseract-ocr License: GPLv3+ URL: https://github.com/manisandro/gImageReader Source0: https://github.com/manisandro/gImageReader/releases/download/v%{version}/%{name}-%{version}.tar.xz BuildRequires: gcc-c++ BuildRequires: cmake BuildRequires: gtkmm30-devel BuildRequires: gtkspellmm30-devel BuildRequires: gtksourceviewmm3-devel BuildRequires: cairomm-devel BuildRequires: poppler-glib-devel BuildRequires: tesseract-devel BuildRequires: sane-backends-devel BuildRequires: intltool BuildRequires: desktop-file-utils BuildRequires: libappstream-glib BuildRequires: qt5-qtbase-devel BuildRequires: qtspell-qt5-devel BuildRequires: poppler-qt5-devel BuildRequires: json-glib-devel BuildRequires: libxml++-devel BuildRequires: podofo-devel Requires: hicolor-icon-theme %description gImageReader is a simple front-end to tesseract. Features include: - Import PDF documents and images from disk, scanning devices, clipboard and screenshots - Process multiple images and documents in one go - Manual or automatic recognition area definition - Recognize to plain text or to hOCR documents - Recognized text displayed directly next to the image - Post-process the recognized text, including spellchecking - Generate PDF documents from hOCR documents %package gtk Summary: A Gtk+ front-end to tesseract-ocr Requires: %{name}-common = %{version}-%{release} Obsoletes: %{name} < 2.94-1 %description gtk gImageReader is a simple front-end to tesseract. Features include: - Import PDF documents and images from disk, scanning devices, clipboard and screenshots - Process multiple images and documents in one go - Manual or automatic recognition area definition - Recognize to plain text or to hOCR documents - Recognized text displayed directly next to the image - Post-process the recognized text, including spellchecking - Generate PDF documents from hOCR documents This package contains the Gtk+ front-end. %package qt Summary: A Qt front-end to tesseract-ocr Requires: %{name}-common = %{version}-%{release} %description qt gImageReader is a simple front-end to tesseract. Features include: - Import PDF documents and images from disk, scanning devices, clipboard and screenshots - Process multiple images and documents in one go - Manual or automatic recognition area definition - Recognize to plain text or to hOCR documents - Recognized text displayed directly next to the image - Post-process the recognized text, including spellchecking - Generate PDF documents from hOCR documents This package contains the Qt front-end. %package common Summary: Common files for %{name} BuildArch: noarch %description common Common files for %{name}. %prep %setup -q %build mkdir build_gtk ( cd build_gtk %cmake -DINTERFACE_TYPE=gtk -DENABLE_VERSIONCHECK=0 -DMANUAL_DIR="%{_defaultdocdir}/%{name}-common" .. make %{?_smp_mflags} ) mkdir build_qt ( cd build_qt %cmake -DINTERFACE_TYPE=qt5 -DENABLE_VERSIONCHECK=0 -DMANUAL_DIR="%{_defaultdocdir}/%{name}-common" .. make %{?_smp_mflags} ) %install %make_install -C build_gtk %make_install -C build_qt %{_bindir}/desktop-file-validate %{buildroot}/%{_datadir}/applications/%{name}-gtk.desktop %{_bindir}/desktop-file-validate %{buildroot}/%{_datadir}/applications/%{name}-qt5.desktop %{_bindir}/appstream-util validate %{buildroot}%{_datadir}/appdata/%{name}-gtk.appdata.xml || : %{_bindir}/appstream-util validate %{buildroot}%{_datadir}/appdata/%{name}-qt5.appdata.xml || : %find_lang %{name} %post gtk /usr/bin/update-desktop-database &> /dev/null || : /bin/touch --no-create %{_datadir}/icons/hicolor &>/dev/null || : %postun gtk /usr/bin/update-desktop-database &> /dev/null || : if [ $1 -eq 0 ] ; then /usr/bin/glib-compile-schemas %{_datadir}/glib-2.0/schemas &> /dev/null || : /bin/touch --no-create %{_datadir}/icons/hicolor &>/dev/null /usr/bin/gtk-update-icon-cache %{_datadir}/icons/hicolor &>/dev/null || : fi %posttrans gtk /usr/bin/gtk-update-icon-cache %{_datadir}/icons/hicolor &>/dev/null || : /usr/bin/glib-compile-schemas %{_datadir}/glib-2.0/schemas &> /dev/null || : %post qt /usr/bin/update-desktop-database &> /dev/null || : /bin/touch --no-create %{_datadir}/icons/hicolor &>/dev/null || : %postun qt /usr/bin/update-desktop-database &> /dev/null || : if [ $1 -eq 0 ] ; then /bin/touch --no-create %{_datadir}/icons/hicolor &>/dev/null /usr/bin/gtk-update-icon-cache %{_datadir}/icons/hicolor &>/dev/null || : fi %posttrans qt /usr/bin/gtk-update-icon-cache %{_datadir}/icons/hicolor &>/dev/null || : %files common -f %{name}.lang %license COPYING %doc AUTHORS ChangeLog NEWS README TODO %{_datadir}/icons/hicolor/48x48/apps/%{name}.png %{_datadir}/icons/hicolor/128x128/apps/%{name}.png %{_datadir}/icons/hicolor/256x256/apps/%{name}.png %doc %{_defaultdocdir}/%{name}-common/manual*.html %files gtk %{_bindir}/%{name}-gtk %{_datadir}/appdata/%{name}-gtk.appdata.xml %{_datadir}/applications/%{name}-gtk.desktop %{_datadir}/glib-2.0/schemas/org.gnome.%{name}.gschema.xml %files qt %{_bindir}/%{name}-qt5 %{_datadir}/appdata/%{name}-qt5.appdata.xml %{_datadir}/applications/%{name}-qt5.desktop %changelog * @PACKAGE_DATE@ Sandro Mani - @PACKAGE_VERSION@-1 - gImageReader @PACKAGE_VERSION@. gImageReader-3.2.3/packaging/win32/000077500000000000000000000000001312567024200167235ustar00rootroot00000000000000gImageReader-3.2.3/packaging/win32/copyicons.sh000077500000000000000000000020421312567024200212660ustar00rootroot00000000000000#!/bin/sh cd "$(dirname "$(readlink -f "$0")")" if [ $# -lt 1 ]; then echo "Usage: $0 sourcethemedir" exit 1 fi topdir="$PWD" srcthemedir="$1" icons="\ $(grep -o "property name=\"icon_name\">[^<]*<" ../../gtk/data/*.ui | awk -F'[<>]' '{print $2}') $(grep -o "from_icon_name\s*(\s*\"[^\*]*\"" ../../gtk/src/{*.cc,*.hh} | awk -F'"' '{print $2}') $(grep -o "ÿçùlÿÿÿ ÿÿÿçÁ8ÿÿÿmÿÿÿ½ÿÿÿÿÿìììÿTNBÿ-#f/$ +µ²«Ýèçæþþþþÿÿÿÿÿÿÿþÿÿÿâÿÿÿ»ÿÿÿÿÿÿnÿÿÿmÿÿÿmÿÿÿmÿ³éiÿ ÿ¬nÿÿÿmÿÿÿmÿÿÿmÿçùlÿÿ2 ÿ÷ê^ÿW¾bÿÿ¬0 ÿÿÿmÿÿÿ½ÿÿÿÿÿìììÿTNBÿ-#e."YÿÿÿÿÿÿùÿÿÿÈÿÿÿžÿÿÿvÿêùlÿ©OÿŒ‰;ÿæÊLÿÿÿmÿÿÿmÿÿÿmÿ=Cÿÿûö\ÿÿÿmÿÿÿmÿÿÿmÿçùlÿÿBÿÿÿmÿ}àgÿÿ¶> ÿÿÿmÿÿÿ½ÿÿÿÿÿìëëÿTNBÿ-#e."Yÿÿÿÿÿÿàÿÿÿmÿÿÿmÿ‚¬\ÿÿ?=ÿÿ ÿðÛ?ÿÿÿmÿÿÿmÿ ÿ8ÿÿÿmÿÿÿmÿÿÿmÿÿÿmÿçùlÿÿBÿÿÿmÿ3‚SÿÿêË5ÿÿÿmÿÿÿ½ÿÿÿÿÿëëëÿTNBÿ-#e-"ZÿÿÿÿÿÿàÿÿÿmÿŽÔeÿÿЕ ÿÿÿmÿ6ŽYÿÿÃ^ÿÿÿmÿòümÿÿ ÿÿÿlÿÿÿmÿÿÿmÿÏœVÿçùlÿÿÿ&8ÿ-ÿÍ£6ÿÿÿmÿÿÿmÿÿÿ½ÿÿÿÿÿëëëÿTNBÿ0&e-"Zÿÿÿÿÿÿàÿÿÿmÿ*;ÿ ÿýûeÿÿÿmÿnÜfÿÿ¶: ÿÿÿmÿÿÿmÿÿÿ»—'ÿÒÝ`ÿPw@ÿ¡* ÿçùlÿ2"ÿo)ÿË»IÿÿýjÿÿÿmÿÿÿoÿÿÿÿÿÿÚÿÿÿÿÿëëêÿUOCÿ3)d-"Zÿÿÿÿÿÿàÿýÿmÿÿ;ÿÿÿmÿÿÿmÿiÛfÿÿÊrÿÿÿmÿÿÿmÿ€µaÿ ÿÿ!ÿŠq'ÿúò]ÿÿÿmÿÿÿmÿÿÿmÿÿÿsÿÿÿ”ÿÿÿ¿ÿÿÿîÿÿÿÿÿÿÿÿÿÿÿÿÿëêêÿWQEÿ8+d-"[ÿÿÿÿÿÿàÿðümÿÿ( ÿÿÿmÿÿÿmÿ8’[ÿÿóã@ÿÿÿmÿÿÿmÿÿÿmÿòúlÿæã`ÿÿþkÿÿÿmÿÿÿmÿÿÿ€ÿÿÿ§ÿÿÿÓÿÿÿûÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿêêêÿZSHÿ;0d-"[ÿÿÿÿÿÿàÿÿÿmÿ ÿÿäÄ;ÿºØeÿ ÿ©hÿÿÿmÿÿÿmÿÿÿmÿÿÿmÿÿÿmÿÿÿoÿÿÿÿÿÿ»ÿÿÿæÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿêêêÿ[UJÿ@6!d/$\ÿÿÿÿÿÿàÿÿÿmÿcœ\ÿÿÿ$ÿ¬‰-ÿÿÿlÿÿÿmÿÿÿmÿÿÿzÿÿÿ¢ÿÿÿÎÿÿÿöÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿêêéÿ^XMÿC;'c/$\ÿÿÿÿÿÿàÿÿÿmÿÿÿmÿÜèiÿÝÕZÿÿþjÿÿÿnÿÿÿŠÿÿÿ±ÿÿÿÝÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿúúúÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿêêéÿa[PÿH>,c/$]ÿÿÿÿÿÿàÿÿÿmÿÿÿmÿÿÿwÿÿÿžÿÿÿÅÿÿÿñÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿåååÿÀÀÀÿœœœÿ’’’ÿûûûÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿúúúÿÚÚÚÿ¶¶¶ÿ”””ÿâââÿÿÿÿÿÿÿÿÿêééÿc]SÿMC1c/$]ÿÿÿÿÿÿêÿÿÿ·ÿÿÿâÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿûûûÿÞÞÞÿºººÿ“““ÿ•••ÿºººÿÞÞÞÿýýýÿÿÿÿÿÿÿÿÿõõõÿÖÖÖÿ±±±ÿŽŽŽÿ¡¡¡ÿÆÆÆÿçççÿÿÿÿÿÿÿÿÿÿÿÿÿêééÿf`UÿRH6c/$]ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿôôôÿÒÒÒÿ®®®ÿÿ¡¡¡ÿÆÆÆÿìììÿÿÿÿÿÿÿÿÿÿÿÿÿêêêÿÆÆÆÿ¡¡¡ÿÿ®®®ÿÒÒÒÿ÷÷÷ÿÿÿÿÿÿÿÿÿûûûÿþþþÿÿÿÿÿÿÿÿÿééèÿicYÿVNN[ÿ=N\ÿNamÿzŽ™ÿŒŽ‰ÿÍ»ªÿÿÿÿÿõõôÿæåãÿÓÒÏÿ±¯ªÿ}ypÿ~vda-" aÿÿÿÿÿÿÿÿÿÿÿÿ÷÷÷ÿùúûÿÁÏØÿ…¢µÿzœ³ÿp¢ÿFctÿZyŠÿ`~ÿVv†ÿRrƒÿGcsÿ@Ueÿ>R`ÿWn|ÿ‰¥´ÿ¸ÝìÿÁëûÿÒÎÁÿ⸕ÿèÇ«ÿúúùÿììêÿËÉÆÿ “ÿƒtÿ{pÿzlI-" aÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¶ÅÏÿ]}ÿA]lÿFg{ÿFfwÿLk}ÿf‰™ÿHdvÿLk}ÿKfvÿq¡ÿj‰šÿ޳Âÿ¨ËØÿ¿ãñÿÉÝàÿؽ£ÿä¶‹ÿèÅŸÿѱÿ¼¹±ÿ—‘†ÿ„qÿ~xjÿ„ÿ‚}lÕ€€€/" bÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¨²´ÿIixÿPr…ÿCbrÿ@]lÿTwŽÿn›³ÿ´ÌÿÀÕÿ®Ôãÿ°»ÿ¬¨£ÿ¿ÊÉÿ̵ÿÝÀ¡ÿïÌ¢ÿк—ÿ¯œÿ•‡pÿ€jÿ“Ž‚ÿ£ž”ÿº·°ÿËÊÇÿ‡ƒtÿ†ƒrJ/" bÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¬²³ÿNpƒÿ~•Ÿÿ‚›ªÿ­¯¨ÿ§·¸ÿ±­¤ÿ£ÃÌÿ•ÏéÿªÃÉÿȧŠÿÌ }ÿÖ¡{ÿòÓ¨ÿèÅ¡ÿÔ§ˆÿ“jÿ­¢‘ÿޱÿÜÖÐÿ÷÷öÿýýýÿîîîÿ£¡›ÿ‰ƒs§0&dÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÛÍÁÿ±µ­ÿ˜Íâÿ©ž•ÿš–•ÿˆ—¥ÿ–› ÿȪ’ÿÏž{ÿͦ…ÿÑ«Šÿ×¼ÿؽŸÿέÿÊ¡ÿÀ‹fÿ¢‘~ÿòðîÿÿÿÿÿÿÿÿÿÿÿÿÿ÷÷÷ÿÍÍÌÿ‡ƒtòŽŽ{0&dÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿèÒÁÿÄÉÅÿÀÒÖÿÀ‰eÿÅŸ€ÿÙϼÿÜÑ»ÿàгÿçàÅÿÞβÿÖ¼œÿ×¶’ÿÁ˜vÿÒ£zÿìÀÿÚ¬€ÿ«–|ÿïîìÿÿÿÿÿÿÿÿÿüüüÿæææÿ’Ž…ÿމ{h0&eÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿä̼ÿÕ¹šÿàÒ¶ÿæÞÂÿèáÆÿåÛ¿ÿØÄ¥ÿ×»šÿЭŒÿÍ­ÿÙÆªÿäÚÀÿìÙ¶ÿëÂ’ÿ¡lOÿªrQÿ–yeÿëéçÿÿÿÿÿþþþÿóóóÿ¸¸´ÿŠ|¿ÿÿÿ0&eÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿàͽÿçÞÃÿÙÆªÿÑ­‰ÿÓ¨~ÿÑ¡wÿت~ÿíÃÿòÈ•ÿòÈ•ÿèÀ’ÿÍ«ˆÿÇ›vÿ¾hÿ–`Fÿ‘ZBÿ’o[ÿæåãÿÿÿÿÿúúúÿÙÙÙÿމ~ù˜’€*2(eÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ׿²ÿÄ”nÿÉ™qÿ¬zZÿ«iÿÀ£‰ÿÌ©ˆÿÔ¡uÿÜ¥rÿÑœpÿÁiÿªuVÿ‘ZBÿ‘ZBÿ‘ZBÿ‘ZBÿ¬…eÿãáßÿýýýÿëëëÿ –ÿ•{2(fÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ×µÿÈ­”ÿ¸Œkÿ’[CÿŸnUÿ«~eÿ渆ÿè­uÿµ|Wÿ‘ZBÿ‘ZBÿ‘ZBÿ‘ZBÿ‘ZBÿ‘ZBÿ‘ZBÿ’iTÿàÞÜÿöööÿÂÁ¿ÿ•‘ƒÒ™™™2(fÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿØÀ¯ÿØ«~ÿÔ¨ÿÓ¤zÿÊ­ÿÝȪÿÞÊ«ÿÇ–mÿ‘[Bÿ‘ZBÿ‘ZBÿ‘ZBÿ‘ZBÿ‘ZBÿ‘ZBÿ‘ZBÿŸzhÿßÞÜÿàààÿ˜’‡ù˜ˆ/4*gÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÖ»«ÿÇŽaÿ¶~Xÿ›dHÿ‘ZBÿ‘ZBÿ‘ZBÿ‘[Bÿ‘ZBÿ‘ZBÿ‘ZBÿ‘ZBÿ“]Eÿª€nÿƬ ÿÖÍÈÿÇÅ¿ÿÙØ×ÿ§¤›ÿœ–‰w;/hÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÓ¾´ÿ‘ZBÿ‘ZBÿ‘ZBÿ‘ZBÿ‘ZBÿ‘ZBÿ‘ZBÿ‘ZBÿšhRÿ¹–‡ÿÚÈÀÿùõôÿùùøÿêêèÿÙØÕÿ¶³¯ÿ¼º¶ÿž˜Š²ÿÿÿ=3 iÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÓ¾´ÿ‘ZBÿ‘ZBÿ‘ZBÿ‘ZBÿ‘ZBÿ£uaÿħšÿåØÓÿþþþÿÿÿÿÿÿÿÿÿüüüÿððïÿàßÝÿ¿¼ºÿ£¢žÿž™ŒÔ¥¥–B5"iÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÓ¾´ÿ‘ZBÿ•`Iÿ²‹zÿÓ½³ÿóîëÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿùøøÿØ×Õÿ±°®ÿ•“Œô‘Ž„³—‹Vª•• F:&jÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿìãÞÿåØÓÿþýýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿðððÿÓÒÑÿ¬«§ÿ‹‡€æ‹ˆ|–’€D™™™MA.jÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿøø÷ÿáááÿ¿½¼ÿ’ˆú‡vLjri‰‰vRH5jÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýýýÿïïîÿÕÕÔÿ¦¤Ÿÿƒ€vë|vgœ|teD€€€SL9kÿÿÿÿöööÿãããÿÀ¿¾ÿЇ€úytgËmfWpoo^SJ87‡xàvpeÜe]L‰e\K:UUUÿÿÿÿñÿÿÿÿÿÿÿÿÿøÿÿÿÿÀÿÿÿüÿÿÿàÿÿÿÿÿðÿÿ€ÿÿ€ÿÿ€ÿÿ€ÿÿ€ÿÿ€ÿÿ€ÿÿ€ÿÿ€ÿÿ€ÿÿ€ÿÿ€ÿÿ€ÿÿ€ÿÿ€ÿÿ€ÿÿ€ÿÿ€ÿÿ€ÿÿ€ÿÿ€ÿÿ€ÿÿ€ÿÿ€ÿÿ€ÿÿ€ÿÿ€ÿÿ€ÿÿ€?ÿÿ€?ÿÿ€ÿÿ€ÿÿÿ€ÿÿÿ€ÿÿÿ€ÿÿÿ€?ÿÿÿ€ÿÿÿÿ€ÿÿÿÿÿÿÿÿÿÿÿÿÿgImageReader-3.2.3/packaging/win32/gtk_skel/000077500000000000000000000000001312567024200205265ustar00rootroot00000000000000gImageReader-3.2.3/packaging/win32/gtk_skel/etc/000077500000000000000000000000001312567024200213015ustar00rootroot00000000000000gImageReader-3.2.3/packaging/win32/gtk_skel/etc/gtk-3.0/000077500000000000000000000000001312567024200223645ustar00rootroot00000000000000gImageReader-3.2.3/packaging/win32/gtk_skel/etc/gtk-3.0/gtk.immodules000066400000000000000000000032721312567024200250750ustar00rootroot00000000000000# GTK+ Input Method Modules file # Automatically generated file, do not edit # Created by Z:\usr\i686-pc-mingw32\sys-root\mingw\bin\gtk-query-immodules-3.0.exe from gtk+-3.0.9 # # ModulesPath = Z:\usr\i686-pc-mingw32\sys-root\mingw\lib\gtk-3.0\3.0.0\i686-pc-mingw32\immodules;Z:\usr\i686-pc-mingw32\sys-root\mingw\lib\gtk-3.0\3.0.0\immodules;Z:\usr\i686-pc-mingw32\sys-root\mingw\lib\gtk-3.0\i686-pc-mingw32\immodules;Z:\usr\i686-pc-mingw32\sys-root\mingw\lib\gtk-3.0\immodules # "../lib/gtk-3.0/3.0.0/immodules/im-ipa.dll" "ipa" "IPA" "gtk30" "../share/locale" "" "../lib/gtk-3.0/3.0.0/immodules/im-multipress.dll" "multipress" "Multipress" "gtk30" "" "" "../lib/gtk-3.0/3.0.0/immodules/im-cyrillic-translit.dll" "cyrillic_translit" "Cyrillic (Transliterated)" "gtk30" "../share/locale" "" "../lib/gtk-3.0/3.0.0/immodules/im-ime.dll" "ime" "Windows IME" "gtk+" "" "ja:ko:zh" "../lib/gtk-3.0/3.0.0/immodules/im-viqr.dll" "viqr" "Vietnamese (VIQR)" "gtk30" "../share/locale" "vi" "../lib/gtk-3.0/3.0.0/immodules/im-thai.dll" "thai" "Thai-Lao" "gtk30" "../share/locale" "lo:th" "../lib/gtk-3.0/3.0.0/immodules/im-inuktitut.dll" "inuktitut" "Inuktitut (Transliterated)" "gtk30" "../share/locale" "iu" "../lib/gtk-3.0/3.0.0/immodules/im-ti-et.dll" "ti_et" "Tigrigna-Ethiopian (EZ+)" "gtk30" "../share/locale" "ti" "../lib/gtk-3.0/3.0.0/immodules/im-ti-er.dll" "ti_er" "Tigrigna-Eritrean (EZ+)" "gtk30" "../share/locale" "ti" "../lib/gtk-3.0/3.0.0/immodules/im-cedilla.dll" "cedilla" "Cedilla" "gtk30" "../share/locale" "az:ca:co:fr:gv:oc:pt:sq:tr:wa" "../lib/gtk-3.0/3.0.0/immodules/im-am-et.dll" "am_et" "Amharic (EZ+)" "gtk30" "../share/locale" "am" gImageReader-3.2.3/packaging/win32/gtk_skel/etc/gtk-3.0/im-multipress.conf000066400000000000000000000015721312567024200260520ustar00rootroot00000000000000# Example configuration file for the GTK+ Multipress Input Method # Authored by Openismus GmbH, 2009. # # This file follows the GKeyFile format. On the left of the equal sign goes # the key that you press repeatedly to iterate through the text items listed # on the right-hand side. The list items are separated by semicolons ";" and # consist of one or more characters each. The backslash "\" is used to escape # characters; for instance "\;" for a literal semicolon. # # The example configuration below imitates the behavior of a standard mobile # phone by a major manufacturer, with German language setting. [keys] KP_1 = .;,;?;!;';";1;-;(;);@;/;:;_ KP_2 = a;b;c;2;ä;à;á;ã;â;Ã¥;æ;ç KP_3 = d;e;f;3;è;é;ë;ê;ð KP_4 = g;h;i;4;ì;í;î;ï KP_5 = j;k;l;5;£ KP_6 = m;n;o;6;ö;ò;ó;ô;õ;ø;ñ KP_7 = p;q;r;s;7;ß;$ KP_8 = t;u;v;8;ü;ù;ú;û KP_9 = w;x;y;z;9;ý;þ KP_0 = \s;0 gImageReader-3.2.3/packaging/win32/gtk_skel/etc/gtk-3.0/settings.ini000066400000000000000000000001021312567024200247160ustar00rootroot00000000000000[Settings] gtk-toolbar-style = icons gtk-icon-theme-name = hicolorgImageReader-3.2.3/packaging/win32/gtk_skel/etc/pango/000077500000000000000000000000001312567024200224055ustar00rootroot00000000000000gImageReader-3.2.3/packaging/win32/gtk_skel/etc/pango/pango.modules000066400000000000000000000023601312567024200251040ustar00rootroot00000000000000# Pango Modules file # Automatically generated file, do not edit # # ModulesPath = Z:\usr\i686-w64-mingw32\sys-root\mingw\lib\pango\1.8.0\modules # ".\\pango-indic-lang.dll" devaIndicScriptEngineLang PangoEngineLang PangoRenderNone devanagari:* ".\\pango-indic-lang.dll" bengIndicScriptEngineLang PangoEngineLang PangoRenderNone bengali:* ".\\pango-indic-lang.dll" guruIndicScriptEngineLang PangoEngineLang PangoRenderNone gurmukhi:* ".\\pango-indic-lang.dll" gujrIndicScriptEngineLang PangoEngineLang PangoRenderNone gujarati:* ".\\pango-indic-lang.dll" oryaIndicScriptEngineLang PangoEngineLang PangoRenderNone oriya:* ".\\pango-indic-lang.dll" tamlIndicScriptEngineLang PangoEngineLang PangoRenderNone tamil:* ".\\pango-indic-lang.dll" teluIndicScriptEngineLang PangoEngineLang PangoRenderNone telugu:* ".\\pango-indic-lang.dll" kndaIndicScriptEngineLang PangoEngineLang PangoRenderNone kannada:* ".\\pango-indic-lang.dll" mlymIndicScriptEngineLang PangoEngineLang PangoRenderNone malayalam:* ".\\pango-indic-lang.dll" sinhIndicScriptEngineLang PangoEngineLang PangoRenderNone sinhala:* ".\\pango-arabic-lang.dll" ArabicScriptEngineLang PangoEngineLang PangoRenderNone arabic:* ".\\pango-basic-fc.dll" BasicScriptEngineFc PangoEngineShape PangoRenderFc common: gImageReader-3.2.3/packaging/win32/gtk_skel/share/000077500000000000000000000000001312567024200216305ustar00rootroot00000000000000gImageReader-3.2.3/packaging/win32/gtk_skel/share/icons/000077500000000000000000000000001312567024200227435ustar00rootroot00000000000000gImageReader-3.2.3/packaging/win32/gtk_skel/share/icons/hicolor/000077500000000000000000000000001312567024200244025ustar00rootroot00000000000000gImageReader-3.2.3/packaging/win32/gtk_skel/share/icons/hicolor/16x16/000077500000000000000000000000001312567024200251675ustar00rootroot00000000000000gImageReader-3.2.3/packaging/win32/gtk_skel/share/icons/hicolor/16x16/actions/000077500000000000000000000000001312567024200266275ustar00rootroot00000000000000action-unavailable-symbolic.symbolic.png000066400000000000000000000005021312567024200364500ustar00rootroot00000000000000gImageReader-3.2.3/packaging/win32/gtk_skel/share/icons/hicolor/16x16/actions‰PNG  IHDRóÿasBIT|dˆùIDAT8µÒ»JQà,,ÔBc°ó5ÄÒ (^ Q_ÄNA ꓈••…`a/ ‰âcXÓ†Äb'p\v³XøÃÀžù/Ì9;üæqŠ|D=ã$¸‰ØE£’úÄv™yƒ>`u,cOÁ °“7×ð‚ó‚ð)Ü$“t° šAÜW˜»hÅ÷Y*zf£Â¼‚õ8·Ra?š³9óuÎ s¢WP«0Ãt|§ï!Þ(;Åjpoió*šf¸ þ"m.ÅHãßTf>¾'Û‘_8Š»ÐÆ–ìMf°†»à†8(‡‘^¶ÊÝIæ1긔íF?ªw^¬2ÿ?¸G^Ÿ«þIEND®B`‚document-new-symbolic.symbolic.png000066400000000000000000000002711312567024200353220ustar00rootroot00000000000000gImageReader-3.2.3/packaging/win32/gtk_skel/share/icons/hicolor/16x16/actions‰PNG  IHDRóÿasBIT|dˆpIDAT8c` "ØÁÀÀð oF’c„b¼à?>„E°`C¶‰ MÆÿ‡Mñ1T=ÀÆ`d±ÈIEND®B`‚document-save-as-symbolic.symbolic.png000066400000000000000000000003561312567024200360740ustar00rootroot00000000000000gImageReader-3.2.3/packaging/win32/gtk_skel/share/icons/hicolor/16x16/actions‰PNG  IHDRóÿasBIT|dˆ¥IDAT8‘A 1 E߈gâÖkè‘æ6ây]Ïl=ua;~CZ¢ Ÿ4?Møprð\pÈ^°Á’»úÁä²]GˆàŽàQgnâHK%êp*‰wé ê)R ³Ißà&æ°wŨEÔ<——8cç±ä jRýŒ´É{{¹ŠŠ]ÑQôÉÜ5ש¿¾—øÁÜ-èÝÊëûŸz9Žcdˆ IEND®B`‚edit-clear-symbolic.symbolic.png000066400000000000000000000003431312567024200347260ustar00rootroot00000000000000gImageReader-3.2.3/packaging/win32/gtk_skel/share/icons/hicolor/16x16/actions‰PNG  IHDRóÿasBIT|dˆšIDAT8Í’1 ƒ@EŸ /‘*… Šé-r+[ïe•ÂcXYÁ>¥iF2¨c6ˆà‡ÙÙù?3 gEŒñÜCžbyüE(€0©-¬—¹OLòx.°e»nÊåhu¼çƒPH/ X.îÊv,y¾6Kd"ô¹ÔÌ5–†çð·H°"Ðßo¡vè93=n“¤a?IEND®B`‚edit-copy-symbolic.symbolic.png000066400000000000000000000002131312567024200346060ustar00rootroot00000000000000gImageReader-3.2.3/packaging/win32/gtk_skel/share/icons/hicolor/16x16/actions‰PNG  IHDRóÿasBIT|dˆBIDAT8c`Là?üŸ&&" Æ«fà `Á#ÇH„á]@0`‰ñ^×Ql 6Aºº€\ˆUˆ-ªÉ´”F».ÿ.(çIEND®B`‚edit-delete-symbolic.symbolic.png000066400000000000000000000004371312567024200351060ustar00rootroot00000000000000gImageReader-3.2.3/packaging/win32/gtk_skel/share/icons/hicolor/16x16/actions‰PNG  IHDRóÿasBIT|dˆÖIDAT8µ“AÁP†?ÂNÙ[Y4R°°T. HOq+ A9AæÅ˜TKÄŸüÉë›ùgþyïþ€°¶ÀQ¸"À+O€+p{à 0Χ9bdzlçu¶L€:@Y ÌÌ|%`œÅöPöšÀT;X›Ùï=Yû&'ÖÜmo;“sÒ#ÜÌ™T€šú® 5^4v„¾²íË:09+] 2A'8ÕÕq¡ xcžbwqL'ßà5ìaü6ãòGa’‰Ø¹x¸@7–óTãtiäAAÚ9­ušgAÖ«ˆEœ9ö«ˆá,†×¾;ÿI ;øˆ¥«0ùµ8GSôWˆ»¸Çv™I£äò0þ£u&«boá1ø´×unâ9æOe)ÊÐÂn«ü?H6V¶ÉO¸IEND®B`‚edit-redo-symbolic.symbolic.png000066400000000000000000000002751312567024200345750ustar00rootroot00000000000000gImageReader-3.2.3/packaging/win32/gtk_skel/share/icons/hicolor/16x16/actions‰PNG  IHDRóÿasBIT|dˆtIDAT8å‘1@@E_¥ÒJˆóhpqD«£áºm¬Â$D–•éÄO¦šÿ_ægà7rÀäZ@'È4€Þ@*ÀVÌw3é5\BA@/ˈ41Äž …ϦÖs“ ßX+GO•JöŸ[-àƒÚx\0Hê/IEND®B`‚edit-undo-symbolic.symbolic.png000066400000000000000000000003211312567024200346010ustar00rootroot00000000000000gImageReader-3.2.3/packaging/win32/gtk_skel/share/icons/hicolor/16x16/actions‰PNG  IHDRóÿasBIT|dˆˆIDAT8ÝÑ; ÂP…á¯J'Xøq?º"ÉEEAÅÂUØ¥Š…SHÈÃÜJ<0Õ™ÿÜ™¹ü¥f8¡L'¸|ì q øŽyx/–-Uà€u×èßTmÈ·h8cTñ3lÂß7­²À#š¶5þ ¼gS,½XýÆ y×mú¼Á*% À.þa½9/ÝÆ¢‚ÔIEND®B`‚go-down-symbolic.symbolic.png000066400000000000000000000002541312567024200342700ustar00rootroot00000000000000gImageReader-3.2.3/packaging/win32/gtk_skel/share/icons/hicolor/16x16/actions‰PNG  IHDRóÿasBIT|dˆcIDAT8íA €0 ç5øÿÿ¨ V_S/BMk𪠅Âl6Kà—Uf@:õÞtÜe˜¼€¬j8€Ñ°Á°½b!áa¯j®þ½û4›„7{M6}áÍ^“ôvø+:j§ (ÉoÅ(IEND®B`‚go-up-symbolic.symbolic.png000066400000000000000000000002411312567024200337410ustar00rootroot00000000000000gImageReader-3.2.3/packaging/win32/gtk_skel/share/icons/hicolor/16x16/actions‰PNG  IHDRóÿasBIT|dˆXIDAT8c`„€“Ä®000Üd``"Wó(&É †ëP×ÑØ½ƒló ¨­bHbx]‚M3 eÈyNEöÚ9lÀ$ðùSÉ¢Qî+ )>§ºJIEND®B`‚insert-text-symbolic.symbolic.png000066400000000000000000000003341312567024200352030ustar00rootroot00000000000000gImageReader-3.2.3/packaging/win32/gtk_skel/share/icons/hicolor/16x16/actions‰PNG  IHDRóÿasBIT|dˆ“IDAT8Í’Á ƒ0GQD  I© ùƒ¨"?   Iƒ"çÁB"°…m>ieɺ[ïY[¬G`€ÌÑd0«Ú3ðq“Á+Õà7ÝÂiUµ^qÅߥñ4*¸¦ŽðÖy‰ëÂpp„L&ÏTƒÿÁ=PJ=‘Ñ;5<$«»`.Àï§µ@cÓŽÔÒz_>?ÅH°ŒW1¿IEND®B`‚list-add-symbolic.symbolic.png000066400000000000000000000001611312567024200344140ustar00rootroot00000000000000gImageReader-3.2.3/packaging/win32/gtk_skel/share/icons/hicolor/16x16/actions‰PNG  IHDRóÿasBIT|dˆ(IDAT8c`öà?ãL”Ú0ð0¢ññú›>Š]@Œ„Xò¦ ËSáwIEND®B`‚list-remove-symbolic.symbolic.png000066400000000000000000000001451312567024200351630ustar00rootroot00000000000000gImageReader-3.2.3/packaging/win32/gtk_skel/share/icons/hicolor/16x16/actions‰PNG  IHDRóÿasBIT|dˆIDAT8c`Ã0¢ñÿ“ª‰znCC_¾?‚WIEND®B`‚object-select-symbolic.symbolic.png000066400000000000000000000002461312567024200354420ustar00rootroot00000000000000gImageReader-3.2.3/packaging/win32/gtk_skel/share/icons/hicolor/16x16/actions‰PNG  IHDRóÿasBIT|dˆ]IDAT8c`q€‘RÍÓ:(ÑüŠ ‚ìT&†¹HšÿCù8½ÓÀÀÀ0ªÝæÿHr85#Û‚Ífœš±h Z3²!èN&èlB†¤Ý²4Ã%šé·3&î(H”IEND®B`‚pan-down-symbolic.symbolic.png000066400000000000000000000002221312567024200344340ustar00rootroot00000000000000gImageReader-3.2.3/packaging/win32/gtk_skel/share/icons/hicolor/16x16/actions‰PNG  IHDRóÿasBIT|dˆIIDAT8c`F4¾ ‘úÞã’Èg``øÇÀÀðþÇÀÀNÈt\†¥—!$iF7¯f<Ld``à€²g’jû( çtDžÙeIEND®B`‚pan-end-symbolic.symbolic.png000066400000000000000000000002211312567024200342320ustar00rootroot00000000000000gImageReader-3.2.3/packaging/win32/gtk_skel/share/icons/hicolor/16x16/actions‰PNG  IHDRóÿasBIT|dˆHIDAT8ÝÒ1 €0À£°Ïìèèë[Dp04{Ž á·YÐf€Šmˆ‘+!wà)ɼ· :ÖˆÊ'—9Ž—?–Xù†§?‡IEND®B`‚pan-start-symbolic.symbolic.png000066400000000000000000000002321312567024200346230ustar00rootroot00000000000000gImageReader-3.2.3/packaging/win32/gtk_skel/share/icons/hicolor/16x16/actions‰PNG  IHDRóÿasBIT|dˆQIDAT8c`1 “Ÿ\Í ÿ(ÑL–ÈšI6]3N˜pÀHŠm¸@Ã?B. Ų @6«,D0Jÿ'׃ùœíQyIEND®B`‚pan-up-symbolic.symbolic.png000066400000000000000000000001641312567024200341160ustar00rootroot00000000000000gImageReader-3.2.3/packaging/win32/gtk_skel/share/icons/hicolor/16x16/actions‰PNG  IHDRóÿasBIT|dˆ+IDAT8c`4åPLh```øÅ ”h&Ùlš‰6Ÿf²½3 h lÛ+ðà(IEND®B`‚view-refresh-symbolic.symbolic.png000066400000000000000000000004231312567024200353220ustar00rootroot00000000000000gImageReader-3.2.3/packaging/win32/gtk_skel/share/icons/hicolor/16x16/actions‰PNG  IHDRóÿasBIT|dˆÊIDAT8ÍÒÑJBQÐeˆ½™ TÿÒ'„ø„ýcRX’E ýC¢„>4v»2÷>»aØœÙ3Ã>ç û†C p‡VxÄMh0Â:k>Ã4Ä,^pþï\B Ï!¼átÑÃ<´iÕ€a$ßqœ¸;ÁÇŽ£"ÙKš·wÞ¾#ÙMT½ hÿ/“$÷‡ƒà×à‹ºâ: ÂÖ íDoc¬âÿù]’§(˜££ˆ¾âÇu.N»Å$jjÑÂ5îñ…OÜâJ±Ê{† óGÂsQ/ IEND®B`‚zoom-fit-best-symbolic.symbolic.png000066400000000000000000000002571312567024200354200ustar00rootroot00000000000000gImageReader-3.2.3/packaging/win32/gtk_skel/share/icons/hicolor/16x16/actions‰PNG  IHDRóÿasBIT|dˆfIDAT8Í’K €0 D_ÄûD{ÆÆBµÓ.¦!™¤øðäÚ®"k êcáÀ¢‚>ë\f‰ | oX&)ª}å†~ &°N¤Xíg'u™ê/t‘¨p`OøKR±“?¦IEND®B`‚zoom-in-symbolic.symbolic.png000066400000000000000000000002521312567024200343040ustar00rootroot00000000000000gImageReader-3.2.3/packaging/win32/gtk_skel/share/icons/hicolor/16x16/actions‰PNG  IHDRóÿasBIT|dˆaIDAT8Í’A €0 §âÿ¢}£ñ Ñ&Í¡àBtv …?¥2y½Ô àrs6¢qC)ÉRh•ÒìAó×üzæ2m6/7ð&ÃXƒÊ?xv- 3à,”-Î ¡Ñ»žÿ"IEND®B`‚zoom-original-symbolic.symbolic.png000066400000000000000000000002531312567024200355030ustar00rootroot00000000000000gImageReader-3.2.3/packaging/win32/gtk_skel/share/icons/hicolor/16x16/actions‰PNG  IHDRóÿasBIT|dˆbIDAT8Í’K€ Ãý¢ÜÅY7búY| B¦ ð§4@‚kï—Š\ÃÞŠÛ¤q¡S&9Ÿ"ÓÊ2ðì\ƒPK ”õ€êœ»sЙðÖj@#àH<öqnf„ç9ä)IEND®B`‚zoom-out-symbolic.symbolic.png000066400000000000000000000002421312567024200345040ustar00rootroot00000000000000gImageReader-3.2.3/packaging/win32/gtk_skel/share/icons/hicolor/16x16/actions‰PNG  IHDRóÿasBIT|dˆYIDAT8Í’Q !§¥û¤:cîW!-…±=ð#±QÂM*€#µOAêð^I€gˆsâ@£ìh'ù™Ÿ5M`6ô5Às½V 6ˆÙÑì°^ÔÄ·ôÖIEND®B`‚gImageReader-3.2.3/packaging/win32/gtk_skel/share/icons/hicolor/16x16/apps/000077500000000000000000000000001312567024200261325ustar00rootroot00000000000000help-contents-symbolic.symbolic.png000066400000000000000000000005631312567024200350070ustar00rootroot00000000000000gImageReader-3.2.3/packaging/win32/gtk_skel/share/icons/hicolor/16x16/apps‰PNG  IHDRóÿasBIT|dˆ*IDAT8Ó»/ƒaÇñOÅ5iÄP &—Í &…ÄDb1›ü øÄf°YìEb)M° ‹¸5ÕžGҼ훊“œœ7ç9ï÷¹œó#ØžPOñ7 CÂ2èÂkü¾ODÂŽ°†Zãb6îRHù&"¼ŽÃäIþ€I<ÄÚýÿ` e|¡:S »°‚qq†*nPÂúðÕôªÃ61c £­vJ28GÏøˆ1ó™v€Y¼cËèŶñ‰™$ ù9Ü ÷¾ÀžÐÂbô\;À5æQÁ".…öÁ¶’šÛx*LÚ.¦c¬á$®b}6 Ðc¼à*Æ£˜o´šƒ VÑa< bji™y:’&¦FÁ· ®êor]Ñ497zYP$øTVV˜výQƒIEND®B`‚text-editor-symbolic.symbolic.png000066400000000000000000000003401312567024200344650ustar00rootroot00000000000000gImageReader-3.2.3/packaging/win32/gtk_skel/share/icons/hicolor/16x16/apps‰PNG  IHDRóÿasBIT|dˆ—IDAT8•’Á €0 EŸâÁ¼‰ó¸”`.¤âºg/z©lÓÔ@ Iú_!+p+yFhb™ÓGã€h$ NÌ{ßë€Ó÷öÊpçÄyóuía0[47оƒ€ßÀ(‡ )¶¦8ÐÄ.Åší¨Ûàûçà®¶H…Ң̽¨…t³QëOÍ"‹fSïó$IEND®B`‚gImageReader-3.2.3/packaging/win32/gtk_skel/share/icons/hicolor/16x16/categories/000077500000000000000000000000001312567024200273145ustar00rootroot00000000000000applications-system-symbolic.symbolic.png000066400000000000000000000004371312567024200374160ustar00rootroot00000000000000gImageReader-3.2.3/packaging/win32/gtk_skel/share/icons/hicolor/16x16/categories‰PNG  IHDRóÿasBIT|dˆÖIDAT8µÒ1JQ‡ñ_ÔV°^Òx±°³Obá\kkO È!L„46š ¼€ ’¬…Ãw‰+äƒif¾yü÷X3wui8Æ}ôðšè%7‰³`ké€ ìcŒ'ì$‹=ìÆi¥‡)ª–˜ÆùÅ)¸ŽøŽs‰2¹*Î = ®0¯M*†”µú<=?8Ä,BÑp@‘Ú,.V\Hþ²Â…†6Sìã ÷8À>ðŒmœá2þ¯×xÀãò”?ã7'_0¬5“«â´Òù+¯b”éëã•JÐ7 »kIEND®B`‚gImageReader-3.2.3/packaging/win32/gtk_skel/share/icons/hicolor/16x16/devices/000077500000000000000000000000001312567024200266115ustar00rootroot00000000000000scanner-symbolic.symbolic.png000066400000000000000000000004021312567024200343240ustar00rootroot00000000000000gImageReader-3.2.3/packaging/win32/gtk_skel/share/icons/hicolor/16x16/devices‰PNG  IHDRóÿasBIT|dˆ¹IDAT8•ÐMAàÏŒ…Ä)ÃžÄ ÜÄÜÀ=ÜÂDbãgÃBXx„¡MO%/TWU×k˜`ƒ[ælÂJœ˜ŸsBÙÆ5ûX`å?˜…çZ9sR(Cóîm¬Ô_‡çÝšê?µÅ9Â6ãõ-†¿Rw!¨Ã-´ U¹xrÓ„yYÑ}Dà‚=Ž8Ĺϩ–»ÂK—jpNð*‘ èe4Iä¬ñBQ/ù@«J4 øjwÝ—KÀÖÆîhIEND®B`‚gImageReader-3.2.3/packaging/win32/gtk_skel/share/icons/hicolor/16x16/places/000077500000000000000000000000001312567024200264365ustar00rootroot00000000000000user-trash-symbolic.symbolic.png000066400000000000000000000002431312567024200346200ustar00rootroot00000000000000gImageReader-3.2.3/packaging/win32/gtk_skel/share/icons/hicolor/16x16/places‰PNG  IHDRóÿasBIT|dˆZIDAT8c`@€@†W ÿñàgPuXÁS¨"|à?Ô8`$B>ÀÈDfêX ‘¬—þã 1Åa0jnqдsÁ3(/'"' ×è“•±fi@ü+{úÖ´IEND®B`‚gImageReader-3.2.3/packaging/win32/gtk_skel/share/icons/hicolor/16x16/status/000077500000000000000000000000001312567024200265125ustar00rootroot00000000000000gImageReader-3.2.3/packaging/win32/gtk_skel/share/icons/hicolor/16x16/status/image-missing.png000066400000000000000000000011001312567024200317410ustar00rootroot00000000000000‰PNG  IHDRóÿasBIT|dˆ pHYs × ×B(›xtEXtSoftwarewww.inkscape.org›î<½IDAT8¥“Ïj“AÅwfÒ@Ò„J>!OP×yA}„B"nD,„B_C¢Hö¢PºÜ(EDƒ ›E»È^óç›ûå›ë"K HÌb†{ï¹ç0GÌŒÛ |ÿùõÔÌîßThf¤”°d$K¤”À8á[ÿÌRJö¿(ËÒ>~:µ "¼ÿðŽã+‹•­-=|LT%”e Àd2a8nlrÎá¼Ã‰v» €F%hT¢FTõ_ƒBÀû€8‡ˆ –æÆ«F²Ic¤(ŠcÁ9Á¯6*•Êb€âr€*³r6/vï>øÅç1Ÿ“,½šKÐ+ )•xïAY°åù”¨Êt:!¥D–Ý¥Z­.zÖ /dev/null mingw$bits-cmake -DINTERFACE_TYPE=$iface ../../ mingw$bits-make -j4 DESTDIR="${installroot}_" install VERBOSE=1 mv ${installroot}_$MINGWROOT $installroot rm -rf ${installroot}_ cp $win32dir/gimagereader-icon.rc $builddir cp $win32dir/gimagereader.ico $builddir cp $win32dir/installer.nsi $builddir # Collect dependencies function isnativedll { # If the import library exists but not the dynamic library, the dll ist most likely a native one local lower=${1,,} [ ! -e $MINGWROOT/bin/$1 ] && [ -f $MINGWROOT/lib/lib${lower/%.*/.a} ] && return 0; return 1; } function linkDep { # Link the specified binary dependency and it's dependencies local destdir="$installroot/${2:-$(dirname $1)}" local name="$(basename $1)" test -e "$destdir/$name" && return 0 echo "Linking $1..." [ ! -e "$MINGWROOT/$1" ] && (echo "Error: missing $MINGWROOT/$1"; return 1) mkdir -p "$destdir" || return 1 ln -sf "$MINGWROOT/$1" "$destdir/$name" || return 1 autoLinkDeps $destdir/$name || return 1 if [ $withdebug ]; then [ -e "$MINGWROOT/$1.debug" ] && ln -sf "$MINGWROOT/$1.debug" "$destdir/$name.debug" || echo "Warning: missing $name.debug" fi return 0 } function autoLinkDeps { # Collects and links the dependencies of the specified binary for dep in $(mingw-objdump -p "$1" | grep "DLL Name" | awk '{print $3}'); do if ! isnativedll "$dep"; then linkDep bin/$dep || return 1 fi done return 0 } autoLinkDeps $installroot/bin/gimagereader-$iface.exe linkDep bin/gdb.exe linkDep bin/twaindsm.dll linkDep lib/enchant/libenchant_myspell.dll if [ "$iface" == "gtk" ]; then linkDep bin/gspawn-win$bits-helper-console.exe linkDep bin/gspawn-win$bits-helper.exe for loader in $(ls -1 $MINGWROOT/lib/gdk-pixbuf-2.0/2.10.0/loaders/libpixbufloader-*.dll); do linkDep $(echo $loader | sed "s|^$MINGWROOT/||") done # Install locale files ( cd $MINGWROOT for file in $(find share/locale -type f -name "gtk*.mo" -or -name "glib*.mo" -or -name "gdk*.mo" -or -name "atk*.mo"); do install -Dpm 0644 $file $installroot/$file done ) # Copy skeleton cp -R $win32dir/gtk_skel/* $installroot # Install and compile schemas install -Dpm 0644 /usr/share/glib-2.0/schemas/org.gtk.Settings.FileChooser.gschema.xml $installroot/share/glib-2.0/schemas/org.gtk.Settings.FileChooser.gschema.xml glib-compile-schemas $installroot/share/glib-2.0/schemas elif [ "$iface" == "qt4" ]; then linkDep $(ls $MINGWROOT/bin/libssl-*.dll | sed "s|^$MINGWROOT/||") linkDep $(ls $MINGWROOT/bin/libcrypto-*.dll | sed "s|^$MINGWROOT/||") linkDep lib/qt4/plugins/imageformats/qgif4.dll bin/imageformats linkDep lib/qt4/plugins/imageformats/qico4.dll bin/imageformats linkDep lib/qt4/plugins/imageformats/qmng4.dll bin/imageformats linkDep lib/qt4/plugins/imageformats/qtga4.dll bin/imageformats linkDep lib/qt4/plugins/imageformats/qsvg4.dll bin/imageformats linkDep lib/qt4/plugins/imageformats/qtiff4.dll bin/imageformats linkDep lib/qt4/plugins/imageformats/qjpeg4.dll bin/imageformats # Install locale files mkdir -p $installroot/share/qt4/translations/ cp -a $MINGWROOT/share/qt4/translations/{qt_*.qm,QtSpell_*.qm} $installroot/share/qt4/translations elif [ "$iface" == "qt5" ]; then linkDep $(ls $MINGWROOT/bin/libssl-*.dll | sed "s|^$MINGWROOT/||") linkDep $(ls $MINGWROOT/bin/libcrypto-*.dll | sed "s|^$MINGWROOT/||") linkDep lib/qt5/plugins/imageformats/qgif.dll bin/imageformats linkDep lib/qt5/plugins/imageformats/qicns.dll bin/imageformats linkDep lib/qt5/plugins/imageformats/qico.dll bin/imageformats linkDep lib/qt5/plugins/imageformats/qjp2.dll bin/imageformats linkDep lib/qt5/plugins/imageformats/qjpeg.dll bin/imageformats linkDep lib/qt5/plugins/imageformats/qtga.dll bin/imageformats linkDep lib/qt5/plugins/imageformats/qtiff.dll bin/imageformats linkDep lib/qt5/plugins/imageformats/qwbmp.dll bin/imageformats linkDep lib/qt5/plugins/imageformats/qwebp.dll bin/imageformats linkDep lib/qt5/plugins/platforms/qwindows.dll bin/platforms # Install locale files mkdir -p $installroot/share/qt5/translations/ cp -a $MINGWROOT/share/qt5/translations/{qt_*.qm,qtbase_*.qm,QtSpell_*.qm} $installroot/share/qt5/translations rm -f $installroot/share/qt5/translations/qt_help_*.qm fi cp -R $win32dir/skel/* $installroot # Add english language data and spelling dictionaries install -Dpm 0644 /usr/share/tesseract/tessdata/eng.traineddata $installroot/share/tessdata/eng.traineddata install -Dpm 0644 /usr/share/myspell/en_US.dic $installroot/share/myspell/dicts/en_US.dic install -Dpm 0644 /usr/share/myspell/en_US.aff $installroot/share/myspell/dicts/en_US.aff # Copy isocodes install -Dpm 0644 /usr/share/xml/iso-codes/iso_639.xml $installroot/share/xml/iso-codes/iso_639.xml install -Dpm 0644 /usr/share/xml/iso-codes/iso_3166.xml $installroot/share/xml/iso-codes/iso_3166.xml ( cd /usr/ for file in $(find share/locale -type f -name "iso_*.mo"); do install -Dpm 0644 $file $installroot/$file done ) # Remove unused files rm -rf $installroot/share/applications rm -rf $installroot/share/appdata # Build the installer progName=$(grep -oP 'SET\(PACKAGE_NAME \K(\w+)(?=\))' $srcdir/CMakeLists.txt) progVersion=$(grep -oP 'SET\(PACKAGE_VERSION \K([\d\.]+)(?=\))' $srcdir/CMakeLists.txt) if [ $withdebug ]; then variant="_debug" fi makensis -DNAME=$progName -DARCH=$arch -DVARIANT="$variant" -DPROGVERSION="$progVersion" -DIFACE="$iface" installer.nsi; # Cleanup rm -rf $installroot echo "Installer written to $PWD/${progName}_${progVersion}_${iface}_${arch}.exe" gImageReader-3.2.3/packaging/win32/skel/000077500000000000000000000000001312567024200176615ustar00rootroot00000000000000gImageReader-3.2.3/packaging/win32/skel/share/000077500000000000000000000000001312567024200207635ustar00rootroot00000000000000gImageReader-3.2.3/packaging/win32/skel/share/enchant/000077500000000000000000000000001312567024200224035ustar00rootroot00000000000000gImageReader-3.2.3/packaging/win32/skel/share/enchant/enchant.ordering000066400000000000000000000002471312567024200255610ustar00rootroot00000000000000*:myspell,aspell,ispell fi:voikko,ispell,myspell,aspell fi_FI:voikko,ispell,myspell,aspell he:hspell,myspell he_IL:hspell,myspell yi:uspell tr:zemberek tr_TR:zemberek gImageReader-3.2.3/packaging/win32/skel/share/icons/000077500000000000000000000000001312567024200220765ustar00rootroot00000000000000gImageReader-3.2.3/packaging/win32/skel/share/icons/hicolor/000077500000000000000000000000001312567024200235355ustar00rootroot00000000000000gImageReader-3.2.3/packaging/win32/skel/share/icons/hicolor/16x16/000077500000000000000000000000001312567024200243225ustar00rootroot00000000000000gImageReader-3.2.3/packaging/win32/skel/share/icons/hicolor/16x16/actions/000077500000000000000000000000001312567024200257625ustar00rootroot00000000000000gImageReader-3.2.3/packaging/win32/skel/share/icons/hicolor/16x16/actions/dialog-cancel.png000066400000000000000000000014761312567024200311620ustar00rootroot00000000000000‰PNG  IHDRóÿasBIT|dˆ pHYs»»:ìãâtEXtSoftwarewww.inkscape.org›î<»IDATx¥“Ð#Y…O;­ØÉÚ¶]ZÛ¶wËk›¥Ý™ÂضmÛÖo‡´§“±õ•ñz÷ÞóÛ¶qHìÁÂ1 q«¾ýöò–Ù³‡¦,(KçŸ%ËDq×® ò•WÒ‘»ï~öÚ_Ý€ƒ8ä³^zéÿ– Þ Üv+ç»âJH‘‚€ÒÖ†öeËб|¹{è¡®÷ðéáU¹iÒ„/xí5‚ìš1 …†ð<÷…ÀsÉe(ås¨8ÈN>þDç}!Õ€%γ×wê´â¼Çæ iX7v\ŠÓŒ?$†Ä1LLb™©¸ùI@Í¥Ñ0m¦zÅ'Ÿ\³3 ‡gf9æ(ŠÆšñÒA]þ®®ÿK“¤.ˆÂ ×=wx^F¶©º¦CJF¸Š³ËJSS”øQ·z9¨²öçÇŠÒ2P’²ǽ0ôÀ}çÓù2´ö&¬Ÿ9Í›7‚ôz«Î¾Rin–t†B©£<Ëö­ÈnQX¹õºó°al%…µK–[qUÿéšêv¡âTÜê µ+WÂRPyn‘ÀÛç™s—BkÜŽ+×Zþ’ú Œâ-¦bT‹ŽFÆ6@„OäçÑ(žÇ×´å4浤,#¿eÛýMQ|‘§l4ŠSq«/`b±f€–×`2E™k/ƒp3˜¦Z– Y¯½çȽ%)öò?š™"H{³ï¸øž{žm3y•÷³0Š B&i_ÀåšÛ×íþ<¶°ùœ>¯VœCŠÔÇ)RͰÁ_b‰`JD y’†H3ðSÈTËÚ5ûœgžïüÚÁEÚG'dëøñï^Ì©\œ%– P§™X_æÔ‹~¸ë[‡Wù`Æ8­Ü씤fÞ¼²$ËW’”ó’lvÝÙwÜáºÄyöc‡}¦3þλ.ÕF«Z/IEND®B`‚gImageReader-3.2.3/packaging/win32/skel/share/icons/hicolor/16x16/actions/dialog-close.png000066400000000000000000000014251312567024200310340ustar00rootroot00000000000000‰PNG  IHDRóÿabKGDÿÿÿ ½§“ pHYs × ×B(›xtIME× Ý¢IDATxeÏlWÐóÞ¬9ŒmÛ¶mÛ¶m—âcÛ¶mcmŽ™¤ðyîí.¶ss-lYÏrueºJ¼y6Ýæ0[ƒ‹iíà’æ0Ͳãy|ìDÝæ¼¹H,¶ñª'¯®­I$ ¨T¨V(W*üþðÃ~ýé§áIV¿˜ÞÖçð/ºîêraÚ|fZZqê7¥ÉßþiÞolôßYR‘Hª‰ë„ˆ´p|,ªæ•1Í ,léã.0X)èù˧œ¥}©¥4­¼‚Éžnñöv-ìs>‰Èa¤–à¦TS-hOÉ}©k`Òâï`žµ·]m‰¥Wðó+Ïøù²£t ö)MÉ×Dª|.À‚uÿ§  Ù2®òéµ^ºå2M1©¥Wôý[¯úòº½-žÖЙV×J#X(,Pn@P¡Z¦\a¢·ò6»X|µµ4-±²Z' "ÍÔ£žRøÝ!™BŽÜÆ­{ÉkZi ]?éËÎÓ‹Ûþ–× u®¡ÔD©D€,?…=dó¼Y,3Òü[cÞå×ÐÿÑ“ÚOãÏ×ûí±³4wÆ­tÄ5FGÉNQ¥ï6> ºƒKq`1/ÿá¥LŸžG.ÒRW©’ûó#éî?tÝôgyaŽ®¼w@Ó]\¶8çN†Ôb4ÏOSœú6‚€Ü0éhÉPäµÃØs‚éÀLwsÁ2œ1E}&¤Úˆ°DS‘(¦xærŽû’AÔ"f*<LJõ|°í±šT[YKK‰¶ŠL•¿â’£¸¶Ÿ1Ô 0·-ˆ¯@²ºÏª2Ž4*Ìô/€ ÿ˜å2 ìIEND®B`‚gImageReader-3.2.3/packaging/win32/skel/share/icons/hicolor/16x16/actions/dialog-ok.png000066400000000000000000000011301312567024200303310ustar00rootroot00000000000000‰PNG  IHDR(-SsBITÛáOà pHYs»»:ìãâtEXtSoftwarewww.inkscape.org›î<PLTEÿÿÿ;7 5 9 #5>777 <;:: : 9 ; : ?"B!C"? = ; : 7 %K7Y'M1U2M5V5Z5\3Z0W4V9_5S1F0@1>4?/Mv*DS,Hi-F]3LW5LZ6R^;ToD_yD`ƒMjzOj‰Pm‰Qk‡Ro–Tp“Uq‡Vp”Zv—[v›[w”]z–_|¨`}šb}˜b~šb€¬bƒ¥c{“d€œe›fŸgƒŸg„hˆ¦i…ži‡¨o‹¨pŒ¨t‘©t”½}šµ~›²›²”²È«ÊÞÊïm†-tRNS !.38G2òsïCÛ2]|ÄIEND®B`‚gImageReader-3.2.3/packaging/win32/skel/share/icons/hicolor/16x16/actions/document-edit.png000066400000000000000000000013011312567024200312240ustar00rootroot00000000000000‰PNG  IHDRóÿasRGB®ÎébKGDÿÿÿ ½§“ pHYsììu85tIMEØ 6à¼}AIDATx‘”äL+™ýlgÛ¶mÛ¶mÛ¶mÛ¶±¶ÇÈL_^Þe­ [õû¿n 4¾òª‘?ŸÿwõUJhÌ{¾þº½.¨&„8M:¸]6L÷qp79.¸±††^óâ#ª€ðˆdYÖI’ÕGýÑþÁƒóEoNœyÎÄ32ÿ P ›Ä2 0 èƒþ5´—÷lîݹÎÔ­ŸR࿺öBO–{y–¨¥Ë²ö¯íÛ |sŠQ«?å÷o˜ÕûKƯv,Ús^ ‘I@¢t=9ê FŸô›gçÉÄ¢þ¬¿G]lüu’ž˜@â6¿D ÙÁðe&bfæõ4¢üÖ³œ °%«@—¸íÁxB62já{ž¾Š`zç¾ù·aî²üÿÿÿ9ÉhPŒuñìµÏ¸x;˜Q­bÈ”³4ïìuù믿øçŸÐH*ÐŽK¸p®býîì:îKϺ&JË̃è–üøãOäÎA<^I±þç9üK·úÓ¨¬æÕ¿cï³ú?á›oàþýû|ñÍwJгEÂâùŸŠß3¤…ÌQï¶¼zÄ”)SÔ ~Äl63xȳÀõd‚Ȱ@¢‚o’ù—`r4*ŠÏ§µ)V¦(ßüôR[l±X5zÔ“µkÖtì$ šPY¾t‘7´µ|{M¸\NáñxÔ¯K\¾|YFѧoŸÇ@6t’ |½ß‰¤8·¸ýð‰èÖ½ÛiàO’ ÆO@áí¤(À5ÀA>™Ã ô¤Ò΢IEND®B`‚gImageReader-3.2.3/packaging/win32/skel/share/icons/hicolor/16x16/actions/document-open-recent.png000066400000000000000000000012411312567024200325210ustar00rootroot00000000000000‰PNG  IHDRóÿasBIT|dˆ pHYs»»:ìãâtEXtSoftwarewww.inkscape.org›î<IDATx“SÔÜ@G›¤¶mÛ¶mÛx®Í§Ú¶mÛ¶í6kÙg>'å=g3—èäΖǢß.|^/Öoڈ̙³ HѨºð)Lùñû0 —n]Ž€+/|„B@þü"Gl¹c„Ém ãÉÞùªÄï=^T¸`>Œ+s³oÃÒÓ4/žçÞ€3] àæÆõ_}T­@ÇjÂÔ!]p´Y*TÈjÃùj ¯q¼uzàÙÙÕĈHüŸúýþøðTâúß^žÕ=SmA;HEa! ( °€ß ´2_Á`€”<ÖlØtÀ+ z‰@€B¡…ÃaŠD"Äf¤h4S÷öí[–iʬYÄlµ ~°Vàr»éýÇ4iæLÕ`­à­eÂôG´ƒyø¯ïw`¯ˆ ?WÏhj™î¡ÙIEND®B`‚gImageReader-3.2.3/packaging/win32/skel/share/icons/hicolor/16x16/actions/document-open.png000066400000000000000000000012671312567024200312530ustar00rootroot00000000000000‰PNG  IHDRóÿasRGB®ÎébKGDÿÿÿ ½§“ pHYs × ×B(›xtIMEÛ% ¨×7IDATxuŽ,W@Ï}ý†±m»Ûv A1V)v™1Ë)Ƕm[ÿ¯=ö4ov»g½{ç p`XN=—Ë}×étº¬Ä÷¼ñÍžgܬ«11>®{ï½×ã«ÔbÛÍúA{í¾ÓŒ1íéóšµkõ?þ¸úˆó®»zóýÎÂIYˆ›ÎüùômGícµn·Lj Æ`‡5kÖϯmÛ¶mÛ¶m¿¬mÛÞM2S›Ê×=×wj¾3ÍúÏI "—"=€´p ‘‹_¹ +]ºtYïÝ¿ôßßB" çÇ;ÎAÅ>¸uâ¡m“Ì8ŽÞ3ßañÐL¸ó6-ÚöY£\Ã#!`ÿ¦ HnGÏi/±`PZÜ~mGï½^¯7@UP$ó‡ÖÞßGÐyâ#,™·^§C«^«àñx êéÓ§0 Á`¡!†¥sƒôÓ·¬›ó/oî,tbyIš;®.ýüù“LÓ$˲Èn P(D7oÞtÆ?þÐàÁWÐÜ­pܨQ½’uýòiš;¾}ûöl§.ps¿}7qzõ©„¯ dó<›?¹EgåκsçŽÑ­{·%ÜÜÌüWºté´wïÞüõë×­,B rTⳋDd@Öû\ø½Ë0í‹IEND®B`‚gImageReader-3.2.3/packaging/win32/skel/share/icons/hicolor/16x16/actions/document-save-as.png000066400000000000000000000014731312567024200316500ustar00rootroot00000000000000‰PNG  IHDRóÿasBIT|dˆ pHYs»»:ìãâtEXtSoftwarewww.inkscape.org›î<¸IDATx“+Y…¿FlÕ›g›cÛ*¬íLymÛ¶mÛ¶mÛ±“îô&=ZëTâ=ß½÷‡ iÿF7ï>sÆŠwW?¦¤2fÎ[}óÍßè€Ñ‘‘H6›sï¶Ç>üZ‚ "P`%‡òåÝnœw¼Ç;é4766Fï¼ç N¥Ý3+hëèDû5 lA#óÆ6üôƒÈ÷~HÐ-ø9‰‰ºt@±XÄl2c6J\õð›üZ®Ncƒÿ¶<8 „ØÇÈ-¯$ú‰Ì@-EAa›î5€|ðâ,p¾ÍО9B?ÿÈuGX‰»xúãoKqòªª’ÈäÉäÒ%öîݬ0]ÆÖGäùôË0çîmë ^ü¦³ÅÀôTUA²¸áþç0>#Øü!cÇ ¼ñ~Œý¶V°;ÝçB†ûܸ].ñø_Ofh[ç'Øâœë¿âÙ×blÛ“¢³ÚÆM¯õ²zùªëÛÊçuÿªˆ*ª¢pä^;qê>s¹æï¸àš÷¨^ð5[wËìx‚H4õ‹/æ“·^a23]DµDTó쿽ÊßʉW{XàûcÆ$v9ÉÊw!E +%Iÿêdæ×5`çžÏ‰|âèkÝÌpƹp8åŽEv?û°1mmml¶ñ&úW/Z¤g¦jÐR½›MbÏóœ8, çì–ห‹<öŠÊ¼yó˜9s&}ô3gÍB”%½íE™tw61sÃѸœfN þÈ]Ï\qo@ @KK ±XL·V.žZÄï÷S(ÐGî¹¹<{v€tøEvßÂÍóïû9ó+^·‡¡¡!’Éä •JéÁL:­@6˜í|ìô×:•ëîýAîØŒw–‡ÃüZß|û- ñêk¯!Jb€=wØ*¸IÝâòVþÿý–pŸT¾IEND®B`‚gImageReader-3.2.3/packaging/win32/skel/share/icons/hicolor/16x16/actions/document-save.png000066400000000000000000000010531312567024200312410ustar00rootroot00000000000000‰PNG  IHDRóÿasBIT|dˆ pHYs»»:ìãâtEXtSoftwarewww.inkscape.org›î<¨IDATx¥S%€UAœ/g ×xD4á. ׂTî’p¨XÆ-ášIhÃÝõù²»ììÉ߇ÃͺÌ쬔Rh ÊÌ&Ošô¥R‰Û/^º6 EæE‹ €Ž&íÚ¹õõu_Ïœ=ÛÁ„Aؾ{î9z l?†@¢Î(¢£)O8†Gµou ¥D}]=êkK8xõnÞ…É›\,˜ÐBÃiº‘e™VæëÃù­NxFR5—ºÄ©™KNÎU½(!¹ªI’M"?:BU_ ¿x6ZoI1*Ìœ0ˆsÉùÑëG˜0l€Í†²ÈÔò‚ø'¤€Ðª—,Ä_‚ëEÓ!þ ÈÉŸAš‚Ø¼}Zíó ´=gæ,SöjlÌŸAªW“Äýû÷±Ï^„Qˆµë×ÃFž=ñúÍk^!9–€^=Žc®ë"ø¾Çq`Ci¢;wÆÓgÏr‡øÙuŽ|®ã"Š":úA€Â\, CÛAAˆ±®ç]s·Óûï1yÚToß¾…W¯_ÓnÞº…b©ømþÎßûÒöó¾èoIEND®B`‚gImageReader-3.2.3/packaging/win32/skel/share/icons/hicolor/16x16/actions/edit-clear.png000066400000000000000000000014041312567024200305000ustar00rootroot00000000000000‰PNG  IHDRóÿabKGDÿÿÿ ½§“ pHYsììu85tIMEØ5$AFÊ‘IDATx•Ì´KÀÛ=\?ÛÆ·mÛ¶Û¶mÛ¶mÛvÖÞAÇvêX…{1}hËÿ§õ©¹õƒ×Ÿ¥¸Å=Ð"þ?bbc7N™»œÝw°prï§DzæB¸¯ mŸcN8Þ gÎìé7ræ‚û >ã N¤2$`}ßÛúŽ˜Æî9h[õËØï>~nEAFtC_ Îá“Æ<.GHÒ¤çž{8Ü ´xý‰''¤¤$¿R4pб’1U:åO}é´cÆç@bÖ+ÏÊ}ôá_ܶí0üúño_[-†·BÁ‰€1 ,¤ÉyñÅ÷6†C}²ãbó K3Îèg ¦¦¼OpFÿ¼m6¤ iY9”8@9 y×)wÚaŧÊd^Œì]±t©kÿ±ßx\#Þ&÷2Z,9f^…ÝéA0¨B=tº»tÊñƒṫ(ब¹OpüUq¸d@½Ïª‚r•⣭ðº}P•0bÍZ”ô8YöÕW£q+g‰O eøæêIEND®B`‚gImageReader-3.2.3/packaging/win32/skel/share/icons/hicolor/16x16/actions/edit-copy.png000066400000000000000000000007411312567024200303670ustar00rootroot00000000000000‰PNG  IHDRóÿasRGB®ÎébKGDÿÿÿ ½§“ pHYsììu85tIMEØ#;ºbg¡aIDATx•ER51…OºÅmôv÷àS&øØË3ÇébÌîÚ—›T§*ü«:Õ±û¥o€N?GàsˆsʉÁb‚¾ €IXüÒ7¿D"pŽüüUõõõÐgmÂu]%H§Rð< Cð÷ï_0œ¢ÑÒ˜Ib‰¥Òi ‡Ãôƒ–Fì?P·J"Ñ(\ÙRÁ1[ª©©ãh:¤$@ó\}u±ü~ôŽqPÏM‰~T|(°i¡k‰õרZ`‹?Ø›Â*®T*ˆD"øóç7þÿ¯A*Ràó&ýþý[è›Õ׺U‡B!Hr¹,÷öŽx`Ú83œÅ GÄ *•J$åÕj•È÷}J§Ó´¼²|   0BL±X¤r¹,ªðùåYommÞ˜â8ø€!.ôÉ T©Òýó íìîx†a>>Ǧ…3hÒPÐó-ÇGÀ+h èˆUÌI™IEND®B`‚gImageReader-3.2.3/packaging/win32/skel/share/icons/hicolor/16x16/actions/edit-delete.png000066400000000000000000000012001312567024200306460ustar00rootroot00000000000000‰PNG  IHDR(-SsBITÛáOà pHYs»»:ìãâtEXtSoftwarewww.inkscape.org›î<PLTEÿÿÿ€¨­‡Š‘˜œª€¨¯œ‡Žnmj¢–++‚$ÒxuÃJIÉ`]¿4*ÅG?¤¤¤!¤#¥¦«$¯'³1&³+¾J?ÃJ@ÈLCÊVL€#!#!¡>4²C:j#j# {<2Y![!½¾¿93Á Â33ÂMHÃ::Å92Æ Ç É>>ËD?ËNJÌFFÐÐ ÓVVÓWTÓe`Ôb^Ö`]×caÛÛßßßhaãå/*å0,å2-å2.åsqæmmævué‰ïïðŠõcŽA!4tRNS222HHHHHHIIIJKOPQRÐ×ÝÞäæêòôõúúúúúúúúúûûûûûüüüüýýýþþÕnÞb›IDATÁE‚À(Ø"vwwbbwçýÏ¡ðtÏ ¡Ü|œd¤÷™ÑúôËGBbÝ^®)£¹p¾Ü¬hq‘/ÏÄyRô‡­Ñ4Îà‡ŽvšíF„ÆŸ:Ì×ê|X•,t{Â8 ‚L\ï–ÕÊj· ™ ±ïß÷"Ë•ïƒ Âs̲—;yȇ_œ‹€C³k÷´fdIEND®B`‚gImageReader-3.2.3/packaging/win32/skel/share/icons/hicolor/16x16/actions/edit-find-replace.png000066400000000000000000000013171312567024200317460ustar00rootroot00000000000000‰PNG  IHDR(-SsBITÛáOà pHYs»»:ìãâtEXtSoftwarewww.inkscape.org›î<PPLTEÿÿÿÉÉÎÉÉÎè¶!777²²´'''444ÃÃÈ999  !!!$$$'''(((***777999:::::;;;;<:0=;3==>AAAGGCJE2JJJMH7MMMWUM[[[\\\aadbY=dY7tc-xvp||||}ƒ€r„„„………††††‰ŒŒŒ}B•–‹–ƒI˜-¢  ¤££§¦¦ª©©¬¬¬¯¯¯²²²´¶§w¶¶»·°™¹ª}ºÇÖ»¥Z½½ÂÃÃÈÍÚçÍÜïÎÝðѵZÑßñØË¤ØÎ¬ÛÛÛܼOßÙÃãÝÇåååëÆPîÎiîîïïÊSïïïðìßðððòòòõõõöÛ…øøøúå¢ûûûýýýþþýÿÿÿµ±†tRNS$9q~ÊçðòòóúÀ¾£ÕIDATx=ŒCcQ„ë!¶mÛ¾æýâœöÛ¶³÷¤g’ì÷ØÝU¥€¢ú”ŸÕDŽ`Þ­"£oÇ÷GÀ¬Æ$PüUVVcV•1EóPÈ/¥ûóXEô¸S=•(äJ&dÄO2%¸æ¶L%„úm„·täͤ«r¾Sîegzûíë=ÉCY p±˜ïÔv{yò@Mqߺ¨Z èÔÞ\}£Ñ—ò¦ pÃCvù ÁN¤FâF7À]z¶©M]êjü5d5öŸËùýkPPƒ 4üÅBÆ2ÜÚIEND®B`‚gImageReader-3.2.3/packaging/win32/skel/share/icons/hicolor/16x16/actions/edit-paste.png000066400000000000000000000011561312567024200305320ustar00rootroot00000000000000‰PNG  IHDRóÿasRGB®ÎébKGDÿÿÿ ½§“ pHYs × ×B(›xtIMEÛ EJ4îIDATxu’Œ\Q†ÿ7÷qÔ¶¬ÔÖ‹7ÚÆí™Øfã‰ëƨ͵ÔÆðÝ=çdîŽ2_ò.¾se¡œS wÿÿÿ¦¡¡k×®½à&j±cÇŽƒ===)¬‡††t"‘ˆtx<q›çyº··÷Ͼ}ûŽ¢’mÛ¶}<}út´|ùrÍüþý[ùòE¿™M›6éS§NET, ,h¥’É$hù°, •lܸgΜïû˜žž.`Sär9´¶¶b×®]ˆÅb"ùöíúûûÁð˜¯_¿¢®®Ä%J@áq£v>Ÿ‡ëº`ø7fÁ‹/†! ©TJ\”«DpEVPÒÀáUH˜é™Y8Ž ¥81ˬ°±± ¯€Ê$¥ß®çÂuš¬Dj^aÕ6ïß`ªšU0<Ù¶m¨AÙ!r •[°•’¨BªÜÀ3¹4Œ²m‰]K@Èé3•"³-Eùøñ#úúåÚÖÖ­[e¨MÏÙlvéíšššŒ€+K‘U+W¡½½]óľË}óîË V®\‰––¹rÛÌÌ FFF+¬&Š4%"Qκ†cwnß¹à­}ðرԓû÷}žDo¿~ýZz‰L`¼À—þîîžÑ—/_†Fe¨Í~ÊaŠF9×) (°AcË÷qW_IEND®B`‚gImageReader-3.2.3/packaging/win32/skel/share/icons/hicolor/16x16/actions/edit-redo.png000066400000000000000000000014331312567024200303450ustar00rootroot00000000000000‰PNG  IHDRóÿasBIT|dˆ pHYs»»:ìãâtEXtSoftwarewww.inkscape.org›î<˜IDATx¥ÓC¼ìHðïTU·u=¶mÛ¶ííx;Üö¿ÁflÛ¶žßµí¨ÓéTê¼<Ûÿåsˆ™±*z†ö"¢RJžD‡ ’Â’b¶_ÅÆ¼Äpÿ²ÿv`VT¼Dô ”⑃wÞ»fïæ]pð6{ƒ´Œ÷ e¤³úZ*0¸'2ñˆâ5†—T¶ˆèÇæRíá7œpQºÉb]Æloÿõ¹žñ]sí1ç§^ûýS_a©‡r¥Ã/=þœ´ðü ¦#ƒÁ„ؽfW¤ E¸üøsŒÀòž«¤õ#‰ûÜÿô?°ÐíÄ„3šfÎX´Ôµ”…‹{¡ ò@B²\Z€[·É7fg„„@O0€r‡k9Üê^AwÑ\hü{Æ…{†QÁC¡ (ÒX…Â^Ž\}qÃùQ?[ñr2U±ö½§½ÇXÙ«†2BŒðã ]ÑþßoK¬ji$>G8,¿ã^}MSqŽRÕ¢JWó2íd…¥-!̗ǵ¬ÇŠ\(<“°}Açc6†uI¥Ã¤óÁ1ó‰U°ý@8ÚÚIØÕ‡ÔnÏo6›‘Øx[a€G§ð^IEND®B`‚gImageReader-3.2.3/packaging/win32/skel/share/icons/hicolor/16x16/actions/edit-undo.png000066400000000000000000000015141312567024200303610ustar00rootroot00000000000000‰PNG  IHDRóÿasBIT|dˆ pHYs»»:ìãâtEXtSoftwarewww.inkscape.org›î<ÉIDATx¥CÀ=GÄ«wVyæß¶ÍKlÛÎ5¶í\âcóÛÖgÛþ—3™}±õ[ïÔtw=vfйZ´CòøÕ´€©ÊIáxl§øÔÅk55®Ž÷ÕVOŒ ¼'¸xXêjñ èÙ[#-‘Trúhw÷ÉŠªLµdÁmKW¬3Ípz,HàæËprhªú¤ÔÑÚq âFYÈ«xáŽh~—½ÔT¿ãL›>Ÿ¦Í˜«):þî*n¬s>ûìƒÏó·Ë"Ž ‰"5«wÕÁ¸Ç¥PÀË9°‡Wôä hÉTå==¹>w°´ªµõ‹ë\ ×rAŠHJìò­_ œEÞÑ…ïh0­/(;c>"Ë6KÃüEKôÚºÖ3d^Ï©Àwl@•Ý…ƒÉ¾w1˜wEU‹°bÚØë>§bïˆvH¦µMÙ˱(²x+S ”Db¾Y.¨XÝpí8Y0¦LCf6hJ’8Sø']ï;š5'2œ¡ž–r_kŸ—ϲa†²ÅvRì¢å¶wÖÙmõóîæ>>è.âbÉòÉ»O޹B†5̘û¤k¨w¼ÿs¯0Y•ñΉ–¨¾ãÐÓ=t1€½AV †àãG˜ç‹1¿8ÔlÙ“““y?¯˜ABüÈ'ת¤0R?˜Lñsoôü/§˜ièjÍÂÔ+B®Ž|ÒÅÖùQ>_Å/HGÂÐh>¸rçU3y–ún"¢Ã"!õaÓ`­‚´09n¸Z7ÄG¿š éžqÓÀ²ÓÆÅ×Í¡¡¼`v9Ÿž‰±9rœYŽ92éE›&܇L“ïý«õO¥å' V~Ö¼´„bäûºìš ÛÖ©äø_uŽ$æ–e¸÷V üUï®%r=tV-Oä†,jj-§Ã!ùÛ o®%>B&G°C2ˆ{P„©œÏ_pïÁÜ¿÷²™¯_Þ°ñsÀë3KÕÍôÈ7/=|ùòЬ>X8Ü!¸¼aø‚QجYýÙ5Õv>Òð‘~mûK•<èñÒá°# # "‰ÀírâÞÕc’b@æöNq|¥øîþâNWúíÓvÍZuUª?{=$±sÃl¼|z¯,÷èèj|EÃ÷enœ>qîàvŠE!pVß¹tx?dqþ÷V¬c÷%ôž“–Pï)ËÈî‹¿±x+VÿàÎð0².ùâµIsàpwb™Úá7Þ{ïé;ËlIEND®B`‚gImageReader-3.2.3/packaging/win32/skel/share/icons/hicolor/16x16/actions/go-up.png000066400000000000000000000012121312567024200275130ustar00rootroot00000000000000‰PNG  IHDRóÿabKGDÿÿÿ ½§“ pHYsvv}Õ‚ÌtIME×   Ü(ŠIDATx’C \1†ÿäj<ϯ¶msUÛî¾ÜojÛ¶m››Ú¶=ÆEÒL§ë›üç;DNG©n+Æï8otN)»Ò=×¶ô8ÈB±ÆJ¾zçO>ÎJG³Z,Ók}&áÖÊžmË‘ÞjRnÅVg6–ž'@Ù>›Æ5˹3=N I k—ÌÏÌØ²”j}s0fOv¢e•²)úÈ»z•È—ámf α"ïê„ëšUO‘UY‚e1&ƒ®[ÈŸ/·oÝm.{K슼÷þ¿Š·›áŽû^l*•ijš*#®sqzâ6Eµ£vv‘ÞzW©–¶ÿzàÕõ•.”?º ˜ŒÂâ &Á4ñô…ŸüšÃ]™3sâ_)äo4¬›|7& ²KDE$â1&¢±`1 _Þ?¯+¹ ³ÏË`ÅCÅèÜ<»W£ŸÁõŽÜMUAh" û7̓f™àÌ"¼+€£ß’暬¸ó-¥ŠƒJÎ ~yñ½Ëé€Ãa¥ÑhF<&`Їqp øxsv|ÆÃ‘¯*D%áv9¡(²€„ ¬zt(˜§I”Ýù¾H¢ßÓ ¥Œ,µY.:3 E@)E@ # 'òÎ;€ªÎà†µËÜÌŒƒ1XFÌ2‚yq7u• CÓŒ 8Ó³Ò~7îÀôôIEND®B`‚gImageReader-3.2.3/packaging/win32/skel/share/icons/hicolor/16x16/actions/help-about.png000066400000000000000000000014101312567024200305240ustar00rootroot00000000000000‰PNG  IHDRóÿasBIT|dˆ pHYs»»:ìãâtEXtSoftwarewww.inkscape.org›î<…IDATx}ÓcÀãHÀñÿLfê³mÛ¶ï¾mÛ¶mÛú~¶m¬íí¾é¦J›L3›´¯õ‹1a­eèdùô÷)ËK)ÄÞ[®YB "úÀ¹à±¶›<¿þÀÒK.¾éj+.¾X>£E±ä×Ýr}üÚËç.¾ùø]¾Ìpä§=u­“]ìúÓÞ&½öŠKÖÉåÀDÌ÷ê|ôÛ4ãz¥‡>¸í°k3 À²‡Ü~Ù2+®rÿÕÇîŽ[ ñj!¹´C¢Þl±XV³òÒiÞøf<“&O¿iÜ‹gÜØv±ÝE¨¥WøýÊãÌùmg-d7µ‰ÛÞù‡ªo–Èiîz÷k_5Ýmªïß8F’PúöÝ·Ú(Wô‚8s@¹Po)’%ÙÏu®Í쪳ë¦kgk nk%!ØV8iÆg{Tü&ç?õI…nÜN­Aªm”ØüÜ¥(äVRăz|póþô8ð–O–Þ7˜Ö°«‹ÍÏ[JÑÊlD¹¢´¡ÍI±óõŸðýíû‘¨¶QÔ«4ñÊeæ—|h… ©ìºbÇK‹?¶‚Ð)t¦€ÊçQJS*•H|7Ý'ŽaA&Ü,Ú1w)‘ˆi¬`ãÁLÅ÷¤ÁHz©4ÙYl ÂÆ$€Î]R\Au¾A8›u÷ÁíéáÞ·¤síó Àn€+|Hbû‹Ÿ!»Ä™¬º%–é RñÖ4:={ó`òà{ÏÚŸ:k`€Û]ü"Ž:¹¥d½% \§“55Æ.@šß¢È„¯ñËÃ§ØØp?bÛKöNgÕ3(gõ iRÐùT¨,³?8Ý|wÿg£ýÈÍÏYÝö罹3‚E—,^Þ?m„IEND®B`‚gImageReader-3.2.3/packaging/win32/skel/share/icons/hicolor/16x16/actions/help-contents.png000066400000000000000000000016171312567024200312600ustar00rootroot00000000000000‰PNG  IHDRóÿasRGB®ÎébKGDÿÿÿ ½§“ pHYs × ×B(›xtIMEÜß"$IDATx]’x$I€ÿjŒ;YÛ¶œmóó™kÛ¶mÛ¶mÛƒLw×Z)>[x½>)¥IåÏZIW¡Z @Ròb ˆùÔ<]@ƒ HMI¦x£Š"©hQ,)„‚€ÇW ¸zåóW >|ˆóçÏÉ_“ž"P¯º›â—7U©ŠË±f"Ç 4âNÐ y €x¼ à `)x÷Îã£h{±ÚÜ+\K×ñ¯E¹K[Y¹û²u<¢åU•5Þ\ø+ÕªÕÁn¥q¥]g6®ZÉú­[9ýÇß(Ç4zûkyí›êç*+rQ€”€”Ü<˜*ŸÇÝ»Ù=´+sôûnÀМÒo‘9²=uoß±_wM=rúy"ój¶ÆÓ¶$ÇÛ¸‚}Ø@ú­@°é?Äø£¸Qå-&˜Gòú‘¯Q“´2™Y+¾ªØñy UJ ¹âë¤_ºÌJó6wš6Çæô ç>¾–Еx“ñQi°}3ÎRu ÏU_ð¸Ý­þø»9)YÙì’Ó#XÑù‰¦iaYóá•ÝÄ5¬DbvWKz4EQ¹xá†Y UUA³  %òáUˆ‡¿‚%t”§óe¦ïy g·ÌãzrTEðÕõÕÜIB¹áˆù0ã!áNÈ";¸L§“Ü=8µjÚ ÊÕÊŸ¿œ\G%{"uª>®=Õói`˜†ï;wñA²Ü¼x“u½›3yÏæ¿M׈òy˜ëNbÆÀpüí›á/s±Ó¸x/²Š÷Ò$˜nηhÎǽýóβH)\Dú£|­û.åŒ"jí >®Ÿ‰÷£Ø]¼(!$¥NáîÒ¥lœÉ{>4õ€àÓ0@TÿF"‘ žçI BD)‡ç9¥¶’¼ÀÖýÊÊÊ1“:9é­{¾Á6) )¤ñM‹‚‚*!™„¢ÿb² Ôpû¡‡@èà8¨LQðןPéÀuö_y1Ù* *Åsž/»#9Ÿpp³I~ü§¢æ®€Hd!«”2ð…Áíax"ß2µçW”iAÑ»®VSîh yGiEºh0¾Á‘%!›/°í\ ¥Ôp `܈úÔÖVðË·’¾T\º“ãîIу‚] àù $ŽV¶._½‚”’¨hÄ’ï~ÊÓÜb¸—P<¹¡HæÊPZóë￲fÍì®tuu±nݺ+Àe܃êêjÊ+}òÆ%Ï’,`¯yOSaû:::踵¥mmÓøüóϧc®KÀ¸®‹½'ÚZ£ÂsÉSÉ€ÁƒÙ»w¯½^-'çô£S8ŽC(Úü'€a¹\n«çû() ¢ñgížÁµÐ%šëQJOÄø«åæu_ÓÀž={޳Ǽ…¬¸ºQ{éÁ5î¥]{-C±èQåVHìÄÙݱšo´šÞK5QkO͇94‘Ïëœ-B ¨x±Ó‡ý/Ø5níiÅÊS^% ì²úIEND®B`‚gImageReader-3.2.3/packaging/win32/skel/share/icons/hicolor/16x16/actions/insert-text.png000066400000000000000000000010541312567024200307560ustar00rootroot00000000000000‰PNG  IHDRóÿasBIT|dˆ pHYs»»:ìãâtEXtSoftwarewww.inkscape.org›î<©IDATx“3¸A†¿elÛ¶ÕÄNª ú8éc÷·oO—.¶Ý\ëØöîdþ½{Ì÷yÞ-†?f±üÂGÆA5›™èc±X˜ ¨%Q>¶oß>cB¦O6›Å£'Ð,ož?Qr]¤ë:F •0løp <^¯#GB6“A2™D(®!·>‡˜€é6nÚ ·/‚ön+ ‡;O †U«×ÐCMÓJ# Š@U¼zû„$‰fî0xÿér”D°ââ'f¤”(‰æU¤õ´Ï8àïÃÍB.…be3‚òq’ÖÓ¾’P¨9©xÆB*•ÂÄñ£‰„A)ò€cÆŒ©Þ…'N€/B1PË¿‡d'wœ«<àÉ£UѬY³°{÷n ç­ýåú •‡pzñppº¹Çz’¹|Ê BÑœõòˋӻ|m?v4$I@8² Kp}Ó>¹Öfœkïòõ ÍÙ{\Å`…ñˆ5 S‡5¤£‘›¸½\6ãæD¶­e!3éãn‘јÏÜY”ó\eòl%et Ÿ;?¥Y×›‘ôÓ͹ñÿTÇ-ÝkÝQIEND®B`‚gImageReader-3.2.3/packaging/win32/skel/share/icons/hicolor/16x16/actions/list-add.png000066400000000000000000000010451312567024200301710ustar00rootroot00000000000000‰PNG  IHDRóÿasBIT|dˆ pHYs»»:ìãâtEXtSoftwarewww.inkscape.org›î<¢IDATx¥“¬K…¿™Ù÷jÛnãÔ6c§Qݵ͠F¬:¨mÛ¶­kßÔîŦ_<øyŽðÞó/Hò`òÙá«»lm’Õ}Gã„•w/'ò¬ ïž>®Ož"×fs%á¼YÖ~ƒŽUÁ…7ç„ÓÙüWDq+ùº"ò¼ˆœ%-'!%¹ÖRP€á+Æ:Rs³"cÿöÏ^ Þ5xî£ÔG#O¼:¦Â@ªH2£l¤ä؈Ökù"ZS$Ô4«ÐÆÔ,YkþÐúSÇ}¢ž«ßiÞ¿Å!Å—.õs€Òª4R*þ£8 )¤f&{˜°®ÓÅò ÀÃÄG¨P¡ÿ(ù_q´dØt Úk2s3¹“ð€”¬,Ê„%(æþ4Ç”½÷.B¡Q •$ Z×jB±0ääÓ³ü¯ÿ)E‰â ¦Fƨ)ùêàÿÅÚw¬×„2Eÿçä£;<œ"béÀ:Gd#¤€È9òBåàmz ^8Œ`º¬Y¼´ž”$’2"Š›R&¦™¦ºVåJ¬²«­™\Ò•œÃLñø_"¯¬-RiIEND®B`‚gImageReader-3.2.3/packaging/win32/skel/share/icons/hicolor/16x16/actions/list-remove.png000066400000000000000000000005041312567024200307350ustar00rootroot00000000000000‰PNG  IHDRóÿasBIT|dˆ pHYs»»:ìãâtEXtSoftwarewww.inkscape.org›î<ÁIDATxcüÿÿ?%€ …7j#³ÒUÈà@Á‰ÔÔæwï–}Ü¿Ÿ•Èa6 Fgó::þáRTìåœ;·¤‹XYŸh''K3þÌÀä³B13Ô‚\\ ïrßÞ½cPÞ¿ÿ­èïß"(.øõçÃ×ׯØÿf`faa`Ìô÷/PüPþã¹s ï¾|:…á7P .˜ÎȘ´y*;H Ç¿ê dÿÿŸ3` £qÔ¯E7n¶}IEND®B`‚gImageReader-3.2.3/packaging/win32/skel/share/icons/hicolor/16x16/actions/object-order-front.png000066400000000000000000000007661312567024200322060ustar00rootroot00000000000000‰PNG  IHDR(-SsBITÛáOà pHYs × ×B(›xtEXtSoftwarewww.inkscape.org›î<ÃPLTEÿÿÿvvxÅÅËuuy‚‚„‹‹––›¢¢§®®³ºº¿ÆÆËwwyÆÆËåååôôôÿÿÿvvy}}€³ÿ„ƒµÿ…¶ÿ‡·ÿˆ·ÿ‰¸ÿйÿ‹‹‹¹þŒºþ¼ÿ“¾þ”¾þ––›œÄýžÅý¢¢§£Èý¤Éý¥Éý§Êü«Ìü¬Íü¬Îü­Íû­Îü®®³ºº¿ÆÆËÈÈÍåååæææçççèèèéééêêêëëëìììíííðððñññòòòôôôøøøúúúÿÿÿÜÑtRNSµµ¿¿¿¿¿¿¿¿ññþþþ·[„‰IDATxcÀLœìl¬,Œp.^#cSK>f„€™‰¥µ-’€ƒž®²‚”07LÀA_GGGKIZ! ¦('!"àwГWÚ±V_HTRVESnP…¼º†¦Ü.}UMMMmKs¨ÄZA Cd×½’?H„ŸÓ‹öòë€vÆtIEND®B`‚gImageReader-3.2.3/packaging/win32/skel/share/icons/hicolor/16x16/actions/object-rotate-left.png000066400000000000000000000013211312567024200321570ustar00rootroot00000000000000‰PNG  IHDR(-SsBITÛáOà pHYs × ×B(›xtEXtSoftwarewww.inkscape.org›î<MPLTEÿÿÿÿÿÿ€€€€€€€ÿUUªqUÆU@ªP0Ÿ€`¯f=¸hB½U<¢U9•rJÉE"…nFÆrFÊ-ftHËt\§|·;!|2t8{"€J/„iAÀW;˜Y@”˜„»N1lDÄX5§"We?·ƒn³™‡¿^:±c=¸Z8ŸC+y!WN1ŒlDÄ3sB%ˆH-R2žg?¼_<­[8¤>'p?(xlJºnMºsNÁ$^T2¢V@ŠW;—XBˆZ@”[B—`;³bG nXuZ°u]§u^©x[¹|e«‚m°„m´‰p¿y½|¸‘|½“‚µ•„º–…½—„¼™†À™Š¸šˆ¿ŸÂ¡ÆªšÉª›Í­Ê® Í·ªÑ¹¬Ñ»¯Ó¼¯×¼±Ô¿±Ö¿´ÖÅ»ÚÆ¼ÚÈ¿ÜÉÀÜÏÇàÐÄâÐÈáÒÊâÜÖèg­=tRNS $&2::;@@@HMMMhhyƒ§­·¹»ÀÀÃÃÄÏÐÒÓÔÕÕ×ÙéëñýýýýñyD1­IDATxcÀ T¹lòÖI.H|AS¿Ü<;U)f(_Ø&&++'=Î]‹"Àg•ž‘™™‘î¯Íá2ñLL³NMö’†jb’µ ·5 ‰S‡ pð 驉;Gú˜Aøœ¢ b Þæ`>»ˆ’†‘¤¤‘o¨‡X€GQ3:ÐÕ50:ÂI,À¨ì›’릵–ר1(!!ÈјævV9] ]9V¬þ[÷P‹ÕÕIEND®B`‚gImageReader-3.2.3/packaging/win32/skel/share/icons/hicolor/16x16/actions/object-rotate-right.png000066400000000000000000000013211312567024200323420ustar00rootroot00000000000000‰PNG  IHDR(-SsBITÛáOà pHYs × ×B(›xtEXtSoftwarewww.inkscape.org›î<MPLTEÿÿÿÿÿÿ€€€€€€€ÿUUªqUÆU@ªP0Ÿ€`¯f=¸hB½U<¢U9•rJÉE"…nFÆrFÊ-ft\§|·rGÌ;!|2t8{"€J/„iAÀW;˜Y@”˜„»N1"WlDÅX5§e?·ƒn³™‡¿^:±c=¸Z8ŸlDÄC+yN1Œ3sB%ˆH-!WR2žg?¼_<­[8¤>'p?(xlJºnMºsNÁ$^T2¢V@ŠW;—XBˆZ@”[B—`;³bG nXuZ°u]§u^©x[¹|e«‚m°„m´‰p¿y½|¸‘|½“‚µ•„º–…½—„¼™†À™Š¸šˆ¿ŸÂ¡ÆªšÉª›Í­Ê® Í·ªÑ¹¬Ñ»¯Ó¼¯×¼±Ô¿±Ö¿´ÖÅ»ÚÆ¼ÚÈ¿ÜÉÀÜÏÇàÐÄâÐÈáÒÊâÜÖè1D3Ý=tRNS $&2::;@@AHMMMhhyƒ§³³·»ÀÀÃÃÄËÏÒÔÕÕ××Ùéëñýýýýãw+U­IDATxcÀTuP\’¬åÙàKY„aÈ÷;¾çÁ7Œºî>Ÿ‚w›5Þ‡qt ÀAgåÊ‹ æÏ_°bÆ*­Å‘'9o|òZúñ¯Éñ«O´¯½ûlQœ9}üäsÆÏÓa5DªBWW¿ïø1¨!£ð›}0uÌt=uÔt cPöþìã:ú7Ÿ?føDÝÕÛEžå|ðá|ûã7¸¹Æw|^{ûZµ1wÖ\Z[À€e,”(lŽÔ4Ø­DȧŸ}ÊžÝÛM§“j’>i(½®7êržùéY:q)žñD°D°Ý@¯09ÒÝÛM_ØÇï¿ýJèZ_-žv`âû+œÅ3E¤ß°NJv‰Z¹FØ"ÆÖ®šå)Y²{ïn¬\QIÒg¬«Þ÷Úu£òu‹O¶+æçðJ»J˜JAåOIðKcCê¦èTH’ü™üÁbÝ_nÚ4– &/öKnLj6%•Äù;T3"‘·å˜‘àzÖÒÃåO*‘;eª´çÓ [±Ò†F7°³¤xÂsôBZ3¡І‚¶FíÊê}µMGD\ÇÞØ4Ä{;\,Sù)jʶ[_ªr¼l¶0Á÷ôŒÀKúgÚ¡Îuh³Ò®ÜX~;«JöK”fŸV“äË´Tü\û:}ºvcú“Ú?¬/kQznУSÏ>°w{uc±¦*I: ]8£ê]gb“Œ?ÉωvfǸ²kgõ…漸YùxZ#uB_gDÏÀ½"J1¶;ªöY²¼Ú›|¼ ð×gàä†Vïb¤íߨ¢±•¶ë7ÅÞ·+&§¨VËéEÀû+Oþë‡Ç‹,%³ŒA c>^®ßïø+aQrk'/ŸIEND®B`‚gImageReader-3.2.3/packaging/win32/skel/share/icons/hicolor/16x16/actions/window-close.png000066400000000000000000000014251312567024200311040ustar00rootroot00000000000000‰PNG  IHDRóÿabKGDÿÿÿ ½§“ pHYs × ×B(›xtIME× Ý¢IDATxeÏlWÐóÞ¬9ŒmÛ¶mÛ¶m—âcÛ¶mcmŽ™¤ðyîí.¶ss-lYÏrueºJ¼y6Ýæ0[ƒ‹iíà’æ0Ͳãy|ìDÝæ¼¹H,¶ñª'¯®­I$ ¨T¨V(W*üþðÃ~ýé§áIV¿˜ÞÖçð/ºîêraÚ|fZZqê7¥ÉßþiÞolôßYR‘Hª‰ë„ˆ´p|,ªæ•1Í ,léã.0X)èù˧œ¥}©¥4­¼‚Éžnñöv-ìs>‰Èa¤–à¦TS-hOÉ}©k`Òâï`žµ·]m‰¥Wðó+Ïøù²£t ö)MÉ×Dª|.À‚uÿ§  Ù2®òéµ^ºå2M1©¥Wôý[¯úòº½-žÖЙV×J#X(,Pn@P¡Z¦\a¢·ò6»X|µµ4-±²Z' "ÍÔ£žRøÝ!™BŽÜÆ­{ÉkZi ]?éËÎÓ‹Ûþ–× u®¡ÔD©D€,?…=dó¼Y,3Òü[cÞå×ÐÿÑ“ÚOãÏ×ûí±³4wÆ­tÄ5FGÉNQ¥ï6> ºƒKq`1/ÿá¥LŸžG.ÒRW©’ûó#éî?tÝôgyaŽ®¼w@Ó]\¶8çN†Ôb4ÏOSœú6‚€Ü0éhÉPäµÃØs‚éÀLwsÁ2œ1E}&¤Úˆ°DS‘(¦xærŽû’AÔ"f*<LJõ|°í±šT[YKK‰¶ŠL•¿â’£¸¶Ÿ1Ô 0·-ˆ¯@²ºÏª2Ž4*Ìô/€ ÿ˜å2 ìIEND®B`‚gImageReader-3.2.3/packaging/win32/skel/share/icons/hicolor/16x16/actions/zoom-fit-best.png000066400000000000000000000010331312567024200311640ustar00rootroot00000000000000‰PNG  IHDRóÿasRGB®ÎébKGDÿÿÿ ½§“ pHYsììu85tIMEØ */´®›IDATxÚ•‘=KÃP†ß›¢Ô*\tÑÅÍÉÝY:UqTê¤?E€8):Ä© PAÅP;hM5IµI“{<¹æ¢^²øÀÃM.¼''ç|3ÆÎá<²oHY¦’dÀ %¹«V«xi·!L XZ\„€HMl.—Ó°ð‹6‡K¥ÖÖ×ñòü ˲`Û6l>Y~·±[‘èÍ 8¤ôB 7OƒxïMG¢Ùag·ŸñGv·]©Tà³S,LË´}‹µIp'ÀáÆ0Nv ùâ»ë’ïûtzP¯×£ ( Ce¿ß×ê!®¨Ìöët¥úß=ÀlÌB(2ÃÆ©1¶ ÜAÇOŸ õº%›ÙH;xíÊ?¡V«…F£|>¯eHèté÷ ‹E$ð±·¿àÊÜ‚šúαGùr‡6|ŠcÉÆT«ÕHJIžçQy·|`³€ã…´zàÑ«%!µ¶z½N®ëêð 4FLÂ(¦ë»ÚÚÞ:Ïú²ÞÉ8;¯Þ³‰ØK6€Á‡&&iç5qIEND®B`‚gImageReader-3.2.3/packaging/win32/skel/share/icons/hicolor/16x16/actions/zoom-in.png000066400000000000000000000015151312567024200300620ustar00rootroot00000000000000‰PNG  IHDRóÿasRGB®ÎébKGDÿÿÿ ½§“ pHYs × ×B(›xtIMEÛ«•ÇnÍIDATxÒC€kIÐ[•äuømÛ¶mÛFÛæflÛ¶m{bµƒvŒç8ÿ¬«®ü†Û힆ë¾SéWx}Þ½²žQÃ~̱|Íò+{à/ _>»Wø¹º2& ¼KÍ Ò;bh芪4ÆX”q Ø7íøý‡Ÿ‚¿ÒÑa/|à©7è–.²§ÝÍÙ}\¼qž¸‹‰šºYó—&Wów>~þùg×Äãqø-¡J«iMÖ¦ÍZØŽ#:rÍúõƒ£–Æ„L.U ¿”’¡ŽgBƒá70ŽGÎtøbLH<„\b—÷%šI@Ïò<;Xªƒݘ‘ÒÀèÑ#<ßš±ÊªÒÅ¿«€¡ÉÅÆÎXëÚ- ¼o÷á…£&Îìá’vnÛ8dÅÒÕ€q¬Ûjùòo){H,C~o*À·¿ IX)­±øo}ô¬% Àß PzÓ‹#¾xá†Oƒ `ÐtrB©T2Ú ~WA Ôfl¬’ëE( %ìÓ¤BÃò»àÆïØh¿(@Ÿ0ߥº¶S §„ßÀ6{çƒc{“3Ëð"ýÒ0"z šæÂ’c*Bý"Å8Lý^}ùÏ ¢¼‚œ;qÐ-C…®Ž.~,CGû¼ »êÜ<„Px„ ±x•ö½'w;»¬áð5×^+W¯«ì0¼ó}ãGOW~\Ó—"VÃÊæHüÙÂxì¶›³!h‘N›>3ò——XV^×_w#œ¿pzLJ/DzÁ“ÄÓŠÙý½ÅjI¿áº[ž%Éàì_~áØ=wÝ÷4ü•ÃG÷ÃÏöØ#ƒŸT×TÃÑ£G'è úøsÏ??yêø‚ßUð_oÌÈÌxïóÏ?…_ziÈÈ‘#ð]qÅù-­-ñ›o½É—ê¸I©R–,_,IATà»q¡IEND®B`‚gImageReader-3.2.3/packaging/win32/skel/share/icons/hicolor/16x16/actions/zoom-original.png000066400000000000000000000015011312567024200312530ustar00rootroot00000000000000‰PNG  IHDRóÿasRGB®ÎébKGDÿÿÿ ½§“ pHYs × ×B(›xtIMEÛ BñŸÁIDATxÒÔcG€áïÆvÖ6j·kÛ¶mÛ¶mÛ¶ñÛ¶]3™ÚÞç`ü ¿ár¹>ðûÅEÁaÑ =^Ül2ê +•w>áX~Aƒ† á/ü Hßš›÷_Ï1…§Iƒ/åV‹)šY ¾ Ž ®¸LùÒ†]:÷8ý——«pêå»!«Z´lNª• 0)€°€ !¬ÄK)_?ºZ¥zys«®]{<Å0ì×@Xd¤²°ØÇZËÕËvشͦñ1Œ$~á€üj­R*.bqÙú²Š¼rmZµ( ¿!“!ih¦K*Réô³]“ަ븆e,Џ2fEde³2´s·ñ]jTÔâ5ªWò¼Ž-,\4çËßšü2.¥³’,ÿèé[ê/4e”Ñ-zL¶dÿ9ìã¯ùrŽgâRx!©Èöx\¿$)#Œ¾á ™5¤GÒ4 pÿù¥­§–îcç8ÞHô«ä¹zƒN"q\þ»NÑv5gשeš+ìTÈeª÷¨OÛéŒaØD•R©6pN£B#¹e(–ý] 3+ïP +õ¾S‹URq`QA °;ûÂwÄïÖVƒÀ*Ê3E±¶+—n¼€? zóbíå§ñkx!„ÎÞ ÅZWyd‚µw±ïÖ‡ã)4gÑÆƒY;·í  _»n5ôí;ðaƒOª6HŽ‹kÿ¯ù¸r)½¦–JÏnXã£àtIyißÖ‰J.Omw–¹öòÅËÄ?}¤Y³gÀ†õ›`Ô衆[!Ó—©¥Ö)$ÒFÌIII½kçþsxîâÙþ{wí?¥O¿¿Ì{õé¡ÿy>Á|èÓ§OĤDtéò4hð€Ïà]̘1£UFf:|ä jÛ¾MéÑcGÂÿ¶zõêÉÙ9ÙhÛŽ­nxWÜŠÕàKí·kPw$;ÚôIEND®B`‚gImageReader-3.2.3/packaging/win32/skel/share/icons/hicolor/16x16/actions/zoom-out.png000066400000000000000000000015371312567024200302670ustar00rootroot00000000000000‰PNG  IHDRóÿasRGB®ÎébKGDÿÿÿ ½§“ pHYs × ×B(›xtIMEÛt‹™ÑßIDATx•Ñ´ìFà’ÉÚªmÛ¶mÛ6êöú ¶ÍkÛ¶¹¶7NšâÙ_2ö ‚ÿ¹=nØeç]  _˜Îæë=:›¥5N‡yÙe3•çXþåSN:™EÁÚ0(æççþ Ë«l;ÛbµgN=ãR…UìèÔ¼µsxâV5$ ø½'@¬eõt~¿ûûïK{κéúË%¥…—dD dA4³àË£M{ )»3Ër'{ò¿ úúzÁl6Ü;ºÆGûްú…4#ÄvÚÉÒk ¦HbZi pè¾'ªZ~:0¨@nõD©ã'šÅKw2hÏ8íÒc÷<àˆ  à•Ÿáx–$.°0²[ikCÙÏ9ß÷Þ}Ìûï}Ò¾z‚L*ƒ|)ulp!›íîþkAD´% ù¿~“=^^OaBL¥RÄ:¯ÀЩ1‹ÚdZÌÑf²ßb¡)epd%h%{&.])Ò¡ícñäê— ¾ýîˆ'2ïdO±‡™Ú‹àe“–l@€l$!Ú1bw£ÐNLšÙ•‹-LV–WÓÏLÏXEy¥33‹sÞïœç|Ã9Žƒ÷Åqœ`Œb&‰Ü_^^~4???«ëº¹±±ñåááa{ssst{{[ãðÿ'Ï­¬¬99VE¸16 ƒÍÍÍ}¡ªêw#š¦½<|JZ\\¼+˲Às;€(ŠÏ£ÑqðöÚBbüixx8±¾¾~“òù¼âèÓÓÓ*³áX»ÆÇõ6P1ú2rȘ‚Ï+ƒºº¿¶¶öruuuvkkKã\d2™ã‹¦…ç 'WIøô£ Ò÷Bˆ©^t-'—}4©“T*õ‰Û¡Çãàâ ¢I…©°ŒX؃ O•ᙉ?)2KÍð`ÊžFZZZš¥b§Ñ\ ž;;;™v_D³Kíú=øìn±DI@¹ÆpøúÅ«%ÛˆÇã£ÑhÔƒu¡Ùlþ;$X¶Gùü›.ÆZ> ûó¢fX¸¨wÑ0Ltº&~¿H†jµš=èõÕ¥ÞHF½°lŽè‹Ð›&J•¼²ƒ‡3>¤b Fƒ"Zm¿ß?T.—­w .÷÷÷CD;D‹Iǃx0€('zÙ“&òÅkôXœÍ@ܤJ¥bÝ2pADªÐÞö{Õ‚VéB Jpá ”EkÆyµ½ÞC©TªÕ*^¸½Ê¡PèkíÍùÖ//˜Qà ŒmŒøŒ‡$tÍ>J²Õé€>sTo‘ûù§ïÿ@¼Ùí´íè°‡© ±ppZi£\g8«º,xDîˆP?îY§’‘Ͷ¾¹5pAž–šLšºóûqéDÉ)Z%ض W­V‹ýqt¤g²Ï‹Ïö~KTëÆþ»»»»GŸ|û¹åðPdÞ!P¬P(èXËf³Ó}ÉÑÈ/Al)ÎÒ­}³………l£Ñ°r¹Ü?{{{ÏMÓt“‹gåÜüî_HÐû‡ÿß4~©òZÓ›IEND®B`‚gImageReader-3.2.3/packaging/win32/skel/share/icons/hicolor/16x16/categories/000077500000000000000000000000001312567024200264475ustar00rootroot00000000000000gImageReader-3.2.3/packaging/win32/skel/share/icons/hicolor/16x16/categories/preferences-system.png000066400000000000000000000015331312567024200330020ustar00rootroot00000000000000‰PNG  IHDRóÿasBIT|dˆ pHYs»»:ìãâtEXtSoftwarewww.inkscape.org›î<ØIDATx“˜3g€'ømÛ¶mÛ¶í³mÛ¶íMª˜µâšáù.Év“§g¾ËOãEÁÝÃcªá;Г™™y¹²²²˜Åfk›A”J%Z\R×ßáàà Â?¢ß}÷¾¢¢\mjj:Ã(ÀÊÊê0B"kÙŽ.!1iOo‡ß¿?Aj´ÿþûZPPÀ€mk8ÃkÇŽkçÍ[Xîãã9éŸþÙ³iÓ&tâÍ›7O®_¿³|År‰D òGÈü9³ç¡Ré"`0Œ¯p8Üb…JΈ‰Š¢cãã˜ÐÛ̘9ã¥D&…BضeÓÄùsÈ ŽJ¡ÎÆ·mÂ,iFª«·~ø`š2uj5F; ááá“·mݺŠN§CFJ•jëêŸQ(5ß~ûí_F:ƒY‚øèq™‰‰É™TbÞÔÔä!–ˆGh[µ:•JÕPßPÿ·@ È$!$ƒÝÀæô˜S Ì/;yêT`iI >\[TTtÃáaë:èzÁÓÓsã¢E ÅÇÅ‘£ÇàøF¹Ürç×›Û÷+À××÷À¬Ù³Øñ q„±cÇ¡ÒO^þ²zvÈ´½Z,Kßã6ö+ 00ð̸qcÉq±±øeKW€T* gSù9¬*vüz=îàÓñ¼Bb&t¢S¥ß ÐïØ¹ ÅrŽ>yò$¯mmæDX@ ÚÔòóbTÃ_Œ¾ƒ¯-¼aÍhAddä«iÓ¦¥äæäàFsæÌ¡ÆÆÆ^…ÿùMŽJ3kZlT‰¾I­†#÷g¬æ ¢¿È¸¡8¬ÆËd2 ›Í¦Ž?þù˜1c¾wppXIon<>Š{aò :qÔpÂè)8ø¾ª¾Œ0zôèÙ6l0]¸pa]kkëpkkkÃáFè…³wœ¸^9 VÎo=Ökõe|07úxñâŰ»wï’&Mš4m0m½x,ß½ VþÿÏѰ¥kÃIEND®B`‚gImageReader-3.2.3/packaging/win32/skel/share/icons/hicolor/16x16/devices/000077500000000000000000000000001312567024200257445ustar00rootroot00000000000000gImageReader-3.2.3/packaging/win32/skel/share/icons/hicolor/16x16/devices/camera-photo.png000066400000000000000000000005641312567024200310360ustar00rootroot00000000000000‰PNG  IHDRµú7êsBITUìF pHYs × ×B(›xtEXtSoftwarewww.inkscape.org›î<óIDAT…ÁÝ*ƒaàç}}‹ï›ò³’¿²ˆ”KÚEȸÇ.à 8’"䯔XÚ`$fkô² Ï’¿Eÿˆ¾ì_×Ó[ª§ýk?„½ûPñ«ôµ*‹¦d‚o—š^•M™×sTÉÚ¢ J"ŽåV 꺲cYO,´i"hÈU]Ør¡ªìÖ»˜ë™ð$îLÛµaÕ†]ÓZˆÆuA[G²mͶ¤£ƒ,WÖ2¤/j(Ôlª)4ô…Ë4¢©k΀s'eF=y×µäC–+4U=0ã̤/˜0éDxL§>”DQœ«{1lÖ¢äPX¿ïUüªô’¿Eÿø#SÙk^áIEND®B`‚gImageReader-3.2.3/packaging/win32/skel/share/icons/hicolor/16x16/devices/scanner.png000066400000000000000000000010741312567024200301050ustar00rootroot00000000000000‰PNG  IHDRóÿaIDATxÅ“5´ÕJ†ÿ™Lr,×ݺë·ykip*´oq‡‡­p©¨pè(qw×ãÑɰ3g-´CwÖ–Èÿì SJáWŒ“ÿ[€ ÇÓ§O‡ Ã8À«Bd¨NQ¶8ç9h™2Š"_Jé„aX$ÏA0«««ë»zõj .“¸d¦i"“É ‘Hèš@1¾ïvÏóâ|“@£ÄÇwÐGýÑŽãÀ¶m ±, 4úg¡ëº:“`»îÂùóç§Üz“;ö¾èÓ¨– š;"¥´˜æOYÁó=d³9´¤šÓlÒœ9sN ¥R©Þ÷if[=R ¤CHA’($¡ Áè²\<(¡I8}*šú€×Ô•©†Ï8$*b7H‡¡^^la†j/[½îÿÜ×Lõ¿uÜ„T %©àHT– % ‘´EB!«ÒF¡˜0a_½qkïÿA e zçM ŽÏjz¦/!N÷M›6‹¾¾>ûô‰#µûöíÓÓL&“ñKÝJÚP¿Q.—?»OÙTGÀ) =z”`»víBSSÓš»wïŽ{ûömk6›­-•Jij—Ib·•À‚–kjj²ôýëžžžÓÔîõ?¦E‹±K—./_¾1dô/D­­­á˜1cä²eËA>ÿïOã'F›õ–³öIEND®B`‚gImageReader-3.2.3/packaging/win32/skel/share/icons/hicolor/16x16/emblems/000077500000000000000000000000001312567024200257465ustar00rootroot00000000000000gImageReader-3.2.3/packaging/win32/skel/share/icons/hicolor/16x16/emblems/emblem-important.png000066400000000000000000000013361312567024200317330ustar00rootroot00000000000000‰PNG  IHDRóÿasBIT|dˆ pHYsvv}Õ‚ÌtEXtSoftwarewww.inkscape.org›î<[IDATxe“5G…¿º—™ÄÌRdf ͉!1S,å%ÌM¡™¢sž™95‹áwvo‡Ú½P‡¯êk~ïc «õƒVEà¸ÀÃ@YºŒ}b¹/Y¥åkÔ§’;wœØñ‹Ùô±£è\ãøu—¥Œ}ñ¥ñ††ÎÞí‡g7ü¬Õ'Û^xá•ÊãBZ£ ‚¹í%cæç™êûêS0oÞîGð«V§·>óÌ+•‡ l4º4›^x‰â+¯4\;wñdžI<@õ©'_QÂ)ý{LíLïÚyºpÏ=øõÆrÕ…¹9òaÀÜØ()­¡·ß¼™ä®]'þŒ;okžËÝr³„nÝnúCæÝ†í‚nÀÄñTjåV,™#G³³ǵÂ<—(Wn·BvêS„½+˜Ÿœ¢”Ëv÷Û„*ŸC k%l‹fg0­%ìe–êõ•×% ºÛK; TÄÁ”µnëüùm*™@´Æ± B¸°¸,̃1ñZDžÇÂwߢ„²VàúçÿŤ|Ãò3àê|¤»‰¬0¢•ð=˜–ͽ¾|³c ÇPëÌtû>¹§(ÐoɈX€†ÍW?°‹ª¬3 Øín™¦#¼gAµ +EQ‡loϱHàìÎE3Øù”¯'E |`yE yt¹Š“ÏA2…(‰Bhµ03Ó×®|jͯh€½K&^LI?³³§)EïÛI&‰FGñÏÿGë¿g€÷€së¦eÙÀs=¶nïwmå&«ô?†•;­oüIEND®B`‚gImageReader-3.2.3/packaging/win32/skel/share/icons/hicolor/16x16/mimetypes/000077500000000000000000000000001312567024200263365ustar00rootroot00000000000000gImageReader-3.2.3/packaging/win32/skel/share/icons/hicolor/16x16/mimetypes/application-pdf.png000066400000000000000000000012251312567024200321160ustar00rootroot00000000000000‰PNG  IHDRóÿasRGB®ÎébKGDÿÿÿ ½§“ pHYs¯¯^‘tIMEÛÈ$"ÚIDATx’l]aÇÿµmÛn4Ç‹fÄsìd¶­mœÙfØÆó åEúX<¿³S½wëþ’ÏßñÀ$%%E›L¦2‡7,,ì§Ëå²a‚¥dÀ¡(äèî¦ù°‹óÀÔ7o½v-Þ½C¬(B  ¯ !11 #b~‹¦‘´jß¿‡ IX‘È«0ºò0"ÀÈr·oÇÏ-[ {½<£À˜ ‚i°¸Ý¨¹{ÃÁùàdY†26$Þ‹<æTp•­´µ!<.æêjxY™9æ9Œ K<Øí±‡¨†¤üøWg'”Š ¿zh(& ™L óðkB22Æ*qáâ8¡Vð+?6oF „c¶Æ™,—ûÛ7ˆee°ŽŒ óömØîÜÇdBÊ_T$tß¹Ó+ˆq:ÄÝEn¦óçÉòù3ÝÌË#~‹ÙL ûªªªÄY=À'Îñô)"öìÁ(fÔEؼuëq»Ý~±««Ë?#Äç(Pkk!/]ŠTîÊè±'îRaÓ–-ç4U=ÅÂ>03Bp¸Ý¤lÚD¦öv²wu‘®ëÔÑÑá·ÙlT^Qq%111Œø1fÆŒØ#Gàå>RR0JBB‚ÐÚÚzMU”ý†{¶¤#>>>ÆjµÖ)œÉ ¿ãwfá?~wýÁ íÑIEND®B`‚gImageReader-3.2.3/packaging/win32/skel/share/icons/hicolor/16x16/places/000077500000000000000000000000001312567024200255715ustar00rootroot00000000000000gImageReader-3.2.3/packaging/win32/skel/share/icons/hicolor/16x16/places/user-trash.png000066400000000000000000000013561312567024200304010ustar00rootroot00000000000000‰PNG  IHDRóÿasRGB®ÎébKGDÿÿÿ ½§“ pHYsnºnºÖÞ±tIMEÛ "·wŒ<nIDATxu’Œu9ÅO{ïãØ¶mÏ‹hmÆ^3¶W±µ¯íÝÏ6žíwÑ~m3Æ/¹¨NÏù·ë¼ûÑgn¯×õ¸Û¡¯ÕTWh2M³Ô0 ¸]î¬Ãépàl þ-É¿õÈýw§¾ùþ'(}ùÔ‰ã¯&¢a´µwðŽŽbY²Ù,R©*++Q^^ÇÃOž`Ü!µ|øb«æÿÊž2‰¹sæ0gÚžÒiS6j¼kÐéZ—‡‡³ pO6¬óÛ­€« øÀ³†#:Ç»)þ¾L›4‰©&0ÅדûeetG¼a 8P]Ÿ•;gsfÍäÑFuþ ´Æœéßßx¢q½ÊO7Þôóã5__^ñöæ//žéÜîßx)èr¶O÷g_?׿Eéø¾x_JP)/<ðV¶Ó]]ysÔ(^1”GÚ6æÙ¡CyÉÛ[e) /%©¤˜+>®¼êëÃm5´Æ*¼#cõjSÅÚ¸Û^®Ì<˜òÆÜYÝùgk”ŠcGÍ]x¼îo^ÿq¿—ã[g´»qA¬ú¹£’’ñŽ‹sçšÊ’£o•ºc‘‹ óÌffèÃíµt?_4‹zìjZ—GEñ¾öÍÿ¿0 =€µµµ·OŠ‹G]:q90oØ5h)=xæ­ŠÁ}XÞ¹3K;uba?3·ÖÑÿ|!ÐÂÀyCu'FÙÚ2ÖNÅe@´¥·¼“¨ÓqkÅóðB`Ú֬έò^y»MÞnÙ’eZsS]ÃÏC J_˜.Šìe®-öó¶€°L«N]­TpíÓ‹²´Â\Që ßʰV±`•H¹¥’ÉŽò/f-ðñ‘®â:£F:ÊÿŸ˜!@–ãÅu’‚+ušÇ“šŽò­TÛç¥÷ b¥d¢“úS Jß&KÑ[Äûq p…Nýã–€ôòlŽ2h¸à&£†Kœäß]³ÊxKä¾µ’qÎê_Žý@éÀcÔüa›(]ë¤f€FÚˆ—ÄÓR V]´Eüªý*Ï8ȼ °P¤ÒFÅH½æ—Þ@K¼Ã°u¯Ïoa²øßËÙ¿ä ¸DÔ²üï~xxVœ+F±Ì ù娔zuƒ´ê´ãz Üj´àKåúšx‡“ˆ»ZZº¾®O‹òëÏŠã£EÕÂn]6L™Ò{gpp·ÍÓ§ûGöëºw]]›Üs½ð NÃéNêü^€5>¤ ÐH õ¬ÿÕRÉ,€¥b_ØÐ‰9]1×Ü‚mk²\gÁ|€7¢´–'jÕ9½>¥ºˆ 0jF Ë'ûêX1_̯ìÅ"Þ©)ÖH¼XË’ËêXýc¨ZŠnXàK5,{ãÜuš ‹[è~½­kýÿîÓâk»ÖûËÌ&Úü>JÅòÎ@-|# j(Iö­eÙ© qÆçýôÕ4…к,IEND®B`‚gImageReader-3.2.3/packaging/win32/skel/share/icons/hicolor/22x22/actions/dialog-close.png000066400000000000000000000022771312567024200310340ustar00rootroot00000000000000‰PNG  IHDRÄ´l; pHYs × ×B(›xtIME× 6Ô iªbKGDÿÿÿ ½§“LIDATx…Õ”ëÚà/IÛ™Žu}mÛ¶mÛ6žmÛ¶m[Ç6ÚQ™4yG ×Ûüþ½¸¯’ž¡m€]#¦#—±1áPò éåààõìq_žs ä£H¸¹ÆÍ¦&͘ß&¼o_}3É«ÂÒ1‘׸c ¯/7çŒ3L:ê(]Ó§†šÃÃ6üå/–~ë[Ö,X Æo\ÿó_~ÞI|­‹ãç|°]o¼Q[OÏ‹¢gHÓÔÊþÐ?ûYå$ÙØàìÇùý‹àÓÈŸÀ—{9gÎ~ûÙéª+„Q ²²í]–Mÿü§úÓ6eÙú ‡?ÍbˆÁuÜÒÍS{{͹ðq<¢}§Œ¯œ/ˆÇiV¤µqÉø˜ÊÆMò3f]ºT{G‡|½®ºvmgÌ^>³‚,‚Ké™Å‡èž~ྒÞL÷1'šyÑ5ÂA«~óm…°b³ª¼i½Â~Ûù¦[µÍ˜aÑ7¾¡»»[}Ñ"µ4=ƒ?þ”!‚=8»È”® PÜ!gttŽ9»÷9Äô«îµlÍR«Ö.ì}€ÝoºC†:¦MUÍZârIOON‚6nB!:ƒúØ·7GçаξԿ~²ù%; gò ÝSf w˜©Üäð{ž„‘ÚȰoßz™®Åÿ­Z+^¿I‚“k¼#@áüvˆ'v1¸…¡@«;ïï»ùÜ×Ì9äP)ûÒMg›²úOú*‰xCª±‘á&ëÉV°{ˆ¨@QŽ ²¹f:ŠMûÍ.ùüÝg[=.€,M½ÿº V~cêä¦B*ßOÔA„ZËyÿ4\'97a#5)9!As$=T)@`+Gl+Ht(Iv%FwAt^yœ 6I<\ˆ$J€8=?]‚(L{2Qz5Ry6Pl%>I6Pa%=D'@B.GJ7Tk8T_9Vt:T`;Vf@]gC]qHf†IhsJfƒOk•Pl~RmSr•Tq‹Ur›UtWs‰Ws™Xt‘Yw Zv“^z“^z™^{^{ž_w_y _z˜`|™a{¢a«d|›d€žd€ e e€šeƒf‚œf„°f„±f…¢hƒhƒ¢l† l‡¢m‡¦n‡žoˆ p“¶q‘¾s­t§t¨u©v©v’®w“«y•¯y™Ç¶€œ¶‚¤È…¢¹†£º‰¦¾‹§À•³Éž¸Ì¥ÄÙ¬®e7tRNS $'9@ELV^gpx}œž ¡¬´¾¿ÆÆÍÎÞáââäçéîîñôöùúûûüýþþ*:$/µIDATxc #àPÖæÂe׬©ÓãDeÓ(¯¯¯Ö‚òÄD!4«zQmmm™.„§+¢YÔÒ«*+K ¹Á¢rîÅyÎ ̪…ùF<Å qq)âL*Þi qYƼP“%m<üÃãmu\S£Ã2MøàöK[ùÆ${åfD…˜ñ#¹KÆÎÍ'4ÂÓÅÑT޲Ö~‘I‰Aæ‚hþ·Ï)ͶÂðµ’S…¥0f`0*ê‹Ð)6r½#?ÿð7IEND®B`‚gImageReader-3.2.3/packaging/win32/skel/share/icons/hicolor/22x22/actions/document-edit.png000066400000000000000000000020131312567024200312170ustar00rootroot00000000000000‰PNG  IHDRÄ´l;sRGB®ÎébKGDÿÿÿ ½§“ pHYs „ „ªâcytIMEØ &Qã‹IDATx­“”$G€¿îÛ=ìþˆ“ÉÙ¶mÛ¶mÛ¶mÛ¶mûn9žOw%™w}öË÷^¹ê+Kü Ü®W­¬ÇâÚ&ÃO„ó.Y¦‰Òñtª!ÿ6¬iÂEQKý/öf´tCQ^\®üA b'߈×ãRE®Þ‰¦ÿôz~òù’8|¾¾šXB 7$ Y–é;àU@õÅâ¿]ÈH#½ç‡a‰åPn‡RÝ)I/.¢—y‹·¥ò{A’å@[ Š÷~œ¶tž“ÕG†„z¥KY8Ë­šªªÇµ 0ð½ÕDhe¤ÎûCö=¢ãÜPÂô~ Ñ3¹#ÒãÈ8'÷î‚>µZéÇáx¶øÞ ô_Äõ‡âI&ftU°:‚ÕèÙ<ž¿š4¾¼ú}„8÷²hwöŸ±!)v&·sú5x/{¼<®âñÛRmZðÙ®dÝÈÎs!Ì]ÿ¡zÖÄBŠ$?°öRI,va~€wÄïKµ#PœÏ‰cXÆ•ÁŒYðUQèZÕ@¬ñ™4/~é'€Ó€àCñ[R-U½fÔˆy< tw—ËMÃâ&j“™¹'Q¶ÿѰaC4é§ÅZe„âF ›‰Ñ&è:ú1v¥³ÛèPÝËœÝrõq(õë×'S¦Lh¼/ˆ…ŠçÙtœnA‡¡§ˆˆ¶“#•“AbYyðl?Ê•+S¾|y´OóU+v=™„Plt~GÏm¤ÐyßÊÊKÁLÙ “?~Z·n €ªª¼OÐ;âWrw¬ »5’‘3ŽqùŽ_ÿïgJ;3wŸKtœä"MÚ´iÓ«ÕŠö±¾jÅÎ=Îà‡$!$ž"ÅcÐ õê7fõêÕäÈ‘NGhh'Ož°úO®˜Wge¾‰ÝtêEr& {FŽdY‘U&}ºô!ˆ‰±±cçNëÐ!CÛ—>{ÑQ\¹|’„?‘ã„*WO”ôåùè¯Ø½aïH×oØ`9bdÛððð€à#Tãv»Å²%‹DÎìYÄɽó„ÓnŠ¢UU…ßïaaa²ÅbóæÍ5ÿñǵ‰O¡‰=8|pŸ0õÿˆá=q@º|ù2s„ ¿(ÕÄŸ#0ATT”X¿~½9yòä5¿$Õ“yø:^Ágø AWè×k7IEND®B`‚gImageReader-3.2.3/packaging/win32/skel/share/icons/hicolor/22x22/actions/document-open-recent.png000066400000000000000000000020071312567024200325140ustar00rootroot00000000000000‰PNG  IHDRÄ´l;bKGDÿÿÿ ½§“ pHYs × ×B(›xtIMEØ$Èýƒ”IDATxÕC˜äÆñPh[cÛöemû¼—µÍÛØ:­í±m£mŒšÅîBªRÙNµÒÏûé5všÄY‘ËÉ5. Ü>Ð ¿ûî»/<ýôÓ¯j+¡Û´#[NT1oKM™Gô‹ Õ ‰é=8YîP<—+òFËeK¶þõíO]F3hРÔþÌÔ4 QtÐ8ÛNU³ö¤Â¢wžäžQ™ØE ‘ZoȺ|KÑ„Ÿ7Æ}ÌŒ÷¶qxaƒˆ!¢ êè5‡ÇÇßáåÇ&ñÌää$HÔ×Tàs\¡_"¼ûàP&M1‚¸¬ù€Ø D¡³[Ñ0À¯{K°$§ñl+j—4|>?'N§´¬¯×CN¼À33ú!%$?Ïèç{Ê¢£æK¡ÃaUåhi#ƒûô 3^Âàt99wîååäžÏÅçóÑoúÃÄ&%Ú½I½§vÀP7Ph/QZ"`·É Eƒ¸ÝnöîÛ‡ßïo]oCQ^6 )Ʋdì8ŠiЉŠíE$I¢GšSÞ q‚=³%Ë—‘’œBvV6 ‰‰ü›ëÄwàŒ†»ò²ˆ!:bFõy‹ÅÂ݃â¨rµðçÉ+¨ˆ‹§Gv2Ò3ˆ‰¥±Eå‡#5(Š»ŠsÿÉfØxY:®µÔ ÏÕy§X~ôªäáQi¤%X-VŠjý,ÞUÉ¡ZO˜Â-k‰¨uׄ׷cèÑ£ŸÏ¼È§¯0ï¼Ì¯çëé—`!(nVi±Š$æÿ½Éqä·ßÿÕ°ñæýrL™<‰Åö\ÖËe¿ÓBµGFar¬Â#½mä6Æ]톗BŒëìv;'NdàÀ¼X[‹ËåB–e222ÈÎÎæ‡w3 tƒÑ!|­‚:”žžNZZª}:ºö À ›Ñkâ@ ‡ÃÑç9D H²§Û£\¦ýc.¤£úËàñx¨««ÇétF/Ñ•ººÝK-üöˆ˜;6ugîXïÎëõR^^hôП¯ùÄ×_~þRSccƒ 6çÚ¸Þm(ÂápÐähŠ¢U•ù /zòÌ™³µ×‡M×õZ°Çã%5%•Ó§O^µfÕƒ›6lºˆ)2f—kÄ„#Š465ì_ºdÉó{öì½p]¸´´´©  à¹Sãr¤õù”UU—}ùɇÔT×ÔsÜÙÏT Ì ò?ゼÕð`IEND®B`‚gImageReader-3.2.3/packaging/win32/skel/share/icons/hicolor/22x22/actions/document-open.png000066400000000000000000000020741312567024200312420ustar00rootroot00000000000000‰PNG  IHDRÄ´l;sRGB®ÎébKGDÿÿÿ ½§“ pHYs „ „ªâcytIMEÛ 5W’ä¼IDATx•“Ð’»ï¾[Ò$‘î¿¿úwxÙ“ðP5ë#{­´Â 0œiŠHžD§÷¼÷h4ˆ4wØ~ûþû|äãëžüqhÉÕ6$ P©äxìÒ]6ÏÁÑ!0£ R¤ÚÊEÈîuvuÑö[o÷=ñõ<¬´–Öª¯¿üt³ãoù¬ÏAU@+ŽÛñ/PXÇ´T.£¬ÎTnkCWw7¶ßj ì± ãí×_B½ÕTÖê•*ç×çÂ…øˆˆäI·1ä°…^ª|öövôöõãè#CWϳ¸ûÍ÷0:8~õCN“8n"—ȯ3þí|µãî®.¬¨gñÒ‹/bphq#¤iÞÈ2Ë.‹³÷îÃ×|ŒUöZ;ÉÁ‰¾×€¨(àDÔ¬†#”JeôÏ¿Ú;»$18 Ì OPo¶°Õzkcö)—cÕeÀþiwþNg¢ÑjÀdŒÔ[øäë1˜:}6˜Y-Ñòkµ& 8`ü¬šÚäAD€ £…7ž˜VæUqÃe§â ,ù*æj;ùýú“”;M¦Mš4™.¼û)¬·ê’:+A±mû(Š<ªÕªƒ±ÍÜ€–¬v¿¹€ü,¾ýàøÆÍXª¿oQ¤!…)9Í’)9²Ÿ4g5²´Ú`N&;l!°Ú‹(„)†ßþGP8…ØuJ@ ”Ý·&bu›;V–d`±n@à ¬3Aѱ¦Õîm‡¬.…â;¯¶Ž­S.j±{T¨xžð¯ ¤¢iMPvÈ9} ùËd`u`p€ J0fYÍQÖœÝS–×ô³Fñö—cÀ,€­ZÒlivhƓŵ÷4í™ÀyÌ™2 ~ù%æÇª«­ŒˆD`§mi`Û&¼XÉž{²ç-C3ò©ð#µX†‡jÄ"€Ú‘ËÁ±ØV hj¶gÚP׌¡²Eb*v7/½e‡êàH %¶8lÃfKŽ(¥…ÀM½çÒ ˆHZ #“€H´iì(KÒdHˆïø hl1~/¦ÊIEND®B`‚gImageReader-3.2.3/packaging/win32/skel/share/icons/hicolor/22x22/actions/document-properties.png000066400000000000000000000016261312567024200324770ustar00rootroot00000000000000‰PNG  IHDRójœ sBITÛáOà pHYsvv}Õ‚ÌtEXtSoftwarewww.inkscape.org›î<¤PLTEÿÿÿ81$$$"""883772888DDDTF2&k2ye'ÀÀÀÅÅÅÎÎÍÏÏÎÐÐÏÐÐÏ!WN3aM fQgP mWoYqZr[s`#yug}oA~xh€o8‡u9Œ†}E•“‘—†Q——•šŠXžŽ] ’b¨’K±°«²±¬³ˆ´Š´Š´ ´´´•1µ‹ µŒ µµŽµ¶ ¶Ž¶µ°¹¸³º¹´¾½¸¿§XÇÇÇȰbÈÇÂÈÈÈÊÊÊÌÌÌͤ ÍÍÍÎÎÎÐÐÐÑÑÑÒÑÌÒÒÒÔÓÏÕÕÕÙÙÙÚÚÚÛÛÛÞÞÞãããåæçæ»/ççççèèçèéèº$éêêêêêêëëëÁ9ëìììííííííîîîÃ5îïïîïðïïïïððððððñññ¿ñ¿ñññññòñòòòÀòòòòóóóóóóôôôôôôõõõõõõööööööö÷ö÷÷÷÷÷÷øøøøøøùùùùùúúúûûûüüüýýýþþþãÚ¶tRNS"#1489:;;< BÖXš -¬Æ#VeÌLŠ áˆ•êB@ÿDšBÿ…f`Âd=€˜#FnYaþì¨^•o¾ùæËúr °Krå8p oÞ¾¥h©²¤M‘Œ8¬À .€zCŒ‘N‰7ÏŸâõz9yêd.ÃXUUæÍŸÇßÿ€¬(º Éð8 *Kø ‚;8„œ#G’º`!dEåõë׬ªØWgEQ|/P›ÍÌÉÛoHM#D´<’_{Ïáòå)·ÿÖBÅ}ÏŠ¦i* ŒüáGñ“Y[LÔ)ñ]b&Ï/ á› ~4:#SÂ%SF–¹Ôµ+åo=¶zuŽo샋zyõ ’Gáì½÷ÄëýVš|ŠÖ“î> ÃS@‡×KƒùݯÈ^U@…µÎŠo,.°ªƒÝ ¥Ém@ý_×ë¿¡ËàúC™Ó8™ÝÜ)+T¼#Þx`MýÆŠW#Ö#sïu¾ÈO©‘a6Kö˹¢¹ƒY6ÂJ´)?ž”¥~übÁ|`ÁÑâƒu¨ª_ ãŸòd"6ú y­k¹p+œåû5"ÃY?ÊAšôØû¢Å þN–¹E)Ô8p|cQPÊ^|S¯'м®¼~ó†‘+-DF3£‡™ü¹ì¬ºV™lù²óÝψõÐEˆ V|cQ |™4¤&TÆwMÆ×èËt™‘Šð]j„Sö7;=æ§& ò*ßàæù“$Œ`Å76J!Ò«¡“|ß–¦q÷ÄH•  GC;ý§â­Ÿ™¿Ï… ŒgâÅLb\Q‡”¯Ô–æÝWñÑOæ»ÌŸ™ÖÝʸõɸöš›ÍfÜŸ(I6ˆØyy2øÓ¯g3z _˳÷2™S²lˆ™-çÓqë]&FŽêDõêÕ ³îݺ…x6Wn|ñÆÛ ⯒>YKÆdØÄM\¼§‘ÚÅÊ!Nß¶²`Ô¬Y”¢E‹f|ræÈAP•ˆðpdYŽ+‹IcLgs–áð• ¤°+,ìÁç`}æJ”(Y˜¶mÛúM‡ŠæõÁ4 ßOÑç‹EHàJ¥ÁñM_ŽÝŠÕÁø6þ¤Há Î0'É’§¢_¿~H’*š[–/š¬(äÈ™“O_>`ªV,Ž,}aú°²\8½ƒ²…ÓÓxt ýÆì8±#£¢D-4)VÂíŽõÍ…q´~aƒ(#AËc&t?mc©u0‹p ŒbCí €“±²Æ ÒÐNï݌߱2ÆæTü~HðsãßÏg=y09yæ4úõë÷]³ ë7 ««“zÇ !2`!ciSkk+Ž>‚$IðÿÿÿãØ‰ã°­ÁF…ÆFímmi¿ÜsƬÆ0¨Y/g`ÐU¡{è®PÔïyžfeÀR€qn AÃIäóyjFÌXúFÓý£FFeuUX )£0t}ŸVÇq’ Œ"ü#þAWW— 5#ŒBÄq¤—ɸ«³Ó6vowKkëõ~}û\ƒöìÛ„%t‘: ÔØç»Da–$`ÿüƒÚÚZ\TV|kâøñhmo»÷ýû÷øçŸzž)Ó‘MM”$1-‡aæü@׿ö1ý¤»P—Å»IñIEND®B`‚gImageReader-3.2.3/packaging/win32/skel/share/icons/hicolor/22x22/actions/edit-clear.png000066400000000000000000000023511312567024200304740ustar00rootroot00000000000000‰PNG  IHDRÄ´l; pHYsììu85tIMEØ5 ÿbKGDÿÿÿ ½§“vIDATx­“¼ëÈÅÏL2QSߺ}ïòϵmÛ¶mÛ¶mÛ¶móÚªÛ$3³YÛûýhøó!ø ÜqÉa3鄸\nµ-žÀ/@ñ'¹ïú3gU¤³`2™d†S‡Ï?bØÔéfTr]vÝz;YûG _uþq–Û¨ldÛveªT½>ÛðgŸ¤§áÍšÕ錦[}ði/~…ÛÕ.¯rOŠqäæ{œð~¿ÃÛ®¢¤[‚óXáÔÙ˜©Nà“§|þr)ÜneÖžñŸ®Ö§[SÆ<#ã( C†ÞèiÜüȸ¿×ïšk®UnŒß4¼ë&Ë’\<°S¾=ˆ1•9œ fé HÆ`§q….sÍ7Æot%:²s±ùÏUâ‘Sü½ö«5^s‰ÿÿ/Ù¹®%3Šå*tFÑ(A‚|l†0 sñÏ?ëþhN‰XÈ>fÎÖÝ0iÇIhöÿÿ»ÿ•WÒ¿Xãõ—™…šáÔñ–¥¹çB¥ÍRœ0T»y¦µ3Y¬vvßKo¼ûï5VœGÔ8Æë舆t¸è'øŽÙa¹åu3pw<3“ÙFT&& ™:\Ç“m¯Œ ²*„ š¦u¢¢8=$>xøé³·åòÔŸE|ôËeMƒ›M…Y((18VD©.À K è{ÿÅW>üÏ¿;þÃ?5 ð€‰±Ú øü…ζ¸<ütÜNÙu32/vé°m ¿¶Õƒ'+ÐT‚ÑÉ* Ýz_)×?­ ü‡|< ÁÔ€†j&âU\ï½ù#\sÄú c一elª¨Qˆ@½\ƒ'8à4ŽÁ¹«o,ø¿†Óí'Ì÷æeb$ÊÖk/èÎR,Õæùw.iB•’6$!&ž4±0â×pf6 —£Ú?4qÝX±øfç2³\¦é¬_gd¢0gb¼öÜÀcŸôê“#£ ª ¡¦Ç7™>ËD½ñË¡±ºpͰb„Z|£Òu!àÕ¸l€|ýoþÖøÿg|ʱîr½ñøMqÇwÀgÀ!ørÓMëeÀÖ)Ú¥D+€„ëòN@´êŒ¶Šf³‹hjLiI!ï‹ÍýÙ„VËÝù¬˜íí·ñkøH ¼wÔÚäs+J᪠%ANd­žçÙã“%¯- ~0XíÛd¿'O$Æñ{|O¡ùkP†*7IEND®B`‚gImageReader-3.2.3/packaging/win32/skel/share/icons/hicolor/22x22/actions/edit-copy.png000066400000000000000000000010021312567024200303500ustar00rootroot00000000000000‰PNG  IHDRójœ sBITÛáOà pHYsvv}Õ‚ÌtEXtSoftwarewww.inkscape.org›î<“PLTEÿÿÿ%%$&&&(((¹¹¸¼¼»ÂÃÂÄÄÃÅÆÄ®®®¯¯¯°°°±±±²²²ÒÒÒÓÓÓ×××ØØØÝÞÞåææçççéééïïïôôôõõõöööö÷÷÷÷÷÷øøøøøøùùùùùùúúúúúûûûüüüýýýþþþÿÿÿWvtRNS$'017LMeeƒ“òõùúûvW9%ÂIDATx]ÎErÅPCQIá $ÓìIašf2wÇÏ*ãÃ)Õµ ^bû©³OqyÛ "–ï}eF¤D*‘ `†’’Û²ª?ß‚<¹*ý‰OªëCdH‡¾#q蛩ÂåÒ °ôux°¸|öÑk÷i™×hVz6_XI ½žÍëˆVfÏ­C5ddaÎ?Œú™Ðo7róˆ9ͣʛ|¯†‘ã¸rŠ10?þZ·1÷£ ½U fžãŠïª›W€®àO¶ýtþŸJãSÆIEND®B`‚gImageReader-3.2.3/packaging/win32/skel/share/icons/hicolor/22x22/actions/edit-delete.png000066400000000000000000000021201312567024200306420ustar00rootroot00000000000000‰PNG  IHDRÄ´l;sBIT|dˆ pHYsvv}Õ‚ÌtEXtSoftwarewww.inkscape.org›î<ÍIDATxµ•ä8…Ÿ“IÃ0ó$³ÌÌÌ(:á1ü„cÁ13“𘙗™™w“YžÆÁN'±¯ÍF}}L%•BÏŸŸËe… !ð„‚¼ØÀXë:ÆVÈ+þ8þXKŽƒ\´njiiK¯^-Ö„B¦|Îýž¯]«i'ο÷®Ø2hP[¾VÉUV®ðø£ÍúÈ’¬À±Œr té÷ÐCF´¢ œ‹¬ &݇C@a1¸\³gÏ‚ÓÄ.%ÊJQ0p¬ûî³ Äœ¹BœÈp—Ê2ìñÇðàÅâÒ9Á3PÈ‘È:p*'àô%%PGÁ¡»ï¶TÎh>د ®Ò’Ç<ó4-9qî@@…–ìõÕÞó¡¥P'OÆÞÛn³׳” x@¤Àã|îŽë®·”ºzhUÕ`rÉU骴 ZˆÈÌ™Øuçm¿•Q€ßˆ ¥æ8èüô3D讬„ZR F›Ä™êY¸É$<×…ý[€ß*ÅÇT X9dÑ"=´{7Tj©i¤…®œ1¸Üª*¸S§b÷—_Zžç͹èJ!¡ h¿ tìß‹IŸ¡Š „ ¦]8®Ôïbýz ]¶LWTu¥û›à·eG+ZæÌÑù¡CÈR[qÀO:êHŒö±cÁêê úÞ»©œÑéR\2rKáCA›gÍ2TË;saú-+ƒMÀ?þhJí¸yóŒÒÐKÛŒ!CéRÛaÒ$ÿáÓsœ¹—PY|Çx³dÐ Ctw£—ÚË%±À+-E'A·”S§xîÖŸ~2Û ¯¯‡Ó§³»º=rUãÆ’”®I9bzåå-Û“‹ Aw(CPéB¦Mð+WšI]‡¨­E–´ãZ[qfófÓÎ?ÒoÊn S§S9”Ó§Q@€v|î5y;îk¦N54rëÐÇ~úÉòèHKmÎÀ ^7j”Ѿ¿ ÇɇþRKðZ*aû‘#  ¿ñ‘ùÐú ×¼oKû¿ýL†Áz³h1ãkIEND®B`‚gImageReader-3.2.3/packaging/win32/skel/share/icons/hicolor/22x22/actions/edit-find-replace.png000066400000000000000000000022361312567024200317410ustar00rootroot00000000000000‰PNG  IHDRÄ´l;sRGB®Îé pHYs „ „ªâcytIMEÙúãÛ.bKGDÿÿÿ ½§“IDATx½”p%YÅ{›_lÛveâ±íض­±mÛ¶UúÖÛq^¿³·ïÆ.í©:ߟu™ÿDâââ2äËžxñ âÒ¶ÿœ=ˆ·ï!ö¥×zÛATTT¶/¶/¢¸¸žžžØµk8M:sæÌAQQ\]]ÑŸÿ/p®••444 ®®!!!ÈËËS¨   èummm888àÖíÛ¨««Ã·oß𕸠ìך€M›6áСCHHH€²²2"##±`Á„††BBBÛ¶mÃæÍ›±lÙ2èééáÚµk¨«¯Ç?ú‹š››7-Y²„B¢££áïï ˆˆˆ@UU•fË]óðð@FFfΜ‰ääd8;;ƒS}CC;xtWðÓ1cưeååüŠŠ P˜´´´0cÆ Úo555ØÛÛ£ºº¥¥¥ÈËχµµ5©.,€[w ÎÂ"´`iiÅNI1!ÈHˆÂÚXŸd¾bbbÐ××Çõ7h_………‘žž% ÈJIAIV¡¤Jiy¼ƒ§ mø—tuQ%.Â+|}¼yJb VDŽÁ–ÔÙˆœ1žNÐÔÔ„©©)í£ŸŸTHŽ*¨H Ãæ¤iHî 5É‘°´¶Eq¸DµP£Íðªæ®µ4Ð`-TÇNAUˆ"Åáe$ ’•››Þ¼yC[")-‹ C!äû)¢ÈOY¡“`'Ï@SC Š*ð±æÿypäF€qæÀîv¤oÉ~Z˜gÊ ÂœA–·æOŸ@‡Ä©¹¹h¬Ec`Ë ÔŒÁB‹áH›æ E%eXHâÍ)ˆ0+FŽ`¤Úû¼ò¤‰ü#ëŠøg7òÓ“balb‚ïß¿£©©‰‚[[[qÿþ}èèécmU.l.ÄŽey°²±…¢œ0þ> €š²TÖ,¦‡¦Ÿž6m7mº—íЖ– fYÏŸ?GTÄL­q1()ý?í‰ÌØ\º|¹×ºµËÈN666¢¹˜3ð,¥iÁPQÓŽõBȶBn^ô ö¦Ë^_ÆPŽÙø{%Ö•Žƒ‚’.ŽVˆ£*^ž¾xöì­r@0ɘƒRwÍ´áÏZœÝ:•B—'Êà@©”ÕôèYA’á:t% Ë~Á¤ íÙr¦Ù¶’ïßï­†’Šâg)âÚJÃFˆâÉ“'ZÇß±c{+y¥ Ü–1ßÞÿ†‡g3±«Ú.hãíÛ÷­®ž¿víZ:Ž“m Ðv0§´äXì_5/~¾€¿Ÿ½§ººü5kÖpбí€A3î >~d?ýæ±,WþöËà A>‚¸é“AñÈó!ÌPDN/å¶²Æ ÁV±þ|[Œº9¦ÌIEND®B`‚gImageReader-3.2.3/packaging/win32/skel/share/icons/hicolor/22x22/actions/edit-paste.png000066400000000000000000000016101312567024200305170ustar00rootroot00000000000000‰PNG  IHDRÄ´l;sRGB®ÎébKGDÿÿÿ ½§“ pHYs „ „ªâcytIMEÛ 22©OjIDATx•5ôF…Ÿ´ZFãÏÌŒÉG™#3Çf¶#3Cæ‹ÌÌv~¹™™™–™ŒKšžnG5§:úªºD­×Ýo´³<˜¦yŠmÛ°0áóùüƒÁàE,ĶmÛàá`¥RüñÇŒ¨ÕjÀY2"2119Y²d vîÜùÒÑ£GE4uxà[xà½f³Iq±yófqøðá×öîÝklݺ³aI±çV¯^}a(Âúõëñý÷ßcéÒ¥Æc=eË–_ýµ“366†^¯wîG}úá‡NÃ,ëÖ­k§R©øgŸ}†©©)ìÛ·ÒKxPþã»ï¾Ãøø8d3øõ×_Y;–ït: rÑðÕW_ANbø,ŸÏó\åÐ:d2D"ŽÝûd°“žŒ>C,aíÚµB& "Ç¥RIpñªÕªã÷Ë/¿,æÁ³à ‹GÕeY#»£óùãÏ44ÔT†šLi¬Y½ „®JRGÞçQáÍ3M šÃ£j),zæ…I*tÔt\\a(Q†®¤[1«¨:J3á—‚>'LWØé|˜/taù…ƬE_¶,vJa«¦E•e‹µB/DQ 2(Æ£»Ã:–òn¶ŽõÅs;¥ÈP\UÞìÂÞŽ=/X¾éÎ|Co9v·ÓqŠñ“ôŠ[¼ážÝвØP¼Õjâ“O>A£Ñtrü~?‚Á 6l؉ϒÀë3 y ²3Šk“˜( ¸øâK èõºxø‘‡› +é_F,ƒN2™t»×ýdÑ-Üo»Õn⑇iÜtÓÍ×x×N$Ü*ÝÎjñr¹·H¾ì ÷óªT+RôáúwÜy5€—!±¸C1‰ÿ$áp¼æÞ¬„û³ú(”r/G6ŸÅSO>Y¿ëλ¯ðŠ›sÙUWÛ¹LÚÈe2Ê_†+N§!w:ÌFµVÃääƒxò©gn( “Ð0–œtÒŠ¥Ë—­òûðÀÜw÷Åãñ0·HÙ¥ÍÛ2²¨aÇR©ò~øV¨éŸÛ1z/†‰=ºR…IEND®B`‚gImageReader-3.2.3/packaging/win32/skel/share/icons/hicolor/22x22/actions/edit-redo.png000066400000000000000000000022761312567024200303450ustar00rootroot00000000000000‰PNG  IHDRÄ´l;sBIT|dˆ pHYsvv}Õ‚ÌtEXtSoftwarewww.inkscape.org›î<;IDATxµÒƒ—äXÇñß Šªv÷ Ýc¯mÛ>ZûOXÛ¶mÛ¶Çžéj–™TòÞÝ—=Y[Ÿsâä=bfü–×N­° €ùÞ¦?y¾ð¹¿|õÓ“–¤q¦öI/ü[ÑýH£ë'5¶Äbõ˜Ú4ݱ.ÔµH—3X8þ%ÖŒ¯BbíHJº|² = ®ip¯ÿ çúá‚M®ŽÄÂÏž;&Ö6!nF6 T¸O˜jà I'‡áR ¿øœÓÉ£ftõM˜¶×´ƒpÕÓ——üðÑOÛ:&O랎†@.lü“B¨º,K|"¤¶N”Dï¼ü.øÑõ­=“û;ûáŠ!‰S`.Pm ù|g¾øÊ稃B^˜¿°ÇxáÏÜbu‡¨ ŠŒQP¡l»Ö nè“„#Žp õ9®àM8൩ybÔ«dETr!Ü0óQ†Ï ’Ìæ¶ïol|Ä…a–O"õhS]óé¹Tá 5Ρ<¨Âøº:ꂬ• Ž%r»XŒ_øî‰+õÕš.˜óÂAÒ­u¡Ñ§¬ÚxM(8Ã.Vö ÁovißCís:_éjk£¥ÕUÂ`Ò#z€â/†)³s…~Uw©V G¦&õ/‹&Þj¦ÖÌ꺦ą]²©!hQ\UIÈ1Q/µö×r°˜tUThÒÅo!f†z’9¤Ñ^-qz+øÍszD+¨‹œˆŠ«”Bša™šîêD€|u³ŒŸ˜úF+-Ùf”öl{Ng<2«3Ú;³–_õŽPa×ÛaÝt‚š! Òä“/dü9?ì#özkçh¼sP‡L—ó"ªnÕMÒL~x£¯Êß ÿ`ë÷6§­“Œå™„ˆ…9UÊðs>f(/ü?Ðð?ùôƒ#ûÐT…«IEND®B`‚gImageReader-3.2.3/packaging/win32/skel/share/icons/hicolor/22x22/actions/edit-undo.png000066400000000000000000000022621312567024200303540ustar00rootroot00000000000000‰PNG  IHDRÄ´l;sBIT|dˆ pHYsvv}Õ‚ÌtEXtSoftwarewww.inkscape.org›î</IDATxµ‘,I³ºkz¸Þ}¶~Û6϶‚gζm3p¶mß³¹Æ,Íú®g+#rØ_vW•ž8O9;@ ÀþÖüÃú³1Ê(¯}À'íÜ Ÿ€zü\Ž´¾nÝÑ^Øa£Û+G]Ô4%ÛXÛ ©k˜F&?”Cè·Sêk£ØÕGw[Ð%Fö²3·R¸üËö͵.¿ŽöeCK€…5M™­æþd2^áO¸…ñ8›¨#©F˜raÿ“,{«•Ò@|+°Ÿ½AÏÃò«þ¥'ÓÝñ("ŠñÿˆS; ¥> 1Iß[t®}‰u+‚õ?‹£Á¨\ MÍÿC¹9Èd0Aò.J |ð(QùïÓ2­™8ºwjëÚðR`ë÷‰$6”€®E£Ÿ˜Ð§¼zQw;Qo'Žë’j˜@fÒ\²Sf†Ü&&Lý>=ó·²ç³“}ê›F¶âçúFÿjX‡:\ó’W)ÔÇxYƒƒÊë ©ÚéÔ|ÿ÷8©Cuè>–¾]ìæj,F’8WY!ñ‹ t>‡Î'ä'Ö,3„åØÁÞÀÍLù¡ kÖÉàüPÕ|ï/  žú™ÂKõ~)ù‡ƒ#Ÿ$ñ1& [q ذ}º²"(E="ò]º°ï¼jQTdš£âr{XY;?NªU±b¢™~9ŽýN*óíòÛHâ ^íd “~‰3a¹z¡e²× \e÷.´Þìµaµ 'ª8èZ¹,©”×[‹q)é+ä5–_h`E±Í©+¬Yƒ *”—G¹v h7 º[ù1ïs{˜0Ñ*+±¿*.k”«+"¦1•÷~ÁÏõ`™m+oû'».?Õ.µ®Cª("ŒÁ õXÞGa…BZÃÞ•¥œ|bâªL°½Ùáòð?Æè|ÀUq å2n{”жi¿ðqvÕZ¥¢ªÓšÆÌ7þ@ȇJµ„¾‹åuÍGÿ¿D–Ÿ­•xÆ©Ÿ§Ó€Ï÷Ÿ®òÚeKëÙ¹‚C\Ò7§µô'6LÉät_5X^ýXx4šR’Ò’ô:fí³MN11o¾0ð_ÜZkêkëÜ7‡½ù=÷2 26žŽ=53,¯},,©V#ž6svè’e·OW n9TÙ´Çsi×1aY5cR¾]â(ªŠàõˆó—(‘¤Tâe×åá…ñ<vùî}‚eÞ–keáݳ :z¬$u¿ýíä.ìÓIçP$™ÁJLÑÑÍÅÖê}"ܴˉ2 D„/ÂüG~àJ£ˆb­¢(­‚È J~¶»ÊÔîâ@]GWÒzÈ…òÍäGÿZhÞ~ægŠ8J/åšñ“‹ÑDŸ·'<Ÿ 1È{|ð‰¿0«_ù•Ò• N}qƒÎÞ¨ù?ñÇ#6ü•]~ÿ§Ï<ñ·Á;³mGÕBIEND®B`‚gImageReader-3.2.3/packaging/win32/skel/share/icons/hicolor/22x22/actions/go-down.png000066400000000000000000000015521312567024200300370ustar00rootroot00000000000000‰PNG  IHDRÄ´l;bKGDÿÿÿ ½§“ pHYs „ „ªâcytIME× ’N ÷IDATxÕÒ°äHÆñ¯ ζmÛ¶mÛ,ëP:Û¶mûÖ¶1v0IÛoªÖö¾ÿù% t»æÑƒ¯ÿÿúëß >#Nfl•¬³Øú«{/ÚûìE‚¸êäŠswå”RÌÚóoöD®Xc>½N`qÌ£Iù â(Æœà\©­1µ…ƒ•Œáyþa%ÚPš,,E„VkΰŒCëEƒµ?00!dê·ÐZ8X°©8û¶ç®5ë Ÿ„©©$æq,Á8™ wP¥•ù-ìz__{ßB±Ýàò3~ù’S÷¿y&xÔ¸\¼ÞÚ+gÛoS0ÆaÙ8· –ÀÔ 6.”N9qH!2IC$ VI9øêçžûÌvÅã'+œµ÷n[l¾ò*+`ãPšæan]keèüîùò¹ÆŽ›„f£®(·î걩o‚‰=bg­í{5êµKÖ]o}J‡& ÒÀqm–— Xnaâä*Š¥:ê ­z I>Pë÷ö˳Á]…ù~„½¦[¯%È"lk„1ÅÄÀ‰$Št¶ÙÔ še”' ÿ‡Pë’¨’IDATx½’ÐìVF¿«h½Ïï·kÛ¶Ýaõ¨¶5jµmÛ¶mÛXorÕ$ÏöfÏ:'WXXö8î®I;uwŠ… {»s½F½ùx$Õ3{_›]ja£äyÃÃãW^eʼnÃö", `ÒÆGm5Ð?áâ=v^—LžÃÏ¿UV³];~õÏÇ÷}¸Ø#·ÎÁeWëvÞvuR­Ô¸õÈzôÒ¡}o\ì°ÕòòÍ7Y¹Ö R©¦Ê°MÖ(çsëÐ~79‹.¯ºÿƒ“÷ê˜TNGZ«ÔQ«ÖQ_óžÁH[ËÈÖ¹‹´Æ…öìËfƒû7Ýt×Z@k•¨ ¤T©… ðë/®ïõlþfå«§¿\àˆó#»0sÃZk­’·– ’‘²Ó•±aò]ìJƒbÃÿ®ëØü„É [«ŽëëïÙ(W(Æ!@j¥b5…6$þLÓÏRŒ vÇévå¦Î-N¦ó gú·^3›ÍžÞÓ?‡†Œ¥°„DÀ"‘ÀA ¥ ²¹<ÍUëïçöz6 ,ìMã;úE³­J@  ©°±Êp´B‚ÿj ¿ü^Ç?ÿæ°F6yã#7ÄT8¦2f\ùQš°\¤þ«FPPÖ@Àq)8£´æqܤ7Ž?ˆ ”„“ãÜwýóÖ›%œïï«M|ÿÉk °€Õ©{t<߃à€ÒaÈñÀåGƒpÌ˃û%”;»0aÅþÏçñ§w\p¨×½éá„ æ‚ÀÀ¨VäûËG€’5ƨW„ÈwL>M¯^þNÏNhÿð¼™u3·‚纾ç¦á0Š`aÓQÆÐ½{£Æ\à˜̱œ3¸ŽƒL§”I<ŒÀÒ°g`ÑÃÖ&XØ4H(™þó ‹v‘”h·Ãthl; E‚B ­FˆÅ w®²üC×_|ön „9 \€Æ¯~¾€Þ Öxü‹çÞU˜ èßš§QG¹ƒ)ï“W®þ~ó Œ:ÿwJgÃYIEND®B`‚gImageReader-3.2.3/packaging/win32/skel/share/icons/hicolor/22x22/actions/help-about.png000066400000000000000000000021261312567024200305230ustar00rootroot00000000000000‰PNG  IHDRÄ´l;sBIT|dˆ pHYsaaÁ0UútEXtSoftwarewww.inkscape.org›î<ÓIDATx•49G_:­ùlmÛ¶mÛ¶m”ζKgÛög›;j¤“\oÏÞNíì^Õ¯ÝïŸ4a­åp€RÇZ u$ =àÒ3þüz}èu~`]±•rÍÀ“#¥”B=G ~ëÈ.8h½g†á¬¢X ­-@xÙCmöéèY÷o¼ÚRË®½ì0ú–|BÏÅ*ÓTâ”1ÓñݸS7]aØi¸Á@ °=ЧM›VÚíê7®ApÖ){nä÷)…ÌZ“(Óµ;®Ã¨A!‘Jyñ³Ñ*®Tï}éâƒ/2„*`[ÅÎð}n¹r¹e–¾ê„]×gÚü˜43´ÒZ`ñ!!/}6šq¦Ý2ú±¯Tñ€m¯^C…½¾¾ø¨Ã¶zÖõy 8~‡åxèq´¾ïaý}n{á³dHmöÇã§}à4n|Q¶©ìѽ·Y7œ½(!Jt—H +-Ö¯ˆ°¦Ûù)s#öÞbÕ`ôÌòƒí®æW±Þ§{.¾Øòë èÓ—z¢h¥Ç<òÖXk™½(FJ‡Vz!Ë.6|ñ›ü´ðJC,åfýûõcA5¦G¬åíŸfƒm<2A+Q¢:°/ã=»Ð!† ‚ $J3Z ¥ÃSl €Ö–ýoúé:ôD)w` :Ÿ1Ž]5‚nÏ.J #ůü‚+%ž'©)K”9DJäç›Ï;NM.v»JóƒH3ò 8n'ä§iUþ¦žY|)p€ÞO¥ÓV©2·1s^ŒvšbÄ1Sf{õÁs|?Ä |ÚHÔ J)¥™]×ÈÌ µfêœ2:M Kó$`3Ð鄦ØÚß*•òå€ôÀ3E ÃBCµZ¥k&-ÐZпÙgk@Õ@ëßšÏXóuQU…¸ˆëƒ4’owR»ž+Ž• ­ƒ¶_5ÅÉÀ‡‰L‡ ¤Û/ÖH:BÑà ÒâzB}þ ’AwŠí¯W¥XssÇêâB§],ó¸…ô§«Ö _è0ó®Ís¹i ¥‘gÖoÃQ…«utëŸý †Âbk5ºë—ŽÃêÃBRlƯs2¬ "ˆk0åh›ýœýæîCº‹Å6.ë¯õ,~°/ÙFë/ÖY¯=¨¤!Ló|=Ć4~…o>ÄÚ²ÅÍ–Ÿ³«ã‹§MÿÅϱßp°X£Åm3 < TŒWY6©>4ûêÎ×þié._æ˜Ð>äbYr·µž³ªÊô@#Àõ¼6iôŸ6ÎÞM¦Î½ÑN|4øßâVD€ýŸ7üÌ;çÜ_­ÁãIEND®B`‚gImageReader-3.2.3/packaging/win32/skel/share/icons/hicolor/22x22/actions/help-contents.png000066400000000000000000000024061312567024200312470ustar00rootroot00000000000000‰PNG  IHDRÄ´l;sRGB®Îé pHYs „ „ªâcytIMEÜûrTUDHDIÄ0_ÝvT;$zè!œrÊÉâŠrüQ¹‡îŸŠªMÒP$" ¨Éÿ(‹© °3˜‚‚|”ÈÝZ‚`5¢‰: *  °(¢$6>ìŒBí=Ƭ ! “7â$ZгƒŽ¤$¬³p2‚±ßX%!Y#°X¢HtQTÁ†º7°XÂÚFJÔÔF*åÃPAUq\°þÀšd Æ6ŒnjüáŠCãTá¨KNUi©¥a*’‘Éfu÷ÔX©ybßD*`áÀÔ8ËGåºÂ™œ{öIÈs?Ggµûœùë‹‘£¯À¿)›ÔÑuÇ«¡`Œ%,Š"âwS8q7ž<ëPÒý ¦NaYÞv8#ÿ`.¸ëa.È[Â÷Þ#uÀ¶G÷<ž1øACÏãα_qÙ ·nr(þá{æÏņÃU¶ÿù%g½‰Cž}Ž#ßk÷ÈšÊG{Ÿ8ºì¡À @àÇñM¢älœÊ£Y°âÈS(þå{zmÏ «ž o|>*ÂA·¿À ;ò@ËrŽúêGŽ»áÕ;oÿûž§1Ðc'‘ k$•{Vö`ÑË_röˆátÏ›Aûû;pÜÉg“ƒ ¡ÞÀàsïå‚ésÔða8O<¥çŒéÖ~β _z;™ ˆT(9©•\|ðQœ˜™Y>•Þ¼ÄÇI<î'†v •܃ãçC×¾«GHzÊórPYì€Kf[÷u¬µÄâ†[¯¦ê­/È;è Ýó4ÛWÌþAÁ+ Æ§ä°+¤Óe‡›»Ž=Æ+í³€ý—/>Ï£Ù!ðLhÙ’_‚ÑcqS<ÔŒ¤ãûÕ‘„ ´fp<Ô׉6ŠÅª2Kš2€‚Ë/gJF¦¶›?Nbdzú%<”Ö‚Óã~øPAAa â/šìÇ7­ DEÉOGgç\™áܦLJO[=-û’1c˜µeû]}Uå¤U µ”ï€Uµàêüü­}ØGR—nßÍ«üî×ß~{µbýª+8ø´sÿë¾ñ‘Gûú¨LÖìô9ð?>N8PÊæ¶IEND®B`‚gImageReader-3.2.3/packaging/win32/skel/share/icons/hicolor/22x22/actions/insert-image.png000066400000000000000000000017711312567024200310540ustar00rootroot00000000000000‰PNG  IHDRÄ´l;sBIT|dˆ pHYsvv}Õ‚ÌtEXtSoftwarewww.inkscape.org›î<vIDATxµ”°4G…¿{§gñ±mÛ¶m§Û¶mÛ¶m'¿mσîL^íVfc~UíîS§uÅ9Çÿ¡Ž¤ðàRz§š+óòO5€Q©æ8°êª«®ûõ7ß<Ç1"Òœ~Y'C¦m­ŠÅâÖ@*\'ŽbÚ~8èÏýdë]Ìè5Éã“ц™(ÖZT¡l 5‚SO÷MŽÏz[AÅR«YôÓéX™…g<œ”°éžíªŠ¤ÉÚ±5 äÔßt T‹J¥¥ÀBó +-æ1ÿÂÊô©1ƒ†'LkW¢¨Ö#Űì +pÁ7°Üò+2xà.>ï ¬µŽ:š=Š@+ti•0_b®”J©FenËóiaF\`¶-ÓN…+nº—såÀ϶¢}ñéÜ~ÿã<ñÄ}€‰M”ËerƧ”S 9C¢yl¨Ìîè&uC.—ïq\*•XnÅe9÷£ÓØcé¡\ùåY,ºè¢îÈ#<Î97êWŽ}ßG}%vB{àt(­‘€çSÈ6Ùx#ÞyçzõêEbºÚº™#Ó:» Ïó$Š¢O€Õ¥N u”CQŒL^©T ¥|žØ–±^…k¯½Žg¼È<×ÍÅB—ÏGК`k޶¶N6z`iv}~µâ«cÞ ¸SR]V[mµÃ¾ÿþûG’$ADPÕžÔD@£Ž¹ÂpÍv sE(…(Q<£XñyyØ*<±ÃW³ ÀСC;wß}÷›ÿ,l>þøã‡°âóœúàHìÈy÷ë8뙥jŽÊœyZg+€4â2 –‚ ØÐ9ׯ+êrÓÚ§9ïpuõV·ÐÙs¸î¸Û…µÐ¥ôJÓª qÎü9_«ýb5]ҚĖ®@HœP0…˜”F[K®¥ÿNìÄÅ/ÍÇ^«î Ы!JÝí?Më§©šÛ_+;þ#CŠ·ÖûSŒIEND®B`‚gImageReader-3.2.3/packaging/win32/skel/share/icons/hicolor/22x22/actions/insert-text.png000066400000000000000000000014471312567024200307560ustar00rootroot00000000000000‰PNG  IHDRójœ sBITÛáOà pHYsvv}Õ‚ÌtEXtSoftwarewww.inkscape.org›î<€PLTEÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿZhd…^€g | t ~ v v{ ‹ $‰$›'Ž,rÇ/š2vÉ2™4š<© <¯"CCD©%N´+SªS]žZm؃Èn‡Ç‡‹‹‹ŒŒŒŽŽŽË’Å“““–––šÏ›ÌœÏÎÙ ¡¡¡¡Ö¢Ö¤¤¤¤Ú§§§§Ú§Úž§Ü ªªª¬Ú­­­­Üš®®®¯¯¯°°°±±±²²²´´´µµµ¶¶¶···¸¸¸ºä¯¿ÙÿÊÎÓËÏÔÔâôÕÙߨÝãÜáçàâæâäèâæíçéìëëëëòúëóëïöÿðöÿòòòòô÷ò÷ÿóøÿôùÿõùõöùÿöúö÷úÿ÷ûö÷û÷øûÿøüøùüøùüùúüÿûýÿüýÿþþÿþÿÿÿÿÿÏΗz tRNS1469ÍÑÒÓÕÖÈŸ!IDATxeЃbAЩm]í­Ý FjÅ©mng?ý4›œÞa „€ÊX!§Ø2V”1ÇëóùåJ0:<:æËöžB Úz1 `÷Æ»¬©LQ©T}Øíúµ]ÝÕ__¶(Õ~*;£T ô\©¦/ø…^¦/øƒ^ò .ü«nën°âÕ|Lñ&_ä>O²¤»gãšÔÎðÉv;šHÏêã´Ùí§“ÉWöÛµÙÇØEŽ>qÓµ­k½ƒ£îB]šû£Õ3‹ËûëÛ»c tJÇ+ªV:»¦Š@'¿äû©f©ý/\œÙŸåsÍ, ÌJF:& À"¿4Z’+—:Ôdh ;t@IEND®B`‚gImageReader-3.2.3/packaging/win32/skel/share/icons/hicolor/22x22/actions/list-add.png000066400000000000000000000015751312567024200301730ustar00rootroot00000000000000‰PNG  IHDRÄ´l;sBIT|dˆ pHYs × ×B(›xtEXtSoftwarewww.inkscape.org›î<úIDATx­”5”$7@¿Jêé[f63333ChÆØ‰™ž#³scbvbfJŽ™ù–w°I’çÍ\¸Ìþ÷š[_TUÊ{Ï|\ûÕÙ×]:rå;_nû谜֕SzÏøï”ž3Ÿzô¸§ÿb Ь[?zâÔ;Oì:pMwÉD¼ïsà` a„ØQØÖù÷¾_éî:»¡wÉÿŒþÒd ØzO!¡XÚ@ŸocW±vï;W=,å4®?‹%sugCbç<G)‰ÈB‹u~1Ä®¶õ+²œÃ.?éæÍ7Ž8öû÷ÝÍn÷ Ï#ïõ‚2©¥5È, v˜ÇÍ ½p!ÔÿÿsJ\ñqGüóÑ£ ówì@ùß?”ÿÿo˜Ø 2eŠÖ¢EÈ)ïß¿¨õùpxß>×»·a+ŠÅ"âß¿c\6kgfª $ž0–`ϲŒR&ƒÈ«Wˆ†ÃHЋ£’NÃjºÇ xíõxÎÌ–}š0ož”Ž1ƒD¤D¤”BA¶‰Kò¨T€I“0g÷nÌ‚dÍVÑ»w¨ˆ dÏàÑJžO?~íxfs(mӴ޵nÌ+.•¾Kþìr­ýncâ‘ ®ÑŠè•~›pIEND®B`‚gImageReader-3.2.3/packaging/win32/skel/share/icons/hicolor/22x22/actions/object-rotate-left.png000066400000000000000000000022201312567024200321500ustar00rootroot00000000000000‰PNG  IHDRÄ´l;sBIT|dˆ pHYs × ×B(›xtEXtSoftwarewww.inkscape.org›î< IDATx­•”äJF¿ IgÖ¶½ûÖ¶mÛ¶mÛ¶mÛ¶mõôfãä%kûžóŸ$…›rÓ4ñ+4-²?&­Q)“ ±9Cü ¿@ã\;ëB“Îd,æ(¨Q¾òMríôà'ü°ÅÍòo‰"Éæ”°Tá‚•b (ÌQíOÂTÈB±[XŽlš°)ÿãß7̽µ„nÈ3Òæ J›= E`óò™ˆ{×ípó¼"ƒm7iGÞ±¿,®™eÍœeBc%H BÞ—¶â]q»š÷…ˆËÀû^Í»øZÃ7fzþÓ1VU¹ÍÆE×½G÷Þ¶Þuèš]5Þ<µ7¡ƒãY¬qRÑÅEY^IÈ/qñd“c(†8+VÂÀœÅ*¦„ÇÏ…©Ãw aÒ(H9ÜÃ0ßülûâGŸq GoÍ2é§b›^¤µ%6Z»\T¿²Õ39fOÜ Š0#ƒƒƒš—­™ŽŠÙº%÷>—°o¹äåX.Ñàuéþò:N±e úxŠÐON<Y*{ÜÞy‚ƒ‚6Ôh–‰eXº®ãä®p¼¼ãi=rS†~‘cFžN/UC[ ‹Ý׺oóùÄáÇ÷Ý…a04¡&dÝ—¿,.ŸqZ ÓÀiûù>ÍÔ%÷nzaè&tKî b¡¨BêïŠ Çã,˜lZ0±€E…ŒScZo#ÊÕMCìgÅ,Ó’ÁBa¨Ë/žJ°‡S‘t<Mc}S´“°`ðŽ'OÎÁËÄI ¨©y—Ëåfýó—cÇÚ«Y ';\×Å.Sº¬˜ÎD„¥Ë¶Î],Ãñ $QÅkAÄýûOEÞ´ð« R,ÍÐL^ìT´dÞãÌáâ€IpâÀÜ»åµ&G@HDÑb"U&{øMˆ¯‚Œ5ËvAœ=לhßë›;/o²N³ã%ŽX-w¾Làx'Ü–ÜÍ[Á±p8(ŠÉ’‰ïBx%cëÆý¸véÑ©mç¦úî!Ä;\/œ¹qaþÜåxòø@ð]ìü93–àÒù›gy·»øOMBzQ¹ |òý–©Ò&qÄ‹qãÅ@ä¨ñàÞ#\½r 7®ßÁ‰cç?GÔÛÎêø[7H¾äÝ+ª¯¡¬¾J£èBD…ÙptË{„½WëuT§Ç+¦HÜÅ|²'ÑH3Òå`õ8dp†«‡vˆJpë| nŒ‰¢ÀvX~¶Òü-~ Õ+îVÞºÆÅW©mn7( $Qä)æ½ívvWøl‰Šíªk9ao†|téÂüAÓdYe?€ï¨„àîÕO¸|$8F¦ì$&îUáRgƒ‡T:_i¨ª €‚Í"ãÎå·xö(û›gáq`ë=¼}}–ÕÚìØù}¢âÁ5nøªyZ>³3…DE`;×ÞT##£æ«DîûäþGì\EäyuD¥7˜=†ôQa'1±(“fžiGC‘U’‚ÝënKÑÑ1Õ.¾{*¿oßt‹çìKË€n{+dîýd·cA±tñ$Peâø ·/}„Åb›}þÕèSp'xn½™òµþ.M¦X”¬ùn U…ª|z¢¨;ð…ÆÅVõ!*îÛ—)˲-]dX,D^!Qá«wõºßÄ*介´V†¡‘£€LÎÆþUrÌ+;_ž_¨šk~Ugl‘)‡Y£eòSNT&àÕ¸ñú§æFiÉÖÀÀðᙬ¾£I½A…:™µ§¼>U=×ÂÙDRv²”ð”§ôYhZÓØ…3ö7×̤5™˜s¼M2ÇDJ ŽUã]"ƒ ¡Zù§a8al­eÁq:œXûaܽŒï¢b…»‡€´.È_ÜÏ~%øxÖ8áÜÁ½çbE«aÊÛ¯ü1Ý*äz7cVŸ¼«–gtÈ“>abY¢(Ã/Áf–"â­NŸ¸‚—OB6œ|8¥õ_ƒž3j?{üöá†5;¿BÁq|óÆÝxòàÍŽÕMVWÈ1dªEüÔ/Áœlú ©‘)sZøø èS^½|—/ßáî­Ç¢Iç?÷Ìn!cÔdWйÆåäÈÎ’_€—ã2KŠÍƒ¡ ,ͽÔ1ÆÛ,cZzâÁ„'‰Wÿ€ÿ×êBm‘ÎõIEND®B`‚gImageReader-3.2.3/packaging/win32/skel/share/icons/hicolor/22x22/actions/view-refresh.png000066400000000000000000000023601312567024200310710ustar00rootroot00000000000000‰PNG  IHDRÄ´l;sBIT|dˆ pHYsvv}Õ‚ÌtEXtSoftwarewww.inkscape.org›î<mIDATxµ•c”[†÷)w÷ô´»‡q†±?ãrØ=¶Û¶mÛ¶mÛɯkÛê÷ž™¬•Ž“«Oq¿OíUUçð—ðô…¤Q õa…l{õŽÕßmÜ£ñ/Mz4ñÖíZ÷3g+ç–˦‘‡"ÍÅìˆyºX(¤ÿbÿ/šôk‚ŒÙè¶­ˆa§‡aÐÁAè°¦b'Ęoüš¥Ó8J 3§*Ë¥]¯LxåÝÇÄ”Jªœ'î mâ-[U†ÁÇ?“Ї´ÐÌ+f×Å,vóµÉ¯ÁZnÁcb%[ÜÛ¸wctÚÞ Ývw{ˆž{z¢û®î]ï±§Š–!mN ºïîK‰éa±–+%» Þò5åhµ¾U%­7´Æ«c_E65 ¥j<\….4èÝ+ ÐjS+ïa.ö÷‰)ƒô†tÝ×1c³8§’Ô9©. K`ãHq‚W‰—¼Ç,•A+ÓðŸÿAÎ:^¿–³š³2¦"£Ol*Rû‡–†À=Ã}g¡b"¸¥¯Ì™jVô í¥¤èSå¶r‚øÐ†õaøç’½–gVp–¸¹ØÏ'6çè„wÃÿÆü¯’°Ža`ñ j’ô•˜$ZúÀ ÔXu‹oJ=° ÕWÃÿÖóÜ ÎüÿÁ¿Ààû¥iïFwFÓM+©xŸJœ%EùˆT“…ËÒ ¶S6Ô=YM÷7E“MPkV-XûZ¡eË>±–¤üÖ) ]"Þ9ä¡ ±—¿ßìGÄRp¾õc1W€”+AΑ dIÓ¤rªc¡ºº²–35AþAKÓ`È0@Ÿ§ÔdÙËÜ>ñ£Ð "s²"Û2t¢µH÷ð}_ÇÒû¼;PJ9] ~å Ä$¶öib–H‘–b½S*LJª SÝ’lÏѳ‡Äü]Ö%I ’{RJÐOP Ï’¿a ä~¬›x “<ÂfÃ(%F$5Ƴš<ã2õÔ Ųp_,§ }ýRP'.Là…ÐM–2ÁÄ¿²ú9¹ì”HÿàÂnZ²t3pq“s¶a€iºV¢›,ÇðLÓ€®ÆZjÉ'æïÙÄ_Ç7úî2Ø8‚Æ¥<€€9FD-q!°¯ö6†_l¥ú_;QoaÀGaKíW«-´læ5“ÌÓµ®Žé†LK™®ùcÓ&%Q®)GóÊã§©pÍñ"r¹ W¢ñ†`4ØÈ©8âׂ>ã÷.W_hY2Ï4ÞÖÊ0—R©Ácâ D°+´‹ ¶éz„Î7!|™ סþö„r æIküØŽzüZ£5AŸG-wž¯ÙÛvˆÜ´’ÒH{¢˜¿Càa{e†_§8PwenBØ;B/›àºãW ?®¼öïõÕQ£›õKæ¡#KÁÏ]AÈCñÆ<õ#c[ ¦èQ{³¶ËzÞUàºjDÍ.z+ÐgÊŸòfÚst/¾4åÊíx7k­ùº»,‡}Cyô¥@÷¦Äö›ò.-ÏZóþ~‡Áʽþ2,LIEND®B`‚gImageReader-3.2.3/packaging/win32/skel/share/icons/hicolor/22x22/actions/window-close.png000066400000000000000000000022771312567024200311040ustar00rootroot00000000000000‰PNG  IHDRÄ´l; pHYs × ×B(›xtIME× 6Ô iªbKGDÿÿÿ ½§“LIDATx…Õ”ëÚà/IÛ™Žu}mÛ¶mÛ6žmÛ¶m[Ç6ÚQ™4yG ×Ûüþ½¸¯’ž¡m€]#¦#—±1áPò éåààõìq_žs ä£H¸¹ÆÍ¦&͘ß&¼o_}3É«ÂÒ1‘׸c ¯/7çŒ3L:ê(]Ó§†šÃÃ6üå/–~ë[Ö,X Æo\ÿó_~ÞI|­‹ãç|°]o¼Q[OÏ‹¢gHÓÔÊþÐ?ûYå$ÙØàìÇùý‹àÓÈŸÀ—{9gÎ~ûÙéª+„Q ²²í]–Mÿü§úÓ6eÙú ‡?ÍbˆÁuÜÒÍS{{͹ðq<¢}§Œ¯œ/ˆÇiV¤µqÉø˜ÊÆMò3f]ºT{G‡|½®ºvmgÌ^>³‚,‚Ké™Å‡èž~ྒÞL÷1'šyÑ5ÂA«~óm…°b³ª¼i½Â~Ûù¦[µÍ˜aÑ7¾¡»»[}Ñ"µ4=ƒ?þ”!‚=8»È”® PÜ!gttŽ9»÷9Äô«îµlÍR«Ö.ì}€ÝoºC†:¦MUÍZârIOON‚6nB!:ƒúØ·7GçаξԿ~²ù%; gò ÝSf w˜©Üäð{ž„‘ÚȰoßz™®Åÿ­Z+^¿I‚“k¼#@áüvˆ'v1¸…¡@«;ïï»ùÜ×Ì9äP)ûÒMg›²úOú*‰xCª±‘á&ëÉV°{ˆ¨@QŽ ²¹f:ŠMûÍ.ùüÝg[=.€,M½ÿº V~cêä¦B*ßOÔA„ZËyÿ|ãÇ×Á—Þ„˜ÖAW£LƒÎi;ÁpóKÄ\B]¨ã™$éKoC4oL8ºÅ N™HÆÐ¾9azß0}_üDªwO¿1kC›f–Ü…éýûEO%´W¯^©F4+ðüá JFðäI“`M™‚+aNÿ0=,QdŠ ¸‡(TÖJf¸aŒ™»P@ÒSÿÎVãÉÁÄS‡šáÆul)°'w“‚è@3Ü´Übn˜¤’ˆT6<HÅÏ ÙŽo_¿É-Ü´iS¨³E¤x‡ˆ²ï¼TI¦Þã‚ü|Œ1JT]íàܹs¯KÕ}–mvý@»§6Qè±ãÇœœ­ÜEÍó<‰}§IÛ:ú(A¾ïS†¡Ì/_¾¤ëªªJÊÍÝeóݹNuÒ®»4u§CvË:??? ­êÞ½û5‚“É$¹®KeŽ+@Áš—·»Š÷T@Õ8™Á&‰Š‹‹iß¾½U}ûö]e‚Fô枈_S>÷nB}o¥GÝ›ÞIEND®B`‚gImageReader-3.2.3/packaging/win32/skel/share/icons/hicolor/22x22/actions/zoom-in.png000066400000000000000000000021571312567024200300570ustar00rootroot00000000000000‰PNG  IHDRÄ´l;sRGB®ÎébKGDÿÿÿ ½§“ pHYs „ „ªâcytIMEÛ òÕCïIDATx¥Óc”+Ià[]Øx¬mÛ¶mÛ¶mÛ¶±Œ=QÇ'Ý©Z{_Îà;§þÖ5Ì¥抅ÿár÷¯c·Ù/. ÛÆâÒRžcDE)ÕÕýXw7L^|ñÅðàƒB%þÅ7;ýb{ô¤h2—6ôÔh4‘p<­D£QPÎVåÐ=±ß~{×]·ÂUW]?·§¦Æ¿ýèÛîÍwÚa{y©ÓJBdV(%SD)ƒübÿøÝ׆Zª;þø“„ ø]{GÛYuíÃÛî±Çž½É$ÔBp¿COvh *_‰Ò Þ` í¸ûX^½û'Ÿ}|ìœzL(ºÔΠLq”aX&CH¯ºö&ÌÃæŽd°` ’ÐÒaµPx^¯˜ñ>°k$¤ª]yåt^¡¢Æ$L-܈O&›Iš\NçZæàÇY‡ÍKkf¾kñXO8鸪ŠúµÂ%9à/Œï¹™?h¿£v¯Y}ý@>—/ì°Û~lØ¥{QÄÒफúÇ®/?̃ ‹¦å8àµÀ·Â³™.c3 Īٌüöwo}£–Än|¦î³Æ÷î¿'`ÀìdF^®Ó²,€L&[ªØŠîžn¯–-ZÊJ™K“îHiÈ“+»gÜ_|úáÐéÎCGWúÃúÕ,£W²ak2)y+~üòK¯x\.™—¢6=ƒl¤Lx£ ²L8È«1xˆ*)["§ýÓß}ó}´âÇ‚ ЉɩëŽÚBؽF7‡EÀu)þîóG%„PQÀT®áèÊ©Ùh¶óÝ=Iéì¹^ÿ ϾîÏj·J;w{k½õ5®ÕVQMª0 ð<‚Õ†få-¾}óÙㇺ¿Ÿx÷v‚ 0üN£Ñ”ß{ïƒÏªì‚Ct^âŸIÚ£qµ=›åW™÷mÓðmÝAÍ=w|Ä7:yÖYçlU]SuË1ã“S“3þÞîtÔn¶É†g·ýÏm²(J9T,•¾ ÄGzº{×v¹]Ͳ\B_~ù%¼ñÆ«{=c!˜+ü·÷wU—_vù¸”JцÆzr͵WI`„Åâ8À¦wßsw"•J‘¯¾þŠ\xñ#ÀüoçŠ*•*üã?ö®¼ÊÊGï²Ë.ˆAÈj0ê¶ý¹M¯.øã_(ŠBY–íêêš^oýõÜl³Í)BhU•Z°º]ž/üñ/Ê?“$idltLÞbË-vZs5(¥dK–ÃÞɉÑ ‹#>Q—m¿ýYm6šN§#?|_ÿ†Å+ŒŽŽ6™-fÎjµúî¸ãÎ+%IÊþsíÝþcu©XIEND®B`‚gImageReader-3.2.3/packaging/win32/skel/share/icons/hicolor/22x22/actions/zoom-original.png000066400000000000000000000022021312567024200312440ustar00rootroot00000000000000‰PNG  IHDRÄ´l;sRGB®ÎébKGDÿÿÿ ½§“ pHYs „ „ªâcytIMEÛ!B©gÓIDATxµ””$Ù@#QÕÅvmÛ¶mÛ¶m[Gÿ/ƶm{ÚeÛH¾í\s<÷!Ãð­Àào „Ã00ô£ ïçñúKÓ4Í‘8Ê G¢k×®»Ça±CJÞ\Ÿ¦øÁÇRRRî]ºù„Œ‹O`“ãËáœÝéáv³¤t¡8D1t>={§}”bÁÓ —.–OÈõöE†ÕÖ¯G;2BÑ4 ÄòãY.çÇââµ»8ëÍÎ]¦G¯ny’òÁ¿A¯á¿~óúöÃT—©]›fƒÀÅpÀb8N# XÃ8FÄW¯YS~çP¥S"÷r”&À ßÚõkáêÕËý1uêÔ Kc%¦î}GT&ˆu¸Ëy )œó®Wß¡eòäVxÖ¯L52܃{ „þ[ñ왳A,"z¹£R GH¬=ºô®T¼lUCvnù6Bô®aËn]‹–ªdJÁå0}† ©uZu!ÒÿT,@QT‰çzV—iòï\8„9]î`,@Zݦ]&óî_9Φ«tf+{u!î)®ÌgÕë ¥Þ› `(ˆñ@Ò¯”fw:;Ð »\~rã¤w¯+’ñ ’L,IL &¬J…Qt”ýbÌírg$HéX\qbGáòe«§Ü>ã‹´Z­2þÂUµó…<ɹç]‡5œër£I]-³ÙÕ}ó†-cw.úý ßéRëŽëZ½zµÑ„Af«Åf½«Xq—•“U§[ç/rîÅóB–,)Q’69]ÞŸŽ>Ö¬Â\±;‘ˆ£•+WÂÔ©S•—UT „àn‘«Ž«Õ÷á8³$Ëêî=»è¸ñDÀŠa¾þæë$Itã¦Môíwß* ŠçyC§MŸ&Çâ1ºbårõÅ—Ÿßx}s(*˲Ž=»÷ØÛ¶k;¦K—®êY xË>yâÔÚûÎøâUb±XYaa¡Ô£G¾Íš6UϾê°¤Ðj)/"ð`$ÇsÌápTÐ@Û¼¼|õlaþ¶¬!ðàRf³y—Áh`M&Ó™O>þd\$‰ÿFþä"ú{ETIEND®B`‚gImageReader-3.2.3/packaging/win32/skel/share/icons/hicolor/22x22/apps/000077500000000000000000000000001312567024200252575ustar00rootroot00000000000000gImageReader-3.2.3/packaging/win32/skel/share/icons/hicolor/22x22/apps/accessories-text-editor.png000066400000000000000000000061431312567024200325420ustar00rootroot00000000000000‰PNG  IHDR”$°x pHYs7\7\ËǤ¹ vpAgÜÅéXbKGDÿÿÿÿÿÿ X÷Ü ÀIDATxÚe—yXSW‡o‚LW¢ƒT´Š Sw‘ (`ǪÅieÐZmUŠèTÑŠVBµ¶VQK«ÚR”±£ÖÐÊ&TDSe‘H$BÈFö²'„Üü&WQæ}ÿ8÷;'Ïs~ÏÉùrŸ :(‰ù9 ¤ ªII_&ýÒ%Æ‘Ké2/ ½#Ñ;þ…xÉâu3Ÿ3›™ÏF–Í/›W6+ÔÒ°¤!¢aáöݜݜdNÒÕ–ÂA…®…®S+‰lŒôO¥¬P{Ý¥ôYã3ƒ’ Æì¡¤òŠ $þF*e9¸7˜KoýÓÌ42 Œ¼²ÄVb™ÿ¸®ºîaÝý8·æ°æ…Í!™s““ï»HžKø‰¬N™®ÌR^$ë4 4Ë5ë1I»U»S»(ù¢dwÉ®ãRL”¼Ðñ±”ñ‚MOû4Pºx ª§tÖî›Ý7ºB÷:h>h9he0Š}‹}ŠÇÌ'E¦~˯cµd¤Dt\’|!M$+Ëá€òs¥¿‚ (ʇ‹MŽFÔHÌÒY.бGê'÷vŽîÒH¹ PVkü»„À=þý Ö jiTLÔ6ÀíÛi·µ$óΧwf–vû›»mÉë¿>ô}õÐrÊWκo¡Ê^å¨ÂY³b¤‚k€ŽI£l4ùƳm-c['m›Û³…€p¯˜%Í:ó´M†TÀèoZo~ Xë»Óm €½ÌþÌnLMCZ eGJh  6Ümø `‹ç–î­ÃÉ¿ —š€šU5Ìì¼ ?ðcÊWwGuµVD!£@SPù¯Pù|ùAùs@öÅÕ.2¶3ºk´v0`€áºa»a< ‰Ò¤jœó‚FáUÑ @©’kþNé“ɦL˜â=ŠܘxPÍRµªÏ’5Žw-8ð¤¼JÞé­/ÓÐâ‰×‰õ ¥|eæö„Ûso/#ˆŒ€Œ°ŒØ0?i‹ôžô" ýV{]ËC¶Œ!³(Fà>ÿ®0Uœ ˆè¡ÒN@Ì•ˆä›uNç-]@f:/NìNíµ‚Ãӂë¶ÏŸ/NAMÁ=@·R—¤Ëq´˜ÆTÓ @þ@±\!“¯™yjÆïÓà ^º`,A$ÌÚ¢Ù’Có~HùJàè„è´ès1/⋈?ÇÆˆFåÂõÌÎ›Ú ú̀ƣ³C7Öa6+,ùÖ\ ›Ñ½°{'`{»[Ý}ÖY{Y…Ô|—W'Ù)bºcþŒ9xÑ<›¿ïˆ!¾;F…MI¨X£ã™£0U›6×:z¤?É#5÷lõÑ_€ìK‡Büîgž–U¨×t1€çàeÒ6ÞS¾àj?Á/DU"ˆß:®w¬[ð©´TºQbØg¯gi ¥‡8Bls.ÇlÙGñõñµñi˳(‰~vh¾m|’_ÎßU}²g¾=’üèZoa=N*…³cš-@©ò{õ—_S{ɰþÖý«=,á×··Ü›ÜÈÆz€3Ž3³ ¨oas\@Ö§>ùŒS <žÉ¾ÇiÃÅFsóܶ‰OÎà§7¹ùÀ:¬Kø¨ðCóùŸsÿ2‡ òró‚/TÑ=ÏÔQ:£ ¸än}õ“ˆ'!OBsì=—{®õ$ rô×̸Ä_€óÛ²¥Nª¬»Ò¸¸s®"þî*8ªâXA.9çÕ#–"³es[¶à#O¨îÈ—<$1ɪ:’!X*œ$š…9¢;"žØÕ1[Ý .RŸÝG$ŽN =íñ’AöÕ%.Åšâ†GIµÃDZ&uŒ‘M#c÷•úÍ¡(üÎ"ªW=1:~æ¼ßøŸ&y°ã 4VžeoÓw:L#ÈÇÝuݤ-\ÛvÒ¶0&HC*:%lÉ>‰ÐôqÓt®?œþpÒÿJ.Ÿo<Ï;/+[2÷s£ç®ˆóìm¾âuB‰ßÔ”Q¹¼òÝÊPú´ò˜òyåC âtÓéòÓ?EhLCL3}Xßé²ítLµO°OµÏ@ ^¥p„“62<³Ù\iþ ÐLÕŒÓxØSÚ+ÛŸ´‹ÅôZcg]PyÙUâªßÕ%GÖÆ¹ÆùÅ…E]r‘¸¨\ôã'ÓÓÒ‚\eY# t6_殬]çh+˜+ÒWœ#ˆ0y˜!œî[®®p~UùêK ²0TJ ÅÖÍ ‹rˆòm~JË-§ZŠJ›HYƒXÓŽï¼Â¸2íÊ{ëgí¶ÇkÏ›sJÍ 6ƒåÁìÝnï€í‡p[(û¯æ(N;%ñö€ÿŽ´¾š˜OI~øUø•ÉÄk¸}–?(ÿüÁi公¶Bë¿DÉ_'I>4Ñëº×e¯<ϺÞæ 2´w×W;>£¤_¹˜AI÷N¤¤­%^ò{"%áß[Ó Ú ûù/@¥i!âo4"zTXtSoftwarexÚ+//×ËÌË.NN,HÕË/J6ØXSÊ\IEND®B`‚gImageReader-3.2.3/packaging/win32/skel/share/icons/hicolor/22x22/categories/000077500000000000000000000000001312567024200264415ustar00rootroot00000000000000gImageReader-3.2.3/packaging/win32/skel/share/icons/hicolor/22x22/categories/preferences-system.png000066400000000000000000000024601312567024200327740ustar00rootroot00000000000000‰PNG  IHDRÄ´l;sBIT|dˆ pHYsaaÁ0UútEXtSoftwarewww.inkscape.org›î<­IDATx•tÜKÆï"6êmŠEmÛ¶mÛ¶íÆ¶m›Uø½89Ý ×œ7ÿœnNÎÖý’åÝùͽ÷B°Hăxÿ‹åª¿¿ÿ¬ÈÈÈ[·nÑP‰¹ëïþI~ùê•Þ¯‚oܸ1366¦µ¸¤UUW¡ªª*iTTÔÆð³g϶T[W‡<<=Ë€ò Ùª{xx°«ª*‡ÃAÞÞÞü]»ve÷ìÙs2‘¨2cÐÚܼ|øàçêêº ƒøßÙ@dc= ?Ý©KWC7¹D úB[% SÐ62± ¤RiCCÃ;<ïΘ1cd%%%ñºÿ;P¥7Š&.”²ñþPMQ—€¨‘1I\ÿS®]»2lذQølE999õoß¾]€²áôåÜîf½ R1 Wr<¾æw•ft1cÆS:~‰øQÅ\¬ÄöÖSš÷?8å›XIEND®B`‚gImageReader-3.2.3/packaging/win32/skel/share/icons/hicolor/22x22/devices/000077500000000000000000000000001312567024200257365ustar00rootroot00000000000000gImageReader-3.2.3/packaging/win32/skel/share/icons/hicolor/22x22/devices/camera-photo.png000066400000000000000000000006771312567024200310350ustar00rootroot00000000000000‰PNG  IHDRn½¤°sBITUìF pHYs × ×B(›xtEXtSoftwarewww.inkscape.org›î<>IDATxÕÓ5šQ€ÑSUí»»[6Î.”° ö@ÆXîîî0îþx<Ü ™ûw—žïf•ÿ>¹ÿ Ÿ}ü$ „'áìãßã,8×j¦¿O[ˬ£3[­3KSé„/Ça×fòtGÙ+³ä²TðÌ[êfš/3UÂ#j2tšªš(WÔlQ5ä¡›Ö Q‘3®ª¦Ãr/d©gj–»ëXü/×ðR0.m¦¦LÑ›hî­µN:ê¸=hqË|K¸*W3Hâý‘Šÿ€Aðes¢j€Ü St$þ§xÁ·¸ªÐÔm2Bl†kê¶ÛçYlÀZ_pPS˜âŠ¥‰Ž[ïŽ'»,‹Í·:='§UMC«Â ®T=6ªP±Î6½z´J›ß¨y빚V™–Z"¤:ŒÇÞH¸«íðLJñKy³n¼MNƒIEND®B`‚gImageReader-3.2.3/packaging/win32/skel/share/icons/hicolor/22x22/devices/scanner.png000066400000000000000000000015101312567024200300720ustar00rootroot00000000000000‰PNG  IHDRÄ´l;IDATxí•5¸ÝF…ÏÂë1˜™í*L]˜ÛT†>Ì •¹oÃIfNffæË(Êñ|‘Â¥;Ïûæ;ûFšf¯TQ8¦ËÁ!°-ßÿýáJ©KÄZëÈR=ºË¸¡*h¿ËæyÞ§w³,ëP;Ôý .| 4ùxŸ~úé4_aâ ÐE­VƒµVÆ¥ ˜Æ‚4Mÿ¦I’|N=bõêÕ¿©>ø@3ð “NÇ_Ìq„a(ú×"´ Æ<ŒF#ÑÒùìAæœk[­ÖuL8`ÐÁÎE‡Ã¡$GQNSºd¼—ÐÒK0ß=«ßï_m?úè£û {~ffæúO¿ÿ头ÐìÌB+Ð Ö)F°¸¨… nžÅÜxð6z/ãuùß}÷]°óŸúüçããÀá´CÏãô a„ð8GV@à`,ÍRv› ÝncÚdØ2Þ_Çñ8Ãuyä‘ëëÊUI4‰¶u¥œ4È ñ‚”<ϤëšçøËÒs¶ŒÃžvÚik~YÀ³³³>Ö>Z…Z€C’[i!] @V†‚6Rµ4¤5ƒ¦îcéÒ¥*pæŠ>ŽË†P¹BÊÄ^VeËÇ*—ã?¡e×9ÿ\¥aÇÇ7T[ÚuÝ5·Ýr:N¹–eSp¡WÎÿe]—kö¯ë×2jo„“¸üòË×TàF£ñ áøòË/ñóÏ?£Ùlb0Èn£ Ô0›W;Ž*îû>-œÄêó˜šY„z½þMuVìÛ·ol~~þ<&¯"d!ãÓO²@Àõp\#L!>Ï<Ïõé=ΦAÆo|çÎôÃ÷Þ{ïÞ]»vuüvçwª^xAýðÃèõzŠ!épÉ’%ÅÑG]lÛ¶í“]M•ý pä!s{IEND®B`‚gImageReader-3.2.3/packaging/win32/skel/share/icons/hicolor/22x22/emblems/000077500000000000000000000000001312567024200257405ustar00rootroot00000000000000gImageReader-3.2.3/packaging/win32/skel/share/icons/hicolor/22x22/emblems/emblem-important.png000066400000000000000000000020141312567024200317170ustar00rootroot00000000000000‰PNG  IHDRÄ´l;sBIT|dˆ pHYsvv}Õ‚ÌtEXtSoftwarewww.inkscape.org›î<‰IDATxµ•¬ãÆFÏŒƒ{–™™™Wü^™[1–¹3µb•E­˜VX&Q™™™¹ :œØ3ÓߎsuYØO:ù'¶‡”s޹òbÆënö+Óú¹Ô³Àc'#ã3Kf‹°OÁ­Àm}ûö,¾ôRr¨|žÈ÷iþöþëoP{ýõ@Á(n<šÒ¼â—3ÞàÙÅ\Ð?tÎÿ)®X… ưa„³ŒT:›',ýCõ©g(?ÿÜ· þ84ßÎ*~%ãmPðƪ;ïî?rÛlâŒÁFaR]Adã›Àšä˜–·¾ý†ßï ¤pçí›Sįf¼áXºüºk6ô:ŒÆ&7ޱø–[éä÷»ï¢Éȹùæï¿ù둇k8·f_ËÖ5i4<4tæô†ž;1¾/Œ L£ÁX¥Œµ¶ƒì—p#¾ÐÀúBµŠÊæè=u²_í©ÞÌz½ž§/èÙ¿S÷S¡0WŸ RÁ3AP­¥çG°q©×(¬Ý€Öú¶Orº7“Ú/ʯ^]ÐÅ¢\\Ç‹‚Z5yÒN‘XEr^ íOÐ}èÐÀø[oÞ˜ŠÝUÅeKq¾HcAÚPí–ߘ"nú>ÎóÚ×¥`¥F†LOö·ÅŠm„-¬¼Zç);U ÍøU¥v6äºl¦}MÔ¾VÙH0x=Ëиô‰©Ò W;¤§Ý©›òÄáè(6£‚îîÅËp­&柿Ñ0ØWZÒÍàår¨\•2”§ÑÍÖq&j¡‚@Î{`,áŸÓªUQ Ò/0é‰ã§ÅÑŽÀ%uXø`ù"\z|©‚$“e¤›qý\§ßбHÐ B1® ÿÒ4õz‹„«„mBU¨¤õ=á!γæýù—bZ;ÈÎIEND®B`‚gImageReader-3.2.3/packaging/win32/skel/share/icons/hicolor/22x22/mimetypes/000077500000000000000000000000001312567024200263305ustar00rootroot00000000000000gImageReader-3.2.3/packaging/win32/skel/share/icons/hicolor/22x22/mimetypes/application-pdf.png000066400000000000000000000020741312567024200321130ustar00rootroot00000000000000‰PNG  IHDRÄ´l;sRGB®ÎébKGDÿÿÿ ½§“ pHYs „ „ªâcytIMEÚ ¦õx¼IDATx…•Ì$Y…Ï«×ÆÚ¶®ÂµmÛ6¢ ÖÖ¶½;ž‰vâ±í¿¹Õ¨v½=÷ýyÉï¾Ééò÷î=÷VµÂ`ìNHE1"<ÏSf0àÂÓZ…½žÁðèPÿR[à"^†¡év»Võ\Δ–.5ÿþÛÔ|ßT«5Ó#ÈŠ×kµšÝ:É3ò¼p3âØ¼‚zµŠŽïÃ_¼»œr 2Ûm‡Í?ü€mÎ9ív ñx0Fr¿„T"Êd2Z±JAi°ÕBîŸÄD³YxÍ&R©˜:í¶=句ìËóCÃá'Ò{î‰ÞÖ­ØüŃðHšð$áÝ^ îk&à€N##2 ,«RG¿ú*æ]|1T¹Œô¢»e ’Gam´-\€Ö$“ID´,³8rßns9x;ì³ýöð&M¶?þˆN`3«Ørã¨Í™¾8Ð<7æT(Ñ}T,Éç¾(Ò,»§#ýÖ[ˆ®\‰ü3Ï ùåÀ.»È˜Ž?nF Ò ñ° !€z½ȶX„ÿ÷ߨ0ó³Ô<‚mHòz8cF{L0T¶â¯ÜÌæH¶õ>ùë¾ûuŽ£:ýt¨£Ž²Þî¹×^XíûhɼÑ`E.s‰ÎÂ…Ç®üöÛØúÑGذ㎸€MSœ ‚Ðnµ0eÊ”ÜC?|€¥c[aŒ5·ßœ5 ÕwßEƒš»îB‡‹x2¿aˆg·âû˜:ujþÑÇ¿Ó÷ý?„c‚ô®òÜs¨ýþ;4™+¯D—çÔ’%Šj¥‚3fä|øá»éÿï:,@ÊÔjøcÔét O; ±Ûo‡‘ËBeáZµŠé„Þ{ÿý÷Að‹¸‚¡1–þ“OBŸw4÷»ûî+o˜|íg3NÚÌvòäÉù{î»ï6õç‘Ð1ß<)1rÌ1ȲôËNžt’õÜ6‰ì³÷ÞøîûïswÝsÏÝA‡þ5]kü˜˜Öúõ¦øÕW¦¶q£¡†¥šB>oV¬X¾úê«kµÖ—ÐèîeÛƒ:…Š(d’M8ÖŸåBj9¢Oü{&O—GkIEND®B`‚gImageReader-3.2.3/packaging/win32/skel/share/icons/hicolor/22x22/places/000077500000000000000000000000001312567024200255635ustar00rootroot00000000000000gImageReader-3.2.3/packaging/win32/skel/share/icons/hicolor/22x22/places/user-trash.png000066400000000000000000000020121312567024200303610ustar00rootroot00000000000000‰PNG  IHDRÄ´l;sRGB®Îé pHYsnºnºÖÞ±tIMEÛ Í2¹èbKGDÿÿÿ ½§“ŠIDATx¥•Õ’37…fÌ^Þ­Ãxfffæä.û$a¼>@à*ÌÌÌ̦ÙàŽZª ̆ÿSÕ5|úë–ÜPzúùqÜQGàí!aôÁÓ­Àó¶«T*‡ÎÌLïcÛöŽDÔH⸖$ J¥’kÛ…„ø&Š¢wS™¾âúþ§ÝÖÐ#Wf^o¾ó>Øw/<ùÜ S¾ëÜ7ì÷™žšj6 ÌÏσÇ1Æã1<ÏÃÄÄjµšŽz½Žµµ5üðýwƒB¥öŠU,\}ÂQGÙ³À¦¬Ùé™ïÞzí•ÙTQ‘”¨V«úcE E×uuH)ÁäŽã(h^¯‡Ï>û¬ÅɹgŸ{þQس#Q)gwÜq'zìч“•ËeM”¦)|ß×dl\,Q(´iøê«¯tœ}îy4?§K4†ÙñÙgž‘»î¾‡þè¡À»ï¾‹ÉÉILMMAõYSû*aAs26m·Ûèt»8é¤S úŒJ¹„Vcí™C!ŽBtÚ-,..‚Å„KKKØØC-d’jãrµ¢z=‰N«‰ ŒðÞö:62eƺ´¼*•*fææ`Y6Êêœ1T…!¶,­€Š>Ñ”J¤œñ_ˆ@à¯) s‘ IØTêsãª3Yø7ІyII*Rc”«ØÂVˆ(ÕÛO˜ øúï‰è_!%‡i‘ÐÆ›‰uæ4Õ¹>ÿ•Ì7†Ø6Feœ™ó¢°Äß;ëÊ$IÀóùwÏ6ÌLùÈâÆ_Jd0d.m‹ýјgBÖ†,Þ³Qô—ý¿'6«·©< óÆú<Žb,-má$\êŸö˜RÓK`s+.¸àÊ·‚‡¹'±¼¼¢î§(W*°, ÐI„!–’Ï`Ù6Ï?_ýõ5ÊÌ9$χ”RÉ~¿‡Þ ‡È4% aúø>õ~þJ1«Òï÷ÝvÚ©® I 6ͪÈÈ¥Š Š±¾²†Xݳ ôì ¤øêë¯C3* F+wÜqǹ~øá’ê·0ôdz®Â$Iô9©s&5IBDa»P}øáê×_w1€ŸÌRþQíK/½ôÕó·W0ë:^Åý'‰úžãbÃq×s×~úñ§žzâñ§Þyçí»|›ôyÕößÿ…]vÙ¥Eq#ŒÂ9ê)ÓJòù²J0úêË/Ãáp €‹œ~LKz3ÆëXÇIEND®B`‚gImageReader-3.2.3/packaging/win32/skel/share/icons/hicolor/index.theme000066400000000000000000000647271312567024200257100ustar00rootroot00000000000000[Icon Theme] Name=Hicolor Comment=Fallback icon theme Hidden=true Directories=16x16/actions,16x16/animations,16x16/apps,16x16/categories,16x16/devices,16x16/emblems,16x16/emotes,16x16/filesystems,16x16/intl,16x16/mimetypes,16x16/places,16x16/status,16x16/stock/chart,16x16/stock/code,16x16/stock/data,16x16/stock/form,16x16/stock/image,16x16/stock/io,16x16/stock/media,16x16/stock/navigation,16x16/stock/net,16x16/stock/object,16x16/stock/table,16x16/stock/text,22x22/actions,22x22/animations,22x22/apps,22x22/categories,22x22/devices,22x22/emblems,22x22/emotes,22x22/filesystems,22x22/intl,22x22/mimetypes,22x22/places,22x22/status,22x22/stock/chart,22x22/stock/code,22x22/stock/data,22x22/stock/form,22x22/stock/image,22x22/stock/io,22x22/stock/media,22x22/stock/navigation,22x22/stock/net,22x22/stock/object,22x22/stock/table,22x22/stock/text,24x24/actions,24x24/animations,24x24/apps,24x24/categories,24x24/devices,24x24/emblems,24x24/emotes,24x24/filesystems,24x24/intl,24x24/mimetypes,24x24/places,24x24/status,24x24/stock/chart,24x24/stock/code,24x24/stock/data,24x24/stock/form,24x24/stock/image,24x24/stock/io,24x24/stock/media,24x24/stock/navigation,24x24/stock/net,24x24/stock/object,24x24/stock/table,24x24/stock/text,32x32/actions,32x32/animations,32x32/apps,32x32/categories,32x32/devices,32x32/emblems,32x32/emotes,32x32/filesystems,32x32/intl,32x32/mimetypes,32x32/places,32x32/status,32x32/stock/chart,32x32/stock/code,32x32/stock/data,32x32/stock/form,32x32/stock/image,32x32/stock/io,32x32/stock/media,32x32/stock/navigation,32x32/stock/net,32x32/stock/object,32x32/stock/table,32x32/stock/text,36x36/actions,36x36/animations,36x36/apps,36x36/categories,36x36/devices,36x36/emblems,36x36/emotes,36x36/filesystems,36x36/intl,36x36/mimetypes,36x36/places,36x36/status,36x36/stock/chart,36x36/stock/code,36x36/stock/data,36x36/stock/form,36x36/stock/image,36x36/stock/io,36x36/stock/media,36x36/stock/navigation,36x36/stock/net,36x36/stock/object,36x36/stock/table,36x36/stock/text,48x48/actions,48x48/animations,48x48/apps,48x48/categories,48x48/devices,48x48/emblems,48x48/emotes,48x48/filesystems,48x48/intl,48x48/mimetypes,48x48/places,48x48/status,48x48/stock/chart,48x48/stock/code,48x48/stock/data,48x48/stock/form,48x48/stock/image,48x48/stock/io,48x48/stock/media,48x48/stock/navigation,48x48/stock/net,48x48/stock/object,48x48/stock/table,48x48/stock/text,64x64/actions,64x64/animations,64x64/apps,64x64/categories,64x64/devices,64x64/emblems,64x64/emotes,64x64/filesystems,64x64/intl,64x64/mimetypes,64x64/places,64x64/status,64x64/stock/chart,64x64/stock/code,64x64/stock/data,64x64/stock/form,64x64/stock/image,64x64/stock/io,64x64/stock/media,64x64/stock/navigation,64x64/stock/net,64x64/stock/object,64x64/stock/table,64x64/stock/text,72x72/actions,72x72/animations,72x72/apps,72x72/categories,72x72/devices,72x72/emblems,72x72/emotes,72x72/filesystems,72x72/intl,72x72/mimetypes,72x72/places,72x72/status,72x72/stock/chart,72x72/stock/code,72x72/stock/data,72x72/stock/form,72x72/stock/image,72x72/stock/io,72x72/stock/media,72x72/stock/navigation,72x72/stock/net,72x72/stock/object,72x72/stock/table,72x72/stock/text,96x96/actions,96x96/animations,96x96/apps,96x96/categories,96x96/devices,96x96/emblems,96x96/emotes,96x96/filesystems,96x96/intl,96x96/mimetypes,96x96/places,96x96/status,96x96/stock/chart,96x96/stock/code,96x96/stock/data,96x96/stock/form,96x96/stock/image,96x96/stock/io,96x96/stock/media,96x96/stock/navigation,96x96/stock/net,96x96/stock/object,96x96/stock/table,96x96/stock/text,128x128/actions,128x128/animations,128x128/apps,128x128/categories,128x128/devices,128x128/emblems,128x128/emotes,128x128/filesystems,128x128/intl,128x128/mimetypes,128x128/places,128x128/status,128x128/stock/chart,128x128/stock/code,128x128/stock/data,128x128/stock/form,128x128/stock/image,128x128/stock/io,128x128/stock/media,128x128/stock/navigation,128x128/stock/net,128x128/stock/object,128x128/stock/table,128x128/stock/text,192x192/actions,192x192/animations,192x192/apps,192x192/categories,192x192/devices,192x192/emblems,192x192/emotes,192x192/filesystems,192x192/intl,192x192/mimetypes,192x192/places,192x192/status,192x192/stock/chart,192x192/stock/code,192x192/stock/data,192x192/stock/form,192x192/stock/image,192x192/stock/io,192x192/stock/media,192x192/stock/navigation,192x192/stock/net,192x192/stock/object,192x192/stock/table,192x192/stock/text,256x256/actions,256x256/animations,256x256/apps,256x256/categories,256x256/devices,256x256/emblems,256x256/emotes,256x256/filesystems,256x256/intl,256x256/mimetypes,256x256/places,256x256/status,256x256/stock/chart,256x256/stock/code,256x256/stock/data,256x256/stock/form,256x256/stock/image,256x256/stock/io,256x256/stock/media,256x256/stock/navigation,256x256/stock/net,256x256/stock/object,256x256/stock/table,256x256/stock/text,512x512/actions,512x512/animations,512x512/apps,512x512/categories,512x512/devices,512x512/emblems,512x512/emotes,512x512/filesystems,512x512/intl,512x512/mimetypes,512x512/places,512x512/status,512x512/stock/chart,512x512/stock/code,512x512/stock/data,512x512/stock/form,512x512/stock/image,512x512/stock/io,512x512/stock/media,512x512/stock/navigation,512x512/stock/net,512x512/stock/object,512x512/stock/table,512x512/stock/text,scalable/actions,scalable/animations,scalable/apps,scalable/categories,scalable/devices,scalable/emblems,scalable/emotes,scalable/filesystems,scalable/intl,scalable/mimetypes,scalable/places,scalable/status,scalable/stock/chart,scalable/stock/code,scalable/stock/data,scalable/stock/form,scalable/stock/image,scalable/stock/io,scalable/stock/media,scalable/stock/navigation,scalable/stock/net,scalable/stock/object,scalable/stock/table,scalable/stock/text [16x16/actions] Size=16 Context=Actions Type=Threshold [16x16/animations] Size=16 Context=Animations Type=Threshold [16x16/apps] Size=16 Context=Applications Type=Threshold [16x16/categories] Size=16 Context=Categories Type=Threshold [16x16/devices] Size=16 Context=Devices Type=Threshold [16x16/emblems] Size=16 Context=Emblems Type=Threshold [16x16/emotes] Size=16 Context=Emotes Type=Threshold [16x16/filesystems] Size=16 Context=FileSystems Type=Threshold [16x16/intl] Size=16 Context=International Type=Threshold [16x16/mimetypes] Size=16 Context=MimeTypes Type=Threshold [16x16/places] Size=16 Context=Places Type=Threshold [16x16/status] Size=16 Context=Status Type=Threshold [16x16/stock/chart] Size=16 Context=Stock Type=Threshold [16x16/stock/code] Size=16 Context=Stock Type=Threshold [16x16/stock/data] Size=16 Context=Stock Type=Threshold [16x16/stock/form] Size=16 Context=Stock Type=Threshold [16x16/stock/image] Size=16 Context=Stock Type=Threshold [16x16/stock/io] Size=16 Context=Stock Type=Threshold [16x16/stock/media] Size=16 Context=Stock Type=Threshold [16x16/stock/navigation] Size=16 Context=Stock Type=Threshold [16x16/stock/net] Size=16 Context=Stock Type=Threshold [16x16/stock/object] Size=16 Context=Stock Type=Threshold [16x16/stock/table] Size=16 Context=Stock Type=Threshold [16x16/stock/text] Size=16 Context=Stock Type=Threshold [22x22/actions] Size=22 Context=Actions Type=Threshold [22x22/animations] Size=22 Context=Animations Type=Threshold [22x22/apps] Size=22 Context=Applications Type=Threshold [22x22/categories] Size=22 Context=Categories Type=Threshold [22x22/devices] Size=22 Context=Devices Type=Threshold [22x22/emblems] Size=22 Context=Emblems Type=Threshold [22x22/emotes] Size=22 Context=Emotes Type=Threshold [22x22/filesystems] Size=22 Context=FileSystems Type=Threshold [22x22/intl] Size=22 Context=International Type=Threshold [22x22/mimetypes] Size=22 Context=MimeTypes Type=Threshold [22x22/places] Size=22 Context=Places Type=Threshold [22x22/status] Size=22 Context=Status Type=Threshold [22x22/stock/chart] Size=22 Context=Stock Type=Threshold [22x22/stock/code] Size=22 Context=Stock Type=Threshold [22x22/stock/data] Size=22 Context=Stock Type=Threshold [22x22/stock/form] Size=22 Context=Stock Type=Threshold [22x22/stock/image] Size=22 Context=Stock Type=Threshold [22x22/stock/io] Size=22 Context=Stock Type=Threshold [22x22/stock/media] Size=22 Context=Stock Type=Threshold [22x22/stock/navigation] Size=22 Context=Stock Type=Threshold [22x22/stock/net] Size=22 Context=Stock Type=Threshold [22x22/stock/object] Size=22 Context=Stock Type=Threshold [22x22/stock/table] Size=22 Context=Stock Type=Threshold [22x22/stock/text] Size=22 Context=Stock Type=Threshold [24x24/actions] Size=24 Context=Actions Type=Threshold [24x24/animations] Size=24 Context=Animations Type=Threshold [24x24/apps] Size=24 Context=Applications Type=Threshold [24x24/categories] Size=24 Context=Categories Type=Threshold [24x24/devices] Size=24 Context=Devices Type=Threshold [24x24/emblems] Size=24 Context=Emblems Type=Threshold [24x24/emotes] Size=24 Context=Emotes Type=Threshold [24x24/filesystems] Size=24 Context=FileSystems Type=Threshold [24x24/intl] Size=24 Context=International Type=Threshold [24x24/mimetypes] Size=24 Context=MimeTypes Type=Threshold [24x24/places] Size=24 Context=Places Type=Threshold [24x24/status] Size=24 Context=Status Type=Threshold [24x24/stock/chart] Size=24 Context=Stock Type=Threshold [24x24/stock/code] Size=24 Context=Stock Type=Threshold [24x24/stock/data] Size=24 Context=Stock Type=Threshold [24x24/stock/form] Size=24 Context=Stock Type=Threshold [24x24/stock/image] Size=24 Context=Stock Type=Threshold [24x24/stock/io] Size=24 Context=Stock Type=Threshold [24x24/stock/media] Size=24 Context=Stock Type=Threshold [24x24/stock/navigation] Size=24 Context=Stock Type=Threshold [24x24/stock/net] Size=24 Context=Stock Type=Threshold [24x24/stock/object] Size=24 Context=Stock Type=Threshold [24x24/stock/table] Size=24 Context=Stock Type=Threshold [24x24/stock/text] Size=24 Context=Stock Type=Threshold [32x32/actions] Size=32 Context=Actions Type=Threshold [32x32/animations] Size=32 Context=Animations Type=Threshold [32x32/apps] Size=32 Context=Applications Type=Threshold [32x32/categories] Size=32 Context=Categories Type=Threshold [32x32/devices] Size=32 Context=Devices Type=Threshold [32x32/emblems] Size=32 Context=Emblems Type=Threshold [32x32/emotes] Size=32 Context=Emotes Type=Threshold [32x32/filesystems] Size=32 Context=FileSystems Type=Threshold [32x32/intl] Size=32 Context=International Type=Threshold [32x32/mimetypes] Size=32 Context=MimeTypes Type=Threshold [32x32/places] Size=32 Context=Places Type=Threshold [32x32/status] Size=32 Context=Status Type=Threshold [32x32/stock/chart] Size=32 Context=Stock Type=Threshold [32x32/stock/code] Size=32 Context=Stock Type=Threshold [32x32/stock/data] Size=32 Context=Stock Type=Threshold [32x32/stock/form] Size=32 Context=Stock Type=Threshold [32x32/stock/image] Size=32 Context=Stock Type=Threshold [32x32/stock/io] Size=32 Context=Stock Type=Threshold [32x32/stock/media] Size=32 Context=Stock Type=Threshold [32x32/stock/navigation] Size=32 Context=Stock Type=Threshold [32x32/stock/net] Size=32 Context=Stock Type=Threshold [32x32/stock/object] Size=32 Context=Stock Type=Threshold [32x32/stock/table] Size=32 Context=Stock Type=Threshold [32x32/stock/text] Size=32 Context=Stock Type=Threshold [36x36/actions] Size=36 Context=Actions Type=Threshold [36x36/animations] Size=36 Context=Animations Type=Threshold [36x36/apps] Size=36 Context=Applications Type=Threshold [36x36/categories] Size=36 Context=Categories Type=Threshold [36x36/devices] Size=36 Context=Devices Type=Threshold [36x36/emblems] Size=36 Context=Emblems Type=Threshold [36x36/emotes] Size=36 Context=Emotes Type=Threshold [36x36/filesystems] Size=36 Context=FileSystems Type=Threshold [36x36/intl] Size=36 Context=International Type=Threshold [36x36/mimetypes] Size=36 Context=MimeTypes Type=Threshold [36x36/places] Size=36 Context=Places Type=Threshold [36x36/status] Size=36 Context=Status Type=Threshold [36x36/stock/chart] Size=36 Context=Stock Type=Threshold [36x36/stock/code] Size=36 Context=Stock Type=Threshold [36x36/stock/data] Size=36 Context=Stock Type=Threshold [36x36/stock/form] Size=36 Context=Stock Type=Threshold [36x36/stock/image] Size=36 Context=Stock Type=Threshold [36x36/stock/io] Size=36 Context=Stock Type=Threshold [36x36/stock/media] Size=36 Context=Stock Type=Threshold [36x36/stock/navigation] Size=36 Context=Stock Type=Threshold [36x36/stock/net] Size=36 Context=Stock Type=Threshold [36x36/stock/object] Size=36 Context=Stock Type=Threshold [36x36/stock/table] Size=36 Context=Stock Type=Threshold [36x36/stock/text] Size=36 Context=Stock Type=Threshold [48x48/actions] Size=48 Context=Actions Type=Threshold [48x48/animations] Size=48 Context=Animations Type=Threshold [48x48/apps] Size=48 Context=Applications Type=Threshold [48x48/categories] Size=48 Context=Categories Type=Threshold [48x48/devices] Size=48 Context=Devices Type=Threshold [48x48/emblems] Size=48 Context=Emblems Type=Threshold [48x48/emotes] Size=48 Context=Emotes Type=Threshold [48x48/filesystems] Size=48 Context=FileSystems Type=Threshold [48x48/intl] Size=48 Context=International Type=Threshold [48x48/mimetypes] Size=48 Context=MimeTypes Type=Threshold [48x48/places] Size=48 Context=Places Type=Threshold [48x48/status] Size=48 Context=Status Type=Threshold [48x48/stock/chart] Size=48 Context=Stock Type=Threshold [48x48/stock/code] Size=48 Context=Stock Type=Threshold [48x48/stock/data] Size=48 Context=Stock Type=Threshold [48x48/stock/form] Size=48 Context=Stock Type=Threshold [48x48/stock/image] Size=48 Context=Stock Type=Threshold [48x48/stock/io] Size=48 Context=Stock Type=Threshold [48x48/stock/media] Size=48 Context=Stock Type=Threshold [48x48/stock/navigation] Size=48 Context=Stock Type=Threshold [48x48/stock/net] Size=48 Context=Stock Type=Threshold [48x48/stock/object] Size=48 Context=Stock Type=Threshold [48x48/stock/table] Size=48 Context=Stock Type=Threshold [48x48/stock/text] Size=48 Context=Stock Type=Threshold [64x64/actions] Size=64 Context=Actions Type=Threshold [64x64/animations] Size=64 Context=Animations Type=Threshold [64x64/apps] Size=64 Context=Applications Type=Threshold [64x64/categories] Size=64 Context=Categories Type=Threshold [64x64/devices] Size=64 Context=Devices Type=Threshold [64x64/emblems] Size=64 Context=Emblems Type=Threshold [64x64/emotes] Size=64 Context=Emotes Type=Threshold [64x64/filesystems] Size=64 Context=FileSystems Type=Threshold [64x64/intl] Size=64 Context=International Type=Threshold [64x64/mimetypes] Size=64 Context=MimeTypes Type=Threshold [64x64/places] Size=64 Context=Places Type=Threshold [64x64/status] Size=64 Context=Status Type=Threshold [64x64/stock/chart] Size=64 Context=Stock Type=Threshold [64x64/stock/code] Size=64 Context=Stock Type=Threshold [64x64/stock/data] Size=64 Context=Stock Type=Threshold [64x64/stock/form] Size=64 Context=Stock Type=Threshold [64x64/stock/image] Size=64 Context=Stock Type=Threshold [64x64/stock/io] Size=64 Context=Stock Type=Threshold [64x64/stock/media] Size=64 Context=Stock Type=Threshold [64x64/stock/navigation] Size=64 Context=Stock Type=Threshold [64x64/stock/net] Size=64 Context=Stock Type=Threshold [64x64/stock/object] Size=64 Context=Stock Type=Threshold [64x64/stock/table] Size=64 Context=Stock Type=Threshold [64x64/stock/text] Size=64 Context=Stock Type=Threshold [72x72/actions] Size=72 Context=Actions Type=Threshold [72x72/animations] Size=72 Context=Animations Type=Threshold [72x72/apps] Size=72 Context=Applications Type=Threshold [72x72/categories] Size=72 Context=Categories Type=Threshold [72x72/devices] Size=72 Context=Devices Type=Threshold [72x72/emblems] Size=72 Context=Emblems Type=Threshold [72x72/emotes] Size=72 Context=Emotes Type=Threshold [72x72/filesystems] Size=72 Context=FileSystems Type=Threshold [72x72/intl] Size=72 Context=International Type=Threshold [72x72/mimetypes] Size=72 Context=MimeTypes Type=Threshold [72x72/places] Size=72 Context=Places Type=Threshold [72x72/status] Size=72 Context=Status Type=Threshold [72x72/stock/chart] Size=72 Context=Stock Type=Threshold [72x72/stock/code] Size=72 Context=Stock Type=Threshold [72x72/stock/data] Size=72 Context=Stock Type=Threshold [72x72/stock/form] Size=72 Context=Stock Type=Threshold [72x72/stock/image] Size=72 Context=Stock Type=Threshold [72x72/stock/io] Size=72 Context=Stock Type=Threshold [72x72/stock/media] Size=72 Context=Stock Type=Threshold [72x72/stock/navigation] Size=72 Context=Stock Type=Threshold [72x72/stock/net] Size=72 Context=Stock Type=Threshold [72x72/stock/object] Size=72 Context=Stock Type=Threshold [72x72/stock/table] Size=72 Context=Stock Type=Threshold [72x72/stock/text] Size=72 Context=Stock Type=Threshold [96x96/actions] Size=96 Context=Actions Type=Threshold [96x96/animations] Size=96 Context=Animations Type=Threshold [96x96/apps] Size=96 Context=Applications Type=Threshold [96x96/categories] Size=96 Context=Categories Type=Threshold [96x96/devices] Size=96 Context=Devices Type=Threshold [96x96/emblems] Size=96 Context=Emblems Type=Threshold [96x96/emotes] Size=96 Context=Emotes Type=Threshold [96x96/filesystems] Size=96 Context=FileSystems Type=Threshold [96x96/intl] Size=96 Context=International Type=Threshold [96x96/mimetypes] Size=96 Context=MimeTypes Type=Threshold [96x96/places] Size=96 Context=Places Type=Threshold [96x96/status] Size=96 Context=Status Type=Threshold [96x96/stock/chart] Size=96 Context=Stock Type=Threshold [96x96/stock/code] Size=96 Context=Stock Type=Threshold [96x96/stock/data] Size=96 Context=Stock Type=Threshold [96x96/stock/form] Size=96 Context=Stock Type=Threshold [96x96/stock/image] Size=96 Context=Stock Type=Threshold [96x96/stock/io] Size=96 Context=Stock Type=Threshold [96x96/stock/media] Size=96 Context=Stock Type=Threshold [96x96/stock/navigation] Size=96 Context=Stock Type=Threshold [96x96/stock/net] Size=96 Context=Stock Type=Threshold [96x96/stock/object] Size=96 Context=Stock Type=Threshold [96x96/stock/table] Size=96 Context=Stock Type=Threshold [96x96/stock/text] Size=96 Context=Stock Type=Threshold [128x128/actions] Size=128 Context=Actions Type=Threshold [128x128/animations] Size=128 Context=Animations Type=Threshold [128x128/apps] Size=128 Context=Applications Type=Threshold [128x128/categories] Size=128 Context=Categories Type=Threshold [128x128/devices] Size=128 Context=Devices Type=Threshold [128x128/emblems] Size=128 Context=Emblems Type=Threshold [128x128/emotes] Size=128 Context=Emotes Type=Threshold [128x128/filesystems] Size=128 Context=FileSystems Type=Threshold [128x128/intl] Size=128 Context=International Type=Threshold [128x128/mimetypes] Size=128 Context=MimeTypes Type=Threshold [128x128/places] Size=128 Context=Places Type=Threshold [128x128/status] Size=128 Context=Status Type=Threshold [128x128/stock/chart] Size=128 Context=Stock Type=Threshold [128x128/stock/code] Size=128 Context=Stock Type=Threshold [128x128/stock/data] Size=128 Context=Stock Type=Threshold [128x128/stock/form] Size=128 Context=Stock Type=Threshold [128x128/stock/image] Size=128 Context=Stock Type=Threshold [128x128/stock/io] Size=128 Context=Stock Type=Threshold [128x128/stock/media] Size=128 Context=Stock Type=Threshold [128x128/stock/navigation] Size=128 Context=Stock Type=Threshold [128x128/stock/net] Size=128 Context=Stock Type=Threshold [128x128/stock/object] Size=128 Context=Stock Type=Threshold [128x128/stock/table] Size=128 Context=Stock Type=Threshold [128x128/stock/text] Size=128 Context=Stock Type=Threshold [192x192/actions] Size=192 Context=Actions Type=Threshold [192x192/animations] Size=192 Context=Animations Type=Threshold [192x192/apps] Size=192 Context=Applications Type=Threshold [192x192/categories] Size=192 Context=Categories Type=Threshold [192x192/devices] Size=192 Context=Devices Type=Threshold [192x192/emblems] Size=192 Context=Emblems Type=Threshold [192x192/emotes] Size=192 Context=Emotes Type=Threshold [192x192/filesystems] Size=192 Context=FileSystems Type=Threshold [192x192/intl] Size=192 Context=International Type=Threshold [192x192/mimetypes] Size=192 Context=MimeTypes Type=Threshold [192x192/places] Size=192 Context=Places Type=Threshold [192x192/status] Size=192 Context=Status Type=Threshold [192x192/stock/chart] Size=192 Context=Stock Type=Threshold [192x192/stock/code] Size=192 Context=Stock Type=Threshold [192x192/stock/data] Size=192 Context=Stock Type=Threshold [192x192/stock/form] Size=192 Context=Stock Type=Threshold [192x192/stock/image] Size=192 Context=Stock Type=Threshold [192x192/stock/io] Size=192 Context=Stock Type=Threshold [192x192/stock/media] Size=192 Context=Stock Type=Threshold [192x192/stock/navigation] Size=192 Context=Stock Type=Threshold [192x192/stock/net] Size=192 Context=Stock Type=Threshold [192x192/stock/object] Size=192 Context=Stock Type=Threshold [192x192/stock/table] Size=192 Context=Stock Type=Threshold [192x192/stock/text] Size=192 Context=Stock Type=Threshold [256x256/actions] MinSize=64 Size=256 MaxSize=256 Context=Actions Type=Scalable [256x256/animations] MinSize=64 Size=256 MaxSize=256 Context=Animations Type=Scalable [256x256/apps] MinSize=64 Size=256 MaxSize=256 Context=Applications Type=Scalable [256x256/categories] MinSize=64 Size=256 MaxSize=256 Context=Categories Type=Scalable [256x256/devices] MinSize=64 Size=256 MaxSize=256 Context=Devices Type=Scalable [256x256/emblems] MinSize=64 Size=256 MaxSize=256 Context=Emblems Type=Scalable [256x256/emotes] MinSize=64 Size=256 MaxSize=256 Context=Emotes Type=Scalable [256x256/filesystems] MinSize=64 Size=256 MaxSize=256 Context=FileSystems Type=Scalable [256x256/intl] MinSize=64 Size=256 MaxSize=256 Context=International Type=Scalable [256x256/mimetypes] MinSize=64 Size=256 MaxSize=256 Context=MimeTypes Type=Scalable [256x256/places] MinSize=64 Size=256 MaxSize=256 Context=Places Type=Scalable [256x256/status] MinSize=64 Size=256 MaxSize=256 Context=Status Type=Scalable [256x256/stock/chart] MinSize=64 Size=256 MaxSize=256 Context=Stock Type=Scalable [256x256/stock/code] MinSize=64 Size=256 MaxSize=256 Context=Stock Type=Scalable [256x256/stock/data] MinSize=64 Size=256 MaxSize=256 Context=Stock Type=Scalable [256x256/stock/form] MinSize=64 Size=256 MaxSize=256 Context=Stock Type=Scalable [256x256/stock/image] MinSize=64 Size=256 MaxSize=256 Context=Stock Type=Scalable [256x256/stock/io] MinSize=64 Size=256 MaxSize=256 Context=Stock Type=Scalable [256x256/stock/media] MinSize=64 Size=256 MaxSize=256 Context=Stock Type=Scalable [256x256/stock/navigation] MinSize=64 Size=256 MaxSize=256 Context=Stock Type=Scalable [256x256/stock/net] MinSize=64 Size=256 MaxSize=256 Context=Stock Type=Scalable [256x256/stock/object] MinSize=64 Size=256 MaxSize=256 Context=Stock Type=Scalable [256x256/stock/table] MinSize=64 Size=256 MaxSize=256 Context=Stock Type=Scalable [256x256/stock/text] MinSize=64 Size=256 MaxSize=256 Context=Stock Type=Scalable [512x512/actions] MinSize=64 Size=512 MaxSize=512 Context=Actions Type=Scalable [512x512/animations] MinSize=64 Size=512 MaxSize=512 Context=Animations Type=Scalable [512x512/apps] MinSize=64 Size=512 MaxSize=512 Context=Applications Type=Scalable [512x512/categories] MinSize=64 Size=512 MaxSize=512 Context=Categories Type=Scalable [512x512/devices] MinSize=64 Size=512 MaxSize=512 Context=Devices Type=Scalable [512x512/emblems] MinSize=64 Size=512 MaxSize=512 Context=Emblems Type=Scalable [512x512/emotes] MinSize=64 Size=512 MaxSize=512 Context=Emotes Type=Scalable [512x512/filesystems] MinSize=64 Size=512 MaxSize=512 Context=FileSystems Type=Scalable [512x512/intl] MinSize=64 Size=512 MaxSize=512 Context=International Type=Scalable [512x512/mimetypes] MinSize=64 Size=512 MaxSize=512 Context=MimeTypes Type=Scalable [512x512/places] MinSize=64 Size=512 MaxSize=512 Context=Places Type=Scalable [512x512/status] MinSize=64 Size=512 MaxSize=512 Context=Status Type=Scalable [512x512/stock/chart] MinSize=64 Size=512 MaxSize=512 Context=Stock Type=Scalable [512x512/stock/code] MinSize=64 Size=512 MaxSize=512 Context=Stock Type=Scalable [512x512/stock/data] MinSize=64 Size=512 MaxSize=512 Context=Stock Type=Scalable [512x512/stock/form] MinSize=64 Size=512 MaxSize=512 Context=Stock Type=Scalable [512x512/stock/image] MinSize=64 Size=512 MaxSize=512 Context=Stock Type=Scalable [512x512/stock/io] MinSize=64 Size=512 MaxSize=512 Context=Stock Type=Scalable [512x512/stock/media] MinSize=64 Size=512 MaxSize=512 Context=Stock Type=Scalable [512x512/stock/navigation] MinSize=64 Size=512 MaxSize=512 Context=Stock Type=Scalable [512x512/stock/net] MinSize=64 Size=512 MaxSize=512 Context=Stock Type=Scalable [512x512/stock/object] MinSize=64 Size=512 MaxSize=512 Context=Stock Type=Scalable [512x512/stock/table] MinSize=64 Size=512 MaxSize=512 Context=Stock Type=Scalable [512x512/stock/text] MinSize=64 Size=512 MaxSize=512 Context=Stock Type=Scalable [scalable/actions] MinSize=1 Size=128 MaxSize=256 Context=Actions Type=Scalable [scalable/animations] MinSize=1 Size=128 MaxSize=256 Context=Animations Type=Scalable [scalable/apps] MinSize=1 Size=128 MaxSize=256 Context=Applications Type=Scalable [scalable/categories] MinSize=1 Size=128 MaxSize=256 Context=Categories Type=Scalable [scalable/devices] MinSize=1 Size=128 MaxSize=512 Context=Devices Type=Scalable [scalable/emblems] MinSize=1 Size=128 MaxSize=256 Context=Emblems Type=Scalable [scalable/emotes] MinSize=1 Size=128 MaxSize=512 Context=Emotes Type=Scalable [scalable/filesystems] MinSize=1 Size=128 MaxSize=256 Context=FileSystems Type=Scalable [scalable/intl] MinSize=1 Size=128 MaxSize=512 Context=International Type=Scalable [scalable/mimetypes] MinSize=1 Size=128 MaxSize=256 Context=MimeTypes Type=Scalable [scalable/places] MinSize=1 Size=128 MaxSize=512 Context=Places Type=Scalable [scalable/status] MinSize=1 Size=128 MaxSize=256 Context=Status Type=Scalable [scalable/stock/chart] MinSize=1 Size=128 MaxSize=512 Context=Stock Type=Scalable [scalable/stock/code] MinSize=1 Size=128 MaxSize=256 Context=Stock Type=Scalable [scalable/stock/data] MinSize=1 Size=128 MaxSize=512 Context=Stock Type=Scalable [scalable/stock/form] MinSize=1 Size=128 MaxSize=256 Context=Stock Type=Scalable [scalable/stock/image] MinSize=1 Size=128 MaxSize=512 Context=Stock Type=Scalable [scalable/stock/io] MinSize=1 Size=128 MaxSize=256 Context=Stock Type=Scalable [scalable/stock/media] MinSize=1 Size=128 MaxSize=512 Context=Stock Type=Scalable [scalable/stock/navigation] MinSize=1 Size=128 MaxSize=256 Context=Stock Type=Scalable [scalable/stock/net] MinSize=1 Size=128 MaxSize=512 Context=Stock Type=Scalable [scalable/stock/object] MinSize=1 Size=128 MaxSize=256 Context=Stock Type=Scalable [scalable/stock/table] MinSize=1 Size=128 MaxSize=512 Context=Stock Type=Scalable [scalable/stock/text] MinSize=1 Size=128 MaxSize=256 Context=Stock Type=Scalable gImageReader-3.2.3/packaging/win32/skel/share/myspell/000077500000000000000000000000001312567024200224505ustar00rootroot00000000000000gImageReader-3.2.3/packaging/win32/skel/share/myspell/dicts/000077500000000000000000000000001312567024200235565ustar00rootroot00000000000000gImageReader-3.2.3/packaging/win32/skel/share/myspell/dicts/README.txt000066400000000000000000000005611312567024200252560ustar00rootroot00000000000000This folder contains spelling dictionaries. To add additional spelling dictionaries: * Visit https://cgit.freedesktop.org/libreoffice/dictionaries/tree/ * Download the *.diff and *.aff files for the desired language and place them inside this folder * If gImageReader is running, select "Redetect Languages" from the application menu, or restart the application gImageReader-3.2.3/packaging/win32/skel/share/tessdata/000077500000000000000000000000001312567024200225735ustar00rootroot00000000000000gImageReader-3.2.3/packaging/win32/skel/share/tessdata/README.txt000066400000000000000000000013621312567024200242730ustar00rootroot00000000000000This folder contains tesseract language definitions. To add additional language definitions: - Use the tessdata manager from the language selection menu in gImageReader - Or install the languages manually: * In the gImageReader about dialog, check which version of tesseract is used * Go to the https://github.com/tesseract-ocr/tessdata, and in the branch selection button, under tags, select the version which is *less or equal* the tesseract version in use * Download the desired language definitions (*.traineddata along with any supplementary files which certain languages need) and save them inside this folder * If gImageReader is running, select "Redetect Languages" from the application menu, or restart the application gImageReader-3.2.3/po/000077500000000000000000000000001312567024200144535ustar00rootroot00000000000000gImageReader-3.2.3/po/LINGUAS000066400000000000000000000000771312567024200155040ustar00rootroot00000000000000cs de el es_ES fr it pl pt_BR ru sl sv tr uk zh_TW zh_HK zh_CN gImageReader-3.2.3/po/POTFILES.in000066400000000000000000000055031312567024200162330ustar00rootroot00000000000000# List of source files containing translatable strings. [type: gettext/glade]gtk/data/appmenu.ui [type: gettext/glade]gtk/data/crashhandler.ui [type: gettext/glade]gtk/data/editor_hocr.ui [type: gettext/glade]gtk/data/editor_text.ui [type: gettext/glade]gtk/data/gimagereader.ui gtk/src/Acquirer.cc gtk/src/Acquirer.hh gtk/src/Application.hh gtk/src/common.hh gtk/src/Config.cc gtk/src/Config.hh gtk/src/ConfigSettings.cc gtk/src/ConfigSettings.hh gtk/src/CrashHandler.cc gtk/src/CrashHandler.hh gtk/src/Displayer.cc gtk/src/Displayer.hh gtk/src/DisplayerToolHOCR.cc gtk/src/DisplayerToolHOCR.hh gtk/src/DisplayerToolSelect.cc gtk/src/DisplayerToolSelect.hh gtk/src/DisplayRenderer.cc gtk/src/DisplayRenderer.hh gtk/src/FileDialogs.cc gtk/src/FileDialogs.hh gtk/src/Geometry.hh gtk/src/Image.cc gtk/src/Image.hh gtk/src/main.cc gtk/src/MainWindow.cc gtk/src/MainWindow.hh gtk/src/OutputBuffer.cc gtk/src/OutputBuffer.hh gtk/src/OutputEditor.hh gtk/src/OutputEditorHOCR.cc gtk/src/OutputEditorHOCR.hh gtk/src/OutputEditorText.cc gtk/src/OutputEditorText.hh gtk/src/Recognizer.cc gtk/src/Recognizer.hh gtk/src/Scanner.hh gtk/src/scanner/ScannerSane.cc gtk/src/scanner/ScannerSane.hh gtk/src/scanner/ScannerTwain.cc gtk/src/scanner/ScannerTwain.hh gtk/src/SourceManager.cc gtk/src/SourceManager.hh gtk/src/SubstitutionsManager.cc gtk/src/SubstitutionsManager.hh gtk/src/TessdataManager.cc gtk/src/TessdataManager.hh gtk/src/Utils.cc gtk/src/Utils.hh [type: gettext/qtdesigner]qt/data/AboutDialog.ui [type: gettext/qtdesigner]qt/data/ConfigDialog.ui [type: gettext/qtdesigner]qt/data/CrashHandler.ui [type: gettext/qtdesigner]qt/data/MainWindow.ui [type: gettext/qtdesigner]qt/data/PageRangeDialog.ui [type: gettext/qtdesigner]qt/data/PdfExportDialog.ui qt/src/Acquirer.cc qt/src/Acquirer.hh qt/src/common.hh qt/src/Config.cc qt/src/Config.hh qt/src/ConfigSettings.cc qt/src/ConfigSettings.hh qt/src/CrashHandler.cc qt/src/CrashHandler.hh qt/src/Displayer.cc qt/src/Displayer.hh qt/src/DisplayerToolHOCR.cc qt/src/DisplayerToolHOCR.hh qt/src/DisplayerToolSelect.cc qt/src/DisplayerToolSelect.hh qt/src/DisplayRenderer.cc qt/src/DisplayRenderer.hh qt/src/main.cc qt/src/MainWindow.cc qt/src/MainWindow.hh qt/src/OutputEditor.cc qt/src/OutputEditor.hh qt/src/OutputEditorHOCR.cc qt/src/OutputEditorHOCR.hh qt/src/OutputEditorText.cc qt/src/OutputEditorText.hh qt/src/OutputTextEdit.cc qt/src/OutputTextEdit.hh qt/src/Recognizer.cc qt/src/Recognizer.hh qt/src/Scanner.cc qt/src/Scanner.hh qt/src/scanner/ScannerSane.cc qt/src/scanner/ScannerSane.hh qt/src/scanner/ScannerTwain.cc qt/src/scanner/ScannerTwain.hh qt/src/SourceManager.cc qt/src/SourceManager.hh qt/src/SubstitutionsManager.cc qt/src/SubstitutionsManager.hh qt/src/TessdataManager.cc qt/src/TessdataManager.hh qt/src/Ui_MainWindow.hh qt/src/Ui_OutputEditorHOCR.hh qt/src/Ui_OutputEditorText.hh qt/src/Utils.cc qt/src/Utils.hh gImageReader-3.2.3/po/cs.po000066400000000000000000001546171312567024200154360ustar00rootroot00000000000000# Czech translations for gImageReader package # Czech messages for gImageReader. # Copyright (C) 2010-2013 THE GIMAGEREADER'S COPYRIGHT HOLDER # This file is distributed under the same license as the gImageReader package. # # Pavel Borecki , 2014-2017. # Sandro Mani , 2017. msgid "" msgstr "" "Project-Id-Version: \n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2017-07-01 10:34+0200\n" "PO-Revision-Date: 2017-06-30 19:49+0100\n" "Last-Translator: Sandro Mani \n" "Language-Team: Czech \n" "Language: cs\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" "X-Generator: Lokalize 2.0\n" #: ../gtk/data/appmenu.ui.h:1 ../qt/src/Ui_MainWindow.hh:165 msgid "Redetect Languages" msgstr "Znovu zjistit přítomnost jazykových dat" #: ../gtk/data/appmenu.ui.h:2 ../gtk/data/gimagereader.ui.h:39 #: ../qt/data/ConfigDialog.ui.h:1 ../qt/src/Ui_MainWindow.hh:168 msgid "Preferences" msgstr "PÅ™edvolby" #: ../gtk/data/appmenu.ui.h:3 ../gtk/data/gimagereader.ui.h:40 #: ../gtk/src/MainWindow.cc:484 ../qt/src/MainWindow.cc:445 #: ../qt/src/Ui_MainWindow.hh:173 msgid "Help" msgstr "NápovÄ›da" #: ../gtk/data/appmenu.ui.h:4 ../qt/data/AboutDialog.ui.h:2 #: ../qt/src/Ui_MainWindow.hh:176 msgid "About" msgstr "O aplikaci" #: ../gtk/data/appmenu.ui.h:5 msgid "Quit" msgstr "UkonÄit" #: ../gtk/data/crashhandler.ui.h:1 ../qt/src/CrashHandler.cc:36 msgid "Regenerate backtrace" msgstr "Znovu naÄíst hlášení backtrace diagnostiky" #: ../gtk/data/crashhandler.ui.h:2 msgid "The application has crashed" msgstr "DoÅ¡lo k pádu aplikace" #: ../gtk/data/crashhandler.ui.h:4 #, no-c-format msgid "" "Apologies for the inconvenience. To help improve the application, please " "consider reporting the issue to manisandro@gmail.com. Please try to " "describe what you were doing before the application crashed. Also, include " "the information below. Thank you." msgstr "" "Velmi se omlouváme za vzniklé potíže. Prosíme pomozte s odstranÄ›ním příÄiny " "tohoto problému nahlášením na e-mail manisandro@gmail.com. Ve zprávÄ› se " "pokuste popsat svou Äinnost pÅ™ed pádem aplikace. Též pÅ™iložte níže uvedené " "informace. DÄ›kujeme." #: ../gtk/data/editor_hocr.ui.h:1 ../qt/data/PdfExportDialog.ui.h:1 msgid "PDF Export" msgstr "Export do PDF" #: ../gtk/data/editor_hocr.ui.h:2 ../gtk/data/gimagereader.ui.h:55 #: ../gtk/src/Acquirer.cc:42 ../gtk/src/FileDialogs.cc:150 #: ../gtk/src/Utils.cc:68 ../qt/data/ConfigDialog.ui.h:27 #: ../qt/data/MainWindow.ui.h:14 msgid "Cancel" msgstr "ZruÅ¡it" #: ../gtk/data/editor_hocr.ui.h:3 ../gtk/data/gimagereader.ui.h:41 #: ../gtk/src/FileDialogs.cc:151 ../gtk/src/Utils.cc:59 #: ../qt/data/ConfigDialog.ui.h:26 msgid "OK" msgstr "OK" #: ../gtk/data/editor_hocr.ui.h:4 ../qt/data/PdfExportDialog.ui.h:2 msgid "Output mode:" msgstr "Výstupní režim:" #: ../gtk/data/editor_hocr.ui.h:5 ../qt/data/PdfExportDialog.ui.h:3 msgid "PDF" msgstr "PDF" #: ../gtk/data/editor_hocr.ui.h:6 ../qt/data/PdfExportDialog.ui.h:4 msgid "PDF with invisible text overlay" msgstr "PDF s neviditelnou textovou vrstvou" #: ../gtk/data/editor_hocr.ui.h:7 ../qt/data/PdfExportDialog.ui.h:16 msgid "Format:" msgstr "Formát" #: ../gtk/data/editor_hocr.ui.h:8 ../qt/data/PdfExportDialog.ui.h:17 msgid "Compression:" msgstr "Komprese" #: ../gtk/data/editor_hocr.ui.h:9 ../qt/data/PdfExportDialog.ui.h:14 msgid "Compression quality:" msgstr "Stupeň komprese:" #: ../gtk/data/editor_hocr.ui.h:10 ../qt/data/PdfExportDialog.ui.h:15 msgid "DPI:" msgstr "DPI:" #: ../gtk/data/editor_hocr.ui.h:11 ../qt/data/PdfExportDialog.ui.h:18 msgid "Dithering algorithm:" msgstr "Rozmývací algoritmus:" #: ../gtk/data/editor_hocr.ui.h:12 ../qt/data/PdfExportDialog.ui.h:13 msgid "Image settings:" msgstr "Nastavení obrázku:" #: ../gtk/data/editor_hocr.ui.h:13 ../qt/data/PdfExportDialog.ui.h:11 msgid "Document font:" msgstr "Písmo dokumentu:" #: ../gtk/data/editor_hocr.ui.h:14 ../qt/data/PdfExportDialog.ui.h:7 msgid "Uniformize line and word spacing" msgstr "Sjednotit velikost rozestupů řádků a slov" #: ../gtk/data/editor_hocr.ui.h:15 ../qt/data/PdfExportDialog.ui.h:10 msgid "Use detected font sizes" msgstr "Použít zjiÅ¡tÄ›né velikosti písma" #: ../gtk/data/editor_hocr.ui.h:16 ../qt/data/PdfExportDialog.ui.h:8 msgid "Preserve spaces wider than:" msgstr "Zachovat mezery Å¡irší než:" #: ../gtk/data/editor_hocr.ui.h:17 ../qt/data/PdfExportDialog.ui.h:12 msgid "characters" msgstr "znaky" #: ../gtk/data/editor_hocr.ui.h:18 ../qt/data/PdfExportDialog.ui.h:9 msgid "Scale:" msgstr "Měřítko:" #: ../gtk/data/editor_hocr.ui.h:19 ../qt/data/PdfExportDialog.ui.h:6 msgid "Text settings:" msgstr "Nastavení textu:" #: ../gtk/data/editor_hocr.ui.h:20 ../qt/data/PdfExportDialog.ui.h:5 msgid "Show preview" msgstr "Zobrazit náhled" #: ../gtk/data/editor_hocr.ui.h:21 ../gtk/data/editor_text.ui.h:26 #: ../qt/src/Ui_OutputEditorText.hh:123 msgid "Save output" msgstr "Uložit výstup" #: ../gtk/data/editor_hocr.ui.h:22 ../qt/src/Ui_OutputEditorHOCR.hh:44 #: ../qt/src/Ui_OutputEditorHOCR.hh:45 msgid "Export to PDF" msgstr "Exportovat do PDF" #: ../gtk/data/editor_hocr.ui.h:23 ../gtk/data/editor_text.ui.h:27 #: ../qt/src/Ui_OutputEditorHOCR.hh:47 ../qt/src/Ui_OutputEditorHOCR.hh:48 #: ../qt/src/Ui_OutputEditorText.hh:125 msgid "Clear output" msgstr "VyÄistit výstup" #: ../gtk/data/editor_hocr.ui.h:24 ../qt/src/Ui_OutputEditorHOCR.hh:75 msgid "Properties" msgstr "Vlastnosti" #: ../gtk/data/editor_hocr.ui.h:25 ../qt/src/Ui_OutputEditorHOCR.hh:79 msgid "Source" msgstr "Zdroj" #. Output insert mode #: ../gtk/data/editor_text.ui.h:1 ../qt/src/Ui_OutputEditorText.hh:59 msgid "Append to current text" msgstr "PÅ™ipojit ke stávajícímu textu" #: ../gtk/data/editor_text.ui.h:2 ../qt/src/Ui_OutputEditorText.hh:60 msgid "Insert at cursor" msgstr "Vložit na pozici kurzoru" #: ../gtk/data/editor_text.ui.h:3 ../qt/src/Ui_OutputEditorText.hh:61 msgid "Replace current text" msgstr "Nahradit stávající text" #: ../gtk/data/editor_text.ui.h:4 ../qt/src/SubstitutionsManager.cc:37 #: ../qt/src/Ui_OutputEditorText.hh:177 msgid "Substitutions" msgstr "Dosazování" #: ../gtk/data/editor_text.ui.h:5 ../qt/src/SubstitutionsManager.cc:42 #: ../qt/src/SubstitutionsManager.cc:43 msgid "Open" msgstr "Otevřít" #: ../gtk/data/editor_text.ui.h:6 ../gtk/src/Utils.cc:71 #: ../qt/src/SubstitutionsManager.cc:45 ../qt/src/SubstitutionsManager.cc:46 msgid "Save" msgstr "Uložit" #: ../gtk/data/editor_text.ui.h:7 ../qt/src/SubstitutionsManager.cc:48 #: ../qt/src/SubstitutionsManager.cc:49 msgid "Clear" msgstr "VyÄistit" #: ../gtk/data/editor_text.ui.h:8 ../qt/data/ConfigDialog.ui.h:16 #: ../qt/src/SubstitutionsManager.cc:51 ../qt/src/SubstitutionsManager.cc:52 msgid "Add" msgstr "PÅ™idat" #: ../gtk/data/editor_text.ui.h:9 ../gtk/src/OutputEditorHOCR.cc:1202 #: ../gtk/src/OutputEditorHOCR.cc:1213 ../qt/data/ConfigDialog.ui.h:17 #: ../qt/src/OutputEditorHOCR.cc:998 ../qt/src/OutputEditorHOCR.cc:1000 #: ../qt/src/SubstitutionsManager.cc:54 ../qt/src/SubstitutionsManager.cc:55 msgid "Remove" msgstr "Odebrat" #: ../gtk/data/editor_text.ui.h:10 ../gtk/data/gimagereader.ui.h:73 msgid "Apply" msgstr "Použít" #: ../gtk/data/editor_text.ui.h:11 ../gtk/data/gimagereader.ui.h:74 msgid "Close" msgstr "Zavřít" #. Output postprocessing #: ../gtk/data/editor_text.ui.h:12 ../qt/src/Ui_OutputEditorText.hh:69 msgid "Keep line break if..." msgstr "Ponechat zalomení řádku pokud…" #: ../gtk/data/editor_text.ui.h:13 ../qt/src/Ui_OutputEditorText.hh:71 msgid "Preceded by end mark (.?!)" msgstr "PÅ™edchází znaÄce konce (.?!)" #: ../gtk/data/editor_text.ui.h:14 ../qt/src/Ui_OutputEditorText.hh:73 msgid "Preceded or succeeded by quote" msgstr "PÅ™edchází Äi následuje za uvozovkami" #: ../gtk/data/editor_text.ui.h:15 ../qt/src/Ui_OutputEditorText.hh:75 msgid "Other options" msgstr "Další možnosti" #: ../gtk/data/editor_text.ui.h:16 ../qt/src/Ui_OutputEditorText.hh:77 msgid "Join hyphenated words" msgstr "Spojit rozdÄ›lená slova" #: ../gtk/data/editor_text.ui.h:17 ../qt/src/Ui_OutputEditorText.hh:79 msgid "Collapse whitespace" msgstr "Odstranit prázdné místo" #: ../gtk/data/editor_text.ui.h:18 ../qt/src/Ui_OutputEditorText.hh:81 msgid "Preserve paragraphs" msgstr "Zachovat odstavce" #: ../gtk/data/editor_text.ui.h:19 ../qt/src/Ui_OutputEditorText.hh:83 msgid "Visual aids" msgstr "Vizuální pomůcky" #: ../gtk/data/editor_text.ui.h:20 ../qt/src/Ui_OutputEditorText.hh:85 msgid "Draw whitespace" msgstr "Zvýraznit prázdná místa" #: ../gtk/data/editor_text.ui.h:21 ../gtk/data/gimagereader.ui.h:31 #: ../qt/src/Ui_OutputEditorText.hh:102 msgid "Select insert mode" msgstr "Vyberte režim vkládání" #: ../gtk/data/editor_text.ui.h:22 ../qt/src/Ui_OutputEditorText.hh:109 msgid "Strip line breaks on selected text" msgstr "Z oznaÄeného textu odebrat zalomení řádků" #: ../gtk/data/editor_text.ui.h:23 ../qt/src/Ui_OutputEditorText.hh:114 msgid "Find and replace" msgstr "Najít a nahradit" #: ../gtk/data/editor_text.ui.h:24 ../qt/src/Ui_OutputEditorText.hh:116 #: ../qt/src/Ui_OutputEditorText.hh:117 msgid "Undo" msgstr "ZpÄ›t" #: ../gtk/data/editor_text.ui.h:25 ../qt/src/Ui_OutputEditorText.hh:119 #: ../qt/src/Ui_OutputEditorText.hh:120 msgid "Redo" msgstr "Znovu" #: ../gtk/data/editor_text.ui.h:28 ../qt/src/Ui_OutputEditorText.hh:149 msgid "Find" msgstr "Najít" #: ../gtk/data/editor_text.ui.h:29 ../qt/src/Ui_OutputEditorText.hh:153 #: ../qt/src/Ui_OutputEditorText.hh:168 msgid "Replace" msgstr "Nahradit" #: ../gtk/data/editor_text.ui.h:30 ../qt/src/Ui_OutputEditorText.hh:173 msgid "Replace all" msgstr "Nahradit vÅ¡e" #: ../gtk/data/editor_text.ui.h:31 ../qt/src/Ui_OutputEditorText.hh:163 msgid "Find previous" msgstr "Najít pÅ™edchozí výskyt" #: ../gtk/data/editor_text.ui.h:32 ../qt/src/Ui_OutputEditorText.hh:158 msgid "Find next" msgstr "Najít následující výskyt" #: ../gtk/data/editor_text.ui.h:33 ../qt/src/Ui_OutputEditorText.hh:182 msgid "Match case" msgstr "RozliÅ¡ovat malá/velká písmena" #: ../gtk/data/gimagereader.ui.h:1 ../qt/src/Ui_MainWindow.hh:65 msgid "Rotate current page" msgstr "OtoÄit stávající stránku" #: ../gtk/data/gimagereader.ui.h:2 ../qt/src/Ui_MainWindow.hh:66 msgid "Rotate all pages" msgstr "OtoÄit vÅ¡echny stránky" #: ../gtk/data/gimagereader.ui.h:3 ../qt/data/MainWindow.ui.h:35 msgid "Toggle output pane" msgstr "Zobrazit Äi skrýt podokno s výstupním textem" #. Sources toolbar #: ../gtk/data/gimagereader.ui.h:4 ../qt/src/Ui_MainWindow.hh:187 msgid "Recent" msgstr "Nedávno použité" #: ../gtk/data/gimagereader.ui.h:5 ../qt/src/Ui_MainWindow.hh:188 msgid "Paste" msgstr "Vložit" #: ../gtk/data/gimagereader.ui.h:6 ../qt/src/Ui_MainWindow.hh:189 msgid "Take Screenshot" msgstr "Zachytit snímek obrazovky" #: ../gtk/data/gimagereader.ui.h:7 ../qt/src/Ui_MainWindow.hh:200 msgid "Add images" msgstr "PÅ™idat obrázky" #: ../gtk/data/gimagereader.ui.h:8 ../qt/src/Ui_MainWindow.hh:199 msgid "Add Images" msgstr "PÅ™idat obrázky" #: ../gtk/data/gimagereader.ui.h:9 ../qt/src/Ui_MainWindow.hh:205 msgid "Remove image from list" msgstr "Odebrat obrázek ze seznamu" #: ../gtk/data/gimagereader.ui.h:10 ../qt/src/Ui_MainWindow.hh:208 msgid "Delete image" msgstr "Smazat obrázek" #: ../gtk/data/gimagereader.ui.h:11 ../qt/src/Ui_MainWindow.hh:211 msgid "Clear list" msgstr "VyÄistit seznam" #: ../gtk/data/gimagereader.ui.h:12 ../qt/data/MainWindow.ui.h:6 msgid "Files" msgstr "soubory" #: ../gtk/data/gimagereader.ui.h:13 ../qt/data/MainWindow.ui.h:16 msgid "Device:" msgstr "Zařízení:" #: ../gtk/data/gimagereader.ui.h:14 ../qt/data/MainWindow.ui.h:15 #: ../qt/src/TessdataManager.cc:57 msgid "Refresh" msgstr "Znovu naÄíst" #: ../gtk/data/gimagereader.ui.h:15 ../qt/data/MainWindow.ui.h:12 msgid "Output:" msgstr "Výstup:" #: ../gtk/data/gimagereader.ui.h:16 ../qt/data/MainWindow.ui.h:9 msgid "Mode:" msgstr "Režim:" #: ../gtk/data/gimagereader.ui.h:17 ../gtk/src/OutputEditorHOCR.cc:362 #: ../qt/data/MainWindow.ui.h:11 ../qt/src/OutputEditorHOCR.cc:273 msgid "Color" msgstr "Barevný" #: ../gtk/data/gimagereader.ui.h:18 ../gtk/src/OutputEditorHOCR.cc:365 #: ../qt/data/MainWindow.ui.h:10 ../qt/src/OutputEditorHOCR.cc:275 #: ../qt/src/OutputEditorHOCR.cc:277 msgid "Grayscale" msgstr "StupnÄ› Å¡edé" #: ../gtk/data/gimagereader.ui.h:19 ../qt/data/MainWindow.ui.h:8 msgid "Resolution:" msgstr "RozliÅ¡ení:" #: ../gtk/data/gimagereader.ui.h:20 ../qt/data/MainWindow.ui.h:13 msgid "Scan" msgstr "Skenovat" #: ../gtk/data/gimagereader.ui.h:21 ../qt/data/MainWindow.ui.h:7 msgid "Acquire" msgstr "Získat" #: ../gtk/data/gimagereader.ui.h:22 ../qt/data/MainWindow.ui.h:2 msgid "Brightness" msgstr "SvÄ›tlost" #: ../gtk/data/gimagereader.ui.h:23 ../qt/data/MainWindow.ui.h:3 msgid "Contrast" msgstr "Kontrast" #: ../gtk/data/gimagereader.ui.h:24 ../qt/data/MainWindow.ui.h:4 msgid "Resolution" msgstr "RozliÅ¡ení" #: ../gtk/data/gimagereader.ui.h:25 ../qt/data/MainWindow.ui.h:5 msgid "Invert colors" msgstr "PÅ™evrátit barvy" #: ../gtk/data/gimagereader.ui.h:26 ../qt/data/MainWindow.ui.h:19 msgid "Zoom in" msgstr "PÅ™iblížit" #: ../gtk/data/gimagereader.ui.h:27 ../qt/data/MainWindow.ui.h:21 msgid "Zoom out" msgstr "Oddálit" #: ../gtk/data/gimagereader.ui.h:28 ../qt/data/MainWindow.ui.h:23 msgid "Normal size" msgstr "Původní velikost" #: ../gtk/data/gimagereader.ui.h:29 ../qt/data/MainWindow.ui.h:25 msgid "Best fit" msgstr "PÅ™izpůsobit oknu" #: ../gtk/data/gimagereader.ui.h:30 ../qt/src/Ui_MainWindow.hh:74 msgid "Select rotation mode" msgstr "Vyberte režim otáÄení" #: ../gtk/data/gimagereader.ui.h:32 ../qt/data/MainWindow.ui.h:31 msgid "Image controls" msgstr "Ovládání parametrů obrázku" #: ../gtk/data/gimagereader.ui.h:33 ../qt/src/Ui_MainWindow.hh:137 msgid "Plain text" msgstr "Holý text" #: ../gtk/data/gimagereader.ui.h:34 ../qt/src/Ui_MainWindow.hh:137 msgid "hOCR, PDF" msgstr "hOCR, PDF" #: ../gtk/data/gimagereader.ui.h:35 ../qt/data/MainWindow.ui.h:33 msgid "Autodetect layout" msgstr "Automaticky zjistit rozvržení stránky" #: ../gtk/data/gimagereader.ui.h:36 msgid "Recognize all" msgstr "Rozpoznat vÅ¡e" #: ../gtk/data/gimagereader.ui.h:37 msgid "Select language" msgstr "Vyberte jazyk" #: ../gtk/data/gimagereader.ui.h:38 msgid "A graphical frontend to tesseract-ocr" msgstr "Grafická nadstavba pro engine tesseract-ocr" #: ../gtk/data/gimagereader.ui.h:42 msgid "Output pane orientation:" msgstr "Orientace podokna s výstupním textem:" #: ../gtk/data/gimagereader.ui.h:43 msgid "Horizontal" msgstr "VodorovnÄ›" #: ../gtk/data/gimagereader.ui.h:44 msgid "Vertical" msgstr "Svisle" #: ../gtk/data/gimagereader.ui.h:45 ../qt/data/ConfigDialog.ui.h:18 msgid "Query to install missing spellcheck dictionaries" msgstr "Dotazovat se na instalaci chybÄ›jících slovníků pro kontrolu pÅ™eklepů" #: ../gtk/data/gimagereader.ui.h:46 ../qt/data/ConfigDialog.ui.h:4 msgid "Automatically check for new program versions" msgstr "Automaticky zjišťovat případné novÄ›jší verze aplikace" #: ../gtk/data/gimagereader.ui.h:47 ../qt/data/ConfigDialog.ui.h:3 msgid "Predefined language definitions:" msgstr "PÅ™edpÅ™ipravené jazykové definice:" #: ../gtk/data/gimagereader.ui.h:48 ../qt/data/ConfigDialog.ui.h:12 msgid "Additional language definitions:" msgstr "Další jazykové definice:" #: ../gtk/data/gimagereader.ui.h:49 ../qt/data/ConfigDialog.ui.h:20 msgid "The prefix of the tesseract language data file" msgstr "PÅ™edpona souboru s jazykovými daty engine tesseract" #: ../gtk/data/gimagereader.ui.h:50 ../qt/data/ConfigDialog.ui.h:21 msgid "Prefix" msgstr "PÅ™edpona" #: ../gtk/data/gimagereader.ui.h:51 ../qt/data/ConfigDialog.ui.h:22 msgid "The ISO 639-1 language code followed by the country code" msgstr "Kód jazyka dle normy ISO 639-1, následovaný kódem pro zemi" #: ../gtk/data/gimagereader.ui.h:52 ../qt/data/ConfigDialog.ui.h:23 msgid "ISO Code" msgstr "Kód dle ISO normy" #: ../gtk/data/gimagereader.ui.h:53 ../qt/data/ConfigDialog.ui.h:24 msgid "The name of the language" msgstr "Název jazyka" #: ../gtk/data/gimagereader.ui.h:54 ../qt/data/ConfigDialog.ui.h:25 msgid "Name" msgstr "Název" #: ../gtk/data/gimagereader.ui.h:56 ../qt/data/ConfigDialog.ui.h:5 msgid "Output pane font:" msgstr "Písmo textu v podoknÄ› s výstupem:" #: ../gtk/data/gimagereader.ui.h:57 ../qt/data/ConfigDialog.ui.h:2 msgid "Default" msgstr "Výchozí" #: ../gtk/data/gimagereader.ui.h:58 ../qt/data/ConfigDialog.ui.h:6 msgid "Language data locations:" msgstr "UmístÄ›ní jazykových dat:" #: ../gtk/data/gimagereader.ui.h:59 ../qt/data/ConfigDialog.ui.h:13 msgid "Language definitions path:" msgstr "Popisy umístÄ›ní jazykových definic:" #: ../gtk/data/gimagereader.ui.h:60 ../qt/data/ConfigDialog.ui.h:28 msgid "Spelling dictionaries path:" msgstr "Popisy umístÄ›ní slovníků pro kontrolu pÅ™eklepů:" #: ../gtk/data/gimagereader.ui.h:61 ../qt/data/ConfigDialog.ui.h:10 msgid "System-wide paths" msgstr "Popisy umístÄ›ní, spoleÄných pro vÅ¡echny uživatele" #: ../gtk/data/gimagereader.ui.h:62 ../qt/data/ConfigDialog.ui.h:11 msgid "User paths" msgstr "Pro jednotlivé uživatele" #: ../gtk/data/gimagereader.ui.h:63 ../qt/data/PageRangeDialog.ui.h:1 msgid "Page Range" msgstr "Strany" #: ../gtk/data/gimagereader.ui.h:64 ../qt/data/PageRangeDialog.ui.h:2 msgid "Page range:" msgstr "Strany:" #: ../gtk/data/gimagereader.ui.h:65 ../qt/data/PageRangeDialog.ui.h:3 msgid "Example: 1-10, 13, 14-18" msgstr "Příklad: 1-10, 13, 14-18" #: ../gtk/data/gimagereader.ui.h:66 ../qt/data/PageRangeDialog.ui.h:4 msgid "Recognition area:" msgstr "Oblast k rozpoznání" #: ../gtk/data/gimagereader.ui.h:67 ../gtk/src/Recognizer.cc:403 #: ../qt/data/PageRangeDialog.ui.h:5 ../qt/src/Recognizer.cc:381 msgid "Entire page" msgstr "Celá strana" #: ../gtk/data/gimagereader.ui.h:68 ../qt/data/PageRangeDialog.ui.h:6 msgid "Autodetect" msgstr "Automaticky" #: ../gtk/data/gimagereader.ui.h:69 ../qt/data/PageRangeDialog.ui.h:7 #, fuzzy msgid "Prepend to output text:" msgstr "PÅ™ipojit ke stávajícímu textu" #: ../gtk/data/gimagereader.ui.h:70 ../qt/data/PageRangeDialog.ui.h:8 msgid "Source filename" msgstr "" #: ../gtk/data/gimagereader.ui.h:71 ../qt/data/PageRangeDialog.ui.h:9 #, fuzzy msgid "Source page" msgstr "Zdroj" #: ../gtk/data/gimagereader.ui.h:72 ../qt/src/TessdataManager.cc:47 msgid "Tessdata Manager" msgstr "Správce dat engine Tesseract" #: ../gtk/data/gimagereader.ui.h:75 ../qt/src/TessdataManager.cc:49 msgid "Manage installed languages:" msgstr "Spravovat nainstalovaná jazyková data:" #: ../gtk/data/gimagereader.ui.h:76 ../qt/src/DisplayerToolSelect.cc:240 msgid "Delete" msgstr "Smazat" #: ../gtk/data/gimagereader.ui.h:77 ../qt/src/DisplayerToolSelect.cc:226 msgid "Order:" msgstr "PoÅ™adí:" #: ../gtk/data/gimagereader.ui.h:78 ../gtk/src/DisplayerToolHOCR.cc:28 #: ../qt/src/DisplayerToolHOCR.cc:30 ../qt/src/DisplayerToolSelect.cc:241 msgid "Recognize" msgstr "Rozpoznat" #: ../gtk/data/gimagereader.ui.h:79 ../qt/src/DisplayerToolSelect.cc:242 msgid "Recognize to clipboard" msgstr "Rozpoznat do schránky" #: ../gtk/data/gimagereader.ui.h:80 ../qt/src/DisplayerToolSelect.cc:243 msgid "Save as image" msgstr "Uložit jako obrázek" #: ../gtk/data/gimagereader.ui.h:81 ../qt/src/Recognizer.cc:76 msgid "Current Page" msgstr "Stávající strana" #: ../gtk/data/gimagereader.ui.h:82 ../qt/src/Recognizer.cc:79 msgid "Multiple Pages..." msgstr "Vícero stran…" #: ../gtk/src/Acquirer.cc:83 ../qt/src/Acquirer.cc:63 msgid "scan.png" msgstr "sken.png" #: ../gtk/src/Acquirer.cc:96 ../qt/src/Acquirer.cc:80 msgid "Images" msgstr "Obrázky" #: ../gtk/src/Acquirer.cc:97 ../qt/src/Acquirer.cc:81 msgid "Choose Output Filename..." msgstr "Zvolte název souboru pro uložní výstupu…" #: ../gtk/src/Acquirer.cc:112 ../qt/src/Acquirer.cc:96 msgid "Failed to initialize the scanning backend." msgstr "NepodaÅ™ilo se inicializovat podpůrnou vrstvu pro skenování." #: ../gtk/src/Acquirer.cc:121 ../qt/src/Acquirer.cc:102 msgid "Scan failed" msgstr "Skenování se nezdaÅ™ilo" #: ../gtk/src/Acquirer.cc:139 ../qt/src/Acquirer.cc:118 msgid "No scanners were detected." msgstr "Nebyly nalezeny žádné skenery." #: ../gtk/src/Acquirer.cc:156 ../gtk/src/Acquirer.cc:173 #: ../qt/src/Acquirer.cc:132 ../qt/src/Acquirer.cc:149 msgid "Starting scan..." msgstr "Zahajování skenování…" #: ../gtk/src/Acquirer.cc:169 ../qt/src/Acquirer.cc:145 msgid "Opening device..." msgstr "Navazování komunikace se skenerem…" #: ../gtk/src/Acquirer.cc:171 ../qt/src/Acquirer.cc:147 msgid "Setting options..." msgstr "Nastavování pÅ™edvoleb…" #: ../gtk/src/Acquirer.cc:175 ../qt/src/Acquirer.cc:151 msgid "Getting parameters..." msgstr "Získávání parametrů…" #: ../gtk/src/Acquirer.cc:177 ../qt/src/Acquirer.cc:153 msgid "Transferring data..." msgstr "PÅ™enášení dat…" #: ../gtk/src/Acquirer.cc:184 ../qt/src/Acquirer.cc:160 msgid "Canceling scan..." msgstr "RuÅ¡ení skenování…" #: ../gtk/src/Config.cc:297 ../qt/data/ConfigDialog.ui.h:7 msgid "Filename prefix" msgstr "PÅ™edpona názvu souboru" #: ../gtk/src/Config.cc:298 ../qt/data/ConfigDialog.ui.h:8 msgid "Code" msgstr "Kód" #: ../gtk/src/Config.cc:299 ../qt/data/ConfigDialog.ui.h:9 msgid "Native name" msgstr "Název v daném jazyce" #: ../gtk/src/CrashHandler.cc:26 ../gtk/src/CrashHandler.cc:43 #: ../qt/src/CrashHandler.cc:34 msgid "Crash Handler" msgstr "OÅ¡etÅ™ení pádu aplikace" #: ../gtk/src/CrashHandler.cc:45 ../qt/src/CrashHandler.cc:29 msgid "Your work has been saved under %1." msgstr "Zpracovávané bylo uloženo do %1." #: ../gtk/src/CrashHandler.cc:47 ../qt/src/CrashHandler.cc:31 msgid "There was no unsaved work." msgstr "Od posledního uložení nepÅ™ibylo nic nového." #: ../gtk/src/CrashHandler.cc:106 ../qt/src/CrashHandler.cc:60 msgid "Failed to obtain backtrace. Is gdb installed?" msgstr "" "NezdaÅ™ilo se získat backtrace diagnostiku. Je nainstalován ladící nástroj " "gdb?" #: ../gtk/src/Displayer.cc:261 ../qt/src/Displayer.cc:231 msgid "Failed to load image" msgstr "Obrázek se nepodaÅ™ilo naÄíst" #: ../gtk/src/Displayer.cc:261 ../qt/src/Displayer.cc:231 msgid "" "The file might not be an image or be corrupt:\n" "%1" msgstr "" "Soubor nejspíš neobsahuje obrazová data nebo je poÅ¡kozený:\n" "%1" #: ../gtk/src/DisplayerToolSelect.cc:39 ../qt/src/DisplayerToolSelect.cc:40 msgid "selection.png" msgstr "vyber.png" #: ../gtk/src/DisplayerToolSelect.cc:148 ../qt/src/DisplayerToolSelect.cc:139 msgid "PNG Images" msgstr "obrázky PNG" #: ../gtk/src/DisplayerToolSelect.cc:149 ../qt/src/DisplayerToolSelect.cc:139 msgid "Save Selection Image" msgstr "Uložit obrázek výbÄ›ru" #: ../gtk/src/DisplayerToolSelect.cc:157 ../qt/src/DisplayerToolSelect.cc:147 msgid "Recognize all" msgstr "Rozpoznat vÅ¡e" #: ../gtk/src/DisplayerToolSelect.cc:157 ../qt/src/DisplayerToolSelect.cc:147 msgid "Recognize selection" msgstr "Rozpoznat výbÄ›r" #: ../gtk/src/DisplayerToolSelect.cc:194 ../qt/src/DisplayerToolSelect.cc:184 msgid "Performing layout analysis" msgstr "ProvádÄ›ní analýzy rozvržení stránky…" #: ../gtk/src/FileDialogs.cc:237 msgid "" "A file named \"%1\" already exists. Are you sure you want to overwrite it?" msgstr "Soubor s názvem „%1“ už existuje. Opravdu má být pÅ™epsán?" #: ../gtk/src/FileDialogs.cc:239 msgid "Overwrite File?" msgstr "PÅ™epsat soubor?" #: ../gtk/src/MainWindow.cc:125 ../qt/src/MainWindow.cc:274 msgid "Using tesseract" msgstr "S použitím engine tesseract" #: ../gtk/src/MainWindow.cc:191 ../qt/src/MainWindow.cc:181 msgid "Select an image to begin..." msgstr "ZaÄnÄ›te výbÄ›rem obrázku…" #: ../gtk/src/MainWindow.cc:306 ../qt/src/MainWindow.cc:262 msgid "Multiple sources" msgstr "Vícero zdrojů…" #: ../gtk/src/MainWindow.cc:307 ../qt/src/MainWindow.cc:263 msgid "Ready" msgstr "PÅ™ipraven" #: ../gtk/src/MainWindow.cc:446 ../qt/src/MainWindow.cc:390 msgid "New version" msgstr "Nová verze" #: ../gtk/src/MainWindow.cc:446 ../qt/src/MainWindow.cc:390 msgid "gImageReader %1 is available" msgstr "je k dispozici gImageReader %1" #: ../gtk/src/MainWindow.cc:447 ../qt/src/MainWindow.cc:391 msgid "Download" msgstr "Stáhnout" #: ../gtk/src/MainWindow.cc:448 ../qt/src/MainWindow.cc:392 msgid "Changelog" msgstr "Seznam zmÄ›n" #: ../gtk/src/MainWindow.cc:449 ../qt/src/MainWindow.cc:393 msgid "Don't notify again" msgstr "PříštÄ› už neoznamovat" #: ../gtk/src/MainWindow.cc:468 ../qt/src/MainWindow.cc:438 msgid "Don't show again" msgstr "PříštÄ› už nezobrazovat" #: ../gtk/src/MainWindow.cc:469 ../gtk/src/MainWindow.cc:482 #: ../qt/src/MainWindow.cc:439 msgid "Install" msgstr "Instalovat" #: ../gtk/src/MainWindow.cc:489 ../qt/src/MainWindow.cc:451 msgid "Spelling dictionary missing" msgstr "Chybí slovník pro kontrolu pÅ™eklepů" #: ../gtk/src/MainWindow.cc:489 ../qt/src/MainWindow.cc:451 msgid "The spellcheck dictionary for %1 is not installed" msgstr "Není nainstalovaný slovník pro kontrolu pÅ™eklepů pro %1" #: ../gtk/src/MainWindow.cc:496 ../gtk/src/MainWindow.cc:528 #: ../qt/src/MainWindow.cc:458 msgid "Installing spelling dictionary for '%1'" msgstr "Instalace slovníku pro kontrolu pÅ™eklepů pro „%1“…" #: ../gtk/src/MainWindow.cc:517 ../gtk/src/MainWindow.cc:542 #: ../gtk/src/MainWindow.cc:550 ../gtk/src/MainWindow.cc:560 #: ../gtk/src/MainWindow.cc:566 ../gtk/src/MainWindow.cc:595 #: ../gtk/src/OutputEditorHOCR.cc:1375 ../gtk/src/Recognizer.cc:163 #: ../gtk/src/TessdataManager.cc:58 ../gtk/src/TessdataManager.cc:68 #: ../gtk/src/TessdataManager.cc:290 ../qt/src/MainWindow.cc:477 #: ../qt/src/MainWindow.cc:490 ../qt/src/MainWindow.cc:500 #: ../qt/src/MainWindow.cc:510 ../qt/src/MainWindow.cc:518 #: ../qt/src/MainWindow.cc:546 ../qt/src/OutputEditorHOCR.cc:1157 #: ../qt/src/Recognizer.cc:138 ../qt/src/TessdataManager.cc:72 #: ../qt/src/TessdataManager.cc:82 ../qt/src/TessdataManager.cc:275 msgid "Error" msgstr "Chyba" #: ../gtk/src/MainWindow.cc:517 ../qt/src/MainWindow.cc:477 msgid "Failed to install spelling dictionary: %1" msgstr "Instalace slovníku pro kontrolu pÅ™eklepů se nezdaÅ™ila: %1" #: ../gtk/src/MainWindow.cc:542 ../qt/src/MainWindow.cc:490 msgid "Failed to create directory for spelling dictionaries." msgstr "VytvoÅ™ení složky pro slovníky pro kontrolu pÅ™eklepů se nezdaÅ™ilo." #: ../gtk/src/MainWindow.cc:550 ../gtk/src/MainWindow.cc:566 #: ../qt/src/MainWindow.cc:500 msgid "Could not read %1: %2." msgstr "Nedaří se Äíst %1: %2." #: ../gtk/src/MainWindow.cc:560 ../gtk/src/MainWindow.cc:595 #: ../qt/src/MainWindow.cc:510 ../qt/src/MainWindow.cc:546 msgid "No spelling dictionaries found for '%1'." msgstr "Pro „%1“ nebyly nalezeny žádné slovníky pro kontrolu pÅ™eklepů." #: ../gtk/src/MainWindow.cc:576 ../qt/src/MainWindow.cc:529 msgid "Downloading '%1'..." msgstr "Stahování „%1“…" #: ../gtk/src/MainWindow.cc:592 ../qt/src/MainWindow.cc:543 msgid "Dictionaries installed" msgstr "Slovníky byly nainstalovány" #: ../gtk/src/MainWindow.cc:592 msgid "The following dictionaries were installed:%1" msgstr "Byly nainstalovány tyto slovníky:%1" #: ../gtk/src/OutputEditorHOCR.cc:319 ../qt/src/OutputEditorHOCR.cc:291 msgid "Document" msgstr "Dokument" #: ../gtk/src/OutputEditorHOCR.cc:368 ../qt/src/OutputEditorHOCR.cc:279 msgid "Monochrome" msgstr "Monochromatické" #: ../gtk/src/OutputEditorHOCR.cc:377 ../qt/src/OutputEditorHOCR.cc:281 msgid "Threshold (closest color)" msgstr "Práh (nejbližší barva)" #: ../gtk/src/OutputEditorHOCR.cc:380 ../qt/src/OutputEditorHOCR.cc:282 msgid "Diffuse" msgstr "Rozptýlit" #: ../gtk/src/OutputEditorHOCR.cc:389 ../qt/src/OutputEditorHOCR.cc:283 msgid "Zip (lossless)" msgstr "Zip (bezztrátové)" #: ../gtk/src/OutputEditorHOCR.cc:393 ../qt/src/OutputEditorHOCR.cc:284 msgid "CCITT Group 4 (lossless)" msgstr "CCITT Group 4 (bezztrátové)" #: ../gtk/src/OutputEditorHOCR.cc:397 ../qt/src/OutputEditorHOCR.cc:285 msgid "Jpeg (lossy)" msgstr "Jpeg (ztrátové)" #: ../gtk/src/OutputEditorHOCR.cc:553 ../qt/src/OutputEditorHOCR.cc:429 msgid "" "The following pages could not be processed:\n" "%1" msgstr "" "Uvedené stránky nebylo možné zpracovat:\n" "%1" #: ../gtk/src/OutputEditorHOCR.cc:554 ../qt/src/OutputEditorHOCR.cc:430 msgid "Recognition errors" msgstr "Chyby rozpoznávání" #. Add tree item #: ../gtk/src/OutputEditorHOCR.cc:647 ../gtk/src/OutputEditorHOCR.cc:1037 #: ../qt/src/OutputEditorHOCR.cc:504 ../qt/src/OutputEditorHOCR.cc:894 msgid "Graphic" msgstr "Grafika" #: ../gtk/src/OutputEditorHOCR.cc:703 ../qt/src/OutputEditorHOCR.cc:563 msgid "Paragraph" msgstr "Odstavec" #: ../gtk/src/OutputEditorHOCR.cc:706 ../qt/src/OutputEditorHOCR.cc:566 msgid "Textline" msgstr "Textový řádek" #: ../gtk/src/OutputEditorHOCR.cc:1136 ../qt/src/OutputEditorHOCR.cc:950 msgid "Merge" msgstr "SlouÄit" #: ../gtk/src/OutputEditorHOCR.cc:1161 ../qt/src/OutputEditorHOCR.cc:977 msgid "Add graphic region" msgstr "PÅ™idat oblast s grafikou" #: ../gtk/src/OutputEditorHOCR.cc:1177 ../qt/src/OutputEditorHOCR.cc:985 msgid "No suggestions" msgstr "Žádná doporuÄení" #: ../gtk/src/OutputEditorHOCR.cc:1183 ../qt/src/OutputEditorHOCR.cc:989 msgid "Add to dictionary" msgstr "PÅ™idat do slovníku" #: ../gtk/src/OutputEditorHOCR.cc:1189 ../qt/src/OutputEditorHOCR.cc:990 msgid "Ignore word" msgstr "Ignorovat slovo" #: ../gtk/src/OutputEditorHOCR.cc:1222 ../qt/src/OutputEditorHOCR.cc:1007 msgid "Expand all" msgstr "Rozbalit" #: ../gtk/src/OutputEditorHOCR.cc:1225 ../qt/src/OutputEditorHOCR.cc:1008 msgid "Collapse all" msgstr "Sbalit" #: ../gtk/src/OutputEditorHOCR.cc:1248 ../gtk/src/OutputEditorHOCR.cc:1287 #: ../qt/src/OutputEditorHOCR.cc:1049 ../qt/src/OutputEditorHOCR.cc:1079 msgid "hOCR HTML Files" msgstr "HTML soubory ve formátu hOCR" #: ../gtk/src/OutputEditorHOCR.cc:1249 ../qt/src/OutputEditorHOCR.cc:1049 msgid "Open hOCR File" msgstr "Otevřít soubor ve formátu hOCR" #: ../gtk/src/OutputEditorHOCR.cc:1258 ../qt/src/OutputEditorHOCR.cc:1055 msgid "Failed to open file" msgstr "NepodaÅ™ilo se otevřít soubor" #: ../gtk/src/OutputEditorHOCR.cc:1258 ../qt/src/OutputEditorHOCR.cc:1055 msgid "The file could not be opened: %1." msgstr "Soubor se nepodaÅ™ilo otevřít: %1" #: ../gtk/src/OutputEditorHOCR.cc:1267 ../qt/src/OutputEditorHOCR.cc:1062 msgid "Invalid hOCR file" msgstr "Neplatný soubor pro formát hOCR" #: ../gtk/src/OutputEditorHOCR.cc:1267 ../qt/src/OutputEditorHOCR.cc:1062 msgid "The file does not appear to contain valid hOCR HTML: %1" msgstr "Soubor neobsahuje platnou HTML podobu formátu HOCR: %1" #: ../gtk/src/OutputEditorHOCR.cc:1283 ../gtk/src/OutputEditorHOCR.cc:1343 #: ../gtk/src/OutputEditorText.cc:306 ../qt/src/OutputEditorHOCR.cc:1077 #: ../qt/src/OutputEditorHOCR.cc:1131 ../qt/src/OutputEditorText.cc:246 msgid "output" msgstr "výstup" #: ../gtk/src/OutputEditorHOCR.cc:1288 ../qt/src/OutputEditorHOCR.cc:1079 msgid "Save hOCR Output..." msgstr "Uložit výstup do formátu hOCR…" #: ../gtk/src/OutputEditorHOCR.cc:1296 ../gtk/src/OutputEditorHOCR.cc:1357 #: ../gtk/src/OutputEditorText.cc:319 ../qt/src/OutputEditorHOCR.cc:1087 #: ../qt/src/OutputEditorHOCR.cc:1143 ../qt/src/OutputEditorText.cc:256 msgid "Failed to save output" msgstr "Uložení výstupu se nezdaÅ™ilo" #: ../gtk/src/OutputEditorHOCR.cc:1296 ../gtk/src/OutputEditorHOCR.cc:1357 #: ../gtk/src/OutputEditorText.cc:319 ../qt/src/OutputEditorHOCR.cc:1087 #: ../qt/src/OutputEditorHOCR.cc:1143 ../qt/src/OutputEditorText.cc:256 msgid "Check that you have writing permissions in the selected folder." msgstr "Zkontrolujte své oprávnÄ›ní zapisovat do zvolené složky." #: ../gtk/src/OutputEditorHOCR.cc:1346 ../qt/src/OutputEditorHOCR.cc:1133 msgid "PDF Files" msgstr "PDF soubory" #: ../gtk/src/OutputEditorHOCR.cc:1347 ../qt/src/OutputEditorHOCR.cc:1133 msgid "Save PDF Output..." msgstr "Uložit výstup do formátu PDF…" #: ../gtk/src/OutputEditorHOCR.cc:1375 ../qt/src/OutputEditorHOCR.cc:1157 msgid "The PDF library does not support the selected font." msgstr "(softwarová) knihovna funkcí pro PDF nepodporuje zvolené písmo." #: ../gtk/src/OutputEditorHOCR.cc:1435 ../qt/src/OutputEditorHOCR.cc:1216 msgid "Errors occurred" msgstr "Vyskytly se chyby" #: ../gtk/src/OutputEditorHOCR.cc:1435 ../qt/src/OutputEditorHOCR.cc:1216 msgid "" "The following pages could not be rendered:\n" "%1" msgstr "" "Tyto stránky se nepodaÅ™ilo vykreslit:\n" "%1" #: ../gtk/src/OutputEditorHOCR.cc:1562 ../gtk/src/OutputEditorText.cc:333 #: ../qt/src/OutputEditorHOCR.cc:1331 ../qt/src/OutputEditorText.cc:269 msgid "Output not saved" msgstr "Výstup nebyl uložen" #: ../gtk/src/OutputEditorHOCR.cc:1562 ../gtk/src/OutputEditorText.cc:333 #: ../qt/src/OutputEditorHOCR.cc:1331 ../qt/src/OutputEditorText.cc:269 msgid "Save output before proceeding?" msgstr "PÅ™ed pokraÄováním – uložit výstup?" #: ../gtk/src/OutputEditorText.cc:197 ../qt/src/OutputEditorText.cc:158 msgid "Stripping line breaks..." msgstr "Odebírání konců řádků…" #: ../gtk/src/OutputEditorText.cc:211 msgid "Check spelling" msgstr "Zkontrolovat text na pÅ™eklepy" #: ../gtk/src/OutputEditorText.cc:238 ../qt/src/OutputEditorText.cc:178 msgid "Replacing..." msgstr "Nahrazování…" #: ../gtk/src/OutputEditorText.cc:264 ../qt/src/OutputEditorText.cc:204 #, fuzzy msgid "File: %1" msgstr "soubory" #: ../gtk/src/OutputEditorText.cc:267 ../qt/src/OutputEditorText.cc:207 #, fuzzy msgid "Page: %1" msgstr "Chyba zpracování: %1" #: ../gtk/src/OutputEditorText.cc:280 ../gtk/src/Recognizer.cc:481 #: ../qt/src/Recognizer.cc:460 msgid "" "\n" "[Failed to recognize page %1]\n" msgstr "" "\n" "[Rozpoznávání na stránce %1 se nezdaÅ™ilo]\n" #: ../gtk/src/OutputEditorText.cc:310 ../qt/src/OutputEditorText.cc:248 msgid "Text Files" msgstr "Textové soubory" #: ../gtk/src/OutputEditorText.cc:311 ../qt/src/OutputEditorText.cc:248 msgid "Save Output..." msgstr "Uložit výstup…" #: ../gtk/src/Recognizer.cc:156 ../qt/src/Recognizer.cc:131 msgid "" "Tesseract crashed with the following message:\n" "\n" "%1\n" "\n" "This typically happens for one of the following reasons:\n" "- Outdated traineddata files are used.\n" "- Auxiliary language data files are missing.\n" "- Corrupt language data files.\n" "\n" "Make sure your language data files are valid and compatible with tesseract " "%2." msgstr "" "Aplikace Tesseract byla neoÄekávanÄ› ukonÄena s následujícím hlášením:\n" "\n" "%1\n" "\n" "Toto se typicky dÄ›je z jednoho z tÄ›chto důvodů:\n" "- Použití zastaralých dat uživatelských slovníků.\n" "- ChybÄ›jící pomocná jazyková data.\n" "- PoÅ¡kozené soubory s jazykovými daty.\n" "\n" "Ověřte, že soubory s jazykovými daty jsou platné a kompatibilní s tesseract " "%2." #: ../gtk/src/Recognizer.cc:212 ../qt/src/Recognizer.cc:191 msgid "No languages available" msgstr "Nejsou k dispozici žádná jazyková data" #: ../gtk/src/Recognizer.cc:212 ../qt/src/Recognizer.cc:191 msgid "" "No tesseract languages are available for use. Recognition will not work." msgstr "" "Nejsou k dispozici žádná jazyková data pro engine tesseract. Rozpoznávání " "proto nebude fungovat." #: ../gtk/src/Recognizer.cc:266 ../qt/src/Recognizer.cc:251 msgid "Multilingual" msgstr "VícejazyÄné" #: ../gtk/src/Recognizer.cc:318 ../qt/src/Recognizer.cc:295 msgid "Automatic page segmentation" msgstr "Automatické rozdÄ›lení stránky na prvky" #: ../gtk/src/Recognizer.cc:319 ../qt/src/Recognizer.cc:296 msgid "Page segmentation with orientation and script detection" msgstr "RozdÄ›lení stránky se zjiÅ¡tÄ›ním orientace a písma" #: ../gtk/src/Recognizer.cc:320 ../qt/src/Recognizer.cc:297 msgid "Assume single column of text" msgstr "PÅ™edpokládat jeden sloupec textu" #: ../gtk/src/Recognizer.cc:321 ../qt/src/Recognizer.cc:298 msgid "Assume single block of vertically aligned text" msgstr "PÅ™edpokládat jediný blok svisle zarovnaného textu" #: ../gtk/src/Recognizer.cc:322 ../qt/src/Recognizer.cc:299 msgid "Assume a single uniform block of text" msgstr "PÅ™edpokládat jediný jednolitý blok textu" #: ../gtk/src/Recognizer.cc:323 ../qt/src/Recognizer.cc:300 msgid "Assume a line of text" msgstr "PÅ™edpokládat řádek textu" #: ../gtk/src/Recognizer.cc:324 ../qt/src/Recognizer.cc:301 msgid "Assume a single word" msgstr "PÅ™edpokládat jediné slovo" #: ../gtk/src/Recognizer.cc:325 ../qt/src/Recognizer.cc:302 msgid "Assume a single word in a circle" msgstr "PÅ™edpokládat jediné slovo v kruhu" #: ../gtk/src/Recognizer.cc:326 ../qt/src/Recognizer.cc:303 msgid "Sparse text in no particular order" msgstr "Rozptýlený text bez konkrétního zarovnání" #: ../gtk/src/Recognizer.cc:327 ../qt/src/Recognizer.cc:304 msgid "Sparse text with orientation and script detection" msgstr "Rozptýlený text se zjišťováním orientace a písma" #: ../gtk/src/Recognizer.cc:341 ../qt/src/Recognizer.cc:314 msgid "Page segmentation mode" msgstr "Režim rozdÄ›lování stránky na prvky" #: ../gtk/src/Recognizer.cc:347 ../qt/src/Recognizer.cc:321 msgid "Manage languages..." msgstr "Spravovat jazyková data…" #: ../gtk/src/Recognizer.cc:403 ../qt/src/Recognizer.cc:381 msgid "Current selection" msgstr "Stávající výbÄ›r" #: ../gtk/src/Recognizer.cc:475 ../qt/src/Recognizer.cc:454 msgid "Recognizing page %1 (%2 of %3)" msgstr "Rozpoznávání strany %1 (%2 ze %3)…" #: ../gtk/src/Recognizer.cc:480 ../qt/src/Recognizer.cc:459 msgid "" "\n" "- Page %1: failed to render page" msgstr "" "\n" "- Strana %1: vykreslení stránky se nezdaÅ™ilo" #: ../gtk/src/Recognizer.cc:510 ../gtk/src/Recognizer.cc:539 #: ../gtk/src/Recognizer.cc:552 ../qt/src/Recognizer.cc:488 #: ../qt/src/Recognizer.cc:517 ../qt/src/Recognizer.cc:530 msgid "Recognizing..." msgstr "Rozpoznávání…" #: ../gtk/src/Recognizer.cc:514 ../gtk/src/Recognizer.cc:522 #: ../qt/src/Recognizer.cc:492 ../qt/src/Recognizer.cc:500 msgid "Recognition errors occurred" msgstr "PÅ™i rozpoznávání se vyskytly chyby" #: ../gtk/src/Recognizer.cc:514 ../qt/src/Recognizer.cc:492 msgid "The following errors occurred:%1" msgstr "DoÅ¡lo k tÄ›mto chybám:%1" #: ../gtk/src/Recognizer.cc:522 ../qt/src/Recognizer.cc:500 msgid "Failed to initialize tesseract" msgstr "NepodaÅ™ilo se inicializovat engine Tesseract" #: ../gtk/src/scanner/ScannerSane.cc:83 ../gtk/src/scanner/ScannerTwain.cc:287 #: ../qt/src/scanner/ScannerSane.cc:85 ../qt/src/scanner/ScannerTwain.cc:285 msgid "Scan canceled" msgstr "Skenování bylo zruÅ¡eno" #: ../gtk/src/scanner/ScannerSane.cc:157 ../gtk/src/scanner/ScannerTwain.cc:186 #: ../qt/src/scanner/ScannerSane.cc:158 ../qt/src/scanner/ScannerTwain.cc:178 msgid "No scanner specified" msgstr "Nebyl urÄen žádný skener" #: ../gtk/src/scanner/ScannerSane.cc:166 ../gtk/src/scanner/ScannerTwain.cc:195 #: ../qt/src/scanner/ScannerSane.cc:167 ../qt/src/scanner/ScannerTwain.cc:187 msgid "Unable to connect to scanner" msgstr "Nedaří se spojit se skenerem" #: ../gtk/src/scanner/ScannerSane.cc:386 ../gtk/src/scanner/ScannerTwain.cc:265 #: ../gtk/src/scanner/ScannerTwain.cc:291 ../qt/src/scanner/ScannerSane.cc:387 #: ../qt/src/scanner/ScannerTwain.cc:257 ../qt/src/scanner/ScannerTwain.cc:289 msgid "Unable to start scan" msgstr "Nedaří se zahájit skenování" #: ../gtk/src/scanner/ScannerSane.cc:394 ../gtk/src/scanner/ScannerSane.cc:437 #: ../gtk/src/scanner/ScannerTwain.cc:317 ../qt/src/scanner/ScannerSane.cc:395 #: ../qt/src/scanner/ScannerSane.cc:438 ../qt/src/scanner/ScannerTwain.cc:315 msgid "Error communicating with scanner" msgstr "Chyba komunikace se skenerem" #: ../gtk/src/scanner/ScannerSane.cc:498 ../qt/src/scanner/ScannerSane.cc:494 msgid "Failed to save image" msgstr "Obrázek se nepodaÅ™ilo uložit" #: ../gtk/src/SourceManager.cc:118 ../qt/src/SourceManager.cc:112 msgid "Unable to open files" msgstr "Soubory se nedaří otevřít" #: ../gtk/src/SourceManager.cc:118 ../qt/src/SourceManager.cc:112 msgid "The following files could not be opened:%1" msgstr "Tyto soubory se nepodaÅ™ilo otevřít:%1" #: ../gtk/src/SourceManager.cc:134 ../qt/src/SourceManager.cc:154 msgid "Images and PDFs" msgstr "Obrázky a PDF soubory" #: ../gtk/src/SourceManager.cc:137 ../qt/src/SourceManager.cc:155 msgid "Select Files" msgstr "Vyberte soubory" #: ../gtk/src/SourceManager.cc:143 ../qt/src/SourceManager.cc:166 msgid "Clipboard Error" msgstr "Chyba schránky" #: ../gtk/src/SourceManager.cc:143 ../qt/src/SourceManager.cc:166 msgid "Failed to read the clipboard." msgstr "Obsah schránky se nepodaÅ™ilo naÄíst." #: ../gtk/src/SourceManager.cc:147 ../qt/src/SourceManager.cc:170 #: ../qt/src/SourceManager.cc:176 msgid "Pasted %1" msgstr "Vloženo %1" #: ../gtk/src/SourceManager.cc:159 ../qt/src/SourceManager.cc:183 msgid "Screenshot Error" msgstr "Chyba pÅ™i poÅ™izování snímku obrazovky" #: ../gtk/src/SourceManager.cc:159 ../qt/src/SourceManager.cc:183 msgid "Failed to take screenshot." msgstr "NepodaÅ™ilo se pořídit snímek obrazkovky." #: ../gtk/src/SourceManager.cc:163 ../qt/src/SourceManager.cc:187 msgid "Screenshot %1" msgstr "Snímek obrazovky %1" #: ../gtk/src/SourceManager.cc:168 ../qt/src/SourceManager.cc:192 msgid "Saving image..." msgstr "Ukládání obrázku…" #: ../gtk/src/SourceManager.cc:175 ../qt/src/SourceManager.cc:205 msgid "Cannot Write File" msgstr "Do souboru se nedaří zapsat" #: ../gtk/src/SourceManager.cc:175 ../qt/src/SourceManager.cc:205 msgid "Could not write to %1." msgstr "Do umístÄ›ní %1 se nedaří zapisovat." #: ../gtk/src/SourceManager.cc:202 ../qt/src/SourceManager.cc:227 msgid "Delete File?" msgstr "Smazat soubor?" #: ../gtk/src/SourceManager.cc:202 ../qt/src/SourceManager.cc:227 msgid "The following files will be deleted:%1" msgstr "Tyto soubory budou smazány:%1" #: ../gtk/src/SourceManager.cc:266 ../qt/src/SourceManager.cc:278 msgid "Missing File" msgstr "ChybÄ›jící soubor" #: ../gtk/src/SourceManager.cc:266 ../qt/src/SourceManager.cc:278 msgid "" "The following file has been deleted or moved:\n" "%1" msgstr "" "Tento soubor byl smazán Äi pÅ™esunut:\n" "%1" #: ../gtk/src/SubstitutionsManager.cc:39 ../qt/src/SubstitutionsManager.cc:77 msgid "Search for" msgstr "Hledat výskyt:" #: ../gtk/src/SubstitutionsManager.cc:40 ../qt/src/SubstitutionsManager.cc:77 msgid "Replace with" msgstr "Čím nahradit:" #: ../gtk/src/SubstitutionsManager.cc:62 ../qt/src/SubstitutionsManager.cc:99 msgid "substitution_list.txt" msgstr "seznam_dosazovani.txt" #: ../gtk/src/SubstitutionsManager.cc:84 ../gtk/src/SubstitutionsManager.cc:119 #: ../qt/src/SubstitutionsManager.cc:114 ../qt/src/SubstitutionsManager.cc:152 msgid "Substitutions List" msgstr "Seznam dosazování" #: ../gtk/src/SubstitutionsManager.cc:85 ../qt/src/SubstitutionsManager.cc:114 msgid "Open Substitutions List" msgstr "Otevřít seznam dosazování" #: ../gtk/src/SubstitutionsManager.cc:90 ../qt/src/SubstitutionsManager.cc:119 msgid "Error Reading File" msgstr "Chyba pÅ™i naÄítání souboru" #: ../gtk/src/SubstitutionsManager.cc:90 ../qt/src/SubstitutionsManager.cc:119 msgid "Unable to read '%1'." msgstr "Z „%1“ se nedaří Äíst." #: ../gtk/src/SubstitutionsManager.cc:113 ../qt/src/SubstitutionsManager.cc:146 msgid "Errors Occurred Reading File" msgstr "PÅ™i naÄítání souboru se vyskytly chyby" #: ../gtk/src/SubstitutionsManager.cc:113 ../qt/src/SubstitutionsManager.cc:146 msgid "Some entries of the substitutions list could not be read." msgstr "NÄ›které položky seznamu dosazování se nepodaÅ™ilo naÄíst." #: ../gtk/src/SubstitutionsManager.cc:120 ../qt/src/SubstitutionsManager.cc:152 msgid "Save Substitutions List" msgstr "Uložit seznam dosazování" #: ../gtk/src/SubstitutionsManager.cc:126 ../qt/src/SubstitutionsManager.cc:158 msgid "Error Saving File" msgstr "Chyba pÅ™i ukládání do souboru" #: ../gtk/src/SubstitutionsManager.cc:126 ../qt/src/SubstitutionsManager.cc:158 msgid "Unable to write to '%1'." msgstr "Do „%1“ se nedaří zapisovat." #: ../gtk/src/SubstitutionsManager.cc:144 ../qt/src/SubstitutionsManager.cc:172 msgid "Save List?" msgstr "Uložit seznam?" #: ../gtk/src/SubstitutionsManager.cc:144 ../qt/src/SubstitutionsManager.cc:172 msgid "Do you want to save the current list?" msgstr "Chcete stávající seznam uložit?" #: ../gtk/src/SubstitutionsManager.cc:179 ../qt/src/SubstitutionsManager.cc:208 msgid "Applying substitutions..." msgstr "ProvádÄ›ní dosazení…" #: ../gtk/src/TessdataManager.cc:58 ../qt/src/TessdataManager.cc:72 msgid "" "PackageKit is required for managing system-wide tesseract language packs, " "but it was not found. Please use the system package management software to " "manage the tesseract language packs, or switch to use the user tessdata path " "in the configuration dialog." msgstr "" "Pro správu balíÄků jazykových dat pro engine tesseract, spoleÄných pro " "vÅ¡chny uživatele, je tÅ™eba nástroje PackageKit, který se ale na tomto " "systému nenachází. Namísto toho proto použijte nástroj pro správu balíÄků " "vaÅ¡eho systému a jeho prostÅ™ednictvím spravujte jazykové balíÄky engine " "tesseract. PřípadnÄ› náhradnÄ› v nastavovacím dialogu pÅ™epnÄ›te na používání " "umístÄ›ní pro jednotlivého uživatele." #: ../gtk/src/TessdataManager.cc:63 ../qt/src/TessdataManager.cc:77 msgid "Fetching available languages" msgstr "Zjišťování dostupných jazykových dat" #: ../gtk/src/TessdataManager.cc:68 ../gtk/src/TessdataManager.cc:89 #: ../gtk/src/TessdataManager.cc:121 ../qt/src/TessdataManager.cc:82 #: ../qt/src/TessdataManager.cc:94 ../qt/src/TessdataManager.cc:127 msgid "Failed to fetch list of available languages: %1" msgstr "NepodaÅ™ilo se získat seznam dostupných jazykových dat: %1" #: ../gtk/src/TessdataManager.cc:100 ../gtk/src/TessdataManager.cc:129 #: ../qt/src/TessdataManager.cc:105 ../qt/src/TessdataManager.cc:114 #: ../qt/src/TessdataManager.cc:136 ../qt/src/TessdataManager.cc:147 msgid "Parsing error: %1" msgstr "Chyba zpracování: %1" #: ../gtk/src/TessdataManager.cc:191 ../qt/src/TessdataManager.cc:191 msgid "Applying changes..." msgstr "Promítnutí zmÄ›n…" #: ../gtk/src/TessdataManager.cc:252 ../qt/src/TessdataManager.cc:237 msgid "Failed to create directory for tessdata files." msgstr "NepodaÅ™ilo se vytvoÅ™it složku pro datové soubory tesseract" #: ../gtk/src/TessdataManager.cc:261 ../qt/src/TessdataManager.cc:245 msgid "Downloading %1..." msgstr "Stahování %1…" #: ../gtk/src/TessdataManager.cc:281 ../qt/src/TessdataManager.cc:267 msgid "" "The following files could not be downloaded or removed:\n" "%1\n" "\n" "Check the connectivity and directory permissions." msgstr "" "Tyto soubory se nepodaÅ™ilo stáhnout na Äi odebrat z poÄítaÄe:\n" "%1\n" "\n" "Zkontrolujte své pÅ™ipojení k Internetu a přístupová práva na přísluÅ¡ené " "složce." #: ../gtk/src/Utils.cc:62 msgid "Yes" msgstr "Ano" #: ../gtk/src/Utils.cc:65 msgid "No" msgstr "Ne" #: ../gtk/src/Utils.cc:74 msgid "Discard" msgstr "Zahodit" #: ../qt/data/AboutDialog.ui.h:1 msgid "About gImageReader" msgstr "O aplikaci gImageReader" #: ../qt/data/AboutDialog.ui.h:3 #, fuzzy msgid "" "

 

A graphical frontend to tesseract-ocr

Website

 

" msgstr "" "

 

Grafická nadstavba pro engine tesseract-" "ocr

Webové " "stránky projektu

 

" #: ../qt/data/AboutDialog.ui.h:4 msgid "Credits" msgstr "Zásluhy" #: ../qt/data/AboutDialog.ui.h:5 msgid "License" msgstr "Licence" #: ../qt/data/ConfigDialog.ui.h:14 msgid "System encoding" msgstr "Znaková sada systému" #: ../qt/data/ConfigDialog.ui.h:15 msgid "UTF-8" msgstr "UTF-8" #: ../qt/data/ConfigDialog.ui.h:19 msgid "Text file encoding:" msgstr "Znaková sada textového souboru:" #: ../qt/data/CrashHandler.ui.h:2 #, no-c-format msgid "" "

The application has " "crashed

Apologies for the inconvenience. To help improve the " "application, please consider reporting the issue to manisandro@gmail.com. Please try to describe what you were doing before the application " "crashed. Also, include the information below. Thank you.

" msgstr "" "

Došlo k pádu " "aplikace

Velmi se omlouváme za vzniklé potíže. Prosíme pomozte " "s odstranÄ›ním příÄiny tohoto problému nahlášením na e-mail manisandro@gmail.com. Ve zprávÄ› se pokuste popsat svou Äinnost pÅ™ed pádem aplikace. Též " "pÅ™iložte níže uvedené informace. DÄ›kujeme.

" #: ../qt/data/MainWindow.ui.h:1 msgid "gImageReader" msgstr "gImageReader" #. Remove & from some labels which designer insists in adding #: ../qt/data/MainWindow.ui.h:17 ../qt/src/Ui_MainWindow.hh:49 msgid "Sources" msgstr "Zdroje" #: ../qt/data/MainWindow.ui.h:18 msgid "Zoom In" msgstr "PÅ™iblížit" #: ../qt/data/MainWindow.ui.h:20 msgid "Zoom Out" msgstr "Oddálit" #: ../qt/data/MainWindow.ui.h:22 msgid "Normal Size" msgstr "Původní velikost" #: ../qt/data/MainWindow.ui.h:24 msgid "Best Fit" msgstr "PÅ™izpůsobit oknu" #: ../qt/data/MainWindow.ui.h:26 msgid "Rotate Left" msgstr "OtoÄit vlevo" #: ../qt/data/MainWindow.ui.h:27 msgid "Rotate left" msgstr "OtoÄit vlevo" #: ../qt/data/MainWindow.ui.h:28 msgid "Rotate Right" msgstr "OtoÄit vpravo" #: ../qt/data/MainWindow.ui.h:29 msgid "Rotate right" msgstr "OtoÄit vpravo" #: ../qt/data/MainWindow.ui.h:30 msgid "Image Controls" msgstr "Ovládání parametrů obrázku" #: ../qt/data/MainWindow.ui.h:32 msgid "Autodetect Layout" msgstr "Automaticky zjistit rozvržení stránky" #: ../qt/data/MainWindow.ui.h:34 msgid "Toggle Output Pane" msgstr "Zobrazit Äi skrýt podokno s výstupem" #: ../qt/src/MainWindow.cc:518 msgid "Could not read %1: %2" msgstr "%1 se nedaří naÄíst: %2" #: ../qt/src/MainWindow.cc:543 msgid "The following dictionary files were installed:%1" msgstr "Byly nainstalovány tyto slovníkové soubory:%1" #: ../qt/src/Ui_MainWindow.hh:50 msgid "Output" msgstr "Výstup" #: ../qt/src/Ui_MainWindow.hh:133 msgid "OCR mode:" msgstr "Režim OCR:" #: ../qt/src/Ui_MainWindow.hh:204 msgid "Remove Image" msgstr "Odebrat obrázek" #: ../qt/src/Ui_MainWindow.hh:207 msgid "Delete Image" msgstr "Smazat obrázek" #: ../qt/src/Ui_MainWindow.hh:210 msgid "Clear List" msgstr "VyÄistit seznam" #. Output toolbar #: ../qt/src/Ui_OutputEditorHOCR.hh:39 ../qt/src/Ui_OutputEditorHOCR.hh:40 msgid "Open hOCR file" msgstr "Otevřít soubor formátu hOCR" #: ../qt/src/Ui_OutputEditorHOCR.hh:41 ../qt/src/Ui_OutputEditorHOCR.hh:42 msgid "Save as hOCR text" msgstr "Uložit jako text ve formátu hOCR" #: ../qt/src/Ui_OutputEditorText.hh:108 msgid "Strip Line Breaks" msgstr "Odebrat zalomení řádků" #: ../qt/src/Ui_OutputEditorText.hh:113 msgid "Find and Replace" msgstr "Najít a nahradit" #: ../qt/src/Ui_OutputEditorText.hh:122 msgid "Save Output" msgstr "Uložit výstup" #: ../qt/src/Ui_OutputEditorText.hh:124 msgid "Clear Output" msgstr "VyÄistit výstup" #~ msgid "" #~ "<html><head/><body><p><span style=" font-" #~ "weight:600;">The application has crashed</span></p>" #~ "<p>Apologies for the inconvenience. To help improve the " #~ "application, please consider reporting the issue to <a href="" #~ "mailto:manisandro@gmail.com?subject=gImageReader%20Crash">" #~ "manisandro@gmail.com</a>. Please try to describe what you were " #~ "doing before the application crashed. Also, include the information " #~ "below. Thank you.</p></body></html>" #~ msgstr "" #~ "<html><head/><body><p><span style=" font-" #~ "weight:600;">Aplikace byla neoÄekávanÄ› ukonÄena</span></" #~ "p><p>Omlouváme se za vzniklé nepohodlí. Chcete-li pomoci " #~ "aplikaci zlepÅ¡it nahlaste problém na <a href="mailto:" #~ "manisandro@gmail.com?subject=gImageReader%20Crash\">manisandro@gmail." #~ "com</a>. Zde se pokuste popsat svou Äinnost pÅ™ed pádem aplikace. " #~ "Též pÅ™iložte níže uvedené informace.Díky.</p></body></" #~ "html>" #~ msgid "" #~ "<small><b>Example:</b> 1-10, 13, 14-18</small>" #~ msgstr "" #~ "<small><b>Příklad:</b> 1-10, 13, 14-18</small>" #~ msgid "Detect script and orientation" #~ msgstr "Zjistit písmo a orientaci stránky" #~ msgid "" #~ "PackageKit is required for managing tesseract language packs, but it was " #~ "not found. Please use the system package management software to manage " #~ "the tesseract language packs." #~ msgstr "" #~ "Pro správu balíÄků jazykových dat pro engine tesseract, provádÄ›nou přímo " #~ "z gImageReader, je tÅ™eba nástroje PackageKit, který se ale na tomto " #~ "systému nenachází. NáhradnÄ› proto použijte nástroj pro správu balíÄků " #~ "vaÅ¡eho systému a jeho prostÅ™ednictvím spravujte jazykové balíÄky engine " #~ "tesseract." #~ msgid "Image format:" #~ msgstr "Formát obrázku" #~ msgid "4" #~ msgstr "4" #~ msgid "System-wide" #~ msgstr "Pro vÅ¡echny uživatele" #~ msgid "" #~ "\n" #~ "\tFailed to initialize tesseract" #~ msgstr "" #~ "\n" #~ "\tNepodaÅ™ilo se inicializovat engine tesseract" #~ msgid "To recognize specific areas, drag rectangles over them." #~ msgstr "Nad oblastmi, které mají být rozpoznány, natáhnÄ›te obdélníky." #~ msgid "So&urces" #~ msgstr "&Zdroje" #~ msgid "&Output" #~ msgstr "&Výstup:" #~ msgid "Rendering image..." #~ msgstr "Vykreslování obrázku…" #~ msgid "en_US" #~ msgstr "cs_CZ" #~ msgid "So&urces" #~ msgstr "Zdr&oje" #~ msgid "&Output" #~ msgstr "&Výstup" #~ msgid "Configuration" #~ msgstr "Nastavení" #~ msgid "Preceeded or succeeded by quote" #~ msgstr "PÅ™edchází Äi následují uvozovky" #~ msgid "Select sources" #~ msgstr "Vybrat zdroje" #~ msgid "Preceeded by dot" #~ msgstr "Následuje za teÄkou" #~ msgid "Pasting clipboard..." #~ msgstr "Vkládání ze schránky..." #~ msgid "Taking screenshot..." #~ msgstr "PoÅ™izování snímku obrazovky..." #~ msgid "Autolayout" #~ msgstr "Autorozvržení" #~ msgid "Options" #~ msgstr "Možnosti" #~ msgid "Manage list" #~ msgstr "Spravovat seznamy" #~ msgid "Replacement list" #~ msgstr "Seznam nahrazování" #~ msgid "Select sources..." #~ msgstr "Vybrat zdroje..." #~ msgid "replace_list.txt" #~ msgstr "seznam_nahrazovani.txt" #~ msgid "Open replacement list" #~ msgstr "Otevřít seznam nahrazování" #~ msgid "Save replacement list" #~ msgstr "Uložit seznam nahrazování" #~ msgid "Save the current list?" #~ msgstr "Uložit souÄasný seznam?" gImageReader-3.2.3/po/de.po000066400000000000000000001513311312567024200154070ustar00rootroot00000000000000# German translations for gImageReader package # German messages for gImageReader. # Copyright (C) 2010-2016 THE GIMAGEREADER'S COPYRIGHT HOLDER # This file is distributed under the same license as the gImageReader package. # # # 2016-11-09: Translation corrected :Heinrich Schwietering # # # Sandro Mani , 2010-2011, 2013, 2014, 2015, 2016, 2017. msgid "" msgstr "" "Project-Id-Version: \n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2017-07-01 10:34+0200\n" "PO-Revision-Date: 2017-07-01 10:36+0100\n" "Last-Translator: Sandro Mani \n" "Language-Team: German \n" "Language: de\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" "X-Generator: Lokalize 2.0\n" #: ../gtk/data/appmenu.ui.h:1 ../qt/src/Ui_MainWindow.hh:165 msgid "Redetect Languages" msgstr "Spracherkennung nochmals durchführen" #: ../gtk/data/appmenu.ui.h:2 ../gtk/data/gimagereader.ui.h:39 #: ../qt/data/ConfigDialog.ui.h:1 ../qt/src/Ui_MainWindow.hh:168 msgid "Preferences" msgstr "Einstellungen" #: ../gtk/data/appmenu.ui.h:3 ../gtk/data/gimagereader.ui.h:40 #: ../gtk/src/MainWindow.cc:484 ../qt/src/MainWindow.cc:445 #: ../qt/src/Ui_MainWindow.hh:173 msgid "Help" msgstr "Hilfe" #: ../gtk/data/appmenu.ui.h:4 ../qt/data/AboutDialog.ui.h:2 #: ../qt/src/Ui_MainWindow.hh:176 msgid "About" msgstr "Info" #: ../gtk/data/appmenu.ui.h:5 msgid "Quit" msgstr "Beenden" #: ../gtk/data/crashhandler.ui.h:1 ../qt/src/CrashHandler.cc:36 msgid "Regenerate backtrace" msgstr "Backtrace nochmals durchführen" #: ../gtk/data/crashhandler.ui.h:2 msgid "The application has crashed" msgstr "Die Anwendung ist abgestürzt" #: ../gtk/data/crashhandler.ui.h:4 #, no-c-format msgid "" "Apologies for the inconvenience. To help improve the application, please " "consider reporting the issue to manisandro@gmail.com. Please try to " "describe what you were doing before the application crashed. Also, include " "the information below. Thank you." msgstr "" "Bitte entschuldigen Sie die Unannehmlichkeiten. Wenn Sie helfen möchten, die " "Anwendung zu verbessern, melden Sie das aufgetretene Problem bitte an manisandro@gmail.com. Bitte beschreiben Sie auch, was Sie machten, " "bevor die Anwenung abgestürzte. Senden Sie zudem bitte auch die " "untenstehenden Informationen. Danke." #: ../gtk/data/editor_hocr.ui.h:1 ../qt/data/PdfExportDialog.ui.h:1 msgid "PDF Export" msgstr "PDF-Export" #: ../gtk/data/editor_hocr.ui.h:2 ../gtk/data/gimagereader.ui.h:55 #: ../gtk/src/Acquirer.cc:42 ../gtk/src/FileDialogs.cc:150 #: ../gtk/src/Utils.cc:68 ../qt/data/ConfigDialog.ui.h:27 #: ../qt/data/MainWindow.ui.h:14 msgid "Cancel" msgstr "Abbrechen" #: ../gtk/data/editor_hocr.ui.h:3 ../gtk/data/gimagereader.ui.h:41 #: ../gtk/src/FileDialogs.cc:151 ../gtk/src/Utils.cc:59 #: ../qt/data/ConfigDialog.ui.h:26 msgid "OK" msgstr "OK" #: ../gtk/data/editor_hocr.ui.h:4 ../qt/data/PdfExportDialog.ui.h:2 msgid "Output mode:" msgstr "Ausgabemodus:" #: ../gtk/data/editor_hocr.ui.h:5 ../qt/data/PdfExportDialog.ui.h:3 msgid "PDF" msgstr "PDF" #: ../gtk/data/editor_hocr.ui.h:6 ../qt/data/PdfExportDialog.ui.h:4 msgid "PDF with invisible text overlay" msgstr "PDF mit unsichtbarer Textlage" #: ../gtk/data/editor_hocr.ui.h:7 ../qt/data/PdfExportDialog.ui.h:16 msgid "Format:" msgstr "Format:" #: ../gtk/data/editor_hocr.ui.h:8 ../qt/data/PdfExportDialog.ui.h:17 msgid "Compression:" msgstr "Komprimierung:" #: ../gtk/data/editor_hocr.ui.h:9 ../qt/data/PdfExportDialog.ui.h:14 msgid "Compression quality:" msgstr "Komprimierungsqualität:" #: ../gtk/data/editor_hocr.ui.h:10 ../qt/data/PdfExportDialog.ui.h:15 msgid "DPI:" msgstr "DPI:" #: ../gtk/data/editor_hocr.ui.h:11 ../qt/data/PdfExportDialog.ui.h:18 msgid "Dithering algorithm:" msgstr "Dithering Algorithmus:" #: ../gtk/data/editor_hocr.ui.h:12 ../qt/data/PdfExportDialog.ui.h:13 msgid "Image settings:" msgstr "Bildeinstellungen:" #: ../gtk/data/editor_hocr.ui.h:13 ../qt/data/PdfExportDialog.ui.h:11 msgid "Document font:" msgstr "Schriftart:" #: ../gtk/data/editor_hocr.ui.h:14 ../qt/data/PdfExportDialog.ui.h:7 msgid "Uniformize line and word spacing" msgstr "Zeilen- und Wortabstände vereinheitlichen" #: ../gtk/data/editor_hocr.ui.h:15 ../qt/data/PdfExportDialog.ui.h:10 msgid "Use detected font sizes" msgstr "Automatisch erkannte Schriftgrößen verwenden" #: ../gtk/data/editor_hocr.ui.h:16 ../qt/data/PdfExportDialog.ui.h:8 msgid "Preserve spaces wider than:" msgstr "Bewahre Abstände breiter als:" #: ../gtk/data/editor_hocr.ui.h:17 ../qt/data/PdfExportDialog.ui.h:12 msgid "characters" msgstr "Zeichen" #: ../gtk/data/editor_hocr.ui.h:18 ../qt/data/PdfExportDialog.ui.h:9 msgid "Scale:" msgstr "Skalierung:" #: ../gtk/data/editor_hocr.ui.h:19 ../qt/data/PdfExportDialog.ui.h:6 msgid "Text settings:" msgstr "Texteinstellungen:" #: ../gtk/data/editor_hocr.ui.h:20 ../qt/data/PdfExportDialog.ui.h:5 msgid "Show preview" msgstr "Vorschau anzeigen" #: ../gtk/data/editor_hocr.ui.h:21 ../gtk/data/editor_text.ui.h:26 #: ../qt/src/Ui_OutputEditorText.hh:123 msgid "Save output" msgstr "Ausgabe speichern" #: ../gtk/data/editor_hocr.ui.h:22 ../qt/src/Ui_OutputEditorHOCR.hh:44 #: ../qt/src/Ui_OutputEditorHOCR.hh:45 msgid "Export to PDF" msgstr "Als PDF exportieren" #: ../gtk/data/editor_hocr.ui.h:23 ../gtk/data/editor_text.ui.h:27 #: ../qt/src/Ui_OutputEditorHOCR.hh:47 ../qt/src/Ui_OutputEditorHOCR.hh:48 #: ../qt/src/Ui_OutputEditorText.hh:125 msgid "Clear output" msgstr "Ausgabe löschen" #: ../gtk/data/editor_hocr.ui.h:24 ../qt/src/Ui_OutputEditorHOCR.hh:75 msgid "Properties" msgstr "Eigenschaften" #: ../gtk/data/editor_hocr.ui.h:25 ../qt/src/Ui_OutputEditorHOCR.hh:79 msgid "Source" msgstr "Quelle" #. Output insert mode #: ../gtk/data/editor_text.ui.h:1 ../qt/src/Ui_OutputEditorText.hh:59 msgid "Append to current text" msgstr "An aktuellen Text anhängen" #: ../gtk/data/editor_text.ui.h:2 ../qt/src/Ui_OutputEditorText.hh:60 msgid "Insert at cursor" msgstr "An Cursor-Stelle einfügen" #: ../gtk/data/editor_text.ui.h:3 ../qt/src/Ui_OutputEditorText.hh:61 msgid "Replace current text" msgstr "Aktuellen Text ersetzen" #: ../gtk/data/editor_text.ui.h:4 ../qt/src/SubstitutionsManager.cc:37 #: ../qt/src/Ui_OutputEditorText.hh:177 msgid "Substitutions" msgstr "Ersetzungen" #: ../gtk/data/editor_text.ui.h:5 ../qt/src/SubstitutionsManager.cc:42 #: ../qt/src/SubstitutionsManager.cc:43 msgid "Open" msgstr "Öffnen" #: ../gtk/data/editor_text.ui.h:6 ../gtk/src/Utils.cc:71 #: ../qt/src/SubstitutionsManager.cc:45 ../qt/src/SubstitutionsManager.cc:46 msgid "Save" msgstr "Speichern" #: ../gtk/data/editor_text.ui.h:7 ../qt/src/SubstitutionsManager.cc:48 #: ../qt/src/SubstitutionsManager.cc:49 msgid "Clear" msgstr "Liste leeren" #: ../gtk/data/editor_text.ui.h:8 ../qt/data/ConfigDialog.ui.h:16 #: ../qt/src/SubstitutionsManager.cc:51 ../qt/src/SubstitutionsManager.cc:52 msgid "Add" msgstr "Hinzufügen" #: ../gtk/data/editor_text.ui.h:9 ../gtk/src/OutputEditorHOCR.cc:1202 #: ../gtk/src/OutputEditorHOCR.cc:1213 ../qt/data/ConfigDialog.ui.h:17 #: ../qt/src/OutputEditorHOCR.cc:998 ../qt/src/OutputEditorHOCR.cc:1000 #: ../qt/src/SubstitutionsManager.cc:54 ../qt/src/SubstitutionsManager.cc:55 msgid "Remove" msgstr "Entfernen" #: ../gtk/data/editor_text.ui.h:10 ../gtk/data/gimagereader.ui.h:73 msgid "Apply" msgstr "Anwenden" #: ../gtk/data/editor_text.ui.h:11 ../gtk/data/gimagereader.ui.h:74 msgid "Close" msgstr "Schließen" #. Output postprocessing #: ../gtk/data/editor_text.ui.h:12 ../qt/src/Ui_OutputEditorText.hh:69 msgid "Keep line break if..." msgstr "Behalte Zeilenumbruch bei falls..." #: ../gtk/data/editor_text.ui.h:13 ../qt/src/Ui_OutputEditorText.hh:71 msgid "Preceded by end mark (.?!)" msgstr "ein Satzendzeichen (.?!) davor steht" #: ../gtk/data/editor_text.ui.h:14 ../qt/src/Ui_OutputEditorText.hh:73 msgid "Preceded or succeeded by quote" msgstr "ein Anführungszeichen davor oder dahinter steht" #: ../gtk/data/editor_text.ui.h:15 ../qt/src/Ui_OutputEditorText.hh:75 msgid "Other options" msgstr "Weitere Optionen" #: ../gtk/data/editor_text.ui.h:16 ../qt/src/Ui_OutputEditorText.hh:77 msgid "Join hyphenated words" msgstr "Wörter mit Bindestrich zusammenfügen" #: ../gtk/data/editor_text.ui.h:17 ../qt/src/Ui_OutputEditorText.hh:79 msgid "Collapse whitespace" msgstr "Leerstellen bereinigen" #: ../gtk/data/editor_text.ui.h:18 ../qt/src/Ui_OutputEditorText.hh:81 msgid "Preserve paragraphs" msgstr "Absätzen erhalten" #: ../gtk/data/editor_text.ui.h:19 ../qt/src/Ui_OutputEditorText.hh:83 msgid "Visual aids" msgstr "Visuelle Hilfen" #: ../gtk/data/editor_text.ui.h:20 ../qt/src/Ui_OutputEditorText.hh:85 msgid "Draw whitespace" msgstr "Leerstellen zeichnen" #: ../gtk/data/editor_text.ui.h:21 ../gtk/data/gimagereader.ui.h:31 #: ../qt/src/Ui_OutputEditorText.hh:102 msgid "Select insert mode" msgstr "Einfügemodus auswählen" #: ../gtk/data/editor_text.ui.h:22 ../qt/src/Ui_OutputEditorText.hh:109 msgid "Strip line breaks on selected text" msgstr "Zeilenumbrüche im markierten Text entfernen" #: ../gtk/data/editor_text.ui.h:23 ../qt/src/Ui_OutputEditorText.hh:114 msgid "Find and replace" msgstr "Suchen und ersetzen" #: ../gtk/data/editor_text.ui.h:24 ../qt/src/Ui_OutputEditorText.hh:116 #: ../qt/src/Ui_OutputEditorText.hh:117 msgid "Undo" msgstr "Rückgängig" #: ../gtk/data/editor_text.ui.h:25 ../qt/src/Ui_OutputEditorText.hh:119 #: ../qt/src/Ui_OutputEditorText.hh:120 msgid "Redo" msgstr "Wiederholen" #: ../gtk/data/editor_text.ui.h:28 ../qt/src/Ui_OutputEditorText.hh:149 msgid "Find" msgstr "Suche" #: ../gtk/data/editor_text.ui.h:29 ../qt/src/Ui_OutputEditorText.hh:153 #: ../qt/src/Ui_OutputEditorText.hh:168 msgid "Replace" msgstr "Ersetzen" #: ../gtk/data/editor_text.ui.h:30 ../qt/src/Ui_OutputEditorText.hh:173 msgid "Replace all" msgstr "Alle ersetzen" #: ../gtk/data/editor_text.ui.h:31 ../qt/src/Ui_OutputEditorText.hh:163 msgid "Find previous" msgstr "Rückwärts suchen" #: ../gtk/data/editor_text.ui.h:32 ../qt/src/Ui_OutputEditorText.hh:158 msgid "Find next" msgstr "Vorwärts suchen" #: ../gtk/data/editor_text.ui.h:33 ../qt/src/Ui_OutputEditorText.hh:182 msgid "Match case" msgstr "Groß-/Kleinschreibung beachten" #: ../gtk/data/gimagereader.ui.h:1 ../qt/src/Ui_MainWindow.hh:65 msgid "Rotate current page" msgstr "Aktuelle Seite rotieren" #: ../gtk/data/gimagereader.ui.h:2 ../qt/src/Ui_MainWindow.hh:66 msgid "Rotate all pages" msgstr "Alle Seiten rotieren" #: ../gtk/data/gimagereader.ui.h:3 ../qt/data/MainWindow.ui.h:35 msgid "Toggle output pane" msgstr "Ausgabebereich ein-/ausblenden" #. Sources toolbar #: ../gtk/data/gimagereader.ui.h:4 ../qt/src/Ui_MainWindow.hh:187 msgid "Recent" msgstr "Zuletzt geöffnet" #: ../gtk/data/gimagereader.ui.h:5 ../qt/src/Ui_MainWindow.hh:188 msgid "Paste" msgstr "Einfügen" #: ../gtk/data/gimagereader.ui.h:6 ../qt/src/Ui_MainWindow.hh:189 msgid "Take Screenshot" msgstr "Bildschirmfoto erstellen" #: ../gtk/data/gimagereader.ui.h:7 ../qt/src/Ui_MainWindow.hh:200 msgid "Add images" msgstr "Bilder hinzufügen" #: ../gtk/data/gimagereader.ui.h:8 ../qt/src/Ui_MainWindow.hh:199 msgid "Add Images" msgstr "Bilder hinzufügen" #: ../gtk/data/gimagereader.ui.h:9 ../qt/src/Ui_MainWindow.hh:205 msgid "Remove image from list" msgstr "Bild von Liste entfernen" #: ../gtk/data/gimagereader.ui.h:10 ../qt/src/Ui_MainWindow.hh:208 msgid "Delete image" msgstr "Bild löschen" #: ../gtk/data/gimagereader.ui.h:11 ../qt/src/Ui_MainWindow.hh:211 msgid "Clear list" msgstr "Liste leeren" #: ../gtk/data/gimagereader.ui.h:12 ../qt/data/MainWindow.ui.h:6 msgid "Files" msgstr "Dateien" #: ../gtk/data/gimagereader.ui.h:13 ../qt/data/MainWindow.ui.h:16 msgid "Device:" msgstr "Gerät:" #: ../gtk/data/gimagereader.ui.h:14 ../qt/data/MainWindow.ui.h:15 #: ../qt/src/TessdataManager.cc:57 msgid "Refresh" msgstr "Aktualisieren" #: ../gtk/data/gimagereader.ui.h:15 ../qt/data/MainWindow.ui.h:12 msgid "Output:" msgstr "Ausgabebild:" #: ../gtk/data/gimagereader.ui.h:16 ../qt/data/MainWindow.ui.h:9 msgid "Mode:" msgstr "Modus:" #: ../gtk/data/gimagereader.ui.h:17 ../gtk/src/OutputEditorHOCR.cc:362 #: ../qt/data/MainWindow.ui.h:11 ../qt/src/OutputEditorHOCR.cc:273 msgid "Color" msgstr "Farbig" #: ../gtk/data/gimagereader.ui.h:18 ../gtk/src/OutputEditorHOCR.cc:365 #: ../qt/data/MainWindow.ui.h:10 ../qt/src/OutputEditorHOCR.cc:275 #: ../qt/src/OutputEditorHOCR.cc:277 msgid "Grayscale" msgstr "Graustufen" #: ../gtk/data/gimagereader.ui.h:19 ../qt/data/MainWindow.ui.h:8 msgid "Resolution:" msgstr "Auflösung:" #: ../gtk/data/gimagereader.ui.h:20 ../qt/data/MainWindow.ui.h:13 msgid "Scan" msgstr "Scannen" #: ../gtk/data/gimagereader.ui.h:21 ../qt/data/MainWindow.ui.h:7 msgid "Acquire" msgstr "Erstellen" #: ../gtk/data/gimagereader.ui.h:22 ../qt/data/MainWindow.ui.h:2 msgid "Brightness" msgstr "Helligkeit" #: ../gtk/data/gimagereader.ui.h:23 ../qt/data/MainWindow.ui.h:3 msgid "Contrast" msgstr "Kontrast" #: ../gtk/data/gimagereader.ui.h:24 ../qt/data/MainWindow.ui.h:4 msgid "Resolution" msgstr "Auflösung" #: ../gtk/data/gimagereader.ui.h:25 ../qt/data/MainWindow.ui.h:5 msgid "Invert colors" msgstr "Farben invertieren" #: ../gtk/data/gimagereader.ui.h:26 ../qt/data/MainWindow.ui.h:19 msgid "Zoom in" msgstr "Ansicht vergrößern" #: ../gtk/data/gimagereader.ui.h:27 ../qt/data/MainWindow.ui.h:21 msgid "Zoom out" msgstr "Ansicht verkleinern" #: ../gtk/data/gimagereader.ui.h:28 ../qt/data/MainWindow.ui.h:23 msgid "Normal size" msgstr "Originalgröße" #: ../gtk/data/gimagereader.ui.h:29 ../qt/data/MainWindow.ui.h:25 msgid "Best fit" msgstr "Anpassen" #: ../gtk/data/gimagereader.ui.h:30 ../qt/src/Ui_MainWindow.hh:74 msgid "Select rotation mode" msgstr "Rotationsmodus auswählen" #: ../gtk/data/gimagereader.ui.h:32 ../qt/data/MainWindow.ui.h:31 msgid "Image controls" msgstr "Bildbearbeitung" #: ../gtk/data/gimagereader.ui.h:33 ../qt/src/Ui_MainWindow.hh:137 msgid "Plain text" msgstr "Reiner Text" #: ../gtk/data/gimagereader.ui.h:34 ../qt/src/Ui_MainWindow.hh:137 msgid "hOCR, PDF" msgstr "hOCR, PDF" #: ../gtk/data/gimagereader.ui.h:35 ../qt/data/MainWindow.ui.h:33 msgid "Autodetect layout" msgstr "Layout automatisch erkennen" #: ../gtk/data/gimagereader.ui.h:36 msgid "Recognize all" msgstr "Alles erkennen" #: ../gtk/data/gimagereader.ui.h:37 msgid "Select language" msgstr "Sprache auswählen" #: ../gtk/data/gimagereader.ui.h:38 msgid "A graphical frontend to tesseract-ocr" msgstr "Eine graphische Oberfläche für Tesseract-OCR" #: ../gtk/data/gimagereader.ui.h:42 msgid "Output pane orientation:" msgstr "Ausrichtung des Ausgabebereichs:" #: ../gtk/data/gimagereader.ui.h:43 msgid "Horizontal" msgstr "Waagerecht" #: ../gtk/data/gimagereader.ui.h:44 msgid "Vertical" msgstr "Senkrecht" #: ../gtk/data/gimagereader.ui.h:45 ../qt/data/ConfigDialog.ui.h:18 msgid "Query to install missing spellcheck dictionaries" msgstr "Installation von fehlenden Rechtschreibwörterbüchern vorschlagen" #: ../gtk/data/gimagereader.ui.h:46 ../qt/data/ConfigDialog.ui.h:4 msgid "Automatically check for new program versions" msgstr "Automatisch nach neuen Programmversionen suchen" #: ../gtk/data/gimagereader.ui.h:47 ../qt/data/ConfigDialog.ui.h:3 msgid "Predefined language definitions:" msgstr "Voreingestellte Sprachdefinitionen:" #: ../gtk/data/gimagereader.ui.h:48 ../qt/data/ConfigDialog.ui.h:12 msgid "Additional language definitions:" msgstr "Weitere Sprachdefinitionen:" #: ../gtk/data/gimagereader.ui.h:49 ../qt/data/ConfigDialog.ui.h:20 msgid "The prefix of the tesseract language data file" msgstr "Das Präfix der Sprachdatei von Tesseract" #: ../gtk/data/gimagereader.ui.h:50 ../qt/data/ConfigDialog.ui.h:21 msgid "Prefix" msgstr "Präfix" #: ../gtk/data/gimagereader.ui.h:51 ../qt/data/ConfigDialog.ui.h:22 msgid "The ISO 639-1 language code followed by the country code" msgstr "Der ISO 639-1-Sprachencode, gefolgt vom Landescode" #: ../gtk/data/gimagereader.ui.h:52 ../qt/data/ConfigDialog.ui.h:23 msgid "ISO Code" msgstr "ISO-Code" #: ../gtk/data/gimagereader.ui.h:53 ../qt/data/ConfigDialog.ui.h:24 msgid "The name of the language" msgstr "Der Name der Sprache" #: ../gtk/data/gimagereader.ui.h:54 ../qt/data/ConfigDialog.ui.h:25 msgid "Name" msgstr "Name" #: ../gtk/data/gimagereader.ui.h:56 ../qt/data/ConfigDialog.ui.h:5 msgid "Output pane font:" msgstr "Schriftart im Ausgabebereich:" #: ../gtk/data/gimagereader.ui.h:57 ../qt/data/ConfigDialog.ui.h:2 msgid "Default" msgstr "Standard" #: ../gtk/data/gimagereader.ui.h:58 ../qt/data/ConfigDialog.ui.h:6 msgid "Language data locations:" msgstr "Speicherort für Sprachdaten:" #: ../gtk/data/gimagereader.ui.h:59 ../qt/data/ConfigDialog.ui.h:13 msgid "Language definitions path:" msgstr "Speicherort für Sprachdefinitionen:" #: ../gtk/data/gimagereader.ui.h:60 ../qt/data/ConfigDialog.ui.h:28 msgid "Spelling dictionaries path:" msgstr "Speicherort für Rechtschreibwörterbücher" #: ../gtk/data/gimagereader.ui.h:61 ../qt/data/ConfigDialog.ui.h:10 msgid "System-wide paths" msgstr "Systemweite Ordner" #: ../gtk/data/gimagereader.ui.h:62 ../qt/data/ConfigDialog.ui.h:11 msgid "User paths" msgstr "Benutzerordner" #: ../gtk/data/gimagereader.ui.h:63 ../qt/data/PageRangeDialog.ui.h:1 msgid "Page Range" msgstr "Seiten" #: ../gtk/data/gimagereader.ui.h:64 ../qt/data/PageRangeDialog.ui.h:2 msgid "Page range:" msgstr "Seiten:" #: ../gtk/data/gimagereader.ui.h:65 ../qt/data/PageRangeDialog.ui.h:3 msgid "Example: 1-10, 13, 14-18" msgstr "Beispiel: 1-10, 13, 14-18" #: ../gtk/data/gimagereader.ui.h:66 ../qt/data/PageRangeDialog.ui.h:4 msgid "Recognition area:" msgstr "Erkennungsbereich:" #: ../gtk/data/gimagereader.ui.h:67 ../gtk/src/Recognizer.cc:403 #: ../qt/data/PageRangeDialog.ui.h:5 ../qt/src/Recognizer.cc:381 msgid "Entire page" msgstr "Ganze Seite" #: ../gtk/data/gimagereader.ui.h:68 ../qt/data/PageRangeDialog.ui.h:6 msgid "Autodetect" msgstr "Automatisch erkennen" #: ../gtk/data/gimagereader.ui.h:69 ../qt/data/PageRangeDialog.ui.h:7 msgid "Prepend to output text:" msgstr "Dem Ausgabetext voranstellen:" #: ../gtk/data/gimagereader.ui.h:70 ../qt/data/PageRangeDialog.ui.h:8 msgid "Source filename" msgstr "Quelldateiname" #: ../gtk/data/gimagereader.ui.h:71 ../qt/data/PageRangeDialog.ui.h:9 msgid "Source page" msgstr "Quellseite" #: ../gtk/data/gimagereader.ui.h:72 ../qt/src/TessdataManager.cc:47 msgid "Tessdata Manager" msgstr "Tessdata-Verwaltung" #: ../gtk/data/gimagereader.ui.h:75 ../qt/src/TessdataManager.cc:49 msgid "Manage installed languages:" msgstr "Installierte Sprachen verwalten:" #: ../gtk/data/gimagereader.ui.h:76 ../qt/src/DisplayerToolSelect.cc:240 msgid "Delete" msgstr "Löschen" #: ../gtk/data/gimagereader.ui.h:77 ../qt/src/DisplayerToolSelect.cc:226 msgid "Order:" msgstr "Reihenfolge:" #: ../gtk/data/gimagereader.ui.h:78 ../gtk/src/DisplayerToolHOCR.cc:28 #: ../qt/src/DisplayerToolHOCR.cc:30 ../qt/src/DisplayerToolSelect.cc:241 msgid "Recognize" msgstr "Erkennen" #: ../gtk/data/gimagereader.ui.h:79 ../qt/src/DisplayerToolSelect.cc:242 msgid "Recognize to clipboard" msgstr "Erkennung in die Zwischenablage kopieren" #: ../gtk/data/gimagereader.ui.h:80 ../qt/src/DisplayerToolSelect.cc:243 msgid "Save as image" msgstr "Als Bild speichern" #: ../gtk/data/gimagereader.ui.h:81 ../qt/src/Recognizer.cc:76 msgid "Current Page" msgstr "Aktuelle Seite" #: ../gtk/data/gimagereader.ui.h:82 ../qt/src/Recognizer.cc:79 msgid "Multiple Pages..." msgstr "Mehrere Seiten..." #: ../gtk/src/Acquirer.cc:83 ../qt/src/Acquirer.cc:63 msgid "scan.png" msgstr "scan.png" #: ../gtk/src/Acquirer.cc:96 ../qt/src/Acquirer.cc:80 msgid "Images" msgstr "Bilder" #: ../gtk/src/Acquirer.cc:97 ../qt/src/Acquirer.cc:81 msgid "Choose Output Filename..." msgstr "Wählen Sie den Namen der Ausgabedatei..." #: ../gtk/src/Acquirer.cc:112 ../qt/src/Acquirer.cc:96 msgid "Failed to initialize the scanning backend." msgstr "Scanning-Backend konnte nicht initialisiert werden." #: ../gtk/src/Acquirer.cc:121 ../qt/src/Acquirer.cc:102 msgid "Scan failed" msgstr "Scannen fehlgeschlagen" #: ../gtk/src/Acquirer.cc:139 ../qt/src/Acquirer.cc:118 msgid "No scanners were detected." msgstr "Keine Scanner gefunden." #: ../gtk/src/Acquirer.cc:156 ../gtk/src/Acquirer.cc:173 #: ../qt/src/Acquirer.cc:132 ../qt/src/Acquirer.cc:149 msgid "Starting scan..." msgstr "Scan wird gestartet..." #: ../gtk/src/Acquirer.cc:169 ../qt/src/Acquirer.cc:145 msgid "Opening device..." msgstr "Die Verbindung zum Scanner wird hergestellt..." #: ../gtk/src/Acquirer.cc:171 ../qt/src/Acquirer.cc:147 msgid "Setting options..." msgstr "Einstellungen werden gesetzt..." #: ../gtk/src/Acquirer.cc:175 ../qt/src/Acquirer.cc:151 msgid "Getting parameters..." msgstr "Parameter werden gelesen..." #: ../gtk/src/Acquirer.cc:177 ../qt/src/Acquirer.cc:153 msgid "Transferring data..." msgstr "Bildinformation wird übertragen..." #: ../gtk/src/Acquirer.cc:184 ../qt/src/Acquirer.cc:160 msgid "Canceling scan..." msgstr "Scan wird unterbrochen..." #: ../gtk/src/Config.cc:297 ../qt/data/ConfigDialog.ui.h:7 msgid "Filename prefix" msgstr "Präfix des Dateinamens" #: ../gtk/src/Config.cc:298 ../qt/data/ConfigDialog.ui.h:8 msgid "Code" msgstr "Code" #: ../gtk/src/Config.cc:299 ../qt/data/ConfigDialog.ui.h:9 msgid "Native name" msgstr "Nativer Name" #: ../gtk/src/CrashHandler.cc:26 ../gtk/src/CrashHandler.cc:43 #: ../qt/src/CrashHandler.cc:34 msgid "Crash Handler" msgstr "Crash-Handler" #: ../gtk/src/CrashHandler.cc:45 ../qt/src/CrashHandler.cc:29 msgid "Your work has been saved under %1." msgstr "Ihre Arbeit wurde unter %1 gespeichert." #: ../gtk/src/CrashHandler.cc:47 ../qt/src/CrashHandler.cc:31 msgid "There was no unsaved work." msgstr "Keine ungespeicherte Arbeit." #: ../gtk/src/CrashHandler.cc:106 ../qt/src/CrashHandler.cc:60 msgid "Failed to obtain backtrace. Is gdb installed?" msgstr "Der Backtrace konnte nicht generiert werden. Ist gdb installiert?" #: ../gtk/src/Displayer.cc:261 ../qt/src/Displayer.cc:231 msgid "Failed to load image" msgstr "Das Bild konnte nicht geladen werden" #: ../gtk/src/Displayer.cc:261 ../qt/src/Displayer.cc:231 msgid "" "The file might not be an image or be corrupt:\n" "%1" msgstr "" "Die Datei ist möglicherweise kein Bild oder ist beschädigt:\n" "%1" #: ../gtk/src/DisplayerToolSelect.cc:39 ../qt/src/DisplayerToolSelect.cc:40 msgid "selection.png" msgstr "Auswahl.png" #: ../gtk/src/DisplayerToolSelect.cc:148 ../qt/src/DisplayerToolSelect.cc:139 msgid "PNG Images" msgstr "PNG-Bilder" #: ../gtk/src/DisplayerToolSelect.cc:149 ../qt/src/DisplayerToolSelect.cc:139 msgid "Save Selection Image" msgstr "Bild speichern" #: ../gtk/src/DisplayerToolSelect.cc:157 ../qt/src/DisplayerToolSelect.cc:147 msgid "Recognize all" msgstr "Alles erkennen" #: ../gtk/src/DisplayerToolSelect.cc:157 ../qt/src/DisplayerToolSelect.cc:147 msgid "Recognize selection" msgstr "Auswahl erkennen" #: ../gtk/src/DisplayerToolSelect.cc:194 ../qt/src/DisplayerToolSelect.cc:184 msgid "Performing layout analysis" msgstr "Layout-Analyse wird durchgeführt" #: ../gtk/src/FileDialogs.cc:237 msgid "" "A file named \"%1\" already exists. Are you sure you want to overwrite it?" msgstr "Eine Datei namens \"%1\" existiert bereits. Soll sie ersetzt werden?" #: ../gtk/src/FileDialogs.cc:239 msgid "Overwrite File?" msgstr "Datei ersetzen?" #: ../gtk/src/MainWindow.cc:125 ../qt/src/MainWindow.cc:274 msgid "Using tesseract" msgstr "Verwendet tesseract" #: ../gtk/src/MainWindow.cc:191 ../qt/src/MainWindow.cc:181 msgid "Select an image to begin..." msgstr "Zum Starten ein Bild wählen..." #: ../gtk/src/MainWindow.cc:306 ../qt/src/MainWindow.cc:262 msgid "Multiple sources" msgstr "Mehrere Quellen" #: ../gtk/src/MainWindow.cc:307 ../qt/src/MainWindow.cc:263 msgid "Ready" msgstr "Bereit" #: ../gtk/src/MainWindow.cc:446 ../qt/src/MainWindow.cc:390 msgid "New version" msgstr "Neue Version" #: ../gtk/src/MainWindow.cc:446 ../qt/src/MainWindow.cc:390 msgid "gImageReader %1 is available" msgstr "gImageReader %1 ist erhältlich" #: ../gtk/src/MainWindow.cc:447 ../qt/src/MainWindow.cc:391 msgid "Download" msgstr "Herunterladen" #: ../gtk/src/MainWindow.cc:448 ../qt/src/MainWindow.cc:392 msgid "Changelog" msgstr "Änderungshistorie" #: ../gtk/src/MainWindow.cc:449 ../qt/src/MainWindow.cc:393 msgid "Don't notify again" msgstr "Nicht mehr fragen" #: ../gtk/src/MainWindow.cc:468 ../qt/src/MainWindow.cc:438 msgid "Don't show again" msgstr "Nicht mehr zeigen" #: ../gtk/src/MainWindow.cc:469 ../gtk/src/MainWindow.cc:482 #: ../qt/src/MainWindow.cc:439 msgid "Install" msgstr "Installieren" #: ../gtk/src/MainWindow.cc:489 ../qt/src/MainWindow.cc:451 msgid "Spelling dictionary missing" msgstr "Rechtschreibwörterbuch fehlt" #: ../gtk/src/MainWindow.cc:489 ../qt/src/MainWindow.cc:451 msgid "The spellcheck dictionary for %1 is not installed" msgstr "Das Rechtschreibwörterbuch für %1 ist nicht installiert" #: ../gtk/src/MainWindow.cc:496 ../gtk/src/MainWindow.cc:528 #: ../qt/src/MainWindow.cc:458 msgid "Installing spelling dictionary for '%1'" msgstr "Rechtschreibwörterbuch für '%1' wird installiert" #: ../gtk/src/MainWindow.cc:517 ../gtk/src/MainWindow.cc:542 #: ../gtk/src/MainWindow.cc:550 ../gtk/src/MainWindow.cc:560 #: ../gtk/src/MainWindow.cc:566 ../gtk/src/MainWindow.cc:595 #: ../gtk/src/OutputEditorHOCR.cc:1375 ../gtk/src/Recognizer.cc:163 #: ../gtk/src/TessdataManager.cc:58 ../gtk/src/TessdataManager.cc:68 #: ../gtk/src/TessdataManager.cc:290 ../qt/src/MainWindow.cc:477 #: ../qt/src/MainWindow.cc:490 ../qt/src/MainWindow.cc:500 #: ../qt/src/MainWindow.cc:510 ../qt/src/MainWindow.cc:518 #: ../qt/src/MainWindow.cc:546 ../qt/src/OutputEditorHOCR.cc:1157 #: ../qt/src/Recognizer.cc:138 ../qt/src/TessdataManager.cc:72 #: ../qt/src/TessdataManager.cc:82 ../qt/src/TessdataManager.cc:275 msgid "Error" msgstr "Fehler" #: ../gtk/src/MainWindow.cc:517 ../qt/src/MainWindow.cc:477 msgid "Failed to install spelling dictionary: %1" msgstr "Rechtschreibwörterbuch konnte nicht installiert werden: %1" #: ../gtk/src/MainWindow.cc:542 ../qt/src/MainWindow.cc:490 msgid "Failed to create directory for spelling dictionaries." msgstr "Ordner für Rechtschreibwörterbücher konnte nicht erstellt werden." #: ../gtk/src/MainWindow.cc:550 ../gtk/src/MainWindow.cc:566 #: ../qt/src/MainWindow.cc:500 msgid "Could not read %1: %2." msgstr "%1 konnte nicht gelesen werden: %2" #: ../gtk/src/MainWindow.cc:560 ../gtk/src/MainWindow.cc:595 #: ../qt/src/MainWindow.cc:510 ../qt/src/MainWindow.cc:546 msgid "No spelling dictionaries found for '%1'." msgstr "Kein Rechtschreibwörterbuch für '%1' gefunden." #: ../gtk/src/MainWindow.cc:576 ../qt/src/MainWindow.cc:529 msgid "Downloading '%1'..." msgstr "'%1' wird heruntergeladen..." #: ../gtk/src/MainWindow.cc:592 ../qt/src/MainWindow.cc:543 msgid "Dictionaries installed" msgstr "Rechtschreibwörterbücher installiert" #: ../gtk/src/MainWindow.cc:592 msgid "The following dictionaries were installed:%1" msgstr "Folgende Rechtschreibwörterbücher wurden installiert:%1" #: ../gtk/src/OutputEditorHOCR.cc:319 ../qt/src/OutputEditorHOCR.cc:291 msgid "Document" msgstr "Dokumentu" #: ../gtk/src/OutputEditorHOCR.cc:368 ../qt/src/OutputEditorHOCR.cc:279 msgid "Monochrome" msgstr "Einfarbig" #: ../gtk/src/OutputEditorHOCR.cc:377 ../qt/src/OutputEditorHOCR.cc:281 msgid "Threshold (closest color)" msgstr "Threshold (nächste Farbe)" #: ../gtk/src/OutputEditorHOCR.cc:380 ../qt/src/OutputEditorHOCR.cc:282 msgid "Diffuse" msgstr "Diffus" #: ../gtk/src/OutputEditorHOCR.cc:389 ../qt/src/OutputEditorHOCR.cc:283 msgid "Zip (lossless)" msgstr "Zip (verlustlos)" #: ../gtk/src/OutputEditorHOCR.cc:393 ../qt/src/OutputEditorHOCR.cc:284 msgid "CCITT Group 4 (lossless)" msgstr "CCITT Group 4 (verlustlos)" #: ../gtk/src/OutputEditorHOCR.cc:397 ../qt/src/OutputEditorHOCR.cc:285 msgid "Jpeg (lossy)" msgstr "Jpeg (verlustbehaftet)" #: ../gtk/src/OutputEditorHOCR.cc:553 ../qt/src/OutputEditorHOCR.cc:429 msgid "" "The following pages could not be processed:\n" "%1" msgstr "" "Folgende Seiten konnten nicht verarbeitet werden:\n" "%1" #: ../gtk/src/OutputEditorHOCR.cc:554 ../qt/src/OutputEditorHOCR.cc:430 msgid "Recognition errors" msgstr "Erkennungsfehler" #. Add tree item #: ../gtk/src/OutputEditorHOCR.cc:647 ../gtk/src/OutputEditorHOCR.cc:1037 #: ../qt/src/OutputEditorHOCR.cc:504 ../qt/src/OutputEditorHOCR.cc:894 msgid "Graphic" msgstr "Graphik" #: ../gtk/src/OutputEditorHOCR.cc:703 ../qt/src/OutputEditorHOCR.cc:563 msgid "Paragraph" msgstr "Absatz" #: ../gtk/src/OutputEditorHOCR.cc:706 ../qt/src/OutputEditorHOCR.cc:566 msgid "Textline" msgstr "Textzeile" #: ../gtk/src/OutputEditorHOCR.cc:1136 ../qt/src/OutputEditorHOCR.cc:950 msgid "Merge" msgstr "Verschmelzen" #: ../gtk/src/OutputEditorHOCR.cc:1161 ../qt/src/OutputEditorHOCR.cc:977 msgid "Add graphic region" msgstr "Graphikregion hinzufügen" #: ../gtk/src/OutputEditorHOCR.cc:1177 ../qt/src/OutputEditorHOCR.cc:985 msgid "No suggestions" msgstr "Keine Vorschläge" #: ../gtk/src/OutputEditorHOCR.cc:1183 ../qt/src/OutputEditorHOCR.cc:989 msgid "Add to dictionary" msgstr "Zum Wörterbuch hinzufügen" #: ../gtk/src/OutputEditorHOCR.cc:1189 ../qt/src/OutputEditorHOCR.cc:990 msgid "Ignore word" msgstr "Wort ignorieren" #: ../gtk/src/OutputEditorHOCR.cc:1222 ../qt/src/OutputEditorHOCR.cc:1007 msgid "Expand all" msgstr "Ausklappen" #: ../gtk/src/OutputEditorHOCR.cc:1225 ../qt/src/OutputEditorHOCR.cc:1008 msgid "Collapse all" msgstr "Einklappen" #: ../gtk/src/OutputEditorHOCR.cc:1248 ../gtk/src/OutputEditorHOCR.cc:1287 #: ../qt/src/OutputEditorHOCR.cc:1049 ../qt/src/OutputEditorHOCR.cc:1079 msgid "hOCR HTML Files" msgstr "hOCR-HTML-Dateien" #: ../gtk/src/OutputEditorHOCR.cc:1249 ../qt/src/OutputEditorHOCR.cc:1049 msgid "Open hOCR File" msgstr "hOCR-Datei öffnen" #: ../gtk/src/OutputEditorHOCR.cc:1258 ../qt/src/OutputEditorHOCR.cc:1055 msgid "Failed to open file" msgstr "Datei konnte nicht geöffnet werden" #: ../gtk/src/OutputEditorHOCR.cc:1258 ../qt/src/OutputEditorHOCR.cc:1055 msgid "The file could not be opened: %1." msgstr "Die Datei konnte nicht geöffnet werden: %1." #: ../gtk/src/OutputEditorHOCR.cc:1267 ../qt/src/OutputEditorHOCR.cc:1062 msgid "Invalid hOCR file" msgstr "Ungültige hOCR-Datei" #: ../gtk/src/OutputEditorHOCR.cc:1267 ../qt/src/OutputEditorHOCR.cc:1062 msgid "The file does not appear to contain valid hOCR HTML: %1" msgstr "Die Datei enthält kein gültiges hOCR-HTML: %1" #: ../gtk/src/OutputEditorHOCR.cc:1283 ../gtk/src/OutputEditorHOCR.cc:1343 #: ../gtk/src/OutputEditorText.cc:306 ../qt/src/OutputEditorHOCR.cc:1077 #: ../qt/src/OutputEditorHOCR.cc:1131 ../qt/src/OutputEditorText.cc:246 msgid "output" msgstr "Ausgabe" #: ../gtk/src/OutputEditorHOCR.cc:1288 ../qt/src/OutputEditorHOCR.cc:1079 msgid "Save hOCR Output..." msgstr "hOCR-Ausgabe speichern..." #: ../gtk/src/OutputEditorHOCR.cc:1296 ../gtk/src/OutputEditorHOCR.cc:1357 #: ../gtk/src/OutputEditorText.cc:319 ../qt/src/OutputEditorHOCR.cc:1087 #: ../qt/src/OutputEditorHOCR.cc:1143 ../qt/src/OutputEditorText.cc:256 msgid "Failed to save output" msgstr "Konnte Ausgabe nicht speichern" #: ../gtk/src/OutputEditorHOCR.cc:1296 ../gtk/src/OutputEditorHOCR.cc:1357 #: ../gtk/src/OutputEditorText.cc:319 ../qt/src/OutputEditorHOCR.cc:1087 #: ../qt/src/OutputEditorHOCR.cc:1143 ../qt/src/OutputEditorText.cc:256 msgid "Check that you have writing permissions in the selected folder." msgstr "Kontrollieren Sie, ob Sie Schreibrechte im gewählten Ordner besitzen." #: ../gtk/src/OutputEditorHOCR.cc:1346 ../qt/src/OutputEditorHOCR.cc:1133 msgid "PDF Files" msgstr "PDF-Dateien" #: ../gtk/src/OutputEditorHOCR.cc:1347 ../qt/src/OutputEditorHOCR.cc:1133 msgid "Save PDF Output..." msgstr "PDF-Ausgabe speichern..." #: ../gtk/src/OutputEditorHOCR.cc:1375 ../qt/src/OutputEditorHOCR.cc:1157 msgid "The PDF library does not support the selected font." msgstr "Die PDF-Bibliothek unterstützt die ausgewählte Schriftart nicht." #: ../gtk/src/OutputEditorHOCR.cc:1435 ../qt/src/OutputEditorHOCR.cc:1216 msgid "Errors occurred" msgstr "Erkennungsfehler sind aufgetreten" #: ../gtk/src/OutputEditorHOCR.cc:1435 ../qt/src/OutputEditorHOCR.cc:1216 msgid "" "The following pages could not be rendered:\n" "%1" msgstr "" "Folgende Seiten konnten nicht gerendert werden:\n" "%1" #: ../gtk/src/OutputEditorHOCR.cc:1562 ../gtk/src/OutputEditorText.cc:333 #: ../qt/src/OutputEditorHOCR.cc:1331 ../qt/src/OutputEditorText.cc:269 msgid "Output not saved" msgstr "Ausgabe nicht gespeichert" #: ../gtk/src/OutputEditorHOCR.cc:1562 ../gtk/src/OutputEditorText.cc:333 #: ../qt/src/OutputEditorHOCR.cc:1331 ../qt/src/OutputEditorText.cc:269 msgid "Save output before proceeding?" msgstr "Ausgabe vor dem Fortsetzen speichern?" #: ../gtk/src/OutputEditorText.cc:197 ../qt/src/OutputEditorText.cc:158 msgid "Stripping line breaks..." msgstr "Zeilenumbrüche werden entfernt..." #: ../gtk/src/OutputEditorText.cc:211 msgid "Check spelling" msgstr "Rechtschreibprüfung" #: ../gtk/src/OutputEditorText.cc:238 ../qt/src/OutputEditorText.cc:178 msgid "Replacing..." msgstr "Ersetzen läuft..." #: ../gtk/src/OutputEditorText.cc:264 ../qt/src/OutputEditorText.cc:204 msgid "File: %1" msgstr "Datei: %1" #: ../gtk/src/OutputEditorText.cc:267 ../qt/src/OutputEditorText.cc:207 msgid "Page: %1" msgstr "Seite: %1" #: ../gtk/src/OutputEditorText.cc:280 ../gtk/src/Recognizer.cc:481 #: ../qt/src/Recognizer.cc:460 msgid "" "\n" "[Failed to recognize page %1]\n" msgstr "" "\n" "[Seite %1 konnte nicht erkannt werden]\n" #: ../gtk/src/OutputEditorText.cc:310 ../qt/src/OutputEditorText.cc:248 msgid "Text Files" msgstr "Textdateien" #: ../gtk/src/OutputEditorText.cc:311 ../qt/src/OutputEditorText.cc:248 msgid "Save Output..." msgstr "Ausgabe speichern..." #: ../gtk/src/Recognizer.cc:156 ../qt/src/Recognizer.cc:131 msgid "" "Tesseract crashed with the following message:\n" "\n" "%1\n" "\n" "This typically happens for one of the following reasons:\n" "- Outdated traineddata files are used.\n" "- Auxiliary language data files are missing.\n" "- Corrupt language data files.\n" "\n" "Make sure your language data files are valid and compatible with tesseract " "%2." msgstr "" "Tesseract stürzte mit folgender Ausgabe ab:\n" "\n" "%1\n" "\n" "Das ist typisch für einen der folgenden Gründe:\n" "- Es werden veraltete traineddata-Dateien verwendet.\n" "- Zusätzliche Sprachdaten-Dateien fehlen.\n" "- Beschädigte Sprachdaten-Dateien.\n" "\n" "Stellen SIe sicher, dass die Sprachdaten-Dateien gültig und zu Tessaract " "kompatibel sind %2." #: ../gtk/src/Recognizer.cc:212 ../qt/src/Recognizer.cc:191 msgid "No languages available" msgstr "Keine Sprachen verfügbar" #: ../gtk/src/Recognizer.cc:212 ../qt/src/Recognizer.cc:191 msgid "" "No tesseract languages are available for use. Recognition will not work." msgstr "Keine Tesseract-Sprachen verfügbar. Texterkennung nicht möglich." #: ../gtk/src/Recognizer.cc:266 ../qt/src/Recognizer.cc:251 msgid "Multilingual" msgstr "Mehrsprachig" #: ../gtk/src/Recognizer.cc:318 ../qt/src/Recognizer.cc:295 msgid "Automatic page segmentation" msgstr "Automatische Seitensegmentierung" #: ../gtk/src/Recognizer.cc:319 ../qt/src/Recognizer.cc:296 msgid "Page segmentation with orientation and script detection" msgstr "Seitensegmentierung mit Orientierung- und Skripterkennung" #: ../gtk/src/Recognizer.cc:320 ../qt/src/Recognizer.cc:297 msgid "Assume single column of text" msgstr "Eine einzelne Textspalte annehmen" #: ../gtk/src/Recognizer.cc:321 ../qt/src/Recognizer.cc:298 msgid "Assume single block of vertically aligned text" msgstr "Ein einzelner Block vertikal ausgerichteter Text annehmen" #: ../gtk/src/Recognizer.cc:322 ../qt/src/Recognizer.cc:299 msgid "Assume a single uniform block of text" msgstr "Ein einzelner einheitlicher Textblock annehmen" #: ../gtk/src/Recognizer.cc:323 ../qt/src/Recognizer.cc:300 msgid "Assume a line of text" msgstr "Eine einzelne Textlinie annehmen" #: ../gtk/src/Recognizer.cc:324 ../qt/src/Recognizer.cc:301 msgid "Assume a single word" msgstr "Ein einzelnes Wort annehmen" #: ../gtk/src/Recognizer.cc:325 ../qt/src/Recognizer.cc:302 msgid "Assume a single word in a circle" msgstr "Ein einzelnes Wort in einem Kreis annehmen" #: ../gtk/src/Recognizer.cc:326 ../qt/src/Recognizer.cc:303 msgid "Sparse text in no particular order" msgstr "Spärlicher Text in keiner bestimmten Reihenfolge" #: ../gtk/src/Recognizer.cc:327 ../qt/src/Recognizer.cc:304 msgid "Sparse text with orientation and script detection" msgstr "Spärlicher Text mit Orientierung- und Skripterkennung" #: ../gtk/src/Recognizer.cc:341 ../qt/src/Recognizer.cc:314 msgid "Page segmentation mode" msgstr "Seitensegmentierungsmodus" #: ../gtk/src/Recognizer.cc:347 ../qt/src/Recognizer.cc:321 msgid "Manage languages..." msgstr "Sprachen verwalten..." #: ../gtk/src/Recognizer.cc:403 ../qt/src/Recognizer.cc:381 msgid "Current selection" msgstr "Aktuelle Selektion" #: ../gtk/src/Recognizer.cc:475 ../qt/src/Recognizer.cc:454 msgid "Recognizing page %1 (%2 of %3)" msgstr "Erkennung von Seite %1 (%2 von %3) wird durchgeführt" #: ../gtk/src/Recognizer.cc:480 ../qt/src/Recognizer.cc:459 msgid "" "\n" "- Page %1: failed to render page" msgstr "" "\n" "- Seite %1: Seite konnte nicht gerendert werden" #: ../gtk/src/Recognizer.cc:510 ../gtk/src/Recognizer.cc:539 #: ../gtk/src/Recognizer.cc:552 ../qt/src/Recognizer.cc:488 #: ../qt/src/Recognizer.cc:517 ../qt/src/Recognizer.cc:530 msgid "Recognizing..." msgstr "Erkennung wird durchgeführt..." #: ../gtk/src/Recognizer.cc:514 ../gtk/src/Recognizer.cc:522 #: ../qt/src/Recognizer.cc:492 ../qt/src/Recognizer.cc:500 msgid "Recognition errors occurred" msgstr "Erkennungsfehler sind aufgetreten" #: ../gtk/src/Recognizer.cc:514 ../qt/src/Recognizer.cc:492 msgid "The following errors occurred:%1" msgstr "Folgende Fehler sind aufgetreten:%1" #: ../gtk/src/Recognizer.cc:522 ../qt/src/Recognizer.cc:500 msgid "Failed to initialize tesseract" msgstr "Tesseract konnte nicht initialisiert werden" #: ../gtk/src/scanner/ScannerSane.cc:83 ../gtk/src/scanner/ScannerTwain.cc:287 #: ../qt/src/scanner/ScannerSane.cc:85 ../qt/src/scanner/ScannerTwain.cc:285 msgid "Scan canceled" msgstr "Scan abgebrochen" #: ../gtk/src/scanner/ScannerSane.cc:157 ../gtk/src/scanner/ScannerTwain.cc:186 #: ../qt/src/scanner/ScannerSane.cc:158 ../qt/src/scanner/ScannerTwain.cc:178 msgid "No scanner specified" msgstr "Kein Scanner angegeben" #: ../gtk/src/scanner/ScannerSane.cc:166 ../gtk/src/scanner/ScannerTwain.cc:195 #: ../qt/src/scanner/ScannerSane.cc:167 ../qt/src/scanner/ScannerTwain.cc:187 msgid "Unable to connect to scanner" msgstr "Scanner nicht gefunden" #: ../gtk/src/scanner/ScannerSane.cc:386 ../gtk/src/scanner/ScannerTwain.cc:265 #: ../gtk/src/scanner/ScannerTwain.cc:291 ../qt/src/scanner/ScannerSane.cc:387 #: ../qt/src/scanner/ScannerTwain.cc:257 ../qt/src/scanner/ScannerTwain.cc:289 msgid "Unable to start scan" msgstr "Scan konnte nicht gestartet werden" #: ../gtk/src/scanner/ScannerSane.cc:394 ../gtk/src/scanner/ScannerSane.cc:437 #: ../gtk/src/scanner/ScannerTwain.cc:317 ../qt/src/scanner/ScannerSane.cc:395 #: ../qt/src/scanner/ScannerSane.cc:438 ../qt/src/scanner/ScannerTwain.cc:315 msgid "Error communicating with scanner" msgstr "Fehler in der Scanner-Kommunikation" #: ../gtk/src/scanner/ScannerSane.cc:498 ../qt/src/scanner/ScannerSane.cc:494 msgid "Failed to save image" msgstr "Das Bild konnte nicht gespeichert werden" #: ../gtk/src/SourceManager.cc:118 ../qt/src/SourceManager.cc:112 msgid "Unable to open files" msgstr "Dateien konnten nicht geöffnet werden" #: ../gtk/src/SourceManager.cc:118 ../qt/src/SourceManager.cc:112 msgid "The following files could not be opened:%1" msgstr "Folgende Dateien konnten nicht geöffnet werden:%1" #: ../gtk/src/SourceManager.cc:134 ../qt/src/SourceManager.cc:154 msgid "Images and PDFs" msgstr "Bilder und PDFs" #: ../gtk/src/SourceManager.cc:137 ../qt/src/SourceManager.cc:155 msgid "Select Files" msgstr "Dateien auswählen" #: ../gtk/src/SourceManager.cc:143 ../qt/src/SourceManager.cc:166 msgid "Clipboard Error" msgstr "Fehler: Zwischenablage" #: ../gtk/src/SourceManager.cc:143 ../qt/src/SourceManager.cc:166 msgid "Failed to read the clipboard." msgstr "Zwischenablage konnte nicht gelesen werden." #: ../gtk/src/SourceManager.cc:147 ../qt/src/SourceManager.cc:170 #: ../qt/src/SourceManager.cc:176 msgid "Pasted %1" msgstr "%1 eingefügt" #: ../gtk/src/SourceManager.cc:159 ../qt/src/SourceManager.cc:183 msgid "Screenshot Error" msgstr "Fehler: Bildschirmfoto" #: ../gtk/src/SourceManager.cc:159 ../qt/src/SourceManager.cc:183 msgid "Failed to take screenshot." msgstr "Bildschirmfoto konnte nicht gespeichert werden" #: ../gtk/src/SourceManager.cc:163 ../qt/src/SourceManager.cc:187 msgid "Screenshot %1" msgstr "Bildschirmfoto %1" #: ../gtk/src/SourceManager.cc:168 ../qt/src/SourceManager.cc:192 msgid "Saving image..." msgstr "Bild wird gespeichert..." #: ../gtk/src/SourceManager.cc:175 ../qt/src/SourceManager.cc:205 msgid "Cannot Write File" msgstr "Fehler beim Schreiben der Datei" #: ../gtk/src/SourceManager.cc:175 ../qt/src/SourceManager.cc:205 msgid "Could not write to %1." msgstr "Auf %1 konnte nicht geschrieben werden." #: ../gtk/src/SourceManager.cc:202 ../qt/src/SourceManager.cc:227 msgid "Delete File?" msgstr "Datei löschen?" #: ../gtk/src/SourceManager.cc:202 ../qt/src/SourceManager.cc:227 msgid "The following files will be deleted:%1" msgstr "Folgende Dateien werden gelöscht:%1" #: ../gtk/src/SourceManager.cc:266 ../qt/src/SourceManager.cc:278 msgid "Missing File" msgstr "Fehlende Datei" #: ../gtk/src/SourceManager.cc:266 ../qt/src/SourceManager.cc:278 msgid "" "The following file has been deleted or moved:\n" "%1" msgstr "" "Folgende Datei wurde gelöscht oder verschoben:\n" "%1" #: ../gtk/src/SubstitutionsManager.cc:39 ../qt/src/SubstitutionsManager.cc:77 msgid "Search for" msgstr "Suche nach" #: ../gtk/src/SubstitutionsManager.cc:40 ../qt/src/SubstitutionsManager.cc:77 msgid "Replace with" msgstr "Ersetzen mit" #: ../gtk/src/SubstitutionsManager.cc:62 ../qt/src/SubstitutionsManager.cc:99 msgid "substitution_list.txt" msgstr "substitutionen.txt" #: ../gtk/src/SubstitutionsManager.cc:84 ../gtk/src/SubstitutionsManager.cc:119 #: ../qt/src/SubstitutionsManager.cc:114 ../qt/src/SubstitutionsManager.cc:152 msgid "Substitutions List" msgstr "Ersetzungsliste" #: ../gtk/src/SubstitutionsManager.cc:85 ../qt/src/SubstitutionsManager.cc:114 msgid "Open Substitutions List" msgstr "Ersetzungsliste laden" #: ../gtk/src/SubstitutionsManager.cc:90 ../qt/src/SubstitutionsManager.cc:119 msgid "Error Reading File" msgstr "Fehler beim Lesen der Datei" #: ../gtk/src/SubstitutionsManager.cc:90 ../qt/src/SubstitutionsManager.cc:119 msgid "Unable to read '%1'." msgstr "Die Datei '%1' konnte nicht gelesen werden." #: ../gtk/src/SubstitutionsManager.cc:113 ../qt/src/SubstitutionsManager.cc:146 msgid "Errors Occurred Reading File" msgstr "Fehler beim Lesen der Datei" #: ../gtk/src/SubstitutionsManager.cc:113 ../qt/src/SubstitutionsManager.cc:146 msgid "Some entries of the substitutions list could not be read." msgstr "Einige Einträge der Ersetzungsliste konnten nicht gelesen werden." #: ../gtk/src/SubstitutionsManager.cc:120 ../qt/src/SubstitutionsManager.cc:152 msgid "Save Substitutions List" msgstr "Ersetzungsliste speichern" #: ../gtk/src/SubstitutionsManager.cc:126 ../qt/src/SubstitutionsManager.cc:158 msgid "Error Saving File" msgstr "Fehler beim Speichern der Datei" #: ../gtk/src/SubstitutionsManager.cc:126 ../qt/src/SubstitutionsManager.cc:158 msgid "Unable to write to '%1'." msgstr "Die Datei '%1' konnte nicht geschrieben werden." #: ../gtk/src/SubstitutionsManager.cc:144 ../qt/src/SubstitutionsManager.cc:172 msgid "Save List?" msgstr "Liste speichern?" #: ../gtk/src/SubstitutionsManager.cc:144 ../qt/src/SubstitutionsManager.cc:172 msgid "Do you want to save the current list?" msgstr "Soll die aktuelle Liste gespeichert werden?" #: ../gtk/src/SubstitutionsManager.cc:179 ../qt/src/SubstitutionsManager.cc:208 msgid "Applying substitutions..." msgstr "Ersetzungen werden durchgeführt..." #: ../gtk/src/TessdataManager.cc:58 ../qt/src/TessdataManager.cc:72 msgid "" "PackageKit is required for managing system-wide tesseract language packs, " "but it was not found. Please use the system package management software to " "manage the tesseract language packs, or switch to use the user tessdata path " "in the configuration dialog." msgstr "" "PackageKit ist erforderlich um tesseract-Sprachpakete zu verwalten, wurde " "aber nicht gefunden. Bitte stattdessen die System-Paketverwaltung benutzen, " "um die tesseract-Sprachpakete zu verwalten, oder in den Programmeinstellugen " "auf benutzerlokale Speicherorte umstellen." #: ../gtk/src/TessdataManager.cc:63 ../qt/src/TessdataManager.cc:77 msgid "Fetching available languages" msgstr "Liste der verfügbare Sprachen wird geladen" #: ../gtk/src/TessdataManager.cc:68 ../gtk/src/TessdataManager.cc:89 #: ../gtk/src/TessdataManager.cc:121 ../qt/src/TessdataManager.cc:82 #: ../qt/src/TessdataManager.cc:94 ../qt/src/TessdataManager.cc:127 msgid "Failed to fetch list of available languages: %1" msgstr "Die Liste der verfügbare Sprachpakete konnte nicht geladen werden: %1" #: ../gtk/src/TessdataManager.cc:100 ../gtk/src/TessdataManager.cc:129 #: ../qt/src/TessdataManager.cc:105 ../qt/src/TessdataManager.cc:114 #: ../qt/src/TessdataManager.cc:136 ../qt/src/TessdataManager.cc:147 msgid "Parsing error: %1" msgstr "Parsing-Fehler: %1" #: ../gtk/src/TessdataManager.cc:191 ../qt/src/TessdataManager.cc:191 msgid "Applying changes..." msgstr "Änderung werden übernommen..." #: ../gtk/src/TessdataManager.cc:252 ../qt/src/TessdataManager.cc:237 msgid "Failed to create directory for tessdata files." msgstr "Ordner für tessdata Sprachdefinitionen konnte nicht erstellt werden." #: ../gtk/src/TessdataManager.cc:261 ../qt/src/TessdataManager.cc:245 msgid "Downloading %1..." msgstr "'%1' wird heruntergeladen..." #: ../gtk/src/TessdataManager.cc:281 ../qt/src/TessdataManager.cc:267 msgid "" "The following files could not be downloaded or removed:\n" "%1\n" "\n" "Check the connectivity and directory permissions." msgstr "" "Die folgende Dateien konnten nicht heruntergeladen bzw. gelöscht werden:\n" "%1\n" "\n" "Verbindung sowie Ordnerrechte überprüfen." #: ../gtk/src/Utils.cc:62 msgid "Yes" msgstr "Ja" #: ../gtk/src/Utils.cc:65 msgid "No" msgstr "Nein" #: ../gtk/src/Utils.cc:74 msgid "Discard" msgstr "Verwerfen" #: ../qt/data/AboutDialog.ui.h:1 msgid "About gImageReader" msgstr "Über gImageReader" #: ../qt/data/AboutDialog.ui.h:3 msgid "" "

 

A graphical frontend to tesseract-ocr

Website

 

" msgstr "" "

 

Eine graphische Oberfläche für Tesseract-" "OCR

Website

 

" #: ../qt/data/AboutDialog.ui.h:4 msgid "Credits" msgstr "Mitwirkende" #: ../qt/data/AboutDialog.ui.h:5 msgid "License" msgstr "Lizenz" #: ../qt/data/ConfigDialog.ui.h:14 msgid "System encoding" msgstr "Systemkodierung" #: ../qt/data/ConfigDialog.ui.h:15 msgid "UTF-8" msgstr "UTF-8" #: ../qt/data/ConfigDialog.ui.h:19 msgid "Text file encoding:" msgstr "Kodierung der Textdateien:" #: ../qt/data/CrashHandler.ui.h:2 #, no-c-format msgid "" "

The application has " "crashed

Apologies for the inconvenience. To help improve the " "application, please consider reporting the issue to manisandro@gmail.com. Please try to describe what you were doing before the application " "crashed. Also, include the information below. Thank you.

" msgstr "" "

Die Anwendung ist " "abgestürzt

Bitte entschuldigen Sie die Unannehmlichkeiten. Wenn " "Sie helfen möchten, die Anwendung zu verbessern, melden Sie das aufgetretene " "Problem bitte an manisandro@gmail.com. Bitte beschreiben Sie auch, was Sie " "machten, bevor die Anwendung abgestürzte. Senden Sie zudem bitte auch die " "untenstehenden Informationen. Danke.

" #: ../qt/data/MainWindow.ui.h:1 msgid "gImageReader" msgstr "gImageReader" #. Remove & from some labels which designer insists in adding #: ../qt/data/MainWindow.ui.h:17 ../qt/src/Ui_MainWindow.hh:49 msgid "Sources" msgstr "Quellen" #: ../qt/data/MainWindow.ui.h:18 msgid "Zoom In" msgstr "Ansicht vergrößern" #: ../qt/data/MainWindow.ui.h:20 msgid "Zoom Out" msgstr "Ansicht verkleinern" #: ../qt/data/MainWindow.ui.h:22 msgid "Normal Size" msgstr "Originalgröße" #: ../qt/data/MainWindow.ui.h:24 msgid "Best Fit" msgstr "Anpassen" #: ../qt/data/MainWindow.ui.h:26 msgid "Rotate Left" msgstr "Gegen den Uhrzeigersinn drehen" #: ../qt/data/MainWindow.ui.h:27 msgid "Rotate left" msgstr "Gegen den Uhrzeigersinn drehen" #: ../qt/data/MainWindow.ui.h:28 msgid "Rotate Right" msgstr "Im Uhrzeigersinn drehen" #: ../qt/data/MainWindow.ui.h:29 msgid "Rotate right" msgstr "Im Uhrzeigersinn drehen" #: ../qt/data/MainWindow.ui.h:30 msgid "Image Controls" msgstr "Bildbearbeitung" #: ../qt/data/MainWindow.ui.h:32 msgid "Autodetect Layout" msgstr "Layout automatisch erkennen" #: ../qt/data/MainWindow.ui.h:34 msgid "Toggle Output Pane" msgstr "Ausgabebereich ein-/ausblenden" #: ../qt/src/MainWindow.cc:518 msgid "Could not read %1: %2" msgstr "%1 konnte nicht gelesen werden: %2" #: ../qt/src/MainWindow.cc:543 msgid "The following dictionary files were installed:%1" msgstr "Folgende Rechtschreibwörterbücher wurden installiert:%1" #: ../qt/src/Ui_MainWindow.hh:50 msgid "Output" msgstr "Ausgabe" #: ../qt/src/Ui_MainWindow.hh:133 msgid "OCR mode:" msgstr "OCR-Modus:" #: ../qt/src/Ui_MainWindow.hh:204 msgid "Remove Image" msgstr "Bild entfernen" #: ../qt/src/Ui_MainWindow.hh:207 msgid "Delete Image" msgstr "Bild löschen" #: ../qt/src/Ui_MainWindow.hh:210 msgid "Clear List" msgstr "Liste leeren" #. Output toolbar #: ../qt/src/Ui_OutputEditorHOCR.hh:39 ../qt/src/Ui_OutputEditorHOCR.hh:40 msgid "Open hOCR file" msgstr "hOCR-Datei öffnen" #: ../qt/src/Ui_OutputEditorHOCR.hh:41 ../qt/src/Ui_OutputEditorHOCR.hh:42 msgid "Save as hOCR text" msgstr "Als hOCR-Text speichern" #: ../qt/src/Ui_OutputEditorText.hh:108 msgid "Strip Line Breaks" msgstr "Zeilenumbrüche entfernen" #: ../qt/src/Ui_OutputEditorText.hh:113 msgid "Find and Replace" msgstr "Suchen und ersetzen" #: ../qt/src/Ui_OutputEditorText.hh:122 msgid "Save Output" msgstr "Ausgabe speichern" #: ../qt/src/Ui_OutputEditorText.hh:124 msgid "Clear Output" msgstr "Ausgabe löschen" #~ msgid "" #~ "<html><head/><body><p><span style=" font-" #~ "weight:600;">The application has crashed</span></p>" #~ "<p>Apologies for the inconvenience. To help improve the " #~ "application, please consider reporting the issue to <a href="" #~ "mailto:manisandro@gmail.com?subject=gImageReader%20Crash">" #~ "manisandro@gmail.com</a>. Please try to describe what you were " #~ "doing before the application crashed. Also, include the information " #~ "below. Thank you.</p></body></html>" #~ msgstr "" #~ "<html><head/><body><p><span style=" font-" #~ "weight:600;">Die Anwendung ist abgestürzt</span></p>" #~ "<Bitte entschuldigen Sie die Unannehmlichkeiten. Wenn Sie helfen " #~ "möchten, die Anwendung zu verbessern, melden Sie das aufgetretene Problem " #~ "bitte an manisandro@gmail.com. Bitte beschreiben Sie auch, was Sie " #~ "machten, bevor die Anwendung abgestürzte. Senden Sie zudem bitte auch die " #~ "untenstehenden Informationen. Danke." #~ msgid "" #~ "<small><b>Example:</b> 1-10, 13, 14-18</small>" #~ msgstr "Beispiel: 1-10, 13, 14-18" #~ msgid "Detect script and orientation" #~ msgstr "Skript und Ausrichtung erkennen" #~ msgid "" #~ "PackageKit is required for managing tesseract language packs, but it was " #~ "not found. Please use the system package management software to manage " #~ "the tesseract language packs." #~ msgstr "" #~ "PackageKit ist erforderlich um tesseract-Sprachpakete zu verwalten, wurde " #~ "aber nicht gefunden. Bitte stattdessen die System-Paketverwaltung " #~ "benutzen, um die tesseract-Sprachpakete zu verwalten." #~ msgid "" #~ "\n" #~ "\tFailed to initialize tesseract" #~ msgstr "" #~ "\n" #~ "\tTesseract konnte nicht initialisiert werden" #~ msgid "So&urces" #~ msgstr "Quellen" #~ msgid "&Output" #~ msgstr "Ausgabe" #~ msgid "To recognize specific areas, drag rectangles over them." #~ msgstr "" #~ "Um bestimmte Bereiche zu erkennen, können Rechtecke darüber gezogen " #~ "werden." #~ msgid "Rendering image..." #~ msgstr "Bild wird gerendert..." #~ msgid "en_US" #~ msgstr "de_DE" #, fuzzy #~ msgid "So&urces" #~ msgstr "Quellen" #, fuzzy #~ msgid "&Output" #~ msgstr "Ausgabe" #~ msgid "Configuration" #~ msgstr "Konfiguration" gImageReader-3.2.3/po/el.po000066400000000000000000001702501312567024200154200ustar00rootroot00000000000000# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # Sandro Mani , 2016, 2017. # Dimitris Spingos (ΔημήτÏης Σπίγγος) , 2017. msgid "" msgstr "" "Project-Id-Version: gImageReader 3.1.2\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2017-07-01 10:34+0200\n" "PO-Revision-Date: 2017-06-30 19:59+0100\n" "Last-Translator: Sandro Mani \n" "Language-Team: English \n" "Language: el\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" "X-Generator: Lokalize 2.0\n" "X-Poedit-SourceCharset: UTF-8\n" #: ../gtk/data/appmenu.ui.h:1 ../qt/src/Ui_MainWindow.hh:165 msgid "Redetect Languages" msgstr "Επανανίχνευση" #: ../gtk/data/appmenu.ui.h:2 ../gtk/data/gimagereader.ui.h:39 #: ../qt/data/ConfigDialog.ui.h:1 ../qt/src/Ui_MainWindow.hh:168 msgid "Preferences" msgstr "ΠÏοτιμήσεις" #: ../gtk/data/appmenu.ui.h:3 ../gtk/data/gimagereader.ui.h:40 #: ../gtk/src/MainWindow.cc:484 ../qt/src/MainWindow.cc:445 #: ../qt/src/Ui_MainWindow.hh:173 msgid "Help" msgstr "Βοήθεια" #: ../gtk/data/appmenu.ui.h:4 ../qt/data/AboutDialog.ui.h:2 #: ../qt/src/Ui_MainWindow.hh:176 msgid "About" msgstr "ΠεÏί" #: ../gtk/data/appmenu.ui.h:5 msgid "Quit" msgstr "Έξοδος" #: ../gtk/data/crashhandler.ui.h:1 ../qt/src/CrashHandler.cc:36 msgid "Regenerate backtrace" msgstr "ΕπαναδημιουÏγία οπισθοανίχνευσης" #: ../gtk/data/crashhandler.ui.h:2 msgid "The application has crashed" msgstr "Η εφαÏμογή κατέÏÏευσε" #: ../gtk/data/crashhandler.ui.h:4 #, no-c-format msgid "" "Apologies for the inconvenience. To help improve the application, please " "consider reporting the issue to manisandro@gmail.com. Please try to " "describe what you were doing before the application crashed. Also, include " "the information below. Thank you." msgstr "" "Συγνώμη για το Ï€Ïόβλημα. Για να βοηθήσετε στην βελτίωση της εφαÏμογής, " "παÏακαλοÏμε να στείλετε μια αναφοÏά του Ï€Ïοβλήματος στο manisandro@gmail.com. ΠαÏακαλοÏμε, Ï€Ïοσπαθήστε να πεÏιγÏάψετε τι κάνατε Ï€Ïιν να καταÏÏεÏσει η " "εφαÏμογή. Επίσης, να συμπεÏιλάβετε την παÏακάτω πληÏοφοÏία. Σας ευχαÏιστοÏμε." #: ../gtk/data/editor_hocr.ui.h:1 ../qt/data/PdfExportDialog.ui.h:1 msgid "PDF Export" msgstr "Εξαγωγή ως PDF" #: ../gtk/data/editor_hocr.ui.h:2 ../gtk/data/gimagereader.ui.h:55 #: ../gtk/src/Acquirer.cc:42 ../gtk/src/FileDialogs.cc:150 #: ../gtk/src/Utils.cc:68 ../qt/data/ConfigDialog.ui.h:27 #: ../qt/data/MainWindow.ui.h:14 msgid "Cancel" msgstr "ΑκÏÏωση" #: ../gtk/data/editor_hocr.ui.h:3 ../gtk/data/gimagereader.ui.h:41 #: ../gtk/src/FileDialogs.cc:151 ../gtk/src/Utils.cc:59 #: ../qt/data/ConfigDialog.ui.h:26 msgid "OK" msgstr "Εντάξει" #: ../gtk/data/editor_hocr.ui.h:4 ../qt/data/PdfExportDialog.ui.h:2 msgid "Output mode:" msgstr "Κατάσταση εξόδου:" #: ../gtk/data/editor_hocr.ui.h:5 ../qt/data/PdfExportDialog.ui.h:3 msgid "PDF" msgstr "PDF" #: ../gtk/data/editor_hocr.ui.h:6 ../qt/data/PdfExportDialog.ui.h:4 msgid "PDF with invisible text overlay" msgstr "PDF με αόÏατη επικάλυψη κειμένου" #: ../gtk/data/editor_hocr.ui.h:7 ../qt/data/PdfExportDialog.ui.h:16 msgid "Format:" msgstr "ΜοÏφή:" #: ../gtk/data/editor_hocr.ui.h:8 ../qt/data/PdfExportDialog.ui.h:17 msgid "Compression:" msgstr "Συμπίεση:" #: ../gtk/data/editor_hocr.ui.h:9 ../qt/data/PdfExportDialog.ui.h:14 msgid "Compression quality:" msgstr "Ποιότητα συμπίεσης:" #: ../gtk/data/editor_hocr.ui.h:10 ../qt/data/PdfExportDialog.ui.h:15 msgid "DPI:" msgstr "DPI:" #: ../gtk/data/editor_hocr.ui.h:11 ../qt/data/PdfExportDialog.ui.h:18 msgid "Dithering algorithm:" msgstr "ΑλγόÏιθμος Ï€Ïόσμειξης:" #: ../gtk/data/editor_hocr.ui.h:12 ../qt/data/PdfExportDialog.ui.h:13 msgid "Image settings:" msgstr "Ρυθμίσεις εικόνας:" #: ../gtk/data/editor_hocr.ui.h:13 ../qt/data/PdfExportDialog.ui.h:11 msgid "Document font:" msgstr "ΓÏαμματοσειÏά εγγÏάφου:" #: ../gtk/data/editor_hocr.ui.h:14 ../qt/data/PdfExportDialog.ui.h:7 msgid "Uniformize line and word spacing" msgstr "Ομογενοποίηση γÏαμμής και απόστασης λέξης" #: ../gtk/data/editor_hocr.ui.h:15 ../qt/data/PdfExportDialog.ui.h:10 msgid "Use detected font sizes" msgstr "ΧÏήση των μεγεθών γÏαμματοσειÏάς που ανιχνεÏτηκαν" #: ../gtk/data/editor_hocr.ui.h:16 ../qt/data/PdfExportDialog.ui.h:8 msgid "Preserve spaces wider than:" msgstr "ΔιατήÏηση διαστημάτων μεγαλÏτεÏων από:" #: ../gtk/data/editor_hocr.ui.h:17 ../qt/data/PdfExportDialog.ui.h:12 msgid "characters" msgstr "χαÏακτήÏες" #: ../gtk/data/editor_hocr.ui.h:18 ../qt/data/PdfExportDialog.ui.h:9 msgid "Scale:" msgstr "Κλίμακα:" #: ../gtk/data/editor_hocr.ui.h:19 ../qt/data/PdfExportDialog.ui.h:6 msgid "Text settings:" msgstr "Ρυθμίσεις κειμένου:" #: ../gtk/data/editor_hocr.ui.h:20 ../qt/data/PdfExportDialog.ui.h:5 msgid "Show preview" msgstr "Εμφάνιση Ï€Ïοεπισκόπησης" #: ../gtk/data/editor_hocr.ui.h:21 ../gtk/data/editor_text.ui.h:26 #: ../qt/src/Ui_OutputEditorText.hh:123 msgid "Save output" msgstr "Αποθήκευση εξόδου" #: ../gtk/data/editor_hocr.ui.h:22 ../qt/src/Ui_OutputEditorHOCR.hh:44 #: ../qt/src/Ui_OutputEditorHOCR.hh:45 msgid "Export to PDF" msgstr "Εξαγωγή σε PDF" #: ../gtk/data/editor_hocr.ui.h:23 ../gtk/data/editor_text.ui.h:27 #: ../qt/src/Ui_OutputEditorHOCR.hh:47 ../qt/src/Ui_OutputEditorHOCR.hh:48 #: ../qt/src/Ui_OutputEditorText.hh:125 msgid "Clear output" msgstr "ΚαθαÏισμός εξόδου" #: ../gtk/data/editor_hocr.ui.h:24 ../qt/src/Ui_OutputEditorHOCR.hh:75 msgid "Properties" msgstr "Ιδιότητες" #: ../gtk/data/editor_hocr.ui.h:25 ../qt/src/Ui_OutputEditorHOCR.hh:79 msgid "Source" msgstr "ΠÏοέλευση" #. Output insert mode #: ../gtk/data/editor_text.ui.h:1 ../qt/src/Ui_OutputEditorText.hh:59 msgid "Append to current text" msgstr "ΠÏοσάÏτηση στο υφιστάμενο κείμενο" #: ../gtk/data/editor_text.ui.h:2 ../qt/src/Ui_OutputEditorText.hh:60 msgid "Insert at cursor" msgstr "Εισαγωγή στον δÏομέα" #: ../gtk/data/editor_text.ui.h:3 ../qt/src/Ui_OutputEditorText.hh:61 msgid "Replace current text" msgstr "Αντικατάσταση του υφιστάμενου κειμένου" #: ../gtk/data/editor_text.ui.h:4 ../qt/src/SubstitutionsManager.cc:37 #: ../qt/src/Ui_OutputEditorText.hh:177 msgid "Substitutions" msgstr "Υποκαταστάσεις" #: ../gtk/data/editor_text.ui.h:5 ../qt/src/SubstitutionsManager.cc:42 #: ../qt/src/SubstitutionsManager.cc:43 msgid "Open" msgstr "Άνοιγμα" #: ../gtk/data/editor_text.ui.h:6 ../gtk/src/Utils.cc:71 #: ../qt/src/SubstitutionsManager.cc:45 ../qt/src/SubstitutionsManager.cc:46 msgid "Save" msgstr "Αποθήκευση" #: ../gtk/data/editor_text.ui.h:7 ../qt/src/SubstitutionsManager.cc:48 #: ../qt/src/SubstitutionsManager.cc:49 msgid "Clear" msgstr "ΚαθαÏισμός" #: ../gtk/data/editor_text.ui.h:8 ../qt/data/ConfigDialog.ui.h:16 #: ../qt/src/SubstitutionsManager.cc:51 ../qt/src/SubstitutionsManager.cc:52 msgid "Add" msgstr "ΠÏοσθήκη" #: ../gtk/data/editor_text.ui.h:9 ../gtk/src/OutputEditorHOCR.cc:1202 #: ../gtk/src/OutputEditorHOCR.cc:1213 ../qt/data/ConfigDialog.ui.h:17 #: ../qt/src/OutputEditorHOCR.cc:998 ../qt/src/OutputEditorHOCR.cc:1000 #: ../qt/src/SubstitutionsManager.cc:54 ../qt/src/SubstitutionsManager.cc:55 msgid "Remove" msgstr "ΑφαίÏεση" #: ../gtk/data/editor_text.ui.h:10 ../gtk/data/gimagereader.ui.h:73 msgid "Apply" msgstr "ΕφαÏμογή" #: ../gtk/data/editor_text.ui.h:11 ../gtk/data/gimagereader.ui.h:74 msgid "Close" msgstr "Κλείσιμο" #. Output postprocessing #: ../gtk/data/editor_text.ui.h:12 ../qt/src/Ui_OutputEditorText.hh:69 msgid "Keep line break if..." msgstr "ΔιατήÏηση της αλλαγής γÏαμμής αν..." #: ../gtk/data/editor_text.ui.h:13 ../qt/src/Ui_OutputEditorText.hh:71 msgid "Preceded by end mark (.?!)" msgstr "ΠÏοηγείται ένδειξη τέλους (.?!)" #: ../gtk/data/editor_text.ui.h:14 ../qt/src/Ui_OutputEditorText.hh:73 msgid "Preceded or succeeded by quote" msgstr "ΠÏοηγοÏνται ή ακολουθοÏν εισαγωγικά" #: ../gtk/data/editor_text.ui.h:15 ../qt/src/Ui_OutputEditorText.hh:75 msgid "Other options" msgstr "Άλλες επιλογές" #: ../gtk/data/editor_text.ui.h:16 ../qt/src/Ui_OutputEditorText.hh:77 msgid "Join hyphenated words" msgstr "Ένωση λέξεων με ενωτικό" #: ../gtk/data/editor_text.ui.h:17 ../qt/src/Ui_OutputEditorText.hh:79 msgid "Collapse whitespace" msgstr "ΣÏμπτυξη ÎºÎµÎ½Î¿Ï Î´Î¹Î±ÏƒÏ„Î®Î¼Î±Ï„Î¿Ï‚" #: ../gtk/data/editor_text.ui.h:18 ../qt/src/Ui_OutputEditorText.hh:81 msgid "Preserve paragraphs" msgstr "ΔιατήÏηση παÏαγÏάφων" #: ../gtk/data/editor_text.ui.h:19 ../qt/src/Ui_OutputEditorText.hh:83 msgid "Visual aids" msgstr "Οπτικά βοηθήματα" #: ../gtk/data/editor_text.ui.h:20 ../qt/src/Ui_OutputEditorText.hh:85 msgid "Draw whitespace" msgstr "ΧάÏαξη ÎºÎµÎ½Î¿Ï Î´Î¹Î±ÏƒÏ„Î®Î¼Î±Ï„Î¿Ï‚" #: ../gtk/data/editor_text.ui.h:21 ../gtk/data/gimagereader.ui.h:31 #: ../qt/src/Ui_OutputEditorText.hh:102 msgid "Select insert mode" msgstr "Επιλογή κατάστασης εισαγωγής" #: ../gtk/data/editor_text.ui.h:22 ../qt/src/Ui_OutputEditorText.hh:109 msgid "Strip line breaks on selected text" msgstr "ΑφαίÏεση αλλαγών γÏαμμής στο επιλεγμένο κείμενο" #: ../gtk/data/editor_text.ui.h:23 ../qt/src/Ui_OutputEditorText.hh:114 msgid "Find and replace" msgstr "ΕÏÏεση και αντικατάσταση" #: ../gtk/data/editor_text.ui.h:24 ../qt/src/Ui_OutputEditorText.hh:116 #: ../qt/src/Ui_OutputEditorText.hh:117 msgid "Undo" msgstr "ΑναίÏεση" #: ../gtk/data/editor_text.ui.h:25 ../qt/src/Ui_OutputEditorText.hh:119 #: ../qt/src/Ui_OutputEditorText.hh:120 msgid "Redo" msgstr "ΑκÏÏωση αναίÏεσης" #: ../gtk/data/editor_text.ui.h:28 ../qt/src/Ui_OutputEditorText.hh:149 msgid "Find" msgstr "ΕÏÏεση" #: ../gtk/data/editor_text.ui.h:29 ../qt/src/Ui_OutputEditorText.hh:153 #: ../qt/src/Ui_OutputEditorText.hh:168 msgid "Replace" msgstr "Αντικατάσταση" #: ../gtk/data/editor_text.ui.h:30 ../qt/src/Ui_OutputEditorText.hh:173 msgid "Replace all" msgstr "Αντικατάσταση όλων" #: ../gtk/data/editor_text.ui.h:31 ../qt/src/Ui_OutputEditorText.hh:163 msgid "Find previous" msgstr "ΕÏÏεση Ï€ÏοηγοÏμενου" #: ../gtk/data/editor_text.ui.h:32 ../qt/src/Ui_OutputEditorText.hh:158 msgid "Find next" msgstr "ΕÏÏεση επόμενου" #: ../gtk/data/editor_text.ui.h:33 ../qt/src/Ui_OutputEditorText.hh:182 msgid "Match case" msgstr "ΤαίÏιασμα πεζών-κεφαλαίων" #: ../gtk/data/gimagereader.ui.h:1 ../qt/src/Ui_MainWindow.hh:65 msgid "Rotate current page" msgstr "ΠεÏιστÏοφή Ï„Ïέχουσας σελίδας" #: ../gtk/data/gimagereader.ui.h:2 ../qt/src/Ui_MainWindow.hh:66 msgid "Rotate all pages" msgstr "ΠεÏιστÏοφή όλων των σελίδων" #: ../gtk/data/gimagereader.ui.h:3 ../qt/data/MainWindow.ui.h:35 msgid "Toggle output pane" msgstr "Εναλλαγή παÏαθÏÏου εξόδου" #. Sources toolbar #: ../gtk/data/gimagereader.ui.h:4 ../qt/src/Ui_MainWindow.hh:187 msgid "Recent" msgstr "ΠÏόσφατα" #: ../gtk/data/gimagereader.ui.h:5 ../qt/src/Ui_MainWindow.hh:188 msgid "Paste" msgstr "Επικόλληση" #: ../gtk/data/gimagereader.ui.h:6 ../qt/src/Ui_MainWindow.hh:189 msgid "Take Screenshot" msgstr "Λήψη στιγμιοτÏπου" #: ../gtk/data/gimagereader.ui.h:7 ../qt/src/Ui_MainWindow.hh:200 msgid "Add images" msgstr "ΠÏοσθήκη εικόνων" #: ../gtk/data/gimagereader.ui.h:8 ../qt/src/Ui_MainWindow.hh:199 msgid "Add Images" msgstr "ΠÏοσθήκη εικόνων" #: ../gtk/data/gimagereader.ui.h:9 ../qt/src/Ui_MainWindow.hh:205 msgid "Remove image from list" msgstr "ΑφαίÏεση εικόνας από τη λίστα" #: ../gtk/data/gimagereader.ui.h:10 ../qt/src/Ui_MainWindow.hh:208 msgid "Delete image" msgstr "ΔιαγÏαφή εικόνας" #: ../gtk/data/gimagereader.ui.h:11 ../qt/src/Ui_MainWindow.hh:211 msgid "Clear list" msgstr "ΚαθαÏισμός λίστας" #: ../gtk/data/gimagereader.ui.h:12 ../qt/data/MainWindow.ui.h:6 msgid "Files" msgstr "ΑÏχεία" #: ../gtk/data/gimagereader.ui.h:13 ../qt/data/MainWindow.ui.h:16 msgid "Device:" msgstr "Συσκευή:" #: ../gtk/data/gimagereader.ui.h:14 ../qt/data/MainWindow.ui.h:15 #: ../qt/src/TessdataManager.cc:57 msgid "Refresh" msgstr "Ανανέωση" #: ../gtk/data/gimagereader.ui.h:15 ../qt/data/MainWindow.ui.h:12 msgid "Output:" msgstr "Έξοδος:" #: ../gtk/data/gimagereader.ui.h:16 ../qt/data/MainWindow.ui.h:9 msgid "Mode:" msgstr "Κατάσταση:" #: ../gtk/data/gimagereader.ui.h:17 ../gtk/src/OutputEditorHOCR.cc:362 #: ../qt/data/MainWindow.ui.h:11 ../qt/src/OutputEditorHOCR.cc:273 msgid "Color" msgstr "ΧÏώμα" #: ../gtk/data/gimagereader.ui.h:18 ../gtk/src/OutputEditorHOCR.cc:365 #: ../qt/data/MainWindow.ui.h:10 ../qt/src/OutputEditorHOCR.cc:275 #: ../qt/src/OutputEditorHOCR.cc:277 msgid "Grayscale" msgstr "Κλίμακα του γκÏίζου" #: ../gtk/data/gimagereader.ui.h:19 ../qt/data/MainWindow.ui.h:8 msgid "Resolution:" msgstr "Ανάλυση:" #: ../gtk/data/gimagereader.ui.h:20 ../qt/data/MainWindow.ui.h:13 msgid "Scan" msgstr "ΣάÏωση" #: ../gtk/data/gimagereader.ui.h:21 ../qt/data/MainWindow.ui.h:7 msgid "Acquire" msgstr "Λήψη" #: ../gtk/data/gimagereader.ui.h:22 ../qt/data/MainWindow.ui.h:2 msgid "Brightness" msgstr "Φωτεινότητα" #: ../gtk/data/gimagereader.ui.h:23 ../qt/data/MainWindow.ui.h:3 msgid "Contrast" msgstr "Αντίθεση" #: ../gtk/data/gimagereader.ui.h:24 ../qt/data/MainWindow.ui.h:4 msgid "Resolution" msgstr "Ανάλυση" #: ../gtk/data/gimagereader.ui.h:25 ../qt/data/MainWindow.ui.h:5 msgid "Invert colors" msgstr "ΑντιστÏοφή χÏωμάτων" #: ../gtk/data/gimagereader.ui.h:26 ../qt/data/MainWindow.ui.h:19 msgid "Zoom in" msgstr "Μεγέθυνση" #: ../gtk/data/gimagereader.ui.h:27 ../qt/data/MainWindow.ui.h:21 msgid "Zoom out" msgstr "ΣμίκÏυνση" #: ../gtk/data/gimagereader.ui.h:28 ../qt/data/MainWindow.ui.h:23 msgid "Normal size" msgstr "Κανονικό μέγεθος" #: ../gtk/data/gimagereader.ui.h:29 ../qt/data/MainWindow.ui.h:25 msgid "Best fit" msgstr "ΆÏιστη Ï€ÏοσαÏμογή" #: ../gtk/data/gimagereader.ui.h:30 ../qt/src/Ui_MainWindow.hh:74 msgid "Select rotation mode" msgstr "Επιλογή κατάστασης πεÏιστÏοφής" #: ../gtk/data/gimagereader.ui.h:32 ../qt/data/MainWindow.ui.h:31 msgid "Image controls" msgstr "Στοιχεία ελέγχου εικόνας" #: ../gtk/data/gimagereader.ui.h:33 ../qt/src/Ui_MainWindow.hh:137 msgid "Plain text" msgstr "Απλό κείμενο" #: ../gtk/data/gimagereader.ui.h:34 ../qt/src/Ui_MainWindow.hh:137 msgid "hOCR, PDF" msgstr "hOCR, PDF" #: ../gtk/data/gimagereader.ui.h:35 ../qt/data/MainWindow.ui.h:33 msgid "Autodetect layout" msgstr "Αυτόματη ανίχνευση διάταξης" #: ../gtk/data/gimagereader.ui.h:36 msgid "Recognize all" msgstr "ΑναγνώÏιση όλων" #: ../gtk/data/gimagereader.ui.h:37 msgid "Select language" msgstr "Επιλογή γλώσσας" #: ../gtk/data/gimagereader.ui.h:38 msgid "A graphical frontend to tesseract-ocr" msgstr "Μια γÏαφική διεπαφή χÏήστη στο tesseract-ocr" #: ../gtk/data/gimagereader.ui.h:42 msgid "Output pane orientation:" msgstr "ΠÏοσανατολισμός παÏαθÏÏου εξόδου:" #: ../gtk/data/gimagereader.ui.h:43 msgid "Horizontal" msgstr "ΟÏιζόντιος" #: ../gtk/data/gimagereader.ui.h:44 msgid "Vertical" msgstr "Κάθετος" #: ../gtk/data/gimagereader.ui.h:45 ../qt/data/ConfigDialog.ui.h:18 msgid "Query to install missing spellcheck dictionaries" msgstr "ΕÏώτηση για εγκατάσταση λεξικών οÏθογÏÎ±Ï†Î¹ÎºÎ¿Ï ÎµÎ»Î­Î³Ï‡Î¿Ï… που λείπουν" #: ../gtk/data/gimagereader.ui.h:46 ../qt/data/ConfigDialog.ui.h:4 msgid "Automatically check for new program versions" msgstr "Αυτόματος έλεγχος για νέες εκδόσεις του Ï€ÏογÏάμματος" #: ../gtk/data/gimagereader.ui.h:47 ../qt/data/ConfigDialog.ui.h:3 msgid "Predefined language definitions:" msgstr "ΠÏοκαθοÏισμένοι οÏισμοί γλωσσών:" #: ../gtk/data/gimagereader.ui.h:48 ../qt/data/ConfigDialog.ui.h:12 msgid "Additional language definitions:" msgstr "ΠÏόσθετοι οÏισμοί γλωσσών:" #: ../gtk/data/gimagereader.ui.h:49 ../qt/data/ConfigDialog.ui.h:20 msgid "The prefix of the tesseract language data file" msgstr "Το Ï€Ïόθημα του αÏχείου δεδομένων γλώσσας του tesseract" #: ../gtk/data/gimagereader.ui.h:50 ../qt/data/ConfigDialog.ui.h:21 msgid "Prefix" msgstr "ΠÏόθημα" #: ../gtk/data/gimagereader.ui.h:51 ../qt/data/ConfigDialog.ui.h:22 msgid "The ISO 639-1 language code followed by the country code" msgstr "Ο κωδικός γλώσσας ISO 639-1 ακολουθοÏμενος από τον κωδικό της χώÏας" #: ../gtk/data/gimagereader.ui.h:52 ../qt/data/ConfigDialog.ui.h:23 msgid "ISO Code" msgstr "Κωδικός ISO" #: ../gtk/data/gimagereader.ui.h:53 ../qt/data/ConfigDialog.ui.h:24 msgid "The name of the language" msgstr "Το όνομα της γλώσσας" #: ../gtk/data/gimagereader.ui.h:54 ../qt/data/ConfigDialog.ui.h:25 msgid "Name" msgstr "Όνομα" #: ../gtk/data/gimagereader.ui.h:56 ../qt/data/ConfigDialog.ui.h:5 msgid "Output pane font:" msgstr "ΓÏαμματοσειÏά παÏαθÏÏου εξόδου:" #: ../gtk/data/gimagereader.ui.h:57 ../qt/data/ConfigDialog.ui.h:2 msgid "Default" msgstr "ΠÏοεπιλογή" #: ../gtk/data/gimagereader.ui.h:58 ../qt/data/ConfigDialog.ui.h:6 msgid "Language data locations:" msgstr "Τοποθεσίες δεδομένων γλώσσας:" #: ../gtk/data/gimagereader.ui.h:59 ../qt/data/ConfigDialog.ui.h:13 msgid "Language definitions path:" msgstr "ΔιαδÏομή οÏισμών γλώσσας:" #: ../gtk/data/gimagereader.ui.h:60 ../qt/data/ConfigDialog.ui.h:28 msgid "Spelling dictionaries path:" msgstr "ΔιαδÏομή οÏθογÏαφικών λεξικών:" #: ../gtk/data/gimagereader.ui.h:61 ../qt/data/ConfigDialog.ui.h:10 msgid "System-wide paths" msgstr "ΔιαδÏομές ολόκληÏου του συστήματος" #: ../gtk/data/gimagereader.ui.h:62 ../qt/data/ConfigDialog.ui.h:11 msgid "User paths" msgstr "ΔιαδÏομές χÏήστη" #: ../gtk/data/gimagereader.ui.h:63 ../qt/data/PageRangeDialog.ui.h:1 msgid "Page Range" msgstr "ΠεÏιοχή σελίδων" #: ../gtk/data/gimagereader.ui.h:64 ../qt/data/PageRangeDialog.ui.h:2 msgid "Page range:" msgstr "ΠεÏιοχή σελίδων:" #: ../gtk/data/gimagereader.ui.h:65 ../qt/data/PageRangeDialog.ui.h:3 msgid "Example: 1-10, 13, 14-18" msgstr "ΠαÏάδειγμα: 1-10, 13, 14-18" #: ../gtk/data/gimagereader.ui.h:66 ../qt/data/PageRangeDialog.ui.h:4 msgid "Recognition area:" msgstr "ΠεÏιοχή αναγνώÏισης:" #: ../gtk/data/gimagereader.ui.h:67 ../gtk/src/Recognizer.cc:403 #: ../qt/data/PageRangeDialog.ui.h:5 ../qt/src/Recognizer.cc:381 msgid "Entire page" msgstr "ΟλόκληÏη σελίδα" #: ../gtk/data/gimagereader.ui.h:68 ../qt/data/PageRangeDialog.ui.h:6 msgid "Autodetect" msgstr "Αυτόματη ανίχνευση" #: ../gtk/data/gimagereader.ui.h:69 ../qt/data/PageRangeDialog.ui.h:7 #, fuzzy msgid "Prepend to output text:" msgstr "ΠÏοσάÏτηση στο υφιστάμενο κείμενο" #: ../gtk/data/gimagereader.ui.h:70 ../qt/data/PageRangeDialog.ui.h:8 msgid "Source filename" msgstr "" #: ../gtk/data/gimagereader.ui.h:71 ../qt/data/PageRangeDialog.ui.h:9 #, fuzzy msgid "Source page" msgstr "ΠÏοέλευση" #: ../gtk/data/gimagereader.ui.h:72 ../qt/src/TessdataManager.cc:47 msgid "Tessdata Manager" msgstr "ΔιαχειÏιστής Tessdata" #: ../gtk/data/gimagereader.ui.h:75 ../qt/src/TessdataManager.cc:49 msgid "Manage installed languages:" msgstr "ΔιαχείÏιση εγκατεστημένων γλωσσών:" #: ../gtk/data/gimagereader.ui.h:76 ../qt/src/DisplayerToolSelect.cc:240 msgid "Delete" msgstr "ΔιαγÏαφή" #: ../gtk/data/gimagereader.ui.h:77 ../qt/src/DisplayerToolSelect.cc:226 msgid "Order:" msgstr "ΣειÏά:" #: ../gtk/data/gimagereader.ui.h:78 ../gtk/src/DisplayerToolHOCR.cc:28 #: ../qt/src/DisplayerToolHOCR.cc:30 ../qt/src/DisplayerToolSelect.cc:241 msgid "Recognize" msgstr "ΑναγνώÏιση" #: ../gtk/data/gimagereader.ui.h:79 ../qt/src/DisplayerToolSelect.cc:242 msgid "Recognize to clipboard" msgstr "Η αναγνώÏιση στο Ï€ÏόχειÏο" #: ../gtk/data/gimagereader.ui.h:80 ../qt/src/DisplayerToolSelect.cc:243 msgid "Save as image" msgstr "Αποθήκευση ως εικόνα" #: ../gtk/data/gimagereader.ui.h:81 ../qt/src/Recognizer.cc:76 msgid "Current Page" msgstr "ΤÏέχουσα σελίδα" #: ../gtk/data/gimagereader.ui.h:82 ../qt/src/Recognizer.cc:79 msgid "Multiple Pages..." msgstr "Πολλαπλές σελίδες..." #: ../gtk/src/Acquirer.cc:83 ../qt/src/Acquirer.cc:63 msgid "scan.png" msgstr "σαÏωμένο.png" #: ../gtk/src/Acquirer.cc:96 ../qt/src/Acquirer.cc:80 msgid "Images" msgstr "Εικόνες" #: ../gtk/src/Acquirer.cc:97 ../qt/src/Acquirer.cc:81 msgid "Choose Output Filename..." msgstr "Επιλογή ονόματος αÏχείου εξόδου..." #: ../gtk/src/Acquirer.cc:112 ../qt/src/Acquirer.cc:96 msgid "Failed to initialize the scanning backend." msgstr "Αποτυχία αÏχικοποίησης της παÏασκηνιακής σάÏωσης" #: ../gtk/src/Acquirer.cc:121 ../qt/src/Acquirer.cc:102 msgid "Scan failed" msgstr "Αποτυχία σάÏωσης" #: ../gtk/src/Acquirer.cc:139 ../qt/src/Acquirer.cc:118 msgid "No scanners were detected." msgstr "Δεν ανιχνεÏτηκαν σαÏωτές." #: ../gtk/src/Acquirer.cc:156 ../gtk/src/Acquirer.cc:173 #: ../qt/src/Acquirer.cc:132 ../qt/src/Acquirer.cc:149 msgid "Starting scan..." msgstr "ΈναÏξη σάÏωσης..." #: ../gtk/src/Acquirer.cc:169 ../qt/src/Acquirer.cc:145 msgid "Opening device..." msgstr "Άνοιγμα συσκευής..." #: ../gtk/src/Acquirer.cc:171 ../qt/src/Acquirer.cc:147 msgid "Setting options..." msgstr "ΟÏισμός επιλογών..." #: ../gtk/src/Acquirer.cc:175 ../qt/src/Acquirer.cc:151 msgid "Getting parameters..." msgstr "Λήψη παÏαμέτÏων..." #: ../gtk/src/Acquirer.cc:177 ../qt/src/Acquirer.cc:153 msgid "Transferring data..." msgstr "ΜεταφοÏά δεδομένων..." #: ../gtk/src/Acquirer.cc:184 ../qt/src/Acquirer.cc:160 msgid "Canceling scan..." msgstr "ΑκÏÏωση σάÏωσης..." #: ../gtk/src/Config.cc:297 ../qt/data/ConfigDialog.ui.h:7 msgid "Filename prefix" msgstr "ΠÏόθημα ονόματος αÏχείου" #: ../gtk/src/Config.cc:298 ../qt/data/ConfigDialog.ui.h:8 msgid "Code" msgstr "Κωδικός" #: ../gtk/src/Config.cc:299 ../qt/data/ConfigDialog.ui.h:9 msgid "Native name" msgstr "Τοπικό όνομα" #: ../gtk/src/CrashHandler.cc:26 ../gtk/src/CrashHandler.cc:43 #: ../qt/src/CrashHandler.cc:34 msgid "Crash Handler" msgstr "ΧειÏισμός κατάÏÏευσης" #: ../gtk/src/CrashHandler.cc:45 ../qt/src/CrashHandler.cc:29 msgid "Your work has been saved under %1." msgstr "Η εÏγασία σας έχει αποθηκευτεί στο %1." #: ../gtk/src/CrashHandler.cc:47 ../qt/src/CrashHandler.cc:31 msgid "There was no unsaved work." msgstr "Δεν υπάÏχει καμία μη αποθηκευμένη εÏγασία." #: ../gtk/src/CrashHandler.cc:106 ../qt/src/CrashHandler.cc:60 msgid "Failed to obtain backtrace. Is gdb installed?" msgstr "Αποτυχία λήψης οπισθοανίχνευσης. Είναι εγκατεστημένο το gdb;" #: ../gtk/src/Displayer.cc:261 ../qt/src/Displayer.cc:231 msgid "Failed to load image" msgstr "Αποτυχία φόÏτωσης εικόνας" #: ../gtk/src/Displayer.cc:261 ../qt/src/Displayer.cc:231 msgid "" "The file might not be an image or be corrupt:\n" "%1" msgstr "" "Το αÏχείο μποÏεί να μην είναι εικόνα ή να είναι αλλοιωμένο:\n" "%1" #: ../gtk/src/DisplayerToolSelect.cc:39 ../qt/src/DisplayerToolSelect.cc:40 msgid "selection.png" msgstr "επιλεγμένο.png" #: ../gtk/src/DisplayerToolSelect.cc:148 ../qt/src/DisplayerToolSelect.cc:139 msgid "PNG Images" msgstr "Εικόνες PNG" #: ../gtk/src/DisplayerToolSelect.cc:149 ../qt/src/DisplayerToolSelect.cc:139 msgid "Save Selection Image" msgstr "Αποθήκευση εικόνας επιλογής" #: ../gtk/src/DisplayerToolSelect.cc:157 ../qt/src/DisplayerToolSelect.cc:147 msgid "Recognize all" msgstr "ΑναγνώÏιση όλων" #: ../gtk/src/DisplayerToolSelect.cc:157 ../qt/src/DisplayerToolSelect.cc:147 msgid "Recognize selection" msgstr "ΑναγνώÏιση επιλογής" #: ../gtk/src/DisplayerToolSelect.cc:194 ../qt/src/DisplayerToolSelect.cc:184 msgid "Performing layout analysis" msgstr "Εκτέλεση ανάλυσης διάταξης" #: ../gtk/src/FileDialogs.cc:237 msgid "" "A file named \"%1\" already exists. Are you sure you want to overwrite it?" msgstr "" "ΥπάÏχει ήδη ένα αÏχείο με όνομα \"%1\". Είσαστε βέβαιοι ότι θέλετε να το " "αντικαταστήσετε;" #: ../gtk/src/FileDialogs.cc:239 msgid "Overwrite File?" msgstr "Îα αντικατασταθεί το αÏχείο;" #: ../gtk/src/MainWindow.cc:125 ../qt/src/MainWindow.cc:274 msgid "Using tesseract" msgstr "ΧÏήση του tesseract" #: ../gtk/src/MainWindow.cc:191 ../qt/src/MainWindow.cc:181 msgid "Select an image to begin..." msgstr "Επιλογή εικόνας για έναÏξη..." #: ../gtk/src/MainWindow.cc:306 ../qt/src/MainWindow.cc:262 msgid "Multiple sources" msgstr "Πολλαπλές Ï€ÏοελεÏσεις" #: ../gtk/src/MainWindow.cc:307 ../qt/src/MainWindow.cc:263 msgid "Ready" msgstr "Έτοιμος" #: ../gtk/src/MainWindow.cc:446 ../qt/src/MainWindow.cc:390 msgid "New version" msgstr "Îέα έκδοση" #: ../gtk/src/MainWindow.cc:446 ../qt/src/MainWindow.cc:390 msgid "gImageReader %1 is available" msgstr "Ο gImageReader %1 είναι διαθέσιμος" #: ../gtk/src/MainWindow.cc:447 ../qt/src/MainWindow.cc:391 msgid "Download" msgstr "ΜεταφόÏτωση" #: ../gtk/src/MainWindow.cc:448 ../qt/src/MainWindow.cc:392 msgid "Changelog" msgstr "ΑÏχείο αλλαγών" #: ../gtk/src/MainWindow.cc:449 ../qt/src/MainWindow.cc:393 msgid "Don't notify again" msgstr "Îα μην ξαναενημεÏωθώ" #: ../gtk/src/MainWindow.cc:468 ../qt/src/MainWindow.cc:438 msgid "Don't show again" msgstr "Îα μην ξαναεμφανιστεί" #: ../gtk/src/MainWindow.cc:469 ../gtk/src/MainWindow.cc:482 #: ../qt/src/MainWindow.cc:439 msgid "Install" msgstr "Εγκατάσταση" #: ../gtk/src/MainWindow.cc:489 ../qt/src/MainWindow.cc:451 msgid "Spelling dictionary missing" msgstr "Λείπει το οÏθογÏαφικό λεξικό" #: ../gtk/src/MainWindow.cc:489 ../qt/src/MainWindow.cc:451 msgid "The spellcheck dictionary for %1 is not installed" msgstr "Το οÏθογÏαφικό λεξικό για το %1 δεν είναι εγκατεστημένο" #: ../gtk/src/MainWindow.cc:496 ../gtk/src/MainWindow.cc:528 #: ../qt/src/MainWindow.cc:458 msgid "Installing spelling dictionary for '%1'" msgstr "Εγκατάσταση του οÏθογÏÎ±Ï†Î¹ÎºÎ¿Ï Î»ÎµÎ¾Î¹ÎºÎ¿Ï Î³Î¹Î± το '%1'" #: ../gtk/src/MainWindow.cc:517 ../gtk/src/MainWindow.cc:542 #: ../gtk/src/MainWindow.cc:550 ../gtk/src/MainWindow.cc:560 #: ../gtk/src/MainWindow.cc:566 ../gtk/src/MainWindow.cc:595 #: ../gtk/src/OutputEditorHOCR.cc:1375 ../gtk/src/Recognizer.cc:163 #: ../gtk/src/TessdataManager.cc:58 ../gtk/src/TessdataManager.cc:68 #: ../gtk/src/TessdataManager.cc:290 ../qt/src/MainWindow.cc:477 #: ../qt/src/MainWindow.cc:490 ../qt/src/MainWindow.cc:500 #: ../qt/src/MainWindow.cc:510 ../qt/src/MainWindow.cc:518 #: ../qt/src/MainWindow.cc:546 ../qt/src/OutputEditorHOCR.cc:1157 #: ../qt/src/Recognizer.cc:138 ../qt/src/TessdataManager.cc:72 #: ../qt/src/TessdataManager.cc:82 ../qt/src/TessdataManager.cc:275 msgid "Error" msgstr "Σφάλμα" #: ../gtk/src/MainWindow.cc:517 ../qt/src/MainWindow.cc:477 msgid "Failed to install spelling dictionary: %1" msgstr "Αποτυχία εγκατάστασης του οÏθογÏÎ±Ï†Î¹ÎºÎ¿Ï Î»ÎµÎ¾Î¹ÎºÎ¿Ï: %1" #: ../gtk/src/MainWindow.cc:542 ../qt/src/MainWindow.cc:490 msgid "Failed to create directory for spelling dictionaries." msgstr "Αποτυχία δημιουÏγίας καταλόγου για οÏθογÏαφικά λεξικά." #: ../gtk/src/MainWindow.cc:550 ../gtk/src/MainWindow.cc:566 #: ../qt/src/MainWindow.cc:500 msgid "Could not read %1: %2." msgstr "Αδυναμία ανάγνωσης του %1: %2." #: ../gtk/src/MainWindow.cc:560 ../gtk/src/MainWindow.cc:595 #: ../qt/src/MainWindow.cc:510 ../qt/src/MainWindow.cc:546 msgid "No spelling dictionaries found for '%1'." msgstr "Δεν βÏέθηκαν οÏθογÏαφικά λεξικά για το '%1'." #: ../gtk/src/MainWindow.cc:576 ../qt/src/MainWindow.cc:529 msgid "Downloading '%1'..." msgstr "ΜεταφοÏτώνεται το '%1'..." #: ../gtk/src/MainWindow.cc:592 ../qt/src/MainWindow.cc:543 msgid "Dictionaries installed" msgstr "Εγκατεστημένα λεξικά" #: ../gtk/src/MainWindow.cc:592 msgid "The following dictionaries were installed:%1" msgstr "Τα παÏακάτω λεξικά εγκαταστάθηκαν: %1" #: ../gtk/src/OutputEditorHOCR.cc:319 ../qt/src/OutputEditorHOCR.cc:291 msgid "Document" msgstr "ΕγγÏαφο" #: ../gtk/src/OutputEditorHOCR.cc:368 ../qt/src/OutputEditorHOCR.cc:279 msgid "Monochrome" msgstr "ΜονόχÏωμο" #: ../gtk/src/OutputEditorHOCR.cc:377 ../qt/src/OutputEditorHOCR.cc:281 msgid "Threshold (closest color)" msgstr "Κατώφλι (το πιο κοντινό χÏώμα)" #: ../gtk/src/OutputEditorHOCR.cc:380 ../qt/src/OutputEditorHOCR.cc:282 msgid "Diffuse" msgstr "Διάχυση" #: ../gtk/src/OutputEditorHOCR.cc:389 ../qt/src/OutputEditorHOCR.cc:283 msgid "Zip (lossless)" msgstr "Συμπίεση (χωÏίς απώλειες)" #: ../gtk/src/OutputEditorHOCR.cc:393 ../qt/src/OutputEditorHOCR.cc:284 msgid "CCITT Group 4 (lossless)" msgstr "CCITT Ομάδα 4 (χωÏίς απώλειες)" #: ../gtk/src/OutputEditorHOCR.cc:397 ../qt/src/OutputEditorHOCR.cc:285 msgid "Jpeg (lossy)" msgstr "Jpeg (με απώλειες)" #: ../gtk/src/OutputEditorHOCR.cc:553 ../qt/src/OutputEditorHOCR.cc:429 msgid "" "The following pages could not be processed:\n" "%1" msgstr "" "Οι παÏακάτω σελίδες δεν μπόÏεσαν να επεξεÏγαστοÏν:\n" "%1" #: ../gtk/src/OutputEditorHOCR.cc:554 ../qt/src/OutputEditorHOCR.cc:430 msgid "Recognition errors" msgstr "Σφάλματα αναγνώÏισης" #. Add tree item #: ../gtk/src/OutputEditorHOCR.cc:647 ../gtk/src/OutputEditorHOCR.cc:1037 #: ../qt/src/OutputEditorHOCR.cc:504 ../qt/src/OutputEditorHOCR.cc:894 msgid "Graphic" msgstr "ΓÏαφικό" #: ../gtk/src/OutputEditorHOCR.cc:703 ../qt/src/OutputEditorHOCR.cc:563 msgid "Paragraph" msgstr "ΠαÏάγÏαφος" #: ../gtk/src/OutputEditorHOCR.cc:706 ../qt/src/OutputEditorHOCR.cc:566 msgid "Textline" msgstr "ΓÏαμμή κειμένου" #: ../gtk/src/OutputEditorHOCR.cc:1136 ../qt/src/OutputEditorHOCR.cc:950 msgid "Merge" msgstr "Συγχώνευση" #: ../gtk/src/OutputEditorHOCR.cc:1161 ../qt/src/OutputEditorHOCR.cc:977 msgid "Add graphic region" msgstr "ΠÏοσθήκη πεÏιοχής γÏαφικών" #: ../gtk/src/OutputEditorHOCR.cc:1177 ../qt/src/OutputEditorHOCR.cc:985 msgid "No suggestions" msgstr "ΧωÏίς Ï€Ïοτάσεις" #: ../gtk/src/OutputEditorHOCR.cc:1183 ../qt/src/OutputEditorHOCR.cc:989 msgid "Add to dictionary" msgstr "ΠÏοσθήκη στο λεξικό" #: ../gtk/src/OutputEditorHOCR.cc:1189 ../qt/src/OutputEditorHOCR.cc:990 msgid "Ignore word" msgstr "ΠαÏάβλεψη λέξης" #: ../gtk/src/OutputEditorHOCR.cc:1222 ../qt/src/OutputEditorHOCR.cc:1007 msgid "Expand all" msgstr "Ανάπτυξη" #: ../gtk/src/OutputEditorHOCR.cc:1225 ../qt/src/OutputEditorHOCR.cc:1008 msgid "Collapse all" msgstr "ΣÏμπτυξη" #: ../gtk/src/OutputEditorHOCR.cc:1248 ../gtk/src/OutputEditorHOCR.cc:1287 #: ../qt/src/OutputEditorHOCR.cc:1049 ../qt/src/OutputEditorHOCR.cc:1079 msgid "hOCR HTML Files" msgstr "ΑÏχεία hOCR HTML" #: ../gtk/src/OutputEditorHOCR.cc:1249 ../qt/src/OutputEditorHOCR.cc:1049 msgid "Open hOCR File" msgstr "Άνοιγμα αÏχείου hOCR" #: ../gtk/src/OutputEditorHOCR.cc:1258 ../qt/src/OutputEditorHOCR.cc:1055 msgid "Failed to open file" msgstr "Αποτυχία ανοίγματος του αÏχείου" #: ../gtk/src/OutputEditorHOCR.cc:1258 ../qt/src/OutputEditorHOCR.cc:1055 msgid "The file could not be opened: %1." msgstr "Τα αÏχείο δεν μπόÏεσε να ανοιχθεί: %1" #: ../gtk/src/OutputEditorHOCR.cc:1267 ../qt/src/OutputEditorHOCR.cc:1062 msgid "Invalid hOCR file" msgstr "ΆκυÏο αÏχείο hOCR" #: ../gtk/src/OutputEditorHOCR.cc:1267 ../qt/src/OutputEditorHOCR.cc:1062 msgid "The file does not appear to contain valid hOCR HTML: %1" msgstr "Το αÏχείο δεν φαίνεται να πεÏιέχει έγκυÏο hOCR HTML: %1" #: ../gtk/src/OutputEditorHOCR.cc:1283 ../gtk/src/OutputEditorHOCR.cc:1343 #: ../gtk/src/OutputEditorText.cc:306 ../qt/src/OutputEditorHOCR.cc:1077 #: ../qt/src/OutputEditorHOCR.cc:1131 ../qt/src/OutputEditorText.cc:246 msgid "output" msgstr "έξοδος" #: ../gtk/src/OutputEditorHOCR.cc:1288 ../qt/src/OutputEditorHOCR.cc:1079 msgid "Save hOCR Output..." msgstr "Αποθήκευση εξόδου hOCR..." #: ../gtk/src/OutputEditorHOCR.cc:1296 ../gtk/src/OutputEditorHOCR.cc:1357 #: ../gtk/src/OutputEditorText.cc:319 ../qt/src/OutputEditorHOCR.cc:1087 #: ../qt/src/OutputEditorHOCR.cc:1143 ../qt/src/OutputEditorText.cc:256 msgid "Failed to save output" msgstr "Αποτυχία αποθήκευσης εξόδου" #: ../gtk/src/OutputEditorHOCR.cc:1296 ../gtk/src/OutputEditorHOCR.cc:1357 #: ../gtk/src/OutputEditorText.cc:319 ../qt/src/OutputEditorHOCR.cc:1087 #: ../qt/src/OutputEditorHOCR.cc:1143 ../qt/src/OutputEditorText.cc:256 msgid "Check that you have writing permissions in the selected folder." msgstr "Ελέγξτε ότι έχετε δικαίωμα εγγÏαφής στον επιλεγμένο φάκελο." #: ../gtk/src/OutputEditorHOCR.cc:1346 ../qt/src/OutputEditorHOCR.cc:1133 msgid "PDF Files" msgstr "ΑÏχεία PDF" #: ../gtk/src/OutputEditorHOCR.cc:1347 ../qt/src/OutputEditorHOCR.cc:1133 msgid "Save PDF Output..." msgstr "Αποθήκευση εξόδου PDF..." #: ../gtk/src/OutputEditorHOCR.cc:1375 ../qt/src/OutputEditorHOCR.cc:1157 msgid "The PDF library does not support the selected font." msgstr "Η βιβλιοθήκη PDF δεν υποστηÏίζει την επιλεγμένη γÏαμματοσειÏά." #: ../gtk/src/OutputEditorHOCR.cc:1435 ../qt/src/OutputEditorHOCR.cc:1216 msgid "Errors occurred" msgstr "Συνέβησαν σφάλματα" #: ../gtk/src/OutputEditorHOCR.cc:1435 ../qt/src/OutputEditorHOCR.cc:1216 msgid "" "The following pages could not be rendered:\n" "%1" msgstr "" "Οι παÏακάτω σελίδες δεν μπόÏεσαν να αποδοθοÏν:\n" "%1" #: ../gtk/src/OutputEditorHOCR.cc:1562 ../gtk/src/OutputEditorText.cc:333 #: ../qt/src/OutputEditorHOCR.cc:1331 ../qt/src/OutputEditorText.cc:269 msgid "Output not saved" msgstr "Η έξοδος δεν αποθηκεÏτηκε" #: ../gtk/src/OutputEditorHOCR.cc:1562 ../gtk/src/OutputEditorText.cc:333 #: ../qt/src/OutputEditorHOCR.cc:1331 ../qt/src/OutputEditorText.cc:269 msgid "Save output before proceeding?" msgstr "Αποθήκευση της εξόδου Ï€Ïιν την συνέχεια;" #: ../gtk/src/OutputEditorText.cc:197 ../qt/src/OutputEditorText.cc:158 msgid "Stripping line breaks..." msgstr "ΑφαίÏεση αλλαγών γÏαμμών..." #: ../gtk/src/OutputEditorText.cc:211 msgid "Check spelling" msgstr "ΟÏθογÏαφικός έλεγχος" #: ../gtk/src/OutputEditorText.cc:238 ../qt/src/OutputEditorText.cc:178 msgid "Replacing..." msgstr "Αντικατάσταση..." #: ../gtk/src/OutputEditorText.cc:264 ../qt/src/OutputEditorText.cc:204 #, fuzzy msgid "File: %1" msgstr "ΑÏχεία" #: ../gtk/src/OutputEditorText.cc:267 ../qt/src/OutputEditorText.cc:207 #, fuzzy msgid "Page: %1" msgstr "Ανάλυση του σφάλματος: %1" #: ../gtk/src/OutputEditorText.cc:280 ../gtk/src/Recognizer.cc:481 #: ../qt/src/Recognizer.cc:460 msgid "" "\n" "[Failed to recognize page %1]\n" msgstr "" "\n" "[Αποτυχία αναγνώÏισης της σελίδας %1]\n" #: ../gtk/src/OutputEditorText.cc:310 ../qt/src/OutputEditorText.cc:248 msgid "Text Files" msgstr "ΑÏχεία κειμένου" #: ../gtk/src/OutputEditorText.cc:311 ../qt/src/OutputEditorText.cc:248 msgid "Save Output..." msgstr "Αποθήκευση εξόδου..." #: ../gtk/src/Recognizer.cc:156 ../qt/src/Recognizer.cc:131 msgid "" "Tesseract crashed with the following message:\n" "\n" "%1\n" "\n" "This typically happens for one of the following reasons:\n" "- Outdated traineddata files are used.\n" "- Auxiliary language data files are missing.\n" "- Corrupt language data files.\n" "\n" "Make sure your language data files are valid and compatible with tesseract " "%2." msgstr "" "Το Tesseract κατέÏÏευσε με το παÏακάτω μήνυμα:\n" "\n" "%1\n" "\n" "Αυτό συμβαίνει συνήθως για έναν από τους παÏακάτω λόγους:\n" "- ΧÏησιμοποιοÏνται παÏωχημένα αÏχεία δεδομένων εκπαίδεθυσης.\n" "- Λείπουν βοηθητικά αÏχεία δεδομένων γλώσσας.\n" "- ΚατεστÏαμμένα αÏχεία δεδομένων γλώσσας.\n" "\n" "Εξασφαλίστε ότι τα αÏχεία δεδομένων γλώσσας είναι έγκυÏα και συμβατά με το " "tesseract %2." #: ../gtk/src/Recognizer.cc:212 ../qt/src/Recognizer.cc:191 msgid "No languages available" msgstr "Δεν υπάÏχουν διαθέσιμες γλώσσες" #: ../gtk/src/Recognizer.cc:212 ../qt/src/Recognizer.cc:191 msgid "" "No tesseract languages are available for use. Recognition will not work." msgstr "" "Δεν υπάÏχουν διαθέσιμες γλώσσες tesseract Ï€Ïος χÏήση. Η αναγνώÏιση δεν θα " "δουλέψει." #: ../gtk/src/Recognizer.cc:266 ../qt/src/Recognizer.cc:251 msgid "Multilingual" msgstr "Πολυγλωσσικός" #: ../gtk/src/Recognizer.cc:318 ../qt/src/Recognizer.cc:295 msgid "Automatic page segmentation" msgstr "Αυτόματος τεμαχισμός σελίδας" #: ../gtk/src/Recognizer.cc:319 ../qt/src/Recognizer.cc:296 msgid "Page segmentation with orientation and script detection" msgstr "Τεμαχισμός σελίδας με Ï€Ïοσανατολισμό και αναγνώÏιση γÏαφής" #: ../gtk/src/Recognizer.cc:320 ../qt/src/Recognizer.cc:297 msgid "Assume single column of text" msgstr "ΘεωÏείται μονή στήλη κειμένου" #: ../gtk/src/Recognizer.cc:321 ../qt/src/Recognizer.cc:298 msgid "Assume single block of vertically aligned text" msgstr "ΘεωÏείται μονό μπλοκ κάθετα στοιχισμένου κειμένου" #: ../gtk/src/Recognizer.cc:322 ../qt/src/Recognizer.cc:299 msgid "Assume a single uniform block of text" msgstr "ΘεωÏείται μονό ομοιόμοÏφο μπλοκ κειμένου" #: ../gtk/src/Recognizer.cc:323 ../qt/src/Recognizer.cc:300 msgid "Assume a line of text" msgstr "ΘεωÏείται γÏαμμή κειμένου" #: ../gtk/src/Recognizer.cc:324 ../qt/src/Recognizer.cc:301 msgid "Assume a single word" msgstr "ΘεωÏείται απλή λέξη" #: ../gtk/src/Recognizer.cc:325 ../qt/src/Recognizer.cc:302 msgid "Assume a single word in a circle" msgstr "ΘεωÏείται απλή λέξη σε κÏκλο" #: ../gtk/src/Recognizer.cc:326 ../qt/src/Recognizer.cc:303 msgid "Sparse text in no particular order" msgstr "ΑÏαιό κείμενο χωÏίς καμιά συγκεκÏιμένη τάξη" #: ../gtk/src/Recognizer.cc:327 ../qt/src/Recognizer.cc:304 msgid "Sparse text with orientation and script detection" msgstr "ΑÏαιό κείμενο με Ï€Ïοσανατολισμό και αναγνώÏιση γÏαφής" #: ../gtk/src/Recognizer.cc:341 ../qt/src/Recognizer.cc:314 msgid "Page segmentation mode" msgstr "Κατάσταση Ï„ÎµÎ¼Î±Ï‡Î¹ÏƒÎ¼Î¿Ï ÏƒÎµÎ»Î¯Î´Î±Ï‚" #: ../gtk/src/Recognizer.cc:347 ../qt/src/Recognizer.cc:321 msgid "Manage languages..." msgstr "ΔιαχείÏιση γλωσσών..." #: ../gtk/src/Recognizer.cc:403 ../qt/src/Recognizer.cc:381 msgid "Current selection" msgstr "ΤÏέχουσα επιλογή" #: ../gtk/src/Recognizer.cc:475 ../qt/src/Recognizer.cc:454 msgid "Recognizing page %1 (%2 of %3)" msgstr "ΑναγνώÏιση της σελίδας %1 (%2 από %3)" #: ../gtk/src/Recognizer.cc:480 ../qt/src/Recognizer.cc:459 msgid "" "\n" "- Page %1: failed to render page" msgstr "" "\n" "- Σελίδα %1: αποτυχία απόδοσης της σελίδας" #: ../gtk/src/Recognizer.cc:510 ../gtk/src/Recognizer.cc:539 #: ../gtk/src/Recognizer.cc:552 ../qt/src/Recognizer.cc:488 #: ../qt/src/Recognizer.cc:517 ../qt/src/Recognizer.cc:530 msgid "Recognizing..." msgstr "Γίνεται αναγνώÏιση..." #: ../gtk/src/Recognizer.cc:514 ../gtk/src/Recognizer.cc:522 #: ../qt/src/Recognizer.cc:492 ../qt/src/Recognizer.cc:500 msgid "Recognition errors occurred" msgstr "Συνέβησαν σφάλματα αναγνώÏισης" #: ../gtk/src/Recognizer.cc:514 ../qt/src/Recognizer.cc:492 msgid "The following errors occurred:%1" msgstr "Τα παÏακάτω σφάλματα συνέβησαν:%1" #: ../gtk/src/Recognizer.cc:522 ../qt/src/Recognizer.cc:500 msgid "Failed to initialize tesseract" msgstr "Αποτυχία Ï€Ïοετοιμασίας του tesseract" #: ../gtk/src/scanner/ScannerSane.cc:83 ../gtk/src/scanner/ScannerTwain.cc:287 #: ../qt/src/scanner/ScannerSane.cc:85 ../qt/src/scanner/ScannerTwain.cc:285 msgid "Scan canceled" msgstr "ΑκυÏώθηκε η σάÏωση" #: ../gtk/src/scanner/ScannerSane.cc:157 ../gtk/src/scanner/ScannerTwain.cc:186 #: ../qt/src/scanner/ScannerSane.cc:158 ../qt/src/scanner/ScannerTwain.cc:178 msgid "No scanner specified" msgstr "Δεν οÏίστηκε σαÏωτής" #: ../gtk/src/scanner/ScannerSane.cc:166 ../gtk/src/scanner/ScannerTwain.cc:195 #: ../qt/src/scanner/ScannerSane.cc:167 ../qt/src/scanner/ScannerTwain.cc:187 msgid "Unable to connect to scanner" msgstr "Αδυναμία σÏνδεσης με σαÏωτή" #: ../gtk/src/scanner/ScannerSane.cc:386 ../gtk/src/scanner/ScannerTwain.cc:265 #: ../gtk/src/scanner/ScannerTwain.cc:291 ../qt/src/scanner/ScannerSane.cc:387 #: ../qt/src/scanner/ScannerTwain.cc:257 ../qt/src/scanner/ScannerTwain.cc:289 msgid "Unable to start scan" msgstr "ΑδÏνατη η έναÏξη σάÏωσης" #: ../gtk/src/scanner/ScannerSane.cc:394 ../gtk/src/scanner/ScannerSane.cc:437 #: ../gtk/src/scanner/ScannerTwain.cc:317 ../qt/src/scanner/ScannerSane.cc:395 #: ../qt/src/scanner/ScannerSane.cc:438 ../qt/src/scanner/ScannerTwain.cc:315 msgid "Error communicating with scanner" msgstr "Σφάλμα επικοινωνίας με τον σαÏωτή" #: ../gtk/src/scanner/ScannerSane.cc:498 ../qt/src/scanner/ScannerSane.cc:494 msgid "Failed to save image" msgstr "Αποτυχία αποθήκευσης της εικόνας" #: ../gtk/src/SourceManager.cc:118 ../qt/src/SourceManager.cc:112 msgid "Unable to open files" msgstr "Αδυναμία ανοίγματος αÏχείων" #: ../gtk/src/SourceManager.cc:118 ../qt/src/SourceManager.cc:112 msgid "The following files could not be opened:%1" msgstr "Τα παÏακάτω αÏχεία δεν μπόÏεσαν να ανοιχθοÏν:%1" #: ../gtk/src/SourceManager.cc:134 ../qt/src/SourceManager.cc:154 msgid "Images and PDFs" msgstr "Εικόνες και PDF" #: ../gtk/src/SourceManager.cc:137 ../qt/src/SourceManager.cc:155 msgid "Select Files" msgstr "Επιλογή αÏχείων" #: ../gtk/src/SourceManager.cc:143 ../qt/src/SourceManager.cc:166 msgid "Clipboard Error" msgstr "Σφάλμα Ï€ÏοχείÏου" #: ../gtk/src/SourceManager.cc:143 ../qt/src/SourceManager.cc:166 msgid "Failed to read the clipboard." msgstr "Αποτυχία ανάγνωσης του Ï€ÏοχείÏου" #: ../gtk/src/SourceManager.cc:147 ../qt/src/SourceManager.cc:170 #: ../qt/src/SourceManager.cc:176 msgid "Pasted %1" msgstr "Επικολλήθηκε το %1" #: ../gtk/src/SourceManager.cc:159 ../qt/src/SourceManager.cc:183 msgid "Screenshot Error" msgstr "Σφάλμα στιγμιοτÏπου" #: ../gtk/src/SourceManager.cc:159 ../qt/src/SourceManager.cc:183 msgid "Failed to take screenshot." msgstr "Αποτυχία λήψης στιγμιοτÏπου" #: ../gtk/src/SourceManager.cc:163 ../qt/src/SourceManager.cc:187 msgid "Screenshot %1" msgstr "Στιγμιότυπο %1" #: ../gtk/src/SourceManager.cc:168 ../qt/src/SourceManager.cc:192 msgid "Saving image..." msgstr "ΑποθηκεÏεται η εικόνα..." #: ../gtk/src/SourceManager.cc:175 ../qt/src/SourceManager.cc:205 msgid "Cannot Write File" msgstr "Αδυναμία εγγÏαφής αÏχείου" #: ../gtk/src/SourceManager.cc:175 ../qt/src/SourceManager.cc:205 msgid "Could not write to %1." msgstr "Αδυναμία εγγÏαφής στο %1." #: ../gtk/src/SourceManager.cc:202 ../qt/src/SourceManager.cc:227 msgid "Delete File?" msgstr "Îα διαγÏαφεί το αÏχείο;" #: ../gtk/src/SourceManager.cc:202 ../qt/src/SourceManager.cc:227 msgid "The following files will be deleted:%1" msgstr "Τα παÏακάτω αÏχεία θα διαγÏαφοÏν:%1" #: ../gtk/src/SourceManager.cc:266 ../qt/src/SourceManager.cc:278 msgid "Missing File" msgstr "Λείπει αÏχείο" #: ../gtk/src/SourceManager.cc:266 ../qt/src/SourceManager.cc:278 msgid "" "The following file has been deleted or moved:\n" "%1" msgstr "" "Το παÏακάτω αÏχείο έχει διαγÏαφεί ή μετακινηθεί:\n" "%1" #: ../gtk/src/SubstitutionsManager.cc:39 ../qt/src/SubstitutionsManager.cc:77 msgid "Search for" msgstr "Αναζήτηση για" #: ../gtk/src/SubstitutionsManager.cc:40 ../qt/src/SubstitutionsManager.cc:77 msgid "Replace with" msgstr "Αντικατάσταση με" #: ../gtk/src/SubstitutionsManager.cc:62 ../qt/src/SubstitutionsManager.cc:99 msgid "substitution_list.txt" msgstr "λίστα_υποκατάστασης.txt" #: ../gtk/src/SubstitutionsManager.cc:84 ../gtk/src/SubstitutionsManager.cc:119 #: ../qt/src/SubstitutionsManager.cc:114 ../qt/src/SubstitutionsManager.cc:152 msgid "Substitutions List" msgstr "Λίστα υποκαταστάσεων" #: ../gtk/src/SubstitutionsManager.cc:85 ../qt/src/SubstitutionsManager.cc:114 msgid "Open Substitutions List" msgstr "Άνοιγμα λίστας υποκαταστάσεων" #: ../gtk/src/SubstitutionsManager.cc:90 ../qt/src/SubstitutionsManager.cc:119 msgid "Error Reading File" msgstr "Σφάλμα ανάγνωσης αÏχείου" #: ../gtk/src/SubstitutionsManager.cc:90 ../qt/src/SubstitutionsManager.cc:119 msgid "Unable to read '%1'." msgstr "Αδυναμία ανάγνωσης του '%1'." #: ../gtk/src/SubstitutionsManager.cc:113 ../qt/src/SubstitutionsManager.cc:146 msgid "Errors Occurred Reading File" msgstr "Συνέβησαν σφάλματα ανάγνωσης του αÏχείου" #: ../gtk/src/SubstitutionsManager.cc:113 ../qt/src/SubstitutionsManager.cc:146 msgid "Some entries of the substitutions list could not be read." msgstr "" "Κάποιες καταχωÏίσεις της λίστας υποκατάστασης δεν μπόÏεσαν να διαβαστοÏν." #: ../gtk/src/SubstitutionsManager.cc:120 ../qt/src/SubstitutionsManager.cc:152 msgid "Save Substitutions List" msgstr "Αποθήκευση λίστας υποκαταστάσεων" #: ../gtk/src/SubstitutionsManager.cc:126 ../qt/src/SubstitutionsManager.cc:158 msgid "Error Saving File" msgstr "Σφάλμα αποθήκευσης αÏχείου" #: ../gtk/src/SubstitutionsManager.cc:126 ../qt/src/SubstitutionsManager.cc:158 msgid "Unable to write to '%1'." msgstr "ΑδÏνατη η εγγÏαφή στο '%1'." #: ../gtk/src/SubstitutionsManager.cc:144 ../qt/src/SubstitutionsManager.cc:172 msgid "Save List?" msgstr "Îα αποθηκευτεί η λίστα;" #: ../gtk/src/SubstitutionsManager.cc:144 ../qt/src/SubstitutionsManager.cc:172 msgid "Do you want to save the current list?" msgstr "Θέλετε να αποθηκευτεί η Ï„Ïέχουσα λίστα;" #: ../gtk/src/SubstitutionsManager.cc:179 ../qt/src/SubstitutionsManager.cc:208 msgid "Applying substitutions..." msgstr "ΕφαÏμόζονται υποκαταστάσεις..." #: ../gtk/src/TessdataManager.cc:58 ../qt/src/TessdataManager.cc:72 msgid "" "PackageKit is required for managing system-wide tesseract language packs, " "but it was not found. Please use the system package management software to " "manage the tesseract language packs, or switch to use the user tessdata path " "in the configuration dialog." msgstr "" "Το PackageKit απαιτείται για τη διαχείÏιση των γλωσσικών πακέτων tesseract " "για ολόκληÏο το σÏστημα, αλλά δεν βÏέθηκε. ΠαÏακαλοÏμε, χÏησιμοποιήστε το " "λογισμικό διαχείÏισης πακέτων του συστήματος για να διαχειÏιστείτε τα " "γλωσσικά πακέτα του tesseract ή αλλάξτε για να χÏησιμοποιήσετε τη διαδÏομή " "tessdata του χÏήστη στον διάλογο ÏÏθμισης." #: ../gtk/src/TessdataManager.cc:63 ../qt/src/TessdataManager.cc:77 msgid "Fetching available languages" msgstr "ΜεταφέÏονται οι διαθέσιμες γλώσσες" #: ../gtk/src/TessdataManager.cc:68 ../gtk/src/TessdataManager.cc:89 #: ../gtk/src/TessdataManager.cc:121 ../qt/src/TessdataManager.cc:82 #: ../qt/src/TessdataManager.cc:94 ../qt/src/TessdataManager.cc:127 msgid "Failed to fetch list of available languages: %1" msgstr "Αποτυχία μεταφοÏάς του καταλόγου των διαθέσιμων γλωσσών: %1" #: ../gtk/src/TessdataManager.cc:100 ../gtk/src/TessdataManager.cc:129 #: ../qt/src/TessdataManager.cc:105 ../qt/src/TessdataManager.cc:114 #: ../qt/src/TessdataManager.cc:136 ../qt/src/TessdataManager.cc:147 msgid "Parsing error: %1" msgstr "Ανάλυση του σφάλματος: %1" #: ../gtk/src/TessdataManager.cc:191 ../qt/src/TessdataManager.cc:191 msgid "Applying changes..." msgstr "ΕφαÏμογή αλλαγών..." #: ../gtk/src/TessdataManager.cc:252 ../qt/src/TessdataManager.cc:237 msgid "Failed to create directory for tessdata files." msgstr "Αποτυχία δημιουÏγίας καταλόγου για τα αÏχεία tessdata." #: ../gtk/src/TessdataManager.cc:261 ../qt/src/TessdataManager.cc:245 msgid "Downloading %1..." msgstr "ΜεταφοÏτώνεται το %1..." #: ../gtk/src/TessdataManager.cc:281 ../qt/src/TessdataManager.cc:267 msgid "" "The following files could not be downloaded or removed:\n" "%1\n" "\n" "Check the connectivity and directory permissions." msgstr "" "Τα παÏακάτω αÏχεία δεν μπόÏεσαν να μεταφοÏτωθοÏν ή να αφαιÏεθοÏν:\n" "%1\n" "\n" "Ελέγξτε τη σÏνδεση και τα δικαιώματα του καταλόγου." #: ../gtk/src/Utils.cc:62 msgid "Yes" msgstr "Îαι" #: ../gtk/src/Utils.cc:65 msgid "No" msgstr "Όχι" #: ../gtk/src/Utils.cc:74 msgid "Discard" msgstr "ΑπόÏÏιψη" #: ../qt/data/AboutDialog.ui.h:1 msgid "About gImageReader" msgstr "ΠεÏί του gImageReader" #: ../qt/data/AboutDialog.ui.h:3 #, fuzzy msgid "" "

 

A graphical frontend to tesseract-ocr

Website

 

" msgstr "" "

 

Μια γÏαφική διεπαφή χÏήστη στο tesseract-" "ocr

Ιστότοπος

 

" #: ../qt/data/AboutDialog.ui.h:4 msgid "Credits" msgstr "Μνείες" #: ../qt/data/AboutDialog.ui.h:5 msgid "License" msgstr "Άδεια" #: ../qt/data/ConfigDialog.ui.h:14 msgid "System encoding" msgstr "Κωδικοποίηση συστήματος" #: ../qt/data/ConfigDialog.ui.h:15 msgid "UTF-8" msgstr "UTF-8" #: ../qt/data/ConfigDialog.ui.h:19 msgid "Text file encoding:" msgstr "Κωδικοποίηση αÏχείου κειμένου:" #: ../qt/data/CrashHandler.ui.h:2 #, no-c-format msgid "" "

The application has " "crashed

Apologies for the inconvenience. To help improve the " "application, please consider reporting the issue to manisandro@gmail.com. Please try to describe what you were doing before the application " "crashed. Also, include the information below. Thank you.

" msgstr "" "

Η εφαÏμογή " "κατέÏÏευσε

Συγνώμη για το Ï€Ïόβλημα. Για να βοηθήσετε στην " "βελτίωση της εφαÏμογής, παÏακαλοÏμε αναφέÏτε το Ï€Ïόβλημα στο manisandro@gmail.com. ΠαÏακαλοÏμε, Ï€Ïοσπαθήστε να πεÏιγÏάψετε τι " "κάνατε Ï€Ïιν να καταÏÏεÏσει η εφαÏμογή. Επίσης, να συμπεÏιλάβετε την παÏακάτω " "πληÏοφοÏία. Σας ευχαÏιστοÏμε.

" #: ../qt/data/MainWindow.ui.h:1 msgid "gImageReader" msgstr "gImageReader" #. Remove & from some labels which designer insists in adding #: ../qt/data/MainWindow.ui.h:17 ../qt/src/Ui_MainWindow.hh:49 msgid "Sources" msgstr "Πηγές" #: ../qt/data/MainWindow.ui.h:18 msgid "Zoom In" msgstr "Μεγέθυνση" #: ../qt/data/MainWindow.ui.h:20 msgid "Zoom Out" msgstr "ΣμίκÏυνση" #: ../qt/data/MainWindow.ui.h:22 msgid "Normal Size" msgstr "Κανονικό μέγεθος" #: ../qt/data/MainWindow.ui.h:24 msgid "Best Fit" msgstr "ΆÏιστη Ï€ÏοσαÏμογή" #: ../qt/data/MainWindow.ui.h:26 msgid "Rotate Left" msgstr "ΑÏιστεÏή πεÏιστÏοφή" #: ../qt/data/MainWindow.ui.h:27 msgid "Rotate left" msgstr "ΑÏιστεÏή πεÏιστÏοφή" #: ../qt/data/MainWindow.ui.h:28 msgid "Rotate Right" msgstr "Δεξιά πεÏιστÏοφή" #: ../qt/data/MainWindow.ui.h:29 msgid "Rotate right" msgstr "Δεξιά πεÏιστÏοφή" #: ../qt/data/MainWindow.ui.h:30 msgid "Image Controls" msgstr "Στοιχεία ελέγχου εικόνας" #: ../qt/data/MainWindow.ui.h:32 msgid "Autodetect Layout" msgstr "Αυτόματη ανίχνευση διάταξης" #: ../qt/data/MainWindow.ui.h:34 msgid "Toggle Output Pane" msgstr "Εναλλαγή παÏαθÏÏου εξόδου" #: ../qt/src/MainWindow.cc:518 msgid "Could not read %1: %2" msgstr "Αδυναμία ανάγνωσης του %1: %2" #: ../qt/src/MainWindow.cc:543 msgid "The following dictionary files were installed:%1" msgstr "Τα παÏακάτω αÏχεία λεξικών εγκαταστάθηκαν:%1" #: ../qt/src/Ui_MainWindow.hh:50 msgid "Output" msgstr "Έξοδος:" #: ../qt/src/Ui_MainWindow.hh:133 msgid "OCR mode:" msgstr "Κατάσταση OCR:" #: ../qt/src/Ui_MainWindow.hh:204 msgid "Remove Image" msgstr "ΑφαίÏεση εικόνας" #: ../qt/src/Ui_MainWindow.hh:207 msgid "Delete Image" msgstr "ΔιαγÏαφή εικόνας" #: ../qt/src/Ui_MainWindow.hh:210 msgid "Clear List" msgstr "ΚαθαÏισμός λίστας" #. Output toolbar #: ../qt/src/Ui_OutputEditorHOCR.hh:39 ../qt/src/Ui_OutputEditorHOCR.hh:40 msgid "Open hOCR file" msgstr "Άνοιγμα αÏχείου hOCR" #: ../qt/src/Ui_OutputEditorHOCR.hh:41 ../qt/src/Ui_OutputEditorHOCR.hh:42 msgid "Save as hOCR text" msgstr "Αποθήκευση κειμένου ως hOCR" #: ../qt/src/Ui_OutputEditorText.hh:108 msgid "Strip Line Breaks" msgstr "ΑφαίÏεση αλλαγών γÏαμμής" #: ../qt/src/Ui_OutputEditorText.hh:113 msgid "Find and Replace" msgstr "ΕÏÏεση και αντικατάσταση" #: ../qt/src/Ui_OutputEditorText.hh:122 msgid "Save Output" msgstr "Αποθήκευση εξόδου" #: ../qt/src/Ui_OutputEditorText.hh:124 msgid "Clear Output" msgstr "ΚαθαÏισμός εξόδου" #, fuzzy #~ msgid "" #~ "<html><head/><body><p><span style=" font-" #~ "weight:600;">The application has crashed</span></p>" #~ "<p>Apologies for the inconvenience. To help improve the " #~ "application, please consider reporting the issue to <a href="" #~ "mailto:manisandro@gmail.com?subject=gImageReader%20Crash">" #~ "manisandro@gmail.com</a>. Please try to describe what you were " #~ "doing before the application crashed. Also, include the information " #~ "below. Thank you.</p></body></html>" #~ msgstr "" #~ "

Η εφαÏμογή " #~ "κατέÏÏευσε

Συγνώμη για το Ï€Ïόβλημα. Για να βοηθήσετε στη " #~ "βελτίωση της εφαÏμογής, παÏακαλοÏμε να εξετάσετε την αναφοÏά του " #~ "Ï€Ïοβλήματος στο manisandro@gmail.com. ΠαÏακαλοÏμε, Ï€Ïοσπαθήστε να " #~ "πεÏιγÏάψετε τι κάνατε Ï€Ïιν την κατάÏÏευση της εφαÏμογής. Επίσης, " #~ "συμπεÏιλάβετε τις παÏακάτω πληÏοφοÏίες. Σας ευχαÏιστοÏμε.

" #, fuzzy #~ msgid "" #~ "<small><b>Example:</b> 1-10, 13, 14-18</small>" #~ msgstr "ΠαÏάδειγμα: 1-10, 13, 14-18" #~ msgid "Detect script and orientation" #~ msgstr "Ανίχνευση δέσμης ενεÏγειών και Ï€ÏοσανατολισμοÏ" #~ msgid "" #~ "PackageKit is required for managing tesseract language packs, but it was " #~ "not found. Please use the system package management software to manage " #~ "the tesseract language packs." #~ msgstr "" #~ "Το PackageKit απαιτείται για τη διαχείÏιση των γλωσσικών πακέτων " #~ "tesseract, αλλά δεν βÏέθηκε. ΠαÏακαλοÏμε, χÏησιμοποιήστε το λογισμικό " #~ "διαχείÏισης πακέτων του συστήματος για να διαχειÏιστείτε τα γλωσσικά " #~ "πακέτα του tesseract." #~ msgid "" #~ "\n" #~ "\tFailed to initialize tesseract" #~ msgstr "" #~ "\n" #~ "\tΑποτυχία Ï€Ïοετοιμασίας του tesseract" #~ msgid "So&urces" #~ msgstr "Π&ÏοελεÏσεις" #~ msgid "&Output" #~ msgstr "Έ&ξοδος" #~ msgid "To recognize specific areas, drag rectangles over them." #~ msgstr "Για αναγνώÏιση συγκεκÏιμένων πεÏιοχών, σÏÏτε οÏθογώνια γÏÏω τους." #~ msgid "Rendering image..." #~ msgstr "Απόδοση εικόνας..." #~ msgid "en_US" #~ msgstr "en_US" gImageReader-3.2.3/po/es_ES.po000066400000000000000000001516231312567024200160210ustar00rootroot00000000000000# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # # Sandro Mani , 2014, 2015, 2016, 2017. msgid "" msgstr "" "Project-Id-Version: \n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2017-07-01 10:34+0200\n" "PO-Revision-Date: 2017-07-01 10:45+0100\n" "Last-Translator: Sandro Mani \n" "Language-Team: English \n" "Language: en_US\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" "X-Generator: Lokalize 2.0\n" #: ../gtk/data/appmenu.ui.h:1 ../qt/src/Ui_MainWindow.hh:165 msgid "Redetect Languages" msgstr "Volver a detectar idiomas" #: ../gtk/data/appmenu.ui.h:2 ../gtk/data/gimagereader.ui.h:39 #: ../qt/data/ConfigDialog.ui.h:1 ../qt/src/Ui_MainWindow.hh:168 msgid "Preferences" msgstr "Ajustes" #: ../gtk/data/appmenu.ui.h:3 ../gtk/data/gimagereader.ui.h:40 #: ../gtk/src/MainWindow.cc:484 ../qt/src/MainWindow.cc:445 #: ../qt/src/Ui_MainWindow.hh:173 msgid "Help" msgstr "Ayuda" #: ../gtk/data/appmenu.ui.h:4 ../qt/data/AboutDialog.ui.h:2 #: ../qt/src/Ui_MainWindow.hh:176 msgid "About" msgstr "Acerca de" #: ../gtk/data/appmenu.ui.h:5 msgid "Quit" msgstr "Salir" #: ../gtk/data/crashhandler.ui.h:1 ../qt/src/CrashHandler.cc:36 msgid "Regenerate backtrace" msgstr "Regenerar rastro" #: ../gtk/data/crashhandler.ui.h:2 msgid "The application has crashed" msgstr "La aplicación ha fallado" #: ../gtk/data/crashhandler.ui.h:4 #, no-c-format msgid "" "Apologies for the inconvenience. To help improve the application, please " "consider reporting the issue to manisandro@gmail.com. Please try to " "describe what you were doing before the application crashed. Also, include " "the information below. Thank you." msgstr "" "Disculpe las molestias. Para ayudar a mejorar la aplicación, por favor " "considere informar sobre el problema en manisandro@gmail.com. Trate de " "describir lo que estaba haciendo antes del fallo de la aplicación. Incluya " "también la información que aparece debajo. Gracias." #: ../gtk/data/editor_hocr.ui.h:1 ../qt/data/PdfExportDialog.ui.h:1 msgid "PDF Export" msgstr "Exportar a PDF" #: ../gtk/data/editor_hocr.ui.h:2 ../gtk/data/gimagereader.ui.h:55 #: ../gtk/src/Acquirer.cc:42 ../gtk/src/FileDialogs.cc:150 #: ../gtk/src/Utils.cc:68 ../qt/data/ConfigDialog.ui.h:27 #: ../qt/data/MainWindow.ui.h:14 msgid "Cancel" msgstr "Cancelar" #: ../gtk/data/editor_hocr.ui.h:3 ../gtk/data/gimagereader.ui.h:41 #: ../gtk/src/FileDialogs.cc:151 ../gtk/src/Utils.cc:59 #: ../qt/data/ConfigDialog.ui.h:26 msgid "OK" msgstr "OK" #: ../gtk/data/editor_hocr.ui.h:4 ../qt/data/PdfExportDialog.ui.h:2 msgid "Output mode:" msgstr "Modo de salida:" #: ../gtk/data/editor_hocr.ui.h:5 ../qt/data/PdfExportDialog.ui.h:3 msgid "PDF" msgstr "PDF" #: ../gtk/data/editor_hocr.ui.h:6 ../qt/data/PdfExportDialog.ui.h:4 msgid "PDF with invisible text overlay" msgstr "PDF con capa de texto oculta" #: ../gtk/data/editor_hocr.ui.h:7 ../qt/data/PdfExportDialog.ui.h:16 msgid "Format:" msgstr "Formato:" #: ../gtk/data/editor_hocr.ui.h:8 ../qt/data/PdfExportDialog.ui.h:17 msgid "Compression:" msgstr "Compresión:" #: ../gtk/data/editor_hocr.ui.h:9 ../qt/data/PdfExportDialog.ui.h:14 msgid "Compression quality:" msgstr "Calidad en la compresión:" #: ../gtk/data/editor_hocr.ui.h:10 ../qt/data/PdfExportDialog.ui.h:15 msgid "DPI:" msgstr "DPI:" #: ../gtk/data/editor_hocr.ui.h:11 ../qt/data/PdfExportDialog.ui.h:18 msgid "Dithering algorithm:" msgstr "Algoritmo de tramado" #: ../gtk/data/editor_hocr.ui.h:12 ../qt/data/PdfExportDialog.ui.h:13 msgid "Image settings:" msgstr "Ajustes de imagen:" #: ../gtk/data/editor_hocr.ui.h:13 ../qt/data/PdfExportDialog.ui.h:11 msgid "Document font:" msgstr "Tipografía del documento:" #: ../gtk/data/editor_hocr.ui.h:14 ../qt/data/PdfExportDialog.ui.h:7 msgid "Uniformize line and word spacing" msgstr "Igualar espaciado de línea y palabra" #: ../gtk/data/editor_hocr.ui.h:15 ../qt/data/PdfExportDialog.ui.h:10 msgid "Use detected font sizes" msgstr "Usar tamaño de tipografía detectado" #: ../gtk/data/editor_hocr.ui.h:16 ../qt/data/PdfExportDialog.ui.h:8 msgid "Preserve spaces wider than:" msgstr "Conservar espacios mayores que:" #: ../gtk/data/editor_hocr.ui.h:17 ../qt/data/PdfExportDialog.ui.h:12 msgid "characters" msgstr "caracteres" #: ../gtk/data/editor_hocr.ui.h:18 ../qt/data/PdfExportDialog.ui.h:9 msgid "Scale:" msgstr "Escala:" #: ../gtk/data/editor_hocr.ui.h:19 ../qt/data/PdfExportDialog.ui.h:6 msgid "Text settings:" msgstr "Ajustes de texto:" #: ../gtk/data/editor_hocr.ui.h:20 ../qt/data/PdfExportDialog.ui.h:5 msgid "Show preview" msgstr "Mostrar vista previa" #: ../gtk/data/editor_hocr.ui.h:21 ../gtk/data/editor_text.ui.h:26 #: ../qt/src/Ui_OutputEditorText.hh:123 msgid "Save output" msgstr "Guardar salida" #: ../gtk/data/editor_hocr.ui.h:22 ../qt/src/Ui_OutputEditorHOCR.hh:44 #: ../qt/src/Ui_OutputEditorHOCR.hh:45 msgid "Export to PDF" msgstr "Exportar a PDF" #: ../gtk/data/editor_hocr.ui.h:23 ../gtk/data/editor_text.ui.h:27 #: ../qt/src/Ui_OutputEditorHOCR.hh:47 ../qt/src/Ui_OutputEditorHOCR.hh:48 #: ../qt/src/Ui_OutputEditorText.hh:125 msgid "Clear output" msgstr "Limpiar salida" #: ../gtk/data/editor_hocr.ui.h:24 ../qt/src/Ui_OutputEditorHOCR.hh:75 msgid "Properties" msgstr "Propiedades" #: ../gtk/data/editor_hocr.ui.h:25 ../qt/src/Ui_OutputEditorHOCR.hh:79 msgid "Source" msgstr "Origen" #. Output insert mode #: ../gtk/data/editor_text.ui.h:1 ../qt/src/Ui_OutputEditorText.hh:59 msgid "Append to current text" msgstr "Agregar al texto actual" #: ../gtk/data/editor_text.ui.h:2 ../qt/src/Ui_OutputEditorText.hh:60 msgid "Insert at cursor" msgstr "Insertar en la posición del cursor" #: ../gtk/data/editor_text.ui.h:3 ../qt/src/Ui_OutputEditorText.hh:61 msgid "Replace current text" msgstr "Reemplazar el texto actual" #: ../gtk/data/editor_text.ui.h:4 ../qt/src/SubstitutionsManager.cc:37 #: ../qt/src/Ui_OutputEditorText.hh:177 msgid "Substitutions" msgstr "Sustituciones" #: ../gtk/data/editor_text.ui.h:5 ../qt/src/SubstitutionsManager.cc:42 #: ../qt/src/SubstitutionsManager.cc:43 msgid "Open" msgstr "Abrir" #: ../gtk/data/editor_text.ui.h:6 ../gtk/src/Utils.cc:71 #: ../qt/src/SubstitutionsManager.cc:45 ../qt/src/SubstitutionsManager.cc:46 msgid "Save" msgstr "Guardar" #: ../gtk/data/editor_text.ui.h:7 ../qt/src/SubstitutionsManager.cc:48 #: ../qt/src/SubstitutionsManager.cc:49 msgid "Clear" msgstr "Limpiar" #: ../gtk/data/editor_text.ui.h:8 ../qt/data/ConfigDialog.ui.h:16 #: ../qt/src/SubstitutionsManager.cc:51 ../qt/src/SubstitutionsManager.cc:52 msgid "Add" msgstr "Agregar" #: ../gtk/data/editor_text.ui.h:9 ../gtk/src/OutputEditorHOCR.cc:1202 #: ../gtk/src/OutputEditorHOCR.cc:1213 ../qt/data/ConfigDialog.ui.h:17 #: ../qt/src/OutputEditorHOCR.cc:998 ../qt/src/OutputEditorHOCR.cc:1000 #: ../qt/src/SubstitutionsManager.cc:54 ../qt/src/SubstitutionsManager.cc:55 msgid "Remove" msgstr "Quitar" #: ../gtk/data/editor_text.ui.h:10 ../gtk/data/gimagereader.ui.h:73 msgid "Apply" msgstr "Aplicar" #: ../gtk/data/editor_text.ui.h:11 ../gtk/data/gimagereader.ui.h:74 msgid "Close" msgstr "Cerrar" #. Output postprocessing #: ../gtk/data/editor_text.ui.h:12 ../qt/src/Ui_OutputEditorText.hh:69 msgid "Keep line break if..." msgstr "Mantener salto de línea si..." #: ../gtk/data/editor_text.ui.h:13 ../qt/src/Ui_OutputEditorText.hh:71 msgid "Preceded by end mark (.?!)" msgstr "Va precedido por una marca de final de frase (.?!)" #: ../gtk/data/editor_text.ui.h:14 ../qt/src/Ui_OutputEditorText.hh:73 msgid "Preceded or succeeded by quote" msgstr "Va precedido o le sigue una comilla" #: ../gtk/data/editor_text.ui.h:15 ../qt/src/Ui_OutputEditorText.hh:75 msgid "Other options" msgstr "Otras opciones" #: ../gtk/data/editor_text.ui.h:16 ../qt/src/Ui_OutputEditorText.hh:77 msgid "Join hyphenated words" msgstr "Juntar palabras separadas por guión" #: ../gtk/data/editor_text.ui.h:17 ../qt/src/Ui_OutputEditorText.hh:79 msgid "Collapse whitespace" msgstr "Consolidar espacios en blanco" #: ../gtk/data/editor_text.ui.h:18 ../qt/src/Ui_OutputEditorText.hh:81 msgid "Preserve paragraphs" msgstr "Preservar los párrafos" #: ../gtk/data/editor_text.ui.h:19 ../qt/src/Ui_OutputEditorText.hh:83 msgid "Visual aids" msgstr "Ayudas visuales" #: ../gtk/data/editor_text.ui.h:20 ../qt/src/Ui_OutputEditorText.hh:85 msgid "Draw whitespace" msgstr "Dibujar espacios" #: ../gtk/data/editor_text.ui.h:21 ../gtk/data/gimagereader.ui.h:31 #: ../qt/src/Ui_OutputEditorText.hh:102 msgid "Select insert mode" msgstr "Seleccionar modo de inserción" #: ../gtk/data/editor_text.ui.h:22 ../qt/src/Ui_OutputEditorText.hh:109 msgid "Strip line breaks on selected text" msgstr "Quitar saltos de línea del texto seleccionado" #: ../gtk/data/editor_text.ui.h:23 ../qt/src/Ui_OutputEditorText.hh:114 msgid "Find and replace" msgstr "Buscar y reemplazar" #: ../gtk/data/editor_text.ui.h:24 ../qt/src/Ui_OutputEditorText.hh:116 #: ../qt/src/Ui_OutputEditorText.hh:117 msgid "Undo" msgstr "Deshacer" #: ../gtk/data/editor_text.ui.h:25 ../qt/src/Ui_OutputEditorText.hh:119 #: ../qt/src/Ui_OutputEditorText.hh:120 msgid "Redo" msgstr "Rehacer" #: ../gtk/data/editor_text.ui.h:28 ../qt/src/Ui_OutputEditorText.hh:149 msgid "Find" msgstr "Buscar" #: ../gtk/data/editor_text.ui.h:29 ../qt/src/Ui_OutputEditorText.hh:153 #: ../qt/src/Ui_OutputEditorText.hh:168 msgid "Replace" msgstr "Reemplazar" #: ../gtk/data/editor_text.ui.h:30 ../qt/src/Ui_OutputEditorText.hh:173 msgid "Replace all" msgstr "Reemplazar todo" #: ../gtk/data/editor_text.ui.h:31 ../qt/src/Ui_OutputEditorText.hh:163 msgid "Find previous" msgstr "Buscar anterior " #: ../gtk/data/editor_text.ui.h:32 ../qt/src/Ui_OutputEditorText.hh:158 msgid "Find next" msgstr "Buscar siguiente" #: ../gtk/data/editor_text.ui.h:33 ../qt/src/Ui_OutputEditorText.hh:182 msgid "Match case" msgstr "Distinguir mayúsculas/minúsculas" #: ../gtk/data/gimagereader.ui.h:1 ../qt/src/Ui_MainWindow.hh:65 msgid "Rotate current page" msgstr "Rotar página actual" #: ../gtk/data/gimagereader.ui.h:2 ../qt/src/Ui_MainWindow.hh:66 msgid "Rotate all pages" msgstr "Rotar todas las páginas" #: ../gtk/data/gimagereader.ui.h:3 ../qt/data/MainWindow.ui.h:35 msgid "Toggle output pane" msgstr "Mostrar/ocultar panel de salida" #. Sources toolbar #: ../gtk/data/gimagereader.ui.h:4 ../qt/src/Ui_MainWindow.hh:187 msgid "Recent" msgstr "Reciente" #: ../gtk/data/gimagereader.ui.h:5 ../qt/src/Ui_MainWindow.hh:188 msgid "Paste" msgstr "Pegar" #: ../gtk/data/gimagereader.ui.h:6 ../qt/src/Ui_MainWindow.hh:189 msgid "Take Screenshot" msgstr "Capturar pantalla" #: ../gtk/data/gimagereader.ui.h:7 ../qt/src/Ui_MainWindow.hh:200 msgid "Add images" msgstr "Agregar imágenes" #: ../gtk/data/gimagereader.ui.h:8 ../qt/src/Ui_MainWindow.hh:199 msgid "Add Images" msgstr "Agregar Imágenes" #: ../gtk/data/gimagereader.ui.h:9 ../qt/src/Ui_MainWindow.hh:205 msgid "Remove image from list" msgstr "Quitar imagen de la lista" #: ../gtk/data/gimagereader.ui.h:10 ../qt/src/Ui_MainWindow.hh:208 msgid "Delete image" msgstr "Borrar imagen" #: ../gtk/data/gimagereader.ui.h:11 ../qt/src/Ui_MainWindow.hh:211 msgid "Clear list" msgstr "Borrar lista" #: ../gtk/data/gimagereader.ui.h:12 ../qt/data/MainWindow.ui.h:6 msgid "Files" msgstr "Ficheros" #: ../gtk/data/gimagereader.ui.h:13 ../qt/data/MainWindow.ui.h:16 msgid "Device:" msgstr "Dispositivo:" #: ../gtk/data/gimagereader.ui.h:14 ../qt/data/MainWindow.ui.h:15 #: ../qt/src/TessdataManager.cc:57 msgid "Refresh" msgstr "Actualizar" #: ../gtk/data/gimagereader.ui.h:15 ../qt/data/MainWindow.ui.h:12 msgid "Output:" msgstr "Salida:" #: ../gtk/data/gimagereader.ui.h:16 ../qt/data/MainWindow.ui.h:9 msgid "Mode:" msgstr "Modo:" #: ../gtk/data/gimagereader.ui.h:17 ../gtk/src/OutputEditorHOCR.cc:362 #: ../qt/data/MainWindow.ui.h:11 ../qt/src/OutputEditorHOCR.cc:273 msgid "Color" msgstr "Color" #: ../gtk/data/gimagereader.ui.h:18 ../gtk/src/OutputEditorHOCR.cc:365 #: ../qt/data/MainWindow.ui.h:10 ../qt/src/OutputEditorHOCR.cc:275 #: ../qt/src/OutputEditorHOCR.cc:277 msgid "Grayscale" msgstr "Escala de grises" #: ../gtk/data/gimagereader.ui.h:19 ../qt/data/MainWindow.ui.h:8 msgid "Resolution:" msgstr "Resolución" #: ../gtk/data/gimagereader.ui.h:20 ../qt/data/MainWindow.ui.h:13 msgid "Scan" msgstr "Escanear" #: ../gtk/data/gimagereader.ui.h:21 ../qt/data/MainWindow.ui.h:7 msgid "Acquire" msgstr "Adquirir" #: ../gtk/data/gimagereader.ui.h:22 ../qt/data/MainWindow.ui.h:2 msgid "Brightness" msgstr "Brillo" #: ../gtk/data/gimagereader.ui.h:23 ../qt/data/MainWindow.ui.h:3 msgid "Contrast" msgstr "Contraste" #: ../gtk/data/gimagereader.ui.h:24 ../qt/data/MainWindow.ui.h:4 msgid "Resolution" msgstr "Resolución" #: ../gtk/data/gimagereader.ui.h:25 ../qt/data/MainWindow.ui.h:5 msgid "Invert colors" msgstr "Invertir colores" #: ../gtk/data/gimagereader.ui.h:26 ../qt/data/MainWindow.ui.h:19 msgid "Zoom in" msgstr "Acercar" #: ../gtk/data/gimagereader.ui.h:27 ../qt/data/MainWindow.ui.h:21 msgid "Zoom out" msgstr "Alejar" #: ../gtk/data/gimagereader.ui.h:28 ../qt/data/MainWindow.ui.h:23 msgid "Normal size" msgstr "Tamaño normal" #: ../gtk/data/gimagereader.ui.h:29 ../qt/data/MainWindow.ui.h:25 msgid "Best fit" msgstr "Ajustar" #: ../gtk/data/gimagereader.ui.h:30 ../qt/src/Ui_MainWindow.hh:74 msgid "Select rotation mode" msgstr "Seleccionar modo de rotación" #: ../gtk/data/gimagereader.ui.h:32 ../qt/data/MainWindow.ui.h:31 msgid "Image controls" msgstr "Controles de imagen" #: ../gtk/data/gimagereader.ui.h:33 ../qt/src/Ui_MainWindow.hh:137 msgid "Plain text" msgstr "Texto simple" #: ../gtk/data/gimagereader.ui.h:34 ../qt/src/Ui_MainWindow.hh:137 msgid "hOCR, PDF" msgstr "hOCR, PDF" #: ../gtk/data/gimagereader.ui.h:35 ../qt/data/MainWindow.ui.h:33 msgid "Autodetect layout" msgstr "Autodetectar disposición" #: ../gtk/data/gimagereader.ui.h:36 msgid "Recognize all" msgstr "Reconocer todo" #: ../gtk/data/gimagereader.ui.h:37 msgid "Select language" msgstr "Seleccionar idioma" #: ../gtk/data/gimagereader.ui.h:38 msgid "A graphical frontend to tesseract-ocr" msgstr "Interfaz gráfica para tesseract-ocr" #: ../gtk/data/gimagereader.ui.h:42 msgid "Output pane orientation:" msgstr "Orientación del panel de salida:" #: ../gtk/data/gimagereader.ui.h:43 msgid "Horizontal" msgstr "Horizontal" #: ../gtk/data/gimagereader.ui.h:44 msgid "Vertical" msgstr "Vertical" #: ../gtk/data/gimagereader.ui.h:45 ../qt/data/ConfigDialog.ui.h:18 msgid "Query to install missing spellcheck dictionaries" msgstr "" "Solicitar la instalación de los diccionarios para autocorrección que falten" #: ../gtk/data/gimagereader.ui.h:46 ../qt/data/ConfigDialog.ui.h:4 msgid "Automatically check for new program versions" msgstr "Comprobar automáticamente nuevas versiones del programa" #: ../gtk/data/gimagereader.ui.h:47 ../qt/data/ConfigDialog.ui.h:3 msgid "Predefined language definitions:" msgstr "Definiciones de idioma preconfigurados" #: ../gtk/data/gimagereader.ui.h:48 ../qt/data/ConfigDialog.ui.h:12 msgid "Additional language definitions:" msgstr "Definiciones de idioma adicionales" #: ../gtk/data/gimagereader.ui.h:49 ../qt/data/ConfigDialog.ui.h:20 msgid "The prefix of the tesseract language data file" msgstr "Prefijo para el fichero de idioma de tesseract" #: ../gtk/data/gimagereader.ui.h:50 ../qt/data/ConfigDialog.ui.h:21 msgid "Prefix" msgstr "Prefijo" #: ../gtk/data/gimagereader.ui.h:51 ../qt/data/ConfigDialog.ui.h:22 msgid "The ISO 639-1 language code followed by the country code" msgstr "Codigo de idioma ISO-639-1 seguido del código de país" #: ../gtk/data/gimagereader.ui.h:52 ../qt/data/ConfigDialog.ui.h:23 msgid "ISO Code" msgstr "Código ISO" #: ../gtk/data/gimagereader.ui.h:53 ../qt/data/ConfigDialog.ui.h:24 msgid "The name of the language" msgstr "Nombre del idioma" #: ../gtk/data/gimagereader.ui.h:54 ../qt/data/ConfigDialog.ui.h:25 msgid "Name" msgstr "Nombre" #: ../gtk/data/gimagereader.ui.h:56 ../qt/data/ConfigDialog.ui.h:5 msgid "Output pane font:" msgstr "Tipo de letra del panel de salida" #: ../gtk/data/gimagereader.ui.h:57 ../qt/data/ConfigDialog.ui.h:2 msgid "Default" msgstr "Por omisión" #: ../gtk/data/gimagereader.ui.h:58 ../qt/data/ConfigDialog.ui.h:6 msgid "Language data locations:" msgstr "Ubicación de datos de idioma" #: ../gtk/data/gimagereader.ui.h:59 ../qt/data/ConfigDialog.ui.h:13 msgid "Language definitions path:" msgstr "Ruta para definiciones de idioma:" #: ../gtk/data/gimagereader.ui.h:60 ../qt/data/ConfigDialog.ui.h:28 msgid "Spelling dictionaries path:" msgstr "Ruta para diccionarios:" #: ../gtk/data/gimagereader.ui.h:61 ../qt/data/ConfigDialog.ui.h:10 msgid "System-wide paths" msgstr "Rutas del sistema" #: ../gtk/data/gimagereader.ui.h:62 ../qt/data/ConfigDialog.ui.h:11 msgid "User paths" msgstr "Rutas de usuario" #: ../gtk/data/gimagereader.ui.h:63 ../qt/data/PageRangeDialog.ui.h:1 msgid "Page Range" msgstr "Rango de Páginas" #: ../gtk/data/gimagereader.ui.h:64 ../qt/data/PageRangeDialog.ui.h:2 msgid "Page range:" msgstr "Rango de páginas" #: ../gtk/data/gimagereader.ui.h:65 ../qt/data/PageRangeDialog.ui.h:3 msgid "Example: 1-10, 13, 14-18" msgstr "Ejemplo: 1-10m 13m 14-18" #: ../gtk/data/gimagereader.ui.h:66 ../qt/data/PageRangeDialog.ui.h:4 msgid "Recognition area:" msgstr "Ãrea para el reconocimiento" #: ../gtk/data/gimagereader.ui.h:67 ../gtk/src/Recognizer.cc:403 #: ../qt/data/PageRangeDialog.ui.h:5 ../qt/src/Recognizer.cc:381 msgid "Entire page" msgstr "Página completa" #: ../gtk/data/gimagereader.ui.h:68 ../qt/data/PageRangeDialog.ui.h:6 msgid "Autodetect" msgstr "Autodetectar" #: ../gtk/data/gimagereader.ui.h:69 ../qt/data/PageRangeDialog.ui.h:7 msgid "Prepend to output text:" msgstr "Insertar al texto de salida:" #: ../gtk/data/gimagereader.ui.h:70 ../qt/data/PageRangeDialog.ui.h:8 msgid "Source filename" msgstr "Nombre de archivo de la fuente" #: ../gtk/data/gimagereader.ui.h:71 ../qt/data/PageRangeDialog.ui.h:9 msgid "Source page" msgstr "Página de fuente" #: ../gtk/data/gimagereader.ui.h:72 ../qt/src/TessdataManager.cc:47 msgid "Tessdata Manager" msgstr "Gestor de Tessdata" #: ../gtk/data/gimagereader.ui.h:75 ../qt/src/TessdataManager.cc:49 msgid "Manage installed languages:" msgstr "Gestionar idiomas instalados" #: ../gtk/data/gimagereader.ui.h:76 ../qt/src/DisplayerToolSelect.cc:240 msgid "Delete" msgstr "Borrar" #: ../gtk/data/gimagereader.ui.h:77 ../qt/src/DisplayerToolSelect.cc:226 msgid "Order:" msgstr "Orden:" #: ../gtk/data/gimagereader.ui.h:78 ../gtk/src/DisplayerToolHOCR.cc:28 #: ../qt/src/DisplayerToolHOCR.cc:30 ../qt/src/DisplayerToolSelect.cc:241 msgid "Recognize" msgstr "Reconocer" #: ../gtk/data/gimagereader.ui.h:79 ../qt/src/DisplayerToolSelect.cc:242 msgid "Recognize to clipboard" msgstr "Reconocer en el portapapeles" #: ../gtk/data/gimagereader.ui.h:80 ../qt/src/DisplayerToolSelect.cc:243 msgid "Save as image" msgstr "Guardar como imagen" #: ../gtk/data/gimagereader.ui.h:81 ../qt/src/Recognizer.cc:76 msgid "Current Page" msgstr "Página actual" #: ../gtk/data/gimagereader.ui.h:82 ../qt/src/Recognizer.cc:79 msgid "Multiple Pages..." msgstr "Múltiples páginas" #: ../gtk/src/Acquirer.cc:83 ../qt/src/Acquirer.cc:63 msgid "scan.png" msgstr "escaneo.png" #: ../gtk/src/Acquirer.cc:96 ../qt/src/Acquirer.cc:80 msgid "Images" msgstr "Imágenes" #: ../gtk/src/Acquirer.cc:97 ../qt/src/Acquirer.cc:81 msgid "Choose Output Filename..." msgstr "Escoja Nombre de Fichero de Salida" #: ../gtk/src/Acquirer.cc:112 ../qt/src/Acquirer.cc:96 msgid "Failed to initialize the scanning backend." msgstr "Fallo al iniciar el sistema de escaneo" #: ../gtk/src/Acquirer.cc:121 ../qt/src/Acquirer.cc:102 msgid "Scan failed" msgstr "Fallo al escanear" #: ../gtk/src/Acquirer.cc:139 ../qt/src/Acquirer.cc:118 msgid "No scanners were detected." msgstr "No se encontró ningun escáner" #: ../gtk/src/Acquirer.cc:156 ../gtk/src/Acquirer.cc:173 #: ../qt/src/Acquirer.cc:132 ../qt/src/Acquirer.cc:149 msgid "Starting scan..." msgstr "Comenzando escaneo..." #: ../gtk/src/Acquirer.cc:169 ../qt/src/Acquirer.cc:145 msgid "Opening device..." msgstr "Abriendo dispositivo" #: ../gtk/src/Acquirer.cc:171 ../qt/src/Acquirer.cc:147 msgid "Setting options..." msgstr "Ajustando opciones..." #: ../gtk/src/Acquirer.cc:175 ../qt/src/Acquirer.cc:151 msgid "Getting parameters..." msgstr "Obteniendo parámetros..." #: ../gtk/src/Acquirer.cc:177 ../qt/src/Acquirer.cc:153 msgid "Transferring data..." msgstr "Transfiriendo datos..." #: ../gtk/src/Acquirer.cc:184 ../qt/src/Acquirer.cc:160 msgid "Canceling scan..." msgstr "Cancelando escaneo..." #: ../gtk/src/Config.cc:297 ../qt/data/ConfigDialog.ui.h:7 msgid "Filename prefix" msgstr "Prefijo del nombre de fichero" #: ../gtk/src/Config.cc:298 ../qt/data/ConfigDialog.ui.h:8 msgid "Code" msgstr "Código" #: ../gtk/src/Config.cc:299 ../qt/data/ConfigDialog.ui.h:9 msgid "Native name" msgstr "Nombre nativo" #: ../gtk/src/CrashHandler.cc:26 ../gtk/src/CrashHandler.cc:43 #: ../qt/src/CrashHandler.cc:34 msgid "Crash Handler" msgstr "Gestor de fallos" #: ../gtk/src/CrashHandler.cc:45 ../qt/src/CrashHandler.cc:29 msgid "Your work has been saved under %1." msgstr "Su trabajo se ha guardado en %1." #: ../gtk/src/CrashHandler.cc:47 ../qt/src/CrashHandler.cc:31 msgid "There was no unsaved work." msgstr "No hay trabajos sin guardar." #: ../gtk/src/CrashHandler.cc:106 ../qt/src/CrashHandler.cc:60 msgid "Failed to obtain backtrace. Is gdb installed?" msgstr "Fallo al obtener traza del fallo. ¿Está instalado gdb?" #: ../gtk/src/Displayer.cc:261 ../qt/src/Displayer.cc:231 msgid "Failed to load image" msgstr "Fallo al cargar imagen" #: ../gtk/src/Displayer.cc:261 ../qt/src/Displayer.cc:231 msgid "" "The file might not be an image or be corrupt:\n" "%1" msgstr "" "Puede que el fichero no sea una imagen o esté deteriorado:\n" "%1" #: ../gtk/src/DisplayerToolSelect.cc:39 ../qt/src/DisplayerToolSelect.cc:40 msgid "selection.png" msgstr "seleccion.png" #: ../gtk/src/DisplayerToolSelect.cc:148 ../qt/src/DisplayerToolSelect.cc:139 msgid "PNG Images" msgstr "Imágenes PNG" #: ../gtk/src/DisplayerToolSelect.cc:149 ../qt/src/DisplayerToolSelect.cc:139 msgid "Save Selection Image" msgstr "Guardar Imagen de la selección" #: ../gtk/src/DisplayerToolSelect.cc:157 ../qt/src/DisplayerToolSelect.cc:147 msgid "Recognize all" msgstr "Reconocer todo" #: ../gtk/src/DisplayerToolSelect.cc:157 ../qt/src/DisplayerToolSelect.cc:147 msgid "Recognize selection" msgstr "Reconocer selección" #: ../gtk/src/DisplayerToolSelect.cc:194 ../qt/src/DisplayerToolSelect.cc:184 msgid "Performing layout analysis" msgstr "Analizando estructura" #: ../gtk/src/FileDialogs.cc:237 msgid "" "A file named \"%1\" already exists. Are you sure you want to overwrite it?" msgstr "" "Ya existe un fichero llamado \"%1\". ¿Seguro que quiere sobreescribirlo?" #: ../gtk/src/FileDialogs.cc:239 msgid "Overwrite File?" msgstr "¿Sobreescribir fichero?" #: ../gtk/src/MainWindow.cc:125 ../qt/src/MainWindow.cc:274 msgid "Using tesseract" msgstr "Utilizando tesseract" #: ../gtk/src/MainWindow.cc:191 ../qt/src/MainWindow.cc:181 msgid "Select an image to begin..." msgstr "Seleccionar una imagen para comenzar..." #: ../gtk/src/MainWindow.cc:306 ../qt/src/MainWindow.cc:262 msgid "Multiple sources" msgstr "Múltiples orígenes" #: ../gtk/src/MainWindow.cc:307 ../qt/src/MainWindow.cc:263 msgid "Ready" msgstr "Listo" #: ../gtk/src/MainWindow.cc:446 ../qt/src/MainWindow.cc:390 msgid "New version" msgstr "Nueva versión" #: ../gtk/src/MainWindow.cc:446 ../qt/src/MainWindow.cc:390 msgid "gImageReader %1 is available" msgstr "gImageReader %1 está disponible" #: ../gtk/src/MainWindow.cc:447 ../qt/src/MainWindow.cc:391 msgid "Download" msgstr "Descargar" #: ../gtk/src/MainWindow.cc:448 ../qt/src/MainWindow.cc:392 msgid "Changelog" msgstr "Registro de cambios" #: ../gtk/src/MainWindow.cc:449 ../qt/src/MainWindow.cc:393 msgid "Don't notify again" msgstr "No mostrar más avisos" #: ../gtk/src/MainWindow.cc:468 ../qt/src/MainWindow.cc:438 msgid "Don't show again" msgstr "No mostrar otra vez" #: ../gtk/src/MainWindow.cc:469 ../gtk/src/MainWindow.cc:482 #: ../qt/src/MainWindow.cc:439 msgid "Install" msgstr "Instalar" #: ../gtk/src/MainWindow.cc:489 ../qt/src/MainWindow.cc:451 msgid "Spelling dictionary missing" msgstr "Falta diccionario" #: ../gtk/src/MainWindow.cc:489 ../qt/src/MainWindow.cc:451 msgid "The spellcheck dictionary for %1 is not installed" msgstr "El diccionario para %1 no está instalado" #: ../gtk/src/MainWindow.cc:496 ../gtk/src/MainWindow.cc:528 #: ../qt/src/MainWindow.cc:458 msgid "Installing spelling dictionary for '%1'" msgstr "Instalando diccionario para '%1'" #: ../gtk/src/MainWindow.cc:517 ../gtk/src/MainWindow.cc:542 #: ../gtk/src/MainWindow.cc:550 ../gtk/src/MainWindow.cc:560 #: ../gtk/src/MainWindow.cc:566 ../gtk/src/MainWindow.cc:595 #: ../gtk/src/OutputEditorHOCR.cc:1375 ../gtk/src/Recognizer.cc:163 #: ../gtk/src/TessdataManager.cc:58 ../gtk/src/TessdataManager.cc:68 #: ../gtk/src/TessdataManager.cc:290 ../qt/src/MainWindow.cc:477 #: ../qt/src/MainWindow.cc:490 ../qt/src/MainWindow.cc:500 #: ../qt/src/MainWindow.cc:510 ../qt/src/MainWindow.cc:518 #: ../qt/src/MainWindow.cc:546 ../qt/src/OutputEditorHOCR.cc:1157 #: ../qt/src/Recognizer.cc:138 ../qt/src/TessdataManager.cc:72 #: ../qt/src/TessdataManager.cc:82 ../qt/src/TessdataManager.cc:275 msgid "Error" msgstr "Error" #: ../gtk/src/MainWindow.cc:517 ../qt/src/MainWindow.cc:477 msgid "Failed to install spelling dictionary: %1" msgstr "Fallo al instalar el diccionario: %1" #: ../gtk/src/MainWindow.cc:542 ../qt/src/MainWindow.cc:490 msgid "Failed to create directory for spelling dictionaries." msgstr "Fallo al crear el directorio para los diccionarios" #: ../gtk/src/MainWindow.cc:550 ../gtk/src/MainWindow.cc:566 #: ../qt/src/MainWindow.cc:500 msgid "Could not read %1: %2." msgstr "No se pudo leer %1: %2." #: ../gtk/src/MainWindow.cc:560 ../gtk/src/MainWindow.cc:595 #: ../qt/src/MainWindow.cc:510 ../qt/src/MainWindow.cc:546 msgid "No spelling dictionaries found for '%1'." msgstr "No se han encontrado diccionarios ortográficos para '%1'" #: ../gtk/src/MainWindow.cc:576 ../qt/src/MainWindow.cc:529 msgid "Downloading '%1'..." msgstr "Descargando '%1'..." #: ../gtk/src/MainWindow.cc:592 ../qt/src/MainWindow.cc:543 msgid "Dictionaries installed" msgstr "Diccionarios instalados" #: ../gtk/src/MainWindow.cc:592 msgid "The following dictionaries were installed:%1" msgstr "Instalado los siguientes diccionarios:%1" #: ../gtk/src/OutputEditorHOCR.cc:319 ../qt/src/OutputEditorHOCR.cc:291 msgid "Document" msgstr "Documento" #: ../gtk/src/OutputEditorHOCR.cc:368 ../qt/src/OutputEditorHOCR.cc:279 msgid "Monochrome" msgstr "Monocromo" #: ../gtk/src/OutputEditorHOCR.cc:377 ../qt/src/OutputEditorHOCR.cc:281 msgid "Threshold (closest color)" msgstr "Umbral (color más parecido)" #: ../gtk/src/OutputEditorHOCR.cc:380 ../qt/src/OutputEditorHOCR.cc:282 msgid "Diffuse" msgstr "Difuso" #: ../gtk/src/OutputEditorHOCR.cc:389 ../qt/src/OutputEditorHOCR.cc:283 msgid "Zip (lossless)" msgstr "Zip (sin pérdida)" #: ../gtk/src/OutputEditorHOCR.cc:393 ../qt/src/OutputEditorHOCR.cc:284 msgid "CCITT Group 4 (lossless)" msgstr "CCITT Grupo 4 (sin pérdida)" #: ../gtk/src/OutputEditorHOCR.cc:397 ../qt/src/OutputEditorHOCR.cc:285 msgid "Jpeg (lossy)" msgstr "Jpeg (con pérdida)" #: ../gtk/src/OutputEditorHOCR.cc:553 ../qt/src/OutputEditorHOCR.cc:429 msgid "" "The following pages could not be processed:\n" "%1" msgstr "" "Las siguientes páginas no se pudieron procesar:\n" "%1" #: ../gtk/src/OutputEditorHOCR.cc:554 ../qt/src/OutputEditorHOCR.cc:430 msgid "Recognition errors" msgstr "Hubo errores durante el reconocimiento" #. Add tree item #: ../gtk/src/OutputEditorHOCR.cc:647 ../gtk/src/OutputEditorHOCR.cc:1037 #: ../qt/src/OutputEditorHOCR.cc:504 ../qt/src/OutputEditorHOCR.cc:894 msgid "Graphic" msgstr "Gráfico" #: ../gtk/src/OutputEditorHOCR.cc:703 ../qt/src/OutputEditorHOCR.cc:563 msgid "Paragraph" msgstr "Párrafo" #: ../gtk/src/OutputEditorHOCR.cc:706 ../qt/src/OutputEditorHOCR.cc:566 msgid "Textline" msgstr "Línea de texto" #: ../gtk/src/OutputEditorHOCR.cc:1136 ../qt/src/OutputEditorHOCR.cc:950 msgid "Merge" msgstr "Fusionar" #: ../gtk/src/OutputEditorHOCR.cc:1161 ../qt/src/OutputEditorHOCR.cc:977 msgid "Add graphic region" msgstr "Añadir zona gráfica" #: ../gtk/src/OutputEditorHOCR.cc:1177 ../qt/src/OutputEditorHOCR.cc:985 msgid "No suggestions" msgstr "Sin sugerencias" #: ../gtk/src/OutputEditorHOCR.cc:1183 ../qt/src/OutputEditorHOCR.cc:989 msgid "Add to dictionary" msgstr "Añadir a diccionario" #: ../gtk/src/OutputEditorHOCR.cc:1189 ../qt/src/OutputEditorHOCR.cc:990 msgid "Ignore word" msgstr "Ignorar palabra" #: ../gtk/src/OutputEditorHOCR.cc:1222 ../qt/src/OutputEditorHOCR.cc:1007 msgid "Expand all" msgstr "Expandir" #: ../gtk/src/OutputEditorHOCR.cc:1225 ../qt/src/OutputEditorHOCR.cc:1008 msgid "Collapse all" msgstr "Contraer" #: ../gtk/src/OutputEditorHOCR.cc:1248 ../gtk/src/OutputEditorHOCR.cc:1287 #: ../qt/src/OutputEditorHOCR.cc:1049 ../qt/src/OutputEditorHOCR.cc:1079 msgid "hOCR HTML Files" msgstr "Ficheros HTML de hOCR " #: ../gtk/src/OutputEditorHOCR.cc:1249 ../qt/src/OutputEditorHOCR.cc:1049 msgid "Open hOCR File" msgstr "Abrir fichero hOCR" #: ../gtk/src/OutputEditorHOCR.cc:1258 ../qt/src/OutputEditorHOCR.cc:1055 msgid "Failed to open file" msgstr "No se pudo abrir el fichero" #: ../gtk/src/OutputEditorHOCR.cc:1258 ../qt/src/OutputEditorHOCR.cc:1055 msgid "The file could not be opened: %1." msgstr "No se pudo abrir el fichero: %1." #: ../gtk/src/OutputEditorHOCR.cc:1267 ../qt/src/OutputEditorHOCR.cc:1062 msgid "Invalid hOCR file" msgstr "Fichero hOCR no válido" #: ../gtk/src/OutputEditorHOCR.cc:1267 ../qt/src/OutputEditorHOCR.cc:1062 msgid "The file does not appear to contain valid hOCR HTML: %1" msgstr "El fichero no parece contener HTML válido de hOCR: %1" #: ../gtk/src/OutputEditorHOCR.cc:1283 ../gtk/src/OutputEditorHOCR.cc:1343 #: ../gtk/src/OutputEditorText.cc:306 ../qt/src/OutputEditorHOCR.cc:1077 #: ../qt/src/OutputEditorHOCR.cc:1131 ../qt/src/OutputEditorText.cc:246 msgid "output" msgstr "salida" #: ../gtk/src/OutputEditorHOCR.cc:1288 ../qt/src/OutputEditorHOCR.cc:1079 msgid "Save hOCR Output..." msgstr "Guardar salida hOCR..." #: ../gtk/src/OutputEditorHOCR.cc:1296 ../gtk/src/OutputEditorHOCR.cc:1357 #: ../gtk/src/OutputEditorText.cc:319 ../qt/src/OutputEditorHOCR.cc:1087 #: ../qt/src/OutputEditorHOCR.cc:1143 ../qt/src/OutputEditorText.cc:256 msgid "Failed to save output" msgstr "Fallo al guardar salida" #: ../gtk/src/OutputEditorHOCR.cc:1296 ../gtk/src/OutputEditorHOCR.cc:1357 #: ../gtk/src/OutputEditorText.cc:319 ../qt/src/OutputEditorHOCR.cc:1087 #: ../qt/src/OutputEditorHOCR.cc:1143 ../qt/src/OutputEditorText.cc:256 msgid "Check that you have writing permissions in the selected folder." msgstr "Compruebe que tiene permiso de escritura en el directorio seleccionado" #: ../gtk/src/OutputEditorHOCR.cc:1346 ../qt/src/OutputEditorHOCR.cc:1133 msgid "PDF Files" msgstr "Ficheros PDF" #: ../gtk/src/OutputEditorHOCR.cc:1347 ../qt/src/OutputEditorHOCR.cc:1133 msgid "Save PDF Output..." msgstr "Guardar salida PDF..." #: ../gtk/src/OutputEditorHOCR.cc:1375 ../qt/src/OutputEditorHOCR.cc:1157 msgid "The PDF library does not support the selected font." msgstr "La biblioteca PDF no da soporte a la tipografía seleccionada" #: ../gtk/src/OutputEditorHOCR.cc:1435 ../qt/src/OutputEditorHOCR.cc:1216 msgid "Errors occurred" msgstr "Se encontraron errores" #: ../gtk/src/OutputEditorHOCR.cc:1435 ../qt/src/OutputEditorHOCR.cc:1216 msgid "" "The following pages could not be rendered:\n" "%1" msgstr "" "Las siguientes páginas no se pudieron generar:\n" "%1" #: ../gtk/src/OutputEditorHOCR.cc:1562 ../gtk/src/OutputEditorText.cc:333 #: ../qt/src/OutputEditorHOCR.cc:1331 ../qt/src/OutputEditorText.cc:269 msgid "Output not saved" msgstr "Salida no guardada" #: ../gtk/src/OutputEditorHOCR.cc:1562 ../gtk/src/OutputEditorText.cc:333 #: ../qt/src/OutputEditorHOCR.cc:1331 ../qt/src/OutputEditorText.cc:269 msgid "Save output before proceeding?" msgstr "¿Guardar antes de comenzar?" #: ../gtk/src/OutputEditorText.cc:197 ../qt/src/OutputEditorText.cc:158 msgid "Stripping line breaks..." msgstr "Quitando saltos de línea" #: ../gtk/src/OutputEditorText.cc:211 msgid "Check spelling" msgstr "Comprobando ortografía" #: ../gtk/src/OutputEditorText.cc:238 ../qt/src/OutputEditorText.cc:178 msgid "Replacing..." msgstr "Reemplazando..." #: ../gtk/src/OutputEditorText.cc:264 ../qt/src/OutputEditorText.cc:204 msgid "File: %1" msgstr "Archivio: %1" #: ../gtk/src/OutputEditorText.cc:267 ../qt/src/OutputEditorText.cc:207 msgid "Page: %1" msgstr "Página: %1" #: ../gtk/src/OutputEditorText.cc:280 ../gtk/src/Recognizer.cc:481 #: ../qt/src/Recognizer.cc:460 msgid "" "\n" "[Failed to recognize page %1]\n" msgstr "" "\n" "[Fallo al reconocer página %1]\n" #: ../gtk/src/OutputEditorText.cc:310 ../qt/src/OutputEditorText.cc:248 msgid "Text Files" msgstr "Ficheros de texto" #: ../gtk/src/OutputEditorText.cc:311 ../qt/src/OutputEditorText.cc:248 msgid "Save Output..." msgstr "Guardar Salida" #: ../gtk/src/Recognizer.cc:156 ../qt/src/Recognizer.cc:131 msgid "" "Tesseract crashed with the following message:\n" "\n" "%1\n" "\n" "This typically happens for one of the following reasons:\n" "- Outdated traineddata files are used.\n" "- Auxiliary language data files are missing.\n" "- Corrupt language data files.\n" "\n" "Make sure your language data files are valid and compatible with tesseract " "%2." msgstr "" "Tesseract falló con el siguiente mensaje:\n" "\n" "%1\n" "\n" "Esto normalmente ocurre por uno de los siguientes motivos:\n" "- Se han usado ficheros traineddata desactualizados.\n" "- No se encontraron ficheros auxiliares de idioma.\n" "- Ficheros de idioma dañados.\n" "\n" "Asegúrese de que los ficheros de idioma son válidos y compatibles con " "tesseract %2." #: ../gtk/src/Recognizer.cc:212 ../qt/src/Recognizer.cc:191 msgid "No languages available" msgstr "No hay idiomas disponibles" #: ../gtk/src/Recognizer.cc:212 ../qt/src/Recognizer.cc:191 msgid "" "No tesseract languages are available for use. Recognition will not work." msgstr "" "No se encontraron idiomas de tesseract. El reconocimiento no funcionará" #: ../gtk/src/Recognizer.cc:266 ../qt/src/Recognizer.cc:251 msgid "Multilingual" msgstr "Multilenguaje" #: ../gtk/src/Recognizer.cc:318 ../qt/src/Recognizer.cc:295 msgid "Automatic page segmentation" msgstr "Segmentado de página automático" #: ../gtk/src/Recognizer.cc:319 ../qt/src/Recognizer.cc:296 msgid "Page segmentation with orientation and script detection" msgstr "Segmentado de página con detección de tipo de escritura y orientación" #: ../gtk/src/Recognizer.cc:320 ../qt/src/Recognizer.cc:297 msgid "Assume single column of text" msgstr "Suponer una sola columna de texto" #: ../gtk/src/Recognizer.cc:321 ../qt/src/Recognizer.cc:298 msgid "Assume single block of vertically aligned text" msgstr "Suponer un solo bloque de texto alineado verticalmente" #: ../gtk/src/Recognizer.cc:322 ../qt/src/Recognizer.cc:299 msgid "Assume a single uniform block of text" msgstr "Suponer un solo bloque de texto uniforme" #: ../gtk/src/Recognizer.cc:323 ../qt/src/Recognizer.cc:300 msgid "Assume a line of text" msgstr "Suponer una línea de texto" #: ../gtk/src/Recognizer.cc:324 ../qt/src/Recognizer.cc:301 msgid "Assume a single word" msgstr "Suponer una sola palabra" #: ../gtk/src/Recognizer.cc:325 ../qt/src/Recognizer.cc:302 msgid "Assume a single word in a circle" msgstr "Suponer una sola palabra en un círculo" #: ../gtk/src/Recognizer.cc:326 ../qt/src/Recognizer.cc:303 msgid "Sparse text in no particular order" msgstr "Texto disperso sin un orden en particular" #: ../gtk/src/Recognizer.cc:327 ../qt/src/Recognizer.cc:304 msgid "Sparse text with orientation and script detection" msgstr "Texto disperso con detección de tipo de escritura y orientación" #: ../gtk/src/Recognizer.cc:341 ../qt/src/Recognizer.cc:314 msgid "Page segmentation mode" msgstr "Modo de segmentado de página" #: ../gtk/src/Recognizer.cc:347 ../qt/src/Recognizer.cc:321 msgid "Manage languages..." msgstr "Gestionar idiomas..." #: ../gtk/src/Recognizer.cc:403 ../qt/src/Recognizer.cc:381 msgid "Current selection" msgstr "Selección actual" #: ../gtk/src/Recognizer.cc:475 ../qt/src/Recognizer.cc:454 msgid "Recognizing page %1 (%2 of %3)" msgstr "Reconociendo página %1 (%2 de %3)" #: ../gtk/src/Recognizer.cc:480 ../qt/src/Recognizer.cc:459 msgid "" "\n" "- Page %1: failed to render page" msgstr "" "\n" "\tPágina %1: fallo al dibujar página" #: ../gtk/src/Recognizer.cc:510 ../gtk/src/Recognizer.cc:539 #: ../gtk/src/Recognizer.cc:552 ../qt/src/Recognizer.cc:488 #: ../qt/src/Recognizer.cc:517 ../qt/src/Recognizer.cc:530 msgid "Recognizing..." msgstr "Reconociendo..." #: ../gtk/src/Recognizer.cc:514 ../gtk/src/Recognizer.cc:522 #: ../qt/src/Recognizer.cc:492 ../qt/src/Recognizer.cc:500 msgid "Recognition errors occurred" msgstr "Hubo errores durante el reconocimiento" #: ../gtk/src/Recognizer.cc:514 ../qt/src/Recognizer.cc:492 msgid "The following errors occurred:%1" msgstr "Ocurrieron los siguientes errores: %1" #: ../gtk/src/Recognizer.cc:522 ../qt/src/Recognizer.cc:500 msgid "Failed to initialize tesseract" msgstr "Fallo al iniciar tesseract" #: ../gtk/src/scanner/ScannerSane.cc:83 ../gtk/src/scanner/ScannerTwain.cc:287 #: ../qt/src/scanner/ScannerSane.cc:85 ../qt/src/scanner/ScannerTwain.cc:285 msgid "Scan canceled" msgstr "Escaneo cancelado" #: ../gtk/src/scanner/ScannerSane.cc:157 ../gtk/src/scanner/ScannerTwain.cc:186 #: ../qt/src/scanner/ScannerSane.cc:158 ../qt/src/scanner/ScannerTwain.cc:178 msgid "No scanner specified" msgstr "No se indicó ningún escáner" #: ../gtk/src/scanner/ScannerSane.cc:166 ../gtk/src/scanner/ScannerTwain.cc:195 #: ../qt/src/scanner/ScannerSane.cc:167 ../qt/src/scanner/ScannerTwain.cc:187 msgid "Unable to connect to scanner" msgstr "No se pudo conectar al escáner" #: ../gtk/src/scanner/ScannerSane.cc:386 ../gtk/src/scanner/ScannerTwain.cc:265 #: ../gtk/src/scanner/ScannerTwain.cc:291 ../qt/src/scanner/ScannerSane.cc:387 #: ../qt/src/scanner/ScannerTwain.cc:257 ../qt/src/scanner/ScannerTwain.cc:289 msgid "Unable to start scan" msgstr "No se pudo iniciar el escaneo" #: ../gtk/src/scanner/ScannerSane.cc:394 ../gtk/src/scanner/ScannerSane.cc:437 #: ../gtk/src/scanner/ScannerTwain.cc:317 ../qt/src/scanner/ScannerSane.cc:395 #: ../qt/src/scanner/ScannerSane.cc:438 ../qt/src/scanner/ScannerTwain.cc:315 msgid "Error communicating with scanner" msgstr "Error al comunicarse con el escáner" #: ../gtk/src/scanner/ScannerSane.cc:498 ../qt/src/scanner/ScannerSane.cc:494 msgid "Failed to save image" msgstr "Fallo al guardar imagen" #: ../gtk/src/SourceManager.cc:118 ../qt/src/SourceManager.cc:112 msgid "Unable to open files" msgstr "No se pudieron abrir los ficheros" #: ../gtk/src/SourceManager.cc:118 ../qt/src/SourceManager.cc:112 msgid "The following files could not be opened:%1" msgstr "Los siguientes ficheros no se pudieron abrir: %1" #: ../gtk/src/SourceManager.cc:134 ../qt/src/SourceManager.cc:154 msgid "Images and PDFs" msgstr "Imagenes y PDFs" #: ../gtk/src/SourceManager.cc:137 ../qt/src/SourceManager.cc:155 msgid "Select Files" msgstr "Seleccionar ficheros" #: ../gtk/src/SourceManager.cc:143 ../qt/src/SourceManager.cc:166 msgid "Clipboard Error" msgstr "Error de portapapeles" #: ../gtk/src/SourceManager.cc:143 ../qt/src/SourceManager.cc:166 msgid "Failed to read the clipboard." msgstr "Fallo al leer el portapapeles." #: ../gtk/src/SourceManager.cc:147 ../qt/src/SourceManager.cc:170 #: ../qt/src/SourceManager.cc:176 msgid "Pasted %1" msgstr "Pegado %1" #: ../gtk/src/SourceManager.cc:159 ../qt/src/SourceManager.cc:183 msgid "Screenshot Error" msgstr "Error en captura de pantalla" #: ../gtk/src/SourceManager.cc:159 ../qt/src/SourceManager.cc:183 msgid "Failed to take screenshot." msgstr "Fallo al tomar captura de pantalla" #: ../gtk/src/SourceManager.cc:163 ../qt/src/SourceManager.cc:187 msgid "Screenshot %1" msgstr "Captura de pantalla %1" #: ../gtk/src/SourceManager.cc:168 ../qt/src/SourceManager.cc:192 msgid "Saving image..." msgstr "Guardando imagen..." #: ../gtk/src/SourceManager.cc:175 ../qt/src/SourceManager.cc:205 msgid "Cannot Write File" msgstr "No se pudo escribir fichero" #: ../gtk/src/SourceManager.cc:175 ../qt/src/SourceManager.cc:205 msgid "Could not write to %1." msgstr "No se pudo escribir en %1." #: ../gtk/src/SourceManager.cc:202 ../qt/src/SourceManager.cc:227 msgid "Delete File?" msgstr "¿Borrar fichero?" #: ../gtk/src/SourceManager.cc:202 ../qt/src/SourceManager.cc:227 msgid "The following files will be deleted:%1" msgstr "Los siguientes ficheros serán borrados:%1" #: ../gtk/src/SourceManager.cc:266 ../qt/src/SourceManager.cc:278 msgid "Missing File" msgstr "Falta fichero" #: ../gtk/src/SourceManager.cc:266 ../qt/src/SourceManager.cc:278 msgid "" "The following file has been deleted or moved:\n" "%1" msgstr "" "El siguiente fichero ha sido borrado o movido:\n" "%1" #: ../gtk/src/SubstitutionsManager.cc:39 ../qt/src/SubstitutionsManager.cc:77 msgid "Search for" msgstr "Buscar" #: ../gtk/src/SubstitutionsManager.cc:40 ../qt/src/SubstitutionsManager.cc:77 msgid "Replace with" msgstr "Reemplazar con" #: ../gtk/src/SubstitutionsManager.cc:62 ../qt/src/SubstitutionsManager.cc:99 msgid "substitution_list.txt" msgstr "substitution_list.txt" #: ../gtk/src/SubstitutionsManager.cc:84 ../gtk/src/SubstitutionsManager.cc:119 #: ../qt/src/SubstitutionsManager.cc:114 ../qt/src/SubstitutionsManager.cc:152 msgid "Substitutions List" msgstr "Lista de sustituciones" #: ../gtk/src/SubstitutionsManager.cc:85 ../qt/src/SubstitutionsManager.cc:114 msgid "Open Substitutions List" msgstr "Abrir lista de sustituciones" #: ../gtk/src/SubstitutionsManager.cc:90 ../qt/src/SubstitutionsManager.cc:119 msgid "Error Reading File" msgstr "Error al leer fichero" #: ../gtk/src/SubstitutionsManager.cc:90 ../qt/src/SubstitutionsManager.cc:119 msgid "Unable to read '%1'." msgstr "No se pudo leer '%1'." #: ../gtk/src/SubstitutionsManager.cc:113 ../qt/src/SubstitutionsManager.cc:146 msgid "Errors Occurred Reading File" msgstr "Ocurrieron errores al leer fichero" #: ../gtk/src/SubstitutionsManager.cc:113 ../qt/src/SubstitutionsManager.cc:146 msgid "Some entries of the substitutions list could not be read." msgstr "Algunas entradas de la lista de sustituciones no se pudieron leer" #: ../gtk/src/SubstitutionsManager.cc:120 ../qt/src/SubstitutionsManager.cc:152 msgid "Save Substitutions List" msgstr "Guardar lista de sustituciones" #: ../gtk/src/SubstitutionsManager.cc:126 ../qt/src/SubstitutionsManager.cc:158 msgid "Error Saving File" msgstr "Error al guardar fichero" #: ../gtk/src/SubstitutionsManager.cc:126 ../qt/src/SubstitutionsManager.cc:158 msgid "Unable to write to '%1'." msgstr "No se pudo escribir en '%1'." #: ../gtk/src/SubstitutionsManager.cc:144 ../qt/src/SubstitutionsManager.cc:172 msgid "Save List?" msgstr "¿Guardar lista?" #: ../gtk/src/SubstitutionsManager.cc:144 ../qt/src/SubstitutionsManager.cc:172 msgid "Do you want to save the current list?" msgstr "¿Quiere guardar la lista actual?" #: ../gtk/src/SubstitutionsManager.cc:179 ../qt/src/SubstitutionsManager.cc:208 msgid "Applying substitutions..." msgstr "Aplicando sustituciones" #: ../gtk/src/TessdataManager.cc:58 ../qt/src/TessdataManager.cc:72 msgid "" "PackageKit is required for managing system-wide tesseract language packs, " "but it was not found. Please use the system package management software to " "manage the tesseract language packs, or switch to use the user tessdata path " "in the configuration dialog." msgstr "" "Se requiere PackageKit para gestionar los paquetes de idioma de tesseract " "del sistema, pero no se encontró. Por favor, use el gestor de paquetes de su " "sistema para gestionar los paquetes de idioma de tesseract, o cambie la " "configuración para usar las rutas de usuario para localizar los ficheros " "tessdata" #: ../gtk/src/TessdataManager.cc:63 ../qt/src/TessdataManager.cc:77 msgid "Fetching available languages" msgstr "Obteniendo idiomas disponibles" #: ../gtk/src/TessdataManager.cc:68 ../gtk/src/TessdataManager.cc:89 #: ../gtk/src/TessdataManager.cc:121 ../qt/src/TessdataManager.cc:82 #: ../qt/src/TessdataManager.cc:94 ../qt/src/TessdataManager.cc:127 msgid "Failed to fetch list of available languages: %1" msgstr "Fallo al obtener la lista de idiomas disponibles: %1" #: ../gtk/src/TessdataManager.cc:100 ../gtk/src/TessdataManager.cc:129 #: ../qt/src/TessdataManager.cc:105 ../qt/src/TessdataManager.cc:114 #: ../qt/src/TessdataManager.cc:136 ../qt/src/TessdataManager.cc:147 msgid "Parsing error: %1" msgstr "Analizando error: %1" #: ../gtk/src/TessdataManager.cc:191 ../qt/src/TessdataManager.cc:191 msgid "Applying changes..." msgstr "Aplicando cambios..." #: ../gtk/src/TessdataManager.cc:252 ../qt/src/TessdataManager.cc:237 msgid "Failed to create directory for tessdata files." msgstr "Fallo al crear directorio para los ficheros tessdata" #: ../gtk/src/TessdataManager.cc:261 ../qt/src/TessdataManager.cc:245 msgid "Downloading %1..." msgstr "Descargando %1..." #: ../gtk/src/TessdataManager.cc:281 ../qt/src/TessdataManager.cc:267 msgid "" "The following files could not be downloaded or removed:\n" "%1\n" "\n" "Check the connectivity and directory permissions." msgstr "" "Los siguientes ficheros no pudieron ser descargados o eliminados:\n" "%1\n" "\n" "Compruebe la conectividad y los permisos de directorio." #: ../gtk/src/Utils.cc:62 msgid "Yes" msgstr "Sí" #: ../gtk/src/Utils.cc:65 msgid "No" msgstr "No" #: ../gtk/src/Utils.cc:74 msgid "Discard" msgstr "Descartar" #: ../qt/data/AboutDialog.ui.h:1 msgid "About gImageReader" msgstr "Acerca de gImageReader" #: ../qt/data/AboutDialog.ui.h:3 msgid "" "

 

A graphical frontend to tesseract-ocr

Website

 

" msgstr "" "

 

Interfaz gráfica para tesseract-ocr

Website

 

" #: ../qt/data/AboutDialog.ui.h:4 msgid "Credits" msgstr "Agradecimientos" #: ../qt/data/AboutDialog.ui.h:5 msgid "License" msgstr "Licencia" #: ../qt/data/ConfigDialog.ui.h:14 msgid "System encoding" msgstr "Codificación del sistema" #: ../qt/data/ConfigDialog.ui.h:15 msgid "UTF-8" msgstr "UTF-8" #: ../qt/data/ConfigDialog.ui.h:19 msgid "Text file encoding:" msgstr "Codificación de texto" #: ../qt/data/CrashHandler.ui.h:2 #, no-c-format msgid "" "

The application has " "crashed

Apologies for the inconvenience. To help improve the " "application, please consider reporting the issue to manisandro@gmail.com. Please try to describe what you were doing before the application " "crashed. Also, include the information below. Thank you.

" msgstr "" "

Disculpas por las " "molestias. Para ayudar a mejorar la aplicación, por favor considere informar " "sobre el problema en manisandro@gmail.com. Trate de describir " "lo que estaba haciendo antes del fallo de la aplicación. Incluya también la " "información que aparece debajo. Gracias.

" #: ../qt/data/MainWindow.ui.h:1 msgid "gImageReader" msgstr "gImageReader" #. Remove & from some labels which designer insists in adding #: ../qt/data/MainWindow.ui.h:17 ../qt/src/Ui_MainWindow.hh:49 msgid "Sources" msgstr "Orígenes" #: ../qt/data/MainWindow.ui.h:18 msgid "Zoom In" msgstr "Acercar" #: ../qt/data/MainWindow.ui.h:20 msgid "Zoom Out" msgstr "Alejar" #: ../qt/data/MainWindow.ui.h:22 msgid "Normal Size" msgstr "Tamaño normal" #: ../qt/data/MainWindow.ui.h:24 msgid "Best Fit" msgstr "Ajustar" #: ../qt/data/MainWindow.ui.h:26 msgid "Rotate Left" msgstr "Rotar a la Izquierda" #: ../qt/data/MainWindow.ui.h:27 msgid "Rotate left" msgstr "Rotar a la izquierda" #: ../qt/data/MainWindow.ui.h:28 msgid "Rotate Right" msgstr "Rotar a la Derecha" #: ../qt/data/MainWindow.ui.h:29 msgid "Rotate right" msgstr "Rotar a la derecha" #: ../qt/data/MainWindow.ui.h:30 msgid "Image Controls" msgstr "Controles de Imagen" #: ../qt/data/MainWindow.ui.h:32 msgid "Autodetect Layout" msgstr "Autodetectar disposición" #: ../qt/data/MainWindow.ui.h:34 msgid "Toggle Output Pane" msgstr "Mostrar/ocultar Panel de Salida" #: ../qt/src/MainWindow.cc:518 msgid "Could not read %1: %2" msgstr "No se pudo leer %1: %2" #: ../qt/src/MainWindow.cc:543 msgid "The following dictionary files were installed:%1" msgstr "Se han instalado los siguientes diccionarios:%1" #: ../qt/src/Ui_MainWindow.hh:50 msgid "Output" msgstr "Salida" #: ../qt/src/Ui_MainWindow.hh:133 msgid "OCR mode:" msgstr "Modo OCR:" #: ../qt/src/Ui_MainWindow.hh:204 msgid "Remove Image" msgstr "Quitar imagen" #: ../qt/src/Ui_MainWindow.hh:207 msgid "Delete Image" msgstr "Borrar Imagen" #: ../qt/src/Ui_MainWindow.hh:210 msgid "Clear List" msgstr "Borrar Lista" #. Output toolbar #: ../qt/src/Ui_OutputEditorHOCR.hh:39 ../qt/src/Ui_OutputEditorHOCR.hh:40 msgid "Open hOCR file" msgstr "Abrir fichero hOCR" #: ../qt/src/Ui_OutputEditorHOCR.hh:41 ../qt/src/Ui_OutputEditorHOCR.hh:42 msgid "Save as hOCR text" msgstr "Guardar como texto hOCR" #: ../qt/src/Ui_OutputEditorText.hh:108 msgid "Strip Line Breaks" msgstr "Quitar saltos de línea" #: ../qt/src/Ui_OutputEditorText.hh:113 msgid "Find and Replace" msgstr "Buscar y Reemplazar" #: ../qt/src/Ui_OutputEditorText.hh:122 msgid "Save Output" msgstr "Guardar Salida" #: ../qt/src/Ui_OutputEditorText.hh:124 msgid "Clear Output" msgstr "Limpiar Salida" #~ msgid "" #~ "<html><head/><body><p><span style=" font-" #~ "weight:600;">The application has crashed</span></p>" #~ "<p>Apologies for the inconvenience. To help improve the " #~ "application, please consider reporting the issue to <a href="" #~ "mailto:manisandro@gmail.com?subject=gImageReader%20Crash">" #~ "manisandro@gmail.com</a>. Please try to describe what you were " #~ "doing before the application crashed. Also, include the information " #~ "below. Thank you.</p></body></html>" #~ msgstr "" #~ "<html><head/><body><p><span style=" font-" #~ "weight:600;">La aplicación ha fallado</span></p><" #~ "p>Disculpas por las molestias. Para ayudar a mejorar la aplicación, " #~ "por favor, considere informar sobre el fallo a <a href="mailto:" #~ "manisandro@gmail.com?subject=gImageReader%20Crash">" #~ "manisandro@gmail.com</a>. Trate de describir lo que estaba haciendo " #~ "antes de que la aplicación fallara. También incluya la información de " #~ "debajo. Gracias.</p></body></html>" #~ msgid "" #~ "<small><b>Example:</b> 1-10, 13, 14-18</small>" #~ msgstr "" #~ "<small><b>Ejemplo:</b> 1-10, 13, 14-18</small>" #~ msgid "Detect script and orientation" #~ msgstr "Detectar sistema de escritura y dirección" #~ msgid "" #~ "PackageKit is required for managing tesseract language packs, but it was " #~ "not found. Please use the system package management software to manage " #~ "the tesseract language packs." #~ msgstr "" #~ "Se requiere PackageKit para gestionar los paquetes de idioma de " #~ "tesseract, pero no se encontró. Por favor, use el gestor de paquetes de " #~ "su sistema para gestionar los paquetes de idioma de tesseract" #~ msgid "System-wide" #~ msgstr "Rutas del sistema" #~ msgid "4" #~ msgstr "4" #~ msgid "Image format:" #~ msgstr "Tipo de imagen" #~ msgid "Sistema" #~ msgstr "Todo el sistema" #~ msgid "" #~ "\n" #~ "\tFailed to initialize tesseract" #~ msgstr "" #~ "\n" #~ "\tFallo al iniciar tesseract" #~ msgid "So&urces" #~ msgstr "&Orígenes" #~ msgid "&Output" #~ msgstr "&Salida" #~ msgid "To recognize specific areas, drag rectangles over them." #~ msgstr "" #~ "Para reconocer zonas determinadas, dibuje un rectángulo sobre ellas." #~ msgid "Rendering image..." #~ msgstr "Dibujando imagen..." #~ msgid "en_US" #~ msgstr "es_ES" #~ msgid "So&urces" #~ msgstr "Orígenes" #~ msgid "&Output" #~ msgstr "Salida" #~ msgid "Configuration" #~ msgstr "Configuración" #~ msgid "Substitutions list" #~ msgstr "Lista de sustituciones" #~ msgid "Preceeded or succeeded by quote" #~ msgstr "Va precedido o le sigue una comilla" #~ msgid "Select sources" #~ msgstr "Seleccionar origen" #~ msgid "Preceeded by dot" #~ msgstr "Va precedido por un punto" #~ msgid "0" #~ msgstr "0" #~ msgid "200" #~ msgstr "200" #~ msgid "0.0" #~ msgstr "0.0" #~ msgid "1" #~ msgstr "1" #~ msgid "Pasting clipboard..." #~ msgstr "Pegando portapapeles..." #~ msgid "Taking screenshot..." #~ msgstr "Capturando pantalla..." #~ msgid "English (en_US)" #~ msgstr "Español (es_ES)" #~ msgid "Manage list" #~ msgstr "Gestionar lista" #~ msgid "Replacement list" #~ msgstr "Lista de reemplazao" #~ msgid "Select append mode" #~ msgstr "Seleccionar modo al agregar" #~ msgid "Options" #~ msgstr "Ajustes" gImageReader-3.2.3/po/fr.po000066400000000000000000001517161312567024200154350ustar00rootroot00000000000000# French translations for gImageReader package # Traductions françaises du paquet gImageReader. # Copyright (C) 2010-2016 THE GIMAGEREADER'S COPYRIGHT HOLDER # This file is distributed under the same license as the gImageReader package. # # Sandro Mani , 2010-2011, 2013, 2014, 2015, 2016, 2017. msgid "" msgstr "" "Project-Id-Version: \n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2017-07-01 10:34+0200\n" "PO-Revision-Date: 2017-07-01 10:39+0100\n" "Last-Translator: Sandro Mani \n" "Language-Team: French \n" "Language: fr\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n > 1);\n" "X-Generator: Lokalize 2.0\n" #: ../gtk/data/appmenu.ui.h:1 ../qt/src/Ui_MainWindow.hh:165 msgid "Redetect Languages" msgstr "Redétecter langues" #: ../gtk/data/appmenu.ui.h:2 ../gtk/data/gimagereader.ui.h:39 #: ../qt/data/ConfigDialog.ui.h:1 ../qt/src/Ui_MainWindow.hh:168 msgid "Preferences" msgstr "Préférences" #: ../gtk/data/appmenu.ui.h:3 ../gtk/data/gimagereader.ui.h:40 #: ../gtk/src/MainWindow.cc:484 ../qt/src/MainWindow.cc:445 #: ../qt/src/Ui_MainWindow.hh:173 msgid "Help" msgstr "Aide" #: ../gtk/data/appmenu.ui.h:4 ../qt/data/AboutDialog.ui.h:2 #: ../qt/src/Ui_MainWindow.hh:176 msgid "About" msgstr "À propos" #: ../gtk/data/appmenu.ui.h:5 msgid "Quit" msgstr "Quitter" #: ../gtk/data/crashhandler.ui.h:1 ../qt/src/CrashHandler.cc:36 msgid "Regenerate backtrace" msgstr "Régénérer backtrace" #: ../gtk/data/crashhandler.ui.h:2 msgid "The application has crashed" msgstr "L'application a cessé de fonctionner" #: ../gtk/data/crashhandler.ui.h:4 #, no-c-format msgid "" "Apologies for the inconvenience. To help improve the application, please " "consider reporting the issue to manisandro@gmail.com. Please try to " "describe what you were doing before the application crashed. Also, include " "the information below. Thank you." msgstr "" "Désolé pour le désagrément. Pour aider à améliorer l'application, s'il vous " "plait, signalez le problème à manisandro@gmail.com . Essayez de " "décrire ce que vous faisiez avant le problème. Inclure aussi les " "informations ci-dessous. Merci." #: ../gtk/data/editor_hocr.ui.h:1 ../qt/data/PdfExportDialog.ui.h:1 msgid "PDF Export" msgstr "Exportation PDF" #: ../gtk/data/editor_hocr.ui.h:2 ../gtk/data/gimagereader.ui.h:55 #: ../gtk/src/Acquirer.cc:42 ../gtk/src/FileDialogs.cc:150 #: ../gtk/src/Utils.cc:68 ../qt/data/ConfigDialog.ui.h:27 #: ../qt/data/MainWindow.ui.h:14 msgid "Cancel" msgstr "Annuler" #: ../gtk/data/editor_hocr.ui.h:3 ../gtk/data/gimagereader.ui.h:41 #: ../gtk/src/FileDialogs.cc:151 ../gtk/src/Utils.cc:59 #: ../qt/data/ConfigDialog.ui.h:26 msgid "OK" msgstr "OK" #: ../gtk/data/editor_hocr.ui.h:4 ../qt/data/PdfExportDialog.ui.h:2 msgid "Output mode:" msgstr "Modalité:" #: ../gtk/data/editor_hocr.ui.h:5 ../qt/data/PdfExportDialog.ui.h:3 msgid "PDF" msgstr "PDF" #: ../gtk/data/editor_hocr.ui.h:6 ../qt/data/PdfExportDialog.ui.h:4 msgid "PDF with invisible text overlay" msgstr "PDF avec invisible superposition de texte" #: ../gtk/data/editor_hocr.ui.h:7 ../qt/data/PdfExportDialog.ui.h:16 msgid "Format:" msgstr "Format:" #: ../gtk/data/editor_hocr.ui.h:8 ../qt/data/PdfExportDialog.ui.h:17 msgid "Compression:" msgstr "Compression:" #: ../gtk/data/editor_hocr.ui.h:9 ../qt/data/PdfExportDialog.ui.h:14 msgid "Compression quality:" msgstr "Qualité de compression:" #: ../gtk/data/editor_hocr.ui.h:10 ../qt/data/PdfExportDialog.ui.h:15 msgid "DPI:" msgstr "DPI:" #: ../gtk/data/editor_hocr.ui.h:11 ../qt/data/PdfExportDialog.ui.h:18 msgid "Dithering algorithm:" msgstr "Algorithme de tramage:" #: ../gtk/data/editor_hocr.ui.h:12 ../qt/data/PdfExportDialog.ui.h:13 msgid "Image settings:" msgstr "Paramètres d'image" #: ../gtk/data/editor_hocr.ui.h:13 ../qt/data/PdfExportDialog.ui.h:11 msgid "Document font:" msgstr "Police:" #: ../gtk/data/editor_hocr.ui.h:14 ../qt/data/PdfExportDialog.ui.h:7 msgid "Uniformize line and word spacing" msgstr "Homogénéiser interligne" #: ../gtk/data/editor_hocr.ui.h:15 ../qt/data/PdfExportDialog.ui.h:10 msgid "Use detected font sizes" msgstr "Utiliser les tailles de police détectés" #: ../gtk/data/editor_hocr.ui.h:16 ../qt/data/PdfExportDialog.ui.h:8 msgid "Preserve spaces wider than:" msgstr "Préserver les espaces plus larges que:" #: ../gtk/data/editor_hocr.ui.h:17 ../qt/data/PdfExportDialog.ui.h:12 msgid "characters" msgstr "caractères" #: ../gtk/data/editor_hocr.ui.h:18 ../qt/data/PdfExportDialog.ui.h:9 msgid "Scale:" msgstr "Echelle:" #: ../gtk/data/editor_hocr.ui.h:19 ../qt/data/PdfExportDialog.ui.h:6 msgid "Text settings:" msgstr "Paramètres de texte" #: ../gtk/data/editor_hocr.ui.h:20 ../qt/data/PdfExportDialog.ui.h:5 msgid "Show preview" msgstr "Montrer aperçu" #: ../gtk/data/editor_hocr.ui.h:21 ../gtk/data/editor_text.ui.h:26 #: ../qt/src/Ui_OutputEditorText.hh:123 msgid "Save output" msgstr "Enregistrer la reconnaissance" #: ../gtk/data/editor_hocr.ui.h:22 ../qt/src/Ui_OutputEditorHOCR.hh:44 #: ../qt/src/Ui_OutputEditorHOCR.hh:45 msgid "Export to PDF" msgstr "Exporter au format PDF" #: ../gtk/data/editor_hocr.ui.h:23 ../gtk/data/editor_text.ui.h:27 #: ../qt/src/Ui_OutputEditorHOCR.hh:47 ../qt/src/Ui_OutputEditorHOCR.hh:48 #: ../qt/src/Ui_OutputEditorText.hh:125 msgid "Clear output" msgstr "Supprimer la reconnaissance" #: ../gtk/data/editor_hocr.ui.h:24 ../qt/src/Ui_OutputEditorHOCR.hh:75 msgid "Properties" msgstr "Propriétés" #: ../gtk/data/editor_hocr.ui.h:25 ../qt/src/Ui_OutputEditorHOCR.hh:79 msgid "Source" msgstr "Sources" #. Output insert mode #: ../gtk/data/editor_text.ui.h:1 ../qt/src/Ui_OutputEditorText.hh:59 msgid "Append to current text" msgstr "Ajouter au texte existant" #: ../gtk/data/editor_text.ui.h:2 ../qt/src/Ui_OutputEditorText.hh:60 msgid "Insert at cursor" msgstr "Insérer au curseur" #: ../gtk/data/editor_text.ui.h:3 ../qt/src/Ui_OutputEditorText.hh:61 msgid "Replace current text" msgstr "Remplacer le texte existant" #: ../gtk/data/editor_text.ui.h:4 ../qt/src/SubstitutionsManager.cc:37 #: ../qt/src/Ui_OutputEditorText.hh:177 msgid "Substitutions" msgstr "Substitutions" #: ../gtk/data/editor_text.ui.h:5 ../qt/src/SubstitutionsManager.cc:42 #: ../qt/src/SubstitutionsManager.cc:43 msgid "Open" msgstr "Ouvrir" #: ../gtk/data/editor_text.ui.h:6 ../gtk/src/Utils.cc:71 #: ../qt/src/SubstitutionsManager.cc:45 ../qt/src/SubstitutionsManager.cc:46 msgid "Save" msgstr "Enregistrer" #: ../gtk/data/editor_text.ui.h:7 ../qt/src/SubstitutionsManager.cc:48 #: ../qt/src/SubstitutionsManager.cc:49 msgid "Clear" msgstr "Vider" #: ../gtk/data/editor_text.ui.h:8 ../qt/data/ConfigDialog.ui.h:16 #: ../qt/src/SubstitutionsManager.cc:51 ../qt/src/SubstitutionsManager.cc:52 msgid "Add" msgstr "Ajouter" #: ../gtk/data/editor_text.ui.h:9 ../gtk/src/OutputEditorHOCR.cc:1202 #: ../gtk/src/OutputEditorHOCR.cc:1213 ../qt/data/ConfigDialog.ui.h:17 #: ../qt/src/OutputEditorHOCR.cc:998 ../qt/src/OutputEditorHOCR.cc:1000 #: ../qt/src/SubstitutionsManager.cc:54 ../qt/src/SubstitutionsManager.cc:55 msgid "Remove" msgstr "Supprimer" #: ../gtk/data/editor_text.ui.h:10 ../gtk/data/gimagereader.ui.h:73 msgid "Apply" msgstr "Appliquer" #: ../gtk/data/editor_text.ui.h:11 ../gtk/data/gimagereader.ui.h:74 msgid "Close" msgstr "Fermer" #. Output postprocessing #: ../gtk/data/editor_text.ui.h:12 ../qt/src/Ui_OutputEditorText.hh:69 msgid "Keep line break if..." msgstr "Conserver les sauts de ligne si..." #: ../gtk/data/editor_text.ui.h:13 ../qt/src/Ui_OutputEditorText.hh:71 msgid "Preceded by end mark (.?!)" msgstr "...ils sont précédés par une marque de fin (.?!)" #: ../gtk/data/editor_text.ui.h:14 ../qt/src/Ui_OutputEditorText.hh:73 msgid "Preceded or succeeded by quote" msgstr "...ils sont précédés ou suivis par un guillemet" #: ../gtk/data/editor_text.ui.h:15 ../qt/src/Ui_OutputEditorText.hh:75 msgid "Other options" msgstr "Autres options" #: ../gtk/data/editor_text.ui.h:16 ../qt/src/Ui_OutputEditorText.hh:77 msgid "Join hyphenated words" msgstr "Lier les mots composés" #: ../gtk/data/editor_text.ui.h:17 ../qt/src/Ui_OutputEditorText.hh:79 msgid "Collapse whitespace" msgstr "Réduire les espaces" #: ../gtk/data/editor_text.ui.h:18 ../qt/src/Ui_OutputEditorText.hh:81 msgid "Preserve paragraphs" msgstr "Préserver paragraphes" #: ../gtk/data/editor_text.ui.h:19 ../qt/src/Ui_OutputEditorText.hh:83 msgid "Visual aids" msgstr "Aides visuelles" #: ../gtk/data/editor_text.ui.h:20 ../qt/src/Ui_OutputEditorText.hh:85 msgid "Draw whitespace" msgstr "Dessiner les espaces" #: ../gtk/data/editor_text.ui.h:21 ../gtk/data/gimagereader.ui.h:31 #: ../qt/src/Ui_OutputEditorText.hh:102 msgid "Select insert mode" msgstr "Sélectionner mode d'insertion" #: ../gtk/data/editor_text.ui.h:22 ../qt/src/Ui_OutputEditorText.hh:109 msgid "Strip line breaks on selected text" msgstr "Supprimer sauts de ligne dans le texte sélectionné" #: ../gtk/data/editor_text.ui.h:23 ../qt/src/Ui_OutputEditorText.hh:114 msgid "Find and replace" msgstr "Trouver et remplacer" #: ../gtk/data/editor_text.ui.h:24 ../qt/src/Ui_OutputEditorText.hh:116 #: ../qt/src/Ui_OutputEditorText.hh:117 msgid "Undo" msgstr "Annuler" #: ../gtk/data/editor_text.ui.h:25 ../qt/src/Ui_OutputEditorText.hh:119 #: ../qt/src/Ui_OutputEditorText.hh:120 msgid "Redo" msgstr "Refaire" #: ../gtk/data/editor_text.ui.h:28 ../qt/src/Ui_OutputEditorText.hh:149 msgid "Find" msgstr "Trouver" #: ../gtk/data/editor_text.ui.h:29 ../qt/src/Ui_OutputEditorText.hh:153 #: ../qt/src/Ui_OutputEditorText.hh:168 msgid "Replace" msgstr "Remplacer" #: ../gtk/data/editor_text.ui.h:30 ../qt/src/Ui_OutputEditorText.hh:173 msgid "Replace all" msgstr "Remplacer tous" #: ../gtk/data/editor_text.ui.h:31 ../qt/src/Ui_OutputEditorText.hh:163 msgid "Find previous" msgstr "Trouver précédente" #: ../gtk/data/editor_text.ui.h:32 ../qt/src/Ui_OutputEditorText.hh:158 msgid "Find next" msgstr "Trouver suivante" #: ../gtk/data/editor_text.ui.h:33 ../qt/src/Ui_OutputEditorText.hh:182 msgid "Match case" msgstr "Sensible aux majuscules et minuscules" #: ../gtk/data/gimagereader.ui.h:1 ../qt/src/Ui_MainWindow.hh:65 msgid "Rotate current page" msgstr "Pivoter page courante" #: ../gtk/data/gimagereader.ui.h:2 ../qt/src/Ui_MainWindow.hh:66 msgid "Rotate all pages" msgstr "Pivoter toutes les pages" #: ../gtk/data/gimagereader.ui.h:3 ../qt/data/MainWindow.ui.h:35 msgid "Toggle output pane" msgstr "Montrer / cacher le panneau de reconnaissance" #. Sources toolbar #: ../gtk/data/gimagereader.ui.h:4 ../qt/src/Ui_MainWindow.hh:187 msgid "Recent" msgstr "Fichiers Récents" #: ../gtk/data/gimagereader.ui.h:5 ../qt/src/Ui_MainWindow.hh:188 msgid "Paste" msgstr "Coller" #: ../gtk/data/gimagereader.ui.h:6 ../qt/src/Ui_MainWindow.hh:189 msgid "Take Screenshot" msgstr "Capture d'écran" #: ../gtk/data/gimagereader.ui.h:7 ../qt/src/Ui_MainWindow.hh:200 msgid "Add images" msgstr "Ajouter des images" #: ../gtk/data/gimagereader.ui.h:8 ../qt/src/Ui_MainWindow.hh:199 msgid "Add Images" msgstr "Ajouter des images" #: ../gtk/data/gimagereader.ui.h:9 ../qt/src/Ui_MainWindow.hh:205 msgid "Remove image from list" msgstr "Supprimer l'image de la liste" #: ../gtk/data/gimagereader.ui.h:10 ../qt/src/Ui_MainWindow.hh:208 msgid "Delete image" msgstr "Supprimer image" #: ../gtk/data/gimagereader.ui.h:11 ../qt/src/Ui_MainWindow.hh:211 msgid "Clear list" msgstr "Vider liste" #: ../gtk/data/gimagereader.ui.h:12 ../qt/data/MainWindow.ui.h:6 msgid "Files" msgstr "Fichiers" #: ../gtk/data/gimagereader.ui.h:13 ../qt/data/MainWindow.ui.h:16 msgid "Device:" msgstr "Dispositif:" #: ../gtk/data/gimagereader.ui.h:14 ../qt/data/MainWindow.ui.h:15 #: ../qt/src/TessdataManager.cc:57 msgid "Refresh" msgstr "Actualiser" #: ../gtk/data/gimagereader.ui.h:15 ../qt/data/MainWindow.ui.h:12 msgid "Output:" msgstr "Reconnaissance:" #: ../gtk/data/gimagereader.ui.h:16 ../qt/data/MainWindow.ui.h:9 msgid "Mode:" msgstr "Modalité:" #: ../gtk/data/gimagereader.ui.h:17 ../gtk/src/OutputEditorHOCR.cc:362 #: ../qt/data/MainWindow.ui.h:11 ../qt/src/OutputEditorHOCR.cc:273 msgid "Color" msgstr "Couleur" #: ../gtk/data/gimagereader.ui.h:18 ../gtk/src/OutputEditorHOCR.cc:365 #: ../qt/data/MainWindow.ui.h:10 ../qt/src/OutputEditorHOCR.cc:275 #: ../qt/src/OutputEditorHOCR.cc:277 msgid "Grayscale" msgstr "Niveaux de gris" #: ../gtk/data/gimagereader.ui.h:19 ../qt/data/MainWindow.ui.h:8 msgid "Resolution:" msgstr "Résolution:" #: ../gtk/data/gimagereader.ui.h:20 ../qt/data/MainWindow.ui.h:13 msgid "Scan" msgstr "Scanner" #: ../gtk/data/gimagereader.ui.h:21 ../qt/data/MainWindow.ui.h:7 msgid "Acquire" msgstr "Acquérir" #: ../gtk/data/gimagereader.ui.h:22 ../qt/data/MainWindow.ui.h:2 msgid "Brightness" msgstr "Luminosité" #: ../gtk/data/gimagereader.ui.h:23 ../qt/data/MainWindow.ui.h:3 msgid "Contrast" msgstr "Contraste" #: ../gtk/data/gimagereader.ui.h:24 ../qt/data/MainWindow.ui.h:4 msgid "Resolution" msgstr "Résolution" #: ../gtk/data/gimagereader.ui.h:25 ../qt/data/MainWindow.ui.h:5 msgid "Invert colors" msgstr "Invertir couleurs" #: ../gtk/data/gimagereader.ui.h:26 ../qt/data/MainWindow.ui.h:19 msgid "Zoom in" msgstr "Zoom avant" #: ../gtk/data/gimagereader.ui.h:27 ../qt/data/MainWindow.ui.h:21 msgid "Zoom out" msgstr "Zoom arrière" #: ../gtk/data/gimagereader.ui.h:28 ../qt/data/MainWindow.ui.h:23 msgid "Normal size" msgstr "Taille normale" #: ../gtk/data/gimagereader.ui.h:29 ../qt/data/MainWindow.ui.h:25 msgid "Best fit" msgstr "Ajuster à la page" #: ../gtk/data/gimagereader.ui.h:30 ../qt/src/Ui_MainWindow.hh:74 msgid "Select rotation mode" msgstr "Mode de rotation" #: ../gtk/data/gimagereader.ui.h:32 ../qt/data/MainWindow.ui.h:31 msgid "Image controls" msgstr "Régler les paramètres de l'image" #: ../gtk/data/gimagereader.ui.h:33 ../qt/src/Ui_MainWindow.hh:137 msgid "Plain text" msgstr "Texte" #: ../gtk/data/gimagereader.ui.h:34 ../qt/src/Ui_MainWindow.hh:137 msgid "hOCR, PDF" msgstr "hOCR, PDF" #: ../gtk/data/gimagereader.ui.h:35 ../qt/data/MainWindow.ui.h:33 msgid "Autodetect layout" msgstr "Détecter la mise en page" #: ../gtk/data/gimagereader.ui.h:36 msgid "Recognize all" msgstr "Tout reconnaître" #: ../gtk/data/gimagereader.ui.h:37 msgid "Select language" msgstr "Sélectionner langue" #: ../gtk/data/gimagereader.ui.h:38 msgid "A graphical frontend to tesseract-ocr" msgstr "Une interface graphique pour tesseract-ocr" #: ../gtk/data/gimagereader.ui.h:42 msgid "Output pane orientation:" msgstr "Orientation de la zone de reconnaissance:" #: ../gtk/data/gimagereader.ui.h:43 msgid "Horizontal" msgstr "Horizontal" #: ../gtk/data/gimagereader.ui.h:44 msgid "Vertical" msgstr "Vertical" #: ../gtk/data/gimagereader.ui.h:45 ../qt/data/ConfigDialog.ui.h:18 msgid "Query to install missing spellcheck dictionaries" msgstr "Proposer d'installer les dictionnaires manquants" #: ../gtk/data/gimagereader.ui.h:46 ../qt/data/ConfigDialog.ui.h:4 msgid "Automatically check for new program versions" msgstr "Vérifier si une nouvelle version est disponible" #: ../gtk/data/gimagereader.ui.h:47 ../qt/data/ConfigDialog.ui.h:3 msgid "Predefined language definitions:" msgstr "Définitions par défaut des langues:" #: ../gtk/data/gimagereader.ui.h:48 ../qt/data/ConfigDialog.ui.h:12 msgid "Additional language definitions:" msgstr "Définitions de langues supplémentaires" #: ../gtk/data/gimagereader.ui.h:49 ../qt/data/ConfigDialog.ui.h:20 msgid "The prefix of the tesseract language data file" msgstr "Le préfixe du fichier de langue tesseract" #: ../gtk/data/gimagereader.ui.h:50 ../qt/data/ConfigDialog.ui.h:21 msgid "Prefix" msgstr "Préfixe" #: ../gtk/data/gimagereader.ui.h:51 ../qt/data/ConfigDialog.ui.h:22 msgid "The ISO 639-1 language code followed by the country code" msgstr "Le code de langue ISO 639-1 suivi par le code du pays" #: ../gtk/data/gimagereader.ui.h:52 ../qt/data/ConfigDialog.ui.h:23 msgid "ISO Code" msgstr "Code ISO" #: ../gtk/data/gimagereader.ui.h:53 ../qt/data/ConfigDialog.ui.h:24 msgid "The name of the language" msgstr "Le nom de la langue" #: ../gtk/data/gimagereader.ui.h:54 ../qt/data/ConfigDialog.ui.h:25 msgid "Name" msgstr "Nom" #: ../gtk/data/gimagereader.ui.h:56 ../qt/data/ConfigDialog.ui.h:5 msgid "Output pane font:" msgstr "Police utilisée dans le panneau de reconnaissance:" #: ../gtk/data/gimagereader.ui.h:57 ../qt/data/ConfigDialog.ui.h:2 msgid "Default" msgstr "Prédéfini" #: ../gtk/data/gimagereader.ui.h:58 ../qt/data/ConfigDialog.ui.h:6 msgid "Language data locations:" msgstr "Positions de données de langue:" #: ../gtk/data/gimagereader.ui.h:59 ../qt/data/ConfigDialog.ui.h:13 msgid "Language definitions path:" msgstr "Chemin du définitions des langues:" #: ../gtk/data/gimagereader.ui.h:60 ../qt/data/ConfigDialog.ui.h:28 msgid "Spelling dictionaries path:" msgstr "Chemin du dictionnaires:" #: ../gtk/data/gimagereader.ui.h:61 ../qt/data/ConfigDialog.ui.h:10 msgid "System-wide paths" msgstr "Système" #: ../gtk/data/gimagereader.ui.h:62 ../qt/data/ConfigDialog.ui.h:11 msgid "User paths" msgstr "Utilisateur" #: ../gtk/data/gimagereader.ui.h:63 ../qt/data/PageRangeDialog.ui.h:1 msgid "Page Range" msgstr "Pages" #: ../gtk/data/gimagereader.ui.h:64 ../qt/data/PageRangeDialog.ui.h:2 msgid "Page range:" msgstr "Pages:" #: ../gtk/data/gimagereader.ui.h:65 ../qt/data/PageRangeDialog.ui.h:3 msgid "Example: 1-10, 13, 14-18" msgstr "Par exemple: 1-10, 13, 14-18" #: ../gtk/data/gimagereader.ui.h:66 ../qt/data/PageRangeDialog.ui.h:4 msgid "Recognition area:" msgstr "Zone de reconnaissance:" #: ../gtk/data/gimagereader.ui.h:67 ../gtk/src/Recognizer.cc:403 #: ../qt/data/PageRangeDialog.ui.h:5 ../qt/src/Recognizer.cc:381 msgid "Entire page" msgstr "Page complète" #: ../gtk/data/gimagereader.ui.h:68 ../qt/data/PageRangeDialog.ui.h:6 msgid "Autodetect" msgstr "Détecter automatiquement" #: ../gtk/data/gimagereader.ui.h:69 ../qt/data/PageRangeDialog.ui.h:7 msgid "Prepend to output text:" msgstr "Ajouter reconnaissance:" #: ../gtk/data/gimagereader.ui.h:70 ../qt/data/PageRangeDialog.ui.h:8 msgid "Source filename" msgstr "Nom de fichier d'origine" #: ../gtk/data/gimagereader.ui.h:71 ../qt/data/PageRangeDialog.ui.h:9 msgid "Source page" msgstr "Page d'origine" #: ../gtk/data/gimagereader.ui.h:72 ../qt/src/TessdataManager.cc:47 msgid "Tessdata Manager" msgstr "Gestionnaire tessdata" #: ../gtk/data/gimagereader.ui.h:75 ../qt/src/TessdataManager.cc:49 msgid "Manage installed languages:" msgstr "Gérer les langues installées:" #: ../gtk/data/gimagereader.ui.h:76 ../qt/src/DisplayerToolSelect.cc:240 msgid "Delete" msgstr "Supprimer" #: ../gtk/data/gimagereader.ui.h:77 ../qt/src/DisplayerToolSelect.cc:226 msgid "Order:" msgstr "Ordre:" #: ../gtk/data/gimagereader.ui.h:78 ../gtk/src/DisplayerToolHOCR.cc:28 #: ../qt/src/DisplayerToolHOCR.cc:30 ../qt/src/DisplayerToolSelect.cc:241 msgid "Recognize" msgstr "Reconnaître" #: ../gtk/data/gimagereader.ui.h:79 ../qt/src/DisplayerToolSelect.cc:242 msgid "Recognize to clipboard" msgstr "Reconnaître et coller dans le passe-papiers" #: ../gtk/data/gimagereader.ui.h:80 ../qt/src/DisplayerToolSelect.cc:243 msgid "Save as image" msgstr "Enregistrer image" #: ../gtk/data/gimagereader.ui.h:81 ../qt/src/Recognizer.cc:76 msgid "Current Page" msgstr "Page courante" #: ../gtk/data/gimagereader.ui.h:82 ../qt/src/Recognizer.cc:79 msgid "Multiple Pages..." msgstr "Plusieurs pages..." #: ../gtk/src/Acquirer.cc:83 ../qt/src/Acquirer.cc:63 msgid "scan.png" msgstr "scan.png" #: ../gtk/src/Acquirer.cc:96 ../qt/src/Acquirer.cc:80 msgid "Images" msgstr "Images" #: ../gtk/src/Acquirer.cc:97 ../qt/src/Acquirer.cc:81 msgid "Choose Output Filename..." msgstr "Choisir un nom pour le fichier de reconnaissance..." #: ../gtk/src/Acquirer.cc:112 ../qt/src/Acquirer.cc:96 msgid "Failed to initialize the scanning backend." msgstr "Impossible d'initialiser le scanner." #: ../gtk/src/Acquirer.cc:121 ../qt/src/Acquirer.cc:102 msgid "Scan failed" msgstr "Erreur de scanner" #: ../gtk/src/Acquirer.cc:139 ../qt/src/Acquirer.cc:118 msgid "No scanners were detected." msgstr "Aucun scanner n'a été détecté." #: ../gtk/src/Acquirer.cc:156 ../gtk/src/Acquirer.cc:173 #: ../qt/src/Acquirer.cc:132 ../qt/src/Acquirer.cc:149 msgid "Starting scan..." msgstr "Démarrer le scan..." #: ../gtk/src/Acquirer.cc:169 ../qt/src/Acquirer.cc:145 msgid "Opening device..." msgstr "Ouverture du dispositif..." #: ../gtk/src/Acquirer.cc:171 ../qt/src/Acquirer.cc:147 msgid "Setting options..." msgstr "Régler les options..." #: ../gtk/src/Acquirer.cc:175 ../qt/src/Acquirer.cc:151 msgid "Getting parameters..." msgstr "Obtenir des paramètres" #: ../gtk/src/Acquirer.cc:177 ../qt/src/Acquirer.cc:153 msgid "Transferring data..." msgstr "Transfert de données..." #: ../gtk/src/Acquirer.cc:184 ../qt/src/Acquirer.cc:160 msgid "Canceling scan..." msgstr "Annulation de scan..." #: ../gtk/src/Config.cc:297 ../qt/data/ConfigDialog.ui.h:7 msgid "Filename prefix" msgstr "Préfixe nom fichier" #: ../gtk/src/Config.cc:298 ../qt/data/ConfigDialog.ui.h:8 msgid "Code" msgstr "Code" #: ../gtk/src/Config.cc:299 ../qt/data/ConfigDialog.ui.h:9 msgid "Native name" msgstr "Nom natif" #: ../gtk/src/CrashHandler.cc:26 ../gtk/src/CrashHandler.cc:43 #: ../qt/src/CrashHandler.cc:34 msgid "Crash Handler" msgstr "Gestionnaire de crash" #: ../gtk/src/CrashHandler.cc:45 ../qt/src/CrashHandler.cc:29 msgid "Your work has been saved under %1." msgstr "Votre travail a été enregistré sous %1." #: ../gtk/src/CrashHandler.cc:47 ../qt/src/CrashHandler.cc:31 msgid "There was no unsaved work." msgstr "Il n'y avait pas de travail non enregistré." #: ../gtk/src/CrashHandler.cc:106 ../qt/src/CrashHandler.cc:60 msgid "Failed to obtain backtrace. Is gdb installed?" msgstr "Impossible d'obtenir le backtrace. Est-ce que gdb est installé ?" #: ../gtk/src/Displayer.cc:261 ../qt/src/Displayer.cc:231 msgid "Failed to load image" msgstr "Échec à l'ouverture de l'image" #: ../gtk/src/Displayer.cc:261 ../qt/src/Displayer.cc:231 msgid "" "The file might not be an image or be corrupt:\n" "%1" msgstr "" "Le fichier pourrait ne pas être une image ou être corrompu:\n" "%1" #: ../gtk/src/DisplayerToolSelect.cc:39 ../qt/src/DisplayerToolSelect.cc:40 msgid "selection.png" msgstr "selection.png" #: ../gtk/src/DisplayerToolSelect.cc:148 ../qt/src/DisplayerToolSelect.cc:139 msgid "PNG Images" msgstr "Images PNG" #: ../gtk/src/DisplayerToolSelect.cc:149 ../qt/src/DisplayerToolSelect.cc:139 msgid "Save Selection Image" msgstr "Enregistrer sélection" #: ../gtk/src/DisplayerToolSelect.cc:157 ../qt/src/DisplayerToolSelect.cc:147 msgid "Recognize all" msgstr "Reconnaître tout" #: ../gtk/src/DisplayerToolSelect.cc:157 ../qt/src/DisplayerToolSelect.cc:147 msgid "Recognize selection" msgstr "Reconnaître la sélection" #: ../gtk/src/DisplayerToolSelect.cc:194 ../qt/src/DisplayerToolSelect.cc:184 msgid "Performing layout analysis" msgstr "Exécution l'analyse de mise en page" #: ../gtk/src/FileDialogs.cc:237 msgid "" "A file named \"%1\" already exists. Are you sure you want to overwrite it?" msgstr "" "Un fichier nommé \"% 1\" existe déjà. Êtes-vous sûr de vouloir le remplacer ?" #: ../gtk/src/FileDialogs.cc:239 msgid "Overwrite File?" msgstr "Remplacer fichier ?" #: ../gtk/src/MainWindow.cc:125 ../qt/src/MainWindow.cc:274 msgid "Using tesseract" msgstr "Compilé avec tesseract" #: ../gtk/src/MainWindow.cc:191 ../qt/src/MainWindow.cc:181 msgid "Select an image to begin..." msgstr "Ouvrir une image pour commencer..." #: ../gtk/src/MainWindow.cc:306 ../qt/src/MainWindow.cc:262 msgid "Multiple sources" msgstr "Plusieurs sources" #: ../gtk/src/MainWindow.cc:307 ../qt/src/MainWindow.cc:263 msgid "Ready" msgstr "Prêt" #: ../gtk/src/MainWindow.cc:446 ../qt/src/MainWindow.cc:390 msgid "New version" msgstr "Nouvelle version" #: ../gtk/src/MainWindow.cc:446 ../qt/src/MainWindow.cc:390 msgid "gImageReader %1 is available" msgstr "gImageReader %1 est disponible" #: ../gtk/src/MainWindow.cc:447 ../qt/src/MainWindow.cc:391 msgid "Download" msgstr "Télécharger" #: ../gtk/src/MainWindow.cc:448 ../qt/src/MainWindow.cc:392 msgid "Changelog" msgstr "Nouvelles" #: ../gtk/src/MainWindow.cc:449 ../qt/src/MainWindow.cc:393 msgid "Don't notify again" msgstr "Ne plus demander" #: ../gtk/src/MainWindow.cc:468 ../qt/src/MainWindow.cc:438 msgid "Don't show again" msgstr "Ne plus demander" #: ../gtk/src/MainWindow.cc:469 ../gtk/src/MainWindow.cc:482 #: ../qt/src/MainWindow.cc:439 msgid "Install" msgstr "Installer" #: ../gtk/src/MainWindow.cc:489 ../qt/src/MainWindow.cc:451 msgid "Spelling dictionary missing" msgstr "Dictionnaire manquant" #: ../gtk/src/MainWindow.cc:489 ../qt/src/MainWindow.cc:451 msgid "The spellcheck dictionary for %1 is not installed" msgstr "" "Le dictionnaire de vérification orthographique pour '%1' n'est pas installé" #: ../gtk/src/MainWindow.cc:496 ../gtk/src/MainWindow.cc:528 #: ../qt/src/MainWindow.cc:458 msgid "Installing spelling dictionary for '%1'" msgstr "Installation de dictionnaire de vérification orthographique pour '%1'" #: ../gtk/src/MainWindow.cc:517 ../gtk/src/MainWindow.cc:542 #: ../gtk/src/MainWindow.cc:550 ../gtk/src/MainWindow.cc:560 #: ../gtk/src/MainWindow.cc:566 ../gtk/src/MainWindow.cc:595 #: ../gtk/src/OutputEditorHOCR.cc:1375 ../gtk/src/Recognizer.cc:163 #: ../gtk/src/TessdataManager.cc:58 ../gtk/src/TessdataManager.cc:68 #: ../gtk/src/TessdataManager.cc:290 ../qt/src/MainWindow.cc:477 #: ../qt/src/MainWindow.cc:490 ../qt/src/MainWindow.cc:500 #: ../qt/src/MainWindow.cc:510 ../qt/src/MainWindow.cc:518 #: ../qt/src/MainWindow.cc:546 ../qt/src/OutputEditorHOCR.cc:1157 #: ../qt/src/Recognizer.cc:138 ../qt/src/TessdataManager.cc:72 #: ../qt/src/TessdataManager.cc:82 ../qt/src/TessdataManager.cc:275 msgid "Error" msgstr "Erreur" #: ../gtk/src/MainWindow.cc:517 ../qt/src/MainWindow.cc:477 msgid "Failed to install spelling dictionary: %1" msgstr "" "Impossible d'installer le dictionnaire de vérification orthographique: %1" #: ../gtk/src/MainWindow.cc:542 ../qt/src/MainWindow.cc:490 msgid "Failed to create directory for spelling dictionaries." msgstr "" "Impossible de créer le répertoire pour les dictionnaires d'orthographe." #: ../gtk/src/MainWindow.cc:550 ../gtk/src/MainWindow.cc:566 #: ../qt/src/MainWindow.cc:500 msgid "Could not read %1: %2." msgstr "Impossible lire %1: %2." #: ../gtk/src/MainWindow.cc:560 ../gtk/src/MainWindow.cc:595 #: ../qt/src/MainWindow.cc:510 ../qt/src/MainWindow.cc:546 msgid "No spelling dictionaries found for '%1'." msgstr "Pas de dictionnaires orthographiques trouvés pour '%1'." #: ../gtk/src/MainWindow.cc:576 ../qt/src/MainWindow.cc:529 msgid "Downloading '%1'..." msgstr "Téléchargement de '%1'..." #: ../gtk/src/MainWindow.cc:592 ../qt/src/MainWindow.cc:543 msgid "Dictionaries installed" msgstr "Dictionnaires orthographiques installés" #: ../gtk/src/MainWindow.cc:592 msgid "The following dictionaries were installed:%1" msgstr "Les dictionnaires suivants ont été installés:%1" #: ../gtk/src/OutputEditorHOCR.cc:319 ../qt/src/OutputEditorHOCR.cc:291 msgid "Document" msgstr "Document" #: ../gtk/src/OutputEditorHOCR.cc:368 ../qt/src/OutputEditorHOCR.cc:279 msgid "Monochrome" msgstr "Monochrome" #: ../gtk/src/OutputEditorHOCR.cc:377 ../qt/src/OutputEditorHOCR.cc:281 msgid "Threshold (closest color)" msgstr "Seuil (couleur la plus proche)" #: ../gtk/src/OutputEditorHOCR.cc:380 ../qt/src/OutputEditorHOCR.cc:282 msgid "Diffuse" msgstr "Diffus" #: ../gtk/src/OutputEditorHOCR.cc:389 ../qt/src/OutputEditorHOCR.cc:283 msgid "Zip (lossless)" msgstr "Zip (lossless)" #: ../gtk/src/OutputEditorHOCR.cc:393 ../qt/src/OutputEditorHOCR.cc:284 msgid "CCITT Group 4 (lossless)" msgstr "CCITT Group 4 (lossless)" #: ../gtk/src/OutputEditorHOCR.cc:397 ../qt/src/OutputEditorHOCR.cc:285 msgid "Jpeg (lossy)" msgstr "Jpeg (lossy)" #: ../gtk/src/OutputEditorHOCR.cc:553 ../qt/src/OutputEditorHOCR.cc:429 msgid "" "The following pages could not be processed:\n" "%1" msgstr "" "Les pages suivants n'ont pas pu être processées:\n" "%1" #: ../gtk/src/OutputEditorHOCR.cc:554 ../qt/src/OutputEditorHOCR.cc:430 msgid "Recognition errors" msgstr "Erreurs de reconnaissance" #. Add tree item #: ../gtk/src/OutputEditorHOCR.cc:647 ../gtk/src/OutputEditorHOCR.cc:1037 #: ../qt/src/OutputEditorHOCR.cc:504 ../qt/src/OutputEditorHOCR.cc:894 msgid "Graphic" msgstr "Graphique" #: ../gtk/src/OutputEditorHOCR.cc:703 ../qt/src/OutputEditorHOCR.cc:563 msgid "Paragraph" msgstr "Paragraphe" #: ../gtk/src/OutputEditorHOCR.cc:706 ../qt/src/OutputEditorHOCR.cc:566 msgid "Textline" msgstr "Ligne de texte" #: ../gtk/src/OutputEditorHOCR.cc:1136 ../qt/src/OutputEditorHOCR.cc:950 msgid "Merge" msgstr "Fusionner" #: ../gtk/src/OutputEditorHOCR.cc:1161 ../qt/src/OutputEditorHOCR.cc:977 msgid "Add graphic region" msgstr "Ajouter région graphique" #: ../gtk/src/OutputEditorHOCR.cc:1177 ../qt/src/OutputEditorHOCR.cc:985 msgid "No suggestions" msgstr "Pas de suggestions" #: ../gtk/src/OutputEditorHOCR.cc:1183 ../qt/src/OutputEditorHOCR.cc:989 msgid "Add to dictionary" msgstr "Ajouter au dictionnaire" #: ../gtk/src/OutputEditorHOCR.cc:1189 ../qt/src/OutputEditorHOCR.cc:990 msgid "Ignore word" msgstr "Ignorer mot" #: ../gtk/src/OutputEditorHOCR.cc:1222 ../qt/src/OutputEditorHOCR.cc:1007 msgid "Expand all" msgstr "Déplier" #: ../gtk/src/OutputEditorHOCR.cc:1225 ../qt/src/OutputEditorHOCR.cc:1008 msgid "Collapse all" msgstr "Replier" #: ../gtk/src/OutputEditorHOCR.cc:1248 ../gtk/src/OutputEditorHOCR.cc:1287 #: ../qt/src/OutputEditorHOCR.cc:1049 ../qt/src/OutputEditorHOCR.cc:1079 msgid "hOCR HTML Files" msgstr "Fichiers HTML hOCR" #: ../gtk/src/OutputEditorHOCR.cc:1249 ../qt/src/OutputEditorHOCR.cc:1049 msgid "Open hOCR File" msgstr "Ouvrir fichier hOCR" #: ../gtk/src/OutputEditorHOCR.cc:1258 ../qt/src/OutputEditorHOCR.cc:1055 msgid "Failed to open file" msgstr "Impossible ouvrir le fichier" #: ../gtk/src/OutputEditorHOCR.cc:1258 ../qt/src/OutputEditorHOCR.cc:1055 msgid "The file could not be opened: %1." msgstr "Le fichier n'a pas pu être ouvert: %1." #: ../gtk/src/OutputEditorHOCR.cc:1267 ../qt/src/OutputEditorHOCR.cc:1062 msgid "Invalid hOCR file" msgstr "Fichier hOCR invalide" #: ../gtk/src/OutputEditorHOCR.cc:1267 ../qt/src/OutputEditorHOCR.cc:1062 msgid "The file does not appear to contain valid hOCR HTML: %1" msgstr "Le fichier ne semble pas contenir de code HTML hOCR valide: %1" #: ../gtk/src/OutputEditorHOCR.cc:1283 ../gtk/src/OutputEditorHOCR.cc:1343 #: ../gtk/src/OutputEditorText.cc:306 ../qt/src/OutputEditorHOCR.cc:1077 #: ../qt/src/OutputEditorHOCR.cc:1131 ../qt/src/OutputEditorText.cc:246 msgid "output" msgstr "Reconnaissance" #: ../gtk/src/OutputEditorHOCR.cc:1288 ../qt/src/OutputEditorHOCR.cc:1079 msgid "Save hOCR Output..." msgstr "Enregistrer output hOCR..." #: ../gtk/src/OutputEditorHOCR.cc:1296 ../gtk/src/OutputEditorHOCR.cc:1357 #: ../gtk/src/OutputEditorText.cc:319 ../qt/src/OutputEditorHOCR.cc:1087 #: ../qt/src/OutputEditorHOCR.cc:1143 ../qt/src/OutputEditorText.cc:256 msgid "Failed to save output" msgstr "Échec de l'enregistrement de la reconnaissance" #: ../gtk/src/OutputEditorHOCR.cc:1296 ../gtk/src/OutputEditorHOCR.cc:1357 #: ../gtk/src/OutputEditorText.cc:319 ../qt/src/OutputEditorHOCR.cc:1087 #: ../qt/src/OutputEditorHOCR.cc:1143 ../qt/src/OutputEditorText.cc:256 msgid "Check that you have writing permissions in the selected folder." msgstr "" "Vérifiez que vous avez l'autorisation d'écriture dans le dossier sélectionné." #: ../gtk/src/OutputEditorHOCR.cc:1346 ../qt/src/OutputEditorHOCR.cc:1133 msgid "PDF Files" msgstr "Fichiers PDF" #: ../gtk/src/OutputEditorHOCR.cc:1347 ../qt/src/OutputEditorHOCR.cc:1133 msgid "Save PDF Output..." msgstr "Enregistrer output PDF..." #: ../gtk/src/OutputEditorHOCR.cc:1375 ../qt/src/OutputEditorHOCR.cc:1157 msgid "The PDF library does not support the selected font." msgstr "La bibliothèque PDF ne supporte pas la police sélectionnée." #: ../gtk/src/OutputEditorHOCR.cc:1435 ../qt/src/OutputEditorHOCR.cc:1216 msgid "Errors occurred" msgstr "Des erreurs sont apparues" #: ../gtk/src/OutputEditorHOCR.cc:1435 ../qt/src/OutputEditorHOCR.cc:1216 msgid "" "The following pages could not be rendered:\n" "%1" msgstr "" "Les pages suivantes n'ont pas pu être lues:\n" "%1" #: ../gtk/src/OutputEditorHOCR.cc:1562 ../gtk/src/OutputEditorText.cc:333 #: ../qt/src/OutputEditorHOCR.cc:1331 ../qt/src/OutputEditorText.cc:269 msgid "Output not saved" msgstr "Reconnaissance non enregistrée" #: ../gtk/src/OutputEditorHOCR.cc:1562 ../gtk/src/OutputEditorText.cc:333 #: ../qt/src/OutputEditorHOCR.cc:1331 ../qt/src/OutputEditorText.cc:269 msgid "Save output before proceeding?" msgstr "Enregistrer la reconnaissance avant de continuer ?" #: ../gtk/src/OutputEditorText.cc:197 ../qt/src/OutputEditorText.cc:158 msgid "Stripping line breaks..." msgstr "Supprimer les sauts de ligne" #: ../gtk/src/OutputEditorText.cc:211 msgid "Check spelling" msgstr "Vérifier l'orthographe" #: ../gtk/src/OutputEditorText.cc:238 ../qt/src/OutputEditorText.cc:178 msgid "Replacing..." msgstr "Remplacement en cours..." #: ../gtk/src/OutputEditorText.cc:264 ../qt/src/OutputEditorText.cc:204 msgid "File: %1" msgstr "Fichier: %1" #: ../gtk/src/OutputEditorText.cc:267 ../qt/src/OutputEditorText.cc:207 msgid "Page: %1" msgstr "Page: %1" #: ../gtk/src/OutputEditorText.cc:280 ../gtk/src/Recognizer.cc:481 #: ../qt/src/Recognizer.cc:460 msgid "" "\n" "[Failed to recognize page %1]\n" msgstr "" "\n" "[Echec de reconnaissance page %1]\n" #: ../gtk/src/OutputEditorText.cc:310 ../qt/src/OutputEditorText.cc:248 msgid "Text Files" msgstr "Fichiers texte" #: ../gtk/src/OutputEditorText.cc:311 ../qt/src/OutputEditorText.cc:248 msgid "Save Output..." msgstr "Enregistrer la reconnaissance..." #: ../gtk/src/Recognizer.cc:156 ../qt/src/Recognizer.cc:131 msgid "" "Tesseract crashed with the following message:\n" "\n" "%1\n" "\n" "This typically happens for one of the following reasons:\n" "- Outdated traineddata files are used.\n" "- Auxiliary language data files are missing.\n" "- Corrupt language data files.\n" "\n" "Make sure your language data files are valid and compatible with tesseract " "%2." msgstr "" "Tesseract écrasé avec le message suivant: \n" "\n" "%1\n" "\n" "Cela se produit généralement pour une des raisons suivantes:\n" "- Des fichiers traineddata obsolètes sont utilisés.\n" "- Les fichiers de données linguistiques auxiliaires manquent.\n" "- Des fichiers de données linguistiques sont corrompus.\n" "\n" "Assurez-vous que vos fichiers de données linguistiques sont valides et " "compatibles avec tesseract2%." #: ../gtk/src/Recognizer.cc:212 ../qt/src/Recognizer.cc:191 msgid "No languages available" msgstr "Aucune langue disponible" #: ../gtk/src/Recognizer.cc:212 ../qt/src/Recognizer.cc:191 msgid "" "No tesseract languages are available for use. Recognition will not work." msgstr "" "Aucun fichier langue n'étant disponible pour Tesseract, la reconnaissance ne " "fonctionnera pas." #: ../gtk/src/Recognizer.cc:266 ../qt/src/Recognizer.cc:251 msgid "Multilingual" msgstr "Multilingue" #: ../gtk/src/Recognizer.cc:318 ../qt/src/Recognizer.cc:295 msgid "Automatic page segmentation" msgstr "Segmentation automatique des pages" #: ../gtk/src/Recognizer.cc:319 ../qt/src/Recognizer.cc:296 msgid "Page segmentation with orientation and script detection" msgstr "Segmentation des pages avec détection de orientation et de script" #: ../gtk/src/Recognizer.cc:320 ../qt/src/Recognizer.cc:297 msgid "Assume single column of text" msgstr "Supposer une seule colonne de texte" #: ../gtk/src/Recognizer.cc:321 ../qt/src/Recognizer.cc:298 msgid "Assume single block of vertically aligned text" msgstr "Supposer un seul bloc de texte aligné verticalement" #: ../gtk/src/Recognizer.cc:322 ../qt/src/Recognizer.cc:299 msgid "Assume a single uniform block of text" msgstr "Supposer un seul bloc de texte uniforme" #: ../gtk/src/Recognizer.cc:323 ../qt/src/Recognizer.cc:300 msgid "Assume a line of text" msgstr "Supposer une ligne de texte" #: ../gtk/src/Recognizer.cc:324 ../qt/src/Recognizer.cc:301 msgid "Assume a single word" msgstr "Supposer un seul mot" #: ../gtk/src/Recognizer.cc:325 ../qt/src/Recognizer.cc:302 msgid "Assume a single word in a circle" msgstr "Supposer un seul mot dans un cercle" #: ../gtk/src/Recognizer.cc:326 ../qt/src/Recognizer.cc:303 msgid "Sparse text in no particular order" msgstr "Texte distribué sans ordre particulier" #: ../gtk/src/Recognizer.cc:327 ../qt/src/Recognizer.cc:304 msgid "Sparse text with orientation and script detection" msgstr "Texte distribué avec détection de orientation et de script" #: ../gtk/src/Recognizer.cc:341 ../qt/src/Recognizer.cc:314 msgid "Page segmentation mode" msgstr "Mode de segmentation des pages" #: ../gtk/src/Recognizer.cc:347 ../qt/src/Recognizer.cc:321 msgid "Manage languages..." msgstr "Gérer langues..." #: ../gtk/src/Recognizer.cc:403 ../qt/src/Recognizer.cc:381 msgid "Current selection" msgstr "Sélection courante" #: ../gtk/src/Recognizer.cc:475 ../qt/src/Recognizer.cc:454 msgid "Recognizing page %1 (%2 of %3)" msgstr "Reconnaissance page %1 (%2 de %3)" #: ../gtk/src/Recognizer.cc:480 ../qt/src/Recognizer.cc:459 msgid "" "\n" "- Page %1: failed to render page" msgstr "" "\n" "- Page %1: erreur de rendering" #: ../gtk/src/Recognizer.cc:510 ../gtk/src/Recognizer.cc:539 #: ../gtk/src/Recognizer.cc:552 ../qt/src/Recognizer.cc:488 #: ../qt/src/Recognizer.cc:517 ../qt/src/Recognizer.cc:530 msgid "Recognizing..." msgstr "Reconnaissance en cours..." #: ../gtk/src/Recognizer.cc:514 ../gtk/src/Recognizer.cc:522 #: ../qt/src/Recognizer.cc:492 ../qt/src/Recognizer.cc:500 msgid "Recognition errors occurred" msgstr "Des erreurs de reconnaissances sont apparues" #: ../gtk/src/Recognizer.cc:514 ../qt/src/Recognizer.cc:492 msgid "The following errors occurred:%1" msgstr "Les erreurs suivantes sont survenues:%1" #: ../gtk/src/Recognizer.cc:522 ../qt/src/Recognizer.cc:500 msgid "Failed to initialize tesseract" msgstr "Échec de démarrage de tesseract" #: ../gtk/src/scanner/ScannerSane.cc:83 ../gtk/src/scanner/ScannerTwain.cc:287 #: ../qt/src/scanner/ScannerSane.cc:85 ../qt/src/scanner/ScannerTwain.cc:285 msgid "Scan canceled" msgstr "Scan annulé" #: ../gtk/src/scanner/ScannerSane.cc:157 ../gtk/src/scanner/ScannerTwain.cc:186 #: ../qt/src/scanner/ScannerSane.cc:158 ../qt/src/scanner/ScannerTwain.cc:178 msgid "No scanner specified" msgstr "Aucun scanner spécifié" #: ../gtk/src/scanner/ScannerSane.cc:166 ../gtk/src/scanner/ScannerTwain.cc:195 #: ../qt/src/scanner/ScannerSane.cc:167 ../qt/src/scanner/ScannerTwain.cc:187 msgid "Unable to connect to scanner" msgstr "Impossible de se connecter au scanner" #: ../gtk/src/scanner/ScannerSane.cc:386 ../gtk/src/scanner/ScannerTwain.cc:265 #: ../gtk/src/scanner/ScannerTwain.cc:291 ../qt/src/scanner/ScannerSane.cc:387 #: ../qt/src/scanner/ScannerTwain.cc:257 ../qt/src/scanner/ScannerTwain.cc:289 msgid "Unable to start scan" msgstr "Impossible de commencer le scan" #: ../gtk/src/scanner/ScannerSane.cc:394 ../gtk/src/scanner/ScannerSane.cc:437 #: ../gtk/src/scanner/ScannerTwain.cc:317 ../qt/src/scanner/ScannerSane.cc:395 #: ../qt/src/scanner/ScannerSane.cc:438 ../qt/src/scanner/ScannerTwain.cc:315 msgid "Error communicating with scanner" msgstr "Impossible de communiquer avec le scanner" #: ../gtk/src/scanner/ScannerSane.cc:498 ../qt/src/scanner/ScannerSane.cc:494 msgid "Failed to save image" msgstr "Impossible d'enregistrer l'image" #: ../gtk/src/SourceManager.cc:118 ../qt/src/SourceManager.cc:112 msgid "Unable to open files" msgstr "Impossible d'ouvrir les fichiers" #: ../gtk/src/SourceManager.cc:118 ../qt/src/SourceManager.cc:112 msgid "The following files could not be opened:%1" msgstr "Les fichiers suivants n'ont pas pu être ouvert:%1" #: ../gtk/src/SourceManager.cc:134 ../qt/src/SourceManager.cc:154 msgid "Images and PDFs" msgstr "Images et PDFs" #: ../gtk/src/SourceManager.cc:137 ../qt/src/SourceManager.cc:155 msgid "Select Files" msgstr "Choisir fichiers" #: ../gtk/src/SourceManager.cc:143 ../qt/src/SourceManager.cc:166 msgid "Clipboard Error" msgstr "Erreur de presse-papiers" #: ../gtk/src/SourceManager.cc:143 ../qt/src/SourceManager.cc:166 msgid "Failed to read the clipboard." msgstr "Impossible de lire le presse-papiers." #: ../gtk/src/SourceManager.cc:147 ../qt/src/SourceManager.cc:170 #: ../qt/src/SourceManager.cc:176 msgid "Pasted %1" msgstr "Collée %1" #: ../gtk/src/SourceManager.cc:159 ../qt/src/SourceManager.cc:183 msgid "Screenshot Error" msgstr "Échec de la capture d'écran" #: ../gtk/src/SourceManager.cc:159 ../qt/src/SourceManager.cc:183 msgid "Failed to take screenshot." msgstr "Échec de la capture d'écran." #: ../gtk/src/SourceManager.cc:163 ../qt/src/SourceManager.cc:187 msgid "Screenshot %1" msgstr "Capture d'écran %1" #: ../gtk/src/SourceManager.cc:168 ../qt/src/SourceManager.cc:192 msgid "Saving image..." msgstr "Enregistrement de l'image..." #: ../gtk/src/SourceManager.cc:175 ../qt/src/SourceManager.cc:205 msgid "Cannot Write File" msgstr "Impossible écrire fichier" #: ../gtk/src/SourceManager.cc:175 ../qt/src/SourceManager.cc:205 msgid "Could not write to %1." msgstr "Impossible écrire à %1." #: ../gtk/src/SourceManager.cc:202 ../qt/src/SourceManager.cc:227 msgid "Delete File?" msgstr "Supprimer fichier ?" #: ../gtk/src/SourceManager.cc:202 ../qt/src/SourceManager.cc:227 msgid "The following files will be deleted:%1" msgstr "Les fichiers suivant seront supprimés:%1" #: ../gtk/src/SourceManager.cc:266 ../qt/src/SourceManager.cc:278 msgid "Missing File" msgstr "Fichier manquant" #: ../gtk/src/SourceManager.cc:266 ../qt/src/SourceManager.cc:278 msgid "" "The following file has been deleted or moved:\n" "%1" msgstr "" "Le fichier suivant a été supprimé ou déplacé:\n" "%1" #: ../gtk/src/SubstitutionsManager.cc:39 ../qt/src/SubstitutionsManager.cc:77 msgid "Search for" msgstr "Rechercher" #: ../gtk/src/SubstitutionsManager.cc:40 ../qt/src/SubstitutionsManager.cc:77 msgid "Replace with" msgstr "Remplacer par" #: ../gtk/src/SubstitutionsManager.cc:62 ../qt/src/SubstitutionsManager.cc:99 msgid "substitution_list.txt" msgstr "liste_substitutions.txt" #: ../gtk/src/SubstitutionsManager.cc:84 ../gtk/src/SubstitutionsManager.cc:119 #: ../qt/src/SubstitutionsManager.cc:114 ../qt/src/SubstitutionsManager.cc:152 msgid "Substitutions List" msgstr "Liste substitutions" #: ../gtk/src/SubstitutionsManager.cc:85 ../qt/src/SubstitutionsManager.cc:114 msgid "Open Substitutions List" msgstr "Ouvrir liste de substitutions" #: ../gtk/src/SubstitutionsManager.cc:90 ../qt/src/SubstitutionsManager.cc:119 msgid "Error Reading File" msgstr "Impossible lire le fichier" #: ../gtk/src/SubstitutionsManager.cc:90 ../qt/src/SubstitutionsManager.cc:119 msgid "Unable to read '%1'." msgstr "Impossible de lire '%1'." #: ../gtk/src/SubstitutionsManager.cc:113 ../qt/src/SubstitutionsManager.cc:146 msgid "Errors Occurred Reading File" msgstr "Des erreurs sont survenues" #: ../gtk/src/SubstitutionsManager.cc:113 ../qt/src/SubstitutionsManager.cc:146 msgid "Some entries of the substitutions list could not be read." msgstr "" "Certaines entrées de la liste des substitutions ne peuvent pas être lues." #: ../gtk/src/SubstitutionsManager.cc:120 ../qt/src/SubstitutionsManager.cc:152 msgid "Save Substitutions List" msgstr "Enregistrer liste de substitutions" #: ../gtk/src/SubstitutionsManager.cc:126 ../qt/src/SubstitutionsManager.cc:158 msgid "Error Saving File" msgstr "Impossible d'enregistrer le fichier" #: ../gtk/src/SubstitutionsManager.cc:126 ../qt/src/SubstitutionsManager.cc:158 msgid "Unable to write to '%1'." msgstr "Impossible d'enregistrer '%1'." #: ../gtk/src/SubstitutionsManager.cc:144 ../qt/src/SubstitutionsManager.cc:172 msgid "Save List?" msgstr "Enregistrer la liste ?" #: ../gtk/src/SubstitutionsManager.cc:144 ../qt/src/SubstitutionsManager.cc:172 msgid "Do you want to save the current list?" msgstr "Voulez-vous enregistrer la liste actuelle ?" #: ../gtk/src/SubstitutionsManager.cc:179 ../qt/src/SubstitutionsManager.cc:208 msgid "Applying substitutions..." msgstr "Application les substitutions..." #: ../gtk/src/TessdataManager.cc:58 ../qt/src/TessdataManager.cc:72 msgid "" "PackageKit is required for managing system-wide tesseract language packs, " "but it was not found. Please use the system package management software to " "manage the tesseract language packs, or switch to use the user tessdata path " "in the configuration dialog." msgstr "" "PackageKit est nécessaire pour gérer les packs linguistiques de tesseract, " "mais il n'a pas été trouvé. S'il vous plaît utilisez l'application de " "gestion des paquets du système pour gérer les packs linguistiques tesseract, " "ou passez à utiliser le chemin tessdata pour l'utilisateur dans le dialogue " "de configuration." #: ../gtk/src/TessdataManager.cc:63 ../qt/src/TessdataManager.cc:77 msgid "Fetching available languages" msgstr "Téléchargement de la liste des langues disponibles" #: ../gtk/src/TessdataManager.cc:68 ../gtk/src/TessdataManager.cc:89 #: ../gtk/src/TessdataManager.cc:121 ../qt/src/TessdataManager.cc:82 #: ../qt/src/TessdataManager.cc:94 ../qt/src/TessdataManager.cc:127 msgid "Failed to fetch list of available languages: %1" msgstr "Impossible de télécharger la liste des langues disponibles: %1" #: ../gtk/src/TessdataManager.cc:100 ../gtk/src/TessdataManager.cc:129 #: ../qt/src/TessdataManager.cc:105 ../qt/src/TessdataManager.cc:114 #: ../qt/src/TessdataManager.cc:136 ../qt/src/TessdataManager.cc:147 msgid "Parsing error: %1" msgstr "Erreur syntaxique: %1" #: ../gtk/src/TessdataManager.cc:191 ../qt/src/TessdataManager.cc:191 msgid "Applying changes..." msgstr "Application des modifications..." #: ../gtk/src/TessdataManager.cc:252 ../qt/src/TessdataManager.cc:237 msgid "Failed to create directory for tessdata files." msgstr "Impossible de créer le répertoire pour les fichiers tessdata." #: ../gtk/src/TessdataManager.cc:261 ../qt/src/TessdataManager.cc:245 msgid "Downloading %1..." msgstr "Téléchargement de %1..." #: ../gtk/src/TessdataManager.cc:281 ../qt/src/TessdataManager.cc:267 msgid "" "The following files could not be downloaded or removed:\n" "%1\n" "\n" "Check the connectivity and directory permissions." msgstr "" "Les fichiers suivants ne peuvent pas être téléchargés ou supprimés:\n" "%1\n" "\n" "Vérifiez la connexion et les autorisations de dossier." #: ../gtk/src/Utils.cc:62 msgid "Yes" msgstr "Oui" #: ../gtk/src/Utils.cc:65 msgid "No" msgstr "Non" #: ../gtk/src/Utils.cc:74 msgid "Discard" msgstr "Jeter" #: ../qt/data/AboutDialog.ui.h:1 msgid "About gImageReader" msgstr "À propos de gImageReader" #: ../qt/data/AboutDialog.ui.h:3 msgid "" "

 

A graphical frontend to tesseract-ocr

Website

 

" msgstr "" "

 

Une interface graphique pour tesseract-" "ocr

Website

 

" #: ../qt/data/AboutDialog.ui.h:4 msgid "Credits" msgstr "Crédits" #: ../qt/data/AboutDialog.ui.h:5 msgid "License" msgstr "Licence" #: ../qt/data/ConfigDialog.ui.h:14 msgid "System encoding" msgstr "Codage du système" #: ../qt/data/ConfigDialog.ui.h:15 msgid "UTF-8" msgstr "UTF-8" #: ../qt/data/ConfigDialog.ui.h:19 msgid "Text file encoding:" msgstr "Encodage de fichiers texte" #: ../qt/data/CrashHandler.ui.h:2 #, no-c-format msgid "" "

The application has " "crashed

Apologies for the inconvenience. To help improve the " "application, please consider reporting the issue to manisandro@gmail.com. Please try to describe what you were doing before the application " "crashed. Also, include the information below. Thank you.

" msgstr "" "

L'application a " "cessé de fonctionner

Désolé pour le désagrément. Pour aider à " "améliorer l'application, s'il vous plait signalez le problème à " "manisandro@gmail.com . Essayez de décrire ce que vous faisiez avant le " "problème. Inclure aussi les informations ci-dessous. Merci.

" #: ../qt/data/MainWindow.ui.h:1 msgid "gImageReader" msgstr "gImageReader" #. Remove & from some labels which designer insists in adding #: ../qt/data/MainWindow.ui.h:17 ../qt/src/Ui_MainWindow.hh:49 msgid "Sources" msgstr "Sources" #: ../qt/data/MainWindow.ui.h:18 msgid "Zoom In" msgstr "Zoom Avant" #: ../qt/data/MainWindow.ui.h:20 msgid "Zoom Out" msgstr "Zoom Arrière" #: ../qt/data/MainWindow.ui.h:22 msgid "Normal Size" msgstr "Taille Normale" #: ../qt/data/MainWindow.ui.h:24 msgid "Best Fit" msgstr "Ajuster à la page" #: ../qt/data/MainWindow.ui.h:26 msgid "Rotate Left" msgstr "Tourner à dans le sens anti-horaire" #: ../qt/data/MainWindow.ui.h:27 msgid "Rotate left" msgstr "Tourner à dans le sens anti-horaire" #: ../qt/data/MainWindow.ui.h:28 msgid "Rotate Right" msgstr "Tourner dans le sens horaire" #: ../qt/data/MainWindow.ui.h:29 msgid "Rotate right" msgstr "Tourner dans le sens horaire" #: ../qt/data/MainWindow.ui.h:30 msgid "Image Controls" msgstr "Régler les paramètres de l'image" #: ../qt/data/MainWindow.ui.h:32 msgid "Autodetect Layout" msgstr "Détecter la mise en page" #: ../qt/data/MainWindow.ui.h:34 msgid "Toggle Output Pane" msgstr "Montrer / cacher le panneau de reconnaissance" #: ../qt/src/MainWindow.cc:518 msgid "Could not read %1: %2" msgstr "Impossible lire %1: %2" #: ../qt/src/MainWindow.cc:543 msgid "The following dictionary files were installed:%1" msgstr "Les dictionnaires suivants ont été installés:%1" #: ../qt/src/Ui_MainWindow.hh:50 msgid "Output" msgstr "Reconnaissance" #: ../qt/src/Ui_MainWindow.hh:133 msgid "OCR mode:" msgstr "Modalité OCR:" #: ../qt/src/Ui_MainWindow.hh:204 msgid "Remove Image" msgstr "Supprimer l'image de la liste" #: ../qt/src/Ui_MainWindow.hh:207 msgid "Delete Image" msgstr "Supprimer image" #: ../qt/src/Ui_MainWindow.hh:210 msgid "Clear List" msgstr "Vider liste" #. Output toolbar #: ../qt/src/Ui_OutputEditorHOCR.hh:39 ../qt/src/Ui_OutputEditorHOCR.hh:40 msgid "Open hOCR file" msgstr "Ouvrir fichier hOCR" #: ../qt/src/Ui_OutputEditorHOCR.hh:41 ../qt/src/Ui_OutputEditorHOCR.hh:42 msgid "Save as hOCR text" msgstr "Enregistrer sous forme de texte hOCR" #: ../qt/src/Ui_OutputEditorText.hh:108 msgid "Strip Line Breaks" msgstr "Supprimer sauts de ligne" #: ../qt/src/Ui_OutputEditorText.hh:113 msgid "Find and Replace" msgstr "Trouver et remplacer" #: ../qt/src/Ui_OutputEditorText.hh:122 msgid "Save Output" msgstr "Enregistrer la reconnaissance" #: ../qt/src/Ui_OutputEditorText.hh:124 msgid "Clear Output" msgstr "Supprimer la reconnaissance" #~ msgid "" #~ "<html><head/><body><p><span style=" font-" #~ "weight:600;">The application has crashed</span></p>" #~ "<p>Apologies for the inconvenience. To help improve the " #~ "application, please consider reporting the issue to <a href="" #~ "mailto:manisandro@gmail.com?subject=gImageReader%20Crash">" #~ "manisandro@gmail.com</a>. Please try to describe what you were " #~ "doing before the application crashed. Also, include the information " #~ "below. Thank you.</p></body></html>" #~ msgstr "" #~ "<html><head/><body><p><span style=" font-" #~ "weight:600;">L'application a cessé de fonctionner</span> " #~ "</p><p>Désolé pour le désagrément. Pour aider à améliorer " #~ "l'application, s'il vous plait signalez le problème à <a href="" #~ "mailto:manisandro@gmail.com?subject=gImageReader%20Crash">" #~ "manisandro@gmail.com</a>. Essayez de décrire ce que vous faisiez " #~ "avant le problème. Inclure aussi les informations ci-dessous. Merci.</" #~ "p></body></html> " #, fuzzy #~ msgid "" #~ "<small><b>Example:</b> 1-10, 13, 14-18</small>" #~ msgstr "Par exemple: 1-10, 13, 14-18" #~ msgid "Detect script and orientation" #~ msgstr "Détecter script et orientation" #~ msgid "" #~ "PackageKit is required for managing tesseract language packs, but it was " #~ "not found. Please use the system package management software to manage " #~ "the tesseract language packs." #~ msgstr "" #~ "PackageKit est nécessaire pour gérer les packs linguistiques de " #~ "tesseract, mais il n'a pas été trouvé. S'il vous plaît utilisez " #~ "l'application de gestion des paquets du système pour gérer les packs " #~ "linguistiques tesseract." #~ msgid "" #~ "\n" #~ "\tFailed to initialize tesseract" #~ msgstr "" #~ "\n" #~ "\tImpossible d'initialiser tesseract" #~ msgid "So&urces" #~ msgstr "Sources" #~ msgid "&Output" #~ msgstr "Reconnaissance" #~ msgid "To recognize specific areas, drag rectangles over them." #~ msgstr "" #~ "Pour reconnaître des régions spécifiques, tracer des rectangles par " #~ "glisser-déplacer." #~ msgid "Rendering image..." #~ msgstr "Restitution de l'image..." #~ msgid "en_US" #~ msgstr "fr_FR" #, fuzzy #~ msgid "So&urces" #~ msgstr "Sources" #, fuzzy #~ msgid "&Output" #~ msgstr "reconnaissance" #~ msgid "Configuration" #~ msgstr "Configuration" gImageReader-3.2.3/po/gimagereader.pot000066400000000000000000001205631312567024200176220ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , YEAR. # #, fuzzy msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2017-07-01 10:34+0200\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" "Language: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=CHARSET\n" "Content-Transfer-Encoding: 8bit\n" #: ../gtk/data/appmenu.ui.h:1 ../qt/src/Ui_MainWindow.hh:165 msgid "Redetect Languages" msgstr "" #: ../gtk/data/appmenu.ui.h:2 ../gtk/data/gimagereader.ui.h:39 #: ../qt/data/ConfigDialog.ui.h:1 ../qt/src/Ui_MainWindow.hh:168 msgid "Preferences" msgstr "" #: ../gtk/data/appmenu.ui.h:3 ../gtk/data/gimagereader.ui.h:40 #: ../gtk/src/MainWindow.cc:484 ../qt/src/MainWindow.cc:445 #: ../qt/src/Ui_MainWindow.hh:173 msgid "Help" msgstr "" #: ../gtk/data/appmenu.ui.h:4 ../qt/data/AboutDialog.ui.h:2 #: ../qt/src/Ui_MainWindow.hh:176 msgid "About" msgstr "" #: ../gtk/data/appmenu.ui.h:5 msgid "Quit" msgstr "" #: ../gtk/data/crashhandler.ui.h:1 ../qt/src/CrashHandler.cc:36 msgid "Regenerate backtrace" msgstr "" #: ../gtk/data/crashhandler.ui.h:2 msgid "The application has crashed" msgstr "" #: ../gtk/data/crashhandler.ui.h:4 #, no-c-format msgid "" "Apologies for the inconvenience. To help improve the application, please " "consider reporting the issue to manisandro@gmail.com. Please try to " "describe what you were doing before the application crashed. Also, include " "the information below. Thank you." msgstr "" #: ../gtk/data/editor_hocr.ui.h:1 ../qt/data/PdfExportDialog.ui.h:1 msgid "PDF Export" msgstr "" #: ../gtk/data/editor_hocr.ui.h:2 ../gtk/data/gimagereader.ui.h:55 #: ../gtk/src/Acquirer.cc:42 ../gtk/src/FileDialogs.cc:150 #: ../gtk/src/Utils.cc:68 ../qt/data/ConfigDialog.ui.h:27 #: ../qt/data/MainWindow.ui.h:14 msgid "Cancel" msgstr "" #: ../gtk/data/editor_hocr.ui.h:3 ../gtk/data/gimagereader.ui.h:41 #: ../gtk/src/FileDialogs.cc:151 ../gtk/src/Utils.cc:59 #: ../qt/data/ConfigDialog.ui.h:26 msgid "OK" msgstr "" #: ../gtk/data/editor_hocr.ui.h:4 ../qt/data/PdfExportDialog.ui.h:2 msgid "Output mode:" msgstr "" #: ../gtk/data/editor_hocr.ui.h:5 ../qt/data/PdfExportDialog.ui.h:3 msgid "PDF" msgstr "" #: ../gtk/data/editor_hocr.ui.h:6 ../qt/data/PdfExportDialog.ui.h:4 msgid "PDF with invisible text overlay" msgstr "" #: ../gtk/data/editor_hocr.ui.h:7 ../qt/data/PdfExportDialog.ui.h:16 msgid "Format:" msgstr "" #: ../gtk/data/editor_hocr.ui.h:8 ../qt/data/PdfExportDialog.ui.h:17 msgid "Compression:" msgstr "" #: ../gtk/data/editor_hocr.ui.h:9 ../qt/data/PdfExportDialog.ui.h:14 msgid "Compression quality:" msgstr "" #: ../gtk/data/editor_hocr.ui.h:10 ../qt/data/PdfExportDialog.ui.h:15 msgid "DPI:" msgstr "" #: ../gtk/data/editor_hocr.ui.h:11 ../qt/data/PdfExportDialog.ui.h:18 msgid "Dithering algorithm:" msgstr "" #: ../gtk/data/editor_hocr.ui.h:12 ../qt/data/PdfExportDialog.ui.h:13 msgid "Image settings:" msgstr "" #: ../gtk/data/editor_hocr.ui.h:13 ../qt/data/PdfExportDialog.ui.h:11 msgid "Document font:" msgstr "" #: ../gtk/data/editor_hocr.ui.h:14 ../qt/data/PdfExportDialog.ui.h:7 msgid "Uniformize line and word spacing" msgstr "" #: ../gtk/data/editor_hocr.ui.h:15 ../qt/data/PdfExportDialog.ui.h:10 msgid "Use detected font sizes" msgstr "" #: ../gtk/data/editor_hocr.ui.h:16 ../qt/data/PdfExportDialog.ui.h:8 msgid "Preserve spaces wider than:" msgstr "" #: ../gtk/data/editor_hocr.ui.h:17 ../qt/data/PdfExportDialog.ui.h:12 msgid "characters" msgstr "" #: ../gtk/data/editor_hocr.ui.h:18 ../qt/data/PdfExportDialog.ui.h:9 msgid "Scale:" msgstr "" #: ../gtk/data/editor_hocr.ui.h:19 ../qt/data/PdfExportDialog.ui.h:6 msgid "Text settings:" msgstr "" #: ../gtk/data/editor_hocr.ui.h:20 ../qt/data/PdfExportDialog.ui.h:5 msgid "Show preview" msgstr "" #: ../gtk/data/editor_hocr.ui.h:21 ../gtk/data/editor_text.ui.h:26 #: ../qt/src/Ui_OutputEditorText.hh:123 msgid "Save output" msgstr "" #: ../gtk/data/editor_hocr.ui.h:22 ../qt/src/Ui_OutputEditorHOCR.hh:44 #: ../qt/src/Ui_OutputEditorHOCR.hh:45 msgid "Export to PDF" msgstr "" #: ../gtk/data/editor_hocr.ui.h:23 ../gtk/data/editor_text.ui.h:27 #: ../qt/src/Ui_OutputEditorHOCR.hh:47 ../qt/src/Ui_OutputEditorHOCR.hh:48 #: ../qt/src/Ui_OutputEditorText.hh:125 msgid "Clear output" msgstr "" #: ../gtk/data/editor_hocr.ui.h:24 ../qt/src/Ui_OutputEditorHOCR.hh:75 msgid "Properties" msgstr "" #: ../gtk/data/editor_hocr.ui.h:25 ../qt/src/Ui_OutputEditorHOCR.hh:79 msgid "Source" msgstr "" #. Output insert mode #: ../gtk/data/editor_text.ui.h:1 ../qt/src/Ui_OutputEditorText.hh:59 msgid "Append to current text" msgstr "" #: ../gtk/data/editor_text.ui.h:2 ../qt/src/Ui_OutputEditorText.hh:60 msgid "Insert at cursor" msgstr "" #: ../gtk/data/editor_text.ui.h:3 ../qt/src/Ui_OutputEditorText.hh:61 msgid "Replace current text" msgstr "" #: ../gtk/data/editor_text.ui.h:4 ../qt/src/SubstitutionsManager.cc:37 #: ../qt/src/Ui_OutputEditorText.hh:177 msgid "Substitutions" msgstr "" #: ../gtk/data/editor_text.ui.h:5 ../qt/src/SubstitutionsManager.cc:42 #: ../qt/src/SubstitutionsManager.cc:43 msgid "Open" msgstr "" #: ../gtk/data/editor_text.ui.h:6 ../gtk/src/Utils.cc:71 #: ../qt/src/SubstitutionsManager.cc:45 ../qt/src/SubstitutionsManager.cc:46 msgid "Save" msgstr "" #: ../gtk/data/editor_text.ui.h:7 ../qt/src/SubstitutionsManager.cc:48 #: ../qt/src/SubstitutionsManager.cc:49 msgid "Clear" msgstr "" #: ../gtk/data/editor_text.ui.h:8 ../qt/data/ConfigDialog.ui.h:16 #: ../qt/src/SubstitutionsManager.cc:51 ../qt/src/SubstitutionsManager.cc:52 msgid "Add" msgstr "" #: ../gtk/data/editor_text.ui.h:9 ../gtk/src/OutputEditorHOCR.cc:1202 #: ../gtk/src/OutputEditorHOCR.cc:1213 ../qt/data/ConfigDialog.ui.h:17 #: ../qt/src/OutputEditorHOCR.cc:998 ../qt/src/OutputEditorHOCR.cc:1000 #: ../qt/src/SubstitutionsManager.cc:54 ../qt/src/SubstitutionsManager.cc:55 msgid "Remove" msgstr "" #: ../gtk/data/editor_text.ui.h:10 ../gtk/data/gimagereader.ui.h:73 msgid "Apply" msgstr "" #: ../gtk/data/editor_text.ui.h:11 ../gtk/data/gimagereader.ui.h:74 msgid "Close" msgstr "" #. Output postprocessing #: ../gtk/data/editor_text.ui.h:12 ../qt/src/Ui_OutputEditorText.hh:69 msgid "Keep line break if..." msgstr "" #: ../gtk/data/editor_text.ui.h:13 ../qt/src/Ui_OutputEditorText.hh:71 msgid "Preceded by end mark (.?!)" msgstr "" #: ../gtk/data/editor_text.ui.h:14 ../qt/src/Ui_OutputEditorText.hh:73 msgid "Preceded or succeeded by quote" msgstr "" #: ../gtk/data/editor_text.ui.h:15 ../qt/src/Ui_OutputEditorText.hh:75 msgid "Other options" msgstr "" #: ../gtk/data/editor_text.ui.h:16 ../qt/src/Ui_OutputEditorText.hh:77 msgid "Join hyphenated words" msgstr "" #: ../gtk/data/editor_text.ui.h:17 ../qt/src/Ui_OutputEditorText.hh:79 msgid "Collapse whitespace" msgstr "" #: ../gtk/data/editor_text.ui.h:18 ../qt/src/Ui_OutputEditorText.hh:81 msgid "Preserve paragraphs" msgstr "" #: ../gtk/data/editor_text.ui.h:19 ../qt/src/Ui_OutputEditorText.hh:83 msgid "Visual aids" msgstr "" #: ../gtk/data/editor_text.ui.h:20 ../qt/src/Ui_OutputEditorText.hh:85 msgid "Draw whitespace" msgstr "" #: ../gtk/data/editor_text.ui.h:21 ../gtk/data/gimagereader.ui.h:31 #: ../qt/src/Ui_OutputEditorText.hh:102 msgid "Select insert mode" msgstr "" #: ../gtk/data/editor_text.ui.h:22 ../qt/src/Ui_OutputEditorText.hh:109 msgid "Strip line breaks on selected text" msgstr "" #: ../gtk/data/editor_text.ui.h:23 ../qt/src/Ui_OutputEditorText.hh:114 msgid "Find and replace" msgstr "" #: ../gtk/data/editor_text.ui.h:24 ../qt/src/Ui_OutputEditorText.hh:116 #: ../qt/src/Ui_OutputEditorText.hh:117 msgid "Undo" msgstr "" #: ../gtk/data/editor_text.ui.h:25 ../qt/src/Ui_OutputEditorText.hh:119 #: ../qt/src/Ui_OutputEditorText.hh:120 msgid "Redo" msgstr "" #: ../gtk/data/editor_text.ui.h:28 ../qt/src/Ui_OutputEditorText.hh:149 msgid "Find" msgstr "" #: ../gtk/data/editor_text.ui.h:29 ../qt/src/Ui_OutputEditorText.hh:153 #: ../qt/src/Ui_OutputEditorText.hh:168 msgid "Replace" msgstr "" #: ../gtk/data/editor_text.ui.h:30 ../qt/src/Ui_OutputEditorText.hh:173 msgid "Replace all" msgstr "" #: ../gtk/data/editor_text.ui.h:31 ../qt/src/Ui_OutputEditorText.hh:163 msgid "Find previous" msgstr "" #: ../gtk/data/editor_text.ui.h:32 ../qt/src/Ui_OutputEditorText.hh:158 msgid "Find next" msgstr "" #: ../gtk/data/editor_text.ui.h:33 ../qt/src/Ui_OutputEditorText.hh:182 msgid "Match case" msgstr "" #: ../gtk/data/gimagereader.ui.h:1 ../qt/src/Ui_MainWindow.hh:65 msgid "Rotate current page" msgstr "" #: ../gtk/data/gimagereader.ui.h:2 ../qt/src/Ui_MainWindow.hh:66 msgid "Rotate all pages" msgstr "" #: ../gtk/data/gimagereader.ui.h:3 ../qt/data/MainWindow.ui.h:35 msgid "Toggle output pane" msgstr "" #. Sources toolbar #: ../gtk/data/gimagereader.ui.h:4 ../qt/src/Ui_MainWindow.hh:187 msgid "Recent" msgstr "" #: ../gtk/data/gimagereader.ui.h:5 ../qt/src/Ui_MainWindow.hh:188 msgid "Paste" msgstr "" #: ../gtk/data/gimagereader.ui.h:6 ../qt/src/Ui_MainWindow.hh:189 msgid "Take Screenshot" msgstr "" #: ../gtk/data/gimagereader.ui.h:7 ../qt/src/Ui_MainWindow.hh:200 msgid "Add images" msgstr "" #: ../gtk/data/gimagereader.ui.h:8 ../qt/src/Ui_MainWindow.hh:199 msgid "Add Images" msgstr "" #: ../gtk/data/gimagereader.ui.h:9 ../qt/src/Ui_MainWindow.hh:205 msgid "Remove image from list" msgstr "" #: ../gtk/data/gimagereader.ui.h:10 ../qt/src/Ui_MainWindow.hh:208 msgid "Delete image" msgstr "" #: ../gtk/data/gimagereader.ui.h:11 ../qt/src/Ui_MainWindow.hh:211 msgid "Clear list" msgstr "" #: ../gtk/data/gimagereader.ui.h:12 ../qt/data/MainWindow.ui.h:6 msgid "Files" msgstr "" #: ../gtk/data/gimagereader.ui.h:13 ../qt/data/MainWindow.ui.h:16 msgid "Device:" msgstr "" #: ../gtk/data/gimagereader.ui.h:14 ../qt/data/MainWindow.ui.h:15 #: ../qt/src/TessdataManager.cc:57 msgid "Refresh" msgstr "" #: ../gtk/data/gimagereader.ui.h:15 ../qt/data/MainWindow.ui.h:12 msgid "Output:" msgstr "" #: ../gtk/data/gimagereader.ui.h:16 ../qt/data/MainWindow.ui.h:9 msgid "Mode:" msgstr "" #: ../gtk/data/gimagereader.ui.h:17 ../gtk/src/OutputEditorHOCR.cc:362 #: ../qt/data/MainWindow.ui.h:11 ../qt/src/OutputEditorHOCR.cc:273 msgid "Color" msgstr "" #: ../gtk/data/gimagereader.ui.h:18 ../gtk/src/OutputEditorHOCR.cc:365 #: ../qt/data/MainWindow.ui.h:10 ../qt/src/OutputEditorHOCR.cc:275 #: ../qt/src/OutputEditorHOCR.cc:277 msgid "Grayscale" msgstr "" #: ../gtk/data/gimagereader.ui.h:19 ../qt/data/MainWindow.ui.h:8 msgid "Resolution:" msgstr "" #: ../gtk/data/gimagereader.ui.h:20 ../qt/data/MainWindow.ui.h:13 msgid "Scan" msgstr "" #: ../gtk/data/gimagereader.ui.h:21 ../qt/data/MainWindow.ui.h:7 msgid "Acquire" msgstr "" #: ../gtk/data/gimagereader.ui.h:22 ../qt/data/MainWindow.ui.h:2 msgid "Brightness" msgstr "" #: ../gtk/data/gimagereader.ui.h:23 ../qt/data/MainWindow.ui.h:3 msgid "Contrast" msgstr "" #: ../gtk/data/gimagereader.ui.h:24 ../qt/data/MainWindow.ui.h:4 msgid "Resolution" msgstr "" #: ../gtk/data/gimagereader.ui.h:25 ../qt/data/MainWindow.ui.h:5 msgid "Invert colors" msgstr "" #: ../gtk/data/gimagereader.ui.h:26 ../qt/data/MainWindow.ui.h:19 msgid "Zoom in" msgstr "" #: ../gtk/data/gimagereader.ui.h:27 ../qt/data/MainWindow.ui.h:21 msgid "Zoom out" msgstr "" #: ../gtk/data/gimagereader.ui.h:28 ../qt/data/MainWindow.ui.h:23 msgid "Normal size" msgstr "" #: ../gtk/data/gimagereader.ui.h:29 ../qt/data/MainWindow.ui.h:25 msgid "Best fit" msgstr "" #: ../gtk/data/gimagereader.ui.h:30 ../qt/src/Ui_MainWindow.hh:74 msgid "Select rotation mode" msgstr "" #: ../gtk/data/gimagereader.ui.h:32 ../qt/data/MainWindow.ui.h:31 msgid "Image controls" msgstr "" #: ../gtk/data/gimagereader.ui.h:33 ../qt/src/Ui_MainWindow.hh:137 msgid "Plain text" msgstr "" #: ../gtk/data/gimagereader.ui.h:34 ../qt/src/Ui_MainWindow.hh:137 msgid "hOCR, PDF" msgstr "" #: ../gtk/data/gimagereader.ui.h:35 ../qt/data/MainWindow.ui.h:33 msgid "Autodetect layout" msgstr "" #: ../gtk/data/gimagereader.ui.h:36 msgid "Recognize all" msgstr "" #: ../gtk/data/gimagereader.ui.h:37 msgid "Select language" msgstr "" #: ../gtk/data/gimagereader.ui.h:38 msgid "A graphical frontend to tesseract-ocr" msgstr "" #: ../gtk/data/gimagereader.ui.h:42 msgid "Output pane orientation:" msgstr "" #: ../gtk/data/gimagereader.ui.h:43 msgid "Horizontal" msgstr "" #: ../gtk/data/gimagereader.ui.h:44 msgid "Vertical" msgstr "" #: ../gtk/data/gimagereader.ui.h:45 ../qt/data/ConfigDialog.ui.h:18 msgid "Query to install missing spellcheck dictionaries" msgstr "" #: ../gtk/data/gimagereader.ui.h:46 ../qt/data/ConfigDialog.ui.h:4 msgid "Automatically check for new program versions" msgstr "" #: ../gtk/data/gimagereader.ui.h:47 ../qt/data/ConfigDialog.ui.h:3 msgid "Predefined language definitions:" msgstr "" #: ../gtk/data/gimagereader.ui.h:48 ../qt/data/ConfigDialog.ui.h:12 msgid "Additional language definitions:" msgstr "" #: ../gtk/data/gimagereader.ui.h:49 ../qt/data/ConfigDialog.ui.h:20 msgid "The prefix of the tesseract language data file" msgstr "" #: ../gtk/data/gimagereader.ui.h:50 ../qt/data/ConfigDialog.ui.h:21 msgid "Prefix" msgstr "" #: ../gtk/data/gimagereader.ui.h:51 ../qt/data/ConfigDialog.ui.h:22 msgid "The ISO 639-1 language code followed by the country code" msgstr "" #: ../gtk/data/gimagereader.ui.h:52 ../qt/data/ConfigDialog.ui.h:23 msgid "ISO Code" msgstr "" #: ../gtk/data/gimagereader.ui.h:53 ../qt/data/ConfigDialog.ui.h:24 msgid "The name of the language" msgstr "" #: ../gtk/data/gimagereader.ui.h:54 ../qt/data/ConfigDialog.ui.h:25 msgid "Name" msgstr "" #: ../gtk/data/gimagereader.ui.h:56 ../qt/data/ConfigDialog.ui.h:5 msgid "Output pane font:" msgstr "" #: ../gtk/data/gimagereader.ui.h:57 ../qt/data/ConfigDialog.ui.h:2 msgid "Default" msgstr "" #: ../gtk/data/gimagereader.ui.h:58 ../qt/data/ConfigDialog.ui.h:6 msgid "Language data locations:" msgstr "" #: ../gtk/data/gimagereader.ui.h:59 ../qt/data/ConfigDialog.ui.h:13 msgid "Language definitions path:" msgstr "" #: ../gtk/data/gimagereader.ui.h:60 ../qt/data/ConfigDialog.ui.h:28 msgid "Spelling dictionaries path:" msgstr "" #: ../gtk/data/gimagereader.ui.h:61 ../qt/data/ConfigDialog.ui.h:10 msgid "System-wide paths" msgstr "" #: ../gtk/data/gimagereader.ui.h:62 ../qt/data/ConfigDialog.ui.h:11 msgid "User paths" msgstr "" #: ../gtk/data/gimagereader.ui.h:63 ../qt/data/PageRangeDialog.ui.h:1 msgid "Page Range" msgstr "" #: ../gtk/data/gimagereader.ui.h:64 ../qt/data/PageRangeDialog.ui.h:2 msgid "Page range:" msgstr "" #: ../gtk/data/gimagereader.ui.h:65 ../qt/data/PageRangeDialog.ui.h:3 msgid "Example: 1-10, 13, 14-18" msgstr "" #: ../gtk/data/gimagereader.ui.h:66 ../qt/data/PageRangeDialog.ui.h:4 msgid "Recognition area:" msgstr "" #: ../gtk/data/gimagereader.ui.h:67 ../gtk/src/Recognizer.cc:403 #: ../qt/data/PageRangeDialog.ui.h:5 ../qt/src/Recognizer.cc:381 msgid "Entire page" msgstr "" #: ../gtk/data/gimagereader.ui.h:68 ../qt/data/PageRangeDialog.ui.h:6 msgid "Autodetect" msgstr "" #: ../gtk/data/gimagereader.ui.h:69 ../qt/data/PageRangeDialog.ui.h:7 msgid "Prepend to output text:" msgstr "" #: ../gtk/data/gimagereader.ui.h:70 ../qt/data/PageRangeDialog.ui.h:8 msgid "Source filename" msgstr "" #: ../gtk/data/gimagereader.ui.h:71 ../qt/data/PageRangeDialog.ui.h:9 msgid "Source page" msgstr "" #: ../gtk/data/gimagereader.ui.h:72 ../qt/src/TessdataManager.cc:47 msgid "Tessdata Manager" msgstr "" #: ../gtk/data/gimagereader.ui.h:75 ../qt/src/TessdataManager.cc:49 msgid "Manage installed languages:" msgstr "" #: ../gtk/data/gimagereader.ui.h:76 ../qt/src/DisplayerToolSelect.cc:240 msgid "Delete" msgstr "" #: ../gtk/data/gimagereader.ui.h:77 ../qt/src/DisplayerToolSelect.cc:226 msgid "Order:" msgstr "" #: ../gtk/data/gimagereader.ui.h:78 ../gtk/src/DisplayerToolHOCR.cc:28 #: ../qt/src/DisplayerToolHOCR.cc:30 ../qt/src/DisplayerToolSelect.cc:241 msgid "Recognize" msgstr "" #: ../gtk/data/gimagereader.ui.h:79 ../qt/src/DisplayerToolSelect.cc:242 msgid "Recognize to clipboard" msgstr "" #: ../gtk/data/gimagereader.ui.h:80 ../qt/src/DisplayerToolSelect.cc:243 msgid "Save as image" msgstr "" #: ../gtk/data/gimagereader.ui.h:81 ../qt/src/Recognizer.cc:76 msgid "Current Page" msgstr "" #: ../gtk/data/gimagereader.ui.h:82 ../qt/src/Recognizer.cc:79 msgid "Multiple Pages..." msgstr "" #: ../gtk/src/Acquirer.cc:83 ../qt/src/Acquirer.cc:63 msgid "scan.png" msgstr "" #: ../gtk/src/Acquirer.cc:96 ../qt/src/Acquirer.cc:80 msgid "Images" msgstr "" #: ../gtk/src/Acquirer.cc:97 ../qt/src/Acquirer.cc:81 msgid "Choose Output Filename..." msgstr "" #: ../gtk/src/Acquirer.cc:112 ../qt/src/Acquirer.cc:96 msgid "Failed to initialize the scanning backend." msgstr "" #: ../gtk/src/Acquirer.cc:121 ../qt/src/Acquirer.cc:102 msgid "Scan failed" msgstr "" #: ../gtk/src/Acquirer.cc:139 ../qt/src/Acquirer.cc:118 msgid "No scanners were detected." msgstr "" #: ../gtk/src/Acquirer.cc:156 ../gtk/src/Acquirer.cc:173 #: ../qt/src/Acquirer.cc:132 ../qt/src/Acquirer.cc:149 msgid "Starting scan..." msgstr "" #: ../gtk/src/Acquirer.cc:169 ../qt/src/Acquirer.cc:145 msgid "Opening device..." msgstr "" #: ../gtk/src/Acquirer.cc:171 ../qt/src/Acquirer.cc:147 msgid "Setting options..." msgstr "" #: ../gtk/src/Acquirer.cc:175 ../qt/src/Acquirer.cc:151 msgid "Getting parameters..." msgstr "" #: ../gtk/src/Acquirer.cc:177 ../qt/src/Acquirer.cc:153 msgid "Transferring data..." msgstr "" #: ../gtk/src/Acquirer.cc:184 ../qt/src/Acquirer.cc:160 msgid "Canceling scan..." msgstr "" #: ../gtk/src/Config.cc:297 ../qt/data/ConfigDialog.ui.h:7 msgid "Filename prefix" msgstr "" #: ../gtk/src/Config.cc:298 ../qt/data/ConfigDialog.ui.h:8 msgid "Code" msgstr "" #: ../gtk/src/Config.cc:299 ../qt/data/ConfigDialog.ui.h:9 msgid "Native name" msgstr "" #: ../gtk/src/CrashHandler.cc:26 ../gtk/src/CrashHandler.cc:43 #: ../qt/src/CrashHandler.cc:34 msgid "Crash Handler" msgstr "" #: ../gtk/src/CrashHandler.cc:45 ../qt/src/CrashHandler.cc:29 msgid "Your work has been saved under %1." msgstr "" #: ../gtk/src/CrashHandler.cc:47 ../qt/src/CrashHandler.cc:31 msgid "There was no unsaved work." msgstr "" #: ../gtk/src/CrashHandler.cc:106 ../qt/src/CrashHandler.cc:60 msgid "Failed to obtain backtrace. Is gdb installed?" msgstr "" #: ../gtk/src/Displayer.cc:261 ../qt/src/Displayer.cc:231 msgid "Failed to load image" msgstr "" #: ../gtk/src/Displayer.cc:261 ../qt/src/Displayer.cc:231 msgid "" "The file might not be an image or be corrupt:\n" "%1" msgstr "" #: ../gtk/src/DisplayerToolSelect.cc:39 ../qt/src/DisplayerToolSelect.cc:40 msgid "selection.png" msgstr "" #: ../gtk/src/DisplayerToolSelect.cc:148 ../qt/src/DisplayerToolSelect.cc:139 msgid "PNG Images" msgstr "" #: ../gtk/src/DisplayerToolSelect.cc:149 ../qt/src/DisplayerToolSelect.cc:139 msgid "Save Selection Image" msgstr "" #: ../gtk/src/DisplayerToolSelect.cc:157 ../qt/src/DisplayerToolSelect.cc:147 msgid "Recognize all" msgstr "" #: ../gtk/src/DisplayerToolSelect.cc:157 ../qt/src/DisplayerToolSelect.cc:147 msgid "Recognize selection" msgstr "" #: ../gtk/src/DisplayerToolSelect.cc:194 ../qt/src/DisplayerToolSelect.cc:184 msgid "Performing layout analysis" msgstr "" #: ../gtk/src/FileDialogs.cc:237 msgid "" "A file named \"%1\" already exists. Are you sure you want to overwrite it?" msgstr "" #: ../gtk/src/FileDialogs.cc:239 msgid "Overwrite File?" msgstr "" #: ../gtk/src/MainWindow.cc:125 ../qt/src/MainWindow.cc:274 msgid "Using tesseract" msgstr "" #: ../gtk/src/MainWindow.cc:191 ../qt/src/MainWindow.cc:181 msgid "Select an image to begin..." msgstr "" #: ../gtk/src/MainWindow.cc:306 ../qt/src/MainWindow.cc:262 msgid "Multiple sources" msgstr "" #: ../gtk/src/MainWindow.cc:307 ../qt/src/MainWindow.cc:263 msgid "Ready" msgstr "" #: ../gtk/src/MainWindow.cc:446 ../qt/src/MainWindow.cc:390 msgid "New version" msgstr "" #: ../gtk/src/MainWindow.cc:446 ../qt/src/MainWindow.cc:390 msgid "gImageReader %1 is available" msgstr "" #: ../gtk/src/MainWindow.cc:447 ../qt/src/MainWindow.cc:391 msgid "Download" msgstr "" #: ../gtk/src/MainWindow.cc:448 ../qt/src/MainWindow.cc:392 msgid "Changelog" msgstr "" #: ../gtk/src/MainWindow.cc:449 ../qt/src/MainWindow.cc:393 msgid "Don't notify again" msgstr "" #: ../gtk/src/MainWindow.cc:468 ../qt/src/MainWindow.cc:438 msgid "Don't show again" msgstr "" #: ../gtk/src/MainWindow.cc:469 ../gtk/src/MainWindow.cc:482 #: ../qt/src/MainWindow.cc:439 msgid "Install" msgstr "" #: ../gtk/src/MainWindow.cc:489 ../qt/src/MainWindow.cc:451 msgid "Spelling dictionary missing" msgstr "" #: ../gtk/src/MainWindow.cc:489 ../qt/src/MainWindow.cc:451 msgid "The spellcheck dictionary for %1 is not installed" msgstr "" #: ../gtk/src/MainWindow.cc:496 ../gtk/src/MainWindow.cc:528 #: ../qt/src/MainWindow.cc:458 msgid "Installing spelling dictionary for '%1'" msgstr "" #: ../gtk/src/MainWindow.cc:517 ../gtk/src/MainWindow.cc:542 #: ../gtk/src/MainWindow.cc:550 ../gtk/src/MainWindow.cc:560 #: ../gtk/src/MainWindow.cc:566 ../gtk/src/MainWindow.cc:595 #: ../gtk/src/OutputEditorHOCR.cc:1375 ../gtk/src/Recognizer.cc:163 #: ../gtk/src/TessdataManager.cc:58 ../gtk/src/TessdataManager.cc:68 #: ../gtk/src/TessdataManager.cc:290 ../qt/src/MainWindow.cc:477 #: ../qt/src/MainWindow.cc:490 ../qt/src/MainWindow.cc:500 #: ../qt/src/MainWindow.cc:510 ../qt/src/MainWindow.cc:518 #: ../qt/src/MainWindow.cc:546 ../qt/src/OutputEditorHOCR.cc:1157 #: ../qt/src/Recognizer.cc:138 ../qt/src/TessdataManager.cc:72 #: ../qt/src/TessdataManager.cc:82 ../qt/src/TessdataManager.cc:275 msgid "Error" msgstr "" #: ../gtk/src/MainWindow.cc:517 ../qt/src/MainWindow.cc:477 msgid "Failed to install spelling dictionary: %1" msgstr "" #: ../gtk/src/MainWindow.cc:542 ../qt/src/MainWindow.cc:490 msgid "Failed to create directory for spelling dictionaries." msgstr "" #: ../gtk/src/MainWindow.cc:550 ../gtk/src/MainWindow.cc:566 #: ../qt/src/MainWindow.cc:500 msgid "Could not read %1: %2." msgstr "" #: ../gtk/src/MainWindow.cc:560 ../gtk/src/MainWindow.cc:595 #: ../qt/src/MainWindow.cc:510 ../qt/src/MainWindow.cc:546 msgid "No spelling dictionaries found for '%1'." msgstr "" #: ../gtk/src/MainWindow.cc:576 ../qt/src/MainWindow.cc:529 msgid "Downloading '%1'..." msgstr "" #: ../gtk/src/MainWindow.cc:592 ../qt/src/MainWindow.cc:543 msgid "Dictionaries installed" msgstr "" #: ../gtk/src/MainWindow.cc:592 msgid "The following dictionaries were installed:%1" msgstr "" #: ../gtk/src/OutputEditorHOCR.cc:319 ../qt/src/OutputEditorHOCR.cc:291 msgid "Document" msgstr "" #: ../gtk/src/OutputEditorHOCR.cc:368 ../qt/src/OutputEditorHOCR.cc:279 msgid "Monochrome" msgstr "" #: ../gtk/src/OutputEditorHOCR.cc:377 ../qt/src/OutputEditorHOCR.cc:281 msgid "Threshold (closest color)" msgstr "" #: ../gtk/src/OutputEditorHOCR.cc:380 ../qt/src/OutputEditorHOCR.cc:282 msgid "Diffuse" msgstr "" #: ../gtk/src/OutputEditorHOCR.cc:389 ../qt/src/OutputEditorHOCR.cc:283 msgid "Zip (lossless)" msgstr "" #: ../gtk/src/OutputEditorHOCR.cc:393 ../qt/src/OutputEditorHOCR.cc:284 msgid "CCITT Group 4 (lossless)" msgstr "" #: ../gtk/src/OutputEditorHOCR.cc:397 ../qt/src/OutputEditorHOCR.cc:285 msgid "Jpeg (lossy)" msgstr "" #: ../gtk/src/OutputEditorHOCR.cc:553 ../qt/src/OutputEditorHOCR.cc:429 msgid "" "The following pages could not be processed:\n" "%1" msgstr "" #: ../gtk/src/OutputEditorHOCR.cc:554 ../qt/src/OutputEditorHOCR.cc:430 msgid "Recognition errors" msgstr "" #. Add tree item #: ../gtk/src/OutputEditorHOCR.cc:647 ../gtk/src/OutputEditorHOCR.cc:1037 #: ../qt/src/OutputEditorHOCR.cc:504 ../qt/src/OutputEditorHOCR.cc:894 msgid "Graphic" msgstr "" #: ../gtk/src/OutputEditorHOCR.cc:703 ../qt/src/OutputEditorHOCR.cc:563 msgid "Paragraph" msgstr "" #: ../gtk/src/OutputEditorHOCR.cc:706 ../qt/src/OutputEditorHOCR.cc:566 msgid "Textline" msgstr "" #: ../gtk/src/OutputEditorHOCR.cc:1136 ../qt/src/OutputEditorHOCR.cc:950 msgid "Merge" msgstr "" #: ../gtk/src/OutputEditorHOCR.cc:1161 ../qt/src/OutputEditorHOCR.cc:977 msgid "Add graphic region" msgstr "" #: ../gtk/src/OutputEditorHOCR.cc:1177 ../qt/src/OutputEditorHOCR.cc:985 msgid "No suggestions" msgstr "" #: ../gtk/src/OutputEditorHOCR.cc:1183 ../qt/src/OutputEditorHOCR.cc:989 msgid "Add to dictionary" msgstr "" #: ../gtk/src/OutputEditorHOCR.cc:1189 ../qt/src/OutputEditorHOCR.cc:990 msgid "Ignore word" msgstr "" #: ../gtk/src/OutputEditorHOCR.cc:1222 ../qt/src/OutputEditorHOCR.cc:1007 msgid "Expand all" msgstr "" #: ../gtk/src/OutputEditorHOCR.cc:1225 ../qt/src/OutputEditorHOCR.cc:1008 msgid "Collapse all" msgstr "" #: ../gtk/src/OutputEditorHOCR.cc:1248 ../gtk/src/OutputEditorHOCR.cc:1287 #: ../qt/src/OutputEditorHOCR.cc:1049 ../qt/src/OutputEditorHOCR.cc:1079 msgid "hOCR HTML Files" msgstr "" #: ../gtk/src/OutputEditorHOCR.cc:1249 ../qt/src/OutputEditorHOCR.cc:1049 msgid "Open hOCR File" msgstr "" #: ../gtk/src/OutputEditorHOCR.cc:1258 ../qt/src/OutputEditorHOCR.cc:1055 msgid "Failed to open file" msgstr "" #: ../gtk/src/OutputEditorHOCR.cc:1258 ../qt/src/OutputEditorHOCR.cc:1055 msgid "The file could not be opened: %1." msgstr "" #: ../gtk/src/OutputEditorHOCR.cc:1267 ../qt/src/OutputEditorHOCR.cc:1062 msgid "Invalid hOCR file" msgstr "" #: ../gtk/src/OutputEditorHOCR.cc:1267 ../qt/src/OutputEditorHOCR.cc:1062 msgid "The file does not appear to contain valid hOCR HTML: %1" msgstr "" #: ../gtk/src/OutputEditorHOCR.cc:1283 ../gtk/src/OutputEditorHOCR.cc:1343 #: ../gtk/src/OutputEditorText.cc:306 ../qt/src/OutputEditorHOCR.cc:1077 #: ../qt/src/OutputEditorHOCR.cc:1131 ../qt/src/OutputEditorText.cc:246 msgid "output" msgstr "" #: ../gtk/src/OutputEditorHOCR.cc:1288 ../qt/src/OutputEditorHOCR.cc:1079 msgid "Save hOCR Output..." msgstr "" #: ../gtk/src/OutputEditorHOCR.cc:1296 ../gtk/src/OutputEditorHOCR.cc:1357 #: ../gtk/src/OutputEditorText.cc:319 ../qt/src/OutputEditorHOCR.cc:1087 #: ../qt/src/OutputEditorHOCR.cc:1143 ../qt/src/OutputEditorText.cc:256 msgid "Failed to save output" msgstr "" #: ../gtk/src/OutputEditorHOCR.cc:1296 ../gtk/src/OutputEditorHOCR.cc:1357 #: ../gtk/src/OutputEditorText.cc:319 ../qt/src/OutputEditorHOCR.cc:1087 #: ../qt/src/OutputEditorHOCR.cc:1143 ../qt/src/OutputEditorText.cc:256 msgid "Check that you have writing permissions in the selected folder." msgstr "" #: ../gtk/src/OutputEditorHOCR.cc:1346 ../qt/src/OutputEditorHOCR.cc:1133 msgid "PDF Files" msgstr "" #: ../gtk/src/OutputEditorHOCR.cc:1347 ../qt/src/OutputEditorHOCR.cc:1133 msgid "Save PDF Output..." msgstr "" #: ../gtk/src/OutputEditorHOCR.cc:1375 ../qt/src/OutputEditorHOCR.cc:1157 msgid "The PDF library does not support the selected font." msgstr "" #: ../gtk/src/OutputEditorHOCR.cc:1435 ../qt/src/OutputEditorHOCR.cc:1216 msgid "Errors occurred" msgstr "" #: ../gtk/src/OutputEditorHOCR.cc:1435 ../qt/src/OutputEditorHOCR.cc:1216 msgid "" "The following pages could not be rendered:\n" "%1" msgstr "" #: ../gtk/src/OutputEditorHOCR.cc:1562 ../gtk/src/OutputEditorText.cc:333 #: ../qt/src/OutputEditorHOCR.cc:1331 ../qt/src/OutputEditorText.cc:269 msgid "Output not saved" msgstr "" #: ../gtk/src/OutputEditorHOCR.cc:1562 ../gtk/src/OutputEditorText.cc:333 #: ../qt/src/OutputEditorHOCR.cc:1331 ../qt/src/OutputEditorText.cc:269 msgid "Save output before proceeding?" msgstr "" #: ../gtk/src/OutputEditorText.cc:197 ../qt/src/OutputEditorText.cc:158 msgid "Stripping line breaks..." msgstr "" #: ../gtk/src/OutputEditorText.cc:211 msgid "Check spelling" msgstr "" #: ../gtk/src/OutputEditorText.cc:238 ../qt/src/OutputEditorText.cc:178 msgid "Replacing..." msgstr "" #: ../gtk/src/OutputEditorText.cc:264 ../qt/src/OutputEditorText.cc:204 msgid "File: %1" msgstr "" #: ../gtk/src/OutputEditorText.cc:267 ../qt/src/OutputEditorText.cc:207 msgid "Page: %1" msgstr "" #: ../gtk/src/OutputEditorText.cc:280 ../gtk/src/Recognizer.cc:481 #: ../qt/src/Recognizer.cc:460 msgid "" "\n" "[Failed to recognize page %1]\n" msgstr "" #: ../gtk/src/OutputEditorText.cc:310 ../qt/src/OutputEditorText.cc:248 msgid "Text Files" msgstr "" #: ../gtk/src/OutputEditorText.cc:311 ../qt/src/OutputEditorText.cc:248 msgid "Save Output..." msgstr "" #: ../gtk/src/Recognizer.cc:156 ../qt/src/Recognizer.cc:131 msgid "" "Tesseract crashed with the following message:\n" "\n" "%1\n" "\n" "This typically happens for one of the following reasons:\n" "- Outdated traineddata files are used.\n" "- Auxiliary language data files are missing.\n" "- Corrupt language data files.\n" "\n" "Make sure your language data files are valid and compatible with tesseract " "%2." msgstr "" #: ../gtk/src/Recognizer.cc:212 ../qt/src/Recognizer.cc:191 msgid "No languages available" msgstr "" #: ../gtk/src/Recognizer.cc:212 ../qt/src/Recognizer.cc:191 msgid "" "No tesseract languages are available for use. Recognition will not work." msgstr "" #: ../gtk/src/Recognizer.cc:266 ../qt/src/Recognizer.cc:251 msgid "Multilingual" msgstr "" #: ../gtk/src/Recognizer.cc:318 ../qt/src/Recognizer.cc:295 msgid "Automatic page segmentation" msgstr "" #: ../gtk/src/Recognizer.cc:319 ../qt/src/Recognizer.cc:296 msgid "Page segmentation with orientation and script detection" msgstr "" #: ../gtk/src/Recognizer.cc:320 ../qt/src/Recognizer.cc:297 msgid "Assume single column of text" msgstr "" #: ../gtk/src/Recognizer.cc:321 ../qt/src/Recognizer.cc:298 msgid "Assume single block of vertically aligned text" msgstr "" #: ../gtk/src/Recognizer.cc:322 ../qt/src/Recognizer.cc:299 msgid "Assume a single uniform block of text" msgstr "" #: ../gtk/src/Recognizer.cc:323 ../qt/src/Recognizer.cc:300 msgid "Assume a line of text" msgstr "" #: ../gtk/src/Recognizer.cc:324 ../qt/src/Recognizer.cc:301 msgid "Assume a single word" msgstr "" #: ../gtk/src/Recognizer.cc:325 ../qt/src/Recognizer.cc:302 msgid "Assume a single word in a circle" msgstr "" #: ../gtk/src/Recognizer.cc:326 ../qt/src/Recognizer.cc:303 msgid "Sparse text in no particular order" msgstr "" #: ../gtk/src/Recognizer.cc:327 ../qt/src/Recognizer.cc:304 msgid "Sparse text with orientation and script detection" msgstr "" #: ../gtk/src/Recognizer.cc:341 ../qt/src/Recognizer.cc:314 msgid "Page segmentation mode" msgstr "" #: ../gtk/src/Recognizer.cc:347 ../qt/src/Recognizer.cc:321 msgid "Manage languages..." msgstr "" #: ../gtk/src/Recognizer.cc:403 ../qt/src/Recognizer.cc:381 msgid "Current selection" msgstr "" #: ../gtk/src/Recognizer.cc:475 ../qt/src/Recognizer.cc:454 msgid "Recognizing page %1 (%2 of %3)" msgstr "" #: ../gtk/src/Recognizer.cc:480 ../qt/src/Recognizer.cc:459 msgid "" "\n" "- Page %1: failed to render page" msgstr "" #: ../gtk/src/Recognizer.cc:510 ../gtk/src/Recognizer.cc:539 #: ../gtk/src/Recognizer.cc:552 ../qt/src/Recognizer.cc:488 #: ../qt/src/Recognizer.cc:517 ../qt/src/Recognizer.cc:530 msgid "Recognizing..." msgstr "" #: ../gtk/src/Recognizer.cc:514 ../gtk/src/Recognizer.cc:522 #: ../qt/src/Recognizer.cc:492 ../qt/src/Recognizer.cc:500 msgid "Recognition errors occurred" msgstr "" #: ../gtk/src/Recognizer.cc:514 ../qt/src/Recognizer.cc:492 msgid "The following errors occurred:%1" msgstr "" #: ../gtk/src/Recognizer.cc:522 ../qt/src/Recognizer.cc:500 msgid "Failed to initialize tesseract" msgstr "" #: ../gtk/src/scanner/ScannerSane.cc:83 ../gtk/src/scanner/ScannerTwain.cc:287 #: ../qt/src/scanner/ScannerSane.cc:85 ../qt/src/scanner/ScannerTwain.cc:285 msgid "Scan canceled" msgstr "" #: ../gtk/src/scanner/ScannerSane.cc:157 ../gtk/src/scanner/ScannerTwain.cc:186 #: ../qt/src/scanner/ScannerSane.cc:158 ../qt/src/scanner/ScannerTwain.cc:178 msgid "No scanner specified" msgstr "" #: ../gtk/src/scanner/ScannerSane.cc:166 ../gtk/src/scanner/ScannerTwain.cc:195 #: ../qt/src/scanner/ScannerSane.cc:167 ../qt/src/scanner/ScannerTwain.cc:187 msgid "Unable to connect to scanner" msgstr "" #: ../gtk/src/scanner/ScannerSane.cc:386 ../gtk/src/scanner/ScannerTwain.cc:265 #: ../gtk/src/scanner/ScannerTwain.cc:291 ../qt/src/scanner/ScannerSane.cc:387 #: ../qt/src/scanner/ScannerTwain.cc:257 ../qt/src/scanner/ScannerTwain.cc:289 msgid "Unable to start scan" msgstr "" #: ../gtk/src/scanner/ScannerSane.cc:394 ../gtk/src/scanner/ScannerSane.cc:437 #: ../gtk/src/scanner/ScannerTwain.cc:317 ../qt/src/scanner/ScannerSane.cc:395 #: ../qt/src/scanner/ScannerSane.cc:438 ../qt/src/scanner/ScannerTwain.cc:315 msgid "Error communicating with scanner" msgstr "" #: ../gtk/src/scanner/ScannerSane.cc:498 ../qt/src/scanner/ScannerSane.cc:494 msgid "Failed to save image" msgstr "" #: ../gtk/src/SourceManager.cc:118 ../qt/src/SourceManager.cc:112 msgid "Unable to open files" msgstr "" #: ../gtk/src/SourceManager.cc:118 ../qt/src/SourceManager.cc:112 msgid "The following files could not be opened:%1" msgstr "" #: ../gtk/src/SourceManager.cc:134 ../qt/src/SourceManager.cc:154 msgid "Images and PDFs" msgstr "" #: ../gtk/src/SourceManager.cc:137 ../qt/src/SourceManager.cc:155 msgid "Select Files" msgstr "" #: ../gtk/src/SourceManager.cc:143 ../qt/src/SourceManager.cc:166 msgid "Clipboard Error" msgstr "" #: ../gtk/src/SourceManager.cc:143 ../qt/src/SourceManager.cc:166 msgid "Failed to read the clipboard." msgstr "" #: ../gtk/src/SourceManager.cc:147 ../qt/src/SourceManager.cc:170 #: ../qt/src/SourceManager.cc:176 msgid "Pasted %1" msgstr "" #: ../gtk/src/SourceManager.cc:159 ../qt/src/SourceManager.cc:183 msgid "Screenshot Error" msgstr "" #: ../gtk/src/SourceManager.cc:159 ../qt/src/SourceManager.cc:183 msgid "Failed to take screenshot." msgstr "" #: ../gtk/src/SourceManager.cc:163 ../qt/src/SourceManager.cc:187 msgid "Screenshot %1" msgstr "" #: ../gtk/src/SourceManager.cc:168 ../qt/src/SourceManager.cc:192 msgid "Saving image..." msgstr "" #: ../gtk/src/SourceManager.cc:175 ../qt/src/SourceManager.cc:205 msgid "Cannot Write File" msgstr "" #: ../gtk/src/SourceManager.cc:175 ../qt/src/SourceManager.cc:205 msgid "Could not write to %1." msgstr "" #: ../gtk/src/SourceManager.cc:202 ../qt/src/SourceManager.cc:227 msgid "Delete File?" msgstr "" #: ../gtk/src/SourceManager.cc:202 ../qt/src/SourceManager.cc:227 msgid "The following files will be deleted:%1" msgstr "" #: ../gtk/src/SourceManager.cc:266 ../qt/src/SourceManager.cc:278 msgid "Missing File" msgstr "" #: ../gtk/src/SourceManager.cc:266 ../qt/src/SourceManager.cc:278 msgid "" "The following file has been deleted or moved:\n" "%1" msgstr "" #: ../gtk/src/SubstitutionsManager.cc:39 ../qt/src/SubstitutionsManager.cc:77 msgid "Search for" msgstr "" #: ../gtk/src/SubstitutionsManager.cc:40 ../qt/src/SubstitutionsManager.cc:77 msgid "Replace with" msgstr "" #: ../gtk/src/SubstitutionsManager.cc:62 ../qt/src/SubstitutionsManager.cc:99 msgid "substitution_list.txt" msgstr "" #: ../gtk/src/SubstitutionsManager.cc:84 ../gtk/src/SubstitutionsManager.cc:119 #: ../qt/src/SubstitutionsManager.cc:114 ../qt/src/SubstitutionsManager.cc:152 msgid "Substitutions List" msgstr "" #: ../gtk/src/SubstitutionsManager.cc:85 ../qt/src/SubstitutionsManager.cc:114 msgid "Open Substitutions List" msgstr "" #: ../gtk/src/SubstitutionsManager.cc:90 ../qt/src/SubstitutionsManager.cc:119 msgid "Error Reading File" msgstr "" #: ../gtk/src/SubstitutionsManager.cc:90 ../qt/src/SubstitutionsManager.cc:119 msgid "Unable to read '%1'." msgstr "" #: ../gtk/src/SubstitutionsManager.cc:113 ../qt/src/SubstitutionsManager.cc:146 msgid "Errors Occurred Reading File" msgstr "" #: ../gtk/src/SubstitutionsManager.cc:113 ../qt/src/SubstitutionsManager.cc:146 msgid "Some entries of the substitutions list could not be read." msgstr "" #: ../gtk/src/SubstitutionsManager.cc:120 ../qt/src/SubstitutionsManager.cc:152 msgid "Save Substitutions List" msgstr "" #: ../gtk/src/SubstitutionsManager.cc:126 ../qt/src/SubstitutionsManager.cc:158 msgid "Error Saving File" msgstr "" #: ../gtk/src/SubstitutionsManager.cc:126 ../qt/src/SubstitutionsManager.cc:158 msgid "Unable to write to '%1'." msgstr "" #: ../gtk/src/SubstitutionsManager.cc:144 ../qt/src/SubstitutionsManager.cc:172 msgid "Save List?" msgstr "" #: ../gtk/src/SubstitutionsManager.cc:144 ../qt/src/SubstitutionsManager.cc:172 msgid "Do you want to save the current list?" msgstr "" #: ../gtk/src/SubstitutionsManager.cc:179 ../qt/src/SubstitutionsManager.cc:208 msgid "Applying substitutions..." msgstr "" #: ../gtk/src/TessdataManager.cc:58 ../qt/src/TessdataManager.cc:72 msgid "" "PackageKit is required for managing system-wide tesseract language packs, " "but it was not found. Please use the system package management software to " "manage the tesseract language packs, or switch to use the user tessdata path " "in the configuration dialog." msgstr "" #: ../gtk/src/TessdataManager.cc:63 ../qt/src/TessdataManager.cc:77 msgid "Fetching available languages" msgstr "" #: ../gtk/src/TessdataManager.cc:68 ../gtk/src/TessdataManager.cc:89 #: ../gtk/src/TessdataManager.cc:121 ../qt/src/TessdataManager.cc:82 #: ../qt/src/TessdataManager.cc:94 ../qt/src/TessdataManager.cc:127 msgid "Failed to fetch list of available languages: %1" msgstr "" #: ../gtk/src/TessdataManager.cc:100 ../gtk/src/TessdataManager.cc:129 #: ../qt/src/TessdataManager.cc:105 ../qt/src/TessdataManager.cc:114 #: ../qt/src/TessdataManager.cc:136 ../qt/src/TessdataManager.cc:147 msgid "Parsing error: %1" msgstr "" #: ../gtk/src/TessdataManager.cc:191 ../qt/src/TessdataManager.cc:191 msgid "Applying changes..." msgstr "" #: ../gtk/src/TessdataManager.cc:252 ../qt/src/TessdataManager.cc:237 msgid "Failed to create directory for tessdata files." msgstr "" #: ../gtk/src/TessdataManager.cc:261 ../qt/src/TessdataManager.cc:245 msgid "Downloading %1..." msgstr "" #: ../gtk/src/TessdataManager.cc:281 ../qt/src/TessdataManager.cc:267 msgid "" "The following files could not be downloaded or removed:\n" "%1\n" "\n" "Check the connectivity and directory permissions." msgstr "" #: ../gtk/src/Utils.cc:62 msgid "Yes" msgstr "" #: ../gtk/src/Utils.cc:65 msgid "No" msgstr "" #: ../gtk/src/Utils.cc:74 msgid "Discard" msgstr "" #: ../qt/data/AboutDialog.ui.h:1 msgid "About gImageReader" msgstr "" #: ../qt/data/AboutDialog.ui.h:3 msgid "" "

 

A graphical frontend to tesseract-ocr

Website

 

" msgstr "" #: ../qt/data/AboutDialog.ui.h:4 msgid "Credits" msgstr "" #: ../qt/data/AboutDialog.ui.h:5 msgid "License" msgstr "" #: ../qt/data/ConfigDialog.ui.h:14 msgid "System encoding" msgstr "" #: ../qt/data/ConfigDialog.ui.h:15 msgid "UTF-8" msgstr "" #: ../qt/data/ConfigDialog.ui.h:19 msgid "Text file encoding:" msgstr "" #: ../qt/data/CrashHandler.ui.h:2 #, no-c-format msgid "" "

The application has " "crashed

Apologies for the inconvenience. To help improve the " "application, please consider reporting the issue to manisandro@gmail.com. Please try to describe what you were doing before the application " "crashed. Also, include the information below. Thank you.

" msgstr "" #: ../qt/data/MainWindow.ui.h:1 msgid "gImageReader" msgstr "" #. Remove & from some labels which designer insists in adding #: ../qt/data/MainWindow.ui.h:17 ../qt/src/Ui_MainWindow.hh:49 msgid "Sources" msgstr "" #: ../qt/data/MainWindow.ui.h:18 msgid "Zoom In" msgstr "" #: ../qt/data/MainWindow.ui.h:20 msgid "Zoom Out" msgstr "" #: ../qt/data/MainWindow.ui.h:22 msgid "Normal Size" msgstr "" #: ../qt/data/MainWindow.ui.h:24 msgid "Best Fit" msgstr "" #: ../qt/data/MainWindow.ui.h:26 msgid "Rotate Left" msgstr "" #: ../qt/data/MainWindow.ui.h:27 msgid "Rotate left" msgstr "" #: ../qt/data/MainWindow.ui.h:28 msgid "Rotate Right" msgstr "" #: ../qt/data/MainWindow.ui.h:29 msgid "Rotate right" msgstr "" #: ../qt/data/MainWindow.ui.h:30 msgid "Image Controls" msgstr "" #: ../qt/data/MainWindow.ui.h:32 msgid "Autodetect Layout" msgstr "" #: ../qt/data/MainWindow.ui.h:34 msgid "Toggle Output Pane" msgstr "" #: ../qt/src/MainWindow.cc:518 msgid "Could not read %1: %2" msgstr "" #: ../qt/src/MainWindow.cc:543 msgid "The following dictionary files were installed:%1" msgstr "" #: ../qt/src/Ui_MainWindow.hh:50 msgid "Output" msgstr "" #: ../qt/src/Ui_MainWindow.hh:133 msgid "OCR mode:" msgstr "" #: ../qt/src/Ui_MainWindow.hh:204 msgid "Remove Image" msgstr "" #: ../qt/src/Ui_MainWindow.hh:207 msgid "Delete Image" msgstr "" #: ../qt/src/Ui_MainWindow.hh:210 msgid "Clear List" msgstr "" #. Output toolbar #: ../qt/src/Ui_OutputEditorHOCR.hh:39 ../qt/src/Ui_OutputEditorHOCR.hh:40 msgid "Open hOCR file" msgstr "" #: ../qt/src/Ui_OutputEditorHOCR.hh:41 ../qt/src/Ui_OutputEditorHOCR.hh:42 msgid "Save as hOCR text" msgstr "" #: ../qt/src/Ui_OutputEditorText.hh:108 msgid "Strip Line Breaks" msgstr "" #: ../qt/src/Ui_OutputEditorText.hh:113 msgid "Find and Replace" msgstr "" #: ../qt/src/Ui_OutputEditorText.hh:122 msgid "Save Output" msgstr "" #: ../qt/src/Ui_OutputEditorText.hh:124 msgid "Clear Output" msgstr "" gImageReader-3.2.3/po/it.po000066400000000000000000001533721312567024200154420ustar00rootroot00000000000000# Italian translations for gImageReader package # Italian messages for gImageReader. # Copyright (C) 2010-2016 THE GIMAGEREADER'S COPYRIGHT HOLDER # This file is distributed under the same license as the gImageReader package. # # Sandro Mani , 2010-2011, 2013, 2014, 2015, 2016, 2017. msgid "" msgstr "" "Project-Id-Version: \n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2017-07-01 10:34+0200\n" "PO-Revision-Date: 2017-07-01 10:41+0100\n" "Last-Translator: Sandro Mani \n" "Language-Team: Italian \n" "Language: it\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" "X-Generator: Lokalize 2.0\n" #: ../gtk/data/appmenu.ui.h:1 ../qt/src/Ui_MainWindow.hh:165 msgid "Redetect Languages" msgstr "Ri-rilevare lingue" #: ../gtk/data/appmenu.ui.h:2 ../gtk/data/gimagereader.ui.h:39 #: ../qt/data/ConfigDialog.ui.h:1 ../qt/src/Ui_MainWindow.hh:168 msgid "Preferences" msgstr "Preferenze" #: ../gtk/data/appmenu.ui.h:3 ../gtk/data/gimagereader.ui.h:40 #: ../gtk/src/MainWindow.cc:484 ../qt/src/MainWindow.cc:445 #: ../qt/src/Ui_MainWindow.hh:173 msgid "Help" msgstr "Aiuto" #: ../gtk/data/appmenu.ui.h:4 ../qt/data/AboutDialog.ui.h:2 #: ../qt/src/Ui_MainWindow.hh:176 msgid "About" msgstr "Info" #: ../gtk/data/appmenu.ui.h:5 msgid "Quit" msgstr "Terminare" #: ../gtk/data/crashhandler.ui.h:1 ../qt/src/CrashHandler.cc:36 msgid "Regenerate backtrace" msgstr "Rigenerare backtrace" #: ../gtk/data/crashhandler.ui.h:2 msgid "The application has crashed" msgstr "L'applicazione ha smesso di funzionare" #: ../gtk/data/crashhandler.ui.h:4 #, no-c-format msgid "" "Apologies for the inconvenience. To help improve the application, please " "consider reporting the issue to manisandro@gmail.com. Please try to " "describe what you were doing before the application crashed. Also, include " "the information below. Thank you." msgstr "" "Per aiutare a migliorare l'applicazione, per favore considerate di segnalare " "il problema a manisandro@gmail.com. Per favore provate a descrivere cosa si " "stava facendo prima che l'applicazione smettesse di funzionare. Includete " "anche l'informazione sottostante. Grazie." #: ../gtk/data/editor_hocr.ui.h:1 ../qt/data/PdfExportDialog.ui.h:1 msgid "PDF Export" msgstr "Esportazione PDF" #: ../gtk/data/editor_hocr.ui.h:2 ../gtk/data/gimagereader.ui.h:55 #: ../gtk/src/Acquirer.cc:42 ../gtk/src/FileDialogs.cc:150 #: ../gtk/src/Utils.cc:68 ../qt/data/ConfigDialog.ui.h:27 #: ../qt/data/MainWindow.ui.h:14 msgid "Cancel" msgstr "Interrompere" #: ../gtk/data/editor_hocr.ui.h:3 ../gtk/data/gimagereader.ui.h:41 #: ../gtk/src/FileDialogs.cc:151 ../gtk/src/Utils.cc:59 #: ../qt/data/ConfigDialog.ui.h:26 msgid "OK" msgstr "OK" #: ../gtk/data/editor_hocr.ui.h:4 ../qt/data/PdfExportDialog.ui.h:2 msgid "Output mode:" msgstr "Modalità:" #: ../gtk/data/editor_hocr.ui.h:5 ../qt/data/PdfExportDialog.ui.h:3 msgid "PDF" msgstr "PDF" #: ../gtk/data/editor_hocr.ui.h:6 ../qt/data/PdfExportDialog.ui.h:4 msgid "PDF with invisible text overlay" msgstr "PDF con testo invisibile" #: ../gtk/data/editor_hocr.ui.h:7 ../qt/data/PdfExportDialog.ui.h:16 msgid "Format:" msgstr "Formato:" #: ../gtk/data/editor_hocr.ui.h:8 ../qt/data/PdfExportDialog.ui.h:17 msgid "Compression:" msgstr "Compressione:" #: ../gtk/data/editor_hocr.ui.h:9 ../qt/data/PdfExportDialog.ui.h:14 msgid "Compression quality:" msgstr "Qualità di compressione:" #: ../gtk/data/editor_hocr.ui.h:10 ../qt/data/PdfExportDialog.ui.h:15 msgid "DPI:" msgstr "DPI:" #: ../gtk/data/editor_hocr.ui.h:11 ../qt/data/PdfExportDialog.ui.h:18 msgid "Dithering algorithm:" msgstr "Algoritmo di dithering:" #: ../gtk/data/editor_hocr.ui.h:12 ../qt/data/PdfExportDialog.ui.h:13 msgid "Image settings:" msgstr "Immagini:" #: ../gtk/data/editor_hocr.ui.h:13 ../qt/data/PdfExportDialog.ui.h:11 msgid "Document font:" msgstr "Carattere:" #: ../gtk/data/editor_hocr.ui.h:14 ../qt/data/PdfExportDialog.ui.h:7 msgid "Uniformize line and word spacing" msgstr "Omogenizzare la spaziatura" #: ../gtk/data/editor_hocr.ui.h:15 ../qt/data/PdfExportDialog.ui.h:10 msgid "Use detected font sizes" msgstr "Usare le dimensioni carattere rilevate" #: ../gtk/data/editor_hocr.ui.h:16 ../qt/data/PdfExportDialog.ui.h:8 msgid "Preserve spaces wider than:" msgstr "Preservare spazi più larghi di:" #: ../gtk/data/editor_hocr.ui.h:17 ../qt/data/PdfExportDialog.ui.h:12 msgid "characters" msgstr "caratteri" #: ../gtk/data/editor_hocr.ui.h:18 ../qt/data/PdfExportDialog.ui.h:9 msgid "Scale:" msgstr "Scala:" #: ../gtk/data/editor_hocr.ui.h:19 ../qt/data/PdfExportDialog.ui.h:6 msgid "Text settings:" msgstr "Testo:" #: ../gtk/data/editor_hocr.ui.h:20 ../qt/data/PdfExportDialog.ui.h:5 msgid "Show preview" msgstr "Mostra anteprima" #: ../gtk/data/editor_hocr.ui.h:21 ../gtk/data/editor_text.ui.h:26 #: ../qt/src/Ui_OutputEditorText.hh:123 msgid "Save output" msgstr "Salvare output" #: ../gtk/data/editor_hocr.ui.h:22 ../qt/src/Ui_OutputEditorHOCR.hh:44 #: ../qt/src/Ui_OutputEditorHOCR.hh:45 msgid "Export to PDF" msgstr "Esportare in PDF" #: ../gtk/data/editor_hocr.ui.h:23 ../gtk/data/editor_text.ui.h:27 #: ../qt/src/Ui_OutputEditorHOCR.hh:47 ../qt/src/Ui_OutputEditorHOCR.hh:48 #: ../qt/src/Ui_OutputEditorText.hh:125 msgid "Clear output" msgstr "Cancellare output" #: ../gtk/data/editor_hocr.ui.h:24 ../qt/src/Ui_OutputEditorHOCR.hh:75 msgid "Properties" msgstr "Proprietà" #: ../gtk/data/editor_hocr.ui.h:25 ../qt/src/Ui_OutputEditorHOCR.hh:79 msgid "Source" msgstr "Fonte" #. Output insert mode #: ../gtk/data/editor_text.ui.h:1 ../qt/src/Ui_OutputEditorText.hh:59 msgid "Append to current text" msgstr "Appendere al testo esistente" #: ../gtk/data/editor_text.ui.h:2 ../qt/src/Ui_OutputEditorText.hh:60 msgid "Insert at cursor" msgstr "Inserire al cursore" #: ../gtk/data/editor_text.ui.h:3 ../qt/src/Ui_OutputEditorText.hh:61 msgid "Replace current text" msgstr "Rimpiazzare testo esistente" #: ../gtk/data/editor_text.ui.h:4 ../qt/src/SubstitutionsManager.cc:37 #: ../qt/src/Ui_OutputEditorText.hh:177 msgid "Substitutions" msgstr "Sostituzioni" #: ../gtk/data/editor_text.ui.h:5 ../qt/src/SubstitutionsManager.cc:42 #: ../qt/src/SubstitutionsManager.cc:43 msgid "Open" msgstr "Aprire" #: ../gtk/data/editor_text.ui.h:6 ../gtk/src/Utils.cc:71 #: ../qt/src/SubstitutionsManager.cc:45 ../qt/src/SubstitutionsManager.cc:46 msgid "Save" msgstr "Salvare" #: ../gtk/data/editor_text.ui.h:7 ../qt/src/SubstitutionsManager.cc:48 #: ../qt/src/SubstitutionsManager.cc:49 msgid "Clear" msgstr "Svuotare lista" #: ../gtk/data/editor_text.ui.h:8 ../qt/data/ConfigDialog.ui.h:16 #: ../qt/src/SubstitutionsManager.cc:51 ../qt/src/SubstitutionsManager.cc:52 msgid "Add" msgstr "Aggiungere" #: ../gtk/data/editor_text.ui.h:9 ../gtk/src/OutputEditorHOCR.cc:1202 #: ../gtk/src/OutputEditorHOCR.cc:1213 ../qt/data/ConfigDialog.ui.h:17 #: ../qt/src/OutputEditorHOCR.cc:998 ../qt/src/OutputEditorHOCR.cc:1000 #: ../qt/src/SubstitutionsManager.cc:54 ../qt/src/SubstitutionsManager.cc:55 msgid "Remove" msgstr "Rimuovere" #: ../gtk/data/editor_text.ui.h:10 ../gtk/data/gimagereader.ui.h:73 msgid "Apply" msgstr "Applicare" #: ../gtk/data/editor_text.ui.h:11 ../gtk/data/gimagereader.ui.h:74 msgid "Close" msgstr "Chiudere" #. Output postprocessing #: ../gtk/data/editor_text.ui.h:12 ../qt/src/Ui_OutputEditorText.hh:69 msgid "Keep line break if..." msgstr "Tenere interruzioni di riga se..." #: ../gtk/data/editor_text.ui.h:13 ../qt/src/Ui_OutputEditorText.hh:71 msgid "Preceded by end mark (.?!)" msgstr "Preceduto da punteggiatura di fine periodo (.?!)" #: ../gtk/data/editor_text.ui.h:14 ../qt/src/Ui_OutputEditorText.hh:73 msgid "Preceded or succeeded by quote" msgstr "Preceduto o seguito da virgolette" #: ../gtk/data/editor_text.ui.h:15 ../qt/src/Ui_OutputEditorText.hh:75 msgid "Other options" msgstr "Altre opzioni" #: ../gtk/data/editor_text.ui.h:16 ../qt/src/Ui_OutputEditorText.hh:77 msgid "Join hyphenated words" msgstr "Unire parole divise" #: ../gtk/data/editor_text.ui.h:17 ../qt/src/Ui_OutputEditorText.hh:79 msgid "Collapse whitespace" msgstr "Collassare spazi bianchi" #: ../gtk/data/editor_text.ui.h:18 ../qt/src/Ui_OutputEditorText.hh:81 msgid "Preserve paragraphs" msgstr "Preservare paragrafi" #: ../gtk/data/editor_text.ui.h:19 ../qt/src/Ui_OutputEditorText.hh:83 msgid "Visual aids" msgstr "Aiuti visuali" #: ../gtk/data/editor_text.ui.h:20 ../qt/src/Ui_OutputEditorText.hh:85 msgid "Draw whitespace" msgstr "Disegnare spazi bianchi" #: ../gtk/data/editor_text.ui.h:21 ../gtk/data/gimagereader.ui.h:31 #: ../qt/src/Ui_OutputEditorText.hh:102 msgid "Select insert mode" msgstr "Selezionare modalità di inserimento" #: ../gtk/data/editor_text.ui.h:22 ../qt/src/Ui_OutputEditorText.hh:109 msgid "Strip line breaks on selected text" msgstr "Rimuovere interruzioni di riga nel testo selezionato" #: ../gtk/data/editor_text.ui.h:23 ../qt/src/Ui_OutputEditorText.hh:114 msgid "Find and replace" msgstr "Cercare e sostituire" #: ../gtk/data/editor_text.ui.h:24 ../qt/src/Ui_OutputEditorText.hh:116 #: ../qt/src/Ui_OutputEditorText.hh:117 msgid "Undo" msgstr "Annullare" #: ../gtk/data/editor_text.ui.h:25 ../qt/src/Ui_OutputEditorText.hh:119 #: ../qt/src/Ui_OutputEditorText.hh:120 msgid "Redo" msgstr "Rifare" #: ../gtk/data/editor_text.ui.h:28 ../qt/src/Ui_OutputEditorText.hh:149 msgid "Find" msgstr "Cerca" #: ../gtk/data/editor_text.ui.h:29 ../qt/src/Ui_OutputEditorText.hh:153 #: ../qt/src/Ui_OutputEditorText.hh:168 msgid "Replace" msgstr "Sostituisci" #: ../gtk/data/editor_text.ui.h:30 ../qt/src/Ui_OutputEditorText.hh:173 msgid "Replace all" msgstr "Sostituire tutte" #: ../gtk/data/editor_text.ui.h:31 ../qt/src/Ui_OutputEditorText.hh:163 msgid "Find previous" msgstr "Cerca precedente" #: ../gtk/data/editor_text.ui.h:32 ../qt/src/Ui_OutputEditorText.hh:158 msgid "Find next" msgstr "Cerca successivo" #: ../gtk/data/editor_text.ui.h:33 ../qt/src/Ui_OutputEditorText.hh:182 msgid "Match case" msgstr "Considera maiuscole e minuscole" #: ../gtk/data/gimagereader.ui.h:1 ../qt/src/Ui_MainWindow.hh:65 msgid "Rotate current page" msgstr "Ruotare pagina corrente" #: ../gtk/data/gimagereader.ui.h:2 ../qt/src/Ui_MainWindow.hh:66 msgid "Rotate all pages" msgstr "Ruotare tutte le pagine" #: ../gtk/data/gimagereader.ui.h:3 ../qt/data/MainWindow.ui.h:35 msgid "Toggle output pane" msgstr "Mostra/nascondi riquadro output" #. Sources toolbar #: ../gtk/data/gimagereader.ui.h:4 ../qt/src/Ui_MainWindow.hh:187 msgid "Recent" msgstr "Recenti" #: ../gtk/data/gimagereader.ui.h:5 ../qt/src/Ui_MainWindow.hh:188 msgid "Paste" msgstr "Incollare" #: ../gtk/data/gimagereader.ui.h:6 ../qt/src/Ui_MainWindow.hh:189 msgid "Take Screenshot" msgstr "Catturare Screenshot" #: ../gtk/data/gimagereader.ui.h:7 ../qt/src/Ui_MainWindow.hh:200 msgid "Add images" msgstr "Aggiungere immagini" #: ../gtk/data/gimagereader.ui.h:8 ../qt/src/Ui_MainWindow.hh:199 msgid "Add Images" msgstr "Aggiungere immagini" #: ../gtk/data/gimagereader.ui.h:9 ../qt/src/Ui_MainWindow.hh:205 msgid "Remove image from list" msgstr "Rimuovere immagine dalla lista" #: ../gtk/data/gimagereader.ui.h:10 ../qt/src/Ui_MainWindow.hh:208 msgid "Delete image" msgstr "Eliminare immagine" #: ../gtk/data/gimagereader.ui.h:11 ../qt/src/Ui_MainWindow.hh:211 msgid "Clear list" msgstr "Svuotare lista" #: ../gtk/data/gimagereader.ui.h:12 ../qt/data/MainWindow.ui.h:6 msgid "Files" msgstr "File" #: ../gtk/data/gimagereader.ui.h:13 ../qt/data/MainWindow.ui.h:16 msgid "Device:" msgstr "Dispositivo:" #: ../gtk/data/gimagereader.ui.h:14 ../qt/data/MainWindow.ui.h:15 #: ../qt/src/TessdataManager.cc:57 msgid "Refresh" msgstr "Aggiornare" #: ../gtk/data/gimagereader.ui.h:15 ../qt/data/MainWindow.ui.h:12 msgid "Output:" msgstr "Output:" #: ../gtk/data/gimagereader.ui.h:16 ../qt/data/MainWindow.ui.h:9 msgid "Mode:" msgstr "Modalità:" #: ../gtk/data/gimagereader.ui.h:17 ../gtk/src/OutputEditorHOCR.cc:362 #: ../qt/data/MainWindow.ui.h:11 ../qt/src/OutputEditorHOCR.cc:273 msgid "Color" msgstr "Colore" #: ../gtk/data/gimagereader.ui.h:18 ../gtk/src/OutputEditorHOCR.cc:365 #: ../qt/data/MainWindow.ui.h:10 ../qt/src/OutputEditorHOCR.cc:275 #: ../qt/src/OutputEditorHOCR.cc:277 msgid "Grayscale" msgstr "Scala grigi" #: ../gtk/data/gimagereader.ui.h:19 ../qt/data/MainWindow.ui.h:8 msgid "Resolution:" msgstr "Risoluzione:" #: ../gtk/data/gimagereader.ui.h:20 ../qt/data/MainWindow.ui.h:13 msgid "Scan" msgstr "Scansione" #: ../gtk/data/gimagereader.ui.h:21 ../qt/data/MainWindow.ui.h:7 msgid "Acquire" msgstr "Acquisire" #: ../gtk/data/gimagereader.ui.h:22 ../qt/data/MainWindow.ui.h:2 msgid "Brightness" msgstr "Luminosità" #: ../gtk/data/gimagereader.ui.h:23 ../qt/data/MainWindow.ui.h:3 msgid "Contrast" msgstr "Contrasto" #: ../gtk/data/gimagereader.ui.h:24 ../qt/data/MainWindow.ui.h:4 msgid "Resolution" msgstr "Risoluzione" #: ../gtk/data/gimagereader.ui.h:25 ../qt/data/MainWindow.ui.h:5 msgid "Invert colors" msgstr "Invertire colori" #: ../gtk/data/gimagereader.ui.h:26 ../qt/data/MainWindow.ui.h:19 msgid "Zoom in" msgstr "Ingrandire" #: ../gtk/data/gimagereader.ui.h:27 ../qt/data/MainWindow.ui.h:21 msgid "Zoom out" msgstr "Rimpicciolire" #: ../gtk/data/gimagereader.ui.h:28 ../qt/data/MainWindow.ui.h:23 msgid "Normal size" msgstr "Dimensioni normali" #: ../gtk/data/gimagereader.ui.h:29 ../qt/data/MainWindow.ui.h:25 msgid "Best fit" msgstr "Dimensioni ideali" #: ../gtk/data/gimagereader.ui.h:30 ../qt/src/Ui_MainWindow.hh:74 msgid "Select rotation mode" msgstr "Selezionare modalità di rotazione" #: ../gtk/data/gimagereader.ui.h:32 ../qt/data/MainWindow.ui.h:31 msgid "Image controls" msgstr "Controlli immagine" #: ../gtk/data/gimagereader.ui.h:33 ../qt/src/Ui_MainWindow.hh:137 msgid "Plain text" msgstr "Testo" #: ../gtk/data/gimagereader.ui.h:34 ../qt/src/Ui_MainWindow.hh:137 msgid "hOCR, PDF" msgstr "hOCR, PDF" #: ../gtk/data/gimagereader.ui.h:35 ../qt/data/MainWindow.ui.h:33 msgid "Autodetect layout" msgstr "Rilevare impaginazione" #: ../gtk/data/gimagereader.ui.h:36 msgid "Recognize all" msgstr "Riconoscere tutto" #: ../gtk/data/gimagereader.ui.h:37 msgid "Select language" msgstr "Selezionare lingua" #: ../gtk/data/gimagereader.ui.h:38 msgid "A graphical frontend to tesseract-ocr" msgstr "Un'interfaccia grafica per tesseract-ocr" #: ../gtk/data/gimagereader.ui.h:42 msgid "Output pane orientation:" msgstr "Orientamento riquadro output:" #: ../gtk/data/gimagereader.ui.h:43 msgid "Horizontal" msgstr "Orizzontale" #: ../gtk/data/gimagereader.ui.h:44 msgid "Vertical" msgstr "Verticale" #: ../gtk/data/gimagereader.ui.h:45 ../qt/data/ConfigDialog.ui.h:18 msgid "Query to install missing spellcheck dictionaries" msgstr "Chiedere di installare dizionari ortografici mancanti" #: ../gtk/data/gimagereader.ui.h:46 ../qt/data/ConfigDialog.ui.h:4 msgid "Automatically check for new program versions" msgstr "Verificare la disponibilità di nuove versioni" #: ../gtk/data/gimagereader.ui.h:47 ../qt/data/ConfigDialog.ui.h:3 msgid "Predefined language definitions:" msgstr "Definizioni di lingua predefinite:" #: ../gtk/data/gimagereader.ui.h:48 ../qt/data/ConfigDialog.ui.h:12 msgid "Additional language definitions:" msgstr "Ulteriori definizioni di lingue:" #: ../gtk/data/gimagereader.ui.h:49 ../qt/data/ConfigDialog.ui.h:20 msgid "The prefix of the tesseract language data file" msgstr "Il prefisso dei file lingua tesseract" #: ../gtk/data/gimagereader.ui.h:50 ../qt/data/ConfigDialog.ui.h:21 msgid "Prefix" msgstr "Prefisso" #: ../gtk/data/gimagereader.ui.h:51 ../qt/data/ConfigDialog.ui.h:22 msgid "The ISO 639-1 language code followed by the country code" msgstr "Il codice lingua ISO 639-1, seguito dal codice del paese" #: ../gtk/data/gimagereader.ui.h:52 ../qt/data/ConfigDialog.ui.h:23 msgid "ISO Code" msgstr "Codice" #: ../gtk/data/gimagereader.ui.h:53 ../qt/data/ConfigDialog.ui.h:24 msgid "The name of the language" msgstr "Il nome della lingua" #: ../gtk/data/gimagereader.ui.h:54 ../qt/data/ConfigDialog.ui.h:25 msgid "Name" msgstr "Nome" #: ../gtk/data/gimagereader.ui.h:56 ../qt/data/ConfigDialog.ui.h:5 msgid "Output pane font:" msgstr "Carattere per riquadro output:" #: ../gtk/data/gimagereader.ui.h:57 ../qt/data/ConfigDialog.ui.h:2 msgid "Default" msgstr "Predefinito" #: ../gtk/data/gimagereader.ui.h:58 ../qt/data/ConfigDialog.ui.h:6 msgid "Language data locations:" msgstr "Percorsi dati:" #: ../gtk/data/gimagereader.ui.h:59 ../qt/data/ConfigDialog.ui.h:13 msgid "Language definitions path:" msgstr "Percorso definizioni di lingua:" #: ../gtk/data/gimagereader.ui.h:60 ../qt/data/ConfigDialog.ui.h:28 msgid "Spelling dictionaries path:" msgstr "Percorso dizionari ortografici:" #: ../gtk/data/gimagereader.ui.h:61 ../qt/data/ConfigDialog.ui.h:10 msgid "System-wide paths" msgstr "Percorsi di sistema" #: ../gtk/data/gimagereader.ui.h:62 ../qt/data/ConfigDialog.ui.h:11 msgid "User paths" msgstr "Percorsi utente" #: ../gtk/data/gimagereader.ui.h:63 ../qt/data/PageRangeDialog.ui.h:1 msgid "Page Range" msgstr "Intervallo pagine" #: ../gtk/data/gimagereader.ui.h:64 ../qt/data/PageRangeDialog.ui.h:2 msgid "Page range:" msgstr "Intervallo pagine:" #: ../gtk/data/gimagereader.ui.h:65 ../qt/data/PageRangeDialog.ui.h:3 msgid "Example: 1-10, 13, 14-18" msgstr "Esempio: 1-10, 13, 14-18" #: ../gtk/data/gimagereader.ui.h:66 ../qt/data/PageRangeDialog.ui.h:4 msgid "Recognition area:" msgstr "Area di ricognizione:" #: ../gtk/data/gimagereader.ui.h:67 ../gtk/src/Recognizer.cc:403 #: ../qt/data/PageRangeDialog.ui.h:5 ../qt/src/Recognizer.cc:381 msgid "Entire page" msgstr "Pagina intera" #: ../gtk/data/gimagereader.ui.h:68 ../qt/data/PageRangeDialog.ui.h:6 msgid "Autodetect" msgstr "Rileva automaticamente" #: ../gtk/data/gimagereader.ui.h:69 ../qt/data/PageRangeDialog.ui.h:7 msgid "Prepend to output text:" msgstr "Anteporre al testo di output:" #: ../gtk/data/gimagereader.ui.h:70 ../qt/data/PageRangeDialog.ui.h:8 msgid "Source filename" msgstr "Nome del file di origine" #: ../gtk/data/gimagereader.ui.h:71 ../qt/data/PageRangeDialog.ui.h:9 msgid "Source page" msgstr "Pagina di origine" #: ../gtk/data/gimagereader.ui.h:72 ../qt/src/TessdataManager.cc:47 msgid "Tessdata Manager" msgstr "Gestione tessdata" #: ../gtk/data/gimagereader.ui.h:75 ../qt/src/TessdataManager.cc:49 msgid "Manage installed languages:" msgstr "Gestione delle lingue installate:" #: ../gtk/data/gimagereader.ui.h:76 ../qt/src/DisplayerToolSelect.cc:240 msgid "Delete" msgstr "Elimina" #: ../gtk/data/gimagereader.ui.h:77 ../qt/src/DisplayerToolSelect.cc:226 msgid "Order:" msgstr "Ordine:" #: ../gtk/data/gimagereader.ui.h:78 ../gtk/src/DisplayerToolHOCR.cc:28 #: ../qt/src/DisplayerToolHOCR.cc:30 ../qt/src/DisplayerToolSelect.cc:241 msgid "Recognize" msgstr "Riconoscere" #: ../gtk/data/gimagereader.ui.h:79 ../qt/src/DisplayerToolSelect.cc:242 msgid "Recognize to clipboard" msgstr "Riconoscere negli appunti" #: ../gtk/data/gimagereader.ui.h:80 ../qt/src/DisplayerToolSelect.cc:243 msgid "Save as image" msgstr "Salva come immagine" #: ../gtk/data/gimagereader.ui.h:81 ../qt/src/Recognizer.cc:76 msgid "Current Page" msgstr "Pagina corrente" #: ../gtk/data/gimagereader.ui.h:82 ../qt/src/Recognizer.cc:79 msgid "Multiple Pages..." msgstr "Più pagine..." #: ../gtk/src/Acquirer.cc:83 ../qt/src/Acquirer.cc:63 msgid "scan.png" msgstr "scansione.png" #: ../gtk/src/Acquirer.cc:96 ../qt/src/Acquirer.cc:80 msgid "Images" msgstr "Immagini" #: ../gtk/src/Acquirer.cc:97 ../qt/src/Acquirer.cc:81 msgid "Choose Output Filename..." msgstr "Scegliere nome file di output..." #: ../gtk/src/Acquirer.cc:112 ../qt/src/Acquirer.cc:96 msgid "Failed to initialize the scanning backend." msgstr "Inizializzazione backend di scansione fallita." #: ../gtk/src/Acquirer.cc:121 ../qt/src/Acquirer.cc:102 msgid "Scan failed" msgstr "Scansione fallita" #: ../gtk/src/Acquirer.cc:139 ../qt/src/Acquirer.cc:118 msgid "No scanners were detected." msgstr "Nessun scanner è stato rilevato." #: ../gtk/src/Acquirer.cc:156 ../gtk/src/Acquirer.cc:173 #: ../qt/src/Acquirer.cc:132 ../qt/src/Acquirer.cc:149 msgid "Starting scan..." msgstr "Inizializzando scansione..." #: ../gtk/src/Acquirer.cc:169 ../qt/src/Acquirer.cc:145 msgid "Opening device..." msgstr "Aprendo dispositivo..." #: ../gtk/src/Acquirer.cc:171 ../qt/src/Acquirer.cc:147 msgid "Setting options..." msgstr "Settando impostazioni..." #: ../gtk/src/Acquirer.cc:175 ../qt/src/Acquirer.cc:151 msgid "Getting parameters..." msgstr "Leggendo parametri..." #: ../gtk/src/Acquirer.cc:177 ../qt/src/Acquirer.cc:153 msgid "Transferring data..." msgstr "Trasferendo dati..." #: ../gtk/src/Acquirer.cc:184 ../qt/src/Acquirer.cc:160 msgid "Canceling scan..." msgstr "Interrompendo scansione..." #: ../gtk/src/Config.cc:297 ../qt/data/ConfigDialog.ui.h:7 msgid "Filename prefix" msgstr "Prefisso nome file" #: ../gtk/src/Config.cc:298 ../qt/data/ConfigDialog.ui.h:8 msgid "Code" msgstr "Codice" #: ../gtk/src/Config.cc:299 ../qt/data/ConfigDialog.ui.h:9 msgid "Native name" msgstr "Nome nativo" #: ../gtk/src/CrashHandler.cc:26 ../gtk/src/CrashHandler.cc:43 #: ../qt/src/CrashHandler.cc:34 msgid "Crash Handler" msgstr "Crash Handler" #: ../gtk/src/CrashHandler.cc:45 ../qt/src/CrashHandler.cc:29 msgid "Your work has been saved under %1." msgstr "Il lavoro è stato salvato sotto %1." #: ../gtk/src/CrashHandler.cc:47 ../qt/src/CrashHandler.cc:31 msgid "There was no unsaved work." msgstr "Non vi è lavoro non salvato." #: ../gtk/src/CrashHandler.cc:106 ../qt/src/CrashHandler.cc:60 msgid "Failed to obtain backtrace. Is gdb installed?" msgstr "Non è stato possibile ottenere un backtrace. È installato gdb?" #: ../gtk/src/Displayer.cc:261 ../qt/src/Displayer.cc:231 msgid "Failed to load image" msgstr "Caricamento immagine fallito" #: ../gtk/src/Displayer.cc:261 ../qt/src/Displayer.cc:231 msgid "" "The file might not be an image or be corrupt:\n" "%1" msgstr "" "Il file potrebbe non essere un'immagine, oppure essere corrotto:\n" "%1" #: ../gtk/src/DisplayerToolSelect.cc:39 ../qt/src/DisplayerToolSelect.cc:40 msgid "selection.png" msgstr "selezione.png" #: ../gtk/src/DisplayerToolSelect.cc:148 ../qt/src/DisplayerToolSelect.cc:139 msgid "PNG Images" msgstr "Immagini PNG" #: ../gtk/src/DisplayerToolSelect.cc:149 ../qt/src/DisplayerToolSelect.cc:139 msgid "Save Selection Image" msgstr "Salvare immagine selezionata" #: ../gtk/src/DisplayerToolSelect.cc:157 ../qt/src/DisplayerToolSelect.cc:147 msgid "Recognize all" msgstr "Riconoscere tutto" #: ../gtk/src/DisplayerToolSelect.cc:157 ../qt/src/DisplayerToolSelect.cc:147 msgid "Recognize selection" msgstr "Riconoscere selezione" #: ../gtk/src/DisplayerToolSelect.cc:194 ../qt/src/DisplayerToolSelect.cc:184 msgid "Performing layout analysis" msgstr "Rilevando impaginazione" #: ../gtk/src/FileDialogs.cc:237 msgid "" "A file named \"%1\" already exists. Are you sure you want to overwrite it?" msgstr "Un file con nome \"%1\" esiste già. Sovrascrivere il file?" #: ../gtk/src/FileDialogs.cc:239 msgid "Overwrite File?" msgstr "Sovrascrivere il file?" #: ../gtk/src/MainWindow.cc:125 ../qt/src/MainWindow.cc:274 msgid "Using tesseract" msgstr "Utilizzando tesseract" #: ../gtk/src/MainWindow.cc:191 ../qt/src/MainWindow.cc:181 msgid "Select an image to begin..." msgstr "Selezionare un'immagine per iniziare..." #: ../gtk/src/MainWindow.cc:306 ../qt/src/MainWindow.cc:262 msgid "Multiple sources" msgstr "Più fonti" #: ../gtk/src/MainWindow.cc:307 ../qt/src/MainWindow.cc:263 msgid "Ready" msgstr "Pronto" #: ../gtk/src/MainWindow.cc:446 ../qt/src/MainWindow.cc:390 msgid "New version" msgstr "Nuova versione" #: ../gtk/src/MainWindow.cc:446 ../qt/src/MainWindow.cc:390 msgid "gImageReader %1 is available" msgstr "gImageReader %1 è disponibile" #: ../gtk/src/MainWindow.cc:447 ../qt/src/MainWindow.cc:391 msgid "Download" msgstr "Scaricare" #: ../gtk/src/MainWindow.cc:448 ../qt/src/MainWindow.cc:392 msgid "Changelog" msgstr "Novità" #: ../gtk/src/MainWindow.cc:449 ../qt/src/MainWindow.cc:393 msgid "Don't notify again" msgstr "Non notificare nuovamente" #: ../gtk/src/MainWindow.cc:468 ../qt/src/MainWindow.cc:438 msgid "Don't show again" msgstr "Non mostrare nuovamente" #: ../gtk/src/MainWindow.cc:469 ../gtk/src/MainWindow.cc:482 #: ../qt/src/MainWindow.cc:439 msgid "Install" msgstr "Installare" #: ../gtk/src/MainWindow.cc:489 ../qt/src/MainWindow.cc:451 msgid "Spelling dictionary missing" msgstr "Dizionario ortografico mancante" #: ../gtk/src/MainWindow.cc:489 ../qt/src/MainWindow.cc:451 msgid "The spellcheck dictionary for %1 is not installed" msgstr "Il dizionario ortografico per %1 non è installato" #: ../gtk/src/MainWindow.cc:496 ../gtk/src/MainWindow.cc:528 #: ../qt/src/MainWindow.cc:458 msgid "Installing spelling dictionary for '%1'" msgstr "Installando il dizionario ortografico per '%1'" #: ../gtk/src/MainWindow.cc:517 ../gtk/src/MainWindow.cc:542 #: ../gtk/src/MainWindow.cc:550 ../gtk/src/MainWindow.cc:560 #: ../gtk/src/MainWindow.cc:566 ../gtk/src/MainWindow.cc:595 #: ../gtk/src/OutputEditorHOCR.cc:1375 ../gtk/src/Recognizer.cc:163 #: ../gtk/src/TessdataManager.cc:58 ../gtk/src/TessdataManager.cc:68 #: ../gtk/src/TessdataManager.cc:290 ../qt/src/MainWindow.cc:477 #: ../qt/src/MainWindow.cc:490 ../qt/src/MainWindow.cc:500 #: ../qt/src/MainWindow.cc:510 ../qt/src/MainWindow.cc:518 #: ../qt/src/MainWindow.cc:546 ../qt/src/OutputEditorHOCR.cc:1157 #: ../qt/src/Recognizer.cc:138 ../qt/src/TessdataManager.cc:72 #: ../qt/src/TessdataManager.cc:82 ../qt/src/TessdataManager.cc:275 msgid "Error" msgstr "Errore" #: ../gtk/src/MainWindow.cc:517 ../qt/src/MainWindow.cc:477 msgid "Failed to install spelling dictionary: %1" msgstr "Installazione del dizionario ortografico fallita: %1" #: ../gtk/src/MainWindow.cc:542 ../qt/src/MainWindow.cc:490 msgid "Failed to create directory for spelling dictionaries." msgstr "Creazione cartella per dizionari ortografici fallita." #: ../gtk/src/MainWindow.cc:550 ../gtk/src/MainWindow.cc:566 #: ../qt/src/MainWindow.cc:500 msgid "Could not read %1: %2." msgstr "Impossibile leggere %1: %2." #: ../gtk/src/MainWindow.cc:560 ../gtk/src/MainWindow.cc:595 #: ../qt/src/MainWindow.cc:510 ../qt/src/MainWindow.cc:546 msgid "No spelling dictionaries found for '%1'." msgstr "Nessun dizionario ortografico trovato per '%1'." #: ../gtk/src/MainWindow.cc:576 ../qt/src/MainWindow.cc:529 msgid "Downloading '%1'..." msgstr "Scaricando '%1'..." #: ../gtk/src/MainWindow.cc:592 ../qt/src/MainWindow.cc:543 msgid "Dictionaries installed" msgstr "Dizionari ortografici installati" #: ../gtk/src/MainWindow.cc:592 msgid "The following dictionaries were installed:%1" msgstr "I seguenti dizionari ortografici sono stati installati:%1" #: ../gtk/src/OutputEditorHOCR.cc:319 ../qt/src/OutputEditorHOCR.cc:291 msgid "Document" msgstr "Documento" #: ../gtk/src/OutputEditorHOCR.cc:368 ../qt/src/OutputEditorHOCR.cc:279 msgid "Monochrome" msgstr "Monocromatico" #: ../gtk/src/OutputEditorHOCR.cc:377 ../qt/src/OutputEditorHOCR.cc:281 msgid "Threshold (closest color)" msgstr "Threshold (colore più vicino)" #: ../gtk/src/OutputEditorHOCR.cc:380 ../qt/src/OutputEditorHOCR.cc:282 msgid "Diffuse" msgstr "Diffusione" #: ../gtk/src/OutputEditorHOCR.cc:389 ../qt/src/OutputEditorHOCR.cc:283 msgid "Zip (lossless)" msgstr "Zip (lossless)" #: ../gtk/src/OutputEditorHOCR.cc:393 ../qt/src/OutputEditorHOCR.cc:284 msgid "CCITT Group 4 (lossless)" msgstr "CCITT Group 4 (lossless)" #: ../gtk/src/OutputEditorHOCR.cc:397 ../qt/src/OutputEditorHOCR.cc:285 msgid "Jpeg (lossy)" msgstr "Jpeg (lossy)" #: ../gtk/src/OutputEditorHOCR.cc:553 ../qt/src/OutputEditorHOCR.cc:429 msgid "" "The following pages could not be processed:\n" "%1" msgstr "" "Non è stato possibile processare le seguenti pagine:\n" "%1" #: ../gtk/src/OutputEditorHOCR.cc:554 ../qt/src/OutputEditorHOCR.cc:430 msgid "Recognition errors" msgstr "Errori di ricognizione" #. Add tree item #: ../gtk/src/OutputEditorHOCR.cc:647 ../gtk/src/OutputEditorHOCR.cc:1037 #: ../qt/src/OutputEditorHOCR.cc:504 ../qt/src/OutputEditorHOCR.cc:894 msgid "Graphic" msgstr "Grafica" #: ../gtk/src/OutputEditorHOCR.cc:703 ../qt/src/OutputEditorHOCR.cc:563 msgid "Paragraph" msgstr "Paragrafo" #: ../gtk/src/OutputEditorHOCR.cc:706 ../qt/src/OutputEditorHOCR.cc:566 msgid "Textline" msgstr "Riga" #: ../gtk/src/OutputEditorHOCR.cc:1136 ../qt/src/OutputEditorHOCR.cc:950 msgid "Merge" msgstr "Unire" #: ../gtk/src/OutputEditorHOCR.cc:1161 ../qt/src/OutputEditorHOCR.cc:977 msgid "Add graphic region" msgstr "Aggiungere regione grafica" #: ../gtk/src/OutputEditorHOCR.cc:1177 ../qt/src/OutputEditorHOCR.cc:985 msgid "No suggestions" msgstr "Nessun suggerimento" #: ../gtk/src/OutputEditorHOCR.cc:1183 ../qt/src/OutputEditorHOCR.cc:989 msgid "Add to dictionary" msgstr "Aggiungere al dizionario" #: ../gtk/src/OutputEditorHOCR.cc:1189 ../qt/src/OutputEditorHOCR.cc:990 msgid "Ignore word" msgstr "Ignorare parola" #: ../gtk/src/OutputEditorHOCR.cc:1222 ../qt/src/OutputEditorHOCR.cc:1007 msgid "Expand all" msgstr "Espandi" #: ../gtk/src/OutputEditorHOCR.cc:1225 ../qt/src/OutputEditorHOCR.cc:1008 msgid "Collapse all" msgstr "Contrai" #: ../gtk/src/OutputEditorHOCR.cc:1248 ../gtk/src/OutputEditorHOCR.cc:1287 #: ../qt/src/OutputEditorHOCR.cc:1049 ../qt/src/OutputEditorHOCR.cc:1079 msgid "hOCR HTML Files" msgstr "File HTML hOCR" #: ../gtk/src/OutputEditorHOCR.cc:1249 ../qt/src/OutputEditorHOCR.cc:1049 msgid "Open hOCR File" msgstr "Aprire file hOCR" #: ../gtk/src/OutputEditorHOCR.cc:1258 ../qt/src/OutputEditorHOCR.cc:1055 msgid "Failed to open file" msgstr "Impossibile aprire il file" #: ../gtk/src/OutputEditorHOCR.cc:1258 ../qt/src/OutputEditorHOCR.cc:1055 msgid "The file could not be opened: %1." msgstr "Non è stato possibile aprire il file: %1" #: ../gtk/src/OutputEditorHOCR.cc:1267 ../qt/src/OutputEditorHOCR.cc:1062 msgid "Invalid hOCR file" msgstr "File hOCR invalido" #: ../gtk/src/OutputEditorHOCR.cc:1267 ../qt/src/OutputEditorHOCR.cc:1062 msgid "The file does not appear to contain valid hOCR HTML: %1" msgstr "Il file non sembra contenere del HTML hOCR valido: %1" #: ../gtk/src/OutputEditorHOCR.cc:1283 ../gtk/src/OutputEditorHOCR.cc:1343 #: ../gtk/src/OutputEditorText.cc:306 ../qt/src/OutputEditorHOCR.cc:1077 #: ../qt/src/OutputEditorHOCR.cc:1131 ../qt/src/OutputEditorText.cc:246 msgid "output" msgstr "output" #: ../gtk/src/OutputEditorHOCR.cc:1288 ../qt/src/OutputEditorHOCR.cc:1079 msgid "Save hOCR Output..." msgstr "Salvare output hOCR..." #: ../gtk/src/OutputEditorHOCR.cc:1296 ../gtk/src/OutputEditorHOCR.cc:1357 #: ../gtk/src/OutputEditorText.cc:319 ../qt/src/OutputEditorHOCR.cc:1087 #: ../qt/src/OutputEditorHOCR.cc:1143 ../qt/src/OutputEditorText.cc:256 msgid "Failed to save output" msgstr "Impossibile salvare output" #: ../gtk/src/OutputEditorHOCR.cc:1296 ../gtk/src/OutputEditorHOCR.cc:1357 #: ../gtk/src/OutputEditorText.cc:319 ../qt/src/OutputEditorHOCR.cc:1087 #: ../qt/src/OutputEditorHOCR.cc:1143 ../qt/src/OutputEditorText.cc:256 msgid "Check that you have writing permissions in the selected folder." msgstr "" "Verificare che l'utente abbia permessi di scrittura nella cartella " "selezionata." #: ../gtk/src/OutputEditorHOCR.cc:1346 ../qt/src/OutputEditorHOCR.cc:1133 msgid "PDF Files" msgstr "File PDF" #: ../gtk/src/OutputEditorHOCR.cc:1347 ../qt/src/OutputEditorHOCR.cc:1133 msgid "Save PDF Output..." msgstr "Salvare output PDF..." #: ../gtk/src/OutputEditorHOCR.cc:1375 ../qt/src/OutputEditorHOCR.cc:1157 msgid "The PDF library does not support the selected font." msgstr "La libreria PDF non supporta il carattere selezionato." #: ../gtk/src/OutputEditorHOCR.cc:1435 ../qt/src/OutputEditorHOCR.cc:1216 msgid "Errors occurred" msgstr "Errori" #: ../gtk/src/OutputEditorHOCR.cc:1435 ../qt/src/OutputEditorHOCR.cc:1216 msgid "" "The following pages could not be rendered:\n" "%1" msgstr "" "Non è stato possibile renderizzare le seguenti pagine:\n" "%1" #: ../gtk/src/OutputEditorHOCR.cc:1562 ../gtk/src/OutputEditorText.cc:333 #: ../qt/src/OutputEditorHOCR.cc:1331 ../qt/src/OutputEditorText.cc:269 msgid "Output not saved" msgstr "Output non salvato" #: ../gtk/src/OutputEditorHOCR.cc:1562 ../gtk/src/OutputEditorText.cc:333 #: ../qt/src/OutputEditorHOCR.cc:1331 ../qt/src/OutputEditorText.cc:269 msgid "Save output before proceeding?" msgstr "Salvare output prima di continuare?" #: ../gtk/src/OutputEditorText.cc:197 ../qt/src/OutputEditorText.cc:158 msgid "Stripping line breaks..." msgstr "Rimuovendo interruzioni di riga..." #: ../gtk/src/OutputEditorText.cc:211 msgid "Check spelling" msgstr "Controllo ortografico" #: ../gtk/src/OutputEditorText.cc:238 ../qt/src/OutputEditorText.cc:178 msgid "Replacing..." msgstr "Sostituendo..." #: ../gtk/src/OutputEditorText.cc:264 ../qt/src/OutputEditorText.cc:204 msgid "File: %1" msgstr "File: %1" #: ../gtk/src/OutputEditorText.cc:267 ../qt/src/OutputEditorText.cc:207 msgid "Page: %1" msgstr "Pagina: %1" #: ../gtk/src/OutputEditorText.cc:280 ../gtk/src/Recognizer.cc:481 #: ../qt/src/Recognizer.cc:460 msgid "" "\n" "[Failed to recognize page %1]\n" msgstr "" "\n" "[Ricognizione della pagina %1 fallita]\n" #: ../gtk/src/OutputEditorText.cc:310 ../qt/src/OutputEditorText.cc:248 msgid "Text Files" msgstr "File di testo" #: ../gtk/src/OutputEditorText.cc:311 ../qt/src/OutputEditorText.cc:248 msgid "Save Output..." msgstr "Salvare output..." #: ../gtk/src/Recognizer.cc:156 ../qt/src/Recognizer.cc:131 msgid "" "Tesseract crashed with the following message:\n" "\n" "%1\n" "\n" "This typically happens for one of the following reasons:\n" "- Outdated traineddata files are used.\n" "- Auxiliary language data files are missing.\n" "- Corrupt language data files.\n" "\n" "Make sure your language data files are valid and compatible with tesseract " "%2." msgstr "" "Tesseract si è arrestato con il seguente messaggio:\n" "\n" "%1\n" "\n" "Questo tipicamente occorre per uno dei seguenti motivi:\n" "- I definizioni di lingua traineddata sono incompatibili.\n" "- File definizioni di lingua ausiliari mancanti.\n" "- File definizioni di lingua corrotti.\n" "\n" "Accertarsi che i file delle definizioni di lingua siano validi e compatibili " "con tesseract %2." #: ../gtk/src/Recognizer.cc:212 ../qt/src/Recognizer.cc:191 msgid "No languages available" msgstr "Nessuna lingua disponibile" #: ../gtk/src/Recognizer.cc:212 ../qt/src/Recognizer.cc:191 msgid "" "No tesseract languages are available for use. Recognition will not work." msgstr "" "Nessuna lingua tesseract è disponibile. Ricognizione OCR non sarà " "disponibile." #: ../gtk/src/Recognizer.cc:266 ../qt/src/Recognizer.cc:251 msgid "Multilingual" msgstr "Più lingue" #: ../gtk/src/Recognizer.cc:318 ../qt/src/Recognizer.cc:295 msgid "Automatic page segmentation" msgstr "Segmentazione automatica della pagina" #: ../gtk/src/Recognizer.cc:319 ../qt/src/Recognizer.cc:296 msgid "Page segmentation with orientation and script detection" msgstr "Segmentazione della pagina con rilevamento di script e orientamento" #: ../gtk/src/Recognizer.cc:320 ../qt/src/Recognizer.cc:297 msgid "Assume single column of text" msgstr "Assumere singola colonna di testo" #: ../gtk/src/Recognizer.cc:321 ../qt/src/Recognizer.cc:298 msgid "Assume single block of vertically aligned text" msgstr "Assumere singolo blocco di testo allineato verticalmente" #: ../gtk/src/Recognizer.cc:322 ../qt/src/Recognizer.cc:299 msgid "Assume a single uniform block of text" msgstr "Assumere singolo blocco uniforme di testo" #: ../gtk/src/Recognizer.cc:323 ../qt/src/Recognizer.cc:300 msgid "Assume a line of text" msgstr "Assumere una singola linea di testo" #: ../gtk/src/Recognizer.cc:324 ../qt/src/Recognizer.cc:301 msgid "Assume a single word" msgstr "Assumere una singola parola" #: ../gtk/src/Recognizer.cc:325 ../qt/src/Recognizer.cc:302 msgid "Assume a single word in a circle" msgstr "Assumere una singola parola in un cerchio" #: ../gtk/src/Recognizer.cc:326 ../qt/src/Recognizer.cc:303 msgid "Sparse text in no particular order" msgstr "Assumere testo sparso senza ordine particolare" #: ../gtk/src/Recognizer.cc:327 ../qt/src/Recognizer.cc:304 msgid "Sparse text with orientation and script detection" msgstr "Assumere testo sparso con rilevamento di script e di orientamento" #: ../gtk/src/Recognizer.cc:341 ../qt/src/Recognizer.cc:314 msgid "Page segmentation mode" msgstr "Modalità di segmentazione della pagina" #: ../gtk/src/Recognizer.cc:347 ../qt/src/Recognizer.cc:321 msgid "Manage languages..." msgstr "Gestione lingue..." #: ../gtk/src/Recognizer.cc:403 ../qt/src/Recognizer.cc:381 msgid "Current selection" msgstr "Selezione corrente" #: ../gtk/src/Recognizer.cc:475 ../qt/src/Recognizer.cc:454 msgid "Recognizing page %1 (%2 of %3)" msgstr "Ricognizione della pagina %1 (%2 di %3)" #: ../gtk/src/Recognizer.cc:480 ../qt/src/Recognizer.cc:459 msgid "" "\n" "- Page %1: failed to render page" msgstr "" "\n" "- Pagina %1: impossibile renderizzare pagina" #: ../gtk/src/Recognizer.cc:510 ../gtk/src/Recognizer.cc:539 #: ../gtk/src/Recognizer.cc:552 ../qt/src/Recognizer.cc:488 #: ../qt/src/Recognizer.cc:517 ../qt/src/Recognizer.cc:530 msgid "Recognizing..." msgstr "Eseguendo ricognizione..." #: ../gtk/src/Recognizer.cc:514 ../gtk/src/Recognizer.cc:522 #: ../qt/src/Recognizer.cc:492 ../qt/src/Recognizer.cc:500 msgid "Recognition errors occurred" msgstr "Vi sono stati errori di ricognizione" #: ../gtk/src/Recognizer.cc:514 ../qt/src/Recognizer.cc:492 msgid "The following errors occurred:%1" msgstr "I seguenti errori sono occorsi:%1" #: ../gtk/src/Recognizer.cc:522 ../qt/src/Recognizer.cc:500 msgid "Failed to initialize tesseract" msgstr "Inizializzazione di tesseract fallita" #: ../gtk/src/scanner/ScannerSane.cc:83 ../gtk/src/scanner/ScannerTwain.cc:287 #: ../qt/src/scanner/ScannerSane.cc:85 ../qt/src/scanner/ScannerTwain.cc:285 msgid "Scan canceled" msgstr "Scansione interrotta" #: ../gtk/src/scanner/ScannerSane.cc:157 ../gtk/src/scanner/ScannerTwain.cc:186 #: ../qt/src/scanner/ScannerSane.cc:158 ../qt/src/scanner/ScannerTwain.cc:178 msgid "No scanner specified" msgstr "Nessun scanner specificato" #: ../gtk/src/scanner/ScannerSane.cc:166 ../gtk/src/scanner/ScannerTwain.cc:195 #: ../qt/src/scanner/ScannerSane.cc:167 ../qt/src/scanner/ScannerTwain.cc:187 msgid "Unable to connect to scanner" msgstr "Impossibile connettersi allo scanner" #: ../gtk/src/scanner/ScannerSane.cc:386 ../gtk/src/scanner/ScannerTwain.cc:265 #: ../gtk/src/scanner/ScannerTwain.cc:291 ../qt/src/scanner/ScannerSane.cc:387 #: ../qt/src/scanner/ScannerTwain.cc:257 ../qt/src/scanner/ScannerTwain.cc:289 msgid "Unable to start scan" msgstr "Impossibile avviare la scansione" #: ../gtk/src/scanner/ScannerSane.cc:394 ../gtk/src/scanner/ScannerSane.cc:437 #: ../gtk/src/scanner/ScannerTwain.cc:317 ../qt/src/scanner/ScannerSane.cc:395 #: ../qt/src/scanner/ScannerSane.cc:438 ../qt/src/scanner/ScannerTwain.cc:315 msgid "Error communicating with scanner" msgstr "Errore durante la comunicazione con lo scanner" #: ../gtk/src/scanner/ScannerSane.cc:498 ../qt/src/scanner/ScannerSane.cc:494 msgid "Failed to save image" msgstr "Impossibile salvare l'immagine" #: ../gtk/src/SourceManager.cc:118 ../qt/src/SourceManager.cc:112 msgid "Unable to open files" msgstr "Impossibile aprire file" #: ../gtk/src/SourceManager.cc:118 ../qt/src/SourceManager.cc:112 msgid "The following files could not be opened:%1" msgstr "Non è stato possibile aprire i seguenti file:%1" #: ../gtk/src/SourceManager.cc:134 ../qt/src/SourceManager.cc:154 msgid "Images and PDFs" msgstr "Immagini e PDF" #: ../gtk/src/SourceManager.cc:137 ../qt/src/SourceManager.cc:155 msgid "Select Files" msgstr "Seleziona file" #: ../gtk/src/SourceManager.cc:143 ../qt/src/SourceManager.cc:166 msgid "Clipboard Error" msgstr "Errore appunti" #: ../gtk/src/SourceManager.cc:143 ../qt/src/SourceManager.cc:166 msgid "Failed to read the clipboard." msgstr "Impossibile leggere dagli appunti." #: ../gtk/src/SourceManager.cc:147 ../qt/src/SourceManager.cc:170 #: ../qt/src/SourceManager.cc:176 msgid "Pasted %1" msgstr "Appunti %1" #: ../gtk/src/SourceManager.cc:159 ../qt/src/SourceManager.cc:183 msgid "Screenshot Error" msgstr "Errore screenshot" #: ../gtk/src/SourceManager.cc:159 ../qt/src/SourceManager.cc:183 msgid "Failed to take screenshot." msgstr "Impossibile catturare screenshot." #: ../gtk/src/SourceManager.cc:163 ../qt/src/SourceManager.cc:187 msgid "Screenshot %1" msgstr "Screenshot %1" #: ../gtk/src/SourceManager.cc:168 ../qt/src/SourceManager.cc:192 msgid "Saving image..." msgstr "Salvando immagine..." #: ../gtk/src/SourceManager.cc:175 ../qt/src/SourceManager.cc:205 msgid "Cannot Write File" msgstr "Impossibile scrivere file" #: ../gtk/src/SourceManager.cc:175 ../qt/src/SourceManager.cc:205 msgid "Could not write to %1." msgstr "Impossibile scrivere il file %1." #: ../gtk/src/SourceManager.cc:202 ../qt/src/SourceManager.cc:227 msgid "Delete File?" msgstr "Eliminare il file?" #: ../gtk/src/SourceManager.cc:202 ../qt/src/SourceManager.cc:227 msgid "The following files will be deleted:%1" msgstr "Il seguenti file saranno eliminati:%1" #: ../gtk/src/SourceManager.cc:266 ../qt/src/SourceManager.cc:278 msgid "Missing File" msgstr "File mancante" #: ../gtk/src/SourceManager.cc:266 ../qt/src/SourceManager.cc:278 msgid "" "The following file has been deleted or moved:\n" "%1" msgstr "" "Il seguente file è stato eliminato o spostato:\n" "%1" #: ../gtk/src/SubstitutionsManager.cc:39 ../qt/src/SubstitutionsManager.cc:77 msgid "Search for" msgstr "Cerca" #: ../gtk/src/SubstitutionsManager.cc:40 ../qt/src/SubstitutionsManager.cc:77 msgid "Replace with" msgstr "Sostituisci con" #: ../gtk/src/SubstitutionsManager.cc:62 ../qt/src/SubstitutionsManager.cc:99 msgid "substitution_list.txt" msgstr "lista_sostituzioni.txt" #: ../gtk/src/SubstitutionsManager.cc:84 ../gtk/src/SubstitutionsManager.cc:119 #: ../qt/src/SubstitutionsManager.cc:114 ../qt/src/SubstitutionsManager.cc:152 msgid "Substitutions List" msgstr "Lista sostituzioni" #: ../gtk/src/SubstitutionsManager.cc:85 ../qt/src/SubstitutionsManager.cc:114 msgid "Open Substitutions List" msgstr "Aprire lista sostituzioni" #: ../gtk/src/SubstitutionsManager.cc:90 ../qt/src/SubstitutionsManager.cc:119 msgid "Error Reading File" msgstr "Errore durante la lettura del file" #: ../gtk/src/SubstitutionsManager.cc:90 ../qt/src/SubstitutionsManager.cc:119 msgid "Unable to read '%1'." msgstr "Impossibile leggere '%1'." #: ../gtk/src/SubstitutionsManager.cc:113 ../qt/src/SubstitutionsManager.cc:146 msgid "Errors Occurred Reading File" msgstr "Errori durante la lettura del file" #: ../gtk/src/SubstitutionsManager.cc:113 ../qt/src/SubstitutionsManager.cc:146 msgid "Some entries of the substitutions list could not be read." msgstr "Non è stato possibile leggere alcune voci della lista sostituzioni." #: ../gtk/src/SubstitutionsManager.cc:120 ../qt/src/SubstitutionsManager.cc:152 msgid "Save Substitutions List" msgstr "Salva lista sostituzioni" #: ../gtk/src/SubstitutionsManager.cc:126 ../qt/src/SubstitutionsManager.cc:158 msgid "Error Saving File" msgstr "Errore durante il salvataggio del file" #: ../gtk/src/SubstitutionsManager.cc:126 ../qt/src/SubstitutionsManager.cc:158 msgid "Unable to write to '%1'." msgstr "Impossibile scrivere '%1'." #: ../gtk/src/SubstitutionsManager.cc:144 ../qt/src/SubstitutionsManager.cc:172 msgid "Save List?" msgstr "Salvare la lista?" #: ../gtk/src/SubstitutionsManager.cc:144 ../qt/src/SubstitutionsManager.cc:172 msgid "Do you want to save the current list?" msgstr "Salvare la lista attuale?" #: ../gtk/src/SubstitutionsManager.cc:179 ../qt/src/SubstitutionsManager.cc:208 msgid "Applying substitutions..." msgstr "Applicando sostituzioni..." #: ../gtk/src/TessdataManager.cc:58 ../qt/src/TessdataManager.cc:72 msgid "" "PackageKit is required for managing system-wide tesseract language packs, " "but it was not found. Please use the system package management software to " "manage the tesseract language packs, or switch to use the user tessdata path " "in the configuration dialog." msgstr "" "PackageKit, il quale è necessario per gestire le lingue tesseract, non è " "stato rilevato. Utilizzare la gestione pacchetti del sistema per gestire le " "lingue tesseract, oppure scegliere di utilizzare i percorsi utente nel " "dialogo di configurazione del programma." #: ../gtk/src/TessdataManager.cc:63 ../qt/src/TessdataManager.cc:77 msgid "Fetching available languages" msgstr "Caricando la lista delle lingue disponibili" #: ../gtk/src/TessdataManager.cc:68 ../gtk/src/TessdataManager.cc:89 #: ../gtk/src/TessdataManager.cc:121 ../qt/src/TessdataManager.cc:82 #: ../qt/src/TessdataManager.cc:94 ../qt/src/TessdataManager.cc:127 msgid "Failed to fetch list of available languages: %1" msgstr "Impossibile caricare la lista delle lingue disponibili: %1" #: ../gtk/src/TessdataManager.cc:100 ../gtk/src/TessdataManager.cc:129 #: ../qt/src/TessdataManager.cc:105 ../qt/src/TessdataManager.cc:114 #: ../qt/src/TessdataManager.cc:136 ../qt/src/TessdataManager.cc:147 msgid "Parsing error: %1" msgstr "Errore di parsing: %1" #: ../gtk/src/TessdataManager.cc:191 ../qt/src/TessdataManager.cc:191 msgid "Applying changes..." msgstr "Applicando i cambiamenti..." #: ../gtk/src/TessdataManager.cc:252 ../qt/src/TessdataManager.cc:237 msgid "Failed to create directory for tessdata files." msgstr "Impossibile creare la cartella per i file tessdata." #: ../gtk/src/TessdataManager.cc:261 ../qt/src/TessdataManager.cc:245 msgid "Downloading %1..." msgstr "Scaricando '%1'..." #: ../gtk/src/TessdataManager.cc:281 ../qt/src/TessdataManager.cc:267 msgid "" "The following files could not be downloaded or removed:\n" "%1\n" "\n" "Check the connectivity and directory permissions." msgstr "" "Non è stato possibile scaricare risp. rimuovere i seguenti file:\n" "%1\n" "\n" "Verificare la connettività e i permessi delle cartelle." #: ../gtk/src/Utils.cc:62 msgid "Yes" msgstr "Si" #: ../gtk/src/Utils.cc:65 msgid "No" msgstr "No" #: ../gtk/src/Utils.cc:74 msgid "Discard" msgstr "Scartare" #: ../qt/data/AboutDialog.ui.h:1 msgid "About gImageReader" msgstr "Info gImageReader" #: ../qt/data/AboutDialog.ui.h:3 msgid "" "

 

A graphical frontend to tesseract-ocr

Website

 

" msgstr "" "

 

Un'interfaccia grafica per tesseract-ocr

Website

 

" #: ../qt/data/AboutDialog.ui.h:4 msgid "Credits" msgstr "Riconoscimenti" #: ../qt/data/AboutDialog.ui.h:5 msgid "License" msgstr "Licenza" #: ../qt/data/ConfigDialog.ui.h:14 msgid "System encoding" msgstr "Codifica predefinita" #: ../qt/data/ConfigDialog.ui.h:15 msgid "UTF-8" msgstr "UTF-8" #: ../qt/data/ConfigDialog.ui.h:19 msgid "Text file encoding:" msgstr "Codifica dei file di testo:" #: ../qt/data/CrashHandler.ui.h:2 #, no-c-format msgid "" "

The application has " "crashed

Apologies for the inconvenience. To help improve the " "application, please consider reporting the issue to manisandro@gmail.com. Please try to describe what you were doing before the application " "crashed. Also, include the information below. Thank you.

" msgstr "" "

L'applicazione ha " "smesso di funzionare

Per aiutare a migliorare l'applicazione, " "per favore considerate di segnalare il problema a manisandro@gmail.com. Per favore provate a descrivere cosa si stava facendo prima che " "l'applicazione smettesse di funzionare. Includete anche l'informazione " "sottostante. Grazie.

" #: ../qt/data/MainWindow.ui.h:1 msgid "gImageReader" msgstr "gImageReader" #. Remove & from some labels which designer insists in adding #: ../qt/data/MainWindow.ui.h:17 ../qt/src/Ui_MainWindow.hh:49 msgid "Sources" msgstr "Fonti" #: ../qt/data/MainWindow.ui.h:18 msgid "Zoom In" msgstr "Ingrandire" #: ../qt/data/MainWindow.ui.h:20 msgid "Zoom Out" msgstr "Rimpicciolire" #: ../qt/data/MainWindow.ui.h:22 msgid "Normal Size" msgstr "Dimensioni normali" #: ../qt/data/MainWindow.ui.h:24 msgid "Best Fit" msgstr "Dimensioni ideali" #: ../qt/data/MainWindow.ui.h:26 msgid "Rotate Left" msgstr "Ruotare a sinistra" #: ../qt/data/MainWindow.ui.h:27 msgid "Rotate left" msgstr "Ruotare a sinistra" #: ../qt/data/MainWindow.ui.h:28 msgid "Rotate Right" msgstr "Ruotare a destra" #: ../qt/data/MainWindow.ui.h:29 msgid "Rotate right" msgstr "Ruotare a destra" #: ../qt/data/MainWindow.ui.h:30 msgid "Image Controls" msgstr "Controlli immagine" #: ../qt/data/MainWindow.ui.h:32 msgid "Autodetect Layout" msgstr "Rilevare impaginazione" #: ../qt/data/MainWindow.ui.h:34 msgid "Toggle Output Pane" msgstr "Mostra/nascondi riquadro output" #: ../qt/src/MainWindow.cc:518 msgid "Could not read %1: %2" msgstr "Impossibile leggere %1: %2" #: ../qt/src/MainWindow.cc:543 msgid "The following dictionary files were installed:%1" msgstr "I seguenti dizionari ortografici sono stati installati:%1" #: ../qt/src/Ui_MainWindow.hh:50 msgid "Output" msgstr "Output" #: ../qt/src/Ui_MainWindow.hh:133 msgid "OCR mode:" msgstr "Modalità OCR:" #: ../qt/src/Ui_MainWindow.hh:204 msgid "Remove Image" msgstr "Rimuovere immagine" #: ../qt/src/Ui_MainWindow.hh:207 msgid "Delete Image" msgstr "Eliminare immagine" #: ../qt/src/Ui_MainWindow.hh:210 msgid "Clear List" msgstr "Svuotare lista" #. Output toolbar #: ../qt/src/Ui_OutputEditorHOCR.hh:39 ../qt/src/Ui_OutputEditorHOCR.hh:40 msgid "Open hOCR file" msgstr "Aprire file hOCR" #: ../qt/src/Ui_OutputEditorHOCR.hh:41 ../qt/src/Ui_OutputEditorHOCR.hh:42 msgid "Save as hOCR text" msgstr "Salvare come testo hOCR" #: ../qt/src/Ui_OutputEditorText.hh:108 msgid "Strip Line Breaks" msgstr "Rimuovere interruzioni di riga" #: ../qt/src/Ui_OutputEditorText.hh:113 msgid "Find and Replace" msgstr "Cercare e sostituire" #: ../qt/src/Ui_OutputEditorText.hh:122 msgid "Save Output" msgstr "Salvare output" #: ../qt/src/Ui_OutputEditorText.hh:124 msgid "Clear Output" msgstr "Cancellare output" #~ msgid "" #~ "<html><head/><body><p><span style=" font-" #~ "weight:600;">The application has crashed</span></p>" #~ "<p>Apologies for the inconvenience. To help improve the " #~ "application, please consider reporting the issue to <a href="" #~ "mailto:manisandro@gmail.com?subject=gImageReader%20Crash">" #~ "manisandro@gmail.com</a>. Please try to describe what you were " #~ "doing before the application crashed. Also, include the information " #~ "below. Thank you.</p></body></html>" #~ msgstr "" #~ "Per aiutare a migliorare l'applicazione, per favore considerate di " #~ "segnalare il problema a manisandro@gmail.com. Per favore " #~ "provate a descrivere cosa si stava facendo prima che l'applicazione " #~ "smettesse di funzionare. Includete anche l'informazione sottostante. " #~ "Grazie." #~ msgid "" #~ "<small><b>Example:</b> 1-10, 13, 14-18</small>" #~ msgstr "Esempio: 1-10, 13, 14-18" #~ msgid "Detect script and orientation" #~ msgstr "Rilevare script e orientamento" #~ msgid "" #~ "PackageKit is required for managing tesseract language packs, but it was " #~ "not found. Please use the system package management software to manage " #~ "the tesseract language packs." #~ msgstr "" #~ "PackageKit, il quale è necessario per gestire le lingue tesseract, non è " #~ "stato rilevato. Utilizzare la gestione pacchetti del sistema per gestire " #~ "le lingue tesseract." #~ msgid "System-wide" #~ msgstr "Percorsi di sistema" #~ msgid "" #~ "\n" #~ "\tFailed to initialize tesseract" #~ msgstr "" #~ "\n" #~ "\tInizializzazione di tesseract fallita" #~ msgid "So&urces" #~ msgstr "Fonti" #~ msgid "&Output" #~ msgstr "Output" #~ msgid "To recognize specific areas, drag rectangles over them." #~ msgstr "" #~ "Per riconoscere aree specifiche, trascinare dei rettangoli sopra queste." #~ msgid "Rendering image..." #~ msgstr "Rendering immagine..." #~ msgid "en_US" #~ msgstr "it_IT" #, fuzzy #~ msgid "So&urces" #~ msgstr "Fonti" #, fuzzy #~ msgid "&Output" #~ msgstr "Output" #~ msgid "Configuration" #~ msgstr "Configurazione" #, fuzzy #~ msgid "Preceeded or succeeded by quote" #~ msgstr "Preceduto o seguito da virgolette" #~ msgid "Select sources" #~ msgstr "Selezionare fonti" #, fuzzy #~ msgid "Preceeded by dot" #~ msgstr "Preceduto da un punto" #~ msgid "Pasting clipboard..." #~ msgstr "Leggendo appunti..." #~ msgid "Taking screenshot..." #~ msgstr "Catturando screenshot..." #~ msgid "Autolayout" #~ msgstr "Rilevare impaginazione" #~ msgid "Options" #~ msgstr "Opzioni" #~ msgid "Manage list" #~ msgstr "Gestire lista" #~ msgid "Replacement list" #~ msgstr "Lista sostituzioni" #~ msgid "Select sources..." #~ msgstr "Selezionare fonti..." #~ msgid "replace_list.txt" #~ msgstr "lista_sostituzioni.txt" #~ msgid "Open replacement list" #~ msgstr "Aprire lista sostituzioni" #~ msgid "Save replacement list" #~ msgstr "Salvare lista delle sostituzioni" #~ msgid "Save the current list?" #~ msgstr "Salvare la lista attuale?" #~ msgid "Delete the file?" #~ msgstr "Eliminare il file?" #~ msgid "Insert page range:" #~ msgstr "Inserire l'intervallo delle pagine:" #~ msgid "All Pages" #~ msgstr "Tutte le pagine" #~ msgid "Generating backtrace..." #~ msgstr "Generando backtrace..." #~ msgid "A crash has been detected." #~ msgstr "Un errore è stato rilevato" #~ msgid "" #~ "The application cannot continue. Your work has been saved under %1.\n" #~ "\n" #~ "Please report this issue." #~ msgstr "" #~ "L'applicazione deve essere terminata. Il lavoro è stato salvato sotto " #~ "%1.\n" #~ "\n" #~ "Per favore segnalare questo problema." #~ msgid "" #~ "The application cannot continue. There was no unsaved work.\n" #~ "\n" #~ "Please report this issue." #~ msgstr "" #~ "L'applicazione deve essere terminata. Non vi è lavoro non salvato.\n" #~ "\n" #~ "Per favore segnalare questo problema." gImageReader-3.2.3/po/pl.po000066400000000000000000001442171312567024200154370ustar00rootroot00000000000000# Polish translations for gImageReader package # Copyright (C) 2016 THE GIMAGEREADER'S COPYRIGHT HOLDER # This file is distributed under the same license as the gImageReader package. # # # Piotr Brol , 2016. # Sandro Mani , 2016, 2017. msgid "" msgstr "" "Project-Id-Version: \n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2017-07-01 10:34+0200\n" "PO-Revision-Date: 2017-06-30 19:48+0100\n" "Last-Translator: Sandro Mani \n" "Language-Team: Polish \n" "Language: pl\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=3; plural=(n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 " "|| n%100>=20) ? 1 : 2);\n" "X-Generator: Lokalize 2.0\n" #: ../gtk/data/appmenu.ui.h:1 ../qt/src/Ui_MainWindow.hh:165 msgid "Redetect Languages" msgstr "Ponownie wykryj języki" #: ../gtk/data/appmenu.ui.h:2 ../gtk/data/gimagereader.ui.h:39 #: ../qt/data/ConfigDialog.ui.h:1 ../qt/src/Ui_MainWindow.hh:168 msgid "Preferences" msgstr "Ustawienia" #: ../gtk/data/appmenu.ui.h:3 ../gtk/data/gimagereader.ui.h:40 #: ../gtk/src/MainWindow.cc:484 ../qt/src/MainWindow.cc:445 #: ../qt/src/Ui_MainWindow.hh:173 msgid "Help" msgstr "Pomoc" #: ../gtk/data/appmenu.ui.h:4 ../qt/data/AboutDialog.ui.h:2 #: ../qt/src/Ui_MainWindow.hh:176 msgid "About" msgstr "O programie" #: ../gtk/data/appmenu.ui.h:5 msgid "Quit" msgstr "Zakończ" #: ../gtk/data/crashhandler.ui.h:1 ../qt/src/CrashHandler.cc:36 msgid "Regenerate backtrace" msgstr "Wygeneruj ślad błędu" #: ../gtk/data/crashhandler.ui.h:2 msgid "The application has crashed" msgstr "Program uległ awarii" #: ../gtk/data/crashhandler.ui.h:4 #, no-c-format msgid "" "Apologies for the inconvenience. To help improve the application, please " "consider reporting the issue to manisandro@gmail.com. Please try to " "describe what you were doing before the application crashed. Also, include " "the information below. Thank you." msgstr "" "Przepraszamy za usterki. Aby poprawić jakość aplikacji, zgłoś problem na " "adres manisandro@gmail.com. Opisz działania wykonywane przed awarią " "programu i dołącz poniższą informację. Dziękuję." #: ../gtk/data/editor_hocr.ui.h:1 ../qt/data/PdfExportDialog.ui.h:1 msgid "PDF Export" msgstr "Eksport PDF" #: ../gtk/data/editor_hocr.ui.h:2 ../gtk/data/gimagereader.ui.h:55 #: ../gtk/src/Acquirer.cc:42 ../gtk/src/FileDialogs.cc:150 #: ../gtk/src/Utils.cc:68 ../qt/data/ConfigDialog.ui.h:27 #: ../qt/data/MainWindow.ui.h:14 msgid "Cancel" msgstr "Anuluj" #: ../gtk/data/editor_hocr.ui.h:3 ../gtk/data/gimagereader.ui.h:41 #: ../gtk/src/FileDialogs.cc:151 ../gtk/src/Utils.cc:59 #: ../qt/data/ConfigDialog.ui.h:26 msgid "OK" msgstr "OK" #: ../gtk/data/editor_hocr.ui.h:4 ../qt/data/PdfExportDialog.ui.h:2 msgid "Output mode:" msgstr "Zapisz:" #: ../gtk/data/editor_hocr.ui.h:5 ../qt/data/PdfExportDialog.ui.h:3 msgid "PDF" msgstr "PDF" #: ../gtk/data/editor_hocr.ui.h:6 ../qt/data/PdfExportDialog.ui.h:4 msgid "PDF with invisible text overlay" msgstr "PDF z niewidoczną warstwą tekstową" #: ../gtk/data/editor_hocr.ui.h:7 ../qt/data/PdfExportDialog.ui.h:16 msgid "Format:" msgstr "Format:" #: ../gtk/data/editor_hocr.ui.h:8 ../qt/data/PdfExportDialog.ui.h:17 msgid "Compression:" msgstr "Kompresja:" #: ../gtk/data/editor_hocr.ui.h:9 ../qt/data/PdfExportDialog.ui.h:14 msgid "Compression quality:" msgstr "Jakość kompresji:" #: ../gtk/data/editor_hocr.ui.h:10 ../qt/data/PdfExportDialog.ui.h:15 msgid "DPI:" msgstr "DPI:" #: ../gtk/data/editor_hocr.ui.h:11 ../qt/data/PdfExportDialog.ui.h:18 msgid "Dithering algorithm:" msgstr "Algorytm ditheringu:" #: ../gtk/data/editor_hocr.ui.h:12 ../qt/data/PdfExportDialog.ui.h:13 msgid "Image settings:" msgstr "Ustawienia obrazu:" #: ../gtk/data/editor_hocr.ui.h:13 ../qt/data/PdfExportDialog.ui.h:11 msgid "Document font:" msgstr "Czcionka dokumentu:" #: ../gtk/data/editor_hocr.ui.h:14 ../qt/data/PdfExportDialog.ui.h:7 msgid "Uniformize line and word spacing" msgstr "Wyrównaj odstępy między wierszami i wyrazami" #: ../gtk/data/editor_hocr.ui.h:15 ../qt/data/PdfExportDialog.ui.h:10 msgid "Use detected font sizes" msgstr "Użyj wykrytych wielkości czcionek" #: ../gtk/data/editor_hocr.ui.h:16 ../qt/data/PdfExportDialog.ui.h:8 msgid "Preserve spaces wider than:" msgstr "Zachowaj odstępy szersze niż:" #: ../gtk/data/editor_hocr.ui.h:17 ../qt/data/PdfExportDialog.ui.h:12 msgid "characters" msgstr "znaki" #: ../gtk/data/editor_hocr.ui.h:18 ../qt/data/PdfExportDialog.ui.h:9 msgid "Scale:" msgstr "Skala:" #: ../gtk/data/editor_hocr.ui.h:19 ../qt/data/PdfExportDialog.ui.h:6 msgid "Text settings:" msgstr "Kodowanie znaków:" #: ../gtk/data/editor_hocr.ui.h:20 ../qt/data/PdfExportDialog.ui.h:5 msgid "Show preview" msgstr "Podgląd" #: ../gtk/data/editor_hocr.ui.h:21 ../gtk/data/editor_text.ui.h:26 #: ../qt/src/Ui_OutputEditorText.hh:123 msgid "Save output" msgstr "Zapisz wynik" #: ../gtk/data/editor_hocr.ui.h:22 ../qt/src/Ui_OutputEditorHOCR.hh:44 #: ../qt/src/Ui_OutputEditorHOCR.hh:45 msgid "Export to PDF" msgstr "Zapisz jako PDF" #: ../gtk/data/editor_hocr.ui.h:23 ../gtk/data/editor_text.ui.h:27 #: ../qt/src/Ui_OutputEditorHOCR.hh:47 ../qt/src/Ui_OutputEditorHOCR.hh:48 #: ../qt/src/Ui_OutputEditorText.hh:125 msgid "Clear output" msgstr "Wyczyść wynik" #: ../gtk/data/editor_hocr.ui.h:24 ../qt/src/Ui_OutputEditorHOCR.hh:75 msgid "Properties" msgstr "Właściwości" #: ../gtk/data/editor_hocr.ui.h:25 ../qt/src/Ui_OutputEditorHOCR.hh:79 msgid "Source" msgstr "Źródło" #. Output insert mode #: ../gtk/data/editor_text.ui.h:1 ../qt/src/Ui_OutputEditorText.hh:59 msgid "Append to current text" msgstr "Dołącz do bieżącego tekstu" #: ../gtk/data/editor_text.ui.h:2 ../qt/src/Ui_OutputEditorText.hh:60 msgid "Insert at cursor" msgstr "Wstaw w miejscu kursora" #: ../gtk/data/editor_text.ui.h:3 ../qt/src/Ui_OutputEditorText.hh:61 msgid "Replace current text" msgstr "Zastąp bieżący tekst" #: ../gtk/data/editor_text.ui.h:4 ../qt/src/SubstitutionsManager.cc:37 #: ../qt/src/Ui_OutputEditorText.hh:177 msgid "Substitutions" msgstr "Zamienniki" #: ../gtk/data/editor_text.ui.h:5 ../qt/src/SubstitutionsManager.cc:42 #: ../qt/src/SubstitutionsManager.cc:43 msgid "Open" msgstr "Otwórz" #: ../gtk/data/editor_text.ui.h:6 ../gtk/src/Utils.cc:71 #: ../qt/src/SubstitutionsManager.cc:45 ../qt/src/SubstitutionsManager.cc:46 msgid "Save" msgstr "Zapisz" #: ../gtk/data/editor_text.ui.h:7 ../qt/src/SubstitutionsManager.cc:48 #: ../qt/src/SubstitutionsManager.cc:49 msgid "Clear" msgstr "Wyczyść" #: ../gtk/data/editor_text.ui.h:8 ../qt/data/ConfigDialog.ui.h:16 #: ../qt/src/SubstitutionsManager.cc:51 ../qt/src/SubstitutionsManager.cc:52 msgid "Add" msgstr "Dodaj" #: ../gtk/data/editor_text.ui.h:9 ../gtk/src/OutputEditorHOCR.cc:1202 #: ../gtk/src/OutputEditorHOCR.cc:1213 ../qt/data/ConfigDialog.ui.h:17 #: ../qt/src/OutputEditorHOCR.cc:998 ../qt/src/OutputEditorHOCR.cc:1000 #: ../qt/src/SubstitutionsManager.cc:54 ../qt/src/SubstitutionsManager.cc:55 msgid "Remove" msgstr "Usuń" #: ../gtk/data/editor_text.ui.h:10 ../gtk/data/gimagereader.ui.h:73 msgid "Apply" msgstr "Zastosuj" #: ../gtk/data/editor_text.ui.h:11 ../gtk/data/gimagereader.ui.h:74 msgid "Close" msgstr "Zamknij" #. Output postprocessing #: ../gtk/data/editor_text.ui.h:12 ../qt/src/Ui_OutputEditorText.hh:69 msgid "Keep line break if..." msgstr "Podział wiersza jeśli..." #: ../gtk/data/editor_text.ui.h:13 ../qt/src/Ui_OutputEditorText.hh:71 msgid "Preceded by end mark (.?!)" msgstr "Kończy się znakiem (.?!)" #: ../gtk/data/editor_text.ui.h:14 ../qt/src/Ui_OutputEditorText.hh:73 msgid "Preceded or succeeded by quote" msgstr "Cudzysłów na początku/końcu" #: ../gtk/data/editor_text.ui.h:15 ../qt/src/Ui_OutputEditorText.hh:75 msgid "Other options" msgstr "Inne opcje" #: ../gtk/data/editor_text.ui.h:16 ../qt/src/Ui_OutputEditorText.hh:77 msgid "Join hyphenated words" msgstr "Połącz podzielone" #: ../gtk/data/editor_text.ui.h:17 ../qt/src/Ui_OutputEditorText.hh:79 msgid "Collapse whitespace" msgstr "Scal białe znaki" #: ../gtk/data/editor_text.ui.h:18 ../qt/src/Ui_OutputEditorText.hh:81 msgid "Preserve paragraphs" msgstr "Zachowaj akapity" #: ../gtk/data/editor_text.ui.h:19 ../qt/src/Ui_OutputEditorText.hh:83 msgid "Visual aids" msgstr "Pomocnicze" #: ../gtk/data/editor_text.ui.h:20 ../qt/src/Ui_OutputEditorText.hh:85 msgid "Draw whitespace" msgstr "Pokaż białe znaki" #: ../gtk/data/editor_text.ui.h:21 ../gtk/data/gimagereader.ui.h:31 #: ../qt/src/Ui_OutputEditorText.hh:102 msgid "Select insert mode" msgstr "Tryb wstawiania" #: ../gtk/data/editor_text.ui.h:22 ../qt/src/Ui_OutputEditorText.hh:109 msgid "Strip line breaks on selected text" msgstr "Usuń podziały wierszy w zaznaczonym tekście" #: ../gtk/data/editor_text.ui.h:23 ../qt/src/Ui_OutputEditorText.hh:114 msgid "Find and replace" msgstr "Znajdź i zamień" #: ../gtk/data/editor_text.ui.h:24 ../qt/src/Ui_OutputEditorText.hh:116 #: ../qt/src/Ui_OutputEditorText.hh:117 msgid "Undo" msgstr "Cofnij" #: ../gtk/data/editor_text.ui.h:25 ../qt/src/Ui_OutputEditorText.hh:119 #: ../qt/src/Ui_OutputEditorText.hh:120 msgid "Redo" msgstr "Ponów" #: ../gtk/data/editor_text.ui.h:28 ../qt/src/Ui_OutputEditorText.hh:149 msgid "Find" msgstr "Znajdź" #: ../gtk/data/editor_text.ui.h:29 ../qt/src/Ui_OutputEditorText.hh:153 #: ../qt/src/Ui_OutputEditorText.hh:168 msgid "Replace" msgstr "Zamień" #: ../gtk/data/editor_text.ui.h:30 ../qt/src/Ui_OutputEditorText.hh:173 msgid "Replace all" msgstr "Zamień wszystkie" #: ../gtk/data/editor_text.ui.h:31 ../qt/src/Ui_OutputEditorText.hh:163 msgid "Find previous" msgstr "Znajdź poprzedni" #: ../gtk/data/editor_text.ui.h:32 ../qt/src/Ui_OutputEditorText.hh:158 msgid "Find next" msgstr "Znajdź następny" #: ../gtk/data/editor_text.ui.h:33 ../qt/src/Ui_OutputEditorText.hh:182 msgid "Match case" msgstr "Rozróżniaj duże/małe litery" #: ../gtk/data/gimagereader.ui.h:1 ../qt/src/Ui_MainWindow.hh:65 msgid "Rotate current page" msgstr "Obróć bieżącą stronę" #: ../gtk/data/gimagereader.ui.h:2 ../qt/src/Ui_MainWindow.hh:66 msgid "Rotate all pages" msgstr "Obróć wszystkie strony" #: ../gtk/data/gimagereader.ui.h:3 ../qt/data/MainWindow.ui.h:35 msgid "Toggle output pane" msgstr "Pokaż/ukryj panel wyjściowy" #. Sources toolbar #: ../gtk/data/gimagereader.ui.h:4 ../qt/src/Ui_MainWindow.hh:187 msgid "Recent" msgstr "Ostatnie" #: ../gtk/data/gimagereader.ui.h:5 ../qt/src/Ui_MainWindow.hh:188 msgid "Paste" msgstr "Wklej" #: ../gtk/data/gimagereader.ui.h:6 ../qt/src/Ui_MainWindow.hh:189 msgid "Take Screenshot" msgstr "Zrzut ekranu" #: ../gtk/data/gimagereader.ui.h:7 ../qt/src/Ui_MainWindow.hh:200 msgid "Add images" msgstr "Dodaj obrazy" #: ../gtk/data/gimagereader.ui.h:8 ../qt/src/Ui_MainWindow.hh:199 msgid "Add Images" msgstr "Dodaj obrazy" #: ../gtk/data/gimagereader.ui.h:9 ../qt/src/Ui_MainWindow.hh:205 msgid "Remove image from list" msgstr "Usuń obraz z listy" #: ../gtk/data/gimagereader.ui.h:10 ../qt/src/Ui_MainWindow.hh:208 msgid "Delete image" msgstr "Skasuj obraz " #: ../gtk/data/gimagereader.ui.h:11 ../qt/src/Ui_MainWindow.hh:211 msgid "Clear list" msgstr "Wyczyść listę" #: ../gtk/data/gimagereader.ui.h:12 ../qt/data/MainWindow.ui.h:6 msgid "Files" msgstr "Pliki" #: ../gtk/data/gimagereader.ui.h:13 ../qt/data/MainWindow.ui.h:16 msgid "Device:" msgstr "Urządzenie:" #: ../gtk/data/gimagereader.ui.h:14 ../qt/data/MainWindow.ui.h:15 #: ../qt/src/TessdataManager.cc:57 msgid "Refresh" msgstr "Odśwież" #: ../gtk/data/gimagereader.ui.h:15 ../qt/data/MainWindow.ui.h:12 msgid "Output:" msgstr "Zapisz:" #: ../gtk/data/gimagereader.ui.h:16 ../qt/data/MainWindow.ui.h:9 msgid "Mode:" msgstr "Tryb:" #: ../gtk/data/gimagereader.ui.h:17 ../gtk/src/OutputEditorHOCR.cc:362 #: ../qt/data/MainWindow.ui.h:11 ../qt/src/OutputEditorHOCR.cc:273 msgid "Color" msgstr "Kolor" #: ../gtk/data/gimagereader.ui.h:18 ../gtk/src/OutputEditorHOCR.cc:365 #: ../qt/data/MainWindow.ui.h:10 ../qt/src/OutputEditorHOCR.cc:275 #: ../qt/src/OutputEditorHOCR.cc:277 msgid "Grayscale" msgstr "Odcienie szarości" #: ../gtk/data/gimagereader.ui.h:19 ../qt/data/MainWindow.ui.h:8 msgid "Resolution:" msgstr "Rozdzielczość:" #: ../gtk/data/gimagereader.ui.h:20 ../qt/data/MainWindow.ui.h:13 msgid "Scan" msgstr "Skanuj" #: ../gtk/data/gimagereader.ui.h:21 ../qt/data/MainWindow.ui.h:7 msgid "Acquire" msgstr "Skanowanie" #: ../gtk/data/gimagereader.ui.h:22 ../qt/data/MainWindow.ui.h:2 msgid "Brightness" msgstr "Jasność" #: ../gtk/data/gimagereader.ui.h:23 ../qt/data/MainWindow.ui.h:3 msgid "Contrast" msgstr "Kontrast" #: ../gtk/data/gimagereader.ui.h:24 ../qt/data/MainWindow.ui.h:4 msgid "Resolution" msgstr "Rozdzielczość" #: ../gtk/data/gimagereader.ui.h:25 ../qt/data/MainWindow.ui.h:5 msgid "Invert colors" msgstr "Negatyw" #: ../gtk/data/gimagereader.ui.h:26 ../qt/data/MainWindow.ui.h:19 msgid "Zoom in" msgstr "Powiększ" #: ../gtk/data/gimagereader.ui.h:27 ../qt/data/MainWindow.ui.h:21 msgid "Zoom out" msgstr "Pomniejsz" #: ../gtk/data/gimagereader.ui.h:28 ../qt/data/MainWindow.ui.h:23 msgid "Normal size" msgstr "Normalny rozmiar" #: ../gtk/data/gimagereader.ui.h:29 ../qt/data/MainWindow.ui.h:25 msgid "Best fit" msgstr "Dopasuj rozmiar" #: ../gtk/data/gimagereader.ui.h:30 ../qt/src/Ui_MainWindow.hh:74 msgid "Select rotation mode" msgstr "Wybierz tryb obrotu" #: ../gtk/data/gimagereader.ui.h:32 ../qt/data/MainWindow.ui.h:31 msgid "Image controls" msgstr "Dostosowanie obrazu" #: ../gtk/data/gimagereader.ui.h:33 ../qt/src/Ui_MainWindow.hh:137 msgid "Plain text" msgstr "Zwykły tekst" #: ../gtk/data/gimagereader.ui.h:34 ../qt/src/Ui_MainWindow.hh:137 msgid "hOCR, PDF" msgstr "hOCR, PDF" #: ../gtk/data/gimagereader.ui.h:35 ../qt/data/MainWindow.ui.h:33 msgid "Autodetect layout" msgstr "Automatycznie wykryj układ" #: ../gtk/data/gimagereader.ui.h:36 msgid "Recognize all" msgstr "Rozpoznaj wszystko" #: ../gtk/data/gimagereader.ui.h:37 msgid "Select language" msgstr "Wybierz język" #: ../gtk/data/gimagereader.ui.h:38 msgid "A graphical frontend to tesseract-ocr" msgstr "Interfejs graficzny dla tesseract-ocr" #: ../gtk/data/gimagereader.ui.h:42 msgid "Output pane orientation:" msgstr "Orientacja panelu wyjściowego:" #: ../gtk/data/gimagereader.ui.h:43 msgid "Horizontal" msgstr "Pozioma" #: ../gtk/data/gimagereader.ui.h:44 msgid "Vertical" msgstr "Pionowa" #: ../gtk/data/gimagereader.ui.h:45 ../qt/data/ConfigDialog.ui.h:18 msgid "Query to install missing spellcheck dictionaries" msgstr "Pobierz brakujące słowniki ortograficzne" #: ../gtk/data/gimagereader.ui.h:46 ../qt/data/ConfigDialog.ui.h:4 msgid "Automatically check for new program versions" msgstr "Automatycznie sprawdzaj nową wersję programu" #: ../gtk/data/gimagereader.ui.h:47 ../qt/data/ConfigDialog.ui.h:3 msgid "Predefined language definitions:" msgstr "Wbudowane definicje języków:" #: ../gtk/data/gimagereader.ui.h:48 ../qt/data/ConfigDialog.ui.h:12 msgid "Additional language definitions:" msgstr "Dodatkowe definicje języków:" #: ../gtk/data/gimagereader.ui.h:49 ../qt/data/ConfigDialog.ui.h:20 msgid "The prefix of the tesseract language data file" msgstr "Prefiks nazwy pliku językowego tesseract" #: ../gtk/data/gimagereader.ui.h:50 ../qt/data/ConfigDialog.ui.h:21 msgid "Prefix" msgstr "Prefiks" #: ../gtk/data/gimagereader.ui.h:51 ../qt/data/ConfigDialog.ui.h:22 msgid "The ISO 639-1 language code followed by the country code" msgstr "Kod języka wg ISO 639-1 i kod kraju" #: ../gtk/data/gimagereader.ui.h:52 ../qt/data/ConfigDialog.ui.h:23 msgid "ISO Code" msgstr "Kod ISO" #: ../gtk/data/gimagereader.ui.h:53 ../qt/data/ConfigDialog.ui.h:24 msgid "The name of the language" msgstr "Nazwa języka" #: ../gtk/data/gimagereader.ui.h:54 ../qt/data/ConfigDialog.ui.h:25 msgid "Name" msgstr "Nazwa" #: ../gtk/data/gimagereader.ui.h:56 ../qt/data/ConfigDialog.ui.h:5 msgid "Output pane font:" msgstr "Czcionka panelu wynikowego:" #: ../gtk/data/gimagereader.ui.h:57 ../qt/data/ConfigDialog.ui.h:2 msgid "Default" msgstr "Domyślne" #: ../gtk/data/gimagereader.ui.h:58 ../qt/data/ConfigDialog.ui.h:6 msgid "Language data locations:" msgstr "Lokalizacja danych języków:" #: ../gtk/data/gimagereader.ui.h:59 ../qt/data/ConfigDialog.ui.h:13 msgid "Language definitions path:" msgstr "Ścieżka definicji języków:" #: ../gtk/data/gimagereader.ui.h:60 ../qt/data/ConfigDialog.ui.h:28 msgid "Spelling dictionaries path:" msgstr "Ścieżka słowników:" #: ../gtk/data/gimagereader.ui.h:61 ../qt/data/ConfigDialog.ui.h:10 msgid "System-wide paths" msgstr "Ścieżki systemowe" #: ../gtk/data/gimagereader.ui.h:62 ../qt/data/ConfigDialog.ui.h:11 msgid "User paths" msgstr "Ścieżki użytkownika" #: ../gtk/data/gimagereader.ui.h:63 ../qt/data/PageRangeDialog.ui.h:1 msgid "Page Range" msgstr "Zakres stron" #: ../gtk/data/gimagereader.ui.h:64 ../qt/data/PageRangeDialog.ui.h:2 msgid "Page range:" msgstr "Zakres stron:" #: ../gtk/data/gimagereader.ui.h:65 ../qt/data/PageRangeDialog.ui.h:3 msgid "Example: 1-10, 13, 14-18" msgstr "Przykład: 1-10, 13, 14-18" #: ../gtk/data/gimagereader.ui.h:66 ../qt/data/PageRangeDialog.ui.h:4 msgid "Recognition area:" msgstr "Obszar rozpoznawania:" #: ../gtk/data/gimagereader.ui.h:67 ../gtk/src/Recognizer.cc:403 #: ../qt/data/PageRangeDialog.ui.h:5 ../qt/src/Recognizer.cc:381 msgid "Entire page" msgstr "Cała strona" #: ../gtk/data/gimagereader.ui.h:68 ../qt/data/PageRangeDialog.ui.h:6 msgid "Autodetect" msgstr "Automatycznie" #: ../gtk/data/gimagereader.ui.h:69 ../qt/data/PageRangeDialog.ui.h:7 #, fuzzy msgid "Prepend to output text:" msgstr "Dołącz do bieżącego tekstu" #: ../gtk/data/gimagereader.ui.h:70 ../qt/data/PageRangeDialog.ui.h:8 msgid "Source filename" msgstr "" #: ../gtk/data/gimagereader.ui.h:71 ../qt/data/PageRangeDialog.ui.h:9 #, fuzzy msgid "Source page" msgstr "Źródło" #: ../gtk/data/gimagereader.ui.h:72 ../qt/src/TessdataManager.cc:47 msgid "Tessdata Manager" msgstr "Menadżer Tessdata" #: ../gtk/data/gimagereader.ui.h:75 ../qt/src/TessdataManager.cc:49 msgid "Manage installed languages:" msgstr "Zarządzaj zainstalowanymi językami:" #: ../gtk/data/gimagereader.ui.h:76 ../qt/src/DisplayerToolSelect.cc:240 msgid "Delete" msgstr "Usuń" #: ../gtk/data/gimagereader.ui.h:77 ../qt/src/DisplayerToolSelect.cc:226 msgid "Order:" msgstr "Kolejność:" #: ../gtk/data/gimagereader.ui.h:78 ../gtk/src/DisplayerToolHOCR.cc:28 #: ../qt/src/DisplayerToolHOCR.cc:30 ../qt/src/DisplayerToolSelect.cc:241 msgid "Recognize" msgstr "Rozpoznaj" #: ../gtk/data/gimagereader.ui.h:79 ../qt/src/DisplayerToolSelect.cc:242 msgid "Recognize to clipboard" msgstr "Rozpoznaj do schowka" #: ../gtk/data/gimagereader.ui.h:80 ../qt/src/DisplayerToolSelect.cc:243 msgid "Save as image" msgstr "Zapisz jako obraz" #: ../gtk/data/gimagereader.ui.h:81 ../qt/src/Recognizer.cc:76 msgid "Current Page" msgstr "Bieżąca strona" #: ../gtk/data/gimagereader.ui.h:82 ../qt/src/Recognizer.cc:79 msgid "Multiple Pages..." msgstr "Wiele stron..." #: ../gtk/src/Acquirer.cc:83 ../qt/src/Acquirer.cc:63 msgid "scan.png" msgstr "scan.png" #: ../gtk/src/Acquirer.cc:96 ../qt/src/Acquirer.cc:80 msgid "Images" msgstr "Obrazy" #: ../gtk/src/Acquirer.cc:97 ../qt/src/Acquirer.cc:81 msgid "Choose Output Filename..." msgstr "Nazwa pliku wyjściowego..." #: ../gtk/src/Acquirer.cc:112 ../qt/src/Acquirer.cc:96 msgid "Failed to initialize the scanning backend." msgstr "Błąd inicjalizacji skanowania" #: ../gtk/src/Acquirer.cc:121 ../qt/src/Acquirer.cc:102 msgid "Scan failed" msgstr "Skanowanie nie powiodło się" #: ../gtk/src/Acquirer.cc:139 ../qt/src/Acquirer.cc:118 msgid "No scanners were detected." msgstr "Nie wykryto skanera" #: ../gtk/src/Acquirer.cc:156 ../gtk/src/Acquirer.cc:173 #: ../qt/src/Acquirer.cc:132 ../qt/src/Acquirer.cc:149 msgid "Starting scan..." msgstr "Rozpoczęcie skanowania..." #: ../gtk/src/Acquirer.cc:169 ../qt/src/Acquirer.cc:145 msgid "Opening device..." msgstr "Otwieranie urządzenia..." #: ../gtk/src/Acquirer.cc:171 ../qt/src/Acquirer.cc:147 msgid "Setting options..." msgstr "Ustawianie opcji..." #: ../gtk/src/Acquirer.cc:175 ../qt/src/Acquirer.cc:151 msgid "Getting parameters..." msgstr "Pobieranie parametrów..." #: ../gtk/src/Acquirer.cc:177 ../qt/src/Acquirer.cc:153 msgid "Transferring data..." msgstr "Przesyłanie danych..." #: ../gtk/src/Acquirer.cc:184 ../qt/src/Acquirer.cc:160 msgid "Canceling scan..." msgstr "Anulowanie skanowania..." #: ../gtk/src/Config.cc:297 ../qt/data/ConfigDialog.ui.h:7 msgid "Filename prefix" msgstr "Prefiks nazwy pliku" #: ../gtk/src/Config.cc:298 ../qt/data/ConfigDialog.ui.h:8 msgid "Code" msgstr "Kod" #: ../gtk/src/Config.cc:299 ../qt/data/ConfigDialog.ui.h:9 msgid "Native name" msgstr "Nazwa oryginalna" #: ../gtk/src/CrashHandler.cc:26 ../gtk/src/CrashHandler.cc:43 #: ../qt/src/CrashHandler.cc:34 msgid "Crash Handler" msgstr "Obsługa awarii" #: ../gtk/src/CrashHandler.cc:45 ../qt/src/CrashHandler.cc:29 msgid "Your work has been saved under %1." msgstr "Twój dokument został zapisany pod nazwą %1." #: ../gtk/src/CrashHandler.cc:47 ../qt/src/CrashHandler.cc:31 msgid "There was no unsaved work." msgstr "Nie było dokumentu do zapisania." #: ../gtk/src/CrashHandler.cc:106 ../qt/src/CrashHandler.cc:60 msgid "Failed to obtain backtrace. Is gdb installed?" msgstr "Nie udało się uzyskać logu błędu. Czy jest zainstalowany gdb?" #: ../gtk/src/Displayer.cc:261 ../qt/src/Displayer.cc:231 msgid "Failed to load image" msgstr "Błąd wczytywania obrazu" #: ../gtk/src/Displayer.cc:261 ../qt/src/Displayer.cc:231 msgid "" "The file might not be an image or be corrupt:\n" "%1" msgstr "" "Plik nie jest obrazem lub jest uszkodzony:\n" "%1" #: ../gtk/src/DisplayerToolSelect.cc:39 ../qt/src/DisplayerToolSelect.cc:40 msgid "selection.png" msgstr "zaznaczenie.png" #: ../gtk/src/DisplayerToolSelect.cc:148 ../qt/src/DisplayerToolSelect.cc:139 msgid "PNG Images" msgstr "Obrazy PNG" #: ../gtk/src/DisplayerToolSelect.cc:149 ../qt/src/DisplayerToolSelect.cc:139 msgid "Save Selection Image" msgstr "Zapisz zaznaczenie jako obraz" #: ../gtk/src/DisplayerToolSelect.cc:157 ../qt/src/DisplayerToolSelect.cc:147 msgid "Recognize all" msgstr "Rozpoznaj wszystko" #: ../gtk/src/DisplayerToolSelect.cc:157 ../qt/src/DisplayerToolSelect.cc:147 msgid "Recognize selection" msgstr "Rozpoznaj zaznaczenie" #: ../gtk/src/DisplayerToolSelect.cc:194 ../qt/src/DisplayerToolSelect.cc:184 msgid "Performing layout analysis" msgstr "Trwa analiza układu" #: ../gtk/src/FileDialogs.cc:237 msgid "" "A file named \"%1\" already exists. Are you sure you want to overwrite it?" msgstr "Plik \"%1\" już istnieje. Czy chcesz go zastąpić?" #: ../gtk/src/FileDialogs.cc:239 msgid "Overwrite File?" msgstr "Zastąpić plik?" #: ../gtk/src/MainWindow.cc:125 ../qt/src/MainWindow.cc:274 msgid "Using tesseract" msgstr "Użyty tesseract" #: ../gtk/src/MainWindow.cc:191 ../qt/src/MainWindow.cc:181 msgid "Select an image to begin..." msgstr "Wybierz pierwszy obraz..." #: ../gtk/src/MainWindow.cc:306 ../qt/src/MainWindow.cc:262 msgid "Multiple sources" msgstr "Wiele źródeł" #: ../gtk/src/MainWindow.cc:307 ../qt/src/MainWindow.cc:263 msgid "Ready" msgstr "Gotowy" #: ../gtk/src/MainWindow.cc:446 ../qt/src/MainWindow.cc:390 msgid "New version" msgstr "Nowa wersja" #: ../gtk/src/MainWindow.cc:446 ../qt/src/MainWindow.cc:390 msgid "gImageReader %1 is available" msgstr "gImageReader %1 jest dostępny" #: ../gtk/src/MainWindow.cc:447 ../qt/src/MainWindow.cc:391 msgid "Download" msgstr "Pobierz" #: ../gtk/src/MainWindow.cc:448 ../qt/src/MainWindow.cc:392 msgid "Changelog" msgstr "Lista zmian" #: ../gtk/src/MainWindow.cc:449 ../qt/src/MainWindow.cc:393 msgid "Don't notify again" msgstr "Nie powiadamiaj ponownie" #: ../gtk/src/MainWindow.cc:468 ../qt/src/MainWindow.cc:438 msgid "Don't show again" msgstr "Nie pokazuj ponownie" #: ../gtk/src/MainWindow.cc:469 ../gtk/src/MainWindow.cc:482 #: ../qt/src/MainWindow.cc:439 msgid "Install" msgstr "Zainstaluj" #: ../gtk/src/MainWindow.cc:489 ../qt/src/MainWindow.cc:451 msgid "Spelling dictionary missing" msgstr "Brak słownika" #: ../gtk/src/MainWindow.cc:489 ../qt/src/MainWindow.cc:451 msgid "The spellcheck dictionary for %1 is not installed" msgstr "Słownik dla %1 nie jest zainstalowany" #: ../gtk/src/MainWindow.cc:496 ../gtk/src/MainWindow.cc:528 #: ../qt/src/MainWindow.cc:458 msgid "Installing spelling dictionary for '%1'" msgstr "Instalacja słownika dla '%1'" #: ../gtk/src/MainWindow.cc:517 ../gtk/src/MainWindow.cc:542 #: ../gtk/src/MainWindow.cc:550 ../gtk/src/MainWindow.cc:560 #: ../gtk/src/MainWindow.cc:566 ../gtk/src/MainWindow.cc:595 #: ../gtk/src/OutputEditorHOCR.cc:1375 ../gtk/src/Recognizer.cc:163 #: ../gtk/src/TessdataManager.cc:58 ../gtk/src/TessdataManager.cc:68 #: ../gtk/src/TessdataManager.cc:290 ../qt/src/MainWindow.cc:477 #: ../qt/src/MainWindow.cc:490 ../qt/src/MainWindow.cc:500 #: ../qt/src/MainWindow.cc:510 ../qt/src/MainWindow.cc:518 #: ../qt/src/MainWindow.cc:546 ../qt/src/OutputEditorHOCR.cc:1157 #: ../qt/src/Recognizer.cc:138 ../qt/src/TessdataManager.cc:72 #: ../qt/src/TessdataManager.cc:82 ../qt/src/TessdataManager.cc:275 msgid "Error" msgstr "Błąd" #: ../gtk/src/MainWindow.cc:517 ../qt/src/MainWindow.cc:477 msgid "Failed to install spelling dictionary: %1" msgstr "Błąd instalacji słownika: %1" #: ../gtk/src/MainWindow.cc:542 ../qt/src/MainWindow.cc:490 msgid "Failed to create directory for spelling dictionaries." msgstr "Nie udało się utworzyć katalogu dla słowników ortograficznych." #: ../gtk/src/MainWindow.cc:550 ../gtk/src/MainWindow.cc:566 #: ../qt/src/MainWindow.cc:500 msgid "Could not read %1: %2." msgstr "Nie można odczytać%1: %2." #: ../gtk/src/MainWindow.cc:560 ../gtk/src/MainWindow.cc:595 #: ../qt/src/MainWindow.cc:510 ../qt/src/MainWindow.cc:546 msgid "No spelling dictionaries found for '%1'." msgstr "Nie znaleziono słowników dla '%1'." #: ../gtk/src/MainWindow.cc:576 ../qt/src/MainWindow.cc:529 msgid "Downloading '%1'..." msgstr "Pobieranie '%1'..." #: ../gtk/src/MainWindow.cc:592 ../qt/src/MainWindow.cc:543 msgid "Dictionaries installed" msgstr "Słowniki zainstalowane" #: ../gtk/src/MainWindow.cc:592 msgid "The following dictionaries were installed:%1" msgstr "Zostały zainstalowane słowniki:%1" #: ../gtk/src/OutputEditorHOCR.cc:319 ../qt/src/OutputEditorHOCR.cc:291 msgid "Document" msgstr "Dokument" #: ../gtk/src/OutputEditorHOCR.cc:368 ../qt/src/OutputEditorHOCR.cc:279 msgid "Monochrome" msgstr "Monochromatyczny" #: ../gtk/src/OutputEditorHOCR.cc:377 ../qt/src/OutputEditorHOCR.cc:281 msgid "Threshold (closest color)" msgstr "Threshold (najbliższy kolor" #: ../gtk/src/OutputEditorHOCR.cc:380 ../qt/src/OutputEditorHOCR.cc:282 msgid "Diffuse" msgstr "Diffuse" #: ../gtk/src/OutputEditorHOCR.cc:389 ../qt/src/OutputEditorHOCR.cc:283 msgid "Zip (lossless)" msgstr "Zip (bezstratny)" #: ../gtk/src/OutputEditorHOCR.cc:393 ../qt/src/OutputEditorHOCR.cc:284 msgid "CCITT Group 4 (lossless)" msgstr "CCITT Group 4 (bezstratny)" #: ../gtk/src/OutputEditorHOCR.cc:397 ../qt/src/OutputEditorHOCR.cc:285 msgid "Jpeg (lossy)" msgstr "JPEG (stratny)" #: ../gtk/src/OutputEditorHOCR.cc:553 ../qt/src/OutputEditorHOCR.cc:429 msgid "" "The following pages could not be processed:\n" "%1" msgstr "" "Nie mogły zostać przetworzone strony:\n" "%1" #: ../gtk/src/OutputEditorHOCR.cc:554 ../qt/src/OutputEditorHOCR.cc:430 msgid "Recognition errors" msgstr "Błędy przetwarzania" #. Add tree item #: ../gtk/src/OutputEditorHOCR.cc:647 ../gtk/src/OutputEditorHOCR.cc:1037 #: ../qt/src/OutputEditorHOCR.cc:504 ../qt/src/OutputEditorHOCR.cc:894 msgid "Graphic" msgstr "Grafika" #: ../gtk/src/OutputEditorHOCR.cc:703 ../qt/src/OutputEditorHOCR.cc:563 msgid "Paragraph" msgstr "Akapit" #: ../gtk/src/OutputEditorHOCR.cc:706 ../qt/src/OutputEditorHOCR.cc:566 msgid "Textline" msgstr "Wiersz tekstu" #: ../gtk/src/OutputEditorHOCR.cc:1136 ../qt/src/OutputEditorHOCR.cc:950 msgid "Merge" msgstr "Połącz" #: ../gtk/src/OutputEditorHOCR.cc:1161 ../qt/src/OutputEditorHOCR.cc:977 msgid "Add graphic region" msgstr "Dodaj region graficzny" #: ../gtk/src/OutputEditorHOCR.cc:1177 ../qt/src/OutputEditorHOCR.cc:985 msgid "No suggestions" msgstr "Brak sugestii" #: ../gtk/src/OutputEditorHOCR.cc:1183 ../qt/src/OutputEditorHOCR.cc:989 msgid "Add to dictionary" msgstr "Dodaj do słownika" #: ../gtk/src/OutputEditorHOCR.cc:1189 ../qt/src/OutputEditorHOCR.cc:990 msgid "Ignore word" msgstr "Ignoruj wyraz" #: ../gtk/src/OutputEditorHOCR.cc:1222 ../qt/src/OutputEditorHOCR.cc:1007 msgid "Expand all" msgstr "Rozwiń" #: ../gtk/src/OutputEditorHOCR.cc:1225 ../qt/src/OutputEditorHOCR.cc:1008 msgid "Collapse all" msgstr "Zwiń" #: ../gtk/src/OutputEditorHOCR.cc:1248 ../gtk/src/OutputEditorHOCR.cc:1287 #: ../qt/src/OutputEditorHOCR.cc:1049 ../qt/src/OutputEditorHOCR.cc:1079 msgid "hOCR HTML Files" msgstr "Pliki hOCR HTML" #: ../gtk/src/OutputEditorHOCR.cc:1249 ../qt/src/OutputEditorHOCR.cc:1049 msgid "Open hOCR File" msgstr "Otwórz plik hOCR" #: ../gtk/src/OutputEditorHOCR.cc:1258 ../qt/src/OutputEditorHOCR.cc:1055 msgid "Failed to open file" msgstr "Błąd otwierania pliku" #: ../gtk/src/OutputEditorHOCR.cc:1258 ../qt/src/OutputEditorHOCR.cc:1055 msgid "The file could not be opened: %1." msgstr "Nie można otworzyć pliku: %1." #: ../gtk/src/OutputEditorHOCR.cc:1267 ../qt/src/OutputEditorHOCR.cc:1062 msgid "Invalid hOCR file" msgstr "Nieprawidłowy plik hOCR" #: ../gtk/src/OutputEditorHOCR.cc:1267 ../qt/src/OutputEditorHOCR.cc:1062 msgid "The file does not appear to contain valid hOCR HTML: %1" msgstr "Plik nie wygląda na prawidłowy hOCR HTML: %1" #: ../gtk/src/OutputEditorHOCR.cc:1283 ../gtk/src/OutputEditorHOCR.cc:1343 #: ../gtk/src/OutputEditorText.cc:306 ../qt/src/OutputEditorHOCR.cc:1077 #: ../qt/src/OutputEditorHOCR.cc:1131 ../qt/src/OutputEditorText.cc:246 msgid "output" msgstr "wynik" #: ../gtk/src/OutputEditorHOCR.cc:1288 ../qt/src/OutputEditorHOCR.cc:1079 msgid "Save hOCR Output..." msgstr "Zapisz wynik jako hOCR..." #: ../gtk/src/OutputEditorHOCR.cc:1296 ../gtk/src/OutputEditorHOCR.cc:1357 #: ../gtk/src/OutputEditorText.cc:319 ../qt/src/OutputEditorHOCR.cc:1087 #: ../qt/src/OutputEditorHOCR.cc:1143 ../qt/src/OutputEditorText.cc:256 msgid "Failed to save output" msgstr "Błąd zapisu pliku wynikowego" #: ../gtk/src/OutputEditorHOCR.cc:1296 ../gtk/src/OutputEditorHOCR.cc:1357 #: ../gtk/src/OutputEditorText.cc:319 ../qt/src/OutputEditorHOCR.cc:1087 #: ../qt/src/OutputEditorHOCR.cc:1143 ../qt/src/OutputEditorText.cc:256 msgid "Check that you have writing permissions in the selected folder." msgstr "Sprawdź uprawnienia do zapisu w wybranym folderze" #: ../gtk/src/OutputEditorHOCR.cc:1346 ../qt/src/OutputEditorHOCR.cc:1133 msgid "PDF Files" msgstr "Pliki PDF" #: ../gtk/src/OutputEditorHOCR.cc:1347 ../qt/src/OutputEditorHOCR.cc:1133 msgid "Save PDF Output..." msgstr "Zapisz wynik jako PDF..." #: ../gtk/src/OutputEditorHOCR.cc:1375 ../qt/src/OutputEditorHOCR.cc:1157 msgid "The PDF library does not support the selected font." msgstr "Biblioteka PDF nie obsługuje wybranej czcionki." #: ../gtk/src/OutputEditorHOCR.cc:1435 ../qt/src/OutputEditorHOCR.cc:1216 msgid "Errors occurred" msgstr "Wystąpiły błędy" #: ../gtk/src/OutputEditorHOCR.cc:1435 ../qt/src/OutputEditorHOCR.cc:1216 msgid "" "The following pages could not be rendered:\n" "%1" msgstr "" "Następujące strony nie mogą być wyświetlone:\n" "%1" #: ../gtk/src/OutputEditorHOCR.cc:1562 ../gtk/src/OutputEditorText.cc:333 #: ../qt/src/OutputEditorHOCR.cc:1331 ../qt/src/OutputEditorText.cc:269 msgid "Output not saved" msgstr "Wynik nie został zapisany" #: ../gtk/src/OutputEditorHOCR.cc:1562 ../gtk/src/OutputEditorText.cc:333 #: ../qt/src/OutputEditorHOCR.cc:1331 ../qt/src/OutputEditorText.cc:269 msgid "Save output before proceeding?" msgstr "Czy zapisać wynik przed kontynuowaniem?" #: ../gtk/src/OutputEditorText.cc:197 ../qt/src/OutputEditorText.cc:158 msgid "Stripping line breaks..." msgstr "Usuwanie podziału wierszy..." #: ../gtk/src/OutputEditorText.cc:211 msgid "Check spelling" msgstr "Sprawdź pisownię" #: ../gtk/src/OutputEditorText.cc:238 ../qt/src/OutputEditorText.cc:178 msgid "Replacing..." msgstr "Zamiana..." #: ../gtk/src/OutputEditorText.cc:264 ../qt/src/OutputEditorText.cc:204 #, fuzzy msgid "File: %1" msgstr "Pliki" #: ../gtk/src/OutputEditorText.cc:267 ../qt/src/OutputEditorText.cc:207 #, fuzzy msgid "Page: %1" msgstr "Błąd parsowania: %1" #: ../gtk/src/OutputEditorText.cc:280 ../gtk/src/Recognizer.cc:481 #: ../qt/src/Recognizer.cc:460 msgid "" "\n" "[Failed to recognize page %1]\n" msgstr "" "\n" "[Błąd rozpoznawania strony %1]\n" #: ../gtk/src/OutputEditorText.cc:310 ../qt/src/OutputEditorText.cc:248 msgid "Text Files" msgstr "Pliki tekstowe" #: ../gtk/src/OutputEditorText.cc:311 ../qt/src/OutputEditorText.cc:248 msgid "Save Output..." msgstr "Zapisz wynik..." #: ../gtk/src/Recognizer.cc:156 ../qt/src/Recognizer.cc:131 msgid "" "Tesseract crashed with the following message:\n" "\n" "%1\n" "\n" "This typically happens for one of the following reasons:\n" "- Outdated traineddata files are used.\n" "- Auxiliary language data files are missing.\n" "- Corrupt language data files.\n" "\n" "Make sure your language data files are valid and compatible with tesseract " "%2." msgstr "" "Tesseract uległ awarii z następującym komunikatem:\n" "\n" "%1\n" "\n" "Najczęstsze przyczyny:\n" "- Nieaktualne pliki traineddata.\n" "- Brak pomocniczych plików języka.\n" "- Uszkodzenie plików języka.\n" "\n" "Upewnij się, że pliki języka są w porządku %2." #: ../gtk/src/Recognizer.cc:212 ../qt/src/Recognizer.cc:191 msgid "No languages available" msgstr "Brak dostępnych języków" #: ../gtk/src/Recognizer.cc:212 ../qt/src/Recognizer.cc:191 msgid "" "No tesseract languages are available for use. Recognition will not work." msgstr "Brak języków dla tesseract. Rozpoznawanie niedostępne." #: ../gtk/src/Recognizer.cc:266 ../qt/src/Recognizer.cc:251 msgid "Multilingual" msgstr "Wielojęzyczne" #: ../gtk/src/Recognizer.cc:318 ../qt/src/Recognizer.cc:295 msgid "Automatic page segmentation" msgstr "Automatyczna segmentacja strony" #: ../gtk/src/Recognizer.cc:319 ../qt/src/Recognizer.cc:296 msgid "Page segmentation with orientation and script detection" msgstr "Podział strony na segmenty" #: ../gtk/src/Recognizer.cc:320 ../qt/src/Recognizer.cc:297 msgid "Assume single column of text" msgstr "Pojedyncza kolumna tekstu" #: ../gtk/src/Recognizer.cc:321 ../qt/src/Recognizer.cc:298 msgid "Assume single block of vertically aligned text" msgstr "Pojedynczy blok tekstu wyrównanego w pionie" #: ../gtk/src/Recognizer.cc:322 ../qt/src/Recognizer.cc:299 msgid "Assume a single uniform block of text" msgstr "Pojedynczy blok tekstu" #: ../gtk/src/Recognizer.cc:323 ../qt/src/Recognizer.cc:300 msgid "Assume a line of text" msgstr "Wiersz tekstu" #: ../gtk/src/Recognizer.cc:324 ../qt/src/Recognizer.cc:301 msgid "Assume a single word" msgstr "Pojedyncze słowo" #: ../gtk/src/Recognizer.cc:325 ../qt/src/Recognizer.cc:302 msgid "Assume a single word in a circle" msgstr "Pojedyncze słowo w okręgu" #: ../gtk/src/Recognizer.cc:326 ../qt/src/Recognizer.cc:303 msgid "Sparse text in no particular order" msgstr "Rzadki nieuporządkowany tekst" #: ../gtk/src/Recognizer.cc:327 ../qt/src/Recognizer.cc:304 msgid "Sparse text with orientation and script detection" msgstr "Rzadki uporządkowany tekst" #: ../gtk/src/Recognizer.cc:341 ../qt/src/Recognizer.cc:314 msgid "Page segmentation mode" msgstr "Tryb segmentacji" #: ../gtk/src/Recognizer.cc:347 ../qt/src/Recognizer.cc:321 msgid "Manage languages..." msgstr "Zarządzaj językami..." #: ../gtk/src/Recognizer.cc:403 ../qt/src/Recognizer.cc:381 msgid "Current selection" msgstr "Bieżące zaznaczenie" #: ../gtk/src/Recognizer.cc:475 ../qt/src/Recognizer.cc:454 msgid "Recognizing page %1 (%2 of %3)" msgstr "Rozpoznawanie strony %1 (%2 of %3)" #: ../gtk/src/Recognizer.cc:480 ../qt/src/Recognizer.cc:459 msgid "" "\n" "- Page %1: failed to render page" msgstr "" "\n" "- Strona %1: błąd wyświetlania strony" #: ../gtk/src/Recognizer.cc:510 ../gtk/src/Recognizer.cc:539 #: ../gtk/src/Recognizer.cc:552 ../qt/src/Recognizer.cc:488 #: ../qt/src/Recognizer.cc:517 ../qt/src/Recognizer.cc:530 msgid "Recognizing..." msgstr "Rozpoznawanie..." #: ../gtk/src/Recognizer.cc:514 ../gtk/src/Recognizer.cc:522 #: ../qt/src/Recognizer.cc:492 ../qt/src/Recognizer.cc:500 msgid "Recognition errors occurred" msgstr "Wystąpiły błędy rozpoznawania" #: ../gtk/src/Recognizer.cc:514 ../qt/src/Recognizer.cc:492 msgid "The following errors occurred:%1" msgstr "Wystąpiły następujące błędy:%1" #: ../gtk/src/Recognizer.cc:522 ../qt/src/Recognizer.cc:500 msgid "Failed to initialize tesseract" msgstr "Błąd inicjalizacji tesseract" #: ../gtk/src/scanner/ScannerSane.cc:83 ../gtk/src/scanner/ScannerTwain.cc:287 #: ../qt/src/scanner/ScannerSane.cc:85 ../qt/src/scanner/ScannerTwain.cc:285 msgid "Scan canceled" msgstr "Skanowanie anulowane" #: ../gtk/src/scanner/ScannerSane.cc:157 ../gtk/src/scanner/ScannerTwain.cc:186 #: ../qt/src/scanner/ScannerSane.cc:158 ../qt/src/scanner/ScannerTwain.cc:178 msgid "No scanner specified" msgstr "Nie wybrano skanera" #: ../gtk/src/scanner/ScannerSane.cc:166 ../gtk/src/scanner/ScannerTwain.cc:195 #: ../qt/src/scanner/ScannerSane.cc:167 ../qt/src/scanner/ScannerTwain.cc:187 msgid "Unable to connect to scanner" msgstr "Błąd połączenia ze skanerem" #: ../gtk/src/scanner/ScannerSane.cc:386 ../gtk/src/scanner/ScannerTwain.cc:265 #: ../gtk/src/scanner/ScannerTwain.cc:291 ../qt/src/scanner/ScannerSane.cc:387 #: ../qt/src/scanner/ScannerTwain.cc:257 ../qt/src/scanner/ScannerTwain.cc:289 msgid "Unable to start scan" msgstr "Nie można rozpocząć skanowania" #: ../gtk/src/scanner/ScannerSane.cc:394 ../gtk/src/scanner/ScannerSane.cc:437 #: ../gtk/src/scanner/ScannerTwain.cc:317 ../qt/src/scanner/ScannerSane.cc:395 #: ../qt/src/scanner/ScannerSane.cc:438 ../qt/src/scanner/ScannerTwain.cc:315 msgid "Error communicating with scanner" msgstr "Błąd komunikacji ze skanerem" #: ../gtk/src/scanner/ScannerSane.cc:498 ../qt/src/scanner/ScannerSane.cc:494 msgid "Failed to save image" msgstr "Błąd przy zapisie obrazu" #: ../gtk/src/SourceManager.cc:118 ../qt/src/SourceManager.cc:112 msgid "Unable to open files" msgstr "Nie można otworzyć plików" #: ../gtk/src/SourceManager.cc:118 ../qt/src/SourceManager.cc:112 msgid "The following files could not be opened:%1" msgstr "Nie można otworzyć plików: %1" #: ../gtk/src/SourceManager.cc:134 ../qt/src/SourceManager.cc:154 msgid "Images and PDFs" msgstr "Obrazy i PDF" #: ../gtk/src/SourceManager.cc:137 ../qt/src/SourceManager.cc:155 msgid "Select Files" msgstr "Wybierz pliki" #: ../gtk/src/SourceManager.cc:143 ../qt/src/SourceManager.cc:166 msgid "Clipboard Error" msgstr "Błąd schowka" #: ../gtk/src/SourceManager.cc:143 ../qt/src/SourceManager.cc:166 msgid "Failed to read the clipboard." msgstr "Błąd odczytu schowka" #: ../gtk/src/SourceManager.cc:147 ../qt/src/SourceManager.cc:170 #: ../qt/src/SourceManager.cc:176 msgid "Pasted %1" msgstr "Wklejone %1" #: ../gtk/src/SourceManager.cc:159 ../qt/src/SourceManager.cc:183 msgid "Screenshot Error" msgstr "Błąd zrzutu ekranu" #: ../gtk/src/SourceManager.cc:159 ../qt/src/SourceManager.cc:183 msgid "Failed to take screenshot." msgstr "Nie udało się wykonać zrzutu ekranu" #: ../gtk/src/SourceManager.cc:163 ../qt/src/SourceManager.cc:187 msgid "Screenshot %1" msgstr "Zrzut ekranu %1" #: ../gtk/src/SourceManager.cc:168 ../qt/src/SourceManager.cc:192 msgid "Saving image..." msgstr "Zapisywanie obrazu..." #: ../gtk/src/SourceManager.cc:175 ../qt/src/SourceManager.cc:205 msgid "Cannot Write File" msgstr "Nie można zapisać pliku" #: ../gtk/src/SourceManager.cc:175 ../qt/src/SourceManager.cc:205 msgid "Could not write to %1." msgstr "Nie można zapisać %1" #: ../gtk/src/SourceManager.cc:202 ../qt/src/SourceManager.cc:227 msgid "Delete File?" msgstr "Usunąć plik?" #: ../gtk/src/SourceManager.cc:202 ../qt/src/SourceManager.cc:227 msgid "The following files will be deleted:%1" msgstr "Zostanie usunięty plik:%1" #: ../gtk/src/SourceManager.cc:266 ../qt/src/SourceManager.cc:278 msgid "Missing File" msgstr "Brak pliku" #: ../gtk/src/SourceManager.cc:266 ../qt/src/SourceManager.cc:278 msgid "" "The following file has been deleted or moved:\n" "%1" msgstr "" "Plik został usunięty albo przeniesiony:\n" "%1" #: ../gtk/src/SubstitutionsManager.cc:39 ../qt/src/SubstitutionsManager.cc:77 msgid "Search for" msgstr "Szukaj" #: ../gtk/src/SubstitutionsManager.cc:40 ../qt/src/SubstitutionsManager.cc:77 msgid "Replace with" msgstr "Zastąp" #: ../gtk/src/SubstitutionsManager.cc:62 ../qt/src/SubstitutionsManager.cc:99 msgid "substitution_list.txt" msgstr "lista_zamiennikow.txt" #: ../gtk/src/SubstitutionsManager.cc:84 ../gtk/src/SubstitutionsManager.cc:119 #: ../qt/src/SubstitutionsManager.cc:114 ../qt/src/SubstitutionsManager.cc:152 msgid "Substitutions List" msgstr "Lista zamienników" #: ../gtk/src/SubstitutionsManager.cc:85 ../qt/src/SubstitutionsManager.cc:114 msgid "Open Substitutions List" msgstr "Otwórz listę zamienników" #: ../gtk/src/SubstitutionsManager.cc:90 ../qt/src/SubstitutionsManager.cc:119 msgid "Error Reading File" msgstr "Błąd odczytu pliku" #: ../gtk/src/SubstitutionsManager.cc:90 ../qt/src/SubstitutionsManager.cc:119 msgid "Unable to read '%1'." msgstr "Błąd odczytu '%1'." #: ../gtk/src/SubstitutionsManager.cc:113 ../qt/src/SubstitutionsManager.cc:146 msgid "Errors Occurred Reading File" msgstr "Błąd odczytu pliku" #: ../gtk/src/SubstitutionsManager.cc:113 ../qt/src/SubstitutionsManager.cc:146 msgid "Some entries of the substitutions list could not be read." msgstr "Niektóre wpisy listy zamienników nie mogły być odczytane" #: ../gtk/src/SubstitutionsManager.cc:120 ../qt/src/SubstitutionsManager.cc:152 msgid "Save Substitutions List" msgstr "Zapisz listę zamienników" #: ../gtk/src/SubstitutionsManager.cc:126 ../qt/src/SubstitutionsManager.cc:158 msgid "Error Saving File" msgstr "Błąd zapisu pliku" #: ../gtk/src/SubstitutionsManager.cc:126 ../qt/src/SubstitutionsManager.cc:158 msgid "Unable to write to '%1'." msgstr "Błąd zapisu '%1'." #: ../gtk/src/SubstitutionsManager.cc:144 ../qt/src/SubstitutionsManager.cc:172 msgid "Save List?" msgstr "Zapisać listę?" #: ../gtk/src/SubstitutionsManager.cc:144 ../qt/src/SubstitutionsManager.cc:172 msgid "Do you want to save the current list?" msgstr "Czy zapisać bieżącą listę?" #: ../gtk/src/SubstitutionsManager.cc:179 ../qt/src/SubstitutionsManager.cc:208 msgid "Applying substitutions..." msgstr "Zamiana wyrazów..." #: ../gtk/src/TessdataManager.cc:58 ../qt/src/TessdataManager.cc:72 msgid "" "PackageKit is required for managing system-wide tesseract language packs, " "but it was not found. Please use the system package management software to " "manage the tesseract language packs, or switch to use the user tessdata path " "in the configuration dialog." msgstr "" "Użyj zarządzania pakietami dostępnego w systemie operacyjnym, aby " "zainstalować pakiety językowe tesseract" #: ../gtk/src/TessdataManager.cc:63 ../qt/src/TessdataManager.cc:77 msgid "Fetching available languages" msgstr "Pobieranie dostępnych języków" #: ../gtk/src/TessdataManager.cc:68 ../gtk/src/TessdataManager.cc:89 #: ../gtk/src/TessdataManager.cc:121 ../qt/src/TessdataManager.cc:82 #: ../qt/src/TessdataManager.cc:94 ../qt/src/TessdataManager.cc:127 msgid "Failed to fetch list of available languages: %1" msgstr "Błąd pobierania listy dostępnych języków: %1" #: ../gtk/src/TessdataManager.cc:100 ../gtk/src/TessdataManager.cc:129 #: ../qt/src/TessdataManager.cc:105 ../qt/src/TessdataManager.cc:114 #: ../qt/src/TessdataManager.cc:136 ../qt/src/TessdataManager.cc:147 msgid "Parsing error: %1" msgstr "Błąd parsowania: %1" #: ../gtk/src/TessdataManager.cc:191 ../qt/src/TessdataManager.cc:191 msgid "Applying changes..." msgstr "Wprowadzanie zmian..." #: ../gtk/src/TessdataManager.cc:252 ../qt/src/TessdataManager.cc:237 msgid "Failed to create directory for tessdata files." msgstr "Błąd przy tworzeniu katalogu dla plików tessdata." #: ../gtk/src/TessdataManager.cc:261 ../qt/src/TessdataManager.cc:245 msgid "Downloading %1..." msgstr "Pobieranie %1..." #: ../gtk/src/TessdataManager.cc:281 ../qt/src/TessdataManager.cc:267 msgid "" "The following files could not be downloaded or removed:\n" "%1\n" "\n" "Check the connectivity and directory permissions." msgstr "" "Następujące pliki nie mogły zostać pobrane lub usunięte:\n" "%1\n" "\n" "Sprawdź połączenie i uprawnienia do folderu." #: ../gtk/src/Utils.cc:62 msgid "Yes" msgstr "Tak" #: ../gtk/src/Utils.cc:65 msgid "No" msgstr "Nie" #: ../gtk/src/Utils.cc:74 msgid "Discard" msgstr "Odrzuć" #: ../qt/data/AboutDialog.ui.h:1 msgid "About gImageReader" msgstr "O programie gImageReader" #: ../qt/data/AboutDialog.ui.h:3 #, fuzzy msgid "" "

 

A graphical frontend to tesseract-ocr

Website

 

" msgstr "" "

 

Interfejs graficzny dla tesseract-ocr

Website

 

" #: ../qt/data/AboutDialog.ui.h:4 msgid "Credits" msgstr "O autorach" #: ../qt/data/AboutDialog.ui.h:5 msgid "License" msgstr "Licencja" #: ../qt/data/ConfigDialog.ui.h:14 msgid "System encoding" msgstr "Kodowanie systemowe" #: ../qt/data/ConfigDialog.ui.h:15 msgid "UTF-8" msgstr "UTF-8" #: ../qt/data/ConfigDialog.ui.h:19 msgid "Text file encoding:" msgstr "Kodowanie znaków:" #: ../qt/data/CrashHandler.ui.h:2 #, no-c-format msgid "" "

The application has " "crashed

Apologies for the inconvenience. To help improve the " "application, please consider reporting the issue to manisandro@gmail.com. Please try to describe what you were doing before the application " "crashed. Also, include the information below. Thank you.

" msgstr "" "Przepraszamy za usterki. Aby poprawić jakość aplikacji, zgłoś problem na " "adres manisandro@gmail.com. Opisz działania wykonywane przed awarią " "programu i dołącz poniższą informację. Dziękuję." #: ../qt/data/MainWindow.ui.h:1 msgid "gImageReader" msgstr "gImageReader" #. Remove & from some labels which designer insists in adding #: ../qt/data/MainWindow.ui.h:17 ../qt/src/Ui_MainWindow.hh:49 msgid "Sources" msgstr "Źródła" #: ../qt/data/MainWindow.ui.h:18 msgid "Zoom In" msgstr "Powiększ" #: ../qt/data/MainWindow.ui.h:20 msgid "Zoom Out" msgstr "Pomniejsz" #: ../qt/data/MainWindow.ui.h:22 msgid "Normal Size" msgstr "Rozmiar normalny" #: ../qt/data/MainWindow.ui.h:24 msgid "Best Fit" msgstr "Dopasowanie" #: ../qt/data/MainWindow.ui.h:26 msgid "Rotate Left" msgstr "Obróć w lewo" #: ../qt/data/MainWindow.ui.h:27 msgid "Rotate left" msgstr "Obróć w lewo" #: ../qt/data/MainWindow.ui.h:28 msgid "Rotate Right" msgstr "Obróć w prawo" #: ../qt/data/MainWindow.ui.h:29 msgid "Rotate right" msgstr "Obróć w prawo" #: ../qt/data/MainWindow.ui.h:30 msgid "Image Controls" msgstr "Dopasowanie obrazu" #: ../qt/data/MainWindow.ui.h:32 msgid "Autodetect Layout" msgstr "Wykryj układ" #: ../qt/data/MainWindow.ui.h:34 msgid "Toggle Output Pane" msgstr "Pokaż/ukryj panel wyniku" #: ../qt/src/MainWindow.cc:518 msgid "Could not read %1: %2" msgstr "Nie można odczytać %1: %2" #: ../qt/src/MainWindow.cc:543 msgid "The following dictionary files were installed:%1" msgstr "Zainstalowano słowniki:%1" #: ../qt/src/Ui_MainWindow.hh:50 msgid "Output" msgstr "Wynik" #: ../qt/src/Ui_MainWindow.hh:133 msgid "OCR mode:" msgstr "Tryb OCR:" #: ../qt/src/Ui_MainWindow.hh:204 msgid "Remove Image" msgstr "Usuń obraz" #: ../qt/src/Ui_MainWindow.hh:207 msgid "Delete Image" msgstr "Skasuj obraz" #: ../qt/src/Ui_MainWindow.hh:210 msgid "Clear List" msgstr "Wyczyść listę" #. Output toolbar #: ../qt/src/Ui_OutputEditorHOCR.hh:39 ../qt/src/Ui_OutputEditorHOCR.hh:40 msgid "Open hOCR file" msgstr "Otwórz plik hOCR" #: ../qt/src/Ui_OutputEditorHOCR.hh:41 ../qt/src/Ui_OutputEditorHOCR.hh:42 msgid "Save as hOCR text" msgstr "Zapisz jako hOCR" #: ../qt/src/Ui_OutputEditorText.hh:108 msgid "Strip Line Breaks" msgstr "Usuń podziały wierszy" #: ../qt/src/Ui_OutputEditorText.hh:113 msgid "Find and Replace" msgstr "Znajdź i zamień" #: ../qt/src/Ui_OutputEditorText.hh:122 msgid "Save Output" msgstr "Zapisz wynik" #: ../qt/src/Ui_OutputEditorText.hh:124 msgid "Clear Output" msgstr "Wyczyść wynik" #, fuzzy #~ msgid "" #~ "<html><head/><body><p><span style=" font-" #~ "weight:600;">The application has crashed</span></p>" #~ "<p>Apologies for the inconvenience. To help improve the " #~ "application, please consider reporting the issue to <a href="" #~ "mailto:manisandro@gmail.com?subject=gImageReader%20Crash">" #~ "manisandro@gmail.com</a>. Please try to describe what you were " #~ "doing before the application crashed. Also, include the information " #~ "below. Thank you.</p></body></html>" #~ msgstr "" #~ "

Przepraszamy za " #~ "usterki. Aby poprawić jakość aplikacji, zgłoś problem na adres manisandro@gmail.com. Opisz działania wykonywane przed awarią " #~ "programu i dołącz poniższą informację. Dziękuję.

" #, fuzzy #~ msgid "" #~ "<small><b>Example:</b> 1-10, 13, 14-18</small>" #~ msgstr "PrzykÅ‚ad: 1-10, 13, 14-18" #~ msgid "Detect script and orientation" #~ msgstr "Wykryj orientacjÄ™" #~ msgid "" #~ "PackageKit is required for managing tesseract language packs, but it was " #~ "not found. Please use the system package management software to manage " #~ "the tesseract language packs." #~ msgstr "" #~ "Użyj zarzÄ…dzania pakietami dostÄ™pnej w systemie operacyjnym aby " #~ "zainstalować pakiety jÄ™zykowe tesseract" #~ msgid "" #~ "\n" #~ "\tFailed to initialize tesseract" #~ msgstr "" #~ "\n" #~ "\tBłąd inicjalizacji tesseract" #~ msgid "So&urces" #~ msgstr "ŹródÅ‚a" #~ msgid "&Output" #~ msgstr "Wynik" #~ msgid "To recognize specific areas, drag rectangles over them." #~ msgstr "Aby rozpoznać fragmenty, zaznacz je" gImageReader-3.2.3/po/pt_BR.po000066400000000000000000001450621312567024200160310ustar00rootroot00000000000000# Copyright (C) 2014-2015 # This file is distributed under the same license as the gImageReader package. # André Alencar , 2014, 2015. # Sandro Mani , 2015, 2016. # Felipe Braga , 2015. msgid "" msgstr "" "Project-Id-Version: \n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2017-07-01 10:34+0200\n" "PO-Revision-Date: 2016-10-06 23:33+0100\n" "Last-Translator: Sandro Mani \n" "Language-Team: English \n" "Language: pt_BR\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n > 1);\n" "X-Generator: Lokalize 2.0\n" #: ../gtk/data/appmenu.ui.h:1 ../qt/src/Ui_MainWindow.hh:165 msgid "Redetect Languages" msgstr "Detectar idiomas novamente" #: ../gtk/data/appmenu.ui.h:2 ../gtk/data/gimagereader.ui.h:39 #: ../qt/data/ConfigDialog.ui.h:1 ../qt/src/Ui_MainWindow.hh:168 msgid "Preferences" msgstr "Preferências" #: ../gtk/data/appmenu.ui.h:3 ../gtk/data/gimagereader.ui.h:40 #: ../gtk/src/MainWindow.cc:484 ../qt/src/MainWindow.cc:445 #: ../qt/src/Ui_MainWindow.hh:173 msgid "Help" msgstr "Ajuda" #: ../gtk/data/appmenu.ui.h:4 ../qt/data/AboutDialog.ui.h:2 #: ../qt/src/Ui_MainWindow.hh:176 msgid "About" msgstr "Sobre" #: ../gtk/data/appmenu.ui.h:5 msgid "Quit" msgstr "Sair" #: ../gtk/data/crashhandler.ui.h:1 ../qt/src/CrashHandler.cc:36 msgid "Regenerate backtrace" msgstr "Regenerar backtrace" #: ../gtk/data/crashhandler.ui.h:2 msgid "The application has crashed" msgstr "A aplicação parou de funcionar" #: ../gtk/data/crashhandler.ui.h:4 #, no-c-format msgid "" "Apologies for the inconvenience. To help improve the application, please " "consider reporting the issue to manisandro@gmail.com. Please try to " "describe what you were doing before the application crashed. Also, include " "the information below. Thank you." msgstr "" "Pedimos desculpas pela inconveniência. Para ajudar a melhorar esta " "aplicação, por favor envie um relatório de erro para manisandro@gmail.com. Tente descrever o que você estava fazendo antes da aplicação parar de " "funcionar. Inclua também a informação abaixo. Obrigado." #: ../gtk/data/editor_hocr.ui.h:1 ../qt/data/PdfExportDialog.ui.h:1 msgid "PDF Export" msgstr "Exportação PDF" #: ../gtk/data/editor_hocr.ui.h:2 ../gtk/data/gimagereader.ui.h:55 #: ../gtk/src/Acquirer.cc:42 ../gtk/src/FileDialogs.cc:150 #: ../gtk/src/Utils.cc:68 ../qt/data/ConfigDialog.ui.h:27 #: ../qt/data/MainWindow.ui.h:14 msgid "Cancel" msgstr "Cancelar" #: ../gtk/data/editor_hocr.ui.h:3 ../gtk/data/gimagereader.ui.h:41 #: ../gtk/src/FileDialogs.cc:151 ../gtk/src/Utils.cc:59 #: ../qt/data/ConfigDialog.ui.h:26 msgid "OK" msgstr "OK" #: ../gtk/data/editor_hocr.ui.h:4 ../qt/data/PdfExportDialog.ui.h:2 #, fuzzy msgid "Output mode:" msgstr "Saída:" #: ../gtk/data/editor_hocr.ui.h:5 ../qt/data/PdfExportDialog.ui.h:3 msgid "PDF" msgstr "" #: ../gtk/data/editor_hocr.ui.h:6 ../qt/data/PdfExportDialog.ui.h:4 msgid "PDF with invisible text overlay" msgstr "" #: ../gtk/data/editor_hocr.ui.h:7 ../qt/data/PdfExportDialog.ui.h:16 msgid "Format:" msgstr "" #: ../gtk/data/editor_hocr.ui.h:8 ../qt/data/PdfExportDialog.ui.h:17 msgid "Compression:" msgstr "" #: ../gtk/data/editor_hocr.ui.h:9 ../qt/data/PdfExportDialog.ui.h:14 msgid "Compression quality:" msgstr "" #: ../gtk/data/editor_hocr.ui.h:10 ../qt/data/PdfExportDialog.ui.h:15 msgid "DPI:" msgstr "DPI:" #: ../gtk/data/editor_hocr.ui.h:11 ../qt/data/PdfExportDialog.ui.h:18 msgid "Dithering algorithm:" msgstr "" #: ../gtk/data/editor_hocr.ui.h:12 ../qt/data/PdfExportDialog.ui.h:13 msgid "Image settings:" msgstr "" #: ../gtk/data/editor_hocr.ui.h:13 ../qt/data/PdfExportDialog.ui.h:11 msgid "Document font:" msgstr "" #: ../gtk/data/editor_hocr.ui.h:14 ../qt/data/PdfExportDialog.ui.h:7 msgid "Uniformize line and word spacing" msgstr "" #: ../gtk/data/editor_hocr.ui.h:15 ../qt/data/PdfExportDialog.ui.h:10 msgid "Use detected font sizes" msgstr "" #: ../gtk/data/editor_hocr.ui.h:16 ../qt/data/PdfExportDialog.ui.h:8 msgid "Preserve spaces wider than:" msgstr "" #: ../gtk/data/editor_hocr.ui.h:17 ../qt/data/PdfExportDialog.ui.h:12 msgid "characters" msgstr "" #: ../gtk/data/editor_hocr.ui.h:18 ../qt/data/PdfExportDialog.ui.h:9 #, fuzzy msgid "Scale:" msgstr "Escala" #: ../gtk/data/editor_hocr.ui.h:19 ../qt/data/PdfExportDialog.ui.h:6 msgid "Text settings:" msgstr "" #: ../gtk/data/editor_hocr.ui.h:20 ../qt/data/PdfExportDialog.ui.h:5 msgid "Show preview" msgstr "" #: ../gtk/data/editor_hocr.ui.h:21 ../gtk/data/editor_text.ui.h:26 #: ../qt/src/Ui_OutputEditorText.hh:123 msgid "Save output" msgstr "Salvar saída" #: ../gtk/data/editor_hocr.ui.h:22 ../qt/src/Ui_OutputEditorHOCR.hh:44 #: ../qt/src/Ui_OutputEditorHOCR.hh:45 msgid "Export to PDF" msgstr "" #: ../gtk/data/editor_hocr.ui.h:23 ../gtk/data/editor_text.ui.h:27 #: ../qt/src/Ui_OutputEditorHOCR.hh:47 ../qt/src/Ui_OutputEditorHOCR.hh:48 #: ../qt/src/Ui_OutputEditorText.hh:125 msgid "Clear output" msgstr "Limpar saída" #: ../gtk/data/editor_hocr.ui.h:24 ../qt/src/Ui_OutputEditorHOCR.hh:75 msgid "Properties" msgstr "" #: ../gtk/data/editor_hocr.ui.h:25 ../qt/src/Ui_OutputEditorHOCR.hh:79 #, fuzzy msgid "Source" msgstr "Fontes" #. Output insert mode #: ../gtk/data/editor_text.ui.h:1 ../qt/src/Ui_OutputEditorText.hh:59 msgid "Append to current text" msgstr "Acrescentar no texto atual" #: ../gtk/data/editor_text.ui.h:2 ../qt/src/Ui_OutputEditorText.hh:60 msgid "Insert at cursor" msgstr "Inserir no cursor" #: ../gtk/data/editor_text.ui.h:3 ../qt/src/Ui_OutputEditorText.hh:61 msgid "Replace current text" msgstr "Substituir o texto atual" #: ../gtk/data/editor_text.ui.h:4 ../qt/src/SubstitutionsManager.cc:37 #: ../qt/src/Ui_OutputEditorText.hh:177 msgid "Substitutions" msgstr "Substituições" #: ../gtk/data/editor_text.ui.h:5 ../qt/src/SubstitutionsManager.cc:42 #: ../qt/src/SubstitutionsManager.cc:43 msgid "Open" msgstr "Abrir" #: ../gtk/data/editor_text.ui.h:6 ../gtk/src/Utils.cc:71 #: ../qt/src/SubstitutionsManager.cc:45 ../qt/src/SubstitutionsManager.cc:46 msgid "Save" msgstr "Salvar" #: ../gtk/data/editor_text.ui.h:7 ../qt/src/SubstitutionsManager.cc:48 #: ../qt/src/SubstitutionsManager.cc:49 msgid "Clear" msgstr "Limpar" #: ../gtk/data/editor_text.ui.h:8 ../qt/data/ConfigDialog.ui.h:16 #: ../qt/src/SubstitutionsManager.cc:51 ../qt/src/SubstitutionsManager.cc:52 msgid "Add" msgstr "Adicionar" #: ../gtk/data/editor_text.ui.h:9 ../gtk/src/OutputEditorHOCR.cc:1202 #: ../gtk/src/OutputEditorHOCR.cc:1213 ../qt/data/ConfigDialog.ui.h:17 #: ../qt/src/OutputEditorHOCR.cc:998 ../qt/src/OutputEditorHOCR.cc:1000 #: ../qt/src/SubstitutionsManager.cc:54 ../qt/src/SubstitutionsManager.cc:55 msgid "Remove" msgstr "Remover" #: ../gtk/data/editor_text.ui.h:10 ../gtk/data/gimagereader.ui.h:73 msgid "Apply" msgstr "Aplicar" #: ../gtk/data/editor_text.ui.h:11 ../gtk/data/gimagereader.ui.h:74 msgid "Close" msgstr "Fechar" #. Output postprocessing #: ../gtk/data/editor_text.ui.h:12 ../qt/src/Ui_OutputEditorText.hh:69 msgid "Keep line break if..." msgstr "Manter quebra de linha se..." #: ../gtk/data/editor_text.ui.h:13 ../qt/src/Ui_OutputEditorText.hh:71 #, fuzzy msgid "Preceded by end mark (.?!)" msgstr "Precedida por ponto" #: ../gtk/data/editor_text.ui.h:14 ../qt/src/Ui_OutputEditorText.hh:73 msgid "Preceded or succeeded by quote" msgstr "Precedida ou sucedida por citação" #: ../gtk/data/editor_text.ui.h:15 ../qt/src/Ui_OutputEditorText.hh:75 msgid "Other options" msgstr "Outras opções" #: ../gtk/data/editor_text.ui.h:16 ../qt/src/Ui_OutputEditorText.hh:77 msgid "Join hyphenated words" msgstr "Juntar palavras com hífen" #: ../gtk/data/editor_text.ui.h:17 ../qt/src/Ui_OutputEditorText.hh:79 msgid "Collapse whitespace" msgstr "Juntar espaços em branco" #: ../gtk/data/editor_text.ui.h:18 ../qt/src/Ui_OutputEditorText.hh:81 msgid "Preserve paragraphs" msgstr "Preservar parágrafos" #: ../gtk/data/editor_text.ui.h:19 ../qt/src/Ui_OutputEditorText.hh:83 msgid "Visual aids" msgstr "Recursos visuais" #: ../gtk/data/editor_text.ui.h:20 ../qt/src/Ui_OutputEditorText.hh:85 msgid "Draw whitespace" msgstr "Desenhar espaços" #: ../gtk/data/editor_text.ui.h:21 ../gtk/data/gimagereader.ui.h:31 #: ../qt/src/Ui_OutputEditorText.hh:102 msgid "Select insert mode" msgstr "Selecione o modo de inserção" #: ../gtk/data/editor_text.ui.h:22 ../qt/src/Ui_OutputEditorText.hh:109 msgid "Strip line breaks on selected text" msgstr "Remover quebras de linha do texto selecionado" #: ../gtk/data/editor_text.ui.h:23 ../qt/src/Ui_OutputEditorText.hh:114 msgid "Find and replace" msgstr "Localizar e substituir" #: ../gtk/data/editor_text.ui.h:24 ../qt/src/Ui_OutputEditorText.hh:116 #: ../qt/src/Ui_OutputEditorText.hh:117 msgid "Undo" msgstr "Desfazer" #: ../gtk/data/editor_text.ui.h:25 ../qt/src/Ui_OutputEditorText.hh:119 #: ../qt/src/Ui_OutputEditorText.hh:120 msgid "Redo" msgstr "Refazer" #: ../gtk/data/editor_text.ui.h:28 ../qt/src/Ui_OutputEditorText.hh:149 msgid "Find" msgstr "Localizar" #: ../gtk/data/editor_text.ui.h:29 ../qt/src/Ui_OutputEditorText.hh:153 #: ../qt/src/Ui_OutputEditorText.hh:168 msgid "Replace" msgstr "Substituir" #: ../gtk/data/editor_text.ui.h:30 ../qt/src/Ui_OutputEditorText.hh:173 msgid "Replace all" msgstr "Substituir todos" #: ../gtk/data/editor_text.ui.h:31 ../qt/src/Ui_OutputEditorText.hh:163 msgid "Find previous" msgstr "Localizar anterior" #: ../gtk/data/editor_text.ui.h:32 ../qt/src/Ui_OutputEditorText.hh:158 msgid "Find next" msgstr "Localizar próximo" #: ../gtk/data/editor_text.ui.h:33 ../qt/src/Ui_OutputEditorText.hh:182 msgid "Match case" msgstr "Diferenciar maiúsculas e minúsculas" #: ../gtk/data/gimagereader.ui.h:1 ../qt/src/Ui_MainWindow.hh:65 #, fuzzy msgid "Rotate current page" msgstr "Substituir o texto atual" #: ../gtk/data/gimagereader.ui.h:2 ../qt/src/Ui_MainWindow.hh:66 #, fuzzy msgid "Rotate all pages" msgstr "Rotacionar para a esquerda" #: ../gtk/data/gimagereader.ui.h:3 ../qt/data/MainWindow.ui.h:35 msgid "Toggle output pane" msgstr "Alternar exibição do painel de saída" #. Sources toolbar #: ../gtk/data/gimagereader.ui.h:4 ../qt/src/Ui_MainWindow.hh:187 msgid "Recent" msgstr "Recente" #: ../gtk/data/gimagereader.ui.h:5 ../qt/src/Ui_MainWindow.hh:188 msgid "Paste" msgstr "Colar" #: ../gtk/data/gimagereader.ui.h:6 ../qt/src/Ui_MainWindow.hh:189 msgid "Take Screenshot" msgstr "Capturar a tela" #: ../gtk/data/gimagereader.ui.h:7 ../qt/src/Ui_MainWindow.hh:200 msgid "Add images" msgstr "Adicionar imagens" #: ../gtk/data/gimagereader.ui.h:8 ../qt/src/Ui_MainWindow.hh:199 msgid "Add Images" msgstr "Adicionar imagens" #: ../gtk/data/gimagereader.ui.h:9 ../qt/src/Ui_MainWindow.hh:205 msgid "Remove image from list" msgstr "Remover imagem da lista" #: ../gtk/data/gimagereader.ui.h:10 ../qt/src/Ui_MainWindow.hh:208 msgid "Delete image" msgstr "Excluir imagem" #: ../gtk/data/gimagereader.ui.h:11 ../qt/src/Ui_MainWindow.hh:211 msgid "Clear list" msgstr "Limpar lista" #: ../gtk/data/gimagereader.ui.h:12 ../qt/data/MainWindow.ui.h:6 msgid "Files" msgstr "Arquivos" #: ../gtk/data/gimagereader.ui.h:13 ../qt/data/MainWindow.ui.h:16 msgid "Device:" msgstr "Dispositivo:" #: ../gtk/data/gimagereader.ui.h:14 ../qt/data/MainWindow.ui.h:15 #: ../qt/src/TessdataManager.cc:57 msgid "Refresh" msgstr "Atualizar" #: ../gtk/data/gimagereader.ui.h:15 ../qt/data/MainWindow.ui.h:12 msgid "Output:" msgstr "Saída:" #: ../gtk/data/gimagereader.ui.h:16 ../qt/data/MainWindow.ui.h:9 msgid "Mode:" msgstr "Modo:" #: ../gtk/data/gimagereader.ui.h:17 ../gtk/src/OutputEditorHOCR.cc:362 #: ../qt/data/MainWindow.ui.h:11 ../qt/src/OutputEditorHOCR.cc:273 msgid "Color" msgstr "Cor" #: ../gtk/data/gimagereader.ui.h:18 ../gtk/src/OutputEditorHOCR.cc:365 #: ../qt/data/MainWindow.ui.h:10 ../qt/src/OutputEditorHOCR.cc:275 #: ../qt/src/OutputEditorHOCR.cc:277 msgid "Grayscale" msgstr "Escala de cinza" #: ../gtk/data/gimagereader.ui.h:19 ../qt/data/MainWindow.ui.h:8 msgid "Resolution:" msgstr "Resolução:" #: ../gtk/data/gimagereader.ui.h:20 ../qt/data/MainWindow.ui.h:13 msgid "Scan" msgstr "Digitalizar" #: ../gtk/data/gimagereader.ui.h:21 ../qt/data/MainWindow.ui.h:7 msgid "Acquire" msgstr "Obter" #: ../gtk/data/gimagereader.ui.h:22 ../qt/data/MainWindow.ui.h:2 msgid "Brightness" msgstr "Brilho" #: ../gtk/data/gimagereader.ui.h:23 ../qt/data/MainWindow.ui.h:3 msgid "Contrast" msgstr "Contraste" #: ../gtk/data/gimagereader.ui.h:24 ../qt/data/MainWindow.ui.h:4 msgid "Resolution" msgstr "Resolução" #: ../gtk/data/gimagereader.ui.h:25 ../qt/data/MainWindow.ui.h:5 msgid "Invert colors" msgstr "Inverter cores" #: ../gtk/data/gimagereader.ui.h:26 ../qt/data/MainWindow.ui.h:19 msgid "Zoom in" msgstr "Aumentar zoom" #: ../gtk/data/gimagereader.ui.h:27 ../qt/data/MainWindow.ui.h:21 msgid "Zoom out" msgstr "Diminuir zoom" #: ../gtk/data/gimagereader.ui.h:28 ../qt/data/MainWindow.ui.h:23 msgid "Normal size" msgstr "Tamanho normal" #: ../gtk/data/gimagereader.ui.h:29 ../qt/data/MainWindow.ui.h:25 msgid "Best fit" msgstr "Melhor ajuste" #: ../gtk/data/gimagereader.ui.h:30 ../qt/src/Ui_MainWindow.hh:74 #, fuzzy msgid "Select rotation mode" msgstr "Selecione o modo de inserção" #: ../gtk/data/gimagereader.ui.h:32 ../qt/data/MainWindow.ui.h:31 msgid "Image controls" msgstr "Controles de imagem" #: ../gtk/data/gimagereader.ui.h:33 ../qt/src/Ui_MainWindow.hh:137 msgid "Plain text" msgstr "" #: ../gtk/data/gimagereader.ui.h:34 ../qt/src/Ui_MainWindow.hh:137 msgid "hOCR, PDF" msgstr "" #: ../gtk/data/gimagereader.ui.h:35 ../qt/data/MainWindow.ui.h:33 msgid "Autodetect layout" msgstr "Detectar layout automaticamente" #: ../gtk/data/gimagereader.ui.h:36 msgid "Recognize all" msgstr "Reconhecer tudo" #: ../gtk/data/gimagereader.ui.h:37 #, fuzzy msgid "Select language" msgstr "Detectar idiomas novamente" #: ../gtk/data/gimagereader.ui.h:38 msgid "A graphical frontend to tesseract-ocr" msgstr "Uma interface gráfica para o tesseract-ocr" #: ../gtk/data/gimagereader.ui.h:42 msgid "Output pane orientation:" msgstr "Orientação do painel de saída:" #: ../gtk/data/gimagereader.ui.h:43 msgid "Horizontal" msgstr "Horizontal" #: ../gtk/data/gimagereader.ui.h:44 msgid "Vertical" msgstr "Vertical" #: ../gtk/data/gimagereader.ui.h:45 ../qt/data/ConfigDialog.ui.h:18 msgid "Query to install missing spellcheck dictionaries" msgstr "" "Perguntar pela instalação de dicionários de verificação ortográfica não " "encontrados" #: ../gtk/data/gimagereader.ui.h:46 ../qt/data/ConfigDialog.ui.h:4 msgid "Automatically check for new program versions" msgstr "Verificar automaticamente novas versões do programa" #: ../gtk/data/gimagereader.ui.h:47 ../qt/data/ConfigDialog.ui.h:3 msgid "Predefined language definitions:" msgstr "Definições de idioma predefinidas:" #: ../gtk/data/gimagereader.ui.h:48 ../qt/data/ConfigDialog.ui.h:12 msgid "Additional language definitions:" msgstr "Definições de idiomas adicionais:" #: ../gtk/data/gimagereader.ui.h:49 ../qt/data/ConfigDialog.ui.h:20 msgid "The prefix of the tesseract language data file" msgstr "O prefixo do arquivo de dados do idioma do tesseract" #: ../gtk/data/gimagereader.ui.h:50 ../qt/data/ConfigDialog.ui.h:21 msgid "Prefix" msgstr "Prefixo" #: ../gtk/data/gimagereader.ui.h:51 ../qt/data/ConfigDialog.ui.h:22 msgid "The ISO 639-1 language code followed by the country code" msgstr "O código do idioma ISO 639-1 seguido do código do país" #: ../gtk/data/gimagereader.ui.h:52 ../qt/data/ConfigDialog.ui.h:23 msgid "ISO Code" msgstr "Código ISO" #: ../gtk/data/gimagereader.ui.h:53 ../qt/data/ConfigDialog.ui.h:24 msgid "The name of the language" msgstr "O nome do idioma" #: ../gtk/data/gimagereader.ui.h:54 ../qt/data/ConfigDialog.ui.h:25 msgid "Name" msgstr "Nome" #: ../gtk/data/gimagereader.ui.h:56 ../qt/data/ConfigDialog.ui.h:5 msgid "Output pane font:" msgstr "Fonte do painel de saída:" #: ../gtk/data/gimagereader.ui.h:57 ../qt/data/ConfigDialog.ui.h:2 msgid "Default" msgstr "Padrão" #: ../gtk/data/gimagereader.ui.h:58 ../qt/data/ConfigDialog.ui.h:6 msgid "Language data locations:" msgstr "" #: ../gtk/data/gimagereader.ui.h:59 ../qt/data/ConfigDialog.ui.h:13 #, fuzzy msgid "Language definitions path:" msgstr "Definições de idioma predefinidas:" #: ../gtk/data/gimagereader.ui.h:60 ../qt/data/ConfigDialog.ui.h:28 #, fuzzy msgid "Spelling dictionaries path:" msgstr "Dicionário de ortografia faltando" #: ../gtk/data/gimagereader.ui.h:61 ../qt/data/ConfigDialog.ui.h:10 msgid "System-wide paths" msgstr "" #: ../gtk/data/gimagereader.ui.h:62 ../qt/data/ConfigDialog.ui.h:11 msgid "User paths" msgstr "" #: ../gtk/data/gimagereader.ui.h:63 ../qt/data/PageRangeDialog.ui.h:1 msgid "Page Range" msgstr "Intervalo de páginas" #: ../gtk/data/gimagereader.ui.h:64 ../qt/data/PageRangeDialog.ui.h:2 msgid "Page range:" msgstr "Intervalo de páginas:" #: ../gtk/data/gimagereader.ui.h:65 ../qt/data/PageRangeDialog.ui.h:3 msgid "Example: 1-10, 13, 14-18" msgstr "Exemplo: 1-10, 13, 14-18" #: ../gtk/data/gimagereader.ui.h:66 ../qt/data/PageRangeDialog.ui.h:4 msgid "Recognition area:" msgstr "Ãrea de reconhecimento:" #: ../gtk/data/gimagereader.ui.h:67 ../gtk/src/Recognizer.cc:403 #: ../qt/data/PageRangeDialog.ui.h:5 ../qt/src/Recognizer.cc:381 msgid "Entire page" msgstr "Página inteira" #: ../gtk/data/gimagereader.ui.h:68 ../qt/data/PageRangeDialog.ui.h:6 msgid "Autodetect" msgstr "Detectar automaticamente" #: ../gtk/data/gimagereader.ui.h:69 ../qt/data/PageRangeDialog.ui.h:7 #, fuzzy msgid "Prepend to output text:" msgstr "Acrescentar no texto atual" #: ../gtk/data/gimagereader.ui.h:70 ../qt/data/PageRangeDialog.ui.h:8 msgid "Source filename" msgstr "" #: ../gtk/data/gimagereader.ui.h:71 ../qt/data/PageRangeDialog.ui.h:9 #, fuzzy msgid "Source page" msgstr "Fontes" #: ../gtk/data/gimagereader.ui.h:72 ../qt/src/TessdataManager.cc:47 msgid "Tessdata Manager" msgstr "" #: ../gtk/data/gimagereader.ui.h:75 ../qt/src/TessdataManager.cc:49 msgid "Manage installed languages:" msgstr "" #: ../gtk/data/gimagereader.ui.h:76 ../qt/src/DisplayerToolSelect.cc:240 msgid "Delete" msgstr "Excluir" #: ../gtk/data/gimagereader.ui.h:77 ../qt/src/DisplayerToolSelect.cc:226 msgid "Order:" msgstr "Ordem:" #: ../gtk/data/gimagereader.ui.h:78 ../gtk/src/DisplayerToolHOCR.cc:28 #: ../qt/src/DisplayerToolHOCR.cc:30 ../qt/src/DisplayerToolSelect.cc:241 msgid "Recognize" msgstr "Reconhecer" #: ../gtk/data/gimagereader.ui.h:79 ../qt/src/DisplayerToolSelect.cc:242 msgid "Recognize to clipboard" msgstr "Reconhecer para a área de transferência" #: ../gtk/data/gimagereader.ui.h:80 ../qt/src/DisplayerToolSelect.cc:243 msgid "Save as image" msgstr "Salvar como imagem" #: ../gtk/data/gimagereader.ui.h:81 ../qt/src/Recognizer.cc:76 msgid "Current Page" msgstr "Página atual" #: ../gtk/data/gimagereader.ui.h:82 ../qt/src/Recognizer.cc:79 msgid "Multiple Pages..." msgstr "Múltiplas páginas..." #: ../gtk/src/Acquirer.cc:83 ../qt/src/Acquirer.cc:63 msgid "scan.png" msgstr "scan.png" #: ../gtk/src/Acquirer.cc:96 ../qt/src/Acquirer.cc:80 msgid "Images" msgstr "Imagens" #: ../gtk/src/Acquirer.cc:97 ../qt/src/Acquirer.cc:81 msgid "Choose Output Filename..." msgstr "Escolha nome do arquivo de saída..." #: ../gtk/src/Acquirer.cc:112 ../qt/src/Acquirer.cc:96 msgid "Failed to initialize the scanning backend." msgstr "Falha ao inicializar a infraestrutura de digitalização." #: ../gtk/src/Acquirer.cc:121 ../qt/src/Acquirer.cc:102 msgid "Scan failed" msgstr "A digitalização falhou" #: ../gtk/src/Acquirer.cc:139 ../qt/src/Acquirer.cc:118 msgid "No scanners were detected." msgstr "Nenhum digitalizador foi detectado" #: ../gtk/src/Acquirer.cc:156 ../gtk/src/Acquirer.cc:173 #: ../qt/src/Acquirer.cc:132 ../qt/src/Acquirer.cc:149 msgid "Starting scan..." msgstr "Iniciando digitalização..." #: ../gtk/src/Acquirer.cc:169 ../qt/src/Acquirer.cc:145 msgid "Opening device..." msgstr "Abrindo dispositivo..." #: ../gtk/src/Acquirer.cc:171 ../qt/src/Acquirer.cc:147 msgid "Setting options..." msgstr "definindo opções..." #: ../gtk/src/Acquirer.cc:175 ../qt/src/Acquirer.cc:151 msgid "Getting parameters..." msgstr "Obtendo parâmetros..." #: ../gtk/src/Acquirer.cc:177 ../qt/src/Acquirer.cc:153 msgid "Transferring data..." msgstr "Transferindo dados..." #: ../gtk/src/Acquirer.cc:184 ../qt/src/Acquirer.cc:160 msgid "Canceling scan..." msgstr "Cancelando a digitalização..." #: ../gtk/src/Config.cc:297 ../qt/data/ConfigDialog.ui.h:7 msgid "Filename prefix" msgstr "Prefixo do nome do arquivo" #: ../gtk/src/Config.cc:298 ../qt/data/ConfigDialog.ui.h:8 msgid "Code" msgstr "Código" #: ../gtk/src/Config.cc:299 ../qt/data/ConfigDialog.ui.h:9 msgid "Native name" msgstr "Nome nativo" #: ../gtk/src/CrashHandler.cc:26 ../gtk/src/CrashHandler.cc:43 #: ../qt/src/CrashHandler.cc:34 msgid "Crash Handler" msgstr "Gerenciador de erros" #: ../gtk/src/CrashHandler.cc:45 ../qt/src/CrashHandler.cc:29 msgid "Your work has been saved under %1." msgstr "O seu trabalho foi salvo em %1." #: ../gtk/src/CrashHandler.cc:47 ../qt/src/CrashHandler.cc:31 msgid "There was no unsaved work." msgstr "Não havia trabalho não salvo." #: ../gtk/src/CrashHandler.cc:106 ../qt/src/CrashHandler.cc:60 msgid "Failed to obtain backtrace. Is gdb installed?" msgstr "Falha ao obter o backtrace. O gdb está instalado?" #: ../gtk/src/Displayer.cc:261 ../qt/src/Displayer.cc:231 msgid "Failed to load image" msgstr "Falha ao carregar imagem" #: ../gtk/src/Displayer.cc:261 ../qt/src/Displayer.cc:231 msgid "" "The file might not be an image or be corrupt:\n" "%1" msgstr "" "O arquivo pode não ser uma imagem ou está corrompido:\n" "%1" #: ../gtk/src/DisplayerToolSelect.cc:39 ../qt/src/DisplayerToolSelect.cc:40 msgid "selection.png" msgstr "selection.png" #: ../gtk/src/DisplayerToolSelect.cc:148 ../qt/src/DisplayerToolSelect.cc:139 msgid "PNG Images" msgstr "Imagens PNG" #: ../gtk/src/DisplayerToolSelect.cc:149 ../qt/src/DisplayerToolSelect.cc:139 msgid "Save Selection Image" msgstr "Salvar imagem selecionada" #: ../gtk/src/DisplayerToolSelect.cc:157 ../qt/src/DisplayerToolSelect.cc:147 msgid "Recognize all" msgstr "Reconhecer tudo" #: ../gtk/src/DisplayerToolSelect.cc:157 ../qt/src/DisplayerToolSelect.cc:147 msgid "Recognize selection" msgstr "Reconhecer seleção" #: ../gtk/src/DisplayerToolSelect.cc:194 ../qt/src/DisplayerToolSelect.cc:184 msgid "Performing layout analysis" msgstr "Executando análise de layout" #: ../gtk/src/FileDialogs.cc:237 msgid "" "A file named \"%1\" already exists. Are you sure you want to overwrite it?" msgstr "Um arquivo chamado \"%1\" já existe. Você deseja sobrescrevê-lo?" #: ../gtk/src/FileDialogs.cc:239 msgid "Overwrite File?" msgstr "Sobrescrever arquivo?" #: ../gtk/src/MainWindow.cc:125 ../qt/src/MainWindow.cc:274 msgid "Using tesseract" msgstr "" #: ../gtk/src/MainWindow.cc:191 ../qt/src/MainWindow.cc:181 msgid "Select an image to begin..." msgstr "Selecione uma imagem para começar..." #: ../gtk/src/MainWindow.cc:306 ../qt/src/MainWindow.cc:262 #, fuzzy msgid "Multiple sources" msgstr "Múltiplas páginas..." #: ../gtk/src/MainWindow.cc:307 ../qt/src/MainWindow.cc:263 msgid "Ready" msgstr "Pronto" #: ../gtk/src/MainWindow.cc:446 ../qt/src/MainWindow.cc:390 msgid "New version" msgstr "Nova versão" #: ../gtk/src/MainWindow.cc:446 ../qt/src/MainWindow.cc:390 msgid "gImageReader %1 is available" msgstr "gImageReader %1 está disponível" #: ../gtk/src/MainWindow.cc:447 ../qt/src/MainWindow.cc:391 msgid "Download" msgstr "Download" #: ../gtk/src/MainWindow.cc:448 ../qt/src/MainWindow.cc:392 msgid "Changelog" msgstr "Registro de mudanças" #: ../gtk/src/MainWindow.cc:449 ../qt/src/MainWindow.cc:393 msgid "Don't notify again" msgstr "Não avisar novamente" #: ../gtk/src/MainWindow.cc:468 ../qt/src/MainWindow.cc:438 msgid "Don't show again" msgstr "Não mostrar novamente" #: ../gtk/src/MainWindow.cc:469 ../gtk/src/MainWindow.cc:482 #: ../qt/src/MainWindow.cc:439 msgid "Install" msgstr "Instalar" #: ../gtk/src/MainWindow.cc:489 ../qt/src/MainWindow.cc:451 msgid "Spelling dictionary missing" msgstr "Dicionário de ortografia faltando" #: ../gtk/src/MainWindow.cc:489 ../qt/src/MainWindow.cc:451 msgid "The spellcheck dictionary for %1 is not installed" msgstr "O dicionário de ortografia para %1 no foi instalado" #: ../gtk/src/MainWindow.cc:496 ../gtk/src/MainWindow.cc:528 #: ../qt/src/MainWindow.cc:458 msgid "Installing spelling dictionary for '%1'" msgstr "Instalando dicionário de ortografia para '%1'" #: ../gtk/src/MainWindow.cc:517 ../gtk/src/MainWindow.cc:542 #: ../gtk/src/MainWindow.cc:550 ../gtk/src/MainWindow.cc:560 #: ../gtk/src/MainWindow.cc:566 ../gtk/src/MainWindow.cc:595 #: ../gtk/src/OutputEditorHOCR.cc:1375 ../gtk/src/Recognizer.cc:163 #: ../gtk/src/TessdataManager.cc:58 ../gtk/src/TessdataManager.cc:68 #: ../gtk/src/TessdataManager.cc:290 ../qt/src/MainWindow.cc:477 #: ../qt/src/MainWindow.cc:490 ../qt/src/MainWindow.cc:500 #: ../qt/src/MainWindow.cc:510 ../qt/src/MainWindow.cc:518 #: ../qt/src/MainWindow.cc:546 ../qt/src/OutputEditorHOCR.cc:1157 #: ../qt/src/Recognizer.cc:138 ../qt/src/TessdataManager.cc:72 #: ../qt/src/TessdataManager.cc:82 ../qt/src/TessdataManager.cc:275 msgid "Error" msgstr "Erro" #: ../gtk/src/MainWindow.cc:517 ../qt/src/MainWindow.cc:477 msgid "Failed to install spelling dictionary: %1" msgstr "Falha ao instalar dicionário de ortografia: %1" #: ../gtk/src/MainWindow.cc:542 ../qt/src/MainWindow.cc:490 #, fuzzy msgid "Failed to create directory for spelling dictionaries." msgstr "Falha ao instalar dicionário de ortografia: %1" #: ../gtk/src/MainWindow.cc:550 ../gtk/src/MainWindow.cc:566 #: ../qt/src/MainWindow.cc:500 #, fuzzy msgid "Could not read %1: %2." msgstr "Não foi possível ler %1." #: ../gtk/src/MainWindow.cc:560 ../gtk/src/MainWindow.cc:595 #: ../qt/src/MainWindow.cc:510 ../qt/src/MainWindow.cc:546 msgid "No spelling dictionaries found for '%1'." msgstr "Nenhum dicionário de ortografia encontrado para '%1'." #: ../gtk/src/MainWindow.cc:576 ../qt/src/MainWindow.cc:529 msgid "Downloading '%1'..." msgstr "Baixando '%1'..." #: ../gtk/src/MainWindow.cc:592 ../qt/src/MainWindow.cc:543 msgid "Dictionaries installed" msgstr "Dicionários instalados" #: ../gtk/src/MainWindow.cc:592 msgid "The following dictionaries were installed:%1" msgstr "Os seguintes dicionários foram instalados:%1" #: ../gtk/src/OutputEditorHOCR.cc:319 ../qt/src/OutputEditorHOCR.cc:291 msgid "Document" msgstr "" #: ../gtk/src/OutputEditorHOCR.cc:368 ../qt/src/OutputEditorHOCR.cc:279 msgid "Monochrome" msgstr "" #: ../gtk/src/OutputEditorHOCR.cc:377 ../qt/src/OutputEditorHOCR.cc:281 msgid "Threshold (closest color)" msgstr "" #: ../gtk/src/OutputEditorHOCR.cc:380 ../qt/src/OutputEditorHOCR.cc:282 msgid "Diffuse" msgstr "" #: ../gtk/src/OutputEditorHOCR.cc:389 ../qt/src/OutputEditorHOCR.cc:283 msgid "Zip (lossless)" msgstr "" #: ../gtk/src/OutputEditorHOCR.cc:393 ../qt/src/OutputEditorHOCR.cc:284 msgid "CCITT Group 4 (lossless)" msgstr "" #: ../gtk/src/OutputEditorHOCR.cc:397 ../qt/src/OutputEditorHOCR.cc:285 msgid "Jpeg (lossy)" msgstr "" #: ../gtk/src/OutputEditorHOCR.cc:553 ../qt/src/OutputEditorHOCR.cc:429 #, fuzzy msgid "" "The following pages could not be processed:\n" "%1" msgstr "Os arquivos a seguir não puderam ser abertos: %1" #: ../gtk/src/OutputEditorHOCR.cc:554 ../qt/src/OutputEditorHOCR.cc:430 #, fuzzy msgid "Recognition errors" msgstr "Ocorreram erros de reconhecimento" #. Add tree item #: ../gtk/src/OutputEditorHOCR.cc:647 ../gtk/src/OutputEditorHOCR.cc:1037 #: ../qt/src/OutputEditorHOCR.cc:504 ../qt/src/OutputEditorHOCR.cc:894 msgid "Graphic" msgstr "" #: ../gtk/src/OutputEditorHOCR.cc:703 ../qt/src/OutputEditorHOCR.cc:563 #, fuzzy msgid "Paragraph" msgstr "Preservar parágrafos" #: ../gtk/src/OutputEditorHOCR.cc:706 ../qt/src/OutputEditorHOCR.cc:566 #, fuzzy msgid "Textline" msgstr "Arquivos de texto" #: ../gtk/src/OutputEditorHOCR.cc:1136 ../qt/src/OutputEditorHOCR.cc:950 msgid "Merge" msgstr "" #: ../gtk/src/OutputEditorHOCR.cc:1161 ../qt/src/OutputEditorHOCR.cc:977 msgid "Add graphic region" msgstr "" #: ../gtk/src/OutputEditorHOCR.cc:1177 ../qt/src/OutputEditorHOCR.cc:985 msgid "No suggestions" msgstr "" #: ../gtk/src/OutputEditorHOCR.cc:1183 ../qt/src/OutputEditorHOCR.cc:989 msgid "Add to dictionary" msgstr "" #: ../gtk/src/OutputEditorHOCR.cc:1189 ../qt/src/OutputEditorHOCR.cc:990 msgid "Ignore word" msgstr "" #: ../gtk/src/OutputEditorHOCR.cc:1222 ../qt/src/OutputEditorHOCR.cc:1007 msgid "Expand all" msgstr "" #: ../gtk/src/OutputEditorHOCR.cc:1225 ../qt/src/OutputEditorHOCR.cc:1008 #, fuzzy msgid "Collapse all" msgstr "Juntar espaços em branco" #: ../gtk/src/OutputEditorHOCR.cc:1248 ../gtk/src/OutputEditorHOCR.cc:1287 #: ../qt/src/OutputEditorHOCR.cc:1049 ../qt/src/OutputEditorHOCR.cc:1079 msgid "hOCR HTML Files" msgstr "" #: ../gtk/src/OutputEditorHOCR.cc:1249 ../qt/src/OutputEditorHOCR.cc:1049 msgid "Open hOCR File" msgstr "" #: ../gtk/src/OutputEditorHOCR.cc:1258 ../qt/src/OutputEditorHOCR.cc:1055 #, fuzzy msgid "Failed to open file" msgstr "Não foi possível abrir os arquivos" #: ../gtk/src/OutputEditorHOCR.cc:1258 ../qt/src/OutputEditorHOCR.cc:1055 #, fuzzy msgid "The file could not be opened: %1." msgstr "Os arquivos a seguir não puderam ser abertos: %1" #: ../gtk/src/OutputEditorHOCR.cc:1267 ../qt/src/OutputEditorHOCR.cc:1062 msgid "Invalid hOCR file" msgstr "" #: ../gtk/src/OutputEditorHOCR.cc:1267 ../qt/src/OutputEditorHOCR.cc:1062 msgid "The file does not appear to contain valid hOCR HTML: %1" msgstr "" #: ../gtk/src/OutputEditorHOCR.cc:1283 ../gtk/src/OutputEditorHOCR.cc:1343 #: ../gtk/src/OutputEditorText.cc:306 ../qt/src/OutputEditorHOCR.cc:1077 #: ../qt/src/OutputEditorHOCR.cc:1131 ../qt/src/OutputEditorText.cc:246 msgid "output" msgstr "saída" #: ../gtk/src/OutputEditorHOCR.cc:1288 ../qt/src/OutputEditorHOCR.cc:1079 #, fuzzy msgid "Save hOCR Output..." msgstr "Salvando saída..." #: ../gtk/src/OutputEditorHOCR.cc:1296 ../gtk/src/OutputEditorHOCR.cc:1357 #: ../gtk/src/OutputEditorText.cc:319 ../qt/src/OutputEditorHOCR.cc:1087 #: ../qt/src/OutputEditorHOCR.cc:1143 ../qt/src/OutputEditorText.cc:256 msgid "Failed to save output" msgstr "Falha ao salvar a saída" #: ../gtk/src/OutputEditorHOCR.cc:1296 ../gtk/src/OutputEditorHOCR.cc:1357 #: ../gtk/src/OutputEditorText.cc:319 ../qt/src/OutputEditorHOCR.cc:1087 #: ../qt/src/OutputEditorHOCR.cc:1143 ../qt/src/OutputEditorText.cc:256 msgid "Check that you have writing permissions in the selected folder." msgstr "Verifique se você tem permissão de escrita na pasta selecionada." #: ../gtk/src/OutputEditorHOCR.cc:1346 ../qt/src/OutputEditorHOCR.cc:1133 #, fuzzy msgid "PDF Files" msgstr "Arquivos" #: ../gtk/src/OutputEditorHOCR.cc:1347 ../qt/src/OutputEditorHOCR.cc:1133 #, fuzzy msgid "Save PDF Output..." msgstr "Salvando saída..." #: ../gtk/src/OutputEditorHOCR.cc:1375 ../qt/src/OutputEditorHOCR.cc:1157 msgid "The PDF library does not support the selected font." msgstr "" #: ../gtk/src/OutputEditorHOCR.cc:1435 ../qt/src/OutputEditorHOCR.cc:1216 #, fuzzy msgid "Errors occurred" msgstr "Ocorreram erros de reconhecimento" #: ../gtk/src/OutputEditorHOCR.cc:1435 ../qt/src/OutputEditorHOCR.cc:1216 #, fuzzy msgid "" "The following pages could not be rendered:\n" "%1" msgstr "Os arquivos a seguir não puderam ser abertos: %1" #: ../gtk/src/OutputEditorHOCR.cc:1562 ../gtk/src/OutputEditorText.cc:333 #: ../qt/src/OutputEditorHOCR.cc:1331 ../qt/src/OutputEditorText.cc:269 msgid "Output not saved" msgstr "Saída não salva" #: ../gtk/src/OutputEditorHOCR.cc:1562 ../gtk/src/OutputEditorText.cc:333 #: ../qt/src/OutputEditorHOCR.cc:1331 ../qt/src/OutputEditorText.cc:269 msgid "Save output before proceeding?" msgstr "Salvar a saída antes de continuar?" #: ../gtk/src/OutputEditorText.cc:197 ../qt/src/OutputEditorText.cc:158 msgid "Stripping line breaks..." msgstr "Removendo quebras de linhas..." #: ../gtk/src/OutputEditorText.cc:211 msgid "Check spelling" msgstr "Verificar ortografia" #: ../gtk/src/OutputEditorText.cc:238 ../qt/src/OutputEditorText.cc:178 msgid "Replacing..." msgstr "Substituindo..." #: ../gtk/src/OutputEditorText.cc:264 ../qt/src/OutputEditorText.cc:204 #, fuzzy msgid "File: %1" msgstr "Arquivos" #: ../gtk/src/OutputEditorText.cc:267 ../qt/src/OutputEditorText.cc:207 msgid "Page: %1" msgstr "" #: ../gtk/src/OutputEditorText.cc:280 ../gtk/src/Recognizer.cc:481 #: ../qt/src/Recognizer.cc:460 msgid "" "\n" "[Failed to recognize page %1]\n" msgstr "" "\n" "[Falha ao reconhecer página %1]\n" #: ../gtk/src/OutputEditorText.cc:310 ../qt/src/OutputEditorText.cc:248 msgid "Text Files" msgstr "Arquivos de texto" #: ../gtk/src/OutputEditorText.cc:311 ../qt/src/OutputEditorText.cc:248 msgid "Save Output..." msgstr "Salvando saída..." #: ../gtk/src/Recognizer.cc:156 ../qt/src/Recognizer.cc:131 msgid "" "Tesseract crashed with the following message:\n" "\n" "%1\n" "\n" "This typically happens for one of the following reasons:\n" "- Outdated traineddata files are used.\n" "- Auxiliary language data files are missing.\n" "- Corrupt language data files.\n" "\n" "Make sure your language data files are valid and compatible with tesseract " "%2." msgstr "" #: ../gtk/src/Recognizer.cc:212 ../qt/src/Recognizer.cc:191 msgid "No languages available" msgstr "Nenhum idioma disponível" #: ../gtk/src/Recognizer.cc:212 ../qt/src/Recognizer.cc:191 msgid "" "No tesseract languages are available for use. Recognition will not work." msgstr "" "Nenhum idioma do tesseract disponível para uso. O reconhecimento de " "caracteres não vai funcionar." #: ../gtk/src/Recognizer.cc:266 ../qt/src/Recognizer.cc:251 msgid "Multilingual" msgstr "Multilingual" #: ../gtk/src/Recognizer.cc:318 ../qt/src/Recognizer.cc:295 #, fuzzy msgid "Automatic page segmentation" msgstr "Orientação do painel de saída:" #: ../gtk/src/Recognizer.cc:319 ../qt/src/Recognizer.cc:296 msgid "Page segmentation with orientation and script detection" msgstr "" #: ../gtk/src/Recognizer.cc:320 ../qt/src/Recognizer.cc:297 msgid "Assume single column of text" msgstr "" #: ../gtk/src/Recognizer.cc:321 ../qt/src/Recognizer.cc:298 msgid "Assume single block of vertically aligned text" msgstr "" #: ../gtk/src/Recognizer.cc:322 ../qt/src/Recognizer.cc:299 msgid "Assume a single uniform block of text" msgstr "" #: ../gtk/src/Recognizer.cc:323 ../qt/src/Recognizer.cc:300 msgid "Assume a line of text" msgstr "" #: ../gtk/src/Recognizer.cc:324 ../qt/src/Recognizer.cc:301 msgid "Assume a single word" msgstr "" #: ../gtk/src/Recognizer.cc:325 ../qt/src/Recognizer.cc:302 msgid "Assume a single word in a circle" msgstr "" #: ../gtk/src/Recognizer.cc:326 ../qt/src/Recognizer.cc:303 msgid "Sparse text in no particular order" msgstr "" #: ../gtk/src/Recognizer.cc:327 ../qt/src/Recognizer.cc:304 msgid "Sparse text with orientation and script detection" msgstr "" #: ../gtk/src/Recognizer.cc:341 ../qt/src/Recognizer.cc:314 msgid "Page segmentation mode" msgstr "" #: ../gtk/src/Recognizer.cc:347 ../qt/src/Recognizer.cc:321 #, fuzzy msgid "Manage languages..." msgstr "Gerenciar regras de substituio" #: ../gtk/src/Recognizer.cc:403 ../qt/src/Recognizer.cc:381 #, fuzzy msgid "Current selection" msgstr "Reconhecer seleção" #: ../gtk/src/Recognizer.cc:475 ../qt/src/Recognizer.cc:454 msgid "Recognizing page %1 (%2 of %3)" msgstr "Reconhecendo página %1 (%2 de %3)" #: ../gtk/src/Recognizer.cc:480 ../qt/src/Recognizer.cc:459 #, fuzzy msgid "" "\n" "- Page %1: failed to render page" msgstr "" "\n" "\tPage %1: falha ao renderizar página" #: ../gtk/src/Recognizer.cc:510 ../gtk/src/Recognizer.cc:539 #: ../gtk/src/Recognizer.cc:552 ../qt/src/Recognizer.cc:488 #: ../qt/src/Recognizer.cc:517 ../qt/src/Recognizer.cc:530 msgid "Recognizing..." msgstr "Reconhecendo..." #: ../gtk/src/Recognizer.cc:514 ../gtk/src/Recognizer.cc:522 #: ../qt/src/Recognizer.cc:492 ../qt/src/Recognizer.cc:500 msgid "Recognition errors occurred" msgstr "Ocorreram erros de reconhecimento" #: ../gtk/src/Recognizer.cc:514 ../qt/src/Recognizer.cc:492 msgid "The following errors occurred:%1" msgstr "Os seguinte erros ocorreram:%1" #: ../gtk/src/Recognizer.cc:522 ../qt/src/Recognizer.cc:500 msgid "Failed to initialize tesseract" msgstr "Falha ao inicializar o tesseract" #: ../gtk/src/scanner/ScannerSane.cc:83 ../gtk/src/scanner/ScannerTwain.cc:287 #: ../qt/src/scanner/ScannerSane.cc:85 ../qt/src/scanner/ScannerTwain.cc:285 msgid "Scan canceled" msgstr "Digitalização cancelada" #: ../gtk/src/scanner/ScannerSane.cc:157 ../gtk/src/scanner/ScannerTwain.cc:186 #: ../qt/src/scanner/ScannerSane.cc:158 ../qt/src/scanner/ScannerTwain.cc:178 msgid "No scanner specified" msgstr "Nenhum digitalizador especificado" #: ../gtk/src/scanner/ScannerSane.cc:166 ../gtk/src/scanner/ScannerTwain.cc:195 #: ../qt/src/scanner/ScannerSane.cc:167 ../qt/src/scanner/ScannerTwain.cc:187 msgid "Unable to connect to scanner" msgstr "Não foi possível conectar ao digitalizador" #: ../gtk/src/scanner/ScannerSane.cc:386 ../gtk/src/scanner/ScannerTwain.cc:265 #: ../gtk/src/scanner/ScannerTwain.cc:291 ../qt/src/scanner/ScannerSane.cc:387 #: ../qt/src/scanner/ScannerTwain.cc:257 ../qt/src/scanner/ScannerTwain.cc:289 msgid "Unable to start scan" msgstr "Não foi possível iniciar a digitalização" #: ../gtk/src/scanner/ScannerSane.cc:394 ../gtk/src/scanner/ScannerSane.cc:437 #: ../gtk/src/scanner/ScannerTwain.cc:317 ../qt/src/scanner/ScannerSane.cc:395 #: ../qt/src/scanner/ScannerSane.cc:438 ../qt/src/scanner/ScannerTwain.cc:315 msgid "Error communicating with scanner" msgstr "Erro de comunicação com o digitalizador" #: ../gtk/src/scanner/ScannerSane.cc:498 ../qt/src/scanner/ScannerSane.cc:494 msgid "Failed to save image" msgstr "Falha ao salvar imagem" #: ../gtk/src/SourceManager.cc:118 ../qt/src/SourceManager.cc:112 msgid "Unable to open files" msgstr "Não foi possível abrir os arquivos" #: ../gtk/src/SourceManager.cc:118 ../qt/src/SourceManager.cc:112 msgid "The following files could not be opened:%1" msgstr "Os arquivos a seguir não puderam ser abertos: %1" #: ../gtk/src/SourceManager.cc:134 ../qt/src/SourceManager.cc:154 msgid "Images and PDFs" msgstr "Imagens e PDFs" #: ../gtk/src/SourceManager.cc:137 ../qt/src/SourceManager.cc:155 msgid "Select Files" msgstr "Selecione os arquivos" #: ../gtk/src/SourceManager.cc:143 ../qt/src/SourceManager.cc:166 msgid "Clipboard Error" msgstr "Erro da área de transferência" #: ../gtk/src/SourceManager.cc:143 ../qt/src/SourceManager.cc:166 msgid "Failed to read the clipboard." msgstr "Falha ao ler a área de transferência." #: ../gtk/src/SourceManager.cc:147 ../qt/src/SourceManager.cc:170 #: ../qt/src/SourceManager.cc:176 msgid "Pasted %1" msgstr "Colado %1" #: ../gtk/src/SourceManager.cc:159 ../qt/src/SourceManager.cc:183 msgid "Screenshot Error" msgstr "Erro de captura de tela" #: ../gtk/src/SourceManager.cc:159 ../qt/src/SourceManager.cc:183 msgid "Failed to take screenshot." msgstr "Falha ao capturar a tela." #: ../gtk/src/SourceManager.cc:163 ../qt/src/SourceManager.cc:187 msgid "Screenshot %1" msgstr "Captura de tela %1" #: ../gtk/src/SourceManager.cc:168 ../qt/src/SourceManager.cc:192 msgid "Saving image..." msgstr "Salvando imagem..." #: ../gtk/src/SourceManager.cc:175 ../qt/src/SourceManager.cc:205 msgid "Cannot Write File" msgstr "Não foi possível gravar o arquivo" #: ../gtk/src/SourceManager.cc:175 ../qt/src/SourceManager.cc:205 msgid "Could not write to %1." msgstr "Não foi possível escrever no arquivo %1." #: ../gtk/src/SourceManager.cc:202 ../qt/src/SourceManager.cc:227 msgid "Delete File?" msgstr "Excluir o arquivo?" #: ../gtk/src/SourceManager.cc:202 ../qt/src/SourceManager.cc:227 #, fuzzy msgid "The following files will be deleted:%1" msgstr "" "O seguinte arquivo será excluído:\n" "%1" #: ../gtk/src/SourceManager.cc:266 ../qt/src/SourceManager.cc:278 msgid "Missing File" msgstr "Arquivo ausente" #: ../gtk/src/SourceManager.cc:266 ../qt/src/SourceManager.cc:278 msgid "" "The following file has been deleted or moved:\n" "%1" msgstr "" "O seguinte arquivo foi excluído ou movido:\n" "%1" #: ../gtk/src/SubstitutionsManager.cc:39 ../qt/src/SubstitutionsManager.cc:77 msgid "Search for" msgstr "Procurar por" #: ../gtk/src/SubstitutionsManager.cc:40 ../qt/src/SubstitutionsManager.cc:77 msgid "Replace with" msgstr "Substituir com" #: ../gtk/src/SubstitutionsManager.cc:62 ../qt/src/SubstitutionsManager.cc:99 msgid "substitution_list.txt" msgstr "substituições.txt" #: ../gtk/src/SubstitutionsManager.cc:84 ../gtk/src/SubstitutionsManager.cc:119 #: ../qt/src/SubstitutionsManager.cc:114 ../qt/src/SubstitutionsManager.cc:152 msgid "Substitutions List" msgstr "Lista de substituições" #: ../gtk/src/SubstitutionsManager.cc:85 ../qt/src/SubstitutionsManager.cc:114 msgid "Open Substitutions List" msgstr "Abrir lista de substituições" #: ../gtk/src/SubstitutionsManager.cc:90 ../qt/src/SubstitutionsManager.cc:119 msgid "Error Reading File" msgstr "Erro ao ler arquivo" #: ../gtk/src/SubstitutionsManager.cc:90 ../qt/src/SubstitutionsManager.cc:119 msgid "Unable to read '%1'." msgstr "Não foi possível ler '%1'." #: ../gtk/src/SubstitutionsManager.cc:113 ../qt/src/SubstitutionsManager.cc:146 msgid "Errors Occurred Reading File" msgstr "Erros ocorreram na leitura do arquivo" #: ../gtk/src/SubstitutionsManager.cc:113 ../qt/src/SubstitutionsManager.cc:146 msgid "Some entries of the substitutions list could not be read." msgstr "Algumas entradas da lista de substituições não puderam ser lidas." #: ../gtk/src/SubstitutionsManager.cc:120 ../qt/src/SubstitutionsManager.cc:152 msgid "Save Substitutions List" msgstr "Salvar lista de substituições" #: ../gtk/src/SubstitutionsManager.cc:126 ../qt/src/SubstitutionsManager.cc:158 msgid "Error Saving File" msgstr "Erro ao salvar arquivo" #: ../gtk/src/SubstitutionsManager.cc:126 ../qt/src/SubstitutionsManager.cc:158 msgid "Unable to write to '%1'." msgstr "Não foi possível escrever em '%1'." #: ../gtk/src/SubstitutionsManager.cc:144 ../qt/src/SubstitutionsManager.cc:172 msgid "Save List?" msgstr "Salvar lista?" #: ../gtk/src/SubstitutionsManager.cc:144 ../qt/src/SubstitutionsManager.cc:172 msgid "Do you want to save the current list?" msgstr "Você deseja salvar a lista atual?" #: ../gtk/src/SubstitutionsManager.cc:179 ../qt/src/SubstitutionsManager.cc:208 msgid "Applying substitutions..." msgstr "Aplicando substituições..." #: ../gtk/src/TessdataManager.cc:58 ../qt/src/TessdataManager.cc:72 msgid "" "PackageKit is required for managing system-wide tesseract language packs, " "but it was not found. Please use the system package management software to " "manage the tesseract language packs, or switch to use the user tessdata path " "in the configuration dialog." msgstr "" #: ../gtk/src/TessdataManager.cc:63 ../qt/src/TessdataManager.cc:77 msgid "Fetching available languages" msgstr "" #: ../gtk/src/TessdataManager.cc:68 ../gtk/src/TessdataManager.cc:89 #: ../gtk/src/TessdataManager.cc:121 ../qt/src/TessdataManager.cc:82 #: ../qt/src/TessdataManager.cc:94 ../qt/src/TessdataManager.cc:127 msgid "Failed to fetch list of available languages: %1" msgstr "" #: ../gtk/src/TessdataManager.cc:100 ../gtk/src/TessdataManager.cc:129 #: ../qt/src/TessdataManager.cc:105 ../qt/src/TessdataManager.cc:114 #: ../qt/src/TessdataManager.cc:136 ../qt/src/TessdataManager.cc:147 msgid "Parsing error: %1" msgstr "" #: ../gtk/src/TessdataManager.cc:191 ../qt/src/TessdataManager.cc:191 #, fuzzy msgid "Applying changes..." msgstr "Aplicando lista de substituio..." #: ../gtk/src/TessdataManager.cc:252 ../qt/src/TessdataManager.cc:237 msgid "Failed to create directory for tessdata files." msgstr "" #: ../gtk/src/TessdataManager.cc:261 ../qt/src/TessdataManager.cc:245 #, fuzzy msgid "Downloading %1..." msgstr "Baixando '%1'..." #: ../gtk/src/TessdataManager.cc:281 ../qt/src/TessdataManager.cc:267 msgid "" "The following files could not be downloaded or removed:\n" "%1\n" "\n" "Check the connectivity and directory permissions." msgstr "" #: ../gtk/src/Utils.cc:62 msgid "Yes" msgstr "Sim" #: ../gtk/src/Utils.cc:65 msgid "No" msgstr "Não" #: ../gtk/src/Utils.cc:74 msgid "Discard" msgstr "Descartar" #: ../qt/data/AboutDialog.ui.h:1 msgid "About gImageReader" msgstr "Sobre o gImageReader" #: ../qt/data/AboutDialog.ui.h:3 #, fuzzy msgid "" "

 

A graphical frontend to tesseract-ocr

Website

 

" msgstr "" "

 

Uma interface gráfica para o tesseract-" "ocr

Site

 

" #: ../qt/data/AboutDialog.ui.h:4 msgid "Credits" msgstr "Créditos" #: ../qt/data/AboutDialog.ui.h:5 msgid "License" msgstr "Licença" #: ../qt/data/ConfigDialog.ui.h:14 msgid "System encoding" msgstr "" #: ../qt/data/ConfigDialog.ui.h:15 msgid "UTF-8" msgstr "" #: ../qt/data/ConfigDialog.ui.h:19 msgid "Text file encoding:" msgstr "" #: ../qt/data/CrashHandler.ui.h:2 #, no-c-format msgid "" "

The application has " "crashed

Apologies for the inconvenience. To help improve the " "application, please consider reporting the issue to manisandro@gmail.com. Please try to describe what you were doing before the application " "crashed. Also, include the information below. Thank you.

" msgstr "" "

A aplicação parou de " "funcionar

Pedimos desculpas pela inconveniência. Para ajudar a " "melhorar esta aplicação, por favor envie um relatório de erro para manisandro@gmail.com. Tente descrever o que você estava fazendo antes " "da aplicação parar. Inclua também a informação abaixo. Obrigado.

" #: ../qt/data/MainWindow.ui.h:1 msgid "gImageReader" msgstr "gImageReader" #. Remove & from some labels which designer insists in adding #: ../qt/data/MainWindow.ui.h:17 ../qt/src/Ui_MainWindow.hh:49 msgid "Sources" msgstr "Fontes" #: ../qt/data/MainWindow.ui.h:18 msgid "Zoom In" msgstr "Aumentar zoom" #: ../qt/data/MainWindow.ui.h:20 msgid "Zoom Out" msgstr "Diminuir zoom" #: ../qt/data/MainWindow.ui.h:22 msgid "Normal Size" msgstr "Tamanho normal" #: ../qt/data/MainWindow.ui.h:24 msgid "Best Fit" msgstr "Melhor ajuste" #: ../qt/data/MainWindow.ui.h:26 msgid "Rotate Left" msgstr "Rotacionar para a esquerda" #: ../qt/data/MainWindow.ui.h:27 msgid "Rotate left" msgstr "Rotacionar para a esquerda" #: ../qt/data/MainWindow.ui.h:28 msgid "Rotate Right" msgstr "Rotacionar para a direita" #: ../qt/data/MainWindow.ui.h:29 msgid "Rotate right" msgstr "Rotacionar para a direita" #: ../qt/data/MainWindow.ui.h:30 msgid "Image Controls" msgstr "Controles de imagem" #: ../qt/data/MainWindow.ui.h:32 msgid "Autodetect Layout" msgstr "Detectar layout automaticamente" #: ../qt/data/MainWindow.ui.h:34 msgid "Toggle Output Pane" msgstr "Alternar exibição do painel de saída" #: ../qt/src/MainWindow.cc:518 #, fuzzy msgid "Could not read %1: %2" msgstr "Não foi possível ler %1." #: ../qt/src/MainWindow.cc:543 #, fuzzy msgid "The following dictionary files were installed:%1" msgstr "Os seguintes dicionários foram instalados:%1" #: ../qt/src/Ui_MainWindow.hh:50 msgid "Output" msgstr "Saída" #: ../qt/src/Ui_MainWindow.hh:133 msgid "OCR mode:" msgstr "" #: ../qt/src/Ui_MainWindow.hh:204 msgid "Remove Image" msgstr "Remover imagem" #: ../qt/src/Ui_MainWindow.hh:207 msgid "Delete Image" msgstr "Excluir imagem" #: ../qt/src/Ui_MainWindow.hh:210 msgid "Clear List" msgstr "Limpar lista" #. Output toolbar #: ../qt/src/Ui_OutputEditorHOCR.hh:39 ../qt/src/Ui_OutputEditorHOCR.hh:40 msgid "Open hOCR file" msgstr "" #: ../qt/src/Ui_OutputEditorHOCR.hh:41 ../qt/src/Ui_OutputEditorHOCR.hh:42 #, fuzzy msgid "Save as hOCR text" msgstr "Salvar como imagem" #: ../qt/src/Ui_OutputEditorText.hh:108 msgid "Strip Line Breaks" msgstr "Remover quebras de linha" #: ../qt/src/Ui_OutputEditorText.hh:113 msgid "Find and Replace" msgstr "Localizar e substituir" #: ../qt/src/Ui_OutputEditorText.hh:122 msgid "Save Output" msgstr "Salvar saída" #: ../qt/src/Ui_OutputEditorText.hh:124 msgid "Clear Output" msgstr "Limpar saída" #, fuzzy #~ msgid "" #~ "<html><head/><body><p><span style=" font-" #~ "weight:600;">The application has crashed</span></p>" #~ "<p>Apologies for the inconvenience. To help improve the " #~ "application, please consider reporting the issue to <a href="" #~ "mailto:manisandro@gmail.com?subject=gImageReader%20Crash">" #~ "manisandro@gmail.com</a>. Please try to describe what you were " #~ "doing before the application crashed. Also, include the information " #~ "below. Thank you.</p></body></html>" #~ msgstr "" #~ "Pedimos desculpas pelo inconveniente. Para ajudar a melhorar esta " #~ "aplicao, por favor envieum relatrio de erro para manisandro@gmail.com. Tente descrever o que vocestava fazendo antes da aplicao parar. " #~ "Inclua tambma informao abaixo. Obrigado." #, fuzzy #~ msgid "" #~ "<small><b>Example:</b> 1-10, 13, 14-18</small>" #~ msgstr "Exemplo: 1-10, 13, 14-18" #~ msgid "" #~ "\n" #~ "\tFailed to initialize tesseract" #~ msgstr "" #~ "\n" #~ "\tFalha ao inicializar o tesseract" #, fuzzy #~ msgid "So&urces" #~ msgstr "Fontes" #, fuzzy #~ msgid "&Output" #~ msgstr "Sada:" #~ msgid "To recognize specific areas, drag rectangles over them." #~ msgstr "Para reconhecer áreas específicas, arraste retângulos sobre elas" #~ msgid "Rendering image..." #~ msgstr "Renderizando imagem..." #~ msgid "en_US" #~ msgstr "en_US" #, fuzzy #~ msgid "So&urces" #~ msgstr "Fontes" #, fuzzy #~ msgid "&Output" #~ msgstr "Sada" #~ msgid "Configuration" #~ msgstr "Configurao" #, fuzzy #~ msgid "Preceeded or succeeded by quote" #~ msgstr "Precedido ou sucedido por citao" #~ msgid "Select sources" #~ msgstr "Selecionar fontes" #, fuzzy #~ msgid "Preceeded by dot" #~ msgstr "Precedido por ponto" #~ msgid "Pasting clipboard..." #~ msgstr "Colando clipboard..." #~ msgid "Taking screenshot..." #~ msgstr "Tirando screenshot..." #~ msgid "Autolayout" #~ msgstr "Autolayout" #~ msgid "Options" #~ msgstr "Opes" #~ msgid "Manage list" #~ msgstr "Gerenciar lista" #~ msgid "Replacement list" #~ msgstr "Lista de substituio" #~ msgid "Select sources..." #~ msgstr "Selecione fontes..." #~ msgid "replace_list.txt" #~ msgstr "replace_list.txt" #~ msgid "Open replacement list" #~ msgstr "Abrir lista de substituio" #~ msgid "Save replacement list" #~ msgstr "Salvar lista de substituio" #~ msgid "Save the current list?" #~ msgstr "Salva a lista atual?" #~ msgid "Delete the file?" #~ msgstr "Deletar o arquivo?" gImageReader-3.2.3/po/ru.po000066400000000000000000001671661312567024200154620ustar00rootroot00000000000000# Russian translation for gImageReader package # РуÑÑкий перевод Ð´Ð»Ñ Ð¿Ð°ÐºÐµÑ‚Ð° gImageReader # Copyright (C) 2010-2017 THE GIMAGEREADER'S COPYRIGHT HOLDER # This file is distributed under the same license as the gImageReader package. # # # Oleg Moiseichuk , 2014-2017. # Sandro Mani , 2017. msgid "" msgstr "" "Project-Id-Version: \n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2017-07-01 10:34+0200\n" "PO-Revision-Date: 2017-06-30 20:18+0100\n" "Last-Translator: Sandro Mani \n" "Language-Team: English \n" "Language: ru\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n" "%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" "X-Generator: Lokalize 2.0\n" #: ../gtk/data/appmenu.ui.h:1 ../qt/src/Ui_MainWindow.hh:165 msgid "Redetect Languages" msgstr "Повторить обнаружение Ñзыков" #: ../gtk/data/appmenu.ui.h:2 ../gtk/data/gimagereader.ui.h:39 #: ../qt/data/ConfigDialog.ui.h:1 ../qt/src/Ui_MainWindow.hh:168 msgid "Preferences" msgstr "ÐаÑтройки" #: ../gtk/data/appmenu.ui.h:3 ../gtk/data/gimagereader.ui.h:40 #: ../gtk/src/MainWindow.cc:484 ../qt/src/MainWindow.cc:445 #: ../qt/src/Ui_MainWindow.hh:173 msgid "Help" msgstr "Помощь" #: ../gtk/data/appmenu.ui.h:4 ../qt/data/AboutDialog.ui.h:2 #: ../qt/src/Ui_MainWindow.hh:176 msgid "About" msgstr "О программе" #: ../gtk/data/appmenu.ui.h:5 msgid "Quit" msgstr "Выход" #: ../gtk/data/crashhandler.ui.h:1 ../qt/src/CrashHandler.cc:36 msgid "Regenerate backtrace" msgstr "Обновить обратную траÑÑировку" #: ../gtk/data/crashhandler.ui.h:2 msgid "The application has crashed" msgstr "Программа аварийно завершилаÑÑŒ" #: ../gtk/data/crashhandler.ui.h:4 #, no-c-format msgid "" "Apologies for the inconvenience. To help improve the application, please " "consider reporting the issue to manisandro@gmail.com. Please try to " "describe what you were doing before the application crashed. Also, include " "the information below. Thank you." msgstr "" "Приношу Ð¸Ð·Ð²Ð¸Ð½ÐµÐ½Ð¸Ñ Ð·Ð° неудобÑтво. Ð”Ð»Ñ ÑƒÐ»ÑƒÑ‡ÑˆÐµÐ½Ð¸Ñ Ñ€Ð°Ð±Ð¾Ñ‚Ñ‹ программы проÑьба " "Ñообщить о проблеме по адреÑу manisandro@gmail.com. ПроÑьба поÑтаратьÑÑ " "опиÑать, какие дейÑÑ‚Ð²Ð¸Ñ Ð²Ñ‹ выполнÑли перед Ñбоем программы. Также приложите " "информацию, размещённую ниже. СпаÑибо." #: ../gtk/data/editor_hocr.ui.h:1 ../qt/data/PdfExportDialog.ui.h:1 msgid "PDF Export" msgstr "ЭкÑпорт в PDF" #: ../gtk/data/editor_hocr.ui.h:2 ../gtk/data/gimagereader.ui.h:55 #: ../gtk/src/Acquirer.cc:42 ../gtk/src/FileDialogs.cc:150 #: ../gtk/src/Utils.cc:68 ../qt/data/ConfigDialog.ui.h:27 #: ../qt/data/MainWindow.ui.h:14 msgid "Cancel" msgstr "Отмена" #: ../gtk/data/editor_hocr.ui.h:3 ../gtk/data/gimagereader.ui.h:41 #: ../gtk/src/FileDialogs.cc:151 ../gtk/src/Utils.cc:59 #: ../qt/data/ConfigDialog.ui.h:26 msgid "OK" msgstr "OK" #: ../gtk/data/editor_hocr.ui.h:4 ../qt/data/PdfExportDialog.ui.h:2 msgid "Output mode:" msgstr "Режим вывода:" #: ../gtk/data/editor_hocr.ui.h:5 ../qt/data/PdfExportDialog.ui.h:3 msgid "PDF" msgstr "PDF" #: ../gtk/data/editor_hocr.ui.h:6 ../qt/data/PdfExportDialog.ui.h:4 msgid "PDF with invisible text overlay" msgstr "PDF Ñ Ð½ÐµÐ²Ð¸Ð´Ð¸Ð¼Ñ‹Ð¼ наложенным текÑтом" #: ../gtk/data/editor_hocr.ui.h:7 ../qt/data/PdfExportDialog.ui.h:16 msgid "Format:" msgstr "Формат:" #: ../gtk/data/editor_hocr.ui.h:8 ../qt/data/PdfExportDialog.ui.h:17 msgid "Compression:" msgstr "Сжатие:" #: ../gtk/data/editor_hocr.ui.h:9 ../qt/data/PdfExportDialog.ui.h:14 msgid "Compression quality:" msgstr "КачеÑтво ÑжатиÑ:" #: ../gtk/data/editor_hocr.ui.h:10 ../qt/data/PdfExportDialog.ui.h:15 msgid "DPI:" msgstr "Точек на дюйм:" #: ../gtk/data/editor_hocr.ui.h:11 ../qt/data/PdfExportDialog.ui.h:18 msgid "Dithering algorithm:" msgstr "Ðлгоритм ÑглаживаниÑ:" #: ../gtk/data/editor_hocr.ui.h:12 ../qt/data/PdfExportDialog.ui.h:13 msgid "Image settings:" msgstr "Параметры изображениÑ:" #: ../gtk/data/editor_hocr.ui.h:13 ../qt/data/PdfExportDialog.ui.h:11 msgid "Document font:" msgstr "Шрифт документа:" #: ../gtk/data/editor_hocr.ui.h:14 ../qt/data/PdfExportDialog.ui.h:7 msgid "Uniformize line and word spacing" msgstr "УравнÑть интервалы между Ñтроками и Ñловами" #: ../gtk/data/editor_hocr.ui.h:15 ../qt/data/PdfExportDialog.ui.h:10 msgid "Use detected font sizes" msgstr "ИÑпользовать размеры шрифта оригинала" #: ../gtk/data/editor_hocr.ui.h:16 ../qt/data/PdfExportDialog.ui.h:8 msgid "Preserve spaces wider than:" msgstr "Сохранить пробелы шире чем:" #: ../gtk/data/editor_hocr.ui.h:17 ../qt/data/PdfExportDialog.ui.h:12 msgid "characters" msgstr "Ñимволов" #: ../gtk/data/editor_hocr.ui.h:18 ../qt/data/PdfExportDialog.ui.h:9 msgid "Scale:" msgstr "МаÑштаб:" #: ../gtk/data/editor_hocr.ui.h:19 ../qt/data/PdfExportDialog.ui.h:6 msgid "Text settings:" msgstr "Параметры текÑта:" #: ../gtk/data/editor_hocr.ui.h:20 ../qt/data/PdfExportDialog.ui.h:5 msgid "Show preview" msgstr "Показать предпроÑмотр" #: ../gtk/data/editor_hocr.ui.h:21 ../gtk/data/editor_text.ui.h:26 #: ../qt/src/Ui_OutputEditorText.hh:123 msgid "Save output" msgstr "Сохранить результаты" #: ../gtk/data/editor_hocr.ui.h:22 ../qt/src/Ui_OutputEditorHOCR.hh:44 #: ../qt/src/Ui_OutputEditorHOCR.hh:45 msgid "Export to PDF" msgstr "ЭкÑпорт в PDF" #: ../gtk/data/editor_hocr.ui.h:23 ../gtk/data/editor_text.ui.h:27 #: ../qt/src/Ui_OutputEditorHOCR.hh:47 ../qt/src/Ui_OutputEditorHOCR.hh:48 #: ../qt/src/Ui_OutputEditorText.hh:125 msgid "Clear output" msgstr "ОчиÑтить результаты" #: ../gtk/data/editor_hocr.ui.h:24 ../qt/src/Ui_OutputEditorHOCR.hh:75 msgid "Properties" msgstr "СвойÑтва" #: ../gtk/data/editor_hocr.ui.h:25 ../qt/src/Ui_OutputEditorHOCR.hh:79 msgid "Source" msgstr "ИÑточник" #. Output insert mode #: ../gtk/data/editor_text.ui.h:1 ../qt/src/Ui_OutputEditorText.hh:59 msgid "Append to current text" msgstr "Добавить к текущему текÑту" #: ../gtk/data/editor_text.ui.h:2 ../qt/src/Ui_OutputEditorText.hh:60 msgid "Insert at cursor" msgstr "Ð’Ñтавить в позиции курÑора" #: ../gtk/data/editor_text.ui.h:3 ../qt/src/Ui_OutputEditorText.hh:61 msgid "Replace current text" msgstr "Заменить текущий текÑÑ‚" #: ../gtk/data/editor_text.ui.h:4 ../qt/src/SubstitutionsManager.cc:37 #: ../qt/src/Ui_OutputEditorText.hh:177 msgid "Substitutions" msgstr "Замены" #: ../gtk/data/editor_text.ui.h:5 ../qt/src/SubstitutionsManager.cc:42 #: ../qt/src/SubstitutionsManager.cc:43 msgid "Open" msgstr "Открыть" #: ../gtk/data/editor_text.ui.h:6 ../gtk/src/Utils.cc:71 #: ../qt/src/SubstitutionsManager.cc:45 ../qt/src/SubstitutionsManager.cc:46 msgid "Save" msgstr "Сохранить" #: ../gtk/data/editor_text.ui.h:7 ../qt/src/SubstitutionsManager.cc:48 #: ../qt/src/SubstitutionsManager.cc:49 msgid "Clear" msgstr "ОчиÑтить" #: ../gtk/data/editor_text.ui.h:8 ../qt/data/ConfigDialog.ui.h:16 #: ../qt/src/SubstitutionsManager.cc:51 ../qt/src/SubstitutionsManager.cc:52 msgid "Add" msgstr "Добавить" #: ../gtk/data/editor_text.ui.h:9 ../gtk/src/OutputEditorHOCR.cc:1202 #: ../gtk/src/OutputEditorHOCR.cc:1213 ../qt/data/ConfigDialog.ui.h:17 #: ../qt/src/OutputEditorHOCR.cc:998 ../qt/src/OutputEditorHOCR.cc:1000 #: ../qt/src/SubstitutionsManager.cc:54 ../qt/src/SubstitutionsManager.cc:55 msgid "Remove" msgstr "Удалить" #: ../gtk/data/editor_text.ui.h:10 ../gtk/data/gimagereader.ui.h:73 msgid "Apply" msgstr "Применить" #: ../gtk/data/editor_text.ui.h:11 ../gtk/data/gimagereader.ui.h:74 msgid "Close" msgstr "Закрыть" #. Output postprocessing #: ../gtk/data/editor_text.ui.h:12 ../qt/src/Ui_OutputEditorText.hh:69 msgid "Keep line break if..." msgstr "СохранÑть разрыв Ñтроки, еÑли..." #: ../gtk/data/editor_text.ui.h:13 ../qt/src/Ui_OutputEditorText.hh:71 msgid "Preceded by end mark (.?!)" msgstr "Перед ним Ñтоит знак конца Ð¿Ñ€ÐµÐ´Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ (.?!)" #: ../gtk/data/editor_text.ui.h:14 ../qt/src/Ui_OutputEditorText.hh:73 msgid "Preceded or succeeded by quote" msgstr "Перед ним или поÑле него Ñтоит кавычка" #: ../gtk/data/editor_text.ui.h:15 ../qt/src/Ui_OutputEditorText.hh:75 msgid "Other options" msgstr "Прочие опции" #: ../gtk/data/editor_text.ui.h:16 ../qt/src/Ui_OutputEditorText.hh:77 msgid "Join hyphenated words" msgstr "УдалÑть переноÑÑ‹ Ñлов" #: ../gtk/data/editor_text.ui.h:17 ../qt/src/Ui_OutputEditorText.hh:79 msgid "Collapse whitespace" msgstr "Сжимать Ñимволы пробелов" #: ../gtk/data/editor_text.ui.h:18 ../qt/src/Ui_OutputEditorText.hh:81 msgid "Preserve paragraphs" msgstr "СохранÑть абзацы" #: ../gtk/data/editor_text.ui.h:19 ../qt/src/Ui_OutputEditorText.hh:83 msgid "Visual aids" msgstr "Ð’Ñпомогательные ÑредÑтва" #: ../gtk/data/editor_text.ui.h:20 ../qt/src/Ui_OutputEditorText.hh:85 msgid "Draw whitespace" msgstr "Отображение пробелов" #: ../gtk/data/editor_text.ui.h:21 ../gtk/data/gimagereader.ui.h:31 #: ../qt/src/Ui_OutputEditorText.hh:102 msgid "Select insert mode" msgstr "Выбрать режим вÑтавки" #: ../gtk/data/editor_text.ui.h:22 ../qt/src/Ui_OutputEditorText.hh:109 msgid "Strip line breaks on selected text" msgstr "Удалить разрывы Ñтрок в выбранном текÑте" #: ../gtk/data/editor_text.ui.h:23 ../qt/src/Ui_OutputEditorText.hh:114 msgid "Find and replace" msgstr "Ðайти и заменить" #: ../gtk/data/editor_text.ui.h:24 ../qt/src/Ui_OutputEditorText.hh:116 #: ../qt/src/Ui_OutputEditorText.hh:117 msgid "Undo" msgstr "Отменить" #: ../gtk/data/editor_text.ui.h:25 ../qt/src/Ui_OutputEditorText.hh:119 #: ../qt/src/Ui_OutputEditorText.hh:120 msgid "Redo" msgstr "Вернуть" #: ../gtk/data/editor_text.ui.h:28 ../qt/src/Ui_OutputEditorText.hh:149 msgid "Find" msgstr "Ðайти" #: ../gtk/data/editor_text.ui.h:29 ../qt/src/Ui_OutputEditorText.hh:153 #: ../qt/src/Ui_OutputEditorText.hh:168 msgid "Replace" msgstr "Заменить" #: ../gtk/data/editor_text.ui.h:30 ../qt/src/Ui_OutputEditorText.hh:173 msgid "Replace all" msgstr "Заменить вÑÑ‘" #: ../gtk/data/editor_text.ui.h:31 ../qt/src/Ui_OutputEditorText.hh:163 msgid "Find previous" msgstr "Ðайти предыдущее" #: ../gtk/data/editor_text.ui.h:32 ../qt/src/Ui_OutputEditorText.hh:158 msgid "Find next" msgstr "Ðайти Ñледующее" #: ../gtk/data/editor_text.ui.h:33 ../qt/src/Ui_OutputEditorText.hh:182 msgid "Match case" msgstr "СоглаÑовать региÑтр" #: ../gtk/data/gimagereader.ui.h:1 ../qt/src/Ui_MainWindow.hh:65 msgid "Rotate current page" msgstr "Повернуть текущую Ñтраницу" #: ../gtk/data/gimagereader.ui.h:2 ../qt/src/Ui_MainWindow.hh:66 msgid "Rotate all pages" msgstr "Повернуть вÑе Ñтраницы" #: ../gtk/data/gimagereader.ui.h:3 ../qt/data/MainWindow.ui.h:35 msgid "Toggle output pane" msgstr "Показать/Ñкрыть панель результатов" #. Sources toolbar #: ../gtk/data/gimagereader.ui.h:4 ../qt/src/Ui_MainWindow.hh:187 msgid "Recent" msgstr "Предыдущие файлы" #: ../gtk/data/gimagereader.ui.h:5 ../qt/src/Ui_MainWindow.hh:188 msgid "Paste" msgstr "Ð’Ñтавить" #: ../gtk/data/gimagereader.ui.h:6 ../qt/src/Ui_MainWindow.hh:189 msgid "Take Screenshot" msgstr "Сделать Ñнимок Ñкрана" #: ../gtk/data/gimagereader.ui.h:7 ../qt/src/Ui_MainWindow.hh:200 msgid "Add images" msgstr "Добавить изображениÑ" #: ../gtk/data/gimagereader.ui.h:8 ../qt/src/Ui_MainWindow.hh:199 msgid "Add Images" msgstr "Добавить изображениÑ" #: ../gtk/data/gimagereader.ui.h:9 ../qt/src/Ui_MainWindow.hh:205 msgid "Remove image from list" msgstr "Убрать изображение из ÑпиÑка" #: ../gtk/data/gimagereader.ui.h:10 ../qt/src/Ui_MainWindow.hh:208 msgid "Delete image" msgstr "Удалить изображение" #: ../gtk/data/gimagereader.ui.h:11 ../qt/src/Ui_MainWindow.hh:211 msgid "Clear list" msgstr "ОчиÑтить ÑпиÑок" #: ../gtk/data/gimagereader.ui.h:12 ../qt/data/MainWindow.ui.h:6 msgid "Files" msgstr "Файлы" #: ../gtk/data/gimagereader.ui.h:13 ../qt/data/MainWindow.ui.h:16 msgid "Device:" msgstr "УÑтройÑтво:" #: ../gtk/data/gimagereader.ui.h:14 ../qt/data/MainWindow.ui.h:15 #: ../qt/src/TessdataManager.cc:57 msgid "Refresh" msgstr "Обновить" #: ../gtk/data/gimagereader.ui.h:15 ../qt/data/MainWindow.ui.h:12 msgid "Output:" msgstr "Сканировать в:" #: ../gtk/data/gimagereader.ui.h:16 ../qt/data/MainWindow.ui.h:9 msgid "Mode:" msgstr "Режим:" #: ../gtk/data/gimagereader.ui.h:17 ../gtk/src/OutputEditorHOCR.cc:362 #: ../qt/data/MainWindow.ui.h:11 ../qt/src/OutputEditorHOCR.cc:273 msgid "Color" msgstr "Цветной" #: ../gtk/data/gimagereader.ui.h:18 ../gtk/src/OutputEditorHOCR.cc:365 #: ../qt/data/MainWindow.ui.h:10 ../qt/src/OutputEditorHOCR.cc:275 #: ../qt/src/OutputEditorHOCR.cc:277 msgid "Grayscale" msgstr "Ð’ оттенках Ñерого" #: ../gtk/data/gimagereader.ui.h:19 ../qt/data/MainWindow.ui.h:8 msgid "Resolution:" msgstr "Разрешение:" #: ../gtk/data/gimagereader.ui.h:20 ../qt/data/MainWindow.ui.h:13 msgid "Scan" msgstr "ОтÑканировать" #: ../gtk/data/gimagereader.ui.h:21 ../qt/data/MainWindow.ui.h:7 msgid "Acquire" msgstr "Сканировать" #: ../gtk/data/gimagereader.ui.h:22 ../qt/data/MainWindow.ui.h:2 msgid "Brightness" msgstr "ЯркоÑть" #: ../gtk/data/gimagereader.ui.h:23 ../qt/data/MainWindow.ui.h:3 msgid "Contrast" msgstr "КонтраÑтноÑть" #: ../gtk/data/gimagereader.ui.h:24 ../qt/data/MainWindow.ui.h:4 msgid "Resolution" msgstr "Разрешение" #: ../gtk/data/gimagereader.ui.h:25 ../qt/data/MainWindow.ui.h:5 msgid "Invert colors" msgstr "Инвертировать цвета" #: ../gtk/data/gimagereader.ui.h:26 ../qt/data/MainWindow.ui.h:19 msgid "Zoom in" msgstr "Увеличить" #: ../gtk/data/gimagereader.ui.h:27 ../qt/data/MainWindow.ui.h:21 msgid "Zoom out" msgstr "Уменьшить" #: ../gtk/data/gimagereader.ui.h:28 ../qt/data/MainWindow.ui.h:23 msgid "Normal size" msgstr "Обычный размер" #: ../gtk/data/gimagereader.ui.h:29 ../qt/data/MainWindow.ui.h:25 msgid "Best fit" msgstr "Ðаилучшее заполнение" #: ../gtk/data/gimagereader.ui.h:30 ../qt/src/Ui_MainWindow.hh:74 msgid "Select rotation mode" msgstr "Выбрать режим вращениÑ" #: ../gtk/data/gimagereader.ui.h:32 ../qt/data/MainWindow.ui.h:31 msgid "Image controls" msgstr "Управление изображением" #: ../gtk/data/gimagereader.ui.h:33 ../qt/src/Ui_MainWindow.hh:137 msgid "Plain text" msgstr "ПроÑтой текÑÑ‚" #: ../gtk/data/gimagereader.ui.h:34 ../qt/src/Ui_MainWindow.hh:137 msgid "hOCR, PDF" msgstr "hOCR, PDF" #: ../gtk/data/gimagereader.ui.h:35 ../qt/data/MainWindow.ui.h:33 msgid "Autodetect layout" msgstr "Ðвтоопределение Ñтруктуры" #: ../gtk/data/gimagereader.ui.h:36 msgid "Recognize all" msgstr "РаÑпознать вÑÑ‘" #: ../gtk/data/gimagereader.ui.h:37 msgid "Select language" msgstr "Выбрать Ñзык" #: ../gtk/data/gimagereader.ui.h:38 msgid "A graphical frontend to tesseract-ocr" msgstr "ГрафичеÑкий Ð¸Ð½Ñ‚ÐµÑ€Ñ„ÐµÐ¹Ñ Ð´Ð»Ñ tesseract-ocr" #: ../gtk/data/gimagereader.ui.h:42 msgid "Output pane orientation:" msgstr "РаÑположение панели результатов:" #: ../gtk/data/gimagereader.ui.h:43 msgid "Horizontal" msgstr "Горизонтально" #: ../gtk/data/gimagereader.ui.h:44 msgid "Vertical" msgstr "Вертикально" #: ../gtk/data/gimagereader.ui.h:45 ../qt/data/ConfigDialog.ui.h:18 msgid "Query to install missing spellcheck dictionaries" msgstr "Ð—Ð°Ð¿Ñ€Ð¾Ñ Ð½Ð° уÑтановку недоÑтающих орфографичеÑких Ñловарей" #: ../gtk/data/gimagereader.ui.h:46 ../qt/data/ConfigDialog.ui.h:4 msgid "Automatically check for new program versions" msgstr "ÐвтоматичеÑки проверÑть наличие новых верÑий" #: ../gtk/data/gimagereader.ui.h:47 ../qt/data/ConfigDialog.ui.h:3 msgid "Predefined language definitions:" msgstr "Заданные Ð¾Ð¿Ñ€ÐµÐ´ÐµÐ»ÐµÐ½Ð¸Ñ Ñзыков:" #: ../gtk/data/gimagereader.ui.h:48 ../qt/data/ConfigDialog.ui.h:12 msgid "Additional language definitions:" msgstr "Дополнительные Ð¾Ð¿Ñ€ÐµÐ´ÐµÐ»ÐµÐ½Ð¸Ñ Ñзыков:" #: ../gtk/data/gimagereader.ui.h:49 ../qt/data/ConfigDialog.ui.h:20 msgid "The prefix of the tesseract language data file" msgstr "ÐŸÑ€ÐµÑ„Ð¸ÐºÑ Ñ„Ð°Ð¹Ð»Ð° Ñзыковых данных tesseract" #: ../gtk/data/gimagereader.ui.h:50 ../qt/data/ConfigDialog.ui.h:21 msgid "Prefix" msgstr "ПрефикÑ" #: ../gtk/data/gimagereader.ui.h:51 ../qt/data/ConfigDialog.ui.h:22 msgid "The ISO 639-1 language code followed by the country code" msgstr "Код Ñзыка (ISO 639-1) и код Ñтраны, Ñоединённые подчёркиванием" #: ../gtk/data/gimagereader.ui.h:52 ../qt/data/ConfigDialog.ui.h:23 msgid "ISO Code" msgstr "Код ISO" #: ../gtk/data/gimagereader.ui.h:53 ../qt/data/ConfigDialog.ui.h:24 msgid "The name of the language" msgstr "Ðазвание Ñзыка" #: ../gtk/data/gimagereader.ui.h:54 ../qt/data/ConfigDialog.ui.h:25 msgid "Name" msgstr "Ðазвание" #: ../gtk/data/gimagereader.ui.h:56 ../qt/data/ConfigDialog.ui.h:5 msgid "Output pane font:" msgstr "Шрифт панели результатов:" #: ../gtk/data/gimagereader.ui.h:57 ../qt/data/ConfigDialog.ui.h:2 msgid "Default" msgstr "По умолчанию" #: ../gtk/data/gimagereader.ui.h:58 ../qt/data/ConfigDialog.ui.h:6 msgid "Language data locations:" msgstr "МеÑтоположение Ñзыковых данных:" #: ../gtk/data/gimagereader.ui.h:59 ../qt/data/ConfigDialog.ui.h:13 msgid "Language definitions path:" msgstr "Размещение определений Ñзыков:" #: ../gtk/data/gimagereader.ui.h:60 ../qt/data/ConfigDialog.ui.h:28 msgid "Spelling dictionaries path:" msgstr "Размещение орфографичеÑких Ñловарей:" #: ../gtk/data/gimagereader.ui.h:61 ../qt/data/ConfigDialog.ui.h:10 msgid "System-wide paths" msgstr "ОбщеÑиÑтемные пути" #: ../gtk/data/gimagereader.ui.h:62 ../qt/data/ConfigDialog.ui.h:11 msgid "User paths" msgstr "ПользовательÑкие пути" #: ../gtk/data/gimagereader.ui.h:63 ../qt/data/PageRangeDialog.ui.h:1 msgid "Page Range" msgstr "Диапазон Ñтраниц" #: ../gtk/data/gimagereader.ui.h:64 ../qt/data/PageRangeDialog.ui.h:2 msgid "Page range:" msgstr "Диапазон Ñтраниц:" #: ../gtk/data/gimagereader.ui.h:65 ../qt/data/PageRangeDialog.ui.h:3 msgid "Example: 1-10, 13, 14-18" msgstr "Пример: 1-10, 13, 14-18" #: ../gtk/data/gimagereader.ui.h:66 ../qt/data/PageRangeDialog.ui.h:4 msgid "Recognition area:" msgstr "ОблаÑть раÑпознаваниÑ:" #: ../gtk/data/gimagereader.ui.h:67 ../gtk/src/Recognizer.cc:403 #: ../qt/data/PageRangeDialog.ui.h:5 ../qt/src/Recognizer.cc:381 msgid "Entire page" msgstr "Страница целиком" #: ../gtk/data/gimagereader.ui.h:68 ../qt/data/PageRangeDialog.ui.h:6 msgid "Autodetect" msgstr "Ðвтоопределение" #: ../gtk/data/gimagereader.ui.h:69 ../qt/data/PageRangeDialog.ui.h:7 #, fuzzy msgid "Prepend to output text:" msgstr "Добавить к текущему текÑту" #: ../gtk/data/gimagereader.ui.h:70 ../qt/data/PageRangeDialog.ui.h:8 msgid "Source filename" msgstr "" #: ../gtk/data/gimagereader.ui.h:71 ../qt/data/PageRangeDialog.ui.h:9 #, fuzzy msgid "Source page" msgstr "ИÑточник" #: ../gtk/data/gimagereader.ui.h:72 ../qt/src/TessdataManager.cc:47 msgid "Tessdata Manager" msgstr "Менеджер tessdata" #: ../gtk/data/gimagereader.ui.h:75 ../qt/src/TessdataManager.cc:49 msgid "Manage installed languages:" msgstr "Управление уÑтановленными Ñзыками:" #: ../gtk/data/gimagereader.ui.h:76 ../qt/src/DisplayerToolSelect.cc:240 msgid "Delete" msgstr "Удалить" #: ../gtk/data/gimagereader.ui.h:77 ../qt/src/DisplayerToolSelect.cc:226 msgid "Order:" msgstr "ПорÑдок:" #: ../gtk/data/gimagereader.ui.h:78 ../gtk/src/DisplayerToolHOCR.cc:28 #: ../qt/src/DisplayerToolHOCR.cc:30 ../qt/src/DisplayerToolSelect.cc:241 msgid "Recognize" msgstr "РаÑпознать" #: ../gtk/data/gimagereader.ui.h:79 ../qt/src/DisplayerToolSelect.cc:242 msgid "Recognize to clipboard" msgstr "РаÑпознать в буфер обмена" #: ../gtk/data/gimagereader.ui.h:80 ../qt/src/DisplayerToolSelect.cc:243 msgid "Save as image" msgstr "Сохранить как изображение" #: ../gtk/data/gimagereader.ui.h:81 ../qt/src/Recognizer.cc:76 msgid "Current Page" msgstr "Текущую Ñтраницу" #: ../gtk/data/gimagereader.ui.h:82 ../qt/src/Recognizer.cc:79 msgid "Multiple Pages..." msgstr "ÐеÑколько Ñтраниц..." #: ../gtk/src/Acquirer.cc:83 ../qt/src/Acquirer.cc:63 msgid "scan.png" msgstr "Ñкан.png" #: ../gtk/src/Acquirer.cc:96 ../qt/src/Acquirer.cc:80 msgid "Images" msgstr "ИзображениÑ" #: ../gtk/src/Acquirer.cc:97 ../qt/src/Acquirer.cc:81 msgid "Choose Output Filename..." msgstr "Выберите Ð¸Ð¼Ñ Ñ„Ð°Ð¹Ð»Ð° Ð´Ð»Ñ Ð·Ð°Ð¿Ð¸Ñи..." #: ../gtk/src/Acquirer.cc:112 ../qt/src/Acquirer.cc:96 msgid "Failed to initialize the scanning backend." msgstr "Ðе удалоÑÑŒ инициализировать программные ÑредÑтва ÑканированиÑ." #: ../gtk/src/Acquirer.cc:121 ../qt/src/Acquirer.cc:102 msgid "Scan failed" msgstr "Сканирование не удалоÑÑŒ" #: ../gtk/src/Acquirer.cc:139 ../qt/src/Acquirer.cc:118 msgid "No scanners were detected." msgstr "Сканеры не обнаружены." #: ../gtk/src/Acquirer.cc:156 ../gtk/src/Acquirer.cc:173 #: ../qt/src/Acquirer.cc:132 ../qt/src/Acquirer.cc:149 msgid "Starting scan..." msgstr "ЗапуÑк ÑканированиÑ..." #: ../gtk/src/Acquirer.cc:169 ../qt/src/Acquirer.cc:145 msgid "Opening device..." msgstr "Открытие уÑтройÑтва..." #: ../gtk/src/Acquirer.cc:171 ../qt/src/Acquirer.cc:147 msgid "Setting options..." msgstr "Задание уÑтановок..." #: ../gtk/src/Acquirer.cc:175 ../qt/src/Acquirer.cc:151 msgid "Getting parameters..." msgstr "Получение параметров..." #: ../gtk/src/Acquirer.cc:177 ../qt/src/Acquirer.cc:153 msgid "Transferring data..." msgstr "Передача данных..." #: ../gtk/src/Acquirer.cc:184 ../qt/src/Acquirer.cc:160 msgid "Canceling scan..." msgstr "Отмена ÑканированиÑ..." #: ../gtk/src/Config.cc:297 ../qt/data/ConfigDialog.ui.h:7 msgid "Filename prefix" msgstr "Файловый префикÑ" #: ../gtk/src/Config.cc:298 ../qt/data/ConfigDialog.ui.h:8 msgid "Code" msgstr "Код" #: ../gtk/src/Config.cc:299 ../qt/data/ConfigDialog.ui.h:9 msgid "Native name" msgstr "Родное название" #: ../gtk/src/CrashHandler.cc:26 ../gtk/src/CrashHandler.cc:43 #: ../qt/src/CrashHandler.cc:34 msgid "Crash Handler" msgstr "Обработчик Ñбоев" #: ../gtk/src/CrashHandler.cc:45 ../qt/src/CrashHandler.cc:29 msgid "Your work has been saved under %1." msgstr "Результаты вашей работы были Ñохранены в %1." #: ../gtk/src/CrashHandler.cc:47 ../qt/src/CrashHandler.cc:31 msgid "There was no unsaved work." msgstr "Результаты не изменилиÑÑŒ Ñ Ð¿Ñ€Ð¾ÑˆÐ»Ð¾Ð³Ð¾ ÑохранениÑ." #: ../gtk/src/CrashHandler.cc:106 ../qt/src/CrashHandler.cc:60 msgid "Failed to obtain backtrace. Is gdb installed?" msgstr "Ðе удалоÑÑŒ произвеÑти обратную траÑÑировку. УÑтановлен ли gdb?" #: ../gtk/src/Displayer.cc:261 ../qt/src/Displayer.cc:231 msgid "Failed to load image" msgstr "Ðе удалоÑÑŒ загрузить изображение" #: ../gtk/src/Displayer.cc:261 ../qt/src/Displayer.cc:231 msgid "" "The file might not be an image or be corrupt:\n" "%1" msgstr "" "Файл не ÑвлÑетÑÑ Ð¸Ð·Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸ÐµÐ¼ или повреждён:\n" "%1" #: ../gtk/src/DisplayerToolSelect.cc:39 ../qt/src/DisplayerToolSelect.cc:40 msgid "selection.png" msgstr "фрагмент.png" #: ../gtk/src/DisplayerToolSelect.cc:148 ../qt/src/DisplayerToolSelect.cc:139 msgid "PNG Images" msgstr "Ð˜Ð·Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸Ñ PNG" #: ../gtk/src/DisplayerToolSelect.cc:149 ../qt/src/DisplayerToolSelect.cc:139 msgid "Save Selection Image" msgstr "Сохранить выделенный фрагмент" #: ../gtk/src/DisplayerToolSelect.cc:157 ../qt/src/DisplayerToolSelect.cc:147 msgid "Recognize all" msgstr "РаÑпознать вÑÑ‘" #: ../gtk/src/DisplayerToolSelect.cc:157 ../qt/src/DisplayerToolSelect.cc:147 msgid "Recognize selection" msgstr "РаÑпознать выделенное" #: ../gtk/src/DisplayerToolSelect.cc:194 ../qt/src/DisplayerToolSelect.cc:184 msgid "Performing layout analysis" msgstr "ВыполнÑетÑÑ Ð°Ð½Ð°Ð»Ð¸Ð· Ñтруктуры" #: ../gtk/src/FileDialogs.cc:237 msgid "" "A file named \"%1\" already exists. Are you sure you want to overwrite it?" msgstr "" "Файл Ñ Ð¸Ð¼ÐµÐ½ÐµÐ¼ \"%1\" уже ÑущеÑтвует. Ð’Ñ‹ уверены, что хотите его перезапиÑать?" #: ../gtk/src/FileDialogs.cc:239 msgid "Overwrite File?" msgstr "ПерезапиÑать файл?" #: ../gtk/src/MainWindow.cc:125 ../qt/src/MainWindow.cc:274 msgid "Using tesseract" msgstr "ИÑпользуетÑÑ tesseract" #: ../gtk/src/MainWindow.cc:191 ../qt/src/MainWindow.cc:181 msgid "Select an image to begin..." msgstr "Выберите изображение Ð´Ð»Ñ Ð½Ð°Ñ‡Ð°Ð»Ð° работы..." #: ../gtk/src/MainWindow.cc:306 ../qt/src/MainWindow.cc:262 msgid "Multiple sources" msgstr "ÐеÑколько иÑточников" #: ../gtk/src/MainWindow.cc:307 ../qt/src/MainWindow.cc:263 msgid "Ready" msgstr "Готов" #: ../gtk/src/MainWindow.cc:446 ../qt/src/MainWindow.cc:390 msgid "New version" msgstr "ÐÐ¾Ð²Ð°Ñ Ð²ÐµÑ€ÑиÑ" #: ../gtk/src/MainWindow.cc:446 ../qt/src/MainWindow.cc:390 msgid "gImageReader %1 is available" msgstr "ДоÑтупен gImageReader %1" #: ../gtk/src/MainWindow.cc:447 ../qt/src/MainWindow.cc:391 msgid "Download" msgstr "Скачать" #: ../gtk/src/MainWindow.cc:448 ../qt/src/MainWindow.cc:392 msgid "Changelog" msgstr "СпиÑок изменений" #: ../gtk/src/MainWindow.cc:449 ../qt/src/MainWindow.cc:393 msgid "Don't notify again" msgstr "Больше не показывать уведомление" #: ../gtk/src/MainWindow.cc:468 ../qt/src/MainWindow.cc:438 msgid "Don't show again" msgstr "Больше не показывать" #: ../gtk/src/MainWindow.cc:469 ../gtk/src/MainWindow.cc:482 #: ../qt/src/MainWindow.cc:439 msgid "Install" msgstr "УÑтановить" #: ../gtk/src/MainWindow.cc:489 ../qt/src/MainWindow.cc:451 msgid "Spelling dictionary missing" msgstr "ОтÑутÑтвует орфографичеÑкий Ñловарь" #: ../gtk/src/MainWindow.cc:489 ../qt/src/MainWindow.cc:451 msgid "The spellcheck dictionary for %1 is not installed" msgstr "ОрфографичеÑкий Ñловарь Ð´Ð»Ñ %1 не уÑтановлен" #: ../gtk/src/MainWindow.cc:496 ../gtk/src/MainWindow.cc:528 #: ../qt/src/MainWindow.cc:458 msgid "Installing spelling dictionary for '%1'" msgstr "УÑтанавливаетÑÑ Ð¾Ñ€Ñ„Ð¾Ð³Ñ€Ð°Ñ„Ð¸Ñ‡ÐµÑкий Ñловарь Ð´Ð»Ñ '%1'" #: ../gtk/src/MainWindow.cc:517 ../gtk/src/MainWindow.cc:542 #: ../gtk/src/MainWindow.cc:550 ../gtk/src/MainWindow.cc:560 #: ../gtk/src/MainWindow.cc:566 ../gtk/src/MainWindow.cc:595 #: ../gtk/src/OutputEditorHOCR.cc:1375 ../gtk/src/Recognizer.cc:163 #: ../gtk/src/TessdataManager.cc:58 ../gtk/src/TessdataManager.cc:68 #: ../gtk/src/TessdataManager.cc:290 ../qt/src/MainWindow.cc:477 #: ../qt/src/MainWindow.cc:490 ../qt/src/MainWindow.cc:500 #: ../qt/src/MainWindow.cc:510 ../qt/src/MainWindow.cc:518 #: ../qt/src/MainWindow.cc:546 ../qt/src/OutputEditorHOCR.cc:1157 #: ../qt/src/Recognizer.cc:138 ../qt/src/TessdataManager.cc:72 #: ../qt/src/TessdataManager.cc:82 ../qt/src/TessdataManager.cc:275 msgid "Error" msgstr "Ошибка" #: ../gtk/src/MainWindow.cc:517 ../qt/src/MainWindow.cc:477 msgid "Failed to install spelling dictionary: %1" msgstr "Ðе удалоÑÑŒ уÑтановить орфографичеÑкий Ñловарь: %1" #: ../gtk/src/MainWindow.cc:542 ../qt/src/MainWindow.cc:490 msgid "Failed to create directory for spelling dictionaries." msgstr "Ðе удалоÑÑŒ Ñоздать папку Ð´Ð»Ñ Ð¾Ñ€Ñ„Ð¾Ð³Ñ€Ð°Ñ„Ð¸Ñ‡ÐµÑких Ñловарей." #: ../gtk/src/MainWindow.cc:550 ../gtk/src/MainWindow.cc:566 #: ../qt/src/MainWindow.cc:500 msgid "Could not read %1: %2." msgstr "Ðевозможно прочеÑть %1: %2." #: ../gtk/src/MainWindow.cc:560 ../gtk/src/MainWindow.cc:595 #: ../qt/src/MainWindow.cc:510 ../qt/src/MainWindow.cc:546 msgid "No spelling dictionaries found for '%1'." msgstr "ОрфографичеÑкие Ñловари Ð´Ð»Ñ '%1' не найдены." #: ../gtk/src/MainWindow.cc:576 ../qt/src/MainWindow.cc:529 msgid "Downloading '%1'..." msgstr "СкачиваетÑÑ '%1'..." #: ../gtk/src/MainWindow.cc:592 ../qt/src/MainWindow.cc:543 msgid "Dictionaries installed" msgstr "Словари уÑтановлены" #: ../gtk/src/MainWindow.cc:592 msgid "The following dictionaries were installed:%1" msgstr "Были уÑтановлены Ñледующие Ñловари:%1" #: ../gtk/src/OutputEditorHOCR.cc:319 ../qt/src/OutputEditorHOCR.cc:291 msgid "Document" msgstr "Документ" #: ../gtk/src/OutputEditorHOCR.cc:368 ../qt/src/OutputEditorHOCR.cc:279 msgid "Monochrome" msgstr "Монохромный" #: ../gtk/src/OutputEditorHOCR.cc:377 ../qt/src/OutputEditorHOCR.cc:281 msgid "Threshold (closest color)" msgstr "Пороговый (ближайший цвет)" #: ../gtk/src/OutputEditorHOCR.cc:380 ../qt/src/OutputEditorHOCR.cc:282 msgid "Diffuse" msgstr "Диффузный" #: ../gtk/src/OutputEditorHOCR.cc:389 ../qt/src/OutputEditorHOCR.cc:283 msgid "Zip (lossless)" msgstr "Zip (без потерь)" #: ../gtk/src/OutputEditorHOCR.cc:393 ../qt/src/OutputEditorHOCR.cc:284 msgid "CCITT Group 4 (lossless)" msgstr "CCITT Group 4 (без потерь)" #: ../gtk/src/OutputEditorHOCR.cc:397 ../qt/src/OutputEditorHOCR.cc:285 msgid "Jpeg (lossy)" msgstr "Jpeg (Ñ Ð¿Ð¾Ñ‚ÐµÑ€Ñми)" #: ../gtk/src/OutputEditorHOCR.cc:553 ../qt/src/OutputEditorHOCR.cc:429 msgid "" "The following pages could not be processed:\n" "%1" msgstr "" "Ðевозможно обработать Ñледующие Ñтраницы:\n" "%1" #: ../gtk/src/OutputEditorHOCR.cc:554 ../qt/src/OutputEditorHOCR.cc:430 msgid "Recognition errors" msgstr "Ошибки раÑпознаваниÑ" #. Add tree item #: ../gtk/src/OutputEditorHOCR.cc:647 ../gtk/src/OutputEditorHOCR.cc:1037 #: ../qt/src/OutputEditorHOCR.cc:504 ../qt/src/OutputEditorHOCR.cc:894 msgid "Graphic" msgstr "Графика" #: ../gtk/src/OutputEditorHOCR.cc:703 ../qt/src/OutputEditorHOCR.cc:563 msgid "Paragraph" msgstr "Ðбзац" #: ../gtk/src/OutputEditorHOCR.cc:706 ../qt/src/OutputEditorHOCR.cc:566 msgid "Textline" msgstr "Строка" #: ../gtk/src/OutputEditorHOCR.cc:1136 ../qt/src/OutputEditorHOCR.cc:950 msgid "Merge" msgstr "Объединить" #: ../gtk/src/OutputEditorHOCR.cc:1161 ../qt/src/OutputEditorHOCR.cc:977 msgid "Add graphic region" msgstr "Добавить графичеÑкую облаÑть" #: ../gtk/src/OutputEditorHOCR.cc:1177 ../qt/src/OutputEditorHOCR.cc:985 msgid "No suggestions" msgstr "Ðет вариантов" #: ../gtk/src/OutputEditorHOCR.cc:1183 ../qt/src/OutputEditorHOCR.cc:989 msgid "Add to dictionary" msgstr "Добавить в Ñловарь" #: ../gtk/src/OutputEditorHOCR.cc:1189 ../qt/src/OutputEditorHOCR.cc:990 msgid "Ignore word" msgstr "Игнорировать Ñлово" #: ../gtk/src/OutputEditorHOCR.cc:1222 ../qt/src/OutputEditorHOCR.cc:1007 msgid "Expand all" msgstr "Развернуть" #: ../gtk/src/OutputEditorHOCR.cc:1225 ../qt/src/OutputEditorHOCR.cc:1008 msgid "Collapse all" msgstr "Свернуть" #: ../gtk/src/OutputEditorHOCR.cc:1248 ../gtk/src/OutputEditorHOCR.cc:1287 #: ../qt/src/OutputEditorHOCR.cc:1049 ../qt/src/OutputEditorHOCR.cc:1079 msgid "hOCR HTML Files" msgstr "HTML-файлы hOCR" #: ../gtk/src/OutputEditorHOCR.cc:1249 ../qt/src/OutputEditorHOCR.cc:1049 msgid "Open hOCR File" msgstr "Открыть файл hOCR" #: ../gtk/src/OutputEditorHOCR.cc:1258 ../qt/src/OutputEditorHOCR.cc:1055 msgid "Failed to open file" msgstr "Ðе удалоÑÑŒ открыть файл" #: ../gtk/src/OutputEditorHOCR.cc:1258 ../qt/src/OutputEditorHOCR.cc:1055 msgid "The file could not be opened: %1." msgstr "Ðевозможно открыть файл: %1." #: ../gtk/src/OutputEditorHOCR.cc:1267 ../qt/src/OutputEditorHOCR.cc:1062 msgid "Invalid hOCR file" msgstr "Ðекорректный файл hOCR" #: ../gtk/src/OutputEditorHOCR.cc:1267 ../qt/src/OutputEditorHOCR.cc:1062 msgid "The file does not appear to contain valid hOCR HTML: %1" msgstr "Файл hOCR не Ñодержит правильной HTML-разметки: %1" #: ../gtk/src/OutputEditorHOCR.cc:1283 ../gtk/src/OutputEditorHOCR.cc:1343 #: ../gtk/src/OutputEditorText.cc:306 ../qt/src/OutputEditorHOCR.cc:1077 #: ../qt/src/OutputEditorHOCR.cc:1131 ../qt/src/OutputEditorText.cc:246 msgid "output" msgstr "результаты" #: ../gtk/src/OutputEditorHOCR.cc:1288 ../qt/src/OutputEditorHOCR.cc:1079 msgid "Save hOCR Output..." msgstr "Сохранить результаты в hOCR..." #: ../gtk/src/OutputEditorHOCR.cc:1296 ../gtk/src/OutputEditorHOCR.cc:1357 #: ../gtk/src/OutputEditorText.cc:319 ../qt/src/OutputEditorHOCR.cc:1087 #: ../qt/src/OutputEditorHOCR.cc:1143 ../qt/src/OutputEditorText.cc:256 msgid "Failed to save output" msgstr "Ðе удалоÑÑŒ Ñохранить результаты" #: ../gtk/src/OutputEditorHOCR.cc:1296 ../gtk/src/OutputEditorHOCR.cc:1357 #: ../gtk/src/OutputEditorText.cc:319 ../qt/src/OutputEditorHOCR.cc:1087 #: ../qt/src/OutputEditorHOCR.cc:1143 ../qt/src/OutputEditorText.cc:256 msgid "Check that you have writing permissions in the selected folder." msgstr "УбедитеÑÑŒ, что у Ð²Ð°Ñ ÐµÑть право на запиÑÑŒ в выбранную папку." #: ../gtk/src/OutputEditorHOCR.cc:1346 ../qt/src/OutputEditorHOCR.cc:1133 msgid "PDF Files" msgstr "Файлы PDF" #: ../gtk/src/OutputEditorHOCR.cc:1347 ../qt/src/OutputEditorHOCR.cc:1133 msgid "Save PDF Output..." msgstr "Сохранить результаты в PDF..." #: ../gtk/src/OutputEditorHOCR.cc:1375 ../qt/src/OutputEditorHOCR.cc:1157 msgid "The PDF library does not support the selected font." msgstr "Библиотека PDF не поддерживает выбранный шрифт." #: ../gtk/src/OutputEditorHOCR.cc:1435 ../qt/src/OutputEditorHOCR.cc:1216 msgid "Errors occurred" msgstr "Произошли ошибки" #: ../gtk/src/OutputEditorHOCR.cc:1435 ../qt/src/OutputEditorHOCR.cc:1216 msgid "" "The following pages could not be rendered:\n" "%1" msgstr "" "Ðевозможно отриÑовать Ñледующие Ñтраницы:\n" "%1" #: ../gtk/src/OutputEditorHOCR.cc:1562 ../gtk/src/OutputEditorText.cc:333 #: ../qt/src/OutputEditorHOCR.cc:1331 ../qt/src/OutputEditorText.cc:269 msgid "Output not saved" msgstr "Результаты не Ñохранены" #: ../gtk/src/OutputEditorHOCR.cc:1562 ../gtk/src/OutputEditorText.cc:333 #: ../qt/src/OutputEditorHOCR.cc:1331 ../qt/src/OutputEditorText.cc:269 msgid "Save output before proceeding?" msgstr "Сохранить результаты, прежде чем продолжить?" #: ../gtk/src/OutputEditorText.cc:197 ../qt/src/OutputEditorText.cc:158 msgid "Stripping line breaks..." msgstr "Удаление разрывов Ñтрок..." #: ../gtk/src/OutputEditorText.cc:211 msgid "Check spelling" msgstr "Проверить орфографию" #: ../gtk/src/OutputEditorText.cc:238 ../qt/src/OutputEditorText.cc:178 msgid "Replacing..." msgstr "Замена..." #: ../gtk/src/OutputEditorText.cc:264 ../qt/src/OutputEditorText.cc:204 #, fuzzy msgid "File: %1" msgstr "Файлы" #: ../gtk/src/OutputEditorText.cc:267 ../qt/src/OutputEditorText.cc:207 #, fuzzy msgid "Page: %1" msgstr "Ошибка анализа: %1" #: ../gtk/src/OutputEditorText.cc:280 ../gtk/src/Recognizer.cc:481 #: ../qt/src/Recognizer.cc:460 msgid "" "\n" "[Failed to recognize page %1]\n" msgstr "" "\n" "[Ðе удалоÑÑŒ раÑпознать Ñтраницу %1]\n" #: ../gtk/src/OutputEditorText.cc:310 ../qt/src/OutputEditorText.cc:248 msgid "Text Files" msgstr "ТекÑтовые файлы" #: ../gtk/src/OutputEditorText.cc:311 ../qt/src/OutputEditorText.cc:248 msgid "Save Output..." msgstr "Сохранить результаты..." #: ../gtk/src/Recognizer.cc:156 ../qt/src/Recognizer.cc:131 msgid "" "Tesseract crashed with the following message:\n" "\n" "%1\n" "\n" "This typically happens for one of the following reasons:\n" "- Outdated traineddata files are used.\n" "- Auxiliary language data files are missing.\n" "- Corrupt language data files.\n" "\n" "Make sure your language data files are valid and compatible with tesseract " "%2." msgstr "" "Tesseract аварийно завершилÑÑ Ñо Ñледующей ошибкой:\n" "\n" "%1\n" "\n" "Это обычно проиÑходит по одной из причин:\n" "- ИÑпользуютÑÑ ÑƒÑтаревшие файлы traineddata.\n" "- ОтÑутÑтвуют вÑпомогательные файлы Ñзыковых данных.\n" "- Повреждены файлы Ñзыковых данных.\n" "\n" "УбедитеÑÑŒ, что ваши файлы Ñзыковых данных в порÑдке и ÑовмеÑтимы Ñ tesseract " "%2." #: ../gtk/src/Recognizer.cc:212 ../qt/src/Recognizer.cc:191 msgid "No languages available" msgstr "Языки недоÑтупны" #: ../gtk/src/Recognizer.cc:212 ../qt/src/Recognizer.cc:191 msgid "" "No tesseract languages are available for use. Recognition will not work." msgstr "" "ÐедоÑтупны Ñзыковые файлы Ð´Ð»Ñ tesseract. РаÑпознавание работать не будет." #: ../gtk/src/Recognizer.cc:266 ../qt/src/Recognizer.cc:251 msgid "Multilingual" msgstr "ÐеÑколько Ñзыков" #: ../gtk/src/Recognizer.cc:318 ../qt/src/Recognizer.cc:295 msgid "Automatic page segmentation" msgstr "ÐвтоматичеÑкое разбиение Ñтраницы" #: ../gtk/src/Recognizer.cc:319 ../qt/src/Recognizer.cc:296 msgid "Page segmentation with orientation and script detection" msgstr "Разбиение Ñтраницы Ñ Ð¾Ð¿Ñ€ÐµÐ´ÐµÐ»ÐµÐ½Ð¸ÐµÐ¼ ориентации и Ð½Ð°Ñ‡ÐµÑ€Ñ‚Ð°Ð½Ð¸Ñ ÑˆÑ€Ð¸Ñ„Ñ‚Ð°" #: ../gtk/src/Recognizer.cc:320 ../qt/src/Recognizer.cc:297 msgid "Assume single column of text" msgstr "РаÑценивать как текÑÑ‚ в одну колонку" #: ../gtk/src/Recognizer.cc:321 ../qt/src/Recognizer.cc:298 msgid "Assume single block of vertically aligned text" msgstr "РаÑценивать как блок текÑта, выровненного по вертикали" #: ../gtk/src/Recognizer.cc:322 ../qt/src/Recognizer.cc:299 msgid "Assume a single uniform block of text" msgstr "РаÑценивать как однородный блок текÑта" #: ../gtk/src/Recognizer.cc:323 ../qt/src/Recognizer.cc:300 msgid "Assume a line of text" msgstr "РаÑценивать как Ñтроку текÑта" #: ../gtk/src/Recognizer.cc:324 ../qt/src/Recognizer.cc:301 msgid "Assume a single word" msgstr "РаÑценивать как отдельное Ñлово" #: ../gtk/src/Recognizer.cc:325 ../qt/src/Recognizer.cc:302 msgid "Assume a single word in a circle" msgstr "РаÑценивать как отдельное Ñлово в круге" #: ../gtk/src/Recognizer.cc:326 ../qt/src/Recognizer.cc:303 msgid "Sparse text in no particular order" msgstr "РаÑÑеÑнный неупорÑдоченный текÑÑ‚" #: ../gtk/src/Recognizer.cc:327 ../qt/src/Recognizer.cc:304 msgid "Sparse text with orientation and script detection" msgstr "РаÑÑеÑнный текÑÑ‚ Ñ Ð¾Ð¿Ñ€ÐµÐ´ÐµÐ»ÐµÐ½Ð¸ÐµÐ¼ ориентации и Ð½Ð°Ñ‡ÐµÑ€Ñ‚Ð°Ð½Ð¸Ñ ÑˆÑ€Ð¸Ñ„Ñ‚Ð°" #: ../gtk/src/Recognizer.cc:341 ../qt/src/Recognizer.cc:314 msgid "Page segmentation mode" msgstr "Режим Ñ€Ð°Ð·Ð±Ð¸ÐµÐ½Ð¸Ñ Ñтраницы" #: ../gtk/src/Recognizer.cc:347 ../qt/src/Recognizer.cc:321 msgid "Manage languages..." msgstr "Управление Ñзыками..." #: ../gtk/src/Recognizer.cc:403 ../qt/src/Recognizer.cc:381 msgid "Current selection" msgstr "Выделенный объект" #: ../gtk/src/Recognizer.cc:475 ../qt/src/Recognizer.cc:454 msgid "Recognizing page %1 (%2 of %3)" msgstr "РаÑпознаётÑÑ Ñтраница %1 (%2 из %3)" #: ../gtk/src/Recognizer.cc:480 ../qt/src/Recognizer.cc:459 msgid "" "\n" "- Page %1: failed to render page" msgstr "" "\n" "- Страница %1: не удалоÑÑŒ отриÑовать Ñтраницу" #: ../gtk/src/Recognizer.cc:510 ../gtk/src/Recognizer.cc:539 #: ../gtk/src/Recognizer.cc:552 ../qt/src/Recognizer.cc:488 #: ../qt/src/Recognizer.cc:517 ../qt/src/Recognizer.cc:530 msgid "Recognizing..." msgstr "ВыполнÑетÑÑ Ñ€Ð°Ñпознавание..." #: ../gtk/src/Recognizer.cc:514 ../gtk/src/Recognizer.cc:522 #: ../qt/src/Recognizer.cc:492 ../qt/src/Recognizer.cc:500 msgid "Recognition errors occurred" msgstr "Произошли ошибки раÑпознаваниÑ" #: ../gtk/src/Recognizer.cc:514 ../qt/src/Recognizer.cc:492 msgid "The following errors occurred:%1" msgstr "Произошли Ñледующие ошибки:%1" #: ../gtk/src/Recognizer.cc:522 ../qt/src/Recognizer.cc:500 msgid "Failed to initialize tesseract" msgstr "Ðе удалоÑÑŒ инициализировать tesseract" #: ../gtk/src/scanner/ScannerSane.cc:83 ../gtk/src/scanner/ScannerTwain.cc:287 #: ../qt/src/scanner/ScannerSane.cc:85 ../qt/src/scanner/ScannerTwain.cc:285 msgid "Scan canceled" msgstr "Сканирование отменено" #: ../gtk/src/scanner/ScannerSane.cc:157 ../gtk/src/scanner/ScannerTwain.cc:186 #: ../qt/src/scanner/ScannerSane.cc:158 ../qt/src/scanner/ScannerTwain.cc:178 msgid "No scanner specified" msgstr "Ðе задан Ñканер" #: ../gtk/src/scanner/ScannerSane.cc:166 ../gtk/src/scanner/ScannerTwain.cc:195 #: ../qt/src/scanner/ScannerSane.cc:167 ../qt/src/scanner/ScannerTwain.cc:187 msgid "Unable to connect to scanner" msgstr "Ðевозможно подключитьÑÑ Ðº Ñканеру" #: ../gtk/src/scanner/ScannerSane.cc:386 ../gtk/src/scanner/ScannerTwain.cc:265 #: ../gtk/src/scanner/ScannerTwain.cc:291 ../qt/src/scanner/ScannerSane.cc:387 #: ../qt/src/scanner/ScannerTwain.cc:257 ../qt/src/scanner/ScannerTwain.cc:289 msgid "Unable to start scan" msgstr "Ðевозможно начать Ñканирование" #: ../gtk/src/scanner/ScannerSane.cc:394 ../gtk/src/scanner/ScannerSane.cc:437 #: ../gtk/src/scanner/ScannerTwain.cc:317 ../qt/src/scanner/ScannerSane.cc:395 #: ../qt/src/scanner/ScannerSane.cc:438 ../qt/src/scanner/ScannerTwain.cc:315 msgid "Error communicating with scanner" msgstr "Ошибка ÑвÑзи Ñо Ñканером" #: ../gtk/src/scanner/ScannerSane.cc:498 ../qt/src/scanner/ScannerSane.cc:494 msgid "Failed to save image" msgstr "Ðе удалоÑÑŒ Ñохранить изображение" #: ../gtk/src/SourceManager.cc:118 ../qt/src/SourceManager.cc:112 msgid "Unable to open files" msgstr "Ðевозможно открыть файлы" #: ../gtk/src/SourceManager.cc:118 ../qt/src/SourceManager.cc:112 msgid "The following files could not be opened:%1" msgstr "Ðевозможно открыть Ñледующие файлы:%1" #: ../gtk/src/SourceManager.cc:134 ../qt/src/SourceManager.cc:154 msgid "Images and PDFs" msgstr "Ð˜Ð·Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸Ñ Ð¸ файлы PDF" #: ../gtk/src/SourceManager.cc:137 ../qt/src/SourceManager.cc:155 msgid "Select Files" msgstr "Выберите файлы" #: ../gtk/src/SourceManager.cc:143 ../qt/src/SourceManager.cc:166 msgid "Clipboard Error" msgstr "Ошибка буфера обмена" #: ../gtk/src/SourceManager.cc:143 ../qt/src/SourceManager.cc:166 msgid "Failed to read the clipboard." msgstr "Ðе удалоÑÑŒ прочеÑть Ñодержимое буфера обмена." #: ../gtk/src/SourceManager.cc:147 ../qt/src/SourceManager.cc:170 #: ../qt/src/SourceManager.cc:176 msgid "Pasted %1" msgstr "Буфер обмена %1" #: ../gtk/src/SourceManager.cc:159 ../qt/src/SourceManager.cc:183 msgid "Screenshot Error" msgstr "Ошибка Ð¿Ð¾Ð»ÑƒÑ‡ÐµÐ½Ð¸Ñ Ñнимка Ñкрана" #: ../gtk/src/SourceManager.cc:159 ../qt/src/SourceManager.cc:183 msgid "Failed to take screenshot." msgstr "Ðе удалоÑÑŒ Ñделать Ñнимок Ñкрана." #: ../gtk/src/SourceManager.cc:163 ../qt/src/SourceManager.cc:187 msgid "Screenshot %1" msgstr "Снимок Ñкрана %1" #: ../gtk/src/SourceManager.cc:168 ../qt/src/SourceManager.cc:192 msgid "Saving image..." msgstr "Сохранение изображениÑ..." #: ../gtk/src/SourceManager.cc:175 ../qt/src/SourceManager.cc:205 msgid "Cannot Write File" msgstr "Ðевозможно запиÑать файл" #: ../gtk/src/SourceManager.cc:175 ../qt/src/SourceManager.cc:205 msgid "Could not write to %1." msgstr "Ðевозможно запиÑать в %1." #: ../gtk/src/SourceManager.cc:202 ../qt/src/SourceManager.cc:227 msgid "Delete File?" msgstr "Удалить файл?" #: ../gtk/src/SourceManager.cc:202 ../qt/src/SourceManager.cc:227 msgid "The following files will be deleted:%1" msgstr "Будут удалены Ñледующие файлы:%1" #: ../gtk/src/SourceManager.cc:266 ../qt/src/SourceManager.cc:278 msgid "Missing File" msgstr "Файл отÑутÑтвует" #: ../gtk/src/SourceManager.cc:266 ../qt/src/SourceManager.cc:278 msgid "" "The following file has been deleted or moved:\n" "%1" msgstr "" "Следующий файл был удалён или перемещён:\n" "%1" #: ../gtk/src/SubstitutionsManager.cc:39 ../qt/src/SubstitutionsManager.cc:77 msgid "Search for" msgstr "ИÑкать" #: ../gtk/src/SubstitutionsManager.cc:40 ../qt/src/SubstitutionsManager.cc:77 msgid "Replace with" msgstr "Заменить на" #: ../gtk/src/SubstitutionsManager.cc:62 ../qt/src/SubstitutionsManager.cc:99 msgid "substitution_list.txt" msgstr "ÑпиÑок_замен.txt" #: ../gtk/src/SubstitutionsManager.cc:84 ../gtk/src/SubstitutionsManager.cc:119 #: ../qt/src/SubstitutionsManager.cc:114 ../qt/src/SubstitutionsManager.cc:152 msgid "Substitutions List" msgstr "СпиÑок замен" #: ../gtk/src/SubstitutionsManager.cc:85 ../qt/src/SubstitutionsManager.cc:114 msgid "Open Substitutions List" msgstr "Открыть ÑпиÑок замен" #: ../gtk/src/SubstitutionsManager.cc:90 ../qt/src/SubstitutionsManager.cc:119 msgid "Error Reading File" msgstr "Ошибка Ñ‡Ñ‚ÐµÐ½Ð¸Ñ Ñ„Ð°Ð¹Ð»Ð°" #: ../gtk/src/SubstitutionsManager.cc:90 ../qt/src/SubstitutionsManager.cc:119 msgid "Unable to read '%1'." msgstr "Ðевозможно прочеÑть '%1'." #: ../gtk/src/SubstitutionsManager.cc:113 ../qt/src/SubstitutionsManager.cc:146 msgid "Errors Occurred Reading File" msgstr "Произошли ошибки при чтении файла" #: ../gtk/src/SubstitutionsManager.cc:113 ../qt/src/SubstitutionsManager.cc:146 msgid "Some entries of the substitutions list could not be read." msgstr "Ðе удалоÑÑŒ прочитать некоторые Ñлементы ÑпиÑка замен." #: ../gtk/src/SubstitutionsManager.cc:120 ../qt/src/SubstitutionsManager.cc:152 msgid "Save Substitutions List" msgstr "Сохранить ÑпиÑок замен" #: ../gtk/src/SubstitutionsManager.cc:126 ../qt/src/SubstitutionsManager.cc:158 msgid "Error Saving File" msgstr "Ошибка ÑÐ¾Ñ…Ñ€Ð°Ð½ÐµÐ½Ð¸Ñ Ñ„Ð°Ð¹Ð»Ð°" #: ../gtk/src/SubstitutionsManager.cc:126 ../qt/src/SubstitutionsManager.cc:158 msgid "Unable to write to '%1'." msgstr "Ðевозможно Ñохранить в '%1'." #: ../gtk/src/SubstitutionsManager.cc:144 ../qt/src/SubstitutionsManager.cc:172 msgid "Save List?" msgstr "Сохранить ÑпиÑок?" #: ../gtk/src/SubstitutionsManager.cc:144 ../qt/src/SubstitutionsManager.cc:172 msgid "Do you want to save the current list?" msgstr "Ð’Ñ‹ хотите Ñохранить текущий ÑпиÑок?" #: ../gtk/src/SubstitutionsManager.cc:179 ../qt/src/SubstitutionsManager.cc:208 msgid "Applying substitutions..." msgstr "Применение замен..." #: ../gtk/src/TessdataManager.cc:58 ../qt/src/TessdataManager.cc:72 msgid "" "PackageKit is required for managing system-wide tesseract language packs, " "but it was not found. Please use the system package management software to " "manage the tesseract language packs, or switch to use the user tessdata path " "in the configuration dialog." msgstr "" "Ð”Ð»Ñ ÑƒÐ¿Ñ€Ð°Ð²Ð»ÐµÐ½Ð¸Ñ Ð¾Ð±Ñ‰ÐµÑиÑтемными Ñзыковыми пакетами tesseract требуетÑÑ " "PackageKit, однако он не был найден. ПроÑьба иÑпользовать ÑиÑтемный пакетный " "менеджер Ð´Ð»Ñ ÑƒÐ¿Ñ€Ð°Ð²Ð»ÐµÐ½Ð¸Ñ Ñзыковыми пакетами tesseract, либо переключитьÑÑ Ð½Ð° " "пользовательÑкий путь к tessdata в диалоге конфигурации." #: ../gtk/src/TessdataManager.cc:63 ../qt/src/TessdataManager.cc:77 msgid "Fetching available languages" msgstr "ЗапрашиваютÑÑ Ð´Ð¾Ñтупные Ñзыки" #: ../gtk/src/TessdataManager.cc:68 ../gtk/src/TessdataManager.cc:89 #: ../gtk/src/TessdataManager.cc:121 ../qt/src/TessdataManager.cc:82 #: ../qt/src/TessdataManager.cc:94 ../qt/src/TessdataManager.cc:127 msgid "Failed to fetch list of available languages: %1" msgstr "Ðе удалоÑÑŒ получить ÑпиÑок доÑтупных Ñзыков: %1" #: ../gtk/src/TessdataManager.cc:100 ../gtk/src/TessdataManager.cc:129 #: ../qt/src/TessdataManager.cc:105 ../qt/src/TessdataManager.cc:114 #: ../qt/src/TessdataManager.cc:136 ../qt/src/TessdataManager.cc:147 msgid "Parsing error: %1" msgstr "Ошибка анализа: %1" #: ../gtk/src/TessdataManager.cc:191 ../qt/src/TessdataManager.cc:191 msgid "Applying changes..." msgstr "Применение изменений..." #: ../gtk/src/TessdataManager.cc:252 ../qt/src/TessdataManager.cc:237 msgid "Failed to create directory for tessdata files." msgstr "Ðе удалоÑÑŒ Ñоздать папку Ð´Ð»Ñ Ñ„Ð°Ð¹Ð»Ð¾Ð² tessdata." #: ../gtk/src/TessdataManager.cc:261 ../qt/src/TessdataManager.cc:245 msgid "Downloading %1..." msgstr "СкачиваетÑÑ %1..." #: ../gtk/src/TessdataManager.cc:281 ../qt/src/TessdataManager.cc:267 msgid "" "The following files could not be downloaded or removed:\n" "%1\n" "\n" "Check the connectivity and directory permissions." msgstr "" "Следующие файлы не могут быть загружены или удалены:\n" "%1\n" "\n" "Проверьте Ñоединение и права доÑтупа к папкам." #: ../gtk/src/Utils.cc:62 msgid "Yes" msgstr "Да" #: ../gtk/src/Utils.cc:65 msgid "No" msgstr "Ðет" #: ../gtk/src/Utils.cc:74 msgid "Discard" msgstr "СброÑ" #: ../qt/data/AboutDialog.ui.h:1 msgid "About gImageReader" msgstr "О программе gImageReader" #: ../qt/data/AboutDialog.ui.h:3 #, fuzzy msgid "" "

 

A graphical frontend to tesseract-ocr

Website

 

" msgstr "" "

 

ГрафичеÑкий Ð¸Ð½Ñ‚ÐµÑ€Ñ„ÐµÐ¹Ñ Ð´Ð»Ñ tesseract-ocr

Сайт

 

" #: ../qt/data/AboutDialog.ui.h:4 msgid "Credits" msgstr "БлагодарноÑть" #: ../qt/data/AboutDialog.ui.h:5 msgid "License" msgstr "ЛицензиÑ" #: ../qt/data/ConfigDialog.ui.h:14 msgid "System encoding" msgstr "СиÑÑ‚ÐµÐ¼Ð½Ð°Ñ ÐºÐ¾Ð´Ð¸Ñ€Ð¾Ð²ÐºÐ°" #: ../qt/data/ConfigDialog.ui.h:15 msgid "UTF-8" msgstr "UTF-8" #: ../qt/data/ConfigDialog.ui.h:19 msgid "Text file encoding:" msgstr "Кодировка текÑтового файла:" #: ../qt/data/CrashHandler.ui.h:2 #, no-c-format msgid "" "

The application has " "crashed

Apologies for the inconvenience. To help improve the " "application, please consider reporting the issue to manisandro@gmail.com. Please try to describe what you were doing before the application " "crashed. Also, include the information below. Thank you.

" msgstr "" "

Программа аварийно " "завершилаÑÑŒ

Приношу Ð¸Ð·Ð²Ð¸Ð½ÐµÐ½Ð¸Ñ Ð·Ð° неудобÑтво. Ð”Ð»Ñ ÑƒÐ»ÑƒÑ‡ÑˆÐµÐ½Ð¸Ñ " "работы программы проÑьба Ñообщить о проблеме по адреÑу manisandro@gmail.com. ПроÑьба поÑтаратьÑÑ Ð¾Ð¿Ð¸Ñать, какие дейÑÑ‚Ð²Ð¸Ñ Ð²Ñ‹ выполнÑли перед Ñбоем " "программы. Также приложите информацию, размещённую ниже. СпаÑибо.

" #: ../qt/data/MainWindow.ui.h:1 msgid "gImageReader" msgstr "gImageReader" #. Remove & from some labels which designer insists in adding #: ../qt/data/MainWindow.ui.h:17 ../qt/src/Ui_MainWindow.hh:49 msgid "Sources" msgstr "ИÑточники" #: ../qt/data/MainWindow.ui.h:18 msgid "Zoom In" msgstr "Увеличить" #: ../qt/data/MainWindow.ui.h:20 msgid "Zoom Out" msgstr "Уменьшить" #: ../qt/data/MainWindow.ui.h:22 msgid "Normal Size" msgstr "Обычный размер" #: ../qt/data/MainWindow.ui.h:24 msgid "Best Fit" msgstr "Ðаилучшее заполнение" #: ../qt/data/MainWindow.ui.h:26 msgid "Rotate Left" msgstr "Повернуть влево" #: ../qt/data/MainWindow.ui.h:27 msgid "Rotate left" msgstr "Повернуть влево" #: ../qt/data/MainWindow.ui.h:28 msgid "Rotate Right" msgstr "Повернуть вправо" #: ../qt/data/MainWindow.ui.h:29 msgid "Rotate right" msgstr "Повернуть вправо" #: ../qt/data/MainWindow.ui.h:30 msgid "Image Controls" msgstr "Управление изображением" #: ../qt/data/MainWindow.ui.h:32 msgid "Autodetect Layout" msgstr "Ðвтоопределение Ñтруктуры" #: ../qt/data/MainWindow.ui.h:34 msgid "Toggle Output Pane" msgstr "Показать/Ñкрыть панель результатов" #: ../qt/src/MainWindow.cc:518 msgid "Could not read %1: %2" msgstr "Ðевозможно прочеÑть %1: %2" #: ../qt/src/MainWindow.cc:543 msgid "The following dictionary files were installed:%1" msgstr "Были уÑтановлены Ñледующие файлы Ñловарей:%1" #: ../qt/src/Ui_MainWindow.hh:50 msgid "Output" msgstr "Результаты" #: ../qt/src/Ui_MainWindow.hh:133 msgid "OCR mode:" msgstr "Режим раÑпознаваниÑ:" #: ../qt/src/Ui_MainWindow.hh:204 msgid "Remove Image" msgstr "Убрать изображение" #: ../qt/src/Ui_MainWindow.hh:207 msgid "Delete Image" msgstr "Удалить изображение" #: ../qt/src/Ui_MainWindow.hh:210 msgid "Clear List" msgstr "ОчиÑтить ÑпиÑок" #. Output toolbar #: ../qt/src/Ui_OutputEditorHOCR.hh:39 ../qt/src/Ui_OutputEditorHOCR.hh:40 msgid "Open hOCR file" msgstr "Открыть файл hOCR" #: ../qt/src/Ui_OutputEditorHOCR.hh:41 ../qt/src/Ui_OutputEditorHOCR.hh:42 msgid "Save as hOCR text" msgstr "Сохранить как текÑÑ‚ hOCR" #: ../qt/src/Ui_OutputEditorText.hh:108 msgid "Strip Line Breaks" msgstr "Удалить разрывы Ñтрок" #: ../qt/src/Ui_OutputEditorText.hh:113 msgid "Find and Replace" msgstr "Ðайти и заменить" #: ../qt/src/Ui_OutputEditorText.hh:122 msgid "Save Output" msgstr "Сохранить результаты" #: ../qt/src/Ui_OutputEditorText.hh:124 msgid "Clear Output" msgstr "ОчиÑтить результаты" #~ msgid "" #~ "<html><head/><body><p><span style=" font-" #~ "weight:600;">The application has crashed</span></p>" #~ "<p>Apologies for the inconvenience. To help improve the " #~ "application, please consider reporting the issue to <a href="" #~ "mailto:manisandro@gmail.com?subject=gImageReader%20Crash">" #~ "manisandro@gmail.com</a>. Please try to describe what you were " #~ "doing before the application crashed. Also, include the information " #~ "below. Thank you.</p></body></html>" #~ msgstr "" #~ "<html><head/><body><p><span style=" font-" #~ "weight:600;">Программа аварийно завершилаÑÑŒ</span></p>" #~ "<p>Приношу Ð¸Ð·Ð²Ð¸Ð½ÐµÐ½Ð¸Ñ Ð·Ð° неудобÑтво. Ð”Ð»Ñ ÑƒÐ»ÑƒÑ‡ÑˆÐµÐ½Ð¸Ñ Ñ€Ð°Ð±Ð¾Ñ‚Ñ‹ программы " #~ "проÑьба Ñообщить о проблеме по адреÑу <a href="mailto:" #~ "manisandro@gmail.com?subject=gImageReader%20Crash">" #~ "manisandro@gmail.com</a>. ПроÑьба поÑтаратьÑÑ Ð¾Ð¿Ð¸Ñать, какие " #~ "дейÑÑ‚Ð²Ð¸Ñ Ð²Ñ‹ выполнÑли перед Ñбоем программы. Также приложите информацию, " #~ "размещённую ниже. СпаÑибо.</p></body></html>" #~ msgid "" #~ "<small><b>Example:</b> 1-10, 13, 14-18</small>" #~ msgstr "" #~ "<small><b>Пример:</b> 1-10, 13, 14-18</small>" #~ msgid "Detect script and orientation" #~ msgstr "Определить начертание шрифта и ориентацию" #~ msgid "" #~ "PackageKit is required for managing tesseract language packs, but it was " #~ "not found. Please use the system package management software to manage " #~ "the tesseract language packs." #~ msgstr "" #~ "Ð”Ð»Ñ ÑƒÐ¿Ñ€Ð°Ð²Ð»ÐµÐ½Ð¸Ñ Ñзыковыми пакетами tesseract требуетÑÑ PackageKit, однако " #~ "он не был найден. ПроÑьба иÑпользовать ÑиÑтемный пакетный менеджер Ð´Ð»Ñ " #~ "ÑƒÐ¿Ñ€Ð°Ð²Ð»ÐµÐ½Ð¸Ñ Ñзыковыми пакетами tesseract." #~ msgid "" #~ "\n" #~ "\tFailed to initialize tesseract" #~ msgstr "" #~ "\n" #~ "\tÐе удалоÑÑŒ инициализировать tesseract" #~ msgid "So&urces" #~ msgstr "&ИÑточники" #~ msgid "&Output" #~ msgstr "&Результаты" #~ msgid "To recognize specific areas, drag rectangles over them." #~ msgstr "Чтобы раÑпознать отдельные облаÑти, обведите их рамкой." #~ msgid "Rendering image..." #~ msgstr "ОтриÑовка изображениÑ..." #~ msgid "en_US" #~ msgstr "ru_RU" #, fuzzy #~ msgid "So&urces" #~ msgstr "ИÑточники" #, fuzzy #~ msgid "&Output" #~ msgstr "Результаты" #~ msgid "Configuration" #~ msgstr "ÐаÑтройки" gImageReader-3.2.3/po/sl.po000066400000000000000000001461671312567024200154500ustar00rootroot00000000000000# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # Bernard Banko , 2016. # Sandro Mani , 2016, 2017. # Bernard Banko , 2017. msgid "" msgstr "" "Project-Id-Version: \n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2017-07-01 10:34+0200\n" "PO-Revision-Date: 2017-06-30 20:02+0100\n" "Last-Translator: Sandro Mani \n" "Language-Team: English \n" "Language: sl\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=4; plural=(n%100==1 ? 1 : n%100==2 ? 2 : n%100==3 || n" "%100==4 ? 3 : 0);\n" "X-Generator: Lokalize 2.0\n" #: ../gtk/data/appmenu.ui.h:1 ../qt/src/Ui_MainWindow.hh:165 msgid "Redetect Languages" msgstr "Ponovno zaznaj jezike" #: ../gtk/data/appmenu.ui.h:2 ../gtk/data/gimagereader.ui.h:39 #: ../qt/data/ConfigDialog.ui.h:1 ../qt/src/Ui_MainWindow.hh:168 msgid "Preferences" msgstr "Možnosti" #: ../gtk/data/appmenu.ui.h:3 ../gtk/data/gimagereader.ui.h:40 #: ../gtk/src/MainWindow.cc:484 ../qt/src/MainWindow.cc:445 #: ../qt/src/Ui_MainWindow.hh:173 msgid "Help" msgstr "PomoÄ" #: ../gtk/data/appmenu.ui.h:4 ../qt/data/AboutDialog.ui.h:2 #: ../qt/src/Ui_MainWindow.hh:176 msgid "About" msgstr "O programu" #: ../gtk/data/appmenu.ui.h:5 msgid "Quit" msgstr "KonÄaj" #: ../gtk/data/crashhandler.ui.h:1 ../qt/src/CrashHandler.cc:36 msgid "Regenerate backtrace" msgstr "Ponovi povratno sledenje" #: ../gtk/data/crashhandler.ui.h:2 msgid "The application has crashed" msgstr "Program se je sesul" #: ../gtk/data/crashhandler.ui.h:4 #, no-c-format msgid "" "Apologies for the inconvenience. To help improve the application, please " "consider reporting the issue to manisandro@gmail.com. Please try to " "describe what you were doing before the application crashed. Also, include " "the information below. Thank you." msgstr "" "OpraviÄujemo se za nevÅ¡eÄnosti. ÄŒe želite pomagati pri izpopolnjevanju " "programa, lahko javite napako na manisandro@gmail.com. Pri tem poizkusite " "opisati, kaj ste delali, preden se je program sesul. VkljuÄite tudi spodnje " "podatke. Hvala." #: ../gtk/data/editor_hocr.ui.h:1 ../qt/data/PdfExportDialog.ui.h:1 msgid "PDF Export" msgstr "Izvoz v PDF" #: ../gtk/data/editor_hocr.ui.h:2 ../gtk/data/gimagereader.ui.h:55 #: ../gtk/src/Acquirer.cc:42 ../gtk/src/FileDialogs.cc:150 #: ../gtk/src/Utils.cc:68 ../qt/data/ConfigDialog.ui.h:27 #: ../qt/data/MainWindow.ui.h:14 msgid "Cancel" msgstr "PrekliÄi" #: ../gtk/data/editor_hocr.ui.h:3 ../gtk/data/gimagereader.ui.h:41 #: ../gtk/src/FileDialogs.cc:151 ../gtk/src/Utils.cc:59 #: ../qt/data/ConfigDialog.ui.h:26 msgid "OK" msgstr "V redu" #: ../gtk/data/editor_hocr.ui.h:4 ../qt/data/PdfExportDialog.ui.h:2 msgid "Output mode:" msgstr "Vrsta izpisa:" #: ../gtk/data/editor_hocr.ui.h:5 ../qt/data/PdfExportDialog.ui.h:3 msgid "PDF" msgstr "PDF" #: ../gtk/data/editor_hocr.ui.h:6 ../qt/data/PdfExportDialog.ui.h:4 msgid "PDF with invisible text overlay" msgstr "PDF z nevidno plastjo besedila" #: ../gtk/data/editor_hocr.ui.h:7 ../qt/data/PdfExportDialog.ui.h:16 msgid "Format:" msgstr "Vrsta:" #: ../gtk/data/editor_hocr.ui.h:8 ../qt/data/PdfExportDialog.ui.h:17 msgid "Compression:" msgstr "Stiskanje:" #: ../gtk/data/editor_hocr.ui.h:9 ../qt/data/PdfExportDialog.ui.h:14 msgid "Compression quality:" msgstr "Kakovost stiskanja:" #: ../gtk/data/editor_hocr.ui.h:10 ../qt/data/PdfExportDialog.ui.h:15 msgid "DPI:" msgstr "DPI:" #: ../gtk/data/editor_hocr.ui.h:11 ../qt/data/PdfExportDialog.ui.h:18 msgid "Dithering algorithm:" msgstr "Algoritem razprÅ¡evanja:" #: ../gtk/data/editor_hocr.ui.h:12 ../qt/data/PdfExportDialog.ui.h:13 msgid "Image settings:" msgstr "Nastavitve slike:" #: ../gtk/data/editor_hocr.ui.h:13 ../qt/data/PdfExportDialog.ui.h:11 msgid "Document font:" msgstr "Pisava dokumenta:" #: ../gtk/data/editor_hocr.ui.h:14 ../qt/data/PdfExportDialog.ui.h:7 msgid "Uniformize line and word spacing" msgstr "Poenoti razdalje med vrsticami in besedami" #: ../gtk/data/editor_hocr.ui.h:15 ../qt/data/PdfExportDialog.ui.h:10 msgid "Use detected font sizes" msgstr "Uporabi zaznane velikosti pisave" #: ../gtk/data/editor_hocr.ui.h:16 ../qt/data/PdfExportDialog.ui.h:8 msgid "Preserve spaces wider than:" msgstr "Ohrani presledke, Å¡irÅ¡e kot:" #: ../gtk/data/editor_hocr.ui.h:17 ../qt/data/PdfExportDialog.ui.h:12 msgid "characters" msgstr "znakov" #: ../gtk/data/editor_hocr.ui.h:18 ../qt/data/PdfExportDialog.ui.h:9 msgid "Scale:" msgstr "Merilo:" #: ../gtk/data/editor_hocr.ui.h:19 ../qt/data/PdfExportDialog.ui.h:6 msgid "Text settings:" msgstr "Nastavitve besedila:" #: ../gtk/data/editor_hocr.ui.h:20 ../qt/data/PdfExportDialog.ui.h:5 msgid "Show preview" msgstr "Pokaži predogled" #: ../gtk/data/editor_hocr.ui.h:21 ../gtk/data/editor_text.ui.h:26 #: ../qt/src/Ui_OutputEditorText.hh:123 msgid "Save output" msgstr "Shrani rezultat" #: ../gtk/data/editor_hocr.ui.h:22 ../qt/src/Ui_OutputEditorHOCR.hh:44 #: ../qt/src/Ui_OutputEditorHOCR.hh:45 msgid "Export to PDF" msgstr "Izvozi v PDF" #: ../gtk/data/editor_hocr.ui.h:23 ../gtk/data/editor_text.ui.h:27 #: ../qt/src/Ui_OutputEditorHOCR.hh:47 ../qt/src/Ui_OutputEditorHOCR.hh:48 #: ../qt/src/Ui_OutputEditorText.hh:125 msgid "Clear output" msgstr "PoÄisti rezultat" #: ../gtk/data/editor_hocr.ui.h:24 ../qt/src/Ui_OutputEditorHOCR.hh:75 msgid "Properties" msgstr "Lastnosti" #: ../gtk/data/editor_hocr.ui.h:25 ../qt/src/Ui_OutputEditorHOCR.hh:79 msgid "Source" msgstr "Vir" #. Output insert mode #: ../gtk/data/editor_text.ui.h:1 ../qt/src/Ui_OutputEditorText.hh:59 msgid "Append to current text" msgstr "Pripni pod trenutno besedilo" #: ../gtk/data/editor_text.ui.h:2 ../qt/src/Ui_OutputEditorText.hh:60 msgid "Insert at cursor" msgstr "Dodaj pri kazalki" #: ../gtk/data/editor_text.ui.h:3 ../qt/src/Ui_OutputEditorText.hh:61 msgid "Replace current text" msgstr "Zamenjaj trenutno besedilo" #: ../gtk/data/editor_text.ui.h:4 ../qt/src/SubstitutionsManager.cc:37 #: ../qt/src/Ui_OutputEditorText.hh:177 msgid "Substitutions" msgstr "Zamenjave" #: ../gtk/data/editor_text.ui.h:5 ../qt/src/SubstitutionsManager.cc:42 #: ../qt/src/SubstitutionsManager.cc:43 msgid "Open" msgstr "Odpri" #: ../gtk/data/editor_text.ui.h:6 ../gtk/src/Utils.cc:71 #: ../qt/src/SubstitutionsManager.cc:45 ../qt/src/SubstitutionsManager.cc:46 msgid "Save" msgstr "Shrani" #: ../gtk/data/editor_text.ui.h:7 ../qt/src/SubstitutionsManager.cc:48 #: ../qt/src/SubstitutionsManager.cc:49 msgid "Clear" msgstr "PoÄisti" #: ../gtk/data/editor_text.ui.h:8 ../qt/data/ConfigDialog.ui.h:16 #: ../qt/src/SubstitutionsManager.cc:51 ../qt/src/SubstitutionsManager.cc:52 msgid "Add" msgstr "Dodaj" #: ../gtk/data/editor_text.ui.h:9 ../gtk/src/OutputEditorHOCR.cc:1202 #: ../gtk/src/OutputEditorHOCR.cc:1213 ../qt/data/ConfigDialog.ui.h:17 #: ../qt/src/OutputEditorHOCR.cc:998 ../qt/src/OutputEditorHOCR.cc:1000 #: ../qt/src/SubstitutionsManager.cc:54 ../qt/src/SubstitutionsManager.cc:55 msgid "Remove" msgstr "Odstrani" #: ../gtk/data/editor_text.ui.h:10 ../gtk/data/gimagereader.ui.h:73 msgid "Apply" msgstr "Uporabi" #: ../gtk/data/editor_text.ui.h:11 ../gtk/data/gimagereader.ui.h:74 msgid "Close" msgstr "Zapri" #. Output postprocessing #: ../gtk/data/editor_text.ui.h:12 ../qt/src/Ui_OutputEditorText.hh:69 msgid "Keep line break if..." msgstr "Ohrani prelom vrstice, Äe ..." #: ../gtk/data/editor_text.ui.h:13 ../qt/src/Ui_OutputEditorText.hh:71 msgid "Preceded by end mark (.?!)" msgstr "sledi loÄilu (.?!)" #: ../gtk/data/editor_text.ui.h:14 ../qt/src/Ui_OutputEditorText.hh:73 msgid "Preceded or succeeded by quote" msgstr "je pred narekovajem ali za njim" #: ../gtk/data/editor_text.ui.h:15 ../qt/src/Ui_OutputEditorText.hh:75 msgid "Other options" msgstr "Druge možnosti" #: ../gtk/data/editor_text.ui.h:16 ../qt/src/Ui_OutputEditorText.hh:77 msgid "Join hyphenated words" msgstr "Združi deljene besede" #: ../gtk/data/editor_text.ui.h:17 ../qt/src/Ui_OutputEditorText.hh:79 msgid "Collapse whitespace" msgstr "Strni presledke" #: ../gtk/data/editor_text.ui.h:18 ../qt/src/Ui_OutputEditorText.hh:81 msgid "Preserve paragraphs" msgstr "Ohrani odstavke" #: ../gtk/data/editor_text.ui.h:19 ../qt/src/Ui_OutputEditorText.hh:83 msgid "Visual aids" msgstr "Vidni pripomoÄki" #: ../gtk/data/editor_text.ui.h:20 ../qt/src/Ui_OutputEditorText.hh:85 msgid "Draw whitespace" msgstr "Pokaži presledke" #: ../gtk/data/editor_text.ui.h:21 ../gtk/data/gimagereader.ui.h:31 #: ../qt/src/Ui_OutputEditorText.hh:102 msgid "Select insert mode" msgstr "Izberi naÄin vstavljanja" #: ../gtk/data/editor_text.ui.h:22 ../qt/src/Ui_OutputEditorText.hh:109 msgid "Strip line breaks on selected text" msgstr "Odstrani prelome vrstic v izbranem besedilu" #: ../gtk/data/editor_text.ui.h:23 ../qt/src/Ui_OutputEditorText.hh:114 msgid "Find and replace" msgstr "Najdi in zamenjaj" #: ../gtk/data/editor_text.ui.h:24 ../qt/src/Ui_OutputEditorText.hh:116 #: ../qt/src/Ui_OutputEditorText.hh:117 msgid "Undo" msgstr "Razveljavi" #: ../gtk/data/editor_text.ui.h:25 ../qt/src/Ui_OutputEditorText.hh:119 #: ../qt/src/Ui_OutputEditorText.hh:120 msgid "Redo" msgstr "Obnovi" #: ../gtk/data/editor_text.ui.h:28 ../qt/src/Ui_OutputEditorText.hh:149 msgid "Find" msgstr "Najdi" #: ../gtk/data/editor_text.ui.h:29 ../qt/src/Ui_OutputEditorText.hh:153 #: ../qt/src/Ui_OutputEditorText.hh:168 msgid "Replace" msgstr "Zamenjaj" #: ../gtk/data/editor_text.ui.h:30 ../qt/src/Ui_OutputEditorText.hh:173 msgid "Replace all" msgstr "Zamenjaj vse" #: ../gtk/data/editor_text.ui.h:31 ../qt/src/Ui_OutputEditorText.hh:163 msgid "Find previous" msgstr "Najdi predhodno" #: ../gtk/data/editor_text.ui.h:32 ../qt/src/Ui_OutputEditorText.hh:158 msgid "Find next" msgstr "Najdi naslednje" #: ../gtk/data/editor_text.ui.h:33 ../qt/src/Ui_OutputEditorText.hh:182 msgid "Match case" msgstr "UpoÅ¡tevaj velikost" #: ../gtk/data/gimagereader.ui.h:1 ../qt/src/Ui_MainWindow.hh:65 msgid "Rotate current page" msgstr "Zavrti trenutno stran" #: ../gtk/data/gimagereader.ui.h:2 ../qt/src/Ui_MainWindow.hh:66 msgid "Rotate all pages" msgstr "Zavrti vse strani" #: ../gtk/data/gimagereader.ui.h:3 ../qt/data/MainWindow.ui.h:35 msgid "Toggle output pane" msgstr "Preklopi prikaz rezultata" #. Sources toolbar #: ../gtk/data/gimagereader.ui.h:4 ../qt/src/Ui_MainWindow.hh:187 msgid "Recent" msgstr "Nedavno" #: ../gtk/data/gimagereader.ui.h:5 ../qt/src/Ui_MainWindow.hh:188 msgid "Paste" msgstr "Prilepi" #: ../gtk/data/gimagereader.ui.h:6 ../qt/src/Ui_MainWindow.hh:189 msgid "Take Screenshot" msgstr "Posnemi zaslon" #: ../gtk/data/gimagereader.ui.h:7 ../qt/src/Ui_MainWindow.hh:200 msgid "Add images" msgstr "Dodaj slike" #: ../gtk/data/gimagereader.ui.h:8 ../qt/src/Ui_MainWindow.hh:199 msgid "Add Images" msgstr "Dodaj slike" #: ../gtk/data/gimagereader.ui.h:9 ../qt/src/Ui_MainWindow.hh:205 msgid "Remove image from list" msgstr "Odstrani slike s spiska" #: ../gtk/data/gimagereader.ui.h:10 ../qt/src/Ui_MainWindow.hh:208 msgid "Delete image" msgstr "ZbriÅ¡i sliko" #: ../gtk/data/gimagereader.ui.h:11 ../qt/src/Ui_MainWindow.hh:211 msgid "Clear list" msgstr "PoÄisti spisek" #: ../gtk/data/gimagereader.ui.h:12 ../qt/data/MainWindow.ui.h:6 msgid "Files" msgstr "Datoteke" #: ../gtk/data/gimagereader.ui.h:13 ../qt/data/MainWindow.ui.h:16 msgid "Device:" msgstr "Naprava:" #: ../gtk/data/gimagereader.ui.h:14 ../qt/data/MainWindow.ui.h:15 #: ../qt/src/TessdataManager.cc:57 msgid "Refresh" msgstr "Osveži" #: ../gtk/data/gimagereader.ui.h:15 ../qt/data/MainWindow.ui.h:12 msgid "Output:" msgstr "Izhod:" #: ../gtk/data/gimagereader.ui.h:16 ../qt/data/MainWindow.ui.h:9 msgid "Mode:" msgstr "NaÄin:" #: ../gtk/data/gimagereader.ui.h:17 ../gtk/src/OutputEditorHOCR.cc:362 #: ../qt/data/MainWindow.ui.h:11 ../qt/src/OutputEditorHOCR.cc:273 msgid "Color" msgstr "Barvno" #: ../gtk/data/gimagereader.ui.h:18 ../gtk/src/OutputEditorHOCR.cc:365 #: ../qt/data/MainWindow.ui.h:10 ../qt/src/OutputEditorHOCR.cc:275 #: ../qt/src/OutputEditorHOCR.cc:277 msgid "Grayscale" msgstr "Sivinsko" #: ../gtk/data/gimagereader.ui.h:19 ../qt/data/MainWindow.ui.h:8 msgid "Resolution:" msgstr "LoÄljivost:" #: ../gtk/data/gimagereader.ui.h:20 ../qt/data/MainWindow.ui.h:13 msgid "Scan" msgstr "Zaznaj" #: ../gtk/data/gimagereader.ui.h:21 ../qt/data/MainWindow.ui.h:7 msgid "Acquire" msgstr "Pridobi" #: ../gtk/data/gimagereader.ui.h:22 ../qt/data/MainWindow.ui.h:2 msgid "Brightness" msgstr "Svetlost" #: ../gtk/data/gimagereader.ui.h:23 ../qt/data/MainWindow.ui.h:3 msgid "Contrast" msgstr "Kontrast" #: ../gtk/data/gimagereader.ui.h:24 ../qt/data/MainWindow.ui.h:4 msgid "Resolution" msgstr "LoÄljivost" #: ../gtk/data/gimagereader.ui.h:25 ../qt/data/MainWindow.ui.h:5 msgid "Invert colors" msgstr "Obrni barve" #: ../gtk/data/gimagereader.ui.h:26 ../qt/data/MainWindow.ui.h:19 msgid "Zoom in" msgstr "Približaj" #: ../gtk/data/gimagereader.ui.h:27 ../qt/data/MainWindow.ui.h:21 msgid "Zoom out" msgstr "Oddalji" #: ../gtk/data/gimagereader.ui.h:28 ../qt/data/MainWindow.ui.h:23 msgid "Normal size" msgstr "Normalna velikost" #: ../gtk/data/gimagereader.ui.h:29 ../qt/data/MainWindow.ui.h:25 msgid "Best fit" msgstr "NajboljÅ¡e ujemanje" #: ../gtk/data/gimagereader.ui.h:30 ../qt/src/Ui_MainWindow.hh:74 msgid "Select rotation mode" msgstr "Izberi naÄin vrtenja" #: ../gtk/data/gimagereader.ui.h:32 ../qt/data/MainWindow.ui.h:31 msgid "Image controls" msgstr "Kontrolniki slike" #: ../gtk/data/gimagereader.ui.h:33 ../qt/src/Ui_MainWindow.hh:137 msgid "Plain text" msgstr "Neoblikovano besedilo" #: ../gtk/data/gimagereader.ui.h:34 ../qt/src/Ui_MainWindow.hh:137 msgid "hOCR, PDF" msgstr "hOCR, PDF" #: ../gtk/data/gimagereader.ui.h:35 ../qt/data/MainWindow.ui.h:33 msgid "Autodetect layout" msgstr "Samodejno zaznaj razporeditev" #: ../gtk/data/gimagereader.ui.h:36 msgid "Recognize all" msgstr "Prepoznaj vse" #: ../gtk/data/gimagereader.ui.h:37 msgid "Select language" msgstr "Izberi jezik" #: ../gtk/data/gimagereader.ui.h:38 msgid "A graphical frontend to tesseract-ocr" msgstr "GrafiÄni vmesnik za tesseract-ocr" #: ../gtk/data/gimagereader.ui.h:42 msgid "Output pane orientation:" msgstr "Postavitev rezultata:" #: ../gtk/data/gimagereader.ui.h:43 msgid "Horizontal" msgstr "Vodoravno" #: ../gtk/data/gimagereader.ui.h:44 msgid "Vertical" msgstr "NavpiÄno" #: ../gtk/data/gimagereader.ui.h:45 ../qt/data/ConfigDialog.ui.h:18 msgid "Query to install missing spellcheck dictionaries" msgstr "Poizvej za namestitev manjkajoÄih Ärkovalnikov" #: ../gtk/data/gimagereader.ui.h:46 ../qt/data/ConfigDialog.ui.h:4 msgid "Automatically check for new program versions" msgstr "Samodejno preveri morebitne posodobitve programa" #: ../gtk/data/gimagereader.ui.h:47 ../qt/data/ConfigDialog.ui.h:3 msgid "Predefined language definitions:" msgstr "PreddoloÄene nastavitve jezika:" #: ../gtk/data/gimagereader.ui.h:48 ../qt/data/ConfigDialog.ui.h:12 msgid "Additional language definitions:" msgstr "Dodatne nastavitve jezika:" #: ../gtk/data/gimagereader.ui.h:49 ../qt/data/ConfigDialog.ui.h:20 msgid "The prefix of the tesseract language data file" msgstr "Predpona datoteke z jezikovnimi podatki tesseract" #: ../gtk/data/gimagereader.ui.h:50 ../qt/data/ConfigDialog.ui.h:21 msgid "Prefix" msgstr "Predpona" #: ../gtk/data/gimagereader.ui.h:51 ../qt/data/ConfigDialog.ui.h:22 msgid "The ISO 639-1 language code followed by the country code" msgstr "Jezikovna koda ISO 639-1 s kodo države" #: ../gtk/data/gimagereader.ui.h:52 ../qt/data/ConfigDialog.ui.h:23 msgid "ISO Code" msgstr "Koda ISO" #: ../gtk/data/gimagereader.ui.h:53 ../qt/data/ConfigDialog.ui.h:24 msgid "The name of the language" msgstr "Ime jezika" #: ../gtk/data/gimagereader.ui.h:54 ../qt/data/ConfigDialog.ui.h:25 msgid "Name" msgstr "Ime" #: ../gtk/data/gimagereader.ui.h:56 ../qt/data/ConfigDialog.ui.h:5 msgid "Output pane font:" msgstr "Pisava za rezultat:" #: ../gtk/data/gimagereader.ui.h:57 ../qt/data/ConfigDialog.ui.h:2 msgid "Default" msgstr "Privzeto" #: ../gtk/data/gimagereader.ui.h:58 ../qt/data/ConfigDialog.ui.h:6 msgid "Language data locations:" msgstr "Mesta jezikovnih podatkov:" #: ../gtk/data/gimagereader.ui.h:59 ../qt/data/ConfigDialog.ui.h:13 msgid "Language definitions path:" msgstr "Pot jezikovnih doloÄil:" #: ../gtk/data/gimagereader.ui.h:60 ../qt/data/ConfigDialog.ui.h:28 msgid "Spelling dictionaries path:" msgstr "Pot slovarjev Ärkovalnika:" #: ../gtk/data/gimagereader.ui.h:61 ../qt/data/ConfigDialog.ui.h:10 msgid "System-wide paths" msgstr "Sistemske poti" #: ../gtk/data/gimagereader.ui.h:62 ../qt/data/ConfigDialog.ui.h:11 msgid "User paths" msgstr "Uporabnikove poti" #: ../gtk/data/gimagereader.ui.h:63 ../qt/data/PageRangeDialog.ui.h:1 msgid "Page Range" msgstr "Obseg strani" #: ../gtk/data/gimagereader.ui.h:64 ../qt/data/PageRangeDialog.ui.h:2 msgid "Page range:" msgstr "Obseg strani:" #: ../gtk/data/gimagereader.ui.h:65 ../qt/data/PageRangeDialog.ui.h:3 msgid "Example: 1-10, 13, 14-18" msgstr "Primer:1-10, 13, 14-18" #: ../gtk/data/gimagereader.ui.h:66 ../qt/data/PageRangeDialog.ui.h:4 msgid "Recognition area:" msgstr "PodroÄje prepoznavanja:" #: ../gtk/data/gimagereader.ui.h:67 ../gtk/src/Recognizer.cc:403 #: ../qt/data/PageRangeDialog.ui.h:5 ../qt/src/Recognizer.cc:381 msgid "Entire page" msgstr "Celotna stran" #: ../gtk/data/gimagereader.ui.h:68 ../qt/data/PageRangeDialog.ui.h:6 msgid "Autodetect" msgstr "Samodejno zaznaj" #: ../gtk/data/gimagereader.ui.h:69 ../qt/data/PageRangeDialog.ui.h:7 #, fuzzy msgid "Prepend to output text:" msgstr "Pripni pod trenutno besedilo" #: ../gtk/data/gimagereader.ui.h:70 ../qt/data/PageRangeDialog.ui.h:8 msgid "Source filename" msgstr "" #: ../gtk/data/gimagereader.ui.h:71 ../qt/data/PageRangeDialog.ui.h:9 #, fuzzy msgid "Source page" msgstr "Vir" #: ../gtk/data/gimagereader.ui.h:72 ../qt/src/TessdataManager.cc:47 msgid "Tessdata Manager" msgstr "Upravljalnik Tessdata" #: ../gtk/data/gimagereader.ui.h:75 ../qt/src/TessdataManager.cc:49 msgid "Manage installed languages:" msgstr "Upravljaj nameÅ¡Äene jezike:" #: ../gtk/data/gimagereader.ui.h:76 ../qt/src/DisplayerToolSelect.cc:240 msgid "Delete" msgstr "ZbriÅ¡i" #: ../gtk/data/gimagereader.ui.h:77 ../qt/src/DisplayerToolSelect.cc:226 msgid "Order:" msgstr "Vrstni red:" #: ../gtk/data/gimagereader.ui.h:78 ../gtk/src/DisplayerToolHOCR.cc:28 #: ../qt/src/DisplayerToolHOCR.cc:30 ../qt/src/DisplayerToolSelect.cc:241 msgid "Recognize" msgstr "Prepoznaj" #: ../gtk/data/gimagereader.ui.h:79 ../qt/src/DisplayerToolSelect.cc:242 msgid "Recognize to clipboard" msgstr "Prepoznaj na odložiÅ¡Äe" #: ../gtk/data/gimagereader.ui.h:80 ../qt/src/DisplayerToolSelect.cc:243 msgid "Save as image" msgstr "Shrani kot sliko" #: ../gtk/data/gimagereader.ui.h:81 ../qt/src/Recognizer.cc:76 msgid "Current Page" msgstr "Trenutno stran" #: ../gtk/data/gimagereader.ui.h:82 ../qt/src/Recognizer.cc:79 msgid "Multiple Pages..." msgstr "VeÄ strani ..." #: ../gtk/src/Acquirer.cc:83 ../qt/src/Acquirer.cc:63 msgid "scan.png" msgstr "scan.png" #: ../gtk/src/Acquirer.cc:96 ../qt/src/Acquirer.cc:80 msgid "Images" msgstr "Slike" #: ../gtk/src/Acquirer.cc:97 ../qt/src/Acquirer.cc:81 msgid "Choose Output Filename..." msgstr "Izberite ime datoteke za rezultat ..." #: ../gtk/src/Acquirer.cc:112 ../qt/src/Acquirer.cc:96 msgid "Failed to initialize the scanning backend." msgstr "Prednastavljanje zaledja obtiÄnega branja spodletelo." #: ../gtk/src/Acquirer.cc:121 ../qt/src/Acquirer.cc:102 msgid "Scan failed" msgstr "OptiÄno branje spodletelo" #: ../gtk/src/Acquirer.cc:139 ../qt/src/Acquirer.cc:118 msgid "No scanners were detected." msgstr "Ni zaznanega obtiÄnega bralnika." #: ../gtk/src/Acquirer.cc:156 ../gtk/src/Acquirer.cc:173 #: ../qt/src/Acquirer.cc:132 ../qt/src/Acquirer.cc:149 msgid "Starting scan..." msgstr "ZaÄenjanje branja ..." #: ../gtk/src/Acquirer.cc:169 ../qt/src/Acquirer.cc:145 msgid "Opening device..." msgstr "Odpiranje naprave ..." #: ../gtk/src/Acquirer.cc:171 ../qt/src/Acquirer.cc:147 msgid "Setting options..." msgstr "Nastavljanje možnosti ..." #: ../gtk/src/Acquirer.cc:175 ../qt/src/Acquirer.cc:151 msgid "Getting parameters..." msgstr "Pridobivanje nastavitev ..." #: ../gtk/src/Acquirer.cc:177 ../qt/src/Acquirer.cc:153 msgid "Transferring data..." msgstr "PrenaÅ¡anje podatkov ..." #: ../gtk/src/Acquirer.cc:184 ../qt/src/Acquirer.cc:160 msgid "Canceling scan..." msgstr "Preklicevanje branja ..." #: ../gtk/src/Config.cc:297 ../qt/data/ConfigDialog.ui.h:7 msgid "Filename prefix" msgstr "Predpona imena datoteke" #: ../gtk/src/Config.cc:298 ../qt/data/ConfigDialog.ui.h:8 msgid "Code" msgstr "Koda" #: ../gtk/src/Config.cc:299 ../qt/data/ConfigDialog.ui.h:9 msgid "Native name" msgstr "Izvorno ime" #: ../gtk/src/CrashHandler.cc:26 ../gtk/src/CrashHandler.cc:43 #: ../qt/src/CrashHandler.cc:34 msgid "Crash Handler" msgstr "Upravljalnik sesutij" #: ../gtk/src/CrashHandler.cc:45 ../qt/src/CrashHandler.cc:29 msgid "Your work has been saved under %1." msgstr "VaÅ¡e delo je bilo shranjeno pod %1." #: ../gtk/src/CrashHandler.cc:47 ../qt/src/CrashHandler.cc:31 msgid "There was no unsaved work." msgstr "Neshranjenega dela ni." #: ../gtk/src/CrashHandler.cc:106 ../qt/src/CrashHandler.cc:60 msgid "Failed to obtain backtrace. Is gdb installed?" msgstr "Pridobivanje povratnega sledenja spodletelo. Je gdb nameÅ¡Äen?" #: ../gtk/src/Displayer.cc:261 ../qt/src/Displayer.cc:231 msgid "Failed to load image" msgstr "Nalaganje slike spodletelo" #: ../gtk/src/Displayer.cc:261 ../qt/src/Displayer.cc:231 msgid "" "The file might not be an image or be corrupt:\n" "%1" msgstr "" "Datoteka morda ni slika ali pa je poÅ¡kodovana:\n" "%1" #: ../gtk/src/DisplayerToolSelect.cc:39 ../qt/src/DisplayerToolSelect.cc:40 msgid "selection.png" msgstr "izbor.png" #: ../gtk/src/DisplayerToolSelect.cc:148 ../qt/src/DisplayerToolSelect.cc:139 msgid "PNG Images" msgstr "Slike PNG" #: ../gtk/src/DisplayerToolSelect.cc:149 ../qt/src/DisplayerToolSelect.cc:139 msgid "Save Selection Image" msgstr "Shrani sliko izbora" #: ../gtk/src/DisplayerToolSelect.cc:157 ../qt/src/DisplayerToolSelect.cc:147 msgid "Recognize all" msgstr "Prepoznaj vse" #: ../gtk/src/DisplayerToolSelect.cc:157 ../qt/src/DisplayerToolSelect.cc:147 msgid "Recognize selection" msgstr "Prepoznaj izbor" #: ../gtk/src/DisplayerToolSelect.cc:194 ../qt/src/DisplayerToolSelect.cc:184 msgid "Performing layout analysis" msgstr "Analiziranje razporeditve" #: ../gtk/src/FileDialogs.cc:237 msgid "" "A file named \"%1\" already exists. Are you sure you want to overwrite it?" msgstr "" "Datoteka z imenom \"%1\" že obstaja. Ali ste prepriÄani, da jo želite " "prepisati?" #: ../gtk/src/FileDialogs.cc:239 msgid "Overwrite File?" msgstr "Naj bo datoteka prepisana?" #: ../gtk/src/MainWindow.cc:125 ../qt/src/MainWindow.cc:274 msgid "Using tesseract" msgstr "Uporaba tesseracta" #: ../gtk/src/MainWindow.cc:191 ../qt/src/MainWindow.cc:181 msgid "Select an image to begin..." msgstr "Izberite sliko za zaÄetek ..." #: ../gtk/src/MainWindow.cc:306 ../qt/src/MainWindow.cc:262 msgid "Multiple sources" msgstr "VeÄ virov" #: ../gtk/src/MainWindow.cc:307 ../qt/src/MainWindow.cc:263 msgid "Ready" msgstr "Pripravljeno" #: ../gtk/src/MainWindow.cc:446 ../qt/src/MainWindow.cc:390 msgid "New version" msgstr "Nova razliÄica" #: ../gtk/src/MainWindow.cc:446 ../qt/src/MainWindow.cc:390 msgid "gImageReader %1 is available" msgstr "gImageReader %1 je na voljo" #: ../gtk/src/MainWindow.cc:447 ../qt/src/MainWindow.cc:391 msgid "Download" msgstr "Prejmi" #: ../gtk/src/MainWindow.cc:448 ../qt/src/MainWindow.cc:392 msgid "Changelog" msgstr "Spremembe" #: ../gtk/src/MainWindow.cc:449 ../qt/src/MainWindow.cc:393 msgid "Don't notify again" msgstr "Ne obveÅ¡Äaj veÄ" #: ../gtk/src/MainWindow.cc:468 ../qt/src/MainWindow.cc:438 msgid "Don't show again" msgstr "Ne kaži veÄ" #: ../gtk/src/MainWindow.cc:469 ../gtk/src/MainWindow.cc:482 #: ../qt/src/MainWindow.cc:439 msgid "Install" msgstr "Namesti" #: ../gtk/src/MainWindow.cc:489 ../qt/src/MainWindow.cc:451 msgid "Spelling dictionary missing" msgstr "Slovar za Ärkovanje manjka" #: ../gtk/src/MainWindow.cc:489 ../qt/src/MainWindow.cc:451 msgid "The spellcheck dictionary for %1 is not installed" msgstr "Slovar Ärkovalnika za %1 ni nameÅ¡Äen" #: ../gtk/src/MainWindow.cc:496 ../gtk/src/MainWindow.cc:528 #: ../qt/src/MainWindow.cc:458 msgid "Installing spelling dictionary for '%1'" msgstr "NameÅ¡Äanje slovarja Ärkovalnika za '%1'" #: ../gtk/src/MainWindow.cc:517 ../gtk/src/MainWindow.cc:542 #: ../gtk/src/MainWindow.cc:550 ../gtk/src/MainWindow.cc:560 #: ../gtk/src/MainWindow.cc:566 ../gtk/src/MainWindow.cc:595 #: ../gtk/src/OutputEditorHOCR.cc:1375 ../gtk/src/Recognizer.cc:163 #: ../gtk/src/TessdataManager.cc:58 ../gtk/src/TessdataManager.cc:68 #: ../gtk/src/TessdataManager.cc:290 ../qt/src/MainWindow.cc:477 #: ../qt/src/MainWindow.cc:490 ../qt/src/MainWindow.cc:500 #: ../qt/src/MainWindow.cc:510 ../qt/src/MainWindow.cc:518 #: ../qt/src/MainWindow.cc:546 ../qt/src/OutputEditorHOCR.cc:1157 #: ../qt/src/Recognizer.cc:138 ../qt/src/TessdataManager.cc:72 #: ../qt/src/TessdataManager.cc:82 ../qt/src/TessdataManager.cc:275 msgid "Error" msgstr "Napaka" #: ../gtk/src/MainWindow.cc:517 ../qt/src/MainWindow.cc:477 msgid "Failed to install spelling dictionary: %1" msgstr "NameÅ¡Äanje slovarja Ärkovalnika spodletelo: %1" #: ../gtk/src/MainWindow.cc:542 ../qt/src/MainWindow.cc:490 msgid "Failed to create directory for spelling dictionaries." msgstr "Ustvarjanje imenika za slovarje Ärkovalnika je spodletelo." #: ../gtk/src/MainWindow.cc:550 ../gtk/src/MainWindow.cc:566 #: ../qt/src/MainWindow.cc:500 msgid "Could not read %1: %2." msgstr "Branje %1 ni bilo možno: %2." #: ../gtk/src/MainWindow.cc:560 ../gtk/src/MainWindow.cc:595 #: ../qt/src/MainWindow.cc:510 ../qt/src/MainWindow.cc:546 msgid "No spelling dictionaries found for '%1'." msgstr "Za '%1' ni bilo možno najti slovarjev." #: ../gtk/src/MainWindow.cc:576 ../qt/src/MainWindow.cc:529 msgid "Downloading '%1'..." msgstr "Prejemanje '%1' ..." #: ../gtk/src/MainWindow.cc:592 ../qt/src/MainWindow.cc:543 msgid "Dictionaries installed" msgstr "Slovarji nameÅ¡Äeni" #: ../gtk/src/MainWindow.cc:592 msgid "The following dictionaries were installed:%1" msgstr "Naslednji slovarji so bili nameÅ¡Äeni: %1" #: ../gtk/src/OutputEditorHOCR.cc:319 ../qt/src/OutputEditorHOCR.cc:291 msgid "Document" msgstr "Dokument" #: ../gtk/src/OutputEditorHOCR.cc:368 ../qt/src/OutputEditorHOCR.cc:279 msgid "Monochrome" msgstr "Enobarvno" #: ../gtk/src/OutputEditorHOCR.cc:377 ../qt/src/OutputEditorHOCR.cc:281 msgid "Threshold (closest color)" msgstr "Prag (najbližja barva)" #: ../gtk/src/OutputEditorHOCR.cc:380 ../qt/src/OutputEditorHOCR.cc:282 msgid "Diffuse" msgstr "Difuzno" #: ../gtk/src/OutputEditorHOCR.cc:389 ../qt/src/OutputEditorHOCR.cc:283 msgid "Zip (lossless)" msgstr "Zip (brezizgubno)" #: ../gtk/src/OutputEditorHOCR.cc:393 ../qt/src/OutputEditorHOCR.cc:284 msgid "CCITT Group 4 (lossless)" msgstr "CCITT Group 4 (brezizgubno)" #: ../gtk/src/OutputEditorHOCR.cc:397 ../qt/src/OutputEditorHOCR.cc:285 msgid "Jpeg (lossy)" msgstr "Jpeg (izgubno)" #: ../gtk/src/OutputEditorHOCR.cc:553 ../qt/src/OutputEditorHOCR.cc:429 msgid "" "The following pages could not be processed:\n" "%1" msgstr "" "Naslednjih strani ni bilo mogoÄe obdelati:\n" "%1" #: ../gtk/src/OutputEditorHOCR.cc:554 ../qt/src/OutputEditorHOCR.cc:430 msgid "Recognition errors" msgstr "Napake pri prepoznavanju" #. Add tree item #: ../gtk/src/OutputEditorHOCR.cc:647 ../gtk/src/OutputEditorHOCR.cc:1037 #: ../qt/src/OutputEditorHOCR.cc:504 ../qt/src/OutputEditorHOCR.cc:894 msgid "Graphic" msgstr "Grafika" #: ../gtk/src/OutputEditorHOCR.cc:703 ../qt/src/OutputEditorHOCR.cc:563 msgid "Paragraph" msgstr "Odstavek" #: ../gtk/src/OutputEditorHOCR.cc:706 ../qt/src/OutputEditorHOCR.cc:566 msgid "Textline" msgstr "Vrstica" #: ../gtk/src/OutputEditorHOCR.cc:1136 ../qt/src/OutputEditorHOCR.cc:950 msgid "Merge" msgstr "Združi" #: ../gtk/src/OutputEditorHOCR.cc:1161 ../qt/src/OutputEditorHOCR.cc:977 msgid "Add graphic region" msgstr "Dodaj podroÄje grafike" #: ../gtk/src/OutputEditorHOCR.cc:1177 ../qt/src/OutputEditorHOCR.cc:985 msgid "No suggestions" msgstr "Ni predlogov" #: ../gtk/src/OutputEditorHOCR.cc:1183 ../qt/src/OutputEditorHOCR.cc:989 msgid "Add to dictionary" msgstr "Dodaj v slovar" #: ../gtk/src/OutputEditorHOCR.cc:1189 ../qt/src/OutputEditorHOCR.cc:990 msgid "Ignore word" msgstr "Prezri besedo" #: ../gtk/src/OutputEditorHOCR.cc:1222 ../qt/src/OutputEditorHOCR.cc:1007 msgid "Expand all" msgstr "RazÅ¡iri" #: ../gtk/src/OutputEditorHOCR.cc:1225 ../qt/src/OutputEditorHOCR.cc:1008 msgid "Collapse all" msgstr "Zloži" #: ../gtk/src/OutputEditorHOCR.cc:1248 ../gtk/src/OutputEditorHOCR.cc:1287 #: ../qt/src/OutputEditorHOCR.cc:1049 ../qt/src/OutputEditorHOCR.cc:1079 msgid "hOCR HTML Files" msgstr "Datoteke hOCR HTML" #: ../gtk/src/OutputEditorHOCR.cc:1249 ../qt/src/OutputEditorHOCR.cc:1049 msgid "Open hOCR File" msgstr "Odpri datoteko hOCR" #: ../gtk/src/OutputEditorHOCR.cc:1258 ../qt/src/OutputEditorHOCR.cc:1055 msgid "Failed to open file" msgstr "Odpiranje datoteke spodletelo" #: ../gtk/src/OutputEditorHOCR.cc:1258 ../qt/src/OutputEditorHOCR.cc:1055 msgid "The file could not be opened: %1." msgstr "Datoteke ni bilo mogoÄe odpreti: %1." #: ../gtk/src/OutputEditorHOCR.cc:1267 ../qt/src/OutputEditorHOCR.cc:1062 msgid "Invalid hOCR file" msgstr "Neveljavna datoteka hOCR" #: ../gtk/src/OutputEditorHOCR.cc:1267 ../qt/src/OutputEditorHOCR.cc:1062 msgid "The file does not appear to contain valid hOCR HTML: %1" msgstr "Ni videti, da bi imela datoteka veljaven zapis hOCR HTML: %1" #: ../gtk/src/OutputEditorHOCR.cc:1283 ../gtk/src/OutputEditorHOCR.cc:1343 #: ../gtk/src/OutputEditorText.cc:306 ../qt/src/OutputEditorHOCR.cc:1077 #: ../qt/src/OutputEditorHOCR.cc:1131 ../qt/src/OutputEditorText.cc:246 msgid "output" msgstr "rezultat" #: ../gtk/src/OutputEditorHOCR.cc:1288 ../qt/src/OutputEditorHOCR.cc:1079 msgid "Save hOCR Output..." msgstr "Shrani rezultat hOCR ..." #: ../gtk/src/OutputEditorHOCR.cc:1296 ../gtk/src/OutputEditorHOCR.cc:1357 #: ../gtk/src/OutputEditorText.cc:319 ../qt/src/OutputEditorHOCR.cc:1087 #: ../qt/src/OutputEditorHOCR.cc:1143 ../qt/src/OutputEditorText.cc:256 msgid "Failed to save output" msgstr "Shranjevanje rezultata spodletelo" #: ../gtk/src/OutputEditorHOCR.cc:1296 ../gtk/src/OutputEditorHOCR.cc:1357 #: ../gtk/src/OutputEditorText.cc:319 ../qt/src/OutputEditorHOCR.cc:1087 #: ../qt/src/OutputEditorHOCR.cc:1143 ../qt/src/OutputEditorText.cc:256 msgid "Check that you have writing permissions in the selected folder." msgstr "Preverite, Äe imate v izbrani mapi pravico pisanja." #: ../gtk/src/OutputEditorHOCR.cc:1346 ../qt/src/OutputEditorHOCR.cc:1133 msgid "PDF Files" msgstr "Datoteke PDF" #: ../gtk/src/OutputEditorHOCR.cc:1347 ../qt/src/OutputEditorHOCR.cc:1133 msgid "Save PDF Output..." msgstr "Shrani rezultat PDF ..." #: ../gtk/src/OutputEditorHOCR.cc:1375 ../qt/src/OutputEditorHOCR.cc:1157 msgid "The PDF library does not support the selected font." msgstr "Knjižnica PDF ne podpira izbrane pisave." #: ../gtk/src/OutputEditorHOCR.cc:1435 ../qt/src/OutputEditorHOCR.cc:1216 msgid "Errors occurred" msgstr "Pojavile so se napake" #: ../gtk/src/OutputEditorHOCR.cc:1435 ../qt/src/OutputEditorHOCR.cc:1216 msgid "" "The following pages could not be rendered:\n" "%1" msgstr "" "Naslednjih strani ni bilo mogoÄe prikazati:\n" "%1" #: ../gtk/src/OutputEditorHOCR.cc:1562 ../gtk/src/OutputEditorText.cc:333 #: ../qt/src/OutputEditorHOCR.cc:1331 ../qt/src/OutputEditorText.cc:269 msgid "Output not saved" msgstr "Rezultat ni bil shranjen" #: ../gtk/src/OutputEditorHOCR.cc:1562 ../gtk/src/OutputEditorText.cc:333 #: ../qt/src/OutputEditorHOCR.cc:1331 ../qt/src/OutputEditorText.cc:269 msgid "Save output before proceeding?" msgstr "Ali naj se pred nadaljevanjem shrani rezultat?" #: ../gtk/src/OutputEditorText.cc:197 ../qt/src/OutputEditorText.cc:158 msgid "Stripping line breaks..." msgstr "Odstranjevanje prelomov vrstic ..." #: ../gtk/src/OutputEditorText.cc:211 msgid "Check spelling" msgstr "Preveri Ärkovanje" #: ../gtk/src/OutputEditorText.cc:238 ../qt/src/OutputEditorText.cc:178 msgid "Replacing..." msgstr "Zamenjevanje ..." #: ../gtk/src/OutputEditorText.cc:264 ../qt/src/OutputEditorText.cc:204 #, fuzzy msgid "File: %1" msgstr "Datoteke" #: ../gtk/src/OutputEditorText.cc:267 ../qt/src/OutputEditorText.cc:207 #, fuzzy msgid "Page: %1" msgstr "Napaka sejanja: %1" #: ../gtk/src/OutputEditorText.cc:280 ../gtk/src/Recognizer.cc:481 #: ../qt/src/Recognizer.cc:460 msgid "" "\n" "[Failed to recognize page %1]\n" msgstr "" "\n" "[Prepoznavanje strani %1 spodletelo]\n" #: ../gtk/src/OutputEditorText.cc:310 ../qt/src/OutputEditorText.cc:248 msgid "Text Files" msgstr "Besedilne datoteke" #: ../gtk/src/OutputEditorText.cc:311 ../qt/src/OutputEditorText.cc:248 msgid "Save Output..." msgstr "Shrani rezultat ..." #: ../gtk/src/Recognizer.cc:156 ../qt/src/Recognizer.cc:131 msgid "" "Tesseract crashed with the following message:\n" "\n" "%1\n" "\n" "This typically happens for one of the following reasons:\n" "- Outdated traineddata files are used.\n" "- Auxiliary language data files are missing.\n" "- Corrupt language data files.\n" "\n" "Make sure your language data files are valid and compatible with tesseract " "%2." msgstr "" "Tesseract se je sesul s sledeÄim opisom napake:\n" "\n" "%1\n" "\n" "Do tega pride obiÄajno zaradi naslednjih razlogov:\n" "- uporabe zastarelih datotek za uÄenje;\n" "- manjkajoÄih pomožnih datotek z jezikovnimi podatki;\n" "- poÅ¡kodovanih datotek z jezikovnimi podatki.\n" "\n" "Poskrbite, da bodo vaÅ¡e jezikovne datoteke veljavne in združljive s pogonom " "tesseract %2." #: ../gtk/src/Recognizer.cc:212 ../qt/src/Recognizer.cc:191 msgid "No languages available" msgstr "Nobenega jezika ni na voljo" #: ../gtk/src/Recognizer.cc:212 ../qt/src/Recognizer.cc:191 msgid "" "No tesseract languages are available for use. Recognition will not work." msgstr "" "Zaledje tesseract ne more uporabiti nobenega jezika. Prepoznavanje ne bo " "delovalo." #: ../gtk/src/Recognizer.cc:266 ../qt/src/Recognizer.cc:251 msgid "Multilingual" msgstr "VeÄjeziÄno" #: ../gtk/src/Recognizer.cc:318 ../qt/src/Recognizer.cc:295 msgid "Automatic page segmentation" msgstr "Samodejen razrez strani" #: ../gtk/src/Recognizer.cc:319 ../qt/src/Recognizer.cc:296 msgid "Page segmentation with orientation and script detection" msgstr "Razrez strani z odkrivanjem postavitve in pisave" #: ../gtk/src/Recognizer.cc:320 ../qt/src/Recognizer.cc:297 msgid "Assume single column of text" msgstr "Predpostavi besedilo v enem stolpcu" #: ../gtk/src/Recognizer.cc:321 ../qt/src/Recognizer.cc:298 msgid "Assume single block of vertically aligned text" msgstr "Predpostavi en blok navpiÄno poravnanega besedila" #: ../gtk/src/Recognizer.cc:322 ../qt/src/Recognizer.cc:299 msgid "Assume a single uniform block of text" msgstr "Predpostavi en sam blok enotnega besedila" #: ../gtk/src/Recognizer.cc:323 ../qt/src/Recognizer.cc:300 msgid "Assume a line of text" msgstr "Predpostavi eno vrstico besedila" #: ../gtk/src/Recognizer.cc:324 ../qt/src/Recognizer.cc:301 msgid "Assume a single word" msgstr "Predpostavi eno samo besedo" #: ../gtk/src/Recognizer.cc:325 ../qt/src/Recognizer.cc:302 msgid "Assume a single word in a circle" msgstr "Predpostavi eno besedo v krogu" #: ../gtk/src/Recognizer.cc:326 ../qt/src/Recognizer.cc:303 msgid "Sparse text in no particular order" msgstr "Redko besedilo brez posebnega reda" #: ../gtk/src/Recognizer.cc:327 ../qt/src/Recognizer.cc:304 msgid "Sparse text with orientation and script detection" msgstr "Redko besedilo z odkrivanjem postavitve in pisave" #: ../gtk/src/Recognizer.cc:341 ../qt/src/Recognizer.cc:314 msgid "Page segmentation mode" msgstr "NaÄin razreza strani" #: ../gtk/src/Recognizer.cc:347 ../qt/src/Recognizer.cc:321 msgid "Manage languages..." msgstr "Upravljaj z jeziki ..." #: ../gtk/src/Recognizer.cc:403 ../qt/src/Recognizer.cc:381 msgid "Current selection" msgstr "Trenutni izbor" #: ../gtk/src/Recognizer.cc:475 ../qt/src/Recognizer.cc:454 msgid "Recognizing page %1 (%2 of %3)" msgstr "Prepoznavanje strani %1 (%2 od %3)" #: ../gtk/src/Recognizer.cc:480 ../qt/src/Recognizer.cc:459 msgid "" "\n" "- Page %1: failed to render page" msgstr "" "\n" "- Stran %1: prikaz strani spodletel" #: ../gtk/src/Recognizer.cc:510 ../gtk/src/Recognizer.cc:539 #: ../gtk/src/Recognizer.cc:552 ../qt/src/Recognizer.cc:488 #: ../qt/src/Recognizer.cc:517 ../qt/src/Recognizer.cc:530 msgid "Recognizing..." msgstr "Prepoznavanje ..." #: ../gtk/src/Recognizer.cc:514 ../gtk/src/Recognizer.cc:522 #: ../qt/src/Recognizer.cc:492 ../qt/src/Recognizer.cc:500 msgid "Recognition errors occurred" msgstr "Pri prepoznavanju je priÅ¡lo do napak" #: ../gtk/src/Recognizer.cc:514 ../qt/src/Recognizer.cc:492 msgid "The following errors occurred:%1" msgstr "PriÅ¡lo je do naslednjih napak: %1" #: ../gtk/src/Recognizer.cc:522 ../qt/src/Recognizer.cc:500 msgid "Failed to initialize tesseract" msgstr "Prednastavljanje zaÄelja tesseract spodletelo" #: ../gtk/src/scanner/ScannerSane.cc:83 ../gtk/src/scanner/ScannerTwain.cc:287 #: ../qt/src/scanner/ScannerSane.cc:85 ../qt/src/scanner/ScannerTwain.cc:285 msgid "Scan canceled" msgstr "OptiÄno branje preklicano" #: ../gtk/src/scanner/ScannerSane.cc:157 ../gtk/src/scanner/ScannerTwain.cc:186 #: ../qt/src/scanner/ScannerSane.cc:158 ../qt/src/scanner/ScannerTwain.cc:178 msgid "No scanner specified" msgstr "Ni navedenih optiÄnih bralnikov" #: ../gtk/src/scanner/ScannerSane.cc:166 ../gtk/src/scanner/ScannerTwain.cc:195 #: ../qt/src/scanner/ScannerSane.cc:167 ../qt/src/scanner/ScannerTwain.cc:187 msgid "Unable to connect to scanner" msgstr "Ni povezave z optiÄnim bralnikom" #: ../gtk/src/scanner/ScannerSane.cc:386 ../gtk/src/scanner/ScannerTwain.cc:265 #: ../gtk/src/scanner/ScannerTwain.cc:291 ../qt/src/scanner/ScannerSane.cc:387 #: ../qt/src/scanner/ScannerTwain.cc:257 ../qt/src/scanner/ScannerTwain.cc:289 msgid "Unable to start scan" msgstr "Ni mogoÄe zaÄeti optiÄnega branja" #: ../gtk/src/scanner/ScannerSane.cc:394 ../gtk/src/scanner/ScannerSane.cc:437 #: ../gtk/src/scanner/ScannerTwain.cc:317 ../qt/src/scanner/ScannerSane.cc:395 #: ../qt/src/scanner/ScannerSane.cc:438 ../qt/src/scanner/ScannerTwain.cc:315 msgid "Error communicating with scanner" msgstr "Napaka pri komunikaciji z optiÄnim bralnikom" #: ../gtk/src/scanner/ScannerSane.cc:498 ../qt/src/scanner/ScannerSane.cc:494 msgid "Failed to save image" msgstr "Shranjevanje slike spodletelo" #: ../gtk/src/SourceManager.cc:118 ../qt/src/SourceManager.cc:112 msgid "Unable to open files" msgstr "Datotek ni mogoÄe odpreti" #: ../gtk/src/SourceManager.cc:118 ../qt/src/SourceManager.cc:112 msgid "The following files could not be opened:%1" msgstr "Naslednjih datotek ni bilo mogoÄe odpreti: %1" #: ../gtk/src/SourceManager.cc:134 ../qt/src/SourceManager.cc:154 msgid "Images and PDFs" msgstr "Slike in PDFji" #: ../gtk/src/SourceManager.cc:137 ../qt/src/SourceManager.cc:155 msgid "Select Files" msgstr "Izberi datoteke" #: ../gtk/src/SourceManager.cc:143 ../qt/src/SourceManager.cc:166 msgid "Clipboard Error" msgstr "Napaka odlagaliÅ¡Äa" #: ../gtk/src/SourceManager.cc:143 ../qt/src/SourceManager.cc:166 msgid "Failed to read the clipboard." msgstr "OdlagaliÅ¡Äa ni bilo mogoÄe prebrati." #: ../gtk/src/SourceManager.cc:147 ../qt/src/SourceManager.cc:170 #: ../qt/src/SourceManager.cc:176 msgid "Pasted %1" msgstr "Prilepljeno %1" #: ../gtk/src/SourceManager.cc:159 ../qt/src/SourceManager.cc:183 msgid "Screenshot Error" msgstr "Napaka pri posnetku zaslona" #: ../gtk/src/SourceManager.cc:159 ../qt/src/SourceManager.cc:183 msgid "Failed to take screenshot." msgstr "Zaslona ni bilo mogoÄe posneti." #: ../gtk/src/SourceManager.cc:163 ../qt/src/SourceManager.cc:187 msgid "Screenshot %1" msgstr "Posnetek %1" #: ../gtk/src/SourceManager.cc:168 ../qt/src/SourceManager.cc:192 msgid "Saving image..." msgstr "Shranjevanje slike ..." #: ../gtk/src/SourceManager.cc:175 ../qt/src/SourceManager.cc:205 msgid "Cannot Write File" msgstr "Ni mogoÄe pisati v datoteko" #: ../gtk/src/SourceManager.cc:175 ../qt/src/SourceManager.cc:205 msgid "Could not write to %1." msgstr "V datoteko %1 ni bilo mogoÄe pisati." #: ../gtk/src/SourceManager.cc:202 ../qt/src/SourceManager.cc:227 msgid "Delete File?" msgstr "Ali naj se datoteka izbriÅ¡e?" #: ../gtk/src/SourceManager.cc:202 ../qt/src/SourceManager.cc:227 msgid "The following files will be deleted:%1" msgstr "Naslednje datoteke bodo izbrisane: %1" #: ../gtk/src/SourceManager.cc:266 ../qt/src/SourceManager.cc:278 msgid "Missing File" msgstr "ManjkajoÄa datoteka" #: ../gtk/src/SourceManager.cc:266 ../qt/src/SourceManager.cc:278 msgid "" "The following file has been deleted or moved:\n" "%1" msgstr "" "Naslednja datoteka je bila izbrisana ali premaknjena:\n" "%1" #: ../gtk/src/SubstitutionsManager.cc:39 ../qt/src/SubstitutionsManager.cc:77 msgid "Search for" msgstr "PoiÅ¡Äi" #: ../gtk/src/SubstitutionsManager.cc:40 ../qt/src/SubstitutionsManager.cc:77 msgid "Replace with" msgstr "Zamenjaj z" #: ../gtk/src/SubstitutionsManager.cc:62 ../qt/src/SubstitutionsManager.cc:99 msgid "substitution_list.txt" msgstr "spisek_zamenjav.txt" #: ../gtk/src/SubstitutionsManager.cc:84 ../gtk/src/SubstitutionsManager.cc:119 #: ../qt/src/SubstitutionsManager.cc:114 ../qt/src/SubstitutionsManager.cc:152 msgid "Substitutions List" msgstr "Spisek zamenjav" #: ../gtk/src/SubstitutionsManager.cc:85 ../qt/src/SubstitutionsManager.cc:114 msgid "Open Substitutions List" msgstr "Odpri spisek zamenjav" #: ../gtk/src/SubstitutionsManager.cc:90 ../qt/src/SubstitutionsManager.cc:119 msgid "Error Reading File" msgstr "Napaka pri branju datoteke" #: ../gtk/src/SubstitutionsManager.cc:90 ../qt/src/SubstitutionsManager.cc:119 msgid "Unable to read '%1'." msgstr "Datoteke '%1' ni bilo mogoÄe prebrati." #: ../gtk/src/SubstitutionsManager.cc:113 ../qt/src/SubstitutionsManager.cc:146 msgid "Errors Occurred Reading File" msgstr "Pri branju datoteke je priÅ¡lo do napak" #: ../gtk/src/SubstitutionsManager.cc:113 ../qt/src/SubstitutionsManager.cc:146 msgid "Some entries of the substitutions list could not be read." msgstr "Nekaj vnosov v spisku zamenjav ni bilo mogoÄe prebrati." #: ../gtk/src/SubstitutionsManager.cc:120 ../qt/src/SubstitutionsManager.cc:152 msgid "Save Substitutions List" msgstr "Shrani spisek zamenjav" #: ../gtk/src/SubstitutionsManager.cc:126 ../qt/src/SubstitutionsManager.cc:158 msgid "Error Saving File" msgstr "Napaka pri shranjevanju datoteke" #: ../gtk/src/SubstitutionsManager.cc:126 ../qt/src/SubstitutionsManager.cc:158 msgid "Unable to write to '%1'." msgstr "Datoteke '%1' ni bilo mogoÄe zapisati." #: ../gtk/src/SubstitutionsManager.cc:144 ../qt/src/SubstitutionsManager.cc:172 msgid "Save List?" msgstr "Ali naj bo spisek shranjen?" #: ../gtk/src/SubstitutionsManager.cc:144 ../qt/src/SubstitutionsManager.cc:172 msgid "Do you want to save the current list?" msgstr "Ali želite shraniti trenutni spisek?" #: ../gtk/src/SubstitutionsManager.cc:179 ../qt/src/SubstitutionsManager.cc:208 msgid "Applying substitutions..." msgstr "Uveljavljanje zamenjav ..." #: ../gtk/src/TessdataManager.cc:58 ../qt/src/TessdataManager.cc:72 msgid "" "PackageKit is required for managing system-wide tesseract language packs, " "but it was not found. Please use the system package management software to " "manage the tesseract language packs, or switch to use the user tessdata path " "in the configuration dialog." msgstr "" "Za upravljanje jezikovnih paketov tesseract je potreben PackageKit, ki pa ga " "ni bilo mogoÄe najti. Uporabite upravljalnik paketov vaÅ¡ega operacijskega " "sistema in namestite jezikovne pakete ali pa v pogovornem oknu nastavitev " "preklopite na uporabniÅ¡ko doloÄeno pot podatkov tessdata." #: ../gtk/src/TessdataManager.cc:63 ../qt/src/TessdataManager.cc:77 msgid "Fetching available languages" msgstr "Pridobivanje jezikov na voljo" #: ../gtk/src/TessdataManager.cc:68 ../gtk/src/TessdataManager.cc:89 #: ../gtk/src/TessdataManager.cc:121 ../qt/src/TessdataManager.cc:82 #: ../qt/src/TessdataManager.cc:94 ../qt/src/TessdataManager.cc:127 msgid "Failed to fetch list of available languages: %1" msgstr "Spiska jezikov na voljo ni bilo mogoÄe pridobiti: %1" #: ../gtk/src/TessdataManager.cc:100 ../gtk/src/TessdataManager.cc:129 #: ../qt/src/TessdataManager.cc:105 ../qt/src/TessdataManager.cc:114 #: ../qt/src/TessdataManager.cc:136 ../qt/src/TessdataManager.cc:147 msgid "Parsing error: %1" msgstr "Napaka sejanja: %1" #: ../gtk/src/TessdataManager.cc:191 ../qt/src/TessdataManager.cc:191 msgid "Applying changes..." msgstr "Uveljavljanje sprememb ..." #: ../gtk/src/TessdataManager.cc:252 ../qt/src/TessdataManager.cc:237 msgid "Failed to create directory for tessdata files." msgstr "Ustvarjanje imenika za datoteke tessdata je spodletelo." #: ../gtk/src/TessdataManager.cc:261 ../qt/src/TessdataManager.cc:245 msgid "Downloading %1..." msgstr "Prejemanje %1 ..." #: ../gtk/src/TessdataManager.cc:281 ../qt/src/TessdataManager.cc:267 msgid "" "The following files could not be downloaded or removed:\n" "%1\n" "\n" "Check the connectivity and directory permissions." msgstr "" "Navedenih datotek ni bilo mogoÄe prejeti ali odstraniti:\n" "%1\n" "\n" "Preverite internetno povezavo in dovoljenja mape." #: ../gtk/src/Utils.cc:62 msgid "Yes" msgstr "Da" #: ../gtk/src/Utils.cc:65 msgid "No" msgstr "Ne" #: ../gtk/src/Utils.cc:74 msgid "Discard" msgstr "Zavrzi" #: ../qt/data/AboutDialog.ui.h:1 msgid "About gImageReader" msgstr "O programu gImageReader" #: ../qt/data/AboutDialog.ui.h:3 #, fuzzy msgid "" "

 

A graphical frontend to tesseract-ocr

Website

 

" msgstr "" "

 

GrafiÄno zaÄelje programa tesseract-ocr

Spletna stran

 

" #: ../qt/data/AboutDialog.ui.h:4 msgid "Credits" msgstr "Zasluge" #: ../qt/data/AboutDialog.ui.h:5 msgid "License" msgstr "Licenca" #: ../qt/data/ConfigDialog.ui.h:14 msgid "System encoding" msgstr "Sistemsko" #: ../qt/data/ConfigDialog.ui.h:15 msgid "UTF-8" msgstr "UTF-8" #: ../qt/data/ConfigDialog.ui.h:19 msgid "Text file encoding:" msgstr "Kodiranje besedilne datoteke:" #: ../qt/data/CrashHandler.ui.h:2 #, no-c-format msgid "" "

The application has " "crashed

Apologies for the inconvenience. To help improve the " "application, please consider reporting the issue to manisandro@gmail.com. Please try to describe what you were doing before the application " "crashed. Also, include the information below. Thank you.

" msgstr "" "

Program se je sesul

OpraviÄujemo se za nevÅ¡eÄnosti. ÄŒe želite pomagati pri " "izpopolnjevanju programa, lahko javite napako na manisandro@gmail.com. Pri tem poizkusite opisati, kaj ste delali, preden se je program sesul. " "VkljuÄite tudi spodnje podatke. Hvala.

" #: ../qt/data/MainWindow.ui.h:1 msgid "gImageReader" msgstr "gImageReader" #. Remove & from some labels which designer insists in adding #: ../qt/data/MainWindow.ui.h:17 ../qt/src/Ui_MainWindow.hh:49 msgid "Sources" msgstr "Viri" #: ../qt/data/MainWindow.ui.h:18 msgid "Zoom In" msgstr "Približaj" #: ../qt/data/MainWindow.ui.h:20 msgid "Zoom Out" msgstr "Oddalji" #: ../qt/data/MainWindow.ui.h:22 msgid "Normal Size" msgstr "Normalna velikost" #: ../qt/data/MainWindow.ui.h:24 msgid "Best Fit" msgstr "NajboljÅ¡e ujemanje" #: ../qt/data/MainWindow.ui.h:26 msgid "Rotate Left" msgstr "Zasukaj levo" #: ../qt/data/MainWindow.ui.h:27 msgid "Rotate left" msgstr "Zasukaj levo" #: ../qt/data/MainWindow.ui.h:28 msgid "Rotate Right" msgstr "Zasukaj desno" #: ../qt/data/MainWindow.ui.h:29 msgid "Rotate right" msgstr "Zasukaj desno" #: ../qt/data/MainWindow.ui.h:30 msgid "Image Controls" msgstr "Kontrolniki slike" #: ../qt/data/MainWindow.ui.h:32 msgid "Autodetect Layout" msgstr "Samodejno zaznaj razporeditev" #: ../qt/data/MainWindow.ui.h:34 msgid "Toggle Output Pane" msgstr "Preklopi prikaz rezultata" #: ../qt/src/MainWindow.cc:518 msgid "Could not read %1: %2" msgstr "Branje %1 ni bilo možno: %2" #: ../qt/src/MainWindow.cc:543 msgid "The following dictionary files were installed:%1" msgstr "Naslednje datoteke s slovarji so bile nameÅ¡Äene: %1" #: ../qt/src/Ui_MainWindow.hh:50 msgid "Output" msgstr "Rezultat" #: ../qt/src/Ui_MainWindow.hh:133 msgid "OCR mode:" msgstr "NaÄin OCR:" #: ../qt/src/Ui_MainWindow.hh:204 msgid "Remove Image" msgstr "Odstrani sliko" #: ../qt/src/Ui_MainWindow.hh:207 msgid "Delete Image" msgstr "ZbriÅ¡i sliko" #: ../qt/src/Ui_MainWindow.hh:210 msgid "Clear List" msgstr "PoÄisti spisek" #. Output toolbar #: ../qt/src/Ui_OutputEditorHOCR.hh:39 ../qt/src/Ui_OutputEditorHOCR.hh:40 msgid "Open hOCR file" msgstr "Odpri datoteko hOCR" #: ../qt/src/Ui_OutputEditorHOCR.hh:41 ../qt/src/Ui_OutputEditorHOCR.hh:42 msgid "Save as hOCR text" msgstr "Shrani kot besedilo hOCR" #: ../qt/src/Ui_OutputEditorText.hh:108 msgid "Strip Line Breaks" msgstr "Odstrani prelome vrstic" #: ../qt/src/Ui_OutputEditorText.hh:113 msgid "Find and Replace" msgstr "PoiÅ¡Äi in zamenjaj" #: ../qt/src/Ui_OutputEditorText.hh:122 msgid "Save Output" msgstr "Shrani rezultat" #: ../qt/src/Ui_OutputEditorText.hh:124 msgid "Clear Output" msgstr "PoÄisti rezultat" #, fuzzy #~ msgid "" #~ "<html><head/><body><p><span style=" font-" #~ "weight:600;">The application has crashed</span></p>" #~ "<p>Apologies for the inconvenience. To help improve the " #~ "application, please consider reporting the issue to <a href="" #~ "mailto:manisandro@gmail.com?subject=gImageReader%20Crash">" #~ "manisandro@gmail.com</a>. Please try to describe what you were " #~ "doing before the application crashed. Also, include the information " #~ "below. Thank you.</p></body></html>" #~ msgstr "" #~ "

Program se je " #~ "sesul

OpraviÄujemo se za nevÅ¡eÄnosti. ÄŒe želite pomagati pri " #~ "izpopolnjevanju programa, lahko javite napako na manisandro@gmail.com. Pri tem poizkusite opisati, kaj ste delali, preden se je program " #~ "sesul. VkljuÄite tudi spodnje podatke. Hvala.

" #, fuzzy #~ msgid "" #~ "<small><b>Example:</b> 1-10, 13, 14-18</small>" #~ msgstr "Primer:1-10, 13, 14-18" #~ msgid "Detect script and orientation" #~ msgstr "Zaznaj besedilo in postavitev" #~ msgid "" #~ "PackageKit is required for managing tesseract language packs, but it was " #~ "not found. Please use the system package management software to manage " #~ "the tesseract language packs." #~ msgstr "" #~ "Za upravljanje jezikovnih paketov tesseract je potreben PackageKit, ki pa " #~ "ga ni bilo mogoÄe najti. Uporabite upravljalnik paketov vaÅ¡ega " #~ "operacijskega sistema in namestite jezikovne pakete." #~ msgid "" #~ "\n" #~ "\tFailed to initialize tesseract" #~ msgstr "" #~ "\n" #~ "\tPrednastavljanje zaÄelja tesseract spodletelo" gImageReader-3.2.3/po/sv.po000066400000000000000000001451411312567024200154510ustar00rootroot00000000000000# Swedish translations for gImageReader package # Swedish messages for gImageReader. # Copyright (C) 2010-2014 THE GIMAGEREADER'S COPYRIGHT HOLDER # This file is distributed under the same license as the gImageReader package. # # # 2014-12-02: Translation corrected :John Kehl # # # Sandro Mani , 2010-2011, 2013, 2014, 2015, 2016, 2017. msgid "" msgstr "" "Project-Id-Version: gImageReader-3.2.0\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2017-07-01 10:34+0200\n" "PO-Revision-Date: 2017-06-30 20:02+0100\n" "Last-Translator: Sandro Mani \n" "Language-Team: German \n" "Language: sv\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" "X-Generator: Lokalize 2.0\n" #: ../gtk/data/appmenu.ui.h:1 ../qt/src/Ui_MainWindow.hh:165 msgid "Redetect Languages" msgstr "Känn igen sprÃ¥k pÃ¥ nytt" #: ../gtk/data/appmenu.ui.h:2 ../gtk/data/gimagereader.ui.h:39 #: ../qt/data/ConfigDialog.ui.h:1 ../qt/src/Ui_MainWindow.hh:168 msgid "Preferences" msgstr "Inställningar" #: ../gtk/data/appmenu.ui.h:3 ../gtk/data/gimagereader.ui.h:40 #: ../gtk/src/MainWindow.cc:484 ../qt/src/MainWindow.cc:445 #: ../qt/src/Ui_MainWindow.hh:173 msgid "Help" msgstr "Hjälp" #: ../gtk/data/appmenu.ui.h:4 ../qt/data/AboutDialog.ui.h:2 #: ../qt/src/Ui_MainWindow.hh:176 msgid "About" msgstr "Om" #: ../gtk/data/appmenu.ui.h:5 msgid "Quit" msgstr "Avsluta" #: ../gtk/data/crashhandler.ui.h:1 ../qt/src/CrashHandler.cc:36 msgid "Regenerate backtrace" msgstr "Ã…terskapa bakÃ¥tspÃ¥rning" #: ../gtk/data/crashhandler.ui.h:2 msgid "The application has crashed" msgstr "Applikationen har kraschat" #: ../gtk/data/crashhandler.ui.h:4 #, no-c-format msgid "" "Apologies for the inconvenience. To help improve the application, please " "consider reporting the issue to manisandro@gmail.com. Please try to " "describe what you were doing before the application crashed. Also, include " "the information below. Thank you." msgstr "" "Ber om ursäkt för problemet. För att bidra till att förbättra programmet, " "kan du överväga att rapportera frÃ¥gan till manisandro@gmail.com. Försök att " "beskriva vad du gjorde innan programmet kraschade. Lägg dessutom till " "informationen nedan. Tack." #: ../gtk/data/editor_hocr.ui.h:1 ../qt/data/PdfExportDialog.ui.h:1 msgid "PDF Export" msgstr "PDF-export" #: ../gtk/data/editor_hocr.ui.h:2 ../gtk/data/gimagereader.ui.h:55 #: ../gtk/src/Acquirer.cc:42 ../gtk/src/FileDialogs.cc:150 #: ../gtk/src/Utils.cc:68 ../qt/data/ConfigDialog.ui.h:27 #: ../qt/data/MainWindow.ui.h:14 msgid "Cancel" msgstr "Avbryt" #: ../gtk/data/editor_hocr.ui.h:3 ../gtk/data/gimagereader.ui.h:41 #: ../gtk/src/FileDialogs.cc:151 ../gtk/src/Utils.cc:59 #: ../qt/data/ConfigDialog.ui.h:26 msgid "OK" msgstr "OK" #: ../gtk/data/editor_hocr.ui.h:4 ../qt/data/PdfExportDialog.ui.h:2 msgid "Output mode:" msgstr "Utdata-sätt:" #: ../gtk/data/editor_hocr.ui.h:5 ../qt/data/PdfExportDialog.ui.h:3 msgid "PDF" msgstr "PDF-export" #: ../gtk/data/editor_hocr.ui.h:6 ../qt/data/PdfExportDialog.ui.h:4 msgid "PDF with invisible text overlay" msgstr "PDF med osynlig text gömd" #: ../gtk/data/editor_hocr.ui.h:7 ../qt/data/PdfExportDialog.ui.h:16 msgid "Format:" msgstr "Databasformat:" #: ../gtk/data/editor_hocr.ui.h:8 ../qt/data/PdfExportDialog.ui.h:17 msgid "Compression:" msgstr "Kompression:" #: ../gtk/data/editor_hocr.ui.h:9 ../qt/data/PdfExportDialog.ui.h:14 msgid "Compression quality:" msgstr "Kompressionskvalitet:" #: ../gtk/data/editor_hocr.ui.h:10 ../qt/data/PdfExportDialog.ui.h:15 msgid "DPI:" msgstr "DPI:" #: ../gtk/data/editor_hocr.ui.h:11 ../qt/data/PdfExportDialog.ui.h:18 msgid "Dithering algorithm:" msgstr "Dither-algoritm:" #: ../gtk/data/editor_hocr.ui.h:12 ../qt/data/PdfExportDialog.ui.h:13 msgid "Image settings:" msgstr "Bildinställning:" #: ../gtk/data/editor_hocr.ui.h:13 ../qt/data/PdfExportDialog.ui.h:11 msgid "Document font:" msgstr "Dokument-teckensnitt:" #: ../gtk/data/editor_hocr.ui.h:14 ../qt/data/PdfExportDialog.ui.h:7 msgid "Uniformize line and word spacing" msgstr "Gör rad och ordavstÃ¥nden enhetliga" #: ../gtk/data/editor_hocr.ui.h:15 ../qt/data/PdfExportDialog.ui.h:10 msgid "Use detected font sizes" msgstr "Använd detekterad teckenstorlek" #: ../gtk/data/editor_hocr.ui.h:16 ../qt/data/PdfExportDialog.ui.h:8 msgid "Preserve spaces wider than:" msgstr "BehÃ¥ll tomrum större än:" #: ../gtk/data/editor_hocr.ui.h:17 ../qt/data/PdfExportDialog.ui.h:12 msgid "characters" msgstr "tecken" #: ../gtk/data/editor_hocr.ui.h:18 ../qt/data/PdfExportDialog.ui.h:9 msgid "Scale:" msgstr "Skala" #: ../gtk/data/editor_hocr.ui.h:19 ../qt/data/PdfExportDialog.ui.h:6 msgid "Text settings:" msgstr "Textinställning:" #: ../gtk/data/editor_hocr.ui.h:20 ../qt/data/PdfExportDialog.ui.h:5 msgid "Show preview" msgstr "Förhandsvisa" #: ../gtk/data/editor_hocr.ui.h:21 ../gtk/data/editor_text.ui.h:26 #: ../qt/src/Ui_OutputEditorText.hh:123 msgid "Save output" msgstr "Spara utdata" #: ../gtk/data/editor_hocr.ui.h:22 ../qt/src/Ui_OutputEditorHOCR.hh:44 #: ../qt/src/Ui_OutputEditorHOCR.hh:45 msgid "Export to PDF" msgstr "Exportera till PDF" #: ../gtk/data/editor_hocr.ui.h:23 ../gtk/data/editor_text.ui.h:27 #: ../qt/src/Ui_OutputEditorHOCR.hh:47 ../qt/src/Ui_OutputEditorHOCR.hh:48 #: ../qt/src/Ui_OutputEditorText.hh:125 msgid "Clear output" msgstr "Rensa utdata" #: ../gtk/data/editor_hocr.ui.h:24 ../qt/src/Ui_OutputEditorHOCR.hh:75 msgid "Properties" msgstr "Egenskaper" #: ../gtk/data/editor_hocr.ui.h:25 ../qt/src/Ui_OutputEditorHOCR.hh:79 msgid "Source" msgstr "Källa" #. Output insert mode #: ../gtk/data/editor_text.ui.h:1 ../qt/src/Ui_OutputEditorText.hh:59 msgid "Append to current text" msgstr "Lägg till efter aktuell text" #: ../gtk/data/editor_text.ui.h:2 ../qt/src/Ui_OutputEditorText.hh:60 msgid "Insert at cursor" msgstr "Infoga vid markören" #: ../gtk/data/editor_text.ui.h:3 ../qt/src/Ui_OutputEditorText.hh:61 msgid "Replace current text" msgstr "Ersätt aktuell text" #: ../gtk/data/editor_text.ui.h:4 ../qt/src/SubstitutionsManager.cc:37 #: ../qt/src/Ui_OutputEditorText.hh:177 msgid "Substitutions" msgstr "Ersättningar" #: ../gtk/data/editor_text.ui.h:5 ../qt/src/SubstitutionsManager.cc:42 #: ../qt/src/SubstitutionsManager.cc:43 msgid "Open" msgstr "Öppna" #: ../gtk/data/editor_text.ui.h:6 ../gtk/src/Utils.cc:71 #: ../qt/src/SubstitutionsManager.cc:45 ../qt/src/SubstitutionsManager.cc:46 msgid "Save" msgstr "Spara" #: ../gtk/data/editor_text.ui.h:7 ../qt/src/SubstitutionsManager.cc:48 #: ../qt/src/SubstitutionsManager.cc:49 msgid "Clear" msgstr "Töm" #: ../gtk/data/editor_text.ui.h:8 ../qt/data/ConfigDialog.ui.h:16 #: ../qt/src/SubstitutionsManager.cc:51 ../qt/src/SubstitutionsManager.cc:52 msgid "Add" msgstr "Lägg till" #: ../gtk/data/editor_text.ui.h:9 ../gtk/src/OutputEditorHOCR.cc:1202 #: ../gtk/src/OutputEditorHOCR.cc:1213 ../qt/data/ConfigDialog.ui.h:17 #: ../qt/src/OutputEditorHOCR.cc:998 ../qt/src/OutputEditorHOCR.cc:1000 #: ../qt/src/SubstitutionsManager.cc:54 ../qt/src/SubstitutionsManager.cc:55 msgid "Remove" msgstr "Ta bort" #: ../gtk/data/editor_text.ui.h:10 ../gtk/data/gimagereader.ui.h:73 msgid "Apply" msgstr "Använd" #: ../gtk/data/editor_text.ui.h:11 ../gtk/data/gimagereader.ui.h:74 msgid "Close" msgstr "Stäng" #. Output postprocessing #: ../gtk/data/editor_text.ui.h:12 ../qt/src/Ui_OutputEditorText.hh:69 msgid "Keep line break if..." msgstr "BehÃ¥ll radbrytning om..." #: ../gtk/data/editor_text.ui.h:13 ../qt/src/Ui_OutputEditorText.hh:71 msgid "Preceded by end mark (.?!)" msgstr "FöregÃ¥s av slut-tecken (.?!)" #: ../gtk/data/editor_text.ui.h:14 ../qt/src/Ui_OutputEditorText.hh:73 msgid "Preceded or succeeded by quote" msgstr "FöregÃ¥ngen eller efterträdd av citattecken" #: ../gtk/data/editor_text.ui.h:15 ../qt/src/Ui_OutputEditorText.hh:75 msgid "Other options" msgstr "Andra alternativ" #: ../gtk/data/editor_text.ui.h:16 ../qt/src/Ui_OutputEditorText.hh:77 msgid "Join hyphenated words" msgstr "Sammanfoga avstavade ord" #: ../gtk/data/editor_text.ui.h:17 ../qt/src/Ui_OutputEditorText.hh:79 msgid "Collapse whitespace" msgstr "Ta bort blanktecken" #: ../gtk/data/editor_text.ui.h:18 ../qt/src/Ui_OutputEditorText.hh:81 msgid "Preserve paragraphs" msgstr "Bevara stycken" #: ../gtk/data/editor_text.ui.h:19 ../qt/src/Ui_OutputEditorText.hh:83 msgid "Visual aids" msgstr "Visuella hjälpmedel" #: ../gtk/data/editor_text.ui.h:20 ../qt/src/Ui_OutputEditorText.hh:85 msgid "Draw whitespace" msgstr "Rita blanktecken" #: ../gtk/data/editor_text.ui.h:21 ../gtk/data/gimagereader.ui.h:31 #: ../qt/src/Ui_OutputEditorText.hh:102 msgid "Select insert mode" msgstr "Välj sätt att infoga" #: ../gtk/data/editor_text.ui.h:22 ../qt/src/Ui_OutputEditorText.hh:109 msgid "Strip line breaks on selected text" msgstr "Rensa radbrytningar i markerad text" #: ../gtk/data/editor_text.ui.h:23 ../qt/src/Ui_OutputEditorText.hh:114 msgid "Find and replace" msgstr "Sök och ersätt" #: ../gtk/data/editor_text.ui.h:24 ../qt/src/Ui_OutputEditorText.hh:116 #: ../qt/src/Ui_OutputEditorText.hh:117 msgid "Undo" msgstr "Ã…ngra" #: ../gtk/data/editor_text.ui.h:25 ../qt/src/Ui_OutputEditorText.hh:119 #: ../qt/src/Ui_OutputEditorText.hh:120 msgid "Redo" msgstr "Gör om" #: ../gtk/data/editor_text.ui.h:28 ../qt/src/Ui_OutputEditorText.hh:149 msgid "Find" msgstr "Sök" #: ../gtk/data/editor_text.ui.h:29 ../qt/src/Ui_OutputEditorText.hh:153 #: ../qt/src/Ui_OutputEditorText.hh:168 msgid "Replace" msgstr "Ersätt" #: ../gtk/data/editor_text.ui.h:30 ../qt/src/Ui_OutputEditorText.hh:173 msgid "Replace all" msgstr "Ersätt allt" #: ../gtk/data/editor_text.ui.h:31 ../qt/src/Ui_OutputEditorText.hh:163 msgid "Find previous" msgstr "Sök föregÃ¥ende" #: ../gtk/data/editor_text.ui.h:32 ../qt/src/Ui_OutputEditorText.hh:158 msgid "Find next" msgstr "Sök nästa" #: ../gtk/data/editor_text.ui.h:33 ../qt/src/Ui_OutputEditorText.hh:182 msgid "Match case" msgstr "Matcha skiftläge" #: ../gtk/data/gimagereader.ui.h:1 ../qt/src/Ui_MainWindow.hh:65 msgid "Rotate current page" msgstr "Rotera aktuell text" #: ../gtk/data/gimagereader.ui.h:2 ../qt/src/Ui_MainWindow.hh:66 msgid "Rotate all pages" msgstr "Rotera alla sidor" #: ../gtk/data/gimagereader.ui.h:3 ../qt/data/MainWindow.ui.h:35 msgid "Toggle output pane" msgstr "Visa/stäng utgÃ¥ngsfönstret" #. Sources toolbar #: ../gtk/data/gimagereader.ui.h:4 ../qt/src/Ui_MainWindow.hh:187 msgid "Recent" msgstr "Nyligen öppnad" #: ../gtk/data/gimagereader.ui.h:5 ../qt/src/Ui_MainWindow.hh:188 msgid "Paste" msgstr "Klistra in" #: ../gtk/data/gimagereader.ui.h:6 ../qt/src/Ui_MainWindow.hh:189 msgid "Take Screenshot" msgstr "Ta en skärmdump" #: ../gtk/data/gimagereader.ui.h:7 ../qt/src/Ui_MainWindow.hh:200 msgid "Add images" msgstr "Lägg till bilder" #: ../gtk/data/gimagereader.ui.h:8 ../qt/src/Ui_MainWindow.hh:199 msgid "Add Images" msgstr "Infoga bilder" #: ../gtk/data/gimagereader.ui.h:9 ../qt/src/Ui_MainWindow.hh:205 msgid "Remove image from list" msgstr "Ta bort bild frÃ¥n lista" #: ../gtk/data/gimagereader.ui.h:10 ../qt/src/Ui_MainWindow.hh:208 msgid "Delete image" msgstr "Radera bild" #: ../gtk/data/gimagereader.ui.h:11 ../qt/src/Ui_MainWindow.hh:211 msgid "Clear list" msgstr "Töm lista" #: ../gtk/data/gimagereader.ui.h:12 ../qt/data/MainWindow.ui.h:6 msgid "Files" msgstr "Filer" #: ../gtk/data/gimagereader.ui.h:13 ../qt/data/MainWindow.ui.h:16 msgid "Device:" msgstr "Enhet:" #: ../gtk/data/gimagereader.ui.h:14 ../qt/data/MainWindow.ui.h:15 #: ../qt/src/TessdataManager.cc:57 msgid "Refresh" msgstr "Uppdatera" #: ../gtk/data/gimagereader.ui.h:15 ../qt/data/MainWindow.ui.h:12 msgid "Output:" msgstr "Spara bild:" #: ../gtk/data/gimagereader.ui.h:16 ../qt/data/MainWindow.ui.h:9 msgid "Mode:" msgstr "Modus:" #: ../gtk/data/gimagereader.ui.h:17 ../gtk/src/OutputEditorHOCR.cc:362 #: ../qt/data/MainWindow.ui.h:11 ../qt/src/OutputEditorHOCR.cc:273 msgid "Color" msgstr "Färg" #: ../gtk/data/gimagereader.ui.h:18 ../gtk/src/OutputEditorHOCR.cc:365 #: ../qt/data/MainWindow.ui.h:10 ../qt/src/OutputEditorHOCR.cc:275 #: ../qt/src/OutputEditorHOCR.cc:277 msgid "Grayscale" msgstr "GrÃ¥skala" #: ../gtk/data/gimagereader.ui.h:19 ../qt/data/MainWindow.ui.h:8 msgid "Resolution:" msgstr "Upplösning:" #: ../gtk/data/gimagereader.ui.h:20 ../qt/data/MainWindow.ui.h:13 msgid "Scan" msgstr "Skanna" #: ../gtk/data/gimagereader.ui.h:21 ../qt/data/MainWindow.ui.h:7 msgid "Acquire" msgstr "Innefatta" #: ../gtk/data/gimagereader.ui.h:22 ../qt/data/MainWindow.ui.h:2 msgid "Brightness" msgstr "Ljusstyrka" #: ../gtk/data/gimagereader.ui.h:23 ../qt/data/MainWindow.ui.h:3 msgid "Contrast" msgstr "Kontrast" #: ../gtk/data/gimagereader.ui.h:24 ../qt/data/MainWindow.ui.h:4 msgid "Resolution" msgstr "Upplösning" #: ../gtk/data/gimagereader.ui.h:25 ../qt/data/MainWindow.ui.h:5 msgid "Invert colors" msgstr "Invertera färger" #: ../gtk/data/gimagereader.ui.h:26 ../qt/data/MainWindow.ui.h:19 msgid "Zoom in" msgstr "Zooma in" #: ../gtk/data/gimagereader.ui.h:27 ../qt/data/MainWindow.ui.h:21 msgid "Zoom out" msgstr "Zooma ut" #: ../gtk/data/gimagereader.ui.h:28 ../qt/data/MainWindow.ui.h:23 msgid "Normal size" msgstr "Normal storlek" #: ../gtk/data/gimagereader.ui.h:29 ../qt/data/MainWindow.ui.h:25 msgid "Best fit" msgstr "Bästa passning" #: ../gtk/data/gimagereader.ui.h:30 ../qt/src/Ui_MainWindow.hh:74 msgid "Select rotation mode" msgstr "Välj sätt att rotera" #: ../gtk/data/gimagereader.ui.h:32 ../qt/data/MainWindow.ui.h:31 msgid "Image controls" msgstr "Bildanpassning" #: ../gtk/data/gimagereader.ui.h:33 ../qt/src/Ui_MainWindow.hh:137 msgid "Plain text" msgstr "Oformaterad text" #: ../gtk/data/gimagereader.ui.h:34 ../qt/src/Ui_MainWindow.hh:137 msgid "hOCR, PDF" msgstr "hOCR, PDF" #: ../gtk/data/gimagereader.ui.h:35 ../qt/data/MainWindow.ui.h:33 msgid "Autodetect layout" msgstr "Känn igen layout automatiskt" #: ../gtk/data/gimagereader.ui.h:36 msgid "Recognize all" msgstr "Känn igen alla" #: ../gtk/data/gimagereader.ui.h:37 msgid "Select language" msgstr "Välj sprÃ¥k" #: ../gtk/data/gimagereader.ui.h:38 msgid "A graphical frontend to tesseract-ocr" msgstr "Ett grafiskt gränssnitt för tesseract-ocr" #: ../gtk/data/gimagereader.ui.h:42 msgid "Output pane orientation:" msgstr "Orientering för utgÃ¥ngstexten:" #: ../gtk/data/gimagereader.ui.h:43 msgid "Horizontal" msgstr "Horisontellt" #: ../gtk/data/gimagereader.ui.h:44 msgid "Vertical" msgstr "Vertikalt" #: ../gtk/data/gimagereader.ui.h:45 ../qt/data/ConfigDialog.ui.h:18 msgid "Query to install missing spellcheck dictionaries" msgstr "FöreslÃ¥ installation av saknade ordlistor - ordböcker " #: ../gtk/data/gimagereader.ui.h:46 ../qt/data/ConfigDialog.ui.h:4 msgid "Automatically check for new program versions" msgstr "Sök automatiskt efter nya programvesioner" #: ../gtk/data/gimagereader.ui.h:47 ../qt/data/ConfigDialog.ui.h:3 msgid "Predefined language definitions:" msgstr "Fördefinierade sprÃ¥kdefinitioner:" #: ../gtk/data/gimagereader.ui.h:48 ../qt/data/ConfigDialog.ui.h:12 msgid "Additional language definitions:" msgstr "Övriga sprÃ¥kdefinitioner:" #: ../gtk/data/gimagereader.ui.h:49 ../qt/data/ConfigDialog.ui.h:20 msgid "The prefix of the tesseract language data file" msgstr "Prefix för tesseract's sprÃ¥kdatafil." #: ../gtk/data/gimagereader.ui.h:50 ../qt/data/ConfigDialog.ui.h:21 msgid "Prefix" msgstr "Prefix" #: ../gtk/data/gimagereader.ui.h:51 ../qt/data/ConfigDialog.ui.h:22 msgid "The ISO 639-1 language code followed by the country code" msgstr "ISO 639-1 sprÃ¥kkod, följt av landskod" #: ../gtk/data/gimagereader.ui.h:52 ../qt/data/ConfigDialog.ui.h:23 msgid "ISO Code" msgstr "ISO Kod" #: ../gtk/data/gimagereader.ui.h:53 ../qt/data/ConfigDialog.ui.h:24 msgid "The name of the language" msgstr "SprÃ¥kets namn" #: ../gtk/data/gimagereader.ui.h:54 ../qt/data/ConfigDialog.ui.h:25 msgid "Name" msgstr "Namn" #: ../gtk/data/gimagereader.ui.h:56 ../qt/data/ConfigDialog.ui.h:5 msgid "Output pane font:" msgstr "Font för utdata-fönstret:" #: ../gtk/data/gimagereader.ui.h:57 ../qt/data/ConfigDialog.ui.h:2 msgid "Default" msgstr "Standard" #: ../gtk/data/gimagereader.ui.h:58 ../qt/data/ConfigDialog.ui.h:6 msgid "Language data locations:" msgstr "SprÃ¥kdata-lokalisering:" #: ../gtk/data/gimagereader.ui.h:59 ../qt/data/ConfigDialog.ui.h:13 msgid "Language definitions path:" msgstr "Lagringsplats för sprÃ¥kdefinitioner:" #: ../gtk/data/gimagereader.ui.h:60 ../qt/data/ConfigDialog.ui.h:28 msgid "Spelling dictionaries path:" msgstr "Sökväg till rättstavningslexikon:" #: ../gtk/data/gimagereader.ui.h:61 ../qt/data/ConfigDialog.ui.h:10 msgid "System-wide paths" msgstr "Systemomfattande sökväg" #: ../gtk/data/gimagereader.ui.h:62 ../qt/data/ConfigDialog.ui.h:11 msgid "User paths" msgstr "Användarsökväg" #: ../gtk/data/gimagereader.ui.h:63 ../qt/data/PageRangeDialog.ui.h:1 msgid "Page Range" msgstr "Sidintervall" #: ../gtk/data/gimagereader.ui.h:64 ../qt/data/PageRangeDialog.ui.h:2 msgid "Page range:" msgstr "Sidintervall:" #: ../gtk/data/gimagereader.ui.h:65 ../qt/data/PageRangeDialog.ui.h:3 msgid "Example: 1-10, 13, 14-18" msgstr "Exempel: 1-10, 13, 14-18" #: ../gtk/data/gimagereader.ui.h:66 ../qt/data/PageRangeDialog.ui.h:4 msgid "Recognition area:" msgstr "AvkänningsomrÃ¥de" #: ../gtk/data/gimagereader.ui.h:67 ../gtk/src/Recognizer.cc:403 #: ../qt/data/PageRangeDialog.ui.h:5 ../qt/src/Recognizer.cc:381 msgid "Entire page" msgstr "Hela sidan" #: ../gtk/data/gimagereader.ui.h:68 ../qt/data/PageRangeDialog.ui.h:6 msgid "Autodetect" msgstr "Automatisk igenkänning" #: ../gtk/data/gimagereader.ui.h:69 ../qt/data/PageRangeDialog.ui.h:7 #, fuzzy msgid "Prepend to output text:" msgstr "Lägg till efter aktuell text" #: ../gtk/data/gimagereader.ui.h:70 ../qt/data/PageRangeDialog.ui.h:8 msgid "Source filename" msgstr "" #: ../gtk/data/gimagereader.ui.h:71 ../qt/data/PageRangeDialog.ui.h:9 #, fuzzy msgid "Source page" msgstr "Källa" #: ../gtk/data/gimagereader.ui.h:72 ../qt/src/TessdataManager.cc:47 msgid "Tessdata Manager" msgstr "Tessdata-hanterare" #: ../gtk/data/gimagereader.ui.h:75 ../qt/src/TessdataManager.cc:49 msgid "Manage installed languages:" msgstr "Hantera installerade sprÃ¥k:" #: ../gtk/data/gimagereader.ui.h:76 ../qt/src/DisplayerToolSelect.cc:240 msgid "Delete" msgstr "Radera" #: ../gtk/data/gimagereader.ui.h:77 ../qt/src/DisplayerToolSelect.cc:226 msgid "Order:" msgstr "Ordningsföljd:" #: ../gtk/data/gimagereader.ui.h:78 ../gtk/src/DisplayerToolHOCR.cc:28 #: ../qt/src/DisplayerToolHOCR.cc:30 ../qt/src/DisplayerToolSelect.cc:241 msgid "Recognize" msgstr "Tolka text" #: ../gtk/data/gimagereader.ui.h:79 ../qt/src/DisplayerToolSelect.cc:242 msgid "Recognize to clipboard" msgstr "Tolka text till klippbordet" #: ../gtk/data/gimagereader.ui.h:80 ../qt/src/DisplayerToolSelect.cc:243 msgid "Save as image" msgstr "Spara som bild" #: ../gtk/data/gimagereader.ui.h:81 ../qt/src/Recognizer.cc:76 msgid "Current Page" msgstr "Aktuell Sida" #: ../gtk/data/gimagereader.ui.h:82 ../qt/src/Recognizer.cc:79 msgid "Multiple Pages..." msgstr "Flera sidor ..." #: ../gtk/src/Acquirer.cc:83 ../qt/src/Acquirer.cc:63 msgid "scan.png" msgstr "skanna.png" #: ../gtk/src/Acquirer.cc:96 ../qt/src/Acquirer.cc:80 msgid "Images" msgstr "Bilder" #: ../gtk/src/Acquirer.cc:97 ../qt/src/Acquirer.cc:81 msgid "Choose Output Filename..." msgstr "Välj filnamn för utdatafilen..." #: ../gtk/src/Acquirer.cc:112 ../qt/src/Acquirer.cc:96 msgid "Failed to initialize the scanning backend." msgstr "Det gick inte att initiera skannern." #: ../gtk/src/Acquirer.cc:121 ../qt/src/Acquirer.cc:102 msgid "Scan failed" msgstr "Skanningen misslyckades" #: ../gtk/src/Acquirer.cc:139 ../qt/src/Acquirer.cc:118 msgid "No scanners were detected." msgstr "Ingen skanner hittades." #: ../gtk/src/Acquirer.cc:156 ../gtk/src/Acquirer.cc:173 #: ../qt/src/Acquirer.cc:132 ../qt/src/Acquirer.cc:149 msgid "Starting scan..." msgstr "Startar skanning..." #: ../gtk/src/Acquirer.cc:169 ../qt/src/Acquirer.cc:145 msgid "Opening device..." msgstr "Skannern startas..." #: ../gtk/src/Acquirer.cc:171 ../qt/src/Acquirer.cc:147 msgid "Setting options..." msgstr "Inställningsalternativ..." #: ../gtk/src/Acquirer.cc:175 ../qt/src/Acquirer.cc:151 msgid "Getting parameters..." msgstr "Hämtar parametrar..." #: ../gtk/src/Acquirer.cc:177 ../qt/src/Acquirer.cc:153 msgid "Transferring data..." msgstr "Överför data..." #: ../gtk/src/Acquirer.cc:184 ../qt/src/Acquirer.cc:160 msgid "Canceling scan..." msgstr "Skanning avbröts" #: ../gtk/src/Config.cc:297 ../qt/data/ConfigDialog.ui.h:7 msgid "Filename prefix" msgstr "Filnamnsprefix" #: ../gtk/src/Config.cc:298 ../qt/data/ConfigDialog.ui.h:8 msgid "Code" msgstr "Kod" #: ../gtk/src/Config.cc:299 ../qt/data/ConfigDialog.ui.h:9 msgid "Native name" msgstr "Ursprungligt namn" #: ../gtk/src/CrashHandler.cc:26 ../gtk/src/CrashHandler.cc:43 #: ../qt/src/CrashHandler.cc:34 msgid "Crash Handler" msgstr "Krasch-hanterare" #: ../gtk/src/CrashHandler.cc:45 ../qt/src/CrashHandler.cc:29 msgid "Your work has been saved under %1." msgstr "Ditt arbete sparas under %1." #: ../gtk/src/CrashHandler.cc:47 ../qt/src/CrashHandler.cc:31 msgid "There was no unsaved work." msgstr "Inget osparat arbete." #: ../gtk/src/CrashHandler.cc:106 ../qt/src/CrashHandler.cc:60 msgid "Failed to obtain backtrace. Is gdb installed?" msgstr "Det gick inte att erhÃ¥lla bakÃ¥tspÃ¥rning. Är gdb installerad?" #: ../gtk/src/Displayer.cc:261 ../qt/src/Displayer.cc:231 msgid "Failed to load image" msgstr "Misslyckades att läsa in bild" #: ../gtk/src/Displayer.cc:261 ../qt/src/Displayer.cc:231 msgid "" "The file might not be an image or be corrupt:\n" "%1" msgstr "" "Filen är möjligen inte en bild eller kan vara skadad:\n" "%1" #: ../gtk/src/DisplayerToolSelect.cc:39 ../qt/src/DisplayerToolSelect.cc:40 msgid "selection.png" msgstr "bildval.png" #: ../gtk/src/DisplayerToolSelect.cc:148 ../qt/src/DisplayerToolSelect.cc:139 msgid "PNG Images" msgstr "PNG-bilder" #: ../gtk/src/DisplayerToolSelect.cc:149 ../qt/src/DisplayerToolSelect.cc:139 msgid "Save Selection Image" msgstr "Spara utvald bild" #: ../gtk/src/DisplayerToolSelect.cc:157 ../qt/src/DisplayerToolSelect.cc:147 msgid "Recognize all" msgstr "Tolka allt" #: ../gtk/src/DisplayerToolSelect.cc:157 ../qt/src/DisplayerToolSelect.cc:147 msgid "Recognize selection" msgstr "Tolkningsurval" #: ../gtk/src/DisplayerToolSelect.cc:194 ../qt/src/DisplayerToolSelect.cc:184 msgid "Performing layout analysis" msgstr "Utför layoutanalys" #: ../gtk/src/FileDialogs.cc:237 msgid "" "A file named \"%1\" already exists. Are you sure you want to overwrite it?" msgstr "En fil med namnet \"%1\" existerar redan. Ska den ersättas?" #: ../gtk/src/FileDialogs.cc:239 msgid "Overwrite File?" msgstr "Ska filen skrivas över?" #: ../gtk/src/MainWindow.cc:125 ../qt/src/MainWindow.cc:274 msgid "Using tesseract" msgstr "Använda tesseract" #: ../gtk/src/MainWindow.cc:191 ../qt/src/MainWindow.cc:181 msgid "Select an image to begin..." msgstr "Välj en bild för att börja..." #: ../gtk/src/MainWindow.cc:306 ../qt/src/MainWindow.cc:262 msgid "Multiple sources" msgstr "Flera källor" #: ../gtk/src/MainWindow.cc:307 ../qt/src/MainWindow.cc:263 msgid "Ready" msgstr "Klar" #: ../gtk/src/MainWindow.cc:446 ../qt/src/MainWindow.cc:390 msgid "New version" msgstr "Ny version" #: ../gtk/src/MainWindow.cc:446 ../qt/src/MainWindow.cc:390 msgid "gImageReader %1 is available" msgstr "gImageReader %1 är tillgänglig" #: ../gtk/src/MainWindow.cc:447 ../qt/src/MainWindow.cc:391 msgid "Download" msgstr "Ladda ner" #: ../gtk/src/MainWindow.cc:448 ../qt/src/MainWindow.cc:392 msgid "Changelog" msgstr "Ändringslogg" #: ../gtk/src/MainWindow.cc:449 ../qt/src/MainWindow.cc:393 msgid "Don't notify again" msgstr "Informera inte igen" #: ../gtk/src/MainWindow.cc:468 ../qt/src/MainWindow.cc:438 msgid "Don't show again" msgstr "Visa inte igen" #: ../gtk/src/MainWindow.cc:469 ../gtk/src/MainWindow.cc:482 #: ../qt/src/MainWindow.cc:439 msgid "Install" msgstr "Installera" #: ../gtk/src/MainWindow.cc:489 ../qt/src/MainWindow.cc:451 msgid "Spelling dictionary missing" msgstr "Rättstavningsordlista saknas" #: ../gtk/src/MainWindow.cc:489 ../qt/src/MainWindow.cc:451 msgid "The spellcheck dictionary for %1 is not installed" msgstr "Ordbok för stavningskontroll %1 är inte installerad" #: ../gtk/src/MainWindow.cc:496 ../gtk/src/MainWindow.cc:528 #: ../qt/src/MainWindow.cc:458 msgid "Installing spelling dictionary for '%1'" msgstr "Installerar stavningsordlistan för '%1'" #: ../gtk/src/MainWindow.cc:517 ../gtk/src/MainWindow.cc:542 #: ../gtk/src/MainWindow.cc:550 ../gtk/src/MainWindow.cc:560 #: ../gtk/src/MainWindow.cc:566 ../gtk/src/MainWindow.cc:595 #: ../gtk/src/OutputEditorHOCR.cc:1375 ../gtk/src/Recognizer.cc:163 #: ../gtk/src/TessdataManager.cc:58 ../gtk/src/TessdataManager.cc:68 #: ../gtk/src/TessdataManager.cc:290 ../qt/src/MainWindow.cc:477 #: ../qt/src/MainWindow.cc:490 ../qt/src/MainWindow.cc:500 #: ../qt/src/MainWindow.cc:510 ../qt/src/MainWindow.cc:518 #: ../qt/src/MainWindow.cc:546 ../qt/src/OutputEditorHOCR.cc:1157 #: ../qt/src/Recognizer.cc:138 ../qt/src/TessdataManager.cc:72 #: ../qt/src/TessdataManager.cc:82 ../qt/src/TessdataManager.cc:275 msgid "Error" msgstr "Fel" #: ../gtk/src/MainWindow.cc:517 ../qt/src/MainWindow.cc:477 msgid "Failed to install spelling dictionary: %1" msgstr "Kunde inte installera rättstavningsordbok: %1" #: ../gtk/src/MainWindow.cc:542 ../qt/src/MainWindow.cc:490 msgid "Failed to create directory for spelling dictionaries." msgstr "Kunde inte skapa mapp för rättstavningsordböcker." #: ../gtk/src/MainWindow.cc:550 ../gtk/src/MainWindow.cc:566 #: ../qt/src/MainWindow.cc:500 msgid "Could not read %1: %2." msgstr "Kunde inte läsa %1: %2." #: ../gtk/src/MainWindow.cc:560 ../gtk/src/MainWindow.cc:595 #: ../qt/src/MainWindow.cc:510 ../qt/src/MainWindow.cc:546 msgid "No spelling dictionaries found for '%1'." msgstr "Ingen rättstavningsordbok hittades för '%1'." #: ../gtk/src/MainWindow.cc:576 ../qt/src/MainWindow.cc:529 msgid "Downloading '%1'..." msgstr "Laddar ner '%1'..." #: ../gtk/src/MainWindow.cc:592 ../qt/src/MainWindow.cc:543 msgid "Dictionaries installed" msgstr "Rättstavningsordbok installerad" #: ../gtk/src/MainWindow.cc:592 msgid "The following dictionaries were installed:%1" msgstr "Följande rättstavningsordböcker installerades:%1" #: ../gtk/src/OutputEditorHOCR.cc:319 ../qt/src/OutputEditorHOCR.cc:291 msgid "Document" msgstr "Dokumentera" #: ../gtk/src/OutputEditorHOCR.cc:368 ../qt/src/OutputEditorHOCR.cc:279 msgid "Monochrome" msgstr "Monokrom" #: ../gtk/src/OutputEditorHOCR.cc:377 ../qt/src/OutputEditorHOCR.cc:281 msgid "Threshold (closest color)" msgstr "Tröskelvärde (närmaste färgnyans)" #: ../gtk/src/OutputEditorHOCR.cc:380 ../qt/src/OutputEditorHOCR.cc:282 msgid "Diffuse" msgstr "Diffusera" #: ../gtk/src/OutputEditorHOCR.cc:389 ../qt/src/OutputEditorHOCR.cc:283 msgid "Zip (lossless)" msgstr "Zip (förlustfri)" #: ../gtk/src/OutputEditorHOCR.cc:393 ../qt/src/OutputEditorHOCR.cc:284 msgid "CCITT Group 4 (lossless)" msgstr "CCITT Grupp 4 (förlustfri)" #: ../gtk/src/OutputEditorHOCR.cc:397 ../qt/src/OutputEditorHOCR.cc:285 msgid "Jpeg (lossy)" msgstr "Jpeg (med förlust)" #: ../gtk/src/OutputEditorHOCR.cc:553 ../qt/src/OutputEditorHOCR.cc:429 msgid "" "The following pages could not be processed:\n" "%1" msgstr "" "Följande sidor kunde inte behandlas:\n" "%1" #: ../gtk/src/OutputEditorHOCR.cc:554 ../qt/src/OutputEditorHOCR.cc:430 msgid "Recognition errors" msgstr "Igenkänningsfel" #. Add tree item #: ../gtk/src/OutputEditorHOCR.cc:647 ../gtk/src/OutputEditorHOCR.cc:1037 #: ../qt/src/OutputEditorHOCR.cc:504 ../qt/src/OutputEditorHOCR.cc:894 msgid "Graphic" msgstr "Grafisk" #: ../gtk/src/OutputEditorHOCR.cc:703 ../qt/src/OutputEditorHOCR.cc:563 msgid "Paragraph" msgstr "Stycke" #: ../gtk/src/OutputEditorHOCR.cc:706 ../qt/src/OutputEditorHOCR.cc:566 msgid "Textline" msgstr "Textrad" #: ../gtk/src/OutputEditorHOCR.cc:1136 ../qt/src/OutputEditorHOCR.cc:950 msgid "Merge" msgstr "Sammanfoga" #: ../gtk/src/OutputEditorHOCR.cc:1161 ../qt/src/OutputEditorHOCR.cc:977 msgid "Add graphic region" msgstr "Lägg till grafisk region" #: ../gtk/src/OutputEditorHOCR.cc:1177 ../qt/src/OutputEditorHOCR.cc:985 msgid "No suggestions" msgstr "Inga förslag" #: ../gtk/src/OutputEditorHOCR.cc:1183 ../qt/src/OutputEditorHOCR.cc:989 msgid "Add to dictionary" msgstr "Lägg till i ordlista" #: ../gtk/src/OutputEditorHOCR.cc:1189 ../qt/src/OutputEditorHOCR.cc:990 msgid "Ignore word" msgstr "Ignorera ord" #: ../gtk/src/OutputEditorHOCR.cc:1222 ../qt/src/OutputEditorHOCR.cc:1007 msgid "Expand all" msgstr "Expandera" #: ../gtk/src/OutputEditorHOCR.cc:1225 ../qt/src/OutputEditorHOCR.cc:1008 msgid "Collapse all" msgstr "Dra ihop" #: ../gtk/src/OutputEditorHOCR.cc:1248 ../gtk/src/OutputEditorHOCR.cc:1287 #: ../qt/src/OutputEditorHOCR.cc:1049 ../qt/src/OutputEditorHOCR.cc:1079 msgid "hOCR HTML Files" msgstr "hOCR HTML-filer" #: ../gtk/src/OutputEditorHOCR.cc:1249 ../qt/src/OutputEditorHOCR.cc:1049 msgid "Open hOCR File" msgstr "Öppna hOCR-fil" #: ../gtk/src/OutputEditorHOCR.cc:1258 ../qt/src/OutputEditorHOCR.cc:1055 msgid "Failed to open file" msgstr "Det gick inte att öppna filen" #: ../gtk/src/OutputEditorHOCR.cc:1258 ../qt/src/OutputEditorHOCR.cc:1055 msgid "The file could not be opened: %1." msgstr "Filen kunde inte öppnas: %1" #: ../gtk/src/OutputEditorHOCR.cc:1267 ../qt/src/OutputEditorHOCR.cc:1062 msgid "Invalid hOCR file" msgstr "Ogiltig hOCR-fil" #: ../gtk/src/OutputEditorHOCR.cc:1267 ../qt/src/OutputEditorHOCR.cc:1062 msgid "The file does not appear to contain valid hOCR HTML: %1" msgstr "Filen verkar inte innehÃ¥lla giltig hOCR HTML: %1" #: ../gtk/src/OutputEditorHOCR.cc:1283 ../gtk/src/OutputEditorHOCR.cc:1343 #: ../gtk/src/OutputEditorText.cc:306 ../qt/src/OutputEditorHOCR.cc:1077 #: ../qt/src/OutputEditorHOCR.cc:1131 ../qt/src/OutputEditorText.cc:246 msgid "output" msgstr "utdata" #: ../gtk/src/OutputEditorHOCR.cc:1288 ../qt/src/OutputEditorHOCR.cc:1079 msgid "Save hOCR Output..." msgstr "Spara hOCR utdata..." #: ../gtk/src/OutputEditorHOCR.cc:1296 ../gtk/src/OutputEditorHOCR.cc:1357 #: ../gtk/src/OutputEditorText.cc:319 ../qt/src/OutputEditorHOCR.cc:1087 #: ../qt/src/OutputEditorHOCR.cc:1143 ../qt/src/OutputEditorText.cc:256 msgid "Failed to save output" msgstr "Det gick inte att spara utdata" #: ../gtk/src/OutputEditorHOCR.cc:1296 ../gtk/src/OutputEditorHOCR.cc:1357 #: ../gtk/src/OutputEditorText.cc:319 ../qt/src/OutputEditorHOCR.cc:1087 #: ../qt/src/OutputEditorHOCR.cc:1143 ../qt/src/OutputEditorText.cc:256 msgid "Check that you have writing permissions in the selected folder." msgstr "Kontrollera att du har skrivbehörighet i den markerade mappen." #: ../gtk/src/OutputEditorHOCR.cc:1346 ../qt/src/OutputEditorHOCR.cc:1133 msgid "PDF Files" msgstr "PDF-filer" #: ../gtk/src/OutputEditorHOCR.cc:1347 ../qt/src/OutputEditorHOCR.cc:1133 msgid "Save PDF Output..." msgstr "Spara PDF utdata..." #: ../gtk/src/OutputEditorHOCR.cc:1375 ../qt/src/OutputEditorHOCR.cc:1157 msgid "The PDF library does not support the selected font." msgstr "PDF-biblioteket stöder inte den valda fonten." #: ../gtk/src/OutputEditorHOCR.cc:1435 ../qt/src/OutputEditorHOCR.cc:1216 msgid "Errors occurred" msgstr "Fel har inträffat" #: ../gtk/src/OutputEditorHOCR.cc:1435 ../qt/src/OutputEditorHOCR.cc:1216 msgid "" "The following pages could not be rendered:\n" "%1" msgstr "" "Följande sidor kunde inte Ã¥terges:\n" "%1" #: ../gtk/src/OutputEditorHOCR.cc:1562 ../gtk/src/OutputEditorText.cc:333 #: ../qt/src/OutputEditorHOCR.cc:1331 ../qt/src/OutputEditorText.cc:269 msgid "Output not saved" msgstr "Utdata har inte sparats" #: ../gtk/src/OutputEditorHOCR.cc:1562 ../gtk/src/OutputEditorText.cc:333 #: ../qt/src/OutputEditorHOCR.cc:1331 ../qt/src/OutputEditorText.cc:269 msgid "Save output before proceeding?" msgstr "Spara utdata innan du fortsätter?" #: ../gtk/src/OutputEditorText.cc:197 ../qt/src/OutputEditorText.cc:158 msgid "Stripping line breaks..." msgstr "Tar bort radbrytningar..." #: ../gtk/src/OutputEditorText.cc:211 msgid "Check spelling" msgstr "Kontrollera stavning" #: ../gtk/src/OutputEditorText.cc:238 ../qt/src/OutputEditorText.cc:178 msgid "Replacing..." msgstr "Ersätter..." #: ../gtk/src/OutputEditorText.cc:264 ../qt/src/OutputEditorText.cc:204 #, fuzzy msgid "File: %1" msgstr "Filer" #: ../gtk/src/OutputEditorText.cc:267 ../qt/src/OutputEditorText.cc:207 #, fuzzy msgid "Page: %1" msgstr "Tolkningsfel: %1" #: ../gtk/src/OutputEditorText.cc:280 ../gtk/src/Recognizer.cc:481 #: ../qt/src/Recognizer.cc:460 msgid "" "\n" "[Failed to recognize page %1]\n" msgstr "" "\n" "[Kunde inte tolka sidan %1]\n" #: ../gtk/src/OutputEditorText.cc:310 ../qt/src/OutputEditorText.cc:248 msgid "Text Files" msgstr "Textfiler" #: ../gtk/src/OutputEditorText.cc:311 ../qt/src/OutputEditorText.cc:248 msgid "Save Output..." msgstr "Spara utdata..." #: ../gtk/src/Recognizer.cc:156 ../qt/src/Recognizer.cc:131 msgid "" "Tesseract crashed with the following message:\n" "\n" "%1\n" "\n" "This typically happens for one of the following reasons:\n" "- Outdated traineddata files are used.\n" "- Auxiliary language data files are missing.\n" "- Corrupt language data files.\n" "\n" "Make sure your language data files are valid and compatible with tesseract " "%2." msgstr "" "Tesseract kraschade med följande meddelande:\n" "\n" "%1\n" "\n" "Detta händer typiskt för en av följande orsaker:\n" "- FörÃ¥ldrade traineddata-filer används.\n" "- Stöd för sprÃ¥kdatafiler saknas.\n" "- Korrupta sprÃ¥kdatafiler.\n" "\n" "Se till att dina sprÃ¥kdatafiler är giltiga och förenliga med tesseract %2." #: ../gtk/src/Recognizer.cc:212 ../qt/src/Recognizer.cc:191 msgid "No languages available" msgstr "Inga tillgängliga sprÃ¥k finns" #: ../gtk/src/Recognizer.cc:212 ../qt/src/Recognizer.cc:191 msgid "" "No tesseract languages are available for use. Recognition will not work." msgstr "" "Inga tesseract-sprÃ¥k är tillgängliga för användning. Tolkning kommer inte " "att fungera." #: ../gtk/src/Recognizer.cc:266 ../qt/src/Recognizer.cc:251 msgid "Multilingual" msgstr "FlersprÃ¥kig" #: ../gtk/src/Recognizer.cc:318 ../qt/src/Recognizer.cc:295 msgid "Automatic page segmentation" msgstr "Automatisk sidsegmetering" #: ../gtk/src/Recognizer.cc:319 ../qt/src/Recognizer.cc:296 msgid "Page segmentation with orientation and script detection" msgstr "Sidsegmentering med orientering och skriptdetektering" #: ../gtk/src/Recognizer.cc:320 ../qt/src/Recognizer.cc:297 msgid "Assume single column of text" msgstr "Antas vara en kolumn med text" #: ../gtk/src/Recognizer.cc:321 ../qt/src/Recognizer.cc:298 msgid "Assume single block of vertically aligned text" msgstr "Antas vara ett block med vertikalt anordnad text" #: ../gtk/src/Recognizer.cc:322 ../qt/src/Recognizer.cc:299 msgid "Assume a single uniform block of text" msgstr "Antas vara ett enhetligt block med text" #: ../gtk/src/Recognizer.cc:323 ../qt/src/Recognizer.cc:300 msgid "Assume a line of text" msgstr "Antas vara en rad med text" #: ../gtk/src/Recognizer.cc:324 ../qt/src/Recognizer.cc:301 msgid "Assume a single word" msgstr "Antas vara endast ett ord" #: ../gtk/src/Recognizer.cc:325 ../qt/src/Recognizer.cc:302 msgid "Assume a single word in a circle" msgstr "Antas vara endast ett ord i cirkel" #: ../gtk/src/Recognizer.cc:326 ../qt/src/Recognizer.cc:303 msgid "Sparse text in no particular order" msgstr "Gles text utan särskild ordning" #: ../gtk/src/Recognizer.cc:327 ../qt/src/Recognizer.cc:304 msgid "Sparse text with orientation and script detection" msgstr "Gles text med orientering och skriptdetektering" #: ../gtk/src/Recognizer.cc:341 ../qt/src/Recognizer.cc:314 msgid "Page segmentation mode" msgstr "Sidsegmeteringssätt" #: ../gtk/src/Recognizer.cc:347 ../qt/src/Recognizer.cc:321 msgid "Manage languages..." msgstr "Hantera sprÃ¥k..." #: ../gtk/src/Recognizer.cc:403 ../qt/src/Recognizer.cc:381 msgid "Current selection" msgstr "Aktuellt val" #: ../gtk/src/Recognizer.cc:475 ../qt/src/Recognizer.cc:454 msgid "Recognizing page %1 (%2 of %3)" msgstr "Tolkar sida %1 (%2 av %3)" #: ../gtk/src/Recognizer.cc:480 ../qt/src/Recognizer.cc:459 msgid "" "\n" "- Page %1: failed to render page" msgstr "" "\n" "- Sidan %1: kunde inte rendera sidan" #: ../gtk/src/Recognizer.cc:510 ../gtk/src/Recognizer.cc:539 #: ../gtk/src/Recognizer.cc:552 ../qt/src/Recognizer.cc:488 #: ../qt/src/Recognizer.cc:517 ../qt/src/Recognizer.cc:530 msgid "Recognizing..." msgstr "Tolkning genomförs..." #: ../gtk/src/Recognizer.cc:514 ../gtk/src/Recognizer.cc:522 #: ../qt/src/Recognizer.cc:492 ../qt/src/Recognizer.cc:500 msgid "Recognition errors occurred" msgstr "Tolkningsfel har inträffat" #: ../gtk/src/Recognizer.cc:514 ../qt/src/Recognizer.cc:492 msgid "The following errors occurred:%1" msgstr "Följande fel har inträffat:%1" #: ../gtk/src/Recognizer.cc:522 ../qt/src/Recognizer.cc:500 msgid "Failed to initialize tesseract" msgstr "Tesseract kunde inte initieras" #: ../gtk/src/scanner/ScannerSane.cc:83 ../gtk/src/scanner/ScannerTwain.cc:287 #: ../qt/src/scanner/ScannerSane.cc:85 ../qt/src/scanner/ScannerTwain.cc:285 msgid "Scan canceled" msgstr "Skanning avbröts" #: ../gtk/src/scanner/ScannerSane.cc:157 ../gtk/src/scanner/ScannerTwain.cc:186 #: ../qt/src/scanner/ScannerSane.cc:158 ../qt/src/scanner/ScannerTwain.cc:178 msgid "No scanner specified" msgstr "Ingen skanner specificerad" #: ../gtk/src/scanner/ScannerSane.cc:166 ../gtk/src/scanner/ScannerTwain.cc:195 #: ../qt/src/scanner/ScannerSane.cc:167 ../qt/src/scanner/ScannerTwain.cc:187 msgid "Unable to connect to scanner" msgstr "Det gÃ¥r inte att ansluta till skanner" #: ../gtk/src/scanner/ScannerSane.cc:386 ../gtk/src/scanner/ScannerTwain.cc:265 #: ../gtk/src/scanner/ScannerTwain.cc:291 ../qt/src/scanner/ScannerSane.cc:387 #: ../qt/src/scanner/ScannerTwain.cc:257 ../qt/src/scanner/ScannerTwain.cc:289 msgid "Unable to start scan" msgstr "Det gÃ¥r inte att starta skanningen" #: ../gtk/src/scanner/ScannerSane.cc:394 ../gtk/src/scanner/ScannerSane.cc:437 #: ../gtk/src/scanner/ScannerTwain.cc:317 ../qt/src/scanner/ScannerSane.cc:395 #: ../qt/src/scanner/ScannerSane.cc:438 ../qt/src/scanner/ScannerTwain.cc:315 msgid "Error communicating with scanner" msgstr "Fel vid kommunikation med skannern" #: ../gtk/src/scanner/ScannerSane.cc:498 ../qt/src/scanner/ScannerSane.cc:494 msgid "Failed to save image" msgstr "Det gick inte att spara bilden" #: ../gtk/src/SourceManager.cc:118 ../qt/src/SourceManager.cc:112 msgid "Unable to open files" msgstr "Det gÃ¥r inte att öppna filer" #: ../gtk/src/SourceManager.cc:118 ../qt/src/SourceManager.cc:112 msgid "The following files could not be opened:%1" msgstr "Följande filer kunde inte öppnas:%1" #: ../gtk/src/SourceManager.cc:134 ../qt/src/SourceManager.cc:154 msgid "Images and PDFs" msgstr "Bilder och PDF-filer" #: ../gtk/src/SourceManager.cc:137 ../qt/src/SourceManager.cc:155 msgid "Select Files" msgstr "Välj filer" #: ../gtk/src/SourceManager.cc:143 ../qt/src/SourceManager.cc:166 msgid "Clipboard Error" msgstr "Urklippsfel" #: ../gtk/src/SourceManager.cc:143 ../qt/src/SourceManager.cc:166 msgid "Failed to read the clipboard." msgstr "Det gick inte att läsa urklipp." #: ../gtk/src/SourceManager.cc:147 ../qt/src/SourceManager.cc:170 #: ../qt/src/SourceManager.cc:176 msgid "Pasted %1" msgstr "%1 inklistrat" #: ../gtk/src/SourceManager.cc:159 ../qt/src/SourceManager.cc:183 msgid "Screenshot Error" msgstr "Skärmdumpsfel" #: ../gtk/src/SourceManager.cc:159 ../qt/src/SourceManager.cc:183 msgid "Failed to take screenshot." msgstr "Det gick inte att ta skärmdump." #: ../gtk/src/SourceManager.cc:163 ../qt/src/SourceManager.cc:187 msgid "Screenshot %1" msgstr "Skärmdump %1" #: ../gtk/src/SourceManager.cc:168 ../qt/src/SourceManager.cc:192 msgid "Saving image..." msgstr "Bilden sparas..." #: ../gtk/src/SourceManager.cc:175 ../qt/src/SourceManager.cc:205 msgid "Cannot Write File" msgstr "Kan inte skriva filen" #: ../gtk/src/SourceManager.cc:175 ../qt/src/SourceManager.cc:205 msgid "Could not write to %1." msgstr "Det gick inte att skriva till %1" #: ../gtk/src/SourceManager.cc:202 ../qt/src/SourceManager.cc:227 msgid "Delete File?" msgstr "Radera fil?" #: ../gtk/src/SourceManager.cc:202 ../qt/src/SourceManager.cc:227 msgid "The following files will be deleted:%1" msgstr "Följande filer kommer att raderas:%1" #: ../gtk/src/SourceManager.cc:266 ../qt/src/SourceManager.cc:278 msgid "Missing File" msgstr "Fil saknas" #: ../gtk/src/SourceManager.cc:266 ../qt/src/SourceManager.cc:278 msgid "" "The following file has been deleted or moved:\n" "%1" msgstr "" "Följande fil har raderats eller flyttats:\n" "%1" #: ../gtk/src/SubstitutionsManager.cc:39 ../qt/src/SubstitutionsManager.cc:77 msgid "Search for" msgstr "Söker efter" #: ../gtk/src/SubstitutionsManager.cc:40 ../qt/src/SubstitutionsManager.cc:77 msgid "Replace with" msgstr "Ersätt med" #: ../gtk/src/SubstitutionsManager.cc:62 ../qt/src/SubstitutionsManager.cc:99 msgid "substitution_list.txt" msgstr "ersättnings_lista.txt" #: ../gtk/src/SubstitutionsManager.cc:84 ../gtk/src/SubstitutionsManager.cc:119 #: ../qt/src/SubstitutionsManager.cc:114 ../qt/src/SubstitutionsManager.cc:152 msgid "Substitutions List" msgstr "Ersättningslista" #: ../gtk/src/SubstitutionsManager.cc:85 ../qt/src/SubstitutionsManager.cc:114 msgid "Open Substitutions List" msgstr "Öppna ersättningslista" #: ../gtk/src/SubstitutionsManager.cc:90 ../qt/src/SubstitutionsManager.cc:119 msgid "Error Reading File" msgstr "Fel vid läsning av fil" #: ../gtk/src/SubstitutionsManager.cc:90 ../qt/src/SubstitutionsManager.cc:119 msgid "Unable to read '%1'." msgstr "Det gÃ¥r inte att läsa '%1'." #: ../gtk/src/SubstitutionsManager.cc:113 ../qt/src/SubstitutionsManager.cc:146 msgid "Errors Occurred Reading File" msgstr "Fel vid läsning av fil" #: ../gtk/src/SubstitutionsManager.cc:113 ../qt/src/SubstitutionsManager.cc:146 msgid "Some entries of the substitutions list could not be read." msgstr "Vissa poster i ersättningslistan kunde inte läsas." #: ../gtk/src/SubstitutionsManager.cc:120 ../qt/src/SubstitutionsManager.cc:152 msgid "Save Substitutions List" msgstr "Spara ersättningslistan" #: ../gtk/src/SubstitutionsManager.cc:126 ../qt/src/SubstitutionsManager.cc:158 msgid "Error Saving File" msgstr "Fel när filen sparades" #: ../gtk/src/SubstitutionsManager.cc:126 ../qt/src/SubstitutionsManager.cc:158 msgid "Unable to write to '%1'." msgstr "Det gÃ¥r inte att skriva till '%1'." #: ../gtk/src/SubstitutionsManager.cc:144 ../qt/src/SubstitutionsManager.cc:172 msgid "Save List?" msgstr "Spara listan?" #: ../gtk/src/SubstitutionsManager.cc:144 ../qt/src/SubstitutionsManager.cc:172 msgid "Do you want to save the current list?" msgstr "Vill du spara den nuvarande listan?" #: ../gtk/src/SubstitutionsManager.cc:179 ../qt/src/SubstitutionsManager.cc:208 msgid "Applying substitutions..." msgstr "Tillämpa ersättningar..." #: ../gtk/src/TessdataManager.cc:58 ../qt/src/TessdataManager.cc:72 msgid "" "PackageKit is required for managing system-wide tesseract language packs, " "but it was not found. Please use the system package management software to " "manage the tesseract language packs, or switch to use the user tessdata path " "in the configuration dialog." msgstr "" "PackageKit krävs för att hantera systemomfattande tesseract sprÃ¥kpaket, men " "det kunde inte hittas. Använd systempaketets programvara för att hantera " "tesseract sprÃ¥kpaket eller byt till användarens tessdatasökväg i dialogrutan " "för konfiguration." #: ../gtk/src/TessdataManager.cc:63 ../qt/src/TessdataManager.cc:77 msgid "Fetching available languages" msgstr "Hämtar tillgängliga sprÃ¥k" #: ../gtk/src/TessdataManager.cc:68 ../gtk/src/TessdataManager.cc:89 #: ../gtk/src/TessdataManager.cc:121 ../qt/src/TessdataManager.cc:82 #: ../qt/src/TessdataManager.cc:94 ../qt/src/TessdataManager.cc:127 msgid "Failed to fetch list of available languages: %1" msgstr "Det gick inte att hämta listan över tillgängliga sprÃ¥k: %1" #: ../gtk/src/TessdataManager.cc:100 ../gtk/src/TessdataManager.cc:129 #: ../qt/src/TessdataManager.cc:105 ../qt/src/TessdataManager.cc:114 #: ../qt/src/TessdataManager.cc:136 ../qt/src/TessdataManager.cc:147 msgid "Parsing error: %1" msgstr "Tolkningsfel: %1" #: ../gtk/src/TessdataManager.cc:191 ../qt/src/TessdataManager.cc:191 msgid "Applying changes..." msgstr "Tillämpar ändringar..." #: ../gtk/src/TessdataManager.cc:252 ../qt/src/TessdataManager.cc:237 msgid "Failed to create directory for tessdata files." msgstr "Det gick inte att skapa katalog för tessdatafiler." #: ../gtk/src/TessdataManager.cc:261 ../qt/src/TessdataManager.cc:245 msgid "Downloading %1..." msgstr "Laddar ner %1..." #: ../gtk/src/TessdataManager.cc:281 ../qt/src/TessdataManager.cc:267 msgid "" "The following files could not be downloaded or removed:\n" "%1\n" "\n" "Check the connectivity and directory permissions." msgstr "" "Följande filer kunde inte hämtas eller tas bort:\n" "%1\n" "\n" "Kontrollera anslutningen och katalogbehörigheterna." #: ../gtk/src/Utils.cc:62 msgid "Yes" msgstr "Ja" #: ../gtk/src/Utils.cc:65 msgid "No" msgstr "Nej" #: ../gtk/src/Utils.cc:74 msgid "Discard" msgstr "Förkasta" #: ../qt/data/AboutDialog.ui.h:1 msgid "About gImageReader" msgstr "Om gImageReader" #: ../qt/data/AboutDialog.ui.h:3 #, fuzzy msgid "" "

 

A graphical frontend to tesseract-ocr

Website

 

" msgstr "" "

 

Ett grafiskt gränssnitt för tesseract-" "ocr

Webbsida

 

" #: ../qt/data/AboutDialog.ui.h:4 msgid "Credits" msgstr "Erkännande" #: ../qt/data/AboutDialog.ui.h:5 msgid "License" msgstr "Licens" #: ../qt/data/ConfigDialog.ui.h:14 msgid "System encoding" msgstr "System-kodning" #: ../qt/data/ConfigDialog.ui.h:15 msgid "UTF-8" msgstr "UTF-8" #: ../qt/data/ConfigDialog.ui.h:19 msgid "Text file encoding:" msgstr "Kodning av textfil:" #: ../qt/data/CrashHandler.ui.h:2 #, fuzzy, no-c-format msgid "" "

The application has " "crashed

Apologies for the inconvenience. To help improve the " "application, please consider reporting the issue to manisandro@gmail.com. Please try to describe what you were doing before the application " "crashed. Also, include the information below. Thank you.

" msgstr "" "Ber om ursäkt för problemet. För att bidra till att förbättra programmet, " "kan du överväga att rapportera frågan till manisandro@gmail.com. Försök att " "beskriva vad du gjorde innan programmet kraschade. Lägg dessutom till " "informationen nedan. Tack." #: ../qt/data/MainWindow.ui.h:1 msgid "gImageReader" msgstr "gImageReader" #. Remove & from some labels which designer insists in adding #: ../qt/data/MainWindow.ui.h:17 ../qt/src/Ui_MainWindow.hh:49 msgid "Sources" msgstr "Källor" #: ../qt/data/MainWindow.ui.h:18 msgid "Zoom In" msgstr "Zooma In" #: ../qt/data/MainWindow.ui.h:20 msgid "Zoom Out" msgstr "Zooma ut" #: ../qt/data/MainWindow.ui.h:22 msgid "Normal Size" msgstr "Normal storlek" #: ../qt/data/MainWindow.ui.h:24 msgid "Best Fit" msgstr "Bästa passning" #: ../qt/data/MainWindow.ui.h:26 msgid "Rotate Left" msgstr "Rotera vänster" #: ../qt/data/MainWindow.ui.h:27 msgid "Rotate left" msgstr "Rotera vänster" #: ../qt/data/MainWindow.ui.h:28 msgid "Rotate Right" msgstr "Rotera höger" #: ../qt/data/MainWindow.ui.h:29 msgid "Rotate right" msgstr "Rotera höger" #: ../qt/data/MainWindow.ui.h:30 msgid "Image Controls" msgstr "Bildanpassning" #: ../qt/data/MainWindow.ui.h:32 msgid "Autodetect Layout" msgstr "Känn igen layout automatiskt" #: ../qt/data/MainWindow.ui.h:34 msgid "Toggle Output Pane" msgstr "Visa/stäng utgångsfönstret" #: ../qt/src/MainWindow.cc:518 msgid "Could not read %1: %2" msgstr "Kunde inte läsa %1: %2" #: ../qt/src/MainWindow.cc:543 msgid "The following dictionary files were installed:%1" msgstr "Följande ordboks-filer installerades:%1" #: ../qt/src/Ui_MainWindow.hh:50 msgid "Output" msgstr "Utdata" #: ../qt/src/Ui_MainWindow.hh:133 msgid "OCR mode:" msgstr "OCR-läge:" #: ../qt/src/Ui_MainWindow.hh:204 msgid "Remove Image" msgstr "Ta bort bild" #: ../qt/src/Ui_MainWindow.hh:207 msgid "Delete Image" msgstr "Radera bild" #: ../qt/src/Ui_MainWindow.hh:210 msgid "Clear List" msgstr "Töm Lista" #. Output toolbar #: ../qt/src/Ui_OutputEditorHOCR.hh:39 ../qt/src/Ui_OutputEditorHOCR.hh:40 msgid "Open hOCR file" msgstr "Öppna hOCR-fil" #: ../qt/src/Ui_OutputEditorHOCR.hh:41 ../qt/src/Ui_OutputEditorHOCR.hh:42 msgid "Save as hOCR text" msgstr "Spara som hOCR-text" #: ../qt/src/Ui_OutputEditorText.hh:108 msgid "Strip Line Breaks" msgstr "Rensa radbrytningar" #: ../qt/src/Ui_OutputEditorText.hh:113 msgid "Find and Replace" msgstr "Sök och ersätt" #: ../qt/src/Ui_OutputEditorText.hh:122 msgid "Save Output" msgstr "Spara utdata" #: ../qt/src/Ui_OutputEditorText.hh:124 msgid "Clear Output" msgstr "Rensa utdata" #, fuzzy #~ msgid "" #~ "<html><head/><body><p><span style=" font-" #~ "weight:600;">The application has crashed</span></p>" #~ "<p>Apologies for the inconvenience. To help improve the " #~ "application, please consider reporting the issue to <a href="" #~ "mailto:manisandro@gmail.com?subject=gImageReader%20Crash">" #~ "manisandro@gmail.com</a>. Please try to describe what you were " #~ "doing before the application crashed. Also, include the information " #~ "below. Thank you.</p></body></html>" #~ msgstr "" #~ "

Applikationen har " #~ "kraschat

Ber om ursäkt för olägenheten. För att bidra till " #~ "att förbättra programmet, kan du överväga att rapportera felet till manisandro@gmail.com.Försök att beskriva vad du gjorde innan " #~ "programmet kraschade. Inkludera dessutom informationen nedan. Tack.

" #, fuzzy #~ msgid "" #~ "<small><b>Example:</b> 1-10, 13, 14-18</small>" #~ msgstr "Exempel: 1-10, 13, 14-18" #~ msgid "Detect script and orientation" #~ msgstr "Identifiera skript och orientering" #~ msgid "" #~ "PackageKit is required for managing tesseract language packs, but it was " #~ "not found. Please use the system package management software to manage " #~ "the tesseract language packs." #~ msgstr "" #~ "PackageKit krävs för att hantera Tesseract språkpaket, men det kunde inte " #~ "hittas. Använd system-paketets programvara för att hantera Tesseract's " #~ "språkpaket." gImageReader-3.2.3/po/tr.po000066400000000000000000001454151312567024200154520ustar00rootroot00000000000000# Sandro Mani , 2016, 2017. msgid "" msgstr "" "Project-Id-Version: \n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2017-07-01 10:34+0200\n" "PO-Revision-Date: 2017-06-30 20:04+0100\n" "Last-Translator: Sandro Mani \n" "Language-Team: Turkish \n" "Language: tr\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n > 1);\n" "X-Generator: Lokalize 2.0\n" "X-POOTLE-MTIME: 1441292742.000000\n" #: ../gtk/data/appmenu.ui.h:1 ../qt/src/Ui_MainWindow.hh:165 msgid "Redetect Languages" msgstr "Dilleri Yeniden Algıla" #: ../gtk/data/appmenu.ui.h:2 ../gtk/data/gimagereader.ui.h:39 #: ../qt/data/ConfigDialog.ui.h:1 ../qt/src/Ui_MainWindow.hh:168 msgid "Preferences" msgstr "Tercihler" #: ../gtk/data/appmenu.ui.h:3 ../gtk/data/gimagereader.ui.h:40 #: ../gtk/src/MainWindow.cc:484 ../qt/src/MainWindow.cc:445 #: ../qt/src/Ui_MainWindow.hh:173 msgid "Help" msgstr "Yardım" #: ../gtk/data/appmenu.ui.h:4 ../qt/data/AboutDialog.ui.h:2 #: ../qt/src/Ui_MainWindow.hh:176 msgid "About" msgstr "Hakkında" #: ../gtk/data/appmenu.ui.h:5 msgid "Quit" msgstr "Çık" #: ../gtk/data/crashhandler.ui.h:1 ../qt/src/CrashHandler.cc:36 msgid "Regenerate backtrace" msgstr "Geri dönük izlemeyi yeniden oluştur" #: ../gtk/data/crashhandler.ui.h:2 msgid "The application has crashed" msgstr "Uygulama çöktü" #: ../gtk/data/crashhandler.ui.h:4 #, no-c-format msgid "" "Apologies for the inconvenience. To help improve the application, please " "consider reporting the issue to manisandro@gmail.com. Please try to " "describe what you were doing before the application crashed. Also, include " "the information below. Thank you." msgstr "" "Anlayışınız için teşekkür ederiz. Uygulamanın gelişimine katkıda bulunmak " "için lütfen bu hatayımanisandro@gmail.com adresine bildirin. " "Lütfen çökme olmadan ne yaptığınızı ayrıntılı olarak tanımlayın. Aşağıdaki " "bilgiyi de ekleyin. Teşekkür ederiz." #: ../gtk/data/editor_hocr.ui.h:1 ../qt/data/PdfExportDialog.ui.h:1 msgid "PDF Export" msgstr "PDF Olarak Dışa Aktar" #: ../gtk/data/editor_hocr.ui.h:2 ../gtk/data/gimagereader.ui.h:55 #: ../gtk/src/Acquirer.cc:42 ../gtk/src/FileDialogs.cc:150 #: ../gtk/src/Utils.cc:68 ../qt/data/ConfigDialog.ui.h:27 #: ../qt/data/MainWindow.ui.h:14 msgid "Cancel" msgstr "İptal" #: ../gtk/data/editor_hocr.ui.h:3 ../gtk/data/gimagereader.ui.h:41 #: ../gtk/src/FileDialogs.cc:151 ../gtk/src/Utils.cc:59 #: ../qt/data/ConfigDialog.ui.h:26 msgid "OK" msgstr "Tamam" #: ../gtk/data/editor_hocr.ui.h:4 ../qt/data/PdfExportDialog.ui.h:2 msgid "Output mode:" msgstr "Çıktı kipi:" #: ../gtk/data/editor_hocr.ui.h:5 ../qt/data/PdfExportDialog.ui.h:3 msgid "PDF" msgstr "PDF" #: ../gtk/data/editor_hocr.ui.h:6 ../qt/data/PdfExportDialog.ui.h:4 msgid "PDF with invisible text overlay" msgstr "Görünmeyen metinlerle birlikte PDF" #: ../gtk/data/editor_hocr.ui.h:7 ../qt/data/PdfExportDialog.ui.h:16 msgid "Format:" msgstr "Biçim:" #: ../gtk/data/editor_hocr.ui.h:8 ../qt/data/PdfExportDialog.ui.h:17 msgid "Compression:" msgstr "Sıkıştırma:" #: ../gtk/data/editor_hocr.ui.h:9 ../qt/data/PdfExportDialog.ui.h:14 msgid "Compression quality:" msgstr "Sıkıştırma kalitesi:" #: ../gtk/data/editor_hocr.ui.h:10 ../qt/data/PdfExportDialog.ui.h:15 msgid "DPI:" msgstr "DPI:" #: ../gtk/data/editor_hocr.ui.h:11 ../qt/data/PdfExportDialog.ui.h:18 msgid "Dithering algorithm:" msgstr "Dithering algoritması:" #: ../gtk/data/editor_hocr.ui.h:12 ../qt/data/PdfExportDialog.ui.h:13 msgid "Image settings:" msgstr "Resim ayarları:" #: ../gtk/data/editor_hocr.ui.h:13 ../qt/data/PdfExportDialog.ui.h:11 msgid "Document font:" msgstr "Belge yazı tipi:" #: ../gtk/data/editor_hocr.ui.h:14 ../qt/data/PdfExportDialog.ui.h:7 msgid "Uniformize line and word spacing" msgstr "Satır ve kelime aralıklarını düzleştir" #: ../gtk/data/editor_hocr.ui.h:15 ../qt/data/PdfExportDialog.ui.h:10 msgid "Use detected font sizes" msgstr "Algılanan yazı tipi boyutunu kullan" #: ../gtk/data/editor_hocr.ui.h:16 ../qt/data/PdfExportDialog.ui.h:8 msgid "Preserve spaces wider than:" msgstr "BUndan geniş aralıkları koru:" #: ../gtk/data/editor_hocr.ui.h:17 ../qt/data/PdfExportDialog.ui.h:12 msgid "characters" msgstr "Karakterler" #: ../gtk/data/editor_hocr.ui.h:18 ../qt/data/PdfExportDialog.ui.h:9 msgid "Scale:" msgstr "Ölçek:" #: ../gtk/data/editor_hocr.ui.h:19 ../qt/data/PdfExportDialog.ui.h:6 msgid "Text settings:" msgstr "Metin ayarları:" #: ../gtk/data/editor_hocr.ui.h:20 ../qt/data/PdfExportDialog.ui.h:5 msgid "Show preview" msgstr "Ön izlemeyi göster" #: ../gtk/data/editor_hocr.ui.h:21 ../gtk/data/editor_text.ui.h:26 #: ../qt/src/Ui_OutputEditorText.hh:123 msgid "Save output" msgstr "Çıktıyı kaydet" #: ../gtk/data/editor_hocr.ui.h:22 ../qt/src/Ui_OutputEditorHOCR.hh:44 #: ../qt/src/Ui_OutputEditorHOCR.hh:45 msgid "Export to PDF" msgstr "PDF olarak dışa aktar" #: ../gtk/data/editor_hocr.ui.h:23 ../gtk/data/editor_text.ui.h:27 #: ../qt/src/Ui_OutputEditorHOCR.hh:47 ../qt/src/Ui_OutputEditorHOCR.hh:48 #: ../qt/src/Ui_OutputEditorText.hh:125 msgid "Clear output" msgstr "Çıktıyı temizle" #: ../gtk/data/editor_hocr.ui.h:24 ../qt/src/Ui_OutputEditorHOCR.hh:75 msgid "Properties" msgstr "Özellikler" #: ../gtk/data/editor_hocr.ui.h:25 ../qt/src/Ui_OutputEditorHOCR.hh:79 msgid "Source" msgstr "Kaynak" #. Output insert mode #: ../gtk/data/editor_text.ui.h:1 ../qt/src/Ui_OutputEditorText.hh:59 msgid "Append to current text" msgstr "Mevcut metne ekle" #: ../gtk/data/editor_text.ui.h:2 ../qt/src/Ui_OutputEditorText.hh:60 msgid "Insert at cursor" msgstr "İmleç konumuna ekle" #: ../gtk/data/editor_text.ui.h:3 ../qt/src/Ui_OutputEditorText.hh:61 msgid "Replace current text" msgstr "Mevcut metni değiştir" #: ../gtk/data/editor_text.ui.h:4 ../qt/src/SubstitutionsManager.cc:37 #: ../qt/src/Ui_OutputEditorText.hh:177 msgid "Substitutions" msgstr "Yerine Koyma" #: ../gtk/data/editor_text.ui.h:5 ../qt/src/SubstitutionsManager.cc:42 #: ../qt/src/SubstitutionsManager.cc:43 msgid "Open" msgstr "Aç" #: ../gtk/data/editor_text.ui.h:6 ../gtk/src/Utils.cc:71 #: ../qt/src/SubstitutionsManager.cc:45 ../qt/src/SubstitutionsManager.cc:46 msgid "Save" msgstr "Kaydet" #: ../gtk/data/editor_text.ui.h:7 ../qt/src/SubstitutionsManager.cc:48 #: ../qt/src/SubstitutionsManager.cc:49 msgid "Clear" msgstr "Temizle" #: ../gtk/data/editor_text.ui.h:8 ../qt/data/ConfigDialog.ui.h:16 #: ../qt/src/SubstitutionsManager.cc:51 ../qt/src/SubstitutionsManager.cc:52 msgid "Add" msgstr "Ekle" #: ../gtk/data/editor_text.ui.h:9 ../gtk/src/OutputEditorHOCR.cc:1202 #: ../gtk/src/OutputEditorHOCR.cc:1213 ../qt/data/ConfigDialog.ui.h:17 #: ../qt/src/OutputEditorHOCR.cc:998 ../qt/src/OutputEditorHOCR.cc:1000 #: ../qt/src/SubstitutionsManager.cc:54 ../qt/src/SubstitutionsManager.cc:55 msgid "Remove" msgstr "Çıkar" #: ../gtk/data/editor_text.ui.h:10 ../gtk/data/gimagereader.ui.h:73 msgid "Apply" msgstr "Uygula" #: ../gtk/data/editor_text.ui.h:11 ../gtk/data/gimagereader.ui.h:74 msgid "Close" msgstr "Kapat" #. Output postprocessing #: ../gtk/data/editor_text.ui.h:12 ../qt/src/Ui_OutputEditorText.hh:69 msgid "Keep line break if..." msgstr "Satır sonlarını koru..." #: ../gtk/data/editor_text.ui.h:13 ../qt/src/Ui_OutputEditorText.hh:71 msgid "Preceded by end mark (.?!)" msgstr "Nokta öncesinde gelen (.?!)" #: ../gtk/data/editor_text.ui.h:14 ../qt/src/Ui_OutputEditorText.hh:73 msgid "Preceded or succeeded by quote" msgstr "Tırnak işareti öncesi veya sonrasında ise" #: ../gtk/data/editor_text.ui.h:15 ../qt/src/Ui_OutputEditorText.hh:75 msgid "Other options" msgstr "Diğer seçenekler" #: ../gtk/data/editor_text.ui.h:16 ../qt/src/Ui_OutputEditorText.hh:77 msgid "Join hyphenated words" msgstr "Tire ile ayrılmış kelimeleri birleştir" #: ../gtk/data/editor_text.ui.h:17 ../qt/src/Ui_OutputEditorText.hh:79 msgid "Collapse whitespace" msgstr "Boşlukları daralt" #: ../gtk/data/editor_text.ui.h:18 ../qt/src/Ui_OutputEditorText.hh:81 msgid "Preserve paragraphs" msgstr "Paragrafları koru" #: ../gtk/data/editor_text.ui.h:19 ../qt/src/Ui_OutputEditorText.hh:83 msgid "Visual aids" msgstr "Görsel yardım" #: ../gtk/data/editor_text.ui.h:20 ../qt/src/Ui_OutputEditorText.hh:85 msgid "Draw whitespace" msgstr "Boşluk çiz" #: ../gtk/data/editor_text.ui.h:21 ../gtk/data/gimagereader.ui.h:31 #: ../qt/src/Ui_OutputEditorText.hh:102 msgid "Select insert mode" msgstr "Ekleme kipini seç" #: ../gtk/data/editor_text.ui.h:22 ../qt/src/Ui_OutputEditorText.hh:109 msgid "Strip line breaks on selected text" msgstr "Seçili metinden satır sonlarını çıkart" #: ../gtk/data/editor_text.ui.h:23 ../qt/src/Ui_OutputEditorText.hh:114 msgid "Find and replace" msgstr "Bul ve değiştir" #: ../gtk/data/editor_text.ui.h:24 ../qt/src/Ui_OutputEditorText.hh:116 #: ../qt/src/Ui_OutputEditorText.hh:117 msgid "Undo" msgstr "Geri al" #: ../gtk/data/editor_text.ui.h:25 ../qt/src/Ui_OutputEditorText.hh:119 #: ../qt/src/Ui_OutputEditorText.hh:120 msgid "Redo" msgstr "Yeniden yap" #: ../gtk/data/editor_text.ui.h:28 ../qt/src/Ui_OutputEditorText.hh:149 msgid "Find" msgstr "Bul" #: ../gtk/data/editor_text.ui.h:29 ../qt/src/Ui_OutputEditorText.hh:153 #: ../qt/src/Ui_OutputEditorText.hh:168 msgid "Replace" msgstr "Değiştir" #: ../gtk/data/editor_text.ui.h:30 ../qt/src/Ui_OutputEditorText.hh:173 msgid "Replace all" msgstr "Tümünü değiştir" #: ../gtk/data/editor_text.ui.h:31 ../qt/src/Ui_OutputEditorText.hh:163 msgid "Find previous" msgstr "Öncekini bul" #: ../gtk/data/editor_text.ui.h:32 ../qt/src/Ui_OutputEditorText.hh:158 msgid "Find next" msgstr "Sonrakini bul" #: ../gtk/data/editor_text.ui.h:33 ../qt/src/Ui_OutputEditorText.hh:182 msgid "Match case" msgstr "Büyük Küçük Harf eşleştir" #: ../gtk/data/gimagereader.ui.h:1 ../qt/src/Ui_MainWindow.hh:65 msgid "Rotate current page" msgstr "Mevcut sayfayı döndür" #: ../gtk/data/gimagereader.ui.h:2 ../qt/src/Ui_MainWindow.hh:66 msgid "Rotate all pages" msgstr "Tüm sayfaları döndür" #: ../gtk/data/gimagereader.ui.h:3 ../qt/data/MainWindow.ui.h:35 msgid "Toggle output pane" msgstr "Çıktı bölmesini değiştir" #. Sources toolbar #: ../gtk/data/gimagereader.ui.h:4 ../qt/src/Ui_MainWindow.hh:187 msgid "Recent" msgstr "Son kullanılan" #: ../gtk/data/gimagereader.ui.h:5 ../qt/src/Ui_MainWindow.hh:188 msgid "Paste" msgstr "Yapıştır" #: ../gtk/data/gimagereader.ui.h:6 ../qt/src/Ui_MainWindow.hh:189 msgid "Take Screenshot" msgstr "Ekran Görüntüsü Al" #: ../gtk/data/gimagereader.ui.h:7 ../qt/src/Ui_MainWindow.hh:200 msgid "Add images" msgstr "Resim ekle" #: ../gtk/data/gimagereader.ui.h:8 ../qt/src/Ui_MainWindow.hh:199 msgid "Add Images" msgstr "Resim Ekle" #: ../gtk/data/gimagereader.ui.h:9 ../qt/src/Ui_MainWindow.hh:205 msgid "Remove image from list" msgstr "Resmi listeden çıkar" #: ../gtk/data/gimagereader.ui.h:10 ../qt/src/Ui_MainWindow.hh:208 msgid "Delete image" msgstr "Resmi sil" #: ../gtk/data/gimagereader.ui.h:11 ../qt/src/Ui_MainWindow.hh:211 msgid "Clear list" msgstr "Listeyi temizle" #: ../gtk/data/gimagereader.ui.h:12 ../qt/data/MainWindow.ui.h:6 msgid "Files" msgstr "Dosyalar" #: ../gtk/data/gimagereader.ui.h:13 ../qt/data/MainWindow.ui.h:16 msgid "Device:" msgstr "Aygıt:" #: ../gtk/data/gimagereader.ui.h:14 ../qt/data/MainWindow.ui.h:15 #: ../qt/src/TessdataManager.cc:57 msgid "Refresh" msgstr "Tazele" #: ../gtk/data/gimagereader.ui.h:15 ../qt/data/MainWindow.ui.h:12 msgid "Output:" msgstr "Çıktı:" #: ../gtk/data/gimagereader.ui.h:16 ../qt/data/MainWindow.ui.h:9 msgid "Mode:" msgstr "Kip:" #: ../gtk/data/gimagereader.ui.h:17 ../gtk/src/OutputEditorHOCR.cc:362 #: ../qt/data/MainWindow.ui.h:11 ../qt/src/OutputEditorHOCR.cc:273 msgid "Color" msgstr "Renk" #: ../gtk/data/gimagereader.ui.h:18 ../gtk/src/OutputEditorHOCR.cc:365 #: ../qt/data/MainWindow.ui.h:10 ../qt/src/OutputEditorHOCR.cc:275 #: ../qt/src/OutputEditorHOCR.cc:277 msgid "Grayscale" msgstr "Gri tonlama" #: ../gtk/data/gimagereader.ui.h:19 ../qt/data/MainWindow.ui.h:8 msgid "Resolution:" msgstr "Çözünürlük:" #: ../gtk/data/gimagereader.ui.h:20 ../qt/data/MainWindow.ui.h:13 msgid "Scan" msgstr "Tara" #: ../gtk/data/gimagereader.ui.h:21 ../qt/data/MainWindow.ui.h:7 msgid "Acquire" msgstr "Edin" #: ../gtk/data/gimagereader.ui.h:22 ../qt/data/MainWindow.ui.h:2 msgid "Brightness" msgstr "Parlaklık" #: ../gtk/data/gimagereader.ui.h:23 ../qt/data/MainWindow.ui.h:3 msgid "Contrast" msgstr "Karşıtlık" #: ../gtk/data/gimagereader.ui.h:24 ../qt/data/MainWindow.ui.h:4 msgid "Resolution" msgstr "Çözünürlük" #: ../gtk/data/gimagereader.ui.h:25 ../qt/data/MainWindow.ui.h:5 msgid "Invert colors" msgstr "Renkleri tersine çevir" #: ../gtk/data/gimagereader.ui.h:26 ../qt/data/MainWindow.ui.h:19 msgid "Zoom in" msgstr "Yakınlaştır" #: ../gtk/data/gimagereader.ui.h:27 ../qt/data/MainWindow.ui.h:21 msgid "Zoom out" msgstr "Uzaklaştır" #: ../gtk/data/gimagereader.ui.h:28 ../qt/data/MainWindow.ui.h:23 msgid "Normal size" msgstr "Normal boyut" #: ../gtk/data/gimagereader.ui.h:29 ../qt/data/MainWindow.ui.h:25 msgid "Best fit" msgstr "En uygun" #: ../gtk/data/gimagereader.ui.h:30 ../qt/src/Ui_MainWindow.hh:74 msgid "Select rotation mode" msgstr "Döndürme kipini seç" #: ../gtk/data/gimagereader.ui.h:32 ../qt/data/MainWindow.ui.h:31 msgid "Image controls" msgstr "Resim denetimleri" #: ../gtk/data/gimagereader.ui.h:33 ../qt/src/Ui_MainWindow.hh:137 msgid "Plain text" msgstr "Düz metin" #: ../gtk/data/gimagereader.ui.h:34 ../qt/src/Ui_MainWindow.hh:137 msgid "hOCR, PDF" msgstr "hOCR, PDF" #: ../gtk/data/gimagereader.ui.h:35 ../qt/data/MainWindow.ui.h:33 msgid "Autodetect layout" msgstr "Yerleşimi otomatik algıla" #: ../gtk/data/gimagereader.ui.h:36 msgid "Recognize all" msgstr "Tümünü tanı" #: ../gtk/data/gimagereader.ui.h:37 msgid "Select language" msgstr "Dili seç" #: ../gtk/data/gimagereader.ui.h:38 msgid "A graphical frontend to tesseract-ocr" msgstr "tesseract-ocr komutu için bir grafiksel arayüz" #: ../gtk/data/gimagereader.ui.h:42 msgid "Output pane orientation:" msgstr "Çıktı bölmesi yönelimi:" #: ../gtk/data/gimagereader.ui.h:43 msgid "Horizontal" msgstr "Yatay" #: ../gtk/data/gimagereader.ui.h:44 msgid "Vertical" msgstr "Dikey" #: ../gtk/data/gimagereader.ui.h:45 ../qt/data/ConfigDialog.ui.h:18 msgid "Query to install missing spellcheck dictionaries" msgstr "Eksik imla denetimi sözlüklerini yüklemek için sorgu" #: ../gtk/data/gimagereader.ui.h:46 ../qt/data/ConfigDialog.ui.h:4 msgid "Automatically check for new program versions" msgstr "Yeni program sürümlerini paketlerini otomatik olarak denetle" #: ../gtk/data/gimagereader.ui.h:47 ../qt/data/ConfigDialog.ui.h:3 msgid "Predefined language definitions:" msgstr "Öntanımlı dil tanımlamaları:" #: ../gtk/data/gimagereader.ui.h:48 ../qt/data/ConfigDialog.ui.h:12 msgid "Additional language definitions:" msgstr "Ek dil tanımlamaları:" #: ../gtk/data/gimagereader.ui.h:49 ../qt/data/ConfigDialog.ui.h:20 msgid "The prefix of the tesseract language data file" msgstr "tesseract dil veri dosyasının ön eki" #: ../gtk/data/gimagereader.ui.h:50 ../qt/data/ConfigDialog.ui.h:21 msgid "Prefix" msgstr "Ön ek" #: ../gtk/data/gimagereader.ui.h:51 ../qt/data/ConfigDialog.ui.h:22 msgid "The ISO 639-1 language code followed by the country code" msgstr "ISO 639-1 dil kodunu ülke kodu takip eder" #: ../gtk/data/gimagereader.ui.h:52 ../qt/data/ConfigDialog.ui.h:23 msgid "ISO Code" msgstr "ISO Kodu" #: ../gtk/data/gimagereader.ui.h:53 ../qt/data/ConfigDialog.ui.h:24 msgid "The name of the language" msgstr "Dilin adı" #: ../gtk/data/gimagereader.ui.h:54 ../qt/data/ConfigDialog.ui.h:25 msgid "Name" msgstr "Ad" #: ../gtk/data/gimagereader.ui.h:56 ../qt/data/ConfigDialog.ui.h:5 msgid "Output pane font:" msgstr "Çıktı bölmesi yazı tipi:" #: ../gtk/data/gimagereader.ui.h:57 ../qt/data/ConfigDialog.ui.h:2 msgid "Default" msgstr "Varsayılan" #: ../gtk/data/gimagereader.ui.h:58 ../qt/data/ConfigDialog.ui.h:6 msgid "Language data locations:" msgstr "Dil veri konumları:" #: ../gtk/data/gimagereader.ui.h:59 ../qt/data/ConfigDialog.ui.h:13 msgid "Language definitions path:" msgstr "Dil tanımlama yolu:" #: ../gtk/data/gimagereader.ui.h:60 ../qt/data/ConfigDialog.ui.h:28 msgid "Spelling dictionaries path:" msgstr "Yazım denetimi sözlüğü yolu" #: ../gtk/data/gimagereader.ui.h:61 ../qt/data/ConfigDialog.ui.h:10 msgid "System-wide paths" msgstr "Sistem geneli yolları" #: ../gtk/data/gimagereader.ui.h:62 ../qt/data/ConfigDialog.ui.h:11 msgid "User paths" msgstr "Kullanıcı yolları" #: ../gtk/data/gimagereader.ui.h:63 ../qt/data/PageRangeDialog.ui.h:1 msgid "Page Range" msgstr "Sayfa Aralığı" #: ../gtk/data/gimagereader.ui.h:64 ../qt/data/PageRangeDialog.ui.h:2 msgid "Page range:" msgstr "Sayfa aralığı:" #: ../gtk/data/gimagereader.ui.h:65 ../qt/data/PageRangeDialog.ui.h:3 msgid "Example: 1-10, 13, 14-18" msgstr "Örnek: 1-10, 13, 14-18" #: ../gtk/data/gimagereader.ui.h:66 ../qt/data/PageRangeDialog.ui.h:4 msgid "Recognition area:" msgstr "Tanıma alanı:" #: ../gtk/data/gimagereader.ui.h:67 ../gtk/src/Recognizer.cc:403 #: ../qt/data/PageRangeDialog.ui.h:5 ../qt/src/Recognizer.cc:381 msgid "Entire page" msgstr "Tüm sayfa" #: ../gtk/data/gimagereader.ui.h:68 ../qt/data/PageRangeDialog.ui.h:6 msgid "Autodetect" msgstr "Otomatik Algıla" #: ../gtk/data/gimagereader.ui.h:69 ../qt/data/PageRangeDialog.ui.h:7 #, fuzzy msgid "Prepend to output text:" msgstr "Mevcut metne ekle" #: ../gtk/data/gimagereader.ui.h:70 ../qt/data/PageRangeDialog.ui.h:8 msgid "Source filename" msgstr "" #: ../gtk/data/gimagereader.ui.h:71 ../qt/data/PageRangeDialog.ui.h:9 #, fuzzy msgid "Source page" msgstr "Kaynak" #: ../gtk/data/gimagereader.ui.h:72 ../qt/src/TessdataManager.cc:47 msgid "Tessdata Manager" msgstr "Tessdata Yöneticisi" #: ../gtk/data/gimagereader.ui.h:75 ../qt/src/TessdataManager.cc:49 msgid "Manage installed languages:" msgstr "Kurulan Dilleri Yönet" #: ../gtk/data/gimagereader.ui.h:76 ../qt/src/DisplayerToolSelect.cc:240 msgid "Delete" msgstr "Sil" #: ../gtk/data/gimagereader.ui.h:77 ../qt/src/DisplayerToolSelect.cc:226 msgid "Order:" msgstr "Sıralama:" #: ../gtk/data/gimagereader.ui.h:78 ../gtk/src/DisplayerToolHOCR.cc:28 #: ../qt/src/DisplayerToolHOCR.cc:30 ../qt/src/DisplayerToolSelect.cc:241 msgid "Recognize" msgstr "Tanı" #: ../gtk/data/gimagereader.ui.h:79 ../qt/src/DisplayerToolSelect.cc:242 msgid "Recognize to clipboard" msgstr "Taşıma panosuna tanıt" #: ../gtk/data/gimagereader.ui.h:80 ../qt/src/DisplayerToolSelect.cc:243 msgid "Save as image" msgstr "Resim olarak kaydet" #: ../gtk/data/gimagereader.ui.h:81 ../qt/src/Recognizer.cc:76 msgid "Current Page" msgstr "Geçerli Sayfa" #: ../gtk/data/gimagereader.ui.h:82 ../qt/src/Recognizer.cc:79 msgid "Multiple Pages..." msgstr "Çoklu Sayfalar..." #: ../gtk/src/Acquirer.cc:83 ../qt/src/Acquirer.cc:63 msgid "scan.png" msgstr "tarama.png" #: ../gtk/src/Acquirer.cc:96 ../qt/src/Acquirer.cc:80 msgid "Images" msgstr "Resimler" #: ../gtk/src/Acquirer.cc:97 ../qt/src/Acquirer.cc:81 msgid "Choose Output Filename..." msgstr "Çıktı Dosya Adını Seçin..." #: ../gtk/src/Acquirer.cc:112 ../qt/src/Acquirer.cc:96 msgid "Failed to initialize the scanning backend." msgstr "Tarama uygulaması başlatılamadı." #: ../gtk/src/Acquirer.cc:121 ../qt/src/Acquirer.cc:102 msgid "Scan failed" msgstr "Tarama başarısız oldu" #: ../gtk/src/Acquirer.cc:139 ../qt/src/Acquirer.cc:118 msgid "No scanners were detected." msgstr "Hiç tarayıcı bulunamadı." #: ../gtk/src/Acquirer.cc:156 ../gtk/src/Acquirer.cc:173 #: ../qt/src/Acquirer.cc:132 ../qt/src/Acquirer.cc:149 msgid "Starting scan..." msgstr "Tarama başlatılıyor..." #: ../gtk/src/Acquirer.cc:169 ../qt/src/Acquirer.cc:145 msgid "Opening device..." msgstr "Aygıt açılıyor..." #: ../gtk/src/Acquirer.cc:171 ../qt/src/Acquirer.cc:147 msgid "Setting options..." msgstr "Seçenekler ayarlanıyor..." #: ../gtk/src/Acquirer.cc:175 ../qt/src/Acquirer.cc:151 msgid "Getting parameters..." msgstr "Parametreler alınıyor..." #: ../gtk/src/Acquirer.cc:177 ../qt/src/Acquirer.cc:153 msgid "Transferring data..." msgstr "Veri aktarılıyor..." #: ../gtk/src/Acquirer.cc:184 ../qt/src/Acquirer.cc:160 msgid "Canceling scan..." msgstr "Tarama iptal ediliyor..." #: ../gtk/src/Config.cc:297 ../qt/data/ConfigDialog.ui.h:7 msgid "Filename prefix" msgstr "Dosya adı ön eki" #: ../gtk/src/Config.cc:298 ../qt/data/ConfigDialog.ui.h:8 msgid "Code" msgstr "Kod" #: ../gtk/src/Config.cc:299 ../qt/data/ConfigDialog.ui.h:9 msgid "Native name" msgstr "Doğal isim" #: ../gtk/src/CrashHandler.cc:26 ../gtk/src/CrashHandler.cc:43 #: ../qt/src/CrashHandler.cc:34 msgid "Crash Handler" msgstr "Çökme İşleyici" #: ../gtk/src/CrashHandler.cc:45 ../qt/src/CrashHandler.cc:29 msgid "Your work has been saved under %1." msgstr "Çalışmanız %1 altına kaydedildi." #: ../gtk/src/CrashHandler.cc:47 ../qt/src/CrashHandler.cc:31 msgid "There was no unsaved work." msgstr "Kaydedilmemiş çalışma yok." #: ../gtk/src/CrashHandler.cc:106 ../qt/src/CrashHandler.cc:60 msgid "Failed to obtain backtrace. Is gdb installed?" msgstr "Geri dönük izleme yapılamadı. gdb kurulu mu?" #: ../gtk/src/Displayer.cc:261 ../qt/src/Displayer.cc:231 msgid "Failed to load image" msgstr "Resim yüklenemedi" #: ../gtk/src/Displayer.cc:261 ../qt/src/Displayer.cc:231 msgid "" "The file might not be an image or be corrupt:\n" "%1" msgstr "" "Bu bir resim dosyası değil veya bozulmuş:\n" "%1" #: ../gtk/src/DisplayerToolSelect.cc:39 ../qt/src/DisplayerToolSelect.cc:40 msgid "selection.png" msgstr "secim.png" #: ../gtk/src/DisplayerToolSelect.cc:148 ../qt/src/DisplayerToolSelect.cc:139 msgid "PNG Images" msgstr "PNG Resimleri" #: ../gtk/src/DisplayerToolSelect.cc:149 ../qt/src/DisplayerToolSelect.cc:139 msgid "Save Selection Image" msgstr "Seçim Resmini Kaydet" #: ../gtk/src/DisplayerToolSelect.cc:157 ../qt/src/DisplayerToolSelect.cc:147 msgid "Recognize all" msgstr "Tümünü tanı" #: ../gtk/src/DisplayerToolSelect.cc:157 ../qt/src/DisplayerToolSelect.cc:147 msgid "Recognize selection" msgstr "Seçimi tanı" #: ../gtk/src/DisplayerToolSelect.cc:194 ../qt/src/DisplayerToolSelect.cc:184 msgid "Performing layout analysis" msgstr "Yerleşim çözümlemesi yapılıyor" #: ../gtk/src/FileDialogs.cc:237 msgid "" "A file named \"%1\" already exists. Are you sure you want to overwrite it?" msgstr "" "\"%1\" isimli bir dosya zaten var. Üzerine yazmak istediğinizden emin " "misiniz?" #: ../gtk/src/FileDialogs.cc:239 msgid "Overwrite File?" msgstr "Dosyanın Üstüne Yazılsın mı?" #: ../gtk/src/MainWindow.cc:125 ../qt/src/MainWindow.cc:274 msgid "Using tesseract" msgstr "Tesseract'i kullanmak" #: ../gtk/src/MainWindow.cc:191 ../qt/src/MainWindow.cc:181 msgid "Select an image to begin..." msgstr "Başlamak için bir resim seçin..." #: ../gtk/src/MainWindow.cc:306 ../qt/src/MainWindow.cc:262 msgid "Multiple sources" msgstr "Çoklu kaynak" #: ../gtk/src/MainWindow.cc:307 ../qt/src/MainWindow.cc:263 msgid "Ready" msgstr "Hazır" #: ../gtk/src/MainWindow.cc:446 ../qt/src/MainWindow.cc:390 msgid "New version" msgstr "Yeni sürüm" #: ../gtk/src/MainWindow.cc:446 ../qt/src/MainWindow.cc:390 msgid "gImageReader %1 is available" msgstr "gImageReader %1 kullanılabilir durumda" #: ../gtk/src/MainWindow.cc:447 ../qt/src/MainWindow.cc:391 msgid "Download" msgstr "İndir" #: ../gtk/src/MainWindow.cc:448 ../qt/src/MainWindow.cc:392 msgid "Changelog" msgstr "Değişim günlüğü" #: ../gtk/src/MainWindow.cc:449 ../qt/src/MainWindow.cc:393 msgid "Don't notify again" msgstr "Tekrar uyarma" #: ../gtk/src/MainWindow.cc:468 ../qt/src/MainWindow.cc:438 msgid "Don't show again" msgstr "Tekrar gösterme" #: ../gtk/src/MainWindow.cc:469 ../gtk/src/MainWindow.cc:482 #: ../qt/src/MainWindow.cc:439 msgid "Install" msgstr "Kur" #: ../gtk/src/MainWindow.cc:489 ../qt/src/MainWindow.cc:451 msgid "Spelling dictionary missing" msgstr "Yazım denetimi sözlüğü eksik" #: ../gtk/src/MainWindow.cc:489 ../qt/src/MainWindow.cc:451 msgid "The spellcheck dictionary for %1 is not installed" msgstr "%1 için yazım denetimi sözlüğü kurulmadı" #: ../gtk/src/MainWindow.cc:496 ../gtk/src/MainWindow.cc:528 #: ../qt/src/MainWindow.cc:458 msgid "Installing spelling dictionary for '%1'" msgstr "'%1' için yazım denetimi sözlüğü kuruluyor" #: ../gtk/src/MainWindow.cc:517 ../gtk/src/MainWindow.cc:542 #: ../gtk/src/MainWindow.cc:550 ../gtk/src/MainWindow.cc:560 #: ../gtk/src/MainWindow.cc:566 ../gtk/src/MainWindow.cc:595 #: ../gtk/src/OutputEditorHOCR.cc:1375 ../gtk/src/Recognizer.cc:163 #: ../gtk/src/TessdataManager.cc:58 ../gtk/src/TessdataManager.cc:68 #: ../gtk/src/TessdataManager.cc:290 ../qt/src/MainWindow.cc:477 #: ../qt/src/MainWindow.cc:490 ../qt/src/MainWindow.cc:500 #: ../qt/src/MainWindow.cc:510 ../qt/src/MainWindow.cc:518 #: ../qt/src/MainWindow.cc:546 ../qt/src/OutputEditorHOCR.cc:1157 #: ../qt/src/Recognizer.cc:138 ../qt/src/TessdataManager.cc:72 #: ../qt/src/TessdataManager.cc:82 ../qt/src/TessdataManager.cc:275 msgid "Error" msgstr "Hata" #: ../gtk/src/MainWindow.cc:517 ../qt/src/MainWindow.cc:477 msgid "Failed to install spelling dictionary: %1" msgstr "Yazım denetimi sözlüğü kurulamadı: %1" #: ../gtk/src/MainWindow.cc:542 ../qt/src/MainWindow.cc:490 msgid "Failed to create directory for spelling dictionaries." msgstr "Yazım denetimi sözlüğü kurulamadı." #: ../gtk/src/MainWindow.cc:550 ../gtk/src/MainWindow.cc:566 #: ../qt/src/MainWindow.cc:500 msgid "Could not read %1: %2." msgstr "%1 okunamadı: %2" #: ../gtk/src/MainWindow.cc:560 ../gtk/src/MainWindow.cc:595 #: ../qt/src/MainWindow.cc:510 ../qt/src/MainWindow.cc:546 msgid "No spelling dictionaries found for '%1'." msgstr "'%1' için yazım denetimi sözlüğü bulunamadı." #: ../gtk/src/MainWindow.cc:576 ../qt/src/MainWindow.cc:529 msgid "Downloading '%1'..." msgstr "'%1' indiriliyor..." #: ../gtk/src/MainWindow.cc:592 ../qt/src/MainWindow.cc:543 msgid "Dictionaries installed" msgstr "Sözlükler kuruldu" #: ../gtk/src/MainWindow.cc:592 msgid "The following dictionaries were installed:%1" msgstr "Kurulan sözlükler: %1" #: ../gtk/src/OutputEditorHOCR.cc:319 ../qt/src/OutputEditorHOCR.cc:291 msgid "Document" msgstr "Belge" #: ../gtk/src/OutputEditorHOCR.cc:368 ../qt/src/OutputEditorHOCR.cc:279 msgid "Monochrome" msgstr "Siyah beyaz" #: ../gtk/src/OutputEditorHOCR.cc:377 ../qt/src/OutputEditorHOCR.cc:281 msgid "Threshold (closest color)" msgstr "Eşik (en yakın renk)" #: ../gtk/src/OutputEditorHOCR.cc:380 ../qt/src/OutputEditorHOCR.cc:282 msgid "Diffuse" msgstr "Yayılmış" #: ../gtk/src/OutputEditorHOCR.cc:389 ../qt/src/OutputEditorHOCR.cc:283 msgid "Zip (lossless)" msgstr "Zip (kayıpsız)" #: ../gtk/src/OutputEditorHOCR.cc:393 ../qt/src/OutputEditorHOCR.cc:284 msgid "CCITT Group 4 (lossless)" msgstr "CCITT Grup 4 (kayıpsız)" #: ../gtk/src/OutputEditorHOCR.cc:397 ../qt/src/OutputEditorHOCR.cc:285 msgid "Jpeg (lossy)" msgstr "Jpeg (kayıplı)" #: ../gtk/src/OutputEditorHOCR.cc:553 ../qt/src/OutputEditorHOCR.cc:429 msgid "" "The following pages could not be processed:\n" "%1" msgstr "" "Aşağıdaki sayfalar işlenemedi:\n" "%1" #: ../gtk/src/OutputEditorHOCR.cc:554 ../qt/src/OutputEditorHOCR.cc:430 msgid "Recognition errors" msgstr "Tanıma hataları" #. Add tree item #: ../gtk/src/OutputEditorHOCR.cc:647 ../gtk/src/OutputEditorHOCR.cc:1037 #: ../qt/src/OutputEditorHOCR.cc:504 ../qt/src/OutputEditorHOCR.cc:894 msgid "Graphic" msgstr "Grafik" #: ../gtk/src/OutputEditorHOCR.cc:703 ../qt/src/OutputEditorHOCR.cc:563 msgid "Paragraph" msgstr "Paragraf" #: ../gtk/src/OutputEditorHOCR.cc:706 ../qt/src/OutputEditorHOCR.cc:566 msgid "Textline" msgstr "Metin" #: ../gtk/src/OutputEditorHOCR.cc:1136 ../qt/src/OutputEditorHOCR.cc:950 msgid "Merge" msgstr "Birleştir" #: ../gtk/src/OutputEditorHOCR.cc:1161 ../qt/src/OutputEditorHOCR.cc:977 msgid "Add graphic region" msgstr "Grafik alanı ekle" #: ../gtk/src/OutputEditorHOCR.cc:1177 ../qt/src/OutputEditorHOCR.cc:985 msgid "No suggestions" msgstr "Öneri yok" #: ../gtk/src/OutputEditorHOCR.cc:1183 ../qt/src/OutputEditorHOCR.cc:989 msgid "Add to dictionary" msgstr "Sözlük ekle" #: ../gtk/src/OutputEditorHOCR.cc:1189 ../qt/src/OutputEditorHOCR.cc:990 msgid "Ignore word" msgstr "Kelimeyi yoksay" #: ../gtk/src/OutputEditorHOCR.cc:1222 ../qt/src/OutputEditorHOCR.cc:1007 msgid "Expand all" msgstr "Genişlet" #: ../gtk/src/OutputEditorHOCR.cc:1225 ../qt/src/OutputEditorHOCR.cc:1008 msgid "Collapse all" msgstr "Daralt" #: ../gtk/src/OutputEditorHOCR.cc:1248 ../gtk/src/OutputEditorHOCR.cc:1287 #: ../qt/src/OutputEditorHOCR.cc:1049 ../qt/src/OutputEditorHOCR.cc:1079 msgid "hOCR HTML Files" msgstr "hOCR HTML Dosyaları" #: ../gtk/src/OutputEditorHOCR.cc:1249 ../qt/src/OutputEditorHOCR.cc:1049 msgid "Open hOCR File" msgstr "hOCR Dosyasını Aç" #: ../gtk/src/OutputEditorHOCR.cc:1258 ../qt/src/OutputEditorHOCR.cc:1055 msgid "Failed to open file" msgstr "Dosya açılamadı" #: ../gtk/src/OutputEditorHOCR.cc:1258 ../qt/src/OutputEditorHOCR.cc:1055 msgid "The file could not be opened: %1." msgstr "Bu dosya açılamadı:%1" #: ../gtk/src/OutputEditorHOCR.cc:1267 ../qt/src/OutputEditorHOCR.cc:1062 msgid "Invalid hOCR file" msgstr "Geçersiz hOCR dosyası" #: ../gtk/src/OutputEditorHOCR.cc:1267 ../qt/src/OutputEditorHOCR.cc:1062 msgid "The file does not appear to contain valid hOCR HTML: %1" msgstr "Dosya geçerli hOCR HTML içermiyor gibi görünüyor: %1" #: ../gtk/src/OutputEditorHOCR.cc:1283 ../gtk/src/OutputEditorHOCR.cc:1343 #: ../gtk/src/OutputEditorText.cc:306 ../qt/src/OutputEditorHOCR.cc:1077 #: ../qt/src/OutputEditorHOCR.cc:1131 ../qt/src/OutputEditorText.cc:246 msgid "output" msgstr "çıktı" #: ../gtk/src/OutputEditorHOCR.cc:1288 ../qt/src/OutputEditorHOCR.cc:1079 msgid "Save hOCR Output..." msgstr "oOCR Çıktısını Kaydet..." #: ../gtk/src/OutputEditorHOCR.cc:1296 ../gtk/src/OutputEditorHOCR.cc:1357 #: ../gtk/src/OutputEditorText.cc:319 ../qt/src/OutputEditorHOCR.cc:1087 #: ../qt/src/OutputEditorHOCR.cc:1143 ../qt/src/OutputEditorText.cc:256 msgid "Failed to save output" msgstr "Çıktının kaydedilmesi başarısız oldu" #: ../gtk/src/OutputEditorHOCR.cc:1296 ../gtk/src/OutputEditorHOCR.cc:1357 #: ../gtk/src/OutputEditorText.cc:319 ../qt/src/OutputEditorHOCR.cc:1087 #: ../qt/src/OutputEditorHOCR.cc:1143 ../qt/src/OutputEditorText.cc:256 msgid "Check that you have writing permissions in the selected folder." msgstr "Seçilen klasöre yazma hakkınız olduğundan emin olun." #: ../gtk/src/OutputEditorHOCR.cc:1346 ../qt/src/OutputEditorHOCR.cc:1133 msgid "PDF Files" msgstr "PDF Dosyaları" #: ../gtk/src/OutputEditorHOCR.cc:1347 ../qt/src/OutputEditorHOCR.cc:1133 msgid "Save PDF Output..." msgstr "PDF Çıktısını Kaydet..." #: ../gtk/src/OutputEditorHOCR.cc:1375 ../qt/src/OutputEditorHOCR.cc:1157 msgid "The PDF library does not support the selected font." msgstr "PDF kitaplığı seçilen yazı tipini desteklemiyor." #: ../gtk/src/OutputEditorHOCR.cc:1435 ../qt/src/OutputEditorHOCR.cc:1216 msgid "Errors occurred" msgstr "Hatalar oluştu" #: ../gtk/src/OutputEditorHOCR.cc:1435 ../qt/src/OutputEditorHOCR.cc:1216 msgid "" "The following pages could not be rendered:\n" "%1" msgstr "" "Aşağıdaki dosyalar işlenemedi:\n" "%1" #: ../gtk/src/OutputEditorHOCR.cc:1562 ../gtk/src/OutputEditorText.cc:333 #: ../qt/src/OutputEditorHOCR.cc:1331 ../qt/src/OutputEditorText.cc:269 msgid "Output not saved" msgstr "Çıktı kaydedilmedi" #: ../gtk/src/OutputEditorHOCR.cc:1562 ../gtk/src/OutputEditorText.cc:333 #: ../qt/src/OutputEditorHOCR.cc:1331 ../qt/src/OutputEditorText.cc:269 msgid "Save output before proceeding?" msgstr "Devam etmeden çıktı kaydedilsin mi?" #: ../gtk/src/OutputEditorText.cc:197 ../qt/src/OutputEditorText.cc:158 msgid "Stripping line breaks..." msgstr "Satır sonları çıkartılıyor..." #: ../gtk/src/OutputEditorText.cc:211 msgid "Check spelling" msgstr "Yazım denetimi yap" #: ../gtk/src/OutputEditorText.cc:238 ../qt/src/OutputEditorText.cc:178 msgid "Replacing..." msgstr "Değiştiriliyor..." #: ../gtk/src/OutputEditorText.cc:264 ../qt/src/OutputEditorText.cc:204 #, fuzzy msgid "File: %1" msgstr "Dosyalar" #: ../gtk/src/OutputEditorText.cc:267 ../qt/src/OutputEditorText.cc:207 #, fuzzy msgid "Page: %1" msgstr "İşleme hatası: %1" #: ../gtk/src/OutputEditorText.cc:280 ../gtk/src/Recognizer.cc:481 #: ../qt/src/Recognizer.cc:460 msgid "" "\n" "[Failed to recognize page %1]\n" msgstr "" "\n" "[Sayfanın tanınması başarısız oldu %1]\n" #: ../gtk/src/OutputEditorText.cc:310 ../qt/src/OutputEditorText.cc:248 msgid "Text Files" msgstr "Metin Dosyaları" #: ../gtk/src/OutputEditorText.cc:311 ../qt/src/OutputEditorText.cc:248 msgid "Save Output..." msgstr "Çıktıyı Kaydet..." #: ../gtk/src/Recognizer.cc:156 ../qt/src/Recognizer.cc:131 msgid "" "Tesseract crashed with the following message:\n" "\n" "%1\n" "\n" "This typically happens for one of the following reasons:\n" "- Outdated traineddata files are used.\n" "- Auxiliary language data files are missing.\n" "- Corrupt language data files.\n" "\n" "Make sure your language data files are valid and compatible with tesseract " "%2." msgstr "" "Tesseract, aşağıdaki ileti ile çöktü:\n" "\n" "%1\n" "\n" "Bu genellikle aşağıdaki nedenlerden biriyle olur:\n" "- Eski eğitimli veri dosyaları kullanılır.\n" "- Yardımcı dil veri dosyaları eksik.\n" "- Bozuk dil verileri dosyaları.\n" "\n" "Dil verilerinizin geçerli olduğundan ve %2 tesseract ile uyumlu olduğundan " "emin olun." #: ../gtk/src/Recognizer.cc:212 ../qt/src/Recognizer.cc:191 msgid "No languages available" msgstr "Kullanılabilir dil yok" #: ../gtk/src/Recognizer.cc:212 ../qt/src/Recognizer.cc:191 msgid "" "No tesseract languages are available for use. Recognition will not work." msgstr "Kullanılacak hiç tesseract dili yok. Tanıma çalışmayacak." #: ../gtk/src/Recognizer.cc:266 ../qt/src/Recognizer.cc:251 msgid "Multilingual" msgstr "Çokdilli" #: ../gtk/src/Recognizer.cc:318 ../qt/src/Recognizer.cc:295 msgid "Automatic page segmentation" msgstr "Otomatik sayfa bölümlendirme" #: ../gtk/src/Recognizer.cc:319 ../qt/src/Recognizer.cc:296 msgid "Page segmentation with orientation and script detection" msgstr "Yönlendirme ve komut dosyası algılama ile sayfa bölümleme" #: ../gtk/src/Recognizer.cc:320 ../qt/src/Recognizer.cc:297 msgid "Assume single column of text" msgstr "Tek sütünlu metin olarak kabul et" #: ../gtk/src/Recognizer.cc:321 ../qt/src/Recognizer.cc:298 msgid "Assume single block of vertically aligned text" msgstr "Dikey olarak hizalanan metnin tek blok olduğunu varsay" #: ../gtk/src/Recognizer.cc:322 ../qt/src/Recognizer.cc:299 msgid "Assume a single uniform block of text" msgstr "Tek bir metin bloğu varsay" #: ../gtk/src/Recognizer.cc:323 ../qt/src/Recognizer.cc:300 msgid "Assume a line of text" msgstr "Bir satırlık metin varsay" #: ../gtk/src/Recognizer.cc:324 ../qt/src/Recognizer.cc:301 msgid "Assume a single word" msgstr "Tek bir kelime varsay" #: ../gtk/src/Recognizer.cc:325 ../qt/src/Recognizer.cc:302 msgid "Assume a single word in a circle" msgstr "Çember içinde tek bir kelime varsay" #: ../gtk/src/Recognizer.cc:326 ../qt/src/Recognizer.cc:303 msgid "Sparse text in no particular order" msgstr "Düzenli bir sırası olmayan aralıklı metin" #: ../gtk/src/Recognizer.cc:327 ../qt/src/Recognizer.cc:304 msgid "Sparse text with orientation and script detection" msgstr "Yönlendirme ve komut dosyası algılama özellikli metin" #: ../gtk/src/Recognizer.cc:341 ../qt/src/Recognizer.cc:314 msgid "Page segmentation mode" msgstr "Sayfa parçalama kipi" #: ../gtk/src/Recognizer.cc:347 ../qt/src/Recognizer.cc:321 msgid "Manage languages..." msgstr "Dilleri yönet..." #: ../gtk/src/Recognizer.cc:403 ../qt/src/Recognizer.cc:381 msgid "Current selection" msgstr "Mevcut seçim" #: ../gtk/src/Recognizer.cc:475 ../qt/src/Recognizer.cc:454 msgid "Recognizing page %1 (%2 of %3)" msgstr "Tanınan sayfa %1 (%2 of %3)" #: ../gtk/src/Recognizer.cc:480 ../qt/src/Recognizer.cc:459 msgid "" "\n" "- Page %1: failed to render page" msgstr "" "\n" "- Sayfa %1: sayfanın işlenemedi" #: ../gtk/src/Recognizer.cc:510 ../gtk/src/Recognizer.cc:539 #: ../gtk/src/Recognizer.cc:552 ../qt/src/Recognizer.cc:488 #: ../qt/src/Recognizer.cc:517 ../qt/src/Recognizer.cc:530 msgid "Recognizing..." msgstr "Tanınıyor..." #: ../gtk/src/Recognizer.cc:514 ../gtk/src/Recognizer.cc:522 #: ../qt/src/Recognizer.cc:492 ../qt/src/Recognizer.cc:500 msgid "Recognition errors occurred" msgstr "Tanıma hataları oluştu" #: ../gtk/src/Recognizer.cc:514 ../qt/src/Recognizer.cc:492 msgid "The following errors occurred:%1" msgstr "Aşağıdaki hatalar oluştu: %1" #: ../gtk/src/Recognizer.cc:522 ../qt/src/Recognizer.cc:500 msgid "Failed to initialize tesseract" msgstr "tesseract başlatılamadı" #: ../gtk/src/scanner/ScannerSane.cc:83 ../gtk/src/scanner/ScannerTwain.cc:287 #: ../qt/src/scanner/ScannerSane.cc:85 ../qt/src/scanner/ScannerTwain.cc:285 msgid "Scan canceled" msgstr "Tarama iptal edildi" #: ../gtk/src/scanner/ScannerSane.cc:157 ../gtk/src/scanner/ScannerTwain.cc:186 #: ../qt/src/scanner/ScannerSane.cc:158 ../qt/src/scanner/ScannerTwain.cc:178 msgid "No scanner specified" msgstr "Trayıcı belirtilmedi" #: ../gtk/src/scanner/ScannerSane.cc:166 ../gtk/src/scanner/ScannerTwain.cc:195 #: ../qt/src/scanner/ScannerSane.cc:167 ../qt/src/scanner/ScannerTwain.cc:187 msgid "Unable to connect to scanner" msgstr "Tarayıcıya bağlanılamadı" #: ../gtk/src/scanner/ScannerSane.cc:386 ../gtk/src/scanner/ScannerTwain.cc:265 #: ../gtk/src/scanner/ScannerTwain.cc:291 ../qt/src/scanner/ScannerSane.cc:387 #: ../qt/src/scanner/ScannerTwain.cc:257 ../qt/src/scanner/ScannerTwain.cc:289 msgid "Unable to start scan" msgstr "Tarama başlatılamadı" #: ../gtk/src/scanner/ScannerSane.cc:394 ../gtk/src/scanner/ScannerSane.cc:437 #: ../gtk/src/scanner/ScannerTwain.cc:317 ../qt/src/scanner/ScannerSane.cc:395 #: ../qt/src/scanner/ScannerSane.cc:438 ../qt/src/scanner/ScannerTwain.cc:315 msgid "Error communicating with scanner" msgstr "Tarayıcı ile iletişim kurma hatası" #: ../gtk/src/scanner/ScannerSane.cc:498 ../qt/src/scanner/ScannerSane.cc:494 msgid "Failed to save image" msgstr "Resim kaydedilemedi" #: ../gtk/src/SourceManager.cc:118 ../qt/src/SourceManager.cc:112 msgid "Unable to open files" msgstr "Dosyalar açılamadı" #: ../gtk/src/SourceManager.cc:118 ../qt/src/SourceManager.cc:112 msgid "The following files could not be opened:%1" msgstr "Bu dosyalar açılamadı:%1" #: ../gtk/src/SourceManager.cc:134 ../qt/src/SourceManager.cc:154 msgid "Images and PDFs" msgstr "Resimler ve PDF dosyaları" #: ../gtk/src/SourceManager.cc:137 ../qt/src/SourceManager.cc:155 msgid "Select Files" msgstr "Dosyaları Seçin" #: ../gtk/src/SourceManager.cc:143 ../qt/src/SourceManager.cc:166 msgid "Clipboard Error" msgstr "Geçici Taşıma Panosu Hatası" #: ../gtk/src/SourceManager.cc:143 ../qt/src/SourceManager.cc:166 msgid "Failed to read the clipboard." msgstr "Taşıma panosu okunamadı." #: ../gtk/src/SourceManager.cc:147 ../qt/src/SourceManager.cc:170 #: ../qt/src/SourceManager.cc:176 msgid "Pasted %1" msgstr "%1 Yapıştırıldı" #: ../gtk/src/SourceManager.cc:159 ../qt/src/SourceManager.cc:183 msgid "Screenshot Error" msgstr "Ekran Görüntüsü Hatası" #: ../gtk/src/SourceManager.cc:159 ../qt/src/SourceManager.cc:183 msgid "Failed to take screenshot." msgstr "Ekran görüntüsü alınamadı." #: ../gtk/src/SourceManager.cc:163 ../qt/src/SourceManager.cc:187 msgid "Screenshot %1" msgstr "Ekran Görüntüsü %1" #: ../gtk/src/SourceManager.cc:168 ../qt/src/SourceManager.cc:192 msgid "Saving image..." msgstr "Resim kaydediliyor..." #: ../gtk/src/SourceManager.cc:175 ../qt/src/SourceManager.cc:205 msgid "Cannot Write File" msgstr "Dosya Yazılamıyor" #: ../gtk/src/SourceManager.cc:175 ../qt/src/SourceManager.cc:205 msgid "Could not write to %1." msgstr "%1 dosyasına yazılamadı." #: ../gtk/src/SourceManager.cc:202 ../qt/src/SourceManager.cc:227 msgid "Delete File?" msgstr "Dosya Silinsin mi?" #: ../gtk/src/SourceManager.cc:202 ../qt/src/SourceManager.cc:227 msgid "The following files will be deleted:%1" msgstr "Aşağıdaki dosyalar silinecek:%1" #: ../gtk/src/SourceManager.cc:266 ../qt/src/SourceManager.cc:278 msgid "Missing File" msgstr "Eksik Dosya" #: ../gtk/src/SourceManager.cc:266 ../qt/src/SourceManager.cc:278 msgid "" "The following file has been deleted or moved:\n" "%1" msgstr "" "Aşağıdaki dosya silinmiş veya taşınmış:\n" "%1" #: ../gtk/src/SubstitutionsManager.cc:39 ../qt/src/SubstitutionsManager.cc:77 msgid "Search for" msgstr "Ara" #: ../gtk/src/SubstitutionsManager.cc:40 ../qt/src/SubstitutionsManager.cc:77 msgid "Replace with" msgstr "Bununla değiştir" #: ../gtk/src/SubstitutionsManager.cc:62 ../qt/src/SubstitutionsManager.cc:99 msgid "substitution_list.txt" msgstr "degistirme_listesi.txt" #: ../gtk/src/SubstitutionsManager.cc:84 ../gtk/src/SubstitutionsManager.cc:119 #: ../qt/src/SubstitutionsManager.cc:114 ../qt/src/SubstitutionsManager.cc:152 msgid "Substitutions List" msgstr "Değiştirme Listesi" #: ../gtk/src/SubstitutionsManager.cc:85 ../qt/src/SubstitutionsManager.cc:114 msgid "Open Substitutions List" msgstr "Değiştirme Listesini Aç" #: ../gtk/src/SubstitutionsManager.cc:90 ../qt/src/SubstitutionsManager.cc:119 msgid "Error Reading File" msgstr "Dosya Okunurken Hata" #: ../gtk/src/SubstitutionsManager.cc:90 ../qt/src/SubstitutionsManager.cc:119 msgid "Unable to read '%1'." msgstr "'%1' okunamadı." #: ../gtk/src/SubstitutionsManager.cc:113 ../qt/src/SubstitutionsManager.cc:146 msgid "Errors Occurred Reading File" msgstr "Dosya Okunurken Hatalar Oluştu" #: ../gtk/src/SubstitutionsManager.cc:113 ../qt/src/SubstitutionsManager.cc:146 msgid "Some entries of the substitutions list could not be read." msgstr "Değiştirme listesindeki bazı girdiler okunamadı." #: ../gtk/src/SubstitutionsManager.cc:120 ../qt/src/SubstitutionsManager.cc:152 msgid "Save Substitutions List" msgstr "Değiştirme Listesini Kaydet" #: ../gtk/src/SubstitutionsManager.cc:126 ../qt/src/SubstitutionsManager.cc:158 msgid "Error Saving File" msgstr "Dosya Kaydetmede Hata" #: ../gtk/src/SubstitutionsManager.cc:126 ../qt/src/SubstitutionsManager.cc:158 msgid "Unable to write to '%1'." msgstr "'%1' dosyasına yazılamadı." #: ../gtk/src/SubstitutionsManager.cc:144 ../qt/src/SubstitutionsManager.cc:172 msgid "Save List?" msgstr "Liste Kaydedilsin mi?" #: ../gtk/src/SubstitutionsManager.cc:144 ../qt/src/SubstitutionsManager.cc:172 msgid "Do you want to save the current list?" msgstr "Mevcut listeyi kaydetmek istiyor musunuz?" #: ../gtk/src/SubstitutionsManager.cc:179 ../qt/src/SubstitutionsManager.cc:208 msgid "Applying substitutions..." msgstr "Değişiklikler uygulanıyor..." #: ../gtk/src/TessdataManager.cc:58 ../qt/src/TessdataManager.cc:72 msgid "" "PackageKit is required for managing system-wide tesseract language packs, " "but it was not found. Please use the system package management software to " "manage the tesseract language packs, or switch to use the user tessdata path " "in the configuration dialog." msgstr "" "PackageKit, sistem çapında tesseract dil paketlerini yönetmek için gerekli " "ama bulunamadı. Lütfen tesseract dil paketlerini yönetmek için sistem paketi " "yönetim yazılımını kullanın veya yapılandırma iletişim kutusunda kullanıcı " "tessdata yolunu kullanmaya geçin." #: ../gtk/src/TessdataManager.cc:63 ../qt/src/TessdataManager.cc:77 msgid "Fetching available languages" msgstr "Kullanılabilir diller getiriliyor" #: ../gtk/src/TessdataManager.cc:68 ../gtk/src/TessdataManager.cc:89 #: ../gtk/src/TessdataManager.cc:121 ../qt/src/TessdataManager.cc:82 #: ../qt/src/TessdataManager.cc:94 ../qt/src/TessdataManager.cc:127 msgid "Failed to fetch list of available languages: %1" msgstr "Kullanılabilir dillerin listesi getirilemedi: %1" #: ../gtk/src/TessdataManager.cc:100 ../gtk/src/TessdataManager.cc:129 #: ../qt/src/TessdataManager.cc:105 ../qt/src/TessdataManager.cc:114 #: ../qt/src/TessdataManager.cc:136 ../qt/src/TessdataManager.cc:147 msgid "Parsing error: %1" msgstr "İşleme hatası: %1" #: ../gtk/src/TessdataManager.cc:191 ../qt/src/TessdataManager.cc:191 msgid "Applying changes..." msgstr "Değişiklikler uygulanıyor..." #: ../gtk/src/TessdataManager.cc:252 ../qt/src/TessdataManager.cc:237 msgid "Failed to create directory for tessdata files." msgstr "Tessdata dosyaları için dizin oluşturulamadı." #: ../gtk/src/TessdataManager.cc:261 ../qt/src/TessdataManager.cc:245 msgid "Downloading %1..." msgstr "%1 indiriliyor..." #: ../gtk/src/TessdataManager.cc:281 ../qt/src/TessdataManager.cc:267 msgid "" "The following files could not be downloaded or removed:\n" "%1\n" "\n" "Check the connectivity and directory permissions." msgstr "" "Aşağıdaki dosyalar indirilemedi veya silinemedi:\n" "%1\n" "\n" "Bağlantınızı ve dizin izinlerini denetleyin." #: ../gtk/src/Utils.cc:62 msgid "Yes" msgstr "Evet" #: ../gtk/src/Utils.cc:65 msgid "No" msgstr "Hayır" #: ../gtk/src/Utils.cc:74 msgid "Discard" msgstr "Vazgeç" #: ../qt/data/AboutDialog.ui.h:1 msgid "About gImageReader" msgstr "gImageReader Hakkında" #: ../qt/data/AboutDialog.ui.h:3 #, fuzzy msgid "" "

 

A graphical frontend to tesseract-ocr

Website

 

" msgstr "" "

 

tesseract-ocr için bir grafik önyüz

Web adresi

 

" #: ../qt/data/AboutDialog.ui.h:4 msgid "Credits" msgstr "Geliştirenler" #: ../qt/data/AboutDialog.ui.h:5 msgid "License" msgstr "Lisans" #: ../qt/data/ConfigDialog.ui.h:14 msgid "System encoding" msgstr "Sistem kodlaması" #: ../qt/data/ConfigDialog.ui.h:15 msgid "UTF-8" msgstr "UTF-8" #: ../qt/data/ConfigDialog.ui.h:19 msgid "Text file encoding:" msgstr "Metin dosyası kodlaması" #: ../qt/data/CrashHandler.ui.h:2 #, no-c-format msgid "" "

The application has " "crashed

Apologies for the inconvenience. To help improve the " "application, please consider reporting the issue to manisandro@gmail.com. Please try to describe what you were doing before the application " "crashed. Also, include the information below. Thank you.

" msgstr "" "

Uygulama çöktü

Anlayışınız için teşekkür ederiz. Uygulamanın gelişimine katkıda " "bulunmak için lütfen bu hatayımanisandro@gmail.com adresine bildirin. " "Lütfen çökme olmadan ne yaptığınızı ayrıntılı olarak tanımlayın. Aşağıdaki " "bilgiyi de ekleyin. Teşekkür ederiz.

" #: ../qt/data/MainWindow.ui.h:1 msgid "gImageReader" msgstr "gImageReader" #. Remove & from some labels which designer insists in adding #: ../qt/data/MainWindow.ui.h:17 ../qt/src/Ui_MainWindow.hh:49 msgid "Sources" msgstr "Kaynaklar" #: ../qt/data/MainWindow.ui.h:18 msgid "Zoom In" msgstr "Yaklaştır" #: ../qt/data/MainWindow.ui.h:20 msgid "Zoom Out" msgstr "Uzaklaştır" #: ../qt/data/MainWindow.ui.h:22 msgid "Normal Size" msgstr "Normal Boyut" #: ../qt/data/MainWindow.ui.h:24 msgid "Best Fit" msgstr "En Uygun" #: ../qt/data/MainWindow.ui.h:26 msgid "Rotate Left" msgstr "Sola Döndür" #: ../qt/data/MainWindow.ui.h:27 msgid "Rotate left" msgstr "Sola döndür" #: ../qt/data/MainWindow.ui.h:28 msgid "Rotate Right" msgstr "Sağa Döndür" #: ../qt/data/MainWindow.ui.h:29 msgid "Rotate right" msgstr "Sağa döndür" #: ../qt/data/MainWindow.ui.h:30 msgid "Image Controls" msgstr "Resim Denetimleri" #: ../qt/data/MainWindow.ui.h:32 msgid "Autodetect Layout" msgstr "Yerleşimi Otomatik Algıla" #: ../qt/data/MainWindow.ui.h:34 msgid "Toggle Output Pane" msgstr "Çıktı Bölmesini Değiştir" #: ../qt/src/MainWindow.cc:518 msgid "Could not read %1: %2" msgstr "%1 okunamadı: %2" #: ../qt/src/MainWindow.cc:543 msgid "The following dictionary files were installed:%1" msgstr "Kurulan sözlük dosyaları: %1" #: ../qt/src/Ui_MainWindow.hh:50 msgid "Output" msgstr "Çıktı" #: ../qt/src/Ui_MainWindow.hh:133 msgid "OCR mode:" msgstr "OCR kipi:" #: ../qt/src/Ui_MainWindow.hh:204 msgid "Remove Image" msgstr "Resmi Kaldır" #: ../qt/src/Ui_MainWindow.hh:207 msgid "Delete Image" msgstr "Resmi Sil" #: ../qt/src/Ui_MainWindow.hh:210 msgid "Clear List" msgstr "Listeyi Temizle" #. Output toolbar #: ../qt/src/Ui_OutputEditorHOCR.hh:39 ../qt/src/Ui_OutputEditorHOCR.hh:40 msgid "Open hOCR file" msgstr "hOCR dosyasını aç" #: ../qt/src/Ui_OutputEditorHOCR.hh:41 ../qt/src/Ui_OutputEditorHOCR.hh:42 msgid "Save as hOCR text" msgstr "oOCR metni olarak kaydet" #: ../qt/src/Ui_OutputEditorText.hh:108 msgid "Strip Line Breaks" msgstr "Satır Sonlarını Çıkart" #: ../qt/src/Ui_OutputEditorText.hh:113 msgid "Find and Replace" msgstr "Bul ve Değiştir" #: ../qt/src/Ui_OutputEditorText.hh:122 msgid "Save Output" msgstr "Çıktıyı Kaydet" #: ../qt/src/Ui_OutputEditorText.hh:124 msgid "Clear Output" msgstr "Çıktıyı Temizle" #, fuzzy #~ msgid "" #~ "<html><head/><body><p><span style=" font-" #~ "weight:600;">The application has crashed</span></p>" #~ "<p>Apologies for the inconvenience. To help improve the " #~ "application, please consider reporting the issue to <a href="" #~ "mailto:manisandro@gmail.com?subject=gImageReader%20Crash">" #~ "manisandro@gmail.com</a>. Please try to describe what you were " #~ "doing before the application crashed. Also, include the information " #~ "below. Thank you.</p></body></html>" #~ msgstr "" #~ "

Uygulama çöktü.

Anlayışınız için teşekkür ederiz. Uygulamanın gelişimine " #~ "katkıda bulunmak için lütfen bu hatayı manisandro@gmail.com adresine " #~ "bildirin. Lütfen çökme olmadan ne yaptığınızı ayrıntılı olarak " #~ "tanımlayın. Aşağıdaki bilgiyi de ekleyin. Teşekkür ederiz.

" #, fuzzy #~ msgid "" #~ "<small><b>Example:</b> 1-10, 13, 14-18</small>" #~ msgstr "Örnek: 1-10, 13, 14-18" #~ msgid "Detect script and orientation" #~ msgstr "Betik ve yönelimi algıla" #~ msgid "" #~ "\n" #~ "\tFailed to initialize tesseract" #~ msgstr "" #~ "\n" #~ "\ttesseract baÅŸlatılamadı" #, fuzzy #~ msgid "So&urces" #~ msgstr "Kaynaklar" #, fuzzy #~ msgid "&Output" #~ msgstr "Çıktı" #~ msgid "To recognize specific areas, drag rectangles over them." #~ msgstr "Belirli alanları tanımak için dikdörtgenleri üzerlerine sürükleyin." #~ msgid "Rendering image..." #~ msgstr "Resim gerçekleniyor..." #~ msgid "en_US" #~ msgstr "tr_TR" gImageReader-3.2.3/po/uk.po000066400000000000000000001622011312567024200154340ustar00rootroot00000000000000# Ukrainian translations for gImageReader package # УкраїнÑький переклад Ð´Ð»Ñ gImageReader. # Copyright (C) 2010-2015 THE GIMAGEREADER'S COPYRIGHT HOLDER # This file is distributed under the same license as the gImageReader package. # # # Translator Yuriy Bahriy , 2015-11-02. # Sandro Mani , 2010-2011, 2013, 2014, 2015, 2016. msgid "" msgstr "" "Project-Id-Version: \n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2017-07-01 10:34+0200\n" "PO-Revision-Date: 2016-10-06 23:34+0100\n" "Last-Translator: Sandro Mani \n" "Language-Team: English \n" "Language: uk\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" "X-Generator: Lokalize 2.0\n" #: ../gtk/data/appmenu.ui.h:1 ../qt/src/Ui_MainWindow.hh:165 msgid "Redetect Languages" msgstr "Перевизначити мови" #: ../gtk/data/appmenu.ui.h:2 ../gtk/data/gimagereader.ui.h:39 #: ../qt/data/ConfigDialog.ui.h:1 ../qt/src/Ui_MainWindow.hh:168 msgid "Preferences" msgstr "ÐалаштуваннÑ" #: ../gtk/data/appmenu.ui.h:3 ../gtk/data/gimagereader.ui.h:40 #: ../gtk/src/MainWindow.cc:484 ../qt/src/MainWindow.cc:445 #: ../qt/src/Ui_MainWindow.hh:173 msgid "Help" msgstr "Допомога" #: ../gtk/data/appmenu.ui.h:4 ../qt/data/AboutDialog.ui.h:2 #: ../qt/src/Ui_MainWindow.hh:176 msgid "About" msgstr "Про програму" #: ../gtk/data/appmenu.ui.h:5 msgid "Quit" msgstr "Вихід" #: ../gtk/data/crashhandler.ui.h:1 ../qt/src/CrashHandler.cc:36 msgid "Regenerate backtrace" msgstr "Відновити траÑуваннÑ" #: ../gtk/data/crashhandler.ui.h:2 msgid "The application has crashed" msgstr "Програма зазнала аварії" #: ../gtk/data/crashhandler.ui.h:4 #, no-c-format msgid "" "Apologies for the inconvenience. To help improve the application, please " "consider reporting the issue to manisandro@gmail.com. Please try to " "describe what you were doing before the application crashed. Also, include " "the information below. Thank you." msgstr "" "Прошу Ð²Ð¸Ð±Ð°Ñ‡ÐµÐ½Ð½Ñ Ð·Ð° незручноÑті. Ð”Ð»Ñ Ð¾Ð¿Ñ‚Ð¸Ð¼Ñ–Ð·Ð°Ñ†Ñ–Ñ— роботи програми, будь лаÑка " "напишіть про проблему на електронну пошту manisandro@gmail.com. ÐамагайтеÑÑ " "опиÑати, Ñкі дії ви виконували перед тим Ñк програма зазнала аварії. Також " "додайте інформацію, розміщену нижче. ДÑкую." #: ../gtk/data/editor_hocr.ui.h:1 ../qt/data/PdfExportDialog.ui.h:1 msgid "PDF Export" msgstr "" #: ../gtk/data/editor_hocr.ui.h:2 ../gtk/data/gimagereader.ui.h:55 #: ../gtk/src/Acquirer.cc:42 ../gtk/src/FileDialogs.cc:150 #: ../gtk/src/Utils.cc:68 ../qt/data/ConfigDialog.ui.h:27 #: ../qt/data/MainWindow.ui.h:14 msgid "Cancel" msgstr "СкаÑувати" #: ../gtk/data/editor_hocr.ui.h:3 ../gtk/data/gimagereader.ui.h:41 #: ../gtk/src/FileDialogs.cc:151 ../gtk/src/Utils.cc:59 #: ../qt/data/ConfigDialog.ui.h:26 msgid "OK" msgstr "Гаразд" #: ../gtk/data/editor_hocr.ui.h:4 ../qt/data/PdfExportDialog.ui.h:2 #, fuzzy msgid "Output mode:" msgstr "Сканувати до теки:" #: ../gtk/data/editor_hocr.ui.h:5 ../qt/data/PdfExportDialog.ui.h:3 msgid "PDF" msgstr "PDF" #: ../gtk/data/editor_hocr.ui.h:6 ../qt/data/PdfExportDialog.ui.h:4 msgid "PDF with invisible text overlay" msgstr "PDF з невидимим текÑтовим шаром" #: ../gtk/data/editor_hocr.ui.h:7 ../qt/data/PdfExportDialog.ui.h:16 msgid "Format:" msgstr "" #: ../gtk/data/editor_hocr.ui.h:8 ../qt/data/PdfExportDialog.ui.h:17 msgid "Compression:" msgstr "" #: ../gtk/data/editor_hocr.ui.h:9 ../qt/data/PdfExportDialog.ui.h:14 msgid "Compression quality:" msgstr "" #: ../gtk/data/editor_hocr.ui.h:10 ../qt/data/PdfExportDialog.ui.h:15 msgid "DPI:" msgstr "DPI:" #: ../gtk/data/editor_hocr.ui.h:11 ../qt/data/PdfExportDialog.ui.h:18 msgid "Dithering algorithm:" msgstr "" #: ../gtk/data/editor_hocr.ui.h:12 ../qt/data/PdfExportDialog.ui.h:13 msgid "Image settings:" msgstr "" #: ../gtk/data/editor_hocr.ui.h:13 ../qt/data/PdfExportDialog.ui.h:11 msgid "Document font:" msgstr "Шрифт документа:" #: ../gtk/data/editor_hocr.ui.h:14 ../qt/data/PdfExportDialog.ui.h:7 msgid "Uniformize line and word spacing" msgstr "" #: ../gtk/data/editor_hocr.ui.h:15 ../qt/data/PdfExportDialog.ui.h:10 msgid "Use detected font sizes" msgstr "ВикориÑтовувати автоматично визначений розмір шрифту" #: ../gtk/data/editor_hocr.ui.h:16 ../qt/data/PdfExportDialog.ui.h:8 msgid "Preserve spaces wider than:" msgstr "" #: ../gtk/data/editor_hocr.ui.h:17 ../qt/data/PdfExportDialog.ui.h:12 msgid "characters" msgstr "" #: ../gtk/data/editor_hocr.ui.h:18 ../qt/data/PdfExportDialog.ui.h:9 msgid "Scale:" msgstr "" #: ../gtk/data/editor_hocr.ui.h:19 ../qt/data/PdfExportDialog.ui.h:6 #, fuzzy msgid "Text settings:" msgstr "ÐšÐ¾Ð´ÑƒÐ²Ð°Ð½Ð½Ñ Ñ‚ÐµÐºÑтового файлу:" #: ../gtk/data/editor_hocr.ui.h:20 ../qt/data/PdfExportDialog.ui.h:5 msgid "Show preview" msgstr "" #: ../gtk/data/editor_hocr.ui.h:21 ../gtk/data/editor_text.ui.h:26 #: ../qt/src/Ui_OutputEditorText.hh:123 msgid "Save output" msgstr "Зберегти результати" #: ../gtk/data/editor_hocr.ui.h:22 ../qt/src/Ui_OutputEditorHOCR.hh:44 #: ../qt/src/Ui_OutputEditorHOCR.hh:45 msgid "Export to PDF" msgstr "ЕкÑпорт у PDF" #: ../gtk/data/editor_hocr.ui.h:23 ../gtk/data/editor_text.ui.h:27 #: ../qt/src/Ui_OutputEditorHOCR.hh:47 ../qt/src/Ui_OutputEditorHOCR.hh:48 #: ../qt/src/Ui_OutputEditorText.hh:125 msgid "Clear output" msgstr "ОчиÑтити результати" #: ../gtk/data/editor_hocr.ui.h:24 ../qt/src/Ui_OutputEditorHOCR.hh:75 msgid "Properties" msgstr "ВлаÑтивоÑті" #: ../gtk/data/editor_hocr.ui.h:25 ../qt/src/Ui_OutputEditorHOCR.hh:79 #, fuzzy msgid "Source" msgstr "Джерела" #. Output insert mode #: ../gtk/data/editor_text.ui.h:1 ../qt/src/Ui_OutputEditorText.hh:59 msgid "Append to current text" msgstr "Додати до поточного текÑту" #: ../gtk/data/editor_text.ui.h:2 ../qt/src/Ui_OutputEditorText.hh:60 msgid "Insert at cursor" msgstr "Ð’Ñтавити на міÑце курÑору" #: ../gtk/data/editor_text.ui.h:3 ../qt/src/Ui_OutputEditorText.hh:61 msgid "Replace current text" msgstr "Замінити поточний текÑÑ‚" #: ../gtk/data/editor_text.ui.h:4 ../qt/src/SubstitutionsManager.cc:37 #: ../qt/src/Ui_OutputEditorText.hh:177 msgid "Substitutions" msgstr "Заміни" #: ../gtk/data/editor_text.ui.h:5 ../qt/src/SubstitutionsManager.cc:42 #: ../qt/src/SubstitutionsManager.cc:43 msgid "Open" msgstr "Відкрити" #: ../gtk/data/editor_text.ui.h:6 ../gtk/src/Utils.cc:71 #: ../qt/src/SubstitutionsManager.cc:45 ../qt/src/SubstitutionsManager.cc:46 msgid "Save" msgstr "Зберегти" #: ../gtk/data/editor_text.ui.h:7 ../qt/src/SubstitutionsManager.cc:48 #: ../qt/src/SubstitutionsManager.cc:49 msgid "Clear" msgstr "ОчиÑтити" #: ../gtk/data/editor_text.ui.h:8 ../qt/data/ConfigDialog.ui.h:16 #: ../qt/src/SubstitutionsManager.cc:51 ../qt/src/SubstitutionsManager.cc:52 msgid "Add" msgstr "Додати" #: ../gtk/data/editor_text.ui.h:9 ../gtk/src/OutputEditorHOCR.cc:1202 #: ../gtk/src/OutputEditorHOCR.cc:1213 ../qt/data/ConfigDialog.ui.h:17 #: ../qt/src/OutputEditorHOCR.cc:998 ../qt/src/OutputEditorHOCR.cc:1000 #: ../qt/src/SubstitutionsManager.cc:54 ../qt/src/SubstitutionsManager.cc:55 msgid "Remove" msgstr "УÑунути" #: ../gtk/data/editor_text.ui.h:10 ../gtk/data/gimagereader.ui.h:73 msgid "Apply" msgstr "ЗаÑтоÑувати" #: ../gtk/data/editor_text.ui.h:11 ../gtk/data/gimagereader.ui.h:74 msgid "Close" msgstr "Закрити" #. Output postprocessing #: ../gtk/data/editor_text.ui.h:12 ../qt/src/Ui_OutputEditorText.hh:69 msgid "Keep line break if..." msgstr "Зберегти розрив Ñ€Ñдка, Ñкщо..." #: ../gtk/data/editor_text.ui.h:13 ../qt/src/Ui_OutputEditorText.hh:71 #, fuzzy msgid "Preceded by end mark (.?!)" msgstr "Перед ним Ñ” крапка" #: ../gtk/data/editor_text.ui.h:14 ../qt/src/Ui_OutputEditorText.hh:73 msgid "Preceded or succeeded by quote" msgstr "Перед ним або піÑÐ»Ñ Ð½ÑŒÐ¾Ð³Ð¾ Ñ” лапки" #: ../gtk/data/editor_text.ui.h:15 ../qt/src/Ui_OutputEditorText.hh:75 msgid "Other options" msgstr "Інші опції" #: ../gtk/data/editor_text.ui.h:16 ../qt/src/Ui_OutputEditorText.hh:77 msgid "Join hyphenated words" msgstr "Об'єднати перенеÑені Ñлова" #: ../gtk/data/editor_text.ui.h:17 ../qt/src/Ui_OutputEditorText.hh:79 msgid "Collapse whitespace" msgstr "СтиÑнути пробіли" #: ../gtk/data/editor_text.ui.h:18 ../qt/src/Ui_OutputEditorText.hh:81 msgid "Preserve paragraphs" msgstr "Зберегти абзаци" #: ../gtk/data/editor_text.ui.h:19 ../qt/src/Ui_OutputEditorText.hh:83 msgid "Visual aids" msgstr "Візуальні підказки" #: ../gtk/data/editor_text.ui.h:20 ../qt/src/Ui_OutputEditorText.hh:85 msgid "Draw whitespace" msgstr "Відобразити пробіли" #: ../gtk/data/editor_text.ui.h:21 ../gtk/data/gimagereader.ui.h:31 #: ../qt/src/Ui_OutputEditorText.hh:102 msgid "Select insert mode" msgstr "Вибрати режим вÑтавки" #: ../gtk/data/editor_text.ui.h:22 ../qt/src/Ui_OutputEditorText.hh:109 msgid "Strip line breaks on selected text" msgstr "Видалити розриви Ñ€Ñдків у вибраному текÑті" #: ../gtk/data/editor_text.ui.h:23 ../qt/src/Ui_OutputEditorText.hh:114 msgid "Find and replace" msgstr "Знайти Ñ– замінити" #: ../gtk/data/editor_text.ui.h:24 ../qt/src/Ui_OutputEditorText.hh:116 #: ../qt/src/Ui_OutputEditorText.hh:117 msgid "Undo" msgstr "СкаÑувати" #: ../gtk/data/editor_text.ui.h:25 ../qt/src/Ui_OutputEditorText.hh:119 #: ../qt/src/Ui_OutputEditorText.hh:120 msgid "Redo" msgstr "Повернути" #: ../gtk/data/editor_text.ui.h:28 ../qt/src/Ui_OutputEditorText.hh:149 msgid "Find" msgstr "Знайти" #: ../gtk/data/editor_text.ui.h:29 ../qt/src/Ui_OutputEditorText.hh:153 #: ../qt/src/Ui_OutputEditorText.hh:168 msgid "Replace" msgstr "Замінити" #: ../gtk/data/editor_text.ui.h:30 ../qt/src/Ui_OutputEditorText.hh:173 msgid "Replace all" msgstr "Замінити вÑе" #: ../gtk/data/editor_text.ui.h:31 ../qt/src/Ui_OutputEditorText.hh:163 msgid "Find previous" msgstr "Знайти попереднє" #: ../gtk/data/editor_text.ui.h:32 ../qt/src/Ui_OutputEditorText.hh:158 msgid "Find next" msgstr "Знайти наÑтупне" #: ../gtk/data/editor_text.ui.h:33 ../qt/src/Ui_OutputEditorText.hh:182 msgid "Match case" msgstr "Враховувати регіÑтр" #: ../gtk/data/gimagereader.ui.h:1 ../qt/src/Ui_MainWindow.hh:65 #, fuzzy msgid "Rotate current page" msgstr "Замінити поточний текÑÑ‚" #: ../gtk/data/gimagereader.ui.h:2 ../qt/src/Ui_MainWindow.hh:66 #, fuzzy msgid "Rotate all pages" msgstr "Повернути вліво" #: ../gtk/data/gimagereader.ui.h:3 ../qt/data/MainWindow.ui.h:35 msgid "Toggle output pane" msgstr "Показати/приховати панель результатів" #. Sources toolbar #: ../gtk/data/gimagereader.ui.h:4 ../qt/src/Ui_MainWindow.hh:187 msgid "Recent" msgstr "Попередні файли" #: ../gtk/data/gimagereader.ui.h:5 ../qt/src/Ui_MainWindow.hh:188 msgid "Paste" msgstr "Ð’Ñтавити" #: ../gtk/data/gimagereader.ui.h:6 ../qt/src/Ui_MainWindow.hh:189 msgid "Take Screenshot" msgstr "Зробити знімок екрану" #: ../gtk/data/gimagereader.ui.h:7 ../qt/src/Ui_MainWindow.hh:200 msgid "Add images" msgstr "Відкрити зображеннÑ" #: ../gtk/data/gimagereader.ui.h:8 ../qt/src/Ui_MainWindow.hh:199 msgid "Add Images" msgstr "Відкрити зображеннÑ" #: ../gtk/data/gimagereader.ui.h:9 ../qt/src/Ui_MainWindow.hh:205 msgid "Remove image from list" msgstr "УÑунути Ð·Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð½Ñ Ñ–Ð· ÑпиÑку" #: ../gtk/data/gimagereader.ui.h:10 ../qt/src/Ui_MainWindow.hh:208 msgid "Delete image" msgstr "Видалити зображеннÑ" #: ../gtk/data/gimagereader.ui.h:11 ../qt/src/Ui_MainWindow.hh:211 msgid "Clear list" msgstr "ОчиÑтити ÑпиÑок" #: ../gtk/data/gimagereader.ui.h:12 ../qt/data/MainWindow.ui.h:6 msgid "Files" msgstr "Файли" #: ../gtk/data/gimagereader.ui.h:13 ../qt/data/MainWindow.ui.h:16 msgid "Device:" msgstr "ПриÑтрій:" #: ../gtk/data/gimagereader.ui.h:14 ../qt/data/MainWindow.ui.h:15 #: ../qt/src/TessdataManager.cc:57 msgid "Refresh" msgstr "Оновити" #: ../gtk/data/gimagereader.ui.h:15 ../qt/data/MainWindow.ui.h:12 msgid "Output:" msgstr "Сканувати до теки:" #: ../gtk/data/gimagereader.ui.h:16 ../qt/data/MainWindow.ui.h:9 msgid "Mode:" msgstr "Режим:" #: ../gtk/data/gimagereader.ui.h:17 ../gtk/src/OutputEditorHOCR.cc:362 #: ../qt/data/MainWindow.ui.h:11 ../qt/src/OutputEditorHOCR.cc:273 msgid "Color" msgstr "Кольоровий" #: ../gtk/data/gimagereader.ui.h:18 ../gtk/src/OutputEditorHOCR.cc:365 #: ../qt/data/MainWindow.ui.h:10 ../qt/src/OutputEditorHOCR.cc:275 #: ../qt/src/OutputEditorHOCR.cc:277 msgid "Grayscale" msgstr "Відтінки Ñірого" #: ../gtk/data/gimagereader.ui.h:19 ../qt/data/MainWindow.ui.h:8 msgid "Resolution:" msgstr "Роздільна здатніÑть:" #: ../gtk/data/gimagereader.ui.h:20 ../qt/data/MainWindow.ui.h:13 msgid "Scan" msgstr "Сканувати" #: ../gtk/data/gimagereader.ui.h:21 ../qt/data/MainWindow.ui.h:7 msgid "Acquire" msgstr "СкануваннÑ" #: ../gtk/data/gimagereader.ui.h:22 ../qt/data/MainWindow.ui.h:2 msgid "Brightness" msgstr "ЯÑкравіÑть" #: ../gtk/data/gimagereader.ui.h:23 ../qt/data/MainWindow.ui.h:3 msgid "Contrast" msgstr "КонтраÑÑ‚" #: ../gtk/data/gimagereader.ui.h:24 ../qt/data/MainWindow.ui.h:4 msgid "Resolution" msgstr "Роздільна здатніÑть" #: ../gtk/data/gimagereader.ui.h:25 ../qt/data/MainWindow.ui.h:5 msgid "Invert colors" msgstr "ІнверÑÑ–Ñ ÐºÐ¾Ð»ÑŒÐ¾Ñ€Ñƒ" #: ../gtk/data/gimagereader.ui.h:26 ../qt/data/MainWindow.ui.h:19 msgid "Zoom in" msgstr "Збільшити" #: ../gtk/data/gimagereader.ui.h:27 ../qt/data/MainWindow.ui.h:21 msgid "Zoom out" msgstr "Зменшити" #: ../gtk/data/gimagereader.ui.h:28 ../qt/data/MainWindow.ui.h:23 msgid "Normal size" msgstr "Звичайний розмір" #: ../gtk/data/gimagereader.ui.h:29 ../qt/data/MainWindow.ui.h:25 msgid "Best fit" msgstr "Оптимальне заповненнÑ" #: ../gtk/data/gimagereader.ui.h:30 ../qt/src/Ui_MainWindow.hh:74 #, fuzzy msgid "Select rotation mode" msgstr "Вибрати режим вÑтавки" #: ../gtk/data/gimagereader.ui.h:32 ../qt/data/MainWindow.ui.h:31 msgid "Image controls" msgstr "ÐšÐµÑ€ÑƒÐ²Ð°Ð½Ð½Ñ Ð·Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð½Ñм" #: ../gtk/data/gimagereader.ui.h:33 ../qt/src/Ui_MainWindow.hh:137 msgid "Plain text" msgstr "Звичайний текÑÑ‚" #: ../gtk/data/gimagereader.ui.h:34 ../qt/src/Ui_MainWindow.hh:137 msgid "hOCR, PDF" msgstr "hOCR, PDF" #: ../gtk/data/gimagereader.ui.h:35 ../qt/data/MainWindow.ui.h:33 msgid "Autodetect layout" msgstr "ÐÐ²Ñ‚Ð¾Ð²Ð¸Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ð²Ð¼Ñ–Ñту" #: ../gtk/data/gimagereader.ui.h:36 msgid "Recognize all" msgstr "Розпізнати вÑе" #: ../gtk/data/gimagereader.ui.h:37 #, fuzzy msgid "Select language" msgstr "Перевизначити мови" #: ../gtk/data/gimagereader.ui.h:38 msgid "A graphical frontend to tesseract-ocr" msgstr "Графічний Ñ–Ð½Ñ‚ÐµÑ€Ñ„ÐµÐ¹Ñ Ð´Ð»Ñ tesseract-ocr" #: ../gtk/data/gimagereader.ui.h:42 msgid "Output pane orientation:" msgstr "Ð Ð¾Ð·Ñ‚Ð°ÑˆÑƒÐ²Ð°Ð½Ð½Ñ Ð¿Ð°Ð½ÐµÐ»Ñ– результатів:" #: ../gtk/data/gimagereader.ui.h:43 msgid "Horizontal" msgstr "Горизонтальне" #: ../gtk/data/gimagereader.ui.h:44 msgid "Vertical" msgstr "Вертикальне" #: ../gtk/data/gimagereader.ui.h:45 ../qt/data/ConfigDialog.ui.h:18 msgid "Query to install missing spellcheck dictionaries" msgstr "Запит на вÑÑ‚Ð°Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ Ð²Ñ–Ð´Ñутніх орфографічних Ñловників" #: ../gtk/data/gimagereader.ui.h:46 ../qt/data/ConfigDialog.ui.h:4 msgid "Automatically check for new program versions" msgstr "Ðвтоматично перевірÑти наÑвніÑть нових верÑій програми" #: ../gtk/data/gimagereader.ui.h:47 ../qt/data/ConfigDialog.ui.h:3 msgid "Predefined language definitions:" msgstr "Задані мови визначеннÑ:" #: ../gtk/data/gimagereader.ui.h:48 ../qt/data/ConfigDialog.ui.h:12 msgid "Additional language definitions:" msgstr "Додаткові мови визначеннÑ:" #: ../gtk/data/gimagereader.ui.h:49 ../qt/data/ConfigDialog.ui.h:20 msgid "The prefix of the tesseract language data file" msgstr "ÐŸÑ€ÐµÑ„Ñ–ÐºÑ Ð¼Ð¾Ð²Ð½Ð¾Ð³Ð¾ файлу даних tesseract" #: ../gtk/data/gimagereader.ui.h:50 ../qt/data/ConfigDialog.ui.h:21 msgid "Prefix" msgstr "ПрефікÑ" #: ../gtk/data/gimagereader.ui.h:51 ../qt/data/ConfigDialog.ui.h:22 msgid "The ISO 639-1 language code followed by the country code" msgstr "" "Код мови ISO 639-1 Ñ– поруч код країни, Ñкі з'єднані нижнім підкреÑленнÑм" #: ../gtk/data/gimagereader.ui.h:52 ../qt/data/ConfigDialog.ui.h:23 msgid "ISO Code" msgstr "Код ISO" #: ../gtk/data/gimagereader.ui.h:53 ../qt/data/ConfigDialog.ui.h:24 msgid "The name of the language" msgstr "Ðазва мови" #: ../gtk/data/gimagereader.ui.h:54 ../qt/data/ConfigDialog.ui.h:25 msgid "Name" msgstr "Ðазва" #: ../gtk/data/gimagereader.ui.h:56 ../qt/data/ConfigDialog.ui.h:5 msgid "Output pane font:" msgstr "Шрифт панелі результатів:" #: ../gtk/data/gimagereader.ui.h:57 ../qt/data/ConfigDialog.ui.h:2 msgid "Default" msgstr "За замовчуваннÑм" #: ../gtk/data/gimagereader.ui.h:58 ../qt/data/ConfigDialog.ui.h:6 msgid "Language data locations:" msgstr "" #: ../gtk/data/gimagereader.ui.h:59 ../qt/data/ConfigDialog.ui.h:13 #, fuzzy msgid "Language definitions path:" msgstr "Задані мови визначеннÑ:" #: ../gtk/data/gimagereader.ui.h:60 ../qt/data/ConfigDialog.ui.h:28 #, fuzzy msgid "Spelling dictionaries path:" msgstr "Орфографічний Ñловник відÑутній" #: ../gtk/data/gimagereader.ui.h:61 ../qt/data/ConfigDialog.ui.h:10 msgid "System-wide paths" msgstr "" #: ../gtk/data/gimagereader.ui.h:62 ../qt/data/ConfigDialog.ui.h:11 msgid "User paths" msgstr "" #: ../gtk/data/gimagereader.ui.h:63 ../qt/data/PageRangeDialog.ui.h:1 msgid "Page Range" msgstr "Діапазон Ñторінок" #: ../gtk/data/gimagereader.ui.h:64 ../qt/data/PageRangeDialog.ui.h:2 msgid "Page range:" msgstr "Діапазон Ñторінок:" #: ../gtk/data/gimagereader.ui.h:65 ../qt/data/PageRangeDialog.ui.h:3 msgid "Example: 1-10, 13, 14-18" msgstr "Приклад: 1-10, 13, 14-18" #: ../gtk/data/gimagereader.ui.h:66 ../qt/data/PageRangeDialog.ui.h:4 msgid "Recognition area:" msgstr "ДілÑнка Ð´Ð»Ñ Ñ€Ð¾Ð·Ð¿Ñ–Ð·Ð½Ð°Ð²Ð°Ð½Ð½Ñ:" #: ../gtk/data/gimagereader.ui.h:67 ../gtk/src/Recognizer.cc:403 #: ../qt/data/PageRangeDialog.ui.h:5 ../qt/src/Recognizer.cc:381 msgid "Entire page" msgstr "Ð’ÑÑ Ñторінка" #: ../gtk/data/gimagereader.ui.h:68 ../qt/data/PageRangeDialog.ui.h:6 msgid "Autodetect" msgstr "ÐвтовизначеннÑ" #: ../gtk/data/gimagereader.ui.h:69 ../qt/data/PageRangeDialog.ui.h:7 #, fuzzy msgid "Prepend to output text:" msgstr "Додати до поточного текÑту" #: ../gtk/data/gimagereader.ui.h:70 ../qt/data/PageRangeDialog.ui.h:8 msgid "Source filename" msgstr "" #: ../gtk/data/gimagereader.ui.h:71 ../qt/data/PageRangeDialog.ui.h:9 #, fuzzy msgid "Source page" msgstr "Джерела" #: ../gtk/data/gimagereader.ui.h:72 ../qt/src/TessdataManager.cc:47 msgid "Tessdata Manager" msgstr "" #: ../gtk/data/gimagereader.ui.h:75 ../qt/src/TessdataManager.cc:49 msgid "Manage installed languages:" msgstr "ÐšÐµÑ€ÑƒÐ²Ð°Ð½Ð½Ñ Ð²Ñтановленими мовами:" #: ../gtk/data/gimagereader.ui.h:76 ../qt/src/DisplayerToolSelect.cc:240 msgid "Delete" msgstr "Видалити" #: ../gtk/data/gimagereader.ui.h:77 ../qt/src/DisplayerToolSelect.cc:226 msgid "Order:" msgstr "ПорÑдок:" #: ../gtk/data/gimagereader.ui.h:78 ../gtk/src/DisplayerToolHOCR.cc:28 #: ../qt/src/DisplayerToolHOCR.cc:30 ../qt/src/DisplayerToolSelect.cc:241 msgid "Recognize" msgstr "Розпізнати" #: ../gtk/data/gimagereader.ui.h:79 ../qt/src/DisplayerToolSelect.cc:242 msgid "Recognize to clipboard" msgstr "Розпізнати в буфер обміну" #: ../gtk/data/gimagereader.ui.h:80 ../qt/src/DisplayerToolSelect.cc:243 msgid "Save as image" msgstr "Зберегти Ñк зображеннÑ" #: ../gtk/data/gimagereader.ui.h:81 ../qt/src/Recognizer.cc:76 msgid "Current Page" msgstr "Поточну Ñторінку" #: ../gtk/data/gimagereader.ui.h:82 ../qt/src/Recognizer.cc:79 msgid "Multiple Pages..." msgstr "Кілька Ñторінок..." #: ../gtk/src/Acquirer.cc:83 ../qt/src/Acquirer.cc:63 msgid "scan.png" msgstr "Ñкан.png" #: ../gtk/src/Acquirer.cc:96 ../qt/src/Acquirer.cc:80 msgid "Images" msgstr "ЗображеннÑ" #: ../gtk/src/Acquirer.cc:97 ../qt/src/Acquirer.cc:81 msgid "Choose Output Filename..." msgstr "Ð”Ð»Ñ Ð·Ð±ÐµÑ€ÐµÐ¶ÐµÐ½Ð½Ñ Ð²ÐºÐ°Ð¶Ñ–Ñ‚ÑŒ ім'Ñ Ñ„Ð°Ð¹Ð»Ñƒ..." #: ../gtk/src/Acquirer.cc:112 ../qt/src/Acquirer.cc:96 msgid "Failed to initialize the scanning backend." msgstr "Помилка ініціалізації програми ÑкануваннÑ." #: ../gtk/src/Acquirer.cc:121 ../qt/src/Acquirer.cc:102 msgid "Scan failed" msgstr "Ð¡ÐºÐ°Ð½ÑƒÐ²Ð°Ð½Ð½Ñ Ð½Ðµ вдалоÑÑ" #: ../gtk/src/Acquirer.cc:139 ../qt/src/Acquirer.cc:118 msgid "No scanners were detected." msgstr "Сканерів не виÑвлено." #: ../gtk/src/Acquirer.cc:156 ../gtk/src/Acquirer.cc:173 #: ../qt/src/Acquirer.cc:132 ../qt/src/Acquirer.cc:149 msgid "Starting scan..." msgstr "ЗапуÑк ÑкануваннÑ..." #: ../gtk/src/Acquirer.cc:169 ../qt/src/Acquirer.cc:145 msgid "Opening device..." msgstr "ВідкриваєтьÑÑ Ð¿Ñ€Ð¸Ñтрій..." #: ../gtk/src/Acquirer.cc:171 ../qt/src/Acquirer.cc:147 msgid "Setting options..." msgstr "Ð’ÑÑ‚Ð°Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ Ð½Ð°Ð»Ð°ÑˆÑ‚ÑƒÐ²Ð°Ð½ÑŒ..." #: ../gtk/src/Acquirer.cc:175 ../qt/src/Acquirer.cc:151 msgid "Getting parameters..." msgstr "ÐžÑ‚Ñ€Ð¸Ð¼Ð°Ð½Ð½Ñ Ð¿Ð°Ñ€Ð°Ð¼ÐµÑ‚Ñ€Ñ–Ð²..." #: ../gtk/src/Acquirer.cc:177 ../qt/src/Acquirer.cc:153 msgid "Transferring data..." msgstr "Передача даних..." #: ../gtk/src/Acquirer.cc:184 ../qt/src/Acquirer.cc:160 msgid "Canceling scan..." msgstr "Відміна ÑкануваннÑ..." #: ../gtk/src/Config.cc:297 ../qt/data/ConfigDialog.ui.h:7 msgid "Filename prefix" msgstr "Файловій префікÑ" #: ../gtk/src/Config.cc:298 ../qt/data/ConfigDialog.ui.h:8 msgid "Code" msgstr "Код" #: ../gtk/src/Config.cc:299 ../qt/data/ConfigDialog.ui.h:9 msgid "Native name" msgstr "Рідна назва" #: ../gtk/src/CrashHandler.cc:26 ../gtk/src/CrashHandler.cc:43 #: ../qt/src/CrashHandler.cc:34 msgid "Crash Handler" msgstr "Обробник збоїв" #: ../gtk/src/CrashHandler.cc:45 ../qt/src/CrashHandler.cc:29 msgid "Your work has been saved under %1." msgstr "Ваша Ð¿Ñ€Ð°Ñ†Ñ Ð±ÑƒÐ»Ð° збережена у %1." #: ../gtk/src/CrashHandler.cc:47 ../qt/src/CrashHandler.cc:31 msgid "There was no unsaved work." msgstr "Ðезбережена Ð¿Ñ€Ð°Ñ†Ñ Ð²Ñ–Ð´ÑутнÑ." #: ../gtk/src/CrashHandler.cc:106 ../qt/src/CrashHandler.cc:60 msgid "Failed to obtain backtrace. Is gdb installed?" msgstr "Зворотнє траÑÑƒÐ²Ð°Ð½Ð½Ñ Ð½Ðµ вдалоÑÑ. Ð’Ñтановлено gdb?" #: ../gtk/src/Displayer.cc:261 ../qt/src/Displayer.cc:231 msgid "Failed to load image" msgstr "Ðе вдалоÑÑŒ завантажити зображеннÑ" #: ../gtk/src/Displayer.cc:261 ../qt/src/Displayer.cc:231 msgid "" "The file might not be an image or be corrupt:\n" "%1" msgstr "" "Файл, можливо, не Ñ” зображеннÑм або він пошкоджений:\n" "%1" #: ../gtk/src/DisplayerToolSelect.cc:39 ../qt/src/DisplayerToolSelect.cc:40 msgid "selection.png" msgstr "фрагмент.png" #: ../gtk/src/DisplayerToolSelect.cc:148 ../qt/src/DisplayerToolSelect.cc:139 msgid "PNG Images" msgstr "Ð—Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ñ PNG" #: ../gtk/src/DisplayerToolSelect.cc:149 ../qt/src/DisplayerToolSelect.cc:139 msgid "Save Selection Image" msgstr "Зберегти виділене" #: ../gtk/src/DisplayerToolSelect.cc:157 ../qt/src/DisplayerToolSelect.cc:147 msgid "Recognize all" msgstr "Розпізнати вÑе" #: ../gtk/src/DisplayerToolSelect.cc:157 ../qt/src/DisplayerToolSelect.cc:147 msgid "Recognize selection" msgstr "Розпізнати виділене" #: ../gtk/src/DisplayerToolSelect.cc:194 ../qt/src/DisplayerToolSelect.cc:184 msgid "Performing layout analysis" msgstr "ВиконуєтьÑÑ Ð°Ð½Ð°Ð»Ñ–Ð· вміÑту" #: ../gtk/src/FileDialogs.cc:237 msgid "" "A file named \"%1\" already exists. Are you sure you want to overwrite it?" msgstr "" "Файл з ім'Ñм \"%1\" вже Ñ–Ñнує. Ви впевнені, що хочете його перезапиÑати?" #: ../gtk/src/FileDialogs.cc:239 msgid "Overwrite File?" msgstr "ПерезапиÑати файл?" #: ../gtk/src/MainWindow.cc:125 ../qt/src/MainWindow.cc:274 msgid "Using tesseract" msgstr "" #: ../gtk/src/MainWindow.cc:191 ../qt/src/MainWindow.cc:181 msgid "Select an image to begin..." msgstr "Щоб розпочати, виберіть зображеннÑ..." #: ../gtk/src/MainWindow.cc:306 ../qt/src/MainWindow.cc:262 #, fuzzy msgid "Multiple sources" msgstr "Кілька Ñторінок..." #: ../gtk/src/MainWindow.cc:307 ../qt/src/MainWindow.cc:263 msgid "Ready" msgstr "Готово" #: ../gtk/src/MainWindow.cc:446 ../qt/src/MainWindow.cc:390 msgid "New version" msgstr "Ðова верÑÑ–Ñ" #: ../gtk/src/MainWindow.cc:446 ../qt/src/MainWindow.cc:390 msgid "gImageReader %1 is available" msgstr "ДоÑтупний gImageReader %1" #: ../gtk/src/MainWindow.cc:447 ../qt/src/MainWindow.cc:391 msgid "Download" msgstr "Завантажити" #: ../gtk/src/MainWindow.cc:448 ../qt/src/MainWindow.cc:392 msgid "Changelog" msgstr "СпиÑок змін" #: ../gtk/src/MainWindow.cc:449 ../qt/src/MainWindow.cc:393 msgid "Don't notify again" msgstr "Більше не показувати ÑповіщеннÑ" #: ../gtk/src/MainWindow.cc:468 ../qt/src/MainWindow.cc:438 msgid "Don't show again" msgstr "Ðе показувати знову" #: ../gtk/src/MainWindow.cc:469 ../gtk/src/MainWindow.cc:482 #: ../qt/src/MainWindow.cc:439 msgid "Install" msgstr "Ð’Ñтановити" #: ../gtk/src/MainWindow.cc:489 ../qt/src/MainWindow.cc:451 msgid "Spelling dictionary missing" msgstr "Орфографічний Ñловник відÑутній" #: ../gtk/src/MainWindow.cc:489 ../qt/src/MainWindow.cc:451 msgid "The spellcheck dictionary for %1 is not installed" msgstr "Орфографічний Ñловник Ð´Ð»Ñ %1 не вÑтановлено" #: ../gtk/src/MainWindow.cc:496 ../gtk/src/MainWindow.cc:528 #: ../qt/src/MainWindow.cc:458 msgid "Installing spelling dictionary for '%1'" msgstr "Ð’ÑтановлюєтьÑÑ Ð¾Ñ€Ñ„Ð¾Ð³Ñ€Ð°Ñ„Ñ–Ñ‡Ð½Ð¸Ð¹ Ñловник Ð´Ð»Ñ '%1'" #: ../gtk/src/MainWindow.cc:517 ../gtk/src/MainWindow.cc:542 #: ../gtk/src/MainWindow.cc:550 ../gtk/src/MainWindow.cc:560 #: ../gtk/src/MainWindow.cc:566 ../gtk/src/MainWindow.cc:595 #: ../gtk/src/OutputEditorHOCR.cc:1375 ../gtk/src/Recognizer.cc:163 #: ../gtk/src/TessdataManager.cc:58 ../gtk/src/TessdataManager.cc:68 #: ../gtk/src/TessdataManager.cc:290 ../qt/src/MainWindow.cc:477 #: ../qt/src/MainWindow.cc:490 ../qt/src/MainWindow.cc:500 #: ../qt/src/MainWindow.cc:510 ../qt/src/MainWindow.cc:518 #: ../qt/src/MainWindow.cc:546 ../qt/src/OutputEditorHOCR.cc:1157 #: ../qt/src/Recognizer.cc:138 ../qt/src/TessdataManager.cc:72 #: ../qt/src/TessdataManager.cc:82 ../qt/src/TessdataManager.cc:275 msgid "Error" msgstr "Помилка" #: ../gtk/src/MainWindow.cc:517 ../qt/src/MainWindow.cc:477 msgid "Failed to install spelling dictionary: %1" msgstr "Ðе вдалоÑÑ Ð²Ñтановити орфографічний Ñловник: %1" #: ../gtk/src/MainWindow.cc:542 ../qt/src/MainWindow.cc:490 #, fuzzy msgid "Failed to create directory for spelling dictionaries." msgstr "Ðе вдалоÑÑ Ð²Ñтановити орфографічний Ñловник: %1" #: ../gtk/src/MainWindow.cc:550 ../gtk/src/MainWindow.cc:566 #: ../qt/src/MainWindow.cc:500 #, fuzzy msgid "Could not read %1: %2." msgstr "Ðеможливо прочитати %1." #: ../gtk/src/MainWindow.cc:560 ../gtk/src/MainWindow.cc:595 #: ../qt/src/MainWindow.cc:510 ../qt/src/MainWindow.cc:546 msgid "No spelling dictionaries found for '%1'." msgstr "Орфографічні Ñловники Ð´Ð»Ñ '%1' не знайдено." #: ../gtk/src/MainWindow.cc:576 ../qt/src/MainWindow.cc:529 msgid "Downloading '%1'..." msgstr "ЗавантажуєтьÑÑ '%1'..." #: ../gtk/src/MainWindow.cc:592 ../qt/src/MainWindow.cc:543 msgid "Dictionaries installed" msgstr "Словники вÑтановлено" #: ../gtk/src/MainWindow.cc:592 msgid "The following dictionaries were installed:%1" msgstr "Було вÑтановлено наÑтупні Ñловники:%1" #: ../gtk/src/OutputEditorHOCR.cc:319 ../qt/src/OutputEditorHOCR.cc:291 #, fuzzy msgid "Document" msgstr "Шрифт документа:" #: ../gtk/src/OutputEditorHOCR.cc:368 ../qt/src/OutputEditorHOCR.cc:279 msgid "Monochrome" msgstr "" #: ../gtk/src/OutputEditorHOCR.cc:377 ../qt/src/OutputEditorHOCR.cc:281 msgid "Threshold (closest color)" msgstr "" #: ../gtk/src/OutputEditorHOCR.cc:380 ../qt/src/OutputEditorHOCR.cc:282 msgid "Diffuse" msgstr "" #: ../gtk/src/OutputEditorHOCR.cc:389 ../qt/src/OutputEditorHOCR.cc:283 msgid "Zip (lossless)" msgstr "" #: ../gtk/src/OutputEditorHOCR.cc:393 ../qt/src/OutputEditorHOCR.cc:284 msgid "CCITT Group 4 (lossless)" msgstr "" #: ../gtk/src/OutputEditorHOCR.cc:397 ../qt/src/OutputEditorHOCR.cc:285 msgid "Jpeg (lossy)" msgstr "" #: ../gtk/src/OutputEditorHOCR.cc:553 ../qt/src/OutputEditorHOCR.cc:429 #, fuzzy msgid "" "The following pages could not be processed:\n" "%1" msgstr "Ðеможливо відкрити наÑтупні файли:%1" #: ../gtk/src/OutputEditorHOCR.cc:554 ../qt/src/OutputEditorHOCR.cc:430 #, fuzzy msgid "Recognition errors" msgstr "СталиÑÑ Ð¿Ð¾Ð¼Ð¸Ð»ÐºÐ¸ при розпізнаванні" #. Add tree item #: ../gtk/src/OutputEditorHOCR.cc:647 ../gtk/src/OutputEditorHOCR.cc:1037 #: ../qt/src/OutputEditorHOCR.cc:504 ../qt/src/OutputEditorHOCR.cc:894 msgid "Graphic" msgstr "Графіка" #: ../gtk/src/OutputEditorHOCR.cc:703 ../qt/src/OutputEditorHOCR.cc:563 #, fuzzy msgid "Paragraph" msgstr "Зберегти абзаци" #: ../gtk/src/OutputEditorHOCR.cc:706 ../qt/src/OutputEditorHOCR.cc:566 #, fuzzy msgid "Textline" msgstr "ТекÑтові файли" #: ../gtk/src/OutputEditorHOCR.cc:1136 ../qt/src/OutputEditorHOCR.cc:950 msgid "Merge" msgstr "" #: ../gtk/src/OutputEditorHOCR.cc:1161 ../qt/src/OutputEditorHOCR.cc:977 msgid "Add graphic region" msgstr "" #: ../gtk/src/OutputEditorHOCR.cc:1177 ../qt/src/OutputEditorHOCR.cc:985 msgid "No suggestions" msgstr "Ðемає підказок" #: ../gtk/src/OutputEditorHOCR.cc:1183 ../qt/src/OutputEditorHOCR.cc:989 msgid "Add to dictionary" msgstr "" #: ../gtk/src/OutputEditorHOCR.cc:1189 ../qt/src/OutputEditorHOCR.cc:990 msgid "Ignore word" msgstr "" #: ../gtk/src/OutputEditorHOCR.cc:1222 ../qt/src/OutputEditorHOCR.cc:1007 msgid "Expand all" msgstr "" #: ../gtk/src/OutputEditorHOCR.cc:1225 ../qt/src/OutputEditorHOCR.cc:1008 #, fuzzy msgid "Collapse all" msgstr "СтиÑнути пробіли" #: ../gtk/src/OutputEditorHOCR.cc:1248 ../gtk/src/OutputEditorHOCR.cc:1287 #: ../qt/src/OutputEditorHOCR.cc:1049 ../qt/src/OutputEditorHOCR.cc:1079 msgid "hOCR HTML Files" msgstr "Файли hOCR HTML" #: ../gtk/src/OutputEditorHOCR.cc:1249 ../qt/src/OutputEditorHOCR.cc:1049 msgid "Open hOCR File" msgstr "Відкрити файл hORC" #: ../gtk/src/OutputEditorHOCR.cc:1258 ../qt/src/OutputEditorHOCR.cc:1055 #, fuzzy msgid "Failed to open file" msgstr "Ðеможливо відкрити файли" #: ../gtk/src/OutputEditorHOCR.cc:1258 ../qt/src/OutputEditorHOCR.cc:1055 #, fuzzy msgid "The file could not be opened: %1." msgstr "Ðеможливо відкрити наÑтупні файли:%1" #: ../gtk/src/OutputEditorHOCR.cc:1267 ../qt/src/OutputEditorHOCR.cc:1062 msgid "Invalid hOCR file" msgstr "Покшоджений файл hORC" #: ../gtk/src/OutputEditorHOCR.cc:1267 ../qt/src/OutputEditorHOCR.cc:1062 msgid "The file does not appear to contain valid hOCR HTML: %1" msgstr "Файл не міÑтить коректного вміÑту hORC HTML: %1" #: ../gtk/src/OutputEditorHOCR.cc:1283 ../gtk/src/OutputEditorHOCR.cc:1343 #: ../gtk/src/OutputEditorText.cc:306 ../qt/src/OutputEditorHOCR.cc:1077 #: ../qt/src/OutputEditorHOCR.cc:1131 ../qt/src/OutputEditorText.cc:246 msgid "output" msgstr "результати" #: ../gtk/src/OutputEditorHOCR.cc:1288 ../qt/src/OutputEditorHOCR.cc:1079 #, fuzzy msgid "Save hOCR Output..." msgstr "Зберегти результати..." #: ../gtk/src/OutputEditorHOCR.cc:1296 ../gtk/src/OutputEditorHOCR.cc:1357 #: ../gtk/src/OutputEditorText.cc:319 ../qt/src/OutputEditorHOCR.cc:1087 #: ../qt/src/OutputEditorHOCR.cc:1143 ../qt/src/OutputEditorText.cc:256 msgid "Failed to save output" msgstr "Зберегти результати не вдалоÑÑ" #: ../gtk/src/OutputEditorHOCR.cc:1296 ../gtk/src/OutputEditorHOCR.cc:1357 #: ../gtk/src/OutputEditorText.cc:319 ../qt/src/OutputEditorHOCR.cc:1087 #: ../qt/src/OutputEditorHOCR.cc:1143 ../qt/src/OutputEditorText.cc:256 msgid "Check that you have writing permissions in the selected folder." msgstr "ПереконайтеÑÑ, що у Ð²Ð°Ñ Ñ” дозвіл на Ð·Ð°Ð¿Ð¸Ñ Ð² обрану теку." #: ../gtk/src/OutputEditorHOCR.cc:1346 ../qt/src/OutputEditorHOCR.cc:1133 #, fuzzy msgid "PDF Files" msgstr "Файли" #: ../gtk/src/OutputEditorHOCR.cc:1347 ../qt/src/OutputEditorHOCR.cc:1133 #, fuzzy msgid "Save PDF Output..." msgstr "Зберегти результати..." #: ../gtk/src/OutputEditorHOCR.cc:1375 ../qt/src/OutputEditorHOCR.cc:1157 msgid "The PDF library does not support the selected font." msgstr "" #: ../gtk/src/OutputEditorHOCR.cc:1435 ../qt/src/OutputEditorHOCR.cc:1216 #, fuzzy msgid "Errors occurred" msgstr "СталиÑÑ Ð¿Ð¾Ð¼Ð¸Ð»ÐºÐ¸ при розпізнаванні" #: ../gtk/src/OutputEditorHOCR.cc:1435 ../qt/src/OutputEditorHOCR.cc:1216 #, fuzzy msgid "" "The following pages could not be rendered:\n" "%1" msgstr "" "Ðеможливо відкрити наÑтупні файли:\n" "%1" #: ../gtk/src/OutputEditorHOCR.cc:1562 ../gtk/src/OutputEditorText.cc:333 #: ../qt/src/OutputEditorHOCR.cc:1331 ../qt/src/OutputEditorText.cc:269 msgid "Output not saved" msgstr "Результати не збережено" #: ../gtk/src/OutputEditorHOCR.cc:1562 ../gtk/src/OutputEditorText.cc:333 #: ../qt/src/OutputEditorHOCR.cc:1331 ../qt/src/OutputEditorText.cc:269 msgid "Save output before proceeding?" msgstr "Зберегти результати, перш ніж продовжити?" #: ../gtk/src/OutputEditorText.cc:197 ../qt/src/OutputEditorText.cc:158 msgid "Stripping line breaks..." msgstr "Ð’Ð¸Ð´Ð°Ð»ÐµÐ½Ð½Ñ Ñ€Ð¾Ð·Ñ€Ð¸Ð²Ñ–Ð² Ñ€Ñдків..." #: ../gtk/src/OutputEditorText.cc:211 msgid "Check spelling" msgstr "Перевірити орфографію" #: ../gtk/src/OutputEditorText.cc:238 ../qt/src/OutputEditorText.cc:178 msgid "Replacing..." msgstr "Заміна..." #: ../gtk/src/OutputEditorText.cc:264 ../qt/src/OutputEditorText.cc:204 #, fuzzy msgid "File: %1" msgstr "Файли" #: ../gtk/src/OutputEditorText.cc:267 ../qt/src/OutputEditorText.cc:207 #, fuzzy msgid "Page: %1" msgstr "Помилка читаннÑ: %1" #: ../gtk/src/OutputEditorText.cc:280 ../gtk/src/Recognizer.cc:481 #: ../qt/src/Recognizer.cc:460 msgid "" "\n" "[Failed to recognize page %1]\n" msgstr "" "\n" "[Ðе вдалоÑÑ Ñ€Ð¾Ð·Ð¿Ñ–Ð·Ð½Ð°Ñ‚Ð¸ Ñторінку %1]\n" #: ../gtk/src/OutputEditorText.cc:310 ../qt/src/OutputEditorText.cc:248 msgid "Text Files" msgstr "ТекÑтові файли" #: ../gtk/src/OutputEditorText.cc:311 ../qt/src/OutputEditorText.cc:248 msgid "Save Output..." msgstr "Зберегти результати..." #: ../gtk/src/Recognizer.cc:156 ../qt/src/Recognizer.cc:131 msgid "" "Tesseract crashed with the following message:\n" "\n" "%1\n" "\n" "This typically happens for one of the following reasons:\n" "- Outdated traineddata files are used.\n" "- Auxiliary language data files are missing.\n" "- Corrupt language data files.\n" "\n" "Make sure your language data files are valid and compatible with tesseract " "%2." msgstr "" #: ../gtk/src/Recognizer.cc:212 ../qt/src/Recognizer.cc:191 msgid "No languages available" msgstr "ДоÑтупних мов не виÑвлено" #: ../gtk/src/Recognizer.cc:212 ../qt/src/Recognizer.cc:191 msgid "" "No tesseract languages are available for use. Recognition will not work." msgstr "Мовні файли Ð´Ð»Ñ tesseract не доÑтупні. Ð Ð¾Ð·Ð¿Ñ–Ð·Ð½Ð°Ð²Ð°Ð½Ð½Ñ Ð½Ðµ працюватиме." #: ../gtk/src/Recognizer.cc:266 ../qt/src/Recognizer.cc:251 msgid "Multilingual" msgstr "Кілька мов" #: ../gtk/src/Recognizer.cc:318 ../qt/src/Recognizer.cc:295 #, fuzzy msgid "Automatic page segmentation" msgstr "Ð Ð¾Ð·Ñ‚Ð°ÑˆÑƒÐ²Ð°Ð½Ð½Ñ Ð¿Ð°Ð½ÐµÐ»Ñ– результатів:" #: ../gtk/src/Recognizer.cc:319 ../qt/src/Recognizer.cc:296 msgid "Page segmentation with orientation and script detection" msgstr "" #: ../gtk/src/Recognizer.cc:320 ../qt/src/Recognizer.cc:297 msgid "Assume single column of text" msgstr "" #: ../gtk/src/Recognizer.cc:321 ../qt/src/Recognizer.cc:298 msgid "Assume single block of vertically aligned text" msgstr "" #: ../gtk/src/Recognizer.cc:322 ../qt/src/Recognizer.cc:299 msgid "Assume a single uniform block of text" msgstr "" #: ../gtk/src/Recognizer.cc:323 ../qt/src/Recognizer.cc:300 msgid "Assume a line of text" msgstr "" #: ../gtk/src/Recognizer.cc:324 ../qt/src/Recognizer.cc:301 msgid "Assume a single word" msgstr "" #: ../gtk/src/Recognizer.cc:325 ../qt/src/Recognizer.cc:302 msgid "Assume a single word in a circle" msgstr "" #: ../gtk/src/Recognizer.cc:326 ../qt/src/Recognizer.cc:303 msgid "Sparse text in no particular order" msgstr "" #: ../gtk/src/Recognizer.cc:327 ../qt/src/Recognizer.cc:304 msgid "Sparse text with orientation and script detection" msgstr "" #: ../gtk/src/Recognizer.cc:341 ../qt/src/Recognizer.cc:314 msgid "Page segmentation mode" msgstr "" #: ../gtk/src/Recognizer.cc:347 ../qt/src/Recognizer.cc:321 msgid "Manage languages..." msgstr "Керувати мовами..." #: ../gtk/src/Recognizer.cc:403 ../qt/src/Recognizer.cc:381 #, fuzzy msgid "Current selection" msgstr "Розпізнати виділене" #: ../gtk/src/Recognizer.cc:475 ../qt/src/Recognizer.cc:454 msgid "Recognizing page %1 (%2 of %3)" msgstr "Триває Ñ€Ð¾Ð·Ð¿Ñ–Ð·Ð½Ð°Ð²Ð°Ð½Ð½Ñ Ñторінки %1 (%2 із %3)" #: ../gtk/src/Recognizer.cc:480 ../qt/src/Recognizer.cc:459 #, fuzzy msgid "" "\n" "- Page %1: failed to render page" msgstr "" "\n" "\tСторінка %1: не вдалоÑÑ Ð²Ñ–Ð·ÑƒÐ°Ð»Ñ–Ð·ÑƒÐ²Ð°Ñ‚Ð¸ Ñторінку" #: ../gtk/src/Recognizer.cc:510 ../gtk/src/Recognizer.cc:539 #: ../gtk/src/Recognizer.cc:552 ../qt/src/Recognizer.cc:488 #: ../qt/src/Recognizer.cc:517 ../qt/src/Recognizer.cc:530 msgid "Recognizing..." msgstr "Триває розпізнаваннÑ..." #: ../gtk/src/Recognizer.cc:514 ../gtk/src/Recognizer.cc:522 #: ../qt/src/Recognizer.cc:492 ../qt/src/Recognizer.cc:500 msgid "Recognition errors occurred" msgstr "СталиÑÑ Ð¿Ð¾Ð¼Ð¸Ð»ÐºÐ¸ при розпізнаванні" #: ../gtk/src/Recognizer.cc:514 ../qt/src/Recognizer.cc:492 msgid "The following errors occurred:%1" msgstr "СталиÑÑ Ð½Ð°Ñтупні помилки:%1" #: ../gtk/src/Recognizer.cc:522 ../qt/src/Recognizer.cc:500 msgid "Failed to initialize tesseract" msgstr "Помилка ініціалізації tesseract" #: ../gtk/src/scanner/ScannerSane.cc:83 ../gtk/src/scanner/ScannerTwain.cc:287 #: ../qt/src/scanner/ScannerSane.cc:85 ../qt/src/scanner/ScannerTwain.cc:285 msgid "Scan canceled" msgstr "Ð¡ÐºÐ°Ð½ÑƒÐ²Ð°Ð½Ð½Ñ ÑкаÑовано" #: ../gtk/src/scanner/ScannerSane.cc:157 ../gtk/src/scanner/ScannerTwain.cc:186 #: ../qt/src/scanner/ScannerSane.cc:158 ../qt/src/scanner/ScannerTwain.cc:178 msgid "No scanner specified" msgstr "Сканер не вказано" #: ../gtk/src/scanner/ScannerSane.cc:166 ../gtk/src/scanner/ScannerTwain.cc:195 #: ../qt/src/scanner/ScannerSane.cc:167 ../qt/src/scanner/ScannerTwain.cc:187 msgid "Unable to connect to scanner" msgstr "Ðеможливо під'єднатиÑÑ Ð´Ð¾ Ñканера" #: ../gtk/src/scanner/ScannerSane.cc:386 ../gtk/src/scanner/ScannerTwain.cc:265 #: ../gtk/src/scanner/ScannerTwain.cc:291 ../qt/src/scanner/ScannerSane.cc:387 #: ../qt/src/scanner/ScannerTwain.cc:257 ../qt/src/scanner/ScannerTwain.cc:289 msgid "Unable to start scan" msgstr "Ðеможливо розпочати ÑкануваннÑ" #: ../gtk/src/scanner/ScannerSane.cc:394 ../gtk/src/scanner/ScannerSane.cc:437 #: ../gtk/src/scanner/ScannerTwain.cc:317 ../qt/src/scanner/ScannerSane.cc:395 #: ../qt/src/scanner/ScannerSane.cc:438 ../qt/src/scanner/ScannerTwain.cc:315 msgid "Error communicating with scanner" msgstr "Помилка зв'Ñзку зі Ñканером" #: ../gtk/src/scanner/ScannerSane.cc:498 ../qt/src/scanner/ScannerSane.cc:494 msgid "Failed to save image" msgstr "Ðе вдалоÑÑ Ð·Ð±ÐµÑ€ÐµÐ³Ñ‚Ð¸ зображеннÑ" #: ../gtk/src/SourceManager.cc:118 ../qt/src/SourceManager.cc:112 msgid "Unable to open files" msgstr "Ðеможливо відкрити файли" #: ../gtk/src/SourceManager.cc:118 ../qt/src/SourceManager.cc:112 msgid "The following files could not be opened:%1" msgstr "Ðеможливо відкрити такі файли:%1" #: ../gtk/src/SourceManager.cc:134 ../qt/src/SourceManager.cc:154 msgid "Images and PDFs" msgstr "Ð—Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð½Ñ Ñ– файли PDF" #: ../gtk/src/SourceManager.cc:137 ../qt/src/SourceManager.cc:155 msgid "Select Files" msgstr "Виберіть файли" #: ../gtk/src/SourceManager.cc:143 ../qt/src/SourceManager.cc:166 msgid "Clipboard Error" msgstr "Помилка буфера обміну" #: ../gtk/src/SourceManager.cc:143 ../qt/src/SourceManager.cc:166 msgid "Failed to read the clipboard." msgstr "Ðе вдалоÑÑ Ð¿Ñ€Ð¾Ñ‡Ð¸Ñ‚Ð°Ñ‚Ð¸ вміÑÑ‚ буфера обміну." #: ../gtk/src/SourceManager.cc:147 ../qt/src/SourceManager.cc:170 #: ../qt/src/SourceManager.cc:176 msgid "Pasted %1" msgstr "Ð’Ñтавлено %1" #: ../gtk/src/SourceManager.cc:159 ../qt/src/SourceManager.cc:183 msgid "Screenshot Error" msgstr "Помилка Ð¾Ñ‚Ñ€Ð¸Ð¼Ð°Ð½Ð½Ñ Ð·Ð½Ñ–Ð¼ÐºÐ° екрану" #: ../gtk/src/SourceManager.cc:159 ../qt/src/SourceManager.cc:183 msgid "Failed to take screenshot." msgstr "Ðе вдалоÑÑŒ зробити знімок екрану." #: ../gtk/src/SourceManager.cc:163 ../qt/src/SourceManager.cc:187 msgid "Screenshot %1" msgstr "Знімок екрану %1" #: ../gtk/src/SourceManager.cc:168 ../qt/src/SourceManager.cc:192 msgid "Saving image..." msgstr "Ð—Ð±ÐµÑ€ÐµÐ¶ÐµÐ½Ð½Ñ Ð·Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð½Ñ..." #: ../gtk/src/SourceManager.cc:175 ../qt/src/SourceManager.cc:205 msgid "Cannot Write File" msgstr "Ðеможливо запиÑати файл" #: ../gtk/src/SourceManager.cc:175 ../qt/src/SourceManager.cc:205 msgid "Could not write to %1." msgstr "Ðеможливо запиÑати в %1." #: ../gtk/src/SourceManager.cc:202 ../qt/src/SourceManager.cc:227 msgid "Delete File?" msgstr "Вилучити файл?" #: ../gtk/src/SourceManager.cc:202 ../qt/src/SourceManager.cc:227 #, fuzzy msgid "The following files will be deleted:%1" msgstr "" "Буде вилучено наÑтупний файл:\n" "%1" #: ../gtk/src/SourceManager.cc:266 ../qt/src/SourceManager.cc:278 msgid "Missing File" msgstr "Файл відÑутній" #: ../gtk/src/SourceManager.cc:266 ../qt/src/SourceManager.cc:278 msgid "" "The following file has been deleted or moved:\n" "%1" msgstr "" "ÐаÑтупний файл було вилучено або переміщено:\n" "%1" #: ../gtk/src/SubstitutionsManager.cc:39 ../qt/src/SubstitutionsManager.cc:77 msgid "Search for" msgstr "Шукати" #: ../gtk/src/SubstitutionsManager.cc:40 ../qt/src/SubstitutionsManager.cc:77 msgid "Replace with" msgstr "Замінити на" #: ../gtk/src/SubstitutionsManager.cc:62 ../qt/src/SubstitutionsManager.cc:99 msgid "substitution_list.txt" msgstr "ÑпиÑок_замін.txt" #: ../gtk/src/SubstitutionsManager.cc:84 ../gtk/src/SubstitutionsManager.cc:119 #: ../qt/src/SubstitutionsManager.cc:114 ../qt/src/SubstitutionsManager.cc:152 msgid "Substitutions List" msgstr "СпиÑок замін" #: ../gtk/src/SubstitutionsManager.cc:85 ../qt/src/SubstitutionsManager.cc:114 msgid "Open Substitutions List" msgstr "Відкрити ÑпиÑок замін" #: ../gtk/src/SubstitutionsManager.cc:90 ../qt/src/SubstitutionsManager.cc:119 msgid "Error Reading File" msgstr "Помилка Ñ‡Ð¸Ñ‚Ð°Ð½Ð½Ñ Ñ„Ð°Ð¹Ð»Ñƒ" #: ../gtk/src/SubstitutionsManager.cc:90 ../qt/src/SubstitutionsManager.cc:119 msgid "Unable to read '%1'." msgstr "Ðеможливо прочитати '%1'." #: ../gtk/src/SubstitutionsManager.cc:113 ../qt/src/SubstitutionsManager.cc:146 msgid "Errors Occurred Reading File" msgstr "СталиÑÑ Ð¿Ð¾Ð¼Ð¸Ð»ÐºÐ¸ при читанні файлу" #: ../gtk/src/SubstitutionsManager.cc:113 ../qt/src/SubstitutionsManager.cc:146 msgid "Some entries of the substitutions list could not be read." msgstr "Ðе вдалоÑÑ Ð¿Ñ€Ð¾Ñ‡Ð¸Ñ‚Ð°Ñ‚Ð¸ певні елементи ÑпиÑку замін." #: ../gtk/src/SubstitutionsManager.cc:120 ../qt/src/SubstitutionsManager.cc:152 msgid "Save Substitutions List" msgstr "Зберегти ÑпиÑок замін" #: ../gtk/src/SubstitutionsManager.cc:126 ../qt/src/SubstitutionsManager.cc:158 msgid "Error Saving File" msgstr "Помилка Ð·Ð±ÐµÑ€ÐµÐ¶ÐµÐ½Ð½Ñ Ñ„Ð°Ð¹Ð»Ñƒ" #: ../gtk/src/SubstitutionsManager.cc:126 ../qt/src/SubstitutionsManager.cc:158 msgid "Unable to write to '%1'." msgstr "Ðеможливо запиÑати в '%1'." #: ../gtk/src/SubstitutionsManager.cc:144 ../qt/src/SubstitutionsManager.cc:172 msgid "Save List?" msgstr "Зберегти ÑпиÑок?" #: ../gtk/src/SubstitutionsManager.cc:144 ../qt/src/SubstitutionsManager.cc:172 msgid "Do you want to save the current list?" msgstr "Ви хочете зберегти поточний ÑпиÑок?" #: ../gtk/src/SubstitutionsManager.cc:179 ../qt/src/SubstitutionsManager.cc:208 msgid "Applying substitutions..." msgstr "ЗаÑтоÑÑƒÐ²Ð°Ð½Ð½Ñ Ð·Ð°Ð¼Ñ–Ð½..." #: ../gtk/src/TessdataManager.cc:58 ../qt/src/TessdataManager.cc:72 #, fuzzy msgid "" "PackageKit is required for managing system-wide tesseract language packs, " "but it was not found. Please use the system package management software to " "manage the tesseract language packs, or switch to use the user tessdata path " "in the configuration dialog." msgstr "" "Ð”Ð»Ñ ÐºÐµÑ€ÑƒÐ²Ð°Ð½Ð½Ñ Ð²Ñтановленими мовними пакунками tesseract потрібен PackageKit, " "але його не знайдено. Будь лаÑка, ÑкориÑтайтеÑÑ ÑиÑтемним менеджером " "програм, щоб вÑтановити потрібні мовні пакунки." #: ../gtk/src/TessdataManager.cc:63 ../qt/src/TessdataManager.cc:77 msgid "Fetching available languages" msgstr "Ð—Ð°Ð²Ð°Ð½Ñ‚Ð°Ð¶ÐµÐ½Ð½Ñ Ð¿ÐµÑ€ÐµÐ»Ñ–ÐºÑƒ доÑтупних мов" #: ../gtk/src/TessdataManager.cc:68 ../gtk/src/TessdataManager.cc:89 #: ../gtk/src/TessdataManager.cc:121 ../qt/src/TessdataManager.cc:82 #: ../qt/src/TessdataManager.cc:94 ../qt/src/TessdataManager.cc:127 msgid "Failed to fetch list of available languages: %1" msgstr "Ðеможливо завантажити перелік доÑтупних мов: %1" #: ../gtk/src/TessdataManager.cc:100 ../gtk/src/TessdataManager.cc:129 #: ../qt/src/TessdataManager.cc:105 ../qt/src/TessdataManager.cc:114 #: ../qt/src/TessdataManager.cc:136 ../qt/src/TessdataManager.cc:147 msgid "Parsing error: %1" msgstr "Помилка читаннÑ: %1" #: ../gtk/src/TessdataManager.cc:191 ../qt/src/TessdataManager.cc:191 #, fuzzy msgid "Applying changes..." msgstr "ЗаÑтоÑÑƒÐ²Ð°Ð½Ð½Ñ Ð·Ð°Ð¼Ñ–Ð½..." #: ../gtk/src/TessdataManager.cc:252 ../qt/src/TessdataManager.cc:237 msgid "Failed to create directory for tessdata files." msgstr "" #: ../gtk/src/TessdataManager.cc:261 ../qt/src/TessdataManager.cc:245 #, fuzzy msgid "Downloading %1..." msgstr "ЗавантажуєтьÑÑ '%1'..." #: ../gtk/src/TessdataManager.cc:281 ../qt/src/TessdataManager.cc:267 msgid "" "The following files could not be downloaded or removed:\n" "%1\n" "\n" "Check the connectivity and directory permissions." msgstr "" "Такі файли не вдалоÑÑ Ð·Ð°Ð²Ð°Ð½Ñ‚Ð°Ð¶Ð¸Ñ‚Ð¸ чи вилучити:\n" "%1\n" "\n" "Перевірте з'Ñ”Ð´Ð°Ð½Ð½Ñ Ñ‚Ð° права доÑтупу до тек." #: ../gtk/src/Utils.cc:62 msgid "Yes" msgstr "Так" #: ../gtk/src/Utils.cc:65 msgid "No" msgstr "ÐÑ–" #: ../gtk/src/Utils.cc:74 msgid "Discard" msgstr "Знищити" #: ../qt/data/AboutDialog.ui.h:1 msgid "About gImageReader" msgstr "Про програму gImageReader" #: ../qt/data/AboutDialog.ui.h:3 #, fuzzy msgid "" "

 

A graphical frontend to tesseract-ocr

Website

 

" msgstr "" "

 

Графічний Ñ–Ð½Ñ‚ÐµÑ€Ñ„ÐµÐ¹Ñ Ð´Ð»Ñ tesseract-ocr

Сайт

 

" #: ../qt/data/AboutDialog.ui.h:4 msgid "Credits" msgstr "ПодÑки" #: ../qt/data/AboutDialog.ui.h:5 msgid "License" msgstr "ЛіцензіÑ" #: ../qt/data/ConfigDialog.ui.h:14 msgid "System encoding" msgstr "ÐšÐ¾Ð´ÑƒÐ²Ð°Ð½Ð½Ñ ÑиÑтеми" #: ../qt/data/ConfigDialog.ui.h:15 msgid "UTF-8" msgstr "" #: ../qt/data/ConfigDialog.ui.h:19 msgid "Text file encoding:" msgstr "ÐšÐ¾Ð´ÑƒÐ²Ð°Ð½Ð½Ñ Ñ‚ÐµÐºÑтового файлу:" #: ../qt/data/CrashHandler.ui.h:2 #, no-c-format msgid "" "

The application has " "crashed

Apologies for the inconvenience. To help improve the " "application, please consider reporting the issue to manisandro@gmail.com. Please try to describe what you were doing before the application " "crashed. Also, include the information below. Thank you.

" msgstr "" "

Програма зазнала " "аварії

Прошу Ð²Ð¸Ð±Ð°Ñ‡ÐµÐ½Ð½Ñ Ð·Ð° незручноÑті. Ð”Ð»Ñ Ð¾Ð¿Ñ‚Ð¸Ð¼Ñ–Ð·Ð°Ñ†Ñ–Ñ— роботи " "програми, будь лаÑка напишіть про проблему на електронну пошту manisandro@gmail.com. ÐамагайтеÑÑ Ð¾Ð¿Ð¸Ñати, Ñкі дії ви виконували " "перед тим Ñк програма зазнала аварії. Також додайте інформацію, розміщену " "нижче. ДÑкую.

" #: ../qt/data/MainWindow.ui.h:1 msgid "gImageReader" msgstr "gImageReader" #. Remove & from some labels which designer insists in adding #: ../qt/data/MainWindow.ui.h:17 ../qt/src/Ui_MainWindow.hh:49 msgid "Sources" msgstr "Джерела" #: ../qt/data/MainWindow.ui.h:18 msgid "Zoom In" msgstr "Збільшити" #: ../qt/data/MainWindow.ui.h:20 msgid "Zoom Out" msgstr "Зменшити" #: ../qt/data/MainWindow.ui.h:22 msgid "Normal Size" msgstr "Справжній розмір" #: ../qt/data/MainWindow.ui.h:24 msgid "Best Fit" msgstr "Оптимальний розмір" #: ../qt/data/MainWindow.ui.h:26 msgid "Rotate Left" msgstr "Повернути вліво" #: ../qt/data/MainWindow.ui.h:27 msgid "Rotate left" msgstr "Повернути вліво" #: ../qt/data/MainWindow.ui.h:28 msgid "Rotate Right" msgstr "Повернути вправо" #: ../qt/data/MainWindow.ui.h:29 msgid "Rotate right" msgstr "Повернути вправо" #: ../qt/data/MainWindow.ui.h:30 msgid "Image Controls" msgstr "ÐšÐµÑ€ÑƒÐ²Ð°Ð½Ð½Ñ Ð·Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð½Ñм" #: ../qt/data/MainWindow.ui.h:32 msgid "Autodetect Layout" msgstr "ÐÐ²Ñ‚Ð¾Ð²Ð¸Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ð²Ð¼Ñ–Ñту" #: ../qt/data/MainWindow.ui.h:34 msgid "Toggle Output Pane" msgstr "Показати/приховати панель результатів" #: ../qt/src/MainWindow.cc:518 #, fuzzy msgid "Could not read %1: %2" msgstr "Ðеможливо прочитати %1." #: ../qt/src/MainWindow.cc:543 #, fuzzy msgid "The following dictionary files were installed:%1" msgstr "Було вÑтановлено такі Ñловники:%1" #: ../qt/src/Ui_MainWindow.hh:50 msgid "Output" msgstr "Результати" #: ../qt/src/Ui_MainWindow.hh:133 msgid "OCR mode:" msgstr "Режим розпізнаваннÑ:" #: ../qt/src/Ui_MainWindow.hh:204 msgid "Remove Image" msgstr "УÑунути зображеннÑ" #: ../qt/src/Ui_MainWindow.hh:207 msgid "Delete Image" msgstr "Вилучити зображеннÑ" #: ../qt/src/Ui_MainWindow.hh:210 msgid "Clear List" msgstr "ОчиÑтити ÑпиÑок" #. Output toolbar #: ../qt/src/Ui_OutputEditorHOCR.hh:39 ../qt/src/Ui_OutputEditorHOCR.hh:40 msgid "Open hOCR file" msgstr "Відкрити файл hORC" #: ../qt/src/Ui_OutputEditorHOCR.hh:41 ../qt/src/Ui_OutputEditorHOCR.hh:42 #, fuzzy msgid "Save as hOCR text" msgstr "Зберегти Ñк зображеннÑ" #: ../qt/src/Ui_OutputEditorText.hh:108 msgid "Strip Line Breaks" msgstr "Видалити розриви Ñ€Ñдків" #: ../qt/src/Ui_OutputEditorText.hh:113 msgid "Find and Replace" msgstr "Знайти Ñ– замінити" #: ../qt/src/Ui_OutputEditorText.hh:122 msgid "Save Output" msgstr "Зберегти результати" #: ../qt/src/Ui_OutputEditorText.hh:124 msgid "Clear Output" msgstr "ОчиÑтити результати" #~ msgid "" #~ "<html><head/><body><p><span style=" font-" #~ "weight:600;">The application has crashed</span></p>" #~ "<p>Apologies for the inconvenience. To help improve the " #~ "application, please consider reporting the issue to <a href="" #~ "mailto:manisandro@gmail.com?subject=gImageReader%20Crash">" #~ "manisandro@gmail.com</a>. Please try to describe what you were " #~ "doing before the application crashed. Also, include the information " #~ "below. Thank you.</p></body></html>" #~ msgstr "" #~ "<html><head/><body><p><span style=" font-" #~ "weight:600;">Програма зазнала аварії</span></p><" #~ "p>Прошу Ð²Ð¸Ð±Ð°Ñ‡ÐµÐ½Ð½Ñ Ð·Ð° незручноÑті. Ð”Ð»Ñ Ð¾Ð¿Ñ‚Ð¸Ð¼Ñ–Ð·Ð°Ñ†Ñ–Ñ— роботи програми будь " #~ "лаÑка напишіть про проблему на електронну пошту <a href="mailto:" #~ "manisandro@gmail.com?subject=gImageReader%20Crash">" #~ "manisandro@gmail.com</a>. ÐамагайтеÑÑ Ð¾Ð¿Ð¸Ñати, Ñкі дії ви " #~ "виконували перед тим Ñк програма зазнала аварії. Також додайте " #~ "інформацію, розміщену нижче. ДÑкую.</p></body></html>" #~ msgid "" #~ "<small><b>Example:</b> 1-10, 13, 14-18</small>" #~ msgstr "" #~ "<small><b>Пример:</b> 1-10, 13, 14-18</small>" #, fuzzy #~ msgid "Detect script and orientation" #~ msgstr "Ð Ð¾Ð·Ñ‚Ð°ÑˆÑƒÐ²Ð°Ð½Ð½Ñ Ð¿Ð°Ð½ÐµÐ»Ñ– результатів:" #~ msgid "" #~ "PackageKit is required for managing tesseract language packs, but it was " #~ "not found. Please use the system package management software to manage " #~ "the tesseract language packs." #~ msgstr "" #~ "Ð”Ð»Ñ ÐºÐµÑ€ÑƒÐ²Ð°Ð½Ð½Ñ Ð²Ñтановленими мовними пакунками tesseract потрібен " #~ "PackageKit, але його не знайдено. Будь лаÑка, ÑкориÑтайтеÑÑ ÑиÑтемним " #~ "менеджером програм, щоб вÑтановити потрібні мовні пакунки." #~ msgid "" #~ "\n" #~ "\tFailed to initialize tesseract" #~ msgstr "" #~ "\n" #~ "\tПомилка ініціалізації tesseract" #, fuzzy #~ msgid "So&urces" #~ msgstr "Джерела" #, fuzzy #~ msgid "&Output" #~ msgstr "Сканувати" #~ msgid "To recognize specific areas, drag rectangles over them." #~ msgstr "Щоб розпізнати певні ділÑнки, обведіть Ñ—Ñ… рамкою." #~ msgid "Rendering image..." #~ msgstr "ТраÑÑƒÐ²Ð°Ð½Ð½Ñ Ð·Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð½Ñ..." #~ msgid "en_US" #~ msgstr "uk_UA" #, fuzzy #~ msgid "So&urces" #~ msgstr "Джерела" #, fuzzy #~ msgid "&Output" #~ msgstr "Результати" #~ msgid "Configuration" #~ msgstr "ÐалаштуваннÑ" gImageReader-3.2.3/po/zh_CN.po000066400000000000000000001410631312567024200160210ustar00rootroot00000000000000# Simplified Chinese translations for gImageReader package # Copyright (C) 2017 THE GIMAGEREADER'S COPYRIGHT HOLDER # This file is distributed under the same license as the gImageReader package. # # Timothy Lee , 2017. # Sandro Mani , 2016, 2017. msgid "" msgstr "" "Project-Id-Version: \n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2017-07-01 10:34+0200\n" "PO-Revision-Date: 2017-06-30 20:09+0100\n" "Last-Translator: Sandro Mani \n" "Language-Team: Chinese \n" "Language: zh_CN\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" "X-Generator: Lokalize 2.0\n" #: ../gtk/data/appmenu.ui.h:1 ../qt/src/Ui_MainWindow.hh:165 msgid "Redetect Languages" msgstr "釿–°æ£€æµ‹è¯­è¨€" #: ../gtk/data/appmenu.ui.h:2 ../gtk/data/gimagereader.ui.h:39 #: ../qt/data/ConfigDialog.ui.h:1 ../qt/src/Ui_MainWindow.hh:168 msgid "Preferences" msgstr "选项" #: ../gtk/data/appmenu.ui.h:3 ../gtk/data/gimagereader.ui.h:40 #: ../gtk/src/MainWindow.cc:484 ../qt/src/MainWindow.cc:445 #: ../qt/src/Ui_MainWindow.hh:173 msgid "Help" msgstr "å助" #: ../gtk/data/appmenu.ui.h:4 ../qt/data/AboutDialog.ui.h:2 #: ../qt/src/Ui_MainWindow.hh:176 msgid "About" msgstr "关于" #: ../gtk/data/appmenu.ui.h:5 msgid "Quit" msgstr "离开" #: ../gtk/data/crashhandler.ui.h:1 ../qt/src/CrashHandler.cc:36 msgid "Regenerate backtrace" msgstr "é‡å»º backtrace" #: ../gtk/data/crashhandler.ui.h:2 msgid "The application has crashed" msgstr "应用程åºå·²å¼‚常终止" #: ../gtk/data/crashhandler.ui.h:4 #, no-c-format msgid "" "Apologies for the inconvenience. To help improve the application, please " "consider reporting the issue to manisandro@gmail.com. Please try to " "describe what you were doing before the application crashed. Also, include " "the information below. Thank you." msgstr "" "我们为带æ¥çš„ä¸ä¾¿è€Œé“æ­‰ã€‚å¦‚ä½ æœ‰æ„æ”¹å–„此程åºï¼Œè¯·è€ƒè™‘将问题汇报给manisandro@gmail.com。请å°è¯•æè¿°ä½ åœ¨ç¨‹åºç»ˆæ­¢å‰æ‰€åšçš„事情。å¦å¤–,请一并" "附上下列数æ®ã€‚谢谢。" #: ../gtk/data/editor_hocr.ui.h:1 ../qt/data/PdfExportDialog.ui.h:1 msgid "PDF Export" msgstr "输出 PDF" #: ../gtk/data/editor_hocr.ui.h:2 ../gtk/data/gimagereader.ui.h:55 #: ../gtk/src/Acquirer.cc:42 ../gtk/src/FileDialogs.cc:150 #: ../gtk/src/Utils.cc:68 ../qt/data/ConfigDialog.ui.h:27 #: ../qt/data/MainWindow.ui.h:14 msgid "Cancel" msgstr "å–æ¶ˆ" #: ../gtk/data/editor_hocr.ui.h:3 ../gtk/data/gimagereader.ui.h:41 #: ../gtk/src/FileDialogs.cc:151 ../gtk/src/Utils.cc:59 #: ../qt/data/ConfigDialog.ui.h:26 msgid "OK" msgstr "确定" #: ../gtk/data/editor_hocr.ui.h:4 ../qt/data/PdfExportDialog.ui.h:2 msgid "Output mode:" msgstr "输出模å¼ï¼š" #: ../gtk/data/editor_hocr.ui.h:5 ../qt/data/PdfExportDialog.ui.h:3 msgid "PDF" msgstr "PDF" #: ../gtk/data/editor_hocr.ui.h:6 ../qt/data/PdfExportDialog.ui.h:4 msgid "PDF with invisible text overlay" msgstr "包å«éšå½¢æ–‡å­—层的 PDF" #: ../gtk/data/editor_hocr.ui.h:7 ../qt/data/PdfExportDialog.ui.h:16 msgid "Format:" msgstr "æ ¼å¼ï¼š" #: ../gtk/data/editor_hocr.ui.h:8 ../qt/data/PdfExportDialog.ui.h:17 msgid "Compression:" msgstr "压缩:" #: ../gtk/data/editor_hocr.ui.h:9 ../qt/data/PdfExportDialog.ui.h:14 msgid "Compression quality:" msgstr "压缩质é‡ï¼š" #: ../gtk/data/editor_hocr.ui.h:10 ../qt/data/PdfExportDialog.ui.h:15 msgid "DPI:" msgstr "DPI:" #: ../gtk/data/editor_hocr.ui.h:11 ../qt/data/PdfExportDialog.ui.h:18 msgid "Dithering algorithm:" msgstr "递色演算法:" #: ../gtk/data/editor_hocr.ui.h:12 ../qt/data/PdfExportDialog.ui.h:13 msgid "Image settings:" msgstr "图åƒè®¾ç½®ï¼š" #: ../gtk/data/editor_hocr.ui.h:13 ../qt/data/PdfExportDialog.ui.h:11 msgid "Document font:" msgstr "文件字体:" #: ../gtk/data/editor_hocr.ui.h:14 ../qt/data/PdfExportDialog.ui.h:7 msgid "Uniformize line and word spacing" msgstr "统一行è·åŠå­—è·" #: ../gtk/data/editor_hocr.ui.h:15 ../qt/data/PdfExportDialog.ui.h:10 msgid "Use detected font sizes" msgstr "采用检测到的字体尺寸" #: ../gtk/data/editor_hocr.ui.h:16 ../qt/data/PdfExportDialog.ui.h:8 msgid "Preserve spaces wider than:" msgstr "ä¿ç•™ç©ºæ ¼å¤§äºŽï¼š" #: ../gtk/data/editor_hocr.ui.h:17 ../qt/data/PdfExportDialog.ui.h:12 msgid "characters" msgstr "字符" #: ../gtk/data/editor_hocr.ui.h:18 ../qt/data/PdfExportDialog.ui.h:9 msgid "Scale:" msgstr "缩放:" #: ../gtk/data/editor_hocr.ui.h:19 ../qt/data/PdfExportDialog.ui.h:6 msgid "Text settings:" msgstr "文本设置:" #: ../gtk/data/editor_hocr.ui.h:20 ../qt/data/PdfExportDialog.ui.h:5 msgid "Show preview" msgstr "显示预览" #: ../gtk/data/editor_hocr.ui.h:21 ../gtk/data/editor_text.ui.h:26 #: ../qt/src/Ui_OutputEditorText.hh:123 msgid "Save output" msgstr "存储输出" #: ../gtk/data/editor_hocr.ui.h:22 ../qt/src/Ui_OutputEditorHOCR.hh:44 #: ../qt/src/Ui_OutputEditorHOCR.hh:45 msgid "Export to PDF" msgstr "输出至 PDF" #: ../gtk/data/editor_hocr.ui.h:23 ../gtk/data/editor_text.ui.h:27 #: ../qt/src/Ui_OutputEditorHOCR.hh:47 ../qt/src/Ui_OutputEditorHOCR.hh:48 #: ../qt/src/Ui_OutputEditorText.hh:125 msgid "Clear output" msgstr "清除输出" #: ../gtk/data/editor_hocr.ui.h:24 ../qt/src/Ui_OutputEditorHOCR.hh:75 msgid "Properties" msgstr "属性" #: ../gtk/data/editor_hocr.ui.h:25 ../qt/src/Ui_OutputEditorHOCR.hh:79 msgid "Source" msgstr "æ¥æº" #. Output insert mode #: ../gtk/data/editor_text.ui.h:1 ../qt/src/Ui_OutputEditorText.hh:59 msgid "Append to current text" msgstr "附加到现有文字" #: ../gtk/data/editor_text.ui.h:2 ../qt/src/Ui_OutputEditorText.hh:60 msgid "Insert at cursor" msgstr "于光标ä½ç½®æ’å…¥" #: ../gtk/data/editor_text.ui.h:3 ../qt/src/Ui_OutputEditorText.hh:61 msgid "Replace current text" msgstr "å–代现有文字" #: ../gtk/data/editor_text.ui.h:4 ../qt/src/SubstitutionsManager.cc:37 #: ../qt/src/Ui_OutputEditorText.hh:177 msgid "Substitutions" msgstr "替æ¢å€¼" #: ../gtk/data/editor_text.ui.h:5 ../qt/src/SubstitutionsManager.cc:42 #: ../qt/src/SubstitutionsManager.cc:43 msgid "Open" msgstr "打开" #: ../gtk/data/editor_text.ui.h:6 ../gtk/src/Utils.cc:71 #: ../qt/src/SubstitutionsManager.cc:45 ../qt/src/SubstitutionsManager.cc:46 msgid "Save" msgstr "存储" #: ../gtk/data/editor_text.ui.h:7 ../qt/src/SubstitutionsManager.cc:48 #: ../qt/src/SubstitutionsManager.cc:49 msgid "Clear" msgstr "清除" #: ../gtk/data/editor_text.ui.h:8 ../qt/data/ConfigDialog.ui.h:16 #: ../qt/src/SubstitutionsManager.cc:51 ../qt/src/SubstitutionsManager.cc:52 msgid "Add" msgstr "新增" #: ../gtk/data/editor_text.ui.h:9 ../gtk/src/OutputEditorHOCR.cc:1202 #: ../gtk/src/OutputEditorHOCR.cc:1213 ../qt/data/ConfigDialog.ui.h:17 #: ../qt/src/OutputEditorHOCR.cc:998 ../qt/src/OutputEditorHOCR.cc:1000 #: ../qt/src/SubstitutionsManager.cc:54 ../qt/src/SubstitutionsManager.cc:55 msgid "Remove" msgstr "删除" #: ../gtk/data/editor_text.ui.h:10 ../gtk/data/gimagereader.ui.h:73 msgid "Apply" msgstr "应用" #: ../gtk/data/editor_text.ui.h:11 ../gtk/data/gimagereader.ui.h:74 msgid "Close" msgstr "关闭" #. Output postprocessing #: ../gtk/data/editor_text.ui.h:12 ../qt/src/Ui_OutputEditorText.hh:69 msgid "Keep line break if..." msgstr "ä¿ç•™æ¢è¡Œç¬¦å·ï¼Œå¦‚果……" #: ../gtk/data/editor_text.ui.h:13 ../qt/src/Ui_OutputEditorText.hh:71 msgid "Preceded by end mark (.?!)" msgstr "以终结å·èµ·é¦–(.?!)" #: ../gtk/data/editor_text.ui.h:14 ../qt/src/Ui_OutputEditorText.hh:73 msgid "Preceded or succeeded by quote" msgstr "以引å·èµ·é¦–或结尾" #: ../gtk/data/editor_text.ui.h:15 ../qt/src/Ui_OutputEditorText.hh:75 msgid "Other options" msgstr "其它选项" #: ../gtk/data/editor_text.ui.h:16 ../qt/src/Ui_OutputEditorText.hh:77 msgid "Join hyphenated words" msgstr "连接断字符å·å‰åŽçš„å­—" #: ../gtk/data/editor_text.ui.h:17 ../qt/src/Ui_OutputEditorText.hh:79 msgid "Collapse whitespace" msgstr "åˆå¹¶ç©ºæ ¼" #: ../gtk/data/editor_text.ui.h:18 ../qt/src/Ui_OutputEditorText.hh:81 msgid "Preserve paragraphs" msgstr "ä¿ç•™æ®µè½" #: ../gtk/data/editor_text.ui.h:19 ../qt/src/Ui_OutputEditorText.hh:83 msgid "Visual aids" msgstr "视觉辅助" #: ../gtk/data/editor_text.ui.h:20 ../qt/src/Ui_OutputEditorText.hh:85 msgid "Draw whitespace" msgstr "绘画空格" #: ../gtk/data/editor_text.ui.h:21 ../gtk/data/gimagereader.ui.h:31 #: ../qt/src/Ui_OutputEditorText.hh:102 msgid "Select insert mode" msgstr "选用æ’入模å¼" #: ../gtk/data/editor_text.ui.h:22 ../qt/src/Ui_OutputEditorText.hh:109 msgid "Strip line breaks on selected text" msgstr "去除选择文字的æ¢è¡Œç¬¦å·" #: ../gtk/data/editor_text.ui.h:23 ../qt/src/Ui_OutputEditorText.hh:114 msgid "Find and replace" msgstr "寻找åŠå–代" #: ../gtk/data/editor_text.ui.h:24 ../qt/src/Ui_OutputEditorText.hh:116 #: ../qt/src/Ui_OutputEditorText.hh:117 msgid "Undo" msgstr "æ¢å¤" #: ../gtk/data/editor_text.ui.h:25 ../qt/src/Ui_OutputEditorText.hh:119 #: ../qt/src/Ui_OutputEditorText.hh:120 msgid "Redo" msgstr "é‡åš" #: ../gtk/data/editor_text.ui.h:28 ../qt/src/Ui_OutputEditorText.hh:149 msgid "Find" msgstr "寻找" #: ../gtk/data/editor_text.ui.h:29 ../qt/src/Ui_OutputEditorText.hh:153 #: ../qt/src/Ui_OutputEditorText.hh:168 msgid "Replace" msgstr "å–代" #: ../gtk/data/editor_text.ui.h:30 ../qt/src/Ui_OutputEditorText.hh:173 msgid "Replace all" msgstr "全部å–代" #: ../gtk/data/editor_text.ui.h:31 ../qt/src/Ui_OutputEditorText.hh:163 msgid "Find previous" msgstr "寻找å‰ä¸€ä¸ª" #: ../gtk/data/editor_text.ui.h:32 ../qt/src/Ui_OutputEditorText.hh:158 msgid "Find next" msgstr "寻找下一个" #: ../gtk/data/editor_text.ui.h:33 ../qt/src/Ui_OutputEditorText.hh:182 msgid "Match case" msgstr "尺寸写å»åˆ" #: ../gtk/data/gimagereader.ui.h:1 ../qt/src/Ui_MainWindow.hh:65 msgid "Rotate current page" msgstr "旋转现有文字" #: ../gtk/data/gimagereader.ui.h:2 ../qt/src/Ui_MainWindow.hh:66 msgid "Rotate all pages" msgstr "旋转所有页é¢" #: ../gtk/data/gimagereader.ui.h:3 ../qt/data/MainWindow.ui.h:35 msgid "Toggle output pane" msgstr "切æ¢è¾“å‡ºé¢æ¿" #. Sources toolbar #: ../gtk/data/gimagereader.ui.h:4 ../qt/src/Ui_MainWindow.hh:187 msgid "Recent" msgstr "最近" #: ../gtk/data/gimagereader.ui.h:5 ../qt/src/Ui_MainWindow.hh:188 msgid "Paste" msgstr "贴上" #: ../gtk/data/gimagereader.ui.h:6 ../qt/src/Ui_MainWindow.hh:189 msgid "Take Screenshot" msgstr "ç”»é¢æˆªå›¾" #: ../gtk/data/gimagereader.ui.h:7 ../qt/src/Ui_MainWindow.hh:200 msgid "Add images" msgstr "新增图åƒ" #: ../gtk/data/gimagereader.ui.h:8 ../qt/src/Ui_MainWindow.hh:199 msgid "Add Images" msgstr "新增图åƒ" #: ../gtk/data/gimagereader.ui.h:9 ../qt/src/Ui_MainWindow.hh:205 msgid "Remove image from list" msgstr "从清å•删除图åƒ" #: ../gtk/data/gimagereader.ui.h:10 ../qt/src/Ui_MainWindow.hh:208 msgid "Delete image" msgstr "删除图åƒ" #: ../gtk/data/gimagereader.ui.h:11 ../qt/src/Ui_MainWindow.hh:211 msgid "Clear list" msgstr "清除清å•" #: ../gtk/data/gimagereader.ui.h:12 ../qt/data/MainWindow.ui.h:6 msgid "Files" msgstr "文件" #: ../gtk/data/gimagereader.ui.h:13 ../qt/data/MainWindow.ui.h:16 msgid "Device:" msgstr "设备:" #: ../gtk/data/gimagereader.ui.h:14 ../qt/data/MainWindow.ui.h:15 #: ../qt/src/TessdataManager.cc:57 msgid "Refresh" msgstr "æ›´æ–°" #: ../gtk/data/gimagereader.ui.h:15 ../qt/data/MainWindow.ui.h:12 msgid "Output:" msgstr "输出:" #: ../gtk/data/gimagereader.ui.h:16 ../qt/data/MainWindow.ui.h:9 msgid "Mode:" msgstr "模å¼ï¼š" #: ../gtk/data/gimagereader.ui.h:17 ../gtk/src/OutputEditorHOCR.cc:362 #: ../qt/data/MainWindow.ui.h:11 ../qt/src/OutputEditorHOCR.cc:273 msgid "Color" msgstr "彩色" #: ../gtk/data/gimagereader.ui.h:18 ../gtk/src/OutputEditorHOCR.cc:365 #: ../qt/data/MainWindow.ui.h:10 ../qt/src/OutputEditorHOCR.cc:275 #: ../qt/src/OutputEditorHOCR.cc:277 msgid "Grayscale" msgstr "ç°åº¦" #: ../gtk/data/gimagereader.ui.h:19 ../qt/data/MainWindow.ui.h:8 msgid "Resolution:" msgstr "è§£åƒåº¦ï¼š" #: ../gtk/data/gimagereader.ui.h:20 ../qt/data/MainWindow.ui.h:13 msgid "Scan" msgstr "扫æ" #: ../gtk/data/gimagereader.ui.h:21 ../qt/data/MainWindow.ui.h:7 msgid "Acquire" msgstr "æ•获" #: ../gtk/data/gimagereader.ui.h:22 ../qt/data/MainWindow.ui.h:2 msgid "Brightness" msgstr "亮度" #: ../gtk/data/gimagereader.ui.h:23 ../qt/data/MainWindow.ui.h:3 msgid "Contrast" msgstr "对比" #: ../gtk/data/gimagereader.ui.h:24 ../qt/data/MainWindow.ui.h:4 msgid "Resolution" msgstr "è§£åƒåº¦" #: ../gtk/data/gimagereader.ui.h:25 ../qt/data/MainWindow.ui.h:5 msgid "Invert colors" msgstr "倒置色版" #: ../gtk/data/gimagereader.ui.h:26 ../qt/data/MainWindow.ui.h:19 msgid "Zoom in" msgstr "放大" #: ../gtk/data/gimagereader.ui.h:27 ../qt/data/MainWindow.ui.h:21 msgid "Zoom out" msgstr "缩å°" #: ../gtk/data/gimagereader.ui.h:28 ../qt/data/MainWindow.ui.h:23 msgid "Normal size" msgstr "正常尺寸" #: ../gtk/data/gimagereader.ui.h:29 ../qt/data/MainWindow.ui.h:25 msgid "Best fit" msgstr "最佳尺寸" #: ../gtk/data/gimagereader.ui.h:30 ../qt/src/Ui_MainWindow.hh:74 msgid "Select rotation mode" msgstr "选择旋转模å¼" #: ../gtk/data/gimagereader.ui.h:32 ../qt/data/MainWindow.ui.h:31 msgid "Image controls" msgstr "å›¾åƒæŽ§åˆ¶" #: ../gtk/data/gimagereader.ui.h:33 ../qt/src/Ui_MainWindow.hh:137 msgid "Plain text" msgstr "纯文本" #: ../gtk/data/gimagereader.ui.h:34 ../qt/src/Ui_MainWindow.hh:137 msgid "hOCR, PDF" msgstr "hOCRã€PDF" #: ../gtk/data/gimagereader.ui.h:35 ../qt/data/MainWindow.ui.h:33 msgid "Autodetect layout" msgstr "自动检测布局" #: ../gtk/data/gimagereader.ui.h:36 msgid "Recognize all" msgstr "辨认全部" #: ../gtk/data/gimagereader.ui.h:37 msgid "Select language" msgstr "选择语言" #: ../gtk/data/gimagereader.ui.h:38 msgid "A graphical frontend to tesseract-ocr" msgstr "tesseract-ocr 的图åƒç•Œé¢" #: ../gtk/data/gimagereader.ui.h:42 msgid "Output pane orientation:" msgstr "è¾“å‡ºé¢æ¿çš„æ–¹å‘:" #: ../gtk/data/gimagereader.ui.h:43 msgid "Horizontal" msgstr "横å‘" #: ../gtk/data/gimagereader.ui.h:44 msgid "Vertical" msgstr "纵å‘" #: ../gtk/data/gimagereader.ui.h:45 ../qt/data/ConfigDialog.ui.h:18 msgid "Query to install missing spellcheck dictionaries" msgstr "æŸ¥æ‰¾é—æ¼å®‰è£…的拼写è¯å…¸" #: ../gtk/data/gimagereader.ui.h:46 ../qt/data/ConfigDialog.ui.h:4 msgid "Automatically check for new program versions" msgstr "自动检查新版本" #: ../gtk/data/gimagereader.ui.h:47 ../qt/data/ConfigDialog.ui.h:3 msgid "Predefined language definitions:" msgstr "缺çœè¯­è¨€å®šä¹‰ï¼š" #: ../gtk/data/gimagereader.ui.h:48 ../qt/data/ConfigDialog.ui.h:12 msgid "Additional language definitions:" msgstr "é¢å¤–语言定义:" #: ../gtk/data/gimagereader.ui.h:49 ../qt/data/ConfigDialog.ui.h:20 msgid "The prefix of the tesseract language data file" msgstr "tesseract è¯­è¨€æ•°æ®æ¡£çš„å‰ç¼€" #: ../gtk/data/gimagereader.ui.h:50 ../qt/data/ConfigDialog.ui.h:21 msgid "Prefix" msgstr "å‰ç¼€" #: ../gtk/data/gimagereader.ui.h:51 ../qt/data/ConfigDialog.ui.h:22 msgid "The ISO 639-1 language code followed by the country code" msgstr "ISO 639-1 语言代ç å¹¶å›½å®¶ä»£ç " #: ../gtk/data/gimagereader.ui.h:52 ../qt/data/ConfigDialog.ui.h:23 msgid "ISO Code" msgstr "ISO 代ç " #: ../gtk/data/gimagereader.ui.h:53 ../qt/data/ConfigDialog.ui.h:24 msgid "The name of the language" msgstr "语言åç§°" #: ../gtk/data/gimagereader.ui.h:54 ../qt/data/ConfigDialog.ui.h:25 msgid "Name" msgstr "åç§°" #: ../gtk/data/gimagereader.ui.h:56 ../qt/data/ConfigDialog.ui.h:5 msgid "Output pane font:" msgstr "è¾“å‡ºé¢æ¿å­—体:" #: ../gtk/data/gimagereader.ui.h:57 ../qt/data/ConfigDialog.ui.h:2 msgid "Default" msgstr "缺çœå€¼" #: ../gtk/data/gimagereader.ui.h:58 ../qt/data/ConfigDialog.ui.h:6 msgid "Language data locations:" msgstr "语言数æ®ä½ç½®ï¼š" #: ../gtk/data/gimagereader.ui.h:59 ../qt/data/ConfigDialog.ui.h:13 msgid "Language definitions path:" msgstr "语言定义路径:" #: ../gtk/data/gimagereader.ui.h:60 ../qt/data/ConfigDialog.ui.h:28 msgid "Spelling dictionaries path:" msgstr "拼写è¯å…¸è·¯å¾„:" #: ../gtk/data/gimagereader.ui.h:61 ../qt/data/ConfigDialog.ui.h:10 msgid "System-wide paths" msgstr "系统路径" #: ../gtk/data/gimagereader.ui.h:62 ../qt/data/ConfigDialog.ui.h:11 msgid "User paths" msgstr "用户路径" #: ../gtk/data/gimagereader.ui.h:63 ../qt/data/PageRangeDialog.ui.h:1 msgid "Page Range" msgstr "页é¢èŒƒå›´" #: ../gtk/data/gimagereader.ui.h:64 ../qt/data/PageRangeDialog.ui.h:2 msgid "Page range:" msgstr "页é¢èŒƒå›´ï¼š" #: ../gtk/data/gimagereader.ui.h:65 ../qt/data/PageRangeDialog.ui.h:3 msgid "Example: 1-10, 13, 14-18" msgstr "例如: 1-10, 13, 14-18" #: ../gtk/data/gimagereader.ui.h:66 ../qt/data/PageRangeDialog.ui.h:4 msgid "Recognition area:" msgstr "辨认本地:" #: ../gtk/data/gimagereader.ui.h:67 ../gtk/src/Recognizer.cc:403 #: ../qt/data/PageRangeDialog.ui.h:5 ../qt/src/Recognizer.cc:381 msgid "Entire page" msgstr "整页" #: ../gtk/data/gimagereader.ui.h:68 ../qt/data/PageRangeDialog.ui.h:6 msgid "Autodetect" msgstr "自动检测" #: ../gtk/data/gimagereader.ui.h:69 ../qt/data/PageRangeDialog.ui.h:7 #, fuzzy msgid "Prepend to output text:" msgstr "附加到现有文字" #: ../gtk/data/gimagereader.ui.h:70 ../qt/data/PageRangeDialog.ui.h:8 msgid "Source filename" msgstr "" #: ../gtk/data/gimagereader.ui.h:71 ../qt/data/PageRangeDialog.ui.h:9 #, fuzzy msgid "Source page" msgstr "æ¥æº" #: ../gtk/data/gimagereader.ui.h:72 ../qt/src/TessdataManager.cc:47 msgid "Tessdata Manager" msgstr "Tessdata 管ç†å‘˜" #: ../gtk/data/gimagereader.ui.h:75 ../qt/src/TessdataManager.cc:49 msgid "Manage installed languages:" msgstr "管ç†å·²å®‰è£…的语言:" #: ../gtk/data/gimagereader.ui.h:76 ../qt/src/DisplayerToolSelect.cc:240 msgid "Delete" msgstr "删除" #: ../gtk/data/gimagereader.ui.h:77 ../qt/src/DisplayerToolSelect.cc:226 msgid "Order:" msgstr "排åºï¼š" #: ../gtk/data/gimagereader.ui.h:78 ../gtk/src/DisplayerToolHOCR.cc:28 #: ../qt/src/DisplayerToolHOCR.cc:30 ../qt/src/DisplayerToolSelect.cc:241 msgid "Recognize" msgstr "辨认" #: ../gtk/data/gimagereader.ui.h:79 ../qt/src/DisplayerToolSelect.cc:242 msgid "Recognize to clipboard" msgstr "辨认至剪贴æ¿" #: ../gtk/data/gimagereader.ui.h:80 ../qt/src/DisplayerToolSelect.cc:243 msgid "Save as image" msgstr "存储为图åƒ" #: ../gtk/data/gimagereader.ui.h:81 ../qt/src/Recognizer.cc:76 msgid "Current Page" msgstr "现时页é¢" #: ../gtk/data/gimagereader.ui.h:82 ../qt/src/Recognizer.cc:79 msgid "Multiple Pages..." msgstr "多页……" #: ../gtk/src/Acquirer.cc:83 ../qt/src/Acquirer.cc:63 msgid "scan.png" msgstr "" #: ../gtk/src/Acquirer.cc:96 ../qt/src/Acquirer.cc:80 msgid "Images" msgstr "图åƒ" #: ../gtk/src/Acquirer.cc:97 ../qt/src/Acquirer.cc:81 msgid "Choose Output Filename..." msgstr "选择输出文件å……" #: ../gtk/src/Acquirer.cc:112 ../qt/src/Acquirer.cc:96 msgid "Failed to initialize the scanning backend." msgstr "ä¸èƒ½åˆå§‹åŒ–æ‰«ææœåŠ¡ã€‚" #: ../gtk/src/Acquirer.cc:121 ../qt/src/Acquirer.cc:102 msgid "Scan failed" msgstr "ä¸èƒ½æ‘ºæ‰«æ" #: ../gtk/src/Acquirer.cc:139 ../qt/src/Acquirer.cc:118 msgid "No scanners were detected." msgstr "检测ä¸åˆ°æ‰«æå™¨ã€‚" #: ../gtk/src/Acquirer.cc:156 ../gtk/src/Acquirer.cc:173 #: ../qt/src/Acquirer.cc:132 ../qt/src/Acquirer.cc:149 msgid "Starting scan..." msgstr "开始扫æâ€¦â€¦" #: ../gtk/src/Acquirer.cc:169 ../qt/src/Acquirer.cc:145 msgid "Opening device..." msgstr "打开设备……" #: ../gtk/src/Acquirer.cc:171 ../qt/src/Acquirer.cc:147 msgid "Setting options..." msgstr "设置选项……" #: ../gtk/src/Acquirer.cc:175 ../qt/src/Acquirer.cc:151 msgid "Getting parameters..." msgstr "获å–傿•°â€¦â€¦" #: ../gtk/src/Acquirer.cc:177 ../qt/src/Acquirer.cc:153 msgid "Transferring data..." msgstr "转输数æ®â€¦â€¦" #: ../gtk/src/Acquirer.cc:184 ../qt/src/Acquirer.cc:160 msgid "Canceling scan..." msgstr "å–æ¶ˆæ‰«æâ€¦â€¦" #: ../gtk/src/Config.cc:297 ../qt/data/ConfigDialog.ui.h:7 msgid "Filename prefix" msgstr "文件åå‰ç¼€" #: ../gtk/src/Config.cc:298 ../qt/data/ConfigDialog.ui.h:8 msgid "Code" msgstr "代ç " #: ../gtk/src/Config.cc:299 ../qt/data/ConfigDialog.ui.h:9 msgid "Native name" msgstr "原生åç§°" #: ../gtk/src/CrashHandler.cc:26 ../gtk/src/CrashHandler.cc:43 #: ../qt/src/CrashHandler.cc:34 msgid "Crash Handler" msgstr "异常终止处ç†å™¨" #: ../gtk/src/CrashHandler.cc:45 ../qt/src/CrashHandler.cc:29 msgid "Your work has been saved under %1." msgstr "你的工作已存储于 %1。" #: ../gtk/src/CrashHandler.cc:47 ../qt/src/CrashHandler.cc:31 msgid "There was no unsaved work." msgstr "没有未存储的工作。" #: ../gtk/src/CrashHandler.cc:106 ../qt/src/CrashHandler.cc:60 msgid "Failed to obtain backtrace. Is gdb installed?" msgstr "ä¸èƒ½å–å¾— backtrace。已安装 gdb å—?" #: ../gtk/src/Displayer.cc:261 ../qt/src/Displayer.cc:231 msgid "Failed to load image" msgstr "ä¸èƒ½è£…入图åƒ" #: ../gtk/src/Displayer.cc:261 ../qt/src/Displayer.cc:231 msgid "" "The file might not be an image or be corrupt:\n" "%1" msgstr "" "该文件å¯èƒ½ä¸æ˜¯å›¾åƒæˆ–已被æŸå:\n" "%1" #: ../gtk/src/DisplayerToolSelect.cc:39 ../qt/src/DisplayerToolSelect.cc:40 msgid "selection.png" msgstr "" #: ../gtk/src/DisplayerToolSelect.cc:148 ../qt/src/DisplayerToolSelect.cc:139 msgid "PNG Images" msgstr "PNG 图åƒ" #: ../gtk/src/DisplayerToolSelect.cc:149 ../qt/src/DisplayerToolSelect.cc:139 msgid "Save Selection Image" msgstr "存储选择图åƒ" #: ../gtk/src/DisplayerToolSelect.cc:157 ../qt/src/DisplayerToolSelect.cc:147 msgid "Recognize all" msgstr "辨认全部" #: ../gtk/src/DisplayerToolSelect.cc:157 ../qt/src/DisplayerToolSelect.cc:147 msgid "Recognize selection" msgstr "辨认选择区" #: ../gtk/src/DisplayerToolSelect.cc:194 ../qt/src/DisplayerToolSelect.cc:184 msgid "Performing layout analysis" msgstr "进行布局分æž" #: ../gtk/src/FileDialogs.cc:237 msgid "" "A file named \"%1\" already exists. Are you sure you want to overwrite it?" msgstr "å为 \"%1\" 的文件已存在。你确定è¦è¦†ç›–它?" #: ../gtk/src/FileDialogs.cc:239 msgid "Overwrite File?" msgstr "覆盖文件?" #: ../gtk/src/MainWindow.cc:125 ../qt/src/MainWindow.cc:274 msgid "Using tesseract" msgstr "采用 tesseract" #: ../gtk/src/MainWindow.cc:191 ../qt/src/MainWindow.cc:181 msgid "Select an image to begin..." msgstr "请选择图åƒä½œä¸ºå¼€å§‹â€¦â€¦" #: ../gtk/src/MainWindow.cc:306 ../qt/src/MainWindow.cc:262 msgid "Multiple sources" msgstr "å¤šä¸ªæ¥æº" #: ../gtk/src/MainWindow.cc:307 ../qt/src/MainWindow.cc:263 msgid "Ready" msgstr "就绪" #: ../gtk/src/MainWindow.cc:446 ../qt/src/MainWindow.cc:390 msgid "New version" msgstr "新版本" #: ../gtk/src/MainWindow.cc:446 ../qt/src/MainWindow.cc:390 msgid "gImageReader %1 is available" msgstr "gImageReader %1 å·²é¢ä¸–" #: ../gtk/src/MainWindow.cc:447 ../qt/src/MainWindow.cc:391 msgid "Download" msgstr "下载" #: ../gtk/src/MainWindow.cc:448 ../qt/src/MainWindow.cc:392 msgid "Changelog" msgstr "修改日志" #: ../gtk/src/MainWindow.cc:449 ../qt/src/MainWindow.cc:393 msgid "Don't notify again" msgstr "ä¸å†æç¤º" #: ../gtk/src/MainWindow.cc:468 ../qt/src/MainWindow.cc:438 msgid "Don't show again" msgstr "ä¸å†æ˜¾ç¤º" #: ../gtk/src/MainWindow.cc:469 ../gtk/src/MainWindow.cc:482 #: ../qt/src/MainWindow.cc:439 msgid "Install" msgstr "安装" #: ../gtk/src/MainWindow.cc:489 ../qt/src/MainWindow.cc:451 msgid "Spelling dictionary missing" msgstr "é—æ¼æ‹¼å†™è¯å…¸" #: ../gtk/src/MainWindow.cc:489 ../qt/src/MainWindow.cc:451 msgid "The spellcheck dictionary for %1 is not installed" msgstr "未安装 %1 的拼写è¯å…¸" #: ../gtk/src/MainWindow.cc:496 ../gtk/src/MainWindow.cc:528 #: ../qt/src/MainWindow.cc:458 msgid "Installing spelling dictionary for '%1'" msgstr "正在安装 '%1' 的拼写è¯å…¸" #: ../gtk/src/MainWindow.cc:517 ../gtk/src/MainWindow.cc:542 #: ../gtk/src/MainWindow.cc:550 ../gtk/src/MainWindow.cc:560 #: ../gtk/src/MainWindow.cc:566 ../gtk/src/MainWindow.cc:595 #: ../gtk/src/OutputEditorHOCR.cc:1375 ../gtk/src/Recognizer.cc:163 #: ../gtk/src/TessdataManager.cc:58 ../gtk/src/TessdataManager.cc:68 #: ../gtk/src/TessdataManager.cc:290 ../qt/src/MainWindow.cc:477 #: ../qt/src/MainWindow.cc:490 ../qt/src/MainWindow.cc:500 #: ../qt/src/MainWindow.cc:510 ../qt/src/MainWindow.cc:518 #: ../qt/src/MainWindow.cc:546 ../qt/src/OutputEditorHOCR.cc:1157 #: ../qt/src/Recognizer.cc:138 ../qt/src/TessdataManager.cc:72 #: ../qt/src/TessdataManager.cc:82 ../qt/src/TessdataManager.cc:275 msgid "Error" msgstr "错误" #: ../gtk/src/MainWindow.cc:517 ../qt/src/MainWindow.cc:477 msgid "Failed to install spelling dictionary: %1" msgstr "ä¸èƒ½å®‰è£…拼写è¯å…¸ï¼š%1" #: ../gtk/src/MainWindow.cc:542 ../qt/src/MainWindow.cc:490 msgid "Failed to create directory for spelling dictionaries." msgstr "ä¸èƒ½åˆ›å»ºæ‹¼å†™è¯å…¸ç›®å½•。" #: ../gtk/src/MainWindow.cc:550 ../gtk/src/MainWindow.cc:566 #: ../qt/src/MainWindow.cc:500 msgid "Could not read %1: %2." msgstr "ä¸èƒ½è¯»å…¥ %1:%2。" #: ../gtk/src/MainWindow.cc:560 ../gtk/src/MainWindow.cc:595 #: ../qt/src/MainWindow.cc:510 ../qt/src/MainWindow.cc:546 msgid "No spelling dictionaries found for '%1'." msgstr "找ä¸åˆ° '%1' 的拼写è¯å…¸ã€‚" #: ../gtk/src/MainWindow.cc:576 ../qt/src/MainWindow.cc:529 msgid "Downloading '%1'..." msgstr "正在下载 '%1'……" #: ../gtk/src/MainWindow.cc:592 ../qt/src/MainWindow.cc:543 msgid "Dictionaries installed" msgstr "已安装è¯å…¸" #: ../gtk/src/MainWindow.cc:592 msgid "The following dictionaries were installed:%1" msgstr "已安装下列è¯å…¸ï¼š%1" #: ../gtk/src/OutputEditorHOCR.cc:319 ../qt/src/OutputEditorHOCR.cc:291 msgid "Document" msgstr "文件" #: ../gtk/src/OutputEditorHOCR.cc:368 ../qt/src/OutputEditorHOCR.cc:279 msgid "Monochrome" msgstr "黑白" #: ../gtk/src/OutputEditorHOCR.cc:377 ../qt/src/OutputEditorHOCR.cc:281 msgid "Threshold (closest color)" msgstr "定é™ï¼ˆæœ€æŽ¥è¿‘颜色)" #: ../gtk/src/OutputEditorHOCR.cc:380 ../qt/src/OutputEditorHOCR.cc:282 msgid "Diffuse" msgstr "扩散" #: ../gtk/src/OutputEditorHOCR.cc:389 ../qt/src/OutputEditorHOCR.cc:283 msgid "Zip (lossless)" msgstr "Zip(无æŸï¼‰" #: ../gtk/src/OutputEditorHOCR.cc:393 ../qt/src/OutputEditorHOCR.cc:284 msgid "CCITT Group 4 (lossless)" msgstr "CCITT 第 4 组(无æŸï¼‰" #: ../gtk/src/OutputEditorHOCR.cc:397 ../qt/src/OutputEditorHOCR.cc:285 msgid "Jpeg (lossy)" msgstr "Jpeg(失真)" #: ../gtk/src/OutputEditorHOCR.cc:553 ../qt/src/OutputEditorHOCR.cc:429 msgid "" "The following pages could not be processed:\n" "%1" msgstr "" "ä¸èƒ½å¤„ç†ä¸‹åˆ—页é¢ï¼š\n" "%1" #: ../gtk/src/OutputEditorHOCR.cc:554 ../qt/src/OutputEditorHOCR.cc:430 msgid "Recognition errors" msgstr "辨认时出现错误" #. Add tree item #: ../gtk/src/OutputEditorHOCR.cc:647 ../gtk/src/OutputEditorHOCR.cc:1037 #: ../qt/src/OutputEditorHOCR.cc:504 ../qt/src/OutputEditorHOCR.cc:894 msgid "Graphic" msgstr "图åƒ" #: ../gtk/src/OutputEditorHOCR.cc:703 ../qt/src/OutputEditorHOCR.cc:563 msgid "Paragraph" msgstr "段è½" #: ../gtk/src/OutputEditorHOCR.cc:706 ../qt/src/OutputEditorHOCR.cc:566 msgid "Textline" msgstr "文字" #: ../gtk/src/OutputEditorHOCR.cc:1136 ../qt/src/OutputEditorHOCR.cc:950 msgid "Merge" msgstr "åˆå¹¶" #: ../gtk/src/OutputEditorHOCR.cc:1161 ../qt/src/OutputEditorHOCR.cc:977 msgid "Add graphic region" msgstr "æ–°å¢žå›¾åƒæœ¬åœ°" #: ../gtk/src/OutputEditorHOCR.cc:1177 ../qt/src/OutputEditorHOCR.cc:985 msgid "No suggestions" msgstr "没有推è" #: ../gtk/src/OutputEditorHOCR.cc:1183 ../qt/src/OutputEditorHOCR.cc:989 msgid "Add to dictionary" msgstr "新增è¯å…¸" #: ../gtk/src/OutputEditorHOCR.cc:1189 ../qt/src/OutputEditorHOCR.cc:990 msgid "Ignore word" msgstr "忽略字è¯" #: ../gtk/src/OutputEditorHOCR.cc:1222 ../qt/src/OutputEditorHOCR.cc:1007 msgid "Expand all" msgstr "递归展开" #: ../gtk/src/OutputEditorHOCR.cc:1225 ../qt/src/OutputEditorHOCR.cc:1008 msgid "Collapse all" msgstr "递归折å " #: ../gtk/src/OutputEditorHOCR.cc:1248 ../gtk/src/OutputEditorHOCR.cc:1287 #: ../qt/src/OutputEditorHOCR.cc:1049 ../qt/src/OutputEditorHOCR.cc:1079 msgid "hOCR HTML Files" msgstr "hOCR HTML æ¡£" #: ../gtk/src/OutputEditorHOCR.cc:1249 ../qt/src/OutputEditorHOCR.cc:1049 msgid "Open hOCR File" msgstr "打开 hOCR æ¡£" #: ../gtk/src/OutputEditorHOCR.cc:1258 ../qt/src/OutputEditorHOCR.cc:1055 msgid "Failed to open file" msgstr "ä¸èƒ½æ‰“开文件" #: ../gtk/src/OutputEditorHOCR.cc:1258 ../qt/src/OutputEditorHOCR.cc:1055 msgid "The file could not be opened: %1." msgstr "ä¸èƒ½æ‰“开文件:%1。" #: ../gtk/src/OutputEditorHOCR.cc:1267 ../qt/src/OutputEditorHOCR.cc:1062 msgid "Invalid hOCR file" msgstr "无效的 hOCR æ¡£" #: ../gtk/src/OutputEditorHOCR.cc:1267 ../qt/src/OutputEditorHOCR.cc:1062 msgid "The file does not appear to contain valid hOCR HTML: %1" msgstr "此文件似乎并ä¸åŒ…嫿œ‰æ•ˆçš„ hOCR HTML:%1" #: ../gtk/src/OutputEditorHOCR.cc:1283 ../gtk/src/OutputEditorHOCR.cc:1343 #: ../gtk/src/OutputEditorText.cc:306 ../qt/src/OutputEditorHOCR.cc:1077 #: ../qt/src/OutputEditorHOCR.cc:1131 ../qt/src/OutputEditorText.cc:246 msgid "output" msgstr "输出" #: ../gtk/src/OutputEditorHOCR.cc:1288 ../qt/src/OutputEditorHOCR.cc:1079 msgid "Save hOCR Output..." msgstr "存储 hOCR 输出……" #: ../gtk/src/OutputEditorHOCR.cc:1296 ../gtk/src/OutputEditorHOCR.cc:1357 #: ../gtk/src/OutputEditorText.cc:319 ../qt/src/OutputEditorHOCR.cc:1087 #: ../qt/src/OutputEditorHOCR.cc:1143 ../qt/src/OutputEditorText.cc:256 msgid "Failed to save output" msgstr "ä¸èƒ½å­˜å‚¨è¾“出……" #: ../gtk/src/OutputEditorHOCR.cc:1296 ../gtk/src/OutputEditorHOCR.cc:1357 #: ../gtk/src/OutputEditorText.cc:319 ../qt/src/OutputEditorHOCR.cc:1087 #: ../qt/src/OutputEditorHOCR.cc:1143 ../qt/src/OutputEditorText.cc:256 msgid "Check that you have writing permissions in the selected folder." msgstr "请检查你在所选择数æ®å¤¹æ‹¥æœ‰å†™å…¥æƒé™ã€‚" #: ../gtk/src/OutputEditorHOCR.cc:1346 ../qt/src/OutputEditorHOCR.cc:1133 msgid "PDF Files" msgstr "PDF æ¡£" #: ../gtk/src/OutputEditorHOCR.cc:1347 ../qt/src/OutputEditorHOCR.cc:1133 msgid "Save PDF Output..." msgstr "存储 PDF 输出……" #: ../gtk/src/OutputEditorHOCR.cc:1375 ../qt/src/OutputEditorHOCR.cc:1157 msgid "The PDF library does not support the selected font." msgstr "PDF åº“ä¸æ”¯æŒæ‰€é€‰æ‹©å­—体。" #: ../gtk/src/OutputEditorHOCR.cc:1435 ../qt/src/OutputEditorHOCR.cc:1216 msgid "Errors occurred" msgstr "å‘生错误" #: ../gtk/src/OutputEditorHOCR.cc:1435 ../qt/src/OutputEditorHOCR.cc:1216 msgid "" "The following pages could not be rendered:\n" "%1" msgstr "" "ä¸èƒ½ç»˜ç”»ä¸‹åˆ—页é¢ï¼š\n" "%1" #: ../gtk/src/OutputEditorHOCR.cc:1562 ../gtk/src/OutputEditorText.cc:333 #: ../qt/src/OutputEditorHOCR.cc:1331 ../qt/src/OutputEditorText.cc:269 msgid "Output not saved" msgstr "未存储输出" #: ../gtk/src/OutputEditorHOCR.cc:1562 ../gtk/src/OutputEditorText.cc:333 #: ../qt/src/OutputEditorHOCR.cc:1331 ../qt/src/OutputEditorText.cc:269 msgid "Save output before proceeding?" msgstr "先存储输出å†ç»§ç»­ï¼Ÿ" #: ../gtk/src/OutputEditorText.cc:197 ../qt/src/OutputEditorText.cc:158 msgid "Stripping line breaks..." msgstr "去除æ¢è¡Œç¬¦å·â€¦â€¦" #: ../gtk/src/OutputEditorText.cc:211 msgid "Check spelling" msgstr "检查拼写" #: ../gtk/src/OutputEditorText.cc:238 ../qt/src/OutputEditorText.cc:178 msgid "Replacing..." msgstr "å–代中……" #: ../gtk/src/OutputEditorText.cc:264 ../qt/src/OutputEditorText.cc:204 #, fuzzy msgid "File: %1" msgstr "文件" #: ../gtk/src/OutputEditorText.cc:267 ../qt/src/OutputEditorText.cc:207 #, fuzzy msgid "Page: %1" msgstr "分æžé”™è¯¯ï¼š%1" #: ../gtk/src/OutputEditorText.cc:280 ../gtk/src/Recognizer.cc:481 #: ../qt/src/Recognizer.cc:460 msgid "" "\n" "[Failed to recognize page %1]\n" msgstr "" "\n" "[ä¸èƒ½è¾¨è®¤ç¬¬ %1 页]\n" #: ../gtk/src/OutputEditorText.cc:310 ../qt/src/OutputEditorText.cc:248 msgid "Text Files" msgstr "文本" #: ../gtk/src/OutputEditorText.cc:311 ../qt/src/OutputEditorText.cc:248 msgid "Save Output..." msgstr "存储输出……" #: ../gtk/src/Recognizer.cc:156 ../qt/src/Recognizer.cc:131 msgid "" "Tesseract crashed with the following message:\n" "\n" "%1\n" "\n" "This typically happens for one of the following reasons:\n" "- Outdated traineddata files are used.\n" "- Auxiliary language data files are missing.\n" "- Corrupt language data files.\n" "\n" "Make sure your language data files are valid and compatible with tesseract " "%2." msgstr "" "Tesseract 已异常终止åŠå‘出以下消æ¯ï¼š\n" "\n" "%1\n" "\n" "出现这个情况一般有下列原因:\n" "- 采用旧版的 traineddata 档。\n" "- é—æ¼è¾…åŠ©è¯­è¨€æ•°æ®æ¡£ã€‚\n" "- è¯­è¨€æ•°æ®æ¡£å·²æ¯å。\n" "\n" "请确ä¿ä½ çš„è¯­è¨€æ•°æ®æ¡£æ˜¯æ­£ç¡®çš„åŠå…¼å®¹ tesseract %2 。" #: ../gtk/src/Recognizer.cc:212 ../qt/src/Recognizer.cc:191 msgid "No languages available" msgstr "没有å¯ç”¨è¯­è¨€" #: ../gtk/src/Recognizer.cc:212 ../qt/src/Recognizer.cc:191 msgid "" "No tesseract languages are available for use. Recognition will not work." msgstr "没有å¯ç”¨çš„ tesseract 语言。辨认将会失败。" #: ../gtk/src/Recognizer.cc:266 ../qt/src/Recognizer.cc:251 msgid "Multilingual" msgstr "多语言" #: ../gtk/src/Recognizer.cc:318 ../qt/src/Recognizer.cc:295 msgid "Automatic page segmentation" msgstr "自动分割页é¢" #: ../gtk/src/Recognizer.cc:319 ../qt/src/Recognizer.cc:296 msgid "Page segmentation with orientation and script detection" msgstr "分割页é¢å¹¶æ£€æµ‹æ–¹å‘åŠæ–‡å­—" #: ../gtk/src/Recognizer.cc:320 ../qt/src/Recognizer.cc:297 msgid "Assume single column of text" msgstr "å‡è®¾åªæœ‰ä¸€æ æ–‡å­—" #: ../gtk/src/Recognizer.cc:321 ../qt/src/Recognizer.cc:298 msgid "Assume single block of vertically aligned text" msgstr "å‡è®¾åªæœ‰ä¸€æ®µçºµå‘对整的文字" #: ../gtk/src/Recognizer.cc:322 ../qt/src/Recognizer.cc:299 msgid "Assume a single uniform block of text" msgstr "å‡è®¾åªæœ‰ä¸€æ®µå‡åŒ€çš„æ–‡å­—" #: ../gtk/src/Recognizer.cc:323 ../qt/src/Recognizer.cc:300 msgid "Assume a line of text" msgstr "å‡è®¾åªæœ‰ä¸€è¡Œæ–‡å­—" #: ../gtk/src/Recognizer.cc:324 ../qt/src/Recognizer.cc:301 msgid "Assume a single word" msgstr "å‡è®¾åªæœ‰ä¸€ä¸ªå­—" #: ../gtk/src/Recognizer.cc:325 ../qt/src/Recognizer.cc:302 msgid "Assume a single word in a circle" msgstr "å‡è®¾æ˜¯åœ†åœˆå†…的一个字" #: ../gtk/src/Recognizer.cc:326 ../qt/src/Recognizer.cc:303 msgid "Sparse text in no particular order" msgstr "没有特定次åºçš„ç¨€ç–æ–‡å­—" #: ../gtk/src/Recognizer.cc:327 ../qt/src/Recognizer.cc:304 msgid "Sparse text with orientation and script detection" msgstr "æ£€æµ‹ç¨€ç–æ–‡å­—的方å‘åŠæ–‡å­—" #: ../gtk/src/Recognizer.cc:341 ../qt/src/Recognizer.cc:314 msgid "Page segmentation mode" msgstr "åˆ†å‰²é¡µé¢æ¨¡å¼" #: ../gtk/src/Recognizer.cc:347 ../qt/src/Recognizer.cc:321 msgid "Manage languages..." msgstr "管ç†è¯­è¨€â€¦â€¦" #: ../gtk/src/Recognizer.cc:403 ../qt/src/Recognizer.cc:381 msgid "Current selection" msgstr "现有选择区" #: ../gtk/src/Recognizer.cc:475 ../qt/src/Recognizer.cc:454 msgid "Recognizing page %1 (%2 of %3)" msgstr "辨认第 %1 页(%3 之 %2)" #: ../gtk/src/Recognizer.cc:480 ../qt/src/Recognizer.cc:459 msgid "" "\n" "- Page %1: failed to render page" msgstr "" "\n" "- 第 %1 页:ä¸èƒ½ç»˜ç”»é¡µé¢" #: ../gtk/src/Recognizer.cc:510 ../gtk/src/Recognizer.cc:539 #: ../gtk/src/Recognizer.cc:552 ../qt/src/Recognizer.cc:488 #: ../qt/src/Recognizer.cc:517 ../qt/src/Recognizer.cc:530 msgid "Recognizing..." msgstr "辨认中……" #: ../gtk/src/Recognizer.cc:514 ../gtk/src/Recognizer.cc:522 #: ../qt/src/Recognizer.cc:492 ../qt/src/Recognizer.cc:500 msgid "Recognition errors occurred" msgstr "辨认时出现错误" #: ../gtk/src/Recognizer.cc:514 ../qt/src/Recognizer.cc:492 msgid "The following errors occurred:%1" msgstr "出现下列错误:%1" #: ../gtk/src/Recognizer.cc:522 ../qt/src/Recognizer.cc:500 msgid "Failed to initialize tesseract" msgstr "ä¸èƒ½åˆå§‹åŒ– tesseract" #: ../gtk/src/scanner/ScannerSane.cc:83 ../gtk/src/scanner/ScannerTwain.cc:287 #: ../qt/src/scanner/ScannerSane.cc:85 ../qt/src/scanner/ScannerTwain.cc:285 msgid "Scan canceled" msgstr "已喿¶ˆæ‰«æ" #: ../gtk/src/scanner/ScannerSane.cc:157 ../gtk/src/scanner/ScannerTwain.cc:186 #: ../qt/src/scanner/ScannerSane.cc:158 ../qt/src/scanner/ScannerTwain.cc:178 msgid "No scanner specified" msgstr "未指定扫æå™¨" #: ../gtk/src/scanner/ScannerSane.cc:166 ../gtk/src/scanner/ScannerTwain.cc:195 #: ../qt/src/scanner/ScannerSane.cc:167 ../qt/src/scanner/ScannerTwain.cc:187 msgid "Unable to connect to scanner" msgstr "ä¸èƒ½è¿žæŽ¥è‡³æ‰«æå™¨" #: ../gtk/src/scanner/ScannerSane.cc:386 ../gtk/src/scanner/ScannerTwain.cc:265 #: ../gtk/src/scanner/ScannerTwain.cc:291 ../qt/src/scanner/ScannerSane.cc:387 #: ../qt/src/scanner/ScannerTwain.cc:257 ../qt/src/scanner/ScannerTwain.cc:289 msgid "Unable to start scan" msgstr "ä¸èƒ½å¼€å§‹æ‰«æ" #: ../gtk/src/scanner/ScannerSane.cc:394 ../gtk/src/scanner/ScannerSane.cc:437 #: ../gtk/src/scanner/ScannerTwain.cc:317 ../qt/src/scanner/ScannerSane.cc:395 #: ../qt/src/scanner/ScannerSane.cc:438 ../qt/src/scanner/ScannerTwain.cc:315 msgid "Error communicating with scanner" msgstr "与扫æå™¨æ²Ÿé€šå‡ºçŽ°é”™è¯¯" #: ../gtk/src/scanner/ScannerSane.cc:498 ../qt/src/scanner/ScannerSane.cc:494 msgid "Failed to save image" msgstr "ä¸èƒ½å­˜å‚¨å›¾åƒ" #: ../gtk/src/SourceManager.cc:118 ../qt/src/SourceManager.cc:112 msgid "Unable to open files" msgstr "ä¸èƒ½æ‰“开文件" #: ../gtk/src/SourceManager.cc:118 ../qt/src/SourceManager.cc:112 msgid "The following files could not be opened:%1" msgstr "ä¸èƒ½æ‰“开下列文件:%1" #: ../gtk/src/SourceManager.cc:134 ../qt/src/SourceManager.cc:154 msgid "Images and PDFs" msgstr "图åƒä¸Ž PDF æ¡£" #: ../gtk/src/SourceManager.cc:137 ../qt/src/SourceManager.cc:155 msgid "Select Files" msgstr "选择文件" #: ../gtk/src/SourceManager.cc:143 ../qt/src/SourceManager.cc:166 msgid "Clipboard Error" msgstr "剪贴æ¿é”™è¯¯" #: ../gtk/src/SourceManager.cc:143 ../qt/src/SourceManager.cc:166 msgid "Failed to read the clipboard." msgstr "ä¸èƒ½è¯»å…¥å‰ªè´´æ¿ã€‚" #: ../gtk/src/SourceManager.cc:147 ../qt/src/SourceManager.cc:170 #: ../qt/src/SourceManager.cc:176 msgid "Pasted %1" msgstr "已贴上 %1" #: ../gtk/src/SourceManager.cc:159 ../qt/src/SourceManager.cc:183 msgid "Screenshot Error" msgstr "ç”»é¢æˆªå›¾é”™è¯¯" #: ../gtk/src/SourceManager.cc:159 ../qt/src/SourceManager.cc:183 msgid "Failed to take screenshot." msgstr "ä¸èƒ½æˆªå–ç”»é¢ã€‚" #: ../gtk/src/SourceManager.cc:163 ../qt/src/SourceManager.cc:187 msgid "Screenshot %1" msgstr "截图 %1" #: ../gtk/src/SourceManager.cc:168 ../qt/src/SourceManager.cc:192 msgid "Saving image..." msgstr "存储图åƒä¸­â€¦â€¦" #: ../gtk/src/SourceManager.cc:175 ../qt/src/SourceManager.cc:205 msgid "Cannot Write File" msgstr "ä¸èƒ½å†™å…¥æ–‡ä»¶" #: ../gtk/src/SourceManager.cc:175 ../qt/src/SourceManager.cc:205 msgid "Could not write to %1." msgstr "ä¸èƒ½å†™è¿› %1。" #: ../gtk/src/SourceManager.cc:202 ../qt/src/SourceManager.cc:227 msgid "Delete File?" msgstr "删除文件?" #: ../gtk/src/SourceManager.cc:202 ../qt/src/SourceManager.cc:227 msgid "The following files will be deleted:%1" msgstr "下列文件将会被删除:%1" #: ../gtk/src/SourceManager.cc:266 ../qt/src/SourceManager.cc:278 msgid "Missing File" msgstr "é—æ¼æ–‡ä»¶" #: ../gtk/src/SourceManager.cc:266 ../qt/src/SourceManager.cc:278 msgid "" "The following file has been deleted or moved:\n" "%1" msgstr "" "下列文件已被删除或删除:\n" "%1" #: ../gtk/src/SubstitutionsManager.cc:39 ../qt/src/SubstitutionsManager.cc:77 msgid "Search for" msgstr "寻找" #: ../gtk/src/SubstitutionsManager.cc:40 ../qt/src/SubstitutionsManager.cc:77 msgid "Replace with" msgstr "å–代" #: ../gtk/src/SubstitutionsManager.cc:62 ../qt/src/SubstitutionsManager.cc:99 msgid "substitution_list.txt" msgstr "" #: ../gtk/src/SubstitutionsManager.cc:84 ../gtk/src/SubstitutionsManager.cc:119 #: ../qt/src/SubstitutionsManager.cc:114 ../qt/src/SubstitutionsManager.cc:152 msgid "Substitutions List" msgstr "æ›¿æ¢æ¸…å•" #: ../gtk/src/SubstitutionsManager.cc:85 ../qt/src/SubstitutionsManager.cc:114 msgid "Open Substitutions List" msgstr "å¼€å§‹æ›¿æ¢æ¸…å•" #: ../gtk/src/SubstitutionsManager.cc:90 ../qt/src/SubstitutionsManager.cc:119 msgid "Error Reading File" msgstr "读案错误" #: ../gtk/src/SubstitutionsManager.cc:90 ../qt/src/SubstitutionsManager.cc:119 msgid "Unable to read '%1'." msgstr "ä¸èƒ½è¯»å…¥ '%1'。" #: ../gtk/src/SubstitutionsManager.cc:113 ../qt/src/SubstitutionsManager.cc:146 msgid "Errors Occurred Reading File" msgstr "读入文件时出现错误" #: ../gtk/src/SubstitutionsManager.cc:113 ../qt/src/SubstitutionsManager.cc:146 msgid "Some entries of the substitutions list could not be read." msgstr "ä¸èƒ½è¯»å…¥æ›¿æ¢æ¸…å•内æŸäº›é¡¹ç›®ã€‚" #: ../gtk/src/SubstitutionsManager.cc:120 ../qt/src/SubstitutionsManager.cc:152 msgid "Save Substitutions List" msgstr "å­˜å‚¨æ›¿æ¢æ¸…å•" #: ../gtk/src/SubstitutionsManager.cc:126 ../qt/src/SubstitutionsManager.cc:158 msgid "Error Saving File" msgstr "存档错误" #: ../gtk/src/SubstitutionsManager.cc:126 ../qt/src/SubstitutionsManager.cc:158 msgid "Unable to write to '%1'." msgstr "ä¸èƒ½å†™è¿› '%1'。" #: ../gtk/src/SubstitutionsManager.cc:144 ../qt/src/SubstitutionsManager.cc:172 msgid "Save List?" msgstr "存储清å•?" #: ../gtk/src/SubstitutionsManager.cc:144 ../qt/src/SubstitutionsManager.cc:172 msgid "Do you want to save the current list?" msgstr "是å¦éœ€è¦å­˜å‚¨çŽ°æœ‰æ¸…å•?" #: ../gtk/src/SubstitutionsManager.cc:179 ../qt/src/SubstitutionsManager.cc:208 msgid "Applying substitutions..." msgstr "正在套用替æ¢å€¼â€¦â€¦" #: ../gtk/src/TessdataManager.cc:58 ../qt/src/TessdataManager.cc:72 msgid "" "PackageKit is required for managing system-wide tesseract language packs, " "but it was not found. Please use the system package management software to " "manage the tesseract language packs, or switch to use the user tessdata path " "in the configuration dialog." msgstr "" "ç®¡ç† tesseract çš„ç³»ç»Ÿè¯­è¨€åŒ…é¡»è¦ PackageKit,但它并ä¸å­˜åœ¨ã€‚请利用系统的组件管" "ç†è½¯ä»¶æ¥ç®¡ç† tesseract 的语言包,或改用设置页é¢å†…çš„ tessdata 用户路径。" #: ../gtk/src/TessdataManager.cc:63 ../qt/src/TessdataManager.cc:77 msgid "Fetching available languages" msgstr "å–å¾—å¯ç”¨è¯­è¨€" #: ../gtk/src/TessdataManager.cc:68 ../gtk/src/TessdataManager.cc:89 #: ../gtk/src/TessdataManager.cc:121 ../qt/src/TessdataManager.cc:82 #: ../qt/src/TessdataManager.cc:94 ../qt/src/TessdataManager.cc:127 msgid "Failed to fetch list of available languages: %1" msgstr "ä¸èƒ½å–å¾—å¯ç”¨è¯­è¨€çš„æ¸…å•:%1" #: ../gtk/src/TessdataManager.cc:100 ../gtk/src/TessdataManager.cc:129 #: ../qt/src/TessdataManager.cc:105 ../qt/src/TessdataManager.cc:114 #: ../qt/src/TessdataManager.cc:136 ../qt/src/TessdataManager.cc:147 msgid "Parsing error: %1" msgstr "分æžé”™è¯¯ï¼š%1" #: ../gtk/src/TessdataManager.cc:191 ../qt/src/TessdataManager.cc:191 msgid "Applying changes..." msgstr "正在套用改动……" #: ../gtk/src/TessdataManager.cc:252 ../qt/src/TessdataManager.cc:237 msgid "Failed to create directory for tessdata files." msgstr "ä¸èƒ½ä¸º tessdata 档创建目录" #: ../gtk/src/TessdataManager.cc:261 ../qt/src/TessdataManager.cc:245 msgid "Downloading %1..." msgstr "正在下载 %1……" #: ../gtk/src/TessdataManager.cc:281 ../qt/src/TessdataManager.cc:267 msgid "" "The following files could not be downloaded or removed:\n" "%1\n" "\n" "Check the connectivity and directory permissions." msgstr "" "ä¸èƒ½ä¸‹è½½æˆ–删除下列文件:\n" "%1\n" "\n" "请检查连接åŠç›®å½•æƒé™ã€‚" #: ../gtk/src/Utils.cc:62 msgid "Yes" msgstr "是" #: ../gtk/src/Utils.cc:65 msgid "No" msgstr "å¦" #: ../gtk/src/Utils.cc:74 msgid "Discard" msgstr "弃置" #: ../qt/data/AboutDialog.ui.h:1 msgid "About gImageReader" msgstr "有关 gImageReader" #: ../qt/data/AboutDialog.ui.h:3 #, fuzzy msgid "" "

 

A graphical frontend to tesseract-ocr

Website

 

" msgstr "" "

 

tesseract-ocr 的图åƒç•Œé¢

网站

 

" #: ../qt/data/AboutDialog.ui.h:4 msgid "Credits" msgstr "归功于" #: ../qt/data/AboutDialog.ui.h:5 msgid "License" msgstr "æ¡æ¬¾" #: ../qt/data/ConfigDialog.ui.h:14 msgid "System encoding" msgstr "系统编ç " #: ../qt/data/ConfigDialog.ui.h:15 msgid "UTF-8" msgstr "" #: ../qt/data/ConfigDialog.ui.h:19 msgid "Text file encoding:" msgstr "文本编ç ï¼š" #: ../qt/data/CrashHandler.ui.h:2 #, fuzzy, no-c-format msgid "" "

The application has " "crashed

Apologies for the inconvenience. To help improve the " "application, please consider reporting the issue to manisandro@gmail.com. Please try to describe what you were doing before the application " "crashed. Also, include the information below. Thank you.

" msgstr "" "我们为带æ¥çš„ä¸ä¾¿è€Œé“æ­‰ã€‚å¦‚ä½ æœ‰æ„æ”¹å–„此程åºï¼Œè¯·è€ƒè™‘将问题汇报给manisandro@gmail.com。请å°è¯•æè¿°ä½ åœ¨ç¨‹åºç»ˆæ­¢å‰æ‰€åšçš„事情。å¦å¤–,请一并" "附上下列数æ®ã€‚谢谢。" #: ../qt/data/MainWindow.ui.h:1 msgid "gImageReader" msgstr "" #. Remove & from some labels which designer insists in adding #: ../qt/data/MainWindow.ui.h:17 ../qt/src/Ui_MainWindow.hh:49 msgid "Sources" msgstr "æ¥æº" #: ../qt/data/MainWindow.ui.h:18 msgid "Zoom In" msgstr "放大" #: ../qt/data/MainWindow.ui.h:20 msgid "Zoom Out" msgstr "缩å°" #: ../qt/data/MainWindow.ui.h:22 msgid "Normal Size" msgstr "正常尺寸" #: ../qt/data/MainWindow.ui.h:24 msgid "Best Fit" msgstr "最佳尺寸" #: ../qt/data/MainWindow.ui.h:26 msgid "Rotate Left" msgstr "å‘左旋转" #: ../qt/data/MainWindow.ui.h:27 msgid "Rotate left" msgstr "å‘左旋转" #: ../qt/data/MainWindow.ui.h:28 msgid "Rotate Right" msgstr "å‘峿—‹è½¬" #: ../qt/data/MainWindow.ui.h:29 msgid "Rotate right" msgstr "å‘峿—‹è½¬" #: ../qt/data/MainWindow.ui.h:30 msgid "Image Controls" msgstr "å›¾åƒæŽ§åˆ¶" #: ../qt/data/MainWindow.ui.h:32 msgid "Autodetect Layout" msgstr "自动检测布局" #: ../qt/data/MainWindow.ui.h:34 msgid "Toggle Output Pane" msgstr "切æ¢è¾“å‡ºé¢æ¿" #: ../qt/src/MainWindow.cc:518 msgid "Could not read %1: %2" msgstr "ä¸èƒ½è¯»å…¥ %1:%2。" #: ../qt/src/MainWindow.cc:543 msgid "The following dictionary files were installed:%1" msgstr "已安装下列è¯å…¸æ¡£ï¼š%1" #: ../qt/src/Ui_MainWindow.hh:50 msgid "Output" msgstr "输出:" #: ../qt/src/Ui_MainWindow.hh:133 msgid "OCR mode:" msgstr "OCR 模å¼ï¼š" #: ../qt/src/Ui_MainWindow.hh:204 msgid "Remove Image" msgstr "删除图åƒ" #: ../qt/src/Ui_MainWindow.hh:207 msgid "Delete Image" msgstr "删除图åƒ" #: ../qt/src/Ui_MainWindow.hh:210 msgid "Clear List" msgstr "清除清å•" #. Output toolbar #: ../qt/src/Ui_OutputEditorHOCR.hh:39 ../qt/src/Ui_OutputEditorHOCR.hh:40 msgid "Open hOCR file" msgstr "打开 hOCR æ¡£" #: ../qt/src/Ui_OutputEditorHOCR.hh:41 ../qt/src/Ui_OutputEditorHOCR.hh:42 msgid "Save as hOCR text" msgstr "存储为 hOCR 文字" #: ../qt/src/Ui_OutputEditorText.hh:108 msgid "Strip Line Breaks" msgstr "去除æ¢è¡Œç¬¦å·" #: ../qt/src/Ui_OutputEditorText.hh:113 msgid "Find and Replace" msgstr "寻找åŠå–代" #: ../qt/src/Ui_OutputEditorText.hh:122 msgid "Save Output" msgstr "存储输出" #: ../qt/src/Ui_OutputEditorText.hh:124 msgid "Clear Output" msgstr "清除输出" #, fuzzy #~ msgid "" #~ "<html><head/><body><p><span style=" font-" #~ "weight:600;">The application has crashed</span></p>" #~ "<p>Apologies for the inconvenience. To help improve the " #~ "application, please consider reporting the issue to <a href="" #~ "mailto:manisandro@gmail.com?subject=gImageReader%20Crash">" #~ "manisandro@gmail.com</a>. Please try to describe what you were " #~ "doing before the application crashed. Also, include the information " #~ "below. Thank you.</p></body></html>" #~ msgstr "" #~ "

此应用程åºå·²å¼‚常终" #~ "æ­¢

我们为带æ¥çš„ä¸ä¾¿è€Œé“æ­‰ã€‚å¦‚ä½ æœ‰æ„æ”¹å–„此程åºï¼Œè¯·è€ƒè™‘将问题汇" #~ "报给manisandro@gmail.com。请å°è¯•æè¿°ä½ åœ¨ç¨‹åºç»ˆæ­¢å‰æ‰€åšçš„事情。å¦å¤–,请" #~ "一并附上下列数æ®ã€‚谢谢。

" #, fuzzy #~ msgid "" #~ "<small><b>Example:</b> 1-10, 13, 14-18</small>" #~ msgstr "例如: 1-10, 13, 14-18" gImageReader-3.2.3/po/zh_HK.po000066400000000000000000001410751312567024200160260ustar00rootroot00000000000000# Traditional Chinese (Hong Kong) translations for gImageReader package # Copyright (C) 2016 THE GIMAGEREADER'S COPYRIGHT HOLDER # This file is distributed under the same license as the gImageReader package. # # Timothy Lee , 2017. # Sandro Mani , 2016, 2017. msgid "" msgstr "" "Project-Id-Version: \n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2017-07-01 10:34+0200\n" "PO-Revision-Date: 2017-06-30 20:23+0100\n" "Last-Translator: Sandro Mani \n" "Language-Team: Chinese \n" "Language: zh_HK\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" "X-Generator: Lokalize 2.0\n" #: ../gtk/data/appmenu.ui.h:1 ../qt/src/Ui_MainWindow.hh:165 msgid "Redetect Languages" msgstr "釿–°åµæ¸¬èªžè¨€" #: ../gtk/data/appmenu.ui.h:2 ../gtk/data/gimagereader.ui.h:39 #: ../qt/data/ConfigDialog.ui.h:1 ../qt/src/Ui_MainWindow.hh:168 msgid "Preferences" msgstr "é¸é …" #: ../gtk/data/appmenu.ui.h:3 ../gtk/data/gimagereader.ui.h:40 #: ../gtk/src/MainWindow.cc:484 ../qt/src/MainWindow.cc:445 #: ../qt/src/Ui_MainWindow.hh:173 msgid "Help" msgstr "å”助" #: ../gtk/data/appmenu.ui.h:4 ../qt/data/AboutDialog.ui.h:2 #: ../qt/src/Ui_MainWindow.hh:176 msgid "About" msgstr "關於" #: ../gtk/data/appmenu.ui.h:5 msgid "Quit" msgstr "離開" #: ../gtk/data/crashhandler.ui.h:1 ../qt/src/CrashHandler.cc:36 msgid "Regenerate backtrace" msgstr "é‡å»º backtrace" #: ../gtk/data/crashhandler.ui.h:2 msgid "The application has crashed" msgstr "應用程å¼å·²ç•°å¸¸çµ‚æ­¢" #: ../gtk/data/crashhandler.ui.h:4 #, no-c-format msgid "" "Apologies for the inconvenience. To help improve the application, please " "consider reporting the issue to manisandro@gmail.com. Please try to " "describe what you were doing before the application crashed. Also, include " "the information below. Thank you." msgstr "" "我們為帶來的ä¸ä¾¿è€Œé“æ­‰ã€‚å¦‚ä½ æœ‰æ„æ”¹å–„此程å¼ï¼Œè«‹è€ƒæ…®å°‡å•題匯報給manisandro@gmail.com。請嘗試æè¿°ä½ åœ¨ç¨‹å¼çµ‚æ­¢å‰æ‰€åšçš„事情。å¦å¤–,請一併" "附上下列資料。è¬è¬ã€‚" #: ../gtk/data/editor_hocr.ui.h:1 ../qt/data/PdfExportDialog.ui.h:1 msgid "PDF Export" msgstr "匯出 PDF" #: ../gtk/data/editor_hocr.ui.h:2 ../gtk/data/gimagereader.ui.h:55 #: ../gtk/src/Acquirer.cc:42 ../gtk/src/FileDialogs.cc:150 #: ../gtk/src/Utils.cc:68 ../qt/data/ConfigDialog.ui.h:27 #: ../qt/data/MainWindow.ui.h:14 msgid "Cancel" msgstr "å–æ¶ˆ" #: ../gtk/data/editor_hocr.ui.h:3 ../gtk/data/gimagereader.ui.h:41 #: ../gtk/src/FileDialogs.cc:151 ../gtk/src/Utils.cc:59 #: ../qt/data/ConfigDialog.ui.h:26 msgid "OK" msgstr "確定" #: ../gtk/data/editor_hocr.ui.h:4 ../qt/data/PdfExportDialog.ui.h:2 msgid "Output mode:" msgstr "輸出模å¼ï¼š" #: ../gtk/data/editor_hocr.ui.h:5 ../qt/data/PdfExportDialog.ui.h:3 msgid "PDF" msgstr "PDF" #: ../gtk/data/editor_hocr.ui.h:6 ../qt/data/PdfExportDialog.ui.h:4 msgid "PDF with invisible text overlay" msgstr "包å«éš±å½¢æ–‡å­—層的 PDF" #: ../gtk/data/editor_hocr.ui.h:7 ../qt/data/PdfExportDialog.ui.h:16 msgid "Format:" msgstr "æ ¼å¼ï¼š" #: ../gtk/data/editor_hocr.ui.h:8 ../qt/data/PdfExportDialog.ui.h:17 msgid "Compression:" msgstr "壓縮:" #: ../gtk/data/editor_hocr.ui.h:9 ../qt/data/PdfExportDialog.ui.h:14 msgid "Compression quality:" msgstr "壓縮å“質:" #: ../gtk/data/editor_hocr.ui.h:10 ../qt/data/PdfExportDialog.ui.h:15 msgid "DPI:" msgstr "DPI:" #: ../gtk/data/editor_hocr.ui.h:11 ../qt/data/PdfExportDialog.ui.h:18 msgid "Dithering algorithm:" msgstr "éžè‰²æ¼”算法:" #: ../gtk/data/editor_hocr.ui.h:12 ../qt/data/PdfExportDialog.ui.h:13 msgid "Image settings:" msgstr "圖åƒè¨­å®šï¼š" #: ../gtk/data/editor_hocr.ui.h:13 ../qt/data/PdfExportDialog.ui.h:11 msgid "Document font:" msgstr "文件字型:" #: ../gtk/data/editor_hocr.ui.h:14 ../qt/data/PdfExportDialog.ui.h:7 msgid "Uniformize line and word spacing" msgstr "統一行è·åŠå­—è·" #: ../gtk/data/editor_hocr.ui.h:15 ../qt/data/PdfExportDialog.ui.h:10 msgid "Use detected font sizes" msgstr "æŽ¡ç”¨åµæ¸¬åˆ°çš„字型大å°" #: ../gtk/data/editor_hocr.ui.h:16 ../qt/data/PdfExportDialog.ui.h:8 msgid "Preserve spaces wider than:" msgstr "ä¿ç•™ç©ºæ ¼å¤§æ–¼ï¼š" #: ../gtk/data/editor_hocr.ui.h:17 ../qt/data/PdfExportDialog.ui.h:12 msgid "characters" msgstr "å­—å…ƒ" #: ../gtk/data/editor_hocr.ui.h:18 ../qt/data/PdfExportDialog.ui.h:9 msgid "Scale:" msgstr "等級:" #: ../gtk/data/editor_hocr.ui.h:19 ../qt/data/PdfExportDialog.ui.h:6 msgid "Text settings:" msgstr "文字檔設定:" #: ../gtk/data/editor_hocr.ui.h:20 ../qt/data/PdfExportDialog.ui.h:5 msgid "Show preview" msgstr "顯示é è¦½" #: ../gtk/data/editor_hocr.ui.h:21 ../gtk/data/editor_text.ui.h:26 #: ../qt/src/Ui_OutputEditorText.hh:123 msgid "Save output" msgstr "儲存輸出" #: ../gtk/data/editor_hocr.ui.h:22 ../qt/src/Ui_OutputEditorHOCR.hh:44 #: ../qt/src/Ui_OutputEditorHOCR.hh:45 msgid "Export to PDF" msgstr "匯出至 PDF" #: ../gtk/data/editor_hocr.ui.h:23 ../gtk/data/editor_text.ui.h:27 #: ../qt/src/Ui_OutputEditorHOCR.hh:47 ../qt/src/Ui_OutputEditorHOCR.hh:48 #: ../qt/src/Ui_OutputEditorText.hh:125 msgid "Clear output" msgstr "清除輸出" #: ../gtk/data/editor_hocr.ui.h:24 ../qt/src/Ui_OutputEditorHOCR.hh:75 msgid "Properties" msgstr "屬性" #: ../gtk/data/editor_hocr.ui.h:25 ../qt/src/Ui_OutputEditorHOCR.hh:79 msgid "Source" msgstr "來æº" #. Output insert mode #: ../gtk/data/editor_text.ui.h:1 ../qt/src/Ui_OutputEditorText.hh:59 msgid "Append to current text" msgstr "é™„åŠ åˆ°ç¾æœ‰æ–‡å­—" #: ../gtk/data/editor_text.ui.h:2 ../qt/src/Ui_OutputEditorText.hh:60 msgid "Insert at cursor" msgstr "於游標ä½ç½®æ’å…¥" #: ../gtk/data/editor_text.ui.h:3 ../qt/src/Ui_OutputEditorText.hh:61 msgid "Replace current text" msgstr "å–ä»£ç¾æœ‰æ–‡å­—" #: ../gtk/data/editor_text.ui.h:4 ../qt/src/SubstitutionsManager.cc:37 #: ../qt/src/Ui_OutputEditorText.hh:177 msgid "Substitutions" msgstr "替æ›å€¼" #: ../gtk/data/editor_text.ui.h:5 ../qt/src/SubstitutionsManager.cc:42 #: ../qt/src/SubstitutionsManager.cc:43 msgid "Open" msgstr "開啟" #: ../gtk/data/editor_text.ui.h:6 ../gtk/src/Utils.cc:71 #: ../qt/src/SubstitutionsManager.cc:45 ../qt/src/SubstitutionsManager.cc:46 msgid "Save" msgstr "儲存" #: ../gtk/data/editor_text.ui.h:7 ../qt/src/SubstitutionsManager.cc:48 #: ../qt/src/SubstitutionsManager.cc:49 msgid "Clear" msgstr "清除" #: ../gtk/data/editor_text.ui.h:8 ../qt/data/ConfigDialog.ui.h:16 #: ../qt/src/SubstitutionsManager.cc:51 ../qt/src/SubstitutionsManager.cc:52 msgid "Add" msgstr "新增" #: ../gtk/data/editor_text.ui.h:9 ../gtk/src/OutputEditorHOCR.cc:1202 #: ../gtk/src/OutputEditorHOCR.cc:1213 ../qt/data/ConfigDialog.ui.h:17 #: ../qt/src/OutputEditorHOCR.cc:998 ../qt/src/OutputEditorHOCR.cc:1000 #: ../qt/src/SubstitutionsManager.cc:54 ../qt/src/SubstitutionsManager.cc:55 msgid "Remove" msgstr "刪除" #: ../gtk/data/editor_text.ui.h:10 ../gtk/data/gimagereader.ui.h:73 msgid "Apply" msgstr "應用" #: ../gtk/data/editor_text.ui.h:11 ../gtk/data/gimagereader.ui.h:74 msgid "Close" msgstr "關閉" #. Output postprocessing #: ../gtk/data/editor_text.ui.h:12 ../qt/src/Ui_OutputEditorText.hh:69 msgid "Keep line break if..." msgstr "ä¿ç•™æ›è¡Œç¬¦è™Ÿï¼Œå¦‚果……" #: ../gtk/data/editor_text.ui.h:13 ../qt/src/Ui_OutputEditorText.hh:71 msgid "Preceded by end mark (.?!)" msgstr "以終çµè™Ÿèµ·é¦–(.?!)" #: ../gtk/data/editor_text.ui.h:14 ../qt/src/Ui_OutputEditorText.hh:73 msgid "Preceded or succeeded by quote" msgstr "以引號起首或çµå°¾" #: ../gtk/data/editor_text.ui.h:15 ../qt/src/Ui_OutputEditorText.hh:75 msgid "Other options" msgstr "å…¶ä»–é¸é …" #: ../gtk/data/editor_text.ui.h:16 ../qt/src/Ui_OutputEditorText.hh:77 msgid "Join hyphenated words" msgstr "連接斷字符號å‰å¾Œçš„å­—" #: ../gtk/data/editor_text.ui.h:17 ../qt/src/Ui_OutputEditorText.hh:79 msgid "Collapse whitespace" msgstr "åˆä½µç©ºæ ¼" #: ../gtk/data/editor_text.ui.h:18 ../qt/src/Ui_OutputEditorText.hh:81 msgid "Preserve paragraphs" msgstr "ä¿ç•™æ®µè½" #: ../gtk/data/editor_text.ui.h:19 ../qt/src/Ui_OutputEditorText.hh:83 msgid "Visual aids" msgstr "視覺輔助" #: ../gtk/data/editor_text.ui.h:20 ../qt/src/Ui_OutputEditorText.hh:85 msgid "Draw whitespace" msgstr "繪畫空格" #: ../gtk/data/editor_text.ui.h:21 ../gtk/data/gimagereader.ui.h:31 #: ../qt/src/Ui_OutputEditorText.hh:102 msgid "Select insert mode" msgstr "é¸ç”¨æ’入模å¼" #: ../gtk/data/editor_text.ui.h:22 ../qt/src/Ui_OutputEditorText.hh:109 msgid "Strip line breaks on selected text" msgstr "去除é¸å–文字的æ›è¡Œç¬¦è™Ÿ" #: ../gtk/data/editor_text.ui.h:23 ../qt/src/Ui_OutputEditorText.hh:114 msgid "Find and replace" msgstr "æœå°‹åŠå–代" #: ../gtk/data/editor_text.ui.h:24 ../qt/src/Ui_OutputEditorText.hh:116 #: ../qt/src/Ui_OutputEditorText.hh:117 msgid "Undo" msgstr "復原" #: ../gtk/data/editor_text.ui.h:25 ../qt/src/Ui_OutputEditorText.hh:119 #: ../qt/src/Ui_OutputEditorText.hh:120 msgid "Redo" msgstr "é‡åš" #: ../gtk/data/editor_text.ui.h:28 ../qt/src/Ui_OutputEditorText.hh:149 msgid "Find" msgstr "尋找" #: ../gtk/data/editor_text.ui.h:29 ../qt/src/Ui_OutputEditorText.hh:153 #: ../qt/src/Ui_OutputEditorText.hh:168 msgid "Replace" msgstr "å–代" #: ../gtk/data/editor_text.ui.h:30 ../qt/src/Ui_OutputEditorText.hh:173 msgid "Replace all" msgstr "全部å–代" #: ../gtk/data/editor_text.ui.h:31 ../qt/src/Ui_OutputEditorText.hh:163 msgid "Find previous" msgstr "尋找å‰ä¸€å€‹" #: ../gtk/data/editor_text.ui.h:32 ../qt/src/Ui_OutputEditorText.hh:158 msgid "Find next" msgstr "尋找下一個" #: ../gtk/data/editor_text.ui.h:33 ../qt/src/Ui_OutputEditorText.hh:182 msgid "Match case" msgstr "大å°å¯«å»åˆ" #: ../gtk/data/gimagereader.ui.h:1 ../qt/src/Ui_MainWindow.hh:65 msgid "Rotate current page" msgstr "æ—‹è½‰ç¾æœ‰æ–‡å­—" #: ../gtk/data/gimagereader.ui.h:2 ../qt/src/Ui_MainWindow.hh:66 msgid "Rotate all pages" msgstr "旋轉所有é é¢" #: ../gtk/data/gimagereader.ui.h:3 ../qt/data/MainWindow.ui.h:35 msgid "Toggle output pane" msgstr "切æ›è¼¸å‡ºé¢æ¿" #. Sources toolbar #: ../gtk/data/gimagereader.ui.h:4 ../qt/src/Ui_MainWindow.hh:187 msgid "Recent" msgstr "最近" #: ../gtk/data/gimagereader.ui.h:5 ../qt/src/Ui_MainWindow.hh:188 msgid "Paste" msgstr "貼上" #: ../gtk/data/gimagereader.ui.h:6 ../qt/src/Ui_MainWindow.hh:189 msgid "Take Screenshot" msgstr "ç•«é¢æˆªåœ–" #: ../gtk/data/gimagereader.ui.h:7 ../qt/src/Ui_MainWindow.hh:200 msgid "Add images" msgstr "新增圖åƒ" #: ../gtk/data/gimagereader.ui.h:8 ../qt/src/Ui_MainWindow.hh:199 msgid "Add Images" msgstr "新增圖åƒ" #: ../gtk/data/gimagereader.ui.h:9 ../qt/src/Ui_MainWindow.hh:205 msgid "Remove image from list" msgstr "從清單移除圖åƒ" #: ../gtk/data/gimagereader.ui.h:10 ../qt/src/Ui_MainWindow.hh:208 msgid "Delete image" msgstr "刪除圖åƒ" #: ../gtk/data/gimagereader.ui.h:11 ../qt/src/Ui_MainWindow.hh:211 msgid "Clear list" msgstr "清除清單" #: ../gtk/data/gimagereader.ui.h:12 ../qt/data/MainWindow.ui.h:6 msgid "Files" msgstr "檔案" #: ../gtk/data/gimagereader.ui.h:13 ../qt/data/MainWindow.ui.h:16 msgid "Device:" msgstr "è£ç½®ï¼š" #: ../gtk/data/gimagereader.ui.h:14 ../qt/data/MainWindow.ui.h:15 #: ../qt/src/TessdataManager.cc:57 msgid "Refresh" msgstr "æ›´æ–°" #: ../gtk/data/gimagereader.ui.h:15 ../qt/data/MainWindow.ui.h:12 msgid "Output:" msgstr "輸出:" #: ../gtk/data/gimagereader.ui.h:16 ../qt/data/MainWindow.ui.h:9 msgid "Mode:" msgstr "模å¼ï¼š" #: ../gtk/data/gimagereader.ui.h:17 ../gtk/src/OutputEditorHOCR.cc:362 #: ../qt/data/MainWindow.ui.h:11 ../qt/src/OutputEditorHOCR.cc:273 msgid "Color" msgstr "彩色" #: ../gtk/data/gimagereader.ui.h:18 ../gtk/src/OutputEditorHOCR.cc:365 #: ../qt/data/MainWindow.ui.h:10 ../qt/src/OutputEditorHOCR.cc:275 #: ../qt/src/OutputEditorHOCR.cc:277 msgid "Grayscale" msgstr "ç°éšŽ" #: ../gtk/data/gimagereader.ui.h:19 ../qt/data/MainWindow.ui.h:8 msgid "Resolution:" msgstr "è§£åƒåº¦ï¼š" #: ../gtk/data/gimagereader.ui.h:20 ../qt/data/MainWindow.ui.h:13 msgid "Scan" msgstr "掃æ" #: ../gtk/data/gimagereader.ui.h:21 ../qt/data/MainWindow.ui.h:7 msgid "Acquire" msgstr "æ“·å–" #: ../gtk/data/gimagereader.ui.h:22 ../qt/data/MainWindow.ui.h:2 msgid "Brightness" msgstr "亮度" #: ../gtk/data/gimagereader.ui.h:23 ../qt/data/MainWindow.ui.h:3 msgid "Contrast" msgstr "å°æ¯”" #: ../gtk/data/gimagereader.ui.h:24 ../qt/data/MainWindow.ui.h:4 msgid "Resolution" msgstr "è§£åƒåº¦" #: ../gtk/data/gimagereader.ui.h:25 ../qt/data/MainWindow.ui.h:5 msgid "Invert colors" msgstr "å轉色版" #: ../gtk/data/gimagereader.ui.h:26 ../qt/data/MainWindow.ui.h:19 msgid "Zoom in" msgstr "放大" #: ../gtk/data/gimagereader.ui.h:27 ../qt/data/MainWindow.ui.h:21 msgid "Zoom out" msgstr "縮å°" #: ../gtk/data/gimagereader.ui.h:28 ../qt/data/MainWindow.ui.h:23 msgid "Normal size" msgstr "正常大å°" #: ../gtk/data/gimagereader.ui.h:29 ../qt/data/MainWindow.ui.h:25 msgid "Best fit" msgstr "最佳大å°" #: ../gtk/data/gimagereader.ui.h:30 ../qt/src/Ui_MainWindow.hh:74 msgid "Select rotation mode" msgstr "é¸å–旋轉模å¼" #: ../gtk/data/gimagereader.ui.h:32 ../qt/data/MainWindow.ui.h:31 msgid "Image controls" msgstr "åœ–åƒæŽ§åˆ¶" #: ../gtk/data/gimagereader.ui.h:33 ../qt/src/Ui_MainWindow.hh:137 msgid "Plain text" msgstr "純文字" #: ../gtk/data/gimagereader.ui.h:34 ../qt/src/Ui_MainWindow.hh:137 msgid "hOCR, PDF" msgstr "hOCRã€PDF" #: ../gtk/data/gimagereader.ui.h:35 ../qt/data/MainWindow.ui.h:33 msgid "Autodetect layout" msgstr "è‡ªå‹•åµæ¸¬ä½ˆå±€" #: ../gtk/data/gimagereader.ui.h:36 msgid "Recognize all" msgstr "辨èªå…¨éƒ¨" #: ../gtk/data/gimagereader.ui.h:37 msgid "Select language" msgstr "é¸å–語言" #: ../gtk/data/gimagereader.ui.h:38 msgid "A graphical frontend to tesseract-ocr" msgstr "tesseract-ocr 的圖åƒä»‹é¢" #: ../gtk/data/gimagereader.ui.h:42 msgid "Output pane orientation:" msgstr "è¼¸å‡ºé¢æ¿çš„æ–¹å‘:" #: ../gtk/data/gimagereader.ui.h:43 msgid "Horizontal" msgstr "æ©«å‘" #: ../gtk/data/gimagereader.ui.h:44 msgid "Vertical" msgstr "縱å‘" #: ../gtk/data/gimagereader.ui.h:45 ../qt/data/ConfigDialog.ui.h:18 msgid "Query to install missing spellcheck dictionaries" msgstr "æŸ¥æ‰¾éºæ¼å®‰è£çš„æ‹¼å­—詞典" #: ../gtk/data/gimagereader.ui.h:46 ../qt/data/ConfigDialog.ui.h:4 msgid "Automatically check for new program versions" msgstr "自動檢查新版本" #: ../gtk/data/gimagereader.ui.h:47 ../qt/data/ConfigDialog.ui.h:3 msgid "Predefined language definitions:" msgstr "é è¨­èªžè¨€å®šç¾©ï¼š" #: ../gtk/data/gimagereader.ui.h:48 ../qt/data/ConfigDialog.ui.h:12 msgid "Additional language definitions:" msgstr "é¡å¤–語言定義:" #: ../gtk/data/gimagereader.ui.h:49 ../qt/data/ConfigDialog.ui.h:20 msgid "The prefix of the tesseract language data file" msgstr "tesseract 語言資料檔的å‰ç½®" #: ../gtk/data/gimagereader.ui.h:50 ../qt/data/ConfigDialog.ui.h:21 msgid "Prefix" msgstr "å‰ç½®" #: ../gtk/data/gimagereader.ui.h:51 ../qt/data/ConfigDialog.ui.h:22 msgid "The ISO 639-1 language code followed by the country code" msgstr "ISO 639-1 語言代碼並國家代碼" #: ../gtk/data/gimagereader.ui.h:52 ../qt/data/ConfigDialog.ui.h:23 msgid "ISO Code" msgstr "ISO 代碼" #: ../gtk/data/gimagereader.ui.h:53 ../qt/data/ConfigDialog.ui.h:24 msgid "The name of the language" msgstr "語言å稱" #: ../gtk/data/gimagereader.ui.h:54 ../qt/data/ConfigDialog.ui.h:25 msgid "Name" msgstr "å稱" #: ../gtk/data/gimagereader.ui.h:56 ../qt/data/ConfigDialog.ui.h:5 msgid "Output pane font:" msgstr "è¼¸å‡ºé¢æ¿å­—型:" #: ../gtk/data/gimagereader.ui.h:57 ../qt/data/ConfigDialog.ui.h:2 msgid "Default" msgstr "é è¨­å€¼" #: ../gtk/data/gimagereader.ui.h:58 ../qt/data/ConfigDialog.ui.h:6 msgid "Language data locations:" msgstr "語言資料ä½ç½®ï¼š" #: ../gtk/data/gimagereader.ui.h:59 ../qt/data/ConfigDialog.ui.h:13 msgid "Language definitions path:" msgstr "語言定義路徑:" #: ../gtk/data/gimagereader.ui.h:60 ../qt/data/ConfigDialog.ui.h:28 msgid "Spelling dictionaries path:" msgstr "拼字詞典路徑:" #: ../gtk/data/gimagereader.ui.h:61 ../qt/data/ConfigDialog.ui.h:10 msgid "System-wide paths" msgstr "系統路徑" #: ../gtk/data/gimagereader.ui.h:62 ../qt/data/ConfigDialog.ui.h:11 msgid "User paths" msgstr "用戶路徑" #: ../gtk/data/gimagereader.ui.h:63 ../qt/data/PageRangeDialog.ui.h:1 msgid "Page Range" msgstr "é é¢ç¯„åœ" #: ../gtk/data/gimagereader.ui.h:64 ../qt/data/PageRangeDialog.ui.h:2 msgid "Page range:" msgstr "é é¢ç¯„åœï¼š" #: ../gtk/data/gimagereader.ui.h:65 ../qt/data/PageRangeDialog.ui.h:3 msgid "Example: 1-10, 13, 14-18" msgstr "例如: 1-10, 13, 14-18" #: ../gtk/data/gimagereader.ui.h:66 ../qt/data/PageRangeDialog.ui.h:4 msgid "Recognition area:" msgstr "辨èªå€åŸŸï¼š" #: ../gtk/data/gimagereader.ui.h:67 ../gtk/src/Recognizer.cc:403 #: ../qt/data/PageRangeDialog.ui.h:5 ../qt/src/Recognizer.cc:381 msgid "Entire page" msgstr "æ•´é " #: ../gtk/data/gimagereader.ui.h:68 ../qt/data/PageRangeDialog.ui.h:6 msgid "Autodetect" msgstr "è‡ªå‹•åµæ¸¬" #: ../gtk/data/gimagereader.ui.h:69 ../qt/data/PageRangeDialog.ui.h:7 #, fuzzy msgid "Prepend to output text:" msgstr "é™„åŠ åˆ°ç¾æœ‰æ–‡å­—" #: ../gtk/data/gimagereader.ui.h:70 ../qt/data/PageRangeDialog.ui.h:8 msgid "Source filename" msgstr "" #: ../gtk/data/gimagereader.ui.h:71 ../qt/data/PageRangeDialog.ui.h:9 #, fuzzy msgid "Source page" msgstr "來æº" #: ../gtk/data/gimagereader.ui.h:72 ../qt/src/TessdataManager.cc:47 msgid "Tessdata Manager" msgstr "Tessdata 管ç†å“¡" #: ../gtk/data/gimagereader.ui.h:75 ../qt/src/TessdataManager.cc:49 msgid "Manage installed languages:" msgstr "管ç†å·²å®‰è£çš„語言:" #: ../gtk/data/gimagereader.ui.h:76 ../qt/src/DisplayerToolSelect.cc:240 msgid "Delete" msgstr "刪除" #: ../gtk/data/gimagereader.ui.h:77 ../qt/src/DisplayerToolSelect.cc:226 msgid "Order:" msgstr "排åºï¼š" #: ../gtk/data/gimagereader.ui.h:78 ../gtk/src/DisplayerToolHOCR.cc:28 #: ../qt/src/DisplayerToolHOCR.cc:30 ../qt/src/DisplayerToolSelect.cc:241 msgid "Recognize" msgstr "辨èª" #: ../gtk/data/gimagereader.ui.h:79 ../qt/src/DisplayerToolSelect.cc:242 msgid "Recognize to clipboard" msgstr "辨èªè‡³å‰ªè²¼ç°¿" #: ../gtk/data/gimagereader.ui.h:80 ../qt/src/DisplayerToolSelect.cc:243 msgid "Save as image" msgstr "儲存為圖åƒ" #: ../gtk/data/gimagereader.ui.h:81 ../qt/src/Recognizer.cc:76 msgid "Current Page" msgstr "ç¾æ™‚é é¢" #: ../gtk/data/gimagereader.ui.h:82 ../qt/src/Recognizer.cc:79 msgid "Multiple Pages..." msgstr "多é â€¦â€¦" #: ../gtk/src/Acquirer.cc:83 ../qt/src/Acquirer.cc:63 msgid "scan.png" msgstr "" #: ../gtk/src/Acquirer.cc:96 ../qt/src/Acquirer.cc:80 msgid "Images" msgstr "圖åƒ" #: ../gtk/src/Acquirer.cc:97 ../qt/src/Acquirer.cc:81 msgid "Choose Output Filename..." msgstr "é¸å–輸出檔å……" #: ../gtk/src/Acquirer.cc:112 ../qt/src/Acquirer.cc:96 msgid "Failed to initialize the scanning backend." msgstr "無法åˆå§‹åŒ–æŽƒææœå‹™ã€‚" #: ../gtk/src/Acquirer.cc:121 ../qt/src/Acquirer.cc:102 msgid "Scan failed" msgstr "無法摺掃æ" #: ../gtk/src/Acquirer.cc:139 ../qt/src/Acquirer.cc:118 msgid "No scanners were detected." msgstr "嵿¸¬ä¸åˆ°æŽƒæå™¨ã€‚" #: ../gtk/src/Acquirer.cc:156 ../gtk/src/Acquirer.cc:173 #: ../qt/src/Acquirer.cc:132 ../qt/src/Acquirer.cc:149 msgid "Starting scan..." msgstr "開始掃æâ€¦â€¦" #: ../gtk/src/Acquirer.cc:169 ../qt/src/Acquirer.cc:145 msgid "Opening device..." msgstr "開啟è£ç½®â€¦â€¦" #: ../gtk/src/Acquirer.cc:171 ../qt/src/Acquirer.cc:147 msgid "Setting options..." msgstr "設定é¸é ………" #: ../gtk/src/Acquirer.cc:175 ../qt/src/Acquirer.cc:151 msgid "Getting parameters..." msgstr "ç²å–åƒæ•¸â€¦â€¦" #: ../gtk/src/Acquirer.cc:177 ../qt/src/Acquirer.cc:153 msgid "Transferring data..." msgstr "轉輸數據……" #: ../gtk/src/Acquirer.cc:184 ../qt/src/Acquirer.cc:160 msgid "Canceling scan..." msgstr "å–æ¶ˆæŽƒæâ€¦â€¦" #: ../gtk/src/Config.cc:297 ../qt/data/ConfigDialog.ui.h:7 msgid "Filename prefix" msgstr "檔åå‰ç½®" #: ../gtk/src/Config.cc:298 ../qt/data/ConfigDialog.ui.h:8 msgid "Code" msgstr "代碼" #: ../gtk/src/Config.cc:299 ../qt/data/ConfigDialog.ui.h:9 msgid "Native name" msgstr "原生å稱" #: ../gtk/src/CrashHandler.cc:26 ../gtk/src/CrashHandler.cc:43 #: ../qt/src/CrashHandler.cc:34 msgid "Crash Handler" msgstr "異常終止處ç†å™¨" #: ../gtk/src/CrashHandler.cc:45 ../qt/src/CrashHandler.cc:29 msgid "Your work has been saved under %1." msgstr "你的工作已儲存於 %1。" #: ../gtk/src/CrashHandler.cc:47 ../qt/src/CrashHandler.cc:31 msgid "There was no unsaved work." msgstr "沒有未儲存的工作。" #: ../gtk/src/CrashHandler.cc:106 ../qt/src/CrashHandler.cc:60 msgid "Failed to obtain backtrace. Is gdb installed?" msgstr "無法å–å¾— backtraceã€‚å·²å®‰è£ gdb 嗎?" #: ../gtk/src/Displayer.cc:261 ../qt/src/Displayer.cc:231 msgid "Failed to load image" msgstr "無法載入圖åƒ" #: ../gtk/src/Displayer.cc:261 ../qt/src/Displayer.cc:231 msgid "" "The file might not be an image or be corrupt:\n" "%1" msgstr "" "該檔案å¯èƒ½ä¸æ˜¯åœ–åƒæˆ–已被æå£žï¼š\n" "%1" #: ../gtk/src/DisplayerToolSelect.cc:39 ../qt/src/DisplayerToolSelect.cc:40 msgid "selection.png" msgstr "" #: ../gtk/src/DisplayerToolSelect.cc:148 ../qt/src/DisplayerToolSelect.cc:139 msgid "PNG Images" msgstr "PNG 圖åƒ" #: ../gtk/src/DisplayerToolSelect.cc:149 ../qt/src/DisplayerToolSelect.cc:139 msgid "Save Selection Image" msgstr "儲存é¸å–圖åƒ" #: ../gtk/src/DisplayerToolSelect.cc:157 ../qt/src/DisplayerToolSelect.cc:147 msgid "Recognize all" msgstr "辨èªå…¨éƒ¨" #: ../gtk/src/DisplayerToolSelect.cc:157 ../qt/src/DisplayerToolSelect.cc:147 msgid "Recognize selection" msgstr "辨èªé¸å–å€" #: ../gtk/src/DisplayerToolSelect.cc:194 ../qt/src/DisplayerToolSelect.cc:184 msgid "Performing layout analysis" msgstr "進行佈局分æž" #: ../gtk/src/FileDialogs.cc:237 msgid "" "A file named \"%1\" already exists. Are you sure you want to overwrite it?" msgstr "å為 \"%1\" 的檔案已存在。你確定è¦è¦†å¯«å®ƒï¼Ÿ" #: ../gtk/src/FileDialogs.cc:239 msgid "Overwrite File?" msgstr "覆寫檔案?" #: ../gtk/src/MainWindow.cc:125 ../qt/src/MainWindow.cc:274 msgid "Using tesseract" msgstr "採用 tesseract" #: ../gtk/src/MainWindow.cc:191 ../qt/src/MainWindow.cc:181 msgid "Select an image to begin..." msgstr "è«‹é¸å–圖åƒä½œç‚ºé–‹å§‹â€¦â€¦" #: ../gtk/src/MainWindow.cc:306 ../qt/src/MainWindow.cc:262 msgid "Multiple sources" msgstr "多個來æº" #: ../gtk/src/MainWindow.cc:307 ../qt/src/MainWindow.cc:263 msgid "Ready" msgstr "就緒" #: ../gtk/src/MainWindow.cc:446 ../qt/src/MainWindow.cc:390 msgid "New version" msgstr "新版本" #: ../gtk/src/MainWindow.cc:446 ../qt/src/MainWindow.cc:390 msgid "gImageReader %1 is available" msgstr "gImageReader %1 å·²é¢ä¸–" #: ../gtk/src/MainWindow.cc:447 ../qt/src/MainWindow.cc:391 msgid "Download" msgstr "下載" #: ../gtk/src/MainWindow.cc:448 ../qt/src/MainWindow.cc:392 msgid "Changelog" msgstr "修改日誌" #: ../gtk/src/MainWindow.cc:449 ../qt/src/MainWindow.cc:393 msgid "Don't notify again" msgstr "ä¸å†æç¤º" #: ../gtk/src/MainWindow.cc:468 ../qt/src/MainWindow.cc:438 msgid "Don't show again" msgstr "ä¸å†é¡¯ç¤º" #: ../gtk/src/MainWindow.cc:469 ../gtk/src/MainWindow.cc:482 #: ../qt/src/MainWindow.cc:439 msgid "Install" msgstr "安è£" #: ../gtk/src/MainWindow.cc:489 ../qt/src/MainWindow.cc:451 msgid "Spelling dictionary missing" msgstr "éºæ¼æ‹¼å­—詞典" #: ../gtk/src/MainWindow.cc:489 ../qt/src/MainWindow.cc:451 msgid "The spellcheck dictionary for %1 is not installed" msgstr "æœªå®‰è£ %1 的拼字詞典" #: ../gtk/src/MainWindow.cc:496 ../gtk/src/MainWindow.cc:528 #: ../qt/src/MainWindow.cc:458 msgid "Installing spelling dictionary for '%1'" msgstr "æ­£åœ¨å®‰è£ '%1' 的拼字詞典" #: ../gtk/src/MainWindow.cc:517 ../gtk/src/MainWindow.cc:542 #: ../gtk/src/MainWindow.cc:550 ../gtk/src/MainWindow.cc:560 #: ../gtk/src/MainWindow.cc:566 ../gtk/src/MainWindow.cc:595 #: ../gtk/src/OutputEditorHOCR.cc:1375 ../gtk/src/Recognizer.cc:163 #: ../gtk/src/TessdataManager.cc:58 ../gtk/src/TessdataManager.cc:68 #: ../gtk/src/TessdataManager.cc:290 ../qt/src/MainWindow.cc:477 #: ../qt/src/MainWindow.cc:490 ../qt/src/MainWindow.cc:500 #: ../qt/src/MainWindow.cc:510 ../qt/src/MainWindow.cc:518 #: ../qt/src/MainWindow.cc:546 ../qt/src/OutputEditorHOCR.cc:1157 #: ../qt/src/Recognizer.cc:138 ../qt/src/TessdataManager.cc:72 #: ../qt/src/TessdataManager.cc:82 ../qt/src/TessdataManager.cc:275 msgid "Error" msgstr "錯誤" #: ../gtk/src/MainWindow.cc:517 ../qt/src/MainWindow.cc:477 msgid "Failed to install spelling dictionary: %1" msgstr "ç„¡æ³•å®‰è£æ‹¼å­—詞典:%1" #: ../gtk/src/MainWindow.cc:542 ../qt/src/MainWindow.cc:490 msgid "Failed to create directory for spelling dictionaries." msgstr "無法建立拼字詞典目錄。" #: ../gtk/src/MainWindow.cc:550 ../gtk/src/MainWindow.cc:566 #: ../qt/src/MainWindow.cc:500 msgid "Could not read %1: %2." msgstr "ç„¡æ³•è®€å– %1:%2。" #: ../gtk/src/MainWindow.cc:560 ../gtk/src/MainWindow.cc:595 #: ../qt/src/MainWindow.cc:510 ../qt/src/MainWindow.cc:546 msgid "No spelling dictionaries found for '%1'." msgstr "找ä¸åˆ° '%1' 的拼字詞典。" #: ../gtk/src/MainWindow.cc:576 ../qt/src/MainWindow.cc:529 msgid "Downloading '%1'..." msgstr "正在下載 '%1'……" #: ../gtk/src/MainWindow.cc:592 ../qt/src/MainWindow.cc:543 msgid "Dictionaries installed" msgstr "已安è£è©žå…¸" #: ../gtk/src/MainWindow.cc:592 msgid "The following dictionaries were installed:%1" msgstr "已安è£ä¸‹åˆ—詞典:%1" #: ../gtk/src/OutputEditorHOCR.cc:319 ../qt/src/OutputEditorHOCR.cc:291 msgid "Document" msgstr "文件" #: ../gtk/src/OutputEditorHOCR.cc:368 ../qt/src/OutputEditorHOCR.cc:279 msgid "Monochrome" msgstr "黑白" #: ../gtk/src/OutputEditorHOCR.cc:377 ../qt/src/OutputEditorHOCR.cc:281 msgid "Threshold (closest color)" msgstr "定é™ï¼ˆæœ€æŽ¥è¿‘é¡è‰²ï¼‰" #: ../gtk/src/OutputEditorHOCR.cc:380 ../qt/src/OutputEditorHOCR.cc:282 msgid "Diffuse" msgstr "æ“´æ•£" #: ../gtk/src/OutputEditorHOCR.cc:389 ../qt/src/OutputEditorHOCR.cc:283 msgid "Zip (lossless)" msgstr "Zip(無æï¼‰" #: ../gtk/src/OutputEditorHOCR.cc:393 ../qt/src/OutputEditorHOCR.cc:284 msgid "CCITT Group 4 (lossless)" msgstr "CCITT 第 4 組(無æï¼‰" #: ../gtk/src/OutputEditorHOCR.cc:397 ../qt/src/OutputEditorHOCR.cc:285 msgid "Jpeg (lossy)" msgstr "Jpeg(失真)" #: ../gtk/src/OutputEditorHOCR.cc:553 ../qt/src/OutputEditorHOCR.cc:429 msgid "" "The following pages could not be processed:\n" "%1" msgstr "" "無法處ç†ä¸‹åˆ—é é¢ï¼š\n" "%1" #: ../gtk/src/OutputEditorHOCR.cc:554 ../qt/src/OutputEditorHOCR.cc:430 msgid "Recognition errors" msgstr "è¾¨èªæ™‚出ç¾éŒ¯èª¤" #. Add tree item #: ../gtk/src/OutputEditorHOCR.cc:647 ../gtk/src/OutputEditorHOCR.cc:1037 #: ../qt/src/OutputEditorHOCR.cc:504 ../qt/src/OutputEditorHOCR.cc:894 msgid "Graphic" msgstr "圖åƒ" #: ../gtk/src/OutputEditorHOCR.cc:703 ../qt/src/OutputEditorHOCR.cc:563 msgid "Paragraph" msgstr "段è½" #: ../gtk/src/OutputEditorHOCR.cc:706 ../qt/src/OutputEditorHOCR.cc:566 msgid "Textline" msgstr "文字" #: ../gtk/src/OutputEditorHOCR.cc:1136 ../qt/src/OutputEditorHOCR.cc:950 msgid "Merge" msgstr "åˆä½µ" #: ../gtk/src/OutputEditorHOCR.cc:1161 ../qt/src/OutputEditorHOCR.cc:977 msgid "Add graphic region" msgstr "新增圖åƒå€åŸŸ" #: ../gtk/src/OutputEditorHOCR.cc:1177 ../qt/src/OutputEditorHOCR.cc:985 msgid "No suggestions" msgstr "沒有建議" #: ../gtk/src/OutputEditorHOCR.cc:1183 ../qt/src/OutputEditorHOCR.cc:989 msgid "Add to dictionary" msgstr "新增詞典" #: ../gtk/src/OutputEditorHOCR.cc:1189 ../qt/src/OutputEditorHOCR.cc:990 msgid "Ignore word" msgstr "忽略字詞" #: ../gtk/src/OutputEditorHOCR.cc:1222 ../qt/src/OutputEditorHOCR.cc:1007 msgid "Expand all" msgstr "展開" #: ../gtk/src/OutputEditorHOCR.cc:1225 ../qt/src/OutputEditorHOCR.cc:1008 msgid "Collapse all" msgstr "æ”¶èµ·" #: ../gtk/src/OutputEditorHOCR.cc:1248 ../gtk/src/OutputEditorHOCR.cc:1287 #: ../qt/src/OutputEditorHOCR.cc:1049 ../qt/src/OutputEditorHOCR.cc:1079 msgid "hOCR HTML Files" msgstr "hOCR HTML 檔" #: ../gtk/src/OutputEditorHOCR.cc:1249 ../qt/src/OutputEditorHOCR.cc:1049 msgid "Open hOCR File" msgstr "開啟 hOCR 檔" #: ../gtk/src/OutputEditorHOCR.cc:1258 ../qt/src/OutputEditorHOCR.cc:1055 msgid "Failed to open file" msgstr "無法開啟檔案" #: ../gtk/src/OutputEditorHOCR.cc:1258 ../qt/src/OutputEditorHOCR.cc:1055 msgid "The file could not be opened: %1." msgstr "無法開啟檔案:%1。" #: ../gtk/src/OutputEditorHOCR.cc:1267 ../qt/src/OutputEditorHOCR.cc:1062 msgid "Invalid hOCR file" msgstr "無效的 hOCR 檔" #: ../gtk/src/OutputEditorHOCR.cc:1267 ../qt/src/OutputEditorHOCR.cc:1062 msgid "The file does not appear to contain valid hOCR HTML: %1" msgstr "此檔案似乎並ä¸åŒ…嫿œ‰æ•ˆçš„ hOCR HTML:%1" #: ../gtk/src/OutputEditorHOCR.cc:1283 ../gtk/src/OutputEditorHOCR.cc:1343 #: ../gtk/src/OutputEditorText.cc:306 ../qt/src/OutputEditorHOCR.cc:1077 #: ../qt/src/OutputEditorHOCR.cc:1131 ../qt/src/OutputEditorText.cc:246 msgid "output" msgstr "輸出" #: ../gtk/src/OutputEditorHOCR.cc:1288 ../qt/src/OutputEditorHOCR.cc:1079 msgid "Save hOCR Output..." msgstr "儲存 hOCR 輸出……" #: ../gtk/src/OutputEditorHOCR.cc:1296 ../gtk/src/OutputEditorHOCR.cc:1357 #: ../gtk/src/OutputEditorText.cc:319 ../qt/src/OutputEditorHOCR.cc:1087 #: ../qt/src/OutputEditorHOCR.cc:1143 ../qt/src/OutputEditorText.cc:256 msgid "Failed to save output" msgstr "無法儲存輸出……" #: ../gtk/src/OutputEditorHOCR.cc:1296 ../gtk/src/OutputEditorHOCR.cc:1357 #: ../gtk/src/OutputEditorText.cc:319 ../qt/src/OutputEditorHOCR.cc:1087 #: ../qt/src/OutputEditorHOCR.cc:1143 ../qt/src/OutputEditorText.cc:256 msgid "Check that you have writing permissions in the selected folder." msgstr "請檢查你在所é¸å–è³‡æ–™å¤¾æ“æœ‰å¯«å…¥æ¬Šé™ã€‚" #: ../gtk/src/OutputEditorHOCR.cc:1346 ../qt/src/OutputEditorHOCR.cc:1133 msgid "PDF Files" msgstr "PDF 檔" #: ../gtk/src/OutputEditorHOCR.cc:1347 ../qt/src/OutputEditorHOCR.cc:1133 msgid "Save PDF Output..." msgstr "儲存 PDF 輸出……" #: ../gtk/src/OutputEditorHOCR.cc:1375 ../qt/src/OutputEditorHOCR.cc:1157 msgid "The PDF library does not support the selected font." msgstr "PDF 程å¼åº«ä¸æ”¯æ´æ‰€é¸å–字型。" #: ../gtk/src/OutputEditorHOCR.cc:1435 ../qt/src/OutputEditorHOCR.cc:1216 msgid "Errors occurred" msgstr "發生錯誤" #: ../gtk/src/OutputEditorHOCR.cc:1435 ../qt/src/OutputEditorHOCR.cc:1216 msgid "" "The following pages could not be rendered:\n" "%1" msgstr "" "無法繪畫下列é é¢ï¼š\n" "%1" #: ../gtk/src/OutputEditorHOCR.cc:1562 ../gtk/src/OutputEditorText.cc:333 #: ../qt/src/OutputEditorHOCR.cc:1331 ../qt/src/OutputEditorText.cc:269 msgid "Output not saved" msgstr "未儲存輸出" #: ../gtk/src/OutputEditorHOCR.cc:1562 ../gtk/src/OutputEditorText.cc:333 #: ../qt/src/OutputEditorHOCR.cc:1331 ../qt/src/OutputEditorText.cc:269 msgid "Save output before proceeding?" msgstr "先儲存輸出å†ç¹¼çºŒï¼Ÿ" #: ../gtk/src/OutputEditorText.cc:197 ../qt/src/OutputEditorText.cc:158 msgid "Stripping line breaks..." msgstr "去除æ›è¡Œç¬¦è™Ÿâ€¦â€¦" #: ../gtk/src/OutputEditorText.cc:211 msgid "Check spelling" msgstr "檢查拼字" #: ../gtk/src/OutputEditorText.cc:238 ../qt/src/OutputEditorText.cc:178 msgid "Replacing..." msgstr "å–代中……" #: ../gtk/src/OutputEditorText.cc:264 ../qt/src/OutputEditorText.cc:204 #, fuzzy msgid "File: %1" msgstr "檔案" #: ../gtk/src/OutputEditorText.cc:267 ../qt/src/OutputEditorText.cc:207 #, fuzzy msgid "Page: %1" msgstr "剖æžéŒ¯èª¤ï¼š%1" #: ../gtk/src/OutputEditorText.cc:280 ../gtk/src/Recognizer.cc:481 #: ../qt/src/Recognizer.cc:460 msgid "" "\n" "[Failed to recognize page %1]\n" msgstr "" "\n" "[無法辨èªç¬¬ %1 é ]\n" #: ../gtk/src/OutputEditorText.cc:310 ../qt/src/OutputEditorText.cc:248 msgid "Text Files" msgstr "文字檔" #: ../gtk/src/OutputEditorText.cc:311 ../qt/src/OutputEditorText.cc:248 msgid "Save Output..." msgstr "儲存輸出……" #: ../gtk/src/Recognizer.cc:156 ../qt/src/Recognizer.cc:131 msgid "" "Tesseract crashed with the following message:\n" "\n" "%1\n" "\n" "This typically happens for one of the following reasons:\n" "- Outdated traineddata files are used.\n" "- Auxiliary language data files are missing.\n" "- Corrupt language data files.\n" "\n" "Make sure your language data files are valid and compatible with tesseract " "%2." msgstr "" "Tesseract 已異常終止åŠç™¼å‡ºä»¥ä¸‹è¨Šæ¯ï¼š\n" "\n" "%1\n" "\n" "出ç¾é€™å€‹æƒ…æ³ä¸€èˆ¬æœ‰ä¸‹åˆ—原因:\n" "- 採用舊版的 traineddata 檔。\n" "- éºæ¼è¼”助語言資料檔。\n" "- èªžè¨€è³‡æ–™æª”å·²ææ¯€ã€‚\n" "\n" "請確ä¿ä½ çš„語言資料檔是正確的åŠå…¼å®¹ tesseract %2 。" #: ../gtk/src/Recognizer.cc:212 ../qt/src/Recognizer.cc:191 msgid "No languages available" msgstr "沒有å¯ç”¨èªžè¨€" #: ../gtk/src/Recognizer.cc:212 ../qt/src/Recognizer.cc:191 msgid "" "No tesseract languages are available for use. Recognition will not work." msgstr "沒有å¯ç”¨çš„ tesseract 語言。辨èªå°‡æœƒå¤±æ•—。" #: ../gtk/src/Recognizer.cc:266 ../qt/src/Recognizer.cc:251 msgid "Multilingual" msgstr "多語言" #: ../gtk/src/Recognizer.cc:318 ../qt/src/Recognizer.cc:295 msgid "Automatic page segmentation" msgstr "自動分割é é¢" #: ../gtk/src/Recognizer.cc:319 ../qt/src/Recognizer.cc:296 msgid "Page segmentation with orientation and script detection" msgstr "分割é é¢ä¸¦åµæ¸¬æ–¹å‘åŠæ–‡å­—" #: ../gtk/src/Recognizer.cc:320 ../qt/src/Recognizer.cc:297 msgid "Assume single column of text" msgstr "å‡è¨­åªæœ‰ä¸€æ¬„文字" #: ../gtk/src/Recognizer.cc:321 ../qt/src/Recognizer.cc:298 msgid "Assume single block of vertically aligned text" msgstr "å‡è¨­åªæœ‰ä¸€æ®µåž‚ç›´å°æ•´çš„æ–‡å­—" #: ../gtk/src/Recognizer.cc:322 ../qt/src/Recognizer.cc:299 msgid "Assume a single uniform block of text" msgstr "å‡è¨­åªæœ‰ä¸€æ®µå‡å‹»çš„æ–‡å­—" #: ../gtk/src/Recognizer.cc:323 ../qt/src/Recognizer.cc:300 msgid "Assume a line of text" msgstr "å‡è¨­åªæœ‰ä¸€è¡Œæ–‡å­—" #: ../gtk/src/Recognizer.cc:324 ../qt/src/Recognizer.cc:301 msgid "Assume a single word" msgstr "å‡è¨­åªæœ‰ä¸€å€‹å­—" #: ../gtk/src/Recognizer.cc:325 ../qt/src/Recognizer.cc:302 msgid "Assume a single word in a circle" msgstr "å‡è¨­æ˜¯åœ“圈內的一個字" #: ../gtk/src/Recognizer.cc:326 ../qt/src/Recognizer.cc:303 msgid "Sparse text in no particular order" msgstr "沒有特定次åºçš„ç¨€ç–æ–‡å­—" #: ../gtk/src/Recognizer.cc:327 ../qt/src/Recognizer.cc:304 msgid "Sparse text with orientation and script detection" msgstr "嵿¸¬ç¨€ç–文字的方å‘åŠæ–‡å­—" #: ../gtk/src/Recognizer.cc:341 ../qt/src/Recognizer.cc:314 msgid "Page segmentation mode" msgstr "分割é é¢æ¨¡å¼" #: ../gtk/src/Recognizer.cc:347 ../qt/src/Recognizer.cc:321 msgid "Manage languages..." msgstr "管ç†èªžè¨€â€¦â€¦" #: ../gtk/src/Recognizer.cc:403 ../qt/src/Recognizer.cc:381 msgid "Current selection" msgstr "ç¾æœ‰é¸å–å€" #: ../gtk/src/Recognizer.cc:475 ../qt/src/Recognizer.cc:454 msgid "Recognizing page %1 (%2 of %3)" msgstr "辨èªç¬¬ %1 é ï¼ˆ%3 之 %2)" #: ../gtk/src/Recognizer.cc:480 ../qt/src/Recognizer.cc:459 msgid "" "\n" "- Page %1: failed to render page" msgstr "" "\n" "- 第 %1 é ï¼šç„¡æ³•繪畫é é¢" #: ../gtk/src/Recognizer.cc:510 ../gtk/src/Recognizer.cc:539 #: ../gtk/src/Recognizer.cc:552 ../qt/src/Recognizer.cc:488 #: ../qt/src/Recognizer.cc:517 ../qt/src/Recognizer.cc:530 msgid "Recognizing..." msgstr "辨èªä¸­â€¦â€¦" #: ../gtk/src/Recognizer.cc:514 ../gtk/src/Recognizer.cc:522 #: ../qt/src/Recognizer.cc:492 ../qt/src/Recognizer.cc:500 msgid "Recognition errors occurred" msgstr "è¾¨èªæ™‚出ç¾éŒ¯èª¤" #: ../gtk/src/Recognizer.cc:514 ../qt/src/Recognizer.cc:492 msgid "The following errors occurred:%1" msgstr "出ç¾ä¸‹åˆ—錯誤:%1" #: ../gtk/src/Recognizer.cc:522 ../qt/src/Recognizer.cc:500 msgid "Failed to initialize tesseract" msgstr "無法åˆå§‹åŒ– tesseract" #: ../gtk/src/scanner/ScannerSane.cc:83 ../gtk/src/scanner/ScannerTwain.cc:287 #: ../qt/src/scanner/ScannerSane.cc:85 ../qt/src/scanner/ScannerTwain.cc:285 msgid "Scan canceled" msgstr "已喿¶ˆæŽƒæ" #: ../gtk/src/scanner/ScannerSane.cc:157 ../gtk/src/scanner/ScannerTwain.cc:186 #: ../qt/src/scanner/ScannerSane.cc:158 ../qt/src/scanner/ScannerTwain.cc:178 msgid "No scanner specified" msgstr "未指定掃æå™¨" #: ../gtk/src/scanner/ScannerSane.cc:166 ../gtk/src/scanner/ScannerTwain.cc:195 #: ../qt/src/scanner/ScannerSane.cc:167 ../qt/src/scanner/ScannerTwain.cc:187 msgid "Unable to connect to scanner" msgstr "無法連線至掃æå™¨" #: ../gtk/src/scanner/ScannerSane.cc:386 ../gtk/src/scanner/ScannerTwain.cc:265 #: ../gtk/src/scanner/ScannerTwain.cc:291 ../qt/src/scanner/ScannerSane.cc:387 #: ../qt/src/scanner/ScannerTwain.cc:257 ../qt/src/scanner/ScannerTwain.cc:289 msgid "Unable to start scan" msgstr "無法開始掃æ" #: ../gtk/src/scanner/ScannerSane.cc:394 ../gtk/src/scanner/ScannerSane.cc:437 #: ../gtk/src/scanner/ScannerTwain.cc:317 ../qt/src/scanner/ScannerSane.cc:395 #: ../qt/src/scanner/ScannerSane.cc:438 ../qt/src/scanner/ScannerTwain.cc:315 msgid "Error communicating with scanner" msgstr "與掃æå™¨æºé€šå‡ºç¾éŒ¯èª¤" #: ../gtk/src/scanner/ScannerSane.cc:498 ../qt/src/scanner/ScannerSane.cc:494 msgid "Failed to save image" msgstr "無法儲存圖åƒ" #: ../gtk/src/SourceManager.cc:118 ../qt/src/SourceManager.cc:112 msgid "Unable to open files" msgstr "無法開啟檔案" #: ../gtk/src/SourceManager.cc:118 ../qt/src/SourceManager.cc:112 msgid "The following files could not be opened:%1" msgstr "無法開啟下列檔案:%1" #: ../gtk/src/SourceManager.cc:134 ../qt/src/SourceManager.cc:154 msgid "Images and PDFs" msgstr "圖åƒèˆ‡ PDF 檔" #: ../gtk/src/SourceManager.cc:137 ../qt/src/SourceManager.cc:155 msgid "Select Files" msgstr "é¸å–檔案" #: ../gtk/src/SourceManager.cc:143 ../qt/src/SourceManager.cc:166 msgid "Clipboard Error" msgstr "剪貼簿錯誤" #: ../gtk/src/SourceManager.cc:143 ../qt/src/SourceManager.cc:166 msgid "Failed to read the clipboard." msgstr "無法讀å–剪貼簿。" #: ../gtk/src/SourceManager.cc:147 ../qt/src/SourceManager.cc:170 #: ../qt/src/SourceManager.cc:176 msgid "Pasted %1" msgstr "已貼上 %1" #: ../gtk/src/SourceManager.cc:159 ../qt/src/SourceManager.cc:183 msgid "Screenshot Error" msgstr "ç•«é¢æˆªåœ–錯誤" #: ../gtk/src/SourceManager.cc:159 ../qt/src/SourceManager.cc:183 msgid "Failed to take screenshot." msgstr "無法截å–ç•«é¢ã€‚" #: ../gtk/src/SourceManager.cc:163 ../qt/src/SourceManager.cc:187 msgid "Screenshot %1" msgstr "截圖 %1" #: ../gtk/src/SourceManager.cc:168 ../qt/src/SourceManager.cc:192 msgid "Saving image..." msgstr "儲存圖åƒä¸­â€¦â€¦" #: ../gtk/src/SourceManager.cc:175 ../qt/src/SourceManager.cc:205 msgid "Cannot Write File" msgstr "無法寫入檔案" #: ../gtk/src/SourceManager.cc:175 ../qt/src/SourceManager.cc:205 msgid "Could not write to %1." msgstr "無法寫進 %1。" #: ../gtk/src/SourceManager.cc:202 ../qt/src/SourceManager.cc:227 msgid "Delete File?" msgstr "刪除檔案?" #: ../gtk/src/SourceManager.cc:202 ../qt/src/SourceManager.cc:227 msgid "The following files will be deleted:%1" msgstr "下列檔案將會被刪除:%1" #: ../gtk/src/SourceManager.cc:266 ../qt/src/SourceManager.cc:278 msgid "Missing File" msgstr "éºæ¼æª”案" #: ../gtk/src/SourceManager.cc:266 ../qt/src/SourceManager.cc:278 msgid "" "The following file has been deleted or moved:\n" "%1" msgstr "" "下列檔案已被刪除或移除:\n" "%1" #: ../gtk/src/SubstitutionsManager.cc:39 ../qt/src/SubstitutionsManager.cc:77 msgid "Search for" msgstr "尋找" #: ../gtk/src/SubstitutionsManager.cc:40 ../qt/src/SubstitutionsManager.cc:77 msgid "Replace with" msgstr "å–代" #: ../gtk/src/SubstitutionsManager.cc:62 ../qt/src/SubstitutionsManager.cc:99 msgid "substitution_list.txt" msgstr "" #: ../gtk/src/SubstitutionsManager.cc:84 ../gtk/src/SubstitutionsManager.cc:119 #: ../qt/src/SubstitutionsManager.cc:114 ../qt/src/SubstitutionsManager.cc:152 msgid "Substitutions List" msgstr "æ›¿æ›æ¸…å–®" #: ../gtk/src/SubstitutionsManager.cc:85 ../qt/src/SubstitutionsManager.cc:114 msgid "Open Substitutions List" msgstr "é–‹å§‹æ›¿æ›æ¸…å–®" #: ../gtk/src/SubstitutionsManager.cc:90 ../qt/src/SubstitutionsManager.cc:119 msgid "Error Reading File" msgstr "讀案錯誤" #: ../gtk/src/SubstitutionsManager.cc:90 ../qt/src/SubstitutionsManager.cc:119 msgid "Unable to read '%1'." msgstr "ç„¡æ³•è®€å– '%1'。" #: ../gtk/src/SubstitutionsManager.cc:113 ../qt/src/SubstitutionsManager.cc:146 msgid "Errors Occurred Reading File" msgstr "è®€å–æª”案時出ç¾éŒ¯èª¤" #: ../gtk/src/SubstitutionsManager.cc:113 ../qt/src/SubstitutionsManager.cc:146 msgid "Some entries of the substitutions list could not be read." msgstr "ç„¡æ³•è®€å–æ›¿æ›æ¸…單內æŸäº›é …目。" #: ../gtk/src/SubstitutionsManager.cc:120 ../qt/src/SubstitutionsManager.cc:152 msgid "Save Substitutions List" msgstr "å„²å­˜æ›¿æ›æ¸…å–®" #: ../gtk/src/SubstitutionsManager.cc:126 ../qt/src/SubstitutionsManager.cc:158 msgid "Error Saving File" msgstr "存檔錯誤" #: ../gtk/src/SubstitutionsManager.cc:126 ../qt/src/SubstitutionsManager.cc:158 msgid "Unable to write to '%1'." msgstr "無法寫進 '%1'。" #: ../gtk/src/SubstitutionsManager.cc:144 ../qt/src/SubstitutionsManager.cc:172 msgid "Save List?" msgstr "儲存清單?" #: ../gtk/src/SubstitutionsManager.cc:144 ../qt/src/SubstitutionsManager.cc:172 msgid "Do you want to save the current list?" msgstr "是å¦éœ€è¦å„²å­˜ç¾æœ‰æ¸…單?" #: ../gtk/src/SubstitutionsManager.cc:179 ../qt/src/SubstitutionsManager.cc:208 msgid "Applying substitutions..." msgstr "正在套用替æ›å€¼â€¦â€¦" #: ../gtk/src/TessdataManager.cc:58 ../qt/src/TessdataManager.cc:72 msgid "" "PackageKit is required for managing system-wide tesseract language packs, " "but it was not found. Please use the system package management software to " "manage the tesseract language packs, or switch to use the user tessdata path " "in the configuration dialog." msgstr "" "ç®¡ç† tesseract çš„ç³»çµ±èªžè¨€åŒ…é ˆè¦ PackageKit,但它並ä¸å­˜åœ¨ã€‚請利用系統的套件管" "ç†è»Ÿä»¶ä¾†ç®¡ç† tesseract 的語言包,或改用設置é é¢å…§çš„ tessdata 用戶路徑。" #: ../gtk/src/TessdataManager.cc:63 ../qt/src/TessdataManager.cc:77 msgid "Fetching available languages" msgstr "å–å¾—å¯ç”¨èªžè¨€" #: ../gtk/src/TessdataManager.cc:68 ../gtk/src/TessdataManager.cc:89 #: ../gtk/src/TessdataManager.cc:121 ../qt/src/TessdataManager.cc:82 #: ../qt/src/TessdataManager.cc:94 ../qt/src/TessdataManager.cc:127 msgid "Failed to fetch list of available languages: %1" msgstr "無法å–å¾—å¯ç”¨èªžè¨€çš„æ¸…單:%1" #: ../gtk/src/TessdataManager.cc:100 ../gtk/src/TessdataManager.cc:129 #: ../qt/src/TessdataManager.cc:105 ../qt/src/TessdataManager.cc:114 #: ../qt/src/TessdataManager.cc:136 ../qt/src/TessdataManager.cc:147 msgid "Parsing error: %1" msgstr "剖æžéŒ¯èª¤ï¼š%1" #: ../gtk/src/TessdataManager.cc:191 ../qt/src/TessdataManager.cc:191 msgid "Applying changes..." msgstr "正在套用改動……" #: ../gtk/src/TessdataManager.cc:252 ../qt/src/TessdataManager.cc:237 msgid "Failed to create directory for tessdata files." msgstr "無法為 tessdata 檔建立目錄" #: ../gtk/src/TessdataManager.cc:261 ../qt/src/TessdataManager.cc:245 msgid "Downloading %1..." msgstr "正在下載 %1……" #: ../gtk/src/TessdataManager.cc:281 ../qt/src/TessdataManager.cc:267 msgid "" "The following files could not be downloaded or removed:\n" "%1\n" "\n" "Check the connectivity and directory permissions." msgstr "" "無法下載或刪除下列檔案:\n" "%1\n" "\n" "請檢查連線åŠç›®éŒ„權é™ã€‚" #: ../gtk/src/Utils.cc:62 msgid "Yes" msgstr "是" #: ../gtk/src/Utils.cc:65 msgid "No" msgstr "å¦" #: ../gtk/src/Utils.cc:74 msgid "Discard" msgstr "棄置" #: ../qt/data/AboutDialog.ui.h:1 msgid "About gImageReader" msgstr "有關 gImageReader" #: ../qt/data/AboutDialog.ui.h:3 #, fuzzy msgid "" "

 

A graphical frontend to tesseract-ocr

Website

 

" msgstr "" "

 

tesseract-ocr 的圖åƒä»‹é¢

網站

 

" #: ../qt/data/AboutDialog.ui.h:4 msgid "Credits" msgstr "歸功於" #: ../qt/data/AboutDialog.ui.h:5 msgid "License" msgstr "æ¢æ¬¾" #: ../qt/data/ConfigDialog.ui.h:14 msgid "System encoding" msgstr "系統編碼" #: ../qt/data/ConfigDialog.ui.h:15 msgid "UTF-8" msgstr "" #: ../qt/data/ConfigDialog.ui.h:19 msgid "Text file encoding:" msgstr "文字檔編碼:" #: ../qt/data/CrashHandler.ui.h:2 #, fuzzy, no-c-format msgid "" "

The application has " "crashed

Apologies for the inconvenience. To help improve the " "application, please consider reporting the issue to manisandro@gmail.com. Please try to describe what you were doing before the application " "crashed. Also, include the information below. Thank you.

" msgstr "" "我們為帶來的ä¸ä¾¿è€Œé“æ­‰ã€‚å¦‚ä½ æœ‰æ„æ”¹å–„此程å¼ï¼Œè«‹è€ƒæ…®å°‡å•題匯報給manisandro@gmail.com。請嘗試æè¿°ä½ åœ¨ç¨‹å¼çµ‚æ­¢å‰æ‰€åšçš„事情。å¦å¤–,請一併" "附上下列資料。è¬è¬ã€‚" #: ../qt/data/MainWindow.ui.h:1 msgid "gImageReader" msgstr "" #. Remove & from some labels which designer insists in adding #: ../qt/data/MainWindow.ui.h:17 ../qt/src/Ui_MainWindow.hh:49 msgid "Sources" msgstr "來æº" #: ../qt/data/MainWindow.ui.h:18 msgid "Zoom In" msgstr "放大" #: ../qt/data/MainWindow.ui.h:20 msgid "Zoom Out" msgstr "縮å°" #: ../qt/data/MainWindow.ui.h:22 msgid "Normal Size" msgstr "正常大å°" #: ../qt/data/MainWindow.ui.h:24 msgid "Best Fit" msgstr "最佳大å°" #: ../qt/data/MainWindow.ui.h:26 msgid "Rotate Left" msgstr "å‘左旋轉" #: ../qt/data/MainWindow.ui.h:27 msgid "Rotate left" msgstr "å‘左旋轉" #: ../qt/data/MainWindow.ui.h:28 msgid "Rotate Right" msgstr "å‘峿—‹è½‰" #: ../qt/data/MainWindow.ui.h:29 msgid "Rotate right" msgstr "å‘峿—‹è½‰" #: ../qt/data/MainWindow.ui.h:30 msgid "Image Controls" msgstr "åœ–åƒæŽ§åˆ¶" #: ../qt/data/MainWindow.ui.h:32 msgid "Autodetect Layout" msgstr "è‡ªå‹•åµæ¸¬ä½ˆå±€" #: ../qt/data/MainWindow.ui.h:34 msgid "Toggle Output Pane" msgstr "切æ›è¼¸å‡ºé¢æ¿" #: ../qt/src/MainWindow.cc:518 msgid "Could not read %1: %2" msgstr "ç„¡æ³•è®€å– %1:%2。" #: ../qt/src/MainWindow.cc:543 msgid "The following dictionary files were installed:%1" msgstr "已安è£ä¸‹åˆ—詞典檔:%1" #: ../qt/src/Ui_MainWindow.hh:50 msgid "Output" msgstr "輸出:" #: ../qt/src/Ui_MainWindow.hh:133 msgid "OCR mode:" msgstr "OCR 模å¼ï¼š" #: ../qt/src/Ui_MainWindow.hh:204 msgid "Remove Image" msgstr "移除圖åƒ" #: ../qt/src/Ui_MainWindow.hh:207 msgid "Delete Image" msgstr "刪除圖åƒ" #: ../qt/src/Ui_MainWindow.hh:210 msgid "Clear List" msgstr "清除清單" #. Output toolbar #: ../qt/src/Ui_OutputEditorHOCR.hh:39 ../qt/src/Ui_OutputEditorHOCR.hh:40 msgid "Open hOCR file" msgstr "開啟 hOCR 檔" #: ../qt/src/Ui_OutputEditorHOCR.hh:41 ../qt/src/Ui_OutputEditorHOCR.hh:42 msgid "Save as hOCR text" msgstr "儲存為 hOCR 文字" #: ../qt/src/Ui_OutputEditorText.hh:108 msgid "Strip Line Breaks" msgstr "去除æ›è¡Œç¬¦è™Ÿ" #: ../qt/src/Ui_OutputEditorText.hh:113 msgid "Find and Replace" msgstr "尋找åŠå–代" #: ../qt/src/Ui_OutputEditorText.hh:122 msgid "Save Output" msgstr "儲存輸出" #: ../qt/src/Ui_OutputEditorText.hh:124 msgid "Clear Output" msgstr "清除輸出" #, fuzzy #~ msgid "" #~ "<html><head/><body><p><span style=" font-" #~ "weight:600;">The application has crashed</span></p>" #~ "<p>Apologies for the inconvenience. To help improve the " #~ "application, please consider reporting the issue to <a href="" #~ "mailto:manisandro@gmail.com?subject=gImageReader%20Crash">" #~ "manisandro@gmail.com</a>. Please try to describe what you were " #~ "doing before the application crashed. Also, include the information " #~ "below. Thank you.</p></body></html>" #~ msgstr "" #~ "

此應用程å¼å·²ç•°å¸¸çµ‚" #~ "æ­¢

我們為帶來的ä¸ä¾¿è€Œé“æ­‰ã€‚å¦‚ä½ æœ‰æ„æ”¹å–„此程å¼ï¼Œè«‹è€ƒæ…®å°‡å•題匯" #~ "報給manisandro@gmail.com。請嘗試æè¿°ä½ åœ¨ç¨‹å¼çµ‚æ­¢å‰æ‰€åšçš„事情。å¦å¤–,請" #~ "一併附上下列資料。è¬è¬ã€‚

" #, fuzzy #~ msgid "" #~ "<small><b>Example:</b> 1-10, 13, 14-18</small>" #~ msgstr "例如: 1-10, 13, 14-18" gImageReader-3.2.3/po/zh_TW.po000066400000000000000000001410061312567024200160500ustar00rootroot00000000000000# Traditional Chinese (Taiwan) translations for gImageReader package # Copyright (C) 2017 THE GIMAGEREADER'S COPYRIGHT HOLDER # This file is distributed under the same license as the gImageReader package. # # Timothy Lee , 2017. # Sandro Mani , 2016, 2017. msgid "" msgstr "" "Project-Id-Version: \n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2017-07-01 10:34+0200\n" "PO-Revision-Date: 2017-06-30 20:12+0100\n" "Last-Translator: Sandro Mani \n" "Language-Team: Chinese \n" "Language: zh_TW\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" "X-Generator: Lokalize 2.0\n" #: ../gtk/data/appmenu.ui.h:1 ../qt/src/Ui_MainWindow.hh:165 msgid "Redetect Languages" msgstr "釿–°åµæ¸¬èªžè¨€" #: ../gtk/data/appmenu.ui.h:2 ../gtk/data/gimagereader.ui.h:39 #: ../qt/data/ConfigDialog.ui.h:1 ../qt/src/Ui_MainWindow.hh:168 msgid "Preferences" msgstr "é¸é …" #: ../gtk/data/appmenu.ui.h:3 ../gtk/data/gimagereader.ui.h:40 #: ../gtk/src/MainWindow.cc:484 ../qt/src/MainWindow.cc:445 #: ../qt/src/Ui_MainWindow.hh:173 msgid "Help" msgstr "å”助" #: ../gtk/data/appmenu.ui.h:4 ../qt/data/AboutDialog.ui.h:2 #: ../qt/src/Ui_MainWindow.hh:176 msgid "About" msgstr "關於" #: ../gtk/data/appmenu.ui.h:5 msgid "Quit" msgstr "離開" #: ../gtk/data/crashhandler.ui.h:1 ../qt/src/CrashHandler.cc:36 msgid "Regenerate backtrace" msgstr "é‡å»º backtrace" #: ../gtk/data/crashhandler.ui.h:2 msgid "The application has crashed" msgstr "應用程å¼å·²ç•°å¸¸çµ‚æ­¢" #: ../gtk/data/crashhandler.ui.h:4 #, no-c-format msgid "" "Apologies for the inconvenience. To help improve the application, please " "consider reporting the issue to manisandro@gmail.com. Please try to " "describe what you were doing before the application crashed. Also, include " "the information below. Thank you." msgstr "" "我們為帶來的ä¸ä¾¿è€Œé“æ­‰ã€‚å¦‚ä½ æœ‰æ„æ”¹å–„此程å¼ï¼Œè«‹è€ƒæ…®å°‡å•題匯報給manisandro@gmail.com。請嘗試æè¿°ä½ åœ¨ç¨‹å¼çµ‚æ­¢å‰æ‰€åšçš„事情。å¦å¤–,請一併" "附上下列資料。è¬è¬ã€‚" #: ../gtk/data/editor_hocr.ui.h:1 ../qt/data/PdfExportDialog.ui.h:1 msgid "PDF Export" msgstr "匯出 PDF" #: ../gtk/data/editor_hocr.ui.h:2 ../gtk/data/gimagereader.ui.h:55 #: ../gtk/src/Acquirer.cc:42 ../gtk/src/FileDialogs.cc:150 #: ../gtk/src/Utils.cc:68 ../qt/data/ConfigDialog.ui.h:27 #: ../qt/data/MainWindow.ui.h:14 msgid "Cancel" msgstr "å–æ¶ˆ" #: ../gtk/data/editor_hocr.ui.h:3 ../gtk/data/gimagereader.ui.h:41 #: ../gtk/src/FileDialogs.cc:151 ../gtk/src/Utils.cc:59 #: ../qt/data/ConfigDialog.ui.h:26 msgid "OK" msgstr "確定" #: ../gtk/data/editor_hocr.ui.h:4 ../qt/data/PdfExportDialog.ui.h:2 msgid "Output mode:" msgstr "輸出模å¼ï¼š" #: ../gtk/data/editor_hocr.ui.h:5 ../qt/data/PdfExportDialog.ui.h:3 msgid "PDF" msgstr "PDF" #: ../gtk/data/editor_hocr.ui.h:6 ../qt/data/PdfExportDialog.ui.h:4 msgid "PDF with invisible text overlay" msgstr "包å«éš±å½¢æ–‡å­—層的 PDF" #: ../gtk/data/editor_hocr.ui.h:7 ../qt/data/PdfExportDialog.ui.h:16 msgid "Format:" msgstr "æ ¼å¼ï¼š" #: ../gtk/data/editor_hocr.ui.h:8 ../qt/data/PdfExportDialog.ui.h:17 msgid "Compression:" msgstr "壓縮:" #: ../gtk/data/editor_hocr.ui.h:9 ../qt/data/PdfExportDialog.ui.h:14 msgid "Compression quality:" msgstr "壓縮å“質:" #: ../gtk/data/editor_hocr.ui.h:10 ../qt/data/PdfExportDialog.ui.h:15 msgid "DPI:" msgstr "DPI:" #: ../gtk/data/editor_hocr.ui.h:11 ../qt/data/PdfExportDialog.ui.h:18 msgid "Dithering algorithm:" msgstr "éžè‰²æ¼”算法:" #: ../gtk/data/editor_hocr.ui.h:12 ../qt/data/PdfExportDialog.ui.h:13 msgid "Image settings:" msgstr "圖åƒè¨­å®šï¼š" #: ../gtk/data/editor_hocr.ui.h:13 ../qt/data/PdfExportDialog.ui.h:11 msgid "Document font:" msgstr "文件字型:" #: ../gtk/data/editor_hocr.ui.h:14 ../qt/data/PdfExportDialog.ui.h:7 msgid "Uniformize line and word spacing" msgstr "統一行è·åŠå­—è·" #: ../gtk/data/editor_hocr.ui.h:15 ../qt/data/PdfExportDialog.ui.h:10 msgid "Use detected font sizes" msgstr "æŽ¡ç”¨åµæ¸¬åˆ°çš„字型大å°" #: ../gtk/data/editor_hocr.ui.h:16 ../qt/data/PdfExportDialog.ui.h:8 msgid "Preserve spaces wider than:" msgstr "ä¿ç•™ç©ºæ ¼å¤§æ–¼ï¼š" #: ../gtk/data/editor_hocr.ui.h:17 ../qt/data/PdfExportDialog.ui.h:12 msgid "characters" msgstr "å­—å…ƒ" #: ../gtk/data/editor_hocr.ui.h:18 ../qt/data/PdfExportDialog.ui.h:9 msgid "Scale:" msgstr "等級:" #: ../gtk/data/editor_hocr.ui.h:19 ../qt/data/PdfExportDialog.ui.h:6 msgid "Text settings:" msgstr "文字檔設定:" #: ../gtk/data/editor_hocr.ui.h:20 ../qt/data/PdfExportDialog.ui.h:5 msgid "Show preview" msgstr "顯示é è¦½" #: ../gtk/data/editor_hocr.ui.h:21 ../gtk/data/editor_text.ui.h:26 #: ../qt/src/Ui_OutputEditorText.hh:123 msgid "Save output" msgstr "儲存輸出" #: ../gtk/data/editor_hocr.ui.h:22 ../qt/src/Ui_OutputEditorHOCR.hh:44 #: ../qt/src/Ui_OutputEditorHOCR.hh:45 msgid "Export to PDF" msgstr "匯出至 PDF" #: ../gtk/data/editor_hocr.ui.h:23 ../gtk/data/editor_text.ui.h:27 #: ../qt/src/Ui_OutputEditorHOCR.hh:47 ../qt/src/Ui_OutputEditorHOCR.hh:48 #: ../qt/src/Ui_OutputEditorText.hh:125 msgid "Clear output" msgstr "清除輸出" #: ../gtk/data/editor_hocr.ui.h:24 ../qt/src/Ui_OutputEditorHOCR.hh:75 msgid "Properties" msgstr "屬性" #: ../gtk/data/editor_hocr.ui.h:25 ../qt/src/Ui_OutputEditorHOCR.hh:79 msgid "Source" msgstr "來æº" #. Output insert mode #: ../gtk/data/editor_text.ui.h:1 ../qt/src/Ui_OutputEditorText.hh:59 msgid "Append to current text" msgstr "é™„åŠ åˆ°ç¾æœ‰æ–‡å­—" #: ../gtk/data/editor_text.ui.h:2 ../qt/src/Ui_OutputEditorText.hh:60 msgid "Insert at cursor" msgstr "於游標ä½ç½®æ’å…¥" #: ../gtk/data/editor_text.ui.h:3 ../qt/src/Ui_OutputEditorText.hh:61 msgid "Replace current text" msgstr "å–ä»£ç¾æœ‰æ–‡å­—" #: ../gtk/data/editor_text.ui.h:4 ../qt/src/SubstitutionsManager.cc:37 #: ../qt/src/Ui_OutputEditorText.hh:177 msgid "Substitutions" msgstr "替æ›å€¼" #: ../gtk/data/editor_text.ui.h:5 ../qt/src/SubstitutionsManager.cc:42 #: ../qt/src/SubstitutionsManager.cc:43 msgid "Open" msgstr "開啟" #: ../gtk/data/editor_text.ui.h:6 ../gtk/src/Utils.cc:71 #: ../qt/src/SubstitutionsManager.cc:45 ../qt/src/SubstitutionsManager.cc:46 msgid "Save" msgstr "儲存" #: ../gtk/data/editor_text.ui.h:7 ../qt/src/SubstitutionsManager.cc:48 #: ../qt/src/SubstitutionsManager.cc:49 msgid "Clear" msgstr "清除" #: ../gtk/data/editor_text.ui.h:8 ../qt/data/ConfigDialog.ui.h:16 #: ../qt/src/SubstitutionsManager.cc:51 ../qt/src/SubstitutionsManager.cc:52 msgid "Add" msgstr "新增" #: ../gtk/data/editor_text.ui.h:9 ../gtk/src/OutputEditorHOCR.cc:1202 #: ../gtk/src/OutputEditorHOCR.cc:1213 ../qt/data/ConfigDialog.ui.h:17 #: ../qt/src/OutputEditorHOCR.cc:998 ../qt/src/OutputEditorHOCR.cc:1000 #: ../qt/src/SubstitutionsManager.cc:54 ../qt/src/SubstitutionsManager.cc:55 msgid "Remove" msgstr "刪除" #: ../gtk/data/editor_text.ui.h:10 ../gtk/data/gimagereader.ui.h:73 msgid "Apply" msgstr "應用" #: ../gtk/data/editor_text.ui.h:11 ../gtk/data/gimagereader.ui.h:74 msgid "Close" msgstr "關閉" #. Output postprocessing #: ../gtk/data/editor_text.ui.h:12 ../qt/src/Ui_OutputEditorText.hh:69 msgid "Keep line break if..." msgstr "ä¿ç•™æ›è¡Œç¬¦è™Ÿï¼Œå¦‚果……" #: ../gtk/data/editor_text.ui.h:13 ../qt/src/Ui_OutputEditorText.hh:71 msgid "Preceded by end mark (.?!)" msgstr "以終çµè™Ÿèµ·é¦–(.?!)" #: ../gtk/data/editor_text.ui.h:14 ../qt/src/Ui_OutputEditorText.hh:73 msgid "Preceded or succeeded by quote" msgstr "以引號起首或çµå°¾" #: ../gtk/data/editor_text.ui.h:15 ../qt/src/Ui_OutputEditorText.hh:75 msgid "Other options" msgstr "å…¶ä»–é¸é …" #: ../gtk/data/editor_text.ui.h:16 ../qt/src/Ui_OutputEditorText.hh:77 msgid "Join hyphenated words" msgstr "連接斷字符號å‰å¾Œçš„å­—" #: ../gtk/data/editor_text.ui.h:17 ../qt/src/Ui_OutputEditorText.hh:79 msgid "Collapse whitespace" msgstr "åˆä½µç©ºæ ¼" #: ../gtk/data/editor_text.ui.h:18 ../qt/src/Ui_OutputEditorText.hh:81 msgid "Preserve paragraphs" msgstr "ä¿ç•™æ®µè½" #: ../gtk/data/editor_text.ui.h:19 ../qt/src/Ui_OutputEditorText.hh:83 msgid "Visual aids" msgstr "視覺輔助" #: ../gtk/data/editor_text.ui.h:20 ../qt/src/Ui_OutputEditorText.hh:85 msgid "Draw whitespace" msgstr "繪畫空格" #: ../gtk/data/editor_text.ui.h:21 ../gtk/data/gimagereader.ui.h:31 #: ../qt/src/Ui_OutputEditorText.hh:102 msgid "Select insert mode" msgstr "é¸ç”¨æ’入模å¼" #: ../gtk/data/editor_text.ui.h:22 ../qt/src/Ui_OutputEditorText.hh:109 msgid "Strip line breaks on selected text" msgstr "去除é¸å–文字的æ›è¡Œç¬¦è™Ÿ" #: ../gtk/data/editor_text.ui.h:23 ../qt/src/Ui_OutputEditorText.hh:114 msgid "Find and replace" msgstr "æœå°‹åŠå–代" #: ../gtk/data/editor_text.ui.h:24 ../qt/src/Ui_OutputEditorText.hh:116 #: ../qt/src/Ui_OutputEditorText.hh:117 msgid "Undo" msgstr "復原" #: ../gtk/data/editor_text.ui.h:25 ../qt/src/Ui_OutputEditorText.hh:119 #: ../qt/src/Ui_OutputEditorText.hh:120 msgid "Redo" msgstr "é‡åš" #: ../gtk/data/editor_text.ui.h:28 ../qt/src/Ui_OutputEditorText.hh:149 msgid "Find" msgstr "尋找" #: ../gtk/data/editor_text.ui.h:29 ../qt/src/Ui_OutputEditorText.hh:153 #: ../qt/src/Ui_OutputEditorText.hh:168 msgid "Replace" msgstr "å–代" #: ../gtk/data/editor_text.ui.h:30 ../qt/src/Ui_OutputEditorText.hh:173 msgid "Replace all" msgstr "全部å–代" #: ../gtk/data/editor_text.ui.h:31 ../qt/src/Ui_OutputEditorText.hh:163 msgid "Find previous" msgstr "尋找å‰ä¸€å€‹" #: ../gtk/data/editor_text.ui.h:32 ../qt/src/Ui_OutputEditorText.hh:158 msgid "Find next" msgstr "尋找下一個" #: ../gtk/data/editor_text.ui.h:33 ../qt/src/Ui_OutputEditorText.hh:182 msgid "Match case" msgstr "大å°å¯«å»åˆ" #: ../gtk/data/gimagereader.ui.h:1 ../qt/src/Ui_MainWindow.hh:65 msgid "Rotate current page" msgstr "æ—‹è½‰ç¾æœ‰æ–‡å­—" #: ../gtk/data/gimagereader.ui.h:2 ../qt/src/Ui_MainWindow.hh:66 msgid "Rotate all pages" msgstr "旋轉所有é é¢" #: ../gtk/data/gimagereader.ui.h:3 ../qt/data/MainWindow.ui.h:35 msgid "Toggle output pane" msgstr "切æ›è¼¸å‡ºé¢æ¿" #. Sources toolbar #: ../gtk/data/gimagereader.ui.h:4 ../qt/src/Ui_MainWindow.hh:187 msgid "Recent" msgstr "最近" #: ../gtk/data/gimagereader.ui.h:5 ../qt/src/Ui_MainWindow.hh:188 msgid "Paste" msgstr "貼上" #: ../gtk/data/gimagereader.ui.h:6 ../qt/src/Ui_MainWindow.hh:189 msgid "Take Screenshot" msgstr "ç•«é¢æˆªåœ–" #: ../gtk/data/gimagereader.ui.h:7 ../qt/src/Ui_MainWindow.hh:200 msgid "Add images" msgstr "新增圖åƒ" #: ../gtk/data/gimagereader.ui.h:8 ../qt/src/Ui_MainWindow.hh:199 msgid "Add Images" msgstr "新增圖åƒ" #: ../gtk/data/gimagereader.ui.h:9 ../qt/src/Ui_MainWindow.hh:205 msgid "Remove image from list" msgstr "從清單移除圖åƒ" #: ../gtk/data/gimagereader.ui.h:10 ../qt/src/Ui_MainWindow.hh:208 msgid "Delete image" msgstr "刪除圖åƒ" #: ../gtk/data/gimagereader.ui.h:11 ../qt/src/Ui_MainWindow.hh:211 msgid "Clear list" msgstr "清除清單" #: ../gtk/data/gimagereader.ui.h:12 ../qt/data/MainWindow.ui.h:6 msgid "Files" msgstr "檔案" #: ../gtk/data/gimagereader.ui.h:13 ../qt/data/MainWindow.ui.h:16 msgid "Device:" msgstr "è£ç½®ï¼š" #: ../gtk/data/gimagereader.ui.h:14 ../qt/data/MainWindow.ui.h:15 #: ../qt/src/TessdataManager.cc:57 msgid "Refresh" msgstr "æ›´æ–°" #: ../gtk/data/gimagereader.ui.h:15 ../qt/data/MainWindow.ui.h:12 msgid "Output:" msgstr "輸出:" #: ../gtk/data/gimagereader.ui.h:16 ../qt/data/MainWindow.ui.h:9 msgid "Mode:" msgstr "模å¼ï¼š" #: ../gtk/data/gimagereader.ui.h:17 ../gtk/src/OutputEditorHOCR.cc:362 #: ../qt/data/MainWindow.ui.h:11 ../qt/src/OutputEditorHOCR.cc:273 msgid "Color" msgstr "彩色" #: ../gtk/data/gimagereader.ui.h:18 ../gtk/src/OutputEditorHOCR.cc:365 #: ../qt/data/MainWindow.ui.h:10 ../qt/src/OutputEditorHOCR.cc:275 #: ../qt/src/OutputEditorHOCR.cc:277 msgid "Grayscale" msgstr "ç°éšŽ" #: ../gtk/data/gimagereader.ui.h:19 ../qt/data/MainWindow.ui.h:8 msgid "Resolution:" msgstr "è§£åƒåº¦ï¼š" #: ../gtk/data/gimagereader.ui.h:20 ../qt/data/MainWindow.ui.h:13 msgid "Scan" msgstr "掃æ" #: ../gtk/data/gimagereader.ui.h:21 ../qt/data/MainWindow.ui.h:7 msgid "Acquire" msgstr "æ“·å–" #: ../gtk/data/gimagereader.ui.h:22 ../qt/data/MainWindow.ui.h:2 msgid "Brightness" msgstr "亮度" #: ../gtk/data/gimagereader.ui.h:23 ../qt/data/MainWindow.ui.h:3 msgid "Contrast" msgstr "å°æ¯”" #: ../gtk/data/gimagereader.ui.h:24 ../qt/data/MainWindow.ui.h:4 msgid "Resolution" msgstr "è§£åƒåº¦" #: ../gtk/data/gimagereader.ui.h:25 ../qt/data/MainWindow.ui.h:5 msgid "Invert colors" msgstr "å轉色版" #: ../gtk/data/gimagereader.ui.h:26 ../qt/data/MainWindow.ui.h:19 msgid "Zoom in" msgstr "放大" #: ../gtk/data/gimagereader.ui.h:27 ../qt/data/MainWindow.ui.h:21 msgid "Zoom out" msgstr "縮å°" #: ../gtk/data/gimagereader.ui.h:28 ../qt/data/MainWindow.ui.h:23 msgid "Normal size" msgstr "正常大å°" #: ../gtk/data/gimagereader.ui.h:29 ../qt/data/MainWindow.ui.h:25 msgid "Best fit" msgstr "最佳大å°" #: ../gtk/data/gimagereader.ui.h:30 ../qt/src/Ui_MainWindow.hh:74 msgid "Select rotation mode" msgstr "é¸å–旋轉模å¼" #: ../gtk/data/gimagereader.ui.h:32 ../qt/data/MainWindow.ui.h:31 msgid "Image controls" msgstr "åœ–åƒæŽ§åˆ¶" #: ../gtk/data/gimagereader.ui.h:33 ../qt/src/Ui_MainWindow.hh:137 msgid "Plain text" msgstr "純文字" #: ../gtk/data/gimagereader.ui.h:34 ../qt/src/Ui_MainWindow.hh:137 msgid "hOCR, PDF" msgstr "hOCRã€PDF" #: ../gtk/data/gimagereader.ui.h:35 ../qt/data/MainWindow.ui.h:33 msgid "Autodetect layout" msgstr "è‡ªå‹•åµæ¸¬ä½ˆå±€" #: ../gtk/data/gimagereader.ui.h:36 msgid "Recognize all" msgstr "辨èªå…¨éƒ¨" #: ../gtk/data/gimagereader.ui.h:37 msgid "Select language" msgstr "é¸å–語言" #: ../gtk/data/gimagereader.ui.h:38 msgid "A graphical frontend to tesseract-ocr" msgstr "tesseract-ocr 的圖åƒä»‹é¢" #: ../gtk/data/gimagereader.ui.h:42 msgid "Output pane orientation:" msgstr "è¼¸å‡ºé¢æ¿çš„æ–¹å‘:" #: ../gtk/data/gimagereader.ui.h:43 msgid "Horizontal" msgstr "æ©«å‘" #: ../gtk/data/gimagereader.ui.h:44 msgid "Vertical" msgstr "縱å‘" #: ../gtk/data/gimagereader.ui.h:45 ../qt/data/ConfigDialog.ui.h:18 msgid "Query to install missing spellcheck dictionaries" msgstr "æŸ¥æ‰¾éºæ¼å®‰è£çš„æ‹¼å­—詞典" #: ../gtk/data/gimagereader.ui.h:46 ../qt/data/ConfigDialog.ui.h:4 msgid "Automatically check for new program versions" msgstr "自動檢查新版本" #: ../gtk/data/gimagereader.ui.h:47 ../qt/data/ConfigDialog.ui.h:3 msgid "Predefined language definitions:" msgstr "é è¨­èªžè¨€å®šç¾©ï¼š" #: ../gtk/data/gimagereader.ui.h:48 ../qt/data/ConfigDialog.ui.h:12 msgid "Additional language definitions:" msgstr "é¡å¤–語言定義:" #: ../gtk/data/gimagereader.ui.h:49 ../qt/data/ConfigDialog.ui.h:20 msgid "The prefix of the tesseract language data file" msgstr "tesseract 語言資料檔的å‰ç½®" #: ../gtk/data/gimagereader.ui.h:50 ../qt/data/ConfigDialog.ui.h:21 msgid "Prefix" msgstr "å‰ç½®" #: ../gtk/data/gimagereader.ui.h:51 ../qt/data/ConfigDialog.ui.h:22 msgid "The ISO 639-1 language code followed by the country code" msgstr "ISO 639-1 語言代碼並國家代碼" #: ../gtk/data/gimagereader.ui.h:52 ../qt/data/ConfigDialog.ui.h:23 msgid "ISO Code" msgstr "ISO 代碼" #: ../gtk/data/gimagereader.ui.h:53 ../qt/data/ConfigDialog.ui.h:24 msgid "The name of the language" msgstr "語言å稱" #: ../gtk/data/gimagereader.ui.h:54 ../qt/data/ConfigDialog.ui.h:25 msgid "Name" msgstr "å稱" #: ../gtk/data/gimagereader.ui.h:56 ../qt/data/ConfigDialog.ui.h:5 msgid "Output pane font:" msgstr "è¼¸å‡ºé¢æ¿å­—型:" #: ../gtk/data/gimagereader.ui.h:57 ../qt/data/ConfigDialog.ui.h:2 msgid "Default" msgstr "é è¨­å€¼" #: ../gtk/data/gimagereader.ui.h:58 ../qt/data/ConfigDialog.ui.h:6 msgid "Language data locations:" msgstr "語言資料ä½ç½®ï¼š" #: ../gtk/data/gimagereader.ui.h:59 ../qt/data/ConfigDialog.ui.h:13 msgid "Language definitions path:" msgstr "語言定義路徑:" #: ../gtk/data/gimagereader.ui.h:60 ../qt/data/ConfigDialog.ui.h:28 msgid "Spelling dictionaries path:" msgstr "拼字詞典路徑:" #: ../gtk/data/gimagereader.ui.h:61 ../qt/data/ConfigDialog.ui.h:10 msgid "System-wide paths" msgstr "系統路徑" #: ../gtk/data/gimagereader.ui.h:62 ../qt/data/ConfigDialog.ui.h:11 msgid "User paths" msgstr "用戶路徑" #: ../gtk/data/gimagereader.ui.h:63 ../qt/data/PageRangeDialog.ui.h:1 msgid "Page Range" msgstr "é é¢ç¯„åœ" #: ../gtk/data/gimagereader.ui.h:64 ../qt/data/PageRangeDialog.ui.h:2 msgid "Page range:" msgstr "é é¢ç¯„åœï¼š" #: ../gtk/data/gimagereader.ui.h:65 ../qt/data/PageRangeDialog.ui.h:3 msgid "Example: 1-10, 13, 14-18" msgstr "例如: 1-10, 13, 14-18" #: ../gtk/data/gimagereader.ui.h:66 ../qt/data/PageRangeDialog.ui.h:4 msgid "Recognition area:" msgstr "辨èªå€åŸŸï¼š" #: ../gtk/data/gimagereader.ui.h:67 ../gtk/src/Recognizer.cc:403 #: ../qt/data/PageRangeDialog.ui.h:5 ../qt/src/Recognizer.cc:381 msgid "Entire page" msgstr "æ•´é " #: ../gtk/data/gimagereader.ui.h:68 ../qt/data/PageRangeDialog.ui.h:6 msgid "Autodetect" msgstr "è‡ªå‹•åµæ¸¬" #: ../gtk/data/gimagereader.ui.h:69 ../qt/data/PageRangeDialog.ui.h:7 #, fuzzy msgid "Prepend to output text:" msgstr "é™„åŠ åˆ°ç¾æœ‰æ–‡å­—" #: ../gtk/data/gimagereader.ui.h:70 ../qt/data/PageRangeDialog.ui.h:8 msgid "Source filename" msgstr "" #: ../gtk/data/gimagereader.ui.h:71 ../qt/data/PageRangeDialog.ui.h:9 #, fuzzy msgid "Source page" msgstr "來æº" #: ../gtk/data/gimagereader.ui.h:72 ../qt/src/TessdataManager.cc:47 msgid "Tessdata Manager" msgstr "Tessdata 管ç†å“¡" #: ../gtk/data/gimagereader.ui.h:75 ../qt/src/TessdataManager.cc:49 msgid "Manage installed languages:" msgstr "管ç†å·²å®‰è£çš„語言:" #: ../gtk/data/gimagereader.ui.h:76 ../qt/src/DisplayerToolSelect.cc:240 msgid "Delete" msgstr "刪除" #: ../gtk/data/gimagereader.ui.h:77 ../qt/src/DisplayerToolSelect.cc:226 msgid "Order:" msgstr "排åºï¼š" #: ../gtk/data/gimagereader.ui.h:78 ../gtk/src/DisplayerToolHOCR.cc:28 #: ../qt/src/DisplayerToolHOCR.cc:30 ../qt/src/DisplayerToolSelect.cc:241 msgid "Recognize" msgstr "辨èª" #: ../gtk/data/gimagereader.ui.h:79 ../qt/src/DisplayerToolSelect.cc:242 msgid "Recognize to clipboard" msgstr "辨èªè‡³å‰ªè²¼ç°¿" #: ../gtk/data/gimagereader.ui.h:80 ../qt/src/DisplayerToolSelect.cc:243 msgid "Save as image" msgstr "儲存為圖åƒ" #: ../gtk/data/gimagereader.ui.h:81 ../qt/src/Recognizer.cc:76 msgid "Current Page" msgstr "ç¾æ™‚é é¢" #: ../gtk/data/gimagereader.ui.h:82 ../qt/src/Recognizer.cc:79 msgid "Multiple Pages..." msgstr "多é â€¦â€¦" #: ../gtk/src/Acquirer.cc:83 ../qt/src/Acquirer.cc:63 msgid "scan.png" msgstr "" #: ../gtk/src/Acquirer.cc:96 ../qt/src/Acquirer.cc:80 msgid "Images" msgstr "圖åƒ" #: ../gtk/src/Acquirer.cc:97 ../qt/src/Acquirer.cc:81 msgid "Choose Output Filename..." msgstr "é¸å–輸出檔å……" #: ../gtk/src/Acquirer.cc:112 ../qt/src/Acquirer.cc:96 msgid "Failed to initialize the scanning backend." msgstr "無法åˆå§‹åŒ–æŽƒææœå‹™ã€‚" #: ../gtk/src/Acquirer.cc:121 ../qt/src/Acquirer.cc:102 msgid "Scan failed" msgstr "無法摺掃æ" #: ../gtk/src/Acquirer.cc:139 ../qt/src/Acquirer.cc:118 msgid "No scanners were detected." msgstr "嵿¸¬ä¸åˆ°æŽƒæå™¨ã€‚" #: ../gtk/src/Acquirer.cc:156 ../gtk/src/Acquirer.cc:173 #: ../qt/src/Acquirer.cc:132 ../qt/src/Acquirer.cc:149 msgid "Starting scan..." msgstr "開始掃æâ€¦â€¦" #: ../gtk/src/Acquirer.cc:169 ../qt/src/Acquirer.cc:145 msgid "Opening device..." msgstr "開啟è£ç½®â€¦â€¦" #: ../gtk/src/Acquirer.cc:171 ../qt/src/Acquirer.cc:147 msgid "Setting options..." msgstr "設定é¸é ………" #: ../gtk/src/Acquirer.cc:175 ../qt/src/Acquirer.cc:151 msgid "Getting parameters..." msgstr "ç²å–åƒæ•¸â€¦â€¦" #: ../gtk/src/Acquirer.cc:177 ../qt/src/Acquirer.cc:153 msgid "Transferring data..." msgstr "轉輸數據……" #: ../gtk/src/Acquirer.cc:184 ../qt/src/Acquirer.cc:160 msgid "Canceling scan..." msgstr "å–æ¶ˆæŽƒæâ€¦â€¦" #: ../gtk/src/Config.cc:297 ../qt/data/ConfigDialog.ui.h:7 msgid "Filename prefix" msgstr "檔åå‰ç½®" #: ../gtk/src/Config.cc:298 ../qt/data/ConfigDialog.ui.h:8 msgid "Code" msgstr "代碼" #: ../gtk/src/Config.cc:299 ../qt/data/ConfigDialog.ui.h:9 msgid "Native name" msgstr "原生å稱" #: ../gtk/src/CrashHandler.cc:26 ../gtk/src/CrashHandler.cc:43 #: ../qt/src/CrashHandler.cc:34 msgid "Crash Handler" msgstr "異常終止處ç†å™¨" #: ../gtk/src/CrashHandler.cc:45 ../qt/src/CrashHandler.cc:29 msgid "Your work has been saved under %1." msgstr "你的工作已儲存於 %1。" #: ../gtk/src/CrashHandler.cc:47 ../qt/src/CrashHandler.cc:31 msgid "There was no unsaved work." msgstr "沒有未儲存的工作。" #: ../gtk/src/CrashHandler.cc:106 ../qt/src/CrashHandler.cc:60 msgid "Failed to obtain backtrace. Is gdb installed?" msgstr "無法å–å¾— backtraceã€‚å·²å®‰è£ gdb 嗎?" #: ../gtk/src/Displayer.cc:261 ../qt/src/Displayer.cc:231 msgid "Failed to load image" msgstr "無法載入圖åƒ" #: ../gtk/src/Displayer.cc:261 ../qt/src/Displayer.cc:231 msgid "" "The file might not be an image or be corrupt:\n" "%1" msgstr "" "該檔案å¯èƒ½ä¸æ˜¯åœ–åƒæˆ–已被æå£žï¼š\n" "%1" #: ../gtk/src/DisplayerToolSelect.cc:39 ../qt/src/DisplayerToolSelect.cc:40 msgid "selection.png" msgstr "" #: ../gtk/src/DisplayerToolSelect.cc:148 ../qt/src/DisplayerToolSelect.cc:139 msgid "PNG Images" msgstr "PNG 圖åƒ" #: ../gtk/src/DisplayerToolSelect.cc:149 ../qt/src/DisplayerToolSelect.cc:139 msgid "Save Selection Image" msgstr "儲存é¸å–圖åƒ" #: ../gtk/src/DisplayerToolSelect.cc:157 ../qt/src/DisplayerToolSelect.cc:147 msgid "Recognize all" msgstr "辨èªå…¨éƒ¨" #: ../gtk/src/DisplayerToolSelect.cc:157 ../qt/src/DisplayerToolSelect.cc:147 msgid "Recognize selection" msgstr "辨èªé¸å–å€" #: ../gtk/src/DisplayerToolSelect.cc:194 ../qt/src/DisplayerToolSelect.cc:184 msgid "Performing layout analysis" msgstr "進行佈局分æž" #: ../gtk/src/FileDialogs.cc:237 msgid "" "A file named \"%1\" already exists. Are you sure you want to overwrite it?" msgstr "å為 \"%1\" 的檔案已存在。你確定è¦è¦†å¯«å®ƒï¼Ÿ" #: ../gtk/src/FileDialogs.cc:239 msgid "Overwrite File?" msgstr "覆寫檔案?" #: ../gtk/src/MainWindow.cc:125 ../qt/src/MainWindow.cc:274 msgid "Using tesseract" msgstr "採用 tesseract" #: ../gtk/src/MainWindow.cc:191 ../qt/src/MainWindow.cc:181 msgid "Select an image to begin..." msgstr "è«‹é¸å–圖åƒä½œç‚ºé–‹å§‹â€¦â€¦" #: ../gtk/src/MainWindow.cc:306 ../qt/src/MainWindow.cc:262 msgid "Multiple sources" msgstr "多個來æº" #: ../gtk/src/MainWindow.cc:307 ../qt/src/MainWindow.cc:263 msgid "Ready" msgstr "就緒" #: ../gtk/src/MainWindow.cc:446 ../qt/src/MainWindow.cc:390 msgid "New version" msgstr "新版本" #: ../gtk/src/MainWindow.cc:446 ../qt/src/MainWindow.cc:390 msgid "gImageReader %1 is available" msgstr "gImageReader %1 å·²é¢ä¸–" #: ../gtk/src/MainWindow.cc:447 ../qt/src/MainWindow.cc:391 msgid "Download" msgstr "下載" #: ../gtk/src/MainWindow.cc:448 ../qt/src/MainWindow.cc:392 msgid "Changelog" msgstr "修改日誌" #: ../gtk/src/MainWindow.cc:449 ../qt/src/MainWindow.cc:393 msgid "Don't notify again" msgstr "ä¸å†æç¤º" #: ../gtk/src/MainWindow.cc:468 ../qt/src/MainWindow.cc:438 msgid "Don't show again" msgstr "ä¸å†é¡¯ç¤º" #: ../gtk/src/MainWindow.cc:469 ../gtk/src/MainWindow.cc:482 #: ../qt/src/MainWindow.cc:439 msgid "Install" msgstr "安è£" #: ../gtk/src/MainWindow.cc:489 ../qt/src/MainWindow.cc:451 msgid "Spelling dictionary missing" msgstr "éºæ¼æ‹¼å­—詞典" #: ../gtk/src/MainWindow.cc:489 ../qt/src/MainWindow.cc:451 msgid "The spellcheck dictionary for %1 is not installed" msgstr "æœªå®‰è£ %1 的拼字詞典" #: ../gtk/src/MainWindow.cc:496 ../gtk/src/MainWindow.cc:528 #: ../qt/src/MainWindow.cc:458 msgid "Installing spelling dictionary for '%1'" msgstr "æ­£åœ¨å®‰è£ '%1' 的拼字詞典" #: ../gtk/src/MainWindow.cc:517 ../gtk/src/MainWindow.cc:542 #: ../gtk/src/MainWindow.cc:550 ../gtk/src/MainWindow.cc:560 #: ../gtk/src/MainWindow.cc:566 ../gtk/src/MainWindow.cc:595 #: ../gtk/src/OutputEditorHOCR.cc:1375 ../gtk/src/Recognizer.cc:163 #: ../gtk/src/TessdataManager.cc:58 ../gtk/src/TessdataManager.cc:68 #: ../gtk/src/TessdataManager.cc:290 ../qt/src/MainWindow.cc:477 #: ../qt/src/MainWindow.cc:490 ../qt/src/MainWindow.cc:500 #: ../qt/src/MainWindow.cc:510 ../qt/src/MainWindow.cc:518 #: ../qt/src/MainWindow.cc:546 ../qt/src/OutputEditorHOCR.cc:1157 #: ../qt/src/Recognizer.cc:138 ../qt/src/TessdataManager.cc:72 #: ../qt/src/TessdataManager.cc:82 ../qt/src/TessdataManager.cc:275 msgid "Error" msgstr "錯誤" #: ../gtk/src/MainWindow.cc:517 ../qt/src/MainWindow.cc:477 msgid "Failed to install spelling dictionary: %1" msgstr "ç„¡æ³•å®‰è£æ‹¼å­—詞典:%1" #: ../gtk/src/MainWindow.cc:542 ../qt/src/MainWindow.cc:490 msgid "Failed to create directory for spelling dictionaries." msgstr "無法建立拼字詞典目錄" #: ../gtk/src/MainWindow.cc:550 ../gtk/src/MainWindow.cc:566 #: ../qt/src/MainWindow.cc:500 msgid "Could not read %1: %2." msgstr "ç„¡æ³•è®€å– %1:%2。" #: ../gtk/src/MainWindow.cc:560 ../gtk/src/MainWindow.cc:595 #: ../qt/src/MainWindow.cc:510 ../qt/src/MainWindow.cc:546 msgid "No spelling dictionaries found for '%1'." msgstr "找ä¸åˆ° '%1' 的拼字詞典。" #: ../gtk/src/MainWindow.cc:576 ../qt/src/MainWindow.cc:529 msgid "Downloading '%1'..." msgstr "正在下載 '%1'……" #: ../gtk/src/MainWindow.cc:592 ../qt/src/MainWindow.cc:543 msgid "Dictionaries installed" msgstr "已安è£è©žå…¸" #: ../gtk/src/MainWindow.cc:592 msgid "The following dictionaries were installed:%1" msgstr "已安è£ä¸‹åˆ—詞典:%1" #: ../gtk/src/OutputEditorHOCR.cc:319 ../qt/src/OutputEditorHOCR.cc:291 msgid "Document" msgstr "文件" #: ../gtk/src/OutputEditorHOCR.cc:368 ../qt/src/OutputEditorHOCR.cc:279 msgid "Monochrome" msgstr "黑白" #: ../gtk/src/OutputEditorHOCR.cc:377 ../qt/src/OutputEditorHOCR.cc:281 msgid "Threshold (closest color)" msgstr "定é™ï¼ˆæœ€æŽ¥è¿‘é¡è‰²ï¼‰" #: ../gtk/src/OutputEditorHOCR.cc:380 ../qt/src/OutputEditorHOCR.cc:282 msgid "Diffuse" msgstr "æ“´æ•£" #: ../gtk/src/OutputEditorHOCR.cc:389 ../qt/src/OutputEditorHOCR.cc:283 msgid "Zip (lossless)" msgstr "Zip(無æï¼‰" #: ../gtk/src/OutputEditorHOCR.cc:393 ../qt/src/OutputEditorHOCR.cc:284 msgid "CCITT Group 4 (lossless)" msgstr "CCITT 第 4 組(無æï¼‰" #: ../gtk/src/OutputEditorHOCR.cc:397 ../qt/src/OutputEditorHOCR.cc:285 msgid "Jpeg (lossy)" msgstr "Jpeg(失真)" #: ../gtk/src/OutputEditorHOCR.cc:553 ../qt/src/OutputEditorHOCR.cc:429 msgid "" "The following pages could not be processed:\n" "%1" msgstr "" "無法處ç†ä¸‹åˆ—é é¢ï¼š\n" "%1" #: ../gtk/src/OutputEditorHOCR.cc:554 ../qt/src/OutputEditorHOCR.cc:430 msgid "Recognition errors" msgstr "è¾¨èªæ™‚出ç¾éŒ¯èª¤" #. Add tree item #: ../gtk/src/OutputEditorHOCR.cc:647 ../gtk/src/OutputEditorHOCR.cc:1037 #: ../qt/src/OutputEditorHOCR.cc:504 ../qt/src/OutputEditorHOCR.cc:894 msgid "Graphic" msgstr "圖åƒ" #: ../gtk/src/OutputEditorHOCR.cc:703 ../qt/src/OutputEditorHOCR.cc:563 msgid "Paragraph" msgstr "段è½" #: ../gtk/src/OutputEditorHOCR.cc:706 ../qt/src/OutputEditorHOCR.cc:566 msgid "Textline" msgstr "文字" #: ../gtk/src/OutputEditorHOCR.cc:1136 ../qt/src/OutputEditorHOCR.cc:950 msgid "Merge" msgstr "åˆä½µ" #: ../gtk/src/OutputEditorHOCR.cc:1161 ../qt/src/OutputEditorHOCR.cc:977 msgid "Add graphic region" msgstr "新增圖åƒå€åŸŸ" #: ../gtk/src/OutputEditorHOCR.cc:1177 ../qt/src/OutputEditorHOCR.cc:985 msgid "No suggestions" msgstr "沒有建議" #: ../gtk/src/OutputEditorHOCR.cc:1183 ../qt/src/OutputEditorHOCR.cc:989 msgid "Add to dictionary" msgstr "新增詞典" #: ../gtk/src/OutputEditorHOCR.cc:1189 ../qt/src/OutputEditorHOCR.cc:990 msgid "Ignore word" msgstr "忽略字詞" #: ../gtk/src/OutputEditorHOCR.cc:1222 ../qt/src/OutputEditorHOCR.cc:1007 msgid "Expand all" msgstr "éžè¿´å±•é–‹" #: ../gtk/src/OutputEditorHOCR.cc:1225 ../qt/src/OutputEditorHOCR.cc:1008 msgid "Collapse all" msgstr "éžè¿´æŠ˜ç–Š" #: ../gtk/src/OutputEditorHOCR.cc:1248 ../gtk/src/OutputEditorHOCR.cc:1287 #: ../qt/src/OutputEditorHOCR.cc:1049 ../qt/src/OutputEditorHOCR.cc:1079 msgid "hOCR HTML Files" msgstr "hOCR HTML 檔" #: ../gtk/src/OutputEditorHOCR.cc:1249 ../qt/src/OutputEditorHOCR.cc:1049 msgid "Open hOCR File" msgstr "開啟 hOCR 檔" #: ../gtk/src/OutputEditorHOCR.cc:1258 ../qt/src/OutputEditorHOCR.cc:1055 msgid "Failed to open file" msgstr "無法開啟檔案" #: ../gtk/src/OutputEditorHOCR.cc:1258 ../qt/src/OutputEditorHOCR.cc:1055 msgid "The file could not be opened: %1." msgstr "無法開啟檔案:%1。" #: ../gtk/src/OutputEditorHOCR.cc:1267 ../qt/src/OutputEditorHOCR.cc:1062 msgid "Invalid hOCR file" msgstr "無效的 hOCR 檔" #: ../gtk/src/OutputEditorHOCR.cc:1267 ../qt/src/OutputEditorHOCR.cc:1062 msgid "The file does not appear to contain valid hOCR HTML: %1" msgstr "此檔案似乎並ä¸åŒ…嫿œ‰æ•ˆçš„ hOCR HTML:%1" #: ../gtk/src/OutputEditorHOCR.cc:1283 ../gtk/src/OutputEditorHOCR.cc:1343 #: ../gtk/src/OutputEditorText.cc:306 ../qt/src/OutputEditorHOCR.cc:1077 #: ../qt/src/OutputEditorHOCR.cc:1131 ../qt/src/OutputEditorText.cc:246 msgid "output" msgstr "輸出" #: ../gtk/src/OutputEditorHOCR.cc:1288 ../qt/src/OutputEditorHOCR.cc:1079 msgid "Save hOCR Output..." msgstr "儲存 hOCR 輸出……" #: ../gtk/src/OutputEditorHOCR.cc:1296 ../gtk/src/OutputEditorHOCR.cc:1357 #: ../gtk/src/OutputEditorText.cc:319 ../qt/src/OutputEditorHOCR.cc:1087 #: ../qt/src/OutputEditorHOCR.cc:1143 ../qt/src/OutputEditorText.cc:256 msgid "Failed to save output" msgstr "無法儲存輸出……" #: ../gtk/src/OutputEditorHOCR.cc:1296 ../gtk/src/OutputEditorHOCR.cc:1357 #: ../gtk/src/OutputEditorText.cc:319 ../qt/src/OutputEditorHOCR.cc:1087 #: ../qt/src/OutputEditorHOCR.cc:1143 ../qt/src/OutputEditorText.cc:256 msgid "Check that you have writing permissions in the selected folder." msgstr "請檢查你在所é¸å–è³‡æ–™å¤¾æ“æœ‰å¯«å…¥æ¬Šé™ã€‚" #: ../gtk/src/OutputEditorHOCR.cc:1346 ../qt/src/OutputEditorHOCR.cc:1133 msgid "PDF Files" msgstr "PDF 檔" #: ../gtk/src/OutputEditorHOCR.cc:1347 ../qt/src/OutputEditorHOCR.cc:1133 msgid "Save PDF Output..." msgstr "儲存 PDF 輸出……" #: ../gtk/src/OutputEditorHOCR.cc:1375 ../qt/src/OutputEditorHOCR.cc:1157 msgid "The PDF library does not support the selected font." msgstr "PDF 程å¼åº«ä¸æ”¯æ´æ‰€é¸å–字型。" #: ../gtk/src/OutputEditorHOCR.cc:1435 ../qt/src/OutputEditorHOCR.cc:1216 msgid "Errors occurred" msgstr "發生錯誤" #: ../gtk/src/OutputEditorHOCR.cc:1435 ../qt/src/OutputEditorHOCR.cc:1216 msgid "" "The following pages could not be rendered:\n" "%1" msgstr "" "無法繪畫下列é é¢ï¼š\n" "%1" #: ../gtk/src/OutputEditorHOCR.cc:1562 ../gtk/src/OutputEditorText.cc:333 #: ../qt/src/OutputEditorHOCR.cc:1331 ../qt/src/OutputEditorText.cc:269 msgid "Output not saved" msgstr "未儲存輸出" #: ../gtk/src/OutputEditorHOCR.cc:1562 ../gtk/src/OutputEditorText.cc:333 #: ../qt/src/OutputEditorHOCR.cc:1331 ../qt/src/OutputEditorText.cc:269 msgid "Save output before proceeding?" msgstr "先儲存輸出å†ç¹¼çºŒï¼Ÿ" #: ../gtk/src/OutputEditorText.cc:197 ../qt/src/OutputEditorText.cc:158 msgid "Stripping line breaks..." msgstr "去除æ›è¡Œç¬¦è™Ÿâ€¦â€¦" #: ../gtk/src/OutputEditorText.cc:211 msgid "Check spelling" msgstr "檢查拼字" #: ../gtk/src/OutputEditorText.cc:238 ../qt/src/OutputEditorText.cc:178 msgid "Replacing..." msgstr "å–代中……" #: ../gtk/src/OutputEditorText.cc:264 ../qt/src/OutputEditorText.cc:204 #, fuzzy msgid "File: %1" msgstr "檔案" #: ../gtk/src/OutputEditorText.cc:267 ../qt/src/OutputEditorText.cc:207 #, fuzzy msgid "Page: %1" msgstr "剖æžéŒ¯èª¤ï¼š%1" #: ../gtk/src/OutputEditorText.cc:280 ../gtk/src/Recognizer.cc:481 #: ../qt/src/Recognizer.cc:460 msgid "" "\n" "[Failed to recognize page %1]\n" msgstr "" "\n" "[無法辨èªç¬¬ %1 é ]\n" #: ../gtk/src/OutputEditorText.cc:310 ../qt/src/OutputEditorText.cc:248 msgid "Text Files" msgstr "文字檔" #: ../gtk/src/OutputEditorText.cc:311 ../qt/src/OutputEditorText.cc:248 msgid "Save Output..." msgstr "儲存輸出……" #: ../gtk/src/Recognizer.cc:156 ../qt/src/Recognizer.cc:131 msgid "" "Tesseract crashed with the following message:\n" "\n" "%1\n" "\n" "This typically happens for one of the following reasons:\n" "- Outdated traineddata files are used.\n" "- Auxiliary language data files are missing.\n" "- Corrupt language data files.\n" "\n" "Make sure your language data files are valid and compatible with tesseract " "%2." msgstr "" "Tesseract 已異常終止åŠç™¼å‡ºä»¥ä¸‹è¨Šæ¯ï¼š\n" "\n" "%1\n" "\n" "出ç¾é€™å€‹æƒ…æ³ä¸€èˆ¬æœ‰ä¸‹åˆ—原因:\n" "- 採用舊版的 traineddata 檔。\n" "- éºæ¼è¼”助語言資料檔。\n" "- èªžè¨€è³‡æ–™æª”å·²ææ¯€ã€‚\n" "\n" "請確ä¿ä½ çš„語言資料檔是正確的åŠå…¼å®¹ tesseract %2 。" #: ../gtk/src/Recognizer.cc:212 ../qt/src/Recognizer.cc:191 msgid "No languages available" msgstr "沒有å¯ç”¨èªžè¨€" #: ../gtk/src/Recognizer.cc:212 ../qt/src/Recognizer.cc:191 msgid "" "No tesseract languages are available for use. Recognition will not work." msgstr "沒有å¯ç”¨çš„ tesseract 語言。辨èªå°‡æœƒå¤±æ•—。" #: ../gtk/src/Recognizer.cc:266 ../qt/src/Recognizer.cc:251 msgid "Multilingual" msgstr "多語言" #: ../gtk/src/Recognizer.cc:318 ../qt/src/Recognizer.cc:295 msgid "Automatic page segmentation" msgstr "自動分割é é¢" #: ../gtk/src/Recognizer.cc:319 ../qt/src/Recognizer.cc:296 msgid "Page segmentation with orientation and script detection" msgstr "分割é é¢ä¸¦åµæ¸¬æ–¹å‘åŠæ–‡å­—" #: ../gtk/src/Recognizer.cc:320 ../qt/src/Recognizer.cc:297 msgid "Assume single column of text" msgstr "å‡è¨­åªæœ‰ä¸€æ¬„文字" #: ../gtk/src/Recognizer.cc:321 ../qt/src/Recognizer.cc:298 msgid "Assume single block of vertically aligned text" msgstr "å‡è¨­åªæœ‰ä¸€æ®µåž‚ç›´å°æ•´çš„æ–‡å­—" #: ../gtk/src/Recognizer.cc:322 ../qt/src/Recognizer.cc:299 msgid "Assume a single uniform block of text" msgstr "å‡è¨­åªæœ‰ä¸€æ®µå‡å‹»çš„æ–‡å­—" #: ../gtk/src/Recognizer.cc:323 ../qt/src/Recognizer.cc:300 msgid "Assume a line of text" msgstr "å‡è¨­åªæœ‰ä¸€è¡Œæ–‡å­—" #: ../gtk/src/Recognizer.cc:324 ../qt/src/Recognizer.cc:301 msgid "Assume a single word" msgstr "å‡è¨­åªæœ‰ä¸€å€‹å­—" #: ../gtk/src/Recognizer.cc:325 ../qt/src/Recognizer.cc:302 msgid "Assume a single word in a circle" msgstr "å‡è¨­æ˜¯åœ“圈內的一個字" #: ../gtk/src/Recognizer.cc:326 ../qt/src/Recognizer.cc:303 msgid "Sparse text in no particular order" msgstr "沒有特定次åºçš„ç¨€ç–æ–‡å­—" #: ../gtk/src/Recognizer.cc:327 ../qt/src/Recognizer.cc:304 msgid "Sparse text with orientation and script detection" msgstr "嵿¸¬ç¨€ç–文字的方å‘åŠæ–‡å­—" #: ../gtk/src/Recognizer.cc:341 ../qt/src/Recognizer.cc:314 msgid "Page segmentation mode" msgstr "分割é é¢æ¨¡å¼" #: ../gtk/src/Recognizer.cc:347 ../qt/src/Recognizer.cc:321 msgid "Manage languages..." msgstr "管ç†èªžè¨€â€¦â€¦" #: ../gtk/src/Recognizer.cc:403 ../qt/src/Recognizer.cc:381 msgid "Current selection" msgstr "ç¾æœ‰é¸å–å€" #: ../gtk/src/Recognizer.cc:475 ../qt/src/Recognizer.cc:454 msgid "Recognizing page %1 (%2 of %3)" msgstr "辨èªç¬¬ %1 é ï¼ˆ%3 之 %2)" #: ../gtk/src/Recognizer.cc:480 ../qt/src/Recognizer.cc:459 msgid "" "\n" "- Page %1: failed to render page" msgstr "" "\n" "- 第 %1 é ï¼šç„¡æ³•繪畫é é¢" #: ../gtk/src/Recognizer.cc:510 ../gtk/src/Recognizer.cc:539 #: ../gtk/src/Recognizer.cc:552 ../qt/src/Recognizer.cc:488 #: ../qt/src/Recognizer.cc:517 ../qt/src/Recognizer.cc:530 msgid "Recognizing..." msgstr "辨èªä¸­â€¦â€¦" #: ../gtk/src/Recognizer.cc:514 ../gtk/src/Recognizer.cc:522 #: ../qt/src/Recognizer.cc:492 ../qt/src/Recognizer.cc:500 msgid "Recognition errors occurred" msgstr "è¾¨èªæ™‚出ç¾éŒ¯èª¤" #: ../gtk/src/Recognizer.cc:514 ../qt/src/Recognizer.cc:492 msgid "The following errors occurred:%1" msgstr "出ç¾ä¸‹åˆ—錯誤:%1" #: ../gtk/src/Recognizer.cc:522 ../qt/src/Recognizer.cc:500 msgid "Failed to initialize tesseract" msgstr "無法åˆå§‹åŒ– tesseract" #: ../gtk/src/scanner/ScannerSane.cc:83 ../gtk/src/scanner/ScannerTwain.cc:287 #: ../qt/src/scanner/ScannerSane.cc:85 ../qt/src/scanner/ScannerTwain.cc:285 msgid "Scan canceled" msgstr "已喿¶ˆæŽƒæ" #: ../gtk/src/scanner/ScannerSane.cc:157 ../gtk/src/scanner/ScannerTwain.cc:186 #: ../qt/src/scanner/ScannerSane.cc:158 ../qt/src/scanner/ScannerTwain.cc:178 msgid "No scanner specified" msgstr "未指定掃æå™¨" #: ../gtk/src/scanner/ScannerSane.cc:166 ../gtk/src/scanner/ScannerTwain.cc:195 #: ../qt/src/scanner/ScannerSane.cc:167 ../qt/src/scanner/ScannerTwain.cc:187 msgid "Unable to connect to scanner" msgstr "無法連線至掃æå™¨" #: ../gtk/src/scanner/ScannerSane.cc:386 ../gtk/src/scanner/ScannerTwain.cc:265 #: ../gtk/src/scanner/ScannerTwain.cc:291 ../qt/src/scanner/ScannerSane.cc:387 #: ../qt/src/scanner/ScannerTwain.cc:257 ../qt/src/scanner/ScannerTwain.cc:289 msgid "Unable to start scan" msgstr "無法開始掃æ" #: ../gtk/src/scanner/ScannerSane.cc:394 ../gtk/src/scanner/ScannerSane.cc:437 #: ../gtk/src/scanner/ScannerTwain.cc:317 ../qt/src/scanner/ScannerSane.cc:395 #: ../qt/src/scanner/ScannerSane.cc:438 ../qt/src/scanner/ScannerTwain.cc:315 msgid "Error communicating with scanner" msgstr "與掃æå™¨æºé€šå‡ºç¾éŒ¯èª¤" #: ../gtk/src/scanner/ScannerSane.cc:498 ../qt/src/scanner/ScannerSane.cc:494 msgid "Failed to save image" msgstr "無法儲存圖åƒ" #: ../gtk/src/SourceManager.cc:118 ../qt/src/SourceManager.cc:112 msgid "Unable to open files" msgstr "無法開啟檔案" #: ../gtk/src/SourceManager.cc:118 ../qt/src/SourceManager.cc:112 msgid "The following files could not be opened:%1" msgstr "無法開啟下列檔案:%1" #: ../gtk/src/SourceManager.cc:134 ../qt/src/SourceManager.cc:154 msgid "Images and PDFs" msgstr "圖åƒèˆ‡ PDF 檔" #: ../gtk/src/SourceManager.cc:137 ../qt/src/SourceManager.cc:155 msgid "Select Files" msgstr "é¸å–檔案" #: ../gtk/src/SourceManager.cc:143 ../qt/src/SourceManager.cc:166 msgid "Clipboard Error" msgstr "剪貼簿錯誤" #: ../gtk/src/SourceManager.cc:143 ../qt/src/SourceManager.cc:166 msgid "Failed to read the clipboard." msgstr "無法讀å–剪貼簿。" #: ../gtk/src/SourceManager.cc:147 ../qt/src/SourceManager.cc:170 #: ../qt/src/SourceManager.cc:176 msgid "Pasted %1" msgstr "已貼上 %1" #: ../gtk/src/SourceManager.cc:159 ../qt/src/SourceManager.cc:183 msgid "Screenshot Error" msgstr "ç•«é¢æˆªåœ–錯誤" #: ../gtk/src/SourceManager.cc:159 ../qt/src/SourceManager.cc:183 msgid "Failed to take screenshot." msgstr "無法截å–ç•«é¢ã€‚" #: ../gtk/src/SourceManager.cc:163 ../qt/src/SourceManager.cc:187 msgid "Screenshot %1" msgstr "截圖 %1" #: ../gtk/src/SourceManager.cc:168 ../qt/src/SourceManager.cc:192 msgid "Saving image..." msgstr "儲存圖åƒä¸­â€¦â€¦" #: ../gtk/src/SourceManager.cc:175 ../qt/src/SourceManager.cc:205 msgid "Cannot Write File" msgstr "無法寫入檔案" #: ../gtk/src/SourceManager.cc:175 ../qt/src/SourceManager.cc:205 msgid "Could not write to %1." msgstr "無法寫進 %1。" #: ../gtk/src/SourceManager.cc:202 ../qt/src/SourceManager.cc:227 msgid "Delete File?" msgstr "刪除檔案?" #: ../gtk/src/SourceManager.cc:202 ../qt/src/SourceManager.cc:227 msgid "The following files will be deleted:%1" msgstr "下列檔案將會被刪除:%1" #: ../gtk/src/SourceManager.cc:266 ../qt/src/SourceManager.cc:278 msgid "Missing File" msgstr "éºæ¼æª”案" #: ../gtk/src/SourceManager.cc:266 ../qt/src/SourceManager.cc:278 msgid "" "The following file has been deleted or moved:\n" "%1" msgstr "" "下列檔案已被刪除或移除:\n" "%1" #: ../gtk/src/SubstitutionsManager.cc:39 ../qt/src/SubstitutionsManager.cc:77 msgid "Search for" msgstr "尋找" #: ../gtk/src/SubstitutionsManager.cc:40 ../qt/src/SubstitutionsManager.cc:77 msgid "Replace with" msgstr "å–代" #: ../gtk/src/SubstitutionsManager.cc:62 ../qt/src/SubstitutionsManager.cc:99 msgid "substitution_list.txt" msgstr "" #: ../gtk/src/SubstitutionsManager.cc:84 ../gtk/src/SubstitutionsManager.cc:119 #: ../qt/src/SubstitutionsManager.cc:114 ../qt/src/SubstitutionsManager.cc:152 msgid "Substitutions List" msgstr "æ›¿æ›æ¸…å–®" #: ../gtk/src/SubstitutionsManager.cc:85 ../qt/src/SubstitutionsManager.cc:114 msgid "Open Substitutions List" msgstr "é–‹å§‹æ›¿æ›æ¸…å–®" #: ../gtk/src/SubstitutionsManager.cc:90 ../qt/src/SubstitutionsManager.cc:119 msgid "Error Reading File" msgstr "讀案錯誤" #: ../gtk/src/SubstitutionsManager.cc:90 ../qt/src/SubstitutionsManager.cc:119 msgid "Unable to read '%1'." msgstr "ç„¡æ³•è®€å– '%1'。" #: ../gtk/src/SubstitutionsManager.cc:113 ../qt/src/SubstitutionsManager.cc:146 msgid "Errors Occurred Reading File" msgstr "è®€å–æª”案時出ç¾éŒ¯èª¤" #: ../gtk/src/SubstitutionsManager.cc:113 ../qt/src/SubstitutionsManager.cc:146 msgid "Some entries of the substitutions list could not be read." msgstr "ç„¡æ³•è®€å–æ›¿æ›æ¸…單內æŸäº›é …目。" #: ../gtk/src/SubstitutionsManager.cc:120 ../qt/src/SubstitutionsManager.cc:152 msgid "Save Substitutions List" msgstr "å„²å­˜æ›¿æ›æ¸…å–®" #: ../gtk/src/SubstitutionsManager.cc:126 ../qt/src/SubstitutionsManager.cc:158 msgid "Error Saving File" msgstr "存檔錯誤" #: ../gtk/src/SubstitutionsManager.cc:126 ../qt/src/SubstitutionsManager.cc:158 msgid "Unable to write to '%1'." msgstr "無法寫進 '%1'。" #: ../gtk/src/SubstitutionsManager.cc:144 ../qt/src/SubstitutionsManager.cc:172 msgid "Save List?" msgstr "儲存清單?" #: ../gtk/src/SubstitutionsManager.cc:144 ../qt/src/SubstitutionsManager.cc:172 msgid "Do you want to save the current list?" msgstr "是å¦éœ€è¦å„²å­˜ç¾æœ‰æ¸…單?" #: ../gtk/src/SubstitutionsManager.cc:179 ../qt/src/SubstitutionsManager.cc:208 msgid "Applying substitutions..." msgstr "正在套用替æ›å€¼â€¦â€¦" #: ../gtk/src/TessdataManager.cc:58 ../qt/src/TessdataManager.cc:72 msgid "" "PackageKit is required for managing system-wide tesseract language packs, " "but it was not found. Please use the system package management software to " "manage the tesseract language packs, or switch to use the user tessdata path " "in the configuration dialog." msgstr "" "ç®¡ç† tesseract èªžè¨€åŒ…é ˆè¦ PackageKit,但它並ä¸å­˜åœ¨ã€‚請利用系統的套件管ç†è»Ÿä»¶" "ä¾†ç®¡ç† tesseract 的語言包。" #: ../gtk/src/TessdataManager.cc:63 ../qt/src/TessdataManager.cc:77 msgid "Fetching available languages" msgstr "å–å¾—å¯ç”¨èªžè¨€" #: ../gtk/src/TessdataManager.cc:68 ../gtk/src/TessdataManager.cc:89 #: ../gtk/src/TessdataManager.cc:121 ../qt/src/TessdataManager.cc:82 #: ../qt/src/TessdataManager.cc:94 ../qt/src/TessdataManager.cc:127 msgid "Failed to fetch list of available languages: %1" msgstr "無法å–å¾—å¯ç”¨èªžè¨€çš„æ¸…單:%1" #: ../gtk/src/TessdataManager.cc:100 ../gtk/src/TessdataManager.cc:129 #: ../qt/src/TessdataManager.cc:105 ../qt/src/TessdataManager.cc:114 #: ../qt/src/TessdataManager.cc:136 ../qt/src/TessdataManager.cc:147 msgid "Parsing error: %1" msgstr "剖æžéŒ¯èª¤ï¼š%1" #: ../gtk/src/TessdataManager.cc:191 ../qt/src/TessdataManager.cc:191 msgid "Applying changes..." msgstr "正在套用改動……" #: ../gtk/src/TessdataManager.cc:252 ../qt/src/TessdataManager.cc:237 msgid "Failed to create directory for tessdata files." msgstr "無法為 tessdata 檔建立目錄" #: ../gtk/src/TessdataManager.cc:261 ../qt/src/TessdataManager.cc:245 msgid "Downloading %1..." msgstr "正在下載 %1……" #: ../gtk/src/TessdataManager.cc:281 ../qt/src/TessdataManager.cc:267 msgid "" "The following files could not be downloaded or removed:\n" "%1\n" "\n" "Check the connectivity and directory permissions." msgstr "" "無法下載或刪除下列檔案:\n" "%1\n" "\n" "請檢查連線åŠç›®éŒ„權é™ã€‚" #: ../gtk/src/Utils.cc:62 msgid "Yes" msgstr "是" #: ../gtk/src/Utils.cc:65 msgid "No" msgstr "å¦" #: ../gtk/src/Utils.cc:74 msgid "Discard" msgstr "棄置" #: ../qt/data/AboutDialog.ui.h:1 msgid "About gImageReader" msgstr "有關 gImageReader" #: ../qt/data/AboutDialog.ui.h:3 #, fuzzy msgid "" "

 

A graphical frontend to tesseract-ocr

Website

 

" msgstr "" "

 

tesseract-ocr 的圖åƒä»‹é¢

網站

 

" #: ../qt/data/AboutDialog.ui.h:4 msgid "Credits" msgstr "歸功於" #: ../qt/data/AboutDialog.ui.h:5 msgid "License" msgstr "æ¢æ¬¾" #: ../qt/data/ConfigDialog.ui.h:14 msgid "System encoding" msgstr "系統編碼" #: ../qt/data/ConfigDialog.ui.h:15 msgid "UTF-8" msgstr "" #: ../qt/data/ConfigDialog.ui.h:19 msgid "Text file encoding:" msgstr "文字檔編碼:" #: ../qt/data/CrashHandler.ui.h:2 #, fuzzy, no-c-format msgid "" "

The application has " "crashed

Apologies for the inconvenience. To help improve the " "application, please consider reporting the issue to manisandro@gmail.com. Please try to describe what you were doing before the application " "crashed. Also, include the information below. Thank you.

" msgstr "" "我們為帶來的ä¸ä¾¿è€Œé“æ­‰ã€‚å¦‚ä½ æœ‰æ„æ”¹å–„此程å¼ï¼Œè«‹è€ƒæ…®å°‡å•題匯報給manisandro@gmail.com。請嘗試æè¿°ä½ åœ¨ç¨‹å¼çµ‚æ­¢å‰æ‰€åšçš„事情。å¦å¤–,請一併" "附上下列資料。è¬è¬ã€‚" #: ../qt/data/MainWindow.ui.h:1 msgid "gImageReader" msgstr "" #. Remove & from some labels which designer insists in adding #: ../qt/data/MainWindow.ui.h:17 ../qt/src/Ui_MainWindow.hh:49 msgid "Sources" msgstr "來æº" #: ../qt/data/MainWindow.ui.h:18 msgid "Zoom In" msgstr "放大" #: ../qt/data/MainWindow.ui.h:20 msgid "Zoom Out" msgstr "縮å°" #: ../qt/data/MainWindow.ui.h:22 msgid "Normal Size" msgstr "正常大å°" #: ../qt/data/MainWindow.ui.h:24 msgid "Best Fit" msgstr "最佳大å°" #: ../qt/data/MainWindow.ui.h:26 msgid "Rotate Left" msgstr "å‘左旋轉" #: ../qt/data/MainWindow.ui.h:27 msgid "Rotate left" msgstr "å‘左旋轉" #: ../qt/data/MainWindow.ui.h:28 msgid "Rotate Right" msgstr "å‘峿—‹è½‰" #: ../qt/data/MainWindow.ui.h:29 msgid "Rotate right" msgstr "å‘峿—‹è½‰" #: ../qt/data/MainWindow.ui.h:30 msgid "Image Controls" msgstr "åœ–åƒæŽ§åˆ¶" #: ../qt/data/MainWindow.ui.h:32 msgid "Autodetect Layout" msgstr "è‡ªå‹•åµæ¸¬ä½ˆå±€" #: ../qt/data/MainWindow.ui.h:34 msgid "Toggle Output Pane" msgstr "切æ›è¼¸å‡ºé¢æ¿" #: ../qt/src/MainWindow.cc:518 msgid "Could not read %1: %2" msgstr "ç„¡æ³•è®€å– %1:%2。" #: ../qt/src/MainWindow.cc:543 msgid "The following dictionary files were installed:%1" msgstr "已安è£ä¸‹åˆ—詞典檔:%1" #: ../qt/src/Ui_MainWindow.hh:50 msgid "Output" msgstr "輸出:" #: ../qt/src/Ui_MainWindow.hh:133 msgid "OCR mode:" msgstr "OCR 模å¼ï¼š" #: ../qt/src/Ui_MainWindow.hh:204 msgid "Remove Image" msgstr "移除圖åƒ" #: ../qt/src/Ui_MainWindow.hh:207 msgid "Delete Image" msgstr "刪除圖åƒ" #: ../qt/src/Ui_MainWindow.hh:210 msgid "Clear List" msgstr "清除清單" #. Output toolbar #: ../qt/src/Ui_OutputEditorHOCR.hh:39 ../qt/src/Ui_OutputEditorHOCR.hh:40 msgid "Open hOCR file" msgstr "開啟 hOCR 檔" #: ../qt/src/Ui_OutputEditorHOCR.hh:41 ../qt/src/Ui_OutputEditorHOCR.hh:42 msgid "Save as hOCR text" msgstr "儲存為 hOCR 文字" #: ../qt/src/Ui_OutputEditorText.hh:108 msgid "Strip Line Breaks" msgstr "去除æ›è¡Œç¬¦è™Ÿ" #: ../qt/src/Ui_OutputEditorText.hh:113 msgid "Find and Replace" msgstr "尋找åŠå–代" #: ../qt/src/Ui_OutputEditorText.hh:122 msgid "Save Output" msgstr "儲存輸出" #: ../qt/src/Ui_OutputEditorText.hh:124 msgid "Clear Output" msgstr "清除輸出" #, fuzzy #~ msgid "" #~ "<html><head/><body><p><span style=" font-" #~ "weight:600;">The application has crashed</span></p>" #~ "<p>Apologies for the inconvenience. To help improve the " #~ "application, please consider reporting the issue to <a href="" #~ "mailto:manisandro@gmail.com?subject=gImageReader%20Crash">" #~ "manisandro@gmail.com</a>. Please try to describe what you were " #~ "doing before the application crashed. Also, include the information " #~ "below. Thank you.</p></body></html>" #~ msgstr "" #~ "

此應用程å¼å·²ç•°å¸¸çµ‚" #~ "æ­¢

我們為帶來的ä¸ä¾¿è€Œé“æ­‰ã€‚å¦‚ä½ æœ‰æ„æ”¹å–„此程å¼ï¼Œè«‹è€ƒæ…®å°‡å•題匯" #~ "報給manisandro@gmail.com。請嘗試æè¿°ä½ åœ¨ç¨‹å¼çµ‚æ­¢å‰æ‰€åšçš„事情。å¦å¤–,請" #~ "一併附上下列資料。è¬è¬ã€‚

" #, fuzzy #~ msgid "" #~ "<small><b>Example:</b> 1-10, 13, 14-18</small>" #~ msgstr "例如: 1-10, 13, 14-18" gImageReader-3.2.3/qt/000077500000000000000000000000001312567024200144615ustar00rootroot00000000000000gImageReader-3.2.3/qt/data/000077500000000000000000000000001312567024200153725ustar00rootroot00000000000000gImageReader-3.2.3/qt/data/AboutDialog.ui000066400000000000000000000360321312567024200201270ustar00rootroot00000000000000 AboutDialog 0 0 492 373 About gImageReader :/icons/logo_128 Qt::AlignCenter <html><head/><body><p><span style=" font-weight:600;">gImageReader</p></body></html> Qt::AlignCenter QTabWidget::South 0 About 4 4 4 4 4 Qt::AlignCenter <html><head/><body><p>&nbsp;</p><p>A graphical frontend to tesseract-ocr</p><p><a href="https://github.com/manisandro/gImageReader/">Website</a></p><p>&nbsp;</p></body></html> Qt::AlignHCenter|Qt::AlignTop true 0 0 <html><head/><body><p><span style=" font-size:small;">Copyright © 2009-2017 Sandro Mani</span></p></body></html> Qt::AlignCenter Qt::AlignCenter Credits 0 0 0 0 0 true <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal;"> <table border="0" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px;" align="center" cellspacing="6" cellpadding="0"> <tr> <td> <p align="right" style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Created by</p></td> <td> <p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><a href="mailto:manisandro@gmail.com"><span style=" text-decoration: underline; color:#0057ae;">Sandro Mani</span></a></p></td></tr> <tr> <td> <p align="right" style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Translated by</p></td> <td> <p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Chinese (CN): <a href="mailto:timothy.ty.lee@gmail.com"><span style=" text-decoration: underline; color:#0057ae;">Timothy Lee</span></a></p></td></tr> <tr> <td> <p align="right" style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Translated by</p></td> <td> <p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Chinese (HK): <a href="mailto:timothy.ty.lee@gmail.com"><span style=" text-decoration: underline; color:#0057ae;">Timothy Lee</span></a></p></td></tr> <tr> <td></td> <td> <p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Chinese (TW): <a href="mailto:timothy.ty.lee@gmail.com"><span style=" text-decoration: underline; color:#0057ae;">Timothy Lee</span></a></p></td></tr> <tr> <td></td> <td> <p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Czech: <a href="mailto:pavel.borecki@gmail.com"><span style=" text-decoration: underline; color:#0057ae;">Pavel Borecki</span></a></p></td></tr> <tr> <td></td> <td> <p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">French: <a href="mailto:manisandro@gmail.com"><span style=" text-decoration: underline; color:#0057ae;">Sandro Mani</span></a></p></td></tr> <tr> <td></td> <td> <p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">German: <a href="mailto:manisandro@gmail.com"><span style=" text-decoration: underline; color:#0057ae;">Sandro Mani</span></a></p></td></tr> <tr> <td></td> <td> <p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Greek: <a href="mailto:dmtrs32@gmail.com"><span style=" text-decoration: underline; color:#0057ae;">Dimitris Spingos</span></a></p></td></tr> <tr> <td></td> <td> <p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Italian: <a href="mailto:manisandro@gmail.com"><span style=" text-decoration: underline; color:#0057ae;">Sandro Mani</span></a></p></td></tr> <tr> <td></td> <td> <p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Polish: <a href="mailto:peterb@inetia.pl"><span style=" text-decoration: underline; color:#0057ae;">Piotr Brol</span></a></p></td></tr> <tr> <td></td> <td> <p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Portuguese (BR): <a href="mailto:andre.tre@gmail.com"><span style=" text-decoration: underline; color:#0057ae;">André Alencar</span></a>, <a href="mailto:fbobraga@gmail.com"><span style=" text-decoration: underline; color:#0057ae;">Felipe Braga</span></a></p></td></tr> <tr> <td></td> <td> <p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Russian: <a href="mailto:berroll@mail.ru"><span style=" text-decoration: underline; color:#0057ae;">Oleg Moiseichuk</span></a></p></td></tr> <tr> <td></td> <td> <p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Slovenian: <a href="mailto:beernarrd@gmail.com"><span style=" text-decoration: underline; color:#0057ae;">Bernard Banko</span></a></p></td></tr> <tr> <td></td> <td> <p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Spanish: <a href="mailto:lunatc@gmail.com"><span style=" text-decoration: underline; color:#0057ae;">Antonio Trujillo</span></a></p></td></tr> <tr> <td></td> <td> <p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Swedish: <a href="mailto:mats.olofsson@bokforlaget-alerta.se"><span style=" text-decoration: underline; color:#0057ae;">Mats Olofsson</span></a></p></td></tr> <tr> <td></td> <td> <p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Turkish: <a href="mailto:necdetyucel@gmail.com"><span style=" text-decoration: underline; color:#0057ae;">Necdet Yucel</span></a></p></td></tr> <tr> <td></td> <td> <p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Ukranian: <a href="mailto:yhmtargaryen@gmail.com"><span style=" text-decoration: underline; color:#0057ae;">Yuriy Bahriy</span></a></p></td></tr></table></body></html> true License 0 0 0 0 true Copyright 2009-2017 Sandro Mani <manisandro@gmail.com> This program 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. This program 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 this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. Qt::Horizontal QDialogButtonBox::Close buttonBox accepted() AboutDialog accept() 248 254 157 274 buttonBox rejected() AboutDialog reject() 316 260 286 274 gImageReader-3.2.3/qt/data/ConfigDialog.ui000066400000000000000000000267541312567024200202740ustar00rootroot00000000000000 ConfigDialog 0 0 480 502 Preferences Default 0 0 Predefined language definitions: Automatically check for new program versions Output pane font: Language data locations: Qt::ScrollBarAlwaysOff QAbstractItemView::DoubleClicked QAbstractItemView::SelectRows false false Filename prefix Code Native name -1 System-wide paths User paths Qt::Horizontal Additional language definitions: Qt::ScrollBarAlwaysOff QAbstractItemView::DoubleClicked QAbstractItemView::SelectRows false false Filename prefix Code Native name Language definitions path: 10 Qt::Horizontal System encoding UTF-8 0 0 0 0 0 0 Add .. false 0 0 Remove .. Qt::Horizontal 40 20 Query to install missing spellcheck dictionaries Qt::Horizontal QDialogButtonBox::Help|QDialogButtonBox::Ok Text file encoding: 0 0 0 0 The prefix of the tesseract language data file Prefix The ISO 639-1 language code followed by the country code ISO Code The name of the language Name OK .. Cancel .. Spelling dictionaries path: 10 true true buttonBox accepted() ConfigDialog accept() 248 254 157 274 buttonBox rejected() ConfigDialog reject() 316 260 286 274 gImageReader-3.2.3/qt/data/CrashHandler.ui000066400000000000000000000064061312567024200202750ustar00rootroot00000000000000 CrashHandler 0 0 480 480 4 4 4 4 4 <html><head/><body><p><span style=" font-weight:600;">The application has crashed</span></p><p>Apologies for the inconvenience. To help improve the application, please consider reporting the issue to <a href="mailto:manisandro@gmail.com?subject=gImageReader%20Crash">manisandro@gmail.com</a>. Please try to describe what you were doing before the application crashed. Also, include the information below. Thank you.</p></body></html> true true true true color: rgb(144, 144, 144); true 0 0 Qt::Horizontal QDialogButtonBox::Close buttonBox accepted() CrashHandler accept() 248 254 157 274 buttonBox rejected() CrashHandler reject() 316 260 286 274 gImageReader-3.2.3/qt/data/MainWindow.ui000066400000000000000000000522261312567024200200140ustar00rootroot00000000000000 MainWindow 0 0 1064 572 gImageReader :/icons/logo_256:/icons/logo_256 0 0 0 0 0 4 2 2 2 2 Brightness QFrame::StyledPanel QFrame::Sunken 0 1 1 1 1 :/icons/brightness false -100 100 Contrast QFrame::StyledPanel QFrame::Sunken 0 1 1 1 1 :/icons/contrast false -100 100 Resolution QFrame::StyledPanel QFrame::Sunken 0 1 1 1 1 :/icons/resolution false 50 600 10 100 Invert colors Qt::Horizontal 40 20 false Qt::ToolButtonIconOnly false TopToolBarArea false QDockWidget::DockWidgetFloatable|QDockWidget::DockWidgetMovable So&urces 1 2 2 2 2 2 0 Files 2 2 2 2 2 QAbstractItemView::NoEditTriggers true QAbstractItemView::InternalMove QAbstractItemView::ExtendedSelection Acquire 2 2 2 2 2 true true Resolution: Mode: Grayscale Color Output: 0 0 Qt::AlignCenter 75 dpi 100 dpi 200 dpi 300 dpi 600 dpi 1200 dpi 0 0 .. Qt::AlignHCenter|Qt::AlignTop 0 0 0 0 Scan .. 0 0 Cancel .. 0 0 Refresh .. Device: QDockWidget::DockWidgetFloatable|QDockWidget::DockWidgetMovable &Output 2 true .. Sources Sources .. Zoom In Zoom in .. Zoom Out Zoom out true .. Normal Size Normal size true .. Best Fit Best fit .. Rotate Left Rotate left .. Rotate Right Rotate right true :/icons/controls:/icons/controls Image Controls Image controls :/icons/autolayout:/icons/autolayout Autodetect Layout Autodetect layout true .. Toggle Output Pane Toggle output pane gImageReader-3.2.3/qt/data/PageRangeDialog.ui000066400000000000000000000075251312567024200207130ustar00rootroot00000000000000 PageRangeDialog 0 0 263 202 Page Range Page range: <small><b>Example:</b> 1-10, 13, 14-18</small> Recognition area: Entire page Autodetect Qt::Horizontal QDialogButtonBox::Cancel|QDialogButtonBox::Ok Qt::Vertical 20 40 Prepend to output text: 2 2 2 2 2 Source filename Source page buttonBox accepted() PageRangeDialog accept() 248 254 157 274 buttonBox rejected() PageRangeDialog reject() 316 260 286 274 gImageReader-3.2.3/qt/data/PdfExportDialog.ui000066400000000000000000000207131312567024200207670ustar00rootroot00000000000000 PdfExportDialog 0 0 411 436 PDF Export Output mode: PDF PDF with invisible text overlay Qt::Horizontal QDialogButtonBox::Cancel|QDialogButtonBox::Ok Show preview Text settings: 4 4 4 4 Uniformize line and word spacing false Preserve spaces wider than: 0 20 false Scale: 20 Use detected font sizes Document font: false 1 false characters false % 50 200 100 Image settings: false 4 4 4 4 50 1200 10 300 false Compression quality: DPI: 100 90 Format: Compression: false Dithering algorithm: false buttonBox accepted() PdfExportDialog accept() 248 254 157 274 buttonBox rejected() PdfExportDialog reject() 316 260 286 274 gImageReader-3.2.3/qt/data/gimagereader.qrc000066400000000000000000000033551312567024200205230ustar00rootroot00000000000000 ../../data/icons/angle.png ../../data/icons/autolayout.png ../../data/icons/brightness.png ../../data/icons/contrast.png ../../data/icons/controls.png ../../data/icons/filtering.png ../../data/icons/ins_append.png ../../data/icons/ins_cursor.png ../../data/icons/ins_replace.png ../../data/icons/page.png ../../data/icons/resolution.png ../../data/icons/stripcrlf.png ../../data/icons/48x48/gimagereader.png ../../data/icons/128x128/gimagereader.png ../../data/icons/256x256/gimagereader.png ../../data/icons/select.png ../../data/icons/item_block.png ../../data/icons/item_line.png ../../data/icons/item_page.png ../../data/icons/item_par.png ../../data/icons/item_word.png ../../data/icons/item_halftone.png ../../data/icons/rotate_page.png ../../data/icons/rotate_pages.png gImageReader-3.2.3/qt/src/000077500000000000000000000000001312567024200152505ustar00rootroot00000000000000gImageReader-3.2.3/qt/src/Acquirer.cc000066400000000000000000000151611312567024200173360ustar00rootroot00000000000000/* -*- Mode: C++; indent-tabs-mode: t; c-basic-offset: 4; tab-width: 4 -*- */ /* * Acquirer.cc * Copyright (C) 2013-2017 Sandro Mani * * gImageReader 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. * * gImageReader 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 this program. If not, see . */ #include #include #include #include #include "Acquirer.hh" #include "Config.hh" #include "MainWindow.hh" #include "Utils.hh" #ifdef Q_OS_WIN32 #include "scanner/ScannerTwain.hh" #else #include "scanner/ScannerSane.hh" #endif Acquirer::Acquirer(const UI_MainWindow& _ui) : ui(_ui) { ui.pushButtonScanCancel->setVisible(false); ui.toolButtonScanDevicesRefresh->setEnabled(false); ui.pushButtonScan->setEnabled(false); ui.comboBoxScanDevice->setCursor(Qt::WaitCursor); // TODO: Elide combobox m_scanner = new ScannerImpl; qRegisterMetaType>(); qRegisterMetaType(); connect(ui.toolButtonScanDevicesRefresh, SIGNAL(clicked()), this, SLOT(startDetectDevices())); connect(ui.pushButtonScan, SIGNAL(clicked()), this, SLOT(startScan())); connect(ui.pushButtonScanCancel, SIGNAL(clicked()), this, SLOT(cancelScan())); connect(ui.toolButtonScanOutput, SIGNAL(clicked()), this, SLOT(selectOutputPath())); connect(ui.comboBoxScanDevice, SIGNAL(currentIndexChanged(int)), this, SLOT(setDeviceComboTooltip())); connect(m_scanner, SIGNAL(initFailed()), this, SLOT(scanInitFailed())); connect(m_scanner, SIGNAL(devicesDetected(QList)), this, SLOT(doneDetectDevices(QList))); connect(m_scanner, SIGNAL(scanFailed(QString)), this, SLOT(scanFailed(QString))); connect(m_scanner, SIGNAL(scanStateChanged(Scanner::State)), this, SLOT(setScanState(Scanner::State))); connect(m_scanner, SIGNAL(pageAvailable(QString)), this, SIGNAL(scanPageAvailable(QString))); MAIN->getConfig()->addSetting(new ComboSetting("scanres", ui.comboBoxScanResolution, 2)); MAIN->getConfig()->addSetting(new ComboSetting("scanmode", ui.comboBoxScanMode, 0)); MAIN->getConfig()->addSetting(new ComboSetting("scandev", ui.comboBoxScanDevice, 0)); MAIN->getConfig()->addSetting(new VarSetting("scanoutput", QDir(Utils::documentsFolder()).absoluteFilePath(_("scan.png")))); m_outputPath = MAIN->getConfig()->getSetting>("scanoutput")->getValue(); genOutputPath(); m_scanner->init(); } Acquirer::~Acquirer() { m_scanner->close(); delete m_scanner; } void Acquirer::selectOutputPath() { QSet formats; for(const QByteArray& format : QImageReader::supportedImageFormats()) { formats.insert(QString("*.%1").arg(QString(format).toLower())); } QString filter = QString("%1 (%2)").arg(_("Images")).arg(QStringList(formats.toList()).join(" ")); QString filename = QFileDialog::getSaveFileName(MAIN, _("Choose Output Filename..."), m_outputPath, filter); if(!filename.isEmpty()) { m_outputPath = filename; genOutputPath(); } } void Acquirer::genOutputPath() { m_outputPath = Utils::makeOutputFilename(m_outputPath); ui.lineEditScanOutput->setText(m_outputPath); ui.lineEditScanOutput->setToolTip(m_outputPath);; MAIN->getConfig()->getSetting>("scanoutput")->setValue(m_outputPath); } void Acquirer::scanInitFailed() { ui.labelScanMessage->setText(QString("%1").arg(_("Failed to initialize the scanning backend."))); ui.pushButtonScan->setEnabled(false); ui.toolButtonScanDevicesRefresh->setEnabled(false); } void Acquirer::scanFailed(const QString &msg) { ui.labelScanMessage->setText(QString("%1: %2.").arg(_("Scan failed")).arg(msg)); } void Acquirer::startDetectDevices() { ui.toolButtonScanDevicesRefresh->setEnabled(false); ui.pushButtonScan->setEnabled(false); ui.labelScanMessage->setText(""); ui.comboBoxScanDevice->clear(); ui.comboBoxScanDevice->setCursor(Qt::WaitCursor); m_scanner->redetect(); } void Acquirer::doneDetectDevices(QList devices) { ui.comboBoxScanDevice->unsetCursor(); ui.toolButtonScanDevicesRefresh->setEnabled(true); if(devices.isEmpty()) { ui.labelScanMessage->setText(QString("%1").arg(_("No scanners were detected."))); } else { for(const Scanner::Device& device : devices) { ui.comboBoxScanDevice->addItem(device.label, device.name); } ui.comboBoxScanDevice->setCurrentIndex(0); ui.pushButtonScan->setEnabled(true); } } void Acquirer::startScan() { ui.pushButtonScan->setVisible(false); ui.pushButtonScanCancel->setEnabled(true); ui.pushButtonScanCancel->setVisible(true); ui.labelScanMessage->setText(_("Starting scan...")); double dpi[] = {75., 100., 200., 300., 600., 1200.}; Scanner::ScanMode modes[] = {Scanner::ScanMode::GRAY, Scanner::ScanMode::COLOR}; genOutputPath(); QString device = ui.comboBoxScanDevice->itemData(ui.comboBoxScanDevice->currentIndex()).toString(); Scanner::Params params = {device, m_outputPath, dpi[ui.comboBoxScanResolution->currentIndex()], modes[ui.comboBoxScanMode->currentIndex()], 8, Scanner::ScanType::SINGLE, 0, 0}; m_scanner->scan(params); genOutputPath(); // Prepare for next } void Acquirer::setScanState(Scanner::State state) { if(state == Scanner::State::OPEN) { ui.labelScanMessage->setText(_("Opening device...")); } else if(state == Scanner::State::SET_OPTIONS) { ui.labelScanMessage->setText(_("Setting options...")); } else if(state == Scanner::State::START) { ui.labelScanMessage->setText(_("Starting scan...")); } else if(state == Scanner::State::GET_PARAMETERS) { ui.labelScanMessage->setText(_("Getting parameters...")); } else if(state == Scanner::State::READ) { ui.labelScanMessage->setText(_("Transferring data...")); } else if(state == Scanner::State::IDLE) { doneScan(); } } void Acquirer::cancelScan() { ui.labelScanMessage->setText(_("Canceling scan...")); m_scanner->cancel(); ui.pushButtonScanCancel->setEnabled(false); } void Acquirer::doneScan() { ui.pushButtonScanCancel->setVisible(false); ui.pushButtonScan->setVisible(true); ui.labelScanMessage->setText(""); } void Acquirer::setDeviceComboTooltip() { ui.comboBoxScanDevice->setToolTip(ui.comboBoxScanDevice->currentText()); } gImageReader-3.2.3/qt/src/Acquirer.hh000066400000000000000000000030031312567024200173400ustar00rootroot00000000000000/* -*- Mode: C++; indent-tabs-mode: t; c-basic-offset: 4; tab-width: 4 -*- */ /* * Acquirer.hh * Copyright (C) 2013-2017 Sandro Mani * * gImageReader 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. * * gImageReader 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 this program. If not, see . */ #ifndef ACQUIRER_HH #define ACQUIRER_HH #include "Scanner.hh" class UI_MainWindow; class Acquirer : public QObject { Q_OBJECT public: Acquirer(const UI_MainWindow& _ui); ~Acquirer(); signals: void scanPageAvailable(QString); private: const UI_MainWindow& ui; QString m_outputPath; Scanner* m_scanner; void genOutputPath(); private slots: void cancelScan(); void doneDetectDevices(QList devices); void doneScan(); void scanInitFailed(); void scanFailed(const QString& msg); void selectOutputPath(); void setDeviceComboTooltip(); void setScanState(Scanner::State state); void startDetectDevices(); void startScan(); }; Q_DECLARE_METATYPE(QList) #endif // ACQUIRER_HH gImageReader-3.2.3/qt/src/Config.cc000066400000000000000000000573031312567024200167740ustar00rootroot00000000000000/* -*- Mode: C++; indent-tabs-mode: t; c-basic-offset: 4; tab-width: 4 -*- */ /* * Config.cc * Copyright (C) 2013-2017 Sandro Mani * * gImageReader 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. * * gImageReader 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 this program. If not, see . */ #include "Config.hh" #include "MainWindow.hh" #include #include #include #if QT_VERSION >= QT_VERSION_CHECK(5, 0, 0) #include #endif #include #include const QList Config::LANGUAGES = { // {ISO 639-2, ISO 639-1, name} {"afr", "af", QString::fromUtf8("Afrikaans")}, // Afrikaans {"amh", "am", QString::fromUtf8("\u12a0\u121b\u122d\u129b")}, // Amharic {"ara", "ar", QString::fromUtf8("\u0627\u0644\u0639\u0631\u0628\u064a\u0629")}, // Arabic {"asm", "as", QString::fromUtf8("\u0985\u09b8\u09ae\u09c0\u09af\u09bc\u09be")}, // Assamese {"aze", "az", QString::fromUtf8("\u0622\u0630\u0631\u0628\u0627\u06cc\u062c\u0627\u0646")}, // Azerbaijani {"aze_cyrl", "az", QString::fromUtf8("Az\u0259rbaycan dili")}, // Azerbaijani (Cyrillic) {"bel", "be", QString::fromUtf8("\u0431\u0435\u043b\u0430\u0440\u0443\u0441\u043a\u0430\u044f \u043c\u043e\u0432\u0430")}, // Belarusian {"ben", "bn", QString::fromUtf8("\u09ac\u09be\u0982\u09b2\u09be")}, // Bengali {"bod", "bo", QString::fromUtf8("\u0f56\u0f7c\u0f51\u0f0b\u0f61\u0f72\u0f42")}, // "Tibetan (Standard)" {"bos", "bs", QString::fromUtf8("Bosanski jezik")}, // Bosnian {"bul", "bg", QString::fromUtf8("\u0431\u044a\u043b\u0433\u0430\u0440\u0441\u043a\u0438 \u0435\u0437\u0438\u043a")}, // Bulgarian {"cat", "ca", QString::fromUtf8("Catal\u00e0")}, // Catalan {"ceb", "", QString::fromUtf8("Cebuano")}, // Cebuano {"ces", "cs", QString::fromUtf8("\u010ce\u0161tina")}, // Czech {"chi_sim", "zh_CN", QString::fromUtf8("\u7b80\u4f53\u5b57")}, // Chinese (Simplified) {"chi_tra", "zh_TW", QString::fromUtf8("\u7e41\u9ad4\u5b57")}, // Chinese (Traditional) {"chr", "", QString::fromUtf8("\u13e3\u13b3\u13a9 \u13a6\u13ec\u13c2\u13af\u13cd\u13d7")}, // Cherokee {"cym", "cy", QString::fromUtf8("Cymraeg")}, // Welsh {"dan", "da", QString::fromUtf8("Dansk")}, // Danish {"dan_frak", "da", QString::fromUtf8("Dansk (Fraktur)")}, // Danish (Fraktur) {"deu", "de", QString::fromUtf8("Deutsch")}, // German {"deu_frak", "de", QString::fromUtf8("Deutsch (Fraktur)")}, // German (Fraktur) {"dzo", "dz", QString::fromUtf8("\u0f62\u0fab\u0f7c\u0f44\u0f0b\u0f41")}, // Dzongkha {"ell", "el", QString::fromUtf8("\u03b5\u03bb\u03bb\u03b7\u03bd\u03b9\u03ba\u03ac")}, // Greek {"eng", "en", QString::fromUtf8("English")}, {"enm", "en", QString::fromUtf8("Middle English (1100-1500)")}, // Middle English (1100-1500) {"epo", "eo", QString::fromUtf8("Esperanto")}, // Esperanto {"equ", "", QString::fromUtf8("Math / Equations")}, // Math / equation {"est", "et", QString::fromUtf8("Eesti keel")}, // Estonian {"eus", "eu", QString::fromUtf8("Euskara")}, // Basque {"fas", "fa", QString::fromUtf8("\u0641\u0627\u0631\u0633\u06cc")}, // Persian (Farsi) {"fin", "fi", QString::fromUtf8("Suomen kieli")}, // Finnish {"fra", "fr", QString::fromUtf8("Fran\u00e7ais")}, // French {"frk", "", QString::fromUtf8("Frankish")}, // Frankish {"frm", "fr", QString::fromUtf8("Moyen fran\u00e7ais (ca. 1400-1600)")}, // Middle French (ca. 1400-1600) {"gle", "ga", QString::fromUtf8("Gaeilge")}, // Irish {"glg", "gl", QString::fromUtf8("Galego")}, // Galician {"grc", "el", QString::fromUtf8("\u1f19\u03bb\u03bb\u03b7\u03bd\u03b9\u03ba\u03ae")}, // Ancient Greek {"guj", "gu", QString::fromUtf8("\u0a97\u0ac1\u0a9c\u0ab0\u0abe\u0aa4\u0ac0")}, // Gujarati {"hat", "ht", QString::fromUtf8("Krey\u00f2l ayisyen")}, // Haitian {"heb", "he", QString::fromUtf8("\u05e2\u05d1\u05e8\u05d9\u05ea")}, // Hebrew {"hin", "hi", QString::fromUtf8("\u0939\u093f\u0928\u094d\u0926\u0940")}, // Hindi {"hrv", "hr", QString::fromUtf8("Hrvatski")}, // Croatian {"hun", "hu", QString::fromUtf8("Magyar")}, // Hungarian {"iku", "iu", QString::fromUtf8("Inuktitut")}, // Inuktitut {"ind", "id", QString::fromUtf8("Bahasa indonesia")}, // Indonesian {"isl", "is", QString::fromUtf8("\u00cdslenska")}, // Icelandic {"ita", "it", QString::fromUtf8("Italiano")}, // Italian {"ita_old", "it", QString::fromUtf8("Italiano (Antico)")}, // Italian (Old) {"jav", "jv", QString::fromUtf8("Basa jawa")}, // Javanese {"jpn", "ja", QString::fromUtf8("\u65e5\u672c\u8a9e")}, // Japanese {"kan", "kn", QString::fromUtf8("\u0c95\u0ca8\u0ccd\u0ca8\u0ca1")}, // Kannada {"kat", "ka", QString::fromUtf8("\u10e5\u10d0\u10e0\u10d7\u10e3\u10da\u10d8")}, // Georgian {"kat_old", "ka", QString::fromUtf8("\u10d4\u10dc\u10d0\u10f2 \u10e5\u10d0\u10e0\u10d7\u10e3\u10da\u10d8")}, // Georgian (Old) {"kaz", "kk", QString::fromUtf8("\u049b\u0430\u0437\u0430\u049b \u0442\u0456\u043b\u0456")}, // Kazakh {"khm", "km", QString::fromUtf8("\u1781\u17d2\u1798\u17c2\u179a")}, // Khmer {"kir", "ky", QString::fromUtf8("\u041a\u044b\u0440\u0433\u044b\u0437\u0447\u0430")}, // Kyrgyz {"kor", "ko", QString::fromUtf8("\ud55c\uad6d\uc5b4")}, // Korean {"kur", "ku", QString::fromUtf8("\u0643\u0648\u0631\u062f\u06cc")}, // Kurdish {"lao", "lo", QString::fromUtf8("\u0e9e\u0eb2\u0eaa\u0eb2\u0ea5\u0eb2\u0ea7")}, // Lao {"lat", "la", QString::fromUtf8("Latina")}, // Latin {"lav", "lv", QString::fromUtf8("Latvie\u0161u valoda")}, // Latvian {"lit", "lt", QString::fromUtf8("Lietuvos")}, // Lithuanian {"mal", "ml", QString::fromUtf8("\u0d2e\u0d32\u0d2f\u0d3e\u0d33\u0d02")}, // Malayalam {"mar", "mr", QString::fromUtf8("\u092e\u0930\u093e\u0920\u0940")}, // Marathi {"mkd", "mk", QString::fromUtf8("\u043c\u0430\u043a\u0435\u0434\u043e\u043d\u0441\u043a\u0438 \u0458\u0430\u0437\u0438\u043a")}, // Macedonian {"mlt", "mt", QString::fromUtf8("Malti")}, // Maltese {"msa", "ms", QString::fromUtf8("Melayu")}, // Malay {"mya", "my", QString::fromUtf8("\u1017\u1019\u102c\u1005\u102c")}, // Burmese {"nep", "ne", QString::fromUtf8("\u0928\u0947\u092a\u093e\u0932\u0940")}, // Nepali {"nld", "nl", QString::fromUtf8("Nederlands")}, // Dutch {"nor", "no", QString::fromUtf8("Norsk")}, // Norwegian {"ori", "or", QString::fromUtf8("\u0b13\u0b21\u0b3c\u0b3f\u0b06")}, // Oriya {"pan", "pa", QString::fromUtf8("\u0a2a\u0a70\u0a1c\u0a3e\u0a2c\u0a40")}, // Panjabi {"pol", "pl", QString::fromUtf8("Polskie")}, // Polish {"por", "pt", QString::fromUtf8("Portugu\u00eas")}, // Portuguese {"pus", "ps", QString::fromUtf8("\u067e\u069a\u062a\u0648")}, // Pashto {"ron", "ro", QString::fromUtf8("Limba rom\u00e2n\u0103")}, // Romanian {"rus", "ru", QString::fromUtf8("\u0420\u0443\u0441\u0441\u043a\u0438\u0439")}, // Russian {"san", "sa", QString::fromUtf8("\u0938\u0902\u0938\u094d\u0915\u0943\u0924\u092e\u094d")}, // Sanskrit {"sin", "si", QString::fromUtf8("\u0dc3\u0dd2\u0d82\u0dc4\u0dbd")}, // Sinhala {"slk", "sk", QString::fromUtf8("Sloven\u010dina")}, // Slovak {"slk_frak", "sk", QString::fromUtf8("Sloven\u010dina (Frakt\u00far)")}, // Slovak (Fraktur) {"slv", "sl", QString::fromUtf8("Sloven\u0161\u010dina")}, // Slovene {"spa", "es", QString::fromUtf8("Espa\u00f1ol")}, // Spanish {"spa_old", "es", QString::fromUtf8("Espa\u00f1ol (Antiguo)")}, // Spanish (Old) {"sqi", "sq", QString::fromUtf8("Shqip")}, // Albanian {"srp", "sr", QString::fromUtf8("\u0441\u0440\u043f\u0441\u043a\u0438 \u0458\u0435\u0437\u0438\u043a")}, // Serbian {"srp_latn", "sr", QString::fromUtf8("Srpski")}, // Serbian (Latin) {"swa", "sw", QString::fromUtf8("Swahili")}, // Swahili {"swe", "sv", QString::fromUtf8("Svenska")}, // Swedish {"syr", "", QString::fromUtf8("\u0720\u072b\u0722\u0710 \u0723\u0718\u072a\u071d\u071d\u0710")}, // Syriac {"tam", "ta", QString::fromUtf8("\u0ba4\u0bae\u0bbf\u0bb4\u0bcd")}, // Tamil {"tel", "te", QString::fromUtf8("\u0c24\u0c46\u0c32\u0c41\u0c17\u0c41")}, // Telugu {"tgk", "tg", QString::fromUtf8("\u0442\u043e\u04b7\u0438\u043a\u04e3")}, // Tajik {"tgl", "tl", QString::fromUtf8("Tagalog")}, // Tagalog {"tha", "th", QString::fromUtf8("\u0e44\u0e17\u0e22")}, // Thai {"tir", "ti", QString::fromUtf8("\u1275\u130d\u122d\u129b")}, // Tigrinya {"tur", "tr", QString::fromUtf8("T\u00fcrk\u00e7e")}, // Turkish {"uig", "ug", QString::fromUtf8("\u0626\u06c7\u064a\u063a\u06c7\u0631\u0686\u06d5\u200e")}, // Uyghur {"ukr", "uk", QString::fromUtf8("\u0443\u043a\u0440\u0430\u0457\u043d\u0441\u044c\u043a\u0430 \u043c\u043e\u0432\u0430")}, // Ukrainian {"urd", "ur", QString::fromUtf8("\u0627\u0631\u062f\u0648")}, // Urdu {"uzb", "uz", QString::fromUtf8("O\u02bbzbek")}, // Uzbek {"uzb_cyrl", "uz", QString::fromUtf8("\u040e\u0437\u0431\u0435\u043a")}, // Uzbek (Cyrillic) {"vie", "vi", QString::fromUtf8("Vi\u1ec7t Nam")}, // Vietnamese {"yid", "yi", QString::fromUtf8("\u05d9\u05d9\u05b4\u05d3\u05d9\u05e9")}, // Yiddish }; QMultiMap Config::buildLanguageCultureTable() { QMultiMap map; map.insert("af", "af_ZA"); map.insert("ar", "ar_AE"); map.insert("ar", "ar_BH"); map.insert("ar", "ar_DZ"); map.insert("ar", "ar_EG"); map.insert("ar", "ar_IQ"); map.insert("ar", "ar_JO"); map.insert("ar", "ar_KW"); map.insert("ar", "ar_LB"); map.insert("ar", "ar_LY"); map.insert("ar", "ar_MA"); map.insert("ar", "ar_OM"); map.insert("ar", "ar_QA"); map.insert("ar", "ar_SA"); map.insert("ar", "ar_SY"); map.insert("ar", "ar_TN"); map.insert("ar", "ar_YE"); map.insert("az", "az_AZ"); map.insert("az", "az_AZ"); map.insert("be", "be_BY"); map.insert("bg", "bg_BG"); map.insert("ca", "ca_ES"); map.insert("cs", "cs_CZ"); map.insert("da", "da_DK"); map.insert("de", "de_AT"); map.insert("de", "de_CH"); map.insert("de", "de_DE"); map.insert("de", "de_LI"); map.insert("de", "de_LU"); map.insert("div", "div_MV"); map.insert("el", "el_GR"); map.insert("en", "en_AU"); map.insert("en", "en_BZ"); map.insert("en", "en_CA"); map.insert("en", "en_CB"); map.insert("en", "en_GB"); map.insert("en", "en_IE"); map.insert("en", "en_JM"); map.insert("en", "en_NZ"); map.insert("en", "en_PH"); map.insert("en", "en_TT"); map.insert("en", "en_US"); map.insert("en", "en_ZA"); map.insert("en", "en_ZW"); map.insert("es", "es_AR"); map.insert("es", "es_BO"); map.insert("es", "es_CL"); map.insert("es", "es_CO"); map.insert("es", "es_CR"); map.insert("es", "es_DO"); map.insert("es", "es_EC"); map.insert("es", "es_ES"); map.insert("es", "es_GT"); map.insert("es", "es_HN"); map.insert("es", "es_MX"); map.insert("es", "es_NI"); map.insert("es", "es_PA"); map.insert("es", "es_PE"); map.insert("es", "es_PR"); map.insert("es", "es_PY"); map.insert("es", "es_SV"); map.insert("es", "es_UY"); map.insert("es", "es_VE"); map.insert("et", "et_EE"); map.insert("eu", "eu_ES"); map.insert("fa", "fa_IR"); map.insert("fi", "fi_FI"); map.insert("fo", "fo_FO"); map.insert("fr", "fr_BE"); map.insert("fr", "fr_CA"); map.insert("fr", "fr_CH"); map.insert("fr", "fr_FR"); map.insert("fr", "fr_LU"); map.insert("fr", "fr_MC"); map.insert("gl", "gl_ES"); map.insert("gu", "gu_IN"); map.insert("he", "he_IL"); map.insert("hi", "hi_IN"); map.insert("hr", "hr_HR"); map.insert("hu", "hu_HU"); map.insert("hy", "hy_AM"); map.insert("id", "id_ID"); map.insert("is", "is_IS"); map.insert("it", "it_CH"); map.insert("it", "it_IT"); map.insert("ja", "ja_JP"); map.insert("ka", "ka_GE"); map.insert("kk", "kk_KZ"); map.insert("kn", "kn_IN"); map.insert("kok", "kok_IN"); map.insert("ko", "ko_KR"); map.insert("ky", "ky_KZ"); map.insert("lt", "lt_LT"); map.insert("lv", "lv_LV"); map.insert("mk", "mk_MK"); map.insert("mn", "mn_MN"); map.insert("mr", "mr_IN"); map.insert("ms", "ms_BN"); map.insert("ms", "ms_MY"); map.insert("nb", "nb_NO"); map.insert("nl", "nl_BE"); map.insert("nl", "nl_NL"); map.insert("nn", "nn_NO"); map.insert("pa", "pa_IN"); map.insert("pl", "pl_PL"); map.insert("pt", "pt_BR"); map.insert("pt", "pt_PT"); map.insert("ro", "ro_RO"); map.insert("ru", "ru_RU"); map.insert("sa", "sa_IN"); map.insert("sk", "sk_SK"); map.insert("sl", "sl_SI"); map.insert("sq", "sq_AL"); map.insert("sr", "sr_SP"); map.insert("sr", "sr_SP"); map.insert("sv", "sv_FI"); map.insert("sv", "sv_SE"); map.insert("sw", "sw_KE"); map.insert("syr", "syr_SY"); map.insert("ta", "ta_IN"); map.insert("te", "te_IN"); map.insert("th", "th_TH"); map.insert("tr", "tr_TR"); map.insert("tt", "tt_RU"); map.insert("uk", "uk_UA"); map.insert("ur", "ur_PK"); map.insert("uz", "uz_UZ"); map.insert("uz", "uz_UZ"); map.insert("vi", "vi_VN"); map.insert("zh", "zh_CHS"); map.insert("zh", "zh_CHT"); map.insert("zh", "zh_CN"); map.insert("zh", "zh_HK"); map.insert("zh", "zh_MO"); map.insert("zh", "zh_SG"); map.insert("zh", "zh_TW"); return map; } const QMultiMap Config::LANGUAGE_CULTURES = Config::buildLanguageCultureTable(); Config::Config(QWidget* parent) : QDialog(parent) { ui.setupUi(this); #if QT_VERSION < QT_VERSION_CHECK(5, 0, 0) ui.tableWidgetPredefLang->horizontalHeader()->setResizeMode(QHeaderView::Stretch); ui.tableWidgetAdditionalLang->horizontalHeader()->setResizeMode(QHeaderView::Stretch); #else ui.tableWidgetPredefLang->horizontalHeader()->setSectionResizeMode(QHeaderView::Stretch); ui.tableWidgetAdditionalLang->horizontalHeader()->setSectionResizeMode(QHeaderView::Stretch); #endif ui.widgetAddLang->setVisible(false); #if !ENABLE_VERSIONCHECK ui.checkBoxUpdateCheck->setVisible(false); #endif for(const Lang& lang : LANGUAGES) { int row = ui.tableWidgetPredefLang->rowCount(); ui.tableWidgetPredefLang->insertRow(row); ui.tableWidgetPredefLang->setItem(row, 0, new QTableWidgetItem(lang.prefix)); ui.tableWidgetPredefLang->setItem(row, 1, new QTableWidgetItem(lang.code)); ui.tableWidgetPredefLang->setItem(row, 2, new QTableWidgetItem(lang.name)); } connect(ui.checkBoxDefaultOutputFont, SIGNAL(toggled(bool)), ui.pushButtonOutputFont, SLOT(setDisabled(bool))); connect(ui.pushButtonOutputFont, SIGNAL(clicked()), &m_fontDialog, SLOT(exec())); connect(&m_fontDialog, SIGNAL(fontSelected(QFont)), this, SLOT(updateFontButton(QFont))); connect(ui.pushButtonAddLang, SIGNAL(clicked()), this, SLOT(toggleAddLanguage())); connect(ui.pushButtonRemoveLang, SIGNAL(clicked()), this, SLOT(removeLanguage())); connect(ui.pushButtonAddLangOk, SIGNAL(clicked()), this, SLOT(addLanguage())); connect(ui.pushButtonAddLangCancel, SIGNAL(clicked()), this, SLOT(toggleAddLanguage())); connect(ui.tableWidgetAdditionalLang->selectionModel(), SIGNAL(selectionChanged(QItemSelection,QItemSelection)), this, SLOT(langTableSelectionChanged(QItemSelection,QItemSelection))); connect(ui.buttonBox->button(QDialogButtonBox::Help), SIGNAL(clicked()), MAIN, SLOT(showHelp())); connect(ui.lineEditLangPrefix, SIGNAL(textChanged(QString)), this, SLOT(clearLineEditErrorState())); connect(ui.lineEditLangName, SIGNAL(textChanged(QString)), this, SLOT(clearLineEditErrorState())); connect(ui.lineEditLangCode, SIGNAL(textChanged(QString)), this, SLOT(clearLineEditErrorState())); connect(ui.comboBoxDataLocation, SIGNAL(currentIndexChanged(int)), this, SLOT(setDataLocations(int))); addSetting(new SwitchSetting("dictinstall", ui.checkBoxDictInstall, true)); addSetting(new SwitchSetting("updatecheck", ui.checkBoxUpdateCheck, true)); addSetting(new TableSetting("customlangs", ui.tableWidgetAdditionalLang)); addSetting(new SwitchSetting("systemoutputfont", ui.checkBoxDefaultOutputFont, true)); addSetting(new FontSetting("customoutputfont", &m_fontDialog, QFont().toString())); addSetting(new ComboSetting("textencoding", ui.comboBoxEncoding, 0)); addSetting(new ComboSetting("datadirs", ui.comboBoxDataLocation, 0)); updateFontButton(m_fontDialog.currentFont()); } Config::~Config() { qDeleteAll(m_settings); } bool Config::searchLangSpec(Lang& lang) const { for(const QTableWidget* table : QList {ui.tableWidgetPredefLang, ui.tableWidgetAdditionalLang}) { for(int row = 0, nRows = table->rowCount(); row < nRows; ++row) { if(table->item(row, 0)->text() == lang.prefix) { lang = {table->item(row, 0)->text(), table->item(row, 1)->text(), table->item(row, 2)->text()}; return true; } } } return false; } QList Config::searchLangCultures(const QString& code) const { return LANGUAGE_CULTURES.values(code); } void Config::showDialog() { toggleAddLanguage(true); exec(); getSetting("customlangs")->serialize(); } bool Config::useUtf8() const { return ui.comboBoxEncoding->currentIndex() == 1; } bool Config::useSystemDataLocations() const { return ui.comboBoxDataLocation->currentIndex() == 0; } QString Config::tessdataLocation() const { return ui.lineEditTessdataLocation->text(); } QString Config::spellingLocation() const { return ui.lineEditSpellLocation->text(); } void Config::disableDictInstall() { getSetting("dictinstall")->setValue(false); } void Config::disableUpdateCheck() { getSetting("updatecheck")->setValue(false); } void Config::setDataLocations(int idx) { if(idx == 0) { #ifdef Q_OS_WIN QDir dataDir = QDir(QString("%1/../share/").arg(QApplication::applicationDirPath())); qputenv("TESSDATA_PREFIX", dataDir.absolutePath().toLocal8Bit()); ui.lineEditSpellLocation->setText(dataDir.absoluteFilePath("myspell/dicts")); #else QDir dataDir("/usr/share"); #if QT_VERSION < QT_VERSION_CHECK(5, 0, 0) unsetenv("TESSDATA_PREFIX"); #else qunsetenv("TESSDATA_PREFIX"); #endif if(QDir(dataDir.absoluteFilePath("myspell/dicts")).exists()) { ui.lineEditSpellLocation->setText(dataDir.absoluteFilePath("myspell/dicts")); } else { ui.lineEditSpellLocation->setText(dataDir.absoluteFilePath("myspell")); } #endif } else { #if QT_VERSION < QT_VERSION_CHECK(5, 0, 0) # ifdef Q_OS_WIN QDir configDir = QDir(QDir::home().absoluteFilePath("Local Settings/Application Data")); # else QDir configDir = QDir(QDir::home().absoluteFilePath(".config")); # endif #else QDir configDir = QDir(QStandardPaths::writableLocation(QStandardPaths::GenericConfigLocation)); #endif qputenv("TESSDATA_PREFIX", configDir.absoluteFilePath("tessdata").toLocal8Bit()); ui.lineEditSpellLocation->setText(configDir.absoluteFilePath("enchant/myspell")); } tesseract::TessBaseAPI tess; QByteArray current = setlocale(LC_NUMERIC, NULL); setlocale(LC_NUMERIC, "C"); tess.Init(nullptr, nullptr); setlocale(LC_NUMERIC, current.constData()); ui.lineEditTessdataLocation->setText(QString(tess.GetDatapath())); } void Config::openTessdataDir() { int idx = QSettings().value("datadirs").toInt(); if(idx == 0) { #ifdef Q_OS_WIN QDir dataDir = QDir(QString("%1/../share/").arg(QApplication::applicationDirPath())); qputenv("TESSDATA_PREFIX", dataDir.absolutePath().toLocal8Bit()); #else # if QT_VERSION < QT_VERSION_CHECK(5, 0, 0) unsetenv("TESSDATA_PREFIX"); # else qunsetenv("TESSDATA_PREFIX"); # endif #endif } else { #if QT_VERSION < QT_VERSION_CHECK(5, 0, 0) # ifdef Q_OS_WIN QDir configDir = QDir(QDir::home().absoluteFilePath("Local Settings/Application Data")); # else QDir configDir = QDir(QDir::home().absoluteFilePath(".config")); # endif #else QDir configDir = QDir(QStandardPaths::writableLocation(QStandardPaths::GenericConfigLocation)); #endif qputenv("TESSDATA_PREFIX", configDir.absoluteFilePath("tessdata").toLocal8Bit()); } tesseract::TessBaseAPI tess; QByteArray current = setlocale(LC_NUMERIC, NULL); setlocale(LC_NUMERIC, "C"); tess.Init(nullptr, nullptr); setlocale(LC_NUMERIC, current.constData()); QDir().mkpath(QString(tess.GetDatapath())); QDesktopServices::openUrl(QUrl::fromLocalFile(QString(tess.GetDatapath()))); } void Config::openSpellingDir() { int idx = QSettings().value("datadirs").toInt(); if(idx == 0) { #ifdef Q_OS_WIN QDir dataDir = QDir(QString("%1/../share/").arg(QApplication::applicationDirPath())); QDir().mkpath(dataDir.absoluteFilePath("myspell/dicts")); QDesktopServices::openUrl(QUrl::fromLocalFile(dataDir.absoluteFilePath("myspell/dicts"))); #else QDir dataDir("/usr/share"); if(QDir(dataDir.absoluteFilePath("myspell/dicts")).exists()) { QDesktopServices::openUrl(QUrl::fromLocalFile(dataDir.absoluteFilePath("myspell/dicts"))); } else { QDesktopServices::openUrl(QUrl::fromLocalFile(dataDir.absoluteFilePath("myspell"))); } #endif } else { #if QT_VERSION < QT_VERSION_CHECK(5, 0, 0) # ifdef Q_OS_WIN QDir configDir = QDir(QDir::home().absoluteFilePath("Local Settings/Application Data")); # else QDir configDir = QDir(QDir::home().absoluteFilePath(".config")); # endif #else QDir configDir = QDir(QStandardPaths::writableLocation(QStandardPaths::GenericConfigLocation)); #endif QDir().mkpath(configDir.absoluteFilePath("enchant/myspell")); QDesktopServices::openUrl(QUrl::fromLocalFile(configDir.absoluteFilePath("enchant/myspell"))); } } void Config::toggleAddLanguage(bool forceHide) { bool addVisible = forceHide ? true : ui.widgetAddLang->isVisible(); ui.widgetAddLang->setVisible(!addVisible); ui.widgetAddRemoveLang->setVisible(addVisible); if(addVisible) { ui.pushButtonAddLang->setFocus(); } else { ui.pushButtonAddLangOk->setFocus(); } ui.lineEditLangPrefix->setText(""); ui.lineEditLangPrefix->setStyleSheet(""); ui.lineEditLangCode->setText(""); ui.lineEditLangCode->setStyleSheet(""); ui.lineEditLangName->setText(""); ui.lineEditLangName->setStyleSheet(""); } void Config::addLanguage() { QString errorStyle = "background: #FF7777; color: #FFFFFF;"; bool invalid = false; if(QRegExp("^\\w+$").indexIn(ui.lineEditLangPrefix->text()) == -1) { invalid = true; ui.lineEditLangPrefix->setStyleSheet(errorStyle); } if(QRegExp("^.+$").indexIn(ui.lineEditLangName->text()) == -1) { invalid = true; ui.lineEditLangName->setStyleSheet(errorStyle); } if(QRegExp("^[a-z]{2}$").indexIn(ui.lineEditLangCode->text()) == -1 && QRegExp("^[a-z]{2}_[A-Z]{2}$").indexIn(ui.lineEditLangCode->text()) == -1) { invalid = true; ui.lineEditLangCode->setStyleSheet(errorStyle); } if(!invalid) { int row = ui.tableWidgetAdditionalLang->rowCount(); ui.tableWidgetAdditionalLang->insertRow(row); ui.tableWidgetAdditionalLang->setItem(row, 0, new QTableWidgetItem(ui.lineEditLangPrefix->text())); ui.tableWidgetAdditionalLang->setItem(row, 1, new QTableWidgetItem(ui.lineEditLangCode->text())); ui.tableWidgetAdditionalLang->setItem(row, 2, new QTableWidgetItem(ui.lineEditLangName->text())); ui.lineEditLangPrefix->setText(""); ui.lineEditLangCode->setText(""); ui.lineEditLangName->setText(""); toggleAddLanguage(); } } void Config::removeLanguage() { for(const QModelIndex& index : ui.tableWidgetAdditionalLang->selectionModel()->selectedRows()) { ui.tableWidgetAdditionalLang->removeRow(index.row()); } } void Config::updateFontButton(const QFont &font) { ui.pushButtonOutputFont->setText(QString("%1 %2").arg(font.family()).arg(font.pointSize())); } void Config::langTableSelectionChanged(const QItemSelection &selected, const QItemSelection &/*deselected*/) { ui.pushButtonRemoveLang->setDisabled(selected.isEmpty()); } void Config::clearLineEditErrorState() { static_cast(QObject::sender())->setStyleSheet(""); } gImageReader-3.2.3/qt/src/Config.hh000066400000000000000000000052071312567024200170020ustar00rootroot00000000000000/* -*- Mode: C++; indent-tabs-mode: t; c-basic-offset: 4; tab-width: 4 -*- */ /* * Config.hh * Copyright (C) 2013-2017 Sandro Mani * * gImageReader 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. * * gImageReader 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 this program. If not, see . */ #ifndef CONFIG_HH #define CONFIG_HH #include "common.hh" #include "ui_ConfigDialog.h" #include "ConfigSettings.hh" #include class Config : public QDialog { Q_OBJECT public: struct Lang { QString prefix, code, name; }; Config(QWidget* parent = nullptr); ~Config(); void addSetting(AbstractSetting* setting) { auto it = m_settings.find(setting->key()); if(it != m_settings.end()) { delete it.value(); it.value() = setting; } else { m_settings.insert(setting->key(), setting); } } template T* getSetting(const QString& key) const { auto it = m_settings.find(key); return it == m_settings.end() ? nullptr : static_cast(it.value()); } void removeSetting(const QString& key) { auto it = m_settings.find(key); if(it != m_settings.end()) { delete it.value(); m_settings.erase(it); } } bool searchLangSpec(Lang& lang) const; QList searchLangCultures(const QString& code) const; void showDialog(); bool useUtf8() const; bool useSystemDataLocations() const; QString tessdataLocation() const; QString spellingLocation() const; static void openTessdataDir(); static void openSpellingDir(); public slots: void disableDictInstall(); void disableUpdateCheck(); private: static const QList LANGUAGES; static const QMultiMap LANGUAGE_CULTURES; Ui::ConfigDialog ui; QFontDialog m_fontDialog; QMap m_settings; static QMultiMap buildLanguageCultureTable(); private slots: void addLanguage(); void removeLanguage(); void updateFontButton(const QFont& font); void langTableSelectionChanged(const QItemSelection& selected, const QItemSelection& deselected); void clearLineEditErrorState(); void setDataLocations(int idx); void toggleAddLanguage(bool forceHide = false); }; Q_DECLARE_METATYPE(Config::Lang) #endif // CONFIG_HH gImageReader-3.2.3/qt/src/ConfigSettings.cc000066400000000000000000000036071312567024200205130ustar00rootroot00000000000000/* -*- Mode: C++; indent-tabs-mode: t; c-basic-offset: 4; tab-width: 4 -*- */ /* * ConfigSettings.cc * Copyright (C) 2013-2017 Sandro Mani * * gImageReader 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. * * gImageReader 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 this program. If not, see . */ #include "ConfigSettings.hh" TableSetting::TableSetting(const QString& key, QTableWidget* table) : AbstractSetting(key), m_table(table) { QString str = QSettings().value(m_key).toString(); m_table->setRowCount(0); int nCols = m_table->columnCount(); for(const QString& row : str.split(';', QString::SkipEmptyParts)) { int colidx = 0; QStringList cols = row.split(','); if(cols.size() != nCols) { continue; } int rowidx = m_table->rowCount(); m_table->insertRow(rowidx); for(const QString& col : cols) { m_table->setItem(rowidx, colidx++, new QTableWidgetItem(col)); } } } void TableSetting::serialize() { // Serialized string has format a11,a12,a13;a21,a22,a23;... QStringList rows; int nCols = m_table->columnCount(); for(int row = 0, nRows = m_table->rowCount(); row < nRows; ++row) { QStringList cols; for(int col = 0; col < nCols; ++col) { QTableWidgetItem* item = m_table->item(row, col); cols.append(item ? item->text() : QString()); } rows.append(cols.join(",")); } QSettings().setValue(m_key, QVariant::fromValue(rows.join(";"))); emit changed(); } gImageReader-3.2.3/qt/src/ConfigSettings.hh000066400000000000000000000117031312567024200205210ustar00rootroot00000000000000/* -*- Mode: C++; indent-tabs-mode: t; c-basic-offset: 4; tab-width: 4 -*- */ /* * ConfigSettings.hh * Copyright (C) 2013-2017 Sandro Mani * * gImageReader 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. * * gImageReader 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 this program. If not, see . */ #ifndef CONFIGSETTINGS_HH #define CONFIGSETTINGS_HH #include #include #include #include #include #include #include #include class AbstractSetting : public QObject { Q_OBJECT public: AbstractSetting(const QString& key) : m_key(key) {} virtual ~AbstractSetting() {} const QString& key() const { return m_key; } public slots: virtual void serialize() {} signals: void changed(); protected: QString m_key; }; template class VarSetting : public AbstractSetting { public: VarSetting(const QString& key, const T& defaultValue = T()) : AbstractSetting(key), m_defaultValue(QVariant::fromValue(defaultValue)) {} T getValue() const { return QSettings().value(m_key, m_defaultValue).template value(); } void setValue(const T& value) { QSettings().setValue(m_key, QVariant::fromValue(value)); emit changed(); } private: QVariant m_defaultValue; }; class FontSetting : public AbstractSetting { Q_OBJECT public: FontSetting(const QString& key, QFontDialog* dialog, const QString& defaultValue) : AbstractSetting(key), m_dialog(dialog) { QFont font; if(font.fromString(QSettings().value(m_key, QVariant::fromValue(defaultValue)).toString())) { m_dialog->setCurrentFont(font); } QObject::connect(dialog, SIGNAL(fontSelected(QFont)), this, SLOT(serialize())); } QFont getValue() const { return m_dialog->currentFont(); } public slots: void serialize() override { QSettings().setValue(m_key, QVariant::fromValue(m_dialog->selectedFont().toString())); emit changed(); } private: QFontDialog* m_dialog; }; class SwitchSetting : public AbstractSetting { Q_OBJECT public: SwitchSetting(const QString& key, QAbstractButton* button, bool defaultState = false) : AbstractSetting(key), m_button(button) { button->setChecked(QSettings().value(m_key, QVariant::fromValue(defaultState)).toBool()); connect(button, SIGNAL(toggled(bool)), this, SLOT(serialize())); } void setValue(bool value) { m_button->setChecked(value); } bool getValue() const { return m_button->isChecked(); } public slots: void serialize() override { QSettings().setValue(m_key, QVariant::fromValue(m_button->isChecked())); emit changed(); } private: QAbstractButton* m_button; }; class ActionSetting : public AbstractSetting { Q_OBJECT public: ActionSetting(const QString& key, QAction* button, bool defaultState = false) : AbstractSetting(key), m_button(button) { button->setChecked(QSettings().value(m_key, QVariant::fromValue(defaultState)).toBool()); connect(button, SIGNAL(toggled(bool)), this, SLOT(serialize())); } void setValue(bool value) { m_button->setChecked(value); } bool getValue() const { return m_button->isChecked(); } public slots: void serialize() override { QSettings().setValue(m_key, QVariant::fromValue(m_button->isChecked())); emit changed(); } private: QAction* m_button; }; class ComboSetting : public AbstractSetting { Q_OBJECT public: ComboSetting(const QString& key, QComboBox* combo, int defaultIndex = 0) : AbstractSetting(key), m_combo(combo) { combo->setCurrentIndex(QSettings().value(m_key, QVariant::fromValue(defaultIndex)).toInt()); connect(combo, SIGNAL(currentIndexChanged(int)), this, SLOT(serialize())); } public slots: void serialize() override { QSettings().setValue(m_key, QVariant::fromValue(m_combo->currentIndex())); emit changed(); } private: QComboBox* m_combo; }; class SpinSetting : public AbstractSetting { Q_OBJECT public: SpinSetting(const QString& key, QSpinBox* spin, int defaultValue = 0) : AbstractSetting(key), m_spin(spin) { spin->setValue(QSettings().value(m_key, QVariant::fromValue(defaultValue)).toInt()); connect(spin, SIGNAL(valueChanged(int)), this, SLOT(serialize())); } public slots: void serialize() override { QSettings().setValue(m_key, QVariant::fromValue(m_spin->value())); emit changed(); } private: QSpinBox* m_spin; }; class TableSetting : public AbstractSetting { Q_OBJECT public: TableSetting(const QString& key, QTableWidget* table); public slots: void serialize() override; private: QTableWidget* m_table; }; #endif // CONFIGSETTINGS_HH gImageReader-3.2.3/qt/src/CrashHandler.cc000066400000000000000000000070531312567024200201220ustar00rootroot00000000000000/* -*- Mode: C++; indent-tabs-mode: t; c-basic-offset: 4; tab-width: 4 -*- */ /* * CrashHandler.cc * Copyright (C) 2013-2017 Sandro Mani * * gImageReader 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. * * gImageReader 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 this program. If not, see . */ #include "common.hh" #include "CrashHandler.hh" #include CrashHandler::CrashHandler(int pid, const QString& savefile, QWidget *parent): QDialog(parent), m_pid(pid) { ui.setupUi(this); if(!savefile.isEmpty()) { ui.labelAutosave->setText(_("Your work has been saved under %1.").arg(savefile)); } else { ui.labelAutosave->setText(_("There was no unsaved work.")); } setWindowTitle(QString("%1 - %2").arg(PACKAGE_NAME).arg( _("Crash Handler"))); m_refreshButton = new QPushButton(QIcon::fromTheme("view-refresh"), _("Regenerate backtrace")); m_refreshButton->setEnabled(false); ui.buttonBox->addButton(m_refreshButton, QDialogButtonBox::ActionRole); connect(m_refreshButton, SIGNAL(clicked()), this, SLOT(regenerateBacktrace())); m_gdbProcess.setProcessChannelMode(QProcess::SeparateChannels); connect(&m_gdbProcess, SIGNAL(readyReadStandardOutput()), this, SLOT(appendGdbOutput())); connect(&m_gdbProcess, SIGNAL(finished(int,QProcess::ExitStatus)), this, SLOT(handleGdbFinished(int,QProcess::ExitStatus))); regenerateBacktrace(); } void CrashHandler::closeEvent(QCloseEvent *) { m_gdbProcess.kill(); } void CrashHandler::appendGdbOutput() { ui.plainTextEditBacktrace->appendPlainText(m_gdbProcess.readAllStandardOutput()); } void CrashHandler::handleGdbFinished(int exitCode, QProcess::ExitStatus exitStatus) { ui.progressBarBacktrace->setVisible(false); m_refreshButton->setEnabled(true); if(exitCode != 0 || exitStatus != QProcess::NormalExit) { ui.plainTextEditBacktrace->appendPlainText(_("Failed to obtain backtrace. Is gdb installed?")); } else { QStringList lines = ui.plainTextEditBacktrace->toPlainText().split("\n", QString::SkipEmptyParts); ui.plainTextEditBacktrace->setPlainText(lines[0]); ui.plainTextEditBacktrace->appendPlainText("\n"); for(int i = 1, n = lines.length(); i < n; ++i) { if(lines[i].startsWith("Thread")) { ui.plainTextEditBacktrace->appendPlainText("\n"); ui.plainTextEditBacktrace->appendPlainText(lines[i]); } else if(lines[i].startsWith('#')) { ui.plainTextEditBacktrace->appendPlainText(lines[i]); } } } QTextCursor c = ui.plainTextEditBacktrace->textCursor(); c.movePosition(QTextCursor::Start); ui.plainTextEditBacktrace->setTextCursor(c); ui.plainTextEditBacktrace->ensureCursorVisible(); } void CrashHandler::regenerateBacktrace() { ui.plainTextEditBacktrace->setPlainText(QString("%1 %2 (%3)\n\n").arg(PACKAGE_NAME).arg(PACKAGE_VERSION).arg(PACKAGE_REVISION)); m_refreshButton->setEnabled(false); ui.progressBarBacktrace->setVisible(true); m_gdbProcess.start("gdb", QStringList() << "-p" << QString::number(m_pid)); m_gdbProcess.write("set pagination off\n"); m_gdbProcess.write("bt\n"); m_gdbProcess.write("thread apply all bt full\n"); m_gdbProcess.write("quit\n"); } gImageReader-3.2.3/qt/src/CrashHandler.hh000066400000000000000000000025371312567024200201360ustar00rootroot00000000000000/* -*- Mode: C++; indent-tabs-mode: t; c-basic-offset: 4; tab-width: 4 -*- */ /* * CrashHandler.hh * Copyright (C) 2013-2017 Sandro Mani * * gImageReader 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. * * gImageReader 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 this program. If not, see . */ #ifndef CRASHHANDLER_HH #define CRASHHANDLER_HH #include "ui_CrashHandler.h" #include class CrashHandler : public QDialog { Q_OBJECT public: explicit CrashHandler(int pid, const QString& savefile, QWidget *parent = 0); private: Ui::CrashHandler ui; int m_pid; QProcess m_gdbProcess; QPushButton* m_refreshButton = nullptr; void closeEvent(QCloseEvent *) override; private slots: void appendGdbOutput(); void handleGdbFinished(int exitCode, QProcess::ExitStatus exitStatus); void regenerateBacktrace(); }; #endif // CRASHHANDLER_HH gImageReader-3.2.3/qt/src/DisplayRenderer.cc000066400000000000000000000064351312567024200206630ustar00rootroot00000000000000/* -*- Mode: C++; indent-tabs-mode: t; c-basic-offset: 4; tab-width: 4 -*- */ /* * DisplayRenderer.cc * Copyright (C) 2013-2017 Sandro Mani * * gImageReader 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. * * gImageReader 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 this program. If not, see . */ #include #if QT_VERSION < QT_VERSION_CHECK(5, 0, 0) #include #else #include #endif #include "DisplayRenderer.hh" #include "Utils.hh" void DisplayRenderer::adjustImage(QImage &image, int brightness, int contrast, bool invert) const { if(brightness == 0 && contrast == 0 && !invert) { return; } double kBr = 1.f - qAbs(brightness / 200.f); double dBr = brightness > 0 ? 255. : 0.; double kCn = contrast * 2.55; double FCn = (259. * (kCn + 255.)) / (255. * (259. - kCn)); int nLinePixels = image.bytesPerLine() / 4; int nLines = image.height(); #pragma omp parallel for for(int line = 0; line < nLines; ++line) { QRgb* rgb = reinterpret_cast(image.scanLine(line)); for(int i = 0; i < nLinePixels; ++i) { int red = qRed(rgb[i]); int green = qGreen(rgb[i]); int blue = qBlue(rgb[i]); // Brighntess red = dBr * (1.f - kBr) + red * kBr; green = dBr * (1.f - kBr) + green * kBr; blue = dBr * (1.f - kBr) + blue * kBr; // Contrast red = qMax(0., qMin(FCn * (red - 128.) + 128., 255.)); green = qMax(0., qMin(FCn * (green - 128.) + 128., 255.)); blue = qMax(0., qMin(FCn * (blue - 128.) + 128., 255.)); // Invert if(invert) { red = 255 - red; green = 255 - green; blue = 255 - blue; } rgb[i] = qRgb(red, green, blue); } } } ImageRenderer::ImageRenderer(const QString &filename) : DisplayRenderer(filename) { m_pageCount = QImageReader(m_filename).imageCount(); } QImage ImageRenderer::render(int page, double resolution) const { QImageReader reader(m_filename); reader.jumpToImage(page - 1); reader.setBackgroundColor(Qt::white); reader.setScaledSize(reader.size() * resolution / 100.); return reader.read().convertToFormat(QImage::Format_RGB32); } PDFRenderer::PDFRenderer(const QString& filename) : DisplayRenderer(filename) { m_document = Poppler::Document::load(filename); if(m_document) { m_document->setRenderHint(Poppler::Document::Antialiasing); m_document->setRenderHint(Poppler::Document::TextAntialiasing); } } PDFRenderer::~PDFRenderer() { delete m_document; } QImage PDFRenderer::render(int page, double resolution) const { if(!m_document) { return QImage(); } m_mutex.lock(); Poppler::Page* poppage = m_document->page(page - 1); m_mutex.unlock(); QImage image = poppage->renderToImage(resolution, resolution); delete poppage; return image.convertToFormat(QImage::Format_RGB32); } int PDFRenderer::getNPages() const { return m_document ? m_document->numPages() : 1; } gImageReader-3.2.3/qt/src/DisplayRenderer.hh000066400000000000000000000035031312567024200206660ustar00rootroot00000000000000/* -*- Mode: C++; indent-tabs-mode: t; c-basic-offset: 4; tab-width: 4 -*- */ /* * DisplayRenderer.hh * Copyright (C) 2013-2017 Sandro Mani * * gImageReader 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. * * gImageReader 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 this program. If not, see . */ #ifndef DISPLAYRENDERER_HH #define DISPLAYRENDERER_HH #include #include class QImage; namespace Poppler { class Document; } class DisplayRenderer { public: DisplayRenderer(const QString& filename) : m_filename(filename) {} virtual ~DisplayRenderer() {} virtual QImage render(int page, double resolution) const = 0; virtual int getNPages() const = 0; void adjustImage(QImage& image, int brightness, int contrast, bool invert) const; protected: QString m_filename; }; class ImageRenderer : public DisplayRenderer { public: ImageRenderer(const QString& filename) ; QImage render(int page, double resolution) const override; int getNPages() const override{ return m_pageCount; } private: int m_pageCount; }; class PDFRenderer : public DisplayRenderer { public: PDFRenderer(const QString& filename); ~PDFRenderer(); QImage render(int page, double resolution) const override; int getNPages() const override; private: Poppler::Document* m_document; mutable QMutex m_mutex; }; #endif // IMAGERENDERER_HH gImageReader-3.2.3/qt/src/Displayer.cc000066400000000000000000000511511312567024200175160ustar00rootroot00000000000000/* -*- Mode: C++; indent-tabs-mode: t; c-basic-offset: 4; tab-width: 4 -*- */ /* * Displayer.cc * Copyright (C) 2013-2017 Sandro Mani * * gImageReader 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. * * gImageReader 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 this program. If not, see . */ #include "MainWindow.hh" #include "Config.hh" #include "Displayer.hh" #include "DisplayRenderer.hh" #include "SourceManager.hh" #include "Utils.hh" #include #include #include #include #include #include #include class GraphicsScene : public QGraphicsScene { public: using QGraphicsScene::QGraphicsScene; protected: void dragEnterEvent(QGraphicsSceneDragDropEvent *event) { if(Utils::handleSourceDragEvent(event->mimeData())) { event->acceptProposedAction(); } } void dragMoveEvent(QGraphicsSceneDragDropEvent *event) {} void dropEvent(QGraphicsSceneDragDropEvent *event) { Utils::handleSourceDropEvent(event->mimeData()); } }; Displayer::Displayer(const UI_MainWindow& _ui, QWidget* parent) : QGraphicsView(parent), ui(_ui), m_scaleThread(std::bind(&Displayer::scaleThread, this)) { m_scene = new GraphicsScene(); setScene(m_scene); setBackgroundBrush(Qt::gray); setRenderHint(QPainter::Antialiasing); m_rotateMode = RotateMode::AllPages; ui.actionRotateCurrentPage->setData(static_cast(RotateMode::CurrentPage)); ui.actionRotateAllPages->setData(static_cast(RotateMode::AllPages)); m_renderTimer.setSingleShot(true); m_scaleTimer.setSingleShot(true); ui.actionRotateLeft->setData(270.); ui.actionRotateRight->setData(90.); connect(ui.menuRotation, SIGNAL(triggered(QAction*)), this, SLOT(setRotateMode(QAction*))); connect(ui.actionRotateLeft, SIGNAL(triggered()), this, SLOT(rotate90())); connect(ui.actionRotateRight, SIGNAL(triggered()), this, SLOT(rotate90())); connect(ui.spinBoxRotation, SIGNAL(valueChanged(double)), this, SLOT(setAngle(double))); connect(ui.spinBoxPage, SIGNAL(valueChanged(int)), this, SLOT(setCurrentPage(int))); connect(ui.spinBoxBrightness, SIGNAL(valueChanged(int)), this, SLOT(brightnessChanged())); connect(ui.spinBoxContrast, SIGNAL(valueChanged(int)), this, SLOT(contrastChanged())); connect(ui.spinBoxResolution, SIGNAL(valueChanged(int)), this, SLOT(resolutionChanged())); connect(ui.checkBoxInvertColors, SIGNAL(toggled(bool)), this, SLOT(invertColorsChanged())); connect(ui.actionZoomIn, SIGNAL(triggered()), this, SLOT(zoomIn())); connect(ui.actionZoomOut, SIGNAL(triggered()), this, SLOT(zoomOut())); connect(ui.actionBestFit, SIGNAL(triggered()), this, SLOT(zoomFit())); connect(ui.actionOriginalSize, SIGNAL(triggered()), this, SLOT(zoomOriginal())); connect(&m_renderTimer, SIGNAL(timeout()), this, SLOT(renderImage())); connect(&m_scaleTimer, SIGNAL(timeout()), this, SLOT(scaleTimerElapsed())); } Displayer::~Displayer() { setSources(QList()); delete m_scene; } bool Displayer::setCurrentPage(int page) { ui.spinBoxPage->setEnabled(false); if(m_sources.isEmpty()) { return false; } if(m_tool) { m_tool->pageChanged(); } Source* source = m_pageMap[page].first; if(source != m_currentSource) { sendScaleRequest({ScaleRequest::Abort}); sendScaleRequest({ScaleRequest::Quit}); while(m_scaleThread.isRunning()) { QApplication::processEvents(QEventLoop::ExcludeUserInputEvents); } delete m_renderer; if(source->path.endsWith(".pdf", Qt::CaseInsensitive)) { m_renderer = new PDFRenderer(source->path); if(source->resolution == -1) source->resolution = 300; } else { m_renderer = new ImageRenderer(source->path); if(source->resolution == -1) source->resolution = 100; } Utils::setSpinBlocked(ui.spinBoxBrightness, source->brightness); Utils::setSpinBlocked(ui.spinBoxContrast, source->contrast); Utils::setSpinBlocked(ui.spinBoxResolution, source->resolution); ui.checkBoxInvertColors->blockSignals(true); ui.checkBoxInvertColors->setChecked(source->invert); ui.checkBoxInvertColors->blockSignals(false); m_currentSource = source; m_scaleThread.start(); } Utils::setSpinBlocked(ui.spinBoxRotation, source->angle[m_pageMap[page].second - 1]); Utils::setSpinBlocked(ui.spinBoxPage, page); bool result = renderImage(); ui.spinBoxPage->setEnabled(true); return result; } int Displayer::getCurrentPage() const { return ui.spinBoxPage->value(); } double Displayer::getCurrentAngle() const { return ui.spinBoxRotation->value(); } int Displayer::getCurrentResolution() const { return ui.spinBoxResolution->value(); } QString Displayer::getCurrentImage(int& page) const { page = m_pageMap[ui.spinBoxPage->value()].second; return m_pageMap[ui.spinBoxPage->value()].first ? m_pageMap[ui.spinBoxPage->value()].first->path : ""; } int Displayer::getNPages() const { return ui.spinBoxPage->maximum(); } bool Displayer::setSources(QList sources) { if(sources == m_sources) { return true; } m_scaleTimer.stop(); if(m_scaleThread.isRunning()) { sendScaleRequest({ScaleRequest::Abort}); sendScaleRequest({ScaleRequest::Quit}); while(m_scaleThread.isRunning()) { QApplication::processEvents(QEventLoop::ExcludeUserInputEvents); } } if(m_tool) { m_tool->reset(); } m_renderTimer.stop(); m_scene->clear(); delete m_renderer; m_renderer = nullptr; m_currentSource = nullptr; m_sources.clear(); m_pageMap.clear(); m_pixmap = QPixmap(); m_imageItem = nullptr; ui.actionBestFit->setChecked(true); ui.spinBoxPage->setEnabled(false); ui.spinBoxPage->setRange(1, 1); ui.spinBoxRotation->setValue(0.); ui.spinBoxBrightness->setValue(0); ui.spinBoxContrast->setValue(0); ui.spinBoxResolution->setValue(100); ui.checkBoxInvertColors->setChecked(false); ui.actionBestFit->setChecked(true); ui.actionOriginalSize->setChecked(false); ui.actionZoomIn->setEnabled(true); ui.actionZoomOut->setEnabled(true); setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff); setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff); unsetCursor(); m_sources = sources; if(m_sources.isEmpty()) { return false; } int page = 0; for(Source* source : m_sources) { DisplayRenderer* renderer; if(source->path.endsWith(".pdf", Qt::CaseInsensitive)) { renderer = new PDFRenderer(source->path); } else { renderer = new ImageRenderer(source->path); } source->angle.resize(renderer->getNPages()); for(int iPage = 1, nPages = renderer->getNPages(); iPage <= nPages; ++iPage) { m_pageMap.insert(++page, qMakePair(source, iPage)); } delete renderer; } if(page == 0) { m_pageMap.clear(); m_sources.clear(); return false; } ui.spinBoxPage->blockSignals(true); ui.spinBoxPage->setMaximum(page); ui.spinBoxPage->blockSignals(false); ui.actionPage->setVisible(page > 1); setCursor(Qt::CrossCursor); m_imageItem = new QGraphicsPixmapItem(); m_imageItem->setTransformationMode(Qt::SmoothTransformation); m_scene->addItem(m_imageItem); m_scaleThread.start(); if(!setCurrentPage(1)) { Q_ASSERT(m_currentSource); QMessageBox::critical(this, _("Failed to load image"), _("The file might not be an image or be corrupt:\n%1").arg(m_currentSource->displayname)); setSources(QList()); return false; } return true; } bool Displayer::hasMultipleOCRAreas() { return m_tool->hasMultipleOCRAreas(); } QList Displayer::getOCRAreas() { return m_tool->getOCRAreas(); } bool Displayer::allowAutodetectOCRAreas() const { return m_tool->allowAutodetectOCRAreas(); } void Displayer::autodetectOCRAreas() { m_tool->autodetectOCRAreas(); } bool Displayer::renderImage() { sendScaleRequest({ScaleRequest::Abort}); if(m_currentSource->resolution != ui.spinBoxResolution->value()) { double factor = double(ui.spinBoxResolution->value()) / double(m_currentSource->resolution); if(m_tool) { m_tool->resolutionChanged(factor); } } m_currentSource->page = m_pageMap[ui.spinBoxPage->value()].second; m_currentSource->brightness = ui.spinBoxBrightness->value(); m_currentSource->contrast = ui.spinBoxContrast->value(); m_currentSource->resolution = ui.spinBoxResolution->value(); m_currentSource->invert = ui.checkBoxInvertColors->isChecked(); QImage image = m_renderer->render(m_currentSource->page, m_currentSource->resolution); if(image.isNull()) { return false; } m_renderer->adjustImage(image, m_currentSource->brightness, m_currentSource->contrast, m_currentSource->invert); m_pixmap = QPixmap::fromImage(image); m_imageItem->setPixmap(m_pixmap); m_imageItem->setScale(1.); m_imageItem->setTransformOriginPoint(m_imageItem->boundingRect().center()); m_imageItem->setPos(m_imageItem->pos() - m_imageItem->sceneBoundingRect().center()); m_scene->setSceneRect(m_imageItem->sceneBoundingRect()); centerOn(sceneRect().center()); setAngle(ui.spinBoxRotation->value()); if(m_scale < 1.0) { m_pendingScaleRequest = {ScaleRequest::Scale, m_scale, m_currentSource->resolution, m_currentSource->page, m_currentSource->brightness, m_currentSource->contrast, m_currentSource->invert}; m_scaleTimer.start(100); } return true; } void Displayer::setZoom(Zoom action, ViewportAnchor anchor) { if(!m_imageItem) { return; } sendScaleRequest({ScaleRequest::Abort}); setUpdatesEnabled(false); QRectF bb = m_imageItem->sceneBoundingRect(); double fit = qMin(viewport()->width() / bb.width(), viewport()->height() / bb.height()); if(action == Zoom::Original) { m_scale = 1.0; } else if(action == Zoom::In) { m_scale = qMin(10., m_scale * 1.25); } else if(action == Zoom::Out) { m_scale = qMax(0.05, m_scale * 0.8); } ui.actionBestFit->setChecked(false); if(action == Zoom::Fit || (m_scale / fit >= 0.9 && m_scale / fit <= 1.09)) { m_scale = fit; ui.actionBestFit->setChecked(true); } Qt::ScrollBarPolicy scrollPolicy = m_scale <= fit ? Qt::ScrollBarAlwaysOff : Qt::ScrollBarAsNeeded; setHorizontalScrollBarPolicy(scrollPolicy); setVerticalScrollBarPolicy(scrollPolicy); ui.actionOriginalSize->setChecked(m_scale == 1.0); ui.actionZoomIn->setEnabled(m_scale < 10); ui.actionZoomOut->setEnabled(m_scale > 0.01); setTransformationAnchor(anchor); QTransform t; t.scale(m_scale, m_scale); setTransform(t); if(m_scale < 1.0) { m_pendingScaleRequest = {ScaleRequest::Scale, m_scale, m_currentSource->resolution, m_currentSource->page, m_currentSource->brightness, m_currentSource->contrast, m_currentSource->invert}; m_scaleTimer.start(100); } else { m_imageItem->setPixmap(m_pixmap); m_imageItem->setScale(1.); m_imageItem->setTransformOriginPoint(m_imageItem->boundingRect().center()); m_imageItem->setPos(m_imageItem->pos() - m_imageItem->sceneBoundingRect().center()); } setUpdatesEnabled(true); update(); } void Displayer::setAngle(double angle) { if(m_imageItem) { angle = angle < 0 ? angle + 360. : angle >= 360 ? angle - 360 : angle, Utils::setSpinBlocked(ui.spinBoxRotation, angle); int sourcePage = m_pageMap[getCurrentPage()].second; double delta = angle - m_currentSource->angle[sourcePage - 1]; if(m_rotateMode == RotateMode::CurrentPage) { m_currentSource->angle[sourcePage - 1] = angle; } else if(delta != 0) { for(int page : m_pageMap.keys()) { auto pair = m_pageMap[page]; pair.first->angle[pair.second - 1] += delta; } } m_imageItem->setRotation(angle); if(m_tool) { m_tool->rotationChanged(delta); } m_scene->setSceneRect(m_imageItem->sceneBoundingRect()); if(ui.actionBestFit->isChecked()) { setZoom(Zoom::Fit); } } } void Displayer::brightnessChanged() { int brightness = ui.spinBoxBrightness->value(); for(int page : m_pageMap.keys()) { m_pageMap[page].first->brightness = brightness; } queueRenderImage(); } void Displayer::contrastChanged() { int contrast = ui.spinBoxBrightness->value(); for(int page : m_pageMap.keys()) { m_pageMap[page].first->contrast = contrast; } queueRenderImage(); } void Displayer::resolutionChanged() { int resolution = ui.spinBoxResolution->value(); for(int page : m_pageMap.keys()) { m_pageMap[page].first->resolution = resolution; } queueRenderImage(); } void Displayer::invertColorsChanged() { bool invert = ui.checkBoxInvertColors->isChecked(); for(int page : m_pageMap.keys()) { m_pageMap[page].first->invert = invert; } queueRenderImage(); } void Displayer::setResolution(int resolution) { Utils::setSpinBlocked(ui.spinBoxResolution, resolution); renderImage(); } void Displayer::queueRenderImage() { if(m_renderer) { m_renderTimer.start(500); } } void Displayer::resizeEvent(QResizeEvent *event) { QGraphicsView::resizeEvent(event); if(ui.actionBestFit->isChecked()) { setZoom(Zoom::Fit); } } void Displayer::keyPressEvent(QKeyEvent *event) { if(event->key() == Qt::Key_PageUp) { ui.spinBoxPage->setValue(ui.spinBoxPage->value() - 1); event->accept(); } else if(event->key() == Qt::Key_PageDown) { ui.spinBoxPage->setValue(ui.spinBoxPage->value() + 1); event->accept(); } else { QGraphicsView::keyPressEvent(event); } } void Displayer::mousePressEvent(QMouseEvent *event) { if(event->button() == Qt::MiddleButton) { m_panPos = event->pos(); } else { event->ignore(); QGraphicsView::mousePressEvent(event); if(!event->isAccepted() && m_tool && m_currentSource) { m_tool->mousePressEvent(event); } } } void Displayer::mouseMoveEvent(QMouseEvent *event) { if((event->buttons() & Qt::MiddleButton) == Qt::MiddleButton) { QPoint delta = event->pos() - m_panPos; horizontalScrollBar()->setValue( horizontalScrollBar()->value() - delta.x() ); verticalScrollBar()->setValue( verticalScrollBar()->value() - delta.y() ); m_panPos = event->pos(); } else { event->ignore(); QGraphicsView::mouseMoveEvent(event); if(!event->isAccepted() && m_tool && m_currentSource) { m_tool->mouseMoveEvent(event); } } } void Displayer::mouseReleaseEvent(QMouseEvent *event) { event->ignore(); QGraphicsView::mouseReleaseEvent(event); if(!event->isAccepted() && m_tool && m_currentSource) { m_tool->mouseReleaseEvent(event); } } void Displayer::wheelEvent(QWheelEvent *event) { if(event->modifiers() & Qt::ControlModifier) { setZoom(event->delta() > 0 ? Zoom::In : Zoom::Out, QGraphicsView::AnchorUnderMouse); event->accept(); } else if(event->modifiers() & Qt::ShiftModifier) { QScrollBar* hscroll = horizontalScrollBar(); if(event->delta() < 0) { hscroll->setValue(hscroll->value() + hscroll->singleStep()); } else { hscroll->setValue(hscroll->value() - hscroll->singleStep()); } event->accept(); } else { QGraphicsView::wheelEvent(event); } } QPointF Displayer::mapToSceneClamped(const QPoint &p) const { QPointF q = mapToScene(p); QRectF bb = m_imageItem->sceneBoundingRect(); q.rx() = qMin(qMax(bb.x(), q.x()), bb.x() + bb.width()); q.ry() = qMin(qMax(bb.y(), q.y()), bb.y() + bb.height()); return q; } void Displayer::setRotateMode(QAction *action) { m_rotateMode = static_cast(action->data().value()); ui.toolButtonRotation->setIcon(action->icon()); } void Displayer::rotate90() { double angle = ui.spinBoxRotation->value() + qobject_cast(QObject::sender())->data().toDouble(); ui.spinBoxRotation->setValue(angle >= 360. ? angle - 360. : angle); } QImage Displayer::getImage(const QRectF& rect) { QImage image(rect.width(), rect.height(), QImage::Format_RGB32); image.fill(Qt::black); QPainter painter(&image); painter.setRenderHint(QPainter::SmoothPixmapTransform); QTransform t; t.translate(-rect.x(), -rect.y()); t.rotate(ui.spinBoxRotation->value()); t.translate(-0.5 * m_pixmap.width(), -0.5 * m_pixmap.height()); painter.setTransform(t); painter.drawPixmap(0, 0, m_pixmap); return image; } QRectF Displayer::getSceneBoundingRect() const { // We cannot use m_imageItem->sceneBoundingRect() since its pixmap // can currently be downscaled and therefore have slightly different // proportions. int width = m_pixmap.width(); int height = m_pixmap.height(); QRectF rect(width * -0.5, height * -0.5, width, height); QTransform transform; transform.rotate(ui.spinBoxRotation->value()); return transform.mapRect(rect); } void Displayer::sendScaleRequest(const ScaleRequest& request) { m_scaleTimer.stop(); m_scaleMutex.lock(); m_scaleRequests.append(request); m_scaleCond.wakeOne(); m_scaleMutex.unlock(); } void Displayer::scaleThread() { m_scaleMutex.lock(); while(true) { while(m_scaleRequests.isEmpty()) { m_scaleCond.wait(&m_scaleMutex); } ScaleRequest req = m_scaleRequests.takeFirst(); if(req.type == ScaleRequest::Quit) { break; } else if(req.type == ScaleRequest::Scale) { m_scaleMutex.unlock(); QImage image = m_renderer->render(req.page, req.scale * req.resolution); if(image.isNull()) { continue; } m_scaleMutex.lock(); if(!m_scaleRequests.isEmpty() && m_scaleRequests.first().type == ScaleRequest::Abort) { m_scaleRequests.removeFirst(); continue; } m_scaleMutex.unlock(); m_renderer->adjustImage(image, req.brightness, req.contrast, req.invert); m_scaleMutex.lock(); if(!m_scaleRequests.isEmpty() && m_scaleRequests.first().type == ScaleRequest::Abort) { m_scaleRequests.removeFirst(); continue; } m_scaleMutex.unlock(); QMetaObject::invokeMethod(this, "setScaledImage", Qt::BlockingQueuedConnection, Q_ARG(QImage, image), Q_ARG(double, m_scale)); m_scaleMutex.lock(); } } m_scaleMutex.unlock(); } void Displayer::setScaledImage(const QImage &image, double scale) { m_scaleMutex.lock(); if(!m_scaleRequests.isEmpty() && m_scaleRequests.first().type == ScaleRequest::Abort) { m_scaleRequests.removeFirst(); } else { m_imageItem->setPixmap(QPixmap::fromImage(image)); m_imageItem->setScale(1.f / scale); m_imageItem->setTransformOriginPoint(m_imageItem->boundingRect().center()); m_imageItem->setPos(m_imageItem->pos() - m_imageItem->sceneBoundingRect().center()); } m_scaleMutex.unlock(); } /////////////////////////////////////////////////////////////////////////////// void DisplayerSelection::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget) { QColor c = QPalette().highlight().color(); setBrush(QColor(c.red(), c.green(), c.blue(), 63)); QPen pen; pen.setColor(c); pen.setWidth(1 / m_tool->getDisplayer()->getCurrentScale()); setPen(pen); painter->setRenderHint(QPainter::Antialiasing, false); QGraphicsRectItem::paint(painter, option, widget); painter->setRenderHint(QPainter::Antialiasing, true); } void DisplayerSelection::hoverMoveEvent(QGraphicsSceneHoverEvent *event) { QPointF p = event->pos(); QRectF r = rect(); double tol = 10.0 / m_tool->getDisplayer()->getCurrentScale(); bool left = qAbs(r.x() - p.x()) < tol; bool right = qAbs(r.x() + r.width() - p.x()) < tol; bool top = qAbs(r.y() - p.y()) < tol; bool bottom = qAbs(r.y() + r.height() - p.y()) < tol; if((top && left) || (bottom && right)) { setCursor(Qt::SizeFDiagCursor); } else if((top && right) || (bottom && left)) { setCursor(Qt::SizeBDiagCursor); } else if(top || bottom) { setCursor(Qt::SizeVerCursor); } else if(left || right) { setCursor(Qt::SizeHorCursor); } else { unsetCursor(); } } void DisplayerSelection::mousePressEvent(QGraphicsSceneMouseEvent *event) { QPointF p = event->pos(); double tol = 10.0 / m_tool->getDisplayer()->getCurrentScale(); m_resizeHandlers.clear(); m_resizeOffset = QPointF(0., 0.); if(qAbs(m_point.x() - p.x()) < tol) { // pointx m_resizeHandlers.append(resizePointX); m_resizeOffset.setX(event->pos().x() - m_point.x()); } else if(qAbs(m_anchor.x() - p.x()) < tol) { // anchorx m_resizeHandlers.append(resizeAnchorX); m_resizeOffset.setX(event->pos().x() - m_anchor.x()); } if(qAbs(m_point.y() - p.y()) < tol) { // pointy m_resizeHandlers.append(resizePointY); m_resizeOffset.setY(event->pos().y() - m_point.y()); } else if(qAbs(m_anchor.y() - p.y()) < tol) { // anchory m_resizeHandlers.append(resizeAnchorY); m_resizeOffset.setY(event->pos().y() - m_anchor.y()); } event->accept(); } void DisplayerSelection::mouseMoveEvent(QGraphicsSceneMouseEvent *event) { QPointF p = event->pos() - m_resizeOffset; QRectF bb = m_tool->getDisplayer()->getSceneBoundingRect(); p.rx() = qMin(qMax(bb.x(), p.x()), bb.x() + bb.width()); p.ry() = qMin(qMax(bb.y(), p.y()), bb.y() + bb.height()); if(!m_resizeHandlers.isEmpty()) { for(const ResizeHandler& handler : m_resizeHandlers) { handler(p, m_anchor, m_point); } setRect(QRectF(m_anchor, m_point).normalized()); emit geometryChanged(rect()); event->accept(); } else { event->ignore(); } } gImageReader-3.2.3/qt/src/Displayer.hh000066400000000000000000000150321312567024200175260ustar00rootroot00000000000000/* -*- Mode: C++; indent-tabs-mode: t; c-basic-offset: 4; tab-width: 4 -*- */ /* * Displayer.hh * Copyright (C) 2013-2017 Sandro Mani * * gImageReader 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. * * gImageReader 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 this program. If not, see . */ #ifndef DISPLAYER_HH #define DISPLAYER_HH #include #include #include #include #include #include #include #include #include #include class DisplayerTool; class DisplayRenderer; class Source; class UI_MainWindow; class GraphicsScene; class Displayer : public QGraphicsView { Q_OBJECT public: Displayer(const UI_MainWindow& _ui, QWidget* parent = nullptr); ~Displayer(); void setTool(DisplayerTool* tool) { m_tool = tool; } bool setSources(QList sources); int getCurrentPage() const; double getCurrentAngle() const; double getCurrentScale() const { return m_scale; } int getCurrentResolution() const; QString getCurrentImage(int& page) const; QImage getImage(const QRectF& rect); QRectF getSceneBoundingRect() const; QPointF mapToSceneClamped(const QPoint& p) const; int getNPages() const; bool hasMultipleOCRAreas(); QList getOCRAreas(); bool allowAutodetectOCRAreas() const; void autodetectOCRAreas(); public slots: bool setCurrentPage(int page); void setAngle(double angle); void setResolution(int resolution); private: enum class RotateMode { CurrentPage, AllPages } m_rotateMode; enum class Zoom { In, Out, Fit, Original }; const UI_MainWindow& ui; GraphicsScene* m_scene; QList m_sources; QMap> m_pageMap; Source* m_currentSource = nullptr; DisplayRenderer* m_renderer = nullptr; QPixmap m_pixmap; QGraphicsPixmapItem* m_imageItem = nullptr; double m_scale = 1.0; DisplayerTool* m_tool = nullptr; QPoint m_panPos; QTimer m_renderTimer; void keyPressEvent(QKeyEvent* event) override; void mousePressEvent(QMouseEvent *event) override; void mouseMoveEvent(QMouseEvent *event) override; void mouseReleaseEvent(QMouseEvent *event) override; void resizeEvent(QResizeEvent *event) override; void wheelEvent(QWheelEvent *event) override; void setZoom(Zoom action, QGraphicsView::ViewportAnchor anchor = QGraphicsView::AnchorViewCenter); struct ScaleRequest { enum Request { Scale, Abort, Quit } type; double scale; int resolution; int page; int brightness; int contrast; bool invert; }; class ScaleThread : public QThread { public: ScaleThread(const std::function &f) : m_f(f) {} private: std::function m_f; void run() { m_f(); } }; QMutex m_scaleMutex; QWaitCondition m_scaleCond; QQueue m_scaleRequests; QTimer m_scaleTimer; ScaleRequest m_pendingScaleRequest; ScaleThread m_scaleThread; void scaleThread(); private slots: void queueRenderImage(); void scaleTimerElapsed() { sendScaleRequest(m_pendingScaleRequest); } void sendScaleRequest(const ScaleRequest& request); bool renderImage(); void brightnessChanged(); void contrastChanged(); void resolutionChanged(); void invertColorsChanged(); void setRotateMode(QAction* action); void rotate90(); void setScaledImage(const QImage& image, double scale); void zoomIn() { setZoom(Zoom::In); } void zoomOut() { setZoom(Zoom::Out); } void zoomFit() { setZoom(Zoom::Fit); } void zoomOriginal() { setZoom(Zoom::Original); } }; class DisplayerTool : public QObject { public: DisplayerTool(Displayer* displayer, QObject* parent = 0) : QObject(parent), m_displayer(displayer) {} virtual ~DisplayerTool() {} virtual void mousePressEvent(QMouseEvent */*event*/) {} virtual void mouseMoveEvent(QMouseEvent */*event*/) {} virtual void mouseReleaseEvent(QMouseEvent */*event*/) {} virtual void pageChanged() {} virtual void resolutionChanged(double /*factor*/) {} virtual void rotationChanged(double /*delta*/) {} virtual QList getOCRAreas() = 0; virtual bool hasMultipleOCRAreas() const { return false; } virtual bool allowAutodetectOCRAreas() const { return false; } virtual void autodetectOCRAreas() {} virtual void reset() {} Displayer* getDisplayer() const { return m_displayer; } protected: Displayer* m_displayer; }; class DisplayerSelection : public QObject, public QGraphicsRectItem { Q_OBJECT public: DisplayerSelection(DisplayerTool* tool, const QPointF& anchor) : QGraphicsRectItem(QRectF(anchor, anchor)), m_tool(tool), m_anchor(anchor), m_point(anchor) { setAcceptHoverEvents(true); } void setAnchorAndPoint(const QPointF& anchor, const QPointF& point) { m_anchor = anchor; m_point = point; setRect(QRectF(m_anchor, m_point).normalized()); } void setPoint(const QPointF& point) { m_point = point; setRect(QRectF(m_anchor, m_point).normalized()); } void rotate(const QTransform& transform) { m_anchor = transform.map(m_anchor); m_point = transform.map(m_point); setRect(QRectF(m_anchor, m_point).normalized()); } void scale(double factor) { m_anchor *= factor; m_point *= factor; } protected: DisplayerTool* m_tool; void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget* widget) override; signals: void geometryChanged(QRectF rect); private: typedef void(*ResizeHandler)(const QPointF&, QPointF&, QPointF&); QPointF m_anchor; QPointF m_point; QVector m_resizeHandlers; QPointF m_resizeOffset; void hoverMoveEvent(QGraphicsSceneHoverEvent *event) override; void mousePressEvent(QGraphicsSceneMouseEvent *event) override; void mouseMoveEvent(QGraphicsSceneMouseEvent *event) override; static void resizeAnchorX(const QPointF& pos, QPointF& anchor, QPointF& /*point*/) { anchor.rx() = pos.x(); } static void resizeAnchorY(const QPointF& pos, QPointF& anchor, QPointF& /*point*/) { anchor.ry() = pos.y(); } static void resizePointX(const QPointF& pos, QPointF& /*anchor*/, QPointF& point) { point.rx() = pos.x(); } static void resizePointY(const QPointF& pos, QPointF& /*anchor*/, QPointF& point) { point.ry() = pos.y(); } }; #endif // IMAGEDISPLAYER_HH gImageReader-3.2.3/qt/src/DisplayerToolHOCR.cc000066400000000000000000000062241312567024200210310ustar00rootroot00000000000000/* -*- Mode: C++; indent-tabs-mode: t; c-basic-offset: 4; tab-width: 4 -*- */ /* * DisplayerToolHOCR.cc * Copyright (C) 2016-2017 Sandro Mani * * gImageReader 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. * * gImageReader 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 this program. If not, see . */ #include "DisplayerToolHOCR.hh" #include "MainWindow.hh" #include "Recognizer.hh" #include #include DisplayerToolHOCR::DisplayerToolHOCR(Displayer *displayer, QObject *parent) : DisplayerTool(displayer, parent) { MAIN->getRecognizer()->setRecognizeMode(_("Recognize")); } DisplayerToolHOCR::~DisplayerToolHOCR() { clearSelection(); } QList DisplayerToolHOCR::getOCRAreas() { return QList() << m_displayer->getImage(m_displayer->getSceneBoundingRect()); } void DisplayerToolHOCR::mousePressEvent(QMouseEvent *event) { if(event->button() == Qt::LeftButton && m_drawingSelection) { clearSelection(); m_selection = new DisplayerSelection(this, m_displayer->mapToSceneClamped(event->pos())); m_displayer->scene()->addItem(m_selection); event->accept(); } } void DisplayerToolHOCR::mouseMoveEvent(QMouseEvent *event) { if(m_selection && m_drawingSelection) { QPointF p = m_displayer->mapToSceneClamped(event->pos()); m_selection->setPoint(p); m_displayer->ensureVisible(QRectF(p, p)); event->accept(); } } void DisplayerToolHOCR::mouseReleaseEvent(QMouseEvent *event) { if(m_selection && m_drawingSelection) { if(m_selection->rect().width() < 5. || m_selection->rect().height() < 5.) { clearSelection(); } else { QRect r = m_selection->rect().translated(-m_displayer->getSceneBoundingRect().toRect().topLeft()).toRect(); emit selectionDrawn(r); } event->accept(); } m_drawingSelection = false; } void DisplayerToolHOCR::setSelection(const QRect& rect) { m_drawingSelection = false; QRect r = rect.translated(m_displayer->getSceneBoundingRect().toRect().topLeft()); if(!m_selection) { m_selection = new DisplayerSelection(this, r.topLeft()); connect(m_selection, SIGNAL(geometryChanged(QRectF)), this, SLOT(selectionChanged(QRectF))); m_displayer->scene()->addItem(m_selection); } m_selection->setAnchorAndPoint(r.topLeft(), r.bottomRight()); } QImage DisplayerToolHOCR::getSelection(const QRect& rect) { return m_displayer->getImage(rect.translated(m_displayer->getSceneBoundingRect().toRect().topLeft())); } void DisplayerToolHOCR::clearSelection() { delete m_selection; m_selection = nullptr; } void DisplayerToolHOCR::selectionChanged(QRectF rect) { QRect r = rect.translated(-m_displayer->getSceneBoundingRect().toRect().topLeft()).toRect(); emit selectionGeometryChanged(r); } gImageReader-3.2.3/qt/src/DisplayerToolHOCR.hh000066400000000000000000000036261312567024200210460ustar00rootroot00000000000000/* -*- Mode: C++; indent-tabs-mode: t; c-basic-offset: 4; tab-width: 4 -*- */ /* * DisplayerToolHOCR.hh * Copyright (C) 2016-2017 Sandro Mani * * gImageReader 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. * * gImageReader 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 this program. If not, see . */ #ifndef DISPLAYERTOOLHOCR_HH #define DISPLAYERTOOLHOCR_HH #include "Displayer.hh" class DisplayerToolHOCR : public DisplayerTool { Q_OBJECT public: DisplayerToolHOCR(Displayer* displayer, QObject* parent = 0); ~DisplayerToolHOCR(); QList getOCRAreas() override; void pageChanged() override { clearSelection(); } void resolutionChanged(double /*factor*/) override { clearSelection(); } void rotationChanged(double /*delta*/) override { clearSelection(); } void reset() override { clearSelection(); } void mousePressEvent(QMouseEvent *event) override; void mouseMoveEvent(QMouseEvent *event) override; void mouseReleaseEvent(QMouseEvent *event) override; void activateDrawSelection() { m_drawingSelection = true; } void setSelection(const QRect& rect); QImage getSelection(const QRect& rect); void clearSelection(); signals: void selectionDrawn(QRect rect); void selectionGeometryChanged(QRect rect); private: DisplayerSelection* m_selection = nullptr; bool m_drawingSelection = false; private slots: void selectionChanged(QRectF rect); }; #endif // DISPLAYERTOOLHOCR_HH gImageReader-3.2.3/qt/src/DisplayerToolSelect.cc000066400000000000000000000235761312567024200215260ustar00rootroot00000000000000/* -*- Mode: C++; indent-tabs-mode: t; c-basic-offset: 4; tab-width: 4 -*- */ /* * DisplayerToolSelect.cc * Copyright (C) 2013-2017 Sandro Mani * * gImageReader 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. * * gImageReader 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 this program. If not, see . */ #include "DisplayerToolSelect.hh" #include "Displayer.hh" #include "MainWindow.hh" #include "Recognizer.hh" #include "Utils.hh" #include #include #include #include #include #include #include #include DisplayerToolSelect::DisplayerToolSelect(QAction* actionAutodetectLayout, Displayer *displayer, QObject *parent) : DisplayerTool(displayer, parent), mActionAutodetectLayout(actionAutodetectLayout) { connect(mActionAutodetectLayout, SIGNAL(triggered()), this, SLOT(autodetectLayout())); MAIN->getConfig()->addSetting(new VarSetting("selectionsavefile", QDir(Utils::documentsFolder()).absoluteFilePath(_("selection.png")))); mActionAutodetectLayout->setVisible(true); updateRecognitionModeLabel(); } DisplayerToolSelect::~DisplayerToolSelect() { clearSelections(); mActionAutodetectLayout->setVisible(false); } void DisplayerToolSelect::mousePressEvent(QMouseEvent *event) { if(event->button() == Qt::LeftButton && m_curSel == nullptr) { if((event->modifiers() & Qt::ControlModifier) == 0) { clearSelections(); } m_curSel = new NumberedDisplayerSelection(this, 1 + m_selections.size(), m_displayer->mapToSceneClamped(event->pos())); m_curSel->setZValue(1 + m_selections.size()); m_displayer->scene()->addItem(m_curSel); event->accept(); } } void DisplayerToolSelect::mouseMoveEvent(QMouseEvent *event) { if(m_curSel) { QPointF p = m_displayer->mapToSceneClamped(event->pos()); m_curSel->setPoint(p); m_displayer->ensureVisible(QRectF(p, p)); event->accept(); } } void DisplayerToolSelect::mouseReleaseEvent(QMouseEvent *event) { if(m_curSel) { if(m_curSel->rect().width() < 5. || m_curSel->rect().height() < 5.) { delete m_curSel; } else { m_selections.append(m_curSel); updateRecognitionModeLabel(); } m_curSel = nullptr; event->accept(); } } void DisplayerToolSelect::resolutionChanged(double factor) { for(NumberedDisplayerSelection* sel : m_selections) { sel->scale(factor); } } void DisplayerToolSelect::rotationChanged(double delta) { QTransform t; t.rotate(delta); for(NumberedDisplayerSelection* sel : m_selections) { sel->rotate(t); } } QList DisplayerToolSelect::getOCRAreas() { QList images; if(m_selections.empty()) { images.append(m_displayer->getImage(m_displayer->getSceneBoundingRect())); } else { for(const NumberedDisplayerSelection* sel : m_selections) { images.append(m_displayer->getImage(sel->rect())); } } return images; } void DisplayerToolSelect::clearSelections() { qDeleteAll(m_selections); m_selections.clear(); updateRecognitionModeLabel(); } void DisplayerToolSelect::removeSelection(int num) { delete m_selections[num - 1]; m_selections.removeAt(num - 1); for(int i = 0, n = m_selections.size(); i < n; ++i) { m_selections[i]->setNumber(1 + i); m_selections[i]->setZValue(1 + i); } } void DisplayerToolSelect::reorderSelection(int oldNum, int newNum) { NumberedDisplayerSelection* sel = m_selections[oldNum - 1]; m_selections.removeAt(oldNum - 1); m_selections.insert(newNum - 1, sel); for(int i = 0, n = m_selections.size(); i < n; ++i) { m_selections[i]->setNumber(1 + i); m_selections[i]->setZValue(1 + i); } } void DisplayerToolSelect::saveSelection(NumberedDisplayerSelection* selection) { QImage img = m_displayer->getImage(selection->rect()); QString filename = Utils::makeOutputFilename(MAIN->getConfig()->getSetting>("selectionsavefile")->getValue()); filename = QFileDialog::getSaveFileName(MAIN, _("Save Selection Image"), filename, QString("%1 (*.png)").arg(_("PNG Images"))); if(!filename.isEmpty()) { MAIN->getConfig()->getSetting>("selectionsavefile")->setValue(filename); img.save(filename); } } void DisplayerToolSelect::updateRecognitionModeLabel() { MAIN->getRecognizer()->setRecognizeMode(m_selections.isEmpty() ? _("Recognize all") : _("Recognize selection")); } void DisplayerToolSelect::autodetectLayout(bool noDeskew) { clearSelections(); double avgDeskew = 0.; int nDeskew = 0; QList rects; QImage img = m_displayer->getImage(m_displayer->getSceneBoundingRect()); // Perform layout analysis Utils::busyTask([this,&nDeskew,&avgDeskew,&rects,&img] { tesseract::TessBaseAPI tess; tess.InitForAnalysePage(); tess.SetPageSegMode(tesseract::PSM_AUTO_ONLY); tess.SetImage(img.bits(), img.width(), img.height(), 4, img.bytesPerLine()); tesseract::PageIterator* it = tess.AnalyseLayout(); if(it && !it->Empty(tesseract::RIL_BLOCK)) { do { int x1, y1, x2, y2; tesseract::Orientation orient; tesseract::WritingDirection wdir; tesseract::TextlineOrder tlo; float deskew; it->BoundingBox(tesseract::RIL_BLOCK, &x1, &y1, &x2, &y2); it->Orientation(&orient, &wdir, &tlo, &deskew); avgDeskew += deskew; ++nDeskew; float width = x2 - x1, height = y2 - y1; if(width > 10 && height > 10) { rects.append(QRectF(x1 - 0.5 * img.width(), y1 - 0.5 * img.height(), width, height)); } } while(it->Next(tesseract::RIL_BLOCK)); } delete it; return true; }, _("Performing layout analysis")); // If a somewhat large deskew angle is detected, automatically rotate image and redetect layout, // unless we already attempted to rotate (to prevent endless loops) avgDeskew = qRound(((avgDeskew/nDeskew)/M_PI * 180.) * 10.) / 10.; if(qAbs(avgDeskew) > .1 && !noDeskew) { m_displayer->setAngle(m_displayer->getCurrentAngle() - avgDeskew); autodetectLayout(true); } else { // Merge overlapping rectangles for(int i = rects.size(); i-- > 1;) { for(int j = i; j-- > 0;) { if(rects[j].intersects(rects[i])) { rects[j] = rects[j].united(rects[i]); rects.removeAt(i); break; } } } for(int i = 0, n = rects.size(); i < n; ++i) { m_selections.append(new NumberedDisplayerSelection(this, 1 + i, rects[i].topLeft())); m_selections.back()->setPoint(rects[i].bottomRight()); m_displayer->scene()->addItem(m_selections.back()); } updateRecognitionModeLabel(); } } /////////////////////////////////////////////////////////////////////////////// void NumberedDisplayerSelection::contextMenuEvent(QGraphicsSceneContextMenuEvent *event) { QMenu menu; QWidget* orderWidget = new QWidget(&menu); QHBoxLayout* layout = new QHBoxLayout(orderWidget); QLabel* orderIcon = new QLabel(&menu); int iconSize = orderIcon->style()->pixelMetric(QStyle::PM_SmallIconSize); orderIcon->setPixmap(QIcon::fromTheme("object-order-front").pixmap(iconSize, iconSize)); layout->addWidget(orderIcon); layout->setContentsMargins(4, 0, 4, 0); QLabel* orderLabel = new QLabel(_("Order:"), &menu); orderLabel->setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Fixed); layout->addWidget(orderLabel); QSpinBox* orderSpin = new QSpinBox(); orderSpin->setRange(1, static_cast(m_tool)->m_selections.size()); orderSpin->setValue(m_number); orderSpin->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Fixed); connect(orderSpin, SIGNAL(valueChanged(int)), this, SLOT(reorderSelection(int))); layout->addWidget(orderSpin); QWidgetAction* spinAction = new QWidgetAction(&menu); spinAction->setDefaultWidget(orderWidget); QAction* deleteAction = new QAction(QIcon::fromTheme("edit-delete"), _("Delete"), &menu); QAction* ocrAction = new QAction(QIcon::fromTheme("insert-text"), _("Recognize"), &menu); QAction* ocrClipboardAction = new QAction(QIcon::fromTheme("edit-copy"), _("Recognize to clipboard"), &menu); QAction* saveAction = new QAction(QIcon::fromTheme("document-save-as"), _("Save as image"), &menu); menu.addActions(QList() << spinAction << deleteAction << ocrAction << ocrClipboardAction << saveAction); QAction* selected = menu.exec(event->screenPos()); if(selected == deleteAction) { static_cast(m_tool)->removeSelection(m_number); } else if(selected == ocrAction) { MAIN->getRecognizer()->recognizeImage(m_tool->getDisplayer()->getImage(rect()), Recognizer::OutputDestination::Buffer); } else if(selected == ocrClipboardAction) { MAIN->getRecognizer()->recognizeImage(m_tool->getDisplayer()->getImage(rect()), Recognizer::OutputDestination::Clipboard); } else if(selected == saveAction) { static_cast(m_tool)->saveSelection(this); } } void NumberedDisplayerSelection::reorderSelection(int newNumber) { static_cast(m_tool)->reorderSelection(m_number, newNumber); } void NumberedDisplayerSelection::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget) { DisplayerSelection::paint(painter, option, widget); painter->setRenderHint(QPainter::Antialiasing, false); QRectF r = rect(); qreal w = 20. / m_tool->getDisplayer()->getCurrentScale(); w = qMin(w, qMin(r.width(), r.height())); QRectF box(r.x(), r.y(), w, w); painter->setBrush(QPalette().highlight()); painter->drawRect(box); painter->setRenderHint(QPainter::Antialiasing, true); if(w > 1.25) { QFont font; font.setPixelSize(0.8 * w); font.setBold(true); painter->setFont(font); painter->setPen(QPalette().highlightedText().color()); painter->drawText(box, Qt::AlignCenter, QString::number(m_number)); } } gImageReader-3.2.3/qt/src/DisplayerToolSelect.hh000066400000000000000000000054501312567024200215270ustar00rootroot00000000000000/* -*- Mode: C++; indent-tabs-mode: t; c-basic-offset: 4; tab-width: 4 -*- */ /* * DisplayerToolSelect.hh * Copyright (C) 2013-2017 Sandro Mani * * gImageReader 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. * * gImageReader 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 this program. If not, see . */ #ifndef DISPLAYERTOOLSELECT_HH #define DISPLAYERTOOLSELECT_HH #include #include #include #include #include "Displayer.hh" class NumberedDisplayerSelection; class DisplayerToolSelect : public DisplayerTool { Q_OBJECT public: DisplayerToolSelect(QAction* actionAutodetectLayout, Displayer* displayer, QObject* parent = 0); ~DisplayerToolSelect(); void mousePressEvent(QMouseEvent *event) override; void mouseMoveEvent(QMouseEvent *event) override; void mouseReleaseEvent(QMouseEvent *event) override; void resolutionChanged(double factor) override; void rotationChanged(double delta) override; QList getOCRAreas() override; bool hasMultipleOCRAreas() const override { return !m_selections.isEmpty(); } bool allowAutodetectOCRAreas() const override { return true; } void autodetectOCRAreas() override { autodetectLayout(); } void reset() override { clearSelections(); } private: friend class NumberedDisplayerSelection; QAction* mActionAutodetectLayout = nullptr; NumberedDisplayerSelection* m_curSel = nullptr; QList m_selections; void clearSelections(); void removeSelection(int num); void reorderSelection(int oldNum, int newNum); void saveSelection(NumberedDisplayerSelection* selection); void updateRecognitionModeLabel(); private slots: void autodetectLayout(bool noDeskew = false); }; class NumberedDisplayerSelection : public DisplayerSelection { Q_OBJECT public: NumberedDisplayerSelection(DisplayerToolSelect* selectTool, int number, const QPointF& anchor) : DisplayerSelection(selectTool, anchor), m_number(number) { } void setNumber(int number) { m_number = number; } private slots: void reorderSelection(int newNumber); private: int m_number; void contextMenuEvent(QGraphicsSceneContextMenuEvent *event) override; void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget) override; }; #endif // DISPLAYERTOOLSELECT_HH gImageReader-3.2.3/qt/src/MainWindow.cc000066400000000000000000000500541312567024200176370ustar00rootroot00000000000000/* -*- Mode: C++; indent-tabs-mode: t; c-basic-offset: 4; tab-width: 4 -*- */ /* * MainWindow.cc * Copyright (C) 2013-2017 Sandro Mani * * gImageReader 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. * * gImageReader 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 this program. If not, see . */ #include #include #include #include #include #include #include #include #include #include #include #include #include #ifdef Q_OS_LINUX #include #endif #include #include #include "MainWindow.hh" #include "Acquirer.hh" #include "Config.hh" #include "Displayer.hh" #include "DisplayerToolSelect.hh" #include "DisplayerToolHOCR.hh" #include "OutputEditorText.hh" #include "OutputEditorHOCR.hh" #include "Recognizer.hh" #include "SourceManager.hh" #include "Utils.hh" #include "ui_AboutDialog.h" #define CHECKURL "https://raw.githubusercontent.com/manisandro/gImageReader/master/LATEST" #define DOWNLOADURL "https://github.com/manisandro/gImageReader/releases" #define CHANGELOGURL "https://raw.githubusercontent.com/manisandro/gImageReader/master/NEWS" void MainWindow::signalHandler(int signal) { std::signal(signal, nullptr); QString filename; if(MAIN->getOutputEditor() && MAIN->getOutputEditor()->getModified()) { filename = QDir(Utils::documentsFolder()).absoluteFilePath(QString("%1_crash-save.txt").arg(PACKAGE_NAME)); int i = 0; while(QFile(filename).exists()) { ++i; filename = QDir(Utils::documentsFolder()).absoluteFilePath(QString("%1_crash-save_%2.txt").arg(PACKAGE_NAME).arg(i)); } MAIN->getOutputEditor()->save(filename); } QProcess process; process.start(QApplication::applicationFilePath(), QStringList() << "crashhandle" << QString::number(QApplication::applicationPid()) << filename); #ifdef Q_OS_LINUX // Allow crash handler spawned debugger to attach to the crashed process prctl(PR_SET_PTRACER, process.pid(), 0, 0, 0); #endif process.waitForFinished(-1); std::raise(signal); } #ifndef __ARMEL__ static void terminateHandler() { std::set_terminate(nullptr); std::exception_ptr exptr = std::current_exception(); if (exptr != 0) { try { std::rethrow_exception(exptr); } catch (std::exception &ex) { std::cerr << "Terminated due to exception: " << ex.what() << std::endl; } catch (...) { std::cerr << "Terminated due to unknown exception" << std::endl; } } else { std::cerr << "Terminated due to unknown reason:" << std::endl; } MainWindow::signalHandler(SIGABRT); } #endif MainWindow* MainWindow::s_instance = nullptr; MainWindow::MainWindow(const QStringList& files) : m_idleActions(0) { s_instance = this; std::signal(SIGSEGV, signalHandler); std::signal(SIGABRT, signalHandler); #ifndef __ARMEL__ std::set_terminate(terminateHandler); #endif QList listOfProxies = QNetworkProxyFactory::systemProxyForQuery(QNetworkProxyQuery(QUrl(CHECKURL))); if (listOfProxies.size()) QNetworkProxy::setApplicationProxy(listOfProxies[0]); qRegisterMetaType(); ui.setupUi(this); m_config = new Config(this); m_acquirer = new Acquirer(ui); m_displayer = new Displayer(ui); m_recognizer = new Recognizer(ui); m_sourceManager = new SourceManager(ui); ui.centralwidget->layout()->addWidget(m_displayer); m_idleActions.setExclusive(false); m_idleActions.addAction(ui.actionZoomIn); m_idleActions.addAction(ui.actionZoomOut); m_idleActions.addAction(ui.actionOriginalSize); m_idleActions.addAction(ui.actionBestFit); m_idleActions.addAction(ui.actionRotateLeft); m_idleActions.addAction(ui.actionRotateRight); m_idleActions.addAction(ui.actionAutodetectLayout); m_idleWidgets.append(ui.spinBoxRotation); m_idleWidgets.append(ui.spinBoxPage); m_idleWidgets.append(ui.spinBoxBrightness); m_idleWidgets.append(ui.spinBoxContrast); m_idleWidgets.append(ui.spinBoxResolution); m_idleWidgets.append(ui.toolButtonRecognize); connect(ui.actionRedetectLanguages, SIGNAL(triggered()), m_recognizer, SLOT(updateLanguagesMenu())); connect(ui.actionPreferences, SIGNAL(triggered()), this, SLOT(showConfig())); connect(ui.actionHelp, SIGNAL(triggered()), this, SLOT(showHelp())); connect(ui.actionAbout, SIGNAL(triggered()), this, SLOT(showAbout())); connect(ui.actionImageControls, SIGNAL(toggled(bool)), ui.widgetImageControls, SLOT(setVisible(bool))); connect(m_acquirer, SIGNAL(scanPageAvailable(QString)), m_sourceManager, SLOT(addSource(QString))); connect(m_sourceManager, SIGNAL(sourceChanged()), this, SLOT(onSourceChanged())); connect(ui.actionToggleOutputPane, SIGNAL(toggled(bool)), ui.dockWidgetOutput, SLOT(setVisible(bool))); connect(ui.comboBoxOCRMode, SIGNAL(currentIndexChanged(int)), this, SLOT(setOCRMode(int))); connect(m_recognizer, SIGNAL(languageChanged(Config::Lang)), this, SLOT(languageChanged())); m_config->addSetting(new VarSetting("wingeom")); m_config->addSetting(new VarSetting("winstate")); m_config->addSetting(new ActionSetting("showcontrols", ui.actionImageControls)); m_config->addSetting(new VarSetting("outputdir", Utils::documentsFolder())); m_config->addSetting(new ComboSetting("outputeditor", ui.comboBoxOCRMode, 0)); m_recognizer->updateLanguagesMenu(); m_progressWidget = new QWidget(this); m_progressWidget->setLayout(new QHBoxLayout()); m_progressWidget->layout()->setContentsMargins(0, 0, 0, 0); m_progressWidget->layout()->setSpacing(2); m_progressWidget->layout()->addWidget(new QLabel()); m_progressBar = new QProgressBar(); m_progressBar->setRange(0, 100); m_progressBar->setMaximumWidth(100); m_progressTimer.setSingleShot(false); connect(&m_progressTimer, SIGNAL(timeout()), this, SLOT(progressUpdate())); m_progressWidget->layout()->addWidget(m_progressBar); m_progressCancelButton = new QToolButton(); m_progressCancelButton->setIcon(QIcon::fromTheme("dialog-close")); connect(m_progressCancelButton, SIGNAL(clicked(bool)), this, SLOT(progressCancel())); m_progressWidget->layout()->addWidget(m_progressCancelButton); statusBar()->addPermanentWidget(m_progressWidget); m_progressWidget->setVisible(false); pushState(State::Idle, _("Select an image to begin...")); restoreGeometry(m_config->getSetting>("wingeom")->getValue()); restoreState(m_config->getSetting>("winstate")->getValue()); ui.dockWidgetOutput->setVisible(false); ui.actionSources->trigger(); #if ENABLE_VERSIONCHECK if(m_config->getSetting("updatecheck")->getValue()) { connect(&m_versionCheckThread, SIGNAL(finished()), this, SLOT(checkVersion())); m_versionCheckThread.start(); } #endif m_sourceManager->addSources(files); } MainWindow::~MainWindow() { delete m_acquirer; delete m_outputEditor; delete m_sourceManager; m_displayer->setTool(nullptr); delete m_displayerTool; delete m_displayer; delete m_recognizer; delete m_config; s_instance = nullptr; } void MainWindow::openFiles(const QStringList& files) { m_sourceManager->addSources(files); } void MainWindow::setOutputPaneVisible(bool visible) { ui.actionToggleOutputPane->setChecked(visible); } void MainWindow::pushState(MainWindow::State state, const QString& msg) { m_stateStack.push(QPair(state, msg)); ui.statusbar->showMessage(msg); setState(state); if(state == State::Busy) { QApplication::setOverrideCursor(Qt::WaitCursor); } } void MainWindow::popState() { if(m_stateStack.top().first == State::Busy) { QApplication::restoreOverrideCursor(); } m_stateStack.pop(); const QPair& pair = m_stateStack.top(); ui.statusbar->showMessage(pair.second); setState(pair.first); } void MainWindow::setState(State state) { bool isIdle = state == State::Idle; m_idleActions.setEnabled(!isIdle); for(QWidget* widget : m_idleWidgets) widget->setEnabled(!isIdle); } void MainWindow::closeEvent(QCloseEvent* ev) { if(m_stateStack.top().first == State::Busy) { ev->ignore(); } else if(!m_outputEditor->clear()) { ev->ignore(); } else if(!isMaximized()) { m_config->getSetting>("wingeom")->setValue(saveGeometry()); m_config->getSetting>("winstate")->setValue(saveState()); } } void MainWindow::onSourceChanged() { if(m_stateStack.top().first == State::Normal) { popState(); } QList sources = m_sourceManager->getSelectedSources(); if(m_displayer->setSources(sources)) { setWindowTitle(QString("%1 - %2").arg(sources.size() == 1 ? sources.front()->displayname : _("Multiple sources")).arg(PACKAGE_NAME)); pushState(State::Normal, _("Ready")); } else { setWindowTitle(PACKAGE_NAME); } } void MainWindow::showAbout() { QDialog d(this); Ui::AboutDialog aboutDialogUi; aboutDialogUi.setupUi(&d); aboutDialogUi.labelVersion->setText(PACKAGE_VERSION); aboutDialogUi.labelTesseractVer->setText(QString("

%1 %2

").arg(_("Using tesseract")).arg(TESSERACT_VERSION_STR)); d.exec(); } void MainWindow::showHelp(const QString& chapter) { #ifdef Q_OS_WIN32 QDir manualDir(QString("%1/../share/doc/gimagereader").arg(QApplication::applicationDirPath())); #else QDir manualDir(MANUAL_DIR); #endif QString language = QLocale::system().name().left(2); QString manualFile = manualDir.absoluteFilePath(QString("manual-%1.html").arg(language)); if(!QFile(manualFile).exists()) { manualFile = manualDir.absoluteFilePath("manual.html"); } QUrl manualUrl = QUrl::fromLocalFile(manualFile); manualUrl.setFragment(chapter); QDesktopServices::openUrl(manualUrl); } void MainWindow::showConfig() { m_config->showDialog(); m_recognizer->updateLanguagesMenu(); } void MainWindow::setOCRMode(int idx) { if(m_outputEditor && !m_outputEditor->clear()) { ui.comboBoxOCRMode->blockSignals(true); if(dynamic_cast(m_outputEditor)) { ui.comboBoxOCRMode->setCurrentIndex(0); } else { /*if(dynamic_cast(m_outputEditor))*/ ui.comboBoxOCRMode->setCurrentIndex(1); } ui.comboBoxOCRMode->blockSignals(false); } else { delete m_displayerTool; delete m_outputEditor; if(idx == 0) { m_displayerTool = new DisplayerToolSelect(ui.actionAutodetectLayout, m_displayer); m_outputEditor = new OutputEditorText(); } else { /*if(idx == 1)*/ m_displayerTool = new DisplayerToolHOCR(m_displayer); m_outputEditor = new OutputEditorHOCR(static_cast(m_displayerTool)); } m_displayer->setTool(m_displayerTool); connect(m_recognizer, SIGNAL(languageChanged(Config::Lang)), m_outputEditor, SLOT(setLanguage(Config::Lang))); m_outputEditor->setLanguage(m_recognizer->getSelectedLanguage()); connect(ui.actionToggleOutputPane, SIGNAL(toggled(bool)), m_outputEditor, SLOT(onVisibilityChanged(bool))); ui.dockWidgetOutput->setWidget(m_outputEditor->getUI()); } } void MainWindow::addNotification(const QString& title, const QString& message, const QList &actions, MainWindow::Notification* handle) { QFrame* frame = new QFrame(); frame->setFrameStyle(QFrame::StyledPanel|QFrame::Raised); frame->setStyleSheet("background: #FFD000;"); QHBoxLayout* layout = new QHBoxLayout(frame); layout->addWidget(new QLabel(QString("%1").arg(title), frame)); QLabel* msgLabel = new QLabel(message, frame); msgLabel->setWordWrap(true); layout->addWidget(msgLabel, 1); for(const NotificationAction& action : actions) { QToolButton* btn = new QToolButton(frame); btn->setText(action.text); connect(btn, SIGNAL(clicked()), action.target, action.slot); if(action.close) { btn->setProperty("handle", QVariant::fromValue(reinterpret_cast(handle))); btn->setProperty("frame", QVariant::fromValue(reinterpret_cast(frame))); connect(btn, SIGNAL(clicked()), this, SLOT(hideNotification())); } layout->addWidget(btn); } QToolButton* closeBtn = new QToolButton(); closeBtn->setIcon(QIcon::fromTheme("dialog-close")); closeBtn->setProperty("handle", QVariant::fromValue(reinterpret_cast(handle))); closeBtn->setProperty("frame", QVariant::fromValue(reinterpret_cast(frame))); connect(closeBtn, SIGNAL(clicked()), this, SLOT(hideNotification())); layout->addWidget(closeBtn); ui.centralwidget->layout()->addWidget(frame); if(handle) { *handle = frame; } } void MainWindow::hideNotification(Notification handle) { if(!handle && QObject::sender()) { handle = static_cast(static_cast(QObject::sender())->property("frame").value()); Notification* h = reinterpret_cast(static_cast(QObject::sender())->property("handle").value()); if(h) { *h = nullptr; } } if(handle) { static_cast(handle)->deleteLater(); } } void MainWindow::VersionCheckThread::run() { QString messages; QString newver = Utils::download(QUrl(CHECKURL), messages, 5000); newver.replace(QRegExp("\\s+"), ""); QRegExp pat(R"(^[\d+\.]+\d+$)"); if(pat.exactMatch(newver)) { m_newestVersion = newver; } } void MainWindow::checkVersion() { QString newver = m_versionCheckThread.getNewestVersion(); qDebug("Newest version is: %s", qPrintable(newver)); if(newver.isEmpty()) { return; } QString curver = PACKAGE_VERSION; if(newver.compare(curver) > 0) { addNotification(_("New version"), _("gImageReader %1 is available").arg(newver), { {_("Download"), this, SLOT(openDownloadUrl()), false}, {_("Changelog"), this, SLOT(openChangeLogUrl()), false}, {_("Don't notify again"), m_config, SLOT(disableUpdateCheck()), true} }); } } void MainWindow::openDownloadUrl() { QDesktopServices::openUrl(QUrl(DOWNLOADURL)); } void MainWindow::openChangeLogUrl() { QDesktopServices::openUrl(QUrl(CHANGELOGURL)); } void MainWindow::showProgress(ProgressMonitor* monitor, int updateInterval) { m_progressMonitor = monitor; m_progressTimer.start(updateInterval); m_progressCancelButton->setEnabled(true); m_progressBar->setValue(0); m_progressWidget->show(); } void MainWindow::hideProgress() { m_progressWidget->hide(); m_progressTimer.stop(); m_progressMonitor = nullptr; } void MainWindow::progressCancel() { if(m_progressMonitor) { m_progressCancelButton->setEnabled(false); m_progressMonitor->cancel(); } } void MainWindow::progressUpdate() { if(m_progressMonitor) { m_progressBar->setValue(m_progressMonitor->getProgress()); } } void MainWindow::languageChanged() { hideNotification(m_notifierHandle); m_notifierHandle = nullptr; const QString& code = m_recognizer->getSelectedLanguage().code; if(!code.isEmpty() && !QtSpell::checkLanguageInstalled(code) && m_config->getSetting("dictinstall")->getValue()) { NotificationAction actionDontShowAgain = {_("Don't show again"), m_config, SLOT(disableDictInstall()), true}; NotificationAction actionInstall = {_("Install"), this, SLOT(dictionaryAutoinstall()), false}; #ifdef Q_OS_LINUX if(getConfig()->useSystemDataLocations()) { QDBusConnectionInterface* iface = QDBusConnection::sessionBus().interface(); iface->startService("org.freedesktop.PackageKit"); if(!iface->isServiceRegistered("org.freedesktop.PackageKit").value()) { actionInstall = {_("Help"), this, SLOT(showHelp()), false}; // TODO #InstallSpelling qWarning("Could not find PackageKit on DBus, dictionary autoinstallation will not work"); } } #endif const QString& name = m_recognizer->getSelectedLanguage().name; addNotification(_("Spelling dictionary missing"), _("The spellcheck dictionary for %1 is not installed").arg(name), {actionInstall, actionDontShowAgain}, &m_notifierHandle); } } void MainWindow::dictionaryAutoinstall() { QList codes = m_config->searchLangCultures(m_recognizer->getSelectedLanguage().code); QString code = codes.isEmpty() ? m_recognizer->getSelectedLanguage().code : codes.front(); pushState(State::Busy, _("Installing spelling dictionary for '%1'").arg(code)); #ifdef Q_OS_WIN bool isWindows = true; #else bool isWindows = false; #endif if(!isWindows && MAIN->getConfig()->useSystemDataLocations()) { // Place this in a ifdef since DBus stuff cannot be compiled on Windows #ifdef Q_OS_LINUX QStringList files; for(const QString& langCulture : m_config->searchLangCultures(code)) { files.append("/usr/share/myspell/" + langCulture + ".dic"); files.append("/usr/share/hunspell/" + langCulture + ".dic"); } QDBusMessage req = QDBusMessage::createMethodCall("org.freedesktop.PackageKit", "/org/freedesktop/PackageKit", "org.freedesktop.PackageKit.Modify", "InstallProvideFiles"); req.setArguments(QList() << QVariant::fromValue((quint32)winId()) << QVariant::fromValue(files) << QVariant::fromValue(QString("always"))); QDBusMessage reply = QDBusConnection::sessionBus().call(req, QDBus::BlockWithGui, 3600000); if(reply.type() == QDBusMessage::ErrorMessage) { if(QMessageBox::Help == QMessageBox::critical(this, _("Error"), _("Failed to install spelling dictionary: %1").arg(reply.errorMessage()), QMessageBox::Ok|QMessageBox::Help, QMessageBox::Ok)) { showHelp("#InstallSpelling"); } } m_recognizer->updateLanguagesMenu(); popState(); #endif } else { QString url = "https://cgit.freedesktop.org/libreoffice/dictionaries/tree/"; QString plainurl = "https://cgit.freedesktop.org/libreoffice/dictionaries/plain/"; QDir spellingDir(getConfig()->spellingLocation()); if(!QDir().mkpath(spellingDir.absolutePath())) { popState(); if(QMessageBox::Help == QMessageBox::critical(this, _("Error"), _("Failed to create directory for spelling dictionaries."), QMessageBox::Ok|QMessageBox::Help, QMessageBox::Ok)) { showHelp("#InstallSpelling"); } return; } QString urlcode = code; QString messages; QByteArray html = Utils::download(url, messages); if(html.isNull()) { popState(); if(QMessageBox::Help == QMessageBox::critical(this, _("Error"), _("Could not read %1: %2.").arg(url).arg(messages), QMessageBox::Ok|QMessageBox::Help, QMessageBox::Ok)) { showHelp("#InstallSpelling"); } return; } else if(html.indexOf(QString(">%1<").arg(code)) != -1) { // Ok } else if(html.indexOf(QString(">%1<").arg(code.left(2))) != -1) { urlcode = code.left(2); } else { popState(); if(QMessageBox::Help == QMessageBox::critical(this, _("Error"), _("No spelling dictionaries found for '%1'.").arg(code), QMessageBox::Ok|QMessageBox::Help, QMessageBox::Ok)) { showHelp("#InstallSpelling"); } return; } html = Utils::download(url + urlcode + "/", messages); if(html.isNull()) { popState(); if(QMessageBox::Help == QMessageBox::critical(this, _("Error"), _("Could not read %1: %2").arg(url + urlcode + "/").arg(messages), QMessageBox::Ok|QMessageBox::Help, QMessageBox::Ok)) { showHelp("#InstallSpelling"); } return; } QRegExp pat(QString(">(%1[^<]*\\.(dic|aff))<").arg(code.left(2))); QString htmls = html; QString downloaded; int pos = 0; while((pos = htmls.indexOf(pat, pos)) != -1) { pushState(State::Busy, _("Downloading '%1'...").arg(pat.cap(1))); QByteArray data = Utils::download(plainurl + urlcode + "/" + pat.cap(1), messages); if(!data.isNull()) { QFile file(spellingDir.absoluteFilePath(pat.cap(1))); if(file.open(QIODevice::WriteOnly)) { file.write(data); downloaded.append(QString("\n%1").arg(pat.cap(1))); } } popState(); pos += pat.matchedLength(); } popState(); if(!downloaded.isEmpty()) { QMessageBox::information(this, _("Dictionaries installed"), _("The following dictionary files were installed:%1").arg(downloaded)); m_recognizer->updateLanguagesMenu(); } else { if(QMessageBox::Help == QMessageBox::critical(this, _("Error"), _("No spelling dictionaries found for '%1'.").arg(code), QMessageBox::Ok|QMessageBox::Help, QMessageBox::Ok)) { showHelp("#InstallSpelling"); } } } } gImageReader-3.2.3/qt/src/MainWindow.hh000066400000000000000000000074631312567024200176570ustar00rootroot00000000000000/* -*- Mode: C++; indent-tabs-mode: t; c-basic-offset: 4; tab-width: 4 -*- */ /* * MainWindow.hh * Copyright (C) 2013-2017 Sandro Mani * * gImageReader 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. * * gImageReader 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 this program. If not, see . */ #ifndef MAINWINDOW_HH #define MAINWINDOW_HH #include #include #include #include #include #include #include "common.hh" #include "Ui_MainWindow.hh" #define MAIN MainWindow::getInstance() class Config; class Acquirer; class Displayer; class DisplayerTool; class OutputEditor; class Recognizer; class SourceManager; class Source; class QProgressBar; class MainWindow : public QMainWindow { Q_OBJECT public: enum class State { Idle, Normal, Busy }; struct NotificationAction { QString text; QObject* target; QByteArray slot; bool close; }; struct ProgressMonitor { virtual ~ProgressMonitor() {} virtual int getProgress() = 0; virtual void cancel() = 0; }; typedef void* Notification; static MainWindow* getInstance() { return s_instance; } static void signalHandler(int signal); MainWindow(const QStringList& files); ~MainWindow(); Config* getConfig() { return m_config; } Displayer* getDisplayer() { return m_displayer; } OutputEditor* getOutputEditor() { return m_outputEditor; } Recognizer* getRecognizer() { return m_recognizer; } SourceManager* getSourceManager() { return m_sourceManager; } void addNotification(const QString& title, const QString& message, const QList& actions, Notification* handle = nullptr); void openFiles(const QStringList& files); void setOutputPaneVisible(bool visible); void showProgress(ProgressMonitor* monitor, int updateInterval = 500); void hideProgress(); public slots: void popState(); void pushState(MainWindow::State state, const QString& msg); void showHelp(const QString& chapter = ""); void hideNotification(Notification handle = nullptr); private: friend class BusyEventFilter; static MainWindow* s_instance; UI_MainWindow ui; Config* m_config = nullptr; Acquirer* m_acquirer = nullptr; Displayer* m_displayer = nullptr; DisplayerTool* m_displayerTool = nullptr; OutputEditor* m_outputEditor = nullptr; Recognizer* m_recognizer = nullptr; SourceManager* m_sourceManager = nullptr; QActionGroup m_idleActions; QList m_idleWidgets; QStack> m_stateStack; MainWindow::Notification m_notifierHandle = nullptr; QWidget* m_progressWidget = nullptr; QProgressBar* m_progressBar = nullptr; QToolButton* m_progressCancelButton = nullptr; QTimer m_progressTimer; ProgressMonitor* m_progressMonitor = nullptr; class VersionCheckThread : public QThread { public: const QString& getNewestVersion() const { return m_newestVersion; } private: QString m_newestVersion; void run(); }; VersionCheckThread m_versionCheckThread; void closeEvent(QCloseEvent* ev); void setState(State state); private slots: void checkVersion(); void onSourceChanged(); void showAbout(); void showConfig(); void openDownloadUrl(); void openChangeLogUrl(); void progressCancel(); void progressUpdate(); void setOCRMode(int idx); void languageChanged(); void dictionaryAutoinstall(); }; Q_DECLARE_METATYPE(MainWindow::State) #endif gImageReader-3.2.3/qt/src/OutputEditor.cc000066400000000000000000000020331312567024200202240ustar00rootroot00000000000000/* -*- Mode: C++; indent-tabs-mode: t; c-basic-offset: 4; tab-width: 4 -*- */ /* * OutputEditor.cc * Copyright (C) 2013-2017 Sandro Mani * * gImageReader 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. * * gImageReader 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 this program. If not, see . */ #include "OutputEditor.hh" Q_DECLARE_METATYPE(OutputEditor::ReadSessionData) OutputEditor::OutputEditor(QObject* parent) : QObject(parent) { static int reg = qRegisterMetaType("ReadSessionData"); Q_UNUSED(reg); } gImageReader-3.2.3/qt/src/OutputEditor.hh000066400000000000000000000034511312567024200202430ustar00rootroot00000000000000/* -*- Mode: C++; indent-tabs-mode: t; c-basic-offset: 4; tab-width: 4 -*- */ /* * OutputEditor.hh * Copyright (C) 2013-2017 Sandro Mani * * gImageReader 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. * * gImageReader 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 this program. If not, see . */ #ifndef OUTPUTEDITOR_HH #define OUTPUTEDITOR_HH #include #include "Config.hh" namespace tesseract { class TessBaseAPI; } class OutputEditor : public QObject { Q_OBJECT public: struct ReadSessionData { virtual ~ReadSessionData() = default; bool prependFile; bool prependPage; int page; QString file; double angle; int resolution; }; OutputEditor(QObject* parent = 0); virtual QWidget* getUI() = 0; virtual ReadSessionData* initRead(tesseract::TessBaseAPI &tess) = 0; virtual void read(tesseract::TessBaseAPI& tess, ReadSessionData* data) = 0; virtual void readError(const QString& errorMsg, ReadSessionData* data) = 0; virtual void finalizeRead(ReadSessionData* data) { delete data; } virtual bool getModified() const = 0; public slots: virtual void onVisibilityChanged(bool /*visible*/) {} virtual bool clear(bool hide = true) = 0; virtual bool save(const QString& filename = "") = 0; virtual void setLanguage(const Config::Lang &lang) {} }; #endif // OUTPUTEDITOR_HH gImageReader-3.2.3/qt/src/OutputEditorHOCR.cc000066400000000000000000001570421312567024200207130ustar00rootroot00000000000000/* -*- Mode: C++; indent-tabs-mode: t; c-basic-offset: 4; tab-width: 4 -*- */ /* * OutputEditorHOCR.cc * Copyright (C) 2013-2017 Sandro Mani * * gImageReader 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. * * gImageReader 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 this program. If not, see . */ #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include "CCITTFax4Encoder.hh" #include "DisplayerToolHOCR.hh" #include "MainWindow.hh" #include "OutputEditorHOCR.hh" #include "Recognizer.hh" #include "SourceManager.hh" #include "Utils.hh" #include "ui_PdfExportDialog.h" const QRegExp OutputEditorHOCR::s_bboxRx = QRegExp("bbox\\s+(\\d+)\\s+(\\d+)\\s+(\\d+)\\s+(\\d+)"); const QRegExp OutputEditorHOCR::s_pageTitleRx = QRegExp("image\\s+'(.+)';\\s+bbox\\s+\\d+\\s+\\d+\\s+\\d+\\s+\\d+;\\s+pageno\\s+(\\d+);\\s+rot\\s+(\\d+\\.?\\d*);\\s+res\\s+(\\d+\\.?\\d*)"); const QRegExp OutputEditorHOCR::s_idRx = QRegExp("(\\w+)_\\d+_(\\d+)"); const QRegExp OutputEditorHOCR::s_fontSizeRx = QRegExp("x_fsize\\s+(\\d+)"); const QRegExp OutputEditorHOCR::s_baseLineRx = QRegExp("baseline\\s+(-?\\d+\\.?\\d*)\\s+(-?\\d+)"); class OutputEditorHOCR::HTMLHighlighter : public QSyntaxHighlighter { public: HTMLHighlighter(QTextDocument *document) : QSyntaxHighlighter(document) { mFormatMap[NormalState].setForeground(QColor(Qt::black)); mFormatMap[InTag].setForeground(QColor(75, 75, 255)); mFormatMap[InAttrKey].setForeground(QColor(75, 200, 75)); mFormatMap[InAttrValue].setForeground(QColor(255, 75, 75)); mFormatMap[InAttrValueDblQuote].setForeground(QColor(255, 75, 75)); mStateMap[NormalState].append({QRegExp("<"), InTag, false}); mStateMap[InTag].append({QRegExp(">"), NormalState, true}); mStateMap[InTag].append({QRegExp("\\w+="), InAttrKey, false}); mStateMap[InAttrKey].append({QRegExp("'"), InAttrValue, false}); mStateMap[InAttrKey].append({QRegExp("\""), InAttrValueDblQuote, false}); mStateMap[InAttrKey].append({QRegExp("\\s"), NormalState, false}); mStateMap[InAttrValue].append({QRegExp("'[^']*'"), InTag, true}); mStateMap[InAttrValueDblQuote].append({QRegExp("\"[^\"]*\""), InTag, true}); } private: enum State { NormalState = -1, InComment, InTag, InAttrKey, InAttrValue, InAttrValueDblQuote }; struct Rule { QRegExp pattern; State nextState; bool addMatched; // add matched length to pos }; QMap mFormatMap; QMap> mStateMap; void highlightBlock(const QString &text) override { int pos = 0; int len = text.length(); State state = static_cast(previousBlockState()); while(pos < len) { State minState = state; int minPos = -1; for(const Rule& rule : mStateMap.value(state)) { int matchPos = rule.pattern.indexIn(text, pos); if(matchPos != -1 && (minPos < 0 || matchPos < minPos)) { minPos = matchPos + (rule.addMatched ? rule.pattern.matchedLength() : 0); minState = rule.nextState; } } if(minPos == -1) { setFormat(pos, len - pos, mFormatMap[state]); pos = len; } else { setFormat(pos, minPos - pos, mFormatMap[state]); pos = minPos; state = minState; } } setCurrentBlockState(state); } }; class OutputEditorHOCR::QPainterPDFPainter : public OutputEditorHOCR::PDFPainter { public: QPainterPDFPainter(QPainter* painter) : m_painter(painter) { m_curFontSize = m_painter->font().pointSize(); } void setFontSize(double pointSize) override { if(pointSize != m_curFontSize) { QFont font = m_painter->font(); font.setPointSize(pointSize); m_painter->setFont(font); m_curFontSize = pointSize; } } void drawText(double x, double y, const QString& text) override { m_painter->drawText(x, y, text); } void drawImage(const QRect& bbox, const QImage& image, const PDFSettings& settings) override { QImage img = convertedImage(image, settings.colorFormat, settings.conversionFlags); if(settings.compression == PDFSettings::CompressJpeg) { QByteArray data; QBuffer buffer(&data); img.save(&buffer, "jpg", settings.compressionQuality); img = QImage::fromData(data); } m_painter->drawImage(bbox, img); } double getAverageCharWidth() const override { return m_painter->fontMetrics().averageCharWidth(); } double getTextWidth(const QString& text) const override { return m_painter->fontMetrics().width(text); } private: QPainter* m_painter; int m_curFontSize; }; #if PODOFO_VERSION < PODOFO_MAKE_VERSION(0,9,3) namespace PoDoFo { class PdfImageCompat : public PoDoFo::PdfImage { using PdfImage::PdfImage; public: void SetImageDataRaw( unsigned int nWidth, unsigned int nHeight, unsigned int nBitsPerComponent, PdfInputStream* pStream ) { m_rRect.SetWidth( nWidth ); m_rRect.SetHeight( nHeight ); this->GetObject()->GetDictionary().AddKey( "Width", PdfVariant( static_cast(nWidth) ) ); this->GetObject()->GetDictionary().AddKey( "Height", PdfVariant( static_cast(nHeight) ) ); this->GetObject()->GetDictionary().AddKey( "BitsPerComponent", PdfVariant( static_cast(nBitsPerComponent) ) ); PdfVariant var; m_rRect.ToVariant( var ); this->GetObject()->GetDictionary().AddKey( "BBox", var ); this->GetObject()->GetStream()->SetRawData( pStream, -1 ); } }; } #endif class OutputEditorHOCR::PoDoFoPDFPainter : public OutputEditorHOCR::PDFPainter { public: PoDoFoPDFPainter(PoDoFo::PdfDocument* document, PoDoFo::PdfPainter* painter, double scaleFactor) : m_document(document), m_painter(painter), m_scaleFactor(scaleFactor) { m_pageHeight = m_painter->GetPage()->GetPageSize().GetHeight(); } void setFontSize(double pointSize) override { m_painter->GetFont()->SetFontSize(pointSize); } void drawText(double x, double y, const QString& text) override { PoDoFo::PdfString pdfString(reinterpret_cast(text.toUtf8().data())); m_painter->DrawText(x * m_scaleFactor, m_pageHeight - y * m_scaleFactor, pdfString); } void drawImage(const QRect& bbox, const QImage& image, const PDFSettings& settings) override { QImage img = convertedImage(image, settings.colorFormat, settings.conversionFlags); if(settings.colorFormat == QImage::Format_Mono) { img.invertPixels(); } #if PODOFO_VERSION >= PODOFO_MAKE_VERSION(0,9,3) PoDoFo::PdfImage pdfImage(m_document); #else PoDoFo::PdfImageCompat pdfImage(m_document); #endif pdfImage.SetImageColorSpace(img.format() == QImage::Format_RGB888 ? PoDoFo::ePdfColorSpace_DeviceRGB : PoDoFo::ePdfColorSpace_DeviceGray); int width = img.width(); int height = img.height(); int sampleSize = settings.colorFormat == QImage::Format_Mono ? 1 : 8; if(settings.compression == PDFSettings::CompressZip) { // QImage has 32-bit aligned scanLines, but we need a continuous buffer int numComponents = settings.colorFormat == QImage::Format_RGB888 ? 3 : 1; int bytesPerLine = numComponents * ((width * sampleSize) / 8 + ((width * sampleSize) % 8 != 0)); QVector buf(bytesPerLine * height); for(int y = 0; y < height; ++y) { std::memcpy(buf.data() + y * bytesPerLine, img.scanLine(y), bytesPerLine); } PoDoFo::PdfMemoryInputStream is(buf.data(), bytesPerLine * height); pdfImage.SetImageData(width, height, sampleSize, &is, {PoDoFo::ePdfFilter_FlateDecode}); } else if(settings.compression == PDFSettings::CompressJpeg) { PoDoFo::PdfName dctFilterName(PoDoFo::PdfFilterFactory::FilterTypeToName(PoDoFo::ePdfFilter_DCTDecode)); pdfImage.GetObject()->GetDictionary().AddKey(PoDoFo::PdfName::KeyFilter, dctFilterName); QByteArray data; QBuffer buffer(&data); img.save(&buffer, "jpg", settings.compressionQuality); PoDoFo::PdfMemoryInputStream is(data.data(), data.size()); pdfImage.SetImageDataRaw(width, height, sampleSize, &is); } else if(settings.compression == PDFSettings::CompressFax4) { PoDoFo::PdfName faxFilterName(PoDoFo::PdfFilterFactory::FilterTypeToName(PoDoFo::ePdfFilter_CCITTFaxDecode)); pdfImage.GetObject()->GetDictionary().AddKey(PoDoFo::PdfName::KeyFilter, faxFilterName); PoDoFo::PdfDictionary decodeParams; decodeParams.AddKey("Columns", PoDoFo::PdfObject(PoDoFo::pdf_int64(img.width()))); decodeParams.AddKey("Rows", PoDoFo::PdfObject(PoDoFo::pdf_int64(img.height()))); decodeParams.AddKey("K", PoDoFo::PdfObject(PoDoFo::pdf_int64(-1))); // K < 0 --- Pure two-dimensional encoding (Group 4) pdfImage.GetObject()->GetDictionary().AddKey("DecodeParms", PoDoFo::PdfObject(decodeParams)); CCITTFax4Encoder encoder; uint32_t encodedLen = 0; uint8_t* encoded = encoder.encode(img.constBits(), img.width(), img.height(), img.bytesPerLine(), encodedLen); PoDoFo::PdfMemoryInputStream is(reinterpret_cast(encoded), encodedLen); pdfImage.SetImageDataRaw(img.width(), img.height(), sampleSize, &is); } m_painter->DrawImage(bbox.x() * m_scaleFactor, m_pageHeight - (bbox.y() + bbox.height()) * m_scaleFactor, &pdfImage, m_scaleFactor * bbox.width() / double(image.width()), m_scaleFactor * bbox.height() / double(image.height())); } double getAverageCharWidth() const override { return m_painter->GetFont()->GetFontMetrics()->CharWidth(static_cast('x')) / m_scaleFactor; } double getTextWidth(const QString& text) const override { PoDoFo::PdfString pdfString(reinterpret_cast(text.toUtf8().data())); return m_painter->GetFont()->GetFontMetrics()->StringWidth(pdfString) / m_scaleFactor; } private: PoDoFo::PdfDocument* m_document; PoDoFo::PdfPainter* m_painter; double m_scaleFactor; double m_pageHeight; }; Q_DECLARE_METATYPE(QList) OutputEditorHOCR::OutputEditorHOCR(DisplayerToolHOCR* tool) { static int reg = qRegisterMetaType>("QList"); Q_UNUSED(reg); m_tool = tool; m_widget = new QWidget; ui.setupUi(m_widget); m_highlighter = new HTMLHighlighter(ui.plainTextEditOutput->document()); m_pdfExportDialog = new QDialog(m_widget); m_pdfExportDialogUi.setupUi(m_pdfExportDialog); m_pdfExportDialogUi.comboBoxImageFormat->addItem(_("Color"), QImage::Format_RGB888); #if QT_VERSION < QT_VERSION_CHECK(5, 0, 0) m_pdfExportDialogUi.comboBoxImageFormat->addItem(_("Grayscale"), QImage::Format_Indexed8); #else m_pdfExportDialogUi.comboBoxImageFormat->addItem(_("Grayscale"), QImage::Format_Grayscale8); #endif m_pdfExportDialogUi.comboBoxImageFormat->addItem(_("Monochrome"), QImage::Format_Mono); m_pdfExportDialogUi.comboBoxImageFormat->setCurrentIndex(-1); m_pdfExportDialogUi.comboBoxDithering->addItem(_("Threshold (closest color)"), Qt::ThresholdDither); m_pdfExportDialogUi.comboBoxDithering->addItem(_("Diffuse"), Qt::DiffuseDither); m_pdfExportDialogUi.comboBoxImageCompression->addItem(_("Zip (lossless)"), PDFSettings::CompressZip); m_pdfExportDialogUi.comboBoxImageCompression->addItem(_("CCITT Group 4 (lossless)"), PDFSettings::CompressFax4); m_pdfExportDialogUi.comboBoxImageCompression->addItem(_("Jpeg (lossy)"), PDFSettings::CompressJpeg); m_pdfExportDialogUi.comboBoxImageCompression->setCurrentIndex(-1); ui.actionOutputSaveHOCR->setShortcut(Qt::CTRL + Qt::Key_S); ui.treeWidgetItems->setContextMenuPolicy(Qt::CustomContextMenu); m_rootItem = new QTreeWidgetItem(QStringList() << _("Document")); ui.treeWidgetItems->addTopLevelItem(m_rootItem); m_rootItem->setExpanded(true); connect(ui.actionOutputOpen, SIGNAL(triggered()), this, SLOT(open())); connect(ui.actionOutputSaveHOCR, SIGNAL(triggered()), this, SLOT(save())); connect(ui.actionOutputExportPDF, SIGNAL(triggered()), this, SLOT(savePDF())); connect(ui.actionOutputClear, SIGNAL(triggered()), this, SLOT(clear())); connect(MAIN->getConfig()->getSetting("customoutputfont"), SIGNAL(changed()), this, SLOT(setFont())); connect(MAIN->getConfig()->getSetting("systemoutputfont"), SIGNAL(changed()), this, SLOT(setFont())); connect(ui.treeWidgetItems, SIGNAL(currentItemChanged(QTreeWidgetItem*,QTreeWidgetItem*)), this, SLOT(showItemProperties(QTreeWidgetItem*))); connect(ui.treeWidgetItems, SIGNAL(itemChanged(QTreeWidgetItem*,int)), this, SLOT(itemChanged(QTreeWidgetItem*,int))); connect(ui.treeWidgetItems, SIGNAL(customContextMenuRequested(QPoint)), this, SLOT(showTreeWidgetContextMenu(QPoint))); connect(ui.tableWidgetProperties, SIGNAL(cellChanged(int,int)), this, SLOT(propertyCellChanged(int,int))); connect(m_pdfExportDialogUi.buttonFont, SIGNAL(clicked()), &m_pdfFontDialog, SLOT(exec())); connect(&m_pdfFontDialog, SIGNAL(fontSelected(QFont)), this, SLOT(updateFontButton(QFont))); connect(m_pdfExportDialogUi.comboBoxOutputMode, SIGNAL(currentIndexChanged(int)), this, SLOT(updatePreview())); connect(m_pdfExportDialogUi.comboBoxImageFormat, SIGNAL(currentIndexChanged(int)), this, SLOT(updatePreview())); connect(m_pdfExportDialogUi.comboBoxImageFormat, SIGNAL(currentIndexChanged(int)), this, SLOT(imageFormatChanged())); connect(m_pdfExportDialogUi.comboBoxDithering, SIGNAL(currentIndexChanged(int)), this, SLOT(updatePreview())); connect(m_pdfExportDialogUi.comboBoxImageCompression, SIGNAL(currentIndexChanged(int)), this, SLOT(imageCompressionChanged())); connect(m_pdfExportDialogUi.spinBoxCompressionQuality, SIGNAL(valueChanged(int)), this, SLOT(updatePreview())); connect(m_pdfExportDialogUi.checkBoxFontSize, SIGNAL(toggled(bool)), this, SLOT(updatePreview())); connect(m_pdfExportDialogUi.checkBoxFontSize, SIGNAL(toggled(bool)), m_pdfExportDialogUi.labelFontScaling, SLOT(setEnabled(bool))); connect(m_pdfExportDialogUi.checkBoxFontSize, SIGNAL(toggled(bool)), m_pdfExportDialogUi.spinFontScaling, SLOT(setEnabled(bool))); connect(m_pdfExportDialogUi.spinFontScaling, SIGNAL(valueChanged(int)), this, SLOT(updatePreview())); connect(m_pdfExportDialogUi.checkBoxUniformizeSpacing, SIGNAL(toggled(bool)), this, SLOT(updatePreview())); connect(m_pdfExportDialogUi.spinBoxPreserve, SIGNAL(valueChanged(int)), this, SLOT(updatePreview())); connect(m_pdfExportDialogUi.checkBoxUniformizeSpacing, SIGNAL(toggled(bool)), m_pdfExportDialogUi.labelPreserve, SLOT(setEnabled(bool))); connect(m_pdfExportDialogUi.checkBoxUniformizeSpacing, SIGNAL(toggled(bool)), m_pdfExportDialogUi.labelPreserveCharacters, SLOT(setEnabled(bool))); connect(m_pdfExportDialogUi.checkBoxUniformizeSpacing, SIGNAL(toggled(bool)), m_pdfExportDialogUi.spinBoxPreserve, SLOT(setEnabled(bool))); connect(m_pdfExportDialogUi.checkBoxPreview, SIGNAL(toggled(bool)), this, SLOT(updatePreview())); connect(m_tool, SIGNAL(selectionGeometryChanged(QRect)), this, SLOT(updateCurrentItemBBox(QRect))); connect(m_tool, SIGNAL(selectionDrawn(QRect)), this, SLOT(addGraphicRegion(QRect))); MAIN->getConfig()->addSetting(new ComboSetting("pdfexportmode", m_pdfExportDialogUi.comboBoxOutputMode)); MAIN->getConfig()->addSetting(new FontSetting("pdffont", &m_pdfFontDialog, QFont().toString())); MAIN->getConfig()->addSetting(new SpinSetting("pdfimagecompressionquality", m_pdfExportDialogUi.spinBoxCompressionQuality, 90)); MAIN->getConfig()->addSetting(new ComboSetting("pdfimagecompression", m_pdfExportDialogUi.comboBoxImageCompression)); MAIN->getConfig()->addSetting(new ComboSetting("pdfimageformat", m_pdfExportDialogUi.comboBoxImageFormat)); MAIN->getConfig()->addSetting(new ComboSetting("pdfimageconversionflags", m_pdfExportDialogUi.comboBoxDithering)); MAIN->getConfig()->addSetting(new SpinSetting("pdfimagedpi", m_pdfExportDialogUi.spinBoxDpi, 300)); MAIN->getConfig()->addSetting(new SwitchSetting("pdfusedetectedfontsizes", m_pdfExportDialogUi.checkBoxFontSize, true)); MAIN->getConfig()->addSetting(new SpinSetting("pdffontscale", m_pdfExportDialogUi.spinFontScaling, 100)); MAIN->getConfig()->addSetting(new SwitchSetting("pdfuniformizelinespacing", m_pdfExportDialogUi.checkBoxUniformizeSpacing, false)); MAIN->getConfig()->addSetting(new SpinSetting("pdfpreservespaces", m_pdfExportDialogUi.spinBoxPreserve, 4)); MAIN->getConfig()->addSetting(new SwitchSetting("pdfpreview", m_pdfExportDialogUi.checkBoxPreview, false)); #ifndef MAKE_VERSION #define MAKE_VERSION(...) 0 #endif #if !defined(TESSERACT_VERSION) || TESSERACT_VERSION < MAKE_VERSION(3,04,00) m_pdfExportDialogUi.checkBoxFontSize->setChecked(false); m_pdfExportDialogUi.checkBoxFontSize->setVisible(false); m_pdfExportDialogUi.spinFontScaling->setVisible(false); m_pdfExportDialogUi.labelFontScaling->setVisible(false); #endif setFont(); updateFontButton(m_pdfFontDialog.currentFont()); } OutputEditorHOCR::~OutputEditorHOCR() { delete m_widget; MAIN->getConfig()->removeSetting("pdfexportmode"); MAIN->getConfig()->removeSetting("pdffont"); MAIN->getConfig()->removeSetting("pdfimagecompressionquality"); MAIN->getConfig()->removeSetting("pdfimagecompression"); MAIN->getConfig()->removeSetting("pdfimageformat"); MAIN->getConfig()->removeSetting("pdfimagedpi"); MAIN->getConfig()->removeSetting("pdfusedetectedfontsizes"); MAIN->getConfig()->removeSetting("pdffontscale"); MAIN->getConfig()->removeSetting("pdfuniformizelinespacing"); MAIN->getConfig()->removeSetting("pdfpreservespaces"); MAIN->getConfig()->removeSetting("pdfpreview"); } void OutputEditorHOCR::setFont() { if(MAIN->getConfig()->getSetting("systemoutputfont")->getValue()) { ui.plainTextEditOutput->setFont(QFont()); } else { ui.plainTextEditOutput->setFont(MAIN->getConfig()->getSetting("customoutputfont")->getValue()); } } void OutputEditorHOCR::imageFormatChanged() { QImage::Format format = static_cast(m_pdfExportDialogUi.comboBoxImageFormat->itemData(m_pdfExportDialogUi.comboBoxImageFormat->currentIndex()).toInt()); QStandardItemModel* model = static_cast(m_pdfExportDialogUi.comboBoxImageCompression->model()); int zipIdx = m_pdfExportDialogUi.comboBoxImageCompression->findData(PDFSettings::CompressZip); int ccittIdx = m_pdfExportDialogUi.comboBoxImageCompression->findData(PDFSettings::CompressFax4); int jpegIdx = m_pdfExportDialogUi.comboBoxImageCompression->findData(PDFSettings::CompressJpeg); QStandardItem* ccittItem = model->item(ccittIdx); QStandardItem* jpegItem = model->item(jpegIdx); if(format == QImage::Format_Mono) { if(m_pdfExportDialogUi.comboBoxImageCompression->currentIndex() == jpegIdx) { m_pdfExportDialogUi.comboBoxImageCompression->setCurrentIndex(zipIdx); } ccittItem->setFlags(ccittItem->flags()|Qt::ItemIsSelectable|Qt::ItemIsEnabled); jpegItem->setFlags(jpegItem->flags() & ~(Qt::ItemIsSelectable|Qt::ItemIsEnabled)); m_pdfExportDialogUi.labelDithering->setEnabled(true); m_pdfExportDialogUi.comboBoxDithering->setEnabled(true); } else { if(m_pdfExportDialogUi.comboBoxImageCompression->currentIndex() == ccittIdx) { m_pdfExportDialogUi.comboBoxImageCompression->setCurrentIndex(zipIdx); } ccittItem->setFlags(ccittItem->flags() & ~(Qt::ItemIsSelectable|Qt::ItemIsEnabled)); jpegItem->setFlags(jpegItem->flags()|Qt::ItemIsSelectable|Qt::ItemIsEnabled); m_pdfExportDialogUi.labelDithering->setEnabled(false); m_pdfExportDialogUi.comboBoxDithering->setEnabled(false); } } void OutputEditorHOCR::imageCompressionChanged() { PDFSettings::Compression compression = static_cast(m_pdfExportDialogUi.comboBoxImageCompression->itemData(m_pdfExportDialogUi.comboBoxImageCompression->currentIndex()).toInt()); bool jpegCompression = compression == PDFSettings::CompressJpeg; m_pdfExportDialogUi.spinBoxCompressionQuality->setEnabled(jpegCompression); m_pdfExportDialogUi.labelCompressionQuality->setEnabled(jpegCompression); } OutputEditorHOCR::ReadSessionData* OutputEditorHOCR::initRead(tesseract::TessBaseAPI &tess) { tess.SetPageSegMode(tesseract::PSM_AUTO_ONLY); return new HOCRReadSessionData; } void OutputEditorHOCR::read(tesseract::TessBaseAPI &tess, ReadSessionData *data) { tess.SetVariable("hocr_font_info", "true"); char* text = tess.GetHOCRText(data->page); QMetaObject::invokeMethod(this, "addPage", Qt::QueuedConnection, Q_ARG(QString, QString::fromUtf8(text)), Q_ARG(ReadSessionData, *data)); delete[] text; } void OutputEditorHOCR::readError(const QString& errorMsg, ReadSessionData *data) { static_cast(data)->errors.append(QString("%1[%2]: %3").arg(data->file).arg(data->page).arg(errorMsg)); } void OutputEditorHOCR::finalizeRead(ReadSessionData *data) { HOCRReadSessionData* hdata = static_cast(data); if(!hdata->errors.isEmpty()) { QString message = QString(_("The following pages could not be processed:\n%1").arg(hdata->errors.join("\n"))); QMessageBox::warning(MAIN, _("Recognition errors"), message); } OutputEditor::finalizeRead(data); } void OutputEditorHOCR::addPage(const QString& hocrText, ReadSessionData data) { QDomDocument doc; doc.setContent(hocrText); QDomElement pageDiv = doc.firstChildElement("div"); s_bboxRx.indexIn(pageDiv.attribute("title")); int x1 = s_bboxRx.cap(1).toInt(); int y1 = s_bboxRx.cap(2).toInt(); int x2 = s_bboxRx.cap(3).toInt(); int y2 = s_bboxRx.cap(4).toInt(); QString pageTitle = QString("image '%1'; bbox %2 %3 %4 %5; pageno %6; rot %7; res %8") .arg(data.file) .arg(x1).arg(y1).arg(x2).arg(y2) .arg(data.page) .arg(data.angle) .arg(data.resolution); pageDiv.setAttribute("title", pageTitle); addPage(pageDiv, QFileInfo(data.file).fileName(), data.page, true); } void OutputEditorHOCR::addPage(QDomElement pageDiv, const QString& filename, int page, bool cleanGraphics) { pageDiv.setAttribute("id", QString("page_%1").arg(++m_idCounter)); s_bboxRx.indexIn(pageDiv.attribute("title")); int x1 = s_bboxRx.cap(1).toInt(); int y1 = s_bboxRx.cap(2).toInt(); int x2 = s_bboxRx.cap(3).toInt(); int y2 = s_bboxRx.cap(4).toInt(); QTreeWidgetItem* pageItem = new QTreeWidgetItem(QStringList() << QString("%1 [%2]").arg(filename).arg(page)); pageItem->setData(0, IdRole, pageDiv.attribute("id")); pageItem->setData(0, BBoxRole, QRect(x1, y1, x2 - x1, y2 - y1)); pageItem->setData(0, ClassRole, "ocr_page"); pageItem->setIcon(0, QIcon(":/icons/item_page")); pageItem->setCheckState(0, Qt::Checked); m_rootItem->addChild(pageItem); QMap langCache; QVector> graphicElements; QDomElement element = pageDiv.firstChildElement("div"); while(!element.isNull()) { // Boxes without text are images if(!addChildItems(element.firstChildElement(), pageItem, langCache) && s_bboxRx.indexIn(element.attribute("title")) != -1) { x1 = s_bboxRx.cap(1).toInt(); y1 = s_bboxRx.cap(2).toInt(); x2 = s_bboxRx.cap(3).toInt(); y2 = s_bboxRx.cap(4).toInt(); graphicElements.append(qMakePair(element, QRect(x1, y1, x2 - x1, y2 - y1))); } element = element.nextSiblingElement(); } // Discard graphic elements which intersect with text block or which are too small int numTextBlocks = pageItem->childCount(); for(const QPair& pair: graphicElements) { const QDomElement& element = pair.first; const QRect& bbox = pair.second; bool deleteGraphic = false; if(cleanGraphics) { if(bbox.width() < 10 || bbox.height() < 10) { deleteGraphic = true; } else { for(int i = 0; i < numTextBlocks; ++i) { if(bbox.intersects(pageItem->child(i)->data(0, BBoxRole).toRect())) { deleteGraphic = true; break; } } } } if(!deleteGraphic) { QTreeWidgetItem* item = new QTreeWidgetItem(QStringList() << _("Graphic")); item->setCheckState(0, Qt::Checked); item->setIcon(0, QIcon(":/icons/item_halftone")); item->setData(0, IdRole, element.attribute("id")); item->setData(0, ClassRole, "ocr_graphic"); item->setData(0, BBoxRole, bbox); pageItem->addChild(item); } else { element.parentNode().removeChild(element); } } QString str; QTextStream ss(&str); pageDiv.save(ss, 1); pageItem->setData(0, SourceRole, str); expandChildren(pageItem); MAIN->setOutputPaneVisible(true); m_modified = true; ui.actionOutputSaveHOCR->setEnabled(true); ui.actionOutputExportPDF->setEnabled(true); } void OutputEditorHOCR::expandChildren(QTreeWidgetItem* item) const { if(item->childCount() > 0) { item->setExpanded(true); for(int i = 0, n = item->childCount(); i < n; ++i) { expandChildren(item->child(i)); } } } void OutputEditorHOCR::collapseChildren(QTreeWidgetItem* item) const { if(item->childCount() > 0) { item->setExpanded(false); for(int i = 0, n = item->childCount(); i < n; ++i) { collapseChildren(item->child(i)); } } } bool OutputEditorHOCR::addChildItems(QDomElement element, QTreeWidgetItem* parentItem, QMap& langCache) { bool haveWord = false; while(!element.isNull()) { QDomElement nextElement = element.nextSiblingElement(); if(s_idRx.indexIn(element.attribute("id")) != -1) { QString newId = QString("%1_%2_%3").arg(s_idRx.cap(1)).arg(m_idCounter).arg(s_idRx.cap(2)); element.setAttribute("id", newId); } if(s_bboxRx.indexIn(element.attribute("title")) != -1) { QString type = element.attribute("class"); QString icon; QString title; int x1 = s_bboxRx.cap(1).toInt(); int y1 = s_bboxRx.cap(2).toInt(); int x2 = s_bboxRx.cap(3).toInt(); int y2 = s_bboxRx.cap(4).toInt(); if(type == "ocr_par") { title = _("Paragraph"); icon = "par"; } else if(type == "ocr_line") { title = _("Textline"); icon = "line"; } else if(type == "ocrx_word") { title = element.text(); icon = "word"; } if(!title.isEmpty()) { QTreeWidgetItem* item = new QTreeWidgetItem(QStringList() << title); if(type == "ocrx_word" || addChildItems(element.firstChildElement(), item, langCache)) { item->setCheckState(0, Qt::Checked); item->setData(0, IdRole, element.attribute("id")); item->setIcon(0, QIcon(QString(":/icons/item_%1").arg(icon))); item->setData(0, BBoxRole, QRect(x1, y1, x2 - x1, y2 - y1)); item->setData(0, ClassRole, type); parentItem->addChild(item); haveWord = true; if(type == "ocr_line") { if(s_baseLineRx.indexIn(element.attribute("title")) != -1) { item->setData(0, BaselineRole, s_baseLineRx.cap(2).toInt()); } } else if(type == "ocrx_word") { // Ensure correct hyphen char is used on last word of line if(nextElement.isNull()) { title.replace(QRegExp("[-\u2014]\\s*$"), "-"); element.replaceChild(element.ownerDocument().createTextNode(title), element.firstChild()); item->setText(0, title); } if(s_fontSizeRx.indexIn(element.attribute("title")) != -1) { item->setData(0, FontSizeRole, s_fontSizeRx.cap(1).toDouble()); } item->setFlags(item->flags() | Qt::ItemIsEditable); QString lang = element.attribute("lang"); auto it = langCache.find(lang); if(it == langCache.end()) { it = langCache.insert(lang, Utils::getSpellingLanguage(lang)); } QString spellingLang = it.value(); if(m_spell.getLanguage() != spellingLang) { m_spell.setLanguage(spellingLang); } if(!m_spell.checkWord(trimWord(title))) { item->setForeground(0, Qt::red); } } } else { delete item; } } } element = nextElement; } return haveWord; } QDomElement OutputEditorHOCR::elementById(QDomElement element, const QString& id) const { QDomElement child; while(!element.isNull()) { if(element.attribute("id") == id) { return element; } else if(!(child = elementById(element.firstChildElement(), id)).isNull()) { return child; } else { element = element.nextSiblingElement(); } } return QDomElement(); } void OutputEditorHOCR::showItemProperties(QTreeWidgetItem* item) { ui.tableWidgetProperties->blockSignals(true); ui.tableWidgetProperties->setRowCount(0); ui.tableWidgetProperties->blockSignals(false); ui.plainTextEditOutput->setPlainText(""); m_tool->clearSelection(); m_currentPageItem = nullptr; m_currentItem = item; if(!item || item == m_rootItem) { m_currentDocument = QDomDocument(); m_currentElement = QDomElement(); return; } m_currentPageItem = item; while(m_currentPageItem->parent() != m_rootItem) { m_currentPageItem = m_currentPageItem->parent(); } QString id = item->data(0, IdRole).toString(); m_currentDocument.setContent(m_currentPageItem->data(0, SourceRole).toString()); m_currentElement = elementById(m_currentDocument.firstChildElement(), id); if(m_currentElement.isNull()) { m_currentDocument = QDomDocument(); m_currentPageItem = nullptr; m_currentItem = nullptr; return; } QDomNamedNodeMap attributes = m_currentElement.attributes(); int row = -1; ui.tableWidgetProperties->blockSignals(true); for(int i = 0, n = attributes.count(); i < n; ++i) { QDomNode attribNode = attributes.item(i); if(attribNode.nodeName() == "title") { for(const QString& attrib : attribNode.nodeValue().split(QRegExp("\\s*;\\s*"))) { int splitPos = attrib.indexOf(QRegExp("\\s+")); ui.tableWidgetProperties->insertRow(++row); QTableWidgetItem* attrNameItem = new QTableWidgetItem(attrib.left(splitPos)); attrNameItem->setFlags(attrNameItem->flags() & ~Qt::ItemIsEditable); attrNameItem->setData(ParentAttrRole, "title"); ui.tableWidgetProperties->setItem(row, 0, attrNameItem); ui.tableWidgetProperties->setItem(row, 1, new QTableWidgetItem(attrib.mid(splitPos + 1))); } } else { ui.tableWidgetProperties->insertRow(++row); QTableWidgetItem* attrNameItem = new QTableWidgetItem(attribNode.nodeName()); attrNameItem->setFlags(attrNameItem->flags() & ~Qt::ItemIsEditable); ui.tableWidgetProperties->setItem(row, 0, attrNameItem); ui.tableWidgetProperties->setItem(row, 1, new QTableWidgetItem(attribNode.nodeValue())); } } ui.tableWidgetProperties->blockSignals(false); QString str; QTextStream stream(&str); m_currentElement.save(stream, 1); ui.plainTextEditOutput->setPlainText(str); if(setCurrentSource(m_currentDocument.firstChildElement("div")) && s_bboxRx.indexIn(m_currentElement.attribute("title")) != -1) { int x1 = s_bboxRx.cap(1).toInt(); int y1 = s_bboxRx.cap(2).toInt(); int x2 = s_bboxRx.cap(3).toInt(); int y2 = s_bboxRx.cap(4).toInt(); m_tool->setSelection(QRect(x1, y1, x2-x1, y2-y1)); } } bool OutputEditorHOCR::setCurrentSource(const QDomElement& pageElement, int* pageDpi, int* overrideDpi) const { if(s_pageTitleRx.indexIn(pageElement.attribute("title")) != -1) { QString filename = s_pageTitleRx.cap(1); int page = s_pageTitleRx.cap(2).toInt(); double angle = s_pageTitleRx.cap(3).toDouble(); int res = s_pageTitleRx.cap(4).toInt(); if(pageDpi) { *pageDpi = res; } if(overrideDpi) { res = *overrideDpi; } MAIN->getSourceManager()->addSource(filename); QApplication::processEvents(QEventLoop::ExcludeUserInputEvents); int dummy; // TODO: Handle this better if(MAIN->getDisplayer()->getCurrentImage(dummy) != filename) { return false; } if(MAIN->getDisplayer()->getCurrentPage() != page) { MAIN->getDisplayer()->setCurrentPage(page); } if(MAIN->getDisplayer()->getCurrentAngle() != angle) { MAIN->getDisplayer()->setAngle(angle); } if(MAIN->getDisplayer()->getCurrentResolution() != res) { MAIN->getDisplayer()->setResolution(res); } return true; } return false; } void OutputEditorHOCR::itemChanged(QTreeWidgetItem* item, int col) { if(item != m_currentItem) { return; } ui.treeWidgetItems->blockSignals(true); bool isWord = item->data(0, ClassRole).toString() == "ocrx_word"; if( isWord && item->checkState(col) == Qt::Checked) { // Update text updateCurrentItemText(); } else if(item->checkState(col) == Qt::Checked) { item->setFlags(item->flags() | Qt::ItemIsSelectable); if(!isWord) { item->setChildIndicatorPolicy(QTreeWidgetItem::ShowIndicator); } } else { item->setFlags(item->flags() & ~Qt::ItemIsSelectable); item->setChildIndicatorPolicy(QTreeWidgetItem::DontShowIndicator); item->setExpanded(false); } ui.treeWidgetItems->blockSignals(false); } void OutputEditorHOCR::propertyCellChanged(int row, int /*col*/) { QTableWidgetItem* keyItem = ui.tableWidgetProperties->item(row, 0); QTableWidgetItem* valueItem = ui.tableWidgetProperties->item(row, 1); QString parentAttr = keyItem->data(ParentAttrRole).toString(); if(!parentAttr.isEmpty()) { updateCurrentItemAttribute(parentAttr, keyItem->text(), valueItem->text()); } else { updateCurrentItemAttribute(keyItem->text(), "", valueItem->text()); } } void OutputEditorHOCR::updateCurrentItemText() { if(m_currentItem) { QString newText = m_currentItem->text(0); m_currentElement.replaceChild(m_currentDocument.createTextNode(newText), m_currentElement.firstChild()); updateCurrentItem(); } } void OutputEditorHOCR::updateCurrentItemAttribute(const QString& key, const QString& subkey, const QString& newvalue, bool update) { if(m_currentItem) { if(subkey.isEmpty()) { m_currentElement.setAttribute(key, newvalue); } else { QString value = m_currentElement.attribute(key); QStringList subattrs = value.split(QRegExp("\\s*;\\s*")); for(int i = 0, n = subattrs.size(); i < n; ++i) { int splitPos = subattrs[i].indexOf(QRegExp("\\s+")); if(subattrs[i].left(splitPos) == subkey) { subattrs[i] = subkey + " " + newvalue; break; } } m_currentElement.setAttribute(key, subattrs.join("; ")); } if(update) updateCurrentItem(); } } void OutputEditorHOCR::updateCurrentItemBBox(QRect rect) { if(m_currentItem) { ui.treeWidgetItems->blockSignals(true); m_currentItem->setData(0, BBoxRole, rect); ui.treeWidgetItems->blockSignals(false); QString bboxstr = QString("%1 %2 %3 %4").arg(rect.x()).arg(rect.y()).arg(rect.x() + rect.width()).arg(rect.y() + rect.height()); for(int row = 0, n = ui.tableWidgetProperties->rowCount(); row < n; ++row) { QTableWidgetItem* cell = ui.tableWidgetProperties->item(row, 0); if(cell->text() == "bbox" && cell->data(ParentAttrRole).toString() == "title") { ui.tableWidgetProperties->blockSignals(true); ui.tableWidgetProperties->item(row, 1)->setText(bboxstr); ui.tableWidgetProperties->blockSignals(false); break; } } updateCurrentItemAttribute("title", "bbox", bboxstr, false); QString str; QTextStream stream(&str); m_currentDocument.save(stream, 1); m_currentPageItem->setData(0, SourceRole, str); QString elemstr; QTextStream elemstream(&elemstr); m_currentElement.save(elemstream, 1); ui.plainTextEditOutput->setPlainText(elemstr); } } void OutputEditorHOCR::updateCurrentItem() { QString spellLang = Utils::getSpellingLanguage(m_currentElement.attribute("lang")); if(m_spell.getLanguage() != spellLang) { m_spell.setLanguage(spellLang); } ui.treeWidgetItems->blockSignals(true); // prevent item changed signal m_currentItem->setForeground(0, m_spell.checkWord(trimWord(m_currentItem->text(0))) ? m_currentItem->parent()->foreground(0) : QBrush(Qt::red)); ui.treeWidgetItems->blockSignals(false); QString str; QTextStream stream(&str); m_currentDocument.save(stream, 1); m_currentPageItem->setData(0, SourceRole, str); QString elemstr; QTextStream elemstream(&elemstr); m_currentElement.save(elemstream, 1); ui.plainTextEditOutput->setPlainText(elemstr); if(setCurrentSource(m_currentDocument.firstChildElement("div")) && s_bboxRx.indexIn(m_currentElement.attribute("title")) != -1) { int x1 = s_bboxRx.cap(1).toInt(); int y1 = s_bboxRx.cap(2).toInt(); int x2 = s_bboxRx.cap(3).toInt(); int y2 = s_bboxRx.cap(4).toInt(); m_tool->setSelection(QRect(x1, y1, x2-x1, y2-y1)); } m_modified = true; } void OutputEditorHOCR::removeCurrentItem() { m_currentElement.parentNode().removeChild(m_currentElement); QString str; QTextStream stream(&str); m_currentDocument.save(stream, 1); m_currentPageItem->setData(0, SourceRole, str); delete m_currentItem; m_currentItem = nullptr; } void OutputEditorHOCR::addGraphicRegion(QRect rect) { QDomElement pageDiv = m_currentDocument.firstChildElement("div"); if(pageDiv.isNull()) { return; } // Determine a free block id int pageId = 0; int blockId = 0; QDomElement blockEl = pageDiv.firstChildElement("div"); while(!blockEl.isNull()) { if(s_idRx.indexIn(blockEl.attribute("id")) != -1) { pageId = qMax(pageId, s_idRx.cap(1).toInt() + 1); blockId = qMax(blockId, s_idRx.cap(2).toInt() + 1); } blockEl = blockEl.nextSiblingElement(); } // Add html element QDomElement graphicElement = m_currentDocument.createElement("div"); graphicElement.setAttribute("title", QString("bbox %1 %2 %3 %4").arg(rect.x()).arg(rect.y()).arg(rect.x() + rect.width()).arg(rect.y() + rect.height())); graphicElement.setAttribute("class", "ocr_carea"); graphicElement.setAttribute("id", QString("block_%1_%2").arg(pageId).arg(blockId)); pageDiv.appendChild(graphicElement); QString str; QTextStream stream(&str); m_currentDocument.save(stream, 1); m_currentPageItem->setData(0, SourceRole, str); // Add tree item QTreeWidgetItem* item = new QTreeWidgetItem(QStringList() << _("Graphic")); item->setCheckState(0, Qt::Checked); item->setIcon(0, QIcon(":/icons/item_halftone")); item->setData(0, IdRole, graphicElement.attribute("id")); item->setData(0, ClassRole, "ocr_graphic"); item->setData(0, BBoxRole, rect); m_currentPageItem->addChild(item); ui.treeWidgetItems->setCurrentItem(item); } QString OutputEditorHOCR::trimWord(const QString& word, QString* prefix, QString* suffix) { QRegExp wordRe("^(\\W*)(.*\\w)(\\W*)$"); if(wordRe.indexIn(word) != -1) { if(prefix) *prefix = wordRe.cap(1); if(suffix) *suffix = wordRe.cap(3); return wordRe.cap(2); } return word; } void OutputEditorHOCR::mergeItems(const QList& items) { ui.treeWidgetItems->setCurrentItem(items.front()); QRect bbox = items.front()->data(0, BBoxRole).toRect(); QString text = items.front()->text(0); for(int i = 1, n = items.size(); i < n; ++i) { bbox = bbox.united(items[i]->data(0, BBoxRole).toRect()); text += items[i]->text(0); QDomElement element = elementById(m_currentDocument.firstChildElement(), items[i]->data(0, IdRole).toString()); element.parentNode().removeChild(element); delete items[i]; } items.front()->setText(0, text); items.front()->setData(0, BBoxRole, bbox); updateCurrentItemText(); updateCurrentItemAttribute("title", "bbox", QString("%1 %2 %3 %4").arg(bbox.x()).arg(bbox.y()).arg(bbox.x() + bbox.width()).arg(bbox.y() + bbox.height())); showItemProperties(m_currentItem); } void OutputEditorHOCR::showTreeWidgetContextMenu(const QPoint &point) { QList items = ui.treeWidgetItems->selectedItems(); bool wordsSelected = true; for(QTreeWidgetItem* item : items) { QString itemClass = item->data(0, ClassRole).toString(); if(itemClass != "ocrx_word") { wordsSelected = false; break; } } if(items.size() > 1 && wordsSelected) { QMenu menu; QAction* actionMerge = menu.addAction(_("Merge")); if(menu.exec(ui.treeWidgetItems->mapToGlobal(point)) == actionMerge) { mergeItems(items); } return; } else if(items.size() > 1) { return; } QTreeWidgetItem* item = ui.treeWidgetItems->itemAt(point); if(!item) { return; } QString itemClass = item->data(0, ClassRole).toString(); if(itemClass.isEmpty() && item != m_rootItem) { return; } QMenu menu; QAction* actionAddGraphic = nullptr; QAction* addWordAction = nullptr; QAction* ignoreWordAction = nullptr; QList setTextActions; QAction* actionRemoveItem = nullptr; QAction* actionRemovePage = nullptr; QAction* actionExpand = nullptr; QAction* actionCollapse = nullptr; if(itemClass == "ocr_page") { actionAddGraphic = menu.addAction(_("Add graphic region")); } if(itemClass == "ocrx_word") { QString prefix, suffix, trimmedWord = trimWord(item->text(0), &prefix, &suffix); for(const QString& suggestion : m_spell.getSpellingSuggestions(trimmedWord)) { setTextActions.append(menu.addAction(prefix + suggestion + suffix)); } if(setTextActions.isEmpty()) { menu.addAction(_("No suggestions"))->setEnabled(false); } if(!m_spell.checkWord(trimWord(item->text(0)))) { menu.addSeparator(); addWordAction = menu.addAction(_("Add to dictionary")); ignoreWordAction = menu.addAction(_("Ignore word")); } } if(item != m_rootItem) { if(!menu.actions().isEmpty()) { menu.addSeparator(); } if(itemClass == "ocr_page") { actionRemovePage = menu.addAction(_("Remove")); } else { actionRemoveItem = menu.addAction(_("Remove")); } } if(itemClass != "ocrx_word" && itemClass != "ocr_graphic") { if(!menu.actions().isEmpty()) { menu.addSeparator(); } actionExpand = menu.addAction(_("Expand all")); actionCollapse = menu.addAction(_("Collapse all")); } QAction* clickedAction = menu.exec(ui.treeWidgetItems->mapToGlobal(point)); if(!clickedAction) { return; } if(clickedAction == actionAddGraphic) { m_tool->clearSelection(); m_tool->activateDrawSelection(); } else if(clickedAction == addWordAction) { m_spell.addWordToDictionary(item->text(0)); item->setForeground(0, item->parent()->foreground(0)); } else if(clickedAction == ignoreWordAction) { m_spell.ignoreWord(item->text(0)); item->setForeground(0, item->parent()->foreground(0)); } else if(setTextActions.contains(clickedAction)){ item->setText(0, clickedAction->text()); } else if(clickedAction == actionRemoveItem) { removeCurrentItem(); } else if(clickedAction == actionRemovePage) { delete item; ui.actionOutputSaveHOCR->setEnabled(m_rootItem->childCount() > 0); ui.actionOutputExportPDF->setEnabled(m_rootItem->childCount() > 0); } else if(clickedAction == actionExpand) { expandChildren(item); } else if(clickedAction == actionCollapse) { collapseChildren(item); } } void OutputEditorHOCR::updateFontButton(const QFont& font) { m_pdfExportDialogUi.buttonFont->setText(QString("%1 %2").arg(font.family()).arg(font.pointSize())); updatePreview(); } void OutputEditorHOCR::open() { if(!clear(false)) { return; } QString dir = MAIN->getConfig()->getSetting>("outputdir")->getValue(); QString filename = QFileDialog::getOpenFileName(m_widget, _("Open hOCR File"), dir, QString("%1 (*.html)").arg(_("hOCR HTML Files"))); if(filename.isEmpty()) { return; } QFile file(filename); if(!file.open(QIODevice::ReadOnly)) { QMessageBox::critical(MAIN, _("Failed to open file"), _("The file could not be opened: %1.").arg(filename)); return; } QDomDocument doc; doc.setContent(&file); QDomElement div = doc.firstChildElement("html").firstChildElement("body").firstChildElement("div"); if(div.isNull() || div.attribute("class") != "ocr_page") { QMessageBox::critical(MAIN, _("Invalid hOCR file"), _("The file does not appear to contain valid hOCR HTML: %1").arg(filename)); return; } int page = 0; while(!div.isNull()) { ++page; addPage(div, QFileInfo(filename).fileName(), page, false); div = div.nextSiblingElement("div"); } } bool OutputEditorHOCR::save(const QString& filename) { QString outname = filename; if(outname.isEmpty()) { QList sources = MAIN->getSourceManager()->getSelectedSources(); QString base = !sources.isEmpty() ? QFileInfo(sources.first()->displayname).baseName() : _("output"); outname = QDir(MAIN->getConfig()->getSetting>("outputdir")->getValue()).absoluteFilePath(base + ".html"); outname = QFileDialog::getSaveFileName(MAIN, _("Save hOCR Output..."), outname, QString("%1 (*.html)").arg(_("hOCR HTML Files"))); if(outname.isEmpty()) { return false; } MAIN->getConfig()->getSetting>("outputdir")->setValue(QFileInfo(outname).absolutePath()); } QFile file(outname); if(!file.open(QIODevice::WriteOnly)) { QMessageBox::critical(MAIN, _("Failed to save output"), _("Check that you have writing permissions in the selected folder.")); return false; } tesseract::TessBaseAPI tess; QString header = QString( "\n" "\n" " \n" " \n" " \n" " \n" " \n" " \n" "\n").arg(tess.Version()); file.write(header.toUtf8()); for(int i = 0, n = m_rootItem->childCount(); i < n; ++i) { file.write(m_rootItem->child(i)->data(0, SourceRole).toString().toUtf8()); } file.write("\n\n"); m_modified = false; return true; } void OutputEditorHOCR::savePDF() { m_preview = new QGraphicsPixmapItem(); m_preview->setTransformationMode(Qt::SmoothTransformation); updatePreview(); MAIN->getDisplayer()->scene()->addItem(m_preview); bool accepted = false; PoDoFo::PdfStreamedDocument* document = nullptr; PoDoFo::PdfFont* font = nullptr; #if PODOFO_VERSION >= PODOFO_MAKE_VERSION(0,9,3) const PoDoFo::PdfEncoding* pdfEncoding = PoDoFo::PdfEncodingFactory::GlobalIdentityEncodingInstance(); #else const PoDoFo::PdfEncoding* pdfEncoding = new PoDoFo::PdfIdentityEncoding; #endif while(true) { accepted = (m_pdfExportDialog->exec() == QDialog::Accepted); if(!accepted) { break; } QList sources = MAIN->getSourceManager()->getSelectedSources(); QString base = !sources.isEmpty() ? QFileInfo(sources.first()->displayname).baseName() : _("output"); QString outname = QDir(MAIN->getConfig()->getSetting>("outputdir")->getValue()).absoluteFilePath(base + ".pdf"); outname = QFileDialog::getSaveFileName(MAIN, _("Save PDF Output..."), outname, QString("%1 (*.pdf)").arg(_("PDF Files"))); if(outname.isEmpty()) { accepted = false; break; } MAIN->getConfig()->getSetting>("outputdir")->setValue(QFileInfo(outname).absolutePath()); try { document = new PoDoFo::PdfStreamedDocument(outname.toLocal8Bit().data()); } catch(...) { QMessageBox::critical(MAIN, _("Failed to save output"), _("Check that you have writing permissions in the selected folder.")); continue; } try { QFontInfo info(m_pdfFontDialog.currentFont()); #if PODOFO_VERSION >= PODOFO_MAKE_VERSION(0,9,3) font = document->CreateFontSubset(info.family().toLocal8Bit().data(), info.bold(), info.italic(), false, pdfEncoding); #else font = document->CreateFontSubset(info.family().toLocal8Bit().data(), info.bold(), info.italic(), pdfEncoding); #endif } catch(...) { font = nullptr; } if(!font) { QMessageBox::critical(MAIN, _("Error"), _("The PDF library does not support the selected font.")); document->Close(); delete document; continue; } break; } MAIN->getDisplayer()->scene()->removeItem(m_preview); delete m_preview; m_preview = nullptr; if(!accepted) { return; } PoDoFo::PdfPainter painter; PDFSettings pdfSettings; pdfSettings.colorFormat = static_cast(m_pdfExportDialogUi.comboBoxImageFormat->itemData(m_pdfExportDialogUi.comboBoxImageFormat->currentIndex()).toInt()); pdfSettings.conversionFlags = pdfSettings.colorFormat == QImage::Format_Mono ? static_cast(m_pdfExportDialogUi.comboBoxDithering->itemData(m_pdfExportDialogUi.comboBoxDithering->currentIndex()).toInt()) : Qt::AutoColor; pdfSettings.compression = static_cast(m_pdfExportDialogUi.comboBoxImageCompression->itemData(m_pdfExportDialogUi.comboBoxImageCompression->currentIndex()).toInt()); pdfSettings.compressionQuality = m_pdfExportDialogUi.spinBoxCompressionQuality->value(); pdfSettings.useDetectedFontSizes = m_pdfExportDialogUi.checkBoxFontSize->isChecked(); pdfSettings.uniformizeLineSpacing = m_pdfExportDialogUi.checkBoxUniformizeSpacing->isChecked(); pdfSettings.preserveSpaceWidth = m_pdfExportDialogUi.spinBoxPreserve->value(); pdfSettings.overlay = m_pdfExportDialogUi.comboBoxOutputMode->currentIndex() == 1; pdfSettings.detectedFontScaling = m_pdfExportDialogUi.spinFontScaling->value() / 100.; QStringList failed; for(int i = 0, n = m_rootItem->childCount(); i < n; ++i) { QTreeWidgetItem* item = m_rootItem->child(i); if(item->checkState(0) != Qt::Checked) { continue; } QRect bbox = item->data(0, BBoxRole).toRect(); QDomDocument doc; doc.setContent(item->data(0, SourceRole).toString()); int sourceDpi = -1; int outputDpi = m_pdfExportDialogUi.spinBoxDpi->value(); if(setCurrentSource(doc.firstChildElement("div"), &sourceDpi, &outputDpi)) { double docScale = (72. / sourceDpi); double imgScale = double(outputDpi) / sourceDpi; PoDoFo::PdfPage* page = document->CreatePage(PoDoFo::PdfRect(0, 0, bbox.width() * docScale, bbox.height() * docScale)); painter.SetPage(page); painter.SetFont(font); PoDoFoPDFPainter pdfprinter(document, &painter, docScale); pdfprinter.setFontSize(m_pdfFontDialog.currentFont().pointSize()); printChildren(pdfprinter, item, pdfSettings, imgScale); if(pdfSettings.overlay) { QRect scaledBBox(imgScale * bbox.left(), imgScale * bbox.top(), imgScale * bbox.width(), imgScale * bbox.height()); pdfprinter.drawImage(bbox, m_tool->getSelection(scaledBBox), pdfSettings); } MAIN->getDisplayer()->setResolution(sourceDpi); painter.FinishPage(); } else { failed.append(item->text(0)); } } if(!failed.isEmpty()) { QMessageBox::warning(m_widget, _("Errors occurred"), _("The following pages could not be rendered:\n%1").arg(failed.join("\n"))); } document->Close(); delete document; } void OutputEditorHOCR::printChildren(PDFPainter& painter, QTreeWidgetItem* item, const PDFSettings& pdfSettings, double imgScale) const { if(item->checkState(0) != Qt::Checked) { return; } QString itemClass = item->data(0, ClassRole).toString(); QRect itemRect = item->data(0, BBoxRole).toRect(); if(itemClass == "ocr_par" && pdfSettings.uniformizeLineSpacing) { double yInc = double(itemRect.height()) / item->childCount(); double y = itemRect.top() + yInc; int baseline = item->childCount() > 0 ? item->child(0)->data(0, BaselineRole).toInt() : 0; for(int iLine = 0, nLines = item->childCount(); iLine < nLines; ++iLine, y += yInc) { QTreeWidgetItem* lineItem = item->child(iLine); int x = itemRect.x(); int prevWordRight = itemRect.x(); for(int iWord = 0, nWords = lineItem->childCount(); iWord < nWords; ++iWord) { QTreeWidgetItem* wordItem = lineItem->child(iWord); if(wordItem->checkState(0) == Qt::Checked) { QRect wordRect = wordItem->data(0, BBoxRole).toRect(); if(pdfSettings.useDetectedFontSizes) { painter.setFontSize(wordItem->data(0, FontSizeRole).toDouble() * pdfSettings.detectedFontScaling); } // If distance from previous word is large, keep the space if(wordRect.x() - prevWordRight > pdfSettings.preserveSpaceWidth * painter.getAverageCharWidth()) { x = wordRect.x(); } prevWordRight = wordRect.right(); painter.drawText(x, y + baseline, wordItem->text(0)); x += painter.getTextWidth(wordItem->text(0) + " "); } } } } else if(itemClass == "ocr_line" && !pdfSettings.uniformizeLineSpacing) { int baseline = item->data(0, BaselineRole).toInt(); double y = itemRect.bottom() + baseline; for(int iWord = 0, nWords = item->childCount(); iWord < nWords; ++iWord) { QTreeWidgetItem* wordItem = item->child(iWord); QRect wordRect = wordItem->data(0, BBoxRole).toRect(); if(pdfSettings.useDetectedFontSizes) { painter.setFontSize(wordItem->data(0, FontSizeRole).toDouble() * pdfSettings.detectedFontScaling); } painter.drawText(wordRect.x(), y, wordItem->text(0)); } } else if(itemClass == "ocr_graphic" && !pdfSettings.overlay) { QRect scaledItemRect(itemRect.left() * imgScale, itemRect.top() * imgScale, itemRect.width() * imgScale, itemRect.height() * imgScale); painter.drawImage(itemRect, m_tool->getSelection(scaledItemRect), pdfSettings); } else { for(int i = 0, n = item->childCount(); i < n; ++i) { printChildren(painter, item->child(i), pdfSettings, imgScale); } } } void OutputEditorHOCR::updatePreview() { if(!m_preview) { return; } m_preview->setVisible(m_pdfExportDialogUi.checkBoxPreview->isChecked()); if(m_rootItem->childCount() == 0 || !m_pdfExportDialogUi.checkBoxPreview->isChecked()) { return; } QTreeWidgetItem* item = ui.treeWidgetItems->currentItem(); if(!item) { item = m_rootItem->child(0); } else { while(item->parent()) { item = item->parent(); } } QRect bbox = item->data(0, BBoxRole).toRect(); QDomDocument doc; int pageDpi = -1; doc.setContent(item->data(0, SourceRole).toString()); setCurrentSource(doc.firstChildElement("div"), &pageDpi); PDFSettings pdfSettings; pdfSettings.colorFormat = static_cast(m_pdfExportDialogUi.comboBoxImageFormat->itemData(m_pdfExportDialogUi.comboBoxImageFormat->currentIndex()).toInt()); pdfSettings.conversionFlags = pdfSettings.colorFormat == QImage::Format_Mono ? static_cast(m_pdfExportDialogUi.comboBoxDithering->itemData(m_pdfExportDialogUi.comboBoxDithering->currentIndex()).toInt()) : Qt::AutoColor; pdfSettings.compression = static_cast(m_pdfExportDialogUi.comboBoxImageCompression->itemData(m_pdfExportDialogUi.comboBoxImageCompression->currentIndex()).toInt()); pdfSettings.compressionQuality = m_pdfExportDialogUi.spinBoxCompressionQuality->value(); pdfSettings.useDetectedFontSizes = m_pdfExportDialogUi.checkBoxFontSize->isChecked(); pdfSettings.uniformizeLineSpacing = m_pdfExportDialogUi.checkBoxUniformizeSpacing->isChecked(); pdfSettings.preserveSpaceWidth = m_pdfExportDialogUi.spinBoxPreserve->value(); pdfSettings.overlay = m_pdfExportDialogUi.comboBoxOutputMode->currentIndex() == 1; pdfSettings.detectedFontScaling = m_pdfExportDialogUi.spinFontScaling->value() / 100.; QImage image(bbox.size(), QImage::Format_ARGB32); image.setDotsPerMeterX(pageDpi / 0.0254); image.setDotsPerMeterY(pageDpi / 0.0254); QPainter painter(&image); painter.setRenderHint(QPainter::Antialiasing); painter.setFont(m_pdfFontDialog.currentFont()); QPainterPDFPainter pdfPrinter(&painter); if(pdfSettings.overlay) { pdfPrinter.drawImage(bbox, m_tool->getSelection(bbox), pdfSettings); painter.fillRect(0, 0, bbox.width(), bbox.height(), QColor(255, 255, 255, 127)); } else { image.fill(Qt::white); } printChildren(pdfPrinter, item, pdfSettings); m_preview->setPixmap(QPixmap::fromImage(image)); m_preview->setPos(-0.5 * bbox.width(), -0.5 * bbox.height()); } bool OutputEditorHOCR::clear(bool hide) { if(!m_widget->isVisible()) { return true; } if(getModified()) { int response = QMessageBox::question(MAIN, _("Output not saved"), _("Save output before proceeding?"), QMessageBox::Save, QMessageBox::Discard, QMessageBox::Cancel); if(response == QMessageBox::Save) { if(!save()) { return false; } } else if(response != QMessageBox::Discard) { return false; } } m_idCounter = 0; while(m_rootItem->childCount() > 0) { delete m_rootItem->child(0); } ui.tableWidgetProperties->setRowCount(0); ui.plainTextEditOutput->clear(); m_tool->clearSelection(); m_modified = false; ui.actionOutputSaveHOCR->setEnabled(false); ui.actionOutputExportPDF->setEnabled(false); if(hide) MAIN->setOutputPaneVisible(false); return true; } bool OutputEditorHOCR::getModified() const { return m_modified; } gImageReader-3.2.3/qt/src/OutputEditorHOCR.hh000066400000000000000000000135171312567024200207230ustar00rootroot00000000000000/* -*- Mode: C++; indent-tabs-mode: t; c-basic-offset: 4; tab-width: 4 -*- */ /* * OutputEditorHOCR.hh * Copyright (C) 2013-2017 Sandro Mani * * gImageReader 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. * * gImageReader 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 this program. If not, see . */ #ifndef OUTPUTEDITORHOCR_HH #define OUTPUTEDITORHOCR_HH #include "OutputEditor.hh" #include "Ui_OutputEditorHOCR.hh" #include "ui_PdfExportDialog.h" #include #include #include class DisplayerToolHOCR; class QGraphicsPixmapItem; class OutputEditorHOCR : public OutputEditor { Q_OBJECT public: OutputEditorHOCR(DisplayerToolHOCR* tool); ~OutputEditorHOCR(); QWidget* getUI() override { return m_widget; } ReadSessionData* initRead(tesseract::TessBaseAPI &tess) override; void read(tesseract::TessBaseAPI& tess, ReadSessionData* data) override; void readError(const QString& errorMsg, ReadSessionData* data) override; void finalizeRead(ReadSessionData *data) override; bool getModified() const override; public slots: bool clear(bool hide = true) override; void open(); bool save(const QString& filename = "") override; void savePDF(); private: class HTMLHighlighter; struct HOCRReadSessionData : ReadSessionData { QStringList errors; }; static const int IdRole = Qt::UserRole + 1; static const int SourceRole = Qt::UserRole + 2; static const int BBoxRole = Qt::UserRole + 3; static const int ClassRole = Qt::UserRole + 4; static const int FontSizeRole = Qt::UserRole + 5; static const int BaselineRole = Qt::UserRole + 6; static const int ParentAttrRole = Qt::UserRole + 1; static const QRegExp s_bboxRx; static const QRegExp s_pageTitleRx; static const QRegExp s_idRx; static const QRegExp s_fontSizeRx; static const QRegExp s_baseLineRx; struct PDFSettings { QImage::Format colorFormat; Qt::ImageConversionFlags conversionFlags; enum Compression { CompressZip, CompressFax4, CompressJpeg } compression; int compressionQuality; bool useDetectedFontSizes; bool uniformizeLineSpacing; int preserveSpaceWidth; bool overlay; double detectedFontScaling; }; class PDFPainter { public: virtual void setFontSize(double pointSize) = 0; virtual void drawText(double x, double y, const QString& text) = 0; virtual void drawImage(const QRect& bbox, const QImage& image, const PDFSettings& settings) = 0; virtual double getAverageCharWidth() const = 0; virtual double getTextWidth(const QString& text) const = 0; protected: #if QT_VERSION < QT_VERSION_CHECK(5, 0, 0) QVector createGray8Table() const { QVector colorTable(255); for(int i = 0; i < 255; ++i) { colorTable[i] = qRgb(i, i, i); } return colorTable; } #endif QImage convertedImage(const QImage& image, QImage::Format targetFormat, Qt::ImageConversionFlags flags) const { #if QT_VERSION < QT_VERSION_CHECK(5, 0, 0) if(image.format() == targetFormat) { return image; } else if(targetFormat == QImage::Format_Indexed8) { static QVector gray8Table = createGray8Table(); return image.convertToFormat(targetFormat, gray8Table); } else { return image.convertToFormat(targetFormat); } #else return image.format() == targetFormat ? image : image.convertToFormat(targetFormat, flags); #endif } }; class PoDoFoPDFPainter; class QPainterPDFPainter; int m_idCounter = 0; DisplayerToolHOCR* m_tool; QWidget* m_widget; UI_OutputEditorHOCR ui; HTMLHighlighter* m_highlighter; QtSpell::TextEditChecker m_spell; bool m_modified = false; QDialog* m_pdfExportDialog; Ui::PdfExportDialog m_pdfExportDialogUi; QFontDialog m_pdfFontDialog; QTreeWidgetItem* m_rootItem = nullptr; QTreeWidgetItem* m_currentItem = nullptr; QTreeWidgetItem* m_currentPageItem = nullptr; QDomDocument m_currentDocument; QDomElement m_currentElement; QGraphicsPixmapItem* m_preview = nullptr; void findReplace(bool backwards, bool replace); void addPage(QDomElement pageDiv, const QString& filename, int page, bool cleanGraphics); bool addChildItems(QDomElement element, QTreeWidgetItem* parentItem, QMap& langCache); QDomElement elementById(QDomElement element, const QString& id) const; void expandChildren(QTreeWidgetItem* item) const; void collapseChildren(QTreeWidgetItem* item) const; void printChildren(PDFPainter& painter, QTreeWidgetItem* item, const PDFSettings& pdfSettings, double imgScale = 1.) const; bool setCurrentSource(const QDomElement& pageElement, int* pageDpi = 0, int* overrideDpi = 0) const; void updateCurrentItemText(); void updateCurrentItemAttribute(const QString& key, const QString& subkey, const QString& newvalue, bool update=true); void updateCurrentItem(); void removeCurrentItem(); QString trimWord(const QString& word, QString* prefix = nullptr, QString* suffix = nullptr); void mergeItems(const QList& items); private slots: void addGraphicRegion(QRect rect); void addPage(const QString& hocrText, ReadSessionData data); void setFont(); void showItemProperties(QTreeWidgetItem* item); void itemChanged(QTreeWidgetItem* item, int col); void imageFormatChanged(); void imageCompressionChanged(); void propertyCellChanged(int row, int col); void showTreeWidgetContextMenu(const QPoint& point); void updateFontButton(const QFont& font); void updatePreview(); void updateCurrentItemBBox(QRect rect); }; #endif // OUTPUTEDITORHOCR_HH gImageReader-3.2.3/qt/src/OutputEditorText.cc000066400000000000000000000277721312567024200211120ustar00rootroot00000000000000/* -*- Mode: C++; indent-tabs-mode: t; c-basic-offset: 4; tab-width: 4 -*- */ /* * OutputEditorText.cc * Copyright (C) 2013-2017 Sandro Mani * * gImageReader 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. * * gImageReader 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 this program. If not, see . */ #include #include #include #include #include #include #include #include "OutputEditorText.hh" #include "Recognizer.hh" #include "SourceManager.hh" #include "SubstitutionsManager.hh" #include "Utils.hh" OutputEditorText::OutputEditorText() { m_insertMode = InsertMode::Append; m_widget = new QWidget; ui.setupUi(m_widget); m_substitutionsManager = new SubstitutionsManager(ui.plainTextEditOutput, ui.checkBoxOutputSearchMatchCase, m_widget); ui.actionOutputModeAppend->setData(static_cast(InsertMode::Append)); ui.actionOutputModeCursor->setData(static_cast(InsertMode::Cursor)); ui.actionOutputModeReplace->setData(static_cast(InsertMode::Replace)); ui.frameOutputSearch->setVisible(false); ui.actionOutputReplace->setShortcut(Qt::CTRL + Qt::Key_F); ui.actionOutputSave->setShortcut(Qt::CTRL + Qt::Key_S); m_spell.setDecodeLanguageCodes(true); m_spell.setShowCheckSpellingCheckbox(true); m_spell.setTextEdit(ui.plainTextEditOutput); m_spell.setUndoRedoEnabled(true); connect(ui.menuOutputMode, SIGNAL(triggered(QAction*)), this, SLOT(setInsertMode(QAction*))); connect(ui.toolButtonOutputPostproc, SIGNAL(clicked()), this, SLOT(filterBuffer())); connect(ui.actionOutputReplace, SIGNAL(toggled(bool)), ui.frameOutputSearch, SLOT(setVisible(bool))); connect(ui.actionOutputReplace, SIGNAL(toggled(bool)), ui.lineEditOutputSearch, SLOT(clear())); connect(ui.actionOutputReplace, SIGNAL(toggled(bool)), ui.lineEditOutputReplace, SLOT(clear())); connect(ui.actionOutputUndo, SIGNAL(triggered()), &m_spell, SLOT(undo())); connect(ui.actionOutputRedo, SIGNAL(triggered()), &m_spell, SLOT(redo())); connect(ui.actionOutputSave, SIGNAL(triggered()), this, SLOT(save())); connect(ui.actionOutputClear, SIGNAL(triggered()), this, SLOT(clear())); connect(&m_spell, SIGNAL(undoAvailable(bool)), ui.actionOutputUndo, SLOT(setEnabled(bool))); connect(&m_spell, SIGNAL(redoAvailable(bool)), ui.actionOutputRedo, SLOT(setEnabled(bool))); connect(ui.checkBoxOutputSearchMatchCase, SIGNAL(toggled(bool)), this, SLOT(clearErrorState())); connect(ui.lineEditOutputSearch, SIGNAL(textChanged(QString)), this, SLOT(clearErrorState())); connect(ui.lineEditOutputSearch, SIGNAL(returnPressed()), this, SLOT(findNext())); connect(ui.lineEditOutputReplace, SIGNAL(returnPressed()), this, SLOT(replaceNext())); connect(ui.toolButtonOutputFindNext, SIGNAL(clicked()), this, SLOT(findNext())); connect(ui.toolButtonOutputFindPrev, SIGNAL(clicked()), this, SLOT(findPrev())); connect(ui.toolButtonOutputReplace, SIGNAL(clicked()), this, SLOT(replaceNext())); connect(ui.toolButtonOutputReplaceAll, SIGNAL(clicked()), this, SLOT(replaceAll())); connect(MAIN->getConfig()->getSetting("customoutputfont"), SIGNAL(changed()), this, SLOT(setFont())); connect(MAIN->getConfig()->getSetting("systemoutputfont"), SIGNAL(changed()), this, SLOT(setFont())); connect(ui.pushButtonOutputReplacementList, SIGNAL(clicked()), m_substitutionsManager, SLOT(show())); connect(ui.pushButtonOutputReplacementList, SIGNAL(clicked()), m_substitutionsManager, SLOT(raise())); connect(ui.actionOutputPostprocDrawWhitespace, SIGNAL(toggled(bool)), ui.plainTextEditOutput, SLOT(setDrawWhitespace(bool))); MAIN->getConfig()->addSetting(new ActionSetting("keepdot", ui.actionOutputPostprocKeepEndMark, true)); MAIN->getConfig()->addSetting(new ActionSetting("keepquote", ui.actionOutputPostprocKeepQuote)); MAIN->getConfig()->addSetting(new ActionSetting("joinhyphen", ui.actionOutputPostprocJoinHyphen, true)); MAIN->getConfig()->addSetting(new ActionSetting("joinspace", ui.actionOutputPostprocCollapseSpaces, true)); MAIN->getConfig()->addSetting(new ActionSetting("keepparagraphs", ui.actionOutputPostprocKeepParagraphs, true)); MAIN->getConfig()->addSetting(new ActionSetting("drawwhitespace", ui.actionOutputPostprocDrawWhitespace)); MAIN->getConfig()->addSetting(new SwitchSetting("searchmatchcase", ui.checkBoxOutputSearchMatchCase)); setFont(); } OutputEditorText::~OutputEditorText() { delete m_widget; MAIN->getConfig()->removeSetting("keepdot"); MAIN->getConfig()->removeSetting("keepquote"); MAIN->getConfig()->removeSetting("joinhyphen"); MAIN->getConfig()->removeSetting("joinspace"); MAIN->getConfig()->removeSetting("keepparagraphs"); MAIN->getConfig()->removeSetting("drawwhitespace"); MAIN->getConfig()->removeSetting("searchmatchcase"); } void OutputEditorText::clearErrorState() { ui.lineEditOutputSearch->setStyleSheet(""); } void OutputEditorText::setFont() { if(MAIN->getConfig()->getSetting("systemoutputfont")->getValue()) { ui.plainTextEditOutput->setFont(QFont()); } else { ui.plainTextEditOutput->setFont(MAIN->getConfig()->getSetting("customoutputfont")->getValue()); } } void OutputEditorText::setInsertMode(QAction* action) { m_insertMode = static_cast(action->data().value()); ui.toolButtonOutputMode->setIcon(action->icon()); } void OutputEditorText::filterBuffer() { QTextCursor cursor = ui.plainTextEditOutput->regionBounds(); QString txt = cursor.selectedText(); Utils::busyTask([this,&txt] { // Always remove trailing whitespace txt.replace(QRegExp("\\s+$"), ""); if(ui.actionOutputPostprocJoinHyphen->isChecked()) { txt.replace(QRegExp("[-\u2014]\\s*\u2029\\s*"), ""); } QString preChars, sucChars; if(ui.actionOutputPostprocKeepParagraphs->isChecked()) { preChars += "\u2029"; // Keep if preceded by line break } if(ui.actionOutputPostprocKeepEndMark->isChecked()) { preChars += "\\.\\?!"; // Keep if preceded by end mark (.?!) } if(ui.actionOutputPostprocKeepQuote->isChecked()) { preChars += "'\"\u00BB\u00AB"; // Keep if preceded by quote sucChars += "'\"\u00AB\u00BB"; // Keep if succeeded by quote } if(ui.actionOutputPostprocKeepParagraphs->isChecked()) { sucChars += "\u2029"; // Keep if succeeded by line break } if(!preChars.isEmpty()) { preChars = "([^" + preChars + "])"; } if(!sucChars.isEmpty()) { sucChars = "(?![" + sucChars + "])"; } QString expr = preChars + "\u2029" + sucChars; txt.replace(QRegExp(expr), preChars.isEmpty() ? " " : "\\1 "); if(ui.actionOutputPostprocCollapseSpaces->isChecked()) { txt.replace(QRegExp("[ \t]+"), " "); } return true; }, _("Stripping line breaks...")); ui.plainTextEditOutput->setTextCursor(cursor); cursor.insertText(txt); cursor.setPosition(cursor.position() - txt.length(), QTextCursor::KeepAnchor); ui.plainTextEditOutput->setTextCursor(cursor); } void OutputEditorText::findNext() { findReplace(false, false); } void OutputEditorText::findPrev() { findReplace(true, false); } void OutputEditorText::replaceNext() { findReplace(false, true); } void OutputEditorText::replaceAll() { MAIN->pushState(MainWindow::State::Busy, _("Replacing...")); QString searchstr = ui.lineEditOutputSearch->text(); QString replacestr = ui.lineEditOutputReplace->text(); if(!ui.plainTextEditOutput->replaceAll(searchstr, replacestr, ui.checkBoxOutputSearchMatchCase->isChecked())) { ui.lineEditOutputSearch->setStyleSheet("background: #FF7777; color: #FFFFFF;"); } MAIN->popState(); } void OutputEditorText::findReplace(bool backwards, bool replace) { clearErrorState(); QString searchstr = ui.lineEditOutputSearch->text(); QString replacestr = ui.lineEditOutputReplace->text(); if(!ui.plainTextEditOutput->findReplace(backwards, replace, ui.checkBoxOutputSearchMatchCase->isChecked(), searchstr, replacestr)) { ui.lineEditOutputSearch->setStyleSheet("background: #FF7777; color: #FFFFFF;"); } } void OutputEditorText::read(tesseract::TessBaseAPI &tess, ReadSessionData *data) { char* textbuf = tess.GetUTF8Text(); QString text = QString::fromUtf8(textbuf); if(!text.endsWith('\n')) text.append('\n'); if(data->prependFile || data->prependPage) { QStringList prepend; if(data->prependFile) { prepend.append(_("File: %1").arg(data->file)); } if(data->prependPage) { prepend.append(_("Page: %1").arg(data->page)); } text.prepend(QString("[%1]\n").arg(prepend.join("; "))); } bool& insertText = static_cast(data)->insertText; QMetaObject::invokeMethod(this, "addText", Qt::QueuedConnection, Q_ARG(QString, text), Q_ARG(bool, insertText)); delete[] textbuf; insertText = true; } void OutputEditorText::readError(const QString &errorMsg, ReadSessionData *data) { bool& insertText = static_cast(data)->insertText; QMetaObject::invokeMethod(this, "addText", Qt::QueuedConnection, Q_ARG(QString, errorMsg), Q_ARG(bool, insertText)); insertText = true; } void OutputEditorText::addText(const QString& text, bool insert) { if(insert) { ui.plainTextEditOutput->textCursor().insertText(text); } else { QTextCursor cursor = ui.plainTextEditOutput->textCursor(); if(m_insertMode == InsertMode::Append) { cursor.movePosition(QTextCursor::End); } else if(m_insertMode == InsertMode::Cursor) { // pass } else if(m_insertMode == InsertMode::Replace) { cursor.movePosition(QTextCursor::Start); cursor.movePosition(QTextCursor::End, QTextCursor::KeepAnchor); } cursor.insertText(text); ui.plainTextEditOutput->setTextCursor(cursor); } MAIN->setOutputPaneVisible(true); } bool OutputEditorText::save(const QString& filename) { QString outname = filename; if(outname.isEmpty()) { QList sources = MAIN->getSourceManager()->getSelectedSources(); QString base = !sources.isEmpty() ? QFileInfo(sources.first()->displayname).baseName() : _("output"); outname = QDir(MAIN->getConfig()->getSetting>("outputdir")->getValue()).absoluteFilePath(base + ".txt"); outname = QFileDialog::getSaveFileName(MAIN, _("Save Output..."), outname, QString("%1 (*.txt)").arg(_("Text Files"))); if(outname.isEmpty()) { return false; } MAIN->getConfig()->getSetting>("outputdir")->setValue(QFileInfo(outname).absolutePath()); } QFile file(outname); if(!file.open(QIODevice::WriteOnly)) { QMessageBox::critical(MAIN, _("Failed to save output"), _("Check that you have writing permissions in the selected folder.")); return false; } file.write(MAIN->getConfig()->useUtf8() ? ui.plainTextEditOutput->toPlainText().toUtf8() : ui.plainTextEditOutput->toPlainText().toLocal8Bit()); ui.plainTextEditOutput->document()->setModified(false); return true; } bool OutputEditorText::clear(bool hide) { if(!m_widget->isVisible()) { return true; } if(getModified()) { int response = QMessageBox::question(MAIN, _("Output not saved"), _("Save output before proceeding?"), QMessageBox::Save, QMessageBox::Discard, QMessageBox::Cancel); if(response == QMessageBox::Save) { if(!save()) { return false; } } else if(response != QMessageBox::Discard) { return false; } } ui.plainTextEditOutput->clear(); m_spell.clearUndoRedo(); ui.plainTextEditOutput->document()->setModified(false); if(hide) MAIN->setOutputPaneVisible(false); return true; } bool OutputEditorText::getModified() const { return ui.plainTextEditOutput->document()->isModified(); } void OutputEditorText::onVisibilityChanged(bool /*visibile*/) { m_substitutionsManager->hide(); } void OutputEditorText::setLanguage(const Config::Lang& lang) { m_spell.setLanguage(lang.code.isEmpty() ? Utils::getSpellingLanguage() : lang.code); } gImageReader-3.2.3/qt/src/OutputEditorText.hh000066400000000000000000000044261312567024200211130ustar00rootroot00000000000000/* -*- Mode: C++; indent-tabs-mode: t; c-basic-offset: 4; tab-width: 4 -*- */ /* * OutputEditorText.hh * Copyright (C) 2013-2017 Sandro Mani * * gImageReader 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. * * gImageReader 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 this program. If not, see . */ #ifndef OUTPUTEDITORTEXT_HH #define OUTPUTEDITORTEXT_HH #include #include "Config.hh" #include "MainWindow.hh" #include "OutputEditor.hh" #include "Ui_OutputEditorText.hh" class SubstitutionsManager; class OutputEditorText : public OutputEditor { Q_OBJECT public: OutputEditorText(); ~OutputEditorText(); QWidget* getUI() override { return m_widget; } ReadSessionData* initRead(tesseract::TessBaseAPI &/*tess*/) override { return new TextReadSessionData; } void read(tesseract::TessBaseAPI& tess, ReadSessionData* data) override; void readError(const QString& errorMsg, ReadSessionData* data) override; bool getModified() const override; public slots: void onVisibilityChanged(bool visible) override; bool clear(bool hide = true) override; bool save(const QString& filename = "") override; void setLanguage(const Config::Lang &lang) override; private: struct TextReadSessionData : ReadSessionData { bool insertText = false; }; enum class InsertMode { Append, Cursor, Replace }; QWidget* m_widget; UI_OutputEditorText ui; InsertMode m_insertMode; QtSpell::TextEditChecker m_spell; SubstitutionsManager* m_substitutionsManager; void findReplace(bool backwards, bool replace); private slots: void addText(const QString& text, bool insert); void clearErrorState(); void filterBuffer(); void findNext(); void findPrev(); void replaceAll(); void replaceNext(); void setFont(); void setInsertMode(QAction* action); }; #endif // OUTPUTEDITORTEXT_HH gImageReader-3.2.3/qt/src/OutputTextEdit.cc000066400000000000000000000241411312567024200205340ustar00rootroot00000000000000/* -*- Mode: C++; indent-tabs-mode: t; c-basic-offset: 4; tab-width: 4 -*- */ /* * OutputTextEdit.cc * Copyright (C) 2013-2017 Sandro Mani * * gImageReader 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. * * gImageReader 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 this program. If not, see . */ #include "OutputTextEdit.hh" #include #include #include #include class OutputTextEdit::WhitespaceHighlighter : public QSyntaxHighlighter { public: WhitespaceHighlighter(QTextDocument* document) : QSyntaxHighlighter(document) {} private: void highlightBlock(const QString &text) { QTextCharFormat fmt; fmt.setForeground(Qt::gray); QRegExp expression("\\s"); int index = text.indexOf(expression); while (index >= 0) { int length = expression.matchedLength(); setFormat(index, length, fmt); index = text.indexOf(expression, index + length); } } }; OutputTextEdit::OutputTextEdit(QWidget *parent) : QPlainTextEdit(parent) { m_wsHighlighter = new WhitespaceHighlighter(document()); m_regionCursor = textCursor(); m_regionCursor.movePosition(QTextCursor::Start); m_regionCursor.movePosition(QTextCursor::End, QTextCursor::KeepAnchor); m_entireRegion = true; connect(this, SIGNAL(cursorPositionChanged()), this, SLOT(saveRegionBounds())); connect(this, SIGNAL(selectionChanged()), this, SLOT(saveRegionBounds())); // Force inactive selection to have same color as active selection QColor highlightColor = palette().color(QPalette::Highlight); QColor highlightedTextColor = palette().color(QPalette::HighlightedText); auto colorToString = [&](const QColor& color) { return QString("rgb(%1, %2, %3)").arg(color.red()).arg(color.green()).arg(color.blue()); }; setStyleSheet(QString("QPlainTextEdit { selection-background-color: %1; selection-color: %2; }") .arg(colorToString(highlightColor), colorToString(highlightedTextColor))); } OutputTextEdit::~OutputTextEdit() { delete m_wsHighlighter; } QTextCursor OutputTextEdit::regionBounds() const { QTextCursor c = m_regionCursor; if(c.anchor() > c.position()) { int pos = c.anchor(); int anchor = c.position(); c.setPosition(anchor); c.setPosition(pos, QTextCursor::KeepAnchor); } return c; } bool OutputTextEdit::findReplace(bool backwards, bool replace, bool matchCase, const QString &searchstr, const QString &replacestr) { clearFocus(); if(searchstr.isEmpty()) { return false; } QTextDocument::FindFlags flags = 0; Qt::CaseSensitivity cs = Qt::CaseInsensitive; if(backwards) { flags |= QTextDocument::FindBackward; } if(matchCase) { flags |= QTextDocument::FindCaseSensitively; cs = Qt::CaseSensitive; } QTextCursor regionCursor = regionBounds(); QTextCursor selCursor = textCursor(); if(selCursor.selectedText().compare(searchstr, cs) == 0) { if(replace) { selCursor.insertText(replacestr); selCursor.movePosition(QTextCursor::PreviousCharacter, QTextCursor::KeepAnchor, replacestr.length()); setTextCursor(selCursor); ensureCursorVisible(); return true; } if(backwards) { selCursor.setPosition(qMin(selCursor.position(), selCursor.anchor())); } else { selCursor.setPosition(qMax(selCursor.position(), selCursor.anchor())); } } QTextCursor findcursor = document()->find(searchstr, selCursor, flags); if(findcursor.isNull() || !(findcursor.anchor() >= regionCursor.anchor() && findcursor.position() <= regionCursor.position())) { if(backwards) { selCursor.setPosition(regionCursor.position()); } else { selCursor.setPosition(regionCursor.anchor()); } findcursor = document()->find(searchstr, selCursor, flags); if(findcursor.isNull() || !(findcursor.anchor() >= regionCursor.anchor() && findcursor.position() <= regionCursor.position())) { return false; } } setTextCursor(findcursor); ensureCursorVisible(); return true; } bool OutputTextEdit::replaceAll(const QString &searchstr, const QString &replacestr, bool matchCase) { QTextCursor cursor = regionBounds(); int end = cursor.position(); QString cursel = cursor.selectedText(); if(cursor.anchor() == cursor.position() || cursel == searchstr || cursel == replacestr) { cursor.movePosition(QTextCursor::Start); QTextCursor tmp(cursor); tmp.movePosition(QTextCursor::End); end = tmp.position(); } else { cursor.setPosition(qMin(cursor.anchor(), cursor.position())); } QTextDocument::FindFlags flags = 0; if(matchCase) { flags = QTextDocument::FindCaseSensitively; } int diff = replacestr.length() - searchstr.length(); int count = 0; while(true) { cursor = document()->find(searchstr, cursor, flags); if(cursor.isNull() || cursor.position() > end) { break; } cursor.insertText(replacestr); end += diff; ++count; QApplication::processEvents(QEventLoop::ExcludeUserInputEvents); } if(count == 0) { return false; } return true; } void OutputTextEdit::setDrawWhitespace(bool drawWhitespace) { m_drawWhitespace = drawWhitespace; QTextOption textOption = document()->defaultTextOption(); if(drawWhitespace) { textOption.setFlags(QTextOption::ShowTabsAndSpaces | QTextOption::AddSpaceForLineAndParagraphSeparators); } else { textOption.setFlags(0); } document()->setDefaultTextOption(textOption); } void OutputTextEdit::paintEvent(QPaintEvent *e) { QPointF offset = contentOffset(); if(!m_entireRegion) { QPainter painter(viewport()); painter.setBrush(palette().color(QPalette::Highlight).lighter(160)); painter.setPen(Qt::NoPen); QTextCursor regionCursor = regionBounds(); QTextCursor regionStart(document()); regionStart.setPosition(regionCursor.anchor()); QTextBlock startBlock = regionStart.block(); int startLinePos = regionStart.position() - startBlock.position(); QTextLine startLine = startBlock.layout()->lineForTextPosition(startLinePos); QTextCursor regionEnd(document()); regionEnd.setPosition(regionCursor.position()); QTextBlock endBlock = regionEnd.block(); int endLinePos = regionEnd.position() - endBlock.position(); QTextLine endLine = endBlock.layout()->lineForTextPosition(endLinePos); // Draw selection qreal top; QRectF rect; if(startBlock.blockNumber() == endBlock.blockNumber() && startLine.lineNumber() == endLine.lineNumber()) { top = blockBoundingGeometry(startBlock).translated(offset).top(); rect = startLine.naturalTextRect().translated(offset.x() - 0.5, top); rect.setLeft(startLine.cursorToX(startLinePos) - 0.5); rect.setRight(endLine.cursorToX(endLinePos)); painter.drawRect(rect); } else { // Draw selection on start line top = blockBoundingGeometry(startBlock).translated(offset).top(); rect = startLine.naturalTextRect().translated(offset.x() - 0.5, top); rect.setLeft(startLine.cursorToX(startLinePos) - 0.5); painter.drawRect(rect); // Draw selections inbetween QTextBlock block = startBlock; int lineNo = startLine.lineNumber() + 1; while(!(block.blockNumber() == endBlock.blockNumber() && lineNo == endLine.lineNumber())) { if(block.isValid() && lineNo < block.lineCount()) { painter.drawRect(block.layout()->lineAt(lineNo).naturalTextRect().translated(offset.x() - 0.5, top)); } ++lineNo; if(lineNo >= block.lineCount()) { block = block.next(); top = blockBoundingGeometry(block).translated(offset).top(); lineNo = 0; } } // Draw selection on end line top = blockBoundingGeometry(endBlock).translated(offset).top(); rect = endLine.naturalTextRect().translated(offset.x() - 0.5, top); rect.setRight(endLine.cursorToX(endLinePos)); painter.drawRect(rect); } } QPlainTextEdit::paintEvent(e); if(m_drawWhitespace) { QTextBlock block = firstVisibleBlock(); qreal top = blockBoundingGeometry(block).translated(offset).top(); qreal bottom = top + blockBoundingRect(block).height(); QPainter painter(viewport()); painter.setPen(Qt::gray); QChar visualArrow((ushort)0x21b5); QChar paragraph((ushort)0x00b6); // block.next().isValid(): don't draw line break on last block while(block.isValid() && block.next().isValid() && top <= e->rect().bottom()) { if(block.isVisible() && bottom >= e->rect().top()) { QTextLayout *layout = block.layout(); // Draw hard line breaks (i.e. those not due to word wrapping) QTextLine line = layout->lineAt(layout->lineCount() - 1); QRectF lineRect = line.naturalTextRect().translated(offset.x(), top); if(line.textLength() == 0) { painter.drawText(QPointF(lineRect.right(), lineRect.top() + line.ascent()), paragraph); } else { painter.drawText(QPointF(lineRect.right(), lineRect.top() + line.ascent()), visualArrow); } } block = block.next(); top = bottom; bottom = top + blockBoundingRect(block).height(); } } } void OutputTextEdit::saveRegionBounds() { QTextCursor c = textCursor(); if(hasFocus()) { bool dorepaint = m_regionCursor.hasSelection() && !((m_regionCursor.anchor() == c.anchor() && m_regionCursor.position() == c.position()) || (m_regionCursor.anchor() == c.position() && m_regionCursor.position() == c.anchor())); m_regionCursor = c; if(dorepaint) { viewport()->repaint(); } // If only one word is selected, don't treat it as a region if(!m_regionCursor.selectedText().contains(QRegExp("\\s"))) { m_regionCursor.clearSelection(); } } c.movePosition(QTextCursor::Start); c.movePosition(QTextCursor::End, QTextCursor::KeepAnchor); // If nothing is selected, set the region to the entire contents if(!m_regionCursor.hasSelection()) { m_regionCursor.setPosition(c.anchor()); m_regionCursor.setPosition(c.position(), QTextCursor::KeepAnchor); } m_entireRegion = (m_regionCursor.anchor() == c.anchor() && m_regionCursor.position() == c.position()); } gImageReader-3.2.3/qt/src/OutputTextEdit.hh000066400000000000000000000031431312567024200205450ustar00rootroot00000000000000/* -*- Mode: C++; indent-tabs-mode: t; c-basic-offset: 4; tab-width: 4 -*- */ /* * OutputTextEdit.hh * Copyright (C) 2013-2017 Sandro Mani * * gImageReader 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. * * gImageReader 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 this program. If not, see . */ #ifndef OUTPUTTEXTEDIT_HH #define OUTPUTTEXTEDIT_HH #include class OutputTextEdit : public QPlainTextEdit { Q_OBJECT public: explicit OutputTextEdit(QWidget *parent = 0); ~OutputTextEdit(); QTextCursor regionBounds() const; bool findReplace(bool backwards, bool replace, bool matchCase, const QString& searchstr, const QString& replacestr); bool replaceAll(const QString& searchstr, const QString& replacestr, bool matchCase); public slots: void setDrawWhitespace(bool drawWhitespace); protected: void paintEvent(QPaintEvent *e) override; private: class WhitespaceHighlighter; WhitespaceHighlighter* m_wsHighlighter = nullptr; bool m_drawWhitespace = false; QTextCursor m_regionCursor; bool m_entireRegion; private slots: void saveRegionBounds(); }; #endif // OUTPUTTEXTEDIT_HH gImageReader-3.2.3/qt/src/Recognizer.cc000066400000000000000000000514451312567024200176770ustar00rootroot00000000000000/* -*- Mode: C++; indent-tabs-mode: t; c-basic-offset: 4; tab-width: 4 -*- */ /* * Recognizer.hh * Copyright (C) 2013-2017 Sandro Mani * * gImageReader 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. * * gImageReader 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 this program. If not, see . */ #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #ifdef Q_OS_WIN #include #define pipe(fds) _pipe(fds, 5000, _O_BINARY) #endif #include "Displayer.hh" #include "MainWindow.hh" #include "OutputEditor.hh" #include "Recognizer.hh" #include "TessdataManager.hh" #include "Utils.hh" struct Recognizer::ProgressMonitor : public MainWindow::ProgressMonitor { ETEXT_DESC desc; bool canceled = false; int donePages = 0; int nPages; ProgressMonitor(int _nPages) { desc.progress = 0; desc.cancel = cancelCallback; desc.cancel_this = this; nPages = _nPages; } int getProgress() { return 100 * ((donePages + desc.progress / 100.) / nPages); } void cancel() { canceled = true; } static bool cancelCallback(void* instance, int /*words*/) { return reinterpret_cast(instance)->canceled; } }; Recognizer::Recognizer(const UI_MainWindow& _ui) : ui(_ui) { QAction* currentPageAction = new QAction(_("Current Page"), this); currentPageAction->setData(static_cast(PageSelection::Current)); QAction* multiplePagesAction = new QAction(_("Multiple Pages..."), this); multiplePagesAction->setData(static_cast(PageSelection::Multiple)); m_menuPages = new QMenu(ui.toolButtonRecognize); m_menuPages->addAction(currentPageAction); m_menuPages->addAction(multiplePagesAction); m_pagesDialog = new QDialog(MAIN); m_pagesDialogUi.setupUi(m_pagesDialog); ui.toolButtonRecognize->setText(QString("%1\n%2").arg(m_modeLabel).arg(m_langLabel)); ui.menuLanguages->installEventFilter(this); connect(ui.toolButtonRecognize, SIGNAL(clicked()), this, SLOT(recognizeButtonClicked())); connect(currentPageAction, SIGNAL(triggered()), this, SLOT(recognizeCurrentPage())); connect(multiplePagesAction, SIGNAL(triggered()), this, SLOT(recognizeMultiplePages())); connect(m_pagesDialogUi.lineEditPageRange, SIGNAL(textChanged(QString)), this, SLOT(clearLineEditPageRangeStyle())); MAIN->getConfig()->addSetting(new VarSetting("language", "eng:en_EN")); MAIN->getConfig()->addSetting(new ComboSetting("ocrregionstrategy", m_pagesDialogUi.comboBoxRecognitionArea, 0)); MAIN->getConfig()->addSetting(new SwitchSetting("ocraddsourcefilename", m_pagesDialogUi.checkBoxPrependFilename)); MAIN->getConfig()->addSetting(new SwitchSetting("ocraddsourcepage", m_pagesDialogUi.checkBoxPrependPage)); MAIN->getConfig()->addSetting(new VarSetting("psm", 6)); } QStringList Recognizer::getAvailableLanguages() const { tesseract::TessBaseAPI tess; initTesseract(tess); GenericVector availLanguages; tess.GetAvailableLanguagesAsVector(&availLanguages); QStringList result; for(int i = 0; i < availLanguages.size(); ++i) { result.append(availLanguages[i].string()); } return result; } static int g_pipe[2]; static jmp_buf g_restore_point; static void tessCrashHandler(int /*signal*/) { fflush(stderr); char buf[1025]; int bytesRead = 0; QString captured; do { if((bytesRead = read(g_pipe[0], buf, sizeof(buf)-1)) > 0) { buf[bytesRead] = 0; captured += buf; } } while(bytesRead == sizeof(buf)-1); tesseract::TessBaseAPI tess; QString errMsg = QString(_("Tesseract crashed with the following message:\n\n" "%1\n\n" "This typically happens for one of the following reasons:\n" "- Outdated traineddata files are used.\n" "- Auxiliary language data files are missing.\n" "- Corrupt language data files.\n\n" "Make sure your language data files are valid and compatible with tesseract %2.")).arg(captured).arg(tess.Version()); QMessageBox::critical(MAIN, _("Error"), errMsg); longjmp(g_restore_point, SIGSEGV); } bool Recognizer::initTesseract(tesseract::TessBaseAPI& tess, const char* language) const { QByteArray current = setlocale(LC_NUMERIC, NULL); setlocale(LC_NUMERIC, "C"); // unfortunately tesseract creates deliberate segfaults when an error occurs std::signal(SIGSEGV, tessCrashHandler); pipe(g_pipe); fflush(stderr); int oldstderr = dup(fileno(stderr)); dup2(g_pipe[1], fileno(stderr)); int ret = -1; int fault_code = setjmp(g_restore_point); if(fault_code == 0) { ret = tess.Init(nullptr, language); } else { ret = -1; } dup2(oldstderr, fileno(stderr)); std::signal(SIGSEGV, MainWindow::signalHandler); setlocale(LC_NUMERIC, current.constData()); close(g_pipe[0]); close(g_pipe[1]); return ret != -1; } void Recognizer::updateLanguagesMenu() { ui.menuLanguages->clear(); delete m_langMenuRadioGroup; m_langMenuRadioGroup = new QActionGroup(this); delete m_langMenuCheckGroup; m_langMenuCheckGroup = new QActionGroup(this); m_langMenuCheckGroup->setExclusive(false); delete m_psmCheckGroup; m_psmCheckGroup = new QActionGroup(this); connect(m_psmCheckGroup, SIGNAL(triggered(QAction*)), this, SLOT(psmSelected(QAction*))); m_menuMultilanguage = nullptr; m_curLang = Config::Lang(); QAction* curitem = nullptr; QAction* activeitem = nullptr; bool haveOsd = false; QStringList parts = MAIN->getConfig()->getSetting>("language")->getValue().split(":"); Config::Lang curlang = {parts.empty() ? "eng" : parts[0], parts.size() < 2 ? "" : parts[1], parts.size() < 3 ? "" : parts[2]}; QList dicts = QtSpell::Checker::getLanguageList(); QStringList availLanguages = getAvailableLanguages(); if(availLanguages.empty()) { QMessageBox::warning(MAIN, _("No languages available"), _("No tesseract languages are available for use. Recognition will not work.")); m_langLabel = ""; ui.toolButtonRecognize->setText(QString("%1\n%2").arg(m_modeLabel).arg(m_langLabel)); } // Add menu items for languages, with spelling submenu if available for(const QString& langprefix : availLanguages) { if(langprefix == "osd") { haveOsd = true; continue; } Config::Lang lang = {langprefix, QString(), QString()}; if(!MAIN->getConfig()->searchLangSpec(lang)) { lang.name = lang.prefix; } QList spelldicts; if(!lang.code.isEmpty()) { for(const QString& dict : dicts) { if(dict.left(2) == lang.code.left(2)) { spelldicts.append(dict); } } qSort(spelldicts); } if(!spelldicts.empty()) { QAction* item = new QAction(lang.name, ui.menuLanguages); QMenu* submenu = new QMenu(); for(const QString& dict : spelldicts) { Config::Lang itemlang = {lang.prefix, dict, lang.name}; curitem = new QAction(QtSpell::Checker::decodeLanguageCode(dict), m_langMenuRadioGroup); curitem->setCheckable(true); curitem->setData(QVariant::fromValue(itemlang)); connect(curitem, SIGNAL(triggered()), this, SLOT(setLanguage())); if(curlang.prefix == lang.prefix && ( curlang.code == dict || (!activeitem && (curlang.code == dict.left(2) || curlang.code.isEmpty())))) { curlang = itemlang; activeitem = curitem; } submenu->addAction(curitem); } item->setMenu(submenu); ui.menuLanguages->addAction(item); } else { curitem = new QAction(lang.name, m_langMenuRadioGroup); curitem->setCheckable(true); curitem->setData(QVariant::fromValue(lang)); connect(curitem, SIGNAL(triggered()), this, SLOT(setLanguage())); if(curlang.prefix == lang.prefix) { curlang = lang; activeitem = curitem; } ui.menuLanguages->addAction(curitem); } } // Add multilanguage menu bool isMultilingual = false; if(!availLanguages.isEmpty()) { ui.menuLanguages->addSeparator(); m_multilingualAction = new QAction(_("Multilingual"), m_langMenuRadioGroup); m_multilingualAction->setCheckable(true); m_menuMultilanguage = new QMenu(); isMultilingual = curlang.prefix.contains('+'); QStringList sellangs = curlang.prefix.split('+', QString::SkipEmptyParts); for(const QString& langprefix : availLanguages) { if(langprefix == "osd") { continue; } Config::Lang lang = {langprefix, "", ""}; if(!MAIN->getConfig()->searchLangSpec(lang)) { lang.name = lang.prefix; } QAction* item = new QAction(lang.name, m_langMenuCheckGroup); item->setCheckable(true); item->setData(QVariant::fromValue(lang.prefix)); item->setChecked(isMultilingual && sellangs.contains(lang.prefix)); connect(item, SIGNAL(triggered()), this, SLOT(setMultiLanguage())); m_menuMultilanguage->addAction(item); } m_menuMultilanguage->installEventFilter(this); m_multilingualAction->setMenu(m_menuMultilanguage); ui.menuLanguages->addAction(m_multilingualAction); } if(isMultilingual) { activeitem = m_multilingualAction; setMultiLanguage(); } else if(activeitem == nullptr) { activeitem = curitem; } if(activeitem) activeitem->trigger(); // Add PSM items ui.menuLanguages->addSeparator(); QMenu* psmMenu = new QMenu(); int activePsm = MAIN->getConfig()->getSetting>("psm")->getValue(); struct PsmEntry { QString label; tesseract::PageSegMode psmMode; bool requireOsd; }; QVector psmModes = { PsmEntry{_("Automatic page segmentation"), tesseract::PSM_AUTO, false}, PsmEntry{_("Page segmentation with orientation and script detection"), tesseract::PSM_AUTO_OSD, true}, PsmEntry{_("Assume single column of text"), tesseract::PSM_SINGLE_COLUMN, false}, PsmEntry{_("Assume single block of vertically aligned text"), tesseract::PSM_SINGLE_BLOCK_VERT_TEXT, false}, PsmEntry{_("Assume a single uniform block of text"), tesseract::PSM_SINGLE_BLOCK, false}, PsmEntry{_("Assume a line of text"), tesseract::PSM_SINGLE_LINE, false}, PsmEntry{_("Assume a single word"), tesseract::PSM_SINGLE_WORD, false}, PsmEntry{_("Assume a single word in a circle"), tesseract::PSM_CIRCLE_WORD, false}, PsmEntry{_("Sparse text in no particular order"), tesseract::PSM_SPARSE_TEXT, false}, PsmEntry{_("Sparse text with orientation and script detection"), tesseract::PSM_SPARSE_TEXT_OSD, true}}; for(const auto& entry : psmModes) { QAction* item = psmMenu->addAction(entry.label); item->setData(entry.psmMode); item->setEnabled(!entry.requireOsd || haveOsd); item->setCheckable(true); item->setChecked(activePsm == entry.psmMode); m_psmCheckGroup->addAction(item); } QAction* psmAction = new QAction(_("Page segmentation mode"), ui.menuLanguages); psmAction->setMenu(psmMenu); ui.menuLanguages->addAction(psmAction); // Add installer item ui.menuLanguages->addSeparator(); ui.menuLanguages->addAction(_("Manage languages..."), this, SLOT(manageInstalledLanguages())); } void Recognizer::setLanguage() { QAction* item = qobject_cast(QObject::sender()); if(item->isChecked()) { Config::Lang lang = item->data().value(); if(!lang.code.isEmpty()) { m_langLabel = QString("%1 (%2)").arg(lang.name, lang.code); } else { m_langLabel = QString("%1").arg(lang.name); } ui.toolButtonRecognize->setText(QString("%1\n%2").arg(m_modeLabel).arg(m_langLabel)); m_curLang = lang; MAIN->getConfig()->getSetting>("language")->setValue(lang.prefix + ":" + lang.code); emit languageChanged(m_curLang); } } void Recognizer::setMultiLanguage() { m_multilingualAction->setChecked(true); QString langs; for(QAction* action : m_langMenuCheckGroup->actions()) { if(action->isChecked()) { langs += action->data().toString() + "+"; } } if(langs.isEmpty()) { langs = "eng+"; } langs = langs.left(langs.length() - 1); m_langLabel = langs; ui.toolButtonRecognize->setText(QString("%1\n%2").arg(m_modeLabel).arg(m_langLabel)); m_curLang = {langs, "", "Multilingual"}; MAIN->getConfig()->getSetting>("language")->setValue(langs + ":"); emit languageChanged(m_curLang); } void Recognizer::setRecognizeMode(const QString &mode) { m_modeLabel = mode; ui.toolButtonRecognize->setText(QString("%1\n%2").arg(m_modeLabel).arg(m_langLabel)); } void Recognizer::clearLineEditPageRangeStyle() { qobject_cast(QObject::sender())->setStyleSheet(""); } void Recognizer::psmSelected(QAction *action) { MAIN->getConfig()->getSetting>("psm")->setValue(action->data().toInt()); } QList Recognizer::selectPages(bool& autodetectLayout) { int nPages = MAIN->getDisplayer()->getNPages(); m_pagesDialogUi.lineEditPageRange->setText(QString("1-%1").arg(nPages)); m_pagesDialogUi.lineEditPageRange->setFocus(); m_pagesDialogUi.labelRecognitionArea->setVisible(MAIN->getDisplayer()->allowAutodetectOCRAreas()); m_pagesDialogUi.comboBoxRecognitionArea->setVisible(MAIN->getDisplayer()->allowAutodetectOCRAreas()); m_pagesDialogUi.groupBoxPrepend->setVisible(MAIN->getDisplayer()->allowAutodetectOCRAreas()); m_pagesDialogUi.comboBoxRecognitionArea->setItemText(0, MAIN->getDisplayer()->hasMultipleOCRAreas() ? _("Current selection") : _("Entire page")); QList pages; if(m_pagesDialog->exec() == QDialog::Accepted) { QString text = m_pagesDialogUi.lineEditPageRange->text(); text.replace(QRegExp("\\s+"), ""); for(const QString& block : text.split(',', QString::SkipEmptyParts)) { QStringList ranges = block.split('-', QString::SkipEmptyParts); if(ranges.size() == 1) { int page = ranges[0].toInt(); if(page > 0 && page <= nPages) { pages.append(page); } } else if(ranges.size() == 2) { int start = qMax(1, ranges[0].toInt()); int end = qMin(nPages, ranges[1].toInt()); for(int page = start; page <= end; ++page) { pages.append(page); } } else { pages.clear(); break; } } if(pages.empty()) { m_pagesDialogUi.lineEditPageRange->setStyleSheet("background: #FF7777; color: #FFFFFF;"); } } qSort(pages); autodetectLayout = m_pagesDialogUi.comboBoxRecognitionArea->isVisible() ? m_pagesDialogUi.comboBoxRecognitionArea->currentIndex() == 1 : false; return pages; } void Recognizer::recognizeButtonClicked() { int nPages = MAIN->getDisplayer()->getNPages(); if(nPages == 1) { recognize({MAIN->getDisplayer()->getCurrentPage()}); } else { ui.toolButtonRecognize->setCheckable(true); ui.toolButtonRecognize->setChecked(true); m_menuPages->popup(ui.toolButtonRecognize->mapToGlobal(QPoint(0, ui.toolButtonRecognize->height()))); ui.toolButtonRecognize->setChecked(false); ui.toolButtonRecognize->setCheckable(false); } } void Recognizer::recognizeCurrentPage() { recognize({MAIN->getDisplayer()->getCurrentPage()}); } void Recognizer::recognizeMultiplePages() { bool autodetectLayout = false; QList pages = selectPages(autodetectLayout); recognize(pages, autodetectLayout); } void Recognizer::recognize(const QList &pages, bool autodetectLayout) { tesseract::TessBaseAPI tess; bool prependFile = pages.size() > 1 && MAIN->getConfig()->getSetting("ocraddsourcefilename")->getValue(); bool prependPage = pages.size() > 1 && MAIN->getConfig()->getSetting("ocraddsourcepage")->getValue(); if(initTesseract(tess, m_curLang.prefix.toLocal8Bit().constData())) { QString failed; tess.SetPageSegMode(static_cast(m_psmCheckGroup->checkedAction()->data().toInt())); OutputEditor::ReadSessionData* readSessionData = MAIN->getOutputEditor()->initRead(tess); ProgressMonitor monitor(pages.size()); MAIN->showProgress(&monitor); Utils::busyTask([&] { int npages = pages.size(); int idx = 0; QString prevFile; for(int page : pages) { monitor.desc.progress = 0; ++idx; QMetaObject::invokeMethod(MAIN, "pushState", Qt::QueuedConnection, Q_ARG(MainWindow::State, MainWindow::State::Busy), Q_ARG(QString, _("Recognizing page %1 (%2 of %3)").arg(page).arg(idx).arg(npages))); bool success = false; QMetaObject::invokeMethod(this, "setPage", Qt::BlockingQueuedConnection, Q_RETURN_ARG(bool, success), Q_ARG(int, page), Q_ARG(bool, autodetectLayout)); if(!success) { failed.append(_("\n- Page %1: failed to render page").arg(page)); MAIN->getOutputEditor()->readError(_("\n[Failed to recognize page %1]\n"), readSessionData); continue; } readSessionData->file = MAIN->getDisplayer()->getCurrentImage(readSessionData->page); readSessionData->angle = MAIN->getDisplayer()->getCurrentAngle(); readSessionData->resolution = MAIN->getDisplayer()->getCurrentResolution(); bool firstChunk = true; bool newFile = readSessionData->file != prevFile; prevFile = readSessionData->file; for(const QImage& image : MAIN->getDisplayer()->getOCRAreas()) { readSessionData->prependPage = prependPage && firstChunk; readSessionData->prependFile = prependFile && (readSessionData->prependPage || newFile); firstChunk = false; newFile = false; tess.SetImage(image.bits(), image.width(), image.height(), 4, image.bytesPerLine()); tess.SetSourceResolution(MAIN->getDisplayer()->getCurrentResolution()); tess.Recognize(&monitor.desc); if(!monitor.canceled) { MAIN->getOutputEditor()->read(tess, readSessionData); } } QMetaObject::invokeMethod(MAIN, "popState", Qt::QueuedConnection); ++monitor.donePages; if(monitor.canceled) { break; } } return true; }, _("Recognizing...")); MAIN->hideProgress(); MAIN->getOutputEditor()->finalizeRead(readSessionData); if(!failed.isEmpty()) { QMessageBox::critical(MAIN, _("Recognition errors occurred"), _("The following errors occurred:%1").arg(failed)); } } } bool Recognizer::recognizeImage(const QImage& image, OutputDestination dest) { tesseract::TessBaseAPI tess; if(!initTesseract(tess, m_curLang.prefix.toLocal8Bit().constData())) { QMessageBox::critical(MAIN, _("Recognition errors occurred"), _("Failed to initialize tesseract")); return false; } tess.SetImage(image.bits(), image.width(), image.height(), 4, image.bytesPerLine()); ProgressMonitor monitor(1); MAIN->showProgress(&monitor); if(dest == OutputDestination::Buffer) { OutputEditor::ReadSessionData* readSessionData = MAIN->getOutputEditor()->initRead(tess); readSessionData->file = MAIN->getDisplayer()->getCurrentImage(readSessionData->page); readSessionData->angle = MAIN->getDisplayer()->getCurrentAngle(); readSessionData->resolution = MAIN->getDisplayer()->getCurrentResolution(); Utils::busyTask([&] { tess.Recognize(&monitor.desc); if(!monitor.canceled) { MAIN->getOutputEditor()->read(tess, readSessionData); } return true; }, _("Recognizing...")); MAIN->getOutputEditor()->finalizeRead(readSessionData); } else if(dest == OutputDestination::Clipboard) { QString output; if(Utils::busyTask([&] { tess.Recognize(&monitor.desc); if(!monitor.canceled) { char* text = tess.GetUTF8Text(); output = QString::fromUtf8(text); delete[] text; return true; } return false; }, _("Recognizing..."))) { QApplication::clipboard()->setText(output); } } MAIN->hideProgress(); return true; } bool Recognizer::setPage(int page, bool autodetectLayout) { bool success = true; if(page != MAIN->getDisplayer()->getCurrentPage()) { success = MAIN->getDisplayer()->setCurrentPage(page); } if(success && autodetectLayout) { MAIN->getDisplayer()->autodetectOCRAreas(); } return success; } bool Recognizer::eventFilter(QObject* obj, QEvent* ev) { if(obj == ui.menuLanguages && ev->type() == QEvent::MouseButtonPress) { QMouseEvent* mouseEvent = static_cast(ev); QAction* actionAtPos = ui.menuLanguages->actionAt(mouseEvent->pos()); if(actionAtPos && actionAtPos == m_multilingualAction) { m_multilingualAction->toggle(); if(m_multilingualAction->isChecked()) { setMultiLanguage(); } return true; } } else if(obj == m_menuMultilanguage && (ev->type() == QEvent::MouseButtonPress || ev->type() == QEvent::MouseButtonRelease)) { QMouseEvent* mouseEvent = static_cast(ev); QAction* action = m_menuMultilanguage->actionAt(mouseEvent->pos()); if(action) { if(ev->type() == QEvent::MouseButtonRelease) { action->trigger(); } return true; } } return QObject::eventFilter(obj, ev); } void Recognizer::manageInstalledLanguages() { TessdataManager manager(MAIN); if(manager.setup()) { manager.exec(); } } gImageReader-3.2.3/qt/src/Recognizer.hh000066400000000000000000000051471312567024200177070ustar00rootroot00000000000000/* -*- Mode: C++; indent-tabs-mode: t; c-basic-offset: 4; tab-width: 4 -*- */ /* * Recognizer.hh * Copyright (C) 2013-2017 Sandro Mani * * gImageReader 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. * * gImageReader 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 this program. If not, see . */ #ifndef RECOGNIZER_HPP #define RECOGNIZER_HPP #include #include "Config.hh" #include "Displayer.hh" #include "ui_PageRangeDialog.h" namespace tesseract { class TessBaseAPI; } class UI_MainWindow; class Recognizer : public QObject { Q_OBJECT public: enum class OutputDestination { Buffer, Clipboard }; Recognizer(const UI_MainWindow& _ui); QStringList getAvailableLanguages() const; const Config::Lang& getSelectedLanguage() const { return m_curLang; } public slots: bool recognizeImage(const QImage& image, OutputDestination dest); void setRecognizeMode(const QString& mode); void updateLanguagesMenu(); signals: void languageChanged(const Config::Lang& lang); private: struct ProgressMonitor; enum class PageSelection { Prompt, Current, Multiple }; enum class PageArea { EntirePage, Autodetect }; const UI_MainWindow& ui; QMenu* m_menuPages = nullptr; QMenu* m_menuMultilanguage = nullptr; QDialog* m_pagesDialog; Ui::PageRangeDialog m_pagesDialogUi; QActionGroup* m_langMenuRadioGroup = nullptr; QActionGroup* m_langMenuCheckGroup = nullptr; QActionGroup* m_psmCheckGroup = nullptr; QAction* m_multilingualAction = nullptr; QString m_modeLabel; QString m_langLabel; Config::Lang m_curLang; bool initTesseract(tesseract::TessBaseAPI& tess, const char* language = nullptr) const; QList selectPages(bool& autodetectLayout); void recognize(const QList& pages, bool autodetectLayout = false); bool eventFilter(QObject *obj, QEvent *ev) override; private slots: void clearLineEditPageRangeStyle(); void psmSelected(QAction* action); void recognizeButtonClicked(); void recognizeCurrentPage(); void recognizeMultiplePages(); void setLanguage(); void setMultiLanguage(); bool setPage(int page, bool autodetectLayout); void manageInstalledLanguages(); }; #endif // RECOGNIZER_HPP gImageReader-3.2.3/qt/src/Scanner.cc000066400000000000000000000015721312567024200171550ustar00rootroot00000000000000/* -*- Mode: C++; indent-tabs-mode: t; c-basic-offset: 4; tab-width: 4 -*- */ /* * Scanner.cc * Copyright (C) 2013-2017 Sandro Mani * * gImageReader 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. * * gImageReader 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 this program. If not, see . */ #include "Scanner.hh" // Empty file to have automoc run moc on Scanner.hh...gImageReader-3.2.3/qt/src/Scanner.hh000066400000000000000000000034751312567024200171730ustar00rootroot00000000000000/* -*- Mode: C++; indent-tabs-mode: t; c-basic-offset: 4; tab-width: 4 -*- */ /* * Scanner.hh * Copyright (C) 2013-2017 Sandro Mani * * gImageReader 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. * * gImageReader 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 this program. If not, see . */ #ifndef SCANNER_HH #define SCANNER_HH #include "common.hh" #include #include class Scanner : public QObject { Q_OBJECT public: enum class State { IDLE = 0, OPEN, SET_OPTIONS, START, GET_PARAMETERS, READ }; enum class ScanMode { DEFAULT = 0, COLOR, GRAY, LINEART }; enum class ScanType { SINGLE = 0, ADF_FRONT, ADF_BACK, ADF_BOTH }; struct Device { QString name; QString label; }; struct Params { QString device; QString filename; double dpi; ScanMode scan_mode; int depth; ScanType type; int page_width; int page_height; }; virtual ~Scanner() {} virtual void init() = 0; virtual void redetect() = 0; virtual void scan(const Params& params) = 0; virtual void cancel() = 0; virtual void close() = 0; signals: void initFailed(); void devicesDetected(QList devices); void scanFailed(const QString& message); void scanStateChanged(Scanner::State state); void pageAvailable(const QString& filename); }; Q_DECLARE_METATYPE(Scanner::State) #endif // SCANNER_HH gImageReader-3.2.3/qt/src/SourceManager.cc000066400000000000000000000247431312567024200203240ustar00rootroot00000000000000/* -*- Mode: C++; indent-tabs-mode: t; c-basic-offset: 4; tab-width: 4 -*- */ /* * SourceManager.cc * Copyright (C) 2013-2017 Sandro Mani * * gImageReader 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. * * gImageReader 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 this program. If not, see . */ #include #include #include #include #include #include #include #include #include #include #include "Config.hh" #include "MainWindow.hh" #include "SourceManager.hh" #include "Utils.hh" Q_DECLARE_METATYPE(Source*) // Only to silence "QVariant::save: unable to save type 'Source*'" warning QDataStream& operator<<(QDataStream& ds, const Source*&) { return ds; } QDataStream& operator>>(QDataStream& ds, Source*&) { return ds; } SourceManager::SourceManager(const UI_MainWindow& _ui) : ui(_ui) { m_recentMenu = new QMenu(MAIN); ui.actionSourceRecent->setMenu(m_recentMenu); ui.listWidgetSources->setAcceptDrops(true); ui.listWidgetSources->installEventFilter(this); connect(ui.actionSources, SIGNAL(toggled(bool)), ui.dockWidgetSources, SLOT(setVisible(bool))); connect(ui.toolButtonSourceAdd, SIGNAL(clicked()), this, SLOT(openSources())); connect(ui.menuAddSource, SIGNAL(aboutToShow()), this, SLOT(prepareSourcesMenu())); connect(ui.actionSourcePaste, SIGNAL(triggered()), this, SLOT(pasteClipboard())); connect(ui.actionSourceScreenshot, SIGNAL(triggered()), this, SLOT(takeScreenshot())); connect(ui.actionSourceRemove, SIGNAL(triggered()), this, SLOT(removeSource())); connect(ui.actionSourceDelete, SIGNAL(triggered()), this, SLOT(deleteSource())); connect(ui.actionSourceClear, SIGNAL(triggered()), this, SLOT(clearSources())); connect(ui.listWidgetSources, SIGNAL(itemSelectionChanged()), this, SLOT(currentSourceChanged())); connect(&m_fsWatcher, SIGNAL(fileChanged(QString)), this, SLOT(fileChanged(QString))); MAIN->getConfig()->addSetting(new VarSetting("recentitems")); qRegisterMetaType("Source*"); qRegisterMetaTypeStreamOperators("Source*"); } SourceManager::~SourceManager() { clearSources(); } void SourceManager::addSources(const QStringList& files) { QString failed; QListWidgetItem* item = nullptr; QStringList recentItems = MAIN->getConfig()->getSetting>("recentitems")->getValue(); for(const QString& filename : files) { if(!QFile(filename).exists()) { failed += "\n\t" + filename; continue; } bool contains = false; for(int row = 0, nRows = ui.listWidgetSources->count(); row < nRows; ++row) { if(ui.listWidgetSources->item(row)->toolTip() == filename) { item = ui.listWidgetSources->item(row); contains = true; break; } } if(contains) { continue; } item = new QListWidgetItem(QFileInfo(filename).fileName(), ui.listWidgetSources); item->setToolTip(filename); Source* source = new Source(filename, QFileInfo(filename).fileName()); item->setData(Qt::UserRole, QVariant::fromValue(source)); m_fsWatcher.addPath(filename); recentItems.removeAll(filename); recentItems.prepend(filename); } MAIN->getConfig()->getSetting>("recentitems")->setValue(recentItems); if(item) { ui.listWidgetSources->blockSignals(true); ui.listWidgetSources->clearSelection(); ui.listWidgetSources->blockSignals(false); ui.listWidgetSources->setCurrentItem(item); } if(!failed.isEmpty()) { QMessageBox::critical(MAIN, _("Unable to open files"), _("The following files could not be opened:%1").arg(failed)); } } QList SourceManager::getSelectedSources() const { QList selectedSources; for(const QListWidgetItem* item : ui.listWidgetSources->selectedItems()) { selectedSources.append(item->data(Qt::UserRole).value()); } return selectedSources; } void SourceManager::prepareSourcesMenu() { // Build recent menu m_recentMenu->clear(); for(const QString& filename : MAIN->getConfig()->getSetting>("recentitems")->getValue()) { if(QFile(filename).exists()) { QAction* action = new QAction(QFileInfo(filename).fileName(), m_recentMenu); action->setToolTip(filename); connect(action, SIGNAL(triggered()), this, SLOT(openRecentItem())); m_recentMenu->addAction(action); } } ui.actionSourceRecent->setEnabled(!m_recentMenu->isEmpty()); // Set paste action sensitivity ui.actionSourcePaste->setEnabled(!QApplication::clipboard()->pixmap().isNull()); } void SourceManager::openSources() { QList current = getSelectedSources(); QString dir; if(!current.isEmpty() && !current.front()->isTemp) { dir = QFileInfo(current.front()->path).absolutePath(); } else { dir = Utils::documentsFolder(); } QSet formats; for(const QByteArray& format : QImageReader::supportedImageFormats()) { formats.insert(QString("*.%1").arg(QString(format).toLower())); } formats.insert("*.pdf"); QString filter = QString("%1 (%2)").arg(_("Images and PDFs")).arg(QStringList(formats.toList()).join(" ")); addSources(QFileDialog::getOpenFileNames(MAIN, _("Select Files"), dir, filter)); } void SourceManager::openRecentItem() { const QString& filename = qobject_cast(QObject::sender())->toolTip(); addSources(QStringList() << filename); } void SourceManager::pasteClipboard() { QPixmap pixmap = QApplication::clipboard()->pixmap(); if(pixmap.isNull()) { QMessageBox::critical(MAIN, _("Clipboard Error"), _("Failed to read the clipboard.")); return; } ++m_pasteCount; QString displayname = _("Pasted %1").arg(m_pasteCount); savePixmap(pixmap, displayname); } void SourceManager::addSourceImage(const QImage& image) { ++m_pasteCount; QString displayname = _("Pasted %1").arg(m_pasteCount); savePixmap(QPixmap::fromImage(image), displayname); } void SourceManager::takeScreenshot() { QPixmap pixmap = QPixmap::grabWindow(QApplication::desktop()->winId()); if(pixmap.isNull()) { QMessageBox::critical(MAIN, _("Screenshot Error"), _("Failed to take screenshot.")); return; } ++m_screenshotCount; QString displayname = _("Screenshot %1").arg(m_screenshotCount); savePixmap(pixmap, displayname); } void SourceManager::savePixmap(const QPixmap& pixmap, const QString& displayname) { MAIN->pushState(MainWindow::State::Busy, _("Saving image...")); QString filename; bool success = true; QTemporaryFile tmpfile(QDir::temp().absoluteFilePath("gimagereader_XXXXXX.png")); if(!tmpfile.open()) { success = false; } else { tmpfile.setAutoRemove(false); filename = tmpfile.fileName(); success = pixmap.save(filename); } MAIN->popState(); if(!success) { QMessageBox::critical(MAIN, _("Cannot Write File"), _("Could not write to %1.").arg(filename)); } else { QListWidgetItem* item = new QListWidgetItem(displayname, ui.listWidgetSources); item->setToolTip(filename); Source* source = new Source(filename, displayname, true); item->setData(Qt::UserRole, QVariant::fromValue(source)); m_fsWatcher.addPath(filename); ui.listWidgetSources->blockSignals(true); ui.listWidgetSources->clearSelection(); ui.listWidgetSources->blockSignals(false); ui.listWidgetSources->setCurrentItem(item); } } void SourceManager::removeSource(bool deleteFile) { QString paths; for(const QListWidgetItem* item : ui.listWidgetSources->selectedItems()) { paths += QString("\n") + item->data(Qt::UserRole).value()->path; } if(paths.isEmpty()) { return; } if(deleteFile && QMessageBox::Yes != QMessageBox::question(MAIN, _("Delete File?"), _("The following files will be deleted:%1").arg(paths), QMessageBox::Yes, QMessageBox::No)) { return; } // Avoid multiple sourceChanged emissions when removing items ui.listWidgetSources->blockSignals(true); for(const QListWidgetItem* item : ui.listWidgetSources->selectedItems()) { Source* source = item->data(Qt::UserRole).value(); m_fsWatcher.removePath(source->path); if(deleteFile || source->isTemp) { QFile(source->path).remove(); } delete source; delete item; } if(ui.listWidgetSources->selectedItems().isEmpty()) { ui.listWidgetSources->selectionModel()->select(ui.listWidgetSources->currentIndex(), QItemSelectionModel::Select); } ui.listWidgetSources->blockSignals(false); emit sourceChanged(); } void SourceManager::clearSources() { if(!m_fsWatcher.files().isEmpty()) { m_fsWatcher.removePaths(m_fsWatcher.files()); } for(int row = 0, nRows = ui.listWidgetSources->count(); row < nRows; ++row) { Source* source = ui.listWidgetSources->item(row)->data(Qt::UserRole).value(); if(source->isTemp) { QFile(source->path).remove(); } delete source; ui.listWidgetSources->item(row)->setData(Qt::UserRole, QVariant::fromValue((Source*)nullptr)); } ui.listWidgetSources->clear(); } void SourceManager::currentSourceChanged() { bool enabled = !ui.listWidgetSources->selectedItems().isEmpty(); ui.actionSourceRemove->setEnabled(enabled); ui.actionSourceDelete->setEnabled(enabled); ui.actionSourceClear->setEnabled(enabled); emit sourceChanged(); } void SourceManager::fileChanged(const QString& filename) { if(!QFile(filename).exists()) { for(int row = 0, nRows = ui.listWidgetSources->count(); row < nRows; ++row) { QListWidgetItem* item = ui.listWidgetSources->item(row); Source* source = item->data(Qt::UserRole).value(); if(source->path == filename) { QMessageBox::warning(MAIN, _("Missing File"), _("The following file has been deleted or moved:\n%1").arg(filename)); delete item; delete source; m_fsWatcher.removePath(filename); break; } } } } bool SourceManager::eventFilter(QObject *object, QEvent *event) { if(event->type() == QEvent::DragEnter) { QDragEnterEvent* dragEnterEvent = static_cast(event); if(Utils::handleSourceDragEvent(dragEnterEvent->mimeData())) { dragEnterEvent->acceptProposedAction(); } return true; } else if(event->type() == QEvent::Drop) { QDropEvent* dropEvent = static_cast(event); Utils::handleSourceDropEvent(dropEvent->mimeData()); return true; } return QObject::eventFilter(object, event); } gImageReader-3.2.3/qt/src/SourceManager.hh000066400000000000000000000044751312567024200203360ustar00rootroot00000000000000/* -*- Mode: C++; indent-tabs-mode: t; c-basic-offset: 4; tab-width: 4 -*- */ /* * SourceManager.hh * Copyright (C) 2013-2017 Sandro Mani * * gImageReader 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. * * gImageReader 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 this program. If not, see . */ #ifndef SOURCEMANAGER_HH #define SOURCEMANAGER_HH #include #include #include class QMenu; class QPixmap; class UI_MainWindow; struct Source { Source(const QString& _path, const QString& _displayname, bool _isTemp = false) : path(_path), displayname(_displayname), isTemp(_isTemp) {} QString path; QString displayname; bool isTemp; int brightness = 0; int contrast = 0; int resolution = -1; int page = 1; QVector angle; bool invert = false; }; class SourceManager : public QObject { Q_OBJECT public: SourceManager(const UI_MainWindow& _ui); ~SourceManager(); QList getSelectedSources() const; void addSourceImage(const QImage& image); public slots: void addSources(const QStringList& files); void addSource(const QString& file) { addSources(QStringList() << file); } signals: void sourceChanged(); private: const UI_MainWindow& ui; QMenu* m_recentMenu; QFileSystemWatcher m_fsWatcher; int m_screenshotCount = 0; int m_pasteCount = 0; void savePixmap(const QPixmap& pixmap, const QString& displayname); void selectionChanged(); bool eventFilter(QObject* object, QEvent* event) override; private slots: void clearSources(); void currentSourceChanged(); void deleteSource() { removeSource(true); } void fileChanged(const QString& filename); void openRecentItem(); void openSources(); void pasteClipboard(); void prepareSourcesMenu(); void removeSource(bool deleteFile = false); void takeScreenshot(); }; #endif // SOURCEMANAGER_HH gImageReader-3.2.3/qt/src/SubstitutionsManager.cc000066400000000000000000000216331312567024200217560ustar00rootroot00000000000000/* -*- Mode: C++; indent-tabs-mode: t; c-basic-offset: 4; tab-width: 4 -*- */ /* * SubstitutionsManager.cc * Copyright (C) 2013-2017 Sandro Mani * * gImageReader 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. * * gImageReader 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 this program. If not, see . */ #include #include #include #include #include #include #include #include "SubstitutionsManager.hh" #include "MainWindow.hh" #include "Config.hh" #include "ConfigSettings.hh" #include "OutputTextEdit.hh" #include "Utils.hh" SubstitutionsManager::SubstitutionsManager(OutputTextEdit* textEdit, QCheckBox* csCheckBox, QWidget* parent) : QDialog(parent) { setWindowTitle(_("Substitutions")); m_textEdit = textEdit; m_csCheckBox = csCheckBox; QAction* openAction = new QAction(QIcon::fromTheme("document-open"), _("Open"), this); openAction->setToolTip(_("Open")); QAction* saveAction = new QAction(QIcon::fromTheme("document-save"), _("Save"), this); saveAction->setToolTip(_("Save")); QAction* clearAction = new QAction(QIcon::fromTheme("edit-clear"), _("Clear"), this); clearAction->setToolTip(_("Clear")); QAction* addAction = new QAction(QIcon::fromTheme("list-add"), _("Add"), this); addAction->setToolTip(_("Add")); m_removeAction = new QAction(QIcon::fromTheme("list-remove"), _("Remove"), this); m_removeAction->setToolTip(_("Remove")); m_removeAction->setEnabled(false); QToolBar* toolbar = new QToolBar(this); toolbar->setIconSize(QSize(1, 1) * toolbar->style()->pixelMetric(QStyle::PM_SmallIconSize)); toolbar->addAction(openAction); toolbar->addAction(saveAction); toolbar->addAction(clearAction); toolbar->addSeparator(); toolbar->addAction(addAction); toolbar->addAction(m_removeAction); m_tableWidget = new QTableWidget(0, 2, this); m_tableWidget->setSelectionBehavior(QAbstractItemView::SelectRows); m_tableWidget->setEditTriggers(QAbstractItemView::CurrentChanged); #if QT_VERSION < QT_VERSION_CHECK(5, 0, 0) m_tableWidget->horizontalHeader()->setResizeMode(QHeaderView::Stretch); #else m_tableWidget->horizontalHeader()->setSectionResizeMode(QHeaderView::Stretch); #endif m_tableWidget->horizontalHeader()->setVisible(true); m_tableWidget->verticalHeader()->setVisible(false); m_tableWidget->setHorizontalHeaderLabels(QStringList() << _("Search for") << _("Replace with")); QDialogButtonBox* buttonBox = new QDialogButtonBox(QDialogButtonBox::Apply|QDialogButtonBox::Close); QVBoxLayout* layout = new QVBoxLayout(this); layout->setMargin(4); layout->addWidget(toolbar); layout->addWidget(m_tableWidget); layout->addWidget(buttonBox); setLayout(layout); connect(openAction, SIGNAL(triggered()), this, SLOT(openList())); connect(saveAction, SIGNAL(triggered()), this, SLOT(saveList())); connect(clearAction, SIGNAL(triggered()), this, SLOT(clearList())); connect(addAction, SIGNAL(triggered()), this, SLOT(addRow())); connect(buttonBox->button(QDialogButtonBox::Apply), SIGNAL(clicked()), this, SLOT(applySubstitutions())); connect(buttonBox->button(QDialogButtonBox::Close), SIGNAL(clicked()), this, SLOT(hide())); connect(m_removeAction, SIGNAL(triggered()), this, SLOT(removeRows())); connect(m_tableWidget->selectionModel(), SIGNAL(selectionChanged(QItemSelection,QItemSelection)), this, SLOT(onTableSelectionChanged(QItemSelection,QItemSelection))); MAIN->getConfig()->addSetting(new TableSetting("substitutionslist", m_tableWidget)); MAIN->getConfig()->addSetting(new VarSetting("substitutionslistfile", QDir(Utils::documentsFolder()).absoluteFilePath(_("substitution_list.txt")))); m_currentFile = MAIN->getConfig()->getSetting>("substitutionslistfile")->getValue(); } SubstitutionsManager::~SubstitutionsManager() { MAIN->getConfig()->removeSetting("replacelist"); MAIN->getConfig()->removeSetting("replacelistfile"); } void SubstitutionsManager::openList() { if(!clearList()) { return; } QString dir = !m_currentFile.isEmpty() ? QFileInfo(m_currentFile).absolutePath() : Utils::documentsFolder(); QString filename = QFileDialog::getOpenFileName(this, _("Open Substitutions List"), dir, QString("%1 (*.txt)").arg(_("Substitutions List"))); if(!filename.isEmpty()) { QFile file(filename); if(!file.open(QIODevice::ReadOnly)) { QMessageBox::critical(this, _("Error Reading File"), _("Unable to read '%1'.").arg(filename)); return; } m_currentFile = filename; MAIN->getConfig()->getSetting>("substitutionslistfile")->setValue(m_currentFile); bool errors = false; m_tableWidget->blockSignals(true); while(!file.atEnd()) { QString line = MAIN->getConfig()->useUtf8() ? QString::fromUtf8(file.readLine()) : QString::fromLocal8Bit(file.readLine()); line.chop(1); if(line.isEmpty()) { continue; } QList fields = line.split('\t'); if(fields.size() < 2) { errors = true; continue; } int row = m_tableWidget->rowCount(); m_tableWidget->insertRow(row); m_tableWidget->setItem(row, 0, new QTableWidgetItem(fields[0])); m_tableWidget->setItem(row, 1, new QTableWidgetItem(fields[1])); } m_tableWidget->blockSignals(false); MAIN->getConfig()->getSetting("substitutionslist")->serialize(); if(errors) { QMessageBox::warning(this, _("Errors Occurred Reading File"), _("Some entries of the substitutions list could not be read.")); } } } bool SubstitutionsManager::saveList() { QString filename = QFileDialog::getSaveFileName(this, _("Save Substitutions List"), m_currentFile, QString("%1 (*.txt)").arg(_("Substitutions List"))); if(filename.isEmpty()) { return false; } QFile file(filename); if(!file.open(QIODevice::WriteOnly)) { QMessageBox::critical(this, _("Error Saving File"), _("Unable to write to '%1'.").arg(filename)); return false; } m_currentFile = filename; MAIN->getConfig()->getSetting>("substitutionslistfile")->setValue(m_currentFile); for(int row = 0, nRows = m_tableWidget->rowCount(); row < nRows; ++row) { QString line = QString("%1\t%2\n").arg(m_tableWidget->item(row, 0)->text()).arg(m_tableWidget->item(row, 1)->text()); file.write(MAIN->getConfig()->useUtf8() ? line.toUtf8() : line.toLocal8Bit()); } return true; } bool SubstitutionsManager::clearList() { if(m_tableWidget->rowCount() > 0) { int response = QMessageBox::question(this, _("Save List?"), _("Do you want to save the current list?"), QMessageBox::Save, QMessageBox::Discard, QMessageBox::Cancel); if(response == QMessageBox::Save) { if(!saveList()) { return false; } } else if(response != QMessageBox::Discard) { return false; } m_tableWidget->setRowCount(0); MAIN->getConfig()->getSetting("substitutionslist")->serialize(); } return true; } void SubstitutionsManager::addRow() { int row = m_tableWidget->rowCount(); m_tableWidget->insertRow(row); m_tableWidget->setItem(row, 0, new QTableWidgetItem()); m_tableWidget->setItem(row, 1, new QTableWidgetItem()); m_tableWidget->editItem(m_tableWidget->item(row, 0)); } void SubstitutionsManager::removeRows() { m_tableWidget->blockSignals(true); for(const QModelIndex& index : m_tableWidget->selectionModel()->selectedRows()) { m_tableWidget->removeRow(index.row()); } m_tableWidget->blockSignals(false); MAIN->getConfig()->getSetting("substitutionslist")->serialize(); } void SubstitutionsManager::onTableSelectionChanged(const QItemSelection& selected, const QItemSelection& /*deselected*/) { m_removeAction->setEnabled(!selected.isEmpty()); } void SubstitutionsManager::applySubstitutions() { MAIN->pushState(MainWindow::State::Busy, _("Applying substitutions...")); QTextCursor cursor = m_textEdit->regionBounds(); int end = cursor.position(); cursor.setPosition(cursor.anchor()); QTextDocument::FindFlags flags = 0; if(m_csCheckBox->isChecked()) { flags = QTextDocument::FindCaseSensitively; } int start = cursor.position(); for(int row = 0, nRows = m_tableWidget->rowCount(); row < nRows; ++row) { QString search = m_tableWidget->item(row, 0)->text(); QString replace = m_tableWidget->item(row, 1)->text(); int diff = replace.length() - search.length(); cursor.setPosition(start); while(true) { cursor = m_textEdit->document()->find(search, cursor, flags); if(cursor.isNull() || qMax(cursor.anchor(), cursor.position()) > end) { break; } cursor.insertText(replace); end += diff; } QCoreApplication::processEvents(QEventLoop::ExcludeUserInputEvents); } MAIN->popState(); } gImageReader-3.2.3/qt/src/SubstitutionsManager.hh000066400000000000000000000030761312567024200217710ustar00rootroot00000000000000/* -*- Mode: C++; indent-tabs-mode: t; c-basic-offset: 4; tab-width: 4 -*- */ /* * SubstitutionsManager.hh * Copyright (C) 2013-2017 Sandro Mani * * gImageReader 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. * * gImageReader 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 this program. If not, see . */ #ifndef SUBSTITUTIONS_MANAGER_HH #define SUBSTITUTIONS_MANAGER_HH #include class QCheckBox; class QItemSelection; class OutputTextEdit; class QTableWidget; class SubstitutionsManager : public QDialog { Q_OBJECT public: SubstitutionsManager(OutputTextEdit* textEdit, QCheckBox* csCheckBox, QWidget* parent = nullptr); ~SubstitutionsManager(); private: QAction* m_removeAction; QString m_currentFile; QTableWidget* m_tableWidget; OutputTextEdit* m_textEdit; QCheckBox* m_csCheckBox; private slots: void addRow(); void applySubstitutions(); bool clearList(); void onTableSelectionChanged(const QItemSelection& selected, const QItemSelection& deselected); void openList(); void removeRows(); bool saveList(); }; #endif // SUBSTITUTIONS_MANAGER_HH gImageReader-3.2.3/qt/src/TessdataManager.cc000066400000000000000000000253641312567024200206340ustar00rootroot00000000000000/* -*- Mode: C++; indent-tabs-mode: t; c-basic-offset: 4; tab-width: 4 -*- */ /* * TessdataManager.hh * Copyright (C) 2013-2017 Sandro Mani * * gImageReader 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. * * gImageReader 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 this program. If not, see . */ #include #include #include #include #include #if QT_VERSION < QT_VERSION_CHECK(5, 0, 0) #include #else #include #include #include #endif #include #include #include #include #include #include #include "Config.hh" #include "MainWindow.hh" #include "Recognizer.hh" #include "TessdataManager.hh" #include "Utils.hh" TessdataManager::TessdataManager(QWidget *parent) : QDialog(parent) { setWindowTitle(_("Tessdata Manager")); setLayout(new QVBoxLayout()); layout()->addWidget(new QLabel(_("Manage installed languages:"))); m_languageList = new QListWidget(this); layout()->addWidget(m_languageList); QDialogButtonBox* bbox = new QDialogButtonBox(); bbox->addButton(QDialogButtonBox::Close); bbox->addButton(QDialogButtonBox::Apply); QPushButton* refreshButton = bbox->addButton(_("Refresh"), QDialogButtonBox::ActionRole); connect(bbox->button(QDialogButtonBox::Apply), SIGNAL(clicked(bool)), this, SLOT(applyChanges())); connect(bbox, SIGNAL(accepted()), this, SLOT(accept())); connect(bbox, SIGNAL(rejected()), this, SLOT(reject())); connect(refreshButton, SIGNAL(clicked(bool)), this, SLOT(refresh())); layout()->addWidget(bbox); setFixedWidth(320); } bool TessdataManager::setup() { #ifdef Q_OS_LINUX if(MAIN->getConfig()->useSystemDataLocations()) { QDBusConnectionInterface* iface = QDBusConnection::sessionBus().interface(); iface->startService("org.freedesktop.PackageKit"); if(!iface->isServiceRegistered("org.freedesktop.PackageKit").value()) { QMessageBox::critical(MAIN, _("Error"), _("PackageKit is required for managing system-wide tesseract language packs, but it was not found. Please use the system package management software to manage the tesseract language packs, or switch to use the user tessdata path in the configuration dialog.")); return false; } } #endif MAIN->pushState(MainWindow::State::Busy, _("Fetching available languages")); QString messages; bool success = fetchLanguageList(messages); MAIN->popState(); if(!success) { QMessageBox::critical(MAIN, _("Error"), _("Failed to fetch list of available languages: %1").arg(messages)); return false; } return true; } bool TessdataManager::fetchLanguageList(QString& messages) { m_languageList->clear(); // Get newest tag older or equal to used tesseract version QByteArray data = Utils::download(QUrl("https://api.github.com/repos/tesseract-ocr/tessdata/tags"), messages); if(data.isEmpty()) { messages = _("Failed to fetch list of available languages: %1").arg(messages); return false; } QString tessdataVer; QString tessVer(TESSERACT_VERSION_STR); #if QT_VERSION < QT_VERSION_CHECK(5, 0, 0) QJson::Parser parser; bool ok = false; QVariantList json = parser.parse( data, &ok ).toList(); if(!ok) { messages = _("Parsing error: %1").arg(parser.errorLine() + ": " + parser.errorString()); return false; } for(const QVariant& value : json) { QString tag = value.toMap().value("name").toString(); #else QJsonParseError err; QJsonDocument json = QJsonDocument::fromJson(data, &err); if(json.isNull()) { messages = _("Parsing error: %1").arg(err.errorString()); return false; } for(const QJsonValue& value : json.array()) { QString tag = value.toObject().value("name").toString(); #endif if(tag <= tessVer && tag > tessdataVer) { tessdataVer = tag; } } data = Utils::download(QUrl("https://api.github.com/repos/tesseract-ocr/tessdata/contents?ref=" + tessdataVer), messages); if(data.isEmpty()) { messages = _("Failed to fetch list of available languages: %1").arg(messages); return false; } QVector> extraFiles; #if QT_VERSION < QT_VERSION_CHECK(5, 0, 0) ok = false; json = parser.parse( data, &ok ).toList(); if(!ok) { messages = _("Parsing error: %1").arg(parser.errorLine() + ": " + parser.errorString()); return false; } for(const QVariant& value : json) { QVariantMap treeObj = value.toMap(); QString name = treeObj.value("name").toString(); QString url = treeObj.value("download_url").toString(); #else err = QJsonParseError(); json = QJsonDocument::fromJson(data, &err); if(json.isNull()) { messages = _("Parsing error: %1").arg(err.errorString()); return false; } for(const QJsonValue& value : json.array()) { QJsonObject treeObj = value.toObject(); QString name = treeObj.value("name").toString(); QString url = treeObj.value("download_url").toString(); #endif if(name.endsWith(".traineddata")) { m_languageFiles[name.left(name.indexOf("."))].append({name,url}); } else { // Delay decision to determine whether file is a supplementary language file extraFiles.append(qMakePair(name, url)); } } for(const QPair& extraFile : extraFiles) { QString lang = extraFile.first.left(extraFile.first.indexOf(".")); if(m_languageFiles.contains(lang)) { m_languageFiles[lang].append({extraFile.first,extraFile.second}); } } QStringList availableLanguages = MAIN->getRecognizer()->getAvailableLanguages(); QStringList languages = QStringList(m_languageFiles.keys()); languages.sort(); for(const QString& prefix : languages) { Config::Lang lang; lang.prefix = prefix; QString label; if(MAIN->getConfig()->searchLangSpec(lang)) { label = QString("%1 (%2)").arg(lang.name).arg(lang.prefix); } else { label = lang.prefix; } QListWidgetItem* item = new QListWidgetItem(label); item->setData(Qt::UserRole, prefix); item->setCheckState(availableLanguages.contains(prefix) ? Qt::Checked : Qt::Unchecked); m_languageList->addItem(item); } return true; } void TessdataManager::applyChanges() { MAIN->pushState(MainWindow::State::Busy, _("Applying changes...")); setEnabled(false); setCursor(Qt::WaitCursor); QString errorMsg; QStringList availableLanguages = MAIN->getRecognizer()->getAvailableLanguages(); QDir tessDataDir(MAIN->getConfig()->tessdataLocation()); #ifdef Q_OS_WIN bool isWindows = true; #else bool isWindows = false; #endif if(!isWindows && MAIN->getConfig()->useSystemDataLocations()) { // Place this in a ifdef since DBus stuff cannot be compiled on Windows #ifdef Q_OS_LINUX QStringList installFiles; QStringList removeFiles; for(int row = 0, nRows = m_languageList->count(); row < nRows; ++row) { QListWidgetItem* item = m_languageList->item(row); QString prefix = item->data(Qt::UserRole).toString(); if(item->checkState() == Qt::Checked && !availableLanguages.contains(prefix)) { installFiles.append(tessDataDir.absoluteFilePath(QString("%1.traineddata").arg(prefix))); } else if(item->checkState() != Qt::Checked && availableLanguages.contains(prefix)) { removeFiles.append(tessDataDir.absoluteFilePath(QString("%1.traineddata").arg(prefix))); } } if(!installFiles.isEmpty()) { QDBusMessage req = QDBusMessage::createMethodCall("org.freedesktop.PackageKit", "/org/freedesktop/PackageKit", "org.freedesktop.PackageKit.Modify", "InstallProvideFiles"); req.setArguments(QList() << QVariant::fromValue((quint32)winId()) << QVariant::fromValue(installFiles) << QVariant::fromValue(QString("always"))); QDBusMessage reply = QDBusConnection::sessionBus().call(req, QDBus::BlockWithGui, 3600000); if(reply.type() == QDBusMessage::ErrorMessage) { errorMsg = reply.errorMessage(); } } if(errorMsg.isEmpty() && !removeFiles.isEmpty()) { QDBusMessage req = QDBusMessage::createMethodCall("org.freedesktop.PackageKit", "/org/freedesktop/PackageKit", "org.freedesktop.PackageKit.Modify", "RemovePackageByFiles"); req.setArguments(QList() << QVariant::fromValue((quint32)winId()) << QVariant::fromValue(removeFiles) << QVariant::fromValue(QString("always"))); QDBusMessage reply = QDBusConnection::sessionBus().call(req, QDBus::BlockWithGui, 3600000); if(reply.type() == QDBusMessage::ErrorMessage) { errorMsg = reply.errorMessage(); } } #endif } else { QStringList errors; if(!QDir().mkpath(tessDataDir.absolutePath())) { errors.append(_("Failed to create directory for tessdata files.")); } else { for(int row = 0, nRows = m_languageList->count(); row < nRows; ++row) { QListWidgetItem* item = m_languageList->item(row); QString prefix = item->data(Qt::UserRole).toString(); if(item->checkState() == Qt::Checked && !availableLanguages.contains(prefix)) { for(const LangFile& langFile : m_languageFiles.value(prefix)) { if(!QFile(tessDataDir.absoluteFilePath(langFile.name)).exists()) { MAIN->pushState(MainWindow::State::Busy, _("Downloading %1...").arg(langFile.name)); QString messages; QByteArray data = Utils::download(QUrl(langFile.url), messages); QFile file(tessDataDir.absoluteFilePath(langFile.name)); if(data.isEmpty() || !file.open(QIODevice::WriteOnly)) { errors.append(langFile.name); } else { file.write(data); } MAIN->popState(); } } } else if(item->checkState() != Qt::Checked && availableLanguages.contains(prefix)) { foreach(const QString& file, tessDataDir.entryList(QStringList() << prefix + ".*")) { if(!QFile(tessDataDir.absoluteFilePath(file)).remove()) { errors.append(file); } } } } } if(!errors.isEmpty()) { errorMsg = _("The following files could not be downloaded or removed:\n%1\n\nCheck the connectivity and directory permissions.").arg(errors.join("\n")); } } unsetCursor(); setEnabled(true); MAIN->popState(); refresh(); if(!errorMsg.isEmpty()) { QMessageBox::critical(this, _("Error"), errorMsg); } } void TessdataManager::refresh() { MAIN->getRecognizer()->updateLanguagesMenu(); QStringList availableLanguages = MAIN->getRecognizer()->getAvailableLanguages(); for(int row = 0, nRows = m_languageList->count(); row < nRows; ++row) { QListWidgetItem* item = m_languageList->item(row); QString prefix = item->data(Qt::UserRole).toString(); item->setCheckState(availableLanguages.contains(prefix) ? Qt::Checked : Qt::Unchecked); } } gImageReader-3.2.3/qt/src/TessdataManager.hh000066400000000000000000000024471312567024200206430ustar00rootroot00000000000000/* -*- Mode: C++; indent-tabs-mode: t; c-basic-offset: 4; tab-width: 4 -*- */ /* * TessdataManager.hh * Copyright (C) 2013-2017 Sandro Mani * * gImageReader 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. * * gImageReader 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 this program. If not, see . */ #ifndef TESSDATAMANAGER_HH #define TESSDATAMANAGER_HH #include #include class QListWidget; class TessdataManager : public QDialog { Q_OBJECT public: TessdataManager(QWidget* parent = 0); bool setup(); private: struct LangFile { QString name; QString url; }; QListWidget* m_languageList; QMap> m_languageFiles; bool fetchLanguageList(QString& messages); private slots: void applyChanges(); void refresh(); }; #endif // TESSDATAMANAGER_HH gImageReader-3.2.3/qt/src/Ui_MainWindow.hh000066400000000000000000000213461312567024200203100ustar00rootroot00000000000000#ifndef UI_MAINWINDOW_HH #define UI_MAINWINDOW_HH #include "common.hh" #include "ui_MainWindow.h" #include #include #include class UI_MainWindow : public Ui_MainWindow { public: QAction* actionAbout; QAction* actionHelp; QAction* actionPreferences; QAction* actionRedetectLanguages; QAction* actionRotateCurrentPage; QAction* actionRotateAllPages; QAction* actionSourceClear; QAction* actionSourceDelete; QAction* actionSourcePaste; QAction* actionSourceRecent; QAction* actionSourceRemove; QAction* actionSourceScreenshot; QComboBox* comboBoxOCRMode; QDoubleSpinBox* spinBoxRotation; QSpinBox* spinBoxPage; QFrame* frameRotation; QFrame* framePage; QMenu* menuAppMenu; QMenu* menuAddSource; QMenu* menuLanguages; QMenu* menuRotation; QToolBar* toolBarSources; QToolButton* toolButtonRotation; QToolButton* toolButtonRecognize; QToolButton* toolButtonAppMenu; QToolButton* toolButtonSourceAdd; QWidgetAction* actionRotate; QWidgetAction* actionPage; void setupUi(QMainWindow* MainWindow) { Ui_MainWindow::setupUi(MainWindow); // Do remaining things which are not possible in designer toolBarMain->setContextMenuPolicy(Qt::PreventContextMenu); // Remove & from some labels which designer insists in adding dockWidgetSources->setWindowTitle(gettext("Sources")); dockWidgetOutput->setWindowTitle(gettext("Output")); // Hide image controls widget widgetImageControls->setVisible(false); // Rotate spinbox frameRotation = new QFrame(MainWindow); frameRotation->setFrameShape(QFrame::StyledPanel); frameRotation->setFrameShadow(QFrame::Sunken); frameRotation->setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Fixed); QHBoxLayout* layoutRotation = new QHBoxLayout(frameRotation); layoutRotation->setContentsMargins(1, 1, 1, 1); layoutRotation->setSpacing(0); actionRotateCurrentPage = new QAction(QIcon(":/icons/rotate_page"), gettext("Rotate current page"), MainWindow); actionRotateAllPages = new QAction(QIcon(":/icons/rotate_pages"), gettext("Rotate all pages"), MainWindow); menuRotation = new QMenu(MainWindow); menuRotation->addAction(actionRotateCurrentPage); menuRotation->addAction(actionRotateAllPages); toolButtonRotation = new QToolButton(MainWindow); toolButtonRotation->setIcon(QIcon(":/icons/rotate_pages")); toolButtonRotation->setToolTip(gettext("Select rotation mode")); toolButtonRotation->setPopupMode(QToolButton::InstantPopup); toolButtonRotation->setAutoRaise(true); toolButtonRotation->setMenu(menuRotation); layoutRotation->addWidget(toolButtonRotation); spinBoxRotation = new QDoubleSpinBox(MainWindow); spinBoxRotation->setRange(0.0, 359.9); spinBoxRotation->setDecimals(1); spinBoxRotation->setSingleStep(0.1); spinBoxRotation->setWrapping(true); spinBoxRotation->setFrame(false); spinBoxRotation->setKeyboardTracking(false); spinBoxRotation->setSizePolicy(spinBoxRotation->sizePolicy().horizontalPolicy(), QSizePolicy::MinimumExpanding); layoutRotation->addWidget(spinBoxRotation); actionRotate = new QWidgetAction(MainWindow); actionRotate->setDefaultWidget(frameRotation); toolBarMain->insertAction(actionImageControls, actionRotate); // Page spinbox framePage = new QFrame(MainWindow); framePage->setFrameShape(QFrame::StyledPanel); framePage->setFrameShadow(QFrame::Sunken); framePage->setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Fixed); QHBoxLayout* layoutPage = new QHBoxLayout(framePage); layoutPage->setContentsMargins(1, 1, 1, 1); layoutPage->setSpacing(0); QToolButton* toolButtonPage = new QToolButton(MainWindow); toolButtonPage->setIcon(QPixmap(":/icons/page")); toolButtonPage->setEnabled(false); toolButtonPage->setAutoRaise(true); layoutPage->addWidget(toolButtonPage); spinBoxPage = new QSpinBox(MainWindow); spinBoxPage->setRange(1, 1); spinBoxPage->setFrame(false); spinBoxPage->setKeyboardTracking(false); spinBoxPage->setSizePolicy(spinBoxPage->sizePolicy().horizontalPolicy(), QSizePolicy::MinimumExpanding); layoutPage->addWidget(spinBoxPage); actionPage = new QWidgetAction(MainWindow); actionPage->setDefaultWidget(framePage); toolBarMain->insertAction(actionImageControls, actionPage); actionPage->setVisible(false); QFont smallFont; smallFont.setPointSizeF(smallFont.pointSizeF() * 0.9); // OCR mode button QWidget* ocrModeWidget = new QWidget(); ocrModeWidget->setLayout(new QVBoxLayout()); ocrModeWidget->layout()->setContentsMargins(0, 0, 0, 0); ocrModeWidget->layout()->setSpacing(0); QLabel* outputModeLabel = new QLabel(gettext("OCR mode:")); outputModeLabel->setFont(smallFont); ocrModeWidget->layout()->addWidget(outputModeLabel); comboBoxOCRMode = new QComboBox(); comboBoxOCRMode->addItems(QStringList() << gettext("Plain text") << gettext("hOCR, PDF")); comboBoxOCRMode->setFont(smallFont); comboBoxOCRMode->setFrame(false); comboBoxOCRMode->setCurrentIndex(-1); ocrModeWidget->layout()->addWidget(comboBoxOCRMode); toolBarMain->insertWidget(actionAutodetectLayout, ocrModeWidget); actionAutodetectLayout->setVisible(false); // Recognize button toolButtonRecognize = new QToolButton(MainWindow); toolButtonRecognize->setIcon(QIcon::fromTheme("insert-text")); toolButtonRecognize->setToolButtonStyle(Qt::ToolButtonTextBesideIcon); toolButtonRecognize->setFont(smallFont); toolButtonRecognize->setPopupMode(QToolButton::MenuButtonPopup); toolBarMain->insertWidget(actionToggleOutputPane, toolButtonRecognize); menuLanguages = new QMenu(toolButtonRecognize); toolButtonRecognize->setMenu(menuLanguages); // Spacer before app menu button QWidget* toolBarMainSpacer = new QWidget(toolBarMain); toolBarMainSpacer->setSizePolicy(QSizePolicy::Expanding,QSizePolicy::Preferred); toolBarMain->addWidget(toolBarMainSpacer); // App menu menuAppMenu = new QMenu(MainWindow); actionRedetectLanguages = new QAction(QIcon::fromTheme("view-refresh"), gettext("Redetect Languages"), MainWindow); menuAppMenu->addAction(actionRedetectLanguages); actionPreferences = new QAction(QIcon::fromTheme("preferences-system"), gettext("Preferences"), MainWindow); menuAppMenu->addAction(actionPreferences); menuAppMenu->addSeparator(); actionHelp = new QAction(QIcon::fromTheme("help-contents"), gettext("Help"), MainWindow); menuAppMenu->addAction(actionHelp); actionAbout = new QAction(QIcon::fromTheme("help-about"), gettext("About"), MainWindow); menuAppMenu->addAction(actionAbout); // App menu button toolButtonAppMenu = new QToolButton(MainWindow); toolButtonAppMenu->setIcon(QIcon::fromTheme("preferences-system")); toolButtonAppMenu->setPopupMode(QToolButton::InstantPopup); toolButtonAppMenu->setMenu(menuAppMenu); toolBarMain->addWidget(toolButtonAppMenu); // Sources toolbar actionSourceRecent = new QAction(QIcon::fromTheme("document-open-recent"), gettext("Recent"), MainWindow); actionSourcePaste = new QAction(QIcon::fromTheme("edit-paste"), gettext("Paste"), MainWindow); actionSourceScreenshot = new QAction(QIcon::fromTheme("camera-photo"), gettext("Take Screenshot"), MainWindow); menuAddSource = new QMenu(MainWindow); menuAddSource->addAction(actionSourceRecent); menuAddSource->addSeparator(); menuAddSource->addAction(actionSourcePaste); menuAddSource->addAction(actionSourceScreenshot); toolButtonSourceAdd = new QToolButton(MainWindow); toolButtonSourceAdd->setIcon(QIcon::fromTheme("document-open")); toolButtonSourceAdd->setText(gettext("Add Images")); toolButtonSourceAdd->setToolTip(gettext("Add images")); toolButtonSourceAdd->setPopupMode(QToolButton::MenuButtonPopup); toolButtonSourceAdd->setMenu(menuAddSource); actionSourceRemove = new QAction(QIcon::fromTheme("list-remove"), gettext("Remove Image"), MainWindow); actionSourceRemove->setToolTip(gettext("Remove image from list")); actionSourceRemove->setEnabled(false); actionSourceDelete = new QAction(QIcon::fromTheme("user-trash"), gettext("Delete Image"), MainWindow); actionSourceDelete->setToolTip(gettext("Delete image")); actionSourceDelete->setEnabled(false); actionSourceClear = new QAction(QIcon::fromTheme("edit-clear"), gettext("Clear List"), MainWindow); actionSourceClear->setToolTip(gettext("Clear list")); actionSourceClear->setEnabled(false); toolBarSources = new QToolBar(MainWindow); toolBarSources->setToolButtonStyle(Qt::ToolButtonIconOnly); toolBarSources->setIconSize(QSize(1, 1) * toolBarSources->style()->pixelMetric(QStyle::PM_SmallIconSize)); toolBarSources->addWidget(toolButtonSourceAdd); toolBarSources->addSeparator(); toolBarSources->addAction(actionSourceRemove); toolBarSources->addAction(actionSourceDelete); toolBarSources->addAction(actionSourceClear); static_cast(tabSources->layout())->insertWidget(0, toolBarSources); } }; #endif // UI_MAINWINDOW_HH gImageReader-3.2.3/qt/src/Ui_OutputEditorHOCR.hh000066400000000000000000000057501312567024200213600ustar00rootroot00000000000000#ifndef UI_OUTPUTEDITORHOCR_HH #define UI_OUTPUTEDITORHOCR_HH #include "common.hh" #include "OutputTextEdit.hh" #include #include #include #include #include #include #include #include #include #include #include #include #include class UI_OutputEditorHOCR { public: QAction* actionOutputOpen; QAction* actionOutputClear; QAction* actionOutputSaveHOCR; QAction* actionOutputExportPDF; QToolBar* toolBarOutput; QSplitter* splitter; QTreeWidget *treeWidgetItems; QTableWidget *tableWidgetProperties; OutputTextEdit *plainTextEditOutput; void setupUi(QWidget* widget) { widget->setLayout(new QVBoxLayout()); widget->layout()->setContentsMargins(0, 0, 0, 0); widget->layout()->setSpacing(0); // Output toolbar actionOutputOpen = new QAction(QIcon::fromTheme("document-open"), gettext("Open hOCR file"), widget); actionOutputOpen->setToolTip(gettext("Open hOCR file")); actionOutputSaveHOCR = new QAction(QIcon::fromTheme("document-save-as"), gettext("Save as hOCR text"), widget); actionOutputSaveHOCR->setToolTip(gettext("Save as hOCR text")); actionOutputSaveHOCR->setEnabled(false); actionOutputExportPDF = new QAction(QIcon::fromTheme("application-pdf"), gettext("Export to PDF"), widget); actionOutputExportPDF->setToolTip(gettext("Export to PDF")); actionOutputExportPDF->setEnabled(false); actionOutputClear = new QAction(QIcon::fromTheme("edit-clear"), gettext("Clear output"), widget); actionOutputClear->setToolTip(gettext("Clear output")); toolBarOutput = new QToolBar(widget); toolBarOutput->setToolButtonStyle(Qt::ToolButtonIconOnly); toolBarOutput->setIconSize(QSize(1, 1) * toolBarOutput->style()->pixelMetric(QStyle::PM_SmallIconSize)); toolBarOutput->addAction(actionOutputOpen); toolBarOutput->addAction(actionOutputSaveHOCR); toolBarOutput->addAction(actionOutputExportPDF); toolBarOutput->addAction(actionOutputClear); widget->layout()->addWidget(toolBarOutput); splitter = new QSplitter(Qt::Vertical, widget); widget->layout()->addWidget(splitter); treeWidgetItems = new QTreeWidget(widget); treeWidgetItems->setHeaderHidden(true); treeWidgetItems->setSelectionMode(QTreeWidget::ContiguousSelection); splitter->addWidget(treeWidgetItems); QTabWidget* tabWidget = new QTabWidget(widget); tableWidgetProperties = new QTableWidget(widget); tableWidgetProperties->setColumnCount(2); tableWidgetProperties->horizontalHeader()->setVisible(false); tableWidgetProperties->verticalHeader()->setVisible(false); tableWidgetProperties->horizontalHeader()->setStretchLastSection(true); tabWidget->addTab(tableWidgetProperties, gettext("Properties")); plainTextEditOutput = new OutputTextEdit(widget); plainTextEditOutput->setReadOnly(true); tabWidget->addTab(plainTextEditOutput, gettext("Source")); splitter->addWidget(tabWidget); } }; #endif // UI_OUTPUTEDITORHOCR_HH gImageReader-3.2.3/qt/src/Ui_OutputEditorText.hh000066400000000000000000000214021312567024200215410ustar00rootroot00000000000000#ifndef UI_OUTPUTEDITORTEXT_HH #define UI_OUTPUTEDITORTEXT_HH #include "common.hh" #include "OutputTextEdit.hh" #include #include #include #include #include #include #include #include #include #include class UI_OutputEditorText { public: QAction* actionOutputModeAppend; QAction* actionOutputModeCursor; QAction* actionOutputModeReplace; QAction* actionOutputClear; QAction* actionOutputRedo; QAction* actionOutputReplace; QAction* actionOutputSave; QAction* actionOutputPostprocTitle1; QAction* actionOutputPostprocKeepEndMark; QAction* actionOutputPostprocKeepQuote; QAction* actionOutputPostprocTitle2; QAction* actionOutputPostprocJoinHyphen; QAction* actionOutputPostprocCollapseSpaces; QAction* actionOutputPostprocKeepParagraphs; QAction* actionOutputPostprocTitle3; QAction* actionOutputPostprocDrawWhitespace; QAction* actionOutputUndo; QMenu* menuOutputMode; QMenu* menuOutputPostproc; QToolBar* toolBarOutput; QToolButton* toolButtonOutputMode; QToolButton* toolButtonOutputPostproc; QLineEdit *lineEditOutputSearch; QLineEdit *lineEditOutputReplace; QToolButton *toolButtonOutputFindNext; QToolButton *toolButtonOutputReplace; QToolButton *toolButtonOutputReplaceAll; QToolButton *toolButtonOutputFindPrev; QPushButton *pushButtonOutputReplacementList; QCheckBox *checkBoxOutputSearchMatchCase; OutputTextEdit *plainTextEditOutput; QFrame *frameOutputSearch; void setupUi(QWidget* widget) { widget->setLayout(new QVBoxLayout()); widget->layout()->setContentsMargins(0, 0, 0, 0); widget->layout()->setSpacing(0); // Output insert mode actionOutputModeAppend = new QAction(QIcon(":/icons/ins_append"), gettext("Append to current text"), widget); actionOutputModeCursor = new QAction(QIcon(":/icons/ins_cursor"), gettext("Insert at cursor"), widget); actionOutputModeReplace = new QAction(QIcon(":/icons/ins_replace"), gettext("Replace current text"), widget); menuOutputMode = new QMenu(widget); menuOutputMode->addAction(actionOutputModeAppend); menuOutputMode->addAction(actionOutputModeCursor); menuOutputMode->addAction(actionOutputModeReplace); // Output postprocessing actionOutputPostprocTitle1 = new QAction(gettext("Keep line break if..."), widget); actionOutputPostprocTitle1->setEnabled(false); actionOutputPostprocKeepEndMark = new QAction(gettext("Preceded by end mark (.?!)"), widget); actionOutputPostprocKeepEndMark->setCheckable(true); actionOutputPostprocKeepQuote = new QAction(gettext("Preceded or succeeded by quote"), widget); actionOutputPostprocKeepQuote->setCheckable(true); actionOutputPostprocTitle2 = new QAction(gettext("Other options"), widget); actionOutputPostprocTitle2->setEnabled(false); actionOutputPostprocJoinHyphen = new QAction(gettext("Join hyphenated words"), widget); actionOutputPostprocJoinHyphen->setCheckable(true); actionOutputPostprocCollapseSpaces = new QAction(gettext("Collapse whitespace"), widget); actionOutputPostprocCollapseSpaces->setCheckable(true); actionOutputPostprocKeepParagraphs = new QAction(gettext("Preserve paragraphs"), widget); actionOutputPostprocKeepParagraphs->setCheckable(true); actionOutputPostprocTitle3 = new QAction(gettext("Visual aids"), widget); actionOutputPostprocTitle3->setEnabled(false); actionOutputPostprocDrawWhitespace = new QAction(gettext("Draw whitespace"), widget); actionOutputPostprocDrawWhitespace->setCheckable(true); menuOutputPostproc = new QMenu(widget); menuOutputPostproc->addAction(actionOutputPostprocTitle1); menuOutputPostproc->addAction(actionOutputPostprocKeepEndMark); menuOutputPostproc->addAction(actionOutputPostprocKeepQuote); menuOutputPostproc->addAction(actionOutputPostprocTitle2); menuOutputPostproc->addAction(actionOutputPostprocJoinHyphen); menuOutputPostproc->addAction(actionOutputPostprocCollapseSpaces); menuOutputPostproc->addAction(actionOutputPostprocKeepParagraphs); menuOutputPostproc->addAction(actionOutputPostprocTitle3); menuOutputPostproc->addAction(actionOutputPostprocDrawWhitespace); // Output toolbar toolButtonOutputMode = new QToolButton(widget); toolButtonOutputMode->setIcon(QIcon(":/icons/ins_append")); toolButtonOutputMode->setToolTip(gettext("Select insert mode")); toolButtonOutputMode->setPopupMode(QToolButton::InstantPopup); toolButtonOutputMode->setMenu(menuOutputMode); toolButtonOutputPostproc = new QToolButton(widget); toolButtonOutputPostproc->setIcon(QIcon(":/icons/stripcrlf")); toolButtonOutputPostproc->setText(gettext("Strip Line Breaks")); toolButtonOutputPostproc->setToolTip(gettext("Strip line breaks on selected text")); toolButtonOutputPostproc->setPopupMode(QToolButton::MenuButtonPopup); toolButtonOutputPostproc->setMenu(menuOutputPostproc); actionOutputReplace = new QAction(QIcon::fromTheme("edit-find-replace"), gettext("Find and Replace"), widget); actionOutputReplace->setToolTip(gettext("Find and replace")); actionOutputReplace->setCheckable(true); actionOutputUndo = new QAction(QIcon::fromTheme("edit-undo"), gettext("Undo"), widget); actionOutputUndo->setToolTip(gettext("Undo")); actionOutputUndo->setEnabled(false); actionOutputRedo = new QAction(QIcon::fromTheme("edit-redo"), gettext("Redo"), widget); actionOutputRedo->setToolTip(gettext("Redo")); actionOutputRedo->setEnabled(false); actionOutputSave = new QAction(QIcon::fromTheme("document-save-as"), gettext("Save Output"), widget); actionOutputSave->setToolTip(gettext("Save output")); actionOutputClear = new QAction(QIcon::fromTheme("edit-clear"), gettext("Clear Output"), widget); actionOutputClear->setToolTip(gettext("Clear output")); toolBarOutput = new QToolBar(widget); toolBarOutput->setToolButtonStyle(Qt::ToolButtonIconOnly); toolBarOutput->setIconSize(QSize(1, 1) * toolBarOutput->style()->pixelMetric(QStyle::PM_SmallIconSize)); toolBarOutput->addWidget(toolButtonOutputMode); toolBarOutput->addWidget(toolButtonOutputPostproc); toolBarOutput->addAction(actionOutputReplace); toolBarOutput->addAction(actionOutputUndo); toolBarOutput->addAction(actionOutputRedo); toolBarOutput->addAction(actionOutputSave); toolBarOutput->addAction(actionOutputClear); widget->layout()->addWidget(toolBarOutput); // Search/Replace field frameOutputSearch = new QFrame(widget); frameOutputSearch->setFrameShape(QFrame::StyledPanel); frameOutputSearch->setFrameShadow(QFrame::Plain); QGridLayout* frameOutputSearchLayout = new QGridLayout(frameOutputSearch); frameOutputSearchLayout->setSpacing(2); frameOutputSearchLayout->setContentsMargins(2, 2, 2, 2); lineEditOutputSearch = new QLineEdit(frameOutputSearch); lineEditOutputSearch->setPlaceholderText(gettext("Find")); frameOutputSearchLayout->addWidget(lineEditOutputSearch, 0, 0, 1, 1); lineEditOutputReplace = new QLineEdit(frameOutputSearch); lineEditOutputReplace->setPlaceholderText(gettext("Replace")); frameOutputSearchLayout->addWidget(lineEditOutputReplace, 1, 0, 1, 1); toolButtonOutputFindNext = new QToolButton(frameOutputSearch); toolButtonOutputFindNext->setIcon(QIcon::fromTheme("go-down")); toolButtonOutputFindNext->setToolTip(gettext("Find next")); frameOutputSearchLayout->addWidget(toolButtonOutputFindNext, 0, 1, 1, 1); toolButtonOutputFindPrev = new QToolButton(frameOutputSearch); toolButtonOutputFindPrev->setIcon(QIcon::fromTheme("go-up")); toolButtonOutputFindPrev->setToolTip(gettext("Find previous")); frameOutputSearchLayout->addWidget(toolButtonOutputFindPrev, 0, 2, 1, 1); toolButtonOutputReplace = new QToolButton(frameOutputSearch); toolButtonOutputReplace->setIcon(QIcon::fromTheme("edit-find-replace")); toolButtonOutputReplace->setToolTip(gettext("Replace")); frameOutputSearchLayout->addWidget(toolButtonOutputReplace, 1, 1, 1, 1); toolButtonOutputReplaceAll = new QToolButton(frameOutputSearch); toolButtonOutputReplaceAll->setIcon(QIcon::fromTheme("edit-find-replace")); toolButtonOutputReplaceAll->setToolTip(gettext("Replace all")); frameOutputSearchLayout->addWidget(toolButtonOutputReplaceAll, 1, 2, 1, 1); pushButtonOutputReplacementList = new QPushButton(frameOutputSearch); pushButtonOutputReplacementList->setText(gettext("Substitutions")); pushButtonOutputReplacementList->setIcon(QIcon::fromTheme("document-edit")); frameOutputSearchLayout->addWidget(pushButtonOutputReplacementList, 3, 0, 1, 3); checkBoxOutputSearchMatchCase = new QCheckBox(frameOutputSearch); checkBoxOutputSearchMatchCase->setText(gettext("Match case")); frameOutputSearchLayout->addWidget(checkBoxOutputSearchMatchCase, 2, 0, 1, 3); widget->layout()->addWidget(frameOutputSearch); plainTextEditOutput = new OutputTextEdit(widget); widget->layout()->addWidget(plainTextEditOutput); } }; #endif // UI_OUTPUTEDITORTEXT_HH gImageReader-3.2.3/qt/src/Utils.cc000066400000000000000000000146451312567024200166710ustar00rootroot00000000000000/* -*- Mode: C++; indent-tabs-mode: t; c-basic-offset: 4; tab-width: 4 -*- */ /* * Utils.cc * Copyright (C) 2013-2017 Sandro Mani * * gImageReader 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. * * gImageReader 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 this program. If not, see . */ #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include "Utils.hh" #include "Config.hh" #include "MainWindow.hh" #include "SourceManager.hh" QString Utils::documentsFolder() { QString documentsFolder; #if QT_VERSION < QT_VERSION_CHECK(5, 0, 0) documentsFolder = QDesktopServices::storageLocation(QDesktopServices::DocumentsLocation); #else documentsFolder = QStandardPaths::writableLocation(QStandardPaths::DocumentsLocation); #endif return documentsFolder.isEmpty() ? QDir::homePath() : documentsFolder; } QString Utils::makeOutputFilename(const QString& filename) { // Ensure directory exists QFileInfo finfo(filename); QDir dir = finfo.absoluteDir(); if(!dir.exists()) { dir = QDir(Utils::documentsFolder()); } // Generate non-existing file QString base = finfo.baseName().replace(QRegExp("_[0-9]+$"), ""); QString ext = finfo.completeSuffix(); QString newfilename = dir.absoluteFilePath(base + "." + ext); for(int i = 1; QFile(newfilename).exists(); ++i) { newfilename = dir.absoluteFilePath(QString("%1_%2.%3").arg(base).arg(i).arg(ext)); } return newfilename; } class BusyTaskThread : public QThread { public: BusyTaskThread(const std::function &f) : m_f(f), m_result(false) {} bool getResult() const { return m_result; } private: std::function m_f; bool m_result; void run() { m_result = m_f(); } }; class BusyEventFilter : public QObject { public: bool eventFilter(QObject */*obj*/, QEvent *ev) { if(dynamic_cast(ev)) { QMouseEvent* mev = static_cast(ev); QPoint evp = MAIN->m_progressCancelButton->mapFromGlobal(mev->globalPos()); return !QRect(QPoint(0, 0), MAIN->m_progressCancelButton->size()).contains(evp); } return dynamic_cast(ev); } }; bool Utils::busyTask(const std::function &f, const QString& msg) { MAIN->pushState(MainWindow::State::Busy, msg); QEventLoop evLoop; BusyTaskThread thread(f); QObject::connect(&thread, SIGNAL(finished()), &evLoop, SLOT(quit())); thread.start(); BusyEventFilter filter; QApplication::instance()->installEventFilter(&filter); evLoop.exec(); QApplication::instance()->removeEventFilter(&filter); MAIN->popState(); return thread.getResult(); } void Utils::setSpinBlocked(QSpinBox *spin, int value) { spin->blockSignals(true); spin->setValue(value); spin->blockSignals(false); } void Utils::setSpinBlocked(QDoubleSpinBox *spin, double value) { spin->blockSignals(true); spin->setValue(value); spin->blockSignals(false); } bool Utils::handleSourceDragEvent(const QMimeData* mimeData) { if(mimeData->hasImage()) { QTextStream(stdout) << "hasImage" << endl; return true; } QList formats = QImageReader::supportedImageFormats(); formats.append("pdf"); for(const QUrl& url : mimeData->urls()) { QFile file(url.toLocalFile()); if(!file.exists()) { continue; } for(const QByteArray& format : formats) { if(file.fileName().endsWith(format, Qt::CaseInsensitive)) { return true; } } } return false; } void Utils::handleSourceDropEvent(const QMimeData* mimeData) { if(mimeData->hasImage()) { QTextStream(stdout) << "hasImage" << endl; MAIN->getSourceManager()->addSourceImage(qvariant_cast(mimeData->imageData())); return; } QList formats = QImageReader::supportedImageFormats(); formats.append("pdf"); for(const QUrl& url : mimeData->urls()) { QFile file(url.toLocalFile()); if(!file.exists()) { continue; } for(const QByteArray& format : formats) { if(file.fileName().endsWith(format, Qt::CaseInsensitive)) { MAIN->getSourceManager()->addSource(file.fileName()); break; } } } } QByteArray Utils::download(QUrl url, QString& messages, int timeout) { QNetworkAccessManager networkMgr; QNetworkReply* reply = nullptr; while(true) { QNetworkRequest req(url); req.setRawHeader("User-Agent" , "Wget/1.13.4"); QSslConfiguration conf = req.sslConfiguration(); conf.setPeerVerifyMode(QSslSocket::VerifyNone); req.setSslConfiguration(conf); reply = networkMgr.get(req); QTimer timer; QEventLoop loop; QObject::connect(&timer, SIGNAL(timeout()), &loop, SLOT(quit())); QObject::connect(reply, SIGNAL(finished()), &loop, SLOT(quit())); timer.setSingleShot(true); timer.start(timeout); loop.exec(); if(reply->isRunning()) { // Timeout reply->close(); delete reply; return QByteArray(); } QUrl redirectUrl = reply->attribute(QNetworkRequest::RedirectionTargetAttribute).toUrl(); if(redirectUrl.isValid() && url != redirectUrl) { delete reply; url = redirectUrl; } else { break; } } QByteArray result = reply->error() == QNetworkReply::NoError ? reply->readAll() : QByteArray(); messages = reply->error() == QNetworkReply::NoError ? QString() : reply->errorString(); delete reply; return result; } QString Utils::getSpellingLanguage(const QString& lang) { // Look in the lang cultures table if a language is provided Config::Lang langspec = {lang}; if(!lang.isEmpty() && MAIN->getConfig()->searchLangSpec(langspec)) { QList langCultures = MAIN->getConfig()->searchLangCultures(langspec.code); if(!langCultures.isEmpty()) { return langCultures.front(); } } // Use the application locale, if specified, otherwise fall back to en QString syslang = QLocale::system().name(); if(syslang.toLower() == "c" || syslang.isEmpty()) { return "en_US"; } return syslang; } gImageReader-3.2.3/qt/src/Utils.hh000066400000000000000000000037561312567024200167040ustar00rootroot00000000000000/* -*- Mode: C++; indent-tabs-mode: t; c-basic-offset: 4; tab-width: 4 -*- */ /* * Utils.hh * Copyright (C) 2013-2017 Sandro Mani * * gImageReader 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. * * gImageReader 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 this program. If not, see . */ #ifndef UTILS_HH #define UTILS_HH #include #include #include #include #include class QMimeData; class QSpinBox; class QDoubleSpinBox; class QUrl; namespace Utils { QString documentsFolder(); QString makeOutputFilename(const QString& filename); bool busyTask(const std::function& f, const QString& msg); void setSpinBlocked(QSpinBox* spin, int value); void setSpinBlocked(QDoubleSpinBox* spin, double value); bool handleSourceDragEvent(const QMimeData* mimeData); void handleSourceDropEvent(const QMimeData* mimeData); QByteArray download(QUrl url, QString& messages, int timeout = 60000); QString getSpellingLanguage(const QString& lang = QString()); template class AsyncQueue { public: bool empty() { QMutexLocker locker(&m_mutex); return m_queue.isEmpty(); } void enqueue(const T& item) { QMutexLocker locker(&m_mutex); m_queue.enqueue(item); m_cond.wakeOne(); } T dequeue() { QMutexLocker locker(&m_mutex); if(m_queue.isEmpty()) { while(m_queue.isEmpty()) { m_cond.wait(&m_mutex); } } return m_queue.dequeue(); } private: QQueue m_queue; QMutex m_mutex; QWaitCondition m_cond; }; } #endif gImageReader-3.2.3/qt/src/common.hh000066400000000000000000000016141312567024200170630ustar00rootroot00000000000000/* -*- Mode: C++; indent-tabs-mode: t; c-basic-offset: 4; tab-width: 4 -*- */ /* * common.hh * Copyright (C) 2013-2017 Sandro Mani * * gImageReader 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. * * gImageReader 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 this program. If not, see . */ #ifndef COMMON_HH #define COMMON_HH #include #define _(x) QString(gettext(x)) #endifgImageReader-3.2.3/qt/src/main.cc000066400000000000000000000063661312567024200165160ustar00rootroot00000000000000/* -*- Mode: C++; indent-tabs-mode: t; c-basic-offset: 4; tab-width: 4 -*- */ /* * main.cc * Copyright (C) 2013-2017 Sandro Mani * * gImageReader 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. * * gImageReader 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 this program. If not, see . */ #include #include #include #include #include #include #include #include #include "MainWindow.hh" #include "Config.hh" #include "CrashHandler.hh" int main (int argc, char *argv[]) { QApplication app(argc, argv); QDir dataDir = QDir(QString("%1/../share/").arg(QApplication::applicationDirPath())); QApplication::setOrganizationName(PACKAGE_NAME); QApplication::setApplicationName(PACKAGE_NAME); #if QT_VERSION < QT_VERSION_CHECK(5, 0, 0) QTextCodec::setCodecForCStrings(QTextCodec::codecForName("UTF-8")); QTextCodec::setCodecForTr(QTextCodec::codecForName("UTF-8")); #endif #ifdef Q_OS_WIN QIcon::setThemeSearchPaths({dataDir.absoluteFilePath("icons")}); QIcon::setThemeName("hicolor"); QDir packageDir = QDir(QString("%1/../").arg(QApplication::applicationDirPath())); if(qgetenv("LANG").isEmpty()) { qputenv("LANG", QLocale::system().name().toLocal8Bit()); } #endif QTranslator qtTranslator; QString translationsPath = QLibraryInfo::location(QLibraryInfo::TranslationsPath); #ifdef Q_OS_WIN translationsPath = packageDir.absolutePath() + translationsPath.mid(QLibraryInfo::location(QLibraryInfo::PrefixPath).length()); #endif qtTranslator.load("qt_" + QLocale::system().name(), translationsPath); qtTranslator.load("qtbase_" + QLocale::system().name(), translationsPath); QApplication::instance()->installTranslator(&qtTranslator); bindtextdomain(GETTEXT_PACKAGE, dataDir.absoluteFilePath("locale").toLocal8Bit().data()); bind_textdomain_codeset(GETTEXT_PACKAGE, "UTF-8"); textdomain(GETTEXT_PACKAGE); QWidget* window; if(argc >= 3 && std::strcmp("crashhandle", argv[1]) == 0) { int pid = std::atoi(argv[2]); QString savefile = argc >= 4 ? argv[3] : ""; window = new CrashHandler(pid, savefile); } else if(argc >= 2 && std::strcmp("tessdatadir", argv[1]) == 0) { Config::openTessdataDir(); return 0; } else if(argc >= 2 && std::strcmp("spellingdir", argv[1]) == 0) { Config::openSpellingDir(); return 0; } else { #ifdef Q_OS_WIN qputenv("TWAINDSM_LOG", packageDir.absoluteFilePath("twain.log").toLocal8Bit()); std::freopen(packageDir.absoluteFilePath("gimagereader.log").toLocal8Bit().data(), "w", stderr); #endif QStringList files; for(int i = 1; i < argc; ++i) { if(QFile(argv[i]).exists()) { files.append(argv[i]); } } window = new MainWindow(files); } window->show(); int exitcode = app.exec(); delete window; return exitcode; } gImageReader-3.2.3/qt/src/scanner/000077500000000000000000000000001312567024200167015ustar00rootroot00000000000000gImageReader-3.2.3/qt/src/scanner/ScannerSane.cc000066400000000000000000000620411312567024200214130ustar00rootroot00000000000000/* -*- Mode: C++; indent-tabs-mode: t; c-basic-offset: 4; tab-width: 4 -*- */ /* * ScannerSane.cc * Based on code from Simple Scan, which is: * Copyright (C) 2009-2013 Canonical Ltd. * Author: Robert Ancell * Modifications are: * Copyright (C) 2013-2017 Sandro Mani * * gImageReader 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. * * gImageReader 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 this program. If not, see . */ #include "ScannerSane.hh" #include #include #include #include #include #include void ScannerSane::init() { moveToThread(&m_thread); connect(&m_thread, SIGNAL(started()), this, SLOT(run())); m_thread.start(); } void ScannerSane::redetect() { m_requestQueue.enqueue({Request::Type::Redetect, 0}); } void ScannerSane::scan(const Params& params) { Q_ASSERT(params.depth == 8); // only 8 supported m_requestQueue.enqueue({Request::Type::StartScan, new ScanJob(params)}); } void ScannerSane::cancel() { m_requestQueue.enqueue({Request::Type::Cancel, 0}); } void ScannerSane::close() { m_requestQueue.enqueue({Request::Type::Quit, 0}); m_thread.quit(); m_thread.wait(); } /***************************** Thread functions ******************************/ void ScannerSane::run() { // Initialize sane SANE_Int version_code; SANE_Status status = sane_init(&version_code, nullptr); qDebug("sane_init() -> %s", sane_strstatus(status)); if(status != SANE_STATUS_GOOD) { qWarning("Unable to initialize SANE backend: %s", sane_strstatus(status)); emit initFailed(); return; } qDebug("SANE version %d.%d.%d", SANE_VERSION_MAJOR(version_code), SANE_VERSION_MINOR(version_code), SANE_VERSION_BUILD(version_code)); /* Scan for devices on first start */ doRedetect(); bool need_redetect = false; while(true) { // Fetch request if requests are pending or wait for request if idle if(!m_requestQueue.empty() || m_state == State::IDLE) { Request request = m_requestQueue.dequeue(); if(request.type == Request::Type::Redetect) { need_redetect = true; } else if(request.type == Request::Type::StartScan) { setState(State::OPEN); m_job = request.job; } else if(request.type == Request::Type::Cancel) { failScan(_("Scan canceled")); } else if(request.type == Request::Type::Quit) { doStop(); break; } } // Perform operations according to state if(m_state == State::IDLE) { if(need_redetect) { doRedetect(); need_redetect = false; } } else if(m_state == State::OPEN) { doOpen(); } else if(m_state == State::SET_OPTIONS) { doSetOptions(); } else if(m_state == State::START) { doStart(); } else if(m_state == State::GET_PARAMETERS) { doGetParameters(); } else if(m_state == State::READ) { doRead(); } } qDebug("sane_exit()"); // Commented to prevent crash, see https://bugs.launchpad.net/hplip/+bug/1315858 // sane_exit(); } void ScannerSane::setState(State state) { m_state = state; emit scanStateChanged(m_state); } void ScannerSane::failScan(const QString& errorString) { doStop(); emit scanFailed(errorString); } void ScannerSane::doRedetect() { QList devices; const SANE_Device** device_list = nullptr; SANE_Status status = sane_get_devices(&device_list, false); qDebug("sane_get_devices() -> %s", sane_strstatus(status)); if(status != SANE_STATUS_GOOD) { qWarning("Unable to get SANE devices: %s", sane_strstatus(status)); } else { for(int i = 0; device_list[i] != nullptr; ++i) { qDebug("Device: name=\"%s\" vendor=\"%s\" model=\"%s\" type=\"%s\"", device_list[i]->name, device_list[i]->vendor, device_list[i]->model, device_list[i]->type); Device scan_device; scan_device.name = device_list[i]->name; /* Abbreviate HP as it is a long string and does not match what is on the physical scanner */ QString vendor = device_list[i]->vendor; if(vendor == "Hewlett-Packard") vendor = "HP"; scan_device.label = QString("%1 %2").arg(vendor).arg(device_list[i]->model); scan_device.label.replace('_', " "); devices.append(scan_device); } } emit devicesDetected(devices); } void ScannerSane::doOpen() { if(m_job->params.device.isEmpty()) { failScan(_("No scanner specified")); return; } SANE_Status status = sane_open(m_job->params.device.toLocal8Bit().data(), &m_job->handle); qDebug("sane_open(\"%s\") -> %s", qPrintable(m_job->params.device), sane_strstatus(status)); if(status != SANE_STATUS_GOOD) { m_job->handle = nullptr; qWarning("Unable to get open device: %s", sane_strstatus(status)); failScan(_("Unable to connect to scanner")); return; } setState(State::SET_OPTIONS); } void ScannerSane::doSetOptions() { qDebug("set_options"); int index = 0; const SANE_Option_Descriptor* option; QMap options; /* Build the option table */ while((option = sane_get_option_descriptor(m_job->handle, index)) != nullptr) { logOption(index, option); if( /* Ignore groups */ option->type != SANE_TYPE_GROUP && /* Option disabled */ (option->cap & SANE_CAP_INACTIVE) == 0 && /* Some options are unnamed (e.g. Option 0) */ option->name != nullptr && std::strlen(option->name) > 0 ) { options.insert(option->name, index); } ++index; } /* Apply settings */ /* Pick source */ option = getOptionByName(options, m_job->handle, SANE_NAME_SCAN_SOURCE, index); if(option != nullptr) { QStringList flatbed_sources = { "Auto", SANE_I18N("Auto"), "Flatbed", SANE_I18N("Flatbed"), "FlatBed", "Normal", SANE_I18N("Normal") }; QStringList adf_sources = { "Automatic Document Feeder", SANE_I18N("Automatic Document Feeder"), "ADF", "Automatic Document Feeder(left aligned)", /* Seen in the proprietary brother3 driver */ "Automatic Document Feeder(centrally aligned)" /* Seen in the proprietary brother3 driver */ }; QStringList adf_front_sources = { "ADF Front", SANE_I18N("ADF Front") }; QStringList adf_back_sources = { "ADF Back", SANE_I18N("ADF Back") }; QStringList adf_duplex_sources = { "ADF Duplex", SANE_I18N("ADF Duplex") }; switch(m_job->params.type) { case ScanType::SINGLE: if(!setDefaultOption(m_job->handle, option, index)) if(!setConstrainedStringOption(m_job->handle, option, index, flatbed_sources, nullptr)) qWarning("Unable to set single page source, please file a bug"); break; case ScanType::ADF_FRONT: if(!setConstrainedStringOption(m_job->handle, option, index, adf_front_sources, nullptr)) if(!setConstrainedStringOption(m_job->handle, option, index, adf_sources, nullptr)) qWarning("Unable to set front ADF source, please file a bug"); break; case ScanType::ADF_BACK: if(!setConstrainedStringOption(m_job->handle, option, index, adf_back_sources, nullptr)) if(!setConstrainedStringOption(m_job->handle, option, index, adf_sources, nullptr)) qWarning("Unable to set back ADF source, please file a bug"); break; case ScanType::ADF_BOTH: if(!setConstrainedStringOption(m_job->handle, option, index, adf_duplex_sources, nullptr)) if(!setConstrainedStringOption(m_job->handle, option, index, adf_sources, nullptr)) qWarning("Unable to set duplex ADF source, please file a bug"); break; } } /* Scan mode (before resolution as it tends to affect that */ option = getOptionByName(options, m_job->handle, SANE_NAME_SCAN_MODE, index); if(option != nullptr) { /* The names of scan modes often used in drivers, as taken from the sane-backends source */ QStringList color_scan_modes = { SANE_VALUE_SCAN_MODE_COLOR, "Color", "24bit Color" /* Seen in the proprietary brother3 driver */ }; QStringList gray_scan_modes = { SANE_VALUE_SCAN_MODE_GRAY, "Gray", "Grayscale", SANE_I18N("Grayscale"), "True Gray" /* Seen in the proprietary brother3 driver */ }; QStringList lineart_scan_modes = { SANE_VALUE_SCAN_MODE_LINEART, "Lineart", "LineArt", SANE_I18N("LineArt"), "Black & White", SANE_I18N("Black & White"), "Binary", SANE_I18N("Binary"), "Thresholded", SANE_VALUE_SCAN_MODE_GRAY, "Gray", "Grayscale", SANE_I18N("Grayscale"), "True Gray" /* Seen in the proprietary brother3 driver */ }; switch(m_job->params.scan_mode) { case ScanMode::COLOR: if(!setConstrainedStringOption(m_job->handle, option, index, color_scan_modes, nullptr)) qWarning("Unable to set Color mode, please file a bug"); break; case ScanMode::GRAY: if(!setConstrainedStringOption(m_job->handle, option, index, gray_scan_modes, nullptr)) qWarning("Unable to set Gray mode, please file a bug"); break; case ScanMode::LINEART: if(!setConstrainedStringOption(m_job->handle, option, index, lineart_scan_modes, nullptr)) qWarning("Unable to set Lineart mode, please file a bug"); break; default: break; } } /* Duplex */ option = getOptionByName(options, m_job->handle, "duplex", index); if(option != nullptr && option->type == SANE_TYPE_BOOL) setBoolOption(m_job->handle, option, index, m_job->params.type == ScanType::ADF_BOTH, nullptr); /* Multi-page options */ option = getOptionByName(options, m_job->handle, "batch-scan", index); if(option != nullptr && option->type == SANE_TYPE_BOOL) setBoolOption(m_job->handle, option, index, m_job->params.type != ScanType::SINGLE, nullptr); /* Disable compression, we will compress after scanning */ option = getOptionByName(options, m_job->handle, "compression", index); if(option != nullptr) { QStringList disable_compression_names = { SANE_I18N("None"), SANE_I18N("none"), "None", "none" }; if(!setConstrainedStringOption(m_job->handle, option, index, disable_compression_names, nullptr)) qWarning("Unable to disable compression, please file a bug"); } /* Set resolution and bit depth */ option = getOptionByName(options, m_job->handle, SANE_NAME_SCAN_RESOLUTION, index); if(option != nullptr) { if(option->type == SANE_TYPE_FIXED) setFixedOption(m_job->handle, option, index, m_job->params.dpi, &m_job->params.dpi); else { int dpi; setIntOption(m_job->handle, option, index, m_job->params.dpi, &dpi); m_job->params.dpi = dpi; } option = getOptionByName(options, m_job->handle, SANE_NAME_BIT_DEPTH, index); if(option != nullptr && m_job->params.depth > 0) setIntOption(m_job->handle, option, index, m_job->params.depth, nullptr); } /* Always use maximum scan area - some scanners default to using partial areas. This should be patched in sane-backends */ option = getOptionByName(options, m_job->handle, SANE_NAME_SCAN_BR_X, index); if(option != nullptr && option->constraint_type == SANE_CONSTRAINT_RANGE) { if(option->type == SANE_TYPE_FIXED) setFixedOption(m_job->handle, option, index, SANE_UNFIX(option->constraint.range->max), nullptr); else setIntOption(m_job->handle, option, index, option->constraint.range->max, nullptr); } option = getOptionByName(options, m_job->handle, SANE_NAME_SCAN_BR_Y, index); if(option != nullptr && option->constraint_type == SANE_CONSTRAINT_RANGE) { if(option->type == SANE_TYPE_FIXED) setFixedOption(m_job->handle, option, index, SANE_UNFIX(option->constraint.range->max), nullptr); else setIntOption(m_job->handle, option, index, option->constraint.range->max, nullptr); } /* Set page dimensions */ option = getOptionByName(options, m_job->handle, SANE_NAME_PAGE_WIDTH, index); if(option != nullptr && m_job->params.page_width > 0.0) { if(option->type == SANE_TYPE_FIXED) setFixedOption(m_job->handle, option, index, m_job->params.page_width / 10.0, nullptr); else setIntOption(m_job->handle, option, index, m_job->params.page_width / 10, nullptr); } option = getOptionByName(options, m_job->handle, SANE_NAME_PAGE_HEIGHT, index); if(option != nullptr && m_job->params.page_height > 0.0) { if(option->type == SANE_TYPE_FIXED) setFixedOption(m_job->handle, option, index, m_job->params.page_height / 10.0, nullptr); else setIntOption(m_job->handle, option, index, m_job->params.page_height / 10, nullptr); } setState(State::START); } void ScannerSane::doStart() { SANE_Status status = sane_start(m_job->handle); qDebug("sane_start -> %s", sane_strstatus(status)); if(status == SANE_STATUS_GOOD) { setState(State::GET_PARAMETERS); } else { doStop(); failScan(_("Unable to start scan")); } } void ScannerSane::doGetParameters() { SANE_Status status = sane_get_parameters(m_job->handle, &m_job->parameters); qDebug("sane_get_parameters() -> %s", sane_strstatus(status)); if(status != SANE_STATUS_GOOD) { failScan(_("Error communicating with scanner")); return; } qDebug("Parameters: format=%s last_frame=%s bytes_per_line=%d pixels_per_line=%d lines=%d depth=%d", getFrameModeString(m_job->parameters.format).toLocal8Bit().data(), m_job->parameters.last_frame ? "SANE_TRUE" : "SANE_FALSE", m_job->parameters.bytes_per_line, m_job->parameters.pixels_per_line, m_job->parameters.lines, m_job->parameters.depth); m_job->height = qMax(1, m_job->parameters.lines); m_job->rowstride = m_job->parameters.pixels_per_line * 3; // Buffer is for a 24 bit RGB image m_job->imgbuf.resize(m_job->rowstride * m_job->parameters.lines); /* Prepare for read */ m_job->lineBuffer.resize(m_job->parameters.bytes_per_line); m_job->nUsed = 0; m_job->lineCount = 0; setState(State::READ); } void ScannerSane::doRead() { /* Read as many bytes as we need to complete a line */ int n_to_read = m_job->lineBuffer.size() - m_job->nUsed; SANE_Int n_read; unsigned char* b = &m_job->lineBuffer[m_job->nUsed]; SANE_Status status = sane_read(m_job->handle, b, n_to_read, &n_read); qDebug("sane_read(%d) -> (%s, %d)", n_to_read, sane_strstatus(status), n_read); /* Completed read */ if(status == SANE_STATUS_EOF) { if(m_job->parameters.lines > 0 && m_job->lineCount != m_job->parameters.lines) qWarning("Scan completed with %d lines, expected %d lines", m_job->lineCount, m_job->parameters.lines); if(m_job->nUsed > 0) qWarning("Scan complete with %d bytes of unused data", m_job->nUsed); doCompletePage(); return; } else if(status != SANE_STATUS_GOOD) { qWarning("Unable to read frame from device: %s", sane_strstatus(status)); failScan(_("Error communicating with scanner")); return; } m_job->nUsed += n_read; /* If we completed a line, feed it out */ if(m_job->nUsed >= m_job->lineBuffer.size()) { Q_ASSERT(m_job->nUsed == m_job->parameters.bytes_per_line); ++m_job->lineCount; // Resize image if necessary if(m_job->lineCount > m_job->height) { m_job->height = m_job->lineCount; m_job->imgbuf.resize(m_job->rowstride * m_job->height); } // Write data int offset = (m_job->lineCount - 1) * m_job->rowstride; if(m_job->parameters.format == SANE_FRAME_GRAY) { for(int i = 0; i < m_job->lineBuffer.size(); ++i) { std::memset(&m_job->imgbuf[offset + 3*i], m_job->lineBuffer[i], 3); } } else if(m_job->parameters.format == SANE_FRAME_RGB) { std::memcpy(&m_job->imgbuf[offset], &m_job->lineBuffer[0], m_job->lineBuffer.size()); } else if(m_job->parameters.format == SANE_FRAME_RED) { for(int i = 0; i < m_job->lineBuffer.size(); ++i) { m_job->imgbuf[offset + 3*i + 0] = m_job->lineBuffer[i]; } } else if(m_job->parameters.format == SANE_FRAME_GREEN) { for(int i = 0; i < m_job->lineBuffer.size(); ++i) { m_job->imgbuf[offset + 3*i + 1] = m_job->lineBuffer[i]; } } else if(m_job->parameters.format == SANE_FRAME_BLUE) { for(int i = 0; i < m_job->lineBuffer.size(); ++i) { m_job->imgbuf[offset + 3*i + 2] = m_job->lineBuffer[i]; } } /* Reset buffer */ m_job->nUsed = 0; m_job->lineBuffer.resize(m_job->parameters.bytes_per_line); } } void ScannerSane::doCompletePage() { if(!m_job->parameters.last_frame) { setState(State::GET_PARAMETERS); return; } QString filename = m_job->params.filename; if(m_job->params.type != ScanType::SINGLE) { QFileInfo finfo(filename); filename = QString("%1/%2_%3.%4").arg(finfo.absolutePath()).arg(finfo.completeBaseName()).arg(m_job->pageNumber).arg(finfo.completeSuffix()); } if(!QImage(m_job->imgbuf.data(), m_job->rowstride / 3, m_job->height, m_job->rowstride, QImage::Format_RGB888).save(filename)) { failScan(_("Failed to save image")); return; } m_job->imgbuf.clear(); emit pageAvailable(filename); if(m_job->params.type != ScanType::SINGLE) { ++m_job->pageNumber; setState(State::GET_PARAMETERS); return; } doStop(); } void ScannerSane::doStop() { if(m_job != nullptr) { if(m_job->handle != nullptr) { qDebug("sane_close()"); sane_close(m_job->handle); } delete m_job; m_job = nullptr; setState(State::IDLE); } } /***************************** Sane option stuff *****************************/ const SANE_Option_Descriptor* ScannerSane::getOptionByName(const QMap& options, SANE_Handle, const QString& name, int &index) { QMap::const_iterator it = options.find(name); if(it != options.end()) { index = it.value(); return sane_get_option_descriptor(m_job->handle, index); } index = 0; return nullptr; } bool ScannerSane::setDefaultOption(SANE_Handle handle, const SANE_Option_Descriptor* option, SANE_Int option_index) { /* Check if supports automatic option */ if((option->cap & SANE_CAP_AUTOMATIC) == 0) return false; SANE_Status status = sane_control_option(handle, option_index, SANE_ACTION_SET_AUTO, nullptr, nullptr); qDebug("sane_control_option(%d, SANE_ACTION_SET_AUTO) -> %s", option_index, sane_strstatus(status)); if(status != SANE_STATUS_GOOD) qWarning("Error setting default option %s: %s", option->name, sane_strstatus(status)); return status == SANE_STATUS_GOOD; } void ScannerSane::setBoolOption(SANE_Handle handle, const SANE_Option_Descriptor* option, SANE_Int option_index, bool value, bool* result) { if(option->type != SANE_TYPE_BOOL) { return; } SANE_Bool v = static_cast(value); SANE_Status status = sane_control_option(handle, option_index, SANE_ACTION_SET_VALUE, &v, nullptr); if(result) *result = static_cast(v); qDebug("sane_control_option(%d, SANE_ACTION_SET_VALUE, %s) -> (%s, %s)", option_index, value ? "SANE_TRUE" : "SANE_FALSE", sane_strstatus(status), result ? "SANE_TRUE" : "SANE_FALSE"); } void ScannerSane::setIntOption(SANE_Handle handle, const SANE_Option_Descriptor* option, SANE_Int option_index, int value, int* result) { if(option->type != SANE_TYPE_INT) { return; } SANE_Word v = static_cast(value); if(option->constraint_type == SANE_CONSTRAINT_RANGE) { if(option->constraint.range->quant != 0) v *= option->constraint.range->quant; v = qMax(option->constraint.range->min, qMin(option->constraint.range->max, v)); } else if(option->constraint_type == SANE_CONSTRAINT_WORD_LIST) { int distance = std::numeric_limits::max(); int nearest = 0; /* Find nearest value to requested */ for(int i = 0; i < option->constraint.word_list[0]; ++i) { int x = option->constraint.word_list[i+1]; int d = qAbs(x - v); if(d < distance) { distance = d; nearest = x; } } v = nearest; } SANE_Status status = sane_control_option(handle, option_index, SANE_ACTION_SET_VALUE, &v, nullptr); qDebug("sane_control_option(%d, SANE_ACTION_SET_VALUE, %d) -> (%s, %d)", option_index, value, sane_strstatus(status), v); if(result) *result = v; } void ScannerSane::setFixedOption(SANE_Handle handle, const SANE_Option_Descriptor *option, SANE_Int option_index, double value, double* result) { if(option->type != SANE_TYPE_FIXED) { return; } double v = value; if(option->constraint_type == SANE_CONSTRAINT_RANGE) { double min = SANE_UNFIX(option->constraint.range->min); double max = SANE_UNFIX(option->constraint.range->max); v = qMax(min, qMin(max, v)); } else if(option->constraint_type == SANE_CONSTRAINT_WORD_LIST) { double distance = std::numeric_limits::max(); double nearest = 0.0; /* Find nearest value to requested */ for(int i = 0; i < option->constraint.word_list[0]; ++i) { double x = SANE_UNFIX(option->constraint.word_list[i+1]); double d = qAbs(x - v); if(d < distance) { distance = d; nearest = x; } } v = nearest; } SANE_Fixed v_fixed = SANE_FIX(v); SANE_Status status = sane_control_option(handle, option_index, SANE_ACTION_SET_VALUE, &v_fixed, nullptr); qDebug("sane_control_option(%d, SANE_ACTION_SET_VALUE, %f) -> (%s, %f)", option_index, value, sane_strstatus(status), SANE_UNFIX(v_fixed)); if(result) *result = SANE_UNFIX(v_fixed); } bool ScannerSane::setStringOption(SANE_Handle handle, const SANE_Option_Descriptor *option, SANE_Int option_index, const QString& value, QString* result) { if(option->type != SANE_TYPE_STRING) { return false; } char* v = new char[value.size() + 1]; // +1: \0 QByteArray val = value.toLocal8Bit(); strncpy(v, val.data(), val.size()+1); SANE_Status status = sane_control_option(handle, option_index, SANE_ACTION_SET_VALUE, v, nullptr); qDebug("sane_control_option(%d, SANE_ACTION_SET_VALUE, \"%s\") -> (%s, \"%s\")", option_index, val.data(), sane_strstatus(status), v); if(result) *result = v; delete[] v; return status == SANE_STATUS_GOOD; } bool ScannerSane::setConstrainedStringOption(SANE_Handle handle, const SANE_Option_Descriptor *option, SANE_Int option_index, const QStringList& values, QString* result) { if(option->type != SANE_TYPE_STRING) { return false; } if(option->constraint_type != SANE_CONSTRAINT_STRING_LIST) { return false; } for(const QString& value : values) { for(int j = 0; option->constraint.string_list[j] != nullptr; ++j) { if(value == option->constraint.string_list[j]) { return setStringOption(handle, option, option_index, value, result); } } } if(result) *result = ""; return false; } void ScannerSane::logOption(SANE_Int index, const SANE_Option_Descriptor *option) { QString s = QString("Option %1:").arg(index); if(option->name && std::strlen(option->name) > 0) s += QString(" name='%1'").arg(option->name); if(option->title && std::strlen(option->title) > 0) s += QString(" title='%1'").arg(option->title); QString typestr[] = {"bool", "int", "fixed", "string", "button", "group"}; if(option->type <= SANE_TYPE_GROUP) { s += QString(" type=%1").arg(typestr[option->type]); } else { s += QString(" type=%1").arg(option->type); } s += QString(" size=%1").arg(option->size); QString unitstr[] = {"none", "pixel", "bit", "mm", "dpi", "percent", "microseconds"}; if(option->unit <= SANE_UNIT_MICROSECOND) { s += QString(" unit=%1").arg(unitstr[option->unit]); } else { s += QString(" unit=%1").arg(option->unit); } switch(option->constraint_type) { case SANE_CONSTRAINT_RANGE: if(option->type == SANE_TYPE_FIXED) s += QString(" min=%1, max=%2, quant=%3").arg(SANE_UNFIX(option->constraint.range->min)).arg(SANE_UNFIX(option->constraint.range->max)).arg(option->constraint.range->quant); else s += QString(" min=%1, max=%2, quant=%3").arg(option->constraint.range->min).arg(option->constraint.range->max).arg(option->constraint.range->quant); break; case SANE_CONSTRAINT_WORD_LIST: s += " values=["; for(int i = 0; i < option->constraint.word_list[0]; ++i) { if(i > 0) s += ", "; if(option->type == SANE_TYPE_INT) s += QString("%1").arg(option->constraint.word_list[i+1]); else s += QString("%1").arg(SANE_UNFIX(option->constraint.word_list[i+1])); } s += "]"; break; case SANE_CONSTRAINT_STRING_LIST: s += " values=["; for(int i = 0; option->constraint.string_list[i] != nullptr; ++i) { if(i > 0) s += ", "; s += QString("\"%1\"").arg(option->constraint.string_list[i]); } s += "]"; break; default: break; } int cap = option->cap; if(cap != 0) { s += " cap="; if((cap & SANE_CAP_SOFT_SELECT) != 0) { s += "soft-select,"; cap &= ~SANE_CAP_SOFT_SELECT; } if((cap & SANE_CAP_HARD_SELECT) != 0) { s += "hard-select,"; cap &= ~SANE_CAP_HARD_SELECT; } if((cap & SANE_CAP_SOFT_DETECT) != 0) { s += "soft-detect,"; cap &= ~SANE_CAP_SOFT_DETECT; } if((cap & SANE_CAP_EMULATED) != 0) { s += "emulated,"; cap &= ~SANE_CAP_EMULATED; } if((cap & SANE_CAP_AUTOMATIC) != 0) { s += "automatic,"; cap &= ~SANE_CAP_AUTOMATIC; } if((cap & SANE_CAP_INACTIVE) != 0) { s += "inactive,"; cap &= ~SANE_CAP_INACTIVE; } if((cap & SANE_CAP_ADVANCED) != 0) { s += "advanced,"; cap &= ~SANE_CAP_ADVANCED; } /* Unknown capabilities */ if(cap != 0) { s += QString("unknown (%1)").arg(cap); } } qDebug("%s", qPrintable(s)); if(option->desc != nullptr) qDebug(" Description: %s", option->desc); } QString ScannerSane::getFrameModeString(SANE_Frame frame) { QString framestr[] = {"SANE_FRAME_GRAY", "SANE_FRAME_RGB", "SANE_FRAME_RED", "SANE_FRAME_GREEN", "SANE_FRAME_BLUE"}; if(frame <= SANE_FRAME_BLUE) { return framestr[frame]; } else { return QString("SANE_FRAME(%1)").arg(frame); } } gImageReader-3.2.3/qt/src/scanner/ScannerSane.hh000066400000000000000000000064101312567024200214230ustar00rootroot00000000000000/* -*- Mode: C++; indent-tabs-mode: t; c-basic-offset: 4; tab-width: 4 -*- */ /* * ScannerSane.hh * Based on code from Simple Scan, which is: * Copyright (C) 2009-2013 Canonical Ltd. * Author: Robert Ancell * Modifications are: * Copyright (C) 2013-2017 Sandro Mani * * gImageReader 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. * * gImageReader 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 this program. If not, see . */ #ifndef SCANNER_SANE_HH #define SCANNER_SANE_HH #include "../Scanner.hh" #include "../Utils.hh" #include #include #include class ScannerSane : public Scanner { Q_OBJECT public: void init() override; void redetect() override; void scan(const Params& params) override; void cancel() override; void close() override; private: struct ScanJob { ScanJob(const Params& _params) : params(_params) {} Params params; SANE_Handle handle = nullptr; SANE_Parameters parameters; QVector lineBuffer; QVector imgbuf; int nUsed = 0; // Number of used bytes in the line buffer int lineCount = 0; // Number of read lines int height = 0; int rowstride = 0; int pageNumber = 0; }; struct Request { enum class Type { Redetect, StartScan, Cancel, Quit } type; ScanJob* job; }; QThread m_thread; State m_state = State::IDLE; Utils::AsyncQueue m_requestQueue; ScanJob* m_job = nullptr; void doRedetect(); void doOpen(); void doSetOptions(); void doStart(); void doGetParameters(); void doRead(); void doCompletePage(); void doStop(); void setState(State state); void failScan(const QString& errorString); const SANE_Option_Descriptor* getOptionByName(const QMap& options, SANE_Handle, const QString& name, int& index); bool setDefaultOption(SANE_Handle m_handle, const SANE_Option_Descriptor *option, SANE_Int option_index); void setBoolOption(SANE_Handle m_handle, const SANE_Option_Descriptor* option, SANE_Int option_index, bool value, bool*result); void setIntOption(SANE_Handle m_handle, const SANE_Option_Descriptor* option, SANE_Int option_index, int value, int* result); void setFixedOption(SANE_Handle m_handle, const SANE_Option_Descriptor* option, SANE_Int option_index, double value, double* result); bool setStringOption(SANE_Handle m_handle, const SANE_Option_Descriptor* option, SANE_Int option_index, const QString& value, QString* result); bool setConstrainedStringOption(SANE_Handle m_handle, const SANE_Option_Descriptor* option, SANE_Int option_index, const QStringList& values, QString *result); void logOption(SANE_Int index, const SANE_Option_Descriptor* option); static QString getFrameModeString(SANE_Frame frame); private slots: void run(); }; typedef ScannerSane ScannerImpl; #endif // SCANNER_SANE_HH gImageReader-3.2.3/qt/src/scanner/ScannerTwain.cc000066400000000000000000000340451312567024200216120ustar00rootroot00000000000000/* -*- Mode: C++; indent-tabs-mode: t; c-basic-offset: 4; tab-width: 4 -*- */ /* * ScannerTwain.cc * Copyright (C) 2013-2017 Sandro Mani * * gImageReader 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. * * gImageReader 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 this program. If not, see . */ #include "ScannerTwain.hh" #include "../MainWindow.hh" #include #include #include #ifdef Q_OS_WIN32 bool ScannerTwain::saveDIB(TW_MEMREF hImg, const QString& filename) { PBITMAPINFOHEADER pDIB = reinterpret_cast(m_entryPoint.DSM_MemLock(hImg)); if(pDIB == nullptr) { return false; } DWORD paletteSize = 0; if(pDIB->biBitCount == 1) { paletteSize = 2; } else if(pDIB->biBitCount == 8) { paletteSize = 256; } else if(pDIB->biBitCount == 24) { paletteSize = 0; } else { // Unsupported m_entryPoint.DSM_MemUnlock(hImg); m_entryPoint.DSM_MemFree(hImg); return false; } // If the driver did not fill in the biSizeImage field, then compute it. // Each scan line of the image is aligned on a DWORD (32bit) boundary. if( pDIB->biSizeImage == 0 ) { pDIB->biSizeImage = ((((pDIB->biWidth * pDIB->biBitCount) + 31) & ~31) / 8) * pDIB->biHeight; // If a compression scheme is used the result may be larger: increase size. if (pDIB->biCompression != 0) { pDIB->biSizeImage = (pDIB->biSizeImage * 3) / 2; } } quint64 imageSize = pDIB->biSizeImage + sizeof(RGBQUAD)*paletteSize + sizeof(BITMAPINFOHEADER); BITMAPFILEHEADER bmpFIH = {0}; bmpFIH.bfType = ( (WORD) ('M' << 8) | 'B'); bmpFIH.bfSize = imageSize + sizeof(BITMAPFILEHEADER); bmpFIH.bfOffBits = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER) + (sizeof(RGBQUAD)*paletteSize); unsigned char* bmpData = new unsigned char[sizeof(BITMAPFILEHEADER) + imageSize]; std::memcpy(bmpData, &bmpFIH, sizeof(BITMAPFILEHEADER)); std::memcpy(bmpData + sizeof(BITMAPFILEHEADER), pDIB, imageSize); QImage image; image.loadFromData(bmpData, sizeof(BITMAPFILEHEADER) + imageSize, "bmp"); bool success = image.save(filename); delete[] bmpData; m_entryPoint.DSM_MemUnlock(hImg); m_entryPoint.DSM_MemFree(hImg); return success; } #endif ScannerTwain* ScannerTwain::s_instance = nullptr; void ScannerTwain::init() { if(m_dsmLib.isLoaded()) { qWarning("Init already called!"); emit initFailed(); return; } #ifdef Q_OS_WIN32 QString twaindsm = QDir(QCoreApplication::applicationDirPath()).absoluteFilePath("twaindsm.dll"); #else QString twaindsm = "libtwaindsm.so.2.2.0"; #endif // State 1 to 2 m_dsmLib.setFileName(twaindsm); if(!m_dsmLib.load()) { qCritical("LoadLibrary failed on %s", qPrintable(twaindsm)); emit initFailed(); close(); return; } m_dsmEntry = (DSMENTRYPROC)m_dsmLib.resolve("DSM_Entry"); if(m_dsmEntry == nullptr) { qCritical("GetProcAddress failed on %s::DSM_Entry", qPrintable(twaindsm)); emit initFailed(); close(); return; } m_appID.Id = 0; m_appID.Version.MajorNum = 1; m_appID.Version.MinorNum = 0; m_appID.Version.Language = TWLG_USA; m_appID.Version.Country = TWCY_USA; std::strncpy(m_appID.Version.Info, "TWAIN Interface", sizeof(m_appID.Version.Info)); std::strncpy(m_appID.ProductName, "TWAIN Interface", sizeof(m_appID.ProductName)); std::strncpy(m_appID.Manufacturer, "Sandro Mani", sizeof(m_appID.Manufacturer)); std::strncpy(m_appID.ProductFamily, "Sandro Mani", sizeof(m_appID.ProductFamily)); m_appID.SupportedGroups = DF_APP2 | DG_IMAGE | DG_CONTROL; m_appID.ProtocolMajor = TWON_PROTOCOLMAJOR; m_appID.ProtocolMinor = TWON_PROTOCOLMINOR; m_state = 2; // State 2 to 3 TW_MEMREF phwnd = nullptr; #ifdef Q_OS_WIN32 HWND hwnd = (HWND)MAIN->winId(); phwnd = &hwnd; #endif if(call(nullptr, DG_CONTROL, DAT_PARENT, MSG_OPENDSM, phwnd) != TWRC_SUCCESS) { emit initFailed(); close(); return; } if((m_appID.SupportedGroups & DF_DSM2) == 0) { qCritical("Twain 2.x interface is not supported"); emit initFailed(); close(); return; } // Get entry point of memory management functions m_entryPoint.Size = sizeof(TW_ENTRYPOINT); if(call(nullptr, DG_CONTROL, DAT_ENTRYPOINT, MSG_GET, &m_entryPoint) != TWRC_SUCCESS) { emit initFailed(); close(); return; } m_state = 3; s_instance = this; // Redetect on init redetect(); } void ScannerTwain::redetect() { TW_IDENTITY sourceID; QList sources; // Get the first source TW_UINT16 twRC = call(nullptr, DG_CONTROL, DAT_IDENTITY, MSG_GETFIRST, &sourceID); // Loop through all the sources while (twRC == TWRC_SUCCESS) { sources.append({sourceID.ProductName, sourceID.ProductName}); twRC = call(nullptr, DG_CONTROL, DAT_IDENTITY, MSG_GETNEXT, &sourceID); } emit devicesDetected(sources); } void ScannerTwain::scan(const Params ¶ms) { if(params.device.isEmpty()) { failScan(_("No scanner specified")); return; } /** Open device **/ emit scanStateChanged(State::OPEN); std::strncpy(m_srcID.ProductName, params.device.toLocal8Bit().data(), sizeof(m_srcID.ProductName)); // State 3 to 4 if(call(nullptr, DG_CONTROL, DAT_IDENTITY, MSG_OPENDS, &m_srcID) != TWRC_SUCCESS) { failScan(_("Unable to connect to scanner")); return; } m_state = 4; // Register callback TW_CALLBACK cb = {}; cb.CallBackProc = reinterpret_cast(callback); if(TWRC_SUCCESS == call(&m_srcID, DG_CONTROL, DAT_CALLBACK, MSG_REGISTER_CALLBACK, &cb)) { m_useCallback = true; } else { m_useCallback = false; } /** Set options **/ emit scanStateChanged(State::SET_OPTIONS); #ifndef Q_OS_WIN32 // Set the filename TW_SETUPFILEXFER xferFile = {}; std::strncpy(xferFile.FileName, params.filename.toLocal8Bit().data(), sizeof(xferFile.FileName)); xferFile.Format = TWFF_PNG; xferFile.VRefNum = TWON_DONTCARE16; if(call(&m_srcID, DG_CONTROL, DAT_SETUPFILEXFER, MSG_SET, &xferFile) != TWRC_SUCCESS) { // Possibly unsupported file format. Get the default format, and try again with that one call(&m_srcID, DG_CONTROL, DAT_SETUPFILEXFER, MSG_GET, &xferFile); QString defaultfile = xferFile.FileName; params.filename = params.filename.left(params.filename.lastIndexOf('.')) + defaultfile.right(defaultfile.length() - defaultfile.lastIndexOf('.')); std::strncpy(xferFile.FileName, params.filename.toLocal8Bit().data(), sizeof(xferFile.FileName)); if(call(&m_srcID, DG_CONTROL, DAT_SETUPFILEXFER, MSG_SET, &xferFile) != TWRC_SUCCESS) { // If we failed again, just return the default file... params.filename = defaultfile; } } #endif // Set capabilities setCapability(CAP_XFERCOUNT, CapOneVal(TWTY_INT16, 1)); setCapability(ICAP_XRESOLUTION, CapOneVal(TWTY_FIX32, floatToFix32(params.dpi))); setCapability(ICAP_YRESOLUTION, CapOneVal(TWTY_FIX32, floatToFix32(params.dpi))); setCapability(ICAP_SUPPORTEDSIZES, CapOneVal(TWTY_UINT16, TWSS_NONE)); // Maximum scan area setCapability(ICAP_BITDEPTH, CapOneVal(TWTY_UINT16, params.depth)); if(params.scan_mode != ScanMode::DEFAULT) { if(params.scan_mode == ScanMode::COLOR) setCapability(ICAP_PIXELTYPE, CapOneVal(TWTY_UINT16, TWPT_RGB)); else if(params.scan_mode == ScanMode::GRAY) setCapability(ICAP_PIXELTYPE, CapOneVal(TWTY_UINT16, TWPT_GRAY)); else if(params.scan_mode == ScanMode::LINEART) setCapability(ICAP_PIXELTYPE, CapOneVal(TWTY_UINT16, TWPT_BW)); } // TODO: ADF, duplex, paper size /** Start device **/ emit scanStateChanged(State::START); m_dsMsg = MSG_NULL; m_dsQuit = false; m_ui.ShowUI = true; m_ui.ModalUI = true; m_ui.hParent = nullptr;; #ifdef Q_OS_WIN32 m_ui.hParent = (HWND)MAIN->winId(); #endif // State 4 to 5 if(call(&m_srcID, DG_CONTROL, DAT_USERINTERFACE, MSG_ENABLEDS, &m_ui) != TWRC_SUCCESS) { failScan(_("Unable to start scan")); return; } m_state = 5; m_cancel = false; #ifdef Q_OS_WIN32 #if QT_VERSION < QT_VERSION_CHECK(5, 0, 0) QAbstractEventDispatcher::instance()->setEventFilter(eventFilter); #else QCoreApplication::instance()->installNativeEventFilter(&m_eventFilter); #endif while(m_dsMsg == 0 && !m_dsQuit && !m_cancel) { QCoreApplication::processEvents(); } #if QT_VERSION < QT_VERSION_CHECK(5, 0, 0) QAbstractEventDispatcher::instance()->setEventFilter(nullptr); #else QCoreApplication::instance()->removeNativeEventFilter(&m_eventFilter); #endif #else m_mutex.lock(); while(m_dsMsg == MSG_NULL) { m_cond.wait(&m_mutex); } m_mutex.unlock(); #endif if(m_cancel) { failScan(_("Scan canceled")); } if(m_dsMsg != MSG_XFERREADY) { failScan(_("Unable to start scan")); return; } /** Read **/ emit scanStateChanged(State::READ); m_state = 6; bool saveOk = true; #ifdef Q_OS_WIN32 TW_MEMREF hImg = nullptr; TW_UINT16 twRC = call(&m_srcID, DG_IMAGE, DAT_IMAGENATIVEXFER, MSG_GET, (TW_MEMREF)&hImg); if(twRC == TWRC_XFERDONE) { saveOk = saveDIB(hImg, params.filename); } #else TW_UINT16 twRC = call(&m_srcID, DG_IMAGE, DAT_IMAGEFILEXFER, MSG_GET, nullptr); #endif TW_PENDINGXFERS twPendingXFers = {}; call(&m_srcID, DG_CONTROL, DAT_PENDINGXFERS, MSG_ENDXFER, &twPendingXFers); if(twPendingXFers.Count != 0) { // Discard any additional pending transfers std::memset(&twPendingXFers, 0, sizeof(twPendingXFers)); call(&m_srcID, DG_CONTROL, DAT_PENDINGXFERS, MSG_RESET, &twPendingXFers); } if(twRC != TWRC_XFERDONE || !saveOk) { failScan(_("Error communicating with scanner")); return; } emit pageAvailable(params.filename); /** Stop device **/ doStop(); } void ScannerTwain::doStop() { if(m_state == 6) { TW_PENDINGXFERS twPendingXFers = {}; // State 7/6 to 5 call(&m_srcID, DG_CONTROL, DAT_PENDINGXFERS, MSG_RESET, &twPendingXFers); m_state = 5; } if(m_state == 5) { // State 5 to 4 call(&m_srcID, DG_CONTROL, DAT_USERINTERFACE, MSG_DISABLEDS, &m_ui); m_state = 4; } if(m_state == 4) { // State 4 to 3 call(nullptr, DG_CONTROL, DAT_IDENTITY, MSG_CLOSEDS, &m_srcID); m_srcID = {}; m_state = 3; } emit scanStateChanged(State::IDLE); } void ScannerTwain::failScan(const QString &errorString) { doStop(); emit scanFailed(errorString); } void ScannerTwain::close() { doStop(); if(m_state == 3) { // State 3 to 2 call(nullptr, DG_CONTROL, DAT_PARENT, MSG_CLOSEDSM, nullptr); m_state = 2; } if(m_state == 2) { m_dsmLib.unload(); } m_state = 1; s_instance = nullptr; } #ifdef Q_OS_WIN32 #if QT_VERSION < QT_VERSION_CHECK(5, 0, 0) bool ScannerTwain::eventFilter(void* message) #else bool ScannerTwain::NativeEventFilter::nativeEventFilter(const QByteArray& /*eventType*/, void* message, long* /*result*/) #endif { LPMSG msg = static_cast(message); if(msg->message == WM_CLOSE) { s_instance->m_dsQuit = true; return true; } TW_EVENT twEvent = {0}; twEvent.pEvent = (TW_MEMREF)msg; twEvent.TWMessage = MSG_NULL; TW_UINT16 twRC = s_instance->m_dsmEntry(&s_instance->m_appID, &s_instance->m_srcID, DG_CONTROL, DAT_EVENT, MSG_PROCESSEVENT, (TW_MEMREF)&twEvent); if(!s_instance->m_useCallback && twRC == TWRC_DSEVENT) { if(twEvent.TWMessage == MSG_XFERREADY || twEvent.TWMessage == MSG_CLOSEDSREQ || twEvent.TWMessage == MSG_CLOSEDSOK || twEvent.TWMessage == MSG_NULL) { s_instance->m_dsMsg = twEvent.TWMessage; } return true; } return false; } #endif /*********************** ScannerTwain internal methods ***********************/ TW_UINT16 ScannerTwain::call(TW_IDENTITY* idDS, TW_UINT32 dataGroup, TW_UINT16 dataType, TW_UINT16 msg, TW_MEMREF data) { TW_UINT16 rc = m_dsmEntry(&m_appID, idDS, dataGroup, dataType, msg, data); if(rc == TWRC_FAILURE) { TW_STATUS status = {}; rc = m_dsmEntry(&m_appID, idDS, DG_CONTROL, DAT_STATUS, MSG_GET, &status); TW_UINT16 cc = rc == TWRC_SUCCESS ? status.ConditionCode : TWCC_BUMMER; qCritical("Call failed with code 0x%x: DataGroup: 0x%lx, DataType = 0x%x, Msg = 0x%x", cc, dataGroup, dataType, msg); return TWRC_FAILURE; } return rc; } // TWTY_** size: INT8, INT16, INT32, UINT8, UINT16, UINT32, BOOL, FIX32, FRAME, STR32, STR64, STR128, STR255; static std::size_t TWTY_Size[] = { 1, 2, 4, 1, 2, 4, 2, 4, 16, 32, 64, 128, 255}; void ScannerTwain::setCapability(TW_UINT16 capCode, const CapOneVal& cap) { TW_CAPABILITY twCapability = {capCode, TWON_DONTCARE16, nullptr}; TW_UINT16 rc = call(&m_srcID, DG_CONTROL, DAT_CAPABILITY, MSG_GETCURRENT, &twCapability); // Unsupported capability if(rc != TWRC_SUCCESS) { return; } Q_ASSERT(twCapability.ConType == TWON_ONEVALUE); pTW_ONEVALUE val = static_cast(m_entryPoint.DSM_MemLock(twCapability.hContainer)); Q_ASSERT(val->ItemType == cap.type && val->ItemType <= TWTY_STR255); // This works because the DSM should return a TW_ONEVALUE container allocated sufficiently large to hold // the value of type ItemType. std::memcpy(&val->Item, &cap.data, TWTY_Size[cap.type]); m_entryPoint.DSM_MemUnlock(twCapability.hContainer); call(&m_srcID, DG_CONTROL, DAT_CAPABILITY, MSG_SET, &twCapability); m_entryPoint.DSM_MemFree(twCapability.hContainer); } TW_UINT16 ScannerTwain::callback(TW_IDENTITY* origin, TW_IDENTITY* /*dest*/, TW_UINT32 /*DG*/, TW_UINT16 /*DAT*/, TW_UINT16 MSG, TW_MEMREF /*data*/) { if(origin == nullptr || origin->Id != s_instance->m_srcID.Id) { return TWRC_FAILURE; } if(MSG == MSG_XFERREADY || MSG == MSG_CLOSEDSREQ || MSG == MSG_CLOSEDSOK || MSG == MSG_NULL) { s_instance->m_dsMsg = MSG; #ifndef Q_OS_WIN32 s_instance->m_mutex.lock(); s_instance->m_cond.wakeOne(); s_instance->m_mutex.unlock(); #endif return TWRC_SUCCESS; } return TWRC_FAILURE; } inline TW_FIX32 ScannerTwain::floatToFix32(float float32) { TW_FIX32 fix32; TW_INT32 value = (TW_INT32)(float32 * 65536.0 + 0.5); fix32.Whole = (TW_INT16)((value >> 16) & 0xFFFFL); fix32.Frac = (TW_INT16)(value & 0xFFFFL); return fix32; } inline float ScannerTwain::fix32ToFloat(TW_FIX32 fix32) { return float(fix32.Whole) + float(fix32.Frac) / (1 << 16); } gImageReader-3.2.3/qt/src/scanner/ScannerTwain.hh000066400000000000000000000064041312567024200216220ustar00rootroot00000000000000/* -*- Mode: C++; indent-tabs-mode: t; c-basic-offset: 4; tab-width: 4 -*- */ /* * ScannerTwain.hh * Copyright (C) 2013-2017 Sandro Mani * * gImageReader 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. * * gImageReader 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 this program. If not, see . */ #ifndef SCANNER_TWAIN_HH #define SCANNER_TWAIN_HH #include "../Scanner.hh" #include #include #include #include #include #ifdef Q_OS_WIN32 #include #if QT_VERSION >= QT_VERSION_CHECK(5, 0, 0) #include #endif #endif #include class ScannerTwain : public Scanner { Q_OBJECT public: void init() override; void redetect() override; void scan(const Params& params) override; void cancel() override { m_cancel = true; } void close() override; private: QLibrary m_dsmLib; DSMENTRYPROC m_dsmEntry = nullptr; TW_IDENTITY m_appID = {}; TW_ENTRYPOINT m_entryPoint = {}; TW_IDENTITY m_srcID = {}; TW_USERINTERFACE m_ui = {}; TW_UINT16 m_dsMsg = MSG_NULL; bool m_dsQuit = false; bool m_cancel = false; bool m_useCallback = false; int m_state = 0; static ScannerTwain* s_instance; #ifndef Q_OS_WIN32 QMutex m_mutex; QWaitCondition m_cond; #endif struct CapOneVal { CapOneVal() = default; CapOneVal(TW_UINT16 _type, std::int32_t _integer) : type(_type) { data.integer = _integer; } CapOneVal(TW_UINT16 _type, TW_FIX32 _fix32) : type(_type) { data.fix32 = _fix32; } CapOneVal(TW_UINT16 _type, TW_FIX32(&_frame)[4]) : type(_type) { std::memcpy(&data.frame[0], &_frame[0], sizeof(data.frame)); } CapOneVal(TW_UINT16 _type, const char* _string) : type(_type) { std::strncpy(&data.string[0], &_string[0], sizeof(data.string)); } TW_UINT16 type; union { std::uint32_t integer; TW_FIX32 fix32; TW_FIX32 frame[4]; char string[256]; } data; }; void doStop(); void failScan(const QString& errorString); TW_UINT16 call(TW_IDENTITY* idDS, TW_UINT32 dataGroup, TW_UINT16 dataType, TW_UINT16 msg, TW_MEMREF data); void setCapability(TW_UINT16 capCode, const CapOneVal& cap); #ifdef Q_OS_WIN32 bool saveDIB(TW_MEMREF hImg, const QString& filename); #if QT_VERSION < QT_VERSION_CHECK(5, 0, 0) static bool eventFilter(void* message); #else class NativeEventFilter : public QAbstractNativeEventFilter { public: bool nativeEventFilter(const QByteArray& eventType, void* message, long* result); }; NativeEventFilter m_eventFilter; #endif #endif static PASCAL TW_UINT16 callback(TW_IDENTITY* origin, TW_IDENTITY* dest, TW_UINT32 DG, TW_UINT16 DAT, TW_UINT16 MSG, TW_MEMREF data); static inline float fix32ToFloat(TW_FIX32 fix32); static inline TW_FIX32 floatToFix32(float float32); }; typedef ScannerTwain ScannerImpl; #endif // SCANNER_TWAIN_HH gImageReader-3.2.3/updateTranslations.sh000077500000000000000000000014731312567024200202650ustar00rootroot00000000000000#!/bin/sh cd "$(dirname "$(readlink -f "$0")")" # Generate POTFILES.in echo "Updating POTFILES.in..." echo "# List of source files containing translatable strings." > po/POTFILES.in echo "" >> po/POTFILES.in find gtk/data/ -type f -name *.ui -printf '[type: gettext/glade]%p\n' | sort >> po/POTFILES.in find gtk/src/ -type f \( -name *.hh -or -name *.cc \) -print | sort >> po/POTFILES.in find qt/data/ -type f -name *.ui -printf '[type: gettext/qtdesigner]%p\n' | sort >> po/POTFILES.in find qt/src/ -type f \( -name *.hh -or -name *.cc \) -print | sort >> po/POTFILES.in # Update POT and PO files ( cd po echo "Updating gimagereader.pot..." intltool-update --gettext-package=gimagereader --pot while read lang; do echo "Updating $lang.po..." intltool-update --gettext-package=gimagereader $lang done < LINGUAS )