pax_global_header00006660000000000000000000000064135174062740014523gustar00rootroot0000000000000052 comment=17fa17abe82086a91863b982caacca3221209d03 gImageReader-3.3.1/000077500000000000000000000000001351740627400140435ustar00rootroot00000000000000gImageReader-3.3.1/.gitignore000066400000000000000000000000061351740627400160270ustar00rootroot00000000000000build gImageReader-3.3.1/.lgtm.yml000066400000000000000000000003111351740627400156020ustar00rootroot00000000000000extraction: cpp: prepare: packages: - python3-gi configure: command: - mkdir _lgtm_build_dir - cd _lgtm_build_dir - cmake -DINTERFACE_TYPE=gtk .. gImageReader-3.3.1/AUTHORS000066400000000000000000000000421351740627400151070ustar00rootroot00000000000000Sandro Mani gImageReader-3.3.1/CMakeLists.txt000066400000000000000000000341661351740627400166150ustar00rootroot00000000000000CMAKE_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.3.1) 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(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) PKG_CHECK_MODULES(ddjvuapi REQUIRED ddjvuapi) PKG_CHECK_MODULES(PODOFO libpodofo) 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(NOT PODOFO_FOUND) MESSAGE(WARNING "Using hardcoded cflags and ldflags for podofo") SET(PODOFO_INCLUDE_DIRS /usr/include/) SET(PODOFO_LDFLAGS -lpodofo) ENDIF(NOT PODOFO_FOUND) IF(UNIX) PKG_CHECK_MODULES(SANE sane-backends) ENDIF(UNIX) FIND_PROGRAM(INTLTOOL_MERGE_EXECUTABLE intltool-merge) IF(NOT INTLTOOL_MERGE_EXECUTABLE) MESSAGE(FATAL_ERROR "Couldn't find intltool-merge, please install intltool") ENDIF(NOT INTLTOOL_MERGE_EXECUTABLE) PKG_CHECK_MODULES(ENCHANT enchant-2) IF(ENCHANT_FOUND) ADD_DEFINITIONS(-DHAVE_ENCHANT2) ELSE(ENCHANT_FOUND) PKG_CHECK_MODULES(ENCHANT REQUIRED enchant) IF(ENCHANT_VERSION VERSION_GREATER_EQUAL 2) ADD_DEFINITIONS(-DHAVE_ENCHANT2) ENDIF() ENDIF(ENCHANT_FOUND) INCLUDE_DIRECTORIES( ${CMAKE_SOURCE_DIR}/common ${CMAKE_BINARY_DIR} ${TESSERACT_INCLUDE_DIRS} ${SANE_INCLUDE_DIRS} ${ENCHANT_INCLUDE_DIRS} ${PODOFO_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 libxml++-3.0) IF(LIBXMLPP_FOUND) ADD_DEFINITIONS(-DHAVE_LIBXMLPP_3) ELSE() PKG_CHECK_MODULES(LIBXMLPP2 REQUIRED libxml++-2.6) ADD_DEFINITIONS(-DHAVE_LIBXMLPP_2) SET(LIBXMLPP_INCLUDE_DIRS ${LIBXMLPP2_INCLUDE_DIRS}) SET(LIBXMLPP_LDFLAGS ${LIBXMLPP2_LDFLAGS}) ENDIF() PKG_CHECK_MODULES(LIBZIP REQUIRED libzip) 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) PKG_CHECK_MODULES(UUID REQUIRED uuid) 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} ${LIBZIP_INCLUDE_DIRS} ${UUID_INCLUDE_DIRS} ) SET(gimagereader_LIBS ${GTKMM_LDFLAGS} ${GTKSOURCEVIEWMM_LDFLAGS} ${GTKSPELLMM_LDFLAGS} ${CAIROMM_LDFLAGS} ${PANGOMM_LDFLAGS} ${POPPLER_LDFLAGS} ${JSONGLIB_LDFLAGS} ${LIBXMLPP_LDFLAGS} ${LIBJPEG_LDFLAGS} ${FONTCONFIG_LDFLAGS} ${LIBZIP_LDFLAGS} ${UUID_LDFLAGS} ) SET(srcdir "gtk") ELSEIF("${INTERFACE_TYPE}" STREQUAL "qt4") SET(CMAKE_AUTOMOC ON) FIND_PACKAGE(Qt4 REQUIRED) FIND_PACKAGE(QuaZip) IF(NOT QUAZIP_FOUND) FIND_PATH(QUAZIP_INCLUDE_DIR NAME quazipfile.h PATH_SUFFIXES quazip) FIND_LIBRARY(QUAZIP_LIBRARIES quazip) IF(NOT QUAZIP_INCLUDE_DIR OR NOT QUAZIP_LIBRARIES) MESSAGE(FATAL_ERROR "QuaZip is required but was not found") ENDIF() ENDIF() 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} ${QUAZIP_INCLUDE_DIR}) SET(gimagereader_LIBS ${QTSPELL_LDFLAGS} ${POPPLER_LDFLAGS} ${QJSON_LDFLAGS} ${QUAZIP_LIBRARIES}) 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) FIND_PACKAGE(QuaZip5) IF(NOT QUAZIP_FOUND) FIND_PATH(QUAZIP_INCLUDE_DIR NAME quazipfile.h PATH_SUFFIXES quazip5) FIND_LIBRARY(QUAZIP_LIBRARIES quazip5) IF(NOT QUAZIP_INCLUDE_DIR OR NOT QUAZIP_LIBRARIES) MESSAGE(FATAL_ERROR "QuaZip5 is required but was not found") ENDIF() ENDIF() 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} ${QUAZIP_INCLUDE_DIR}) SET(gimagereader_LIBS ${QTSPELL_LDFLAGS} ${POPPLER_LDFLAGS} ${QUAZIP_LIBRARIES}) SET(srcdir "qt") ELSE() MESSAGE(FATAL_ERROR "Invalid interface type ${INTERFACE_TYPE}") ENDIF() INCLUDE_DIRECTORIES( ${CMAKE_SOURCE_DIR}/${srcdir}/src/ ${CMAKE_SOURCE_DIR}/${srcdir}/src/hocr/ ) # Files # sort lists to avoid dependency on readdir() order and make build reproducible FILE(GLOB gimagereader_SRCS ${srcdir}/src/*.cc ${srcdir}/src/hocr/*.cc common/*.cc ) LIST(SORT gimagereader_SRCS) FILE(GLOB gimagereader_HDRS ${srcdir}/src/*.hh ${srcdir}/src/hocr/*.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) # Generate resources IF("${srcdir}" STREQUAL "gtk") ADD_SCHEMA("gtk/data/org.gnome.gimagereader.gschema.xml") ADD_CUSTOM_COMMAND( OUTPUT ${CMAKE_BINARY_DIR}/gimagereader.gresource.c COMMAND glib-compile-resources gimagereader.gresource.xml ARGS --target=${CMAKE_BINARY_DIR}/gimagereader.gresource.c --generate-source WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}/gtk/data/ DEPENDS ${gimagereader_FORMS}) LIST(APPEND gimagereader_SRCS ${CMAKE_BINARY_DIR}/gimagereader.gresource.c) # Just to allow running the application from the build tree (via XDG_DATA_DIRS=$PWD:$XDG_DATA_DIRS ./gimagereader-gtk) ADD_CUSTOM_COMMAND( OUTPUT ${CMAKE_BINARY_DIR}/glib-2.0/schemas/gschemas.compiled COMMAND ${CMAKE_COMMAND} ARGS -E copy ${CMAKE_SOURCE_DIR}/gtk/data/org.gnome.gimagereader.gschema.xml ${CMAKE_BINARY_DIR}/glib-2.0/schemas/org.gnome.gimagereader.gschema.xml COMMAND glib-compile-schemas ARGS ${CMAKE_BINARY_DIR}/glib-2.0/schemas/ DEPENDS ${CMAKE_SOURCE_DIR}/gtk/data/org.gnome.gimagereader.gschema.xml ) SET(gimagereader_RESOURCES_RCC ${CMAKE_BINARY_DIR}/glib-2.0/schemas/gschemas.compiled) FOREACH(form ${gimagereader_FORMS}) GET_FILENAME_COMPONENT(outfile ${form} NAME_WE) SET(outfile ${CMAKE_BINARY_DIR}/ui_${outfile}.hh) ADD_CUSTOM_COMMAND( OUTPUT ${outfile} COMMAND python3 ARGS ${CMAKE_SOURCE_DIR}/gtk/data/uigen.py ${form} WORKING_DIRECTORY ${CMAKE_BINARY_DIR} DEPENDS ${form} ) LIST(APPEND gimagereader_FORMS_HEADERS ${outfile}) ENDFOREACH() ELSEIF("${srcdir}" STREQUAL "qt") IF("${INTERFACE_TYPE}" STREQUAL "qt4") QT4_ADD_RESOURCES(gimagereader_RESOURCES_RCC ${gimagereader_RESOURCES}) SET(UIC_EXECUTABLE ${QT_UIC_EXECUTABLE}) ELSEIF("${INTERFACE_TYPE}" STREQUAL "qt5") QT5_ADD_RESOURCES(gimagereader_RESOURCES_RCC ${gimagereader_RESOURCES}) SET(UIC_EXECUTABLE Qt5::uic) ENDIF() # Custom WRAP_UI which also gettext-izes the result MESSAGE(${CMAKE_COMMAND}) FOREACH(form ${gimagereader_FORMS}) GET_FILENAME_COMPONENT(outfile ${form} NAME_WE) SET(outfile ${CMAKE_BINARY_DIR}/ui_${outfile}.h) ADD_CUSTOM_COMMAND( OUTPUT ${outfile} COMMAND ${UIC_EXECUTABLE} ARGS -o ${outfile} ${form} COMMAND ${CMAKE_COMMAND} ARGS -P ${CMAKE_SOURCE_DIR}/cmake/gettextizeui.cmake ${outfile} DEPENDS ${form} ) LIST(APPEND gimagereader_FORMS_HEADERS ${outfile}) ENDFOREACH() SET_PROPERTY(SOURCE ${gimagereader_FORMS_HEADERS} PROPERTY SKIP_AUTOMOC ON) SET_PROPERTY(SOURCE ${gimagereader_RESOURCES_RCC} PROPERTY SKIP_AUTOMOC ON) ENDIF() # Process translations 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}) # Process desktop file CONFIGURE_FILE(data/gimagereader.desktop.in data/gimagereader-${INTERFACE_TYPE}.desktop.in @ONLY) # add translations to desktop file ADD_CUSTOM_COMMAND( OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/data/gimagereader-${INTERFACE_TYPE}.desktop COMMAND ${INTLTOOL_MERGE_EXECUTABLE} --desktop-style ${CMAKE_SOURCE_DIR}/po ${CMAKE_CURRENT_BINARY_DIR}/data/gimagereader-${INTERFACE_TYPE}.desktop.in ${CMAKE_CURRENT_BINARY_DIR}/data/gimagereader-${INTERFACE_TYPE}.desktop DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/data/gimagereader-${INTERFACE_TYPE}.desktop.in) ADD_CUSTOM_TARGET(desktop_file ALL DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/data/gimagereader-${INTERFACE_TYPE}.desktop) 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} ${gimagereader_FORMS_HEADERS} ${gimagereader_RESOURCES_RCC} ) TARGET_LINK_LIBRARIES(gimagereader ${TESSERACT_LDFLAGS} ${gimagereader_LIBS} ${SANE_LDFLAGS} ${ddjvuapi_LDFLAGS} ${ENCHANT_LDFLAGS} ${PODOFO_LDFLAGS} -ldl ) FIND_PACKAGE(OpenMP REQUIRED) SET (CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${OpenMP_C_FLAGS}") SET (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${OpenMP_CXX_FLAGS}") 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) ELSEIF("${INTERFACE_TYPE}" STREQUAL "qt5") TARGET_LINK_LIBRARIES(gimagereader Qt5::Widgets Qt5::Network Qt5::DBus Qt5::Xml Qt5::PrintSupport) 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/metainfo) 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.3.1/COPYING000066400000000000000000001045141351740627400151030ustar00rootroot00000000000000 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.3.1/LATEST000066400000000000000000000000061351740627400147560ustar00rootroot000000000000003.3.1 gImageReader-3.3.1/NEWS000066400000000000000000000241221351740627400145430ustar00rootroot00000000000000gImageReader 3.3.1 (Jul 28 2019): * HOCR: propagate attributes to manually added elements (@foghawk) * HOCR: improve spelling of hyphenated words (@foghawk) * HOCR: improve spelling of words with special characters (@foghawk) * HOCR: allow specifying a DPI to assume for image sources when exporting to PDF (@foghawk) * HOCR: allow use to choose whether to sanitize hyphens when exporting to PDF * HOCR: Attempt to map 639-2 language codes to ISO 639-1 to set spelling language * Allow specifying character whitelist / blacklist for recognition * Various bugfixes * Translation updates * Full details in commit log: https://github.com/manisandro/gImageReader/commits/master gImageReader 3.3.0 (Sep 26 2018): * Support tesseract-4.0.0 * Translation updates * See 3.2.9x changelogs for all other feature changes since previous stable * Full details in commit log: https://github.com/manisandro/gImageReader/commits/master gImageReader 3.2.99 (Feb 24 2018): * gImageReader 3.3 beta * Add support for reading DJVU documents * Add support for encrypted PDF files * Rewrite HOCR editor and greatly expand its functionality: - Allow displaying confidence values in HOCR tree - Allow clicking in the canvas to jump to the corresponding item in the HOCR tree - Support mass-editing of HOCR child item attributes from parent - Honour font family attributes if possible - Honour and allow toggling bold and italic attributes - Correctly honour the baseline - Add search/replace and substitution list support - Add preview mode while editing - Allow manually adding lines, words and paragraphs - Allow swapping items - Automatically adjust parent bounding boxes when resizing and removing children - Add navigation toolbar to facilitate navigating through the HOCR tree - Use relative paths to source files in HOCR HTML document if source files are on same level or below the HOCR file - Add export to text - Add export to ODT - Allow choosing paper size in PDF export - Allow setting document metadata in PDF export - Allow setting encryption in PDF export - [Qt] Allow using QPrinter as PDF export backend, which has better support for complex scripts 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 hyphen 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 * Possibility 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.3.1/README.md000066400000000000000000000062511351740627400153260ustar00rootroot00000000000000[![Translation status](https://hosted.weblate.org/widgets/gimagereader/-/svg-badge.svg)](https://hosted.weblate.org/engage/gimagereader/?utm_source=widget) [![Language grade: C/C++](https://img.shields.io/lgtm/grade/cpp/g/manisandro/gImageReader.svg?logo=lgtm&logoWidth=18)](https://lgtm.com/projects/g/manisandro/gImageReader/context:cpp) gImageReader ============ 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 the [community repositories](https://www.archlinux.org/packages/community/x86_64/gimagereader/) 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. Translating: -------------- gImageReader translations are hosted on [weblate](https://hosted.weblate.org/projects/gimagereader/) and are periodically merged into master. gImageReader-3.3.1/astyle.options000066400000000000000000000002531351740627400167610ustar00rootroot00000000000000--preserve-date --indent-preprocessor --style=java --indent=tab#4 --suffix=none --pad-oper --align-pointer=type --align-reference=type --add-braces --keep-one-line-blocks gImageReader-3.3.1/cmake/000077500000000000000000000000001351740627400151235ustar00rootroot00000000000000gImageReader-3.3.1/cmake/GSettings.cmake000066400000000000000000000041321351740627400200340ustar00rootroot00000000000000# 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) if("${_glib_comple_schemas}" STREQUAL "") MESSAGE(FATAL_ERROR "Could not find glib_compile_schemas") endif() 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.3.1/cmake/gettextizeui.cmake000066400000000000000000000010231351740627400206530ustar00rootroot00000000000000# 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.3.1/common/000077500000000000000000000000001351740627400153335ustar00rootroot00000000000000gImageReader-3.3.1/common/CCITTFax4Encoder.cc000066400000000000000000000351301351740627400205350ustar00rootroot00000000000000/* -*- 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-2019 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; std::vector whiteline(rowbytes, 0); const uint8_t* refline = whiteline.data(); 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.3.1/common/CCITTFax4Encoder.hh000066400000000000000000000043521351740627400205510ustar00rootroot00000000000000/* -*- 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-2019 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.3.1/common/LangTables.hh000066400000000000000000000327341351740627400177010ustar00rootroot00000000000000/* -*- Mode: C++; indent-tabs-mode: t; c-basic-offset: 4; tab-width: 4 -*- */ /* * LangTables.hh * Copyright (C) 2013-2019 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 LANGTABLES_HH #define LANGTABLES_HH namespace LangTables { template Container languages(const std::function& utf8str) { return Container { // See https://en.wikipedia.org/wiki/List_of_language_names // {ISO 639-2, ISO 639-1, name} {"afr", "af", utf8str("Afrikaans")}, // Afrikaans {"amh", "am", utf8str("\u12A3\u121B\u122D\u129B")}, // Amharic {"ara", "ar", utf8str("\u0627\u0644\u0644\u063A\u0629 \u0627\u0644\u0639\u0631\u0628\u064A\u0629")}, // Arabic {"asm", "as", utf8str("\u0985\u09B8\u09AE\u09C0\u09AF\u09BC\u09BE")}, // Assamese {"aze", "az", utf8str("\u0622\u0630\u0631\u0628\u0627\u06CC\u062C\u0627\u0646 \u062F\u06CC\u0644\u06CC")}, // Azerbaijani {"aze_cyrl", "az", utf8str("Az\u0259rbaycanca")}, // Azerbaijani (Cyrillic) {"bel", "be", utf8str("\u0411\u0435\u043B\u0430\u0440\u0443\u0441\u043A\u0430\u044F")}, // Belarusian {"ben", "bn", utf8str("\u09AC\u09BE\u0982\u09B2\u09BE")}, // Bengali {"bod", "bo", utf8str("\u0F51\u0F56\u0F74\u0F66\u0F0B\u0F66\u0F90\u0F51\u0F0B")}, // "Tibetan (Standard)" {"bos", "bs", utf8str("Bosanski")}, // Bosnian {"bre", "bs", utf8str("Brezhoneg")}, // Breton {"bul", "bg", utf8str("\u0431\u044A\u043B\u0433\u0430\u0440\u0441\u043A\u0438 \u0435\u0437\u0438\u043A")}, // Bulgarian {"cat", "ca", utf8str("Catal\u00E0")}, // Catalan {"ceb", "", utf8str("Bisaya")}, // Cebuano {"ces", "cs", utf8str("\u010Ce\u0161tina")}, // Czech {"chi_sim", "zh_CN", utf8str("\u7b80\u4f53\u5b57 ")}, // Chinese (Simplified) {"chi_sim_vert", "zh_CN", utf8str("\u7b80\u4f53\u5b57 \u7EB5")}, // Chinese (Simplified, Vertical) {"chi_tra", "zh_TW", utf8str("\u7e41\u9ad4\u5b57")}, // Chinese (Traditional) {"chi_tra_vert", "zh_TW", utf8str("\u7e41\u9ad4\u5b57 \u7EB5")}, // Chinese (Traditional, Vertical) {"chr", "", utf8str("\u13E3\u13B3\u13A9")}, // Cherokee {"cos", "co", utf8str("Corsu")}, // Corsican {"cym", "cy", utf8str("Cymraeg")}, // Welsh {"dan", "da", utf8str("Dansk")}, // Danish {"dan_frak", "da", utf8str("Dansk (Fraktur)")}, // Danish (Fraktur) {"deu", "de", utf8str("Deutsch")}, // German {"deu_frak", "de", utf8str("Deutsch (Fraktur)")}, // German (Fraktur) {"div", "dv", utf8str("\u078B\u07A8\u0788\u07AC\u0780\u07A8")}, // Dhivehi {"dzo", "dz", utf8str("\u0F62\u0FAB\u0F7C\u0F44\u0F0B\u0F41\u0F0B")}, // Dzongkha {"ell", "el", utf8str("\u0395\u03BB\u03BB\u03B7\u03BD\u03B9\u03BA\u03AC")}, // Greek {"eng", "en", utf8str("English")}, {"enm", "en", utf8str("Middle English (1100-1500)")}, // Middle English (1100-1500) {"epo", "eo", utf8str("Esperanto")}, // Esperanto {"equ", "", utf8str("Math / Equations")}, // Math / equation {"est", "et", utf8str("Eesti")}, // Estonian {"eus", "eu", utf8str("Euskara")}, // Basque {"fas", "fa", utf8str("\u0641\u0627\u0631\u0633\u06CC")}, // Persian (Farsi) {"fao", "fo", utf8str("F\u00F8royskt")}, // Faroese {"fil", "", utf8str("Wikang Filipino")}, // Filipino {"fin", "fi", utf8str("Suomi")}, // Finnish {"fra", "fr", utf8str("Fran\u00E7ais")}, // French {"frk", "", utf8str("Frankish")}, // Frankish {"frm", "fr", utf8str("Moyen fran\u00E7ais (ca. 1400-1600)")}, // Middle French (ca. 1400-1600) {"fry", "fy", utf8str("Frysk")}, // Frisian (West) {"gla", "gd", utf8str("G\u00E0idhlig")}, // Scottish Gaelic {"gle", "ga", utf8str("Gaeilge")}, // Irish {"glg", "gl", utf8str("Galego")}, // Galician {"grc", "el", utf8str("\u1f19\u03bb\u03bb\u03b7\u03bd\u03b9\u03ba\u03ae")}, // Ancient Greek {"guj", "gu", utf8str("\u0A97\u0AC1\u0A9C\u0AB0\u0ABE\u0AA4\u0AC0")}, // Gujarati {"hat", "ht", utf8str("Krey\u00F2l Ayisyen")}, // Haitian {"heb", "he", utf8str("\u05E2\u05D1\u05E8\u05D9\u05EA\u202C")}, // Hebrew {"hin", "hi", utf8str("\u0939\u093F\u0928\u094D\u0926\u0940")}, // Hindi {"hrv", "hr", utf8str("Hrvatski")}, // Croatian {"hun", "hu", utf8str("Magyar")}, // Hungarian {"hye", "hy", utf8str("\u0540\u0561\u0575\u0565\u0580\u0565\u0576")}, // Armenian {"iku", "iu", utf8str("\u1403\u14C4\u1483\u144E\u1450\u1466")}, // Inuktitut {"ind", "id", utf8str("Bahasa Indonesia")}, // Indonesian {"isl", "is", utf8str("\u00CDslenska")}, // Icelandic {"ita", "it", utf8str("Italiano")}, // Italian {"ita_old", "it", utf8str("Italiano (Antico)")}, // Italian (Old) {"jav", "jv", utf8str("Basa jawa")}, // Javanese {"jpn", "ja", utf8str("\uA9A7\uA9B1\uA997\uA9AE")}, // Japanese {"jpn_vert", "ja", utf8str("\uA9A7\uA9B1\uA997\uA9AE \u5782\u76F4")}, // Japanese (Vertical) {"kan", "kn", utf8str("\u0C95\u0CA8\u0CCD\u0CA8\u0CA1")}, // Kannada {"kat", "ka", utf8str("\u10E5\u10D0\u10E0\u10D7\u10E3\u10DA\u10D8")}, // Georgian {"kat_old", "ka", utf8str("\u10d4\u10dc\u10d0\u10f2 \u10e5\u10d0\u10e0\u10d7\u10e3\u10da\u10d8")}, // Georgian (Old) {"kaz", "kk", utf8str("\u049A\u0430\u0437\u0430\u049B T\u0456\u043B\u0456")}, // Kazakh {"khm", "km", utf8str("\u1797\u17B6\u179F\u17B6\u1781\u17D2\u1798\u17C2\u179A")}, // Khmer {"kir", "ky", utf8str("\u041a\u044b\u0440\u0433\u044b\u0437\u0447\u0430")}, // Kyrgyz {"kor", "ko", utf8str("\uD55C\uAD6D\uC5B4")}, // Korean {"kor_vert", "ko", utf8str("\uD55C\uAD6D\uC5B4 \uC218\uC9C1\uC120")}, // Korean (Vertical) {"kur", "ku", utf8str("Kurd\u00ED")}, // Kurdish {"kur_ara", "ku", utf8str("\u06A9\u0648\u0631\u062F\u06CC")}, // Kurdish (Arabic) {"lao", "lo", utf8str("\u0E9E\u0EB2\u0EAA\u0EB2\u0EA5\u0EB2\u0EA7")}, // Lao {"lat", "la", utf8str("Latina")}, // Latin {"lav", "lv", utf8str("Latvie\u0161u")}, // Latvian {"lit", "lt", utf8str("Lietuvi\u0173")}, // Lithuanian {"ltz", "lb", utf8str("L\u00EBtzebuergesch")}, // Luxembourgish {"mal", "ml", utf8str("\u0D2E\u0D32\u0D2F\u0D3E\u0D33\u0D02")}, // Malayalam {"mar", "mr", utf8str("\u092E\u0930\u093E\u0920\u0940")}, // Marathi {"mkd", "mk", utf8str("M\u0430\u043A\u0435\u0434\u043E\u043D\u0441\u043A\u0438")}, // Macedonian {"mlt", "mt", utf8str("Malti")}, // Maltese {"mon", "mn", utf8str("\u041C\u043E\u043D\u0433\u043E\u043B \u0425\u044D\u043B")}, // Mongolian {"mri", "mi", utf8str("te Reo M\u0101ori")}, // Maori {"msa", "ms", utf8str("Bahasa Melayu")}, // Malay {"mya", "my", utf8str("\u1019\u103C\u1014\u103A\u1019\u102C\u1005\u102C")}, // Burmese {"nep", "ne", utf8str("\u0928\u0947\u092A\u093E\u0932\u0940")}, // Nepali {"nld", "nl", utf8str("Nederlands")}, // Dutch {"nor", "no", utf8str("Norsk")}, // Norwegian {"oci", "oc", utf8str("Occitan")}, // Occitan {"ori", "or", utf8str("\u0b13\u0b21\u0b3c\u0b3f\u0b06")}, // Oriya {"pan", "pa", utf8str("\u0A2A\u0A70\u0A1C\u0A3E\u0A2C\u0A40")}, // Punjabi {"pol", "pl", utf8str("Polski")}, // Polish {"por", "pt", utf8str("Portugu\u00EAs")}, // Portuguese {"pus", "ps", utf8str("\u067E\u069A\u062A\u0648")}, // Pashto {"que", "qu", utf8str("Runasimi")}, // Quechuan {"ron", "ro", utf8str("Rom\u00E2n\u0103")}, // Romanian {"rus", "ru", utf8str("\u0420\u0443\u0441\u0441\u043A\u0438\u0439")}, // Russian {"san", "sa", utf8str("\u0938\u0902\u0938\u094D\u0915\u0943\u0924\u092E\u094D")}, // Sanskrit {"sin", "si", utf8str("\u0DC3\u0DD2\u0D82\u0DC4\u0DBD")}, // Sinhala {"slk", "sk", utf8str("Sloven\u010Dina")}, // Slovak {"slk_frak", "sk", utf8str("Sloven\u010Dina (Frakt\u00far)")}, // Slovak (Fraktur) {"slv", "sl", utf8str("Sloven\u0161\u010Dina")}, // Slovene {"snd", "sd", utf8str("\u0633\u0646\u068C\u064A")}, // Sindhi {"spa", "es", utf8str("Espa\u00F1ol")}, // Spanish {"spa_old", "es", utf8str("Espa\u00F1ol (Antiguo)")}, // Spanish (Old) {"sqi", "sq", utf8str("Shqip")}, // Albanian {"srp", "sr", utf8str("\u0421\u0440\u043F\u0441\u043A\u0438")}, // Serbian {"srp_latn", "sr", utf8str("Srpski")}, // Serbian (Latin) {"sun", "su", utf8str("\u1B98\u1B9E \u1B9E\u1BA5\u1B94\u1BAA\u1B93")}, // Sundanese {"swa", "sw", utf8str("Kiswahili")}, // Swahili {"swe", "sv", utf8str("Svenska")}, // Swedish {"syr", "", utf8str("\u0720\u072b\u0722\u0710 \u0723\u0718\u072a\u071d\u071d\u0710")}, // Syriac {"tam", "ta", utf8str("\u0BA4\u0BAE\u0BBF\u0BB4\u0BCD")}, // Tamil {"tat", "tt", utf8str("Tatar\u00E7a")}, // Tatar {"tel", "te", utf8str("\u0C24\u0C46\u0C32\u0C41\u0C17\u0C41")}, // Telugu {"tgk", "tg", utf8str("\u0442\u043e\u04b7\u0438\u043a\u04e3")}, // Tajik {"tgl", "tl", utf8str("\u170A\u170A\u170C\u1712")}, // Tagalog {"tha", "th", utf8str("\u0E20\u0E32\u0E29\u0E32\u0E44\u0E17\u0E22")}, // Thai {"tir", "ti", utf8str("\u1275\u130D\u122D\u129B")}, // Tigrinya {"ton", "to", utf8str("Lea faka-Tonga")}, // Tongan {"tur", "tr", utf8str("T\u00FCrk\u00E7e")}, // Turkish {"uig", "ug", utf8str("\u0626\u06C7\u064A\u063A\u06C7\u0631 \u062A\u0649\u0644\u0649")}, // Uyghur {"ukr", "uk", utf8str("\u0423\u043A\u0440\u0430\u0457\u043D\u0441\u044C\u043A\u0430")}, // Ukrainian {"urd", "ur", utf8str("\u0627\u064F\u0631\u062F\u064F\u0648")}, // Urdu {"uzb", "uz", utf8str("\u0627\u0648\u0632\u0628\u06CC\u06A9")}, // Uzbek {"uzb_cyrl", "uz", utf8str("\u040E\u0437\u0431\u0435\u043A")}, // Uzbek (Cyrillic) {"vie", "vi", utf8str("Ti\u1EBFng Vi\u1EC7t Nam")}, // Vietnamese {"yid", "yi", utf8str("\u05D9\u05D9\u05B4\u05D3\u05D9\u05E9 \u05D9\u05D9\u05B4\u05D3\u05D9\u05E9\u202C")}, // Yiddish {"yor", "yo", utf8str("\u00C8d\u00E8 Yor\u00F9b\u00E1")}, // Yoruba }; } template Container languageCultures() { return Container{ {"af", "af_ZA"}, {"ar", "ar_AE"}, {"ar", "ar_BH"}, {"ar", "ar_DZ"}, {"ar", "ar_EG"}, {"ar", "ar_IQ"}, {"ar", "ar_JO"}, {"ar", "ar_KW"}, {"ar", "ar_LB"}, {"ar", "ar_LY"}, {"ar", "ar_MA"}, {"ar", "ar_OM"}, {"ar", "ar_QA"}, {"ar", "ar_SA"}, {"ar", "ar_SY"}, {"ar", "ar_TN"}, {"ar", "ar_YE"}, {"az", "az_AZ"}, {"az", "az_AZ"}, {"be", "be_BY"}, {"bg", "bg_BG"}, {"br", "br_FR"}, {"ca", "ca_ES"}, {"co", "co_FR"}, {"co", "co_IT"}, {"cs", "cs_CZ"}, {"da", "da_DK"}, {"de", "de_AT"}, {"de", "de_CH"}, {"de", "de_DE"}, {"de", "de_LI"}, {"de", "de_LU"}, {"div", "div_MV"}, {"dv", "dv_MV"}, {"el", "el_GR"}, {"en", "en_AU"}, {"en", "en_BZ"}, {"en", "en_CA"}, {"en", "en_CB"}, {"en", "en_GB"}, {"en", "en_IE"}, {"en", "en_JM"}, {"en", "en_NZ"}, {"en", "en_PH"}, {"en", "en_TT"}, {"en", "en_US"}, {"en", "en_ZA"}, {"en", "en_ZW"}, {"es", "es_AR"}, {"es", "es_BO"}, {"es", "es_CL"}, {"es", "es_CO"}, {"es", "es_CR"}, {"es", "es_DO"}, {"es", "es_EC"}, {"es", "es_ES"}, {"es", "es_GT"}, {"es", "es_HN"}, {"es", "es_MX"}, {"es", "es_NI"}, {"es", "es_PA"}, {"es", "es_PE"}, {"es", "es_PR"}, {"es", "es_PY"}, {"es", "es_SV"}, {"es", "es_UY"}, {"es", "es_VE"}, {"et", "et_EE"}, {"eu", "eu_ES"}, {"fa", "fa_IR"}, {"fi", "fi_FI"}, {"fo", "fo_FO"}, {"fr", "fr_BE"}, {"fr", "fr_CA"}, {"fr", "fr_CH"}, {"fr", "fr_FR"}, {"fr", "fr_LU"}, {"fr", "fr_MC"}, {"fo", "fo_FO"}, {"fo", "fo_DK"}, {"fy", "fy_NL"}, {"gd", "gd_GB"}, {"gd", "gd_CA"}, {"gl", "gl_ES"}, {"gu", "gu_IN"}, {"he", "he_IL"}, {"hi", "hi_IN"}, {"hr", "hr_HR"}, {"hu", "hu_HU"}, {"hy", "hy_AM"}, {"id", "id_ID"}, {"is", "is_IS"}, {"it", "it_CH"}, {"it", "it_IT"}, {"ja", "ja_JP"}, {"ka", "ka_GE"}, {"kk", "kk_KZ"}, {"kn", "kn_IN"}, {"kok", "kok_IN"}, {"ko", "ko_KR"}, {"ku", "ku_IQ"}, {"ky", "ky_KZ"}, {"lb", "lb_LU"}, {"lt", "lt_LT"}, {"lv", "lv_LV"}, {"mi", "mi_NZ"}, {"mk", "mk_MK"}, {"mn", "mn_MN"}, {"mn", "mn_CN"}, {"mr", "mr_IN"}, {"ms", "ms_BN"}, {"ms", "ms_MY"}, {"nb", "nb_NO"}, {"nl", "nl_BE"}, {"nl", "nl_NL"}, {"nn", "nn_NO"}, {"oc", "oc_ES"}, {"pa", "pa_IN"}, {"pl", "pl_PL"}, {"pt", "pt_BR"}, {"pt", "pt_PT"}, {"qu", "qu_PE"}, {"ro", "ro_RO"}, {"ru", "ru_RU"}, {"sa", "sa_IN"}, {"sd", "sd_PK"}, {"sd", "sd_IN"}, {"sk", "sk_SK"}, {"sl", "sl_SI"}, {"sq", "sq_AL"}, {"sr", "sr_SP"}, {"sr", "sr_SP"}, {"su", "su_ID"}, {"sv", "sv_FI"}, {"sv", "sv_SE"}, {"sw", "sw_KE"}, {"syr", "syr_SY"}, {"ta", "ta_IN"}, {"te", "te_IN"}, {"th", "th_TH"}, {"to", "to_TO"}, {"tr", "tr_TR"}, {"tt", "tt_RU"}, {"uk", "uk_UA"}, {"ur", "ur_PK"}, {"uz", "uz_UZ"}, {"uz", "uz_UZ"}, {"vi", "vi_VN"}, {"yo", "yo_NR"}, {"zh", "zh_CHS"}, {"zh", "zh_CHT"}, {"zh", "zh_CN"}, {"zh", "zh_HK"}, {"zh", "zh_MO"}, {"zh", "zh_SG"}, {"zh", "zh_TW"}, }; } } #endif // LANGTABLES_HH gImageReader-3.3.1/common/PaperSize.cc000066400000000000000000000146131351740627400175510ustar00rootroot00000000000000/* -*- Mode: C++; indent-tabs-mode: t; c-basic-offset: 4; tab-width: 4 -*- */ /* * PaperSize.cc * Copyright (C) 2017-2018 Alexander Zaitsev * * 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 "PaperSize.hh" #include #include #include #include #include template bool PaperSize::Size::operator<(const Size &val){ return std::tie(width, height) < std::tie(val.width, val.height); } PaperSize::Size PaperSize::getSize(PaperSize::Unit unit, const std::string& format, bool landscape) { auto result = std::find_if(paperSizes.begin(), paperSizes.end(), [&format](const std::pair>& val) { return val.first == format; }); if(result == paperSizes.end()) { return {0.0, 0.0}; } // Translate size into cm from mm Size formatResult = {static_cast(result->second.width) / 10.0, static_cast(result->second.height) / 10.0}; if(landscape) { std::swap(formatResult.width, formatResult.height); } if(unit == PaperSize::inch) { return {formatResult.width / CMtoInch, formatResult.height / CMtoInch}; } else /*if(unit == PaperSize::cm)*/ { return formatResult; } } const double PaperSize::CMtoInch = 2.54; const std::vector>> PaperSize::paperSizes = { // A type {"4A0", Size(1682, 2378)}, {"2A0", Size(1189, 1682)}, {"A0", Size(841, 1189)}, {"A1", Size(594, 841)}, {"A2", Size(420, 594)}, {"A3", Size(297, 420)}, {"A4", Size(210, 297)}, {"A5", Size(148, 210)}, {"A6", Size(105, 148)}, {"A7", Size(74, 105)}, {"A8", Size(52, 74)}, {"A9", Size(37, 52)}, {"A10", Size(26, 37)}, {"A11", Size(18, 26)}, {"A12", Size(13, 18)}, {"A13", Size(9, 13)}, // B type {"B0", Size(1000, 1414)}, {"B1", Size(707, 1000)}, {"B2", Size(500, 707)}, {"B3", Size(353, 500)}, {"B4", Size(250, 353)}, {"B5", Size(176, 250)}, {"B6", Size(125, 176)}, {"B7", Size(88, 125)}, {"B8", Size(62, 88)}, {"B9", Size(44, 62)}, {"B10", Size(31, 44)}, {"B11", Size(22, 31)}, {"B12", Size(15, 22)}, {"B13", Size(11, 15)}, // C type {"C0", Size(917, 1297)}, {"C1", Size(648, 917)}, {"C2", Size(458, 648)}, {"C3", Size(324, 458)}, {"C4", Size(229, 324)}, {"C5", Size(162, 229)}, {"C6", Size(114, 162)}, {"C7", Size(81, 114)}, {"C8", Size(57, 81)}, {"C9", Size(40, 57)}, {"C10", Size(28, 40)}, // D type. (German extension) {"D0", Size(771, 1090)}, {"D1", Size(545, 771)}, {"D2", Size(385, 545)}, {"D3", Size(272, 385)}, {"D4", Size(192, 272)}, {"D5", Size(136, 192)}, {"D6", Size(96, 136)}, {"D7", Size(68, 96)}, {"D8", Size(48, 68)}, {"D0 (China)", Size(764, 1064)}, {"D1 (China)", Size(532, 760)}, {"D2 (China)", Size(380, 528)}, {"D3 (China)", Size(264, 376)}, {"D4 (China)", Size(188, 260)}, {"D5 (China)", Size(130, 184)}, {"D6 (China)", Size(92, 126)}, {"RD0 (China)", Size(787, 1092)}, {"RD1 (China)", Size(546, 787)}, {"RD2 (China)", Size(393, 546)}, {"RD3 (China)", Size(273, 393)}, {"RD4 (China)", Size(196, 273)}, {"RD5 (China)", Size(136, 196)}, {"RD6 (China)", Size(98, 136)}, {"CAN P1", Size(560, 860)}, {"CAN P2", Size(430, 560)}, {"CAN P3", Size(280, 430)}, {"CAN P4", Size(215, 280)}, {"CAN P5", Size(140, 215)}, {"CAN P6", Size(107, 140)}, {"ANSI A", Size(216, 279)}, {"ANSI B", Size(279, 432)}, {"ANSI C", Size(432, 559)}, {"ANSI D", Size(559, 864)}, {"ANSI E", Size(864, 1118)}, {"Arch A/1", Size(229, 305)}, {"Arch B/2", Size(305, 457)}, {"Arch C/3", Size(457, 610)}, {"Arch D/4", Size(610, 914)}, {"Arch E/6", Size(914, 1219)}, {"Arch E1/5", Size(762, 1067)}, {"Arch E2", Size(660, 965)}, {"Arch E3", Size(686, 991)}, {"B0 (JIS)", Size(1030, 1456)}, {"B1 (JIS)", Size(728, 1030)}, {"B2 (JIS)", Size(515, 728)}, {"B3 (JIS)", Size(364, 515)}, {"B4 (JIS)", Size(257, 364)}, {"B5 (JIS)", Size(182, 257)}, {"B6 (JIS)", Size(128, 182)}, {"B7 (JIS)", Size(91, 128)}, {"B8 (JIS)", Size(64, 91)}, {"B9 (JIS)", Size(45, 64)}, {"B10 (JIS)", Size(32, 45)}, {"B11 (JIS)", Size(22, 32)}, {"B12 (JIS)", Size(16, 22)}, {"F0", Size(841, 1321)}, {"F1", Size(660, 841)}, {"F2", Size(420, 660)}, {"F3", Size(330, 420)}, {"F4", Size(210, 330)}, {"F5", Size(165, 210)}, {"F6", Size(105, 165)}, {"F7", Size(82, 105)}, {"F8", Size(52, 82)}, {"F9", Size(41, 52)}, {"F10", Size(26, 41)}, // North American paper sizes {"Letter", Size(216, 279)}, {"Legal", Size(216, 356)}, {"Tabloid", Size(279, 432)}, {"Ledger", Size(432, 279)}, {"Junior Legal", Size(127, 203)}, {"Half Letter/Memo", Size(140, 216)}, {"Government Letter", Size(203, 267)}, {"Government Legal", Size(216, 330)}, // Traditional British paper sizes {"Foolscap", Size(203, 330)}, {"Quarto", Size(203, 254)}, {"Imperial", Size(178, 229)}, {"Kings", Size(165, 203)}, {"Dukes", Size(140, 178)}, // Raw sizes {"RA0", Size(860, 1220)}, {"RA1", Size(610, 860)}, {"RA2", Size(430, 610)}, {"RA3", Size(305, 430)}, {"RA4", Size(215, 305)}, {"SRA0", Size(900, 1280)}, {"SRA1", Size(640, 900)}, {"SRA2", Size(450, 640)}, {"SRA3", Size(320, 450)}, {"SRA4", Size(225, 320)} }; gImageReader-3.3.1/common/PaperSize.hh000066400000000000000000000026001351740627400175540ustar00rootroot00000000000000/* -*- Mode: C++; indent-tabs-mode: t; c-basic-offset: 4; tab-width: 4 -*- */ /* * PaperSize.hh * Copyright (C) 2017-2018 Alexander Zaitsev * * 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 GIMAGEREADER_PAPERSIZE_HH #define GIMAGEREADER_PAPERSIZE_HH #include #include #include class PaperSize { public: template struct Size { Size(T width_ = 0, T height_ = 0) : width(width_), height(height_) {} bool operator<(const Size &val); T width, height; }; enum Unit { cm, inch }; static Size getSize(Unit unit, const std::string& format, bool landscape); static const double CMtoInch; static const std::vector>> paperSizes; }; // PaperSize #endif //GIMAGEREADER_PAPERSIZE_HH gImageReader-3.3.1/data/000077500000000000000000000000001351740627400147545ustar00rootroot00000000000000gImageReader-3.3.1/data/gimagereader.appdata.xml.in000066400000000000000000000066661351740627400221460ustar00rootroot00000000000000 gimagereader-@INTERFACE_TYPE@.desktop CC0-1.0 GPL-3.0+ gImageReader gImageReader A graphical (@INTERFACE_TYPE@) frontend to tesseract-ocr Grafická (@INTERFACE_TYPE@) nadstavba pro engine tesseract-ocr ocr optical recognition tesseract pdf @INTERFACE_TYPE@ ocr optické rozpoznávání tesseract pdf

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

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

  • Import PDF documents and images from disk, scanning devices, clipboard and screenshots
  • Import PDF dokumentů a obrázků z poÄítaÄe, skenovacích zařízení, schránky a snímků obrazovky
  • Process multiple images and documents in one go
  • Zpracování vícero obrázků a dokumentů naráz
  • Manual or automatic recognition area definition
  • RuÄní nebo automatická definice oblasti k rozpoznávání
  • Recognize to plain text or to hOCR documents
  • Rozpoznání do holého textu nebo hOCR dokumentů
  • Recognized text displayed directly next to the image
  • Rozpoznaný text je zobrazen hned vedle zdrojového obrázku
  • Post-process the recognized text, including spellchecking
  • Následné zpracování rozpoznaného textu vÄetnÄ› kontroly pÅ™eklepů
  • Generate PDF/ODT documents from hOCR documents
  • Vytváření PDF/ODT dokumentů z hOCR dokumentů
https://raw.githubusercontent.com/manisandro/gImageReader/gh-pages/gimagereader-@INTERFACE_TYPE@.jpg gImageReader-@INTERFACE_TYPE@ https://github.com/manisandro/gImageReader/issues https://github.com/manisandro/gImageReader/wiki/FAQ https://github.com/manisandro/gImageReader https://github.com/manisandro/gImageReader/blob/master/README.md manisandro@gmail.com gimagereader-@INTERFACE_TYPE@ gimagereader-@INTERFACE_TYPE@ gimagereader-@INTERFACE_TYPE@.desktop mild
gImageReader-3.3.1/data/gimagereader.desktop.in000066400000000000000000000007111351740627400213670ustar00rootroot00000000000000[Desktop Entry] Name=gImageReader _GenericName=OCR application Exec=gimagereader-@INTERFACE_TYPE@ %U Icon=gimagereader Terminal=false Type=Application StartupNotify=true StartupWMClass=gimagereader-@INTERFACE_TYPE@ 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.3.1/data/icons/000077500000000000000000000000001351740627400160675ustar00rootroot00000000000000gImageReader-3.3.1/data/icons/128x128/000077500000000000000000000000001351740627400170245ustar00rootroot00000000000000gImageReader-3.3.1/data/icons/128x128/gimagereader.png000066400000000000000000000323401351740627400221500ustar00rootroot00000000000000‰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.3.1/data/icons/256x256/000077500000000000000000000000001351740627400170305ustar00rootroot00000000000000gImageReader-3.3.1/data/icons/256x256/gimagereader.png000066400000000000000000000765521351740627400221710ustar00rootroot00000000000000‰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.3.1/data/icons/48x48/000077500000000000000000000000001351740627400166665ustar00rootroot00000000000000gImageReader-3.3.1/data/icons/48x48/gimagereader.png000066400000000000000000000066671351740627400220270ustar00rootroot00000000000000‰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.3.1/data/icons/angle.png000066400000000000000000000013241351740627400176630ustar00rootroot00000000000000‰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.3.1/data/icons/angle.svg000066400000000000000000000115471351740627400177060ustar00rootroot00000000000000 image/svg+xml gImageReader-3.3.1/data/icons/autolayout.png000066400000000000000000000021351351740627400210040ustar00rootroot00000000000000‰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.3.1/data/icons/autolayout.svg000066400000000000000000000224471351740627400210270ustar00rootroot00000000000000 image/svg+xml gImageReader-3.3.1/data/icons/brightness.png000066400000000000000000000007751351740627400207560ustar00rootroot00000000000000‰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.3.1/data/icons/brightness.svg000066400000000000000000000226051351740627400207650ustar00rootroot00000000000000 image/svg+xml gImageReader-3.3.1/data/icons/collapse.png000066400000000000000000000003641351740627400204020ustar00rootroot00000000000000‰PNG  IHDRàw=øbKGDÿÿÿ ½§“©IDATH‰íÔ½ Aà1ìÁÄÄÐØ&ÔD ­ãÚ°«ÄÀÀÄØÄ #3 nƒóðüc7Pn`XX;oÞc‡]4%@#œclÐI%}ì0O%-,°D;†@Õ܇rGS¬ÃÝ ð]¬A†ë^Ð{QSÅì™8ûBGŸà®¾Ü]´”—|Æ #œbG´Å‡—‘ì'ÿê°{K€:ìê°û¿v7ÉN1UfôBIEND®B`‚gImageReader-3.3.1/data/icons/collapse.svg000066400000000000000000000144711351740627400204210ustar00rootroot00000000000000 image/svg+xml gImageReader-3.3.1/data/icons/contrast.png000066400000000000000000000012011351740627400204240ustar00rootroot00000000000000‰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.3.1/data/icons/contrast.svg000066400000000000000000000077711351740627400204610ustar00rootroot00000000000000 image/svg+xml gImageReader-3.3.1/data/icons/controls.png000066400000000000000000000015361351740627400204450ustar00rootroot00000000000000‰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.3.1/data/icons/controls.svg000066400000000000000000000425511351740627400204620ustar00rootroot00000000000000 image/svg+xml gImageReader-3.3.1/data/icons/expand.png000066400000000000000000000003261351740627400200550ustar00rootroot00000000000000‰PNG  IHDRàw=øbKGDÿÿÿ ½§“‹IDATH‰íÔÍ Â@†áGðn iCÚE˜bRÈzÐ2b ÐË !’l4‘}ácw˜e~öðñ4xdÔ,i°A;Q¼7_±Šs‡„õ ßa+¡¹¤Ð‹Úûô§L~Ju1ýÛˆ/1qñâ  Â=T}Pl”áŸßpìÝ …¡˜ÝI1»9³Ëòøl`«ú·<ÐIEND®B`‚gImageReader-3.3.1/data/icons/expand.svg000066400000000000000000000144631351740627400200770ustar00rootroot00000000000000 image/svg+xml gImageReader-3.3.1/data/icons/filtering.png000066400000000000000000000005501351740627400205600ustar00rootroot00000000000000‰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.3.1/data/icons/filtering.svg000066400000000000000000000106351351740627400206000ustar00rootroot00000000000000 image/svg+xml gImageReader-3.3.1/data/icons/gimagereader.svg000066400000000000000000000755241351740627400212410ustar00rootroot00000000000000 image/svg+xml OCR gImageReader-3.3.1/data/icons/ins_append.png000066400000000000000000000006741351740627400207240ustar00rootroot00000000000000‰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.3.1/data/icons/ins_append.svg000066400000000000000000000341771351740627400207440ustar00rootroot00000000000000 image/svg+xml gImageReader-3.3.1/data/icons/ins_cursor.png000066400000000000000000000012261351740627400207640ustar00rootroot00000000000000‰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.3.1/data/icons/ins_cursor.svg000066400000000000000000000311001351740627400207710ustar00rootroot00000000000000 image/svg+xml gImageReader-3.3.1/data/icons/ins_replace.png000066400000000000000000000004451351740627400210640ustar00rootroot00000000000000‰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.3.1/data/icons/ins_replace.svg000066400000000000000000000423351351740627400211030ustar00rootroot00000000000000 image/svg+xml gImageReader-3.3.1/data/icons/item_block.png000066400000000000000000000003651351740627400207110ustar00rootroot00000000000000‰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.3.1/data/icons/item_block.svg000066400000000000000000000142271351740627400207260ustar00rootroot00000000000000 image/svg+xml gImageReader-3.3.1/data/icons/item_halftone.png000066400000000000000000000007111351740627400214120ustar00rootroot00000000000000‰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.3.1/data/icons/item_halftone.svg000066400000000000000000000162141351740627400214320ustar00rootroot00000000000000 image/svg+xml gImageReader-3.3.1/data/icons/item_line.png000066400000000000000000000001541351740627400205420ustar00rootroot00000000000000‰PNG  IHDRàw=øbKGDÿÿÿ ½§“!IDATH‰c`£`Œ‚Œ8ÄÿSÙ¼Q0 FÁ(À¨¼;`üIEND®B`‚gImageReader-3.3.1/data/icons/item_line.svg000066400000000000000000000124641351740627400205640ustar00rootroot00000000000000 image/svg+xml gImageReader-3.3.1/data/icons/item_page.png000066400000000000000000000003461351740627400205320ustar00rootroot00000000000000‰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.3.1/data/icons/item_page.svg000066400000000000000000000072301351740627400205440ustar00rootroot00000000000000 image/svg+xml gImageReader-3.3.1/data/icons/item_par.png000066400000000000000000000004561351740627400204020ustar00rootroot00000000000000‰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.3.1/data/icons/item_par.svg000066400000000000000000000155771351740627400204270ustar00rootroot00000000000000 image/svg+xml gImageReader-3.3.1/data/icons/item_word.png000066400000000000000000000004761351740627400205750ustar00rootroot00000000000000‰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.3.1/data/icons/item_word.svg000066400000000000000000000135751351740627400206140ustar00rootroot00000000000000 image/svg+xml A gImageReader-3.3.1/data/icons/landscape.png000066400000000000000000000003761351740627400205350ustar00rootroot00000000000000‰PNG  IHDRóÿabKGDÿÿÿ ½§“³IDAT8Ý’1 1EÿÈ€6^ ×±ñ{‚T{„Ý2ÙN°ñ\²Å™L¢UBŒiu`Ègà½I ÀϽœsÇ”Àº®¨Ï:/Ër®áišÎ"r%¢GD„˜Þ{äÙ¶m‡¼¼æy>1óe†½1ª UEŒ±äÜÖÚ²´ˆèÖ«*D¤v9¤”ºàé‚cŒmÁ7¸yƒ¸ë -XU_þ ׂq!"ÍþÃzˆã# \ê{—IEND®B`‚gImageReader-3.3.1/data/icons/landscape.svg000066400000000000000000000072331351740627400205470ustar00rootroot00000000000000 image/svg+xml gImageReader-3.3.1/data/icons/page.png000066400000000000000000000005261351740627400175140ustar00rootroot00000000000000‰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.3.1/data/icons/page.svg000066400000000000000000000114701351740627400175270ustar00rootroot00000000000000 image/svg+xml gImageReader-3.3.1/data/icons/portrait.png000066400000000000000000000003461351740627400204440ustar00rootroot00000000000000‰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.3.1/data/icons/portrait.svg000066400000000000000000000072601351740627400204610ustar00rootroot00000000000000 image/svg+xml gImageReader-3.3.1/data/icons/resolution.png000066400000000000000000000005011351740627400207740ustar00rootroot00000000000000‰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.3.1/data/icons/resolution.svg000066400000000000000000000077051351740627400210240ustar00rootroot00000000000000 image/svg+xml gImageReader-3.3.1/data/icons/rotate_page.png000066400000000000000000000011041351740627400210630ustar00rootroot00000000000000‰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.3.1/data/icons/rotate_page.svg000066400000000000000000000143331351740627400211060ustar00rootroot00000000000000 image/svg+xml gImageReader-3.3.1/data/icons/rotate_pages.png000066400000000000000000000012651351740627400212560ustar00rootroot00000000000000‰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.3.1/data/icons/rotate_pages.svg000066400000000000000000000164001351740627400212660ustar00rootroot00000000000000 image/svg+xml gImageReader-3.3.1/data/icons/select.png000066400000000000000000000004761351740627400200630ustar00rootroot00000000000000‰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.3.1/data/icons/select.svg000066400000000000000000000140211351740627400200650ustar00rootroot00000000000000 image/svg+xml gImageReader-3.3.1/data/icons/stripcrlf.png000066400000000000000000000007421351740627400206100ustar00rootroot00000000000000‰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.3.1/data/icons/wconf.png000066400000000000000000000010321351740627400177050ustar00rootroot00000000000000‰PNG  IHDRàw=øbKGDÿÿÿ ½§“ÏIDATH‰íÔ¿KUqðzM(Š ¬V‡(´!úa¶EC`´ÔDKCcKA$Qkýý M. RHšý23"Zš BË¥ºæõ6¼ïá†RÝ-/8߇ó}žïyž÷ý²VMÔ Ô1Š–ÄÎ`‹èNl=>¡†cÍ’·âa’íÆĤXÛƒÍø†'ežâ+6b/ÚpïPM1èMÁ,”XÀtF'vaÏS¬}¹gRØÔ´À2&rÝ',Y‡±Ä»ò9 ²o–¼ ‘Ã~ÅL%Yg±]„þ¸Œ@QÛD5ÌãUï¡Îåf/ýsxë-Âç%Ñ–o°UtU—¨áQ¾×…e>ù ^Êÿÿ¶ÎãƒÈlä_“W0+ô8vC¿ýï"ÔKùñ)Ñ5Õ<ÑÍÜPÅ Ü7‹1¨S"«â¹Ý†—â"»ŽûIЂ{bÄ5rNtXhß»I~›0ˆ÷bŽ:ÄìŒH¥¿z-ñ+¹îCöY´étÚ±3ñ¢#ÛñVÌN6­ÿÙÚUõE„¸”{[÷aEXrQøYÍ Ã¸Š yêþüvHdSªNâY’Ïãrâ§Å•±ˆ¸¥òXžºkÅz•Ekõ×ú é"’~ŽÉIEND®B`‚gImageReader-3.3.1/data/icons/wconf.svg000066400000000000000000000166201351740627400177310ustar00rootroot00000000000000 image/svg+xml conf W gImageReader-3.3.1/data/manual-cs.html.in000066400000000000000000000516201351740627400201330ustar00rootroot00000000000000 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.3.1/data/manual.html.in000066400000000000000000000735201351740627400175330ustar00rootroot00000000000000 @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.3.1 (Jul 28 2019):
* HOCR: propagate attributes to manually added elements (@foghawk)
* HOCR: improve spelling of hyphenated words (@foghawk)
* HOCR: improve spelling of words with special characters (@foghawk)
* HOCR: allow specifying a DPI to assume for image sources when exporting to PDF (@foghawk)
* HOCR: allow use to choose whether to sanitize hyphens when exporting to PDF
* HOCR: Attempt to map 639-2 language codes to ISO 639-1 to set spelling language
* Allow specifying character whitelist / blacklist for recognition
* Various bugfixes
* Translation updates
* Full details in commit log: https://github.com/manisandro/gImageReader/commits/master

gImageReader 3.3.0 (Sep 26 2018):
* Support tesseract-4.0.0
* Translation updates
* See 3.2.9x changelogs for all other feature changes since previous stable
* Full details in commit log: https://github.com/manisandro/gImageReader/commits/master

gImageReader 3.2.99 (Feb 24 2018):
* gImageReader 3.3 beta
* Add support for reading DJVU documents
* Add support for encrypted PDF files
* Rewrite HOCR editor and greatly expand its functionality:
  - Allow displaying confidence values in HOCR tree
  - Allow clicking in the canvas to jump to the corresponding item in the HOCR tree
  - Support mass-editing of HOCR child item attributes from parent
  - Honour font family attributes if possible
  - Honour and allow toggling bold and italic attributes
  - Correctly honour the baseline
  - Add search/replace and substitution list support
  - Add preview mode while editing
  - Allow manually adding lines, words and paragraphs
  - Allow swapping items
  - Automatically adjust parent bounding boxes when resizing and removing children
  - Add navigation toolbar to facilitate navigating through the HOCR tree
  - Use relative paths to source files in HOCR HTML document if source files are on same level or below the HOCR file
  - Add export to text
  - Add export to ODT
  - Allow choosing paper size in PDF export
  - Allow setting document metadata in PDF export
  - Allow setting encryption in PDF export
  - [Qt] Allow using QPrinter as PDF export backend, which has better support for complex scripts

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 hyphen 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
 * Possibility 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 overlaid above the respective source text in the image. This export mode is useful 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 useful 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, 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-2019 Sandro Mani, revision: Thu, Jul 25 2019

gImageReader-3.3.1/formatSourceFiles.sh000077500000000000000000000004221351740627400200340ustar00rootroot00000000000000#!/bin/sh dir=$(dirname "$(readlink -f "$0")") which astyle &> /dev/null || ( echo "Please install astyle." && exit 1 ) out=$(astyle --formatted --options=$dir/astyle.options $(find gtk qt \( -name '*.cc' -or -name '*.hh' \))) echo "$out" [ -z "$out" ] && exit 0 || exit 1 gImageReader-3.3.1/gtk/000077500000000000000000000000001351740627400146305ustar00rootroot00000000000000gImageReader-3.3.1/gtk/data/000077500000000000000000000000001351740627400155415ustar00rootroot00000000000000gImageReader-3.3.1/gtk/data/ConfigDialog.ui000066400000000000000000000624031351740627400204320ustar00rootroot00000000000000 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 False 5 Preferences center-on-parent 500 True preferences-system dialog False vertical 2 False end Help True True True imageHelp False True 0 OK True True True imageOk 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 4 2 True False 0 5 2 True False Predefined language definitions: True 0 0 10 2 75 True True True never always in True True 0 11 2 True False Additional language definitions: True True 0 0 12 2 75 True True True never always in True True 0 13 2 True False 3 start Add True True True imageLangsEditAdd False True 0 Remove True False True True imageLangsEditRemove False True 1 0 14 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 imageLangsAddOk False True 3 Cancel True True True imageLangsAddCancel 0.5 False True 4 0 15 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 6 True False Language definitions path: 0 0 7 True False Spelling dictionaries path: 0 0 8 True False vertical 0 9 2 True False System-wide paths User paths 1 6 True True False 1 7 True True False 1 8 Automatically open exported documents with default application True True False 0 True 0 3 2 True True 1 buttonHelp buttonOk gImageReader-3.3.1/gtk/data/CrashHandler.ui000066400000000000000000000145021351740627400204400ustar00rootroot00000000000000 True False view-refresh False 480 640 emblem-important dialog False vertical 2 False Regenerate backtrace True True True imageRegenerate True True 0 gtk-close True True True True False True 1 False True end 0 True False <b>The application has crashed</b> 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 0 True True <b>Tesseract has aborted</b> Tesseract (the OCR engine) has aborted while recognizing text. This may occur if the used traineddatas are corrupt or incomplatible with the version of tesseract in use, or due to a bug in tesseract. The stacktrace below may provide additional information about where the crash occured. 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 buttonClose gImageReader-3.3.1/gtk/data/MainWindow.ui000066400000000000000000002616221351740627400201650ustar00rootroot00000000000000 -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 image/png *.png True False /org/gnome/gimagereader/autolayout.png True False /org/gnome/gimagereader/controls.png True False Toggle output pane text-editor-symbolic True False action-unavailable-symbolic True False object-select-symbolic True False action-unavailable-symbolic True False object-select-symbolic True False edit-delete-symbolic True False /org/gnome/gimagereader/rotate_pages.png True False /org/gnome/gimagereader/rotate_page.png True False Rotate current page True False imageRotateCurrent False True Rotate all pages True False imageRotateAll False True True False 16 camera-photo True False document-new-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 Recent True False imageSourcesRecent False True False Paste True False imageSourcesPaste False Take Screenshot True False imageScreenshot False True False list-remove-symbolic True False scanner-symbolic True False zoom-fit-best-symbolic True False zoom-in-symbolic True False zoom-original-symbolic True False zoom-out-symbolic True False False True False gImageReader True True True False imageSources True True False True True False Zoom in imageZoomin False True 0 True True False Zoom out imageZoomout False True 1 True True False Normal size imageZoomnorm False True 2 True True False Best fit imageZoomfit False True 3 1 True False True True False Select rotation mode menuRotateMode 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 adjustmentRotate 1 1 True True True False True 1 2 True Select page ◠6 1 True False view-paged-symbolic False adjustmentPage 1 3 True True False Image controls imageControls 4 True False True False Plain text hOCR, PDF False True 0 True True Autodetect layout imageAutolayout 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 menuLanguages False True False 4 down False True 3 5 True True False imageOutputpane 6 True False none True False applications-system-symbolic end 7 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 imageSourcesAdd False True 0 True True False Add Images menuSourcesAdd False True False 4 down False True 1 False True 0 True False True True Remove image from list imageSourcesRemove none False True 1 True False True True Delete image imageSourcesDelete none False True 2 True False True True Clear list imageSourcesClear 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 liststoreAcquireDevice 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 5 2 True False vertical start Scan True False True True imageSourcesScan False True 0 0 6 2 True False Source: 0 0 4 True False 0 Flatbed ADF Front ADF Back ADF Duplex 1 4 1 True False Acquire 1 False False False True False vertical False False True False True Brightness True True ◠7 0 True False adjustmentBrightness True True False False True False True Contrast True True ◠7 0 True False adjustmentContrast True True False False True False True Resolution True True ◠7 200 True False adjustmentResolution 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 imageProgressCancel False True 1 False True 1 False True 2 False 5 False center-on-parent True help-about menu True True windowMain gImageReader Copyright © 2009-2019 Sandro Mani A graphical frontend to tesseract-ocr https://github.com/manisandro/gImageReader/ Sandro Mani <manisandro@gmail.com> the community using Weblate https://hosted.weblate.org/projects/gimagereader/translations/ gimagereader gpl-3-0 False vertical 2 False end False True end 0 True False False True 2 False Character whitelist / blacklist False center-on-parent True dialog True True windowMain False vertical 2 False end gtk-close True True True True True True 0 False False 0 True False vertical Exclude these characters from being recognized (blacklist): True True False True True radioButtonWhitelist False True 0 True True Enter a string of characters... False True 1 Only allow the following characters to be recognized (whitelist): True True False True True radioButtonBlacklist False True 2 True True Enter a string of characters... False True 3 False True 1 buttonClose False 5 Page Range False center-on-parent True edit-copy dialog True True windowMain True False vertical 2 True False end Cancel True True True imagePagesCancel False False 0 OK True True True imagePagesOk 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 buttonPageRangeCancel buttonPageRangeOk False Protected PDF dialog windowMain windowMain False vertical 2 False end Cancel True True True imagePdfpasswordCancel False False 0 OK True True True True True imagePdfpasswordOk False False 1 False False 0 True False 0 False True 3 True True False ◠True False True 4 buttonPdfpasswordCancel buttonPdfpasswordOk both True False True False Current Page True True False Multiple Pages... True vertical gImageReader-3.3.1/gtk/data/OutputEditorHOCR.ui000066400000000000000000000615321351740627400212320ustar00rootroot00000000000000 False Add Word dialog False vertical 2 False end Cancel True True True True True 0 OK True True True True True 1 False False 0 True False Enter word: 0 False True 1 True True False True 2 buttonAddWordCancel buttonAddWordOk True False edit-clear-symbolic True False /org/gnome/gimagereader/collapse.png True False /org/gnome/gimagereader/expand.png True False edit-find-replace-symbolic True False go-down-symbolic True False go-up-symbolic True False document-open-symbolic True False document-print-preview-symbolic True False document-save-as-symbolic True False /org/gnome/gimagereader/wconf.png True False True False Export to plain text True False Export to PDF True True False Export to ODT True True False vertical True False True True True imageOpen none False True 0 True False True True Save output imageSave none False True 1 True False True False Export none menuExport False True False True False True Export x-office-document-symbolic False True 0 True False down False True 1 False True 2 True True True Clear output imageClear none False True 3 True False False True 4 True True True Find and replace imageFindreplace none False True 5 True True True Show confidence values imageWconf none False True 6 True True True Show preview imagePreview none False True 7 False True 0 True False vertical False True 1 True True vertical 300 True False vertical True True never in True True False False True True 0 True False 2 True False False True 0 True False False True 1 True True True Next (F3) imageNavigationNext none False True 2 True True True Previous (Shift+F3) imageNavigationPrev none False True 3 True False False True 4 True True True Expand all imageExpandAll none False True 5 True True True Collapse all imageCollapseAll none False True 6 False True 1 False True 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 True True 2 gImageReader-3.3.1/gtk/data/OutputEditorText.ui000066400000000000000000000414231351740627400214200ustar00rootroot00000000000000 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 imageInsertAppend False True Insert at cursor True False imageInsertCursor False True Replace current text True False imageInsertReplace False True True False edit-redo-symbolic True False document-save-as-symbolic True False /org/gnome/gimagereader/stripcrlf.png True False edit-undo-symbolic 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 menuInsert 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 imageStripcrlf none False True 0 True True False none menuStripcrlf False True False 4 down False True 1 False True 1 True True True Find and replace imageFindreplace none False True 2 True True True Undo imageUndo none False True 3 True True True Redo imageRedo none False True 4 True True True Save output imageSave none False True 5 True True True Clear output imageClear none False True 6 False True 0 True False vertical False True 1 True True in True True word 2 2 True True 2 gImageReader-3.3.1/gtk/data/PdfExportDialog.ui000066400000000000000000001657171351740627400211540ustar00rootroot00000000000000 50 1200 10 50 50 200 1 10 1 100 1 1 10 1 99 1 10 100 1 10 50 1200 10 50 True False /org/gnome/gimagereader/landscape.png True False /org/gnome/gimagereader/portrait.png 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 True True False 6 6 6 6 6 6 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 adjustmentPdfQuality 90 1 4 True False DPI: 0 0 2 True True adjustmentPdfDpi 300 1 2 True False Dithering algorithm: 0 0 1 True False 1 1 True False Image settings: 0 4 2 True False 0 in True False 12 True False 2 2 Uniformize line and word spacing True True False True 0 True 0 4 3 Override font family: True True False 0 True 0 0 True False Fallback font family: 0 0 1 Override font size: True True False 0 True 0 2 True False Font scaling: 0 0 3 True True adjustmentPdfFontscale 100 1 3 True False pt 0 2 2 True False True adjustmentPdfOverridefontsize 10 1 2 True False % 0 2 3 True False Preserve spaces wider than: 0 0 5 True True True 2 2 adjustmentPdfPreserve True True 4 1 5 True False characters 0 2 5 True False False True True 1 0 2 True False True True 1 1 2 Sanitize hyphens before line breaks True True False True 0 6 3 True False Text settings: 0 0 5 2 True False Paper size: 0 0 1 True False 2 True False True True 0 True False True True True imagePortrait True False True 0 True True True imageLandscape False True 1 False True 1 1 1 True False 2 True True Width url True True 0 True False x False True 1 True True Height number True True 2 True False False True 3 1 3 boxPaperSizeDpi True False True False start Treat image sources as having true DPI: True True 0 True True adjustmentSourceDpi 300 True True 1 1 2 True False Basic False True False 6 6 6 6 vertical 6 True False 2 True False PDF version: False True 0 True False True True 1 False True 0 True False 0 in True False 12 True False 6 2 True False Password: 0 0 0 True False Confirm password: 0 0 1 True True True False ◠password 1 0 True True True False ◠password 1 1 True False Encryption (optional): False True 1 True False 0 in True False 12 True False 6 2 True False Author: 0 0 0 True False Title: 0 0 1 True False Subject: 0 0 2 True False Creator: 0 2 0 True False Producer: 0 2 1 True False Keywords: 0 2 2 entryMetadataAuthor True True True 1 0 entryMetadataTitle True True True 1 2 entryMetadataSubject True True True 1 1 entryMetadataCreator True True True 3 0 entryMetadataProducer True True True 3 1 entryMetadataKeywords True True True 3 2 True False Additional information (optional): False True 2 Import from current source True True True False True 3 1 True False Advanced 1 False False True 0 Show preview True True False 0 True False True 2 buttonCancel buttonOk gImageReader-3.3.1/gtk/data/SearchReplaceFrame.ui000066400000000000000000000155341351740627400215640ustar00rootroot00000000000000 True False text-editor-symbolic True 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 imageSubstitutions False True 2 gImageReader-3.3.1/gtk/data/SelectionMenu.ui000066400000000000000000000160611351740627400206560ustar00rootroot00000000000000 1 1 1 1 True False edit-copy-symbolic True False edit-delete-symbolic True False 16 insert-text-symbolic True False document-save-as-symbolic False True True True 2 popup False True True popup-menu True True True False False True False 2 Delete True True True imageSelectionDelete none 0 True 0 2 2 True False Order: 0 0 True True ◠2 number adjustmentSelectionOrder True 1 1 0 Recognize True True True imageSelectionRecognize none 0 True 0 3 2 Recognize to clipboard True True True imageSelectionClipboard none 0 True 0 4 2 True False 0 1 2 Save as image True True True imageSelectionSave none 0 True 0 5 2 gImageReader-3.3.1/gtk/data/SubstitutionsManager.ui000066400000000000000000000210221351740627400222670ustar00rootroot00000000000000 True False object-select-symbolic True False edit-delete-symbolic False Substitutions 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 imageApply True True 0 Close True True True imageClose True True 1 False True 2 gImageReader-3.3.1/gtk/data/TessdataManager.ui000066400000000000000000000151631351740627400211510ustar00rootroot00000000000000 True False object-select-symbolic True False edit-delete-symbolic True False view-refresh-symbolic False Tessdata Manager center-on-parent 320 320 True dialog True True False vertical 2 False end Apply True True True imageApply True True 0 Close True True True imageClose True True 1 Refresh True True True imageRefresh True True 2 False False 0 True False vertical True False 2 2 2 2 Manage installed languages: 0 False True 0 True True never in True True False 1 False True True 1 True True 1 buttonApply buttonClose buttonRefresh gImageReader-3.3.1/gtk/data/appmenu.ui000066400000000000000000000020111351740627400175370ustar00rootroot00000000000000
Redetect Languages app.redetectLangs Manage Languages app.manageLangs Preferences app.preferences
Help app.help About app.about Quit app.quit
gImageReader-3.3.1/gtk/data/gimagereader.gresource.xml000066400000000000000000000052211351740627400226740ustar00rootroot00000000000000 CrashHandler.ui MainWindow.ui appmenu.ui ConfigDialog.ui TessdataManager.ui OutputEditorText.ui OutputEditorHOCR.ui PdfExportDialog.ui SearchReplaceFrame.ui SubstitutionsManager.ui SelectionMenu.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 ../../data/icons/wconf.png ../../data/icons/landscape.png ../../data/icons/portrait.png ../../data/icons/collapse.png ../../data/icons/expand.png gImageReader-3.3.1/gtk/data/org.gnome.gimagereader.gschema.xml000066400000000000000000000341031351740627400242000ustar00rootroot00000000000000 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. 0 Scanning source Scanning source. [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 hyphen 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. false Match case when searching Match case when searching. "" Source directory for OCR input Source directory for OCR input. "" Directory for auxiliary files Directory for auxiliary files. "" 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. false Uniformize line spacing Whether to uniformize line spacing when generating PDFs. true Sanitize line breaks Whether to sanitize hyphens before line breaks 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. false Whether to automatically open exported documents output Whether to automatically open exported documents output. 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 Whether to override font family when exporting to PDF Whether to override font family when exporting to PDF. "Sans" Font family to use when exporting to PDF Font family to use when exporting to PDF. "Sans" Fallback font family to use when exporting to PDF Fallback font family to use when exporting to PDF. false Whether to override font size when exporting to PDF Whether to override font size when exporting to PDF. 10 Font size when exporting to PDF Font size when exporting to PDF. 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. 0 PDF export paper size PDF export paper size. "" PDF export custom page width PDF export custom page height. "" PDF export custom page height PDF export custom page height. 0 PDF export paper size unit PDF export paper size unit. false PDF export paper orientation PDF export paper orientation. "" PDF export metadata: author PDF export metadata: author. "gImageReader" PDF export metadata: produce PDF export metadata: producer. "gImageReader" PDF export metadata: creator PDF export metadata: creator. 7 PDF export version PDF export version. true OCR character blacklist enabled OCR character blacklist enabled. false OCR character whitelist enabled OCR character whitelist enabled. "" OCR character whitelist OCR character whitelist. "" OCR character whitelist OCR character whitelist. gImageReader-3.3.1/gtk/data/uigen.py000077500000000000000000000061301351740627400172250ustar00rootroot00000000000000#!/usr/bin/python import os import re import sys from xml.dom.minidom import parse import gi gi.require_version('Gtk', '3.0') from gi.repository import Gtk def extractMemberData(element, extraHeaders): className = element.attributes["class"].value isWidget = False if className == "GtkSourceView": className = "Gsv::View" extraHeaders.add("gtksourceviewmm.h") isWidget = True else: classType = Gtk.__getattr__(re.sub('^Gtk', '', className)) className = re.sub('^Gtk', 'Gtk::', className) isWidget = issubclass(classType, Gtk.Widget) resource = None for child in element.childNodes: if child.nodeName == "property" and child.attributes["name"].value == "resource": resource = child.childNodes[0].data objectId = element.attributes["id"].value return {"class": className, "id": objectId, "res": resource, "iswidget": isWidget} def genFormHeader(sourceFile): document = parse(sourceFile) extraHeaders = set() members = [extractMemberData(el, extraHeaders) for el in document.getElementsByTagName("object") if "id" in el.attributes] uiName = os.path.splitext(os.path.basename(sourceFile))[0] outputFile = "ui_" + uiName + '.hh' guardName = outputFile.upper().replace('.', '_') fh = open(outputFile, 'w') fh.write('// This file was autogenerated from %s\n\n' % sourceFile) fh.write('#ifndef %s\n' % guardName) fh.write('#define %s\n\n' % guardName) fh.write('#include \n') fh.write('#include \n') for header in extraHeaders: fh.write('#include <%s>\n' % header) fh.write('\nnamespace Ui {\n') fh.write('struct %s {\n' % uiName) fh.write('\tGlib::RefPtr builder;\n') for member in members: if member["iswidget"] == True: fh.write('\t%s* %s = nullptr;\n' % (member["class"], member["id"])) fh.write('\n\t%s() {\n' % uiName) fh.write('\t\tbuilder = Gtk::Builder::create_from_resource("/org/gnome/gimagereader/%s");\n' % (uiName + '.ui')) fh.write('\t\tbuilder->set_translation_domain(GETTEXT_PACKAGE);\n') fh.write('\t}\n') fh.write('\n\tvoid setupUi() {\n') for member in members: if member["iswidget"] == True: fh.write('\t\tbuilder->get_widget("%s", %s);\n' % (member["id"], member["id"])) if member["res"]: fh.write('\t\t%s->set(Gdk::Pixbuf::create_from_resource("%s"));\n' % (member["id"], member["res"])) fh.write('\t}\n') fh.write('\n\t~%s() {\n' % uiName) fh.write('\t\tstd::vector toplevelWidgets;\n') for member in members: if member["iswidget"] == True: fh.write('\t\tif(!%s->get_parent()) toplevelWidgets.push_back(%s);\n' % (member["id"], member["id"])) fh.write('\t\tstd::for_each(toplevelWidgets.begin(), toplevelWidgets.end(), [](Gtk::Widget* w) { delete w; });\n') fh.write('\t}\n') fh.write('};\n') fh.write('} // Ui\n') fh.write('#endif // %s\n' % guardName) fh.close() print("Wrote %s" % outputFile) for sourceFile in sys.argv[1:]: genFormHeader(sourceFile) gImageReader-3.3.1/gtk/src/000077500000000000000000000000001351740627400154175ustar00rootroot00000000000000gImageReader-3.3.1/gtk/src/Acquirer.cc000066400000000000000000000166021351740627400175060ustar00rootroot00000000000000/* -*- Mode: C++; indent-tabs-mode: t; c-basic-offset: 4; tab-width: 4 -*- */ /* * Acquirer.cc * Copyright (C) 2013-2019 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 "ConfigSettings.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(const Ui::MainWindow& _ui) : ui(_ui) { m_cancelButton = Gtk::manage(new Gtk::Button(_("Cancel"))); m_cancelButton->set_image_from_icon_name("dialog-cancel", Gtk::ICON_SIZE_BUTTON); m_cancelButton->show(); ui.comboAcquireDevice->set_model(Gtk::ListStore::create(m_devComboCols)); Gtk::CellRendererText* cell = Gtk::manage(new Gtk::CellRendererText); cell->property_ellipsize() = Pango::ELLIPSIZE_END; ui.comboAcquireDevice->pack_start(*cell, true); ui.comboAcquireDevice->add_attribute(*cell, "text", 0); if(ui.comboAcquireResolution->get_active_row_number() == -1) { ui.comboAcquireResolution->set_active(2); } if(ui.comboAcquireMode->get_active_row_number() == -1) { ui.comboAcquireMode->set_active(0); } m_scanner = new ScannerImpl; CONNECT(ui.buttonAcquireRefresh, clicked, [this] { startDetectDevices(); }); CONNECT(ui.buttonAcquireScan, clicked, [this] { startScan(); }); CONNECT(m_cancelButton, clicked, [this] { cancelScan(); }); CONNECT(ui.buttonAcquireOutput, clicked, [this] { selectOutputPath(); }); CONNECT(ui.comboAcquireDevice, 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); }); ADD_SETTING(ComboSetting("scanres", ui.comboAcquireResolution)); ADD_SETTING(ComboSetting("scanmode", ui.comboAcquireMode)); ADD_SETTING(ComboSetting("scandev", ui.comboAcquireDevice)); ADD_SETTING(ComboSetting("scansource", ui.comboAcquireSource)); #ifdef G_OS_WIN32 ui.labelAcquireSource->set_visible(false); ui.comboAcquireSource->set_visible(false); #endif std::string sourcedir = ConfigSettings::get>("sourcedir")->getValue(); m_outputPath = Glib::build_filename(sourcedir.empty() ? Utils::get_documents_dir() : sourcedir, _("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, "sourcedir", filter); if(!filename.empty()) { m_outputPath = filename; genOutputPath(); } } void Acquirer::genOutputPath() { m_outputPath = Utils::make_output_filename(m_outputPath); ui.labelAcquirePath->set_text(m_outputPath); ui.labelAcquirePath->set_tooltip_text(m_outputPath); } void Acquirer::scanInitFailed() { ui.labelAcquireMessage->set_markup(Glib::ustring::compose("%1", _("Failed to initialize the scanning backend."))); ui.buttonAcquireScan->set_sensitive(false); ui.buttonAcquireRefresh->set_sensitive(false); ui.buttonAcquireRefresh->show(); ui.spinnerAcquire->hide(); ui.spinnerAcquire->stop(); } void Acquirer::scanFailed(const Glib::ustring& msg) { ui.labelAcquireMessage->set_markup(Glib::ustring::compose("%1: %2", _("Scan failed"), msg)); } void Acquirer::startDetectDevices() { ui.buttonAcquireRefresh->hide(); ui.spinnerAcquire->show(); ui.spinnerAcquire->start(); ui.labelAcquireMessage->set_text(""); ui.comboAcquireDevice->set_model(Gtk::ListStore::create(m_devComboCols)); ui.buttonAcquireScan->set_sensitive(false); m_scanner->redetect(); } void Acquirer::doneDetectDevices(const std::vector& devices) { ui.buttonAcquireRefresh->show(); ui.spinnerAcquire->hide(); ui.spinnerAcquire->stop(); if(devices.empty()) { ui.labelAcquireMessage->set_markup(Glib::ustring::compose("%1", _("No scanners were detected."))); } else { Glib::RefPtr store = Glib::RefPtr::cast_static(ui.comboAcquireDevice->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); } ui.comboAcquireDevice->set_active(0); ui.buttonAcquireScan->set_sensitive(true); } } void Acquirer::startScan() { ui.buttonboxAcquire->remove(*ui.buttonAcquireScan); m_cancelButton->set_sensitive(true); ui.buttonboxAcquire->pack_start(*m_cancelButton, false, true); ui.labelAcquireMessage->set_text(_("Starting scan...")); double res[] = {75., 100., 200., 300., 600., 1200.}; Scanner::ScanMode modes[] = {Scanner::ScanMode::COLOR, Scanner::ScanMode::GRAY}; Scanner::ScanType types[] = {Scanner::ScanType::SINGLE, Scanner::ScanType::ADF_FRONT, Scanner::ScanType::ADF_BACK, Scanner::ScanType::ADF_BOTH}; genOutputPath(); std::string device = (*ui.comboAcquireDevice->get_active())[m_devComboCols.name]; Scanner::Params params = {device, m_outputPath, res[ui.comboAcquireResolution->get_active_row_number()], modes[ui.comboAcquireMode->get_active_row_number()], 8, types[ui.comboAcquireSource->get_active_row_number()], 0, 0}; m_scanner->scan(params); genOutputPath(); } void Acquirer::setScanState(Scanner::State state) { if(state == Scanner::State::OPEN) { ui.labelAcquireMessage->set_text(_("Opening device...")); } else if(state == Scanner::State::SET_OPTIONS) { ui.labelAcquireMessage->set_text(_("Setting options...")); } else if(state == Scanner::State::START) { ui.labelAcquireMessage->set_text(_("Starting scan...")); } else if(state == Scanner::State::GET_PARAMETERS) { ui.labelAcquireMessage->set_text(_("Getting parameters...")); } else if(state == Scanner::State::READ) { ui.labelAcquireMessage->set_text(_("Transferring data...")); } else if(state == Scanner::State::IDLE) { doneScan(); } } void Acquirer::cancelScan() { ui.labelAcquireMessage->set_text(_("Canceling scan...")); m_scanner->cancel(); m_cancelButton->set_sensitive(false); } void Acquirer::doneScan() { ui.buttonboxAcquire->remove(*m_cancelButton); ui.buttonboxAcquire->pack_start(*ui.buttonAcquireScan, false, true); ui.labelAcquireMessage->set_text(""); } void Acquirer::setDeviceComboTooltip() { auto it = ui.comboAcquireDevice->get_active(); ui.comboAcquireDevice->set_tooltip_text(it ? static_cast((*it)[m_devComboCols.label]) : ""); } gImageReader-3.3.1/gtk/src/Acquirer.hh000066400000000000000000000036261351740627400175220ustar00rootroot00000000000000/* -*- Mode: C++; indent-tabs-mode: t; c-basic-offset: 4; tab-width: 4 -*- */ /* * Acquirer.hh * Copyright (C) 2013-2019 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" namespace Ui { class MainWindow; } class Acquirer { public: Acquirer(const Ui::MainWindow& _ui); ~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); } } m_devComboCols; const Ui::MainWindow& ui; ClassData m_classdata; Gtk::Button* m_cancelButton; 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.3.1/gtk/src/Application.hh000066400000000000000000000053721351740627400202120ustar00rootroot00000000000000/* -*- Mode: C++; indent-tabs-mode: t; c-basic-offset: 4; tab-width: 4 -*- */ /* * Application.hh * Copyright (C) 2013-2019 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("manageLangs", [this] { m_mainWindow->manageLanguages(); }); 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; ClassData m_classdata; }; #endif // APPLICATION_HPP gImageReader-3.3.1/gtk/src/Config.cc000066400000000000000000000251171351740627400171410ustar00rootroot00000000000000/* -*- Mode: C++; indent-tabs-mode: t; c-basic-offset: 4; tab-width: 4 -*- */ /* * Config.cc * Copyright (C) 2013-2019 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 "ConfigSettings.hh" #include "LangTables.hh" #include "MainWindow.hh" #include "Utils.hh" #include #define USE_STD_NAMESPACE #include #undef USE_STD_NAMESPACE const std::vector Config::LANGUAGES = LangTables::languages, Glib::ustring>([](const char* str) { return Glib::ustring(str); }); const std::map Config::LANG_LOOKUP = [] { std::map lookup; for(const Config::Lang& lang : LANGUAGES) { lookup.insert(std::make_pair(lang.prefix, lang.code)); } return lookup; }(); const std::multimap Config::LANGUAGE_CULTURES = LangTables::languageCultures>(); Config::Config() { ui.setupUi(); ui.dialogConfig->set_transient_for(*MAIN->getWindow()); for(Gtk::TreeView* view : { ui.treeviewLangsPredef, ui.treeviewLangsCustom }) { 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(ui.treeviewLangsPredef->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; } CONNECT(ui.checkbuttonDefaultoutputfont, toggled, [this] { ui.fontbuttonCustomoutputfont->set_sensitive(!ui.checkbuttonDefaultoutputfont->get_active()); }); CONNECT(ui.buttonLangsEditAdd, clicked, [this] { toggleAddLanguage(); }); CONNECT(ui.buttonLangsEditRemove, clicked, [this] { removeLanguage(); }); CONNECT(ui.buttonLangsAddOk, clicked, [this] { addLanguage(); }); CONNECT(ui.buttonLangsAddCancel, clicked, [this] { toggleAddLanguage(); }); CONNECT(ui.treeviewLangsCustom->get_selection(), changed, [this] { langTableSelectionChanged(); }); CONNECT(ui.buttonHelp, clicked, [] { MAIN->showHelp("#Usage_Options"); }); CONNECT(ui.entryLangsAddPrefix, focus_in_event, [this](GdkEventFocus*) { Utils::clear_error_state(ui.entryLangsAddPrefix); return false; }); CONNECT(ui.entryLangsAddName, focus_in_event, [this](GdkEventFocus*) { Utils::clear_error_state(ui.entryLangsAddName); return false; }); CONNECT(ui.entryLangsAddCode, focus_in_event, [this](GdkEventFocus*) { Utils::clear_error_state(ui.entryLangsAddCode); return false; }); CONNECT(ui.comboDatadirs, changed, [this] { setDataLocations(ui.comboDatadirs->get_active_row_number()); }); ADD_SETTING(SwitchSettingT("dictinstall", ui.checkDictinstall)); ADD_SETTING(SwitchSettingT("openafterexport", ui.checkOpenExported)); ADD_SETTING(SwitchSettingT("updatecheck", ui.checkUpdate)); ADD_SETTING(ListStoreSetting("customlangs", Glib::RefPtr::cast_static(ui.treeviewLangsCustom->get_model()))); ADD_SETTING(SwitchSettingT("systemoutputfont", ui.checkbuttonDefaultoutputfont)); ADD_SETTING(FontSetting("customoutputfont", ui.fontbuttonCustomoutputfont)); ADD_SETTING(ComboSetting("outputorient", ui.comboPaneorient)); ADD_SETTING(ComboSetting("datadirs", ui.comboDatadirs)); ADD_SETTING(VarSetting("sourcedir")); ADD_SETTING(VarSetting("outputdir")); ADD_SETTING(VarSetting("auxdir")); #if !ENABLE_VERSIONCHECK ui.checkUpdate->hide(); #endif } bool Config::searchLangSpec(Lang& lang) const { // Tesseract 4.x up to beta.1 had script tessdatas on same level as language tessdatas, but they are distinguishable in that they begin with an upper case character if(lang.prefix.substr(0, 6).lowercase() == "script" || lang.prefix.substr(0, 1).uppercase() == lang.prefix.substr(0, 1)) { Glib::ustring name = lang.prefix.substr(0, 6).lowercase() == "script" ? lang.prefix.substr(7) : lang.prefix; lang.name = Glib::ustring::compose("%1 [%2]", name, _("Script")); return true; } for(const Glib::RefPtr& model : { ui.treeviewLangsPredef->get_model(), ui.treeviewLangsCustom->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 = {lang.prefix, (*it)[m_langViewCols.code], Glib::ustring::compose("%1 [%2]", (*it)[m_langViewCols.name], lang.prefix)}; 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 ui.comboDatadirs->get_active_row_number() == 0; } std::string Config::tessdataLocation() const { return ui.entryTessdatadir->get_text(); } std::string Config::spellingLocation() const { return ui.entrySpelldir->get_text(); } void Config::showDialog() { toggleAddLanguage(true); while(ui.dialogConfig->run() == Gtk::RESPONSE_HELP); ConfigSettings::get("customlangs")->serialize(); ui.dialogConfig->hide(); } void Config::setDataLocations(int idx) { ui.entrySpelldir->set_text(spellingLocation(static_cast(idx))); ui.entryTessdatadir->set_text(tessdataLocation(static_cast(idx))); } void Config::openTessdataDir() { int idx = Gio::Settings::create(APPLICATION_ID)->get_int("datadirs"); std::string tessdataDir = tessdataLocation(static_cast(idx)); Gio::File::create_for_path(tessdataDir)->make_directory_with_parents(); Utils::openUri(tessdataDir); } void Config::openSpellingDir() { int idx = Gio::Settings::create(APPLICATION_ID)->get_int("datadirs"); std::string spellingDir = spellingLocation(static_cast(idx)); Gio::File::create_for_path(spellingDir)->make_directory_with_parents(); Utils::openUri(spellingDir); } std::string Config::spellingLocation(Location location) { if(location == SystemLocation) { #ifdef G_OS_WIN32 std::string dataDir = Glib::build_filename(pkgDir, "share"); #else char* prefix = enchant_get_prefix_dir(); std::string dataDir = Glib::build_filename(prefix, "share"); free(prefix); #endif #if HAVE_ENCHANT2 if(Gio::File::create_for_path(Glib::build_filename(dataDir, "myspell"))->query_exists()) { return Glib::build_filename(dataDir, "myspell"); } else { return Glib::build_filename(dataDir, "hunspell"); } #else return Glib::build_filename(dataDir, "myspell", "dicts"); #endif } else { std::string configDir = Glib::get_user_config_dir(); #if HAVE_ENCHANT2 return Glib::build_filename(configDir, "enchant", "hunspell"); #else return Glib::build_filename(configDir, "enchant", "myspell"); #endif } } std::string Config::tessdataLocation(Location location) { if(location == SystemLocation) { #ifdef G_OS_WIN32 std::string dataDir = Glib::build_filename(pkgDir, "share"); Glib::setenv("TESSDATA_PREFIX", Glib::build_filename(dataDir, "tessdata"); #else Glib::unsetenv("TESSDATA_PREFIX"); #endif } else { std::string configDir = Glib::get_user_config_dir(); Glib::setenv("TESSDATA_PREFIX", Glib::build_filename(configDir, "tessdata")); } std::string current = setlocale(LC_ALL, NULL); setlocale(LC_ALL, "C"); tesseract::TessBaseAPI tess; tess.Init(nullptr, nullptr); setlocale(LC_ALL, current.c_str()); return std::string(tess.GetDatapath()); } void Config::toggleAddLanguage(bool forceHide) { bool addVisible = forceHide ? true : ui.boxLangsAdd->get_visible(); ui.boxLangsAdd->set_visible(!addVisible); ui.buttonboxLangsEdit->set_visible(addVisible); if(addVisible) { ui.buttonLangsEditAdd->grab_focus(); } else { ui.buttonLangsAddOk->grab_focus(); } ui.entryLangsAddPrefix->set_text(""); ui.entryLangsAddCode->set_text(""); ui.entryLangsAddName->set_text(""); Utils::clear_error_state(ui.entryLangsAddPrefix); Utils::clear_error_state(ui.entryLangsAddCode); Utils::clear_error_state(ui.entryLangsAddName); } void Config::addLanguage() { bool invalid = false; if(!Glib::Regex::create("^\\w+$")->match(ui.entryLangsAddPrefix->get_text())) { invalid = true; Utils::set_error_state(ui.entryLangsAddPrefix); } if(!Glib::Regex::create("^.+$")->match(ui.entryLangsAddName->get_text())) { invalid = true; Utils::set_error_state(ui.entryLangsAddName); } if(!Glib::Regex::create("^[a-z]{2,}(_[A-Z]{2,})?$")->match(ui.entryLangsAddCode->get_text())) { invalid = true; Utils::set_error_state(ui.entryLangsAddCode); } if(!invalid) { Glib::RefPtr store = Glib::RefPtr::cast_static(ui.treeviewLangsCustom->get_model()); Gtk::TreeIter it = store->append(); (*it)[m_langViewCols.prefix] = ui.entryLangsAddPrefix->get_text(); (*it)[m_langViewCols.code] = ui.entryLangsAddCode->get_text(); (*it)[m_langViewCols.name] = ui.entryLangsAddName->get_text(); ui.entryLangsAddPrefix->set_text(""); ui.entryLangsAddCode->set_text(""); ui.entryLangsAddName->set_text(""); toggleAddLanguage(); } } void Config::removeLanguage() { if(ui.treeviewLangsCustom->get_selection()->count_selected_rows() != 0) { Glib::RefPtr store = Glib::RefPtr::cast_static(ui.treeviewLangsCustom->get_model()); store->erase(ui.treeviewLangsCustom->get_selection()->get_selected()); } } void Config::langTableSelectionChanged() { ui.buttonLangsEditRemove->set_sensitive(ui.treeviewLangsCustom->get_selection()->count_selected_rows() != 0); } gImageReader-3.3.1/gtk/src/Config.hh000066400000000000000000000051041351740627400171450ustar00rootroot00000000000000/* -*- Mode: C++; indent-tabs-mode: t; c-basic-offset: 4; tab-width: 4 -*- */ /* * Config.hh * Copyright (C) 2013-2019 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 "ui_ConfigDialog.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(); 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(); static Glib::ustring lookupLangCode(const Glib::ustring& prefix) { auto it = LANG_LOOKUP.find(prefix); return it != LANG_LOOKUP.end() ? it->second : ""; } private: enum Location {SystemLocation = 0, UserLocation = 1}; 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::map LANG_LOOKUP; static const std::multimap LANGUAGE_CULTURES ; Ui::ConfigDialog ui; ClassData m_classdata; LangViewColumns m_langViewCols; void addLanguage(); void removeLanguage(); void langTableSelectionChanged(); void setDataLocations(int idx); void toggleAddLanguage(bool forceHide = false); static std::string spellingLocation(Location location); static std::string tessdataLocation(Location location); }; #endif // CONFIG_HH gImageReader-3.3.1/gtk/src/ConfigSettings.cc000066400000000000000000000047761351740627400206720ustar00rootroot00000000000000/* -*- Mode: C++; indent-tabs-mode: t; c-basic-offset: 4; tab-width: 4 -*- */ /* * ConfigSettings.cc * Copyright (C) 2013-2019 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" std::map ConfigSettings::s_settings; void ConfigSettings::add(AbstractSetting* setting) { s_settings.insert(std::make_pair(setting->key(), setting)); } void ConfigSettings::remove(const Glib::ustring& key) { auto it = s_settings.find(key); if(it != s_settings.end()) { s_settings.erase(it); } } Glib::RefPtr AbstractSetting::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); m_signal_changed.emit(); } gImageReader-3.3.1/gtk/src/ConfigSettings.hh000066400000000000000000000136321351740627400206730ustar00rootroot00000000000000/* -*- Mode: C++; indent-tabs-mode: t; c-basic-offset: 4; tab-width: 4 -*- */ /* * ConfigSettings.hh * Copyright (C) 2013-2019 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" #include "FontComboBox.hh" class AbstractSetting; #define ADD_SETTING(...) m_classdata.addItem(new __VA_ARGS__) class ConfigSettings { public: template static T* get(const Glib::ustring& key) { auto it = s_settings.find(key); return it == s_settings.end() ? nullptr : static_cast(it->second); } private: friend class AbstractSetting; static std::map s_settings; static void add(AbstractSetting* setting); static void remove(const Glib::ustring& key); }; class AbstractSetting : public ClassDataItem { public: AbstractSetting(const Glib::ustring& key) : m_key(key) { ConfigSettings::add(this); } ~AbstractSetting() { ConfigSettings::remove(m_key); } const Glib::ustring& key() const { return m_key; } virtual void serialize() {} sigc::signal signal_changed() { return m_signal_changed; } protected: ClassData m_classdata; Glib::ustring m_key; sigc::signal m_signal_changed; static Glib::RefPtr get_default_settings(); }; 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)); m_signal_changed.emit(); } }; 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()); m_signal_changed.emit(); } 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()); m_signal_changed.emit(); } 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()); m_signal_changed.emit(); } int getValue() const { return m_widget->get_active_row_number(); } private: Gtk::ComboBox* m_widget; }; class FontComboSetting : public AbstractSetting { public: FontComboSetting(const Glib::ustring& key, FontComboBox* widget) : AbstractSetting(key), m_widget(widget) { Glib::ustring font = get_default_settings()->get_string(m_key); m_widget->set_active_font(font); CONNECT(m_widget, changed, [this] { serialize(); }); } void serialize() override { get_default_settings()->set_string(m_key, m_widget->get_active_font()); m_signal_changed.emit(); } Glib::ustring getValue() const { return m_widget->get_active_font(); } private: FontComboBox* 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()); m_signal_changed.emit(); } 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; }; class EntrySetting : public AbstractSetting { public: EntrySetting(const Glib::ustring& key, Gtk::Entry* entry) : AbstractSetting(key), m_entry(entry) { entry->set_text(get_default_settings()->get_string(m_key)); CONNECT(m_entry, changed, [this] { serialize(); }); } void serialize() override { get_default_settings()->set_string(m_key, m_entry->get_text()); m_signal_changed.emit(); } private: Gtk::Entry* m_entry; }; #endif // CONFIGSETTINGS_HH gImageReader-3.3.1/gtk/src/CrashHandler.cc000066400000000000000000000121031351740627400202610ustar00rootroot00000000000000/* -*- Mode: C++; indent-tabs-mode: t; c-basic-offset: 4; tab-width: 4 -*- */ /* * CrashHandler.cc * Copyright (C) 2013-2019 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) { 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_tesseractCrash = std::atoi(argv[3]); } if(argc > 4) { m_saveFile = argv[4]; } } void CrashHandler::on_startup() { Gtk::Application::on_startup(); ui.setupUi(); ui.dialogCrashhandler->set_title(Glib::ustring::compose("%1 %2", PACKAGE_NAME, _("Crash Handler"))); if(!m_saveFile.empty()) { ui.labelAutosave->set_markup(Glib::ustring::compose(_("Your work has been saved under %1."), m_saveFile)); } else { ui.labelAutosave->set_text(_("There was no unsaved work.")); } CONNECT(ui.dialogCrashhandler, delete_event, [this](GdkEventAny* /*ev*/) { quit(); return true; }); CONNECT(ui.buttonClose, clicked, [this] { quit(); }); CONNECT(ui.buttonRegenerate, clicked, [this] { generate_backtrace(); }); add_window(*ui.dialogCrashhandler); ui.dialogCrashhandler->show_all(); ui.labelIntro->set_visible(!m_tesseractCrash); ui.labelIntroTesseract->set_visible(m_tesseractCrash); #ifndef G_OS_WIN32 generate_backtrace(); #else ui.buttonRegenerate->hide(); ui.progressbar->hide(); #endif } void CrashHandler::generate_backtrace() { m_progressConnection = Glib::signal_timeout().connect([this] { return pulse_progress(); }, 200); ui.buttonRegenerate->set_sensitive(false); ui.textview->set_sensitive(false); ui.textview->get_buffer()->set_text(Glib::ustring::compose("%1 %2 (rev %3)\n\n", PACKAGE_NAME, PACKAGE_VERSION, PACKAGE_REVISION)); ui.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(); ui.progressbar->hide(); ui.textview->set_sensitive(true); ui.buttonRegenerate->set_sensitive(true); if(!success) { ui.textview->get_buffer()->set_text(_("Failed to obtain backtrace. Is gdb installed?")); } else { std::vector lines = Utils::string_split(ui.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]); } } ui.textview->get_buffer()->set_text(text); } auto begin = ui.textview->get_buffer()->begin(); ui.textview->scroll_to(begin); } bool CrashHandler::pulse_progress() { ui.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); ui.textview->get_buffer()->insert(ui.textview->get_buffer()->end(), text); auto end = ui.textview->get_buffer()->end(); ui.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.3.1/gtk/src/CrashHandler.hh000066400000000000000000000026751351740627400203100ustar00rootroot00000000000000/* -*- Mode: C++; indent-tabs-mode: t; c-basic-offset: 4; tab-width: 4 -*- */ /* * CrashHandler.hh * Copyright (C) 2013-2019 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" #include "ui_CrashHandler.hh" class CrashHandler : public Gtk::Application { public: CrashHandler(int argc, char* argv[]); void on_startup(); private: Ui::CrashHandler ui; ClassData m_classdata; sigc::connection m_progressConnection; std::string m_saveFile; int m_pid = 0; int m_tesseractCrash = 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.3.1/gtk/src/DisplayRenderer.cc000066400000000000000000000112321351740627400210210ustar00rootroot00000000000000/* -*- Mode: C++; indent-tabs-mode: t; c-basic-offset: 4; tab-width: 4 -*- */ /* * DisplayRenderer.cc * Copyright (C) 2013-2019 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 "DjVuDocument.hh" #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, const Glib::ustring& password) : DisplayRenderer(filename) { m_document = poppler_document_new_from_file(Glib::filename_to_uri(m_filename).c_str(), password.c_str(), 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; } DJVURenderer::DJVURenderer(const std::string& filename) : DisplayRenderer(filename) { m_djvu = new DjVuDocument(); m_djvu->openFile(filename); } DJVURenderer::~DJVURenderer() { delete m_djvu; } Cairo::RefPtr DJVURenderer::render(int page, double resolution) const { return m_djvu->image(page, resolution); } int DJVURenderer::getNPages() const { return m_djvu->pageCount(); } gImageReader-3.3.1/gtk/src/DisplayRenderer.hh000066400000000000000000000044541351740627400210430ustar00rootroot00000000000000/* -*- Mode: C++; indent-tabs-mode: t; c-basic-offset: 4; tab-width: 4 -*- */ /* * DisplayRenderer.hh * Copyright (C) 2013-2019 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 DjVuDocument; 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, const Glib::ustring& password); ~PDFRenderer(); Cairo::RefPtr render(int page, double resolution) const override; int getNPages() const override; private: PopplerDocument* m_document; mutable Glib::Threads::Mutex m_mutex; }; class DJVURenderer : public DisplayRenderer { public: DJVURenderer(const std::string& filename); ~DJVURenderer(); Cairo::RefPtr render(int page, double resolution) const override; int getNPages() const override; private: DjVuDocument* m_djvu; mutable Glib::Threads::Mutex m_mutex; }; #endif // IMAGERENDERER_HH gImageReader-3.3.1/gtk/src/Displayer.cc000066400000000000000000000763141351740627400176750ustar00rootroot00000000000000/* -*- Mode: C++; indent-tabs-mode: t; c-basic-offset: 4; tab-width: 4 -*- */ /* * Displayer.cc * Copyright (C) 2013-2019 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 "Displayer.hh" #include "DisplayRenderer.hh" #include "Recognizer.hh" #include "SourceManager.hh" #include "Utils.hh" #include "FileDialogs.hh" #define USE_STD_NAMESPACE #include #undef USE_STD_NAMESPACE Displayer::Displayer(const Ui::MainWindow& _ui) : ui(_ui) { m_defaultCursor = Gdk::Cursor::create(Gdk::ARROW); m_hadj = ui.scrollwinDisplay->get_hadjustment(); m_vadj = ui.scrollwinDisplay->get_vadjustment(); m_rotateMode = RotateMode::AllPages; ui.spinPage->set_icon_from_pixbuf(Gdk::Pixbuf::create_from_resource("/org/gnome/gimagereader/page.png")); ui.spinResolution->set_icon_from_pixbuf(Gdk::Pixbuf::create_from_resource("/org/gnome/gimagereader/resolution.png")); ui.spinBrightness->set_icon_from_pixbuf(Gdk::Pixbuf::create_from_resource("/org/gnome/gimagereader/brightness.png")); ui.spinContrast->set_icon_from_pixbuf(Gdk::Pixbuf::create_from_resource("/org/gnome/gimagereader/contrast.png")); ui.scrollwinDisplay->drag_dest_set({Gtk::TargetEntry("text/uri-list")}, Gtk::DEST_DEFAULT_MOTION | Gtk::DEST_DEFAULT_DROP, Gdk::ACTION_COPY | Gdk::ACTION_MOVE); ui.viewportDisplay->override_background_color(Gdk::RGBA("#a0a0a4")); CONNECT(ui.menuitemDisplayRotateCurrent, activate, [this] { setRotateMode(RotateMode::CurrentPage, "rotate_page.png"); }); CONNECT(ui.menuitemDisplayRotateAll, activate, [this] { setRotateMode(RotateMode::AllPages, "rotate_pages.png"); }); m_connection_rotSpinChanged = CONNECT(ui.spinRotate, value_changed, [this] { setAngle(ui.spinRotate->get_value()); }); m_connection_pageSpinChanged = CONNECT(ui.spinPage, value_changed, [this] { queueRenderImage(); }); m_connection_briSpinChanged = CONNECT(ui.spinBrightness, value_changed, [this] { queueRenderImage(); }); m_connection_conSpinChanged = CONNECT(ui.spinContrast, value_changed, [this] { queueRenderImage(); }); m_connection_resSpinChanged = CONNECT(ui.spinResolution, value_changed, [this] { queueRenderImage(); }); m_connection_invcheckToggled = CONNECT(ui.checkInvert, toggled, [this] { queueRenderImage(); }); CONNECT(ui.viewportDisplay, size_allocate, [this](Gdk::Rectangle&) { resizeEvent(); }); CONNECT(ui.viewportDisplay, key_press_event, [this](GdkEventKey * ev) { return keyPressEvent(ev); }); CONNECT(ui.viewportDisplay, motion_notify_event, [this](GdkEventMotion * ev) { return mouseMoveEvent(ev); }); CONNECT(ui.viewportDisplay, button_press_event, [this](GdkEventButton * ev) { return mousePressEvent(ev); }); CONNECT(ui.viewportDisplay, button_release_event, [this](GdkEventButton * ev) { return mouseReleaseEvent(ev); }); CONNECT(ui.viewportDisplay, scroll_event, [this](GdkEventScroll * ev) { return scrollEvent(ev); }); CONNECT(ui.drawingareaDisplay, draw, [this](const Cairo::RefPtr& ctx) { drawCanvas(ctx); return false; }); CONNECT(ui.buttonZoomin, clicked, [this] { setZoom(Zoom::In); }); CONNECT(ui.buttonZoomout, clicked, [this] { setZoom(Zoom::Out); }); m_connection_zoomfitClicked = CONNECT(ui.buttonZoomfit, clicked, [this] { setZoom(Zoom::Fit); }); m_connection_zoomoneClicked = CONNECT(ui.buttonZoomnorm, clicked, [this] { setZoom(Zoom::One); }); CONNECT(ui.spinRotate, icon_press, [this](Gtk::EntryIconPosition pos, const GdkEventButton*) { setAngle(ui.spinRotate->get_value() + (pos == Gtk::ENTRY_ICON_PRIMARY ? -90 : 90)); }); CONNECT(ui.windowMain->get_style_context(), changed, [this] { ui.drawingareaDisplay->queue_draw(); }); CONNECT(ui.scrollwinDisplay, drag_data_received, sigc::ptr_fun(Utils::handle_drag_drop)); } void Displayer::drawCanvas(const Cairo::RefPtr& ctx) { if(!m_imageItem) { return; } Gtk::Allocation alloc = ui.drawingareaDisplay->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(); ui.drawingareaDisplay->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 ui.viewportDisplay->size_allocate(ui.viewportDisplay->get_allocation()); ui.viewportDisplay->set_allocation(ui.viewportDisplay->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())); ui.drawingareaDisplay->queue_draw(); } int Displayer::getCurrentPage() const { return ui.spinPage->get_value_as_int(); } int Displayer::getCurrentResolution() const { return ui.spinResolution->get_value_as_int(); } double Displayer::getCurrentAngle() const { return ui.spinRotate->get_value(); } std::string Displayer::getCurrentImage(int& page) const { auto it = m_pageMap.find(ui.spinPage->get_value_as_int()); if(it != m_pageMap.end()) { page = it->second.second; return it->second.first->file->get_path(); } return ""; } int Displayer::getNPages() const { double min, max; ui.spinPage->get_range(min, max); return int(max); } 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; } std::queue().swap(m_scaleRequests); // clear... 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(); ui.drawingareaDisplay->hide(); ui.spinPage->hide(); m_connection_pageSpinChanged.block(true); ui.spinPage->set_range(1, 1); m_connection_pageSpinChanged.block(false); Utils::set_spin_blocked(ui.spinRotate, 0, m_connection_rotSpinChanged); Utils::set_spin_blocked(ui.spinBrightness, 0, m_connection_briSpinChanged); Utils::set_spin_blocked(ui.spinContrast, 0, m_connection_conSpinChanged); Utils::set_spin_blocked(ui.spinResolution, 100, m_connection_resSpinChanged); m_connection_invcheckToggled.block(true); ui.checkInvert->set_active(false); m_connection_invcheckToggled.block(false); ui.buttonZoomfit->set_active(true); ui.buttonZoomnorm->set_active(false); ui.buttonZoomin->set_sensitive(true); ui.buttonZoomout->set_sensitive(true); if(ui.viewportDisplay->get_window()) { ui.viewportDisplay->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, source->password); #ifdef G_OS_WIN32 } else if(Glib::ustring(filename.substr(filename.length() - 4)).lowercase() == ".djvu") { #else } else if(Utils::get_content_type(filename) == "image/vnd.djvu") { #endif renderer = new DJVURenderer(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(); ui.spinPage->get_adjustment()->set_upper(page); m_connection_pageSpinChanged.unblock(); ui.spinPage->set_visible(page > 1); ui.viewportDisplay->get_window()->set_cursor(m_defaultCursor); ui.drawingareaDisplay->show(); m_imageItem = new DisplayerImageItem; if(!renderImage()) { 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::setup(const int* page, const int* resolution, const double* angle) { bool changed = false; if(page) { changed |= *page != ui.spinPage->get_value_as_int(); Utils::set_spin_blocked(ui.spinPage, *page, m_connection_pageSpinChanged); } if(resolution) { changed |= *resolution != ui.spinResolution->get_value(); Utils::set_spin_blocked(ui.spinResolution, *resolution, m_connection_resSpinChanged); } if(changed && !renderImage()) { return false; } if(angle && std::abs(*angle - ui.spinRotate->get_value()) > 1E-2) { setAngle(*angle); } return true; } void Displayer::queueRenderImage() { m_renderTimer.disconnect(); m_renderTimer = Glib::signal_timeout().connect([this] { renderImage(); return false; }, 200); } bool Displayer::renderImage() { if(m_sources.empty()) { return false; } int page = ui.spinPage->get_value_as_int(); // Set current source according to selected page Source* source = m_pageMap[page].first; if(!source) { return false; } int oldResolution = m_currentSource ? m_currentSource->resolution : -1; int oldPage = m_currentSource ? m_currentSource->page : -1; Source* oldSource = m_currentSource; if(source != m_currentSource) { if(m_scaleThread) { sendScaleRequest({ScaleRequest::Abort}); sendScaleRequest({ScaleRequest::Quit}); m_scaleThread->join(); m_scaleThread = nullptr; } std::queue().swap(m_scaleRequests); // clear... 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, source->password); if(source->resolution == -1) { source->resolution = 300; } #ifdef G_OS_WIN32 } else if(Glib::ustring(filename.substr(filename.length() - 4)).lowercase() == ".djvu") { #else } else if(Utils::get_content_type(filename) == "image/vnd.djvu") { #endif m_renderer = new DJVURenderer(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(ui.spinBrightness, source->brightness, m_connection_briSpinChanged); Utils::set_spin_blocked(ui.spinContrast, source->contrast, m_connection_conSpinChanged); Utils::set_spin_blocked(ui.spinResolution, source->resolution, m_connection_resSpinChanged); m_connection_invcheckToggled.block(true); ui.checkInvert->set_active(source->invert); m_connection_invcheckToggled.block(false); m_currentSource = source; m_scaleThread = Glib::Threads::Thread::create(sigc::mem_fun(this, &Displayer::scaleThread)); } // Update source struct m_currentSource->page = m_pageMap[ui.spinPage->get_value_as_int()].second; m_currentSource->brightness = ui.spinBrightness->get_value_as_int(); m_currentSource->contrast = ui.spinContrast->get_value_as_int(); m_currentSource->resolution = ui.spinResolution->get_value_as_int(); m_currentSource->invert = ui.checkInvert->get_active(); // Notify tools about changes if(m_tool) { if(m_currentSource != oldSource || m_currentSource->page != oldPage) { m_tool->pageChanged(); } if(oldResolution != m_currentSource->resolution) { double factor = double(m_currentSource->resolution) / double(oldResolution); m_tool->resolutionChanged(factor); } } Utils::set_spin_blocked(ui.spinRotate, m_currentSource->angle[m_currentSource->page - 1], m_connection_rotSpinChanged); // Render new image sendScaleRequest({ScaleRequest::Abort}); Cairo::RefPtr image = m_renderer->render(m_currentSource->page, m_currentSource->resolution); if(!bool(image)) { return false; } m_renderer->adjustImage(image, m_currentSource->brightness, m_currentSource->contrast, m_currentSource->invert); 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(ui.spinRotate->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 = ui.viewportDisplay->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; } ui.buttonZoomfit->set_active(false); if(zoom == Zoom::Fit || (m_scale / fit >= 0.9 && m_scale / fit <= 1.09)) { m_scale = fit; ui.buttonZoomfit->set_active(true); } bool scrollVisible = m_scale > fit; ui.scrollwinDisplay->get_hscrollbar()->set_visible(scrollVisible); ui.scrollwinDisplay->get_vscrollbar()->set_visible(scrollVisible); ui.buttonZoomout->set_sensitive(m_scale > 0.05); ui.buttonZoomin->set_sensitive(m_scale < 10.); ui.buttonZoomnorm->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; ui.imageRotateMode->set(Gdk::Pixbuf::create_from_resource(Glib::ustring::compose("/org/gnome/gimagereader/%1", iconName))); } void Displayer::setAngle(double angle) { if(m_image) { angle = angle < 0 ? angle + 360. : angle >= 360 ? angle - 360 : angle, Utils::set_spin_blocked(ui.spinRotate, angle, m_connection_rotSpinChanged); 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; double newangle = pair.first->angle[pair.second - 1] + delta; newangle = newangle < 0.0 ? newangle + 360.0 : newangle >= 360.0 ? newangle - 360.0 : newangle, pair.first->angle[pair.second - 1] = newangle; } } m_imageItem->setRotation(angle * M_PI / 180); if(m_tool && delta != 0) { m_tool->rotationChanged(delta); } if(ui.buttonZoomfit->get_active() == true) { setZoom(Zoom::Fit); } else { positionCanvas(); } } } 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(); } void Displayer::setDefaultCursor(Glib::RefPtr cursor) { m_defaultCursor = cursor; setCursor(m_defaultCursor); } void Displayer::setCursor(Glib::RefPtr cursor) { if(cursor) { if(m_imageItem && ui.viewportDisplay->get_window()) { ui.viewportDisplay->get_window()->set_cursor(cursor); } } else { if(m_imageItem && ui.viewportDisplay->get_window()) { ui.viewportDisplay->get_window()->set_cursor(m_defaultCursor); } } } void Displayer::resizeEvent() { if(ui.buttonZoomfit->get_active() == true) { setZoom(Zoom::Fit); } } bool Displayer::mousePressEvent(GdkEventButton* ev) { ui.viewportDisplay->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) { ui.spinPage->set_value(ui.spinPage->get_value_as_int() - 1); return true; } else if(ev->keyval == GDK_KEY_Page_Down) { ui.spinPage->set_value(ui.spinPage->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 = ui.drawingareaDisplay->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; } std::pair Displayer::getPointVisible(const Geometry::Point& p) const { // 0 means visible, -1 means to the left/top of visible area, +1 means to the right/bottom of visible area int vx = 0; int vy = 0; double margin = 30.; // 30px margin if(p.x - margin < m_hadj->get_value()) { vx = -1; } else if(p.x + 30. > m_hadj->get_value() + m_hadj->get_page_size()) { vx = +1; } if(p.y - margin < m_vadj->get_value()) { vy = -1; } else if(p.y + margin > m_vadj->get_value() + m_vadj->get_page_size()) { vy = +1; } return std::make_pair(vx, vy); } void Displayer::ensureVisible(double evx, double evy) { double margin = 30.; // 30px margin if(evx - margin < m_hadj->get_value()) { m_hadj->set_value(std::max(0., evx - margin)); } 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 - margin < m_vadj->get_value()) { m_vadj->set_value(std::max(0., evy - margin)); } else if(evy + margin > m_vadj->get_value() + m_vadj->get_page_size()) { m_vadj->set_value(std::min(m_vadj->get_upper(), evy + margin) - m_vadj->get_page_size()); } } void Displayer::ensureVisible(const Geometry::Rectangle& rect) { Geometry::Point p1 = mapToView(Geometry::Point(rect.x, rect.y)); Geometry::Point p2 = mapToView(Geometry::Point(rect.x + rect.width, rect.y + rect.height)); std::pair vis1 = getPointVisible(p1); std::pair vis2 = getPointVisible(p2); if(vis1.first == 0 && vis1.second == 0 && vis2.first == 0 && vis2.second == 0) { // Both points visible, do nothing return; } double ox = m_hadj->get_value() + 0.5 * (m_hadj->get_page_size() - (p2.x - p1.x)) - p1.x; double oy = m_vadj->get_value() + 0.5 * (m_vadj->get_page_size() - (p2.y - p1.y)) - p1.y; m_hadj->set_value(std::min(std::max(0., m_hadj->get_value() - ox), m_hadj->get_upper() - m_hadj->get_page_size())); m_vadj->set_value(std::min(std::max(0., m_vadj->get_value() - oy), m_vadj->get_upper() - 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 = ui.drawingareaDisplay->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; ui.drawingareaDisplay->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 { if(!m_image) { return Geometry::Rectangle(); } int w = m_image->get_width(); int h = m_image->get_height(); Geometry::Rotation R(ui.spinRotate->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 = ui.drawingareaDisplay->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); } Geometry::Point Displayer::mapToView(const Geometry::Point& p) const { Gtk::Allocation alloc = ui.drawingareaDisplay->get_allocation(); return Geometry::Point(alloc.get_x() + 0.5 * alloc.get_width() + p.x * m_scale, alloc.get_y() + 0.5 * alloc.get_height() + p.y * m_scale); } 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(ui.spinRotate->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); ui.drawingareaDisplay->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 !m_resizeHandlers.empty(); } 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); } Geometry::Rectangle newRect = Geometry::Rectangle(m_anchor, m_point).unite(m_minRect); setRect(newRect); m_signalGeometryChanged.emit(rect()); displayer()->ensureVisible(event->x, event->y); return true; } return false; } gImageReader-3.3.1/gtk/src/Displayer.hh000066400000000000000000000223661351740627400177050ustar00rootroot00000000000000/* -*- Mode: C++; indent-tabs-mode: t; c-basic-offset: 4; tab-width: 4 -*- */ /* * Displayer.hh * Copyright (C) 2013-2019 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 "Geometry.hh" #include #include #include #include class DisplayerItem; class DisplayerImageItem; class DisplayerTool; class DisplayRenderer; class Source; namespace Ui { class MainWindow; } class Displayer { public: Displayer(const Ui::MainWindow& _ui); ~Displayer() { setSources(std::vector()); } void setTool(DisplayerTool* tool) { m_tool = tool; } bool setSources(const std::vector sources); bool setup(const int* page, const int* resolution = nullptr, const double* angle = nullptr); int getCurrentPage() const; int getCurrentResolution() const; double getCurrentAngle() const; double getCurrentScale() const { return m_scale; } std::string getCurrentImage(int& page) const; int getNPages() const; Cairo::RefPtr getImage(const Geometry::Rectangle& rect) const; Geometry::Rectangle getSceneBoundingRect() const; Geometry::Point mapToSceneClamped(const Geometry::Point& p) const; Geometry::Point mapToView(const Geometry::Point& p) const; bool hasMultipleOCRAreas(); std::vector> getOCRAreas(); bool allowAutodetectOCRAreas() const; void autodetectOCRAreas(); void setDefaultCursor(Glib::RefPtr cursor); void setCursor(Glib::RefPtr cursor); void ensureVisible(double evx, double evy); void ensureVisible(const Geometry::Rectangle& rect); 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; const Ui::MainWindow& ui; ClassData m_classdata; Glib::RefPtr m_hadj; Glib::RefPtr m_vadj; 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.}; Glib::RefPtr m_defaultCursor; 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 drawCanvas(const Cairo::RefPtr& ctx); void positionCanvas(); void queueRenderImage(); void setAngle(double angle); 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); std::pair getPointVisible(const Geometry::Point& p) const; }; class DisplayerItem : public sigc::trackable { 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)); setZIndex(10); } 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 setMinimumRect(const Geometry::Rectangle& rect) { m_minRect = rect; } 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; Geometry::Rectangle m_minRect; 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.3.1/gtk/src/DisplayerToolSelect.cc000066400000000000000000000273131351740627400216660ustar00rootroot00000000000000/* -*- Mode: C++; indent-tabs-mode: t; c-basic-offset: 4; tab-width: 4 -*- */ /* * DisplayerToolSelect.cc * Copyright (C) 2013-2019 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 "ui_SelectionMenu.hh" #include #define USE_STD_NAMESPACE #include #undef USE_STD_NAMESPACE DisplayerToolSelect::DisplayerToolSelect(Displayer* displayer) : DisplayerTool(displayer) { displayer->setDefaultCursor(Gdk::Cursor::create(Gdk::TCROSS)); updateRecognitionModeLabel(); } DisplayerToolSelect::~DisplayerToolSelect() { clearSelections(); } 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()); FileDialogs::FileFilter filter = {_("PNG Images"), {"image/png"}, {"*.png"}}; std::string filename = FileDialogs::save_dialog(_("Save Selection Image"), _("selection.png"), "outputdir", filter, true); if(!filename.empty()) { 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] { std::string current = setlocale(LC_ALL, NULL); setlocale(LC_ALL, "C"); tesseract::TessBaseAPI tess; tess.InitForAnalysePage(); setlocale(LC_ALL, current.c_str()); 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) { double newangle = m_displayer->getCurrentAngle() - avgDeskew; m_displayer->setup(nullptr, nullptr, &newangle); 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) { Ui::SelectionMenu ui; ClassData m_classdata; ui.setupUi(); ui.windowSelection->set_attached_to(*MAIN->getWindow()); ui.spinSelectionOrder->get_adjustment()->set_upper(static_cast(m_tool)->m_selections.size()); ui.spinSelectionOrder->get_adjustment()->set_value(m_number); Glib::RefPtr loop = Glib::MainLoop::create(); std::vector selmenuConnections = { CONNECT(ui.spinSelectionOrder, value_changed, [&]{ reorderSelection(ui.spinSelectionOrder->get_value()); }), CONNECT(ui.buttonSelectionDelete, clicked, [&]{ loop->quit(); static_cast(m_tool)->removeSelection(m_number); }), CONNECT(ui.buttonSelectionRecognize, clicked, [&]{ loop->quit(); MAIN->getRecognizer()->recognizeImage(displayer()->getImage(rect()), Recognizer::OutputDestination::Buffer); }), CONNECT(ui.buttonSelectionClipboard, clicked, [&]{ loop->quit(); MAIN->getRecognizer()->recognizeImage(displayer()->getImage(rect()), Recognizer::OutputDestination::Clipboard); }), CONNECT(ui.buttonSelectionSave, 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 ui.windowSelection->hide(); while(Gtk::Main::events_pending()) { Gtk::Main::iteration(false); } static_cast(m_tool)->saveSelection(this); }), CONNECT(ui.windowSelection, button_press_event, [&](GdkEventButton * ev) { Gtk::Allocation a = ui.windowSelection->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(ui.windowSelection, 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)); ui.windowSelection->show_all(); int w, h, trash; ui.windowSelection->get_preferred_width(trash, w); ui.windowSelection->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); ui.windowSelection->move(x, y); GdkWindow* gdkwin = ui.windowSelection->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(); ui.windowSelection->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.3.1/gtk/src/DisplayerToolSelect.hh000066400000000000000000000050421351740627400216730ustar00rootroot00000000000000/* -*- Mode: C++; indent-tabs-mode: t; c-basic-offset: 4; tab-width: 4 -*- */ /* * DisplayerToolSelect.hh * Copyright (C) 2013-2019 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; 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.3.1/gtk/src/DjVuDocument.cc000066400000000000000000000102411351740627400202730ustar00rootroot00000000000000/* -*- Mode: C++; indent-tabs-mode: t; c-basic-offset: 4; tab-width: 4 -*- */ /* * DjVuDocument.cc * Based on code from Okular, which is: * Copyright (C) 2006 by Pino Toscano * * 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 2 of the License, or * (at your option) any later version. */ #include "DjVuDocument.hh" #include #include #include /** * Explore the message queue until there are no message left in it. */ static void handle_ddjvu_messages( ddjvu_context_t* ctx, int wait ) { const ddjvu_message_t* msg; if ( wait ) { ddjvu_message_wait( ctx ); } while ( ( msg = ddjvu_message_peek( ctx ) ) ) { ddjvu_message_pop( ctx ); } } /** * Explore the message queue until the message \p mid is found. */ static void wait_for_ddjvu_message( ddjvu_context_t* ctx, ddjvu_message_tag_t mid ) { ddjvu_message_wait( ctx ); const ddjvu_message_t* msg; while ( ( msg = ddjvu_message_peek( ctx ) ) && msg && ( msg->m_any.tag != mid ) ) { ddjvu_message_pop( ctx ); } } DjVuDocument::DjVuDocument() { // creating the djvu context m_djvu_cxt = ddjvu_context_create( "DjVuDocument" ); // creating the rendering format unsigned int formatmask[4] = { 0x00ff0000, 0x0000ff00, 0x000000ff, 0xff000000 }; // R, G, B, A masks m_format = ddjvu_format_create( DDJVU_FORMAT_RGBMASK32, 4, formatmask ); ddjvu_format_set_row_order( m_format, 1 ); ddjvu_format_set_y_direction( m_format, 1 ); } DjVuDocument::~DjVuDocument() { closeFile(); ddjvu_format_release( m_format ); ddjvu_context_release( m_djvu_cxt ); } bool DjVuDocument::openFile( const std::string& fileName ) { // first, close the old file if ( m_djvu_document ) { closeFile(); } // load the document... m_djvu_document = ddjvu_document_create_by_filename( m_djvu_cxt, fileName.c_str(), true ); if ( !m_djvu_document ) { return false; } // ...and wait for its loading wait_for_ddjvu_message( m_djvu_cxt, DDJVU_DOCINFO ); if ( ddjvu_document_decoding_error( m_djvu_document ) ) { ddjvu_document_release( m_djvu_document ); m_djvu_document = nullptr; return false; } int numofpages = ddjvu_document_get_pagenum( m_djvu_document ); m_pages.clear(); m_pages.resize( numofpages ); // read the pages for ( int i = 0; i < numofpages; ++i ) { ddjvu_status_t sts; ddjvu_pageinfo_t info; while ( ( sts = ddjvu_document_get_pageinfo( m_djvu_document, i, &info ) ) < DDJVU_JOB_OK ) { handle_ddjvu_messages( m_djvu_cxt, true ); } if ( sts >= DDJVU_JOB_FAILED ) { closeFile(); return false; } m_pages[i] = {info.width, info.height, info.dpi}; } return true; } void DjVuDocument::closeFile() { m_pages.clear(); // releasing the old document if ( m_djvu_document ) { ddjvu_document_release( m_djvu_document ); } m_djvu_document = nullptr; } Cairo::RefPtr DjVuDocument::image( int pageno, int resolution ) { if(pageno < 0 || pageno >= pageCount()) { return Cairo::ImageSurface::create(Cairo::FORMAT_ARGB32, 0, 0); } const DjVuDocument::Page& page = m_pages[pageno]; ddjvu_page_t* djvupage = ddjvu_page_create_by_pageno( m_djvu_document, pageno ); // wait for the new page to be loaded ddjvu_status_t sts; while ( ( sts = ddjvu_page_decoding_status( djvupage ) ) < DDJVU_JOB_OK ) { handle_ddjvu_messages( m_djvu_cxt, true ); } double scaleFactor = double(resolution) / double(page.dpi); ddjvu_rect_t pagerect; pagerect.x = 0; pagerect.y = 0; pagerect.w = page.width * scaleFactor; pagerect.h = page.height * scaleFactor; ddjvu_rect_t renderrect = pagerect; Cairo::RefPtr res_img = Cairo::ImageSurface::create( Cairo::FORMAT_ARGB32, renderrect.w, renderrect.h ); int res = ddjvu_page_render( djvupage, DDJVU_RENDER_COLOR, &pagerect, &renderrect, m_format, res_img->get_stride(), (char*)res_img->get_data() ); if (!res) { Cairo::RefPtr ctx = Cairo::Context::create(res_img); ctx->set_source_rgba(1., 1., 1., 0.); ctx->paint(); } res_img->mark_dirty(); ddjvu_page_release(djvupage); return res_img; } gImageReader-3.3.1/gtk/src/DjVuDocument.hh000066400000000000000000000022731351740627400203130ustar00rootroot00000000000000/* -*- Mode: C++; indent-tabs-mode: t; c-basic-offset: 4; tab-width: 4 -*- */ /* * DjVuDocument.hh * Based on code from Okular, which is: * Copyright (C) 2006 by Pino Toscano * * 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 2 of the License, or * (at your option) any later version. */ #ifndef DJVUDOCUMENT_HH #define DJVUDOCUMENT_HH #include #include typedef struct ddjvu_context_s ddjvu_context_t; typedef struct ddjvu_document_s ddjvu_document_t; typedef struct ddjvu_format_s ddjvu_format_t; class DjVuDocument { public: DjVuDocument(); ~DjVuDocument(); bool openFile( const std::string& fileName ); void closeFile(); Cairo::RefPtr image(int pageno, int resolution); int pageCount() const { return m_pages.size(); } private: struct Page { int width; int height; int dpi; }; ddjvu_context_t* m_djvu_cxt = nullptr; ddjvu_document_t* m_djvu_document = nullptr; ddjvu_format_t* m_format = nullptr; std::vector m_pages; }; #endif gImageReader-3.3.1/gtk/src/FileDialogs.cc000066400000000000000000000271711351740627400201200ustar00rootroot00000000000000/* -*- Mode: C++; indent-tabs-mode: t; c-basic-offset: 4; tab-width: 4 -*- */ /* * FileDialogs.cc * Copyright (C) 2013-2019 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 "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 = name + " (" + Utils::string_join(patterns, " ") + ")"; 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 std::string& initialDirSetting, const FileFilter& filter, bool multiple, Gtk::Window* parent) { std::vector> filenames; parent = parent == nullptr ? MAIN->getWindow() : parent; std::string initialDir = initialDirectory; if(initialDir.empty()) { initialDir = ConfigSettings::get>(initialDirSetting)->getValue(); if(initialDir.empty()) { initialDir = Utils::get_documents_dir(); } } #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 if(!filenames.empty()) { ConfigSettings::get>(initialDirSetting)->setValue(Glib::path_get_dirname(filenames.front()->get_path())); } return filenames; } std::string save_dialog(const Glib::ustring& title, const std::string& initialFilename, const std::string& initialDirSetting, const FileFilter& filter, bool generateUniqueName, Gtk::Window* parent) { std::string filename; parent = parent == nullptr ? MAIN->getWindow() : parent; std::string suggestedFile; if(!initialFilename.empty() && Glib::path_is_absolute(initialFilename)) { suggestedFile = initialFilename; } else { std::string initialDir = ConfigSettings::get>(initialDirSetting)->getValue(); if(initialDir.empty()) { initialDir = Utils::get_documents_dir(); } suggestedFile = Glib::build_filename(initialDir, initialFilename); if(generateUniqueName) { suggestedFile = Utils::make_output_filename(suggestedFile); } } #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::pair sparts = Utils::split_filename(suggestedFile); std::pair parts = Utils::split_filename(filename); if(parts.second.empty()) { filename = parts.first + "." + sparts.second; } ConfigSettings::get>(initialDirSetting)->setValue(Glib::path_get_dirname(filename)); } return filename; } } // FileDialogs gImageReader-3.3.1/gtk/src/FileDialogs.hh000066400000000000000000000032621351740627400201250ustar00rootroot00000000000000/* -*- Mode: C++; indent-tabs-mode: t; c-basic-offset: 4; tab-width: 4 -*- */ /* * FileDialogs.hh * Copyright (C) 2013-2019 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 std::string& initialDirSetting, const FileFilter& filter, bool multiple, Gtk::Window* parent = nullptr); std::string save_dialog(const Glib::ustring& title, const std::string& initialFilename, const std::string& initialDirSetting, const FileFilter& filter, bool generateUniqueName = false, Gtk::Window* parent = nullptr); } // FileDialogs #endif // FILEDIALOGS_HH gImageReader-3.3.1/gtk/src/FontComboBox.cc000066400000000000000000000051021351740627400202630ustar00rootroot00000000000000/* -*- Mode: C++; indent-tabs-mode: t; c-basic-offset: 4; tab-width: 4 -*- */ /* * FontComboBox.cc * Copyright (C) 2013-2019 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 "FontComboBox.hh" FontComboBox::FontComboColums FontComboBox::s_fontComboCols; FontComboBox::FontComboBox() : Gtk::ComboBox(true), Glib::ObjectBase("FontComboBox") { init(); } FontComboBox::FontComboBox(BaseObjectType* cobject, const Glib::RefPtr& builder) : Gtk::ComboBox(cobject), Glib::ObjectBase("FontComboBox") { init(); } void FontComboBox::init() { set_model(getModel()); set_entry_text_column(s_fontComboCols.fontFamily); add_attribute(*get_first_cell(), "family", s_fontComboCols.fontFamily); Glib::RefPtr completion = Gtk::EntryCompletion::create(); completion->set_model(getModel()); completion->set_text_column(s_fontComboCols.fontFamily); get_entry()->set_completion(completion); CONNECT(this, changed, [this] { m_signal_font_changed.emit(get_active_font()); }); } Glib::ustring FontComboBox::get_active_font() const { return get_entry()->get_text(); } void FontComboBox::set_active_font(const Glib::ustring& font) { get_entry()->set_text(font); } Glib::RefPtr FontComboBox::getModel() { static Glib::RefPtr fontComboModel; if(!fontComboModel) { std::vector fontFamilies; Glib::RefPtr fontMap = Glib::wrap(pango_cairo_font_map_get_default(), true); for(const Glib::RefPtr& family : fontMap->list_families()) { fontFamilies.push_back(family->get_name()); } std::sort(fontFamilies.begin(), fontFamilies.end(), [](const Glib::ustring & a, const Glib::ustring & b) { return a.casefold().compare(b.casefold()) < 0; }); fontComboModel = Gtk::ListStore::create(s_fontComboCols); for(const Glib::ustring& family : fontFamilies) { (*fontComboModel->append())[s_fontComboCols.fontFamily] = family; } } return fontComboModel; } gImageReader-3.3.1/gtk/src/FontComboBox.hh000066400000000000000000000031211351740627400202740ustar00rootroot00000000000000/* -*- Mode: C++; indent-tabs-mode: t; c-basic-offset: 4; tab-width: 4 -*- */ /* * FontComboBox.hh * Copyright (C) 2013-2019 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 FONTCOMBOBOX_HH #define FONTCOMBOBOX_HH #include "common.hh" class FontComboBox : public Gtk::ComboBox { public: FontComboBox(); FontComboBox(BaseObjectType* cobject, const Glib::RefPtr& builder); Glib::ustring get_active_font() const; void set_active_font(const Glib::ustring& font); sigc::signal signal_font_changed() { return m_signal_font_changed; } private: ClassData m_classdata; sigc::signal m_signal_font_changed; struct FontComboColums : public Gtk::TreeModel::ColumnRecord { Gtk::TreeModelColumn fontFamily; FontComboColums() { add(fontFamily); } }; void init(); static FontComboColums s_fontComboCols; static Glib::RefPtr getModel(); }; #endif // FONTCOMBOBOX_HH gImageReader-3.3.1/gtk/src/Geometry.hh000066400000000000000000000056411351740627400175410ustar00rootroot00000000000000/* -*- Mode: C++; indent-tabs-mode: t; c-basic-offset: 4; tab-width: 4 -*- */ /* * Geometry.hh * Copyright (C) 2013-2019 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 = -1., double _height = -1.) : x(_x), y(_y), width(_width), height(_height) {} Rectangle(const Point& p1, const Point& p2) { setCoords(p1.x, p1.y, p2.x, p2.y); } void setCoords(double x1, double y1, double x2, double y2) { x = std::min(x1, x2); y = std::min(y1, y2); width = std::abs(x2 - x1); height = std::abs(y2 - y1); } bool contains(const Point& p) const { if(isEmpty()) { return false; } return p.x >= x && p.x <= x + width && p.y >= y && p.y <= y + height; } bool overlaps(const Rectangle& r) const { if(isEmpty() || r.isEmpty()) { return false; } 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 { if(isEmpty() && r.isEmpty()) { return Rectangle(); } else if(isEmpty()) { return r; } else if(r.isEmpty()) { return *this; } 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); } bool isEmpty() const { return width < 0. || height < 0.; } }; } #endif // GEOMETRY_HH gImageReader-3.3.1/gtk/src/Image.cc000066400000000000000000000163241351740627400167560ustar00rootroot00000000000000/* -*- Mode: C++; indent-tabs-mode: t; c-basic-offset: 4; tab-width: 4 -*- */ /* * Geometry.hh * Copyright (C) 2013-2019 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.3.1/gtk/src/Image.hh000066400000000000000000000032531351740627400167650ustar00rootroot00000000000000/* -*- Mode: C++; indent-tabs-mode: t; c-basic-offset: 4; tab-width: 4 -*- */ /* * Geometry.hh * Copyright (C) 2016-2019 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.3.1/gtk/src/MainWindow.cc000066400000000000000000000534321351740627400200110ustar00rootroot00000000000000/* -*- Mode: C++; indent-tabs-mode: t; c-basic-offset: 4; tab-width: 4 -*- */ /* * MainWindow.cc * Copyright (C) 2013-2019 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 "ConfigSettings.hh" #include "Displayer.hh" #include "DisplayerToolHOCR.hh" #include "DisplayerToolSelect.hh" #include "OutputEditorHOCR.hh" #include "OutputEditorText.hh" #include "Recognizer.hh" #include "SourceManager.hh" #include "TessdataManager.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 #define USE_STD_NAMESPACE #include #undef USE_STD_NAMESPACE #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) { signalHandlerExec(sig, false); } void MainWindow::tesseractCrash(int signal) { signalHandlerExec(signal, true); } void MainWindow::signalHandlerExec(int sig, bool tesseractCrash) { 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()), Glib::ustring::compose("%1", tesseractCrash), 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); } #if !(defined(__ARMEL__) || defined(__LCC__) && __LCC__ <= 121) 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() { s_instance = this; std::signal(SIGSEGV, signalHandler); std::signal(SIGABRT, signalHandler); #if !(defined(__ARMEL__) || defined(__LCC__) && __LCC__ <= 121) std::set_terminate(terminateHandler); #endif ui.setupUi(); ui.windowMain->set_icon_name("gimagereader"); ui.dialogAbout->set_version(Glib::ustring::compose("%1 (%2)", PACKAGE_VERSION, Glib::ustring(PACKAGE_REVISION).substr(0, 7))); ui.labelAboutTesseractver->set_markup(Glib::ustring::compose("%1 %2", _("Using tesseract"), TESSERACT_VERSION_STR)); m_config = new Config; m_acquirer = new Acquirer(ui); m_displayer = new Displayer(ui); m_recognizer = new Recognizer(ui); m_sourceManager = new SourceManager(ui); m_idlegroup.push_back(ui.buttonZoomin); m_idlegroup.push_back(ui.buttonZoomout); m_idlegroup.push_back(ui.buttonZoomnorm); m_idlegroup.push_back(ui.buttonZoomfit); m_idlegroup.push_back(ui.buttonRecognize); m_idlegroup.push_back(ui.menubuttonRotateMode); m_idlegroup.push_back(ui.spinRotate); m_idlegroup.push_back(ui.spinPage); m_idlegroup.push_back(ui.spinBrightness); m_idlegroup.push_back(ui.spinContrast); m_idlegroup.push_back(ui.spinResolution); m_idlegroup.push_back(ui.buttonAutolayout); m_idlegroup.push_back(ui.menubuttonLanguages); CONNECT(ui.windowMain, delete_event, [this](GdkEventAny * ev) { return closeEvent(ev); }); CONNECT(ui.buttonControls, toggled, [this] { ui.toolbarDisplay->set_visible(ui.buttonControls->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(ui.buttonOutputpane, toggled, [this] { if(m_outputEditor) m_outputEditor->getUI()->set_visible(ui.buttonOutputpane->get_active()); }); m_connection_setOCRMode = CONNECT(ui.comboOcrmode, changed, [this] { setOCRMode(ui.comboOcrmode->get_active_row_number()); }); CONNECT(m_recognizer, languageChanged, [this] (const Config::Lang & lang) { languageChanged(lang); }); CONNECT(ConfigSettings::get("outputorient"), changed, [this] { ui.panedOutput->set_orientation(static_cast(!ConfigSettings::get("outputorient")->getValue())); }); CONNECT(ui.buttonProgressCancel, clicked, [this] { progressCancel(); }); CONNECT(ui.buttonAutolayout, clicked, [this] { m_displayer->autodetectOCRAreas(); }); ADD_SETTING(VarSetting>("wingeom")); ADD_SETTING(SwitchSettingT("showcontrols", ui.buttonControls)); ADD_SETTING(ComboSetting("outputeditor", ui.comboOcrmode)); m_recognizer->updateLanguagesMenu(); pushState(State::Idle, _("Select an image to begin...")); const std::vector& geom = ConfigSettings::get>>("wingeom")->getValue(); if(geom.size() == 4) { ui.windowMain->resize(geom[2], geom[3]); ui.windowMain->move(geom[0], geom[1]); } ui.panedOutput->set_orientation(static_cast(!ConfigSettings::get("outputorient")->getValue())); #if ENABLE_VERSIONCHECK if(ConfigSettings::get("updatecheck")->getValue()) { m_newVerThread = Glib::Threads::Thread::create([this] { getNewestVersion(); }); } #endif } MainWindow::~MainWindow() { #if ENABLE_VERSIONCHECK if(m_newVerThread) { m_newVerThread->join(); } #endif 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) { ui.menubuttonOptions->set_menu_model(menuModel); ui.menubuttonOptions->set_visible(true); } void MainWindow::openFiles(const std::vector>& files) { m_sourceManager->addSources(files); } void MainWindow::setOutputPaneVisible(bool visible) { ui.buttonOutputpane->set_active(visible); } void MainWindow::pushState(State state, const Glib::ustring& msg) { m_stateStack.push_back(state); ui.statusbar->push(msg); setState(state); } void MainWindow::popState() { ui.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); } ui.panedOutput->set_sensitive(!isBusy); ui.headerbar->set_sensitive(!isBusy); if(ui.windowMain->get_window()) { ui.windowMain->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); ui.progressbarProgress->set_fraction(0); ui.buttonProgressCancel->set_sensitive(true); ui.boxProgress->set_visible(true); } void MainWindow::hideProgress() { ui.boxProgress->set_visible(false); m_connection_progressUpdate.disconnect(); m_progressMonitor = nullptr; } void MainWindow::progressCancel() { if(m_progressMonitor) { ui.buttonProgressCancel->set_sensitive(true); m_progressMonitor->cancel(); } } void MainWindow::progressUpdate() { if(m_progressMonitor) { ui.progressbarProgress->set_fraction(m_progressMonitor->getProgress() / 100.); } } bool MainWindow::closeEvent(GdkEventAny*) { if(!m_outputEditor->clear()) { return true; } if((ui.windowMain->get_window()->get_state() & Gdk::WINDOW_STATE_MAXIMIZED) == 0) { std::vector geom(4); ui.windowMain->get_position(geom[0], geom[1]); ui.windowMain->get_size(geom[2], geom[3]); ConfigSettings::get>>("wingeom")->setValue(geom); } ui.windowMain->hide(); return false; } void MainWindow::onSourceChanged() { std::vector sources = m_sourceManager->getSelectedSources(); if(m_displayer->setSources(sources)) { ui.headerbar->set_subtitle(sources.size() == 1 ? sources.front()->displayname : _("Multiple sources")); if(m_stateStack.back() == State::Idle) { pushState(State::Normal, _("Ready")); } } else { if(m_stateStack.back() == State::Normal) { popState(); } ui.headerbar->set_subtitle(""); } } void MainWindow::showAbout() { ui.dialogAbout->run(); ui.dialogAbout->hide(); } void MainWindow::showHelp(const std::string& chapter) { #ifdef G_OS_WIN32 // Always use relative path on Windows std::string manualDirPath; char* locale = g_win32_getlocale(); std::string language(locale, 2); g_free(locale); #else std::string manualDirPath = MANUAL_DIR; std::string language = Glib::getenv("LANG").substr(0, 2); #endif if(manualDirPath.empty()) { manualDirPath = Glib::build_filename(pkgDir, "share", "doc", "gimagereader"); } std::string manualFile = Utils::make_absolute_path(Glib::build_filename(manualDirPath, Glib::ustring::compose("manual-%1.html", language)), Glib::get_current_dir()); if(!Glib::file_test(manualFile, Glib::FILE_TEST_EXISTS)) { manualFile = Utils::make_absolute_path(Glib::build_filename(manualDirPath, "manual.html"), Glib::get_current_dir()); } 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)) { ui.comboOcrmode->set_active(0); } else if(dynamic_cast(m_outputEditor)) { ui.comboOcrmode->set_active(1); } m_connection_setOCRMode.block(false); } else { if(m_outputEditor) { ui.panedOutput->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)); } ui.buttonAutolayout->set_visible(m_displayerTool->allowAutodetectOCRAreas()); m_displayer->setTool(m_displayerTool); m_outputEditor->setLanguage(m_recognizer->getSelectedLanguage()); ui.panedOutput->pack2(*m_outputEditor->getUI(), true, false); m_outputEditor->getUI()->set_visible(ui.buttonOutputpane->get_active()); } } void MainWindow::redetectLanguages() { m_recognizer->updateLanguagesMenu(); } void MainWindow::manageLanguages() { TessdataManager::exec(); } 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(); ui.boxMain->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; } ui.boxMain->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(); m_newVerThread = nullptr; Glib::ustring curver = PACKAGE_VERSION; if(newver.compare(curver) > 0) { addNotification(_("New version"), Glib::ustring::compose(_("gImageReader %1 is available"), newver), { {_("Download"), [ = ]{ Utils::openUri(DOWNLOADURL); return false; }}, {_("Changelog"), [ = ]{ Utils::openUri(CHANGELOGURL); return false; }}, {_("Don't notify again"), [this]{ ConfigSettings::get("updatecheck")->setValue(false); return true; }} }); } } #endif // ENABLE_VERSIONCHECK void MainWindow::languageChanged(const Config::Lang& lang) { if(m_outputEditor) { m_outputEditor->setLanguage(lang); } hideNotification(m_notifierHandle); m_notifierHandle = nullptr; std::string code = lang.code; if(code.empty()) { return; } GtkSpell::Checker checker; try { checker.set_language(code); } catch(const GtkSpell::Error& /*e*/) { if(ConfigSettings::get("dictinstall")->getValue()) { NotificationAction actionDontShowAgain = {_("Don't show again"), [this]{ ConfigSettings::get("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) { 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/"; std::string spellingDir = getConfig()->spellingLocation(); Glib::RefPtr dir = Gio::File::create_for_path(spellingDir); bool dirExists = false; try { dirExists = dir->make_directory_with_parents(); } catch(...) { dirExists = dir->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 htmlData = Utils::download(url, messages); if(!htmlData) { popState(); Utils::message_dialog(Gtk::MESSAGE_ERROR, _("Error"), Glib::ustring::compose(_("Could not read %1: %2."), url, messages)); return; } Glib::ustring html(reinterpret_cast(htmlData->get_data()), htmlData->size()); std::string langCode = code.substr(0, 2); Glib::RefPtr langPat = Glib::Regex::create(Glib::ustring::compose(">(%1_?[A-Z]*)<", langCode)); Glib::RefPtr dictPat = Glib::Regex::create(Glib::ustring::compose(">(%1_?[\\w_]*\\.(dic|aff))<", langCode)); std::vector downloaded; std::vector failed; int pos = 0; Glib::MatchInfo langMatchInfo; while(langPat->match(html, pos, langMatchInfo)) { Glib::ustring lang = langMatchInfo.fetch(1); int start; langMatchInfo.fetch_pos(0, start, pos); Glib::RefPtr dictHtmlData = Utils::download(url + lang + "/", messages); if(!dictHtmlData) { continue; } Glib::ustring dictHtml(reinterpret_cast(dictHtmlData->get_data()), dictHtmlData->size()); int dictPos = 0; Glib::MatchInfo dictMatchInfo; while(dictPat->match(dictHtml, dictPos, dictMatchInfo)) { Glib::ustring filename = dictMatchInfo.fetch(1); pushState(State::Busy, Glib::ustring::compose(_("Downloading '%1'..."), filename)); Glib::RefPtr data = Utils::download(plainurl + lang + "/" + filename, messages); if(data) { std::ofstream file(Glib::build_filename(spellingDir, filename), std::ios::binary); if(file.is_open()) { file.write(reinterpret_cast(data->get_data()), data->size()); downloaded.push_back(filename); } else { failed.push_back(filename); } } else { failed.push_back(filename); } popState(); int start; dictMatchInfo.fetch_pos(0, start, dictPos); } } popState(); if(!failed.empty()) { Utils::message_dialog(Gtk::MESSAGE_ERROR, _("Error"), Glib::ustring::compose(_("The following dictionaries could not be downloaded:\n%1\n\nCheck the connectivity and directory permissions.\nHint: If you don't have write permissions in system folders, you can switch to user paths in the settings dialog."), Utils::string_join(failed, "\n"))); } else if(!downloaded.empty()) { m_recognizer->updateLanguagesMenu(); Utils::message_dialog(Gtk::MESSAGE_INFO, _("Dictionaries installed"), Glib::ustring::compose(_("The following dictionaries were installed:\n%1"), Utils::string_join(downloaded, "\n"))); } else { Utils::message_dialog(Gtk::MESSAGE_ERROR, _("Error"), Glib::ustring::compose(_("No spelling dictionaries found for '%1'."), code)); } } gImageReader-3.3.1/gtk/src/MainWindow.hh000066400000000000000000000106221351740627400200150ustar00rootroot00000000000000/* -*- Mode: C++; indent-tabs-mode: t; c-basic-offset: 4; tab-width: 4 -*- */ /* * MainWindow.hh * Copyright (C) 2013-2019 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" #include "Config.hh" #include "ui_MainWindow.hh" #define MAIN MainWindow::getInstance() 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; }; class ProgressMonitor { public: ProgressMonitor(int total) : m_total(total) {} virtual ~ProgressMonitor() {} void increaseProgress() { Glib::Threads::Mutex::Lock lock(m_mutex); ++m_progress; } virtual int getProgress() const { Glib::Threads::Mutex::Lock lock(m_mutex); return (m_progress * 100) / m_total; } virtual void cancel() { Glib::Threads::Mutex::Lock lock(m_mutex); m_cancelled = true; } bool cancelled() const { Glib::Threads::Mutex::Lock lock(m_mutex); return m_cancelled; } protected: mutable Glib::Threads::Mutex m_mutex; const int m_total; int m_progress = 0; bool m_cancelled = false; }; typedef void* Notification; static MainWindow* getInstance() { return s_instance; } static void signalHandler(int signal); static void tesseractCrash(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 ui.windowMain; } void setMenuModel(const Glib::RefPtr& menuModel); void redetectLanguages(); void manageLanguages(); 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 void signalHandlerExec(int signal, bool tesseractCrash); static MainWindow* s_instance; Ui::MainWindow ui; ClassData m_classdata; 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_progressUpdate; bool closeEvent(GdkEventAny*); void languageChanged(const Config::Lang& lang); 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.3.1/gtk/src/OutputBuffer.cc000066400000000000000000000123251351740627400203630ustar00rootroot00000000000000/* -*- Mode: C++; indent-tabs-mode: t; c-basic-offset: 4; tab-width: 4 -*- */ /* * OutputBuffer.cc * Copyright (C) 2013-2019 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.3.1/gtk/src/OutputBuffer.hh000066400000000000000000000033231351740627400203730ustar00rootroot00000000000000/* -*- Mode: C++; indent-tabs-mode: t; c-basic-offset: 4; tab-width: 4 -*- */ /* * OutputBuffer.hh * Copyright (C) 2013-2019 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.3.1/gtk/src/OutputEditor.hh000066400000000000000000000033731351740627400204150ustar00rootroot00000000000000/* -*- Mode: C++; indent-tabs-mode: t; c-basic-offset: 4; tab-width: 4 -*- */ /* * OutputEditor.hh * Copyright (C) 2013-2019 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 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() const = 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.3.1/gtk/src/OutputEditorText.cc000066400000000000000000000324121351740627400212440ustar00rootroot00000000000000/* -*- Mode: C++; indent-tabs-mode: t; c-basic-offset: 4; tab-width: 4 -*- */ /* * OutputEditorText.cc * Copyright (C) 2013-2019 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 . */ #define USE_STD_NAMESPACE #include #undef USE_STD_NAMESPACE #include "ConfigSettings.hh" #include "FileDialogs.hh" #include "OutputBuffer.hh" #include "OutputEditorText.hh" #include "Recognizer.hh" #include "SourceManager.hh" #include "SearchReplaceFrame.hh" #include "Utils.hh" #include OutputEditorText::OutputEditorText() { ui.setupUi(); m_searchFrame = new SearchReplaceFrame(); ui.boxSearch->pack_start(*Gtk::manage(m_searchFrame->getWidget())); m_searchFrame->getWidget()->set_visible(false); m_textBuffer = OutputBuffer::create(); ui.textview->set_source_buffer(m_textBuffer); Glib::RefPtr group = MAIN->getWindow()->get_accel_group(); ui.buttonUndo->add_accelerator("clicked", group, GDK_KEY_Z, Gdk::CONTROL_MASK, Gtk::AccelFlags(0)); ui.buttonRedo->add_accelerator("clicked", group, GDK_KEY_Z, Gdk::CONTROL_MASK | Gdk::SHIFT_MASK, Gtk::AccelFlags(0)); ui.buttonFindreplace->add_accelerator("clicked", group, GDK_KEY_F, Gdk::CONTROL_MASK, Gtk::AccelFlags(0)); ui.buttonSave->add_accelerator("clicked", group, GDK_KEY_S, Gdk::CONTROL_MASK, Gtk::AccelFlags(0)); m_insertMode = InsertMode::Append; m_spell.attach(*ui.textview); m_spell.property_decode_language_codes() = true; CONNECT(ui.menuitemInsertAppend, activate, [this] { setInsertMode(InsertMode::Append, "ins_append.png"); }); CONNECT(ui.menuitemInsertCursor, activate, [this] { setInsertMode(InsertMode::Cursor, "ins_cursor.png"); }); CONNECT(ui.menuitemInsertReplace, activate, [this] { setInsertMode(InsertMode::Replace, "ins_replace.png"); }); CONNECT(ui.buttonStripcrlf, clicked, [this] { filterBuffer(); }); CONNECT(ui.buttonFindreplace, toggled, [this] { m_searchFrame->clear(); m_searchFrame->getWidget()->set_visible(ui.buttonFindreplace->get_active()); }); CONNECT(ui.buttonUndo, clicked, [this] { m_textBuffer->undo(); scrollCursorIntoView(); }); CONNECT(ui.buttonRedo, clicked, [this] { m_textBuffer->redo(); scrollCursorIntoView(); }); CONNECT(ui.buttonSave, clicked, [this] { save(); }); CONNECT(ui.buttonClear, clicked, [this] { clear(); }); CONNECTP(m_textBuffer, can_undo, [this] { ui.buttonUndo->set_sensitive(m_textBuffer->can_undo()); }); CONNECTP(m_textBuffer, can_redo, [this] { ui.buttonRedo->set_sensitive(m_textBuffer->can_redo()); }); CONNECT(m_searchFrame, find_replace, sigc::mem_fun(this, &OutputEditorText::findReplace)); CONNECT(m_searchFrame, replace_all, sigc::mem_fun(this, &OutputEditorText::replaceAll)); CONNECT(m_searchFrame, apply_substitutions, sigc::mem_fun(this, &OutputEditorText::applySubstitutions)); CONNECT(ConfigSettings::get("customoutputfont"), changed, [this] { setFont(); }); CONNECT(ConfigSettings::get("systemoutputfont"), changed, [this] { setFont(); }); CONNECT(ui.textview, populate_popup, [this](Gtk::Menu * menu) { completeTextViewMenu(menu); }); CONNECT(ui.menuitemStripcrlfDrawwhitespace, toggled, [this] { ui.textview->set_draw_spaces(ui.menuitemStripcrlfDrawwhitespace->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(ui.textview->is_focus()); }); CONNECTP(m_textBuffer, has_selection, [this] { m_textBuffer->save_region_bounds(ui.textview->is_focus()); }); ADD_SETTING(SwitchSettingT("keepdot", ui.menuitemStripcrlfKeependmark)); ADD_SETTING(SwitchSettingT("keepquote", ui.menuitemStripcrlfKeepquote)); ADD_SETTING(SwitchSettingT("joinhyphen", ui.menuitemStripcrlfJoinhyphen)); ADD_SETTING(SwitchSettingT("joinspace", ui.menuitemStripcrlfJoinspace)); ADD_SETTING(SwitchSettingT("keepparagraphs", ui.menuitemStripcrlfKeepparagraphs)); ADD_SETTING(SwitchSettingT("drawwhitespace", ui.menuitemStripcrlfDrawwhitespace)); setFont(); } OutputEditorText::~OutputEditorText() { delete m_searchFrame; } void OutputEditorText::setFont() { if(ConfigSettings::get("systemoutputfont")->getValue()) { ui.textview->unset_font(); } else { Glib::ustring fontName = ConfigSettings::get("customoutputfont")->getValue(); ui.textview->override_font(Pango::FontDescription(fontName)); } } void OutputEditorText::scrollCursorIntoView() { ui.textview->scroll_to(ui.textview->get_buffer()->get_insert()); ui.textview->grab_focus(); } void OutputEditorText::setInsertMode(InsertMode mode, const std::string& iconName) { m_insertMode = mode; ui.imageInsert->set(Gdk::Pixbuf::create_from_resource(Glib::ustring::compose("/org/gnome/gimagereader/%1", iconName))); } 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(ui.menuitemStripcrlfJoinhyphen->get_active()) { txt = Glib::Regex::create("[-\u2014]\\s*\\n\\s*")->replace(txt, 0, "", static_cast(0)); } Glib::ustring preChars, sucChars; if(ui.menuitemStripcrlfKeepparagraphs->get_active()) { preChars += "\\n"; // Keep if preceded by line break } if(ui.menuitemStripcrlfKeependmark->get_active()) { preChars += "\\.\\?!"; // Keep if preceded by end mark (.?!) } if(ui.menuitemStripcrlfKeepquote->get_active()) { preChars += "'\"\u00BB\u00AB"; // Keep if preceded by quote sucChars += "'\"\u00AB\u00BB"; // Keep if succeeded by quote } if(ui.menuitemStripcrlfKeepparagraphs->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(ui.menuitemStripcrlfJoinspace->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::completeTextViewMenu(Gtk::Menu* menu) { Gtk::CheckMenuItem* item = Gtk::manage(new Gtk::CheckMenuItem(_("Check spelling"))); item->set_active(bool(GtkSpell::Checker::get_from_text_view(*ui.textview))); CONNECT(item, toggled, [this, item] { if(item->get_active()) { m_spell.attach(*ui.textview); } else { m_spell.detach(); } }); menu->prepend(*Gtk::manage(new Gtk::SeparatorMenuItem())); menu->prepend(*item); menu->show_all(); } void OutputEditorText::findReplace(const Glib::ustring& searchstr, const Glib::ustring& replacestr, bool matchCase, bool backwards, bool replace) { m_searchFrame->clearErrorState(); if(!m_textBuffer->findReplace(backwards, replace, matchCase, searchstr, replacestr, ui.textview)) { m_searchFrame->setErrorState(); } } void OutputEditorText::replaceAll(const Glib::ustring& searchstr, const Glib::ustring& replacestr, bool matchCase) { MAIN->pushState(MainWindow::State::Busy, _("Replacing...")); if(!m_textBuffer->replaceAll(searchstr, replacestr, matchCase)) { m_searchFrame->setErrorState(); } MAIN->popState(); } void OutputEditorText::applySubstitutions(const std::map& substitutions, bool matchCase) { MAIN->pushState(MainWindow::State::Busy, _("Applying substitutions...")); Gtk::TextIter start, end; m_textBuffer->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; } for(auto sit = substitutions.begin(), sitEnd = substitutions.end(); sit != sitEnd; ++sit) { Glib::ustring search = sit->first; Glib::ustring replace = sit->second; int diff = replace.length() - search.length(); Gtk::TextIter it = m_textBuffer->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_textBuffer->insert(m_textBuffer->erase(matchStart, matchEnd), replace); endpos += diff; } while(Gtk::Main::events_pending()) { Gtk::Main::iteration(); } } m_textBuffer->select_range(m_textBuffer->get_iter_at_offset(startpos), m_textBuffer->get_iter_at_offset(endpos)); MAIN->popState(); } 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 suggestion = !sources.empty() ? Utils::split_filename(sources.front()->displayname).first : _("output"); FileDialogs::FileFilter filter = {_("Text Files"), {"text/plain"}, {"*.txt"}}; outname = FileDialogs::save_dialog(_("Save Output..."), suggestion + ".txt", "outputdir", filter); if(outname.empty()) { return false; } } 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(!ui.boxEditorText->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 /*visible*/) { m_searchFrame->hideSubstitutionsManager(); } 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.3.1/gtk/src/OutputEditorText.hh000066400000000000000000000051511351740627400212560ustar00rootroot00000000000000/* -*- Mode: C++; indent-tabs-mode: t; c-basic-offset: 4; tab-width: 4 -*- */ /* * OutputEditorText.hh * Copyright (C) 2013-2019 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 "MainWindow.hh" #include "OutputBuffer.hh" #include "OutputEditor.hh" #include "ui_OutputEditorText.hh" class SearchReplaceFrame; class OutputEditorText : public OutputEditor { public: OutputEditorText(); ~OutputEditorText(); Gtk::Box* getUI() const override { return ui.boxEditorText; } 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 }; Ui::OutputEditorText ui; ClassData m_classdata; SearchReplaceFrame* m_searchFrame; Glib::RefPtr m_textBuffer; InsertMode m_insertMode; GtkSpell::Checker m_spell; void addText(const Glib::ustring& text, bool insert); void completeTextViewMenu(Gtk::Menu* menu); void filterBuffer(); void findReplace(const Glib::ustring& searchstr, const Glib::ustring& replacestr, bool matchCase, bool backwards, bool replace); void replaceAll(const Glib::ustring& searchstr, const Glib::ustring& replacestr, bool matchCase); void applySubstitutions(const std::map& substitutions, bool matchCase); void scrollCursorIntoView(); void setFont(); void setInsertMode(InsertMode mode, const std::string& iconName); }; #endif // OUTPUTEDITORTEXT_HH gImageReader-3.3.1/gtk/src/Recognizer.cc000066400000000000000000000547271351740627400200540ustar00rootroot00000000000000/* -*- Mode: C++; indent-tabs-mode: t; c-basic-offset: 4; tab-width: 4 -*- */ /* * Recognizer.cc * Copyright (C) 2013-2019 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 "Displayer.hh" #include "MainWindow.hh" #include "OutputEditor.hh" #include "Recognizer.hh" #include "Utils.hh" #include #include #include #define USE_STD_NAMESPACE #include #include #include #include #undef USE_STD_NAMESPACE #include #include #ifdef G_OS_WIN32 #include #define pipe(fds) _pipe(fds, 5000, _O_BINARY) #endif class Recognizer::ProgressMonitor : public MainWindow::ProgressMonitor { public: ETEXT_DESC desc; ProgressMonitor(int nPages) : MainWindow::ProgressMonitor(nPages) { desc.progress = 0; desc.cancel = cancelCallback; desc.cancel_this = this; } int getProgress() const override { Glib::Threads::Mutex::Lock lock(m_mutex); return 100.0 * ((m_progress + desc.progress / 100.0) / m_total); } static bool cancelCallback(void* instance, int /*words*/) { ProgressMonitor* monitor = reinterpret_cast(instance); Glib::Threads::Mutex::Lock lock(monitor->m_mutex); return monitor->m_cancelled; } }; 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: ClassData m_classdata; bool m_selected = false; bool m_ignoreNextActivate = false; }; Recognizer::Recognizer(const Ui::MainWindow& _ui) : ui(_ui) { CONNECT(ui.buttonRecognize, clicked, [this] { recognizeButtonClicked(); }); CONNECT(ui.menuitemRecognizeCurrent, activate, [this] { recognizeCurrentPage(); }); CONNECT(ui.menuitemRecognizeMultiple, activate, [this] { recognizeMultiplePages();; }); CONNECT(ui.entryPageRange, focus_in_event, [this](GdkEventFocus*) { Utils::clear_error_state(ui.entryPageRange); return false; }); CONNECT(ui.radioButtonBlacklist, toggled, [this] { ui.entryBlacklist->set_sensitive(ui.radioButtonBlacklist->get_active()); }); CONNECT(ui.radioButtonWhitelist, toggled, [this] { ui.entryWhitelist->set_sensitive(ui.radioButtonWhitelist->get_active()); }); ADD_SETTING(VarSetting("language")); ADD_SETTING(ComboSetting("ocrregionstrategy", ui.comboPageRangeRegions)); ADD_SETTING(SwitchSettingT("ocraddsourcefilename", ui.checkPageRangePrependFile)); ADD_SETTING(SwitchSettingT("ocraddsourcepage", ui.checkPageRangePrependPage)); ADD_SETTING(EntrySetting("ocrcharwhitelist", ui.entryWhitelist)); ADD_SETTING(EntrySetting("ocrcharblacklist", ui.entryBlacklist)); ADD_SETTING(SwitchSettingT("ocrblacklistenabled", ui.radioButtonBlacklist)); ADD_SETTING(SwitchSettingT("ocrwhitelistenabled", ui.radioButtonWhitelist)); ADD_SETTING(VarSetting("psm")); } std::vector Recognizer::getAvailableLanguages() const { tesseract::TessBaseAPI tess = initTesseract(); GenericVector availLanguages; tess.GetAvailableLanguagesAsVector(&availLanguages); std::vector result; for(int i = 0; i < availLanguages.size(); ++i) { result.push_back(availLanguages[i].string()); } std::sort(result.begin(), result.end(), [](const Glib::ustring & s1, const Glib::ustring & s2) { bool s1Script = s1.substr(0, 6) == "script" || s1.substr(0, 1) == s1.substr(0, 1).uppercase(); bool s2Script = s2.substr(0, 6) == "script" || s2.substr(0, 1) == s2.substr(0, 1).uppercase(); if(s1Script != s2Script) { return !s1Script; } else { return s1 < s2; } }); return result; } tesseract::TessBaseAPI Recognizer::initTesseract(const char* language, bool* ok) const { // unfortunately tesseract creates deliberate segfaults when an error occurs std::signal(SIGABRT, MainWindow::tesseractCrash); std::string current = setlocale(LC_ALL, NULL); setlocale(LC_ALL, "C"); tesseract::TessBaseAPI tess; int ret = tess.Init(nullptr, language); std::signal(SIGSEGV, MainWindow::signalHandler); setlocale(LC_ALL, current.c_str()); if(ok) { *ok = ret != -1; } return tess; } void Recognizer::updateLanguagesMenu() { ui.menuLanguages->foreach([this](Gtk::Widget& w) { ui.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(ConfigSettings::get>("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.")); ui.labelRecognizeLang->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); ui.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; } ui.menuLanguages->append(*curitem); } } // Add multilanguage menu bool isMultilingual = false; if(!availLanguages.empty()) { ui.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); ui.menuLanguages->append(*m_multilingualRadio); } if(isMultilingual) { activeitem = m_multilingualRadio; setMultiLanguage(); } else if(activeitem == nullptr) { activeitem = curitem; } // Add PSM items ui.menuLanguages->append(*Gtk::manage(new Gtk::SeparatorMenuItem())); Gtk::Menu* psmMenu = Gtk::manage(new Gtk::Menu); m_currentPsmMode = ConfigSettings::get>("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; ConfigSettings::get>("psm")->setValue(entry.psmMode); } }); psmMenu->append(*item); } Gtk::MenuItem* psmItem = Gtk::manage(new Gtk::MenuItem(_("Page segmentation mode"))); psmItem->set_submenu(*psmMenu); ui.menuLanguages->append(*psmItem); Gtk::MenuItem* charlistItem = Gtk::manage(new Gtk::MenuItem(_("Character whitelist / blacklist..."))); CONNECT(charlistItem, activate, [this] { manageCharaterLists(); }); ui.menuLanguages->append(*charlistItem); // Add installer item ui.menuLanguages->append(*Gtk::manage(new Gtk::SeparatorMenuItem())); Gtk::MenuItem* manageItem = Gtk::manage(new Gtk::MenuItem(_("Manage languages..."))); CONNECT(manageItem, activate, [this] { MAIN->manageLanguages(); }); ui.menuLanguages->append(*manageItem); ui.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()) { ui.labelRecognizeLang->set_markup(Glib::ustring::compose(" %1 (%2)", lang.name, lang.code)); } else { ui.labelRecognizeLang->set_markup(Glib::ustring::compose(" %1", lang.name)); } m_curLang = lang; ConfigSettings::get>("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); ui.labelRecognizeLang->set_markup("" + langs + ""); m_curLang = {langs, "", "Multilingual"}; ConfigSettings::get>("language")->setValue(langs + ":"); m_signal_languageChanged.emit(m_curLang); } void Recognizer::setRecognizeMode(const Glib::ustring& mode) { ui.labelRecognizeMode->set_markup(Glib::ustring::compose("%1", mode)); } std::vector Recognizer::selectPages(bool& autodetectLayout) { int nPages = MAIN->getDisplayer()->getNPages(); ui.entryPageRange->set_text(Glib::ustring::compose("1-%1", nPages)); ui.entryPageRange->grab_focus(); ui.labelPageRangeRegions->set_visible(MAIN->getDisplayer()->allowAutodetectOCRAreas()); ui.comboPageRangeRegions->set_visible(MAIN->getDisplayer()->allowAutodetectOCRAreas()); ui.boxPageRangePrepend->set_visible(MAIN->getDisplayer()->allowAutodetectOCRAreas()); Glib::RefPtr store = Glib::RefPtr::cast_static(ui.comboPageRangeRegions->get_model()); int col = ui.comboPageRangeRegions->get_entry_text_column(); store->children()[0]->set_value(col, MAIN->getDisplayer()->hasMultipleOCRAreas() ? _("Current selection") : _("Entire page")); static Glib::RefPtr validateRegEx = Glib::Regex::create("^[\\d,\\-\\s]+$"); std::vector pages; while(ui.dialogPageRange->run() == Gtk::RESPONSE_OK) { pages.clear(); Glib::ustring text = ui.entryPageRange->get_text(); if(validateRegEx->match(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 = Utils::parseInt(ranges[0]); if(page > 0 && page <= nPages) { pages.push_back(page); } } else if(ranges.size() == 2) { int start = std::max(1, Utils::parseInt(ranges[0])); int end = std::min(nPages, Utils::parseInt(ranges[1])); for(int page = start; page <= end; ++page) { pages.push_back(page); } } else { pages.clear(); break; } } } if(pages.empty()) { Utils::set_error_state(ui.entryPageRange); } else { break; } } autodetectLayout = ui.comboPageRangeRegions->get_visible() ? ui.comboPageRangeRegions->get_active_row_number() == 1 : false; ui.dialogPageRange->hide(); std::sort(pages.begin(), pages.end()); return pages; } void Recognizer::manageCharaterLists() { ui.dialogCharacterLists->run(); ui.dialogCharacterLists->hide(); } 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), ui.buttonRecognize, ui.menuRecognizePages, false, true); ui.menuRecognizePages->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) { bool prependFile = pages.size() > 1 && ConfigSettings::get("ocraddsourcefilename")->getValue(); bool prependPage = pages.size() > 1 && ConfigSettings::get("ocraddsourcepage")->getValue(); bool ok = false; tesseract::TessBaseAPI tess = initTesseract(m_curLang.prefix.c_str(), &ok); if(ok) { Glib::ustring failed; tess.SetPageSegMode(static_cast(m_currentPsmMode)); if(ui.radioButtonWhitelist->get_active()) { tess.SetVariable("tessedit_char_whitelist", ui.entryWhitelist->get_text().c_str()); } if(ui.radioButtonBlacklist->get_active()) { tess.SetVariable("tessedit_char_blacklist", ui.entryBlacklist->get_text().c_str()); } 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)); }); PageData pageData; Utils::runInMainThreadBlocking([&] { pageData = setPage(page, autodetectLayout); }); if(!pageData.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 = pageData.filename; readSessionData->page = pageData.page; readSessionData->angle = pageData.angle; readSessionData->resolution = pageData.resolution; bool firstChunk = true; bool newFile = readSessionData->file != prevFile; prevFile = readSessionData->file; for(const Cairo::RefPtr& image : pageData.ocrAreas) { 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.cancelled()) { MAIN->getOutputEditor()->read(tess, readSessionData); } } Glib::signal_idle().connect_once([] { MAIN->popState(); }); monitor.increaseProgress(); if(monitor.cancelled()) { 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) { bool ok = false; tesseract::TessBaseAPI tess = initTesseract(m_curLang.prefix.c_str(), &ok); if(!ok) { 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.cancelled()) { 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.cancelled()) { char* text = tess.GetUTF8Text(); output = text; delete[] text; return true; } return false; }, _("Recognizing..."))) { Gtk::Clipboard::get()->set_text(output); } } MAIN->hideProgress(); return true; } Recognizer::PageData Recognizer::setPage(int page, bool autodetectLayout) { PageData pageData; pageData.success = MAIN->getDisplayer()->setup(&page); if(pageData.success) { if(autodetectLayout) { MAIN->getDisplayer()->autodetectOCRAreas(); } pageData.filename = MAIN->getDisplayer()->getCurrentImage(pageData.page); pageData.angle = MAIN->getDisplayer()->getCurrentAngle(); pageData.resolution = MAIN->getDisplayer()->getCurrentResolution(); pageData.ocrAreas = MAIN->getDisplayer()->getOCRAreas(); } return pageData; } 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; } gImageReader-3.3.1/gtk/src/Recognizer.hh000066400000000000000000000055501351740627400200540ustar00rootroot00000000000000/* -*- Mode: C++; indent-tabs-mode: t; c-basic-offset: 4; tab-width: 4 -*- */ /* * Recognizer.hh * Copyright (C) 2013-2019 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 "Config.hh" #include namespace tesseract { class TessBaseAPI; } namespace Ui { class MainWindow; } class Recognizer { public: enum class OutputDestination { Buffer, Clipboard }; Recognizer(const Ui::MainWindow& _ui); 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 }; struct PageData { bool success; std::string filename; int page; double angle; int resolution; std::vector> ocrAreas; }; const Ui::MainWindow& ui; ClassData m_classdata; Gtk::RadioButtonGroup m_langMenuRadioGroup; Gtk::RadioButtonGroup m_psmRadioGroup; int m_currentPsmMode; std::vector> m_langMenuCheckGroup; MultilingualMenuItem* m_multilingualRadio = nullptr; Config::Lang m_curLang; sigc::signal m_signal_languageChanged; tesseract::TessBaseAPI initTesseract(const char* language = nullptr, bool* ok = nullptr) const; void manageCharaterLists(); 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(); PageData setPage(int page, bool autodetectLayout); bool onMultilingualMenuButtonEvent(GdkEventButton* ev); bool onMultilingualItemButtonEvent(GdkEventButton* ev, Gtk::CheckMenuItem* item); }; #endif // RECOGNIZER_HH gImageReader-3.3.1/gtk/src/Scanner.hh000066400000000000000000000044721351740627400173400ustar00rootroot00000000000000/* -*- Mode: C++; indent-tabs-mode: t; c-basic-offset: 4; tab-width: 4 -*- */ /* * Scanner.hh * Copyright (C) 2013-2019 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.3.1/gtk/src/SearchReplaceFrame.cc000066400000000000000000000045451351740627400214120ustar00rootroot00000000000000/* -*- Mode: C++; indent-tabs-mode: t; c-basic-offset: 4; tab-width: 4 -*- */ /* * SearchReplaceFrame.cc * Copyright (C) 2013-2019 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 "SearchReplaceFrame.hh" #include "SubstitutionsManager.hh" #include "Utils.hh" SearchReplaceFrame::SearchReplaceFrame() { ui.setupUi(); m_substitutionsManager = new SubstitutionsManager(); CONNECT(ui.checkbuttonMatchcase, toggled, [this] { clearErrorState(); }); CONNECT(ui.entrySearch, changed, [this] { clearErrorState(); }); CONNECT(ui.entrySearch, activate, [this] { findNext(); }); CONNECT(ui.entryReplace, activate, [this] { replaceNext(); }); CONNECT(ui.buttonSearchnext, clicked, [this] { findNext(); }); CONNECT(ui.buttonSearchprev, clicked, [this] { findPrev(); }); CONNECT(ui.buttonReplace, clicked, [this] { replaceNext(); }); CONNECT(ui.buttonReplaceall, clicked, [this] { emitReplaceAll(); }); CONNECT(ui.buttonSubstitutions, clicked, [this] { m_substitutionsManager->set_visible(true); }); CONNECT(m_substitutionsManager, apply_substitutions, [this]( const std::map& substitutions) { emitApplySubstitutions(substitutions); }); ADD_SETTING(SwitchSettingT("searchmatchcase", ui.checkbuttonMatchcase)); } SearchReplaceFrame::~SearchReplaceFrame() { delete m_substitutionsManager; } void SearchReplaceFrame::clear() { ui.entrySearch->set_text(""); ui.entryReplace->set_text(""); } void SearchReplaceFrame::clearErrorState() { Utils::clear_error_state(ui.entrySearch); } void SearchReplaceFrame::setErrorState() { Utils::set_error_state(ui.entrySearch); } void SearchReplaceFrame::hideSubstitutionsManager() { m_substitutionsManager->set_visible(false); } gImageReader-3.3.1/gtk/src/SearchReplaceFrame.hh000066400000000000000000000055501351740627400214210ustar00rootroot00000000000000/* -*- Mode: C++; indent-tabs-mode: t; c-basic-offset: 4; tab-width: 4 -*- */ /* * SearchReplaceFrame.hh * Copyright (C) 2013-2019 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 SEARCHREPLACEFRAME_HH #define SEARCHREPLACEFRAME_HH #include "common.hh" #include "ui_SearchReplaceFrame.hh" class SubstitutionsManager; class SearchReplaceFrame { public: explicit SearchReplaceFrame(); ~SearchReplaceFrame(); Gtk::Box* getWidget() const { return ui.boxSearchreplace; } void clear(); void clearErrorState(); void setErrorState(); void hideSubstitutionsManager(); sigc::signal signal_find_replace() { return m_signal_find_replace; } sigc::signal signal_replace_all() { return m_signal_replace_all; } sigc::signal&, bool> signal_apply_substitutions() { return m_signal_apply_substitutions; } private: sigc::signal m_signal_find_replace; sigc::signal m_signal_replace_all; sigc::signal&, bool> m_signal_apply_substitutions; Ui::SearchReplaceFrame ui; ClassData m_classdata; SubstitutionsManager* m_substitutionsManager; private: void findNext() { m_signal_find_replace.emit(ui.entrySearch->get_text(), ui.entryReplace->get_text(), ui.checkbuttonMatchcase->get_active(), false, false); } void findPrev() { m_signal_find_replace.emit(ui.entrySearch->get_text(), ui.entryReplace->get_text(), ui.checkbuttonMatchcase->get_active(), true, false); } void replaceNext() { m_signal_find_replace.emit(ui.entrySearch->get_text(), ui.entryReplace->get_text(), ui.checkbuttonMatchcase->get_active(), false, true); } void emitReplaceAll() { m_signal_replace_all.emit(ui.entrySearch->get_text(), ui.entryReplace->get_text(), ui.checkbuttonMatchcase->get_active()); } void emitApplySubstitutions(const std::map& substitutions) { m_signal_apply_substitutions.emit(substitutions, ui.checkbuttonMatchcase->get_active()); } }; #endif // SEARCHREPLACEFRAME_HH gImageReader-3.3.1/gtk/src/SourceManager.cc000066400000000000000000000342551351740627400204720ustar00rootroot00000000000000/* -*- Mode: C++; indent-tabs-mode: t; c-basic-offset: 4; tab-width: 4 -*- */ /* * SourceManager.cc * Copyright (C) 2013-2019 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 #include SourceManager::SourceManager(const Ui::MainWindow& _ui) : ui(_ui) { ui.treeviewSources->set_model(Gtk::ListStore::create(m_listViewCols)); ui.treeviewSources->append_column("", m_listViewCols.filename); Gtk::TreeViewColumn* col = ui.treeviewSources->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; ui.treeviewSources->set_fixed_height_mode(); Glib::RefPtr recentFilter = Gtk::RecentFilter::create(); recentFilter->add_pixbuf_formats(); recentFilter->add_mime_type("application/pdf"); recentFilter->add_pattern("*.pdf"); recentFilter->add_mime_type("image/vnd.djvu"); recentFilter->add_pattern("*.djvu"); 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); ui.menuitemSourcesRecent->set_submenu(*recentChooser); m_clipboard = Gtk::Clipboard::get_for_display(Gdk::Display::get_default()); CONNECT(ui.buttonSources, toggled, [this] { ui.notebookSources->set_visible(ui.buttonSources->get_active()); }); CONNECT(ui.buttonSourcesAdd, clicked, [this] { openSources(); }); CONNECT(ui.menubuttonSourcesAdd, clicked, [this] { ui.menuitemSourcesPaste->set_sensitive(m_clipboard->wait_is_image_available()); }); CONNECT(ui.menuitemSourcesPaste, activate, [this] { pasteClipboard(); }); CONNECT(ui.menuitemSourcesScreenshot, activate, [this] { takeScreenshot(); }); CONNECT(ui.buttonSourcesRemove, clicked, [this] { removeSource(false); }); CONNECT(ui.buttonSourcesDelete, clicked, [this] { removeSource(true); }); CONNECT(ui.buttonSourcesClear, clicked, [this] { clearSources(); }); m_connectionSelectionChanged = CONNECT(ui.treeviewSources->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 ui.scrollwinSources->drag_dest_set({Gtk::TargetEntry("text/uri-list")}, Gtk::DEST_DEFAULT_MOTION | Gtk::DEST_DEFAULT_DROP, Gdk::ACTION_COPY | Gdk::ACTION_MOVE); CONNECT(ui.scrollwinSources, drag_data_received, sigc::ptr_fun(Utils::handle_drag_drop)); } SourceManager::~SourceManager() { clearSources(); } int SourceManager::addSources(const std::vector>& files, bool suppressTextWarning) { Glib::ustring failed; Glib::RefPtr store = Glib::RefPtr::cast_static(ui.treeviewSources->get_model()); Gtk::TreeIter it = store->children().end(); int added = 0; std::vector filesWithText; for(Glib::RefPtr file : files) { if(!file->query_exists()) { failed += "\n " + 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; it = row; break; } } if(contains) { ++added; continue; } Source* source = new Source(file, file->get_basename(), file->monitor_file(Gio::FILE_MONITOR_SEND_MOVED), false); std::string filename = file->get_path(); #ifdef G_OS_WIN32 if(Glib::ustring(filename.substr(filename.length() - 4)).lowercase() == ".pdf" && !checkPdfSource(source, filesWithText)) { #else if(Utils::get_content_type(filename) == "application/pdf" && !checkPdfSource(source, filesWithText)) { #endif delete source; continue; } it = store->append(); it->set_value(m_listViewCols.filename, file->get_basename()); 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()); ++added; } if(!suppressTextWarning && !filesWithText.empty()) { Utils::message_dialog(Gtk::MESSAGE_INFO, _("PDFs with text"), Glib::ustring::compose(_("These PDF files already contain text:\n%1"), Utils::string_join(filesWithText, "\n"))); } m_connectionSelectionChanged.block(true); ui.treeviewSources->get_selection()->unselect_all(); m_connectionSelectionChanged.block(false); if(it) { ui.treeviewSources->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)); } return added; } bool SourceManager::checkPdfSource(Source* source, std::vector& filesWithText) const { GError* err = nullptr; std::string filename = source->file->get_path(); PopplerDocument* document = poppler_document_new_from_file(Glib::filename_to_uri(filename).c_str(), 0, &err); // Unlock if necessary if(err && g_error_matches (err, POPPLER_ERROR, POPPLER_ERROR_ENCRYPTED)) { g_error_free(err); err = nullptr; ui.labelPdfpassword->set_text(Glib::ustring::compose(_("Enter password for file '%1':"), source->file->get_basename())); ui.entryPdfpassword->set_text(""); while(true) { ui.entryPdfpassword->select_region(0, -1); ui.entryPdfpassword->grab_focus(); int response = ui.dialogPdfpassword->run(); ui.dialogPdfpassword->hide(); if(response != Gtk::RESPONSE_OK) { return false; } Glib::ustring pass = ui.entryPdfpassword->get_text(); document = poppler_document_new_from_file(Glib::filename_to_uri(filename).c_str(), pass.c_str(), &err); if(!err) { source->password = pass; break; } g_error_free(err); err = nullptr; } } // Check whether the PDF already contains text for (int i = 0, n = poppler_document_get_n_pages(document); i < n; ++i) { PopplerPage* poppage = poppler_document_get_page(document, i); bool hasText = poppler_page_get_text(poppage) != nullptr; g_object_unref(poppage); if(hasText) { filesWithText.push_back(filename); break; } } // Extract document metadata source->author = poppler_document_get_author(document) ? poppler_document_get_author(document) : ""; source->creator = poppler_document_get_creator(document) ? poppler_document_get_creator(document) : ""; source->keywords = poppler_document_get_keywords(document) ? poppler_document_get_keywords(document) : ""; source->producer = poppler_document_get_producer(document) ? poppler_document_get_producer(document) : ""; source->title = poppler_document_get_title(document) ? poppler_document_get_title(document) : ""; source->subject = poppler_document_get_subject(document) ? poppler_document_get_subject(document) : ""; poppler_document_get_pdf_version(document, &source->pdfVersionMajor, &source->pdfVersionMinor); return true; } std::vector SourceManager::getSelectedSources() const { std::vector selectedSources; for(const Gtk::TreeModel::Path& path : ui.treeviewSources->get_selection()->get_selected_rows()) { selectedSources.push_back(ui.treeviewSources->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"); filter.mime_types.push_back("image/vnd.djvu"); filter.patterns.push_back("*.djvu"); addSources(FileDialogs::open_dialog(_("Select Files"), initialFolder, "sourcedir", 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(ui.treeviewSources->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); ui.treeviewSources->get_selection()->unselect_all(); m_connectionSelectionChanged.block(false); ui.treeviewSources->get_selection()->select(it); } void SourceManager::removeSource(bool deleteFile) { std::string paths; for(const Gtk::TreeModel::Path& path : ui.treeviewSources->get_selection()->get_selected_rows()) { paths += std::string("\n") + ui.treeviewSources->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(ui.treeviewSources->get_model()); Gtk::TreeIter it; std::vector selected = ui.treeviewSources->get_selection()->get_selected_rows(); while(!selected.empty()) { it = ui.treeviewSources->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) { ui.treeviewSources->get_selection()->select(it); } m_connectionSelectionChanged.block(false); selectionChanged(); } void SourceManager::clearSources() { Glib::RefPtr store = Glib::RefPtr::cast_static(ui.treeviewSources->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 = !ui.treeviewSources->get_selection()->get_selected_rows().empty(); ui.buttonSourcesRemove->set_sensitive(enabled); ui.buttonSourcesDelete->set_sensitive(enabled); ui.buttonSourcesClear->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(ui.treeviewSources->get_model()); Source* source = it->get_value(m_listViewCols.source); if(event == Gio::FILE_MONITOR_EVENT_MOVED) { source->file = otherFile; source->displayname = otherFile->get_basename(); 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(ui.treeviewSources->get_selection()->is_selected(it)) { 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) { ui.treeviewSources->get_selection()->select(it); } } } gImageReader-3.3.1/gtk/src/SourceManager.hh000066400000000000000000000060431351740627400204760ustar00rootroot00000000000000/* -*- Mode: C++; indent-tabs-mode: t; c-basic-offset: 4; tab-width: 4 -*- */ /* * SourceManager.hh * Copyright (C) 2013-2019 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" namespace Ui { class MainWindow; } 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::ustring password; Glib::RefPtr monitor; bool isTemp; int brightness = 0; int contrast = 0; int resolution = -1; int page = 1; std::vector angle; bool invert = false; //Additional info from original file Glib::ustring author, title, creator, producer, keywords, subject; guint pdfVersionMajor = -1, pdfVersionMinor = -1; }; class SourceManager { public: SourceManager(const Ui::MainWindow& _ui); ~SourceManager(); int addSources(const std::vector>& files, bool suppressTextWarning = false); bool addSource(Glib::RefPtr file, bool suppressTextWarning) { return addSources({file}, suppressTextWarning) == 1; } 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); } } m_listViewCols; const Ui::MainWindow& ui; ClassData m_classdata; Glib::RefPtr m_clipboard; 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(); bool checkPdfSource(Source* source, std::vector& filesWithText) const; void removeSource(bool deleteFile); void savePixbuf(const Glib::RefPtr& pixbuf, const std::string& displayname); void selectionChanged(); void takeScreenshot(); }; #endif // SOURCEMANAGER_HH gImageReader-3.3.1/gtk/src/SubstitutionsManager.cc000066400000000000000000000141111351740627400221160ustar00rootroot00000000000000/* -*- Mode: C++; indent-tabs-mode: t; c-basic-offset: 4; tab-width: 4 -*- */ /* * SubstitutionsManager.cc * Copyright (C) 2013-2019 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 "ConfigSettings.hh" #include "FileDialogs.hh" #include "OutputBuffer.hh" #include "Utils.hh" #include SubstitutionsManager::SubstitutionsManager() { ui.setupUi(); m_listStore = Gtk::ListStore::create(m_viewCols); ui.treeview->set_model(m_listStore); ui.treeview->append_column_editable(_("Search for"), m_viewCols.search); ui.treeview->append_column_editable(_("Replace with"), m_viewCols.replace); ui.treeview->get_column(0)->set_sizing(Gtk::TREE_VIEW_COLUMN_FIXED); ui.treeview->get_column(1)->set_sizing(Gtk::TREE_VIEW_COLUMN_FIXED); ui.treeview->get_column(0)->set_expand(true); ui.treeview->get_column(1)->set_expand(true); ui.treeview->set_fixed_height_mode(); CONNECT(ui.toolbuttonOpen, clicked, [this] { openList(); }); CONNECT(ui.toolbuttonSave, clicked, [this] { saveList(); }); CONNECT(ui.toolbuttonClear, clicked, [this] { clearList(); }); CONNECT(ui.toolbuttonAdd, clicked, [this] { addRow(); }); CONNECT(ui.toolbuttonRemove, clicked, [this] { removeRows(); }); CONNECT(ui.buttonApply, clicked, [this] { applySubstitutions(); }); CONNECT(ui.buttonClose, clicked, [this] { ui.windowSubstitutions->hide(); }); CONNECT(ui.treeview->get_selection(), changed, [this] { ui.toolbuttonRemove->set_sensitive(ui.treeview->get_selection()->count_selected_rows() != 0); }); ADD_SETTING(ListStoreSetting("replacelist", Glib::RefPtr::cast_static(ui.treeview->get_model()))); } SubstitutionsManager::~SubstitutionsManager() { ConfigSettings::get("replacelist")->serialize(); } void SubstitutionsManager::set_visible(bool visible) { ui.windowSubstitutions->set_visible(visible); if(visible) { ui.windowSubstitutions->raise(); } } void SubstitutionsManager::openList() { if(!clearList()) { return; } std::string dir = !m_currentFile.empty() ? Glib::path_get_dirname(m_currentFile) : ""; FileDialogs::FileFilter filter = { _("Substitutions List"), {"text/plain"}, {"*.txt"}}; std::vector> files = FileDialogs::open_dialog(_("Open Substitutions List"), dir, "auxdir", filter, false, ui.windowSubstitutions); 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(); 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, "auxdir", filter, false, ui.windowSubstitutions); 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; 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, ui.windowSubstitutions); 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(); ui.treeview->set_cursor(m_listStore->get_path(it), *ui.treeview->get_column(0), true); } void SubstitutionsManager::removeRows() { if(ui.treeview->get_selection()->count_selected_rows() != 0) { std::vector rows; for(const Gtk::ListStore::TreeModel::Path& path : ui.treeview->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::applySubstitutions() { std::map substitutions; for(const Gtk::TreeModel::Row& row : m_listStore->children()) { Glib::ustring search, replace; row.get_value(0, search); row.get_value(1, replace); substitutions.insert(std::make_pair(search, replace)); } m_signal_apply_substitutions.emit(substitutions); } gImageReader-3.3.1/gtk/src/SubstitutionsManager.hh000066400000000000000000000035361351740627400221410ustar00rootroot00000000000000/* -*- Mode: C++; indent-tabs-mode: t; c-basic-offset: 4; tab-width: 4 -*- */ /* * SubstitutionsManager.hh * Copyright (C) 2013-2019 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" #include "ui_SubstitutionsManager.hh" class OutputBuffer; class SubstitutionsManager { public: SubstitutionsManager(); ~SubstitutionsManager(); void set_visible(bool visible); sigc::signal&> signal_apply_substitutions() { return m_signal_apply_substitutions; } private: struct ReplaceListColumns : public Gtk::TreeModel::ColumnRecord { Gtk::TreeModelColumn search; Gtk::TreeModelColumn replace; ReplaceListColumns() { add(search); add(replace); } }; sigc::signal&> m_signal_apply_substitutions; Ui::SubstitutionsManager ui; ClassData m_classdata; std::string m_currentFile; ReplaceListColumns m_viewCols; Glib::RefPtr m_listStore; void addRow(); void applySubstitutions(); bool clearList(); void openList(); void removeRows(); bool saveList(); }; #endif // SUBSTITUTIONS_MANAGER_HH gImageReader-3.3.1/gtk/src/TessdataManager.cc000066400000000000000000000336751351740627400210070ustar00rootroot00000000000000/* -*- Mode: C++; indent-tabs-mode: t; c-basic-offset: 4; tab-width: 4 -*- */ /* * TessdataManager.hh * Copyright (C) 2013-2019 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 "Recognizer.hh" #include "TessdataManager.hh" #include "Utils.hh" #include #include #ifdef G_OS_UNIX #include #endif #define USE_STD_NAMESPACE #include #undef USE_STD_NAMESPACE void TessdataManager::exec() { static TessdataManager instance; instance.run(); } TessdataManager::TessdataManager() { ui.setupUi(); ui.dialogTessdatamanager->set_transient_for(*MAIN->getWindow()); m_languageListStore = Gtk::ListStore::create(m_viewCols); ui.treeview->set_model(m_languageListStore); ui.treeview->append_column_editable("selected", m_viewCols.selected); ui.treeview->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"), _("A session connection to the PackageKit backend is required for managing system-wide tesseract language packs, but it was not found. This service is usually provided by a software-management application such as Gnome Software. Please install software which provides the necessary PackageKit interface, use other system package management software to manage the tesseract language packs directly, or switch to using 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 = ui.dialogTessdatamanager->run(); if(response == Gtk::RESPONSE_APPLY) { applyChanges(); } else if(response == 1) { refresh(); } else { break; } } ui.dialogTessdatamanager->hide(); } bool TessdataManager::fetchLanguageList(Glib::ustring& messages) { m_languageListStore->clear(); #if TESSERACT_VERSION >= TESSERACT_MAKE_VERSION(4, 0, 0) std::string url("https://api.github.com/repos/tesseract-ocr/tessdata_fast/tags"); #else std::string url("https://api.github.com/repos/tesseract-ocr/tessdata/tags"); #endif Glib::RefPtr data = Utils::download(url, messages); if(!data) { messages = Glib::ustring::compose(_("Failed to fetch list of available languages: %1"), messages); return false; } 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; } Glib::ustring tessdataVer; int bestMatchDist = std::numeric_limits::max(); static const Glib::RefPtr verRegEx = Glib::Regex::create("^[vV]?(\\d+).(\\d+).(\\d+)-?(\\w?.*)$"); 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"); Glib::MatchInfo matchInfo; if(verRegEx->match(tag, matchInfo)) { int tagVer = TESSERACT_MAKE_VERSION(std::atoi(matchInfo.fetch(1).c_str()), std::atoi(matchInfo.fetch(2).c_str()), std::atoi(matchInfo.fetch(3).c_str())); int dist = TESSERACT_VERSION - tagVer; if(dist >= 0 && dist < bestMatchDist) { bestMatchDist = dist; tessdataVer = tag; } } } g_list_free(elementArray); g_object_unref(parser); std::vector> extraFiles; std::vector dataUrls; #if TESSERACT_VERSION >= TESSERACT_MAKE_VERSION(4, 0, 0) dataUrls.push_back(std::string("https://api.github.com/repos/tesseract-ocr/tessdata_fast/contents?ref=" + tessdataVer)); dataUrls.push_back(std::string("https://api.github.com/repos/tesseract-ocr/tessdata_fast/contents/script?ref=" + tessdataVer)); #else dataUrls.push_back(std::string("https://api.github.com/repos/tesseract-ocr/tessdata/contents?ref=" + tessdataVer)); #endif for(const std::string& url : dataUrls) { data = Utils::download(url, messages); if(!data) { continue; } parser = json_parser_new(); parserError = nullptr; json_parser_load_from_data(parser, reinterpret_cast(data->get_data()), data->size(), &parserError); if(parserError) { g_object_unref(parser); continue; } 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 fileName = json_object_get_string_member(treeObj, "name"); if(!json_object_get_string_member(treeObj, "download_url")) { continue; } Glib::ustring url = json_object_get_string_member(treeObj, "download_url"); Glib::ustring subdir; // If filename starts with upper case letter, it is a script if(fileName.substr(0, 1).uppercase() == fileName.substr(0, 1)) { subdir = "script/"; } if(fileName.length() > 12 && fileName.compare(fileName.length() - 12, fileName.npos, "traineddata")) { Glib::ustring prefix = subdir + fileName.substr(0, fileName.find(".")); auto it = m_languageFiles.find(prefix); if(it == m_languageFiles.end()) { it = m_languageFiles.insert(std::make_pair(prefix, std::vector())).first; } it->second.push_back({subdir + fileName, url}); } else { // Delay decision to determine whether file is a supplementary language file extraFiles.push_back(std::make_pair(subdir + fileName, 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}); } } } if(m_languageFiles.empty()) { messages = Glib::ustring::compose(_("Failed to fetch list of available languages: %1"), messages); return false; } 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(), [](const Glib::ustring & s1, const Glib::ustring & s2) { bool s1Script = s1.substr(0, 6) == "script" || s1.substr(0, 1) == s1.substr(0, 1).uppercase(); bool s2Script = s2.substr(0, 6) == "script" || s2.substr(0, 1) == s2.substr(0, 1).uppercase(); if(s1Script != s2Script) { return !s1Script; } else { return s1 < s2; } }); for(const Glib::ustring& prefix : languages) { Config::Lang lang; lang.prefix = prefix; Glib::ustring label; if(MAIN->getConfig()->searchLangSpec(lang)) { label = lang.name; } else { label = lang.prefix; } Gtk::TreeIter it = m_languageListStore->append(); bool installed = std::find(availableLanguages.begin(), availableLanguages.end(), lang.prefix) != availableLanguages.end(); (*it)[m_viewCols.selected] = installed; (*it)[m_viewCols.label] = label; (*it)[m_viewCols.prefix] = lang.prefix; } return true; } void TessdataManager::applyChanges() { MAIN->pushState(MainWindow::State::Busy, _("Applying changes...")); ui.dialogTessdatamanager->set_sensitive(false); ui.dialogTessdatamanager->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(ui.dialogTessdatamanager->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; std::string scriptPath = Glib::build_filename(tessDataPath, "script"); Glib::RefPtr tessDataDir = Gio::File::create_for_path(scriptPath); 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) { auto it = m_languageFiles.find(prefix); if(it != m_languageFiles.end()) { for(const LangFile& langFile : it->second) { Glib::RefPtr file = Gio::File::create_for_path(Glib::build_filename(tessDataPath, langFile.name)); if(file->query_exists() && !file->remove()) { errors.append(langFile.name); } } } } } 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.\n\nHint: If you don't have write permissions in system folders, you can switch to user paths in the settings dialog."), errors); } } } ui.dialogTessdatamanager->get_window()->set_cursor(Glib::RefPtr()); ui.dialogTessdatamanager->set_sensitive(true); MAIN->popState(); refresh(); if(!errorMsg.empty()) { Utils::message_dialog(Gtk::MESSAGE_ERROR, _("Error"), errorMsg, ui.dialogTessdatamanager); } } 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.3.1/gtk/src/TessdataManager.hh000066400000000000000000000031711351740627400210050ustar00rootroot00000000000000/* -*- Mode: C++; indent-tabs-mode: t; c-basic-offset: 4; tab-width: 4 -*- */ /* * TessdataManager.hh * Copyright (C) 2013-2019 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 "ui_TessdataManager.hh" 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; Ui::TessdataManager ui; 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.3.1/gtk/src/Utils.cc000066400000000000000000000351721351740627400170360ustar00rootroot00000000000000/* -*- Mode: C++; indent-tabs-mode: t; c-basic-offset: 4; tab-width: 4 -*- */ /* * Utils.cc * Copyright (C) 2013-2019 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 #define USE_STD_NAMESPACE #include #undef USE_STD_NAMESPACE 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(".error { background-color: #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(), 10000); entry->get_style_context()->add_class("error"); } void Utils::clear_error_state(Gtk::Entry* entry) { entry->get_style_context()->remove_class("error"); 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; } std::pair Utils::split_filename(const std::string& filename) { std::string::size_type pos = filename.rfind('.'); if(pos == std::string::npos) { return std::make_pair(filename, std::string()); } std::pair parts = std::make_pair(filename.substr(0, pos), filename.substr(pos + 1)); if(parts.first.size() > 3 && parts.first.substr(pos - 4) == ".tar") { parts.first = parts.first.substr(0, pos - 4); parts.second = "tar." + parts.second; } return parts; } std::string Utils::make_absolute_path(const std::string& path, const std::string& basepath) { if(Glib::path_is_absolute(path)) { return path; } std::string abspath = Glib::build_filename(basepath, path); char* realabspath = realpath(abspath.c_str(), nullptr); abspath = std::string(realabspath); free(realabspath); return abspath; } std::string Utils::make_relative_path(const std::string& path, const std::string& basepath) { if(!Glib::path_is_absolute(path)) { return path; } int pos = path.find(basepath); if(pos != 0) { return path; } return Glib::build_filename(".", path.substr(basepath.size())); } 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::pair parts = split_filename(newfilename); parts.first = Glib::Regex::create("_[0-9]+$")->replace(parts.first, 0, "", static_cast(0)); newfilename = Glib::ustring::compose("%1.%2", parts.first, parts.second); while(Glib::file_test(newfilename, Glib::FILE_TEST_EXISTS)) { newfilename = Glib::ustring::compose("%1_%2.%3", parts.first, ++i, parts.second); } 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, const Glib::ustring& what) { Glib::ustring ret = str; ret.erase(0, ret.find_first_not_of(what)); std::size_t rpos = ret.find_last_not_of(what); if(rpos != Glib::ustring::npos) { ret.erase(rpos + 1); } return ret; } bool Utils::strings_equal(const Glib::ustring& str1, const Glib::ustring& str2, bool matchCase) { return matchCase ? (str1 == str2) : (str1.casefold() == str2.casefold()); } std::size_t Utils::string_firstIndex(const Glib::ustring& str, const Glib::ustring& search, int pos, bool matchCase) { std::size_t res = Glib::ustring::npos; if(matchCase) { res = str.find(search, pos); } else { res = str.lowercase().find(search.lowercase(), pos); } return res == Glib::ustring::npos ? -1 : res; } std::size_t Utils::string_lastIndex(const Glib::ustring& str, const Glib::ustring& search, int pos, bool matchCase) { std::size_t res = Glib::ustring::npos; if(matchCase) { res = str.rfind(search, pos); } else { res = str.lowercase().rfind(search.lowercase(), pos); } return res == Glib::ustring::npos ? -1 : res; } int Utils::string_replace(Glib::ustring& str, const Glib::ustring& search, const Glib::ustring& replace, bool matchCase) { int pos = 0; int count = 0; while(true) { pos = Utils::string_firstIndex(str, search, pos, matchCase); if(pos == -1) { break; } str = str.replace(pos, search.size(), replace); pos += replace.size(); ++count; } return count; } Glib::ustring Utils::string_html_escape(const Glib::ustring& str) { std::string result; result.reserve(str.bytes()); for(size_t pos = 0; pos != str.bytes(); ++pos) { switch(str[pos]) { case '&': result.append("&"); break; case '"': result.append("""); break; case '\'': result.append("'"); break; case '<': result.append("<"); break; case '>': result.append(">"); break; default: result.append(str.data() + pos, 1); break; } } return result; } std::vector> Utils::string_split_pos(const Glib::ustring& str, const Glib::RefPtr& splitRe) { int strpos = 0; Glib::MatchInfo info; std::vector> result; while(splitRe->match(str, strpos, info)) { int start = 0, end = 0; info.fetch_pos(0, start, end); result.push_back(std::make_pair(str.substr(strpos, start - strpos), strpos)); strpos = end; } if(strpos < str.length()) { result.push_back(std::make_pair(str.substr(strpos), strpos)); } return result; } int Utils::parseInt(const Glib::ustring& str, bool* ok) { static Glib::RefPtr nrRegEx = Glib::Regex::create("^\\d+$"); bool match = nrRegEx->match(str); if(ok) { *ok = match; } return match ? std::atoi(str.c_str()) : 0; } 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) { // If it is already a valid code, return it static Glib::RefPtr langPattern = Glib::Regex::create("^[a-z]{2,}(_[A-Z]{2,})?$"); if(langPattern->match(lang)) { return lang; } // Treat the language as a tesseract lang spec and try to find a matching code Config::Lang langspec = {lang}; if(!lang.empty() && MAIN->getConfig()->searchLangSpec(langspec)) { return langspec.code; } // 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_on_window(MAIN->getWindow()->gobj(), 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.3.1/gtk/src/Utils.hh000066400000000000000000000116221351740627400170420ustar00rootroot00000000000000/* -*- Mode: C++; indent-tabs-mode: t; c-basic-offset: 4; tab-width: 4 -*- */ /* * Utils.hh * Copyright (C) 2013-2019 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 #ifdef MAKE_VERSION #define TESSERACT_MAKE_VERSION(maj,min,patch) MAKE_VERSION((maj),(min),(patch)) #else #define TESSERACT_MAKE_VERSION(maj,min,patch) ((maj) << 16 | (min) << 8 | (patch)) #endif 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); std::pair split_filename(const std::string& filename); std::string make_absolute_path(const std::string& path, const std::string& basepath); std::string make_relative_path(const std::string& path, const std::string& basepath); 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, const Glib::ustring& what = " \t\n\r"); bool strings_equal(const Glib::ustring& str1, const Glib::ustring& str2, bool matchCase); std::size_t string_firstIndex(const Glib::ustring& str, const Glib::ustring& search, int pos, bool matchCase); std::size_t string_lastIndex(const Glib::ustring& str, const Glib::ustring& search, int pos, bool matchCase); int string_replace(Glib::ustring& str, const Glib::ustring& search, const Glib::ustring& replace, bool matchCase); Glib::ustring string_html_escape(const Glib::ustring& str); std::vector> string_split_pos(const Glib::ustring& str, const Glib::RefPtr& splitRe); int parseInt(const Glib::ustring& str, bool* ok = nullptr); 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::Threads::Mutex mutex_; Glib::Threads::Cond cond_; public: bool empty() { Glib::Threads::Mutex::Lock queue_guard(mutex_); return queue_.empty(); } void enqueue(const T& item) { Glib::Threads::Mutex::Lock queue_guard(mutex_); queue_.push(item); cond_.signal(); } T dequeue() { Glib::Threads::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.3.1/gtk/src/common.hh000066400000000000000000000036621351740627400172370ustar00rootroot00000000000000/* -*- Mode: C++; indent-tabs-mode: t; c-basic-offset: 4; tab-width: 4 -*- */ /* * common.hh * Copyright (C) 2013-2019 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 struct ClassDataItem { virtual ~ClassDataItem() = default; }; class ClassData { public: ~ClassData() { std::for_each(m_connections.begin(), m_connections.end(), [](sigc::connection conn) { conn.disconnect(); }); for(ClassDataItem* item : m_items) { delete item; } } template sigc::connection addConn(const T& conn) { m_connections.push_back(conn); return m_connections.back(); } void addItem(ClassDataItem* item) { m_items.push_back(item); } private: std::vector m_connections; std::vector m_items; }; #define CONNECT(src, signal, ...) m_classdata.addConn((src)->signal_##signal().connect(__VA_ARGS__)) #define CONNECTP(src, property, ...) m_classdata.addConn((src)->property_##property().signal_changed().connect(__VA_ARGS__)) #define CONNECTX(src, signal, ...) (src)->signal_##signal().connect(__VA_ARGS__) #define APPLICATION_ID "org.gnome.gimagereader" #ifndef M_PI #define M_PI 3.14159265358979323846 #endif extern std::string pkgExePath; extern std::string pkgDir; #endif gImageReader-3.3.1/gtk/src/hocr/000077500000000000000000000000001351740627400163525ustar00rootroot00000000000000gImageReader-3.3.1/gtk/src/hocr/DisplayerToolHOCR.cc000066400000000000000000000120641351740627400221320ustar00rootroot00000000000000/* -*- Mode: C++; indent-tabs-mode: t; c-basic-offset: 4; tab-width: 4 -*- */ /* * DisplayerToolHOCR.cc * Copyright (C) 2013-2019 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) { displayer->setDefaultCursor(Gdk::Cursor::create(Gdk::ARROW)); 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) { m_pressed = true; if(event->button == 1 && m_currentAction >= ACTION_DRAW_GRAPHIC_RECT && m_currentAction <= ACTION_DRAW_WORD_RECT) { clearSelection(); m_selection = new DisplayerSelection(this, m_displayer->mapToSceneClamped(Geometry::Point(event->x, event->y))); CONNECT(m_selection, geometry_changed, sigc::mem_fun(this, &DisplayerToolHOCR::selectionChanged)); m_displayer->addItem(m_selection); return true; } return false; } bool DisplayerToolHOCR::mouseMoveEvent(GdkEventMotion* event) { if(m_selection && m_currentAction >= ACTION_DRAW_GRAPHIC_RECT && m_currentAction <= ACTION_DRAW_WORD_RECT) { 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) { // Don't do anything if the release event does not follow a press event... if(!m_pressed) { return false; } m_pressed = false; if(m_selection && m_currentAction >= ACTION_DRAW_GRAPHIC_RECT && m_currentAction <= ACTION_DRAW_WORD_RECT) { 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_signal_bbox_drawn.emit(Geometry::Rectangle(int(r.x), int(r.y), int(r.width), int(r.height)), m_currentAction); } } else { Geometry::Point p = m_displayer->mapToSceneClamped(Geometry::Point(event->x, event->y)); m_signal_position_picked.emit(p); } setAction(ACTION_NONE, false); return true; } void DisplayerToolHOCR::setAction(Action action, bool clearSel) { if(action != m_currentAction) { m_signal_action_changed.emit(action); } if(clearSel) { clearSelection(); } m_currentAction = action; if(m_currentAction >= ACTION_DRAW_GRAPHIC_RECT && m_currentAction <= ACTION_DRAW_WORD_RECT) { m_displayer->setDefaultCursor(Gdk::Cursor::create(Gdk::TCROSS)); } else { m_displayer->setDefaultCursor(Gdk::Cursor::create(Gdk::ARROW)); } } void DisplayerToolHOCR::setSelection(const Geometry::Rectangle& rect, const Geometry::Rectangle& minRect) { setAction(ACTION_NONE, false); Geometry::Rectangle sceneRect = m_displayer->getSceneBoundingRect(); Geometry::Rectangle r = rect.translate(sceneRect.x, sceneRect.y); Geometry::Rectangle mr = minRect.translate(sceneRect.x, sceneRect.y); if(!m_selection) { m_selection = new DisplayerSelection(this, Geometry::Point(r.x, r.y)); CONNECT(m_selection, geometry_changed, sigc::mem_fun(this, &DisplayerToolHOCR::selectionChanged)); m_displayer->addItem(m_selection); } m_selection->setAnchorAndPoint(Geometry::Point(r.x, r.y), Geometry::Point(r.x + r.width, r.y + r.height)); m_selection->setMinimumRect(mr); m_displayer->ensureVisible(m_selection->rect()); } Cairo::RefPtr DisplayerToolHOCR::getSelection(const Geometry::Rectangle& rect) const { 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_signal_bbox_changed.emit(Geometry::Rectangle(int(r.x), int(r.y), int(r.width), int(r.height))); } gImageReader-3.3.1/gtk/src/hocr/DisplayerToolHOCR.hh000066400000000000000000000057351351740627400221530ustar00rootroot00000000000000/* -*- Mode: C++; indent-tabs-mode: t; c-basic-offset: 4; tab-width: 4 -*- */ /* * DisplayerToolHOCR.hh * Copyright (C) 2016-2019 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: enum Action {ACTION_NONE, ACTION_DRAW_GRAPHIC_RECT, ACTION_DRAW_CAREA_RECT, ACTION_DRAW_PAR_RECT, ACTION_DRAW_LINE_RECT, ACTION_DRAW_WORD_RECT}; DisplayerToolHOCR(Displayer* displayer); ~DisplayerToolHOCR(); std::vector> getOCRAreas() override; void pageChanged() override { m_signal_displayed_source_changed.emit(); reset(); } void resolutionChanged(double /*factor*/) override { reset(); } void rotationChanged(double /*delta*/) override { reset(); } void reset() override { setAction(ACTION_NONE, true); } bool mousePressEvent(GdkEventButton* event) override; bool mouseMoveEvent(GdkEventMotion* event) override; bool mouseReleaseEvent(GdkEventButton* event) override; void setAction(Action action, bool clearSel = true); void setSelection(const Geometry::Rectangle& rect, const Geometry::Rectangle& minRect); Cairo::RefPtr getSelection(const Geometry::Rectangle& rect) const; void clearSelection(); sigc::signal signal_displayed_source_changed() { return m_signal_displayed_source_changed; } sigc::signal signal_bbox_drawn() { return m_signal_bbox_drawn; } sigc::signal signal_bbox_changed() { return m_signal_bbox_changed; } sigc::signal signal_position_picked() { return m_signal_position_picked; } sigc::signal signal_action_changed() { return m_signal_action_changed; } private: ClassData m_classdata; DisplayerSelection* m_selection = nullptr; Action m_currentAction = ACTION_NONE; bool m_pressed = false; sigc::signal m_signal_displayed_source_changed; sigc::signal m_signal_bbox_drawn; sigc::signal m_signal_bbox_changed; sigc::signal m_signal_position_picked; sigc::signal m_signal_action_changed; void selectionChanged(const Geometry::Rectangle& rect); }; #endif // DISPLAYERTOOLHOCR_HH gImageReader-3.3.1/gtk/src/hocr/HOCRDocument.cc000066400000000000000000001127561351740627400211270ustar00rootroot00000000000000/* -*- Mode: C++; indent-tabs-mode: t; c-basic-offset: 4; tab-width: 4 -*- */ /* * HOCRDocument.cc * Copyright (C) 2013-2019 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 "HOCRDocument.hh" #include "XmlUtils.hh" #include "Utils.hh" #include #include #include #define DEBUG(...) //__VA_ARGS__ HOCRDocument::HOCRDocument(GtkSpell::Checker* spell) : Glib::ObjectBase("HOCRDocument") , m_spell(spell) { } HOCRDocument::~HOCRDocument() { for(HOCRPage* page : m_pages) { delete page; } } void HOCRDocument::recheckSpelling() { for(HOCRPage* page : m_pages) { recursiveDataChanged(get_iter(get_root_path(page->index())), {"ocrx_word"}); } } Glib::ustring HOCRDocument::toHTML() { Glib::ustring html = "\n"; for(const HOCRPage* page : m_pages) { html += page->toHtml(1); } html += "\n"; return html; } Gtk::TreeIter HOCRDocument::addPage(const xmlpp::Element* pageElement, bool cleanGraphics) { m_pages.push_back(new HOCRPage(pageElement, ++m_pageIdCounter, m_defaultLanguage, cleanGraphics, m_pages.size())); Gtk::TreeIter iter = get_iter(get_root_path(m_pages.back()->index())); recursiveRowInserted(iter); for(int i = 0, n = m_pages.size(); i < n; ++i) { Gtk::TreePath path = get_root_path(i); row_changed(path, get_iter(path)); } return iter; } bool HOCRDocument::editItemAttribute(const Gtk::TreeIter& index, const Glib::ustring& name, const Glib::ustring& value, const Glib::ustring& attrItemClass) { HOCRItem* item = mutableItemAtIndex(index); if(!item) { return false; } item->setAttribute(name, value, attrItemClass); row_changed(get_path(index), index); if(name == "lang") { recursiveDataChanged(index, {"ocrx_word"}); } m_signal_item_attribute_changed.emit(index, name, value); if(name == "title:bbox") { recomputeBBoxes(item->parent()); } return true; } bool HOCRDocument::editItemText(const Gtk::TreeIter& index, const Glib::ustring& text) { HOCRItem* item = mutableItemAtIndex(index); if(!item) { return false; } item->setText(text); row_changed(get_path(index), index); return true; } Gtk::TreeIter HOCRDocument::moveItem(const Gtk::TreeIter& itemIndex, const Gtk::TreeIter& newParent, int newRow) { HOCRItem* item = mutableItemAtIndex(itemIndex); HOCRItem* parentItem = mutableItemAtIndex(newParent); if(!item || (!parentItem && item->itemClass() != "ocr_page")) { return Gtk::TreeIter(); } Gtk::TreeIter ancestor = newParent; while(ancestor) { if(ancestor == itemIndex) { return Gtk::TreeIter(); } ancestor = ancestor->parent(); } int oldRow = item->index(); Gtk::TreeIter oldParent = itemIndex->parent(); if(oldParent == newParent && oldRow < newRow) { --newRow; } Gtk::TreePath itemPath = get_path(itemIndex); takeItem(item); row_deleted(itemPath); recomputeBBoxes(mutableItemAtIndex(oldParent)); insertItem(parentItem, item, newRow); Gtk::TreeIter newIndex = newParent->children()[newRow]; recursiveRowInserted(newIndex); recomputeBBoxes(parentItem); return newIndex; } Gtk::TreeIter HOCRDocument::swapItems(const Gtk::TreeIter& parent, int firstRow, int secondRow) { moveItem(parent->children()[firstRow], parent, secondRow); moveItem(parent->children()[secondRow], parent, firstRow); return parent->children()[firstRow]; } Gtk::TreeIter HOCRDocument::mergeItems(const Gtk::TreeIter& parent, int startRow, int endRow) { if(endRow - startRow <= 0) { return Gtk::TreeIter(); } Gtk::TreeIter targetIndex = parent->children()[startRow]; HOCRItem* targetItem = mutableItemAtIndex(targetIndex); if(!targetItem || targetItem->itemClass() == "ocr_page") { return Gtk::TreeIter(); } Geometry::Rectangle bbox = targetItem->bbox(); if(targetItem->itemClass() == "ocrx_word") { // Merge word items: join text, merge bounding boxes Glib::ustring text = targetItem->text(); for(int row = ++startRow; row <= endRow; ++row) { Gtk::TreeIter childIndex = parent->children()[startRow]; HOCRItem* item = mutableItemAtIndex(childIndex); g_assert(item); text += item->text(); bbox = bbox.unite(item->bbox()); Gtk::TreePath childPath = get_path(childIndex); deleteItem(item); row_deleted(childPath); } targetItem->setText(text); row_changed(get_path(targetIndex), targetIndex); } else { // Merge other items: merge dom trees and bounding boxes std::vector moveChilds; for(int row = ++startRow; row <= endRow; ++row) { Gtk::TreeIter childIndex = parent->children()[startRow]; HOCRItem* item = mutableItemAtIndex(childIndex); g_assert(item); std::vector childItems = item->takeChildren(); moveChilds.insert(moveChilds.end(), childItems.begin(), childItems.end()); bbox = bbox.unite(item->bbox()); Gtk::TreePath childPath = get_path(childIndex); deleteItem(item); row_deleted(childPath); } for(HOCRItem* child : moveChilds) { targetItem->addChild(child); Gtk::TreeIter newIndex = targetIndex->children()[child->index()]; row_inserted(get_path(newIndex), newIndex); } } Glib::ustring bboxstr = Glib::ustring::compose("%1 %2 %3 %4", bbox.x, bbox.y, bbox.x + bbox.width, bbox.y + bbox.height); targetItem->setAttribute("title:bbox", bboxstr); m_signal_item_attribute_changed.emit(targetIndex, "title:bbox", bboxstr); return targetIndex; } Gtk::TreeIter HOCRDocument::splitItem(const Gtk::TreeIter& index, int startRow, int endRow) { if(endRow - startRow < 0) { return Gtk::TreeIter(); } HOCRItem* item = mutableItemAtIndex(index); if(!item) { return Gtk::TreeIter(); } Glib::ustring itemClass = item->itemClass(); xmlpp::Document doc; xmlpp::Element* newElement; if(itemClass == "ocr_carea") { newElement = doc.create_root_node("div"); } else if(itemClass == "ocr_par") { newElement = doc.create_root_node("p"); } else if(itemClass == "ocr_line") { newElement = doc.create_root_node("span"); } else { return Gtk::TreeIter(); } newElement->set_attribute("class", itemClass); newElement->set_attribute("title", HOCRItem::serializeAttrGroup(item->getTitleAttributes())); HOCRItem* newItem = new HOCRItem(newElement, item->page(), item->parent()); insertItem(item->parent(), newItem, item->index() + 1); Gtk::TreeIter newIndex = index->parent()->children()[item->index() + 1]; recursiveRowInserted(newIndex); for(int row = 0; row <= (endRow - startRow); ++row) { Gtk::TreeIter childIndex = index->children()[startRow]; HOCRItem* child = mutableItemAtIndex(childIndex); g_assert(child); moveItem(childIndex, newIndex, row); } return newIndex; } Gtk::TreeIter HOCRDocument::addItem(const Gtk::TreeIter& parent, const xmlpp::Element* element) { HOCRItem* parentItem = mutableItemAtIndex(parent); if(!parentItem) { return Gtk::TreeIter(); } HOCRItem* item = new HOCRItem(element, parentItem->page(), parentItem); parentItem->addChild(item); recomputeBBoxes(parentItem); Gtk::TreeIter child = parent->children()[item->index()]; recursiveRowInserted(child); return child; } bool HOCRDocument::removeItem(const Gtk::TreeIter& index) { HOCRItem* item = mutableItemAtIndex(index); if(!item) { return false; } Gtk::TreePath path = get_path(index); HOCRItem* parentItem = item->parent(); deleteItem(item); row_deleted(path); recomputeBBoxes(parentItem); return true; } Gtk::TreeIter HOCRDocument::nextIndex(const Gtk::TreeIter& current) const { Gtk::TreeIter iter = current; // If the current index is invalid return first index if(!iter) { return get_iter(get_root_path(0)); } // If item has children, return next child if(!iter->children().empty()) { return iter->children()[0]; } // Return next possible sibling Gtk::TreeIter next = iter; ++next; while(iter && !next) { iter = iter->parent(); next = iter; ++next; } if(!iter) { // Wrap around return get_iter(get_root_path(0)); } return next; } Gtk::TreeIter HOCRDocument::prevIndex(const Gtk::TreeIter& current) const { Gtk::TreeIter iter = current; // If the current index is invalid return last index if(!iter) { return get_iter(get_root_path(m_pages.size() - 1)); } // Return last possible leaf of previous sibling, if any, or parent Gtk::TreeIter parent = iter->parent(); if(!--iter) { if(parent) { return parent; } // Wrap around iter = get_iter(get_root_path(m_pages.size() - 1));; } while(!iter->children().empty()) { iter = iter->children()[iter->children().size() - 1]; } return iter; } bool HOCRDocument::indexIsMisspelledWord(const Gtk::TreeIter& index) const { return !checkItemSpelling(index); } bool HOCRDocument::checkItemSpelling(const Gtk::TreeIter& index, std::vector* suggestions, int limit) const { const HOCRItem* item = itemAtIndex(index); if(item->itemClass() != "ocrx_word") { return true; } Glib::ustring prefix, suffix, trimmed = HOCRItem::trimmedWord(item->text(), &prefix, &suffix); if(trimmed.empty()) { return true; } Glib::ustring lang = item->spellingLang(); bool haveLanguage = true; if(m_spell->get_language() != lang) { try { m_spell->set_language(lang); } catch(const GtkSpell::Error& /*e*/) { return true; } } // check word, including (if requested) setting suggestions; handle hyphenated phrases correctly if(checkSpelling(trimmed, suggestions, limit)) { return true; } // handle some hyphenated words // don't bother with words not broken over sibling text lines (ie interrupted by other blocks), it's human hard // don't bother with words broken over three or more lines, it's implausible and this treatment is ^ necessarily incomplete HOCRItem* parent = item->parent(); if(!parent) { return false; } HOCRItem* grandparent = parent->parent(); if(!grandparent) { return false; } int idx = item->index(); int parentIdx = parent->index(); std::vector parentSiblings = grandparent->children(); if(idx == 0 && parentIdx > 0) { HOCRItem* parentPrevSibling = parentSiblings.at(parentIdx - 1); if(!parentPrevSibling) { return false; } std::vector cousins = parentPrevSibling->children(); if(cousins.size() < 1) { return false; } HOCRItem* prevCousin = cousins.back(); if(!prevCousin || prevCousin->itemClass() != "ocrx_word") { return false; } Glib::ustring prevText = prevCousin->text(); if(prevText.empty() || prevText[prevText.length() - 1] != '-') { return false; } // don't bother with (reassembled) suggestions for broken words since we can't re-break them return checkSpelling(HOCRItem::trimmedWord(prevText) + trimmed); } Glib::ustring text = item->text(); if(idx + 1 == parent->children().size() && parentIdx + 1 < parentSiblings.size() && !text.empty() && text[text.length() - 1] == '-') { HOCRItem* parentNextSibling = parentSiblings.at(parentIdx + 1); if(!parentNextSibling) { return false; } std::vector cousins = parentNextSibling->children(); if(cousins.size() < 1) { return false; } HOCRItem* nextCousin = cousins.front(); if(!nextCousin || nextCousin->itemClass() != "ocrx_word") { return false; } return checkSpelling(trimmed + HOCRItem::trimmedWord(nextCousin->text())); } return false; } bool HOCRDocument::referencesSource(const Glib::ustring& filename) const { for(const HOCRPage* page : m_pages) { if(page->sourceFile() == filename) { return true; } } return false; } Gtk::TreeIter HOCRDocument::searchPage(const Glib::ustring& filename, int pageNr) const { for(const HOCRPage* page : m_pages) { if(page->sourceFile() == filename && page->pageNr() == pageNr) { return get_iter(get_root_path(page->index())); } } return Gtk::TreeIter(); } Gtk::TreeIter HOCRDocument::searchAtCanvasPos(const Gtk::TreeIter& pageIndex, const Geometry::Point& pos) const { Gtk::TreeIter index = pageIndex; bool found = bool(index); while(found) { found = false; for(const Gtk::TreeIter& childIndex : index->children()) { if(itemAtIndex(childIndex)->bbox().contains(pos)) { index = childIndex; found = true; break; } } } return index; } void HOCRDocument::convertSourcePaths(const std::string& basepath, bool absolute) { for(HOCRPage* page : m_pages) { page->convertSourcePath(basepath, absolute); } } void HOCRDocument::recursiveDataChanged(const Gtk::TreeIter& index, const std::vector& itemClasses) { if(index && !index->children().empty()) { bool emitChanged = (itemClasses.empty() || std::find(itemClasses.begin(), itemClasses.end(), itemAtIndex(index)->itemClass()) != itemClasses.end()); for(const Gtk::TreeIter& childIndex : index->children()) { if(emitChanged) { row_changed(get_path(childIndex), childIndex); } recursiveDataChanged(childIndex); } } } void HOCRDocument::recursiveRowInserted(const Gtk::TreeIter& index) { DEBUG(std::cout << "Inserted: " << get_path(index).to_string() << std::endl;) row_inserted(get_path(index), index); for(const Gtk::TreeIter& childIndex : index->children()) { recursiveRowInserted(childIndex); } } void HOCRDocument::recomputeBBoxes(HOCRItem* item) { // Update parent bboxes (except page) while(item && item->parent()) { Geometry::Rectangle bbox; for(const HOCRItem* child : item->children()) { bbox = bbox.unite(child->bbox()); } Glib::ustring bboxstr = Glib::ustring::compose("%1 %2 %3 %4", bbox.x, bbox.y, bbox.x + bbox.width, bbox.y + bbox.height); item->setAttribute("title:bbox", bboxstr); item = item->parent(); } } Gtk::TreeModelFlags HOCRDocument::get_flags_vfunc() const { return Gtk::TREE_MODEL_ITERS_PERSIST; } GType HOCRDocument::get_column_type_vfunc(int index) const { if(index == COLUMN_EDITABLE) { return Glib::Value::value_type(); } else if(index == COLUMN_CHECKED) { return Glib::Value::value_type(); } else if(index == COLUMN_ICON) { return Glib::Value>::value_type(); } else if(index == COLUMN_TEXT) { return Glib::Value::value_type(); } else if(index == COLUMN_TEXT_COLOR) { return Glib::Value::value_type(); } else if(index == COLUMN_WCONF) { return Glib::Value::value_type(); } return G_TYPE_INVALID; } int HOCRDocument::get_n_columns_vfunc() const { return NUM_COLUMNS; } bool HOCRDocument::iter_next_vfunc(const iterator& iter, iterator& iter_next) const { DEBUG(std::cout << "iter_next_vfunc " << get_path(iter).to_string() << ": ";) const HOCRItem* item = itemAtIndex(iter); HOCRItem* nextItem = nullptr; if(item) { if(item->parent()) { nextItem = item->index() < item->parent()->children().size() - 1 ? item->parent()->children()[item->index() + 1] : nullptr; } else { nextItem = item->index() < m_pages.size() - 1 ? m_pages[item->index() + 1] : nullptr; } } iter_next.gobj()->user_data = nextItem; iter_next.set_stamp(iter_next.gobj()->user_data != nullptr); DEBUG(std::cout << (iter_next.gobj()->user_data != nullptr) << std::endl;) return iter_next.gobj()->user_data != nullptr; } bool HOCRDocument::get_iter_vfunc(const Path& path, iterator& iter) const { DEBUG(std::cout << "get_iter_vfunc " << path.to_string() << ": ";) if(path.empty() || m_pages.empty()) { DEBUG(std::cout << "0" << std::endl;) return false; } int idx = 0, size = path.size(); HOCRItem* item = m_pages[path[idx++]]; while(item && idx < size) { item = path[idx] >= item->children().size() ? nullptr : item->children()[path[idx++]]; } iter.gobj()->user_data = item; iter.set_stamp(iter.gobj()->user_data != nullptr); DEBUG(std::cout << (item != nullptr) << std::endl;) return item != nullptr; } bool HOCRDocument::iter_children_vfunc(const iterator& parent, iterator& iter) const { DEBUG(std::cout << "iter_children_vfunc " << get_path(parent).to_string() << ": ";) HOCRItem* parentItem = mutableItemAtIndex(parent); iter.gobj()->user_data = parentItem && !parentItem->children().empty() ? parentItem->children().front() : nullptr; iter.set_stamp(iter.gobj()->user_data != nullptr); DEBUG(std::cout << (iter.gobj()->user_data != nullptr) << std::endl;) return iter.gobj()->user_data != nullptr; } bool HOCRDocument::iter_parent_vfunc(const iterator& child, iterator& iter) const { DEBUG(std::cout << "iter_parent_vfunc " << get_path(child).to_string() << ": ";) HOCRItem* childItem = mutableItemAtIndex(child); iter.gobj()->user_data = childItem ? childItem->parent() : nullptr; iter.set_stamp(iter.gobj()->user_data != nullptr); DEBUG(std::cout << (iter.gobj()->user_data != nullptr) << std::endl;) return iter.gobj()->user_data != nullptr; } bool HOCRDocument::iter_nth_child_vfunc(const iterator& parent, int n, iterator& iter) const { DEBUG(std::cout << "iter_nth_child_vfunc " << get_path(parent).to_string() << "@" << n << ": ";) HOCRItem* parentItem = mutableItemAtIndex(parent); iter.gobj()->user_data = parentItem && n < parentItem->children().size() ? parentItem->children()[n] : nullptr; iter.set_stamp(iter.gobj()->user_data != nullptr); DEBUG(std::cout << (iter.gobj()->user_data != nullptr) << std::endl;) return iter.gobj()->user_data != nullptr; } bool HOCRDocument::iter_nth_root_child_vfunc(int n, iterator& iter) const { DEBUG(std::cout << "iter_nth_root_child_vfunc " << n << ": ";) iter.gobj()->user_data = n < m_pages.size() ? m_pages[n] : nullptr; iter.set_stamp(iter.gobj()->user_data != nullptr); DEBUG(std::cout << (iter.gobj()->user_data != nullptr) << std::endl;) return iter.gobj()->user_data != nullptr; } bool HOCRDocument::iter_has_child_vfunc(const iterator& iter) const { DEBUG(std::cout << "iter_parent_vfunc " << get_path(iter).to_string() << ": ";) HOCRItem* item = mutableItemAtIndex(iter); DEBUG(std::cout << (item && !item->children().empty()) << std::endl;) return item && !item->children().empty(); } int HOCRDocument::iter_n_children_vfunc(const iterator& iter) const { DEBUG(std::cout << "iter_n_children_vfunc " << get_path(iter).to_string() << ": ";) HOCRItem* item = mutableItemAtIndex(iter); DEBUG(std::cout << (item ? item->children().size() : 0) << std::endl;) return item ? item->children().size() : 0; } int HOCRDocument::iter_n_root_children_vfunc() const { DEBUG(std::cout << "iter_n_root_children_vfunc " << m_pages.size() << std::endl;) return m_pages.size(); } Gtk::TreeModel::Path HOCRDocument::get_path_vfunc(const iterator& iter) const { Gtk::TreeModel::Path path; HOCRItem* item = mutableItemAtIndex(iter); while(item) { path.push_front(item->index()); item = item->parent(); } return path; } template static void setValue(Glib::ValueBase& gvalue, const T& value) { Glib::Value val; val.init(val.value_type()); val.set(value); gvalue.init(val.gobj()); } void HOCRDocument::get_value_vfunc(const iterator& iter, int column, Glib::ValueBase& value) const { DEBUG(std::cout << "get_value_vfunc Column " << column << " at path " << get_path(iter).to_string() << std::endl); const HOCRItem* item = itemAtIndex(iter); if(!item) { return; } else if(column == COLUMN_CHECKED) { setValue(value, item->isEnabled()); } else if(column == COLUMN_EDITABLE) { setValue(value, item->itemClass() == "ocrx_word"); } else if(column == COLUMN_ICON) { setValue(value, decorationRoleForItem(item)); } else if(column == COLUMN_TEXT) { setValue(value, displayRoleForItem(item)); } else if(column == COLUMN_TEXT_COLOR) { bool enabled = item->isEnabled(); const HOCRItem* parent = item->parent(); while(enabled && parent) { enabled = parent->isEnabled(); parent = parent->parent(); } Glib::ustring color; if(enabled) { color = checkItemSpelling(iter) ? "#000" : "#F00"; } else { color = checkItemSpelling(iter) ? "#a0a0a4" : "#d05052"; } setValue(value, color); } else if(column == COLUMN_WCONF) { setValue(value, item->getTitleAttribute("x_wconf")); } } void HOCRDocument::set_value_impl(const iterator& row, int column, const Glib::ValueBase& value) { HOCRItem* item = mutableItemAtIndex(row); if(!item) { return; } else if(column == COLUMN_TEXT) { item->setText(static_cast&>(value).get()); row_changed(get_path(row), row); } else if(column == COLUMN_CHECKED) { item->setEnabled(static_cast&>(value).get()); Gtk::TreePath path = get_path(row); row_changed(path, row); recursiveDataChanged(row); } } void HOCRDocument::get_value_impl(const iterator& row, int column, Glib::ValueBase& value) const { get_value_vfunc(row, column, value); } Glib::ustring HOCRDocument::displayRoleForItem(const HOCRItem* item) const { Glib::ustring itemClass = item->itemClass(); if(itemClass == "ocr_page") { const HOCRPage* page = static_cast(item); return Glib::ustring::compose("%1 (%2 %3/%4)", page->title(), _("Page"), page->index() + 1, m_pages.size()); } else if(itemClass == "ocr_carea") { return _("Text block"); } else if(itemClass == "ocr_par") { return _("Paragraph"); } else if(itemClass == "ocr_line") { return _("Textline"); } else if(itemClass == "ocrx_word") { return item->text(); } else if(itemClass == "ocr_graphic") { return _("Graphic"); } return ""; } Glib::RefPtr HOCRDocument::decorationRoleForItem(const HOCRItem* item) const { Glib::ustring itemClass = item->itemClass(); if(itemClass == "ocr_page") { return Gdk::Pixbuf::create_from_resource("/org/gnome/gimagereader/item_page.png"); } else if(itemClass == "ocr_carea") { return Gdk::Pixbuf::create_from_resource("/org/gnome/gimagereader/item_block.png"); } else if(itemClass == "ocr_par") { return Gdk::Pixbuf::create_from_resource("/org/gnome/gimagereader/item_par.png"); } else if(itemClass == "ocr_line") { return Gdk::Pixbuf::create_from_resource("/org/gnome/gimagereader/item_line.png"); } else if(itemClass == "ocrx_word") { return Gdk::Pixbuf::create_from_resource("/org/gnome/gimagereader/item_word.png"); } else if(itemClass == "ocr_graphic") { return Gdk::Pixbuf::create_from_resource("/org/gnome/gimagereader/item_halftone.png"); } return Gdk::Pixbuf::create(Gdk::COLORSPACE_RGB, false, 8, 0, 0); } bool HOCRDocument::checkSpelling(const Glib::ustring& trimmed, std::vector* suggestions, int limit) const { static const Glib::RefPtr splitRe = Glib::Regex::create("[\u2013\u2014]+"); std::vector> words = Utils::string_split_pos(trimmed, splitRe); std::size_t perWordLimit = 0; // s = p^w => w = log_p(c) = log(c)/log(p) => p = 10^(log(c)/w) if(limit > 0) { perWordLimit = std::size_t(std::pow(10, std::log10(limit) / words.size())); } std::vector> wordSuggestions; bool valid = true; bool multipleWords = words.size() > 1; for(const std::pair& word : words) { bool wordValid = m_spell->check_word(word.first); valid &= wordValid; if(suggestions) { std::vector ws = m_spell->get_suggestions(word.first); if(wordValid && multipleWords) { ws.insert(ws.begin(), word.first); } if(limit == -1) { wordSuggestions.push_back(ws); } else if(limit > 0) { ws.resize(std::min(ws.size(), perWordLimit)); wordSuggestions.push_back(ws); } } } if(suggestions) { suggestions->clear(); std::vector> suggestionCombinations; generateCombinations(wordSuggestions, suggestionCombinations, 0, std::vector()); for(const std::vector& combination : suggestionCombinations) { Glib::ustring s = ""; auto originalWord = words.begin(); int last = 0; int next; for(const Glib::ustring& suggestedWord : combination) { next = originalWord->second; s.append(trimmed.substr(last, next - last)); s.append(suggestedWord); last = next + originalWord->first.length(); originalWord++; } s.append(trimmed.substr(last)); suggestions->push_back(s); } } return valid; } // each suggestion for each word => each word in each suggestion void HOCRDocument::generateCombinations(const std::vector>& lists, std::vector>& results, int depth, const std::vector& c) const { if(depth == lists.size()) { results.push_back(c); return; } for(int i = 0; i < lists[depth].size(); ++i) { std::vector newc = c; newc.insert(newc.end(), lists[depth][i]); generateCombinations(lists, results, depth + 1, newc); } } void HOCRDocument::insertItem(HOCRItem* parent, HOCRItem* item, int i) { if(parent) { parent->insertChild(item, i); } else if(HOCRPage* page = dynamic_cast(item)) { page->m_index = i; m_pages.insert(m_pages.begin() + i++, page); for(int n = m_pages.size(); i < n; ++i) { m_pages[i]->m_index = i; Gtk::TreePath path = get_root_path(i); row_changed(path, get_iter(path)); } } } void HOCRDocument::deleteItem(HOCRItem* item) { takeItem(item); delete item; } void HOCRDocument::takeItem(HOCRItem* item) { if(item->parent()) { item->parent()->takeChild(item); } else if(HOCRPage* page = dynamic_cast(item)) { int idx = page->index(); m_pages.erase(m_pages.begin() + idx); for(int i = idx, n = m_pages.size(); i < n; ++i) { m_pages[i]->m_index = i; } for(int i = 0, n = m_pages.size(); i < n; ++i) { Gtk::TreePath path = get_root_path(i); row_changed(path, get_iter(path)); } } } /////////////////////////////////////////////////////////////////////////////// std::map HOCRItem::s_langCache = std::map(); std::map HOCRItem::deserializeAttrGroup(const Glib::ustring& string) { std::map attrs; for(const Glib::ustring& attr : Utils::string_split(string, ';', false)) { Glib::ustring trimmed = Utils::string_trim(attr); int splitPos = trimmed.find_first_of(' '); attrs.insert(std::make_pair(trimmed.substr(0, splitPos), splitPos > 0 ? Utils::string_trim(trimmed.substr(splitPos + 1)) : "")); } return attrs; } Glib::ustring HOCRItem::serializeAttrGroup(const std::map& attrs) { std::vector list; for(auto it = attrs.begin(), itEnd = attrs.end(); it != itEnd; ++it) { list.push_back(Glib::ustring::compose("%1 %2", it->first, it->second)); } return Utils::string_join(list, "; "); } Glib::ustring HOCRItem::trimmedWord(const Glib::ustring& word, Glib::ustring* prefix, Glib::ustring* suffix) { // correctly trim words with apostrophes or hyphens within them, initialisms/acronyms, and numeric citations static const Glib::RefPtr wordRe = Glib::Regex::create("^(\\W*)(\\w?|\\w(\\w|[-\u2013\u2014'’])*\\w|(\\w+\\.){2,})([\\W\u00b2\u00b3\u00b9\u2070-\u207e]*)$"); Glib::MatchInfo matchInfo; if(wordRe->match(word, matchInfo)) { if(prefix) { *prefix = matchInfo.fetch(1); } if(suffix) { *suffix = matchInfo.fetch(5); } return matchInfo.fetch(2); } return word; } HOCRItem::HOCRItem(const xmlpp::Element* element, HOCRPage* page, HOCRItem* parent, int index) : m_pageItem(page), m_parentItem(parent), m_index(index) { // Read attrs for(const xmlpp::Attribute* attr : element->get_attributes()) { Glib::ustring attrName = attr->get_name(); if(attrName == "title") { m_titleAttrs = deserializeAttrGroup(element->get_attribute_value("title")); } else { m_attrs[attrName] = attr->get_value(); } } // Adjust item id based on pageId if(parent) { Glib::ustring idClass = itemClass().substr(itemClass().find_first_of('_') + 1); int counter = page->m_idCounters[idClass] + 1; page->m_idCounters[idClass] = counter; Glib::ustring newId = Glib::ustring::compose("%1_%2_%3", idClass, page->pageId(), counter); m_attrs["id"] = newId; } // Parse item bbox std::vector bbox = Utils::string_split(m_titleAttrs["bbox"], ' ', false); if(bbox.size() == 4) { m_bbox.setCoords(std::atof(bbox[0].c_str()), std::atof(bbox[1].c_str()), std::atof(bbox[2].c_str()), std::atof(bbox[3].c_str())); } if(itemClass() == "ocrx_word") { m_text = XmlUtils::elementText(element); m_bold = !XmlUtils::elementsByTagName(element, "strong").empty(); m_italic = !XmlUtils::elementsByTagName(element, "em").empty(); } else if(itemClass() == "ocr_line") { // Depending on the locale, tesseract can use a comma instead of a dot as decimal separator in the baseline... Utils::string_replace(m_titleAttrs["baseline"], ",", ".", true); } } HOCRItem::~HOCRItem() { std::for_each( m_childItems.begin(), m_childItems.end(), [](HOCRItem * item) { delete item; }); } void HOCRItem::addChild(HOCRItem* child) { m_childItems.push_back(child); child->m_parentItem = this; child->m_pageItem = m_pageItem; child->m_index = m_childItems.size() - 1; } void HOCRItem::insertChild(HOCRItem* child, int i) { m_childItems.insert(m_childItems.begin() + i, child); child->m_parentItem = this; child->m_pageItem = m_pageItem; child->m_index = i++; for(int n = m_childItems.size(); i < n; ++i) { m_childItems[i]->m_index = i; } } void HOCRItem::removeChild(HOCRItem* child) { takeChild(child); delete child; } void HOCRItem::takeChild(HOCRItem* child) { int idx = child->index(); m_childItems.erase(m_childItems.begin() + idx); for(int i = idx, n = m_childItems.size(); i < n ; ++i) { m_childItems[i]->m_index = i; } } std::vector HOCRItem::takeChildren() { std::vector children; m_childItems.swap(children); return children; } std::map HOCRItem::getAllAttributes() const { std::map attrValues; for(auto it = m_attrs.begin(), itEnd = m_attrs.end(); it != itEnd; ++it) { attrValues.insert(*it); } for(auto it = m_titleAttrs.begin(), itEnd = m_titleAttrs.end(); it != itEnd; ++it) { attrValues.insert(std::make_pair(Glib::ustring::compose("title:%1", it->first), it->second)); } if(itemClass() == "ocrx_word") { if(attrValues.find("title:x_font") == attrValues.end()) { attrValues.insert(std::make_pair("title:x_font", "")); } attrValues.insert(std::make_pair("bold", fontBold() ? "yes" : "no")); attrValues.insert(std::make_pair("italic", fontItalic() ? "yes" : "no")); } return attrValues; } std::map HOCRItem::getAttributes(const std::vector& names) const { std::map attrValues; for(const Glib::ustring& attrName : names) { std::vector parts = Utils::string_split(attrName, ':'); if(parts.size() > 1) { g_assert(parts[0] == "title"); attrValues.insert(std::make_pair(attrName, getTitleAttribute(parts[1]))); } else if(attrName == "bold") { attrValues.insert(std::make_pair(attrName, fontBold() ? "yes" : "no")); } else if(attrName == "italic") { attrValues.insert(std::make_pair(attrName, fontItalic() ? "yes" : "no")); } else { attrValues.insert(std::make_pair(attrName, getAttribute(attrName))); } } return attrValues; } void HOCRItem::getPropagatableAttributes(std::map>>& occurrences) const { static std::map> s_propagatableAttributes = { {"ocr_line", {"title:baseline"}}, {"ocrx_word", {"lang", "title:x_fsize", "title:x_font", "bold", "italic"}} }; Glib::ustring childClass = m_childItems.empty() ? "" : m_childItems.front()->itemClass(); auto it = s_propagatableAttributes.find(childClass); if(it != s_propagatableAttributes.end()) { for(HOCRItem* child : m_childItems) { std::map attrs = child->getAttributes(it->second); for(auto attrIt = attrs.begin(), attrItEnd = attrs.end(); attrIt != attrItEnd; ++attrIt) { occurrences[childClass][attrIt->first].insert(attrIt->second); } } } if(childClass != "ocrx_word") { for(HOCRItem* child : m_childItems) { child->getPropagatableAttributes(occurrences); } } } void HOCRItem::setAttribute(const Glib::ustring& name, const Glib::ustring& value, const Glib::ustring& attrItemClass) { if(!attrItemClass.empty() && itemClass() != attrItemClass) { for(HOCRItem* child : m_childItems) { child->setAttribute(name, value, attrItemClass); } return; } std::vector parts = Utils::string_split(name, ':'); if(name == "bold") { m_bold = value == "yes"; } else if(name == "italic") { m_italic = value == "yes"; } else if(parts.size() < 2) { m_attrs[name] = value; } else { g_assert(parts[0] == "title"); m_titleAttrs[parts[1]] = value; if(name == "title:bbox") { std::vector bbox = Utils::string_split(value, ' ', false); g_assert(bbox.size() == 4); m_bbox.setCoords(std::atof(bbox[0].c_str()), std::atof(bbox[1].c_str()), std::atof(bbox[2].c_str()), std::atof(bbox[3].c_str())); } } } Glib::ustring HOCRItem::toHtml(int indent) const { Glib::ustring cls = itemClass(); Glib::ustring tag; if(cls == "ocr_page" || cls == "ocr_carea" || cls == "ocr_graphic") { tag = "div"; } else if(cls == "ocr_par") { tag = "p"; } else { tag = "span"; } Glib::ustring html = Glib::ustring(indent, ' ') + "<" + tag; html += Glib::ustring::compose(" title=\"%1\"", serializeAttrGroup(m_titleAttrs)); for(auto it = m_attrs.begin(), itEnd = m_attrs.end(); it != itEnd; ++it) { html += Glib::ustring::compose(" %1=\"%2\"", it->first, it->second); } html += ">"; if(cls == "ocrx_word") { if(m_bold) { html += ""; } if(m_italic) { html += ""; } html += Utils::string_html_escape(m_text); if(m_italic) { html += ""; } if(m_bold) { html += ""; } } else { html += "\n"; for(const HOCRItem* child : m_childItems) { html += child->toHtml(indent + 1); } html += Glib::ustring(indent, ' '); } html += "\n"; return html; } std::pair HOCRItem::baseLine() const { static const Glib::RefPtr baseLineRx = Glib::Regex::create("([+-]?\\d+\\.?\\d*)\\s+([+-]?\\d+\\.?\\d*)"); Glib::MatchInfo matchInfo; if(baseLineRx->match(getTitleAttribute("baseline"), matchInfo)) { double a = std::atof(matchInfo.fetch(1).c_str()); double b = std::atof(matchInfo.fetch(2).c_str()); return std::make_pair(a, b); } return std::make_pair(0.0, 0.0); } bool HOCRItem::parseChildren(const xmlpp::Element* element, Glib::ustring language) { // Determine item language (inherit from parent if not specified) Glib::ustring elemLang = getAttribute("lang"); if(!elemLang.empty()) { auto it = s_langCache.find(elemLang); if(it == s_langCache.end()) { it = s_langCache.insert(std::make_pair(elemLang, Utils::getSpellingLanguage(elemLang))).first; } m_attrs.erase(m_attrs.find("lang")); language = it->second; } if(itemClass() == "ocrx_word") { m_attrs["lang"] = language; return !m_text.empty(); } bool haveWords = false; const xmlpp::Element* childElement = XmlUtils::firstChildElement(element); while(childElement) { m_childItems.push_back(new HOCRItem(childElement, m_pageItem, this, m_childItems.size())); haveWords |= m_childItems.back()->parseChildren(childElement, language); childElement = XmlUtils::nextSiblingElement(childElement); } return haveWords; } Glib::ustring HOCRItem::getAttribute(const Glib::ustring& key) const { auto it = m_attrs.find(key); return it == m_attrs.end() ? Glib::ustring() : it->second; } Glib::ustring HOCRItem::getTitleAttribute(const Glib::ustring& key) const { auto it = m_titleAttrs.find(key); return it == m_titleAttrs.end() ? Glib::ustring() : it->second; } /////////////////////////////////////////////////////////////////////////////// HOCRPage::HOCRPage(const xmlpp::Element* element, int pageId, const Glib::ustring& language, bool cleanGraphics, int index) : HOCRItem(element, this, nullptr, index), m_pageId(pageId) { m_attrs["id"] = Glib::ustring::compose("page_%1", pageId); m_sourceFile = Utils::string_trim(m_titleAttrs["image"], "'\""); m_pageNr = std::atoi(m_titleAttrs["ppageno"].c_str()); // Code to handle pageno -> ppageno typo in previous versions of gImageReader if(m_pageNr == 0) { m_pageNr = std::atoi(m_titleAttrs["pageno"].c_str()); m_titleAttrs["ppageno"] = m_titleAttrs["pageno"]; m_titleAttrs.erase(m_titleAttrs.find("pageno")); } m_angle = std::atof(m_titleAttrs["rot"].c_str()); m_resolution = std::atoi(m_titleAttrs["res"].c_str()); const xmlpp::Element* childElement = XmlUtils::firstChildElement(element, "div"); while(childElement) { // Need to query here because "delete m_childItems.back();" may delete the item const xmlpp::Element* nextSibling = XmlUtils::nextSiblingElement(childElement); HOCRItem* item = new HOCRItem(childElement, this, this, m_childItems.size()); m_childItems.push_back(item); if(!item->parseChildren(childElement, language)) { // No word children -> treat as graphic if(cleanGraphics && (item->bbox().width < 10 || item->bbox().height < 10)) { // Ignore graphics which are less than 10 x 10 delete m_childItems.back(); m_childItems.pop_back(); } else { item->setAttribute("itemClass", "ocr_graphic"); std::for_each(item->m_childItems.begin(), item->m_childItems.end(), [](HOCRItem * item) { delete item; }); item->m_childItems.clear(); } } childElement = nextSibling; } } Glib::ustring HOCRPage::title() const { std::string basename = Gio::File::create_for_path(m_sourceFile)->get_basename(); return Glib::ustring::compose("%1 [%2]", basename, m_pageNr); } void HOCRPage::convertSourcePath(const std::string& basepath, bool absolute) { m_sourceFile = absolute ? Utils::make_absolute_path(m_sourceFile, basepath) : Utils::make_relative_path(m_sourceFile, basepath); m_titleAttrs["image"] = Glib::ustring::compose("'%1'", m_sourceFile); } gImageReader-3.3.1/gtk/src/hocr/HOCRDocument.hh000066400000000000000000000237001351740627400211270ustar00rootroot00000000000000/* -*- Mode: C++; indent-tabs-mode: t; c-basic-offset: 4; tab-width: 4 -*- */ /* * HOCRDocument.hh * Copyright (C) 2013-2019 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 HOCRDOCUMENT_HH #define HOCRDOCUMENT_HH #include "common.hh" #include "Config.hh" #include "Geometry.hh" #include #include #include namespace GtkSpell { class Checker; } namespace xmlpp { class Element; } class HOCRItem; class HOCRPage; class HOCRDocument : public Gtk::TreeModel, public Glib::Object { public: enum Columns { COLUMN_EDITABLE, COLUMN_CHECKED, COLUMN_ICON, COLUMN_TEXT, COLUMN_TEXT_COLOR, COLUMN_WCONF, NUM_COLUMNS}; HOCRDocument(GtkSpell::Checker* spell); ~HOCRDocument(); void setDefaultLanguage(const Glib::ustring& language) { m_defaultLanguage = language; } void recheckSpelling(); Glib::ustring toHTML(); Gtk::TreeIter addPage(const xmlpp::Element* pageElement, bool cleanGraphics); const HOCRPage* page(int i) const { return m_pages[i]; } int pageCount() const { return m_pages.size(); } const HOCRItem* itemAtIndex(const Gtk::TreeIter& index) const { return static_cast(index.gobj()->user_data); } bool editItemAttribute(const Gtk::TreeIter& index, const Glib::ustring& name, const Glib::ustring& value, const Glib::ustring& attrItemClass = Glib::ustring()); bool editItemText(const Gtk::TreeIter& index, const Glib::ustring& text); Gtk::TreeIter moveItem(const Gtk::TreeIter& itemIndex, const Gtk::TreeIter& newParent, int row); Gtk::TreeIter swapItems(const Gtk::TreeIter& parent, int startRow, int endRow); Gtk::TreeIter mergeItems(const Gtk::TreeIter& parent, int startRow, int endRow); Gtk::TreeIter splitItem(const Gtk::TreeIter& item, int startRow, int endRow); Gtk::TreeIter addItem(const Gtk::TreeIter& parent, const xmlpp::Element* element); bool removeItem(const Gtk::TreeIter& index); Gtk::TreeIter nextIndex(const Gtk::TreeIter& current) const; Gtk::TreeIter prevIndex(const Gtk::TreeIter& current) const; bool indexIsMisspelledWord(const Gtk::TreeIter& index) const; bool checkItemSpelling(const Gtk::TreeIter& index, std::vector* suggestions = nullptr, int limit = -1) const; bool referencesSource(const Glib::ustring& filename) const; Gtk::TreeIter searchPage(const Glib::ustring& filename, int pageNr) const; Gtk::TreeIter searchAtCanvasPos(const Gtk::TreeIter& pageIndex, const Geometry::Point& pos) const; void convertSourcePaths(const std::string& basepath, bool absolute); Gtk::TreePath get_root_path(int idx) const { Gtk::TreePath path; path.push_back(idx); return path; } // Upstream forgot the consts... Gtk::TreeIter get_iter(const Gtk::TreePath& path) const { return static_cast(const_cast(this))->get_iter(path); } Gtk::TreeIter get_iter(const Glib::ustring& path) const { return static_cast(const_cast(this))->get_iter(path); } sigc::signal signal_item_attribute_changed() { return m_signal_item_attribute_changed; } private: int m_pageIdCounter = 0; Glib::ustring m_defaultLanguage = "en_US"; GtkSpell::Checker* m_spell; std::vector m_pages; sigc::signal m_signal_item_attribute_changed; Gtk::TreeModelFlags get_flags_vfunc() const override; GType get_column_type_vfunc(int index) const override; int get_n_columns_vfunc() const override; bool iter_next_vfunc(const iterator& iter, iterator& iter_next) const override; bool get_iter_vfunc(const Path& path, iterator& iter) const override; bool iter_children_vfunc(const iterator& parent, iterator& iter) const override; bool iter_parent_vfunc(const iterator& child, iterator& iter) const override; bool iter_nth_child_vfunc(const iterator& parent, int n, iterator& iter) const override; bool iter_nth_root_child_vfunc(int n, iterator& iter) const override; bool iter_has_child_vfunc(const iterator& iter) const override; int iter_n_children_vfunc(const iterator& iter) const override; int iter_n_root_children_vfunc() const override; // void ref_node_vfunc(const iterator& iter) const override; // void unref_node_vfunc(const iterator& iter) const override; Gtk::TreeModel::Path get_path_vfunc(const iterator& iter) const override; void get_value_vfunc(const iterator& iter, int column, Glib::ValueBase& value) const override; void set_value_impl(const iterator& row, int column, const Glib::ValueBase& value) override; void get_value_impl(const iterator& row, int column, Glib::ValueBase& value) const override; Glib::ustring displayRoleForItem(const HOCRItem* item) const; Glib::RefPtr decorationRoleForItem(const HOCRItem* item) const; bool checkSpelling(const Glib::ustring& trimmed, std::vector* suggestions = nullptr, int limit = -1) const; void generateCombinations(const std::vector>& lists, std::vector>& results, int depth, const std::vector& c) const; void insertItem(HOCRItem* parent, HOCRItem* item, int i); void deleteItem(HOCRItem* item); void takeItem(HOCRItem* item); void recursiveDataChanged(const Gtk::TreeIter& index, const std::vector& itemClasses = {}); void recursiveRowInserted(const Gtk::TreeIter& index); void recomputeBBoxes(HOCRItem* item); HOCRItem* mutableItemAtIndex(const Gtk::TreeIter& index) const { return static_cast(index.gobj()->user_data); } }; class HOCRItem { public: // attrname : attrvalue : occurrences typedef std::map> AttrOccurenceMap_t; HOCRItem(const xmlpp::Element* element, HOCRPage* page, HOCRItem* parent, int index = -1); virtual ~HOCRItem(); HOCRPage* page() const { return m_pageItem; } const std::vector& children() const { return m_childItems; } HOCRItem* parent() const { return m_parentItem; } int index() const { return m_index; } bool isEnabled() const { return m_enabled; } // HOCR specific convenience getters Glib::ustring itemClass() const { return getAttribute("class"); } const Geometry::Rectangle& bbox() const { return m_bbox; } Glib::ustring text() const { return m_text; } Glib::ustring lang() const { return getAttribute("lang"); } Glib::ustring spellingLang() const { Glib::ustring l = lang(); Glib::ustring code = Config::lookupLangCode(l); return code.empty() ? l : code; } const std::map getTitleAttributes() const { return m_titleAttrs; } Glib::ustring getAttribute(const Glib::ustring& key) const; Glib::ustring getTitleAttribute(const Glib::ustring& key) const; std::map getAllAttributes() const; std::map getAttributes(const std::vector& names) const; void getPropagatableAttributes(std::map > >& occurrences) const; Glib::ustring toHtml(int indent = 0) const; std::pair baseLine() const; Glib::ustring fontFamily() const { return getTitleAttribute("x_font"); } double fontSize() const { return std::atof(getTitleAttribute("x_fsize").c_str()); } bool fontBold() const { return m_bold; } bool fontItalic() const { return m_italic; } void addChild(HOCRItem* child); void insertChild(HOCRItem* child, int index); void removeChild(HOCRItem* child); void takeChild(HOCRItem* child); std::vector takeChildren(); void setEnabled(bool enabled) { m_enabled = enabled; } void setText(const Glib::ustring& newText) { m_text = newText; } void setAttribute(const Glib::ustring& name, const Glib::ustring& value, const Glib::ustring& attrItemClass = Glib::ustring()); static std::map deserializeAttrGroup(const Glib::ustring& string); static Glib::ustring serializeAttrGroup(const std::map& attrs); static Glib::ustring trimmedWord(const Glib::ustring& word, Glib::ustring* prefix = nullptr, Glib::ustring* suffix = nullptr); protected: friend class HOCRPage; static std::map s_langCache; Glib::ustring m_text; bool m_bold; bool m_italic; std::map m_attrs; std::map m_titleAttrs; std::vector m_childItems; HOCRPage* m_pageItem = nullptr; HOCRItem* m_parentItem = nullptr; int m_index; bool m_enabled = true; Geometry::Rectangle m_bbox; bool parseChildren(const xmlpp::Element* element, Glib::ustring language); }; class HOCRPage : public HOCRItem { public: HOCRPage(const xmlpp::Element* element, int pageId, const Glib::ustring& language, bool cleanGraphics, int index); const Glib::ustring& sourceFile() const { return m_sourceFile; } // const-refs here to avoid taking reference from temporaries const int& pageNr() const { return m_pageNr; } const double& angle() const { return m_angle; } const int& resolution() const { return m_resolution; } int pageId() const { return m_pageId; } Glib::ustring title() const; private: friend class HOCRItem; friend class HOCRDocument; int m_pageId; std::map m_idCounters; Glib::ustring m_sourceFile; int m_pageNr; double m_angle; int m_resolution; void convertSourcePath(const std::string& basepath, bool absolute); }; #endif // HOCRDOCUMENT_HH gImageReader-3.3.1/gtk/src/hocr/HOCROdtExporter.cc000066400000000000000000000554571351740627400216340ustar00rootroot00000000000000/* -*- Mode: C++; indent-tabs-mode: t; c-basic-offset: 4; tab-width: 4 -*- */ /* * HOCROdtExporter.cc * Copyright (C) 2013-2019 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 "DisplayerToolHOCR.hh" #include "HOCRDocument.hh" #include "HOCROdtExporter.hh" #include "MainWindow.hh" #include "FileDialogs.hh" #include "SourceManager.hh" #include "Utils.hh" #include #include #include #include #include static Glib::ustring manifestNS_URI("urn:oasis:names:tc:opendocument:xmlns:manifest:1.0"); static Glib::ustring manifestNS("manifest"); static Glib::ustring officeNS_URI("urn:oasis:names:tc:opendocument:xmlns:office:1.0"); static Glib::ustring officeNS("office"); static Glib::ustring textNS_URI ("urn:oasis:names:tc:opendocument:xmlns:text:1.0"); static Glib::ustring textNS("text"); static Glib::ustring styleNS_URI ("urn:oasis:names:tc:opendocument:xmlns:style:1.0"); static Glib::ustring styleNS("style"); static Glib::ustring foNS_URI ("urn:oasis:names:tc:opendocument:xmlns:xsl-fo-compatible:1.0"); static Glib::ustring foNS("fo"); static Glib::ustring tableNS_URI ("urn:oasis:names:tc:opendocument:xmlns:table:1.0"); static Glib::ustring tableNS("table"); static Glib::ustring drawNS_URI ("urn:oasis:names:tc:opendocument:xmlns:drawing:1.0"); static Glib::ustring drawNS("draw"); static Glib::ustring xlinkNS_URI ("http://www.w3.org/1999/xlink"); static Glib::ustring xlinkNS("xlink"); static Glib::ustring svgNS_URI ("urn:oasis:names:tc:opendocument:xmlns:svg-compatible:1.0"); static Glib::ustring svgNS("svg"); template static zip_source* zip_source_buffer_from_data(zip* fzip, const char_t* data, std::size_t len) { void* copy = std::malloc(len); std::memcpy(copy, data, len); return zip_source_buffer(fzip, copy, len, 1); } bool HOCROdtExporter::run(const Glib::RefPtr& hocrdocument, std::string& filebasename) { Glib::ustring suggestion = filebasename; if(suggestion.empty()) { std::vector sources = MAIN->getSourceManager()->getSelectedSources(); suggestion = !sources.empty() ? Utils::split_filename(sources.front()->displayname).first : _("output"); } FileDialogs::FileFilter filter = {_("OpenDocument Text Documents"), {"application/vnd.oasis.opendocument.text"}, {"*.odt"}}; std::string outname = FileDialogs::save_dialog(_("Save ODT Output..."), suggestion + ".odt", "outputdir", filter); if(outname.empty()) { return false; } filebasename = Utils::split_filename(outname).first; zip* fzip = zip_open(outname.c_str(), ZIP_CREATE | ZIP_TRUNCATE, nullptr); if(!fzip) { Utils::message_dialog(Gtk::MESSAGE_WARNING, _("Export failed"), _("The ODT export failed: unable to write output file.")); return false; } int pageCount = hocrdocument->pageCount(); MainWindow::ProgressMonitor monitor(2 * pageCount); MAIN->showProgress(&monitor); bool success = Utils::busyTask([&] { // Image files if(zip_dir_add(fzip, "Pictures", ZIP_FL_ENC_UTF_8) < 0) { return false; } std::map imageFiles; for(int i = 0; i < pageCount; ++i) { monitor.increaseProgress(); const HOCRPage* page = hocrdocument->page(i); if(!page->isEnabled()) { continue; } bool ok = false; Utils::runInMainThreadBlocking([&] { ok = setSource(page->sourceFile(), page->pageNr(), page->resolution(), page->angle()); }); if(!ok) { continue; } for(const HOCRItem* item : page->children()) { writeImage(fzip, imageFiles, item); } } // Mimetype { Glib::ustring mimetype = "application/vnd.oasis.opendocument.text"; zip_source* source = zip_source_buffer_from_data(fzip, mimetype.c_str(), mimetype.bytes()); if(zip_file_add(fzip, "mimetype", source, ZIP_FL_ENC_UTF_8) < 0) { zip_source_free(source); return false; } } // Manifest { if(zip_dir_add(fzip, "META-INF", ZIP_FL_ENC_UTF_8) < 0) { return false; } xmlpp::Document doc; xmlpp::Element* manifestEl = doc.create_root_node("manifest", manifestNS_URI, manifestNS); manifestEl->set_attribute("version", "1.2", manifestNS); #ifdef HAVE_LIBXMLPP_2 xmlpp::Element* fileEntryEl = manifestEl->add_child("file-entry", manifestNS); #else xmlpp::Element* fileEntryEl = manifestEl->add_child_element("file-entry", manifestNS); #endif fileEntryEl->set_attribute("media-type", "application/vnd.oasis.opendocument.text", manifestNS); fileEntryEl->set_attribute("full-path", "/", manifestNS); #ifdef HAVE_LIBXMLPP_2 fileEntryEl = manifestEl->add_child("file-entry", manifestNS); #else fileEntryEl = manifestEl->add_child_element("file-entry", manifestNS); #endif fileEntryEl->set_attribute("media-type", "text/xml", manifestNS); fileEntryEl->set_attribute("full-path", "content.xml", manifestNS); for(auto it = imageFiles.begin(), itEnd = imageFiles.end(); it != itEnd; ++it) { #ifdef HAVE_LIBXMLPP_2 fileEntryEl = manifestEl->add_child("file-entry", manifestNS); #else fileEntryEl = manifestEl->add_child_element("file-entry", manifestNS); #endif fileEntryEl->set_attribute("media-type", "image/png", manifestNS); fileEntryEl->set_attribute("full-path", it->second, manifestNS); } Glib::ustring data = doc.write_to_string(); zip_source* source = zip_source_buffer_from_data(fzip, data.c_str(), data.bytes()); if(zip_file_add(fzip, "META-INF/manifest.xml", source, ZIP_FL_ENC_UTF_8) < 0) { zip_source_free(source); return false; } } // Content { xmlpp::Document doc; xmlpp::Element* documentContentEl = doc.create_root_node("document-content", officeNS_URI, officeNS); documentContentEl->set_namespace_declaration(textNS_URI, textNS); documentContentEl->set_namespace_declaration(styleNS_URI, styleNS); documentContentEl->set_namespace_declaration(foNS_URI, foNS); documentContentEl->set_namespace_declaration(drawNS_URI, drawNS); documentContentEl->set_namespace_declaration(xlinkNS_URI, xlinkNS); documentContentEl->set_namespace_declaration(svgNS_URI, svgNS); documentContentEl->set_attribute("version", "1.2", officeNS); // - Font face decls #ifdef HAVE_LIBXMLPP_2 xmlpp::Element* fontFaceDeclsEl = documentContentEl->add_child("font-face-decls", officeNS); #else xmlpp::Element* fontFaceDeclsEl = documentContentEl->add_child_element("font-face-decls", officeNS); #endif std::set families; for(int i = 0; i < pageCount; ++i) { const HOCRPage* page = hocrdocument->page(i); if(page->isEnabled()) { writeFontFaceDecls(families, page, fontFaceDeclsEl); } } // - Page styles #ifdef HAVE_LIBXMLPP_2 xmlpp::Element* automaticStylesEl = documentContentEl->add_child("automatic-styles", officeNS); #else xmlpp::Element* automaticStylesEl = documentContentEl->add_child_element("automatic-styles", officeNS); #endif for(int i = 0; i < pageCount; ++i) { const HOCRPage* page = hocrdocument->page(i); if(page->isEnabled()) { #ifdef HAVE_LIBXMLPP_2 xmlpp::Element* pageLayoutEl = automaticStylesEl->add_child("page-layout", styleNS); #else xmlpp::Element* pageLayoutEl = automaticStylesEl->add_child_element("page-layout", styleNS); #endif pageLayoutEl->set_attribute("name", Glib::ustring::compose("PL%1", i), styleNS); #ifdef HAVE_LIBXMLPP_2 xmlpp::Element* pageLayoutPropertiesEl = pageLayoutEl->add_child("page-layout-properties", styleNS); #else xmlpp::Element* pageLayoutPropertiesEl = pageLayoutEl->add_child_element("page-layout-properties", styleNS); #endif pageLayoutPropertiesEl->set_attribute("page-width", Glib::ustring::compose("%1in", page->bbox().width / double(page->resolution())), foNS); pageLayoutPropertiesEl->set_attribute("page-height", Glib::ustring::compose("%1in", page->bbox().height / double(page->resolution())), foNS); pageLayoutPropertiesEl->set_attribute("print-orientation", page->bbox().width > page->bbox().height ? "landscape" : "portrait", styleNS); pageLayoutPropertiesEl->set_attribute("writing-mode", "lr-tb", styleNS); pageLayoutPropertiesEl->set_attribute("margin-top", "0in", foNS); pageLayoutPropertiesEl->set_attribute("margin-bottom", "0in", foNS); pageLayoutPropertiesEl->set_attribute("margin-left", "0in", foNS); pageLayoutPropertiesEl->set_attribute("margin-right", "0in", foNS); } } #ifdef HAVE_LIBXMLPP_2 xmlpp::Element* masterStylesEl = documentContentEl->add_child("master-styles", officeNS); #else xmlpp::Element* masterStylesEl = documentContentEl->add_child_element("master-styles", officeNS); #endif for(int i = 0; i < pageCount; ++i) { if(hocrdocument->page(i)->isEnabled()) { #ifdef HAVE_LIBXMLPP_2 xmlpp::Element* masterPageEl = masterStylesEl->add_child("master-page", styleNS); #else xmlpp::Element* masterPageEl = masterStylesEl->add_child_element("master-page", styleNS); #endif masterPageEl->set_attribute("name", Glib::ustring::compose("MP%1", i), styleNS); masterPageEl->set_attribute("page-layout-name", Glib::ustring::compose("PL%1", i), styleNS); } } // - Styles #ifdef HAVE_LIBXMLPP_2 automaticStylesEl = documentContentEl->add_child("automatic-styles", officeNS); #else automaticStylesEl = documentContentEl->add_child_element("automatic-styles", officeNS); #endif // -- Standard paragraph #ifdef HAVE_LIBXMLPP_2 xmlpp::Element* styleEl = automaticStylesEl->add_child("style", styleNS); #else xmlpp::Element* styleEl = automaticStylesEl->add_child_element("style", styleNS); #endif styleEl->set_attribute("name", "P", styleNS); styleEl->set_attribute("parent-style-name", "Standard", styleNS); // -- Page paragraphs for(int i = 0; i < pageCount; ++i) { if(hocrdocument->page(i)->isEnabled()) { #ifdef HAVE_LIBXMLPP_2 xmlpp::Element* styleEl = automaticStylesEl->add_child("style", styleNS); #else xmlpp::Element* styleEl = automaticStylesEl->add_child_element("style", styleNS); #endif styleEl->set_attribute("name", Glib::ustring::compose("PP%1", i), styleNS); styleEl->set_attribute("family", "paragraph", styleNS); styleEl->set_attribute("parent-style-name", "Standard", styleNS); styleEl->set_attribute("master-page-name", Glib::ustring::compose("MP%1", i), styleNS); #ifdef HAVE_LIBXMLPP_2 xmlpp::Element* paragraphPropertiesEl = styleEl->add_child("paragraph-properties", styleNS); #else xmlpp::Element* paragraphPropertiesEl = styleEl->add_child_element("paragraph-properties", styleNS); #endif paragraphPropertiesEl->set_attribute("break-before", "page", foNS); } } // -- Frame, absolutely positioned on page #ifdef HAVE_LIBXMLPP_2 styleEl = automaticStylesEl->add_child("style", styleNS); #else styleEl = automaticStylesEl->add_child_element("style", styleNS); #endif styleEl->set_attribute("name", "F", styleNS); styleEl->set_attribute("family", "graphic", styleNS); #ifdef HAVE_LIBXMLPP_2 xmlpp::Element* graphicPropertiesEl = styleEl->add_child("graphic-properties", styleNS); #else xmlpp::Element* graphicPropertiesEl = styleEl->add_child_element("graphic-properties", styleNS); #endif graphicPropertiesEl->set_attribute("stroke", "none", drawNS); graphicPropertiesEl->set_attribute("fill", "none", drawNS); graphicPropertiesEl->set_attribute("vertical-pos", "from-top", styleNS); graphicPropertiesEl->set_attribute("vertical-rel", "page", styleNS); graphicPropertiesEl->set_attribute("horizontal-pos", "from-left", styleNS); graphicPropertiesEl->set_attribute("horizontal-rel", "page", styleNS); graphicPropertiesEl->set_attribute("flow-with-text", "false", styleNS); // -- Text styles int counter = 0; std::map> fontStyles; for(int i = 0; i < pageCount; ++i) { const HOCRPage* page = hocrdocument->page(i); if(page->isEnabled()) { for(const HOCRItem* item : page->children()) { writeFontStyles(fontStyles, item, automaticStylesEl, counter); } } } // - Body #ifdef HAVE_LIBXMLPP_2 xmlpp::Element* bodyEl = documentContentEl->add_child("body", officeNS); xmlpp::Element* textEl = bodyEl->add_child("text", officeNS); #else xmlpp::Element* bodyEl = documentContentEl->add_child_element("body", officeNS); xmlpp::Element* textEl = bodyEl->add_child_element("text", officeNS); #endif int pageCounter = 1; for(int i = 0; i < pageCount; ++i) { monitor.increaseProgress(); const HOCRPage* page = hocrdocument->page(i); if(!page->isEnabled()) { continue; } #ifdef HAVE_LIBXMLPP_2 xmlpp::Element* pEl = textEl->add_child("p", textNS); #else xmlpp::Element* pEl = textEl->add_child_element("p", textNS); #endif pEl->set_attribute("style-name", Glib::ustring::compose("PP%1", i), textNS); for(const HOCRItem* item : page->children()) { printItem(pEl, item, pageCounter, page->resolution(), fontStyles, imageFiles); } ++pageCounter; } Glib::ustring data = doc.write_to_string(); zip_source* source = zip_source_buffer_from_data(fzip, data.c_str(), data.bytes()); if(zip_file_add(fzip, "content.xml", source, ZIP_FL_ENC_UTF_8) < 0) { zip_source_free(source); return false; } } return true; }, _("Exporting to ODT...")); MAIN->hideProgress(); zip_close(fzip); bool openAfterExport = ConfigSettings::get>("openafterexport")->getValue(); if(!success) { Utils::message_dialog(Gtk::MESSAGE_WARNING, _("Export failed"), _("The ODT export failed: unable to write output file.")); } else if(openAfterExport) { Utils::openUri(Glib::filename_to_uri(outname)); } return success; } void HOCROdtExporter::writeImage(zip* fzip, std::map& images, const HOCRItem* item) { if(!item->isEnabled()) { return; } if(item->itemClass() == "ocr_graphic") { Cairo::RefPtr selection; Utils::runInMainThreadBlocking([&] { selection = getSelection(item->bbox()); }); //#if GLIB_CHECK_VERSION(2, 52, 0) // gchar* guuid = g_uuid_string_random(); // Glib::ustring uuid(guuid); // g_free(guuid); // uuid = uuid.substr(1, uuid.length() - 2); // Remove {} //#else uuid_t uuidGenerated; uuid_generate_random(uuidGenerated); char uuidBuff[36]; uuid_unparse(uuidGenerated, uuidBuff); Glib::ustring uuid(uuidBuff); //#endif Glib::ustring filename = Glib::ustring::compose("Pictures/%1.png", uuid); Glib::RefPtr pngbytes = Glib::ByteArray::create(); selection->write_to_png_stream([&](const unsigned char* data, unsigned int length)->Cairo::ErrorStatus { pngbytes->append(data, length); return CAIRO_STATUS_SUCCESS; }); zip_source* source = zip_source_buffer_from_data(fzip, pngbytes->get_data(), pngbytes->size()); if(zip_file_add(fzip, filename.c_str(), source, ZIP_FL_ENC_UTF_8) < 0) { zip_source_free(source); return; } images.insert(std::make_pair(item, filename)); } } void HOCROdtExporter::writeFontFaceDecls(std::set& families, const HOCRItem* item, xmlpp::Element* parentEl) { if(!item->isEnabled()) { return; } if(item->itemClass() == "ocrx_word") { Glib::ustring fontFamily = item->fontFamily(); if(families.find(fontFamily) == families.end()) { if(!fontFamily.empty()) { #ifdef HAVE_LIBXMLPP_2 xmlpp::Element* fontFaceEl = parentEl->add_child("font-face", styleNS); #else xmlpp::Element* fontFaceEl = parentEl->add_child_element("font-face", styleNS); #endif fontFaceEl->set_attribute("name", fontFamily, styleNS); fontFaceEl->set_attribute("font-family", fontFamily, svgNS); } families.insert(fontFamily); } } else { for(const HOCRItem* child : item->children()) { writeFontFaceDecls(families, child, parentEl); } } } void HOCROdtExporter::writeFontStyles(std::map>& styles, const HOCRItem* item, xmlpp::Element* parentEl, int& counter) { if(!item->isEnabled()) { return; } if(item->itemClass() == "ocrx_word") { Glib::ustring fontKey = item->fontFamily() + (item->fontBold() ? "@bold" : "") + (item->fontItalic() ? "@italic" : ""); if(styles.find(fontKey) == styles.end() || styles[fontKey].find(item->fontSize()) == styles[fontKey].end()) { Glib::ustring styleName = Glib::ustring::compose("T%1", ++counter); #ifdef HAVE_LIBXMLPP_2 xmlpp::Element* styleEl = parentEl->add_child("style", styleNS); #else xmlpp::Element* styleEl = parentEl->add_child_element("style", styleNS); #endif styleEl->set_attribute("name", styleName, styleNS); styleEl->set_attribute("family", "text", styleNS); #ifdef HAVE_LIBXMLPP_2 xmlpp::Element* textPropertiesEl = styleEl->add_child("text-properties", styleNS); #else xmlpp::Element* textPropertiesEl = styleEl->add_child_element("text-properties", styleNS); #endif textPropertiesEl->set_attribute("font-name", item->fontFamily(), styleNS); textPropertiesEl->set_attribute("font-size", Glib::ustring::compose("%1pt", item->fontSize()), foNS); if(item->fontBold()) { textPropertiesEl->set_attribute("font-weight", "bold", foNS); } if(item->fontItalic()) { textPropertiesEl->set_attribute("font-style", "italic", foNS); } styles[fontKey].insert(std::make_pair(item->fontSize(), styleName)); } } else { for(const HOCRItem* child : item->children()) { writeFontStyles(styles, child, parentEl, counter); } } } void HOCROdtExporter::printItem(xmlpp::Element* parentEl, const HOCRItem* item, int pageNr, int dpi, std::map>& fontStyleNames, std::map& images) { if(!item->isEnabled()) { return; } Glib::ustring itemClass = item->itemClass(); const Geometry::Rectangle& bbox = item->bbox(); if(itemClass == "ocr_graphic") { #ifdef HAVE_LIBXMLPP_2 xmlpp::Element* frameEl = parentEl->add_child("frame", drawNS); #else xmlpp::Element* frameEl = parentEl->add_child_element("frame", drawNS); #endif frameEl->set_attribute("style-name", "F", drawNS); frameEl->set_attribute("anchor-type", "page", textNS); frameEl->set_attribute("anchor-page-number", Glib::ustring::format(std::fixed, std::setprecision(0), pageNr), textNS); frameEl->set_attribute("x", Glib::ustring::compose("%1in", bbox.x / double(dpi)), svgNS); frameEl->set_attribute("y", Glib::ustring::compose("%1in", bbox.y / double(dpi)), svgNS); frameEl->set_attribute("width", Glib::ustring::compose("%1in", bbox.width / double(dpi)), svgNS); frameEl->set_attribute("height", Glib::ustring::compose("%1in", bbox.height / double(dpi)), svgNS); frameEl->set_attribute("z-index", "0", drawNS); #ifdef HAVE_LIBXMLPP_2 xmlpp::Element* imageEl = frameEl->add_child("image", drawNS); #else xmlpp::Element* imageEl = frameEl->add_child_element("image", drawNS); #endif imageEl->set_attribute("href", images[item], xlinkNS); imageEl->set_attribute("type", "simple", xlinkNS); imageEl->set_attribute("show", "embed", xlinkNS); } else if(itemClass == "ocr_par") { #ifdef HAVE_LIBXMLPP_2 xmlpp::Element* frameEl = parentEl->add_child("frame", drawNS); #else xmlpp::Element* frameEl = parentEl->add_child_element("frame", drawNS); #endif frameEl->set_attribute("style-name", "F", drawNS); frameEl->set_attribute("anchor-type", "page", textNS); frameEl->set_attribute("anchor-page-number", Glib::ustring::format(std::fixed, std::setprecision(0), pageNr), textNS); frameEl->set_attribute("x", Glib::ustring::compose("%1in", bbox.x / double(dpi)), svgNS); frameEl->set_attribute("y", Glib::ustring::compose("%1in", bbox.y / double(dpi)), svgNS); frameEl->set_attribute("width", Glib::ustring::compose("%1in", bbox.width / double(dpi)), svgNS); frameEl->set_attribute("height", Glib::ustring::compose("%1in", bbox.height / double(dpi)), svgNS); frameEl->set_attribute("z-index", "1", drawNS); #ifdef HAVE_LIBXMLPP_2 xmlpp::Element* textBoxEl = frameEl->add_child("text-box", drawNS); xmlpp::Element* ppEl = textBoxEl->add_child("p", textNS); #else xmlpp::Element* textBoxEl = frameEl->add_child_element("text-box", drawNS); xmlpp::Element* ppEl = textBoxEl->add_child_element("p", textNS); #endif ppEl->set_attribute("style-name", "P", textNS); for(const HOCRItem* child : item->children()) { printItem(ppEl, child, pageNr, dpi, fontStyleNames, images); } } else if(itemClass == "ocr_line") { const HOCRItem* firstWord = nullptr; int iChild = 0, nChilds = item->children().size(); for(; iChild < nChilds; ++iChild) { const HOCRItem* child = item->children()[iChild]; if(child->isEnabled()) { firstWord = child; break; } } if(!firstWord) { return; } Glib::ustring fontKey = firstWord->fontFamily() + (firstWord->fontBold() ? "@bold" : "") + (firstWord->fontItalic() ? "@italic" : ""); Glib::ustring currentFontStyleName = fontStyleNames[fontKey][firstWord->fontSize()]; #ifdef HAVE_LIBXMLPP_2 xmlpp::Element* spanEl = parentEl->add_child("span", textNS); #else xmlpp::Element* spanEl = parentEl->add_child_element("span", textNS); #endif spanEl->set_attribute("style-name", currentFontStyleName, textNS); spanEl->add_child_text(firstWord->text()); ++iChild; for(; iChild < nChilds; ++iChild) { const HOCRItem* child = item->children()[iChild]; if(!child->isEnabled()) { continue; } fontKey = child->fontFamily() + (child->fontBold() ? "@bold" : "") + (child->fontItalic() ? "@italic" : ""); Glib::ustring fontStyleName = fontStyleNames[fontKey][child->fontSize()]; if(fontStyleName != currentFontStyleName) { currentFontStyleName = fontStyleName; #ifdef HAVE_LIBXMLPP_2 spanEl = parentEl->add_child("span", textNS); #else spanEl = parentEl->add_child_element("span", textNS); #endif spanEl->set_attribute("style-name", currentFontStyleName, textNS); } spanEl->add_child_text(" "); spanEl->add_child_text(child->text()); } #ifdef HAVE_LIBXMLPP_2 parentEl->add_child("line-break", textNS); #else parentEl->add_child_element("line-break", textNS); #endif } else { for(const HOCRItem* child : item->children()) { printItem(parentEl, child, pageNr, dpi, fontStyleNames, images); } } } bool HOCROdtExporter::setSource(const Glib::ustring& sourceFile, int page, int dpi, double angle) { Glib::RefPtr file = Gio::File::create_for_path(sourceFile); if(MAIN->getSourceManager()->addSource(file, true)) { MAIN->getDisplayer()->setup(&page, &dpi, &angle); return true; } else { return false; } } Cairo::RefPtr HOCROdtExporter::getSelection(const Geometry::Rectangle& bbox) { return m_displayerTool->getSelection(bbox); } gImageReader-3.3.1/gtk/src/hocr/HOCROdtExporter.hh000066400000000000000000000040101351740627400216210ustar00rootroot00000000000000/* -*- Mode: C++; indent-tabs-mode: t; c-basic-offset: 4; tab-width: 4 -*- */ /* * HOCROdtExporter.hh * Copyright (C) 2013-2019 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 HOCRODTEXPORTER_HH #define HOCRODTEXPORTER_HH #include "common.hh" #include "Geometry.hh" class DisplayerToolHOCR; class HOCRDocument; class HOCRItem; namespace xmlpp { class Element; } struct zip; class HOCROdtExporter { public: HOCROdtExporter(DisplayerToolHOCR* displayerTool) : m_displayerTool(displayerTool) {} bool run(const Glib::RefPtr& hocrdocument, std::string& filebasename); private: DisplayerToolHOCR* m_displayerTool; void writeImage(zip* fzip, std::map& images, const HOCRItem* item); void writeFontFaceDecls(std::set& families, const HOCRItem* item, xmlpp::Element* parentEl); void writeFontStyles(std::map >& styles, const HOCRItem* item, xmlpp::Element* parentEl, int& counter); void printItem(xmlpp::Element* parentEl, const HOCRItem* item, int pageNr, int dpi, std::map >& fontStyleNames, std::map& images); bool setSource(const Glib::ustring& sourceFile, int page, int dpi, double angle); Cairo::RefPtr getSelection(const Geometry::Rectangle& bbox); }; #endif // HOCRODTEXPORTER_HH gImageReader-3.3.1/gtk/src/hocr/HOCRPdfExporter.cc000066400000000000000000001252251351740627400216060ustar00rootroot00000000000000/* -*- Mode: C++; indent-tabs-mode: t; c-basic-offset: 4; tab-width: 4 -*- */ /* * HOCRPdfExporter.cc * Copyright (C) 2013-2019 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 #define USE_STD_NAMESPACE #include #undef USE_STD_NAMESPACE #include "CCITTFax4Encoder.hh" #include "ConfigSettings.hh" #include "Displayer.hh" #include "DisplayerToolHOCR.hh" #include "FileDialogs.hh" #include "FontComboBox.hh" #include "HOCRDocument.hh" #include "HOCRPdfExporter.hh" #include "MainWindow.hh" #include "PaperSize.hh" #include "SourceManager.hh" #include "Utils.hh" class HOCRPdfExporter::CairoPDFPainter : public HOCRPdfExporter::PDFPainter { public: CairoPDFPainter(Cairo::RefPtr context, const Glib::ustring& defaultFont, const std::vector& fontFamilies) : m_context(context), m_defaultFont(defaultFont), m_fontFamilies(fontFamilies) { m_curFont = m_defaultFont; m_context->select_font_face(m_curFont, Cairo::FONT_SLANT_NORMAL, Cairo::FONT_WEIGHT_NORMAL); } void setFontFamily(const Glib::ustring& family, bool bold, bool italic) override { if(family != m_curFont) { if(std::find(m_fontFamilies.begin(), m_fontFamilies.end(), family) != m_fontFamilies.end()) { m_curFont = family; } else { m_curFont = m_defaultFont; } } m_context->select_font_face(m_curFont, italic ? Cairo::FONT_SLANT_ITALIC : Cairo::FONT_SLANT_NORMAL, bold ? Cairo::FONT_WEIGHT_BOLD : Cairo::FONT_WEIGHT_NORMAL); } 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; Glib::ustring m_curFont; Glib::ustring m_defaultFont; const std::vector& m_fontFamilies; }; #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 HOCRPdfExporter::PoDoFoPDFPainter : public HOCRPdfExporter::PDFPainter { public: #if PODOFO_VERSION >= PODOFO_MAKE_VERSION(0,9,3) PoDoFoPDFPainter(PoDoFo::PdfStreamedDocument* document, const PoDoFo::PdfEncoding* fontEncoding, PoDoFo::PdfFont* defaultFont, const Glib::ustring& defaultFontFamily, double defaultFontSize, const std::vector& fontFamilies) #else PoDoFoPDFPainter(PoDoFo::PdfStreamedDocument* document, PoDoFo::PdfEncoding* fontEncoding, PoDoFo::PdfFont* defaultFont, const Glib::ustring& defaultFontFamily, double defaultFontSize, const std::vector& fontFamilies) #endif : m_fontFamilies(fontFamilies), m_document(document), m_pdfFontEncoding(fontEncoding), m_defaultFont(defaultFont), m_defaultFontFamily(defaultFontFamily), m_defaultFontSize(defaultFontSize) { } ~PoDoFoPDFPainter() { #if PODOFO_VERSION < PODOFO_MAKE_VERSION(0,9,3) delete m_pdfFontEncoding; #endif delete m_document; // Fonts are deleted by the internal PoDoFo font cache of the document } bool createPage(double width, double height, double offsetX, double offsetY, Glib::ustring& /*errMsg*/) override { PoDoFo::PdfPage* pdfpage = m_document->CreatePage(PoDoFo::PdfRect(0, 0, width, height)); m_painter.SetPage(pdfpage); m_pageHeight = m_painter.GetPage()->GetPageSize().GetHeight(); m_painter.SetFont(m_defaultFont); if(m_defaultFontSize > 0) { m_painter.GetFont()->SetFontSize(m_defaultFontSize); } m_offsetX = offsetX; m_offsetY = offsetY; return true; } void finishPage() override { m_painter.FinishPage(); } bool finishDocument(Glib::ustring& errMsg) override { try { m_document->Close(); } catch(PoDoFo::PdfError& e) { errMsg = e.what(); return false; } return true; } void setFontFamily(const Glib::ustring& family, bool bold, bool italic) override { float curSize = m_painter.GetFont()->GetFontSize(); m_painter.SetFont(getFont(family, bold, italic)); m_painter.GetFont()->SetFontSize(curSize); } 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(m_offsetX + x, m_pageHeight - m_offsetY - y, 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(m_offsetX + bbox.x, m_pageHeight - m_offsetY - (bbox.y + bbox.height), &pdfImage, bbox.width / double(image->get_width()), bbox.height / double(image->get_height())); } double getAverageCharWidth() const override { return m_painter.GetFont()->GetFontMetrics()->CharWidth(static_cast('x')); } double getTextWidth(const Glib::ustring& text) const override { PoDoFo::PdfString pdfString(reinterpret_cast(text.c_str())); return m_painter.GetFont()->GetFontMetrics()->StringWidth(pdfString); } private: const std::vector& m_fontFamilies; std::map m_fontCache; PoDoFo::PdfStreamedDocument* m_document; PoDoFo::PdfPainter m_painter; #if PODOFO_VERSION >= PODOFO_MAKE_VERSION(0,9,3) const PoDoFo::PdfEncoding* m_pdfFontEncoding; #else PoDoFo::PdfEncoding* m_pdfFontEncoding; #endif PoDoFo::PdfFont* m_defaultFont; Glib::ustring m_defaultFontFamily; double m_defaultFontSize = -1.0; double m_pageHeight = 0.0; double m_offsetX = 0.0; double m_offsetY = 0.0; PoDoFo::PdfFont* getFont(Glib::ustring family, bool bold, bool italic) { Glib::ustring key = family + (bold ? "@bold" : "") + (italic ? "@italic" : ""); auto it = m_fontCache.find(key); if(it == m_fontCache.end()) { if(family.empty() || std::find(m_fontFamilies.begin(), m_fontFamilies.end(), family) == m_fontFamilies.end()) { family = m_defaultFontFamily; } PoDoFo::PdfFont* font = nullptr; try { #if PODOFO_VERSION >= PODOFO_MAKE_VERSION(0,9,3) font = m_document->CreateFontSubset(Utils::resolveFontName(family).c_str(), bold, italic, false, m_pdfFontEncoding); #else font = document->CreateFontSubset(Utils::resolveFontName(family).c_str(), bold, italic, m_pdfFontEncoding); #endif it = m_fontCache.insert(std::make_pair(key, font)).first; } catch(PoDoFo::PdfError& /*err*/) { it = m_fontCache.insert(std::make_pair(key, m_defaultFont)).first; } } return it->second; } }; HOCRPdfExporter::HOCRPdfExporter(const Glib::RefPtr& hocrdocument, const HOCRPage* previewPage, DisplayerToolHOCR* displayerTool) : m_hocrdocument(hocrdocument), m_previewPage(previewPage), m_displayerTool(displayerTool) { ui.builder->get_widget_derived("comboOverridefontfamily", m_comboOverrideFont); ui.builder->get_widget_derived("comboFallbackfontfamily", m_comboFallbackFont); ui.setupUi(); ui.dialogPdfExport->set_transient_for(*MAIN->getWindow()); // Paper format combo Glib::RefPtr paperFormatComboModel = Gtk::ListStore::create(m_paperFormatComboCols); ui.comboPaperFormat->set_model(paperFormatComboModel); Gtk::TreeModel::Row row = *(paperFormatComboModel->append()); row[m_paperFormatComboCols.label] = _("Same as source"); row[m_paperFormatComboCols.format] = "source"; row = *(paperFormatComboModel->append()); row[m_paperFormatComboCols.label] = _("Custom"); row[m_paperFormatComboCols.format] = "custom"; for(const auto& size : PaperSize::paperSizes) { row = *(paperFormatComboModel->append()); row[m_paperFormatComboCols.label] = size.first; row[m_paperFormatComboCols.format] = size.first; } ui.comboPaperFormat->pack_start(m_paperFormatComboCols.label); ui.comboPaperFormat->set_active(-1); // Paper size combo Glib::RefPtr sizeUnitComboModel = Gtk::ListStore::create(m_sizeUnitComboCols); ui.comboPaperSizeUnit->set_model(sizeUnitComboModel); row = *(sizeUnitComboModel->append()); row[m_sizeUnitComboCols.label] = _("cm"); row[m_sizeUnitComboCols.unit] = static_cast(PaperSize::cm); row = *(sizeUnitComboModel->append()); row[m_sizeUnitComboCols.label] = _("in"); row[m_sizeUnitComboCols.unit] = static_cast(PaperSize::inch); ui.comboPaperSizeUnit->pack_start(m_sizeUnitComboCols.label); ui.comboPaperSizeUnit->set_active(0); // Image format combo Glib::RefPtr formatComboModel = Gtk::ListStore::create(m_formatComboCols); ui.comboImageformat->set_model(formatComboModel); 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"); ui.comboImageformat->pack_start(m_formatComboCols.label); ui.comboImageformat->set_active(-1); // Dithering algorithm combo Glib::RefPtr ditheringComboModel = Gtk::ListStore::create(m_ditheringComboCols); ui.comboDithering->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"); ui.comboDithering->pack_start(m_ditheringComboCols.label); ui.comboDithering->set_active(-1); // Image compression combo Glib::RefPtr compressionModel = Gtk::ListStore::create(m_compressionComboCols); ui.comboCompression->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; ui.comboCompression->pack_start(m_compressionComboCols.label); ui.comboCompression->set_active(-1); Gtk::CellRendererText* compressionTextRenderer = dynamic_cast(ui.comboCompression->get_cells()[0]); if(compressionTextRenderer) { ui.comboCompression->add_attribute(compressionTextRenderer->property_sensitive(), m_compressionComboCols.sensitive); } Glib::RefPtr fontMap = Glib::wrap(pango_cairo_font_map_get_default(), true); for(const Glib::RefPtr& family : fontMap->list_families()) { m_fontFamilies.push_back(family->get_name()); } Glib::RefPtr pdfVersionModel = Gtk::ListStore::create(m_pdfVersionComboCols); ui.comboPdfVersion->set_model(pdfVersionModel); row = *(pdfVersionModel->append()); row[m_pdfVersionComboCols.label] = "1.0"; row[m_pdfVersionComboCols.version] = PoDoFo::EPdfVersion::ePdfVersion_1_0; row = *(pdfVersionModel->append()); row[m_pdfVersionComboCols.label] = "1.1"; row[m_pdfVersionComboCols.version] = PoDoFo::EPdfVersion::ePdfVersion_1_1; row = *(pdfVersionModel->append()); row[m_pdfVersionComboCols.label] = "1.2"; row[m_pdfVersionComboCols.version] = PoDoFo::EPdfVersion::ePdfVersion_1_2; row = *(pdfVersionModel->append()); row[m_pdfVersionComboCols.label] = "1.3"; row[m_pdfVersionComboCols.version] = PoDoFo::EPdfVersion::ePdfVersion_1_3; row = *(pdfVersionModel->append()); row[m_pdfVersionComboCols.label] = "1.4"; row[m_pdfVersionComboCols.version] = PoDoFo::EPdfVersion::ePdfVersion_1_4; row = *(pdfVersionModel->append()); row[m_pdfVersionComboCols.label] = "1.5"; row[m_pdfVersionComboCols.version] = PoDoFo::EPdfVersion::ePdfVersion_1_5; row = *(pdfVersionModel->append()); row[m_pdfVersionComboCols.label] = "1.6"; row[m_pdfVersionComboCols.version] = PoDoFo::EPdfVersion::ePdfVersion_1_6; row = *(pdfVersionModel->append()); row[m_pdfVersionComboCols.label] = "1.7"; row[m_pdfVersionComboCols.version] = PoDoFo::EPdfVersion::ePdfVersion_1_7; ui.comboPdfVersion->pack_start(m_pdfVersionComboCols.label); ui.comboPdfVersion->set_active(-1); CONNECT(ui.comboMode, changed, [this] { updatePreview(); }); CONNECT(ui.comboImageformat, changed, [this] { imageFormatChanged(); updatePreview(); }); CONNECT(ui.comboDithering, changed, [this] { updatePreview(); }); CONNECT(ui.comboCompression, changed, [this] { imageCompressionChanged(); }); CONNECT(ui.spinQuality, value_changed, [this] { updatePreview(); }); CONNECT(ui.checkboxOverridefontfamily, toggled, [this] { m_comboOverrideFont->set_sensitive(ui.checkboxOverridefontfamily->get_active()); m_comboFallbackFont->set_sensitive(!ui.checkboxOverridefontfamily->get_active()); ui.labelFallbackfontfamily->set_sensitive(!ui.checkboxOverridefontfamily->get_active()); updatePreview(); }); CONNECT(m_comboFallbackFont, font_changed, [this](Glib::ustring) { updatePreview(); }); CONNECT(m_comboOverrideFont, font_changed, [this](Glib::ustring) { updatePreview(); }); CONNECT(ui.checkboxOverridefontsize, toggled, [this] { ui.spinOverridefontsize->set_sensitive(ui.checkboxOverridefontsize->get_active()); ui.spinFontscale->set_sensitive(!ui.checkboxOverridefontsize->get_active()); ui.labelFontscale->set_sensitive(!ui.checkboxOverridefontsize->get_active()); updatePreview(); }); CONNECT(ui.spinOverridefontsize, value_changed, [this] { updatePreview(); }); CONNECT(ui.spinFontscale, value_changed, [this] { updatePreview(); }); CONNECT(ui.checkboxUniformlinespacing, toggled, [this] { ui.labelPreserve->set_sensitive(ui.checkboxUniformlinespacing->get_active()); ui.spinPreserve->set_sensitive(ui.checkboxUniformlinespacing->get_active()); ui.labelPreserve2->set_sensitive(ui.checkboxUniformlinespacing->get_active()); updatePreview(); }); CONNECT(ui.spinPreserve, value_changed, [this] { updatePreview(); }); CONNECT(ui.entryEncryptionPassword, changed, [this] { updateValid(); }); CONNECT(ui.entryEncryptionConfirm, changed, [this] { updateValid(); }); CONNECT(ui.checkboxPreview, toggled, [this] { updatePreview(); }); CONNECT(ui.comboPaperFormat, changed, [this] { paperSizeChanged(); }); CONNECT(ui.comboPaperSizeUnit, changed, [this] { paperSizeChanged(); }); m_connLandscape = CONNECT(ui.buttonLandscape, toggled, [this] { paperOrientationChanged(true); }); m_connPortrait = CONNECT(ui.buttonPortrait, toggled, [this] { paperOrientationChanged(false); }); CONNECT(ui.entryPaperWidth, changed, [this] { paperSizeChanged(); }); CONNECT(ui.entryPaperHeight, changed, [this] { paperSizeChanged(); }); CONNECT(ui.buttonImportFromSource, clicked, [this] { importMetadataFromSource(); }); ADD_SETTING(ComboSetting("pdfexportmode", ui.comboMode)); ADD_SETTING(SpinSetting("pdfimagecompressionquality", ui.spinQuality)); ADD_SETTING(ComboSetting("pdfimagecompression", ui.comboCompression)); ADD_SETTING(ComboSetting("pdfimageformat", ui.comboImageformat)); ADD_SETTING(ComboSetting("pdfimagedithering", ui.comboDithering)); ADD_SETTING(SpinSetting("pdfimagedpi", ui.spinDpi)); ADD_SETTING(SwitchSettingT("pdfoverridefontfamily", ui.checkboxOverridefontfamily)); ADD_SETTING(FontComboSetting("pdffontfamily", m_comboOverrideFont)); ADD_SETTING(FontComboSetting("pdffallbackfontfamily", m_comboFallbackFont)); ADD_SETTING(SwitchSettingT("pdfoverridefontsizes", ui.checkboxOverridefontsize)); ADD_SETTING(SpinSetting("pdffontsize", ui.spinOverridefontsize)); ADD_SETTING(SpinSetting("pdffontscale", ui.spinFontscale)); ADD_SETTING(SwitchSettingT("pdfuniformizelinespacing", ui.checkboxUniformlinespacing)); ADD_SETTING(SwitchSettingT("pdfsanitizehyphens", ui.checkboxSanitizeHyphens)); ADD_SETTING(SpinSetting("pdfpreservespaces", ui.spinPreserve)); ADD_SETTING(SwitchSettingT("pdfpreview", ui.checkboxPreview)); ADD_SETTING(ComboSetting("pdfexportpapersize", ui.comboPaperFormat)); ADD_SETTING(EntrySetting("pdfexportpaperwidth", ui.entryPaperWidth)); ADD_SETTING(EntrySetting("pdfexportpaperheight", ui.entryPaperHeight)); ADD_SETTING(ComboSetting("pdfexportpapersizeunit", ui.comboPaperSizeUnit)); ADD_SETTING(SwitchSettingT("pdfexportpaperlandscape", ui.buttonLandscape)); ADD_SETTING(EntrySetting("pdfexportinfoauthor", ui.entryMetadataAuthor)); ADD_SETTING(EntrySetting("pdfexportinfoproducer", ui.entryMetadataProducer)); ADD_SETTING(EntrySetting("pdfexportinfocreator", ui.entryMetadataCreator)); ADD_SETTING(ComboSetting("pdfexportpdfversion", ui.comboPdfVersion)); #if !defined(TESSERACT_VERSION) || TESSERACT_VERSION < TESSERACT_MAKE_VERSION(3,04,00) checkboxFontFamily->set_active(true); checkboxFontFamily->set_sensitive(true); checkboxFontSize->set_active(true); checkboxFontSize->set_sensitive(true); #endif } bool HOCRPdfExporter::run(std::string& filebasename) { m_preview = new DisplayerImageItem(); m_preview->setZIndex(2); updatePreview(); MAIN->getDisplayer()->addItem(m_preview); bool accepted = false; PDFPainter* painter = nullptr; int pageCount = m_hocrdocument->pageCount(); std::string outname; while(true) { accepted = ui.dialogPdfExport->run() == Gtk::RESPONSE_OK; ui.dialogPdfExport->hide(); if(!accepted) { break; } std::string suggestion = filebasename; if(suggestion.empty()) { std::vector sources = MAIN->getSourceManager()->getSelectedSources(); suggestion = !sources.empty() ? Utils::split_filename(sources.front()->displayname).first : _("output"); } while(true) { FileDialogs::FileFilter filter = {_("PDF Files"), {"application/pdf"}, {"*.pdf"}}; outname = FileDialogs::save_dialog(_("Save PDF Output..."), suggestion + ".pdf", "outputdir", filter); if(outname.empty()) { accepted = false; break; } if(m_hocrdocument->referencesSource(outname)) { Utils::message_dialog(Gtk::MESSAGE_ERROR, _("Invalid Output"), _("Cannot overwrite a file which is a source image of this document.")); continue; } break; } if(!accepted) { break; } filebasename = Utils::split_filename(outname).first; Glib::ustring defaultFont = ui.checkboxOverridefontfamily->get_active() ? m_comboOverrideFont->get_active_font() : m_comboFallbackFont->get_active_font(); double defaultFontSize = ui.checkboxOverridefontsize->get_active() ? ui.spinOverridefontsize->get_value() : 0; Glib::ustring errMsg; painter = createPoDoFoPrinter(outname, defaultFont, defaultFontSize, errMsg); if(!painter) { Utils::message_dialog(Gtk::MESSAGE_ERROR, _("Failed to create output"), Glib::ustring::compose(_("Failed to create output. The returned error was: %1"), errMsg)); continue; } break; } MAIN->getDisplayer()->removeItem(m_preview); delete m_preview; m_preview = nullptr; if(!accepted) { return false; } PDFSettings pdfSettings = getPdfSettings(); int outputDpi = ui.spinDpi->get_value(); std::string paperSize = (*ui.comboPaperFormat->get_active())[m_paperFormatComboCols.format]; double pageWidth, pageHeight; // Page dimensions are in points: 1 in = 72 pt if(paperSize == "custom") { pageWidth = std::atof(ui.entryPaperWidth->get_text().c_str()) * 72.0; pageHeight = std::atof(ui.entryPaperHeight->get_text().c_str()) * 72.0; PaperSize::Unit unit = static_cast(static_cast((*ui.comboPaperSizeUnit->get_active())[m_sizeUnitComboCols.unit])); if(unit == PaperSize::cm) { pageWidth /= PaperSize::CMtoInch; pageHeight /= PaperSize::CMtoInch; } } else if (paperSize != "source") { auto inchSize = PaperSize::getSize(PaperSize::inch, paperSize, ui.buttonLandscape->get_active()); pageWidth = inchSize.width * 72.0; pageHeight = inchSize.height * 72.0; } MainWindow::ProgressMonitor monitor(pageCount); MAIN->showProgress(&monitor); Glib::ustring errMsg; bool success = Utils::busyTask([&] { for(int i = 0; i < pageCount; ++i) { if(monitor.cancelled()) { errMsg = _("The operation was cancelled"); return false; } const HOCRPage* page = m_hocrdocument->page(i); if(page->isEnabled()) { Geometry::Rectangle bbox = page->bbox(); Glib::ustring sourceFile = page->sourceFile(); // If the source file is an image, its "resolution" is actually just the scale factor that was used for recognizing. bool isImage = Glib::ustring(sourceFile.substr(sourceFile.length() - 4)).lowercase() != ".pdf" && Glib::ustring(sourceFile.substr(sourceFile.length() - 5)).lowercase() != ".djvu"; int sourceDpi = page->resolution(); int sourceScale = sourceDpi; if(isImage) { sourceDpi *= ui.spinBoxPaperSizeDpi->get_value_as_int() / 100; } // [pt] = 72 * [in] // [in] = 1 / dpi * [px] // => [pt] = 72 / dpi * [px] double px2pt = (72.0 / sourceDpi); double imgScale = double(outputDpi) / sourceDpi; bool success = false; if(isImage) { Utils::runInMainThreadBlocking([&] { success = setSource(page->sourceFile(), page->pageNr(), sourceScale * imgScale, page->angle()); }); } else { Utils::runInMainThreadBlocking([&] { success = setSource(page->sourceFile(), page->pageNr(), outputDpi, page->angle()); }); } if(success) { double px2pt = (72.0 / sourceDpi); double imgScale = double(outputDpi) / sourceDpi; if(paperSize == "source") { pageWidth = bbox.width * px2pt; pageHeight = bbox.height * px2pt; } double offsetX = 0.5 * (pageWidth - bbox.width * px2pt); double offsetY = 0.5 * (pageHeight - bbox.height * px2pt); if(!painter->createPage(pageWidth, pageHeight, offsetX, offsetY, errMsg)) { return false; } printChildren(*painter, page, pdfSettings, px2pt, imgScale, double(sourceScale) / sourceDpi, true); if(pdfSettings.overlay) { Geometry::Rectangle scaledRect(imgScale * bbox.x, imgScale * bbox.y, imgScale * bbox.width, imgScale * bbox.height); Geometry::Rectangle printRect(bbox.x * px2pt, bbox.y * px2pt, bbox.width * px2pt, bbox.height * px2pt); Cairo::RefPtr selection; Utils::runInMainThreadBlocking([&] { selection = getSelection(scaledRect); }); painter->drawImage(printRect, selection, pdfSettings); } Utils::runInMainThreadBlocking([&] { setSource(page->sourceFile(), page->pageNr(), sourceScale, page->angle()); }); painter->finishPage(); } else { errMsg = Glib::ustring::compose(_("Failed to render page %1"), page->title()); return false; } } monitor.increaseProgress(); } return painter->finishDocument(errMsg); }, _("Exporting to PDF...")); MAIN->hideProgress(); bool openAfterExport = ConfigSettings::get>("openafterexport")->getValue(); if(!success) { Utils::message_dialog(Gtk::MESSAGE_WARNING, _("Export failed"), Glib::ustring::compose(_("The PDF export failed: %1."), errMsg)); } else if(openAfterExport) { Utils::openUri(Glib::filename_to_uri(outname)); } delete painter; return success; } HOCRPdfExporter::PDFPainter* HOCRPdfExporter::createPoDoFoPrinter(const std::string& filename, const Glib::ustring& defaultFont, double defaultFontSize, Glib::ustring& errMsg) { PoDoFo::PdfStreamedDocument* document = nullptr; PoDoFo::PdfFont* defaultPdfFont = nullptr; #if PODOFO_VERSION >= PODOFO_MAKE_VERSION(0,9,3) const PoDoFo::PdfEncoding* pdfFontEncoding = PoDoFo::PdfEncodingFactory::GlobalIdentityEncodingInstance(); #else PoDoFo::PdfEncoding* pdfFontEncoding = new PoDoFo::PdfIdentityEncoding; #endif try { Glib::ustring password = ui.entryEncryptionPassword->get_text(); PoDoFo::PdfEncrypt* encrypt = nullptr; if(!password.empty()) { encrypt = PoDoFo::PdfEncrypt::CreatePdfEncrypt(password, password, PoDoFo::PdfEncrypt::EPdfPermissions::ePdfPermissions_Print | PoDoFo::PdfEncrypt::EPdfPermissions::ePdfPermissions_Edit | PoDoFo::PdfEncrypt::EPdfPermissions::ePdfPermissions_Copy | PoDoFo::PdfEncrypt::EPdfPermissions::ePdfPermissions_EditNotes | PoDoFo::PdfEncrypt::EPdfPermissions::ePdfPermissions_FillAndSign | PoDoFo::PdfEncrypt::EPdfPermissions::ePdfPermissions_Accessible | PoDoFo::PdfEncrypt::EPdfPermissions::ePdfPermissions_DocAssembly | PoDoFo::PdfEncrypt::EPdfPermissions::ePdfPermissions_HighPrint, PoDoFo::PdfEncrypt::EPdfEncryptAlgorithm::ePdfEncryptAlgorithm_RC4V2); } PoDoFo::EPdfVersion pdfVersion = static_cast(static_cast((*ui.comboPdfVersion->get_active())[m_pdfVersionComboCols.version])); document = new PoDoFo::PdfStreamedDocument(filename.c_str(), pdfVersion, encrypt); } catch(PoDoFo::PdfError& err) { errMsg = err.what(); return nullptr; } Pango::FontDescription fontDesc = Pango::FontDescription(defaultFont); // Attempt to load the default/fallback font to ensure it is valid try { #if PODOFO_VERSION >= PODOFO_MAKE_VERSION(0,9,3) defaultPdfFont = document->CreateFontSubset(Utils::resolveFontName(fontDesc.get_family()).c_str(), false, false, false, pdfFontEncoding); #else defaultPdfFont = document->CreateFontSubset(Utils::resolveFontName(fontDesc.get_family()).c_str(), false, false, pdfFontEncoding); #endif } catch(PoDoFo::PdfError&) { } if(!defaultPdfFont) { errMsg = Glib::ustring::compose(_("The PDF library could not load the font '%1'."), defaultFont); return nullptr; } // Set PDF info PoDoFo::PdfInfo* pdfInfo = document->GetInfo(); pdfInfo->SetProducer(ui.entryMetadataProducer->get_text().c_str()); pdfInfo->SetCreator(ui.entryMetadataCreator->get_text().c_str()); pdfInfo->SetTitle(ui.entryMetadataTitle->get_text().c_str()); pdfInfo->SetSubject(ui.entryMetadataSubject->get_text().c_str()); pdfInfo->SetKeywords(ui.entryMetadataKeywords->get_text().c_str()); pdfInfo->SetAuthor(ui.entryMetadataAuthor->get_text().c_str()); return new PoDoFoPDFPainter(document, pdfFontEncoding, defaultPdfFont, defaultFont, defaultFontSize, m_fontFamilies); } HOCRPdfExporter::PDFSettings HOCRPdfExporter::getPdfSettings() const { PDFSettings pdfSettings; pdfSettings.colorFormat = (*ui.comboImageformat->get_active())[m_formatComboCols.format]; pdfSettings.conversionFlags = pdfSettings.colorFormat == Image::Format_Mono ? (*ui.comboDithering->get_active())[m_ditheringComboCols.conversionFlags] : Image::AutoColor; pdfSettings.compression = (*ui.comboCompression->get_active())[m_compressionComboCols.mode]; pdfSettings.compressionQuality = ui.spinQuality->get_value(); pdfSettings.fontFamily = ui.checkboxOverridefontfamily->get_active() ? m_comboOverrideFont->get_active_font() : ""; pdfSettings.fontSize = ui.checkboxOverridefontsize->get_active() ? ui.spinOverridefontsize->get_value() : -1; pdfSettings.uniformizeLineSpacing = ui.checkboxUniformlinespacing->get_active(); pdfSettings.preserveSpaceWidth = ui.spinPreserve->get_value(); pdfSettings.overlay = ui.comboMode->get_active_row_number() == 1; pdfSettings.detectedFontScaling = ui.spinFontscale->get_value() / 100.; pdfSettings.sanitizeHyphens = ui.checkboxSanitizeHyphens->get_active(); return pdfSettings; } void HOCRPdfExporter::printChildren(PDFPainter& painter, const HOCRItem* item, const PDFSettings& pdfSettings, double px2pu/*pixels to printer units*/, double imgScale, double fontScale, bool inThread) { if(!item->isEnabled()) { return; } if(pdfSettings.fontSize != -1) { painter.setFontSize(pdfSettings.fontSize * fontScale); } Glib::ustring itemClass = item->itemClass(); Geometry::Rectangle itemRect = item->bbox(); int childCount = item->children().size(); if(itemClass == "ocr_par" && pdfSettings.uniformizeLineSpacing) { double yInc = double(itemRect.height) / childCount; double y = itemRect.y + yInc; std::pair baseline = childCount > 0 ? item->children()[0]->baseLine() : std::make_pair(0.0, 0.0); for(int iLine = 0; iLine < childCount; ++iLine, y += yInc) { HOCRItem* lineItem = item->children()[iLine]; int x = itemRect.x; int prevWordRight = itemRect.x; for(int iWord = 0, nWords = lineItem->children().size(); iWord < nWords; ++iWord) { HOCRItem* wordItem = lineItem->children()[iWord]; if(!wordItem->isEnabled()) { continue; } Geometry::Rectangle wordRect = wordItem->bbox(); painter.setFontFamily(pdfSettings.fontFamily.empty() ? wordItem->fontFamily() : pdfSettings.fontFamily, wordItem->fontBold(), wordItem->fontItalic()); if(pdfSettings.fontSize == -1) { painter.setFontSize(wordItem->fontSize() * pdfSettings.detectedFontScaling * fontScale); } // If distance from previous word is large, keep the space if(wordRect.x - prevWordRight > pdfSettings.preserveSpaceWidth * painter.getAverageCharWidth() / px2pu) { x = wordRect.x; } prevWordRight = wordRect.x + wordRect.width; Glib::ustring text = wordItem->text(); if(iWord == nWords - 1 && pdfSettings.sanitizeHyphens) { text = Glib::Regex::create("[-\u2014]\\s*$")->replace(text, 0, "-", static_cast(0)); } double wordBaseline = (x - itemRect.x) * baseline.first + baseline.second; painter.drawText(x * px2pu, (y + wordBaseline) * px2pu, text); x += painter.getTextWidth(text + " ") / px2pu; } } } else if(itemClass == "ocr_line" && !pdfSettings.uniformizeLineSpacing) { std::pair baseline = item->baseLine(); for(int iWord = 0, nWords = item->children().size(); iWord < nWords; ++iWord) { HOCRItem* wordItem = item->children()[iWord]; if(!wordItem->isEnabled()) { continue; } Geometry::Rectangle wordRect = wordItem->bbox(); painter.setFontFamily(pdfSettings.fontFamily.empty() ? wordItem->fontFamily() : pdfSettings.fontFamily, wordItem->fontBold(), wordItem->fontItalic()); if(pdfSettings.fontSize == -1) { painter.setFontSize(wordItem->fontSize() * pdfSettings.detectedFontScaling * fontScale); } double y = itemRect.y + itemRect.height + (wordRect.x + 0.5 * wordRect.width - itemRect.x) * baseline.first + baseline.second; Glib::ustring text = wordItem->text(); if(iWord == nWords - 1 && pdfSettings.sanitizeHyphens) { text = Glib::Regex::create("[-\u2014]\\s*$")->replace(text, 0, "-", static_cast(0)); } painter.drawText(wordRect.x * px2pu, y * px2pu, text); } } else if(itemClass == "ocr_graphic" && !pdfSettings.overlay) { Geometry::Rectangle scaledItemRect(imgScale * itemRect.x, imgScale * itemRect.y, imgScale * itemRect.width, imgScale * itemRect.height); Geometry::Rectangle printRect(itemRect.x * px2pu, itemRect.y * px2pu, itemRect.width * px2pu, itemRect.height * px2pu); Cairo::RefPtr selection; if(inThread) { Utils::runInMainThreadBlocking([&] { selection = getSelection(scaledItemRect); }); } else { selection = getSelection(scaledItemRect); } painter.drawImage(printRect, selection, pdfSettings); } else { for(int i = 0, n = item->children().size(); i < n; ++i) { printChildren(painter, item->children()[i], pdfSettings, px2pu, imgScale, fontScale, inThread); } } } void HOCRPdfExporter::updatePreview() { if(!m_preview) { return; } m_preview->setVisible(ui.checkboxPreview->get_active()); if(m_hocrdocument->pageCount() == 0 || !ui.checkboxPreview->get_active()) { return; } const HOCRPage* page = m_previewPage; Geometry::Rectangle bbox = page->bbox(); int pageDpi = page->resolution(); PDFSettings pdfSettings = getPdfSettings(); pdfSettings.detectedFontScaling *= (pageDpi / 72.); pdfSettings.fontSize *= (pageDpi / 72.); Glib::ustring defaultFont = ui.checkboxOverridefontfamily->get_active() ? m_comboOverrideFont->get_active_font() : m_comboFallbackFont->get_active_font(); Cairo::RefPtr image = Cairo::ImageSurface::create(Cairo::FORMAT_ARGB32, bbox.width, bbox.height); Cairo::RefPtr context = Cairo::Context::create(image); CairoPDFPainter pdfPrinter(context, defaultFont, m_fontFamilies); if(!pdfSettings.fontFamily.empty()) { pdfPrinter.setFontFamily(pdfSettings.fontFamily, false, false); } if(pdfSettings.fontSize != -1) { pdfPrinter.setFontSize(pdfSettings.fontSize * pageDpi / 72.); } if(pdfSettings.overlay) { pdfPrinter.drawImage(bbox, m_displayerTool->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(pdfPrinter, page, pdfSettings, 1.); 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())); } void HOCRPdfExporter::imageFormatChanged() { Image::Format format = (*ui.comboImageformat->get_active())[m_formatComboCols.format]; Glib::RefPtr compressionStore = Glib::RefPtr::cast_static(ui.comboCompression->get_model()); bool isMono = format == Image::Format_Mono; if(isMono && (*ui.comboCompression->get_active())[m_compressionComboCols.mode] == PDFSettings::CompressJpeg) { ui.comboCompression->set_active(PDFSettings::CompressZip); } else if(!isMono && (*ui.comboCompression->get_active())[m_compressionComboCols.mode] == PDFSettings::CompressFax4) { ui.comboCompression->set_active(PDFSettings::CompressZip); } (*compressionStore->children()[PDFSettings::CompressFax4])[m_compressionComboCols.sensitive] = isMono; (*compressionStore->children()[PDFSettings::CompressJpeg])[m_compressionComboCols.sensitive] = !isMono; ui.labelDithering->set_sensitive(isMono); ui.comboDithering->set_sensitive(isMono); } void HOCRPdfExporter::imageCompressionChanged() { PDFSettings::Compression compression = (*ui.comboCompression->get_active())[m_compressionComboCols.mode]; bool jpegCompression = compression == PDFSettings::CompressJpeg; ui.spinQuality->set_sensitive(jpegCompression); ui.labelQuality->set_sensitive(jpegCompression); } bool HOCRPdfExporter::setSource(const Glib::ustring& sourceFile, int page, int dpi, double angle) { Glib::RefPtr file = Gio::File::create_for_path(sourceFile); if(MAIN->getSourceManager()->addSource(file, true)) { MAIN->getDisplayer()->setup(&page, &dpi, &angle); return true; } else { return false; } } Cairo::RefPtr HOCRPdfExporter::getSelection(const Geometry::Rectangle& bbox) { return m_displayerTool->getSelection(bbox); } void HOCRPdfExporter::paperOrientationChanged(bool landscape) { m_connPortrait.block(true); m_connLandscape.block(true); ui.buttonPortrait->set_active(!landscape); ui.buttonLandscape->set_active(landscape); m_connPortrait.block(false); m_connLandscape.block(false); paperSizeChanged(); } void HOCRPdfExporter::paperSizeChanged() { std::string paperSize = (*ui.comboPaperFormat->get_active())[m_paperFormatComboCols.format]; if(paperSize == "custom") { ui.entryPaperWidth->set_sensitive(true); ui.entryPaperHeight->set_sensitive(true); ui.boxPaperSize->set_visible(true); ui.boxPaperOrientation->set_visible(false); ui.boxPaperSizeDpi->set_visible(false); } else if(paperSize == "source") { ui.entryPaperWidth->set_sensitive(true); ui.entryPaperHeight->set_sensitive(true); ui.boxPaperSize->set_visible(false); ui.boxPaperOrientation->set_visible(false); ui.boxPaperSizeDpi->set_visible(true); } else { ui.boxPaperSize->set_visible(true); ui.boxPaperOrientation->set_visible(true); ui.boxPaperSizeDpi->set_visible(false); ui.entryPaperWidth->set_sensitive(false); ui.entryPaperHeight->set_sensitive(false); PaperSize::Unit unit = static_cast(static_cast((*ui.comboPaperSizeUnit->get_active())[m_sizeUnitComboCols.unit])); auto outputPaperSize = PaperSize::getSize(unit, paperSize, ui.buttonLandscape->get_active()); ui.entryPaperWidth->set_text(Glib::ustring::format(std::fixed, std::setprecision(1), outputPaperSize.width)); ui.entryPaperHeight->set_text(Glib::ustring::format(std::fixed, std::setprecision(1), outputPaperSize.height)); } updateValid(); } void HOCRPdfExporter::updateValid() { bool valid = true; // Passwords must match if(ui.entryEncryptionPassword->get_text() == ui.entryEncryptionConfirm->get_text()) { Utils::clear_error_state(ui.entryEncryptionConfirm); } else { Utils::set_error_state(ui.entryEncryptionConfirm); valid = false; } // In custom paper size mode, size must be specified std::string paperSize = (*ui.comboPaperFormat->get_active())[m_paperFormatComboCols.format]; Utils::clear_error_state(ui.entryPaperWidth); Utils::clear_error_state(ui.entryPaperHeight); if(paperSize == "custom") { if(ui.entryPaperWidth->get_text().empty()) { Utils::set_error_state(ui.entryPaperWidth); valid = false; } if(ui.entryPaperHeight->get_text().empty()) { Utils::set_error_state(ui.entryPaperHeight); valid = false; } } ui.buttonOk->set_sensitive(valid); } void HOCRPdfExporter::importMetadataFromSource() { std::vector sources = MAIN->getSourceManager()->getSelectedSources(); if(!sources.empty()) { Source* source = sources.front(); ui.entryMetadataAuthor->set_text(source->author); ui.entryMetadataCreator->set_text(source->creator); ui.entryMetadataKeywords->set_text(source->keywords); ui.entryMetadataTitle->set_text(source->title); ui.entryMetadataSubject->set_text(source->subject); ui.entryMetadataProducer->set_text(source->producer); PoDoFo::EPdfVersion sourcePdfVersion = PoDoFo::EPdfVersion::ePdfVersion_1_7; if(source->pdfVersionMajor == 1 && source->pdfVersionMinor <= 7) { sourcePdfVersion = static_cast(PoDoFo::EPdfVersion::ePdfVersion_1_0 + source->pdfVersionMinor); } ui.comboPdfVersion->set_active(sourcePdfVersion); } } gImageReader-3.3.1/gtk/src/hocr/HOCRPdfExporter.hh000066400000000000000000000121751351740627400216170ustar00rootroot00000000000000/* -*- Mode: C++; indent-tabs-mode: t; c-basic-offset: 4; tab-width: 4 -*- */ /* * HOCRPdfExporter.hh * Copyright (C) 2013-2019 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 HOCRPDFEXPORTER_HH #define HOCRPDFEXPORTER_HH #include "common.hh" #include "Image.hh" #include "ui_PdfExportDialog.hh" class DisplayerImageItem; class DisplayerToolHOCR; class FontComboBox; namespace Geometry { class Rectangle; } class HOCRDocument; class HOCRPage; class HOCRItem; class HOCRPdfExporter { public: HOCRPdfExporter(const Glib::RefPtr& hocrdocument, const HOCRPage* previewPage, DisplayerToolHOCR* displayerTool); bool run(std::string& filebasename); private: struct PDFSettings { Image::Format colorFormat; Image::ConversionFlags conversionFlags; enum Compression { CompressZip, CompressFax4, CompressJpeg } compression; int compressionQuality; Glib::ustring fontFamily; int fontSize; bool uniformizeLineSpacing; int preserveSpaceWidth; bool overlay; double detectedFontScaling; bool sanitizeHyphens; }; class PDFPainter { public: virtual ~PDFPainter() {} virtual void setFontFamily(const Glib::ustring& family, bool bold, bool italic) = 0; 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; virtual bool createPage(double /*width*/, double /*height*/, double /*offsetX*/, double /*offsetY*/, Glib::ustring& /*errMsg*/) { return true; } virtual void finishPage() {} virtual bool finishDocument(Glib::ustring& /*errMsg*/) { return true; } }; class PoDoFoPDFPainter; class CairoPDFPainter; struct PaperFormatComboColums : public Gtk::TreeModel::ColumnRecord { Gtk::TreeModelColumn label; Gtk::TreeModelColumn format; PaperFormatComboColums() { add(label); add(format); } } m_paperFormatComboCols; struct SizeUnitComboColums : public Gtk::TreeModel::ColumnRecord { Gtk::TreeModelColumn label; Gtk::TreeModelColumn unit; SizeUnitComboColums() { add(label); add(unit); } } m_sizeUnitComboCols; 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; struct PdfVersionComboCols : public Gtk::TreeModel::ColumnRecord { Gtk::TreeModelColumn label; Gtk::TreeModelColumn version; PdfVersionComboCols() { add(label); add(version); } } m_pdfVersionComboCols; Ui::PdfExportDialog ui; ClassData m_classdata; FontComboBox* m_comboOverrideFont; FontComboBox* m_comboFallbackFont; DisplayerImageItem* m_preview = nullptr; Glib::RefPtr m_hocrdocument; const HOCRPage* m_previewPage; DisplayerToolHOCR* m_displayerTool; std::vector m_fontFamilies; sigc::connection m_connPortrait; sigc::connection m_connLandscape; PDFSettings getPdfSettings() const; PDFPainter* createPoDoFoPrinter(const std::string& filename, const Glib::ustring& defaultFont, double defaultFontSize, Glib::ustring& errMsg); void printChildren(PDFPainter& painter, const HOCRItem* item, const PDFSettings& pdfSettings, double px2pu, double imgScale = 1., double fontScale = 1., bool inThread = false); void importMetadataFromSource(); void imageFormatChanged(); void imageCompressionChanged(); void paperOrientationChanged(bool landscape); void paperSizeChanged(); void updatePreview(); void updateValid(); bool setSource(const Glib::ustring& sourceFile, int page, int dpi, double angle); Cairo::RefPtr getSelection(const Geometry::Rectangle& bbox); }; #endif // HOCRPDFEXPORTER_HH gImageReader-3.3.1/gtk/src/hocr/HOCRTextExporter.cc000066400000000000000000000053611351740627400220170ustar00rootroot00000000000000/* -*- Mode: C++; indent-tabs-mode: t; c-basic-offset: 4; tab-width: 4 -*- */ /* * HOCRTextExporter.cc * Copyright (C) 2013-2019 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 "HOCRDocument.hh" #include "HOCRTextExporter.hh" #include "MainWindow.hh" #include "FileDialogs.hh" #include "SourceManager.hh" #include "Utils.hh" #include bool HOCRTextExporter::run(const Glib::RefPtr& hocrdocument, std::string& filebasename) { std::string suggestion = filebasename; if(suggestion.empty()) { std::vector sources = MAIN->getSourceManager()->getSelectedSources(); suggestion = !sources.empty() ? Utils::split_filename(sources.front()->displayname).first : _("output"); } FileDialogs::FileFilter filter = {_("Text Files"), {"text/plain"}, {"*.txt"}}; std::string outname = FileDialogs::save_dialog(_("Save Text Output..."), suggestion + ".txt", "outputdir", filter); if(outname.empty()) { return false; } filebasename = Utils::split_filename(outname).first; std::ofstream file(outname); if(!file.is_open()) { Utils::message_dialog(Gtk::MESSAGE_ERROR, _("Export failed"), _("The text export failed: unable to write output file.")); return false; } for(int i = 0, n = hocrdocument->pageCount(); i < n; ++i) { const HOCRPage* page = hocrdocument->page(i); if(!page->isEnabled()) { continue; } printItem(file, page); } file.close(); bool openAfterExport = ConfigSettings::get>("openafterexport")->getValue(); if(openAfterExport) { Utils::openUri(Glib::filename_to_uri(outname)); } return true; } void HOCRTextExporter::printItem(std::ofstream& outputStream, const HOCRItem* item, bool lastChild) { if(!item->isEnabled()) { return; } Glib::ustring itemClass = item->itemClass(); if(itemClass == "ocrx_word") { outputStream << item->text(); if(!lastChild) { outputStream << " "; } } else { for(int i = 0, n = item->children().size(); i < n; ++i) { printItem(outputStream, item->children()[i], i == n - 1); } } if(itemClass == "ocr_line" || itemClass == "ocr_par") { outputStream << "\n"; } } gImageReader-3.3.1/gtk/src/hocr/HOCRTextExporter.hh000066400000000000000000000022731351740627400220300ustar00rootroot00000000000000/* -*- Mode: C++; indent-tabs-mode: t; c-basic-offset: 4; tab-width: 4 -*- */ /* * HOCRTextExporter.hh * Copyright (C) 2013-2019 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 HOCRTEXTEXPORTER_HH #define HOCRTEXTEXPORTER_HH #include "common.hh" class HOCRDocument; class HOCRItem; class QTextStream; class HOCRTextExporter { public: bool run(const Glib::RefPtr& hocrdocument, std::string& filebasename); private: void printItem(std::ofstream& outputStream, const HOCRItem* item, bool lastChild = false); }; #endif // HOCRTEXTEXPORTER_HH gImageReader-3.3.1/gtk/src/hocr/OutputEditorHOCR.cc000066400000000000000000001502751351740627400220160ustar00rootroot00000000000000/* -*- Mode: C++; indent-tabs-mode: t; c-basic-offset: 4; tab-width: 4 -*- */ /* * OutputEditorHOCR.cc * Copyright (C) 2013-2019 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 #define USE_STD_NAMESPACE #include #include #undef USE_STD_NAMESPACE #include #include "ConfigSettings.hh" #include "DisplayerToolHOCR.hh" #include "FileDialogs.hh" #include "HOCRDocument.hh" #include "HOCROdtExporter.hh" #include "HOCRPdfExporter.hh" #include "HOCRTextExporter.hh" #include "MainWindow.hh" #include "OutputEditorHOCR.hh" #include "Recognizer.hh" #include "SearchReplaceFrame.hh" #include "SourceManager.hh" #include "Utils.hh" #include "XmlUtils.hh" class OutputEditorHOCR::HOCRCellRendererText : public Gtk::CellRendererText { public: HOCRCellRendererText() : Glib::ObjectBase("CellRendererTextHOCR") {} Gtk::Entry* get_entry() const { return m_entry; } const Glib::ustring& get_current_path() const { return m_path; } protected: Gtk::Entry* m_entry = nullptr; Glib::ustring m_path; Gtk::CellEditable* start_editing_vfunc(GdkEvent* /*event*/, Gtk::Widget& /*widget*/, const Glib::ustring& path, const Gdk::Rectangle& /*background_area*/, const Gdk::Rectangle& /*cell_area*/, Gtk::CellRendererState /*flags*/) override { if(!property_editable()) { return nullptr; } m_entry = new Gtk::Entry; m_entry->set_text(property_text()); m_entry->set_has_frame(false); m_entry->signal_editing_done().connect([ = ] { if(!m_entry->property_editing_canceled()) { edited(path, m_entry->get_text()); } m_entry = nullptr; m_path.clear(); }); m_entry->show(); m_path = path; return Gtk::manage(m_entry); } }; class OutputEditorHOCR::HOCRAttribRenderer : public Gtk::CellRendererText { public: HOCRAttribRenderer(Glib::RefPtr propStore, const OutputEditorHOCR::PropStoreColumns& cols) : Glib::ObjectBase("HOCRAttribRenderer"), m_propStore(propStore), m_cols(cols) {} protected: Glib::RefPtr m_propStore; const OutputEditorHOCR::PropStoreColumns& m_cols; Gtk::CellEditable* start_editing_vfunc(GdkEvent* /*event*/, Gtk::Widget& /*widget*/, const Glib::ustring& path, const Gdk::Rectangle& /*background_area*/, const Gdk::Rectangle& /*cell_area*/, Gtk::CellRendererState /*flags*/) override { if(!property_editable()) { return nullptr; } Gtk::TreeIter it = m_propStore->get_iter(path); if(it && (*it)[m_cols.attr] == "title:x_font") { FontComboBox* combo = new FontComboBox(); Glib::ustring curFont = property_text(); combo->set_active_font(property_text()); combo->signal_editing_done().connect([ = ] { Glib::ustring newFont = combo->get_active_font(); if(!combo->property_editing_canceled() && newFont != curFont) { edited(path, combo->get_active_font()); } }); combo->show(); return Gtk::manage(combo); } else if(it && ((*it)[m_cols.attr] == "bold" || (*it)[m_cols.attr] == "italic")) { Gtk::ComboBoxText* combo = new Gtk::ComboBoxText(); combo->insert(0, "no", "no"); combo->insert(1, "yes", "yes"); if((*it)[m_cols.multiple] == true) { combo->set_active(-1); } else { combo->set_active_id((*it)[m_cols.value]); } combo->signal_editing_done().connect([ = ] { edited(path, combo->get_active_id()); }); combo->show(); return Gtk::manage(combo); } else { Gtk::Entry* entry = new Gtk::Entry; entry->set_text(property_text()); entry->set_has_frame(false); entry->signal_editing_done().connect([ = ] { if(!entry->property_editing_canceled()) { edited(path, entry->get_text()); } }); entry->show(); return Gtk::manage(entry); } } }; class OutputEditorHOCR::HOCRTreeView : public Gtk::TreeView { public: HOCRTreeView(BaseObjectType* cobject, const Glib::RefPtr& /*builder*/) : Gtk::TreeView(cobject) { CONNECT(get_selection(), changed, [this] { Gtk::TreeIter oldIndex = m_currentIndex; m_currentIndex = currentIndex(); m_signal_current_index_changed(m_currentIndex, oldIndex); }); } sigc::signal signal_current_index_changed() { return m_signal_current_index_changed; } sigc::signal signal_context_menu() { return m_signal_context_menu; } sigc::signal signal_delete() { return m_signal_delete; } Gtk::TreeIter currentIndex() { std::vector items = get_selection()->get_selected_rows(); if(!items.empty()) { return get_model()->get_iter(items[0]); } return Gtk::TreeIter(); } Gtk::TreeIter indexAtPos(int evx, int evy) { Gtk::TreePath path; Gtk::TreeViewColumn* col; int cell_x, cell_y; get_path_at_pos(evx, evy, path, col, cell_x, cell_y); if(!path) { return Gtk::TreeIter(); } return get_model()->get_iter(path); } 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; } bool on_key_press_event(GdkEventKey* key_event) { if(key_event->keyval == GDK_KEY_Delete) { m_signal_delete.emit(); return true; } return Gtk::TreeView::on_key_press_event(key_event); } private: ClassData m_classdata; Gtk::TreeIter m_currentIndex; sigc::signal m_signal_current_index_changed; sigc::signal m_signal_context_menu; sigc::signal m_signal_delete; }; /////////////////////////////////////////////////////////////////////////////// OutputEditorHOCR::OutputEditorHOCR(DisplayerToolHOCR* tool) { ui.builder->get_widget_derived("treeviewItems", m_treeView); ui.setupUi(); ui.dialogAddWord->set_transient_for(*MAIN->getWindow()); m_preview = new DisplayerImageItem(); m_preview->setZIndex(2); MAIN->getDisplayer()->addItem(m_preview); m_tool = tool; m_document = Glib::RefPtr(new HOCRDocument(&m_spell)); // HOCR tree view m_treeView->set_model(m_document); m_treeView->get_selection()->set_mode(Gtk::SELECTION_MULTIPLE); // First column: [checkbox][icon][text] m_treeViewTextCell = Gtk::manage(new HOCRCellRendererText); Gtk::TreeViewColumn* itemViewCol1 = Gtk::manage(new Gtk::TreeViewColumn("")); Gtk::CellRendererToggle& checkRenderer = *Gtk::manage(new Gtk::CellRendererToggle); Gtk::CellRendererPixbuf& iconRenderer = *Gtk::manage(new Gtk::CellRendererPixbuf); Gtk::CellRendererText& textRenderer = *m_treeViewTextCell; itemViewCol1->pack_start(checkRenderer, false); itemViewCol1->pack_start(iconRenderer, false); itemViewCol1->pack_start(textRenderer, true); itemViewCol1->add_attribute(checkRenderer, "active", HOCRDocument::COLUMN_CHECKED); itemViewCol1->add_attribute(iconRenderer, "pixbuf", HOCRDocument::COLUMN_ICON); itemViewCol1->add_attribute(textRenderer, "text", HOCRDocument::COLUMN_TEXT); itemViewCol1->add_attribute(textRenderer, "editable", HOCRDocument::COLUMN_EDITABLE); itemViewCol1->add_attribute(textRenderer, "foreground", HOCRDocument::COLUMN_TEXT_COLOR); CONNECT(&checkRenderer, toggled, [this](const Glib::ustring & path) { Gtk::TreeIter it = m_document->get_iter(path); bool prev; it->get_value(HOCRDocument::COLUMN_CHECKED, prev); it->set_value(HOCRDocument::COLUMN_CHECKED, !prev); }); CONNECT(&textRenderer, edited, [this](const Glib::ustring & path, const Glib::ustring & text) { m_document->get_iter(path)->set_value(HOCRDocument::COLUMN_TEXT, text); }); m_treeView->append_column(*itemViewCol1); m_treeView->set_expander_column(*itemViewCol1); // Second column: wconf, hidden by default Gtk::TreeViewColumn* itemViewCol2 = Gtk::manage(new Gtk::TreeViewColumn("")); Gtk::CellRendererText& wconfRenderer = *Gtk::manage(new Gtk::CellRendererText); itemViewCol2->pack_start(wconfRenderer, true); itemViewCol2->add_attribute(wconfRenderer, "text", HOCRDocument::COLUMN_WCONF); m_treeView->append_column(*itemViewCol2); itemViewCol2->set_visible(false); itemViewCol2->set_fixed_width(32); // Navigation target combo box Glib::RefPtr navigationComboModel = Gtk::ListStore::create(m_navigationComboCols); ui.comboNavigation->set_model(navigationComboModel); Gtk::TreeRow row = *(navigationComboModel->append()); row[m_navigationComboCols.label] = _("Page"); row[m_navigationComboCols.itemClass] = "ocr_page"; row = *(navigationComboModel->append()); row[m_navigationComboCols.label] = _("Block"); row[m_navigationComboCols.itemClass] = "ocr_carea"; row = *(navigationComboModel->append()); row[m_navigationComboCols.label] = _("Paragraph"); row[m_navigationComboCols.itemClass] = "ocr_par"; row = *(navigationComboModel->append()); row[m_navigationComboCols.label] = _("Line"); row[m_navigationComboCols.itemClass] = "ocr_line"; row = *(navigationComboModel->append()); row[m_navigationComboCols.label] = _("Word"); row[m_navigationComboCols.itemClass] = "ocrx_word"; row = *(navigationComboModel->append()); row[m_navigationComboCols.label] = _("Misspelled word"); row[m_navigationComboCols.itemClass] = "ocrx_word_bad"; ui.comboNavigation->pack_start(m_navigationComboCols.label); ui.comboNavigation->set_active(0); // HOCR item property table m_propStore = Gtk::TreeStore::create(m_propStoreCols); ui.treeviewProperties->set_model(m_propStore); // First column: attrib name Gtk::TreeViewColumn* nameCol = Gtk::manage(new Gtk::TreeViewColumn("")); Gtk::CellRendererText& nameRenderer = *Gtk::manage(new Gtk::CellRendererText()); nameRenderer.property_ellipsize() = Pango::ELLIPSIZE_END; nameRenderer.property_editable() = false; nameCol->pack_start(nameRenderer); nameCol->add_attribute(nameRenderer, "text", m_propStoreCols.name); nameCol->add_attribute(nameRenderer, "background", m_propStoreCols.background); nameCol->add_attribute(nameRenderer, "weight", m_propStoreCols.weight); nameCol->set_sizing(Gtk::TREE_VIEW_COLUMN_FIXED); nameCol->set_expand(true); ui.treeviewProperties->append_column(*nameCol); // Second column: attrib value Gtk::TreeViewColumn* valueCol = Gtk::manage(new Gtk::TreeViewColumn("")); Gtk::CellRendererText& valueRenderer = *Gtk::manage(new HOCRAttribRenderer(m_propStore, m_propStoreCols)); valueRenderer.property_ellipsize() = Pango::ELLIPSIZE_END; valueCol->pack_start(valueRenderer); valueCol->add_attribute(valueRenderer, "text", m_propStoreCols.value); valueCol->add_attribute(valueRenderer, "placeholder_text", m_propStoreCols.placeholder); valueCol->add_attribute(valueRenderer, "editable", m_propStoreCols.editable); valueCol->add_attribute(valueRenderer, "background", m_propStoreCols.background); valueCol->add_attribute(valueRenderer, "weight", m_propStoreCols.weight); valueCol->set_sizing(Gtk::TREE_VIEW_COLUMN_FIXED); valueCol->set_expand(true); CONNECT(&valueRenderer, edited, sigc::mem_fun(this, &OutputEditorHOCR::editAttribute)); ui.treeviewProperties->append_column(*valueCol); // HOCR item source view Glib::RefPtr buffer = Gsv::Buffer::create(); buffer->set_highlight_syntax(true); buffer->set_language(Gsv::LanguageManager::get_default()->get_language("xml")); ui.textviewSource->set_buffer(buffer); // Search replace frame m_searchFrame = new SearchReplaceFrame(); ui.boxSearch->pack_start(*Gtk::manage(m_searchFrame->getWidget())); m_searchFrame->getWidget()->set_visible(false); Glib::RefPtr group = MAIN->getWindow()->get_accel_group(); ui.buttonSave->add_accelerator("clicked", group, GDK_KEY_S, Gdk::CONTROL_MASK, Gtk::AccelFlags(0)); ui.buttonFindreplace->add_accelerator("clicked", group, GDK_KEY_F, Gdk::CONTROL_MASK, Gtk::AccelFlags(0)); ui.buttonNavigationNext->add_accelerator("clicked", group, GDK_KEY_F3, Gdk::ModifierType(0), Gtk::AccelFlags(0)); ui.buttonNavigationPrev->add_accelerator("clicked", group, GDK_KEY_F3, Gdk::SHIFT_MASK, Gtk::AccelFlags(0)); ui.buttonSave->set_sensitive(false); ui.buttonExport->set_sensitive(false); CONNECT(ui.buttonOpen, clicked, [this] { open(); }); CONNECT(ui.buttonSave, clicked, [this] { save(); }); CONNECT(ui.menuitemExportText, activate, [this] { exportToText(); }); CONNECT(ui.menuitemExportPdf, activate, [this] { exportToPDF(); }); CONNECT(ui.menuitemExportOdt, activate, [this] { exportToODT(); }); CONNECT(ui.buttonClear, clicked, [this] { clear(); }); CONNECT(ui.buttonFindreplace, toggled, [this] { m_searchFrame->clear(); m_searchFrame->getWidget()->set_visible(ui.buttonFindreplace->get_active()); }); CONNECT(ui.buttonWconf, toggled, [this] { m_treeView->get_column(1)->set_visible(ui.buttonWconf->get_active());}); CONNECT(ui.buttonPreview, toggled, [this] { updatePreview(); }); CONNECT(m_treeView, context_menu, [this](GdkEventButton * ev) { showTreeWidgetContextMenu(ev); }); CONNECT(m_treeView, delete, [this] { m_document->removeItem(m_treeView->currentIndex()); }); CONNECT(m_searchFrame, find_replace, sigc::mem_fun(this, &OutputEditorHOCR::findReplace)); CONNECT(m_searchFrame, replace_all, sigc::mem_fun(this, &OutputEditorHOCR::replaceAll)); CONNECT(m_searchFrame, apply_substitutions, sigc::mem_fun(this, &OutputEditorHOCR::applySubstitutions)); m_connectionCustomFont = CONNECT(ConfigSettings::get("customoutputfont"), changed, [this] { setFont(); }); m_connectionDefaultFont = CONNECT(ConfigSettings::get("systemoutputfont"), changed, [this] { setFont(); }); m_connectionSelectionChanged = CONNECT(m_treeView, current_index_changed, sigc::mem_fun(this, &OutputEditorHOCR::showItemProperties)); CONNECT(ui.notebook, switch_page, [this](Gtk::Widget*, guint) { updateSourceText(); }); CONNECT(m_tool, bbox_changed, sigc::mem_fun(this, &OutputEditorHOCR::updateCurrentItemBBox)); CONNECT(m_tool, bbox_drawn, sigc::mem_fun(this, &OutputEditorHOCR::bboxDrawn)); CONNECT(m_tool, position_picked, sigc::mem_fun(this, &OutputEditorHOCR::pickItem)); CONNECTX(m_document, row_inserted, [this](const Gtk::TreePath&, const Gtk::TreeIter&) { setModified(); }); CONNECTX(m_document, row_deleted, [this](const Gtk::TreePath&) { setModified(); }); CONNECTX(m_document, row_changed, [this](const Gtk::TreePath&, const Gtk::TreeIter&) { setModified(); updateSourceText(); }); CONNECTX(m_document, item_attribute_changed, [this](const Gtk::TreeIter&, const Glib::ustring&, const Glib::ustring&) { setModified(); }); CONNECTX(m_document, item_attribute_changed, [this](const Gtk::TreeIter & it, const Glib::ustring & attr, const Glib::ustring & value) { updateAttributes(it, attr, value); updateSourceText(); }); CONNECT(ui.comboNavigation, changed, [this] { navigateTargetChanged(); }); CONNECT(ui.buttonNavigationNext, clicked, [this] { navigateNextPrev(true); }); CONNECT(ui.buttonNavigationPrev, clicked, [this] { navigateNextPrev(false); }); CONNECT(ui.buttonExpandAll, clicked, [this] { expandCollapseItemClass(true); }); CONNECT(ui.buttonCollapseAll, clicked, [this] { expandCollapseItemClass(false); }); setFont(); } OutputEditorHOCR::~OutputEditorHOCR() { MAIN->getDisplayer()->removeItem(m_preview); delete m_preview; delete m_searchFrame; m_connectionCustomFont.disconnect(); m_connectionDefaultFont.disconnect(); } void OutputEditorHOCR::setFont() { if(ConfigSettings::get("systemoutputfont")->getValue()) { ui.textviewSource->unset_font(); } else { Glib::ustring fontName = ConfigSettings::get("customoutputfont")->getValue(); ui.textviewSource->override_font(Pango::FontDescription(fontName)); } } void OutputEditorHOCR::setModified() { ui.buttonSave->set_sensitive(m_document->pageCount() > 0); ui.buttonExport->set_sensitive(m_document->pageCount() > 0); ui.boxNavigation->set_sensitive(m_document->pageCount() > 0); m_preview->setVisible(false); m_connectionPreviewTimer = Glib::signal_timeout().connect([this] { updatePreview(); return false; }, 100); // Use a timer because setModified is potentially called a large number of times when the HOCR tree changes m_modified = true; } 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(); xmlpp::Element* pageDiv = doc->get_root_node(); if(!pageDiv || pageDiv->get_name() != "div") { return; } std::map attrs = HOCRItem::deserializeAttrGroup(pageDiv->get_attribute_value("title")); attrs["image"] = Glib::ustring::compose("'%1'", data.file); attrs["ppageno"] = Glib::ustring::compose("%1", data.page); attrs["rot"] = Glib::ustring::compose("%1", data.angle); attrs["res"] = Glib::ustring::compose("%1", data.resolution); pageDiv->set_attribute("title", HOCRItem::serializeAttrGroup(attrs)); Gtk::TreeIter index = m_document->addPage(pageDiv, true); expandCollapseChildren(index, true); m_treeView->expand_to_path(m_document->get_path(index)); m_treeView->expand_row(m_document->get_path(index), true); MAIN->setOutputPaneVisible(true); m_modified = true; } void OutputEditorHOCR::navigateTargetChanged() { Glib::ustring target = (*ui.comboNavigation->get_active())[m_navigationComboCols.itemClass]; bool allowExpandCollapse = target.substr(0, 9) != "ocrx_word"; ui.buttonExpandAll->set_sensitive(allowExpandCollapse); ui.buttonCollapseAll->set_sensitive(allowExpandCollapse); } void OutputEditorHOCR::expandCollapseItemClass(bool expand) { Glib::ustring target = (*ui.comboNavigation->get_active())[m_navigationComboCols.itemClass]; Gtk::TreeIter start = m_document->get_iter("0"); Gtk::TreeIter next = start; do { const HOCRItem* item = m_document->itemAtIndex(next); if(item && item->itemClass() == target) { if(expand) { m_treeView->expand_to_path(m_document->get_path(next)); for(const Gtk::TreeIter& child : next->children()) { m_treeView->collapse_row(m_document->get_path(child)); } } else { m_treeView->collapse_row(m_document->get_path(next)); } } next = m_document->nextIndex(next); } while(next != start); Gtk::TreeIter it = m_treeView->currentIndex(); if(it) { m_treeView->scroll_to_row(m_document->get_path(it)); } } void OutputEditorHOCR::navigateNextPrev(bool next) { Glib::ustring target = (*ui.comboNavigation->get_active())[m_navigationComboCols.itemClass]; bool misspelled = false; if(target == "ocrx_word_bad") { target = "ocrx_word"; misspelled = true; } Gtk::TreeIter start = m_treeView->currentIndex(); if(!start) { start = m_document->get_iter("0"); } Gtk::TreeIter curr = next ? m_document->nextIndex(start) : m_document->prevIndex(start); while(curr != start) { const HOCRItem* item = m_document->itemAtIndex(curr); if(item && item->itemClass() == target && (!misspelled || m_document->indexIsMisspelledWord(curr))) { break; } curr = next ? m_document->nextIndex(curr) : m_document->prevIndex(curr); }; // Sets current index showItemProperties(curr); } void OutputEditorHOCR::expandCollapseChildren(const Gtk::TreeIter& index, bool expand) const { if(expand) { m_treeView->expand_to_path(m_document->get_path(index)); m_treeView->expand_row(m_document->get_path(index), true); } else { m_treeView->collapse_row(m_document->get_path(index)); } } bool OutputEditorHOCR::showPage(const HOCRPage* page) { return page && MAIN->getSourceManager()->addSource(Gio::File::create_for_path(page->sourceFile()), true) && MAIN->getDisplayer()->setup(&page->pageNr(), &page->resolution(), &page->angle()); } void OutputEditorHOCR::showItemProperties(const Gtk::TreeIter& index, const Gtk::TreeIter& prev) { m_tool->setAction(DisplayerToolHOCR::ACTION_NONE); const HOCRItem* prevItem = m_document->itemAtIndex(prev); Gtk::TreeIter current = m_treeView->currentIndex(); if(!current || current != index) { m_connectionSelectionChanged.block(true); m_treeView->get_selection()->unselect_all(); if(index) { m_treeView->expand_to_path(m_document->get_path(index)); m_treeView->get_selection()->select(index); m_treeView->set_cursor(m_document->get_path(index)); m_treeView->scroll_to_row(m_document->get_path(index)); } m_connectionSelectionChanged.block(false); } m_propStore->clear(); ui.textviewSource->get_buffer()->set_text(""); const HOCRItem* currentItem = m_document->itemAtIndex(index); if(!currentItem) { m_tool->clearSelection(); return; } const HOCRPage* page = currentItem->page(); std::map attrs = currentItem->getAllAttributes(); for(auto it = attrs.begin(), itEnd = attrs.end(); it != itEnd; ++it) { Glib::ustring attrName = it->first; if(attrName == "class" || attrName == "id") { continue; } std::vector parts = Utils::string_split(attrName, ':'); Gtk::TreeIter item = m_propStore->append(); item->set_value(m_propStoreCols.attr, attrName); item->set_value(m_propStoreCols.name, parts[parts.size() - 1]); item->set_value(m_propStoreCols.value, it->second); item->set_value(m_propStoreCols.editable, attributeEditable(attrName)); item->set_value(m_propStoreCols.background, Glib::ustring("#FFF")); item->set_value(m_propStoreCols.weight, static_cast(Pango::WEIGHT_NORMAL)); } // ocr_class:attr_key:attr_values std::map>> occurrences; currentItem->getPropagatableAttributes(occurrences); for(auto it = occurrences.begin(), itEnd = occurrences.end(); it != itEnd; ++it) { Gtk::TreeIter item = m_propStore->append(); Glib::ustring itemClass = it->first; item->set_value(m_propStoreCols.name, itemClass); item->set_value(m_propStoreCols.editable, false); item->set_value(m_propStoreCols.background, Glib::ustring("#C0C0C0")); item->set_value(m_propStoreCols.weight, static_cast(Pango::WEIGHT_BOLD)); for(auto attrIt = it->second.begin(), attrItEnd = it->second.end(); attrIt != attrItEnd; ++attrIt) { const Glib::ustring& attrName = attrIt->first; const std::set& attrValues = attrIt->second; int attrValueCount = attrValues.size(); Gtk::TreeIter item = m_propStore->append(); std::vector parts = Utils::string_split(attrName, ':'); item->set_value(m_propStoreCols.attr, attrName); item->set_value(m_propStoreCols.name, parts[parts.size() - 1]); item->set_value(m_propStoreCols.value, attrValueCount > 1 ? "" : * (attrValues.begin())); item->set_value(m_propStoreCols.itemClass, itemClass); item->set_value(m_propStoreCols.editable, attributeEditable(attrName)); item->set_value(m_propStoreCols.placeholder, attrValueCount > 1 ? _("Multiple values") : Glib::ustring()); item->set_value(m_propStoreCols.background, Glib::ustring("#FFF")); item->set_value(m_propStoreCols.weight, static_cast(Pango::WEIGHT_NORMAL)); } } ui.textviewSource->get_buffer()->set_text(currentItem->toHtml()); if(showPage(page)) { // Update preview if necessary if(!prevItem || prevItem->page() != page) { updatePreview(); } // Minimum bounding box Geometry::Rectangle minBBox; if(currentItem->itemClass() == "ocr_page") { minBBox = currentItem->bbox(); } else { for(const HOCRItem* child : currentItem->children()) { minBBox = minBBox.unite(child->bbox()); } } m_tool->setSelection(currentItem->bbox(), minBBox); } } Glib::RefPtr OutputEditorHOCR::attributeValidator(const Glib::ustring& attribName) const { static std::map> validators = { {"title:bbox", Glib::Regex::create("^\\d+\\s+\\d+\\s+\\d+\\s+\\d+$")}, {"lang", Glib::Regex::create("^[a-z]{2,}(?:_[A-Z]{2,})?$")}, {"title:x_fsize", Glib::Regex::create("^\\d+$")}, {"title:baseline", Glib::Regex::create("^[-+]?\\d+\\.?\\d*\\s[-+]?\\d+\\.?\\d*$")} }; auto it = validators.find(attribName); if(it == validators.end()) { return Glib::RefPtr(); } else { return it->second; } } bool OutputEditorHOCR::attributeEditable(const Glib::ustring& attribName) const { static std::vector editableAttrs = {"title:bbox", "lang", "title:x_fsize", "title:baseline", "title:x_font", "bold", "italic"}; return std::find(editableAttrs.begin(), editableAttrs.end(), attribName) != editableAttrs.end(); } void OutputEditorHOCR::editAttribute(const Glib::ustring& path, const Glib::ustring& value) { Gtk::TreeIter treeIt = m_treeView->currentIndex(); Gtk::TreeIter propIt = m_propStore->get_iter(path); Glib::ustring attrName = (*propIt)[m_propStoreCols.attr]; Glib::ustring itemClass = (*propIt)[m_propStoreCols.itemClass]; Glib::RefPtr validator = attributeValidator(attrName); if(treeIt && (!validator || validator->match(value))) { m_document->editItemAttribute(treeIt, attrName, value, itemClass); } } void OutputEditorHOCR::updateCurrentItemBBox(const Geometry::Rectangle& bbox) { Glib::ustring bboxstr = Glib::ustring::compose("%1 %2 %3 %4", bbox.x, bbox.y, bbox.x + bbox.width, bbox.y + bbox.height); m_document->editItemAttribute(m_treeView->currentIndex(), "title:bbox", bboxstr); } void OutputEditorHOCR::updateAttributes(const Gtk::TreeIter& it, const Glib::ustring& attr, const Glib::ustring& value) { Gtk::TreeIter current = m_treeView->currentIndex(); if(current && it == current) { for(const Gtk::TreeIter& propIt : m_propStore->children()) { if((*propIt)[m_propStoreCols.attr] == attr) { (*propIt)[m_propStoreCols.value] = value; break; } } } } void OutputEditorHOCR::updateSourceText() { if(ui.notebook->get_current_page() == 1) { const HOCRItem* currentItem = m_document->itemAtIndex(m_treeView->currentIndex()); if(currentItem) { ui.textviewSource->get_buffer()->set_text(currentItem->toHtml()); } } } void OutputEditorHOCR::bboxDrawn(const Geometry::Rectangle& bbox, int action) { xmlpp::Document doc; Gtk::TreeIter current = m_treeView->currentIndex(); const HOCRItem* currentItem = m_document->itemAtIndex(current); if(!currentItem) { return; } std::map>> propAttrs; currentItem->getPropagatableAttributes(propAttrs); xmlpp::Element* newElement; if(action == DisplayerToolHOCR::ACTION_DRAW_GRAPHIC_RECT) { newElement = doc.create_root_node("div"); newElement->set_attribute("class", "ocr_graphic"); newElement->set_attribute("title", Glib::ustring::compose("bbox %1 %2 %3 %4", bbox.x, bbox.y, bbox.x + bbox.width, bbox.y + bbox.height)); } else if(action == DisplayerToolHOCR::ACTION_DRAW_CAREA_RECT) { newElement = doc.create_root_node("div"); newElement->set_attribute("class", "ocr_carea"); newElement->set_attribute("title", Glib::ustring::compose("bbox %1 %2 %3 %4", bbox.x, bbox.y, bbox.x + bbox.width, bbox.y + bbox.height)); } else if(action == DisplayerToolHOCR::ACTION_DRAW_PAR_RECT) { newElement = doc.create_root_node("p"); newElement->set_attribute("class", "ocr_par"); newElement->set_attribute("title", Glib::ustring::compose("bbox %1 %2 %3 %4", bbox.x, bbox.y, bbox.x + bbox.width, bbox.y + bbox.height)); } else if(action == DisplayerToolHOCR::ACTION_DRAW_LINE_RECT) { newElement = doc.create_root_node("span"); newElement->set_attribute("class", "ocr_line"); std::set propLineBaseline = propAttrs["ocrx_line"]["baseline"]; // Tesseract does as follows: // row_height = x_height + ascenders - descenders // font_pt_size = row_height * 72 / dpi (72 = pointsPerInch) // As a first approximation, assume x_size = bbox.height() and ascenders = descenders = bbox.height() / 4 std::map titleAttrs; titleAttrs["bbox"] = Glib::ustring::compose("%1 %2 %3 %4", bbox.x, bbox.y, bbox.x + bbox.width, bbox.y + bbox.height); titleAttrs["x_ascenders"] = Glib::ustring::compose("%1", 0.25 * bbox.height); titleAttrs["x_descenders"] = Glib::ustring::compose("%1", 0.25 * bbox.height); titleAttrs["x_size"] = Glib::ustring::compose("%1", bbox.height); titleAttrs["baseline"] = propLineBaseline.size() == 1 ? *propLineBaseline.begin() : Glib::ustring("0 0"); newElement->set_attribute("title", HOCRItem::serializeAttrGroup(titleAttrs)); } else if(action == DisplayerToolHOCR::ACTION_DRAW_WORD_RECT) { ui.entryAddWord->set_text(""); int response = ui.dialogAddWord->run(); ui.dialogAddWord->hide(); if(response != Gtk::RESPONSE_OK || ui.entryAddWord->get_text().empty()) { return; } newElement = doc.create_root_node("span"); newElement->set_attribute("class", "ocrx_word"); std::map> propWord = propAttrs["ocrx_word"]; newElement->set_attribute("lang", propWord["lang"].size() == 1 ? *propWord["lang"].begin() : m_spell.get_language()); std::map titleAttrs; titleAttrs["bbox"] = Glib::ustring::compose("%1 %2 %3 %4", bbox.x, bbox.y, bbox.x + bbox.width, bbox.y + bbox.height); titleAttrs["x_font"] = propWord["title:x_font"].size() == 1 ? *propWord["title:x_font"].begin() : "sans"; titleAttrs["x_fsize"] = propWord["title:x_fsize"].size() == 1 ? *propWord["title:x_fsize"].begin() : Glib::ustring::compose("%1", std::round(bbox.height * 72. / currentItem->page()->resolution())); titleAttrs["x_wconf"] = "100"; newElement->set_attribute("title", HOCRItem::serializeAttrGroup(titleAttrs)); if (propWord["bold"].size() == 1) { newElement->set_attribute("bold", *propWord["bold"].begin()); } if (propWord["italic"].size() == 1) { newElement->set_attribute("italic", *propWord["italic"].begin()); } newElement->add_child_text(ui.entryAddWord->get_text()); } else { return; } Gtk::TreeIter index = m_document->addItem(current, newElement); if(index) { m_connectionSelectionChanged.block(true); m_treeView->get_selection()->unselect_all(); m_connectionSelectionChanged.block(false); m_treeView->expand_to_path(m_document->get_path(index)); m_treeView->get_selection()->select(index); m_treeView->scroll_to_row(m_document->get_path(index)); } } void OutputEditorHOCR::showTreeWidgetContextMenu(GdkEventButton* ev) { std::vector paths = m_treeView->get_selection()->get_selected_rows(); int nIndices = paths.size(); if(nIndices > 1) { // Check if merging or swapping is allowed (items are valid siblings) const HOCRItem* firstItem = m_document->itemAtIndex(m_document->get_iter(paths.front())); if(!firstItem) { return; } std::set classes; classes.insert(firstItem->itemClass()); std::vector rows = {paths.front().back()}; for(int i = 1; i < nIndices; ++i) { const HOCRItem* item = m_document->itemAtIndex(m_document->get_iter(paths[i])); if(!item || item->parent() != firstItem->parent()) { return; } classes.insert(item->itemClass()); rows.push_back(paths[i].back()); } std::sort(rows.begin(), rows.end()); bool consecutive = (rows.back() - rows.front()) == nIndices - 1; bool graphics = firstItem->itemClass() == "ocr_graphic"; bool pages = firstItem->itemClass() == "ocr_page"; bool sameClass = classes.size() == 1; Gtk::Menu menu; Glib::RefPtr loop = Glib::MainLoop::create(); if(consecutive && !graphics && !pages && sameClass) { // Merging allowed Gtk::MenuItem* mergeItem = Gtk::manage(new Gtk::MenuItem(_("Merge"))); menu.append(*mergeItem); CONNECT(mergeItem, activate, [&] { Gtk::TreeIter newIndex = m_document->mergeItems(m_document->get_iter(paths.front())->parent(), rows.front(), rows.back()); m_treeView->get_selection()->unselect_all(); m_treeView->get_selection()->select(newIndex); }); if(firstItem->itemClass() != "ocr_carea") { Gtk::MenuItem* splitItem = Gtk::manage(new Gtk::MenuItem(_("Split from parent"))); menu.append(*splitItem); CONNECT(splitItem, activate, [&] { Gtk::TreeIter newIndex = m_document->splitItem(m_document->get_iter(paths.front())->parent(), rows.front(), rows.back()); m_treeView->get_selection()->unselect_all(); m_treeView->get_selection()->select(newIndex); expandCollapseChildren(newIndex, true); }); } } if(nIndices == 2) { // Swapping allowed Gtk::MenuItem* swapItem = Gtk::manage(new Gtk::MenuItem(_("Swap"))); menu.append(*swapItem); CONNECT(swapItem, activate, [&] { Gtk::TreeIter newIndex = m_document->swapItems(m_document->get_iter(paths.front())->parent(), rows.front(), rows.back()); m_treeView->get_selection()->unselect_all(); m_treeView->get_selection()->select(newIndex); }); } CONNECT(&menu, hide, [&] { loop->quit(); }); menu.show_all(); menu.popup(ev->button, ev->time); loop->run(); // Nothing else is allowed with multiple items selected return; } Gtk::TreeIter index = m_treeView->indexAtPos(ev->x, ev->y); const HOCRItem* item = m_document->itemAtIndex(index); if(!item) { return; } Gtk::Menu menu; Glib::ustring itemClass = item->itemClass(); if(itemClass == "ocr_page") { Gtk::MenuItem* addGraphicItem = Gtk::manage(new Gtk::MenuItem(_("Add graphic region"))); menu.append(*addGraphicItem); CONNECT(addGraphicItem, activate, [this] { m_tool->setAction(DisplayerToolHOCR::ACTION_DRAW_GRAPHIC_RECT); }); Gtk::MenuItem* addTextBlockItem = Gtk::manage(new Gtk::MenuItem(_("Add text block"))); menu.append(*addTextBlockItem); CONNECT(addTextBlockItem, activate, [this] { m_tool->setAction(DisplayerToolHOCR::ACTION_DRAW_CAREA_RECT); }); } else if(itemClass == "ocr_carea") { Gtk::MenuItem* addParagraphItem = Gtk::manage(new Gtk::MenuItem(_("Add paragraph"))); menu.append(*addParagraphItem); CONNECT(addParagraphItem, activate, [this] { m_tool->setAction(DisplayerToolHOCR::ACTION_DRAW_PAR_RECT); }); } else if(itemClass == "ocr_par") { Gtk::MenuItem* addLineItem = Gtk::manage(new Gtk::MenuItem(_("Add line"))); menu.append(*addLineItem); CONNECT(addLineItem, activate, [this] { m_tool->setAction(DisplayerToolHOCR::ACTION_DRAW_LINE_RECT); }); } else if(itemClass == "ocr_line") { Gtk::MenuItem* addWordItem = Gtk::manage(new Gtk::MenuItem(_("Add word"))); menu.append(*addWordItem); CONNECT(addWordItem, activate, [this] { m_tool->setAction(DisplayerToolHOCR::ACTION_DRAW_WORD_RECT); }); } else if(itemClass == "ocrx_word") { Glib::ustring prefix, suffix, trimmedWord = HOCRItem::trimmedWord(item->text(), &prefix, &suffix); std::vector suggestions; bool valid = m_document->checkItemSpelling(index, &suggestions, 16); for(const Glib::ustring& suggestion : suggestions) { Glib::ustring replacement = prefix + suggestion + suffix; Gtk::MenuItem* item = Gtk::manage(new Gtk::MenuItem(replacement)); CONNECT(item, activate, [this, replacement, index] { m_document->editItemText(index, replacement); }); menu.append(*item); } if(!trimmedWord.empty()) { if(menu.get_children().empty()) { Gtk::MenuItem* item = Gtk::manage(new Gtk::MenuItem(_("No suggestions"))); item->set_sensitive(false); menu.append(*item); } if(!valid) { menu.append(*Gtk::manage(new Gtk::SeparatorMenuItem)); Gtk::MenuItem* additem = Gtk::manage(new Gtk::MenuItem(_("Add to dictionary"))); CONNECT(additem, activate, [this, index, trimmedWord] { m_spell.add_to_dictionary(trimmedWord); m_document->recheckSpelling(); }); menu.append(*additem); Gtk::MenuItem* ignoreitem = Gtk::manage(new Gtk::MenuItem(_("Ignore word"))); CONNECT(ignoreitem, activate, [this, index, trimmedWord] { m_spell.ignore_word(trimmedWord); m_document->recheckSpelling(); }); menu.append(*ignoreitem); } } } if(!menu.get_children().empty()) { menu.append(*Gtk::manage(new Gtk::SeparatorMenuItem)); } if(itemClass == "ocr_par" || itemClass == "ocr_line" || itemClass == "ocrx_word") { Gtk::MenuItem* splitItem = Gtk::manage(new Gtk::MenuItem(_("Split from parent"))); CONNECT(splitItem, activate, [this, index, item] { Gtk::TreeIter newIndex = m_document->splitItem(index->parent(), item->index(), item->index()); m_treeView->get_selection()->unselect_all(); m_treeView->get_selection()->select(newIndex); expandCollapseChildren(newIndex, true); }); menu.append(*splitItem); } Gtk::MenuItem* removeItem = Gtk::manage(new Gtk::MenuItem(_("Remove"))); CONNECT(removeItem, activate, [this, index] { m_document->removeItem(index); }); menu.append(*removeItem); if(!index->children().empty()) { Gtk::MenuItem* expandItem = Gtk::manage(new Gtk::MenuItem(_("Expand all"))); CONNECT(expandItem, activate, [this, index] { expandCollapseChildren(index, true); }); menu.append(*expandItem); Gtk::MenuItem* collapseItem = Gtk::manage(new Gtk::MenuItem(_("Collapse all"))); CONNECT(collapseItem, activate, [this, index] { expandCollapseChildren(index, false); }); menu.append(*collapseItem); } Glib::RefPtr loop = Glib::MainLoop::create(); CONNECT(&menu, hide, [&] { loop->quit(); }); menu.show_all(); menu.popup(ev->button, ev->time); loop->run(); } void OutputEditorHOCR::pickItem(const Geometry::Point& point) { int pageNr; Glib::ustring filename = MAIN->getDisplayer()->getCurrentImage(pageNr); Gtk::TreeIter pageIndex = m_document->searchPage(filename, pageNr); const HOCRItem* currentItem = m_document->itemAtIndex(pageIndex); if(!currentItem) { return; } const HOCRPage* page = currentItem->page(); // Transform point in coordinate space used when page was OCRed double alpha = (page->angle() - MAIN->getDisplayer()->getCurrentAngle()) / 180. * M_PI; double scale = double(page->resolution()) / double(MAIN->getDisplayer()->getCurrentResolution()); Geometry::Point newPoint( scale * (point.x * std::cos(alpha) - point.y * std::sin(alpha)) + 0.5 * page->bbox().width, scale * (point.x * std::sin(alpha) + point.y * std::cos(alpha)) + 0.5 * page->bbox().height); showItemProperties(m_document->searchAtCanvasPos(pageIndex, newPoint)); m_treeView->grab_focus(); } void OutputEditorHOCR::open() { if(!clear(false)) { return; } FileDialogs::FileFilter filter = {_("hOCR HTML Files"), {"text/html", "text/xml", "text/plain"}, {"*.html"}}; std::vector> files = FileDialogs::open_dialog(_("Open hOCR File"), "", "outputdir", 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(); const xmlpp::Element* div = XmlUtils::firstChildElement(XmlUtils::firstChildElement(doc->get_root_node(), "body"), "div"); if(!div || div->get_attribute_value("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; } while(div) { m_document->addPage(div, false); div = XmlUtils::nextSiblingElement(div, "div"); } m_document->convertSourcePaths(Glib::path_get_dirname(filename), true); m_modified = false; m_filebasename = Utils::split_filename(filename).first; } bool OutputEditorHOCR::save(const std::string& filename) { Glib::ustring outname = filename; if(outname.empty()) { Glib::ustring suggestion = m_filebasename; if(suggestion.empty()) { std::vector sources = MAIN->getSourceManager()->getSelectedSources(); suggestion = !sources.empty() ? Utils::split_filename(sources.front()->displayname).first : _("output"); } FileDialogs::FileFilter filter = {_("hOCR HTML Files"), {"text/html"}, {"*.html"}}; outname = FileDialogs::save_dialog(_("Save hOCR Output..."), suggestion + ".html", "outputdir", filter); if(outname.empty()) { return false; } } 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; } std::string current = setlocale(LC_ALL, NULL); setlocale(LC_ALL, "C"); tesseract::TessBaseAPI tess; setlocale(LC_ALL, current.c_str()); Glib::ustring header = Glib::ustring::compose( "\n" "\n" "\n" " %1\n" " \n" " \n" " \n" "\n", Glib::path_get_basename(outname), tess.Version()); m_document->convertSourcePaths(Glib::path_get_dirname(outname), false); Glib::ustring body = m_document->toHTML(); m_document->convertSourcePaths(Glib::path_get_dirname(outname), true); Glib::ustring footer = "\n"; file.write(header.data(), header.bytes()); file.write(body.data(), body.bytes()); file.write(footer.data(), footer.bytes()); m_modified = false; m_filebasename = Utils::split_filename(filename).first; return true; } bool OutputEditorHOCR::exportToODT() { if(m_document->pageCount() == 0) { return false; } return HOCROdtExporter(m_tool).run(m_document, m_filebasename); } bool OutputEditorHOCR::exportToPDF() { if(m_document->pageCount() == 0) { return false; } ui.buttonPreview->set_active(false); // Disable preview because if conflicts with preview from PDF dialog const HOCRItem* item = m_document->itemAtIndex(m_treeView->currentIndex()); const HOCRPage* page = item ? item->page() : m_document->page(0); if(showPage(page)) { return HOCRPdfExporter(m_document, page, m_tool).run(m_filebasename); } return false; } bool OutputEditorHOCR::exportToText() { if(m_document->pageCount() == 0) { return false; } return HOCRTextExporter().run(m_document, m_filebasename); } bool OutputEditorHOCR::clear(bool hide) { m_connectionPreviewTimer.disconnect(); m_preview->setVisible(false); if(!ui.boxEditorHOCR->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_document = Glib::RefPtr(new HOCRDocument(&m_spell)); CONNECTX(m_document, row_inserted, [this](const Gtk::TreePath&, const Gtk::TreeIter&) { setModified(); }); CONNECTX(m_document, row_deleted, [this](const Gtk::TreePath&) { setModified(); }); CONNECTX(m_document, row_changed, [this](const Gtk::TreePath&, const Gtk::TreeIter&) { setModified(); updateSourceText(); }); CONNECTX(m_document, item_attribute_changed, [this](const Gtk::TreeIter&, const Glib::ustring&, const Glib::ustring&) { setModified(); }); CONNECTX(m_document, item_attribute_changed, [this](const Gtk::TreeIter & it, const Glib::ustring & attr, const Glib::ustring & value) { updateAttributes(it, attr, value); updateSourceText(); }); m_treeView->set_model(m_document); ui.textviewSource->get_buffer()->set_text(""); m_tool->clearSelection(); m_modified = false; ui.buttonSave->set_sensitive(false); ui.buttonExport->set_sensitive(false); ui.boxNavigation->set_sensitive(false); m_filebasename.clear(); if(hide) { MAIN->setOutputPaneVisible(false); } return true; } void OutputEditorHOCR::setLanguage(const Config::Lang& lang) { m_document->setDefaultLanguage(lang.code); } void OutputEditorHOCR::onVisibilityChanged(bool /*visible*/) { m_searchFrame->hideSubstitutionsManager(); } bool OutputEditorHOCR::findReplaceInItem(const Gtk::TreeIter& index, const Glib::ustring& searchstr, const Glib::ustring& replacestr, bool matchCase, bool backwards, bool replace, bool& currentSelectionMatchesSearch) { // Check that the item is a word const HOCRItem* item = m_document->itemAtIndex(index); if(!item || item->itemClass() != "ocrx_word") { return false; } Gtk::TreePath path = m_document->get_path(index); // If the item is already in edit mode, continue searching inside the text if(m_treeViewTextCell->get_entry() && m_treeViewTextCell->get_current_path() == path.to_string()) { Gtk::Entry* editor = m_treeViewTextCell->get_entry(); Glib::ustring text = editor->get_text(); int start, end; bool hasSel = editor->get_selection_bounds(start, end); bool matchesSearch = hasSel && Utils::strings_equal(text.substr(start, end - start), searchstr, matchCase); if(matchesSearch && replace) { editor->set_text(text.substr(0, start) + replacestr + text.substr(end)); editor->select_region(start, start + replacestr.length()); return true; } bool matchesReplace = hasSel && Utils::strings_equal(text.substr(start, end - start), replacestr, matchCase); int pos = -1; if(backwards) { pos = start - 1; pos = pos < 0 ? -1 : Utils::string_lastIndex(text, searchstr, pos, matchCase); } else { pos = matchesSearch ? start + searchstr.length() : matchesReplace ? start + replacestr.length() : start; pos = Utils::string_firstIndex(text, searchstr, pos, matchCase); } if(pos != -1) { editor->select_region(pos, pos + searchstr.length()); return true; } currentSelectionMatchesSearch = matchesSearch; return false; } // Otherwise, if item contains text, set it in edit mode int pos = backwards ? Utils::string_lastIndex(item->text(), searchstr, -1, matchCase) : Utils::string_firstIndex(item->text(), searchstr, 0, matchCase); if(pos != -1) { if(m_treeViewTextCell->get_entry()) { m_treeViewTextCell->get_entry()->editing_done(); // Commit previous changes } m_treeView->get_selection()->unselect_all(); m_treeView->get_selection()->select(path); m_treeView->set_cursor(path, *m_treeView->get_column(0), *m_treeViewTextCell, true); g_assert(m_treeViewTextCell->get_current_path() == path.to_string() && m_treeViewTextCell->get_entry()); m_treeViewTextCell->get_entry()->select_region(pos, pos + searchstr.length()); return true; } return false; } void OutputEditorHOCR::findReplace(const Glib::ustring& searchstr, const Glib::ustring& replacestr, bool matchCase, bool backwards, bool replace) { m_searchFrame->clearErrorState(); Gtk::TreeIter current = m_treeView->currentIndex(); if(!current) { current = m_document->get_iter(m_document->get_root_path(backwards ? (m_document->pageCount() - 1) : 0)); } Gtk::TreeIter neww = current; bool currentSelectionMatchesSearch = false; while(!findReplaceInItem(neww, searchstr, replacestr, matchCase, backwards, replace, currentSelectionMatchesSearch)) { neww = backwards ? m_document->prevIndex(neww) : m_document->nextIndex(neww); if(!neww || neww == current) { // Break endless loop if(!currentSelectionMatchesSearch) { m_searchFrame->setErrorState(); } return; } } } void OutputEditorHOCR::replaceAll(const Glib::ustring& searchstr, const Glib::ustring& replacestr, bool matchCase) { MAIN->pushState(MainWindow::State::Busy, _("Replacing...")); Gtk::TreeIter start = m_document->get_iter(m_document->get_root_path(0)); Gtk::TreeIter curr = start; int count = 0; do { const HOCRItem* item = m_document->itemAtIndex(curr); if(item && item->itemClass() == "ocrx_word") { Glib::ustring text = item->text(); if(Utils::string_replace(text, searchstr, replacestr, matchCase)) { ++count; m_document->editItemText(curr, text); } } curr = m_document->nextIndex(curr); while(Gtk::Main::events_pending()) { Gtk::Main::iteration(); } } while(curr != start); if(count == 0) { m_searchFrame->setErrorState(); } MAIN->popState(); } void OutputEditorHOCR::applySubstitutions(const std::map& substitutions, bool matchCase) { MAIN->pushState(MainWindow::State::Busy, _("Applying substitutions...")); Gtk::TreeIter start = m_document->get_iter(m_document->get_root_path(0)); for(auto it = substitutions.begin(), itEnd = substitutions.end(); it != itEnd; ++it) { Glib::ustring search = it->first; Glib::ustring replace = it->second; Gtk::TreeIter curr = start; do { const HOCRItem* item = m_document->itemAtIndex(curr); if(item && item->itemClass() == "ocrx_word") { Glib::ustring text = item->text(); if(Utils::string_replace(text, search, replace, matchCase)) { m_document->editItemText(curr, text); } } curr = m_document->nextIndex(curr); while(Gtk::Main::events_pending()) { Gtk::Main::iteration(); } } while(curr != start); } MAIN->popState(); } void OutputEditorHOCR::updatePreview() { const HOCRItem* item = m_document->itemAtIndex(m_treeView->currentIndex()); if(!ui.buttonPreview->get_active() || !item) { m_preview->setVisible(false); return; } const HOCRPage* page = item->page(); const Geometry::Rectangle& bbox = page->bbox(); int pageDpi = page->resolution(); Cairo::RefPtr image = Cairo::ImageSurface::create(Cairo::FORMAT_ARGB32, bbox.width, bbox.height); Cairo::RefPtr context = Cairo::Context::create(image); context->save(); context->rectangle(0, 0, image->get_width(), image->get_height()); context->set_source_rgba(1., 1., 1., .5); context->fill(); context->restore(); drawPreview(context, page); 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())); m_preview->setVisible(true); } void OutputEditorHOCR::drawPreview(Cairo::RefPtr context, const HOCRItem* item) { if(!item->isEnabled()) { return; } Glib::ustring itemClass = item->itemClass(); if(itemClass == "ocr_line") { std::pair baseline = item->baseLine(); const Geometry::Rectangle& lineRect = item->bbox(); for(HOCRItem* wordItem : item->children()) { if(!wordItem->isEnabled()) { continue; } const Geometry::Rectangle& wordRect = wordItem->bbox(); context->select_font_face(wordItem->fontFamily().empty() ? "sans" : wordItem->fontFamily(), wordItem->fontItalic() ? Cairo::FONT_SLANT_ITALIC : Cairo::FONT_SLANT_NORMAL, wordItem->fontBold() ? Cairo::FONT_WEIGHT_BOLD : Cairo::FONT_WEIGHT_NORMAL); context->set_font_size(wordItem->fontSize() * (item->page()->resolution() / 72.)); // See https://github.com/kba/hocr-spec/issues/15 double y = lineRect.y + lineRect.height + (wordRect.x + 0.5 * wordRect.width - lineRect.x) * baseline.first + baseline.second; context->move_to(wordRect.x, y); context->show_text(wordItem->text()); } } else if(itemClass == "ocr_graphic") { const Geometry::Rectangle& bbox = item->bbox(); context->save(); context->move_to(bbox.x, bbox.y); context->set_source(m_tool->getSelection(bbox), bbox.x, bbox.y); context->paint(); context->restore(); } else { for(HOCRItem* childItem : item->children()) { drawPreview(context, childItem);; } } } gImageReader-3.3.1/gtk/src/hocr/OutputEditorHOCR.hh000066400000000000000000000123221351740627400220160ustar00rootroot00000000000000/* -*- Mode: C++; indent-tabs-mode: t; c-basic-offset: 4; tab-width: 4 -*- */ /* * OutputEditorHOCR.hh * Copyright (C) 2013-2019 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 #include #include "OutputEditor.hh" #include "ui_OutputEditorHOCR.hh" class DisplayerImageItem; class DisplayerToolHOCR; namespace Geometry { class Rectangle; } class HOCRDocument; class HOCRPage; class HOCRItem; class SearchReplaceFrame; class OutputEditorHOCR : public OutputEditor { public: OutputEditorHOCR(DisplayerToolHOCR* tool); ~OutputEditorHOCR(); Gtk::Box* getUI() const override { return ui.boxEditorHOCR; } 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 { return m_modified; } void onVisibilityChanged(bool /*visible*/); bool clear(bool hide = true) override; void setLanguage(const Config::Lang& lang) override; void open(); bool save(const std::string& filename = "") override; void savePDF(); bool exportToPDF(); bool exportToText(); bool exportToODT(); private: class HOCRTreeView; class HOCRCellRendererText; class HOCRAttribRenderer; struct HOCRReadSessionData : ReadSessionData { std::vector errors; }; struct NavigationComboColumns : public Gtk::TreeModel::ColumnRecord { Gtk::TreeModelColumn label; Gtk::TreeModelColumn itemClass; NavigationComboColumns() { add(label); add(itemClass); } } m_navigationComboCols; struct PropStoreColumns : public Gtk::TreeModel::ColumnRecord { Gtk::TreeModelColumn attr; Gtk::TreeModelColumn name; Gtk::TreeModelColumn value; Gtk::TreeModelColumn multiple; Gtk::TreeModelColumn placeholder; Gtk::TreeModelColumn itemClass; Gtk::TreeModelColumn editable; Gtk::TreeModelColumn background; Gtk::TreeModelColumn weight; PropStoreColumns() { add(attr); add(name); add(value); add(multiple); add(placeholder); add(itemClass); add(editable); add(background); add(weight); } } m_propStoreCols; Ui::OutputEditorHOCR ui; ClassData m_classdata; DisplayerImageItem* m_preview = nullptr; sigc::connection m_connectionPreviewTimer; HOCRTreeView* m_treeView; HOCRCellRendererText* m_treeViewTextCell; Glib::RefPtr m_propStore; SearchReplaceFrame* m_searchFrame; DisplayerToolHOCR* m_tool; GtkSpell::Checker m_spell; bool m_modified = false; std::string m_filebasename; Glib::RefPtr m_document; sigc::connection m_connectionCustomFont; sigc::connection m_connectionDefaultFont; sigc::connection m_connectionSelectionChanged; Glib::RefPtr attributeValidator(const Glib::ustring& attribName) const; bool attributeEditable(const Glib::ustring& attribName) const; void expandCollapseChildren(const Gtk::TreeIter& index, bool expand) const; bool findReplaceInItem(const Gtk::TreeIter& index, const Glib::ustring& searchstr, const Glib::ustring& replacestr, bool matchCase, bool backwards, bool replace, bool& currentSelectionMatchesSearch); bool showPage(const HOCRPage* page); void bboxDrawn(const Geometry::Rectangle& bbox, int action); void addPage(const Glib::ustring& hocrText, ReadSessionData data); void editAttribute(const Glib::ustring& path, const Glib::ustring& value); void expandCollapseItemClass(bool expand); void navigateNextPrev(bool next); void navigateTargetChanged(); void pickItem(const Geometry::Point& point); void setFont(); void setModified(); void showItemProperties(const Gtk::TreeIter& index, const Gtk::TreeIter& prev = Gtk::TreeIter()); void showTreeWidgetContextMenu(GdkEventButton* ev); void updateSourceText(); void updateAttributes(const Gtk::TreeIter& it, const Glib::ustring& attr, const Glib::ustring& value); void updateCurrentItemBBox(const Geometry::Rectangle& bbox); void findReplace(const Glib::ustring& searchstr, const Glib::ustring& replacestr, bool matchCase, bool backwards, bool replace); void replaceAll(const Glib::ustring& searchstr, const Glib::ustring& replacestr, bool matchCase); void applySubstitutions(const std::map& substitutions, bool matchCase); void updatePreview(); void drawPreview(Cairo::RefPtr context, const HOCRItem* item); }; #endif // OUTPUTEDITORHOCR_HH gImageReader-3.3.1/gtk/src/hocr/XmlUtils.cc000066400000000000000000000053311351740627400204440ustar00rootroot00000000000000/* -*- Mode: C++; indent-tabs-mode: t; c-basic-offset: 4; tab-width: 4 -*- */ /* * XmlUtils.cc * Copyright (C) 2013-2019 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 "XmlUtils.hh" #include "Utils.hh" #include #include Glib::ustring XmlUtils::elementText(const xmlpp::Element* element) { if(!element) { return Glib::ustring(); } Glib::ustring text; for(const xmlpp::Node* node : element->get_children()) { if(dynamic_cast(node)) { text += static_cast(node)->get_content(); } else if(dynamic_cast(node)) { text += elementText(static_cast(node)); } } return Utils::string_trim(text); } const xmlpp::Element* XmlUtils::firstChildElement(const xmlpp::Node* node, const Glib::ustring& name) { if(!node) { return nullptr; } const xmlpp::Node* child = node->get_first_child(name); while(child && !dynamic_cast(child)) { child = child->get_next_sibling(); } return child ? static_cast(child) : nullptr; } const xmlpp::Element* XmlUtils::nextSiblingElement(const xmlpp::Node* node, const Glib::ustring& name) { if(!node) { return nullptr; } const 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 ? static_cast(child) : nullptr; } std::list XmlUtils::elementsByTagName(const xmlpp::Element* element, const Glib::ustring& name) { std::list elems; for(const xmlpp::Node* child : element->get_children()) { if(const xmlpp::Element* childElem = dynamic_cast(child)) { if(childElem->get_name() == name) { elems.push_back(childElem); } elems.splice(elems.end(), elementsByTagName(childElem, name)); } } return elems; } gImageReader-3.3.1/gtk/src/hocr/XmlUtils.hh000066400000000000000000000026341351740627400204610ustar00rootroot00000000000000/* -*- Mode: C++; indent-tabs-mode: t; c-basic-offset: 4; tab-width: 4 -*- */ /* * XmlUtils.hh * Copyright (C) 2013-2019 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 XMLUTILS_HH #define XMLUTILS_HH #include #include namespace xmlpp { class Document; class Element; class Node; } class XmlUtils { public: static Glib::ustring elementText(const xmlpp::Element* element); static const xmlpp::Element* firstChildElement(const xmlpp::Node* node, const Glib::ustring& name = Glib::ustring()); static const xmlpp::Element* nextSiblingElement(const xmlpp::Node* node, const Glib::ustring& name = Glib::ustring()); static std::list elementsByTagName(const xmlpp::Element* element, const Glib::ustring& name); }; #endif // XMLUTILS_HH gImageReader-3.3.1/gtk/src/main.cc000066400000000000000000000071351351740627400166600ustar00rootroot00000000000000/* -*- Mode: C++; indent-tabs-mode: t; c-basic-offset: 4; tab-width: 4 -*- */ /* * main.cc * Copyright (C) 2013-2019 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.3.1/gtk/src/scanner/000077500000000000000000000000001351740627400170505ustar00rootroot00000000000000gImageReader-3.3.1/gtk/src/scanner/ScannerSane.cc000066400000000000000000000656201351740627400215700ustar00rootroot00000000000000/* -*- 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-2019 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(getErrorMessage(status, _("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(getErrorMessage(status, _("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(getErrorMessage(status, _("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) { // EOF with no data read, means ADF has no further page if(m_job->lineCount == 0) { doStop(); return; } 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::pair parts = Utils::split_filename(filename); filename = Glib::ustring::compose("%1_%2.%3", parts.first, m_job->pageNumber, parts.second); } std::string ext = Utils::split_filename(filename).second; 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); } } Glib::ustring ScannerSane::getErrorMessage(SANE_Status status, const Glib::ustring& defaultMessage) { switch (status) { case SANE_STATUS_CANCELLED: return _("Operation is cancelled."); case SANE_STATUS_DEVICE_BUSY: return _("Device is busy."); case SANE_STATUS_COVER_OPEN: return _("Cover is opened."); case SANE_STATUS_JAMMED: return _("Document feeder jammed."); case SANE_STATUS_NO_DOCS: return _("Document feeder out of documents."); case SANE_STATUS_ACCESS_DENIED: return _("Access to scanner is denied."); default: return defaultMessage; } } gImageReader-3.3.1/gtk/src/scanner/ScannerSane.hh000066400000000000000000000066251351740627400216020ustar00rootroot00000000000000/* -*- 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-2019 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); static Glib::ustring getErrorMessage(SANE_Status status, const Glib::ustring& defaultMessage); }; typedef ScannerSane ScannerImpl; #endif // SCANNER_SANE_HH gImageReader-3.3.1/gtk/src/scanner/ScannerTwain.cc000066400000000000000000000343021351740627400217550ustar00rootroot00000000000000/* -*- Mode: C++; indent-tabs-mode: t; c-basic-offset: 4; tab-width: 4 -*- */ /* * ScannerTwain.cc * Copyright (C) 2013-2019 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& params) { 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.3.1/gtk/src/scanner/ScannerTwain.hh000066400000000000000000000057151351740627400217750ustar00rootroot00000000000000/* -*- Mode: C++; indent-tabs-mode: t; c-basic-offset: 4; tab-width: 4 -*- */ /* * ScannerTwain.hh * Copyright (C) 2013-2019 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.3.1/packaging/000077500000000000000000000000001351740627400157675ustar00rootroot00000000000000gImageReader-3.3.1/packaging/debian/000077500000000000000000000000001351740627400172115ustar00rootroot00000000000000gImageReader-3.3.1/packaging/debian/changelog.in000066400000000000000000000002361351740627400214710ustar00rootroot00000000000000gimagereader (@PACKAGE_VERSION@-1) experimental; urgency=low * gImageReader @PACKAGE_VERSION@. -- Sandro Mani @PACKAGE_RFC_DATE@ gImageReader-3.3.1/packaging/debian/compat000066400000000000000000000000021351740627400204070ustar00rootroot000000000000009 gImageReader-3.3.1/packaging/debian/control000066400000000000000000000050031351740627400206120ustar00rootroot00000000000000Source: gimagereader Section: graphics Priority: optional Maintainer: Sandro Mani Build-Depends: debhelper (>= 9), cmake, intltool, libdjvulibre-dev, 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, libquazip5-dev, libquazip5-headers, libzip-dev, python3-gi, uuid-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.3.1/packaging/debian/copyright000066400000000000000000000037051351740627400211510ustar00rootroot00000000000000Format: http://www.debian.org/doc/packaging-manuals/copyright-format/1.0/ Upstream-Name: gimagereader Source: https://github.com/manisandro/gImageReader Files: * Copyright: 2009-2018 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-2018 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.3.1/packaging/debian/docs000066400000000000000000000000271351740627400200630ustar00rootroot00000000000000AUTHORS NEWS README.md gImageReader-3.3.1/packaging/debian/gimagereader-common.install000066400000000000000000000002161351740627400245020ustar00rootroot00000000000000usr/share/icons/hicolor/*/apps/gimagereader.png usr/share/locale/*/LC_MESSAGES/gimagereader.mo usr/share/doc/gimagereader-common/manual*.html gImageReader-3.3.1/packaging/debian/gimagereader-gtk.install000066400000000000000000000002661351740627400240040ustar00rootroot00000000000000usr/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.3.1/packaging/debian/gimagereader-qt.install000066400000000000000000000001701351740627400236350ustar00rootroot00000000000000usr/bin/gimagereader-qt5 usr/share/appdata/gimagereader-qt5.appdata.xml usr/share/applications/gimagereader-qt5.desktop gImageReader-3.3.1/packaging/debian/rules000077500000000000000000000013651351740627400202760ustar00rootroot00000000000000#!/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.3.1/packaging/debian/source/000077500000000000000000000000001351740627400205115ustar00rootroot00000000000000gImageReader-3.3.1/packaging/debian/source/format000066400000000000000000000000141351740627400217170ustar00rootroot000000000000003.0 (quilt) gImageReader-3.3.1/packaging/debian/watch000066400000000000000000000001741351740627400202440ustar00rootroot00000000000000version=3 http://ftp.gnome.org/pub/GNOME/sources/bijiben/([\d\.]+)/bijiben-(.*)\.(?:zip|tgz|tbz|txz|(?:tar\.(?:gz|bz2|xz))) gImageReader-3.3.1/packaging/gimagereader.spec.in000066400000000000000000000127711351740627400216740ustar00rootroot00000000000000Name: 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: desktop-file-utils BuildRequires: djvulibre-devel BuildRequires: cmake BuildRequires: gcc-c++ BuildRequires: intltool BuildRequires: make BuildRequires: podofo-devel BuildRequires: sane-backends-devel BuildRequires: tesseract-devel BuildRequires: cairomm-devel BuildRequires: libappstream-glib BuildRequires: libjpeg-turbo-devel BuildRequires: libxml++30-devel BuildRequires: libuuid-devel BuildRequires: libzip-devel BuildRequires: gtkmm30-devel BuildRequires: gtksourceviewmm3-devel BuildRequires: gtkspellmm30-devel BuildRequires: json-glib-devel BuildRequires: poppler-glib-devel BuildRequires: python3-gobject BuildRequires: poppler-qt5-devel BuildRequires: qt5-qtbase-devel BuildRequires: qtspell-qt5-devel BuildRequires: quazip-qt5-devel Requires: hicolor-icon-theme Requires: gvfs %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 %autosetup -p1 %build mkdir build_gtk ( cd build_gtk %cmake -DINTERFACE_TYPE=gtk -DENABLE_VERSIONCHECK=0 -DMANUAL_DIR="%{_defaultdocdir}/%{name}-common" .. %make_build ) mkdir build_qt ( cd build_qt %cmake -DINTERFACE_TYPE=qt5 -DENABLE_VERSIONCHECK=0 -DMANUAL_DIR="%{_defaultdocdir}/%{name}-common" .. %make_build ) %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 NEWS README.md %{_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.3.1/packaging/win32/000077500000000000000000000000001351740627400167315ustar00rootroot00000000000000gImageReader-3.3.1/packaging/win32/Dockerfile000066400000000000000000000020471351740627400207260ustar00rootroot00000000000000FROM fedora:rawhide MAINTAINER Sandro Mani RUN \ echo all > /etc/rpm/macros.image-language-conf && \ dnf install -y \ cmake \ poppler-data \ make \ iso-codes \ findutils \ gettext \ intltool \ hunspell-en \ tesseract \ mingw32-nsis \ zip \ \ mingw32-gdb \ mingw32-gcc-c++ \ mingw32-dlfcn \ mingw32-djvulibre \ mingw32-libgomp \ mingw32-libjpeg-turbo \ mingw32-podofo \ mingw32-poppler-qt5 \ mingw32-qt5-qtbase \ mingw32-qt5-qtimageformats \ mingw32-qt5-qttools \ mingw32-qt5-qttranslations \ mingw32-qtspell-qt5 \ mingw32-tesseract \ mingw32-twaindsm \ mingw32-quazip-qt5 \ \ mingw64-gdb \ mingw64-gcc-c++ \ mingw64-dlfcn \ mingw64-djvulibre \ mingw64-libgomp \ mingw64-libjpeg-turbo \ mingw64-podofo \ mingw64-poppler-qt5 \ mingw64-qt5-qtbase \ mingw64-qt5-qtimageformats \ mingw64-qt5-qttools \ mingw64-qt5-qttranslations \ mingw64-qtspell-qt5 \ mingw64-tesseract \ mingw64-twaindsm \ mingw64-quazip-qt5 WORKDIR /workspace VOLUME ["/workspace"] gImageReader-3.3.1/packaging/win32/copyicons.sh000077500000000000000000000023551351740627400213030ustar00rootroot00000000000000#!/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 "from_icon_name\s*(\s*\"[^\*]*\"" ../../gtk/src/hocr/{*.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.3.1/packaging/win32/gtk_skel/000077500000000000000000000000001351740627400205345ustar00rootroot00000000000000gImageReader-3.3.1/packaging/win32/gtk_skel/etc/000077500000000000000000000000001351740627400213075ustar00rootroot00000000000000gImageReader-3.3.1/packaging/win32/gtk_skel/etc/gtk-3.0/000077500000000000000000000000001351740627400223725ustar00rootroot00000000000000gImageReader-3.3.1/packaging/win32/gtk_skel/etc/gtk-3.0/gtk.immodules000066400000000000000000000032721351740627400251030ustar00rootroot00000000000000# 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.3.1/packaging/win32/gtk_skel/etc/gtk-3.0/im-multipress.conf000066400000000000000000000015721351740627400260600ustar00rootroot00000000000000# 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.3.1/packaging/win32/gtk_skel/etc/gtk-3.0/settings.ini000066400000000000000000000001021351740627400247240ustar00rootroot00000000000000[Settings] gtk-toolbar-style = icons gtk-icon-theme-name = hicolorgImageReader-3.3.1/packaging/win32/gtk_skel/etc/pango/000077500000000000000000000000001351740627400224135ustar00rootroot00000000000000gImageReader-3.3.1/packaging/win32/gtk_skel/etc/pango/pango.modules000066400000000000000000000023601351740627400251120ustar00rootroot00000000000000# 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.3.1/packaging/win32/gtk_skel/share/000077500000000000000000000000001351740627400216365ustar00rootroot00000000000000gImageReader-3.3.1/packaging/win32/gtk_skel/share/icons/000077500000000000000000000000001351740627400227515ustar00rootroot00000000000000gImageReader-3.3.1/packaging/win32/gtk_skel/share/icons/hicolor/000077500000000000000000000000001351740627400244105ustar00rootroot00000000000000gImageReader-3.3.1/packaging/win32/gtk_skel/share/icons/hicolor/16x16/000077500000000000000000000000001351740627400251755ustar00rootroot00000000000000gImageReader-3.3.1/packaging/win32/gtk_skel/share/icons/hicolor/16x16/actions/000077500000000000000000000000001351740627400266355ustar00rootroot00000000000000action-unavailable-symbolic.symbolic.png000066400000000000000000000004621351740627400364630ustar00rootroot00000000000000gImageReader-3.3.1/packaging/win32/gtk_skel/share/icons/hicolor/16x16/actions‰PNG  IHDRóÿasBIT|dˆéIDAT8µÒANa ào¯q1$ž†À4ÄØ¸PäDÆ57@\˜à1Ü .¦ g˜…±I7ïõµ¯ýþ!º˜`ŽÏÈ<¢Ó&¾Á Û†üÀè˜x…Oè㆘·©kÒM“okš÷°8pòcIš|L¼HNrÑk€ýq/ÖÙ*[Å:ÀÓ„]à-ðw\^¶Ê vû-b8³¿Có‡ ¶s ‚›epà´E ÏÁßg°–vÏÔ$¾ ~‰óCrdÿ‘¦±N¡<ì MþÂUMóªIvr˜K\7‰ó:cå‘ÖÊš)?Î/ÛŽo5ý^Ðý¼^IEND®B`‚document-new-symbolic.symbolic.png000066400000000000000000000003351351740627400353310ustar00rootroot00000000000000gImageReader-3.3.1/packaging/win32/gtk_skel/share/icons/hicolor/16x16/actions‰PNG  IHDRóÿasBIT|dˆ”IDAT8­“= ƒ@ †Ÿj÷г®ýÿàØÍÝÅUWv¯z ¹o1rož$n²èÕã-P¸E Y{”>Àâ(PƒÔÀxè>Wo©Ë ÒfHöLÔÙ×=É‹Ø70,e„—­H à!Îh€Ow¢bkLÜõ‹Fu?öõøªhèÿ,Øà;2uÅN1IEND®B`‚document-open-symbolic.symbolic.png000066400000000000000000000003351351740627400355010ustar00rootroot00000000000000gImageReader-3.3.1/packaging/win32/gtk_skel/share/icons/hicolor/16x16/actions‰PNG  IHDRóÿasBIT|dˆ”IDAT8­ÓA Â0…á¯"Àx/¡çЃö8¶Kw JÝ$EmlÓÖ™dÞÏ›EèªD“¨ ‰ùŽRæXOs¿î;òË4ˆvÛ@ƒk|¸gR0 ýú X‡s‘mg–Raex÷d‚"6cÍï€Ó€9 büsè·#ýìQëÿD©ª±›’úC/sEܳœoÚIEND®B`‚document-save-as-symbolic.symbolic.png000066400000000000000000000003561351740627400361020ustar00rootroot00000000000000gImageReader-3.3.1/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.png000066400000000000000000000003431351740627400347340ustar00rootroot00000000000000gImageReader-3.3.1/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.png000066400000000000000000000002131351740627400346140ustar00rootroot00000000000000gImageReader-3.3.1/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.png000066400000000000000000000004371351740627400351140ustar00rootroot00000000000000gImageReader-3.3.1/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.png000066400000000000000000000002751351740627400346030ustar00rootroot00000000000000gImageReader-3.3.1/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.png000066400000000000000000000003211351740627400346070ustar00rootroot00000000000000gImageReader-3.3.1/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.png000066400000000000000000000002511351740627400342730ustar00rootroot00000000000000gImageReader-3.3.1/packaging/win32/gtk_skel/share/icons/hicolor/16x16/actions‰PNG  IHDRóÿasBIT|dˆ`IDAT8íA €0 çüÿ{ôR¨¾&^R(%©U¼î)0›ÍøõªØéxÄ<êÁr"ÆX½€ Hf8€¥bsÅö†]† /{Us3÷þ6¾…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.png000066400000000000000000000001611351740627400344220ustar00rootroot00000000000000gImageReader-3.3.1/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.png000066400000000000000000000001451351740627400351710ustar00rootroot00000000000000gImageReader-3.3.1/packaging/win32/gtk_skel/share/icons/hicolor/16x16/actions‰PNG  IHDRóÿasBIT|dˆIDAT8c`Ã0¢ñÿ“ª‰znCC_¾?‚WIEND®B`‚object-select-symbolic.symbolic.png000066400000000000000000000002461351740627400354500ustar00rootroot00000000000000gImageReader-3.3.1/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.png000066400000000000000000000002221351740627400344420ustar00rootroot00000000000000gImageReader-3.3.1/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.png000066400000000000000000000002211351740627400342400ustar00rootroot00000000000000gImageReader-3.3.1/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.png000066400000000000000000000002321351740627400346310ustar00rootroot00000000000000gImageReader-3.3.1/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.png000066400000000000000000000001641351740627400341240ustar00rootroot00000000000000gImageReader-3.3.1/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.png000066400000000000000000000004231351740627400353300ustar00rootroot00000000000000gImageReader-3.3.1/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.png000066400000000000000000000002571351740627400354260ustar00rootroot00000000000000gImageReader-3.3.1/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.png000066400000000000000000000002521351740627400343120ustar00rootroot00000000000000gImageReader-3.3.1/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.png000066400000000000000000000002531351740627400355110ustar00rootroot00000000000000gImageReader-3.3.1/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.png000066400000000000000000000002421351740627400345120ustar00rootroot00000000000000gImageReader-3.3.1/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.3.1/packaging/win32/gtk_skel/share/icons/hicolor/16x16/apps/000077500000000000000000000000001351740627400261405ustar00rootroot00000000000000help-contents-symbolic.symbolic.png000066400000000000000000000004661351740627400350170ustar00rootroot00000000000000gImageReader-3.3.1/packaging/win32/gtk_skel/share/icons/hicolor/16x16/apps‰PNG  IHDRóÿasBIT|dˆíIDAT8Ò/OÃ@Æñ¤L€Ä‘à d’  ÅÅ[ÞXͲ À!H`,Ñß’k·v}’'Í=÷Ü÷®—£ÔQ´ø§ô†é@ Îf…6]´Aºà2T~§ °Nuݧ6Àðâ¨mÃ4Ø#æè…óÈëý•$˜ï‘a'I S jý ±‹Öñ~ø1·–ž SÕ_|3ü`;vùެH:¥wp§|uŒÂ¿ãvA.èÇŽ#l…óÈöº`7ø _+/µ©ßù%ÎõW#x­M,3¼¤Ä“ºÆ8†&'|¿†êÜIEND®B`‚text-editor-symbolic.symbolic.png000066400000000000000000000003401351740627400344730ustar00rootroot00000000000000gImageReader-3.3.1/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.3.1/packaging/win32/gtk_skel/share/icons/hicolor/16x16/categories/000077500000000000000000000000001351740627400273225ustar00rootroot00000000000000applications-system-symbolic.symbolic.png000066400000000000000000000004371351740627400374240ustar00rootroot00000000000000gImageReader-3.3.1/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.3.1/packaging/win32/gtk_skel/share/icons/hicolor/16x16/devices/000077500000000000000000000000001351740627400266175ustar00rootroot00000000000000scanner-symbolic.symbolic.png000066400000000000000000000004021351740627400343320ustar00rootroot00000000000000gImageReader-3.3.1/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.3.1/packaging/win32/gtk_skel/share/icons/hicolor/16x16/mimetypes/000077500000000000000000000000001351740627400272115ustar00rootroot00000000000000x-office-document-symbolic.symbolic.png000066400000000000000000000003221351740627400366100ustar00rootroot00000000000000gImageReader-3.3.1/packaging/win32/gtk_skel/share/icons/hicolor/16x16/mimetypes‰PNG  IHDRóÿasBIT|dˆ‰IDAT8ÍÐÁ Â@…á/Á¬Â¢<Ú‚¥Ö¢m( Þ4^²ug݈ ;o~Þ?Ô}P,?¢åT7¬j¥YRèq|g Øâ„unæ8cnJÒ4h± ›oÐ Ir³*@IO¾YÁ”SóúÞŒ‘þ3AÍ!jGýqÂÞ!5w×ãA4pˆ{!IEND®B`‚gImageReader-3.3.1/packaging/win32/gtk_skel/share/icons/hicolor/16x16/places/000077500000000000000000000000001351740627400264445ustar00rootroot00000000000000user-trash-symbolic.symbolic.png000066400000000000000000000002431351740627400346260ustar00rootroot00000000000000gImageReader-3.3.1/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.3.1/packaging/win32/gtk_skel/share/icons/hicolor/16x16/status/000077500000000000000000000000001351740627400265205ustar00rootroot00000000000000gImageReader-3.3.1/packaging/win32/gtk_skel/share/icons/hicolor/16x16/status/image-missing.png000066400000000000000000000011001351740627400317470ustar00rootroot00000000000000‰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 if [ -e "$installroot/bin/libenchant-2.dll" ]; then linkDep lib/enchant-2/enchant_hunspell.dll else linkDep lib/enchant/libenchant_myspell.dll fi 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 linkDep lib/qt5/plugins/styles/qwindowsvistastyle.dll bin/styles # 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, poppler-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/en_US.dic install -Dpm 0644 /usr/share/myspell/en_US.aff $installroot/share/myspell/en_US.aff cp -r "/usr/share/poppler/" "$installroot/share/" # 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 # List installed files ( cd $installroot find -type f -or -type l | sed 's|/|\\|g' | sed -E 's|^\.(.*)$|Delete "\$INSTDIR\1"|g' > $builddir/unfiles.nsi # Ensure custom tessdata and spelling files are deleted echo 'Delete "$INSTDIR\share\myspell\*"' >> $builddir/unfiles.nsi echo 'Delete "$INSTDIR\share\tessdata\*"' >> $builddir/unfiles.nsi # Ensure legacy spelling dictionaries location is cleaned up echo 'Delete "$INSTDIR\share\myspell\dicts\*"' >> $builddir/unfiles.nsi echo 'RMDir "$INSTDIR\share\myspell\dicts"' >> $builddir/unfiles.nsi # Ensure potential log files are deleted echo 'Delete "$INSTDIR\gimagereader.log"' >> $builddir/unfiles.nsi echo 'Delete "$INSTDIR\twain.log"' >> $builddir/unfiles.nsi find -type d -depth | sed 's|/|\\|g' | sed -E 's|^\.(.*)$|RMDir "\$INSTDIR\1"|g' >> $builddir/unfiles.nsi ) 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 # Build portable zip pushd $builddir ln -s root ${progName}_${iface}_${progVersion} zip -r "${progName}_${iface}_${progVersion}_${arch}.zip" ${progName}_${iface}_${progVersion} rm ${progName}_${iface}_${progVersion} popd # Build the installer 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.3.1/packaging/win32/skel/000077500000000000000000000000001351740627400176675ustar00rootroot00000000000000gImageReader-3.3.1/packaging/win32/skel/share/000077500000000000000000000000001351740627400207715ustar00rootroot00000000000000gImageReader-3.3.1/packaging/win32/skel/share/enchant/000077500000000000000000000000001351740627400224115ustar00rootroot00000000000000gImageReader-3.3.1/packaging/win32/skel/share/enchant/enchant.ordering000066400000000000000000000002471351740627400255670ustar00rootroot00000000000000*: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.3.1/packaging/win32/skel/share/icons/000077500000000000000000000000001351740627400221045ustar00rootroot00000000000000gImageReader-3.3.1/packaging/win32/skel/share/icons/hicolor/000077500000000000000000000000001351740627400235435ustar00rootroot00000000000000gImageReader-3.3.1/packaging/win32/skel/share/icons/hicolor/16x16/000077500000000000000000000000001351740627400243305ustar00rootroot00000000000000gImageReader-3.3.1/packaging/win32/skel/share/icons/hicolor/16x16/actions/000077500000000000000000000000001351740627400257705ustar00rootroot00000000000000gImageReader-3.3.1/packaging/win32/skel/share/icons/hicolor/16x16/actions/dialog-cancel.png000066400000000000000000000014731351740627400311650ustar00rootroot00000000000000‰PNG  IHDRóÿasBIT|dˆ pHYs»»:ìãâtEXtSoftwarewww.inkscape.org›î<¸IDATxÚ|’°+…Ï:«ØImÛÕ¶ív\ÛƒºÏ¶mÛ~ïÚáë·Ék|c|g~¶m ‰N, ~lûøãs[–/Ÿ˜Z³¦,zê”,ÅcÇöÈçŸOGn¼ñá‹¿þzzÑg‚eO<ñkËœ9/®¹šów>¤HA@ikCû¦MèØ¼YÝqÇŸ7óvŸ€.¹iÞœ7O{æ‚[² …†ð<÷é§ÁsÖ9(ås¨;ÎNÞ{ßïÕ®€ ÎØ»ûmË)÷ÜÉAÓ°k欧ßI 3Žc˜˜Ä2 qåe.’€šK£aÑRõ¼·ÞºôJg5ÎÎr2ÌQ³ç¤ ‚:÷e]ÿ™&I]…q®›®ó0¼ŒlStM‡”Œp§ûÊJSS”øQ·}3¨²öý›ŠÒ2V’²ǽ6tÛ-§Òù2´ö&ì^ºÍû÷‚ôz«NW©47K:C¡ÔÑžeGVd·(¬‹\}É)Øs¶’ÂÎ ›­¸ª¿†t MuÇPq*nu@íÖ­°A„Dž['ðö)æÊÐcÍÖ–¿¤>ÃÓx˄鄽ŠbÑÑ¨ÂØH˜ð‰ü*ÅSøšv œÆª–”åqäl{´)Šó” &Pq*nu&kfhy &S”¹ö27ƒEªe šõÌ+Žü¿$EÂ^þs3Siw:]àÌ›nz¸ÍäUÞÏÂh(‚ q˜§Y ¼—kåH·ûÝDP8ÀæsøX4Z¼Zqúi„S¤šIãß<;ÄÁ”ˆò$ ‘fà§,©"= 6µköI=úû3½‹ÔÅ?NÈÁÙ³_>“S¹8K ,A  N3±»Ì©gÜyçŸ/ Vå.f8­ÜfÕª²$Ëç“”3I6»ëÄë®sŸ:ÐÙ~h™‰âì .ÕF«»ðIEND®B`‚gImageReader-3.3.1/packaging/win32/skel/share/icons/hicolor/16x16/actions/dialog-close.png000066400000000000000000000014251351740627400310420ustar00rootroot00000000000000‰PNG  IHDRóÿabKGDÿÿÿ ½§“ pHYs × ×B(›xtIME× Ý¢IDATxÚeÏ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*Ìô/€ ÿ˜³àIEND®B`‚gImageReader-3.3.1/packaging/win32/skel/share/icons/hicolor/16x16/actions/dialog-ok.png000066400000000000000000000011301351740627400303370ustar00rootroot00000000000000‰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.3.1/packaging/win32/skel/share/icons/hicolor/16x16/actions/document-edit.png000066400000000000000000000013011351740627400312320ustar00rootroot00000000000000‰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>™Ã ôœJfžIEND®B`‚gImageReader-3.3.1/packaging/win32/skel/share/icons/hicolor/16x16/actions/document-export.png000066400000000000000000000011561351740627400316360ustar00rootroot00000000000000‰PNG  IHDRóÿasRGB®ÎébKGDÿÿÿ ½§“ pHYs × ×B(›xtIMEÜ·‡H¬îIDATxÚ„’ŒaÅßàlÆ,ÃݰvX…µ×1{£Ý89ƨÃÚ1϶µ½~ÿéœõKÆóðA«©©)šœœÜ €ØœÅ!Û¶¿B¡4mJ“DÀ)nCSS…X,FA40ÕáA12: Ó4¡ë:tMƒ&Wu$ ˆÆ²mÜ{ðÑh‹A_ÑqÕ‘+Gn.jkk±sçNüøþŽeááÇ(//?¿Î@Ò uH²055…_?âÇ@$Agg'Ré4ûûûŸ(óPhê8AòÓÜÜ Óôë¤oJù‰ÕûT2)(,,d:•ÒB¡ÐUšaüo ~$‰l6‹l&Ïóüƒ¨®zðŸÎÌÌÌëX¬/?8¶í§Iu©ÝÞÞŽ'c!G~~>•PÛµk×íL&óÁ˜L&™Vã³,‹¶mÓqªd _¿~埿Ç9;;K/×M¢T—1¯eaaÓÓÓ‡Ã^¿~ Å,²Ø ɬJw]—ÂÈÈÏœ9C5'¼zõ G§üÇ×dVˆx±þâîknn¦péÒÅŸÖHÂbúJƒúúz.rëöÍ>ÅX‰- ‰ââb·nßèk¨oÚ 5œä´öóÊ¥‹?“×¢©}]¦6Å¿™@2&€ŠÄåJDC›z’:ÁIEND®B`‚gImageReader-3.3.1/packaging/win32/skel/share/icons/hicolor/16x16/actions/document-open-recent.png000066400000000000000000000012451351740627400325330ustar00rootroot00000000000000‰PNG  IHDRóÿasBIT|dˆ pHYs»»:ìãâtEXtSoftwarewww.inkscape.org›î<"IDATxÚt’S´K†ÿê¹7¶mÛ¶mÛÉsl>ŶmÛ¶m'=¶Ñ³Suܽæük•«¾ÚbDÆXF%š2æM‹ºãú‚¥) Å÷ Ï·†S~ÇßzÿC¼JðÅ+ÄÐÙƒ+n¢CýR¨“xdÎ=j8éÕ•£Ãì„°€«2qé 2šÌd±ZÉf·“l²R–Þéôk3ù‚!Z½f Ù.Z´ïIW{Ðj}: )¤Óéx“ 1ÆÛª“Ï¥Di4+™‘p³²á/z6(„üåÊg„Î9M$)¾q€¼únDëÊù(p{¼Xµjzv톖͚ðý¼€ªþŸÖñ³€0rgÂé2–t. Ÿ×‹-Û·!GŽœ(Yª,j-{ü¯üm‡Ø„•àرîê7()RióÅ·F˜ÜÖ0^Z¢² Ñ÷DP‰b…1¹âc,xð«.xЦL\þòÎÌi{Û¶@~ÿMe5mÖÈž8Õ:=ªæ²á©üõ¥8Ó! ðúÒâJ,$‘ÆW~¿?Ñ1ªZÂ=p%žWá{¯U.hi›¢(¼Eá…£Þ … ë þKó?6nÝ~À{Þ ªÄ@ @¡PˆÂá0E"â?R4Ûûôéƒ4sþügâ\çM H|¬¸Ünúòí+MŸ7OõX HUF«C™:gîIícÑØ¿“¡vdºWÏhjîyL‡IEND®B`‚gImageReader-3.3.1/packaging/win32/skel/share/icons/hicolor/16x16/actions/document-open.png000066400000000000000000000012671351740627400312610ustar00rootroot00000000000000‰PNG  IHDRóÿasRGB®ÎébKGDÿÿÿ ½§“ pHYs × ×B(›xtIMEÛ% ¨×7IDATxÚuŽ,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ÖÏl0òa%ŸDÂŽ;.¾ñÔŽ¡Óû#¢n(“” ¤FúLè†çâã!É2dRtP•Éltx‚ªY¡5ªaÔ«àÓjáç€!< _¾~C­ZµòK—Màv¹|6sôF l‘µ¸ ŠY‡ˆ=ÍÌòª Ä.J"ý‹û÷¦nU 8´2-ˆ¢Í¤A%A%3Ë.´hÑ"/PXéè‘#:4Và‹K†ÓH 0R°B?Ö&ÆÁ ‡˜[W˜DE*Ý»uÆ“ÇOàzéÄßjaH” #îÔ8èõzddf";;5jÔ(߉Р<‘õaJù… ÜT´oVþ¾aHMIÁþ}û £Dß¿/쀣ísívN'Ž»Ýnîñx¸×ëå>Ÿûý~®( ?{ö,Ÿ6mÿÏŸ={®ˆäœC(n¶2íÚµCdd$Ö­]ƒ};wîÜÂÑ£GË…'ª=U %,›€ºÀÓ§Oƒ…‹—ÄÙ¬!í۷רÕê§Nê+åÍC?¬  Z«Öoø¸kÇö>|þãÇG|||‡É“'_ãp:ú¡˜½Ôü‚ÌÌ,eùªÕââè çž8qbÇ­[·¾›1cF-QZK¶.qAX™«ë#_S ðCÅüMœ`IEND®B`‚gImageReader-3.3.1/packaging/win32/skel/share/icons/hicolor/16x16/actions/document-properties.png000066400000000000000000000012051351740627400325040ustar00rootroot00000000000000‰PNG  IHDRóÿasBIT|dˆ pHYs»»:ìãâtEXtSoftwarewww.inkscape.org›î<IDATxÚ…S¸ä@…O'ãÕãÚ¶m>¯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@Öû\ø½!mIEND®B`‚gImageReader-3.3.1/packaging/win32/skel/share/icons/hicolor/16x16/actions/document-save-as.png000066400000000000000000000014731351740627400316560ustar00rootroot00000000000000‰PNG  IHDRóÿasBIT|dˆ pHYs»»:ìãâtEXtSoftwarewww.inkscape.org›î<¸IDATxÚŒ‘,EOclÕßocmÛ.ÄvRŽmÛ¶mÛ¶m{ì™îéÌö*NnÕ-¾{žMÓø?ºuÏ… 6¼_þ„’LjX¸p·ò[oý@LNL„3™¬{½öã÷D<¥Î×÷ºqÞõï¥RÜÜÚ¹û¾û<2@*™r—,,¡«§í÷€) é·¶á—ŸDv¸ÿcvu‹~M †#nP(0›Ì˜×<ú6¿—ë§3¨ñÄ–‡¦” #û¹íÉR"ŸÉÌÔ"@QD¶é¯@4ࣗ/b…ó]ÆöÎüõgn8ÊJÔØÇ³Ÿ~_̨ˆ³¨ªJ<#SHýÅû÷²Át[•ãó¯Cœ¿¯¬xù»Ì ºæVPU}‚DpÓƒ/`ÊÁ®í³Û o}倭ìN7'Þ½’ñ!7n—‹x,ö× b‰4]U~vírÞßðüQ¶HÒ[oã–7)_¿†úæ.½~Ê¿;¢Šª(½ÏNœ¾ßR®{è.ºîêW|ËÖý2;ž$I>ÁêÕ«ùìטÍÌQ-Õn¯òÔ£·sòµVø~â¸Ý$v9ÅÊAU+K%I_u6Ãïo°óÀ—„ rìõn8c\¼œv×*»ŸÚ˜®®.6Ûx}ÕÕ«V陹tÔ¯Àf“Øû'‹Ây{Ä9áÚO¼¦²lÙ2.\È'Ÿ|ÂÂE‹eI{^Qæý½m,¬9—ÓÌ)»þÌ=Ï \už@ @GGÑhT·6u<µ€ßï'ŸÏ£ŽÞ{syñâ©ÐËì¹…›?ôsömV¼nccc$‰9@2™ÔƒéTJ?:€l0Û>ôø‹nt*7Üÿ“Ü;²;î, …ø½¾ûþ{@ãõ7Þ@”ÄÈo ¥xD¥†˜)ƒr%9ý–pŸæGC@IEND®B`‚gImageReader-3.3.1/packaging/win32/skel/share/icons/hicolor/16x16/actions/document-save.png000066400000000000000000000010541351740627400312500ustar00rootroot00000000000000‰PNG  IHDRóÿasBIT|dˆ pHYs»»:ìãâtEXtSoftwarewww.inkscape.org›î<©IDATxÚ¤’%ÀU1ÅÏ•O^Â5>"šp—„kA* wI8T,ã–pÍ$´áîz]·±ÿžíâð«“óÛ™B´E6½&Ošô%Ž“ö‹—®„.ä· Ó4`€¼Õ³kçv´¶¶|=sölƒ°}÷Ý1rôèy”ŒòEy«ï©ÇðèÑ£öõœs´¶´¢µÙÂÁ«w‹)Ô‹îJŠú1¦<¬4…÷ jQ\«Q gƒ"bâh €Ýš¡!^3fEÜ÷X½"‘åµ 7<˜yûQ#ï 4ˆÓÔ:]œ–õœ‘ ‡Ã è{¦É‚ÑRGxd…“çðT”²Œw,Í:N¯ÍéW©+h¦S ¯9YVx=.økYð íñ«Áq̼—£(]Ž €hÒibÿµ»¶¼ fõ©P#ÐO;Ñáh‘…äõ@¯W?$åŸ+ˆì£§4—žú¸üÆl1FàsRRbèþ þ¡Õ]®ß5±Q¡EÃ2pzÜ Ð ð9b £·úé/ÿSìçž"šl‰Ž4»ü`zðà<›–™xÈÏÑa -ˆ"#ÓÈ€¸Nä/f¥#‘¹âf¨ý´×‹ÖÎc½9~õ fó]²³—RËGÔSYÎE)¨ÌƒŠc*’çèâñjA·‡afÉ25Ø+Qæå'­ÒòåËñ> 6Œ®Ç(„dBéŠDze’j·ÙãC Zçu“s_ÈŸÔ¡jÕ–ãsž‰O e’’: IEND®B`‚gImageReader-3.3.1/packaging/win32/skel/share/icons/hicolor/16x16/actions/edit-copy.png000066400000000000000000000007411351740627400303750ustar00rootroot00000000000000‰PNG  IHDRóÿasRGB®ÎébKGDÿÿÿ ½§“ pHYsììu85tIMEØ#;ºbg¡aIDATxÚ•AJÃ@†ÿILKÝW=†¸ñjÖ¸q]7vU Á»tí…àÚXiS) –&MæùÞq ¢?|<¼÷MÞ(=æ„Qø=Ä<1ŸðrA €!¼Ø›—iŠ (ÅUIêÆn· Ûë LÂ04‚l³A’$0qív[Ê“;+=3g½^Ó&Ëh6›Ñ?Vø`n•¤«BY©F1îJqK ¬À4I-0Ãümª–ÚôÓh¿]‰}T4 ¼&+ =±T_à¸_Ü,ð•7\–%Ò4E«¡Ó‰¡¡@)͇E‘²7›êÝ*Ãý~’íö ÷Óé#€„Á!sÅ\×<g·ÛQQ$òªªhþ1'­5eYF£›Ñ €c4d@œ<Ïi¿ß .– 3<ß¾¸d4äŒ59)ÊŠÞKšÜMä—Ï<>ã§Çœ:M6TïüÆhÔùh èˆ úVIEND®B`‚gImageReader-3.3.1/packaging/win32/skel/share/icons/hicolor/16x16/actions/edit-delete.png000066400000000000000000000012001351740627400306540ustar00rootroot00000000000000‰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.3.1/packaging/win32/skel/share/icons/hicolor/16x16/actions/edit-find-replace.png000066400000000000000000000013201351740627400317460ustar00rootroot00000000000000‰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Ú<ŒCcÇPÄç¡¶mÛ¾öR}âžz®mÛý+Φ›¿ÇÝÔAF¹‚x7‹´ží ³—@ágII•UQÂÌB!·˜îÎâe±£v!TìD¢Ké@˜‘8N—ášÛÒH õÓÑåÊëqOe×}Þ!e¦û{­k]©Y ¾oc«µ4ù ª°„o]P©´±;S[€þXì¹´! Üð‘YúLp’ÆP¬à¸KOµ¨ ]‰ß†¬ÄÞS)¿¿ ªªBQcEàŸïdÅBÆö¤°IEND®B`‚gImageReader-3.3.1/packaging/win32/skel/share/icons/hicolor/16x16/actions/edit-paste.png000066400000000000000000000011531351740627400305350ustar00rootroot00000000000000‰PNG  IHDRóÿasRGB®ÎébKGDÿÿÿ ½§“ pHYs × ×B(›xtIMEÛ EJ4ëIDATxÚu’§"QÇÿÓ½ÍÔSôEIhA ¯À³ö¡Â °€oû!êk, €µöí…¥•Z¨µ¨PK­jîžsÍ}šYýøkœÎùŸsfŽ?Åbñu¿ßƒ‰ÅbH§Ó>ã…Bá¾V«(YÇcÕív]åÑét\Ž9Ž£êõúŸR©ôAòùü²ÙlºÉdR1»ÝN­V+–~f²Ù¬j4.5û‹(!z½h|X–… ™L­V ‘H³ÙÌ— ©N§*• ŠÅ"B¡6Ùl6F`8g½^ãææÄ;R”ÄySy>ŸaÛ6~æd6 h·Û0íEú6ø '¸hñ,f6ÿ…pXBVÈ2Æãq0<.M|¿¶cÇ©XhScàxSKÞß`ºš).–Rjqaà{‰,Cp)„–ðôŸØÀ_ŠRjÉk„~ûLÐȬ%HËå£#ý´V.—Ó©’ÎÇãñåö ‰DÂèÎÜä6u‹jµª¸ðéýÓo}=A*•B¹\ÖŸ† 96ŸÏ1™Lò¦q]ErÉèd=¶Û?Ÿ¿<¿ð]Þ?<¾õû.¢ÛÇv»}¹D&‚q¢ýÿÝ]m:ù¦z\çé5IÁÏ'ÒÿAcË÷)©°IEND®B`‚gImageReader-3.3.1/packaging/win32/skel/share/icons/hicolor/16x16/actions/edit-redo.png000066400000000000000000000014341351740627400303540ustar00rootroot00000000000000‰PNG  IHDRóÿasBIT|dˆ pHYs»»:ìãâtEXtSoftwarewww.inkscape.org›î<™IDATxÚ„“CœôHÆŸ·ªÒ˜ÖçµmÛ¶m_××åmuÿ-.kÛ¶í±í¨ÓéTêý2öÌ?ƃ ˆ™1z„v"¢+RJEû ’Â’âO/ >ŠyŠïàŽÉû¶`¦ ’"Þ)¥¸gï­w®ÙyÃ6Ø{“ÁjZQÛÛ„?Úk+0¸%2q¯â9zÆ ±•ˆ¿ÜPZµÿGœ•.d²XŒ~ÛÆË?½¯G}×\zÈé©ç¾×W˜àîµ¹Òþç~JÚx~#‘‹® BHl_³-R"œø) F`ª¹JÒ$n?p÷}ÒÝþÀÿn~ÐsÆÊ vuAYس¸ *?.”,' \»I~]vTx@´(7ºÆó‚„÷mTrÔ‹#7Y_Ê~«{çwƒ%-¤X‚Ç€ŽL,íjÅ„^Õ)Û®lÂÄ;'o¼;ix¶ :ÒYd£‘©f¢ƒw‹¦~T;C¾ö‡Å`¼ˆ¿âÛÇÅ»xâà}·M…̬Œ4qlª`m4˜µB‚Ùu…ƒ†]c¬fH–ïo±ƒâdÑEŒ'€¿Å0{ñ&q7¿Iª¹\ÝJ÷Óz¾›ÿ° '¾¼£ê^åPGºåÔÆ$ £xš íŒMРìfB‹|ñÁž:÷º‰þ†Æ¯'œ¹c 9Ê€"Y(tãéÈÕg¯Ý!ßçg+^N¦*Öî¢í˜ƒwè/{ÕPFˆQ¾<¢9ÚýóMb ÙLü‰öËo¹Sûúá8G©jQ¥«y™v²ÂÒ–æÃÃê –`z,I‹½÷ؼ ó1ú¤ÒabbÞ8äßñV2‡¾ lm%ìj€}VmÎ/î÷ç²âƒ@ €G§uTrIEND®B`‚gImageReader-3.3.1/packaging/win32/skel/share/icons/hicolor/16x16/actions/edit-undo.png000066400000000000000000000015141351740627400303670ustar00rootroot00000000000000‰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®%>Î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îÀQÁ \IEND®B`‚gImageReader-3.3.1/packaging/win32/skel/share/icons/hicolor/16x16/actions/help-about.png000066400000000000000000000014101351740627400305320ustar00rootroot00000000000000‰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—,^tëÚüIEND®B`‚gImageReader-3.3.1/packaging/win32/skel/share/icons/hicolor/16x16/actions/help-contents.png000066400000000000000000000016171351740627400312660ustar00rootroot00000000000000‰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œ9C ÕÍâ‰QÄɸƒðž0US( Æã›ÄÃssx=ã3†ï)Êp©n q[·x‡×Â1ºÑÔc “tƒÙš¬TÛGc*…ïpüˆC$F5ÛLgd*3¢½yÆë­Ä9àúǃ*= —m¯HÉA¤µl6fø½Y¹®J0J6N!Y.g`FW 0§wEꈄp:t=/a˜Œ‘ !½½è&3³®jÝï%%S=AJÞês+j®à䉬Ýòk«’'µ(Q6ý€=R5ðui™ÃÞ¼©¦!ìVÕ44…„¡ƒ^¿l¢Zß4”`(U{]%Ó¸A0+”•u&„.P,¼A'i”à¨@æ¾UÊÐNn˜—¬¤>–5›³a*¡T•À¤µ½žšÒ4jhfw:q>îC[ûWF¡CEE‘߆£ðÔý†ã; F‘ËåtüìŸ×£[9?‰Fß±c§SÕô$ç<‹J„÷žmÞ»Õ×6/Y²¤ÕÔÔ” —:²C!™ÏIEND®B`‚gImageReader-3.3.1/packaging/win32/skel/share/icons/hicolor/16x16/actions/insert-image.png000066400000000000000000000012431351740627400310620ustar00rootroot00000000000000‰PNG  IHDRóÿasBIT|dˆ pHYs»»:ìãâtEXtSoftwarewww.inkscape.org›î< IDATxÚ•’¬K@Ï`÷Úx¶ß‹žj[QÝÆ7Fƒº1ªØªÛà"¬­ ¶m·¿ÝéüÉÖ>É{>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^% ÒWnIEND®B`‚gImageReader-3.3.1/packaging/win32/skel/share/icons/hicolor/16x16/actions/insert-text.png000066400000000000000000000010541351740627400307640ustar00rootroot00000000000000‰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Ç-ݬŸVIEND®B`‚gImageReader-3.3.1/packaging/win32/skel/share/icons/hicolor/16x16/actions/list-add.png000066400000000000000000000010421351740627400301740ustar00rootroot00000000000000‰PNG  IHDRóÿasBIT|dˆ pHYs»»:ìãâtEXtSoftwarewww.inkscape.org›î<ŸIDATxÚbüÿÿ?%€ —Dí©Â%Ž›4¿»lÕx»èÖÄ©¸ÔátAÄNÏžŠnJÉaÑ Œã¿áµï]fo³{“Ü äMZM®whUËlÛ¶}ì3Èv³œ™ïûSÔB… ÉÓ~ãÄÍæ¿œyqJDS¡®As-sYó›óÛùj !%µøÛ(À~ð!’«•œ¿š À› fm›•¸—»7ïȳCÚ*Õ £$%WA A58Ænéó¦Á¬aDÏ8ß»µÏª9—-þ`¢I˜×³GNëBÞ¨ˆâ゘û° ]·#¥¦Žf’Å,¹R ×t7¹iÊÙn à½çnòÚjL½¢µ®#ÅP@I0o ¥Z‰É;dËe:l ݶö‘¥;oï]‹Æ Áh‰Uб}†Ñd-Gž¤Þhê´¦¥YclÎy¯—þ±õë̛ɆÑÑXÏÑ{7x4++þ«!F\pH.Fþ·¼,dy#">ü÷‚²wsû›Çé´H;Ϳ‰™©þŸ¹0ï" ㇗ܾ|Mx3%_"¯¬ù͈dIEND®B`‚gImageReader-3.3.1/packaging/win32/skel/share/icons/hicolor/16x16/actions/list-remove.png000066400000000000000000000005041351740627400307430ustar00rootroot00000000000000‰PNG  IHDRóÿasBIT|dˆ pHYs»»:ìãâtEXtSoftwarewww.inkscape.org›î<ÁIDATxÚcüÿÿ?%€ …7j#³ÒUÈà@Á‰ÔÔæwï–}Ü¿Ÿ•Èa6 Fgó::þáRTìåœ;·¤‹XYŸh''K3þÌÀä³B13Ô‚\\ ïrßÞ½cPÞ¿ÿ­èïß"(.øõçÃ×ׯØÿf`faa`Ìô÷/PüPþã¹s ï¾|:…á7P .˜ÎȘ´y*;H Ç¿ê dÿÿŸ3` £qÔ¯E7í_((IEND®B`‚gImageReader-3.3.1/packaging/win32/skel/share/icons/hicolor/16x16/actions/object-order-front.png000066400000000000000000000007651351740627400322130ustar00rootroot00000000000000‰PNG  IHDR(-SsBITÛáOà pHYs × ×B(›xtEXtSoftwarewww.inkscape.org›î<ÃPLTEÿÿÿvvxÅÅËuuy‚‚„‹‹––›¢¢§®®³ºº¿ÆÆËwwyÆÆËåååôôôÿÿÿvvy}}€³ÿ„ƒµÿ…¶ÿ‡·ÿˆ·ÿ‰¸ÿйÿ‹‹‹¹þŒºþ¼ÿ“¾þ”¾þ––›œÄýžÅý¢¢§£Èý¤Éý¥Éý§Êü«Ìü¬Íü¬Îü­Íû­Îü®®³ºº¿ÆÆËÈÈÍåååæææçççèèèéééêêêëëëìììíííðððñññòòòôôôøøøúúúÿÿÿÜÑtRNSµµ¿¿¿¿¿¿¿¿ññþþþ·[„ˆIDATxÚbÀ&§ a0€f7+·8/»ÿ¥öïós­Ûi·š*'zÃÓùúTê‚øÜ.Ï÷W"Šß!K×˱ÙgD‘'I­&š vþܳ F¨EnXŽçúÜ"³¹af›Pã[бØ¡Æ·òé6 ÃX{Þ)1 ³úã(¿ø¿$BEŒZÃô"öòë!‹ðÐIEND®B`‚gImageReader-3.3.1/packaging/win32/skel/share/icons/hicolor/16x16/actions/object-rotate-left.png000066400000000000000000000013211351740627400321650ustar00rootroot00000000000000‰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­IDATxÚcÀ 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ÎÒ3áIEND®B`‚gImageReader-3.3.1/packaging/win32/skel/share/icons/hicolor/16x16/actions/object-rotate-right.png000066400000000000000000000013211351740627400323500ustar00rootroot00000000000000‰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­IDATxÚcÀTuP\’¬åÙàѾöÎk°Dqæüé³W,™¾L•©]]]üzàWÄ“ÆLÂkôdî”ùzî¤ù䯠ììÓÚ†7ž?eüLÝÕÛE–f¼÷þ{|ýýW8™Æ+x¼òæK4ja颥4Õ7ËX(QØ"=ªa´SË ÊÇŸ|LÇáý¦ÆÕq%Nž‰ò$ó•ÞÖvžúá)Y;s-®q‘X°D°_o0ÒÝÛM_Ðǯ¿üŒïëj_5š78ñ `±ÅÌ6®¢]¤ZªôHޱµ£æ‡YBî<Œ•)ÊqòôëªõÜV]¯<Ý䑊ø1øŽâ¡"¦œ“†Ùâ©ã¼lilHœqœ=•ÝŸoûÛm¸@ƒÆÄdù€dÆ$æASTq”½E%%Ô!YK†™Žk­.1R‰Ü.s¥5›ŸÛzŒ•ÔÕ;!€ÆùcnA¯¤9Z!¯Ëi©×Ž|¦ÞUûäQDÄ)Ø;Ƹo¦£óõQ"?„ é~ësuPŽ—ýÂfx®~ ¸ñð_¨q ´Ø>IWf,o¸V$ý)LÒ+qüyR̬~™ùA ëój˜œë÷èĵ÷nÐØ¾P3µ Ö\%q[®kü¤Z§0³¡àO>ÊÎ ¦ãþ¸Ù+»VžküΕ‡«5R#ôµ‡ôŒ¬Ò;"¤ØQo;“ªŸÄë+½ñgÀ‹&N®kv/ö&ÚÞ¨éõ*œšRn‰±~Qt¾Y6Ù[y¥RJ.®¨<ø¿w¬²”,2Éùxèß  ÆÇÈêQrkh°ãŽIEND®B`‚gImageReader-3.3.1/packaging/win32/skel/share/icons/hicolor/16x16/actions/window-close.png000066400000000000000000000014251351740627400311120ustar00rootroot00000000000000‰PNG  IHDRóÿabKGDÿÿÿ ½§“ pHYs × ×B(›xtIME× Ý¢IDATxÚeÏ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*Ìô/€ ÿ˜³àIEND®B`‚gImageReader-3.3.1/packaging/win32/skel/share/icons/hicolor/16x16/actions/zoom-fit-best.png000066400000000000000000000010331351740627400311720ustar00rootroot00000000000000‰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.3.1/packaging/win32/skel/share/icons/hicolor/16x16/actions/zoom-in.png000066400000000000000000000015111351740627400300640ustar00rootroot00000000000000‰PNG  IHDRóÿasRGB®ÎébKGDÿÿÿ ½§“ pHYs × ×B(›xtIMEÛ«•ÇnÉIDATxÚlÒC [Mà3“ä¾ðgmÛ¶mÛn7µÛMmwUÛ¶íg3¶“ë8)Ÿ¾õÌ1‚Bìv{³`пñkBj§Ëó÷_ ™¹Z岯8–_ß¹KW3”ýþl³lñ.qMH@8;¶k-¨Táï@Z¶1˜” 2– eÿ›„ãý›±¬|=±DA…ý´ÂGš¾)UÊy{v¸B’‘}Ò_»~MÔŒi³–cM‘á‘ÁpvPH7Œ]U]Å©réò¥ÿ«V¯üm‚p  ¨¨È5=#}×áÃÖ®['!++ó’TÐÒÒ’wçîÿýûÞ2 æÌ™Ówæì™ÖæœATài¯ÚÏIEND®B`‚gImageReader-3.3.1/packaging/win32/skel/share/icons/hicolor/16x16/actions/zoom-original.png000066400000000000000000000015031351740627400312630ustar00rootroot00000000000000‰PNG  IHDRóÿasRGB®ÎébKGDÿÿÿ ½§“ pHYs × ×B(›xtIMEÛ BñŸÃIDATxÚlÒcY€áóbÛÙÛ¶mÛ¶mÛ¶mÛ¶m{âgÞI¡Ýéò+ ’ ˆ"?þÎý'åBá¨ÙdÔÿÊàw^dhvlÙråA:%™yìÌQ<¦U,[Rnµ˜¤wŸ~ò·î<–óÇãwÚ6lÐtGº@ ðkÐSw§W­VW+,`À!‚„0‰ö7L(oœ?”)«ß\½Q£¦—0 Kî?z¤üõ'B[}y¾8ìFÒfÓD(Jàã+ÕZ¥ðç7íxøü‹Þ«øî«Y½ª’%“!¡Ó§€ð[¥Ó‡Ìv͇šz—óXÏ=fÅ£Œfå½û4Ìö¿6š-k†Ðg?¥qãG–LP$^òù7ôd?6í8®.Y¶¥xRµé Î×ìÆ —*ù °åSTxð W| …)Çe1#> ßÞ±.ƒ“$û àÌ•ý‹¶OîÑÒÎ0¬(¼UòozƒNÀ£Qy ‹=±«»N-Ó$`™B.Så ŠÖîÙð~*¥Rm`œF…Fˆ}ó4{/ðéó÷õÙ¬D~§Ë bÀÎq¼‚@÷O®>ñøøÞ `àh…ŸúýÌvpÿÑ«ºÛ7¯Î:péÅÇ™gÃãB»Ž’|ŽC,2Á¬SX|¿áFŽŸ·îsƒµšAªä³fÏ€V­Ú+[$sÙ7ϟ׹Í~!£K¯Éa÷ˆrÙ Ýù (÷¯^ÔOÉ|WÛžÃ×®^{•f† sç̇î=:Õ£(fªLïÉ¡Ö Ä“Fÿq÷íÛ·=–/[³;û·ú+׬ˆš1uÖrl <2Î 憱«ª«ÂÃÃUnܼñíºÕÿcã¢MÈÅÅÅ®÷Üÿ?oþœÿ^îâi)¤ÒÖÖ–÷èñ£ÿ'OxË@.˜3gNß™³g>ZX›skPwɽISIEND®B`‚gImageReader-3.3.1/packaging/win32/skel/share/icons/hicolor/16x16/actions/zoom-out.png000066400000000000000000000015341351740627400302720ustar00rootroot00000000000000‰PNG  IHDRóÿasRGB®ÎébKGDÿÿÿ ½§“ pHYs × ×B(›xtIMEÛt‹™ÑÜIDATxÚd‘°äZ†û$'c>Û¶mÛ\Û¶ k£°¶mÛº¶jǶ'Nöš_õ_jw#hÄåvÁÃ= ÑHè‡T&;<· ô­L†VÝ}—Ñqφ£Y–Ÿòñ‡±!h †Z,–[õÉáPàè¾ãW¾2™ïLòùפ+ØÒ*‹ùzqE7%ćú}ž ZÑ\Îçsmß~8çËÎÿý& ¼À^’A% PÕ‹m¥GRæ!–åü#‡j(—— F£á¥ÜRGáëï|ì"I9…)œÁ$Ð@ Ne‘f%Ìr¢ñÜ¥ݧÏSÁ·ÞzïËæÞzëm(/ÍfµÖ#D|PÔª ªH`Zi ðŠõ™—â'.íú0(@®ù‘xò½J¿Êö˃:õçŸþòÎÏ¿jákáx–$Îo-yôðåsùGvg½ûõy{ù²5W› ¤“iäM*£…ÖLææÍCV@еj…䆸ʯ¥0!&“I¢Í:YfRÌE¶lm$óM&ÊODYk¥–îLǤ?D:x_4–hþ±uÛˆÅÓË_¼3ñúãFêI‚— j°ºƒ$Ä;1bõ¥ÐƒLŠy„‹Z+=IwxcNÎõsÕñ;!åÝ;^zSŸ£Æ( D(t/‰²JÞvá‡mK¦ ²”ß|K¥V×ìÞ¹ê ¡–ù æÁ?ÿ·ñÃWTSãyŽÆ/Òw›0uÝ#¼QTùöÀÊ™ýºKSJbœ¿~íF[‡ ÆOsgσ¾}» ʲÒ(¬½ï^J¥¦e6©aÞÓ[·îîQYY/)-†Û[¿a®³³×•Ôä$¼ $, ™_QQá÷øñãÿ3gÍøãàh+”šžÌ@2èêêª|öìÉÿ¾þž— 0“jÀîÝ»¨ªª©ûùû[ˆˆÙ1Ìœ5$bccÁôæÍ›wîÛ¿çKÚS‘ôõ‚ÉIEND®B`‚gImageReader-3.3.1/packaging/win32/skel/share/icons/hicolor/16x16/apps/000077500000000000000000000000001351740627400252735ustar00rootroot00000000000000gImageReader-3.3.1/packaging/win32/skel/share/icons/hicolor/16x16/apps/accessories-text-editor.png000066400000000000000000000016621351740627400325570ustar00rootroot00000000000000‰PNG  IHDRóÿasBIT|dˆ pHYs»»:ìãâtEXtSoftwarewww.inkscape.org›î</IDATxÚ]“KOg†ß¹šñ5Ô0€]04v ©bd¥Å]!Xu‰ºé¶«JI·,ù õ°¨*µÝw*AC…l«DV,ZÚ’ÄãÀñ•ñe>Ï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.3.1/packaging/win32/skel/share/icons/hicolor/16x16/categories/000077500000000000000000000000001351740627400264555ustar00rootroot00000000000000applications-education-language.png000066400000000000000000000014331351740627400353250ustar00rootroot00000000000000gImageReader-3.3.1/packaging/win32/skel/share/icons/hicolor/16x16/categories‰PNG  IHDRóÿasBIT|dˆ pHYs»»:ìãâtEXtSoftwarewww.inkscape.org›î<˜IDATxÚ¥“57ÀÉfõ|¾wVmÛöØv=v9(ÆFGu;ªmÛø¬³gîy³Ù¤¯c–qþ¦pÎñ†äqñ½ŸŒܵë Æ{ý ú1ˆÂýq•Ê¥|)úU%½©jµ§T.æªv§¯TÈ-¼ôÖW¿î:°ñ‹ó «Z£SmìÔFM¶9ŠŒ.“A? 8å¤ITª)äÓÂ¥•P’97;Ø_™Ýupã°Ï«¤Õ ÊUÒÆÎiŽ-â,Ä¢8×eÒŒ/ š·|»ÜFI Î *kÚ“ž'qRáŒåÂcŠl·À*A»ÙB+ë 5åÈ“`ŒA qigL9“L7k-”RLõ(„ôYo¥T‹†³Ž)3729:Ä¿×ñƒ€¼ßaye!d­I%±ã.­“+Vé-ð_&’Ž} [D~ýŽzªèË;ŒÑ¬¬íà„Ç´ôp£J tm“ ."¬fªÏ§Ö›Ÿ6Å9Ç2˜sx]êùMM;5ØTbB†Q®â‡RXæ—ÖÑíO¿ó ŸìÚḙ~ŽŸæÁ'¾¦‘@à+¶Ú‚@t]èn9¤‚\±Ü;“&mŒuxažÉ±2M‘狟—¸ôî Vǹq2`Õy÷³ß*&ˆb:ÚæU!V6k~L¤ïýžpÍé.>ºÌÖdÈ`%f»«µá÷óØ“ï „Oæ|Œ‹qÒ–T’ÚœBã2í<ŒIyå£ßù~W‘Ñ Å WÉ‹/¿ßÚÿëw ~_è¢þˆ /Tƒ±^Îä{ÚF™Pª+[K kµÆòw«ÙêÁÝ>}Û/úÖþИÅ,ËèîcÌŸ[‹sÎ9gDkÝÛýT¬µ•4Mu—`!I’Å………:3þw;ÿ@$6¦Áz®|IEND®B`‚gImageReader-3.3.1/packaging/win32/skel/share/icons/hicolor/16x16/categories/preferences-system.png000066400000000000000000000015331351740627400330100ustar00rootroot00000000000000‰PNG  IHDRóÿasBIT|dˆ pHYs»»:ìãâtEXtSoftwarewww.inkscape.org›î<ØIDATxÚ„Rp\[>‹Ø¶mÛvϯ¶mŽbÛ*c;7[­wk7¶mßÞÍL¬ïøü€aøúù 3νVff柕••ÅTÕeå@3<< —”¤ì&Qø«îüýû÷¥ŠŠòÑk×®‰-+¸}û¶#T‹[ Ñé‹iéVÛ _¾|™ ‚júá‚‚‚÷¶б™™™iËÈÈ—ù ô÷÷[¼ëpáÂ…ÿþûo’ªš*hhh½€d¥$¥œ ÉäÏ(Jqhdœ”@BÞ®ˆÒ—+ ÄÄÅÎ6µ4ƒŸuõÀÄÈ€_VZnphhEÀ$Ñ+Lˆ'³Puµñ•+W©BÂÂÕD"Ñ›ñ+hbl¬A"‘ÀÄØã˜7x|Í·oßz—CXÄôÑcÇË®^½êÔÒÜtcffƯ±©‘ma~aqdddjrj²¯®®.³ª}#À‚M@þ–%òr²eîá¥%%€••u¡¨¨è_:^„Ð×ó£Á6ð÷÷×WPwIMINÎ.ÀUpð–ùÃá]ÛIHJÐRÓR0ÜÜFIqÙª[F‘Œ¸ä¥N‚_ºb̶âRTÝ7/Ny¬Ô/߃KÞELà¶uQ`5tö×Ïàl=³—\‰Ê‹ 0ⲯ~_RO¾aÔ†ÎhÓ삳nš·±÷vb‚ËQðÒb<ÑjHÉ}5Ks¹%êâÉÀØfÀ²«žz'«‘öVÿæ7žd}Kyl#S„yÚIEND®B`‚gImageReader-3.3.1/packaging/win32/skel/share/icons/hicolor/16x16/devices/scanner.png000066400000000000000000000010731351740627400301120ustar00rootroot00000000000000‰PNG  IHDRóÿaIDATxÚÄ“5´Ô@†ÿ™L²’_@GF =Ëæ,[¶ì”Y&“ü5`v5#“²@:D$‰"òÉŒ†å¹àamÂPÐÒGü¶(»㨉½ IEz{‰E6Õ~Žz3ü¥ ž™~/š ¸ ©*RÁ•¨mAJ" 0h‹…B^ dR 0kÖ,¾fÓ¶Áña U‡ úä- Ž/jº§‘Íf‡,XÀÅÐÐsæäÑÆýû÷ëe¦Óéä¡n% ¨ß¨V«_< ƒlk"à¼U-?N±Ý»w£­­mí½{÷f¼{÷®3ŸÏ7V*•,µË$1OÚJà˜À!A« yzÿÍÀÀÀj÷†Ÿ~¦\.Ç._¾l¼zõJ$Ñ·wvvFÓ¦M“ŸW]]ýh\ýÀçFF›wë÷9IEND®B`‚gImageReader-3.3.1/packaging/win32/skel/share/icons/hicolor/16x16/emblems/000077500000000000000000000000001351740627400257545ustar00rootroot00000000000000gImageReader-3.3.1/packaging/win32/skel/share/icons/hicolor/16x16/emblems/emblem-important.png000066400000000000000000000013361351740627400317410ustar00rootroot00000000000000‰PNG  IHDRóÿasBIT|dˆ pHYsvv}Õ‚ÌtEXtSoftwarewww.inkscape.org›î<[IDATxÚe“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å&«ô?†•;%ì”IEND®B`‚gImageReader-3.3.1/packaging/win32/skel/share/icons/hicolor/16x16/mimetypes/000077500000000000000000000000001351740627400263445ustar00rootroot00000000000000gImageReader-3.3.1/packaging/win32/skel/share/icons/hicolor/16x16/mimetypes/application-pdf.png000066400000000000000000000012251351740627400321240ustar00rootroot00000000000000‰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.3.1/packaging/win32/skel/share/icons/hicolor/16x16/mimetypes/text-plain.png000066400000000000000000000012041351740627400311340ustar00rootroot00000000000000‰PNG  IHDRóÿasRGB®ÎébKGDÿÿÿ ½§“ pHYs¯¯^‘tIMEÛ 2à÷IDATxÚ”’%¼{…O8¹Ìî½23¹’½Œ^Ç«º23ùx[ÿ«+ƒ*3·a^ÞéÙ)sûv–Ï7óôöö¶ …,£ø;ÜD"qÛ²¬ >²IþCøêÇ!N#—Í¢V¯Ãó<ˆï#°,D#tvu¡¿¿ÿó=TP¶ò¡ç-Ó„Ñl" C!=…P8 Ïu‹Çáóa­mmÁù1–ç¾q>{æ Æ&&P¯Õ`Û6R©L>4ÂAšÎŽT«UÌ[°Ê÷ ø&½QÝxÑ$üSUggšŸ&8ÃÃÃè7úÆx,† ´Ï:ÐêîîF¥RÁ¼yóðš@aq]Wk: ¤ÇÇÃ0¤Ùl~šÂ(¾Ÿû©S§033ƒ|>¯q[[[u¾ˆkcóªL0gîÜŸ÷иÚy¢Þ…b/^ÔÚã/™Lʆ B\ûF äÕË—òìéSyôè‘ܸqCöîÝ+_ásB²zåÊmË–- ÿ´L Þs½^—L&£Ç‹Å¢ïÎYºtéŽÿÿÿ?òCNŸ>ééid³YõgñæÍµ)‹¡‰©©ù\nO.Ÿ÷~?…gã„þ~“õ‚… qŒqü‚ÍBo¢cä ”R©$>”ùóçïèèHà'¨BWW×M®¬Í,Ãø‘Ï¿ße`þÍûR”`ôfhýIEND®B`‚gImageReader-3.3.1/packaging/win32/skel/share/icons/hicolor/16x16/mimetypes/x-office-document.png000066400000000000000000000011271351740627400323670ustar00rootroot00000000000000‰PNG  IHDR(-SsRGB®Îé pHYs¯¯^‘tIMEÛ#.B¿ ·öPLTE+++211---,,,())'''´´´ÆÆÆíííÿÿÿŽŽ‘“’’•••–––ŸŸŸ¥¥¥¨¨¨®®®¯¯¯²²²ÖÔÔ×××ÚÚÚÛÙÙãââæææèççêêêëëëìììíëëíììîëëîììîííîîîïííïîîðîîðïïðððñððñññòððòññóóóôóóôôôõôôõõõööö÷õõ÷öö÷÷÷øøøùøøùùùúùùúúúüûûýýýþþþÿÿÿhz}ëtRNS 249=>?@JMx€‡Žþþþþ…dƒbKGDQ”i|*²IDATxÚMÊ–Ñ^+³vÖFœ±mõý3V=ÿW{#¢kt:+àäår¹^‘ …çØK’aXŽçù5–çEQTäB^Q5Ã4M½§À´Ü"Ël-× <×T¥ž“ ð•žOãæð¢À™|}~ÜþUð’žú†8f/6š#p…W¼ÿ¾Ü„ö°ïã¿«-¨!õ|cv']ï@Õ1þF®:û¹Ù…º}â¤ìpªrËÙ)IŒñ‚WIEND®B`‚gImageReader-3.3.1/packaging/win32/skel/share/icons/hicolor/16x16/places/000077500000000000000000000000001351740627400255775ustar00rootroot00000000000000gImageReader-3.3.1/packaging/win32/skel/share/icons/hicolor/16x16/places/user-trash.png000066400000000000000000000013561351740627400304070ustar00rootroot00000000000000‰PNG  IHDRóÿasRGB®ÎébKGDÿÿÿ ½§“ pHYsnºnºÖÞ±tIMEÛ "·wŒ<nIDATxÚbd€‚e«×spq±Çp°²Ø褦4Íb(XɽmÛ¶¹‚ÁóXÛ,b´‰Á úqlÛvëöo]&““¶êûâ¤NÕÉ©(/ïPçy^¡ëºÈÍÉMeegÍJàËì¼u?‘Ì\`Ü!µ|ø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:E÷6IEND®B`‚gImageReader-3.3.1/packaging/win32/skel/share/icons/hicolor/22x22/actions/dialog-close.png000066400000000000000000000022771351740627400310420ustar00rootroot00000000000000‰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}œž ¡¬´¾¿ÆÆÍÎÞáââäçéîîñôöùúûûüýþþ*:$/µIDATxÚc #à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½#?¥.íIEND®B`‚gImageReader-3.3.1/packaging/win32/skel/share/icons/hicolor/22x22/actions/document-edit.png000066400000000000000000000020131351740627400312250ustar00rootroot00000000000000‰PNG  IHDRÄ´l;sRGB®ÎébKGDÿÿÿ ½§“ pHYs „ „ªâcytIMEØ &Qã‹IDATxÚbd ¸à蜠$IU;³˜ùÿ¬¾µmÛ¶mÛ¶mÛ¶mÛöî°ÝÓÓ»~[kÇ{éÌH{,®m2ð$LØ1ï’%ašø ßA§òÚ&\µ$ѱ7£¥ŠòÂàrå"y„;ùF¼Ž—*rõN4ýè¤×ó‹Ï—ÄáóõÕÄ’½Á€$IȲHß ¯òª/ÿízDFé=?”K,‡r;”êNIzq½Ì[¼-•ß ’,ÚyT¼÷»à´½ óŒø˜¬>2$Ô+ý[ÊÂY.hÕTU=®­Xï­6 B+C uÞB°ï熦÷ð{ˆžÉ‘GÆ9Ùp¸wô©ÕJŸ8dz…Ä÷^ ÿ’ ®?tO21£«‚Õü¨æ@Ï6àðüý£Ð¤ôýàÕï#Ĺ—E»°ÿŒ I±3¹ƒÐuÔà½ìñò¸ ˆ·ÅïHµhÁg»Fu#;Ï…0wý „êeX )’üÄÚK%±Ø…8øÞ¿/ÕŽ@q>'ŽaW3fÁCTE¡kU²ÆgþѼø¥_N€ÅoIµTõšQ#æñ0LÐ}Ü \.7 ‹›¨YLfæžtDÙ~ aÆhÒO‹µ ËÅ6£MÐuô%bìJg·Ñ¡º—9»ÿæêãPêׯO¦L™xM,> ϳé8Ý‚COm'G*'ƒŲòàl?Ê•+S¾|yíÓðU+v=™„Plt~GÏm¤ÐyßÊÊKÁLÙ “?~Z·n €ªª¼OÐ;âWrw¬ »5’‘3ŽqùŽßô3¥™»Ï%:Nr‘&m Ú´iƒÕjEûX_µbgŒgp‚C’O H‘â1h…Žzõ³zõjräÈN§#44„“'OXý'WÌ«³²FßÄnºNõ¢‚ 9=£G²¬È*“>]z„ÄÄØØ±s§uè¡í€KŸ=Šè¨®\>IŸÈqBH•«'Júòüú;voØ;Òõ6XGŽÙ6<<|# øÅ¿¸Ýn±lÉ"‘3{qrï<á´›„¢(BUUá÷ûEXXX l±˜Å¼ysÍýõW-@âShbÇ#Ü'ŒFý¢@xO._¾Ìœ0aÂ/H5ñç L%Ö¯_oNž¿:[£ô”}Ô_^ž/¡€èͦ™ÿ;ÿ Móél¤°3ª"ê`Z­avs ˆõ_€ÿr‘`IsðNŸIEND®B`‚gImageReader-3.3.1/packaging/win32/skel/share/icons/hicolor/22x22/actions/document-open-recent.png000066400000000000000000000020101351740627400325140ustar00rootroot00000000000000‰PNG  IHDRÄ´l;bKGDÿÿÿ ½§“ pHYs × ×B(›xtIMEØ$Èýƒ•IDATxÚŒÓC˜ähÇñoPh[cÛöemû¼—µÍÛØ:­í±m£mŒšÅîr*[I+“ýž'N>ï?/º#wÙ.2ç“X㡪AœUùœ^ç"]ð»ï¾ûÂÓO?ýªÚySŒÇ®l;UÂmu½fO5 !Ü($göât¥#ä¹ZU0V®X¶ý¯oê¬RÏ!CÒ4[UUDQDÐ@ãì8SËúÓ!–¼ó$÷ŒÉÆ.*¨ˆÔ{ÃÖ•ÛJ&ý¼9ácf½·ƒ£‹›D QCo¸9<>Þøî/?6…g¦ö"/I¢±® Ÿã’á݇3eʨQ$ä,Äë`Aºª ›üº¿ KjÏÆP»¤âóù9uê$ååx½òž™5))õyÆ>ß[Æ 5w…G…ãåÍ í׋ìD  €ÓåäÂ… TVU’1ŸÏÇ€™Ÿ’l÷¦ôÞwBFPèh  Ñ»M5J0Äív³ÿÀü~ì¾Pì×GÌ@гƒ,¤+Ö1ºP±£I’è•aãŒÃG³7H‚ è¶lå ÒRÓÈÍÉ%)9™óøSqW_5ö±Ž˜QíÜb±p÷j\müyúJé•Û‹¬Ì,ââãinSøáX¡»† ÿ”ÈfØØ-}-Åàyc0«à +_A yxLIVD‹•’z?K÷Ts¤Þ¡xÛz¢Jà acÿvn½zõâóÙ—ùôð5\”ùõb#’,£¥­ mV‘ä¿·8Žýö;àï ϰiÝ1mê–ÚóÙp"ŸƒN µY„©ñ!ék#¿9îø¸ ¨7¬ØïÙív&OžÌàÁƒy±¾—Ë…,Ëdee‘››ËmîV@¸Fƒ ðÔ ÌÌL222P}vt¿/*€6£7Ä‹D"ú|z’lÁéö„nÓÑÇÆ˜ÒPm1x<q:z]khØ»lÉâÿèˆØ£bSu抵ê¼^/••U€ÊÀAñùZO}ýåç/µ477™asnˆkÕ†Ãa-Ž­©®*\¼tÉ“çί§37„oЯfØãñ’ž–ÎÙ³gήY·æÁ-›¶\ƹ‡ËcÄEš[š._¶ìù}ûö_Ã#\^^ÞRTTtÄ\©ñ:C}þ5µÿ¯¾ª¼ìÑÃG¯p9€¬Êš þàSゼI‰×IEND®B`‚gImageReader-3.3.1/packaging/win32/skel/share/icons/hicolor/22x22/actions/document-open.png000066400000000000000000000020741351740627400312500ustar00rootroot00000000000000‰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.3.1/packaging/win32/skel/share/icons/hicolor/22x22/actions/document-preview.png000066400000000000000000000020761351740627400317720ustar00rootroot00000000000000‰PNG  IHDRÄ´l;sBIT|dˆ pHYsvv}Õ‚ÌtEXtSoftwarewww.inkscape.org›î<»IDATxÚ´”¬%I†¿j÷ó{÷ŽmÛv´Œ³Þ6\[ñ‹½á2ÎÚÆØ¶í¹¶»¦ºÇöß,}u:BJɃz½¹7Ræ2>øè±ã‹4M „ƹ¯P_ €Z­†iš!.~/WkKË,à°ð!—ƒ7oÚìwb§NGèØ1 ž‡ã8 6®… €«Á̇Çb1¶nÝFºàñݧã Û¤V=H×P3Oo$2yÒDêê빙΃µÀýåË–q<éðéOû6| O¾8“Š×ëVïããŸvñø”rÙÿyì±G«‘òæàŸú™Š´t?sžÁ¤™ƒéÕ£…Óž —)q•ÅÃG÷á—¯—Ыs= -bÞܹüzÒ€ÀÚx<Æï«ò 1ˆaúa59œ©AUY»« 8¡nmÌxx2Kv9zôh`zn ®”Ë€àЉ4ãçŒÄjvp,šëLK£Ù5iUáa*u.¿DðÜ8g",Û£„Ûhãº>PÇÅ£ÙЃ8V<Ðlb½EC[ †™¼½!¸[·n”Š%zviF×5ÛÀQß:C`Ÿ eMà!•=Ã.…Ó…›‚5 8RJ¦îB©T @†.p¸ÿõ7¨žçѧټy(.OÞСCèJ‘Þ¶L¦HÕM ÃÇ@U Ìx+{Œ)S&s3sçÎ%OðøÄzZ¢NÇ Ä+™¤+’h±‚« ½«QúõïO*•¢R©Ü4y]zþ…çùö›oimKѳdsj㦅«y4•óDdÑ…ضÅ˯¾ÆŠ+3f €¼^u›•Ëå MC;_|öïßÏêÕkÈå AìAÒÒÜÌ$u”Óé4_~ù%…B·ß}ãÇŽÖÞzóÍ«W¯^ÈUòÁRM”¥RI–Ëe©\”Õj5xTu“*aÁ³aÃÿÌmoo—O?ý´\§ú:”ýè£ÆùF\x´‹•ê:±º<~ ¨’šÀ²,fÍšYQýóÅgŸ±cç®ú×ßxcõÙ-sC<Æn8Ü` À®9uêäïÊÊ*ÿõë×»øðaæ¹³g6lØÀœ™™¹½³³3Æß¾};Í÷ƒ çÿøñƒá°ôãà`ÿ‘ŸŸã~îÜ¥C0Ëccc;mllJjÃÃÃÿÏ›7/ 3„Ø¥/_¾|c 1/^\~üøñ11±¿&LxŒƒ¤Öy€ÜÇ%” ÷ó;wî< d1¨ð~Ô€4IEND®B`‚gImageReader-3.3.1/packaging/win32/skel/share/icons/hicolor/22x22/actions/document-properties.png000066400000000000000000000016301351740627400325000ustar00rootroot00000000000000‰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:;;<IDATxÚbaÀ ]Î5^.1ð™IVž»»¿æ Vâ^c7áÔXÇ5pwwhqwwX%Ùý}šTóÌ´(»±%«Åç å —\IÆýcƈˆ¼ÌÉÀ9qL|òÿ…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 .©(½=i´wvÜ€†óáÃäóùâ÷¯”ÉÔE 0 hÝó<0—uMeŸF«Ê¤»P—EgæßIEND®B`‚gImageReader-3.3.1/packaging/win32/skel/share/icons/hicolor/22x22/actions/edit-clear.png000066400000000000000000000023511351740627400305020ustar00rootroot00000000000000‰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¡ùkð(ñ–IEND®B`‚gImageReader-3.3.1/packaging/win32/skel/share/icons/hicolor/22x22/actions/edit-copy.png000066400000000000000000000010021351740627400303560ustar00rootroot00000000000000‰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"±2áIEND®B`‚gImageReader-3.3.1/packaging/win32/skel/share/icons/hicolor/22x22/actions/edit-delete.png000066400000000000000000000021201351740627400306500ustar00rootroot00000000000000‰PNG  IHDRÄ´l;sBIT|dˆ pHYsvv}Õ‚ÌtEXtSoftwarewww.inkscape.org›î<ÍIDATxÚ´•sä8…Ÿìx Ì;ËÌÌŒEWx ?á˜¡à˜™©ð˜™—™™wí,'ŽÇ¶t-WÖ5çcêªÓÓ§§V«† !ð„‚Pl`¬yc+䡸[Zräz ySSSKzõj±&1åsî÷°v­¦8ÿÞ»bË A-a­’;;+/_5àñGy:…¦ûï×=M » ´œ¾ÕÝv«‘Þ³eW\Þ("‘•¹Zå‚02|øš!/¿ÔÄ4 N2XMô0¼H$€PU]Qû톛H çÐaôœ:Ú[oÑE,ÀýÍ“uúå—s˜ð ÅÜÎYJ ¯§æ­·™Ìuç‚BBï¹Ûp[Û`·¶Â%“É :p8MÐùÁ+§ 1×wLˆkö._n¦¶ncж žNC†tN@WQV÷Üc =ïüy(d½½ˆ––@‹Å‘øè#K²Ç2VÈ%Ð¥ßCñ²p,²6˜tù…àrÌž= N»”()FÞÀA°î»Ï‚sæ q"À]*˰Ç7"ƒ×Ö.<…‰¬‡ rNïPTuôºûnKå<€†Á~|Mp•–<æ™§iÉmçÎThÉ^_í=Z uòdì½í6ËqÝ9K ú‡D <Îçî¸îzK©©…VQ &—LP•® AóâùˆÍœ‰]wÞÙ@C‘‡ßˆ ¥æ8èüô3Äè-/‡ZTF›Ä™êY¸É$<×…ý[€ß*ÅÇT X9dÑ"=²{7Tj©i¤…®œ1¸ÜŠ ¸S§b÷—_Zžç͹(\Š0í·`ŽýûÁÛÚ|ÌHY¢Ó.Wêw±~=†.[¦+ªºRŽýMðÛ²#€MsæèüÐ!d©­8à'u$ÆGëØ±`55}ïÝT ÎÆè¿t©Î .¹¥ð¡Œ ³fªe9ƒ(€}‹—”À&àŽ4¥vܼyFñ襉mÆ¡t©í0iŽÿðƒé9ÎÜK¨,¾c¼Y4h!º»ÑKíå’Øà£“ ÛÊ©Siކ´¼z5É(¯ÏûZ¶h®>¼v†ú̦éê±#ÓÀÅ…oß¾‘™™)àœœîÝ»GÍÚuX³` ç7MgûÒ)xùøbi¦Í¿û5X4g4²ÕA*måÇ©6mÚˆi+{™‡fgg X¥RñìÙ3ôëEó†Vèëé`eõ¿ì¬ÎøÁ)\¼t©ÄºåE@º¼“dƒ•G® x:‘Ùc’±±«ÅÝuZLèÅä)ÓÊ„£Å²§¥‘Q ÍÍÍE13þœÏÚÙM°°ªÅ‘yú,jIDd,OŸ>U–‹ŒT< gšþ÷bÎli-ÐeÃMØ?Ûk»ÚʽBIF}ðà•lx–+mÈËV<”lsä×?ï®ÂÊÆ‰¡,¹ºB¢J5]?~,£©êíÛ·åÈ×7SJÀy½Íåë»?xpf<;†ðþ¼3oÞ¼Q]šzÍš5 ÚDåÀÊ64VbÌÈÁì[ٜ翞çß§¯Q"5õ»zõêÕ Ú8¨0ãâð±ÃûÄk®J%¥”¿íÿòI•ˆ*ÊôåAåÊÿO‘*òÝËúGY*ñð*Ïú|[Œ$&/IEND®B`‚gImageReader-3.3.1/packaging/win32/skel/share/icons/hicolor/22x22/actions/edit-paste.png000066400000000000000000000016101351740627400305250ustar00rootroot00000000000000‰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/†‰$¦BŒIEND®B`‚gImageReader-3.3.1/packaging/win32/skel/share/icons/hicolor/22x22/actions/edit-redo.png000066400000000000000000000022761351740627400303530ustar00rootroot00000000000000‰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(/ü?Ðð?ùôƒ#û^¯ëIEND®B`‚gImageReader-3.3.1/packaging/win32/skel/share/icons/hicolor/22x22/actions/edit-undo.png000066400000000000000000000022621351740627400303620ustar00rootroot00000000000000‰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®‘dIEND®B`‚gImageReader-3.3.1/packaging/win32/skel/share/icons/hicolor/22x22/actions/go-down.png000066400000000000000000000015501351740627400300430ustar00rootroot00000000000000‰PNG  IHDRÄ´l;bKGDÿÿÿ ½§“ pHYs „ „ªâcytIME× ’N õIDATxÚbr€Ÿdû¢S‹m¿ à”€cI0ŽÁâlÛ¶mÛ¶Í2ï϶mÛ¾gÛIÖì »¯³U±ó_c~30’èÝjiçµí—÷_²ï¹ã‚ºæõèªówç”Rôï¹7&!SòŒ¥ŸÜc8†©=[B„ Î*P ] –"„㸃Â2nB*2>XÄÁaúVフ†=×Ó0!¤ë[(¥4ìn*ν㹇*uÿš™ ÚÑ•ŒB†Œ“.¸…J%õo~çûêºûߊ¶ÚWž}èK—~à­}àÅË3á뮚>â€ÍÁ‡aàÜ€J]¬]H œvòqœŠ¢qaµ„…/š´ß€+^Ñ‘ -“;gß=¶ÚrÕÕVÀ4Æ!ôCßZºRR?ÐúÝq=d3,[ÞŽz­*)7îïòXׯmbh­³ãäZµrÙúlH ãP„ACh8Œ¯£áDÈhë(#_¨¢ZsѨEþ„Êô·^wæg§¯ŒÍµíjÕ;$B~SÁ $&ˆA,Ik›u-¨W/¢Ø¾àoBË‚â<97øÝ­´Ÿ¼ÞÆÛl°úZë!•J#‘L¶mX¦Ó0Á¸B)âÀÇü‰_ÕDë,þ¾Œ^QôË[ñG(ç’…?kZ–…¤FSú±J*…tZ¿Ou~N´¾_0é+^ízoå_KÑ/†A^¡I¸DFÇoµÓ¾H&lØúa™& ÎA(Á¼‰?`Á´__ ‹ó&`(†HÏÙ£sÿûæûBÛ\$4šN&[WœÔWÛ(w`òÏïÏ¡·B7&8ª,Q`Æå?~ðdI‰ 5ü´žF¾yç±f,åùQi;&¸«¸¶¢£á8×|õîS0LÛ²ðí‡/ TÌÝWOÇ01ŒôËóÊN¼Ñjk¯·W¶m¾ùøõ 3ïNÃÅ1гîX˜_tøœŸ7ôû«ƒŽñÿ¨„ô|8å핈Uƒèj…‰Ê ½IEND®B`‚gImageReader-3.3.1/packaging/win32/skel/share/icons/hicolor/22x22/actions/go-up.png000066400000000000000000000016001351740627400275140ustar00rootroot00000000000000‰PNG  IHDRÄ´l;bKGDÿÿÿ ½§“ pHYs „ „ªâcytIME×   >’ IDATxÚb •¯‘ô)^+M¬z&bÉy´q|ýòmç¯ßö)‡Î硚ÁÿþünWSÓÕÓ–Pcdø?…=Ì„HÚ»(+‰O ò5ôJ@·a~WÑñùm×¶mÃêQmcØŽêAÍAmÛ¶¯­ã“dq“\Û÷Á¼ŠÄ”éUL˜<Ìò`´¼©{ÿK÷ÅÂp,LK[ñQèØ*P óÊ$$B£jÀ²)8£”â‘\'?– × e+ùk»wMöZFœjUµ:Æÿö `TÂéçÝÇu 8 •‚ïs¼ôàå Üs²ànÅÞ>tl;üç #þý¹»/tú¼˜0ÂlhhÙ\×a)σe B’VcŒ:yˆlÇ„Pá¢VøçÓqjqœæ„õ²Å< ŽmÃó\¸Žˆý €IF @Íúþq…•„cua–áœÁ¶,¤"9¥ˆå~–ˆë.6&Þ``!¡dñ=æä"ÖOl{6‚0D³é'Ë@#š¾ àå hÔ|¬—¸w‡­_yôÞÛO2` Ìå4:ºÙ÷ÙåÍ¿>ø^b!XC¼áÃy"e‘”[Xp¹œýõCØì™wJ.å³^IEND®B`‚gImageReader-3.3.1/packaging/win32/skel/share/icons/hicolor/22x22/actions/help-about.png000066400000000000000000000021261351740627400305310ustar00rootroot00000000000000‰PNG  IHDRÄ´l;sBIT|dˆ pHYsaaÁ0UútEXtSoftwarewww.inkscape.org›î<ÓIDATxÚl”ôH†ŸN'éÌoëlÛ¶mÛ¶m£t¶]:Û¶ÛÜQØÝ7›ÙÛ©ÍÎ[õF_çùšŸ°ÖB{9€ Ôu@ „]ŽC¹´—¿°^~ÓÓ_ZOÙÎ ¹®òäh)¥ÐFÏ“‚¿ú*ùÙ%‡môâà ˜ÄT챂«ûl«/ÇÎyxóµ–[qýGпäx.H3M%J7s ?M˜5}ËUFœué¡›|ÔÛ*`Å¥Fn0q‹ßöƒCÞh‚¥Üjà€,ªF´•µ¼ÿÛ\°Íi!Æ)Ã÷g¢g·ºÀ°‰Ra’QT ž»d[´¶|Û'HסJ*ëlÒ=Ç8vM¥T¯¹ Ãâ0åÞ7þÀ•Ï“ÔRK˜9„©hÄ[ó%¦v»FkŽA$„Ik~q܆†%¿Í¨ò¿ê™Å—è«|*ÕˆŽJ•ùåÙ ª`´Ó&›6{hЧžëàû®òéœOIÕ iš§š¹uÌ Zk¦Ï+£“²¤ál:™Ô[ûW¥RÞ¤’: =ðDiÚ0"0T«UÊ‘fÊ" mÀñ[c¶ÒhýWkŽ5ßçY¥ÊÁ¹]<Õ´ëÓ­ÿV;ù¿Í‡0„ ƪÀM¤Ì;çÜ(çæ€IEND®B`‚gImageReader-3.3.1/packaging/win32/skel/share/icons/hicolor/22x22/actions/help-contents.png000066400000000000000000000024061351740627400312550ustar00rootroot00000000000000‰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ð?>N8PwÿIEND®B`‚gImageReader-3.3.1/packaging/win32/skel/share/icons/hicolor/22x22/actions/help-hint.png000066400000000000000000000017151351740627400303640ustar00rootroot00000000000000‰PNG  IHDRÄ´l;sBIT|dˆ pHYsaaÁ0UútEXtSoftwarewww.inkscape.org›î<JIDATxڜԿëX†ñwí¤išööÜtlÛ¶m{æ#ŒmÛúilÛ¶mßc 6Ö{¦ÿ2z∠¡Ñå<÷¯Ìy¶ª_ñ?Â\Ÿ[4Ð0ìÞZø`Ò‹_+ómíÑÜ~"¯3õ<§Äk=ÁÛ¤ãêi‡Ýsñ#2÷Îaéà Êcü‚HœÂ7—)éê3ûáMñ|ü~m¡C¬ø«Êük÷)3'ˆ¿xáõµê{jiûÆÂGùu\6ù»ˆr› uå+Ô!4V÷£*D ø[X„Ó/ë°^©øå£ËÑr‹.LË}>Þp‹y?5N–Ð~u­²½mÓþœTRÁÏu@rÑ6P³¶­Êâ‘ÆøóðtÃ0’l ÔÖÕ@f½hÅ(˜ûØ•ø9Æ€qväžV…1ÍÈΧ…ööåóǶĤaÇÄ<œëÍH;18ç”ÏãÊp½£¯/óÔ\>1a¼r9ÔPµ… ûÆ?)üE¥;¼ÁOCN^"%Âb˜s9Lµ±ÃÖSu›æ_a$W’°ô?žRT|pòðz-=Jg!‚Ä•‘dN› òØYÕ‚q~M$בâÛ‹Æé>ywÒðϨà¿ê 7AžbvNH)aENº{óBµœi‚ˆJÇ#"þ·ó”®cZk®Ãü7;¿²q<ø2ß¼~ÞÚ]Šä'ó/@°"ì”jiYqu]üfÒ-FÓ7Õò™ª§sA'Õ²±óT³|‰ù&Ò¦’1p4ÔWCàÝCë´ 6 ÿmÔ}«-‚ýôÁœN)u R1·ŽD Qoï<4wxþ‡BøÏ«úx$2O¬óÙ£Ù2e„¿ÆÊíٌ¨”Ï£¾¾Y›@*i†&±®¨~GaéüÉ› \uä ½;¬éEÄ®Pð=šoEÌ O˜Ž~½† û˜Ä/zþPe—Êì8F½žaÿõ î¸þ”‘&Ù"…Ihm‘$)¢°„E[ÌŒáá¡I7hÒ°çÁXk~Š.†=÷ÜI’ÀZ¶˜Ä¤Çxæ¯EQôô*+¯²vOo/ÅqÜœçù Û·oßr FD`¿¬¼R­†¦6³††F °6yKHÈ»8†6ŠIEND®B`‚gImageReader-3.3.1/packaging/win32/skel/share/icons/hicolor/22x22/actions/insert-image.png000066400000000000000000000017751351740627400310660ustar00rootroot00000000000000‰PNG  IHDRÄ´l;sBIT|dˆ pHYsvv}Õ‚ÌtEXtSoftwarewww.inkscape.org›î<zIDATxÚ´”ð4GG_÷̾ClÛ¶mã¤Û¶mÛ¶mÛ¶ý÷âv:›íW¹‹ùªÖ;¿z53ÝbfüxJ¤€ÿ+5.2g&äŸfï™{€9çœsÁ'Ÿzê¢,Ë‘Þà—÷tÑõBHëõúò@\’¥ýÏmð§>Ý÷Ý8§Œ¿èÕús –¾Á”ÓÕ È,@nÊÀÀ¯Èsøòó„îeòRPL… É{èÀdB³ß Áß@Ú¤<\©}:E×äül¬Šfp-XxbÐ ïÀ=|õ˜õ†—‡L:D¯1%Dƒ@, xGý{Á;D5hŸ2غy0>¦O×$ßtW¡DI²aôŠw˜kžïiÌ3öâ0ã¤5žÿÜñОÅ&Iø.VB¨BÓC_ ;ï(ö=Æ{Ü© Šètúð7ùç& ‚™qõ+ ªHq„#¡C'ìü›Æ@»®´ÆÔ˜l"a¶©O®|óUÆëïä|= ¤ig40Í`ÆYfa¿ÃŽc¦™gå×^åÀ}v#„`”h÷TÄÚbXÛ$ÕãM¢´ZãÆ™ N_ßf5~MhqØ góî¸o±þ#Ë10õ7œzî¥\vÙe/Ÿõ Ðl6©øˆFE©U<¹V ‰òÃà… •JuÔ¸Ñh0Ó¬3²÷»°Îôoqøã{0å”SÚæ›o¾™½ÿ+ã(ŠÐHÉLˆ#âA¥/pµªg‰Åã®»îâùçŸ'9Ãý#ŒSÉèûa眤iz?ð0«Z`…QEñ&øªÒj{Õ*Yh\‹£>†ë¿½ž ŽÉˆ¸/'tŒþþ!;ozÖ¼v®úÍ^¸pº¹Ì5×\›<ûì³åyŽˆ ª£GÙˆ(ïñ‡yŽZ)güš ͺæŠóJˆßžƒËVyâðÖ[o ­½öÚ'þYÛ¼ôÒK7ZoÖõ&ØùüĘ̈8ÇÙ[{\U£Ñ®Ð·Ê ,ð*cû2 vÄq¼¨™½<œÛ×_›ÛTí‚Ô&ÛsÉF,é$Vð|qÌéÆÎ3ÎÀ\õ¨Þ6³¾< ÇBnBÍ×b`\ Pþýc*?ŽëЧ¹'CãQ†@Øyˆ¡ˆ:Š\lÄW€æ}CdyCŠ·Sª.IEND®B`‚gImageReader-3.3.1/packaging/win32/skel/share/icons/hicolor/22x22/actions/insert-text.png000066400000000000000000000014471351740627400307640ustar00rootroot00000000000000‰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ÍÑÒÓÕÖÈŸ!IDATxÚeЃ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Õ„0IEND®B`‚gImageReader-3.3.1/packaging/win32/skel/share/icons/hicolor/22x22/actions/list-add.png000066400000000000000000000015751351740627400302010ustar00rootroot00000000000000‰PNG  IHDRÄ´l;sBIT|dˆ pHYs × ×B(›xtEXtSoftwarewww.inkscape.org›î<úIDATxÚ­”5”$7†?•ÔÓËÌkffff†ÐŒ±3;F­£%¯w„m$6!J#D)"èK>?Ö´ÆM½ÌÓQÇqùðÍSÓ鶛ͪéU¯?sÁ3ÎgŒÕ¶â%ž\Ê£”"#¡j«¤.æÞãG+Ô“ÞžZL+¡œMôüºõë—̇ ><áÔS˜H6±¾²4 `´BD0JpÊb]‚(øgâepBi¢-èb¢2Â͢-–xø‚Û˜ˆ¶]d’4aùÔ œDTÓˆV×x_Oà t@A(H=©Ø&l(nfÑØÌÖ*Tã”Á`¸Î¨’9‡â%¾9mä´N<­m4A`hB ¥ÿŽ}S g÷_^ðx¼ëÎ{B­)úMlª­üVñ"G"|˜àXhò$¢Ð"´š¸ñ¨kØÍ# Žl>ï×ÿ*ËoH=i'­Zü²‚17ÿ’_ÇNÔùf«¯eµÒd4±¯ÕÛ+îSû„ò÷ª¤DF+bå}ûÎ߯œ”Im b[;0±Â:K1.¡©¡E¡²™³&MV‹¸¨B)Š Uv žâ}Ó¶Ðm,ÛŠÖOÍà“¦´™Ë/¿\öÜmOëë.žØâ½G{Ã`0Dh›×ö÷÷ûýßíK\9-‹]‚©þk··úé§»ÿ †nÂÏìY‹IEND®B`‚gImageReader-3.3.1/packaging/win32/skel/share/icons/hicolor/22x22/actions/list-remove.png000066400000000000000000000007571351740627400307470ustar00rootroot00000000000000‰PNG  IHDRÄ´l;sBIT|dˆ pHYs × ×B(›xtEXtSoftwarewww.inkscape.org›î<lIDATxÚ픃îA‡gUÛ j»Am÷î£Ü¨v£>B£nذ7®m]ÛÚ9=»™šs’owø‡˜ ü-ô‹ûÅ…amp ó:XÞçþáÃF.\xùé©SÃKø™¶` ߥý¿ù}Z3háB Òôáþ'NÜöÅ™W¯Î, ‡sµŠj8 S7&ý7˜Azz¤}¹À¦ ž0êÝ»Ñóçˆx›/~qñâüqË—£ùö-šïÞ} ¦F ¤óŒ‰QQ á7oð)Á¦µkAáðš¯KQ¯×‘}ö V¹ì%¾Ž”5DÓq`Þ(]a£TBêæM¤“Ið¤Ip‹E߯±n…C¡Ý£dœ±c%×Ic‘b†R 5Y&¼eëbôªU ÀÕKEwïÂøÐY¢2ÂkŽmϱMóûMù…ïËLæoiéÜl4žIzÏ4æWý¯[¿¸7ˆ?ÑŠè®ÂïIEND®B`‚gImageReader-3.3.1/packaging/win32/skel/share/icons/hicolor/22x22/actions/object-rotate-left.png000066400000000000000000000022161351740627400321630ustar00rootroot00000000000000‰PNG  IHDRÄ´l;sBIT|dˆ pHYs × ×B(›xtEXtSoftwarewww.inkscape.org›î< IDATxÚ”•€ÜJ†ÿ ÉžïjÛ¶mÛ¶mÛ¶mÛ¶mÛíÞ6“—ôÕÜ~‹ ¿Œ‡˜¦ hUòH\Z£¦Q&9vG–ªø ü Eþ} I³•vÓ(_•–ù÷yðþØâÖEvÆdsfDªD±êqáÆø.ç`*d!¡Ø,G¶OÝ^äÅ?‰›ØUV7ä¹ …dÌ„"°y÷ZÄã;‘ÖOÀ½+ŠD ¶óô½…&ù-®—sãÝ|Ãã%IBð?öóSqÓzzߊػú)¼Ïè ¼‹¯?f[ö7cU•;n[~Ç{êÐ+¬C× èªññ©}üéàxÅjÆF‚ttQ–×â×—I5#Žbˆóã% ÎWºZZx\˜5f/’¦Œô9âÁÍ10 óãËö¬xñ5×l®œÓÿ*¶éOúS;㣃ËE ®T'»cÁ´} 3.44¤M¥z™¨¨Ñ [rï ‡×H^Žå’Øœù™ßë8cÔvi4èS(B¿<ûl\ù<  ÙZ·uv–ai躎sû#ñøíYÆRð“ÓÏÇ]Hž(]3[ ‹·ûìöùÄ1g?‚a04Aá&dÝ—~‹«d›ÝÖ4pÁ~â¦n¬||Ï C7¡[rO EÒÿV\"ñDg±T³C‰,ªf›× ­Ü(±ŸÕrÎN …¡n¼}%ÁNEÒñæe$4MŒ÷Kñĉ[ºf‰ˆÝ™¦hò±Ñ`±üX£û¦‰ö+g1íç²Ã /ÁÂeÒÉ‚Ã9k=Kxúàõ¡šòýŸÄmJLtâ"^<ó%ŠˆÂ§E•Ä'Vk8žPHc?ñ ÍV ã –²ž2tM¾ò¸J••´DŽ$¢6}¢4aùxOÍb©&Ã'>·Ô¦hŠñy=RdˆËÒ  >ŸÚ9X0øÄË—Wˆàe$Ôô¼‡Ëïr³K%Ê»wÓ­\%RM£ëÆ —)ÝPLg2ÂÒ•B‚ƒ;(€áx’¨âƒ âÉ“W"ïYöÓ)aTv/v/U.o ïqæuqÀ$8{ô)ß÷Z“# ,*Xqƒ‘.»=ü&Ä AÆÆÕû¡ Î~ÏvéÿËW(U÷‰’G­] pvp¼nKîæ­ÇÂá` (:$K&~ú ïeìÚv·¯??¿ûò°t¿=„x‡«ÛÕ‹w¯.Y´/_¼~‹¿pîJ\¿rïïv—ùë±IH*ra¨O~Ò.]ÆŽD‰â"a¢8ˆ3*ž>~Ž[7ïãî‡8{ú²àˆ9v÷•áÝþé)œºwrEõ5“Õ÷]H¤êbK»_»ÏM–áΰÌšµçJý5œ5-.åomÄIEND®B`‚gImageReader-3.3.1/packaging/win32/skel/share/icons/hicolor/22x22/actions/object-rotate-right.png000066400000000000000000000022121351740627400323420ustar00rootroot00000000000000‰PNG  IHDRÄ´l;sBIT|dˆ pHYs × ×B(›xtEXtSoftwarewww.inkscape.org›î<IDATxÚ”•˜ãj†¿4MÚNÚ±ç®m›]Û¶mÖ¶mÛ¶msìNÛø¿“®5xã|Ïy㊂” (Pj\ßBh…Q/:\ö=Ò€©Ð§ò9N¥’š•nÀ6†Ì?ìc=× iàŸgÜ»æ ÉAjUªN±¤ýÀ…åı­õA=b4PÝž¨š.qOë©~D'ÍÌœ—5†då’Õž>&h•àö…PÜ>•Gíºâ\õ½ø züÄZW½í¼}­G ÒÀÚ4^&P\H¢ ¸(X:F7ÚëÜîè9RkªWea_ÖÂt…UƒAÓdY¥øJî]ûŒ+GÃt`C#%qÿª—{˜|¤ …+@UUœ6w¯¼ÃóÇ¡è6ÄŠ$ƒÛîãÝóøs¬ÎÔñÀ£R¨{3PÕÉÓ [Ý¡( *BÃlصî–·@%ò §>a׆«"Ï«c«¿Åœ‰d  ”Ä¢LZûfTÄ#!އ§¯Œ„έeÛ.w}Dï\u‡hËí׺¹zEÍ¥CAmù£RW×ÏŸ+nËŽOðPg¡á± ùžÍf­×ahä-ê‹»yHͼó+Bãë™ã+µò/¨eáÌm³ô±êôLÊÊîüZ´ØIÿòºQz²-44zLv{ Él1ÂhbPµaý™ƒoN×É¿h‘”],%<ã)cNšÖµðàÌC¬õ²ë-æ< ±BÃU‡GløM¨~‘N˜T¿i%pœ&7V‹qïj8>½GL„Þ~B2y H™ ­¼C„=I8hßùDÑnšzðΰ«ínUóº—-W@¡jµÊ‚3»ä®É˜<±, Q”átHpÚÅ䥇]À™“WñêiÄÆS¦vøg£çL¦ÏŸ¼{´qíNDEÆàŸPpå[6íÁÓ‡oŸr¬qTšúqÕ¼#§ÙÄσ‹ËÇfÉšÙsdBPHÂ>Gàõ«xõê=îÝ~"Z ÁóÎ>åF2QMó¤ZþÉy%9¶‡$;ŠòrRIqú0´)†¥¹WÆ|‡e,ËN>üÍ×ñÖ ´×êBDyAIEND®B`‚gImageReader-3.3.1/packaging/win32/skel/share/icons/hicolor/22x22/actions/view-refresh.png000066400000000000000000000023601351740627400310770ustar00rootroot00000000000000‰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óþ~‡Áʽƒk IEND®B`‚gImageReader-3.3.1/packaging/win32/skel/share/icons/hicolor/22x22/actions/window-close.png000066400000000000000000000022771351740627400311120ustar00rootroot00000000000000‰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.3.1/packaging/win32/skel/share/icons/hicolor/22x22/actions/zoom-in.png000066400000000000000000000021611351740627400300600ustar00rootroot00000000000000‰PNG  IHDRÄ´l;sRGB®ÎébKGDÿÿÿ ½§“ pHYs „ „ªâcytIMEÛ òÕCñIDATxÚ¤Óc´ëJà=™ 6.žmÛ¶mÛ¶mÛ¶k³8®™:u›tæÙïf|kÍßÙ†± ”Âh±ð?<Þåë8΋[­æ¶ù‚4™çQQÚÓ¦ý8ín]|ñÅðàƒ‚ÿE^\â>)WªWL›-$S¨(¹\Twt¹ Oì·ßAçÞu×­pÕU×îãp8ðíGß.Þ|§¶—'»íD!D6è…v©ÜD”2(!æðß}mêu iÇò ‚ßÍ_0ï¬ió·Ýc=«F‹Ej*$+h…Ô~‡žìÒ›4ñ6¥)£É’Þq÷’ù†v÷O>ûøØQõ˜Pt'hÝ)™â&¨Ê°L•2PYuíM\˜‡ æŽd²a’ÐäA­Ð|^WÍøØÀ3”Öô®¼r¥¡PQgBf7äàÁW­UKÛÂy¦¸øËãŒurOô»9>û '×¥š±Ùl\+SUJ}‰f`Ïí¬üAûµ{Ïêë'õFs‡ÝöÛ`ûÃ.Ý‹"–¦Bžî}ùaC®"­ ñ~\«Öq[éPº)vŪòÛß½õ@š ¿ñ™iŸÍ|ïþ{Š& À†ªòTƒžeT«µ¶j+/Yì׳-[Géðƒb;äͶ|õŽ7 àýâÓ?€…Þ,XÔ€å˵,cTj{©$ùU?~ù¥Wüf®^jH9‡‘AÒ!<‹€1Y&4´š<ÄÉ@—”ÏO’+‰Èwß|ŸSýX …¯;j a÷#Þ´Q\·°EñwŸ?*!„Z¦rGW.çÉF±…ïîQ,Igöòø^xöõDM¿UŽÛ[뭯󬶊&¤ÁXt1ÀóVˆÉ[|ûæ³Ç,þ>øî;ì*0üN§ÓuÞ{ïƒÏºœ‚KN.¼$-9s­³VãW âÛÌøvÚA³?zîøl|8tÖYçlÕÝÓuË1P0RËøïx§ÛÕ»Ù&ž!Üö‚ Ø¥“nµÛß%“â#K/]ÛãõÌ–å6úòË/á7ÞXÝïëAÁh´¿ëºü²ËR¹LgÌœN®¹ö* Ì0QÇ!Øôî{î.–ËeòÕ×_‘ /¾`˜ÿéñèB@£Ñd~üáÇ¥+¯²òÑ»ì² b²›Ì†mnÓ«ãþøŠ¢P–ec‹-Ь·þzn¶Ùæ!´ªF+ؽß—ãþøŸI’442<"o±å;­¹Æ”R²%Ëa(8܇abäd2¹LÅ)Ûo¿ÃFv‡ƒV*•ìOÛ·÷à6fÊÁÛ·od~ÒÖÖ^ôÉWsíÝþT-‚_IEND®B`‚gImageReader-3.3.1/packaging/win32/skel/share/icons/hicolor/22x22/actions/zoom-original.png000066400000000000000000000022031351740627400312530ustar00rootroot00000000000000‰PNG  IHDRÄ´l;sRGB®ÎébKGDÿÿÿ ½§“ pHYs „ „ªâcytIMEÛ!B©gÓIDATxÚ´””Y@_¡{šã‰mÛ¶mÛ¶m[GËØ¶m'ömÿN­'÷óè~¾ß þB0 ƒA?’ ð>¯¿$MÓ‰£Ìp$º¿fÍÚ»;¤äÎñiâ{÷ï—KII¹sáú#2.>MJŒG,‡sv§‡sØÍ’’âÅеzuï™úQba§ç.œ/Ÿãõ³t«­O·6d„¢i@ˆåƳ\vÄù+·qÖ›•!ºT·]Òs%åÿƒüc"ÿå«—7ï¿u™Ú´jÂ1\ ,†ã4€å0 ‰cD|ÕêÕå·îU2%r'[š ïºÕkWÃ厝ïí{Å ž©:PHé+ƒ£$0©Û”•Ï Àd<¹"jó†EEU0€s|~¯öqiŠævL€Ä\ºtAå&Šºyòå25âNøBL@ͺñërº¨†ÉI‰:Ší~æBZ‹{GV”ßýÓ¾‚ðˆ?&ùòååŸ>{z­zùBsî¦GžHJL&ÃE•„X†0Y~…¬€‹Æ×nf6y|jKÇׯ^77›Ìæ®Ý:AêÛ´÷îX¸29%©l“Æ O²òBxBÑÚ÷ò—,›''™ˆCSHóüNcÍ«L¿~ƒsêôZcff†eë–íß»ch4ÊSQÊqïÞƒ]qÞä×=,o~~®¶êᙲi¯x̺Œ¥'Oœ™˜œ’\qúô †.¤PÈË=öâ|,8Žc¿/Lüq²sçN Y¾\ùq—._BV›•ÿá§ïQ÷ž]¿wÇÿNŸÂðkû={ö o·ÛS5j¤^ýzµ‹/!|ÃFøô¬Ì¬×ïZ¯×?v8%Z´hQ:gÎ\ñ|·`8pΨ7š¾D,IMM½EÓtã6mÛä‰U*Ø ,­êû)S'ùáK BJΛ7Ï(Ü÷•kWÐÔé“uð5‹ÅBôÖÙ´iS(K•ÅìÛ¿Wx| ¤R)™¿Ìyë¶­[Ú;;RA©Ï!ùÖh‚ÖIEND®B`‚gImageReader-3.3.1/packaging/win32/skel/share/icons/hicolor/22x22/actions/zoom-out.png000066400000000000000000000021261351740627400302620ustar00rootroot00000000000000‰PNG  IHDRÄ´l;sRGB®ÎébKGDÿÿÿ ½§“ pHYs „ „ªâcytIMEÛ,NÍqnÖIDATxÚ¤Ô˜$9à/Iil¬mÛ¶÷áÿŸmÛζµ¶mÛOkûÚvW§*uuöð-#N>h MÓ ¡0ü £ÉÐ3 ãõ¸Ê+**FCueEù¥/Ož8Ùt=öÔÁßÞ‡O\¼Õî Err²µü¼|æô†·Ç™¼\عMþçS¦ÎzàÍ7_gŸ}©a{=Ž= ×2eâxÚªES™JU`À0²:=d÷ÎmÙÝZ ÿÝÍóTã²ò+÷ž¾l}Ĩ1~Aä“C!,…i ¦†d™qᘜyúð®v}»Ü5i”eð8øUŠ*o0©Ø‘b8†Tˆ"‚£„G1„AÆzÆcDepiÈÇJ«$Þ€ÿ̘€î³Ï?íë ¡ûºô`Gç.i)Ù Ò‰-_ĶÛõÑ+WN¡qKÖ œ?¾¯_—N¥ß_¼p)üŸ5ÎÍÉên ¥‚òµ¤aÞ¤aÔéS:öl§)ªï*MÒ”œJ1j­:Ó¦Ò|jC¤LWHöŒzÀÿ™q4'LËÐ* WGs‚<·sw&@ˆ$y0 €`ýÿZ™µÊÎä9 "‘XªÎ>>yúTÙÀ‘Óòm ®ÚÕr©LO'^î§~f(‰TP4œ¡©Ì›Î“.jÜU†Êê\ ¾_X–/&‚Ñ€»0›àB=± bÀ€–†€feB2ƒ@RÂÀJ jôúJ•¨Í²{ços§Õš,/Þ5>sJÇ\aÏ¥F¼ˆUˆ‹D£Dèö£þÖS˦ÃÑû tŒ1íàCW'OÞ·¬²v -ÙÑ•ž†”âB’ÊÂH(@[ˆÑÀ'ŒÜ¾è³ÿ×^>\¶iã¶—êÎøWéééêªUk¶¶-‘Š©íøãVS°ÈãË* '2Ú ö‘ûvïŸdí7¹¯U™žzú™á-[¶˜K8d0ͦÅ _˜ßnÄÐAw #ŠR¾BU§Lé^›Ýõñùs{ÔjÅã1´eËX°`A—šêÚZ„4ùÓñg­ŸyúUíØñ£ì™gŸ éïr ¹ôFúeÐ;ï¾ ”²={÷²G¤ú׉Ð<¢(ý2}ᢅJ4e›·lÒî¾÷Î=kn㩪ªñ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.3.1/packaging/win32/skel/share/icons/hicolor/22x22/categories/000077500000000000000000000000001351740627400264475ustar00rootroot00000000000000applications-education-language.png000066400000000000000000000024431351740627400353210ustar00rootroot00000000000000gImageReader-3.3.1/packaging/win32/skel/share/icons/hicolor/22x22/categories‰PNG  IHDRÄ´l;sBIT|dˆ pHYsaaÁ0UútEXtSoftwarewww.inkscape.org›î< IDATxÚµ•C€´É€ŸÂçiLµ½Û¶ÎÑ9¾Ä¹Çvrй¶m{ÿ™ßj÷ǪJÇvò”Í÷}…sŽÿ’ÿà™ºF_ù±§Uü‹¼û‡»£$òçâ(˜K¢ÀöiçŸúþžÑ¹oð;~s«oþúc¦2Î’K… vø¾jK¥•çù ÍF2zA+¹šFk›‹ñDÖ’$$OsªÊÑj&|燗›í=Ý[œŠ¾[žû–Ïk€,3SYÿpv{:ia‹2jâ‡RBX¤L‡‚šHqFQ ­çPZÒlÄj{oç°5àóòÙÏ~¶*L¼Ú<ÆIJS¢|!}4%Mϰ§cfZ1‰ÈÑ6eBfl4ãùèužF Ö.ˆ1²³þÆPê@© €h'#j¡äy§Ï²:S׆qÚ-,Ù`D+–<ûè„"¯ *¨Ûi^àœkAˆ¦<ú ž,¼ÆLx8!°NpìBÀLÃÃÓš•ÙîêCžÑÏ-»;%W?ÐÁ÷‡sA=ÒdiŽu'!ÄÒ3g¥ÑL¿×E¤Òˆ{:† ¹»Ë‘Ó¶,xÍY->ðê£8f>¢²‹`¶•`ªœC‡:H!qR€?1#•çÍŠj@>Ž'’Jðäãfé• iK^ù¤eNZM¸ú®=DQÈÊLÂt,µ Ërêžáp»ÎáœéÍjI¹$œÁå=¼F#—çè§%Ç-78z±ÆÙGMòáïÜÆÆ´Ç1kÓ”F°ëàÌz8!ŒFlïë1L Ð Ò zI*WlH%‘Ò’w24‘2Ç-ÆÔËLÃgÏ@ò¤— Ÿ—=iQn±i•8ô8÷úÇ~óhÇÎìè+…E*µá̺ÃpÆ'©Ê kKŒ)¸âŽm–¦kX'ùü¹;XXœeoÏpò;Ìtsâ7ßði§ÔÆ .½k/÷‰ÃƒÏã± …ôæü‰&1åoVÅÁŽvÆËŸ±Žz¼Ë¡TD!=ú(Ë5ÉÖÁÏ?s‰‰ÈckèsÕõ÷ã„ǰ’J!´Ož5‡~Ó÷ Yîˆk*ŒJøÂy[¼èìy6—"_ÇYǯЪ¬/40ÊgWqîe·s¨3ááФ6éƒÓÒ"'Ã@#˜ªBEáèd†_^ó E:be:¤3,¹õ‘öøJ*ÏÜx÷7Üþ0ÖiœøM€ß¥BG-ÝQ€r¬‡ò|øàçêêº ƒøßÙ@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±[3^IEND®B`‚gImageReader-3.3.1/packaging/win32/skel/share/icons/hicolor/22x22/devices/000077500000000000000000000000001351740627400257445ustar00rootroot00000000000000gImageReader-3.3.1/packaging/win32/skel/share/icons/hicolor/22x22/devices/camera-photo.png000066400000000000000000000007051351740627400310330ustar00rootroot00000000000000‰PNG  IHDRn½¤°sBITUìF pHYs × ×B(›xtEXtSoftwarewww.inkscape.org›î<DIDATxÚÌ̆TQÀñß9wêžÝÕD30` ²»"`‚}ŒÐô@=@O lÐZʆ̘¦4nªvu§ÊœnÇA Ð÷÷}8~NÈþ}¢ÿ O¦¹ÍÓ|<ù3ÙÓÆÀßçýá°ÇAcßÐŽë ys¿9ð [:sÉ[CQ(e3 ­-#ÁªS—|tU]('’›j_½òÜÜ)"+µäƒ±¹PšIÆ^zÔíØ¶7²zT²¾‹B£…=O<ôØ‘»½0’Z”,)ü‹VÕÑûÝVZKØü¼¦ ÍõÝó Û¾9¿ãZeÇgWeלÚrÛ³®Öž Î’J߉ÝBWœ™šx&F®—w"d[£²ô©tîÈ µÖeûn¹p®Aw’…×’FXÇ®Ÿ“›÷¨ÿ€ð%DñÇ·]D¤ ¶· C1§³n¼ÈëDIEND®B`‚gImageReader-3.3.1/packaging/win32/skel/share/icons/hicolor/22x22/devices/scanner.png000066400000000000000000000015071351740627400301060ustar00rootroot00000000000000‰PNG  IHDRÄ´l;IDATxÚì”5¸ÄT…Ï•xòtw‡ ·÷–öõ¸»Tx_ÓÑâîT¸»»¯kr³ò-ôtÌ{óì$óÏL2‰ªª ÿ…éÅÁÿ`‹¹ýôÓOG)¥®i­ScLB éã†j¨ 9>GŸ”e9¢œs}jŸzß®»îú&hòð¾øâ‹m&¾ÎÄ}@#žçÁZ+Ç ƒÁ‚¢(þ¡yžE=zÿý÷ÿS}üñÇšG˜tVÌ÷}$I"ºZ„¶„1ÓéTtá<÷s.°Ýn÷F&œE0è`碓ÉD’Ó4Ç”._€PñU8¯=w4]g?ýôÓ‡{©V«ÝôÅO¿ŸZTšYhÅZÁ#Å—"uv;A0ÀFhÑXÕFßÃxKîñ|vþʳ_ývRn|ø; CŽo#D€ƒK¸ c…+ØmŽ^¯‡mãpÄvüìÑÇ}êî»ï ÚÅ_lî¾ûî[Éõ:¢ m„G`!-òÙdŒÙánÚG–ºwvvôSO=U øä“O®¹ ®ûµMi†!"Rº•SG(µ*©yùPóó¹—"EX_í–eÙ:€–€9昃[*Pyº‰žõ¥\4.+ñŠ”²tÒµFVVÏ÷YØ2{æ™gà5×ëõC>ÓºUÈ+µ'$wÙ"ÿgÙ m PbÕ7(<ƒŽaÏ=÷MlÕvC«Õú~ù­¸÷Þ{×šÍæ…LÞ]l¼É1÷;æ±G˜|„xÞ…a8][[чœ¦MÆŸ¼ægNúɇ~øÀ­£ã ÞdÉ’%Œ‡f|ñâ÷oß@ÉìB™ÿæææÿãããqj­šà pä!^—²IEND®B`‚gImageReader-3.3.1/packaging/win32/skel/share/icons/hicolor/22x22/emblems/000077500000000000000000000000001351740627400257465ustar00rootroot00000000000000gImageReader-3.3.1/packaging/win32/skel/share/icons/hicolor/22x22/emblems/emblem-important.png000066400000000000000000000020121351740627400317230ustar00rootroot00000000000000‰PNG  IHDRÄ´l;sBIT|dˆ pHYsvv}Õ‚ÌtEXtSoftwarewww.inkscape.org›î<‡IDATxÚ|•°ìV‡¿s²|¸~¶mûkkÌÚíØjÇSÚ±Þ°Ö¨¶m»]f/²›œsúO6¹sßÕæË/ü"åœc¦z9çõ7 ûôi~)yxâDd|¦©iÅ"ìUp;pGïÞ=ý‹.¿œB?ªX$ò}Úüÿæ[4Þ|3PðŠ›†¦2«øÕœwx~ÑEõ žw.åå+±Á(6ŒpÖ€‘T óEÂÊÔŸyŽê‹/|¯àÜC¡ù~Zñk9o½‚·VÞ}×PßáÃØvg 6 “tQ‘/k’}ZF|ÿ>øPEá.ÜÚ·Ï¿žó†bé²®[ß{ðNd›\<62Ê¢Ûn'«?gR.'Ç"d(Ì¿ÿòÏc6pnõÞŽmjÒÒðÈàéSëçoßñ}aXhaZ-FkU¬µ²]Á ûB ë õ:*_ çä‰> ·§>x;ïõxž¾hþ¾}˜¦Ÿ …á8}‚Z cÌ8A½‘ÆÆÓlPZ³­õŸtO.µ_R\µª¤Ëe9¹‰3%' zÒÓ¬‘XEr\ Ý)‹ˆkÞÁƒýcï¼}s*v×”—.Áù"éÊÖ;~ë,qÛ÷qž×=/+róç£a_W¬ØJØÁÊв^f©„v´-\€Ö$“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_Pi]IEND®B`‚gImageReader-3.3.1/packaging/win32/skel/share/icons/hicolor/22x22/mimetypes/text-plain.png000066400000000000000000000016311351740627400311320ustar00rootroot00000000000000‰PNG  IHDRójœ sRGB®Îé pHYs „ „ªâcytIMEÛ 3 Ú·ªPLTE µµµ™˜˜›ššžœœ®­­¡¡¡¢¡¡¬¬¬äââæääÿÿÿ +++777:::???@??@@@DDDMMMPPPQQQVVV[[[mmmxxx………‹‹‹™™™œœœ£££¦¦¦©©©ªªª´´´¸¸¸ÁÁÁÂÁÁÄÄÄÅÅÅÆÆÆÇÆÆÈÈÈÉÈÈÊÊÊÍÌÌÏÎÎÒÒÒÓÓÓÔÒÒÔÓÓÔÔÔÕÔÔÕÕÕÖÕÕÖÖÖ×ÖÖ××ר××ÙÙÙÚÙÙÚÚÚÛÙÙÛÛÛÜÜÜßßßàààáááâááâââãããäääåããåääçååçææçççèççêééëëëëìììììïîîðîîðïïñïïòððòññóòòôòòôóóôôôõóóõôôõõõöõõ÷÷÷ø÷÷øøøùøøùùùú÷÷úùùúúúûúúûûûüûûüüüüýýýüüýýýþýýþþþÿÿÿº§tRNS"FHKLMNOPQSUXZìïôõõõööþþþþîßGbKGD âÕ>IDATxÚ]‘ƒš\1@SÛÖ¸v§ÚÛ¶mÛ6þg^ßÜoöÄ'Nºpãö.7. #îÃyîë0*Uêõf«Õª·êÕZœê¿ÉÔZ- ­9"‹zÓOçÓéz5]̆Ó¡¡ïrØ}&‡-`0»Ý.B†­–Ûíf½Z ¡G€GlfXÃw kšLþd¡¼•’‹þÅÖÒ+ ¼|t™¸Î:ÀSÚBX¼yv‹hMa\üºùWO®¢3 ÝùbØÎèÿo‹Ñ×Öƒ˜Ýì•òÃëç7ÖŸ`<VbêýÉÓˆÔÐsZuFWøø:¶øÓ¹‡×ÉÅ;wO¹u‰”‡v7u_=IEND®B`‚gImageReader-3.3.1/packaging/win32/skel/share/icons/hicolor/22x22/mimetypes/x-office-document.png000066400000000000000000000013511351740627400323600ustar00rootroot00000000000000‰PNG  IHDRójœ gAMA± üasRGB®Îé cHRMz&€„ú€èu0ê`:˜pœºQ<çPLTE¶¶¶àààÞÝÝßßß¼¼¼ßßß»»»ÓÒÒÄÄÄBBBñððÉÇÇDBBðïïÊÈÈFFFÞÝÝÌÊÊKJJØ××ÄÃÃGFF­­­ÜÜÜÚÙÙÙØØÖÖÖÔÓÓ¾½½888àßßîììðîîñïïëêêñððèèèðïïòññåääóòòñññôóóãããôôôõõõåååòòòêêêôõõïîîõôôíììëëëïïïçççàààðððóóóßßß×××ÒÒÒéééíííäääùùùöõõßÞÞáááÛÚÚçææÿÿÿ¤Ky#tRNS8±±±VüJþ« þµþµþ®þ¥;¶¸¸¸·}èåï-bKGDL÷oó pHYs7]7]€F]ÁIDATxÚmÐUbÄ àк»ßÿ õÞa÷©îÞ.aˆ{ò!#¡}„ˆŽ“s«½¶Ó¸d(ßbQPñ–¾É’Yz98›0ÈÃ{Sk‰6#q›TÚûgºÆïjïOªÌÃã…yŽñwâÝ¢ Gæ§£[ÄÇüXÄp *êÂÌŸÑ+WRFÖ ¥†O³ô®/”úˆ›àe«x¾¾›…EOœóM©øvÓâ\©'0Ó —6u©Ô}jÀ6Qü,ŽÓQ*'ŒeKy2[©Ý\%tEXtdate:create2014-12-02T12:08:28+01:00—Yî­%tEXtdate:modify2014-12-02T12:08:28+01:00æVIEND®B`‚gImageReader-3.3.1/packaging/win32/skel/share/icons/hicolor/22x22/places/000077500000000000000000000000001351740627400255715ustar00rootroot00000000000000gImageReader-3.3.1/packaging/win32/skel/share/icons/hicolor/22x22/places/user-trash.png000066400000000000000000000020121351740627400303670ustar00rootroot00000000000000‰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 €‹œ~LKz3vPIúIEND®B`‚gImageReader-3.3.1/packaging/win32/skel/share/icons/hicolor/index.theme000066400000000000000000000647271351740627400257160ustar00rootroot00000000000000[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.3.1/packaging/win32/skel/share/myspell/000077500000000000000000000000001351740627400224565ustar00rootroot00000000000000gImageReader-3.3.1/packaging/win32/skel/share/myspell/README.txt000066400000000000000000000005601351740627400241550ustar00rootroot00000000000000This folder contains spelling dictionaries. To add additional spelling dictionaries: * Visit https://cgit.freedesktop.org/libreoffice/dictionaries/tree/ * Download the *.dic 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.3.1/packaging/win32/skel/share/tessdata/000077500000000000000000000000001351740627400226015ustar00rootroot00000000000000gImageReader-3.3.1/packaging/win32/skel/share/tessdata/README.txt000066400000000000000000000015451351740627400243040ustar00rootroot00000000000000This 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 * If using tesseract 4.x, go to https://github.com/tesseract-ocr/tessdata_fast * If using tesseract 3.x or older, go to https://github.com/tesseract-ocr/tessdata * 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.3.1/po/000077500000000000000000000000001351740627400144615ustar00rootroot00000000000000gImageReader-3.3.1/po/LINGUAS000066400000000000000000000001631351740627400155060ustar00rootroot00000000000000ar_SA cs de el es_ES eu fr it nb_NO nl pl pt_BR ru sl sv tr uk zh_CN zh_HK zh_TW pt ko sr_Cyrl sr_CS sr_Latn ie hi gImageReader-3.3.1/po/POTFILES.in000066400000000000000000000102011351740627400162300ustar00rootroot00000000000000# List of source files containing translatable strings. data/gimagereader.desktop.in [type: gettext/glade]gtk/data/appmenu.ui [type: gettext/glade]gtk/data/ConfigDialog.ui [type: gettext/glade]gtk/data/CrashHandler.ui [type: gettext/glade]gtk/data/MainWindow.ui [type: gettext/glade]gtk/data/OutputEditorHOCR.ui [type: gettext/glade]gtk/data/OutputEditorText.ui [type: gettext/glade]gtk/data/PdfExportDialog.ui [type: gettext/glade]gtk/data/SearchReplaceFrame.ui [type: gettext/glade]gtk/data/SelectionMenu.ui [type: gettext/glade]gtk/data/SubstitutionsManager.ui [type: gettext/glade]gtk/data/TessdataManager.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/DisplayerToolSelect.cc gtk/src/DisplayerToolSelect.hh gtk/src/DisplayRenderer.cc gtk/src/DisplayRenderer.hh gtk/src/DjVuDocument.cc gtk/src/DjVuDocument.hh gtk/src/FileDialogs.cc gtk/src/FileDialogs.hh gtk/src/FontComboBox.cc gtk/src/FontComboBox.hh gtk/src/Geometry.hh gtk/src/hocr/DisplayerToolHOCR.cc gtk/src/hocr/DisplayerToolHOCR.hh gtk/src/hocr/HOCRDocument.cc gtk/src/hocr/HOCRDocument.hh gtk/src/hocr/HOCROdtExporter.cc gtk/src/hocr/HOCROdtExporter.hh gtk/src/hocr/HOCRPdfExporter.cc gtk/src/hocr/HOCRPdfExporter.hh gtk/src/hocr/HOCRTextExporter.cc gtk/src/hocr/HOCRTextExporter.hh gtk/src/hocr/OutputEditorHOCR.cc gtk/src/hocr/OutputEditorHOCR.hh gtk/src/hocr/XmlUtils.cc gtk/src/hocr/XmlUtils.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/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/SearchReplaceFrame.cc gtk/src/SearchReplaceFrame.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/CharacterListDialog.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 [type: gettext/qtdesigner]qt/data/SearchReplaceFrame.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/DisplayerToolSelect.cc qt/src/DisplayerToolSelect.hh qt/src/DisplayRenderer.cc qt/src/DisplayRenderer.hh qt/src/DjVuDocument.cc qt/src/DjVuDocument.hh qt/src/FileDialogs.cc qt/src/FileDialogs.hh qt/src/hocr/DisplayerToolHOCR.cc qt/src/hocr/DisplayerToolHOCR.hh qt/src/hocr/HOCRDocument.cc qt/src/hocr/HOCRDocument.hh qt/src/hocr/HOCROdtExporter.cc qt/src/hocr/HOCROdtExporter.hh qt/src/hocr/HOCRPdfExporter.cc qt/src/hocr/HOCRPdfExporter.hh qt/src/hocr/HOCRTextExporter.cc qt/src/hocr/HOCRTextExporter.hh qt/src/hocr/OutputEditorHOCR.cc qt/src/hocr/OutputEditorHOCR.hh qt/src/hocr/Ui_OutputEditorHOCR.hh qt/src/main.cc qt/src/MainWindow.cc qt/src/MainWindow.hh qt/src/OutputEditor.cc qt/src/OutputEditor.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/SearchReplaceFrame.cc qt/src/SearchReplaceFrame.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_OutputEditorText.hh qt/src/Utils.cc qt/src/Utils.hh gImageReader-3.3.1/po/ar_AR.po000066400000000000000000002054741351740627400160210ustar00rootroot00000000000000# 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. # msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2018-02-22 00:10+0100\n" "PO-Revision-Date: 2018-03-16 12:34+0000\n" "Last-Translator: Alaa Sayed \n" "Language-Team: Arabic \n" "Language: ar_AR\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 " "&& n%100<=10 ? 3 : n%100>=11 ? 4 : 5;\n" "X-Generator: Weblate 2.20-dev\n" #: ../data/gimagereader.desktop.in.h:1 msgid "OCR application" msgstr "برنامج التعر٠الضوئي للمستندات المصورة" #: ../gtk/data/appmenu.ui.h:1 ../qt/src/Ui_MainWindow.hh:166 msgid "Redetect Languages" msgstr "إعادة تحميل لغات التعر٠الضوئي" #: ../gtk/data/appmenu.ui.h:2 ../qt/src/Ui_MainWindow.hh:169 msgid "Manage Languages" msgstr "إدارة لغات التعر٠الضوئي" #: ../gtk/data/appmenu.ui.h:3 ../gtk/data/ConfigDialog.ui.h:1 #: ../qt/data/ConfigDialog.ui.h:1 ../qt/src/Ui_MainWindow.hh:172 msgid "Preferences" msgstr "خيارات" #: ../gtk/data/appmenu.ui.h:4 ../gtk/data/ConfigDialog.ui.h:2 #: ../gtk/src/MainWindow.cc:470 ../qt/src/MainWindow.cc:467 #: ../qt/src/Ui_MainWindow.hh:177 msgid "Help" msgstr "مساعدة" #: ../gtk/data/appmenu.ui.h:5 ../qt/data/AboutDialog.ui.h:2 #: ../qt/src/Ui_MainWindow.hh:180 msgid "About" msgstr "نبذة" #: ../gtk/data/appmenu.ui.h:6 msgid "Quit" msgstr "إنهاء البرنامج" #: ../gtk/data/ConfigDialog.ui.h:3 ../gtk/data/MainWindow.ui.h:42 #: ../gtk/data/OutputEditorHOCR.ui.h:3 ../gtk/data/PdfExportDialog.ui.h:3 #: ../gtk/src/FileDialogs.cc:152 ../gtk/src/Utils.cc:61 #: ../qt/data/ConfigDialog.ui.h:26 msgid "OK" msgstr "تم" #: ../gtk/data/ConfigDialog.ui.h:4 msgid "Output pane orientation:" msgstr "اتجاه شاشة المخرجات:" #: ../gtk/data/ConfigDialog.ui.h:5 msgid "Horizontal" msgstr "Ø£Ùقي" #: ../gtk/data/ConfigDialog.ui.h:6 msgid "Vertical" msgstr "عمودي" #: ../gtk/data/ConfigDialog.ui.h:7 ../qt/data/ConfigDialog.ui.h:18 msgid "Query to install missing spellcheck dictionaries" msgstr "طلب تثبيت قواميس الإملاء غير المثبتة" #: ../gtk/data/ConfigDialog.ui.h:8 ../qt/data/ConfigDialog.ui.h:4 msgid "Automatically check for new program versions" msgstr "البحث عن تحديثات البرنامج تلقائيا" #: ../gtk/data/ConfigDialog.ui.h:9 ../qt/data/ConfigDialog.ui.h:3 msgid "Predefined language definitions:" msgstr "ØªØ¹Ø±ÙŠÙØ§Øª اللغات الموجودة:" #: ../gtk/data/ConfigDialog.ui.h:10 ../qt/data/ConfigDialog.ui.h:12 msgid "Additional language definitions:" msgstr "ØªØ¹Ø±ÙŠÙØ§Øª اللغات الإضاÙية:" #: ../gtk/data/ConfigDialog.ui.h:11 ../qt/data/ConfigDialog.ui.h:20 msgid "The prefix of the tesseract language data file" msgstr "تعري٠مل٠اللغة ÙÙŠ محرك التعر٠الضوئي" #: ../gtk/data/ConfigDialog.ui.h:12 ../qt/data/ConfigDialog.ui.h:21 msgid "Prefix" msgstr "تعريÙ" #: ../gtk/data/ConfigDialog.ui.h:13 ../qt/data/ConfigDialog.ui.h:22 msgid "The ISO 639-1 language code followed by the country code" msgstr "رمز اللغة ISO-639-1 متبوعا برمز الدولة" #: ../gtk/data/ConfigDialog.ui.h:14 ../qt/data/ConfigDialog.ui.h:23 msgid "ISO Code" msgstr "رمز ISO القياسي" #: ../gtk/data/ConfigDialog.ui.h:15 ../qt/data/ConfigDialog.ui.h:24 msgid "The name of the language" msgstr "اسم اللغة" #: ../gtk/data/ConfigDialog.ui.h:16 ../qt/data/ConfigDialog.ui.h:25 msgid "Name" msgstr "الاسم" #: ../gtk/data/ConfigDialog.ui.h:17 ../gtk/data/MainWindow.ui.h:41 #: ../gtk/data/OutputEditorHOCR.ui.h:2 ../gtk/data/PdfExportDialog.ui.h:2 #: ../gtk/src/Acquirer.cc:34 ../gtk/src/FileDialogs.cc:151 #: ../gtk/src/Utils.cc:70 ../qt/data/ConfigDialog.ui.h:27 #: ../qt/data/MainWindow.ui.h:12 msgid "Cancel" msgstr "إلغاء" #: ../gtk/data/ConfigDialog.ui.h:18 ../qt/data/ConfigDialog.ui.h:5 msgid "Output pane font:" msgstr "خط شاشة المخرجات:" #: ../gtk/data/ConfigDialog.ui.h:19 ../qt/data/ConfigDialog.ui.h:2 msgid "Default" msgstr "Ø§Ù„Ø§ÙØªØ±Ø§Ø¶ÙŠ" #: ../gtk/data/ConfigDialog.ui.h:20 ../qt/data/ConfigDialog.ui.h:6 msgid "Language data locations:" msgstr "مكان مجلد لغات التعر٠الضوئي ÙÙŠ النظام:" #: ../gtk/data/ConfigDialog.ui.h:21 ../qt/data/ConfigDialog.ui.h:13 msgid "Language definitions path:" msgstr "مسار مجلد لغات التعر٠الضوئي ÙÙŠ الحاسوب:" #: ../gtk/data/ConfigDialog.ui.h:22 ../qt/data/ConfigDialog.ui.h:28 msgid "Spelling dictionaries path:" msgstr "مسار قواميس التدقيق الإملائي:" #: ../gtk/data/ConfigDialog.ui.h:23 ../qt/data/ConfigDialog.ui.h:10 msgid "System-wide paths" msgstr "مسار Ø§Ù„Ù…Ù„ÙØ§Øª على مستوى النظام" #: ../gtk/data/ConfigDialog.ui.h:24 ../qt/data/ConfigDialog.ui.h:11 msgid "User paths" msgstr "مسار Ø§Ù„Ù…Ù„ÙØ§Øª على مستوى المستخدم" #: ../gtk/data/ConfigDialog.ui.h:25 ../qt/data/ConfigDialog.ui.h:29 msgid "Automatically open exported documents with default application" 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 "" "عذرا لهذا الإزعاج. لتطوير البرنامج، ÙØ¶Ù„ا قم بإخبار مبرمج البرنامج عن هذا " "الخطأ " "1manisandro@gmail.com. ووضح ما كنت ØªÙØ¹Ù„Ù‡ قبل حدوث هذا الخطأ Ø§Ù„Ù…ÙØ§Ø¬Ø¦ØŒ " "أيضا أرÙÙ‚ هذه البيانات بالأسÙÙ„ØŒ شكرا لك." #: ../gtk/data/MainWindow.ui.h:1 ../qt/data/MainWindow.ui.h:39 msgid "Toggle output pane" msgstr "تبديل مكان شاشة المخرجات" #: ../gtk/data/MainWindow.ui.h:2 ../qt/src/Ui_MainWindow.hh:66 msgid "Rotate current page" msgstr "تدوير اتجاه Ø§Ù„ØµÙØ­Ø© الحالية" #: ../gtk/data/MainWindow.ui.h:3 ../qt/src/Ui_MainWindow.hh:67 msgid "Rotate all pages" msgstr "تدوير اتجاه كل Ø§Ù„ØµÙØ­Ø§Øª" #. Sources toolbar #: ../gtk/data/MainWindow.ui.h:4 ../qt/src/Ui_MainWindow.hh:191 msgid "Recent" msgstr "مستخدم مؤخراً" #: ../gtk/data/MainWindow.ui.h:5 ../qt/src/Ui_MainWindow.hh:192 msgid "Paste" msgstr "لصق" #: ../gtk/data/MainWindow.ui.h:6 ../qt/src/Ui_MainWindow.hh:193 msgid "Take Screenshot" msgstr "Ø­ÙØ¸ لقطة شاشة" #: ../gtk/data/MainWindow.ui.h:7 ../qt/src/Ui_MainWindow.hh:204 msgid "Add images" msgstr "Ø¥Ø¶Ø§ÙØ© مصورات" #: ../gtk/data/MainWindow.ui.h:8 ../qt/src/Ui_MainWindow.hh:203 msgid "Add Images" msgstr "Ø¥Ø¶Ø§ÙØ© مصورات" #: ../gtk/data/MainWindow.ui.h:9 ../qt/src/Ui_MainWindow.hh:209 msgid "Remove image from list" msgstr "إلغاء الصورة من القائمة" #: ../gtk/data/MainWindow.ui.h:10 ../qt/src/Ui_MainWindow.hh:212 msgid "Delete image" msgstr "حذ٠الصورة" #: ../gtk/data/MainWindow.ui.h:11 ../qt/src/Ui_MainWindow.hh:215 msgid "Clear list" msgstr "إلغاء جميع القائمة" #: ../gtk/data/MainWindow.ui.h:12 ../qt/data/MainWindow.ui.h:5 msgid "Files" msgstr "Ø§Ù„Ù…Ù„ÙØ§Øª" #: ../gtk/data/MainWindow.ui.h:13 ../qt/data/MainWindow.ui.h:8 msgid "Device:" msgstr "الجهاز:" #: ../gtk/data/MainWindow.ui.h:14 ../gtk/data/TessdataManager.ui.h:4 #: ../qt/data/MainWindow.ui.h:7 ../qt/src/TessdataManager.cc:59 msgid "Refresh" msgstr "تحديث" #: ../gtk/data/MainWindow.ui.h:15 ../qt/data/MainWindow.ui.h:9 msgid "Output:" msgstr "المخرج:" #: ../gtk/data/MainWindow.ui.h:16 ../qt/data/MainWindow.ui.h:13 msgid "Mode:" msgstr "الصيغة:" #: ../gtk/data/MainWindow.ui.h:17 ../gtk/src/hocr/HOCRPdfExporter.cc:313 #: ../qt/data/MainWindow.ui.h:15 ../qt/src/hocr/HOCRPdfExporter.cc:347 msgid "Color" msgstr "اللون" #: ../gtk/data/MainWindow.ui.h:18 ../gtk/src/hocr/HOCRPdfExporter.cc:316 #: ../qt/data/MainWindow.ui.h:14 ../qt/src/hocr/HOCRPdfExporter.cc:349 #: ../qt/src/hocr/HOCRPdfExporter.cc:351 msgid "Grayscale" msgstr "تدرج الرمادي" #: ../gtk/data/MainWindow.ui.h:19 ../qt/data/MainWindow.ui.h:10 msgid "Resolution:" msgstr "الدقة النقطية:" #: ../gtk/data/MainWindow.ui.h:20 ../qt/data/MainWindow.ui.h:11 msgid "Scan" msgstr "مسح ضوئي" #: ../gtk/data/MainWindow.ui.h:21 ../qt/data/MainWindow.ui.h:16 msgid "Source:" msgstr "المصدر:" #: ../gtk/data/MainWindow.ui.h:22 ../qt/data/MainWindow.ui.h:6 msgid "Acquire" msgstr "الحصول" #: ../gtk/data/MainWindow.ui.h:23 ../qt/data/MainWindow.ui.h:1 msgid "Brightness" msgstr "السطوع" #: ../gtk/data/MainWindow.ui.h:24 ../qt/data/MainWindow.ui.h:2 msgid "Contrast" msgstr "التباين" #: ../gtk/data/MainWindow.ui.h:25 ../qt/data/MainWindow.ui.h:3 msgid "Resolution" msgstr "الدقة النقطية" #: ../gtk/data/MainWindow.ui.h:26 ../qt/data/MainWindow.ui.h:4 msgid "Invert colors" msgstr "عكس الألوان" #: ../gtk/data/MainWindow.ui.h:27 ../qt/data/MainWindow.ui.h:23 msgid "Zoom in" msgstr "تكبير" #: ../gtk/data/MainWindow.ui.h:28 ../qt/data/MainWindow.ui.h:25 msgid "Zoom out" msgstr "تصغير" #: ../gtk/data/MainWindow.ui.h:29 ../qt/data/MainWindow.ui.h:27 msgid "Normal size" msgstr "المقاس العادي" #: ../gtk/data/MainWindow.ui.h:30 ../qt/data/MainWindow.ui.h:29 msgid "Best fit" msgstr "Ø£ÙØ¶Ù„ تلاؤم" #: ../gtk/data/MainWindow.ui.h:31 ../qt/src/Ui_MainWindow.hh:75 msgid "Select rotation mode" msgstr "اختر وضعية جهة الدوران" #: ../gtk/data/MainWindow.ui.h:32 ../gtk/data/OutputEditorHOCR.ui.h:10 #: ../gtk/data/OutputEditorText.ui.h:13 ../qt/src/Ui_OutputEditorText.hh:95 msgid "Select insert mode" msgstr "اختر وضعية الإدخال" #: ../gtk/data/MainWindow.ui.h:33 ../qt/data/MainWindow.ui.h:35 msgid "Image controls" msgstr "أزرار التحكم بالصورة" #: ../gtk/data/MainWindow.ui.h:34 ../qt/src/Ui_MainWindow.hh:138 msgid "Plain text" msgstr "نص عادي txt" #: ../gtk/data/MainWindow.ui.h:35 ../qt/src/Ui_MainWindow.hh:138 msgid "hOCR, PDF" msgstr "صيغة PDF" #: ../gtk/data/MainWindow.ui.h:36 ../qt/data/MainWindow.ui.h:37 msgid "Autodetect layout" msgstr "تعر٠تلقائي لتخطيط Ø§Ù„ØµÙØ­Ø©" #: ../gtk/data/MainWindow.ui.h:37 msgid "Recognize all" msgstr "التعر٠الضوئي للكل" #: ../gtk/data/MainWindow.ui.h:38 msgid "Select language" msgstr "اختر اللغة" #: ../gtk/data/MainWindow.ui.h:39 msgid "A graphical frontend to tesseract-ocr" msgstr "برنامج واجهة لمحرك التعر٠الضوئي tesseract-ocr" #: ../gtk/data/MainWindow.ui.h:40 ../qt/data/PageRangeDialog.ui.h:1 msgid "Page Range" msgstr "مجال Ø§Ù„ØµÙØ­Ø§Øª" #: ../gtk/data/MainWindow.ui.h:43 ../qt/data/PageRangeDialog.ui.h:2 msgid "Page range:" msgstr "مجال Ø§Ù„ØµÙØ­Ø§Øª:" #: ../gtk/data/MainWindow.ui.h:44 ../qt/data/PageRangeDialog.ui.h:3 msgid "Example: 1-10, 13, 14-18" msgstr "مثال:1-11,13, 15-19" #: ../gtk/data/MainWindow.ui.h:45 ../qt/data/PageRangeDialog.ui.h:4 msgid "Recognition area:" msgstr "مساحة التعر٠الضوئي:" #: ../gtk/data/MainWindow.ui.h:46 ../gtk/src/Recognizer.cc:392 #: ../qt/data/PageRangeDialog.ui.h:5 ../qt/src/Recognizer.cc:383 msgid "Entire page" msgstr "كامل Ø§Ù„ØµÙØ­Ø©" #: ../gtk/data/MainWindow.ui.h:47 ../qt/data/PageRangeDialog.ui.h:6 msgid "Autodetect" msgstr "تعر٠تلقائي" #: ../gtk/data/MainWindow.ui.h:48 ../qt/data/PageRangeDialog.ui.h:7 msgid "Prepend to output text:" msgstr "ألحق المخرج الحالي بنص شاشة المخرجات:" #: ../gtk/data/MainWindow.ui.h:49 ../qt/data/PageRangeDialog.ui.h:8 msgid "Source filename" msgstr "اسم المل٠المصور" #: ../gtk/data/MainWindow.ui.h:50 ../qt/data/PageRangeDialog.ui.h:9 msgid "Source page" msgstr "مصدر المصورات" #: ../gtk/data/MainWindow.ui.h:51 ../qt/src/SourceManager.cc:146 msgid "Protected PDF" msgstr "PDF محمي بكلمة سر" #: ../gtk/data/MainWindow.ui.h:52 ../qt/src/Recognizer.cc:76 msgid "Current Page" msgstr "Ø§Ù„ØµÙØ­Ø© الحالية" #: ../gtk/data/MainWindow.ui.h:53 ../qt/src/Recognizer.cc:79 msgid "Multiple Pages..." msgstr "ØµÙØ­Ø§Øª متعددة..." #: ../gtk/data/OutputEditorHOCR.ui.h:1 ../qt/src/hocr/OutputEditorHOCR.cc:577 msgid "Add Word" msgstr "Ø¥Ø¶Ø§ÙØ© كلمة" #: ../gtk/data/OutputEditorHOCR.ui.h:4 ../qt/src/hocr/OutputEditorHOCR.cc:577 msgid "Enter word:" msgstr "أدخل كلمة:" #: ../gtk/data/OutputEditorHOCR.ui.h:5 ../qt/src/hocr/Ui_OutputEditorHOCR.hh:61 #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:62 msgid "Export to plain text" msgstr "تصدير نص txt" #: ../gtk/data/OutputEditorHOCR.ui.h:6 ../qt/src/hocr/Ui_OutputEditorHOCR.hh:64 #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:65 msgid "Export to PDF" msgstr "تصدير PDF" #: ../gtk/data/OutputEditorHOCR.ui.h:7 ../qt/src/hocr/Ui_OutputEditorHOCR.hh:67 #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:68 msgid "Export to ODT" msgstr "تصدير ODT وورد" #: ../gtk/data/OutputEditorHOCR.ui.h:8 ../gtk/data/OutputEditorText.ui.h:18 #: ../qt/src/Ui_OutputEditorText.hh:116 msgid "Save output" msgstr "Ø§Ø­ÙØ¸ النص المخرج" #: ../gtk/data/OutputEditorHOCR.ui.h:9 ../qt/src/hocr/Ui_OutputEditorHOCR.hh:72 #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:73 msgid "Export" msgstr "تصدير" #: ../gtk/data/OutputEditorHOCR.ui.h:11 ../gtk/data/OutputEditorText.ui.h:19 #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:77 #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:78 #: ../qt/src/Ui_OutputEditorText.hh:118 msgid "Clear output" msgstr "مسح النص المخرج" #: ../gtk/data/OutputEditorHOCR.ui.h:12 ../gtk/data/OutputEditorText.ui.h:15 #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:80 #: ../qt/src/Ui_OutputEditorText.hh:107 msgid "Find and replace" msgstr "بحث واستبدال" #: ../gtk/data/OutputEditorHOCR.ui.h:13 #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:82 #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:83 msgid "Show confidence values" msgstr "عرض قيم الثقة للتعر٠الضوئي" #: ../gtk/data/OutputEditorHOCR.ui.h:14 ../gtk/data/PdfExportDialog.ui.h:39 #: ../qt/data/PdfExportDialog.ui.h:2 ../qt/src/hocr/Ui_OutputEditorHOCR.hh:85 #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:86 msgid "Show preview" msgstr "عرض كمثال" #: ../gtk/data/OutputEditorHOCR.ui.h:15 #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:121 msgid "Next (F3)" msgstr "التالي (F3)" #: ../gtk/data/OutputEditorHOCR.ui.h:16 #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:122 msgid "Previous (Shift+F3)" msgstr "السابق (Shift+F3)" #: ../gtk/data/OutputEditorHOCR.ui.h:17 ../gtk/src/hocr/OutputEditorHOCR.cc:868 #: ../qt/src/hocr/OutputEditorHOCR.cc:712 #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:126 msgid "Expand all" msgstr "عرض الكل" #: ../gtk/data/OutputEditorHOCR.ui.h:18 ../gtk/src/hocr/OutputEditorHOCR.cc:871 #: ../qt/src/hocr/OutputEditorHOCR.cc:713 #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:127 msgid "Collapse all" msgstr "تجميع المعروض" #: ../gtk/data/OutputEditorHOCR.ui.h:19 #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:148 msgid "Properties" msgstr "خصائص" #: ../gtk/data/OutputEditorHOCR.ui.h:20 #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:152 msgid "Source" msgstr "المصدر" #. Output insert mode #: ../gtk/data/OutputEditorText.ui.h:1 ../qt/src/Ui_OutputEditorText.hh:52 msgid "Append to current text" msgstr "إلحاق بالنص المخرج الحالي" #: ../gtk/data/OutputEditorText.ui.h:2 ../qt/src/Ui_OutputEditorText.hh:53 msgid "Insert at cursor" msgstr "أدرج عند المؤشر" #: ../gtk/data/OutputEditorText.ui.h:3 ../qt/src/Ui_OutputEditorText.hh:54 msgid "Replace current text" msgstr "استبدل النص الحالي" #. Output postprocessing #: ../gtk/data/OutputEditorText.ui.h:4 ../qt/src/Ui_OutputEditorText.hh:62 msgid "Keep line break if..." msgstr "Ø§Ø­ØªÙØ¸ بإدراج السطر التالي إذا..." #: ../gtk/data/OutputEditorText.ui.h:5 ../qt/src/Ui_OutputEditorText.hh:64 msgid "Preceded by end mark (.?!)" msgstr "كان مسبوقا بعلامة ترقيم توق٠(.?!)" #: ../gtk/data/OutputEditorText.ui.h:6 ../qt/src/Ui_OutputEditorText.hh:66 msgid "Preceded or succeeded by quote" msgstr "مسبوقا أو متبوعا بعلامة تنصيص" #: ../gtk/data/OutputEditorText.ui.h:7 ../qt/src/Ui_OutputEditorText.hh:68 msgid "Other options" msgstr "خيارات أخرى" #: ../gtk/data/OutputEditorText.ui.h:8 ../qt/src/Ui_OutputEditorText.hh:70 msgid "Join hyphenated words" msgstr "ربط الكلمات المتقطعة ب -" #: ../gtk/data/OutputEditorText.ui.h:9 ../qt/src/Ui_OutputEditorText.hh:72 msgid "Collapse whitespace" msgstr "جمع Ø§Ù„Ù…Ø³Ø§ÙØ§Øª" #: ../gtk/data/OutputEditorText.ui.h:10 ../qt/src/Ui_OutputEditorText.hh:74 msgid "Preserve paragraphs" msgstr "Ø§Ø­ØªÙØ¸ بالÙقرات" #: ../gtk/data/OutputEditorText.ui.h:11 ../qt/src/Ui_OutputEditorText.hh:76 msgid "Visual aids" msgstr "مساعدة مرئية" #: ../gtk/data/OutputEditorText.ui.h:12 ../qt/src/Ui_OutputEditorText.hh:78 msgid "Draw whitespace" msgstr "Ø§Ø­Ø°Ù Ø§Ù„Ù…Ø³Ø§ÙØ©" #: ../gtk/data/OutputEditorText.ui.h:14 ../qt/src/Ui_OutputEditorText.hh:102 msgid "Strip line breaks on selected text" msgstr "احذ٠كسر السطر التالي للنص المحدد" #: ../gtk/data/OutputEditorText.ui.h:16 ../qt/src/Ui_OutputEditorText.hh:109 #: ../qt/src/Ui_OutputEditorText.hh:110 msgid "Undo" msgstr "تراجع" #: ../gtk/data/OutputEditorText.ui.h:17 ../qt/src/Ui_OutputEditorText.hh:112 #: ../qt/src/Ui_OutputEditorText.hh:113 msgid "Redo" msgstr "إعادة ÙØ¹Ù„" #: ../gtk/data/PdfExportDialog.ui.h:1 ../qt/data/PdfExportDialog.ui.h:1 msgid "PDF Export" msgstr "تصدير PDF" #: ../gtk/data/PdfExportDialog.ui.h:4 ../qt/data/PdfExportDialog.ui.h:4 msgid "Output mode:" msgstr "صيغة المخرجات:" #: ../gtk/data/PdfExportDialog.ui.h:5 ../qt/data/PdfExportDialog.ui.h:8 msgid "PDF" msgstr "PDF" #: ../gtk/data/PdfExportDialog.ui.h:6 ../qt/data/PdfExportDialog.ui.h:9 msgid "PDF with invisible text overlay" msgstr "PDF المصور الأصلي مع وجود نص بالخلÙية" #: ../gtk/data/PdfExportDialog.ui.h:7 ../qt/data/PdfExportDialog.ui.h:16 msgid "Format:" msgstr "النسق:" #: ../gtk/data/PdfExportDialog.ui.h:8 ../qt/data/PdfExportDialog.ui.h:17 msgid "Compression:" msgstr "الضغط:" #: ../gtk/data/PdfExportDialog.ui.h:9 ../qt/data/PdfExportDialog.ui.h:14 msgid "Compression quality:" msgstr "مقدار الضغط:" #: ../gtk/data/PdfExportDialog.ui.h:10 ../qt/data/PdfExportDialog.ui.h:15 msgid "DPI:" msgstr "الدقة النقطية:" #: ../gtk/data/PdfExportDialog.ui.h:11 ../qt/data/PdfExportDialog.ui.h:18 msgid "Dithering algorithm:" msgstr "خوارزمية التحويل لأسود وأبيض:" #: ../gtk/data/PdfExportDialog.ui.h:12 ../qt/data/PdfExportDialog.ui.h:13 msgid "Image settings:" msgstr "إعدادات الصورة:" #: ../gtk/data/PdfExportDialog.ui.h:13 ../qt/data/PdfExportDialog.ui.h:25 msgid "Uniformize line and word spacing" msgstr "وحد السطر مع Ù…Ø³Ø§ÙØ© الكلمة" #: ../gtk/data/PdfExportDialog.ui.h:14 ../qt/data/PdfExportDialog.ui.h:21 msgid "Override font family:" msgstr "حدد خطا Ù…Ø®ØªÙ„ÙØ§:" #: ../gtk/data/PdfExportDialog.ui.h:15 ../qt/data/PdfExportDialog.ui.h:27 msgid "Fallback font family:" msgstr "ÙÙŠ حال عدم ØªÙˆÙØ± الخط:" #: ../gtk/data/PdfExportDialog.ui.h:16 ../qt/data/PdfExportDialog.ui.h:20 msgid "Override font size:" msgstr "تحديد حجم الخط:" #: ../gtk/data/PdfExportDialog.ui.h:17 ../qt/data/PdfExportDialog.ui.h:23 msgid "Font scaling:" msgstr "مقياس الخط:" #: ../gtk/data/PdfExportDialog.ui.h:18 ../qt/data/PdfExportDialog.ui.h:26 msgid "pt" msgstr "نقطة" #: ../gtk/data/PdfExportDialog.ui.h:19 ../qt/data/PdfExportDialog.ui.h:22 msgid "Preserve spaces wider than:" msgstr "Ø§Ø­ØªÙØ¸ Ø¨Ø§Ù„Ù…Ø³Ø§ÙØ§Øª الأكبر من:" #: ../gtk/data/PdfExportDialog.ui.h:20 ../qt/data/PdfExportDialog.ui.h:24 msgid "characters" msgstr "الحروÙ" #: ../gtk/data/PdfExportDialog.ui.h:21 ../qt/data/PdfExportDialog.ui.h:19 msgid "Text settings:" msgstr "إعدادات النص:" #: ../gtk/data/PdfExportDialog.ui.h:22 ../qt/data/PdfExportDialog.ui.h:10 msgid "Paper size:" msgstr "مقاس Ø§Ù„ØµÙØ­Ø©:" #: ../gtk/data/PdfExportDialog.ui.h:23 ../qt/data/PdfExportDialog.ui.h:11 msgid "Width" msgstr "العرض" #: ../gtk/data/PdfExportDialog.ui.h:24 ../qt/data/PdfExportDialog.ui.h:12 msgid "Height" msgstr "الطول" #: ../gtk/data/PdfExportDialog.ui.h:25 ../qt/data/PdfExportDialog.ui.h:3 msgid "Basic" msgstr "الأساسي" #: ../gtk/data/PdfExportDialog.ui.h:26 ../qt/data/PdfExportDialog.ui.h:29 msgid "PDF version:" msgstr "النسخة الرقمية للـ PDF:" #: ../gtk/data/PdfExportDialog.ui.h:27 ../qt/data/PdfExportDialog.ui.h:31 msgid "Password:" msgstr "كلمة السر:" #: ../gtk/data/PdfExportDialog.ui.h:28 ../qt/data/PdfExportDialog.ui.h:32 msgid "Confirm password:" msgstr "تأكيد كلمة السر:" #: ../gtk/data/PdfExportDialog.ui.h:29 ../qt/data/PdfExportDialog.ui.h:30 msgid "Encryption (optional):" msgstr "التشÙير (اختياري):" #: ../gtk/data/PdfExportDialog.ui.h:30 ../qt/data/PdfExportDialog.ui.h:34 msgid "Author:" msgstr "المؤلÙ:" #: ../gtk/data/PdfExportDialog.ui.h:31 ../qt/data/PdfExportDialog.ui.h:36 msgid "Title:" msgstr "العنوان:" #: ../gtk/data/PdfExportDialog.ui.h:32 ../qt/data/PdfExportDialog.ui.h:38 msgid "Subject:" msgstr "الموضوع:" #: ../gtk/data/PdfExportDialog.ui.h:33 ../qt/data/PdfExportDialog.ui.h:35 msgid "Creator:" msgstr "صانع الملÙ:" #: ../gtk/data/PdfExportDialog.ui.h:34 ../qt/data/PdfExportDialog.ui.h:37 msgid "Producer:" msgstr "منتج الملÙ:" #: ../gtk/data/PdfExportDialog.ui.h:35 ../qt/data/PdfExportDialog.ui.h:39 msgid "Keywords:" msgstr "الكلمات Ø§Ù„Ù…ÙØªØ§Ø­ÙŠØ©:" #: ../gtk/data/PdfExportDialog.ui.h:36 ../qt/data/PdfExportDialog.ui.h:33 msgid "Additional information (optional):" msgstr "معلومات أخرى(اختياري):" #: ../gtk/data/PdfExportDialog.ui.h:37 ../qt/data/PdfExportDialog.ui.h:40 msgid "Import from current source" msgstr "استخرج من المصدر الحالي" #: ../gtk/data/PdfExportDialog.ui.h:38 ../qt/data/PdfExportDialog.ui.h:28 msgid "Advanced" msgstr "متقدم" #: ../gtk/data/SearchReplaceFrame.ui.h:1 ../qt/data/SearchReplaceFrame.ui.h:4 msgid "Find" msgstr "بحث" #: ../gtk/data/SearchReplaceFrame.ui.h:2 ../qt/data/SearchReplaceFrame.ui.h:2 msgid "Replace" msgstr "استبدال" #: ../gtk/data/SearchReplaceFrame.ui.h:3 ../qt/data/SearchReplaceFrame.ui.h:3 msgid "Replace all" msgstr "استبدال الكل" #: ../gtk/data/SearchReplaceFrame.ui.h:4 ../qt/data/SearchReplaceFrame.ui.h:5 msgid "Find previous" msgstr "بحث سابق" #: ../gtk/data/SearchReplaceFrame.ui.h:5 ../qt/data/SearchReplaceFrame.ui.h:6 msgid "Find next" msgstr "بحث لاحق" #: ../gtk/data/SearchReplaceFrame.ui.h:6 ../qt/data/SearchReplaceFrame.ui.h:7 msgid "Match case" msgstr "طابق نسق الحر٠case للإنجليزي" #: ../gtk/data/SearchReplaceFrame.ui.h:7 #: ../gtk/data/SubstitutionsManager.ui.h:1 ../qt/data/SearchReplaceFrame.ui.h:1 #: ../qt/src/SubstitutionsManager.cc:36 msgid "Substitutions" msgstr "استبدالات" #: ../gtk/data/SelectionMenu.ui.h:1 ../qt/src/DisplayerToolSelect.cc:236 msgid "Delete" msgstr "حذÙ" #: ../gtk/data/SelectionMenu.ui.h:2 ../qt/src/DisplayerToolSelect.cc:222 msgid "Order:" msgstr "الترتيب:" #: ../gtk/data/SelectionMenu.ui.h:3 ../gtk/src/hocr/DisplayerToolHOCR.cc:29 #: ../qt/src/DisplayerToolSelect.cc:237 ../qt/src/hocr/DisplayerToolHOCR.cc:31 msgid "Recognize" msgstr "تعر٠ضوئي" #: ../gtk/data/SelectionMenu.ui.h:4 ../qt/src/DisplayerToolSelect.cc:238 msgid "Recognize to clipboard" msgstr "تعر٠ضوئي إلى Ø§Ù„Ø­Ø§ÙØ¸Ø©" #: ../gtk/data/SelectionMenu.ui.h:5 ../qt/src/DisplayerToolSelect.cc:239 msgid "Save as image" msgstr "Ø§Ø­ÙØ¸ كصورة" #: ../gtk/data/SubstitutionsManager.ui.h:2 ../qt/src/SubstitutionsManager.cc:38 #: ../qt/src/SubstitutionsManager.cc:39 msgid "Open" msgstr "ÙØªØ­" #: ../gtk/data/SubstitutionsManager.ui.h:3 ../gtk/src/Utils.cc:73 #: ../qt/src/SubstitutionsManager.cc:41 ../qt/src/SubstitutionsManager.cc:42 msgid "Save" msgstr "Ø­ÙØ¸" #: ../gtk/data/SubstitutionsManager.ui.h:4 ../qt/src/SubstitutionsManager.cc:44 #: ../qt/src/SubstitutionsManager.cc:45 msgid "Clear" msgstr "مسح الكل" #: ../gtk/data/SubstitutionsManager.ui.h:5 ../qt/data/ConfigDialog.ui.h:16 #: ../qt/src/SubstitutionsManager.cc:47 ../qt/src/SubstitutionsManager.cc:48 msgid "Add" msgstr "Ø¥Ø¶Ø§ÙØ©" #: ../gtk/data/SubstitutionsManager.ui.h:6 #: ../gtk/src/hocr/OutputEditorHOCR.cc:864 ../qt/data/ConfigDialog.ui.h:17 #: ../qt/src/hocr/OutputEditorHOCR.cc:709 ../qt/src/SubstitutionsManager.cc:50 #: ../qt/src/SubstitutionsManager.cc:51 msgid "Remove" msgstr "إلغاء" #: ../gtk/data/SubstitutionsManager.ui.h:7 ../gtk/data/TessdataManager.ui.h:2 msgid "Apply" msgstr "تطبيق" #: ../gtk/data/SubstitutionsManager.ui.h:8 ../gtk/data/TessdataManager.ui.h:3 msgid "Close" msgstr "إغلاق" #: ../gtk/data/TessdataManager.ui.h:1 ../qt/src/TessdataManager.cc:49 msgid "Tessdata Manager" msgstr "مدير Tessdata" #: ../gtk/data/TessdataManager.ui.h:5 ../qt/src/TessdataManager.cc:51 msgid "Manage installed languages:" msgstr "إدارة لغات التعر٠المثبتة:" #: ../gtk/src/Acquirer.cc:79 ../qt/src/Acquirer.cc:70 msgid "scan.png" msgstr "scan.png" #: ../gtk/src/Acquirer.cc:91 ../qt/src/Acquirer.cc:85 msgid "Images" msgstr "صور" #: ../gtk/src/Acquirer.cc:92 ../qt/src/Acquirer.cc:86 msgid "Choose Output Filename..." msgstr "اختر اسم المل٠للمخرج..." #: ../gtk/src/Acquirer.cc:106 ../qt/src/Acquirer.cc:100 msgid "Failed to initialize the scanning backend." msgstr "ÙØ´Ù„ ÙÙŠ تهيئة المسح الضوئي." #: ../gtk/src/Acquirer.cc:115 ../qt/src/Acquirer.cc:106 msgid "Scan failed" msgstr "ÙØ´Ù„ المسح الضوئي" #: ../gtk/src/Acquirer.cc:133 ../qt/src/Acquirer.cc:122 msgid "No scanners were detected." msgstr "لم يتم اكتشا٠أي ماسحات ضوئية." #: ../gtk/src/Acquirer.cc:150 ../gtk/src/Acquirer.cc:168 #: ../qt/src/Acquirer.cc:136 ../qt/src/Acquirer.cc:154 msgid "Starting scan..." msgstr "بدء المسح الضوئي..." #: ../gtk/src/Acquirer.cc:164 ../qt/src/Acquirer.cc:150 msgid "Opening device..." msgstr "ÙØªØ­ جهاز..." #: ../gtk/src/Acquirer.cc:166 ../qt/src/Acquirer.cc:152 msgid "Setting options..." msgstr "خيارات الإعدادات..." #: ../gtk/src/Acquirer.cc:170 ../qt/src/Acquirer.cc:156 msgid "Getting parameters..." msgstr "الحصول على المدخلات..." #: ../gtk/src/Acquirer.cc:172 ../qt/src/Acquirer.cc:158 msgid "Transferring data..." msgstr "نقل البيانات..." #: ../gtk/src/Acquirer.cc:179 ../qt/src/Acquirer.cc:165 msgid "Canceling scan..." msgstr "إلغاء المسح الضوئي..." #: ../gtk/src/Config.cc:290 ../qt/data/ConfigDialog.ui.h:7 msgid "Filename prefix" msgstr "بادئة اسم الملÙ" #: ../gtk/src/Config.cc:291 ../qt/data/ConfigDialog.ui.h:8 msgid "Code" msgstr "الرمز" #: ../gtk/src/Config.cc:292 ../qt/data/ConfigDialog.ui.h:9 msgid "Native name" msgstr "الاسم الأصلي" #: ../gtk/src/CrashHandler.cc:25 ../gtk/src/CrashHandler.cc:39 #: ../qt/src/CrashHandler.cc:34 msgid "Crash Handler" msgstr "مدير أخطاء البرنامج" #: ../gtk/src/CrashHandler.cc:41 ../qt/src/CrashHandler.cc:29 msgid "Your work has been saved under %1." msgstr "عملك تم Ø­ÙØ¸Ù‡ ÙÙŠ %1." #: ../gtk/src/CrashHandler.cc:43 ../qt/src/CrashHandler.cc:31 msgid "There was no unsaved work." msgstr "لا توجد أعمال محÙوظة." #: ../gtk/src/CrashHandler.cc:102 ../qt/src/CrashHandler.cc:60 msgid "Failed to obtain backtrace. Is gdb installed?" msgstr "ÙØ´Ù„ ÙÙŠ الحصول على سجلات الأخطاء. هل برنامج gdb مثبت؟" #: ../gtk/src/Displayer.cc:232 ../qt/src/Displayer.cc:173 msgid "Failed to load image" msgstr "ÙØ´Ù„ ÙÙŠ تحميل الصورة" #: ../gtk/src/Displayer.cc:232 ../qt/src/Displayer.cc:173 msgid "" "The file might not be an image or be corrupt:\n" "%1" msgstr "" "هذا المل٠يبدو أنه ليس صورة:\n" "%1" #: ../gtk/src/DisplayerToolSelect.cc:138 ../qt/src/DisplayerToolSelect.cc:135 msgid "PNG Images" msgstr "صور PNG" #: ../gtk/src/DisplayerToolSelect.cc:139 ../qt/src/DisplayerToolSelect.cc:135 msgid "Save Selection Image" msgstr "Ø§Ø­ÙØ¸ الصورة المختارة" #: ../gtk/src/DisplayerToolSelect.cc:139 ../qt/src/DisplayerToolSelect.cc:135 msgid "selection.png" msgstr "selection.png" #: ../gtk/src/DisplayerToolSelect.cc:146 ../qt/src/DisplayerToolSelect.cc:142 msgid "Recognize all" msgstr "التعر٠الضوئي للكل" #: ../gtk/src/DisplayerToolSelect.cc:146 ../qt/src/DisplayerToolSelect.cc:142 msgid "Recognize selection" msgstr "التعر٠على التحديد" #: ../gtk/src/DisplayerToolSelect.cc:183 ../qt/src/DisplayerToolSelect.cc:179 msgid "Performing layout analysis" msgstr "إجراء تحليل للتخطيط" #: ../gtk/src/FileDialogs.cc:235 msgid "" "A file named \"%1\" already exists. Are you sure you want to overwrite it?" msgstr "المل٠المسمى \"%1\" موجود Ø¨Ø§Ù„ÙØ¹Ù„. هل أنت متأكد أنك تريد استبداله؟" #: ../gtk/src/FileDialogs.cc:237 msgid "Overwrite File?" msgstr "استبدال Ø§Ù„Ù…Ù„ÙØŸ" #: ../gtk/src/hocr/HOCRDocument.cc:516 ../gtk/src/hocr/OutputEditorHOCR.cc:266 #: ../qt/src/hocr/OutputEditorHOCR.cc:229 msgid "Page" msgstr "Ø§Ù„ØµÙØ­Ø©" #: ../gtk/src/hocr/HOCRDocument.cc:518 ../qt/src/hocr/HOCRDocument.cc:441 msgid "Text block" msgstr "كتلة النص" #: ../gtk/src/hocr/HOCRDocument.cc:520 ../gtk/src/hocr/OutputEditorHOCR.cc:272 #: ../qt/src/hocr/HOCRDocument.cc:443 ../qt/src/hocr/OutputEditorHOCR.cc:231 msgid "Paragraph" msgstr "الÙقرة" #: ../gtk/src/hocr/HOCRDocument.cc:522 ../qt/src/hocr/HOCRDocument.cc:445 msgid "Textline" msgstr "السطر" #: ../gtk/src/hocr/HOCRDocument.cc:526 ../qt/src/hocr/HOCRDocument.cc:449 msgid "Graphic" msgstr "تصويري" #: ../gtk/src/hocr/HOCROdtExporter.cc:64 ../gtk/src/hocr/HOCRPdfExporter.cc:491 #: ../gtk/src/hocr/HOCRTextExporter.cc:34 #: ../gtk/src/hocr/OutputEditorHOCR.cc:941 ../gtk/src/OutputEditorText.cc:272 #: ../qt/src/hocr/HOCROdtExporter.cc:50 ../qt/src/hocr/HOCRPdfExporter.cc:480 #: ../qt/src/hocr/HOCRTextExporter.cc:36 ../qt/src/hocr/OutputEditorHOCR.cc:808 #: ../qt/src/OutputEditorText.cc:238 msgid "output" msgstr "المخرج" #: ../gtk/src/hocr/HOCROdtExporter.cc:67 ../qt/src/hocr/HOCROdtExporter.cc:53 msgid "OpenDocument Text Documents" msgstr "مستندات من نوع OpenDocument" #: ../gtk/src/hocr/HOCROdtExporter.cc:68 ../qt/src/hocr/HOCROdtExporter.cc:53 msgid "Save ODT Output..." msgstr "Ø§Ø­ÙØ¸ بصيغة ODT وورد..." #: ../gtk/src/hocr/HOCROdtExporter.cc:76 ../gtk/src/hocr/HOCROdtExporter.cc:272 #: ../gtk/src/hocr/HOCRPdfExporter.cc:607 #: ../gtk/src/hocr/HOCRTextExporter.cc:46 ../qt/src/hocr/HOCROdtExporter.cc:61 #: ../qt/src/hocr/HOCRPdfExporter.cc:600 ../qt/src/hocr/HOCRTextExporter.cc:47 msgid "Export failed" msgstr "ÙØ´Ù„ ÙÙŠ التصدير" #: ../gtk/src/hocr/HOCROdtExporter.cc:76 ../gtk/src/hocr/HOCROdtExporter.cc:272 #: ../qt/src/hocr/HOCROdtExporter.cc:61 msgid "The ODT export failed: unable to write output file." msgstr "ÙØ´Ù„ ÙÙŠ التصدير: كتابة المخرجات غير ممكنة." #: ../gtk/src/hocr/HOCROdtExporter.cc:266 ../qt/src/hocr/HOCROdtExporter.cc:254 msgid "Exporting to ODT..." msgstr "تصدير بصيغة ODT وورد..." #: ../gtk/src/hocr/HOCRPdfExporter.cc:283 ../qt/src/hocr/HOCRPdfExporter.cc:365 msgid "Same as source" msgstr "Ø¨Ù†ÙØ³ نسق المصدر" #: ../gtk/src/hocr/HOCRPdfExporter.cc:286 ../qt/src/hocr/HOCRPdfExporter.cc:366 msgid "Custom" msgstr "تهيئة خاصة" #: ../gtk/src/hocr/HOCRPdfExporter.cc:300 ../qt/src/hocr/HOCRPdfExporter.cc:362 msgid "cm" msgstr "سنتيمتر" #: ../gtk/src/hocr/HOCRPdfExporter.cc:303 ../qt/src/hocr/HOCRPdfExporter.cc:363 msgid "in" msgstr "بوصة" #: ../gtk/src/hocr/HOCRPdfExporter.cc:319 ../qt/src/hocr/HOCRPdfExporter.cc:353 msgid "Monochrome" msgstr "أسود وأبيض" #: ../gtk/src/hocr/HOCRPdfExporter.cc:328 ../qt/src/hocr/HOCRPdfExporter.cc:355 msgid "Threshold (closest color)" msgstr "أقرب لون" #: ../gtk/src/hocr/HOCRPdfExporter.cc:331 ../qt/src/hocr/HOCRPdfExporter.cc:356 msgid "Diffuse" msgstr "انتشار لوني" #: ../gtk/src/hocr/HOCRPdfExporter.cc:340 ../qt/src/hocr/HOCRPdfExporter.cc:357 msgid "Zip (lossless)" msgstr "Zip (Ø¨Ù†ÙØ³ جودة الأصل)" #: ../gtk/src/hocr/HOCRPdfExporter.cc:344 ../qt/src/hocr/HOCRPdfExporter.cc:358 msgid "CCITT Group 4 (lossless)" msgstr "CCITT Group 4 (Ø¨Ù†ÙØ³ جودة الأصل)" #: ../gtk/src/hocr/HOCRPdfExporter.cc:348 ../qt/src/hocr/HOCRPdfExporter.cc:359 msgid "Jpeg (lossy)" msgstr "JPG (أقل من جودة الأصل)" #: ../gtk/src/hocr/HOCRPdfExporter.cc:495 ../qt/src/hocr/HOCRPdfExporter.cc:484 msgid "PDF Files" msgstr "Ù…Ù„ÙØ§Øª PDF" #: ../gtk/src/hocr/HOCRPdfExporter.cc:496 ../qt/src/hocr/HOCRPdfExporter.cc:484 msgid "Save PDF Output..." msgstr "Ø­ÙØ¸ مخرج الـPDF..." #: ../gtk/src/hocr/HOCRPdfExporter.cc:502 ../qt/src/hocr/HOCRPdfExporter.cc:490 msgid "Invalid Output" msgstr "مخرج خاطئ" #: ../gtk/src/hocr/HOCRPdfExporter.cc:502 ../qt/src/hocr/HOCRPdfExporter.cc:490 msgid "Cannot overwrite a file which is a source image of this document." msgstr "لا يمكن استبدال المل٠المصدر لهذا المستند." #: ../gtk/src/hocr/HOCRPdfExporter.cc:518 ../qt/src/hocr/HOCRPdfExporter.cc:513 msgid "Failed to create output" msgstr "ÙØ´Ù„ ÙÙŠ إنشاء المخرج" #: ../gtk/src/hocr/HOCRPdfExporter.cc:518 ../qt/src/hocr/HOCRPdfExporter.cc:513 msgid "Failed to create output. The returned error was: %1" msgstr "ÙØ´Ù„ ÙÙŠ إنشاء المخرج. سجل الخطأ هو: %1" #: ../gtk/src/hocr/HOCRPdfExporter.cc:560 ../qt/src/hocr/HOCRPdfExporter.cc:553 msgid "The operation was cancelled" msgstr "تم إلغاء العملية" #: ../gtk/src/hocr/HOCRPdfExporter.cc:595 ../qt/src/hocr/HOCRPdfExporter.cc:588 msgid "Failed to render page %1" msgstr "ÙØ´Ù„ ÙÙŠ محاولة رسم Ø§Ù„ØµÙØ­Ø© %1" #: ../gtk/src/hocr/HOCRPdfExporter.cc:602 ../qt/src/hocr/HOCRPdfExporter.cc:595 msgid "Exporting to PDF..." msgstr "Ø­ÙØ¸ بصيغة PDF نصي..." #: ../gtk/src/hocr/HOCRPdfExporter.cc:607 ../qt/src/hocr/HOCRPdfExporter.cc:600 msgid "The PDF export failed: %1." msgstr "ÙØ´Ù„ ÙÙŠ تصدير PDF: %1." #: ../gtk/src/hocr/HOCRPdfExporter.cc:657 ../qt/src/hocr/HOCRPdfExporter.cc:649 msgid "The PDF library could not load the font '%1'." msgstr "مكتبة PDF لا يمكنها تحميل هذا الخط '%1'." #: ../gtk/src/hocr/HOCRTextExporter.cc:37 ../gtk/src/OutputEditorText.cc:274 #: ../qt/src/hocr/HOCRTextExporter.cc:39 ../qt/src/OutputEditorText.cc:239 msgid "Text Files" msgstr "Ù…Ù„ÙØ§Øª نصية txt" #: ../gtk/src/hocr/HOCRTextExporter.cc:38 ../qt/src/hocr/HOCRTextExporter.cc:39 msgid "Save Text Output..." msgstr "Ø§Ø­ÙØ¸ بصيغة مل٠نصي txt..." #: ../gtk/src/hocr/HOCRTextExporter.cc:46 ../qt/src/hocr/HOCRTextExporter.cc:47 msgid "The text export failed: unable to write output file." msgstr "عملية تصدير المل٠النصي ÙØ´Ù„ت: لا يمكن كتابة المل٠على الحاسوب." #: ../gtk/src/hocr/OutputEditorHOCR.cc:269 #: ../qt/src/hocr/OutputEditorHOCR.cc:230 msgid "Block" msgstr "كتلة" #: ../gtk/src/hocr/OutputEditorHOCR.cc:275 #: ../qt/src/hocr/OutputEditorHOCR.cc:232 msgid "Line" msgstr "السطر" #: ../gtk/src/hocr/OutputEditorHOCR.cc:278 #: ../qt/src/hocr/OutputEditorHOCR.cc:233 msgid "Word" msgstr "الكلمة" #: ../gtk/src/hocr/OutputEditorHOCR.cc:281 #: ../qt/src/hocr/OutputEditorHOCR.cc:234 msgid "Misspelled word" msgstr "كلمة خاطئة إملائيا" #: ../gtk/src/hocr/OutputEditorHOCR.cc:435 #: ../qt/src/hocr/OutputEditorHOCR.cc:317 msgid "" "The following pages could not be processed:\n" "%1" msgstr "" "Ø§Ù„ØµÙØ­Ø§Øª التالية لا يمكن معالجتها:\n" "%1" #: ../gtk/src/hocr/OutputEditorHOCR.cc:436 #: ../qt/src/hocr/OutputEditorHOCR.cc:318 msgid "Recognition errors" msgstr "أخطاء ÙÙŠ التعر٠الضوئي" #: ../gtk/src/hocr/OutputEditorHOCR.cc:594 #: ../qt/src/hocr/OutputEditorHOCR.cc:500 #: ../qt/src/hocr/OutputEditorHOCR.cc:512 msgid "Multiple values" msgstr "قيم متعددة" #. Merging allowed #: ../gtk/src/hocr/OutputEditorHOCR.cc:771 #: ../qt/src/hocr/OutputEditorHOCR.cc:631 msgid "Merge" msgstr "دمج" #. Swapping allowed #: ../gtk/src/hocr/OutputEditorHOCR.cc:780 #: ../qt/src/hocr/OutputEditorHOCR.cc:634 msgid "Swap" msgstr "تبديل" #: ../gtk/src/hocr/OutputEditorHOCR.cc:803 #: ../qt/src/hocr/OutputEditorHOCR.cc:675 msgid "Add graphic region" msgstr "Ø¥Ø¶Ø§ÙØ© منطقة للتعر٠الضوئي" #: ../gtk/src/hocr/OutputEditorHOCR.cc:806 #: ../qt/src/hocr/OutputEditorHOCR.cc:676 msgid "Add text block" msgstr "Ø¥Ø¶Ø§ÙØ© كتلة نص" #: ../gtk/src/hocr/OutputEditorHOCR.cc:810 #: ../qt/src/hocr/OutputEditorHOCR.cc:678 msgid "Add paragraph" msgstr "Ø¥Ø¶Ø§ÙØ© Ùقرة" #: ../gtk/src/hocr/OutputEditorHOCR.cc:814 #: ../qt/src/hocr/OutputEditorHOCR.cc:680 msgid "Add line" msgstr "Ø¥Ø¶Ø§ÙØ© سطر" #: ../gtk/src/hocr/OutputEditorHOCR.cc:818 #: ../qt/src/hocr/OutputEditorHOCR.cc:682 msgid "Add word" msgstr "Ø¥Ø¶Ø§ÙØ© كلمة" #: ../gtk/src/hocr/OutputEditorHOCR.cc:840 #: ../qt/src/hocr/OutputEditorHOCR.cc:695 msgid "No suggestions" msgstr "لا توجد اقتراحات" #: ../gtk/src/hocr/OutputEditorHOCR.cc:846 #: ../qt/src/hocr/OutputEditorHOCR.cc:699 msgid "Add to dictionary" msgstr "Ø¥Ø¶Ø§ÙØ© إلى القاموس" #: ../gtk/src/hocr/OutputEditorHOCR.cc:852 #: ../qt/src/hocr/OutputEditorHOCR.cc:701 msgid "Ignore word" msgstr "تجاهل الكلمة" #: ../gtk/src/hocr/OutputEditorHOCR.cc:904 #: ../gtk/src/hocr/OutputEditorHOCR.cc:943 #: ../qt/src/hocr/OutputEditorHOCR.cc:773 #: ../qt/src/hocr/OutputEditorHOCR.cc:810 msgid "hOCR HTML Files" msgstr "مل٠HTML بصيغة hOCR" #: ../gtk/src/hocr/OutputEditorHOCR.cc:905 #: ../qt/src/hocr/OutputEditorHOCR.cc:773 msgid "Open hOCR File" msgstr "ÙØªØ­ مل٠hOCR" #: ../gtk/src/hocr/OutputEditorHOCR.cc:914 #: ../qt/src/hocr/OutputEditorHOCR.cc:780 msgid "Failed to open file" msgstr "ÙØ´Ù„ت عملية ÙØªØ­ الملÙ" #: ../gtk/src/hocr/OutputEditorHOCR.cc:914 #: ../qt/src/hocr/OutputEditorHOCR.cc:780 msgid "The file could not be opened: %1." msgstr "هذ المل٠لا يمكن ÙØªØ­Ù‡: %1." #: ../gtk/src/hocr/OutputEditorHOCR.cc:923 #: ../qt/src/hocr/OutputEditorHOCR.cc:787 msgid "Invalid hOCR file" msgstr "مل٠hOCR غير صالح" #: ../gtk/src/hocr/OutputEditorHOCR.cc:923 #: ../qt/src/hocr/OutputEditorHOCR.cc:787 msgid "The file does not appear to contain valid hOCR HTML: %1" msgstr "هذا المل٠لا يبدو أنه يحتوي على hOCR HTML صالح: %1" #: ../gtk/src/hocr/OutputEditorHOCR.cc:944 #: ../qt/src/hocr/OutputEditorHOCR.cc:810 msgid "Save hOCR Output..." msgstr "Ø§Ø­ÙØ¸ مخرج hOCR..." #: ../gtk/src/hocr/OutputEditorHOCR.cc:951 ../gtk/src/OutputEditorText.cc:282 #: ../qt/src/hocr/OutputEditorHOCR.cc:817 ../qt/src/OutputEditorText.cc:246 msgid "Failed to save output" msgstr "ÙØ´Ù„ت عملية Ø­ÙØ¸ المخرج" #: ../gtk/src/hocr/OutputEditorHOCR.cc:951 ../gtk/src/OutputEditorText.cc:282 #: ../qt/src/hocr/OutputEditorHOCR.cc:817 ../qt/src/OutputEditorText.cc:246 msgid "Check that you have writing permissions in the selected folder." msgstr "قم بالتأكد أنك تملك صلاحية كتابة Ø§Ù„Ù…Ù„ÙØ§Øª ÙÙŠ المجلد المحدد." #: ../gtk/src/hocr/OutputEditorHOCR.cc:1010 ../gtk/src/OutputEditorText.cc:296 #: ../qt/src/hocr/OutputEditorHOCR.cc:869 ../qt/src/OutputEditorText.cc:259 msgid "Output not saved" msgstr "المخرج لم يتم Ø­ÙØ¸Ù‡" #: ../gtk/src/hocr/OutputEditorHOCR.cc:1010 ../gtk/src/OutputEditorText.cc:296 #: ../qt/src/hocr/OutputEditorHOCR.cc:869 ../qt/src/OutputEditorText.cc:259 msgid "Save output before proceeding?" msgstr "Ø­ÙØ¸ المخرج قبل المتابعة؟" #: ../gtk/src/hocr/OutputEditorHOCR.cc:1131 ../gtk/src/OutputEditorText.cc:184 #: ../qt/src/hocr/OutputEditorHOCR.cc:966 ../qt/src/OutputEditorText.cc:152 msgid "Replacing..." msgstr "جار الاستبدال..." #: ../gtk/src/hocr/OutputEditorHOCR.cc:1156 ../gtk/src/OutputEditorText.cc:192 #: ../qt/src/hocr/OutputEditorHOCR.cc:989 ../qt/src/OutputEditorText.cc:160 msgid "Applying substitutions..." msgstr "جار تطبيق الاستبدالات..." #: ../gtk/src/MainWindow.cc:123 ../qt/src/MainWindow.cc:286 msgid "Using tesseract" msgstr "باستخدام محرك التعر٠tesseract" #: ../gtk/src/MainWindow.cc:170 ../qt/src/MainWindow.cc:185 msgid "Select an image to begin..." msgstr "اختر صورة للبدء..." #: ../gtk/src/MainWindow.cc:285 ../qt/src/MainWindow.cc:269 msgid "Multiple sources" msgstr "مصادر متعددة" #: ../gtk/src/MainWindow.cc:287 ../qt/src/MainWindow.cc:271 msgid "Ready" msgstr "مستعد" #: ../gtk/src/MainWindow.cc:430 ../qt/src/MainWindow.cc:409 msgid "New version" msgstr "نسخة جديدة" #: ../gtk/src/MainWindow.cc:430 ../qt/src/MainWindow.cc:409 msgid "gImageReader %1 is available" msgstr "البرنامج gImageReader %1 Ù…ØªÙˆÙØ±" #: ../gtk/src/MainWindow.cc:431 ../qt/src/MainWindow.cc:410 msgid "Download" msgstr "تنزيل" #: ../gtk/src/MainWindow.cc:432 ../qt/src/MainWindow.cc:411 msgid "Changelog" msgstr "سجل التغييرات" #: ../gtk/src/MainWindow.cc:433 ../qt/src/MainWindow.cc:412 msgid "Don't notify again" msgstr "لا تقم بإعلامي مرة أخرى" #: ../gtk/src/MainWindow.cc:454 ../qt/src/MainWindow.cc:460 msgid "Don't show again" msgstr "لا تعرض هذا مرة أخرى" #: ../gtk/src/MainWindow.cc:455 ../gtk/src/MainWindow.cc:468 #: ../qt/src/MainWindow.cc:461 msgid "Install" msgstr "تثبيت" #: ../gtk/src/MainWindow.cc:475 ../qt/src/MainWindow.cc:473 msgid "Spelling dictionary missing" msgstr "قاموس التدقيق الإملائي غير موجود" #: ../gtk/src/MainWindow.cc:475 ../qt/src/MainWindow.cc:473 msgid "The spellcheck dictionary for %1 is not installed" msgstr "قاموس التدقيق الإملائي لـ %1 غير مثبت" #: ../gtk/src/MainWindow.cc:482 ../gtk/src/MainWindow.cc:514 #: ../qt/src/MainWindow.cc:480 msgid "Installing spelling dictionary for '%1'" msgstr "جار تثبيت قاموس التدقيق الإملائي لـ '%1'" #: ../gtk/src/MainWindow.cc:503 ../gtk/src/MainWindow.cc:528 #: ../gtk/src/MainWindow.cc:536 ../gtk/src/MainWindow.cc:546 #: ../gtk/src/MainWindow.cc:552 ../gtk/src/MainWindow.cc:582 #: ../gtk/src/Recognizer.cc:151 ../gtk/src/TessdataManager.cc:59 #: ../gtk/src/TessdataManager.cc:69 ../gtk/src/TessdataManager.cc:291 #: ../qt/src/MainWindow.cc:499 ../qt/src/MainWindow.cc:512 #: ../qt/src/MainWindow.cc:522 ../qt/src/MainWindow.cc:532 #: ../qt/src/MainWindow.cc:540 ../qt/src/MainWindow.cc:570 #: ../qt/src/Recognizer.cc:138 ../qt/src/TessdataManager.cc:74 #: ../qt/src/TessdataManager.cc:84 ../qt/src/TessdataManager.cc:275 msgid "Error" msgstr "خطأ" #: ../gtk/src/MainWindow.cc:503 ../qt/src/MainWindow.cc:499 msgid "Failed to install spelling dictionary: %1" msgstr "ÙØ´Ù„ ÙÙŠ تثبيت قاموس التدقيق الإملائي: %1" #: ../gtk/src/MainWindow.cc:528 ../qt/src/MainWindow.cc:512 msgid "Failed to create directory for spelling dictionaries." msgstr "ÙØ´Ù„ ÙÙŠ إنشاء مجلد قواميس التدقيق الإملائي." #: ../gtk/src/MainWindow.cc:536 ../gtk/src/MainWindow.cc:552 #: ../qt/src/MainWindow.cc:522 msgid "Could not read %1: %2." msgstr "لا يمكن قراءة %1: %2." #: ../gtk/src/MainWindow.cc:546 ../qt/src/MainWindow.cc:532 msgid "No spelling dictionaries found for '%1'." msgstr "لا يتم العثور على قواميس تدقيق إملائي لـ '%1'." #: ../gtk/src/MainWindow.cc:563 ../qt/src/MainWindow.cc:552 msgid "Downloading '%1'..." msgstr "جار التنزيل '%1'..." #: ../gtk/src/MainWindow.cc:582 ../qt/src/MainWindow.cc:570 msgid "" "The following dictionaries could not be downloaded:\n" "%1\n" "\n" "Check the connectivity and directory permissions.\n" "Hint: If you don't have write permissions in system folders, you can switch " "to user paths in the settings dialog." msgstr "" "هذا القواميس لا يمكن تنزيلها \n" "%1\n" "\n" "تأكد من اتصالك بالشبكة وصلاحيات المجلد\n" "تلميح: إذا كان لا يمكنك الكتابة ÙÙŠ مجلدات النظام، يمكنك أن تتحول إلى مسار " "المستخدمين ÙÙŠ الإعدادت." #: ../gtk/src/MainWindow.cc:585 ../qt/src/MainWindow.cc:573 msgid "Dictionaries installed" msgstr "القواميس تم تثبيتها" #: ../gtk/src/MainWindow.cc:585 msgid "" "The following dictionaries were installed:\n" "%1" msgstr "" "هذه القواميس تم تثبيتها:\n" "%1" #: ../gtk/src/OutputEditorText.cc:154 ../qt/src/OutputEditorText.cc:137 msgid "Stripping line breaks..." msgstr "إزالة كسر السطور..." #: ../gtk/src/OutputEditorText.cc:162 msgid "Check spelling" msgstr "Ø§ÙØ­Øµ إملائيا" #: ../gtk/src/OutputEditorText.cc:231 ../qt/src/OutputEditorText.cc:196 msgid "File: %1" msgstr "ملÙ: %1" #: ../gtk/src/OutputEditorText.cc:234 ../qt/src/OutputEditorText.cc:199 msgid "Page: %1" msgstr "ØµÙØ­Ø©: %1" #: ../gtk/src/OutputEditorText.cc:247 ../gtk/src/Recognizer.cc:476 #: ../qt/src/Recognizer.cc:469 msgid "" "\n" "[Failed to recognize page %1]\n" msgstr "" "\n" "[خطأ ÙÙŠ التعر٠الضوئي Ù„Ù„ØµÙØ­Ø© %1]\n" #: ../gtk/src/OutputEditorText.cc:275 ../qt/src/OutputEditorText.cc:239 msgid "Save Output..." msgstr "Ø­ÙØ¸ المخرج..." #: ../gtk/src/Recognizer.cc:144 ../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:200 ../qt/src/Recognizer.cc:191 msgid "No languages available" msgstr "لا توجد لغات متاحة" #: ../gtk/src/Recognizer.cc:200 ../qt/src/Recognizer.cc:191 msgid "" "No tesseract languages are available for use. Recognition will not work." msgstr "لا توجد لغات تعر٠ضوئي لمحرك التعر٠tesseract. التعر٠الضوئي لن يعمل." #: ../gtk/src/Recognizer.cc:254 ../qt/src/Recognizer.cc:251 msgid "Multilingual" msgstr "بلغات متعددة" #: ../gtk/src/Recognizer.cc:306 ../qt/src/Recognizer.cc:296 msgid "Automatic page segmentation" msgstr "تقسيم تخطيط Ø§Ù„ØµÙØ­Ø© بشكل تلقائي" #: ../gtk/src/Recognizer.cc:307 ../qt/src/Recognizer.cc:297 msgid "Page segmentation with orientation and script detection" msgstr "تقسيم تخطيط Ø§Ù„ØµÙØ­Ø© مع التعر٠التلقائي للغة واتجاه Ø§Ù„ØµÙØ­Ø©" #: ../gtk/src/Recognizer.cc:308 ../qt/src/Recognizer.cc:298 msgid "Assume single column of text" msgstr "اعتبر النص ÙÙŠ عمود واحد" #: ../gtk/src/Recognizer.cc:309 ../qt/src/Recognizer.cc:299 msgid "Assume single block of vertically aligned text" msgstr "اعتبر كتلة نص واحدة مضبوطة عموديا" #: ../gtk/src/Recognizer.cc:310 ../qt/src/Recognizer.cc:300 msgid "Assume a single uniform block of text" msgstr "اعتبر كتلة نص واحدة" #: ../gtk/src/Recognizer.cc:311 ../qt/src/Recognizer.cc:301 msgid "Assume a line of text" msgstr "اعتبر نص ÙÙŠ سطر واحد" #: ../gtk/src/Recognizer.cc:312 ../qt/src/Recognizer.cc:302 msgid "Assume a single word" msgstr "اعتبر وجود كلمة واحدة" #: ../gtk/src/Recognizer.cc:313 ../qt/src/Recognizer.cc:303 msgid "Assume a single word in a circle" msgstr "اعتبر وجود كلمة واحدة ÙÙŠ دائرة" #: ../gtk/src/Recognizer.cc:314 ../qt/src/Recognizer.cc:304 msgid "Sparse text in no particular order" msgstr "نص متناثر بدون أي ترتيب" #: ../gtk/src/Recognizer.cc:315 ../qt/src/Recognizer.cc:305 msgid "Sparse text with orientation and script detection" msgstr "نص متناثر مع التعر٠التلقائي لاتجاه Ø§Ù„ØµÙØ­Ø© واللغة" #: ../gtk/src/Recognizer.cc:330 ../qt/src/Recognizer.cc:316 msgid "Page segmentation mode" msgstr "وضعية تخطيط Ø§Ù„ØµÙØ­Ø©" #: ../gtk/src/Recognizer.cc:336 ../qt/src/Recognizer.cc:323 msgid "Manage languages..." msgstr "إدارة اللغات..." #: ../gtk/src/Recognizer.cc:392 ../qt/src/Recognizer.cc:383 msgid "Current selection" msgstr "التحديد الحالي" #: ../gtk/src/Recognizer.cc:470 ../qt/src/Recognizer.cc:462 msgid "Recognizing page %1 (%2 of %3)" msgstr "جار التعر٠الضوئي على Ø§Ù„ØµÙØ­Ø© %1 (%2 من %3)" #: ../gtk/src/Recognizer.cc:475 ../qt/src/Recognizer.cc:468 msgid "" "\n" "- Page %1: failed to render page" msgstr "" "\n" "- Ø§Ù„ØµÙØ­Ø© %1: لا يمكن رسم Ø§Ù„ØµÙØ­Ø©" #: ../gtk/src/Recognizer.cc:506 ../gtk/src/Recognizer.cc:535 #: ../gtk/src/Recognizer.cc:548 ../qt/src/Recognizer.cc:498 #: ../qt/src/Recognizer.cc:527 ../qt/src/Recognizer.cc:540 msgid "Recognizing..." msgstr "جار التعر٠الضوئي.." #: ../gtk/src/Recognizer.cc:510 ../gtk/src/Recognizer.cc:518 #: ../qt/src/Recognizer.cc:502 ../qt/src/Recognizer.cc:510 msgid "Recognition errors occurred" msgstr "حدثت أخطاء ÙÙŠ التعر٠الضوئي" #: ../gtk/src/Recognizer.cc:510 ../qt/src/Recognizer.cc:502 msgid "The following errors occurred:%1" msgstr "حدثت الأخطاء التالية: %1" #: ../gtk/src/Recognizer.cc:518 ../qt/src/Recognizer.cc:510 msgid "Failed to initialize tesseract" msgstr "ÙØ´Ù„ ÙÙŠ تهيئة محرك التعر٠الضوئي tesseract" #: ../gtk/src/scanner/ScannerSane.cc:84 ../gtk/src/scanner/ScannerTwain.cc:288 #: ../qt/src/scanner/ScannerSane.cc:85 ../qt/src/scanner/ScannerTwain.cc:286 msgid "Scan canceled" msgstr "تم إلغاء المسح الضوئي" #: ../gtk/src/scanner/ScannerSane.cc:159 ../gtk/src/scanner/ScannerTwain.cc:186 #: ../qt/src/scanner/ScannerSane.cc:159 ../qt/src/scanner/ScannerTwain.cc:178 msgid "No scanner specified" msgstr "لم يتم تحديد ماسحات ضوئية" #: ../gtk/src/scanner/ScannerSane.cc:168 ../gtk/src/scanner/ScannerTwain.cc:195 #: ../qt/src/scanner/ScannerSane.cc:168 ../qt/src/scanner/ScannerTwain.cc:187 msgid "Unable to connect to scanner" msgstr "غير قادر على الاتصال بالماسح الضوئي" #: ../gtk/src/scanner/ScannerSane.cc:403 ../gtk/src/scanner/ScannerTwain.cc:266 #: ../gtk/src/scanner/ScannerTwain.cc:292 ../qt/src/scanner/ScannerSane.cc:403 #: ../qt/src/scanner/ScannerTwain.cc:258 ../qt/src/scanner/ScannerTwain.cc:290 msgid "Unable to start scan" msgstr "غير قادر على بدء عملية المسح الضوئي" #: ../gtk/src/scanner/ScannerSane.cc:411 ../gtk/src/scanner/ScannerSane.cc:461 #: ../gtk/src/scanner/ScannerTwain.cc:318 ../qt/src/scanner/ScannerSane.cc:411 #: ../qt/src/scanner/ScannerSane.cc:461 ../qt/src/scanner/ScannerTwain.cc:316 msgid "Error communicating with scanner" msgstr "حدث خطأ أثناء الاتصال بالماسح الضوئي" #: ../gtk/src/scanner/ScannerSane.cc:520 ../qt/src/scanner/ScannerSane.cc:517 msgid "Failed to save image" msgstr "خطأ أثناء Ø­ÙØ¸ الصورة" #: ../gtk/src/scanner/ScannerSane.cc:800 ../qt/src/scanner/ScannerSane.cc:797 msgid "Operation is cancelled." msgstr "تم إلغاء العملية." #: ../gtk/src/scanner/ScannerSane.cc:802 ../qt/src/scanner/ScannerSane.cc:799 msgid "Device is busy." msgstr "الجهاز مشغول." #: ../gtk/src/scanner/ScannerSane.cc:804 ../qt/src/scanner/ScannerSane.cc:801 msgid "Cover is opened." msgstr "الغطاء Ù…ÙØªÙˆØ­." #: ../gtk/src/scanner/ScannerSane.cc:806 ../qt/src/scanner/ScannerSane.cc:803 msgid "Document feeder jammed." msgstr "علبة تغذية المستندات متحشرجة." #: ../gtk/src/scanner/ScannerSane.cc:808 ../qt/src/scanner/ScannerSane.cc:805 msgid "Document feeder out of documents." msgstr "علبة تغذية المستندات ÙØ§Ø±ØºØ©." #: ../gtk/src/scanner/ScannerSane.cc:810 ../qt/src/scanner/ScannerSane.cc:807 msgid "Access to scanner is denied." msgstr "تم منع الوصول إلى الماسح الضوئي." #: ../gtk/src/SourceManager.cc:118 ../qt/src/SourceManager.cc:124 msgid "PDFs with text" msgstr "Ù…Ù„ÙØ§Øª PDF مع نص" #: ../gtk/src/SourceManager.cc:118 ../qt/src/SourceManager.cc:124 msgid "" "These PDF files already contain text:\n" "%1" msgstr "" "هذه PDF تحتوي على نصوص Ø¨Ø§Ù„ÙØ¹Ù„:\n" "%1" #: ../gtk/src/SourceManager.cc:127 ../qt/src/SourceManager.cc:132 msgid "Unable to open files" msgstr "لا يمكن ÙØªØ­ Ø§Ù„Ù…Ù„ÙØ§Øª" #: ../gtk/src/SourceManager.cc:127 ../qt/src/SourceManager.cc:132 msgid "The following files could not be opened:%1" msgstr "لا يمكن ÙØªØ­ Ø§Ù„Ù…Ù„ÙØ§Øª التالية:%1" #: ../gtk/src/SourceManager.cc:141 ../qt/src/SourceManager.cc:143 msgid "Enter password for file '%1':" msgstr "أدخل كلمة السر للمل٠'%1':" #: ../gtk/src/SourceManager.cc:197 ../qt/src/SourceManager.cc:214 msgid "Images and PDFs" msgstr "صور ÙˆÙ…Ù„ÙØ§Øª PDF" #: ../gtk/src/SourceManager.cc:202 ../qt/src/SourceManager.cc:215 msgid "Select Files" msgstr "اختر Ù…Ù„ÙØ§Øª" #: ../gtk/src/SourceManager.cc:208 ../qt/src/SourceManager.cc:226 msgid "Clipboard Error" msgstr "خطأ ÙÙŠ Ø§Ù„Ø­Ø§ÙØ¸Ø©" #: ../gtk/src/SourceManager.cc:208 ../qt/src/SourceManager.cc:226 msgid "Failed to read the clipboard." msgstr "خطأ أثناء القراءة من Ø§Ù„Ø­Ø§ÙØ¸Ø©." #: ../gtk/src/SourceManager.cc:212 ../qt/src/SourceManager.cc:230 #: ../qt/src/SourceManager.cc:236 msgid "Pasted %1" msgstr "تم لصق %1" #: ../gtk/src/SourceManager.cc:224 ../qt/src/SourceManager.cc:243 msgid "Screenshot Error" msgstr "خطأ ÙÙŠ لقطة الشاشة" #: ../gtk/src/SourceManager.cc:224 ../qt/src/SourceManager.cc:243 msgid "Failed to take screenshot." msgstr "خطأ أثناء التقاط الشاشة." #: ../gtk/src/SourceManager.cc:228 ../qt/src/SourceManager.cc:247 msgid "Screenshot %1" msgstr "لطقة شاشة %1" #: ../gtk/src/SourceManager.cc:233 ../qt/src/SourceManager.cc:252 msgid "Saving image..." msgstr "جار Ø­ÙØ¸ الصورة..." #: ../gtk/src/SourceManager.cc:240 ../qt/src/SourceManager.cc:265 msgid "Cannot Write File" msgstr "لا يمكن كتابة الملÙ" #: ../gtk/src/SourceManager.cc:240 ../qt/src/SourceManager.cc:265 msgid "Could not write to %1." msgstr "لا يمكن الكتابة ÙÙŠ %1." #: ../gtk/src/SourceManager.cc:267 ../qt/src/SourceManager.cc:287 msgid "Delete File?" msgstr "Ø­Ø°Ù Ø§Ù„Ù…Ù„ÙØŸ" #: ../gtk/src/SourceManager.cc:267 ../qt/src/SourceManager.cc:287 msgid "The following files will be deleted:%1" msgstr "هذه Ø§Ù„Ù…Ù„ÙØ§Øª سو٠يتم حذÙها:%1" #: ../gtk/src/SourceManager.cc:332 ../qt/src/SourceManager.cc:338 msgid "Missing File" msgstr "مل٠ناقص" #: ../gtk/src/SourceManager.cc:332 ../qt/src/SourceManager.cc:338 msgid "" "The following file has been deleted or moved:\n" "%1" msgstr "" "هذا المل٠تم حذÙÙ‡ أو نقله:\n" "%1" #: ../gtk/src/SubstitutionsManager.cc:33 ../qt/src/SubstitutionsManager.cc:73 msgid "Search for" msgstr "ابحث عن" #: ../gtk/src/SubstitutionsManager.cc:34 ../qt/src/SubstitutionsManager.cc:73 msgid "Replace with" msgstr "استبدل بـ" #: ../gtk/src/SubstitutionsManager.cc:69 ../gtk/src/SubstitutionsManager.cc:103 #: ../qt/src/SubstitutionsManager.cc:106 ../qt/src/SubstitutionsManager.cc:143 msgid "Substitutions List" msgstr "قائمة الاستبدالات" #: ../gtk/src/SubstitutionsManager.cc:70 ../qt/src/SubstitutionsManager.cc:106 msgid "Open Substitutions List" msgstr "ÙØªØ­ مل٠قائمة الاستبدالات" #: ../gtk/src/SubstitutionsManager.cc:75 ../qt/src/SubstitutionsManager.cc:112 msgid "Error Reading File" msgstr "خطأ أثناء قراءة الملÙ" #: ../gtk/src/SubstitutionsManager.cc:75 ../qt/src/SubstitutionsManager.cc:112 msgid "Unable to read '%1'." msgstr "لا يمكن قراءة '%1'." #: ../gtk/src/SubstitutionsManager.cc:97 ../qt/src/SubstitutionsManager.cc:137 msgid "Errors Occurred Reading File" msgstr "حدثت أخطاء أثناء قراءة الملÙ" #: ../gtk/src/SubstitutionsManager.cc:97 ../qt/src/SubstitutionsManager.cc:137 msgid "Some entries of the substitutions list could not be read." msgstr "بعض المدخلات ÙÙŠ قائمة الاستبدالات لا يمكن قراءتها." #: ../gtk/src/SubstitutionsManager.cc:104 ../qt/src/SubstitutionsManager.cc:143 msgid "Save Substitutions List" msgstr "Ø­ÙØ¸ مل٠قائمة الاستبدالات" #: ../gtk/src/SubstitutionsManager.cc:110 ../qt/src/SubstitutionsManager.cc:149 msgid "Error Saving File" msgstr "حدث خطأ أثناء Ø­ÙØ¸ الملÙ" #: ../gtk/src/SubstitutionsManager.cc:110 ../qt/src/SubstitutionsManager.cc:149 msgid "Unable to write to '%1'." msgstr "لا يمكن الكتابة ÙÙŠ '%1'." #: ../gtk/src/SubstitutionsManager.cc:127 ../qt/src/SubstitutionsManager.cc:162 msgid "Save List?" msgstr "Ø§Ø­ÙØ¸ القائمة؟" #: ../gtk/src/SubstitutionsManager.cc:127 ../qt/src/SubstitutionsManager.cc:162 msgid "Do you want to save the current list?" msgstr "هل تود Ø­ÙØ¸ القائمة الحالية؟" #: ../gtk/src/TessdataManager.cc:59 ../qt/src/TessdataManager.cc:74 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:64 ../qt/src/TessdataManager.cc:79 msgid "Fetching available languages" msgstr "جار تغذية Ø§Ù„Ù…Ù„ÙØ§Øª الموجودة" #: ../gtk/src/TessdataManager.cc:69 ../gtk/src/TessdataManager.cc:90 #: ../gtk/src/TessdataManager.cc:122 ../qt/src/TessdataManager.cc:84 #: ../qt/src/TessdataManager.cc:96 ../qt/src/TessdataManager.cc:129 msgid "Failed to fetch list of available languages: %1" msgstr "خطأ أثناء تغذية قائمة اللغات المتاحة: %1" #: ../gtk/src/TessdataManager.cc:101 ../gtk/src/TessdataManager.cc:130 #: ../qt/src/TessdataManager.cc:107 ../qt/src/TessdataManager.cc:116 #: ../qt/src/TessdataManager.cc:138 ../qt/src/TessdataManager.cc:149 msgid "Parsing error: %1" msgstr "خطأ أثناء التمرير: %1" #: ../gtk/src/TessdataManager.cc:192 ../qt/src/TessdataManager.cc:193 msgid "Applying changes..." msgstr "جار تطبيق التغييرات..." #: ../gtk/src/TessdataManager.cc:253 ../qt/src/TessdataManager.cc:238 msgid "Failed to create directory for tessdata files." msgstr "ÙØ´Ù„ أثناء إنشاء مجلد Ù…Ù„ÙØ§Øª لغات التعر٠الضوئي tessdata." #: ../gtk/src/TessdataManager.cc:262 ../qt/src/TessdataManager.cc:246 msgid "Downloading %1..." msgstr "جار التنزيل %1..." #: ../gtk/src/TessdataManager.cc:282 msgid "" "The following files could not be downloaded or removed:\n" "%1\n" "\n" "Check the connectivity and directory permissions.\n" "\n" "Hint: If you don't have write permissions in system folders, you can switch " "to user paths in the settings dialog." msgstr "" "هذه Ø§Ù„Ù…Ù„ÙØ§Øª لا يمكن تنزيلها أو أنها أزيلت:\n" "%1\n" "تأكد من الاتصال بالشبكة وأذونات المجلد\n" "\n" "تلميح: إذا كنت لا تملك صلاحية الكتابة ÙÙŠ مجلدات النظام، يمكنك استخدام مسار " "المستخدمين ÙÙŠ الإعدادات." #: ../gtk/src/Utils.cc:64 msgid "Yes" msgstr "نعم" #: ../gtk/src/Utils.cc:67 msgid "No" msgstr "لا" #: ../gtk/src/Utils.cc:76 msgid "Discard" msgstr "تجاوز" #: ../qt/data/AboutDialog.ui.h:1 msgid "About gImageReader" msgstr "نبذة عن برنامج gImageReader" #: ../qt/data/AboutDialog.ui.h:3 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:17 msgid "Flatbed" msgstr "مسطح" #: ../qt/data/MainWindow.ui.h:18 msgid "ADF Front" msgstr "الجهة العلوية من علبة تغذية المستندات" #: ../qt/data/MainWindow.ui.h:19 msgid "ADF Back" msgstr "الجهة السÙلية من علبة تغذية المستندات" #: ../qt/data/MainWindow.ui.h:20 msgid "ADF Duplex" msgstr "الجهتين من علبة تغذية المستندات" #. Remove & from some labels which designer insists in adding #: ../qt/data/MainWindow.ui.h:21 ../qt/src/Ui_MainWindow.hh:50 msgid "Sources" msgstr "أزل وقم بتعديل بعض المسميات التي يصر المصمم على Ø¥Ø¶Ø§ÙØªÙ‡Ø§" #: ../qt/data/MainWindow.ui.h:22 msgid "Zoom In" msgstr "تكبير" #: ../qt/data/MainWindow.ui.h:24 msgid "Zoom Out" msgstr "تصغير" #: ../qt/data/MainWindow.ui.h:26 msgid "Normal Size" msgstr "الحجم العادي" #: ../qt/data/MainWindow.ui.h:28 msgid "Best Fit" msgstr "Ø£ÙØ¶Ù„ تلاؤم" #: ../qt/data/MainWindow.ui.h:30 msgid "Rotate Left" msgstr "تدوير إلى اليسار" #: ../qt/data/MainWindow.ui.h:31 msgid "Rotate left" msgstr "تدوير إلى اليسار" #: ../qt/data/MainWindow.ui.h:32 msgid "Rotate Right" msgstr "تدوير إلى اليمين" #: ../qt/data/MainWindow.ui.h:33 msgid "Rotate right" msgstr "تدوير إلى اليمين" #: ../qt/data/MainWindow.ui.h:34 msgid "Image Controls" msgstr "أزرار التحكم بالصورة" #: ../qt/data/MainWindow.ui.h:36 msgid "Autodetect Layout" msgstr "تعر٠تلقائي على التخطيط" #: ../qt/data/MainWindow.ui.h:38 msgid "Toggle Output Pane" msgstr "تبديل شاشة المخرجات" #: ../qt/data/PdfExportDialog.ui.h:5 msgid "Backend:" msgstr "محرك كتابة PDF:" #: ../qt/data/PdfExportDialog.ui.h:6 msgid "Portrait" msgstr "بالطول" #: ../qt/data/PdfExportDialog.ui.h:7 msgid "Landscape" msgstr "بالعرض" #: ../qt/src/hocr/HOCRPdfExporter.cc:142 msgid "Failed to write to file" msgstr "خطأ أثناء كتابة الملÙ" #. Output toolbar #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:55 #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:56 msgid "Open hOCR file" msgstr "ÙØªØ­ مل٠hOCR" #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:57 #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:58 msgid "Save as hOCR text" msgstr "Ø§Ø­ÙØ¸ بصيغة hOCR" #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:79 #: ../qt/src/Ui_OutputEditorText.hh:106 msgid "Find and Replace" msgstr "بحث واستبدال" #: ../qt/src/MainWindow.cc:540 msgid "Could not read %1: %2" msgstr "لا يمكن قراءة %1: %2" #: ../qt/src/MainWindow.cc:573 msgid "The following dictionary files were installed:%1" msgstr "القاموس التالي غير مثبت:%1" #: ../qt/src/TessdataManager.cc:268 msgid "" "The following files could not be downloaded or removed:\n" "%1\n" "\n" "Check the connectivity and directory permissions.\n" "Hint: If you don't have write permissions in system folders, you can switch " "to user paths in the settings dialog." msgstr "" "Ø§Ù„Ù…Ù„ÙØ§Øª التالية لا يمكن تنزيلها أو أنها قد أزيلت:\n" "%1\n" "تأكد من اتصالك بالشبكة وأذونات المجلد.\n" "تلميح: إذا لم يكن لديك صلاحية على مجلدات النظام، قم بالتغيير إلى مسار " "المستخدم ÙÙŠ الإعدادات." #: ../qt/src/Ui_MainWindow.hh:51 msgid "Output" msgstr "المخرج" #: ../qt/src/Ui_MainWindow.hh:134 msgid "OCR mode:" msgstr "وضعية التعر٠الضوئي:" #: ../qt/src/Ui_MainWindow.hh:208 msgid "Remove Image" msgstr "إزالة الصورة" #: ../qt/src/Ui_MainWindow.hh:211 msgid "Delete Image" msgstr "حذ٠الصورة" #: ../qt/src/Ui_MainWindow.hh:214 msgid "Clear List" msgstr "مسح القائمة بالكامل" #: ../qt/src/Ui_OutputEditorText.hh:101 msgid "Strip Line Breaks" msgstr "احذ٠كسر السطور" #: ../qt/src/Ui_OutputEditorText.hh:115 msgid "Save Output" msgstr "Ø§Ø­ÙØ¸ المخرج" #: ../qt/src/Ui_OutputEditorText.hh:117 msgid "Clear Output" msgstr "امسح المخرج" gImageReader-3.3.1/po/ar_SA.po000066400000000000000000002116231351740627400160130ustar00rootroot00000000000000# 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. # msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2019-07-25 23:17+0200\n" "PO-Revision-Date: 2018-03-22 10:19+0000\n" "Last-Translator: Alaa Sayed \n" "Language-Team: Arabic \n" "Language: ar_SA\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 " "&& n%100<=10 ? 3 : n%100>=11 ? 4 : 5;\n" "X-Generator: Weblate 2.20-dev\n" #: ../data/gimagereader.desktop.in.h:1 msgid "OCR application" msgstr "برنامج التعر٠الضوئي للمستندات المصورة" #: ../gtk/data/appmenu.ui.h:1 ../qt/src/Ui_MainWindow.hh:167 msgid "Redetect Languages" msgstr "إعادة تحميل لغات التعر٠الضوئي" #: ../gtk/data/appmenu.ui.h:2 ../qt/src/Ui_MainWindow.hh:170 msgid "Manage Languages" msgstr "إدارة لغات التعر٠الضوئي" #: ../gtk/data/appmenu.ui.h:3 ../gtk/data/ConfigDialog.ui.h:1 #: ../qt/data/ConfigDialog.ui.h:1 ../qt/src/Ui_MainWindow.hh:173 msgid "Preferences" msgstr "خيارات" #: ../gtk/data/appmenu.ui.h:4 ../gtk/data/ConfigDialog.ui.h:2 #: ../gtk/src/MainWindow.cc:482 ../qt/src/MainWindow.cc:481 #: ../qt/src/Ui_MainWindow.hh:178 msgid "Help" msgstr "مساعدة" #: ../gtk/data/appmenu.ui.h:5 ../qt/data/AboutDialog.ui.h:2 #: ../qt/src/Ui_MainWindow.hh:181 msgid "About" msgstr "نبذة" #: ../gtk/data/appmenu.ui.h:6 msgid "Quit" msgstr "إنهاء البرنامج" #: ../gtk/data/ConfigDialog.ui.h:3 ../gtk/data/MainWindow.ui.h:47 #: ../gtk/data/OutputEditorHOCR.ui.h:3 ../gtk/data/PdfExportDialog.ui.h:3 #: ../gtk/src/FileDialogs.cc:152 ../gtk/src/Utils.cc:61 #: ../qt/data/ConfigDialog.ui.h:26 msgid "OK" msgstr "تم" #: ../gtk/data/ConfigDialog.ui.h:4 msgid "Output pane orientation:" msgstr "اتجاه شاشة المخرجات:" #: ../gtk/data/ConfigDialog.ui.h:5 msgid "Horizontal" msgstr "Ø£Ùقي" #: ../gtk/data/ConfigDialog.ui.h:6 msgid "Vertical" msgstr "عمودي" #: ../gtk/data/ConfigDialog.ui.h:7 ../qt/data/ConfigDialog.ui.h:18 msgid "Query to install missing spellcheck dictionaries" msgstr "طلب تثبيت قواميس الإملاء غير المثبتة" #: ../gtk/data/ConfigDialog.ui.h:8 ../qt/data/ConfigDialog.ui.h:4 msgid "Automatically check for new program versions" msgstr "البحث عن تحديثات البرنامج تلقائيا" #: ../gtk/data/ConfigDialog.ui.h:9 ../qt/data/ConfigDialog.ui.h:3 msgid "Predefined language definitions:" msgstr "ØªØ¹Ø±ÙŠÙØ§Øª اللغات الموجودة:" #: ../gtk/data/ConfigDialog.ui.h:10 ../qt/data/ConfigDialog.ui.h:12 msgid "Additional language definitions:" msgstr "ØªØ¹Ø±ÙŠÙØ§Øª اللغات الإضاÙية:" #: ../gtk/data/ConfigDialog.ui.h:11 ../qt/data/ConfigDialog.ui.h:20 msgid "The prefix of the tesseract language data file" msgstr "تعري٠مل٠اللغة ÙÙŠ محرك التعر٠الضوئي" #: ../gtk/data/ConfigDialog.ui.h:12 ../qt/data/ConfigDialog.ui.h:21 msgid "Prefix" msgstr "تعريÙ" #: ../gtk/data/ConfigDialog.ui.h:13 ../qt/data/ConfigDialog.ui.h:22 msgid "The ISO 639-1 language code followed by the country code" msgstr "رمز اللغة ISO-639-1 متبوعا برمز الدولة" #: ../gtk/data/ConfigDialog.ui.h:14 ../qt/data/ConfigDialog.ui.h:23 msgid "ISO Code" msgstr "رمز ISO القياسي" #: ../gtk/data/ConfigDialog.ui.h:15 ../qt/data/ConfigDialog.ui.h:24 msgid "The name of the language" msgstr "اسم اللغة" #: ../gtk/data/ConfigDialog.ui.h:16 ../qt/data/ConfigDialog.ui.h:25 msgid "Name" msgstr "الاسم" #: ../gtk/data/ConfigDialog.ui.h:17 ../gtk/data/MainWindow.ui.h:46 #: ../gtk/data/OutputEditorHOCR.ui.h:2 ../gtk/data/PdfExportDialog.ui.h:2 #: ../gtk/src/Acquirer.cc:34 ../gtk/src/FileDialogs.cc:151 #: ../gtk/src/Utils.cc:70 ../qt/data/ConfigDialog.ui.h:27 #: ../qt/data/MainWindow.ui.h:12 msgid "Cancel" msgstr "إلغاء" #: ../gtk/data/ConfigDialog.ui.h:18 ../qt/data/ConfigDialog.ui.h:5 msgid "Output pane font:" msgstr "خط شاشة المخرجات:" #: ../gtk/data/ConfigDialog.ui.h:19 ../qt/data/ConfigDialog.ui.h:2 msgid "Default" msgstr "Ø§Ù„Ø§ÙØªØ±Ø§Ø¶ÙŠ" #: ../gtk/data/ConfigDialog.ui.h:20 ../qt/data/ConfigDialog.ui.h:6 msgid "Language data locations:" msgstr "مكان مجلد لغات التعر٠الضوئي ÙÙŠ النظام:" #: ../gtk/data/ConfigDialog.ui.h:21 ../qt/data/ConfigDialog.ui.h:13 msgid "Language definitions path:" msgstr "مسار مجلد لغات التعر٠الضوئي ÙÙŠ الحاسوب:" #: ../gtk/data/ConfigDialog.ui.h:22 ../qt/data/ConfigDialog.ui.h:28 msgid "Spelling dictionaries path:" msgstr "مسار قواميس التدقيق الإملائي:" #: ../gtk/data/ConfigDialog.ui.h:23 ../qt/data/ConfigDialog.ui.h:10 msgid "System-wide paths" msgstr "مسار Ø§Ù„Ù…Ù„ÙØ§Øª على مستوى النظام" #: ../gtk/data/ConfigDialog.ui.h:24 ../qt/data/ConfigDialog.ui.h:11 msgid "User paths" msgstr "مسار Ø§Ù„Ù…Ù„ÙØ§Øª على مستوى المستخدم" #: ../gtk/data/ConfigDialog.ui.h:25 ../qt/data/ConfigDialog.ui.h:29 msgid "Automatically open exported documents with default application" msgstr "ÙØªØ­ المستندات المخرجة باستخدام البرامج Ø§Ù„Ø§ÙØªØ±Ø§Ø¶ÙŠØ©" #: ../gtk/data/CrashHandler.ui.h:1 ../qt/src/CrashHandler.cc:38 msgid "Regenerate backtrace" msgstr "إعادة إنشاء سجلات الأخطاء" #: ../gtk/data/CrashHandler.ui.h:3 #, fuzzy, no-c-format msgid "" "The application has crashed\n" "\n" "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 "" "عذرا لهذا الإزعاج. لتطوير البرنامج، ÙØ¶Ù„ا قم بإخبار مبرمج البرنامج عن هذا " "الخطأ " "1manisandro@gmail.com. ووضح ما كنت ØªÙØ¹Ù„Ù‡ قبل حدوث هذا الخطأ Ø§Ù„Ù…ÙØ§Ø¬Ø¦ØŒ " "أيضا أرÙÙ‚ هذه البيانات بالأسÙÙ„ØŒ شكرا لك." #: ../gtk/data/CrashHandler.ui.h:6 msgid "" "Tesseract has aborted\n" "\n" "Tesseract (the OCR engine) has aborted while recognizing text. This may " "occur if the used traineddatas are corrupt or incomplatible with the version " "of tesseract in use, or due to a bug in tesseract.\n" "\n" "The stacktrace below may provide additional information about where the " "crash occured.\n" msgstr "" #: ../gtk/data/MainWindow.ui.h:1 ../qt/data/MainWindow.ui.h:39 msgid "Toggle output pane" msgstr "تبديل مكان شاشة المخرجات" #: ../gtk/data/MainWindow.ui.h:2 ../qt/src/Ui_MainWindow.hh:66 msgid "Rotate current page" msgstr "تدوير اتجاه Ø§Ù„ØµÙØ­Ø© الحالية" #: ../gtk/data/MainWindow.ui.h:3 ../qt/src/Ui_MainWindow.hh:67 msgid "Rotate all pages" msgstr "تدوير اتجاه كل Ø§Ù„ØµÙØ­Ø§Øª" #. Sources toolbar #: ../gtk/data/MainWindow.ui.h:4 ../qt/src/Ui_MainWindow.hh:192 msgid "Recent" msgstr "مستخدم مؤخراً" #: ../gtk/data/MainWindow.ui.h:5 ../qt/src/Ui_MainWindow.hh:193 msgid "Paste" msgstr "لصق" #: ../gtk/data/MainWindow.ui.h:6 ../qt/src/Ui_MainWindow.hh:194 msgid "Take Screenshot" msgstr "Ø­ÙØ¸ لقطة شاشة" #: ../gtk/data/MainWindow.ui.h:7 ../qt/data/MainWindow.ui.h:23 msgid "Zoom in" msgstr "تكبير" #: ../gtk/data/MainWindow.ui.h:8 ../qt/data/MainWindow.ui.h:25 msgid "Zoom out" msgstr "تصغير" #: ../gtk/data/MainWindow.ui.h:9 ../qt/data/MainWindow.ui.h:27 msgid "Normal size" msgstr "المقاس العادي" #: ../gtk/data/MainWindow.ui.h:10 ../qt/data/MainWindow.ui.h:29 msgid "Best fit" msgstr "Ø£ÙØ¶Ù„ تلاؤم" #: ../gtk/data/MainWindow.ui.h:11 ../qt/src/Ui_MainWindow.hh:75 msgid "Select rotation mode" msgstr "اختر وضعية جهة الدوران" #: ../gtk/data/MainWindow.ui.h:12 ../gtk/data/OutputEditorText.ui.h:13 #: ../qt/src/Ui_OutputEditorText.hh:95 msgid "Select insert mode" msgstr "اختر وضعية الإدخال" #: ../gtk/data/MainWindow.ui.h:13 ../qt/src/Ui_MainWindow.hh:109 #, fuzzy msgid "Select page" msgstr "اختر اللغة" #: ../gtk/data/MainWindow.ui.h:14 ../qt/data/MainWindow.ui.h:35 msgid "Image controls" msgstr "أزرار التحكم بالصورة" #: ../gtk/data/MainWindow.ui.h:15 ../qt/src/Ui_MainWindow.hh:139 msgid "Plain text" msgstr "نص عادي txt" #: ../gtk/data/MainWindow.ui.h:16 ../qt/src/Ui_MainWindow.hh:139 msgid "hOCR, PDF" msgstr "صيغة PDF" #: ../gtk/data/MainWindow.ui.h:17 ../qt/data/MainWindow.ui.h:37 msgid "Autodetect layout" msgstr "تعر٠تلقائي لتخطيط Ø§Ù„ØµÙØ­Ø©" #: ../gtk/data/MainWindow.ui.h:18 msgid "Recognize all" msgstr "التعر٠الضوئي للكل" #: ../gtk/data/MainWindow.ui.h:19 msgid "Select language" msgstr "اختر اللغة" #: ../gtk/data/MainWindow.ui.h:20 ../qt/src/Ui_MainWindow.hh:205 msgid "Add images" msgstr "Ø¥Ø¶Ø§ÙØ© صور" #: ../gtk/data/MainWindow.ui.h:21 ../qt/src/Ui_MainWindow.hh:204 msgid "Add Images" msgstr "Ø¥Ø¶Ø§ÙØ© صور" #: ../gtk/data/MainWindow.ui.h:22 ../qt/src/Ui_MainWindow.hh:210 msgid "Remove image from list" msgstr "إلغاء الصورة من القائمة" #: ../gtk/data/MainWindow.ui.h:23 ../qt/src/Ui_MainWindow.hh:213 msgid "Delete image" msgstr "حذ٠صورة" #: ../gtk/data/MainWindow.ui.h:24 ../qt/src/Ui_MainWindow.hh:216 msgid "Clear list" msgstr "مسح القائمة" #: ../gtk/data/MainWindow.ui.h:25 ../qt/data/MainWindow.ui.h:5 msgid "Files" msgstr "Ø§Ù„Ù…Ù„ÙØ§Øª" #: ../gtk/data/MainWindow.ui.h:26 ../qt/data/MainWindow.ui.h:8 msgid "Device:" msgstr "الجهاز:" #: ../gtk/data/MainWindow.ui.h:27 ../gtk/data/TessdataManager.ui.h:4 #: ../qt/data/MainWindow.ui.h:7 ../qt/src/TessdataManager.cc:59 msgid "Refresh" msgstr "تحديث" #: ../gtk/data/MainWindow.ui.h:28 ../qt/data/MainWindow.ui.h:9 msgid "Output:" msgstr "المخرج:" #: ../gtk/data/MainWindow.ui.h:29 ../qt/data/MainWindow.ui.h:13 msgid "Mode:" msgstr "الصيغة:" #: ../gtk/data/MainWindow.ui.h:30 ../gtk/src/hocr/HOCRPdfExporter.cc:313 #: ../qt/data/MainWindow.ui.h:15 ../qt/src/hocr/HOCRPdfExporter.cc:347 msgid "Color" msgstr "اللون" #: ../gtk/data/MainWindow.ui.h:31 ../gtk/src/hocr/HOCRPdfExporter.cc:316 #: ../qt/data/MainWindow.ui.h:14 ../qt/src/hocr/HOCRPdfExporter.cc:349 #: ../qt/src/hocr/HOCRPdfExporter.cc:351 msgid "Grayscale" msgstr "تدرج الرمادي" #: ../gtk/data/MainWindow.ui.h:32 ../qt/data/MainWindow.ui.h:10 msgid "Resolution:" msgstr "الدقة النقطية:" #: ../gtk/data/MainWindow.ui.h:33 ../qt/data/MainWindow.ui.h:11 msgid "Scan" msgstr "مسح ضوئي" #: ../gtk/data/MainWindow.ui.h:34 ../qt/data/MainWindow.ui.h:16 msgid "Source:" msgstr "المصدر:" #: ../gtk/data/MainWindow.ui.h:35 ../qt/data/MainWindow.ui.h:6 msgid "Acquire" msgstr "الحصول" #: ../gtk/data/MainWindow.ui.h:36 ../qt/data/MainWindow.ui.h:1 msgid "Brightness" msgstr "السطوع" #: ../gtk/data/MainWindow.ui.h:37 ../qt/data/MainWindow.ui.h:2 msgid "Contrast" msgstr "التباين" #: ../gtk/data/MainWindow.ui.h:38 ../qt/data/MainWindow.ui.h:3 msgid "Resolution" msgstr "الدقة النقطية" #: ../gtk/data/MainWindow.ui.h:39 ../qt/data/MainWindow.ui.h:4 msgid "Invert colors" msgstr "عكس الألوان" #: ../gtk/data/MainWindow.ui.h:40 msgid "A graphical frontend to tesseract-ocr" msgstr "برنامج واجهة لمحرك التعر٠الضوئي tesseract-ocr" #: ../gtk/data/MainWindow.ui.h:41 ../qt/data/CharacterListDialog.ui.h:1 msgid "Character whitelist / blacklist" msgstr "" #: ../gtk/data/MainWindow.ui.h:42 ../qt/data/CharacterListDialog.ui.h:2 msgid "Exclude these characters from being recognized (blacklist):" msgstr "" #: ../gtk/data/MainWindow.ui.h:43 ../qt/data/CharacterListDialog.ui.h:3 #, fuzzy msgid "Enter a string of characters..." msgstr "الحصول على المدخلات..." #: ../gtk/data/MainWindow.ui.h:44 ../qt/data/CharacterListDialog.ui.h:4 msgid "Only allow the following characters to be recognized (whitelist):" msgstr "" #: ../gtk/data/MainWindow.ui.h:45 ../qt/data/PageRangeDialog.ui.h:1 msgid "Page Range" msgstr "مجال Ø§Ù„ØµÙØ­Ø§Øª" #: ../gtk/data/MainWindow.ui.h:48 ../qt/data/PageRangeDialog.ui.h:2 msgid "Page range:" msgstr "مجال Ø§Ù„ØµÙØ­Ø§Øª:" #: ../gtk/data/MainWindow.ui.h:49 ../qt/data/PageRangeDialog.ui.h:3 msgid "Example: 1-10, 13, 14-18" msgstr "مثال:1-11,13, 15-19" #: ../gtk/data/MainWindow.ui.h:50 ../qt/data/PageRangeDialog.ui.h:4 msgid "Recognition area:" msgstr "مساحة التعر٠الضوئي:" #: ../gtk/data/MainWindow.ui.h:51 ../gtk/src/Recognizer.cc:375 #: ../qt/data/PageRangeDialog.ui.h:5 ../qt/src/Recognizer.cc:369 msgid "Entire page" msgstr "كامل Ø§Ù„ØµÙØ­Ø©" #: ../gtk/data/MainWindow.ui.h:52 ../qt/data/PageRangeDialog.ui.h:6 msgid "Autodetect" msgstr "تعر٠تلقائي" #: ../gtk/data/MainWindow.ui.h:53 ../qt/data/PageRangeDialog.ui.h:7 msgid "Prepend to output text:" msgstr "ألحق المخرج الحالي بنص شاشة المخرجات:" #: ../gtk/data/MainWindow.ui.h:54 ../qt/data/PageRangeDialog.ui.h:8 msgid "Source filename" msgstr "اسم المل٠المصور" #: ../gtk/data/MainWindow.ui.h:55 ../qt/data/PageRangeDialog.ui.h:9 msgid "Source page" msgstr "مصدر المصورات" #: ../gtk/data/MainWindow.ui.h:56 ../qt/src/SourceManager.cc:146 msgid "Protected PDF" msgstr "PDF محمي بكلمة سر" #: ../gtk/data/MainWindow.ui.h:57 ../qt/src/Recognizer.cc:76 msgid "Current Page" msgstr "Ø§Ù„ØµÙØ­Ø© الحالية" #: ../gtk/data/MainWindow.ui.h:58 ../qt/src/Recognizer.cc:79 msgid "Multiple Pages..." msgstr "ØµÙØ­Ø§Øª متعددة..." #: ../gtk/data/OutputEditorHOCR.ui.h:1 ../qt/src/hocr/OutputEditorHOCR.cc:580 msgid "Add Word" msgstr "Ø¥Ø¶Ø§ÙØ© كلمة" #: ../gtk/data/OutputEditorHOCR.ui.h:4 ../qt/src/hocr/OutputEditorHOCR.cc:580 msgid "Enter word:" msgstr "أدخل كلمة:" #: ../gtk/data/OutputEditorHOCR.ui.h:5 ../qt/src/hocr/Ui_OutputEditorHOCR.hh:61 #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:62 msgid "Export to plain text" msgstr "تصدير نص txt" #: ../gtk/data/OutputEditorHOCR.ui.h:6 ../qt/src/hocr/Ui_OutputEditorHOCR.hh:64 #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:65 msgid "Export to PDF" msgstr "تصدير PDF" #: ../gtk/data/OutputEditorHOCR.ui.h:7 ../qt/src/hocr/Ui_OutputEditorHOCR.hh:67 #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:68 msgid "Export to ODT" msgstr "تصدير ODT وورد" #: ../gtk/data/OutputEditorHOCR.ui.h:8 ../gtk/data/OutputEditorText.ui.h:18 #: ../qt/src/Ui_OutputEditorText.hh:116 msgid "Save output" msgstr "Ø­ÙØ¸ المخرج" #: ../gtk/data/OutputEditorHOCR.ui.h:9 ../qt/src/hocr/Ui_OutputEditorHOCR.hh:72 #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:73 msgid "Export" msgstr "تصدير" #: ../gtk/data/OutputEditorHOCR.ui.h:10 ../gtk/data/OutputEditorText.ui.h:19 #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:77 #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:78 #: ../qt/src/Ui_OutputEditorText.hh:118 msgid "Clear output" msgstr "مسح القائمة" #: ../gtk/data/OutputEditorHOCR.ui.h:11 ../gtk/data/OutputEditorText.ui.h:15 #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:80 #: ../qt/src/Ui_OutputEditorText.hh:107 msgid "Find and replace" msgstr "بحث واستبدال" #: ../gtk/data/OutputEditorHOCR.ui.h:12 #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:82 #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:83 msgid "Show confidence values" msgstr "عرض قيم الثقة للتعر٠الضوئي" #: ../gtk/data/OutputEditorHOCR.ui.h:13 ../gtk/data/PdfExportDialog.ui.h:41 #: ../qt/data/PdfExportDialog.ui.h:2 ../qt/src/hocr/Ui_OutputEditorHOCR.hh:85 #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:86 msgid "Show preview" msgstr "عرض كمثال" #: ../gtk/data/OutputEditorHOCR.ui.h:14 #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:121 msgid "Next (F3)" msgstr "التالي (F3)" #: ../gtk/data/OutputEditorHOCR.ui.h:15 #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:122 msgid "Previous (Shift+F3)" msgstr "السابق (Shift+F3)" #: ../gtk/data/OutputEditorHOCR.ui.h:16 ../gtk/src/hocr/OutputEditorHOCR.cc:890 #: ../qt/src/hocr/OutputEditorHOCR.cc:730 #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:126 msgid "Expand all" msgstr "عرض الكل" #: ../gtk/data/OutputEditorHOCR.ui.h:17 ../gtk/src/hocr/OutputEditorHOCR.cc:893 #: ../qt/src/hocr/OutputEditorHOCR.cc:731 #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:127 msgid "Collapse all" msgstr "تجميع المعروض" #: ../gtk/data/OutputEditorHOCR.ui.h:18 #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:148 msgid "Properties" msgstr "خصائص" #: ../gtk/data/OutputEditorHOCR.ui.h:19 #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:152 msgid "Source" msgstr "المصدر" #. Output insert mode #: ../gtk/data/OutputEditorText.ui.h:1 ../qt/src/Ui_OutputEditorText.hh:52 msgid "Append to current text" msgstr "إلحاق بالنص المخرج الحالي" #: ../gtk/data/OutputEditorText.ui.h:2 ../qt/src/Ui_OutputEditorText.hh:53 msgid "Insert at cursor" msgstr "أدرج عند المؤشر" #: ../gtk/data/OutputEditorText.ui.h:3 ../qt/src/Ui_OutputEditorText.hh:54 msgid "Replace current text" msgstr "استبدل النص الحالي" #. Output postprocessing #: ../gtk/data/OutputEditorText.ui.h:4 ../qt/src/Ui_OutputEditorText.hh:62 msgid "Keep line break if..." msgstr "Ø§Ø­ØªÙØ¸ بإدراج السطر التالي إذا..." #: ../gtk/data/OutputEditorText.ui.h:5 ../qt/src/Ui_OutputEditorText.hh:64 msgid "Preceded by end mark (.?!)" msgstr "كان مسبوقا بعلامة ترقيم توق٠(.?!)" #: ../gtk/data/OutputEditorText.ui.h:6 ../qt/src/Ui_OutputEditorText.hh:66 msgid "Preceded or succeeded by quote" msgstr "مسبوقا أو متبوعا بعلامة تنصيص" #: ../gtk/data/OutputEditorText.ui.h:7 ../qt/src/Ui_OutputEditorText.hh:68 msgid "Other options" msgstr "خيارات أخرى" #: ../gtk/data/OutputEditorText.ui.h:8 ../qt/src/Ui_OutputEditorText.hh:70 msgid "Join hyphenated words" msgstr "ربط الكلمات المتقطعة ب -" #: ../gtk/data/OutputEditorText.ui.h:9 ../qt/src/Ui_OutputEditorText.hh:72 msgid "Collapse whitespace" msgstr "جمع Ø§Ù„Ù…Ø³Ø§ÙØ§Øª" #: ../gtk/data/OutputEditorText.ui.h:10 ../qt/src/Ui_OutputEditorText.hh:74 msgid "Preserve paragraphs" msgstr "Ø§Ø­ØªÙØ¸ بالÙقرات" #: ../gtk/data/OutputEditorText.ui.h:11 ../qt/src/Ui_OutputEditorText.hh:76 msgid "Visual aids" msgstr "مساعدة مرئية" #: ../gtk/data/OutputEditorText.ui.h:12 ../qt/src/Ui_OutputEditorText.hh:78 msgid "Draw whitespace" msgstr "Ø§Ø­Ø°Ù Ø§Ù„Ù…Ø³Ø§ÙØ©" #: ../gtk/data/OutputEditorText.ui.h:14 ../qt/src/Ui_OutputEditorText.hh:102 msgid "Strip line breaks on selected text" msgstr "احذ٠كسر السطر التالي للنص المحدد" #: ../gtk/data/OutputEditorText.ui.h:16 ../qt/src/Ui_OutputEditorText.hh:109 #: ../qt/src/Ui_OutputEditorText.hh:110 msgid "Undo" msgstr "تراجع" #: ../gtk/data/OutputEditorText.ui.h:17 ../qt/src/Ui_OutputEditorText.hh:112 #: ../qt/src/Ui_OutputEditorText.hh:113 msgid "Redo" msgstr "إعادة ÙØ¹Ù„" #: ../gtk/data/PdfExportDialog.ui.h:1 ../qt/data/PdfExportDialog.ui.h:1 msgid "PDF Export" msgstr "تصدير PDF" #: ../gtk/data/PdfExportDialog.ui.h:4 ../qt/data/PdfExportDialog.ui.h:4 msgid "Output mode:" msgstr "صيغة المخرجات:" #: ../gtk/data/PdfExportDialog.ui.h:5 ../qt/data/PdfExportDialog.ui.h:6 msgid "PDF" msgstr "PDF" #: ../gtk/data/PdfExportDialog.ui.h:6 ../qt/data/PdfExportDialog.ui.h:7 msgid "PDF with invisible text overlay" msgstr "PDF المصور الأصلي مع وجود نص بالخلÙية" #: ../gtk/data/PdfExportDialog.ui.h:7 ../qt/data/PdfExportDialog.ui.h:16 msgid "Format:" msgstr "النسق:" #: ../gtk/data/PdfExportDialog.ui.h:8 ../qt/data/PdfExportDialog.ui.h:17 msgid "Compression:" msgstr "الضغط:" #: ../gtk/data/PdfExportDialog.ui.h:9 ../qt/data/PdfExportDialog.ui.h:14 msgid "Compression quality:" msgstr "مقدار الضغط:" #: ../gtk/data/PdfExportDialog.ui.h:10 ../qt/data/PdfExportDialog.ui.h:15 msgid "DPI:" msgstr "الدقة النقطية:" #: ../gtk/data/PdfExportDialog.ui.h:11 ../qt/data/PdfExportDialog.ui.h:18 msgid "Dithering algorithm:" msgstr "خوارزمية التحويل لأسود وأبيض:" #: ../gtk/data/PdfExportDialog.ui.h:12 ../qt/data/PdfExportDialog.ui.h:13 msgid "Image settings:" msgstr "إعدادات الصورة:" #: ../gtk/data/PdfExportDialog.ui.h:13 ../qt/data/PdfExportDialog.ui.h:25 msgid "Uniformize line and word spacing" msgstr "وحد السطر مع Ù…Ø³Ø§ÙØ© الكلمة" #: ../gtk/data/PdfExportDialog.ui.h:14 ../qt/data/PdfExportDialog.ui.h:21 msgid "Override font family:" msgstr "حدد خطا Ù…Ø®ØªÙ„ÙØ§:" #: ../gtk/data/PdfExportDialog.ui.h:15 ../qt/data/PdfExportDialog.ui.h:27 msgid "Fallback font family:" msgstr "ÙÙŠ حال عدم ØªÙˆÙØ± الخط:" #: ../gtk/data/PdfExportDialog.ui.h:16 ../qt/data/PdfExportDialog.ui.h:20 msgid "Override font size:" msgstr "تحديد حجم الخط:" #: ../gtk/data/PdfExportDialog.ui.h:17 ../qt/data/PdfExportDialog.ui.h:23 msgid "Font scaling:" msgstr "مقياس الخط:" #: ../gtk/data/PdfExportDialog.ui.h:18 ../qt/data/PdfExportDialog.ui.h:26 msgid "pt" msgstr "نقطة" #: ../gtk/data/PdfExportDialog.ui.h:19 ../qt/data/PdfExportDialog.ui.h:22 msgid "Preserve spaces wider than:" msgstr "Ø§Ø­ØªÙØ¸ Ø¨Ø§Ù„Ù…Ø³Ø§ÙØ§Øª الأكبر من:" #: ../gtk/data/PdfExportDialog.ui.h:20 ../qt/data/PdfExportDialog.ui.h:24 msgid "characters" msgstr "الحروÙ" #: ../gtk/data/PdfExportDialog.ui.h:21 ../qt/data/PdfExportDialog.ui.h:28 msgid "Sanitize hyphens before line breaks" msgstr "" #: ../gtk/data/PdfExportDialog.ui.h:22 ../qt/data/PdfExportDialog.ui.h:19 msgid "Text settings:" msgstr "إعدادات النص:" #: ../gtk/data/PdfExportDialog.ui.h:23 ../qt/data/PdfExportDialog.ui.h:10 msgid "Paper size:" msgstr "مقاس Ø§Ù„ØµÙØ­Ø©:" #: ../gtk/data/PdfExportDialog.ui.h:24 ../qt/data/PdfExportDialog.ui.h:11 msgid "Width" msgstr "العرض" #: ../gtk/data/PdfExportDialog.ui.h:25 ../qt/data/PdfExportDialog.ui.h:12 msgid "Height" msgstr "الطول" #: ../gtk/data/PdfExportDialog.ui.h:26 ../qt/data/PdfExportDialog.ui.h:29 msgid "Treat image sources as having true DPI:" msgstr "" #: ../gtk/data/PdfExportDialog.ui.h:27 ../qt/data/PdfExportDialog.ui.h:3 msgid "Basic" msgstr "الأساسي" #: ../gtk/data/PdfExportDialog.ui.h:28 ../qt/data/PdfExportDialog.ui.h:31 msgid "PDF version:" msgstr "النسخة الرقمية للـ PDF:" #: ../gtk/data/PdfExportDialog.ui.h:29 ../qt/data/PdfExportDialog.ui.h:33 msgid "Password:" msgstr "كلمة السر:" #: ../gtk/data/PdfExportDialog.ui.h:30 ../qt/data/PdfExportDialog.ui.h:34 msgid "Confirm password:" msgstr "تأكيد كلمة السر:" #: ../gtk/data/PdfExportDialog.ui.h:31 ../qt/data/PdfExportDialog.ui.h:32 msgid "Encryption (optional):" msgstr "التشÙير (اختياري):" #: ../gtk/data/PdfExportDialog.ui.h:32 ../qt/data/PdfExportDialog.ui.h:36 msgid "Author:" msgstr "المؤلÙ:" #: ../gtk/data/PdfExportDialog.ui.h:33 ../qt/data/PdfExportDialog.ui.h:38 msgid "Title:" msgstr "العنوان:" #: ../gtk/data/PdfExportDialog.ui.h:34 ../qt/data/PdfExportDialog.ui.h:40 msgid "Subject:" msgstr "الموضوع:" #: ../gtk/data/PdfExportDialog.ui.h:35 ../qt/data/PdfExportDialog.ui.h:37 msgid "Creator:" msgstr "صانع الملÙ:" #: ../gtk/data/PdfExportDialog.ui.h:36 ../qt/data/PdfExportDialog.ui.h:39 msgid "Producer:" msgstr "منتج الملÙ:" #: ../gtk/data/PdfExportDialog.ui.h:37 ../qt/data/PdfExportDialog.ui.h:41 msgid "Keywords:" msgstr "الكلمات Ø§Ù„Ù…ÙØªØ§Ø­ÙŠØ©:" #: ../gtk/data/PdfExportDialog.ui.h:38 ../qt/data/PdfExportDialog.ui.h:35 msgid "Additional information (optional):" msgstr "معلومات أخرى(اختياري):" #: ../gtk/data/PdfExportDialog.ui.h:39 ../qt/data/PdfExportDialog.ui.h:42 msgid "Import from current source" msgstr "استخرج من المصدر الحالي" #: ../gtk/data/PdfExportDialog.ui.h:40 ../qt/data/PdfExportDialog.ui.h:30 msgid "Advanced" msgstr "متقدم" #: ../gtk/data/SearchReplaceFrame.ui.h:1 ../qt/data/SearchReplaceFrame.ui.h:4 msgid "Find" msgstr "بحث" #: ../gtk/data/SearchReplaceFrame.ui.h:2 ../qt/data/SearchReplaceFrame.ui.h:2 msgid "Replace" msgstr "استبدال" #: ../gtk/data/SearchReplaceFrame.ui.h:3 ../qt/data/SearchReplaceFrame.ui.h:3 msgid "Replace all" msgstr "استبدال الكل" #: ../gtk/data/SearchReplaceFrame.ui.h:4 ../qt/data/SearchReplaceFrame.ui.h:5 msgid "Find previous" msgstr "بحث سابق" #: ../gtk/data/SearchReplaceFrame.ui.h:5 ../qt/data/SearchReplaceFrame.ui.h:6 msgid "Find next" msgstr "بحث لاحق" #: ../gtk/data/SearchReplaceFrame.ui.h:6 ../qt/data/SearchReplaceFrame.ui.h:7 msgid "Match case" msgstr "طابق نسق الحر٠case للإنجليزي" #: ../gtk/data/SearchReplaceFrame.ui.h:7 #: ../gtk/data/SubstitutionsManager.ui.h:1 ../qt/data/SearchReplaceFrame.ui.h:1 #: ../qt/src/SubstitutionsManager.cc:36 msgid "Substitutions" msgstr "استبدالات" #: ../gtk/data/SelectionMenu.ui.h:1 ../qt/src/DisplayerToolSelect.cc:239 msgid "Delete" msgstr "حذÙ" #: ../gtk/data/SelectionMenu.ui.h:2 ../qt/src/DisplayerToolSelect.cc:225 msgid "Order:" msgstr "الترتيب:" #: ../gtk/data/SelectionMenu.ui.h:3 ../gtk/src/hocr/DisplayerToolHOCR.cc:29 #: ../qt/src/DisplayerToolSelect.cc:240 ../qt/src/hocr/DisplayerToolHOCR.cc:31 msgid "Recognize" msgstr "تعر٠ضوئي" #: ../gtk/data/SelectionMenu.ui.h:4 ../qt/src/DisplayerToolSelect.cc:241 msgid "Recognize to clipboard" msgstr "تعر٠ضوئي إلى Ø§Ù„Ø­Ø§ÙØ¸Ø©" #: ../gtk/data/SelectionMenu.ui.h:5 ../qt/src/DisplayerToolSelect.cc:242 msgid "Save as image" msgstr "Ø§Ø­ÙØ¸ كصورة" #: ../gtk/data/SubstitutionsManager.ui.h:2 ../qt/src/SubstitutionsManager.cc:38 #: ../qt/src/SubstitutionsManager.cc:39 msgid "Open" msgstr "ÙØªØ­" #: ../gtk/data/SubstitutionsManager.ui.h:3 ../gtk/src/Utils.cc:73 #: ../qt/src/SubstitutionsManager.cc:41 ../qt/src/SubstitutionsManager.cc:42 msgid "Save" msgstr "Ø­ÙØ¸" #: ../gtk/data/SubstitutionsManager.ui.h:4 ../qt/src/SubstitutionsManager.cc:44 #: ../qt/src/SubstitutionsManager.cc:45 msgid "Clear" msgstr "مسح الكل" #: ../gtk/data/SubstitutionsManager.ui.h:5 ../qt/data/ConfigDialog.ui.h:16 #: ../qt/src/SubstitutionsManager.cc:47 ../qt/src/SubstitutionsManager.cc:48 msgid "Add" msgstr "Ø¥Ø¶Ø§ÙØ©" #: ../gtk/data/SubstitutionsManager.ui.h:6 #: ../gtk/src/hocr/OutputEditorHOCR.cc:886 ../qt/data/ConfigDialog.ui.h:17 #: ../qt/src/hocr/OutputEditorHOCR.cc:727 ../qt/src/SubstitutionsManager.cc:50 #: ../qt/src/SubstitutionsManager.cc:51 msgid "Remove" msgstr "إلغاء" #: ../gtk/data/SubstitutionsManager.ui.h:7 ../gtk/data/TessdataManager.ui.h:2 msgid "Apply" msgstr "تطبيق" #: ../gtk/data/SubstitutionsManager.ui.h:8 ../gtk/data/TessdataManager.ui.h:3 msgid "Close" msgstr "إغلاق" #: ../gtk/data/TessdataManager.ui.h:1 ../qt/src/TessdataManager.cc:49 msgid "Tessdata Manager" msgstr "مدير Tessdata" #: ../gtk/data/TessdataManager.ui.h:5 ../qt/src/TessdataManager.cc:51 msgid "Manage installed languages:" msgstr "إدارة لغات التعر٠المثبتة:" #: ../gtk/src/Acquirer.cc:79 ../qt/src/Acquirer.cc:70 msgid "scan.png" msgstr "scan.png" #: ../gtk/src/Acquirer.cc:91 ../qt/src/Acquirer.cc:85 msgid "Images" msgstr "صور" #: ../gtk/src/Acquirer.cc:92 ../qt/src/Acquirer.cc:86 msgid "Choose Output Filename..." msgstr "اختر اسم المل٠للمخرج..." #: ../gtk/src/Acquirer.cc:106 ../qt/src/Acquirer.cc:100 msgid "Failed to initialize the scanning backend." msgstr "ÙØ´Ù„ ÙÙŠ تهيئة المسح الضوئي." #: ../gtk/src/Acquirer.cc:115 ../qt/src/Acquirer.cc:106 msgid "Scan failed" msgstr "ÙØ´Ù„ المسح الضوئي" #: ../gtk/src/Acquirer.cc:133 ../qt/src/Acquirer.cc:122 msgid "No scanners were detected." msgstr "لم يتم اكتشا٠أي ماسحات ضوئية." #: ../gtk/src/Acquirer.cc:150 ../gtk/src/Acquirer.cc:168 #: ../qt/src/Acquirer.cc:136 ../qt/src/Acquirer.cc:154 msgid "Starting scan..." msgstr "بدء المسح الضوئي..." #: ../gtk/src/Acquirer.cc:164 ../qt/src/Acquirer.cc:150 msgid "Opening device..." msgstr "ÙØªØ­ جهاز..." #: ../gtk/src/Acquirer.cc:166 ../qt/src/Acquirer.cc:152 msgid "Setting options..." msgstr "خيارات الإعدادات..." #: ../gtk/src/Acquirer.cc:170 ../qt/src/Acquirer.cc:156 msgid "Getting parameters..." msgstr "الحصول على المدخلات..." #: ../gtk/src/Acquirer.cc:172 ../qt/src/Acquirer.cc:158 msgid "Transferring data..." msgstr "نقل البيانات..." #: ../gtk/src/Acquirer.cc:179 ../qt/src/Acquirer.cc:165 msgid "Canceling scan..." msgstr "إلغاء المسح الضوئي..." #: ../gtk/src/Config.cc:49 ../qt/data/ConfigDialog.ui.h:7 msgid "Filename prefix" msgstr "بادئة اسم الملÙ" #: ../gtk/src/Config.cc:50 ../qt/data/ConfigDialog.ui.h:8 msgid "Code" msgstr "الرمز" #: ../gtk/src/Config.cc:51 ../qt/data/ConfigDialog.ui.h:9 msgid "Native name" msgstr "الاسم الأصلي" #: ../gtk/src/Config.cc:109 ../qt/src/Config.cc:108 msgid "Script" msgstr "" #: ../gtk/src/CrashHandler.cc:25 ../gtk/src/CrashHandler.cc:41 #: ../qt/src/CrashHandler.cc:36 msgid "Crash Handler" msgstr "مدير أخطاء البرنامج" #: ../gtk/src/CrashHandler.cc:43 ../qt/src/CrashHandler.cc:31 msgid "Your work has been saved under %1." msgstr "عملك تم Ø­ÙØ¸Ù‡ ÙÙŠ %1." #: ../gtk/src/CrashHandler.cc:45 ../qt/src/CrashHandler.cc:33 msgid "There was no unsaved work." msgstr "لا توجد أعمال محÙوظة." #: ../gtk/src/CrashHandler.cc:106 ../qt/src/CrashHandler.cc:62 msgid "Failed to obtain backtrace. Is gdb installed?" msgstr "ÙØ´Ù„ ÙÙŠ الحصول على سجلات الأخطاء. هل برنامج gdb مثبت؟" #: ../gtk/src/Displayer.cc:232 ../qt/src/Displayer.cc:174 msgid "Failed to load image" msgstr "ÙØ´Ù„ ÙÙŠ تحميل الصورة" #: ../gtk/src/Displayer.cc:232 ../qt/src/Displayer.cc:174 msgid "" "The file might not be an image or be corrupt:\n" "%1" msgstr "" "هذا المل٠يبدو أنه ليس صورة:\n" "%1" #: ../gtk/src/DisplayerToolSelect.cc:138 ../qt/src/DisplayerToolSelect.cc:135 msgid "PNG Images" msgstr "صور PNG" #: ../gtk/src/DisplayerToolSelect.cc:139 ../qt/src/DisplayerToolSelect.cc:135 msgid "Save Selection Image" msgstr "Ø§Ø­ÙØ¸ الصورة المختارة" #: ../gtk/src/DisplayerToolSelect.cc:139 ../qt/src/DisplayerToolSelect.cc:135 msgid "selection.png" msgstr "selection.png" #: ../gtk/src/DisplayerToolSelect.cc:146 ../qt/src/DisplayerToolSelect.cc:142 msgid "Recognize all" msgstr "التعر٠الضوئي للكل" #: ../gtk/src/DisplayerToolSelect.cc:146 ../qt/src/DisplayerToolSelect.cc:142 msgid "Recognize selection" msgstr "التعر٠على التحديد" #: ../gtk/src/DisplayerToolSelect.cc:186 ../qt/src/DisplayerToolSelect.cc:182 msgid "Performing layout analysis" msgstr "إجراء تحليل للتخطيط" #: ../gtk/src/FileDialogs.cc:235 msgid "" "A file named \"%1\" already exists. Are you sure you want to overwrite it?" msgstr "المل٠المسمى \"%1\" موجود Ø¨Ø§Ù„ÙØ¹Ù„. هل أنت متأكد أنك تريد استبداله؟" #: ../gtk/src/FileDialogs.cc:237 msgid "Overwrite File?" msgstr "استبدال Ø§Ù„Ù…Ù„ÙØŸ" #: ../gtk/src/hocr/HOCRDocument.cc:611 ../gtk/src/hocr/OutputEditorHOCR.cc:266 #: ../qt/src/hocr/OutputEditorHOCR.cc:229 msgid "Page" msgstr "Ø§Ù„ØµÙØ­Ø©" #: ../gtk/src/hocr/HOCRDocument.cc:613 ../qt/src/hocr/HOCRDocument.cc:530 msgid "Text block" msgstr "كتلة النص" #: ../gtk/src/hocr/HOCRDocument.cc:615 ../gtk/src/hocr/OutputEditorHOCR.cc:272 #: ../qt/src/hocr/HOCRDocument.cc:532 ../qt/src/hocr/OutputEditorHOCR.cc:231 msgid "Paragraph" msgstr "الÙقرة" #: ../gtk/src/hocr/HOCRDocument.cc:617 ../qt/src/hocr/HOCRDocument.cc:534 msgid "Textline" msgstr "السطر" #: ../gtk/src/hocr/HOCRDocument.cc:621 ../qt/src/hocr/HOCRDocument.cc:538 msgid "Graphic" msgstr "تصويري" #: ../gtk/src/hocr/HOCROdtExporter.cc:65 ../gtk/src/hocr/HOCRPdfExporter.cc:489 #: ../gtk/src/hocr/HOCRTextExporter.cc:34 #: ../gtk/src/hocr/OutputEditorHOCR.cc:963 ../gtk/src/OutputEditorText.cc:272 #: ../qt/src/hocr/HOCROdtExporter.cc:50 ../qt/src/hocr/HOCRPdfExporter.cc:478 #: ../qt/src/hocr/HOCRTextExporter.cc:36 ../qt/src/hocr/OutputEditorHOCR.cc:830 #: ../qt/src/OutputEditorText.cc:238 msgid "output" msgstr "المخرج" #: ../gtk/src/hocr/HOCROdtExporter.cc:68 ../qt/src/hocr/HOCROdtExporter.cc:53 msgid "OpenDocument Text Documents" msgstr "مستندات من نوع OpenDocument" #: ../gtk/src/hocr/HOCROdtExporter.cc:69 ../qt/src/hocr/HOCROdtExporter.cc:53 msgid "Save ODT Output..." msgstr "Ø§Ø­ÙØ¸ بصيغة ODT وورد..." #: ../gtk/src/hocr/HOCROdtExporter.cc:77 ../gtk/src/hocr/HOCROdtExporter.cc:342 #: ../gtk/src/hocr/HOCRPdfExporter.cc:619 #: ../gtk/src/hocr/HOCRTextExporter.cc:46 ../qt/src/hocr/HOCROdtExporter.cc:61 #: ../qt/src/hocr/HOCRPdfExporter.cc:609 ../qt/src/hocr/HOCRTextExporter.cc:47 msgid "Export failed" msgstr "ÙØ´Ù„ ÙÙŠ التصدير" #: ../gtk/src/hocr/HOCROdtExporter.cc:77 ../gtk/src/hocr/HOCROdtExporter.cc:342 #: ../qt/src/hocr/HOCROdtExporter.cc:61 msgid "The ODT export failed: unable to write output file." msgstr "ÙØ´Ù„ ÙÙŠ التصدير: كتابة المخرجات غير ممكنة." #: ../gtk/src/hocr/HOCROdtExporter.cc:336 ../qt/src/hocr/HOCROdtExporter.cc:254 msgid "Exporting to ODT..." msgstr "تصدير بصيغة ODT وورد..." #: ../gtk/src/hocr/HOCRPdfExporter.cc:283 ../qt/src/hocr/HOCRPdfExporter.cc:365 msgid "Same as source" msgstr "Ø¨Ù†ÙØ³ نسق المصدر" #: ../gtk/src/hocr/HOCRPdfExporter.cc:286 ../qt/src/hocr/HOCRPdfExporter.cc:366 msgid "Custom" msgstr "تهيئة خاصة" #: ../gtk/src/hocr/HOCRPdfExporter.cc:300 ../qt/src/hocr/HOCRPdfExporter.cc:362 msgid "cm" msgstr "سنتيمتر" #: ../gtk/src/hocr/HOCRPdfExporter.cc:303 ../qt/src/hocr/HOCRPdfExporter.cc:363 msgid "in" msgstr "بوصة" #: ../gtk/src/hocr/HOCRPdfExporter.cc:319 ../qt/src/hocr/HOCRPdfExporter.cc:353 msgid "Monochrome" msgstr "أسود وأبيض" #: ../gtk/src/hocr/HOCRPdfExporter.cc:328 ../qt/src/hocr/HOCRPdfExporter.cc:355 msgid "Threshold (closest color)" msgstr "أقرب لون" #: ../gtk/src/hocr/HOCRPdfExporter.cc:331 ../qt/src/hocr/HOCRPdfExporter.cc:356 msgid "Diffuse" msgstr "انتشار لوني" #: ../gtk/src/hocr/HOCRPdfExporter.cc:340 ../qt/src/hocr/HOCRPdfExporter.cc:357 msgid "Zip (lossless)" msgstr "Zip (Ø¨Ù†ÙØ³ جودة الأصل)" #: ../gtk/src/hocr/HOCRPdfExporter.cc:344 ../qt/src/hocr/HOCRPdfExporter.cc:358 msgid "CCITT Group 4 (lossless)" msgstr "CCITT Group 4 (Ø¨Ù†ÙØ³ جودة الأصل)" #: ../gtk/src/hocr/HOCRPdfExporter.cc:348 ../qt/src/hocr/HOCRPdfExporter.cc:359 msgid "Jpeg (lossy)" msgstr "JPG (أقل من جودة الأصل)" #: ../gtk/src/hocr/HOCRPdfExporter.cc:493 ../qt/src/hocr/HOCRPdfExporter.cc:482 msgid "PDF Files" msgstr "Ù…Ù„ÙØ§Øª PDF" #: ../gtk/src/hocr/HOCRPdfExporter.cc:494 ../qt/src/hocr/HOCRPdfExporter.cc:482 msgid "Save PDF Output..." msgstr "Ø­ÙØ¸ مخرج الـPDF..." #: ../gtk/src/hocr/HOCRPdfExporter.cc:500 ../qt/src/hocr/HOCRPdfExporter.cc:488 msgid "Invalid Output" msgstr "مخرج خاطئ" #: ../gtk/src/hocr/HOCRPdfExporter.cc:500 ../qt/src/hocr/HOCRPdfExporter.cc:488 msgid "Cannot overwrite a file which is a source image of this document." msgstr "لا يمكن استبدال المل٠المصدر لهذا المستند." #: ../gtk/src/hocr/HOCRPdfExporter.cc:516 ../qt/src/hocr/HOCRPdfExporter.cc:511 msgid "Failed to create output" msgstr "ÙØ´Ù„ ÙÙŠ إنشاء المخرج" #: ../gtk/src/hocr/HOCRPdfExporter.cc:516 ../qt/src/hocr/HOCRPdfExporter.cc:511 msgid "Failed to create output. The returned error was: %1" msgstr "ÙØ´Ù„ ÙÙŠ إنشاء المخرج. سجل الخطأ هو: %1" #: ../gtk/src/hocr/HOCRPdfExporter.cc:558 ../qt/src/hocr/HOCRPdfExporter.cc:551 msgid "The operation was cancelled" msgstr "تم إلغاء العملية" #: ../gtk/src/hocr/HOCRPdfExporter.cc:607 ../qt/src/hocr/HOCRPdfExporter.cc:597 msgid "Failed to render page %1" msgstr "ÙØ´Ù„ ÙÙŠ محاولة رسم Ø§Ù„ØµÙØ­Ø© %1" #: ../gtk/src/hocr/HOCRPdfExporter.cc:614 ../qt/src/hocr/HOCRPdfExporter.cc:604 msgid "Exporting to PDF..." msgstr "Ø­ÙØ¸ بصيغة PDF نصي..." #: ../gtk/src/hocr/HOCRPdfExporter.cc:619 ../qt/src/hocr/HOCRPdfExporter.cc:609 msgid "The PDF export failed: %1." msgstr "ÙØ´Ù„ ÙÙŠ تصدير PDF: %1." #: ../gtk/src/hocr/HOCRPdfExporter.cc:673 ../qt/src/hocr/HOCRPdfExporter.cc:662 msgid "The PDF library could not load the font '%1'." msgstr "مكتبة PDF لا يمكنها تحميل هذا الخط '%1'." #: ../gtk/src/hocr/HOCRTextExporter.cc:37 ../gtk/src/OutputEditorText.cc:274 #: ../qt/src/hocr/HOCRTextExporter.cc:39 ../qt/src/OutputEditorText.cc:239 msgid "Text Files" msgstr "Ù…Ù„ÙØ§Øª نصية txt" #: ../gtk/src/hocr/HOCRTextExporter.cc:38 ../qt/src/hocr/HOCRTextExporter.cc:39 msgid "Save Text Output..." msgstr "Ø§Ø­ÙØ¸ بصيغة مل٠نصي txt..." #: ../gtk/src/hocr/HOCRTextExporter.cc:46 ../qt/src/hocr/HOCRTextExporter.cc:47 msgid "The text export failed: unable to write output file." msgstr "عملية تصدير المل٠النصي ÙØ´Ù„ت: لا يمكن كتابة المل٠على الحاسوب." #: ../gtk/src/hocr/OutputEditorHOCR.cc:269 #: ../qt/src/hocr/OutputEditorHOCR.cc:230 msgid "Block" msgstr "كتلة" #: ../gtk/src/hocr/OutputEditorHOCR.cc:275 #: ../qt/src/hocr/OutputEditorHOCR.cc:232 msgid "Line" msgstr "السطر" #: ../gtk/src/hocr/OutputEditorHOCR.cc:278 #: ../qt/src/hocr/OutputEditorHOCR.cc:233 msgid "Word" msgstr "الكلمة" #: ../gtk/src/hocr/OutputEditorHOCR.cc:281 #: ../qt/src/hocr/OutputEditorHOCR.cc:234 msgid "Misspelled word" msgstr "كلمة خاطئة إملائيا" #: ../gtk/src/hocr/OutputEditorHOCR.cc:435 #: ../qt/src/hocr/OutputEditorHOCR.cc:317 msgid "" "The following pages could not be processed:\n" "%1" msgstr "" "Ø§Ù„ØµÙØ­Ø§Øª التالية لا يمكن معالجتها:\n" "%1" #: ../gtk/src/hocr/OutputEditorHOCR.cc:436 #: ../qt/src/hocr/OutputEditorHOCR.cc:318 msgid "Recognition errors" msgstr "أخطاء ÙÙŠ التعر٠الضوئي" #: ../gtk/src/hocr/OutputEditorHOCR.cc:594 #: ../qt/src/hocr/OutputEditorHOCR.cc:500 #: ../qt/src/hocr/OutputEditorHOCR.cc:512 msgid "Multiple values" msgstr "قيم متعددة" #. Merging allowed #: ../gtk/src/hocr/OutputEditorHOCR.cc:778 #: ../qt/src/hocr/OutputEditorHOCR.cc:641 msgid "Merge" msgstr "دمج" #: ../gtk/src/hocr/OutputEditorHOCR.cc:786 #: ../gtk/src/hocr/OutputEditorHOCR.cc:877 #: ../qt/src/hocr/OutputEditorHOCR.cc:643 #: ../qt/src/hocr/OutputEditorHOCR.cc:725 msgid "Split from parent" msgstr "" #. Swapping allowed #: ../gtk/src/hocr/OutputEditorHOCR.cc:797 #: ../qt/src/hocr/OutputEditorHOCR.cc:647 msgid "Swap" msgstr "تبديل" #: ../gtk/src/hocr/OutputEditorHOCR.cc:821 #: ../qt/src/hocr/OutputEditorHOCR.cc:693 msgid "Add graphic region" msgstr "Ø¥Ø¶Ø§ÙØ© منطقة للتعر٠الضوئي" #: ../gtk/src/hocr/OutputEditorHOCR.cc:824 #: ../qt/src/hocr/OutputEditorHOCR.cc:694 msgid "Add text block" msgstr "Ø¥Ø¶Ø§ÙØ© كتلة نص" #: ../gtk/src/hocr/OutputEditorHOCR.cc:828 #: ../qt/src/hocr/OutputEditorHOCR.cc:696 msgid "Add paragraph" msgstr "Ø¥Ø¶Ø§ÙØ© Ùقرة" #: ../gtk/src/hocr/OutputEditorHOCR.cc:832 #: ../qt/src/hocr/OutputEditorHOCR.cc:698 msgid "Add line" msgstr "Ø¥Ø¶Ø§ÙØ© سطر" #: ../gtk/src/hocr/OutputEditorHOCR.cc:836 #: ../qt/src/hocr/OutputEditorHOCR.cc:700 msgid "Add word" msgstr "Ø¥Ø¶Ø§ÙØ© كلمة" #: ../gtk/src/hocr/OutputEditorHOCR.cc:852 #: ../qt/src/hocr/OutputEditorHOCR.cc:710 msgid "No suggestions" msgstr "لا توجد اقتراحات" #: ../gtk/src/hocr/OutputEditorHOCR.cc:858 #: ../qt/src/hocr/OutputEditorHOCR.cc:714 msgid "Add to dictionary" msgstr "Ø¥Ø¶Ø§ÙØ© إلى القاموس" #: ../gtk/src/hocr/OutputEditorHOCR.cc:864 #: ../qt/src/hocr/OutputEditorHOCR.cc:716 msgid "Ignore word" msgstr "تجاهل الكلمة" #: ../gtk/src/hocr/OutputEditorHOCR.cc:926 #: ../gtk/src/hocr/OutputEditorHOCR.cc:965 #: ../qt/src/hocr/OutputEditorHOCR.cc:795 #: ../qt/src/hocr/OutputEditorHOCR.cc:832 msgid "hOCR HTML Files" msgstr "مل٠HTML بصيغة hOCR" #: ../gtk/src/hocr/OutputEditorHOCR.cc:927 #: ../qt/src/hocr/OutputEditorHOCR.cc:795 msgid "Open hOCR File" msgstr "ÙØªØ­ مل٠hOCR" #: ../gtk/src/hocr/OutputEditorHOCR.cc:936 #: ../qt/src/hocr/OutputEditorHOCR.cc:802 msgid "Failed to open file" msgstr "ÙØ´Ù„ت عملية ÙØªØ­ الملÙ" #: ../gtk/src/hocr/OutputEditorHOCR.cc:936 #: ../qt/src/hocr/OutputEditorHOCR.cc:802 msgid "The file could not be opened: %1." msgstr "هذ المل٠لا يمكن ÙØªØ­Ù‡: %1." #: ../gtk/src/hocr/OutputEditorHOCR.cc:945 #: ../qt/src/hocr/OutputEditorHOCR.cc:809 msgid "Invalid hOCR file" msgstr "مل٠hOCR غير صالح" #: ../gtk/src/hocr/OutputEditorHOCR.cc:945 #: ../qt/src/hocr/OutputEditorHOCR.cc:809 msgid "The file does not appear to contain valid hOCR HTML: %1" msgstr "هذا المل٠لا يبدو أنه يحتوي على hOCR HTML صالح: %1" #: ../gtk/src/hocr/OutputEditorHOCR.cc:966 #: ../qt/src/hocr/OutputEditorHOCR.cc:832 msgid "Save hOCR Output..." msgstr "Ø§Ø­ÙØ¸ مخرج hOCR..." #: ../gtk/src/hocr/OutputEditorHOCR.cc:973 ../gtk/src/OutputEditorText.cc:282 #: ../qt/src/hocr/OutputEditorHOCR.cc:839 ../qt/src/OutputEditorText.cc:246 msgid "Failed to save output" msgstr "ÙØ´Ù„ت عملية Ø­ÙØ¸ المخرج" #: ../gtk/src/hocr/OutputEditorHOCR.cc:973 ../gtk/src/OutputEditorText.cc:282 #: ../qt/src/hocr/OutputEditorHOCR.cc:839 ../qt/src/OutputEditorText.cc:246 msgid "Check that you have writing permissions in the selected folder." msgstr "قم بالتأكد أنك تملك صلاحية كتابة Ø§Ù„Ù…Ù„ÙØ§Øª ÙÙŠ المجلد المحدد." #: ../gtk/src/hocr/OutputEditorHOCR.cc:1035 ../gtk/src/OutputEditorText.cc:296 #: ../qt/src/hocr/OutputEditorHOCR.cc:894 ../qt/src/OutputEditorText.cc:259 msgid "Output not saved" msgstr "المخرج لم يتم Ø­ÙØ¸Ù‡" #: ../gtk/src/hocr/OutputEditorHOCR.cc:1035 ../gtk/src/OutputEditorText.cc:296 #: ../qt/src/hocr/OutputEditorHOCR.cc:894 ../qt/src/OutputEditorText.cc:259 msgid "Save output before proceeding?" msgstr "Ø­ÙØ¸ المخرج قبل المتابعة؟" #: ../gtk/src/hocr/OutputEditorHOCR.cc:1156 ../gtk/src/OutputEditorText.cc:184 #: ../qt/src/hocr/OutputEditorHOCR.cc:991 ../qt/src/OutputEditorText.cc:152 msgid "Replacing..." msgstr "جار الاستبدال..." #: ../gtk/src/hocr/OutputEditorHOCR.cc:1181 ../gtk/src/OutputEditorText.cc:192 #: ../qt/src/hocr/OutputEditorHOCR.cc:1014 ../qt/src/OutputEditorText.cc:160 msgid "Applying substitutions..." msgstr "جار تطبيق الاستبدالات..." #: ../gtk/src/MainWindow.cc:131 ../qt/src/MainWindow.cc:295 msgid "Using tesseract" msgstr "باستخدام محرك التعر٠tesseract" #: ../gtk/src/MainWindow.cc:178 ../qt/src/MainWindow.cc:194 msgid "Select an image to begin..." msgstr "اختر صورة للبدء..." #: ../gtk/src/MainWindow.cc:293 ../qt/src/MainWindow.cc:278 msgid "Multiple sources" msgstr "مصادر متعددة" #: ../gtk/src/MainWindow.cc:295 ../qt/src/MainWindow.cc:280 msgid "Ready" msgstr "مستعد" #: ../gtk/src/MainWindow.cc:442 ../qt/src/MainWindow.cc:423 msgid "New version" msgstr "نسخة جديدة" #: ../gtk/src/MainWindow.cc:442 ../qt/src/MainWindow.cc:423 msgid "gImageReader %1 is available" msgstr "البرنامج gImageReader %1 Ù…ØªÙˆÙØ±" #: ../gtk/src/MainWindow.cc:443 ../qt/src/MainWindow.cc:424 msgid "Download" msgstr "تنزيل" #: ../gtk/src/MainWindow.cc:444 ../qt/src/MainWindow.cc:425 msgid "Changelog" msgstr "سجل التغييرات" #: ../gtk/src/MainWindow.cc:445 ../qt/src/MainWindow.cc:426 msgid "Don't notify again" msgstr "لا تقم بإعلامي مرة أخرى" #: ../gtk/src/MainWindow.cc:466 ../qt/src/MainWindow.cc:474 msgid "Don't show again" msgstr "لا تعرض هذا مرة أخرى" #: ../gtk/src/MainWindow.cc:467 ../gtk/src/MainWindow.cc:480 #: ../qt/src/MainWindow.cc:475 msgid "Install" msgstr "تثبيت" #: ../gtk/src/MainWindow.cc:487 ../qt/src/MainWindow.cc:487 msgid "Spelling dictionary missing" msgstr "قاموس التدقيق الإملائي غير موجود" #: ../gtk/src/MainWindow.cc:487 ../qt/src/MainWindow.cc:487 msgid "The spellcheck dictionary for %1 is not installed" msgstr "قاموس التدقيق الإملائي لـ %1 غير مثبت" #: ../gtk/src/MainWindow.cc:494 ../gtk/src/MainWindow.cc:523 #: ../qt/src/MainWindow.cc:493 msgid "Installing spelling dictionary for '%1'" msgstr "جار تثبيت قاموس التدقيق الإملائي لـ '%1'" #: ../gtk/src/MainWindow.cc:515 ../gtk/src/MainWindow.cc:536 #: ../gtk/src/MainWindow.cc:544 ../gtk/src/MainWindow.cc:592 #: ../gtk/src/MainWindow.cc:597 ../gtk/src/TessdataManager.cc:60 #: ../gtk/src/TessdataManager.cc:70 ../gtk/src/TessdataManager.cc:339 #: ../qt/src/MainWindow.cc:512 ../qt/src/MainWindow.cc:525 #: ../qt/src/MainWindow.cc:534 ../qt/src/MainWindow.cc:578 #: ../qt/src/MainWindow.cc:583 ../qt/src/TessdataManager.cc:74 #: ../qt/src/TessdataManager.cc:84 ../qt/src/TessdataManager.cc:315 msgid "Error" msgstr "خطأ" #: ../gtk/src/MainWindow.cc:515 ../qt/src/MainWindow.cc:512 msgid "Failed to install spelling dictionary: %1" msgstr "ÙØ´Ù„ ÙÙŠ تثبيت قاموس التدقيق الإملائي: %1" #: ../gtk/src/MainWindow.cc:536 ../qt/src/MainWindow.cc:525 msgid "Failed to create directory for spelling dictionaries." msgstr "ÙØ´Ù„ ÙÙŠ إنشاء مجلد قواميس التدقيق الإملائي." #: ../gtk/src/MainWindow.cc:544 ../qt/src/MainWindow.cc:534 msgid "Could not read %1: %2." msgstr "لا يمكن قراءة %1: %2." #: ../gtk/src/MainWindow.cc:571 ../qt/src/MainWindow.cc:558 msgid "Downloading '%1'..." msgstr "جار التنزيل '%1'..." #: ../gtk/src/MainWindow.cc:592 ../qt/src/MainWindow.cc:578 msgid "" "The following dictionaries could not be downloaded:\n" "%1\n" "\n" "Check the connectivity and directory permissions.\n" "Hint: If you don't have write permissions in system folders, you can switch " "to user paths in the settings dialog." msgstr "" "هذا القواميس لا يمكن تنزيلها \n" "%1\n" "\n" "تأكد من اتصالك بالشبكة وصلاحيات المجلد\n" "تلميح: إذا كان لا يمكنك الكتابة ÙÙŠ مجلدات النظام، يمكنك أن تتحول إلى مسار " "المستخدمين ÙÙŠ الإعدادت." #: ../gtk/src/MainWindow.cc:595 ../qt/src/MainWindow.cc:581 msgid "Dictionaries installed" msgstr "القواميس تم تثبيتها" #: ../gtk/src/MainWindow.cc:595 msgid "" "The following dictionaries were installed:\n" "%1" msgstr "" "هذه القواميس تم تثبيتها:\n" "%1" #: ../gtk/src/MainWindow.cc:597 ../qt/src/MainWindow.cc:583 msgid "No spelling dictionaries found for '%1'." msgstr "لا يتم العثور على قواميس تدقيق إملائي لـ '%1'." #: ../gtk/src/OutputEditorText.cc:154 ../qt/src/OutputEditorText.cc:137 msgid "Stripping line breaks..." msgstr "إزالة كسر السطور..." #: ../gtk/src/OutputEditorText.cc:162 msgid "Check spelling" msgstr "Ø§ÙØ­Øµ إملائيا" #: ../gtk/src/OutputEditorText.cc:231 ../qt/src/OutputEditorText.cc:196 msgid "File: %1" msgstr "ملÙ: %1" #: ../gtk/src/OutputEditorText.cc:234 ../qt/src/OutputEditorText.cc:199 msgid "Page: %1" msgstr "ØµÙØ­Ø©: %1" #: ../gtk/src/OutputEditorText.cc:247 ../gtk/src/Recognizer.cc:471 #: ../qt/src/Recognizer.cc:462 msgid "" "\n" "[Failed to recognize page %1]\n" msgstr "" "\n" "[خطأ ÙÙŠ التعر٠الضوئي Ù„Ù„ØµÙØ­Ø© %1]\n" #: ../gtk/src/OutputEditorText.cc:275 ../qt/src/OutputEditorText.cc:239 msgid "Save Output..." msgstr "Ø­ÙØ¸ المخرج..." #: ../gtk/src/Recognizer.cc:179 ../qt/src/Recognizer.cc:172 msgid "No languages available" msgstr "لا توجد لغات متاحة" #: ../gtk/src/Recognizer.cc:179 ../qt/src/Recognizer.cc:172 msgid "" "No tesseract languages are available for use. Recognition will not work." msgstr "لا توجد لغات تعر٠ضوئي لمحرك التعر٠tesseract. التعر٠الضوئي لن يعمل." #: ../gtk/src/Recognizer.cc:233 ../qt/src/Recognizer.cc:232 msgid "Multilingual" msgstr "بلغات متعددة" #: ../gtk/src/Recognizer.cc:285 ../qt/src/Recognizer.cc:277 msgid "Automatic page segmentation" msgstr "تقسيم تخطيط Ø§Ù„ØµÙØ­Ø© بشكل تلقائي" #: ../gtk/src/Recognizer.cc:286 ../qt/src/Recognizer.cc:278 msgid "Page segmentation with orientation and script detection" msgstr "تقسيم تخطيط Ø§Ù„ØµÙØ­Ø© مع التعر٠التلقائي للغة واتجاه Ø§Ù„ØµÙØ­Ø©" #: ../gtk/src/Recognizer.cc:287 ../qt/src/Recognizer.cc:279 msgid "Assume single column of text" msgstr "اعتبر النص ÙÙŠ عمود واحد" #: ../gtk/src/Recognizer.cc:288 ../qt/src/Recognizer.cc:280 msgid "Assume single block of vertically aligned text" msgstr "اعتبر كتلة نص واحدة مضبوطة عموديا" #: ../gtk/src/Recognizer.cc:289 ../qt/src/Recognizer.cc:281 msgid "Assume a single uniform block of text" msgstr "اعتبر كتلة نص واحدة" #: ../gtk/src/Recognizer.cc:290 ../qt/src/Recognizer.cc:282 msgid "Assume a line of text" msgstr "اعتبر نص ÙÙŠ سطر واحد" #: ../gtk/src/Recognizer.cc:291 ../qt/src/Recognizer.cc:283 msgid "Assume a single word" msgstr "اعتبر وجود كلمة واحدة" #: ../gtk/src/Recognizer.cc:292 ../qt/src/Recognizer.cc:284 msgid "Assume a single word in a circle" msgstr "اعتبر وجود كلمة واحدة ÙÙŠ دائرة" #: ../gtk/src/Recognizer.cc:293 ../qt/src/Recognizer.cc:285 msgid "Sparse text in no particular order" msgstr "نص متناثر بدون أي ترتيب" #: ../gtk/src/Recognizer.cc:294 ../qt/src/Recognizer.cc:286 msgid "Sparse text with orientation and script detection" msgstr "نص متناثر مع التعر٠التلقائي لاتجاه Ø§Ù„ØµÙØ­Ø© واللغة" #: ../gtk/src/Recognizer.cc:309 ../qt/src/Recognizer.cc:297 msgid "Page segmentation mode" msgstr "وضعية تخطيط Ø§Ù„ØµÙØ­Ø©" #: ../gtk/src/Recognizer.cc:313 ../qt/src/Recognizer.cc:300 msgid "Character whitelist / blacklist..." msgstr "" #: ../gtk/src/Recognizer.cc:319 ../qt/src/Recognizer.cc:305 msgid "Manage languages..." msgstr "إدارة اللغات..." #: ../gtk/src/Recognizer.cc:375 ../qt/src/Recognizer.cc:369 msgid "Current selection" msgstr "التحديد الحالي" #: ../gtk/src/Recognizer.cc:465 ../qt/src/Recognizer.cc:455 msgid "Recognizing page %1 (%2 of %3)" msgstr "جار التعر٠الضوئي على Ø§Ù„ØµÙØ­Ø© %1 (%2 من %3)" #: ../gtk/src/Recognizer.cc:470 ../qt/src/Recognizer.cc:461 msgid "" "\n" "- Page %1: failed to render page" msgstr "" "\n" "- Ø§Ù„ØµÙØ­Ø© %1: لا يمكن رسم Ø§Ù„ØµÙØ­Ø©" #: ../gtk/src/Recognizer.cc:501 ../gtk/src/Recognizer.cc:531 #: ../gtk/src/Recognizer.cc:544 ../qt/src/Recognizer.cc:491 #: ../qt/src/Recognizer.cc:521 ../qt/src/Recognizer.cc:534 msgid "Recognizing..." msgstr "جار التعر٠الضوئي.." #: ../gtk/src/Recognizer.cc:505 ../gtk/src/Recognizer.cc:514 #: ../qt/src/Recognizer.cc:495 ../qt/src/Recognizer.cc:504 msgid "Recognition errors occurred" msgstr "حدثت أخطاء ÙÙŠ التعر٠الضوئي" #: ../gtk/src/Recognizer.cc:505 ../qt/src/Recognizer.cc:495 msgid "The following errors occurred:%1" msgstr "حدثت الأخطاء التالية: %1" #: ../gtk/src/Recognizer.cc:514 ../qt/src/Recognizer.cc:504 msgid "Failed to initialize tesseract" msgstr "ÙØ´Ù„ ÙÙŠ تهيئة محرك التعر٠الضوئي tesseract" #: ../gtk/src/scanner/ScannerSane.cc:84 ../gtk/src/scanner/ScannerTwain.cc:288 #: ../qt/src/scanner/ScannerSane.cc:85 ../qt/src/scanner/ScannerTwain.cc:286 msgid "Scan canceled" msgstr "تم إلغاء المسح الضوئي" #: ../gtk/src/scanner/ScannerSane.cc:159 ../gtk/src/scanner/ScannerTwain.cc:186 #: ../qt/src/scanner/ScannerSane.cc:159 ../qt/src/scanner/ScannerTwain.cc:178 msgid "No scanner specified" msgstr "لم يتم تحديد ماسحات ضوئية" #: ../gtk/src/scanner/ScannerSane.cc:168 ../gtk/src/scanner/ScannerTwain.cc:195 #: ../qt/src/scanner/ScannerSane.cc:168 ../qt/src/scanner/ScannerTwain.cc:187 msgid "Unable to connect to scanner" msgstr "غير قادر على الاتصال بالماسح الضوئي" #: ../gtk/src/scanner/ScannerSane.cc:403 ../gtk/src/scanner/ScannerTwain.cc:266 #: ../gtk/src/scanner/ScannerTwain.cc:292 ../qt/src/scanner/ScannerSane.cc:403 #: ../qt/src/scanner/ScannerTwain.cc:258 ../qt/src/scanner/ScannerTwain.cc:290 msgid "Unable to start scan" msgstr "غير قادر على بدء عملية المسح الضوئي" #: ../gtk/src/scanner/ScannerSane.cc:411 ../gtk/src/scanner/ScannerSane.cc:461 #: ../gtk/src/scanner/ScannerTwain.cc:318 ../qt/src/scanner/ScannerSane.cc:411 #: ../qt/src/scanner/ScannerSane.cc:461 ../qt/src/scanner/ScannerTwain.cc:316 msgid "Error communicating with scanner" msgstr "حدث خطأ أثناء الاتصال بالماسح الضوئي" #: ../gtk/src/scanner/ScannerSane.cc:520 ../qt/src/scanner/ScannerSane.cc:517 msgid "Failed to save image" msgstr "خطأ أثناء Ø­ÙØ¸ الصورة" #: ../gtk/src/scanner/ScannerSane.cc:800 ../qt/src/scanner/ScannerSane.cc:797 msgid "Operation is cancelled." msgstr "تم إلغاء العملية." #: ../gtk/src/scanner/ScannerSane.cc:802 ../qt/src/scanner/ScannerSane.cc:799 msgid "Device is busy." msgstr "الجهاز مشغول." #: ../gtk/src/scanner/ScannerSane.cc:804 ../qt/src/scanner/ScannerSane.cc:801 msgid "Cover is opened." msgstr "الغطاء Ù…ÙØªÙˆØ­." #: ../gtk/src/scanner/ScannerSane.cc:806 ../qt/src/scanner/ScannerSane.cc:803 msgid "Document feeder jammed." msgstr "علبة تغذية المستندات متحشرجة." #: ../gtk/src/scanner/ScannerSane.cc:808 ../qt/src/scanner/ScannerSane.cc:805 msgid "Document feeder out of documents." msgstr "علبة تغذية المستندات ÙØ§Ø±ØºØ©." #: ../gtk/src/scanner/ScannerSane.cc:810 ../qt/src/scanner/ScannerSane.cc:807 msgid "Access to scanner is denied." msgstr "تم منع الوصول إلى الماسح الضوئي." #: ../gtk/src/SourceManager.cc:118 ../qt/src/SourceManager.cc:124 msgid "PDFs with text" msgstr "Ù…Ù„ÙØ§Øª PDF مع نص" #: ../gtk/src/SourceManager.cc:118 ../qt/src/SourceManager.cc:124 msgid "" "These PDF files already contain text:\n" "%1" msgstr "" "هذه PDF تحتوي على نصوص Ø¨Ø§Ù„ÙØ¹Ù„:\n" "%1" #: ../gtk/src/SourceManager.cc:127 ../qt/src/SourceManager.cc:132 msgid "Unable to open files" msgstr "لا يمكن ÙØªØ­ Ø§Ù„Ù…Ù„ÙØ§Øª" #: ../gtk/src/SourceManager.cc:127 ../qt/src/SourceManager.cc:132 msgid "The following files could not be opened:%1" msgstr "لا يمكن ÙØªØ­ Ø§Ù„Ù…Ù„ÙØ§Øª التالية:%1" #: ../gtk/src/SourceManager.cc:141 ../qt/src/SourceManager.cc:143 msgid "Enter password for file '%1':" msgstr "أدخل كلمة السر للمل٠'%1':" #: ../gtk/src/SourceManager.cc:197 ../qt/src/SourceManager.cc:214 msgid "Images and PDFs" msgstr "صور ÙˆÙ…Ù„ÙØ§Øª PDF" #: ../gtk/src/SourceManager.cc:202 ../qt/src/SourceManager.cc:215 msgid "Select Files" msgstr "اختر Ù…Ù„ÙØ§Øª" #: ../gtk/src/SourceManager.cc:208 ../qt/src/SourceManager.cc:226 msgid "Clipboard Error" msgstr "خطأ ÙÙŠ Ø§Ù„Ø­Ø§ÙØ¸Ø©" #: ../gtk/src/SourceManager.cc:208 ../qt/src/SourceManager.cc:226 msgid "Failed to read the clipboard." msgstr "خطأ أثناء القراءة من Ø§Ù„Ø­Ø§ÙØ¸Ø©." #: ../gtk/src/SourceManager.cc:212 ../qt/src/SourceManager.cc:230 #: ../qt/src/SourceManager.cc:236 msgid "Pasted %1" msgstr "تم لصق %1" #: ../gtk/src/SourceManager.cc:224 ../qt/src/SourceManager.cc:243 msgid "Screenshot Error" msgstr "خطأ ÙÙŠ لقطة الشاشة" #: ../gtk/src/SourceManager.cc:224 ../qt/src/SourceManager.cc:243 msgid "Failed to take screenshot." msgstr "خطأ أثناء التقاط الشاشة." #: ../gtk/src/SourceManager.cc:228 ../qt/src/SourceManager.cc:247 msgid "Screenshot %1" msgstr "لطقة شاشة %1" #: ../gtk/src/SourceManager.cc:233 ../qt/src/SourceManager.cc:252 msgid "Saving image..." msgstr "جار Ø­ÙØ¸ الصورة..." #: ../gtk/src/SourceManager.cc:240 ../qt/src/SourceManager.cc:265 msgid "Cannot Write File" msgstr "لا يمكن كتابة الملÙ" #: ../gtk/src/SourceManager.cc:240 ../qt/src/SourceManager.cc:265 msgid "Could not write to %1." msgstr "لا يمكن الكتابة ÙÙŠ %1." #: ../gtk/src/SourceManager.cc:267 ../qt/src/SourceManager.cc:287 msgid "Delete File?" msgstr "Ø­Ø°Ù Ø§Ù„Ù…Ù„ÙØŸ" #: ../gtk/src/SourceManager.cc:267 ../qt/src/SourceManager.cc:287 msgid "The following files will be deleted:%1" msgstr "هذه Ø§Ù„Ù…Ù„ÙØ§Øª سو٠يتم حذÙها:%1" #: ../gtk/src/SourceManager.cc:332 ../qt/src/SourceManager.cc:338 msgid "Missing File" msgstr "مل٠ناقص" #: ../gtk/src/SourceManager.cc:332 ../qt/src/SourceManager.cc:338 msgid "" "The following file has been deleted or moved:\n" "%1" msgstr "" "هذا المل٠تم حذÙÙ‡ أو نقله:\n" "%1" #: ../gtk/src/SubstitutionsManager.cc:33 ../qt/src/SubstitutionsManager.cc:73 msgid "Search for" msgstr "ابحث عن" #: ../gtk/src/SubstitutionsManager.cc:34 ../qt/src/SubstitutionsManager.cc:73 msgid "Replace with" msgstr "استبدل بـ" #: ../gtk/src/SubstitutionsManager.cc:69 ../gtk/src/SubstitutionsManager.cc:103 #: ../qt/src/SubstitutionsManager.cc:106 ../qt/src/SubstitutionsManager.cc:143 msgid "Substitutions List" msgstr "قائمة الاستبدالات" #: ../gtk/src/SubstitutionsManager.cc:70 ../qt/src/SubstitutionsManager.cc:106 msgid "Open Substitutions List" msgstr "ÙØªØ­ مل٠قائمة الاستبدالات" #: ../gtk/src/SubstitutionsManager.cc:75 ../qt/src/SubstitutionsManager.cc:112 msgid "Error Reading File" msgstr "خطأ أثناء قراءة الملÙ" #: ../gtk/src/SubstitutionsManager.cc:75 ../qt/src/SubstitutionsManager.cc:112 msgid "Unable to read '%1'." msgstr "لا يمكن قراءة '%1'." #: ../gtk/src/SubstitutionsManager.cc:97 ../qt/src/SubstitutionsManager.cc:137 msgid "Errors Occurred Reading File" msgstr "حدثت أخطاء أثناء قراءة الملÙ" #: ../gtk/src/SubstitutionsManager.cc:97 ../qt/src/SubstitutionsManager.cc:137 msgid "Some entries of the substitutions list could not be read." msgstr "بعض المدخلات ÙÙŠ قائمة الاستبدالات لا يمكن قراءتها." #: ../gtk/src/SubstitutionsManager.cc:104 ../qt/src/SubstitutionsManager.cc:143 msgid "Save Substitutions List" msgstr "Ø­ÙØ¸ مل٠قائمة الاستبدالات" #: ../gtk/src/SubstitutionsManager.cc:110 ../qt/src/SubstitutionsManager.cc:149 msgid "Error Saving File" msgstr "حدث خطأ أثناء Ø­ÙØ¸ الملÙ" #: ../gtk/src/SubstitutionsManager.cc:110 ../qt/src/SubstitutionsManager.cc:149 msgid "Unable to write to '%1'." msgstr "لا يمكن الكتابة ÙÙŠ '%1'." #: ../gtk/src/SubstitutionsManager.cc:127 ../qt/src/SubstitutionsManager.cc:162 msgid "Save List?" msgstr "Ø§Ø­ÙØ¸ القائمة؟" #: ../gtk/src/SubstitutionsManager.cc:127 ../qt/src/SubstitutionsManager.cc:162 msgid "Do you want to save the current list?" msgstr "هل تود Ø­ÙØ¸ القائمة الحالية؟" #: ../gtk/src/TessdataManager.cc:60 ../qt/src/TessdataManager.cc:74 #, fuzzy msgid "" "A session connection to the PackageKit backend is required for managing " "system-wide tesseract language packs, but it was not found. This service is " "usually provided by a software-management application such as Gnome " "Software. Please install software which provides the necessary PackageKit " "interface, use other system package management software to manage the " "tesseract language packs directly, or switch to using the user tessdata path " "in the configuration dialog." msgstr "يوجد أدوات ناقصة ÙÙŠ محرك التعر٠الضوئي. قم بالتأكد من الإعدادات." #: ../gtk/src/TessdataManager.cc:65 ../qt/src/TessdataManager.cc:79 msgid "Fetching available languages" msgstr "جار تغذية Ø§Ù„Ù…Ù„ÙØ§Øª الموجودة" #: ../gtk/src/TessdataManager.cc:70 ../gtk/src/TessdataManager.cc:96 #: ../gtk/src/TessdataManager.cc:197 ../qt/src/TessdataManager.cc:84 #: ../qt/src/TessdataManager.cc:101 ../qt/src/TessdataManager.cc:197 msgid "Failed to fetch list of available languages: %1" msgstr "خطأ أثناء تغذية قائمة اللغات المتاحة: %1" #: ../gtk/src/TessdataManager.cc:104 ../qt/src/TessdataManager.cc:113 #: ../qt/src/TessdataManager.cc:122 msgid "Parsing error: %1" msgstr "خطأ أثناء التمرير: %1" #: ../gtk/src/TessdataManager.cc:235 ../qt/src/TessdataManager.cc:232 msgid "Applying changes..." msgstr "جار تطبيق التغييرات..." #: ../gtk/src/TessdataManager.cc:297 ../qt/src/TessdataManager.cc:278 msgid "Failed to create directory for tessdata files." msgstr "ÙØ´Ù„ أثناء إنشاء مجلد Ù…Ù„ÙØ§Øª لغات التعر٠الضوئي tessdata." #: ../gtk/src/TessdataManager.cc:306 ../qt/src/TessdataManager.cc:287 msgid "Downloading %1..." msgstr "جار التنزيل %1..." #: ../gtk/src/TessdataManager.cc:330 msgid "" "The following files could not be downloaded or removed:\n" "%1\n" "\n" "Check the connectivity and directory permissions.\n" "\n" "Hint: If you don't have write permissions in system folders, you can switch " "to user paths in the settings dialog." msgstr "" "هذه Ø§Ù„Ù…Ù„ÙØ§Øª لا يمكن تنزيلها أو أنها أزيلت:\n" "%1\n" "تأكد من الاتصال بالشبكة وأذونات المجلد\n" "\n" "تلميح: إذا كنت لا تملك صلاحية الكتابة ÙÙŠ مجلدات النظام، يمكنك استخدام مسار " "المستخدمين ÙÙŠ الإعدادات." #: ../gtk/src/Utils.cc:64 msgid "Yes" msgstr "نعم" #: ../gtk/src/Utils.cc:67 msgid "No" msgstr "لا" #: ../gtk/src/Utils.cc:76 msgid "Discard" msgstr "تجاوز" #: ../qt/data/AboutDialog.ui.h:1 msgid "About gImageReader" msgstr "نبذة عن برنامج gImageReader" #: ../qt/data/AboutDialog.ui.h:3 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/CrashHandler.ui.h:3 msgid "" "

Tesseract has " "aborted

Tesseract (the OCR engine) has aborted while " "recognizing text. This may occur if the used traineddatas are corrupt or " "incomplatible with the version of tesseract in use, or due to a bug in " "tesseract.

The stacktrace below may provide additional information " "about where the crash occured.

" msgstr "" #: ../qt/data/MainWindow.ui.h:17 msgid "Flatbed" msgstr "مسطح" #: ../qt/data/MainWindow.ui.h:18 msgid "ADF Front" msgstr "الجهة العلوية من علبة تغذية المستندات" #: ../qt/data/MainWindow.ui.h:19 msgid "ADF Back" msgstr "الجهة السÙلية من علبة تغذية المستندات" #: ../qt/data/MainWindow.ui.h:20 msgid "ADF Duplex" msgstr "الجهتين من علبة تغذية المستندات" #. Remove & from some labels which designer insists in adding #: ../qt/data/MainWindow.ui.h:21 ../qt/src/Ui_MainWindow.hh:50 msgid "Sources" msgstr "أزل وقم بتعديل بعض المسميات التي يصر المصمم على Ø¥Ø¶Ø§ÙØªÙ‡Ø§" #: ../qt/data/MainWindow.ui.h:22 msgid "Zoom In" msgstr "تكبير" #: ../qt/data/MainWindow.ui.h:24 msgid "Zoom Out" msgstr "تصغير" #: ../qt/data/MainWindow.ui.h:26 msgid "Normal Size" msgstr "المقاس العادي" #: ../qt/data/MainWindow.ui.h:28 msgid "Best Fit" msgstr "Ø£ÙØ¶Ù„ تلاؤم" #: ../qt/data/MainWindow.ui.h:30 msgid "Rotate Left" msgstr "تدوير لليسار" #: ../qt/data/MainWindow.ui.h:31 msgid "Rotate left" msgstr "تدوير لليسار" #: ../qt/data/MainWindow.ui.h:32 msgid "Rotate Right" msgstr "تدوير لليمين" #: ../qt/data/MainWindow.ui.h:33 msgid "Rotate right" msgstr "تدوير لليمين" #: ../qt/data/MainWindow.ui.h:34 msgid "Image Controls" msgstr "أزرار التحكم بالصورة" #: ../qt/data/MainWindow.ui.h:36 msgid "Autodetect Layout" msgstr "تعر٠تلقائي لتخطيط Ø§Ù„ØµÙØ­Ø©" #: ../qt/data/MainWindow.ui.h:38 msgid "Toggle Output Pane" msgstr "تبديل شاشة المخرجات" #: ../qt/data/PdfExportDialog.ui.h:5 msgid "Backend:" msgstr "محرك كتابة PDF:" #: ../qt/data/PdfExportDialog.ui.h:8 msgid "Portrait" msgstr "بالطول" #: ../qt/data/PdfExportDialog.ui.h:9 msgid "Landscape" msgstr "بالعرض" #: ../qt/src/hocr/HOCRPdfExporter.cc:142 msgid "Failed to write to file" msgstr "خطأ أثناء كتابة الملÙ" #. Output toolbar #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:55 #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:56 msgid "Open hOCR file" msgstr "ÙØªØ­ مل٠hOCR" #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:57 #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:58 msgid "Save as hOCR text" msgstr "Ø§Ø­ÙØ¸ بصيغة hOCR" #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:79 #: ../qt/src/Ui_OutputEditorText.hh:106 msgid "Find and Replace" msgstr "بحث واستبدال" #: ../qt/src/MainWindow.cc:581 #, fuzzy msgid "" "The following dictionary files were installed:\n" "%1" msgstr "القاموس التالي غير مثبت:%1" #: ../qt/src/TessdataManager.cc:308 msgid "" "The following files could not be downloaded or removed:\n" "%1\n" "\n" "Check the connectivity and directory permissions.\n" "Hint: If you don't have write permissions in system folders, you can switch " "to user paths in the settings dialog." msgstr "" "Ø§Ù„Ù…Ù„ÙØ§Øª التالية لا يمكن تنزيلها أو أنها قد أزيلت:\n" "%1\n" "تأكد من اتصالك بالشبكة وأذونات المجلد.\n" "تلميح: إذا لم يكن لديك صلاحية على مجلدات النظام، قم بالتغيير إلى مسار " "المستخدم ÙÙŠ الإعدادات." #: ../qt/src/Ui_MainWindow.hh:51 msgid "Output" msgstr "المخرج" #: ../qt/src/Ui_MainWindow.hh:135 msgid "OCR mode:" msgstr "وضعية التعر٠الضوئي:" #: ../qt/src/Ui_MainWindow.hh:209 msgid "Remove Image" msgstr "إزالة الصورة" #: ../qt/src/Ui_MainWindow.hh:212 msgid "Delete Image" msgstr "حذ٠صورة" #: ../qt/src/Ui_MainWindow.hh:215 msgid "Clear List" msgstr "مسح القائمة" #: ../qt/src/Ui_OutputEditorText.hh:101 msgid "Strip Line Breaks" msgstr "احذ٠كسر السطور" #: ../qt/src/Ui_OutputEditorText.hh:115 msgid "Save Output" msgstr "Ø­ÙØ¸ المخرج" #: ../qt/src/Ui_OutputEditorText.hh:117 msgid "Clear Output" msgstr "مسح القائمة" #~ msgid "The application has crashed" #~ msgstr "حدث خطأ Ù…ÙØ§Ø¬Ø¦ ÙÙŠ البرنامج" #~ 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." #~ msgid "Could not read %1: %2" #~ msgstr "لا يمكن قراءة %1: %2" gImageReader-3.3.1/po/cs.po000066400000000000000000002144051351740627400154340ustar00rootroot00000000000000# 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: 2019-07-25 23:17+0200\n" "PO-Revision-Date: 2018-03-30 05:09+0000\n" "Last-Translator: Pavel Borecki \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: Weblate 2.20-dev\n" #: ../data/gimagereader.desktop.in.h:1 msgid "OCR application" msgstr "optické rozpoznávání znaků (OCR)" #: ../gtk/data/appmenu.ui.h:1 ../qt/src/Ui_MainWindow.hh:167 msgid "Redetect Languages" msgstr "Znovu zjistit přítomnost jazykových dat" #: ../gtk/data/appmenu.ui.h:2 ../qt/src/Ui_MainWindow.hh:170 msgid "Manage Languages" msgstr "Spravovat jazyková data" #: ../gtk/data/appmenu.ui.h:3 ../gtk/data/ConfigDialog.ui.h:1 #: ../qt/data/ConfigDialog.ui.h:1 ../qt/src/Ui_MainWindow.hh:173 msgid "Preferences" msgstr "PÅ™edvolby" #: ../gtk/data/appmenu.ui.h:4 ../gtk/data/ConfigDialog.ui.h:2 #: ../gtk/src/MainWindow.cc:482 ../qt/src/MainWindow.cc:481 #: ../qt/src/Ui_MainWindow.hh:178 msgid "Help" msgstr "NápovÄ›da" #: ../gtk/data/appmenu.ui.h:5 ../qt/data/AboutDialog.ui.h:2 #: ../qt/src/Ui_MainWindow.hh:181 msgid "About" msgstr "O aplikaci" #: ../gtk/data/appmenu.ui.h:6 msgid "Quit" msgstr "UkonÄit" #: ../gtk/data/ConfigDialog.ui.h:3 ../gtk/data/MainWindow.ui.h:47 #: ../gtk/data/OutputEditorHOCR.ui.h:3 ../gtk/data/PdfExportDialog.ui.h:3 #: ../gtk/src/FileDialogs.cc:152 ../gtk/src/Utils.cc:61 #: ../qt/data/ConfigDialog.ui.h:26 msgid "OK" msgstr "OK" #: ../gtk/data/ConfigDialog.ui.h:4 msgid "Output pane orientation:" msgstr "Orientace podokna s výstupním textem:" #: ../gtk/data/ConfigDialog.ui.h:5 msgid "Horizontal" msgstr "VodorovnÄ›" #: ../gtk/data/ConfigDialog.ui.h:6 msgid "Vertical" msgstr "Svisle" #: ../gtk/data/ConfigDialog.ui.h:7 ../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/ConfigDialog.ui.h:8 ../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/ConfigDialog.ui.h:9 ../qt/data/ConfigDialog.ui.h:3 msgid "Predefined language definitions:" msgstr "PÅ™edpÅ™ipravené jazykové definice:" #: ../gtk/data/ConfigDialog.ui.h:10 ../qt/data/ConfigDialog.ui.h:12 msgid "Additional language definitions:" msgstr "Další jazykové definice:" #: ../gtk/data/ConfigDialog.ui.h:11 ../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/ConfigDialog.ui.h:12 ../qt/data/ConfigDialog.ui.h:21 msgid "Prefix" msgstr "PÅ™edpona" #: ../gtk/data/ConfigDialog.ui.h:13 ../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/ConfigDialog.ui.h:14 ../qt/data/ConfigDialog.ui.h:23 msgid "ISO Code" msgstr "Kód dle ISO normy" #: ../gtk/data/ConfigDialog.ui.h:15 ../qt/data/ConfigDialog.ui.h:24 msgid "The name of the language" msgstr "Název jazyka" #: ../gtk/data/ConfigDialog.ui.h:16 ../qt/data/ConfigDialog.ui.h:25 msgid "Name" msgstr "Název" #: ../gtk/data/ConfigDialog.ui.h:17 ../gtk/data/MainWindow.ui.h:46 #: ../gtk/data/OutputEditorHOCR.ui.h:2 ../gtk/data/PdfExportDialog.ui.h:2 #: ../gtk/src/Acquirer.cc:34 ../gtk/src/FileDialogs.cc:151 #: ../gtk/src/Utils.cc:70 ../qt/data/ConfigDialog.ui.h:27 #: ../qt/data/MainWindow.ui.h:12 msgid "Cancel" msgstr "Storno" #: ../gtk/data/ConfigDialog.ui.h:18 ../qt/data/ConfigDialog.ui.h:5 msgid "Output pane font:" msgstr "Písmo textu v podoknÄ› s výstupem:" #: ../gtk/data/ConfigDialog.ui.h:19 ../qt/data/ConfigDialog.ui.h:2 msgid "Default" msgstr "Výchozí" #: ../gtk/data/ConfigDialog.ui.h:20 ../qt/data/ConfigDialog.ui.h:6 msgid "Language data locations:" msgstr "UmístÄ›ní jazykových dat:" #: ../gtk/data/ConfigDialog.ui.h:21 ../qt/data/ConfigDialog.ui.h:13 msgid "Language definitions path:" msgstr "Popis umístÄ›ní jazykových definic:" #: ../gtk/data/ConfigDialog.ui.h:22 ../qt/data/ConfigDialog.ui.h:28 msgid "Spelling dictionaries path:" msgstr "Popis umístÄ›ní slovníků pro kontrolu pÅ™eklepů:" #: ../gtk/data/ConfigDialog.ui.h:23 ../qt/data/ConfigDialog.ui.h:10 msgid "System-wide paths" msgstr "Popisy umístÄ›ní spoleÄné pro vÅ¡echny uživatele" #: ../gtk/data/ConfigDialog.ui.h:24 ../qt/data/ConfigDialog.ui.h:11 msgid "User paths" msgstr "Pro jednotlivé uživatele" #: ../gtk/data/ConfigDialog.ui.h:25 ../qt/data/ConfigDialog.ui.h:29 msgid "Automatically open exported documents with default application" msgstr "Automaticky otevřít exportované dokumenty pomocí výchozí aplikace" #: ../gtk/data/CrashHandler.ui.h:1 ../qt/src/CrashHandler.cc:38 msgid "Regenerate backtrace" msgstr "Znovu naÄíst hlášení backtrace diagnostiky" #: ../gtk/data/CrashHandler.ui.h:3 #, fuzzy, no-c-format msgid "" "The application has crashed\n" "\n" "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/CrashHandler.ui.h:6 msgid "" "Tesseract has aborted\n" "\n" "Tesseract (the OCR engine) has aborted while recognizing text. This may " "occur if the used traineddatas are corrupt or incomplatible with the version " "of tesseract in use, or due to a bug in tesseract.\n" "\n" "The stacktrace below may provide additional information about where the " "crash occured.\n" msgstr "" #: ../gtk/data/MainWindow.ui.h:1 ../qt/data/MainWindow.ui.h:39 msgid "Toggle output pane" msgstr "Zobrazit Äi skrýt podokno s výstupním textem" #: ../gtk/data/MainWindow.ui.h:2 ../qt/src/Ui_MainWindow.hh:66 msgid "Rotate current page" msgstr "OtoÄit stávající stránku" #: ../gtk/data/MainWindow.ui.h:3 ../qt/src/Ui_MainWindow.hh:67 msgid "Rotate all pages" msgstr "OtoÄit vÅ¡echny stránky" #. Sources toolbar #: ../gtk/data/MainWindow.ui.h:4 ../qt/src/Ui_MainWindow.hh:192 msgid "Recent" msgstr "Nedávno použité" #: ../gtk/data/MainWindow.ui.h:5 ../qt/src/Ui_MainWindow.hh:193 msgid "Paste" msgstr "Vložit" #: ../gtk/data/MainWindow.ui.h:6 ../qt/src/Ui_MainWindow.hh:194 msgid "Take Screenshot" msgstr "Zachytit snímek obrazovky" #: ../gtk/data/MainWindow.ui.h:7 ../qt/data/MainWindow.ui.h:23 msgid "Zoom in" msgstr "PÅ™iblížit" #: ../gtk/data/MainWindow.ui.h:8 ../qt/data/MainWindow.ui.h:25 msgid "Zoom out" msgstr "Oddálit" #: ../gtk/data/MainWindow.ui.h:9 ../qt/data/MainWindow.ui.h:27 msgid "Normal size" msgstr "Původní velikost" #: ../gtk/data/MainWindow.ui.h:10 ../qt/data/MainWindow.ui.h:29 msgid "Best fit" msgstr "PÅ™izpůsobit oknu" #: ../gtk/data/MainWindow.ui.h:11 ../qt/src/Ui_MainWindow.hh:75 msgid "Select rotation mode" msgstr "Vyberte režim otáÄení" #: ../gtk/data/MainWindow.ui.h:12 ../gtk/data/OutputEditorText.ui.h:13 #: ../qt/src/Ui_OutputEditorText.hh:95 msgid "Select insert mode" msgstr "Vyberte režim vkládání" #: ../gtk/data/MainWindow.ui.h:13 ../qt/src/Ui_MainWindow.hh:109 #, fuzzy msgid "Select page" msgstr "Vyberte jazyk" #: ../gtk/data/MainWindow.ui.h:14 ../qt/data/MainWindow.ui.h:35 msgid "Image controls" msgstr "Ovládání parametrů obrázku" #: ../gtk/data/MainWindow.ui.h:15 ../qt/src/Ui_MainWindow.hh:139 msgid "Plain text" msgstr "Holý text" #: ../gtk/data/MainWindow.ui.h:16 ../qt/src/Ui_MainWindow.hh:139 msgid "hOCR, PDF" msgstr "hOCR, PDF" #: ../gtk/data/MainWindow.ui.h:17 ../qt/data/MainWindow.ui.h:37 msgid "Autodetect layout" msgstr "Automaticky zjistit rozvržení stránky" #: ../gtk/data/MainWindow.ui.h:18 msgid "Recognize all" msgstr "Rozpoznat vÅ¡e" #: ../gtk/data/MainWindow.ui.h:19 msgid "Select language" msgstr "Vyberte jazyk" #: ../gtk/data/MainWindow.ui.h:20 ../qt/src/Ui_MainWindow.hh:205 msgid "Add images" msgstr "PÅ™idat obrázky" #: ../gtk/data/MainWindow.ui.h:21 ../qt/src/Ui_MainWindow.hh:204 msgid "Add Images" msgstr "PÅ™idat obrázky" #: ../gtk/data/MainWindow.ui.h:22 ../qt/src/Ui_MainWindow.hh:210 msgid "Remove image from list" msgstr "Odebrat obrázek ze seznamu" #: ../gtk/data/MainWindow.ui.h:23 ../qt/src/Ui_MainWindow.hh:213 msgid "Delete image" msgstr "Smazat obrázek" #: ../gtk/data/MainWindow.ui.h:24 ../qt/src/Ui_MainWindow.hh:216 msgid "Clear list" msgstr "VyÄistit seznam" #: ../gtk/data/MainWindow.ui.h:25 ../qt/data/MainWindow.ui.h:5 msgid "Files" msgstr "Soubory" #: ../gtk/data/MainWindow.ui.h:26 ../qt/data/MainWindow.ui.h:8 msgid "Device:" msgstr "Zařízení:" #: ../gtk/data/MainWindow.ui.h:27 ../gtk/data/TessdataManager.ui.h:4 #: ../qt/data/MainWindow.ui.h:7 ../qt/src/TessdataManager.cc:59 msgid "Refresh" msgstr "Znovu naÄíst" #: ../gtk/data/MainWindow.ui.h:28 ../qt/data/MainWindow.ui.h:9 msgid "Output:" msgstr "Výstup:" #: ../gtk/data/MainWindow.ui.h:29 ../qt/data/MainWindow.ui.h:13 msgid "Mode:" msgstr "Režim:" #: ../gtk/data/MainWindow.ui.h:30 ../gtk/src/hocr/HOCRPdfExporter.cc:313 #: ../qt/data/MainWindow.ui.h:15 ../qt/src/hocr/HOCRPdfExporter.cc:347 msgid "Color" msgstr "Barevný" #: ../gtk/data/MainWindow.ui.h:31 ../gtk/src/hocr/HOCRPdfExporter.cc:316 #: ../qt/data/MainWindow.ui.h:14 ../qt/src/hocr/HOCRPdfExporter.cc:349 #: ../qt/src/hocr/HOCRPdfExporter.cc:351 msgid "Grayscale" msgstr "StupnÄ› Å¡edé" #: ../gtk/data/MainWindow.ui.h:32 ../qt/data/MainWindow.ui.h:10 msgid "Resolution:" msgstr "RozliÅ¡ení:" #: ../gtk/data/MainWindow.ui.h:33 ../qt/data/MainWindow.ui.h:11 msgid "Scan" msgstr "Skenovat" #: ../gtk/data/MainWindow.ui.h:34 ../qt/data/MainWindow.ui.h:16 msgid "Source:" msgstr "Zdroj:" #: ../gtk/data/MainWindow.ui.h:35 ../qt/data/MainWindow.ui.h:6 msgid "Acquire" msgstr "Získat" #: ../gtk/data/MainWindow.ui.h:36 ../qt/data/MainWindow.ui.h:1 msgid "Brightness" msgstr "SvÄ›tlost" #: ../gtk/data/MainWindow.ui.h:37 ../qt/data/MainWindow.ui.h:2 msgid "Contrast" msgstr "Kontrast" #: ../gtk/data/MainWindow.ui.h:38 ../qt/data/MainWindow.ui.h:3 msgid "Resolution" msgstr "RozliÅ¡ení" #: ../gtk/data/MainWindow.ui.h:39 ../qt/data/MainWindow.ui.h:4 msgid "Invert colors" msgstr "PÅ™evrátit barvy" #: ../gtk/data/MainWindow.ui.h:40 msgid "A graphical frontend to tesseract-ocr" msgstr "Grafická nadstavba pro engine tesseract-ocr" #: ../gtk/data/MainWindow.ui.h:41 ../qt/data/CharacterListDialog.ui.h:1 msgid "Character whitelist / blacklist" msgstr "" #: ../gtk/data/MainWindow.ui.h:42 ../qt/data/CharacterListDialog.ui.h:2 msgid "Exclude these characters from being recognized (blacklist):" msgstr "" #: ../gtk/data/MainWindow.ui.h:43 ../qt/data/CharacterListDialog.ui.h:3 #, fuzzy msgid "Enter a string of characters..." msgstr "Získávání parametrů…" #: ../gtk/data/MainWindow.ui.h:44 ../qt/data/CharacterListDialog.ui.h:4 msgid "Only allow the following characters to be recognized (whitelist):" msgstr "" #: ../gtk/data/MainWindow.ui.h:45 ../qt/data/PageRangeDialog.ui.h:1 msgid "Page Range" msgstr "Strany" #: ../gtk/data/MainWindow.ui.h:48 ../qt/data/PageRangeDialog.ui.h:2 msgid "Page range:" msgstr "Strany:" #: ../gtk/data/MainWindow.ui.h:49 ../qt/data/PageRangeDialog.ui.h:3 msgid "Example: 1-10, 13, 14-18" msgstr "Příklad: 1-10, 13, 14-18" #: ../gtk/data/MainWindow.ui.h:50 ../qt/data/PageRangeDialog.ui.h:4 msgid "Recognition area:" msgstr "Oblast k rozpoznání:" #: ../gtk/data/MainWindow.ui.h:51 ../gtk/src/Recognizer.cc:375 #: ../qt/data/PageRangeDialog.ui.h:5 ../qt/src/Recognizer.cc:369 msgid "Entire page" msgstr "Celá strana" #: ../gtk/data/MainWindow.ui.h:52 ../qt/data/PageRangeDialog.ui.h:6 msgid "Autodetect" msgstr "Automaticky" #: ../gtk/data/MainWindow.ui.h:53 ../qt/data/PageRangeDialog.ui.h:7 msgid "Prepend to output text:" msgstr "PÅ™idat pÅ™ed výstupní text:" #: ../gtk/data/MainWindow.ui.h:54 ../qt/data/PageRangeDialog.ui.h:8 msgid "Source filename" msgstr "Název zdrojového souboru" #: ../gtk/data/MainWindow.ui.h:55 ../qt/data/PageRangeDialog.ui.h:9 msgid "Source page" msgstr "Zdrojová stránka" #: ../gtk/data/MainWindow.ui.h:56 ../qt/src/SourceManager.cc:146 msgid "Protected PDF" msgstr "ChránÄ›né PDF" #: ../gtk/data/MainWindow.ui.h:57 ../qt/src/Recognizer.cc:76 msgid "Current Page" msgstr "Stávající strana" #: ../gtk/data/MainWindow.ui.h:58 ../qt/src/Recognizer.cc:79 msgid "Multiple Pages..." msgstr "Vícero stránek…" #: ../gtk/data/OutputEditorHOCR.ui.h:1 ../qt/src/hocr/OutputEditorHOCR.cc:580 msgid "Add Word" msgstr "PÅ™idat slovo" #: ../gtk/data/OutputEditorHOCR.ui.h:4 ../qt/src/hocr/OutputEditorHOCR.cc:580 msgid "Enter word:" msgstr "Zadejte slovo:" #: ../gtk/data/OutputEditorHOCR.ui.h:5 ../qt/src/hocr/Ui_OutputEditorHOCR.hh:61 #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:62 msgid "Export to plain text" msgstr "Exportovat do holého textu" #: ../gtk/data/OutputEditorHOCR.ui.h:6 ../qt/src/hocr/Ui_OutputEditorHOCR.hh:64 #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:65 msgid "Export to PDF" msgstr "Exportovat do PDF" #: ../gtk/data/OutputEditorHOCR.ui.h:7 ../qt/src/hocr/Ui_OutputEditorHOCR.hh:67 #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:68 msgid "Export to ODT" msgstr "Exportovat do ODT" #: ../gtk/data/OutputEditorHOCR.ui.h:8 ../gtk/data/OutputEditorText.ui.h:18 #: ../qt/src/Ui_OutputEditorText.hh:116 msgid "Save output" msgstr "Uložit výstup" #: ../gtk/data/OutputEditorHOCR.ui.h:9 ../qt/src/hocr/Ui_OutputEditorHOCR.hh:72 #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:73 msgid "Export" msgstr "Export" #: ../gtk/data/OutputEditorHOCR.ui.h:10 ../gtk/data/OutputEditorText.ui.h:19 #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:77 #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:78 #: ../qt/src/Ui_OutputEditorText.hh:118 msgid "Clear output" msgstr "VyÄistit výstup" #: ../gtk/data/OutputEditorHOCR.ui.h:11 ../gtk/data/OutputEditorText.ui.h:15 #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:80 #: ../qt/src/Ui_OutputEditorText.hh:107 msgid "Find and replace" msgstr "Najít a nahradit" #: ../gtk/data/OutputEditorHOCR.ui.h:12 #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:82 #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:83 msgid "Show confidence values" msgstr "Zobrazit hodnoty jistoty" #: ../gtk/data/OutputEditorHOCR.ui.h:13 ../gtk/data/PdfExportDialog.ui.h:41 #: ../qt/data/PdfExportDialog.ui.h:2 ../qt/src/hocr/Ui_OutputEditorHOCR.hh:85 #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:86 msgid "Show preview" msgstr "Zobrazit náhled" #: ../gtk/data/OutputEditorHOCR.ui.h:14 #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:121 msgid "Next (F3)" msgstr "Následující (F3)" #: ../gtk/data/OutputEditorHOCR.ui.h:15 #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:122 msgid "Previous (Shift+F3)" msgstr "PÅ™edchozí (Shift+F3)" #: ../gtk/data/OutputEditorHOCR.ui.h:16 ../gtk/src/hocr/OutputEditorHOCR.cc:890 #: ../qt/src/hocr/OutputEditorHOCR.cc:730 #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:126 msgid "Expand all" msgstr "Rozbalit vÅ¡e" #: ../gtk/data/OutputEditorHOCR.ui.h:17 ../gtk/src/hocr/OutputEditorHOCR.cc:893 #: ../qt/src/hocr/OutputEditorHOCR.cc:731 #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:127 msgid "Collapse all" msgstr "Sbalit vÅ¡e" #: ../gtk/data/OutputEditorHOCR.ui.h:18 #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:148 msgid "Properties" msgstr "Vlastnosti" #: ../gtk/data/OutputEditorHOCR.ui.h:19 #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:152 msgid "Source" msgstr "Zdroj" #. Output insert mode #: ../gtk/data/OutputEditorText.ui.h:1 ../qt/src/Ui_OutputEditorText.hh:52 msgid "Append to current text" msgstr "PÅ™ipojit za stávající text" #: ../gtk/data/OutputEditorText.ui.h:2 ../qt/src/Ui_OutputEditorText.hh:53 msgid "Insert at cursor" msgstr "Vložit na pozici kurzoru" #: ../gtk/data/OutputEditorText.ui.h:3 ../qt/src/Ui_OutputEditorText.hh:54 msgid "Replace current text" msgstr "Nahradit stávající text" #. Output postprocessing #: ../gtk/data/OutputEditorText.ui.h:4 ../qt/src/Ui_OutputEditorText.hh:62 msgid "Keep line break if..." msgstr "Ponechat zalomení řádku pokud…" #: ../gtk/data/OutputEditorText.ui.h:5 ../qt/src/Ui_OutputEditorText.hh:64 msgid "Preceded by end mark (.?!)" msgstr "Následuje po znaÄce konce vÄ›ty (.?!)" #: ../gtk/data/OutputEditorText.ui.h:6 ../qt/src/Ui_OutputEditorText.hh:66 msgid "Preceded or succeeded by quote" msgstr "Následuje po nebo pÅ™edchází pÅ™ed uvozovkou" #: ../gtk/data/OutputEditorText.ui.h:7 ../qt/src/Ui_OutputEditorText.hh:68 msgid "Other options" msgstr "Další možnosti" #: ../gtk/data/OutputEditorText.ui.h:8 ../qt/src/Ui_OutputEditorText.hh:70 msgid "Join hyphenated words" msgstr "Spojit rozdÄ›lená slova" #: ../gtk/data/OutputEditorText.ui.h:9 ../qt/src/Ui_OutputEditorText.hh:72 msgid "Collapse whitespace" msgstr "Odstranit prázdné místo" #: ../gtk/data/OutputEditorText.ui.h:10 ../qt/src/Ui_OutputEditorText.hh:74 msgid "Preserve paragraphs" msgstr "Zachovat odstavce" #: ../gtk/data/OutputEditorText.ui.h:11 ../qt/src/Ui_OutputEditorText.hh:76 msgid "Visual aids" msgstr "Vizuální pomůcky" #: ../gtk/data/OutputEditorText.ui.h:12 ../qt/src/Ui_OutputEditorText.hh:78 msgid "Draw whitespace" msgstr "Zvýraznit prázdné znaky" #: ../gtk/data/OutputEditorText.ui.h:14 ../qt/src/Ui_OutputEditorText.hh:102 msgid "Strip line breaks on selected text" msgstr "Z oznaÄeného textu odebrat zalomení řádků" #: ../gtk/data/OutputEditorText.ui.h:16 ../qt/src/Ui_OutputEditorText.hh:109 #: ../qt/src/Ui_OutputEditorText.hh:110 msgid "Undo" msgstr "ZpÄ›t" #: ../gtk/data/OutputEditorText.ui.h:17 ../qt/src/Ui_OutputEditorText.hh:112 #: ../qt/src/Ui_OutputEditorText.hh:113 msgid "Redo" msgstr "Znovu" #: ../gtk/data/PdfExportDialog.ui.h:1 ../qt/data/PdfExportDialog.ui.h:1 msgid "PDF Export" msgstr "Export do PDF" #: ../gtk/data/PdfExportDialog.ui.h:4 ../qt/data/PdfExportDialog.ui.h:4 msgid "Output mode:" msgstr "Výstupní režim:" #: ../gtk/data/PdfExportDialog.ui.h:5 ../qt/data/PdfExportDialog.ui.h:6 msgid "PDF" msgstr "PDF" #: ../gtk/data/PdfExportDialog.ui.h:6 ../qt/data/PdfExportDialog.ui.h:7 msgid "PDF with invisible text overlay" msgstr "PDF s neviditelnou textovou vrstvou" #: ../gtk/data/PdfExportDialog.ui.h:7 ../qt/data/PdfExportDialog.ui.h:16 msgid "Format:" msgstr "Formát:" #: ../gtk/data/PdfExportDialog.ui.h:8 ../qt/data/PdfExportDialog.ui.h:17 msgid "Compression:" msgstr "Komprese:" #: ../gtk/data/PdfExportDialog.ui.h:9 ../qt/data/PdfExportDialog.ui.h:14 msgid "Compression quality:" msgstr "Stupeň komprese:" #: ../gtk/data/PdfExportDialog.ui.h:10 ../qt/data/PdfExportDialog.ui.h:15 msgid "DPI:" msgstr "Bodů na palec (DPI):" #: ../gtk/data/PdfExportDialog.ui.h:11 ../qt/data/PdfExportDialog.ui.h:18 msgid "Dithering algorithm:" msgstr "Rozmývací algoritmus:" #: ../gtk/data/PdfExportDialog.ui.h:12 ../qt/data/PdfExportDialog.ui.h:13 msgid "Image settings:" msgstr "Nastavení obrázku:" #: ../gtk/data/PdfExportDialog.ui.h:13 ../qt/data/PdfExportDialog.ui.h:25 msgid "Uniformize line and word spacing" msgstr "Sjednotit velikost rozestupů řádků a slov" #: ../gtk/data/PdfExportDialog.ui.h:14 ../qt/data/PdfExportDialog.ui.h:21 msgid "Override font family:" msgstr "PÅ™epsat skupinu písem:" #: ../gtk/data/PdfExportDialog.ui.h:15 ../qt/data/PdfExportDialog.ui.h:27 msgid "Fallback font family:" msgstr "Náhradní skupina písem:" #: ../gtk/data/PdfExportDialog.ui.h:16 ../qt/data/PdfExportDialog.ui.h:20 msgid "Override font size:" msgstr "PÅ™epsat velikost písma:" #: ../gtk/data/PdfExportDialog.ui.h:17 ../qt/data/PdfExportDialog.ui.h:23 msgid "Font scaling:" msgstr "Měřítko písma:" #: ../gtk/data/PdfExportDialog.ui.h:18 ../qt/data/PdfExportDialog.ui.h:26 msgid "pt" msgstr "bodů" #: ../gtk/data/PdfExportDialog.ui.h:19 ../qt/data/PdfExportDialog.ui.h:22 msgid "Preserve spaces wider than:" msgstr "Zachovat mezery Å¡irší než:" #: ../gtk/data/PdfExportDialog.ui.h:20 ../qt/data/PdfExportDialog.ui.h:24 msgid "characters" msgstr "znaky" #: ../gtk/data/PdfExportDialog.ui.h:21 ../qt/data/PdfExportDialog.ui.h:28 msgid "Sanitize hyphens before line breaks" msgstr "" #: ../gtk/data/PdfExportDialog.ui.h:22 ../qt/data/PdfExportDialog.ui.h:19 msgid "Text settings:" msgstr "Nastavení textu:" #: ../gtk/data/PdfExportDialog.ui.h:23 ../qt/data/PdfExportDialog.ui.h:10 msgid "Paper size:" msgstr "Velikost papíru:" #: ../gtk/data/PdfExportDialog.ui.h:24 ../qt/data/PdfExportDialog.ui.h:11 msgid "Width" msgstr "Šířka" #: ../gtk/data/PdfExportDialog.ui.h:25 ../qt/data/PdfExportDialog.ui.h:12 msgid "Height" msgstr "Výška" #: ../gtk/data/PdfExportDialog.ui.h:26 ../qt/data/PdfExportDialog.ui.h:29 msgid "Treat image sources as having true DPI:" msgstr "" #: ../gtk/data/PdfExportDialog.ui.h:27 ../qt/data/PdfExportDialog.ui.h:3 msgid "Basic" msgstr "Základní" #: ../gtk/data/PdfExportDialog.ui.h:28 ../qt/data/PdfExportDialog.ui.h:31 msgid "PDF version:" msgstr "Verze PDF:" #: ../gtk/data/PdfExportDialog.ui.h:29 ../qt/data/PdfExportDialog.ui.h:33 msgid "Password:" msgstr "Heslo:" #: ../gtk/data/PdfExportDialog.ui.h:30 ../qt/data/PdfExportDialog.ui.h:34 msgid "Confirm password:" msgstr "Potvrzení hesla:" #: ../gtk/data/PdfExportDialog.ui.h:31 ../qt/data/PdfExportDialog.ui.h:32 msgid "Encryption (optional):" msgstr "Å ifrování (volitelné):" #: ../gtk/data/PdfExportDialog.ui.h:32 ../qt/data/PdfExportDialog.ui.h:36 msgid "Author:" msgstr "Autor:" #: ../gtk/data/PdfExportDialog.ui.h:33 ../qt/data/PdfExportDialog.ui.h:38 msgid "Title:" msgstr "Titul:" #: ../gtk/data/PdfExportDialog.ui.h:34 ../qt/data/PdfExportDialog.ui.h:40 msgid "Subject:" msgstr "PÅ™edmÄ›t:" #: ../gtk/data/PdfExportDialog.ui.h:35 ../qt/data/PdfExportDialog.ui.h:37 msgid "Creator:" msgstr "Tvůrce:" #: ../gtk/data/PdfExportDialog.ui.h:36 ../qt/data/PdfExportDialog.ui.h:39 msgid "Producer:" msgstr "Producent:" #: ../gtk/data/PdfExportDialog.ui.h:37 ../qt/data/PdfExportDialog.ui.h:41 msgid "Keywords:" msgstr "KlíÄová slova:" #: ../gtk/data/PdfExportDialog.ui.h:38 ../qt/data/PdfExportDialog.ui.h:35 msgid "Additional information (optional):" msgstr "Další informace (volitelné):" #: ../gtk/data/PdfExportDialog.ui.h:39 ../qt/data/PdfExportDialog.ui.h:42 msgid "Import from current source" msgstr "Importovat ze stávajícího zdroje" #: ../gtk/data/PdfExportDialog.ui.h:40 ../qt/data/PdfExportDialog.ui.h:30 msgid "Advanced" msgstr "PokroÄilé" #: ../gtk/data/SearchReplaceFrame.ui.h:1 ../qt/data/SearchReplaceFrame.ui.h:4 msgid "Find" msgstr "Najít" #: ../gtk/data/SearchReplaceFrame.ui.h:2 ../qt/data/SearchReplaceFrame.ui.h:2 msgid "Replace" msgstr "Nahradit" #: ../gtk/data/SearchReplaceFrame.ui.h:3 ../qt/data/SearchReplaceFrame.ui.h:3 msgid "Replace all" msgstr "Nahradit vÅ¡e" #: ../gtk/data/SearchReplaceFrame.ui.h:4 ../qt/data/SearchReplaceFrame.ui.h:5 msgid "Find previous" msgstr "Najít pÅ™edchozí výskyt" #: ../gtk/data/SearchReplaceFrame.ui.h:5 ../qt/data/SearchReplaceFrame.ui.h:6 msgid "Find next" msgstr "Najít následující výskyt" #: ../gtk/data/SearchReplaceFrame.ui.h:6 ../qt/data/SearchReplaceFrame.ui.h:7 msgid "Match case" msgstr "RozliÅ¡ovat malá/velká písmena" #: ../gtk/data/SearchReplaceFrame.ui.h:7 #: ../gtk/data/SubstitutionsManager.ui.h:1 ../qt/data/SearchReplaceFrame.ui.h:1 #: ../qt/src/SubstitutionsManager.cc:36 msgid "Substitutions" msgstr "Dosazování" #: ../gtk/data/SelectionMenu.ui.h:1 ../qt/src/DisplayerToolSelect.cc:239 msgid "Delete" msgstr "Smazat" #: ../gtk/data/SelectionMenu.ui.h:2 ../qt/src/DisplayerToolSelect.cc:225 msgid "Order:" msgstr "PoÅ™adí:" #: ../gtk/data/SelectionMenu.ui.h:3 ../gtk/src/hocr/DisplayerToolHOCR.cc:29 #: ../qt/src/DisplayerToolSelect.cc:240 ../qt/src/hocr/DisplayerToolHOCR.cc:31 msgid "Recognize" msgstr "Rozpoznat" #: ../gtk/data/SelectionMenu.ui.h:4 ../qt/src/DisplayerToolSelect.cc:241 msgid "Recognize to clipboard" msgstr "Rozpoznat do schránky" #: ../gtk/data/SelectionMenu.ui.h:5 ../qt/src/DisplayerToolSelect.cc:242 msgid "Save as image" msgstr "Uložit jako obrázek" #: ../gtk/data/SubstitutionsManager.ui.h:2 ../qt/src/SubstitutionsManager.cc:38 #: ../qt/src/SubstitutionsManager.cc:39 msgid "Open" msgstr "Otevřít" #: ../gtk/data/SubstitutionsManager.ui.h:3 ../gtk/src/Utils.cc:73 #: ../qt/src/SubstitutionsManager.cc:41 ../qt/src/SubstitutionsManager.cc:42 msgid "Save" msgstr "Uložit" #: ../gtk/data/SubstitutionsManager.ui.h:4 ../qt/src/SubstitutionsManager.cc:44 #: ../qt/src/SubstitutionsManager.cc:45 msgid "Clear" msgstr "VyÄistit" #: ../gtk/data/SubstitutionsManager.ui.h:5 ../qt/data/ConfigDialog.ui.h:16 #: ../qt/src/SubstitutionsManager.cc:47 ../qt/src/SubstitutionsManager.cc:48 msgid "Add" msgstr "PÅ™idat" #: ../gtk/data/SubstitutionsManager.ui.h:6 #: ../gtk/src/hocr/OutputEditorHOCR.cc:886 ../qt/data/ConfigDialog.ui.h:17 #: ../qt/src/hocr/OutputEditorHOCR.cc:727 ../qt/src/SubstitutionsManager.cc:50 #: ../qt/src/SubstitutionsManager.cc:51 msgid "Remove" msgstr "Odebrat" #: ../gtk/data/SubstitutionsManager.ui.h:7 ../gtk/data/TessdataManager.ui.h:2 msgid "Apply" msgstr "Použít" #: ../gtk/data/SubstitutionsManager.ui.h:8 ../gtk/data/TessdataManager.ui.h:3 msgid "Close" msgstr "Zavřít" #: ../gtk/data/TessdataManager.ui.h:1 ../qt/src/TessdataManager.cc:49 msgid "Tessdata Manager" msgstr "Správa dat engine Tesseract" #: ../gtk/data/TessdataManager.ui.h:5 ../qt/src/TessdataManager.cc:51 msgid "Manage installed languages:" msgstr "Spravovat nainstalovaná jazyková data:" #: ../gtk/src/Acquirer.cc:79 ../qt/src/Acquirer.cc:70 msgid "scan.png" msgstr "sken.png" #: ../gtk/src/Acquirer.cc:91 ../qt/src/Acquirer.cc:85 msgid "Images" msgstr "Obrázky" #: ../gtk/src/Acquirer.cc:92 ../qt/src/Acquirer.cc:86 msgid "Choose Output Filename..." msgstr "Zvolte název souboru pro uložení výstupu…" #: ../gtk/src/Acquirer.cc:106 ../qt/src/Acquirer.cc:100 msgid "Failed to initialize the scanning backend." msgstr "NepodaÅ™ilo se inicializovat podpůrnou vrstvu (backend) pro skenování." #: ../gtk/src/Acquirer.cc:115 ../qt/src/Acquirer.cc:106 msgid "Scan failed" msgstr "Skenování se nezdaÅ™ilo" #: ../gtk/src/Acquirer.cc:133 ../qt/src/Acquirer.cc:122 msgid "No scanners were detected." msgstr "Nebyly nalezeny žádné skenery." #: ../gtk/src/Acquirer.cc:150 ../gtk/src/Acquirer.cc:168 #: ../qt/src/Acquirer.cc:136 ../qt/src/Acquirer.cc:154 msgid "Starting scan..." msgstr "Zahajování skenování…" #: ../gtk/src/Acquirer.cc:164 ../qt/src/Acquirer.cc:150 msgid "Opening device..." msgstr "Navazování komunikace se skenerem…" #: ../gtk/src/Acquirer.cc:166 ../qt/src/Acquirer.cc:152 msgid "Setting options..." msgstr "Nastavování pÅ™edvoleb…" #: ../gtk/src/Acquirer.cc:170 ../qt/src/Acquirer.cc:156 msgid "Getting parameters..." msgstr "Získávání parametrů…" #: ../gtk/src/Acquirer.cc:172 ../qt/src/Acquirer.cc:158 msgid "Transferring data..." msgstr "PÅ™enášení dat…" #: ../gtk/src/Acquirer.cc:179 ../qt/src/Acquirer.cc:165 msgid "Canceling scan..." msgstr "RuÅ¡ení skenování…" #: ../gtk/src/Config.cc:49 ../qt/data/ConfigDialog.ui.h:7 msgid "Filename prefix" msgstr "PÅ™edpona názvu souboru" #: ../gtk/src/Config.cc:50 ../qt/data/ConfigDialog.ui.h:8 msgid "Code" msgstr "Kód" #: ../gtk/src/Config.cc:51 ../qt/data/ConfigDialog.ui.h:9 msgid "Native name" msgstr "Název v daném jazyce" #: ../gtk/src/Config.cc:109 ../qt/src/Config.cc:108 msgid "Script" msgstr "Skript" #: ../gtk/src/CrashHandler.cc:25 ../gtk/src/CrashHandler.cc:41 #: ../qt/src/CrashHandler.cc:36 msgid "Crash Handler" msgstr "OÅ¡etÅ™ení pádu aplikace" #: ../gtk/src/CrashHandler.cc:43 ../qt/src/CrashHandler.cc:31 msgid "Your work has been saved under %1." msgstr "Zpracovávané bylo uloženo do %1." #: ../gtk/src/CrashHandler.cc:45 ../qt/src/CrashHandler.cc:33 msgid "There was no unsaved work." msgstr "Od minulého uložení nepÅ™ibylo nic nového." #: ../gtk/src/CrashHandler.cc:106 ../qt/src/CrashHandler.cc:62 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:232 ../qt/src/Displayer.cc:174 msgid "Failed to load image" msgstr "Obrázek se nepodaÅ™ilo naÄíst" #: ../gtk/src/Displayer.cc:232 ../qt/src/Displayer.cc:174 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:138 ../qt/src/DisplayerToolSelect.cc:135 msgid "PNG Images" msgstr "PNG obrázky" #: ../gtk/src/DisplayerToolSelect.cc:139 ../qt/src/DisplayerToolSelect.cc:135 msgid "Save Selection Image" msgstr "Uložit obrázek výbÄ›ru" #: ../gtk/src/DisplayerToolSelect.cc:139 ../qt/src/DisplayerToolSelect.cc:135 msgid "selection.png" msgstr "vyber.png" #: ../gtk/src/DisplayerToolSelect.cc:146 ../qt/src/DisplayerToolSelect.cc:142 msgid "Recognize all" msgstr "Rozpoznat vÅ¡e" #: ../gtk/src/DisplayerToolSelect.cc:146 ../qt/src/DisplayerToolSelect.cc:142 msgid "Recognize selection" msgstr "Rozpoznat výbÄ›r" #: ../gtk/src/DisplayerToolSelect.cc:186 ../qt/src/DisplayerToolSelect.cc:182 msgid "Performing layout analysis" msgstr "Analyzuje se rozvržení stránky" #: ../gtk/src/FileDialogs.cc:235 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:237 msgid "Overwrite File?" msgstr "PÅ™epsat soubor?" #: ../gtk/src/hocr/HOCRDocument.cc:611 ../gtk/src/hocr/OutputEditorHOCR.cc:266 #: ../qt/src/hocr/OutputEditorHOCR.cc:229 msgid "Page" msgstr "Strana" #: ../gtk/src/hocr/HOCRDocument.cc:613 ../qt/src/hocr/HOCRDocument.cc:530 msgid "Text block" msgstr "Blok textu" #: ../gtk/src/hocr/HOCRDocument.cc:615 ../gtk/src/hocr/OutputEditorHOCR.cc:272 #: ../qt/src/hocr/HOCRDocument.cc:532 ../qt/src/hocr/OutputEditorHOCR.cc:231 msgid "Paragraph" msgstr "Odstavec" #: ../gtk/src/hocr/HOCRDocument.cc:617 ../qt/src/hocr/HOCRDocument.cc:534 msgid "Textline" msgstr "Řádek textu" #: ../gtk/src/hocr/HOCRDocument.cc:621 ../qt/src/hocr/HOCRDocument.cc:538 msgid "Graphic" msgstr "Grafika" #: ../gtk/src/hocr/HOCROdtExporter.cc:65 ../gtk/src/hocr/HOCRPdfExporter.cc:489 #: ../gtk/src/hocr/HOCRTextExporter.cc:34 #: ../gtk/src/hocr/OutputEditorHOCR.cc:963 ../gtk/src/OutputEditorText.cc:272 #: ../qt/src/hocr/HOCROdtExporter.cc:50 ../qt/src/hocr/HOCRPdfExporter.cc:478 #: ../qt/src/hocr/HOCRTextExporter.cc:36 ../qt/src/hocr/OutputEditorHOCR.cc:830 #: ../qt/src/OutputEditorText.cc:238 msgid "output" msgstr "výstup" #: ../gtk/src/hocr/HOCROdtExporter.cc:68 ../qt/src/hocr/HOCROdtExporter.cc:53 msgid "OpenDocument Text Documents" msgstr "Textové dokumenty OpenDocument" #: ../gtk/src/hocr/HOCROdtExporter.cc:69 ../qt/src/hocr/HOCROdtExporter.cc:53 msgid "Save ODT Output..." msgstr "Uložit výstup do formátu ODT…" #: ../gtk/src/hocr/HOCROdtExporter.cc:77 ../gtk/src/hocr/HOCROdtExporter.cc:342 #: ../gtk/src/hocr/HOCRPdfExporter.cc:619 #: ../gtk/src/hocr/HOCRTextExporter.cc:46 ../qt/src/hocr/HOCROdtExporter.cc:61 #: ../qt/src/hocr/HOCRPdfExporter.cc:609 ../qt/src/hocr/HOCRTextExporter.cc:47 msgid "Export failed" msgstr "Export se nezdaÅ™il" #: ../gtk/src/hocr/HOCROdtExporter.cc:77 ../gtk/src/hocr/HOCROdtExporter.cc:342 #: ../qt/src/hocr/HOCROdtExporter.cc:61 msgid "The ODT export failed: unable to write output file." msgstr "Export do ODT se nezdaÅ™il: nepodaÅ™ilo se zapsat soubor s výstupem." #: ../gtk/src/hocr/HOCROdtExporter.cc:336 ../qt/src/hocr/HOCROdtExporter.cc:254 msgid "Exporting to ODT..." msgstr "Export do ODT…" #: ../gtk/src/hocr/HOCRPdfExporter.cc:283 ../qt/src/hocr/HOCRPdfExporter.cc:365 msgid "Same as source" msgstr "Stejné jako zdroj" #: ../gtk/src/hocr/HOCRPdfExporter.cc:286 ../qt/src/hocr/HOCRPdfExporter.cc:366 msgid "Custom" msgstr "Uživatelem urÄené" #: ../gtk/src/hocr/HOCRPdfExporter.cc:300 ../qt/src/hocr/HOCRPdfExporter.cc:362 msgid "cm" msgstr "cm" #: ../gtk/src/hocr/HOCRPdfExporter.cc:303 ../qt/src/hocr/HOCRPdfExporter.cc:363 msgid "in" msgstr "palce" #: ../gtk/src/hocr/HOCRPdfExporter.cc:319 ../qt/src/hocr/HOCRPdfExporter.cc:353 msgid "Monochrome" msgstr "Monochromatické" #: ../gtk/src/hocr/HOCRPdfExporter.cc:328 ../qt/src/hocr/HOCRPdfExporter.cc:355 msgid "Threshold (closest color)" msgstr "Práh (nejbližší barva)" #: ../gtk/src/hocr/HOCRPdfExporter.cc:331 ../qt/src/hocr/HOCRPdfExporter.cc:356 msgid "Diffuse" msgstr "Rozptýlit" #: ../gtk/src/hocr/HOCRPdfExporter.cc:340 ../qt/src/hocr/HOCRPdfExporter.cc:357 msgid "Zip (lossless)" msgstr "Zip (bezztrátové)" #: ../gtk/src/hocr/HOCRPdfExporter.cc:344 ../qt/src/hocr/HOCRPdfExporter.cc:358 msgid "CCITT Group 4 (lossless)" msgstr "CCITT Group 4 (bezztrátové)" #: ../gtk/src/hocr/HOCRPdfExporter.cc:348 ../qt/src/hocr/HOCRPdfExporter.cc:359 msgid "Jpeg (lossy)" msgstr "Jpeg (ztrátové)" #: ../gtk/src/hocr/HOCRPdfExporter.cc:493 ../qt/src/hocr/HOCRPdfExporter.cc:482 msgid "PDF Files" msgstr "PDF soubory" #: ../gtk/src/hocr/HOCRPdfExporter.cc:494 ../qt/src/hocr/HOCRPdfExporter.cc:482 msgid "Save PDF Output..." msgstr "Uložit výstup do formátu PDF…" #: ../gtk/src/hocr/HOCRPdfExporter.cc:500 ../qt/src/hocr/HOCRPdfExporter.cc:488 msgid "Invalid Output" msgstr "Neplatný výstup" #: ../gtk/src/hocr/HOCRPdfExporter.cc:500 ../qt/src/hocr/HOCRPdfExporter.cc:488 msgid "Cannot overwrite a file which is a source image of this document." msgstr "" "Není možné pÅ™epsat soubor který je zdrojovým obrázkem pro tento dokument." #: ../gtk/src/hocr/HOCRPdfExporter.cc:516 ../qt/src/hocr/HOCRPdfExporter.cc:511 msgid "Failed to create output" msgstr "VytvoÅ™ení výstupu se nezdaÅ™ilo" #: ../gtk/src/hocr/HOCRPdfExporter.cc:516 ../qt/src/hocr/HOCRPdfExporter.cc:511 msgid "Failed to create output. The returned error was: %1" msgstr "VytvoÅ™ení výstupu se nezdaÅ™ilo. Byla vrácena chyba: %1" #: ../gtk/src/hocr/HOCRPdfExporter.cc:558 ../qt/src/hocr/HOCRPdfExporter.cc:551 msgid "The operation was cancelled" msgstr "Operace byla zruÅ¡ena" #: ../gtk/src/hocr/HOCRPdfExporter.cc:607 ../qt/src/hocr/HOCRPdfExporter.cc:597 msgid "Failed to render page %1" msgstr "NepodaÅ™ilo se vykreslit stránku %1" #: ../gtk/src/hocr/HOCRPdfExporter.cc:614 ../qt/src/hocr/HOCRPdfExporter.cc:604 msgid "Exporting to PDF..." msgstr "Export do PDF…" #: ../gtk/src/hocr/HOCRPdfExporter.cc:619 ../qt/src/hocr/HOCRPdfExporter.cc:609 msgid "The PDF export failed: %1." msgstr "Export do PDF se nezdaÅ™il: %1." #: ../gtk/src/hocr/HOCRPdfExporter.cc:673 ../qt/src/hocr/HOCRPdfExporter.cc:662 msgid "The PDF library could not load the font '%1'." msgstr "" "(softwarové) knihovnÄ› funkcí pro práci s formátem PDF se nepodaÅ™ilo naÄíst " "písmo „%1“." #: ../gtk/src/hocr/HOCRTextExporter.cc:37 ../gtk/src/OutputEditorText.cc:274 #: ../qt/src/hocr/HOCRTextExporter.cc:39 ../qt/src/OutputEditorText.cc:239 msgid "Text Files" msgstr "Textové soubory" #: ../gtk/src/hocr/HOCRTextExporter.cc:38 ../qt/src/hocr/HOCRTextExporter.cc:39 msgid "Save Text Output..." msgstr "Uložit textový výstup…" #: ../gtk/src/hocr/HOCRTextExporter.cc:46 ../qt/src/hocr/HOCRTextExporter.cc:47 msgid "The text export failed: unable to write output file." msgstr "Export textu se nezdaÅ™il: nepodaÅ™ilo se zapsat soubor s výstupem." #: ../gtk/src/hocr/OutputEditorHOCR.cc:269 #: ../qt/src/hocr/OutputEditorHOCR.cc:230 msgid "Block" msgstr "Blok" #: ../gtk/src/hocr/OutputEditorHOCR.cc:275 #: ../qt/src/hocr/OutputEditorHOCR.cc:232 msgid "Line" msgstr "Řádek" #: ../gtk/src/hocr/OutputEditorHOCR.cc:278 #: ../qt/src/hocr/OutputEditorHOCR.cc:233 msgid "Word" msgstr "Slovo" #: ../gtk/src/hocr/OutputEditorHOCR.cc:281 #: ../qt/src/hocr/OutputEditorHOCR.cc:234 msgid "Misspelled word" msgstr "Zkomolené slovo" #: ../gtk/src/hocr/OutputEditorHOCR.cc:435 #: ../qt/src/hocr/OutputEditorHOCR.cc:317 msgid "" "The following pages could not be processed:\n" "%1" msgstr "" "Následující stránky nebylo možné zpracovat:\n" "%1" #: ../gtk/src/hocr/OutputEditorHOCR.cc:436 #: ../qt/src/hocr/OutputEditorHOCR.cc:318 msgid "Recognition errors" msgstr "Chyby rozpoznávání" #: ../gtk/src/hocr/OutputEditorHOCR.cc:594 #: ../qt/src/hocr/OutputEditorHOCR.cc:500 #: ../qt/src/hocr/OutputEditorHOCR.cc:512 msgid "Multiple values" msgstr "Vícero hodnot" #. Merging allowed #: ../gtk/src/hocr/OutputEditorHOCR.cc:778 #: ../qt/src/hocr/OutputEditorHOCR.cc:641 msgid "Merge" msgstr "SlouÄit" #: ../gtk/src/hocr/OutputEditorHOCR.cc:786 #: ../gtk/src/hocr/OutputEditorHOCR.cc:877 #: ../qt/src/hocr/OutputEditorHOCR.cc:643 #: ../qt/src/hocr/OutputEditorHOCR.cc:725 msgid "Split from parent" msgstr "OddÄ›lit od nadÅ™azeného" #. Swapping allowed #: ../gtk/src/hocr/OutputEditorHOCR.cc:797 #: ../qt/src/hocr/OutputEditorHOCR.cc:647 msgid "Swap" msgstr "Prohodit" #: ../gtk/src/hocr/OutputEditorHOCR.cc:821 #: ../qt/src/hocr/OutputEditorHOCR.cc:693 msgid "Add graphic region" msgstr "PÅ™idat oblast s grafikou" #: ../gtk/src/hocr/OutputEditorHOCR.cc:824 #: ../qt/src/hocr/OutputEditorHOCR.cc:694 msgid "Add text block" msgstr "PÅ™idat textový blok" #: ../gtk/src/hocr/OutputEditorHOCR.cc:828 #: ../qt/src/hocr/OutputEditorHOCR.cc:696 msgid "Add paragraph" msgstr "PÅ™idat odstavec" #: ../gtk/src/hocr/OutputEditorHOCR.cc:832 #: ../qt/src/hocr/OutputEditorHOCR.cc:698 msgid "Add line" msgstr "PÅ™idat řádek" #: ../gtk/src/hocr/OutputEditorHOCR.cc:836 #: ../qt/src/hocr/OutputEditorHOCR.cc:700 msgid "Add word" msgstr "PÅ™idat slovo" #: ../gtk/src/hocr/OutputEditorHOCR.cc:852 #: ../qt/src/hocr/OutputEditorHOCR.cc:710 msgid "No suggestions" msgstr "Žádné návrhy" #: ../gtk/src/hocr/OutputEditorHOCR.cc:858 #: ../qt/src/hocr/OutputEditorHOCR.cc:714 msgid "Add to dictionary" msgstr "PÅ™idat do slovníku" #: ../gtk/src/hocr/OutputEditorHOCR.cc:864 #: ../qt/src/hocr/OutputEditorHOCR.cc:716 msgid "Ignore word" msgstr "Ignorovat slovo" #: ../gtk/src/hocr/OutputEditorHOCR.cc:926 #: ../gtk/src/hocr/OutputEditorHOCR.cc:965 #: ../qt/src/hocr/OutputEditorHOCR.cc:795 #: ../qt/src/hocr/OutputEditorHOCR.cc:832 msgid "hOCR HTML Files" msgstr "HTML soubory ve formátu hOCR" #: ../gtk/src/hocr/OutputEditorHOCR.cc:927 #: ../qt/src/hocr/OutputEditorHOCR.cc:795 msgid "Open hOCR File" msgstr "Otevřít soubor formátu hOCR" #: ../gtk/src/hocr/OutputEditorHOCR.cc:936 #: ../qt/src/hocr/OutputEditorHOCR.cc:802 msgid "Failed to open file" msgstr "NepodaÅ™ilo se otevřít soubor" #: ../gtk/src/hocr/OutputEditorHOCR.cc:936 #: ../qt/src/hocr/OutputEditorHOCR.cc:802 msgid "The file could not be opened: %1." msgstr "Soubor se nepodaÅ™ilo otevřít: %1." #: ../gtk/src/hocr/OutputEditorHOCR.cc:945 #: ../qt/src/hocr/OutputEditorHOCR.cc:809 msgid "Invalid hOCR file" msgstr "Soubor neobsahuje platná data ve formátu hOCR" #: ../gtk/src/hocr/OutputEditorHOCR.cc:945 #: ../qt/src/hocr/OutputEditorHOCR.cc:809 msgid "The file does not appear to contain valid hOCR HTML: %1" msgstr "Soubor neobsahuje platnou HTML podobu formátu HOCR: %1" #: ../gtk/src/hocr/OutputEditorHOCR.cc:966 #: ../qt/src/hocr/OutputEditorHOCR.cc:832 msgid "Save hOCR Output..." msgstr "Uložit výstup do formátu hOCR…" #: ../gtk/src/hocr/OutputEditorHOCR.cc:973 ../gtk/src/OutputEditorText.cc:282 #: ../qt/src/hocr/OutputEditorHOCR.cc:839 ../qt/src/OutputEditorText.cc:246 msgid "Failed to save output" msgstr "Uložení výstupu se nezdaÅ™ilo" #: ../gtk/src/hocr/OutputEditorHOCR.cc:973 ../gtk/src/OutputEditorText.cc:282 #: ../qt/src/hocr/OutputEditorHOCR.cc:839 ../qt/src/OutputEditorText.cc:246 msgid "Check that you have writing permissions in the selected folder." msgstr "Zkontrolujte své oprávnÄ›ní zapisovat do zvolené složky." #: ../gtk/src/hocr/OutputEditorHOCR.cc:1035 ../gtk/src/OutputEditorText.cc:296 #: ../qt/src/hocr/OutputEditorHOCR.cc:894 ../qt/src/OutputEditorText.cc:259 msgid "Output not saved" msgstr "Výstup nebyl uložen" #: ../gtk/src/hocr/OutputEditorHOCR.cc:1035 ../gtk/src/OutputEditorText.cc:296 #: ../qt/src/hocr/OutputEditorHOCR.cc:894 ../qt/src/OutputEditorText.cc:259 msgid "Save output before proceeding?" msgstr "PÅ™ed pokraÄováním – uložit výstup?" #: ../gtk/src/hocr/OutputEditorHOCR.cc:1156 ../gtk/src/OutputEditorText.cc:184 #: ../qt/src/hocr/OutputEditorHOCR.cc:991 ../qt/src/OutputEditorText.cc:152 msgid "Replacing..." msgstr "Nahrazování…" #: ../gtk/src/hocr/OutputEditorHOCR.cc:1181 ../gtk/src/OutputEditorText.cc:192 #: ../qt/src/hocr/OutputEditorHOCR.cc:1014 ../qt/src/OutputEditorText.cc:160 msgid "Applying substitutions..." msgstr "ProvádÄ›ní dosazení…" #: ../gtk/src/MainWindow.cc:131 ../qt/src/MainWindow.cc:295 msgid "Using tesseract" msgstr "S použitím engine tesseract" #: ../gtk/src/MainWindow.cc:178 ../qt/src/MainWindow.cc:194 msgid "Select an image to begin..." msgstr "ZaÄnÄ›te výbÄ›rem obrázku…" #: ../gtk/src/MainWindow.cc:293 ../qt/src/MainWindow.cc:278 msgid "Multiple sources" msgstr "Vícero zdrojů" #: ../gtk/src/MainWindow.cc:295 ../qt/src/MainWindow.cc:280 msgid "Ready" msgstr "PÅ™ipraveno" #: ../gtk/src/MainWindow.cc:442 ../qt/src/MainWindow.cc:423 msgid "New version" msgstr "Nová verze" #: ../gtk/src/MainWindow.cc:442 ../qt/src/MainWindow.cc:423 msgid "gImageReader %1 is available" msgstr "je k dispozici gImageReader %1" #: ../gtk/src/MainWindow.cc:443 ../qt/src/MainWindow.cc:424 msgid "Download" msgstr "Stáhnout" #: ../gtk/src/MainWindow.cc:444 ../qt/src/MainWindow.cc:425 msgid "Changelog" msgstr "Seznam zmÄ›n" #: ../gtk/src/MainWindow.cc:445 ../qt/src/MainWindow.cc:426 msgid "Don't notify again" msgstr "PříštÄ› už neoznamovat" #: ../gtk/src/MainWindow.cc:466 ../qt/src/MainWindow.cc:474 msgid "Don't show again" msgstr "PříštÄ› už nezobrazovat" #: ../gtk/src/MainWindow.cc:467 ../gtk/src/MainWindow.cc:480 #: ../qt/src/MainWindow.cc:475 msgid "Install" msgstr "Nainstalovat" #: ../gtk/src/MainWindow.cc:487 ../qt/src/MainWindow.cc:487 msgid "Spelling dictionary missing" msgstr "Chybí slovník pro kontrolu pÅ™eklepů" #: ../gtk/src/MainWindow.cc:487 ../qt/src/MainWindow.cc:487 msgid "The spellcheck dictionary for %1 is not installed" msgstr "Není nainstalovaný slovník pro kontrolu pÅ™eklepů pro %1" #: ../gtk/src/MainWindow.cc:494 ../gtk/src/MainWindow.cc:523 #: ../qt/src/MainWindow.cc:493 msgid "Installing spelling dictionary for '%1'" msgstr "Instaluje se slovník pro kontrolu pÅ™eklepů pro „%1“" #: ../gtk/src/MainWindow.cc:515 ../gtk/src/MainWindow.cc:536 #: ../gtk/src/MainWindow.cc:544 ../gtk/src/MainWindow.cc:592 #: ../gtk/src/MainWindow.cc:597 ../gtk/src/TessdataManager.cc:60 #: ../gtk/src/TessdataManager.cc:70 ../gtk/src/TessdataManager.cc:339 #: ../qt/src/MainWindow.cc:512 ../qt/src/MainWindow.cc:525 #: ../qt/src/MainWindow.cc:534 ../qt/src/MainWindow.cc:578 #: ../qt/src/MainWindow.cc:583 ../qt/src/TessdataManager.cc:74 #: ../qt/src/TessdataManager.cc:84 ../qt/src/TessdataManager.cc:315 msgid "Error" msgstr "Chyba" #: ../gtk/src/MainWindow.cc:515 ../qt/src/MainWindow.cc:512 msgid "Failed to install spelling dictionary: %1" msgstr "Instalace slovníku pro kontrolu pÅ™eklepů se nezdaÅ™ila: %1" #: ../gtk/src/MainWindow.cc:536 ../qt/src/MainWindow.cc:525 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:544 ../qt/src/MainWindow.cc:534 msgid "Could not read %1: %2." msgstr "%1 se nedaří naÄíst: %2." #: ../gtk/src/MainWindow.cc:571 ../qt/src/MainWindow.cc:558 msgid "Downloading '%1'..." msgstr "Stahování „%1“…" #: ../gtk/src/MainWindow.cc:592 ../qt/src/MainWindow.cc:578 msgid "" "The following dictionaries could not be downloaded:\n" "%1\n" "\n" "Check the connectivity and directory permissions.\n" "Hint: If you don't have write permissions in system folders, you can switch " "to user paths in the settings dialog." msgstr "" "Následující slovníky se nepodaÅ™ilo stáhnout:\n" "%1\n" "\n" "Zkontrolujte své pÅ™ipojení k Internetu a oprávnÄ›ní na složce.\n" "Rada: pokud nemáte oprávnÄ›ní zapisovat do systémových složek, můžete v " "dialogu nastavení pÅ™epnout na ty uživatelské." #: ../gtk/src/MainWindow.cc:595 ../qt/src/MainWindow.cc:581 msgid "Dictionaries installed" msgstr "Slovníky byly nainstalovány" #: ../gtk/src/MainWindow.cc:595 msgid "" "The following dictionaries were installed:\n" "%1" msgstr "" "Byly nainstalovány tyto slovníky:\n" "%1" #: ../gtk/src/MainWindow.cc:597 ../qt/src/MainWindow.cc:583 msgid "No spelling dictionaries found for '%1'." msgstr "Pro „%1“ nebyly nalezeny žádné slovníky pro kontrolu pÅ™eklepů." #: ../gtk/src/OutputEditorText.cc:154 ../qt/src/OutputEditorText.cc:137 msgid "Stripping line breaks..." msgstr "Odebírání konců řádků…" #: ../gtk/src/OutputEditorText.cc:162 msgid "Check spelling" msgstr "Zkontrolovat text na pÅ™eklepy" #: ../gtk/src/OutputEditorText.cc:231 ../qt/src/OutputEditorText.cc:196 msgid "File: %1" msgstr "Soubor: %1" #: ../gtk/src/OutputEditorText.cc:234 ../qt/src/OutputEditorText.cc:199 msgid "Page: %1" msgstr "Strana: %1" #: ../gtk/src/OutputEditorText.cc:247 ../gtk/src/Recognizer.cc:471 #: ../qt/src/Recognizer.cc:462 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:275 ../qt/src/OutputEditorText.cc:239 msgid "Save Output..." msgstr "Uložit výstup…" #: ../gtk/src/Recognizer.cc:179 ../qt/src/Recognizer.cc:172 msgid "No languages available" msgstr "Nejsou k dispozici žádná jazyková data" #: ../gtk/src/Recognizer.cc:179 ../qt/src/Recognizer.cc:172 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:233 ../qt/src/Recognizer.cc:232 msgid "Multilingual" msgstr "VícejazyÄné" #: ../gtk/src/Recognizer.cc:285 ../qt/src/Recognizer.cc:277 msgid "Automatic page segmentation" msgstr "Automatické rozdÄ›lení stránky na prvky" #: ../gtk/src/Recognizer.cc:286 ../qt/src/Recognizer.cc:278 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:287 ../qt/src/Recognizer.cc:279 msgid "Assume single column of text" msgstr "PÅ™edpokládat jeden sloupec textu" #: ../gtk/src/Recognizer.cc:288 ../qt/src/Recognizer.cc:280 msgid "Assume single block of vertically aligned text" msgstr "PÅ™edpokládat jediný blok svisle zarovnaného textu" #: ../gtk/src/Recognizer.cc:289 ../qt/src/Recognizer.cc:281 msgid "Assume a single uniform block of text" msgstr "PÅ™edpokládat jediný jednolitý blok textu" #: ../gtk/src/Recognizer.cc:290 ../qt/src/Recognizer.cc:282 msgid "Assume a line of text" msgstr "PÅ™edpokládat řádek textu" #: ../gtk/src/Recognizer.cc:291 ../qt/src/Recognizer.cc:283 msgid "Assume a single word" msgstr "PÅ™edpokládat jediné slovo" #: ../gtk/src/Recognizer.cc:292 ../qt/src/Recognizer.cc:284 msgid "Assume a single word in a circle" msgstr "PÅ™edpokládat jediné slovo v kruhu" #: ../gtk/src/Recognizer.cc:293 ../qt/src/Recognizer.cc:285 msgid "Sparse text in no particular order" msgstr "Rozptýlený text bez konkrétního poÅ™adí" #: ../gtk/src/Recognizer.cc:294 ../qt/src/Recognizer.cc:286 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:309 ../qt/src/Recognizer.cc:297 msgid "Page segmentation mode" msgstr "Režim rozdÄ›lování stránky na prvky" #: ../gtk/src/Recognizer.cc:313 ../qt/src/Recognizer.cc:300 msgid "Character whitelist / blacklist..." msgstr "" #: ../gtk/src/Recognizer.cc:319 ../qt/src/Recognizer.cc:305 msgid "Manage languages..." msgstr "Spravovat jazyková data…" #: ../gtk/src/Recognizer.cc:375 ../qt/src/Recognizer.cc:369 msgid "Current selection" msgstr "Stávající výbÄ›r" #: ../gtk/src/Recognizer.cc:465 ../qt/src/Recognizer.cc:455 msgid "Recognizing page %1 (%2 of %3)" msgstr "Rozpoznávání strany %1 (%2 ze %3)" #: ../gtk/src/Recognizer.cc:470 ../qt/src/Recognizer.cc:461 msgid "" "\n" "- Page %1: failed to render page" msgstr "" "\n" "- Strana %1: vykreslení stránky se nezdaÅ™ilo" #: ../gtk/src/Recognizer.cc:501 ../gtk/src/Recognizer.cc:531 #: ../gtk/src/Recognizer.cc:544 ../qt/src/Recognizer.cc:491 #: ../qt/src/Recognizer.cc:521 ../qt/src/Recognizer.cc:534 msgid "Recognizing..." msgstr "Rozpoznávání…" #: ../gtk/src/Recognizer.cc:505 ../gtk/src/Recognizer.cc:514 #: ../qt/src/Recognizer.cc:495 ../qt/src/Recognizer.cc:504 msgid "Recognition errors occurred" msgstr "PÅ™i rozpoznávání se vyskytly chyby" #: ../gtk/src/Recognizer.cc:505 ../qt/src/Recognizer.cc:495 msgid "The following errors occurred:%1" msgstr "DoÅ¡lo k tÄ›mto chybám:%1" #: ../gtk/src/Recognizer.cc:514 ../qt/src/Recognizer.cc:504 msgid "Failed to initialize tesseract" msgstr "NepodaÅ™ilo se inicializovat engine tesseract" #: ../gtk/src/scanner/ScannerSane.cc:84 ../gtk/src/scanner/ScannerTwain.cc:288 #: ../qt/src/scanner/ScannerSane.cc:85 ../qt/src/scanner/ScannerTwain.cc:286 msgid "Scan canceled" msgstr "Skenování bylo zruÅ¡eno" #: ../gtk/src/scanner/ScannerSane.cc:159 ../gtk/src/scanner/ScannerTwain.cc:186 #: ../qt/src/scanner/ScannerSane.cc:159 ../qt/src/scanner/ScannerTwain.cc:178 msgid "No scanner specified" msgstr "Nebyl urÄen žádný skener" #: ../gtk/src/scanner/ScannerSane.cc:168 ../gtk/src/scanner/ScannerTwain.cc:195 #: ../qt/src/scanner/ScannerSane.cc:168 ../qt/src/scanner/ScannerTwain.cc:187 msgid "Unable to connect to scanner" msgstr "Nedaří se spojit se skenerem" #: ../gtk/src/scanner/ScannerSane.cc:403 ../gtk/src/scanner/ScannerTwain.cc:266 #: ../gtk/src/scanner/ScannerTwain.cc:292 ../qt/src/scanner/ScannerSane.cc:403 #: ../qt/src/scanner/ScannerTwain.cc:258 ../qt/src/scanner/ScannerTwain.cc:290 msgid "Unable to start scan" msgstr "Nedaří se zahájit skenování" #: ../gtk/src/scanner/ScannerSane.cc:411 ../gtk/src/scanner/ScannerSane.cc:461 #: ../gtk/src/scanner/ScannerTwain.cc:318 ../qt/src/scanner/ScannerSane.cc:411 #: ../qt/src/scanner/ScannerSane.cc:461 ../qt/src/scanner/ScannerTwain.cc:316 msgid "Error communicating with scanner" msgstr "Chyba komunikace se skenerem" #: ../gtk/src/scanner/ScannerSane.cc:520 ../qt/src/scanner/ScannerSane.cc:517 msgid "Failed to save image" msgstr "Obrázek se nepodaÅ™ilo uložit" #: ../gtk/src/scanner/ScannerSane.cc:800 ../qt/src/scanner/ScannerSane.cc:797 msgid "Operation is cancelled." msgstr "Operace byla zruÅ¡ena." #: ../gtk/src/scanner/ScannerSane.cc:802 ../qt/src/scanner/ScannerSane.cc:799 msgid "Device is busy." msgstr "Zařízení je zaneprázdnÄ›né." #: ../gtk/src/scanner/ScannerSane.cc:804 ../qt/src/scanner/ScannerSane.cc:801 msgid "Cover is opened." msgstr "Je otevÅ™ený kryt." #: ../gtk/src/scanner/ScannerSane.cc:806 ../qt/src/scanner/ScannerSane.cc:803 msgid "Document feeder jammed." msgstr "PÅ™edloha se zasekla v podavaÄi." #: ../gtk/src/scanner/ScannerSane.cc:808 ../qt/src/scanner/ScannerSane.cc:805 msgid "Document feeder out of documents." msgstr "V podavaÄi doÅ¡ly pÅ™edlohy." #: ../gtk/src/scanner/ScannerSane.cc:810 ../qt/src/scanner/ScannerSane.cc:807 msgid "Access to scanner is denied." msgstr "Přístup ke skeneru odepÅ™en." #: ../gtk/src/SourceManager.cc:118 ../qt/src/SourceManager.cc:124 msgid "PDFs with text" msgstr "PDF soubory s textem" #: ../gtk/src/SourceManager.cc:118 ../qt/src/SourceManager.cc:124 msgid "" "These PDF files already contain text:\n" "%1" msgstr "" "Tyto PDF soubory už obsahují text.\n" "%1" #: ../gtk/src/SourceManager.cc:127 ../qt/src/SourceManager.cc:132 msgid "Unable to open files" msgstr "Soubory se nedaří otevřít" #: ../gtk/src/SourceManager.cc:127 ../qt/src/SourceManager.cc:132 msgid "The following files could not be opened:%1" msgstr "Následující soubory se nepodaÅ™ilo otevřít:%1" #: ../gtk/src/SourceManager.cc:141 ../qt/src/SourceManager.cc:143 msgid "Enter password for file '%1':" msgstr "Zadejte heslo k souboru „%1“:" #: ../gtk/src/SourceManager.cc:197 ../qt/src/SourceManager.cc:214 msgid "Images and PDFs" msgstr "Obrázky a PDF soubory" #: ../gtk/src/SourceManager.cc:202 ../qt/src/SourceManager.cc:215 msgid "Select Files" msgstr "Vyberte soubory" #: ../gtk/src/SourceManager.cc:208 ../qt/src/SourceManager.cc:226 msgid "Clipboard Error" msgstr "Chyba schránky" #: ../gtk/src/SourceManager.cc:208 ../qt/src/SourceManager.cc:226 msgid "Failed to read the clipboard." msgstr "Obsah schránky se nepodaÅ™ilo naÄíst." #: ../gtk/src/SourceManager.cc:212 ../qt/src/SourceManager.cc:230 #: ../qt/src/SourceManager.cc:236 msgid "Pasted %1" msgstr "Vloženo %1" #: ../gtk/src/SourceManager.cc:224 ../qt/src/SourceManager.cc:243 msgid "Screenshot Error" msgstr "Chyba pÅ™i poÅ™izování snímku obrazovky" #: ../gtk/src/SourceManager.cc:224 ../qt/src/SourceManager.cc:243 msgid "Failed to take screenshot." msgstr "NepodaÅ™ilo se pořídit snímek obrazovky." #: ../gtk/src/SourceManager.cc:228 ../qt/src/SourceManager.cc:247 msgid "Screenshot %1" msgstr "Snímek obrazovky %1" #: ../gtk/src/SourceManager.cc:233 ../qt/src/SourceManager.cc:252 msgid "Saving image..." msgstr "Ukládání obrázku…" #: ../gtk/src/SourceManager.cc:240 ../qt/src/SourceManager.cc:265 msgid "Cannot Write File" msgstr "Do souboru se nedaří zapsat" #: ../gtk/src/SourceManager.cc:240 ../qt/src/SourceManager.cc:265 msgid "Could not write to %1." msgstr "Do umístÄ›ní %1 se nedaří zapisovat." #: ../gtk/src/SourceManager.cc:267 ../qt/src/SourceManager.cc:287 msgid "Delete File?" msgstr "Smazat soubor?" #: ../gtk/src/SourceManager.cc:267 ../qt/src/SourceManager.cc:287 msgid "The following files will be deleted:%1" msgstr "Následující soubory budou smazány:%1" #: ../gtk/src/SourceManager.cc:332 ../qt/src/SourceManager.cc:338 msgid "Missing File" msgstr "ChybÄ›jící soubor" #: ../gtk/src/SourceManager.cc:332 ../qt/src/SourceManager.cc:338 msgid "" "The following file has been deleted or moved:\n" "%1" msgstr "" "Následující soubor byl smazán Äi pÅ™esunut:\n" "%1" #: ../gtk/src/SubstitutionsManager.cc:33 ../qt/src/SubstitutionsManager.cc:73 msgid "Search for" msgstr "Hledat výskyt" #: ../gtk/src/SubstitutionsManager.cc:34 ../qt/src/SubstitutionsManager.cc:73 msgid "Replace with" msgstr "Čím nahradit" #: ../gtk/src/SubstitutionsManager.cc:69 ../gtk/src/SubstitutionsManager.cc:103 #: ../qt/src/SubstitutionsManager.cc:106 ../qt/src/SubstitutionsManager.cc:143 msgid "Substitutions List" msgstr "Seznam dosazování" #: ../gtk/src/SubstitutionsManager.cc:70 ../qt/src/SubstitutionsManager.cc:106 msgid "Open Substitutions List" msgstr "Otevřít seznam dosazování" #: ../gtk/src/SubstitutionsManager.cc:75 ../qt/src/SubstitutionsManager.cc:112 msgid "Error Reading File" msgstr "Chyba pÅ™i naÄítání souboru" #: ../gtk/src/SubstitutionsManager.cc:75 ../qt/src/SubstitutionsManager.cc:112 msgid "Unable to read '%1'." msgstr "Z „%1“ se nedaří Äíst." #: ../gtk/src/SubstitutionsManager.cc:97 ../qt/src/SubstitutionsManager.cc:137 msgid "Errors Occurred Reading File" msgstr "PÅ™i naÄítání souboru se vyskytly chyby" #: ../gtk/src/SubstitutionsManager.cc:97 ../qt/src/SubstitutionsManager.cc:137 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:104 ../qt/src/SubstitutionsManager.cc:143 msgid "Save Substitutions List" msgstr "Uložit seznam dosazování" #: ../gtk/src/SubstitutionsManager.cc:110 ../qt/src/SubstitutionsManager.cc:149 msgid "Error Saving File" msgstr "Chyba pÅ™i ukládání do souboru" #: ../gtk/src/SubstitutionsManager.cc:110 ../qt/src/SubstitutionsManager.cc:149 msgid "Unable to write to '%1'." msgstr "Do „%1“ se nedaří zapisovat." #: ../gtk/src/SubstitutionsManager.cc:127 ../qt/src/SubstitutionsManager.cc:162 msgid "Save List?" msgstr "Uložit seznam?" #: ../gtk/src/SubstitutionsManager.cc:127 ../qt/src/SubstitutionsManager.cc:162 msgid "Do you want to save the current list?" msgstr "Chcete stávající seznam uložit?" #: ../gtk/src/TessdataManager.cc:60 ../qt/src/TessdataManager.cc:74 #, fuzzy msgid "" "A session connection to the PackageKit backend is required for managing " "system-wide tesseract language packs, but it was not found. This service is " "usually provided by a software-management application such as Gnome " "Software. Please install software which provides the necessary PackageKit " "interface, use other system package management software to manage the " "tesseract language packs directly, or switch to using 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Å¡echny 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 jazykové balíÄky engine tesseract spravujte jeho " "prostÅ™ednictvím. 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:65 ../qt/src/TessdataManager.cc:79 msgid "Fetching available languages" msgstr "Zjišťování dostupných jazykových dat" #: ../gtk/src/TessdataManager.cc:70 ../gtk/src/TessdataManager.cc:96 #: ../gtk/src/TessdataManager.cc:197 ../qt/src/TessdataManager.cc:84 #: ../qt/src/TessdataManager.cc:101 ../qt/src/TessdataManager.cc:197 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:104 ../qt/src/TessdataManager.cc:113 #: ../qt/src/TessdataManager.cc:122 msgid "Parsing error: %1" msgstr "Chyba zpracování: %1" #: ../gtk/src/TessdataManager.cc:235 ../qt/src/TessdataManager.cc:232 msgid "Applying changes..." msgstr "Promítnutí zmÄ›n…" #: ../gtk/src/TessdataManager.cc:297 ../qt/src/TessdataManager.cc:278 msgid "Failed to create directory for tessdata files." msgstr "NepodaÅ™ilo se vytvoÅ™it složku pro datové soubory engine tesseract." #: ../gtk/src/TessdataManager.cc:306 ../qt/src/TessdataManager.cc:287 msgid "Downloading %1..." msgstr "Stahování %1…" #: ../gtk/src/TessdataManager.cc:330 msgid "" "The following files could not be downloaded or removed:\n" "%1\n" "\n" "Check the connectivity and directory permissions.\n" "\n" "Hint: If you don't have write permissions in system folders, you can switch " "to user paths in the settings dialog." msgstr "" "Následující 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Å¡né " "složce.\n" "\n" "Rada: pokud nemáte oprávnÄ›ní zapisovat do systémových složek, můžete v " "dialogu nastavení pÅ™epnout na ty uživatelské." #: ../gtk/src/Utils.cc:64 msgid "Yes" msgstr "Ano" #: ../gtk/src/Utils.cc:67 msgid "No" msgstr "Ne" #: ../gtk/src/Utils.cc:76 msgid "Discard" msgstr "Zahodit" #: ../qt/data/AboutDialog.ui.h:1 msgid "About gImageReader" msgstr "O aplikaci gImageReader" #: ../qt/data/AboutDialog.ui.h:3 msgid "" "

 

A graphical frontend to tesseract-ocr

Website

 

" msgstr "" "

 

Grafická nadstavba pro tesseract-ocr

Webové stránky

 

" #: ../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/CrashHandler.ui.h:3 msgid "" "

Tesseract has " "aborted

Tesseract (the OCR engine) has aborted while " "recognizing text. This may occur if the used traineddatas are corrupt or " "incomplatible with the version of tesseract in use, or due to a bug in " "tesseract.

The stacktrace below may provide additional information " "about where the crash occured.

" msgstr "" #: ../qt/data/MainWindow.ui.h:17 msgid "Flatbed" msgstr "Deskový" #: ../qt/data/MainWindow.ui.h:18 msgid "ADF Front" msgstr "Aut. podavaÄ dokumentů pÅ™ední" #: ../qt/data/MainWindow.ui.h:19 msgid "ADF Back" msgstr "Aut. podavaÄ dokumentů zadní" #: ../qt/data/MainWindow.ui.h:20 msgid "ADF Duplex" msgstr "Aut. podavaÄ dokumentů oboustranné" #. Remove & from some labels which designer insists in adding #: ../qt/data/MainWindow.ui.h:21 ../qt/src/Ui_MainWindow.hh:50 msgid "Sources" msgstr "Zdroje" #: ../qt/data/MainWindow.ui.h:22 msgid "Zoom In" msgstr "PÅ™iblížit" #: ../qt/data/MainWindow.ui.h:24 msgid "Zoom Out" msgstr "Oddálit" #: ../qt/data/MainWindow.ui.h:26 msgid "Normal Size" msgstr "Původní velikost" #: ../qt/data/MainWindow.ui.h:28 msgid "Best Fit" msgstr "PÅ™izpůsobit oknu" #: ../qt/data/MainWindow.ui.h:30 msgid "Rotate Left" msgstr "OtoÄit vlevo" #: ../qt/data/MainWindow.ui.h:31 msgid "Rotate left" msgstr "OtoÄit vlevo" #: ../qt/data/MainWindow.ui.h:32 msgid "Rotate Right" msgstr "OtoÄit vpravo" #: ../qt/data/MainWindow.ui.h:33 msgid "Rotate right" msgstr "OtoÄit vpravo" #: ../qt/data/MainWindow.ui.h:34 msgid "Image Controls" msgstr "Ovládání parametrů obrázku" #: ../qt/data/MainWindow.ui.h:36 msgid "Autodetect Layout" msgstr "Automaticky zjistit rozvržení stránky" #: ../qt/data/MainWindow.ui.h:38 msgid "Toggle Output Pane" msgstr "Zobrazit Äi skrýt podokno s výstupním textem" #: ../qt/data/PdfExportDialog.ui.h:5 msgid "Backend:" msgstr "Podpůrná vrstva (backend):" #: ../qt/data/PdfExportDialog.ui.h:8 msgid "Portrait" msgstr "Na výšku" #: ../qt/data/PdfExportDialog.ui.h:9 msgid "Landscape" msgstr "Na šířku" #: ../qt/src/hocr/HOCRPdfExporter.cc:142 msgid "Failed to write to file" msgstr "NepodaÅ™ilo se zapsat soubor" #. Output toolbar #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:55 #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:56 msgid "Open hOCR file" msgstr "Otevřít soubor formátu hOCR" #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:57 #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:58 msgid "Save as hOCR text" msgstr "Uložit jako text ve formátu hOCR" #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:79 #: ../qt/src/Ui_OutputEditorText.hh:106 msgid "Find and Replace" msgstr "Najít a nahradit" #: ../qt/src/MainWindow.cc:581 #, fuzzy msgid "" "The following dictionary files were installed:\n" "%1" msgstr "Byly nainstalovány tyto soubory se slovníky:%1" #: ../qt/src/TessdataManager.cc:308 msgid "" "The following files could not be downloaded or removed:\n" "%1\n" "\n" "Check the connectivity and directory permissions.\n" "Hint: If you don't have write permissions in system folders, you can switch " "to user paths in the settings dialog." msgstr "" "Následující 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Å¡né " "složce.\n" "Rada: Pokud nemáte oprávnÄ›ní zapisovat do systémových složek, můžete v " "dialogu nastavení pÅ™epnout na ty uživatelské." #: ../qt/src/Ui_MainWindow.hh:51 msgid "Output" msgstr "Výstup" #: ../qt/src/Ui_MainWindow.hh:135 msgid "OCR mode:" msgstr "Režim OCR:" #: ../qt/src/Ui_MainWindow.hh:209 msgid "Remove Image" msgstr "Odebrat obrázek" #: ../qt/src/Ui_MainWindow.hh:212 msgid "Delete Image" msgstr "Smazat obrázek" #: ../qt/src/Ui_MainWindow.hh:215 msgid "Clear List" msgstr "VyÄistit seznam" #: ../qt/src/Ui_OutputEditorText.hh:101 msgid "Strip Line Breaks" msgstr "Odebrat zalomení řádků" #: ../qt/src/Ui_OutputEditorText.hh:115 msgid "Save Output" msgstr "Uložit výstup" #: ../qt/src/Ui_OutputEditorText.hh:117 msgid "Clear Output" msgstr "VyÄistit výstup" #~ msgid "The application has crashed" #~ msgstr "DoÅ¡lo k pádu aplikace" #~ 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 "" #~ "DoÅ¡lo k pádu engine tesseract, doprovázenému 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í soubory s pomocnými jazykovými daty.\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." #~ msgid "Could not read %1: %2" #~ msgstr "%1 se nedaří naÄíst: %2" #~ msgid "gImageReader" #~ msgstr "gImageReader" #~ msgid "PoDoFo" #~ msgstr "PoDoFo" #~ msgid "QPrinter" #~ msgstr "QPrinter" #~ 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 "90" #~ msgstr "90" #~ msgid "300" #~ msgstr "300" #~ msgid "100" #~ msgstr "100" #~ msgid "10" #~ msgstr "10" #~ msgid "%" #~ msgstr "%" #~ msgid "4" #~ msgstr "4" #~ msgid "1" #~ msgstr "1" #~ msgid "Document font:" #~ msgstr "Písmo dokumentu:" #~ msgid "Scale:" #~ msgstr "Měřítko:" #~ msgid "Document" #~ msgstr "Dokument" #~ msgid "Errors occurred" #~ msgstr "Vyskytly se chyby" #~ msgid "" #~ "The following pages could not be rendered:\n" #~ "%1" #~ msgstr "" #~ "Následující stránky se nepodaÅ™ilo vykreslit:\n" #~ "%1" #~ msgid "substitution_list.txt" #~ msgstr "seznam_dosazovani.txt" #~ 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 "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 "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.3.1/po/de.po000066400000000000000000002130461351740627400154170ustar00rootroot00000000000000# 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, 2018. msgid "" msgstr "" "Project-Id-Version: \n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2019-07-25 23:17+0200\n" "PO-Revision-Date: 2018-03-29 22:23+0000\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: Weblate 2.20-dev\n" #: ../data/gimagereader.desktop.in.h:1 msgid "OCR application" msgstr "Texterkennung" #: ../gtk/data/appmenu.ui.h:1 ../qt/src/Ui_MainWindow.hh:167 msgid "Redetect Languages" msgstr "Spracherkennung erneut ausführen" #: ../gtk/data/appmenu.ui.h:2 ../qt/src/Ui_MainWindow.hh:170 msgid "Manage Languages" msgstr "Sprachen verwalten" #: ../gtk/data/appmenu.ui.h:3 ../gtk/data/ConfigDialog.ui.h:1 #: ../qt/data/ConfigDialog.ui.h:1 ../qt/src/Ui_MainWindow.hh:173 msgid "Preferences" msgstr "Einstellungen" #: ../gtk/data/appmenu.ui.h:4 ../gtk/data/ConfigDialog.ui.h:2 #: ../gtk/src/MainWindow.cc:482 ../qt/src/MainWindow.cc:481 #: ../qt/src/Ui_MainWindow.hh:178 msgid "Help" msgstr "Hilfe" #: ../gtk/data/appmenu.ui.h:5 ../qt/data/AboutDialog.ui.h:2 #: ../qt/src/Ui_MainWindow.hh:181 msgid "About" msgstr "Über …" #: ../gtk/data/appmenu.ui.h:6 msgid "Quit" msgstr "Beenden" #: ../gtk/data/ConfigDialog.ui.h:3 ../gtk/data/MainWindow.ui.h:47 #: ../gtk/data/OutputEditorHOCR.ui.h:3 ../gtk/data/PdfExportDialog.ui.h:3 #: ../gtk/src/FileDialogs.cc:152 ../gtk/src/Utils.cc:61 #: ../qt/data/ConfigDialog.ui.h:26 msgid "OK" msgstr "OK" #: ../gtk/data/ConfigDialog.ui.h:4 msgid "Output pane orientation:" msgstr "Ausrichtung des Ausgabebereichs:" #: ../gtk/data/ConfigDialog.ui.h:5 msgid "Horizontal" msgstr "Waagerecht" #: ../gtk/data/ConfigDialog.ui.h:6 msgid "Vertical" msgstr "Senkrecht" #: ../gtk/data/ConfigDialog.ui.h:7 ../qt/data/ConfigDialog.ui.h:18 msgid "Query to install missing spellcheck dictionaries" msgstr "Installation von fehlenden Rechtschreibwörterbüchern vorschlagen" #: ../gtk/data/ConfigDialog.ui.h:8 ../qt/data/ConfigDialog.ui.h:4 msgid "Automatically check for new program versions" msgstr "Automatisch nach neuen Programmversionen suchen" #: ../gtk/data/ConfigDialog.ui.h:9 ../qt/data/ConfigDialog.ui.h:3 msgid "Predefined language definitions:" msgstr "Voreingestellte Sprachdefinitionen:" #: ../gtk/data/ConfigDialog.ui.h:10 ../qt/data/ConfigDialog.ui.h:12 msgid "Additional language definitions:" msgstr "Weitere Sprachdefinitionen:" #: ../gtk/data/ConfigDialog.ui.h:11 ../qt/data/ConfigDialog.ui.h:20 msgid "The prefix of the tesseract language data file" msgstr "Das Präfix der Tesserakt-Sprachdatei" #: ../gtk/data/ConfigDialog.ui.h:12 ../qt/data/ConfigDialog.ui.h:21 msgid "Prefix" msgstr "Präfix" #: ../gtk/data/ConfigDialog.ui.h:13 ../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/ConfigDialog.ui.h:14 ../qt/data/ConfigDialog.ui.h:23 msgid "ISO Code" msgstr "ISO-Code" #: ../gtk/data/ConfigDialog.ui.h:15 ../qt/data/ConfigDialog.ui.h:24 msgid "The name of the language" msgstr "Der Name der Sprache" #: ../gtk/data/ConfigDialog.ui.h:16 ../qt/data/ConfigDialog.ui.h:25 msgid "Name" msgstr "Name" #: ../gtk/data/ConfigDialog.ui.h:17 ../gtk/data/MainWindow.ui.h:46 #: ../gtk/data/OutputEditorHOCR.ui.h:2 ../gtk/data/PdfExportDialog.ui.h:2 #: ../gtk/src/Acquirer.cc:34 ../gtk/src/FileDialogs.cc:151 #: ../gtk/src/Utils.cc:70 ../qt/data/ConfigDialog.ui.h:27 #: ../qt/data/MainWindow.ui.h:12 msgid "Cancel" msgstr "Abbrechen" #: ../gtk/data/ConfigDialog.ui.h:18 ../qt/data/ConfigDialog.ui.h:5 msgid "Output pane font:" msgstr "Schriftart im Ausgabebereich:" #: ../gtk/data/ConfigDialog.ui.h:19 ../qt/data/ConfigDialog.ui.h:2 msgid "Default" msgstr "Standard" #: ../gtk/data/ConfigDialog.ui.h:20 ../qt/data/ConfigDialog.ui.h:6 msgid "Language data locations:" msgstr "Speicherort für Sprachdaten:" #: ../gtk/data/ConfigDialog.ui.h:21 ../qt/data/ConfigDialog.ui.h:13 msgid "Language definitions path:" msgstr "Speicherort für Sprachdefinitionen:" #: ../gtk/data/ConfigDialog.ui.h:22 ../qt/data/ConfigDialog.ui.h:28 msgid "Spelling dictionaries path:" msgstr "Speicherort der Rechtschreibwörterbücher:" #: ../gtk/data/ConfigDialog.ui.h:23 ../qt/data/ConfigDialog.ui.h:10 msgid "System-wide paths" msgstr "Systemweite Ordner" #: ../gtk/data/ConfigDialog.ui.h:24 ../qt/data/ConfigDialog.ui.h:11 msgid "User paths" msgstr "Benutzerordner" #: ../gtk/data/ConfigDialog.ui.h:25 ../qt/data/ConfigDialog.ui.h:29 msgid "Automatically open exported documents with default application" msgstr "Exportierte Dokumente automatisch öffnen" #: ../gtk/data/CrashHandler.ui.h:1 ../qt/src/CrashHandler.cc:38 msgid "Regenerate backtrace" msgstr "Backtrace nochmals durchführen" #: ../gtk/data/CrashHandler.ui.h:3 #, no-c-format msgid "" "The application has crashed\n" "\n" "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\n" "\n" "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/CrashHandler.ui.h:6 msgid "" "Tesseract has aborted\n" "\n" "Tesseract (the OCR engine) has aborted while recognizing text. This may " "occur if the used traineddatas are corrupt or incomplatible with the version " "of tesseract in use, or due to a bug in tesseract.\n" "\n" "The stacktrace below may provide additional information about where the " "crash occured.\n" msgstr "" "Tesseract hat abgebrochen\n" "\n" "Tesseract (die OCR engine) hat abgebrochen während des Erkennen des Textes. " "Dies kann passieren, falls die traineddata Datein korrupt oder mit der " "verwendeten Version von Tesseract inkompatibel sind, oder wegen eines " "Fehlers in Tesseract.\n" "\n" "Der Stacktrace unten könnte weitere Informationen zum Ursprung des Fehlers " "liefern.\n" #: ../gtk/data/MainWindow.ui.h:1 ../qt/data/MainWindow.ui.h:39 msgid "Toggle output pane" msgstr "Ausgabebereich ein-/ausblenden" #: ../gtk/data/MainWindow.ui.h:2 ../qt/src/Ui_MainWindow.hh:66 msgid "Rotate current page" msgstr "Aktuelle Seite rotieren" #: ../gtk/data/MainWindow.ui.h:3 ../qt/src/Ui_MainWindow.hh:67 msgid "Rotate all pages" msgstr "Alle Seiten rotieren" #. Sources toolbar #: ../gtk/data/MainWindow.ui.h:4 ../qt/src/Ui_MainWindow.hh:192 msgid "Recent" msgstr "Zuletzt geöffnet" #: ../gtk/data/MainWindow.ui.h:5 ../qt/src/Ui_MainWindow.hh:193 msgid "Paste" msgstr "Einfügen" #: ../gtk/data/MainWindow.ui.h:6 ../qt/src/Ui_MainWindow.hh:194 msgid "Take Screenshot" msgstr "Bildschirmfoto erstellen" #: ../gtk/data/MainWindow.ui.h:7 ../qt/data/MainWindow.ui.h:23 msgid "Zoom in" msgstr "Ansicht vergrößern" #: ../gtk/data/MainWindow.ui.h:8 ../qt/data/MainWindow.ui.h:25 msgid "Zoom out" msgstr "Ansicht verkleinern" #: ../gtk/data/MainWindow.ui.h:9 ../qt/data/MainWindow.ui.h:27 msgid "Normal size" msgstr "Originalgröße" #: ../gtk/data/MainWindow.ui.h:10 ../qt/data/MainWindow.ui.h:29 msgid "Best fit" msgstr "Anpassen" #: ../gtk/data/MainWindow.ui.h:11 ../qt/src/Ui_MainWindow.hh:75 msgid "Select rotation mode" msgstr "Rotationsmodus auswählen" #: ../gtk/data/MainWindow.ui.h:12 ../gtk/data/OutputEditorText.ui.h:13 #: ../qt/src/Ui_OutputEditorText.hh:95 msgid "Select insert mode" msgstr "Einfügemodus auswählen" #: ../gtk/data/MainWindow.ui.h:13 ../qt/src/Ui_MainWindow.hh:109 msgid "Select page" msgstr "Seite auswählen" #: ../gtk/data/MainWindow.ui.h:14 ../qt/data/MainWindow.ui.h:35 msgid "Image controls" msgstr "Bildbearbeitung" #: ../gtk/data/MainWindow.ui.h:15 ../qt/src/Ui_MainWindow.hh:139 msgid "Plain text" msgstr "Reiner Text" #: ../gtk/data/MainWindow.ui.h:16 ../qt/src/Ui_MainWindow.hh:139 msgid "hOCR, PDF" msgstr "hOCR, PDF" #: ../gtk/data/MainWindow.ui.h:17 ../qt/data/MainWindow.ui.h:37 msgid "Autodetect layout" msgstr "Layout automatisch erkennen" #: ../gtk/data/MainWindow.ui.h:18 msgid "Recognize all" msgstr "Alles erkennen" #: ../gtk/data/MainWindow.ui.h:19 msgid "Select language" msgstr "Sprache auswählen" #: ../gtk/data/MainWindow.ui.h:20 ../qt/src/Ui_MainWindow.hh:205 msgid "Add images" msgstr "Bilder hinzufügen" #: ../gtk/data/MainWindow.ui.h:21 ../qt/src/Ui_MainWindow.hh:204 msgid "Add Images" msgstr "Bilder hinzufügen" #: ../gtk/data/MainWindow.ui.h:22 ../qt/src/Ui_MainWindow.hh:210 msgid "Remove image from list" msgstr "Bild von Liste entfernen" #: ../gtk/data/MainWindow.ui.h:23 ../qt/src/Ui_MainWindow.hh:213 msgid "Delete image" msgstr "Bild löschen" #: ../gtk/data/MainWindow.ui.h:24 ../qt/src/Ui_MainWindow.hh:216 msgid "Clear list" msgstr "Liste leeren" #: ../gtk/data/MainWindow.ui.h:25 ../qt/data/MainWindow.ui.h:5 msgid "Files" msgstr "Dateien" #: ../gtk/data/MainWindow.ui.h:26 ../qt/data/MainWindow.ui.h:8 msgid "Device:" msgstr "Gerät:" #: ../gtk/data/MainWindow.ui.h:27 ../gtk/data/TessdataManager.ui.h:4 #: ../qt/data/MainWindow.ui.h:7 ../qt/src/TessdataManager.cc:59 msgid "Refresh" msgstr "Aktualisieren" #: ../gtk/data/MainWindow.ui.h:28 ../qt/data/MainWindow.ui.h:9 msgid "Output:" msgstr "Ausgabebild:" #: ../gtk/data/MainWindow.ui.h:29 ../qt/data/MainWindow.ui.h:13 msgid "Mode:" msgstr "Modus:" #: ../gtk/data/MainWindow.ui.h:30 ../gtk/src/hocr/HOCRPdfExporter.cc:313 #: ../qt/data/MainWindow.ui.h:15 ../qt/src/hocr/HOCRPdfExporter.cc:347 msgid "Color" msgstr "Farbig" #: ../gtk/data/MainWindow.ui.h:31 ../gtk/src/hocr/HOCRPdfExporter.cc:316 #: ../qt/data/MainWindow.ui.h:14 ../qt/src/hocr/HOCRPdfExporter.cc:349 #: ../qt/src/hocr/HOCRPdfExporter.cc:351 msgid "Grayscale" msgstr "Graustufen" #: ../gtk/data/MainWindow.ui.h:32 ../qt/data/MainWindow.ui.h:10 msgid "Resolution:" msgstr "Auflösung:" #: ../gtk/data/MainWindow.ui.h:33 ../qt/data/MainWindow.ui.h:11 msgid "Scan" msgstr "Scannen" #: ../gtk/data/MainWindow.ui.h:34 ../qt/data/MainWindow.ui.h:16 msgid "Source:" msgstr "Quelle:" #: ../gtk/data/MainWindow.ui.h:35 ../qt/data/MainWindow.ui.h:6 msgid "Acquire" msgstr "Erstellen" #: ../gtk/data/MainWindow.ui.h:36 ../qt/data/MainWindow.ui.h:1 msgid "Brightness" msgstr "Helligkeit" #: ../gtk/data/MainWindow.ui.h:37 ../qt/data/MainWindow.ui.h:2 msgid "Contrast" msgstr "Kontrast" #: ../gtk/data/MainWindow.ui.h:38 ../qt/data/MainWindow.ui.h:3 msgid "Resolution" msgstr "Auflösung" #: ../gtk/data/MainWindow.ui.h:39 ../qt/data/MainWindow.ui.h:4 msgid "Invert colors" msgstr "Farben invertieren" #: ../gtk/data/MainWindow.ui.h:40 msgid "A graphical frontend to tesseract-ocr" msgstr "Eine graphische Oberfläche für Tesseract-OCR" #: ../gtk/data/MainWindow.ui.h:41 ../qt/data/CharacterListDialog.ui.h:1 msgid "Character whitelist / blacklist" msgstr "Blacklist / Whitelist von Zeichen" #: ../gtk/data/MainWindow.ui.h:42 ../qt/data/CharacterListDialog.ui.h:2 msgid "Exclude these characters from being recognized (blacklist):" msgstr "Folgende Zeichen von der Erkennung ausschliessen (blacklist):" #: ../gtk/data/MainWindow.ui.h:43 ../qt/data/CharacterListDialog.ui.h:3 msgid "Enter a string of characters..." msgstr "Zeichenfolge eingeben..." #: ../gtk/data/MainWindow.ui.h:44 ../qt/data/CharacterListDialog.ui.h:4 msgid "Only allow the following characters to be recognized (whitelist):" msgstr "Nur folgende Zeichen erkennen (whitelist):" #: ../gtk/data/MainWindow.ui.h:45 ../qt/data/PageRangeDialog.ui.h:1 msgid "Page Range" msgstr "Seiten" #: ../gtk/data/MainWindow.ui.h:48 ../qt/data/PageRangeDialog.ui.h:2 msgid "Page range:" msgstr "Seiten:" #: ../gtk/data/MainWindow.ui.h:49 ../qt/data/PageRangeDialog.ui.h:3 msgid "Example: 1-10, 13, 14-18" msgstr "Beispiel: 1-10, 13, 14-18" #: ../gtk/data/MainWindow.ui.h:50 ../qt/data/PageRangeDialog.ui.h:4 msgid "Recognition area:" msgstr "Erkennungsbereich:" #: ../gtk/data/MainWindow.ui.h:51 ../gtk/src/Recognizer.cc:375 #: ../qt/data/PageRangeDialog.ui.h:5 ../qt/src/Recognizer.cc:369 msgid "Entire page" msgstr "Ganze Seite" #: ../gtk/data/MainWindow.ui.h:52 ../qt/data/PageRangeDialog.ui.h:6 msgid "Autodetect" msgstr "Automatisch erkennen" #: ../gtk/data/MainWindow.ui.h:53 ../qt/data/PageRangeDialog.ui.h:7 msgid "Prepend to output text:" msgstr "Dem Ausgabetext voranstellen:" #: ../gtk/data/MainWindow.ui.h:54 ../qt/data/PageRangeDialog.ui.h:8 msgid "Source filename" msgstr "Quelldateiname" #: ../gtk/data/MainWindow.ui.h:55 ../qt/data/PageRangeDialog.ui.h:9 msgid "Source page" msgstr "Quellseite" #: ../gtk/data/MainWindow.ui.h:56 ../qt/src/SourceManager.cc:146 msgid "Protected PDF" msgstr "Geschützes PDF" #: ../gtk/data/MainWindow.ui.h:57 ../qt/src/Recognizer.cc:76 msgid "Current Page" msgstr "Aktuelle Seite" #: ../gtk/data/MainWindow.ui.h:58 ../qt/src/Recognizer.cc:79 msgid "Multiple Pages..." msgstr "Mehrere Seiten..." #: ../gtk/data/OutputEditorHOCR.ui.h:1 ../qt/src/hocr/OutputEditorHOCR.cc:580 msgid "Add Word" msgstr "Wort hinzufügen" #: ../gtk/data/OutputEditorHOCR.ui.h:4 ../qt/src/hocr/OutputEditorHOCR.cc:580 msgid "Enter word:" msgstr "Wort eingeben:" #: ../gtk/data/OutputEditorHOCR.ui.h:5 ../qt/src/hocr/Ui_OutputEditorHOCR.hh:61 #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:62 msgid "Export to plain text" msgstr "Als Text exportieren" #: ../gtk/data/OutputEditorHOCR.ui.h:6 ../qt/src/hocr/Ui_OutputEditorHOCR.hh:64 #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:65 msgid "Export to PDF" msgstr "Als PDF exportieren" #: ../gtk/data/OutputEditorHOCR.ui.h:7 ../qt/src/hocr/Ui_OutputEditorHOCR.hh:67 #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:68 msgid "Export to ODT" msgstr "Als ODT exportieren" #: ../gtk/data/OutputEditorHOCR.ui.h:8 ../gtk/data/OutputEditorText.ui.h:18 #: ../qt/src/Ui_OutputEditorText.hh:116 msgid "Save output" msgstr "Ausgabe speichern" #: ../gtk/data/OutputEditorHOCR.ui.h:9 ../qt/src/hocr/Ui_OutputEditorHOCR.hh:72 #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:73 msgid "Export" msgstr "Export" #: ../gtk/data/OutputEditorHOCR.ui.h:10 ../gtk/data/OutputEditorText.ui.h:19 #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:77 #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:78 #: ../qt/src/Ui_OutputEditorText.hh:118 msgid "Clear output" msgstr "Ausgabe löschen" #: ../gtk/data/OutputEditorHOCR.ui.h:11 ../gtk/data/OutputEditorText.ui.h:15 #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:80 #: ../qt/src/Ui_OutputEditorText.hh:107 msgid "Find and replace" msgstr "Suchen und ersetzen" #: ../gtk/data/OutputEditorHOCR.ui.h:12 #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:82 #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:83 msgid "Show confidence values" msgstr "Vertrauenswerte anzeigen" #: ../gtk/data/OutputEditorHOCR.ui.h:13 ../gtk/data/PdfExportDialog.ui.h:41 #: ../qt/data/PdfExportDialog.ui.h:2 ../qt/src/hocr/Ui_OutputEditorHOCR.hh:85 #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:86 msgid "Show preview" msgstr "Vorschau anzeigen" #: ../gtk/data/OutputEditorHOCR.ui.h:14 #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:121 msgid "Next (F3)" msgstr "Nächstes (F3)" #: ../gtk/data/OutputEditorHOCR.ui.h:15 #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:122 msgid "Previous (Shift+F3)" msgstr "Vorheriges (Shift + F3)" #: ../gtk/data/OutputEditorHOCR.ui.h:16 ../gtk/src/hocr/OutputEditorHOCR.cc:890 #: ../qt/src/hocr/OutputEditorHOCR.cc:730 #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:126 msgid "Expand all" msgstr "Ausklappen" #: ../gtk/data/OutputEditorHOCR.ui.h:17 ../gtk/src/hocr/OutputEditorHOCR.cc:893 #: ../qt/src/hocr/OutputEditorHOCR.cc:731 #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:127 msgid "Collapse all" msgstr "Einklappen" #: ../gtk/data/OutputEditorHOCR.ui.h:18 #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:148 msgid "Properties" msgstr "Eigenschaften" #: ../gtk/data/OutputEditorHOCR.ui.h:19 #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:152 msgid "Source" msgstr "Quelle" #. Output insert mode #: ../gtk/data/OutputEditorText.ui.h:1 ../qt/src/Ui_OutputEditorText.hh:52 msgid "Append to current text" msgstr "An aktuellen Text anhängen" #: ../gtk/data/OutputEditorText.ui.h:2 ../qt/src/Ui_OutputEditorText.hh:53 msgid "Insert at cursor" msgstr "An Cursor-Stelle einfügen" #: ../gtk/data/OutputEditorText.ui.h:3 ../qt/src/Ui_OutputEditorText.hh:54 msgid "Replace current text" msgstr "Aktuellen Text ersetzen" #. Output postprocessing #: ../gtk/data/OutputEditorText.ui.h:4 ../qt/src/Ui_OutputEditorText.hh:62 msgid "Keep line break if..." msgstr "Behalte Zeilenumbruch bei falls..." #: ../gtk/data/OutputEditorText.ui.h:5 ../qt/src/Ui_OutputEditorText.hh:64 msgid "Preceded by end mark (.?!)" msgstr "ein Satzendzeichen (.?!) davor steht" #: ../gtk/data/OutputEditorText.ui.h:6 ../qt/src/Ui_OutputEditorText.hh:66 msgid "Preceded or succeeded by quote" msgstr "ein Anführungszeichen davor oder dahinter steht" #: ../gtk/data/OutputEditorText.ui.h:7 ../qt/src/Ui_OutputEditorText.hh:68 msgid "Other options" msgstr "Weitere Optionen" #: ../gtk/data/OutputEditorText.ui.h:8 ../qt/src/Ui_OutputEditorText.hh:70 msgid "Join hyphenated words" msgstr "Wörter mit Bindestrich zusammenfügen" #: ../gtk/data/OutputEditorText.ui.h:9 ../qt/src/Ui_OutputEditorText.hh:72 msgid "Collapse whitespace" msgstr "Leerstellen bereinigen" #: ../gtk/data/OutputEditorText.ui.h:10 ../qt/src/Ui_OutputEditorText.hh:74 msgid "Preserve paragraphs" msgstr "Absätzen erhalten" #: ../gtk/data/OutputEditorText.ui.h:11 ../qt/src/Ui_OutputEditorText.hh:76 msgid "Visual aids" msgstr "Visuelle Hilfen" #: ../gtk/data/OutputEditorText.ui.h:12 ../qt/src/Ui_OutputEditorText.hh:78 msgid "Draw whitespace" msgstr "Leerstellen zeichnen" #: ../gtk/data/OutputEditorText.ui.h:14 ../qt/src/Ui_OutputEditorText.hh:102 msgid "Strip line breaks on selected text" msgstr "Zeilenumbrüche im markierten Text entfernen" #: ../gtk/data/OutputEditorText.ui.h:16 ../qt/src/Ui_OutputEditorText.hh:109 #: ../qt/src/Ui_OutputEditorText.hh:110 msgid "Undo" msgstr "Rückgängig" #: ../gtk/data/OutputEditorText.ui.h:17 ../qt/src/Ui_OutputEditorText.hh:112 #: ../qt/src/Ui_OutputEditorText.hh:113 msgid "Redo" msgstr "Wiederholen" #: ../gtk/data/PdfExportDialog.ui.h:1 ../qt/data/PdfExportDialog.ui.h:1 msgid "PDF Export" msgstr "PDF-Export" #: ../gtk/data/PdfExportDialog.ui.h:4 ../qt/data/PdfExportDialog.ui.h:4 msgid "Output mode:" msgstr "Ausgabemodus:" #: ../gtk/data/PdfExportDialog.ui.h:5 ../qt/data/PdfExportDialog.ui.h:6 msgid "PDF" msgstr "PDF" #: ../gtk/data/PdfExportDialog.ui.h:6 ../qt/data/PdfExportDialog.ui.h:7 msgid "PDF with invisible text overlay" msgstr "PDF mit unsichtbarer Textlage" #: ../gtk/data/PdfExportDialog.ui.h:7 ../qt/data/PdfExportDialog.ui.h:16 msgid "Format:" msgstr "Format:" #: ../gtk/data/PdfExportDialog.ui.h:8 ../qt/data/PdfExportDialog.ui.h:17 msgid "Compression:" msgstr "Komprimierung:" #: ../gtk/data/PdfExportDialog.ui.h:9 ../qt/data/PdfExportDialog.ui.h:14 msgid "Compression quality:" msgstr "Komprimierungsqualität:" #: ../gtk/data/PdfExportDialog.ui.h:10 ../qt/data/PdfExportDialog.ui.h:15 msgid "DPI:" msgstr "DPI:" #: ../gtk/data/PdfExportDialog.ui.h:11 ../qt/data/PdfExportDialog.ui.h:18 msgid "Dithering algorithm:" msgstr "Dithering Algorithmus:" #: ../gtk/data/PdfExportDialog.ui.h:12 ../qt/data/PdfExportDialog.ui.h:13 msgid "Image settings:" msgstr "Bildeinstellungen:" #: ../gtk/data/PdfExportDialog.ui.h:13 ../qt/data/PdfExportDialog.ui.h:25 msgid "Uniformize line and word spacing" msgstr "Zeilen- und Wortabstände vereinheitlichen" #: ../gtk/data/PdfExportDialog.ui.h:14 ../qt/data/PdfExportDialog.ui.h:21 msgid "Override font family:" msgstr "Schriftart übersteuern:" #: ../gtk/data/PdfExportDialog.ui.h:15 ../qt/data/PdfExportDialog.ui.h:27 msgid "Fallback font family:" msgstr "Standard Schriftart:" #: ../gtk/data/PdfExportDialog.ui.h:16 ../qt/data/PdfExportDialog.ui.h:20 msgid "Override font size:" msgstr "Schriftgrösse übersteuern:" #: ../gtk/data/PdfExportDialog.ui.h:17 ../qt/data/PdfExportDialog.ui.h:23 msgid "Font scaling:" msgstr "Schriftgrössenskalierung:" #: ../gtk/data/PdfExportDialog.ui.h:18 ../qt/data/PdfExportDialog.ui.h:26 msgid "pt" msgstr "pt" #: ../gtk/data/PdfExportDialog.ui.h:19 ../qt/data/PdfExportDialog.ui.h:22 msgid "Preserve spaces wider than:" msgstr "Bewahre Abstände breiter als:" #: ../gtk/data/PdfExportDialog.ui.h:20 ../qt/data/PdfExportDialog.ui.h:24 msgid "characters" msgstr "Zeichen" #: ../gtk/data/PdfExportDialog.ui.h:21 ../qt/data/PdfExportDialog.ui.h:28 msgid "Sanitize hyphens before line breaks" msgstr "Bindestriche vor Zeilenumbrüche korrigieren" #: ../gtk/data/PdfExportDialog.ui.h:22 ../qt/data/PdfExportDialog.ui.h:19 msgid "Text settings:" msgstr "Texteinstellungen:" #: ../gtk/data/PdfExportDialog.ui.h:23 ../qt/data/PdfExportDialog.ui.h:10 msgid "Paper size:" msgstr "Papiergrösse:" #: ../gtk/data/PdfExportDialog.ui.h:24 ../qt/data/PdfExportDialog.ui.h:11 msgid "Width" msgstr "Breite" #: ../gtk/data/PdfExportDialog.ui.h:25 ../qt/data/PdfExportDialog.ui.h:12 msgid "Height" msgstr "Höhe" #: ../gtk/data/PdfExportDialog.ui.h:26 ../qt/data/PdfExportDialog.ui.h:29 msgid "Treat image sources as having true DPI:" msgstr "Angenommene DPI für Bildquellen:" #: ../gtk/data/PdfExportDialog.ui.h:27 ../qt/data/PdfExportDialog.ui.h:3 msgid "Basic" msgstr "Grundeinstellungen" #: ../gtk/data/PdfExportDialog.ui.h:28 ../qt/data/PdfExportDialog.ui.h:31 msgid "PDF version:" msgstr "PDF Version:" #: ../gtk/data/PdfExportDialog.ui.h:29 ../qt/data/PdfExportDialog.ui.h:33 msgid "Password:" msgstr "Passwort:" #: ../gtk/data/PdfExportDialog.ui.h:30 ../qt/data/PdfExportDialog.ui.h:34 msgid "Confirm password:" msgstr "Passwort bestätigen:" #: ../gtk/data/PdfExportDialog.ui.h:31 ../qt/data/PdfExportDialog.ui.h:32 msgid "Encryption (optional):" msgstr "Verschlüsslung (optional):" #: ../gtk/data/PdfExportDialog.ui.h:32 ../qt/data/PdfExportDialog.ui.h:36 msgid "Author:" msgstr "Autor:" #: ../gtk/data/PdfExportDialog.ui.h:33 ../qt/data/PdfExportDialog.ui.h:38 msgid "Title:" msgstr "Titel:" #: ../gtk/data/PdfExportDialog.ui.h:34 ../qt/data/PdfExportDialog.ui.h:40 msgid "Subject:" msgstr "Betreff:" #: ../gtk/data/PdfExportDialog.ui.h:35 ../qt/data/PdfExportDialog.ui.h:37 msgid "Creator:" msgstr "Ersteller:" #: ../gtk/data/PdfExportDialog.ui.h:36 ../qt/data/PdfExportDialog.ui.h:39 msgid "Producer:" msgstr "Produzent:" #: ../gtk/data/PdfExportDialog.ui.h:37 ../qt/data/PdfExportDialog.ui.h:41 msgid "Keywords:" msgstr "Schlüsselwörter:" #: ../gtk/data/PdfExportDialog.ui.h:38 ../qt/data/PdfExportDialog.ui.h:35 msgid "Additional information (optional):" msgstr "Weitere Informationen (optional):" #: ../gtk/data/PdfExportDialog.ui.h:39 ../qt/data/PdfExportDialog.ui.h:42 msgid "Import from current source" msgstr "Aus aktueller Quelle importieren" #: ../gtk/data/PdfExportDialog.ui.h:40 ../qt/data/PdfExportDialog.ui.h:30 msgid "Advanced" msgstr "Fortgeschritten" #: ../gtk/data/SearchReplaceFrame.ui.h:1 ../qt/data/SearchReplaceFrame.ui.h:4 msgid "Find" msgstr "Suche" #: ../gtk/data/SearchReplaceFrame.ui.h:2 ../qt/data/SearchReplaceFrame.ui.h:2 msgid "Replace" msgstr "Ersetzen" #: ../gtk/data/SearchReplaceFrame.ui.h:3 ../qt/data/SearchReplaceFrame.ui.h:3 msgid "Replace all" msgstr "Alle ersetzen" #: ../gtk/data/SearchReplaceFrame.ui.h:4 ../qt/data/SearchReplaceFrame.ui.h:5 msgid "Find previous" msgstr "Rückwärts suchen" #: ../gtk/data/SearchReplaceFrame.ui.h:5 ../qt/data/SearchReplaceFrame.ui.h:6 msgid "Find next" msgstr "Vorwärts suchen" #: ../gtk/data/SearchReplaceFrame.ui.h:6 ../qt/data/SearchReplaceFrame.ui.h:7 msgid "Match case" msgstr "Groß-/Kleinschreibung beachten" #: ../gtk/data/SearchReplaceFrame.ui.h:7 #: ../gtk/data/SubstitutionsManager.ui.h:1 ../qt/data/SearchReplaceFrame.ui.h:1 #: ../qt/src/SubstitutionsManager.cc:36 msgid "Substitutions" msgstr "Ersetzungen" #: ../gtk/data/SelectionMenu.ui.h:1 ../qt/src/DisplayerToolSelect.cc:239 msgid "Delete" msgstr "Löschen" #: ../gtk/data/SelectionMenu.ui.h:2 ../qt/src/DisplayerToolSelect.cc:225 msgid "Order:" msgstr "Reihenfolge:" #: ../gtk/data/SelectionMenu.ui.h:3 ../gtk/src/hocr/DisplayerToolHOCR.cc:29 #: ../qt/src/DisplayerToolSelect.cc:240 ../qt/src/hocr/DisplayerToolHOCR.cc:31 msgid "Recognize" msgstr "Erkennen" #: ../gtk/data/SelectionMenu.ui.h:4 ../qt/src/DisplayerToolSelect.cc:241 msgid "Recognize to clipboard" msgstr "Erkennung in die Zwischenablage kopieren" #: ../gtk/data/SelectionMenu.ui.h:5 ../qt/src/DisplayerToolSelect.cc:242 msgid "Save as image" msgstr "Als Bild speichern" #: ../gtk/data/SubstitutionsManager.ui.h:2 ../qt/src/SubstitutionsManager.cc:38 #: ../qt/src/SubstitutionsManager.cc:39 msgid "Open" msgstr "Öffnen" #: ../gtk/data/SubstitutionsManager.ui.h:3 ../gtk/src/Utils.cc:73 #: ../qt/src/SubstitutionsManager.cc:41 ../qt/src/SubstitutionsManager.cc:42 msgid "Save" msgstr "Speichern" #: ../gtk/data/SubstitutionsManager.ui.h:4 ../qt/src/SubstitutionsManager.cc:44 #: ../qt/src/SubstitutionsManager.cc:45 msgid "Clear" msgstr "Liste leeren" #: ../gtk/data/SubstitutionsManager.ui.h:5 ../qt/data/ConfigDialog.ui.h:16 #: ../qt/src/SubstitutionsManager.cc:47 ../qt/src/SubstitutionsManager.cc:48 msgid "Add" msgstr "Hinzufügen" #: ../gtk/data/SubstitutionsManager.ui.h:6 #: ../gtk/src/hocr/OutputEditorHOCR.cc:886 ../qt/data/ConfigDialog.ui.h:17 #: ../qt/src/hocr/OutputEditorHOCR.cc:727 ../qt/src/SubstitutionsManager.cc:50 #: ../qt/src/SubstitutionsManager.cc:51 msgid "Remove" msgstr "Entfernen" #: ../gtk/data/SubstitutionsManager.ui.h:7 ../gtk/data/TessdataManager.ui.h:2 msgid "Apply" msgstr "Anwenden" #: ../gtk/data/SubstitutionsManager.ui.h:8 ../gtk/data/TessdataManager.ui.h:3 msgid "Close" msgstr "Schließen" #: ../gtk/data/TessdataManager.ui.h:1 ../qt/src/TessdataManager.cc:49 msgid "Tessdata Manager" msgstr "Tessdata-Verwaltung" #: ../gtk/data/TessdataManager.ui.h:5 ../qt/src/TessdataManager.cc:51 msgid "Manage installed languages:" msgstr "Installierte Sprachen verwalten:" #: ../gtk/src/Acquirer.cc:79 ../qt/src/Acquirer.cc:70 msgid "scan.png" msgstr "scan.png" #: ../gtk/src/Acquirer.cc:91 ../qt/src/Acquirer.cc:85 msgid "Images" msgstr "Bilder" #: ../gtk/src/Acquirer.cc:92 ../qt/src/Acquirer.cc:86 msgid "Choose Output Filename..." msgstr "Wählen Sie den Namen der Ausgabedatei..." #: ../gtk/src/Acquirer.cc:106 ../qt/src/Acquirer.cc:100 msgid "Failed to initialize the scanning backend." msgstr "Scanning-Backend konnte nicht initialisiert werden." #: ../gtk/src/Acquirer.cc:115 ../qt/src/Acquirer.cc:106 msgid "Scan failed" msgstr "Scannen fehlgeschlagen" #: ../gtk/src/Acquirer.cc:133 ../qt/src/Acquirer.cc:122 msgid "No scanners were detected." msgstr "Keine Scanner gefunden." #: ../gtk/src/Acquirer.cc:150 ../gtk/src/Acquirer.cc:168 #: ../qt/src/Acquirer.cc:136 ../qt/src/Acquirer.cc:154 msgid "Starting scan..." msgstr "Scan wird gestartet..." #: ../gtk/src/Acquirer.cc:164 ../qt/src/Acquirer.cc:150 msgid "Opening device..." msgstr "Die Verbindung zum Scanner wird hergestellt..." #: ../gtk/src/Acquirer.cc:166 ../qt/src/Acquirer.cc:152 msgid "Setting options..." msgstr "Einstellungen werden gesetzt..." #: ../gtk/src/Acquirer.cc:170 ../qt/src/Acquirer.cc:156 msgid "Getting parameters..." msgstr "Parameter werden gelesen..." #: ../gtk/src/Acquirer.cc:172 ../qt/src/Acquirer.cc:158 msgid "Transferring data..." msgstr "Bildinformation wird übertragen..." #: ../gtk/src/Acquirer.cc:179 ../qt/src/Acquirer.cc:165 msgid "Canceling scan..." msgstr "Scan wird unterbrochen..." #: ../gtk/src/Config.cc:49 ../qt/data/ConfigDialog.ui.h:7 msgid "Filename prefix" msgstr "Präfix des Dateinamens" #: ../gtk/src/Config.cc:50 ../qt/data/ConfigDialog.ui.h:8 msgid "Code" msgstr "Code" #: ../gtk/src/Config.cc:51 ../qt/data/ConfigDialog.ui.h:9 msgid "Native name" msgstr "Nativer Name" #: ../gtk/src/Config.cc:109 ../qt/src/Config.cc:108 msgid "Script" msgstr "Schrift" #: ../gtk/src/CrashHandler.cc:25 ../gtk/src/CrashHandler.cc:41 #: ../qt/src/CrashHandler.cc:36 msgid "Crash Handler" msgstr "Crash-Handler" #: ../gtk/src/CrashHandler.cc:43 ../qt/src/CrashHandler.cc:31 msgid "Your work has been saved under %1." msgstr "Ihre Arbeit wurde unter %1 gespeichert." #: ../gtk/src/CrashHandler.cc:45 ../qt/src/CrashHandler.cc:33 msgid "There was no unsaved work." msgstr "Keine ungespeicherte Arbeit." #: ../gtk/src/CrashHandler.cc:106 ../qt/src/CrashHandler.cc:62 msgid "Failed to obtain backtrace. Is gdb installed?" msgstr "Der Backtrace konnte nicht generiert werden. Ist gdb installiert?" #: ../gtk/src/Displayer.cc:232 ../qt/src/Displayer.cc:174 msgid "Failed to load image" msgstr "Das Bild konnte nicht geladen werden" #: ../gtk/src/Displayer.cc:232 ../qt/src/Displayer.cc:174 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:138 ../qt/src/DisplayerToolSelect.cc:135 msgid "PNG Images" msgstr "PNG-Bilder" #: ../gtk/src/DisplayerToolSelect.cc:139 ../qt/src/DisplayerToolSelect.cc:135 msgid "Save Selection Image" msgstr "Bild speichern" #: ../gtk/src/DisplayerToolSelect.cc:139 ../qt/src/DisplayerToolSelect.cc:135 msgid "selection.png" msgstr "Auswahl.png" #: ../gtk/src/DisplayerToolSelect.cc:146 ../qt/src/DisplayerToolSelect.cc:142 msgid "Recognize all" msgstr "Alles erkennen" #: ../gtk/src/DisplayerToolSelect.cc:146 ../qt/src/DisplayerToolSelect.cc:142 msgid "Recognize selection" msgstr "Auswahl erkennen" #: ../gtk/src/DisplayerToolSelect.cc:186 ../qt/src/DisplayerToolSelect.cc:182 msgid "Performing layout analysis" msgstr "Layout-Analyse wird durchgeführt" #: ../gtk/src/FileDialogs.cc:235 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:237 msgid "Overwrite File?" msgstr "Datei ersetzen?" #: ../gtk/src/hocr/HOCRDocument.cc:611 ../gtk/src/hocr/OutputEditorHOCR.cc:266 #: ../qt/src/hocr/OutputEditorHOCR.cc:229 msgid "Page" msgstr "Seite" #: ../gtk/src/hocr/HOCRDocument.cc:613 ../qt/src/hocr/HOCRDocument.cc:530 msgid "Text block" msgstr "Textblock" #: ../gtk/src/hocr/HOCRDocument.cc:615 ../gtk/src/hocr/OutputEditorHOCR.cc:272 #: ../qt/src/hocr/HOCRDocument.cc:532 ../qt/src/hocr/OutputEditorHOCR.cc:231 msgid "Paragraph" msgstr "Absatz" #: ../gtk/src/hocr/HOCRDocument.cc:617 ../qt/src/hocr/HOCRDocument.cc:534 msgid "Textline" msgstr "Textzeile" #: ../gtk/src/hocr/HOCRDocument.cc:621 ../qt/src/hocr/HOCRDocument.cc:538 msgid "Graphic" msgstr "Graphik" #: ../gtk/src/hocr/HOCROdtExporter.cc:65 ../gtk/src/hocr/HOCRPdfExporter.cc:489 #: ../gtk/src/hocr/HOCRTextExporter.cc:34 #: ../gtk/src/hocr/OutputEditorHOCR.cc:963 ../gtk/src/OutputEditorText.cc:272 #: ../qt/src/hocr/HOCROdtExporter.cc:50 ../qt/src/hocr/HOCRPdfExporter.cc:478 #: ../qt/src/hocr/HOCRTextExporter.cc:36 ../qt/src/hocr/OutputEditorHOCR.cc:830 #: ../qt/src/OutputEditorText.cc:238 msgid "output" msgstr "Ausgabe" #: ../gtk/src/hocr/HOCROdtExporter.cc:68 ../qt/src/hocr/HOCROdtExporter.cc:53 msgid "OpenDocument Text Documents" msgstr "OpenDocument Textdokumente" #: ../gtk/src/hocr/HOCROdtExporter.cc:69 ../qt/src/hocr/HOCROdtExporter.cc:53 msgid "Save ODT Output..." msgstr "ODT Ausgabe speichern..." #: ../gtk/src/hocr/HOCROdtExporter.cc:77 ../gtk/src/hocr/HOCROdtExporter.cc:342 #: ../gtk/src/hocr/HOCRPdfExporter.cc:619 #: ../gtk/src/hocr/HOCRTextExporter.cc:46 ../qt/src/hocr/HOCROdtExporter.cc:61 #: ../qt/src/hocr/HOCRPdfExporter.cc:609 ../qt/src/hocr/HOCRTextExporter.cc:47 msgid "Export failed" msgstr "Export fehlgeschlagen" #: ../gtk/src/hocr/HOCROdtExporter.cc:77 ../gtk/src/hocr/HOCROdtExporter.cc:342 #: ../qt/src/hocr/HOCROdtExporter.cc:61 msgid "The ODT export failed: unable to write output file." msgstr "" "Der ODT Export schlug fehl: die Ausgabedatei konnte nicht geschrieben werden." #: ../gtk/src/hocr/HOCROdtExporter.cc:336 ../qt/src/hocr/HOCROdtExporter.cc:254 msgid "Exporting to ODT..." msgstr "ODT Export erfolgt..." #: ../gtk/src/hocr/HOCRPdfExporter.cc:283 ../qt/src/hocr/HOCRPdfExporter.cc:365 msgid "Same as source" msgstr "Gleich wie Quelle" #: ../gtk/src/hocr/HOCRPdfExporter.cc:286 ../qt/src/hocr/HOCRPdfExporter.cc:366 msgid "Custom" msgstr "Benutzerdefiniert" #: ../gtk/src/hocr/HOCRPdfExporter.cc:300 ../qt/src/hocr/HOCRPdfExporter.cc:362 msgid "cm" msgstr "cm" #: ../gtk/src/hocr/HOCRPdfExporter.cc:303 ../qt/src/hocr/HOCRPdfExporter.cc:363 msgid "in" msgstr "in" #: ../gtk/src/hocr/HOCRPdfExporter.cc:319 ../qt/src/hocr/HOCRPdfExporter.cc:353 msgid "Monochrome" msgstr "Einfarbig" #: ../gtk/src/hocr/HOCRPdfExporter.cc:328 ../qt/src/hocr/HOCRPdfExporter.cc:355 msgid "Threshold (closest color)" msgstr "Threshold (nächste Farbe)" #: ../gtk/src/hocr/HOCRPdfExporter.cc:331 ../qt/src/hocr/HOCRPdfExporter.cc:356 msgid "Diffuse" msgstr "Diffus" #: ../gtk/src/hocr/HOCRPdfExporter.cc:340 ../qt/src/hocr/HOCRPdfExporter.cc:357 msgid "Zip (lossless)" msgstr "Zip (verlustlos)" #: ../gtk/src/hocr/HOCRPdfExporter.cc:344 ../qt/src/hocr/HOCRPdfExporter.cc:358 msgid "CCITT Group 4 (lossless)" msgstr "CCITT Group 4 (verlustlos)" #: ../gtk/src/hocr/HOCRPdfExporter.cc:348 ../qt/src/hocr/HOCRPdfExporter.cc:359 msgid "Jpeg (lossy)" msgstr "Jpeg (verlustbehaftet)" #: ../gtk/src/hocr/HOCRPdfExporter.cc:493 ../qt/src/hocr/HOCRPdfExporter.cc:482 msgid "PDF Files" msgstr "PDF-Dateien" #: ../gtk/src/hocr/HOCRPdfExporter.cc:494 ../qt/src/hocr/HOCRPdfExporter.cc:482 msgid "Save PDF Output..." msgstr "PDF-Ausgabe speichern..." #: ../gtk/src/hocr/HOCRPdfExporter.cc:500 ../qt/src/hocr/HOCRPdfExporter.cc:488 msgid "Invalid Output" msgstr "Ungültige Ausgabe" #: ../gtk/src/hocr/HOCRPdfExporter.cc:500 ../qt/src/hocr/HOCRPdfExporter.cc:488 msgid "Cannot overwrite a file which is a source image of this document." msgstr "Quelldateien dieses Dokuments können nicht überschrieben werden." #: ../gtk/src/hocr/HOCRPdfExporter.cc:516 ../qt/src/hocr/HOCRPdfExporter.cc:511 msgid "Failed to create output" msgstr "Ausgabe konnte nicht erstellt werden" #: ../gtk/src/hocr/HOCRPdfExporter.cc:516 ../qt/src/hocr/HOCRPdfExporter.cc:511 msgid "Failed to create output. The returned error was: %1" msgstr "" "Die Ausgabe konnte nicht erstellt werden. Folgender Fehler ist aufgetreten: " "%1" #: ../gtk/src/hocr/HOCRPdfExporter.cc:558 ../qt/src/hocr/HOCRPdfExporter.cc:551 msgid "The operation was cancelled" msgstr "Der Prozess wurde abgebrochen" #: ../gtk/src/hocr/HOCRPdfExporter.cc:607 ../qt/src/hocr/HOCRPdfExporter.cc:597 msgid "Failed to render page %1" msgstr "Seite %1 konnte nicht gerendert werden" #: ../gtk/src/hocr/HOCRPdfExporter.cc:614 ../qt/src/hocr/HOCRPdfExporter.cc:604 msgid "Exporting to PDF..." msgstr "PDF Export erfolgt..." #: ../gtk/src/hocr/HOCRPdfExporter.cc:619 ../qt/src/hocr/HOCRPdfExporter.cc:609 msgid "The PDF export failed: %1." msgstr "Der PDF-Export ist fehlgeschlagen: %1" #: ../gtk/src/hocr/HOCRPdfExporter.cc:673 ../qt/src/hocr/HOCRPdfExporter.cc:662 msgid "The PDF library could not load the font '%1'." msgstr "Die PDF Bibliothek konnte die Schriftart '%1' nicht laden." #: ../gtk/src/hocr/HOCRTextExporter.cc:37 ../gtk/src/OutputEditorText.cc:274 #: ../qt/src/hocr/HOCRTextExporter.cc:39 ../qt/src/OutputEditorText.cc:239 msgid "Text Files" msgstr "Textdateien" #: ../gtk/src/hocr/HOCRTextExporter.cc:38 ../qt/src/hocr/HOCRTextExporter.cc:39 msgid "Save Text Output..." msgstr "Text Ausgabe speichern..." #: ../gtk/src/hocr/HOCRTextExporter.cc:46 ../qt/src/hocr/HOCRTextExporter.cc:47 msgid "The text export failed: unable to write output file." msgstr "" "Der Text Export schlug fehl: die Ausgabedatei konnte nicht geschrieben " "werden." #: ../gtk/src/hocr/OutputEditorHOCR.cc:269 #: ../qt/src/hocr/OutputEditorHOCR.cc:230 msgid "Block" msgstr "Block" #: ../gtk/src/hocr/OutputEditorHOCR.cc:275 #: ../qt/src/hocr/OutputEditorHOCR.cc:232 msgid "Line" msgstr "Zeile" #: ../gtk/src/hocr/OutputEditorHOCR.cc:278 #: ../qt/src/hocr/OutputEditorHOCR.cc:233 msgid "Word" msgstr "Wort" #: ../gtk/src/hocr/OutputEditorHOCR.cc:281 #: ../qt/src/hocr/OutputEditorHOCR.cc:234 msgid "Misspelled word" msgstr "Falsch geschrieben" #: ../gtk/src/hocr/OutputEditorHOCR.cc:435 #: ../qt/src/hocr/OutputEditorHOCR.cc:317 msgid "" "The following pages could not be processed:\n" "%1" msgstr "" "Folgende Seiten konnten nicht verarbeitet werden:\n" "%1" #: ../gtk/src/hocr/OutputEditorHOCR.cc:436 #: ../qt/src/hocr/OutputEditorHOCR.cc:318 msgid "Recognition errors" msgstr "Erkennungsfehler" #: ../gtk/src/hocr/OutputEditorHOCR.cc:594 #: ../qt/src/hocr/OutputEditorHOCR.cc:500 #: ../qt/src/hocr/OutputEditorHOCR.cc:512 msgid "Multiple values" msgstr "Mehrere Werte" #. Merging allowed #: ../gtk/src/hocr/OutputEditorHOCR.cc:778 #: ../qt/src/hocr/OutputEditorHOCR.cc:641 msgid "Merge" msgstr "Verschmelzen" #: ../gtk/src/hocr/OutputEditorHOCR.cc:786 #: ../gtk/src/hocr/OutputEditorHOCR.cc:877 #: ../qt/src/hocr/OutputEditorHOCR.cc:643 #: ../qt/src/hocr/OutputEditorHOCR.cc:725 msgid "Split from parent" msgstr "Von Gruppe trennen" #. Swapping allowed #: ../gtk/src/hocr/OutputEditorHOCR.cc:797 #: ../qt/src/hocr/OutputEditorHOCR.cc:647 msgid "Swap" msgstr "Tauschen" #: ../gtk/src/hocr/OutputEditorHOCR.cc:821 #: ../qt/src/hocr/OutputEditorHOCR.cc:693 msgid "Add graphic region" msgstr "Graphikregion hinzufügen" #: ../gtk/src/hocr/OutputEditorHOCR.cc:824 #: ../qt/src/hocr/OutputEditorHOCR.cc:694 msgid "Add text block" msgstr "Textblock hinzufügen" #: ../gtk/src/hocr/OutputEditorHOCR.cc:828 #: ../qt/src/hocr/OutputEditorHOCR.cc:696 msgid "Add paragraph" msgstr "Paragraph hinzufügen" #: ../gtk/src/hocr/OutputEditorHOCR.cc:832 #: ../qt/src/hocr/OutputEditorHOCR.cc:698 msgid "Add line" msgstr "Zeile hinzufügen" #: ../gtk/src/hocr/OutputEditorHOCR.cc:836 #: ../qt/src/hocr/OutputEditorHOCR.cc:700 msgid "Add word" msgstr "Wort hinzufügen" #: ../gtk/src/hocr/OutputEditorHOCR.cc:852 #: ../qt/src/hocr/OutputEditorHOCR.cc:710 msgid "No suggestions" msgstr "Keine Vorschläge" #: ../gtk/src/hocr/OutputEditorHOCR.cc:858 #: ../qt/src/hocr/OutputEditorHOCR.cc:714 msgid "Add to dictionary" msgstr "Zum Wörterbuch hinzufügen" #: ../gtk/src/hocr/OutputEditorHOCR.cc:864 #: ../qt/src/hocr/OutputEditorHOCR.cc:716 msgid "Ignore word" msgstr "Wort ignorieren" #: ../gtk/src/hocr/OutputEditorHOCR.cc:926 #: ../gtk/src/hocr/OutputEditorHOCR.cc:965 #: ../qt/src/hocr/OutputEditorHOCR.cc:795 #: ../qt/src/hocr/OutputEditorHOCR.cc:832 msgid "hOCR HTML Files" msgstr "hOCR-HTML-Dateien" #: ../gtk/src/hocr/OutputEditorHOCR.cc:927 #: ../qt/src/hocr/OutputEditorHOCR.cc:795 msgid "Open hOCR File" msgstr "hOCR-Datei öffnen" #: ../gtk/src/hocr/OutputEditorHOCR.cc:936 #: ../qt/src/hocr/OutputEditorHOCR.cc:802 msgid "Failed to open file" msgstr "Datei konnte nicht geöffnet werden" #: ../gtk/src/hocr/OutputEditorHOCR.cc:936 #: ../qt/src/hocr/OutputEditorHOCR.cc:802 msgid "The file could not be opened: %1." msgstr "Die Datei konnte nicht geöffnet werden: %1." #: ../gtk/src/hocr/OutputEditorHOCR.cc:945 #: ../qt/src/hocr/OutputEditorHOCR.cc:809 msgid "Invalid hOCR file" msgstr "Ungültige hOCR-Datei" #: ../gtk/src/hocr/OutputEditorHOCR.cc:945 #: ../qt/src/hocr/OutputEditorHOCR.cc:809 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/hocr/OutputEditorHOCR.cc:966 #: ../qt/src/hocr/OutputEditorHOCR.cc:832 msgid "Save hOCR Output..." msgstr "hOCR-Ausgabe speichern..." #: ../gtk/src/hocr/OutputEditorHOCR.cc:973 ../gtk/src/OutputEditorText.cc:282 #: ../qt/src/hocr/OutputEditorHOCR.cc:839 ../qt/src/OutputEditorText.cc:246 msgid "Failed to save output" msgstr "Konnte Ausgabe nicht speichern" #: ../gtk/src/hocr/OutputEditorHOCR.cc:973 ../gtk/src/OutputEditorText.cc:282 #: ../qt/src/hocr/OutputEditorHOCR.cc:839 ../qt/src/OutputEditorText.cc:246 msgid "Check that you have writing permissions in the selected folder." msgstr "Kontrollieren Sie, ob Sie Schreibrechte im gewählten Ordner besitzen." #: ../gtk/src/hocr/OutputEditorHOCR.cc:1035 ../gtk/src/OutputEditorText.cc:296 #: ../qt/src/hocr/OutputEditorHOCR.cc:894 ../qt/src/OutputEditorText.cc:259 msgid "Output not saved" msgstr "Ausgabe nicht gespeichert" #: ../gtk/src/hocr/OutputEditorHOCR.cc:1035 ../gtk/src/OutputEditorText.cc:296 #: ../qt/src/hocr/OutputEditorHOCR.cc:894 ../qt/src/OutputEditorText.cc:259 msgid "Save output before proceeding?" msgstr "Ausgabe vor dem Fortsetzen speichern?" #: ../gtk/src/hocr/OutputEditorHOCR.cc:1156 ../gtk/src/OutputEditorText.cc:184 #: ../qt/src/hocr/OutputEditorHOCR.cc:991 ../qt/src/OutputEditorText.cc:152 msgid "Replacing..." msgstr "Ersetzen läuft..." #: ../gtk/src/hocr/OutputEditorHOCR.cc:1181 ../gtk/src/OutputEditorText.cc:192 #: ../qt/src/hocr/OutputEditorHOCR.cc:1014 ../qt/src/OutputEditorText.cc:160 msgid "Applying substitutions..." msgstr "Ersetzungen werden durchgeführt..." #: ../gtk/src/MainWindow.cc:131 ../qt/src/MainWindow.cc:295 msgid "Using tesseract" msgstr "Verwendet tesseract" #: ../gtk/src/MainWindow.cc:178 ../qt/src/MainWindow.cc:194 msgid "Select an image to begin..." msgstr "Zum Starten ein Bild wählen..." #: ../gtk/src/MainWindow.cc:293 ../qt/src/MainWindow.cc:278 msgid "Multiple sources" msgstr "Mehrere Quellen" #: ../gtk/src/MainWindow.cc:295 ../qt/src/MainWindow.cc:280 msgid "Ready" msgstr "Bereit" #: ../gtk/src/MainWindow.cc:442 ../qt/src/MainWindow.cc:423 msgid "New version" msgstr "Neue Version" #: ../gtk/src/MainWindow.cc:442 ../qt/src/MainWindow.cc:423 msgid "gImageReader %1 is available" msgstr "gImageReader %1 ist erhältlich" #: ../gtk/src/MainWindow.cc:443 ../qt/src/MainWindow.cc:424 msgid "Download" msgstr "Herunterladen" #: ../gtk/src/MainWindow.cc:444 ../qt/src/MainWindow.cc:425 msgid "Changelog" msgstr "Änderungshistorie" #: ../gtk/src/MainWindow.cc:445 ../qt/src/MainWindow.cc:426 msgid "Don't notify again" msgstr "Nicht mehr fragen" #: ../gtk/src/MainWindow.cc:466 ../qt/src/MainWindow.cc:474 msgid "Don't show again" msgstr "Nicht mehr zeigen" #: ../gtk/src/MainWindow.cc:467 ../gtk/src/MainWindow.cc:480 #: ../qt/src/MainWindow.cc:475 msgid "Install" msgstr "Installieren" #: ../gtk/src/MainWindow.cc:487 ../qt/src/MainWindow.cc:487 msgid "Spelling dictionary missing" msgstr "Rechtschreibwörterbuch fehlt" #: ../gtk/src/MainWindow.cc:487 ../qt/src/MainWindow.cc:487 msgid "The spellcheck dictionary for %1 is not installed" msgstr "Das Rechtschreibwörterbuch für %1 ist nicht installiert" #: ../gtk/src/MainWindow.cc:494 ../gtk/src/MainWindow.cc:523 #: ../qt/src/MainWindow.cc:493 msgid "Installing spelling dictionary for '%1'" msgstr "Rechtschreibwörterbuch für '%1' wird installiert" #: ../gtk/src/MainWindow.cc:515 ../gtk/src/MainWindow.cc:536 #: ../gtk/src/MainWindow.cc:544 ../gtk/src/MainWindow.cc:592 #: ../gtk/src/MainWindow.cc:597 ../gtk/src/TessdataManager.cc:60 #: ../gtk/src/TessdataManager.cc:70 ../gtk/src/TessdataManager.cc:339 #: ../qt/src/MainWindow.cc:512 ../qt/src/MainWindow.cc:525 #: ../qt/src/MainWindow.cc:534 ../qt/src/MainWindow.cc:578 #: ../qt/src/MainWindow.cc:583 ../qt/src/TessdataManager.cc:74 #: ../qt/src/TessdataManager.cc:84 ../qt/src/TessdataManager.cc:315 msgid "Error" msgstr "Fehler" #: ../gtk/src/MainWindow.cc:515 ../qt/src/MainWindow.cc:512 msgid "Failed to install spelling dictionary: %1" msgstr "Rechtschreibwörterbuch konnte nicht installiert werden: %1" #: ../gtk/src/MainWindow.cc:536 ../qt/src/MainWindow.cc:525 msgid "Failed to create directory for spelling dictionaries." msgstr "Ordner für Rechtschreibwörterbücher konnte nicht erstellt werden." #: ../gtk/src/MainWindow.cc:544 ../qt/src/MainWindow.cc:534 msgid "Could not read %1: %2." msgstr "%1 konnte nicht gelesen werden: %2" #: ../gtk/src/MainWindow.cc:571 ../qt/src/MainWindow.cc:558 msgid "Downloading '%1'..." msgstr "'%1' wird heruntergeladen..." #: ../gtk/src/MainWindow.cc:592 ../qt/src/MainWindow.cc:578 msgid "" "The following dictionaries could not be downloaded:\n" "%1\n" "\n" "Check the connectivity and directory permissions.\n" "Hint: If you don't have write permissions in system folders, you can switch " "to user paths in the settings dialog." msgstr "" "Folgende Wörterbücher konnten nicht heruntergeladen werden:\n" "%1\n" "\n" "Überprüfe die Netzverbindung sowie die Schreibrechte.\n" "Hinweis: Falls der Benutzer keine Schreibrechte in den Systemordner hat, " "kann im Einstellungsdialog auf Benutzerprofilordner gewechselt werden." #: ../gtk/src/MainWindow.cc:595 ../qt/src/MainWindow.cc:581 msgid "Dictionaries installed" msgstr "Rechtschreibwörterbücher installiert" #: ../gtk/src/MainWindow.cc:595 msgid "" "The following dictionaries were installed:\n" "%1" msgstr "" "Folgende Rechtschreibwörterbücher wurden installiert:\n" "%1" #: ../gtk/src/MainWindow.cc:597 ../qt/src/MainWindow.cc:583 msgid "No spelling dictionaries found for '%1'." msgstr "Kein Rechtschreibwörterbuch für '%1' gefunden." #: ../gtk/src/OutputEditorText.cc:154 ../qt/src/OutputEditorText.cc:137 msgid "Stripping line breaks..." msgstr "Zeilenumbrüche werden entfernt..." #: ../gtk/src/OutputEditorText.cc:162 msgid "Check spelling" msgstr "Rechtschreibprüfung" #: ../gtk/src/OutputEditorText.cc:231 ../qt/src/OutputEditorText.cc:196 msgid "File: %1" msgstr "Datei: %1" #: ../gtk/src/OutputEditorText.cc:234 ../qt/src/OutputEditorText.cc:199 msgid "Page: %1" msgstr "Seite: %1" #: ../gtk/src/OutputEditorText.cc:247 ../gtk/src/Recognizer.cc:471 #: ../qt/src/Recognizer.cc:462 msgid "" "\n" "[Failed to recognize page %1]\n" msgstr "" "\n" "[Seite %1 konnte nicht erkannt werden]\n" #: ../gtk/src/OutputEditorText.cc:275 ../qt/src/OutputEditorText.cc:239 msgid "Save Output..." msgstr "Ausgabe speichern..." #: ../gtk/src/Recognizer.cc:179 ../qt/src/Recognizer.cc:172 msgid "No languages available" msgstr "Keine Sprachen verfügbar" #: ../gtk/src/Recognizer.cc:179 ../qt/src/Recognizer.cc:172 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:233 ../qt/src/Recognizer.cc:232 msgid "Multilingual" msgstr "Mehrsprachig" #: ../gtk/src/Recognizer.cc:285 ../qt/src/Recognizer.cc:277 msgid "Automatic page segmentation" msgstr "Automatische Seitensegmentierung" #: ../gtk/src/Recognizer.cc:286 ../qt/src/Recognizer.cc:278 msgid "Page segmentation with orientation and script detection" msgstr "Seitensegmentierung mit Orientierung- und Skripterkennung" #: ../gtk/src/Recognizer.cc:287 ../qt/src/Recognizer.cc:279 msgid "Assume single column of text" msgstr "Eine einzelne Textspalte annehmen" #: ../gtk/src/Recognizer.cc:288 ../qt/src/Recognizer.cc:280 msgid "Assume single block of vertically aligned text" msgstr "Ein einzelner Block vertikal ausgerichteter Text annehmen" #: ../gtk/src/Recognizer.cc:289 ../qt/src/Recognizer.cc:281 msgid "Assume a single uniform block of text" msgstr "Ein einzelner einheitlicher Textblock annehmen" #: ../gtk/src/Recognizer.cc:290 ../qt/src/Recognizer.cc:282 msgid "Assume a line of text" msgstr "Eine einzelne Textlinie annehmen" #: ../gtk/src/Recognizer.cc:291 ../qt/src/Recognizer.cc:283 msgid "Assume a single word" msgstr "Ein einzelnes Wort annehmen" #: ../gtk/src/Recognizer.cc:292 ../qt/src/Recognizer.cc:284 msgid "Assume a single word in a circle" msgstr "Ein einzelnes Wort in einem Kreis annehmen" #: ../gtk/src/Recognizer.cc:293 ../qt/src/Recognizer.cc:285 msgid "Sparse text in no particular order" msgstr "Spärlicher Text in keiner bestimmten Reihenfolge" #: ../gtk/src/Recognizer.cc:294 ../qt/src/Recognizer.cc:286 msgid "Sparse text with orientation and script detection" msgstr "Spärlicher Text mit Orientierung- und Skripterkennung" #: ../gtk/src/Recognizer.cc:309 ../qt/src/Recognizer.cc:297 msgid "Page segmentation mode" msgstr "Seitensegmentierungsmodus" #: ../gtk/src/Recognizer.cc:313 ../qt/src/Recognizer.cc:300 msgid "Character whitelist / blacklist..." msgstr "Blacklist / Whitelist von Zeichen..." #: ../gtk/src/Recognizer.cc:319 ../qt/src/Recognizer.cc:305 msgid "Manage languages..." msgstr "Sprachen verwalten..." #: ../gtk/src/Recognizer.cc:375 ../qt/src/Recognizer.cc:369 msgid "Current selection" msgstr "Aktuelle Selektion" #: ../gtk/src/Recognizer.cc:465 ../qt/src/Recognizer.cc:455 msgid "Recognizing page %1 (%2 of %3)" msgstr "Erkennung von Seite %1 (%2 von %3) wird durchgeführt" #: ../gtk/src/Recognizer.cc:470 ../qt/src/Recognizer.cc:461 msgid "" "\n" "- Page %1: failed to render page" msgstr "" "\n" "- Seite %1: Seite konnte nicht gerendert werden" #: ../gtk/src/Recognizer.cc:501 ../gtk/src/Recognizer.cc:531 #: ../gtk/src/Recognizer.cc:544 ../qt/src/Recognizer.cc:491 #: ../qt/src/Recognizer.cc:521 ../qt/src/Recognizer.cc:534 msgid "Recognizing..." msgstr "Erkennung wird durchgeführt..." #: ../gtk/src/Recognizer.cc:505 ../gtk/src/Recognizer.cc:514 #: ../qt/src/Recognizer.cc:495 ../qt/src/Recognizer.cc:504 msgid "Recognition errors occurred" msgstr "Erkennungsfehler sind aufgetreten" #: ../gtk/src/Recognizer.cc:505 ../qt/src/Recognizer.cc:495 msgid "The following errors occurred:%1" msgstr "Folgende Fehler sind aufgetreten:%1" #: ../gtk/src/Recognizer.cc:514 ../qt/src/Recognizer.cc:504 msgid "Failed to initialize tesseract" msgstr "Tesseract konnte nicht initialisiert werden" #: ../gtk/src/scanner/ScannerSane.cc:84 ../gtk/src/scanner/ScannerTwain.cc:288 #: ../qt/src/scanner/ScannerSane.cc:85 ../qt/src/scanner/ScannerTwain.cc:286 msgid "Scan canceled" msgstr "Scan abgebrochen" #: ../gtk/src/scanner/ScannerSane.cc:159 ../gtk/src/scanner/ScannerTwain.cc:186 #: ../qt/src/scanner/ScannerSane.cc:159 ../qt/src/scanner/ScannerTwain.cc:178 msgid "No scanner specified" msgstr "Kein Scanner angegeben" #: ../gtk/src/scanner/ScannerSane.cc:168 ../gtk/src/scanner/ScannerTwain.cc:195 #: ../qt/src/scanner/ScannerSane.cc:168 ../qt/src/scanner/ScannerTwain.cc:187 msgid "Unable to connect to scanner" msgstr "Scanner nicht gefunden" #: ../gtk/src/scanner/ScannerSane.cc:403 ../gtk/src/scanner/ScannerTwain.cc:266 #: ../gtk/src/scanner/ScannerTwain.cc:292 ../qt/src/scanner/ScannerSane.cc:403 #: ../qt/src/scanner/ScannerTwain.cc:258 ../qt/src/scanner/ScannerTwain.cc:290 msgid "Unable to start scan" msgstr "Scan konnte nicht gestartet werden" #: ../gtk/src/scanner/ScannerSane.cc:411 ../gtk/src/scanner/ScannerSane.cc:461 #: ../gtk/src/scanner/ScannerTwain.cc:318 ../qt/src/scanner/ScannerSane.cc:411 #: ../qt/src/scanner/ScannerSane.cc:461 ../qt/src/scanner/ScannerTwain.cc:316 msgid "Error communicating with scanner" msgstr "Fehler in der Scanner-Kommunikation" #: ../gtk/src/scanner/ScannerSane.cc:520 ../qt/src/scanner/ScannerSane.cc:517 msgid "Failed to save image" msgstr "Das Bild konnte nicht gespeichert werden" #: ../gtk/src/scanner/ScannerSane.cc:800 ../qt/src/scanner/ScannerSane.cc:797 msgid "Operation is cancelled." msgstr "Prozess abgebrochen." #: ../gtk/src/scanner/ScannerSane.cc:802 ../qt/src/scanner/ScannerSane.cc:799 msgid "Device is busy." msgstr "Das Gerät ist beschäftigt." #: ../gtk/src/scanner/ScannerSane.cc:804 ../qt/src/scanner/ScannerSane.cc:801 msgid "Cover is opened." msgstr "Der Deckel ist offen." #: ../gtk/src/scanner/ScannerSane.cc:806 ../qt/src/scanner/ScannerSane.cc:803 msgid "Document feeder jammed." msgstr "Der Dokument-Feeder ist blockiert." #: ../gtk/src/scanner/ScannerSane.cc:808 ../qt/src/scanner/ScannerSane.cc:805 msgid "Document feeder out of documents." msgstr "Keine weitere Dokumente liegen im Feeder." #: ../gtk/src/scanner/ScannerSane.cc:810 ../qt/src/scanner/ScannerSane.cc:807 msgid "Access to scanner is denied." msgstr "Zugriff auf Scanner wurde verweigert." #: ../gtk/src/SourceManager.cc:118 ../qt/src/SourceManager.cc:124 msgid "PDFs with text" msgstr "PDFs mit Text" #: ../gtk/src/SourceManager.cc:118 ../qt/src/SourceManager.cc:124 msgid "" "These PDF files already contain text:\n" "%1" msgstr "" "Diese PDF Dateien enthalten bereits Text:\n" "%1" #: ../gtk/src/SourceManager.cc:127 ../qt/src/SourceManager.cc:132 msgid "Unable to open files" msgstr "Dateien konnten nicht geöffnet werden" #: ../gtk/src/SourceManager.cc:127 ../qt/src/SourceManager.cc:132 msgid "The following files could not be opened:%1" msgstr "Folgende Dateien konnten nicht geöffnet werden:%1" #: ../gtk/src/SourceManager.cc:141 ../qt/src/SourceManager.cc:143 msgid "Enter password for file '%1':" msgstr "Passwort für die Datei '%1' eingeben:" #: ../gtk/src/SourceManager.cc:197 ../qt/src/SourceManager.cc:214 msgid "Images and PDFs" msgstr "Bilder und PDFs" #: ../gtk/src/SourceManager.cc:202 ../qt/src/SourceManager.cc:215 msgid "Select Files" msgstr "Dateien auswählen" #: ../gtk/src/SourceManager.cc:208 ../qt/src/SourceManager.cc:226 msgid "Clipboard Error" msgstr "Fehler: Zwischenablage" #: ../gtk/src/SourceManager.cc:208 ../qt/src/SourceManager.cc:226 msgid "Failed to read the clipboard." msgstr "Zwischenablage konnte nicht gelesen werden." #: ../gtk/src/SourceManager.cc:212 ../qt/src/SourceManager.cc:230 #: ../qt/src/SourceManager.cc:236 msgid "Pasted %1" msgstr "%1 eingefügt" #: ../gtk/src/SourceManager.cc:224 ../qt/src/SourceManager.cc:243 msgid "Screenshot Error" msgstr "Fehler: Bildschirmfoto" #: ../gtk/src/SourceManager.cc:224 ../qt/src/SourceManager.cc:243 msgid "Failed to take screenshot." msgstr "Bildschirmfoto konnte nicht erstellt werden." #: ../gtk/src/SourceManager.cc:228 ../qt/src/SourceManager.cc:247 msgid "Screenshot %1" msgstr "Bildschirmfoto %1" #: ../gtk/src/SourceManager.cc:233 ../qt/src/SourceManager.cc:252 msgid "Saving image..." msgstr "Bild wird gespeichert..." #: ../gtk/src/SourceManager.cc:240 ../qt/src/SourceManager.cc:265 msgid "Cannot Write File" msgstr "Fehler beim Schreiben der Datei" #: ../gtk/src/SourceManager.cc:240 ../qt/src/SourceManager.cc:265 msgid "Could not write to %1." msgstr "Auf %1 konnte nicht geschrieben werden." #: ../gtk/src/SourceManager.cc:267 ../qt/src/SourceManager.cc:287 msgid "Delete File?" msgstr "Datei löschen?" #: ../gtk/src/SourceManager.cc:267 ../qt/src/SourceManager.cc:287 msgid "The following files will be deleted:%1" msgstr "Folgende Dateien werden gelöscht:%1" #: ../gtk/src/SourceManager.cc:332 ../qt/src/SourceManager.cc:338 msgid "Missing File" msgstr "Fehlende Datei" #: ../gtk/src/SourceManager.cc:332 ../qt/src/SourceManager.cc:338 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:33 ../qt/src/SubstitutionsManager.cc:73 msgid "Search for" msgstr "Suche nach" #: ../gtk/src/SubstitutionsManager.cc:34 ../qt/src/SubstitutionsManager.cc:73 msgid "Replace with" msgstr "Ersetzen mit" #: ../gtk/src/SubstitutionsManager.cc:69 ../gtk/src/SubstitutionsManager.cc:103 #: ../qt/src/SubstitutionsManager.cc:106 ../qt/src/SubstitutionsManager.cc:143 msgid "Substitutions List" msgstr "Ersetzungsliste" #: ../gtk/src/SubstitutionsManager.cc:70 ../qt/src/SubstitutionsManager.cc:106 msgid "Open Substitutions List" msgstr "Ersetzungsliste laden" #: ../gtk/src/SubstitutionsManager.cc:75 ../qt/src/SubstitutionsManager.cc:112 msgid "Error Reading File" msgstr "Fehler beim Lesen der Datei" #: ../gtk/src/SubstitutionsManager.cc:75 ../qt/src/SubstitutionsManager.cc:112 msgid "Unable to read '%1'." msgstr "Die Datei '%1' konnte nicht gelesen werden." #: ../gtk/src/SubstitutionsManager.cc:97 ../qt/src/SubstitutionsManager.cc:137 msgid "Errors Occurred Reading File" msgstr "Fehler beim Lesen der Datei" #: ../gtk/src/SubstitutionsManager.cc:97 ../qt/src/SubstitutionsManager.cc:137 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:104 ../qt/src/SubstitutionsManager.cc:143 msgid "Save Substitutions List" msgstr "Ersetzungsliste speichern" #: ../gtk/src/SubstitutionsManager.cc:110 ../qt/src/SubstitutionsManager.cc:149 msgid "Error Saving File" msgstr "Fehler beim Speichern der Datei" #: ../gtk/src/SubstitutionsManager.cc:110 ../qt/src/SubstitutionsManager.cc:149 msgid "Unable to write to '%1'." msgstr "Die Datei '%1' konnte nicht geschrieben werden." #: ../gtk/src/SubstitutionsManager.cc:127 ../qt/src/SubstitutionsManager.cc:162 msgid "Save List?" msgstr "Liste speichern?" #: ../gtk/src/SubstitutionsManager.cc:127 ../qt/src/SubstitutionsManager.cc:162 msgid "Do you want to save the current list?" msgstr "Soll die aktuelle Liste gespeichert werden?" #: ../gtk/src/TessdataManager.cc:60 ../qt/src/TessdataManager.cc:74 #, fuzzy msgid "" "A session connection to the PackageKit backend is required for managing " "system-wide tesseract language packs, but it was not found. This service is " "usually provided by a software-management application such as Gnome " "Software. Please install software which provides the necessary PackageKit " "interface, use other system package management software to manage the " "tesseract language packs directly, or switch to using 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:65 ../qt/src/TessdataManager.cc:79 msgid "Fetching available languages" msgstr "Liste der verfügbare Sprachen wird geladen" #: ../gtk/src/TessdataManager.cc:70 ../gtk/src/TessdataManager.cc:96 #: ../gtk/src/TessdataManager.cc:197 ../qt/src/TessdataManager.cc:84 #: ../qt/src/TessdataManager.cc:101 ../qt/src/TessdataManager.cc:197 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:104 ../qt/src/TessdataManager.cc:113 #: ../qt/src/TessdataManager.cc:122 msgid "Parsing error: %1" msgstr "Parsing-Fehler: %1" #: ../gtk/src/TessdataManager.cc:235 ../qt/src/TessdataManager.cc:232 msgid "Applying changes..." msgstr "Änderung werden übernommen..." #: ../gtk/src/TessdataManager.cc:297 ../qt/src/TessdataManager.cc:278 msgid "Failed to create directory for tessdata files." msgstr "Ordner für tessdata Sprachdefinitionen konnte nicht erstellt werden." #: ../gtk/src/TessdataManager.cc:306 ../qt/src/TessdataManager.cc:287 msgid "Downloading %1..." msgstr "'%1' wird heruntergeladen..." #: ../gtk/src/TessdataManager.cc:330 msgid "" "The following files could not be downloaded or removed:\n" "%1\n" "\n" "Check the connectivity and directory permissions.\n" "\n" "Hint: If you don't have write permissions in system folders, you can switch " "to user paths in the settings dialog." msgstr "" "Folgende Dateien konnten nicht heruntergeladen werden:\n" "%1\n" "\n" "Überprüfe die Netzverbindung sowie die Schreibrechte.\n" "Hinweis: Falls der Benutzer keine Schreibrechte in den Systemordner hat, " "kann im Einstellungsdialog auf Benutzerprofilordner gewechselt werden." #: ../gtk/src/Utils.cc:64 msgid "Yes" msgstr "Ja" #: ../gtk/src/Utils.cc:67 msgid "No" msgstr "Nein" #: ../gtk/src/Utils.cc:76 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/CrashHandler.ui.h:3 msgid "" "

Tesseract has " "aborted

Tesseract (the OCR engine) has aborted while " "recognizing text. This may occur if the used traineddatas are corrupt or " "incomplatible with the version of tesseract in use, or due to a bug in " "tesseract.

The stacktrace below may provide additional information " "about where the crash occured.

" msgstr "" "

Tesseract hat " "abgebrochen

Tesseract (die OCR engine) hat abgebrochen während " "des Erkennen des Textes. Dies kann passieren, falls die traineddata Datein " "korrupt oder mit der verwendeten Version von Tesseract inkompatibel sind, " "oder wegen eines Fehlers in Tesseract.

Der Stacktrace unten könnte " "weitere Informationen zum Ursprung des Fehlers liefern.

" #: ../qt/data/MainWindow.ui.h:17 msgid "Flatbed" msgstr "Flachbett" #: ../qt/data/MainWindow.ui.h:18 msgid "ADF Front" msgstr "ADF Vorseite" #: ../qt/data/MainWindow.ui.h:19 msgid "ADF Back" msgstr "ADF Rückseite" #: ../qt/data/MainWindow.ui.h:20 msgid "ADF Duplex" msgstr "ADF-Duplex" #. Remove & from some labels which designer insists in adding #: ../qt/data/MainWindow.ui.h:21 ../qt/src/Ui_MainWindow.hh:50 msgid "Sources" msgstr "Quellen" #: ../qt/data/MainWindow.ui.h:22 msgid "Zoom In" msgstr "Ansicht vergrößern" #: ../qt/data/MainWindow.ui.h:24 msgid "Zoom Out" msgstr "Ansicht verkleinern" #: ../qt/data/MainWindow.ui.h:26 msgid "Normal Size" msgstr "Originalgröße" #: ../qt/data/MainWindow.ui.h:28 msgid "Best Fit" msgstr "Anpassen" #: ../qt/data/MainWindow.ui.h:30 msgid "Rotate Left" msgstr "Gegen den Uhrzeigersinn drehen" #: ../qt/data/MainWindow.ui.h:31 msgid "Rotate left" msgstr "Gegen den Uhrzeigersinn drehen" #: ../qt/data/MainWindow.ui.h:32 msgid "Rotate Right" msgstr "Im Uhrzeigersinn drehen" #: ../qt/data/MainWindow.ui.h:33 msgid "Rotate right" msgstr "Im Uhrzeigersinn drehen" #: ../qt/data/MainWindow.ui.h:34 msgid "Image Controls" msgstr "Bildbearbeitung" #: ../qt/data/MainWindow.ui.h:36 msgid "Autodetect Layout" msgstr "Layout automatisch erkennen" #: ../qt/data/MainWindow.ui.h:38 msgid "Toggle Output Pane" msgstr "Ausgabebereich ein-/ausblenden" #: ../qt/data/PdfExportDialog.ui.h:5 msgid "Backend:" msgstr "Backend:" #: ../qt/data/PdfExportDialog.ui.h:8 msgid "Portrait" msgstr "Hochformat" #: ../qt/data/PdfExportDialog.ui.h:9 msgid "Landscape" msgstr "Querformat" #: ../qt/src/hocr/HOCRPdfExporter.cc:142 msgid "Failed to write to file" msgstr "Datei konnte nicht geschrieben werden" #. Output toolbar #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:55 #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:56 msgid "Open hOCR file" msgstr "hOCR-Datei öffnen" #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:57 #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:58 msgid "Save as hOCR text" msgstr "Als hOCR-Text speichern" #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:79 #: ../qt/src/Ui_OutputEditorText.hh:106 msgid "Find and Replace" msgstr "Suchen und ersetzen" #: ../qt/src/MainWindow.cc:581 msgid "" "The following dictionary files were installed:\n" "%1" msgstr "" "Folgende Rechtschreibwörterbücher wurden installiert:\n" "%1" #: ../qt/src/TessdataManager.cc:308 msgid "" "The following files could not be downloaded or removed:\n" "%1\n" "\n" "Check the connectivity and directory permissions.\n" "Hint: If you don't have write permissions in system folders, you can switch " "to user paths in the settings dialog." msgstr "" "Folgende Dateien konnten nicht heruntergeladen bzw. entfernt werden:\n" "%1\n" "\n" "Überprüfe die Netzverbindung sowie die Schreibrechte.\n" "Hinweis: Falls der Benutzer keine Schreibrechte in den Systemordner hat, " "kann im Einstellungsdialog auf Benutzerprofilordner gewechselt werden." #: ../qt/src/Ui_MainWindow.hh:51 msgid "Output" msgstr "Ausgabe" #: ../qt/src/Ui_MainWindow.hh:135 msgid "OCR mode:" msgstr "OCR-Modus:" #: ../qt/src/Ui_MainWindow.hh:209 msgid "Remove Image" msgstr "Bild entfernen" #: ../qt/src/Ui_MainWindow.hh:212 msgid "Delete Image" msgstr "Bild löschen" #: ../qt/src/Ui_MainWindow.hh:215 msgid "Clear List" msgstr "Liste leeren" #: ../qt/src/Ui_OutputEditorText.hh:101 msgid "Strip Line Breaks" msgstr "Zeilenumbrüche entfernen" #: ../qt/src/Ui_OutputEditorText.hh:115 msgid "Save Output" msgstr "Ausgabe speichern" #: ../qt/src/Ui_OutputEditorText.hh:117 msgid "Clear Output" msgstr "Ausgabe löschen" #~ msgid "The application has crashed" #~ msgstr "Die Anwendung ist abgestürzt" #~ 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." #~ msgid "Could not read %1: %2" #~ msgstr "%1 konnte nicht gelesen werden: %2" #~ msgid "gImageReader" #~ msgstr "gImageReader" #~ msgid "PoDoFo" #~ msgstr "PoDoFo" #~ msgid "QPrinter" #~ msgstr "QPrinter" #~ 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 "90" #~ msgstr "90" #~ msgid "300" #~ msgstr "300" #~ msgid "100" #~ msgstr "100" #~ msgid "10" #~ msgstr "10" #~ msgid "%" #~ msgstr "%" #~ msgid "4" #~ msgstr "4" #~ msgid "1" #~ msgstr "1" #~ msgid "Document font:" #~ msgstr "Schriftart:" #~ msgid "Scale:" #~ msgstr "Skalierung:" #~ msgid "Document" #~ msgstr "Dokumentu" #~ msgid "Errors occurred" #~ msgstr "Erkennungsfehler sind aufgetreten" #~ msgid "" #~ "The following pages could not be rendered:\n" #~ "%1" #~ msgstr "" #~ "Folgende Seiten konnten nicht gerendert werden:\n" #~ "%1" #~ msgid "substitution_list.txt" #~ msgstr "substitutionen.txt" #~ 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.3.1/po/el.po000066400000000000000000002247511351740627400154340ustar00rootroot00000000000000# 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: 2019-07-25 23:17+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" #: ../data/gimagereader.desktop.in.h:1 msgid "OCR application" msgstr "" #: ../gtk/data/appmenu.ui.h:1 ../qt/src/Ui_MainWindow.hh:167 msgid "Redetect Languages" msgstr "Επανανίχνευση" #: ../gtk/data/appmenu.ui.h:2 ../qt/src/Ui_MainWindow.hh:170 #, fuzzy msgid "Manage Languages" msgstr "ΔιαχείÏιση γλωσσών..." #: ../gtk/data/appmenu.ui.h:3 ../gtk/data/ConfigDialog.ui.h:1 #: ../qt/data/ConfigDialog.ui.h:1 ../qt/src/Ui_MainWindow.hh:173 msgid "Preferences" msgstr "ΠÏοτιμήσεις" #: ../gtk/data/appmenu.ui.h:4 ../gtk/data/ConfigDialog.ui.h:2 #: ../gtk/src/MainWindow.cc:482 ../qt/src/MainWindow.cc:481 #: ../qt/src/Ui_MainWindow.hh:178 msgid "Help" msgstr "Βοήθεια" #: ../gtk/data/appmenu.ui.h:5 ../qt/data/AboutDialog.ui.h:2 #: ../qt/src/Ui_MainWindow.hh:181 msgid "About" msgstr "ΠεÏί" #: ../gtk/data/appmenu.ui.h:6 msgid "Quit" msgstr "Έξοδος" #: ../gtk/data/ConfigDialog.ui.h:3 ../gtk/data/MainWindow.ui.h:47 #: ../gtk/data/OutputEditorHOCR.ui.h:3 ../gtk/data/PdfExportDialog.ui.h:3 #: ../gtk/src/FileDialogs.cc:152 ../gtk/src/Utils.cc:61 #: ../qt/data/ConfigDialog.ui.h:26 msgid "OK" msgstr "Εντάξει" #: ../gtk/data/ConfigDialog.ui.h:4 msgid "Output pane orientation:" msgstr "ΠÏοσανατολισμός παÏαθÏÏου εξόδου:" #: ../gtk/data/ConfigDialog.ui.h:5 msgid "Horizontal" msgstr "ΟÏιζόντιος" #: ../gtk/data/ConfigDialog.ui.h:6 msgid "Vertical" msgstr "Κάθετος" #: ../gtk/data/ConfigDialog.ui.h:7 ../qt/data/ConfigDialog.ui.h:18 msgid "Query to install missing spellcheck dictionaries" msgstr "ΕÏώτηση για εγκατάσταση λεξικών οÏθογÏÎ±Ï†Î¹ÎºÎ¿Ï ÎµÎ»Î­Î³Ï‡Î¿Ï… που λείπουν" #: ../gtk/data/ConfigDialog.ui.h:8 ../qt/data/ConfigDialog.ui.h:4 msgid "Automatically check for new program versions" msgstr "Αυτόματος έλεγχος για νέες εκδόσεις του Ï€ÏογÏάμματος" #: ../gtk/data/ConfigDialog.ui.h:9 ../qt/data/ConfigDialog.ui.h:3 msgid "Predefined language definitions:" msgstr "ΠÏοκαθοÏισμένοι οÏισμοί γλωσσών:" #: ../gtk/data/ConfigDialog.ui.h:10 ../qt/data/ConfigDialog.ui.h:12 msgid "Additional language definitions:" msgstr "ΠÏόσθετοι οÏισμοί γλωσσών:" #: ../gtk/data/ConfigDialog.ui.h:11 ../qt/data/ConfigDialog.ui.h:20 msgid "The prefix of the tesseract language data file" msgstr "Το Ï€Ïόθημα του αÏχείου δεδομένων γλώσσας του tesseract" #: ../gtk/data/ConfigDialog.ui.h:12 ../qt/data/ConfigDialog.ui.h:21 msgid "Prefix" msgstr "ΠÏόθημα" #: ../gtk/data/ConfigDialog.ui.h:13 ../qt/data/ConfigDialog.ui.h:22 msgid "The ISO 639-1 language code followed by the country code" msgstr "Ο κωδικός γλώσσας ISO 639-1 ακολουθοÏμενος από τον κωδικό της χώÏας" #: ../gtk/data/ConfigDialog.ui.h:14 ../qt/data/ConfigDialog.ui.h:23 msgid "ISO Code" msgstr "Κωδικός ISO" #: ../gtk/data/ConfigDialog.ui.h:15 ../qt/data/ConfigDialog.ui.h:24 msgid "The name of the language" msgstr "Το όνομα της γλώσσας" #: ../gtk/data/ConfigDialog.ui.h:16 ../qt/data/ConfigDialog.ui.h:25 msgid "Name" msgstr "Όνομα" #: ../gtk/data/ConfigDialog.ui.h:17 ../gtk/data/MainWindow.ui.h:46 #: ../gtk/data/OutputEditorHOCR.ui.h:2 ../gtk/data/PdfExportDialog.ui.h:2 #: ../gtk/src/Acquirer.cc:34 ../gtk/src/FileDialogs.cc:151 #: ../gtk/src/Utils.cc:70 ../qt/data/ConfigDialog.ui.h:27 #: ../qt/data/MainWindow.ui.h:12 msgid "Cancel" msgstr "ΑκÏÏωση" #: ../gtk/data/ConfigDialog.ui.h:18 ../qt/data/ConfigDialog.ui.h:5 msgid "Output pane font:" msgstr "ΓÏαμματοσειÏά παÏαθÏÏου εξόδου:" #: ../gtk/data/ConfigDialog.ui.h:19 ../qt/data/ConfigDialog.ui.h:2 msgid "Default" msgstr "ΠÏοεπιλογή" #: ../gtk/data/ConfigDialog.ui.h:20 ../qt/data/ConfigDialog.ui.h:6 msgid "Language data locations:" msgstr "Τοποθεσίες δεδομένων γλώσσας:" #: ../gtk/data/ConfigDialog.ui.h:21 ../qt/data/ConfigDialog.ui.h:13 msgid "Language definitions path:" msgstr "ΔιαδÏομή οÏισμών γλώσσας:" #: ../gtk/data/ConfigDialog.ui.h:22 ../qt/data/ConfigDialog.ui.h:28 msgid "Spelling dictionaries path:" msgstr "ΔιαδÏομή οÏθογÏαφικών λεξικών:" #: ../gtk/data/ConfigDialog.ui.h:23 ../qt/data/ConfigDialog.ui.h:10 msgid "System-wide paths" msgstr "ΔιαδÏομές ολόκληÏου του συστήματος" #: ../gtk/data/ConfigDialog.ui.h:24 ../qt/data/ConfigDialog.ui.h:11 msgid "User paths" msgstr "ΔιαδÏομές χÏήστη" #: ../gtk/data/ConfigDialog.ui.h:25 ../qt/data/ConfigDialog.ui.h:29 msgid "Automatically open exported documents with default application" msgstr "" #: ../gtk/data/CrashHandler.ui.h:1 ../qt/src/CrashHandler.cc:38 msgid "Regenerate backtrace" msgstr "ΕπαναδημιουÏγία οπισθοανίχνευσης" #: ../gtk/data/CrashHandler.ui.h:3 #, fuzzy, no-c-format msgid "" "The application has crashed\n" "\n" "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/CrashHandler.ui.h:6 msgid "" "Tesseract has aborted\n" "\n" "Tesseract (the OCR engine) has aborted while recognizing text. This may " "occur if the used traineddatas are corrupt or incomplatible with the version " "of tesseract in use, or due to a bug in tesseract.\n" "\n" "The stacktrace below may provide additional information about where the " "crash occured.\n" msgstr "" #: ../gtk/data/MainWindow.ui.h:1 ../qt/data/MainWindow.ui.h:39 msgid "Toggle output pane" msgstr "Εναλλαγή παÏαθÏÏου εξόδου" #: ../gtk/data/MainWindow.ui.h:2 ../qt/src/Ui_MainWindow.hh:66 msgid "Rotate current page" msgstr "ΠεÏιστÏοφή Ï„Ïέχουσας σελίδας" #: ../gtk/data/MainWindow.ui.h:3 ../qt/src/Ui_MainWindow.hh:67 msgid "Rotate all pages" msgstr "ΠεÏιστÏοφή όλων των σελίδων" #. Sources toolbar #: ../gtk/data/MainWindow.ui.h:4 ../qt/src/Ui_MainWindow.hh:192 msgid "Recent" msgstr "ΠÏόσφατα" #: ../gtk/data/MainWindow.ui.h:5 ../qt/src/Ui_MainWindow.hh:193 msgid "Paste" msgstr "Επικόλληση" #: ../gtk/data/MainWindow.ui.h:6 ../qt/src/Ui_MainWindow.hh:194 msgid "Take Screenshot" msgstr "Λήψη στιγμιοτÏπου" #: ../gtk/data/MainWindow.ui.h:7 ../qt/data/MainWindow.ui.h:23 msgid "Zoom in" msgstr "Μεγέθυνση" #: ../gtk/data/MainWindow.ui.h:8 ../qt/data/MainWindow.ui.h:25 msgid "Zoom out" msgstr "ΣμίκÏυνση" #: ../gtk/data/MainWindow.ui.h:9 ../qt/data/MainWindow.ui.h:27 msgid "Normal size" msgstr "Κανονικό μέγεθος" #: ../gtk/data/MainWindow.ui.h:10 ../qt/data/MainWindow.ui.h:29 msgid "Best fit" msgstr "ΆÏιστη Ï€ÏοσαÏμογή" #: ../gtk/data/MainWindow.ui.h:11 ../qt/src/Ui_MainWindow.hh:75 msgid "Select rotation mode" msgstr "Επιλογή κατάστασης πεÏιστÏοφής" #: ../gtk/data/MainWindow.ui.h:12 ../gtk/data/OutputEditorText.ui.h:13 #: ../qt/src/Ui_OutputEditorText.hh:95 msgid "Select insert mode" msgstr "Επιλογή κατάστασης εισαγωγής" #: ../gtk/data/MainWindow.ui.h:13 ../qt/src/Ui_MainWindow.hh:109 #, fuzzy msgid "Select page" msgstr "Επιλογή γλώσσας" #: ../gtk/data/MainWindow.ui.h:14 ../qt/data/MainWindow.ui.h:35 msgid "Image controls" msgstr "Στοιχεία ελέγχου εικόνας" #: ../gtk/data/MainWindow.ui.h:15 ../qt/src/Ui_MainWindow.hh:139 msgid "Plain text" msgstr "Απλό κείμενο" #: ../gtk/data/MainWindow.ui.h:16 ../qt/src/Ui_MainWindow.hh:139 msgid "hOCR, PDF" msgstr "hOCR, PDF" #: ../gtk/data/MainWindow.ui.h:17 ../qt/data/MainWindow.ui.h:37 msgid "Autodetect layout" msgstr "Αυτόματη ανίχνευση διάταξης" #: ../gtk/data/MainWindow.ui.h:18 msgid "Recognize all" msgstr "ΑναγνώÏιση όλων" #: ../gtk/data/MainWindow.ui.h:19 msgid "Select language" msgstr "Επιλογή γλώσσας" #: ../gtk/data/MainWindow.ui.h:20 ../qt/src/Ui_MainWindow.hh:205 msgid "Add images" msgstr "ΠÏοσθήκη εικόνων" #: ../gtk/data/MainWindow.ui.h:21 ../qt/src/Ui_MainWindow.hh:204 msgid "Add Images" msgstr "ΠÏοσθήκη εικόνων" #: ../gtk/data/MainWindow.ui.h:22 ../qt/src/Ui_MainWindow.hh:210 msgid "Remove image from list" msgstr "ΑφαίÏεση εικόνας από τη λίστα" #: ../gtk/data/MainWindow.ui.h:23 ../qt/src/Ui_MainWindow.hh:213 msgid "Delete image" msgstr "ΔιαγÏαφή εικόνας" #: ../gtk/data/MainWindow.ui.h:24 ../qt/src/Ui_MainWindow.hh:216 msgid "Clear list" msgstr "ΚαθαÏισμός λίστας" #: ../gtk/data/MainWindow.ui.h:25 ../qt/data/MainWindow.ui.h:5 msgid "Files" msgstr "ΑÏχεία" #: ../gtk/data/MainWindow.ui.h:26 ../qt/data/MainWindow.ui.h:8 msgid "Device:" msgstr "Συσκευή:" #: ../gtk/data/MainWindow.ui.h:27 ../gtk/data/TessdataManager.ui.h:4 #: ../qt/data/MainWindow.ui.h:7 ../qt/src/TessdataManager.cc:59 msgid "Refresh" msgstr "Ανανέωση" #: ../gtk/data/MainWindow.ui.h:28 ../qt/data/MainWindow.ui.h:9 msgid "Output:" msgstr "Έξοδος:" #: ../gtk/data/MainWindow.ui.h:29 ../qt/data/MainWindow.ui.h:13 msgid "Mode:" msgstr "Κατάσταση:" #: ../gtk/data/MainWindow.ui.h:30 ../gtk/src/hocr/HOCRPdfExporter.cc:313 #: ../qt/data/MainWindow.ui.h:15 ../qt/src/hocr/HOCRPdfExporter.cc:347 msgid "Color" msgstr "ΧÏώμα" #: ../gtk/data/MainWindow.ui.h:31 ../gtk/src/hocr/HOCRPdfExporter.cc:316 #: ../qt/data/MainWindow.ui.h:14 ../qt/src/hocr/HOCRPdfExporter.cc:349 #: ../qt/src/hocr/HOCRPdfExporter.cc:351 msgid "Grayscale" msgstr "Κλίμακα του γκÏίζου" #: ../gtk/data/MainWindow.ui.h:32 ../qt/data/MainWindow.ui.h:10 msgid "Resolution:" msgstr "Ανάλυση:" #: ../gtk/data/MainWindow.ui.h:33 ../qt/data/MainWindow.ui.h:11 msgid "Scan" msgstr "ΣάÏωση" #: ../gtk/data/MainWindow.ui.h:34 ../qt/data/MainWindow.ui.h:16 #, fuzzy msgid "Source:" msgstr "ΠÏοέλευση" #: ../gtk/data/MainWindow.ui.h:35 ../qt/data/MainWindow.ui.h:6 msgid "Acquire" msgstr "Λήψη" #: ../gtk/data/MainWindow.ui.h:36 ../qt/data/MainWindow.ui.h:1 msgid "Brightness" msgstr "Φωτεινότητα" #: ../gtk/data/MainWindow.ui.h:37 ../qt/data/MainWindow.ui.h:2 msgid "Contrast" msgstr "Αντίθεση" #: ../gtk/data/MainWindow.ui.h:38 ../qt/data/MainWindow.ui.h:3 msgid "Resolution" msgstr "Ανάλυση" #: ../gtk/data/MainWindow.ui.h:39 ../qt/data/MainWindow.ui.h:4 msgid "Invert colors" msgstr "ΑντιστÏοφή χÏωμάτων" #: ../gtk/data/MainWindow.ui.h:40 msgid "A graphical frontend to tesseract-ocr" msgstr "Μια γÏαφική διεπαφή χÏήστη στο tesseract-ocr" #: ../gtk/data/MainWindow.ui.h:41 ../qt/data/CharacterListDialog.ui.h:1 msgid "Character whitelist / blacklist" msgstr "" #: ../gtk/data/MainWindow.ui.h:42 ../qt/data/CharacterListDialog.ui.h:2 msgid "Exclude these characters from being recognized (blacklist):" msgstr "" #: ../gtk/data/MainWindow.ui.h:43 ../qt/data/CharacterListDialog.ui.h:3 #, fuzzy msgid "Enter a string of characters..." msgstr "Λήψη παÏαμέτÏων..." #: ../gtk/data/MainWindow.ui.h:44 ../qt/data/CharacterListDialog.ui.h:4 msgid "Only allow the following characters to be recognized (whitelist):" msgstr "" #: ../gtk/data/MainWindow.ui.h:45 ../qt/data/PageRangeDialog.ui.h:1 msgid "Page Range" msgstr "ΠεÏιοχή σελίδων" #: ../gtk/data/MainWindow.ui.h:48 ../qt/data/PageRangeDialog.ui.h:2 msgid "Page range:" msgstr "ΠεÏιοχή σελίδων:" #: ../gtk/data/MainWindow.ui.h:49 ../qt/data/PageRangeDialog.ui.h:3 msgid "Example: 1-10, 13, 14-18" msgstr "ΠαÏάδειγμα: 1-10, 13, 14-18" #: ../gtk/data/MainWindow.ui.h:50 ../qt/data/PageRangeDialog.ui.h:4 msgid "Recognition area:" msgstr "ΠεÏιοχή αναγνώÏισης:" #: ../gtk/data/MainWindow.ui.h:51 ../gtk/src/Recognizer.cc:375 #: ../qt/data/PageRangeDialog.ui.h:5 ../qt/src/Recognizer.cc:369 msgid "Entire page" msgstr "ΟλόκληÏη σελίδα" #: ../gtk/data/MainWindow.ui.h:52 ../qt/data/PageRangeDialog.ui.h:6 msgid "Autodetect" msgstr "Αυτόματη ανίχνευση" #: ../gtk/data/MainWindow.ui.h:53 ../qt/data/PageRangeDialog.ui.h:7 #, fuzzy msgid "Prepend to output text:" msgstr "ΠÏοσάÏτηση στο υφιστάμενο κείμενο" #: ../gtk/data/MainWindow.ui.h:54 ../qt/data/PageRangeDialog.ui.h:8 msgid "Source filename" msgstr "" #: ../gtk/data/MainWindow.ui.h:55 ../qt/data/PageRangeDialog.ui.h:9 #, fuzzy msgid "Source page" msgstr "ΠÏοέλευση" #: ../gtk/data/MainWindow.ui.h:56 ../qt/src/SourceManager.cc:146 msgid "Protected PDF" msgstr "" #: ../gtk/data/MainWindow.ui.h:57 ../qt/src/Recognizer.cc:76 msgid "Current Page" msgstr "ΤÏέχουσα σελίδα" #: ../gtk/data/MainWindow.ui.h:58 ../qt/src/Recognizer.cc:79 msgid "Multiple Pages..." msgstr "Πολλαπλές σελίδες..." #: ../gtk/data/OutputEditorHOCR.ui.h:1 ../qt/src/hocr/OutputEditorHOCR.cc:580 msgid "Add Word" msgstr "" #: ../gtk/data/OutputEditorHOCR.ui.h:4 ../qt/src/hocr/OutputEditorHOCR.cc:580 #, fuzzy msgid "Enter word:" msgstr "ΠαÏάβλεψη λέξης" #: ../gtk/data/OutputEditorHOCR.ui.h:5 ../qt/src/hocr/Ui_OutputEditorHOCR.hh:61 #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:62 #, fuzzy msgid "Export to plain text" msgstr "Εξαγωγή σε PDF" #: ../gtk/data/OutputEditorHOCR.ui.h:6 ../qt/src/hocr/Ui_OutputEditorHOCR.hh:64 #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:65 msgid "Export to PDF" msgstr "Εξαγωγή σε PDF" #: ../gtk/data/OutputEditorHOCR.ui.h:7 ../qt/src/hocr/Ui_OutputEditorHOCR.hh:67 #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:68 #, fuzzy msgid "Export to ODT" msgstr "Εξαγωγή σε PDF" #: ../gtk/data/OutputEditorHOCR.ui.h:8 ../gtk/data/OutputEditorText.ui.h:18 #: ../qt/src/Ui_OutputEditorText.hh:116 msgid "Save output" msgstr "Αποθήκευση εξόδου" #: ../gtk/data/OutputEditorHOCR.ui.h:9 ../qt/src/hocr/Ui_OutputEditorHOCR.hh:72 #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:73 #, fuzzy msgid "Export" msgstr "Εξαγωγή ως PDF" #: ../gtk/data/OutputEditorHOCR.ui.h:10 ../gtk/data/OutputEditorText.ui.h:19 #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:77 #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:78 #: ../qt/src/Ui_OutputEditorText.hh:118 msgid "Clear output" msgstr "ΚαθαÏισμός εξόδου" #: ../gtk/data/OutputEditorHOCR.ui.h:11 ../gtk/data/OutputEditorText.ui.h:15 #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:80 #: ../qt/src/Ui_OutputEditorText.hh:107 msgid "Find and replace" msgstr "ΕÏÏεση και αντικατάσταση" #: ../gtk/data/OutputEditorHOCR.ui.h:12 #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:82 #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:83 msgid "Show confidence values" msgstr "" #: ../gtk/data/OutputEditorHOCR.ui.h:13 ../gtk/data/PdfExportDialog.ui.h:41 #: ../qt/data/PdfExportDialog.ui.h:2 ../qt/src/hocr/Ui_OutputEditorHOCR.hh:85 #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:86 msgid "Show preview" msgstr "Εμφάνιση Ï€Ïοεπισκόπησης" #: ../gtk/data/OutputEditorHOCR.ui.h:14 #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:121 msgid "Next (F3)" msgstr "" #: ../gtk/data/OutputEditorHOCR.ui.h:15 #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:122 msgid "Previous (Shift+F3)" msgstr "" #: ../gtk/data/OutputEditorHOCR.ui.h:16 ../gtk/src/hocr/OutputEditorHOCR.cc:890 #: ../qt/src/hocr/OutputEditorHOCR.cc:730 #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:126 msgid "Expand all" msgstr "Ανάπτυξη" #: ../gtk/data/OutputEditorHOCR.ui.h:17 ../gtk/src/hocr/OutputEditorHOCR.cc:893 #: ../qt/src/hocr/OutputEditorHOCR.cc:731 #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:127 msgid "Collapse all" msgstr "ΣÏμπτυξη" #: ../gtk/data/OutputEditorHOCR.ui.h:18 #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:148 msgid "Properties" msgstr "Ιδιότητες" #: ../gtk/data/OutputEditorHOCR.ui.h:19 #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:152 msgid "Source" msgstr "ΠÏοέλευση" #. Output insert mode #: ../gtk/data/OutputEditorText.ui.h:1 ../qt/src/Ui_OutputEditorText.hh:52 msgid "Append to current text" msgstr "ΠÏοσάÏτηση στο υφιστάμενο κείμενο" #: ../gtk/data/OutputEditorText.ui.h:2 ../qt/src/Ui_OutputEditorText.hh:53 msgid "Insert at cursor" msgstr "Εισαγωγή στον δÏομέα" #: ../gtk/data/OutputEditorText.ui.h:3 ../qt/src/Ui_OutputEditorText.hh:54 msgid "Replace current text" msgstr "Αντικατάσταση του υφιστάμενου κειμένου" #. Output postprocessing #: ../gtk/data/OutputEditorText.ui.h:4 ../qt/src/Ui_OutputEditorText.hh:62 msgid "Keep line break if..." msgstr "ΔιατήÏηση της αλλαγής γÏαμμής αν..." #: ../gtk/data/OutputEditorText.ui.h:5 ../qt/src/Ui_OutputEditorText.hh:64 msgid "Preceded by end mark (.?!)" msgstr "ΠÏοηγείται ένδειξη τέλους (.?!)" #: ../gtk/data/OutputEditorText.ui.h:6 ../qt/src/Ui_OutputEditorText.hh:66 msgid "Preceded or succeeded by quote" msgstr "ΠÏοηγοÏνται ή ακολουθοÏν εισαγωγικά" #: ../gtk/data/OutputEditorText.ui.h:7 ../qt/src/Ui_OutputEditorText.hh:68 msgid "Other options" msgstr "Άλλες επιλογές" #: ../gtk/data/OutputEditorText.ui.h:8 ../qt/src/Ui_OutputEditorText.hh:70 msgid "Join hyphenated words" msgstr "Ένωση λέξεων με ενωτικό" #: ../gtk/data/OutputEditorText.ui.h:9 ../qt/src/Ui_OutputEditorText.hh:72 msgid "Collapse whitespace" msgstr "ΣÏμπτυξη ÎºÎµÎ½Î¿Ï Î´Î¹Î±ÏƒÏ„Î®Î¼Î±Ï„Î¿Ï‚" #: ../gtk/data/OutputEditorText.ui.h:10 ../qt/src/Ui_OutputEditorText.hh:74 msgid "Preserve paragraphs" msgstr "ΔιατήÏηση παÏαγÏάφων" #: ../gtk/data/OutputEditorText.ui.h:11 ../qt/src/Ui_OutputEditorText.hh:76 msgid "Visual aids" msgstr "Οπτικά βοηθήματα" #: ../gtk/data/OutputEditorText.ui.h:12 ../qt/src/Ui_OutputEditorText.hh:78 msgid "Draw whitespace" msgstr "ΧάÏαξη ÎºÎµÎ½Î¿Ï Î´Î¹Î±ÏƒÏ„Î®Î¼Î±Ï„Î¿Ï‚" #: ../gtk/data/OutputEditorText.ui.h:14 ../qt/src/Ui_OutputEditorText.hh:102 msgid "Strip line breaks on selected text" msgstr "ΑφαίÏεση αλλαγών γÏαμμής στο επιλεγμένο κείμενο" #: ../gtk/data/OutputEditorText.ui.h:16 ../qt/src/Ui_OutputEditorText.hh:109 #: ../qt/src/Ui_OutputEditorText.hh:110 msgid "Undo" msgstr "ΑναίÏεση" #: ../gtk/data/OutputEditorText.ui.h:17 ../qt/src/Ui_OutputEditorText.hh:112 #: ../qt/src/Ui_OutputEditorText.hh:113 msgid "Redo" msgstr "ΑκÏÏωση αναίÏεσης" #: ../gtk/data/PdfExportDialog.ui.h:1 ../qt/data/PdfExportDialog.ui.h:1 msgid "PDF Export" msgstr "Εξαγωγή ως PDF" #: ../gtk/data/PdfExportDialog.ui.h:4 ../qt/data/PdfExportDialog.ui.h:4 msgid "Output mode:" msgstr "Κατάσταση εξόδου:" #: ../gtk/data/PdfExportDialog.ui.h:5 ../qt/data/PdfExportDialog.ui.h:6 msgid "PDF" msgstr "PDF" #: ../gtk/data/PdfExportDialog.ui.h:6 ../qt/data/PdfExportDialog.ui.h:7 msgid "PDF with invisible text overlay" msgstr "PDF με αόÏατη επικάλυψη κειμένου" #: ../gtk/data/PdfExportDialog.ui.h:7 ../qt/data/PdfExportDialog.ui.h:16 msgid "Format:" msgstr "ΜοÏφή:" #: ../gtk/data/PdfExportDialog.ui.h:8 ../qt/data/PdfExportDialog.ui.h:17 msgid "Compression:" msgstr "Συμπίεση:" #: ../gtk/data/PdfExportDialog.ui.h:9 ../qt/data/PdfExportDialog.ui.h:14 msgid "Compression quality:" msgstr "Ποιότητα συμπίεσης:" #: ../gtk/data/PdfExportDialog.ui.h:10 ../qt/data/PdfExportDialog.ui.h:15 msgid "DPI:" msgstr "DPI:" #: ../gtk/data/PdfExportDialog.ui.h:11 ../qt/data/PdfExportDialog.ui.h:18 msgid "Dithering algorithm:" msgstr "ΑλγόÏιθμος Ï€Ïόσμειξης:" #: ../gtk/data/PdfExportDialog.ui.h:12 ../qt/data/PdfExportDialog.ui.h:13 msgid "Image settings:" msgstr "Ρυθμίσεις εικόνας:" #: ../gtk/data/PdfExportDialog.ui.h:13 ../qt/data/PdfExportDialog.ui.h:25 msgid "Uniformize line and word spacing" msgstr "Ομογενοποίηση γÏαμμής και απόστασης λέξης" #: ../gtk/data/PdfExportDialog.ui.h:14 ../qt/data/PdfExportDialog.ui.h:21 msgid "Override font family:" msgstr "" #: ../gtk/data/PdfExportDialog.ui.h:15 ../qt/data/PdfExportDialog.ui.h:27 msgid "Fallback font family:" msgstr "" #: ../gtk/data/PdfExportDialog.ui.h:16 ../qt/data/PdfExportDialog.ui.h:20 #, fuzzy msgid "Override font size:" msgstr "ΧÏήση των μεγεθών γÏαμματοσειÏάς που ανιχνεÏτηκαν" #: ../gtk/data/PdfExportDialog.ui.h:17 ../qt/data/PdfExportDialog.ui.h:23 msgid "Font scaling:" msgstr "" #: ../gtk/data/PdfExportDialog.ui.h:18 ../qt/data/PdfExportDialog.ui.h:26 msgid "pt" msgstr "" #: ../gtk/data/PdfExportDialog.ui.h:19 ../qt/data/PdfExportDialog.ui.h:22 msgid "Preserve spaces wider than:" msgstr "ΔιατήÏηση διαστημάτων μεγαλÏτεÏων από:" #: ../gtk/data/PdfExportDialog.ui.h:20 ../qt/data/PdfExportDialog.ui.h:24 msgid "characters" msgstr "χαÏακτήÏες" #: ../gtk/data/PdfExportDialog.ui.h:21 ../qt/data/PdfExportDialog.ui.h:28 msgid "Sanitize hyphens before line breaks" msgstr "" #: ../gtk/data/PdfExportDialog.ui.h:22 ../qt/data/PdfExportDialog.ui.h:19 msgid "Text settings:" msgstr "Ρυθμίσεις κειμένου:" #: ../gtk/data/PdfExportDialog.ui.h:23 ../qt/data/PdfExportDialog.ui.h:10 msgid "Paper size:" msgstr "" #: ../gtk/data/PdfExportDialog.ui.h:24 ../qt/data/PdfExportDialog.ui.h:11 msgid "Width" msgstr "" #: ../gtk/data/PdfExportDialog.ui.h:25 ../qt/data/PdfExportDialog.ui.h:12 msgid "Height" msgstr "" #: ../gtk/data/PdfExportDialog.ui.h:26 ../qt/data/PdfExportDialog.ui.h:29 msgid "Treat image sources as having true DPI:" msgstr "" #: ../gtk/data/PdfExportDialog.ui.h:27 ../qt/data/PdfExportDialog.ui.h:3 msgid "Basic" msgstr "" #: ../gtk/data/PdfExportDialog.ui.h:28 ../qt/data/PdfExportDialog.ui.h:31 #, fuzzy msgid "PDF version:" msgstr "Îέα έκδοση" #: ../gtk/data/PdfExportDialog.ui.h:29 ../qt/data/PdfExportDialog.ui.h:33 msgid "Password:" msgstr "" #: ../gtk/data/PdfExportDialog.ui.h:30 ../qt/data/PdfExportDialog.ui.h:34 msgid "Confirm password:" msgstr "" #: ../gtk/data/PdfExportDialog.ui.h:31 ../qt/data/PdfExportDialog.ui.h:32 msgid "Encryption (optional):" msgstr "" #: ../gtk/data/PdfExportDialog.ui.h:32 ../qt/data/PdfExportDialog.ui.h:36 msgid "Author:" msgstr "" #: ../gtk/data/PdfExportDialog.ui.h:33 ../qt/data/PdfExportDialog.ui.h:38 msgid "Title:" msgstr "" #: ../gtk/data/PdfExportDialog.ui.h:34 ../qt/data/PdfExportDialog.ui.h:40 msgid "Subject:" msgstr "" #: ../gtk/data/PdfExportDialog.ui.h:35 ../qt/data/PdfExportDialog.ui.h:37 msgid "Creator:" msgstr "" #: ../gtk/data/PdfExportDialog.ui.h:36 ../qt/data/PdfExportDialog.ui.h:39 msgid "Producer:" msgstr "" #: ../gtk/data/PdfExportDialog.ui.h:37 ../qt/data/PdfExportDialog.ui.h:41 msgid "Keywords:" msgstr "" #: ../gtk/data/PdfExportDialog.ui.h:38 ../qt/data/PdfExportDialog.ui.h:35 #, fuzzy msgid "Additional information (optional):" msgstr "ΠÏόσθετοι οÏισμοί γλωσσών:" #: ../gtk/data/PdfExportDialog.ui.h:39 ../qt/data/PdfExportDialog.ui.h:42 msgid "Import from current source" msgstr "" #: ../gtk/data/PdfExportDialog.ui.h:40 ../qt/data/PdfExportDialog.ui.h:30 msgid "Advanced" msgstr "" #: ../gtk/data/SearchReplaceFrame.ui.h:1 ../qt/data/SearchReplaceFrame.ui.h:4 msgid "Find" msgstr "ΕÏÏεση" #: ../gtk/data/SearchReplaceFrame.ui.h:2 ../qt/data/SearchReplaceFrame.ui.h:2 msgid "Replace" msgstr "Αντικατάσταση" #: ../gtk/data/SearchReplaceFrame.ui.h:3 ../qt/data/SearchReplaceFrame.ui.h:3 msgid "Replace all" msgstr "Αντικατάσταση όλων" #: ../gtk/data/SearchReplaceFrame.ui.h:4 ../qt/data/SearchReplaceFrame.ui.h:5 msgid "Find previous" msgstr "ΕÏÏεση Ï€ÏοηγοÏμενου" #: ../gtk/data/SearchReplaceFrame.ui.h:5 ../qt/data/SearchReplaceFrame.ui.h:6 msgid "Find next" msgstr "ΕÏÏεση επόμενου" #: ../gtk/data/SearchReplaceFrame.ui.h:6 ../qt/data/SearchReplaceFrame.ui.h:7 msgid "Match case" msgstr "ΤαίÏιασμα πεζών-κεφαλαίων" #: ../gtk/data/SearchReplaceFrame.ui.h:7 #: ../gtk/data/SubstitutionsManager.ui.h:1 ../qt/data/SearchReplaceFrame.ui.h:1 #: ../qt/src/SubstitutionsManager.cc:36 msgid "Substitutions" msgstr "Υποκαταστάσεις" #: ../gtk/data/SelectionMenu.ui.h:1 ../qt/src/DisplayerToolSelect.cc:239 msgid "Delete" msgstr "ΔιαγÏαφή" #: ../gtk/data/SelectionMenu.ui.h:2 ../qt/src/DisplayerToolSelect.cc:225 msgid "Order:" msgstr "ΣειÏά:" #: ../gtk/data/SelectionMenu.ui.h:3 ../gtk/src/hocr/DisplayerToolHOCR.cc:29 #: ../qt/src/DisplayerToolSelect.cc:240 ../qt/src/hocr/DisplayerToolHOCR.cc:31 msgid "Recognize" msgstr "ΑναγνώÏιση" #: ../gtk/data/SelectionMenu.ui.h:4 ../qt/src/DisplayerToolSelect.cc:241 msgid "Recognize to clipboard" msgstr "Η αναγνώÏιση στο Ï€ÏόχειÏο" #: ../gtk/data/SelectionMenu.ui.h:5 ../qt/src/DisplayerToolSelect.cc:242 msgid "Save as image" msgstr "Αποθήκευση ως εικόνα" #: ../gtk/data/SubstitutionsManager.ui.h:2 ../qt/src/SubstitutionsManager.cc:38 #: ../qt/src/SubstitutionsManager.cc:39 msgid "Open" msgstr "Άνοιγμα" #: ../gtk/data/SubstitutionsManager.ui.h:3 ../gtk/src/Utils.cc:73 #: ../qt/src/SubstitutionsManager.cc:41 ../qt/src/SubstitutionsManager.cc:42 msgid "Save" msgstr "Αποθήκευση" #: ../gtk/data/SubstitutionsManager.ui.h:4 ../qt/src/SubstitutionsManager.cc:44 #: ../qt/src/SubstitutionsManager.cc:45 msgid "Clear" msgstr "ΚαθαÏισμός" #: ../gtk/data/SubstitutionsManager.ui.h:5 ../qt/data/ConfigDialog.ui.h:16 #: ../qt/src/SubstitutionsManager.cc:47 ../qt/src/SubstitutionsManager.cc:48 msgid "Add" msgstr "ΠÏοσθήκη" #: ../gtk/data/SubstitutionsManager.ui.h:6 #: ../gtk/src/hocr/OutputEditorHOCR.cc:886 ../qt/data/ConfigDialog.ui.h:17 #: ../qt/src/hocr/OutputEditorHOCR.cc:727 ../qt/src/SubstitutionsManager.cc:50 #: ../qt/src/SubstitutionsManager.cc:51 msgid "Remove" msgstr "ΑφαίÏεση" #: ../gtk/data/SubstitutionsManager.ui.h:7 ../gtk/data/TessdataManager.ui.h:2 msgid "Apply" msgstr "ΕφαÏμογή" #: ../gtk/data/SubstitutionsManager.ui.h:8 ../gtk/data/TessdataManager.ui.h:3 msgid "Close" msgstr "Κλείσιμο" #: ../gtk/data/TessdataManager.ui.h:1 ../qt/src/TessdataManager.cc:49 msgid "Tessdata Manager" msgstr "ΔιαχειÏιστής Tessdata" #: ../gtk/data/TessdataManager.ui.h:5 ../qt/src/TessdataManager.cc:51 msgid "Manage installed languages:" msgstr "ΔιαχείÏιση εγκατεστημένων γλωσσών:" #: ../gtk/src/Acquirer.cc:79 ../qt/src/Acquirer.cc:70 msgid "scan.png" msgstr "σαÏωμένο.png" #: ../gtk/src/Acquirer.cc:91 ../qt/src/Acquirer.cc:85 msgid "Images" msgstr "Εικόνες" #: ../gtk/src/Acquirer.cc:92 ../qt/src/Acquirer.cc:86 msgid "Choose Output Filename..." msgstr "Επιλογή ονόματος αÏχείου εξόδου..." #: ../gtk/src/Acquirer.cc:106 ../qt/src/Acquirer.cc:100 msgid "Failed to initialize the scanning backend." msgstr "Αποτυχία αÏχικοποίησης της παÏασκηνιακής σάÏωσης" #: ../gtk/src/Acquirer.cc:115 ../qt/src/Acquirer.cc:106 msgid "Scan failed" msgstr "Αποτυχία σάÏωσης" #: ../gtk/src/Acquirer.cc:133 ../qt/src/Acquirer.cc:122 msgid "No scanners were detected." msgstr "Δεν ανιχνεÏτηκαν σαÏωτές." #: ../gtk/src/Acquirer.cc:150 ../gtk/src/Acquirer.cc:168 #: ../qt/src/Acquirer.cc:136 ../qt/src/Acquirer.cc:154 msgid "Starting scan..." msgstr "ΈναÏξη σάÏωσης..." #: ../gtk/src/Acquirer.cc:164 ../qt/src/Acquirer.cc:150 msgid "Opening device..." msgstr "Άνοιγμα συσκευής..." #: ../gtk/src/Acquirer.cc:166 ../qt/src/Acquirer.cc:152 msgid "Setting options..." msgstr "ΟÏισμός επιλογών..." #: ../gtk/src/Acquirer.cc:170 ../qt/src/Acquirer.cc:156 msgid "Getting parameters..." msgstr "Λήψη παÏαμέτÏων..." #: ../gtk/src/Acquirer.cc:172 ../qt/src/Acquirer.cc:158 msgid "Transferring data..." msgstr "ΜεταφοÏά δεδομένων..." #: ../gtk/src/Acquirer.cc:179 ../qt/src/Acquirer.cc:165 msgid "Canceling scan..." msgstr "ΑκÏÏωση σάÏωσης..." #: ../gtk/src/Config.cc:49 ../qt/data/ConfigDialog.ui.h:7 msgid "Filename prefix" msgstr "ΠÏόθημα ονόματος αÏχείου" #: ../gtk/src/Config.cc:50 ../qt/data/ConfigDialog.ui.h:8 msgid "Code" msgstr "Κωδικός" #: ../gtk/src/Config.cc:51 ../qt/data/ConfigDialog.ui.h:9 msgid "Native name" msgstr "Τοπικό όνομα" #: ../gtk/src/Config.cc:109 ../qt/src/Config.cc:108 msgid "Script" msgstr "" #: ../gtk/src/CrashHandler.cc:25 ../gtk/src/CrashHandler.cc:41 #: ../qt/src/CrashHandler.cc:36 msgid "Crash Handler" msgstr "ΧειÏισμός κατάÏÏευσης" #: ../gtk/src/CrashHandler.cc:43 ../qt/src/CrashHandler.cc:31 msgid "Your work has been saved under %1." msgstr "Η εÏγασία σας έχει αποθηκευτεί στο %1." #: ../gtk/src/CrashHandler.cc:45 ../qt/src/CrashHandler.cc:33 msgid "There was no unsaved work." msgstr "Δεν υπάÏχει καμία μη αποθηκευμένη εÏγασία." #: ../gtk/src/CrashHandler.cc:106 ../qt/src/CrashHandler.cc:62 msgid "Failed to obtain backtrace. Is gdb installed?" msgstr "Αποτυχία λήψης οπισθοανίχνευσης. Είναι εγκατεστημένο το gdb;" #: ../gtk/src/Displayer.cc:232 ../qt/src/Displayer.cc:174 msgid "Failed to load image" msgstr "Αποτυχία φόÏτωσης εικόνας" #: ../gtk/src/Displayer.cc:232 ../qt/src/Displayer.cc:174 msgid "" "The file might not be an image or be corrupt:\n" "%1" msgstr "" "Το αÏχείο μποÏεί να μην είναι εικόνα ή να είναι αλλοιωμένο:\n" "%1" #: ../gtk/src/DisplayerToolSelect.cc:138 ../qt/src/DisplayerToolSelect.cc:135 msgid "PNG Images" msgstr "Εικόνες PNG" #: ../gtk/src/DisplayerToolSelect.cc:139 ../qt/src/DisplayerToolSelect.cc:135 msgid "Save Selection Image" msgstr "Αποθήκευση εικόνας επιλογής" #: ../gtk/src/DisplayerToolSelect.cc:139 ../qt/src/DisplayerToolSelect.cc:135 msgid "selection.png" msgstr "επιλεγμένο.png" #: ../gtk/src/DisplayerToolSelect.cc:146 ../qt/src/DisplayerToolSelect.cc:142 msgid "Recognize all" msgstr "ΑναγνώÏιση όλων" #: ../gtk/src/DisplayerToolSelect.cc:146 ../qt/src/DisplayerToolSelect.cc:142 msgid "Recognize selection" msgstr "ΑναγνώÏιση επιλογής" #: ../gtk/src/DisplayerToolSelect.cc:186 ../qt/src/DisplayerToolSelect.cc:182 msgid "Performing layout analysis" msgstr "Εκτέλεση ανάλυσης διάταξης" #: ../gtk/src/FileDialogs.cc:235 msgid "" "A file named \"%1\" already exists. Are you sure you want to overwrite it?" msgstr "" "ΥπάÏχει ήδη ένα αÏχείο με όνομα \"%1\". Είσαστε βέβαιοι ότι θέλετε να το " "αντικαταστήσετε;" #: ../gtk/src/FileDialogs.cc:237 msgid "Overwrite File?" msgstr "Îα αντικατασταθεί το αÏχείο;" #: ../gtk/src/hocr/HOCRDocument.cc:611 ../gtk/src/hocr/OutputEditorHOCR.cc:266 #: ../qt/src/hocr/OutputEditorHOCR.cc:229 #, fuzzy msgid "Page" msgstr "Ανάλυση του σφάλματος: %1" #: ../gtk/src/hocr/HOCRDocument.cc:613 ../qt/src/hocr/HOCRDocument.cc:530 #, fuzzy msgid "Text block" msgstr "ΑÏχεία κειμένου" #: ../gtk/src/hocr/HOCRDocument.cc:615 ../gtk/src/hocr/OutputEditorHOCR.cc:272 #: ../qt/src/hocr/HOCRDocument.cc:532 ../qt/src/hocr/OutputEditorHOCR.cc:231 msgid "Paragraph" msgstr "ΠαÏάγÏαφος" #: ../gtk/src/hocr/HOCRDocument.cc:617 ../qt/src/hocr/HOCRDocument.cc:534 msgid "Textline" msgstr "ΓÏαμμή κειμένου" #: ../gtk/src/hocr/HOCRDocument.cc:621 ../qt/src/hocr/HOCRDocument.cc:538 msgid "Graphic" msgstr "ΓÏαφικό" #: ../gtk/src/hocr/HOCROdtExporter.cc:65 ../gtk/src/hocr/HOCRPdfExporter.cc:489 #: ../gtk/src/hocr/HOCRTextExporter.cc:34 #: ../gtk/src/hocr/OutputEditorHOCR.cc:963 ../gtk/src/OutputEditorText.cc:272 #: ../qt/src/hocr/HOCROdtExporter.cc:50 ../qt/src/hocr/HOCRPdfExporter.cc:478 #: ../qt/src/hocr/HOCRTextExporter.cc:36 ../qt/src/hocr/OutputEditorHOCR.cc:830 #: ../qt/src/OutputEditorText.cc:238 msgid "output" msgstr "έξοδος" #: ../gtk/src/hocr/HOCROdtExporter.cc:68 ../qt/src/hocr/HOCROdtExporter.cc:53 msgid "OpenDocument Text Documents" msgstr "" #: ../gtk/src/hocr/HOCROdtExporter.cc:69 ../qt/src/hocr/HOCROdtExporter.cc:53 #, fuzzy msgid "Save ODT Output..." msgstr "Αποθήκευση εξόδου PDF..." #: ../gtk/src/hocr/HOCROdtExporter.cc:77 ../gtk/src/hocr/HOCROdtExporter.cc:342 #: ../gtk/src/hocr/HOCRPdfExporter.cc:619 #: ../gtk/src/hocr/HOCRTextExporter.cc:46 ../qt/src/hocr/HOCROdtExporter.cc:61 #: ../qt/src/hocr/HOCRPdfExporter.cc:609 ../qt/src/hocr/HOCRTextExporter.cc:47 msgid "Export failed" msgstr "" #: ../gtk/src/hocr/HOCROdtExporter.cc:77 ../gtk/src/hocr/HOCROdtExporter.cc:342 #: ../qt/src/hocr/HOCROdtExporter.cc:61 msgid "The ODT export failed: unable to write output file." msgstr "" #: ../gtk/src/hocr/HOCROdtExporter.cc:336 ../qt/src/hocr/HOCROdtExporter.cc:254 #, fuzzy msgid "Exporting to ODT..." msgstr "Εξαγωγή σε PDF" #: ../gtk/src/hocr/HOCRPdfExporter.cc:283 ../qt/src/hocr/HOCRPdfExporter.cc:365 #, fuzzy msgid "Same as source" msgstr "ΠÏοέλευση" #: ../gtk/src/hocr/HOCRPdfExporter.cc:286 ../qt/src/hocr/HOCRPdfExporter.cc:366 msgid "Custom" msgstr "" #: ../gtk/src/hocr/HOCRPdfExporter.cc:300 ../qt/src/hocr/HOCRPdfExporter.cc:362 msgid "cm" msgstr "" #: ../gtk/src/hocr/HOCRPdfExporter.cc:303 ../qt/src/hocr/HOCRPdfExporter.cc:363 #, fuzzy msgid "in" msgstr "ΕÏÏεση" #: ../gtk/src/hocr/HOCRPdfExporter.cc:319 ../qt/src/hocr/HOCRPdfExporter.cc:353 msgid "Monochrome" msgstr "ΜονόχÏωμο" #: ../gtk/src/hocr/HOCRPdfExporter.cc:328 ../qt/src/hocr/HOCRPdfExporter.cc:355 msgid "Threshold (closest color)" msgstr "Κατώφλι (το πιο κοντινό χÏώμα)" #: ../gtk/src/hocr/HOCRPdfExporter.cc:331 ../qt/src/hocr/HOCRPdfExporter.cc:356 msgid "Diffuse" msgstr "Διάχυση" #: ../gtk/src/hocr/HOCRPdfExporter.cc:340 ../qt/src/hocr/HOCRPdfExporter.cc:357 msgid "Zip (lossless)" msgstr "Συμπίεση (χωÏίς απώλειες)" #: ../gtk/src/hocr/HOCRPdfExporter.cc:344 ../qt/src/hocr/HOCRPdfExporter.cc:358 msgid "CCITT Group 4 (lossless)" msgstr "CCITT Ομάδα 4 (χωÏίς απώλειες)" #: ../gtk/src/hocr/HOCRPdfExporter.cc:348 ../qt/src/hocr/HOCRPdfExporter.cc:359 msgid "Jpeg (lossy)" msgstr "Jpeg (με απώλειες)" #: ../gtk/src/hocr/HOCRPdfExporter.cc:493 ../qt/src/hocr/HOCRPdfExporter.cc:482 msgid "PDF Files" msgstr "ΑÏχεία PDF" #: ../gtk/src/hocr/HOCRPdfExporter.cc:494 ../qt/src/hocr/HOCRPdfExporter.cc:482 msgid "Save PDF Output..." msgstr "Αποθήκευση εξόδου PDF..." #: ../gtk/src/hocr/HOCRPdfExporter.cc:500 ../qt/src/hocr/HOCRPdfExporter.cc:488 #, fuzzy msgid "Invalid Output" msgstr "Αποθήκευση εξόδου" #: ../gtk/src/hocr/HOCRPdfExporter.cc:500 ../qt/src/hocr/HOCRPdfExporter.cc:488 msgid "Cannot overwrite a file which is a source image of this document." msgstr "" #: ../gtk/src/hocr/HOCRPdfExporter.cc:516 ../qt/src/hocr/HOCRPdfExporter.cc:511 #, fuzzy msgid "Failed to create output" msgstr "Αποτυχία αποθήκευσης εξόδου" #: ../gtk/src/hocr/HOCRPdfExporter.cc:516 ../qt/src/hocr/HOCRPdfExporter.cc:511 msgid "Failed to create output. The returned error was: %1" msgstr "" #: ../gtk/src/hocr/HOCRPdfExporter.cc:558 ../qt/src/hocr/HOCRPdfExporter.cc:551 msgid "The operation was cancelled" msgstr "" #: ../gtk/src/hocr/HOCRPdfExporter.cc:607 ../qt/src/hocr/HOCRPdfExporter.cc:597 #, fuzzy msgid "Failed to render page %1" msgstr "" "\n" "[Αποτυχία αναγνώÏισης της σελίδας %1]\n" #: ../gtk/src/hocr/HOCRPdfExporter.cc:614 ../qt/src/hocr/HOCRPdfExporter.cc:604 #, fuzzy msgid "Exporting to PDF..." msgstr "Εξαγωγή σε PDF" #: ../gtk/src/hocr/HOCRPdfExporter.cc:619 ../qt/src/hocr/HOCRPdfExporter.cc:609 msgid "The PDF export failed: %1." msgstr "" #: ../gtk/src/hocr/HOCRPdfExporter.cc:673 ../qt/src/hocr/HOCRPdfExporter.cc:662 #, fuzzy msgid "The PDF library could not load the font '%1'." msgstr "Η βιβλιοθήκη PDF δεν υποστηÏίζει την επιλεγμένη γÏαμματοσειÏά." #: ../gtk/src/hocr/HOCRTextExporter.cc:37 ../gtk/src/OutputEditorText.cc:274 #: ../qt/src/hocr/HOCRTextExporter.cc:39 ../qt/src/OutputEditorText.cc:239 msgid "Text Files" msgstr "ΑÏχεία κειμένου" #: ../gtk/src/hocr/HOCRTextExporter.cc:38 ../qt/src/hocr/HOCRTextExporter.cc:39 #, fuzzy msgid "Save Text Output..." msgstr "Αποθήκευση εξόδου..." #: ../gtk/src/hocr/HOCRTextExporter.cc:46 ../qt/src/hocr/HOCRTextExporter.cc:47 msgid "The text export failed: unable to write output file." msgstr "" #: ../gtk/src/hocr/OutputEditorHOCR.cc:269 #: ../qt/src/hocr/OutputEditorHOCR.cc:230 msgid "Block" msgstr "" #: ../gtk/src/hocr/OutputEditorHOCR.cc:275 #: ../qt/src/hocr/OutputEditorHOCR.cc:232 msgid "Line" msgstr "" #: ../gtk/src/hocr/OutputEditorHOCR.cc:278 #: ../qt/src/hocr/OutputEditorHOCR.cc:233 msgid "Word" msgstr "" #: ../gtk/src/hocr/OutputEditorHOCR.cc:281 #: ../qt/src/hocr/OutputEditorHOCR.cc:234 msgid "Misspelled word" msgstr "" #: ../gtk/src/hocr/OutputEditorHOCR.cc:435 #: ../qt/src/hocr/OutputEditorHOCR.cc:317 msgid "" "The following pages could not be processed:\n" "%1" msgstr "" "Οι παÏακάτω σελίδες δεν μπόÏεσαν να επεξεÏγαστοÏν:\n" "%1" #: ../gtk/src/hocr/OutputEditorHOCR.cc:436 #: ../qt/src/hocr/OutputEditorHOCR.cc:318 msgid "Recognition errors" msgstr "Σφάλματα αναγνώÏισης" #: ../gtk/src/hocr/OutputEditorHOCR.cc:594 #: ../qt/src/hocr/OutputEditorHOCR.cc:500 #: ../qt/src/hocr/OutputEditorHOCR.cc:512 #, fuzzy msgid "Multiple values" msgstr "Πολλαπλές Ï€ÏοελεÏσεις" #. Merging allowed #: ../gtk/src/hocr/OutputEditorHOCR.cc:778 #: ../qt/src/hocr/OutputEditorHOCR.cc:641 msgid "Merge" msgstr "Συγχώνευση" #: ../gtk/src/hocr/OutputEditorHOCR.cc:786 #: ../gtk/src/hocr/OutputEditorHOCR.cc:877 #: ../qt/src/hocr/OutputEditorHOCR.cc:643 #: ../qt/src/hocr/OutputEditorHOCR.cc:725 msgid "Split from parent" msgstr "" #. Swapping allowed #: ../gtk/src/hocr/OutputEditorHOCR.cc:797 #: ../qt/src/hocr/OutputEditorHOCR.cc:647 msgid "Swap" msgstr "" #: ../gtk/src/hocr/OutputEditorHOCR.cc:821 #: ../qt/src/hocr/OutputEditorHOCR.cc:693 msgid "Add graphic region" msgstr "ΠÏοσθήκη πεÏιοχής γÏαφικών" #: ../gtk/src/hocr/OutputEditorHOCR.cc:824 #: ../qt/src/hocr/OutputEditorHOCR.cc:694 msgid "Add text block" msgstr "" #: ../gtk/src/hocr/OutputEditorHOCR.cc:828 #: ../qt/src/hocr/OutputEditorHOCR.cc:696 #, fuzzy msgid "Add paragraph" msgstr "ΠαÏάγÏαφος" #: ../gtk/src/hocr/OutputEditorHOCR.cc:832 #: ../qt/src/hocr/OutputEditorHOCR.cc:698 #, fuzzy msgid "Add line" msgstr "ΠÏοσθήκη εικόνων" #: ../gtk/src/hocr/OutputEditorHOCR.cc:836 #: ../qt/src/hocr/OutputEditorHOCR.cc:700 msgid "Add word" msgstr "" #: ../gtk/src/hocr/OutputEditorHOCR.cc:852 #: ../qt/src/hocr/OutputEditorHOCR.cc:710 msgid "No suggestions" msgstr "ΧωÏίς Ï€Ïοτάσεις" #: ../gtk/src/hocr/OutputEditorHOCR.cc:858 #: ../qt/src/hocr/OutputEditorHOCR.cc:714 msgid "Add to dictionary" msgstr "ΠÏοσθήκη στο λεξικό" #: ../gtk/src/hocr/OutputEditorHOCR.cc:864 #: ../qt/src/hocr/OutputEditorHOCR.cc:716 msgid "Ignore word" msgstr "ΠαÏάβλεψη λέξης" #: ../gtk/src/hocr/OutputEditorHOCR.cc:926 #: ../gtk/src/hocr/OutputEditorHOCR.cc:965 #: ../qt/src/hocr/OutputEditorHOCR.cc:795 #: ../qt/src/hocr/OutputEditorHOCR.cc:832 msgid "hOCR HTML Files" msgstr "ΑÏχεία hOCR HTML" #: ../gtk/src/hocr/OutputEditorHOCR.cc:927 #: ../qt/src/hocr/OutputEditorHOCR.cc:795 msgid "Open hOCR File" msgstr "Άνοιγμα αÏχείου hOCR" #: ../gtk/src/hocr/OutputEditorHOCR.cc:936 #: ../qt/src/hocr/OutputEditorHOCR.cc:802 msgid "Failed to open file" msgstr "Αποτυχία ανοίγματος του αÏχείου" #: ../gtk/src/hocr/OutputEditorHOCR.cc:936 #: ../qt/src/hocr/OutputEditorHOCR.cc:802 msgid "The file could not be opened: %1." msgstr "Τα αÏχείο δεν μπόÏεσε να ανοιχθεί: %1" #: ../gtk/src/hocr/OutputEditorHOCR.cc:945 #: ../qt/src/hocr/OutputEditorHOCR.cc:809 msgid "Invalid hOCR file" msgstr "ΆκυÏο αÏχείο hOCR" #: ../gtk/src/hocr/OutputEditorHOCR.cc:945 #: ../qt/src/hocr/OutputEditorHOCR.cc:809 msgid "The file does not appear to contain valid hOCR HTML: %1" msgstr "Το αÏχείο δεν φαίνεται να πεÏιέχει έγκυÏο hOCR HTML: %1" #: ../gtk/src/hocr/OutputEditorHOCR.cc:966 #: ../qt/src/hocr/OutputEditorHOCR.cc:832 msgid "Save hOCR Output..." msgstr "Αποθήκευση εξόδου hOCR..." #: ../gtk/src/hocr/OutputEditorHOCR.cc:973 ../gtk/src/OutputEditorText.cc:282 #: ../qt/src/hocr/OutputEditorHOCR.cc:839 ../qt/src/OutputEditorText.cc:246 msgid "Failed to save output" msgstr "Αποτυχία αποθήκευσης εξόδου" #: ../gtk/src/hocr/OutputEditorHOCR.cc:973 ../gtk/src/OutputEditorText.cc:282 #: ../qt/src/hocr/OutputEditorHOCR.cc:839 ../qt/src/OutputEditorText.cc:246 msgid "Check that you have writing permissions in the selected folder." msgstr "Ελέγξτε ότι έχετε δικαίωμα εγγÏαφής στον επιλεγμένο φάκελο." #: ../gtk/src/hocr/OutputEditorHOCR.cc:1035 ../gtk/src/OutputEditorText.cc:296 #: ../qt/src/hocr/OutputEditorHOCR.cc:894 ../qt/src/OutputEditorText.cc:259 msgid "Output not saved" msgstr "Η έξοδος δεν αποθηκεÏτηκε" #: ../gtk/src/hocr/OutputEditorHOCR.cc:1035 ../gtk/src/OutputEditorText.cc:296 #: ../qt/src/hocr/OutputEditorHOCR.cc:894 ../qt/src/OutputEditorText.cc:259 msgid "Save output before proceeding?" msgstr "Αποθήκευση της εξόδου Ï€Ïιν την συνέχεια;" #: ../gtk/src/hocr/OutputEditorHOCR.cc:1156 ../gtk/src/OutputEditorText.cc:184 #: ../qt/src/hocr/OutputEditorHOCR.cc:991 ../qt/src/OutputEditorText.cc:152 msgid "Replacing..." msgstr "Αντικατάσταση..." #: ../gtk/src/hocr/OutputEditorHOCR.cc:1181 ../gtk/src/OutputEditorText.cc:192 #: ../qt/src/hocr/OutputEditorHOCR.cc:1014 ../qt/src/OutputEditorText.cc:160 msgid "Applying substitutions..." msgstr "ΕφαÏμόζονται υποκαταστάσεις..." #: ../gtk/src/MainWindow.cc:131 ../qt/src/MainWindow.cc:295 msgid "Using tesseract" msgstr "ΧÏήση του tesseract" #: ../gtk/src/MainWindow.cc:178 ../qt/src/MainWindow.cc:194 msgid "Select an image to begin..." msgstr "Επιλογή εικόνας για έναÏξη..." #: ../gtk/src/MainWindow.cc:293 ../qt/src/MainWindow.cc:278 msgid "Multiple sources" msgstr "Πολλαπλές Ï€ÏοελεÏσεις" #: ../gtk/src/MainWindow.cc:295 ../qt/src/MainWindow.cc:280 msgid "Ready" msgstr "Έτοιμος" #: ../gtk/src/MainWindow.cc:442 ../qt/src/MainWindow.cc:423 msgid "New version" msgstr "Îέα έκδοση" #: ../gtk/src/MainWindow.cc:442 ../qt/src/MainWindow.cc:423 msgid "gImageReader %1 is available" msgstr "Ο gImageReader %1 είναι διαθέσιμος" #: ../gtk/src/MainWindow.cc:443 ../qt/src/MainWindow.cc:424 msgid "Download" msgstr "ΜεταφόÏτωση" #: ../gtk/src/MainWindow.cc:444 ../qt/src/MainWindow.cc:425 msgid "Changelog" msgstr "ΑÏχείο αλλαγών" #: ../gtk/src/MainWindow.cc:445 ../qt/src/MainWindow.cc:426 msgid "Don't notify again" msgstr "Îα μην ξαναενημεÏωθώ" #: ../gtk/src/MainWindow.cc:466 ../qt/src/MainWindow.cc:474 msgid "Don't show again" msgstr "Îα μην ξαναεμφανιστεί" #: ../gtk/src/MainWindow.cc:467 ../gtk/src/MainWindow.cc:480 #: ../qt/src/MainWindow.cc:475 msgid "Install" msgstr "Εγκατάσταση" #: ../gtk/src/MainWindow.cc:487 ../qt/src/MainWindow.cc:487 msgid "Spelling dictionary missing" msgstr "Λείπει το οÏθογÏαφικό λεξικό" #: ../gtk/src/MainWindow.cc:487 ../qt/src/MainWindow.cc:487 msgid "The spellcheck dictionary for %1 is not installed" msgstr "Το οÏθογÏαφικό λεξικό για το %1 δεν είναι εγκατεστημένο" #: ../gtk/src/MainWindow.cc:494 ../gtk/src/MainWindow.cc:523 #: ../qt/src/MainWindow.cc:493 msgid "Installing spelling dictionary for '%1'" msgstr "Εγκατάσταση του οÏθογÏÎ±Ï†Î¹ÎºÎ¿Ï Î»ÎµÎ¾Î¹ÎºÎ¿Ï Î³Î¹Î± το '%1'" #: ../gtk/src/MainWindow.cc:515 ../gtk/src/MainWindow.cc:536 #: ../gtk/src/MainWindow.cc:544 ../gtk/src/MainWindow.cc:592 #: ../gtk/src/MainWindow.cc:597 ../gtk/src/TessdataManager.cc:60 #: ../gtk/src/TessdataManager.cc:70 ../gtk/src/TessdataManager.cc:339 #: ../qt/src/MainWindow.cc:512 ../qt/src/MainWindow.cc:525 #: ../qt/src/MainWindow.cc:534 ../qt/src/MainWindow.cc:578 #: ../qt/src/MainWindow.cc:583 ../qt/src/TessdataManager.cc:74 #: ../qt/src/TessdataManager.cc:84 ../qt/src/TessdataManager.cc:315 msgid "Error" msgstr "Σφάλμα" #: ../gtk/src/MainWindow.cc:515 ../qt/src/MainWindow.cc:512 msgid "Failed to install spelling dictionary: %1" msgstr "Αποτυχία εγκατάστασης του οÏθογÏÎ±Ï†Î¹ÎºÎ¿Ï Î»ÎµÎ¾Î¹ÎºÎ¿Ï: %1" #: ../gtk/src/MainWindow.cc:536 ../qt/src/MainWindow.cc:525 msgid "Failed to create directory for spelling dictionaries." msgstr "Αποτυχία δημιουÏγίας καταλόγου για οÏθογÏαφικά λεξικά." #: ../gtk/src/MainWindow.cc:544 ../qt/src/MainWindow.cc:534 msgid "Could not read %1: %2." msgstr "Αδυναμία ανάγνωσης του %1: %2." #: ../gtk/src/MainWindow.cc:571 ../qt/src/MainWindow.cc:558 msgid "Downloading '%1'..." msgstr "ΜεταφοÏτώνεται το '%1'..." #: ../gtk/src/MainWindow.cc:592 ../qt/src/MainWindow.cc:578 msgid "" "The following dictionaries could not be downloaded:\n" "%1\n" "\n" "Check the connectivity and directory permissions.\n" "Hint: If you don't have write permissions in system folders, you can switch " "to user paths in the settings dialog." msgstr "" #: ../gtk/src/MainWindow.cc:595 ../qt/src/MainWindow.cc:581 msgid "Dictionaries installed" msgstr "Εγκατεστημένα λεξικά" #: ../gtk/src/MainWindow.cc:595 #, fuzzy msgid "" "The following dictionaries were installed:\n" "%1" msgstr "Τα παÏακάτω λεξικά εγκαταστάθηκαν: %1" #: ../gtk/src/MainWindow.cc:597 ../qt/src/MainWindow.cc:583 msgid "No spelling dictionaries found for '%1'." msgstr "Δεν βÏέθηκαν οÏθογÏαφικά λεξικά για το '%1'." #: ../gtk/src/OutputEditorText.cc:154 ../qt/src/OutputEditorText.cc:137 msgid "Stripping line breaks..." msgstr "ΑφαίÏεση αλλαγών γÏαμμών..." #: ../gtk/src/OutputEditorText.cc:162 msgid "Check spelling" msgstr "ΟÏθογÏαφικός έλεγχος" #: ../gtk/src/OutputEditorText.cc:231 ../qt/src/OutputEditorText.cc:196 #, fuzzy msgid "File: %1" msgstr "ΑÏχεία" #: ../gtk/src/OutputEditorText.cc:234 ../qt/src/OutputEditorText.cc:199 #, fuzzy msgid "Page: %1" msgstr "Ανάλυση του σφάλματος: %1" #: ../gtk/src/OutputEditorText.cc:247 ../gtk/src/Recognizer.cc:471 #: ../qt/src/Recognizer.cc:462 msgid "" "\n" "[Failed to recognize page %1]\n" msgstr "" "\n" "[Αποτυχία αναγνώÏισης της σελίδας %1]\n" #: ../gtk/src/OutputEditorText.cc:275 ../qt/src/OutputEditorText.cc:239 msgid "Save Output..." msgstr "Αποθήκευση εξόδου..." #: ../gtk/src/Recognizer.cc:179 ../qt/src/Recognizer.cc:172 msgid "No languages available" msgstr "Δεν υπάÏχουν διαθέσιμες γλώσσες" #: ../gtk/src/Recognizer.cc:179 ../qt/src/Recognizer.cc:172 msgid "" "No tesseract languages are available for use. Recognition will not work." msgstr "" "Δεν υπάÏχουν διαθέσιμες γλώσσες tesseract Ï€Ïος χÏήση. Η αναγνώÏιση δεν θα " "δουλέψει." #: ../gtk/src/Recognizer.cc:233 ../qt/src/Recognizer.cc:232 msgid "Multilingual" msgstr "Πολυγλωσσικός" #: ../gtk/src/Recognizer.cc:285 ../qt/src/Recognizer.cc:277 msgid "Automatic page segmentation" msgstr "Αυτόματος τεμαχισμός σελίδας" #: ../gtk/src/Recognizer.cc:286 ../qt/src/Recognizer.cc:278 msgid "Page segmentation with orientation and script detection" msgstr "Τεμαχισμός σελίδας με Ï€Ïοσανατολισμό και αναγνώÏιση γÏαφής" #: ../gtk/src/Recognizer.cc:287 ../qt/src/Recognizer.cc:279 msgid "Assume single column of text" msgstr "ΘεωÏείται μονή στήλη κειμένου" #: ../gtk/src/Recognizer.cc:288 ../qt/src/Recognizer.cc:280 msgid "Assume single block of vertically aligned text" msgstr "ΘεωÏείται μονό μπλοκ κάθετα στοιχισμένου κειμένου" #: ../gtk/src/Recognizer.cc:289 ../qt/src/Recognizer.cc:281 msgid "Assume a single uniform block of text" msgstr "ΘεωÏείται μονό ομοιόμοÏφο μπλοκ κειμένου" #: ../gtk/src/Recognizer.cc:290 ../qt/src/Recognizer.cc:282 msgid "Assume a line of text" msgstr "ΘεωÏείται γÏαμμή κειμένου" #: ../gtk/src/Recognizer.cc:291 ../qt/src/Recognizer.cc:283 msgid "Assume a single word" msgstr "ΘεωÏείται απλή λέξη" #: ../gtk/src/Recognizer.cc:292 ../qt/src/Recognizer.cc:284 msgid "Assume a single word in a circle" msgstr "ΘεωÏείται απλή λέξη σε κÏκλο" #: ../gtk/src/Recognizer.cc:293 ../qt/src/Recognizer.cc:285 msgid "Sparse text in no particular order" msgstr "ΑÏαιό κείμενο χωÏίς καμιά συγκεκÏιμένη τάξη" #: ../gtk/src/Recognizer.cc:294 ../qt/src/Recognizer.cc:286 msgid "Sparse text with orientation and script detection" msgstr "ΑÏαιό κείμενο με Ï€Ïοσανατολισμό και αναγνώÏιση γÏαφής" #: ../gtk/src/Recognizer.cc:309 ../qt/src/Recognizer.cc:297 msgid "Page segmentation mode" msgstr "Κατάσταση Ï„ÎµÎ¼Î±Ï‡Î¹ÏƒÎ¼Î¿Ï ÏƒÎµÎ»Î¯Î´Î±Ï‚" #: ../gtk/src/Recognizer.cc:313 ../qt/src/Recognizer.cc:300 msgid "Character whitelist / blacklist..." msgstr "" #: ../gtk/src/Recognizer.cc:319 ../qt/src/Recognizer.cc:305 msgid "Manage languages..." msgstr "ΔιαχείÏιση γλωσσών..." #: ../gtk/src/Recognizer.cc:375 ../qt/src/Recognizer.cc:369 msgid "Current selection" msgstr "ΤÏέχουσα επιλογή" #: ../gtk/src/Recognizer.cc:465 ../qt/src/Recognizer.cc:455 msgid "Recognizing page %1 (%2 of %3)" msgstr "ΑναγνώÏιση της σελίδας %1 (%2 από %3)" #: ../gtk/src/Recognizer.cc:470 ../qt/src/Recognizer.cc:461 msgid "" "\n" "- Page %1: failed to render page" msgstr "" "\n" "- Σελίδα %1: αποτυχία απόδοσης της σελίδας" #: ../gtk/src/Recognizer.cc:501 ../gtk/src/Recognizer.cc:531 #: ../gtk/src/Recognizer.cc:544 ../qt/src/Recognizer.cc:491 #: ../qt/src/Recognizer.cc:521 ../qt/src/Recognizer.cc:534 msgid "Recognizing..." msgstr "Γίνεται αναγνώÏιση..." #: ../gtk/src/Recognizer.cc:505 ../gtk/src/Recognizer.cc:514 #: ../qt/src/Recognizer.cc:495 ../qt/src/Recognizer.cc:504 msgid "Recognition errors occurred" msgstr "Συνέβησαν σφάλματα αναγνώÏισης" #: ../gtk/src/Recognizer.cc:505 ../qt/src/Recognizer.cc:495 msgid "The following errors occurred:%1" msgstr "Τα παÏακάτω σφάλματα συνέβησαν:%1" #: ../gtk/src/Recognizer.cc:514 ../qt/src/Recognizer.cc:504 msgid "Failed to initialize tesseract" msgstr "Αποτυχία Ï€Ïοετοιμασίας του tesseract" #: ../gtk/src/scanner/ScannerSane.cc:84 ../gtk/src/scanner/ScannerTwain.cc:288 #: ../qt/src/scanner/ScannerSane.cc:85 ../qt/src/scanner/ScannerTwain.cc:286 msgid "Scan canceled" msgstr "ΑκυÏώθηκε η σάÏωση" #: ../gtk/src/scanner/ScannerSane.cc:159 ../gtk/src/scanner/ScannerTwain.cc:186 #: ../qt/src/scanner/ScannerSane.cc:159 ../qt/src/scanner/ScannerTwain.cc:178 msgid "No scanner specified" msgstr "Δεν οÏίστηκε σαÏωτής" #: ../gtk/src/scanner/ScannerSane.cc:168 ../gtk/src/scanner/ScannerTwain.cc:195 #: ../qt/src/scanner/ScannerSane.cc:168 ../qt/src/scanner/ScannerTwain.cc:187 msgid "Unable to connect to scanner" msgstr "Αδυναμία σÏνδεσης με σαÏωτή" #: ../gtk/src/scanner/ScannerSane.cc:403 ../gtk/src/scanner/ScannerTwain.cc:266 #: ../gtk/src/scanner/ScannerTwain.cc:292 ../qt/src/scanner/ScannerSane.cc:403 #: ../qt/src/scanner/ScannerTwain.cc:258 ../qt/src/scanner/ScannerTwain.cc:290 msgid "Unable to start scan" msgstr "ΑδÏνατη η έναÏξη σάÏωσης" #: ../gtk/src/scanner/ScannerSane.cc:411 ../gtk/src/scanner/ScannerSane.cc:461 #: ../gtk/src/scanner/ScannerTwain.cc:318 ../qt/src/scanner/ScannerSane.cc:411 #: ../qt/src/scanner/ScannerSane.cc:461 ../qt/src/scanner/ScannerTwain.cc:316 msgid "Error communicating with scanner" msgstr "Σφάλμα επικοινωνίας με τον σαÏωτή" #: ../gtk/src/scanner/ScannerSane.cc:520 ../qt/src/scanner/ScannerSane.cc:517 msgid "Failed to save image" msgstr "Αποτυχία αποθήκευσης της εικόνας" #: ../gtk/src/scanner/ScannerSane.cc:800 ../qt/src/scanner/ScannerSane.cc:797 #, fuzzy msgid "Operation is cancelled." msgstr "ΑκυÏώθηκε η σάÏωση" #: ../gtk/src/scanner/ScannerSane.cc:802 ../qt/src/scanner/ScannerSane.cc:799 msgid "Device is busy." msgstr "" #: ../gtk/src/scanner/ScannerSane.cc:804 ../qt/src/scanner/ScannerSane.cc:801 msgid "Cover is opened." msgstr "" #: ../gtk/src/scanner/ScannerSane.cc:806 ../qt/src/scanner/ScannerSane.cc:803 msgid "Document feeder jammed." msgstr "" #: ../gtk/src/scanner/ScannerSane.cc:808 ../qt/src/scanner/ScannerSane.cc:805 msgid "Document feeder out of documents." msgstr "" #: ../gtk/src/scanner/ScannerSane.cc:810 ../qt/src/scanner/ScannerSane.cc:807 #, fuzzy msgid "Access to scanner is denied." msgstr "Δεν οÏίστηκε σαÏωτής" #: ../gtk/src/SourceManager.cc:118 ../qt/src/SourceManager.cc:124 msgid "PDFs with text" msgstr "" #: ../gtk/src/SourceManager.cc:118 ../qt/src/SourceManager.cc:124 msgid "" "These PDF files already contain text:\n" "%1" msgstr "" #: ../gtk/src/SourceManager.cc:127 ../qt/src/SourceManager.cc:132 msgid "Unable to open files" msgstr "Αδυναμία ανοίγματος αÏχείων" #: ../gtk/src/SourceManager.cc:127 ../qt/src/SourceManager.cc:132 msgid "The following files could not be opened:%1" msgstr "Τα παÏακάτω αÏχεία δεν μπόÏεσαν να ανοιχθοÏν:%1" #: ../gtk/src/SourceManager.cc:141 ../qt/src/SourceManager.cc:143 msgid "Enter password for file '%1':" msgstr "" #: ../gtk/src/SourceManager.cc:197 ../qt/src/SourceManager.cc:214 msgid "Images and PDFs" msgstr "Εικόνες και PDF" #: ../gtk/src/SourceManager.cc:202 ../qt/src/SourceManager.cc:215 msgid "Select Files" msgstr "Επιλογή αÏχείων" #: ../gtk/src/SourceManager.cc:208 ../qt/src/SourceManager.cc:226 msgid "Clipboard Error" msgstr "Σφάλμα Ï€ÏοχείÏου" #: ../gtk/src/SourceManager.cc:208 ../qt/src/SourceManager.cc:226 msgid "Failed to read the clipboard." msgstr "Αποτυχία ανάγνωσης του Ï€ÏοχείÏου" #: ../gtk/src/SourceManager.cc:212 ../qt/src/SourceManager.cc:230 #: ../qt/src/SourceManager.cc:236 msgid "Pasted %1" msgstr "Επικολλήθηκε το %1" #: ../gtk/src/SourceManager.cc:224 ../qt/src/SourceManager.cc:243 msgid "Screenshot Error" msgstr "Σφάλμα στιγμιοτÏπου" #: ../gtk/src/SourceManager.cc:224 ../qt/src/SourceManager.cc:243 msgid "Failed to take screenshot." msgstr "Αποτυχία λήψης στιγμιοτÏπου" #: ../gtk/src/SourceManager.cc:228 ../qt/src/SourceManager.cc:247 msgid "Screenshot %1" msgstr "Στιγμιότυπο %1" #: ../gtk/src/SourceManager.cc:233 ../qt/src/SourceManager.cc:252 msgid "Saving image..." msgstr "ΑποθηκεÏεται η εικόνα..." #: ../gtk/src/SourceManager.cc:240 ../qt/src/SourceManager.cc:265 msgid "Cannot Write File" msgstr "Αδυναμία εγγÏαφής αÏχείου" #: ../gtk/src/SourceManager.cc:240 ../qt/src/SourceManager.cc:265 msgid "Could not write to %1." msgstr "Αδυναμία εγγÏαφής στο %1." #: ../gtk/src/SourceManager.cc:267 ../qt/src/SourceManager.cc:287 msgid "Delete File?" msgstr "Îα διαγÏαφεί το αÏχείο;" #: ../gtk/src/SourceManager.cc:267 ../qt/src/SourceManager.cc:287 msgid "The following files will be deleted:%1" msgstr "Τα παÏακάτω αÏχεία θα διαγÏαφοÏν:%1" #: ../gtk/src/SourceManager.cc:332 ../qt/src/SourceManager.cc:338 msgid "Missing File" msgstr "Λείπει αÏχείο" #: ../gtk/src/SourceManager.cc:332 ../qt/src/SourceManager.cc:338 msgid "" "The following file has been deleted or moved:\n" "%1" msgstr "" "Το παÏακάτω αÏχείο έχει διαγÏαφεί ή μετακινηθεί:\n" "%1" #: ../gtk/src/SubstitutionsManager.cc:33 ../qt/src/SubstitutionsManager.cc:73 msgid "Search for" msgstr "Αναζήτηση για" #: ../gtk/src/SubstitutionsManager.cc:34 ../qt/src/SubstitutionsManager.cc:73 msgid "Replace with" msgstr "Αντικατάσταση με" #: ../gtk/src/SubstitutionsManager.cc:69 ../gtk/src/SubstitutionsManager.cc:103 #: ../qt/src/SubstitutionsManager.cc:106 ../qt/src/SubstitutionsManager.cc:143 msgid "Substitutions List" msgstr "Λίστα υποκαταστάσεων" #: ../gtk/src/SubstitutionsManager.cc:70 ../qt/src/SubstitutionsManager.cc:106 msgid "Open Substitutions List" msgstr "Άνοιγμα λίστας υποκαταστάσεων" #: ../gtk/src/SubstitutionsManager.cc:75 ../qt/src/SubstitutionsManager.cc:112 msgid "Error Reading File" msgstr "Σφάλμα ανάγνωσης αÏχείου" #: ../gtk/src/SubstitutionsManager.cc:75 ../qt/src/SubstitutionsManager.cc:112 msgid "Unable to read '%1'." msgstr "Αδυναμία ανάγνωσης του '%1'." #: ../gtk/src/SubstitutionsManager.cc:97 ../qt/src/SubstitutionsManager.cc:137 msgid "Errors Occurred Reading File" msgstr "Συνέβησαν σφάλματα ανάγνωσης του αÏχείου" #: ../gtk/src/SubstitutionsManager.cc:97 ../qt/src/SubstitutionsManager.cc:137 msgid "Some entries of the substitutions list could not be read." msgstr "" "Κάποιες καταχωÏίσεις της λίστας υποκατάστασης δεν μπόÏεσαν να διαβαστοÏν." #: ../gtk/src/SubstitutionsManager.cc:104 ../qt/src/SubstitutionsManager.cc:143 msgid "Save Substitutions List" msgstr "Αποθήκευση λίστας υποκαταστάσεων" #: ../gtk/src/SubstitutionsManager.cc:110 ../qt/src/SubstitutionsManager.cc:149 msgid "Error Saving File" msgstr "Σφάλμα αποθήκευσης αÏχείου" #: ../gtk/src/SubstitutionsManager.cc:110 ../qt/src/SubstitutionsManager.cc:149 msgid "Unable to write to '%1'." msgstr "ΑδÏνατη η εγγÏαφή στο '%1'." #: ../gtk/src/SubstitutionsManager.cc:127 ../qt/src/SubstitutionsManager.cc:162 msgid "Save List?" msgstr "Îα αποθηκευτεί η λίστα;" #: ../gtk/src/SubstitutionsManager.cc:127 ../qt/src/SubstitutionsManager.cc:162 msgid "Do you want to save the current list?" msgstr "Θέλετε να αποθηκευτεί η Ï„Ïέχουσα λίστα;" #: ../gtk/src/TessdataManager.cc:60 ../qt/src/TessdataManager.cc:74 #, fuzzy msgid "" "A session connection to the PackageKit backend is required for managing " "system-wide tesseract language packs, but it was not found. This service is " "usually provided by a software-management application such as Gnome " "Software. Please install software which provides the necessary PackageKit " "interface, use other system package management software to manage the " "tesseract language packs directly, or switch to using the user tessdata path " "in the configuration dialog." msgstr "" "Το PackageKit απαιτείται για τη διαχείÏιση των γλωσσικών πακέτων tesseract " "για ολόκληÏο το σÏστημα, αλλά δεν βÏέθηκε. ΠαÏακαλοÏμε, χÏησιμοποιήστε το " "λογισμικό διαχείÏισης πακέτων του συστήματος για να διαχειÏιστείτε τα " "γλωσσικά πακέτα του tesseract ή αλλάξτε για να χÏησιμοποιήσετε τη διαδÏομή " "tessdata του χÏήστη στον διάλογο ÏÏθμισης." #: ../gtk/src/TessdataManager.cc:65 ../qt/src/TessdataManager.cc:79 msgid "Fetching available languages" msgstr "ΜεταφέÏονται οι διαθέσιμες γλώσσες" #: ../gtk/src/TessdataManager.cc:70 ../gtk/src/TessdataManager.cc:96 #: ../gtk/src/TessdataManager.cc:197 ../qt/src/TessdataManager.cc:84 #: ../qt/src/TessdataManager.cc:101 ../qt/src/TessdataManager.cc:197 msgid "Failed to fetch list of available languages: %1" msgstr "Αποτυχία μεταφοÏάς του καταλόγου των διαθέσιμων γλωσσών: %1" #: ../gtk/src/TessdataManager.cc:104 ../qt/src/TessdataManager.cc:113 #: ../qt/src/TessdataManager.cc:122 msgid "Parsing error: %1" msgstr "Ανάλυση του σφάλματος: %1" #: ../gtk/src/TessdataManager.cc:235 ../qt/src/TessdataManager.cc:232 msgid "Applying changes..." msgstr "ΕφαÏμογή αλλαγών..." #: ../gtk/src/TessdataManager.cc:297 ../qt/src/TessdataManager.cc:278 msgid "Failed to create directory for tessdata files." msgstr "Αποτυχία δημιουÏγίας καταλόγου για τα αÏχεία tessdata." #: ../gtk/src/TessdataManager.cc:306 ../qt/src/TessdataManager.cc:287 msgid "Downloading %1..." msgstr "ΜεταφοÏτώνεται το %1..." #: ../gtk/src/TessdataManager.cc:330 #, fuzzy msgid "" "The following files could not be downloaded or removed:\n" "%1\n" "\n" "Check the connectivity and directory permissions.\n" "\n" "Hint: If you don't have write permissions in system folders, you can switch " "to user paths in the settings dialog." msgstr "" "Τα παÏακάτω αÏχεία δεν μπόÏεσαν να μεταφοÏτωθοÏν ή να αφαιÏεθοÏν:\n" "%1\n" "\n" "Ελέγξτε τη σÏνδεση και τα δικαιώματα του καταλόγου." #: ../gtk/src/Utils.cc:64 msgid "Yes" msgstr "Îαι" #: ../gtk/src/Utils.cc:67 msgid "No" msgstr "Όχι" #: ../gtk/src/Utils.cc:76 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/CrashHandler.ui.h:3 msgid "" "

Tesseract has " "aborted

Tesseract (the OCR engine) has aborted while " "recognizing text. This may occur if the used traineddatas are corrupt or " "incomplatible with the version of tesseract in use, or due to a bug in " "tesseract.

The stacktrace below may provide additional information " "about where the crash occured.

" msgstr "" #: ../qt/data/MainWindow.ui.h:17 msgid "Flatbed" msgstr "" #: ../qt/data/MainWindow.ui.h:18 msgid "ADF Front" msgstr "" #: ../qt/data/MainWindow.ui.h:19 msgid "ADF Back" msgstr "" #: ../qt/data/MainWindow.ui.h:20 msgid "ADF Duplex" msgstr "" #. Remove & from some labels which designer insists in adding #: ../qt/data/MainWindow.ui.h:21 ../qt/src/Ui_MainWindow.hh:50 msgid "Sources" msgstr "Πηγές" #: ../qt/data/MainWindow.ui.h:22 msgid "Zoom In" msgstr "Μεγέθυνση" #: ../qt/data/MainWindow.ui.h:24 msgid "Zoom Out" msgstr "ΣμίκÏυνση" #: ../qt/data/MainWindow.ui.h:26 msgid "Normal Size" msgstr "Κανονικό μέγεθος" #: ../qt/data/MainWindow.ui.h:28 msgid "Best Fit" msgstr "ΆÏιστη Ï€ÏοσαÏμογή" #: ../qt/data/MainWindow.ui.h:30 msgid "Rotate Left" msgstr "ΑÏιστεÏή πεÏιστÏοφή" #: ../qt/data/MainWindow.ui.h:31 msgid "Rotate left" msgstr "ΑÏιστεÏή πεÏιστÏοφή" #: ../qt/data/MainWindow.ui.h:32 msgid "Rotate Right" msgstr "Δεξιά πεÏιστÏοφή" #: ../qt/data/MainWindow.ui.h:33 msgid "Rotate right" msgstr "Δεξιά πεÏιστÏοφή" #: ../qt/data/MainWindow.ui.h:34 msgid "Image Controls" msgstr "Στοιχεία ελέγχου εικόνας" #: ../qt/data/MainWindow.ui.h:36 msgid "Autodetect Layout" msgstr "Αυτόματη ανίχνευση διάταξης" #: ../qt/data/MainWindow.ui.h:38 msgid "Toggle Output Pane" msgstr "Εναλλαγή παÏαθÏÏου εξόδου" #: ../qt/data/PdfExportDialog.ui.h:5 msgid "Backend:" msgstr "" #: ../qt/data/PdfExportDialog.ui.h:8 msgid "Portrait" msgstr "" #: ../qt/data/PdfExportDialog.ui.h:9 msgid "Landscape" msgstr "" #: ../qt/src/hocr/HOCRPdfExporter.cc:142 #, fuzzy msgid "Failed to write to file" msgstr "Αποτυχία ανοίγματος του αÏχείου" #. Output toolbar #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:55 #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:56 msgid "Open hOCR file" msgstr "Άνοιγμα αÏχείου hOCR" #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:57 #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:58 msgid "Save as hOCR text" msgstr "Αποθήκευση κειμένου ως hOCR" #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:79 #: ../qt/src/Ui_OutputEditorText.hh:106 msgid "Find and Replace" msgstr "ΕÏÏεση και αντικατάσταση" #: ../qt/src/MainWindow.cc:581 #, fuzzy msgid "" "The following dictionary files were installed:\n" "%1" msgstr "Τα παÏακάτω αÏχεία λεξικών εγκαταστάθηκαν:%1" #: ../qt/src/TessdataManager.cc:308 #, fuzzy msgid "" "The following files could not be downloaded or removed:\n" "%1\n" "\n" "Check the connectivity and directory permissions.\n" "Hint: If you don't have write permissions in system folders, you can switch " "to user paths in the settings dialog." msgstr "" "Τα παÏακάτω αÏχεία δεν μπόÏεσαν να μεταφοÏτωθοÏν ή να αφαιÏεθοÏν:\n" "%1\n" "\n" "Ελέγξτε τη σÏνδεση και τα δικαιώματα του καταλόγου." #: ../qt/src/Ui_MainWindow.hh:51 msgid "Output" msgstr "Έξοδος:" #: ../qt/src/Ui_MainWindow.hh:135 msgid "OCR mode:" msgstr "Κατάσταση OCR:" #: ../qt/src/Ui_MainWindow.hh:209 msgid "Remove Image" msgstr "ΑφαίÏεση εικόνας" #: ../qt/src/Ui_MainWindow.hh:212 msgid "Delete Image" msgstr "ΔιαγÏαφή εικόνας" #: ../qt/src/Ui_MainWindow.hh:215 msgid "Clear List" msgstr "ΚαθαÏισμός λίστας" #: ../qt/src/Ui_OutputEditorText.hh:101 msgid "Strip Line Breaks" msgstr "ΑφαίÏεση αλλαγών γÏαμμής" #: ../qt/src/Ui_OutputEditorText.hh:115 msgid "Save Output" msgstr "Αποθήκευση εξόδου" #: ../qt/src/Ui_OutputEditorText.hh:117 msgid "Clear Output" msgstr "ΚαθαÏισμός εξόδου" #~ msgid "The application has crashed" #~ msgstr "Η εφαÏμογή κατέÏÏευσε" #~ 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." #~ msgid "Could not read %1: %2" #~ msgstr "Αδυναμία ανάγνωσης του %1: %2" #~ msgid "gImageReader" #~ msgstr "gImageReader" #, 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 "Document font:" #~ msgstr "ΓÏαμματοσειÏά εγγÏάφου:" #~ msgid "Scale:" #~ msgstr "Κλίμακα:" #~ msgid "Document" #~ msgstr "ΕγγÏαφο" #~ msgid "Errors occurred" #~ msgstr "Συνέβησαν σφάλματα" #~ msgid "" #~ "The following pages could not be rendered:\n" #~ "%1" #~ msgstr "" #~ "Οι παÏακάτω σελίδες δεν μπόÏεσαν να αποδοθοÏν:\n" #~ "%1" #~ msgid "substitution_list.txt" #~ msgstr "λίστα_υποκατάστασης.txt" #~ 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.3.1/po/es_ES.po000066400000000000000000002114321351740627400160220ustar00rootroot00000000000000# 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. # micrococo, 2018. msgid "" msgstr "" "Project-Id-Version: \n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2019-07-25 23:17+0200\n" "PO-Revision-Date: 2018-03-19 21:49+0000\n" "Last-Translator: Pablo Hinojosa \n" "Language-Team: Spanish \n" "Language: es_ES\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" "X-Generator: Weblate 2.20-dev\n" #: ../data/gimagereader.desktop.in.h:1 msgid "OCR application" msgstr "Aplicación para OCR" #: ../gtk/data/appmenu.ui.h:1 ../qt/src/Ui_MainWindow.hh:167 msgid "Redetect Languages" msgstr "Volver a detectar idiomas" #: ../gtk/data/appmenu.ui.h:2 ../qt/src/Ui_MainWindow.hh:170 msgid "Manage Languages" msgstr "Gestionar los idiomas" #: ../gtk/data/appmenu.ui.h:3 ../gtk/data/ConfigDialog.ui.h:1 #: ../qt/data/ConfigDialog.ui.h:1 ../qt/src/Ui_MainWindow.hh:173 msgid "Preferences" msgstr "Ajustes" #: ../gtk/data/appmenu.ui.h:4 ../gtk/data/ConfigDialog.ui.h:2 #: ../gtk/src/MainWindow.cc:482 ../qt/src/MainWindow.cc:481 #: ../qt/src/Ui_MainWindow.hh:178 msgid "Help" msgstr "Ayuda" #: ../gtk/data/appmenu.ui.h:5 ../qt/data/AboutDialog.ui.h:2 #: ../qt/src/Ui_MainWindow.hh:181 msgid "About" msgstr "Acerca de" #: ../gtk/data/appmenu.ui.h:6 msgid "Quit" msgstr "Salir" #: ../gtk/data/ConfigDialog.ui.h:3 ../gtk/data/MainWindow.ui.h:47 #: ../gtk/data/OutputEditorHOCR.ui.h:3 ../gtk/data/PdfExportDialog.ui.h:3 #: ../gtk/src/FileDialogs.cc:152 ../gtk/src/Utils.cc:61 #: ../qt/data/ConfigDialog.ui.h:26 msgid "OK" msgstr "Aceptar" #: ../gtk/data/ConfigDialog.ui.h:4 msgid "Output pane orientation:" msgstr "Orientación del panel de salida:" #: ../gtk/data/ConfigDialog.ui.h:5 msgid "Horizontal" msgstr "Horizontal" #: ../gtk/data/ConfigDialog.ui.h:6 msgid "Vertical" msgstr "Vertical" #: ../gtk/data/ConfigDialog.ui.h:7 ../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/ConfigDialog.ui.h:8 ../qt/data/ConfigDialog.ui.h:4 msgid "Automatically check for new program versions" msgstr "Comprobar automáticamente nuevas versiones del programa" #: ../gtk/data/ConfigDialog.ui.h:9 ../qt/data/ConfigDialog.ui.h:3 msgid "Predefined language definitions:" msgstr "Definiciones de idioma preconfiguradas:" #: ../gtk/data/ConfigDialog.ui.h:10 ../qt/data/ConfigDialog.ui.h:12 msgid "Additional language definitions:" msgstr "Definiciones de idioma adicionales:" #: ../gtk/data/ConfigDialog.ui.h:11 ../qt/data/ConfigDialog.ui.h:20 msgid "The prefix of the tesseract language data file" msgstr "Prefijo para el fichero de datos de idioma de tesseract" #: ../gtk/data/ConfigDialog.ui.h:12 ../qt/data/ConfigDialog.ui.h:21 msgid "Prefix" msgstr "Prefijo" #: ../gtk/data/ConfigDialog.ui.h:13 ../qt/data/ConfigDialog.ui.h:22 msgid "The ISO 639-1 language code followed by the country code" msgstr "Código de idioma ISO-639-1 seguido del código de país" #: ../gtk/data/ConfigDialog.ui.h:14 ../qt/data/ConfigDialog.ui.h:23 msgid "ISO Code" msgstr "Código ISO" #: ../gtk/data/ConfigDialog.ui.h:15 ../qt/data/ConfigDialog.ui.h:24 msgid "The name of the language" msgstr "El nombre del idioma" #: ../gtk/data/ConfigDialog.ui.h:16 ../qt/data/ConfigDialog.ui.h:25 msgid "Name" msgstr "Nombre" #: ../gtk/data/ConfigDialog.ui.h:17 ../gtk/data/MainWindow.ui.h:46 #: ../gtk/data/OutputEditorHOCR.ui.h:2 ../gtk/data/PdfExportDialog.ui.h:2 #: ../gtk/src/Acquirer.cc:34 ../gtk/src/FileDialogs.cc:151 #: ../gtk/src/Utils.cc:70 ../qt/data/ConfigDialog.ui.h:27 #: ../qt/data/MainWindow.ui.h:12 msgid "Cancel" msgstr "Cancelar" #: ../gtk/data/ConfigDialog.ui.h:18 ../qt/data/ConfigDialog.ui.h:5 msgid "Output pane font:" msgstr "Tipografía del panel de salida:" #: ../gtk/data/ConfigDialog.ui.h:19 ../qt/data/ConfigDialog.ui.h:2 msgid "Default" msgstr "Por omisión" #: ../gtk/data/ConfigDialog.ui.h:20 ../qt/data/ConfigDialog.ui.h:6 msgid "Language data locations:" msgstr "Ubicación de datos de idioma:" #: ../gtk/data/ConfigDialog.ui.h:21 ../qt/data/ConfigDialog.ui.h:13 msgid "Language definitions path:" msgstr "Ruta para definiciones de idioma:" #: ../gtk/data/ConfigDialog.ui.h:22 ../qt/data/ConfigDialog.ui.h:28 msgid "Spelling dictionaries path:" msgstr "Ruta para diccionarios:" #: ../gtk/data/ConfigDialog.ui.h:23 ../qt/data/ConfigDialog.ui.h:10 msgid "System-wide paths" msgstr "Rutas del sistema" #: ../gtk/data/ConfigDialog.ui.h:24 ../qt/data/ConfigDialog.ui.h:11 msgid "User paths" msgstr "Rutas de usuario" #: ../gtk/data/ConfigDialog.ui.h:25 ../qt/data/ConfigDialog.ui.h:29 msgid "Automatically open exported documents with default application" msgstr "" "Abrir automáticamente los documentos exportados con la aplicación por defecto" #: ../gtk/data/CrashHandler.ui.h:1 ../qt/src/CrashHandler.cc:38 msgid "Regenerate backtrace" msgstr "Regenerar traza inversa" #: ../gtk/data/CrashHandler.ui.h:3 #, fuzzy, no-c-format msgid "" "The application has crashed\n" "\n" "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/CrashHandler.ui.h:6 msgid "" "Tesseract has aborted\n" "\n" "Tesseract (the OCR engine) has aborted while recognizing text. This may " "occur if the used traineddatas are corrupt or incomplatible with the version " "of tesseract in use, or due to a bug in tesseract.\n" "\n" "The stacktrace below may provide additional information about where the " "crash occured.\n" msgstr "" #: ../gtk/data/MainWindow.ui.h:1 ../qt/data/MainWindow.ui.h:39 msgid "Toggle output pane" msgstr "Mostrar/ocultar el panel de salida" #: ../gtk/data/MainWindow.ui.h:2 ../qt/src/Ui_MainWindow.hh:66 msgid "Rotate current page" msgstr "Rotar la página actual" #: ../gtk/data/MainWindow.ui.h:3 ../qt/src/Ui_MainWindow.hh:67 msgid "Rotate all pages" msgstr "Rotar todas las páginas" #. Sources toolbar #: ../gtk/data/MainWindow.ui.h:4 ../qt/src/Ui_MainWindow.hh:192 msgid "Recent" msgstr "Reciente" #: ../gtk/data/MainWindow.ui.h:5 ../qt/src/Ui_MainWindow.hh:193 msgid "Paste" msgstr "Pegar" #: ../gtk/data/MainWindow.ui.h:6 ../qt/src/Ui_MainWindow.hh:194 msgid "Take Screenshot" msgstr "Capturar pantalla" #: ../gtk/data/MainWindow.ui.h:7 ../qt/data/MainWindow.ui.h:23 msgid "Zoom in" msgstr "Acercar" #: ../gtk/data/MainWindow.ui.h:8 ../qt/data/MainWindow.ui.h:25 msgid "Zoom out" msgstr "Alejar" #: ../gtk/data/MainWindow.ui.h:9 ../qt/data/MainWindow.ui.h:27 msgid "Normal size" msgstr "Tamaño normal" #: ../gtk/data/MainWindow.ui.h:10 ../qt/data/MainWindow.ui.h:29 msgid "Best fit" msgstr "Ajustar" #: ../gtk/data/MainWindow.ui.h:11 ../qt/src/Ui_MainWindow.hh:75 msgid "Select rotation mode" msgstr "Seleccionar el modo de rotación" #: ../gtk/data/MainWindow.ui.h:12 ../gtk/data/OutputEditorText.ui.h:13 #: ../qt/src/Ui_OutputEditorText.hh:95 msgid "Select insert mode" msgstr "Seleccionar el modo de inserción" #: ../gtk/data/MainWindow.ui.h:13 ../qt/src/Ui_MainWindow.hh:109 #, fuzzy msgid "Select page" msgstr "Seleccionar el idioma" #: ../gtk/data/MainWindow.ui.h:14 ../qt/data/MainWindow.ui.h:35 msgid "Image controls" msgstr "Controles de imagen" #: ../gtk/data/MainWindow.ui.h:15 ../qt/src/Ui_MainWindow.hh:139 msgid "Plain text" msgstr "Texto sin formato" #: ../gtk/data/MainWindow.ui.h:16 ../qt/src/Ui_MainWindow.hh:139 msgid "hOCR, PDF" msgstr "hOCR, PDF" #: ../gtk/data/MainWindow.ui.h:17 ../qt/data/MainWindow.ui.h:37 msgid "Autodetect layout" msgstr "Autodetectar disposición" #: ../gtk/data/MainWindow.ui.h:18 msgid "Recognize all" msgstr "Reconocer todo" #: ../gtk/data/MainWindow.ui.h:19 msgid "Select language" msgstr "Seleccionar el idioma" #: ../gtk/data/MainWindow.ui.h:20 ../qt/src/Ui_MainWindow.hh:205 msgid "Add images" msgstr "Agregar imágenes" #: ../gtk/data/MainWindow.ui.h:21 ../qt/src/Ui_MainWindow.hh:204 msgid "Add Images" msgstr "Agregar imágenes" #: ../gtk/data/MainWindow.ui.h:22 ../qt/src/Ui_MainWindow.hh:210 msgid "Remove image from list" msgstr "Quitar imagen de la lista" #: ../gtk/data/MainWindow.ui.h:23 ../qt/src/Ui_MainWindow.hh:213 msgid "Delete image" msgstr "Borrar imagen" #: ../gtk/data/MainWindow.ui.h:24 ../qt/src/Ui_MainWindow.hh:216 msgid "Clear list" msgstr "Borrar lista" #: ../gtk/data/MainWindow.ui.h:25 ../qt/data/MainWindow.ui.h:5 msgid "Files" msgstr "Ficheros" #: ../gtk/data/MainWindow.ui.h:26 ../qt/data/MainWindow.ui.h:8 msgid "Device:" msgstr "Dispositivo:" #: ../gtk/data/MainWindow.ui.h:27 ../gtk/data/TessdataManager.ui.h:4 #: ../qt/data/MainWindow.ui.h:7 ../qt/src/TessdataManager.cc:59 msgid "Refresh" msgstr "Actualizar" #: ../gtk/data/MainWindow.ui.h:28 ../qt/data/MainWindow.ui.h:9 msgid "Output:" msgstr "Salida:" #: ../gtk/data/MainWindow.ui.h:29 ../qt/data/MainWindow.ui.h:13 msgid "Mode:" msgstr "Modo:" #: ../gtk/data/MainWindow.ui.h:30 ../gtk/src/hocr/HOCRPdfExporter.cc:313 #: ../qt/data/MainWindow.ui.h:15 ../qt/src/hocr/HOCRPdfExporter.cc:347 msgid "Color" msgstr "Color" #: ../gtk/data/MainWindow.ui.h:31 ../gtk/src/hocr/HOCRPdfExporter.cc:316 #: ../qt/data/MainWindow.ui.h:14 ../qt/src/hocr/HOCRPdfExporter.cc:349 #: ../qt/src/hocr/HOCRPdfExporter.cc:351 msgid "Grayscale" msgstr "Escala de grises" #: ../gtk/data/MainWindow.ui.h:32 ../qt/data/MainWindow.ui.h:10 msgid "Resolution:" msgstr "Resolución:" #: ../gtk/data/MainWindow.ui.h:33 ../qt/data/MainWindow.ui.h:11 msgid "Scan" msgstr "Escanear" #: ../gtk/data/MainWindow.ui.h:34 ../qt/data/MainWindow.ui.h:16 msgid "Source:" msgstr "Origen:" #: ../gtk/data/MainWindow.ui.h:35 ../qt/data/MainWindow.ui.h:6 msgid "Acquire" msgstr "Adquirir" #: ../gtk/data/MainWindow.ui.h:36 ../qt/data/MainWindow.ui.h:1 msgid "Brightness" msgstr "Brillo" #: ../gtk/data/MainWindow.ui.h:37 ../qt/data/MainWindow.ui.h:2 msgid "Contrast" msgstr "Contraste" #: ../gtk/data/MainWindow.ui.h:38 ../qt/data/MainWindow.ui.h:3 msgid "Resolution" msgstr "Resolución" #: ../gtk/data/MainWindow.ui.h:39 ../qt/data/MainWindow.ui.h:4 msgid "Invert colors" msgstr "Invertir los colores" #: ../gtk/data/MainWindow.ui.h:40 msgid "A graphical frontend to tesseract-ocr" msgstr "Interfaz gráfica para tesseract-ocr" #: ../gtk/data/MainWindow.ui.h:41 ../qt/data/CharacterListDialog.ui.h:1 msgid "Character whitelist / blacklist" msgstr "" #: ../gtk/data/MainWindow.ui.h:42 ../qt/data/CharacterListDialog.ui.h:2 msgid "Exclude these characters from being recognized (blacklist):" msgstr "" #: ../gtk/data/MainWindow.ui.h:43 ../qt/data/CharacterListDialog.ui.h:3 #, fuzzy msgid "Enter a string of characters..." msgstr "Obteniendo los parámetros..." #: ../gtk/data/MainWindow.ui.h:44 ../qt/data/CharacterListDialog.ui.h:4 msgid "Only allow the following characters to be recognized (whitelist):" msgstr "" #: ../gtk/data/MainWindow.ui.h:45 ../qt/data/PageRangeDialog.ui.h:1 msgid "Page Range" msgstr "Rango de páginas" #: ../gtk/data/MainWindow.ui.h:48 ../qt/data/PageRangeDialog.ui.h:2 msgid "Page range:" msgstr "Rango de páginas:" #: ../gtk/data/MainWindow.ui.h:49 ../qt/data/PageRangeDialog.ui.h:3 msgid "Example: 1-10, 13, 14-18" msgstr "Ejemplo: 1-10, 13, 14-18" #: ../gtk/data/MainWindow.ui.h:50 ../qt/data/PageRangeDialog.ui.h:4 msgid "Recognition area:" msgstr "Ãrea de reconocimiento:" #: ../gtk/data/MainWindow.ui.h:51 ../gtk/src/Recognizer.cc:375 #: ../qt/data/PageRangeDialog.ui.h:5 ../qt/src/Recognizer.cc:369 msgid "Entire page" msgstr "Página completa" #: ../gtk/data/MainWindow.ui.h:52 ../qt/data/PageRangeDialog.ui.h:6 msgid "Autodetect" msgstr "Autodetectar" #: ../gtk/data/MainWindow.ui.h:53 ../qt/data/PageRangeDialog.ui.h:7 msgid "Prepend to output text:" msgstr "Añadir antes del texto de salida:" #: ../gtk/data/MainWindow.ui.h:54 ../qt/data/PageRangeDialog.ui.h:8 msgid "Source filename" msgstr "Nombre del archivo original" #: ../gtk/data/MainWindow.ui.h:55 ../qt/data/PageRangeDialog.ui.h:9 msgid "Source page" msgstr "Página del original" #: ../gtk/data/MainWindow.ui.h:56 ../qt/src/SourceManager.cc:146 msgid "Protected PDF" msgstr "PDF protegido" #: ../gtk/data/MainWindow.ui.h:57 ../qt/src/Recognizer.cc:76 msgid "Current Page" msgstr "Página actual" #: ../gtk/data/MainWindow.ui.h:58 ../qt/src/Recognizer.cc:79 msgid "Multiple Pages..." msgstr "Múltiples páginas..." #: ../gtk/data/OutputEditorHOCR.ui.h:1 ../qt/src/hocr/OutputEditorHOCR.cc:580 msgid "Add Word" msgstr "Añadir palabra" #: ../gtk/data/OutputEditorHOCR.ui.h:4 ../qt/src/hocr/OutputEditorHOCR.cc:580 msgid "Enter word:" msgstr "Introducir palabra:" #: ../gtk/data/OutputEditorHOCR.ui.h:5 ../qt/src/hocr/Ui_OutputEditorHOCR.hh:61 #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:62 msgid "Export to plain text" msgstr "Exportar a texto sin formato" #: ../gtk/data/OutputEditorHOCR.ui.h:6 ../qt/src/hocr/Ui_OutputEditorHOCR.hh:64 #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:65 msgid "Export to PDF" msgstr "Exportar a PDF" #: ../gtk/data/OutputEditorHOCR.ui.h:7 ../qt/src/hocr/Ui_OutputEditorHOCR.hh:67 #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:68 msgid "Export to ODT" msgstr "Exportar a ODT" #: ../gtk/data/OutputEditorHOCR.ui.h:8 ../gtk/data/OutputEditorText.ui.h:18 #: ../qt/src/Ui_OutputEditorText.hh:116 msgid "Save output" msgstr "Guardar la salida" #: ../gtk/data/OutputEditorHOCR.ui.h:9 ../qt/src/hocr/Ui_OutputEditorHOCR.hh:72 #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:73 msgid "Export" msgstr "Exportar" #: ../gtk/data/OutputEditorHOCR.ui.h:10 ../gtk/data/OutputEditorText.ui.h:19 #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:77 #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:78 #: ../qt/src/Ui_OutputEditorText.hh:118 msgid "Clear output" msgstr "Limpiar la salida" #: ../gtk/data/OutputEditorHOCR.ui.h:11 ../gtk/data/OutputEditorText.ui.h:15 #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:80 #: ../qt/src/Ui_OutputEditorText.hh:107 msgid "Find and replace" msgstr "Buscar y sustituir" #: ../gtk/data/OutputEditorHOCR.ui.h:12 #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:82 #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:83 msgid "Show confidence values" msgstr "Mostrar los valores de confianza" #: ../gtk/data/OutputEditorHOCR.ui.h:13 ../gtk/data/PdfExportDialog.ui.h:41 #: ../qt/data/PdfExportDialog.ui.h:2 ../qt/src/hocr/Ui_OutputEditorHOCR.hh:85 #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:86 msgid "Show preview" msgstr "Mostrar la vista previa" #: ../gtk/data/OutputEditorHOCR.ui.h:14 #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:121 msgid "Next (F3)" msgstr "Siguiente (F3)" #: ../gtk/data/OutputEditorHOCR.ui.h:15 #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:122 msgid "Previous (Shift+F3)" msgstr "Anterior (Mayúsculas+F3)" #: ../gtk/data/OutputEditorHOCR.ui.h:16 ../gtk/src/hocr/OutputEditorHOCR.cc:890 #: ../qt/src/hocr/OutputEditorHOCR.cc:730 #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:126 msgid "Expand all" msgstr "Expandir todo" #: ../gtk/data/OutputEditorHOCR.ui.h:17 ../gtk/src/hocr/OutputEditorHOCR.cc:893 #: ../qt/src/hocr/OutputEditorHOCR.cc:731 #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:127 msgid "Collapse all" msgstr "Contraer todo" #: ../gtk/data/OutputEditorHOCR.ui.h:18 #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:148 msgid "Properties" msgstr "Propiedades" #: ../gtk/data/OutputEditorHOCR.ui.h:19 #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:152 msgid "Source" msgstr "Origen" #. Output insert mode #: ../gtk/data/OutputEditorText.ui.h:1 ../qt/src/Ui_OutputEditorText.hh:52 msgid "Append to current text" msgstr "Agregar al texto actual" #: ../gtk/data/OutputEditorText.ui.h:2 ../qt/src/Ui_OutputEditorText.hh:53 msgid "Insert at cursor" msgstr "Insertar en la posición del cursor" #: ../gtk/data/OutputEditorText.ui.h:3 ../qt/src/Ui_OutputEditorText.hh:54 msgid "Replace current text" msgstr "Sustituir el texto actual" #. Output postprocessing #: ../gtk/data/OutputEditorText.ui.h:4 ../qt/src/Ui_OutputEditorText.hh:62 msgid "Keep line break if..." msgstr "Mantener salto de línea si..." #: ../gtk/data/OutputEditorText.ui.h:5 ../qt/src/Ui_OutputEditorText.hh:64 msgid "Preceded by end mark (.?!)" msgstr "Va precedido por un signo de fin de frase (.?!)" #: ../gtk/data/OutputEditorText.ui.h:6 ../qt/src/Ui_OutputEditorText.hh:66 msgid "Preceded or succeeded by quote" msgstr "Va precedido o seguido por comillas" #: ../gtk/data/OutputEditorText.ui.h:7 ../qt/src/Ui_OutputEditorText.hh:68 msgid "Other options" msgstr "Otras opciones" #: ../gtk/data/OutputEditorText.ui.h:8 ../qt/src/Ui_OutputEditorText.hh:70 msgid "Join hyphenated words" msgstr "Unir las palabras separadas por guión" #: ../gtk/data/OutputEditorText.ui.h:9 ../qt/src/Ui_OutputEditorText.hh:72 msgid "Collapse whitespace" msgstr "Contraer múltiples espacios en blanco a uno solo" #: ../gtk/data/OutputEditorText.ui.h:10 ../qt/src/Ui_OutputEditorText.hh:74 msgid "Preserve paragraphs" msgstr "Preservar los párrafos" #: ../gtk/data/OutputEditorText.ui.h:11 ../qt/src/Ui_OutputEditorText.hh:76 msgid "Visual aids" msgstr "Ayudas visuales" #: ../gtk/data/OutputEditorText.ui.h:12 ../qt/src/Ui_OutputEditorText.hh:78 msgid "Draw whitespace" msgstr "Mostrar los espacios en blanco" #: ../gtk/data/OutputEditorText.ui.h:14 ../qt/src/Ui_OutputEditorText.hh:102 msgid "Strip line breaks on selected text" msgstr "Quitar los saltos de línea del texto seleccionado" #: ../gtk/data/OutputEditorText.ui.h:16 ../qt/src/Ui_OutputEditorText.hh:109 #: ../qt/src/Ui_OutputEditorText.hh:110 msgid "Undo" msgstr "Deshacer" #: ../gtk/data/OutputEditorText.ui.h:17 ../qt/src/Ui_OutputEditorText.hh:112 #: ../qt/src/Ui_OutputEditorText.hh:113 msgid "Redo" msgstr "Rehacer" #: ../gtk/data/PdfExportDialog.ui.h:1 ../qt/data/PdfExportDialog.ui.h:1 msgid "PDF Export" msgstr "Exportar a PDF" #: ../gtk/data/PdfExportDialog.ui.h:4 ../qt/data/PdfExportDialog.ui.h:4 msgid "Output mode:" msgstr "Modo de salida:" #: ../gtk/data/PdfExportDialog.ui.h:5 ../qt/data/PdfExportDialog.ui.h:6 msgid "PDF" msgstr "PDF" #: ../gtk/data/PdfExportDialog.ui.h:6 ../qt/data/PdfExportDialog.ui.h:7 msgid "PDF with invisible text overlay" msgstr "PDF con capa de texto oculta" #: ../gtk/data/PdfExportDialog.ui.h:7 ../qt/data/PdfExportDialog.ui.h:16 msgid "Format:" msgstr "Formato:" #: ../gtk/data/PdfExportDialog.ui.h:8 ../qt/data/PdfExportDialog.ui.h:17 msgid "Compression:" msgstr "Compresión:" #: ../gtk/data/PdfExportDialog.ui.h:9 ../qt/data/PdfExportDialog.ui.h:14 msgid "Compression quality:" msgstr "Calidad en la compresión:" #: ../gtk/data/PdfExportDialog.ui.h:10 ../qt/data/PdfExportDialog.ui.h:15 msgid "DPI:" msgstr "PPP:" #: ../gtk/data/PdfExportDialog.ui.h:11 ../qt/data/PdfExportDialog.ui.h:18 msgid "Dithering algorithm:" msgstr "Algoritmo de difuminado:" #: ../gtk/data/PdfExportDialog.ui.h:12 ../qt/data/PdfExportDialog.ui.h:13 msgid "Image settings:" msgstr "Ajustes de imagen:" #: ../gtk/data/PdfExportDialog.ui.h:13 ../qt/data/PdfExportDialog.ui.h:25 msgid "Uniformize line and word spacing" msgstr "Igualar el espaciado de línea y palabra" #: ../gtk/data/PdfExportDialog.ui.h:14 ../qt/data/PdfExportDialog.ui.h:21 msgid "Override font family:" msgstr "Cambiar la familia tipográfica:" #: ../gtk/data/PdfExportDialog.ui.h:15 ../qt/data/PdfExportDialog.ui.h:27 msgid "Fallback font family:" msgstr "Familia tipográfica alternativa:" #: ../gtk/data/PdfExportDialog.ui.h:16 ../qt/data/PdfExportDialog.ui.h:20 msgid "Override font size:" msgstr "Cambiar el tamaño de letra:" #: ../gtk/data/PdfExportDialog.ui.h:17 ../qt/data/PdfExportDialog.ui.h:23 msgid "Font scaling:" msgstr "Tamaño de la tipografía:" #: ../gtk/data/PdfExportDialog.ui.h:18 ../qt/data/PdfExportDialog.ui.h:26 msgid "pt" msgstr "pt" #: ../gtk/data/PdfExportDialog.ui.h:19 ../qt/data/PdfExportDialog.ui.h:22 msgid "Preserve spaces wider than:" msgstr "Conservar los espacios mayores que:" #: ../gtk/data/PdfExportDialog.ui.h:20 ../qt/data/PdfExportDialog.ui.h:24 msgid "characters" msgstr "caracteres" #: ../gtk/data/PdfExportDialog.ui.h:21 ../qt/data/PdfExportDialog.ui.h:28 msgid "Sanitize hyphens before line breaks" msgstr "" #: ../gtk/data/PdfExportDialog.ui.h:22 ../qt/data/PdfExportDialog.ui.h:19 msgid "Text settings:" msgstr "Ajustes de texto:" #: ../gtk/data/PdfExportDialog.ui.h:23 ../qt/data/PdfExportDialog.ui.h:10 msgid "Paper size:" msgstr "Tamaño del papel:" #: ../gtk/data/PdfExportDialog.ui.h:24 ../qt/data/PdfExportDialog.ui.h:11 msgid "Width" msgstr "Ancho" #: ../gtk/data/PdfExportDialog.ui.h:25 ../qt/data/PdfExportDialog.ui.h:12 msgid "Height" msgstr "Alto" #: ../gtk/data/PdfExportDialog.ui.h:26 ../qt/data/PdfExportDialog.ui.h:29 msgid "Treat image sources as having true DPI:" msgstr "" #: ../gtk/data/PdfExportDialog.ui.h:27 ../qt/data/PdfExportDialog.ui.h:3 msgid "Basic" msgstr "Básico" #: ../gtk/data/PdfExportDialog.ui.h:28 ../qt/data/PdfExportDialog.ui.h:31 msgid "PDF version:" msgstr "Versión de PDF:" #: ../gtk/data/PdfExportDialog.ui.h:29 ../qt/data/PdfExportDialog.ui.h:33 msgid "Password:" msgstr "Contraseña:" #: ../gtk/data/PdfExportDialog.ui.h:30 ../qt/data/PdfExportDialog.ui.h:34 msgid "Confirm password:" msgstr "Confirmar la contraseña:" #: ../gtk/data/PdfExportDialog.ui.h:31 ../qt/data/PdfExportDialog.ui.h:32 msgid "Encryption (optional):" msgstr "Cifrado (opcional):" #: ../gtk/data/PdfExportDialog.ui.h:32 ../qt/data/PdfExportDialog.ui.h:36 msgid "Author:" msgstr "Autor:" #: ../gtk/data/PdfExportDialog.ui.h:33 ../qt/data/PdfExportDialog.ui.h:38 msgid "Title:" msgstr "Título:" #: ../gtk/data/PdfExportDialog.ui.h:34 ../qt/data/PdfExportDialog.ui.h:40 msgid "Subject:" msgstr "Asunto:" #: ../gtk/data/PdfExportDialog.ui.h:35 ../qt/data/PdfExportDialog.ui.h:37 msgid "Creator:" msgstr "Creador:" #: ../gtk/data/PdfExportDialog.ui.h:36 ../qt/data/PdfExportDialog.ui.h:39 msgid "Producer:" msgstr "Productor:" #: ../gtk/data/PdfExportDialog.ui.h:37 ../qt/data/PdfExportDialog.ui.h:41 msgid "Keywords:" msgstr "Palabras clave:" #: ../gtk/data/PdfExportDialog.ui.h:38 ../qt/data/PdfExportDialog.ui.h:35 msgid "Additional information (optional):" msgstr "Información adicional (opcional):" #: ../gtk/data/PdfExportDialog.ui.h:39 ../qt/data/PdfExportDialog.ui.h:42 msgid "Import from current source" msgstr "Importar del origen actual" #: ../gtk/data/PdfExportDialog.ui.h:40 ../qt/data/PdfExportDialog.ui.h:30 msgid "Advanced" msgstr "Avanzado" #: ../gtk/data/SearchReplaceFrame.ui.h:1 ../qt/data/SearchReplaceFrame.ui.h:4 msgid "Find" msgstr "Buscar" #: ../gtk/data/SearchReplaceFrame.ui.h:2 ../qt/data/SearchReplaceFrame.ui.h:2 msgid "Replace" msgstr "Sustituir" #: ../gtk/data/SearchReplaceFrame.ui.h:3 ../qt/data/SearchReplaceFrame.ui.h:3 msgid "Replace all" msgstr "Sustituir todo" #: ../gtk/data/SearchReplaceFrame.ui.h:4 ../qt/data/SearchReplaceFrame.ui.h:5 msgid "Find previous" msgstr "Buscar anterior" #: ../gtk/data/SearchReplaceFrame.ui.h:5 ../qt/data/SearchReplaceFrame.ui.h:6 msgid "Find next" msgstr "Buscar siguiente" #: ../gtk/data/SearchReplaceFrame.ui.h:6 ../qt/data/SearchReplaceFrame.ui.h:7 msgid "Match case" msgstr "Distinguir mayúsculas de minúsculas" #: ../gtk/data/SearchReplaceFrame.ui.h:7 #: ../gtk/data/SubstitutionsManager.ui.h:1 ../qt/data/SearchReplaceFrame.ui.h:1 #: ../qt/src/SubstitutionsManager.cc:36 msgid "Substitutions" msgstr "Sustituciones" #: ../gtk/data/SelectionMenu.ui.h:1 ../qt/src/DisplayerToolSelect.cc:239 msgid "Delete" msgstr "Borrar" #: ../gtk/data/SelectionMenu.ui.h:2 ../qt/src/DisplayerToolSelect.cc:225 msgid "Order:" msgstr "Orden:" #: ../gtk/data/SelectionMenu.ui.h:3 ../gtk/src/hocr/DisplayerToolHOCR.cc:29 #: ../qt/src/DisplayerToolSelect.cc:240 ../qt/src/hocr/DisplayerToolHOCR.cc:31 msgid "Recognize" msgstr "Reconocer" #: ../gtk/data/SelectionMenu.ui.h:4 ../qt/src/DisplayerToolSelect.cc:241 msgid "Recognize to clipboard" msgstr "Reconocer al portapapeles" #: ../gtk/data/SelectionMenu.ui.h:5 ../qt/src/DisplayerToolSelect.cc:242 msgid "Save as image" msgstr "Guardar como imagen" #: ../gtk/data/SubstitutionsManager.ui.h:2 ../qt/src/SubstitutionsManager.cc:38 #: ../qt/src/SubstitutionsManager.cc:39 msgid "Open" msgstr "Abrir" #: ../gtk/data/SubstitutionsManager.ui.h:3 ../gtk/src/Utils.cc:73 #: ../qt/src/SubstitutionsManager.cc:41 ../qt/src/SubstitutionsManager.cc:42 msgid "Save" msgstr "Guardar" #: ../gtk/data/SubstitutionsManager.ui.h:4 ../qt/src/SubstitutionsManager.cc:44 #: ../qt/src/SubstitutionsManager.cc:45 msgid "Clear" msgstr "Limpiar" #: ../gtk/data/SubstitutionsManager.ui.h:5 ../qt/data/ConfigDialog.ui.h:16 #: ../qt/src/SubstitutionsManager.cc:47 ../qt/src/SubstitutionsManager.cc:48 msgid "Add" msgstr "Agregar" #: ../gtk/data/SubstitutionsManager.ui.h:6 #: ../gtk/src/hocr/OutputEditorHOCR.cc:886 ../qt/data/ConfigDialog.ui.h:17 #: ../qt/src/hocr/OutputEditorHOCR.cc:727 ../qt/src/SubstitutionsManager.cc:50 #: ../qt/src/SubstitutionsManager.cc:51 msgid "Remove" msgstr "Quitar" #: ../gtk/data/SubstitutionsManager.ui.h:7 ../gtk/data/TessdataManager.ui.h:2 msgid "Apply" msgstr "Aplicar" #: ../gtk/data/SubstitutionsManager.ui.h:8 ../gtk/data/TessdataManager.ui.h:3 msgid "Close" msgstr "Cerrar" #: ../gtk/data/TessdataManager.ui.h:1 ../qt/src/TessdataManager.cc:49 msgid "Tessdata Manager" msgstr "Gestor de Tessdata" #: ../gtk/data/TessdataManager.ui.h:5 ../qt/src/TessdataManager.cc:51 msgid "Manage installed languages:" msgstr "Gestionar idiomas instalados:" #: ../gtk/src/Acquirer.cc:79 ../qt/src/Acquirer.cc:70 msgid "scan.png" msgstr "escaneo.png" #: ../gtk/src/Acquirer.cc:91 ../qt/src/Acquirer.cc:85 msgid "Images" msgstr "Imágenes" #: ../gtk/src/Acquirer.cc:92 ../qt/src/Acquirer.cc:86 msgid "Choose Output Filename..." msgstr "Escoja el nombre del fichero de salida..." #: ../gtk/src/Acquirer.cc:106 ../qt/src/Acquirer.cc:100 msgid "Failed to initialize the scanning backend." msgstr "Fallo al iniciar el sistema de escaneo." #: ../gtk/src/Acquirer.cc:115 ../qt/src/Acquirer.cc:106 msgid "Scan failed" msgstr "Fallo al escanear" #: ../gtk/src/Acquirer.cc:133 ../qt/src/Acquirer.cc:122 msgid "No scanners were detected." msgstr "No se ha detectado ningún escáner." #: ../gtk/src/Acquirer.cc:150 ../gtk/src/Acquirer.cc:168 #: ../qt/src/Acquirer.cc:136 ../qt/src/Acquirer.cc:154 msgid "Starting scan..." msgstr "Comenzando escaneo..." #: ../gtk/src/Acquirer.cc:164 ../qt/src/Acquirer.cc:150 msgid "Opening device..." msgstr "Abriendo el dispositivo..." #: ../gtk/src/Acquirer.cc:166 ../qt/src/Acquirer.cc:152 msgid "Setting options..." msgstr "Ajustando las opciones..." #: ../gtk/src/Acquirer.cc:170 ../qt/src/Acquirer.cc:156 msgid "Getting parameters..." msgstr "Obteniendo los parámetros..." #: ../gtk/src/Acquirer.cc:172 ../qt/src/Acquirer.cc:158 msgid "Transferring data..." msgstr "Transfiriendo los datos..." #: ../gtk/src/Acquirer.cc:179 ../qt/src/Acquirer.cc:165 msgid "Canceling scan..." msgstr "Cancelando el escaneo..." #: ../gtk/src/Config.cc:49 ../qt/data/ConfigDialog.ui.h:7 msgid "Filename prefix" msgstr "Prefijo del nombre de fichero" #: ../gtk/src/Config.cc:50 ../qt/data/ConfigDialog.ui.h:8 msgid "Code" msgstr "Código" #: ../gtk/src/Config.cc:51 ../qt/data/ConfigDialog.ui.h:9 msgid "Native name" msgstr "Nombre nativo" #: ../gtk/src/Config.cc:109 ../qt/src/Config.cc:108 msgid "Script" msgstr "" #: ../gtk/src/CrashHandler.cc:25 ../gtk/src/CrashHandler.cc:41 #: ../qt/src/CrashHandler.cc:36 msgid "Crash Handler" msgstr "Gestor de fallos" #: ../gtk/src/CrashHandler.cc:43 ../qt/src/CrashHandler.cc:31 msgid "Your work has been saved under %1." msgstr "Su trabajo se ha guardado en %1." #: ../gtk/src/CrashHandler.cc:45 ../qt/src/CrashHandler.cc:33 msgid "There was no unsaved work." msgstr "No hay trabajos sin guardar." #: ../gtk/src/CrashHandler.cc:106 ../qt/src/CrashHandler.cc:62 msgid "Failed to obtain backtrace. Is gdb installed?" msgstr "Fallo al obtener traza inversa del fallo. ¿Está instalado gdb?" #: ../gtk/src/Displayer.cc:232 ../qt/src/Displayer.cc:174 msgid "Failed to load image" msgstr "Fallo al cargar imagen" #: ../gtk/src/Displayer.cc:232 ../qt/src/Displayer.cc:174 msgid "" "The file might not be an image or be corrupt:\n" "%1" msgstr "" "Puede que el fichero no sea una imagen o esté corrupto:\n" "%1" #: ../gtk/src/DisplayerToolSelect.cc:138 ../qt/src/DisplayerToolSelect.cc:135 msgid "PNG Images" msgstr "Imágenes PNG" #: ../gtk/src/DisplayerToolSelect.cc:139 ../qt/src/DisplayerToolSelect.cc:135 msgid "Save Selection Image" msgstr "Guardar imagen de la selección" #: ../gtk/src/DisplayerToolSelect.cc:139 ../qt/src/DisplayerToolSelect.cc:135 msgid "selection.png" msgstr "seleccion.png" #: ../gtk/src/DisplayerToolSelect.cc:146 ../qt/src/DisplayerToolSelect.cc:142 msgid "Recognize all" msgstr "Reconocer todo" #: ../gtk/src/DisplayerToolSelect.cc:146 ../qt/src/DisplayerToolSelect.cc:142 msgid "Recognize selection" msgstr "Reconocer la selección" #: ../gtk/src/DisplayerToolSelect.cc:186 ../qt/src/DisplayerToolSelect.cc:182 msgid "Performing layout analysis" msgstr "Analizando la estructura" #: ../gtk/src/FileDialogs.cc:235 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 sobrescribirlo?" #: ../gtk/src/FileDialogs.cc:237 msgid "Overwrite File?" msgstr "¿Sobrescribir el fichero?" #: ../gtk/src/hocr/HOCRDocument.cc:611 ../gtk/src/hocr/OutputEditorHOCR.cc:266 #: ../qt/src/hocr/OutputEditorHOCR.cc:229 msgid "Page" msgstr "Página" #: ../gtk/src/hocr/HOCRDocument.cc:613 ../qt/src/hocr/HOCRDocument.cc:530 msgid "Text block" msgstr "Bloque de texto" #: ../gtk/src/hocr/HOCRDocument.cc:615 ../gtk/src/hocr/OutputEditorHOCR.cc:272 #: ../qt/src/hocr/HOCRDocument.cc:532 ../qt/src/hocr/OutputEditorHOCR.cc:231 msgid "Paragraph" msgstr "Párrafo" #: ../gtk/src/hocr/HOCRDocument.cc:617 ../qt/src/hocr/HOCRDocument.cc:534 msgid "Textline" msgstr "Línea de texto" #: ../gtk/src/hocr/HOCRDocument.cc:621 ../qt/src/hocr/HOCRDocument.cc:538 msgid "Graphic" msgstr "Gráfico" #: ../gtk/src/hocr/HOCROdtExporter.cc:65 ../gtk/src/hocr/HOCRPdfExporter.cc:489 #: ../gtk/src/hocr/HOCRTextExporter.cc:34 #: ../gtk/src/hocr/OutputEditorHOCR.cc:963 ../gtk/src/OutputEditorText.cc:272 #: ../qt/src/hocr/HOCROdtExporter.cc:50 ../qt/src/hocr/HOCRPdfExporter.cc:478 #: ../qt/src/hocr/HOCRTextExporter.cc:36 ../qt/src/hocr/OutputEditorHOCR.cc:830 #: ../qt/src/OutputEditorText.cc:238 msgid "output" msgstr "salida" #: ../gtk/src/hocr/HOCROdtExporter.cc:68 ../qt/src/hocr/HOCROdtExporter.cc:53 msgid "OpenDocument Text Documents" msgstr "Documentos de texto OpenDocument" #: ../gtk/src/hocr/HOCROdtExporter.cc:69 ../qt/src/hocr/HOCROdtExporter.cc:53 msgid "Save ODT Output..." msgstr "Guardar salida ODT..." #: ../gtk/src/hocr/HOCROdtExporter.cc:77 ../gtk/src/hocr/HOCROdtExporter.cc:342 #: ../gtk/src/hocr/HOCRPdfExporter.cc:619 #: ../gtk/src/hocr/HOCRTextExporter.cc:46 ../qt/src/hocr/HOCROdtExporter.cc:61 #: ../qt/src/hocr/HOCRPdfExporter.cc:609 ../qt/src/hocr/HOCRTextExporter.cc:47 msgid "Export failed" msgstr "La exportación ha fallado" #: ../gtk/src/hocr/HOCROdtExporter.cc:77 ../gtk/src/hocr/HOCROdtExporter.cc:342 #: ../qt/src/hocr/HOCROdtExporter.cc:61 msgid "The ODT export failed: unable to write output file." msgstr "" "La exportación a ODT ha fallado: no se puede escribir el fichero de salida." #: ../gtk/src/hocr/HOCROdtExporter.cc:336 ../qt/src/hocr/HOCROdtExporter.cc:254 msgid "Exporting to ODT..." msgstr "Exportar a ODT..." #: ../gtk/src/hocr/HOCRPdfExporter.cc:283 ../qt/src/hocr/HOCRPdfExporter.cc:365 msgid "Same as source" msgstr "Igual que el original" #: ../gtk/src/hocr/HOCRPdfExporter.cc:286 ../qt/src/hocr/HOCRPdfExporter.cc:366 msgid "Custom" msgstr "Personalizado" #: ../gtk/src/hocr/HOCRPdfExporter.cc:300 ../qt/src/hocr/HOCRPdfExporter.cc:362 msgid "cm" msgstr "cm" #: ../gtk/src/hocr/HOCRPdfExporter.cc:303 ../qt/src/hocr/HOCRPdfExporter.cc:363 msgid "in" msgstr "en" #: ../gtk/src/hocr/HOCRPdfExporter.cc:319 ../qt/src/hocr/HOCRPdfExporter.cc:353 msgid "Monochrome" msgstr "Monocromo" #: ../gtk/src/hocr/HOCRPdfExporter.cc:328 ../qt/src/hocr/HOCRPdfExporter.cc:355 msgid "Threshold (closest color)" msgstr "Umbral (color más parecido)" #: ../gtk/src/hocr/HOCRPdfExporter.cc:331 ../qt/src/hocr/HOCRPdfExporter.cc:356 msgid "Diffuse" msgstr "Difuso" #: ../gtk/src/hocr/HOCRPdfExporter.cc:340 ../qt/src/hocr/HOCRPdfExporter.cc:357 msgid "Zip (lossless)" msgstr "Zip (sin pérdida)" #: ../gtk/src/hocr/HOCRPdfExporter.cc:344 ../qt/src/hocr/HOCRPdfExporter.cc:358 msgid "CCITT Group 4 (lossless)" msgstr "CCITT Grupo 4 (sin pérdida)" #: ../gtk/src/hocr/HOCRPdfExporter.cc:348 ../qt/src/hocr/HOCRPdfExporter.cc:359 msgid "Jpeg (lossy)" msgstr "Jpeg (con pérdida)" #: ../gtk/src/hocr/HOCRPdfExporter.cc:493 ../qt/src/hocr/HOCRPdfExporter.cc:482 msgid "PDF Files" msgstr "Ficheros PDF" #: ../gtk/src/hocr/HOCRPdfExporter.cc:494 ../qt/src/hocr/HOCRPdfExporter.cc:482 msgid "Save PDF Output..." msgstr "Guardar salida PDF..." #: ../gtk/src/hocr/HOCRPdfExporter.cc:500 ../qt/src/hocr/HOCRPdfExporter.cc:488 msgid "Invalid Output" msgstr "Salida no válida" #: ../gtk/src/hocr/HOCRPdfExporter.cc:500 ../qt/src/hocr/HOCRPdfExporter.cc:488 msgid "Cannot overwrite a file which is a source image of this document." msgstr "" "No se puede sobrescribir un fichero que sea una imagen original de este " "documento." #: ../gtk/src/hocr/HOCRPdfExporter.cc:516 ../qt/src/hocr/HOCRPdfExporter.cc:511 msgid "Failed to create output" msgstr "Fallo al guardar salida" #: ../gtk/src/hocr/HOCRPdfExporter.cc:516 ../qt/src/hocr/HOCRPdfExporter.cc:511 msgid "Failed to create output. The returned error was: %1" msgstr "Error al crear la salida. El error devuelto es: %1" #: ../gtk/src/hocr/HOCRPdfExporter.cc:558 ../qt/src/hocr/HOCRPdfExporter.cc:551 msgid "The operation was cancelled" msgstr "La operación ha sido cancelada" #: ../gtk/src/hocr/HOCRPdfExporter.cc:607 ../qt/src/hocr/HOCRPdfExporter.cc:597 msgid "Failed to render page %1" msgstr "Fallo al representar la página %1" #: ../gtk/src/hocr/HOCRPdfExporter.cc:614 ../qt/src/hocr/HOCRPdfExporter.cc:604 msgid "Exporting to PDF..." msgstr "Exportando a PDF..." #: ../gtk/src/hocr/HOCRPdfExporter.cc:619 ../qt/src/hocr/HOCRPdfExporter.cc:609 msgid "The PDF export failed: %1." msgstr "La exportación a PDF ha fallado: %1." #: ../gtk/src/hocr/HOCRPdfExporter.cc:673 ../qt/src/hocr/HOCRPdfExporter.cc:662 msgid "The PDF library could not load the font '%1'." msgstr "La biblioteca PDF no puede cargar la tipografía '%1'." #: ../gtk/src/hocr/HOCRTextExporter.cc:37 ../gtk/src/OutputEditorText.cc:274 #: ../qt/src/hocr/HOCRTextExporter.cc:39 ../qt/src/OutputEditorText.cc:239 msgid "Text Files" msgstr "Ficheros de texto" #: ../gtk/src/hocr/HOCRTextExporter.cc:38 ../qt/src/hocr/HOCRTextExporter.cc:39 msgid "Save Text Output..." msgstr "Guardar el texto de salida..." #: ../gtk/src/hocr/HOCRTextExporter.cc:46 ../qt/src/hocr/HOCRTextExporter.cc:47 msgid "The text export failed: unable to write output file." msgstr "" "La exportación a texto ha fallado: no se puede escribir el fichero de salida." #: ../gtk/src/hocr/OutputEditorHOCR.cc:269 #: ../qt/src/hocr/OutputEditorHOCR.cc:230 msgid "Block" msgstr "Bloque" #: ../gtk/src/hocr/OutputEditorHOCR.cc:275 #: ../qt/src/hocr/OutputEditorHOCR.cc:232 msgid "Line" msgstr "Línea" #: ../gtk/src/hocr/OutputEditorHOCR.cc:278 #: ../qt/src/hocr/OutputEditorHOCR.cc:233 msgid "Word" msgstr "Palabra" #: ../gtk/src/hocr/OutputEditorHOCR.cc:281 #: ../qt/src/hocr/OutputEditorHOCR.cc:234 msgid "Misspelled word" msgstr "Palabra mal escrita" #: ../gtk/src/hocr/OutputEditorHOCR.cc:435 #: ../qt/src/hocr/OutputEditorHOCR.cc:317 msgid "" "The following pages could not be processed:\n" "%1" msgstr "" "Las siguientes páginas no se han podido procesar:\n" "%1" #: ../gtk/src/hocr/OutputEditorHOCR.cc:436 #: ../qt/src/hocr/OutputEditorHOCR.cc:318 msgid "Recognition errors" msgstr "Hubo errores durante el reconocimiento" #: ../gtk/src/hocr/OutputEditorHOCR.cc:594 #: ../qt/src/hocr/OutputEditorHOCR.cc:500 #: ../qt/src/hocr/OutputEditorHOCR.cc:512 msgid "Multiple values" msgstr "Múltiples valores" #. Merging allowed #: ../gtk/src/hocr/OutputEditorHOCR.cc:778 #: ../qt/src/hocr/OutputEditorHOCR.cc:641 msgid "Merge" msgstr "Fusionar" #: ../gtk/src/hocr/OutputEditorHOCR.cc:786 #: ../gtk/src/hocr/OutputEditorHOCR.cc:877 #: ../qt/src/hocr/OutputEditorHOCR.cc:643 #: ../qt/src/hocr/OutputEditorHOCR.cc:725 msgid "Split from parent" msgstr "" #. Swapping allowed #: ../gtk/src/hocr/OutputEditorHOCR.cc:797 #: ../qt/src/hocr/OutputEditorHOCR.cc:647 msgid "Swap" msgstr "Intercambiar" #: ../gtk/src/hocr/OutputEditorHOCR.cc:821 #: ../qt/src/hocr/OutputEditorHOCR.cc:693 msgid "Add graphic region" msgstr "Añadir zona gráfica" #: ../gtk/src/hocr/OutputEditorHOCR.cc:824 #: ../qt/src/hocr/OutputEditorHOCR.cc:694 msgid "Add text block" msgstr "Añadir un bloque de texto" #: ../gtk/src/hocr/OutputEditorHOCR.cc:828 #: ../qt/src/hocr/OutputEditorHOCR.cc:696 msgid "Add paragraph" msgstr "Añadir párrafo" #: ../gtk/src/hocr/OutputEditorHOCR.cc:832 #: ../qt/src/hocr/OutputEditorHOCR.cc:698 msgid "Add line" msgstr "Añadir línea" #: ../gtk/src/hocr/OutputEditorHOCR.cc:836 #: ../qt/src/hocr/OutputEditorHOCR.cc:700 msgid "Add word" msgstr "Añadir una palabra" #: ../gtk/src/hocr/OutputEditorHOCR.cc:852 #: ../qt/src/hocr/OutputEditorHOCR.cc:710 msgid "No suggestions" msgstr "Sin sugerencias" #: ../gtk/src/hocr/OutputEditorHOCR.cc:858 #: ../qt/src/hocr/OutputEditorHOCR.cc:714 msgid "Add to dictionary" msgstr "Añadir al diccionario" #: ../gtk/src/hocr/OutputEditorHOCR.cc:864 #: ../qt/src/hocr/OutputEditorHOCR.cc:716 msgid "Ignore word" msgstr "Ignorar palabra" #: ../gtk/src/hocr/OutputEditorHOCR.cc:926 #: ../gtk/src/hocr/OutputEditorHOCR.cc:965 #: ../qt/src/hocr/OutputEditorHOCR.cc:795 #: ../qt/src/hocr/OutputEditorHOCR.cc:832 msgid "hOCR HTML Files" msgstr "Ficheros HTML de hOCR" #: ../gtk/src/hocr/OutputEditorHOCR.cc:927 #: ../qt/src/hocr/OutputEditorHOCR.cc:795 msgid "Open hOCR File" msgstr "Abrir fichero hOCR" #: ../gtk/src/hocr/OutputEditorHOCR.cc:936 #: ../qt/src/hocr/OutputEditorHOCR.cc:802 msgid "Failed to open file" msgstr "Error al abrir el fichero" #: ../gtk/src/hocr/OutputEditorHOCR.cc:936 #: ../qt/src/hocr/OutputEditorHOCR.cc:802 msgid "The file could not be opened: %1." msgstr "No se puede abrir el fichero: %1." #: ../gtk/src/hocr/OutputEditorHOCR.cc:945 #: ../qt/src/hocr/OutputEditorHOCR.cc:809 msgid "Invalid hOCR file" msgstr "Fichero hOCR no válido" #: ../gtk/src/hocr/OutputEditorHOCR.cc:945 #: ../qt/src/hocr/OutputEditorHOCR.cc:809 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/hocr/OutputEditorHOCR.cc:966 #: ../qt/src/hocr/OutputEditorHOCR.cc:832 msgid "Save hOCR Output..." msgstr "Guardar salida hOCR..." #: ../gtk/src/hocr/OutputEditorHOCR.cc:973 ../gtk/src/OutputEditorText.cc:282 #: ../qt/src/hocr/OutputEditorHOCR.cc:839 ../qt/src/OutputEditorText.cc:246 msgid "Failed to save output" msgstr "Fallo al guardar salida" #: ../gtk/src/hocr/OutputEditorHOCR.cc:973 ../gtk/src/OutputEditorText.cc:282 #: ../qt/src/hocr/OutputEditorHOCR.cc:839 ../qt/src/OutputEditorText.cc:246 msgid "Check that you have writing permissions in the selected folder." msgstr "" "Compruebe que tiene permiso de escritura en el directorio seleccionado." #: ../gtk/src/hocr/OutputEditorHOCR.cc:1035 ../gtk/src/OutputEditorText.cc:296 #: ../qt/src/hocr/OutputEditorHOCR.cc:894 ../qt/src/OutputEditorText.cc:259 msgid "Output not saved" msgstr "Salida no guardada" #: ../gtk/src/hocr/OutputEditorHOCR.cc:1035 ../gtk/src/OutputEditorText.cc:296 #: ../qt/src/hocr/OutputEditorHOCR.cc:894 ../qt/src/OutputEditorText.cc:259 msgid "Save output before proceeding?" msgstr "¿Guardar antes de comenzar?" #: ../gtk/src/hocr/OutputEditorHOCR.cc:1156 ../gtk/src/OutputEditorText.cc:184 #: ../qt/src/hocr/OutputEditorHOCR.cc:991 ../qt/src/OutputEditorText.cc:152 msgid "Replacing..." msgstr "Sustituyendo..." #: ../gtk/src/hocr/OutputEditorHOCR.cc:1181 ../gtk/src/OutputEditorText.cc:192 #: ../qt/src/hocr/OutputEditorHOCR.cc:1014 ../qt/src/OutputEditorText.cc:160 msgid "Applying substitutions..." msgstr "Aplicando sustituciones..." #: ../gtk/src/MainWindow.cc:131 ../qt/src/MainWindow.cc:295 msgid "Using tesseract" msgstr "Utilizando tesseract" #: ../gtk/src/MainWindow.cc:178 ../qt/src/MainWindow.cc:194 msgid "Select an image to begin..." msgstr "Seleccione una imagen para comenzar..." #: ../gtk/src/MainWindow.cc:293 ../qt/src/MainWindow.cc:278 msgid "Multiple sources" msgstr "Múltiples orígenes" #: ../gtk/src/MainWindow.cc:295 ../qt/src/MainWindow.cc:280 msgid "Ready" msgstr "Listo" #: ../gtk/src/MainWindow.cc:442 ../qt/src/MainWindow.cc:423 msgid "New version" msgstr "Nueva versión" #: ../gtk/src/MainWindow.cc:442 ../qt/src/MainWindow.cc:423 msgid "gImageReader %1 is available" msgstr "gImageReader %1 está disponible" #: ../gtk/src/MainWindow.cc:443 ../qt/src/MainWindow.cc:424 msgid "Download" msgstr "Descargar" #: ../gtk/src/MainWindow.cc:444 ../qt/src/MainWindow.cc:425 msgid "Changelog" msgstr "Registro de cambios" #: ../gtk/src/MainWindow.cc:445 ../qt/src/MainWindow.cc:426 msgid "Don't notify again" msgstr "No mostrar más avisos" #: ../gtk/src/MainWindow.cc:466 ../qt/src/MainWindow.cc:474 msgid "Don't show again" msgstr "No mostrar otra vez" #: ../gtk/src/MainWindow.cc:467 ../gtk/src/MainWindow.cc:480 #: ../qt/src/MainWindow.cc:475 msgid "Install" msgstr "Instalar" #: ../gtk/src/MainWindow.cc:487 ../qt/src/MainWindow.cc:487 msgid "Spelling dictionary missing" msgstr "Falta diccionario" #: ../gtk/src/MainWindow.cc:487 ../qt/src/MainWindow.cc:487 msgid "The spellcheck dictionary for %1 is not installed" msgstr "El diccionario para %1 no está instalado" #: ../gtk/src/MainWindow.cc:494 ../gtk/src/MainWindow.cc:523 #: ../qt/src/MainWindow.cc:493 msgid "Installing spelling dictionary for '%1'" msgstr "Instalando el diccionario para '%1'" #: ../gtk/src/MainWindow.cc:515 ../gtk/src/MainWindow.cc:536 #: ../gtk/src/MainWindow.cc:544 ../gtk/src/MainWindow.cc:592 #: ../gtk/src/MainWindow.cc:597 ../gtk/src/TessdataManager.cc:60 #: ../gtk/src/TessdataManager.cc:70 ../gtk/src/TessdataManager.cc:339 #: ../qt/src/MainWindow.cc:512 ../qt/src/MainWindow.cc:525 #: ../qt/src/MainWindow.cc:534 ../qt/src/MainWindow.cc:578 #: ../qt/src/MainWindow.cc:583 ../qt/src/TessdataManager.cc:74 #: ../qt/src/TessdataManager.cc:84 ../qt/src/TessdataManager.cc:315 msgid "Error" msgstr "Error" #: ../gtk/src/MainWindow.cc:515 ../qt/src/MainWindow.cc:512 msgid "Failed to install spelling dictionary: %1" msgstr "Fallo al instalar el diccionario: %1" #: ../gtk/src/MainWindow.cc:536 ../qt/src/MainWindow.cc:525 msgid "Failed to create directory for spelling dictionaries." msgstr "Fallo al crear el directorio para los diccionarios." #: ../gtk/src/MainWindow.cc:544 ../qt/src/MainWindow.cc:534 msgid "Could not read %1: %2." msgstr "No se puede leer %1: %2." #: ../gtk/src/MainWindow.cc:571 ../qt/src/MainWindow.cc:558 msgid "Downloading '%1'..." msgstr "Descargando '%1'..." #: ../gtk/src/MainWindow.cc:592 ../qt/src/MainWindow.cc:578 msgid "" "The following dictionaries could not be downloaded:\n" "%1\n" "\n" "Check the connectivity and directory permissions.\n" "Hint: If you don't have write permissions in system folders, you can switch " "to user paths in the settings dialog." msgstr "" "No se han podido descargar los siguientes diccionarios:\n" "%1\n" "\n" "Compruebe la conexión y los permisos del directorio.\n" "Nota: si no tiene permiso de escritura en carpetas del sistema, puede " "cambiarla a rutas del usuario en el diálogo de configuración." #: ../gtk/src/MainWindow.cc:595 ../qt/src/MainWindow.cc:581 msgid "Dictionaries installed" msgstr "Diccionarios instalados" #: ../gtk/src/MainWindow.cc:595 msgid "" "The following dictionaries were installed:\n" "%1" msgstr "" "Se han instalado los siguientes diccionarios:\n" "%1" #: ../gtk/src/MainWindow.cc:597 ../qt/src/MainWindow.cc:583 msgid "No spelling dictionaries found for '%1'." msgstr "No se han encontrado diccionarios ortográficos para '%1'." #: ../gtk/src/OutputEditorText.cc:154 ../qt/src/OutputEditorText.cc:137 msgid "Stripping line breaks..." msgstr "Quitando los saltos de línea..." #: ../gtk/src/OutputEditorText.cc:162 msgid "Check spelling" msgstr "Comprobando la ortografía" #: ../gtk/src/OutputEditorText.cc:231 ../qt/src/OutputEditorText.cc:196 msgid "File: %1" msgstr "Fichero: %1" #: ../gtk/src/OutputEditorText.cc:234 ../qt/src/OutputEditorText.cc:199 msgid "Page: %1" msgstr "Página: %1" #: ../gtk/src/OutputEditorText.cc:247 ../gtk/src/Recognizer.cc:471 #: ../qt/src/Recognizer.cc:462 msgid "" "\n" "[Failed to recognize page %1]\n" msgstr "" "\n" "[Fallo al reconocer la página %1]\n" #: ../gtk/src/OutputEditorText.cc:275 ../qt/src/OutputEditorText.cc:239 msgid "Save Output..." msgstr "Guardar la salida..." #: ../gtk/src/Recognizer.cc:179 ../qt/src/Recognizer.cc:172 msgid "No languages available" msgstr "No hay idiomas disponibles" #: ../gtk/src/Recognizer.cc:179 ../qt/src/Recognizer.cc:172 msgid "" "No tesseract languages are available for use. Recognition will not work." msgstr "" "No se han encontrado idiomas para tesseract. El reconocimiento no puede " "funcionar." #: ../gtk/src/Recognizer.cc:233 ../qt/src/Recognizer.cc:232 msgid "Multilingual" msgstr "Multilenguaje" #: ../gtk/src/Recognizer.cc:285 ../qt/src/Recognizer.cc:277 msgid "Automatic page segmentation" msgstr "Segmentación automática de página" #: ../gtk/src/Recognizer.cc:286 ../qt/src/Recognizer.cc:278 msgid "Page segmentation with orientation and script detection" msgstr "" "Segmentación de página con detección de tipo de escritura y orientación" #: ../gtk/src/Recognizer.cc:287 ../qt/src/Recognizer.cc:279 msgid "Assume single column of text" msgstr "Suponer una sola columna de texto" #: ../gtk/src/Recognizer.cc:288 ../qt/src/Recognizer.cc:280 msgid "Assume single block of vertically aligned text" msgstr "Suponer un solo bloque de texto alineado verticalmente" #: ../gtk/src/Recognizer.cc:289 ../qt/src/Recognizer.cc:281 msgid "Assume a single uniform block of text" msgstr "Suponer un solo bloque de texto uniforme" #: ../gtk/src/Recognizer.cc:290 ../qt/src/Recognizer.cc:282 msgid "Assume a line of text" msgstr "Suponer una línea de texto" #: ../gtk/src/Recognizer.cc:291 ../qt/src/Recognizer.cc:283 msgid "Assume a single word" msgstr "Suponer una sola palabra" #: ../gtk/src/Recognizer.cc:292 ../qt/src/Recognizer.cc:284 msgid "Assume a single word in a circle" msgstr "Suponer una sola palabra en un círculo" #: ../gtk/src/Recognizer.cc:293 ../qt/src/Recognizer.cc:285 msgid "Sparse text in no particular order" msgstr "Texto disperso sin un orden en particular" #: ../gtk/src/Recognizer.cc:294 ../qt/src/Recognizer.cc:286 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:309 ../qt/src/Recognizer.cc:297 msgid "Page segmentation mode" msgstr "Modo de segmentación de página" #: ../gtk/src/Recognizer.cc:313 ../qt/src/Recognizer.cc:300 msgid "Character whitelist / blacklist..." msgstr "" #: ../gtk/src/Recognizer.cc:319 ../qt/src/Recognizer.cc:305 msgid "Manage languages..." msgstr "Gestionar idiomas..." #: ../gtk/src/Recognizer.cc:375 ../qt/src/Recognizer.cc:369 msgid "Current selection" msgstr "Selección actual" #: ../gtk/src/Recognizer.cc:465 ../qt/src/Recognizer.cc:455 msgid "Recognizing page %1 (%2 of %3)" msgstr "Reconociendo la página %1 (%2 de %3)" #: ../gtk/src/Recognizer.cc:470 ../qt/src/Recognizer.cc:461 msgid "" "\n" "- Page %1: failed to render page" msgstr "" "\n" "\tPágina %1: fallo al representar la página" #: ../gtk/src/Recognizer.cc:501 ../gtk/src/Recognizer.cc:531 #: ../gtk/src/Recognizer.cc:544 ../qt/src/Recognizer.cc:491 #: ../qt/src/Recognizer.cc:521 ../qt/src/Recognizer.cc:534 msgid "Recognizing..." msgstr "Reconociendo..." #: ../gtk/src/Recognizer.cc:505 ../gtk/src/Recognizer.cc:514 #: ../qt/src/Recognizer.cc:495 ../qt/src/Recognizer.cc:504 msgid "Recognition errors occurred" msgstr "Hubo errores durante el reconocimiento" #: ../gtk/src/Recognizer.cc:505 ../qt/src/Recognizer.cc:495 msgid "The following errors occurred:%1" msgstr "Ocurrieron los siguientes errores: %1" #: ../gtk/src/Recognizer.cc:514 ../qt/src/Recognizer.cc:504 msgid "Failed to initialize tesseract" msgstr "Fallo al iniciar tesseract" #: ../gtk/src/scanner/ScannerSane.cc:84 ../gtk/src/scanner/ScannerTwain.cc:288 #: ../qt/src/scanner/ScannerSane.cc:85 ../qt/src/scanner/ScannerTwain.cc:286 msgid "Scan canceled" msgstr "Escaneo cancelado" #: ../gtk/src/scanner/ScannerSane.cc:159 ../gtk/src/scanner/ScannerTwain.cc:186 #: ../qt/src/scanner/ScannerSane.cc:159 ../qt/src/scanner/ScannerTwain.cc:178 msgid "No scanner specified" msgstr "No se ha indicado ningún escáner" #: ../gtk/src/scanner/ScannerSane.cc:168 ../gtk/src/scanner/ScannerTwain.cc:195 #: ../qt/src/scanner/ScannerSane.cc:168 ../qt/src/scanner/ScannerTwain.cc:187 msgid "Unable to connect to scanner" msgstr "No se puede conectar con el escáner" #: ../gtk/src/scanner/ScannerSane.cc:403 ../gtk/src/scanner/ScannerTwain.cc:266 #: ../gtk/src/scanner/ScannerTwain.cc:292 ../qt/src/scanner/ScannerSane.cc:403 #: ../qt/src/scanner/ScannerTwain.cc:258 ../qt/src/scanner/ScannerTwain.cc:290 msgid "Unable to start scan" msgstr "No se puede iniciar el escaneo" #: ../gtk/src/scanner/ScannerSane.cc:411 ../gtk/src/scanner/ScannerSane.cc:461 #: ../gtk/src/scanner/ScannerTwain.cc:318 ../qt/src/scanner/ScannerSane.cc:411 #: ../qt/src/scanner/ScannerSane.cc:461 ../qt/src/scanner/ScannerTwain.cc:316 msgid "Error communicating with scanner" msgstr "Error al comunicarse con el escáner" #: ../gtk/src/scanner/ScannerSane.cc:520 ../qt/src/scanner/ScannerSane.cc:517 msgid "Failed to save image" msgstr "Fallo al guardar imagen" #: ../gtk/src/scanner/ScannerSane.cc:800 ../qt/src/scanner/ScannerSane.cc:797 msgid "Operation is cancelled." msgstr "La operación se ha cancelado." #: ../gtk/src/scanner/ScannerSane.cc:802 ../qt/src/scanner/ScannerSane.cc:799 msgid "Device is busy." msgstr "El dispositivo está ocupado." #: ../gtk/src/scanner/ScannerSane.cc:804 ../qt/src/scanner/ScannerSane.cc:801 msgid "Cover is opened." msgstr "La cubierta está abierta." #: ../gtk/src/scanner/ScannerSane.cc:806 ../qt/src/scanner/ScannerSane.cc:803 msgid "Document feeder jammed." msgstr "Alimentador de documentos atascado." #: ../gtk/src/scanner/ScannerSane.cc:808 ../qt/src/scanner/ScannerSane.cc:805 msgid "Document feeder out of documents." msgstr "Alimentador de documentos vacío." #: ../gtk/src/scanner/ScannerSane.cc:810 ../qt/src/scanner/ScannerSane.cc:807 msgid "Access to scanner is denied." msgstr "No se puede acceder al escáner." #: ../gtk/src/SourceManager.cc:118 ../qt/src/SourceManager.cc:124 msgid "PDFs with text" msgstr "PDF con texto" #: ../gtk/src/SourceManager.cc:118 ../qt/src/SourceManager.cc:124 msgid "" "These PDF files already contain text:\n" "%1" msgstr "" "Estos archivos PDF ya contienen texto:\n" "%1" #: ../gtk/src/SourceManager.cc:127 ../qt/src/SourceManager.cc:132 msgid "Unable to open files" msgstr "No se puede abrir los ficheros" #: ../gtk/src/SourceManager.cc:127 ../qt/src/SourceManager.cc:132 msgid "The following files could not be opened:%1" msgstr "Los siguientes ficheros no se pueden abrir: %1" #: ../gtk/src/SourceManager.cc:141 ../qt/src/SourceManager.cc:143 msgid "Enter password for file '%1':" msgstr "Introduzca la contraseña del archivo '%1':" #: ../gtk/src/SourceManager.cc:197 ../qt/src/SourceManager.cc:214 msgid "Images and PDFs" msgstr "Imágenes y ficheros PDF" #: ../gtk/src/SourceManager.cc:202 ../qt/src/SourceManager.cc:215 msgid "Select Files" msgstr "Seleccionar ficheros" #: ../gtk/src/SourceManager.cc:208 ../qt/src/SourceManager.cc:226 msgid "Clipboard Error" msgstr "Error del portapapeles" #: ../gtk/src/SourceManager.cc:208 ../qt/src/SourceManager.cc:226 msgid "Failed to read the clipboard." msgstr "Fallo al leer el portapapeles." #: ../gtk/src/SourceManager.cc:212 ../qt/src/SourceManager.cc:230 #: ../qt/src/SourceManager.cc:236 msgid "Pasted %1" msgstr "Pegado %1" #: ../gtk/src/SourceManager.cc:224 ../qt/src/SourceManager.cc:243 msgid "Screenshot Error" msgstr "Error al captura la pantalla" #: ../gtk/src/SourceManager.cc:224 ../qt/src/SourceManager.cc:243 msgid "Failed to take screenshot." msgstr "Fallo al tomar captura de pantalla." #: ../gtk/src/SourceManager.cc:228 ../qt/src/SourceManager.cc:247 msgid "Screenshot %1" msgstr "Captura de pantalla %1" #: ../gtk/src/SourceManager.cc:233 ../qt/src/SourceManager.cc:252 msgid "Saving image..." msgstr "Guardando imagen..." #: ../gtk/src/SourceManager.cc:240 ../qt/src/SourceManager.cc:265 msgid "Cannot Write File" msgstr "No se puede escribir el fichero" #: ../gtk/src/SourceManager.cc:240 ../qt/src/SourceManager.cc:265 msgid "Could not write to %1." msgstr "No se puede escribir en %1." #: ../gtk/src/SourceManager.cc:267 ../qt/src/SourceManager.cc:287 msgid "Delete File?" msgstr "¿Borrar el fichero?" #: ../gtk/src/SourceManager.cc:267 ../qt/src/SourceManager.cc:287 msgid "The following files will be deleted:%1" msgstr "Los siguientes ficheros serán borrados:%1" #: ../gtk/src/SourceManager.cc:332 ../qt/src/SourceManager.cc:338 msgid "Missing File" msgstr "Falta el fichero" #: ../gtk/src/SourceManager.cc:332 ../qt/src/SourceManager.cc:338 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:33 ../qt/src/SubstitutionsManager.cc:73 msgid "Search for" msgstr "Buscar" #: ../gtk/src/SubstitutionsManager.cc:34 ../qt/src/SubstitutionsManager.cc:73 msgid "Replace with" msgstr "Sustituir con" #: ../gtk/src/SubstitutionsManager.cc:69 ../gtk/src/SubstitutionsManager.cc:103 #: ../qt/src/SubstitutionsManager.cc:106 ../qt/src/SubstitutionsManager.cc:143 msgid "Substitutions List" msgstr "Lista de sustituciones" #: ../gtk/src/SubstitutionsManager.cc:70 ../qt/src/SubstitutionsManager.cc:106 msgid "Open Substitutions List" msgstr "Abrir la lista de sustituciones" #: ../gtk/src/SubstitutionsManager.cc:75 ../qt/src/SubstitutionsManager.cc:112 msgid "Error Reading File" msgstr "Error al leer el fichero" #: ../gtk/src/SubstitutionsManager.cc:75 ../qt/src/SubstitutionsManager.cc:112 msgid "Unable to read '%1'." msgstr "No se puede leer '%1'." #: ../gtk/src/SubstitutionsManager.cc:97 ../qt/src/SubstitutionsManager.cc:137 msgid "Errors Occurred Reading File" msgstr "Ocurrieron errores al leer fichero" #: ../gtk/src/SubstitutionsManager.cc:97 ../qt/src/SubstitutionsManager.cc:137 msgid "Some entries of the substitutions list could not be read." msgstr "Algunas entradas de la lista de sustituciones no se pueden leer." #: ../gtk/src/SubstitutionsManager.cc:104 ../qt/src/SubstitutionsManager.cc:143 msgid "Save Substitutions List" msgstr "Guardar la lista de sustituciones" #: ../gtk/src/SubstitutionsManager.cc:110 ../qt/src/SubstitutionsManager.cc:149 msgid "Error Saving File" msgstr "Error al guardar el fichero" #: ../gtk/src/SubstitutionsManager.cc:110 ../qt/src/SubstitutionsManager.cc:149 msgid "Unable to write to '%1'." msgstr "No se puede escribir en '%1'." #: ../gtk/src/SubstitutionsManager.cc:127 ../qt/src/SubstitutionsManager.cc:162 msgid "Save List?" msgstr "¿Guardar la lista?" #: ../gtk/src/SubstitutionsManager.cc:127 ../qt/src/SubstitutionsManager.cc:162 msgid "Do you want to save the current list?" msgstr "¿Quiere guardar la lista actual?" #: ../gtk/src/TessdataManager.cc:60 ../qt/src/TessdataManager.cc:74 #, fuzzy msgid "" "A session connection to the PackageKit backend is required for managing " "system-wide tesseract language packs, but it was not found. This service is " "usually provided by a software-management application such as Gnome " "Software. Please install software which provides the necessary PackageKit " "interface, use other system package management software to manage the " "tesseract language packs directly, or switch to using 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:65 ../qt/src/TessdataManager.cc:79 msgid "Fetching available languages" msgstr "Obteniendo los idiomas disponibles" #: ../gtk/src/TessdataManager.cc:70 ../gtk/src/TessdataManager.cc:96 #: ../gtk/src/TessdataManager.cc:197 ../qt/src/TessdataManager.cc:84 #: ../qt/src/TessdataManager.cc:101 ../qt/src/TessdataManager.cc:197 msgid "Failed to fetch list of available languages: %1" msgstr "Fallo al obtener la lista de idiomas disponibles: %1" #: ../gtk/src/TessdataManager.cc:104 ../qt/src/TessdataManager.cc:113 #: ../qt/src/TessdataManager.cc:122 msgid "Parsing error: %1" msgstr "Analizando el error: %1" #: ../gtk/src/TessdataManager.cc:235 ../qt/src/TessdataManager.cc:232 msgid "Applying changes..." msgstr "Aplicando cambios..." #: ../gtk/src/TessdataManager.cc:297 ../qt/src/TessdataManager.cc:278 msgid "Failed to create directory for tessdata files." msgstr "Fallo al crear directorio para los ficheros tessdata." #: ../gtk/src/TessdataManager.cc:306 ../qt/src/TessdataManager.cc:287 msgid "Downloading %1..." msgstr "Descargando %1..." #: ../gtk/src/TessdataManager.cc:330 msgid "" "The following files could not be downloaded or removed:\n" "%1\n" "\n" "Check the connectivity and directory permissions.\n" "\n" "Hint: If you don't have write permissions in system folders, you can switch " "to user paths in the settings dialog." msgstr "" "Los siguientes ficheros no pudieron ser descargados o eliminados:\n" "%1\n" "\n" "Compruebe la conexión y los permisos de directorio.\n" "\n" "Nota: Si no tiene permiso de escritura en carpetas del sistema, puede " "cambiarla a rutas del usuario en el diálogo de configuración." #: ../gtk/src/Utils.cc:64 msgid "Yes" msgstr "Sí" #: ../gtk/src/Utils.cc:67 msgid "No" msgstr "No" #: ../gtk/src/Utils.cc:76 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

Sitio web

 

" #: ../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 del fichero 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 "" "

La aplicación ha " "fallado.

Disculpe las molestias. Para ayudar a mejorar la " "aplicación, 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/CrashHandler.ui.h:3 msgid "" "

Tesseract has " "aborted

Tesseract (the OCR engine) has aborted while " "recognizing text. This may occur if the used traineddatas are corrupt or " "incomplatible with the version of tesseract in use, or due to a bug in " "tesseract.

The stacktrace below may provide additional information " "about where the crash occured.

" msgstr "" #: ../qt/data/MainWindow.ui.h:17 msgid "Flatbed" msgstr "Escáner plano" #: ../qt/data/MainWindow.ui.h:18 msgid "ADF Front" msgstr "ADF frontal" #: ../qt/data/MainWindow.ui.h:19 msgid "ADF Back" msgstr "ADF reverso" #: ../qt/data/MainWindow.ui.h:20 msgid "ADF Duplex" msgstr "ADF de doble cara" #. Remove & from some labels which designer insists in adding #: ../qt/data/MainWindow.ui.h:21 ../qt/src/Ui_MainWindow.hh:50 msgid "Sources" msgstr "Orígenes" #: ../qt/data/MainWindow.ui.h:22 msgid "Zoom In" msgstr "Acercar" #: ../qt/data/MainWindow.ui.h:24 msgid "Zoom Out" msgstr "Alejar" #: ../qt/data/MainWindow.ui.h:26 msgid "Normal Size" msgstr "Tamaño normal" #: ../qt/data/MainWindow.ui.h:28 msgid "Best Fit" msgstr "Ajustar" #: ../qt/data/MainWindow.ui.h:30 msgid "Rotate Left" msgstr "Rotar a la izquierda" #: ../qt/data/MainWindow.ui.h:31 msgid "Rotate left" msgstr "Rotar a la izquierda" #: ../qt/data/MainWindow.ui.h:32 msgid "Rotate Right" msgstr "Rotar a la derecha" #: ../qt/data/MainWindow.ui.h:33 msgid "Rotate right" msgstr "Rotar a la derecha" #: ../qt/data/MainWindow.ui.h:34 msgid "Image Controls" msgstr "Controles de imagen" #: ../qt/data/MainWindow.ui.h:36 msgid "Autodetect Layout" msgstr "Autodetectar la disposición" #: ../qt/data/MainWindow.ui.h:38 msgid "Toggle Output Pane" msgstr "Mostrar/ocultar el panel de salida" #: ../qt/data/PdfExportDialog.ui.h:5 msgid "Backend:" msgstr "Motor:" #: ../qt/data/PdfExportDialog.ui.h:8 msgid "Portrait" msgstr "Vertical" #: ../qt/data/PdfExportDialog.ui.h:9 msgid "Landscape" msgstr "Apaisado" #: ../qt/src/hocr/HOCRPdfExporter.cc:142 msgid "Failed to write to file" msgstr "Fallo al escribir al archivo" #. Output toolbar #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:55 #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:56 msgid "Open hOCR file" msgstr "Abrir fichero hOCR" #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:57 #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:58 msgid "Save as hOCR text" msgstr "Guardar como texto hOCR" #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:79 #: ../qt/src/Ui_OutputEditorText.hh:106 msgid "Find and Replace" msgstr "Buscar y sustituir" #: ../qt/src/MainWindow.cc:581 #, fuzzy msgid "" "The following dictionary files were installed:\n" "%1" msgstr "Se han instalado los siguientes diccionarios:%1" #: ../qt/src/TessdataManager.cc:308 msgid "" "The following files could not be downloaded or removed:\n" "%1\n" "\n" "Check the connectivity and directory permissions.\n" "Hint: If you don't have write permissions in system folders, you can switch " "to user paths in the settings dialog." msgstr "" "Los siguientes ficheros no pudieron ser descargados o eliminados:\n" "%1\n" "\n" "Compruebe la conexión y los permisos de directorio.\n" "Nota: Si no tiene permiso de escritura en carpetas del sistema, puede " "cambiarla a rutas del usuario en el diálogo de configuración." #: ../qt/src/Ui_MainWindow.hh:51 msgid "Output" msgstr "Salida" #: ../qt/src/Ui_MainWindow.hh:135 msgid "OCR mode:" msgstr "Modo de OCR:" #: ../qt/src/Ui_MainWindow.hh:209 msgid "Remove Image" msgstr "Quitar imagen" #: ../qt/src/Ui_MainWindow.hh:212 msgid "Delete Image" msgstr "Borrar imagen" #: ../qt/src/Ui_MainWindow.hh:215 msgid "Clear List" msgstr "Borrar la lista" #: ../qt/src/Ui_OutputEditorText.hh:101 msgid "Strip Line Breaks" msgstr "Quitar los saltos de línea" #: ../qt/src/Ui_OutputEditorText.hh:115 msgid "Save Output" msgstr "Guardar la salida" #: ../qt/src/Ui_OutputEditorText.hh:117 msgid "Clear Output" msgstr "Limpiar la salida" #~ msgid "The application has crashed" #~ msgstr "La aplicación ha fallado" #~ 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 ha fallado 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." #~ msgid "Could not read %1: %2" #~ msgstr "No se puede leer %1: %2" #~ msgid "gImageReader" #~ msgstr "gImageReader" #~ 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>" #, fuzzy #~ msgid "90" #~ msgstr "0" #, fuzzy #~ msgid "300" #~ msgstr "200" #, fuzzy #~ msgid "100" #~ msgstr "200" #, fuzzy #~ msgid "10" #~ msgstr "0" #~ msgid "4" #~ msgstr "4" #~ msgid "1" #~ msgstr "1" #~ msgid "Document font:" #~ msgstr "Tipografía del documento:" #~ msgid "Scale:" #~ msgstr "Escala:" #~ msgid "Document" #~ msgstr "Documento" #~ msgid "Errors occurred" #~ msgstr "Se encontraron errores" #~ msgid "" #~ "The following pages could not be rendered:\n" #~ "%1" #~ msgstr "" #~ "Las siguientes páginas no se pudieron generar:\n" #~ "%1" #~ msgid "substitution_list.txt" #~ msgstr "substitution_list.txt" #~ 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 "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 "Preceeded by dot" #~ msgstr "Va precedido por un punto" #~ msgid "0.0" #~ msgstr "0.0" #~ 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.3.1/po/eu.po000066400000000000000000001542561351740627400154470ustar00rootroot00000000000000# 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. # msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2019-07-25 23:17+0200\n" "PO-Revision-Date: 2019-06-18 19:05+0000\n" "Last-Translator: beriain \n" "Language-Team: Basque \n" "Language: eu\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" "X-Generator: Weblate 3.7\n" #: ../data/gimagereader.desktop.in.h:1 msgid "OCR application" msgstr "OCR aplikazioa" #: ../gtk/data/appmenu.ui.h:1 ../qt/src/Ui_MainWindow.hh:167 msgid "Redetect Languages" msgstr "Hizkuntzak berriz antzeman" #: ../gtk/data/appmenu.ui.h:2 ../qt/src/Ui_MainWindow.hh:170 msgid "Manage Languages" msgstr "Hizkuntzak kudeatu" #: ../gtk/data/appmenu.ui.h:3 ../gtk/data/ConfigDialog.ui.h:1 #: ../qt/data/ConfigDialog.ui.h:1 ../qt/src/Ui_MainWindow.hh:173 msgid "Preferences" msgstr "Hobespenak" #: ../gtk/data/appmenu.ui.h:4 ../gtk/data/ConfigDialog.ui.h:2 #: ../gtk/src/MainWindow.cc:482 ../qt/src/MainWindow.cc:481 #: ../qt/src/Ui_MainWindow.hh:178 msgid "Help" msgstr "Laguntza" #: ../gtk/data/appmenu.ui.h:5 ../qt/data/AboutDialog.ui.h:2 #: ../qt/src/Ui_MainWindow.hh:181 msgid "About" msgstr "Honi buruz" #: ../gtk/data/appmenu.ui.h:6 msgid "Quit" msgstr "Irten" #: ../gtk/data/ConfigDialog.ui.h:3 ../gtk/data/MainWindow.ui.h:47 #: ../gtk/data/OutputEditorHOCR.ui.h:3 ../gtk/data/PdfExportDialog.ui.h:3 #: ../gtk/src/FileDialogs.cc:152 ../gtk/src/Utils.cc:61 #: ../qt/data/ConfigDialog.ui.h:26 msgid "OK" msgstr "Ados" #: ../gtk/data/ConfigDialog.ui.h:4 msgid "Output pane orientation:" msgstr "Irteera panelaren orientazioa:" #: ../gtk/data/ConfigDialog.ui.h:5 msgid "Horizontal" msgstr "Horizontala" #: ../gtk/data/ConfigDialog.ui.h:6 msgid "Vertical" msgstr "Bertikala" #: ../gtk/data/ConfigDialog.ui.h:7 ../qt/data/ConfigDialog.ui.h:18 msgid "Query to install missing spellcheck dictionaries" msgstr "Galdetu falta diren ortografia zuzentzaile hiztegiak instalatzeko" #: ../gtk/data/ConfigDialog.ui.h:8 ../qt/data/ConfigDialog.ui.h:4 msgid "Automatically check for new program versions" msgstr "Automatikoki programaren bertsio berririk dagoen egiaztatu" #: ../gtk/data/ConfigDialog.ui.h:9 ../qt/data/ConfigDialog.ui.h:3 msgid "Predefined language definitions:" msgstr "" #: ../gtk/data/ConfigDialog.ui.h:10 ../qt/data/ConfigDialog.ui.h:12 msgid "Additional language definitions:" msgstr "" #: ../gtk/data/ConfigDialog.ui.h:11 ../qt/data/ConfigDialog.ui.h:20 msgid "The prefix of the tesseract language data file" msgstr "" #: ../gtk/data/ConfigDialog.ui.h:12 ../qt/data/ConfigDialog.ui.h:21 msgid "Prefix" msgstr "Aurrizkia" #: ../gtk/data/ConfigDialog.ui.h:13 ../qt/data/ConfigDialog.ui.h:22 msgid "The ISO 639-1 language code followed by the country code" msgstr "Hizkuntzaren ISO 639-1 kodea eta jarraian herrialdearen kodea" #: ../gtk/data/ConfigDialog.ui.h:14 ../qt/data/ConfigDialog.ui.h:23 msgid "ISO Code" msgstr "ISO kodea" #: ../gtk/data/ConfigDialog.ui.h:15 ../qt/data/ConfigDialog.ui.h:24 msgid "The name of the language" msgstr "Hizkuntzaren izena" #: ../gtk/data/ConfigDialog.ui.h:16 ../qt/data/ConfigDialog.ui.h:25 msgid "Name" msgstr "Izena" #: ../gtk/data/ConfigDialog.ui.h:17 ../gtk/data/MainWindow.ui.h:46 #: ../gtk/data/OutputEditorHOCR.ui.h:2 ../gtk/data/PdfExportDialog.ui.h:2 #: ../gtk/src/Acquirer.cc:34 ../gtk/src/FileDialogs.cc:151 #: ../gtk/src/Utils.cc:70 ../qt/data/ConfigDialog.ui.h:27 #: ../qt/data/MainWindow.ui.h:12 msgid "Cancel" msgstr "Utzi" #: ../gtk/data/ConfigDialog.ui.h:18 ../qt/data/ConfigDialog.ui.h:5 msgid "Output pane font:" msgstr "Irteera panelaren letra mota:" #: ../gtk/data/ConfigDialog.ui.h:19 ../qt/data/ConfigDialog.ui.h:2 msgid "Default" msgstr "Lehenetsia" #: ../gtk/data/ConfigDialog.ui.h:20 ../qt/data/ConfigDialog.ui.h:6 msgid "Language data locations:" msgstr "Hizkuntza datuen kokapena:" #: ../gtk/data/ConfigDialog.ui.h:21 ../qt/data/ConfigDialog.ui.h:13 msgid "Language definitions path:" msgstr "" #: ../gtk/data/ConfigDialog.ui.h:22 ../qt/data/ConfigDialog.ui.h:28 msgid "Spelling dictionaries path:" msgstr "Ortografia zuzentzaile hiztegien kokalekua:" #: ../gtk/data/ConfigDialog.ui.h:23 ../qt/data/ConfigDialog.ui.h:10 msgid "System-wide paths" msgstr "" #: ../gtk/data/ConfigDialog.ui.h:24 ../qt/data/ConfigDialog.ui.h:11 msgid "User paths" msgstr "" #: ../gtk/data/ConfigDialog.ui.h:25 ../qt/data/ConfigDialog.ui.h:29 msgid "Automatically open exported documents with default application" msgstr "" "Esportatutako dokumentuak lehenetsitako aplikazioarekin ireki automatikoki" #: ../gtk/data/CrashHandler.ui.h:1 ../qt/src/CrashHandler.cc:38 msgid "Regenerate backtrace" msgstr "" #: ../gtk/data/CrashHandler.ui.h:3 #, no-c-format msgid "" "The application has crashed\n" "\n" "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/CrashHandler.ui.h:6 msgid "" "Tesseract has aborted\n" "\n" "Tesseract (the OCR engine) has aborted while recognizing text. This may " "occur if the used traineddatas are corrupt or incomplatible with the version " "of tesseract in use, or due to a bug in tesseract.\n" "\n" "The stacktrace below may provide additional information about where the " "crash occured.\n" msgstr "" #: ../gtk/data/MainWindow.ui.h:1 ../qt/data/MainWindow.ui.h:39 msgid "Toggle output pane" msgstr "Irteera panela txandakatu" #: ../gtk/data/MainWindow.ui.h:2 ../qt/src/Ui_MainWindow.hh:66 msgid "Rotate current page" msgstr "Oraingo orria biratu" #: ../gtk/data/MainWindow.ui.h:3 ../qt/src/Ui_MainWindow.hh:67 msgid "Rotate all pages" msgstr "Orri guztiak biratu" #. Sources toolbar #: ../gtk/data/MainWindow.ui.h:4 ../qt/src/Ui_MainWindow.hh:192 msgid "Recent" msgstr "Azkenak" #: ../gtk/data/MainWindow.ui.h:5 ../qt/src/Ui_MainWindow.hh:193 msgid "Paste" msgstr "Itsasi" #: ../gtk/data/MainWindow.ui.h:6 ../qt/src/Ui_MainWindow.hh:194 msgid "Take Screenshot" msgstr "Pantailaren argazkia egin" #: ../gtk/data/MainWindow.ui.h:7 ../qt/data/MainWindow.ui.h:23 msgid "Zoom in" msgstr "Gerturatu zooma" #: ../gtk/data/MainWindow.ui.h:8 ../qt/data/MainWindow.ui.h:25 msgid "Zoom out" msgstr "Urrundu zooma" #: ../gtk/data/MainWindow.ui.h:9 ../qt/data/MainWindow.ui.h:27 msgid "Normal size" msgstr "Neurri normala" #: ../gtk/data/MainWindow.ui.h:10 ../qt/data/MainWindow.ui.h:29 msgid "Best fit" msgstr "Egokitzapen onena" #: ../gtk/data/MainWindow.ui.h:11 ../qt/src/Ui_MainWindow.hh:75 msgid "Select rotation mode" msgstr "Biratze modua hautatu" #: ../gtk/data/MainWindow.ui.h:12 ../gtk/data/OutputEditorText.ui.h:13 #: ../qt/src/Ui_OutputEditorText.hh:95 msgid "Select insert mode" msgstr "Sartze modua hautatu" #: ../gtk/data/MainWindow.ui.h:13 ../qt/src/Ui_MainWindow.hh:109 #, fuzzy msgid "Select page" msgstr "Hizkuntza hautatu" #: ../gtk/data/MainWindow.ui.h:14 ../qt/data/MainWindow.ui.h:35 msgid "Image controls" msgstr "Irudi kontrolak" #: ../gtk/data/MainWindow.ui.h:15 ../qt/src/Ui_MainWindow.hh:139 msgid "Plain text" msgstr "Testu laua" #: ../gtk/data/MainWindow.ui.h:16 ../qt/src/Ui_MainWindow.hh:139 #, fuzzy msgid "hOCR, PDF" msgstr "hOCR, PDF" #: ../gtk/data/MainWindow.ui.h:17 ../qt/data/MainWindow.ui.h:37 msgid "Autodetect layout" msgstr "Antolaketa automatikoki antzeman" #: ../gtk/data/MainWindow.ui.h:18 msgid "Recognize all" msgstr "Dena ikuskatu" #: ../gtk/data/MainWindow.ui.h:19 msgid "Select language" msgstr "Hizkuntza hautatu" #: ../gtk/data/MainWindow.ui.h:20 ../qt/src/Ui_MainWindow.hh:205 msgid "Add images" msgstr "Irudiak gehitu" #: ../gtk/data/MainWindow.ui.h:21 ../qt/src/Ui_MainWindow.hh:204 msgid "Add Images" msgstr "Irudiak gehitu" #: ../gtk/data/MainWindow.ui.h:22 ../qt/src/Ui_MainWindow.hh:210 msgid "Remove image from list" msgstr "Irudia zerrendatik kendu" #: ../gtk/data/MainWindow.ui.h:23 ../qt/src/Ui_MainWindow.hh:213 msgid "Delete image" msgstr "Irudia ezabatu" #: ../gtk/data/MainWindow.ui.h:24 ../qt/src/Ui_MainWindow.hh:216 msgid "Clear list" msgstr "Zerrenda garbitu" #: ../gtk/data/MainWindow.ui.h:25 ../qt/data/MainWindow.ui.h:5 msgid "Files" msgstr "Fitxategiak" #: ../gtk/data/MainWindow.ui.h:26 ../qt/data/MainWindow.ui.h:8 msgid "Device:" msgstr "Gailua:" #: ../gtk/data/MainWindow.ui.h:27 ../gtk/data/TessdataManager.ui.h:4 #: ../qt/data/MainWindow.ui.h:7 ../qt/src/TessdataManager.cc:59 msgid "Refresh" msgstr "Freskatu" #: ../gtk/data/MainWindow.ui.h:28 ../qt/data/MainWindow.ui.h:9 msgid "Output:" msgstr "Irteera:" #: ../gtk/data/MainWindow.ui.h:29 ../qt/data/MainWindow.ui.h:13 msgid "Mode:" msgstr "Modua:" #: ../gtk/data/MainWindow.ui.h:30 ../gtk/src/hocr/HOCRPdfExporter.cc:313 #: ../qt/data/MainWindow.ui.h:15 ../qt/src/hocr/HOCRPdfExporter.cc:347 msgid "Color" msgstr "Kolorea" #: ../gtk/data/MainWindow.ui.h:31 ../gtk/src/hocr/HOCRPdfExporter.cc:316 #: ../qt/data/MainWindow.ui.h:14 ../qt/src/hocr/HOCRPdfExporter.cc:349 #: ../qt/src/hocr/HOCRPdfExporter.cc:351 msgid "Grayscale" msgstr "Gris eskala" #: ../gtk/data/MainWindow.ui.h:32 ../qt/data/MainWindow.ui.h:10 msgid "Resolution:" msgstr "Bereizmena:" #: ../gtk/data/MainWindow.ui.h:33 ../qt/data/MainWindow.ui.h:11 msgid "Scan" msgstr "Eskaneatu" #: ../gtk/data/MainWindow.ui.h:34 ../qt/data/MainWindow.ui.h:16 msgid "Source:" msgstr "Iturria:" #: ../gtk/data/MainWindow.ui.h:35 ../qt/data/MainWindow.ui.h:6 msgid "Acquire" msgstr "Eskuratu" #: ../gtk/data/MainWindow.ui.h:36 ../qt/data/MainWindow.ui.h:1 msgid "Brightness" msgstr "Distira" #: ../gtk/data/MainWindow.ui.h:37 ../qt/data/MainWindow.ui.h:2 msgid "Contrast" msgstr "Kontrastea" #: ../gtk/data/MainWindow.ui.h:38 ../qt/data/MainWindow.ui.h:3 msgid "Resolution" msgstr "Bereizmena" #: ../gtk/data/MainWindow.ui.h:39 ../qt/data/MainWindow.ui.h:4 msgid "Invert colors" msgstr "Koloreak alderantzikatu" #: ../gtk/data/MainWindow.ui.h:40 msgid "A graphical frontend to tesseract-ocr" msgstr "tesseract-ocrentzako frontend grafiko bat" #: ../gtk/data/MainWindow.ui.h:41 ../qt/data/CharacterListDialog.ui.h:1 msgid "Character whitelist / blacklist" msgstr "" #: ../gtk/data/MainWindow.ui.h:42 ../qt/data/CharacterListDialog.ui.h:2 msgid "Exclude these characters from being recognized (blacklist):" msgstr "" #: ../gtk/data/MainWindow.ui.h:43 ../qt/data/CharacterListDialog.ui.h:3 msgid "Enter a string of characters..." msgstr "" #: ../gtk/data/MainWindow.ui.h:44 ../qt/data/CharacterListDialog.ui.h:4 msgid "Only allow the following characters to be recognized (whitelist):" msgstr "" #: ../gtk/data/MainWindow.ui.h:45 ../qt/data/PageRangeDialog.ui.h:1 msgid "Page Range" msgstr "Orrialde tartea" #: ../gtk/data/MainWindow.ui.h:48 ../qt/data/PageRangeDialog.ui.h:2 msgid "Page range:" msgstr "Orrialde tartea:" #: ../gtk/data/MainWindow.ui.h:49 ../qt/data/PageRangeDialog.ui.h:3 msgid "Example: 1-10, 13, 14-18" msgstr "Adibidez: 1-10, 13, 14-18" #: ../gtk/data/MainWindow.ui.h:50 ../qt/data/PageRangeDialog.ui.h:4 msgid "Recognition area:" msgstr "Ikuskatze eremua:" #: ../gtk/data/MainWindow.ui.h:51 ../gtk/src/Recognizer.cc:375 #: ../qt/data/PageRangeDialog.ui.h:5 ../qt/src/Recognizer.cc:369 msgid "Entire page" msgstr "Orrialde osoa" #: ../gtk/data/MainWindow.ui.h:52 ../qt/data/PageRangeDialog.ui.h:6 msgid "Autodetect" msgstr "Automatikoki antzeman" #: ../gtk/data/MainWindow.ui.h:53 ../qt/data/PageRangeDialog.ui.h:7 msgid "Prepend to output text:" msgstr "" #: ../gtk/data/MainWindow.ui.h:54 ../qt/data/PageRangeDialog.ui.h:8 msgid "Source filename" msgstr "Jatorriaren fitxategi izena" #: ../gtk/data/MainWindow.ui.h:55 ../qt/data/PageRangeDialog.ui.h:9 msgid "Source page" msgstr "" #: ../gtk/data/MainWindow.ui.h:56 ../qt/src/SourceManager.cc:146 msgid "Protected PDF" msgstr "Babestutako PDFa" #: ../gtk/data/MainWindow.ui.h:57 ../qt/src/Recognizer.cc:76 msgid "Current Page" msgstr "Oraingo orrialdea" #: ../gtk/data/MainWindow.ui.h:58 ../qt/src/Recognizer.cc:79 msgid "Multiple Pages..." msgstr "Hainbat orrialde..." #: ../gtk/data/OutputEditorHOCR.ui.h:1 ../qt/src/hocr/OutputEditorHOCR.cc:580 msgid "Add Word" msgstr "Hitza gehitu" #: ../gtk/data/OutputEditorHOCR.ui.h:4 ../qt/src/hocr/OutputEditorHOCR.cc:580 msgid "Enter word:" msgstr "Hitza sartu:" #: ../gtk/data/OutputEditorHOCR.ui.h:5 ../qt/src/hocr/Ui_OutputEditorHOCR.hh:61 #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:62 msgid "Export to plain text" msgstr "Testu arrunt bezala esportatu" #: ../gtk/data/OutputEditorHOCR.ui.h:6 ../qt/src/hocr/Ui_OutputEditorHOCR.hh:64 #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:65 msgid "Export to PDF" msgstr "PDFra esportatu" #: ../gtk/data/OutputEditorHOCR.ui.h:7 ../qt/src/hocr/Ui_OutputEditorHOCR.hh:67 #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:68 msgid "Export to ODT" msgstr "ODTra esportatu" #: ../gtk/data/OutputEditorHOCR.ui.h:8 ../gtk/data/OutputEditorText.ui.h:18 #: ../qt/src/Ui_OutputEditorText.hh:116 msgid "Save output" msgstr "" #: ../gtk/data/OutputEditorHOCR.ui.h:9 ../qt/src/hocr/Ui_OutputEditorHOCR.hh:72 #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:73 msgid "Export" msgstr "Esportatu" #: ../gtk/data/OutputEditorHOCR.ui.h:10 ../gtk/data/OutputEditorText.ui.h:19 #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:77 #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:78 #: ../qt/src/Ui_OutputEditorText.hh:118 msgid "Clear output" msgstr "" #: ../gtk/data/OutputEditorHOCR.ui.h:11 ../gtk/data/OutputEditorText.ui.h:15 #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:80 #: ../qt/src/Ui_OutputEditorText.hh:107 msgid "Find and replace" msgstr "Bilatu eta ordezkatu" #: ../gtk/data/OutputEditorHOCR.ui.h:12 #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:82 #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:83 msgid "Show confidence values" msgstr "" #: ../gtk/data/OutputEditorHOCR.ui.h:13 ../gtk/data/PdfExportDialog.ui.h:41 #: ../qt/data/PdfExportDialog.ui.h:2 ../qt/src/hocr/Ui_OutputEditorHOCR.hh:85 #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:86 msgid "Show preview" msgstr "Aurrebista erakutsi" #: ../gtk/data/OutputEditorHOCR.ui.h:14 #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:121 msgid "Next (F3)" msgstr "Hurrengoa (F3)" #: ../gtk/data/OutputEditorHOCR.ui.h:15 #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:122 msgid "Previous (Shift+F3)" msgstr "Aurrekoa (Shift+F3)" #: ../gtk/data/OutputEditorHOCR.ui.h:16 ../gtk/src/hocr/OutputEditorHOCR.cc:890 #: ../qt/src/hocr/OutputEditorHOCR.cc:730 #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:126 msgid "Expand all" msgstr "" #: ../gtk/data/OutputEditorHOCR.ui.h:17 ../gtk/src/hocr/OutputEditorHOCR.cc:893 #: ../qt/src/hocr/OutputEditorHOCR.cc:731 #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:127 msgid "Collapse all" msgstr "" #: ../gtk/data/OutputEditorHOCR.ui.h:18 #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:148 msgid "Properties" msgstr "" #: ../gtk/data/OutputEditorHOCR.ui.h:19 #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:152 msgid "Source" msgstr "" #. Output insert mode #: ../gtk/data/OutputEditorText.ui.h:1 ../qt/src/Ui_OutputEditorText.hh:52 msgid "Append to current text" msgstr "" #: ../gtk/data/OutputEditorText.ui.h:2 ../qt/src/Ui_OutputEditorText.hh:53 msgid "Insert at cursor" msgstr "" #: ../gtk/data/OutputEditorText.ui.h:3 ../qt/src/Ui_OutputEditorText.hh:54 msgid "Replace current text" msgstr "" #. Output postprocessing #: ../gtk/data/OutputEditorText.ui.h:4 ../qt/src/Ui_OutputEditorText.hh:62 msgid "Keep line break if..." msgstr "" #: ../gtk/data/OutputEditorText.ui.h:5 ../qt/src/Ui_OutputEditorText.hh:64 msgid "Preceded by end mark (.?!)" msgstr "" #: ../gtk/data/OutputEditorText.ui.h:6 ../qt/src/Ui_OutputEditorText.hh:66 msgid "Preceded or succeeded by quote" msgstr "" #: ../gtk/data/OutputEditorText.ui.h:7 ../qt/src/Ui_OutputEditorText.hh:68 msgid "Other options" msgstr "Beste aukera batzuk" #: ../gtk/data/OutputEditorText.ui.h:8 ../qt/src/Ui_OutputEditorText.hh:70 msgid "Join hyphenated words" msgstr "" #: ../gtk/data/OutputEditorText.ui.h:9 ../qt/src/Ui_OutputEditorText.hh:72 msgid "Collapse whitespace" msgstr "" #: ../gtk/data/OutputEditorText.ui.h:10 ../qt/src/Ui_OutputEditorText.hh:74 msgid "Preserve paragraphs" msgstr "" #: ../gtk/data/OutputEditorText.ui.h:11 ../qt/src/Ui_OutputEditorText.hh:76 msgid "Visual aids" msgstr "" #: ../gtk/data/OutputEditorText.ui.h:12 ../qt/src/Ui_OutputEditorText.hh:78 msgid "Draw whitespace" msgstr "" #: ../gtk/data/OutputEditorText.ui.h:14 ../qt/src/Ui_OutputEditorText.hh:102 msgid "Strip line breaks on selected text" msgstr "" #: ../gtk/data/OutputEditorText.ui.h:16 ../qt/src/Ui_OutputEditorText.hh:109 #: ../qt/src/Ui_OutputEditorText.hh:110 msgid "Undo" msgstr "" #: ../gtk/data/OutputEditorText.ui.h:17 ../qt/src/Ui_OutputEditorText.hh:112 #: ../qt/src/Ui_OutputEditorText.hh:113 msgid "Redo" msgstr "" #: ../gtk/data/PdfExportDialog.ui.h:1 ../qt/data/PdfExportDialog.ui.h:1 msgid "PDF Export" msgstr "" #: ../gtk/data/PdfExportDialog.ui.h:4 ../qt/data/PdfExportDialog.ui.h:4 msgid "Output mode:" msgstr "" #: ../gtk/data/PdfExportDialog.ui.h:5 ../qt/data/PdfExportDialog.ui.h:6 msgid "PDF" msgstr "" #: ../gtk/data/PdfExportDialog.ui.h:6 ../qt/data/PdfExportDialog.ui.h:7 msgid "PDF with invisible text overlay" msgstr "" #: ../gtk/data/PdfExportDialog.ui.h:7 ../qt/data/PdfExportDialog.ui.h:16 msgid "Format:" msgstr "" #: ../gtk/data/PdfExportDialog.ui.h:8 ../qt/data/PdfExportDialog.ui.h:17 msgid "Compression:" msgstr "" #: ../gtk/data/PdfExportDialog.ui.h:9 ../qt/data/PdfExportDialog.ui.h:14 msgid "Compression quality:" msgstr "" #: ../gtk/data/PdfExportDialog.ui.h:10 ../qt/data/PdfExportDialog.ui.h:15 msgid "DPI:" msgstr "" #: ../gtk/data/PdfExportDialog.ui.h:11 ../qt/data/PdfExportDialog.ui.h:18 msgid "Dithering algorithm:" msgstr "" #: ../gtk/data/PdfExportDialog.ui.h:12 ../qt/data/PdfExportDialog.ui.h:13 msgid "Image settings:" msgstr "" #: ../gtk/data/PdfExportDialog.ui.h:13 ../qt/data/PdfExportDialog.ui.h:25 msgid "Uniformize line and word spacing" msgstr "" #: ../gtk/data/PdfExportDialog.ui.h:14 ../qt/data/PdfExportDialog.ui.h:21 msgid "Override font family:" msgstr "" #: ../gtk/data/PdfExportDialog.ui.h:15 ../qt/data/PdfExportDialog.ui.h:27 msgid "Fallback font family:" msgstr "" #: ../gtk/data/PdfExportDialog.ui.h:16 ../qt/data/PdfExportDialog.ui.h:20 msgid "Override font size:" msgstr "" #: ../gtk/data/PdfExportDialog.ui.h:17 ../qt/data/PdfExportDialog.ui.h:23 msgid "Font scaling:" msgstr "" #: ../gtk/data/PdfExportDialog.ui.h:18 ../qt/data/PdfExportDialog.ui.h:26 msgid "pt" msgstr "" #: ../gtk/data/PdfExportDialog.ui.h:19 ../qt/data/PdfExportDialog.ui.h:22 msgid "Preserve spaces wider than:" msgstr "" #: ../gtk/data/PdfExportDialog.ui.h:20 ../qt/data/PdfExportDialog.ui.h:24 msgid "characters" msgstr "" #: ../gtk/data/PdfExportDialog.ui.h:21 ../qt/data/PdfExportDialog.ui.h:28 msgid "Sanitize hyphens before line breaks" msgstr "" #: ../gtk/data/PdfExportDialog.ui.h:22 ../qt/data/PdfExportDialog.ui.h:19 msgid "Text settings:" msgstr "" #: ../gtk/data/PdfExportDialog.ui.h:23 ../qt/data/PdfExportDialog.ui.h:10 msgid "Paper size:" msgstr "" #: ../gtk/data/PdfExportDialog.ui.h:24 ../qt/data/PdfExportDialog.ui.h:11 msgid "Width" msgstr "" #: ../gtk/data/PdfExportDialog.ui.h:25 ../qt/data/PdfExportDialog.ui.h:12 msgid "Height" msgstr "" #: ../gtk/data/PdfExportDialog.ui.h:26 ../qt/data/PdfExportDialog.ui.h:29 msgid "Treat image sources as having true DPI:" msgstr "" #: ../gtk/data/PdfExportDialog.ui.h:27 ../qt/data/PdfExportDialog.ui.h:3 msgid "Basic" msgstr "" #: ../gtk/data/PdfExportDialog.ui.h:28 ../qt/data/PdfExportDialog.ui.h:31 msgid "PDF version:" msgstr "" #: ../gtk/data/PdfExportDialog.ui.h:29 ../qt/data/PdfExportDialog.ui.h:33 msgid "Password:" msgstr "" #: ../gtk/data/PdfExportDialog.ui.h:30 ../qt/data/PdfExportDialog.ui.h:34 msgid "Confirm password:" msgstr "" #: ../gtk/data/PdfExportDialog.ui.h:31 ../qt/data/PdfExportDialog.ui.h:32 msgid "Encryption (optional):" msgstr "" #: ../gtk/data/PdfExportDialog.ui.h:32 ../qt/data/PdfExportDialog.ui.h:36 msgid "Author:" msgstr "" #: ../gtk/data/PdfExportDialog.ui.h:33 ../qt/data/PdfExportDialog.ui.h:38 msgid "Title:" msgstr "" #: ../gtk/data/PdfExportDialog.ui.h:34 ../qt/data/PdfExportDialog.ui.h:40 msgid "Subject:" msgstr "" #: ../gtk/data/PdfExportDialog.ui.h:35 ../qt/data/PdfExportDialog.ui.h:37 msgid "Creator:" msgstr "" #: ../gtk/data/PdfExportDialog.ui.h:36 ../qt/data/PdfExportDialog.ui.h:39 msgid "Producer:" msgstr "" #: ../gtk/data/PdfExportDialog.ui.h:37 ../qt/data/PdfExportDialog.ui.h:41 msgid "Keywords:" msgstr "" #: ../gtk/data/PdfExportDialog.ui.h:38 ../qt/data/PdfExportDialog.ui.h:35 msgid "Additional information (optional):" msgstr "" #: ../gtk/data/PdfExportDialog.ui.h:39 ../qt/data/PdfExportDialog.ui.h:42 msgid "Import from current source" msgstr "" #: ../gtk/data/PdfExportDialog.ui.h:40 ../qt/data/PdfExportDialog.ui.h:30 msgid "Advanced" msgstr "" #: ../gtk/data/SearchReplaceFrame.ui.h:1 ../qt/data/SearchReplaceFrame.ui.h:4 msgid "Find" msgstr "" #: ../gtk/data/SearchReplaceFrame.ui.h:2 ../qt/data/SearchReplaceFrame.ui.h:2 msgid "Replace" msgstr "" #: ../gtk/data/SearchReplaceFrame.ui.h:3 ../qt/data/SearchReplaceFrame.ui.h:3 msgid "Replace all" msgstr "" #: ../gtk/data/SearchReplaceFrame.ui.h:4 ../qt/data/SearchReplaceFrame.ui.h:5 msgid "Find previous" msgstr "" #: ../gtk/data/SearchReplaceFrame.ui.h:5 ../qt/data/SearchReplaceFrame.ui.h:6 msgid "Find next" msgstr "" #: ../gtk/data/SearchReplaceFrame.ui.h:6 ../qt/data/SearchReplaceFrame.ui.h:7 msgid "Match case" msgstr "" #: ../gtk/data/SearchReplaceFrame.ui.h:7 #: ../gtk/data/SubstitutionsManager.ui.h:1 ../qt/data/SearchReplaceFrame.ui.h:1 #: ../qt/src/SubstitutionsManager.cc:36 msgid "Substitutions" msgstr "" #: ../gtk/data/SelectionMenu.ui.h:1 ../qt/src/DisplayerToolSelect.cc:239 msgid "Delete" msgstr "" #: ../gtk/data/SelectionMenu.ui.h:2 ../qt/src/DisplayerToolSelect.cc:225 msgid "Order:" msgstr "" #: ../gtk/data/SelectionMenu.ui.h:3 ../gtk/src/hocr/DisplayerToolHOCR.cc:29 #: ../qt/src/DisplayerToolSelect.cc:240 ../qt/src/hocr/DisplayerToolHOCR.cc:31 msgid "Recognize" msgstr "" #: ../gtk/data/SelectionMenu.ui.h:4 ../qt/src/DisplayerToolSelect.cc:241 msgid "Recognize to clipboard" msgstr "" #: ../gtk/data/SelectionMenu.ui.h:5 ../qt/src/DisplayerToolSelect.cc:242 msgid "Save as image" msgstr "" #: ../gtk/data/SubstitutionsManager.ui.h:2 ../qt/src/SubstitutionsManager.cc:38 #: ../qt/src/SubstitutionsManager.cc:39 msgid "Open" msgstr "" #: ../gtk/data/SubstitutionsManager.ui.h:3 ../gtk/src/Utils.cc:73 #: ../qt/src/SubstitutionsManager.cc:41 ../qt/src/SubstitutionsManager.cc:42 msgid "Save" msgstr "" #: ../gtk/data/SubstitutionsManager.ui.h:4 ../qt/src/SubstitutionsManager.cc:44 #: ../qt/src/SubstitutionsManager.cc:45 msgid "Clear" msgstr "" #: ../gtk/data/SubstitutionsManager.ui.h:5 ../qt/data/ConfigDialog.ui.h:16 #: ../qt/src/SubstitutionsManager.cc:47 ../qt/src/SubstitutionsManager.cc:48 msgid "Add" msgstr "" #: ../gtk/data/SubstitutionsManager.ui.h:6 #: ../gtk/src/hocr/OutputEditorHOCR.cc:886 ../qt/data/ConfigDialog.ui.h:17 #: ../qt/src/hocr/OutputEditorHOCR.cc:727 ../qt/src/SubstitutionsManager.cc:50 #: ../qt/src/SubstitutionsManager.cc:51 msgid "Remove" msgstr "" #: ../gtk/data/SubstitutionsManager.ui.h:7 ../gtk/data/TessdataManager.ui.h:2 msgid "Apply" msgstr "" #: ../gtk/data/SubstitutionsManager.ui.h:8 ../gtk/data/TessdataManager.ui.h:3 msgid "Close" msgstr "" #: ../gtk/data/TessdataManager.ui.h:1 ../qt/src/TessdataManager.cc:49 msgid "Tessdata Manager" msgstr "" #: ../gtk/data/TessdataManager.ui.h:5 ../qt/src/TessdataManager.cc:51 msgid "Manage installed languages:" msgstr "" #: ../gtk/src/Acquirer.cc:79 ../qt/src/Acquirer.cc:70 msgid "scan.png" msgstr "" #: ../gtk/src/Acquirer.cc:91 ../qt/src/Acquirer.cc:85 msgid "Images" msgstr "" #: ../gtk/src/Acquirer.cc:92 ../qt/src/Acquirer.cc:86 msgid "Choose Output Filename..." msgstr "" #: ../gtk/src/Acquirer.cc:106 ../qt/src/Acquirer.cc:100 msgid "Failed to initialize the scanning backend." msgstr "" #: ../gtk/src/Acquirer.cc:115 ../qt/src/Acquirer.cc:106 msgid "Scan failed" msgstr "" #: ../gtk/src/Acquirer.cc:133 ../qt/src/Acquirer.cc:122 msgid "No scanners were detected." msgstr "" #: ../gtk/src/Acquirer.cc:150 ../gtk/src/Acquirer.cc:168 #: ../qt/src/Acquirer.cc:136 ../qt/src/Acquirer.cc:154 msgid "Starting scan..." msgstr "" #: ../gtk/src/Acquirer.cc:164 ../qt/src/Acquirer.cc:150 msgid "Opening device..." msgstr "" #: ../gtk/src/Acquirer.cc:166 ../qt/src/Acquirer.cc:152 msgid "Setting options..." msgstr "" #: ../gtk/src/Acquirer.cc:170 ../qt/src/Acquirer.cc:156 msgid "Getting parameters..." msgstr "" #: ../gtk/src/Acquirer.cc:172 ../qt/src/Acquirer.cc:158 msgid "Transferring data..." msgstr "" #: ../gtk/src/Acquirer.cc:179 ../qt/src/Acquirer.cc:165 msgid "Canceling scan..." msgstr "" #: ../gtk/src/Config.cc:49 ../qt/data/ConfigDialog.ui.h:7 msgid "Filename prefix" msgstr "" #: ../gtk/src/Config.cc:50 ../qt/data/ConfigDialog.ui.h:8 msgid "Code" msgstr "" #: ../gtk/src/Config.cc:51 ../qt/data/ConfigDialog.ui.h:9 msgid "Native name" msgstr "" #: ../gtk/src/Config.cc:109 ../qt/src/Config.cc:108 msgid "Script" msgstr "" #: ../gtk/src/CrashHandler.cc:25 ../gtk/src/CrashHandler.cc:41 #: ../qt/src/CrashHandler.cc:36 msgid "Crash Handler" msgstr "" #: ../gtk/src/CrashHandler.cc:43 ../qt/src/CrashHandler.cc:31 msgid "Your work has been saved under %1." msgstr "" #: ../gtk/src/CrashHandler.cc:45 ../qt/src/CrashHandler.cc:33 msgid "There was no unsaved work." msgstr "" #: ../gtk/src/CrashHandler.cc:106 ../qt/src/CrashHandler.cc:62 msgid "Failed to obtain backtrace. Is gdb installed?" msgstr "" #: ../gtk/src/Displayer.cc:232 ../qt/src/Displayer.cc:174 msgid "Failed to load image" msgstr "" #: ../gtk/src/Displayer.cc:232 ../qt/src/Displayer.cc:174 msgid "" "The file might not be an image or be corrupt:\n" "%1" msgstr "" #: ../gtk/src/DisplayerToolSelect.cc:138 ../qt/src/DisplayerToolSelect.cc:135 msgid "PNG Images" msgstr "" #: ../gtk/src/DisplayerToolSelect.cc:139 ../qt/src/DisplayerToolSelect.cc:135 msgid "Save Selection Image" msgstr "" #: ../gtk/src/DisplayerToolSelect.cc:139 ../qt/src/DisplayerToolSelect.cc:135 msgid "selection.png" msgstr "" #: ../gtk/src/DisplayerToolSelect.cc:146 ../qt/src/DisplayerToolSelect.cc:142 msgid "Recognize all" msgstr "" #: ../gtk/src/DisplayerToolSelect.cc:146 ../qt/src/DisplayerToolSelect.cc:142 msgid "Recognize selection" msgstr "" #: ../gtk/src/DisplayerToolSelect.cc:186 ../qt/src/DisplayerToolSelect.cc:182 msgid "Performing layout analysis" msgstr "" #: ../gtk/src/FileDialogs.cc:235 msgid "" "A file named \"%1\" already exists. Are you sure you want to overwrite it?" msgstr "" #: ../gtk/src/FileDialogs.cc:237 msgid "Overwrite File?" msgstr "" #: ../gtk/src/hocr/HOCRDocument.cc:611 ../gtk/src/hocr/OutputEditorHOCR.cc:266 #: ../qt/src/hocr/OutputEditorHOCR.cc:229 msgid "Page" msgstr "" #: ../gtk/src/hocr/HOCRDocument.cc:613 ../qt/src/hocr/HOCRDocument.cc:530 msgid "Text block" msgstr "" #: ../gtk/src/hocr/HOCRDocument.cc:615 ../gtk/src/hocr/OutputEditorHOCR.cc:272 #: ../qt/src/hocr/HOCRDocument.cc:532 ../qt/src/hocr/OutputEditorHOCR.cc:231 msgid "Paragraph" msgstr "" #: ../gtk/src/hocr/HOCRDocument.cc:617 ../qt/src/hocr/HOCRDocument.cc:534 msgid "Textline" msgstr "" #: ../gtk/src/hocr/HOCRDocument.cc:621 ../qt/src/hocr/HOCRDocument.cc:538 msgid "Graphic" msgstr "" #: ../gtk/src/hocr/HOCROdtExporter.cc:65 ../gtk/src/hocr/HOCRPdfExporter.cc:489 #: ../gtk/src/hocr/HOCRTextExporter.cc:34 #: ../gtk/src/hocr/OutputEditorHOCR.cc:963 ../gtk/src/OutputEditorText.cc:272 #: ../qt/src/hocr/HOCROdtExporter.cc:50 ../qt/src/hocr/HOCRPdfExporter.cc:478 #: ../qt/src/hocr/HOCRTextExporter.cc:36 ../qt/src/hocr/OutputEditorHOCR.cc:830 #: ../qt/src/OutputEditorText.cc:238 msgid "output" msgstr "" #: ../gtk/src/hocr/HOCROdtExporter.cc:68 ../qt/src/hocr/HOCROdtExporter.cc:53 msgid "OpenDocument Text Documents" msgstr "" #: ../gtk/src/hocr/HOCROdtExporter.cc:69 ../qt/src/hocr/HOCROdtExporter.cc:53 msgid "Save ODT Output..." msgstr "" #: ../gtk/src/hocr/HOCROdtExporter.cc:77 ../gtk/src/hocr/HOCROdtExporter.cc:342 #: ../gtk/src/hocr/HOCRPdfExporter.cc:619 #: ../gtk/src/hocr/HOCRTextExporter.cc:46 ../qt/src/hocr/HOCROdtExporter.cc:61 #: ../qt/src/hocr/HOCRPdfExporter.cc:609 ../qt/src/hocr/HOCRTextExporter.cc:47 msgid "Export failed" msgstr "" #: ../gtk/src/hocr/HOCROdtExporter.cc:77 ../gtk/src/hocr/HOCROdtExporter.cc:342 #: ../qt/src/hocr/HOCROdtExporter.cc:61 msgid "The ODT export failed: unable to write output file." msgstr "" #: ../gtk/src/hocr/HOCROdtExporter.cc:336 ../qt/src/hocr/HOCROdtExporter.cc:254 msgid "Exporting to ODT..." msgstr "" #: ../gtk/src/hocr/HOCRPdfExporter.cc:283 ../qt/src/hocr/HOCRPdfExporter.cc:365 msgid "Same as source" msgstr "" #: ../gtk/src/hocr/HOCRPdfExporter.cc:286 ../qt/src/hocr/HOCRPdfExporter.cc:366 msgid "Custom" msgstr "" #: ../gtk/src/hocr/HOCRPdfExporter.cc:300 ../qt/src/hocr/HOCRPdfExporter.cc:362 msgid "cm" msgstr "" #: ../gtk/src/hocr/HOCRPdfExporter.cc:303 ../qt/src/hocr/HOCRPdfExporter.cc:363 msgid "in" msgstr "" #: ../gtk/src/hocr/HOCRPdfExporter.cc:319 ../qt/src/hocr/HOCRPdfExporter.cc:353 msgid "Monochrome" msgstr "" #: ../gtk/src/hocr/HOCRPdfExporter.cc:328 ../qt/src/hocr/HOCRPdfExporter.cc:355 msgid "Threshold (closest color)" msgstr "" #: ../gtk/src/hocr/HOCRPdfExporter.cc:331 ../qt/src/hocr/HOCRPdfExporter.cc:356 msgid "Diffuse" msgstr "" #: ../gtk/src/hocr/HOCRPdfExporter.cc:340 ../qt/src/hocr/HOCRPdfExporter.cc:357 msgid "Zip (lossless)" msgstr "" #: ../gtk/src/hocr/HOCRPdfExporter.cc:344 ../qt/src/hocr/HOCRPdfExporter.cc:358 msgid "CCITT Group 4 (lossless)" msgstr "" #: ../gtk/src/hocr/HOCRPdfExporter.cc:348 ../qt/src/hocr/HOCRPdfExporter.cc:359 msgid "Jpeg (lossy)" msgstr "" #: ../gtk/src/hocr/HOCRPdfExporter.cc:493 ../qt/src/hocr/HOCRPdfExporter.cc:482 msgid "PDF Files" msgstr "" #: ../gtk/src/hocr/HOCRPdfExporter.cc:494 ../qt/src/hocr/HOCRPdfExporter.cc:482 msgid "Save PDF Output..." msgstr "" #: ../gtk/src/hocr/HOCRPdfExporter.cc:500 ../qt/src/hocr/HOCRPdfExporter.cc:488 msgid "Invalid Output" msgstr "" #: ../gtk/src/hocr/HOCRPdfExporter.cc:500 ../qt/src/hocr/HOCRPdfExporter.cc:488 msgid "Cannot overwrite a file which is a source image of this document." msgstr "" #: ../gtk/src/hocr/HOCRPdfExporter.cc:516 ../qt/src/hocr/HOCRPdfExporter.cc:511 msgid "Failed to create output" msgstr "" #: ../gtk/src/hocr/HOCRPdfExporter.cc:516 ../qt/src/hocr/HOCRPdfExporter.cc:511 msgid "Failed to create output. The returned error was: %1" msgstr "" #: ../gtk/src/hocr/HOCRPdfExporter.cc:558 ../qt/src/hocr/HOCRPdfExporter.cc:551 msgid "The operation was cancelled" msgstr "" #: ../gtk/src/hocr/HOCRPdfExporter.cc:607 ../qt/src/hocr/HOCRPdfExporter.cc:597 msgid "Failed to render page %1" msgstr "" #: ../gtk/src/hocr/HOCRPdfExporter.cc:614 ../qt/src/hocr/HOCRPdfExporter.cc:604 msgid "Exporting to PDF..." msgstr "" #: ../gtk/src/hocr/HOCRPdfExporter.cc:619 ../qt/src/hocr/HOCRPdfExporter.cc:609 msgid "The PDF export failed: %1." msgstr "" #: ../gtk/src/hocr/HOCRPdfExporter.cc:673 ../qt/src/hocr/HOCRPdfExporter.cc:662 msgid "The PDF library could not load the font '%1'." msgstr "" #: ../gtk/src/hocr/HOCRTextExporter.cc:37 ../gtk/src/OutputEditorText.cc:274 #: ../qt/src/hocr/HOCRTextExporter.cc:39 ../qt/src/OutputEditorText.cc:239 msgid "Text Files" msgstr "" #: ../gtk/src/hocr/HOCRTextExporter.cc:38 ../qt/src/hocr/HOCRTextExporter.cc:39 msgid "Save Text Output..." msgstr "" #: ../gtk/src/hocr/HOCRTextExporter.cc:46 ../qt/src/hocr/HOCRTextExporter.cc:47 msgid "The text export failed: unable to write output file." msgstr "" #: ../gtk/src/hocr/OutputEditorHOCR.cc:269 #: ../qt/src/hocr/OutputEditorHOCR.cc:230 msgid "Block" msgstr "" #: ../gtk/src/hocr/OutputEditorHOCR.cc:275 #: ../qt/src/hocr/OutputEditorHOCR.cc:232 msgid "Line" msgstr "" #: ../gtk/src/hocr/OutputEditorHOCR.cc:278 #: ../qt/src/hocr/OutputEditorHOCR.cc:233 msgid "Word" msgstr "" #: ../gtk/src/hocr/OutputEditorHOCR.cc:281 #: ../qt/src/hocr/OutputEditorHOCR.cc:234 msgid "Misspelled word" msgstr "" #: ../gtk/src/hocr/OutputEditorHOCR.cc:435 #: ../qt/src/hocr/OutputEditorHOCR.cc:317 msgid "" "The following pages could not be processed:\n" "%1" msgstr "" #: ../gtk/src/hocr/OutputEditorHOCR.cc:436 #: ../qt/src/hocr/OutputEditorHOCR.cc:318 msgid "Recognition errors" msgstr "" #: ../gtk/src/hocr/OutputEditorHOCR.cc:594 #: ../qt/src/hocr/OutputEditorHOCR.cc:500 #: ../qt/src/hocr/OutputEditorHOCR.cc:512 msgid "Multiple values" msgstr "" #. Merging allowed #: ../gtk/src/hocr/OutputEditorHOCR.cc:778 #: ../qt/src/hocr/OutputEditorHOCR.cc:641 msgid "Merge" msgstr "" #: ../gtk/src/hocr/OutputEditorHOCR.cc:786 #: ../gtk/src/hocr/OutputEditorHOCR.cc:877 #: ../qt/src/hocr/OutputEditorHOCR.cc:643 #: ../qt/src/hocr/OutputEditorHOCR.cc:725 msgid "Split from parent" msgstr "" #. Swapping allowed #: ../gtk/src/hocr/OutputEditorHOCR.cc:797 #: ../qt/src/hocr/OutputEditorHOCR.cc:647 msgid "Swap" msgstr "" #: ../gtk/src/hocr/OutputEditorHOCR.cc:821 #: ../qt/src/hocr/OutputEditorHOCR.cc:693 msgid "Add graphic region" msgstr "" #: ../gtk/src/hocr/OutputEditorHOCR.cc:824 #: ../qt/src/hocr/OutputEditorHOCR.cc:694 msgid "Add text block" msgstr "" #: ../gtk/src/hocr/OutputEditorHOCR.cc:828 #: ../qt/src/hocr/OutputEditorHOCR.cc:696 msgid "Add paragraph" msgstr "" #: ../gtk/src/hocr/OutputEditorHOCR.cc:832 #: ../qt/src/hocr/OutputEditorHOCR.cc:698 msgid "Add line" msgstr "" #: ../gtk/src/hocr/OutputEditorHOCR.cc:836 #: ../qt/src/hocr/OutputEditorHOCR.cc:700 msgid "Add word" msgstr "" #: ../gtk/src/hocr/OutputEditorHOCR.cc:852 #: ../qt/src/hocr/OutputEditorHOCR.cc:710 msgid "No suggestions" msgstr "" #: ../gtk/src/hocr/OutputEditorHOCR.cc:858 #: ../qt/src/hocr/OutputEditorHOCR.cc:714 msgid "Add to dictionary" msgstr "" #: ../gtk/src/hocr/OutputEditorHOCR.cc:864 #: ../qt/src/hocr/OutputEditorHOCR.cc:716 msgid "Ignore word" msgstr "" #: ../gtk/src/hocr/OutputEditorHOCR.cc:926 #: ../gtk/src/hocr/OutputEditorHOCR.cc:965 #: ../qt/src/hocr/OutputEditorHOCR.cc:795 #: ../qt/src/hocr/OutputEditorHOCR.cc:832 msgid "hOCR HTML Files" msgstr "" #: ../gtk/src/hocr/OutputEditorHOCR.cc:927 #: ../qt/src/hocr/OutputEditorHOCR.cc:795 msgid "Open hOCR File" msgstr "" #: ../gtk/src/hocr/OutputEditorHOCR.cc:936 #: ../qt/src/hocr/OutputEditorHOCR.cc:802 msgid "Failed to open file" msgstr "" #: ../gtk/src/hocr/OutputEditorHOCR.cc:936 #: ../qt/src/hocr/OutputEditorHOCR.cc:802 msgid "The file could not be opened: %1." msgstr "" #: ../gtk/src/hocr/OutputEditorHOCR.cc:945 #: ../qt/src/hocr/OutputEditorHOCR.cc:809 msgid "Invalid hOCR file" msgstr "" #: ../gtk/src/hocr/OutputEditorHOCR.cc:945 #: ../qt/src/hocr/OutputEditorHOCR.cc:809 msgid "The file does not appear to contain valid hOCR HTML: %1" msgstr "" #: ../gtk/src/hocr/OutputEditorHOCR.cc:966 #: ../qt/src/hocr/OutputEditorHOCR.cc:832 msgid "Save hOCR Output..." msgstr "" #: ../gtk/src/hocr/OutputEditorHOCR.cc:973 ../gtk/src/OutputEditorText.cc:282 #: ../qt/src/hocr/OutputEditorHOCR.cc:839 ../qt/src/OutputEditorText.cc:246 msgid "Failed to save output" msgstr "" #: ../gtk/src/hocr/OutputEditorHOCR.cc:973 ../gtk/src/OutputEditorText.cc:282 #: ../qt/src/hocr/OutputEditorHOCR.cc:839 ../qt/src/OutputEditorText.cc:246 msgid "Check that you have writing permissions in the selected folder." msgstr "" #: ../gtk/src/hocr/OutputEditorHOCR.cc:1035 ../gtk/src/OutputEditorText.cc:296 #: ../qt/src/hocr/OutputEditorHOCR.cc:894 ../qt/src/OutputEditorText.cc:259 msgid "Output not saved" msgstr "" #: ../gtk/src/hocr/OutputEditorHOCR.cc:1035 ../gtk/src/OutputEditorText.cc:296 #: ../qt/src/hocr/OutputEditorHOCR.cc:894 ../qt/src/OutputEditorText.cc:259 msgid "Save output before proceeding?" msgstr "" #: ../gtk/src/hocr/OutputEditorHOCR.cc:1156 ../gtk/src/OutputEditorText.cc:184 #: ../qt/src/hocr/OutputEditorHOCR.cc:991 ../qt/src/OutputEditorText.cc:152 msgid "Replacing..." msgstr "" #: ../gtk/src/hocr/OutputEditorHOCR.cc:1181 ../gtk/src/OutputEditorText.cc:192 #: ../qt/src/hocr/OutputEditorHOCR.cc:1014 ../qt/src/OutputEditorText.cc:160 msgid "Applying substitutions..." msgstr "" #: ../gtk/src/MainWindow.cc:131 ../qt/src/MainWindow.cc:295 msgid "Using tesseract" msgstr "" #: ../gtk/src/MainWindow.cc:178 ../qt/src/MainWindow.cc:194 msgid "Select an image to begin..." msgstr "" #: ../gtk/src/MainWindow.cc:293 ../qt/src/MainWindow.cc:278 msgid "Multiple sources" msgstr "" #: ../gtk/src/MainWindow.cc:295 ../qt/src/MainWindow.cc:280 msgid "Ready" msgstr "" #: ../gtk/src/MainWindow.cc:442 ../qt/src/MainWindow.cc:423 msgid "New version" msgstr "" #: ../gtk/src/MainWindow.cc:442 ../qt/src/MainWindow.cc:423 msgid "gImageReader %1 is available" msgstr "" #: ../gtk/src/MainWindow.cc:443 ../qt/src/MainWindow.cc:424 msgid "Download" msgstr "" #: ../gtk/src/MainWindow.cc:444 ../qt/src/MainWindow.cc:425 msgid "Changelog" msgstr "" #: ../gtk/src/MainWindow.cc:445 ../qt/src/MainWindow.cc:426 msgid "Don't notify again" msgstr "" #: ../gtk/src/MainWindow.cc:466 ../qt/src/MainWindow.cc:474 msgid "Don't show again" msgstr "" #: ../gtk/src/MainWindow.cc:467 ../gtk/src/MainWindow.cc:480 #: ../qt/src/MainWindow.cc:475 msgid "Install" msgstr "" #: ../gtk/src/MainWindow.cc:487 ../qt/src/MainWindow.cc:487 msgid "Spelling dictionary missing" msgstr "" #: ../gtk/src/MainWindow.cc:487 ../qt/src/MainWindow.cc:487 msgid "The spellcheck dictionary for %1 is not installed" msgstr "" #: ../gtk/src/MainWindow.cc:494 ../gtk/src/MainWindow.cc:523 #: ../qt/src/MainWindow.cc:493 msgid "Installing spelling dictionary for '%1'" msgstr "" #: ../gtk/src/MainWindow.cc:515 ../gtk/src/MainWindow.cc:536 #: ../gtk/src/MainWindow.cc:544 ../gtk/src/MainWindow.cc:592 #: ../gtk/src/MainWindow.cc:597 ../gtk/src/TessdataManager.cc:60 #: ../gtk/src/TessdataManager.cc:70 ../gtk/src/TessdataManager.cc:339 #: ../qt/src/MainWindow.cc:512 ../qt/src/MainWindow.cc:525 #: ../qt/src/MainWindow.cc:534 ../qt/src/MainWindow.cc:578 #: ../qt/src/MainWindow.cc:583 ../qt/src/TessdataManager.cc:74 #: ../qt/src/TessdataManager.cc:84 ../qt/src/TessdataManager.cc:315 msgid "Error" msgstr "" #: ../gtk/src/MainWindow.cc:515 ../qt/src/MainWindow.cc:512 msgid "Failed to install spelling dictionary: %1" msgstr "" #: ../gtk/src/MainWindow.cc:536 ../qt/src/MainWindow.cc:525 msgid "Failed to create directory for spelling dictionaries." msgstr "" #: ../gtk/src/MainWindow.cc:544 ../qt/src/MainWindow.cc:534 msgid "Could not read %1: %2." msgstr "" #: ../gtk/src/MainWindow.cc:571 ../qt/src/MainWindow.cc:558 msgid "Downloading '%1'..." msgstr "" #: ../gtk/src/MainWindow.cc:592 ../qt/src/MainWindow.cc:578 msgid "" "The following dictionaries could not be downloaded:\n" "%1\n" "\n" "Check the connectivity and directory permissions.\n" "Hint: If you don't have write permissions in system folders, you can switch " "to user paths in the settings dialog." msgstr "" #: ../gtk/src/MainWindow.cc:595 ../qt/src/MainWindow.cc:581 msgid "Dictionaries installed" msgstr "" #: ../gtk/src/MainWindow.cc:595 msgid "" "The following dictionaries were installed:\n" "%1" msgstr "" #: ../gtk/src/MainWindow.cc:597 ../qt/src/MainWindow.cc:583 msgid "No spelling dictionaries found for '%1'." msgstr "" #: ../gtk/src/OutputEditorText.cc:154 ../qt/src/OutputEditorText.cc:137 msgid "Stripping line breaks..." msgstr "" #: ../gtk/src/OutputEditorText.cc:162 msgid "Check spelling" msgstr "" #: ../gtk/src/OutputEditorText.cc:231 ../qt/src/OutputEditorText.cc:196 msgid "File: %1" msgstr "" #: ../gtk/src/OutputEditorText.cc:234 ../qt/src/OutputEditorText.cc:199 msgid "Page: %1" msgstr "" #: ../gtk/src/OutputEditorText.cc:247 ../gtk/src/Recognizer.cc:471 #: ../qt/src/Recognizer.cc:462 msgid "" "\n" "[Failed to recognize page %1]\n" msgstr "" #: ../gtk/src/OutputEditorText.cc:275 ../qt/src/OutputEditorText.cc:239 msgid "Save Output..." msgstr "" #: ../gtk/src/Recognizer.cc:179 ../qt/src/Recognizer.cc:172 msgid "No languages available" msgstr "" #: ../gtk/src/Recognizer.cc:179 ../qt/src/Recognizer.cc:172 msgid "" "No tesseract languages are available for use. Recognition will not work." msgstr "" #: ../gtk/src/Recognizer.cc:233 ../qt/src/Recognizer.cc:232 msgid "Multilingual" msgstr "" #: ../gtk/src/Recognizer.cc:285 ../qt/src/Recognizer.cc:277 msgid "Automatic page segmentation" msgstr "" #: ../gtk/src/Recognizer.cc:286 ../qt/src/Recognizer.cc:278 msgid "Page segmentation with orientation and script detection" msgstr "" #: ../gtk/src/Recognizer.cc:287 ../qt/src/Recognizer.cc:279 msgid "Assume single column of text" msgstr "" #: ../gtk/src/Recognizer.cc:288 ../qt/src/Recognizer.cc:280 msgid "Assume single block of vertically aligned text" msgstr "" #: ../gtk/src/Recognizer.cc:289 ../qt/src/Recognizer.cc:281 msgid "Assume a single uniform block of text" msgstr "" #: ../gtk/src/Recognizer.cc:290 ../qt/src/Recognizer.cc:282 msgid "Assume a line of text" msgstr "" #: ../gtk/src/Recognizer.cc:291 ../qt/src/Recognizer.cc:283 msgid "Assume a single word" msgstr "" #: ../gtk/src/Recognizer.cc:292 ../qt/src/Recognizer.cc:284 msgid "Assume a single word in a circle" msgstr "" #: ../gtk/src/Recognizer.cc:293 ../qt/src/Recognizer.cc:285 msgid "Sparse text in no particular order" msgstr "" #: ../gtk/src/Recognizer.cc:294 ../qt/src/Recognizer.cc:286 msgid "Sparse text with orientation and script detection" msgstr "" #: ../gtk/src/Recognizer.cc:309 ../qt/src/Recognizer.cc:297 msgid "Page segmentation mode" msgstr "" #: ../gtk/src/Recognizer.cc:313 ../qt/src/Recognizer.cc:300 msgid "Character whitelist / blacklist..." msgstr "" #: ../gtk/src/Recognizer.cc:319 ../qt/src/Recognizer.cc:305 msgid "Manage languages..." msgstr "" #: ../gtk/src/Recognizer.cc:375 ../qt/src/Recognizer.cc:369 msgid "Current selection" msgstr "" #: ../gtk/src/Recognizer.cc:465 ../qt/src/Recognizer.cc:455 msgid "Recognizing page %1 (%2 of %3)" msgstr "" #: ../gtk/src/Recognizer.cc:470 ../qt/src/Recognizer.cc:461 msgid "" "\n" "- Page %1: failed to render page" msgstr "" #: ../gtk/src/Recognizer.cc:501 ../gtk/src/Recognizer.cc:531 #: ../gtk/src/Recognizer.cc:544 ../qt/src/Recognizer.cc:491 #: ../qt/src/Recognizer.cc:521 ../qt/src/Recognizer.cc:534 msgid "Recognizing..." msgstr "" #: ../gtk/src/Recognizer.cc:505 ../gtk/src/Recognizer.cc:514 #: ../qt/src/Recognizer.cc:495 ../qt/src/Recognizer.cc:504 msgid "Recognition errors occurred" msgstr "" #: ../gtk/src/Recognizer.cc:505 ../qt/src/Recognizer.cc:495 msgid "The following errors occurred:%1" msgstr "" #: ../gtk/src/Recognizer.cc:514 ../qt/src/Recognizer.cc:504 msgid "Failed to initialize tesseract" msgstr "" #: ../gtk/src/scanner/ScannerSane.cc:84 ../gtk/src/scanner/ScannerTwain.cc:288 #: ../qt/src/scanner/ScannerSane.cc:85 ../qt/src/scanner/ScannerTwain.cc:286 msgid "Scan canceled" msgstr "" #: ../gtk/src/scanner/ScannerSane.cc:159 ../gtk/src/scanner/ScannerTwain.cc:186 #: ../qt/src/scanner/ScannerSane.cc:159 ../qt/src/scanner/ScannerTwain.cc:178 msgid "No scanner specified" msgstr "" #: ../gtk/src/scanner/ScannerSane.cc:168 ../gtk/src/scanner/ScannerTwain.cc:195 #: ../qt/src/scanner/ScannerSane.cc:168 ../qt/src/scanner/ScannerTwain.cc:187 msgid "Unable to connect to scanner" msgstr "" #: ../gtk/src/scanner/ScannerSane.cc:403 ../gtk/src/scanner/ScannerTwain.cc:266 #: ../gtk/src/scanner/ScannerTwain.cc:292 ../qt/src/scanner/ScannerSane.cc:403 #: ../qt/src/scanner/ScannerTwain.cc:258 ../qt/src/scanner/ScannerTwain.cc:290 msgid "Unable to start scan" msgstr "" #: ../gtk/src/scanner/ScannerSane.cc:411 ../gtk/src/scanner/ScannerSane.cc:461 #: ../gtk/src/scanner/ScannerTwain.cc:318 ../qt/src/scanner/ScannerSane.cc:411 #: ../qt/src/scanner/ScannerSane.cc:461 ../qt/src/scanner/ScannerTwain.cc:316 msgid "Error communicating with scanner" msgstr "" #: ../gtk/src/scanner/ScannerSane.cc:520 ../qt/src/scanner/ScannerSane.cc:517 msgid "Failed to save image" msgstr "" #: ../gtk/src/scanner/ScannerSane.cc:800 ../qt/src/scanner/ScannerSane.cc:797 msgid "Operation is cancelled." msgstr "" #: ../gtk/src/scanner/ScannerSane.cc:802 ../qt/src/scanner/ScannerSane.cc:799 msgid "Device is busy." msgstr "" #: ../gtk/src/scanner/ScannerSane.cc:804 ../qt/src/scanner/ScannerSane.cc:801 msgid "Cover is opened." msgstr "" #: ../gtk/src/scanner/ScannerSane.cc:806 ../qt/src/scanner/ScannerSane.cc:803 msgid "Document feeder jammed." msgstr "" #: ../gtk/src/scanner/ScannerSane.cc:808 ../qt/src/scanner/ScannerSane.cc:805 msgid "Document feeder out of documents." msgstr "" #: ../gtk/src/scanner/ScannerSane.cc:810 ../qt/src/scanner/ScannerSane.cc:807 msgid "Access to scanner is denied." msgstr "" #: ../gtk/src/SourceManager.cc:118 ../qt/src/SourceManager.cc:124 msgid "PDFs with text" msgstr "" #: ../gtk/src/SourceManager.cc:118 ../qt/src/SourceManager.cc:124 msgid "" "These PDF files already contain text:\n" "%1" msgstr "" #: ../gtk/src/SourceManager.cc:127 ../qt/src/SourceManager.cc:132 msgid "Unable to open files" msgstr "" #: ../gtk/src/SourceManager.cc:127 ../qt/src/SourceManager.cc:132 msgid "The following files could not be opened:%1" msgstr "" #: ../gtk/src/SourceManager.cc:141 ../qt/src/SourceManager.cc:143 msgid "Enter password for file '%1':" msgstr "" #: ../gtk/src/SourceManager.cc:197 ../qt/src/SourceManager.cc:214 msgid "Images and PDFs" msgstr "" #: ../gtk/src/SourceManager.cc:202 ../qt/src/SourceManager.cc:215 msgid "Select Files" msgstr "" #: ../gtk/src/SourceManager.cc:208 ../qt/src/SourceManager.cc:226 msgid "Clipboard Error" msgstr "" #: ../gtk/src/SourceManager.cc:208 ../qt/src/SourceManager.cc:226 msgid "Failed to read the clipboard." msgstr "" #: ../gtk/src/SourceManager.cc:212 ../qt/src/SourceManager.cc:230 #: ../qt/src/SourceManager.cc:236 msgid "Pasted %1" msgstr "" #: ../gtk/src/SourceManager.cc:224 ../qt/src/SourceManager.cc:243 msgid "Screenshot Error" msgstr "" #: ../gtk/src/SourceManager.cc:224 ../qt/src/SourceManager.cc:243 msgid "Failed to take screenshot." msgstr "" #: ../gtk/src/SourceManager.cc:228 ../qt/src/SourceManager.cc:247 msgid "Screenshot %1" msgstr "" #: ../gtk/src/SourceManager.cc:233 ../qt/src/SourceManager.cc:252 msgid "Saving image..." msgstr "" #: ../gtk/src/SourceManager.cc:240 ../qt/src/SourceManager.cc:265 msgid "Cannot Write File" msgstr "" #: ../gtk/src/SourceManager.cc:240 ../qt/src/SourceManager.cc:265 msgid "Could not write to %1." msgstr "" #: ../gtk/src/SourceManager.cc:267 ../qt/src/SourceManager.cc:287 msgid "Delete File?" msgstr "" #: ../gtk/src/SourceManager.cc:267 ../qt/src/SourceManager.cc:287 msgid "The following files will be deleted:%1" msgstr "" #: ../gtk/src/SourceManager.cc:332 ../qt/src/SourceManager.cc:338 msgid "Missing File" msgstr "" #: ../gtk/src/SourceManager.cc:332 ../qt/src/SourceManager.cc:338 msgid "" "The following file has been deleted or moved:\n" "%1" msgstr "" #: ../gtk/src/SubstitutionsManager.cc:33 ../qt/src/SubstitutionsManager.cc:73 msgid "Search for" msgstr "" #: ../gtk/src/SubstitutionsManager.cc:34 ../qt/src/SubstitutionsManager.cc:73 msgid "Replace with" msgstr "" #: ../gtk/src/SubstitutionsManager.cc:69 ../gtk/src/SubstitutionsManager.cc:103 #: ../qt/src/SubstitutionsManager.cc:106 ../qt/src/SubstitutionsManager.cc:143 msgid "Substitutions List" msgstr "" #: ../gtk/src/SubstitutionsManager.cc:70 ../qt/src/SubstitutionsManager.cc:106 msgid "Open Substitutions List" msgstr "" #: ../gtk/src/SubstitutionsManager.cc:75 ../qt/src/SubstitutionsManager.cc:112 msgid "Error Reading File" msgstr "" #: ../gtk/src/SubstitutionsManager.cc:75 ../qt/src/SubstitutionsManager.cc:112 msgid "Unable to read '%1'." msgstr "" #: ../gtk/src/SubstitutionsManager.cc:97 ../qt/src/SubstitutionsManager.cc:137 msgid "Errors Occurred Reading File" msgstr "" #: ../gtk/src/SubstitutionsManager.cc:97 ../qt/src/SubstitutionsManager.cc:137 msgid "Some entries of the substitutions list could not be read." msgstr "" #: ../gtk/src/SubstitutionsManager.cc:104 ../qt/src/SubstitutionsManager.cc:143 msgid "Save Substitutions List" msgstr "" #: ../gtk/src/SubstitutionsManager.cc:110 ../qt/src/SubstitutionsManager.cc:149 msgid "Error Saving File" msgstr "" #: ../gtk/src/SubstitutionsManager.cc:110 ../qt/src/SubstitutionsManager.cc:149 msgid "Unable to write to '%1'." msgstr "" #: ../gtk/src/SubstitutionsManager.cc:127 ../qt/src/SubstitutionsManager.cc:162 msgid "Save List?" msgstr "" #: ../gtk/src/SubstitutionsManager.cc:127 ../qt/src/SubstitutionsManager.cc:162 msgid "Do you want to save the current list?" msgstr "" #: ../gtk/src/TessdataManager.cc:60 ../qt/src/TessdataManager.cc:74 msgid "" "A session connection to the PackageKit backend is required for managing " "system-wide tesseract language packs, but it was not found. This service is " "usually provided by a software-management application such as Gnome " "Software. Please install software which provides the necessary PackageKit " "interface, use other system package management software to manage the " "tesseract language packs directly, or switch to using the user tessdata path " "in the configuration dialog." msgstr "" #: ../gtk/src/TessdataManager.cc:65 ../qt/src/TessdataManager.cc:79 msgid "Fetching available languages" msgstr "" #: ../gtk/src/TessdataManager.cc:70 ../gtk/src/TessdataManager.cc:96 #: ../gtk/src/TessdataManager.cc:197 ../qt/src/TessdataManager.cc:84 #: ../qt/src/TessdataManager.cc:101 ../qt/src/TessdataManager.cc:197 msgid "Failed to fetch list of available languages: %1" msgstr "" #: ../gtk/src/TessdataManager.cc:104 ../qt/src/TessdataManager.cc:113 #: ../qt/src/TessdataManager.cc:122 msgid "Parsing error: %1" msgstr "" #: ../gtk/src/TessdataManager.cc:235 ../qt/src/TessdataManager.cc:232 msgid "Applying changes..." msgstr "" #: ../gtk/src/TessdataManager.cc:297 ../qt/src/TessdataManager.cc:278 msgid "Failed to create directory for tessdata files." msgstr "" #: ../gtk/src/TessdataManager.cc:306 ../qt/src/TessdataManager.cc:287 msgid "Downloading %1..." msgstr "" #: ../gtk/src/TessdataManager.cc:330 msgid "" "The following files could not be downloaded or removed:\n" "%1\n" "\n" "Check the connectivity and directory permissions.\n" "\n" "Hint: If you don't have write permissions in system folders, you can switch " "to user paths in the settings dialog." msgstr "" #: ../gtk/src/Utils.cc:64 msgid "Yes" msgstr "" #: ../gtk/src/Utils.cc:67 msgid "No" msgstr "" #: ../gtk/src/Utils.cc:76 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/CrashHandler.ui.h:3 msgid "" "

Tesseract has " "aborted

Tesseract (the OCR engine) has aborted while " "recognizing text. This may occur if the used traineddatas are corrupt or " "incomplatible with the version of tesseract in use, or due to a bug in " "tesseract.

The stacktrace below may provide additional information " "about where the crash occured.

" msgstr "" #: ../qt/data/MainWindow.ui.h:17 msgid "Flatbed" msgstr "" #: ../qt/data/MainWindow.ui.h:18 msgid "ADF Front" msgstr "" #: ../qt/data/MainWindow.ui.h:19 msgid "ADF Back" msgstr "" #: ../qt/data/MainWindow.ui.h:20 msgid "ADF Duplex" msgstr "" #. Remove & from some labels which designer insists in adding #: ../qt/data/MainWindow.ui.h:21 ../qt/src/Ui_MainWindow.hh:50 msgid "Sources" msgstr "" #: ../qt/data/MainWindow.ui.h:22 msgid "Zoom In" msgstr "" #: ../qt/data/MainWindow.ui.h:24 msgid "Zoom Out" msgstr "" #: ../qt/data/MainWindow.ui.h:26 msgid "Normal Size" msgstr "" #: ../qt/data/MainWindow.ui.h:28 msgid "Best Fit" msgstr "" #: ../qt/data/MainWindow.ui.h:30 msgid "Rotate Left" msgstr "" #: ../qt/data/MainWindow.ui.h:31 msgid "Rotate left" msgstr "" #: ../qt/data/MainWindow.ui.h:32 msgid "Rotate Right" msgstr "" #: ../qt/data/MainWindow.ui.h:33 msgid "Rotate right" msgstr "" #: ../qt/data/MainWindow.ui.h:34 msgid "Image Controls" msgstr "" #: ../qt/data/MainWindow.ui.h:36 msgid "Autodetect Layout" msgstr "" #: ../qt/data/MainWindow.ui.h:38 msgid "Toggle Output Pane" msgstr "" #: ../qt/data/PdfExportDialog.ui.h:5 msgid "Backend:" msgstr "" #: ../qt/data/PdfExportDialog.ui.h:8 msgid "Portrait" msgstr "" #: ../qt/data/PdfExportDialog.ui.h:9 msgid "Landscape" msgstr "" #: ../qt/src/hocr/HOCRPdfExporter.cc:142 msgid "Failed to write to file" msgstr "" #. Output toolbar #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:55 #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:56 msgid "Open hOCR file" msgstr "" #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:57 #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:58 msgid "Save as hOCR text" msgstr "" #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:79 #: ../qt/src/Ui_OutputEditorText.hh:106 msgid "Find and Replace" msgstr "" #: ../qt/src/MainWindow.cc:581 msgid "" "The following dictionary files were installed:\n" "%1" msgstr "" #: ../qt/src/TessdataManager.cc:308 msgid "" "The following files could not be downloaded or removed:\n" "%1\n" "\n" "Check the connectivity and directory permissions.\n" "Hint: If you don't have write permissions in system folders, you can switch " "to user paths in the settings dialog." msgstr "" #: ../qt/src/Ui_MainWindow.hh:51 msgid "Output" msgstr "" #: ../qt/src/Ui_MainWindow.hh:135 msgid "OCR mode:" msgstr "" #: ../qt/src/Ui_MainWindow.hh:209 msgid "Remove Image" msgstr "" #: ../qt/src/Ui_MainWindow.hh:212 msgid "Delete Image" msgstr "" #: ../qt/src/Ui_MainWindow.hh:215 msgid "Clear List" msgstr "" #: ../qt/src/Ui_OutputEditorText.hh:101 msgid "Strip Line Breaks" msgstr "" #: ../qt/src/Ui_OutputEditorText.hh:115 msgid "Save Output" msgstr "" #: ../qt/src/Ui_OutputEditorText.hh:117 msgid "Clear Output" msgstr "" #~ msgid "The application has crashed" #~ msgstr "Aplikazioa gelditu egin da" gImageReader-3.3.1/po/fr.po000066400000000000000000002137161351740627400154420ustar00rootroot00000000000000# 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: 2019-07-25 23:17+0200\n" "PO-Revision-Date: 2018-02-26 09:36+0000\n" "Last-Translator: doplu \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: Weblate 2.20-dev\n" #: ../data/gimagereader.desktop.in.h:1 msgid "OCR application" msgstr "Application OCR" #: ../gtk/data/appmenu.ui.h:1 ../qt/src/Ui_MainWindow.hh:167 msgid "Redetect Languages" msgstr "Redétecter langues" #: ../gtk/data/appmenu.ui.h:2 ../qt/src/Ui_MainWindow.hh:170 msgid "Manage Languages" msgstr "Gérer langues" #: ../gtk/data/appmenu.ui.h:3 ../gtk/data/ConfigDialog.ui.h:1 #: ../qt/data/ConfigDialog.ui.h:1 ../qt/src/Ui_MainWindow.hh:173 msgid "Preferences" msgstr "Préférences" #: ../gtk/data/appmenu.ui.h:4 ../gtk/data/ConfigDialog.ui.h:2 #: ../gtk/src/MainWindow.cc:482 ../qt/src/MainWindow.cc:481 #: ../qt/src/Ui_MainWindow.hh:178 msgid "Help" msgstr "Aide" #: ../gtk/data/appmenu.ui.h:5 ../qt/data/AboutDialog.ui.h:2 #: ../qt/src/Ui_MainWindow.hh:181 msgid "About" msgstr "À propos" #: ../gtk/data/appmenu.ui.h:6 msgid "Quit" msgstr "Quitter" #: ../gtk/data/ConfigDialog.ui.h:3 ../gtk/data/MainWindow.ui.h:47 #: ../gtk/data/OutputEditorHOCR.ui.h:3 ../gtk/data/PdfExportDialog.ui.h:3 #: ../gtk/src/FileDialogs.cc:152 ../gtk/src/Utils.cc:61 #: ../qt/data/ConfigDialog.ui.h:26 msgid "OK" msgstr "OK" #: ../gtk/data/ConfigDialog.ui.h:4 msgid "Output pane orientation:" msgstr "Orientation de la zone de reconnaissance:" #: ../gtk/data/ConfigDialog.ui.h:5 msgid "Horizontal" msgstr "Horizontal" #: ../gtk/data/ConfigDialog.ui.h:6 msgid "Vertical" msgstr "Vertical" #: ../gtk/data/ConfigDialog.ui.h:7 ../qt/data/ConfigDialog.ui.h:18 msgid "Query to install missing spellcheck dictionaries" msgstr "Proposer d'installer les dictionnaires manquants" #: ../gtk/data/ConfigDialog.ui.h:8 ../qt/data/ConfigDialog.ui.h:4 msgid "Automatically check for new program versions" msgstr "Vérifier si une nouvelle version est disponible" #: ../gtk/data/ConfigDialog.ui.h:9 ../qt/data/ConfigDialog.ui.h:3 msgid "Predefined language definitions:" msgstr "Définitions par défaut des langues:" #: ../gtk/data/ConfigDialog.ui.h:10 ../qt/data/ConfigDialog.ui.h:12 msgid "Additional language definitions:" msgstr "Définitions de langues supplémentaires" #: ../gtk/data/ConfigDialog.ui.h:11 ../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/ConfigDialog.ui.h:12 ../qt/data/ConfigDialog.ui.h:21 msgid "Prefix" msgstr "Préfixe" #: ../gtk/data/ConfigDialog.ui.h:13 ../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/ConfigDialog.ui.h:14 ../qt/data/ConfigDialog.ui.h:23 msgid "ISO Code" msgstr "Code ISO" #: ../gtk/data/ConfigDialog.ui.h:15 ../qt/data/ConfigDialog.ui.h:24 msgid "The name of the language" msgstr "Le nom de la langue" #: ../gtk/data/ConfigDialog.ui.h:16 ../qt/data/ConfigDialog.ui.h:25 msgid "Name" msgstr "Nom" #: ../gtk/data/ConfigDialog.ui.h:17 ../gtk/data/MainWindow.ui.h:46 #: ../gtk/data/OutputEditorHOCR.ui.h:2 ../gtk/data/PdfExportDialog.ui.h:2 #: ../gtk/src/Acquirer.cc:34 ../gtk/src/FileDialogs.cc:151 #: ../gtk/src/Utils.cc:70 ../qt/data/ConfigDialog.ui.h:27 #: ../qt/data/MainWindow.ui.h:12 msgid "Cancel" msgstr "Annuler" #: ../gtk/data/ConfigDialog.ui.h:18 ../qt/data/ConfigDialog.ui.h:5 msgid "Output pane font:" msgstr "Police utilisée dans le panneau de reconnaissance:" #: ../gtk/data/ConfigDialog.ui.h:19 ../qt/data/ConfigDialog.ui.h:2 msgid "Default" msgstr "Prédéfini" #: ../gtk/data/ConfigDialog.ui.h:20 ../qt/data/ConfigDialog.ui.h:6 msgid "Language data locations:" msgstr "Positions de données de langue:" #: ../gtk/data/ConfigDialog.ui.h:21 ../qt/data/ConfigDialog.ui.h:13 msgid "Language definitions path:" msgstr "Chemin du définitions des langues:" #: ../gtk/data/ConfigDialog.ui.h:22 ../qt/data/ConfigDialog.ui.h:28 msgid "Spelling dictionaries path:" msgstr "Chemin du dictionnaires:" #: ../gtk/data/ConfigDialog.ui.h:23 ../qt/data/ConfigDialog.ui.h:10 msgid "System-wide paths" msgstr "Système" #: ../gtk/data/ConfigDialog.ui.h:24 ../qt/data/ConfigDialog.ui.h:11 msgid "User paths" msgstr "Utilisateur" #: ../gtk/data/ConfigDialog.ui.h:25 ../qt/data/ConfigDialog.ui.h:29 msgid "Automatically open exported documents with default application" msgstr "" "Ouvrir automatiquement les documents exportés avec l'application par défaut" #: ../gtk/data/CrashHandler.ui.h:1 ../qt/src/CrashHandler.cc:38 msgid "Regenerate backtrace" msgstr "Régénérer backtrace" #: ../gtk/data/CrashHandler.ui.h:3 #, no-c-format msgid "" "The application has crashed\n" "\n" "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\n" "\n" "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/CrashHandler.ui.h:6 msgid "" "Tesseract has aborted\n" "\n" "Tesseract (the OCR engine) has aborted while recognizing text. This may " "occur if the used traineddatas are corrupt or incomplatible with the version " "of tesseract in use, or due to a bug in tesseract.\n" "\n" "The stacktrace below may provide additional information about where the " "crash occured.\n" msgstr "" "Tesseract a avorté\n" "\n" "Tesseract (le moteur d'OCR) a avorté pendant la reconnaissance de texte. " "Cela peut se produire si les données traineddata utilisées sont corrompues " "ou incompatibles avec la version de tesseract utilisée, ou en raison d'un " "bug dans tesseract.\n" "\n" "Le stacktrace ci-dessous peut fournir des informations supplémentaires sur " "l'endroit où le crash s'est produit.\n" #: ../gtk/data/MainWindow.ui.h:1 ../qt/data/MainWindow.ui.h:39 msgid "Toggle output pane" msgstr "Montrer / cacher le panneau de reconnaissance" #: ../gtk/data/MainWindow.ui.h:2 ../qt/src/Ui_MainWindow.hh:66 msgid "Rotate current page" msgstr "Pivoter page courante" #: ../gtk/data/MainWindow.ui.h:3 ../qt/src/Ui_MainWindow.hh:67 msgid "Rotate all pages" msgstr "Pivoter toutes les pages" #. Sources toolbar #: ../gtk/data/MainWindow.ui.h:4 ../qt/src/Ui_MainWindow.hh:192 msgid "Recent" msgstr "Fichiers Récents" #: ../gtk/data/MainWindow.ui.h:5 ../qt/src/Ui_MainWindow.hh:193 msgid "Paste" msgstr "Coller" #: ../gtk/data/MainWindow.ui.h:6 ../qt/src/Ui_MainWindow.hh:194 msgid "Take Screenshot" msgstr "Capture d'écran" #: ../gtk/data/MainWindow.ui.h:7 ../qt/data/MainWindow.ui.h:23 msgid "Zoom in" msgstr "Zoom avant" #: ../gtk/data/MainWindow.ui.h:8 ../qt/data/MainWindow.ui.h:25 msgid "Zoom out" msgstr "Zoom arrière" #: ../gtk/data/MainWindow.ui.h:9 ../qt/data/MainWindow.ui.h:27 msgid "Normal size" msgstr "Taille normale" #: ../gtk/data/MainWindow.ui.h:10 ../qt/data/MainWindow.ui.h:29 msgid "Best fit" msgstr "Ajuster à la page" #: ../gtk/data/MainWindow.ui.h:11 ../qt/src/Ui_MainWindow.hh:75 msgid "Select rotation mode" msgstr "Mode de rotation" #: ../gtk/data/MainWindow.ui.h:12 ../gtk/data/OutputEditorText.ui.h:13 #: ../qt/src/Ui_OutputEditorText.hh:95 msgid "Select insert mode" msgstr "Sélectionner mode d'insertion" #: ../gtk/data/MainWindow.ui.h:13 ../qt/src/Ui_MainWindow.hh:109 msgid "Select page" msgstr "Sélectionner page" #: ../gtk/data/MainWindow.ui.h:14 ../qt/data/MainWindow.ui.h:35 msgid "Image controls" msgstr "Régler les paramètres de l'image" #: ../gtk/data/MainWindow.ui.h:15 ../qt/src/Ui_MainWindow.hh:139 msgid "Plain text" msgstr "Texte" #: ../gtk/data/MainWindow.ui.h:16 ../qt/src/Ui_MainWindow.hh:139 msgid "hOCR, PDF" msgstr "hOCR, PDF" #: ../gtk/data/MainWindow.ui.h:17 ../qt/data/MainWindow.ui.h:37 msgid "Autodetect layout" msgstr "Détecter la mise en page" #: ../gtk/data/MainWindow.ui.h:18 msgid "Recognize all" msgstr "Tout reconnaître" #: ../gtk/data/MainWindow.ui.h:19 msgid "Select language" msgstr "Sélectionner langue" #: ../gtk/data/MainWindow.ui.h:20 ../qt/src/Ui_MainWindow.hh:205 msgid "Add images" msgstr "Ajouter des images" #: ../gtk/data/MainWindow.ui.h:21 ../qt/src/Ui_MainWindow.hh:204 msgid "Add Images" msgstr "Ajouter des images" #: ../gtk/data/MainWindow.ui.h:22 ../qt/src/Ui_MainWindow.hh:210 msgid "Remove image from list" msgstr "Supprimer l'image de la liste" #: ../gtk/data/MainWindow.ui.h:23 ../qt/src/Ui_MainWindow.hh:213 msgid "Delete image" msgstr "Supprimer image" #: ../gtk/data/MainWindow.ui.h:24 ../qt/src/Ui_MainWindow.hh:216 msgid "Clear list" msgstr "Vider liste" #: ../gtk/data/MainWindow.ui.h:25 ../qt/data/MainWindow.ui.h:5 msgid "Files" msgstr "Fichiers" #: ../gtk/data/MainWindow.ui.h:26 ../qt/data/MainWindow.ui.h:8 msgid "Device:" msgstr "Dispositif:" #: ../gtk/data/MainWindow.ui.h:27 ../gtk/data/TessdataManager.ui.h:4 #: ../qt/data/MainWindow.ui.h:7 ../qt/src/TessdataManager.cc:59 msgid "Refresh" msgstr "Actualiser" #: ../gtk/data/MainWindow.ui.h:28 ../qt/data/MainWindow.ui.h:9 msgid "Output:" msgstr "Reconnaissance:" #: ../gtk/data/MainWindow.ui.h:29 ../qt/data/MainWindow.ui.h:13 msgid "Mode:" msgstr "Modalité:" #: ../gtk/data/MainWindow.ui.h:30 ../gtk/src/hocr/HOCRPdfExporter.cc:313 #: ../qt/data/MainWindow.ui.h:15 ../qt/src/hocr/HOCRPdfExporter.cc:347 msgid "Color" msgstr "Couleur" #: ../gtk/data/MainWindow.ui.h:31 ../gtk/src/hocr/HOCRPdfExporter.cc:316 #: ../qt/data/MainWindow.ui.h:14 ../qt/src/hocr/HOCRPdfExporter.cc:349 #: ../qt/src/hocr/HOCRPdfExporter.cc:351 msgid "Grayscale" msgstr "Niveaux de gris" #: ../gtk/data/MainWindow.ui.h:32 ../qt/data/MainWindow.ui.h:10 msgid "Resolution:" msgstr "Résolution:" #: ../gtk/data/MainWindow.ui.h:33 ../qt/data/MainWindow.ui.h:11 msgid "Scan" msgstr "Scanner" #: ../gtk/data/MainWindow.ui.h:34 ../qt/data/MainWindow.ui.h:16 msgid "Source:" msgstr "Sources:" #: ../gtk/data/MainWindow.ui.h:35 ../qt/data/MainWindow.ui.h:6 msgid "Acquire" msgstr "Acquérir" #: ../gtk/data/MainWindow.ui.h:36 ../qt/data/MainWindow.ui.h:1 msgid "Brightness" msgstr "Luminosité" #: ../gtk/data/MainWindow.ui.h:37 ../qt/data/MainWindow.ui.h:2 msgid "Contrast" msgstr "Contraste" #: ../gtk/data/MainWindow.ui.h:38 ../qt/data/MainWindow.ui.h:3 msgid "Resolution" msgstr "Résolution" #: ../gtk/data/MainWindow.ui.h:39 ../qt/data/MainWindow.ui.h:4 msgid "Invert colors" msgstr "Invertir couleurs" #: ../gtk/data/MainWindow.ui.h:40 msgid "A graphical frontend to tesseract-ocr" msgstr "Une interface graphique pour tesseract-ocr" #: ../gtk/data/MainWindow.ui.h:41 ../qt/data/CharacterListDialog.ui.h:1 msgid "Character whitelist / blacklist" msgstr "Whitelist / blacklist des charactèrs" #: ../gtk/data/MainWindow.ui.h:42 ../qt/data/CharacterListDialog.ui.h:2 msgid "Exclude these characters from being recognized (blacklist):" msgstr "Exclure ces caractères de la reconnaissance (blacklist):" #: ../gtk/data/MainWindow.ui.h:43 ../qt/data/CharacterListDialog.ui.h:3 #, fuzzy msgid "Enter a string of characters..." msgstr "Entrez une chaîne de caractères..." #: ../gtk/data/MainWindow.ui.h:44 ../qt/data/CharacterListDialog.ui.h:4 msgid "Only allow the following characters to be recognized (whitelist):" msgstr "Seuls les caractères suivants peuvent être reconnus (whitelist):" #: ../gtk/data/MainWindow.ui.h:45 ../qt/data/PageRangeDialog.ui.h:1 msgid "Page Range" msgstr "Pages" #: ../gtk/data/MainWindow.ui.h:48 ../qt/data/PageRangeDialog.ui.h:2 msgid "Page range:" msgstr "Pages:" #: ../gtk/data/MainWindow.ui.h:49 ../qt/data/PageRangeDialog.ui.h:3 msgid "Example: 1-10, 13, 14-18" msgstr "Par exemple: 1-10, 13, 14-18" #: ../gtk/data/MainWindow.ui.h:50 ../qt/data/PageRangeDialog.ui.h:4 msgid "Recognition area:" msgstr "Zone de reconnaissance:" #: ../gtk/data/MainWindow.ui.h:51 ../gtk/src/Recognizer.cc:375 #: ../qt/data/PageRangeDialog.ui.h:5 ../qt/src/Recognizer.cc:369 msgid "Entire page" msgstr "Page complète" #: ../gtk/data/MainWindow.ui.h:52 ../qt/data/PageRangeDialog.ui.h:6 msgid "Autodetect" msgstr "Détecter automatiquement" #: ../gtk/data/MainWindow.ui.h:53 ../qt/data/PageRangeDialog.ui.h:7 msgid "Prepend to output text:" msgstr "Ajouter reconnaissance:" #: ../gtk/data/MainWindow.ui.h:54 ../qt/data/PageRangeDialog.ui.h:8 msgid "Source filename" msgstr "Nom de fichier d'origine" #: ../gtk/data/MainWindow.ui.h:55 ../qt/data/PageRangeDialog.ui.h:9 msgid "Source page" msgstr "Page d'origine" #: ../gtk/data/MainWindow.ui.h:56 ../qt/src/SourceManager.cc:146 msgid "Protected PDF" msgstr "PDF protégé" #: ../gtk/data/MainWindow.ui.h:57 ../qt/src/Recognizer.cc:76 msgid "Current Page" msgstr "Page courante" #: ../gtk/data/MainWindow.ui.h:58 ../qt/src/Recognizer.cc:79 msgid "Multiple Pages..." msgstr "Plusieurs pages..." #: ../gtk/data/OutputEditorHOCR.ui.h:1 ../qt/src/hocr/OutputEditorHOCR.cc:580 msgid "Add Word" msgstr "Ajouter un mot" #: ../gtk/data/OutputEditorHOCR.ui.h:4 ../qt/src/hocr/OutputEditorHOCR.cc:580 msgid "Enter word:" msgstr "Ignorer mot:" #: ../gtk/data/OutputEditorHOCR.ui.h:5 ../qt/src/hocr/Ui_OutputEditorHOCR.hh:61 #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:62 msgid "Export to plain text" msgstr "Exporter au format texte" #: ../gtk/data/OutputEditorHOCR.ui.h:6 ../qt/src/hocr/Ui_OutputEditorHOCR.hh:64 #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:65 msgid "Export to PDF" msgstr "Exporter au format PDF" #: ../gtk/data/OutputEditorHOCR.ui.h:7 ../qt/src/hocr/Ui_OutputEditorHOCR.hh:67 #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:68 msgid "Export to ODT" msgstr "Exporter au format ODT" #: ../gtk/data/OutputEditorHOCR.ui.h:8 ../gtk/data/OutputEditorText.ui.h:18 #: ../qt/src/Ui_OutputEditorText.hh:116 msgid "Save output" msgstr "Enregistrer la reconnaissance" #: ../gtk/data/OutputEditorHOCR.ui.h:9 ../qt/src/hocr/Ui_OutputEditorHOCR.hh:72 #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:73 msgid "Export" msgstr "Exporter" #: ../gtk/data/OutputEditorHOCR.ui.h:10 ../gtk/data/OutputEditorText.ui.h:19 #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:77 #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:78 #: ../qt/src/Ui_OutputEditorText.hh:118 msgid "Clear output" msgstr "Supprimer la reconnaissance" #: ../gtk/data/OutputEditorHOCR.ui.h:11 ../gtk/data/OutputEditorText.ui.h:15 #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:80 #: ../qt/src/Ui_OutputEditorText.hh:107 msgid "Find and replace" msgstr "Trouver et remplacer" #: ../gtk/data/OutputEditorHOCR.ui.h:12 #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:82 #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:83 msgid "Show confidence values" msgstr "Montrer les valeurs de confiance" #: ../gtk/data/OutputEditorHOCR.ui.h:13 ../gtk/data/PdfExportDialog.ui.h:41 #: ../qt/data/PdfExportDialog.ui.h:2 ../qt/src/hocr/Ui_OutputEditorHOCR.hh:85 #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:86 msgid "Show preview" msgstr "Montrer aperçu" #: ../gtk/data/OutputEditorHOCR.ui.h:14 #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:121 msgid "Next (F3)" msgstr "Suivant (F3)" #: ../gtk/data/OutputEditorHOCR.ui.h:15 #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:122 msgid "Previous (Shift+F3)" msgstr "Précédent (Shift+F3)" #: ../gtk/data/OutputEditorHOCR.ui.h:16 ../gtk/src/hocr/OutputEditorHOCR.cc:890 #: ../qt/src/hocr/OutputEditorHOCR.cc:730 #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:126 msgid "Expand all" msgstr "Déplier" #: ../gtk/data/OutputEditorHOCR.ui.h:17 ../gtk/src/hocr/OutputEditorHOCR.cc:893 #: ../qt/src/hocr/OutputEditorHOCR.cc:731 #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:127 msgid "Collapse all" msgstr "Replier" #: ../gtk/data/OutputEditorHOCR.ui.h:18 #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:148 msgid "Properties" msgstr "Propriétés" #: ../gtk/data/OutputEditorHOCR.ui.h:19 #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:152 msgid "Source" msgstr "Sources" #. Output insert mode #: ../gtk/data/OutputEditorText.ui.h:1 ../qt/src/Ui_OutputEditorText.hh:52 msgid "Append to current text" msgstr "Ajouter au texte existant" #: ../gtk/data/OutputEditorText.ui.h:2 ../qt/src/Ui_OutputEditorText.hh:53 msgid "Insert at cursor" msgstr "Insérer au curseur" #: ../gtk/data/OutputEditorText.ui.h:3 ../qt/src/Ui_OutputEditorText.hh:54 msgid "Replace current text" msgstr "Remplacer le texte existant" #. Output postprocessing #: ../gtk/data/OutputEditorText.ui.h:4 ../qt/src/Ui_OutputEditorText.hh:62 msgid "Keep line break if..." msgstr "Conserver les sauts de ligne si..." #: ../gtk/data/OutputEditorText.ui.h:5 ../qt/src/Ui_OutputEditorText.hh:64 msgid "Preceded by end mark (.?!)" msgstr "...ils sont précédés par une marque de fin (.?!)" #: ../gtk/data/OutputEditorText.ui.h:6 ../qt/src/Ui_OutputEditorText.hh:66 msgid "Preceded or succeeded by quote" msgstr "...ils sont précédés ou suivis par un guillemet" #: ../gtk/data/OutputEditorText.ui.h:7 ../qt/src/Ui_OutputEditorText.hh:68 msgid "Other options" msgstr "Autres options" #: ../gtk/data/OutputEditorText.ui.h:8 ../qt/src/Ui_OutputEditorText.hh:70 msgid "Join hyphenated words" msgstr "Lier les mots composés" #: ../gtk/data/OutputEditorText.ui.h:9 ../qt/src/Ui_OutputEditorText.hh:72 msgid "Collapse whitespace" msgstr "Réduire les espaces" #: ../gtk/data/OutputEditorText.ui.h:10 ../qt/src/Ui_OutputEditorText.hh:74 msgid "Preserve paragraphs" msgstr "Préserver paragraphes" #: ../gtk/data/OutputEditorText.ui.h:11 ../qt/src/Ui_OutputEditorText.hh:76 msgid "Visual aids" msgstr "Aides visuelles" #: ../gtk/data/OutputEditorText.ui.h:12 ../qt/src/Ui_OutputEditorText.hh:78 msgid "Draw whitespace" msgstr "Dessiner les espaces" #: ../gtk/data/OutputEditorText.ui.h:14 ../qt/src/Ui_OutputEditorText.hh:102 msgid "Strip line breaks on selected text" msgstr "Supprimer sauts de ligne dans le texte sélectionné" #: ../gtk/data/OutputEditorText.ui.h:16 ../qt/src/Ui_OutputEditorText.hh:109 #: ../qt/src/Ui_OutputEditorText.hh:110 msgid "Undo" msgstr "Annuler" #: ../gtk/data/OutputEditorText.ui.h:17 ../qt/src/Ui_OutputEditorText.hh:112 #: ../qt/src/Ui_OutputEditorText.hh:113 msgid "Redo" msgstr "Refaire" #: ../gtk/data/PdfExportDialog.ui.h:1 ../qt/data/PdfExportDialog.ui.h:1 msgid "PDF Export" msgstr "Exportation PDF" #: ../gtk/data/PdfExportDialog.ui.h:4 ../qt/data/PdfExportDialog.ui.h:4 msgid "Output mode:" msgstr "Modalité:" #: ../gtk/data/PdfExportDialog.ui.h:5 ../qt/data/PdfExportDialog.ui.h:6 msgid "PDF" msgstr "PDF" #: ../gtk/data/PdfExportDialog.ui.h:6 ../qt/data/PdfExportDialog.ui.h:7 msgid "PDF with invisible text overlay" msgstr "PDF avec invisible superposition de texte" #: ../gtk/data/PdfExportDialog.ui.h:7 ../qt/data/PdfExportDialog.ui.h:16 msgid "Format:" msgstr "Format:" #: ../gtk/data/PdfExportDialog.ui.h:8 ../qt/data/PdfExportDialog.ui.h:17 msgid "Compression:" msgstr "Compression:" #: ../gtk/data/PdfExportDialog.ui.h:9 ../qt/data/PdfExportDialog.ui.h:14 msgid "Compression quality:" msgstr "Qualité de compression:" #: ../gtk/data/PdfExportDialog.ui.h:10 ../qt/data/PdfExportDialog.ui.h:15 msgid "DPI:" msgstr "DPI:" #: ../gtk/data/PdfExportDialog.ui.h:11 ../qt/data/PdfExportDialog.ui.h:18 msgid "Dithering algorithm:" msgstr "Algorithme de tramage:" #: ../gtk/data/PdfExportDialog.ui.h:12 ../qt/data/PdfExportDialog.ui.h:13 msgid "Image settings:" msgstr "Paramètres d'image" #: ../gtk/data/PdfExportDialog.ui.h:13 ../qt/data/PdfExportDialog.ui.h:25 msgid "Uniformize line and word spacing" msgstr "Homogénéiser interligne" #: ../gtk/data/PdfExportDialog.ui.h:14 ../qt/data/PdfExportDialog.ui.h:21 msgid "Override font family:" msgstr "Remplacer la police:" #: ../gtk/data/PdfExportDialog.ui.h:15 ../qt/data/PdfExportDialog.ui.h:27 msgid "Fallback font family:" msgstr "Police de remplacement:" #: ../gtk/data/PdfExportDialog.ui.h:16 ../qt/data/PdfExportDialog.ui.h:20 msgid "Override font size:" msgstr "Écraser les tailles de police détectés" #: ../gtk/data/PdfExportDialog.ui.h:17 ../qt/data/PdfExportDialog.ui.h:23 msgid "Font scaling:" msgstr "Echelle de police:" #: ../gtk/data/PdfExportDialog.ui.h:18 ../qt/data/PdfExportDialog.ui.h:26 msgid "pt" msgstr "pt" #: ../gtk/data/PdfExportDialog.ui.h:19 ../qt/data/PdfExportDialog.ui.h:22 msgid "Preserve spaces wider than:" msgstr "Préserver les espaces plus larges que:" #: ../gtk/data/PdfExportDialog.ui.h:20 ../qt/data/PdfExportDialog.ui.h:24 msgid "characters" msgstr "caractères" #: ../gtk/data/PdfExportDialog.ui.h:21 ../qt/data/PdfExportDialog.ui.h:28 msgid "Sanitize hyphens before line breaks" msgstr "Corriger les traits d'union avant les sauts de ligne" #: ../gtk/data/PdfExportDialog.ui.h:22 ../qt/data/PdfExportDialog.ui.h:19 msgid "Text settings:" msgstr "Paramètres de texte" #: ../gtk/data/PdfExportDialog.ui.h:23 ../qt/data/PdfExportDialog.ui.h:10 msgid "Paper size:" msgstr "Taille du papier" #: ../gtk/data/PdfExportDialog.ui.h:24 ../qt/data/PdfExportDialog.ui.h:11 msgid "Width" msgstr "Largeur" #: ../gtk/data/PdfExportDialog.ui.h:25 ../qt/data/PdfExportDialog.ui.h:12 msgid "Height" msgstr "Hauteur" #: ../gtk/data/PdfExportDialog.ui.h:26 ../qt/data/PdfExportDialog.ui.h:29 msgid "Treat image sources as having true DPI:" msgstr "Traiter les sources d'images comme ayant un DPI:" #: ../gtk/data/PdfExportDialog.ui.h:27 ../qt/data/PdfExportDialog.ui.h:3 msgid "Basic" msgstr "Basique" #: ../gtk/data/PdfExportDialog.ui.h:28 ../qt/data/PdfExportDialog.ui.h:31 msgid "PDF version:" msgstr "Version PDF:" #: ../gtk/data/PdfExportDialog.ui.h:29 ../qt/data/PdfExportDialog.ui.h:33 msgid "Password:" msgstr "Mot de passe" #: ../gtk/data/PdfExportDialog.ui.h:30 ../qt/data/PdfExportDialog.ui.h:34 msgid "Confirm password:" msgstr "Confirmer le mot de passe:" #: ../gtk/data/PdfExportDialog.ui.h:31 ../qt/data/PdfExportDialog.ui.h:32 msgid "Encryption (optional):" msgstr "Cryptage (facultatif):" #: ../gtk/data/PdfExportDialog.ui.h:32 ../qt/data/PdfExportDialog.ui.h:36 msgid "Author:" msgstr "Auteur" #: ../gtk/data/PdfExportDialog.ui.h:33 ../qt/data/PdfExportDialog.ui.h:38 msgid "Title:" msgstr "Titre:" #: ../gtk/data/PdfExportDialog.ui.h:34 ../qt/data/PdfExportDialog.ui.h:40 msgid "Subject:" msgstr "Sujet:" #: ../gtk/data/PdfExportDialog.ui.h:35 ../qt/data/PdfExportDialog.ui.h:37 msgid "Creator:" msgstr "Créateur" #: ../gtk/data/PdfExportDialog.ui.h:36 ../qt/data/PdfExportDialog.ui.h:39 msgid "Producer:" msgstr "Producteur:" #: ../gtk/data/PdfExportDialog.ui.h:37 ../qt/data/PdfExportDialog.ui.h:41 msgid "Keywords:" msgstr "Mots clefs :" #: ../gtk/data/PdfExportDialog.ui.h:38 ../qt/data/PdfExportDialog.ui.h:35 msgid "Additional information (optional):" msgstr "Informations supplémentaires:" #: ../gtk/data/PdfExportDialog.ui.h:39 ../qt/data/PdfExportDialog.ui.h:42 msgid "Import from current source" msgstr "Importer à partir de la source actuelle" #: ../gtk/data/PdfExportDialog.ui.h:40 ../qt/data/PdfExportDialog.ui.h:30 msgid "Advanced" msgstr "Avancé" #: ../gtk/data/SearchReplaceFrame.ui.h:1 ../qt/data/SearchReplaceFrame.ui.h:4 msgid "Find" msgstr "Trouver" #: ../gtk/data/SearchReplaceFrame.ui.h:2 ../qt/data/SearchReplaceFrame.ui.h:2 msgid "Replace" msgstr "Remplacer" #: ../gtk/data/SearchReplaceFrame.ui.h:3 ../qt/data/SearchReplaceFrame.ui.h:3 msgid "Replace all" msgstr "Remplacer tous" #: ../gtk/data/SearchReplaceFrame.ui.h:4 ../qt/data/SearchReplaceFrame.ui.h:5 msgid "Find previous" msgstr "Trouver précédente" #: ../gtk/data/SearchReplaceFrame.ui.h:5 ../qt/data/SearchReplaceFrame.ui.h:6 msgid "Find next" msgstr "Trouver suivante" #: ../gtk/data/SearchReplaceFrame.ui.h:6 ../qt/data/SearchReplaceFrame.ui.h:7 msgid "Match case" msgstr "Sensible aux majuscules et minuscules" #: ../gtk/data/SearchReplaceFrame.ui.h:7 #: ../gtk/data/SubstitutionsManager.ui.h:1 ../qt/data/SearchReplaceFrame.ui.h:1 #: ../qt/src/SubstitutionsManager.cc:36 msgid "Substitutions" msgstr "Substitutions" #: ../gtk/data/SelectionMenu.ui.h:1 ../qt/src/DisplayerToolSelect.cc:239 msgid "Delete" msgstr "Supprimer" #: ../gtk/data/SelectionMenu.ui.h:2 ../qt/src/DisplayerToolSelect.cc:225 msgid "Order:" msgstr "Ordre:" #: ../gtk/data/SelectionMenu.ui.h:3 ../gtk/src/hocr/DisplayerToolHOCR.cc:29 #: ../qt/src/DisplayerToolSelect.cc:240 ../qt/src/hocr/DisplayerToolHOCR.cc:31 msgid "Recognize" msgstr "Reconnaître" #: ../gtk/data/SelectionMenu.ui.h:4 ../qt/src/DisplayerToolSelect.cc:241 msgid "Recognize to clipboard" msgstr "Reconnaître et coller dans le passe-papiers" #: ../gtk/data/SelectionMenu.ui.h:5 ../qt/src/DisplayerToolSelect.cc:242 msgid "Save as image" msgstr "Enregistrer image" #: ../gtk/data/SubstitutionsManager.ui.h:2 ../qt/src/SubstitutionsManager.cc:38 #: ../qt/src/SubstitutionsManager.cc:39 msgid "Open" msgstr "Ouvrir" #: ../gtk/data/SubstitutionsManager.ui.h:3 ../gtk/src/Utils.cc:73 #: ../qt/src/SubstitutionsManager.cc:41 ../qt/src/SubstitutionsManager.cc:42 msgid "Save" msgstr "Enregistrer" #: ../gtk/data/SubstitutionsManager.ui.h:4 ../qt/src/SubstitutionsManager.cc:44 #: ../qt/src/SubstitutionsManager.cc:45 msgid "Clear" msgstr "Vider" #: ../gtk/data/SubstitutionsManager.ui.h:5 ../qt/data/ConfigDialog.ui.h:16 #: ../qt/src/SubstitutionsManager.cc:47 ../qt/src/SubstitutionsManager.cc:48 msgid "Add" msgstr "Ajouter" #: ../gtk/data/SubstitutionsManager.ui.h:6 #: ../gtk/src/hocr/OutputEditorHOCR.cc:886 ../qt/data/ConfigDialog.ui.h:17 #: ../qt/src/hocr/OutputEditorHOCR.cc:727 ../qt/src/SubstitutionsManager.cc:50 #: ../qt/src/SubstitutionsManager.cc:51 msgid "Remove" msgstr "Supprimer" #: ../gtk/data/SubstitutionsManager.ui.h:7 ../gtk/data/TessdataManager.ui.h:2 msgid "Apply" msgstr "Appliquer" #: ../gtk/data/SubstitutionsManager.ui.h:8 ../gtk/data/TessdataManager.ui.h:3 msgid "Close" msgstr "Fermer" #: ../gtk/data/TessdataManager.ui.h:1 ../qt/src/TessdataManager.cc:49 msgid "Tessdata Manager" msgstr "Gestionnaire tessdata" #: ../gtk/data/TessdataManager.ui.h:5 ../qt/src/TessdataManager.cc:51 msgid "Manage installed languages:" msgstr "Gérer les langues installées:" #: ../gtk/src/Acquirer.cc:79 ../qt/src/Acquirer.cc:70 msgid "scan.png" msgstr "scan.png" #: ../gtk/src/Acquirer.cc:91 ../qt/src/Acquirer.cc:85 msgid "Images" msgstr "Images" #: ../gtk/src/Acquirer.cc:92 ../qt/src/Acquirer.cc:86 msgid "Choose Output Filename..." msgstr "Choisir un nom pour le fichier de reconnaissance..." #: ../gtk/src/Acquirer.cc:106 ../qt/src/Acquirer.cc:100 msgid "Failed to initialize the scanning backend." msgstr "Impossible d'initialiser le scanner." #: ../gtk/src/Acquirer.cc:115 ../qt/src/Acquirer.cc:106 msgid "Scan failed" msgstr "Erreur de scanner" #: ../gtk/src/Acquirer.cc:133 ../qt/src/Acquirer.cc:122 msgid "No scanners were detected." msgstr "Aucun scanner n'a été détecté." #: ../gtk/src/Acquirer.cc:150 ../gtk/src/Acquirer.cc:168 #: ../qt/src/Acquirer.cc:136 ../qt/src/Acquirer.cc:154 msgid "Starting scan..." msgstr "Démarrer le scan..." #: ../gtk/src/Acquirer.cc:164 ../qt/src/Acquirer.cc:150 msgid "Opening device..." msgstr "Ouverture du dispositif..." #: ../gtk/src/Acquirer.cc:166 ../qt/src/Acquirer.cc:152 msgid "Setting options..." msgstr "Régler les options..." #: ../gtk/src/Acquirer.cc:170 ../qt/src/Acquirer.cc:156 msgid "Getting parameters..." msgstr "Obtenir des paramètres" #: ../gtk/src/Acquirer.cc:172 ../qt/src/Acquirer.cc:158 msgid "Transferring data..." msgstr "Transfert de données..." #: ../gtk/src/Acquirer.cc:179 ../qt/src/Acquirer.cc:165 msgid "Canceling scan..." msgstr "Annulation de scan..." #: ../gtk/src/Config.cc:49 ../qt/data/ConfigDialog.ui.h:7 msgid "Filename prefix" msgstr "Préfixe nom fichier" #: ../gtk/src/Config.cc:50 ../qt/data/ConfigDialog.ui.h:8 msgid "Code" msgstr "Code" #: ../gtk/src/Config.cc:51 ../qt/data/ConfigDialog.ui.h:9 msgid "Native name" msgstr "Nom natif" #: ../gtk/src/Config.cc:109 ../qt/src/Config.cc:108 msgid "Script" msgstr "Script" #: ../gtk/src/CrashHandler.cc:25 ../gtk/src/CrashHandler.cc:41 #: ../qt/src/CrashHandler.cc:36 msgid "Crash Handler" msgstr "Gestionnaire de crash" #: ../gtk/src/CrashHandler.cc:43 ../qt/src/CrashHandler.cc:31 msgid "Your work has been saved under %1." msgstr "Votre travail a été enregistré sous %1." #: ../gtk/src/CrashHandler.cc:45 ../qt/src/CrashHandler.cc:33 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:62 msgid "Failed to obtain backtrace. Is gdb installed?" msgstr "Impossible d'obtenir le backtrace. Est-ce que gdb est installé ?" #: ../gtk/src/Displayer.cc:232 ../qt/src/Displayer.cc:174 msgid "Failed to load image" msgstr "Échec à l'ouverture de l'image" #: ../gtk/src/Displayer.cc:232 ../qt/src/Displayer.cc:174 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:138 ../qt/src/DisplayerToolSelect.cc:135 msgid "PNG Images" msgstr "Images PNG" #: ../gtk/src/DisplayerToolSelect.cc:139 ../qt/src/DisplayerToolSelect.cc:135 msgid "Save Selection Image" msgstr "Enregistrer sélection" #: ../gtk/src/DisplayerToolSelect.cc:139 ../qt/src/DisplayerToolSelect.cc:135 msgid "selection.png" msgstr "selection.png" #: ../gtk/src/DisplayerToolSelect.cc:146 ../qt/src/DisplayerToolSelect.cc:142 msgid "Recognize all" msgstr "Reconnaître tout" #: ../gtk/src/DisplayerToolSelect.cc:146 ../qt/src/DisplayerToolSelect.cc:142 msgid "Recognize selection" msgstr "Reconnaître la sélection" #: ../gtk/src/DisplayerToolSelect.cc:186 ../qt/src/DisplayerToolSelect.cc:182 msgid "Performing layout analysis" msgstr "Exécution l'analyse de mise en page" #: ../gtk/src/FileDialogs.cc:235 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:237 msgid "Overwrite File?" msgstr "Remplacer fichier ?" #: ../gtk/src/hocr/HOCRDocument.cc:611 ../gtk/src/hocr/OutputEditorHOCR.cc:266 #: ../qt/src/hocr/OutputEditorHOCR.cc:229 msgid "Page" msgstr "Page" #: ../gtk/src/hocr/HOCRDocument.cc:613 ../qt/src/hocr/HOCRDocument.cc:530 msgid "Text block" msgstr "Bloc de texte" #: ../gtk/src/hocr/HOCRDocument.cc:615 ../gtk/src/hocr/OutputEditorHOCR.cc:272 #: ../qt/src/hocr/HOCRDocument.cc:532 ../qt/src/hocr/OutputEditorHOCR.cc:231 msgid "Paragraph" msgstr "Paragraphe" #: ../gtk/src/hocr/HOCRDocument.cc:617 ../qt/src/hocr/HOCRDocument.cc:534 msgid "Textline" msgstr "Ligne de texte" #: ../gtk/src/hocr/HOCRDocument.cc:621 ../qt/src/hocr/HOCRDocument.cc:538 msgid "Graphic" msgstr "Graphique" #: ../gtk/src/hocr/HOCROdtExporter.cc:65 ../gtk/src/hocr/HOCRPdfExporter.cc:489 #: ../gtk/src/hocr/HOCRTextExporter.cc:34 #: ../gtk/src/hocr/OutputEditorHOCR.cc:963 ../gtk/src/OutputEditorText.cc:272 #: ../qt/src/hocr/HOCROdtExporter.cc:50 ../qt/src/hocr/HOCRPdfExporter.cc:478 #: ../qt/src/hocr/HOCRTextExporter.cc:36 ../qt/src/hocr/OutputEditorHOCR.cc:830 #: ../qt/src/OutputEditorText.cc:238 msgid "output" msgstr "Reconnaissance" #: ../gtk/src/hocr/HOCROdtExporter.cc:68 ../qt/src/hocr/HOCROdtExporter.cc:53 msgid "OpenDocument Text Documents" msgstr "Documents de texte OpenDocument" #: ../gtk/src/hocr/HOCROdtExporter.cc:69 ../qt/src/hocr/HOCROdtExporter.cc:53 msgid "Save ODT Output..." msgstr "Enregistrer output ODT..." #: ../gtk/src/hocr/HOCROdtExporter.cc:77 ../gtk/src/hocr/HOCROdtExporter.cc:342 #: ../gtk/src/hocr/HOCRPdfExporter.cc:619 #: ../gtk/src/hocr/HOCRTextExporter.cc:46 ../qt/src/hocr/HOCROdtExporter.cc:61 #: ../qt/src/hocr/HOCRPdfExporter.cc:609 ../qt/src/hocr/HOCRTextExporter.cc:47 msgid "Export failed" msgstr "Exportation a échoué" #: ../gtk/src/hocr/HOCROdtExporter.cc:77 ../gtk/src/hocr/HOCROdtExporter.cc:342 #: ../qt/src/hocr/HOCROdtExporter.cc:61 msgid "The ODT export failed: unable to write output file." msgstr "L'export ODT a échoué: impossible d'écrire le fichier de sortie." #: ../gtk/src/hocr/HOCROdtExporter.cc:336 ../qt/src/hocr/HOCROdtExporter.cc:254 msgid "Exporting to ODT..." msgstr "Exporter au format ODT..." #: ../gtk/src/hocr/HOCRPdfExporter.cc:283 ../qt/src/hocr/HOCRPdfExporter.cc:365 msgid "Same as source" msgstr "Même que la source" #: ../gtk/src/hocr/HOCRPdfExporter.cc:286 ../qt/src/hocr/HOCRPdfExporter.cc:366 msgid "Custom" msgstr "Personnalisé" #: ../gtk/src/hocr/HOCRPdfExporter.cc:300 ../qt/src/hocr/HOCRPdfExporter.cc:362 msgid "cm" msgstr "cm" #: ../gtk/src/hocr/HOCRPdfExporter.cc:303 ../qt/src/hocr/HOCRPdfExporter.cc:363 msgid "in" msgstr "in" #: ../gtk/src/hocr/HOCRPdfExporter.cc:319 ../qt/src/hocr/HOCRPdfExporter.cc:353 msgid "Monochrome" msgstr "Monochrome" #: ../gtk/src/hocr/HOCRPdfExporter.cc:328 ../qt/src/hocr/HOCRPdfExporter.cc:355 msgid "Threshold (closest color)" msgstr "Seuil (couleur la plus proche)" #: ../gtk/src/hocr/HOCRPdfExporter.cc:331 ../qt/src/hocr/HOCRPdfExporter.cc:356 msgid "Diffuse" msgstr "Diffus" #: ../gtk/src/hocr/HOCRPdfExporter.cc:340 ../qt/src/hocr/HOCRPdfExporter.cc:357 msgid "Zip (lossless)" msgstr "Zip (lossless)" #: ../gtk/src/hocr/HOCRPdfExporter.cc:344 ../qt/src/hocr/HOCRPdfExporter.cc:358 msgid "CCITT Group 4 (lossless)" msgstr "CCITT Group 4 (lossless)" #: ../gtk/src/hocr/HOCRPdfExporter.cc:348 ../qt/src/hocr/HOCRPdfExporter.cc:359 msgid "Jpeg (lossy)" msgstr "Jpeg (lossy)" #: ../gtk/src/hocr/HOCRPdfExporter.cc:493 ../qt/src/hocr/HOCRPdfExporter.cc:482 msgid "PDF Files" msgstr "Fichiers PDF" #: ../gtk/src/hocr/HOCRPdfExporter.cc:494 ../qt/src/hocr/HOCRPdfExporter.cc:482 msgid "Save PDF Output..." msgstr "Enregistrer output PDF..." #: ../gtk/src/hocr/HOCRPdfExporter.cc:500 ../qt/src/hocr/HOCRPdfExporter.cc:488 msgid "Invalid Output" msgstr "Sortie invalide" #: ../gtk/src/hocr/HOCRPdfExporter.cc:500 ../qt/src/hocr/HOCRPdfExporter.cc:488 msgid "Cannot overwrite a file which is a source image of this document." msgstr "" "Impossible d'écraser un fichier qui est une image source de ce document." #: ../gtk/src/hocr/HOCRPdfExporter.cc:516 ../qt/src/hocr/HOCRPdfExporter.cc:511 msgid "Failed to create output" msgstr "Échec de la création de sortie" #: ../gtk/src/hocr/HOCRPdfExporter.cc:516 ../qt/src/hocr/HOCRPdfExporter.cc:511 msgid "Failed to create output. The returned error was: %1" msgstr "Échec de la création de sortie. L'erreur retournée était: %1" #: ../gtk/src/hocr/HOCRPdfExporter.cc:558 ../qt/src/hocr/HOCRPdfExporter.cc:551 msgid "The operation was cancelled" msgstr "L'opération a été annulée" #: ../gtk/src/hocr/HOCRPdfExporter.cc:607 ../qt/src/hocr/HOCRPdfExporter.cc:597 msgid "Failed to render page %1" msgstr "Impossible de rendre la page %1" #: ../gtk/src/hocr/HOCRPdfExporter.cc:614 ../qt/src/hocr/HOCRPdfExporter.cc:604 msgid "Exporting to PDF..." msgstr "Exporter au format PDF..." #: ../gtk/src/hocr/HOCRPdfExporter.cc:619 ../qt/src/hocr/HOCRPdfExporter.cc:609 msgid "The PDF export failed: %1." msgstr "L'exportation PDF a échoué : %1." #: ../gtk/src/hocr/HOCRPdfExporter.cc:673 ../qt/src/hocr/HOCRPdfExporter.cc:662 msgid "The PDF library could not load the font '%1'." msgstr "La bibliothèque PDF ne supporte pas la police sélectionnée '%1'." #: ../gtk/src/hocr/HOCRTextExporter.cc:37 ../gtk/src/OutputEditorText.cc:274 #: ../qt/src/hocr/HOCRTextExporter.cc:39 ../qt/src/OutputEditorText.cc:239 msgid "Text Files" msgstr "Fichiers texte" #: ../gtk/src/hocr/HOCRTextExporter.cc:38 ../qt/src/hocr/HOCRTextExporter.cc:39 msgid "Save Text Output..." msgstr "Enregistrer la sortie de texte..." #: ../gtk/src/hocr/HOCRTextExporter.cc:46 ../qt/src/hocr/HOCRTextExporter.cc:47 msgid "The text export failed: unable to write output file." msgstr "" "L'exportation de texte a échoué: impossible d'écrire le fichier de sortie." #: ../gtk/src/hocr/OutputEditorHOCR.cc:269 #: ../qt/src/hocr/OutputEditorHOCR.cc:230 msgid "Block" msgstr "Bloc" #: ../gtk/src/hocr/OutputEditorHOCR.cc:275 #: ../qt/src/hocr/OutputEditorHOCR.cc:232 msgid "Line" msgstr "Ligne" #: ../gtk/src/hocr/OutputEditorHOCR.cc:278 #: ../qt/src/hocr/OutputEditorHOCR.cc:233 msgid "Word" msgstr "Mot" #: ../gtk/src/hocr/OutputEditorHOCR.cc:281 #: ../qt/src/hocr/OutputEditorHOCR.cc:234 msgid "Misspelled word" msgstr "Mot mal orthographié" #: ../gtk/src/hocr/OutputEditorHOCR.cc:435 #: ../qt/src/hocr/OutputEditorHOCR.cc:317 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/hocr/OutputEditorHOCR.cc:436 #: ../qt/src/hocr/OutputEditorHOCR.cc:318 msgid "Recognition errors" msgstr "Erreurs de reconnaissance" #: ../gtk/src/hocr/OutputEditorHOCR.cc:594 #: ../qt/src/hocr/OutputEditorHOCR.cc:500 #: ../qt/src/hocr/OutputEditorHOCR.cc:512 msgid "Multiple values" msgstr "Plusieurs valeurs" #. Merging allowed #: ../gtk/src/hocr/OutputEditorHOCR.cc:778 #: ../qt/src/hocr/OutputEditorHOCR.cc:641 msgid "Merge" msgstr "Fusionner" #: ../gtk/src/hocr/OutputEditorHOCR.cc:786 #: ../gtk/src/hocr/OutputEditorHOCR.cc:877 #: ../qt/src/hocr/OutputEditorHOCR.cc:643 #: ../qt/src/hocr/OutputEditorHOCR.cc:725 msgid "Split from parent" msgstr "Séparé du parent" #. Swapping allowed #: ../gtk/src/hocr/OutputEditorHOCR.cc:797 #: ../qt/src/hocr/OutputEditorHOCR.cc:647 msgid "Swap" msgstr "Échanger" #: ../gtk/src/hocr/OutputEditorHOCR.cc:821 #: ../qt/src/hocr/OutputEditorHOCR.cc:693 msgid "Add graphic region" msgstr "Ajouter région graphique" #: ../gtk/src/hocr/OutputEditorHOCR.cc:824 #: ../qt/src/hocr/OutputEditorHOCR.cc:694 msgid "Add text block" msgstr "Ajouter un bloc de texte" #: ../gtk/src/hocr/OutputEditorHOCR.cc:828 #: ../qt/src/hocr/OutputEditorHOCR.cc:696 msgid "Add paragraph" msgstr "Ajouter un paragraphe" #: ../gtk/src/hocr/OutputEditorHOCR.cc:832 #: ../qt/src/hocr/OutputEditorHOCR.cc:698 msgid "Add line" msgstr "Ajouter une ligne" #: ../gtk/src/hocr/OutputEditorHOCR.cc:836 #: ../qt/src/hocr/OutputEditorHOCR.cc:700 msgid "Add word" msgstr "Ajouter un mot" #: ../gtk/src/hocr/OutputEditorHOCR.cc:852 #: ../qt/src/hocr/OutputEditorHOCR.cc:710 msgid "No suggestions" msgstr "Pas de suggestions" #: ../gtk/src/hocr/OutputEditorHOCR.cc:858 #: ../qt/src/hocr/OutputEditorHOCR.cc:714 msgid "Add to dictionary" msgstr "Ajouter au dictionnaire" #: ../gtk/src/hocr/OutputEditorHOCR.cc:864 #: ../qt/src/hocr/OutputEditorHOCR.cc:716 msgid "Ignore word" msgstr "Ignorer mot" #: ../gtk/src/hocr/OutputEditorHOCR.cc:926 #: ../gtk/src/hocr/OutputEditorHOCR.cc:965 #: ../qt/src/hocr/OutputEditorHOCR.cc:795 #: ../qt/src/hocr/OutputEditorHOCR.cc:832 msgid "hOCR HTML Files" msgstr "Fichiers HTML hOCR" #: ../gtk/src/hocr/OutputEditorHOCR.cc:927 #: ../qt/src/hocr/OutputEditorHOCR.cc:795 msgid "Open hOCR File" msgstr "Ouvrir fichier hOCR" #: ../gtk/src/hocr/OutputEditorHOCR.cc:936 #: ../qt/src/hocr/OutputEditorHOCR.cc:802 msgid "Failed to open file" msgstr "Impossible ouvrir le fichier" #: ../gtk/src/hocr/OutputEditorHOCR.cc:936 #: ../qt/src/hocr/OutputEditorHOCR.cc:802 msgid "The file could not be opened: %1." msgstr "Le fichier n'a pas pu être ouvert: %1." #: ../gtk/src/hocr/OutputEditorHOCR.cc:945 #: ../qt/src/hocr/OutputEditorHOCR.cc:809 msgid "Invalid hOCR file" msgstr "Fichier hOCR invalide" #: ../gtk/src/hocr/OutputEditorHOCR.cc:945 #: ../qt/src/hocr/OutputEditorHOCR.cc:809 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/hocr/OutputEditorHOCR.cc:966 #: ../qt/src/hocr/OutputEditorHOCR.cc:832 msgid "Save hOCR Output..." msgstr "Enregistrer output hOCR..." #: ../gtk/src/hocr/OutputEditorHOCR.cc:973 ../gtk/src/OutputEditorText.cc:282 #: ../qt/src/hocr/OutputEditorHOCR.cc:839 ../qt/src/OutputEditorText.cc:246 msgid "Failed to save output" msgstr "Échec de l'enregistrement de la reconnaissance" #: ../gtk/src/hocr/OutputEditorHOCR.cc:973 ../gtk/src/OutputEditorText.cc:282 #: ../qt/src/hocr/OutputEditorHOCR.cc:839 ../qt/src/OutputEditorText.cc:246 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/hocr/OutputEditorHOCR.cc:1035 ../gtk/src/OutputEditorText.cc:296 #: ../qt/src/hocr/OutputEditorHOCR.cc:894 ../qt/src/OutputEditorText.cc:259 msgid "Output not saved" msgstr "Reconnaissance non enregistrée" #: ../gtk/src/hocr/OutputEditorHOCR.cc:1035 ../gtk/src/OutputEditorText.cc:296 #: ../qt/src/hocr/OutputEditorHOCR.cc:894 ../qt/src/OutputEditorText.cc:259 msgid "Save output before proceeding?" msgstr "Enregistrer la reconnaissance avant de continuer ?" #: ../gtk/src/hocr/OutputEditorHOCR.cc:1156 ../gtk/src/OutputEditorText.cc:184 #: ../qt/src/hocr/OutputEditorHOCR.cc:991 ../qt/src/OutputEditorText.cc:152 msgid "Replacing..." msgstr "Remplacement en cours..." #: ../gtk/src/hocr/OutputEditorHOCR.cc:1181 ../gtk/src/OutputEditorText.cc:192 #: ../qt/src/hocr/OutputEditorHOCR.cc:1014 ../qt/src/OutputEditorText.cc:160 msgid "Applying substitutions..." msgstr "Application les substitutions..." #: ../gtk/src/MainWindow.cc:131 ../qt/src/MainWindow.cc:295 msgid "Using tesseract" msgstr "Compilé avec tesseract" #: ../gtk/src/MainWindow.cc:178 ../qt/src/MainWindow.cc:194 msgid "Select an image to begin..." msgstr "Ouvrir une image pour commencer..." #: ../gtk/src/MainWindow.cc:293 ../qt/src/MainWindow.cc:278 msgid "Multiple sources" msgstr "Plusieurs sources" #: ../gtk/src/MainWindow.cc:295 ../qt/src/MainWindow.cc:280 msgid "Ready" msgstr "Prêt" #: ../gtk/src/MainWindow.cc:442 ../qt/src/MainWindow.cc:423 msgid "New version" msgstr "Nouvelle version" #: ../gtk/src/MainWindow.cc:442 ../qt/src/MainWindow.cc:423 msgid "gImageReader %1 is available" msgstr "gImageReader %1 est disponible" #: ../gtk/src/MainWindow.cc:443 ../qt/src/MainWindow.cc:424 msgid "Download" msgstr "Télécharger" #: ../gtk/src/MainWindow.cc:444 ../qt/src/MainWindow.cc:425 msgid "Changelog" msgstr "Nouvelles" #: ../gtk/src/MainWindow.cc:445 ../qt/src/MainWindow.cc:426 msgid "Don't notify again" msgstr "Ne plus demander" #: ../gtk/src/MainWindow.cc:466 ../qt/src/MainWindow.cc:474 msgid "Don't show again" msgstr "Ne plus demander" #: ../gtk/src/MainWindow.cc:467 ../gtk/src/MainWindow.cc:480 #: ../qt/src/MainWindow.cc:475 msgid "Install" msgstr "Installer" #: ../gtk/src/MainWindow.cc:487 ../qt/src/MainWindow.cc:487 msgid "Spelling dictionary missing" msgstr "Dictionnaire manquant" #: ../gtk/src/MainWindow.cc:487 ../qt/src/MainWindow.cc:487 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:494 ../gtk/src/MainWindow.cc:523 #: ../qt/src/MainWindow.cc:493 msgid "Installing spelling dictionary for '%1'" msgstr "Installation de dictionnaire de vérification orthographique pour '%1'" #: ../gtk/src/MainWindow.cc:515 ../gtk/src/MainWindow.cc:536 #: ../gtk/src/MainWindow.cc:544 ../gtk/src/MainWindow.cc:592 #: ../gtk/src/MainWindow.cc:597 ../gtk/src/TessdataManager.cc:60 #: ../gtk/src/TessdataManager.cc:70 ../gtk/src/TessdataManager.cc:339 #: ../qt/src/MainWindow.cc:512 ../qt/src/MainWindow.cc:525 #: ../qt/src/MainWindow.cc:534 ../qt/src/MainWindow.cc:578 #: ../qt/src/MainWindow.cc:583 ../qt/src/TessdataManager.cc:74 #: ../qt/src/TessdataManager.cc:84 ../qt/src/TessdataManager.cc:315 msgid "Error" msgstr "Erreur" #: ../gtk/src/MainWindow.cc:515 ../qt/src/MainWindow.cc:512 msgid "Failed to install spelling dictionary: %1" msgstr "" "Impossible d'installer le dictionnaire de vérification orthographique: %1" #: ../gtk/src/MainWindow.cc:536 ../qt/src/MainWindow.cc:525 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:544 ../qt/src/MainWindow.cc:534 msgid "Could not read %1: %2." msgstr "Impossible lire %1: %2." #: ../gtk/src/MainWindow.cc:571 ../qt/src/MainWindow.cc:558 msgid "Downloading '%1'..." msgstr "Téléchargement de '%1'..." #: ../gtk/src/MainWindow.cc:592 ../qt/src/MainWindow.cc:578 msgid "" "The following dictionaries could not be downloaded:\n" "%1\n" "\n" "Check the connectivity and directory permissions.\n" "Hint: If you don't have write permissions in system folders, you can switch " "to user paths in the settings dialog." 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.\n" "\n" "Remarque: Si vous n'avez pas les droits d'écriture dans les dossiers " "système, vous pouvez passer aux chemins du utilisateur dans le dialogue des " "préférences." #: ../gtk/src/MainWindow.cc:595 ../qt/src/MainWindow.cc:581 msgid "Dictionaries installed" msgstr "Dictionnaires orthographiques installés" #: ../gtk/src/MainWindow.cc:595 msgid "" "The following dictionaries were installed:\n" "%1" msgstr "" "Les dictionnaires suivants ont été installés:\n" "%1" #: ../gtk/src/MainWindow.cc:597 ../qt/src/MainWindow.cc:583 msgid "No spelling dictionaries found for '%1'." msgstr "Pas de dictionnaires orthographiques trouvés pour '%1'." #: ../gtk/src/OutputEditorText.cc:154 ../qt/src/OutputEditorText.cc:137 msgid "Stripping line breaks..." msgstr "Supprimer les sauts de ligne" #: ../gtk/src/OutputEditorText.cc:162 msgid "Check spelling" msgstr "Vérifier l'orthographe" #: ../gtk/src/OutputEditorText.cc:231 ../qt/src/OutputEditorText.cc:196 msgid "File: %1" msgstr "Fichier: %1" #: ../gtk/src/OutputEditorText.cc:234 ../qt/src/OutputEditorText.cc:199 msgid "Page: %1" msgstr "Page: %1" #: ../gtk/src/OutputEditorText.cc:247 ../gtk/src/Recognizer.cc:471 #: ../qt/src/Recognizer.cc:462 msgid "" "\n" "[Failed to recognize page %1]\n" msgstr "" "\n" "[Echec de reconnaissance page %1]\n" #: ../gtk/src/OutputEditorText.cc:275 ../qt/src/OutputEditorText.cc:239 msgid "Save Output..." msgstr "Enregistrer la reconnaissance..." #: ../gtk/src/Recognizer.cc:179 ../qt/src/Recognizer.cc:172 msgid "No languages available" msgstr "Aucune langue disponible" #: ../gtk/src/Recognizer.cc:179 ../qt/src/Recognizer.cc:172 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:233 ../qt/src/Recognizer.cc:232 msgid "Multilingual" msgstr "Multilingue" #: ../gtk/src/Recognizer.cc:285 ../qt/src/Recognizer.cc:277 msgid "Automatic page segmentation" msgstr "Segmentation automatique des pages" #: ../gtk/src/Recognizer.cc:286 ../qt/src/Recognizer.cc:278 msgid "Page segmentation with orientation and script detection" msgstr "Segmentation des pages avec détection de orientation et de script" #: ../gtk/src/Recognizer.cc:287 ../qt/src/Recognizer.cc:279 msgid "Assume single column of text" msgstr "Supposer une seule colonne de texte" #: ../gtk/src/Recognizer.cc:288 ../qt/src/Recognizer.cc:280 msgid "Assume single block of vertically aligned text" msgstr "Supposer un seul bloc de texte aligné verticalement" #: ../gtk/src/Recognizer.cc:289 ../qt/src/Recognizer.cc:281 msgid "Assume a single uniform block of text" msgstr "Supposer un seul bloc de texte uniforme" #: ../gtk/src/Recognizer.cc:290 ../qt/src/Recognizer.cc:282 msgid "Assume a line of text" msgstr "Supposer une ligne de texte" #: ../gtk/src/Recognizer.cc:291 ../qt/src/Recognizer.cc:283 msgid "Assume a single word" msgstr "Supposer un seul mot" #: ../gtk/src/Recognizer.cc:292 ../qt/src/Recognizer.cc:284 msgid "Assume a single word in a circle" msgstr "Supposer un seul mot dans un cercle" #: ../gtk/src/Recognizer.cc:293 ../qt/src/Recognizer.cc:285 msgid "Sparse text in no particular order" msgstr "Texte distribué sans ordre particulier" #: ../gtk/src/Recognizer.cc:294 ../qt/src/Recognizer.cc:286 msgid "Sparse text with orientation and script detection" msgstr "Texte distribué avec détection de orientation et de script" #: ../gtk/src/Recognizer.cc:309 ../qt/src/Recognizer.cc:297 msgid "Page segmentation mode" msgstr "Mode de segmentation des pages" #: ../gtk/src/Recognizer.cc:313 ../qt/src/Recognizer.cc:300 msgid "Character whitelist / blacklist..." msgstr "Whitelist / blacklist des caractères..." #: ../gtk/src/Recognizer.cc:319 ../qt/src/Recognizer.cc:305 msgid "Manage languages..." msgstr "Gérer langues..." #: ../gtk/src/Recognizer.cc:375 ../qt/src/Recognizer.cc:369 msgid "Current selection" msgstr "Sélection courante" #: ../gtk/src/Recognizer.cc:465 ../qt/src/Recognizer.cc:455 msgid "Recognizing page %1 (%2 of %3)" msgstr "Reconnaissance page %1 (%2 de %3)" #: ../gtk/src/Recognizer.cc:470 ../qt/src/Recognizer.cc:461 msgid "" "\n" "- Page %1: failed to render page" msgstr "" "\n" "- Page %1: erreur de rendering" #: ../gtk/src/Recognizer.cc:501 ../gtk/src/Recognizer.cc:531 #: ../gtk/src/Recognizer.cc:544 ../qt/src/Recognizer.cc:491 #: ../qt/src/Recognizer.cc:521 ../qt/src/Recognizer.cc:534 msgid "Recognizing..." msgstr "Reconnaissance en cours..." #: ../gtk/src/Recognizer.cc:505 ../gtk/src/Recognizer.cc:514 #: ../qt/src/Recognizer.cc:495 ../qt/src/Recognizer.cc:504 msgid "Recognition errors occurred" msgstr "Des erreurs de reconnaissances sont apparues" #: ../gtk/src/Recognizer.cc:505 ../qt/src/Recognizer.cc:495 msgid "The following errors occurred:%1" msgstr "Les erreurs suivantes sont survenues:%1" #: ../gtk/src/Recognizer.cc:514 ../qt/src/Recognizer.cc:504 msgid "Failed to initialize tesseract" msgstr "Échec de démarrage de tesseract" #: ../gtk/src/scanner/ScannerSane.cc:84 ../gtk/src/scanner/ScannerTwain.cc:288 #: ../qt/src/scanner/ScannerSane.cc:85 ../qt/src/scanner/ScannerTwain.cc:286 msgid "Scan canceled" msgstr "Scan annulé" #: ../gtk/src/scanner/ScannerSane.cc:159 ../gtk/src/scanner/ScannerTwain.cc:186 #: ../qt/src/scanner/ScannerSane.cc:159 ../qt/src/scanner/ScannerTwain.cc:178 msgid "No scanner specified" msgstr "Aucun scanner spécifié" #: ../gtk/src/scanner/ScannerSane.cc:168 ../gtk/src/scanner/ScannerTwain.cc:195 #: ../qt/src/scanner/ScannerSane.cc:168 ../qt/src/scanner/ScannerTwain.cc:187 msgid "Unable to connect to scanner" msgstr "Impossible de se connecter au scanner" #: ../gtk/src/scanner/ScannerSane.cc:403 ../gtk/src/scanner/ScannerTwain.cc:266 #: ../gtk/src/scanner/ScannerTwain.cc:292 ../qt/src/scanner/ScannerSane.cc:403 #: ../qt/src/scanner/ScannerTwain.cc:258 ../qt/src/scanner/ScannerTwain.cc:290 msgid "Unable to start scan" msgstr "Impossible de commencer le scan" #: ../gtk/src/scanner/ScannerSane.cc:411 ../gtk/src/scanner/ScannerSane.cc:461 #: ../gtk/src/scanner/ScannerTwain.cc:318 ../qt/src/scanner/ScannerSane.cc:411 #: ../qt/src/scanner/ScannerSane.cc:461 ../qt/src/scanner/ScannerTwain.cc:316 msgid "Error communicating with scanner" msgstr "Impossible de communiquer avec le scanner" #: ../gtk/src/scanner/ScannerSane.cc:520 ../qt/src/scanner/ScannerSane.cc:517 msgid "Failed to save image" msgstr "Impossible d'enregistrer l'image" #: ../gtk/src/scanner/ScannerSane.cc:800 ../qt/src/scanner/ScannerSane.cc:797 msgid "Operation is cancelled." msgstr "L'opération est annulée." #: ../gtk/src/scanner/ScannerSane.cc:802 ../qt/src/scanner/ScannerSane.cc:799 msgid "Device is busy." msgstr "L'appareil est occupé." #: ../gtk/src/scanner/ScannerSane.cc:804 ../qt/src/scanner/ScannerSane.cc:801 msgid "Cover is opened." msgstr "Le capot est ouvert." #: ../gtk/src/scanner/ScannerSane.cc:806 ../qt/src/scanner/ScannerSane.cc:803 msgid "Document feeder jammed." msgstr "Le chargeur de documents est bloqué." #: ../gtk/src/scanner/ScannerSane.cc:808 ../qt/src/scanner/ScannerSane.cc:805 msgid "Document feeder out of documents." msgstr "Il n'y a plus de documents dans le chargeur de documents." #: ../gtk/src/scanner/ScannerSane.cc:810 ../qt/src/scanner/ScannerSane.cc:807 msgid "Access to scanner is denied." msgstr "L'accès au scanner est refusé." #: ../gtk/src/SourceManager.cc:118 ../qt/src/SourceManager.cc:124 msgid "PDFs with text" msgstr "PDF avec texte" #: ../gtk/src/SourceManager.cc:118 ../qt/src/SourceManager.cc:124 msgid "" "These PDF files already contain text:\n" "%1" msgstr "" "Ces fichiers PDF contiennent déjà du texte:\n" "%1" #: ../gtk/src/SourceManager.cc:127 ../qt/src/SourceManager.cc:132 msgid "Unable to open files" msgstr "Impossible d'ouvrir les fichiers" #: ../gtk/src/SourceManager.cc:127 ../qt/src/SourceManager.cc:132 msgid "The following files could not be opened:%1" msgstr "Les fichiers suivants n'ont pas pu être ouvert:%1" #: ../gtk/src/SourceManager.cc:141 ../qt/src/SourceManager.cc:143 msgid "Enter password for file '%1':" msgstr "Entrer le mot de passe pour le fichier '%1':" #: ../gtk/src/SourceManager.cc:197 ../qt/src/SourceManager.cc:214 msgid "Images and PDFs" msgstr "Images et PDFs" #: ../gtk/src/SourceManager.cc:202 ../qt/src/SourceManager.cc:215 msgid "Select Files" msgstr "Choisir fichiers" #: ../gtk/src/SourceManager.cc:208 ../qt/src/SourceManager.cc:226 msgid "Clipboard Error" msgstr "Erreur de presse-papiers" #: ../gtk/src/SourceManager.cc:208 ../qt/src/SourceManager.cc:226 msgid "Failed to read the clipboard." msgstr "Impossible de lire le presse-papiers." #: ../gtk/src/SourceManager.cc:212 ../qt/src/SourceManager.cc:230 #: ../qt/src/SourceManager.cc:236 msgid "Pasted %1" msgstr "Collée %1" #: ../gtk/src/SourceManager.cc:224 ../qt/src/SourceManager.cc:243 msgid "Screenshot Error" msgstr "Échec de la capture d'écran" #: ../gtk/src/SourceManager.cc:224 ../qt/src/SourceManager.cc:243 msgid "Failed to take screenshot." msgstr "Échec de la capture d'écran." #: ../gtk/src/SourceManager.cc:228 ../qt/src/SourceManager.cc:247 msgid "Screenshot %1" msgstr "Capture d'écran %1" #: ../gtk/src/SourceManager.cc:233 ../qt/src/SourceManager.cc:252 msgid "Saving image..." msgstr "Enregistrement de l'image..." #: ../gtk/src/SourceManager.cc:240 ../qt/src/SourceManager.cc:265 msgid "Cannot Write File" msgstr "Impossible écrire fichier" #: ../gtk/src/SourceManager.cc:240 ../qt/src/SourceManager.cc:265 msgid "Could not write to %1." msgstr "Impossible écrire à %1." #: ../gtk/src/SourceManager.cc:267 ../qt/src/SourceManager.cc:287 msgid "Delete File?" msgstr "Supprimer fichier ?" #: ../gtk/src/SourceManager.cc:267 ../qt/src/SourceManager.cc:287 msgid "The following files will be deleted:%1" msgstr "Les fichiers suivant seront supprimés:%1" #: ../gtk/src/SourceManager.cc:332 ../qt/src/SourceManager.cc:338 msgid "Missing File" msgstr "Fichier manquant" #: ../gtk/src/SourceManager.cc:332 ../qt/src/SourceManager.cc:338 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:33 ../qt/src/SubstitutionsManager.cc:73 msgid "Search for" msgstr "Rechercher" #: ../gtk/src/SubstitutionsManager.cc:34 ../qt/src/SubstitutionsManager.cc:73 msgid "Replace with" msgstr "Remplacer par" #: ../gtk/src/SubstitutionsManager.cc:69 ../gtk/src/SubstitutionsManager.cc:103 #: ../qt/src/SubstitutionsManager.cc:106 ../qt/src/SubstitutionsManager.cc:143 msgid "Substitutions List" msgstr "Liste substitutions" #: ../gtk/src/SubstitutionsManager.cc:70 ../qt/src/SubstitutionsManager.cc:106 msgid "Open Substitutions List" msgstr "Ouvrir liste de substitutions" #: ../gtk/src/SubstitutionsManager.cc:75 ../qt/src/SubstitutionsManager.cc:112 msgid "Error Reading File" msgstr "Impossible lire le fichier" #: ../gtk/src/SubstitutionsManager.cc:75 ../qt/src/SubstitutionsManager.cc:112 msgid "Unable to read '%1'." msgstr "Impossible de lire '%1'." #: ../gtk/src/SubstitutionsManager.cc:97 ../qt/src/SubstitutionsManager.cc:137 msgid "Errors Occurred Reading File" msgstr "Des erreurs sont survenues" #: ../gtk/src/SubstitutionsManager.cc:97 ../qt/src/SubstitutionsManager.cc:137 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:104 ../qt/src/SubstitutionsManager.cc:143 msgid "Save Substitutions List" msgstr "Enregistrer liste de substitutions" #: ../gtk/src/SubstitutionsManager.cc:110 ../qt/src/SubstitutionsManager.cc:149 msgid "Error Saving File" msgstr "Impossible d'enregistrer le fichier" #: ../gtk/src/SubstitutionsManager.cc:110 ../qt/src/SubstitutionsManager.cc:149 msgid "Unable to write to '%1'." msgstr "Impossible d'enregistrer '%1'." #: ../gtk/src/SubstitutionsManager.cc:127 ../qt/src/SubstitutionsManager.cc:162 msgid "Save List?" msgstr "Enregistrer la liste ?" #: ../gtk/src/SubstitutionsManager.cc:127 ../qt/src/SubstitutionsManager.cc:162 msgid "Do you want to save the current list?" msgstr "Voulez-vous enregistrer la liste actuelle ?" #: ../gtk/src/TessdataManager.cc:60 ../qt/src/TessdataManager.cc:74 #, fuzzy msgid "" "A session connection to the PackageKit backend is required for managing " "system-wide tesseract language packs, but it was not found. This service is " "usually provided by a software-management application such as Gnome " "Software. Please install software which provides the necessary PackageKit " "interface, use other system package management software to manage the " "tesseract language packs directly, or switch to using 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:65 ../qt/src/TessdataManager.cc:79 msgid "Fetching available languages" msgstr "Téléchargement de la liste des langues disponibles" #: ../gtk/src/TessdataManager.cc:70 ../gtk/src/TessdataManager.cc:96 #: ../gtk/src/TessdataManager.cc:197 ../qt/src/TessdataManager.cc:84 #: ../qt/src/TessdataManager.cc:101 ../qt/src/TessdataManager.cc:197 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:104 ../qt/src/TessdataManager.cc:113 #: ../qt/src/TessdataManager.cc:122 msgid "Parsing error: %1" msgstr "Erreur syntaxique: %1" #: ../gtk/src/TessdataManager.cc:235 ../qt/src/TessdataManager.cc:232 msgid "Applying changes..." msgstr "Application des modifications..." #: ../gtk/src/TessdataManager.cc:297 ../qt/src/TessdataManager.cc:278 msgid "Failed to create directory for tessdata files." msgstr "Impossible de créer le répertoire pour les fichiers tessdata." #: ../gtk/src/TessdataManager.cc:306 ../qt/src/TessdataManager.cc:287 msgid "Downloading %1..." msgstr "Téléchargement de %1..." #: ../gtk/src/TessdataManager.cc:330 msgid "" "The following files could not be downloaded or removed:\n" "%1\n" "\n" "Check the connectivity and directory permissions.\n" "\n" "Hint: If you don't have write permissions in system folders, you can switch " "to user paths in the settings dialog." 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.\n" "\n" "Remarque: Si vous n'avez pas les droits d'écriture dans les dossiers " "système, vous pouvez passer aux chemins du utilisateur dans le dialogue des " "préférences." #: ../gtk/src/Utils.cc:64 msgid "Yes" msgstr "Oui" #: ../gtk/src/Utils.cc:67 msgid "No" msgstr "Non" #: ../gtk/src/Utils.cc:76 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/CrashHandler.ui.h:3 msgid "" "

Tesseract has " "aborted

Tesseract (the OCR engine) has aborted while " "recognizing text. This may occur if the used traineddatas are corrupt or " "incomplatible with the version of tesseract in use, or due to a bug in " "tesseract.

The stacktrace below may provide additional information " "about where the crash occured.

" msgstr "" "

Tesseract a avorté

Tesseract (le moteur d'OCR) a avorté pendant la reconnaissance " "de texte. Cela peut se produire si les données traineddata utilisées sont " "corrompues ou incompatibles avec la version de tesseract utilisée, ou en " "raison d'un bug dans tesseract.

Le stacktrace ci-dessous peut fournir " "des informations supplémentaires sur l'endroit où le crash s'est produit." #: ../qt/data/MainWindow.ui.h:17 msgid "Flatbed" msgstr "Flatbed" #: ../qt/data/MainWindow.ui.h:18 msgid "ADF Front" msgstr "ADF face avant" #: ../qt/data/MainWindow.ui.h:19 msgid "ADF Back" msgstr "ADF partie arrière" #: ../qt/data/MainWindow.ui.h:20 msgid "ADF Duplex" msgstr "ADF duplex" #. Remove & from some labels which designer insists in adding #: ../qt/data/MainWindow.ui.h:21 ../qt/src/Ui_MainWindow.hh:50 msgid "Sources" msgstr "Sources" #: ../qt/data/MainWindow.ui.h:22 msgid "Zoom In" msgstr "Zoom Avant" #: ../qt/data/MainWindow.ui.h:24 msgid "Zoom Out" msgstr "Zoom Arrière" #: ../qt/data/MainWindow.ui.h:26 msgid "Normal Size" msgstr "Taille Normale" #: ../qt/data/MainWindow.ui.h:28 msgid "Best Fit" msgstr "Ajuster à la page" #: ../qt/data/MainWindow.ui.h:30 msgid "Rotate Left" msgstr "Tourner à dans le sens anti-horaire" #: ../qt/data/MainWindow.ui.h:31 msgid "Rotate left" msgstr "Tourner à dans le sens anti-horaire" #: ../qt/data/MainWindow.ui.h:32 msgid "Rotate Right" msgstr "Tourner dans le sens horaire" #: ../qt/data/MainWindow.ui.h:33 msgid "Rotate right" msgstr "Tourner dans le sens horaire" #: ../qt/data/MainWindow.ui.h:34 msgid "Image Controls" msgstr "Régler les paramètres de l'image" #: ../qt/data/MainWindow.ui.h:36 msgid "Autodetect Layout" msgstr "Détecter la mise en page" #: ../qt/data/MainWindow.ui.h:38 msgid "Toggle Output Pane" msgstr "Montrer / cacher le panneau de reconnaissance" #: ../qt/data/PdfExportDialog.ui.h:5 msgid "Backend:" msgstr "Backend:" #: ../qt/data/PdfExportDialog.ui.h:8 msgid "Portrait" msgstr "Portrait" #: ../qt/data/PdfExportDialog.ui.h:9 msgid "Landscape" msgstr "Paysage" #: ../qt/src/hocr/HOCRPdfExporter.cc:142 msgid "Failed to write to file" msgstr "Impossible écrire le fichier" #. Output toolbar #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:55 #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:56 msgid "Open hOCR file" msgstr "Ouvrir fichier hOCR" #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:57 #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:58 msgid "Save as hOCR text" msgstr "Enregistrer sous forme de texte hOCR" #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:79 #: ../qt/src/Ui_OutputEditorText.hh:106 msgid "Find and Replace" msgstr "Trouver et remplacer" #: ../qt/src/MainWindow.cc:581 msgid "" "The following dictionary files were installed:\n" "%1" msgstr "" "Les dictionnaires suivants ont été installés:\n" "%1" #: ../qt/src/TessdataManager.cc:308 msgid "" "The following files could not be downloaded or removed:\n" "%1\n" "\n" "Check the connectivity and directory permissions.\n" "Hint: If you don't have write permissions in system folders, you can switch " "to user paths in the settings dialog." 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.\n" "Note: si vous n'avez pas les droits d'écriture dans les dossiers système, " "vous pouvez passer aux chemins d'accès utilisateur dans la boîte de dialogue " "des paramètres.\n" "Remarque: Si vous n'avez pas les droits d'écriture dans les dossiers " "système, vous pouvez passer aux chemins du utilisateur dans le dialogue des " "préférences." #: ../qt/src/Ui_MainWindow.hh:51 msgid "Output" msgstr "Reconnaissance" #: ../qt/src/Ui_MainWindow.hh:135 msgid "OCR mode:" msgstr "Modalité OCR:" #: ../qt/src/Ui_MainWindow.hh:209 msgid "Remove Image" msgstr "Supprimer l'image de la liste" #: ../qt/src/Ui_MainWindow.hh:212 msgid "Delete Image" msgstr "Supprimer image" #: ../qt/src/Ui_MainWindow.hh:215 msgid "Clear List" msgstr "Vider liste" #: ../qt/src/Ui_OutputEditorText.hh:101 msgid "Strip Line Breaks" msgstr "Supprimer sauts de ligne" #: ../qt/src/Ui_OutputEditorText.hh:115 msgid "Save Output" msgstr "Enregistrer la reconnaissance" #: ../qt/src/Ui_OutputEditorText.hh:117 msgid "Clear Output" msgstr "Supprimer la reconnaissance" #~ msgid "The application has crashed" #~ msgstr "L'application a cessé de fonctionner" #~ 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%." #~ msgid "Could not read %1: %2" #~ msgstr "Impossible lire %1: %2" #~ msgid "gImageReader" #~ msgstr "gImageReader" #~ 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 "Document font:" #~ msgstr "Police:" #~ msgid "Scale:" #~ msgstr "Echelle:" #~ msgid "Document" #~ msgstr "Document" #~ msgid "Errors occurred" #~ msgstr "Des erreurs sont apparues" #~ msgid "" #~ "The following pages could not be rendered:\n" #~ "%1" #~ msgstr "" #~ "Les pages suivantes n'ont pas pu être lues:\n" #~ "%1" #~ msgid "substitution_list.txt" #~ msgstr "liste_substitutions.txt" #~ 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.3.1/po/gimagereader.pot000066400000000000000000001506641351740627400176350ustar00rootroot00000000000000# 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: 2019-07-25 23:18+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" #: ../data/gimagereader.desktop.in.h:1 msgid "OCR application" msgstr "" #: ../gtk/data/appmenu.ui.h:1 ../qt/src/Ui_MainWindow.hh:167 msgid "Redetect Languages" msgstr "" #: ../gtk/data/appmenu.ui.h:2 ../qt/src/Ui_MainWindow.hh:170 msgid "Manage Languages" msgstr "" #: ../gtk/data/appmenu.ui.h:3 ../gtk/data/ConfigDialog.ui.h:1 #: ../qt/data/ConfigDialog.ui.h:1 ../qt/src/Ui_MainWindow.hh:173 msgid "Preferences" msgstr "" #: ../gtk/data/appmenu.ui.h:4 ../gtk/data/ConfigDialog.ui.h:2 #: ../gtk/src/MainWindow.cc:482 ../qt/src/MainWindow.cc:481 #: ../qt/src/Ui_MainWindow.hh:178 msgid "Help" msgstr "" #: ../gtk/data/appmenu.ui.h:5 ../qt/data/AboutDialog.ui.h:2 #: ../qt/src/Ui_MainWindow.hh:181 msgid "About" msgstr "" #: ../gtk/data/appmenu.ui.h:6 msgid "Quit" msgstr "" #: ../gtk/data/ConfigDialog.ui.h:3 ../gtk/data/MainWindow.ui.h:47 #: ../gtk/data/OutputEditorHOCR.ui.h:3 ../gtk/data/PdfExportDialog.ui.h:3 #: ../gtk/src/FileDialogs.cc:152 ../gtk/src/Utils.cc:61 #: ../qt/data/ConfigDialog.ui.h:26 msgid "OK" msgstr "" #: ../gtk/data/ConfigDialog.ui.h:4 msgid "Output pane orientation:" msgstr "" #: ../gtk/data/ConfigDialog.ui.h:5 msgid "Horizontal" msgstr "" #: ../gtk/data/ConfigDialog.ui.h:6 msgid "Vertical" msgstr "" #: ../gtk/data/ConfigDialog.ui.h:7 ../qt/data/ConfigDialog.ui.h:18 msgid "Query to install missing spellcheck dictionaries" msgstr "" #: ../gtk/data/ConfigDialog.ui.h:8 ../qt/data/ConfigDialog.ui.h:4 msgid "Automatically check for new program versions" msgstr "" #: ../gtk/data/ConfigDialog.ui.h:9 ../qt/data/ConfigDialog.ui.h:3 msgid "Predefined language definitions:" msgstr "" #: ../gtk/data/ConfigDialog.ui.h:10 ../qt/data/ConfigDialog.ui.h:12 msgid "Additional language definitions:" msgstr "" #: ../gtk/data/ConfigDialog.ui.h:11 ../qt/data/ConfigDialog.ui.h:20 msgid "The prefix of the tesseract language data file" msgstr "" #: ../gtk/data/ConfigDialog.ui.h:12 ../qt/data/ConfigDialog.ui.h:21 msgid "Prefix" msgstr "" #: ../gtk/data/ConfigDialog.ui.h:13 ../qt/data/ConfigDialog.ui.h:22 msgid "The ISO 639-1 language code followed by the country code" msgstr "" #: ../gtk/data/ConfigDialog.ui.h:14 ../qt/data/ConfigDialog.ui.h:23 msgid "ISO Code" msgstr "" #: ../gtk/data/ConfigDialog.ui.h:15 ../qt/data/ConfigDialog.ui.h:24 msgid "The name of the language" msgstr "" #: ../gtk/data/ConfigDialog.ui.h:16 ../qt/data/ConfigDialog.ui.h:25 msgid "Name" msgstr "" #: ../gtk/data/ConfigDialog.ui.h:17 ../gtk/data/MainWindow.ui.h:46 #: ../gtk/data/OutputEditorHOCR.ui.h:2 ../gtk/data/PdfExportDialog.ui.h:2 #: ../gtk/src/Acquirer.cc:34 ../gtk/src/FileDialogs.cc:151 #: ../gtk/src/Utils.cc:70 ../qt/data/ConfigDialog.ui.h:27 #: ../qt/data/MainWindow.ui.h:12 msgid "Cancel" msgstr "" #: ../gtk/data/ConfigDialog.ui.h:18 ../qt/data/ConfigDialog.ui.h:5 msgid "Output pane font:" msgstr "" #: ../gtk/data/ConfigDialog.ui.h:19 ../qt/data/ConfigDialog.ui.h:2 msgid "Default" msgstr "" #: ../gtk/data/ConfigDialog.ui.h:20 ../qt/data/ConfigDialog.ui.h:6 msgid "Language data locations:" msgstr "" #: ../gtk/data/ConfigDialog.ui.h:21 ../qt/data/ConfigDialog.ui.h:13 msgid "Language definitions path:" msgstr "" #: ../gtk/data/ConfigDialog.ui.h:22 ../qt/data/ConfigDialog.ui.h:28 msgid "Spelling dictionaries path:" msgstr "" #: ../gtk/data/ConfigDialog.ui.h:23 ../qt/data/ConfigDialog.ui.h:10 msgid "System-wide paths" msgstr "" #: ../gtk/data/ConfigDialog.ui.h:24 ../qt/data/ConfigDialog.ui.h:11 msgid "User paths" msgstr "" #: ../gtk/data/ConfigDialog.ui.h:25 ../qt/data/ConfigDialog.ui.h:29 msgid "Automatically open exported documents with default application" msgstr "" #: ../gtk/data/CrashHandler.ui.h:1 ../qt/src/CrashHandler.cc:38 msgid "Regenerate backtrace" msgstr "" #: ../gtk/data/CrashHandler.ui.h:3 #, no-c-format msgid "" "The application has crashed\n" "\n" "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/CrashHandler.ui.h:6 msgid "" "Tesseract has aborted\n" "\n" "Tesseract (the OCR engine) has aborted while recognizing text. This may " "occur if the used traineddatas are corrupt or incomplatible with the version " "of tesseract in use, or due to a bug in tesseract.\n" "\n" "The stacktrace below may provide additional information about where the " "crash occured.\n" msgstr "" #: ../gtk/data/MainWindow.ui.h:1 ../qt/data/MainWindow.ui.h:39 msgid "Toggle output pane" msgstr "" #: ../gtk/data/MainWindow.ui.h:2 ../qt/src/Ui_MainWindow.hh:66 msgid "Rotate current page" msgstr "" #: ../gtk/data/MainWindow.ui.h:3 ../qt/src/Ui_MainWindow.hh:67 msgid "Rotate all pages" msgstr "" #. Sources toolbar #: ../gtk/data/MainWindow.ui.h:4 ../qt/src/Ui_MainWindow.hh:192 msgid "Recent" msgstr "" #: ../gtk/data/MainWindow.ui.h:5 ../qt/src/Ui_MainWindow.hh:193 msgid "Paste" msgstr "" #: ../gtk/data/MainWindow.ui.h:6 ../qt/src/Ui_MainWindow.hh:194 msgid "Take Screenshot" msgstr "" #: ../gtk/data/MainWindow.ui.h:7 ../qt/data/MainWindow.ui.h:23 msgid "Zoom in" msgstr "" #: ../gtk/data/MainWindow.ui.h:8 ../qt/data/MainWindow.ui.h:25 msgid "Zoom out" msgstr "" #: ../gtk/data/MainWindow.ui.h:9 ../qt/data/MainWindow.ui.h:27 msgid "Normal size" msgstr "" #: ../gtk/data/MainWindow.ui.h:10 ../qt/data/MainWindow.ui.h:29 msgid "Best fit" msgstr "" #: ../gtk/data/MainWindow.ui.h:11 ../qt/src/Ui_MainWindow.hh:75 msgid "Select rotation mode" msgstr "" #: ../gtk/data/MainWindow.ui.h:12 ../gtk/data/OutputEditorText.ui.h:13 #: ../qt/src/Ui_OutputEditorText.hh:95 msgid "Select insert mode" msgstr "" #: ../gtk/data/MainWindow.ui.h:13 ../qt/src/Ui_MainWindow.hh:109 msgid "Select page" msgstr "" #: ../gtk/data/MainWindow.ui.h:14 ../qt/data/MainWindow.ui.h:35 msgid "Image controls" msgstr "" #: ../gtk/data/MainWindow.ui.h:15 ../qt/src/Ui_MainWindow.hh:139 msgid "Plain text" msgstr "" #: ../gtk/data/MainWindow.ui.h:16 ../qt/src/Ui_MainWindow.hh:139 msgid "hOCR, PDF" msgstr "" #: ../gtk/data/MainWindow.ui.h:17 ../qt/data/MainWindow.ui.h:37 msgid "Autodetect layout" msgstr "" #: ../gtk/data/MainWindow.ui.h:18 msgid "Recognize all" msgstr "" #: ../gtk/data/MainWindow.ui.h:19 msgid "Select language" msgstr "" #: ../gtk/data/MainWindow.ui.h:20 ../qt/src/Ui_MainWindow.hh:205 msgid "Add images" msgstr "" #: ../gtk/data/MainWindow.ui.h:21 ../qt/src/Ui_MainWindow.hh:204 msgid "Add Images" msgstr "" #: ../gtk/data/MainWindow.ui.h:22 ../qt/src/Ui_MainWindow.hh:210 msgid "Remove image from list" msgstr "" #: ../gtk/data/MainWindow.ui.h:23 ../qt/src/Ui_MainWindow.hh:213 msgid "Delete image" msgstr "" #: ../gtk/data/MainWindow.ui.h:24 ../qt/src/Ui_MainWindow.hh:216 msgid "Clear list" msgstr "" #: ../gtk/data/MainWindow.ui.h:25 ../qt/data/MainWindow.ui.h:5 msgid "Files" msgstr "" #: ../gtk/data/MainWindow.ui.h:26 ../qt/data/MainWindow.ui.h:8 msgid "Device:" msgstr "" #: ../gtk/data/MainWindow.ui.h:27 ../gtk/data/TessdataManager.ui.h:4 #: ../qt/data/MainWindow.ui.h:7 ../qt/src/TessdataManager.cc:59 msgid "Refresh" msgstr "" #: ../gtk/data/MainWindow.ui.h:28 ../qt/data/MainWindow.ui.h:9 msgid "Output:" msgstr "" #: ../gtk/data/MainWindow.ui.h:29 ../qt/data/MainWindow.ui.h:13 msgid "Mode:" msgstr "" #: ../gtk/data/MainWindow.ui.h:30 ../gtk/src/hocr/HOCRPdfExporter.cc:313 #: ../qt/data/MainWindow.ui.h:15 ../qt/src/hocr/HOCRPdfExporter.cc:347 msgid "Color" msgstr "" #: ../gtk/data/MainWindow.ui.h:31 ../gtk/src/hocr/HOCRPdfExporter.cc:316 #: ../qt/data/MainWindow.ui.h:14 ../qt/src/hocr/HOCRPdfExporter.cc:349 #: ../qt/src/hocr/HOCRPdfExporter.cc:351 msgid "Grayscale" msgstr "" #: ../gtk/data/MainWindow.ui.h:32 ../qt/data/MainWindow.ui.h:10 msgid "Resolution:" msgstr "" #: ../gtk/data/MainWindow.ui.h:33 ../qt/data/MainWindow.ui.h:11 msgid "Scan" msgstr "" #: ../gtk/data/MainWindow.ui.h:34 ../qt/data/MainWindow.ui.h:16 msgid "Source:" msgstr "" #: ../gtk/data/MainWindow.ui.h:35 ../qt/data/MainWindow.ui.h:6 msgid "Acquire" msgstr "" #: ../gtk/data/MainWindow.ui.h:36 ../qt/data/MainWindow.ui.h:1 msgid "Brightness" msgstr "" #: ../gtk/data/MainWindow.ui.h:37 ../qt/data/MainWindow.ui.h:2 msgid "Contrast" msgstr "" #: ../gtk/data/MainWindow.ui.h:38 ../qt/data/MainWindow.ui.h:3 msgid "Resolution" msgstr "" #: ../gtk/data/MainWindow.ui.h:39 ../qt/data/MainWindow.ui.h:4 msgid "Invert colors" msgstr "" #: ../gtk/data/MainWindow.ui.h:40 msgid "A graphical frontend to tesseract-ocr" msgstr "" #: ../gtk/data/MainWindow.ui.h:41 ../qt/data/CharacterListDialog.ui.h:1 msgid "Character whitelist / blacklist" msgstr "" #: ../gtk/data/MainWindow.ui.h:42 ../qt/data/CharacterListDialog.ui.h:2 msgid "Exclude these characters from being recognized (blacklist):" msgstr "" #: ../gtk/data/MainWindow.ui.h:43 ../qt/data/CharacterListDialog.ui.h:3 msgid "Enter a string of characters..." msgstr "" #: ../gtk/data/MainWindow.ui.h:44 ../qt/data/CharacterListDialog.ui.h:4 msgid "Only allow the following characters to be recognized (whitelist):" msgstr "" #: ../gtk/data/MainWindow.ui.h:45 ../qt/data/PageRangeDialog.ui.h:1 msgid "Page Range" msgstr "" #: ../gtk/data/MainWindow.ui.h:48 ../qt/data/PageRangeDialog.ui.h:2 msgid "Page range:" msgstr "" #: ../gtk/data/MainWindow.ui.h:49 ../qt/data/PageRangeDialog.ui.h:3 msgid "Example: 1-10, 13, 14-18" msgstr "" #: ../gtk/data/MainWindow.ui.h:50 ../qt/data/PageRangeDialog.ui.h:4 msgid "Recognition area:" msgstr "" #: ../gtk/data/MainWindow.ui.h:51 ../gtk/src/Recognizer.cc:375 #: ../qt/data/PageRangeDialog.ui.h:5 ../qt/src/Recognizer.cc:369 msgid "Entire page" msgstr "" #: ../gtk/data/MainWindow.ui.h:52 ../qt/data/PageRangeDialog.ui.h:6 msgid "Autodetect" msgstr "" #: ../gtk/data/MainWindow.ui.h:53 ../qt/data/PageRangeDialog.ui.h:7 msgid "Prepend to output text:" msgstr "" #: ../gtk/data/MainWindow.ui.h:54 ../qt/data/PageRangeDialog.ui.h:8 msgid "Source filename" msgstr "" #: ../gtk/data/MainWindow.ui.h:55 ../qt/data/PageRangeDialog.ui.h:9 msgid "Source page" msgstr "" #: ../gtk/data/MainWindow.ui.h:56 ../qt/src/SourceManager.cc:146 msgid "Protected PDF" msgstr "" #: ../gtk/data/MainWindow.ui.h:57 ../qt/src/Recognizer.cc:76 msgid "Current Page" msgstr "" #: ../gtk/data/MainWindow.ui.h:58 ../qt/src/Recognizer.cc:79 msgid "Multiple Pages..." msgstr "" #: ../gtk/data/OutputEditorHOCR.ui.h:1 ../qt/src/hocr/OutputEditorHOCR.cc:580 msgid "Add Word" msgstr "" #: ../gtk/data/OutputEditorHOCR.ui.h:4 ../qt/src/hocr/OutputEditorHOCR.cc:580 msgid "Enter word:" msgstr "" #: ../gtk/data/OutputEditorHOCR.ui.h:5 ../qt/src/hocr/Ui_OutputEditorHOCR.hh:61 #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:62 msgid "Export to plain text" msgstr "" #: ../gtk/data/OutputEditorHOCR.ui.h:6 ../qt/src/hocr/Ui_OutputEditorHOCR.hh:64 #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:65 msgid "Export to PDF" msgstr "" #: ../gtk/data/OutputEditorHOCR.ui.h:7 ../qt/src/hocr/Ui_OutputEditorHOCR.hh:67 #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:68 msgid "Export to ODT" msgstr "" #: ../gtk/data/OutputEditorHOCR.ui.h:8 ../gtk/data/OutputEditorText.ui.h:18 #: ../qt/src/Ui_OutputEditorText.hh:116 msgid "Save output" msgstr "" #: ../gtk/data/OutputEditorHOCR.ui.h:9 ../qt/src/hocr/Ui_OutputEditorHOCR.hh:72 #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:73 msgid "Export" msgstr "" #: ../gtk/data/OutputEditorHOCR.ui.h:10 ../gtk/data/OutputEditorText.ui.h:19 #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:77 #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:78 #: ../qt/src/Ui_OutputEditorText.hh:118 msgid "Clear output" msgstr "" #: ../gtk/data/OutputEditorHOCR.ui.h:11 ../gtk/data/OutputEditorText.ui.h:15 #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:80 #: ../qt/src/Ui_OutputEditorText.hh:107 msgid "Find and replace" msgstr "" #: ../gtk/data/OutputEditorHOCR.ui.h:12 #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:82 #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:83 msgid "Show confidence values" msgstr "" #: ../gtk/data/OutputEditorHOCR.ui.h:13 ../gtk/data/PdfExportDialog.ui.h:41 #: ../qt/data/PdfExportDialog.ui.h:2 ../qt/src/hocr/Ui_OutputEditorHOCR.hh:85 #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:86 msgid "Show preview" msgstr "" #: ../gtk/data/OutputEditorHOCR.ui.h:14 #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:121 msgid "Next (F3)" msgstr "" #: ../gtk/data/OutputEditorHOCR.ui.h:15 #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:122 msgid "Previous (Shift+F3)" msgstr "" #: ../gtk/data/OutputEditorHOCR.ui.h:16 ../gtk/src/hocr/OutputEditorHOCR.cc:890 #: ../qt/src/hocr/OutputEditorHOCR.cc:730 #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:126 msgid "Expand all" msgstr "" #: ../gtk/data/OutputEditorHOCR.ui.h:17 ../gtk/src/hocr/OutputEditorHOCR.cc:893 #: ../qt/src/hocr/OutputEditorHOCR.cc:731 #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:127 msgid "Collapse all" msgstr "" #: ../gtk/data/OutputEditorHOCR.ui.h:18 #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:148 msgid "Properties" msgstr "" #: ../gtk/data/OutputEditorHOCR.ui.h:19 #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:152 msgid "Source" msgstr "" #. Output insert mode #: ../gtk/data/OutputEditorText.ui.h:1 ../qt/src/Ui_OutputEditorText.hh:52 msgid "Append to current text" msgstr "" #: ../gtk/data/OutputEditorText.ui.h:2 ../qt/src/Ui_OutputEditorText.hh:53 msgid "Insert at cursor" msgstr "" #: ../gtk/data/OutputEditorText.ui.h:3 ../qt/src/Ui_OutputEditorText.hh:54 msgid "Replace current text" msgstr "" #. Output postprocessing #: ../gtk/data/OutputEditorText.ui.h:4 ../qt/src/Ui_OutputEditorText.hh:62 msgid "Keep line break if..." msgstr "" #: ../gtk/data/OutputEditorText.ui.h:5 ../qt/src/Ui_OutputEditorText.hh:64 msgid "Preceded by end mark (.?!)" msgstr "" #: ../gtk/data/OutputEditorText.ui.h:6 ../qt/src/Ui_OutputEditorText.hh:66 msgid "Preceded or succeeded by quote" msgstr "" #: ../gtk/data/OutputEditorText.ui.h:7 ../qt/src/Ui_OutputEditorText.hh:68 msgid "Other options" msgstr "" #: ../gtk/data/OutputEditorText.ui.h:8 ../qt/src/Ui_OutputEditorText.hh:70 msgid "Join hyphenated words" msgstr "" #: ../gtk/data/OutputEditorText.ui.h:9 ../qt/src/Ui_OutputEditorText.hh:72 msgid "Collapse whitespace" msgstr "" #: ../gtk/data/OutputEditorText.ui.h:10 ../qt/src/Ui_OutputEditorText.hh:74 msgid "Preserve paragraphs" msgstr "" #: ../gtk/data/OutputEditorText.ui.h:11 ../qt/src/Ui_OutputEditorText.hh:76 msgid "Visual aids" msgstr "" #: ../gtk/data/OutputEditorText.ui.h:12 ../qt/src/Ui_OutputEditorText.hh:78 msgid "Draw whitespace" msgstr "" #: ../gtk/data/OutputEditorText.ui.h:14 ../qt/src/Ui_OutputEditorText.hh:102 msgid "Strip line breaks on selected text" msgstr "" #: ../gtk/data/OutputEditorText.ui.h:16 ../qt/src/Ui_OutputEditorText.hh:109 #: ../qt/src/Ui_OutputEditorText.hh:110 msgid "Undo" msgstr "" #: ../gtk/data/OutputEditorText.ui.h:17 ../qt/src/Ui_OutputEditorText.hh:112 #: ../qt/src/Ui_OutputEditorText.hh:113 msgid "Redo" msgstr "" #: ../gtk/data/PdfExportDialog.ui.h:1 ../qt/data/PdfExportDialog.ui.h:1 msgid "PDF Export" msgstr "" #: ../gtk/data/PdfExportDialog.ui.h:4 ../qt/data/PdfExportDialog.ui.h:4 msgid "Output mode:" msgstr "" #: ../gtk/data/PdfExportDialog.ui.h:5 ../qt/data/PdfExportDialog.ui.h:6 msgid "PDF" msgstr "" #: ../gtk/data/PdfExportDialog.ui.h:6 ../qt/data/PdfExportDialog.ui.h:7 msgid "PDF with invisible text overlay" msgstr "" #: ../gtk/data/PdfExportDialog.ui.h:7 ../qt/data/PdfExportDialog.ui.h:16 msgid "Format:" msgstr "" #: ../gtk/data/PdfExportDialog.ui.h:8 ../qt/data/PdfExportDialog.ui.h:17 msgid "Compression:" msgstr "" #: ../gtk/data/PdfExportDialog.ui.h:9 ../qt/data/PdfExportDialog.ui.h:14 msgid "Compression quality:" msgstr "" #: ../gtk/data/PdfExportDialog.ui.h:10 ../qt/data/PdfExportDialog.ui.h:15 msgid "DPI:" msgstr "" #: ../gtk/data/PdfExportDialog.ui.h:11 ../qt/data/PdfExportDialog.ui.h:18 msgid "Dithering algorithm:" msgstr "" #: ../gtk/data/PdfExportDialog.ui.h:12 ../qt/data/PdfExportDialog.ui.h:13 msgid "Image settings:" msgstr "" #: ../gtk/data/PdfExportDialog.ui.h:13 ../qt/data/PdfExportDialog.ui.h:25 msgid "Uniformize line and word spacing" msgstr "" #: ../gtk/data/PdfExportDialog.ui.h:14 ../qt/data/PdfExportDialog.ui.h:21 msgid "Override font family:" msgstr "" #: ../gtk/data/PdfExportDialog.ui.h:15 ../qt/data/PdfExportDialog.ui.h:27 msgid "Fallback font family:" msgstr "" #: ../gtk/data/PdfExportDialog.ui.h:16 ../qt/data/PdfExportDialog.ui.h:20 msgid "Override font size:" msgstr "" #: ../gtk/data/PdfExportDialog.ui.h:17 ../qt/data/PdfExportDialog.ui.h:23 msgid "Font scaling:" msgstr "" #: ../gtk/data/PdfExportDialog.ui.h:18 ../qt/data/PdfExportDialog.ui.h:26 msgid "pt" msgstr "" #: ../gtk/data/PdfExportDialog.ui.h:19 ../qt/data/PdfExportDialog.ui.h:22 msgid "Preserve spaces wider than:" msgstr "" #: ../gtk/data/PdfExportDialog.ui.h:20 ../qt/data/PdfExportDialog.ui.h:24 msgid "characters" msgstr "" #: ../gtk/data/PdfExportDialog.ui.h:21 ../qt/data/PdfExportDialog.ui.h:28 msgid "Sanitize hyphens before line breaks" msgstr "" #: ../gtk/data/PdfExportDialog.ui.h:22 ../qt/data/PdfExportDialog.ui.h:19 msgid "Text settings:" msgstr "" #: ../gtk/data/PdfExportDialog.ui.h:23 ../qt/data/PdfExportDialog.ui.h:10 msgid "Paper size:" msgstr "" #: ../gtk/data/PdfExportDialog.ui.h:24 ../qt/data/PdfExportDialog.ui.h:11 msgid "Width" msgstr "" #: ../gtk/data/PdfExportDialog.ui.h:25 ../qt/data/PdfExportDialog.ui.h:12 msgid "Height" msgstr "" #: ../gtk/data/PdfExportDialog.ui.h:26 ../qt/data/PdfExportDialog.ui.h:29 msgid "Treat image sources as having true DPI:" msgstr "" #: ../gtk/data/PdfExportDialog.ui.h:27 ../qt/data/PdfExportDialog.ui.h:3 msgid "Basic" msgstr "" #: ../gtk/data/PdfExportDialog.ui.h:28 ../qt/data/PdfExportDialog.ui.h:31 msgid "PDF version:" msgstr "" #: ../gtk/data/PdfExportDialog.ui.h:29 ../qt/data/PdfExportDialog.ui.h:33 msgid "Password:" msgstr "" #: ../gtk/data/PdfExportDialog.ui.h:30 ../qt/data/PdfExportDialog.ui.h:34 msgid "Confirm password:" msgstr "" #: ../gtk/data/PdfExportDialog.ui.h:31 ../qt/data/PdfExportDialog.ui.h:32 msgid "Encryption (optional):" msgstr "" #: ../gtk/data/PdfExportDialog.ui.h:32 ../qt/data/PdfExportDialog.ui.h:36 msgid "Author:" msgstr "" #: ../gtk/data/PdfExportDialog.ui.h:33 ../qt/data/PdfExportDialog.ui.h:38 msgid "Title:" msgstr "" #: ../gtk/data/PdfExportDialog.ui.h:34 ../qt/data/PdfExportDialog.ui.h:40 msgid "Subject:" msgstr "" #: ../gtk/data/PdfExportDialog.ui.h:35 ../qt/data/PdfExportDialog.ui.h:37 msgid "Creator:" msgstr "" #: ../gtk/data/PdfExportDialog.ui.h:36 ../qt/data/PdfExportDialog.ui.h:39 msgid "Producer:" msgstr "" #: ../gtk/data/PdfExportDialog.ui.h:37 ../qt/data/PdfExportDialog.ui.h:41 msgid "Keywords:" msgstr "" #: ../gtk/data/PdfExportDialog.ui.h:38 ../qt/data/PdfExportDialog.ui.h:35 msgid "Additional information (optional):" msgstr "" #: ../gtk/data/PdfExportDialog.ui.h:39 ../qt/data/PdfExportDialog.ui.h:42 msgid "Import from current source" msgstr "" #: ../gtk/data/PdfExportDialog.ui.h:40 ../qt/data/PdfExportDialog.ui.h:30 msgid "Advanced" msgstr "" #: ../gtk/data/SearchReplaceFrame.ui.h:1 ../qt/data/SearchReplaceFrame.ui.h:4 msgid "Find" msgstr "" #: ../gtk/data/SearchReplaceFrame.ui.h:2 ../qt/data/SearchReplaceFrame.ui.h:2 msgid "Replace" msgstr "" #: ../gtk/data/SearchReplaceFrame.ui.h:3 ../qt/data/SearchReplaceFrame.ui.h:3 msgid "Replace all" msgstr "" #: ../gtk/data/SearchReplaceFrame.ui.h:4 ../qt/data/SearchReplaceFrame.ui.h:5 msgid "Find previous" msgstr "" #: ../gtk/data/SearchReplaceFrame.ui.h:5 ../qt/data/SearchReplaceFrame.ui.h:6 msgid "Find next" msgstr "" #: ../gtk/data/SearchReplaceFrame.ui.h:6 ../qt/data/SearchReplaceFrame.ui.h:7 msgid "Match case" msgstr "" #: ../gtk/data/SearchReplaceFrame.ui.h:7 #: ../gtk/data/SubstitutionsManager.ui.h:1 ../qt/data/SearchReplaceFrame.ui.h:1 #: ../qt/src/SubstitutionsManager.cc:36 msgid "Substitutions" msgstr "" #: ../gtk/data/SelectionMenu.ui.h:1 ../qt/src/DisplayerToolSelect.cc:239 msgid "Delete" msgstr "" #: ../gtk/data/SelectionMenu.ui.h:2 ../qt/src/DisplayerToolSelect.cc:225 msgid "Order:" msgstr "" #: ../gtk/data/SelectionMenu.ui.h:3 ../gtk/src/hocr/DisplayerToolHOCR.cc:29 #: ../qt/src/DisplayerToolSelect.cc:240 ../qt/src/hocr/DisplayerToolHOCR.cc:31 msgid "Recognize" msgstr "" #: ../gtk/data/SelectionMenu.ui.h:4 ../qt/src/DisplayerToolSelect.cc:241 msgid "Recognize to clipboard" msgstr "" #: ../gtk/data/SelectionMenu.ui.h:5 ../qt/src/DisplayerToolSelect.cc:242 msgid "Save as image" msgstr "" #: ../gtk/data/SubstitutionsManager.ui.h:2 ../qt/src/SubstitutionsManager.cc:38 #: ../qt/src/SubstitutionsManager.cc:39 msgid "Open" msgstr "" #: ../gtk/data/SubstitutionsManager.ui.h:3 ../gtk/src/Utils.cc:73 #: ../qt/src/SubstitutionsManager.cc:41 ../qt/src/SubstitutionsManager.cc:42 msgid "Save" msgstr "" #: ../gtk/data/SubstitutionsManager.ui.h:4 ../qt/src/SubstitutionsManager.cc:44 #: ../qt/src/SubstitutionsManager.cc:45 msgid "Clear" msgstr "" #: ../gtk/data/SubstitutionsManager.ui.h:5 ../qt/data/ConfigDialog.ui.h:16 #: ../qt/src/SubstitutionsManager.cc:47 ../qt/src/SubstitutionsManager.cc:48 msgid "Add" msgstr "" #: ../gtk/data/SubstitutionsManager.ui.h:6 #: ../gtk/src/hocr/OutputEditorHOCR.cc:886 ../qt/data/ConfigDialog.ui.h:17 #: ../qt/src/hocr/OutputEditorHOCR.cc:727 ../qt/src/SubstitutionsManager.cc:50 #: ../qt/src/SubstitutionsManager.cc:51 msgid "Remove" msgstr "" #: ../gtk/data/SubstitutionsManager.ui.h:7 ../gtk/data/TessdataManager.ui.h:2 msgid "Apply" msgstr "" #: ../gtk/data/SubstitutionsManager.ui.h:8 ../gtk/data/TessdataManager.ui.h:3 msgid "Close" msgstr "" #: ../gtk/data/TessdataManager.ui.h:1 ../qt/src/TessdataManager.cc:49 msgid "Tessdata Manager" msgstr "" #: ../gtk/data/TessdataManager.ui.h:5 ../qt/src/TessdataManager.cc:51 msgid "Manage installed languages:" msgstr "" #: ../gtk/src/Acquirer.cc:79 ../qt/src/Acquirer.cc:70 msgid "scan.png" msgstr "" #: ../gtk/src/Acquirer.cc:91 ../qt/src/Acquirer.cc:85 msgid "Images" msgstr "" #: ../gtk/src/Acquirer.cc:92 ../qt/src/Acquirer.cc:86 msgid "Choose Output Filename..." msgstr "" #: ../gtk/src/Acquirer.cc:106 ../qt/src/Acquirer.cc:100 msgid "Failed to initialize the scanning backend." msgstr "" #: ../gtk/src/Acquirer.cc:115 ../qt/src/Acquirer.cc:106 msgid "Scan failed" msgstr "" #: ../gtk/src/Acquirer.cc:133 ../qt/src/Acquirer.cc:122 msgid "No scanners were detected." msgstr "" #: ../gtk/src/Acquirer.cc:150 ../gtk/src/Acquirer.cc:168 #: ../qt/src/Acquirer.cc:136 ../qt/src/Acquirer.cc:154 msgid "Starting scan..." msgstr "" #: ../gtk/src/Acquirer.cc:164 ../qt/src/Acquirer.cc:150 msgid "Opening device..." msgstr "" #: ../gtk/src/Acquirer.cc:166 ../qt/src/Acquirer.cc:152 msgid "Setting options..." msgstr "" #: ../gtk/src/Acquirer.cc:170 ../qt/src/Acquirer.cc:156 msgid "Getting parameters..." msgstr "" #: ../gtk/src/Acquirer.cc:172 ../qt/src/Acquirer.cc:158 msgid "Transferring data..." msgstr "" #: ../gtk/src/Acquirer.cc:179 ../qt/src/Acquirer.cc:165 msgid "Canceling scan..." msgstr "" #: ../gtk/src/Config.cc:49 ../qt/data/ConfigDialog.ui.h:7 msgid "Filename prefix" msgstr "" #: ../gtk/src/Config.cc:50 ../qt/data/ConfigDialog.ui.h:8 msgid "Code" msgstr "" #: ../gtk/src/Config.cc:51 ../qt/data/ConfigDialog.ui.h:9 msgid "Native name" msgstr "" #: ../gtk/src/Config.cc:109 ../qt/src/Config.cc:108 msgid "Script" msgstr "" #: ../gtk/src/CrashHandler.cc:25 ../gtk/src/CrashHandler.cc:41 #: ../qt/src/CrashHandler.cc:36 msgid "Crash Handler" msgstr "" #: ../gtk/src/CrashHandler.cc:43 ../qt/src/CrashHandler.cc:31 msgid "Your work has been saved under %1." msgstr "" #: ../gtk/src/CrashHandler.cc:45 ../qt/src/CrashHandler.cc:33 msgid "There was no unsaved work." msgstr "" #: ../gtk/src/CrashHandler.cc:106 ../qt/src/CrashHandler.cc:62 msgid "Failed to obtain backtrace. Is gdb installed?" msgstr "" #: ../gtk/src/Displayer.cc:232 ../qt/src/Displayer.cc:174 msgid "Failed to load image" msgstr "" #: ../gtk/src/Displayer.cc:232 ../qt/src/Displayer.cc:174 msgid "" "The file might not be an image or be corrupt:\n" "%1" msgstr "" #: ../gtk/src/DisplayerToolSelect.cc:138 ../qt/src/DisplayerToolSelect.cc:135 msgid "PNG Images" msgstr "" #: ../gtk/src/DisplayerToolSelect.cc:139 ../qt/src/DisplayerToolSelect.cc:135 msgid "Save Selection Image" msgstr "" #: ../gtk/src/DisplayerToolSelect.cc:139 ../qt/src/DisplayerToolSelect.cc:135 msgid "selection.png" msgstr "" #: ../gtk/src/DisplayerToolSelect.cc:146 ../qt/src/DisplayerToolSelect.cc:142 msgid "Recognize all" msgstr "" #: ../gtk/src/DisplayerToolSelect.cc:146 ../qt/src/DisplayerToolSelect.cc:142 msgid "Recognize selection" msgstr "" #: ../gtk/src/DisplayerToolSelect.cc:186 ../qt/src/DisplayerToolSelect.cc:182 msgid "Performing layout analysis" msgstr "" #: ../gtk/src/FileDialogs.cc:235 msgid "" "A file named \"%1\" already exists. Are you sure you want to overwrite it?" msgstr "" #: ../gtk/src/FileDialogs.cc:237 msgid "Overwrite File?" msgstr "" #: ../gtk/src/hocr/HOCRDocument.cc:611 ../gtk/src/hocr/OutputEditorHOCR.cc:266 #: ../qt/src/hocr/OutputEditorHOCR.cc:229 msgid "Page" msgstr "" #: ../gtk/src/hocr/HOCRDocument.cc:613 ../qt/src/hocr/HOCRDocument.cc:530 msgid "Text block" msgstr "" #: ../gtk/src/hocr/HOCRDocument.cc:615 ../gtk/src/hocr/OutputEditorHOCR.cc:272 #: ../qt/src/hocr/HOCRDocument.cc:532 ../qt/src/hocr/OutputEditorHOCR.cc:231 msgid "Paragraph" msgstr "" #: ../gtk/src/hocr/HOCRDocument.cc:617 ../qt/src/hocr/HOCRDocument.cc:534 msgid "Textline" msgstr "" #: ../gtk/src/hocr/HOCRDocument.cc:621 ../qt/src/hocr/HOCRDocument.cc:538 msgid "Graphic" msgstr "" #: ../gtk/src/hocr/HOCROdtExporter.cc:65 ../gtk/src/hocr/HOCRPdfExporter.cc:489 #: ../gtk/src/hocr/HOCRTextExporter.cc:34 #: ../gtk/src/hocr/OutputEditorHOCR.cc:963 ../gtk/src/OutputEditorText.cc:272 #: ../qt/src/hocr/HOCROdtExporter.cc:50 ../qt/src/hocr/HOCRPdfExporter.cc:478 #: ../qt/src/hocr/HOCRTextExporter.cc:36 ../qt/src/hocr/OutputEditorHOCR.cc:830 #: ../qt/src/OutputEditorText.cc:238 msgid "output" msgstr "" #: ../gtk/src/hocr/HOCROdtExporter.cc:68 ../qt/src/hocr/HOCROdtExporter.cc:53 msgid "OpenDocument Text Documents" msgstr "" #: ../gtk/src/hocr/HOCROdtExporter.cc:69 ../qt/src/hocr/HOCROdtExporter.cc:53 msgid "Save ODT Output..." msgstr "" #: ../gtk/src/hocr/HOCROdtExporter.cc:77 ../gtk/src/hocr/HOCROdtExporter.cc:342 #: ../gtk/src/hocr/HOCRPdfExporter.cc:619 #: ../gtk/src/hocr/HOCRTextExporter.cc:46 ../qt/src/hocr/HOCROdtExporter.cc:61 #: ../qt/src/hocr/HOCRPdfExporter.cc:609 ../qt/src/hocr/HOCRTextExporter.cc:47 msgid "Export failed" msgstr "" #: ../gtk/src/hocr/HOCROdtExporter.cc:77 ../gtk/src/hocr/HOCROdtExporter.cc:342 #: ../qt/src/hocr/HOCROdtExporter.cc:61 msgid "The ODT export failed: unable to write output file." msgstr "" #: ../gtk/src/hocr/HOCROdtExporter.cc:336 ../qt/src/hocr/HOCROdtExporter.cc:254 msgid "Exporting to ODT..." msgstr "" #: ../gtk/src/hocr/HOCRPdfExporter.cc:283 ../qt/src/hocr/HOCRPdfExporter.cc:365 msgid "Same as source" msgstr "" #: ../gtk/src/hocr/HOCRPdfExporter.cc:286 ../qt/src/hocr/HOCRPdfExporter.cc:366 msgid "Custom" msgstr "" #: ../gtk/src/hocr/HOCRPdfExporter.cc:300 ../qt/src/hocr/HOCRPdfExporter.cc:362 msgid "cm" msgstr "" #: ../gtk/src/hocr/HOCRPdfExporter.cc:303 ../qt/src/hocr/HOCRPdfExporter.cc:363 msgid "in" msgstr "" #: ../gtk/src/hocr/HOCRPdfExporter.cc:319 ../qt/src/hocr/HOCRPdfExporter.cc:353 msgid "Monochrome" msgstr "" #: ../gtk/src/hocr/HOCRPdfExporter.cc:328 ../qt/src/hocr/HOCRPdfExporter.cc:355 msgid "Threshold (closest color)" msgstr "" #: ../gtk/src/hocr/HOCRPdfExporter.cc:331 ../qt/src/hocr/HOCRPdfExporter.cc:356 msgid "Diffuse" msgstr "" #: ../gtk/src/hocr/HOCRPdfExporter.cc:340 ../qt/src/hocr/HOCRPdfExporter.cc:357 msgid "Zip (lossless)" msgstr "" #: ../gtk/src/hocr/HOCRPdfExporter.cc:344 ../qt/src/hocr/HOCRPdfExporter.cc:358 msgid "CCITT Group 4 (lossless)" msgstr "" #: ../gtk/src/hocr/HOCRPdfExporter.cc:348 ../qt/src/hocr/HOCRPdfExporter.cc:359 msgid "Jpeg (lossy)" msgstr "" #: ../gtk/src/hocr/HOCRPdfExporter.cc:493 ../qt/src/hocr/HOCRPdfExporter.cc:482 msgid "PDF Files" msgstr "" #: ../gtk/src/hocr/HOCRPdfExporter.cc:494 ../qt/src/hocr/HOCRPdfExporter.cc:482 msgid "Save PDF Output..." msgstr "" #: ../gtk/src/hocr/HOCRPdfExporter.cc:500 ../qt/src/hocr/HOCRPdfExporter.cc:488 msgid "Invalid Output" msgstr "" #: ../gtk/src/hocr/HOCRPdfExporter.cc:500 ../qt/src/hocr/HOCRPdfExporter.cc:488 msgid "Cannot overwrite a file which is a source image of this document." msgstr "" #: ../gtk/src/hocr/HOCRPdfExporter.cc:516 ../qt/src/hocr/HOCRPdfExporter.cc:511 msgid "Failed to create output" msgstr "" #: ../gtk/src/hocr/HOCRPdfExporter.cc:516 ../qt/src/hocr/HOCRPdfExporter.cc:511 msgid "Failed to create output. The returned error was: %1" msgstr "" #: ../gtk/src/hocr/HOCRPdfExporter.cc:558 ../qt/src/hocr/HOCRPdfExporter.cc:551 msgid "The operation was cancelled" msgstr "" #: ../gtk/src/hocr/HOCRPdfExporter.cc:607 ../qt/src/hocr/HOCRPdfExporter.cc:597 msgid "Failed to render page %1" msgstr "" #: ../gtk/src/hocr/HOCRPdfExporter.cc:614 ../qt/src/hocr/HOCRPdfExporter.cc:604 msgid "Exporting to PDF..." msgstr "" #: ../gtk/src/hocr/HOCRPdfExporter.cc:619 ../qt/src/hocr/HOCRPdfExporter.cc:609 msgid "The PDF export failed: %1." msgstr "" #: ../gtk/src/hocr/HOCRPdfExporter.cc:673 ../qt/src/hocr/HOCRPdfExporter.cc:662 msgid "The PDF library could not load the font '%1'." msgstr "" #: ../gtk/src/hocr/HOCRTextExporter.cc:37 ../gtk/src/OutputEditorText.cc:274 #: ../qt/src/hocr/HOCRTextExporter.cc:39 ../qt/src/OutputEditorText.cc:239 msgid "Text Files" msgstr "" #: ../gtk/src/hocr/HOCRTextExporter.cc:38 ../qt/src/hocr/HOCRTextExporter.cc:39 msgid "Save Text Output..." msgstr "" #: ../gtk/src/hocr/HOCRTextExporter.cc:46 ../qt/src/hocr/HOCRTextExporter.cc:47 msgid "The text export failed: unable to write output file." msgstr "" #: ../gtk/src/hocr/OutputEditorHOCR.cc:269 #: ../qt/src/hocr/OutputEditorHOCR.cc:230 msgid "Block" msgstr "" #: ../gtk/src/hocr/OutputEditorHOCR.cc:275 #: ../qt/src/hocr/OutputEditorHOCR.cc:232 msgid "Line" msgstr "" #: ../gtk/src/hocr/OutputEditorHOCR.cc:278 #: ../qt/src/hocr/OutputEditorHOCR.cc:233 msgid "Word" msgstr "" #: ../gtk/src/hocr/OutputEditorHOCR.cc:281 #: ../qt/src/hocr/OutputEditorHOCR.cc:234 msgid "Misspelled word" msgstr "" #: ../gtk/src/hocr/OutputEditorHOCR.cc:435 #: ../qt/src/hocr/OutputEditorHOCR.cc:317 msgid "" "The following pages could not be processed:\n" "%1" msgstr "" #: ../gtk/src/hocr/OutputEditorHOCR.cc:436 #: ../qt/src/hocr/OutputEditorHOCR.cc:318 msgid "Recognition errors" msgstr "" #: ../gtk/src/hocr/OutputEditorHOCR.cc:594 #: ../qt/src/hocr/OutputEditorHOCR.cc:500 #: ../qt/src/hocr/OutputEditorHOCR.cc:512 msgid "Multiple values" msgstr "" #. Merging allowed #: ../gtk/src/hocr/OutputEditorHOCR.cc:778 #: ../qt/src/hocr/OutputEditorHOCR.cc:641 msgid "Merge" msgstr "" #: ../gtk/src/hocr/OutputEditorHOCR.cc:786 #: ../gtk/src/hocr/OutputEditorHOCR.cc:877 #: ../qt/src/hocr/OutputEditorHOCR.cc:643 #: ../qt/src/hocr/OutputEditorHOCR.cc:725 msgid "Split from parent" msgstr "" #. Swapping allowed #: ../gtk/src/hocr/OutputEditorHOCR.cc:797 #: ../qt/src/hocr/OutputEditorHOCR.cc:647 msgid "Swap" msgstr "" #: ../gtk/src/hocr/OutputEditorHOCR.cc:821 #: ../qt/src/hocr/OutputEditorHOCR.cc:693 msgid "Add graphic region" msgstr "" #: ../gtk/src/hocr/OutputEditorHOCR.cc:824 #: ../qt/src/hocr/OutputEditorHOCR.cc:694 msgid "Add text block" msgstr "" #: ../gtk/src/hocr/OutputEditorHOCR.cc:828 #: ../qt/src/hocr/OutputEditorHOCR.cc:696 msgid "Add paragraph" msgstr "" #: ../gtk/src/hocr/OutputEditorHOCR.cc:832 #: ../qt/src/hocr/OutputEditorHOCR.cc:698 msgid "Add line" msgstr "" #: ../gtk/src/hocr/OutputEditorHOCR.cc:836 #: ../qt/src/hocr/OutputEditorHOCR.cc:700 msgid "Add word" msgstr "" #: ../gtk/src/hocr/OutputEditorHOCR.cc:852 #: ../qt/src/hocr/OutputEditorHOCR.cc:710 msgid "No suggestions" msgstr "" #: ../gtk/src/hocr/OutputEditorHOCR.cc:858 #: ../qt/src/hocr/OutputEditorHOCR.cc:714 msgid "Add to dictionary" msgstr "" #: ../gtk/src/hocr/OutputEditorHOCR.cc:864 #: ../qt/src/hocr/OutputEditorHOCR.cc:716 msgid "Ignore word" msgstr "" #: ../gtk/src/hocr/OutputEditorHOCR.cc:926 #: ../gtk/src/hocr/OutputEditorHOCR.cc:965 #: ../qt/src/hocr/OutputEditorHOCR.cc:795 #: ../qt/src/hocr/OutputEditorHOCR.cc:832 msgid "hOCR HTML Files" msgstr "" #: ../gtk/src/hocr/OutputEditorHOCR.cc:927 #: ../qt/src/hocr/OutputEditorHOCR.cc:795 msgid "Open hOCR File" msgstr "" #: ../gtk/src/hocr/OutputEditorHOCR.cc:936 #: ../qt/src/hocr/OutputEditorHOCR.cc:802 msgid "Failed to open file" msgstr "" #: ../gtk/src/hocr/OutputEditorHOCR.cc:936 #: ../qt/src/hocr/OutputEditorHOCR.cc:802 msgid "The file could not be opened: %1." msgstr "" #: ../gtk/src/hocr/OutputEditorHOCR.cc:945 #: ../qt/src/hocr/OutputEditorHOCR.cc:809 msgid "Invalid hOCR file" msgstr "" #: ../gtk/src/hocr/OutputEditorHOCR.cc:945 #: ../qt/src/hocr/OutputEditorHOCR.cc:809 msgid "The file does not appear to contain valid hOCR HTML: %1" msgstr "" #: ../gtk/src/hocr/OutputEditorHOCR.cc:966 #: ../qt/src/hocr/OutputEditorHOCR.cc:832 msgid "Save hOCR Output..." msgstr "" #: ../gtk/src/hocr/OutputEditorHOCR.cc:973 ../gtk/src/OutputEditorText.cc:282 #: ../qt/src/hocr/OutputEditorHOCR.cc:839 ../qt/src/OutputEditorText.cc:246 msgid "Failed to save output" msgstr "" #: ../gtk/src/hocr/OutputEditorHOCR.cc:973 ../gtk/src/OutputEditorText.cc:282 #: ../qt/src/hocr/OutputEditorHOCR.cc:839 ../qt/src/OutputEditorText.cc:246 msgid "Check that you have writing permissions in the selected folder." msgstr "" #: ../gtk/src/hocr/OutputEditorHOCR.cc:1035 ../gtk/src/OutputEditorText.cc:296 #: ../qt/src/hocr/OutputEditorHOCR.cc:894 ../qt/src/OutputEditorText.cc:259 msgid "Output not saved" msgstr "" #: ../gtk/src/hocr/OutputEditorHOCR.cc:1035 ../gtk/src/OutputEditorText.cc:296 #: ../qt/src/hocr/OutputEditorHOCR.cc:894 ../qt/src/OutputEditorText.cc:259 msgid "Save output before proceeding?" msgstr "" #: ../gtk/src/hocr/OutputEditorHOCR.cc:1156 ../gtk/src/OutputEditorText.cc:184 #: ../qt/src/hocr/OutputEditorHOCR.cc:991 ../qt/src/OutputEditorText.cc:152 msgid "Replacing..." msgstr "" #: ../gtk/src/hocr/OutputEditorHOCR.cc:1181 ../gtk/src/OutputEditorText.cc:192 #: ../qt/src/hocr/OutputEditorHOCR.cc:1014 ../qt/src/OutputEditorText.cc:160 msgid "Applying substitutions..." msgstr "" #: ../gtk/src/MainWindow.cc:131 ../qt/src/MainWindow.cc:295 msgid "Using tesseract" msgstr "" #: ../gtk/src/MainWindow.cc:178 ../qt/src/MainWindow.cc:194 msgid "Select an image to begin..." msgstr "" #: ../gtk/src/MainWindow.cc:293 ../qt/src/MainWindow.cc:278 msgid "Multiple sources" msgstr "" #: ../gtk/src/MainWindow.cc:295 ../qt/src/MainWindow.cc:280 msgid "Ready" msgstr "" #: ../gtk/src/MainWindow.cc:442 ../qt/src/MainWindow.cc:423 msgid "New version" msgstr "" #: ../gtk/src/MainWindow.cc:442 ../qt/src/MainWindow.cc:423 msgid "gImageReader %1 is available" msgstr "" #: ../gtk/src/MainWindow.cc:443 ../qt/src/MainWindow.cc:424 msgid "Download" msgstr "" #: ../gtk/src/MainWindow.cc:444 ../qt/src/MainWindow.cc:425 msgid "Changelog" msgstr "" #: ../gtk/src/MainWindow.cc:445 ../qt/src/MainWindow.cc:426 msgid "Don't notify again" msgstr "" #: ../gtk/src/MainWindow.cc:466 ../qt/src/MainWindow.cc:474 msgid "Don't show again" msgstr "" #: ../gtk/src/MainWindow.cc:467 ../gtk/src/MainWindow.cc:480 #: ../qt/src/MainWindow.cc:475 msgid "Install" msgstr "" #: ../gtk/src/MainWindow.cc:487 ../qt/src/MainWindow.cc:487 msgid "Spelling dictionary missing" msgstr "" #: ../gtk/src/MainWindow.cc:487 ../qt/src/MainWindow.cc:487 msgid "The spellcheck dictionary for %1 is not installed" msgstr "" #: ../gtk/src/MainWindow.cc:494 ../gtk/src/MainWindow.cc:523 #: ../qt/src/MainWindow.cc:493 msgid "Installing spelling dictionary for '%1'" msgstr "" #: ../gtk/src/MainWindow.cc:515 ../gtk/src/MainWindow.cc:536 #: ../gtk/src/MainWindow.cc:544 ../gtk/src/MainWindow.cc:592 #: ../gtk/src/MainWindow.cc:597 ../gtk/src/TessdataManager.cc:60 #: ../gtk/src/TessdataManager.cc:70 ../gtk/src/TessdataManager.cc:339 #: ../qt/src/MainWindow.cc:512 ../qt/src/MainWindow.cc:525 #: ../qt/src/MainWindow.cc:534 ../qt/src/MainWindow.cc:578 #: ../qt/src/MainWindow.cc:583 ../qt/src/TessdataManager.cc:74 #: ../qt/src/TessdataManager.cc:84 ../qt/src/TessdataManager.cc:315 msgid "Error" msgstr "" #: ../gtk/src/MainWindow.cc:515 ../qt/src/MainWindow.cc:512 msgid "Failed to install spelling dictionary: %1" msgstr "" #: ../gtk/src/MainWindow.cc:536 ../qt/src/MainWindow.cc:525 msgid "Failed to create directory for spelling dictionaries." msgstr "" #: ../gtk/src/MainWindow.cc:544 ../qt/src/MainWindow.cc:534 msgid "Could not read %1: %2." msgstr "" #: ../gtk/src/MainWindow.cc:571 ../qt/src/MainWindow.cc:558 msgid "Downloading '%1'..." msgstr "" #: ../gtk/src/MainWindow.cc:592 ../qt/src/MainWindow.cc:578 msgid "" "The following dictionaries could not be downloaded:\n" "%1\n" "\n" "Check the connectivity and directory permissions.\n" "Hint: If you don't have write permissions in system folders, you can switch " "to user paths in the settings dialog." msgstr "" #: ../gtk/src/MainWindow.cc:595 ../qt/src/MainWindow.cc:581 msgid "Dictionaries installed" msgstr "" #: ../gtk/src/MainWindow.cc:595 msgid "" "The following dictionaries were installed:\n" "%1" msgstr "" #: ../gtk/src/MainWindow.cc:597 ../qt/src/MainWindow.cc:583 msgid "No spelling dictionaries found for '%1'." msgstr "" #: ../gtk/src/OutputEditorText.cc:154 ../qt/src/OutputEditorText.cc:137 msgid "Stripping line breaks..." msgstr "" #: ../gtk/src/OutputEditorText.cc:162 msgid "Check spelling" msgstr "" #: ../gtk/src/OutputEditorText.cc:231 ../qt/src/OutputEditorText.cc:196 msgid "File: %1" msgstr "" #: ../gtk/src/OutputEditorText.cc:234 ../qt/src/OutputEditorText.cc:199 msgid "Page: %1" msgstr "" #: ../gtk/src/OutputEditorText.cc:247 ../gtk/src/Recognizer.cc:471 #: ../qt/src/Recognizer.cc:462 msgid "" "\n" "[Failed to recognize page %1]\n" msgstr "" #: ../gtk/src/OutputEditorText.cc:275 ../qt/src/OutputEditorText.cc:239 msgid "Save Output..." msgstr "" #: ../gtk/src/Recognizer.cc:179 ../qt/src/Recognizer.cc:172 msgid "No languages available" msgstr "" #: ../gtk/src/Recognizer.cc:179 ../qt/src/Recognizer.cc:172 msgid "" "No tesseract languages are available for use. Recognition will not work." msgstr "" #: ../gtk/src/Recognizer.cc:233 ../qt/src/Recognizer.cc:232 msgid "Multilingual" msgstr "" #: ../gtk/src/Recognizer.cc:285 ../qt/src/Recognizer.cc:277 msgid "Automatic page segmentation" msgstr "" #: ../gtk/src/Recognizer.cc:286 ../qt/src/Recognizer.cc:278 msgid "Page segmentation with orientation and script detection" msgstr "" #: ../gtk/src/Recognizer.cc:287 ../qt/src/Recognizer.cc:279 msgid "Assume single column of text" msgstr "" #: ../gtk/src/Recognizer.cc:288 ../qt/src/Recognizer.cc:280 msgid "Assume single block of vertically aligned text" msgstr "" #: ../gtk/src/Recognizer.cc:289 ../qt/src/Recognizer.cc:281 msgid "Assume a single uniform block of text" msgstr "" #: ../gtk/src/Recognizer.cc:290 ../qt/src/Recognizer.cc:282 msgid "Assume a line of text" msgstr "" #: ../gtk/src/Recognizer.cc:291 ../qt/src/Recognizer.cc:283 msgid "Assume a single word" msgstr "" #: ../gtk/src/Recognizer.cc:292 ../qt/src/Recognizer.cc:284 msgid "Assume a single word in a circle" msgstr "" #: ../gtk/src/Recognizer.cc:293 ../qt/src/Recognizer.cc:285 msgid "Sparse text in no particular order" msgstr "" #: ../gtk/src/Recognizer.cc:294 ../qt/src/Recognizer.cc:286 msgid "Sparse text with orientation and script detection" msgstr "" #: ../gtk/src/Recognizer.cc:309 ../qt/src/Recognizer.cc:297 msgid "Page segmentation mode" msgstr "" #: ../gtk/src/Recognizer.cc:313 ../qt/src/Recognizer.cc:300 msgid "Character whitelist / blacklist..." msgstr "" #: ../gtk/src/Recognizer.cc:319 ../qt/src/Recognizer.cc:305 msgid "Manage languages..." msgstr "" #: ../gtk/src/Recognizer.cc:375 ../qt/src/Recognizer.cc:369 msgid "Current selection" msgstr "" #: ../gtk/src/Recognizer.cc:465 ../qt/src/Recognizer.cc:455 msgid "Recognizing page %1 (%2 of %3)" msgstr "" #: ../gtk/src/Recognizer.cc:470 ../qt/src/Recognizer.cc:461 msgid "" "\n" "- Page %1: failed to render page" msgstr "" #: ../gtk/src/Recognizer.cc:501 ../gtk/src/Recognizer.cc:531 #: ../gtk/src/Recognizer.cc:544 ../qt/src/Recognizer.cc:491 #: ../qt/src/Recognizer.cc:521 ../qt/src/Recognizer.cc:534 msgid "Recognizing..." msgstr "" #: ../gtk/src/Recognizer.cc:505 ../gtk/src/Recognizer.cc:514 #: ../qt/src/Recognizer.cc:495 ../qt/src/Recognizer.cc:504 msgid "Recognition errors occurred" msgstr "" #: ../gtk/src/Recognizer.cc:505 ../qt/src/Recognizer.cc:495 msgid "The following errors occurred:%1" msgstr "" #: ../gtk/src/Recognizer.cc:514 ../qt/src/Recognizer.cc:504 msgid "Failed to initialize tesseract" msgstr "" #: ../gtk/src/scanner/ScannerSane.cc:84 ../gtk/src/scanner/ScannerTwain.cc:288 #: ../qt/src/scanner/ScannerSane.cc:85 ../qt/src/scanner/ScannerTwain.cc:286 msgid "Scan canceled" msgstr "" #: ../gtk/src/scanner/ScannerSane.cc:159 ../gtk/src/scanner/ScannerTwain.cc:186 #: ../qt/src/scanner/ScannerSane.cc:159 ../qt/src/scanner/ScannerTwain.cc:178 msgid "No scanner specified" msgstr "" #: ../gtk/src/scanner/ScannerSane.cc:168 ../gtk/src/scanner/ScannerTwain.cc:195 #: ../qt/src/scanner/ScannerSane.cc:168 ../qt/src/scanner/ScannerTwain.cc:187 msgid "Unable to connect to scanner" msgstr "" #: ../gtk/src/scanner/ScannerSane.cc:403 ../gtk/src/scanner/ScannerTwain.cc:266 #: ../gtk/src/scanner/ScannerTwain.cc:292 ../qt/src/scanner/ScannerSane.cc:403 #: ../qt/src/scanner/ScannerTwain.cc:258 ../qt/src/scanner/ScannerTwain.cc:290 msgid "Unable to start scan" msgstr "" #: ../gtk/src/scanner/ScannerSane.cc:411 ../gtk/src/scanner/ScannerSane.cc:461 #: ../gtk/src/scanner/ScannerTwain.cc:318 ../qt/src/scanner/ScannerSane.cc:411 #: ../qt/src/scanner/ScannerSane.cc:461 ../qt/src/scanner/ScannerTwain.cc:316 msgid "Error communicating with scanner" msgstr "" #: ../gtk/src/scanner/ScannerSane.cc:520 ../qt/src/scanner/ScannerSane.cc:517 msgid "Failed to save image" msgstr "" #: ../gtk/src/scanner/ScannerSane.cc:800 ../qt/src/scanner/ScannerSane.cc:797 msgid "Operation is cancelled." msgstr "" #: ../gtk/src/scanner/ScannerSane.cc:802 ../qt/src/scanner/ScannerSane.cc:799 msgid "Device is busy." msgstr "" #: ../gtk/src/scanner/ScannerSane.cc:804 ../qt/src/scanner/ScannerSane.cc:801 msgid "Cover is opened." msgstr "" #: ../gtk/src/scanner/ScannerSane.cc:806 ../qt/src/scanner/ScannerSane.cc:803 msgid "Document feeder jammed." msgstr "" #: ../gtk/src/scanner/ScannerSane.cc:808 ../qt/src/scanner/ScannerSane.cc:805 msgid "Document feeder out of documents." msgstr "" #: ../gtk/src/scanner/ScannerSane.cc:810 ../qt/src/scanner/ScannerSane.cc:807 msgid "Access to scanner is denied." msgstr "" #: ../gtk/src/SourceManager.cc:118 ../qt/src/SourceManager.cc:124 msgid "PDFs with text" msgstr "" #: ../gtk/src/SourceManager.cc:118 ../qt/src/SourceManager.cc:124 msgid "" "These PDF files already contain text:\n" "%1" msgstr "" #: ../gtk/src/SourceManager.cc:127 ../qt/src/SourceManager.cc:132 msgid "Unable to open files" msgstr "" #: ../gtk/src/SourceManager.cc:127 ../qt/src/SourceManager.cc:132 msgid "The following files could not be opened:%1" msgstr "" #: ../gtk/src/SourceManager.cc:141 ../qt/src/SourceManager.cc:143 msgid "Enter password for file '%1':" msgstr "" #: ../gtk/src/SourceManager.cc:197 ../qt/src/SourceManager.cc:214 msgid "Images and PDFs" msgstr "" #: ../gtk/src/SourceManager.cc:202 ../qt/src/SourceManager.cc:215 msgid "Select Files" msgstr "" #: ../gtk/src/SourceManager.cc:208 ../qt/src/SourceManager.cc:226 msgid "Clipboard Error" msgstr "" #: ../gtk/src/SourceManager.cc:208 ../qt/src/SourceManager.cc:226 msgid "Failed to read the clipboard." msgstr "" #: ../gtk/src/SourceManager.cc:212 ../qt/src/SourceManager.cc:230 #: ../qt/src/SourceManager.cc:236 msgid "Pasted %1" msgstr "" #: ../gtk/src/SourceManager.cc:224 ../qt/src/SourceManager.cc:243 msgid "Screenshot Error" msgstr "" #: ../gtk/src/SourceManager.cc:224 ../qt/src/SourceManager.cc:243 msgid "Failed to take screenshot." msgstr "" #: ../gtk/src/SourceManager.cc:228 ../qt/src/SourceManager.cc:247 msgid "Screenshot %1" msgstr "" #: ../gtk/src/SourceManager.cc:233 ../qt/src/SourceManager.cc:252 msgid "Saving image..." msgstr "" #: ../gtk/src/SourceManager.cc:240 ../qt/src/SourceManager.cc:265 msgid "Cannot Write File" msgstr "" #: ../gtk/src/SourceManager.cc:240 ../qt/src/SourceManager.cc:265 msgid "Could not write to %1." msgstr "" #: ../gtk/src/SourceManager.cc:267 ../qt/src/SourceManager.cc:287 msgid "Delete File?" msgstr "" #: ../gtk/src/SourceManager.cc:267 ../qt/src/SourceManager.cc:287 msgid "The following files will be deleted:%1" msgstr "" #: ../gtk/src/SourceManager.cc:332 ../qt/src/SourceManager.cc:338 msgid "Missing File" msgstr "" #: ../gtk/src/SourceManager.cc:332 ../qt/src/SourceManager.cc:338 msgid "" "The following file has been deleted or moved:\n" "%1" msgstr "" #: ../gtk/src/SubstitutionsManager.cc:33 ../qt/src/SubstitutionsManager.cc:73 msgid "Search for" msgstr "" #: ../gtk/src/SubstitutionsManager.cc:34 ../qt/src/SubstitutionsManager.cc:73 msgid "Replace with" msgstr "" #: ../gtk/src/SubstitutionsManager.cc:69 ../gtk/src/SubstitutionsManager.cc:103 #: ../qt/src/SubstitutionsManager.cc:106 ../qt/src/SubstitutionsManager.cc:143 msgid "Substitutions List" msgstr "" #: ../gtk/src/SubstitutionsManager.cc:70 ../qt/src/SubstitutionsManager.cc:106 msgid "Open Substitutions List" msgstr "" #: ../gtk/src/SubstitutionsManager.cc:75 ../qt/src/SubstitutionsManager.cc:112 msgid "Error Reading File" msgstr "" #: ../gtk/src/SubstitutionsManager.cc:75 ../qt/src/SubstitutionsManager.cc:112 msgid "Unable to read '%1'." msgstr "" #: ../gtk/src/SubstitutionsManager.cc:97 ../qt/src/SubstitutionsManager.cc:137 msgid "Errors Occurred Reading File" msgstr "" #: ../gtk/src/SubstitutionsManager.cc:97 ../qt/src/SubstitutionsManager.cc:137 msgid "Some entries of the substitutions list could not be read." msgstr "" #: ../gtk/src/SubstitutionsManager.cc:104 ../qt/src/SubstitutionsManager.cc:143 msgid "Save Substitutions List" msgstr "" #: ../gtk/src/SubstitutionsManager.cc:110 ../qt/src/SubstitutionsManager.cc:149 msgid "Error Saving File" msgstr "" #: ../gtk/src/SubstitutionsManager.cc:110 ../qt/src/SubstitutionsManager.cc:149 msgid "Unable to write to '%1'." msgstr "" #: ../gtk/src/SubstitutionsManager.cc:127 ../qt/src/SubstitutionsManager.cc:162 msgid "Save List?" msgstr "" #: ../gtk/src/SubstitutionsManager.cc:127 ../qt/src/SubstitutionsManager.cc:162 msgid "Do you want to save the current list?" msgstr "" #: ../gtk/src/TessdataManager.cc:60 ../qt/src/TessdataManager.cc:74 msgid "" "A session connection to the PackageKit backend is required for managing " "system-wide tesseract language packs, but it was not found. This service is " "usually provided by a software-management application such as Gnome " "Software. Please install software which provides the necessary PackageKit " "interface, use other system package management software to manage the " "tesseract language packs directly, or switch to using the user tessdata path " "in the configuration dialog." msgstr "" #: ../gtk/src/TessdataManager.cc:65 ../qt/src/TessdataManager.cc:79 msgid "Fetching available languages" msgstr "" #: ../gtk/src/TessdataManager.cc:70 ../gtk/src/TessdataManager.cc:96 #: ../gtk/src/TessdataManager.cc:197 ../qt/src/TessdataManager.cc:84 #: ../qt/src/TessdataManager.cc:101 ../qt/src/TessdataManager.cc:197 msgid "Failed to fetch list of available languages: %1" msgstr "" #: ../gtk/src/TessdataManager.cc:104 ../qt/src/TessdataManager.cc:113 #: ../qt/src/TessdataManager.cc:122 msgid "Parsing error: %1" msgstr "" #: ../gtk/src/TessdataManager.cc:235 ../qt/src/TessdataManager.cc:232 msgid "Applying changes..." msgstr "" #: ../gtk/src/TessdataManager.cc:297 ../qt/src/TessdataManager.cc:278 msgid "Failed to create directory for tessdata files." msgstr "" #: ../gtk/src/TessdataManager.cc:306 ../qt/src/TessdataManager.cc:287 msgid "Downloading %1..." msgstr "" #: ../gtk/src/TessdataManager.cc:330 msgid "" "The following files could not be downloaded or removed:\n" "%1\n" "\n" "Check the connectivity and directory permissions.\n" "\n" "Hint: If you don't have write permissions in system folders, you can switch " "to user paths in the settings dialog." msgstr "" #: ../gtk/src/Utils.cc:64 msgid "Yes" msgstr "" #: ../gtk/src/Utils.cc:67 msgid "No" msgstr "" #: ../gtk/src/Utils.cc:76 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/CrashHandler.ui.h:3 msgid "" "

Tesseract has " "aborted

Tesseract (the OCR engine) has aborted while " "recognizing text. This may occur if the used traineddatas are corrupt or " "incomplatible with the version of tesseract in use, or due to a bug in " "tesseract.

The stacktrace below may provide additional information " "about where the crash occured.

" msgstr "" #: ../qt/data/MainWindow.ui.h:17 msgid "Flatbed" msgstr "" #: ../qt/data/MainWindow.ui.h:18 msgid "ADF Front" msgstr "" #: ../qt/data/MainWindow.ui.h:19 msgid "ADF Back" msgstr "" #: ../qt/data/MainWindow.ui.h:20 msgid "ADF Duplex" msgstr "" #. Remove & from some labels which designer insists in adding #: ../qt/data/MainWindow.ui.h:21 ../qt/src/Ui_MainWindow.hh:50 msgid "Sources" msgstr "" #: ../qt/data/MainWindow.ui.h:22 msgid "Zoom In" msgstr "" #: ../qt/data/MainWindow.ui.h:24 msgid "Zoom Out" msgstr "" #: ../qt/data/MainWindow.ui.h:26 msgid "Normal Size" msgstr "" #: ../qt/data/MainWindow.ui.h:28 msgid "Best Fit" msgstr "" #: ../qt/data/MainWindow.ui.h:30 msgid "Rotate Left" msgstr "" #: ../qt/data/MainWindow.ui.h:31 msgid "Rotate left" msgstr "" #: ../qt/data/MainWindow.ui.h:32 msgid "Rotate Right" msgstr "" #: ../qt/data/MainWindow.ui.h:33 msgid "Rotate right" msgstr "" #: ../qt/data/MainWindow.ui.h:34 msgid "Image Controls" msgstr "" #: ../qt/data/MainWindow.ui.h:36 msgid "Autodetect Layout" msgstr "" #: ../qt/data/MainWindow.ui.h:38 msgid "Toggle Output Pane" msgstr "" #: ../qt/data/PdfExportDialog.ui.h:5 msgid "Backend:" msgstr "" #: ../qt/data/PdfExportDialog.ui.h:8 msgid "Portrait" msgstr "" #: ../qt/data/PdfExportDialog.ui.h:9 msgid "Landscape" msgstr "" #: ../qt/src/hocr/HOCRPdfExporter.cc:142 msgid "Failed to write to file" msgstr "" #. Output toolbar #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:55 #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:56 msgid "Open hOCR file" msgstr "" #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:57 #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:58 msgid "Save as hOCR text" msgstr "" #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:79 #: ../qt/src/Ui_OutputEditorText.hh:106 msgid "Find and Replace" msgstr "" #: ../qt/src/MainWindow.cc:581 msgid "" "The following dictionary files were installed:\n" "%1" msgstr "" #: ../qt/src/TessdataManager.cc:308 msgid "" "The following files could not be downloaded or removed:\n" "%1\n" "\n" "Check the connectivity and directory permissions.\n" "Hint: If you don't have write permissions in system folders, you can switch " "to user paths in the settings dialog." msgstr "" #: ../qt/src/Ui_MainWindow.hh:51 msgid "Output" msgstr "" #: ../qt/src/Ui_MainWindow.hh:135 msgid "OCR mode:" msgstr "" #: ../qt/src/Ui_MainWindow.hh:209 msgid "Remove Image" msgstr "" #: ../qt/src/Ui_MainWindow.hh:212 msgid "Delete Image" msgstr "" #: ../qt/src/Ui_MainWindow.hh:215 msgid "Clear List" msgstr "" #: ../qt/src/Ui_OutputEditorText.hh:101 msgid "Strip Line Breaks" msgstr "" #: ../qt/src/Ui_OutputEditorText.hh:115 msgid "Save Output" msgstr "" #: ../qt/src/Ui_OutputEditorText.hh:117 msgid "Clear Output" msgstr "" gImageReader-3.3.1/po/hi.po000066400000000000000000001575461351740627400154430ustar00rootroot00000000000000# 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. # msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2019-07-25 23:18+0200\n" "PO-Revision-Date: 2019-07-19 18:07+0000\n" "Last-Translator: Shreeshrii \n" "Language-Team: Hindi \n" "Language: hi\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n > 1;\n" "X-Generator: Weblate 3.8-dev\n" #: ../data/gimagereader.desktop.in.h:1 msgid "OCR application" msgstr "" #: ../gtk/data/appmenu.ui.h:1 ../qt/src/Ui_MainWindow.hh:167 msgid "Redetect Languages" msgstr "" #: ../gtk/data/appmenu.ui.h:2 ../qt/src/Ui_MainWindow.hh:170 msgid "Manage Languages" msgstr "" #: ../gtk/data/appmenu.ui.h:3 ../gtk/data/ConfigDialog.ui.h:1 #: ../qt/data/ConfigDialog.ui.h:1 ../qt/src/Ui_MainWindow.hh:173 msgid "Preferences" msgstr "" #: ../gtk/data/appmenu.ui.h:4 ../gtk/data/ConfigDialog.ui.h:2 #: ../gtk/src/MainWindow.cc:482 ../qt/src/MainWindow.cc:481 #: ../qt/src/Ui_MainWindow.hh:178 msgid "Help" msgstr "मदद" #: ../gtk/data/appmenu.ui.h:5 ../qt/data/AboutDialog.ui.h:2 #: ../qt/src/Ui_MainWindow.hh:181 msgid "About" msgstr "बारे में" #: ../gtk/data/appmenu.ui.h:6 msgid "Quit" msgstr "छोड़ें" #: ../gtk/data/ConfigDialog.ui.h:3 ../gtk/data/MainWindow.ui.h:47 #: ../gtk/data/OutputEditorHOCR.ui.h:3 ../gtk/data/PdfExportDialog.ui.h:3 #: ../gtk/src/FileDialogs.cc:152 ../gtk/src/Utils.cc:61 #: ../qt/data/ConfigDialog.ui.h:26 msgid "OK" msgstr "ठीक है" #: ../gtk/data/ConfigDialog.ui.h:4 msgid "Output pane orientation:" msgstr "आउटपà¥à¤Ÿ फलक ओरिà¤à¤‚टेशन:" #: ../gtk/data/ConfigDialog.ui.h:5 msgid "Horizontal" msgstr "हॉरिजॉनà¥à¤Ÿà¤²" #: ../gtk/data/ConfigDialog.ui.h:6 msgid "Vertical" msgstr "वरà¥à¤Ÿà¥€à¤•ल" #: ../gtk/data/ConfigDialog.ui.h:7 ../qt/data/ConfigDialog.ui.h:18 msgid "Query to install missing spellcheck dictionaries" msgstr "अनà¥à¤ªà¤²à¤¬à¥à¤§ वरà¥à¤¤à¤¨à¥€ जाà¤à¤š शबà¥à¤¦à¤•ोश सà¥à¤¥à¤¾à¤ªà¤¿à¤¤ करने के लिठकà¥à¤µà¥‡à¤°à¥€" #: ../gtk/data/ConfigDialog.ui.h:8 ../qt/data/ConfigDialog.ui.h:4 msgid "Automatically check for new program versions" msgstr "नठपà¥à¤°à¥‹à¤—à¥à¤°à¤¾à¤® संसà¥à¤•रणों के लिठसà¥à¤µà¤šà¤¾à¤²à¤¿à¤¤ रूप से जाà¤à¤š करें" #: ../gtk/data/ConfigDialog.ui.h:9 ../qt/data/ConfigDialog.ui.h:3 msgid "Predefined language definitions:" msgstr "पूरà¥à¤µà¤¨à¤¿à¤°à¥à¤§à¤¾à¤°à¤¿à¤¤ भाषा परिभाषाà¤à¤:" #: ../gtk/data/ConfigDialog.ui.h:10 ../qt/data/ConfigDialog.ui.h:12 msgid "Additional language definitions:" msgstr "अनà¥à¤¯ भाषा परिभाषाà¤à¤:" #: ../gtk/data/ConfigDialog.ui.h:11 ../qt/data/ConfigDialog.ui.h:20 msgid "The prefix of the tesseract language data file" msgstr "टेसेरेकà¥à¤Ÿ भाषा डेटा फ़ाइल का पà¥à¤°à¤¿à¤«à¤¿à¤•à¥à¤¸" #: ../gtk/data/ConfigDialog.ui.h:12 ../qt/data/ConfigDialog.ui.h:21 msgid "Prefix" msgstr "पà¥à¤°à¤¿à¤«à¤¿à¤•à¥à¤¸" #: ../gtk/data/ConfigDialog.ui.h:13 ../qt/data/ConfigDialog.ui.h:22 msgid "The ISO 639-1 language code followed by the country code" msgstr "ISO 639-1 भाषा कोड के बाद देश कोड" #: ../gtk/data/ConfigDialog.ui.h:14 ../qt/data/ConfigDialog.ui.h:23 msgid "ISO Code" msgstr "आईà¤à¤¸à¤“ कोड" #: ../gtk/data/ConfigDialog.ui.h:15 ../qt/data/ConfigDialog.ui.h:24 msgid "The name of the language" msgstr "भाषा का नाम" #: ../gtk/data/ConfigDialog.ui.h:16 ../qt/data/ConfigDialog.ui.h:25 msgid "Name" msgstr "नाम" #: ../gtk/data/ConfigDialog.ui.h:17 ../gtk/data/MainWindow.ui.h:46 #: ../gtk/data/OutputEditorHOCR.ui.h:2 ../gtk/data/PdfExportDialog.ui.h:2 #: ../gtk/src/Acquirer.cc:34 ../gtk/src/FileDialogs.cc:151 #: ../gtk/src/Utils.cc:70 ../qt/data/ConfigDialog.ui.h:27 #: ../qt/data/MainWindow.ui.h:12 msgid "Cancel" msgstr "रदà¥à¤¦ करें" #: ../gtk/data/ConfigDialog.ui.h:18 ../qt/data/ConfigDialog.ui.h:5 msgid "Output pane font:" msgstr "आउटपà¥à¤Ÿ फलक फ़ॉनà¥à¤Ÿ:" #: ../gtk/data/ConfigDialog.ui.h:19 ../qt/data/ConfigDialog.ui.h:2 msgid "Default" msgstr "डिफ़ॉलà¥à¤Ÿ" #: ../gtk/data/ConfigDialog.ui.h:20 ../qt/data/ConfigDialog.ui.h:6 msgid "Language data locations:" msgstr "भाषा डेटा सà¥à¤¥à¤¾à¤¨:" #: ../gtk/data/ConfigDialog.ui.h:21 ../qt/data/ConfigDialog.ui.h:13 msgid "Language definitions path:" msgstr "भाषा परिभाषा पथ:" #: ../gtk/data/ConfigDialog.ui.h:22 ../qt/data/ConfigDialog.ui.h:28 msgid "Spelling dictionaries path:" msgstr "वरà¥à¤¤à¤¨à¥€ शबà¥à¤¦à¤•ोश पथ:" #: ../gtk/data/ConfigDialog.ui.h:23 ../qt/data/ConfigDialog.ui.h:10 msgid "System-wide paths" msgstr "सिसà¥à¤Ÿà¤®-वाइड पथ" #: ../gtk/data/ConfigDialog.ui.h:24 ../qt/data/ConfigDialog.ui.h:11 msgid "User paths" msgstr "उपयोगकरà¥à¤¤à¤¾ पथ" #: ../gtk/data/ConfigDialog.ui.h:25 ../qt/data/ConfigDialog.ui.h:29 msgid "Automatically open exported documents with default application" msgstr "सà¥à¤µà¤šà¤¾à¤²à¤¿à¤¤ रूप से निरà¥à¤¯à¤¾à¤¤ किठगठदसà¥à¤¤à¤¾à¤µà¥‡à¤œà¤¼ को डिफ़ॉलà¥à¤Ÿ अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤— दà¥à¤µà¤¾à¤°à¤¾ खोलें" #: ../gtk/data/CrashHandler.ui.h:1 ../qt/src/CrashHandler.cc:38 msgid "Regenerate backtrace" msgstr "बैकटà¥à¤°à¥‡à¤¸ को पà¥à¤¨: उतà¥à¤ªà¤¨à¥à¤¨ करें" #: ../gtk/data/CrashHandler.ui.h:3 #, fuzzy, no-c-format msgid "" "The application has crashed\n" "\n" "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/CrashHandler.ui.h:6 msgid "" "Tesseract has aborted\n" "\n" "Tesseract (the OCR engine) has aborted while recognizing text. This may " "occur if the used traineddatas are corrupt or incomplatible with the version " "of tesseract in use, or due to a bug in tesseract.\n" "\n" "The stacktrace below may provide additional information about where the " "crash occured.\n" msgstr "" #: ../gtk/data/MainWindow.ui.h:1 ../qt/data/MainWindow.ui.h:39 msgid "Toggle output pane" msgstr "" #: ../gtk/data/MainWindow.ui.h:2 ../qt/src/Ui_MainWindow.hh:66 msgid "Rotate current page" msgstr "वरà¥à¤¤à¤®à¤¾à¤¨ पृषà¥à¤  घà¥à¤®à¤¾à¤à¤" #: ../gtk/data/MainWindow.ui.h:3 ../qt/src/Ui_MainWindow.hh:67 msgid "Rotate all pages" msgstr "सभी पृषà¥à¤ à¥‹à¤‚ को घà¥à¤®à¤¾à¤à¤" #. Sources toolbar #: ../gtk/data/MainWindow.ui.h:4 ../qt/src/Ui_MainWindow.hh:192 msgid "Recent" msgstr "हाल में" #: ../gtk/data/MainWindow.ui.h:5 ../qt/src/Ui_MainWindow.hh:193 msgid "Paste" msgstr "चिपकाà¤à¤" #: ../gtk/data/MainWindow.ui.h:6 ../qt/src/Ui_MainWindow.hh:194 msgid "Take Screenshot" msgstr "सà¥à¤•à¥à¤°à¥€à¤¨à¤¶à¥‰à¤Ÿ लें" #: ../gtk/data/MainWindow.ui.h:7 ../qt/data/MainWindow.ui.h:23 msgid "Zoom in" msgstr "बड़ा करें" #: ../gtk/data/MainWindow.ui.h:8 ../qt/data/MainWindow.ui.h:25 msgid "Zoom out" msgstr "छोटा करें" #: ../gtk/data/MainWindow.ui.h:9 ../qt/data/MainWindow.ui.h:27 msgid "Normal size" msgstr "सामानà¥à¤¯ आकार" #: ../gtk/data/MainWindow.ui.h:10 ../qt/data/MainWindow.ui.h:29 msgid "Best fit" msgstr "सबसे अचà¥à¤›à¤¾ फिट" #: ../gtk/data/MainWindow.ui.h:11 ../qt/src/Ui_MainWindow.hh:75 msgid "Select rotation mode" msgstr "घà¥à¤®à¤¾à¤µ मोड का चयन करें" #: ../gtk/data/MainWindow.ui.h:12 ../gtk/data/OutputEditorText.ui.h:13 #: ../qt/src/Ui_OutputEditorText.hh:95 msgid "Select insert mode" msgstr "इनसरà¥à¤Ÿ मोड का चयन करें" #: ../gtk/data/MainWindow.ui.h:13 ../qt/src/Ui_MainWindow.hh:109 msgid "Select page" msgstr "" #: ../gtk/data/MainWindow.ui.h:14 ../qt/data/MainWindow.ui.h:35 msgid "Image controls" msgstr "छवि नियंतà¥à¤°à¤£" #: ../gtk/data/MainWindow.ui.h:15 ../qt/src/Ui_MainWindow.hh:139 msgid "Plain text" msgstr "सादा टेकà¥à¤¸à¥à¤Ÿ" #: ../gtk/data/MainWindow.ui.h:16 ../qt/src/Ui_MainWindow.hh:139 msgid "hOCR, PDF" msgstr "à¤à¤šà¤“सीआर, पीडीà¤à¤«" #: ../gtk/data/MainWindow.ui.h:17 ../qt/data/MainWindow.ui.h:37 msgid "Autodetect layout" msgstr "" #: ../gtk/data/MainWindow.ui.h:18 msgid "Recognize all" msgstr "" #: ../gtk/data/MainWindow.ui.h:19 msgid "Select language" msgstr "" #: ../gtk/data/MainWindow.ui.h:20 ../qt/src/Ui_MainWindow.hh:205 msgid "Add images" msgstr "छवियाठजोड़ें" #: ../gtk/data/MainWindow.ui.h:21 ../qt/src/Ui_MainWindow.hh:204 msgid "Add Images" msgstr "छवियाठजोड़ें" #: ../gtk/data/MainWindow.ui.h:22 ../qt/src/Ui_MainWindow.hh:210 msgid "Remove image from list" msgstr "सूची से छवि निकालें" #: ../gtk/data/MainWindow.ui.h:23 ../qt/src/Ui_MainWindow.hh:213 msgid "Delete image" msgstr "छवि हटाà¤à¤" #: ../gtk/data/MainWindow.ui.h:24 ../qt/src/Ui_MainWindow.hh:216 msgid "Clear list" msgstr "सूची साफ़ करें" #: ../gtk/data/MainWindow.ui.h:25 ../qt/data/MainWindow.ui.h:5 msgid "Files" msgstr "फ़ाइलें" #: ../gtk/data/MainWindow.ui.h:26 ../qt/data/MainWindow.ui.h:8 msgid "Device:" msgstr "उपकरण:" #: ../gtk/data/MainWindow.ui.h:27 ../gtk/data/TessdataManager.ui.h:4 #: ../qt/data/MainWindow.ui.h:7 ../qt/src/TessdataManager.cc:59 msgid "Refresh" msgstr "रिफ़à¥à¤°à¥‡à¤¶" #: ../gtk/data/MainWindow.ui.h:28 ../qt/data/MainWindow.ui.h:9 msgid "Output:" msgstr "आउटपà¥à¤Ÿ:" #: ../gtk/data/MainWindow.ui.h:29 ../qt/data/MainWindow.ui.h:13 msgid "Mode:" msgstr "मोड:" #: ../gtk/data/MainWindow.ui.h:30 ../gtk/src/hocr/HOCRPdfExporter.cc:313 #: ../qt/data/MainWindow.ui.h:15 ../qt/src/hocr/HOCRPdfExporter.cc:347 msgid "Color" msgstr "रंग" #: ../gtk/data/MainWindow.ui.h:31 ../gtk/src/hocr/HOCRPdfExporter.cc:316 #: ../qt/data/MainWindow.ui.h:14 ../qt/src/hocr/HOCRPdfExporter.cc:349 #: ../qt/src/hocr/HOCRPdfExporter.cc:351 msgid "Grayscale" msgstr "गà¥à¤°à¥‡à¤¸à¥à¤•ेल" #: ../gtk/data/MainWindow.ui.h:32 ../qt/data/MainWindow.ui.h:10 msgid "Resolution:" msgstr "रिसॉलà¥à¤¯à¥à¤¶à¤¨:" #: ../gtk/data/MainWindow.ui.h:33 ../qt/data/MainWindow.ui.h:11 msgid "Scan" msgstr "सà¥à¤•ैन" #: ../gtk/data/MainWindow.ui.h:34 ../qt/data/MainWindow.ui.h:16 msgid "Source:" msgstr "सà¥à¤°à¥‹à¤¤:" #: ../gtk/data/MainWindow.ui.h:35 ../qt/data/MainWindow.ui.h:6 msgid "Acquire" msgstr "पà¥à¤°à¤¾à¤ªà¥à¤¤ करें" #: ../gtk/data/MainWindow.ui.h:36 ../qt/data/MainWindow.ui.h:1 msgid "Brightness" msgstr "चमक" #: ../gtk/data/MainWindow.ui.h:37 ../qt/data/MainWindow.ui.h:2 msgid "Contrast" msgstr "कंटà¥à¤°à¤¾à¤¸à¥à¤Ÿ" #: ../gtk/data/MainWindow.ui.h:38 ../qt/data/MainWindow.ui.h:3 msgid "Resolution" msgstr "रिसॉलà¥à¤¯à¥à¤¶à¤¨" #: ../gtk/data/MainWindow.ui.h:39 ../qt/data/MainWindow.ui.h:4 msgid "Invert colors" msgstr "रंग उलटें" #: ../gtk/data/MainWindow.ui.h:40 msgid "A graphical frontend to tesseract-ocr" msgstr "" #: ../gtk/data/MainWindow.ui.h:41 ../qt/data/CharacterListDialog.ui.h:1 msgid "Character whitelist / blacklist" msgstr "" #: ../gtk/data/MainWindow.ui.h:42 ../qt/data/CharacterListDialog.ui.h:2 msgid "Exclude these characters from being recognized (blacklist):" msgstr "" #: ../gtk/data/MainWindow.ui.h:43 ../qt/data/CharacterListDialog.ui.h:3 msgid "Enter a string of characters..." msgstr "" #: ../gtk/data/MainWindow.ui.h:44 ../qt/data/CharacterListDialog.ui.h:4 msgid "Only allow the following characters to be recognized (whitelist):" msgstr "" #: ../gtk/data/MainWindow.ui.h:45 ../qt/data/PageRangeDialog.ui.h:1 msgid "Page Range" msgstr "" #: ../gtk/data/MainWindow.ui.h:48 ../qt/data/PageRangeDialog.ui.h:2 msgid "Page range:" msgstr "" #: ../gtk/data/MainWindow.ui.h:49 ../qt/data/PageRangeDialog.ui.h:3 msgid "Example: 1-10, 13, 14-18" msgstr "" #: ../gtk/data/MainWindow.ui.h:50 ../qt/data/PageRangeDialog.ui.h:4 msgid "Recognition area:" msgstr "" #: ../gtk/data/MainWindow.ui.h:51 ../gtk/src/Recognizer.cc:375 #: ../qt/data/PageRangeDialog.ui.h:5 ../qt/src/Recognizer.cc:369 msgid "Entire page" msgstr "" #: ../gtk/data/MainWindow.ui.h:52 ../qt/data/PageRangeDialog.ui.h:6 msgid "Autodetect" msgstr "" #: ../gtk/data/MainWindow.ui.h:53 ../qt/data/PageRangeDialog.ui.h:7 msgid "Prepend to output text:" msgstr "" #: ../gtk/data/MainWindow.ui.h:54 ../qt/data/PageRangeDialog.ui.h:8 msgid "Source filename" msgstr "" #: ../gtk/data/MainWindow.ui.h:55 ../qt/data/PageRangeDialog.ui.h:9 msgid "Source page" msgstr "" #: ../gtk/data/MainWindow.ui.h:56 ../qt/src/SourceManager.cc:146 msgid "Protected PDF" msgstr "" #: ../gtk/data/MainWindow.ui.h:57 ../qt/src/Recognizer.cc:76 msgid "Current Page" msgstr "" #: ../gtk/data/MainWindow.ui.h:58 ../qt/src/Recognizer.cc:79 msgid "Multiple Pages..." msgstr "" #: ../gtk/data/OutputEditorHOCR.ui.h:1 ../qt/src/hocr/OutputEditorHOCR.cc:580 msgid "Add Word" msgstr "" #: ../gtk/data/OutputEditorHOCR.ui.h:4 ../qt/src/hocr/OutputEditorHOCR.cc:580 msgid "Enter word:" msgstr "" #: ../gtk/data/OutputEditorHOCR.ui.h:5 ../qt/src/hocr/Ui_OutputEditorHOCR.hh:61 #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:62 msgid "Export to plain text" msgstr "" #: ../gtk/data/OutputEditorHOCR.ui.h:6 ../qt/src/hocr/Ui_OutputEditorHOCR.hh:64 #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:65 msgid "Export to PDF" msgstr "" #: ../gtk/data/OutputEditorHOCR.ui.h:7 ../qt/src/hocr/Ui_OutputEditorHOCR.hh:67 #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:68 msgid "Export to ODT" msgstr "" #: ../gtk/data/OutputEditorHOCR.ui.h:8 ../gtk/data/OutputEditorText.ui.h:18 #: ../qt/src/Ui_OutputEditorText.hh:116 msgid "Save output" msgstr "" #: ../gtk/data/OutputEditorHOCR.ui.h:9 ../qt/src/hocr/Ui_OutputEditorHOCR.hh:72 #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:73 msgid "Export" msgstr "" #: ../gtk/data/OutputEditorHOCR.ui.h:10 ../gtk/data/OutputEditorText.ui.h:19 #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:77 #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:78 #: ../qt/src/Ui_OutputEditorText.hh:118 msgid "Clear output" msgstr "" #: ../gtk/data/OutputEditorHOCR.ui.h:11 ../gtk/data/OutputEditorText.ui.h:15 #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:80 #: ../qt/src/Ui_OutputEditorText.hh:107 msgid "Find and replace" msgstr "" #: ../gtk/data/OutputEditorHOCR.ui.h:12 #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:82 #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:83 msgid "Show confidence values" msgstr "" #: ../gtk/data/OutputEditorHOCR.ui.h:13 ../gtk/data/PdfExportDialog.ui.h:41 #: ../qt/data/PdfExportDialog.ui.h:2 ../qt/src/hocr/Ui_OutputEditorHOCR.hh:85 #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:86 msgid "Show preview" msgstr "" #: ../gtk/data/OutputEditorHOCR.ui.h:14 #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:121 msgid "Next (F3)" msgstr "" #: ../gtk/data/OutputEditorHOCR.ui.h:15 #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:122 msgid "Previous (Shift+F3)" msgstr "" #: ../gtk/data/OutputEditorHOCR.ui.h:16 ../gtk/src/hocr/OutputEditorHOCR.cc:890 #: ../qt/src/hocr/OutputEditorHOCR.cc:730 #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:126 msgid "Expand all" msgstr "" #: ../gtk/data/OutputEditorHOCR.ui.h:17 ../gtk/src/hocr/OutputEditorHOCR.cc:893 #: ../qt/src/hocr/OutputEditorHOCR.cc:731 #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:127 msgid "Collapse all" msgstr "" #: ../gtk/data/OutputEditorHOCR.ui.h:18 #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:148 msgid "Properties" msgstr "" #: ../gtk/data/OutputEditorHOCR.ui.h:19 #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:152 msgid "Source" msgstr "" #. Output insert mode #: ../gtk/data/OutputEditorText.ui.h:1 ../qt/src/Ui_OutputEditorText.hh:52 msgid "Append to current text" msgstr "" #: ../gtk/data/OutputEditorText.ui.h:2 ../qt/src/Ui_OutputEditorText.hh:53 msgid "Insert at cursor" msgstr "" #: ../gtk/data/OutputEditorText.ui.h:3 ../qt/src/Ui_OutputEditorText.hh:54 msgid "Replace current text" msgstr "" #. Output postprocessing #: ../gtk/data/OutputEditorText.ui.h:4 ../qt/src/Ui_OutputEditorText.hh:62 msgid "Keep line break if..." msgstr "" #: ../gtk/data/OutputEditorText.ui.h:5 ../qt/src/Ui_OutputEditorText.hh:64 msgid "Preceded by end mark (.?!)" msgstr "" #: ../gtk/data/OutputEditorText.ui.h:6 ../qt/src/Ui_OutputEditorText.hh:66 msgid "Preceded or succeeded by quote" msgstr "" #: ../gtk/data/OutputEditorText.ui.h:7 ../qt/src/Ui_OutputEditorText.hh:68 msgid "Other options" msgstr "" #: ../gtk/data/OutputEditorText.ui.h:8 ../qt/src/Ui_OutputEditorText.hh:70 msgid "Join hyphenated words" msgstr "" #: ../gtk/data/OutputEditorText.ui.h:9 ../qt/src/Ui_OutputEditorText.hh:72 msgid "Collapse whitespace" msgstr "" #: ../gtk/data/OutputEditorText.ui.h:10 ../qt/src/Ui_OutputEditorText.hh:74 msgid "Preserve paragraphs" msgstr "" #: ../gtk/data/OutputEditorText.ui.h:11 ../qt/src/Ui_OutputEditorText.hh:76 msgid "Visual aids" msgstr "" #: ../gtk/data/OutputEditorText.ui.h:12 ../qt/src/Ui_OutputEditorText.hh:78 msgid "Draw whitespace" msgstr "" #: ../gtk/data/OutputEditorText.ui.h:14 ../qt/src/Ui_OutputEditorText.hh:102 msgid "Strip line breaks on selected text" msgstr "" #: ../gtk/data/OutputEditorText.ui.h:16 ../qt/src/Ui_OutputEditorText.hh:109 #: ../qt/src/Ui_OutputEditorText.hh:110 msgid "Undo" msgstr "" #: ../gtk/data/OutputEditorText.ui.h:17 ../qt/src/Ui_OutputEditorText.hh:112 #: ../qt/src/Ui_OutputEditorText.hh:113 msgid "Redo" msgstr "" #: ../gtk/data/PdfExportDialog.ui.h:1 ../qt/data/PdfExportDialog.ui.h:1 msgid "PDF Export" msgstr "" #: ../gtk/data/PdfExportDialog.ui.h:4 ../qt/data/PdfExportDialog.ui.h:4 msgid "Output mode:" msgstr "" #: ../gtk/data/PdfExportDialog.ui.h:5 ../qt/data/PdfExportDialog.ui.h:6 msgid "PDF" msgstr "" #: ../gtk/data/PdfExportDialog.ui.h:6 ../qt/data/PdfExportDialog.ui.h:7 msgid "PDF with invisible text overlay" msgstr "" #: ../gtk/data/PdfExportDialog.ui.h:7 ../qt/data/PdfExportDialog.ui.h:16 msgid "Format:" msgstr "" #: ../gtk/data/PdfExportDialog.ui.h:8 ../qt/data/PdfExportDialog.ui.h:17 msgid "Compression:" msgstr "" #: ../gtk/data/PdfExportDialog.ui.h:9 ../qt/data/PdfExportDialog.ui.h:14 msgid "Compression quality:" msgstr "" #: ../gtk/data/PdfExportDialog.ui.h:10 ../qt/data/PdfExportDialog.ui.h:15 msgid "DPI:" msgstr "" #: ../gtk/data/PdfExportDialog.ui.h:11 ../qt/data/PdfExportDialog.ui.h:18 msgid "Dithering algorithm:" msgstr "" #: ../gtk/data/PdfExportDialog.ui.h:12 ../qt/data/PdfExportDialog.ui.h:13 msgid "Image settings:" msgstr "" #: ../gtk/data/PdfExportDialog.ui.h:13 ../qt/data/PdfExportDialog.ui.h:25 msgid "Uniformize line and word spacing" msgstr "" #: ../gtk/data/PdfExportDialog.ui.h:14 ../qt/data/PdfExportDialog.ui.h:21 msgid "Override font family:" msgstr "" #: ../gtk/data/PdfExportDialog.ui.h:15 ../qt/data/PdfExportDialog.ui.h:27 msgid "Fallback font family:" msgstr "" #: ../gtk/data/PdfExportDialog.ui.h:16 ../qt/data/PdfExportDialog.ui.h:20 msgid "Override font size:" msgstr "" #: ../gtk/data/PdfExportDialog.ui.h:17 ../qt/data/PdfExportDialog.ui.h:23 msgid "Font scaling:" msgstr "" #: ../gtk/data/PdfExportDialog.ui.h:18 ../qt/data/PdfExportDialog.ui.h:26 msgid "pt" msgstr "" #: ../gtk/data/PdfExportDialog.ui.h:19 ../qt/data/PdfExportDialog.ui.h:22 msgid "Preserve spaces wider than:" msgstr "" #: ../gtk/data/PdfExportDialog.ui.h:20 ../qt/data/PdfExportDialog.ui.h:24 msgid "characters" msgstr "" #: ../gtk/data/PdfExportDialog.ui.h:21 ../qt/data/PdfExportDialog.ui.h:28 msgid "Sanitize hyphens before line breaks" msgstr "" #: ../gtk/data/PdfExportDialog.ui.h:22 ../qt/data/PdfExportDialog.ui.h:19 msgid "Text settings:" msgstr "" #: ../gtk/data/PdfExportDialog.ui.h:23 ../qt/data/PdfExportDialog.ui.h:10 msgid "Paper size:" msgstr "" #: ../gtk/data/PdfExportDialog.ui.h:24 ../qt/data/PdfExportDialog.ui.h:11 msgid "Width" msgstr "" #: ../gtk/data/PdfExportDialog.ui.h:25 ../qt/data/PdfExportDialog.ui.h:12 msgid "Height" msgstr "" #: ../gtk/data/PdfExportDialog.ui.h:26 ../qt/data/PdfExportDialog.ui.h:29 msgid "Treat image sources as having true DPI:" msgstr "" #: ../gtk/data/PdfExportDialog.ui.h:27 ../qt/data/PdfExportDialog.ui.h:3 msgid "Basic" msgstr "" #: ../gtk/data/PdfExportDialog.ui.h:28 ../qt/data/PdfExportDialog.ui.h:31 msgid "PDF version:" msgstr "" #: ../gtk/data/PdfExportDialog.ui.h:29 ../qt/data/PdfExportDialog.ui.h:33 msgid "Password:" msgstr "" #: ../gtk/data/PdfExportDialog.ui.h:30 ../qt/data/PdfExportDialog.ui.h:34 msgid "Confirm password:" msgstr "" #: ../gtk/data/PdfExportDialog.ui.h:31 ../qt/data/PdfExportDialog.ui.h:32 msgid "Encryption (optional):" msgstr "" #: ../gtk/data/PdfExportDialog.ui.h:32 ../qt/data/PdfExportDialog.ui.h:36 msgid "Author:" msgstr "" #: ../gtk/data/PdfExportDialog.ui.h:33 ../qt/data/PdfExportDialog.ui.h:38 msgid "Title:" msgstr "" #: ../gtk/data/PdfExportDialog.ui.h:34 ../qt/data/PdfExportDialog.ui.h:40 msgid "Subject:" msgstr "" #: ../gtk/data/PdfExportDialog.ui.h:35 ../qt/data/PdfExportDialog.ui.h:37 msgid "Creator:" msgstr "" #: ../gtk/data/PdfExportDialog.ui.h:36 ../qt/data/PdfExportDialog.ui.h:39 msgid "Producer:" msgstr "" #: ../gtk/data/PdfExportDialog.ui.h:37 ../qt/data/PdfExportDialog.ui.h:41 msgid "Keywords:" msgstr "" #: ../gtk/data/PdfExportDialog.ui.h:38 ../qt/data/PdfExportDialog.ui.h:35 msgid "Additional information (optional):" msgstr "" #: ../gtk/data/PdfExportDialog.ui.h:39 ../qt/data/PdfExportDialog.ui.h:42 msgid "Import from current source" msgstr "" #: ../gtk/data/PdfExportDialog.ui.h:40 ../qt/data/PdfExportDialog.ui.h:30 msgid "Advanced" msgstr "" #: ../gtk/data/SearchReplaceFrame.ui.h:1 ../qt/data/SearchReplaceFrame.ui.h:4 msgid "Find" msgstr "" #: ../gtk/data/SearchReplaceFrame.ui.h:2 ../qt/data/SearchReplaceFrame.ui.h:2 msgid "Replace" msgstr "" #: ../gtk/data/SearchReplaceFrame.ui.h:3 ../qt/data/SearchReplaceFrame.ui.h:3 msgid "Replace all" msgstr "" #: ../gtk/data/SearchReplaceFrame.ui.h:4 ../qt/data/SearchReplaceFrame.ui.h:5 msgid "Find previous" msgstr "" #: ../gtk/data/SearchReplaceFrame.ui.h:5 ../qt/data/SearchReplaceFrame.ui.h:6 msgid "Find next" msgstr "" #: ../gtk/data/SearchReplaceFrame.ui.h:6 ../qt/data/SearchReplaceFrame.ui.h:7 msgid "Match case" msgstr "" #: ../gtk/data/SearchReplaceFrame.ui.h:7 #: ../gtk/data/SubstitutionsManager.ui.h:1 ../qt/data/SearchReplaceFrame.ui.h:1 #: ../qt/src/SubstitutionsManager.cc:36 msgid "Substitutions" msgstr "" #: ../gtk/data/SelectionMenu.ui.h:1 ../qt/src/DisplayerToolSelect.cc:239 msgid "Delete" msgstr "" #: ../gtk/data/SelectionMenu.ui.h:2 ../qt/src/DisplayerToolSelect.cc:225 msgid "Order:" msgstr "" #: ../gtk/data/SelectionMenu.ui.h:3 ../gtk/src/hocr/DisplayerToolHOCR.cc:29 #: ../qt/src/DisplayerToolSelect.cc:240 ../qt/src/hocr/DisplayerToolHOCR.cc:31 msgid "Recognize" msgstr "" #: ../gtk/data/SelectionMenu.ui.h:4 ../qt/src/DisplayerToolSelect.cc:241 msgid "Recognize to clipboard" msgstr "" #: ../gtk/data/SelectionMenu.ui.h:5 ../qt/src/DisplayerToolSelect.cc:242 msgid "Save as image" msgstr "" #: ../gtk/data/SubstitutionsManager.ui.h:2 ../qt/src/SubstitutionsManager.cc:38 #: ../qt/src/SubstitutionsManager.cc:39 msgid "Open" msgstr "" #: ../gtk/data/SubstitutionsManager.ui.h:3 ../gtk/src/Utils.cc:73 #: ../qt/src/SubstitutionsManager.cc:41 ../qt/src/SubstitutionsManager.cc:42 msgid "Save" msgstr "" #: ../gtk/data/SubstitutionsManager.ui.h:4 ../qt/src/SubstitutionsManager.cc:44 #: ../qt/src/SubstitutionsManager.cc:45 msgid "Clear" msgstr "" #: ../gtk/data/SubstitutionsManager.ui.h:5 ../qt/data/ConfigDialog.ui.h:16 #: ../qt/src/SubstitutionsManager.cc:47 ../qt/src/SubstitutionsManager.cc:48 msgid "Add" msgstr "" #: ../gtk/data/SubstitutionsManager.ui.h:6 #: ../gtk/src/hocr/OutputEditorHOCR.cc:886 ../qt/data/ConfigDialog.ui.h:17 #: ../qt/src/hocr/OutputEditorHOCR.cc:727 ../qt/src/SubstitutionsManager.cc:50 #: ../qt/src/SubstitutionsManager.cc:51 msgid "Remove" msgstr "" #: ../gtk/data/SubstitutionsManager.ui.h:7 ../gtk/data/TessdataManager.ui.h:2 msgid "Apply" msgstr "" #: ../gtk/data/SubstitutionsManager.ui.h:8 ../gtk/data/TessdataManager.ui.h:3 msgid "Close" msgstr "" #: ../gtk/data/TessdataManager.ui.h:1 ../qt/src/TessdataManager.cc:49 msgid "Tessdata Manager" msgstr "" #: ../gtk/data/TessdataManager.ui.h:5 ../qt/src/TessdataManager.cc:51 msgid "Manage installed languages:" msgstr "" #: ../gtk/src/Acquirer.cc:79 ../qt/src/Acquirer.cc:70 msgid "scan.png" msgstr "" #: ../gtk/src/Acquirer.cc:91 ../qt/src/Acquirer.cc:85 msgid "Images" msgstr "" #: ../gtk/src/Acquirer.cc:92 ../qt/src/Acquirer.cc:86 msgid "Choose Output Filename..." msgstr "" #: ../gtk/src/Acquirer.cc:106 ../qt/src/Acquirer.cc:100 msgid "Failed to initialize the scanning backend." msgstr "" #: ../gtk/src/Acquirer.cc:115 ../qt/src/Acquirer.cc:106 msgid "Scan failed" msgstr "" #: ../gtk/src/Acquirer.cc:133 ../qt/src/Acquirer.cc:122 msgid "No scanners were detected." msgstr "" #: ../gtk/src/Acquirer.cc:150 ../gtk/src/Acquirer.cc:168 #: ../qt/src/Acquirer.cc:136 ../qt/src/Acquirer.cc:154 msgid "Starting scan..." msgstr "" #: ../gtk/src/Acquirer.cc:164 ../qt/src/Acquirer.cc:150 msgid "Opening device..." msgstr "" #: ../gtk/src/Acquirer.cc:166 ../qt/src/Acquirer.cc:152 msgid "Setting options..." msgstr "" #: ../gtk/src/Acquirer.cc:170 ../qt/src/Acquirer.cc:156 msgid "Getting parameters..." msgstr "" #: ../gtk/src/Acquirer.cc:172 ../qt/src/Acquirer.cc:158 msgid "Transferring data..." msgstr "" #: ../gtk/src/Acquirer.cc:179 ../qt/src/Acquirer.cc:165 msgid "Canceling scan..." msgstr "" #: ../gtk/src/Config.cc:49 ../qt/data/ConfigDialog.ui.h:7 msgid "Filename prefix" msgstr "" #: ../gtk/src/Config.cc:50 ../qt/data/ConfigDialog.ui.h:8 msgid "Code" msgstr "" #: ../gtk/src/Config.cc:51 ../qt/data/ConfigDialog.ui.h:9 msgid "Native name" msgstr "" #: ../gtk/src/Config.cc:109 ../qt/src/Config.cc:108 msgid "Script" msgstr "" #: ../gtk/src/CrashHandler.cc:25 ../gtk/src/CrashHandler.cc:41 #: ../qt/src/CrashHandler.cc:36 msgid "Crash Handler" msgstr "" #: ../gtk/src/CrashHandler.cc:43 ../qt/src/CrashHandler.cc:31 msgid "Your work has been saved under %1." msgstr "" #: ../gtk/src/CrashHandler.cc:45 ../qt/src/CrashHandler.cc:33 msgid "There was no unsaved work." msgstr "" #: ../gtk/src/CrashHandler.cc:106 ../qt/src/CrashHandler.cc:62 msgid "Failed to obtain backtrace. Is gdb installed?" msgstr "" #: ../gtk/src/Displayer.cc:232 ../qt/src/Displayer.cc:174 msgid "Failed to load image" msgstr "" #: ../gtk/src/Displayer.cc:232 ../qt/src/Displayer.cc:174 msgid "" "The file might not be an image or be corrupt:\n" "%1" msgstr "" #: ../gtk/src/DisplayerToolSelect.cc:138 ../qt/src/DisplayerToolSelect.cc:135 msgid "PNG Images" msgstr "" #: ../gtk/src/DisplayerToolSelect.cc:139 ../qt/src/DisplayerToolSelect.cc:135 msgid "Save Selection Image" msgstr "" #: ../gtk/src/DisplayerToolSelect.cc:139 ../qt/src/DisplayerToolSelect.cc:135 msgid "selection.png" msgstr "" #: ../gtk/src/DisplayerToolSelect.cc:146 ../qt/src/DisplayerToolSelect.cc:142 msgid "Recognize all" msgstr "" #: ../gtk/src/DisplayerToolSelect.cc:146 ../qt/src/DisplayerToolSelect.cc:142 msgid "Recognize selection" msgstr "" #: ../gtk/src/DisplayerToolSelect.cc:186 ../qt/src/DisplayerToolSelect.cc:182 msgid "Performing layout analysis" msgstr "" #: ../gtk/src/FileDialogs.cc:235 msgid "" "A file named \"%1\" already exists. Are you sure you want to overwrite it?" msgstr "" #: ../gtk/src/FileDialogs.cc:237 msgid "Overwrite File?" msgstr "" #: ../gtk/src/hocr/HOCRDocument.cc:611 ../gtk/src/hocr/OutputEditorHOCR.cc:266 #: ../qt/src/hocr/OutputEditorHOCR.cc:229 msgid "Page" msgstr "" #: ../gtk/src/hocr/HOCRDocument.cc:613 ../qt/src/hocr/HOCRDocument.cc:530 msgid "Text block" msgstr "" #: ../gtk/src/hocr/HOCRDocument.cc:615 ../gtk/src/hocr/OutputEditorHOCR.cc:272 #: ../qt/src/hocr/HOCRDocument.cc:532 ../qt/src/hocr/OutputEditorHOCR.cc:231 msgid "Paragraph" msgstr "" #: ../gtk/src/hocr/HOCRDocument.cc:617 ../qt/src/hocr/HOCRDocument.cc:534 msgid "Textline" msgstr "" #: ../gtk/src/hocr/HOCRDocument.cc:621 ../qt/src/hocr/HOCRDocument.cc:538 msgid "Graphic" msgstr "" #: ../gtk/src/hocr/HOCROdtExporter.cc:65 ../gtk/src/hocr/HOCRPdfExporter.cc:489 #: ../gtk/src/hocr/HOCRTextExporter.cc:34 #: ../gtk/src/hocr/OutputEditorHOCR.cc:963 ../gtk/src/OutputEditorText.cc:272 #: ../qt/src/hocr/HOCROdtExporter.cc:50 ../qt/src/hocr/HOCRPdfExporter.cc:478 #: ../qt/src/hocr/HOCRTextExporter.cc:36 ../qt/src/hocr/OutputEditorHOCR.cc:830 #: ../qt/src/OutputEditorText.cc:238 msgid "output" msgstr "" #: ../gtk/src/hocr/HOCROdtExporter.cc:68 ../qt/src/hocr/HOCROdtExporter.cc:53 msgid "OpenDocument Text Documents" msgstr "" #: ../gtk/src/hocr/HOCROdtExporter.cc:69 ../qt/src/hocr/HOCROdtExporter.cc:53 msgid "Save ODT Output..." msgstr "" #: ../gtk/src/hocr/HOCROdtExporter.cc:77 ../gtk/src/hocr/HOCROdtExporter.cc:342 #: ../gtk/src/hocr/HOCRPdfExporter.cc:619 #: ../gtk/src/hocr/HOCRTextExporter.cc:46 ../qt/src/hocr/HOCROdtExporter.cc:61 #: ../qt/src/hocr/HOCRPdfExporter.cc:609 ../qt/src/hocr/HOCRTextExporter.cc:47 msgid "Export failed" msgstr "" #: ../gtk/src/hocr/HOCROdtExporter.cc:77 ../gtk/src/hocr/HOCROdtExporter.cc:342 #: ../qt/src/hocr/HOCROdtExporter.cc:61 msgid "The ODT export failed: unable to write output file." msgstr "" #: ../gtk/src/hocr/HOCROdtExporter.cc:336 ../qt/src/hocr/HOCROdtExporter.cc:254 msgid "Exporting to ODT..." msgstr "" #: ../gtk/src/hocr/HOCRPdfExporter.cc:283 ../qt/src/hocr/HOCRPdfExporter.cc:365 msgid "Same as source" msgstr "" #: ../gtk/src/hocr/HOCRPdfExporter.cc:286 ../qt/src/hocr/HOCRPdfExporter.cc:366 msgid "Custom" msgstr "" #: ../gtk/src/hocr/HOCRPdfExporter.cc:300 ../qt/src/hocr/HOCRPdfExporter.cc:362 msgid "cm" msgstr "" #: ../gtk/src/hocr/HOCRPdfExporter.cc:303 ../qt/src/hocr/HOCRPdfExporter.cc:363 msgid "in" msgstr "" #: ../gtk/src/hocr/HOCRPdfExporter.cc:319 ../qt/src/hocr/HOCRPdfExporter.cc:353 msgid "Monochrome" msgstr "" #: ../gtk/src/hocr/HOCRPdfExporter.cc:328 ../qt/src/hocr/HOCRPdfExporter.cc:355 msgid "Threshold (closest color)" msgstr "" #: ../gtk/src/hocr/HOCRPdfExporter.cc:331 ../qt/src/hocr/HOCRPdfExporter.cc:356 msgid "Diffuse" msgstr "" #: ../gtk/src/hocr/HOCRPdfExporter.cc:340 ../qt/src/hocr/HOCRPdfExporter.cc:357 msgid "Zip (lossless)" msgstr "" #: ../gtk/src/hocr/HOCRPdfExporter.cc:344 ../qt/src/hocr/HOCRPdfExporter.cc:358 msgid "CCITT Group 4 (lossless)" msgstr "" #: ../gtk/src/hocr/HOCRPdfExporter.cc:348 ../qt/src/hocr/HOCRPdfExporter.cc:359 msgid "Jpeg (lossy)" msgstr "" #: ../gtk/src/hocr/HOCRPdfExporter.cc:493 ../qt/src/hocr/HOCRPdfExporter.cc:482 msgid "PDF Files" msgstr "" #: ../gtk/src/hocr/HOCRPdfExporter.cc:494 ../qt/src/hocr/HOCRPdfExporter.cc:482 msgid "Save PDF Output..." msgstr "" #: ../gtk/src/hocr/HOCRPdfExporter.cc:500 ../qt/src/hocr/HOCRPdfExporter.cc:488 msgid "Invalid Output" msgstr "" #: ../gtk/src/hocr/HOCRPdfExporter.cc:500 ../qt/src/hocr/HOCRPdfExporter.cc:488 msgid "Cannot overwrite a file which is a source image of this document." msgstr "" #: ../gtk/src/hocr/HOCRPdfExporter.cc:516 ../qt/src/hocr/HOCRPdfExporter.cc:511 msgid "Failed to create output" msgstr "" #: ../gtk/src/hocr/HOCRPdfExporter.cc:516 ../qt/src/hocr/HOCRPdfExporter.cc:511 msgid "Failed to create output. The returned error was: %1" msgstr "" #: ../gtk/src/hocr/HOCRPdfExporter.cc:558 ../qt/src/hocr/HOCRPdfExporter.cc:551 msgid "The operation was cancelled" msgstr "" #: ../gtk/src/hocr/HOCRPdfExporter.cc:607 ../qt/src/hocr/HOCRPdfExporter.cc:597 msgid "Failed to render page %1" msgstr "" #: ../gtk/src/hocr/HOCRPdfExporter.cc:614 ../qt/src/hocr/HOCRPdfExporter.cc:604 msgid "Exporting to PDF..." msgstr "" #: ../gtk/src/hocr/HOCRPdfExporter.cc:619 ../qt/src/hocr/HOCRPdfExporter.cc:609 msgid "The PDF export failed: %1." msgstr "" #: ../gtk/src/hocr/HOCRPdfExporter.cc:673 ../qt/src/hocr/HOCRPdfExporter.cc:662 msgid "The PDF library could not load the font '%1'." msgstr "" #: ../gtk/src/hocr/HOCRTextExporter.cc:37 ../gtk/src/OutputEditorText.cc:274 #: ../qt/src/hocr/HOCRTextExporter.cc:39 ../qt/src/OutputEditorText.cc:239 msgid "Text Files" msgstr "" #: ../gtk/src/hocr/HOCRTextExporter.cc:38 ../qt/src/hocr/HOCRTextExporter.cc:39 msgid "Save Text Output..." msgstr "" #: ../gtk/src/hocr/HOCRTextExporter.cc:46 ../qt/src/hocr/HOCRTextExporter.cc:47 msgid "The text export failed: unable to write output file." msgstr "" #: ../gtk/src/hocr/OutputEditorHOCR.cc:269 #: ../qt/src/hocr/OutputEditorHOCR.cc:230 msgid "Block" msgstr "" #: ../gtk/src/hocr/OutputEditorHOCR.cc:275 #: ../qt/src/hocr/OutputEditorHOCR.cc:232 msgid "Line" msgstr "" #: ../gtk/src/hocr/OutputEditorHOCR.cc:278 #: ../qt/src/hocr/OutputEditorHOCR.cc:233 msgid "Word" msgstr "" #: ../gtk/src/hocr/OutputEditorHOCR.cc:281 #: ../qt/src/hocr/OutputEditorHOCR.cc:234 msgid "Misspelled word" msgstr "" #: ../gtk/src/hocr/OutputEditorHOCR.cc:435 #: ../qt/src/hocr/OutputEditorHOCR.cc:317 msgid "" "The following pages could not be processed:\n" "%1" msgstr "" #: ../gtk/src/hocr/OutputEditorHOCR.cc:436 #: ../qt/src/hocr/OutputEditorHOCR.cc:318 msgid "Recognition errors" msgstr "" #: ../gtk/src/hocr/OutputEditorHOCR.cc:594 #: ../qt/src/hocr/OutputEditorHOCR.cc:500 #: ../qt/src/hocr/OutputEditorHOCR.cc:512 msgid "Multiple values" msgstr "" #. Merging allowed #: ../gtk/src/hocr/OutputEditorHOCR.cc:778 #: ../qt/src/hocr/OutputEditorHOCR.cc:641 msgid "Merge" msgstr "" #: ../gtk/src/hocr/OutputEditorHOCR.cc:786 #: ../gtk/src/hocr/OutputEditorHOCR.cc:877 #: ../qt/src/hocr/OutputEditorHOCR.cc:643 #: ../qt/src/hocr/OutputEditorHOCR.cc:725 msgid "Split from parent" msgstr "" #. Swapping allowed #: ../gtk/src/hocr/OutputEditorHOCR.cc:797 #: ../qt/src/hocr/OutputEditorHOCR.cc:647 msgid "Swap" msgstr "" #: ../gtk/src/hocr/OutputEditorHOCR.cc:821 #: ../qt/src/hocr/OutputEditorHOCR.cc:693 msgid "Add graphic region" msgstr "" #: ../gtk/src/hocr/OutputEditorHOCR.cc:824 #: ../qt/src/hocr/OutputEditorHOCR.cc:694 msgid "Add text block" msgstr "" #: ../gtk/src/hocr/OutputEditorHOCR.cc:828 #: ../qt/src/hocr/OutputEditorHOCR.cc:696 msgid "Add paragraph" msgstr "" #: ../gtk/src/hocr/OutputEditorHOCR.cc:832 #: ../qt/src/hocr/OutputEditorHOCR.cc:698 msgid "Add line" msgstr "" #: ../gtk/src/hocr/OutputEditorHOCR.cc:836 #: ../qt/src/hocr/OutputEditorHOCR.cc:700 msgid "Add word" msgstr "" #: ../gtk/src/hocr/OutputEditorHOCR.cc:852 #: ../qt/src/hocr/OutputEditorHOCR.cc:710 msgid "No suggestions" msgstr "" #: ../gtk/src/hocr/OutputEditorHOCR.cc:858 #: ../qt/src/hocr/OutputEditorHOCR.cc:714 msgid "Add to dictionary" msgstr "" #: ../gtk/src/hocr/OutputEditorHOCR.cc:864 #: ../qt/src/hocr/OutputEditorHOCR.cc:716 msgid "Ignore word" msgstr "" #: ../gtk/src/hocr/OutputEditorHOCR.cc:926 #: ../gtk/src/hocr/OutputEditorHOCR.cc:965 #: ../qt/src/hocr/OutputEditorHOCR.cc:795 #: ../qt/src/hocr/OutputEditorHOCR.cc:832 msgid "hOCR HTML Files" msgstr "" #: ../gtk/src/hocr/OutputEditorHOCR.cc:927 #: ../qt/src/hocr/OutputEditorHOCR.cc:795 msgid "Open hOCR File" msgstr "" #: ../gtk/src/hocr/OutputEditorHOCR.cc:936 #: ../qt/src/hocr/OutputEditorHOCR.cc:802 msgid "Failed to open file" msgstr "" #: ../gtk/src/hocr/OutputEditorHOCR.cc:936 #: ../qt/src/hocr/OutputEditorHOCR.cc:802 msgid "The file could not be opened: %1." msgstr "" #: ../gtk/src/hocr/OutputEditorHOCR.cc:945 #: ../qt/src/hocr/OutputEditorHOCR.cc:809 msgid "Invalid hOCR file" msgstr "" #: ../gtk/src/hocr/OutputEditorHOCR.cc:945 #: ../qt/src/hocr/OutputEditorHOCR.cc:809 msgid "The file does not appear to contain valid hOCR HTML: %1" msgstr "" #: ../gtk/src/hocr/OutputEditorHOCR.cc:966 #: ../qt/src/hocr/OutputEditorHOCR.cc:832 msgid "Save hOCR Output..." msgstr "" #: ../gtk/src/hocr/OutputEditorHOCR.cc:973 ../gtk/src/OutputEditorText.cc:282 #: ../qt/src/hocr/OutputEditorHOCR.cc:839 ../qt/src/OutputEditorText.cc:246 msgid "Failed to save output" msgstr "" #: ../gtk/src/hocr/OutputEditorHOCR.cc:973 ../gtk/src/OutputEditorText.cc:282 #: ../qt/src/hocr/OutputEditorHOCR.cc:839 ../qt/src/OutputEditorText.cc:246 msgid "Check that you have writing permissions in the selected folder." msgstr "" #: ../gtk/src/hocr/OutputEditorHOCR.cc:1035 ../gtk/src/OutputEditorText.cc:296 #: ../qt/src/hocr/OutputEditorHOCR.cc:894 ../qt/src/OutputEditorText.cc:259 msgid "Output not saved" msgstr "" #: ../gtk/src/hocr/OutputEditorHOCR.cc:1035 ../gtk/src/OutputEditorText.cc:296 #: ../qt/src/hocr/OutputEditorHOCR.cc:894 ../qt/src/OutputEditorText.cc:259 msgid "Save output before proceeding?" msgstr "" #: ../gtk/src/hocr/OutputEditorHOCR.cc:1156 ../gtk/src/OutputEditorText.cc:184 #: ../qt/src/hocr/OutputEditorHOCR.cc:991 ../qt/src/OutputEditorText.cc:152 msgid "Replacing..." msgstr "" #: ../gtk/src/hocr/OutputEditorHOCR.cc:1181 ../gtk/src/OutputEditorText.cc:192 #: ../qt/src/hocr/OutputEditorHOCR.cc:1014 ../qt/src/OutputEditorText.cc:160 msgid "Applying substitutions..." msgstr "" #: ../gtk/src/MainWindow.cc:131 ../qt/src/MainWindow.cc:295 msgid "Using tesseract" msgstr "" #: ../gtk/src/MainWindow.cc:178 ../qt/src/MainWindow.cc:194 msgid "Select an image to begin..." msgstr "" #: ../gtk/src/MainWindow.cc:293 ../qt/src/MainWindow.cc:278 msgid "Multiple sources" msgstr "" #: ../gtk/src/MainWindow.cc:295 ../qt/src/MainWindow.cc:280 msgid "Ready" msgstr "" #: ../gtk/src/MainWindow.cc:442 ../qt/src/MainWindow.cc:423 msgid "New version" msgstr "" #: ../gtk/src/MainWindow.cc:442 ../qt/src/MainWindow.cc:423 msgid "gImageReader %1 is available" msgstr "" #: ../gtk/src/MainWindow.cc:443 ../qt/src/MainWindow.cc:424 msgid "Download" msgstr "" #: ../gtk/src/MainWindow.cc:444 ../qt/src/MainWindow.cc:425 msgid "Changelog" msgstr "" #: ../gtk/src/MainWindow.cc:445 ../qt/src/MainWindow.cc:426 msgid "Don't notify again" msgstr "" #: ../gtk/src/MainWindow.cc:466 ../qt/src/MainWindow.cc:474 msgid "Don't show again" msgstr "" #: ../gtk/src/MainWindow.cc:467 ../gtk/src/MainWindow.cc:480 #: ../qt/src/MainWindow.cc:475 msgid "Install" msgstr "" #: ../gtk/src/MainWindow.cc:487 ../qt/src/MainWindow.cc:487 msgid "Spelling dictionary missing" msgstr "" #: ../gtk/src/MainWindow.cc:487 ../qt/src/MainWindow.cc:487 msgid "The spellcheck dictionary for %1 is not installed" msgstr "" #: ../gtk/src/MainWindow.cc:494 ../gtk/src/MainWindow.cc:523 #: ../qt/src/MainWindow.cc:493 msgid "Installing spelling dictionary for '%1'" msgstr "" #: ../gtk/src/MainWindow.cc:515 ../gtk/src/MainWindow.cc:536 #: ../gtk/src/MainWindow.cc:544 ../gtk/src/MainWindow.cc:592 #: ../gtk/src/MainWindow.cc:597 ../gtk/src/TessdataManager.cc:60 #: ../gtk/src/TessdataManager.cc:70 ../gtk/src/TessdataManager.cc:339 #: ../qt/src/MainWindow.cc:512 ../qt/src/MainWindow.cc:525 #: ../qt/src/MainWindow.cc:534 ../qt/src/MainWindow.cc:578 #: ../qt/src/MainWindow.cc:583 ../qt/src/TessdataManager.cc:74 #: ../qt/src/TessdataManager.cc:84 ../qt/src/TessdataManager.cc:315 msgid "Error" msgstr "" #: ../gtk/src/MainWindow.cc:515 ../qt/src/MainWindow.cc:512 msgid "Failed to install spelling dictionary: %1" msgstr "" #: ../gtk/src/MainWindow.cc:536 ../qt/src/MainWindow.cc:525 msgid "Failed to create directory for spelling dictionaries." msgstr "" #: ../gtk/src/MainWindow.cc:544 ../qt/src/MainWindow.cc:534 msgid "Could not read %1: %2." msgstr "" #: ../gtk/src/MainWindow.cc:571 ../qt/src/MainWindow.cc:558 msgid "Downloading '%1'..." msgstr "" #: ../gtk/src/MainWindow.cc:592 ../qt/src/MainWindow.cc:578 msgid "" "The following dictionaries could not be downloaded:\n" "%1\n" "\n" "Check the connectivity and directory permissions.\n" "Hint: If you don't have write permissions in system folders, you can switch " "to user paths in the settings dialog." msgstr "" #: ../gtk/src/MainWindow.cc:595 ../qt/src/MainWindow.cc:581 msgid "Dictionaries installed" msgstr "" #: ../gtk/src/MainWindow.cc:595 msgid "" "The following dictionaries were installed:\n" "%1" msgstr "" #: ../gtk/src/MainWindow.cc:597 ../qt/src/MainWindow.cc:583 msgid "No spelling dictionaries found for '%1'." msgstr "" #: ../gtk/src/OutputEditorText.cc:154 ../qt/src/OutputEditorText.cc:137 msgid "Stripping line breaks..." msgstr "" #: ../gtk/src/OutputEditorText.cc:162 msgid "Check spelling" msgstr "" #: ../gtk/src/OutputEditorText.cc:231 ../qt/src/OutputEditorText.cc:196 msgid "File: %1" msgstr "" #: ../gtk/src/OutputEditorText.cc:234 ../qt/src/OutputEditorText.cc:199 msgid "Page: %1" msgstr "" #: ../gtk/src/OutputEditorText.cc:247 ../gtk/src/Recognizer.cc:471 #: ../qt/src/Recognizer.cc:462 msgid "" "\n" "[Failed to recognize page %1]\n" msgstr "" #: ../gtk/src/OutputEditorText.cc:275 ../qt/src/OutputEditorText.cc:239 msgid "Save Output..." msgstr "" #: ../gtk/src/Recognizer.cc:179 ../qt/src/Recognizer.cc:172 msgid "No languages available" msgstr "" #: ../gtk/src/Recognizer.cc:179 ../qt/src/Recognizer.cc:172 msgid "" "No tesseract languages are available for use. Recognition will not work." msgstr "" #: ../gtk/src/Recognizer.cc:233 ../qt/src/Recognizer.cc:232 msgid "Multilingual" msgstr "" #: ../gtk/src/Recognizer.cc:285 ../qt/src/Recognizer.cc:277 msgid "Automatic page segmentation" msgstr "" #: ../gtk/src/Recognizer.cc:286 ../qt/src/Recognizer.cc:278 msgid "Page segmentation with orientation and script detection" msgstr "" #: ../gtk/src/Recognizer.cc:287 ../qt/src/Recognizer.cc:279 msgid "Assume single column of text" msgstr "" #: ../gtk/src/Recognizer.cc:288 ../qt/src/Recognizer.cc:280 msgid "Assume single block of vertically aligned text" msgstr "" #: ../gtk/src/Recognizer.cc:289 ../qt/src/Recognizer.cc:281 msgid "Assume a single uniform block of text" msgstr "" #: ../gtk/src/Recognizer.cc:290 ../qt/src/Recognizer.cc:282 msgid "Assume a line of text" msgstr "" #: ../gtk/src/Recognizer.cc:291 ../qt/src/Recognizer.cc:283 msgid "Assume a single word" msgstr "" #: ../gtk/src/Recognizer.cc:292 ../qt/src/Recognizer.cc:284 msgid "Assume a single word in a circle" msgstr "" #: ../gtk/src/Recognizer.cc:293 ../qt/src/Recognizer.cc:285 msgid "Sparse text in no particular order" msgstr "" #: ../gtk/src/Recognizer.cc:294 ../qt/src/Recognizer.cc:286 msgid "Sparse text with orientation and script detection" msgstr "" #: ../gtk/src/Recognizer.cc:309 ../qt/src/Recognizer.cc:297 msgid "Page segmentation mode" msgstr "" #: ../gtk/src/Recognizer.cc:313 ../qt/src/Recognizer.cc:300 msgid "Character whitelist / blacklist..." msgstr "" #: ../gtk/src/Recognizer.cc:319 ../qt/src/Recognizer.cc:305 msgid "Manage languages..." msgstr "" #: ../gtk/src/Recognizer.cc:375 ../qt/src/Recognizer.cc:369 msgid "Current selection" msgstr "" #: ../gtk/src/Recognizer.cc:465 ../qt/src/Recognizer.cc:455 msgid "Recognizing page %1 (%2 of %3)" msgstr "" #: ../gtk/src/Recognizer.cc:470 ../qt/src/Recognizer.cc:461 msgid "" "\n" "- Page %1: failed to render page" msgstr "" #: ../gtk/src/Recognizer.cc:501 ../gtk/src/Recognizer.cc:531 #: ../gtk/src/Recognizer.cc:544 ../qt/src/Recognizer.cc:491 #: ../qt/src/Recognizer.cc:521 ../qt/src/Recognizer.cc:534 msgid "Recognizing..." msgstr "" #: ../gtk/src/Recognizer.cc:505 ../gtk/src/Recognizer.cc:514 #: ../qt/src/Recognizer.cc:495 ../qt/src/Recognizer.cc:504 msgid "Recognition errors occurred" msgstr "" #: ../gtk/src/Recognizer.cc:505 ../qt/src/Recognizer.cc:495 msgid "The following errors occurred:%1" msgstr "" #: ../gtk/src/Recognizer.cc:514 ../qt/src/Recognizer.cc:504 msgid "Failed to initialize tesseract" msgstr "" #: ../gtk/src/scanner/ScannerSane.cc:84 ../gtk/src/scanner/ScannerTwain.cc:288 #: ../qt/src/scanner/ScannerSane.cc:85 ../qt/src/scanner/ScannerTwain.cc:286 msgid "Scan canceled" msgstr "" #: ../gtk/src/scanner/ScannerSane.cc:159 ../gtk/src/scanner/ScannerTwain.cc:186 #: ../qt/src/scanner/ScannerSane.cc:159 ../qt/src/scanner/ScannerTwain.cc:178 msgid "No scanner specified" msgstr "" #: ../gtk/src/scanner/ScannerSane.cc:168 ../gtk/src/scanner/ScannerTwain.cc:195 #: ../qt/src/scanner/ScannerSane.cc:168 ../qt/src/scanner/ScannerTwain.cc:187 msgid "Unable to connect to scanner" msgstr "" #: ../gtk/src/scanner/ScannerSane.cc:403 ../gtk/src/scanner/ScannerTwain.cc:266 #: ../gtk/src/scanner/ScannerTwain.cc:292 ../qt/src/scanner/ScannerSane.cc:403 #: ../qt/src/scanner/ScannerTwain.cc:258 ../qt/src/scanner/ScannerTwain.cc:290 msgid "Unable to start scan" msgstr "" #: ../gtk/src/scanner/ScannerSane.cc:411 ../gtk/src/scanner/ScannerSane.cc:461 #: ../gtk/src/scanner/ScannerTwain.cc:318 ../qt/src/scanner/ScannerSane.cc:411 #: ../qt/src/scanner/ScannerSane.cc:461 ../qt/src/scanner/ScannerTwain.cc:316 msgid "Error communicating with scanner" msgstr "" #: ../gtk/src/scanner/ScannerSane.cc:520 ../qt/src/scanner/ScannerSane.cc:517 msgid "Failed to save image" msgstr "" #: ../gtk/src/scanner/ScannerSane.cc:800 ../qt/src/scanner/ScannerSane.cc:797 msgid "Operation is cancelled." msgstr "" #: ../gtk/src/scanner/ScannerSane.cc:802 ../qt/src/scanner/ScannerSane.cc:799 msgid "Device is busy." msgstr "" #: ../gtk/src/scanner/ScannerSane.cc:804 ../qt/src/scanner/ScannerSane.cc:801 msgid "Cover is opened." msgstr "" #: ../gtk/src/scanner/ScannerSane.cc:806 ../qt/src/scanner/ScannerSane.cc:803 msgid "Document feeder jammed." msgstr "" #: ../gtk/src/scanner/ScannerSane.cc:808 ../qt/src/scanner/ScannerSane.cc:805 msgid "Document feeder out of documents." msgstr "" #: ../gtk/src/scanner/ScannerSane.cc:810 ../qt/src/scanner/ScannerSane.cc:807 msgid "Access to scanner is denied." msgstr "" #: ../gtk/src/SourceManager.cc:118 ../qt/src/SourceManager.cc:124 msgid "PDFs with text" msgstr "" #: ../gtk/src/SourceManager.cc:118 ../qt/src/SourceManager.cc:124 msgid "" "These PDF files already contain text:\n" "%1" msgstr "" #: ../gtk/src/SourceManager.cc:127 ../qt/src/SourceManager.cc:132 msgid "Unable to open files" msgstr "" #: ../gtk/src/SourceManager.cc:127 ../qt/src/SourceManager.cc:132 msgid "The following files could not be opened:%1" msgstr "" #: ../gtk/src/SourceManager.cc:141 ../qt/src/SourceManager.cc:143 msgid "Enter password for file '%1':" msgstr "" #: ../gtk/src/SourceManager.cc:197 ../qt/src/SourceManager.cc:214 msgid "Images and PDFs" msgstr "" #: ../gtk/src/SourceManager.cc:202 ../qt/src/SourceManager.cc:215 msgid "Select Files" msgstr "" #: ../gtk/src/SourceManager.cc:208 ../qt/src/SourceManager.cc:226 msgid "Clipboard Error" msgstr "" #: ../gtk/src/SourceManager.cc:208 ../qt/src/SourceManager.cc:226 msgid "Failed to read the clipboard." msgstr "" #: ../gtk/src/SourceManager.cc:212 ../qt/src/SourceManager.cc:230 #: ../qt/src/SourceManager.cc:236 msgid "Pasted %1" msgstr "" #: ../gtk/src/SourceManager.cc:224 ../qt/src/SourceManager.cc:243 msgid "Screenshot Error" msgstr "" #: ../gtk/src/SourceManager.cc:224 ../qt/src/SourceManager.cc:243 msgid "Failed to take screenshot." msgstr "" #: ../gtk/src/SourceManager.cc:228 ../qt/src/SourceManager.cc:247 msgid "Screenshot %1" msgstr "" #: ../gtk/src/SourceManager.cc:233 ../qt/src/SourceManager.cc:252 msgid "Saving image..." msgstr "" #: ../gtk/src/SourceManager.cc:240 ../qt/src/SourceManager.cc:265 msgid "Cannot Write File" msgstr "" #: ../gtk/src/SourceManager.cc:240 ../qt/src/SourceManager.cc:265 msgid "Could not write to %1." msgstr "" #: ../gtk/src/SourceManager.cc:267 ../qt/src/SourceManager.cc:287 msgid "Delete File?" msgstr "" #: ../gtk/src/SourceManager.cc:267 ../qt/src/SourceManager.cc:287 msgid "The following files will be deleted:%1" msgstr "" #: ../gtk/src/SourceManager.cc:332 ../qt/src/SourceManager.cc:338 msgid "Missing File" msgstr "" #: ../gtk/src/SourceManager.cc:332 ../qt/src/SourceManager.cc:338 msgid "" "The following file has been deleted or moved:\n" "%1" msgstr "" #: ../gtk/src/SubstitutionsManager.cc:33 ../qt/src/SubstitutionsManager.cc:73 msgid "Search for" msgstr "" #: ../gtk/src/SubstitutionsManager.cc:34 ../qt/src/SubstitutionsManager.cc:73 msgid "Replace with" msgstr "" #: ../gtk/src/SubstitutionsManager.cc:69 ../gtk/src/SubstitutionsManager.cc:103 #: ../qt/src/SubstitutionsManager.cc:106 ../qt/src/SubstitutionsManager.cc:143 msgid "Substitutions List" msgstr "" #: ../gtk/src/SubstitutionsManager.cc:70 ../qt/src/SubstitutionsManager.cc:106 msgid "Open Substitutions List" msgstr "" #: ../gtk/src/SubstitutionsManager.cc:75 ../qt/src/SubstitutionsManager.cc:112 msgid "Error Reading File" msgstr "" #: ../gtk/src/SubstitutionsManager.cc:75 ../qt/src/SubstitutionsManager.cc:112 msgid "Unable to read '%1'." msgstr "" #: ../gtk/src/SubstitutionsManager.cc:97 ../qt/src/SubstitutionsManager.cc:137 msgid "Errors Occurred Reading File" msgstr "" #: ../gtk/src/SubstitutionsManager.cc:97 ../qt/src/SubstitutionsManager.cc:137 msgid "Some entries of the substitutions list could not be read." msgstr "" #: ../gtk/src/SubstitutionsManager.cc:104 ../qt/src/SubstitutionsManager.cc:143 msgid "Save Substitutions List" msgstr "" #: ../gtk/src/SubstitutionsManager.cc:110 ../qt/src/SubstitutionsManager.cc:149 msgid "Error Saving File" msgstr "" #: ../gtk/src/SubstitutionsManager.cc:110 ../qt/src/SubstitutionsManager.cc:149 msgid "Unable to write to '%1'." msgstr "" #: ../gtk/src/SubstitutionsManager.cc:127 ../qt/src/SubstitutionsManager.cc:162 msgid "Save List?" msgstr "" #: ../gtk/src/SubstitutionsManager.cc:127 ../qt/src/SubstitutionsManager.cc:162 msgid "Do you want to save the current list?" msgstr "" #: ../gtk/src/TessdataManager.cc:60 ../qt/src/TessdataManager.cc:74 msgid "" "A session connection to the PackageKit backend is required for managing " "system-wide tesseract language packs, but it was not found. This service is " "usually provided by a software-management application such as Gnome " "Software. Please install software which provides the necessary PackageKit " "interface, use other system package management software to manage the " "tesseract language packs directly, or switch to using the user tessdata path " "in the configuration dialog." msgstr "" #: ../gtk/src/TessdataManager.cc:65 ../qt/src/TessdataManager.cc:79 msgid "Fetching available languages" msgstr "" #: ../gtk/src/TessdataManager.cc:70 ../gtk/src/TessdataManager.cc:96 #: ../gtk/src/TessdataManager.cc:197 ../qt/src/TessdataManager.cc:84 #: ../qt/src/TessdataManager.cc:101 ../qt/src/TessdataManager.cc:197 msgid "Failed to fetch list of available languages: %1" msgstr "" #: ../gtk/src/TessdataManager.cc:104 ../qt/src/TessdataManager.cc:113 #: ../qt/src/TessdataManager.cc:122 msgid "Parsing error: %1" msgstr "" #: ../gtk/src/TessdataManager.cc:235 ../qt/src/TessdataManager.cc:232 msgid "Applying changes..." msgstr "" #: ../gtk/src/TessdataManager.cc:297 ../qt/src/TessdataManager.cc:278 msgid "Failed to create directory for tessdata files." msgstr "" #: ../gtk/src/TessdataManager.cc:306 ../qt/src/TessdataManager.cc:287 msgid "Downloading %1..." msgstr "" #: ../gtk/src/TessdataManager.cc:330 msgid "" "The following files could not be downloaded or removed:\n" "%1\n" "\n" "Check the connectivity and directory permissions.\n" "\n" "Hint: If you don't have write permissions in system folders, you can switch " "to user paths in the settings dialog." msgstr "" #: ../gtk/src/Utils.cc:64 msgid "Yes" msgstr "" #: ../gtk/src/Utils.cc:67 msgid "No" msgstr "" #: ../gtk/src/Utils.cc:76 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/CrashHandler.ui.h:3 msgid "" "

Tesseract has " "aborted

Tesseract (the OCR engine) has aborted while " "recognizing text. This may occur if the used traineddatas are corrupt or " "incomplatible with the version of tesseract in use, or due to a bug in " "tesseract.

The stacktrace below may provide additional information " "about where the crash occured.

" msgstr "" #: ../qt/data/MainWindow.ui.h:17 msgid "Flatbed" msgstr "" #: ../qt/data/MainWindow.ui.h:18 msgid "ADF Front" msgstr "" #: ../qt/data/MainWindow.ui.h:19 msgid "ADF Back" msgstr "" #: ../qt/data/MainWindow.ui.h:20 msgid "ADF Duplex" msgstr "" #. Remove & from some labels which designer insists in adding #: ../qt/data/MainWindow.ui.h:21 ../qt/src/Ui_MainWindow.hh:50 msgid "Sources" msgstr "" #: ../qt/data/MainWindow.ui.h:22 msgid "Zoom In" msgstr "" #: ../qt/data/MainWindow.ui.h:24 msgid "Zoom Out" msgstr "" #: ../qt/data/MainWindow.ui.h:26 msgid "Normal Size" msgstr "" #: ../qt/data/MainWindow.ui.h:28 msgid "Best Fit" msgstr "" #: ../qt/data/MainWindow.ui.h:30 msgid "Rotate Left" msgstr "" #: ../qt/data/MainWindow.ui.h:31 msgid "Rotate left" msgstr "" #: ../qt/data/MainWindow.ui.h:32 msgid "Rotate Right" msgstr "" #: ../qt/data/MainWindow.ui.h:33 msgid "Rotate right" msgstr "" #: ../qt/data/MainWindow.ui.h:34 msgid "Image Controls" msgstr "" #: ../qt/data/MainWindow.ui.h:36 msgid "Autodetect Layout" msgstr "" #: ../qt/data/MainWindow.ui.h:38 msgid "Toggle Output Pane" msgstr "" #: ../qt/data/PdfExportDialog.ui.h:5 msgid "Backend:" msgstr "" #: ../qt/data/PdfExportDialog.ui.h:8 msgid "Portrait" msgstr "" #: ../qt/data/PdfExportDialog.ui.h:9 msgid "Landscape" msgstr "" #: ../qt/src/hocr/HOCRPdfExporter.cc:142 msgid "Failed to write to file" msgstr "" #. Output toolbar #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:55 #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:56 msgid "Open hOCR file" msgstr "" #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:57 #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:58 msgid "Save as hOCR text" msgstr "" #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:79 #: ../qt/src/Ui_OutputEditorText.hh:106 msgid "Find and Replace" msgstr "" #: ../qt/src/MainWindow.cc:581 msgid "" "The following dictionary files were installed:\n" "%1" msgstr "" #: ../qt/src/TessdataManager.cc:308 msgid "" "The following files could not be downloaded or removed:\n" "%1\n" "\n" "Check the connectivity and directory permissions.\n" "Hint: If you don't have write permissions in system folders, you can switch " "to user paths in the settings dialog." msgstr "" #: ../qt/src/Ui_MainWindow.hh:51 msgid "Output" msgstr "" #: ../qt/src/Ui_MainWindow.hh:135 msgid "OCR mode:" msgstr "" #: ../qt/src/Ui_MainWindow.hh:209 msgid "Remove Image" msgstr "" #: ../qt/src/Ui_MainWindow.hh:212 msgid "Delete Image" msgstr "" #: ../qt/src/Ui_MainWindow.hh:215 msgid "Clear List" msgstr "" #: ../qt/src/Ui_OutputEditorText.hh:101 msgid "Strip Line Breaks" msgstr "" #: ../qt/src/Ui_OutputEditorText.hh:115 msgid "Save Output" msgstr "" #: ../qt/src/Ui_OutputEditorText.hh:117 msgid "Clear Output" msgstr "" #~ msgid "The application has crashed" #~ msgstr "à¤à¤ªà¥à¤²à¤¿à¤•ेशन कà¥à¤°à¥ˆà¤¶ हो गयी" gImageReader-3.3.1/po/ie.po000066400000000000000000001535471351740627400154350ustar00rootroot00000000000000# 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. # msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2019-07-25 23:18+0200\n" "PO-Revision-Date: 2018-08-19 10:40+0000\n" "Last-Translator: OIS \n" "Language-Team: Occidental \n" "Language: ie\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" "X-Generator: Weblate 3.2-dev\n" #: ../data/gimagereader.desktop.in.h:1 msgid "OCR application" msgstr "Application OCR" #: ../gtk/data/appmenu.ui.h:1 ../qt/src/Ui_MainWindow.hh:167 msgid "Redetect Languages" msgstr "Redetecter lingues" #: ../gtk/data/appmenu.ui.h:2 ../qt/src/Ui_MainWindow.hh:170 msgid "Manage Languages" msgstr "Redacter li lingues" #: ../gtk/data/appmenu.ui.h:3 ../gtk/data/ConfigDialog.ui.h:1 #: ../qt/data/ConfigDialog.ui.h:1 ../qt/src/Ui_MainWindow.hh:173 msgid "Preferences" msgstr "Preferenties" #: ../gtk/data/appmenu.ui.h:4 ../gtk/data/ConfigDialog.ui.h:2 #: ../gtk/src/MainWindow.cc:482 ../qt/src/MainWindow.cc:481 #: ../qt/src/Ui_MainWindow.hh:178 msgid "Help" msgstr "Auxilie" #: ../gtk/data/appmenu.ui.h:5 ../qt/data/AboutDialog.ui.h:2 #: ../qt/src/Ui_MainWindow.hh:181 msgid "About" msgstr "Pri" #: ../gtk/data/appmenu.ui.h:6 msgid "Quit" msgstr "Salir" #: ../gtk/data/ConfigDialog.ui.h:3 ../gtk/data/MainWindow.ui.h:47 #: ../gtk/data/OutputEditorHOCR.ui.h:3 ../gtk/data/PdfExportDialog.ui.h:3 #: ../gtk/src/FileDialogs.cc:152 ../gtk/src/Utils.cc:61 #: ../qt/data/ConfigDialog.ui.h:26 msgid "OK" msgstr "OK" #: ../gtk/data/ConfigDialog.ui.h:4 msgid "Output pane orientation:" msgstr "" #: ../gtk/data/ConfigDialog.ui.h:5 msgid "Horizontal" msgstr "Horizontal" #: ../gtk/data/ConfigDialog.ui.h:6 msgid "Vertical" msgstr "Vertical" #: ../gtk/data/ConfigDialog.ui.h:7 ../qt/data/ConfigDialog.ui.h:18 msgid "Query to install missing spellcheck dictionaries" msgstr "Proposir installar mancant ortografic dictionariums" #: ../gtk/data/ConfigDialog.ui.h:8 ../qt/data/ConfigDialog.ui.h:4 msgid "Automatically check for new program versions" msgstr "Automaticmen controlar nov versiones del programma" #: ../gtk/data/ConfigDialog.ui.h:9 ../qt/data/ConfigDialog.ui.h:3 msgid "Predefined language definitions:" msgstr "" #: ../gtk/data/ConfigDialog.ui.h:10 ../qt/data/ConfigDialog.ui.h:12 msgid "Additional language definitions:" msgstr "" #: ../gtk/data/ConfigDialog.ui.h:11 ../qt/data/ConfigDialog.ui.h:20 msgid "The prefix of the tesseract language data file" msgstr "" #: ../gtk/data/ConfigDialog.ui.h:12 ../qt/data/ConfigDialog.ui.h:21 msgid "Prefix" msgstr "Prefix" #: ../gtk/data/ConfigDialog.ui.h:13 ../qt/data/ConfigDialog.ui.h:22 msgid "The ISO 639-1 language code followed by the country code" msgstr "" #: ../gtk/data/ConfigDialog.ui.h:14 ../qt/data/ConfigDialog.ui.h:23 msgid "ISO Code" msgstr "Code ISO" #: ../gtk/data/ConfigDialog.ui.h:15 ../qt/data/ConfigDialog.ui.h:24 msgid "The name of the language" msgstr "Li nómine del lingue" #: ../gtk/data/ConfigDialog.ui.h:16 ../qt/data/ConfigDialog.ui.h:25 msgid "Name" msgstr "Nómine" #: ../gtk/data/ConfigDialog.ui.h:17 ../gtk/data/MainWindow.ui.h:46 #: ../gtk/data/OutputEditorHOCR.ui.h:2 ../gtk/data/PdfExportDialog.ui.h:2 #: ../gtk/src/Acquirer.cc:34 ../gtk/src/FileDialogs.cc:151 #: ../gtk/src/Utils.cc:70 ../qt/data/ConfigDialog.ui.h:27 #: ../qt/data/MainWindow.ui.h:12 msgid "Cancel" msgstr "Anullar" #: ../gtk/data/ConfigDialog.ui.h:18 ../qt/data/ConfigDialog.ui.h:5 msgid "Output pane font:" msgstr "" #: ../gtk/data/ConfigDialog.ui.h:19 ../qt/data/ConfigDialog.ui.h:2 msgid "Default" msgstr "Predefinit" #: ../gtk/data/ConfigDialog.ui.h:20 ../qt/data/ConfigDialog.ui.h:6 msgid "Language data locations:" msgstr "" #: ../gtk/data/ConfigDialog.ui.h:21 ../qt/data/ConfigDialog.ui.h:13 msgid "Language definitions path:" msgstr "" #: ../gtk/data/ConfigDialog.ui.h:22 ../qt/data/ConfigDialog.ui.h:28 msgid "Spelling dictionaries path:" msgstr "" #: ../gtk/data/ConfigDialog.ui.h:23 ../qt/data/ConfigDialog.ui.h:10 msgid "System-wide paths" msgstr "Rutes del sistema" #: ../gtk/data/ConfigDialog.ui.h:24 ../qt/data/ConfigDialog.ui.h:11 msgid "User paths" msgstr "Rutes de usator" #: ../gtk/data/ConfigDialog.ui.h:25 ../qt/data/ConfigDialog.ui.h:29 msgid "Automatically open exported documents with default application" msgstr "" #: ../gtk/data/CrashHandler.ui.h:1 ../qt/src/CrashHandler.cc:38 msgid "Regenerate backtrace" msgstr "" #: ../gtk/data/CrashHandler.ui.h:3 #, no-c-format msgid "" "The application has crashed\n" "\n" "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/CrashHandler.ui.h:6 msgid "" "Tesseract has aborted\n" "\n" "Tesseract (the OCR engine) has aborted while recognizing text. This may " "occur if the used traineddatas are corrupt or incomplatible with the version " "of tesseract in use, or due to a bug in tesseract.\n" "\n" "The stacktrace below may provide additional information about where the " "crash occured.\n" msgstr "" #: ../gtk/data/MainWindow.ui.h:1 ../qt/data/MainWindow.ui.h:39 msgid "Toggle output pane" msgstr "" #: ../gtk/data/MainWindow.ui.h:2 ../qt/src/Ui_MainWindow.hh:66 msgid "Rotate current page" msgstr "Rotar li actual págine" #: ../gtk/data/MainWindow.ui.h:3 ../qt/src/Ui_MainWindow.hh:67 msgid "Rotate all pages" msgstr "Rotar omni págines" #. Sources toolbar #: ../gtk/data/MainWindow.ui.h:4 ../qt/src/Ui_MainWindow.hh:192 msgid "Recent" msgstr "Recent" #: ../gtk/data/MainWindow.ui.h:5 ../qt/src/Ui_MainWindow.hh:193 msgid "Paste" msgstr "Collar" #: ../gtk/data/MainWindow.ui.h:6 ../qt/src/Ui_MainWindow.hh:194 msgid "Take Screenshot" msgstr "Capturar li ecran" #: ../gtk/data/MainWindow.ui.h:7 ../qt/data/MainWindow.ui.h:23 msgid "Zoom in" msgstr "" #: ../gtk/data/MainWindow.ui.h:8 ../qt/data/MainWindow.ui.h:25 msgid "Zoom out" msgstr "" #: ../gtk/data/MainWindow.ui.h:9 ../qt/data/MainWindow.ui.h:27 msgid "Normal size" msgstr "" #: ../gtk/data/MainWindow.ui.h:10 ../qt/data/MainWindow.ui.h:29 msgid "Best fit" msgstr "" #: ../gtk/data/MainWindow.ui.h:11 ../qt/src/Ui_MainWindow.hh:75 msgid "Select rotation mode" msgstr "" #: ../gtk/data/MainWindow.ui.h:12 ../gtk/data/OutputEditorText.ui.h:13 #: ../qt/src/Ui_OutputEditorText.hh:95 msgid "Select insert mode" msgstr "" #: ../gtk/data/MainWindow.ui.h:13 ../qt/src/Ui_MainWindow.hh:109 #, fuzzy msgid "Select page" msgstr "Selecter un lingue" #: ../gtk/data/MainWindow.ui.h:14 ../qt/data/MainWindow.ui.h:35 msgid "Image controls" msgstr "" #: ../gtk/data/MainWindow.ui.h:15 ../qt/src/Ui_MainWindow.hh:139 msgid "Plain text" msgstr "" #: ../gtk/data/MainWindow.ui.h:16 ../qt/src/Ui_MainWindow.hh:139 msgid "hOCR, PDF" msgstr "hOCR, PDF" #: ../gtk/data/MainWindow.ui.h:17 ../qt/data/MainWindow.ui.h:37 msgid "Autodetect layout" msgstr "" #: ../gtk/data/MainWindow.ui.h:18 msgid "Recognize all" msgstr "" #: ../gtk/data/MainWindow.ui.h:19 msgid "Select language" msgstr "Selecter un lingue" #: ../gtk/data/MainWindow.ui.h:20 ../qt/src/Ui_MainWindow.hh:205 msgid "Add images" msgstr "" #: ../gtk/data/MainWindow.ui.h:21 ../qt/src/Ui_MainWindow.hh:204 msgid "Add Images" msgstr "" #: ../gtk/data/MainWindow.ui.h:22 ../qt/src/Ui_MainWindow.hh:210 msgid "Remove image from list" msgstr "" #: ../gtk/data/MainWindow.ui.h:23 ../qt/src/Ui_MainWindow.hh:213 msgid "Delete image" msgstr "" #: ../gtk/data/MainWindow.ui.h:24 ../qt/src/Ui_MainWindow.hh:216 msgid "Clear list" msgstr "" #: ../gtk/data/MainWindow.ui.h:25 ../qt/data/MainWindow.ui.h:5 msgid "Files" msgstr "Files" #: ../gtk/data/MainWindow.ui.h:26 ../qt/data/MainWindow.ui.h:8 msgid "Device:" msgstr "Aparate:" #: ../gtk/data/MainWindow.ui.h:27 ../gtk/data/TessdataManager.ui.h:4 #: ../qt/data/MainWindow.ui.h:7 ../qt/src/TessdataManager.cc:59 msgid "Refresh" msgstr "Refriscar" #: ../gtk/data/MainWindow.ui.h:28 ../qt/data/MainWindow.ui.h:9 msgid "Output:" msgstr "" #: ../gtk/data/MainWindow.ui.h:29 ../qt/data/MainWindow.ui.h:13 msgid "Mode:" msgstr "Mode:" #: ../gtk/data/MainWindow.ui.h:30 ../gtk/src/hocr/HOCRPdfExporter.cc:313 #: ../qt/data/MainWindow.ui.h:15 ../qt/src/hocr/HOCRPdfExporter.cc:347 msgid "Color" msgstr "Color" #: ../gtk/data/MainWindow.ui.h:31 ../gtk/src/hocr/HOCRPdfExporter.cc:316 #: ../qt/data/MainWindow.ui.h:14 ../qt/src/hocr/HOCRPdfExporter.cc:349 #: ../qt/src/hocr/HOCRPdfExporter.cc:351 msgid "Grayscale" msgstr "" #: ../gtk/data/MainWindow.ui.h:32 ../qt/data/MainWindow.ui.h:10 msgid "Resolution:" msgstr "Resolution:" #: ../gtk/data/MainWindow.ui.h:33 ../qt/data/MainWindow.ui.h:11 msgid "Scan" msgstr "" #: ../gtk/data/MainWindow.ui.h:34 ../qt/data/MainWindow.ui.h:16 msgid "Source:" msgstr "" #: ../gtk/data/MainWindow.ui.h:35 ../qt/data/MainWindow.ui.h:6 msgid "Acquire" msgstr "" #: ../gtk/data/MainWindow.ui.h:36 ../qt/data/MainWindow.ui.h:1 msgid "Brightness" msgstr "Luciditá" #: ../gtk/data/MainWindow.ui.h:37 ../qt/data/MainWindow.ui.h:2 msgid "Contrast" msgstr "Contraste" #: ../gtk/data/MainWindow.ui.h:38 ../qt/data/MainWindow.ui.h:3 msgid "Resolution" msgstr "Resolution" #: ../gtk/data/MainWindow.ui.h:39 ../qt/data/MainWindow.ui.h:4 msgid "Invert colors" msgstr "" #: ../gtk/data/MainWindow.ui.h:40 msgid "A graphical frontend to tesseract-ocr" msgstr "" #: ../gtk/data/MainWindow.ui.h:41 ../qt/data/CharacterListDialog.ui.h:1 msgid "Character whitelist / blacklist" msgstr "" #: ../gtk/data/MainWindow.ui.h:42 ../qt/data/CharacterListDialog.ui.h:2 msgid "Exclude these characters from being recognized (blacklist):" msgstr "" #: ../gtk/data/MainWindow.ui.h:43 ../qt/data/CharacterListDialog.ui.h:3 msgid "Enter a string of characters..." msgstr "" #: ../gtk/data/MainWindow.ui.h:44 ../qt/data/CharacterListDialog.ui.h:4 msgid "Only allow the following characters to be recognized (whitelist):" msgstr "" #: ../gtk/data/MainWindow.ui.h:45 ../qt/data/PageRangeDialog.ui.h:1 msgid "Page Range" msgstr "" #: ../gtk/data/MainWindow.ui.h:48 ../qt/data/PageRangeDialog.ui.h:2 msgid "Page range:" msgstr "" #: ../gtk/data/MainWindow.ui.h:49 ../qt/data/PageRangeDialog.ui.h:3 msgid "Example: 1-10, 13, 14-18" msgstr "Exemple: 1-10, 13, 14-18" #: ../gtk/data/MainWindow.ui.h:50 ../qt/data/PageRangeDialog.ui.h:4 msgid "Recognition area:" msgstr "" #: ../gtk/data/MainWindow.ui.h:51 ../gtk/src/Recognizer.cc:375 #: ../qt/data/PageRangeDialog.ui.h:5 ../qt/src/Recognizer.cc:369 msgid "Entire page" msgstr "" #: ../gtk/data/MainWindow.ui.h:52 ../qt/data/PageRangeDialog.ui.h:6 msgid "Autodetect" msgstr "" #: ../gtk/data/MainWindow.ui.h:53 ../qt/data/PageRangeDialog.ui.h:7 msgid "Prepend to output text:" msgstr "" #: ../gtk/data/MainWindow.ui.h:54 ../qt/data/PageRangeDialog.ui.h:8 msgid "Source filename" msgstr "" #: ../gtk/data/MainWindow.ui.h:55 ../qt/data/PageRangeDialog.ui.h:9 msgid "Source page" msgstr "" #: ../gtk/data/MainWindow.ui.h:56 ../qt/src/SourceManager.cc:146 msgid "Protected PDF" msgstr "" #: ../gtk/data/MainWindow.ui.h:57 ../qt/src/Recognizer.cc:76 msgid "Current Page" msgstr "Págine actual" #: ../gtk/data/MainWindow.ui.h:58 ../qt/src/Recognizer.cc:79 msgid "Multiple Pages..." msgstr "Multiplic págines..." #: ../gtk/data/OutputEditorHOCR.ui.h:1 ../qt/src/hocr/OutputEditorHOCR.cc:580 msgid "Add Word" msgstr "" #: ../gtk/data/OutputEditorHOCR.ui.h:4 ../qt/src/hocr/OutputEditorHOCR.cc:580 msgid "Enter word:" msgstr "" #: ../gtk/data/OutputEditorHOCR.ui.h:5 ../qt/src/hocr/Ui_OutputEditorHOCR.hh:61 #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:62 msgid "Export to plain text" msgstr "" #: ../gtk/data/OutputEditorHOCR.ui.h:6 ../qt/src/hocr/Ui_OutputEditorHOCR.hh:64 #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:65 msgid "Export to PDF" msgstr "" #: ../gtk/data/OutputEditorHOCR.ui.h:7 ../qt/src/hocr/Ui_OutputEditorHOCR.hh:67 #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:68 msgid "Export to ODT" msgstr "" #: ../gtk/data/OutputEditorHOCR.ui.h:8 ../gtk/data/OutputEditorText.ui.h:18 #: ../qt/src/Ui_OutputEditorText.hh:116 msgid "Save output" msgstr "" #: ../gtk/data/OutputEditorHOCR.ui.h:9 ../qt/src/hocr/Ui_OutputEditorHOCR.hh:72 #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:73 msgid "Export" msgstr "" #: ../gtk/data/OutputEditorHOCR.ui.h:10 ../gtk/data/OutputEditorText.ui.h:19 #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:77 #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:78 #: ../qt/src/Ui_OutputEditorText.hh:118 msgid "Clear output" msgstr "" #: ../gtk/data/OutputEditorHOCR.ui.h:11 ../gtk/data/OutputEditorText.ui.h:15 #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:80 #: ../qt/src/Ui_OutputEditorText.hh:107 msgid "Find and replace" msgstr "" #: ../gtk/data/OutputEditorHOCR.ui.h:12 #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:82 #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:83 msgid "Show confidence values" msgstr "" #: ../gtk/data/OutputEditorHOCR.ui.h:13 ../gtk/data/PdfExportDialog.ui.h:41 #: ../qt/data/PdfExportDialog.ui.h:2 ../qt/src/hocr/Ui_OutputEditorHOCR.hh:85 #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:86 msgid "Show preview" msgstr "" #: ../gtk/data/OutputEditorHOCR.ui.h:14 #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:121 msgid "Next (F3)" msgstr "" #: ../gtk/data/OutputEditorHOCR.ui.h:15 #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:122 msgid "Previous (Shift+F3)" msgstr "" #: ../gtk/data/OutputEditorHOCR.ui.h:16 ../gtk/src/hocr/OutputEditorHOCR.cc:890 #: ../qt/src/hocr/OutputEditorHOCR.cc:730 #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:126 msgid "Expand all" msgstr "" #: ../gtk/data/OutputEditorHOCR.ui.h:17 ../gtk/src/hocr/OutputEditorHOCR.cc:893 #: ../qt/src/hocr/OutputEditorHOCR.cc:731 #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:127 msgid "Collapse all" msgstr "" #: ../gtk/data/OutputEditorHOCR.ui.h:18 #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:148 msgid "Properties" msgstr "Proprietás" #: ../gtk/data/OutputEditorHOCR.ui.h:19 #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:152 msgid "Source" msgstr "Orígine" #. Output insert mode #: ../gtk/data/OutputEditorText.ui.h:1 ../qt/src/Ui_OutputEditorText.hh:52 msgid "Append to current text" msgstr "" #: ../gtk/data/OutputEditorText.ui.h:2 ../qt/src/Ui_OutputEditorText.hh:53 msgid "Insert at cursor" msgstr "" #: ../gtk/data/OutputEditorText.ui.h:3 ../qt/src/Ui_OutputEditorText.hh:54 msgid "Replace current text" msgstr "" #. Output postprocessing #: ../gtk/data/OutputEditorText.ui.h:4 ../qt/src/Ui_OutputEditorText.hh:62 msgid "Keep line break if..." msgstr "" #: ../gtk/data/OutputEditorText.ui.h:5 ../qt/src/Ui_OutputEditorText.hh:64 msgid "Preceded by end mark (.?!)" msgstr "" #: ../gtk/data/OutputEditorText.ui.h:6 ../qt/src/Ui_OutputEditorText.hh:66 msgid "Preceded or succeeded by quote" msgstr "" #: ../gtk/data/OutputEditorText.ui.h:7 ../qt/src/Ui_OutputEditorText.hh:68 msgid "Other options" msgstr "" #: ../gtk/data/OutputEditorText.ui.h:8 ../qt/src/Ui_OutputEditorText.hh:70 msgid "Join hyphenated words" msgstr "" #: ../gtk/data/OutputEditorText.ui.h:9 ../qt/src/Ui_OutputEditorText.hh:72 msgid "Collapse whitespace" msgstr "" #: ../gtk/data/OutputEditorText.ui.h:10 ../qt/src/Ui_OutputEditorText.hh:74 msgid "Preserve paragraphs" msgstr "" #: ../gtk/data/OutputEditorText.ui.h:11 ../qt/src/Ui_OutputEditorText.hh:76 msgid "Visual aids" msgstr "" #: ../gtk/data/OutputEditorText.ui.h:12 ../qt/src/Ui_OutputEditorText.hh:78 msgid "Draw whitespace" msgstr "" #: ../gtk/data/OutputEditorText.ui.h:14 ../qt/src/Ui_OutputEditorText.hh:102 msgid "Strip line breaks on selected text" msgstr "" #: ../gtk/data/OutputEditorText.ui.h:16 ../qt/src/Ui_OutputEditorText.hh:109 #: ../qt/src/Ui_OutputEditorText.hh:110 msgid "Undo" msgstr "Defar" #: ../gtk/data/OutputEditorText.ui.h:17 ../qt/src/Ui_OutputEditorText.hh:112 #: ../qt/src/Ui_OutputEditorText.hh:113 msgid "Redo" msgstr "Refar" #: ../gtk/data/PdfExportDialog.ui.h:1 ../qt/data/PdfExportDialog.ui.h:1 msgid "PDF Export" msgstr "" #: ../gtk/data/PdfExportDialog.ui.h:4 ../qt/data/PdfExportDialog.ui.h:4 msgid "Output mode:" msgstr "" #: ../gtk/data/PdfExportDialog.ui.h:5 ../qt/data/PdfExportDialog.ui.h:6 msgid "PDF" msgstr "PDF" #: ../gtk/data/PdfExportDialog.ui.h:6 ../qt/data/PdfExportDialog.ui.h:7 msgid "PDF with invisible text overlay" msgstr "" #: ../gtk/data/PdfExportDialog.ui.h:7 ../qt/data/PdfExportDialog.ui.h:16 msgid "Format:" msgstr "Formate:" #: ../gtk/data/PdfExportDialog.ui.h:8 ../qt/data/PdfExportDialog.ui.h:17 msgid "Compression:" msgstr "Compression:" #: ../gtk/data/PdfExportDialog.ui.h:9 ../qt/data/PdfExportDialog.ui.h:14 msgid "Compression quality:" msgstr "" #: ../gtk/data/PdfExportDialog.ui.h:10 ../qt/data/PdfExportDialog.ui.h:15 msgid "DPI:" msgstr "DPI:" #: ../gtk/data/PdfExportDialog.ui.h:11 ../qt/data/PdfExportDialog.ui.h:18 msgid "Dithering algorithm:" msgstr "" #: ../gtk/data/PdfExportDialog.ui.h:12 ../qt/data/PdfExportDialog.ui.h:13 msgid "Image settings:" msgstr "Parametres de image:" #: ../gtk/data/PdfExportDialog.ui.h:13 ../qt/data/PdfExportDialog.ui.h:25 msgid "Uniformize line and word spacing" msgstr "" #: ../gtk/data/PdfExportDialog.ui.h:14 ../qt/data/PdfExportDialog.ui.h:21 msgid "Override font family:" msgstr "" #: ../gtk/data/PdfExportDialog.ui.h:15 ../qt/data/PdfExportDialog.ui.h:27 msgid "Fallback font family:" msgstr "" #: ../gtk/data/PdfExportDialog.ui.h:16 ../qt/data/PdfExportDialog.ui.h:20 msgid "Override font size:" msgstr "" #: ../gtk/data/PdfExportDialog.ui.h:17 ../qt/data/PdfExportDialog.ui.h:23 msgid "Font scaling:" msgstr "" #: ../gtk/data/PdfExportDialog.ui.h:18 ../qt/data/PdfExportDialog.ui.h:26 msgid "pt" msgstr "" #: ../gtk/data/PdfExportDialog.ui.h:19 ../qt/data/PdfExportDialog.ui.h:22 msgid "Preserve spaces wider than:" msgstr "" #: ../gtk/data/PdfExportDialog.ui.h:20 ../qt/data/PdfExportDialog.ui.h:24 msgid "characters" msgstr "caracteres" #: ../gtk/data/PdfExportDialog.ui.h:21 ../qt/data/PdfExportDialog.ui.h:28 msgid "Sanitize hyphens before line breaks" msgstr "" #: ../gtk/data/PdfExportDialog.ui.h:22 ../qt/data/PdfExportDialog.ui.h:19 msgid "Text settings:" msgstr "" #: ../gtk/data/PdfExportDialog.ui.h:23 ../qt/data/PdfExportDialog.ui.h:10 msgid "Paper size:" msgstr "" #: ../gtk/data/PdfExportDialog.ui.h:24 ../qt/data/PdfExportDialog.ui.h:11 msgid "Width" msgstr "" #: ../gtk/data/PdfExportDialog.ui.h:25 ../qt/data/PdfExportDialog.ui.h:12 msgid "Height" msgstr "" #: ../gtk/data/PdfExportDialog.ui.h:26 ../qt/data/PdfExportDialog.ui.h:29 msgid "Treat image sources as having true DPI:" msgstr "" #: ../gtk/data/PdfExportDialog.ui.h:27 ../qt/data/PdfExportDialog.ui.h:3 msgid "Basic" msgstr "" #: ../gtk/data/PdfExportDialog.ui.h:28 ../qt/data/PdfExportDialog.ui.h:31 msgid "PDF version:" msgstr "" #: ../gtk/data/PdfExportDialog.ui.h:29 ../qt/data/PdfExportDialog.ui.h:33 msgid "Password:" msgstr "" #: ../gtk/data/PdfExportDialog.ui.h:30 ../qt/data/PdfExportDialog.ui.h:34 msgid "Confirm password:" msgstr "" #: ../gtk/data/PdfExportDialog.ui.h:31 ../qt/data/PdfExportDialog.ui.h:32 msgid "Encryption (optional):" msgstr "" #: ../gtk/data/PdfExportDialog.ui.h:32 ../qt/data/PdfExportDialog.ui.h:36 msgid "Author:" msgstr "" #: ../gtk/data/PdfExportDialog.ui.h:33 ../qt/data/PdfExportDialog.ui.h:38 msgid "Title:" msgstr "" #: ../gtk/data/PdfExportDialog.ui.h:34 ../qt/data/PdfExportDialog.ui.h:40 msgid "Subject:" msgstr "" #: ../gtk/data/PdfExportDialog.ui.h:35 ../qt/data/PdfExportDialog.ui.h:37 msgid "Creator:" msgstr "" #: ../gtk/data/PdfExportDialog.ui.h:36 ../qt/data/PdfExportDialog.ui.h:39 msgid "Producer:" msgstr "" #: ../gtk/data/PdfExportDialog.ui.h:37 ../qt/data/PdfExportDialog.ui.h:41 msgid "Keywords:" msgstr "" #: ../gtk/data/PdfExportDialog.ui.h:38 ../qt/data/PdfExportDialog.ui.h:35 msgid "Additional information (optional):" msgstr "" #: ../gtk/data/PdfExportDialog.ui.h:39 ../qt/data/PdfExportDialog.ui.h:42 msgid "Import from current source" msgstr "" #: ../gtk/data/PdfExportDialog.ui.h:40 ../qt/data/PdfExportDialog.ui.h:30 msgid "Advanced" msgstr "" #: ../gtk/data/SearchReplaceFrame.ui.h:1 ../qt/data/SearchReplaceFrame.ui.h:4 msgid "Find" msgstr "Trovar" #: ../gtk/data/SearchReplaceFrame.ui.h:2 ../qt/data/SearchReplaceFrame.ui.h:2 msgid "Replace" msgstr "" #: ../gtk/data/SearchReplaceFrame.ui.h:3 ../qt/data/SearchReplaceFrame.ui.h:3 msgid "Replace all" msgstr "" #: ../gtk/data/SearchReplaceFrame.ui.h:4 ../qt/data/SearchReplaceFrame.ui.h:5 msgid "Find previous" msgstr "" #: ../gtk/data/SearchReplaceFrame.ui.h:5 ../qt/data/SearchReplaceFrame.ui.h:6 msgid "Find next" msgstr "" #: ../gtk/data/SearchReplaceFrame.ui.h:6 ../qt/data/SearchReplaceFrame.ui.h:7 msgid "Match case" msgstr "" #: ../gtk/data/SearchReplaceFrame.ui.h:7 #: ../gtk/data/SubstitutionsManager.ui.h:1 ../qt/data/SearchReplaceFrame.ui.h:1 #: ../qt/src/SubstitutionsManager.cc:36 msgid "Substitutions" msgstr "" #: ../gtk/data/SelectionMenu.ui.h:1 ../qt/src/DisplayerToolSelect.cc:239 msgid "Delete" msgstr "Deleter" #: ../gtk/data/SelectionMenu.ui.h:2 ../qt/src/DisplayerToolSelect.cc:225 msgid "Order:" msgstr "Órdine:" #: ../gtk/data/SelectionMenu.ui.h:3 ../gtk/src/hocr/DisplayerToolHOCR.cc:29 #: ../qt/src/DisplayerToolSelect.cc:240 ../qt/src/hocr/DisplayerToolHOCR.cc:31 msgid "Recognize" msgstr "" #: ../gtk/data/SelectionMenu.ui.h:4 ../qt/src/DisplayerToolSelect.cc:241 msgid "Recognize to clipboard" msgstr "" #: ../gtk/data/SelectionMenu.ui.h:5 ../qt/src/DisplayerToolSelect.cc:242 msgid "Save as image" msgstr "" #: ../gtk/data/SubstitutionsManager.ui.h:2 ../qt/src/SubstitutionsManager.cc:38 #: ../qt/src/SubstitutionsManager.cc:39 msgid "Open" msgstr "Aperter" #: ../gtk/data/SubstitutionsManager.ui.h:3 ../gtk/src/Utils.cc:73 #: ../qt/src/SubstitutionsManager.cc:41 ../qt/src/SubstitutionsManager.cc:42 msgid "Save" msgstr "Salvar" #: ../gtk/data/SubstitutionsManager.ui.h:4 ../qt/src/SubstitutionsManager.cc:44 #: ../qt/src/SubstitutionsManager.cc:45 msgid "Clear" msgstr "Vacuar" #: ../gtk/data/SubstitutionsManager.ui.h:5 ../qt/data/ConfigDialog.ui.h:16 #: ../qt/src/SubstitutionsManager.cc:47 ../qt/src/SubstitutionsManager.cc:48 msgid "Add" msgstr "Adjunter" #: ../gtk/data/SubstitutionsManager.ui.h:6 #: ../gtk/src/hocr/OutputEditorHOCR.cc:886 ../qt/data/ConfigDialog.ui.h:17 #: ../qt/src/hocr/OutputEditorHOCR.cc:727 ../qt/src/SubstitutionsManager.cc:50 #: ../qt/src/SubstitutionsManager.cc:51 msgid "Remove" msgstr "Remover" #: ../gtk/data/SubstitutionsManager.ui.h:7 ../gtk/data/TessdataManager.ui.h:2 msgid "Apply" msgstr "Applicar" #: ../gtk/data/SubstitutionsManager.ui.h:8 ../gtk/data/TessdataManager.ui.h:3 msgid "Close" msgstr "Clúder" #: ../gtk/data/TessdataManager.ui.h:1 ../qt/src/TessdataManager.cc:49 msgid "Tessdata Manager" msgstr "Gerentiator de Tessdata" #: ../gtk/data/TessdataManager.ui.h:5 ../qt/src/TessdataManager.cc:51 msgid "Manage installed languages:" msgstr "" #: ../gtk/src/Acquirer.cc:79 ../qt/src/Acquirer.cc:70 msgid "scan.png" msgstr "" #: ../gtk/src/Acquirer.cc:91 ../qt/src/Acquirer.cc:85 msgid "Images" msgstr "Images" #: ../gtk/src/Acquirer.cc:92 ../qt/src/Acquirer.cc:86 msgid "Choose Output Filename..." msgstr "" #: ../gtk/src/Acquirer.cc:106 ../qt/src/Acquirer.cc:100 msgid "Failed to initialize the scanning backend." msgstr "" #: ../gtk/src/Acquirer.cc:115 ../qt/src/Acquirer.cc:106 msgid "Scan failed" msgstr "" #: ../gtk/src/Acquirer.cc:133 ../qt/src/Acquirer.cc:122 msgid "No scanners were detected." msgstr "" #: ../gtk/src/Acquirer.cc:150 ../gtk/src/Acquirer.cc:168 #: ../qt/src/Acquirer.cc:136 ../qt/src/Acquirer.cc:154 msgid "Starting scan..." msgstr "" #: ../gtk/src/Acquirer.cc:164 ../qt/src/Acquirer.cc:150 msgid "Opening device..." msgstr "" #: ../gtk/src/Acquirer.cc:166 ../qt/src/Acquirer.cc:152 msgid "Setting options..." msgstr "" #: ../gtk/src/Acquirer.cc:170 ../qt/src/Acquirer.cc:156 msgid "Getting parameters..." msgstr "" #: ../gtk/src/Acquirer.cc:172 ../qt/src/Acquirer.cc:158 msgid "Transferring data..." msgstr "" #: ../gtk/src/Acquirer.cc:179 ../qt/src/Acquirer.cc:165 msgid "Canceling scan..." msgstr "" #: ../gtk/src/Config.cc:49 ../qt/data/ConfigDialog.ui.h:7 msgid "Filename prefix" msgstr "" #: ../gtk/src/Config.cc:50 ../qt/data/ConfigDialog.ui.h:8 msgid "Code" msgstr "Code" #: ../gtk/src/Config.cc:51 ../qt/data/ConfigDialog.ui.h:9 msgid "Native name" msgstr "" #: ../gtk/src/Config.cc:109 ../qt/src/Config.cc:108 msgid "Script" msgstr "" #: ../gtk/src/CrashHandler.cc:25 ../gtk/src/CrashHandler.cc:41 #: ../qt/src/CrashHandler.cc:36 msgid "Crash Handler" msgstr "" #: ../gtk/src/CrashHandler.cc:43 ../qt/src/CrashHandler.cc:31 msgid "Your work has been saved under %1." msgstr "" #: ../gtk/src/CrashHandler.cc:45 ../qt/src/CrashHandler.cc:33 msgid "There was no unsaved work." msgstr "" #: ../gtk/src/CrashHandler.cc:106 ../qt/src/CrashHandler.cc:62 msgid "Failed to obtain backtrace. Is gdb installed?" msgstr "" #: ../gtk/src/Displayer.cc:232 ../qt/src/Displayer.cc:174 msgid "Failed to load image" msgstr "Ne successat cargar li image" #: ../gtk/src/Displayer.cc:232 ../qt/src/Displayer.cc:174 msgid "" "The file might not be an image or be corrupt:\n" "%1" msgstr "" "Li file possibilmen ne es un image o es corupt:\n" "%1" #: ../gtk/src/DisplayerToolSelect.cc:138 ../qt/src/DisplayerToolSelect.cc:135 msgid "PNG Images" msgstr "Images PNG" #: ../gtk/src/DisplayerToolSelect.cc:139 ../qt/src/DisplayerToolSelect.cc:135 msgid "Save Selection Image" msgstr "" #: ../gtk/src/DisplayerToolSelect.cc:139 ../qt/src/DisplayerToolSelect.cc:135 msgid "selection.png" msgstr "selection.png" #: ../gtk/src/DisplayerToolSelect.cc:146 ../qt/src/DisplayerToolSelect.cc:142 msgid "Recognize all" msgstr "Reconosser omni" #: ../gtk/src/DisplayerToolSelect.cc:146 ../qt/src/DisplayerToolSelect.cc:142 msgid "Recognize selection" msgstr "Reconosser li selection" #: ../gtk/src/DisplayerToolSelect.cc:186 ../qt/src/DisplayerToolSelect.cc:182 msgid "Performing layout analysis" msgstr "" #: ../gtk/src/FileDialogs.cc:235 msgid "" "A file named \"%1\" already exists. Are you sure you want to overwrite it?" msgstr "" #: ../gtk/src/FileDialogs.cc:237 msgid "Overwrite File?" msgstr "" #: ../gtk/src/hocr/HOCRDocument.cc:611 ../gtk/src/hocr/OutputEditorHOCR.cc:266 #: ../qt/src/hocr/OutputEditorHOCR.cc:229 msgid "Page" msgstr "Págine" #: ../gtk/src/hocr/HOCRDocument.cc:613 ../qt/src/hocr/HOCRDocument.cc:530 msgid "Text block" msgstr "Bloc de textu" #: ../gtk/src/hocr/HOCRDocument.cc:615 ../gtk/src/hocr/OutputEditorHOCR.cc:272 #: ../qt/src/hocr/HOCRDocument.cc:532 ../qt/src/hocr/OutputEditorHOCR.cc:231 msgid "Paragraph" msgstr "Paragraf" #: ../gtk/src/hocr/HOCRDocument.cc:617 ../qt/src/hocr/HOCRDocument.cc:534 msgid "Textline" msgstr "Linea de textu" #: ../gtk/src/hocr/HOCRDocument.cc:621 ../qt/src/hocr/HOCRDocument.cc:538 msgid "Graphic" msgstr "Pictura" #: ../gtk/src/hocr/HOCROdtExporter.cc:65 ../gtk/src/hocr/HOCRPdfExporter.cc:489 #: ../gtk/src/hocr/HOCRTextExporter.cc:34 #: ../gtk/src/hocr/OutputEditorHOCR.cc:963 ../gtk/src/OutputEditorText.cc:272 #: ../qt/src/hocr/HOCROdtExporter.cc:50 ../qt/src/hocr/HOCRPdfExporter.cc:478 #: ../qt/src/hocr/HOCRTextExporter.cc:36 ../qt/src/hocr/OutputEditorHOCR.cc:830 #: ../qt/src/OutputEditorText.cc:238 msgid "output" msgstr "" #: ../gtk/src/hocr/HOCROdtExporter.cc:68 ../qt/src/hocr/HOCROdtExporter.cc:53 msgid "OpenDocument Text Documents" msgstr "Documentes textual OpenDocument" #: ../gtk/src/hocr/HOCROdtExporter.cc:69 ../qt/src/hocr/HOCROdtExporter.cc:53 msgid "Save ODT Output..." msgstr "Gardar li resultate ODT…" #: ../gtk/src/hocr/HOCROdtExporter.cc:77 ../gtk/src/hocr/HOCROdtExporter.cc:342 #: ../gtk/src/hocr/HOCRPdfExporter.cc:619 #: ../gtk/src/hocr/HOCRTextExporter.cc:46 ../qt/src/hocr/HOCROdtExporter.cc:61 #: ../qt/src/hocr/HOCRPdfExporter.cc:609 ../qt/src/hocr/HOCRTextExporter.cc:47 msgid "Export failed" msgstr "Export ne successat" #: ../gtk/src/hocr/HOCROdtExporter.cc:77 ../gtk/src/hocr/HOCROdtExporter.cc:342 #: ../qt/src/hocr/HOCROdtExporter.cc:61 msgid "The ODT export failed: unable to write output file." msgstr "" #: ../gtk/src/hocr/HOCROdtExporter.cc:336 ../qt/src/hocr/HOCROdtExporter.cc:254 msgid "Exporting to ODT..." msgstr "Exportante a ODT…" #: ../gtk/src/hocr/HOCRPdfExporter.cc:283 ../qt/src/hocr/HOCRPdfExporter.cc:365 msgid "Same as source" msgstr "Sam quam li orígine" #: ../gtk/src/hocr/HOCRPdfExporter.cc:286 ../qt/src/hocr/HOCRPdfExporter.cc:366 msgid "Custom" msgstr "Personalisat" #: ../gtk/src/hocr/HOCRPdfExporter.cc:300 ../qt/src/hocr/HOCRPdfExporter.cc:362 msgid "cm" msgstr "cm" #: ../gtk/src/hocr/HOCRPdfExporter.cc:303 ../qt/src/hocr/HOCRPdfExporter.cc:363 msgid "in" msgstr "" #: ../gtk/src/hocr/HOCRPdfExporter.cc:319 ../qt/src/hocr/HOCRPdfExporter.cc:353 msgid "Monochrome" msgstr "Monocrom" #: ../gtk/src/hocr/HOCRPdfExporter.cc:328 ../qt/src/hocr/HOCRPdfExporter.cc:355 msgid "Threshold (closest color)" msgstr "" #: ../gtk/src/hocr/HOCRPdfExporter.cc:331 ../qt/src/hocr/HOCRPdfExporter.cc:356 msgid "Diffuse" msgstr "" #: ../gtk/src/hocr/HOCRPdfExporter.cc:340 ../qt/src/hocr/HOCRPdfExporter.cc:357 msgid "Zip (lossless)" msgstr "" #: ../gtk/src/hocr/HOCRPdfExporter.cc:344 ../qt/src/hocr/HOCRPdfExporter.cc:358 msgid "CCITT Group 4 (lossless)" msgstr "" #: ../gtk/src/hocr/HOCRPdfExporter.cc:348 ../qt/src/hocr/HOCRPdfExporter.cc:359 msgid "Jpeg (lossy)" msgstr "" #: ../gtk/src/hocr/HOCRPdfExporter.cc:493 ../qt/src/hocr/HOCRPdfExporter.cc:482 msgid "PDF Files" msgstr "Files PDF" #: ../gtk/src/hocr/HOCRPdfExporter.cc:494 ../qt/src/hocr/HOCRPdfExporter.cc:482 msgid "Save PDF Output..." msgstr "" #: ../gtk/src/hocr/HOCRPdfExporter.cc:500 ../qt/src/hocr/HOCRPdfExporter.cc:488 msgid "Invalid Output" msgstr "" #: ../gtk/src/hocr/HOCRPdfExporter.cc:500 ../qt/src/hocr/HOCRPdfExporter.cc:488 msgid "Cannot overwrite a file which is a source image of this document." msgstr "" #: ../gtk/src/hocr/HOCRPdfExporter.cc:516 ../qt/src/hocr/HOCRPdfExporter.cc:511 msgid "Failed to create output" msgstr "" #: ../gtk/src/hocr/HOCRPdfExporter.cc:516 ../qt/src/hocr/HOCRPdfExporter.cc:511 msgid "Failed to create output. The returned error was: %1" msgstr "" #: ../gtk/src/hocr/HOCRPdfExporter.cc:558 ../qt/src/hocr/HOCRPdfExporter.cc:551 msgid "The operation was cancelled" msgstr "" #: ../gtk/src/hocr/HOCRPdfExporter.cc:607 ../qt/src/hocr/HOCRPdfExporter.cc:597 msgid "Failed to render page %1" msgstr "" #: ../gtk/src/hocr/HOCRPdfExporter.cc:614 ../qt/src/hocr/HOCRPdfExporter.cc:604 msgid "Exporting to PDF..." msgstr "" #: ../gtk/src/hocr/HOCRPdfExporter.cc:619 ../qt/src/hocr/HOCRPdfExporter.cc:609 msgid "The PDF export failed: %1." msgstr "" #: ../gtk/src/hocr/HOCRPdfExporter.cc:673 ../qt/src/hocr/HOCRPdfExporter.cc:662 msgid "The PDF library could not load the font '%1'." msgstr "" #: ../gtk/src/hocr/HOCRTextExporter.cc:37 ../gtk/src/OutputEditorText.cc:274 #: ../qt/src/hocr/HOCRTextExporter.cc:39 ../qt/src/OutputEditorText.cc:239 msgid "Text Files" msgstr "Files textual" #: ../gtk/src/hocr/HOCRTextExporter.cc:38 ../qt/src/hocr/HOCRTextExporter.cc:39 msgid "Save Text Output..." msgstr "" #: ../gtk/src/hocr/HOCRTextExporter.cc:46 ../qt/src/hocr/HOCRTextExporter.cc:47 msgid "The text export failed: unable to write output file." msgstr "" #: ../gtk/src/hocr/OutputEditorHOCR.cc:269 #: ../qt/src/hocr/OutputEditorHOCR.cc:230 msgid "Block" msgstr "" #: ../gtk/src/hocr/OutputEditorHOCR.cc:275 #: ../qt/src/hocr/OutputEditorHOCR.cc:232 msgid "Line" msgstr "" #: ../gtk/src/hocr/OutputEditorHOCR.cc:278 #: ../qt/src/hocr/OutputEditorHOCR.cc:233 msgid "Word" msgstr "" #: ../gtk/src/hocr/OutputEditorHOCR.cc:281 #: ../qt/src/hocr/OutputEditorHOCR.cc:234 msgid "Misspelled word" msgstr "" #: ../gtk/src/hocr/OutputEditorHOCR.cc:435 #: ../qt/src/hocr/OutputEditorHOCR.cc:317 msgid "" "The following pages could not be processed:\n" "%1" msgstr "" #: ../gtk/src/hocr/OutputEditorHOCR.cc:436 #: ../qt/src/hocr/OutputEditorHOCR.cc:318 msgid "Recognition errors" msgstr "" #: ../gtk/src/hocr/OutputEditorHOCR.cc:594 #: ../qt/src/hocr/OutputEditorHOCR.cc:500 #: ../qt/src/hocr/OutputEditorHOCR.cc:512 msgid "Multiple values" msgstr "" #. Merging allowed #: ../gtk/src/hocr/OutputEditorHOCR.cc:778 #: ../qt/src/hocr/OutputEditorHOCR.cc:641 msgid "Merge" msgstr "" #: ../gtk/src/hocr/OutputEditorHOCR.cc:786 #: ../gtk/src/hocr/OutputEditorHOCR.cc:877 #: ../qt/src/hocr/OutputEditorHOCR.cc:643 #: ../qt/src/hocr/OutputEditorHOCR.cc:725 msgid "Split from parent" msgstr "" #. Swapping allowed #: ../gtk/src/hocr/OutputEditorHOCR.cc:797 #: ../qt/src/hocr/OutputEditorHOCR.cc:647 msgid "Swap" msgstr "" #: ../gtk/src/hocr/OutputEditorHOCR.cc:821 #: ../qt/src/hocr/OutputEditorHOCR.cc:693 msgid "Add graphic region" msgstr "" #: ../gtk/src/hocr/OutputEditorHOCR.cc:824 #: ../qt/src/hocr/OutputEditorHOCR.cc:694 msgid "Add text block" msgstr "" #: ../gtk/src/hocr/OutputEditorHOCR.cc:828 #: ../qt/src/hocr/OutputEditorHOCR.cc:696 msgid "Add paragraph" msgstr "" #: ../gtk/src/hocr/OutputEditorHOCR.cc:832 #: ../qt/src/hocr/OutputEditorHOCR.cc:698 msgid "Add line" msgstr "" #: ../gtk/src/hocr/OutputEditorHOCR.cc:836 #: ../qt/src/hocr/OutputEditorHOCR.cc:700 msgid "Add word" msgstr "" #: ../gtk/src/hocr/OutputEditorHOCR.cc:852 #: ../qt/src/hocr/OutputEditorHOCR.cc:710 msgid "No suggestions" msgstr "Null suggestiones" #: ../gtk/src/hocr/OutputEditorHOCR.cc:858 #: ../qt/src/hocr/OutputEditorHOCR.cc:714 msgid "Add to dictionary" msgstr "" #: ../gtk/src/hocr/OutputEditorHOCR.cc:864 #: ../qt/src/hocr/OutputEditorHOCR.cc:716 msgid "Ignore word" msgstr "" #: ../gtk/src/hocr/OutputEditorHOCR.cc:926 #: ../gtk/src/hocr/OutputEditorHOCR.cc:965 #: ../qt/src/hocr/OutputEditorHOCR.cc:795 #: ../qt/src/hocr/OutputEditorHOCR.cc:832 msgid "hOCR HTML Files" msgstr "" #: ../gtk/src/hocr/OutputEditorHOCR.cc:927 #: ../qt/src/hocr/OutputEditorHOCR.cc:795 msgid "Open hOCR File" msgstr "" #: ../gtk/src/hocr/OutputEditorHOCR.cc:936 #: ../qt/src/hocr/OutputEditorHOCR.cc:802 msgid "Failed to open file" msgstr "" #: ../gtk/src/hocr/OutputEditorHOCR.cc:936 #: ../qt/src/hocr/OutputEditorHOCR.cc:802 msgid "The file could not be opened: %1." msgstr "" #: ../gtk/src/hocr/OutputEditorHOCR.cc:945 #: ../qt/src/hocr/OutputEditorHOCR.cc:809 msgid "Invalid hOCR file" msgstr "" #: ../gtk/src/hocr/OutputEditorHOCR.cc:945 #: ../qt/src/hocr/OutputEditorHOCR.cc:809 msgid "The file does not appear to contain valid hOCR HTML: %1" msgstr "" #: ../gtk/src/hocr/OutputEditorHOCR.cc:966 #: ../qt/src/hocr/OutputEditorHOCR.cc:832 msgid "Save hOCR Output..." msgstr "" #: ../gtk/src/hocr/OutputEditorHOCR.cc:973 ../gtk/src/OutputEditorText.cc:282 #: ../qt/src/hocr/OutputEditorHOCR.cc:839 ../qt/src/OutputEditorText.cc:246 msgid "Failed to save output" msgstr "" #: ../gtk/src/hocr/OutputEditorHOCR.cc:973 ../gtk/src/OutputEditorText.cc:282 #: ../qt/src/hocr/OutputEditorHOCR.cc:839 ../qt/src/OutputEditorText.cc:246 msgid "Check that you have writing permissions in the selected folder." msgstr "" #: ../gtk/src/hocr/OutputEditorHOCR.cc:1035 ../gtk/src/OutputEditorText.cc:296 #: ../qt/src/hocr/OutputEditorHOCR.cc:894 ../qt/src/OutputEditorText.cc:259 msgid "Output not saved" msgstr "" #: ../gtk/src/hocr/OutputEditorHOCR.cc:1035 ../gtk/src/OutputEditorText.cc:296 #: ../qt/src/hocr/OutputEditorHOCR.cc:894 ../qt/src/OutputEditorText.cc:259 msgid "Save output before proceeding?" msgstr "" #: ../gtk/src/hocr/OutputEditorHOCR.cc:1156 ../gtk/src/OutputEditorText.cc:184 #: ../qt/src/hocr/OutputEditorHOCR.cc:991 ../qt/src/OutputEditorText.cc:152 msgid "Replacing..." msgstr "" #: ../gtk/src/hocr/OutputEditorHOCR.cc:1181 ../gtk/src/OutputEditorText.cc:192 #: ../qt/src/hocr/OutputEditorHOCR.cc:1014 ../qt/src/OutputEditorText.cc:160 msgid "Applying substitutions..." msgstr "" #: ../gtk/src/MainWindow.cc:131 ../qt/src/MainWindow.cc:295 msgid "Using tesseract" msgstr "" #: ../gtk/src/MainWindow.cc:178 ../qt/src/MainWindow.cc:194 msgid "Select an image to begin..." msgstr "" #: ../gtk/src/MainWindow.cc:293 ../qt/src/MainWindow.cc:278 msgid "Multiple sources" msgstr "" #: ../gtk/src/MainWindow.cc:295 ../qt/src/MainWindow.cc:280 msgid "Ready" msgstr "" #: ../gtk/src/MainWindow.cc:442 ../qt/src/MainWindow.cc:423 msgid "New version" msgstr "Nov version" #: ../gtk/src/MainWindow.cc:442 ../qt/src/MainWindow.cc:423 msgid "gImageReader %1 is available" msgstr "gImageReader %1 es disponibil" #: ../gtk/src/MainWindow.cc:443 ../qt/src/MainWindow.cc:424 msgid "Download" msgstr "Descargar" #: ../gtk/src/MainWindow.cc:444 ../qt/src/MainWindow.cc:425 msgid "Changelog" msgstr "" #: ../gtk/src/MainWindow.cc:445 ../qt/src/MainWindow.cc:426 msgid "Don't notify again" msgstr "" #: ../gtk/src/MainWindow.cc:466 ../qt/src/MainWindow.cc:474 msgid "Don't show again" msgstr "" #: ../gtk/src/MainWindow.cc:467 ../gtk/src/MainWindow.cc:480 #: ../qt/src/MainWindow.cc:475 msgid "Install" msgstr "Installar" #: ../gtk/src/MainWindow.cc:487 ../qt/src/MainWindow.cc:487 msgid "Spelling dictionary missing" msgstr "" #: ../gtk/src/MainWindow.cc:487 ../qt/src/MainWindow.cc:487 msgid "The spellcheck dictionary for %1 is not installed" msgstr "" #: ../gtk/src/MainWindow.cc:494 ../gtk/src/MainWindow.cc:523 #: ../qt/src/MainWindow.cc:493 msgid "Installing spelling dictionary for '%1'" msgstr "" #: ../gtk/src/MainWindow.cc:515 ../gtk/src/MainWindow.cc:536 #: ../gtk/src/MainWindow.cc:544 ../gtk/src/MainWindow.cc:592 #: ../gtk/src/MainWindow.cc:597 ../gtk/src/TessdataManager.cc:60 #: ../gtk/src/TessdataManager.cc:70 ../gtk/src/TessdataManager.cc:339 #: ../qt/src/MainWindow.cc:512 ../qt/src/MainWindow.cc:525 #: ../qt/src/MainWindow.cc:534 ../qt/src/MainWindow.cc:578 #: ../qt/src/MainWindow.cc:583 ../qt/src/TessdataManager.cc:74 #: ../qt/src/TessdataManager.cc:84 ../qt/src/TessdataManager.cc:315 msgid "Error" msgstr "Errore" #: ../gtk/src/MainWindow.cc:515 ../qt/src/MainWindow.cc:512 msgid "Failed to install spelling dictionary: %1" msgstr "" #: ../gtk/src/MainWindow.cc:536 ../qt/src/MainWindow.cc:525 msgid "Failed to create directory for spelling dictionaries." msgstr "" #: ../gtk/src/MainWindow.cc:544 ../qt/src/MainWindow.cc:534 msgid "Could not read %1: %2." msgstr "" #: ../gtk/src/MainWindow.cc:571 ../qt/src/MainWindow.cc:558 msgid "Downloading '%1'..." msgstr "" #: ../gtk/src/MainWindow.cc:592 ../qt/src/MainWindow.cc:578 msgid "" "The following dictionaries could not be downloaded:\n" "%1\n" "\n" "Check the connectivity and directory permissions.\n" "Hint: If you don't have write permissions in system folders, you can switch " "to user paths in the settings dialog." msgstr "" #: ../gtk/src/MainWindow.cc:595 ../qt/src/MainWindow.cc:581 msgid "Dictionaries installed" msgstr "Dictionariums installat" #: ../gtk/src/MainWindow.cc:595 msgid "" "The following dictionaries were installed:\n" "%1" msgstr "" #: ../gtk/src/MainWindow.cc:597 ../qt/src/MainWindow.cc:583 msgid "No spelling dictionaries found for '%1'." msgstr "" #: ../gtk/src/OutputEditorText.cc:154 ../qt/src/OutputEditorText.cc:137 msgid "Stripping line breaks..." msgstr "" #: ../gtk/src/OutputEditorText.cc:162 msgid "Check spelling" msgstr "Controlar ortografie" #: ../gtk/src/OutputEditorText.cc:231 ../qt/src/OutputEditorText.cc:196 msgid "File: %1" msgstr "" #: ../gtk/src/OutputEditorText.cc:234 ../qt/src/OutputEditorText.cc:199 msgid "Page: %1" msgstr "" #: ../gtk/src/OutputEditorText.cc:247 ../gtk/src/Recognizer.cc:471 #: ../qt/src/Recognizer.cc:462 msgid "" "\n" "[Failed to recognize page %1]\n" msgstr "" #: ../gtk/src/OutputEditorText.cc:275 ../qt/src/OutputEditorText.cc:239 msgid "Save Output..." msgstr "" #: ../gtk/src/Recognizer.cc:179 ../qt/src/Recognizer.cc:172 msgid "No languages available" msgstr "Null lingues es disponibil" #: ../gtk/src/Recognizer.cc:179 ../qt/src/Recognizer.cc:172 msgid "" "No tesseract languages are available for use. Recognition will not work." msgstr "" #: ../gtk/src/Recognizer.cc:233 ../qt/src/Recognizer.cc:232 msgid "Multilingual" msgstr "" #: ../gtk/src/Recognizer.cc:285 ../qt/src/Recognizer.cc:277 msgid "Automatic page segmentation" msgstr "" #: ../gtk/src/Recognizer.cc:286 ../qt/src/Recognizer.cc:278 msgid "Page segmentation with orientation and script detection" msgstr "" #: ../gtk/src/Recognizer.cc:287 ../qt/src/Recognizer.cc:279 msgid "Assume single column of text" msgstr "" #: ../gtk/src/Recognizer.cc:288 ../qt/src/Recognizer.cc:280 msgid "Assume single block of vertically aligned text" msgstr "" #: ../gtk/src/Recognizer.cc:289 ../qt/src/Recognizer.cc:281 msgid "Assume a single uniform block of text" msgstr "" #: ../gtk/src/Recognizer.cc:290 ../qt/src/Recognizer.cc:282 msgid "Assume a line of text" msgstr "" #: ../gtk/src/Recognizer.cc:291 ../qt/src/Recognizer.cc:283 msgid "Assume a single word" msgstr "" #: ../gtk/src/Recognizer.cc:292 ../qt/src/Recognizer.cc:284 msgid "Assume a single word in a circle" msgstr "" #: ../gtk/src/Recognizer.cc:293 ../qt/src/Recognizer.cc:285 msgid "Sparse text in no particular order" msgstr "" #: ../gtk/src/Recognizer.cc:294 ../qt/src/Recognizer.cc:286 msgid "Sparse text with orientation and script detection" msgstr "" #: ../gtk/src/Recognizer.cc:309 ../qt/src/Recognizer.cc:297 msgid "Page segmentation mode" msgstr "" #: ../gtk/src/Recognizer.cc:313 ../qt/src/Recognizer.cc:300 msgid "Character whitelist / blacklist..." msgstr "" #: ../gtk/src/Recognizer.cc:319 ../qt/src/Recognizer.cc:305 msgid "Manage languages..." msgstr "" #: ../gtk/src/Recognizer.cc:375 ../qt/src/Recognizer.cc:369 msgid "Current selection" msgstr "Actual selection" #: ../gtk/src/Recognizer.cc:465 ../qt/src/Recognizer.cc:455 msgid "Recognizing page %1 (%2 of %3)" msgstr "" #: ../gtk/src/Recognizer.cc:470 ../qt/src/Recognizer.cc:461 msgid "" "\n" "- Page %1: failed to render page" msgstr "" #: ../gtk/src/Recognizer.cc:501 ../gtk/src/Recognizer.cc:531 #: ../gtk/src/Recognizer.cc:544 ../qt/src/Recognizer.cc:491 #: ../qt/src/Recognizer.cc:521 ../qt/src/Recognizer.cc:534 msgid "Recognizing..." msgstr "" #: ../gtk/src/Recognizer.cc:505 ../gtk/src/Recognizer.cc:514 #: ../qt/src/Recognizer.cc:495 ../qt/src/Recognizer.cc:504 msgid "Recognition errors occurred" msgstr "" #: ../gtk/src/Recognizer.cc:505 ../qt/src/Recognizer.cc:495 msgid "The following errors occurred:%1" msgstr "" #: ../gtk/src/Recognizer.cc:514 ../qt/src/Recognizer.cc:504 msgid "Failed to initialize tesseract" msgstr "" #: ../gtk/src/scanner/ScannerSane.cc:84 ../gtk/src/scanner/ScannerTwain.cc:288 #: ../qt/src/scanner/ScannerSane.cc:85 ../qt/src/scanner/ScannerTwain.cc:286 msgid "Scan canceled" msgstr "" #: ../gtk/src/scanner/ScannerSane.cc:159 ../gtk/src/scanner/ScannerTwain.cc:186 #: ../qt/src/scanner/ScannerSane.cc:159 ../qt/src/scanner/ScannerTwain.cc:178 msgid "No scanner specified" msgstr "" #: ../gtk/src/scanner/ScannerSane.cc:168 ../gtk/src/scanner/ScannerTwain.cc:195 #: ../qt/src/scanner/ScannerSane.cc:168 ../qt/src/scanner/ScannerTwain.cc:187 msgid "Unable to connect to scanner" msgstr "" #: ../gtk/src/scanner/ScannerSane.cc:403 ../gtk/src/scanner/ScannerTwain.cc:266 #: ../gtk/src/scanner/ScannerTwain.cc:292 ../qt/src/scanner/ScannerSane.cc:403 #: ../qt/src/scanner/ScannerTwain.cc:258 ../qt/src/scanner/ScannerTwain.cc:290 msgid "Unable to start scan" msgstr "" #: ../gtk/src/scanner/ScannerSane.cc:411 ../gtk/src/scanner/ScannerSane.cc:461 #: ../gtk/src/scanner/ScannerTwain.cc:318 ../qt/src/scanner/ScannerSane.cc:411 #: ../qt/src/scanner/ScannerSane.cc:461 ../qt/src/scanner/ScannerTwain.cc:316 msgid "Error communicating with scanner" msgstr "" #: ../gtk/src/scanner/ScannerSane.cc:520 ../qt/src/scanner/ScannerSane.cc:517 msgid "Failed to save image" msgstr "" #: ../gtk/src/scanner/ScannerSane.cc:800 ../qt/src/scanner/ScannerSane.cc:797 msgid "Operation is cancelled." msgstr "" #: ../gtk/src/scanner/ScannerSane.cc:802 ../qt/src/scanner/ScannerSane.cc:799 msgid "Device is busy." msgstr "" #: ../gtk/src/scanner/ScannerSane.cc:804 ../qt/src/scanner/ScannerSane.cc:801 msgid "Cover is opened." msgstr "" #: ../gtk/src/scanner/ScannerSane.cc:806 ../qt/src/scanner/ScannerSane.cc:803 msgid "Document feeder jammed." msgstr "" #: ../gtk/src/scanner/ScannerSane.cc:808 ../qt/src/scanner/ScannerSane.cc:805 msgid "Document feeder out of documents." msgstr "" #: ../gtk/src/scanner/ScannerSane.cc:810 ../qt/src/scanner/ScannerSane.cc:807 msgid "Access to scanner is denied." msgstr "" #: ../gtk/src/SourceManager.cc:118 ../qt/src/SourceManager.cc:124 msgid "PDFs with text" msgstr "" #: ../gtk/src/SourceManager.cc:118 ../qt/src/SourceManager.cc:124 msgid "" "These PDF files already contain text:\n" "%1" msgstr "" #: ../gtk/src/SourceManager.cc:127 ../qt/src/SourceManager.cc:132 msgid "Unable to open files" msgstr "" #: ../gtk/src/SourceManager.cc:127 ../qt/src/SourceManager.cc:132 msgid "The following files could not be opened:%1" msgstr "" #: ../gtk/src/SourceManager.cc:141 ../qt/src/SourceManager.cc:143 msgid "Enter password for file '%1':" msgstr "" #: ../gtk/src/SourceManager.cc:197 ../qt/src/SourceManager.cc:214 msgid "Images and PDFs" msgstr "" #: ../gtk/src/SourceManager.cc:202 ../qt/src/SourceManager.cc:215 msgid "Select Files" msgstr "Selecter files" #: ../gtk/src/SourceManager.cc:208 ../qt/src/SourceManager.cc:226 msgid "Clipboard Error" msgstr "Errore del Paperiere" #: ../gtk/src/SourceManager.cc:208 ../qt/src/SourceManager.cc:226 msgid "Failed to read the clipboard." msgstr "" #: ../gtk/src/SourceManager.cc:212 ../qt/src/SourceManager.cc:230 #: ../qt/src/SourceManager.cc:236 msgid "Pasted %1" msgstr "" #: ../gtk/src/SourceManager.cc:224 ../qt/src/SourceManager.cc:243 msgid "Screenshot Error" msgstr "" #: ../gtk/src/SourceManager.cc:224 ../qt/src/SourceManager.cc:243 msgid "Failed to take screenshot." msgstr "" #: ../gtk/src/SourceManager.cc:228 ../qt/src/SourceManager.cc:247 msgid "Screenshot %1" msgstr "" #: ../gtk/src/SourceManager.cc:233 ../qt/src/SourceManager.cc:252 msgid "Saving image..." msgstr "" #: ../gtk/src/SourceManager.cc:240 ../qt/src/SourceManager.cc:265 msgid "Cannot Write File" msgstr "" #: ../gtk/src/SourceManager.cc:240 ../qt/src/SourceManager.cc:265 msgid "Could not write to %1." msgstr "" #: ../gtk/src/SourceManager.cc:267 ../qt/src/SourceManager.cc:287 msgid "Delete File?" msgstr "" #: ../gtk/src/SourceManager.cc:267 ../qt/src/SourceManager.cc:287 msgid "The following files will be deleted:%1" msgstr "" #: ../gtk/src/SourceManager.cc:332 ../qt/src/SourceManager.cc:338 msgid "Missing File" msgstr "" #: ../gtk/src/SourceManager.cc:332 ../qt/src/SourceManager.cc:338 msgid "" "The following file has been deleted or moved:\n" "%1" msgstr "" #: ../gtk/src/SubstitutionsManager.cc:33 ../qt/src/SubstitutionsManager.cc:73 msgid "Search for" msgstr "" #: ../gtk/src/SubstitutionsManager.cc:34 ../qt/src/SubstitutionsManager.cc:73 msgid "Replace with" msgstr "" #: ../gtk/src/SubstitutionsManager.cc:69 ../gtk/src/SubstitutionsManager.cc:103 #: ../qt/src/SubstitutionsManager.cc:106 ../qt/src/SubstitutionsManager.cc:143 msgid "Substitutions List" msgstr "" #: ../gtk/src/SubstitutionsManager.cc:70 ../qt/src/SubstitutionsManager.cc:106 msgid "Open Substitutions List" msgstr "" #: ../gtk/src/SubstitutionsManager.cc:75 ../qt/src/SubstitutionsManager.cc:112 msgid "Error Reading File" msgstr "" #: ../gtk/src/SubstitutionsManager.cc:75 ../qt/src/SubstitutionsManager.cc:112 msgid "Unable to read '%1'." msgstr "" #: ../gtk/src/SubstitutionsManager.cc:97 ../qt/src/SubstitutionsManager.cc:137 msgid "Errors Occurred Reading File" msgstr "" #: ../gtk/src/SubstitutionsManager.cc:97 ../qt/src/SubstitutionsManager.cc:137 msgid "Some entries of the substitutions list could not be read." msgstr "" #: ../gtk/src/SubstitutionsManager.cc:104 ../qt/src/SubstitutionsManager.cc:143 msgid "Save Substitutions List" msgstr "" #: ../gtk/src/SubstitutionsManager.cc:110 ../qt/src/SubstitutionsManager.cc:149 msgid "Error Saving File" msgstr "" #: ../gtk/src/SubstitutionsManager.cc:110 ../qt/src/SubstitutionsManager.cc:149 msgid "Unable to write to '%1'." msgstr "" #: ../gtk/src/SubstitutionsManager.cc:127 ../qt/src/SubstitutionsManager.cc:162 msgid "Save List?" msgstr "" #: ../gtk/src/SubstitutionsManager.cc:127 ../qt/src/SubstitutionsManager.cc:162 msgid "Do you want to save the current list?" msgstr "" #: ../gtk/src/TessdataManager.cc:60 ../qt/src/TessdataManager.cc:74 msgid "" "A session connection to the PackageKit backend is required for managing " "system-wide tesseract language packs, but it was not found. This service is " "usually provided by a software-management application such as Gnome " "Software. Please install software which provides the necessary PackageKit " "interface, use other system package management software to manage the " "tesseract language packs directly, or switch to using the user tessdata path " "in the configuration dialog." msgstr "" #: ../gtk/src/TessdataManager.cc:65 ../qt/src/TessdataManager.cc:79 msgid "Fetching available languages" msgstr "" #: ../gtk/src/TessdataManager.cc:70 ../gtk/src/TessdataManager.cc:96 #: ../gtk/src/TessdataManager.cc:197 ../qt/src/TessdataManager.cc:84 #: ../qt/src/TessdataManager.cc:101 ../qt/src/TessdataManager.cc:197 msgid "Failed to fetch list of available languages: %1" msgstr "" #: ../gtk/src/TessdataManager.cc:104 ../qt/src/TessdataManager.cc:113 #: ../qt/src/TessdataManager.cc:122 msgid "Parsing error: %1" msgstr "" #: ../gtk/src/TessdataManager.cc:235 ../qt/src/TessdataManager.cc:232 msgid "Applying changes..." msgstr "" #: ../gtk/src/TessdataManager.cc:297 ../qt/src/TessdataManager.cc:278 msgid "Failed to create directory for tessdata files." msgstr "" #: ../gtk/src/TessdataManager.cc:306 ../qt/src/TessdataManager.cc:287 msgid "Downloading %1..." msgstr "" #: ../gtk/src/TessdataManager.cc:330 msgid "" "The following files could not be downloaded or removed:\n" "%1\n" "\n" "Check the connectivity and directory permissions.\n" "\n" "Hint: If you don't have write permissions in system folders, you can switch " "to user paths in the settings dialog." msgstr "" #: ../gtk/src/Utils.cc:64 msgid "Yes" msgstr "Yes" #: ../gtk/src/Utils.cc:67 msgid "No" msgstr "No" #: ../gtk/src/Utils.cc:76 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 "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 "" #: ../qt/data/CrashHandler.ui.h:3 msgid "" "

Tesseract has " "aborted

Tesseract (the OCR engine) has aborted while " "recognizing text. This may occur if the used traineddatas are corrupt or " "incomplatible with the version of tesseract in use, or due to a bug in " "tesseract.

The stacktrace below may provide additional information " "about where the crash occured.

" msgstr "" #: ../qt/data/MainWindow.ui.h:17 msgid "Flatbed" msgstr "" #: ../qt/data/MainWindow.ui.h:18 msgid "ADF Front" msgstr "" #: ../qt/data/MainWindow.ui.h:19 msgid "ADF Back" msgstr "" #: ../qt/data/MainWindow.ui.h:20 msgid "ADF Duplex" msgstr "" #. Remove & from some labels which designer insists in adding #: ../qt/data/MainWindow.ui.h:21 ../qt/src/Ui_MainWindow.hh:50 msgid "Sources" msgstr "" #: ../qt/data/MainWindow.ui.h:22 msgid "Zoom In" msgstr "" #: ../qt/data/MainWindow.ui.h:24 msgid "Zoom Out" msgstr "" #: ../qt/data/MainWindow.ui.h:26 msgid "Normal Size" msgstr "" #: ../qt/data/MainWindow.ui.h:28 msgid "Best Fit" msgstr "" #: ../qt/data/MainWindow.ui.h:30 msgid "Rotate Left" msgstr "" #: ../qt/data/MainWindow.ui.h:31 msgid "Rotate left" msgstr "" #: ../qt/data/MainWindow.ui.h:32 msgid "Rotate Right" msgstr "" #: ../qt/data/MainWindow.ui.h:33 msgid "Rotate right" msgstr "" #: ../qt/data/MainWindow.ui.h:34 msgid "Image Controls" msgstr "" #: ../qt/data/MainWindow.ui.h:36 msgid "Autodetect Layout" msgstr "" #: ../qt/data/MainWindow.ui.h:38 msgid "Toggle Output Pane" msgstr "" #: ../qt/data/PdfExportDialog.ui.h:5 msgid "Backend:" msgstr "" #: ../qt/data/PdfExportDialog.ui.h:8 msgid "Portrait" msgstr "" #: ../qt/data/PdfExportDialog.ui.h:9 msgid "Landscape" msgstr "" #: ../qt/src/hocr/HOCRPdfExporter.cc:142 msgid "Failed to write to file" msgstr "" #. Output toolbar #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:55 #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:56 msgid "Open hOCR file" msgstr "" #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:57 #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:58 msgid "Save as hOCR text" msgstr "" #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:79 #: ../qt/src/Ui_OutputEditorText.hh:106 msgid "Find and Replace" msgstr "" #: ../qt/src/MainWindow.cc:581 msgid "" "The following dictionary files were installed:\n" "%1" msgstr "" #: ../qt/src/TessdataManager.cc:308 msgid "" "The following files could not be downloaded or removed:\n" "%1\n" "\n" "Check the connectivity and directory permissions.\n" "Hint: If you don't have write permissions in system folders, you can switch " "to user paths in the settings dialog." msgstr "" #: ../qt/src/Ui_MainWindow.hh:51 msgid "Output" msgstr "" #: ../qt/src/Ui_MainWindow.hh:135 msgid "OCR mode:" msgstr "" #: ../qt/src/Ui_MainWindow.hh:209 msgid "Remove Image" msgstr "" #: ../qt/src/Ui_MainWindow.hh:212 msgid "Delete Image" msgstr "" #: ../qt/src/Ui_MainWindow.hh:215 msgid "Clear List" msgstr "" #: ../qt/src/Ui_OutputEditorText.hh:101 msgid "Strip Line Breaks" msgstr "" #: ../qt/src/Ui_OutputEditorText.hh:115 msgid "Save Output" msgstr "" #: ../qt/src/Ui_OutputEditorText.hh:117 msgid "Clear Output" msgstr "" gImageReader-3.3.1/po/it.po000066400000000000000000002145211351740627400154420ustar00rootroot00000000000000# 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: 2019-07-25 23:17+0200\n" "PO-Revision-Date: 2018-03-29 22:24+0000\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: Weblate 2.20-dev\n" #: ../data/gimagereader.desktop.in.h:1 msgid "OCR application" msgstr "Applicazione OCR" #: ../gtk/data/appmenu.ui.h:1 ../qt/src/Ui_MainWindow.hh:167 msgid "Redetect Languages" msgstr "Ri-rileva lingue" #: ../gtk/data/appmenu.ui.h:2 ../qt/src/Ui_MainWindow.hh:170 msgid "Manage Languages" msgstr "Gestione lingue" #: ../gtk/data/appmenu.ui.h:3 ../gtk/data/ConfigDialog.ui.h:1 #: ../qt/data/ConfigDialog.ui.h:1 ../qt/src/Ui_MainWindow.hh:173 msgid "Preferences" msgstr "Preferenze" #: ../gtk/data/appmenu.ui.h:4 ../gtk/data/ConfigDialog.ui.h:2 #: ../gtk/src/MainWindow.cc:482 ../qt/src/MainWindow.cc:481 #: ../qt/src/Ui_MainWindow.hh:178 msgid "Help" msgstr "Aiuto" #: ../gtk/data/appmenu.ui.h:5 ../qt/data/AboutDialog.ui.h:2 #: ../qt/src/Ui_MainWindow.hh:181 msgid "About" msgstr "Info" #: ../gtk/data/appmenu.ui.h:6 msgid "Quit" msgstr "Termina" #: ../gtk/data/ConfigDialog.ui.h:3 ../gtk/data/MainWindow.ui.h:47 #: ../gtk/data/OutputEditorHOCR.ui.h:3 ../gtk/data/PdfExportDialog.ui.h:3 #: ../gtk/src/FileDialogs.cc:152 ../gtk/src/Utils.cc:61 #: ../qt/data/ConfigDialog.ui.h:26 msgid "OK" msgstr "OK" #: ../gtk/data/ConfigDialog.ui.h:4 msgid "Output pane orientation:" msgstr "Orientamento riquadro output:" #: ../gtk/data/ConfigDialog.ui.h:5 msgid "Horizontal" msgstr "Orizzontale" #: ../gtk/data/ConfigDialog.ui.h:6 msgid "Vertical" msgstr "Verticale" #: ../gtk/data/ConfigDialog.ui.h:7 ../qt/data/ConfigDialog.ui.h:18 msgid "Query to install missing spellcheck dictionaries" msgstr "Chiedi di installare dizionari ortografici mancanti" #: ../gtk/data/ConfigDialog.ui.h:8 ../qt/data/ConfigDialog.ui.h:4 msgid "Automatically check for new program versions" msgstr "Verifica la disponibilità di nuove versioni" #: ../gtk/data/ConfigDialog.ui.h:9 ../qt/data/ConfigDialog.ui.h:3 msgid "Predefined language definitions:" msgstr "Definizioni di lingua predefinite:" #: ../gtk/data/ConfigDialog.ui.h:10 ../qt/data/ConfigDialog.ui.h:12 msgid "Additional language definitions:" msgstr "Ulteriori definizioni di lingue:" #: ../gtk/data/ConfigDialog.ui.h:11 ../qt/data/ConfigDialog.ui.h:20 msgid "The prefix of the tesseract language data file" msgstr "Il prefisso dei file lingua tesseract" #: ../gtk/data/ConfigDialog.ui.h:12 ../qt/data/ConfigDialog.ui.h:21 msgid "Prefix" msgstr "Prefisso" #: ../gtk/data/ConfigDialog.ui.h:13 ../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/ConfigDialog.ui.h:14 ../qt/data/ConfigDialog.ui.h:23 msgid "ISO Code" msgstr "Codice ISO" #: ../gtk/data/ConfigDialog.ui.h:15 ../qt/data/ConfigDialog.ui.h:24 msgid "The name of the language" msgstr "Il nome della lingua" #: ../gtk/data/ConfigDialog.ui.h:16 ../qt/data/ConfigDialog.ui.h:25 msgid "Name" msgstr "Nome" #: ../gtk/data/ConfigDialog.ui.h:17 ../gtk/data/MainWindow.ui.h:46 #: ../gtk/data/OutputEditorHOCR.ui.h:2 ../gtk/data/PdfExportDialog.ui.h:2 #: ../gtk/src/Acquirer.cc:34 ../gtk/src/FileDialogs.cc:151 #: ../gtk/src/Utils.cc:70 ../qt/data/ConfigDialog.ui.h:27 #: ../qt/data/MainWindow.ui.h:12 msgid "Cancel" msgstr "Interrompi" #: ../gtk/data/ConfigDialog.ui.h:18 ../qt/data/ConfigDialog.ui.h:5 msgid "Output pane font:" msgstr "Carattere per riquadro output:" #: ../gtk/data/ConfigDialog.ui.h:19 ../qt/data/ConfigDialog.ui.h:2 msgid "Default" msgstr "Predefinito" #: ../gtk/data/ConfigDialog.ui.h:20 ../qt/data/ConfigDialog.ui.h:6 msgid "Language data locations:" msgstr "Percorsi dati di lingua:" #: ../gtk/data/ConfigDialog.ui.h:21 ../qt/data/ConfigDialog.ui.h:13 msgid "Language definitions path:" msgstr "Percorso definizioni di lingua:" #: ../gtk/data/ConfigDialog.ui.h:22 ../qt/data/ConfigDialog.ui.h:28 msgid "Spelling dictionaries path:" msgstr "Percorso dizionari ortografici:" #: ../gtk/data/ConfigDialog.ui.h:23 ../qt/data/ConfigDialog.ui.h:10 msgid "System-wide paths" msgstr "Percorsi di sistema" #: ../gtk/data/ConfigDialog.ui.h:24 ../qt/data/ConfigDialog.ui.h:11 msgid "User paths" msgstr "Percorsi utente" #: ../gtk/data/ConfigDialog.ui.h:25 ../qt/data/ConfigDialog.ui.h:29 msgid "Automatically open exported documents with default application" msgstr "Apri i documenti esportati con l'applicazione predefinita" #: ../gtk/data/CrashHandler.ui.h:1 ../qt/src/CrashHandler.cc:38 msgid "Regenerate backtrace" msgstr "Rigenera backtrace" #: ../gtk/data/CrashHandler.ui.h:3 #, no-c-format msgid "" "The application has crashed\n" "\n" "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\n" "\n" "Per aiutare a migliorare l'applicazione, per favore segnalare il problema a " "manisandro@gmail.com, se possibile descrivendo cosa si stava facendo " "prima che l'applicazione smettesse di funzionare, e includendo " "l'informazione sottostante. Grazie." #: ../gtk/data/CrashHandler.ui.h:6 msgid "" "Tesseract has aborted\n" "\n" "Tesseract (the OCR engine) has aborted while recognizing text. This may " "occur if the used traineddatas are corrupt or incomplatible with the version " "of tesseract in use, or due to a bug in tesseract.\n" "\n" "The stacktrace below may provide additional information about where the " "crash occured.\n" msgstr "" "Tesseract si è arrestato\n" "\n" "Tesseract (la libreria OCR) si è arrestato durante la ricognizione del " "testo. Questo può succedere se i file traineddata sono corrotti oppure " "incompatibilit con la versione di tesseract in uso, oppure a causa di un " "errore in tesseract.\n" "\n" "Il stacktrace sotto potrebbe fornire ulteriori informazioni concernenti la " "causa dell'errore.\n" #: ../gtk/data/MainWindow.ui.h:1 ../qt/data/MainWindow.ui.h:39 msgid "Toggle output pane" msgstr "Mostra/nascondi riquadro output" #: ../gtk/data/MainWindow.ui.h:2 ../qt/src/Ui_MainWindow.hh:66 msgid "Rotate current page" msgstr "Ruota pagina corrente" #: ../gtk/data/MainWindow.ui.h:3 ../qt/src/Ui_MainWindow.hh:67 msgid "Rotate all pages" msgstr "Ruota tutte le pagine" #. Sources toolbar #: ../gtk/data/MainWindow.ui.h:4 ../qt/src/Ui_MainWindow.hh:192 msgid "Recent" msgstr "Recenti" #: ../gtk/data/MainWindow.ui.h:5 ../qt/src/Ui_MainWindow.hh:193 msgid "Paste" msgstr "Incolla" #: ../gtk/data/MainWindow.ui.h:6 ../qt/src/Ui_MainWindow.hh:194 msgid "Take Screenshot" msgstr "Cattura schermo" #: ../gtk/data/MainWindow.ui.h:7 ../qt/data/MainWindow.ui.h:23 msgid "Zoom in" msgstr "Ingrandisci" #: ../gtk/data/MainWindow.ui.h:8 ../qt/data/MainWindow.ui.h:25 msgid "Zoom out" msgstr "Rimpicciolisci" #: ../gtk/data/MainWindow.ui.h:9 ../qt/data/MainWindow.ui.h:27 msgid "Normal size" msgstr "Dimensioni normali" #: ../gtk/data/MainWindow.ui.h:10 ../qt/data/MainWindow.ui.h:29 msgid "Best fit" msgstr "Dimensioni ideali" #: ../gtk/data/MainWindow.ui.h:11 ../qt/src/Ui_MainWindow.hh:75 msgid "Select rotation mode" msgstr "Seleziona modalità di rotazione" #: ../gtk/data/MainWindow.ui.h:12 ../gtk/data/OutputEditorText.ui.h:13 #: ../qt/src/Ui_OutputEditorText.hh:95 msgid "Select insert mode" msgstr "Seleziona modalità di inserimento" #: ../gtk/data/MainWindow.ui.h:13 ../qt/src/Ui_MainWindow.hh:109 msgid "Select page" msgstr "Seleziona pagina" #: ../gtk/data/MainWindow.ui.h:14 ../qt/data/MainWindow.ui.h:35 msgid "Image controls" msgstr "Controlli immagine" #: ../gtk/data/MainWindow.ui.h:15 ../qt/src/Ui_MainWindow.hh:139 msgid "Plain text" msgstr "Testo" #: ../gtk/data/MainWindow.ui.h:16 ../qt/src/Ui_MainWindow.hh:139 msgid "hOCR, PDF" msgstr "hOCR, PDF" #: ../gtk/data/MainWindow.ui.h:17 ../qt/data/MainWindow.ui.h:37 msgid "Autodetect layout" msgstr "Rileva impaginazione" #: ../gtk/data/MainWindow.ui.h:18 msgid "Recognize all" msgstr "Riconosci tutto" #: ../gtk/data/MainWindow.ui.h:19 msgid "Select language" msgstr "Seleziona lingua" #: ../gtk/data/MainWindow.ui.h:20 ../qt/src/Ui_MainWindow.hh:205 msgid "Add images" msgstr "Aggiungi immagini" #: ../gtk/data/MainWindow.ui.h:21 ../qt/src/Ui_MainWindow.hh:204 msgid "Add Images" msgstr "Aggiungi immagini" #: ../gtk/data/MainWindow.ui.h:22 ../qt/src/Ui_MainWindow.hh:210 msgid "Remove image from list" msgstr "Rimuovi immagine dalla lista" #: ../gtk/data/MainWindow.ui.h:23 ../qt/src/Ui_MainWindow.hh:213 msgid "Delete image" msgstr "Elimina immagine" #: ../gtk/data/MainWindow.ui.h:24 ../qt/src/Ui_MainWindow.hh:216 msgid "Clear list" msgstr "Svuota lista" #: ../gtk/data/MainWindow.ui.h:25 ../qt/data/MainWindow.ui.h:5 msgid "Files" msgstr "File" #: ../gtk/data/MainWindow.ui.h:26 ../qt/data/MainWindow.ui.h:8 msgid "Device:" msgstr "Dispositivo:" #: ../gtk/data/MainWindow.ui.h:27 ../gtk/data/TessdataManager.ui.h:4 #: ../qt/data/MainWindow.ui.h:7 ../qt/src/TessdataManager.cc:59 msgid "Refresh" msgstr "Aggiorna" #: ../gtk/data/MainWindow.ui.h:28 ../qt/data/MainWindow.ui.h:9 msgid "Output:" msgstr "Output:" #: ../gtk/data/MainWindow.ui.h:29 ../qt/data/MainWindow.ui.h:13 msgid "Mode:" msgstr "Modalità:" #: ../gtk/data/MainWindow.ui.h:30 ../gtk/src/hocr/HOCRPdfExporter.cc:313 #: ../qt/data/MainWindow.ui.h:15 ../qt/src/hocr/HOCRPdfExporter.cc:347 msgid "Color" msgstr "Colore" #: ../gtk/data/MainWindow.ui.h:31 ../gtk/src/hocr/HOCRPdfExporter.cc:316 #: ../qt/data/MainWindow.ui.h:14 ../qt/src/hocr/HOCRPdfExporter.cc:349 #: ../qt/src/hocr/HOCRPdfExporter.cc:351 msgid "Grayscale" msgstr "Scala di grigi" #: ../gtk/data/MainWindow.ui.h:32 ../qt/data/MainWindow.ui.h:10 msgid "Resolution:" msgstr "Risoluzione:" #: ../gtk/data/MainWindow.ui.h:33 ../qt/data/MainWindow.ui.h:11 msgid "Scan" msgstr "Scansione" #: ../gtk/data/MainWindow.ui.h:34 ../qt/data/MainWindow.ui.h:16 msgid "Source:" msgstr "Fonte:" #: ../gtk/data/MainWindow.ui.h:35 ../qt/data/MainWindow.ui.h:6 msgid "Acquire" msgstr "Acquisci" #: ../gtk/data/MainWindow.ui.h:36 ../qt/data/MainWindow.ui.h:1 msgid "Brightness" msgstr "Luminosità" #: ../gtk/data/MainWindow.ui.h:37 ../qt/data/MainWindow.ui.h:2 msgid "Contrast" msgstr "Contrasto" #: ../gtk/data/MainWindow.ui.h:38 ../qt/data/MainWindow.ui.h:3 msgid "Resolution" msgstr "Risoluzione" #: ../gtk/data/MainWindow.ui.h:39 ../qt/data/MainWindow.ui.h:4 msgid "Invert colors" msgstr "Inverti colori" #: ../gtk/data/MainWindow.ui.h:40 msgid "A graphical frontend to tesseract-ocr" msgstr "Un'interfaccia grafica per tesseract-ocr" #: ../gtk/data/MainWindow.ui.h:41 ../qt/data/CharacterListDialog.ui.h:1 msgid "Character whitelist / blacklist" msgstr "Blacklist / whitelist di caratteri" #: ../gtk/data/MainWindow.ui.h:42 ../qt/data/CharacterListDialog.ui.h:2 msgid "Exclude these characters from being recognized (blacklist):" msgstr "Escludere questi caratteri dal OCR (blacklist):" #: ../gtk/data/MainWindow.ui.h:43 ../qt/data/CharacterListDialog.ui.h:3 msgid "Enter a string of characters..." msgstr "Inserire una stringa di caratteri..." #: ../gtk/data/MainWindow.ui.h:44 ../qt/data/CharacterListDialog.ui.h:4 msgid "Only allow the following characters to be recognized (whitelist):" msgstr "Permettere solo i seguenti caratteri per l'OCR (whitelist):" #: ../gtk/data/MainWindow.ui.h:45 ../qt/data/PageRangeDialog.ui.h:1 msgid "Page Range" msgstr "Intervallo pagine" #: ../gtk/data/MainWindow.ui.h:48 ../qt/data/PageRangeDialog.ui.h:2 msgid "Page range:" msgstr "Intervallo pagine:" #: ../gtk/data/MainWindow.ui.h:49 ../qt/data/PageRangeDialog.ui.h:3 msgid "Example: 1-10, 13, 14-18" msgstr "Esempio: 1-10, 13, 14-18" #: ../gtk/data/MainWindow.ui.h:50 ../qt/data/PageRangeDialog.ui.h:4 msgid "Recognition area:" msgstr "Area di ricognizione:" #: ../gtk/data/MainWindow.ui.h:51 ../gtk/src/Recognizer.cc:375 #: ../qt/data/PageRangeDialog.ui.h:5 ../qt/src/Recognizer.cc:369 msgid "Entire page" msgstr "Pagina intera" #: ../gtk/data/MainWindow.ui.h:52 ../qt/data/PageRangeDialog.ui.h:6 msgid "Autodetect" msgstr "Rileva automaticamente" #: ../gtk/data/MainWindow.ui.h:53 ../qt/data/PageRangeDialog.ui.h:7 msgid "Prepend to output text:" msgstr "Anteporre al testo di output:" #: ../gtk/data/MainWindow.ui.h:54 ../qt/data/PageRangeDialog.ui.h:8 msgid "Source filename" msgstr "Nome del file di origine" #: ../gtk/data/MainWindow.ui.h:55 ../qt/data/PageRangeDialog.ui.h:9 msgid "Source page" msgstr "Pagina di origine" #: ../gtk/data/MainWindow.ui.h:56 ../qt/src/SourceManager.cc:146 msgid "Protected PDF" msgstr "PDF protetto" #: ../gtk/data/MainWindow.ui.h:57 ../qt/src/Recognizer.cc:76 msgid "Current Page" msgstr "Pagina corrente" #: ../gtk/data/MainWindow.ui.h:58 ../qt/src/Recognizer.cc:79 msgid "Multiple Pages..." msgstr "Più pagine..." #: ../gtk/data/OutputEditorHOCR.ui.h:1 ../qt/src/hocr/OutputEditorHOCR.cc:580 msgid "Add Word" msgstr "Aggiungi parola" #: ../gtk/data/OutputEditorHOCR.ui.h:4 ../qt/src/hocr/OutputEditorHOCR.cc:580 msgid "Enter word:" msgstr "Aggiungi parola:" #: ../gtk/data/OutputEditorHOCR.ui.h:5 ../qt/src/hocr/Ui_OutputEditorHOCR.hh:61 #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:62 msgid "Export to plain text" msgstr "Esporta come testo" #: ../gtk/data/OutputEditorHOCR.ui.h:6 ../qt/src/hocr/Ui_OutputEditorHOCR.hh:64 #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:65 msgid "Export to PDF" msgstr "Esporta come PDF" #: ../gtk/data/OutputEditorHOCR.ui.h:7 ../qt/src/hocr/Ui_OutputEditorHOCR.hh:67 #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:68 msgid "Export to ODT" msgstr "Esporta come ODT" #: ../gtk/data/OutputEditorHOCR.ui.h:8 ../gtk/data/OutputEditorText.ui.h:18 #: ../qt/src/Ui_OutputEditorText.hh:116 msgid "Save output" msgstr "Salva output" #: ../gtk/data/OutputEditorHOCR.ui.h:9 ../qt/src/hocr/Ui_OutputEditorHOCR.hh:72 #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:73 msgid "Export" msgstr "Esporta" #: ../gtk/data/OutputEditorHOCR.ui.h:10 ../gtk/data/OutputEditorText.ui.h:19 #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:77 #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:78 #: ../qt/src/Ui_OutputEditorText.hh:118 msgid "Clear output" msgstr "Cancella output" #: ../gtk/data/OutputEditorHOCR.ui.h:11 ../gtk/data/OutputEditorText.ui.h:15 #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:80 #: ../qt/src/Ui_OutputEditorText.hh:107 msgid "Find and replace" msgstr "Cerca e sostituisci" #: ../gtk/data/OutputEditorHOCR.ui.h:12 #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:82 #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:83 msgid "Show confidence values" msgstr "Mostra valori di confidenza" #: ../gtk/data/OutputEditorHOCR.ui.h:13 ../gtk/data/PdfExportDialog.ui.h:41 #: ../qt/data/PdfExportDialog.ui.h:2 ../qt/src/hocr/Ui_OutputEditorHOCR.hh:85 #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:86 msgid "Show preview" msgstr "Mostra anteprima" #: ../gtk/data/OutputEditorHOCR.ui.h:14 #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:121 msgid "Next (F3)" msgstr "Successivo (F3)" #: ../gtk/data/OutputEditorHOCR.ui.h:15 #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:122 msgid "Previous (Shift+F3)" msgstr "Precedente (Shift+F3)" #: ../gtk/data/OutputEditorHOCR.ui.h:16 ../gtk/src/hocr/OutputEditorHOCR.cc:890 #: ../qt/src/hocr/OutputEditorHOCR.cc:730 #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:126 msgid "Expand all" msgstr "Espandi" #: ../gtk/data/OutputEditorHOCR.ui.h:17 ../gtk/src/hocr/OutputEditorHOCR.cc:893 #: ../qt/src/hocr/OutputEditorHOCR.cc:731 #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:127 msgid "Collapse all" msgstr "Contrai" #: ../gtk/data/OutputEditorHOCR.ui.h:18 #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:148 msgid "Properties" msgstr "Proprietà" #: ../gtk/data/OutputEditorHOCR.ui.h:19 #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:152 msgid "Source" msgstr "Fonte" #. Output insert mode #: ../gtk/data/OutputEditorText.ui.h:1 ../qt/src/Ui_OutputEditorText.hh:52 msgid "Append to current text" msgstr "Appendi al testo esistente" #: ../gtk/data/OutputEditorText.ui.h:2 ../qt/src/Ui_OutputEditorText.hh:53 msgid "Insert at cursor" msgstr "Inserisci al cursore" #: ../gtk/data/OutputEditorText.ui.h:3 ../qt/src/Ui_OutputEditorText.hh:54 msgid "Replace current text" msgstr "Sostituisci testo esistente" #. Output postprocessing #: ../gtk/data/OutputEditorText.ui.h:4 ../qt/src/Ui_OutputEditorText.hh:62 msgid "Keep line break if..." msgstr "Tenere interruzioni di linea se..." #: ../gtk/data/OutputEditorText.ui.h:5 ../qt/src/Ui_OutputEditorText.hh:64 msgid "Preceded by end mark (.?!)" msgstr "Preceduto da punteggiatura di fine periodo (.?!)" #: ../gtk/data/OutputEditorText.ui.h:6 ../qt/src/Ui_OutputEditorText.hh:66 msgid "Preceded or succeeded by quote" msgstr "Preceduto o seguito da virgolette" #: ../gtk/data/OutputEditorText.ui.h:7 ../qt/src/Ui_OutputEditorText.hh:68 msgid "Other options" msgstr "Altre opzioni" #: ../gtk/data/OutputEditorText.ui.h:8 ../qt/src/Ui_OutputEditorText.hh:70 msgid "Join hyphenated words" msgstr "Unisci parole divise" #: ../gtk/data/OutputEditorText.ui.h:9 ../qt/src/Ui_OutputEditorText.hh:72 msgid "Collapse whitespace" msgstr "Collassa spazi bianchi" #: ../gtk/data/OutputEditorText.ui.h:10 ../qt/src/Ui_OutputEditorText.hh:74 msgid "Preserve paragraphs" msgstr "Preserva paragrafi" #: ../gtk/data/OutputEditorText.ui.h:11 ../qt/src/Ui_OutputEditorText.hh:76 msgid "Visual aids" msgstr "Aiuti visuali" #: ../gtk/data/OutputEditorText.ui.h:12 ../qt/src/Ui_OutputEditorText.hh:78 msgid "Draw whitespace" msgstr "Disegna spazi bianchi" #: ../gtk/data/OutputEditorText.ui.h:14 ../qt/src/Ui_OutputEditorText.hh:102 msgid "Strip line breaks on selected text" msgstr "Rimuovi interruzioni di riga nel testo selezionato" #: ../gtk/data/OutputEditorText.ui.h:16 ../qt/src/Ui_OutputEditorText.hh:109 #: ../qt/src/Ui_OutputEditorText.hh:110 msgid "Undo" msgstr "Annulla" #: ../gtk/data/OutputEditorText.ui.h:17 ../qt/src/Ui_OutputEditorText.hh:112 #: ../qt/src/Ui_OutputEditorText.hh:113 msgid "Redo" msgstr "Ripeti" #: ../gtk/data/PdfExportDialog.ui.h:1 ../qt/data/PdfExportDialog.ui.h:1 msgid "PDF Export" msgstr "Esportazione PDF" #: ../gtk/data/PdfExportDialog.ui.h:4 ../qt/data/PdfExportDialog.ui.h:4 msgid "Output mode:" msgstr "Modalità:" #: ../gtk/data/PdfExportDialog.ui.h:5 ../qt/data/PdfExportDialog.ui.h:6 msgid "PDF" msgstr "PDF" #: ../gtk/data/PdfExportDialog.ui.h:6 ../qt/data/PdfExportDialog.ui.h:7 msgid "PDF with invisible text overlay" msgstr "PDF con testo invisibile" #: ../gtk/data/PdfExportDialog.ui.h:7 ../qt/data/PdfExportDialog.ui.h:16 msgid "Format:" msgstr "Formato:" #: ../gtk/data/PdfExportDialog.ui.h:8 ../qt/data/PdfExportDialog.ui.h:17 msgid "Compression:" msgstr "Compressione:" #: ../gtk/data/PdfExportDialog.ui.h:9 ../qt/data/PdfExportDialog.ui.h:14 msgid "Compression quality:" msgstr "Qualità di compressione:" #: ../gtk/data/PdfExportDialog.ui.h:10 ../qt/data/PdfExportDialog.ui.h:15 msgid "DPI:" msgstr "DPI:" #: ../gtk/data/PdfExportDialog.ui.h:11 ../qt/data/PdfExportDialog.ui.h:18 msgid "Dithering algorithm:" msgstr "Algoritmo di dithering:" #: ../gtk/data/PdfExportDialog.ui.h:12 ../qt/data/PdfExportDialog.ui.h:13 msgid "Image settings:" msgstr "Impostazioni immagini:" #: ../gtk/data/PdfExportDialog.ui.h:13 ../qt/data/PdfExportDialog.ui.h:25 msgid "Uniformize line and word spacing" msgstr "Omogenizza la spaziatura" #: ../gtk/data/PdfExportDialog.ui.h:14 ../qt/data/PdfExportDialog.ui.h:21 msgid "Override font family:" msgstr "Usa sempre il seguente carattere:" #: ../gtk/data/PdfExportDialog.ui.h:15 ../qt/data/PdfExportDialog.ui.h:27 msgid "Fallback font family:" msgstr "Carattere di fallback:" #: ../gtk/data/PdfExportDialog.ui.h:16 ../qt/data/PdfExportDialog.ui.h:20 msgid "Override font size:" msgstr "Usa sempre la seguente dimensione carattere:" #: ../gtk/data/PdfExportDialog.ui.h:17 ../qt/data/PdfExportDialog.ui.h:23 msgid "Font scaling:" msgstr "Ridimensiona carattere:" #: ../gtk/data/PdfExportDialog.ui.h:18 ../qt/data/PdfExportDialog.ui.h:26 msgid "pt" msgstr "pt" #: ../gtk/data/PdfExportDialog.ui.h:19 ../qt/data/PdfExportDialog.ui.h:22 msgid "Preserve spaces wider than:" msgstr "Preserva spazi più larghi di:" #: ../gtk/data/PdfExportDialog.ui.h:20 ../qt/data/PdfExportDialog.ui.h:24 msgid "characters" msgstr "caratteri" #: ../gtk/data/PdfExportDialog.ui.h:21 ../qt/data/PdfExportDialog.ui.h:28 msgid "Sanitize hyphens before line breaks" msgstr "Correggere i trattini prima delle interruzioni di riga" #: ../gtk/data/PdfExportDialog.ui.h:22 ../qt/data/PdfExportDialog.ui.h:19 msgid "Text settings:" msgstr "Impostazioni testo:" #: ../gtk/data/PdfExportDialog.ui.h:23 ../qt/data/PdfExportDialog.ui.h:10 msgid "Paper size:" msgstr "Dimensione pagina:" #: ../gtk/data/PdfExportDialog.ui.h:24 ../qt/data/PdfExportDialog.ui.h:11 msgid "Width" msgstr "Larghezza" #: ../gtk/data/PdfExportDialog.ui.h:25 ../qt/data/PdfExportDialog.ui.h:12 msgid "Height" msgstr "Altezza" #: ../gtk/data/PdfExportDialog.ui.h:26 ../qt/data/PdfExportDialog.ui.h:29 msgid "Treat image sources as having true DPI:" msgstr "Assumere che le sorgenti immagini abbiano DPI:" #: ../gtk/data/PdfExportDialog.ui.h:27 ../qt/data/PdfExportDialog.ui.h:3 msgid "Basic" msgstr "Base" #: ../gtk/data/PdfExportDialog.ui.h:28 ../qt/data/PdfExportDialog.ui.h:31 msgid "PDF version:" msgstr "Versione PDF:" #: ../gtk/data/PdfExportDialog.ui.h:29 ../qt/data/PdfExportDialog.ui.h:33 msgid "Password:" msgstr "Password:" #: ../gtk/data/PdfExportDialog.ui.h:30 ../qt/data/PdfExportDialog.ui.h:34 msgid "Confirm password:" msgstr "Conferma password:" #: ../gtk/data/PdfExportDialog.ui.h:31 ../qt/data/PdfExportDialog.ui.h:32 msgid "Encryption (optional):" msgstr "Protezione (opzionale):" #: ../gtk/data/PdfExportDialog.ui.h:32 ../qt/data/PdfExportDialog.ui.h:36 msgid "Author:" msgstr "Autore:" #: ../gtk/data/PdfExportDialog.ui.h:33 ../qt/data/PdfExportDialog.ui.h:38 msgid "Title:" msgstr "Titolo:" #: ../gtk/data/PdfExportDialog.ui.h:34 ../qt/data/PdfExportDialog.ui.h:40 msgid "Subject:" msgstr "Soggetto:" #: ../gtk/data/PdfExportDialog.ui.h:35 ../qt/data/PdfExportDialog.ui.h:37 msgid "Creator:" msgstr "Creatore:" #: ../gtk/data/PdfExportDialog.ui.h:36 ../qt/data/PdfExportDialog.ui.h:39 msgid "Producer:" msgstr "Produttore:" #: ../gtk/data/PdfExportDialog.ui.h:37 ../qt/data/PdfExportDialog.ui.h:41 msgid "Keywords:" msgstr "Parole chiave:" #: ../gtk/data/PdfExportDialog.ui.h:38 ../qt/data/PdfExportDialog.ui.h:35 msgid "Additional information (optional):" msgstr "Ulteriori informazioni (opzionale):" #: ../gtk/data/PdfExportDialog.ui.h:39 ../qt/data/PdfExportDialog.ui.h:42 msgid "Import from current source" msgstr "Importa dalla sorgente corrente" #: ../gtk/data/PdfExportDialog.ui.h:40 ../qt/data/PdfExportDialog.ui.h:30 msgid "Advanced" msgstr "Avanzato" #: ../gtk/data/SearchReplaceFrame.ui.h:1 ../qt/data/SearchReplaceFrame.ui.h:4 msgid "Find" msgstr "Cerca" #: ../gtk/data/SearchReplaceFrame.ui.h:2 ../qt/data/SearchReplaceFrame.ui.h:2 msgid "Replace" msgstr "Sostituisci" #: ../gtk/data/SearchReplaceFrame.ui.h:3 ../qt/data/SearchReplaceFrame.ui.h:3 msgid "Replace all" msgstr "Sostituire tutte" #: ../gtk/data/SearchReplaceFrame.ui.h:4 ../qt/data/SearchReplaceFrame.ui.h:5 msgid "Find previous" msgstr "Cerca precedente" #: ../gtk/data/SearchReplaceFrame.ui.h:5 ../qt/data/SearchReplaceFrame.ui.h:6 msgid "Find next" msgstr "Cerca successivo" #: ../gtk/data/SearchReplaceFrame.ui.h:6 ../qt/data/SearchReplaceFrame.ui.h:7 msgid "Match case" msgstr "Considera maiuscole e minuscole" #: ../gtk/data/SearchReplaceFrame.ui.h:7 #: ../gtk/data/SubstitutionsManager.ui.h:1 ../qt/data/SearchReplaceFrame.ui.h:1 #: ../qt/src/SubstitutionsManager.cc:36 msgid "Substitutions" msgstr "Sostituzioni" #: ../gtk/data/SelectionMenu.ui.h:1 ../qt/src/DisplayerToolSelect.cc:239 msgid "Delete" msgstr "Elimina" #: ../gtk/data/SelectionMenu.ui.h:2 ../qt/src/DisplayerToolSelect.cc:225 msgid "Order:" msgstr "Ordine:" #: ../gtk/data/SelectionMenu.ui.h:3 ../gtk/src/hocr/DisplayerToolHOCR.cc:29 #: ../qt/src/DisplayerToolSelect.cc:240 ../qt/src/hocr/DisplayerToolHOCR.cc:31 msgid "Recognize" msgstr "Riconosci" #: ../gtk/data/SelectionMenu.ui.h:4 ../qt/src/DisplayerToolSelect.cc:241 msgid "Recognize to clipboard" msgstr "Riconosci negli appunti" #: ../gtk/data/SelectionMenu.ui.h:5 ../qt/src/DisplayerToolSelect.cc:242 msgid "Save as image" msgstr "Salva come immagine" #: ../gtk/data/SubstitutionsManager.ui.h:2 ../qt/src/SubstitutionsManager.cc:38 #: ../qt/src/SubstitutionsManager.cc:39 msgid "Open" msgstr "Apri" #: ../gtk/data/SubstitutionsManager.ui.h:3 ../gtk/src/Utils.cc:73 #: ../qt/src/SubstitutionsManager.cc:41 ../qt/src/SubstitutionsManager.cc:42 msgid "Save" msgstr "Salva" #: ../gtk/data/SubstitutionsManager.ui.h:4 ../qt/src/SubstitutionsManager.cc:44 #: ../qt/src/SubstitutionsManager.cc:45 msgid "Clear" msgstr "Svuota lista" #: ../gtk/data/SubstitutionsManager.ui.h:5 ../qt/data/ConfigDialog.ui.h:16 #: ../qt/src/SubstitutionsManager.cc:47 ../qt/src/SubstitutionsManager.cc:48 msgid "Add" msgstr "Aggiungi" #: ../gtk/data/SubstitutionsManager.ui.h:6 #: ../gtk/src/hocr/OutputEditorHOCR.cc:886 ../qt/data/ConfigDialog.ui.h:17 #: ../qt/src/hocr/OutputEditorHOCR.cc:727 ../qt/src/SubstitutionsManager.cc:50 #: ../qt/src/SubstitutionsManager.cc:51 msgid "Remove" msgstr "Rimuovi" #: ../gtk/data/SubstitutionsManager.ui.h:7 ../gtk/data/TessdataManager.ui.h:2 msgid "Apply" msgstr "Applica" #: ../gtk/data/SubstitutionsManager.ui.h:8 ../gtk/data/TessdataManager.ui.h:3 msgid "Close" msgstr "Chiudi" #: ../gtk/data/TessdataManager.ui.h:1 ../qt/src/TessdataManager.cc:49 msgid "Tessdata Manager" msgstr "Gestione tessdata" #: ../gtk/data/TessdataManager.ui.h:5 ../qt/src/TessdataManager.cc:51 msgid "Manage installed languages:" msgstr "Gestione delle lingue installate:" #: ../gtk/src/Acquirer.cc:79 ../qt/src/Acquirer.cc:70 msgid "scan.png" msgstr "scansione.png" #: ../gtk/src/Acquirer.cc:91 ../qt/src/Acquirer.cc:85 msgid "Images" msgstr "Immagini" #: ../gtk/src/Acquirer.cc:92 ../qt/src/Acquirer.cc:86 msgid "Choose Output Filename..." msgstr "Scegli nome file di output..." #: ../gtk/src/Acquirer.cc:106 ../qt/src/Acquirer.cc:100 msgid "Failed to initialize the scanning backend." msgstr "Inizializzazione backend di scansione fallita." #: ../gtk/src/Acquirer.cc:115 ../qt/src/Acquirer.cc:106 msgid "Scan failed" msgstr "Scansione fallita" #: ../gtk/src/Acquirer.cc:133 ../qt/src/Acquirer.cc:122 msgid "No scanners were detected." msgstr "Nessun scanner è stato rilevato." #: ../gtk/src/Acquirer.cc:150 ../gtk/src/Acquirer.cc:168 #: ../qt/src/Acquirer.cc:136 ../qt/src/Acquirer.cc:154 msgid "Starting scan..." msgstr "Inizializzando scansione..." #: ../gtk/src/Acquirer.cc:164 ../qt/src/Acquirer.cc:150 msgid "Opening device..." msgstr "Aprendo dispositivo..." #: ../gtk/src/Acquirer.cc:166 ../qt/src/Acquirer.cc:152 msgid "Setting options..." msgstr "Settando impostazioni..." #: ../gtk/src/Acquirer.cc:170 ../qt/src/Acquirer.cc:156 msgid "Getting parameters..." msgstr "Leggendo parametri..." #: ../gtk/src/Acquirer.cc:172 ../qt/src/Acquirer.cc:158 msgid "Transferring data..." msgstr "Trasferendo dati..." #: ../gtk/src/Acquirer.cc:179 ../qt/src/Acquirer.cc:165 msgid "Canceling scan..." msgstr "Interrompendo scansione..." #: ../gtk/src/Config.cc:49 ../qt/data/ConfigDialog.ui.h:7 msgid "Filename prefix" msgstr "Prefisso nome file" #: ../gtk/src/Config.cc:50 ../qt/data/ConfigDialog.ui.h:8 msgid "Code" msgstr "Codice" #: ../gtk/src/Config.cc:51 ../qt/data/ConfigDialog.ui.h:9 msgid "Native name" msgstr "Nome nativo" #: ../gtk/src/Config.cc:109 ../qt/src/Config.cc:108 msgid "Script" msgstr "Carattere" #: ../gtk/src/CrashHandler.cc:25 ../gtk/src/CrashHandler.cc:41 #: ../qt/src/CrashHandler.cc:36 msgid "Crash Handler" msgstr "Crash Handler" #: ../gtk/src/CrashHandler.cc:43 ../qt/src/CrashHandler.cc:31 msgid "Your work has been saved under %1." msgstr "Il lavoro è stato salvato sotto %1." #: ../gtk/src/CrashHandler.cc:45 ../qt/src/CrashHandler.cc:33 msgid "There was no unsaved work." msgstr "Non vi è lavoro non salvato." #: ../gtk/src/CrashHandler.cc:106 ../qt/src/CrashHandler.cc:62 msgid "Failed to obtain backtrace. Is gdb installed?" msgstr "Impossibile ottenere un backtrace. È installato gdb?" #: ../gtk/src/Displayer.cc:232 ../qt/src/Displayer.cc:174 msgid "Failed to load image" msgstr "Caricamento immagine fallito" #: ../gtk/src/Displayer.cc:232 ../qt/src/Displayer.cc:174 msgid "" "The file might not be an image or be corrupt:\n" "%1" msgstr "" "Il file non è un'immagine oppure è corrotto:\n" "%1" #: ../gtk/src/DisplayerToolSelect.cc:138 ../qt/src/DisplayerToolSelect.cc:135 msgid "PNG Images" msgstr "Immagini PNG" #: ../gtk/src/DisplayerToolSelect.cc:139 ../qt/src/DisplayerToolSelect.cc:135 msgid "Save Selection Image" msgstr "Salva immagine selezionata" #: ../gtk/src/DisplayerToolSelect.cc:139 ../qt/src/DisplayerToolSelect.cc:135 msgid "selection.png" msgstr "selezione.png" #: ../gtk/src/DisplayerToolSelect.cc:146 ../qt/src/DisplayerToolSelect.cc:142 msgid "Recognize all" msgstr "Riconosci tutto" #: ../gtk/src/DisplayerToolSelect.cc:146 ../qt/src/DisplayerToolSelect.cc:142 msgid "Recognize selection" msgstr "Riconosci selezione" #: ../gtk/src/DisplayerToolSelect.cc:186 ../qt/src/DisplayerToolSelect.cc:182 msgid "Performing layout analysis" msgstr "Rilevando impaginazione" #: ../gtk/src/FileDialogs.cc:235 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:237 msgid "Overwrite File?" msgstr "Sovrascrivere il file?" #: ../gtk/src/hocr/HOCRDocument.cc:611 ../gtk/src/hocr/OutputEditorHOCR.cc:266 #: ../qt/src/hocr/OutputEditorHOCR.cc:229 msgid "Page" msgstr "Pagina" #: ../gtk/src/hocr/HOCRDocument.cc:613 ../qt/src/hocr/HOCRDocument.cc:530 msgid "Text block" msgstr "Blocco di testo" #: ../gtk/src/hocr/HOCRDocument.cc:615 ../gtk/src/hocr/OutputEditorHOCR.cc:272 #: ../qt/src/hocr/HOCRDocument.cc:532 ../qt/src/hocr/OutputEditorHOCR.cc:231 msgid "Paragraph" msgstr "Paragrafo" #: ../gtk/src/hocr/HOCRDocument.cc:617 ../qt/src/hocr/HOCRDocument.cc:534 msgid "Textline" msgstr "Riga" #: ../gtk/src/hocr/HOCRDocument.cc:621 ../qt/src/hocr/HOCRDocument.cc:538 msgid "Graphic" msgstr "Grafica" #: ../gtk/src/hocr/HOCROdtExporter.cc:65 ../gtk/src/hocr/HOCRPdfExporter.cc:489 #: ../gtk/src/hocr/HOCRTextExporter.cc:34 #: ../gtk/src/hocr/OutputEditorHOCR.cc:963 ../gtk/src/OutputEditorText.cc:272 #: ../qt/src/hocr/HOCROdtExporter.cc:50 ../qt/src/hocr/HOCRPdfExporter.cc:478 #: ../qt/src/hocr/HOCRTextExporter.cc:36 ../qt/src/hocr/OutputEditorHOCR.cc:830 #: ../qt/src/OutputEditorText.cc:238 msgid "output" msgstr "output" #: ../gtk/src/hocr/HOCROdtExporter.cc:68 ../qt/src/hocr/HOCROdtExporter.cc:53 msgid "OpenDocument Text Documents" msgstr "Documenti di testo OpenDocument" #: ../gtk/src/hocr/HOCROdtExporter.cc:69 ../qt/src/hocr/HOCROdtExporter.cc:53 msgid "Save ODT Output..." msgstr "Salva output ODT..." #: ../gtk/src/hocr/HOCROdtExporter.cc:77 ../gtk/src/hocr/HOCROdtExporter.cc:342 #: ../gtk/src/hocr/HOCRPdfExporter.cc:619 #: ../gtk/src/hocr/HOCRTextExporter.cc:46 ../qt/src/hocr/HOCROdtExporter.cc:61 #: ../qt/src/hocr/HOCRPdfExporter.cc:609 ../qt/src/hocr/HOCRTextExporter.cc:47 msgid "Export failed" msgstr "Esportazione fallita" #: ../gtk/src/hocr/HOCROdtExporter.cc:77 ../gtk/src/hocr/HOCROdtExporter.cc:342 #: ../qt/src/hocr/HOCROdtExporter.cc:61 msgid "The ODT export failed: unable to write output file." msgstr "L'esportazione ODT è fallita: impossibile scrivere il file di output." #: ../gtk/src/hocr/HOCROdtExporter.cc:336 ../qt/src/hocr/HOCROdtExporter.cc:254 msgid "Exporting to ODT..." msgstr "Esportando come ODT..." #: ../gtk/src/hocr/HOCRPdfExporter.cc:283 ../qt/src/hocr/HOCRPdfExporter.cc:365 msgid "Same as source" msgstr "Uguale alla sorgente" #: ../gtk/src/hocr/HOCRPdfExporter.cc:286 ../qt/src/hocr/HOCRPdfExporter.cc:366 msgid "Custom" msgstr "Personalizzata" #: ../gtk/src/hocr/HOCRPdfExporter.cc:300 ../qt/src/hocr/HOCRPdfExporter.cc:362 msgid "cm" msgstr "cm" #: ../gtk/src/hocr/HOCRPdfExporter.cc:303 ../qt/src/hocr/HOCRPdfExporter.cc:363 msgid "in" msgstr "in" #: ../gtk/src/hocr/HOCRPdfExporter.cc:319 ../qt/src/hocr/HOCRPdfExporter.cc:353 msgid "Monochrome" msgstr "Monocromatico" #: ../gtk/src/hocr/HOCRPdfExporter.cc:328 ../qt/src/hocr/HOCRPdfExporter.cc:355 msgid "Threshold (closest color)" msgstr "Threshold (colore più vicino)" #: ../gtk/src/hocr/HOCRPdfExporter.cc:331 ../qt/src/hocr/HOCRPdfExporter.cc:356 msgid "Diffuse" msgstr "Diffusione" #: ../gtk/src/hocr/HOCRPdfExporter.cc:340 ../qt/src/hocr/HOCRPdfExporter.cc:357 msgid "Zip (lossless)" msgstr "Zip (lossless)" #: ../gtk/src/hocr/HOCRPdfExporter.cc:344 ../qt/src/hocr/HOCRPdfExporter.cc:358 msgid "CCITT Group 4 (lossless)" msgstr "CCITT Group 4 (lossless)" #: ../gtk/src/hocr/HOCRPdfExporter.cc:348 ../qt/src/hocr/HOCRPdfExporter.cc:359 msgid "Jpeg (lossy)" msgstr "Jpeg (lossy)" #: ../gtk/src/hocr/HOCRPdfExporter.cc:493 ../qt/src/hocr/HOCRPdfExporter.cc:482 msgid "PDF Files" msgstr "File PDF" #: ../gtk/src/hocr/HOCRPdfExporter.cc:494 ../qt/src/hocr/HOCRPdfExporter.cc:482 msgid "Save PDF Output..." msgstr "Salva output PDF..." #: ../gtk/src/hocr/HOCRPdfExporter.cc:500 ../qt/src/hocr/HOCRPdfExporter.cc:488 msgid "Invalid Output" msgstr "Output invalido" #: ../gtk/src/hocr/HOCRPdfExporter.cc:500 ../qt/src/hocr/HOCRPdfExporter.cc:488 msgid "Cannot overwrite a file which is a source image of this document." msgstr "" "Impossibile sovrascrivere un file che è una sorgente del documento corrente." #: ../gtk/src/hocr/HOCRPdfExporter.cc:516 ../qt/src/hocr/HOCRPdfExporter.cc:511 msgid "Failed to create output" msgstr "Impossibile creare l'output" #: ../gtk/src/hocr/HOCRPdfExporter.cc:516 ../qt/src/hocr/HOCRPdfExporter.cc:511 msgid "Failed to create output. The returned error was: %1" msgstr "Impossibile creare l'output. L'errore segnalato è: %1" #: ../gtk/src/hocr/HOCRPdfExporter.cc:558 ../qt/src/hocr/HOCRPdfExporter.cc:551 msgid "The operation was cancelled" msgstr "L'operazione è stata annullata" #: ../gtk/src/hocr/HOCRPdfExporter.cc:607 ../qt/src/hocr/HOCRPdfExporter.cc:597 msgid "Failed to render page %1" msgstr "Errore renderizzando la pagina %1" #: ../gtk/src/hocr/HOCRPdfExporter.cc:614 ../qt/src/hocr/HOCRPdfExporter.cc:604 msgid "Exporting to PDF..." msgstr "Esportando come PDF..." #: ../gtk/src/hocr/HOCRPdfExporter.cc:619 ../qt/src/hocr/HOCRPdfExporter.cc:609 msgid "The PDF export failed: %1." msgstr "L'esportazione come PDF è fallita: %1." #: ../gtk/src/hocr/HOCRPdfExporter.cc:673 ../qt/src/hocr/HOCRPdfExporter.cc:662 msgid "The PDF library could not load the font '%1'." msgstr "La libreria PDF non supporta il carattere '%1'." #: ../gtk/src/hocr/HOCRTextExporter.cc:37 ../gtk/src/OutputEditorText.cc:274 #: ../qt/src/hocr/HOCRTextExporter.cc:39 ../qt/src/OutputEditorText.cc:239 msgid "Text Files" msgstr "File di testo" #: ../gtk/src/hocr/HOCRTextExporter.cc:38 ../qt/src/hocr/HOCRTextExporter.cc:39 msgid "Save Text Output..." msgstr "Salva output come testo..." #: ../gtk/src/hocr/HOCRTextExporter.cc:46 ../qt/src/hocr/HOCRTextExporter.cc:47 msgid "The text export failed: unable to write output file." msgstr "L'esportazione è fallita: impossibile scrivere il file di output." #: ../gtk/src/hocr/OutputEditorHOCR.cc:269 #: ../qt/src/hocr/OutputEditorHOCR.cc:230 msgid "Block" msgstr "Blocco" #: ../gtk/src/hocr/OutputEditorHOCR.cc:275 #: ../qt/src/hocr/OutputEditorHOCR.cc:232 msgid "Line" msgstr "Riga" #: ../gtk/src/hocr/OutputEditorHOCR.cc:278 #: ../qt/src/hocr/OutputEditorHOCR.cc:233 msgid "Word" msgstr "Parola" #: ../gtk/src/hocr/OutputEditorHOCR.cc:281 #: ../qt/src/hocr/OutputEditorHOCR.cc:234 msgid "Misspelled word" msgstr "Errori ortografici" #: ../gtk/src/hocr/OutputEditorHOCR.cc:435 #: ../qt/src/hocr/OutputEditorHOCR.cc:317 msgid "" "The following pages could not be processed:\n" "%1" msgstr "" "Non è stato possibile processare le seguenti pagine:\n" "%1" #: ../gtk/src/hocr/OutputEditorHOCR.cc:436 #: ../qt/src/hocr/OutputEditorHOCR.cc:318 msgid "Recognition errors" msgstr "Errori di ricognizione" #: ../gtk/src/hocr/OutputEditorHOCR.cc:594 #: ../qt/src/hocr/OutputEditorHOCR.cc:500 #: ../qt/src/hocr/OutputEditorHOCR.cc:512 msgid "Multiple values" msgstr "Valori multipli" #. Merging allowed #: ../gtk/src/hocr/OutputEditorHOCR.cc:778 #: ../qt/src/hocr/OutputEditorHOCR.cc:641 msgid "Merge" msgstr "Unisci" #: ../gtk/src/hocr/OutputEditorHOCR.cc:786 #: ../gtk/src/hocr/OutputEditorHOCR.cc:877 #: ../qt/src/hocr/OutputEditorHOCR.cc:643 #: ../qt/src/hocr/OutputEditorHOCR.cc:725 msgid "Split from parent" msgstr "Separa dal gruppo" #. Swapping allowed #: ../gtk/src/hocr/OutputEditorHOCR.cc:797 #: ../qt/src/hocr/OutputEditorHOCR.cc:647 msgid "Swap" msgstr "Scambia" #: ../gtk/src/hocr/OutputEditorHOCR.cc:821 #: ../qt/src/hocr/OutputEditorHOCR.cc:693 msgid "Add graphic region" msgstr "Aggiungi regione grafica" #: ../gtk/src/hocr/OutputEditorHOCR.cc:824 #: ../qt/src/hocr/OutputEditorHOCR.cc:694 msgid "Add text block" msgstr "Aggiungi blocco di testo" #: ../gtk/src/hocr/OutputEditorHOCR.cc:828 #: ../qt/src/hocr/OutputEditorHOCR.cc:696 msgid "Add paragraph" msgstr "Aggiungi paragrafo" #: ../gtk/src/hocr/OutputEditorHOCR.cc:832 #: ../qt/src/hocr/OutputEditorHOCR.cc:698 msgid "Add line" msgstr "Aggiungi riga" #: ../gtk/src/hocr/OutputEditorHOCR.cc:836 #: ../qt/src/hocr/OutputEditorHOCR.cc:700 msgid "Add word" msgstr "Aggiungi parola" #: ../gtk/src/hocr/OutputEditorHOCR.cc:852 #: ../qt/src/hocr/OutputEditorHOCR.cc:710 msgid "No suggestions" msgstr "Nessun suggerimento" #: ../gtk/src/hocr/OutputEditorHOCR.cc:858 #: ../qt/src/hocr/OutputEditorHOCR.cc:714 msgid "Add to dictionary" msgstr "Aggiungi al dizionario" #: ../gtk/src/hocr/OutputEditorHOCR.cc:864 #: ../qt/src/hocr/OutputEditorHOCR.cc:716 msgid "Ignore word" msgstr "Ignora parola" #: ../gtk/src/hocr/OutputEditorHOCR.cc:926 #: ../gtk/src/hocr/OutputEditorHOCR.cc:965 #: ../qt/src/hocr/OutputEditorHOCR.cc:795 #: ../qt/src/hocr/OutputEditorHOCR.cc:832 msgid "hOCR HTML Files" msgstr "File HTML hOCR" #: ../gtk/src/hocr/OutputEditorHOCR.cc:927 #: ../qt/src/hocr/OutputEditorHOCR.cc:795 msgid "Open hOCR File" msgstr "Apri file hOCR" #: ../gtk/src/hocr/OutputEditorHOCR.cc:936 #: ../qt/src/hocr/OutputEditorHOCR.cc:802 msgid "Failed to open file" msgstr "Impossibile aprire il file" #: ../gtk/src/hocr/OutputEditorHOCR.cc:936 #: ../qt/src/hocr/OutputEditorHOCR.cc:802 msgid "The file could not be opened: %1." msgstr "Non è stato possibile aprire il file: %1." #: ../gtk/src/hocr/OutputEditorHOCR.cc:945 #: ../qt/src/hocr/OutputEditorHOCR.cc:809 msgid "Invalid hOCR file" msgstr "File hOCR invalido" #: ../gtk/src/hocr/OutputEditorHOCR.cc:945 #: ../qt/src/hocr/OutputEditorHOCR.cc:809 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/hocr/OutputEditorHOCR.cc:966 #: ../qt/src/hocr/OutputEditorHOCR.cc:832 msgid "Save hOCR Output..." msgstr "Salva output hOCR..." #: ../gtk/src/hocr/OutputEditorHOCR.cc:973 ../gtk/src/OutputEditorText.cc:282 #: ../qt/src/hocr/OutputEditorHOCR.cc:839 ../qt/src/OutputEditorText.cc:246 msgid "Failed to save output" msgstr "Impossibile salvare output" #: ../gtk/src/hocr/OutputEditorHOCR.cc:973 ../gtk/src/OutputEditorText.cc:282 #: ../qt/src/hocr/OutputEditorHOCR.cc:839 ../qt/src/OutputEditorText.cc:246 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/hocr/OutputEditorHOCR.cc:1035 ../gtk/src/OutputEditorText.cc:296 #: ../qt/src/hocr/OutputEditorHOCR.cc:894 ../qt/src/OutputEditorText.cc:259 msgid "Output not saved" msgstr "Output non salvato" #: ../gtk/src/hocr/OutputEditorHOCR.cc:1035 ../gtk/src/OutputEditorText.cc:296 #: ../qt/src/hocr/OutputEditorHOCR.cc:894 ../qt/src/OutputEditorText.cc:259 msgid "Save output before proceeding?" msgstr "Salvare output prima di continuare?" #: ../gtk/src/hocr/OutputEditorHOCR.cc:1156 ../gtk/src/OutputEditorText.cc:184 #: ../qt/src/hocr/OutputEditorHOCR.cc:991 ../qt/src/OutputEditorText.cc:152 msgid "Replacing..." msgstr "Sostituendo..." #: ../gtk/src/hocr/OutputEditorHOCR.cc:1181 ../gtk/src/OutputEditorText.cc:192 #: ../qt/src/hocr/OutputEditorHOCR.cc:1014 ../qt/src/OutputEditorText.cc:160 msgid "Applying substitutions..." msgstr "Applicando sostituzioni..." #: ../gtk/src/MainWindow.cc:131 ../qt/src/MainWindow.cc:295 msgid "Using tesseract" msgstr "Utilizzando tesseract" #: ../gtk/src/MainWindow.cc:178 ../qt/src/MainWindow.cc:194 msgid "Select an image to begin..." msgstr "Seleziona un'immagine per iniziare..." #: ../gtk/src/MainWindow.cc:293 ../qt/src/MainWindow.cc:278 msgid "Multiple sources" msgstr "Più fonti" #: ../gtk/src/MainWindow.cc:295 ../qt/src/MainWindow.cc:280 msgid "Ready" msgstr "Pronto" #: ../gtk/src/MainWindow.cc:442 ../qt/src/MainWindow.cc:423 msgid "New version" msgstr "Nuova versione" #: ../gtk/src/MainWindow.cc:442 ../qt/src/MainWindow.cc:423 msgid "gImageReader %1 is available" msgstr "gImageReader %1 è disponibile" #: ../gtk/src/MainWindow.cc:443 ../qt/src/MainWindow.cc:424 msgid "Download" msgstr "Scarica" #: ../gtk/src/MainWindow.cc:444 ../qt/src/MainWindow.cc:425 msgid "Changelog" msgstr "Novità" #: ../gtk/src/MainWindow.cc:445 ../qt/src/MainWindow.cc:426 msgid "Don't notify again" msgstr "Non notificare nuovamente" #: ../gtk/src/MainWindow.cc:466 ../qt/src/MainWindow.cc:474 msgid "Don't show again" msgstr "Non mostrare nuovamente" #: ../gtk/src/MainWindow.cc:467 ../gtk/src/MainWindow.cc:480 #: ../qt/src/MainWindow.cc:475 msgid "Install" msgstr "Installa" #: ../gtk/src/MainWindow.cc:487 ../qt/src/MainWindow.cc:487 msgid "Spelling dictionary missing" msgstr "Dizionario ortografico mancante" #: ../gtk/src/MainWindow.cc:487 ../qt/src/MainWindow.cc:487 msgid "The spellcheck dictionary for %1 is not installed" msgstr "Il dizionario ortografico per %1 non è installato" #: ../gtk/src/MainWindow.cc:494 ../gtk/src/MainWindow.cc:523 #: ../qt/src/MainWindow.cc:493 msgid "Installing spelling dictionary for '%1'" msgstr "Installando il dizionario ortografico per '%1'" #: ../gtk/src/MainWindow.cc:515 ../gtk/src/MainWindow.cc:536 #: ../gtk/src/MainWindow.cc:544 ../gtk/src/MainWindow.cc:592 #: ../gtk/src/MainWindow.cc:597 ../gtk/src/TessdataManager.cc:60 #: ../gtk/src/TessdataManager.cc:70 ../gtk/src/TessdataManager.cc:339 #: ../qt/src/MainWindow.cc:512 ../qt/src/MainWindow.cc:525 #: ../qt/src/MainWindow.cc:534 ../qt/src/MainWindow.cc:578 #: ../qt/src/MainWindow.cc:583 ../qt/src/TessdataManager.cc:74 #: ../qt/src/TessdataManager.cc:84 ../qt/src/TessdataManager.cc:315 msgid "Error" msgstr "Errore" #: ../gtk/src/MainWindow.cc:515 ../qt/src/MainWindow.cc:512 msgid "Failed to install spelling dictionary: %1" msgstr "Installazione del dizionario ortografico fallita: %1" #: ../gtk/src/MainWindow.cc:536 ../qt/src/MainWindow.cc:525 msgid "Failed to create directory for spelling dictionaries." msgstr "Creazione cartella per dizionari ortografici fallita." #: ../gtk/src/MainWindow.cc:544 ../qt/src/MainWindow.cc:534 msgid "Could not read %1: %2." msgstr "Impossibile leggere %1: %2." #: ../gtk/src/MainWindow.cc:571 ../qt/src/MainWindow.cc:558 msgid "Downloading '%1'..." msgstr "Scaricando '%1'..." #: ../gtk/src/MainWindow.cc:592 ../qt/src/MainWindow.cc:578 msgid "" "The following dictionaries could not be downloaded:\n" "%1\n" "\n" "Check the connectivity and directory permissions.\n" "Hint: If you don't have write permissions in system folders, you can switch " "to user paths in the settings dialog." msgstr "" "Impossibile scaricare i seguenti dizionari:\n" "%1\n" "\n" "Verificare la connessione e i permessi di scrittura.\n" "Aiuto: Se non si ha accesso di scrittura nelle cartelle di sistema, " "scegliere di utilizzare cartelle del profilo dell'utente nel dialogo delle " "impostazioni." #: ../gtk/src/MainWindow.cc:595 ../qt/src/MainWindow.cc:581 msgid "Dictionaries installed" msgstr "Dizionari ortografici installati" #: ../gtk/src/MainWindow.cc:595 msgid "" "The following dictionaries were installed:\n" "%1" msgstr "" "I seguenti dizionari sono stati installati:\n" "%1" #: ../gtk/src/MainWindow.cc:597 ../qt/src/MainWindow.cc:583 msgid "No spelling dictionaries found for '%1'." msgstr "Nessun dizionario ortografico trovato per '%1'." #: ../gtk/src/OutputEditorText.cc:154 ../qt/src/OutputEditorText.cc:137 msgid "Stripping line breaks..." msgstr "Rimuovendo interruzioni di riga..." #: ../gtk/src/OutputEditorText.cc:162 msgid "Check spelling" msgstr "Controllo ortografico" #: ../gtk/src/OutputEditorText.cc:231 ../qt/src/OutputEditorText.cc:196 msgid "File: %1" msgstr "File: %1" #: ../gtk/src/OutputEditorText.cc:234 ../qt/src/OutputEditorText.cc:199 msgid "Page: %1" msgstr "Pagina: %1" #: ../gtk/src/OutputEditorText.cc:247 ../gtk/src/Recognizer.cc:471 #: ../qt/src/Recognizer.cc:462 msgid "" "\n" "[Failed to recognize page %1]\n" msgstr "" "\n" "[Ricognizione della pagina %1 fallita]\n" #: ../gtk/src/OutputEditorText.cc:275 ../qt/src/OutputEditorText.cc:239 msgid "Save Output..." msgstr "Salva output..." #: ../gtk/src/Recognizer.cc:179 ../qt/src/Recognizer.cc:172 msgid "No languages available" msgstr "Nessuna lingua disponibile" #: ../gtk/src/Recognizer.cc:179 ../qt/src/Recognizer.cc:172 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:233 ../qt/src/Recognizer.cc:232 msgid "Multilingual" msgstr "Più lingue" #: ../gtk/src/Recognizer.cc:285 ../qt/src/Recognizer.cc:277 msgid "Automatic page segmentation" msgstr "Segmentazione automatica della pagina" #: ../gtk/src/Recognizer.cc:286 ../qt/src/Recognizer.cc:278 msgid "Page segmentation with orientation and script detection" msgstr "Segmentazione della pagina con rilevamento di script e orientamento" #: ../gtk/src/Recognizer.cc:287 ../qt/src/Recognizer.cc:279 msgid "Assume single column of text" msgstr "Assumi singola colonna di testo" #: ../gtk/src/Recognizer.cc:288 ../qt/src/Recognizer.cc:280 msgid "Assume single block of vertically aligned text" msgstr "Assumi singolo blocco di testo allineato verticalmente" #: ../gtk/src/Recognizer.cc:289 ../qt/src/Recognizer.cc:281 msgid "Assume a single uniform block of text" msgstr "Assumi singolo blocco uniforme di testo" #: ../gtk/src/Recognizer.cc:290 ../qt/src/Recognizer.cc:282 msgid "Assume a line of text" msgstr "Assumi una singola linea di testo" #: ../gtk/src/Recognizer.cc:291 ../qt/src/Recognizer.cc:283 msgid "Assume a single word" msgstr "Assumi una singola parola" #: ../gtk/src/Recognizer.cc:292 ../qt/src/Recognizer.cc:284 msgid "Assume a single word in a circle" msgstr "Assumi una singola parola in un cerchio" #: ../gtk/src/Recognizer.cc:293 ../qt/src/Recognizer.cc:285 msgid "Sparse text in no particular order" msgstr "Assumi testo sparso senza ordine particolare" #: ../gtk/src/Recognizer.cc:294 ../qt/src/Recognizer.cc:286 msgid "Sparse text with orientation and script detection" msgstr "Assumi testo sparso con rilevamento di script e di orientamento" #: ../gtk/src/Recognizer.cc:309 ../qt/src/Recognizer.cc:297 msgid "Page segmentation mode" msgstr "Modalità di segmentazione della pagina" #: ../gtk/src/Recognizer.cc:313 ../qt/src/Recognizer.cc:300 msgid "Character whitelist / blacklist..." msgstr "Whitelist / blacklist di caratteri..." #: ../gtk/src/Recognizer.cc:319 ../qt/src/Recognizer.cc:305 msgid "Manage languages..." msgstr "Gestione lingue..." #: ../gtk/src/Recognizer.cc:375 ../qt/src/Recognizer.cc:369 msgid "Current selection" msgstr "Selezione corrente" #: ../gtk/src/Recognizer.cc:465 ../qt/src/Recognizer.cc:455 msgid "Recognizing page %1 (%2 of %3)" msgstr "Ricognizione della pagina %1 (%2 di %3)" #: ../gtk/src/Recognizer.cc:470 ../qt/src/Recognizer.cc:461 msgid "" "\n" "- Page %1: failed to render page" msgstr "" "\n" "- Pagina %1: impossibile renderizzare pagina" #: ../gtk/src/Recognizer.cc:501 ../gtk/src/Recognizer.cc:531 #: ../gtk/src/Recognizer.cc:544 ../qt/src/Recognizer.cc:491 #: ../qt/src/Recognizer.cc:521 ../qt/src/Recognizer.cc:534 msgid "Recognizing..." msgstr "Eseguendo ricognizione..." #: ../gtk/src/Recognizer.cc:505 ../gtk/src/Recognizer.cc:514 #: ../qt/src/Recognizer.cc:495 ../qt/src/Recognizer.cc:504 msgid "Recognition errors occurred" msgstr "Vi sono stati errori di ricognizione" #: ../gtk/src/Recognizer.cc:505 ../qt/src/Recognizer.cc:495 msgid "The following errors occurred:%1" msgstr "I seguenti errori sono occorsi:%1" #: ../gtk/src/Recognizer.cc:514 ../qt/src/Recognizer.cc:504 msgid "Failed to initialize tesseract" msgstr "Inizializzazione di tesseract fallita" #: ../gtk/src/scanner/ScannerSane.cc:84 ../gtk/src/scanner/ScannerTwain.cc:288 #: ../qt/src/scanner/ScannerSane.cc:85 ../qt/src/scanner/ScannerTwain.cc:286 msgid "Scan canceled" msgstr "Scansione interrotta" #: ../gtk/src/scanner/ScannerSane.cc:159 ../gtk/src/scanner/ScannerTwain.cc:186 #: ../qt/src/scanner/ScannerSane.cc:159 ../qt/src/scanner/ScannerTwain.cc:178 msgid "No scanner specified" msgstr "Nessun scanner specificato" #: ../gtk/src/scanner/ScannerSane.cc:168 ../gtk/src/scanner/ScannerTwain.cc:195 #: ../qt/src/scanner/ScannerSane.cc:168 ../qt/src/scanner/ScannerTwain.cc:187 msgid "Unable to connect to scanner" msgstr "Impossibile connettersi allo scanner" #: ../gtk/src/scanner/ScannerSane.cc:403 ../gtk/src/scanner/ScannerTwain.cc:266 #: ../gtk/src/scanner/ScannerTwain.cc:292 ../qt/src/scanner/ScannerSane.cc:403 #: ../qt/src/scanner/ScannerTwain.cc:258 ../qt/src/scanner/ScannerTwain.cc:290 msgid "Unable to start scan" msgstr "Impossibile avviare la scansione" #: ../gtk/src/scanner/ScannerSane.cc:411 ../gtk/src/scanner/ScannerSane.cc:461 #: ../gtk/src/scanner/ScannerTwain.cc:318 ../qt/src/scanner/ScannerSane.cc:411 #: ../qt/src/scanner/ScannerSane.cc:461 ../qt/src/scanner/ScannerTwain.cc:316 msgid "Error communicating with scanner" msgstr "Errore durante la comunicazione con lo scanner" #: ../gtk/src/scanner/ScannerSane.cc:520 ../qt/src/scanner/ScannerSane.cc:517 msgid "Failed to save image" msgstr "Impossibile salvare l'immagine" #: ../gtk/src/scanner/ScannerSane.cc:800 ../qt/src/scanner/ScannerSane.cc:797 msgid "Operation is cancelled." msgstr "L'operazione è stata annullata." #: ../gtk/src/scanner/ScannerSane.cc:802 ../qt/src/scanner/ScannerSane.cc:799 msgid "Device is busy." msgstr "Il dispositivo è occupato." #: ../gtk/src/scanner/ScannerSane.cc:804 ../qt/src/scanner/ScannerSane.cc:801 msgid "Cover is opened." msgstr "Il coperchio è aperto." #: ../gtk/src/scanner/ScannerSane.cc:806 ../qt/src/scanner/ScannerSane.cc:803 msgid "Document feeder jammed." msgstr "L'alimentatore dei documenti è bloccato." #: ../gtk/src/scanner/ScannerSane.cc:808 ../qt/src/scanner/ScannerSane.cc:805 msgid "Document feeder out of documents." msgstr "L'alimentatore dei documenti non ha più documenti." #: ../gtk/src/scanner/ScannerSane.cc:810 ../qt/src/scanner/ScannerSane.cc:807 msgid "Access to scanner is denied." msgstr "Accesso allo scanner negato." #: ../gtk/src/SourceManager.cc:118 ../qt/src/SourceManager.cc:124 msgid "PDFs with text" msgstr "PDF con testo" #: ../gtk/src/SourceManager.cc:118 ../qt/src/SourceManager.cc:124 msgid "" "These PDF files already contain text:\n" "%1" msgstr "" "I seguenti file PDF contengono già del testo:\n" "%1" #: ../gtk/src/SourceManager.cc:127 ../qt/src/SourceManager.cc:132 msgid "Unable to open files" msgstr "Impossibile aprire file" #: ../gtk/src/SourceManager.cc:127 ../qt/src/SourceManager.cc:132 msgid "The following files could not be opened:%1" msgstr "Non è stato possibile aprire i seguenti file:%1" #: ../gtk/src/SourceManager.cc:141 ../qt/src/SourceManager.cc:143 msgid "Enter password for file '%1':" msgstr "Specificare la password per il file '%1':" #: ../gtk/src/SourceManager.cc:197 ../qt/src/SourceManager.cc:214 msgid "Images and PDFs" msgstr "Immagini e PDF" #: ../gtk/src/SourceManager.cc:202 ../qt/src/SourceManager.cc:215 msgid "Select Files" msgstr "Seleziona file" #: ../gtk/src/SourceManager.cc:208 ../qt/src/SourceManager.cc:226 msgid "Clipboard Error" msgstr "Errore appunti" #: ../gtk/src/SourceManager.cc:208 ../qt/src/SourceManager.cc:226 msgid "Failed to read the clipboard." msgstr "Impossibile leggere dagli appunti." #: ../gtk/src/SourceManager.cc:212 ../qt/src/SourceManager.cc:230 #: ../qt/src/SourceManager.cc:236 msgid "Pasted %1" msgstr "Appunti %1" #: ../gtk/src/SourceManager.cc:224 ../qt/src/SourceManager.cc:243 msgid "Screenshot Error" msgstr "Errore cattura schermo" #: ../gtk/src/SourceManager.cc:224 ../qt/src/SourceManager.cc:243 msgid "Failed to take screenshot." msgstr "Impossibile catturare lo schermo." #: ../gtk/src/SourceManager.cc:228 ../qt/src/SourceManager.cc:247 msgid "Screenshot %1" msgstr "Screenshot %1" #: ../gtk/src/SourceManager.cc:233 ../qt/src/SourceManager.cc:252 msgid "Saving image..." msgstr "Salvando immagine..." #: ../gtk/src/SourceManager.cc:240 ../qt/src/SourceManager.cc:265 msgid "Cannot Write File" msgstr "Impossibile scrivere file" #: ../gtk/src/SourceManager.cc:240 ../qt/src/SourceManager.cc:265 msgid "Could not write to %1." msgstr "Impossibile scrivere il file %1." #: ../gtk/src/SourceManager.cc:267 ../qt/src/SourceManager.cc:287 msgid "Delete File?" msgstr "Eliminare il file?" #: ../gtk/src/SourceManager.cc:267 ../qt/src/SourceManager.cc:287 msgid "The following files will be deleted:%1" msgstr "Il seguenti file saranno eliminati:%1" #: ../gtk/src/SourceManager.cc:332 ../qt/src/SourceManager.cc:338 msgid "Missing File" msgstr "File mancante" #: ../gtk/src/SourceManager.cc:332 ../qt/src/SourceManager.cc:338 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:33 ../qt/src/SubstitutionsManager.cc:73 msgid "Search for" msgstr "Cerca" #: ../gtk/src/SubstitutionsManager.cc:34 ../qt/src/SubstitutionsManager.cc:73 msgid "Replace with" msgstr "Sostituisci con" #: ../gtk/src/SubstitutionsManager.cc:69 ../gtk/src/SubstitutionsManager.cc:103 #: ../qt/src/SubstitutionsManager.cc:106 ../qt/src/SubstitutionsManager.cc:143 msgid "Substitutions List" msgstr "Lista sostituzioni" #: ../gtk/src/SubstitutionsManager.cc:70 ../qt/src/SubstitutionsManager.cc:106 msgid "Open Substitutions List" msgstr "Apri lista sostituzioni" #: ../gtk/src/SubstitutionsManager.cc:75 ../qt/src/SubstitutionsManager.cc:112 msgid "Error Reading File" msgstr "Errore durante la lettura del file" #: ../gtk/src/SubstitutionsManager.cc:75 ../qt/src/SubstitutionsManager.cc:112 msgid "Unable to read '%1'." msgstr "Impossibile leggere '%1'." #: ../gtk/src/SubstitutionsManager.cc:97 ../qt/src/SubstitutionsManager.cc:137 msgid "Errors Occurred Reading File" msgstr "Errori durante la lettura del file" #: ../gtk/src/SubstitutionsManager.cc:97 ../qt/src/SubstitutionsManager.cc:137 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:104 ../qt/src/SubstitutionsManager.cc:143 msgid "Save Substitutions List" msgstr "Salva lista sostituzioni" #: ../gtk/src/SubstitutionsManager.cc:110 ../qt/src/SubstitutionsManager.cc:149 msgid "Error Saving File" msgstr "Errore durante il salvataggio del file" #: ../gtk/src/SubstitutionsManager.cc:110 ../qt/src/SubstitutionsManager.cc:149 msgid "Unable to write to '%1'." msgstr "Impossibile scrivere '%1'." #: ../gtk/src/SubstitutionsManager.cc:127 ../qt/src/SubstitutionsManager.cc:162 msgid "Save List?" msgstr "Salvare la lista?" #: ../gtk/src/SubstitutionsManager.cc:127 ../qt/src/SubstitutionsManager.cc:162 msgid "Do you want to save the current list?" msgstr "Salvare la lista attuale?" #: ../gtk/src/TessdataManager.cc:60 ../qt/src/TessdataManager.cc:74 #, fuzzy msgid "" "A session connection to the PackageKit backend is required for managing " "system-wide tesseract language packs, but it was not found. This service is " "usually provided by a software-management application such as Gnome " "Software. Please install software which provides the necessary PackageKit " "interface, use other system package management software to manage the " "tesseract language packs directly, or switch to using 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 del profilo " "dell'utente nel dialogo delle impostazioni." #: ../gtk/src/TessdataManager.cc:65 ../qt/src/TessdataManager.cc:79 msgid "Fetching available languages" msgstr "Caricando la lista delle lingue disponibili" #: ../gtk/src/TessdataManager.cc:70 ../gtk/src/TessdataManager.cc:96 #: ../gtk/src/TessdataManager.cc:197 ../qt/src/TessdataManager.cc:84 #: ../qt/src/TessdataManager.cc:101 ../qt/src/TessdataManager.cc:197 msgid "Failed to fetch list of available languages: %1" msgstr "Impossibile caricare la lista delle lingue disponibili: %1" #: ../gtk/src/TessdataManager.cc:104 ../qt/src/TessdataManager.cc:113 #: ../qt/src/TessdataManager.cc:122 msgid "Parsing error: %1" msgstr "Errore di parsing: %1" #: ../gtk/src/TessdataManager.cc:235 ../qt/src/TessdataManager.cc:232 msgid "Applying changes..." msgstr "Applicando i cambiamenti..." #: ../gtk/src/TessdataManager.cc:297 ../qt/src/TessdataManager.cc:278 msgid "Failed to create directory for tessdata files." msgstr "Impossibile creare la cartella per i file tessdata." #: ../gtk/src/TessdataManager.cc:306 ../qt/src/TessdataManager.cc:287 msgid "Downloading %1..." msgstr "Scaricando '%1'..." #: ../gtk/src/TessdataManager.cc:330 msgid "" "The following files could not be downloaded or removed:\n" "%1\n" "\n" "Check the connectivity and directory permissions.\n" "\n" "Hint: If you don't have write permissions in system folders, you can switch " "to user paths in the settings dialog." msgstr "" "Impossibile scaricare o rimuovere i seguenti file:\n" "%1\n" "\n" "Verificare la connessione e i permessi di scrittura.\n" "\n" "Aiuto: Se non si ha accesso di scrittura nelle cartelle di sistema, " "scegliere di utilizzare cartelle del profilo dell'utente nel dialogo delle " "impostazioni." #: ../gtk/src/Utils.cc:64 msgid "Yes" msgstr "Si" #: ../gtk/src/Utils.cc:67 msgid "No" msgstr "No" #: ../gtk/src/Utils.cc:76 msgid "Discard" msgstr "Scarta" #: ../qt/data/AboutDialog.ui.h:1 msgid "About gImageReader" msgstr "Info su 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 segnalare il problema a manisandro@gmail.com, se possibile " "descrivendo cosa si stava facendo prima che l'applicazione smettesse di " "funzionare, e includendo l'informazione sottostante. Grazie.

" #: ../qt/data/CrashHandler.ui.h:3 msgid "" "

Tesseract has " "aborted

Tesseract (the OCR engine) has aborted while " "recognizing text. This may occur if the used traineddatas are corrupt or " "incomplatible with the version of tesseract in use, or due to a bug in " "tesseract.

The stacktrace below may provide additional information " "about where the crash occured.

" msgstr "" "

Tesseract si è " "arrestato

Tesseract (la libreria OCR) si è arrestato durante la " "ricognizione del testo. Questo può succedere se i file traineddata sono " "corrotti oppure incompatibilit con la versione di tesseract in uso, oppure a " "causa di un errore in tesseract.

Il stacktrace sotto potrebbe fornire " "ulteriori informazioni concernenti la causa dell'errore.

" #: ../qt/data/MainWindow.ui.h:17 msgid "Flatbed" msgstr "Letto piatto" #: ../qt/data/MainWindow.ui.h:18 msgid "ADF Front" msgstr "ADF Fronte" #: ../qt/data/MainWindow.ui.h:19 msgid "ADF Back" msgstr "ADF Retro" #: ../qt/data/MainWindow.ui.h:20 msgid "ADF Duplex" msgstr "ADF Duplex" #. Remove & from some labels which designer insists in adding #: ../qt/data/MainWindow.ui.h:21 ../qt/src/Ui_MainWindow.hh:50 msgid "Sources" msgstr "Sorgenti" #: ../qt/data/MainWindow.ui.h:22 msgid "Zoom In" msgstr "Ingrandisci" #: ../qt/data/MainWindow.ui.h:24 msgid "Zoom Out" msgstr "Rimpicciolisci" #: ../qt/data/MainWindow.ui.h:26 msgid "Normal Size" msgstr "Dimensioni normali" #: ../qt/data/MainWindow.ui.h:28 msgid "Best Fit" msgstr "Dimensioni ideali" #: ../qt/data/MainWindow.ui.h:30 msgid "Rotate Left" msgstr "Ruota a sinistra" #: ../qt/data/MainWindow.ui.h:31 msgid "Rotate left" msgstr "Ruota a sinistra" #: ../qt/data/MainWindow.ui.h:32 msgid "Rotate Right" msgstr "Ruota a destra" #: ../qt/data/MainWindow.ui.h:33 msgid "Rotate right" msgstr "Ruota a destra" #: ../qt/data/MainWindow.ui.h:34 msgid "Image Controls" msgstr "Controlli immagine" #: ../qt/data/MainWindow.ui.h:36 msgid "Autodetect Layout" msgstr "Rileva impaginazione" #: ../qt/data/MainWindow.ui.h:38 msgid "Toggle Output Pane" msgstr "Mostra/nascondi riquadro output" #: ../qt/data/PdfExportDialog.ui.h:5 msgid "Backend:" msgstr "Backend:" #: ../qt/data/PdfExportDialog.ui.h:8 msgid "Portrait" msgstr "Verticale" #: ../qt/data/PdfExportDialog.ui.h:9 msgid "Landscape" msgstr "Orizzontale" #: ../qt/src/hocr/HOCRPdfExporter.cc:142 msgid "Failed to write to file" msgstr "Impossibile scrivere il file" #. Output toolbar #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:55 #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:56 msgid "Open hOCR file" msgstr "Apri file hOCR" #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:57 #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:58 msgid "Save as hOCR text" msgstr "Salva come testo hOCR" #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:79 #: ../qt/src/Ui_OutputEditorText.hh:106 msgid "Find and Replace" msgstr "Cerca e sostituisci" #: ../qt/src/MainWindow.cc:581 msgid "" "The following dictionary files were installed:\n" "%1" msgstr "" "I seguenti dizionari ortografici sono stati installati:\n" "%1" #: ../qt/src/TessdataManager.cc:308 msgid "" "The following files could not be downloaded or removed:\n" "%1\n" "\n" "Check the connectivity and directory permissions.\n" "Hint: If you don't have write permissions in system folders, you can switch " "to user paths in the settings dialog." msgstr "" "Non è stato possibile scaricare o rimuovere i seguenti file:\n" "%1\n" "\n" "Verificare la connettività e i permessi delle cartelle.\n" "Aiuto: Se non si ha accesso di scrittura nelle cartelle di sistema, " "scegliere di utilizzare cartelle del profilo dell'utente nel dialogo delle " "impostazioni." #: ../qt/src/Ui_MainWindow.hh:51 msgid "Output" msgstr "Output" #: ../qt/src/Ui_MainWindow.hh:135 msgid "OCR mode:" msgstr "Modalità OCR:" #: ../qt/src/Ui_MainWindow.hh:209 msgid "Remove Image" msgstr "Rimuovi immagine" #: ../qt/src/Ui_MainWindow.hh:212 msgid "Delete Image" msgstr "Elimina immagine" #: ../qt/src/Ui_MainWindow.hh:215 msgid "Clear List" msgstr "Svuota lista" #: ../qt/src/Ui_OutputEditorText.hh:101 msgid "Strip Line Breaks" msgstr "Rimuovi interruzioni di riga" #: ../qt/src/Ui_OutputEditorText.hh:115 msgid "Save Output" msgstr "Salva output" #: ../qt/src/Ui_OutputEditorText.hh:117 msgid "Clear Output" msgstr "Cancella output" #~ msgid "The application has crashed" #~ msgstr "L'applicazione ha smesso di funzionare" #~ 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." #~ msgid "Could not read %1: %2" #~ msgstr "Impossibile leggere %1: %2" #~ msgid "gImageReader" #~ msgstr "gImageReader" #~ msgid "PoDoFo" #~ msgstr "PoDoFo" #~ msgid "QPrinter" #~ msgstr "QPrinter" #~ 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 "90" #~ msgstr "90" #~ msgid "300" #~ msgstr "300" #~ msgid "100" #~ msgstr "100" #~ msgid "10" #~ msgstr "10" #~ msgid "%" #~ msgstr "%" #~ msgid "4" #~ msgstr "4" #~ msgid "1" #~ msgstr "1" #~ msgid "Document font:" #~ msgstr "Carattere:" #~ msgid "Scale:" #~ msgstr "Scala:" #~ msgid "Document" #~ msgstr "Documento" #~ msgid "Errors occurred" #~ msgstr "Errori" #~ msgid "" #~ "The following pages could not be rendered:\n" #~ "%1" #~ msgstr "" #~ "Non è stato possibile renderizzare le seguenti pagine:\n" #~ "%1" #~ msgid "substitution_list.txt" #~ msgstr "lista_sostituzioni.txt" #~ 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" #, 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 "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.3.1/po/ko.po000066400000000000000000001630211351740627400154350ustar00rootroot00000000000000# 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. # msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2019-07-25 23:17+0200\n" "PO-Revision-Date: 2018-06-21 22:22+0000\n" "Last-Translator: peinilla \n" "Language-Team: Korean \n" "Language: ko\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=1; plural=0;\n" "X-Generator: Weblate 3.1-dev\n" #: ../data/gimagereader.desktop.in.h:1 msgid "OCR application" msgstr "OCR ì‘ìš© 프로그램" #: ../gtk/data/appmenu.ui.h:1 ../qt/src/Ui_MainWindow.hh:167 msgid "Redetect Languages" msgstr "언어 재íƒìƒ‰" #: ../gtk/data/appmenu.ui.h:2 ../qt/src/Ui_MainWindow.hh:170 msgid "Manage Languages" msgstr "언어 관리" #: ../gtk/data/appmenu.ui.h:3 ../gtk/data/ConfigDialog.ui.h:1 #: ../qt/data/ConfigDialog.ui.h:1 ../qt/src/Ui_MainWindow.hh:173 msgid "Preferences" msgstr "설정" #: ../gtk/data/appmenu.ui.h:4 ../gtk/data/ConfigDialog.ui.h:2 #: ../gtk/src/MainWindow.cc:482 ../qt/src/MainWindow.cc:481 #: ../qt/src/Ui_MainWindow.hh:178 msgid "Help" msgstr "ë„움ë§" #: ../gtk/data/appmenu.ui.h:5 ../qt/data/AboutDialog.ui.h:2 #: ../qt/src/Ui_MainWindow.hh:181 msgid "About" msgstr "ì •ë³´" #: ../gtk/data/appmenu.ui.h:6 msgid "Quit" msgstr "종료" #: ../gtk/data/ConfigDialog.ui.h:3 ../gtk/data/MainWindow.ui.h:47 #: ../gtk/data/OutputEditorHOCR.ui.h:3 ../gtk/data/PdfExportDialog.ui.h:3 #: ../gtk/src/FileDialogs.cc:152 ../gtk/src/Utils.cc:61 #: ../qt/data/ConfigDialog.ui.h:26 msgid "OK" msgstr "확ì¸" #: ../gtk/data/ConfigDialog.ui.h:4 msgid "Output pane orientation:" msgstr "출력창 ë°©í–¥ :" #: ../gtk/data/ConfigDialog.ui.h:5 msgid "Horizontal" msgstr "가로" #: ../gtk/data/ConfigDialog.ui.h:6 msgid "Vertical" msgstr "세로" #: ../gtk/data/ConfigDialog.ui.h:7 ../qt/data/ConfigDialog.ui.h:18 msgid "Query to install missing spellcheck dictionaries" msgstr "누ë½ëœ 맞춤법 사전 설치창 표시" #: ../gtk/data/ConfigDialog.ui.h:8 ../qt/data/ConfigDialog.ui.h:4 msgid "Automatically check for new program versions" msgstr "ìžë™ìœ¼ë¡œ 새 버전 확ì¸" #: ../gtk/data/ConfigDialog.ui.h:9 ../qt/data/ConfigDialog.ui.h:3 msgid "Predefined language definitions:" msgstr "등ë¡ëœ 언어 :" #: ../gtk/data/ConfigDialog.ui.h:10 ../qt/data/ConfigDialog.ui.h:12 msgid "Additional language definitions:" msgstr "ì¶”ê°€ëœ ì–¸ì–´ :" #: ../gtk/data/ConfigDialog.ui.h:11 ../qt/data/ConfigDialog.ui.h:20 msgid "The prefix of the tesseract language data file" msgstr "언어 ì ‘ë‘사" #: ../gtk/data/ConfigDialog.ui.h:12 ../qt/data/ConfigDialog.ui.h:21 msgid "Prefix" msgstr "ì ‘ë‘사" #: ../gtk/data/ConfigDialog.ui.h:13 ../qt/data/ConfigDialog.ui.h:22 msgid "The ISO 639-1 language code followed by the country code" msgstr "언어코드 ë’¤ì— êµ­ê°€ì½”ë“œ" #: ../gtk/data/ConfigDialog.ui.h:14 ../qt/data/ConfigDialog.ui.h:23 msgid "ISO Code" msgstr "ISO 코드" #: ../gtk/data/ConfigDialog.ui.h:15 ../qt/data/ConfigDialog.ui.h:24 msgid "The name of the language" msgstr "언어" #: ../gtk/data/ConfigDialog.ui.h:16 ../qt/data/ConfigDialog.ui.h:25 msgid "Name" msgstr "ì´ë¦„" #: ../gtk/data/ConfigDialog.ui.h:17 ../gtk/data/MainWindow.ui.h:46 #: ../gtk/data/OutputEditorHOCR.ui.h:2 ../gtk/data/PdfExportDialog.ui.h:2 #: ../gtk/src/Acquirer.cc:34 ../gtk/src/FileDialogs.cc:151 #: ../gtk/src/Utils.cc:70 ../qt/data/ConfigDialog.ui.h:27 #: ../qt/data/MainWindow.ui.h:12 msgid "Cancel" msgstr "취소" #: ../gtk/data/ConfigDialog.ui.h:18 ../qt/data/ConfigDialog.ui.h:5 msgid "Output pane font:" msgstr "출력 í°íЏ:" #: ../gtk/data/ConfigDialog.ui.h:19 ../qt/data/ConfigDialog.ui.h:2 msgid "Default" msgstr "기본값" #: ../gtk/data/ConfigDialog.ui.h:20 ../qt/data/ConfigDialog.ui.h:6 msgid "Language data locations:" msgstr "ì–¸ì–´íŒŒì¼ ìœ„ì¹˜:" #: ../gtk/data/ConfigDialog.ui.h:21 ../qt/data/ConfigDialog.ui.h:13 msgid "Language definitions path:" msgstr "언어 ì •ì˜ ìœ„ì¹˜:" #: ../gtk/data/ConfigDialog.ui.h:22 ../qt/data/ConfigDialog.ui.h:28 msgid "Spelling dictionaries path:" msgstr "맞춤법 사전 위치:" #: ../gtk/data/ConfigDialog.ui.h:23 ../qt/data/ConfigDialog.ui.h:10 msgid "System-wide paths" msgstr "시스템 경로" #: ../gtk/data/ConfigDialog.ui.h:24 ../qt/data/ConfigDialog.ui.h:11 msgid "User paths" msgstr "ì‚¬ìš©ìž ê²½ë¡œ" #: ../gtk/data/ConfigDialog.ui.h:25 ../qt/data/ConfigDialog.ui.h:29 msgid "Automatically open exported documents with default application" msgstr "기본 ì‘ìš© 프로그램으로 문서 실행" #: ../gtk/data/CrashHandler.ui.h:1 ../qt/src/CrashHandler.cc:38 msgid "Regenerate backtrace" msgstr "ì—­ì¶”ì  ìž¬ìƒì„±" #: ../gtk/data/CrashHandler.ui.h:3 #, fuzzy, no-c-format msgid "" "The application has crashed\n" "\n" "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 "" "ë¶ˆíŽ¸ì„ ë¼ì³ 드려 죄송합니다. 애플리케ì´ì…˜ì˜ ê°œì„ ì„ ìœ„í•´ ë¬¸ì œì— ëŒ€í•œ 보고서를 " "전송해주십시오. \n" "manisandro@gmail.com.\n" "가능하다면, ì–´ë–¤ ìž‘ì—…ì„ í•˜ëŠ” ë™ì•ˆ 문제가 ë°œìƒí–ˆëŠ”ì§€ 설명해 주십시오. ì•„ëž˜ì˜ " "정보를 í¬í•¨í•˜ë©´ 좋습니다. ê°ì‚¬í•©ë‹ˆë‹¤." #: ../gtk/data/CrashHandler.ui.h:6 msgid "" "Tesseract has aborted\n" "\n" "Tesseract (the OCR engine) has aborted while recognizing text. This may " "occur if the used traineddatas are corrupt or incomplatible with the version " "of tesseract in use, or due to a bug in tesseract.\n" "\n" "The stacktrace below may provide additional information about where the " "crash occured.\n" msgstr "" #: ../gtk/data/MainWindow.ui.h:1 ../qt/data/MainWindow.ui.h:39 msgid "Toggle output pane" msgstr "출력창 표시" #: ../gtk/data/MainWindow.ui.h:2 ../qt/src/Ui_MainWindow.hh:66 msgid "Rotate current page" msgstr "현재 ì°½ 회전하기" #: ../gtk/data/MainWindow.ui.h:3 ../qt/src/Ui_MainWindow.hh:67 msgid "Rotate all pages" msgstr "모든 ì°½ 회전하기" #. Sources toolbar #: ../gtk/data/MainWindow.ui.h:4 ../qt/src/Ui_MainWindow.hh:192 msgid "Recent" msgstr "파ì¼ìƒíƒœ" #: ../gtk/data/MainWindow.ui.h:5 ../qt/src/Ui_MainWindow.hh:193 msgid "Paste" msgstr "붙여넣기" #: ../gtk/data/MainWindow.ui.h:6 ../qt/src/Ui_MainWindow.hh:194 msgid "Take Screenshot" msgstr "스í¬ë¦°ìƒ· ì´¬ì˜" #: ../gtk/data/MainWindow.ui.h:7 ../qt/data/MainWindow.ui.h:23 msgid "Zoom in" msgstr "확대" #: ../gtk/data/MainWindow.ui.h:8 ../qt/data/MainWindow.ui.h:25 msgid "Zoom out" msgstr "축소" #: ../gtk/data/MainWindow.ui.h:9 ../qt/data/MainWindow.ui.h:27 msgid "Normal size" msgstr "1:1" #: ../gtk/data/MainWindow.ui.h:10 ../qt/data/MainWindow.ui.h:29 msgid "Best fit" msgstr "í™”ë©´ì— ë§žì¶”ê¸°" #: ../gtk/data/MainWindow.ui.h:11 ../qt/src/Ui_MainWindow.hh:75 msgid "Select rotation mode" msgstr "회전모드" #: ../gtk/data/MainWindow.ui.h:12 ../gtk/data/OutputEditorText.ui.h:13 #: ../qt/src/Ui_OutputEditorText.hh:95 msgid "Select insert mode" msgstr "입력모드" #: ../gtk/data/MainWindow.ui.h:13 ../qt/src/Ui_MainWindow.hh:109 #, fuzzy msgid "Select page" msgstr "언어 ì„ íƒ" #: ../gtk/data/MainWindow.ui.h:14 ../qt/data/MainWindow.ui.h:35 msgid "Image controls" msgstr "ì´ë¯¸ì§€ 변경" #: ../gtk/data/MainWindow.ui.h:15 ../qt/src/Ui_MainWindow.hh:139 msgid "Plain text" msgstr "í…스트" #: ../gtk/data/MainWindow.ui.h:16 ../qt/src/Ui_MainWindow.hh:139 msgid "hOCR, PDF" msgstr "hOCR, PDF" #: ../gtk/data/MainWindow.ui.h:17 ../qt/data/MainWindow.ui.h:37 msgid "Autodetect layout" msgstr "ìžë™ê°ì§€" #: ../gtk/data/MainWindow.ui.h:18 msgid "Recognize all" msgstr "ëª¨ë‘ í•´ì„" #: ../gtk/data/MainWindow.ui.h:19 msgid "Select language" msgstr "언어 ì„ íƒ" #: ../gtk/data/MainWindow.ui.h:20 ../qt/src/Ui_MainWindow.hh:205 msgid "Add images" msgstr "ì´ë¯¸ì§€ 추가" #: ../gtk/data/MainWindow.ui.h:21 ../qt/src/Ui_MainWindow.hh:204 msgid "Add Images" msgstr "ì´ë¯¸ì§€ 추가" #: ../gtk/data/MainWindow.ui.h:22 ../qt/src/Ui_MainWindow.hh:210 msgid "Remove image from list" msgstr "제거" #: ../gtk/data/MainWindow.ui.h:23 ../qt/src/Ui_MainWindow.hh:213 msgid "Delete image" msgstr "ì´ë¯¸ì§€ ì‚­ì œ" #: ../gtk/data/MainWindow.ui.h:24 ../qt/src/Ui_MainWindow.hh:216 msgid "Clear list" msgstr "ì „ë¶€ 지우기" #: ../gtk/data/MainWindow.ui.h:25 ../qt/data/MainWindow.ui.h:5 msgid "Files" msgstr "파ì¼" #: ../gtk/data/MainWindow.ui.h:26 ../qt/data/MainWindow.ui.h:8 msgid "Device:" msgstr "장치:" #: ../gtk/data/MainWindow.ui.h:27 ../gtk/data/TessdataManager.ui.h:4 #: ../qt/data/MainWindow.ui.h:7 ../qt/src/TessdataManager.cc:59 msgid "Refresh" msgstr "새로고침" #: ../gtk/data/MainWindow.ui.h:28 ../qt/data/MainWindow.ui.h:9 msgid "Output:" msgstr "출력 경로:" #: ../gtk/data/MainWindow.ui.h:29 ../qt/data/MainWindow.ui.h:13 msgid "Mode:" msgstr "모드:" #: ../gtk/data/MainWindow.ui.h:30 ../gtk/src/hocr/HOCRPdfExporter.cc:313 #: ../qt/data/MainWindow.ui.h:15 ../qt/src/hocr/HOCRPdfExporter.cc:347 msgid "Color" msgstr "컬러" #: ../gtk/data/MainWindow.ui.h:31 ../gtk/src/hocr/HOCRPdfExporter.cc:316 #: ../qt/data/MainWindow.ui.h:14 ../qt/src/hocr/HOCRPdfExporter.cc:349 #: ../qt/src/hocr/HOCRPdfExporter.cc:351 msgid "Grayscale" msgstr "í‘ë°±" #: ../gtk/data/MainWindow.ui.h:32 ../qt/data/MainWindow.ui.h:10 msgid "Resolution:" msgstr "í•´ìƒë„:" #: ../gtk/data/MainWindow.ui.h:33 ../qt/data/MainWindow.ui.h:11 msgid "Scan" msgstr "스캔" #: ../gtk/data/MainWindow.ui.h:34 ../qt/data/MainWindow.ui.h:16 msgid "Source:" msgstr "소스:" #: ../gtk/data/MainWindow.ui.h:35 ../qt/data/MainWindow.ui.h:6 msgid "Acquire" msgstr "가져오기" #: ../gtk/data/MainWindow.ui.h:36 ../qt/data/MainWindow.ui.h:1 msgid "Brightness" msgstr "ë°ê¸°" #: ../gtk/data/MainWindow.ui.h:37 ../qt/data/MainWindow.ui.h:2 msgid "Contrast" msgstr "대조" #: ../gtk/data/MainWindow.ui.h:38 ../qt/data/MainWindow.ui.h:3 msgid "Resolution" msgstr "í•´ìƒë„" #: ../gtk/data/MainWindow.ui.h:39 ../qt/data/MainWindow.ui.h:4 msgid "Invert colors" msgstr "반전" #: ../gtk/data/MainWindow.ui.h:40 msgid "A graphical frontend to tesseract-ocr" msgstr "Tesseract-ocr ì„ ì´ìš©í•œ 프론트엔드" #: ../gtk/data/MainWindow.ui.h:41 ../qt/data/CharacterListDialog.ui.h:1 msgid "Character whitelist / blacklist" msgstr "" #: ../gtk/data/MainWindow.ui.h:42 ../qt/data/CharacterListDialog.ui.h:2 msgid "Exclude these characters from being recognized (blacklist):" msgstr "" #: ../gtk/data/MainWindow.ui.h:43 ../qt/data/CharacterListDialog.ui.h:3 #, fuzzy msgid "Enter a string of characters..." msgstr "ì¸ìž 가져오기..." #: ../gtk/data/MainWindow.ui.h:44 ../qt/data/CharacterListDialog.ui.h:4 msgid "Only allow the following characters to be recognized (whitelist):" msgstr "" #: ../gtk/data/MainWindow.ui.h:45 ../qt/data/PageRangeDialog.ui.h:1 msgid "Page Range" msgstr "범위" #: ../gtk/data/MainWindow.ui.h:48 ../qt/data/PageRangeDialog.ui.h:2 msgid "Page range:" msgstr "범위:" #: ../gtk/data/MainWindow.ui.h:49 ../qt/data/PageRangeDialog.ui.h:3 msgid "Example: 1-10, 13, 14-18" msgstr "예)1-10, 13, 14-18" #: ../gtk/data/MainWindow.ui.h:50 ../qt/data/PageRangeDialog.ui.h:4 msgid "Recognition area:" msgstr "번역 ì˜ì—­:" #: ../gtk/data/MainWindow.ui.h:51 ../gtk/src/Recognizer.cc:375 #: ../qt/data/PageRangeDialog.ui.h:5 ../qt/src/Recognizer.cc:369 msgid "Entire page" msgstr "ì „ì²´ 페ì´ì§€" #: ../gtk/data/MainWindow.ui.h:52 ../qt/data/PageRangeDialog.ui.h:6 msgid "Autodetect" msgstr "ìžë™ê°ì§€" #: ../gtk/data/MainWindow.ui.h:53 ../qt/data/PageRangeDialog.ui.h:7 msgid "Prepend to output text:" msgstr "출력 í…스트 ì•žì— ì¶”ê°€ :" #: ../gtk/data/MainWindow.ui.h:54 ../qt/data/PageRangeDialog.ui.h:8 msgid "Source filename" msgstr "소스 파ì¼" #: ../gtk/data/MainWindow.ui.h:55 ../qt/data/PageRangeDialog.ui.h:9 msgid "Source page" msgstr "소스 페ì´ì§€" #: ../gtk/data/MainWindow.ui.h:56 ../qt/src/SourceManager.cc:146 #, fuzzy msgid "Protected PDF" msgstr "Protected PDF" #: ../gtk/data/MainWindow.ui.h:57 ../qt/src/Recognizer.cc:76 msgid "Current Page" msgstr "현재 쪽" #: ../gtk/data/MainWindow.ui.h:58 ../qt/src/Recognizer.cc:79 msgid "Multiple Pages..." msgstr "여러 쪽..." #: ../gtk/data/OutputEditorHOCR.ui.h:1 ../qt/src/hocr/OutputEditorHOCR.cc:580 msgid "Add Word" msgstr "추가" #: ../gtk/data/OutputEditorHOCR.ui.h:4 ../qt/src/hocr/OutputEditorHOCR.cc:580 msgid "Enter word:" msgstr "추가하기:" #: ../gtk/data/OutputEditorHOCR.ui.h:5 ../qt/src/hocr/Ui_OutputEditorHOCR.hh:61 #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:62 msgid "Export to plain text" msgstr "txt로 내보내기" #: ../gtk/data/OutputEditorHOCR.ui.h:6 ../qt/src/hocr/Ui_OutputEditorHOCR.hh:64 #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:65 msgid "Export to PDF" msgstr "pdf로 내보내기" #: ../gtk/data/OutputEditorHOCR.ui.h:7 ../qt/src/hocr/Ui_OutputEditorHOCR.hh:67 #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:68 msgid "Export to ODT" msgstr "ODT로 내보내기" #: ../gtk/data/OutputEditorHOCR.ui.h:8 ../gtk/data/OutputEditorText.ui.h:18 #: ../qt/src/Ui_OutputEditorText.hh:116 msgid "Save output" msgstr "저장" #: ../gtk/data/OutputEditorHOCR.ui.h:9 ../qt/src/hocr/Ui_OutputEditorHOCR.hh:72 #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:73 msgid "Export" msgstr "내보내기" #: ../gtk/data/OutputEditorHOCR.ui.h:10 ../gtk/data/OutputEditorText.ui.h:19 #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:77 #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:78 #: ../qt/src/Ui_OutputEditorText.hh:118 msgid "Clear output" msgstr "ì‚­ì œ" #: ../gtk/data/OutputEditorHOCR.ui.h:11 ../gtk/data/OutputEditorText.ui.h:15 #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:80 #: ../qt/src/Ui_OutputEditorText.hh:107 msgid "Find and replace" msgstr "íƒìƒ‰ ë° ë°”ê¾¸ê¸°" #: ../gtk/data/OutputEditorHOCR.ui.h:12 #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:82 #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:83 msgid "Show confidence values" msgstr "ì‹ ë¢°ë„ í‘œì‹œ" #: ../gtk/data/OutputEditorHOCR.ui.h:13 ../gtk/data/PdfExportDialog.ui.h:41 #: ../qt/data/PdfExportDialog.ui.h:2 ../qt/src/hocr/Ui_OutputEditorHOCR.hh:85 #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:86 msgid "Show preview" msgstr "미리보기" #: ../gtk/data/OutputEditorHOCR.ui.h:14 #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:121 msgid "Next (F3)" msgstr "다ìŒ(F3)" #: ../gtk/data/OutputEditorHOCR.ui.h:15 #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:122 msgid "Previous (Shift+F3)" msgstr "ì´ì „(Shift+F3)" #: ../gtk/data/OutputEditorHOCR.ui.h:16 ../gtk/src/hocr/OutputEditorHOCR.cc:890 #: ../qt/src/hocr/OutputEditorHOCR.cc:730 #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:126 msgid "Expand all" msgstr "ëª¨ë‘ ì„ íƒ" #: ../gtk/data/OutputEditorHOCR.ui.h:17 ../gtk/src/hocr/OutputEditorHOCR.cc:893 #: ../qt/src/hocr/OutputEditorHOCR.cc:731 #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:127 msgid "Collapse all" msgstr "ì„ íƒ í•´ì œ" #: ../gtk/data/OutputEditorHOCR.ui.h:18 #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:148 msgid "Properties" msgstr "ì†ì„±" #: ../gtk/data/OutputEditorHOCR.ui.h:19 #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:152 msgid "Source" msgstr "소스" #. Output insert mode #: ../gtk/data/OutputEditorText.ui.h:1 ../qt/src/Ui_OutputEditorText.hh:52 msgid "Append to current text" msgstr "현재 í…ìŠ¤íŠ¸ì— ì¶”ê°€" #: ../gtk/data/OutputEditorText.ui.h:2 ../qt/src/Ui_OutputEditorText.hh:53 msgid "Insert at cursor" msgstr "현재 ìœ„ì¹˜ì— ì¶”ê°€" #: ../gtk/data/OutputEditorText.ui.h:3 ../qt/src/Ui_OutputEditorText.hh:54 msgid "Replace current text" msgstr "현재 위치 바꾸기" #. Output postprocessing #: ../gtk/data/OutputEditorText.ui.h:4 ../qt/src/Ui_OutputEditorText.hh:62 msgid "Keep line break if..." msgstr "ê³„ì† ì¤„ë°”ê¾¸ê¸°..." #: ../gtk/data/OutputEditorText.ui.h:5 ../qt/src/Ui_OutputEditorText.hh:64 msgid "Preceded by end mark (.?!)" msgstr "마침표(.?!) 앞ì—" #: ../gtk/data/OutputEditorText.ui.h:6 ../qt/src/Ui_OutputEditorText.hh:66 msgid "Preceded or succeeded by quote" msgstr "ì„ í–‰ë˜ê±°ë‚˜ ì™„ì„±ëœ ì¸ìš©ë¬¸" #: ../gtk/data/OutputEditorText.ui.h:7 ../qt/src/Ui_OutputEditorText.hh:68 msgid "Other options" msgstr "기타옵션" #: ../gtk/data/OutputEditorText.ui.h:8 ../qt/src/Ui_OutputEditorText.hh:70 msgid "Join hyphenated words" msgstr "하ì´í”ˆìœ¼ë¡œ ì—°ê²°ëœ ë‹¨ì–´ ê²°í•©" #: ../gtk/data/OutputEditorText.ui.h:9 ../qt/src/Ui_OutputEditorText.hh:72 msgid "Collapse whitespace" msgstr "공백 축소" #: ../gtk/data/OutputEditorText.ui.h:10 ../qt/src/Ui_OutputEditorText.hh:74 msgid "Preserve paragraphs" msgstr "ë‹¨ë½ ìœ ì§€" #: ../gtk/data/OutputEditorText.ui.h:11 ../qt/src/Ui_OutputEditorText.hh:76 msgid "Visual aids" msgstr "ì‹œê° ìžë£Œ" #: ../gtk/data/OutputEditorText.ui.h:12 ../qt/src/Ui_OutputEditorText.hh:78 msgid "Draw whitespace" msgstr "공백 추가" #: ../gtk/data/OutputEditorText.ui.h:14 ../qt/src/Ui_OutputEditorText.hh:102 msgid "Strip line breaks on selected text" msgstr "ì„ íƒë¬¸ìž¥ 줄 바꿈" #: ../gtk/data/OutputEditorText.ui.h:16 ../qt/src/Ui_OutputEditorText.hh:109 #: ../qt/src/Ui_OutputEditorText.hh:110 msgid "Undo" msgstr "실행취소" #: ../gtk/data/OutputEditorText.ui.h:17 ../qt/src/Ui_OutputEditorText.hh:112 #: ../qt/src/Ui_OutputEditorText.hh:113 msgid "Redo" msgstr "재실행" #: ../gtk/data/PdfExportDialog.ui.h:1 ../qt/data/PdfExportDialog.ui.h:1 msgid "PDF Export" msgstr "PDF로 내보내기" #: ../gtk/data/PdfExportDialog.ui.h:4 ../qt/data/PdfExportDialog.ui.h:4 msgid "Output mode:" msgstr "출력 모드:" #: ../gtk/data/PdfExportDialog.ui.h:5 ../qt/data/PdfExportDialog.ui.h:6 msgid "PDF" msgstr "PDF" #: ../gtk/data/PdfExportDialog.ui.h:6 ../qt/data/PdfExportDialog.ui.h:7 msgid "PDF with invisible text overlay" msgstr "PDFì—서 투명 í…스트 ë®ì–´ì“°ê¸°" #: ../gtk/data/PdfExportDialog.ui.h:7 ../qt/data/PdfExportDialog.ui.h:16 msgid "Format:" msgstr "í¬ë§·:" #: ../gtk/data/PdfExportDialog.ui.h:8 ../qt/data/PdfExportDialog.ui.h:17 msgid "Compression:" msgstr "ì••ì¶•:" #: ../gtk/data/PdfExportDialog.ui.h:9 ../qt/data/PdfExportDialog.ui.h:14 msgid "Compression quality:" msgstr "ì••ì¶• 퀄리티:" #: ../gtk/data/PdfExportDialog.ui.h:10 ../qt/data/PdfExportDialog.ui.h:15 msgid "DPI:" msgstr "DPI:" #: ../gtk/data/PdfExportDialog.ui.h:11 ../qt/data/PdfExportDialog.ui.h:18 msgid "Dithering algorithm:" msgstr "ë””ë”ë§ ì•Œê³ ë¦¬ì¦˜:" #: ../gtk/data/PdfExportDialog.ui.h:12 ../qt/data/PdfExportDialog.ui.h:13 msgid "Image settings:" msgstr "ì´ë¯¸ì§€ 설정:" #: ../gtk/data/PdfExportDialog.ui.h:13 ../qt/data/PdfExportDialog.ui.h:25 msgid "Uniformize line and word spacing" msgstr "줄, 단어 간격 ê· ì¼í™”" #: ../gtk/data/PdfExportDialog.ui.h:14 ../qt/data/PdfExportDialog.ui.h:21 msgid "Override font family:" msgstr "í°íЏ 패밀리 가져오기:" #: ../gtk/data/PdfExportDialog.ui.h:15 ../qt/data/PdfExportDialog.ui.h:27 msgid "Fallback font family:" msgstr "í°íЏ 백업하기:" #: ../gtk/data/PdfExportDialog.ui.h:16 ../qt/data/PdfExportDialog.ui.h:20 msgid "Override font size:" msgstr "í°íЏ 사ì´ì¦ˆ 가져오기:" #: ../gtk/data/PdfExportDialog.ui.h:17 ../qt/data/PdfExportDialog.ui.h:23 msgid "Font scaling:" msgstr "글꼴 í¬ê¸°ì¡°ì •:" #: ../gtk/data/PdfExportDialog.ui.h:18 ../qt/data/PdfExportDialog.ui.h:26 msgid "pt" msgstr "pt" #: ../gtk/data/PdfExportDialog.ui.h:19 ../qt/data/PdfExportDialog.ui.h:22 msgid "Preserve spaces wider than:" msgstr "다ìŒë³´ë‹¤ ë„“ì€ ê³µê°„ 유지:" #: ../gtk/data/PdfExportDialog.ui.h:20 ../qt/data/PdfExportDialog.ui.h:24 msgid "characters" msgstr "문ìž" #: ../gtk/data/PdfExportDialog.ui.h:21 ../qt/data/PdfExportDialog.ui.h:28 msgid "Sanitize hyphens before line breaks" msgstr "" #: ../gtk/data/PdfExportDialog.ui.h:22 ../qt/data/PdfExportDialog.ui.h:19 msgid "Text settings:" msgstr "í…스트 설정:" #: ../gtk/data/PdfExportDialog.ui.h:23 ../qt/data/PdfExportDialog.ui.h:10 msgid "Paper size:" msgstr "용지 í¬ê¸°:" #: ../gtk/data/PdfExportDialog.ui.h:24 ../qt/data/PdfExportDialog.ui.h:11 msgid "Width" msgstr "가로" #: ../gtk/data/PdfExportDialog.ui.h:25 ../qt/data/PdfExportDialog.ui.h:12 msgid "Height" msgstr "세로" #: ../gtk/data/PdfExportDialog.ui.h:26 ../qt/data/PdfExportDialog.ui.h:29 msgid "Treat image sources as having true DPI:" msgstr "" #: ../gtk/data/PdfExportDialog.ui.h:27 ../qt/data/PdfExportDialog.ui.h:3 msgid "Basic" msgstr "기본" #: ../gtk/data/PdfExportDialog.ui.h:28 ../qt/data/PdfExportDialog.ui.h:31 msgid "PDF version:" msgstr "PDF 버전:" #: ../gtk/data/PdfExportDialog.ui.h:29 ../qt/data/PdfExportDialog.ui.h:33 msgid "Password:" msgstr "비밀번호:" #: ../gtk/data/PdfExportDialog.ui.h:30 ../qt/data/PdfExportDialog.ui.h:34 msgid "Confirm password:" msgstr "비밀번호 확ì¸:" #: ../gtk/data/PdfExportDialog.ui.h:31 ../qt/data/PdfExportDialog.ui.h:32 msgid "Encryption (optional):" msgstr "암호화 (ì„ íƒ):" #: ../gtk/data/PdfExportDialog.ui.h:32 ../qt/data/PdfExportDialog.ui.h:36 msgid "Author:" msgstr "ì €ìž:" #: ../gtk/data/PdfExportDialog.ui.h:33 ../qt/data/PdfExportDialog.ui.h:38 msgid "Title:" msgstr "제목:" #: ../gtk/data/PdfExportDialog.ui.h:34 ../qt/data/PdfExportDialog.ui.h:40 msgid "Subject:" msgstr "주제:" #: ../gtk/data/PdfExportDialog.ui.h:35 ../qt/data/PdfExportDialog.ui.h:37 msgid "Creator:" msgstr "제작ìž:" #: ../gtk/data/PdfExportDialog.ui.h:36 ../qt/data/PdfExportDialog.ui.h:39 msgid "Producer:" msgstr "ìƒì‚°ìž:" #: ../gtk/data/PdfExportDialog.ui.h:37 ../qt/data/PdfExportDialog.ui.h:41 msgid "Keywords:" msgstr "키워드:" #: ../gtk/data/PdfExportDialog.ui.h:38 ../qt/data/PdfExportDialog.ui.h:35 msgid "Additional information (optional):" msgstr "추가 ì •ë³´:" #: ../gtk/data/PdfExportDialog.ui.h:39 ../qt/data/PdfExportDialog.ui.h:42 msgid "Import from current source" msgstr "현재 소스ì—서 가져오기" #: ../gtk/data/PdfExportDialog.ui.h:40 ../qt/data/PdfExportDialog.ui.h:30 msgid "Advanced" msgstr "고급" #: ../gtk/data/SearchReplaceFrame.ui.h:1 ../qt/data/SearchReplaceFrame.ui.h:4 msgid "Find" msgstr "찾기" #: ../gtk/data/SearchReplaceFrame.ui.h:2 ../qt/data/SearchReplaceFrame.ui.h:2 msgid "Replace" msgstr "바꾸기" #: ../gtk/data/SearchReplaceFrame.ui.h:3 ../qt/data/SearchReplaceFrame.ui.h:3 msgid "Replace all" msgstr "ëª¨ë‘ ë°”ê¾¸ê¸°" #: ../gtk/data/SearchReplaceFrame.ui.h:4 ../qt/data/SearchReplaceFrame.ui.h:5 msgid "Find previous" msgstr "ì´ì „ 찾기" #: ../gtk/data/SearchReplaceFrame.ui.h:5 ../qt/data/SearchReplaceFrame.ui.h:6 msgid "Find next" msgstr "ë‹¤ìŒ ì°¾ê¸°" #: ../gtk/data/SearchReplaceFrame.ui.h:6 ../qt/data/SearchReplaceFrame.ui.h:7 msgid "Match case" msgstr "대/ì†Œë¬¸ìž êµ¬ë¶„" #: ../gtk/data/SearchReplaceFrame.ui.h:7 #: ../gtk/data/SubstitutionsManager.ui.h:1 ../qt/data/SearchReplaceFrame.ui.h:1 #: ../qt/src/SubstitutionsManager.cc:36 msgid "Substitutions" msgstr "ì €ìž¥ëœ ë°”ê¾¸ê¸° 목ë¡" #: ../gtk/data/SelectionMenu.ui.h:1 ../qt/src/DisplayerToolSelect.cc:239 msgid "Delete" msgstr "ì‚­ì œ" #: ../gtk/data/SelectionMenu.ui.h:2 ../qt/src/DisplayerToolSelect.cc:225 msgid "Order:" msgstr "차례:" #: ../gtk/data/SelectionMenu.ui.h:3 ../gtk/src/hocr/DisplayerToolHOCR.cc:29 #: ../qt/src/DisplayerToolSelect.cc:240 ../qt/src/hocr/DisplayerToolHOCR.cc:31 msgid "Recognize" msgstr "ë¶„ì„하기" #: ../gtk/data/SelectionMenu.ui.h:4 ../qt/src/DisplayerToolSelect.cc:241 msgid "Recognize to clipboard" msgstr "í´ë¦½ë³´ë“œ ë¶„ì„하기" #: ../gtk/data/SelectionMenu.ui.h:5 ../qt/src/DisplayerToolSelect.cc:242 msgid "Save as image" msgstr "ì´ë¯¸ì§€ë¡œ 저장" #: ../gtk/data/SubstitutionsManager.ui.h:2 ../qt/src/SubstitutionsManager.cc:38 #: ../qt/src/SubstitutionsManager.cc:39 msgid "Open" msgstr "열기" #: ../gtk/data/SubstitutionsManager.ui.h:3 ../gtk/src/Utils.cc:73 #: ../qt/src/SubstitutionsManager.cc:41 ../qt/src/SubstitutionsManager.cc:42 msgid "Save" msgstr "저장" #: ../gtk/data/SubstitutionsManager.ui.h:4 ../qt/src/SubstitutionsManager.cc:44 #: ../qt/src/SubstitutionsManager.cc:45 msgid "Clear" msgstr "지우기" #: ../gtk/data/SubstitutionsManager.ui.h:5 ../qt/data/ConfigDialog.ui.h:16 #: ../qt/src/SubstitutionsManager.cc:47 ../qt/src/SubstitutionsManager.cc:48 msgid "Add" msgstr "추가" #: ../gtk/data/SubstitutionsManager.ui.h:6 #: ../gtk/src/hocr/OutputEditorHOCR.cc:886 ../qt/data/ConfigDialog.ui.h:17 #: ../qt/src/hocr/OutputEditorHOCR.cc:727 ../qt/src/SubstitutionsManager.cc:50 #: ../qt/src/SubstitutionsManager.cc:51 msgid "Remove" msgstr "ì‚­ì œ" #: ../gtk/data/SubstitutionsManager.ui.h:7 ../gtk/data/TessdataManager.ui.h:2 msgid "Apply" msgstr "ì ìš©" #: ../gtk/data/SubstitutionsManager.ui.h:8 ../gtk/data/TessdataManager.ui.h:3 msgid "Close" msgstr "닫기" #: ../gtk/data/TessdataManager.ui.h:1 ../qt/src/TessdataManager.cc:49 msgid "Tessdata Manager" msgstr "테서렉트 ë°ì´í„° 매니저" #: ../gtk/data/TessdataManager.ui.h:5 ../qt/src/TessdataManager.cc:51 msgid "Manage installed languages:" msgstr "ì €ìž¥ëœ ì–¸ì–´ 매니저:" #: ../gtk/src/Acquirer.cc:79 ../qt/src/Acquirer.cc:70 msgid "scan.png" msgstr "scan.png" #: ../gtk/src/Acquirer.cc:91 ../qt/src/Acquirer.cc:85 msgid "Images" msgstr "ì´ë¯¸ì§€" #: ../gtk/src/Acquirer.cc:92 ../qt/src/Acquirer.cc:86 msgid "Choose Output Filename..." msgstr "출력 íŒŒì¼ ì„ íƒ..." #: ../gtk/src/Acquirer.cc:106 ../qt/src/Acquirer.cc:100 msgid "Failed to initialize the scanning backend." msgstr "스ìºë‹ 백엔드 초기화 실패." #: ../gtk/src/Acquirer.cc:115 ../qt/src/Acquirer.cc:106 msgid "Scan failed" msgstr "스캔 실패" #: ../gtk/src/Acquirer.cc:133 ../qt/src/Acquirer.cc:122 msgid "No scanners were detected." msgstr "ë°œê²¬ëœ ìŠ¤ìºë„ˆê°€ 없습니다." #: ../gtk/src/Acquirer.cc:150 ../gtk/src/Acquirer.cc:168 #: ../qt/src/Acquirer.cc:136 ../qt/src/Acquirer.cc:154 msgid "Starting scan..." msgstr "스캔 시작..." #: ../gtk/src/Acquirer.cc:164 ../qt/src/Acquirer.cc:150 msgid "Opening device..." msgstr "기기 열기..." #: ../gtk/src/Acquirer.cc:166 ../qt/src/Acquirer.cc:152 msgid "Setting options..." msgstr "옵션..." #: ../gtk/src/Acquirer.cc:170 ../qt/src/Acquirer.cc:156 msgid "Getting parameters..." msgstr "ì¸ìž 가져오기..." #: ../gtk/src/Acquirer.cc:172 ../qt/src/Acquirer.cc:158 msgid "Transferring data..." msgstr "ë°ì´í„° ì´ë™ 중..." #: ../gtk/src/Acquirer.cc:179 ../qt/src/Acquirer.cc:165 msgid "Canceling scan..." msgstr "스캔 취소..." #: ../gtk/src/Config.cc:49 ../qt/data/ConfigDialog.ui.h:7 msgid "Filename prefix" msgstr "파ì¼ì´ë¦„ ì ‘ë‘ì–´" #: ../gtk/src/Config.cc:50 ../qt/data/ConfigDialog.ui.h:8 msgid "Code" msgstr "코드" #: ../gtk/src/Config.cc:51 ../qt/data/ConfigDialog.ui.h:9 msgid "Native name" msgstr "ì´ë¦„" #: ../gtk/src/Config.cc:109 ../qt/src/Config.cc:108 msgid "Script" msgstr "스í¬ë¦½íЏ" #: ../gtk/src/CrashHandler.cc:25 ../gtk/src/CrashHandler.cc:41 #: ../qt/src/CrashHandler.cc:36 msgid "Crash Handler" msgstr "ì¶©ëŒ í•¸ë“¤ëŸ¬" #: ../gtk/src/CrashHandler.cc:43 ../qt/src/CrashHandler.cc:31 msgid "Your work has been saved under %1." msgstr "ìž‘ì—…ë¬¼ì´ ë‹¤ìŒ ê²½ë¡œì— ì €ìž¥ë˜ì—ˆìŠµë‹ˆë‹¤%1." #: ../gtk/src/CrashHandler.cc:45 ../qt/src/CrashHandler.cc:33 msgid "There was no unsaved work." msgstr "저장하지 ì•Šì€ ìž‘ì—…ë¬¼ìž…ë‹ˆë‹¤." #: ../gtk/src/CrashHandler.cc:106 ../qt/src/CrashHandler.cc:62 msgid "Failed to obtain backtrace. Is gdb installed?" msgstr "ì—­ ì¶”ì ì„ 가져오지 못했습니다. gdbê°€ 설치ë˜ì–´ 있습니까?" #: ../gtk/src/Displayer.cc:232 ../qt/src/Displayer.cc:174 msgid "Failed to load image" msgstr "ì´ë¯¸ì§€ 로드 실패" #: ../gtk/src/Displayer.cc:232 ../qt/src/Displayer.cc:174 msgid "" "The file might not be an image or be corrupt:\n" "%1" msgstr "" "파ì¼ì´ ì´ë¯¸ì§€ê°€ 아니거나 ì†ìƒë˜ì—ˆìŠµë‹ˆë‹¤:\n" "%1" #: ../gtk/src/DisplayerToolSelect.cc:138 ../qt/src/DisplayerToolSelect.cc:135 msgid "PNG Images" msgstr "PNG ì´ë¯¸ì§€" #: ../gtk/src/DisplayerToolSelect.cc:139 ../qt/src/DisplayerToolSelect.cc:135 msgid "Save Selection Image" msgstr "ì„ íƒí•œ ì´ë¯¸ì§€ 저장" #: ../gtk/src/DisplayerToolSelect.cc:139 ../qt/src/DisplayerToolSelect.cc:135 msgid "selection.png" msgstr "ì„ íƒëœ ì´ë¯¸ì§€.png" #: ../gtk/src/DisplayerToolSelect.cc:146 ../qt/src/DisplayerToolSelect.cc:142 msgid "Recognize all" msgstr "ëª¨ë‘ ë¶„ì„" #: ../gtk/src/DisplayerToolSelect.cc:146 ../qt/src/DisplayerToolSelect.cc:142 msgid "Recognize selection" msgstr "ì„ íƒí•œ ì˜ì—­ ë¶„ì„" #: ../gtk/src/DisplayerToolSelect.cc:186 ../qt/src/DisplayerToolSelect.cc:182 msgid "Performing layout analysis" msgstr "ë ˆì´ì•„웃 ë¶„ì„ ìˆ˜í–‰" #: ../gtk/src/FileDialogs.cc:235 msgid "" "A file named \"%1\" already exists. Are you sure you want to overwrite it?" msgstr "\"%1\"ë¼ëŠ” ì´ë¦„ì˜ íŒŒì¼ì´ ì´ë¯¸ 있습니다. ë®ì–´ 쓰시겠습니까?" #: ../gtk/src/FileDialogs.cc:237 msgid "Overwrite File?" msgstr "파ì¼ì„ ë®ì–´ 쓰시겠습니까?" #: ../gtk/src/hocr/HOCRDocument.cc:611 ../gtk/src/hocr/OutputEditorHOCR.cc:266 #: ../qt/src/hocr/OutputEditorHOCR.cc:229 msgid "Page" msgstr "페ì´ì§€" #: ../gtk/src/hocr/HOCRDocument.cc:613 ../qt/src/hocr/HOCRDocument.cc:530 msgid "Text block" msgstr "í…스트 블ë¡" #: ../gtk/src/hocr/HOCRDocument.cc:615 ../gtk/src/hocr/OutputEditorHOCR.cc:272 #: ../qt/src/hocr/HOCRDocument.cc:532 ../qt/src/hocr/OutputEditorHOCR.cc:231 msgid "Paragraph" msgstr "구절" #: ../gtk/src/hocr/HOCRDocument.cc:617 ../qt/src/hocr/HOCRDocument.cc:534 msgid "Textline" msgstr "í…스트ë¼ì¸" #: ../gtk/src/hocr/HOCRDocument.cc:621 ../qt/src/hocr/HOCRDocument.cc:538 msgid "Graphic" msgstr "그래픽" #: ../gtk/src/hocr/HOCROdtExporter.cc:65 ../gtk/src/hocr/HOCRPdfExporter.cc:489 #: ../gtk/src/hocr/HOCRTextExporter.cc:34 #: ../gtk/src/hocr/OutputEditorHOCR.cc:963 ../gtk/src/OutputEditorText.cc:272 #: ../qt/src/hocr/HOCROdtExporter.cc:50 ../qt/src/hocr/HOCRPdfExporter.cc:478 #: ../qt/src/hocr/HOCRTextExporter.cc:36 ../qt/src/hocr/OutputEditorHOCR.cc:830 #: ../qt/src/OutputEditorText.cc:238 msgid "output" msgstr "출력" #: ../gtk/src/hocr/HOCROdtExporter.cc:68 ../qt/src/hocr/HOCROdtExporter.cc:53 msgid "OpenDocument Text Documents" msgstr "문서 열기" #: ../gtk/src/hocr/HOCROdtExporter.cc:69 ../qt/src/hocr/HOCROdtExporter.cc:53 msgid "Save ODT Output..." msgstr "ODT 파ì¼ë¡œ 저장하기..." #: ../gtk/src/hocr/HOCROdtExporter.cc:77 ../gtk/src/hocr/HOCROdtExporter.cc:342 #: ../gtk/src/hocr/HOCRPdfExporter.cc:619 #: ../gtk/src/hocr/HOCRTextExporter.cc:46 ../qt/src/hocr/HOCROdtExporter.cc:61 #: ../qt/src/hocr/HOCRPdfExporter.cc:609 ../qt/src/hocr/HOCRTextExporter.cc:47 msgid "Export failed" msgstr "내보내기 실패" #: ../gtk/src/hocr/HOCROdtExporter.cc:77 ../gtk/src/hocr/HOCROdtExporter.cc:342 #: ../qt/src/hocr/HOCROdtExporter.cc:61 msgid "The ODT export failed: unable to write output file." msgstr "ODT 내보내기 실패: 출력 파ì¼ì„ 쓸 수 없습니다." #: ../gtk/src/hocr/HOCROdtExporter.cc:336 ../qt/src/hocr/HOCROdtExporter.cc:254 msgid "Exporting to ODT..." msgstr "ODT로 내보내기..." #: ../gtk/src/hocr/HOCRPdfExporter.cc:283 ../qt/src/hocr/HOCRPdfExporter.cc:365 msgid "Same as source" msgstr "ì›ë³¸ê³¼ ê°™ì€" #: ../gtk/src/hocr/HOCRPdfExporter.cc:286 ../qt/src/hocr/HOCRPdfExporter.cc:366 msgid "Custom" msgstr "커스텀" #: ../gtk/src/hocr/HOCRPdfExporter.cc:300 ../qt/src/hocr/HOCRPdfExporter.cc:362 msgid "cm" msgstr "cm" #: ../gtk/src/hocr/HOCRPdfExporter.cc:303 ../qt/src/hocr/HOCRPdfExporter.cc:363 msgid "in" msgstr "in" #: ../gtk/src/hocr/HOCRPdfExporter.cc:319 ../qt/src/hocr/HOCRPdfExporter.cc:353 msgid "Monochrome" msgstr "모노í¬ë¡¬" #: ../gtk/src/hocr/HOCRPdfExporter.cc:328 ../qt/src/hocr/HOCRPdfExporter.cc:355 msgid "Threshold (closest color)" msgstr "임계 ê°’ (근처 색ìƒ)" #: ../gtk/src/hocr/HOCRPdfExporter.cc:331 ../qt/src/hocr/HOCRPdfExporter.cc:356 msgid "Diffuse" msgstr "확산" #: ../gtk/src/hocr/HOCRPdfExporter.cc:340 ../qt/src/hocr/HOCRPdfExporter.cc:357 msgid "Zip (lossless)" msgstr "Zip (무ì†ì‹¤)" #: ../gtk/src/hocr/HOCRPdfExporter.cc:344 ../qt/src/hocr/HOCRPdfExporter.cc:358 msgid "CCITT Group 4 (lossless)" msgstr "CCITT Group 4 (무ì†ì‹¤)" #: ../gtk/src/hocr/HOCRPdfExporter.cc:348 ../qt/src/hocr/HOCRPdfExporter.cc:359 msgid "Jpeg (lossy)" msgstr "Jpeg (ì†ì‹¤)" #: ../gtk/src/hocr/HOCRPdfExporter.cc:493 ../qt/src/hocr/HOCRPdfExporter.cc:482 msgid "PDF Files" msgstr "PDF 파ì¼" #: ../gtk/src/hocr/HOCRPdfExporter.cc:494 ../qt/src/hocr/HOCRPdfExporter.cc:482 msgid "Save PDF Output..." msgstr "PDF로 저장..." #: ../gtk/src/hocr/HOCRPdfExporter.cc:500 ../qt/src/hocr/HOCRPdfExporter.cc:488 msgid "Invalid Output" msgstr "ìž˜ëª»ëœ ì¶œë ¥" #: ../gtk/src/hocr/HOCRPdfExporter.cc:500 ../qt/src/hocr/HOCRPdfExporter.cc:488 msgid "Cannot overwrite a file which is a source image of this document." msgstr "ì´ ë¬¸ì„œì˜ ì›ë³¸ ì´ë¯¸ì§€ 파ì¼ì„ ë®ì–´ 쓸 수 없습니다." #: ../gtk/src/hocr/HOCRPdfExporter.cc:516 ../qt/src/hocr/HOCRPdfExporter.cc:511 msgid "Failed to create output" msgstr "ì¶œë ¥ì„ ìƒì„±í•˜ì§€ 못했습니다" #: ../gtk/src/hocr/HOCRPdfExporter.cc:516 ../qt/src/hocr/HOCRPdfExporter.cc:511 msgid "Failed to create output. The returned error was: %1" msgstr "ì¶œë ¥ì„ ë§Œë“¤ì§€ 못했습니다. 반환 ëœ ì˜¤ë¥˜ : %1" #: ../gtk/src/hocr/HOCRPdfExporter.cc:558 ../qt/src/hocr/HOCRPdfExporter.cc:551 msgid "The operation was cancelled" msgstr "" #: ../gtk/src/hocr/HOCRPdfExporter.cc:607 ../qt/src/hocr/HOCRPdfExporter.cc:597 msgid "Failed to render page %1" msgstr "" #: ../gtk/src/hocr/HOCRPdfExporter.cc:614 ../qt/src/hocr/HOCRPdfExporter.cc:604 msgid "Exporting to PDF..." msgstr "" #: ../gtk/src/hocr/HOCRPdfExporter.cc:619 ../qt/src/hocr/HOCRPdfExporter.cc:609 msgid "The PDF export failed: %1." msgstr "" #: ../gtk/src/hocr/HOCRPdfExporter.cc:673 ../qt/src/hocr/HOCRPdfExporter.cc:662 msgid "The PDF library could not load the font '%1'." msgstr "" #: ../gtk/src/hocr/HOCRTextExporter.cc:37 ../gtk/src/OutputEditorText.cc:274 #: ../qt/src/hocr/HOCRTextExporter.cc:39 ../qt/src/OutputEditorText.cc:239 msgid "Text Files" msgstr "" #: ../gtk/src/hocr/HOCRTextExporter.cc:38 ../qt/src/hocr/HOCRTextExporter.cc:39 msgid "Save Text Output..." msgstr "" #: ../gtk/src/hocr/HOCRTextExporter.cc:46 ../qt/src/hocr/HOCRTextExporter.cc:47 msgid "The text export failed: unable to write output file." msgstr "" #: ../gtk/src/hocr/OutputEditorHOCR.cc:269 #: ../qt/src/hocr/OutputEditorHOCR.cc:230 msgid "Block" msgstr "" #: ../gtk/src/hocr/OutputEditorHOCR.cc:275 #: ../qt/src/hocr/OutputEditorHOCR.cc:232 msgid "Line" msgstr "" #: ../gtk/src/hocr/OutputEditorHOCR.cc:278 #: ../qt/src/hocr/OutputEditorHOCR.cc:233 msgid "Word" msgstr "" #: ../gtk/src/hocr/OutputEditorHOCR.cc:281 #: ../qt/src/hocr/OutputEditorHOCR.cc:234 msgid "Misspelled word" msgstr "" #: ../gtk/src/hocr/OutputEditorHOCR.cc:435 #: ../qt/src/hocr/OutputEditorHOCR.cc:317 msgid "" "The following pages could not be processed:\n" "%1" msgstr "" #: ../gtk/src/hocr/OutputEditorHOCR.cc:436 #: ../qt/src/hocr/OutputEditorHOCR.cc:318 msgid "Recognition errors" msgstr "" #: ../gtk/src/hocr/OutputEditorHOCR.cc:594 #: ../qt/src/hocr/OutputEditorHOCR.cc:500 #: ../qt/src/hocr/OutputEditorHOCR.cc:512 msgid "Multiple values" msgstr "" #. Merging allowed #: ../gtk/src/hocr/OutputEditorHOCR.cc:778 #: ../qt/src/hocr/OutputEditorHOCR.cc:641 msgid "Merge" msgstr "" #: ../gtk/src/hocr/OutputEditorHOCR.cc:786 #: ../gtk/src/hocr/OutputEditorHOCR.cc:877 #: ../qt/src/hocr/OutputEditorHOCR.cc:643 #: ../qt/src/hocr/OutputEditorHOCR.cc:725 msgid "Split from parent" msgstr "" #. Swapping allowed #: ../gtk/src/hocr/OutputEditorHOCR.cc:797 #: ../qt/src/hocr/OutputEditorHOCR.cc:647 msgid "Swap" msgstr "" #: ../gtk/src/hocr/OutputEditorHOCR.cc:821 #: ../qt/src/hocr/OutputEditorHOCR.cc:693 msgid "Add graphic region" msgstr "" #: ../gtk/src/hocr/OutputEditorHOCR.cc:824 #: ../qt/src/hocr/OutputEditorHOCR.cc:694 msgid "Add text block" msgstr "" #: ../gtk/src/hocr/OutputEditorHOCR.cc:828 #: ../qt/src/hocr/OutputEditorHOCR.cc:696 msgid "Add paragraph" msgstr "" #: ../gtk/src/hocr/OutputEditorHOCR.cc:832 #: ../qt/src/hocr/OutputEditorHOCR.cc:698 msgid "Add line" msgstr "" #: ../gtk/src/hocr/OutputEditorHOCR.cc:836 #: ../qt/src/hocr/OutputEditorHOCR.cc:700 msgid "Add word" msgstr "" #: ../gtk/src/hocr/OutputEditorHOCR.cc:852 #: ../qt/src/hocr/OutputEditorHOCR.cc:710 msgid "No suggestions" msgstr "" #: ../gtk/src/hocr/OutputEditorHOCR.cc:858 #: ../qt/src/hocr/OutputEditorHOCR.cc:714 msgid "Add to dictionary" msgstr "" #: ../gtk/src/hocr/OutputEditorHOCR.cc:864 #: ../qt/src/hocr/OutputEditorHOCR.cc:716 msgid "Ignore word" msgstr "" #: ../gtk/src/hocr/OutputEditorHOCR.cc:926 #: ../gtk/src/hocr/OutputEditorHOCR.cc:965 #: ../qt/src/hocr/OutputEditorHOCR.cc:795 #: ../qt/src/hocr/OutputEditorHOCR.cc:832 msgid "hOCR HTML Files" msgstr "" #: ../gtk/src/hocr/OutputEditorHOCR.cc:927 #: ../qt/src/hocr/OutputEditorHOCR.cc:795 msgid "Open hOCR File" msgstr "" #: ../gtk/src/hocr/OutputEditorHOCR.cc:936 #: ../qt/src/hocr/OutputEditorHOCR.cc:802 msgid "Failed to open file" msgstr "" #: ../gtk/src/hocr/OutputEditorHOCR.cc:936 #: ../qt/src/hocr/OutputEditorHOCR.cc:802 msgid "The file could not be opened: %1." msgstr "" #: ../gtk/src/hocr/OutputEditorHOCR.cc:945 #: ../qt/src/hocr/OutputEditorHOCR.cc:809 msgid "Invalid hOCR file" msgstr "" #: ../gtk/src/hocr/OutputEditorHOCR.cc:945 #: ../qt/src/hocr/OutputEditorHOCR.cc:809 msgid "The file does not appear to contain valid hOCR HTML: %1" msgstr "" #: ../gtk/src/hocr/OutputEditorHOCR.cc:966 #: ../qt/src/hocr/OutputEditorHOCR.cc:832 msgid "Save hOCR Output..." msgstr "" #: ../gtk/src/hocr/OutputEditorHOCR.cc:973 ../gtk/src/OutputEditorText.cc:282 #: ../qt/src/hocr/OutputEditorHOCR.cc:839 ../qt/src/OutputEditorText.cc:246 msgid "Failed to save output" msgstr "" #: ../gtk/src/hocr/OutputEditorHOCR.cc:973 ../gtk/src/OutputEditorText.cc:282 #: ../qt/src/hocr/OutputEditorHOCR.cc:839 ../qt/src/OutputEditorText.cc:246 msgid "Check that you have writing permissions in the selected folder." msgstr "" #: ../gtk/src/hocr/OutputEditorHOCR.cc:1035 ../gtk/src/OutputEditorText.cc:296 #: ../qt/src/hocr/OutputEditorHOCR.cc:894 ../qt/src/OutputEditorText.cc:259 msgid "Output not saved" msgstr "" #: ../gtk/src/hocr/OutputEditorHOCR.cc:1035 ../gtk/src/OutputEditorText.cc:296 #: ../qt/src/hocr/OutputEditorHOCR.cc:894 ../qt/src/OutputEditorText.cc:259 msgid "Save output before proceeding?" msgstr "" #: ../gtk/src/hocr/OutputEditorHOCR.cc:1156 ../gtk/src/OutputEditorText.cc:184 #: ../qt/src/hocr/OutputEditorHOCR.cc:991 ../qt/src/OutputEditorText.cc:152 msgid "Replacing..." msgstr "" #: ../gtk/src/hocr/OutputEditorHOCR.cc:1181 ../gtk/src/OutputEditorText.cc:192 #: ../qt/src/hocr/OutputEditorHOCR.cc:1014 ../qt/src/OutputEditorText.cc:160 msgid "Applying substitutions..." msgstr "" #: ../gtk/src/MainWindow.cc:131 ../qt/src/MainWindow.cc:295 msgid "Using tesseract" msgstr "" #: ../gtk/src/MainWindow.cc:178 ../qt/src/MainWindow.cc:194 msgid "Select an image to begin..." msgstr "" #: ../gtk/src/MainWindow.cc:293 ../qt/src/MainWindow.cc:278 msgid "Multiple sources" msgstr "" #: ../gtk/src/MainWindow.cc:295 ../qt/src/MainWindow.cc:280 msgid "Ready" msgstr "" #: ../gtk/src/MainWindow.cc:442 ../qt/src/MainWindow.cc:423 msgid "New version" msgstr "" #: ../gtk/src/MainWindow.cc:442 ../qt/src/MainWindow.cc:423 msgid "gImageReader %1 is available" msgstr "" #: ../gtk/src/MainWindow.cc:443 ../qt/src/MainWindow.cc:424 msgid "Download" msgstr "" #: ../gtk/src/MainWindow.cc:444 ../qt/src/MainWindow.cc:425 msgid "Changelog" msgstr "" #: ../gtk/src/MainWindow.cc:445 ../qt/src/MainWindow.cc:426 msgid "Don't notify again" msgstr "" #: ../gtk/src/MainWindow.cc:466 ../qt/src/MainWindow.cc:474 msgid "Don't show again" msgstr "" #: ../gtk/src/MainWindow.cc:467 ../gtk/src/MainWindow.cc:480 #: ../qt/src/MainWindow.cc:475 msgid "Install" msgstr "" #: ../gtk/src/MainWindow.cc:487 ../qt/src/MainWindow.cc:487 msgid "Spelling dictionary missing" msgstr "" #: ../gtk/src/MainWindow.cc:487 ../qt/src/MainWindow.cc:487 msgid "The spellcheck dictionary for %1 is not installed" msgstr "" #: ../gtk/src/MainWindow.cc:494 ../gtk/src/MainWindow.cc:523 #: ../qt/src/MainWindow.cc:493 msgid "Installing spelling dictionary for '%1'" msgstr "" #: ../gtk/src/MainWindow.cc:515 ../gtk/src/MainWindow.cc:536 #: ../gtk/src/MainWindow.cc:544 ../gtk/src/MainWindow.cc:592 #: ../gtk/src/MainWindow.cc:597 ../gtk/src/TessdataManager.cc:60 #: ../gtk/src/TessdataManager.cc:70 ../gtk/src/TessdataManager.cc:339 #: ../qt/src/MainWindow.cc:512 ../qt/src/MainWindow.cc:525 #: ../qt/src/MainWindow.cc:534 ../qt/src/MainWindow.cc:578 #: ../qt/src/MainWindow.cc:583 ../qt/src/TessdataManager.cc:74 #: ../qt/src/TessdataManager.cc:84 ../qt/src/TessdataManager.cc:315 msgid "Error" msgstr "" #: ../gtk/src/MainWindow.cc:515 ../qt/src/MainWindow.cc:512 msgid "Failed to install spelling dictionary: %1" msgstr "" #: ../gtk/src/MainWindow.cc:536 ../qt/src/MainWindow.cc:525 msgid "Failed to create directory for spelling dictionaries." msgstr "" #: ../gtk/src/MainWindow.cc:544 ../qt/src/MainWindow.cc:534 msgid "Could not read %1: %2." msgstr "" #: ../gtk/src/MainWindow.cc:571 ../qt/src/MainWindow.cc:558 msgid "Downloading '%1'..." msgstr "" #: ../gtk/src/MainWindow.cc:592 ../qt/src/MainWindow.cc:578 msgid "" "The following dictionaries could not be downloaded:\n" "%1\n" "\n" "Check the connectivity and directory permissions.\n" "Hint: If you don't have write permissions in system folders, you can switch " "to user paths in the settings dialog." msgstr "" #: ../gtk/src/MainWindow.cc:595 ../qt/src/MainWindow.cc:581 msgid "Dictionaries installed" msgstr "ì‚¬ì „íŒŒì¼ ì„¤ì¹˜" #: ../gtk/src/MainWindow.cc:595 msgid "" "The following dictionaries were installed:\n" "%1" msgstr "" "ë‹¤ìŒ ì‚¬ì „íŒŒì¼ì´ 설치ë˜ì—ˆìŠµë‹ˆë‹¤:\n" "%1" #: ../gtk/src/MainWindow.cc:597 ../qt/src/MainWindow.cc:583 msgid "No spelling dictionaries found for '%1'." msgstr "" #: ../gtk/src/OutputEditorText.cc:154 ../qt/src/OutputEditorText.cc:137 msgid "Stripping line breaks..." msgstr "줄 바꿈..." #: ../gtk/src/OutputEditorText.cc:162 msgid "Check spelling" msgstr "맞춤법 검사" #: ../gtk/src/OutputEditorText.cc:231 ../qt/src/OutputEditorText.cc:196 msgid "File: %1" msgstr "파ì¼: %1" #: ../gtk/src/OutputEditorText.cc:234 ../qt/src/OutputEditorText.cc:199 msgid "Page: %1" msgstr "페ì´ì§€: %1" #: ../gtk/src/OutputEditorText.cc:247 ../gtk/src/Recognizer.cc:471 #: ../qt/src/Recognizer.cc:462 msgid "" "\n" "[Failed to recognize page %1]\n" msgstr "" "\n" "[ë¶„ì„ ì‹¤íŒ¨ %1]\n" #: ../gtk/src/OutputEditorText.cc:275 ../qt/src/OutputEditorText.cc:239 msgid "Save Output..." msgstr "출력문 저장..." #: ../gtk/src/Recognizer.cc:179 ../qt/src/Recognizer.cc:172 msgid "No languages available" msgstr "유효한 언어가 없습니다" #: ../gtk/src/Recognizer.cc:179 ../qt/src/Recognizer.cc:172 msgid "" "No tesseract languages are available for use. Recognition will not work." msgstr "유효한 Tesseract 언어 ë°ì´í„°ê°€ 없습니다. ë¶„ì„ì— ì‹¤íŒ¨í–ˆìŠµë‹ˆë‹¤." #: ../gtk/src/Recognizer.cc:233 ../qt/src/Recognizer.cc:232 msgid "Multilingual" msgstr "다국어" #: ../gtk/src/Recognizer.cc:285 ../qt/src/Recognizer.cc:277 msgid "Automatic page segmentation" msgstr "ìžë™ìœ¼ë¡œ 페ì´ì§€ 나누기" #: ../gtk/src/Recognizer.cc:286 ../qt/src/Recognizer.cc:278 msgid "Page segmentation with orientation and script detection" msgstr "소개와 스í¬ë¦½íŠ¸ë¡œ 페ì´ì§€ 나누기" #: ../gtk/src/Recognizer.cc:287 ../qt/src/Recognizer.cc:279 msgid "Assume single column of text" msgstr "" #: ../gtk/src/Recognizer.cc:288 ../qt/src/Recognizer.cc:280 msgid "Assume single block of vertically aligned text" msgstr "" #: ../gtk/src/Recognizer.cc:289 ../qt/src/Recognizer.cc:281 msgid "Assume a single uniform block of text" msgstr "" #: ../gtk/src/Recognizer.cc:290 ../qt/src/Recognizer.cc:282 msgid "Assume a line of text" msgstr "" #: ../gtk/src/Recognizer.cc:291 ../qt/src/Recognizer.cc:283 msgid "Assume a single word" msgstr "" #: ../gtk/src/Recognizer.cc:292 ../qt/src/Recognizer.cc:284 msgid "Assume a single word in a circle" msgstr "" #: ../gtk/src/Recognizer.cc:293 ../qt/src/Recognizer.cc:285 msgid "Sparse text in no particular order" msgstr "" #: ../gtk/src/Recognizer.cc:294 ../qt/src/Recognizer.cc:286 msgid "Sparse text with orientation and script detection" msgstr "" #: ../gtk/src/Recognizer.cc:309 ../qt/src/Recognizer.cc:297 msgid "Page segmentation mode" msgstr "" #: ../gtk/src/Recognizer.cc:313 ../qt/src/Recognizer.cc:300 msgid "Character whitelist / blacklist..." msgstr "" #: ../gtk/src/Recognizer.cc:319 ../qt/src/Recognizer.cc:305 msgid "Manage languages..." msgstr "" #: ../gtk/src/Recognizer.cc:375 ../qt/src/Recognizer.cc:369 msgid "Current selection" msgstr "" #: ../gtk/src/Recognizer.cc:465 ../qt/src/Recognizer.cc:455 msgid "Recognizing page %1 (%2 of %3)" msgstr "" #: ../gtk/src/Recognizer.cc:470 ../qt/src/Recognizer.cc:461 msgid "" "\n" "- Page %1: failed to render page" msgstr "" #: ../gtk/src/Recognizer.cc:501 ../gtk/src/Recognizer.cc:531 #: ../gtk/src/Recognizer.cc:544 ../qt/src/Recognizer.cc:491 #: ../qt/src/Recognizer.cc:521 ../qt/src/Recognizer.cc:534 msgid "Recognizing..." msgstr "" #: ../gtk/src/Recognizer.cc:505 ../gtk/src/Recognizer.cc:514 #: ../qt/src/Recognizer.cc:495 ../qt/src/Recognizer.cc:504 msgid "Recognition errors occurred" msgstr "" #: ../gtk/src/Recognizer.cc:505 ../qt/src/Recognizer.cc:495 msgid "The following errors occurred:%1" msgstr "" #: ../gtk/src/Recognizer.cc:514 ../qt/src/Recognizer.cc:504 msgid "Failed to initialize tesseract" msgstr "" #: ../gtk/src/scanner/ScannerSane.cc:84 ../gtk/src/scanner/ScannerTwain.cc:288 #: ../qt/src/scanner/ScannerSane.cc:85 ../qt/src/scanner/ScannerTwain.cc:286 msgid "Scan canceled" msgstr "" #: ../gtk/src/scanner/ScannerSane.cc:159 ../gtk/src/scanner/ScannerTwain.cc:186 #: ../qt/src/scanner/ScannerSane.cc:159 ../qt/src/scanner/ScannerTwain.cc:178 msgid "No scanner specified" msgstr "" #: ../gtk/src/scanner/ScannerSane.cc:168 ../gtk/src/scanner/ScannerTwain.cc:195 #: ../qt/src/scanner/ScannerSane.cc:168 ../qt/src/scanner/ScannerTwain.cc:187 msgid "Unable to connect to scanner" msgstr "" #: ../gtk/src/scanner/ScannerSane.cc:403 ../gtk/src/scanner/ScannerTwain.cc:266 #: ../gtk/src/scanner/ScannerTwain.cc:292 ../qt/src/scanner/ScannerSane.cc:403 #: ../qt/src/scanner/ScannerTwain.cc:258 ../qt/src/scanner/ScannerTwain.cc:290 msgid "Unable to start scan" msgstr "" #: ../gtk/src/scanner/ScannerSane.cc:411 ../gtk/src/scanner/ScannerSane.cc:461 #: ../gtk/src/scanner/ScannerTwain.cc:318 ../qt/src/scanner/ScannerSane.cc:411 #: ../qt/src/scanner/ScannerSane.cc:461 ../qt/src/scanner/ScannerTwain.cc:316 msgid "Error communicating with scanner" msgstr "" #: ../gtk/src/scanner/ScannerSane.cc:520 ../qt/src/scanner/ScannerSane.cc:517 msgid "Failed to save image" msgstr "" #: ../gtk/src/scanner/ScannerSane.cc:800 ../qt/src/scanner/ScannerSane.cc:797 msgid "Operation is cancelled." msgstr "" #: ../gtk/src/scanner/ScannerSane.cc:802 ../qt/src/scanner/ScannerSane.cc:799 msgid "Device is busy." msgstr "" #: ../gtk/src/scanner/ScannerSane.cc:804 ../qt/src/scanner/ScannerSane.cc:801 msgid "Cover is opened." msgstr "" #: ../gtk/src/scanner/ScannerSane.cc:806 ../qt/src/scanner/ScannerSane.cc:803 msgid "Document feeder jammed." msgstr "" #: ../gtk/src/scanner/ScannerSane.cc:808 ../qt/src/scanner/ScannerSane.cc:805 msgid "Document feeder out of documents." msgstr "" #: ../gtk/src/scanner/ScannerSane.cc:810 ../qt/src/scanner/ScannerSane.cc:807 msgid "Access to scanner is denied." msgstr "" #: ../gtk/src/SourceManager.cc:118 ../qt/src/SourceManager.cc:124 msgid "PDFs with text" msgstr "" #: ../gtk/src/SourceManager.cc:118 ../qt/src/SourceManager.cc:124 msgid "" "These PDF files already contain text:\n" "%1" msgstr "" #: ../gtk/src/SourceManager.cc:127 ../qt/src/SourceManager.cc:132 msgid "Unable to open files" msgstr "" #: ../gtk/src/SourceManager.cc:127 ../qt/src/SourceManager.cc:132 msgid "The following files could not be opened:%1" msgstr "" #: ../gtk/src/SourceManager.cc:141 ../qt/src/SourceManager.cc:143 msgid "Enter password for file '%1':" msgstr "" #: ../gtk/src/SourceManager.cc:197 ../qt/src/SourceManager.cc:214 msgid "Images and PDFs" msgstr "" #: ../gtk/src/SourceManager.cc:202 ../qt/src/SourceManager.cc:215 msgid "Select Files" msgstr "" #: ../gtk/src/SourceManager.cc:208 ../qt/src/SourceManager.cc:226 msgid "Clipboard Error" msgstr "" #: ../gtk/src/SourceManager.cc:208 ../qt/src/SourceManager.cc:226 msgid "Failed to read the clipboard." msgstr "" #: ../gtk/src/SourceManager.cc:212 ../qt/src/SourceManager.cc:230 #: ../qt/src/SourceManager.cc:236 msgid "Pasted %1" msgstr "" #: ../gtk/src/SourceManager.cc:224 ../qt/src/SourceManager.cc:243 msgid "Screenshot Error" msgstr "" #: ../gtk/src/SourceManager.cc:224 ../qt/src/SourceManager.cc:243 msgid "Failed to take screenshot." msgstr "" #: ../gtk/src/SourceManager.cc:228 ../qt/src/SourceManager.cc:247 msgid "Screenshot %1" msgstr "" #: ../gtk/src/SourceManager.cc:233 ../qt/src/SourceManager.cc:252 msgid "Saving image..." msgstr "" #: ../gtk/src/SourceManager.cc:240 ../qt/src/SourceManager.cc:265 msgid "Cannot Write File" msgstr "" #: ../gtk/src/SourceManager.cc:240 ../qt/src/SourceManager.cc:265 msgid "Could not write to %1." msgstr "" #: ../gtk/src/SourceManager.cc:267 ../qt/src/SourceManager.cc:287 msgid "Delete File?" msgstr "" #: ../gtk/src/SourceManager.cc:267 ../qt/src/SourceManager.cc:287 msgid "The following files will be deleted:%1" msgstr "" #: ../gtk/src/SourceManager.cc:332 ../qt/src/SourceManager.cc:338 msgid "Missing File" msgstr "" #: ../gtk/src/SourceManager.cc:332 ../qt/src/SourceManager.cc:338 msgid "" "The following file has been deleted or moved:\n" "%1" msgstr "" #: ../gtk/src/SubstitutionsManager.cc:33 ../qt/src/SubstitutionsManager.cc:73 msgid "Search for" msgstr "" #: ../gtk/src/SubstitutionsManager.cc:34 ../qt/src/SubstitutionsManager.cc:73 msgid "Replace with" msgstr "" #: ../gtk/src/SubstitutionsManager.cc:69 ../gtk/src/SubstitutionsManager.cc:103 #: ../qt/src/SubstitutionsManager.cc:106 ../qt/src/SubstitutionsManager.cc:143 msgid "Substitutions List" msgstr "" #: ../gtk/src/SubstitutionsManager.cc:70 ../qt/src/SubstitutionsManager.cc:106 msgid "Open Substitutions List" msgstr "" #: ../gtk/src/SubstitutionsManager.cc:75 ../qt/src/SubstitutionsManager.cc:112 msgid "Error Reading File" msgstr "" #: ../gtk/src/SubstitutionsManager.cc:75 ../qt/src/SubstitutionsManager.cc:112 msgid "Unable to read '%1'." msgstr "" #: ../gtk/src/SubstitutionsManager.cc:97 ../qt/src/SubstitutionsManager.cc:137 msgid "Errors Occurred Reading File" msgstr "" #: ../gtk/src/SubstitutionsManager.cc:97 ../qt/src/SubstitutionsManager.cc:137 msgid "Some entries of the substitutions list could not be read." msgstr "" #: ../gtk/src/SubstitutionsManager.cc:104 ../qt/src/SubstitutionsManager.cc:143 msgid "Save Substitutions List" msgstr "" #: ../gtk/src/SubstitutionsManager.cc:110 ../qt/src/SubstitutionsManager.cc:149 msgid "Error Saving File" msgstr "" #: ../gtk/src/SubstitutionsManager.cc:110 ../qt/src/SubstitutionsManager.cc:149 msgid "Unable to write to '%1'." msgstr "" #: ../gtk/src/SubstitutionsManager.cc:127 ../qt/src/SubstitutionsManager.cc:162 msgid "Save List?" msgstr "" #: ../gtk/src/SubstitutionsManager.cc:127 ../qt/src/SubstitutionsManager.cc:162 msgid "Do you want to save the current list?" msgstr "" #: ../gtk/src/TessdataManager.cc:60 ../qt/src/TessdataManager.cc:74 msgid "" "A session connection to the PackageKit backend is required for managing " "system-wide tesseract language packs, but it was not found. This service is " "usually provided by a software-management application such as Gnome " "Software. Please install software which provides the necessary PackageKit " "interface, use other system package management software to manage the " "tesseract language packs directly, or switch to using the user tessdata path " "in the configuration dialog." msgstr "" #: ../gtk/src/TessdataManager.cc:65 ../qt/src/TessdataManager.cc:79 msgid "Fetching available languages" msgstr "" #: ../gtk/src/TessdataManager.cc:70 ../gtk/src/TessdataManager.cc:96 #: ../gtk/src/TessdataManager.cc:197 ../qt/src/TessdataManager.cc:84 #: ../qt/src/TessdataManager.cc:101 ../qt/src/TessdataManager.cc:197 msgid "Failed to fetch list of available languages: %1" msgstr "" #: ../gtk/src/TessdataManager.cc:104 ../qt/src/TessdataManager.cc:113 #: ../qt/src/TessdataManager.cc:122 msgid "Parsing error: %1" msgstr "" #: ../gtk/src/TessdataManager.cc:235 ../qt/src/TessdataManager.cc:232 msgid "Applying changes..." msgstr "" #: ../gtk/src/TessdataManager.cc:297 ../qt/src/TessdataManager.cc:278 msgid "Failed to create directory for tessdata files." msgstr "" #: ../gtk/src/TessdataManager.cc:306 ../qt/src/TessdataManager.cc:287 msgid "Downloading %1..." msgstr "" #: ../gtk/src/TessdataManager.cc:330 msgid "" "The following files could not be downloaded or removed:\n" "%1\n" "\n" "Check the connectivity and directory permissions.\n" "\n" "Hint: If you don't have write permissions in system folders, you can switch " "to user paths in the settings dialog." msgstr "" #: ../gtk/src/Utils.cc:64 msgid "Yes" msgstr "" #: ../gtk/src/Utils.cc:67 msgid "No" msgstr "" #: ../gtk/src/Utils.cc:76 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/CrashHandler.ui.h:3 msgid "" "

Tesseract has " "aborted

Tesseract (the OCR engine) has aborted while " "recognizing text. This may occur if the used traineddatas are corrupt or " "incomplatible with the version of tesseract in use, or due to a bug in " "tesseract.

The stacktrace below may provide additional information " "about where the crash occured.

" msgstr "" #: ../qt/data/MainWindow.ui.h:17 msgid "Flatbed" msgstr "" #: ../qt/data/MainWindow.ui.h:18 msgid "ADF Front" msgstr "" #: ../qt/data/MainWindow.ui.h:19 msgid "ADF Back" msgstr "" #: ../qt/data/MainWindow.ui.h:20 msgid "ADF Duplex" msgstr "" #. Remove & from some labels which designer insists in adding #: ../qt/data/MainWindow.ui.h:21 ../qt/src/Ui_MainWindow.hh:50 msgid "Sources" msgstr "" #: ../qt/data/MainWindow.ui.h:22 msgid "Zoom In" msgstr "" #: ../qt/data/MainWindow.ui.h:24 msgid "Zoom Out" msgstr "" #: ../qt/data/MainWindow.ui.h:26 msgid "Normal Size" msgstr "" #: ../qt/data/MainWindow.ui.h:28 msgid "Best Fit" msgstr "" #: ../qt/data/MainWindow.ui.h:30 msgid "Rotate Left" msgstr "" #: ../qt/data/MainWindow.ui.h:31 msgid "Rotate left" msgstr "" #: ../qt/data/MainWindow.ui.h:32 msgid "Rotate Right" msgstr "" #: ../qt/data/MainWindow.ui.h:33 msgid "Rotate right" msgstr "" #: ../qt/data/MainWindow.ui.h:34 msgid "Image Controls" msgstr "" #: ../qt/data/MainWindow.ui.h:36 msgid "Autodetect Layout" msgstr "" #: ../qt/data/MainWindow.ui.h:38 msgid "Toggle Output Pane" msgstr "" #: ../qt/data/PdfExportDialog.ui.h:5 msgid "Backend:" msgstr "" #: ../qt/data/PdfExportDialog.ui.h:8 msgid "Portrait" msgstr "" #: ../qt/data/PdfExportDialog.ui.h:9 msgid "Landscape" msgstr "" #: ../qt/src/hocr/HOCRPdfExporter.cc:142 msgid "Failed to write to file" msgstr "íŒŒì¼ ì €ìž¥ 실패" #. Output toolbar #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:55 #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:56 msgid "Open hOCR file" msgstr "hOCR 열기" #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:57 #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:58 msgid "Save as hOCR text" msgstr "hOCR로 저장" #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:79 #: ../qt/src/Ui_OutputEditorText.hh:106 msgid "Find and Replace" msgstr "찾기 ë° ë°”ê¾¸ê¸°" #: ../qt/src/MainWindow.cc:581 #, fuzzy msgid "" "The following dictionary files were installed:\n" "%1" msgstr "ë‹¤ìŒ ì‚¬ì „ 파ì¼ì´ 설치ë˜ì—ˆìŠµë‹ˆë‹¤ : %1" #: ../qt/src/TessdataManager.cc:308 msgid "" "The following files could not be downloaded or removed:\n" "%1\n" "\n" "Check the connectivity and directory permissions.\n" "Hint: If you don't have write permissions in system folders, you can switch " "to user paths in the settings dialog." msgstr "" #: ../qt/src/Ui_MainWindow.hh:51 msgid "Output" msgstr "출력" #: ../qt/src/Ui_MainWindow.hh:135 msgid "OCR mode:" msgstr "OCR 모드:" #: ../qt/src/Ui_MainWindow.hh:209 msgid "Remove Image" msgstr "ì´ë¯¸ì§€ 제거" #: ../qt/src/Ui_MainWindow.hh:212 msgid "Delete Image" msgstr "ì´ë¯¸ì§€ ì‚­ì œ" #: ../qt/src/Ui_MainWindow.hh:215 msgid "Clear List" msgstr "초기화" #: ../qt/src/Ui_OutputEditorText.hh:101 msgid "Strip Line Breaks" msgstr "문장 줄 바꿈" #: ../qt/src/Ui_OutputEditorText.hh:115 msgid "Save Output" msgstr "출력문 저장" #: ../qt/src/Ui_OutputEditorText.hh:117 msgid "Clear Output" msgstr "초기화" #~ msgid "The application has crashed" #~ msgstr "애플리케ì´ì…˜ ì¶©ëŒ" #~ msgid "Could not read %1: %2" #~ msgstr "%1 : %2 를 ì½ì–´ 올 수 없습니다" gImageReader-3.3.1/po/nb_NO.po000066400000000000000000001767541351740627400160400ustar00rootroot00000000000000# 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. # msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2019-07-25 23:17+0200\n" "PO-Revision-Date: 2019-07-08 05:01+0000\n" "Last-Translator: Allan Nordhøy \n" "Language-Team: Norwegian BokmÃ¥l \n" "Language: nb_NO\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" "X-Generator: Weblate 3.8-dev\n" #: ../data/gimagereader.desktop.in.h:1 msgid "OCR application" msgstr "Tekstgjenkjenningsprogram" #: ../gtk/data/appmenu.ui.h:1 ../qt/src/Ui_MainWindow.hh:167 msgid "Redetect Languages" msgstr "Oppdag sprÃ¥k pÃ¥ nytt" #: ../gtk/data/appmenu.ui.h:2 ../qt/src/Ui_MainWindow.hh:170 msgid "Manage Languages" msgstr "Behandle sprÃ¥k" #: ../gtk/data/appmenu.ui.h:3 ../gtk/data/ConfigDialog.ui.h:1 #: ../qt/data/ConfigDialog.ui.h:1 ../qt/src/Ui_MainWindow.hh:173 msgid "Preferences" msgstr "Innstillinger" #: ../gtk/data/appmenu.ui.h:4 ../gtk/data/ConfigDialog.ui.h:2 #: ../gtk/src/MainWindow.cc:482 ../qt/src/MainWindow.cc:481 #: ../qt/src/Ui_MainWindow.hh:178 msgid "Help" msgstr "Hjelp" #: ../gtk/data/appmenu.ui.h:5 ../qt/data/AboutDialog.ui.h:2 #: ../qt/src/Ui_MainWindow.hh:181 msgid "About" msgstr "Om" #: ../gtk/data/appmenu.ui.h:6 msgid "Quit" msgstr "Avslutt" #: ../gtk/data/ConfigDialog.ui.h:3 ../gtk/data/MainWindow.ui.h:47 #: ../gtk/data/OutputEditorHOCR.ui.h:3 ../gtk/data/PdfExportDialog.ui.h:3 #: ../gtk/src/FileDialogs.cc:152 ../gtk/src/Utils.cc:61 #: ../qt/data/ConfigDialog.ui.h:26 msgid "OK" msgstr "OK" #: ../gtk/data/ConfigDialog.ui.h:4 msgid "Output pane orientation:" msgstr "Sideretning for utdatatekst:" #: ../gtk/data/ConfigDialog.ui.h:5 msgid "Horizontal" msgstr "Vannrett" #: ../gtk/data/ConfigDialog.ui.h:6 msgid "Vertical" msgstr "Loddrett" #: ../gtk/data/ConfigDialog.ui.h:7 ../qt/data/ConfigDialog.ui.h:18 msgid "Query to install missing spellcheck dictionaries" msgstr "ForeslÃ¥ installasjon av manglende ordlister" #: ../gtk/data/ConfigDialog.ui.h:8 ../qt/data/ConfigDialog.ui.h:4 msgid "Automatically check for new program versions" msgstr "Se etter nye programvareversjoner automatisk" #: ../gtk/data/ConfigDialog.ui.h:9 ../qt/data/ConfigDialog.ui.h:3 msgid "Predefined language definitions:" msgstr "ForhÃ¥ndsoppsatte sprÃ¥kdefinisjoner:" #: ../gtk/data/ConfigDialog.ui.h:10 ../qt/data/ConfigDialog.ui.h:12 msgid "Additional language definitions:" msgstr "Ytterligere sprÃ¥kdefinisjoner:" #: ../gtk/data/ConfigDialog.ui.h:11 ../qt/data/ConfigDialog.ui.h:20 #, fuzzy msgid "The prefix of the tesseract language data file" msgstr "Prefiks for tesseracts sprÃ¥kdatafil" #: ../gtk/data/ConfigDialog.ui.h:12 ../qt/data/ConfigDialog.ui.h:21 msgid "Prefix" msgstr "Prefiks" #: ../gtk/data/ConfigDialog.ui.h:13 ../qt/data/ConfigDialog.ui.h:22 msgid "The ISO 639-1 language code followed by the country code" msgstr "ISO 639-1 -sprÃ¥kkode, fulgt av landskode" #: ../gtk/data/ConfigDialog.ui.h:14 ../qt/data/ConfigDialog.ui.h:23 msgid "ISO Code" msgstr "ISO-kode" #: ../gtk/data/ConfigDialog.ui.h:15 ../qt/data/ConfigDialog.ui.h:24 msgid "The name of the language" msgstr "SprÃ¥kets navn" #: ../gtk/data/ConfigDialog.ui.h:16 ../qt/data/ConfigDialog.ui.h:25 msgid "Name" msgstr "Navn" #: ../gtk/data/ConfigDialog.ui.h:17 ../gtk/data/MainWindow.ui.h:46 #: ../gtk/data/OutputEditorHOCR.ui.h:2 ../gtk/data/PdfExportDialog.ui.h:2 #: ../gtk/src/Acquirer.cc:34 ../gtk/src/FileDialogs.cc:151 #: ../gtk/src/Utils.cc:70 ../qt/data/ConfigDialog.ui.h:27 #: ../qt/data/MainWindow.ui.h:12 msgid "Cancel" msgstr "Avbryt" #: ../gtk/data/ConfigDialog.ui.h:18 ../qt/data/ConfigDialog.ui.h:5 #, fuzzy msgid "Output pane font:" msgstr "Skrift for utdatavindu:" #: ../gtk/data/ConfigDialog.ui.h:19 ../qt/data/ConfigDialog.ui.h:2 msgid "Default" msgstr "Forvalg" #: ../gtk/data/ConfigDialog.ui.h:20 ../qt/data/ConfigDialog.ui.h:6 msgid "Language data locations:" msgstr "SprÃ¥kdatalokaliteter:" #: ../gtk/data/ConfigDialog.ui.h:21 ../qt/data/ConfigDialog.ui.h:13 msgid "Language definitions path:" msgstr "SprÃ¥kdefinisjonssti:" #: ../gtk/data/ConfigDialog.ui.h:22 ../qt/data/ConfigDialog.ui.h:28 msgid "Spelling dictionaries path:" msgstr "Staveordbokssti:" #: ../gtk/data/ConfigDialog.ui.h:23 ../qt/data/ConfigDialog.ui.h:10 msgid "System-wide paths" msgstr "Systemomfattende stier" #: ../gtk/data/ConfigDialog.ui.h:24 ../qt/data/ConfigDialog.ui.h:11 msgid "User paths" msgstr "Brukerstier" #: ../gtk/data/ConfigDialog.ui.h:25 ../qt/data/ConfigDialog.ui.h:29 msgid "Automatically open exported documents with default application" msgstr "Ã…pne eksporterte dokumenter automatisk med forvalgt program" #: ../gtk/data/CrashHandler.ui.h:1 ../qt/src/CrashHandler.cc:38 msgid "Regenerate backtrace" msgstr "Gjenskap tilbakesporing" #: ../gtk/data/CrashHandler.ui.h:3 #, fuzzy, no-c-format msgid "" "The application has crashed\n" "\n" "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 "" "Innrapporter problemet til manisandro@gmail.com for å forbedre " "programmet. Beskriv hva du gjorde før det kræsjet sammen med informasjonen " "nedenfor. Takk." #: ../gtk/data/CrashHandler.ui.h:6 msgid "" "Tesseract has aborted\n" "\n" "Tesseract (the OCR engine) has aborted while recognizing text. This may " "occur if the used traineddatas are corrupt or incomplatible with the version " "of tesseract in use, or due to a bug in tesseract.\n" "\n" "The stacktrace below may provide additional information about where the " "crash occured.\n" msgstr "" #: ../gtk/data/MainWindow.ui.h:1 ../qt/data/MainWindow.ui.h:39 msgid "Toggle output pane" msgstr "Veksle utdatafeltet" #: ../gtk/data/MainWindow.ui.h:2 ../qt/src/Ui_MainWindow.hh:66 msgid "Rotate current page" msgstr "Roter gjeldende side" #: ../gtk/data/MainWindow.ui.h:3 ../qt/src/Ui_MainWindow.hh:67 msgid "Rotate all pages" msgstr "Roter alle sider" #. Sources toolbar #: ../gtk/data/MainWindow.ui.h:4 ../qt/src/Ui_MainWindow.hh:192 msgid "Recent" msgstr "Nylig åpnet" #: ../gtk/data/MainWindow.ui.h:5 ../qt/src/Ui_MainWindow.hh:193 msgid "Paste" msgstr "Lim inn" #: ../gtk/data/MainWindow.ui.h:6 ../qt/src/Ui_MainWindow.hh:194 msgid "Take Screenshot" msgstr "Skjermavbildning" #: ../gtk/data/MainWindow.ui.h:7 ../qt/data/MainWindow.ui.h:23 msgid "Zoom in" msgstr "Forstørr" #: ../gtk/data/MainWindow.ui.h:8 ../qt/data/MainWindow.ui.h:25 msgid "Zoom out" msgstr "Forminsk" #: ../gtk/data/MainWindow.ui.h:9 ../qt/data/MainWindow.ui.h:27 msgid "Normal size" msgstr "Normal størrelse" #: ../gtk/data/MainWindow.ui.h:10 ../qt/data/MainWindow.ui.h:29 msgid "Best fit" msgstr "Beste passform" #: ../gtk/data/MainWindow.ui.h:11 ../qt/src/Ui_MainWindow.hh:75 msgid "Select rotation mode" msgstr "Velg rotasjonsmodus" #: ../gtk/data/MainWindow.ui.h:12 ../gtk/data/OutputEditorText.ui.h:13 #: ../qt/src/Ui_OutputEditorText.hh:95 #, fuzzy msgid "Select insert mode" msgstr "Velg innlimingsmodus" #: ../gtk/data/MainWindow.ui.h:13 ../qt/src/Ui_MainWindow.hh:109 #, fuzzy msgid "Select page" msgstr "Velg språk" #: ../gtk/data/MainWindow.ui.h:14 ../qt/data/MainWindow.ui.h:35 msgid "Image controls" msgstr "Bildetilpasning" #: ../gtk/data/MainWindow.ui.h:15 ../qt/src/Ui_MainWindow.hh:139 msgid "Plain text" msgstr "Klartekst" #: ../gtk/data/MainWindow.ui.h:16 ../qt/src/Ui_MainWindow.hh:139 msgid "hOCR, PDF" msgstr "hOCR, PDF" #: ../gtk/data/MainWindow.ui.h:17 ../qt/data/MainWindow.ui.h:37 #, fuzzy msgid "Autodetect layout" msgstr "Oppdag sideretning automatisk" #: ../gtk/data/MainWindow.ui.h:18 msgid "Recognize all" msgstr "Gjenkjenn alle" #: ../gtk/data/MainWindow.ui.h:19 msgid "Select language" msgstr "Velg språk" #: ../gtk/data/MainWindow.ui.h:20 ../qt/src/Ui_MainWindow.hh:205 msgid "Add images" msgstr "Legg til bilder" #: ../gtk/data/MainWindow.ui.h:21 ../qt/src/Ui_MainWindow.hh:204 msgid "Add Images" msgstr "Legg til bilder" #: ../gtk/data/MainWindow.ui.h:22 ../qt/src/Ui_MainWindow.hh:210 msgid "Remove image from list" msgstr "Fjern bilde fra liste" #: ../gtk/data/MainWindow.ui.h:23 ../qt/src/Ui_MainWindow.hh:213 msgid "Delete image" msgstr "Slett bilde" #: ../gtk/data/MainWindow.ui.h:24 ../qt/src/Ui_MainWindow.hh:216 msgid "Clear list" msgstr "Tøm liste" #: ../gtk/data/MainWindow.ui.h:25 ../qt/data/MainWindow.ui.h:5 msgid "Files" msgstr "Filer" #: ../gtk/data/MainWindow.ui.h:26 ../qt/data/MainWindow.ui.h:8 msgid "Device:" msgstr "Enhet:" #: ../gtk/data/MainWindow.ui.h:27 ../gtk/data/TessdataManager.ui.h:4 #: ../qt/data/MainWindow.ui.h:7 ../qt/src/TessdataManager.cc:59 msgid "Refresh" msgstr "Gjenoppfrisk" #: ../gtk/data/MainWindow.ui.h:28 ../qt/data/MainWindow.ui.h:9 #, fuzzy msgid "Output:" msgstr "Utdata:" #: ../gtk/data/MainWindow.ui.h:29 ../qt/data/MainWindow.ui.h:13 msgid "Mode:" msgstr "Modus:" #: ../gtk/data/MainWindow.ui.h:30 ../gtk/src/hocr/HOCRPdfExporter.cc:313 #: ../qt/data/MainWindow.ui.h:15 ../qt/src/hocr/HOCRPdfExporter.cc:347 msgid "Color" msgstr "Farge" #: ../gtk/data/MainWindow.ui.h:31 ../gtk/src/hocr/HOCRPdfExporter.cc:316 #: ../qt/data/MainWindow.ui.h:14 ../qt/src/hocr/HOCRPdfExporter.cc:349 #: ../qt/src/hocr/HOCRPdfExporter.cc:351 msgid "Grayscale" msgstr "Gråskala" #: ../gtk/data/MainWindow.ui.h:32 ../qt/data/MainWindow.ui.h:10 msgid "Resolution:" msgstr "Oppløsning:" #: ../gtk/data/MainWindow.ui.h:33 ../qt/data/MainWindow.ui.h:11 msgid "Scan" msgstr "Skann" #: ../gtk/data/MainWindow.ui.h:34 ../qt/data/MainWindow.ui.h:16 msgid "Source:" msgstr "Kilde:" #: ../gtk/data/MainWindow.ui.h:35 ../qt/data/MainWindow.ui.h:6 msgid "Acquire" msgstr "Hent" #: ../gtk/data/MainWindow.ui.h:36 ../qt/data/MainWindow.ui.h:1 msgid "Brightness" msgstr "Lysstyrke" #: ../gtk/data/MainWindow.ui.h:37 ../qt/data/MainWindow.ui.h:2 msgid "Contrast" msgstr "Kontrast" #: ../gtk/data/MainWindow.ui.h:38 ../qt/data/MainWindow.ui.h:3 msgid "Resolution" msgstr "Oppløsning" #: ../gtk/data/MainWindow.ui.h:39 ../qt/data/MainWindow.ui.h:4 msgid "Invert colors" msgstr "Inverter farger" #: ../gtk/data/MainWindow.ui.h:40 msgid "A graphical frontend to tesseract-ocr" msgstr "En grafisk grenseflate for tesseract-ocr" #: ../gtk/data/MainWindow.ui.h:41 ../qt/data/CharacterListDialog.ui.h:1 msgid "Character whitelist / blacklist" msgstr "" #: ../gtk/data/MainWindow.ui.h:42 ../qt/data/CharacterListDialog.ui.h:2 msgid "Exclude these characters from being recognized (blacklist):" msgstr "" #: ../gtk/data/MainWindow.ui.h:43 ../qt/data/CharacterListDialog.ui.h:3 #, fuzzy msgid "Enter a string of characters..." msgstr "Henter parameter…" #: ../gtk/data/MainWindow.ui.h:44 ../qt/data/CharacterListDialog.ui.h:4 msgid "Only allow the following characters to be recognized (whitelist):" msgstr "" #: ../gtk/data/MainWindow.ui.h:45 ../qt/data/PageRangeDialog.ui.h:1 msgid "Page Range" msgstr "Sidetallfølge" #: ../gtk/data/MainWindow.ui.h:48 ../qt/data/PageRangeDialog.ui.h:2 msgid "Page range:" msgstr "Sidetallfølge:" #: ../gtk/data/MainWindow.ui.h:49 ../qt/data/PageRangeDialog.ui.h:3 msgid "Example: 1-10, 13, 14-18" msgstr "Eksempel: 1-10, 13, 14-18" #: ../gtk/data/MainWindow.ui.h:50 ../qt/data/PageRangeDialog.ui.h:4 msgid "Recognition area:" msgstr "Oppdagelsesområde:" #: ../gtk/data/MainWindow.ui.h:51 ../gtk/src/Recognizer.cc:375 #: ../qt/data/PageRangeDialog.ui.h:5 ../qt/src/Recognizer.cc:369 msgid "Entire page" msgstr "Hele siden" #: ../gtk/data/MainWindow.ui.h:52 ../qt/data/PageRangeDialog.ui.h:6 msgid "Autodetect" msgstr "Oppdag automatisk" #: ../gtk/data/MainWindow.ui.h:53 ../qt/data/PageRangeDialog.ui.h:7 msgid "Prepend to output text:" msgstr "Legg til før utdatatekst:" #: ../gtk/data/MainWindow.ui.h:54 ../qt/data/PageRangeDialog.ui.h:8 msgid "Source filename" msgstr "Kilde-filnavn" #: ../gtk/data/MainWindow.ui.h:55 ../qt/data/PageRangeDialog.ui.h:9 msgid "Source page" msgstr "Kildeside" #: ../gtk/data/MainWindow.ui.h:56 ../qt/src/SourceManager.cc:146 msgid "Protected PDF" msgstr "Beskyttet PDF" #: ../gtk/data/MainWindow.ui.h:57 ../qt/src/Recognizer.cc:76 msgid "Current Page" msgstr "Nåværende side" #: ../gtk/data/MainWindow.ui.h:58 ../qt/src/Recognizer.cc:79 msgid "Multiple Pages..." msgstr "Flere sider…" #: ../gtk/data/OutputEditorHOCR.ui.h:1 ../qt/src/hocr/OutputEditorHOCR.cc:580 msgid "Add Word" msgstr "Legg til ord" #: ../gtk/data/OutputEditorHOCR.ui.h:4 ../qt/src/hocr/OutputEditorHOCR.cc:580 msgid "Enter word:" msgstr "Skriv inn ord:" #: ../gtk/data/OutputEditorHOCR.ui.h:5 ../qt/src/hocr/Ui_OutputEditorHOCR.hh:61 #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:62 msgid "Export to plain text" msgstr "Eksporter til klartekst" #: ../gtk/data/OutputEditorHOCR.ui.h:6 ../qt/src/hocr/Ui_OutputEditorHOCR.hh:64 #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:65 msgid "Export to PDF" msgstr "Eksporter til PDF" #: ../gtk/data/OutputEditorHOCR.ui.h:7 ../qt/src/hocr/Ui_OutputEditorHOCR.hh:67 #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:68 msgid "Export to ODT" msgstr "Eksporter til ODT" #: ../gtk/data/OutputEditorHOCR.ui.h:8 ../gtk/data/OutputEditorText.ui.h:18 #: ../qt/src/Ui_OutputEditorText.hh:116 msgid "Save output" msgstr "Lagre utdata" #: ../gtk/data/OutputEditorHOCR.ui.h:9 ../qt/src/hocr/Ui_OutputEditorHOCR.hh:72 #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:73 msgid "Export" msgstr "Eksporter" #: ../gtk/data/OutputEditorHOCR.ui.h:10 ../gtk/data/OutputEditorText.ui.h:19 #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:77 #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:78 #: ../qt/src/Ui_OutputEditorText.hh:118 msgid "Clear output" msgstr "Tøm utdata" #: ../gtk/data/OutputEditorHOCR.ui.h:11 ../gtk/data/OutputEditorText.ui.h:15 #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:80 #: ../qt/src/Ui_OutputEditorText.hh:107 msgid "Find and replace" msgstr "Søk og erstatt" #: ../gtk/data/OutputEditorHOCR.ui.h:12 #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:82 #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:83 msgid "Show confidence values" msgstr "Vis trygghetsnivåer" #: ../gtk/data/OutputEditorHOCR.ui.h:13 ../gtk/data/PdfExportDialog.ui.h:41 #: ../qt/data/PdfExportDialog.ui.h:2 ../qt/src/hocr/Ui_OutputEditorHOCR.hh:85 #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:86 #, fuzzy msgid "Show preview" msgstr "Forhåndsvis" #: ../gtk/data/OutputEditorHOCR.ui.h:14 #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:121 msgid "Next (F3)" msgstr "Neste (F3)" #: ../gtk/data/OutputEditorHOCR.ui.h:15 #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:122 msgid "Previous (Shift+F3)" msgstr "Forrige (Shift+F3)" #: ../gtk/data/OutputEditorHOCR.ui.h:16 ../gtk/src/hocr/OutputEditorHOCR.cc:890 #: ../qt/src/hocr/OutputEditorHOCR.cc:730 #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:126 msgid "Expand all" msgstr "Utvid alle" #: ../gtk/data/OutputEditorHOCR.ui.h:17 ../gtk/src/hocr/OutputEditorHOCR.cc:893 #: ../qt/src/hocr/OutputEditorHOCR.cc:731 #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:127 msgid "Collapse all" msgstr "Fold sammen alle" #: ../gtk/data/OutputEditorHOCR.ui.h:18 #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:148 msgid "Properties" msgstr "Egenskaper" #: ../gtk/data/OutputEditorHOCR.ui.h:19 #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:152 msgid "Source" msgstr "Kilde" #. Output insert mode #: ../gtk/data/OutputEditorText.ui.h:1 ../qt/src/Ui_OutputEditorText.hh:52 #, fuzzy msgid "Append to current text" msgstr "Anfør til aktuell tekst" #: ../gtk/data/OutputEditorText.ui.h:2 ../qt/src/Ui_OutputEditorText.hh:53 msgid "Insert at cursor" msgstr "Sett inn ved peker" #: ../gtk/data/OutputEditorText.ui.h:3 ../qt/src/Ui_OutputEditorText.hh:54 msgid "Replace current text" msgstr "Erstatt nåværende tekst" #. Output postprocessing #: ../gtk/data/OutputEditorText.ui.h:4 ../qt/src/Ui_OutputEditorText.hh:62 #, fuzzy msgid "Keep line break if..." msgstr "Behold linjeskift hvis…" #: ../gtk/data/OutputEditorText.ui.h:5 ../qt/src/Ui_OutputEditorText.hh:64 msgid "Preceded by end mark (.?!)" msgstr "Foregås av sluttegn (.?!)" #: ../gtk/data/OutputEditorText.ui.h:6 ../qt/src/Ui_OutputEditorText.hh:66 msgid "Preceded or succeeded by quote" msgstr "Foregås eller etterfulgt av sittattegn" #: ../gtk/data/OutputEditorText.ui.h:7 ../qt/src/Ui_OutputEditorText.hh:68 msgid "Other options" msgstr "Andre valg" #: ../gtk/data/OutputEditorText.ui.h:8 ../qt/src/Ui_OutputEditorText.hh:70 msgid "Join hyphenated words" msgstr "Bind sammen ord med bindestrek" #: ../gtk/data/OutputEditorText.ui.h:9 ../qt/src/Ui_OutputEditorText.hh:72 #, fuzzy msgid "Collapse whitespace" msgstr "Ta bort blanktegn" #: ../gtk/data/OutputEditorText.ui.h:10 ../qt/src/Ui_OutputEditorText.hh:74 msgid "Preserve paragraphs" msgstr "Bevar avsnitt" #: ../gtk/data/OutputEditorText.ui.h:11 ../qt/src/Ui_OutputEditorText.hh:76 msgid "Visual aids" msgstr "Visuelle hjelpemiddel" #: ../gtk/data/OutputEditorText.ui.h:12 ../qt/src/Ui_OutputEditorText.hh:78 msgid "Draw whitespace" msgstr "Tegn blanktegn" #: ../gtk/data/OutputEditorText.ui.h:14 ../qt/src/Ui_OutputEditorText.hh:102 msgid "Strip line breaks on selected text" msgstr "Fjern linjeskift i markert tekst" #: ../gtk/data/OutputEditorText.ui.h:16 ../qt/src/Ui_OutputEditorText.hh:109 #: ../qt/src/Ui_OutputEditorText.hh:110 msgid "Undo" msgstr "Angre" #: ../gtk/data/OutputEditorText.ui.h:17 ../qt/src/Ui_OutputEditorText.hh:112 #: ../qt/src/Ui_OutputEditorText.hh:113 msgid "Redo" msgstr "Gjenta" #: ../gtk/data/PdfExportDialog.ui.h:1 ../qt/data/PdfExportDialog.ui.h:1 msgid "PDF Export" msgstr "PDF-eksport" #: ../gtk/data/PdfExportDialog.ui.h:4 ../qt/data/PdfExportDialog.ui.h:4 msgid "Output mode:" msgstr "Utdatamodus:" #: ../gtk/data/PdfExportDialog.ui.h:5 ../qt/data/PdfExportDialog.ui.h:6 msgid "PDF" msgstr "PDF" #: ../gtk/data/PdfExportDialog.ui.h:6 ../qt/data/PdfExportDialog.ui.h:7 msgid "PDF with invisible text overlay" msgstr "PDF med usynlig tekstoverlag" #: ../gtk/data/PdfExportDialog.ui.h:7 ../qt/data/PdfExportDialog.ui.h:16 msgid "Format:" msgstr "Format:" #: ../gtk/data/PdfExportDialog.ui.h:8 ../qt/data/PdfExportDialog.ui.h:17 msgid "Compression:" msgstr "Komprimering:" #: ../gtk/data/PdfExportDialog.ui.h:9 ../qt/data/PdfExportDialog.ui.h:14 msgid "Compression quality:" msgstr "Komprimeringskvalitet:" #: ../gtk/data/PdfExportDialog.ui.h:10 ../qt/data/PdfExportDialog.ui.h:15 msgid "DPI:" msgstr "DPI:" #: ../gtk/data/PdfExportDialog.ui.h:11 ../qt/data/PdfExportDialog.ui.h:18 #, fuzzy msgid "Dithering algorithm:" msgstr "Fargesjatteringsutjevningsalgoritme:" #: ../gtk/data/PdfExportDialog.ui.h:12 ../qt/data/PdfExportDialog.ui.h:13 msgid "Image settings:" msgstr "Bildeinnstillinger:" #: ../gtk/data/PdfExportDialog.ui.h:13 ../qt/data/PdfExportDialog.ui.h:25 msgid "Uniformize line and word spacing" msgstr "Enhetlig linje ord ordavstand" #: ../gtk/data/PdfExportDialog.ui.h:14 ../qt/data/PdfExportDialog.ui.h:21 msgid "Override font family:" msgstr "Overstyr skriftfamilie:" #: ../gtk/data/PdfExportDialog.ui.h:15 ../qt/data/PdfExportDialog.ui.h:27 msgid "Fallback font family:" msgstr "Tilbakefallsskriftfamilie:" #: ../gtk/data/PdfExportDialog.ui.h:16 ../qt/data/PdfExportDialog.ui.h:20 msgid "Override font size:" msgstr "Overstyr skriftstørrelse:" #: ../gtk/data/PdfExportDialog.ui.h:17 ../qt/data/PdfExportDialog.ui.h:23 msgid "Font scaling:" msgstr "Skriftskalering:" #: ../gtk/data/PdfExportDialog.ui.h:18 ../qt/data/PdfExportDialog.ui.h:26 msgid "pt" msgstr "pt" #: ../gtk/data/PdfExportDialog.ui.h:19 ../qt/data/PdfExportDialog.ui.h:22 msgid "Preserve spaces wider than:" msgstr "Behold mellomrom større enn:" #: ../gtk/data/PdfExportDialog.ui.h:20 ../qt/data/PdfExportDialog.ui.h:24 msgid "characters" msgstr "tegn" #: ../gtk/data/PdfExportDialog.ui.h:21 ../qt/data/PdfExportDialog.ui.h:28 msgid "Sanitize hyphens before line breaks" msgstr "" #: ../gtk/data/PdfExportDialog.ui.h:22 ../qt/data/PdfExportDialog.ui.h:19 msgid "Text settings:" msgstr "Tekstinnstillinger:" #: ../gtk/data/PdfExportDialog.ui.h:23 ../qt/data/PdfExportDialog.ui.h:10 msgid "Paper size:" msgstr "Papirstørrelse:" #: ../gtk/data/PdfExportDialog.ui.h:24 ../qt/data/PdfExportDialog.ui.h:11 msgid "Width" msgstr "Bredde" #: ../gtk/data/PdfExportDialog.ui.h:25 ../qt/data/PdfExportDialog.ui.h:12 msgid "Height" msgstr "Høyde" #: ../gtk/data/PdfExportDialog.ui.h:26 ../qt/data/PdfExportDialog.ui.h:29 msgid "Treat image sources as having true DPI:" msgstr "" #: ../gtk/data/PdfExportDialog.ui.h:27 ../qt/data/PdfExportDialog.ui.h:3 msgid "Basic" msgstr "Grunnleggende" #: ../gtk/data/PdfExportDialog.ui.h:28 ../qt/data/PdfExportDialog.ui.h:31 msgid "PDF version:" msgstr "PDF-versjon:" #: ../gtk/data/PdfExportDialog.ui.h:29 ../qt/data/PdfExportDialog.ui.h:33 msgid "Password:" msgstr "Passord:" #: ../gtk/data/PdfExportDialog.ui.h:30 ../qt/data/PdfExportDialog.ui.h:34 msgid "Confirm password:" msgstr "Bekreft passord:" #: ../gtk/data/PdfExportDialog.ui.h:31 ../qt/data/PdfExportDialog.ui.h:32 msgid "Encryption (optional):" msgstr "Kryptering (valgfritt):" #: ../gtk/data/PdfExportDialog.ui.h:32 ../qt/data/PdfExportDialog.ui.h:36 msgid "Author:" msgstr "Forfatter:" #: ../gtk/data/PdfExportDialog.ui.h:33 ../qt/data/PdfExportDialog.ui.h:38 msgid "Title:" msgstr "Tittel:" #: ../gtk/data/PdfExportDialog.ui.h:34 ../qt/data/PdfExportDialog.ui.h:40 msgid "Subject:" msgstr "Emne:" #: ../gtk/data/PdfExportDialog.ui.h:35 ../qt/data/PdfExportDialog.ui.h:37 msgid "Creator:" msgstr "Opphavsmann:" #: ../gtk/data/PdfExportDialog.ui.h:36 ../qt/data/PdfExportDialog.ui.h:39 msgid "Producer:" msgstr "Produsent:" #: ../gtk/data/PdfExportDialog.ui.h:37 ../qt/data/PdfExportDialog.ui.h:41 msgid "Keywords:" msgstr "Nøkkelord:" #: ../gtk/data/PdfExportDialog.ui.h:38 ../qt/data/PdfExportDialog.ui.h:35 msgid "Additional information (optional):" msgstr "Ytterligere informasjon (valgfritt):" #: ../gtk/data/PdfExportDialog.ui.h:39 ../qt/data/PdfExportDialog.ui.h:42 msgid "Import from current source" msgstr "Importer fra gjeldende kilde" #: ../gtk/data/PdfExportDialog.ui.h:40 ../qt/data/PdfExportDialog.ui.h:30 msgid "Advanced" msgstr "Avansert" #: ../gtk/data/SearchReplaceFrame.ui.h:1 ../qt/data/SearchReplaceFrame.ui.h:4 msgid "Find" msgstr "Finn" #: ../gtk/data/SearchReplaceFrame.ui.h:2 ../qt/data/SearchReplaceFrame.ui.h:2 msgid "Replace" msgstr "Erstatt" #: ../gtk/data/SearchReplaceFrame.ui.h:3 ../qt/data/SearchReplaceFrame.ui.h:3 msgid "Replace all" msgstr "Erstatt alle" #: ../gtk/data/SearchReplaceFrame.ui.h:4 ../qt/data/SearchReplaceFrame.ui.h:5 msgid "Find previous" msgstr "Finn forrige" #: ../gtk/data/SearchReplaceFrame.ui.h:5 ../qt/data/SearchReplaceFrame.ui.h:6 msgid "Find next" msgstr "Finn neste" #: ../gtk/data/SearchReplaceFrame.ui.h:6 ../qt/data/SearchReplaceFrame.ui.h:7 #, fuzzy msgid "Match case" msgstr "Jamfør versalhøyde" #: ../gtk/data/SearchReplaceFrame.ui.h:7 #: ../gtk/data/SubstitutionsManager.ui.h:1 ../qt/data/SearchReplaceFrame.ui.h:1 #: ../qt/src/SubstitutionsManager.cc:36 msgid "Substitutions" msgstr "Erstatninger" #: ../gtk/data/SelectionMenu.ui.h:1 ../qt/src/DisplayerToolSelect.cc:239 msgid "Delete" msgstr "Slett" #: ../gtk/data/SelectionMenu.ui.h:2 ../qt/src/DisplayerToolSelect.cc:225 msgid "Order:" msgstr "Rekkefølge:" #: ../gtk/data/SelectionMenu.ui.h:3 ../gtk/src/hocr/DisplayerToolHOCR.cc:29 #: ../qt/src/DisplayerToolSelect.cc:240 ../qt/src/hocr/DisplayerToolHOCR.cc:31 msgid "Recognize" msgstr "Gjenkjenn" #: ../gtk/data/SelectionMenu.ui.h:4 ../qt/src/DisplayerToolSelect.cc:241 msgid "Recognize to clipboard" msgstr "Fortolk til utklippstavle" #: ../gtk/data/SelectionMenu.ui.h:5 ../qt/src/DisplayerToolSelect.cc:242 msgid "Save as image" msgstr "Lagre som bilde" #: ../gtk/data/SubstitutionsManager.ui.h:2 ../qt/src/SubstitutionsManager.cc:38 #: ../qt/src/SubstitutionsManager.cc:39 msgid "Open" msgstr "Åpne" #: ../gtk/data/SubstitutionsManager.ui.h:3 ../gtk/src/Utils.cc:73 #: ../qt/src/SubstitutionsManager.cc:41 ../qt/src/SubstitutionsManager.cc:42 msgid "Save" msgstr "Lagre" #: ../gtk/data/SubstitutionsManager.ui.h:4 ../qt/src/SubstitutionsManager.cc:44 #: ../qt/src/SubstitutionsManager.cc:45 msgid "Clear" msgstr "Tøm" #: ../gtk/data/SubstitutionsManager.ui.h:5 ../qt/data/ConfigDialog.ui.h:16 #: ../qt/src/SubstitutionsManager.cc:47 ../qt/src/SubstitutionsManager.cc:48 msgid "Add" msgstr "Legg til" #: ../gtk/data/SubstitutionsManager.ui.h:6 #: ../gtk/src/hocr/OutputEditorHOCR.cc:886 ../qt/data/ConfigDialog.ui.h:17 #: ../qt/src/hocr/OutputEditorHOCR.cc:727 ../qt/src/SubstitutionsManager.cc:50 #: ../qt/src/SubstitutionsManager.cc:51 msgid "Remove" msgstr "Fjern" #: ../gtk/data/SubstitutionsManager.ui.h:7 ../gtk/data/TessdataManager.ui.h:2 msgid "Apply" msgstr "Bruk" #: ../gtk/data/SubstitutionsManager.ui.h:8 ../gtk/data/TessdataManager.ui.h:3 msgid "Close" msgstr "Lukk" #: ../gtk/data/TessdataManager.ui.h:1 ../qt/src/TessdataManager.cc:49 msgid "Tessdata Manager" msgstr "Tessdata-behandler" #: ../gtk/data/TessdataManager.ui.h:5 ../qt/src/TessdataManager.cc:51 msgid "Manage installed languages:" msgstr "Behandle installerte språk:" #: ../gtk/src/Acquirer.cc:79 ../qt/src/Acquirer.cc:70 msgid "scan.png" msgstr "skanning.png" #: ../gtk/src/Acquirer.cc:91 ../qt/src/Acquirer.cc:85 msgid "Images" msgstr "Bilder" #: ../gtk/src/Acquirer.cc:92 ../qt/src/Acquirer.cc:86 msgid "Choose Output Filename..." msgstr "Velg utdatafilnavn…" #: ../gtk/src/Acquirer.cc:106 ../qt/src/Acquirer.cc:100 msgid "Failed to initialize the scanning backend." msgstr "Klarte ikke å igangsette skanningsbakenden." #: ../gtk/src/Acquirer.cc:115 ../qt/src/Acquirer.cc:106 msgid "Scan failed" msgstr "Skanning mislyktes" #: ../gtk/src/Acquirer.cc:133 ../qt/src/Acquirer.cc:122 msgid "No scanners were detected." msgstr "Fant ingen skannere." #: ../gtk/src/Acquirer.cc:150 ../gtk/src/Acquirer.cc:168 #: ../qt/src/Acquirer.cc:136 ../qt/src/Acquirer.cc:154 msgid "Starting scan..." msgstr "Starter skanning…" #: ../gtk/src/Acquirer.cc:164 ../qt/src/Acquirer.cc:150 msgid "Opening device..." msgstr "Åpner enhet…" #: ../gtk/src/Acquirer.cc:166 ../qt/src/Acquirer.cc:152 msgid "Setting options..." msgstr "Setter valg…" #: ../gtk/src/Acquirer.cc:170 ../qt/src/Acquirer.cc:156 msgid "Getting parameters..." msgstr "Henter parameter…" #: ../gtk/src/Acquirer.cc:172 ../qt/src/Acquirer.cc:158 msgid "Transferring data..." msgstr "Overfører data…" #: ../gtk/src/Acquirer.cc:179 ../qt/src/Acquirer.cc:165 msgid "Canceling scan..." msgstr "Avbryter skanning…" #: ../gtk/src/Config.cc:49 ../qt/data/ConfigDialog.ui.h:7 msgid "Filename prefix" msgstr "Filnavnsforstavelse" #: ../gtk/src/Config.cc:50 ../qt/data/ConfigDialog.ui.h:8 msgid "Code" msgstr "Kode" #: ../gtk/src/Config.cc:51 ../qt/data/ConfigDialog.ui.h:9 msgid "Native name" msgstr "Opprinnelig navn" #: ../gtk/src/Config.cc:109 ../qt/src/Config.cc:108 #, fuzzy msgid "Script" msgstr "Skript" #: ../gtk/src/CrashHandler.cc:25 ../gtk/src/CrashHandler.cc:41 #: ../qt/src/CrashHandler.cc:36 msgid "Crash Handler" msgstr "Kræsj-håndterer" #: ../gtk/src/CrashHandler.cc:43 ../qt/src/CrashHandler.cc:31 msgid "Your work has been saved under %1." msgstr "Ditt arbeide har blitt lagret under %1." #: ../gtk/src/CrashHandler.cc:45 ../qt/src/CrashHandler.cc:33 msgid "There was no unsaved work." msgstr "Inget arbeid å lagre." #: ../gtk/src/CrashHandler.cc:106 ../qt/src/CrashHandler.cc:62 msgid "Failed to obtain backtrace. Is gdb installed?" msgstr "Klarte ikke å hente tilbakesporing. Er GDB installert?" #: ../gtk/src/Displayer.cc:232 ../qt/src/Displayer.cc:174 msgid "Failed to load image" msgstr "Klarte ikke å laste bilde" #: ../gtk/src/Displayer.cc:232 ../qt/src/Displayer.cc:174 msgid "" "The file might not be an image or be corrupt:\n" "%1" msgstr "" "Det kan hende filen ikke er et bilde, eller er skadet:\n" "%1" #: ../gtk/src/DisplayerToolSelect.cc:138 ../qt/src/DisplayerToolSelect.cc:135 msgid "PNG Images" msgstr "PNG-bilder" #: ../gtk/src/DisplayerToolSelect.cc:139 ../qt/src/DisplayerToolSelect.cc:135 msgid "Save Selection Image" msgstr "Lagre utvalg som bilde" #: ../gtk/src/DisplayerToolSelect.cc:139 ../qt/src/DisplayerToolSelect.cc:135 #, fuzzy msgid "selection.png" msgstr "utvalg.png" #: ../gtk/src/DisplayerToolSelect.cc:146 ../qt/src/DisplayerToolSelect.cc:142 #, fuzzy msgid "Recognize all" msgstr "Gjenkjenn alt" #: ../gtk/src/DisplayerToolSelect.cc:146 ../qt/src/DisplayerToolSelect.cc:142 msgid "Recognize selection" msgstr "Gjenkjenn utvalg" #: ../gtk/src/DisplayerToolSelect.cc:186 ../qt/src/DisplayerToolSelect.cc:182 #, fuzzy msgid "Performing layout analysis" msgstr "Utfører visningsanalyse" #: ../gtk/src/FileDialogs.cc:235 msgid "" "A file named \"%1\" already exists. Are you sure you want to overwrite it?" msgstr "" "Fil ved navn \"%1\" finnes allerede. Er du sikker på at du vil overskrive " "den?" #: ../gtk/src/FileDialogs.cc:237 msgid "Overwrite File?" msgstr "Overskriv fil?" #: ../gtk/src/hocr/HOCRDocument.cc:611 ../gtk/src/hocr/OutputEditorHOCR.cc:266 #: ../qt/src/hocr/OutputEditorHOCR.cc:229 msgid "Page" msgstr "Side" #: ../gtk/src/hocr/HOCRDocument.cc:613 ../qt/src/hocr/HOCRDocument.cc:530 msgid "Text block" msgstr "Tekstblokk" #: ../gtk/src/hocr/HOCRDocument.cc:615 ../gtk/src/hocr/OutputEditorHOCR.cc:272 #: ../qt/src/hocr/HOCRDocument.cc:532 ../qt/src/hocr/OutputEditorHOCR.cc:231 msgid "Paragraph" msgstr "Avsnitt" #: ../gtk/src/hocr/HOCRDocument.cc:617 ../qt/src/hocr/HOCRDocument.cc:534 msgid "Textline" msgstr "Tekstrad" #: ../gtk/src/hocr/HOCRDocument.cc:621 ../qt/src/hocr/HOCRDocument.cc:538 msgid "Graphic" msgstr "Grafisk" #: ../gtk/src/hocr/HOCROdtExporter.cc:65 ../gtk/src/hocr/HOCRPdfExporter.cc:489 #: ../gtk/src/hocr/HOCRTextExporter.cc:34 #: ../gtk/src/hocr/OutputEditorHOCR.cc:963 ../gtk/src/OutputEditorText.cc:272 #: ../qt/src/hocr/HOCROdtExporter.cc:50 ../qt/src/hocr/HOCRPdfExporter.cc:478 #: ../qt/src/hocr/HOCRTextExporter.cc:36 ../qt/src/hocr/OutputEditorHOCR.cc:830 #: ../qt/src/OutputEditorText.cc:238 msgid "output" msgstr "utdata" #: ../gtk/src/hocr/HOCROdtExporter.cc:68 ../qt/src/hocr/HOCROdtExporter.cc:53 msgid "OpenDocument Text Documents" msgstr "OpenDocument-Tekstdokumenter" #: ../gtk/src/hocr/HOCROdtExporter.cc:69 ../qt/src/hocr/HOCROdtExporter.cc:53 #, fuzzy msgid "Save ODT Output..." msgstr "Lagre ODT-utdata…" #: ../gtk/src/hocr/HOCROdtExporter.cc:77 ../gtk/src/hocr/HOCROdtExporter.cc:342 #: ../gtk/src/hocr/HOCRPdfExporter.cc:619 #: ../gtk/src/hocr/HOCRTextExporter.cc:46 ../qt/src/hocr/HOCROdtExporter.cc:61 #: ../qt/src/hocr/HOCRPdfExporter.cc:609 ../qt/src/hocr/HOCRTextExporter.cc:47 msgid "Export failed" msgstr "Eksport mislyktes" #: ../gtk/src/hocr/HOCROdtExporter.cc:77 ../gtk/src/hocr/HOCROdtExporter.cc:342 #: ../qt/src/hocr/HOCROdtExporter.cc:61 #, fuzzy msgid "The ODT export failed: unable to write output file." msgstr "ODT-eksport mislyktes: Kunne ikke skrive utdatafil." #: ../gtk/src/hocr/HOCROdtExporter.cc:336 ../qt/src/hocr/HOCROdtExporter.cc:254 msgid "Exporting to ODT..." msgstr "Eksporterer til ODT…" #: ../gtk/src/hocr/HOCRPdfExporter.cc:283 ../qt/src/hocr/HOCRPdfExporter.cc:365 msgid "Same as source" msgstr "Samme som kilde" #: ../gtk/src/hocr/HOCRPdfExporter.cc:286 ../qt/src/hocr/HOCRPdfExporter.cc:366 msgid "Custom" msgstr "Egendefinert" #: ../gtk/src/hocr/HOCRPdfExporter.cc:300 ../qt/src/hocr/HOCRPdfExporter.cc:362 msgid "cm" msgstr "cm" #: ../gtk/src/hocr/HOCRPdfExporter.cc:303 ../qt/src/hocr/HOCRPdfExporter.cc:363 msgid "in" msgstr "tommer" #: ../gtk/src/hocr/HOCRPdfExporter.cc:319 ../qt/src/hocr/HOCRPdfExporter.cc:353 msgid "Monochrome" msgstr "Ensfarget" #: ../gtk/src/hocr/HOCRPdfExporter.cc:328 ../qt/src/hocr/HOCRPdfExporter.cc:355 msgid "Threshold (closest color)" msgstr "Terskel (nærmeste farge)" #: ../gtk/src/hocr/HOCRPdfExporter.cc:331 ../qt/src/hocr/HOCRPdfExporter.cc:356 #, fuzzy msgid "Diffuse" msgstr "Diffuser" #: ../gtk/src/hocr/HOCRPdfExporter.cc:340 ../qt/src/hocr/HOCRPdfExporter.cc:357 #, fuzzy msgid "Zip (lossless)" msgstr "ZIP (tapsfri)" #: ../gtk/src/hocr/HOCRPdfExporter.cc:344 ../qt/src/hocr/HOCRPdfExporter.cc:358 msgid "CCITT Group 4 (lossless)" msgstr "CCITT Gruppe 4 (tapsfri)" #: ../gtk/src/hocr/HOCRPdfExporter.cc:348 ../qt/src/hocr/HOCRPdfExporter.cc:359 #, fuzzy msgid "Jpeg (lossy)" msgstr "JPEG (tapsbasert)" #: ../gtk/src/hocr/HOCRPdfExporter.cc:493 ../qt/src/hocr/HOCRPdfExporter.cc:482 msgid "PDF Files" msgstr "PDF-filer" #: ../gtk/src/hocr/HOCRPdfExporter.cc:494 ../qt/src/hocr/HOCRPdfExporter.cc:482 #, fuzzy msgid "Save PDF Output..." msgstr "Lagre PDF-utdata…" #: ../gtk/src/hocr/HOCRPdfExporter.cc:500 ../qt/src/hocr/HOCRPdfExporter.cc:488 msgid "Invalid Output" msgstr "Ugyldig utdata" #: ../gtk/src/hocr/HOCRPdfExporter.cc:500 ../qt/src/hocr/HOCRPdfExporter.cc:488 msgid "Cannot overwrite a file which is a source image of this document." msgstr "Kan ikke overskrive en fil som er et kildebilde i dette dokumentet." #: ../gtk/src/hocr/HOCRPdfExporter.cc:516 ../qt/src/hocr/HOCRPdfExporter.cc:511 msgid "Failed to create output" msgstr "Klarte ikke å opprette utdata" #: ../gtk/src/hocr/HOCRPdfExporter.cc:516 ../qt/src/hocr/HOCRPdfExporter.cc:511 msgid "Failed to create output. The returned error was: %1" msgstr "Klarte ikke å opprette utdata. Feilmeldingen er: %1" #: ../gtk/src/hocr/HOCRPdfExporter.cc:558 ../qt/src/hocr/HOCRPdfExporter.cc:551 msgid "The operation was cancelled" msgstr "Operasjonen ble avbrutt" #: ../gtk/src/hocr/HOCRPdfExporter.cc:607 ../qt/src/hocr/HOCRPdfExporter.cc:597 msgid "Failed to render page %1" msgstr "Klarte ikke å tegne side %1" #: ../gtk/src/hocr/HOCRPdfExporter.cc:614 ../qt/src/hocr/HOCRPdfExporter.cc:604 #, fuzzy msgid "Exporting to PDF..." msgstr "Eksporterer til PDF…" #: ../gtk/src/hocr/HOCRPdfExporter.cc:619 ../qt/src/hocr/HOCRPdfExporter.cc:609 msgid "The PDF export failed: %1." msgstr "PDF-eksport mislyktes: %1." #: ../gtk/src/hocr/HOCRPdfExporter.cc:673 ../qt/src/hocr/HOCRPdfExporter.cc:662 #, fuzzy msgid "The PDF library could not load the font '%1'." msgstr "PDF-biblioteket kunne ikke laste skriften \"%1\"." #: ../gtk/src/hocr/HOCRTextExporter.cc:37 ../gtk/src/OutputEditorText.cc:274 #: ../qt/src/hocr/HOCRTextExporter.cc:39 ../qt/src/OutputEditorText.cc:239 msgid "Text Files" msgstr "Tekstfiler" #: ../gtk/src/hocr/HOCRTextExporter.cc:38 ../qt/src/hocr/HOCRTextExporter.cc:39 #, fuzzy msgid "Save Text Output..." msgstr "Lagre tekstutdata…" #: ../gtk/src/hocr/HOCRTextExporter.cc:46 ../qt/src/hocr/HOCRTextExporter.cc:47 #, fuzzy msgid "The text export failed: unable to write output file." msgstr "Teksteksport mislyktes: Kunne ikke skrive utdatafil." #: ../gtk/src/hocr/OutputEditorHOCR.cc:269 #: ../qt/src/hocr/OutputEditorHOCR.cc:230 msgid "Block" msgstr "Blokk" #: ../gtk/src/hocr/OutputEditorHOCR.cc:275 #: ../qt/src/hocr/OutputEditorHOCR.cc:232 msgid "Line" msgstr "Linje" #: ../gtk/src/hocr/OutputEditorHOCR.cc:278 #: ../qt/src/hocr/OutputEditorHOCR.cc:233 msgid "Word" msgstr "Ord" #: ../gtk/src/hocr/OutputEditorHOCR.cc:281 #: ../qt/src/hocr/OutputEditorHOCR.cc:234 msgid "Misspelled word" msgstr "Feilstavet ord" #: ../gtk/src/hocr/OutputEditorHOCR.cc:435 #: ../qt/src/hocr/OutputEditorHOCR.cc:317 msgid "" "The following pages could not be processed:\n" "%1" msgstr "" "Følgende sider kunne ikke behandles:\n" "%1" #: ../gtk/src/hocr/OutputEditorHOCR.cc:436 #: ../qt/src/hocr/OutputEditorHOCR.cc:318 msgid "Recognition errors" msgstr "Gjenkjennelsesfeil" #: ../gtk/src/hocr/OutputEditorHOCR.cc:594 #: ../qt/src/hocr/OutputEditorHOCR.cc:500 #: ../qt/src/hocr/OutputEditorHOCR.cc:512 msgid "Multiple values" msgstr "Flerfoldige verdier" #. Merging allowed #: ../gtk/src/hocr/OutputEditorHOCR.cc:778 #: ../qt/src/hocr/OutputEditorHOCR.cc:641 msgid "Merge" msgstr "Flett" #: ../gtk/src/hocr/OutputEditorHOCR.cc:786 #: ../gtk/src/hocr/OutputEditorHOCR.cc:877 #: ../qt/src/hocr/OutputEditorHOCR.cc:643 #: ../qt/src/hocr/OutputEditorHOCR.cc:725 msgid "Split from parent" msgstr "Del opp fra opphav" #. Swapping allowed #: ../gtk/src/hocr/OutputEditorHOCR.cc:797 #: ../qt/src/hocr/OutputEditorHOCR.cc:647 #, fuzzy msgid "Swap" msgstr "Veksle" #: ../gtk/src/hocr/OutputEditorHOCR.cc:821 #: ../qt/src/hocr/OutputEditorHOCR.cc:693 msgid "Add graphic region" msgstr "Legg til grafisk region" #: ../gtk/src/hocr/OutputEditorHOCR.cc:824 #: ../qt/src/hocr/OutputEditorHOCR.cc:694 msgid "Add text block" msgstr "Legg til tekstblokk" #: ../gtk/src/hocr/OutputEditorHOCR.cc:828 #: ../qt/src/hocr/OutputEditorHOCR.cc:696 msgid "Add paragraph" msgstr "Legg til avsnitt" #: ../gtk/src/hocr/OutputEditorHOCR.cc:832 #: ../qt/src/hocr/OutputEditorHOCR.cc:698 msgid "Add line" msgstr "Legg til rad" #: ../gtk/src/hocr/OutputEditorHOCR.cc:836 #: ../qt/src/hocr/OutputEditorHOCR.cc:700 msgid "Add word" msgstr "Legg til ord" #: ../gtk/src/hocr/OutputEditorHOCR.cc:852 #: ../qt/src/hocr/OutputEditorHOCR.cc:710 msgid "No suggestions" msgstr "Ingen anbefalinger" #: ../gtk/src/hocr/OutputEditorHOCR.cc:858 #: ../qt/src/hocr/OutputEditorHOCR.cc:714 msgid "Add to dictionary" msgstr "Legg til i ordbok" #: ../gtk/src/hocr/OutputEditorHOCR.cc:864 #: ../qt/src/hocr/OutputEditorHOCR.cc:716 msgid "Ignore word" msgstr "Ignorer ord" #: ../gtk/src/hocr/OutputEditorHOCR.cc:926 #: ../gtk/src/hocr/OutputEditorHOCR.cc:965 #: ../qt/src/hocr/OutputEditorHOCR.cc:795 #: ../qt/src/hocr/OutputEditorHOCR.cc:832 msgid "hOCR HTML Files" msgstr "hOCD-HTML-filer" #: ../gtk/src/hocr/OutputEditorHOCR.cc:927 #: ../qt/src/hocr/OutputEditorHOCR.cc:795 msgid "Open hOCR File" msgstr "Åpne hOCR-fil" #: ../gtk/src/hocr/OutputEditorHOCR.cc:936 #: ../qt/src/hocr/OutputEditorHOCR.cc:802 msgid "Failed to open file" msgstr "Klarte ikke å åpne fil" #: ../gtk/src/hocr/OutputEditorHOCR.cc:936 #: ../qt/src/hocr/OutputEditorHOCR.cc:802 msgid "The file could not be opened: %1." msgstr "Kunne ikke åpne fil: %1" #: ../gtk/src/hocr/OutputEditorHOCR.cc:945 #: ../qt/src/hocr/OutputEditorHOCR.cc:809 msgid "Invalid hOCR file" msgstr "Ugyldig hOCR-fil" #: ../gtk/src/hocr/OutputEditorHOCR.cc:945 #: ../qt/src/hocr/OutputEditorHOCR.cc:809 msgid "The file does not appear to contain valid hOCR HTML: %1" msgstr "Filen later ikke til å inneholde gyldig hOCR-HTML: %1" #: ../gtk/src/hocr/OutputEditorHOCR.cc:966 #: ../qt/src/hocr/OutputEditorHOCR.cc:832 #, fuzzy msgid "Save hOCR Output..." msgstr "Lagre hOCR-utdata…" #: ../gtk/src/hocr/OutputEditorHOCR.cc:973 ../gtk/src/OutputEditorText.cc:282 #: ../qt/src/hocr/OutputEditorHOCR.cc:839 ../qt/src/OutputEditorText.cc:246 msgid "Failed to save output" msgstr "Klarte ikke å lagre utdata" #: ../gtk/src/hocr/OutputEditorHOCR.cc:973 ../gtk/src/OutputEditorText.cc:282 #: ../qt/src/hocr/OutputEditorHOCR.cc:839 ../qt/src/OutputEditorText.cc:246 #, fuzzy msgid "Check that you have writing permissions in the selected folder." msgstr "Sjekk at du har skrivetilgang til valgt mappe." #: ../gtk/src/hocr/OutputEditorHOCR.cc:1035 ../gtk/src/OutputEditorText.cc:296 #: ../qt/src/hocr/OutputEditorHOCR.cc:894 ../qt/src/OutputEditorText.cc:259 msgid "Output not saved" msgstr "Utdata ikke lagret" #: ../gtk/src/hocr/OutputEditorHOCR.cc:1035 ../gtk/src/OutputEditorText.cc:296 #: ../qt/src/hocr/OutputEditorHOCR.cc:894 ../qt/src/OutputEditorText.cc:259 msgid "Save output before proceeding?" msgstr "Lagre utdata før behandling?" #: ../gtk/src/hocr/OutputEditorHOCR.cc:1156 ../gtk/src/OutputEditorText.cc:184 #: ../qt/src/hocr/OutputEditorHOCR.cc:991 ../qt/src/OutputEditorText.cc:152 #, fuzzy msgid "Replacing..." msgstr "Erstatter…" #: ../gtk/src/hocr/OutputEditorHOCR.cc:1181 ../gtk/src/OutputEditorText.cc:192 #: ../qt/src/hocr/OutputEditorHOCR.cc:1014 ../qt/src/OutputEditorText.cc:160 #, fuzzy msgid "Applying substitutions..." msgstr "Legger til erstatninger…" #: ../gtk/src/MainWindow.cc:131 ../qt/src/MainWindow.cc:295 msgid "Using tesseract" msgstr "Bruker tesseract" #: ../gtk/src/MainWindow.cc:178 ../qt/src/MainWindow.cc:194 #, fuzzy msgid "Select an image to begin..." msgstr "Velg et bilde for å begynne…" #: ../gtk/src/MainWindow.cc:293 ../qt/src/MainWindow.cc:278 msgid "Multiple sources" msgstr "Flerfoldige kilder" #: ../gtk/src/MainWindow.cc:295 ../qt/src/MainWindow.cc:280 msgid "Ready" msgstr "Klar" #: ../gtk/src/MainWindow.cc:442 ../qt/src/MainWindow.cc:423 msgid "New version" msgstr "Ny versjon" #: ../gtk/src/MainWindow.cc:442 ../qt/src/MainWindow.cc:423 msgid "gImageReader %1 is available" msgstr "gImageReader %1 er tilgjengelig" #: ../gtk/src/MainWindow.cc:443 ../qt/src/MainWindow.cc:424 msgid "Download" msgstr "Last ned" #: ../gtk/src/MainWindow.cc:444 ../qt/src/MainWindow.cc:425 msgid "Changelog" msgstr "Endringslogg" #: ../gtk/src/MainWindow.cc:445 ../qt/src/MainWindow.cc:426 msgid "Don't notify again" msgstr "Ikke gi beskjed igjen" #: ../gtk/src/MainWindow.cc:466 ../qt/src/MainWindow.cc:474 msgid "Don't show again" msgstr "Ikke vis igjen" #: ../gtk/src/MainWindow.cc:467 ../gtk/src/MainWindow.cc:480 #: ../qt/src/MainWindow.cc:475 msgid "Install" msgstr "Installer" #: ../gtk/src/MainWindow.cc:487 ../qt/src/MainWindow.cc:487 msgid "Spelling dictionary missing" msgstr "Stavingsordbok mangler" #: ../gtk/src/MainWindow.cc:487 ../qt/src/MainWindow.cc:487 msgid "The spellcheck dictionary for %1 is not installed" msgstr "Stavingsordbok for %1 er ikke installert" #: ../gtk/src/MainWindow.cc:494 ../gtk/src/MainWindow.cc:523 #: ../qt/src/MainWindow.cc:493 #, fuzzy msgid "Installing spelling dictionary for '%1'" msgstr "Installerer stavingsordbok for \"%1\"." #: ../gtk/src/MainWindow.cc:515 ../gtk/src/MainWindow.cc:536 #: ../gtk/src/MainWindow.cc:544 ../gtk/src/MainWindow.cc:592 #: ../gtk/src/MainWindow.cc:597 ../gtk/src/TessdataManager.cc:60 #: ../gtk/src/TessdataManager.cc:70 ../gtk/src/TessdataManager.cc:339 #: ../qt/src/MainWindow.cc:512 ../qt/src/MainWindow.cc:525 #: ../qt/src/MainWindow.cc:534 ../qt/src/MainWindow.cc:578 #: ../qt/src/MainWindow.cc:583 ../qt/src/TessdataManager.cc:74 #: ../qt/src/TessdataManager.cc:84 ../qt/src/TessdataManager.cc:315 msgid "Error" msgstr "Feil" #: ../gtk/src/MainWindow.cc:515 ../qt/src/MainWindow.cc:512 msgid "Failed to install spelling dictionary: %1" msgstr "Klarte ikke å installere stavingsordbok: %1" #: ../gtk/src/MainWindow.cc:536 ../qt/src/MainWindow.cc:525 msgid "Failed to create directory for spelling dictionaries." msgstr "Klarte ikke å opprette mappe for stavingsordbøker." #: ../gtk/src/MainWindow.cc:544 ../qt/src/MainWindow.cc:534 msgid "Could not read %1: %2." msgstr "Kunne ikke lese %1: %2." #: ../gtk/src/MainWindow.cc:571 ../qt/src/MainWindow.cc:558 msgid "Downloading '%1'..." msgstr "Laster ned \"%1\"…" #: ../gtk/src/MainWindow.cc:592 ../qt/src/MainWindow.cc:578 msgid "" "The following dictionaries could not be downloaded:\n" "%1\n" "\n" "Check the connectivity and directory permissions.\n" "Hint: If you don't have write permissions in system folders, you can switch " "to user paths in the settings dialog." msgstr "" "Følgende ordbøker kunne ikke lastes ned:\n" "%1\n" "\n" "Sjekk tilkobling- og mappetilganger.\n" "Hint: Hvis du ikke har skrivetilganger i systemmapper, kan du bytte til " "brukerstier i innstillingsdialogen." #: ../gtk/src/MainWindow.cc:595 ../qt/src/MainWindow.cc:581 msgid "Dictionaries installed" msgstr "Ordbøker installert" #: ../gtk/src/MainWindow.cc:595 msgid "" "The following dictionaries were installed:\n" "%1" msgstr "" "Følgende ordbøker ble installert:\n" "%1" #: ../gtk/src/MainWindow.cc:597 ../qt/src/MainWindow.cc:583 #, fuzzy msgid "No spelling dictionaries found for '%1'." msgstr "Ingen stavingsordbøker funnet for \"%1\"." #: ../gtk/src/OutputEditorText.cc:154 ../qt/src/OutputEditorText.cc:137 msgid "Stripping line breaks..." msgstr "Fjerner linjeskift…" #: ../gtk/src/OutputEditorText.cc:162 msgid "Check spelling" msgstr "Stavekontroll" #: ../gtk/src/OutputEditorText.cc:231 ../qt/src/OutputEditorText.cc:196 msgid "File: %1" msgstr "Fil: %1" #: ../gtk/src/OutputEditorText.cc:234 ../qt/src/OutputEditorText.cc:199 msgid "Page: %1" msgstr "Side: %1" #: ../gtk/src/OutputEditorText.cc:247 ../gtk/src/Recognizer.cc:471 #: ../qt/src/Recognizer.cc:462 msgid "" "\n" "[Failed to recognize page %1]\n" msgstr "" "\n" "[Kunne ikke tolke siden %1]\n" #: ../gtk/src/OutputEditorText.cc:275 ../qt/src/OutputEditorText.cc:239 msgid "Save Output..." msgstr "Lagre utdata…" #: ../gtk/src/Recognizer.cc:179 ../qt/src/Recognizer.cc:172 msgid "No languages available" msgstr "Ingen språk tilgjengelig" #: ../gtk/src/Recognizer.cc:179 ../qt/src/Recognizer.cc:172 msgid "" "No tesseract languages are available for use. Recognition will not work." msgstr "" "Ingen Tesseract-språkfiler er tilgjengelige for bruk. Tolkning vil ikke " "fungere." #: ../gtk/src/Recognizer.cc:233 ../qt/src/Recognizer.cc:232 msgid "Multilingual" msgstr "Flerspråklig" #: ../gtk/src/Recognizer.cc:285 ../qt/src/Recognizer.cc:277 msgid "Automatic page segmentation" msgstr "Automatisk sideinndeling" #: ../gtk/src/Recognizer.cc:286 ../qt/src/Recognizer.cc:278 msgid "Page segmentation with orientation and script detection" msgstr "Sideinndeling med sidreretning og skript-oppdagelse" #: ../gtk/src/Recognizer.cc:287 ../qt/src/Recognizer.cc:279 msgid "Assume single column of text" msgstr "Anta én tekstkolonne" #: ../gtk/src/Recognizer.cc:288 ../qt/src/Recognizer.cc:280 msgid "Assume single block of vertically aligned text" msgstr "Anta én blokk med vannrett-anordnet tekst" #: ../gtk/src/Recognizer.cc:289 ../qt/src/Recognizer.cc:281 msgid "Assume a single uniform block of text" msgstr "Anta én helhetlig blokk med tekst" #: ../gtk/src/Recognizer.cc:290 ../qt/src/Recognizer.cc:282 msgid "Assume a line of text" msgstr "Anta én linje med tekst" #: ../gtk/src/Recognizer.cc:291 ../qt/src/Recognizer.cc:283 msgid "Assume a single word" msgstr "Anta ett ord" #: ../gtk/src/Recognizer.cc:292 ../qt/src/Recognizer.cc:284 msgid "Assume a single word in a circle" msgstr "Anta ett ord i en sirkel" #: ../gtk/src/Recognizer.cc:293 ../qt/src/Recognizer.cc:285 msgid "Sparse text in no particular order" msgstr "Tolk tekst i vilkårlig rekkefølge" #: ../gtk/src/Recognizer.cc:294 ../qt/src/Recognizer.cc:286 msgid "Sparse text with orientation and script detection" msgstr "Tolk tekst med sideretning- og skriptoppdagelse" #: ../gtk/src/Recognizer.cc:309 ../qt/src/Recognizer.cc:297 msgid "Page segmentation mode" msgstr "Sideinndelingsmodus" #: ../gtk/src/Recognizer.cc:313 ../qt/src/Recognizer.cc:300 msgid "Character whitelist / blacklist..." msgstr "" #: ../gtk/src/Recognizer.cc:319 ../qt/src/Recognizer.cc:305 #, fuzzy msgid "Manage languages..." msgstr "Håndter språk…" #: ../gtk/src/Recognizer.cc:375 ../qt/src/Recognizer.cc:369 msgid "Current selection" msgstr "Nåværende utvalg" #: ../gtk/src/Recognizer.cc:465 ../qt/src/Recognizer.cc:455 msgid "Recognizing page %1 (%2 of %3)" msgstr "Tolker side %1 (%1 av %3)" #: ../gtk/src/Recognizer.cc:470 ../qt/src/Recognizer.cc:461 msgid "" "\n" "- Page %1: failed to render page" msgstr "" "\n" "- Side %1: Klarte ikke å tegne siden" #: ../gtk/src/Recognizer.cc:501 ../gtk/src/Recognizer.cc:531 #: ../gtk/src/Recognizer.cc:544 ../qt/src/Recognizer.cc:491 #: ../qt/src/Recognizer.cc:521 ../qt/src/Recognizer.cc:534 msgid "Recognizing..." msgstr "Tolker…" #: ../gtk/src/Recognizer.cc:505 ../gtk/src/Recognizer.cc:514 #: ../qt/src/Recognizer.cc:495 ../qt/src/Recognizer.cc:504 msgid "Recognition errors occurred" msgstr "Tolkningsfeil inntraff" #: ../gtk/src/Recognizer.cc:505 ../qt/src/Recognizer.cc:495 #, fuzzy msgid "The following errors occurred:%1" msgstr "Følgende feil inntraff: %1" #: ../gtk/src/Recognizer.cc:514 ../qt/src/Recognizer.cc:504 #, fuzzy msgid "Failed to initialize tesseract" msgstr "Klarte ikke å igangsette Tesseract" #: ../gtk/src/scanner/ScannerSane.cc:84 ../gtk/src/scanner/ScannerTwain.cc:288 #: ../qt/src/scanner/ScannerSane.cc:85 ../qt/src/scanner/ScannerTwain.cc:286 msgid "Scan canceled" msgstr "Skanning avbrutt" #: ../gtk/src/scanner/ScannerSane.cc:159 ../gtk/src/scanner/ScannerTwain.cc:186 #: ../qt/src/scanner/ScannerSane.cc:159 ../qt/src/scanner/ScannerTwain.cc:178 msgid "No scanner specified" msgstr "Ingen skanner angitt" #: ../gtk/src/scanner/ScannerSane.cc:168 ../gtk/src/scanner/ScannerTwain.cc:195 #: ../qt/src/scanner/ScannerSane.cc:168 ../qt/src/scanner/ScannerTwain.cc:187 msgid "Unable to connect to scanner" msgstr "Klarte ikke å koble til skanner" #: ../gtk/src/scanner/ScannerSane.cc:403 ../gtk/src/scanner/ScannerTwain.cc:266 #: ../gtk/src/scanner/ScannerTwain.cc:292 ../qt/src/scanner/ScannerSane.cc:403 #: ../qt/src/scanner/ScannerTwain.cc:258 ../qt/src/scanner/ScannerTwain.cc:290 msgid "Unable to start scan" msgstr "Klarte ikke å starte skanning" #: ../gtk/src/scanner/ScannerSane.cc:411 ../gtk/src/scanner/ScannerSane.cc:461 #: ../gtk/src/scanner/ScannerTwain.cc:318 ../qt/src/scanner/ScannerSane.cc:411 #: ../qt/src/scanner/ScannerSane.cc:461 ../qt/src/scanner/ScannerTwain.cc:316 msgid "Error communicating with scanner" msgstr "Feil under kommunisering med skanner" #: ../gtk/src/scanner/ScannerSane.cc:520 ../qt/src/scanner/ScannerSane.cc:517 msgid "Failed to save image" msgstr "Klarte ikke å lagre bilde" #: ../gtk/src/scanner/ScannerSane.cc:800 ../qt/src/scanner/ScannerSane.cc:797 msgid "Operation is cancelled." msgstr "Operasjonen har blitt avbrutt" #: ../gtk/src/scanner/ScannerSane.cc:802 ../qt/src/scanner/ScannerSane.cc:799 msgid "Device is busy." msgstr "Enheten er opptatt." #: ../gtk/src/scanner/ScannerSane.cc:804 ../qt/src/scanner/ScannerSane.cc:801 msgid "Cover is opened." msgstr "Dekselet er åpnet." #: ../gtk/src/scanner/ScannerSane.cc:806 ../qt/src/scanner/ScannerSane.cc:803 msgid "Document feeder jammed." msgstr "Dokumentmateskuffen har kilt seg." #: ../gtk/src/scanner/ScannerSane.cc:808 ../qt/src/scanner/ScannerSane.cc:805 msgid "Document feeder out of documents." msgstr "Dokumentmateskuff tom." #: ../gtk/src/scanner/ScannerSane.cc:810 ../qt/src/scanner/ScannerSane.cc:807 msgid "Access to scanner is denied." msgstr "Tilgang til skriver nektet." #: ../gtk/src/SourceManager.cc:118 ../qt/src/SourceManager.cc:124 msgid "PDFs with text" msgstr "PDF-filer med tekst" #: ../gtk/src/SourceManager.cc:118 ../qt/src/SourceManager.cc:124 msgid "" "These PDF files already contain text:\n" "%1" msgstr "" "Disse PDF-filene inneholder allerede tekst:\n" "%1" #: ../gtk/src/SourceManager.cc:127 ../qt/src/SourceManager.cc:132 msgid "Unable to open files" msgstr "Kunne ikke åpne filer" #: ../gtk/src/SourceManager.cc:127 ../qt/src/SourceManager.cc:132 #, fuzzy msgid "The following files could not be opened:%1" msgstr "Følgende filer kunne ikke åpnes: %1" #: ../gtk/src/SourceManager.cc:141 ../qt/src/SourceManager.cc:143 msgid "Enter password for file '%1':" msgstr "Skriv inn passordet for filen \"%1\":" #: ../gtk/src/SourceManager.cc:197 ../qt/src/SourceManager.cc:214 msgid "Images and PDFs" msgstr "Bilder og PDF-er" #: ../gtk/src/SourceManager.cc:202 ../qt/src/SourceManager.cc:215 msgid "Select Files" msgstr "Velg filer" #: ../gtk/src/SourceManager.cc:208 ../qt/src/SourceManager.cc:226 msgid "Clipboard Error" msgstr "Utklippstavlefeil" #: ../gtk/src/SourceManager.cc:208 ../qt/src/SourceManager.cc:226 msgid "Failed to read the clipboard." msgstr "Klarte ikke å lese utklippstavlen." #: ../gtk/src/SourceManager.cc:212 ../qt/src/SourceManager.cc:230 #: ../qt/src/SourceManager.cc:236 msgid "Pasted %1" msgstr "Limte inn %1" #: ../gtk/src/SourceManager.cc:224 ../qt/src/SourceManager.cc:243 #, fuzzy msgid "Screenshot Error" msgstr "Skjemavbildningsfeil" #: ../gtk/src/SourceManager.cc:224 ../qt/src/SourceManager.cc:243 msgid "Failed to take screenshot." msgstr "Klarte ikke å utføre skjermavbildning" #: ../gtk/src/SourceManager.cc:228 ../qt/src/SourceManager.cc:247 msgid "Screenshot %1" msgstr "Skjermavbildning %1" #: ../gtk/src/SourceManager.cc:233 ../qt/src/SourceManager.cc:252 #, fuzzy msgid "Saving image..." msgstr "Lagrer bilde…" #: ../gtk/src/SourceManager.cc:240 ../qt/src/SourceManager.cc:265 #, fuzzy msgid "Cannot Write File" msgstr "Kan ikke skrive fil" #: ../gtk/src/SourceManager.cc:240 ../qt/src/SourceManager.cc:265 msgid "Could not write to %1." msgstr "Kunne ikke skrive til %1." #: ../gtk/src/SourceManager.cc:267 ../qt/src/SourceManager.cc:287 msgid "Delete File?" msgstr "Slett fil?" #: ../gtk/src/SourceManager.cc:267 ../qt/src/SourceManager.cc:287 #, fuzzy msgid "The following files will be deleted:%1" msgstr "Følgende filer vil bli slettet: %1" #: ../gtk/src/SourceManager.cc:332 ../qt/src/SourceManager.cc:338 msgid "Missing File" msgstr "Manglende fil" #: ../gtk/src/SourceManager.cc:332 ../qt/src/SourceManager.cc:338 msgid "" "The following file has been deleted or moved:\n" "%1" msgstr "" "Følgende fil har blitt slettet eller flyttet:\n" "%1" #: ../gtk/src/SubstitutionsManager.cc:33 ../qt/src/SubstitutionsManager.cc:73 msgid "Search for" msgstr "Søk etter" #: ../gtk/src/SubstitutionsManager.cc:34 ../qt/src/SubstitutionsManager.cc:73 msgid "Replace with" msgstr "Erstatt med" #: ../gtk/src/SubstitutionsManager.cc:69 ../gtk/src/SubstitutionsManager.cc:103 #: ../qt/src/SubstitutionsManager.cc:106 ../qt/src/SubstitutionsManager.cc:143 msgid "Substitutions List" msgstr "Erstatningsliste" #: ../gtk/src/SubstitutionsManager.cc:70 ../qt/src/SubstitutionsManager.cc:106 msgid "Open Substitutions List" msgstr "Åpne erstatningsliste" #: ../gtk/src/SubstitutionsManager.cc:75 ../qt/src/SubstitutionsManager.cc:112 msgid "Error Reading File" msgstr "Feil under lesing av fil" #: ../gtk/src/SubstitutionsManager.cc:75 ../qt/src/SubstitutionsManager.cc:112 msgid "Unable to read '%1'." msgstr "Kunne ikke lese \"%1\"." #: ../gtk/src/SubstitutionsManager.cc:97 ../qt/src/SubstitutionsManager.cc:137 msgid "Errors Occurred Reading File" msgstr "Feil inntraff under lesing av fil" #: ../gtk/src/SubstitutionsManager.cc:97 ../qt/src/SubstitutionsManager.cc:137 msgid "Some entries of the substitutions list could not be read." msgstr "Noen oppføringer i erstatningslisten kunne ikke leses." #: ../gtk/src/SubstitutionsManager.cc:104 ../qt/src/SubstitutionsManager.cc:143 msgid "Save Substitutions List" msgstr "Lagre erstatningsliste" #: ../gtk/src/SubstitutionsManager.cc:110 ../qt/src/SubstitutionsManager.cc:149 msgid "Error Saving File" msgstr "Feil under lagring av fil" #: ../gtk/src/SubstitutionsManager.cc:110 ../qt/src/SubstitutionsManager.cc:149 msgid "Unable to write to '%1'." msgstr "Kunne ikke skrive til \"%1\"." #: ../gtk/src/SubstitutionsManager.cc:127 ../qt/src/SubstitutionsManager.cc:162 msgid "Save List?" msgstr "Lagre liste?" #: ../gtk/src/SubstitutionsManager.cc:127 ../qt/src/SubstitutionsManager.cc:162 msgid "Do you want to save the current list?" msgstr "Ønsker du å lagre nåværende liste?" #: ../gtk/src/TessdataManager.cc:60 ../qt/src/TessdataManager.cc:74 #, fuzzy msgid "" "A session connection to the PackageKit backend is required for managing " "system-wide tesseract language packs, but it was not found. This service is " "usually provided by a software-management application such as Gnome " "Software. Please install software which provides the necessary PackageKit " "interface, use other system package management software to manage the " "tesseract language packs directly, or switch to using the user tessdata path " "in the configuration dialog." msgstr "" "PackageKit kreves for å håndtere Tesseract-språkfiler for hele systemet, men " "det ble ikke funnet. Bruk systemets pakkebehandlingsprogramvare for å " "håndtere Tesseract-språkpakker, eller bytt for å bruker brukerens tessdata-" "sti i oppsettsdialogen." #: ../gtk/src/TessdataManager.cc:65 ../qt/src/TessdataManager.cc:79 msgid "Fetching available languages" msgstr "Henter tilgjengelige språk" #: ../gtk/src/TessdataManager.cc:70 ../gtk/src/TessdataManager.cc:96 #: ../gtk/src/TessdataManager.cc:197 ../qt/src/TessdataManager.cc:84 #: ../qt/src/TessdataManager.cc:101 ../qt/src/TessdataManager.cc:197 msgid "Failed to fetch list of available languages: %1" msgstr "Klarte ikke å hente listen over tilgjengelige språk: %1" #: ../gtk/src/TessdataManager.cc:104 ../qt/src/TessdataManager.cc:113 #: ../qt/src/TessdataManager.cc:122 msgid "Parsing error: %1" msgstr "Tolkningsfeil: %1" #: ../gtk/src/TessdataManager.cc:235 ../qt/src/TessdataManager.cc:232 #, fuzzy msgid "Applying changes..." msgstr "Utfører endringer…" #: ../gtk/src/TessdataManager.cc:297 ../qt/src/TessdataManager.cc:278 msgid "Failed to create directory for tessdata files." msgstr "Klarte ikke å opprette mappe for tessdata-filer." #: ../gtk/src/TessdataManager.cc:306 ../qt/src/TessdataManager.cc:287 #, fuzzy msgid "Downloading %1..." msgstr "Laster ned %1…" #: ../gtk/src/TessdataManager.cc:330 msgid "" "The following files could not be downloaded or removed:\n" "%1\n" "\n" "Check the connectivity and directory permissions.\n" "\n" "Hint: If you don't have write permissions in system folders, you can switch " "to user paths in the settings dialog." msgstr "" "Følgende filer kunne ikke lastes ned eller fjernes:\n" "%1\n" "\n" "Sjekk tilkobling- og mappe-tilganger.\n" "\n" "Hint: Hvis du ikke har skrivetilganger i systemmapper, kan du bytte til " "brukerstier i innstillingsdialogen." #: ../gtk/src/Utils.cc:64 msgid "Yes" msgstr "Ja" #: ../gtk/src/Utils.cc:67 msgid "No" msgstr "Nei" #: ../gtk/src/Utils.cc:76 msgid "Discard" msgstr "Forkast" #: ../qt/data/AboutDialog.ui.h:1 msgid "About gImageReader" msgstr "Om gImageReader" #: ../qt/data/AboutDialog.ui.h:3 msgid "" "

 

A graphical frontend to tesseract-ocr

Website

 

" msgstr "" "

 

Grafisk grenseflate for tesseract-ocr

Nettside

 

" #: ../qt/data/AboutDialog.ui.h:4 msgid "Credits" msgstr "Bidragsytere" #: ../qt/data/AboutDialog.ui.h:5 msgid "License" msgstr "Lisens" #: ../qt/data/ConfigDialog.ui.h:14 msgid "System encoding" msgstr "Systemtegnkoding" #: ../qt/data/ConfigDialog.ui.h:15 msgid "UTF-8" msgstr "UTF-8" #: ../qt/data/ConfigDialog.ui.h:19 msgid "Text file encoding:" msgstr "Tekstfilkoding:" #: ../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 "" "

Programmet har " "kræsjet

Beklager bryderiet. For å forbedre programmet, overvei " "å innrapportere problemet til manisandro@gmail.com. Prøv å beskrive hva " "du gjorde før programmet kræsjet. Inkluder også informasjonen nedenfor. Takk." "

" #: ../qt/data/CrashHandler.ui.h:3 msgid "" "

Tesseract has " "aborted

Tesseract (the OCR engine) has aborted while " "recognizing text. This may occur if the used traineddatas are corrupt or " "incomplatible with the version of tesseract in use, or due to a bug in " "tesseract.

The stacktrace below may provide additional information " "about where the crash occured.

" msgstr "" #: ../qt/data/MainWindow.ui.h:17 msgid "Flatbed" msgstr "Bordscanner" #: ../qt/data/MainWindow.ui.h:18 #, fuzzy msgid "ADF Front" msgstr "ADF-forside" #: ../qt/data/MainWindow.ui.h:19 msgid "ADF Back" msgstr "ADF-bakside" #: ../qt/data/MainWindow.ui.h:20 msgid "ADF Duplex" msgstr "Tosidig ADF" #. Remove & from some labels which designer insists in adding #: ../qt/data/MainWindow.ui.h:21 ../qt/src/Ui_MainWindow.hh:50 msgid "Sources" msgstr "Kilder" #: ../qt/data/MainWindow.ui.h:22 msgid "Zoom In" msgstr "Forstørr" #: ../qt/data/MainWindow.ui.h:24 msgid "Zoom Out" msgstr "Forminsk" #: ../qt/data/MainWindow.ui.h:26 msgid "Normal Size" msgstr "Normal størrelse" #: ../qt/data/MainWindow.ui.h:28 msgid "Best Fit" msgstr "Beste tilpasning" #: ../qt/data/MainWindow.ui.h:30 msgid "Rotate Left" msgstr "Roter til venstre" #: ../qt/data/MainWindow.ui.h:31 msgid "Rotate left" msgstr "Roter til venstre" #: ../qt/data/MainWindow.ui.h:32 msgid "Rotate Right" msgstr "Roter til høyre" #: ../qt/data/MainWindow.ui.h:33 msgid "Rotate right" msgstr "Roter til høyre" #: ../qt/data/MainWindow.ui.h:34 msgid "Image Controls" msgstr "Bildeanpasning" #: ../qt/data/MainWindow.ui.h:36 msgid "Autodetect Layout" msgstr "Oppdag sideretning automatisk" #: ../qt/data/MainWindow.ui.h:38 #, fuzzy msgid "Toggle Output Pane" msgstr "Veksle utdatafelt" #: ../qt/data/PdfExportDialog.ui.h:5 msgid "Backend:" msgstr "Bakende:" #: ../qt/data/PdfExportDialog.ui.h:8 msgid "Portrait" msgstr "Stående" #: ../qt/data/PdfExportDialog.ui.h:9 msgid "Landscape" msgstr "Liggende" #: ../qt/src/hocr/HOCRPdfExporter.cc:142 msgid "Failed to write to file" msgstr "Klarte ikke å skrive til fil" #. Output toolbar #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:55 #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:56 msgid "Open hOCR file" msgstr "Åpne hOCR-fil" #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:57 #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:58 msgid "Save as hOCR text" msgstr "Lagre som hOCR-tekst" #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:79 #: ../qt/src/Ui_OutputEditorText.hh:106 msgid "Find and Replace" msgstr "Finn og erstatt" #: ../qt/src/MainWindow.cc:581 #, fuzzy msgid "" "The following dictionary files were installed:\n" "%1" msgstr "Følgende ordbøker ble installert: %1" #: ../qt/src/TessdataManager.cc:308 msgid "" "The following files could not be downloaded or removed:\n" "%1\n" "\n" "Check the connectivity and directory permissions.\n" "Hint: If you don't have write permissions in system folders, you can switch " "to user paths in the settings dialog." msgstr "" "Følgende filer kunne ikke lastes ned:\n" "%1\n" "\n" "Sjekk tilkobling- og mappetilganger.\n" "Hint: Hvis du ikke har skrivetilganger i systemmapper, kan du bytte til " "brukerstier i innstillingsdialogen." #: ../qt/src/Ui_MainWindow.hh:51 msgid "Output" msgstr "Utdata" #: ../qt/src/Ui_MainWindow.hh:135 msgid "OCR mode:" msgstr "OCR-modus:" #: ../qt/src/Ui_MainWindow.hh:209 msgid "Remove Image" msgstr "Fjern bilde" #: ../qt/src/Ui_MainWindow.hh:212 msgid "Delete Image" msgstr "Slett bilde" #: ../qt/src/Ui_MainWindow.hh:215 msgid "Clear List" msgstr "Tøm liste" #: ../qt/src/Ui_OutputEditorText.hh:101 msgid "Strip Line Breaks" msgstr "Fjern linjeskift" #: ../qt/src/Ui_OutputEditorText.hh:115 msgid "Save Output" msgstr "Lagre utdata" #: ../qt/src/Ui_OutputEditorText.hh:117 msgid "Clear Output" msgstr "Tøm utdata" #~ msgid "The application has crashed" #~ msgstr "Programmet har kræsjet" #, fuzzy #~ 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 kræsjet med følgende feilmelding:\n" #~ "\n" #~ "%1\n" #~ "\n" #~ "Dette skjer typisk fordi:\n" #~ "- Utdaterte traneddata-filer i bruk.\n" #~ "- Støtte for språkdatafiler mangler.\n" #~ "- Skadede språkdatafiler.\n" #~ "\n" #~ "Forsikre deg om at dine språkdatafiler er gyldige og kompatible med " #~ "Tesseract %2." #~ msgid "Could not read %1: %2" #~ msgstr "Kunne ikke lese %1: %2" #~ msgid "90" #~ msgstr "90" #~ msgid "300" #~ msgstr "300" #~ msgid "100" #~ msgstr "100" #~ msgid "10" #~ msgstr "10" #~ msgid "%" #~ msgstr "%" #~ msgid "4" #~ msgstr "4" #~ msgid "1" #~ msgstr "1" gImageReader-3.3.1/po/nl.po000066400000000000000000002014201351740627400154310ustar00rootroot00000000000000# 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. # msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2019-07-25 23:17+0200\n" "PO-Revision-Date: 2018-03-30 08:45+0000\n" "Last-Translator: Heimen Stoffels \n" "Language-Team: Dutch \n" "Language: nl\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" "X-Generator: Weblate 2.20-dev\n" #: ../data/gimagereader.desktop.in.h:1 msgid "OCR application" msgstr "OCR-applicatie" #: ../gtk/data/appmenu.ui.h:1 ../qt/src/Ui_MainWindow.hh:167 msgid "Redetect Languages" msgstr "Talen opnieuw detecteren" #: ../gtk/data/appmenu.ui.h:2 ../qt/src/Ui_MainWindow.hh:170 msgid "Manage Languages" msgstr "Talen beheren" #: ../gtk/data/appmenu.ui.h:3 ../gtk/data/ConfigDialog.ui.h:1 #: ../qt/data/ConfigDialog.ui.h:1 ../qt/src/Ui_MainWindow.hh:173 msgid "Preferences" msgstr "Voorkeuren" #: ../gtk/data/appmenu.ui.h:4 ../gtk/data/ConfigDialog.ui.h:2 #: ../gtk/src/MainWindow.cc:482 ../qt/src/MainWindow.cc:481 #: ../qt/src/Ui_MainWindow.hh:178 msgid "Help" msgstr "Hulp" #: ../gtk/data/appmenu.ui.h:5 ../qt/data/AboutDialog.ui.h:2 #: ../qt/src/Ui_MainWindow.hh:181 msgid "About" msgstr "Over" #: ../gtk/data/appmenu.ui.h:6 msgid "Quit" msgstr "Afsluiten" #: ../gtk/data/ConfigDialog.ui.h:3 ../gtk/data/MainWindow.ui.h:47 #: ../gtk/data/OutputEditorHOCR.ui.h:3 ../gtk/data/PdfExportDialog.ui.h:3 #: ../gtk/src/FileDialogs.cc:152 ../gtk/src/Utils.cc:61 #: ../qt/data/ConfigDialog.ui.h:26 msgid "OK" msgstr "Oké" #: ../gtk/data/ConfigDialog.ui.h:4 msgid "Output pane orientation:" msgstr "Oriëntatie van uitvoerpaneel:" #: ../gtk/data/ConfigDialog.ui.h:5 msgid "Horizontal" msgstr "Horizontaal" #: ../gtk/data/ConfigDialog.ui.h:6 msgid "Vertical" msgstr "Verticaal" #: ../gtk/data/ConfigDialog.ui.h:7 ../qt/data/ConfigDialog.ui.h:18 msgid "Query to install missing spellcheck dictionaries" msgstr "Opdracht om ontbrekende woordenboek te installeren" #: ../gtk/data/ConfigDialog.ui.h:8 ../qt/data/ConfigDialog.ui.h:4 msgid "Automatically check for new program versions" msgstr "Automatisch controleren op nieuwe versies" #: ../gtk/data/ConfigDialog.ui.h:9 ../qt/data/ConfigDialog.ui.h:3 msgid "Predefined language definitions:" msgstr "Vooraf gedefinieerde taaldefinities:" #: ../gtk/data/ConfigDialog.ui.h:10 ../qt/data/ConfigDialog.ui.h:12 msgid "Additional language definitions:" msgstr "Extra taaldefinities:" #: ../gtk/data/ConfigDialog.ui.h:11 ../qt/data/ConfigDialog.ui.h:20 msgid "The prefix of the tesseract language data file" msgstr "De extensie van het tesseract-taalgegevensbestand" #: ../gtk/data/ConfigDialog.ui.h:12 ../qt/data/ConfigDialog.ui.h:21 msgid "Prefix" msgstr "Extensie" #: ../gtk/data/ConfigDialog.ui.h:13 ../qt/data/ConfigDialog.ui.h:22 msgid "The ISO 639-1 language code followed by the country code" msgstr "De ISO 639-1 taalcode, gevolgd door de landcode" #: ../gtk/data/ConfigDialog.ui.h:14 ../qt/data/ConfigDialog.ui.h:23 msgid "ISO Code" msgstr "ISO-code" #: ../gtk/data/ConfigDialog.ui.h:15 ../qt/data/ConfigDialog.ui.h:24 msgid "The name of the language" msgstr "De naam van de taal" #: ../gtk/data/ConfigDialog.ui.h:16 ../qt/data/ConfigDialog.ui.h:25 msgid "Name" msgstr "Naam" #: ../gtk/data/ConfigDialog.ui.h:17 ../gtk/data/MainWindow.ui.h:46 #: ../gtk/data/OutputEditorHOCR.ui.h:2 ../gtk/data/PdfExportDialog.ui.h:2 #: ../gtk/src/Acquirer.cc:34 ../gtk/src/FileDialogs.cc:151 #: ../gtk/src/Utils.cc:70 ../qt/data/ConfigDialog.ui.h:27 #: ../qt/data/MainWindow.ui.h:12 msgid "Cancel" msgstr "Annuleren" #: ../gtk/data/ConfigDialog.ui.h:18 ../qt/data/ConfigDialog.ui.h:5 msgid "Output pane font:" msgstr "Lettertype van uitvoerpaneel:" #: ../gtk/data/ConfigDialog.ui.h:19 ../qt/data/ConfigDialog.ui.h:2 msgid "Default" msgstr "Standaard" #: ../gtk/data/ConfigDialog.ui.h:20 ../qt/data/ConfigDialog.ui.h:6 msgid "Language data locations:" msgstr "Taalgegevens-locaties:" #: ../gtk/data/ConfigDialog.ui.h:21 ../qt/data/ConfigDialog.ui.h:13 msgid "Language definitions path:" msgstr "Taaldefinities-pad:" #: ../gtk/data/ConfigDialog.ui.h:22 ../qt/data/ConfigDialog.ui.h:28 msgid "Spelling dictionaries path:" msgstr "Spellingcontrole-woordenboekenpad:" #: ../gtk/data/ConfigDialog.ui.h:23 ../qt/data/ConfigDialog.ui.h:10 msgid "System-wide paths" msgstr "Systeembrede paden" #: ../gtk/data/ConfigDialog.ui.h:24 ../qt/data/ConfigDialog.ui.h:11 msgid "User paths" msgstr "Gebruikerspaden" #: ../gtk/data/ConfigDialog.ui.h:25 ../qt/data/ConfigDialog.ui.h:29 msgid "Automatically open exported documents with default application" msgstr "Geëxporteerde documenten automatisch openen met standaard applicatie" #: ../gtk/data/CrashHandler.ui.h:1 ../qt/src/CrashHandler.cc:38 msgid "Regenerate backtrace" msgstr "Backtrace hergenereren" #: ../gtk/data/CrashHandler.ui.h:3 #, fuzzy, no-c-format msgid "" "The application has crashed\n" "\n" "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 "" "Excuses voor het ongemak. Als u wilt helpen om de applicatie te verbeteren, " "overweeg dan om het probleem te melden aan manisandro@gmail.com. Omschrijf wat u " "aan het doen was voordat de applicatie crashte. Vermeld tevens de " "onderstaande informatie. Bedankt." #: ../gtk/data/CrashHandler.ui.h:6 msgid "" "Tesseract has aborted\n" "\n" "Tesseract (the OCR engine) has aborted while recognizing text. This may " "occur if the used traineddatas are corrupt or incomplatible with the version " "of tesseract in use, or due to a bug in tesseract.\n" "\n" "The stacktrace below may provide additional information about where the " "crash occured.\n" msgstr "" #: ../gtk/data/MainWindow.ui.h:1 ../qt/data/MainWindow.ui.h:39 msgid "Toggle output pane" msgstr "Uitvoerpaneel weergeven/verbergen" #: ../gtk/data/MainWindow.ui.h:2 ../qt/src/Ui_MainWindow.hh:66 msgid "Rotate current page" msgstr "Huidige pagina draaien" #: ../gtk/data/MainWindow.ui.h:3 ../qt/src/Ui_MainWindow.hh:67 msgid "Rotate all pages" msgstr "Alle pagina's draaien" #. Sources toolbar #: ../gtk/data/MainWindow.ui.h:4 ../qt/src/Ui_MainWindow.hh:192 msgid "Recent" msgstr "Recent" #: ../gtk/data/MainWindow.ui.h:5 ../qt/src/Ui_MainWindow.hh:193 msgid "Paste" msgstr "Plakken" #: ../gtk/data/MainWindow.ui.h:6 ../qt/src/Ui_MainWindow.hh:194 msgid "Take Screenshot" msgstr "Schermafbeelding maken" #: ../gtk/data/MainWindow.ui.h:7 ../qt/data/MainWindow.ui.h:23 msgid "Zoom in" msgstr "Inzoomen" #: ../gtk/data/MainWindow.ui.h:8 ../qt/data/MainWindow.ui.h:25 msgid "Zoom out" msgstr "Uitzoomen" #: ../gtk/data/MainWindow.ui.h:9 ../qt/data/MainWindow.ui.h:27 msgid "Normal size" msgstr "Normale grootte" #: ../gtk/data/MainWindow.ui.h:10 ../qt/data/MainWindow.ui.h:29 msgid "Best fit" msgstr "Passend" #: ../gtk/data/MainWindow.ui.h:11 ../qt/src/Ui_MainWindow.hh:75 msgid "Select rotation mode" msgstr "Draaimodus selecteren" #: ../gtk/data/MainWindow.ui.h:12 ../gtk/data/OutputEditorText.ui.h:13 #: ../qt/src/Ui_OutputEditorText.hh:95 msgid "Select insert mode" msgstr "Invoegmodus selecteren" #: ../gtk/data/MainWindow.ui.h:13 ../qt/src/Ui_MainWindow.hh:109 #, fuzzy msgid "Select page" msgstr "Taal selecteren" #: ../gtk/data/MainWindow.ui.h:14 ../qt/data/MainWindow.ui.h:35 msgid "Image controls" msgstr "Afbeeldingsregelaars" #: ../gtk/data/MainWindow.ui.h:15 ../qt/src/Ui_MainWindow.hh:139 msgid "Plain text" msgstr "Platte tekst" #: ../gtk/data/MainWindow.ui.h:16 ../qt/src/Ui_MainWindow.hh:139 msgid "hOCR, PDF" msgstr "hOCR, PDF" #: ../gtk/data/MainWindow.ui.h:17 ../qt/data/MainWindow.ui.h:37 msgid "Autodetect layout" msgstr "Indeling automatisch detecteren" #: ../gtk/data/MainWindow.ui.h:18 msgid "Recognize all" msgstr "Alles herkennen" #: ../gtk/data/MainWindow.ui.h:19 msgid "Select language" msgstr "Taal selecteren" #: ../gtk/data/MainWindow.ui.h:20 ../qt/src/Ui_MainWindow.hh:205 msgid "Add images" msgstr "Afbeeldingen toevoegen" #: ../gtk/data/MainWindow.ui.h:21 ../qt/src/Ui_MainWindow.hh:204 msgid "Add Images" msgstr "Afbeeldingen toevoegen" #: ../gtk/data/MainWindow.ui.h:22 ../qt/src/Ui_MainWindow.hh:210 msgid "Remove image from list" msgstr "Afbeelding verwijderen uit lijst" #: ../gtk/data/MainWindow.ui.h:23 ../qt/src/Ui_MainWindow.hh:213 msgid "Delete image" msgstr "Afbeelding verwijderen" #: ../gtk/data/MainWindow.ui.h:24 ../qt/src/Ui_MainWindow.hh:216 msgid "Clear list" msgstr "Lijst wissen" #: ../gtk/data/MainWindow.ui.h:25 ../qt/data/MainWindow.ui.h:5 msgid "Files" msgstr "Bestanden" #: ../gtk/data/MainWindow.ui.h:26 ../qt/data/MainWindow.ui.h:8 msgid "Device:" msgstr "Apparaat:" #: ../gtk/data/MainWindow.ui.h:27 ../gtk/data/TessdataManager.ui.h:4 #: ../qt/data/MainWindow.ui.h:7 ../qt/src/TessdataManager.cc:59 msgid "Refresh" msgstr "Verversen" #: ../gtk/data/MainWindow.ui.h:28 ../qt/data/MainWindow.ui.h:9 msgid "Output:" msgstr "Uitvoer:" #: ../gtk/data/MainWindow.ui.h:29 ../qt/data/MainWindow.ui.h:13 msgid "Mode:" msgstr "Modus:" #: ../gtk/data/MainWindow.ui.h:30 ../gtk/src/hocr/HOCRPdfExporter.cc:313 #: ../qt/data/MainWindow.ui.h:15 ../qt/src/hocr/HOCRPdfExporter.cc:347 msgid "Color" msgstr "Kleur" #: ../gtk/data/MainWindow.ui.h:31 ../gtk/src/hocr/HOCRPdfExporter.cc:316 #: ../qt/data/MainWindow.ui.h:14 ../qt/src/hocr/HOCRPdfExporter.cc:349 #: ../qt/src/hocr/HOCRPdfExporter.cc:351 msgid "Grayscale" msgstr "Grijswaarden" #: ../gtk/data/MainWindow.ui.h:32 ../qt/data/MainWindow.ui.h:10 msgid "Resolution:" msgstr "Resolutie:" #: ../gtk/data/MainWindow.ui.h:33 ../qt/data/MainWindow.ui.h:11 msgid "Scan" msgstr "Scannen" #: ../gtk/data/MainWindow.ui.h:34 ../qt/data/MainWindow.ui.h:16 msgid "Source:" msgstr "Bron:" #: ../gtk/data/MainWindow.ui.h:35 ../qt/data/MainWindow.ui.h:6 msgid "Acquire" msgstr "Verkrijgen" #: ../gtk/data/MainWindow.ui.h:36 ../qt/data/MainWindow.ui.h:1 msgid "Brightness" msgstr "Helderheid" #: ../gtk/data/MainWindow.ui.h:37 ../qt/data/MainWindow.ui.h:2 msgid "Contrast" msgstr "Contrast" #: ../gtk/data/MainWindow.ui.h:38 ../qt/data/MainWindow.ui.h:3 msgid "Resolution" msgstr "Resolutie" #: ../gtk/data/MainWindow.ui.h:39 ../qt/data/MainWindow.ui.h:4 msgid "Invert colors" msgstr "Kleuren omdraaien" #: ../gtk/data/MainWindow.ui.h:40 msgid "A graphical frontend to tesseract-ocr" msgstr "Een grafisch front-end voor tesseract-ocr" #: ../gtk/data/MainWindow.ui.h:41 ../qt/data/CharacterListDialog.ui.h:1 msgid "Character whitelist / blacklist" msgstr "" #: ../gtk/data/MainWindow.ui.h:42 ../qt/data/CharacterListDialog.ui.h:2 msgid "Exclude these characters from being recognized (blacklist):" msgstr "" #: ../gtk/data/MainWindow.ui.h:43 ../qt/data/CharacterListDialog.ui.h:3 #, fuzzy msgid "Enter a string of characters..." msgstr "Bezig met verkrijgen van parameters..." #: ../gtk/data/MainWindow.ui.h:44 ../qt/data/CharacterListDialog.ui.h:4 msgid "Only allow the following characters to be recognized (whitelist):" msgstr "" #: ../gtk/data/MainWindow.ui.h:45 ../qt/data/PageRangeDialog.ui.h:1 msgid "Page Range" msgstr "Paginabereik" #: ../gtk/data/MainWindow.ui.h:48 ../qt/data/PageRangeDialog.ui.h:2 msgid "Page range:" msgstr "Paginabereik:" #: ../gtk/data/MainWindow.ui.h:49 ../qt/data/PageRangeDialog.ui.h:3 msgid "Example: 1-10, 13, 14-18" msgstr "Bijvoorbeeld: 1-10, 13, 14-18" #: ../gtk/data/MainWindow.ui.h:50 ../qt/data/PageRangeDialog.ui.h:4 msgid "Recognition area:" msgstr "Herkenningsgebied:" #: ../gtk/data/MainWindow.ui.h:51 ../gtk/src/Recognizer.cc:375 #: ../qt/data/PageRangeDialog.ui.h:5 ../qt/src/Recognizer.cc:369 msgid "Entire page" msgstr "Gehele pagina" #: ../gtk/data/MainWindow.ui.h:52 ../qt/data/PageRangeDialog.ui.h:6 msgid "Autodetect" msgstr "Automatisch detecteren" #: ../gtk/data/MainWindow.ui.h:53 ../qt/data/PageRangeDialog.ui.h:7 msgid "Prepend to output text:" msgstr "Vastmaken aan uitvoertekst:" #: ../gtk/data/MainWindow.ui.h:54 ../qt/data/PageRangeDialog.ui.h:8 msgid "Source filename" msgstr "Bestandsnaam van bron" #: ../gtk/data/MainWindow.ui.h:55 ../qt/data/PageRangeDialog.ui.h:9 msgid "Source page" msgstr "Bronpagina" #: ../gtk/data/MainWindow.ui.h:56 ../qt/src/SourceManager.cc:146 msgid "Protected PDF" msgstr "Beveiligd PDF-bestand" #: ../gtk/data/MainWindow.ui.h:57 ../qt/src/Recognizer.cc:76 msgid "Current Page" msgstr "Huidige pagina" #: ../gtk/data/MainWindow.ui.h:58 ../qt/src/Recognizer.cc:79 msgid "Multiple Pages..." msgstr "Meerdere pagina's..." #: ../gtk/data/OutputEditorHOCR.ui.h:1 ../qt/src/hocr/OutputEditorHOCR.cc:580 msgid "Add Word" msgstr "Woord toevoegen" #: ../gtk/data/OutputEditorHOCR.ui.h:4 ../qt/src/hocr/OutputEditorHOCR.cc:580 msgid "Enter word:" msgstr "Voer een woord in:" #: ../gtk/data/OutputEditorHOCR.ui.h:5 ../qt/src/hocr/Ui_OutputEditorHOCR.hh:61 #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:62 msgid "Export to plain text" msgstr "Exporteren naar platte tekst" #: ../gtk/data/OutputEditorHOCR.ui.h:6 ../qt/src/hocr/Ui_OutputEditorHOCR.hh:64 #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:65 msgid "Export to PDF" msgstr "Exporteren naar PDF" #: ../gtk/data/OutputEditorHOCR.ui.h:7 ../qt/src/hocr/Ui_OutputEditorHOCR.hh:67 #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:68 msgid "Export to ODT" msgstr "Exporteren naar ODT" #: ../gtk/data/OutputEditorHOCR.ui.h:8 ../gtk/data/OutputEditorText.ui.h:18 #: ../qt/src/Ui_OutputEditorText.hh:116 msgid "Save output" msgstr "Uitvoer opslaan" #: ../gtk/data/OutputEditorHOCR.ui.h:9 ../qt/src/hocr/Ui_OutputEditorHOCR.hh:72 #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:73 msgid "Export" msgstr "Exporteren" #: ../gtk/data/OutputEditorHOCR.ui.h:10 ../gtk/data/OutputEditorText.ui.h:19 #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:77 #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:78 #: ../qt/src/Ui_OutputEditorText.hh:118 msgid "Clear output" msgstr "Uitvoer wissen" #: ../gtk/data/OutputEditorHOCR.ui.h:11 ../gtk/data/OutputEditorText.ui.h:15 #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:80 #: ../qt/src/Ui_OutputEditorText.hh:107 msgid "Find and replace" msgstr "Zoeken en vervangen" #: ../gtk/data/OutputEditorHOCR.ui.h:12 #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:82 #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:83 msgid "Show confidence values" msgstr "Vertrouwenswaarden weergeven" #: ../gtk/data/OutputEditorHOCR.ui.h:13 ../gtk/data/PdfExportDialog.ui.h:41 #: ../qt/data/PdfExportDialog.ui.h:2 ../qt/src/hocr/Ui_OutputEditorHOCR.hh:85 #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:86 msgid "Show preview" msgstr "Voorbeeld weergeven" #: ../gtk/data/OutputEditorHOCR.ui.h:14 #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:121 msgid "Next (F3)" msgstr "Volgende (F3)" #: ../gtk/data/OutputEditorHOCR.ui.h:15 #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:122 msgid "Previous (Shift+F3)" msgstr "Vorige (Shift+F3)" #: ../gtk/data/OutputEditorHOCR.ui.h:16 ../gtk/src/hocr/OutputEditorHOCR.cc:890 #: ../qt/src/hocr/OutputEditorHOCR.cc:730 #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:126 msgid "Expand all" msgstr "Alles uitklappen" #: ../gtk/data/OutputEditorHOCR.ui.h:17 ../gtk/src/hocr/OutputEditorHOCR.cc:893 #: ../qt/src/hocr/OutputEditorHOCR.cc:731 #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:127 msgid "Collapse all" msgstr "Alles inklappen" #: ../gtk/data/OutputEditorHOCR.ui.h:18 #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:148 msgid "Properties" msgstr "Eigenschappen" #: ../gtk/data/OutputEditorHOCR.ui.h:19 #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:152 msgid "Source" msgstr "Bron" #. Output insert mode #: ../gtk/data/OutputEditorText.ui.h:1 ../qt/src/Ui_OutputEditorText.hh:52 msgid "Append to current text" msgstr "Toepassen op huidige tekst" #: ../gtk/data/OutputEditorText.ui.h:2 ../qt/src/Ui_OutputEditorText.hh:53 msgid "Insert at cursor" msgstr "Invoegen op cursorlocatie" #: ../gtk/data/OutputEditorText.ui.h:3 ../qt/src/Ui_OutputEditorText.hh:54 msgid "Replace current text" msgstr "Huidige tekst vervangen" #. Output postprocessing #: ../gtk/data/OutputEditorText.ui.h:4 ../qt/src/Ui_OutputEditorText.hh:62 msgid "Keep line break if..." msgstr "Regelafbreking behouden als..." #: ../gtk/data/OutputEditorText.ui.h:5 ../qt/src/Ui_OutputEditorText.hh:64 msgid "Preceded by end mark (.?!)" msgstr "deze voorafgaat aan een leesteken (.?!)" #: ../gtk/data/OutputEditorText.ui.h:6 ../qt/src/Ui_OutputEditorText.hh:66 msgid "Preceded or succeeded by quote" msgstr "deze voorafgaat aan of gevolgd wordt door een dubbel aanhalingsteken" #: ../gtk/data/OutputEditorText.ui.h:7 ../qt/src/Ui_OutputEditorText.hh:68 msgid "Other options" msgstr "Andere opties" #: ../gtk/data/OutputEditorText.ui.h:8 ../qt/src/Ui_OutputEditorText.hh:70 msgid "Join hyphenated words" msgstr "Afgebroken woorden samenvoegen" #: ../gtk/data/OutputEditorText.ui.h:9 ../qt/src/Ui_OutputEditorText.hh:72 msgid "Collapse whitespace" msgstr "Witruimte inklappen" #: ../gtk/data/OutputEditorText.ui.h:10 ../qt/src/Ui_OutputEditorText.hh:74 msgid "Preserve paragraphs" msgstr "Paragrafen behouden" #: ../gtk/data/OutputEditorText.ui.h:11 ../qt/src/Ui_OutputEditorText.hh:76 msgid "Visual aids" msgstr "Visuele hulpmiddelen" #: ../gtk/data/OutputEditorText.ui.h:12 ../qt/src/Ui_OutputEditorText.hh:78 msgid "Draw whitespace" msgstr "Witruimte intekenen" #: ../gtk/data/OutputEditorText.ui.h:14 ../qt/src/Ui_OutputEditorText.hh:102 msgid "Strip line breaks on selected text" msgstr "Regelafbrekingen verwijderen uit geselecteerde tekst" #: ../gtk/data/OutputEditorText.ui.h:16 ../qt/src/Ui_OutputEditorText.hh:109 #: ../qt/src/Ui_OutputEditorText.hh:110 msgid "Undo" msgstr "Ongedaan maken" #: ../gtk/data/OutputEditorText.ui.h:17 ../qt/src/Ui_OutputEditorText.hh:112 #: ../qt/src/Ui_OutputEditorText.hh:113 msgid "Redo" msgstr "Opnieuw" #: ../gtk/data/PdfExportDialog.ui.h:1 ../qt/data/PdfExportDialog.ui.h:1 msgid "PDF Export" msgstr "PDF-exportering" #: ../gtk/data/PdfExportDialog.ui.h:4 ../qt/data/PdfExportDialog.ui.h:4 msgid "Output mode:" msgstr "Uitvoermodus:" #: ../gtk/data/PdfExportDialog.ui.h:5 ../qt/data/PdfExportDialog.ui.h:6 msgid "PDF" msgstr "PDF" #: ../gtk/data/PdfExportDialog.ui.h:6 ../qt/data/PdfExportDialog.ui.h:7 msgid "PDF with invisible text overlay" msgstr "PDF met onzichtbare tekstlaag" #: ../gtk/data/PdfExportDialog.ui.h:7 ../qt/data/PdfExportDialog.ui.h:16 msgid "Format:" msgstr "Formaat:" #: ../gtk/data/PdfExportDialog.ui.h:8 ../qt/data/PdfExportDialog.ui.h:17 msgid "Compression:" msgstr "Compressie:" #: ../gtk/data/PdfExportDialog.ui.h:9 ../qt/data/PdfExportDialog.ui.h:14 msgid "Compression quality:" msgstr "Compressiekwaliteit:" #: ../gtk/data/PdfExportDialog.ui.h:10 ../qt/data/PdfExportDialog.ui.h:15 msgid "DPI:" msgstr "DPI:" #: ../gtk/data/PdfExportDialog.ui.h:11 ../qt/data/PdfExportDialog.ui.h:18 msgid "Dithering algorithm:" msgstr "Rasteralgoritme:" #: ../gtk/data/PdfExportDialog.ui.h:12 ../qt/data/PdfExportDialog.ui.h:13 msgid "Image settings:" msgstr "Afbeeldingsinstellingen:" #: ../gtk/data/PdfExportDialog.ui.h:13 ../qt/data/PdfExportDialog.ui.h:25 msgid "Uniformize line and word spacing" msgstr "Regel- en woordtussenruimte consistent maken" #: ../gtk/data/PdfExportDialog.ui.h:14 ../qt/data/PdfExportDialog.ui.h:21 msgid "Override font family:" msgstr "Lettertypefamilie overschrijven:" #: ../gtk/data/PdfExportDialog.ui.h:15 ../qt/data/PdfExportDialog.ui.h:27 msgid "Fallback font family:" msgstr "Terugval-lettertypefamilie:" #: ../gtk/data/PdfExportDialog.ui.h:16 ../qt/data/PdfExportDialog.ui.h:20 msgid "Override font size:" msgstr "Lettertype grootte overschrijven:" #: ../gtk/data/PdfExportDialog.ui.h:17 ../qt/data/PdfExportDialog.ui.h:23 msgid "Font scaling:" msgstr "Lettertypeschaal:" #: ../gtk/data/PdfExportDialog.ui.h:18 ../qt/data/PdfExportDialog.ui.h:26 msgid "pt" msgstr "pt" #: ../gtk/data/PdfExportDialog.ui.h:19 ../qt/data/PdfExportDialog.ui.h:22 msgid "Preserve spaces wider than:" msgstr "Spaties behouden die breder zijn dan:" #: ../gtk/data/PdfExportDialog.ui.h:20 ../qt/data/PdfExportDialog.ui.h:24 msgid "characters" msgstr "tekens" #: ../gtk/data/PdfExportDialog.ui.h:21 ../qt/data/PdfExportDialog.ui.h:28 msgid "Sanitize hyphens before line breaks" msgstr "" #: ../gtk/data/PdfExportDialog.ui.h:22 ../qt/data/PdfExportDialog.ui.h:19 msgid "Text settings:" msgstr "Tekstinstellingen:" #: ../gtk/data/PdfExportDialog.ui.h:23 ../qt/data/PdfExportDialog.ui.h:10 msgid "Paper size:" msgstr "Papiergrootte:" #: ../gtk/data/PdfExportDialog.ui.h:24 ../qt/data/PdfExportDialog.ui.h:11 msgid "Width" msgstr "Breedte" #: ../gtk/data/PdfExportDialog.ui.h:25 ../qt/data/PdfExportDialog.ui.h:12 msgid "Height" msgstr "Hoogte" #: ../gtk/data/PdfExportDialog.ui.h:26 ../qt/data/PdfExportDialog.ui.h:29 msgid "Treat image sources as having true DPI:" msgstr "" #: ../gtk/data/PdfExportDialog.ui.h:27 ../qt/data/PdfExportDialog.ui.h:3 msgid "Basic" msgstr "Basis" #: ../gtk/data/PdfExportDialog.ui.h:28 ../qt/data/PdfExportDialog.ui.h:31 msgid "PDF version:" msgstr "PDF-versie:" #: ../gtk/data/PdfExportDialog.ui.h:29 ../qt/data/PdfExportDialog.ui.h:33 msgid "Password:" msgstr "Wachtwoord:" #: ../gtk/data/PdfExportDialog.ui.h:30 ../qt/data/PdfExportDialog.ui.h:34 msgid "Confirm password:" msgstr "Wachtwoord bevestigen:" #: ../gtk/data/PdfExportDialog.ui.h:31 ../qt/data/PdfExportDialog.ui.h:32 msgid "Encryption (optional):" msgstr "Versleuteling (optioneel):" #: ../gtk/data/PdfExportDialog.ui.h:32 ../qt/data/PdfExportDialog.ui.h:36 msgid "Author:" msgstr "Auteur:" #: ../gtk/data/PdfExportDialog.ui.h:33 ../qt/data/PdfExportDialog.ui.h:38 msgid "Title:" msgstr "Titel:" #: ../gtk/data/PdfExportDialog.ui.h:34 ../qt/data/PdfExportDialog.ui.h:40 msgid "Subject:" msgstr "Onderwerp:" #: ../gtk/data/PdfExportDialog.ui.h:35 ../qt/data/PdfExportDialog.ui.h:37 msgid "Creator:" msgstr "Maker:" #: ../gtk/data/PdfExportDialog.ui.h:36 ../qt/data/PdfExportDialog.ui.h:39 msgid "Producer:" msgstr "Producent:" #: ../gtk/data/PdfExportDialog.ui.h:37 ../qt/data/PdfExportDialog.ui.h:41 msgid "Keywords:" msgstr "Sleutelwoorden:" #: ../gtk/data/PdfExportDialog.ui.h:38 ../qt/data/PdfExportDialog.ui.h:35 msgid "Additional information (optional):" msgstr "Extra informatie (optioneel):" #: ../gtk/data/PdfExportDialog.ui.h:39 ../qt/data/PdfExportDialog.ui.h:42 msgid "Import from current source" msgstr "Importeren uit huidige bron" #: ../gtk/data/PdfExportDialog.ui.h:40 ../qt/data/PdfExportDialog.ui.h:30 msgid "Advanced" msgstr "Geavanceerd" #: ../gtk/data/SearchReplaceFrame.ui.h:1 ../qt/data/SearchReplaceFrame.ui.h:4 msgid "Find" msgstr "Zoeken" #: ../gtk/data/SearchReplaceFrame.ui.h:2 ../qt/data/SearchReplaceFrame.ui.h:2 msgid "Replace" msgstr "Vervangen" #: ../gtk/data/SearchReplaceFrame.ui.h:3 ../qt/data/SearchReplaceFrame.ui.h:3 msgid "Replace all" msgstr "Alles vervangen" #: ../gtk/data/SearchReplaceFrame.ui.h:4 ../qt/data/SearchReplaceFrame.ui.h:5 msgid "Find previous" msgstr "Vorige zoeken" #: ../gtk/data/SearchReplaceFrame.ui.h:5 ../qt/data/SearchReplaceFrame.ui.h:6 msgid "Find next" msgstr "Volgende zoeken" #: ../gtk/data/SearchReplaceFrame.ui.h:6 ../qt/data/SearchReplaceFrame.ui.h:7 msgid "Match case" msgstr "Hoofdlettergevoelig" #: ../gtk/data/SearchReplaceFrame.ui.h:7 #: ../gtk/data/SubstitutionsManager.ui.h:1 ../qt/data/SearchReplaceFrame.ui.h:1 #: ../qt/src/SubstitutionsManager.cc:36 msgid "Substitutions" msgstr "Vervangingen" #: ../gtk/data/SelectionMenu.ui.h:1 ../qt/src/DisplayerToolSelect.cc:239 msgid "Delete" msgstr "Verwijderen" #: ../gtk/data/SelectionMenu.ui.h:2 ../qt/src/DisplayerToolSelect.cc:225 msgid "Order:" msgstr "Volgorde:" #: ../gtk/data/SelectionMenu.ui.h:3 ../gtk/src/hocr/DisplayerToolHOCR.cc:29 #: ../qt/src/DisplayerToolSelect.cc:240 ../qt/src/hocr/DisplayerToolHOCR.cc:31 msgid "Recognize" msgstr "Herkennen" #: ../gtk/data/SelectionMenu.ui.h:4 ../qt/src/DisplayerToolSelect.cc:241 msgid "Recognize to clipboard" msgstr "Herkennen naar klembord" #: ../gtk/data/SelectionMenu.ui.h:5 ../qt/src/DisplayerToolSelect.cc:242 msgid "Save as image" msgstr "Opslaan als afbeelding" #: ../gtk/data/SubstitutionsManager.ui.h:2 ../qt/src/SubstitutionsManager.cc:38 #: ../qt/src/SubstitutionsManager.cc:39 msgid "Open" msgstr "Openen" #: ../gtk/data/SubstitutionsManager.ui.h:3 ../gtk/src/Utils.cc:73 #: ../qt/src/SubstitutionsManager.cc:41 ../qt/src/SubstitutionsManager.cc:42 msgid "Save" msgstr "Opslaan" #: ../gtk/data/SubstitutionsManager.ui.h:4 ../qt/src/SubstitutionsManager.cc:44 #: ../qt/src/SubstitutionsManager.cc:45 msgid "Clear" msgstr "Wissen" #: ../gtk/data/SubstitutionsManager.ui.h:5 ../qt/data/ConfigDialog.ui.h:16 #: ../qt/src/SubstitutionsManager.cc:47 ../qt/src/SubstitutionsManager.cc:48 msgid "Add" msgstr "Toevoegen" #: ../gtk/data/SubstitutionsManager.ui.h:6 #: ../gtk/src/hocr/OutputEditorHOCR.cc:886 ../qt/data/ConfigDialog.ui.h:17 #: ../qt/src/hocr/OutputEditorHOCR.cc:727 ../qt/src/SubstitutionsManager.cc:50 #: ../qt/src/SubstitutionsManager.cc:51 msgid "Remove" msgstr "Verwijderen" #: ../gtk/data/SubstitutionsManager.ui.h:7 ../gtk/data/TessdataManager.ui.h:2 msgid "Apply" msgstr "Toepassen" #: ../gtk/data/SubstitutionsManager.ui.h:8 ../gtk/data/TessdataManager.ui.h:3 msgid "Close" msgstr "Sluiten" #: ../gtk/data/TessdataManager.ui.h:1 ../qt/src/TessdataManager.cc:49 msgid "Tessdata Manager" msgstr "Tessdata-beheerder" #: ../gtk/data/TessdataManager.ui.h:5 ../qt/src/TessdataManager.cc:51 msgid "Manage installed languages:" msgstr "Geïnstalleerde talen beheren:" #: ../gtk/src/Acquirer.cc:79 ../qt/src/Acquirer.cc:70 msgid "scan.png" msgstr "scan.png" #: ../gtk/src/Acquirer.cc:91 ../qt/src/Acquirer.cc:85 msgid "Images" msgstr "Afbeeldingen" #: ../gtk/src/Acquirer.cc:92 ../qt/src/Acquirer.cc:86 msgid "Choose Output Filename..." msgstr "Kies uitvoerbestandsnaam..." #: ../gtk/src/Acquirer.cc:106 ../qt/src/Acquirer.cc:100 msgid "Failed to initialize the scanning backend." msgstr "Het initialiseren van het scan-back-end is mislukt." #: ../gtk/src/Acquirer.cc:115 ../qt/src/Acquirer.cc:106 msgid "Scan failed" msgstr "Scannen mislukt" #: ../gtk/src/Acquirer.cc:133 ../qt/src/Acquirer.cc:122 msgid "No scanners were detected." msgstr "Er zijn geen scanners gevonden." #: ../gtk/src/Acquirer.cc:150 ../gtk/src/Acquirer.cc:168 #: ../qt/src/Acquirer.cc:136 ../qt/src/Acquirer.cc:154 msgid "Starting scan..." msgstr "Bezig met starten van scan..." #: ../gtk/src/Acquirer.cc:164 ../qt/src/Acquirer.cc:150 msgid "Opening device..." msgstr "Bezig met openen van apparaat..." #: ../gtk/src/Acquirer.cc:166 ../qt/src/Acquirer.cc:152 msgid "Setting options..." msgstr "Bezig met instellen van opties..." #: ../gtk/src/Acquirer.cc:170 ../qt/src/Acquirer.cc:156 msgid "Getting parameters..." msgstr "Bezig met verkrijgen van parameters..." #: ../gtk/src/Acquirer.cc:172 ../qt/src/Acquirer.cc:158 msgid "Transferring data..." msgstr "Bezig met overdragen van gegevens..." #: ../gtk/src/Acquirer.cc:179 ../qt/src/Acquirer.cc:165 msgid "Canceling scan..." msgstr "Bezig met afbreken van scan..." #: ../gtk/src/Config.cc:49 ../qt/data/ConfigDialog.ui.h:7 msgid "Filename prefix" msgstr "Bestandsextensie" #: ../gtk/src/Config.cc:50 ../qt/data/ConfigDialog.ui.h:8 msgid "Code" msgstr "Code" #: ../gtk/src/Config.cc:51 ../qt/data/ConfigDialog.ui.h:9 msgid "Native name" msgstr "Naam" #: ../gtk/src/Config.cc:109 ../qt/src/Config.cc:108 msgid "Script" msgstr "Script" #: ../gtk/src/CrashHandler.cc:25 ../gtk/src/CrashHandler.cc:41 #: ../qt/src/CrashHandler.cc:36 msgid "Crash Handler" msgstr "Crash-afhandeling" #: ../gtk/src/CrashHandler.cc:43 ../qt/src/CrashHandler.cc:31 msgid "Your work has been saved under %1." msgstr "Uw werk is opgeslagen als %1." #: ../gtk/src/CrashHandler.cc:45 ../qt/src/CrashHandler.cc:33 msgid "There was no unsaved work." msgstr "Er is geen niet-opgeslagen werk." #: ../gtk/src/CrashHandler.cc:106 ../qt/src/CrashHandler.cc:62 msgid "Failed to obtain backtrace. Is gdb installed?" msgstr "Het verkrijgen van een backtrace is mislukt. Is gdb geïnstalleerd?" #: ../gtk/src/Displayer.cc:232 ../qt/src/Displayer.cc:174 msgid "Failed to load image" msgstr "Afbeelding laden mislukt" #: ../gtk/src/Displayer.cc:232 ../qt/src/Displayer.cc:174 msgid "" "The file might not be an image or be corrupt:\n" "%1" msgstr "" "Het bestand is geen afbeelding of het is corrupt:\n" "%1" #: ../gtk/src/DisplayerToolSelect.cc:138 ../qt/src/DisplayerToolSelect.cc:135 msgid "PNG Images" msgstr "PNG-afbeeldingen" #: ../gtk/src/DisplayerToolSelect.cc:139 ../qt/src/DisplayerToolSelect.cc:135 msgid "Save Selection Image" msgstr "Geselecteerde afbeelding opslaan" #: ../gtk/src/DisplayerToolSelect.cc:139 ../qt/src/DisplayerToolSelect.cc:135 msgid "selection.png" msgstr "selectie.png" #: ../gtk/src/DisplayerToolSelect.cc:146 ../qt/src/DisplayerToolSelect.cc:142 msgid "Recognize all" msgstr "Alles herkennen" #: ../gtk/src/DisplayerToolSelect.cc:146 ../qt/src/DisplayerToolSelect.cc:142 msgid "Recognize selection" msgstr "Selectie herkennen" #: ../gtk/src/DisplayerToolSelect.cc:186 ../qt/src/DisplayerToolSelect.cc:182 msgid "Performing layout analysis" msgstr "Bezig met uitvoeren van indelingsanalyse" #: ../gtk/src/FileDialogs.cc:235 msgid "" "A file named \"%1\" already exists. Are you sure you want to overwrite it?" msgstr "" "Er bestaat al een bestand met de naam \"%1\". Weet u zeker dat u het wilt " "overschrijven?" #: ../gtk/src/FileDialogs.cc:237 msgid "Overwrite File?" msgstr "Bestand overschrijven?" #: ../gtk/src/hocr/HOCRDocument.cc:611 ../gtk/src/hocr/OutputEditorHOCR.cc:266 #: ../qt/src/hocr/OutputEditorHOCR.cc:229 msgid "Page" msgstr "Pagina" #: ../gtk/src/hocr/HOCRDocument.cc:613 ../qt/src/hocr/HOCRDocument.cc:530 msgid "Text block" msgstr "Tekstblok" #: ../gtk/src/hocr/HOCRDocument.cc:615 ../gtk/src/hocr/OutputEditorHOCR.cc:272 #: ../qt/src/hocr/HOCRDocument.cc:532 ../qt/src/hocr/OutputEditorHOCR.cc:231 msgid "Paragraph" msgstr "Paragraaf" #: ../gtk/src/hocr/HOCRDocument.cc:617 ../qt/src/hocr/HOCRDocument.cc:534 msgid "Textline" msgstr "Tekstregel" #: ../gtk/src/hocr/HOCRDocument.cc:621 ../qt/src/hocr/HOCRDocument.cc:538 msgid "Graphic" msgstr "Grafisch" #: ../gtk/src/hocr/HOCROdtExporter.cc:65 ../gtk/src/hocr/HOCRPdfExporter.cc:489 #: ../gtk/src/hocr/HOCRTextExporter.cc:34 #: ../gtk/src/hocr/OutputEditorHOCR.cc:963 ../gtk/src/OutputEditorText.cc:272 #: ../qt/src/hocr/HOCROdtExporter.cc:50 ../qt/src/hocr/HOCRPdfExporter.cc:478 #: ../qt/src/hocr/HOCRTextExporter.cc:36 ../qt/src/hocr/OutputEditorHOCR.cc:830 #: ../qt/src/OutputEditorText.cc:238 msgid "output" msgstr "uitvoer" #: ../gtk/src/hocr/HOCROdtExporter.cc:68 ../qt/src/hocr/HOCROdtExporter.cc:53 msgid "OpenDocument Text Documents" msgstr "OpenDocument-tekstdocumenten" #: ../gtk/src/hocr/HOCROdtExporter.cc:69 ../qt/src/hocr/HOCROdtExporter.cc:53 msgid "Save ODT Output..." msgstr "ODT-uitvoer opslaan..." #: ../gtk/src/hocr/HOCROdtExporter.cc:77 ../gtk/src/hocr/HOCROdtExporter.cc:342 #: ../gtk/src/hocr/HOCRPdfExporter.cc:619 #: ../gtk/src/hocr/HOCRTextExporter.cc:46 ../qt/src/hocr/HOCROdtExporter.cc:61 #: ../qt/src/hocr/HOCRPdfExporter.cc:609 ../qt/src/hocr/HOCRTextExporter.cc:47 msgid "Export failed" msgstr "Exporteren is mislukt" #: ../gtk/src/hocr/HOCROdtExporter.cc:77 ../gtk/src/hocr/HOCROdtExporter.cc:342 #: ../qt/src/hocr/HOCROdtExporter.cc:61 msgid "The ODT export failed: unable to write output file." msgstr "" "De ODT-exportering is mislukt: het is niet mogelijk om te schrijven naar het " "uitvoerbestand." #: ../gtk/src/hocr/HOCROdtExporter.cc:336 ../qt/src/hocr/HOCROdtExporter.cc:254 msgid "Exporting to ODT..." msgstr "Bezig met exporteren naar ODT..." #: ../gtk/src/hocr/HOCRPdfExporter.cc:283 ../qt/src/hocr/HOCRPdfExporter.cc:365 msgid "Same as source" msgstr "Gelijk aan bron" #: ../gtk/src/hocr/HOCRPdfExporter.cc:286 ../qt/src/hocr/HOCRPdfExporter.cc:366 msgid "Custom" msgstr "Aangepast" #: ../gtk/src/hocr/HOCRPdfExporter.cc:300 ../qt/src/hocr/HOCRPdfExporter.cc:362 msgid "cm" msgstr "cm" #: ../gtk/src/hocr/HOCRPdfExporter.cc:303 ../qt/src/hocr/HOCRPdfExporter.cc:363 msgid "in" msgstr "in" #: ../gtk/src/hocr/HOCRPdfExporter.cc:319 ../qt/src/hocr/HOCRPdfExporter.cc:353 msgid "Monochrome" msgstr "Monochroom" #: ../gtk/src/hocr/HOCRPdfExporter.cc:328 ../qt/src/hocr/HOCRPdfExporter.cc:355 msgid "Threshold (closest color)" msgstr "Drempel (dichtstbijzijnde kleur)" #: ../gtk/src/hocr/HOCRPdfExporter.cc:331 ../qt/src/hocr/HOCRPdfExporter.cc:356 msgid "Diffuse" msgstr "Onscherp" #: ../gtk/src/hocr/HOCRPdfExporter.cc:340 ../qt/src/hocr/HOCRPdfExporter.cc:357 msgid "Zip (lossless)" msgstr "Zip (verliesvrij)" #: ../gtk/src/hocr/HOCRPdfExporter.cc:344 ../qt/src/hocr/HOCRPdfExporter.cc:358 msgid "CCITT Group 4 (lossless)" msgstr "CCITT Groep 4 (verliesvrij)" #: ../gtk/src/hocr/HOCRPdfExporter.cc:348 ../qt/src/hocr/HOCRPdfExporter.cc:359 msgid "Jpeg (lossy)" msgstr "Jpeg (verliesvrij)" #: ../gtk/src/hocr/HOCRPdfExporter.cc:493 ../qt/src/hocr/HOCRPdfExporter.cc:482 msgid "PDF Files" msgstr "PDF-bestanden" #: ../gtk/src/hocr/HOCRPdfExporter.cc:494 ../qt/src/hocr/HOCRPdfExporter.cc:482 msgid "Save PDF Output..." msgstr "PDF-uitvoer opslaan..." #: ../gtk/src/hocr/HOCRPdfExporter.cc:500 ../qt/src/hocr/HOCRPdfExporter.cc:488 msgid "Invalid Output" msgstr "Ongeldige uitvoer" #: ../gtk/src/hocr/HOCRPdfExporter.cc:500 ../qt/src/hocr/HOCRPdfExporter.cc:488 msgid "Cannot overwrite a file which is a source image of this document." msgstr "" "Kan geen bestand overschrijven dat een bronafbeelding is van dit document." #: ../gtk/src/hocr/HOCRPdfExporter.cc:516 ../qt/src/hocr/HOCRPdfExporter.cc:511 msgid "Failed to create output" msgstr "Creëren van uitvoer is mislukt" #: ../gtk/src/hocr/HOCRPdfExporter.cc:516 ../qt/src/hocr/HOCRPdfExporter.cc:511 msgid "Failed to create output. The returned error was: %1" msgstr "Het creëren van de uitvoer is mislukt. De foutmelding is: %1" #: ../gtk/src/hocr/HOCRPdfExporter.cc:558 ../qt/src/hocr/HOCRPdfExporter.cc:551 msgid "The operation was cancelled" msgstr "De handeling is afgebroken" #: ../gtk/src/hocr/HOCRPdfExporter.cc:607 ../qt/src/hocr/HOCRPdfExporter.cc:597 msgid "Failed to render page %1" msgstr "Renderen van pagina %1 is mislukt" #: ../gtk/src/hocr/HOCRPdfExporter.cc:614 ../qt/src/hocr/HOCRPdfExporter.cc:604 msgid "Exporting to PDF..." msgstr "Bezig met exporteren naar PDF..." #: ../gtk/src/hocr/HOCRPdfExporter.cc:619 ../qt/src/hocr/HOCRPdfExporter.cc:609 msgid "The PDF export failed: %1." msgstr "De PDF-export is mislukt: %1." #: ../gtk/src/hocr/HOCRPdfExporter.cc:673 ../qt/src/hocr/HOCRPdfExporter.cc:662 msgid "The PDF library could not load the font '%1'." msgstr "De PDF-bibliotheek kan het lettertype '%1' niet laden." #: ../gtk/src/hocr/HOCRTextExporter.cc:37 ../gtk/src/OutputEditorText.cc:274 #: ../qt/src/hocr/HOCRTextExporter.cc:39 ../qt/src/OutputEditorText.cc:239 msgid "Text Files" msgstr "Tekstbestanden" #: ../gtk/src/hocr/HOCRTextExporter.cc:38 ../qt/src/hocr/HOCRTextExporter.cc:39 msgid "Save Text Output..." msgstr "Tekstuitvoer opslaan..." #: ../gtk/src/hocr/HOCRTextExporter.cc:46 ../qt/src/hocr/HOCRTextExporter.cc:47 msgid "The text export failed: unable to write output file." msgstr "" "De tekstexport is mislukt: het is niet mogelijk om te schrijven naar het " "uitvoerbestand." #: ../gtk/src/hocr/OutputEditorHOCR.cc:269 #: ../qt/src/hocr/OutputEditorHOCR.cc:230 msgid "Block" msgstr "Blok" #: ../gtk/src/hocr/OutputEditorHOCR.cc:275 #: ../qt/src/hocr/OutputEditorHOCR.cc:232 msgid "Line" msgstr "Regel" #: ../gtk/src/hocr/OutputEditorHOCR.cc:278 #: ../qt/src/hocr/OutputEditorHOCR.cc:233 msgid "Word" msgstr "Woord" #: ../gtk/src/hocr/OutputEditorHOCR.cc:281 #: ../qt/src/hocr/OutputEditorHOCR.cc:234 msgid "Misspelled word" msgstr "Onjuist gespeld woord" #: ../gtk/src/hocr/OutputEditorHOCR.cc:435 #: ../qt/src/hocr/OutputEditorHOCR.cc:317 msgid "" "The following pages could not be processed:\n" "%1" msgstr "" "De volgende pagina's kunnen niet worden verwerkt:\n" "%1" #: ../gtk/src/hocr/OutputEditorHOCR.cc:436 #: ../qt/src/hocr/OutputEditorHOCR.cc:318 msgid "Recognition errors" msgstr "Herkenningsfouten" #: ../gtk/src/hocr/OutputEditorHOCR.cc:594 #: ../qt/src/hocr/OutputEditorHOCR.cc:500 #: ../qt/src/hocr/OutputEditorHOCR.cc:512 msgid "Multiple values" msgstr "Meerdere waarden" #. Merging allowed #: ../gtk/src/hocr/OutputEditorHOCR.cc:778 #: ../qt/src/hocr/OutputEditorHOCR.cc:641 msgid "Merge" msgstr "Samenvoegen" #: ../gtk/src/hocr/OutputEditorHOCR.cc:786 #: ../gtk/src/hocr/OutputEditorHOCR.cc:877 #: ../qt/src/hocr/OutputEditorHOCR.cc:643 #: ../qt/src/hocr/OutputEditorHOCR.cc:725 msgid "Split from parent" msgstr "Splitsen van hoofdgedeelte" #. Swapping allowed #: ../gtk/src/hocr/OutputEditorHOCR.cc:797 #: ../qt/src/hocr/OutputEditorHOCR.cc:647 msgid "Swap" msgstr "Omwisselen" #: ../gtk/src/hocr/OutputEditorHOCR.cc:821 #: ../qt/src/hocr/OutputEditorHOCR.cc:693 msgid "Add graphic region" msgstr "Grafische regio toevoegen" #: ../gtk/src/hocr/OutputEditorHOCR.cc:824 #: ../qt/src/hocr/OutputEditorHOCR.cc:694 msgid "Add text block" msgstr "Tekstblok toevoegen" #: ../gtk/src/hocr/OutputEditorHOCR.cc:828 #: ../qt/src/hocr/OutputEditorHOCR.cc:696 msgid "Add paragraph" msgstr "Paragraaf toevoegen" #: ../gtk/src/hocr/OutputEditorHOCR.cc:832 #: ../qt/src/hocr/OutputEditorHOCR.cc:698 msgid "Add line" msgstr "Regel toevoegen" #: ../gtk/src/hocr/OutputEditorHOCR.cc:836 #: ../qt/src/hocr/OutputEditorHOCR.cc:700 msgid "Add word" msgstr "Woord toevoegen" #: ../gtk/src/hocr/OutputEditorHOCR.cc:852 #: ../qt/src/hocr/OutputEditorHOCR.cc:710 msgid "No suggestions" msgstr "Geen suggesties" #: ../gtk/src/hocr/OutputEditorHOCR.cc:858 #: ../qt/src/hocr/OutputEditorHOCR.cc:714 msgid "Add to dictionary" msgstr "Toevoegen aan woordenboek" #: ../gtk/src/hocr/OutputEditorHOCR.cc:864 #: ../qt/src/hocr/OutputEditorHOCR.cc:716 msgid "Ignore word" msgstr "Woord negeren" #: ../gtk/src/hocr/OutputEditorHOCR.cc:926 #: ../gtk/src/hocr/OutputEditorHOCR.cc:965 #: ../qt/src/hocr/OutputEditorHOCR.cc:795 #: ../qt/src/hocr/OutputEditorHOCR.cc:832 msgid "hOCR HTML Files" msgstr "hOCR HTML-bestanden" #: ../gtk/src/hocr/OutputEditorHOCR.cc:927 #: ../qt/src/hocr/OutputEditorHOCR.cc:795 msgid "Open hOCR File" msgstr "hOCR-bestand openen" #: ../gtk/src/hocr/OutputEditorHOCR.cc:936 #: ../qt/src/hocr/OutputEditorHOCR.cc:802 msgid "Failed to open file" msgstr "Bestand openen is mislukt" #: ../gtk/src/hocr/OutputEditorHOCR.cc:936 #: ../qt/src/hocr/OutputEditorHOCR.cc:802 msgid "The file could not be opened: %1." msgstr "Het bestand kan niet worden geopend: %1." #: ../gtk/src/hocr/OutputEditorHOCR.cc:945 #: ../qt/src/hocr/OutputEditorHOCR.cc:809 msgid "Invalid hOCR file" msgstr "Ongeldig hOCR-bestand" #: ../gtk/src/hocr/OutputEditorHOCR.cc:945 #: ../qt/src/hocr/OutputEditorHOCR.cc:809 msgid "The file does not appear to contain valid hOCR HTML: %1" msgstr "Het bestand lijkt geen geldige hOCR HTML te bevatten: %1" #: ../gtk/src/hocr/OutputEditorHOCR.cc:966 #: ../qt/src/hocr/OutputEditorHOCR.cc:832 msgid "Save hOCR Output..." msgstr "hOCR-uitvoer opslaan..." #: ../gtk/src/hocr/OutputEditorHOCR.cc:973 ../gtk/src/OutputEditorText.cc:282 #: ../qt/src/hocr/OutputEditorHOCR.cc:839 ../qt/src/OutputEditorText.cc:246 msgid "Failed to save output" msgstr "Uitvoer opslaan is mislukt" #: ../gtk/src/hocr/OutputEditorHOCR.cc:973 ../gtk/src/OutputEditorText.cc:282 #: ../qt/src/hocr/OutputEditorHOCR.cc:839 ../qt/src/OutputEditorText.cc:246 msgid "Check that you have writing permissions in the selected folder." msgstr "Controleer of u schrijfrechten heeft in de geselecteerde map." #: ../gtk/src/hocr/OutputEditorHOCR.cc:1035 ../gtk/src/OutputEditorText.cc:296 #: ../qt/src/hocr/OutputEditorHOCR.cc:894 ../qt/src/OutputEditorText.cc:259 msgid "Output not saved" msgstr "Uitvoer is niet opgeslagen" #: ../gtk/src/hocr/OutputEditorHOCR.cc:1035 ../gtk/src/OutputEditorText.cc:296 #: ../qt/src/hocr/OutputEditorHOCR.cc:894 ../qt/src/OutputEditorText.cc:259 msgid "Save output before proceeding?" msgstr "Wilt u de uitvoer opslaan alvorens door te gaan?" #: ../gtk/src/hocr/OutputEditorHOCR.cc:1156 ../gtk/src/OutputEditorText.cc:184 #: ../qt/src/hocr/OutputEditorHOCR.cc:991 ../qt/src/OutputEditorText.cc:152 msgid "Replacing..." msgstr "Bezig met vervangen..." #: ../gtk/src/hocr/OutputEditorHOCR.cc:1181 ../gtk/src/OutputEditorText.cc:192 #: ../qt/src/hocr/OutputEditorHOCR.cc:1014 ../qt/src/OutputEditorText.cc:160 msgid "Applying substitutions..." msgstr "Bezig met toepassen van vervangingen..." #: ../gtk/src/MainWindow.cc:131 ../qt/src/MainWindow.cc:295 msgid "Using tesseract" msgstr "Gebruikmakend van tesseract" #: ../gtk/src/MainWindow.cc:178 ../qt/src/MainWindow.cc:194 msgid "Select an image to begin..." msgstr "Selecteer een afbeelding..." #: ../gtk/src/MainWindow.cc:293 ../qt/src/MainWindow.cc:278 msgid "Multiple sources" msgstr "Meerdere bronnen" #: ../gtk/src/MainWindow.cc:295 ../qt/src/MainWindow.cc:280 msgid "Ready" msgstr "Klaar" #: ../gtk/src/MainWindow.cc:442 ../qt/src/MainWindow.cc:423 msgid "New version" msgstr "Nieuwe versie" #: ../gtk/src/MainWindow.cc:442 ../qt/src/MainWindow.cc:423 msgid "gImageReader %1 is available" msgstr "gImageReader %1 is beschikbaar" #: ../gtk/src/MainWindow.cc:443 ../qt/src/MainWindow.cc:424 msgid "Download" msgstr "Downloaden" #: ../gtk/src/MainWindow.cc:444 ../qt/src/MainWindow.cc:425 msgid "Changelog" msgstr "Wijzigingslog" #: ../gtk/src/MainWindow.cc:445 ../qt/src/MainWindow.cc:426 msgid "Don't notify again" msgstr "Niet meer melden" #: ../gtk/src/MainWindow.cc:466 ../qt/src/MainWindow.cc:474 msgid "Don't show again" msgstr "Niet meer weergeven" #: ../gtk/src/MainWindow.cc:467 ../gtk/src/MainWindow.cc:480 #: ../qt/src/MainWindow.cc:475 msgid "Install" msgstr "Installeren" #: ../gtk/src/MainWindow.cc:487 ../qt/src/MainWindow.cc:487 msgid "Spelling dictionary missing" msgstr "Ontbrekend woordenboek" #: ../gtk/src/MainWindow.cc:487 ../qt/src/MainWindow.cc:487 msgid "The spellcheck dictionary for %1 is not installed" msgstr "" "Het woordenboek voor %1, benodigd voor de spellingcontrole, is niet " "geïnstalleerd" #: ../gtk/src/MainWindow.cc:494 ../gtk/src/MainWindow.cc:523 #: ../qt/src/MainWindow.cc:493 msgid "Installing spelling dictionary for '%1'" msgstr "Bezig met installeren van woordenboek voor '%1'" #: ../gtk/src/MainWindow.cc:515 ../gtk/src/MainWindow.cc:536 #: ../gtk/src/MainWindow.cc:544 ../gtk/src/MainWindow.cc:592 #: ../gtk/src/MainWindow.cc:597 ../gtk/src/TessdataManager.cc:60 #: ../gtk/src/TessdataManager.cc:70 ../gtk/src/TessdataManager.cc:339 #: ../qt/src/MainWindow.cc:512 ../qt/src/MainWindow.cc:525 #: ../qt/src/MainWindow.cc:534 ../qt/src/MainWindow.cc:578 #: ../qt/src/MainWindow.cc:583 ../qt/src/TessdataManager.cc:74 #: ../qt/src/TessdataManager.cc:84 ../qt/src/TessdataManager.cc:315 msgid "Error" msgstr "Fout" #: ../gtk/src/MainWindow.cc:515 ../qt/src/MainWindow.cc:512 msgid "Failed to install spelling dictionary: %1" msgstr "Het installeren van het woordenboek is mislukt: %1" #: ../gtk/src/MainWindow.cc:536 ../qt/src/MainWindow.cc:525 msgid "Failed to create directory for spelling dictionaries." msgstr "Het creëren van de map voor de woordenboeken is mislukt." #: ../gtk/src/MainWindow.cc:544 ../qt/src/MainWindow.cc:534 msgid "Could not read %1: %2." msgstr "%1 kan niet worden gelezen: %2." #: ../gtk/src/MainWindow.cc:571 ../qt/src/MainWindow.cc:558 msgid "Downloading '%1'..." msgstr "Bezig met downloaden van '%1'..." #: ../gtk/src/MainWindow.cc:592 ../qt/src/MainWindow.cc:578 msgid "" "The following dictionaries could not be downloaded:\n" "%1\n" "\n" "Check the connectivity and directory permissions.\n" "Hint: If you don't have write permissions in system folders, you can switch " "to user paths in the settings dialog." msgstr "" "De volgende woordenboeken kunnen niet worden gedownload:\n" "%1\n" "\n" "Controleer uw internetverbinding en maprechten.\n" "Tip: als u geen schrijfrechten hebt in systeemmappen, dan kunt u in de " "instellingen de locatie wijzigen naar een gebruikersmap." #: ../gtk/src/MainWindow.cc:595 ../qt/src/MainWindow.cc:581 msgid "Dictionaries installed" msgstr "De woordenboeken zijn geïnstalleerd" #: ../gtk/src/MainWindow.cc:595 msgid "" "The following dictionaries were installed:\n" "%1" msgstr "" "De volgende woordenboeken zijn geïnstalleerd:\n" "%1" #: ../gtk/src/MainWindow.cc:597 ../qt/src/MainWindow.cc:583 msgid "No spelling dictionaries found for '%1'." msgstr "Geen woordenboeken gevonden voor '%1'." #: ../gtk/src/OutputEditorText.cc:154 ../qt/src/OutputEditorText.cc:137 msgid "Stripping line breaks..." msgstr "Bezig met verwijderen van regeleindes..." #: ../gtk/src/OutputEditorText.cc:162 msgid "Check spelling" msgstr "Spelling controleren" #: ../gtk/src/OutputEditorText.cc:231 ../qt/src/OutputEditorText.cc:196 msgid "File: %1" msgstr "Bestand: %1" #: ../gtk/src/OutputEditorText.cc:234 ../qt/src/OutputEditorText.cc:199 msgid "Page: %1" msgstr "Pagina: %1" #: ../gtk/src/OutputEditorText.cc:247 ../gtk/src/Recognizer.cc:471 #: ../qt/src/Recognizer.cc:462 msgid "" "\n" "[Failed to recognize page %1]\n" msgstr "" "\n" "[Het herkennen van pagina %1 is mislukt]\n" #: ../gtk/src/OutputEditorText.cc:275 ../qt/src/OutputEditorText.cc:239 msgid "Save Output..." msgstr "Uitvoer opslaan..." #: ../gtk/src/Recognizer.cc:179 ../qt/src/Recognizer.cc:172 msgid "No languages available" msgstr "Geen beschikbare talen" #: ../gtk/src/Recognizer.cc:179 ../qt/src/Recognizer.cc:172 msgid "" "No tesseract languages are available for use. Recognition will not work." msgstr "" "Er zijn geen tesseract-talen beschikbaar; de herkenningsfunctie zal niet " "werken." #: ../gtk/src/Recognizer.cc:233 ../qt/src/Recognizer.cc:232 msgid "Multilingual" msgstr "Meertalig" #: ../gtk/src/Recognizer.cc:285 ../qt/src/Recognizer.cc:277 msgid "Automatic page segmentation" msgstr "Automatische paginasegmentatie" #: ../gtk/src/Recognizer.cc:286 ../qt/src/Recognizer.cc:278 msgid "Page segmentation with orientation and script detection" msgstr "Paginasegmentatie met oriëntatie- en scriptdetectie" #: ../gtk/src/Recognizer.cc:287 ../qt/src/Recognizer.cc:279 msgid "Assume single column of text" msgstr "Eén tekstkolom veronderstellen" #: ../gtk/src/Recognizer.cc:288 ../qt/src/Recognizer.cc:280 msgid "Assume single block of vertically aligned text" msgstr "Eén blok van verticaal uitgelijnde tekst veronderstellen" #: ../gtk/src/Recognizer.cc:289 ../qt/src/Recognizer.cc:281 msgid "Assume a single uniform block of text" msgstr "Eén uniform tekstblok veronderstellen" #: ../gtk/src/Recognizer.cc:290 ../qt/src/Recognizer.cc:282 msgid "Assume a line of text" msgstr "Tekstregel veronderstellen" #: ../gtk/src/Recognizer.cc:291 ../qt/src/Recognizer.cc:283 msgid "Assume a single word" msgstr "Los woord veronderstellen" #: ../gtk/src/Recognizer.cc:292 ../qt/src/Recognizer.cc:284 msgid "Assume a single word in a circle" msgstr "Eén woord in een cirkel veronderstellen" #: ../gtk/src/Recognizer.cc:293 ../qt/src/Recognizer.cc:285 msgid "Sparse text in no particular order" msgstr "Schaarse tekst, niet in een bepaalde volgorde" #: ../gtk/src/Recognizer.cc:294 ../qt/src/Recognizer.cc:286 msgid "Sparse text with orientation and script detection" msgstr "Schaarse tekst met oriëntatie- en scriptdetectie" #: ../gtk/src/Recognizer.cc:309 ../qt/src/Recognizer.cc:297 msgid "Page segmentation mode" msgstr "Paginasegmentatiemodus" #: ../gtk/src/Recognizer.cc:313 ../qt/src/Recognizer.cc:300 msgid "Character whitelist / blacklist..." msgstr "" #: ../gtk/src/Recognizer.cc:319 ../qt/src/Recognizer.cc:305 msgid "Manage languages..." msgstr "Talen beheren..." #: ../gtk/src/Recognizer.cc:375 ../qt/src/Recognizer.cc:369 msgid "Current selection" msgstr "Huidige selectie" #: ../gtk/src/Recognizer.cc:465 ../qt/src/Recognizer.cc:455 msgid "Recognizing page %1 (%2 of %3)" msgstr "Bezig met herkennen van pagina %1 (%2 van %3)" #: ../gtk/src/Recognizer.cc:470 ../qt/src/Recognizer.cc:461 msgid "" "\n" "- Page %1: failed to render page" msgstr "" "\n" "-Pagina %1: het renderen van de pagina is mislukt" #: ../gtk/src/Recognizer.cc:501 ../gtk/src/Recognizer.cc:531 #: ../gtk/src/Recognizer.cc:544 ../qt/src/Recognizer.cc:491 #: ../qt/src/Recognizer.cc:521 ../qt/src/Recognizer.cc:534 msgid "Recognizing..." msgstr "Bezig met herkennen..." #: ../gtk/src/Recognizer.cc:505 ../gtk/src/Recognizer.cc:514 #: ../qt/src/Recognizer.cc:495 ../qt/src/Recognizer.cc:504 msgid "Recognition errors occurred" msgstr "Herkenningsfouten" #: ../gtk/src/Recognizer.cc:505 ../qt/src/Recognizer.cc:495 msgid "The following errors occurred:%1" msgstr "De volgende fouten zijn opgetreden: %1" #: ../gtk/src/Recognizer.cc:514 ../qt/src/Recognizer.cc:504 msgid "Failed to initialize tesseract" msgstr "Initialiseren van tesseract is mislukt" #: ../gtk/src/scanner/ScannerSane.cc:84 ../gtk/src/scanner/ScannerTwain.cc:288 #: ../qt/src/scanner/ScannerSane.cc:85 ../qt/src/scanner/ScannerTwain.cc:286 msgid "Scan canceled" msgstr "Scannen geannuleerd" #: ../gtk/src/scanner/ScannerSane.cc:159 ../gtk/src/scanner/ScannerTwain.cc:186 #: ../qt/src/scanner/ScannerSane.cc:159 ../qt/src/scanner/ScannerTwain.cc:178 msgid "No scanner specified" msgstr "Geen scanner opgegeven" #: ../gtk/src/scanner/ScannerSane.cc:168 ../gtk/src/scanner/ScannerTwain.cc:195 #: ../qt/src/scanner/ScannerSane.cc:168 ../qt/src/scanner/ScannerTwain.cc:187 msgid "Unable to connect to scanner" msgstr "Verbinden met scanner is mislukt" #: ../gtk/src/scanner/ScannerSane.cc:403 ../gtk/src/scanner/ScannerTwain.cc:266 #: ../gtk/src/scanner/ScannerTwain.cc:292 ../qt/src/scanner/ScannerSane.cc:403 #: ../qt/src/scanner/ScannerTwain.cc:258 ../qt/src/scanner/ScannerTwain.cc:290 msgid "Unable to start scan" msgstr "Starten van scan is mislukt" #: ../gtk/src/scanner/ScannerSane.cc:411 ../gtk/src/scanner/ScannerSane.cc:461 #: ../gtk/src/scanner/ScannerTwain.cc:318 ../qt/src/scanner/ScannerSane.cc:411 #: ../qt/src/scanner/ScannerSane.cc:461 ../qt/src/scanner/ScannerTwain.cc:316 msgid "Error communicating with scanner" msgstr "Fout tijdens communiceren met scanner" #: ../gtk/src/scanner/ScannerSane.cc:520 ../qt/src/scanner/ScannerSane.cc:517 msgid "Failed to save image" msgstr "Afbeelding opslaan mislukt" #: ../gtk/src/scanner/ScannerSane.cc:800 ../qt/src/scanner/ScannerSane.cc:797 msgid "Operation is cancelled." msgstr "De operatie is geannuleerd." #: ../gtk/src/scanner/ScannerSane.cc:802 ../qt/src/scanner/ScannerSane.cc:799 msgid "Device is busy." msgstr "Het apparaat is bezig." #: ../gtk/src/scanner/ScannerSane.cc:804 ../qt/src/scanner/ScannerSane.cc:801 msgid "Cover is opened." msgstr "De klep is geopend." #: ../gtk/src/scanner/ScannerSane.cc:806 ../qt/src/scanner/ScannerSane.cc:803 msgid "Document feeder jammed." msgstr "De documentinvoer is geblokkeerd." #: ../gtk/src/scanner/ScannerSane.cc:808 ../qt/src/scanner/ScannerSane.cc:805 msgid "Document feeder out of documents." msgstr "De documentinvoer bevat geen documenten meer." #: ../gtk/src/scanner/ScannerSane.cc:810 ../qt/src/scanner/ScannerSane.cc:807 msgid "Access to scanner is denied." msgstr "Scannertoegang is geweigerd." #: ../gtk/src/SourceManager.cc:118 ../qt/src/SourceManager.cc:124 msgid "PDFs with text" msgstr "PDF-bestanden met tekst" #: ../gtk/src/SourceManager.cc:118 ../qt/src/SourceManager.cc:124 msgid "" "These PDF files already contain text:\n" "%1" msgstr "" "Deze PDF-bestanden bevatten al tekst:\n" "%1" #: ../gtk/src/SourceManager.cc:127 ../qt/src/SourceManager.cc:132 msgid "Unable to open files" msgstr "Openen van bestanden mislukt" #: ../gtk/src/SourceManager.cc:127 ../qt/src/SourceManager.cc:132 msgid "The following files could not be opened:%1" msgstr "De volgende bestanden kunnen niet worden geopend: %1" #: ../gtk/src/SourceManager.cc:141 ../qt/src/SourceManager.cc:143 msgid "Enter password for file '%1':" msgstr "Voer het wachtwoord in voor het bestand '%1':" #: ../gtk/src/SourceManager.cc:197 ../qt/src/SourceManager.cc:214 msgid "Images and PDFs" msgstr "Afbeeldingen en PDF-bestanden" #: ../gtk/src/SourceManager.cc:202 ../qt/src/SourceManager.cc:215 msgid "Select Files" msgstr "Bestanden selecteren" #: ../gtk/src/SourceManager.cc:208 ../qt/src/SourceManager.cc:226 msgid "Clipboard Error" msgstr "Klembordfout" #: ../gtk/src/SourceManager.cc:208 ../qt/src/SourceManager.cc:226 msgid "Failed to read the clipboard." msgstr "Het uitlezen van het klembord is mislukt." #: ../gtk/src/SourceManager.cc:212 ../qt/src/SourceManager.cc:230 #: ../qt/src/SourceManager.cc:236 msgid "Pasted %1" msgstr "%1 geplakt" #: ../gtk/src/SourceManager.cc:224 ../qt/src/SourceManager.cc:243 msgid "Screenshot Error" msgstr "Schermafbeeldingsfout" #: ../gtk/src/SourceManager.cc:224 ../qt/src/SourceManager.cc:243 msgid "Failed to take screenshot." msgstr "Het maken van een schermafbeelding is mislukt." #: ../gtk/src/SourceManager.cc:228 ../qt/src/SourceManager.cc:247 msgid "Screenshot %1" msgstr "Schermafbeelding %1" #: ../gtk/src/SourceManager.cc:233 ../qt/src/SourceManager.cc:252 msgid "Saving image..." msgstr "Bezig met opslaan van afbeelding..." #: ../gtk/src/SourceManager.cc:240 ../qt/src/SourceManager.cc:265 msgid "Cannot Write File" msgstr "Bestand kan niet worden geschreven" #: ../gtk/src/SourceManager.cc:240 ../qt/src/SourceManager.cc:265 msgid "Could not write to %1." msgstr "Er kan niet worden geschreven naar %1." #: ../gtk/src/SourceManager.cc:267 ../qt/src/SourceManager.cc:287 msgid "Delete File?" msgstr "Bestand verwijderen?" #: ../gtk/src/SourceManager.cc:267 ../qt/src/SourceManager.cc:287 msgid "The following files will be deleted:%1" msgstr "De volgende bestanden worden verwijderd: %1" #: ../gtk/src/SourceManager.cc:332 ../qt/src/SourceManager.cc:338 msgid "Missing File" msgstr "Ontbrekend bestand" #: ../gtk/src/SourceManager.cc:332 ../qt/src/SourceManager.cc:338 msgid "" "The following file has been deleted or moved:\n" "%1" msgstr "" "Het volgende bestand is verwijderd of verplaatst:\n" "%1" #: ../gtk/src/SubstitutionsManager.cc:33 ../qt/src/SubstitutionsManager.cc:73 msgid "Search for" msgstr "Zoeken naar" #: ../gtk/src/SubstitutionsManager.cc:34 ../qt/src/SubstitutionsManager.cc:73 msgid "Replace with" msgstr "Vervangen door" #: ../gtk/src/SubstitutionsManager.cc:69 ../gtk/src/SubstitutionsManager.cc:103 #: ../qt/src/SubstitutionsManager.cc:106 ../qt/src/SubstitutionsManager.cc:143 msgid "Substitutions List" msgstr "Vervangingslijst" #: ../gtk/src/SubstitutionsManager.cc:70 ../qt/src/SubstitutionsManager.cc:106 msgid "Open Substitutions List" msgstr "Vervangingslijst openen" #: ../gtk/src/SubstitutionsManager.cc:75 ../qt/src/SubstitutionsManager.cc:112 msgid "Error Reading File" msgstr "Fout tijdens lezen van bestand" #: ../gtk/src/SubstitutionsManager.cc:75 ../qt/src/SubstitutionsManager.cc:112 msgid "Unable to read '%1'." msgstr "'%1' kan niet worden gelezen." #: ../gtk/src/SubstitutionsManager.cc:97 ../qt/src/SubstitutionsManager.cc:137 msgid "Errors Occurred Reading File" msgstr "Fouten opgetreden tijdens lezen van bestand" #: ../gtk/src/SubstitutionsManager.cc:97 ../qt/src/SubstitutionsManager.cc:137 msgid "Some entries of the substitutions list could not be read." msgstr "Sommige items op de vervangingslijst kunnen niet worden gelezen." #: ../gtk/src/SubstitutionsManager.cc:104 ../qt/src/SubstitutionsManager.cc:143 msgid "Save Substitutions List" msgstr "Vervangingslijst opslaan" #: ../gtk/src/SubstitutionsManager.cc:110 ../qt/src/SubstitutionsManager.cc:149 msgid "Error Saving File" msgstr "Fout bij opslaan van bestand" #: ../gtk/src/SubstitutionsManager.cc:110 ../qt/src/SubstitutionsManager.cc:149 msgid "Unable to write to '%1'." msgstr "Er kan niet worden geschreven naar '%1'." #: ../gtk/src/SubstitutionsManager.cc:127 ../qt/src/SubstitutionsManager.cc:162 msgid "Save List?" msgstr "Lijst opslaan?" #: ../gtk/src/SubstitutionsManager.cc:127 ../qt/src/SubstitutionsManager.cc:162 msgid "Do you want to save the current list?" msgstr "Wilt u de huidige lijst opslaan?" #: ../gtk/src/TessdataManager.cc:60 ../qt/src/TessdataManager.cc:74 #, fuzzy msgid "" "A session connection to the PackageKit backend is required for managing " "system-wide tesseract language packs, but it was not found. This service is " "usually provided by a software-management application such as Gnome " "Software. Please install software which provides the necessary PackageKit " "interface, use other system package management software to manage the " "tesseract language packs directly, or switch to using the user tessdata path " "in the configuration dialog." msgstr "" "PackageKit is vereist voor het beheren van systeembreed geïnstalleerde " "tesseract-taalpakketten, maar is niet gevonden. Gebruik het pakketbeheer van " "uw systeem om de tesseract-taalpakketten te beheren of schakel over naar een " "gebruikerspad op het configuratiescherm." #: ../gtk/src/TessdataManager.cc:65 ../qt/src/TessdataManager.cc:79 msgid "Fetching available languages" msgstr "Bezig met ophalen van beschikbare talen" #: ../gtk/src/TessdataManager.cc:70 ../gtk/src/TessdataManager.cc:96 #: ../gtk/src/TessdataManager.cc:197 ../qt/src/TessdataManager.cc:84 #: ../qt/src/TessdataManager.cc:101 ../qt/src/TessdataManager.cc:197 msgid "Failed to fetch list of available languages: %1" msgstr "Het ophalen van de lijst met beschikbare talen is mislukt: %1" #: ../gtk/src/TessdataManager.cc:104 ../qt/src/TessdataManager.cc:113 #: ../qt/src/TessdataManager.cc:122 msgid "Parsing error: %1" msgstr "Verwerkingsfout: %1" #: ../gtk/src/TessdataManager.cc:235 ../qt/src/TessdataManager.cc:232 msgid "Applying changes..." msgstr "Bezig met toepassen van wijzigingen..." #: ../gtk/src/TessdataManager.cc:297 ../qt/src/TessdataManager.cc:278 msgid "Failed to create directory for tessdata files." msgstr "Het creëren van een map voor de tessdata-bestanden is mislukt." #: ../gtk/src/TessdataManager.cc:306 ../qt/src/TessdataManager.cc:287 msgid "Downloading %1..." msgstr "Bezig met downloaden van %1..." #: ../gtk/src/TessdataManager.cc:330 msgid "" "The following files could not be downloaded or removed:\n" "%1\n" "\n" "Check the connectivity and directory permissions.\n" "\n" "Hint: If you don't have write permissions in system folders, you can switch " "to user paths in the settings dialog." msgstr "" "De volgende bestanden kunnen niet worden gedownload of verwijderd:\n" "%1\n" "\n" "Controleer uw internetverbinding en maprechten.\n" "\n" "Tip: als u geen schrijfrechten hebt in systeemmappen, dan kunt u het pad " "wijzigen in de instellingen." #: ../gtk/src/Utils.cc:64 msgid "Yes" msgstr "Ja" #: ../gtk/src/Utils.cc:67 msgid "No" msgstr "Nee" #: ../gtk/src/Utils.cc:76 msgid "Discard" msgstr "Verwerpen" #: ../qt/data/AboutDialog.ui.h:1 msgid "About gImageReader" msgstr "Over gImageReader" #: ../qt/data/AboutDialog.ui.h:3 msgid "" "

 

A graphical frontend to tesseract-ocr

Website

 

" msgstr "" "

 

Een grafisch front-end voor tesseract-" "ocr

Website

 

" #: ../qt/data/AboutDialog.ui.h:4 msgid "Credits" msgstr "Met dank aan" #: ../qt/data/AboutDialog.ui.h:5 msgid "License" msgstr "Licentie" #: ../qt/data/ConfigDialog.ui.h:14 msgid "System encoding" msgstr "Systeem-tekencodering" #: ../qt/data/ConfigDialog.ui.h:15 msgid "UTF-8" msgstr "UTF-8" #: ../qt/data/ConfigDialog.ui.h:19 msgid "Text file encoding:" msgstr "Tekstbestand-tekencodering:" #: ../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 "" "

De applicatie is " "gecrashed

Excuses voor het ongemak. Als u wilt helpen om de " "applicatie te verbeteren, overweeg dan om het probleem te melden via manisandro@gmail.com. Probeer te omschrijven wat u aan het doen was " "voordat de applicatie crashte. Voeg ook onderstaande informatie bij. Bedankt." "

" #: ../qt/data/CrashHandler.ui.h:3 msgid "" "

Tesseract has " "aborted

Tesseract (the OCR engine) has aborted while " "recognizing text. This may occur if the used traineddatas are corrupt or " "incomplatible with the version of tesseract in use, or due to a bug in " "tesseract.

The stacktrace below may provide additional information " "about where the crash occured.

" msgstr "" #: ../qt/data/MainWindow.ui.h:17 msgid "Flatbed" msgstr "Flatbed" #: ../qt/data/MainWindow.ui.h:18 msgid "ADF Front" msgstr "ADF Front" #: ../qt/data/MainWindow.ui.h:19 msgid "ADF Back" msgstr "ADF Back" #: ../qt/data/MainWindow.ui.h:20 msgid "ADF Duplex" msgstr "ADF Duplex" #. Remove & from some labels which designer insists in adding #: ../qt/data/MainWindow.ui.h:21 ../qt/src/Ui_MainWindow.hh:50 msgid "Sources" msgstr "Bronnen" #: ../qt/data/MainWindow.ui.h:22 msgid "Zoom In" msgstr "Inzoomen" #: ../qt/data/MainWindow.ui.h:24 msgid "Zoom Out" msgstr "Uitzoomen" #: ../qt/data/MainWindow.ui.h:26 msgid "Normal Size" msgstr "Normale grootte" #: ../qt/data/MainWindow.ui.h:28 msgid "Best Fit" msgstr "Best passend" #: ../qt/data/MainWindow.ui.h:30 msgid "Rotate Left" msgstr "Naar links draaien" #: ../qt/data/MainWindow.ui.h:31 msgid "Rotate left" msgstr "Naar links draaien" #: ../qt/data/MainWindow.ui.h:32 msgid "Rotate Right" msgstr "Naar rechts draaien" #: ../qt/data/MainWindow.ui.h:33 msgid "Rotate right" msgstr "Naar rechts draaien" #: ../qt/data/MainWindow.ui.h:34 msgid "Image Controls" msgstr "Afbeeldingshulpmiddelen" #: ../qt/data/MainWindow.ui.h:36 msgid "Autodetect Layout" msgstr "Indeling automatisch detecteren" #: ../qt/data/MainWindow.ui.h:38 msgid "Toggle Output Pane" msgstr "Uitvoerpaneel weergeven/verbergen" #: ../qt/data/PdfExportDialog.ui.h:5 msgid "Backend:" msgstr "Back-end:" #: ../qt/data/PdfExportDialog.ui.h:8 msgid "Portrait" msgstr "Portret" #: ../qt/data/PdfExportDialog.ui.h:9 msgid "Landscape" msgstr "Landschap" #: ../qt/src/hocr/HOCRPdfExporter.cc:142 msgid "Failed to write to file" msgstr "Schrijven naar bestand mislukt" #. Output toolbar #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:55 #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:56 msgid "Open hOCR file" msgstr "hOCR-bestand openen" #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:57 #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:58 msgid "Save as hOCR text" msgstr "Opslaan als hOCR-tekst" #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:79 #: ../qt/src/Ui_OutputEditorText.hh:106 msgid "Find and Replace" msgstr "Zoeken en vervangen" #: ../qt/src/MainWindow.cc:581 #, fuzzy msgid "" "The following dictionary files were installed:\n" "%1" msgstr "De volgende woordenboekbestanden zijn geïnstalleerd: %1" #: ../qt/src/TessdataManager.cc:308 msgid "" "The following files could not be downloaded or removed:\n" "%1\n" "\n" "Check the connectivity and directory permissions.\n" "Hint: If you don't have write permissions in system folders, you can switch " "to user paths in the settings dialog." msgstr "" "De volgende bestanden kunnen niet worden gedownload of verwijderd:\n" "%1\n" "\n" "Controleer uw internetverbinding en maprechten.\n" "\n" "Tip: als u geen schrijfrechten hebt in systeemmappen, dan kunt u het pad " "wijzigen in de instellingen." #: ../qt/src/Ui_MainWindow.hh:51 msgid "Output" msgstr "Uitvoer" #: ../qt/src/Ui_MainWindow.hh:135 msgid "OCR mode:" msgstr "OCR-modus:" #: ../qt/src/Ui_MainWindow.hh:209 msgid "Remove Image" msgstr "Afbeelding verwijderen" #: ../qt/src/Ui_MainWindow.hh:212 msgid "Delete Image" msgstr "Afbeelding verwijderen" #: ../qt/src/Ui_MainWindow.hh:215 msgid "Clear List" msgstr "Lijst wissen" #: ../qt/src/Ui_OutputEditorText.hh:101 msgid "Strip Line Breaks" msgstr "Regelafbrekingen verwijderen" #: ../qt/src/Ui_OutputEditorText.hh:115 msgid "Save Output" msgstr "Uitvoer opslaan" #: ../qt/src/Ui_OutputEditorText.hh:117 msgid "Clear Output" msgstr "Uitvoer wissen" #~ msgid "The application has crashed" #~ msgstr "De applicatie is gecrasht" #~ 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 is gecrasht met de volgende melding:\n" #~ "\n" #~ "%1\n" #~ "\n" #~ "Dit gebeurt meestal vanwege één van de volgende redenen:\n" #~ "-Er worden verouderde traineddata-bestanden gebruikt.\n" #~ "-De ondersteunende taalgegevensbestanden ontbreken.\n" #~ "-De taalgegevensbestanden zijn beschadigd.\n" #~ "\n" #~ "Zorg ervoor dat uw taalgegevensbestanden juist zijn en compatibel met " #~ "tesseract %2." #~ msgid "Could not read %1: %2" #~ msgstr "%1 kan niet worden gelezen: %2" gImageReader-3.3.1/po/pl.po000066400000000000000000002036251351740627400154440ustar00rootroot00000000000000# 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: 2019-07-25 23:17+0200\n" "PO-Revision-Date: 2019-07-18 17:35+0000\n" "Last-Translator: WaldiS \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: Weblate 3.8-dev\n" #: ../data/gimagereader.desktop.in.h:1 msgid "OCR application" msgstr "Aplikacja OCR" #: ../gtk/data/appmenu.ui.h:1 ../qt/src/Ui_MainWindow.hh:167 msgid "Redetect Languages" msgstr "Ponownie wykryj języki" #: ../gtk/data/appmenu.ui.h:2 ../qt/src/Ui_MainWindow.hh:170 msgid "Manage Languages" msgstr "Zarządzaj językami" #: ../gtk/data/appmenu.ui.h:3 ../gtk/data/ConfigDialog.ui.h:1 #: ../qt/data/ConfigDialog.ui.h:1 ../qt/src/Ui_MainWindow.hh:173 msgid "Preferences" msgstr "Ustawienia" #: ../gtk/data/appmenu.ui.h:4 ../gtk/data/ConfigDialog.ui.h:2 #: ../gtk/src/MainWindow.cc:482 ../qt/src/MainWindow.cc:481 #: ../qt/src/Ui_MainWindow.hh:178 msgid "Help" msgstr "Pomoc" #: ../gtk/data/appmenu.ui.h:5 ../qt/data/AboutDialog.ui.h:2 #: ../qt/src/Ui_MainWindow.hh:181 msgid "About" msgstr "O programie" #: ../gtk/data/appmenu.ui.h:6 msgid "Quit" msgstr "Zakończ" #: ../gtk/data/ConfigDialog.ui.h:3 ../gtk/data/MainWindow.ui.h:47 #: ../gtk/data/OutputEditorHOCR.ui.h:3 ../gtk/data/PdfExportDialog.ui.h:3 #: ../gtk/src/FileDialogs.cc:152 ../gtk/src/Utils.cc:61 #: ../qt/data/ConfigDialog.ui.h:26 msgid "OK" msgstr "OK" #: ../gtk/data/ConfigDialog.ui.h:4 msgid "Output pane orientation:" msgstr "Orientacja panelu wyjściowego:" #: ../gtk/data/ConfigDialog.ui.h:5 msgid "Horizontal" msgstr "Pozioma" #: ../gtk/data/ConfigDialog.ui.h:6 msgid "Vertical" msgstr "Pionowa" #: ../gtk/data/ConfigDialog.ui.h:7 ../qt/data/ConfigDialog.ui.h:18 msgid "Query to install missing spellcheck dictionaries" msgstr "Pobierz brakujące słowniki ortograficzne" #: ../gtk/data/ConfigDialog.ui.h:8 ../qt/data/ConfigDialog.ui.h:4 msgid "Automatically check for new program versions" msgstr "Automatycznie sprawdzaj nową wersję programu" #: ../gtk/data/ConfigDialog.ui.h:9 ../qt/data/ConfigDialog.ui.h:3 msgid "Predefined language definitions:" msgstr "Wbudowane definicje języków:" #: ../gtk/data/ConfigDialog.ui.h:10 ../qt/data/ConfigDialog.ui.h:12 msgid "Additional language definitions:" msgstr "Dodatkowe definicje języków:" #: ../gtk/data/ConfigDialog.ui.h:11 ../qt/data/ConfigDialog.ui.h:20 msgid "The prefix of the tesseract language data file" msgstr "Prefiks nazwy pliku językowego tesseract" #: ../gtk/data/ConfigDialog.ui.h:12 ../qt/data/ConfigDialog.ui.h:21 msgid "Prefix" msgstr "Prefiks" #: ../gtk/data/ConfigDialog.ui.h:13 ../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/ConfigDialog.ui.h:14 ../qt/data/ConfigDialog.ui.h:23 msgid "ISO Code" msgstr "Kod ISO" #: ../gtk/data/ConfigDialog.ui.h:15 ../qt/data/ConfigDialog.ui.h:24 msgid "The name of the language" msgstr "Nazwa języka" #: ../gtk/data/ConfigDialog.ui.h:16 ../qt/data/ConfigDialog.ui.h:25 msgid "Name" msgstr "Nazwa" #: ../gtk/data/ConfigDialog.ui.h:17 ../gtk/data/MainWindow.ui.h:46 #: ../gtk/data/OutputEditorHOCR.ui.h:2 ../gtk/data/PdfExportDialog.ui.h:2 #: ../gtk/src/Acquirer.cc:34 ../gtk/src/FileDialogs.cc:151 #: ../gtk/src/Utils.cc:70 ../qt/data/ConfigDialog.ui.h:27 #: ../qt/data/MainWindow.ui.h:12 msgid "Cancel" msgstr "Anuluj" #: ../gtk/data/ConfigDialog.ui.h:18 ../qt/data/ConfigDialog.ui.h:5 msgid "Output pane font:" msgstr "Czcionka panelu wynikowego:" #: ../gtk/data/ConfigDialog.ui.h:19 ../qt/data/ConfigDialog.ui.h:2 msgid "Default" msgstr "Domyślne" #: ../gtk/data/ConfigDialog.ui.h:20 ../qt/data/ConfigDialog.ui.h:6 msgid "Language data locations:" msgstr "Lokalizacja danych języków:" #: ../gtk/data/ConfigDialog.ui.h:21 ../qt/data/ConfigDialog.ui.h:13 msgid "Language definitions path:" msgstr "Ścieżka definicji języków:" #: ../gtk/data/ConfigDialog.ui.h:22 ../qt/data/ConfigDialog.ui.h:28 msgid "Spelling dictionaries path:" msgstr "Ścieżka słowników:" #: ../gtk/data/ConfigDialog.ui.h:23 ../qt/data/ConfigDialog.ui.h:10 msgid "System-wide paths" msgstr "Ścieżki systemowe" #: ../gtk/data/ConfigDialog.ui.h:24 ../qt/data/ConfigDialog.ui.h:11 msgid "User paths" msgstr "Ścieżki użytkownika" #: ../gtk/data/ConfigDialog.ui.h:25 ../qt/data/ConfigDialog.ui.h:29 msgid "Automatically open exported documents with default application" msgstr "Automatycznie otwieraj eksportowane dokumenty z domyślną aplikacją" #: ../gtk/data/CrashHandler.ui.h:1 ../qt/src/CrashHandler.cc:38 msgid "Regenerate backtrace" msgstr "Wygeneruj ślad błędu" #: ../gtk/data/CrashHandler.ui.h:3 #, fuzzy, no-c-format msgid "" "The application has crashed\n" "\n" "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/CrashHandler.ui.h:6 msgid "" "Tesseract has aborted\n" "\n" "Tesseract (the OCR engine) has aborted while recognizing text. This may " "occur if the used traineddatas are corrupt or incomplatible with the version " "of tesseract in use, or due to a bug in tesseract.\n" "\n" "The stacktrace below may provide additional information about where the " "crash occured.\n" msgstr "" #: ../gtk/data/MainWindow.ui.h:1 ../qt/data/MainWindow.ui.h:39 msgid "Toggle output pane" msgstr "Pokaż/ukryj panel boczny" #: ../gtk/data/MainWindow.ui.h:2 ../qt/src/Ui_MainWindow.hh:66 msgid "Rotate current page" msgstr "Obróć bieżącą stronę" #: ../gtk/data/MainWindow.ui.h:3 ../qt/src/Ui_MainWindow.hh:67 msgid "Rotate all pages" msgstr "Obróć wszystkie strony" #. Sources toolbar #: ../gtk/data/MainWindow.ui.h:4 ../qt/src/Ui_MainWindow.hh:192 msgid "Recent" msgstr "Ostatnie" #: ../gtk/data/MainWindow.ui.h:5 ../qt/src/Ui_MainWindow.hh:193 msgid "Paste" msgstr "Wklej" #: ../gtk/data/MainWindow.ui.h:6 ../qt/src/Ui_MainWindow.hh:194 msgid "Take Screenshot" msgstr "Zrzut ekranu" #: ../gtk/data/MainWindow.ui.h:7 ../qt/data/MainWindow.ui.h:23 msgid "Zoom in" msgstr "Powiększ" #: ../gtk/data/MainWindow.ui.h:8 ../qt/data/MainWindow.ui.h:25 msgid "Zoom out" msgstr "Pomniejsz" #: ../gtk/data/MainWindow.ui.h:9 ../qt/data/MainWindow.ui.h:27 msgid "Normal size" msgstr "Normalny rozmiar" #: ../gtk/data/MainWindow.ui.h:10 ../qt/data/MainWindow.ui.h:29 msgid "Best fit" msgstr "Dopasuj rozmiar" #: ../gtk/data/MainWindow.ui.h:11 ../qt/src/Ui_MainWindow.hh:75 msgid "Select rotation mode" msgstr "Wybierz tryb obrotu" #: ../gtk/data/MainWindow.ui.h:12 ../gtk/data/OutputEditorText.ui.h:13 #: ../qt/src/Ui_OutputEditorText.hh:95 msgid "Select insert mode" msgstr "Tryb wstawiania" #: ../gtk/data/MainWindow.ui.h:13 ../qt/src/Ui_MainWindow.hh:109 #, fuzzy msgid "Select page" msgstr "Wybierz język" #: ../gtk/data/MainWindow.ui.h:14 ../qt/data/MainWindow.ui.h:35 msgid "Image controls" msgstr "Dostosowanie obrazu" #: ../gtk/data/MainWindow.ui.h:15 ../qt/src/Ui_MainWindow.hh:139 msgid "Plain text" msgstr "Zwykły tekst" #: ../gtk/data/MainWindow.ui.h:16 ../qt/src/Ui_MainWindow.hh:139 msgid "hOCR, PDF" msgstr "hOCR, PDF" #: ../gtk/data/MainWindow.ui.h:17 ../qt/data/MainWindow.ui.h:37 msgid "Autodetect layout" msgstr "Automatycznie wykryj układ" #: ../gtk/data/MainWindow.ui.h:18 msgid "Recognize all" msgstr "Rozpoznaj wszystko" #: ../gtk/data/MainWindow.ui.h:19 msgid "Select language" msgstr "Wybierz język" #: ../gtk/data/MainWindow.ui.h:20 ../qt/src/Ui_MainWindow.hh:205 msgid "Add images" msgstr "Dodaj obrazy" #: ../gtk/data/MainWindow.ui.h:21 ../qt/src/Ui_MainWindow.hh:204 msgid "Add Images" msgstr "Dodaj obrazy" #: ../gtk/data/MainWindow.ui.h:22 ../qt/src/Ui_MainWindow.hh:210 msgid "Remove image from list" msgstr "Usuń obraz z listy" #: ../gtk/data/MainWindow.ui.h:23 ../qt/src/Ui_MainWindow.hh:213 msgid "Delete image" msgstr "Skasuj obraz" #: ../gtk/data/MainWindow.ui.h:24 ../qt/src/Ui_MainWindow.hh:216 msgid "Clear list" msgstr "Wyczyść listę" #: ../gtk/data/MainWindow.ui.h:25 ../qt/data/MainWindow.ui.h:5 msgid "Files" msgstr "Pliki" #: ../gtk/data/MainWindow.ui.h:26 ../qt/data/MainWindow.ui.h:8 msgid "Device:" msgstr "Urządzenie:" #: ../gtk/data/MainWindow.ui.h:27 ../gtk/data/TessdataManager.ui.h:4 #: ../qt/data/MainWindow.ui.h:7 ../qt/src/TessdataManager.cc:59 msgid "Refresh" msgstr "Odśwież" #: ../gtk/data/MainWindow.ui.h:28 ../qt/data/MainWindow.ui.h:9 msgid "Output:" msgstr "Zapisz:" #: ../gtk/data/MainWindow.ui.h:29 ../qt/data/MainWindow.ui.h:13 msgid "Mode:" msgstr "Tryb:" #: ../gtk/data/MainWindow.ui.h:30 ../gtk/src/hocr/HOCRPdfExporter.cc:313 #: ../qt/data/MainWindow.ui.h:15 ../qt/src/hocr/HOCRPdfExporter.cc:347 msgid "Color" msgstr "Kolor" #: ../gtk/data/MainWindow.ui.h:31 ../gtk/src/hocr/HOCRPdfExporter.cc:316 #: ../qt/data/MainWindow.ui.h:14 ../qt/src/hocr/HOCRPdfExporter.cc:349 #: ../qt/src/hocr/HOCRPdfExporter.cc:351 msgid "Grayscale" msgstr "Odcienie szarości" #: ../gtk/data/MainWindow.ui.h:32 ../qt/data/MainWindow.ui.h:10 msgid "Resolution:" msgstr "Rozdzielczość:" #: ../gtk/data/MainWindow.ui.h:33 ../qt/data/MainWindow.ui.h:11 msgid "Scan" msgstr "Skanuj" #: ../gtk/data/MainWindow.ui.h:34 ../qt/data/MainWindow.ui.h:16 msgid "Source:" msgstr "Źródło:" #: ../gtk/data/MainWindow.ui.h:35 ../qt/data/MainWindow.ui.h:6 msgid "Acquire" msgstr "Skanowanie" #: ../gtk/data/MainWindow.ui.h:36 ../qt/data/MainWindow.ui.h:1 msgid "Brightness" msgstr "Jasność" #: ../gtk/data/MainWindow.ui.h:37 ../qt/data/MainWindow.ui.h:2 msgid "Contrast" msgstr "Kontrast" #: ../gtk/data/MainWindow.ui.h:38 ../qt/data/MainWindow.ui.h:3 msgid "Resolution" msgstr "Rozdzielczość" #: ../gtk/data/MainWindow.ui.h:39 ../qt/data/MainWindow.ui.h:4 msgid "Invert colors" msgstr "Negatyw" #: ../gtk/data/MainWindow.ui.h:40 msgid "A graphical frontend to tesseract-ocr" msgstr "Interfejs graficzny dla tesseract-ocr" #: ../gtk/data/MainWindow.ui.h:41 ../qt/data/CharacterListDialog.ui.h:1 msgid "Character whitelist / blacklist" msgstr "" #: ../gtk/data/MainWindow.ui.h:42 ../qt/data/CharacterListDialog.ui.h:2 msgid "Exclude these characters from being recognized (blacklist):" msgstr "" #: ../gtk/data/MainWindow.ui.h:43 ../qt/data/CharacterListDialog.ui.h:3 #, fuzzy msgid "Enter a string of characters..." msgstr "Pobieranie parametrów..." #: ../gtk/data/MainWindow.ui.h:44 ../qt/data/CharacterListDialog.ui.h:4 msgid "Only allow the following characters to be recognized (whitelist):" msgstr "" #: ../gtk/data/MainWindow.ui.h:45 ../qt/data/PageRangeDialog.ui.h:1 msgid "Page Range" msgstr "Zakres stron" #: ../gtk/data/MainWindow.ui.h:48 ../qt/data/PageRangeDialog.ui.h:2 msgid "Page range:" msgstr "Zakres stron:" #: ../gtk/data/MainWindow.ui.h:49 ../qt/data/PageRangeDialog.ui.h:3 msgid "Example: 1-10, 13, 14-18" msgstr "Przykład: 1-10, 13, 14-18" #: ../gtk/data/MainWindow.ui.h:50 ../qt/data/PageRangeDialog.ui.h:4 msgid "Recognition area:" msgstr "Obszar rozpoznawania:" #: ../gtk/data/MainWindow.ui.h:51 ../gtk/src/Recognizer.cc:375 #: ../qt/data/PageRangeDialog.ui.h:5 ../qt/src/Recognizer.cc:369 msgid "Entire page" msgstr "Cała strona" #: ../gtk/data/MainWindow.ui.h:52 ../qt/data/PageRangeDialog.ui.h:6 msgid "Autodetect" msgstr "Automatycznie" #: ../gtk/data/MainWindow.ui.h:53 ../qt/data/PageRangeDialog.ui.h:7 msgid "Prepend to output text:" msgstr "Dołącz do bieżącego tekstu:" #: ../gtk/data/MainWindow.ui.h:54 ../qt/data/PageRangeDialog.ui.h:8 msgid "Source filename" msgstr "Nazwa pliku źródłowego" #: ../gtk/data/MainWindow.ui.h:55 ../qt/data/PageRangeDialog.ui.h:9 msgid "Source page" msgstr "Strona źródłowa" #: ../gtk/data/MainWindow.ui.h:56 ../qt/src/SourceManager.cc:146 msgid "Protected PDF" msgstr "Chroniony plik PDF" #: ../gtk/data/MainWindow.ui.h:57 ../qt/src/Recognizer.cc:76 msgid "Current Page" msgstr "Bieżąca strona" #: ../gtk/data/MainWindow.ui.h:58 ../qt/src/Recognizer.cc:79 msgid "Multiple Pages..." msgstr "Wiele stron..." #: ../gtk/data/OutputEditorHOCR.ui.h:1 ../qt/src/hocr/OutputEditorHOCR.cc:580 msgid "Add Word" msgstr "Dodaj słowo" #: ../gtk/data/OutputEditorHOCR.ui.h:4 ../qt/src/hocr/OutputEditorHOCR.cc:580 msgid "Enter word:" msgstr "Wpisz słowo:" #: ../gtk/data/OutputEditorHOCR.ui.h:5 ../qt/src/hocr/Ui_OutputEditorHOCR.hh:61 #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:62 msgid "Export to plain text" msgstr "Eksportuj jako typ: zwykły tekst" #: ../gtk/data/OutputEditorHOCR.ui.h:6 ../qt/src/hocr/Ui_OutputEditorHOCR.hh:64 #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:65 msgid "Export to PDF" msgstr "Eksportuj jako typ: PDF" #: ../gtk/data/OutputEditorHOCR.ui.h:7 ../qt/src/hocr/Ui_OutputEditorHOCR.hh:67 #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:68 msgid "Export to ODT" msgstr "Eksportuj jako typ: ODT" #: ../gtk/data/OutputEditorHOCR.ui.h:8 ../gtk/data/OutputEditorText.ui.h:18 #: ../qt/src/Ui_OutputEditorText.hh:116 msgid "Save output" msgstr "Zapisz wynik" #: ../gtk/data/OutputEditorHOCR.ui.h:9 ../qt/src/hocr/Ui_OutputEditorHOCR.hh:72 #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:73 msgid "Export" msgstr "Eksportuj" #: ../gtk/data/OutputEditorHOCR.ui.h:10 ../gtk/data/OutputEditorText.ui.h:19 #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:77 #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:78 #: ../qt/src/Ui_OutputEditorText.hh:118 msgid "Clear output" msgstr "Wyczyść wynik" #: ../gtk/data/OutputEditorHOCR.ui.h:11 ../gtk/data/OutputEditorText.ui.h:15 #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:80 #: ../qt/src/Ui_OutputEditorText.hh:107 msgid "Find and replace" msgstr "Znajdź i zamień" #: ../gtk/data/OutputEditorHOCR.ui.h:12 #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:82 #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:83 msgid "Show confidence values" msgstr "Pokaż wartość ufności" #: ../gtk/data/OutputEditorHOCR.ui.h:13 ../gtk/data/PdfExportDialog.ui.h:41 #: ../qt/data/PdfExportDialog.ui.h:2 ../qt/src/hocr/Ui_OutputEditorHOCR.hh:85 #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:86 msgid "Show preview" msgstr "Podgląd" #: ../gtk/data/OutputEditorHOCR.ui.h:14 #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:121 msgid "Next (F3)" msgstr "Następny (F3)" #: ../gtk/data/OutputEditorHOCR.ui.h:15 #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:122 msgid "Previous (Shift+F3)" msgstr "Poprzedni (Shift + F3)" #: ../gtk/data/OutputEditorHOCR.ui.h:16 ../gtk/src/hocr/OutputEditorHOCR.cc:890 #: ../qt/src/hocr/OutputEditorHOCR.cc:730 #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:126 msgid "Expand all" msgstr "Rozwiń" #: ../gtk/data/OutputEditorHOCR.ui.h:17 ../gtk/src/hocr/OutputEditorHOCR.cc:893 #: ../qt/src/hocr/OutputEditorHOCR.cc:731 #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:127 msgid "Collapse all" msgstr "Zwiń" #: ../gtk/data/OutputEditorHOCR.ui.h:18 #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:148 msgid "Properties" msgstr "Właściwości" #: ../gtk/data/OutputEditorHOCR.ui.h:19 #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:152 msgid "Source" msgstr "Źródło" #. Output insert mode #: ../gtk/data/OutputEditorText.ui.h:1 ../qt/src/Ui_OutputEditorText.hh:52 msgid "Append to current text" msgstr "Dołącz do bieżącego tekstu" #: ../gtk/data/OutputEditorText.ui.h:2 ../qt/src/Ui_OutputEditorText.hh:53 msgid "Insert at cursor" msgstr "Wstaw w miejscu kursora" #: ../gtk/data/OutputEditorText.ui.h:3 ../qt/src/Ui_OutputEditorText.hh:54 msgid "Replace current text" msgstr "Zastąp bieżący tekst" #. Output postprocessing #: ../gtk/data/OutputEditorText.ui.h:4 ../qt/src/Ui_OutputEditorText.hh:62 msgid "Keep line break if..." msgstr "Podział wiersza jeśli..." #: ../gtk/data/OutputEditorText.ui.h:5 ../qt/src/Ui_OutputEditorText.hh:64 msgid "Preceded by end mark (.?!)" msgstr "Kończy się znakiem (.?!)" #: ../gtk/data/OutputEditorText.ui.h:6 ../qt/src/Ui_OutputEditorText.hh:66 msgid "Preceded or succeeded by quote" msgstr "Cudzysłów na początku/końcu" #: ../gtk/data/OutputEditorText.ui.h:7 ../qt/src/Ui_OutputEditorText.hh:68 msgid "Other options" msgstr "Inne opcje" #: ../gtk/data/OutputEditorText.ui.h:8 ../qt/src/Ui_OutputEditorText.hh:70 msgid "Join hyphenated words" msgstr "Połącz podzielone" #: ../gtk/data/OutputEditorText.ui.h:9 ../qt/src/Ui_OutputEditorText.hh:72 msgid "Collapse whitespace" msgstr "Scal białe znaki" #: ../gtk/data/OutputEditorText.ui.h:10 ../qt/src/Ui_OutputEditorText.hh:74 msgid "Preserve paragraphs" msgstr "Zachowaj akapity" #: ../gtk/data/OutputEditorText.ui.h:11 ../qt/src/Ui_OutputEditorText.hh:76 msgid "Visual aids" msgstr "Pomocnicze" #: ../gtk/data/OutputEditorText.ui.h:12 ../qt/src/Ui_OutputEditorText.hh:78 msgid "Draw whitespace" msgstr "Pokaż białe znaki" #: ../gtk/data/OutputEditorText.ui.h:14 ../qt/src/Ui_OutputEditorText.hh:102 msgid "Strip line breaks on selected text" msgstr "Usuń podziały wierszy w zaznaczonym tekście" #: ../gtk/data/OutputEditorText.ui.h:16 ../qt/src/Ui_OutputEditorText.hh:109 #: ../qt/src/Ui_OutputEditorText.hh:110 msgid "Undo" msgstr "Cofnij" #: ../gtk/data/OutputEditorText.ui.h:17 ../qt/src/Ui_OutputEditorText.hh:112 #: ../qt/src/Ui_OutputEditorText.hh:113 msgid "Redo" msgstr "Ponów" #: ../gtk/data/PdfExportDialog.ui.h:1 ../qt/data/PdfExportDialog.ui.h:1 msgid "PDF Export" msgstr "Eksport PDF" #: ../gtk/data/PdfExportDialog.ui.h:4 ../qt/data/PdfExportDialog.ui.h:4 msgid "Output mode:" msgstr "Zapisz:" #: ../gtk/data/PdfExportDialog.ui.h:5 ../qt/data/PdfExportDialog.ui.h:6 msgid "PDF" msgstr "PDF" #: ../gtk/data/PdfExportDialog.ui.h:6 ../qt/data/PdfExportDialog.ui.h:7 msgid "PDF with invisible text overlay" msgstr "PDF z niewidoczną warstwą tekstową" #: ../gtk/data/PdfExportDialog.ui.h:7 ../qt/data/PdfExportDialog.ui.h:16 msgid "Format:" msgstr "Format:" #: ../gtk/data/PdfExportDialog.ui.h:8 ../qt/data/PdfExportDialog.ui.h:17 msgid "Compression:" msgstr "Kompresja:" #: ../gtk/data/PdfExportDialog.ui.h:9 ../qt/data/PdfExportDialog.ui.h:14 msgid "Compression quality:" msgstr "Jakość kompresji:" #: ../gtk/data/PdfExportDialog.ui.h:10 ../qt/data/PdfExportDialog.ui.h:15 msgid "DPI:" msgstr "DPI:" #: ../gtk/data/PdfExportDialog.ui.h:11 ../qt/data/PdfExportDialog.ui.h:18 msgid "Dithering algorithm:" msgstr "Algorytm ditheringu:" #: ../gtk/data/PdfExportDialog.ui.h:12 ../qt/data/PdfExportDialog.ui.h:13 msgid "Image settings:" msgstr "Ustawienia obrazu:" #: ../gtk/data/PdfExportDialog.ui.h:13 ../qt/data/PdfExportDialog.ui.h:25 msgid "Uniformize line and word spacing" msgstr "Wyrównaj odstępy między wierszami i wyrazami" #: ../gtk/data/PdfExportDialog.ui.h:14 ../qt/data/PdfExportDialog.ui.h:21 msgid "Override font family:" msgstr "Zastąp rodzinę czcionek:" #: ../gtk/data/PdfExportDialog.ui.h:15 ../qt/data/PdfExportDialog.ui.h:27 msgid "Fallback font family:" msgstr "Rodzina czcionek rezerwowych:" #: ../gtk/data/PdfExportDialog.ui.h:16 ../qt/data/PdfExportDialog.ui.h:20 msgid "Override font size:" msgstr "Zmień rozmiar czcionki:" #: ../gtk/data/PdfExportDialog.ui.h:17 ../qt/data/PdfExportDialog.ui.h:23 msgid "Font scaling:" msgstr "Skalowanie czcionek:" #: ../gtk/data/PdfExportDialog.ui.h:18 ../qt/data/PdfExportDialog.ui.h:26 msgid "pt" msgstr "pt" #: ../gtk/data/PdfExportDialog.ui.h:19 ../qt/data/PdfExportDialog.ui.h:22 msgid "Preserve spaces wider than:" msgstr "Zachowaj odstępy szersze niż:" #: ../gtk/data/PdfExportDialog.ui.h:20 ../qt/data/PdfExportDialog.ui.h:24 msgid "characters" msgstr "znaki" #: ../gtk/data/PdfExportDialog.ui.h:21 ../qt/data/PdfExportDialog.ui.h:28 msgid "Sanitize hyphens before line breaks" msgstr "" #: ../gtk/data/PdfExportDialog.ui.h:22 ../qt/data/PdfExportDialog.ui.h:19 msgid "Text settings:" msgstr "Kodowanie znaków:" #: ../gtk/data/PdfExportDialog.ui.h:23 ../qt/data/PdfExportDialog.ui.h:10 msgid "Paper size:" msgstr "Rozmiar papieru:" #: ../gtk/data/PdfExportDialog.ui.h:24 ../qt/data/PdfExportDialog.ui.h:11 msgid "Width" msgstr "Szerokość" #: ../gtk/data/PdfExportDialog.ui.h:25 ../qt/data/PdfExportDialog.ui.h:12 msgid "Height" msgstr "Wysokość" #: ../gtk/data/PdfExportDialog.ui.h:26 ../qt/data/PdfExportDialog.ui.h:29 msgid "Treat image sources as having true DPI:" msgstr "" #: ../gtk/data/PdfExportDialog.ui.h:27 ../qt/data/PdfExportDialog.ui.h:3 msgid "Basic" msgstr "Podstawowy" #: ../gtk/data/PdfExportDialog.ui.h:28 ../qt/data/PdfExportDialog.ui.h:31 msgid "PDF version:" msgstr "Wersja PDF:" #: ../gtk/data/PdfExportDialog.ui.h:29 ../qt/data/PdfExportDialog.ui.h:33 msgid "Password:" msgstr "Hasło:" #: ../gtk/data/PdfExportDialog.ui.h:30 ../qt/data/PdfExportDialog.ui.h:34 msgid "Confirm password:" msgstr "Potwierdź hasło:" #: ../gtk/data/PdfExportDialog.ui.h:31 ../qt/data/PdfExportDialog.ui.h:32 msgid "Encryption (optional):" msgstr "Szyfrowanie (opcjonalne):" #: ../gtk/data/PdfExportDialog.ui.h:32 ../qt/data/PdfExportDialog.ui.h:36 msgid "Author:" msgstr "Autor:" #: ../gtk/data/PdfExportDialog.ui.h:33 ../qt/data/PdfExportDialog.ui.h:38 msgid "Title:" msgstr "Tytuł:" #: ../gtk/data/PdfExportDialog.ui.h:34 ../qt/data/PdfExportDialog.ui.h:40 msgid "Subject:" msgstr "Temat:" #: ../gtk/data/PdfExportDialog.ui.h:35 ../qt/data/PdfExportDialog.ui.h:37 msgid "Creator:" msgstr "Twórca:" #: ../gtk/data/PdfExportDialog.ui.h:36 ../qt/data/PdfExportDialog.ui.h:39 msgid "Producer:" msgstr "Producent:" #: ../gtk/data/PdfExportDialog.ui.h:37 ../qt/data/PdfExportDialog.ui.h:41 msgid "Keywords:" msgstr "Słowa kluczowe:" #: ../gtk/data/PdfExportDialog.ui.h:38 ../qt/data/PdfExportDialog.ui.h:35 msgid "Additional information (optional):" msgstr "Dodatkowe informacje (opcjonalne):" #: ../gtk/data/PdfExportDialog.ui.h:39 ../qt/data/PdfExportDialog.ui.h:42 msgid "Import from current source" msgstr "Importuj z bieżącego źródła" #: ../gtk/data/PdfExportDialog.ui.h:40 ../qt/data/PdfExportDialog.ui.h:30 msgid "Advanced" msgstr "Zaawansowane" #: ../gtk/data/SearchReplaceFrame.ui.h:1 ../qt/data/SearchReplaceFrame.ui.h:4 msgid "Find" msgstr "Znajdź" #: ../gtk/data/SearchReplaceFrame.ui.h:2 ../qt/data/SearchReplaceFrame.ui.h:2 msgid "Replace" msgstr "Zamień" #: ../gtk/data/SearchReplaceFrame.ui.h:3 ../qt/data/SearchReplaceFrame.ui.h:3 msgid "Replace all" msgstr "Zamień wszystkie" #: ../gtk/data/SearchReplaceFrame.ui.h:4 ../qt/data/SearchReplaceFrame.ui.h:5 msgid "Find previous" msgstr "Znajdź poprzedni" #: ../gtk/data/SearchReplaceFrame.ui.h:5 ../qt/data/SearchReplaceFrame.ui.h:6 msgid "Find next" msgstr "Znajdź następny" #: ../gtk/data/SearchReplaceFrame.ui.h:6 ../qt/data/SearchReplaceFrame.ui.h:7 msgid "Match case" msgstr "Rozróżniaj wielkość liter" #: ../gtk/data/SearchReplaceFrame.ui.h:7 #: ../gtk/data/SubstitutionsManager.ui.h:1 ../qt/data/SearchReplaceFrame.ui.h:1 #: ../qt/src/SubstitutionsManager.cc:36 msgid "Substitutions" msgstr "Zamienniki" #: ../gtk/data/SelectionMenu.ui.h:1 ../qt/src/DisplayerToolSelect.cc:239 msgid "Delete" msgstr "Usuń" #: ../gtk/data/SelectionMenu.ui.h:2 ../qt/src/DisplayerToolSelect.cc:225 msgid "Order:" msgstr "Kolejność:" #: ../gtk/data/SelectionMenu.ui.h:3 ../gtk/src/hocr/DisplayerToolHOCR.cc:29 #: ../qt/src/DisplayerToolSelect.cc:240 ../qt/src/hocr/DisplayerToolHOCR.cc:31 msgid "Recognize" msgstr "Rozpoznaj" #: ../gtk/data/SelectionMenu.ui.h:4 ../qt/src/DisplayerToolSelect.cc:241 msgid "Recognize to clipboard" msgstr "Rozpoznaj do schowka" #: ../gtk/data/SelectionMenu.ui.h:5 ../qt/src/DisplayerToolSelect.cc:242 msgid "Save as image" msgstr "Zapisz jako obraz" #: ../gtk/data/SubstitutionsManager.ui.h:2 ../qt/src/SubstitutionsManager.cc:38 #: ../qt/src/SubstitutionsManager.cc:39 msgid "Open" msgstr "Otwórz" #: ../gtk/data/SubstitutionsManager.ui.h:3 ../gtk/src/Utils.cc:73 #: ../qt/src/SubstitutionsManager.cc:41 ../qt/src/SubstitutionsManager.cc:42 msgid "Save" msgstr "Zapisz" #: ../gtk/data/SubstitutionsManager.ui.h:4 ../qt/src/SubstitutionsManager.cc:44 #: ../qt/src/SubstitutionsManager.cc:45 msgid "Clear" msgstr "Wyczyść" #: ../gtk/data/SubstitutionsManager.ui.h:5 ../qt/data/ConfigDialog.ui.h:16 #: ../qt/src/SubstitutionsManager.cc:47 ../qt/src/SubstitutionsManager.cc:48 msgid "Add" msgstr "Dodaj" #: ../gtk/data/SubstitutionsManager.ui.h:6 #: ../gtk/src/hocr/OutputEditorHOCR.cc:886 ../qt/data/ConfigDialog.ui.h:17 #: ../qt/src/hocr/OutputEditorHOCR.cc:727 ../qt/src/SubstitutionsManager.cc:50 #: ../qt/src/SubstitutionsManager.cc:51 msgid "Remove" msgstr "Usuń" #: ../gtk/data/SubstitutionsManager.ui.h:7 ../gtk/data/TessdataManager.ui.h:2 msgid "Apply" msgstr "Zastosuj" #: ../gtk/data/SubstitutionsManager.ui.h:8 ../gtk/data/TessdataManager.ui.h:3 msgid "Close" msgstr "Zamknij" #: ../gtk/data/TessdataManager.ui.h:1 ../qt/src/TessdataManager.cc:49 msgid "Tessdata Manager" msgstr "Menadżer Tessdata" #: ../gtk/data/TessdataManager.ui.h:5 ../qt/src/TessdataManager.cc:51 msgid "Manage installed languages:" msgstr "Zarządzaj zainstalowanymi językami:" #: ../gtk/src/Acquirer.cc:79 ../qt/src/Acquirer.cc:70 msgid "scan.png" msgstr "scan.png" #: ../gtk/src/Acquirer.cc:91 ../qt/src/Acquirer.cc:85 msgid "Images" msgstr "Obrazy" #: ../gtk/src/Acquirer.cc:92 ../qt/src/Acquirer.cc:86 msgid "Choose Output Filename..." msgstr "Nazwa pliku wyjściowego..." #: ../gtk/src/Acquirer.cc:106 ../qt/src/Acquirer.cc:100 msgid "Failed to initialize the scanning backend." msgstr "Błąd inicjalizacji skanowania." #: ../gtk/src/Acquirer.cc:115 ../qt/src/Acquirer.cc:106 msgid "Scan failed" msgstr "Skanowanie nie powiodło się" #: ../gtk/src/Acquirer.cc:133 ../qt/src/Acquirer.cc:122 msgid "No scanners were detected." msgstr "Nie wykryto skanerów." #: ../gtk/src/Acquirer.cc:150 ../gtk/src/Acquirer.cc:168 #: ../qt/src/Acquirer.cc:136 ../qt/src/Acquirer.cc:154 msgid "Starting scan..." msgstr "Rozpoczęcie skanowania..." #: ../gtk/src/Acquirer.cc:164 ../qt/src/Acquirer.cc:150 msgid "Opening device..." msgstr "Otwieranie urządzenia..." #: ../gtk/src/Acquirer.cc:166 ../qt/src/Acquirer.cc:152 msgid "Setting options..." msgstr "Ustawianie opcji..." #: ../gtk/src/Acquirer.cc:170 ../qt/src/Acquirer.cc:156 msgid "Getting parameters..." msgstr "Pobieranie parametrów..." #: ../gtk/src/Acquirer.cc:172 ../qt/src/Acquirer.cc:158 msgid "Transferring data..." msgstr "Przesyłanie danych..." #: ../gtk/src/Acquirer.cc:179 ../qt/src/Acquirer.cc:165 msgid "Canceling scan..." msgstr "Anulowanie skanowania..." #: ../gtk/src/Config.cc:49 ../qt/data/ConfigDialog.ui.h:7 msgid "Filename prefix" msgstr "Prefiks nazwy pliku" #: ../gtk/src/Config.cc:50 ../qt/data/ConfigDialog.ui.h:8 msgid "Code" msgstr "Kod" #: ../gtk/src/Config.cc:51 ../qt/data/ConfigDialog.ui.h:9 msgid "Native name" msgstr "Nazwa oryginalna" #: ../gtk/src/Config.cc:109 ../qt/src/Config.cc:108 msgid "Script" msgstr "Skrypt" #: ../gtk/src/CrashHandler.cc:25 ../gtk/src/CrashHandler.cc:41 #: ../qt/src/CrashHandler.cc:36 msgid "Crash Handler" msgstr "Obsługa awarii" #: ../gtk/src/CrashHandler.cc:43 ../qt/src/CrashHandler.cc:31 msgid "Your work has been saved under %1." msgstr "Twój dokument został zapisany pod nazwą %1." #: ../gtk/src/CrashHandler.cc:45 ../qt/src/CrashHandler.cc:33 msgid "There was no unsaved work." msgstr "Nie było dokumentu do zapisania." #: ../gtk/src/CrashHandler.cc:106 ../qt/src/CrashHandler.cc:62 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:232 ../qt/src/Displayer.cc:174 msgid "Failed to load image" msgstr "Błąd wczytywania obrazu" #: ../gtk/src/Displayer.cc:232 ../qt/src/Displayer.cc:174 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:138 ../qt/src/DisplayerToolSelect.cc:135 msgid "PNG Images" msgstr "Obrazy PNG" #: ../gtk/src/DisplayerToolSelect.cc:139 ../qt/src/DisplayerToolSelect.cc:135 msgid "Save Selection Image" msgstr "Zapisz zaznaczenie jako obraz" #: ../gtk/src/DisplayerToolSelect.cc:139 ../qt/src/DisplayerToolSelect.cc:135 msgid "selection.png" msgstr "zaznaczenie.png" #: ../gtk/src/DisplayerToolSelect.cc:146 ../qt/src/DisplayerToolSelect.cc:142 msgid "Recognize all" msgstr "Rozpoznaj wszystko" #: ../gtk/src/DisplayerToolSelect.cc:146 ../qt/src/DisplayerToolSelect.cc:142 msgid "Recognize selection" msgstr "Rozpoznaj zaznaczenie" #: ../gtk/src/DisplayerToolSelect.cc:186 ../qt/src/DisplayerToolSelect.cc:182 msgid "Performing layout analysis" msgstr "Trwa analiza układu" #: ../gtk/src/FileDialogs.cc:235 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:237 msgid "Overwrite File?" msgstr "Zastąpić plik?" #: ../gtk/src/hocr/HOCRDocument.cc:611 ../gtk/src/hocr/OutputEditorHOCR.cc:266 #: ../qt/src/hocr/OutputEditorHOCR.cc:229 msgid "Page" msgstr "Strona" #: ../gtk/src/hocr/HOCRDocument.cc:613 ../qt/src/hocr/HOCRDocument.cc:530 msgid "Text block" msgstr "Blok tekstu" #: ../gtk/src/hocr/HOCRDocument.cc:615 ../gtk/src/hocr/OutputEditorHOCR.cc:272 #: ../qt/src/hocr/HOCRDocument.cc:532 ../qt/src/hocr/OutputEditorHOCR.cc:231 msgid "Paragraph" msgstr "Akapit" #: ../gtk/src/hocr/HOCRDocument.cc:617 ../qt/src/hocr/HOCRDocument.cc:534 msgid "Textline" msgstr "Wiersz tekstu" #: ../gtk/src/hocr/HOCRDocument.cc:621 ../qt/src/hocr/HOCRDocument.cc:538 msgid "Graphic" msgstr "Grafika" #: ../gtk/src/hocr/HOCROdtExporter.cc:65 ../gtk/src/hocr/HOCRPdfExporter.cc:489 #: ../gtk/src/hocr/HOCRTextExporter.cc:34 #: ../gtk/src/hocr/OutputEditorHOCR.cc:963 ../gtk/src/OutputEditorText.cc:272 #: ../qt/src/hocr/HOCROdtExporter.cc:50 ../qt/src/hocr/HOCRPdfExporter.cc:478 #: ../qt/src/hocr/HOCRTextExporter.cc:36 ../qt/src/hocr/OutputEditorHOCR.cc:830 #: ../qt/src/OutputEditorText.cc:238 msgid "output" msgstr "wynik" #: ../gtk/src/hocr/HOCROdtExporter.cc:68 ../qt/src/hocr/HOCROdtExporter.cc:53 msgid "OpenDocument Text Documents" msgstr "Dokumenty tekstowe w formacie OpenDocument" #: ../gtk/src/hocr/HOCROdtExporter.cc:69 ../qt/src/hocr/HOCROdtExporter.cc:53 msgid "Save ODT Output..." msgstr "Zapisz wynik jako ODT..." #: ../gtk/src/hocr/HOCROdtExporter.cc:77 ../gtk/src/hocr/HOCROdtExporter.cc:342 #: ../gtk/src/hocr/HOCRPdfExporter.cc:619 #: ../gtk/src/hocr/HOCRTextExporter.cc:46 ../qt/src/hocr/HOCROdtExporter.cc:61 #: ../qt/src/hocr/HOCRPdfExporter.cc:609 ../qt/src/hocr/HOCRTextExporter.cc:47 msgid "Export failed" msgstr "Błąd eksportu" #: ../gtk/src/hocr/HOCROdtExporter.cc:77 ../gtk/src/hocr/HOCROdtExporter.cc:342 #: ../qt/src/hocr/HOCROdtExporter.cc:61 msgid "The ODT export failed: unable to write output file." msgstr "Eksport ODT nie powiódł się: nie można zapisać pliku wyjściowego." #: ../gtk/src/hocr/HOCROdtExporter.cc:336 ../qt/src/hocr/HOCROdtExporter.cc:254 msgid "Exporting to ODT..." msgstr "Eksportowanie do ODT..." #: ../gtk/src/hocr/HOCRPdfExporter.cc:283 ../qt/src/hocr/HOCRPdfExporter.cc:365 msgid "Same as source" msgstr "Taki sam jak źródłowy" #: ../gtk/src/hocr/HOCRPdfExporter.cc:286 ../qt/src/hocr/HOCRPdfExporter.cc:366 msgid "Custom" msgstr "Niestandardowe" #: ../gtk/src/hocr/HOCRPdfExporter.cc:300 ../qt/src/hocr/HOCRPdfExporter.cc:362 msgid "cm" msgstr "cm" #: ../gtk/src/hocr/HOCRPdfExporter.cc:303 ../qt/src/hocr/HOCRPdfExporter.cc:363 msgid "in" msgstr "w" #: ../gtk/src/hocr/HOCRPdfExporter.cc:319 ../qt/src/hocr/HOCRPdfExporter.cc:353 msgid "Monochrome" msgstr "Monochromatyczny" #: ../gtk/src/hocr/HOCRPdfExporter.cc:328 ../qt/src/hocr/HOCRPdfExporter.cc:355 msgid "Threshold (closest color)" msgstr "Próg (najbliższy kolor)" #: ../gtk/src/hocr/HOCRPdfExporter.cc:331 ../qt/src/hocr/HOCRPdfExporter.cc:356 msgid "Diffuse" msgstr "Rozproszone" #: ../gtk/src/hocr/HOCRPdfExporter.cc:340 ../qt/src/hocr/HOCRPdfExporter.cc:357 msgid "Zip (lossless)" msgstr "Zip (bezstratny)" #: ../gtk/src/hocr/HOCRPdfExporter.cc:344 ../qt/src/hocr/HOCRPdfExporter.cc:358 msgid "CCITT Group 4 (lossless)" msgstr "CCITT Group 4 (bezstratny)" #: ../gtk/src/hocr/HOCRPdfExporter.cc:348 ../qt/src/hocr/HOCRPdfExporter.cc:359 msgid "Jpeg (lossy)" msgstr "JPEG (stratny)" #: ../gtk/src/hocr/HOCRPdfExporter.cc:493 ../qt/src/hocr/HOCRPdfExporter.cc:482 msgid "PDF Files" msgstr "Pliki PDF" #: ../gtk/src/hocr/HOCRPdfExporter.cc:494 ../qt/src/hocr/HOCRPdfExporter.cc:482 msgid "Save PDF Output..." msgstr "Zapisz wynik jako PDF..." #: ../gtk/src/hocr/HOCRPdfExporter.cc:500 ../qt/src/hocr/HOCRPdfExporter.cc:488 msgid "Invalid Output" msgstr "Nieprawidłowy wynik" #: ../gtk/src/hocr/HOCRPdfExporter.cc:500 ../qt/src/hocr/HOCRPdfExporter.cc:488 msgid "Cannot overwrite a file which is a source image of this document." msgstr "Nie można zastąpić pliku, który jest obrazem źródłowym tego dokumentu." #: ../gtk/src/hocr/HOCRPdfExporter.cc:516 ../qt/src/hocr/HOCRPdfExporter.cc:511 msgid "Failed to create output" msgstr "Błąd tworzenia pliku wynikowego" #: ../gtk/src/hocr/HOCRPdfExporter.cc:516 ../qt/src/hocr/HOCRPdfExporter.cc:511 msgid "Failed to create output. The returned error was: %1" msgstr "Błąd tworzenia pliku wynikowego. Zwrócony błąd to: %1" #: ../gtk/src/hocr/HOCRPdfExporter.cc:558 ../qt/src/hocr/HOCRPdfExporter.cc:551 msgid "The operation was cancelled" msgstr "Operacja została anulowana" #: ../gtk/src/hocr/HOCRPdfExporter.cc:607 ../qt/src/hocr/HOCRPdfExporter.cc:597 msgid "Failed to render page %1" msgstr "Błąd rozpoznawania strony %1" #: ../gtk/src/hocr/HOCRPdfExporter.cc:614 ../qt/src/hocr/HOCRPdfExporter.cc:604 msgid "Exporting to PDF..." msgstr "Eksportowanie do pliku PDF..." #: ../gtk/src/hocr/HOCRPdfExporter.cc:619 ../qt/src/hocr/HOCRPdfExporter.cc:609 msgid "The PDF export failed: %1." msgstr "Błąd eksportu do pliku PDF: %1." #: ../gtk/src/hocr/HOCRPdfExporter.cc:673 ../qt/src/hocr/HOCRPdfExporter.cc:662 msgid "The PDF library could not load the font '%1'." msgstr "Biblioteka PDF nie mogła wczytać czcionki '%1'." #: ../gtk/src/hocr/HOCRTextExporter.cc:37 ../gtk/src/OutputEditorText.cc:274 #: ../qt/src/hocr/HOCRTextExporter.cc:39 ../qt/src/OutputEditorText.cc:239 msgid "Text Files" msgstr "Pliki tekstowe" #: ../gtk/src/hocr/HOCRTextExporter.cc:38 ../qt/src/hocr/HOCRTextExporter.cc:39 msgid "Save Text Output..." msgstr "Zapisz tekst wynikowy..." #: ../gtk/src/hocr/HOCRTextExporter.cc:46 ../qt/src/hocr/HOCRTextExporter.cc:47 msgid "The text export failed: unable to write output file." msgstr "Eksport tekstu nie powiódł się: nie można zapisać pliku wyjściowego." #: ../gtk/src/hocr/OutputEditorHOCR.cc:269 #: ../qt/src/hocr/OutputEditorHOCR.cc:230 msgid "Block" msgstr "Blok" #: ../gtk/src/hocr/OutputEditorHOCR.cc:275 #: ../qt/src/hocr/OutputEditorHOCR.cc:232 msgid "Line" msgstr "Wiersz" #: ../gtk/src/hocr/OutputEditorHOCR.cc:278 #: ../qt/src/hocr/OutputEditorHOCR.cc:233 msgid "Word" msgstr "Słowo" #: ../gtk/src/hocr/OutputEditorHOCR.cc:281 #: ../qt/src/hocr/OutputEditorHOCR.cc:234 msgid "Misspelled word" msgstr "Błędna pisownia słowa" #: ../gtk/src/hocr/OutputEditorHOCR.cc:435 #: ../qt/src/hocr/OutputEditorHOCR.cc:317 msgid "" "The following pages could not be processed:\n" "%1" msgstr "" "Nie mogły zostać przetworzone strony:\n" "%1" #: ../gtk/src/hocr/OutputEditorHOCR.cc:436 #: ../qt/src/hocr/OutputEditorHOCR.cc:318 msgid "Recognition errors" msgstr "Błędy przetwarzania" #: ../gtk/src/hocr/OutputEditorHOCR.cc:594 #: ../qt/src/hocr/OutputEditorHOCR.cc:500 #: ../qt/src/hocr/OutputEditorHOCR.cc:512 msgid "Multiple values" msgstr "Wiele wartości" #. Merging allowed #: ../gtk/src/hocr/OutputEditorHOCR.cc:778 #: ../qt/src/hocr/OutputEditorHOCR.cc:641 msgid "Merge" msgstr "Połącz" #: ../gtk/src/hocr/OutputEditorHOCR.cc:786 #: ../gtk/src/hocr/OutputEditorHOCR.cc:877 #: ../qt/src/hocr/OutputEditorHOCR.cc:643 #: ../qt/src/hocr/OutputEditorHOCR.cc:725 msgid "Split from parent" msgstr "Podziel od rodzica" #. Swapping allowed #: ../gtk/src/hocr/OutputEditorHOCR.cc:797 #: ../qt/src/hocr/OutputEditorHOCR.cc:647 msgid "Swap" msgstr "Zamień" #: ../gtk/src/hocr/OutputEditorHOCR.cc:821 #: ../qt/src/hocr/OutputEditorHOCR.cc:693 msgid "Add graphic region" msgstr "Dodaj region graficzny" #: ../gtk/src/hocr/OutputEditorHOCR.cc:824 #: ../qt/src/hocr/OutputEditorHOCR.cc:694 msgid "Add text block" msgstr "Dodaj blok tekstu" #: ../gtk/src/hocr/OutputEditorHOCR.cc:828 #: ../qt/src/hocr/OutputEditorHOCR.cc:696 msgid "Add paragraph" msgstr "Dodaj akapit" #: ../gtk/src/hocr/OutputEditorHOCR.cc:832 #: ../qt/src/hocr/OutputEditorHOCR.cc:698 msgid "Add line" msgstr "Dodaj wiersz" #: ../gtk/src/hocr/OutputEditorHOCR.cc:836 #: ../qt/src/hocr/OutputEditorHOCR.cc:700 msgid "Add word" msgstr "Dodaj słowo" #: ../gtk/src/hocr/OutputEditorHOCR.cc:852 #: ../qt/src/hocr/OutputEditorHOCR.cc:710 msgid "No suggestions" msgstr "Brak sugestii" #: ../gtk/src/hocr/OutputEditorHOCR.cc:858 #: ../qt/src/hocr/OutputEditorHOCR.cc:714 msgid "Add to dictionary" msgstr "Dodaj do słownika" #: ../gtk/src/hocr/OutputEditorHOCR.cc:864 #: ../qt/src/hocr/OutputEditorHOCR.cc:716 msgid "Ignore word" msgstr "Ignoruj wyraz" #: ../gtk/src/hocr/OutputEditorHOCR.cc:926 #: ../gtk/src/hocr/OutputEditorHOCR.cc:965 #: ../qt/src/hocr/OutputEditorHOCR.cc:795 #: ../qt/src/hocr/OutputEditorHOCR.cc:832 msgid "hOCR HTML Files" msgstr "Pliki hOCR HTML" #: ../gtk/src/hocr/OutputEditorHOCR.cc:927 #: ../qt/src/hocr/OutputEditorHOCR.cc:795 msgid "Open hOCR File" msgstr "Otwórz plik hOCR" #: ../gtk/src/hocr/OutputEditorHOCR.cc:936 #: ../qt/src/hocr/OutputEditorHOCR.cc:802 msgid "Failed to open file" msgstr "Błąd otwierania pliku" #: ../gtk/src/hocr/OutputEditorHOCR.cc:936 #: ../qt/src/hocr/OutputEditorHOCR.cc:802 msgid "The file could not be opened: %1." msgstr "Nie można otworzyć pliku: %1." #: ../gtk/src/hocr/OutputEditorHOCR.cc:945 #: ../qt/src/hocr/OutputEditorHOCR.cc:809 msgid "Invalid hOCR file" msgstr "Nieprawidłowy plik hOCR" #: ../gtk/src/hocr/OutputEditorHOCR.cc:945 #: ../qt/src/hocr/OutputEditorHOCR.cc:809 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/hocr/OutputEditorHOCR.cc:966 #: ../qt/src/hocr/OutputEditorHOCR.cc:832 msgid "Save hOCR Output..." msgstr "Zapisz wynik jako hOCR..." #: ../gtk/src/hocr/OutputEditorHOCR.cc:973 ../gtk/src/OutputEditorText.cc:282 #: ../qt/src/hocr/OutputEditorHOCR.cc:839 ../qt/src/OutputEditorText.cc:246 msgid "Failed to save output" msgstr "Błąd zapisu pliku wynikowego" #: ../gtk/src/hocr/OutputEditorHOCR.cc:973 ../gtk/src/OutputEditorText.cc:282 #: ../qt/src/hocr/OutputEditorHOCR.cc:839 ../qt/src/OutputEditorText.cc:246 msgid "Check that you have writing permissions in the selected folder." msgstr "Sprawdź uprawnienia do zapisu w wybranym folderze." #: ../gtk/src/hocr/OutputEditorHOCR.cc:1035 ../gtk/src/OutputEditorText.cc:296 #: ../qt/src/hocr/OutputEditorHOCR.cc:894 ../qt/src/OutputEditorText.cc:259 msgid "Output not saved" msgstr "Wynik nie został zapisany" #: ../gtk/src/hocr/OutputEditorHOCR.cc:1035 ../gtk/src/OutputEditorText.cc:296 #: ../qt/src/hocr/OutputEditorHOCR.cc:894 ../qt/src/OutputEditorText.cc:259 msgid "Save output before proceeding?" msgstr "Czy zapisać wynik przed kontynuowaniem?" #: ../gtk/src/hocr/OutputEditorHOCR.cc:1156 ../gtk/src/OutputEditorText.cc:184 #: ../qt/src/hocr/OutputEditorHOCR.cc:991 ../qt/src/OutputEditorText.cc:152 msgid "Replacing..." msgstr "Zamiana..." #: ../gtk/src/hocr/OutputEditorHOCR.cc:1181 ../gtk/src/OutputEditorText.cc:192 #: ../qt/src/hocr/OutputEditorHOCR.cc:1014 ../qt/src/OutputEditorText.cc:160 msgid "Applying substitutions..." msgstr "Zamiana wyrazów..." #: ../gtk/src/MainWindow.cc:131 ../qt/src/MainWindow.cc:295 msgid "Using tesseract" msgstr "Użyty tesseract" #: ../gtk/src/MainWindow.cc:178 ../qt/src/MainWindow.cc:194 msgid "Select an image to begin..." msgstr "Wybierz pierwszy obraz..." #: ../gtk/src/MainWindow.cc:293 ../qt/src/MainWindow.cc:278 msgid "Multiple sources" msgstr "Wiele źródeł" #: ../gtk/src/MainWindow.cc:295 ../qt/src/MainWindow.cc:280 msgid "Ready" msgstr "Gotowy" #: ../gtk/src/MainWindow.cc:442 ../qt/src/MainWindow.cc:423 msgid "New version" msgstr "Nowa wersja" #: ../gtk/src/MainWindow.cc:442 ../qt/src/MainWindow.cc:423 msgid "gImageReader %1 is available" msgstr "gImageReader %1 jest dostępny" #: ../gtk/src/MainWindow.cc:443 ../qt/src/MainWindow.cc:424 msgid "Download" msgstr "Pobierz" #: ../gtk/src/MainWindow.cc:444 ../qt/src/MainWindow.cc:425 msgid "Changelog" msgstr "Lista zmian" #: ../gtk/src/MainWindow.cc:445 ../qt/src/MainWindow.cc:426 msgid "Don't notify again" msgstr "Nie powiadamiaj ponownie" #: ../gtk/src/MainWindow.cc:466 ../qt/src/MainWindow.cc:474 msgid "Don't show again" msgstr "Nie pokazuj ponownie" #: ../gtk/src/MainWindow.cc:467 ../gtk/src/MainWindow.cc:480 #: ../qt/src/MainWindow.cc:475 msgid "Install" msgstr "Zainstaluj" #: ../gtk/src/MainWindow.cc:487 ../qt/src/MainWindow.cc:487 msgid "Spelling dictionary missing" msgstr "Brak słownika" #: ../gtk/src/MainWindow.cc:487 ../qt/src/MainWindow.cc:487 msgid "The spellcheck dictionary for %1 is not installed" msgstr "Słownik dla %1 nie jest zainstalowany" #: ../gtk/src/MainWindow.cc:494 ../gtk/src/MainWindow.cc:523 #: ../qt/src/MainWindow.cc:493 msgid "Installing spelling dictionary for '%1'" msgstr "Instalacja słownika dla '%1'" #: ../gtk/src/MainWindow.cc:515 ../gtk/src/MainWindow.cc:536 #: ../gtk/src/MainWindow.cc:544 ../gtk/src/MainWindow.cc:592 #: ../gtk/src/MainWindow.cc:597 ../gtk/src/TessdataManager.cc:60 #: ../gtk/src/TessdataManager.cc:70 ../gtk/src/TessdataManager.cc:339 #: ../qt/src/MainWindow.cc:512 ../qt/src/MainWindow.cc:525 #: ../qt/src/MainWindow.cc:534 ../qt/src/MainWindow.cc:578 #: ../qt/src/MainWindow.cc:583 ../qt/src/TessdataManager.cc:74 #: ../qt/src/TessdataManager.cc:84 ../qt/src/TessdataManager.cc:315 msgid "Error" msgstr "Błąd" #: ../gtk/src/MainWindow.cc:515 ../qt/src/MainWindow.cc:512 msgid "Failed to install spelling dictionary: %1" msgstr "Błąd instalacji słownika: %1" #: ../gtk/src/MainWindow.cc:536 ../qt/src/MainWindow.cc:525 msgid "Failed to create directory for spelling dictionaries." msgstr "Nie udało się utworzyć katalogu dla słowników ortograficznych." #: ../gtk/src/MainWindow.cc:544 ../qt/src/MainWindow.cc:534 msgid "Could not read %1: %2." msgstr "Nie można odczytać%1: %2." #: ../gtk/src/MainWindow.cc:571 ../qt/src/MainWindow.cc:558 msgid "Downloading '%1'..." msgstr "Pobieranie '%1'..." #: ../gtk/src/MainWindow.cc:592 ../qt/src/MainWindow.cc:578 msgid "" "The following dictionaries could not be downloaded:\n" "%1\n" "\n" "Check the connectivity and directory permissions.\n" "Hint: If you don't have write permissions in system folders, you can switch " "to user paths in the settings dialog." msgstr "" "Nie można pobrać następujących słowników:\n" "%1\n" "\n" "Sprawdź dostęp i uprawnienia katalogów.\n" "Wskazówka: Jeśli nie masz uprawnień do zapisu w folderach systemowych, " "możesz przełączyć się na ścieżki użytkownika w oknie ustawień." #: ../gtk/src/MainWindow.cc:595 ../qt/src/MainWindow.cc:581 msgid "Dictionaries installed" msgstr "Słowniki zainstalowane" #: ../gtk/src/MainWindow.cc:595 msgid "" "The following dictionaries were installed:\n" "%1" msgstr "" "Zainstalowano następujące słowniki:\n" "%1" #: ../gtk/src/MainWindow.cc:597 ../qt/src/MainWindow.cc:583 msgid "No spelling dictionaries found for '%1'." msgstr "Nie znaleziono słowników dla '%1'." #: ../gtk/src/OutputEditorText.cc:154 ../qt/src/OutputEditorText.cc:137 msgid "Stripping line breaks..." msgstr "Usuwanie podziału wierszy..." #: ../gtk/src/OutputEditorText.cc:162 msgid "Check spelling" msgstr "Sprawdź pisownię" #: ../gtk/src/OutputEditorText.cc:231 ../qt/src/OutputEditorText.cc:196 msgid "File: %1" msgstr "Plik: %1" #: ../gtk/src/OutputEditorText.cc:234 ../qt/src/OutputEditorText.cc:199 msgid "Page: %1" msgstr "Strona: %1" #: ../gtk/src/OutputEditorText.cc:247 ../gtk/src/Recognizer.cc:471 #: ../qt/src/Recognizer.cc:462 msgid "" "\n" "[Failed to recognize page %1]\n" msgstr "" "\n" "[Błąd rozpoznawania strony %1]\n" #: ../gtk/src/OutputEditorText.cc:275 ../qt/src/OutputEditorText.cc:239 msgid "Save Output..." msgstr "Zapisz wynik..." #: ../gtk/src/Recognizer.cc:179 ../qt/src/Recognizer.cc:172 msgid "No languages available" msgstr "Brak dostępnych języków" #: ../gtk/src/Recognizer.cc:179 ../qt/src/Recognizer.cc:172 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:233 ../qt/src/Recognizer.cc:232 msgid "Multilingual" msgstr "Wielojęzyczne" #: ../gtk/src/Recognizer.cc:285 ../qt/src/Recognizer.cc:277 msgid "Automatic page segmentation" msgstr "Automatyczna segmentacja strony" #: ../gtk/src/Recognizer.cc:286 ../qt/src/Recognizer.cc:278 msgid "Page segmentation with orientation and script detection" msgstr "Podział strony na segmenty" #: ../gtk/src/Recognizer.cc:287 ../qt/src/Recognizer.cc:279 msgid "Assume single column of text" msgstr "Pojedyncza kolumna tekstu" #: ../gtk/src/Recognizer.cc:288 ../qt/src/Recognizer.cc:280 msgid "Assume single block of vertically aligned text" msgstr "Pojedynczy blok tekstu wyrównanego w pionie" #: ../gtk/src/Recognizer.cc:289 ../qt/src/Recognizer.cc:281 msgid "Assume a single uniform block of text" msgstr "Pojedynczy blok tekstu" #: ../gtk/src/Recognizer.cc:290 ../qt/src/Recognizer.cc:282 msgid "Assume a line of text" msgstr "Wiersz tekstu" #: ../gtk/src/Recognizer.cc:291 ../qt/src/Recognizer.cc:283 msgid "Assume a single word" msgstr "Pojedyncze słowo" #: ../gtk/src/Recognizer.cc:292 ../qt/src/Recognizer.cc:284 msgid "Assume a single word in a circle" msgstr "Pojedyncze słowo w okręgu" #: ../gtk/src/Recognizer.cc:293 ../qt/src/Recognizer.cc:285 msgid "Sparse text in no particular order" msgstr "Rzadki nieuporządkowany tekst" #: ../gtk/src/Recognizer.cc:294 ../qt/src/Recognizer.cc:286 msgid "Sparse text with orientation and script detection" msgstr "Rzadki uporządkowany tekst" #: ../gtk/src/Recognizer.cc:309 ../qt/src/Recognizer.cc:297 msgid "Page segmentation mode" msgstr "Tryb segmentacji" #: ../gtk/src/Recognizer.cc:313 ../qt/src/Recognizer.cc:300 msgid "Character whitelist / blacklist..." msgstr "" #: ../gtk/src/Recognizer.cc:319 ../qt/src/Recognizer.cc:305 msgid "Manage languages..." msgstr "Zarządzaj językami..." #: ../gtk/src/Recognizer.cc:375 ../qt/src/Recognizer.cc:369 msgid "Current selection" msgstr "Bieżące zaznaczenie" #: ../gtk/src/Recognizer.cc:465 ../qt/src/Recognizer.cc:455 msgid "Recognizing page %1 (%2 of %3)" msgstr "Rozpoznawanie strony %1 (%2 of %3)" #: ../gtk/src/Recognizer.cc:470 ../qt/src/Recognizer.cc:461 msgid "" "\n" "- Page %1: failed to render page" msgstr "" "\n" "- Strona %1: błąd wyświetlania strony" #: ../gtk/src/Recognizer.cc:501 ../gtk/src/Recognizer.cc:531 #: ../gtk/src/Recognizer.cc:544 ../qt/src/Recognizer.cc:491 #: ../qt/src/Recognizer.cc:521 ../qt/src/Recognizer.cc:534 msgid "Recognizing..." msgstr "Rozpoznawanie..." #: ../gtk/src/Recognizer.cc:505 ../gtk/src/Recognizer.cc:514 #: ../qt/src/Recognizer.cc:495 ../qt/src/Recognizer.cc:504 msgid "Recognition errors occurred" msgstr "Wystąpiły błędy rozpoznawania" #: ../gtk/src/Recognizer.cc:505 ../qt/src/Recognizer.cc:495 msgid "The following errors occurred:%1" msgstr "Wystąpiły następujące błędy:%1" #: ../gtk/src/Recognizer.cc:514 ../qt/src/Recognizer.cc:504 msgid "Failed to initialize tesseract" msgstr "Błąd inicjalizacji tesseract" #: ../gtk/src/scanner/ScannerSane.cc:84 ../gtk/src/scanner/ScannerTwain.cc:288 #: ../qt/src/scanner/ScannerSane.cc:85 ../qt/src/scanner/ScannerTwain.cc:286 msgid "Scan canceled" msgstr "Skanowanie anulowane" #: ../gtk/src/scanner/ScannerSane.cc:159 ../gtk/src/scanner/ScannerTwain.cc:186 #: ../qt/src/scanner/ScannerSane.cc:159 ../qt/src/scanner/ScannerTwain.cc:178 msgid "No scanner specified" msgstr "Nie wybrano skanera" #: ../gtk/src/scanner/ScannerSane.cc:168 ../gtk/src/scanner/ScannerTwain.cc:195 #: ../qt/src/scanner/ScannerSane.cc:168 ../qt/src/scanner/ScannerTwain.cc:187 msgid "Unable to connect to scanner" msgstr "Błąd połączenia ze skanerem" #: ../gtk/src/scanner/ScannerSane.cc:403 ../gtk/src/scanner/ScannerTwain.cc:266 #: ../gtk/src/scanner/ScannerTwain.cc:292 ../qt/src/scanner/ScannerSane.cc:403 #: ../qt/src/scanner/ScannerTwain.cc:258 ../qt/src/scanner/ScannerTwain.cc:290 msgid "Unable to start scan" msgstr "Nie można rozpocząć skanowania" #: ../gtk/src/scanner/ScannerSane.cc:411 ../gtk/src/scanner/ScannerSane.cc:461 #: ../gtk/src/scanner/ScannerTwain.cc:318 ../qt/src/scanner/ScannerSane.cc:411 #: ../qt/src/scanner/ScannerSane.cc:461 ../qt/src/scanner/ScannerTwain.cc:316 msgid "Error communicating with scanner" msgstr "Błąd komunikacji ze skanerem" #: ../gtk/src/scanner/ScannerSane.cc:520 ../qt/src/scanner/ScannerSane.cc:517 msgid "Failed to save image" msgstr "Błąd przy zapisie obrazu" #: ../gtk/src/scanner/ScannerSane.cc:800 ../qt/src/scanner/ScannerSane.cc:797 msgid "Operation is cancelled." msgstr "Operacja została anulowana." #: ../gtk/src/scanner/ScannerSane.cc:802 ../qt/src/scanner/ScannerSane.cc:799 msgid "Device is busy." msgstr "Urządzenie jest zajęte." #: ../gtk/src/scanner/ScannerSane.cc:804 ../qt/src/scanner/ScannerSane.cc:801 msgid "Cover is opened." msgstr "Pokrywa jest otwarta." #: ../gtk/src/scanner/ScannerSane.cc:806 ../qt/src/scanner/ScannerSane.cc:803 msgid "Document feeder jammed." msgstr "Zacięty podajnik dokumentów." #: ../gtk/src/scanner/ScannerSane.cc:808 ../qt/src/scanner/ScannerSane.cc:805 msgid "Document feeder out of documents." msgstr "Podajnik dokumentów spośród dokumentów." #: ../gtk/src/scanner/ScannerSane.cc:810 ../qt/src/scanner/ScannerSane.cc:807 msgid "Access to scanner is denied." msgstr "Odmowa dostępu do skanera." #: ../gtk/src/SourceManager.cc:118 ../qt/src/SourceManager.cc:124 msgid "PDFs with text" msgstr "Pliki PDF z tekstem" #: ../gtk/src/SourceManager.cc:118 ../qt/src/SourceManager.cc:124 msgid "" "These PDF files already contain text:\n" "%1" msgstr "" "Te pliki PDF zawierają już tekst:\n" "%1" #: ../gtk/src/SourceManager.cc:127 ../qt/src/SourceManager.cc:132 msgid "Unable to open files" msgstr "Nie można otworzyć plików" #: ../gtk/src/SourceManager.cc:127 ../qt/src/SourceManager.cc:132 msgid "The following files could not be opened:%1" msgstr "Nie można otworzyć plików: %1" #: ../gtk/src/SourceManager.cc:141 ../qt/src/SourceManager.cc:143 msgid "Enter password for file '%1':" msgstr "Podaj hasło dla pliku '%1':" #: ../gtk/src/SourceManager.cc:197 ../qt/src/SourceManager.cc:214 msgid "Images and PDFs" msgstr "Obrazy i PDF" #: ../gtk/src/SourceManager.cc:202 ../qt/src/SourceManager.cc:215 msgid "Select Files" msgstr "Wybierz pliki" #: ../gtk/src/SourceManager.cc:208 ../qt/src/SourceManager.cc:226 msgid "Clipboard Error" msgstr "Błąd schowka" #: ../gtk/src/SourceManager.cc:208 ../qt/src/SourceManager.cc:226 msgid "Failed to read the clipboard." msgstr "Błąd odczytu schowka." #: ../gtk/src/SourceManager.cc:212 ../qt/src/SourceManager.cc:230 #: ../qt/src/SourceManager.cc:236 msgid "Pasted %1" msgstr "Wklejone %1" #: ../gtk/src/SourceManager.cc:224 ../qt/src/SourceManager.cc:243 msgid "Screenshot Error" msgstr "Błąd zrzutu ekranu" #: ../gtk/src/SourceManager.cc:224 ../qt/src/SourceManager.cc:243 msgid "Failed to take screenshot." msgstr "Nie udało się wykonać zrzutu ekranu." #: ../gtk/src/SourceManager.cc:228 ../qt/src/SourceManager.cc:247 msgid "Screenshot %1" msgstr "Zrzut ekranu %1" #: ../gtk/src/SourceManager.cc:233 ../qt/src/SourceManager.cc:252 msgid "Saving image..." msgstr "Zapisywanie obrazu..." #: ../gtk/src/SourceManager.cc:240 ../qt/src/SourceManager.cc:265 msgid "Cannot Write File" msgstr "Nie można zapisać pliku" #: ../gtk/src/SourceManager.cc:240 ../qt/src/SourceManager.cc:265 msgid "Could not write to %1." msgstr "Nie można zapisać do % 1." #: ../gtk/src/SourceManager.cc:267 ../qt/src/SourceManager.cc:287 msgid "Delete File?" msgstr "Usunąć plik?" #: ../gtk/src/SourceManager.cc:267 ../qt/src/SourceManager.cc:287 msgid "The following files will be deleted:%1" msgstr "Zostanie usunięty plik:%1" #: ../gtk/src/SourceManager.cc:332 ../qt/src/SourceManager.cc:338 msgid "Missing File" msgstr "Brak pliku" #: ../gtk/src/SourceManager.cc:332 ../qt/src/SourceManager.cc:338 msgid "" "The following file has been deleted or moved:\n" "%1" msgstr "" "Plik został usunięty albo przeniesiony:\n" "%1" #: ../gtk/src/SubstitutionsManager.cc:33 ../qt/src/SubstitutionsManager.cc:73 msgid "Search for" msgstr "Szukaj" #: ../gtk/src/SubstitutionsManager.cc:34 ../qt/src/SubstitutionsManager.cc:73 msgid "Replace with" msgstr "Zastąp" #: ../gtk/src/SubstitutionsManager.cc:69 ../gtk/src/SubstitutionsManager.cc:103 #: ../qt/src/SubstitutionsManager.cc:106 ../qt/src/SubstitutionsManager.cc:143 msgid "Substitutions List" msgstr "Lista zamienników" #: ../gtk/src/SubstitutionsManager.cc:70 ../qt/src/SubstitutionsManager.cc:106 msgid "Open Substitutions List" msgstr "Otwórz listę zamienników" #: ../gtk/src/SubstitutionsManager.cc:75 ../qt/src/SubstitutionsManager.cc:112 msgid "Error Reading File" msgstr "Błąd odczytu pliku" #: ../gtk/src/SubstitutionsManager.cc:75 ../qt/src/SubstitutionsManager.cc:112 msgid "Unable to read '%1'." msgstr "Błąd odczytu '%1'." #: ../gtk/src/SubstitutionsManager.cc:97 ../qt/src/SubstitutionsManager.cc:137 msgid "Errors Occurred Reading File" msgstr "Błąd odczytu pliku" #: ../gtk/src/SubstitutionsManager.cc:97 ../qt/src/SubstitutionsManager.cc:137 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:104 ../qt/src/SubstitutionsManager.cc:143 msgid "Save Substitutions List" msgstr "Zapisz listę zamienników" #: ../gtk/src/SubstitutionsManager.cc:110 ../qt/src/SubstitutionsManager.cc:149 msgid "Error Saving File" msgstr "Błąd zapisu pliku" #: ../gtk/src/SubstitutionsManager.cc:110 ../qt/src/SubstitutionsManager.cc:149 msgid "Unable to write to '%1'." msgstr "Błąd zapisu '%1'." #: ../gtk/src/SubstitutionsManager.cc:127 ../qt/src/SubstitutionsManager.cc:162 msgid "Save List?" msgstr "Zapisać listę?" #: ../gtk/src/SubstitutionsManager.cc:127 ../qt/src/SubstitutionsManager.cc:162 msgid "Do you want to save the current list?" msgstr "Czy zapisać bieżącą listę?" #: ../gtk/src/TessdataManager.cc:60 ../qt/src/TessdataManager.cc:74 #, fuzzy msgid "" "A session connection to the PackageKit backend is required for managing " "system-wide tesseract language packs, but it was not found. This service is " "usually provided by a software-management application such as Gnome " "Software. Please install software which provides the necessary PackageKit " "interface, use other system package management software to manage the " "tesseract language packs directly, or switch to using the user tessdata path " "in the configuration dialog." msgstr "" "Pakiet PackageKit jest wymagany do zarządzania pakietami językowymi " "tesseract dla całego systemu, ale nie został znaleziony. Użyj oprogramowania " "do zarządzania pakietami systemowymi, aby zarządzać pakietami językowymi " "tesseract, lub przełącz się, aby użyć ścieżki użytkownika tessdata w oknie " "konfiguracji." #: ../gtk/src/TessdataManager.cc:65 ../qt/src/TessdataManager.cc:79 msgid "Fetching available languages" msgstr "Pobieranie dostępnych języków" #: ../gtk/src/TessdataManager.cc:70 ../gtk/src/TessdataManager.cc:96 #: ../gtk/src/TessdataManager.cc:197 ../qt/src/TessdataManager.cc:84 #: ../qt/src/TessdataManager.cc:101 ../qt/src/TessdataManager.cc:197 msgid "Failed to fetch list of available languages: %1" msgstr "Błąd pobierania listy dostępnych języków: %1" #: ../gtk/src/TessdataManager.cc:104 ../qt/src/TessdataManager.cc:113 #: ../qt/src/TessdataManager.cc:122 msgid "Parsing error: %1" msgstr "Błąd parsowania: %1" #: ../gtk/src/TessdataManager.cc:235 ../qt/src/TessdataManager.cc:232 msgid "Applying changes..." msgstr "Wprowadzanie zmian..." #: ../gtk/src/TessdataManager.cc:297 ../qt/src/TessdataManager.cc:278 msgid "Failed to create directory for tessdata files." msgstr "Błąd przy tworzeniu katalogu dla plików tessdata." #: ../gtk/src/TessdataManager.cc:306 ../qt/src/TessdataManager.cc:287 msgid "Downloading %1..." msgstr "Pobieranie %1..." #: ../gtk/src/TessdataManager.cc:330 msgid "" "The following files could not be downloaded or removed:\n" "%1\n" "\n" "Check the connectivity and directory permissions.\n" "\n" "Hint: If you don't have write permissions in system folders, you can switch " "to user paths in the settings dialog." msgstr "" "Nie można pobrać lub usunąć następujących plików::\n" "%1\n" "\n" "Sprawdź dostęp i uprawnienia do katalogu.\n" "\n" "Wskazówka: Jeśli nie masz uprawnień do zapisu w folderach systemowych, " "możesz przełączyć się na ścieżki użytkownika w oknie ustawień." #: ../gtk/src/Utils.cc:64 msgid "Yes" msgstr "Tak" #: ../gtk/src/Utils.cc:67 msgid "No" msgstr "Nie" #: ../gtk/src/Utils.cc:76 msgid "Discard" msgstr "Odrzuć" #: ../qt/data/AboutDialog.ui.h:1 msgid "About gImageReader" msgstr "O programie gImageReader" #: ../qt/data/AboutDialog.ui.h:3 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 "" "

Aplikacja uległa " "awarii.

Przepraszam za utrudnienia. Aby pomóc w ulepszeniu " "aplikacji, rozważ zgłoszenie problemu na adres manisandro@gmail.com. Opisz działania wykonywane przed awarią programu i dołącz poniższą " "informację. Dziękuję.

" #: ../qt/data/CrashHandler.ui.h:3 msgid "" "

Tesseract has " "aborted

Tesseract (the OCR engine) has aborted while " "recognizing text. This may occur if the used traineddatas are corrupt or " "incomplatible with the version of tesseract in use, or due to a bug in " "tesseract.

The stacktrace below may provide additional information " "about where the crash occured.

" msgstr "" #: ../qt/data/MainWindow.ui.h:17 msgid "Flatbed" msgstr "Płaski" #: ../qt/data/MainWindow.ui.h:18 msgid "ADF Front" msgstr "Przedni podajnik ADF" #: ../qt/data/MainWindow.ui.h:19 msgid "ADF Back" msgstr "Tylny podajnik ADF" #: ../qt/data/MainWindow.ui.h:20 msgid "ADF Duplex" msgstr "Dupleks ADF" #. Remove & from some labels which designer insists in adding #: ../qt/data/MainWindow.ui.h:21 ../qt/src/Ui_MainWindow.hh:50 msgid "Sources" msgstr "Źródła" #: ../qt/data/MainWindow.ui.h:22 msgid "Zoom In" msgstr "Powiększ" #: ../qt/data/MainWindow.ui.h:24 msgid "Zoom Out" msgstr "Pomniejsz" #: ../qt/data/MainWindow.ui.h:26 msgid "Normal Size" msgstr "Rozmiar normalny" #: ../qt/data/MainWindow.ui.h:28 msgid "Best Fit" msgstr "Dopasowanie" #: ../qt/data/MainWindow.ui.h:30 msgid "Rotate Left" msgstr "Obróć w lewo" #: ../qt/data/MainWindow.ui.h:31 msgid "Rotate left" msgstr "Obróć w lewo" #: ../qt/data/MainWindow.ui.h:32 msgid "Rotate Right" msgstr "Obróć w prawo" #: ../qt/data/MainWindow.ui.h:33 msgid "Rotate right" msgstr "Obróć w prawo" #: ../qt/data/MainWindow.ui.h:34 msgid "Image Controls" msgstr "Dopasowanie obrazu" #: ../qt/data/MainWindow.ui.h:36 msgid "Autodetect Layout" msgstr "Wykryj układ" #: ../qt/data/MainWindow.ui.h:38 msgid "Toggle Output Pane" msgstr "Pokaż/ukryj panel wyniku" #: ../qt/data/PdfExportDialog.ui.h:5 msgid "Backend:" msgstr "Kontekst:" #: ../qt/data/PdfExportDialog.ui.h:8 msgid "Portrait" msgstr "Portret" #: ../qt/data/PdfExportDialog.ui.h:9 msgid "Landscape" msgstr "Krajobraz" #: ../qt/src/hocr/HOCRPdfExporter.cc:142 msgid "Failed to write to file" msgstr "Nie można zapisać do pliku" #. Output toolbar #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:55 #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:56 msgid "Open hOCR file" msgstr "Otwórz plik hOCR" #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:57 #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:58 msgid "Save as hOCR text" msgstr "Zapisz jako hOCR" #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:79 #: ../qt/src/Ui_OutputEditorText.hh:106 msgid "Find and Replace" msgstr "Znajdź i zamień" #: ../qt/src/MainWindow.cc:581 #, fuzzy msgid "" "The following dictionary files were installed:\n" "%1" msgstr "Zainstalowano słowniki:%1" #: ../qt/src/TessdataManager.cc:308 msgid "" "The following files could not be downloaded or removed:\n" "%1\n" "\n" "Check the connectivity and directory permissions.\n" "Hint: If you don't have write permissions in system folders, you can switch " "to user paths in the settings dialog." msgstr "" "Następujące pliki nie mogły zostać pobrane lub usunięte:\n" "%1\n" "\n" "Sprawdź dostęp i uprawnienia do katalogu.\n" "Wskazówka: Jeśli nie masz uprawnień do zapisu w folderach systemowych, " "możesz przełączyć się na ścieżki użytkownika w oknie ustawień." #: ../qt/src/Ui_MainWindow.hh:51 msgid "Output" msgstr "Wynik" #: ../qt/src/Ui_MainWindow.hh:135 msgid "OCR mode:" msgstr "Tryb OCR:" #: ../qt/src/Ui_MainWindow.hh:209 msgid "Remove Image" msgstr "Usuń obraz" #: ../qt/src/Ui_MainWindow.hh:212 msgid "Delete Image" msgstr "Skasuj obraz" #: ../qt/src/Ui_MainWindow.hh:215 msgid "Clear List" msgstr "Wyczyść listę" #: ../qt/src/Ui_OutputEditorText.hh:101 msgid "Strip Line Breaks" msgstr "Usuń podziały wierszy" #: ../qt/src/Ui_OutputEditorText.hh:115 msgid "Save Output" msgstr "Zapisz wynik" #: ../qt/src/Ui_OutputEditorText.hh:117 msgid "Clear Output" msgstr "Wyczyść wynik" #~ msgid "The application has crashed" #~ msgstr "Program uległ awarii" #~ 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." #~ msgid "Could not read %1: %2" #~ msgstr "Nie można odczytać %1: %2" #~ msgid "gImageReader" #~ msgstr "gImageReader" #, 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 "Document font:" #~ msgstr "Czcionka dokumentu:" #~ msgid "Scale:" #~ msgstr "Skala:" #~ msgid "Document" #~ msgstr "Dokument" #~ msgid "Errors occurred" #~ msgstr "WystÄ…piÅ‚y błędy" #~ msgid "" #~ "The following pages could not be rendered:\n" #~ "%1" #~ msgstr "" #~ "NastÄ™pujÄ…ce strony nie mogÄ… być wyÅ›wietlone:\n" #~ "%1" #~ msgid "substitution_list.txt" #~ msgstr "lista_zamiennikow.txt" #~ 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.3.1/po/pt.po000066400000000000000000002015751351740627400154560ustar00rootroot00000000000000msgid "" msgstr "" "Project-Id-Version: Portuguese (Brazil) (gImageReader)\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2019-07-25 23:17+0200\n" "PO-Revision-Date: 2019-01-27 21:05+0000\n" "Last-Translator: ssantos \n" "Language-Team: Portuguese \n" "Language: pt\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n > 1;\n" "X-Generator: Weblate 3.5-dev\n" #: ../data/gimagereader.desktop.in.h:1 msgid "OCR application" msgstr "Aplicativo de OCR" #: ../gtk/data/appmenu.ui.h:1 ../qt/src/Ui_MainWindow.hh:167 msgid "Redetect Languages" msgstr "Detectar idiomas novamente" #: ../gtk/data/appmenu.ui.h:2 ../qt/src/Ui_MainWindow.hh:170 msgid "Manage Languages" msgstr "Gerenciar Idiomas" #: ../gtk/data/appmenu.ui.h:3 ../gtk/data/ConfigDialog.ui.h:1 #: ../qt/data/ConfigDialog.ui.h:1 ../qt/src/Ui_MainWindow.hh:173 msgid "Preferences" msgstr "Preferências" #: ../gtk/data/appmenu.ui.h:4 ../gtk/data/ConfigDialog.ui.h:2 #: ../gtk/src/MainWindow.cc:482 ../qt/src/MainWindow.cc:481 #: ../qt/src/Ui_MainWindow.hh:178 msgid "Help" msgstr "Ajuda" #: ../gtk/data/appmenu.ui.h:5 ../qt/data/AboutDialog.ui.h:2 #: ../qt/src/Ui_MainWindow.hh:181 msgid "About" msgstr "Sobre" #: ../gtk/data/appmenu.ui.h:6 msgid "Quit" msgstr "Sair" #: ../gtk/data/ConfigDialog.ui.h:3 ../gtk/data/MainWindow.ui.h:47 #: ../gtk/data/OutputEditorHOCR.ui.h:3 ../gtk/data/PdfExportDialog.ui.h:3 #: ../gtk/src/FileDialogs.cc:152 ../gtk/src/Utils.cc:61 #: ../qt/data/ConfigDialog.ui.h:26 msgid "OK" msgstr "OK" #: ../gtk/data/ConfigDialog.ui.h:4 msgid "Output pane orientation:" msgstr "Orientação do painel de saída:" #: ../gtk/data/ConfigDialog.ui.h:5 msgid "Horizontal" msgstr "Horizontal" #: ../gtk/data/ConfigDialog.ui.h:6 msgid "Vertical" msgstr "Vertical" #: ../gtk/data/ConfigDialog.ui.h:7 ../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/ConfigDialog.ui.h:8 ../qt/data/ConfigDialog.ui.h:4 msgid "Automatically check for new program versions" msgstr "Verificar automaticamente novas versões do programa" #: ../gtk/data/ConfigDialog.ui.h:9 ../qt/data/ConfigDialog.ui.h:3 msgid "Predefined language definitions:" msgstr "Definições de idioma predefinidas:" #: ../gtk/data/ConfigDialog.ui.h:10 ../qt/data/ConfigDialog.ui.h:12 msgid "Additional language definitions:" msgstr "Definições de idiomas adicionais:" #: ../gtk/data/ConfigDialog.ui.h:11 ../qt/data/ConfigDialog.ui.h:20 msgid "The prefix of the tesseract language data file" msgstr "O prefixo do ficheiro de dados do idioma do tesseract" #: ../gtk/data/ConfigDialog.ui.h:12 ../qt/data/ConfigDialog.ui.h:21 msgid "Prefix" msgstr "Prefixo" #: ../gtk/data/ConfigDialog.ui.h:13 ../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/ConfigDialog.ui.h:14 ../qt/data/ConfigDialog.ui.h:23 msgid "ISO Code" msgstr "Código ISO" #: ../gtk/data/ConfigDialog.ui.h:15 ../qt/data/ConfigDialog.ui.h:24 msgid "The name of the language" msgstr "O nome do idioma" #: ../gtk/data/ConfigDialog.ui.h:16 ../qt/data/ConfigDialog.ui.h:25 msgid "Name" msgstr "Nome" #: ../gtk/data/ConfigDialog.ui.h:17 ../gtk/data/MainWindow.ui.h:46 #: ../gtk/data/OutputEditorHOCR.ui.h:2 ../gtk/data/PdfExportDialog.ui.h:2 #: ../gtk/src/Acquirer.cc:34 ../gtk/src/FileDialogs.cc:151 #: ../gtk/src/Utils.cc:70 ../qt/data/ConfigDialog.ui.h:27 #: ../qt/data/MainWindow.ui.h:12 msgid "Cancel" msgstr "Cancelar" #: ../gtk/data/ConfigDialog.ui.h:18 ../qt/data/ConfigDialog.ui.h:5 msgid "Output pane font:" msgstr "Fonte do painel de saída:" #: ../gtk/data/ConfigDialog.ui.h:19 ../qt/data/ConfigDialog.ui.h:2 msgid "Default" msgstr "Padrão" #: ../gtk/data/ConfigDialog.ui.h:20 ../qt/data/ConfigDialog.ui.h:6 msgid "Language data locations:" msgstr "Locais de dados de idioma:" #: ../gtk/data/ConfigDialog.ui.h:21 ../qt/data/ConfigDialog.ui.h:13 msgid "Language definitions path:" msgstr "Caminho de definições de idioma:" #: ../gtk/data/ConfigDialog.ui.h:22 ../qt/data/ConfigDialog.ui.h:28 msgid "Spelling dictionaries path:" msgstr "Caminho de dicionários de ortografia:" #: ../gtk/data/ConfigDialog.ui.h:23 ../qt/data/ConfigDialog.ui.h:10 msgid "System-wide paths" msgstr "Caminhos de todo o sistema" #: ../gtk/data/ConfigDialog.ui.h:24 ../qt/data/ConfigDialog.ui.h:11 msgid "User paths" msgstr "Caminhos de usuário" #: ../gtk/data/ConfigDialog.ui.h:25 ../qt/data/ConfigDialog.ui.h:29 msgid "Automatically open exported documents with default application" msgstr "Abrir automaticamente documentos exportados com o aplicativo padrão" #: ../gtk/data/CrashHandler.ui.h:1 ../qt/src/CrashHandler.cc:38 msgid "Regenerate backtrace" msgstr "Regenerar backtrace" #: ../gtk/data/CrashHandler.ui.h:3 #, fuzzy, no-c-format msgid "" "The application has crashed\n" "\n" "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/CrashHandler.ui.h:6 msgid "" "Tesseract has aborted\n" "\n" "Tesseract (the OCR engine) has aborted while recognizing text. This may " "occur if the used traineddatas are corrupt or incomplatible with the version " "of tesseract in use, or due to a bug in tesseract.\n" "\n" "The stacktrace below may provide additional information about where the " "crash occured.\n" msgstr "" #: ../gtk/data/MainWindow.ui.h:1 ../qt/data/MainWindow.ui.h:39 msgid "Toggle output pane" msgstr "Alternar exibição do painel de saída" #: ../gtk/data/MainWindow.ui.h:2 ../qt/src/Ui_MainWindow.hh:66 msgid "Rotate current page" msgstr "Girar a página atual" #: ../gtk/data/MainWindow.ui.h:3 ../qt/src/Ui_MainWindow.hh:67 msgid "Rotate all pages" msgstr "Rodar todas as páginas" #. Sources toolbar #: ../gtk/data/MainWindow.ui.h:4 ../qt/src/Ui_MainWindow.hh:192 msgid "Recent" msgstr "Recente" #: ../gtk/data/MainWindow.ui.h:5 ../qt/src/Ui_MainWindow.hh:193 msgid "Paste" msgstr "Colar" #: ../gtk/data/MainWindow.ui.h:6 ../qt/src/Ui_MainWindow.hh:194 msgid "Take Screenshot" msgstr "Capturar o ecrã" #: ../gtk/data/MainWindow.ui.h:7 ../qt/data/MainWindow.ui.h:23 msgid "Zoom in" msgstr "Aumentar zoom" #: ../gtk/data/MainWindow.ui.h:8 ../qt/data/MainWindow.ui.h:25 msgid "Zoom out" msgstr "Diminuir zoom" #: ../gtk/data/MainWindow.ui.h:9 ../qt/data/MainWindow.ui.h:27 msgid "Normal size" msgstr "Tamanho normal" #: ../gtk/data/MainWindow.ui.h:10 ../qt/data/MainWindow.ui.h:29 msgid "Best fit" msgstr "Melhor ajuste" #: ../gtk/data/MainWindow.ui.h:11 ../qt/src/Ui_MainWindow.hh:75 msgid "Select rotation mode" msgstr "Selecione o modo de rotação" #: ../gtk/data/MainWindow.ui.h:12 ../gtk/data/OutputEditorText.ui.h:13 #: ../qt/src/Ui_OutputEditorText.hh:95 msgid "Select insert mode" msgstr "Selecione o modo de inserção" #: ../gtk/data/MainWindow.ui.h:13 ../qt/src/Ui_MainWindow.hh:109 #, fuzzy msgid "Select page" msgstr "Escolher idioma" #: ../gtk/data/MainWindow.ui.h:14 ../qt/data/MainWindow.ui.h:35 msgid "Image controls" msgstr "Controles de imagem" #: ../gtk/data/MainWindow.ui.h:15 ../qt/src/Ui_MainWindow.hh:139 msgid "Plain text" msgstr "Texto sem formatação" #: ../gtk/data/MainWindow.ui.h:16 ../qt/src/Ui_MainWindow.hh:139 msgid "hOCR, PDF" msgstr "hOCR, PDF" #: ../gtk/data/MainWindow.ui.h:17 ../qt/data/MainWindow.ui.h:37 msgid "Autodetect layout" msgstr "Detectar layout automaticamente" #: ../gtk/data/MainWindow.ui.h:18 msgid "Recognize all" msgstr "Reconhecer tudo" #: ../gtk/data/MainWindow.ui.h:19 msgid "Select language" msgstr "Escolher idioma" #: ../gtk/data/MainWindow.ui.h:20 ../qt/src/Ui_MainWindow.hh:205 msgid "Add images" msgstr "Adicionar imagens" #: ../gtk/data/MainWindow.ui.h:21 ../qt/src/Ui_MainWindow.hh:204 msgid "Add Images" msgstr "Adicionar imagens" #: ../gtk/data/MainWindow.ui.h:22 ../qt/src/Ui_MainWindow.hh:210 msgid "Remove image from list" msgstr "Remover imagem da lista" #: ../gtk/data/MainWindow.ui.h:23 ../qt/src/Ui_MainWindow.hh:213 msgid "Delete image" msgstr "Apagar imagem" #: ../gtk/data/MainWindow.ui.h:24 ../qt/src/Ui_MainWindow.hh:216 msgid "Clear list" msgstr "Limpar lista" #: ../gtk/data/MainWindow.ui.h:25 ../qt/data/MainWindow.ui.h:5 msgid "Files" msgstr "Arquivos" #: ../gtk/data/MainWindow.ui.h:26 ../qt/data/MainWindow.ui.h:8 msgid "Device:" msgstr "Dispositivo:" #: ../gtk/data/MainWindow.ui.h:27 ../gtk/data/TessdataManager.ui.h:4 #: ../qt/data/MainWindow.ui.h:7 ../qt/src/TessdataManager.cc:59 msgid "Refresh" msgstr "Atualizar" #: ../gtk/data/MainWindow.ui.h:28 ../qt/data/MainWindow.ui.h:9 msgid "Output:" msgstr "Saída:" #: ../gtk/data/MainWindow.ui.h:29 ../qt/data/MainWindow.ui.h:13 msgid "Mode:" msgstr "Modo:" #: ../gtk/data/MainWindow.ui.h:30 ../gtk/src/hocr/HOCRPdfExporter.cc:313 #: ../qt/data/MainWindow.ui.h:15 ../qt/src/hocr/HOCRPdfExporter.cc:347 msgid "Color" msgstr "Cor" #: ../gtk/data/MainWindow.ui.h:31 ../gtk/src/hocr/HOCRPdfExporter.cc:316 #: ../qt/data/MainWindow.ui.h:14 ../qt/src/hocr/HOCRPdfExporter.cc:349 #: ../qt/src/hocr/HOCRPdfExporter.cc:351 msgid "Grayscale" msgstr "Escala de cinza" #: ../gtk/data/MainWindow.ui.h:32 ../qt/data/MainWindow.ui.h:10 msgid "Resolution:" msgstr "Resolução:" #: ../gtk/data/MainWindow.ui.h:33 ../qt/data/MainWindow.ui.h:11 msgid "Scan" msgstr "Digitalizar" #: ../gtk/data/MainWindow.ui.h:34 ../qt/data/MainWindow.ui.h:16 msgid "Source:" msgstr "Origem:" #: ../gtk/data/MainWindow.ui.h:35 ../qt/data/MainWindow.ui.h:6 msgid "Acquire" msgstr "Obter" #: ../gtk/data/MainWindow.ui.h:36 ../qt/data/MainWindow.ui.h:1 msgid "Brightness" msgstr "Brilho" #: ../gtk/data/MainWindow.ui.h:37 ../qt/data/MainWindow.ui.h:2 msgid "Contrast" msgstr "Contraste" #: ../gtk/data/MainWindow.ui.h:38 ../qt/data/MainWindow.ui.h:3 msgid "Resolution" msgstr "Resolução" #: ../gtk/data/MainWindow.ui.h:39 ../qt/data/MainWindow.ui.h:4 msgid "Invert colors" msgstr "Inverter cores" #: ../gtk/data/MainWindow.ui.h:40 msgid "A graphical frontend to tesseract-ocr" msgstr "Uma interface gráfica para o tesseract-ocr" #: ../gtk/data/MainWindow.ui.h:41 ../qt/data/CharacterListDialog.ui.h:1 msgid "Character whitelist / blacklist" msgstr "" #: ../gtk/data/MainWindow.ui.h:42 ../qt/data/CharacterListDialog.ui.h:2 msgid "Exclude these characters from being recognized (blacklist):" msgstr "" #: ../gtk/data/MainWindow.ui.h:43 ../qt/data/CharacterListDialog.ui.h:3 #, fuzzy msgid "Enter a string of characters..." msgstr "Obtendo parâmetros..." #: ../gtk/data/MainWindow.ui.h:44 ../qt/data/CharacterListDialog.ui.h:4 msgid "Only allow the following characters to be recognized (whitelist):" msgstr "" #: ../gtk/data/MainWindow.ui.h:45 ../qt/data/PageRangeDialog.ui.h:1 msgid "Page Range" msgstr "Intervalo de páginas" #: ../gtk/data/MainWindow.ui.h:48 ../qt/data/PageRangeDialog.ui.h:2 msgid "Page range:" msgstr "Intervalo de páginas:" #: ../gtk/data/MainWindow.ui.h:49 ../qt/data/PageRangeDialog.ui.h:3 msgid "Example: 1-10, 13, 14-18" msgstr "Exemplo: 1-10, 13, 14-18" #: ../gtk/data/MainWindow.ui.h:50 ../qt/data/PageRangeDialog.ui.h:4 msgid "Recognition area:" msgstr "Ãrea de reconhecimento:" #: ../gtk/data/MainWindow.ui.h:51 ../gtk/src/Recognizer.cc:375 #: ../qt/data/PageRangeDialog.ui.h:5 ../qt/src/Recognizer.cc:369 msgid "Entire page" msgstr "Página inteira" #: ../gtk/data/MainWindow.ui.h:52 ../qt/data/PageRangeDialog.ui.h:6 msgid "Autodetect" msgstr "Detectar automaticamente" #: ../gtk/data/MainWindow.ui.h:53 ../qt/data/PageRangeDialog.ui.h:7 msgid "Prepend to output text:" msgstr "Antepor ao texto de saída:" #: ../gtk/data/MainWindow.ui.h:54 ../qt/data/PageRangeDialog.ui.h:8 msgid "Source filename" msgstr "Nome do ficheiro origem" #: ../gtk/data/MainWindow.ui.h:55 ../qt/data/PageRangeDialog.ui.h:9 msgid "Source page" msgstr "Página de origem" #: ../gtk/data/MainWindow.ui.h:56 ../qt/src/SourceManager.cc:146 msgid "Protected PDF" msgstr "PDF protegido" #: ../gtk/data/MainWindow.ui.h:57 ../qt/src/Recognizer.cc:76 msgid "Current Page" msgstr "Página atual" #: ../gtk/data/MainWindow.ui.h:58 ../qt/src/Recognizer.cc:79 msgid "Multiple Pages..." msgstr "Múltiplas páginas..." #: ../gtk/data/OutputEditorHOCR.ui.h:1 ../qt/src/hocr/OutputEditorHOCR.cc:580 msgid "Add Word" msgstr "Adicionar Palavra" #: ../gtk/data/OutputEditorHOCR.ui.h:4 ../qt/src/hocr/OutputEditorHOCR.cc:580 msgid "Enter word:" msgstr "Digite a palavra:" #: ../gtk/data/OutputEditorHOCR.ui.h:5 ../qt/src/hocr/Ui_OutputEditorHOCR.hh:61 #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:62 msgid "Export to plain text" msgstr "Exportar para texto sem formatação" #: ../gtk/data/OutputEditorHOCR.ui.h:6 ../qt/src/hocr/Ui_OutputEditorHOCR.hh:64 #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:65 msgid "Export to PDF" msgstr "Exportar para PDF" #: ../gtk/data/OutputEditorHOCR.ui.h:7 ../qt/src/hocr/Ui_OutputEditorHOCR.hh:67 #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:68 msgid "Export to ODT" msgstr "Exportar para ODT" #: ../gtk/data/OutputEditorHOCR.ui.h:8 ../gtk/data/OutputEditorText.ui.h:18 #: ../qt/src/Ui_OutputEditorText.hh:116 msgid "Save output" msgstr "Gravar saída" #: ../gtk/data/OutputEditorHOCR.ui.h:9 ../qt/src/hocr/Ui_OutputEditorHOCR.hh:72 #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:73 msgid "Export" msgstr "Exportar" #: ../gtk/data/OutputEditorHOCR.ui.h:10 ../gtk/data/OutputEditorText.ui.h:19 #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:77 #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:78 #: ../qt/src/Ui_OutputEditorText.hh:118 msgid "Clear output" msgstr "Limpar saída" #: ../gtk/data/OutputEditorHOCR.ui.h:11 ../gtk/data/OutputEditorText.ui.h:15 #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:80 #: ../qt/src/Ui_OutputEditorText.hh:107 msgid "Find and replace" msgstr "Localizar e substituir" #: ../gtk/data/OutputEditorHOCR.ui.h:12 #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:82 #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:83 msgid "Show confidence values" msgstr "Mostrar valores de confiança" #: ../gtk/data/OutputEditorHOCR.ui.h:13 ../gtk/data/PdfExportDialog.ui.h:41 #: ../qt/data/PdfExportDialog.ui.h:2 ../qt/src/hocr/Ui_OutputEditorHOCR.hh:85 #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:86 msgid "Show preview" msgstr "Mostrar pré-visualização" #: ../gtk/data/OutputEditorHOCR.ui.h:14 #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:121 msgid "Next (F3)" msgstr "Seguinte (F3)" #: ../gtk/data/OutputEditorHOCR.ui.h:15 #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:122 msgid "Previous (Shift+F3)" msgstr "Anterior (Shift+F3)" #: ../gtk/data/OutputEditorHOCR.ui.h:16 ../gtk/src/hocr/OutputEditorHOCR.cc:890 #: ../qt/src/hocr/OutputEditorHOCR.cc:730 #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:126 msgid "Expand all" msgstr "Expandir tudo" #: ../gtk/data/OutputEditorHOCR.ui.h:17 ../gtk/src/hocr/OutputEditorHOCR.cc:893 #: ../qt/src/hocr/OutputEditorHOCR.cc:731 #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:127 msgid "Collapse all" msgstr "Dobrar tudo" #: ../gtk/data/OutputEditorHOCR.ui.h:18 #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:148 msgid "Properties" msgstr "Propriedades" #: ../gtk/data/OutputEditorHOCR.ui.h:19 #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:152 msgid "Source" msgstr "Origem" #. Output insert mode #: ../gtk/data/OutputEditorText.ui.h:1 ../qt/src/Ui_OutputEditorText.hh:52 msgid "Append to current text" msgstr "Acrescentar no texto atual" #: ../gtk/data/OutputEditorText.ui.h:2 ../qt/src/Ui_OutputEditorText.hh:53 msgid "Insert at cursor" msgstr "Inserir no cursor" #: ../gtk/data/OutputEditorText.ui.h:3 ../qt/src/Ui_OutputEditorText.hh:54 msgid "Replace current text" msgstr "Substituir o texto atual" #. Output postprocessing #: ../gtk/data/OutputEditorText.ui.h:4 ../qt/src/Ui_OutputEditorText.hh:62 msgid "Keep line break if..." msgstr "Manter quebra de linha se..." #: ../gtk/data/OutputEditorText.ui.h:5 ../qt/src/Ui_OutputEditorText.hh:64 msgid "Preceded by end mark (.?!)" msgstr "Precedido por marca de fim (.?!)" #: ../gtk/data/OutputEditorText.ui.h:6 ../qt/src/Ui_OutputEditorText.hh:66 msgid "Preceded or succeeded by quote" msgstr "Precedida ou sucedida por citação" #: ../gtk/data/OutputEditorText.ui.h:7 ../qt/src/Ui_OutputEditorText.hh:68 msgid "Other options" msgstr "Outras opções" #: ../gtk/data/OutputEditorText.ui.h:8 ../qt/src/Ui_OutputEditorText.hh:70 msgid "Join hyphenated words" msgstr "Juntar palavras com hífen" #: ../gtk/data/OutputEditorText.ui.h:9 ../qt/src/Ui_OutputEditorText.hh:72 msgid "Collapse whitespace" msgstr "Juntar espaços em branco" #: ../gtk/data/OutputEditorText.ui.h:10 ../qt/src/Ui_OutputEditorText.hh:74 msgid "Preserve paragraphs" msgstr "Preservar parágrafos" #: ../gtk/data/OutputEditorText.ui.h:11 ../qt/src/Ui_OutputEditorText.hh:76 msgid "Visual aids" msgstr "Recursos visuais" #: ../gtk/data/OutputEditorText.ui.h:12 ../qt/src/Ui_OutputEditorText.hh:78 msgid "Draw whitespace" msgstr "Desenhar espaços" #: ../gtk/data/OutputEditorText.ui.h:14 ../qt/src/Ui_OutputEditorText.hh:102 msgid "Strip line breaks on selected text" msgstr "Remover quebras de linha do texto selecionado" #: ../gtk/data/OutputEditorText.ui.h:16 ../qt/src/Ui_OutputEditorText.hh:109 #: ../qt/src/Ui_OutputEditorText.hh:110 msgid "Undo" msgstr "Desfazer" #: ../gtk/data/OutputEditorText.ui.h:17 ../qt/src/Ui_OutputEditorText.hh:112 #: ../qt/src/Ui_OutputEditorText.hh:113 msgid "Redo" msgstr "Refazer" #: ../gtk/data/PdfExportDialog.ui.h:1 ../qt/data/PdfExportDialog.ui.h:1 msgid "PDF Export" msgstr "Exportação PDF" #: ../gtk/data/PdfExportDialog.ui.h:4 ../qt/data/PdfExportDialog.ui.h:4 msgid "Output mode:" msgstr "Modo de saída:" #: ../gtk/data/PdfExportDialog.ui.h:5 ../qt/data/PdfExportDialog.ui.h:6 msgid "PDF" msgstr "PDF" #: ../gtk/data/PdfExportDialog.ui.h:6 ../qt/data/PdfExportDialog.ui.h:7 msgid "PDF with invisible text overlay" msgstr "PDF com sobreposição de texto invisível" #: ../gtk/data/PdfExportDialog.ui.h:7 ../qt/data/PdfExportDialog.ui.h:16 msgid "Format:" msgstr "Formato:" #: ../gtk/data/PdfExportDialog.ui.h:8 ../qt/data/PdfExportDialog.ui.h:17 msgid "Compression:" msgstr "Compressão:" #: ../gtk/data/PdfExportDialog.ui.h:9 ../qt/data/PdfExportDialog.ui.h:14 msgid "Compression quality:" msgstr "Qualidade de compressão:" #: ../gtk/data/PdfExportDialog.ui.h:10 ../qt/data/PdfExportDialog.ui.h:15 msgid "DPI:" msgstr "DPI:" #: ../gtk/data/PdfExportDialog.ui.h:11 ../qt/data/PdfExportDialog.ui.h:18 msgid "Dithering algorithm:" msgstr "Algoritmo de pontilhamento:" #: ../gtk/data/PdfExportDialog.ui.h:12 ../qt/data/PdfExportDialog.ui.h:13 msgid "Image settings:" msgstr "Configurações de imagem:" #: ../gtk/data/PdfExportDialog.ui.h:13 ../qt/data/PdfExportDialog.ui.h:25 msgid "Uniformize line and word spacing" msgstr "Homogenizar a linha e espaçamento entre palavras" #: ../gtk/data/PdfExportDialog.ui.h:14 ../qt/data/PdfExportDialog.ui.h:21 msgid "Override font family:" msgstr "Sobrescrever a família da fonte:" #: ../gtk/data/PdfExportDialog.ui.h:15 ../qt/data/PdfExportDialog.ui.h:27 msgid "Fallback font family:" msgstr "Família de fonte fallback:" #: ../gtk/data/PdfExportDialog.ui.h:16 ../qt/data/PdfExportDialog.ui.h:20 msgid "Override font size:" msgstr "Sobrescrever o tamanho da fonte:" #: ../gtk/data/PdfExportDialog.ui.h:17 ../qt/data/PdfExportDialog.ui.h:23 msgid "Font scaling:" msgstr "Escala de fonte:" #: ../gtk/data/PdfExportDialog.ui.h:18 ../qt/data/PdfExportDialog.ui.h:26 msgid "pt" msgstr "pt" #: ../gtk/data/PdfExportDialog.ui.h:19 ../qt/data/PdfExportDialog.ui.h:22 msgid "Preserve spaces wider than:" msgstr "Preserve espaços mais largos do que:" #: ../gtk/data/PdfExportDialog.ui.h:20 ../qt/data/PdfExportDialog.ui.h:24 msgid "characters" msgstr "letras" #: ../gtk/data/PdfExportDialog.ui.h:21 ../qt/data/PdfExportDialog.ui.h:28 msgid "Sanitize hyphens before line breaks" msgstr "" #: ../gtk/data/PdfExportDialog.ui.h:22 ../qt/data/PdfExportDialog.ui.h:19 msgid "Text settings:" msgstr "Configurações de texto:" #: ../gtk/data/PdfExportDialog.ui.h:23 ../qt/data/PdfExportDialog.ui.h:10 msgid "Paper size:" msgstr "Tamanho do papel:" #: ../gtk/data/PdfExportDialog.ui.h:24 ../qt/data/PdfExportDialog.ui.h:11 msgid "Width" msgstr "Largura" #: ../gtk/data/PdfExportDialog.ui.h:25 ../qt/data/PdfExportDialog.ui.h:12 msgid "Height" msgstr "Altura" #: ../gtk/data/PdfExportDialog.ui.h:26 ../qt/data/PdfExportDialog.ui.h:29 msgid "Treat image sources as having true DPI:" msgstr "" #: ../gtk/data/PdfExportDialog.ui.h:27 ../qt/data/PdfExportDialog.ui.h:3 msgid "Basic" msgstr "Básico" #: ../gtk/data/PdfExportDialog.ui.h:28 ../qt/data/PdfExportDialog.ui.h:31 msgid "PDF version:" msgstr "Versão de PDF:" #: ../gtk/data/PdfExportDialog.ui.h:29 ../qt/data/PdfExportDialog.ui.h:33 msgid "Password:" msgstr "Palavra-passe:" #: ../gtk/data/PdfExportDialog.ui.h:30 ../qt/data/PdfExportDialog.ui.h:34 msgid "Confirm password:" msgstr "Confirmar palavra-passe:" #: ../gtk/data/PdfExportDialog.ui.h:31 ../qt/data/PdfExportDialog.ui.h:32 msgid "Encryption (optional):" msgstr "Criptografia (opcional):" #: ../gtk/data/PdfExportDialog.ui.h:32 ../qt/data/PdfExportDialog.ui.h:36 msgid "Author:" msgstr "Autor:" #: ../gtk/data/PdfExportDialog.ui.h:33 ../qt/data/PdfExportDialog.ui.h:38 msgid "Title:" msgstr "Título:" #: ../gtk/data/PdfExportDialog.ui.h:34 ../qt/data/PdfExportDialog.ui.h:40 msgid "Subject:" msgstr "Assunto:" #: ../gtk/data/PdfExportDialog.ui.h:35 ../qt/data/PdfExportDialog.ui.h:37 msgid "Creator:" msgstr "Criador:" #: ../gtk/data/PdfExportDialog.ui.h:36 ../qt/data/PdfExportDialog.ui.h:39 msgid "Producer:" msgstr "Produtor:" #: ../gtk/data/PdfExportDialog.ui.h:37 ../qt/data/PdfExportDialog.ui.h:41 msgid "Keywords:" msgstr "Palavras-chave:" #: ../gtk/data/PdfExportDialog.ui.h:38 ../qt/data/PdfExportDialog.ui.h:35 msgid "Additional information (optional):" msgstr "Informação adicional (opcional):" #: ../gtk/data/PdfExportDialog.ui.h:39 ../qt/data/PdfExportDialog.ui.h:42 msgid "Import from current source" msgstr "Importar da origem atual" #: ../gtk/data/PdfExportDialog.ui.h:40 ../qt/data/PdfExportDialog.ui.h:30 msgid "Advanced" msgstr "Avançado" #: ../gtk/data/SearchReplaceFrame.ui.h:1 ../qt/data/SearchReplaceFrame.ui.h:4 msgid "Find" msgstr "Localizar" #: ../gtk/data/SearchReplaceFrame.ui.h:2 ../qt/data/SearchReplaceFrame.ui.h:2 msgid "Replace" msgstr "Substituir" #: ../gtk/data/SearchReplaceFrame.ui.h:3 ../qt/data/SearchReplaceFrame.ui.h:3 msgid "Replace all" msgstr "Substituir todos" #: ../gtk/data/SearchReplaceFrame.ui.h:4 ../qt/data/SearchReplaceFrame.ui.h:5 msgid "Find previous" msgstr "Localizar anterior" #: ../gtk/data/SearchReplaceFrame.ui.h:5 ../qt/data/SearchReplaceFrame.ui.h:6 msgid "Find next" msgstr "Localizar próximo" #: ../gtk/data/SearchReplaceFrame.ui.h:6 ../qt/data/SearchReplaceFrame.ui.h:7 msgid "Match case" msgstr "Diferenciar maiúsculas e minúsculas" #: ../gtk/data/SearchReplaceFrame.ui.h:7 #: ../gtk/data/SubstitutionsManager.ui.h:1 ../qt/data/SearchReplaceFrame.ui.h:1 #: ../qt/src/SubstitutionsManager.cc:36 msgid "Substitutions" msgstr "Substituições" #: ../gtk/data/SelectionMenu.ui.h:1 ../qt/src/DisplayerToolSelect.cc:239 msgid "Delete" msgstr "Apagar" #: ../gtk/data/SelectionMenu.ui.h:2 ../qt/src/DisplayerToolSelect.cc:225 msgid "Order:" msgstr "Ordem:" #: ../gtk/data/SelectionMenu.ui.h:3 ../gtk/src/hocr/DisplayerToolHOCR.cc:29 #: ../qt/src/DisplayerToolSelect.cc:240 ../qt/src/hocr/DisplayerToolHOCR.cc:31 msgid "Recognize" msgstr "Reconhecer" #: ../gtk/data/SelectionMenu.ui.h:4 ../qt/src/DisplayerToolSelect.cc:241 msgid "Recognize to clipboard" msgstr "Reconhecer para a área de transferência" #: ../gtk/data/SelectionMenu.ui.h:5 ../qt/src/DisplayerToolSelect.cc:242 msgid "Save as image" msgstr "Gravar como imagem" #: ../gtk/data/SubstitutionsManager.ui.h:2 ../qt/src/SubstitutionsManager.cc:38 #: ../qt/src/SubstitutionsManager.cc:39 msgid "Open" msgstr "Abrir" #: ../gtk/data/SubstitutionsManager.ui.h:3 ../gtk/src/Utils.cc:73 #: ../qt/src/SubstitutionsManager.cc:41 ../qt/src/SubstitutionsManager.cc:42 msgid "Save" msgstr "Gravar" #: ../gtk/data/SubstitutionsManager.ui.h:4 ../qt/src/SubstitutionsManager.cc:44 #: ../qt/src/SubstitutionsManager.cc:45 msgid "Clear" msgstr "Limpar" #: ../gtk/data/SubstitutionsManager.ui.h:5 ../qt/data/ConfigDialog.ui.h:16 #: ../qt/src/SubstitutionsManager.cc:47 ../qt/src/SubstitutionsManager.cc:48 msgid "Add" msgstr "Adicionar" #: ../gtk/data/SubstitutionsManager.ui.h:6 #: ../gtk/src/hocr/OutputEditorHOCR.cc:886 ../qt/data/ConfigDialog.ui.h:17 #: ../qt/src/hocr/OutputEditorHOCR.cc:727 ../qt/src/SubstitutionsManager.cc:50 #: ../qt/src/SubstitutionsManager.cc:51 msgid "Remove" msgstr "Remover" #: ../gtk/data/SubstitutionsManager.ui.h:7 ../gtk/data/TessdataManager.ui.h:2 msgid "Apply" msgstr "Aplicar" #: ../gtk/data/SubstitutionsManager.ui.h:8 ../gtk/data/TessdataManager.ui.h:3 msgid "Close" msgstr "Fechar" #: ../gtk/data/TessdataManager.ui.h:1 ../qt/src/TessdataManager.cc:49 msgid "Tessdata Manager" msgstr "Gerenciador de Tessdata" #: ../gtk/data/TessdataManager.ui.h:5 ../qt/src/TessdataManager.cc:51 msgid "Manage installed languages:" msgstr "Gerenciar idiomas instalados:" #: ../gtk/src/Acquirer.cc:79 ../qt/src/Acquirer.cc:70 msgid "scan.png" msgstr "scan.png" #: ../gtk/src/Acquirer.cc:91 ../qt/src/Acquirer.cc:85 msgid "Images" msgstr "Imagens" #: ../gtk/src/Acquirer.cc:92 ../qt/src/Acquirer.cc:86 msgid "Choose Output Filename..." msgstr "Escolha nome do ficheiro de saída..." #: ../gtk/src/Acquirer.cc:106 ../qt/src/Acquirer.cc:100 msgid "Failed to initialize the scanning backend." msgstr "Falha ao inicializar a infraestrutura de digitalização." #: ../gtk/src/Acquirer.cc:115 ../qt/src/Acquirer.cc:106 msgid "Scan failed" msgstr "A digitalização falhou" #: ../gtk/src/Acquirer.cc:133 ../qt/src/Acquirer.cc:122 msgid "No scanners were detected." msgstr "Nenhum digitalizador foi detectado." #: ../gtk/src/Acquirer.cc:150 ../gtk/src/Acquirer.cc:168 #: ../qt/src/Acquirer.cc:136 ../qt/src/Acquirer.cc:154 msgid "Starting scan..." msgstr "Iniciando digitalização..." #: ../gtk/src/Acquirer.cc:164 ../qt/src/Acquirer.cc:150 msgid "Opening device..." msgstr "Abrindo dispositivo..." #: ../gtk/src/Acquirer.cc:166 ../qt/src/Acquirer.cc:152 msgid "Setting options..." msgstr "definindo opções..." #: ../gtk/src/Acquirer.cc:170 ../qt/src/Acquirer.cc:156 msgid "Getting parameters..." msgstr "Obtendo parâmetros..." #: ../gtk/src/Acquirer.cc:172 ../qt/src/Acquirer.cc:158 msgid "Transferring data..." msgstr "Transferindo dados..." #: ../gtk/src/Acquirer.cc:179 ../qt/src/Acquirer.cc:165 msgid "Canceling scan..." msgstr "Cancelando a digitalização..." #: ../gtk/src/Config.cc:49 ../qt/data/ConfigDialog.ui.h:7 msgid "Filename prefix" msgstr "Prefixo do nome do ficheiro" #: ../gtk/src/Config.cc:50 ../qt/data/ConfigDialog.ui.h:8 msgid "Code" msgstr "Código" #: ../gtk/src/Config.cc:51 ../qt/data/ConfigDialog.ui.h:9 msgid "Native name" msgstr "Nome nativo" #: ../gtk/src/Config.cc:109 ../qt/src/Config.cc:108 msgid "Script" msgstr "Script" #: ../gtk/src/CrashHandler.cc:25 ../gtk/src/CrashHandler.cc:41 #: ../qt/src/CrashHandler.cc:36 msgid "Crash Handler" msgstr "Gerenciador de erros" #: ../gtk/src/CrashHandler.cc:43 ../qt/src/CrashHandler.cc:31 msgid "Your work has been saved under %1." msgstr "O seu trabalho foi salvo em %1." #: ../gtk/src/CrashHandler.cc:45 ../qt/src/CrashHandler.cc:33 msgid "There was no unsaved work." msgstr "Não havia trabalho não salvo." #: ../gtk/src/CrashHandler.cc:106 ../qt/src/CrashHandler.cc:62 msgid "Failed to obtain backtrace. Is gdb installed?" msgstr "Falha ao obter o backtrace. O gdb está instalado?" #: ../gtk/src/Displayer.cc:232 ../qt/src/Displayer.cc:174 msgid "Failed to load image" msgstr "Falha ao carregar imagem" #: ../gtk/src/Displayer.cc:232 ../qt/src/Displayer.cc:174 msgid "" "The file might not be an image or be corrupt:\n" "%1" msgstr "" "O ficheiro pode não ser uma imagem ou está corrompido:\n" "%1" #: ../gtk/src/DisplayerToolSelect.cc:138 ../qt/src/DisplayerToolSelect.cc:135 msgid "PNG Images" msgstr "Imagens PNG" #: ../gtk/src/DisplayerToolSelect.cc:139 ../qt/src/DisplayerToolSelect.cc:135 msgid "Save Selection Image" msgstr "Gravar imagem selecionada" #: ../gtk/src/DisplayerToolSelect.cc:139 ../qt/src/DisplayerToolSelect.cc:135 msgid "selection.png" msgstr "selection.png" #: ../gtk/src/DisplayerToolSelect.cc:146 ../qt/src/DisplayerToolSelect.cc:142 msgid "Recognize all" msgstr "Reconhecer tudo" #: ../gtk/src/DisplayerToolSelect.cc:146 ../qt/src/DisplayerToolSelect.cc:142 msgid "Recognize selection" msgstr "Reconhecer seleção" #: ../gtk/src/DisplayerToolSelect.cc:186 ../qt/src/DisplayerToolSelect.cc:182 msgid "Performing layout analysis" msgstr "Executando análise de layout" #: ../gtk/src/FileDialogs.cc:235 msgid "" "A file named \"%1\" already exists. Are you sure you want to overwrite it?" msgstr "Um ficheiro chamado \"%1\" já existe. Você deseja sobrescrevê-lo?" #: ../gtk/src/FileDialogs.cc:237 msgid "Overwrite File?" msgstr "Sobrescrever ficheiro?" #: ../gtk/src/hocr/HOCRDocument.cc:611 ../gtk/src/hocr/OutputEditorHOCR.cc:266 #: ../qt/src/hocr/OutputEditorHOCR.cc:229 msgid "Page" msgstr "Página" #: ../gtk/src/hocr/HOCRDocument.cc:613 ../qt/src/hocr/HOCRDocument.cc:530 msgid "Text block" msgstr "Bloco de texto" #: ../gtk/src/hocr/HOCRDocument.cc:615 ../gtk/src/hocr/OutputEditorHOCR.cc:272 #: ../qt/src/hocr/HOCRDocument.cc:532 ../qt/src/hocr/OutputEditorHOCR.cc:231 msgid "Paragraph" msgstr "Parágrafo" #: ../gtk/src/hocr/HOCRDocument.cc:617 ../qt/src/hocr/HOCRDocument.cc:534 msgid "Textline" msgstr "Linha de texto" #: ../gtk/src/hocr/HOCRDocument.cc:621 ../qt/src/hocr/HOCRDocument.cc:538 msgid "Graphic" msgstr "Gráfico" #: ../gtk/src/hocr/HOCROdtExporter.cc:65 ../gtk/src/hocr/HOCRPdfExporter.cc:489 #: ../gtk/src/hocr/HOCRTextExporter.cc:34 #: ../gtk/src/hocr/OutputEditorHOCR.cc:963 ../gtk/src/OutputEditorText.cc:272 #: ../qt/src/hocr/HOCROdtExporter.cc:50 ../qt/src/hocr/HOCRPdfExporter.cc:478 #: ../qt/src/hocr/HOCRTextExporter.cc:36 ../qt/src/hocr/OutputEditorHOCR.cc:830 #: ../qt/src/OutputEditorText.cc:238 msgid "output" msgstr "Saída" #: ../gtk/src/hocr/HOCROdtExporter.cc:68 ../qt/src/hocr/HOCROdtExporter.cc:53 msgid "OpenDocument Text Documents" msgstr "Documentos de texto OpenDocument" #: ../gtk/src/hocr/HOCROdtExporter.cc:69 ../qt/src/hocr/HOCROdtExporter.cc:53 msgid "Save ODT Output..." msgstr "Gravar saída ODT ..." #: ../gtk/src/hocr/HOCROdtExporter.cc:77 ../gtk/src/hocr/HOCROdtExporter.cc:342 #: ../gtk/src/hocr/HOCRPdfExporter.cc:619 #: ../gtk/src/hocr/HOCRTextExporter.cc:46 ../qt/src/hocr/HOCROdtExporter.cc:61 #: ../qt/src/hocr/HOCRPdfExporter.cc:609 ../qt/src/hocr/HOCRTextExporter.cc:47 msgid "Export failed" msgstr "Exportação falhada" #: ../gtk/src/hocr/HOCROdtExporter.cc:77 ../gtk/src/hocr/HOCROdtExporter.cc:342 #: ../qt/src/hocr/HOCROdtExporter.cc:61 msgid "The ODT export failed: unable to write output file." msgstr "A exportação ODT falhou: não é possível gravar o ficheiro de saída." #: ../gtk/src/hocr/HOCROdtExporter.cc:336 ../qt/src/hocr/HOCROdtExporter.cc:254 msgid "Exporting to ODT..." msgstr "Exportando para ODT..." #: ../gtk/src/hocr/HOCRPdfExporter.cc:283 ../qt/src/hocr/HOCRPdfExporter.cc:365 msgid "Same as source" msgstr "Igual à origem" #: ../gtk/src/hocr/HOCRPdfExporter.cc:286 ../qt/src/hocr/HOCRPdfExporter.cc:366 msgid "Custom" msgstr "Personalizado" #: ../gtk/src/hocr/HOCRPdfExporter.cc:300 ../qt/src/hocr/HOCRPdfExporter.cc:362 msgid "cm" msgstr "cm" #: ../gtk/src/hocr/HOCRPdfExporter.cc:303 ../qt/src/hocr/HOCRPdfExporter.cc:363 msgid "in" msgstr "em" #: ../gtk/src/hocr/HOCRPdfExporter.cc:319 ../qt/src/hocr/HOCRPdfExporter.cc:353 msgid "Monochrome" msgstr "Preto e branco" #: ../gtk/src/hocr/HOCRPdfExporter.cc:328 ../qt/src/hocr/HOCRPdfExporter.cc:355 msgid "Threshold (closest color)" msgstr "Limiar (cor mais próxima)" #: ../gtk/src/hocr/HOCRPdfExporter.cc:331 ../qt/src/hocr/HOCRPdfExporter.cc:356 msgid "Diffuse" msgstr "Difusa" #: ../gtk/src/hocr/HOCRPdfExporter.cc:340 ../qt/src/hocr/HOCRPdfExporter.cc:357 msgid "Zip (lossless)" msgstr "Zip (sem perdas)" #: ../gtk/src/hocr/HOCRPdfExporter.cc:344 ../qt/src/hocr/HOCRPdfExporter.cc:358 msgid "CCITT Group 4 (lossless)" msgstr "CCITT Grupo 4 (sem perdas)" #: ../gtk/src/hocr/HOCRPdfExporter.cc:348 ../qt/src/hocr/HOCRPdfExporter.cc:359 msgid "Jpeg (lossy)" msgstr "Jpeg (com perdas)" #: ../gtk/src/hocr/HOCRPdfExporter.cc:493 ../qt/src/hocr/HOCRPdfExporter.cc:482 msgid "PDF Files" msgstr "Ficheiros PDF" #: ../gtk/src/hocr/HOCRPdfExporter.cc:494 ../qt/src/hocr/HOCRPdfExporter.cc:482 msgid "Save PDF Output..." msgstr "Gravar saída PDF..." #: ../gtk/src/hocr/HOCRPdfExporter.cc:500 ../qt/src/hocr/HOCRPdfExporter.cc:488 msgid "Invalid Output" msgstr "Saída inválida" #: ../gtk/src/hocr/HOCRPdfExporter.cc:500 ../qt/src/hocr/HOCRPdfExporter.cc:488 msgid "Cannot overwrite a file which is a source image of this document." msgstr "" "Não pode sobrescrever um ficheiro que é uma imagem de origem do documento." #: ../gtk/src/hocr/HOCRPdfExporter.cc:516 ../qt/src/hocr/HOCRPdfExporter.cc:511 msgid "Failed to create output" msgstr "Falha ao criar a saída" #: ../gtk/src/hocr/HOCRPdfExporter.cc:516 ../qt/src/hocr/HOCRPdfExporter.cc:511 msgid "Failed to create output. The returned error was: %1" msgstr "Falha ao criar uma saída. O erro retornado foi: %1" #: ../gtk/src/hocr/HOCRPdfExporter.cc:558 ../qt/src/hocr/HOCRPdfExporter.cc:551 msgid "The operation was cancelled" msgstr "A operação foi cancelada" #: ../gtk/src/hocr/HOCRPdfExporter.cc:607 ../qt/src/hocr/HOCRPdfExporter.cc:597 msgid "Failed to render page %1" msgstr "Falha ao processar a página %1" #: ../gtk/src/hocr/HOCRPdfExporter.cc:614 ../qt/src/hocr/HOCRPdfExporter.cc:604 msgid "Exporting to PDF..." msgstr "Exportando para PDF..." #: ../gtk/src/hocr/HOCRPdfExporter.cc:619 ../qt/src/hocr/HOCRPdfExporter.cc:609 msgid "The PDF export failed: %1." msgstr "A exportação PDF falhou: %1." #: ../gtk/src/hocr/HOCRPdfExporter.cc:673 ../qt/src/hocr/HOCRPdfExporter.cc:662 msgid "The PDF library could not load the font '%1'." msgstr "A biblioteca PDF não pôde carregar a fonte '%1'." #: ../gtk/src/hocr/HOCRTextExporter.cc:37 ../gtk/src/OutputEditorText.cc:274 #: ../qt/src/hocr/HOCRTextExporter.cc:39 ../qt/src/OutputEditorText.cc:239 msgid "Text Files" msgstr "Arquivos de texto" #: ../gtk/src/hocr/HOCRTextExporter.cc:38 ../qt/src/hocr/HOCRTextExporter.cc:39 msgid "Save Text Output..." msgstr "Gravar saída de texto..." #: ../gtk/src/hocr/HOCRTextExporter.cc:46 ../qt/src/hocr/HOCRTextExporter.cc:47 msgid "The text export failed: unable to write output file." msgstr "" "A exportação de texto falhou: não é possível gravar o ficheiro de saída." #: ../gtk/src/hocr/OutputEditorHOCR.cc:269 #: ../qt/src/hocr/OutputEditorHOCR.cc:230 msgid "Block" msgstr "Bloco" #: ../gtk/src/hocr/OutputEditorHOCR.cc:275 #: ../qt/src/hocr/OutputEditorHOCR.cc:232 msgid "Line" msgstr "Linha" #: ../gtk/src/hocr/OutputEditorHOCR.cc:278 #: ../qt/src/hocr/OutputEditorHOCR.cc:233 msgid "Word" msgstr "Palavra" #: ../gtk/src/hocr/OutputEditorHOCR.cc:281 #: ../qt/src/hocr/OutputEditorHOCR.cc:234 msgid "Misspelled word" msgstr "Palavra incorreta" #: ../gtk/src/hocr/OutputEditorHOCR.cc:435 #: ../qt/src/hocr/OutputEditorHOCR.cc:317 msgid "" "The following pages could not be processed:\n" "%1" msgstr "" "As seguintes páginas não puderam ser processadas:\n" "%1" #: ../gtk/src/hocr/OutputEditorHOCR.cc:436 #: ../qt/src/hocr/OutputEditorHOCR.cc:318 msgid "Recognition errors" msgstr "Ocorreram erros de reconhecimento" #: ../gtk/src/hocr/OutputEditorHOCR.cc:594 #: ../qt/src/hocr/OutputEditorHOCR.cc:500 #: ../qt/src/hocr/OutputEditorHOCR.cc:512 msgid "Multiple values" msgstr "Vários valores" #. Merging allowed #: ../gtk/src/hocr/OutputEditorHOCR.cc:778 #: ../qt/src/hocr/OutputEditorHOCR.cc:641 msgid "Merge" msgstr "Unir" #: ../gtk/src/hocr/OutputEditorHOCR.cc:786 #: ../gtk/src/hocr/OutputEditorHOCR.cc:877 #: ../qt/src/hocr/OutputEditorHOCR.cc:643 #: ../qt/src/hocr/OutputEditorHOCR.cc:725 msgid "Split from parent" msgstr "Separar do pai" #. Swapping allowed #: ../gtk/src/hocr/OutputEditorHOCR.cc:797 #: ../qt/src/hocr/OutputEditorHOCR.cc:647 msgid "Swap" msgstr "Trocar" #: ../gtk/src/hocr/OutputEditorHOCR.cc:821 #: ../qt/src/hocr/OutputEditorHOCR.cc:693 msgid "Add graphic region" msgstr "Adicionar região gráfica" #: ../gtk/src/hocr/OutputEditorHOCR.cc:824 #: ../qt/src/hocr/OutputEditorHOCR.cc:694 msgid "Add text block" msgstr "Adicionar bloco de texto" #: ../gtk/src/hocr/OutputEditorHOCR.cc:828 #: ../qt/src/hocr/OutputEditorHOCR.cc:696 msgid "Add paragraph" msgstr "Adicionar parágrafo" #: ../gtk/src/hocr/OutputEditorHOCR.cc:832 #: ../qt/src/hocr/OutputEditorHOCR.cc:698 msgid "Add line" msgstr "Adicionar linha" #: ../gtk/src/hocr/OutputEditorHOCR.cc:836 #: ../qt/src/hocr/OutputEditorHOCR.cc:700 msgid "Add word" msgstr "Adicionar palavra" #: ../gtk/src/hocr/OutputEditorHOCR.cc:852 #: ../qt/src/hocr/OutputEditorHOCR.cc:710 msgid "No suggestions" msgstr "Sem sugestões" #: ../gtk/src/hocr/OutputEditorHOCR.cc:858 #: ../qt/src/hocr/OutputEditorHOCR.cc:714 msgid "Add to dictionary" msgstr "Adicionar ao dicionário" #: ../gtk/src/hocr/OutputEditorHOCR.cc:864 #: ../qt/src/hocr/OutputEditorHOCR.cc:716 msgid "Ignore word" msgstr "Ignorar palavra" #: ../gtk/src/hocr/OutputEditorHOCR.cc:926 #: ../gtk/src/hocr/OutputEditorHOCR.cc:965 #: ../qt/src/hocr/OutputEditorHOCR.cc:795 #: ../qt/src/hocr/OutputEditorHOCR.cc:832 msgid "hOCR HTML Files" msgstr "Ficheiros hOCR HTML" #: ../gtk/src/hocr/OutputEditorHOCR.cc:927 #: ../qt/src/hocr/OutputEditorHOCR.cc:795 msgid "Open hOCR File" msgstr "Abrir ficheiro hOCR" #: ../gtk/src/hocr/OutputEditorHOCR.cc:936 #: ../qt/src/hocr/OutputEditorHOCR.cc:802 msgid "Failed to open file" msgstr "Falha ao abrir o ficheiro" #: ../gtk/src/hocr/OutputEditorHOCR.cc:936 #: ../qt/src/hocr/OutputEditorHOCR.cc:802 msgid "The file could not be opened: %1." msgstr "O ficheiro não pode ser aberto: %1." #: ../gtk/src/hocr/OutputEditorHOCR.cc:945 #: ../qt/src/hocr/OutputEditorHOCR.cc:809 msgid "Invalid hOCR file" msgstr "Ficheiro hOCR inválido" #: ../gtk/src/hocr/OutputEditorHOCR.cc:945 #: ../qt/src/hocr/OutputEditorHOCR.cc:809 msgid "The file does not appear to contain valid hOCR HTML: %1" msgstr "O ficheiro parece não conter hOCR HTML válido: %1" #: ../gtk/src/hocr/OutputEditorHOCR.cc:966 #: ../qt/src/hocr/OutputEditorHOCR.cc:832 msgid "Save hOCR Output..." msgstr "Gravando saída hOCR..." #: ../gtk/src/hocr/OutputEditorHOCR.cc:973 ../gtk/src/OutputEditorText.cc:282 #: ../qt/src/hocr/OutputEditorHOCR.cc:839 ../qt/src/OutputEditorText.cc:246 msgid "Failed to save output" msgstr "Falha ao gravar a saída" #: ../gtk/src/hocr/OutputEditorHOCR.cc:973 ../gtk/src/OutputEditorText.cc:282 #: ../qt/src/hocr/OutputEditorHOCR.cc:839 ../qt/src/OutputEditorText.cc:246 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/hocr/OutputEditorHOCR.cc:1035 ../gtk/src/OutputEditorText.cc:296 #: ../qt/src/hocr/OutputEditorHOCR.cc:894 ../qt/src/OutputEditorText.cc:259 msgid "Output not saved" msgstr "Saída não salva" #: ../gtk/src/hocr/OutputEditorHOCR.cc:1035 ../gtk/src/OutputEditorText.cc:296 #: ../qt/src/hocr/OutputEditorHOCR.cc:894 ../qt/src/OutputEditorText.cc:259 msgid "Save output before proceeding?" msgstr "Gravar a saída antes de continuar?" #: ../gtk/src/hocr/OutputEditorHOCR.cc:1156 ../gtk/src/OutputEditorText.cc:184 #: ../qt/src/hocr/OutputEditorHOCR.cc:991 ../qt/src/OutputEditorText.cc:152 msgid "Replacing..." msgstr "Substituindo..." #: ../gtk/src/hocr/OutputEditorHOCR.cc:1181 ../gtk/src/OutputEditorText.cc:192 #: ../qt/src/hocr/OutputEditorHOCR.cc:1014 ../qt/src/OutputEditorText.cc:160 msgid "Applying substitutions..." msgstr "Aplicando substituições..." #: ../gtk/src/MainWindow.cc:131 ../qt/src/MainWindow.cc:295 msgid "Using tesseract" msgstr "Usando Tesseract" #: ../gtk/src/MainWindow.cc:178 ../qt/src/MainWindow.cc:194 msgid "Select an image to begin..." msgstr "Selecione uma imagem para começar..." #: ../gtk/src/MainWindow.cc:293 ../qt/src/MainWindow.cc:278 msgid "Multiple sources" msgstr "Várias origens" #: ../gtk/src/MainWindow.cc:295 ../qt/src/MainWindow.cc:280 msgid "Ready" msgstr "Pronto" #: ../gtk/src/MainWindow.cc:442 ../qt/src/MainWindow.cc:423 msgid "New version" msgstr "Nova versão" #: ../gtk/src/MainWindow.cc:442 ../qt/src/MainWindow.cc:423 msgid "gImageReader %1 is available" msgstr "gImageReader %1 está disponível" #: ../gtk/src/MainWindow.cc:443 ../qt/src/MainWindow.cc:424 msgid "Download" msgstr "Download" #: ../gtk/src/MainWindow.cc:444 ../qt/src/MainWindow.cc:425 msgid "Changelog" msgstr "Registro de mudanças" #: ../gtk/src/MainWindow.cc:445 ../qt/src/MainWindow.cc:426 msgid "Don't notify again" msgstr "Não avisar novamente" #: ../gtk/src/MainWindow.cc:466 ../qt/src/MainWindow.cc:474 msgid "Don't show again" msgstr "Não mostrar novamente" #: ../gtk/src/MainWindow.cc:467 ../gtk/src/MainWindow.cc:480 #: ../qt/src/MainWindow.cc:475 msgid "Install" msgstr "Instalar" #: ../gtk/src/MainWindow.cc:487 ../qt/src/MainWindow.cc:487 msgid "Spelling dictionary missing" msgstr "Dicionário de ortografia faltando" #: ../gtk/src/MainWindow.cc:487 ../qt/src/MainWindow.cc:487 msgid "The spellcheck dictionary for %1 is not installed" msgstr "O dicionário de ortografia para %1 no foi instalado" #: ../gtk/src/MainWindow.cc:494 ../gtk/src/MainWindow.cc:523 #: ../qt/src/MainWindow.cc:493 msgid "Installing spelling dictionary for '%1'" msgstr "Instalando dicionário de ortografia para '%1'" #: ../gtk/src/MainWindow.cc:515 ../gtk/src/MainWindow.cc:536 #: ../gtk/src/MainWindow.cc:544 ../gtk/src/MainWindow.cc:592 #: ../gtk/src/MainWindow.cc:597 ../gtk/src/TessdataManager.cc:60 #: ../gtk/src/TessdataManager.cc:70 ../gtk/src/TessdataManager.cc:339 #: ../qt/src/MainWindow.cc:512 ../qt/src/MainWindow.cc:525 #: ../qt/src/MainWindow.cc:534 ../qt/src/MainWindow.cc:578 #: ../qt/src/MainWindow.cc:583 ../qt/src/TessdataManager.cc:74 #: ../qt/src/TessdataManager.cc:84 ../qt/src/TessdataManager.cc:315 msgid "Error" msgstr "Erro" #: ../gtk/src/MainWindow.cc:515 ../qt/src/MainWindow.cc:512 msgid "Failed to install spelling dictionary: %1" msgstr "Falha ao instalar dicionário de ortografia: %1" #: ../gtk/src/MainWindow.cc:536 ../qt/src/MainWindow.cc:525 msgid "Failed to create directory for spelling dictionaries." msgstr "Falha ao criar o diretório de dicionários de ortografia." #: ../gtk/src/MainWindow.cc:544 ../qt/src/MainWindow.cc:534 msgid "Could not read %1: %2." msgstr "Não foi possível ler %1: %2." #: ../gtk/src/MainWindow.cc:571 ../qt/src/MainWindow.cc:558 msgid "Downloading '%1'..." msgstr "Baixando '%1'..." #: ../gtk/src/MainWindow.cc:592 ../qt/src/MainWindow.cc:578 msgid "" "The following dictionaries could not be downloaded:\n" "%1\n" "\n" "Check the connectivity and directory permissions.\n" "Hint: If you don't have write permissions in system folders, you can switch " "to user paths in the settings dialog." msgstr "" "Os seguintes dicionários não podem ser baixados:\n" "%1\n" "\n" "Verifique as permissões de conectividade e diretório.\n" "Dica: Se você não tem permissões de gravação em pastas do sistema, você pode " "alternar para caminhos de usuário na caixa de diálogo Configurações." #: ../gtk/src/MainWindow.cc:595 ../qt/src/MainWindow.cc:581 msgid "Dictionaries installed" msgstr "Dicionários instalados" #: ../gtk/src/MainWindow.cc:595 msgid "" "The following dictionaries were installed:\n" "%1" msgstr "" "Os seguintes dicionários foram instalados:\n" "%1" #: ../gtk/src/MainWindow.cc:597 ../qt/src/MainWindow.cc:583 msgid "No spelling dictionaries found for '%1'." msgstr "Nenhum dicionário de ortografia encontrado para '%1'." #: ../gtk/src/OutputEditorText.cc:154 ../qt/src/OutputEditorText.cc:137 msgid "Stripping line breaks..." msgstr "Removendo quebras de linhas..." #: ../gtk/src/OutputEditorText.cc:162 msgid "Check spelling" msgstr "Verificar ortografia" #: ../gtk/src/OutputEditorText.cc:231 ../qt/src/OutputEditorText.cc:196 msgid "File: %1" msgstr "Ficheiro: %1" #: ../gtk/src/OutputEditorText.cc:234 ../qt/src/OutputEditorText.cc:199 msgid "Page: %1" msgstr "Página: %1" #: ../gtk/src/OutputEditorText.cc:247 ../gtk/src/Recognizer.cc:471 #: ../qt/src/Recognizer.cc:462 msgid "" "\n" "[Failed to recognize page %1]\n" msgstr "" "\n" "[Falha ao reconhecer página %1]\n" #: ../gtk/src/OutputEditorText.cc:275 ../qt/src/OutputEditorText.cc:239 msgid "Save Output..." msgstr "Salvando saída..." #: ../gtk/src/Recognizer.cc:179 ../qt/src/Recognizer.cc:172 msgid "No languages available" msgstr "Nenhum idioma disponível" #: ../gtk/src/Recognizer.cc:179 ../qt/src/Recognizer.cc:172 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:233 ../qt/src/Recognizer.cc:232 msgid "Multilingual" msgstr "Multilingual" #: ../gtk/src/Recognizer.cc:285 ../qt/src/Recognizer.cc:277 msgid "Automatic page segmentation" msgstr "Segmentação automática de páginas" #: ../gtk/src/Recognizer.cc:286 ../qt/src/Recognizer.cc:278 msgid "Page segmentation with orientation and script detection" msgstr "Segmentação de página com detecção de orientação e de script" #: ../gtk/src/Recognizer.cc:287 ../qt/src/Recognizer.cc:279 msgid "Assume single column of text" msgstr "Assumir uma única coluna de texto" #: ../gtk/src/Recognizer.cc:288 ../qt/src/Recognizer.cc:280 msgid "Assume single block of vertically aligned text" msgstr "Assumir um único bloco de texto alinhado verticalmente" #: ../gtk/src/Recognizer.cc:289 ../qt/src/Recognizer.cc:281 msgid "Assume a single uniform block of text" msgstr "Assumir um bloco uniforme de texto" #: ../gtk/src/Recognizer.cc:290 ../qt/src/Recognizer.cc:282 msgid "Assume a line of text" msgstr "Assumir uma linha de texto" #: ../gtk/src/Recognizer.cc:291 ../qt/src/Recognizer.cc:283 msgid "Assume a single word" msgstr "Assumir uma única palavra" #: ../gtk/src/Recognizer.cc:292 ../qt/src/Recognizer.cc:284 msgid "Assume a single word in a circle" msgstr "Assumir uma única palavra em um círculo" #: ../gtk/src/Recognizer.cc:293 ../qt/src/Recognizer.cc:285 msgid "Sparse text in no particular order" msgstr "Texto esparso em nenhuma ordem particular" #: ../gtk/src/Recognizer.cc:294 ../qt/src/Recognizer.cc:286 msgid "Sparse text with orientation and script detection" msgstr "Texto esparso com deteção de orientação e script" #: ../gtk/src/Recognizer.cc:309 ../qt/src/Recognizer.cc:297 msgid "Page segmentation mode" msgstr "Modo de segmentação de página" #: ../gtk/src/Recognizer.cc:313 ../qt/src/Recognizer.cc:300 msgid "Character whitelist / blacklist..." msgstr "" #: ../gtk/src/Recognizer.cc:319 ../qt/src/Recognizer.cc:305 msgid "Manage languages..." msgstr "Gerenciar idiomas..." #: ../gtk/src/Recognizer.cc:375 ../qt/src/Recognizer.cc:369 msgid "Current selection" msgstr "Seleção atual" #: ../gtk/src/Recognizer.cc:465 ../qt/src/Recognizer.cc:455 msgid "Recognizing page %1 (%2 of %3)" msgstr "Reconhecendo página %1 (%2 de %3)" #: ../gtk/src/Recognizer.cc:470 ../qt/src/Recognizer.cc:461 msgid "" "\n" "- Page %1: failed to render page" msgstr "" "\n" "- Página %1: falha ao processar a página" #: ../gtk/src/Recognizer.cc:501 ../gtk/src/Recognizer.cc:531 #: ../gtk/src/Recognizer.cc:544 ../qt/src/Recognizer.cc:491 #: ../qt/src/Recognizer.cc:521 ../qt/src/Recognizer.cc:534 msgid "Recognizing..." msgstr "Reconhecendo..." #: ../gtk/src/Recognizer.cc:505 ../gtk/src/Recognizer.cc:514 #: ../qt/src/Recognizer.cc:495 ../qt/src/Recognizer.cc:504 msgid "Recognition errors occurred" msgstr "Ocorreram erros de reconhecimento" #: ../gtk/src/Recognizer.cc:505 ../qt/src/Recognizer.cc:495 msgid "The following errors occurred:%1" msgstr "Os seguinte erros ocorreram:%1" #: ../gtk/src/Recognizer.cc:514 ../qt/src/Recognizer.cc:504 msgid "Failed to initialize tesseract" msgstr "Falha ao inicializar o tesseract" #: ../gtk/src/scanner/ScannerSane.cc:84 ../gtk/src/scanner/ScannerTwain.cc:288 #: ../qt/src/scanner/ScannerSane.cc:85 ../qt/src/scanner/ScannerTwain.cc:286 msgid "Scan canceled" msgstr "Digitalização cancelada" #: ../gtk/src/scanner/ScannerSane.cc:159 ../gtk/src/scanner/ScannerTwain.cc:186 #: ../qt/src/scanner/ScannerSane.cc:159 ../qt/src/scanner/ScannerTwain.cc:178 msgid "No scanner specified" msgstr "Nenhum digitalizador especificado" #: ../gtk/src/scanner/ScannerSane.cc:168 ../gtk/src/scanner/ScannerTwain.cc:195 #: ../qt/src/scanner/ScannerSane.cc:168 ../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:403 ../gtk/src/scanner/ScannerTwain.cc:266 #: ../gtk/src/scanner/ScannerTwain.cc:292 ../qt/src/scanner/ScannerSane.cc:403 #: ../qt/src/scanner/ScannerTwain.cc:258 ../qt/src/scanner/ScannerTwain.cc:290 msgid "Unable to start scan" msgstr "Não foi possível iniciar a digitalização" #: ../gtk/src/scanner/ScannerSane.cc:411 ../gtk/src/scanner/ScannerSane.cc:461 #: ../gtk/src/scanner/ScannerTwain.cc:318 ../qt/src/scanner/ScannerSane.cc:411 #: ../qt/src/scanner/ScannerSane.cc:461 ../qt/src/scanner/ScannerTwain.cc:316 msgid "Error communicating with scanner" msgstr "Erro de comunicação com o digitalizador" #: ../gtk/src/scanner/ScannerSane.cc:520 ../qt/src/scanner/ScannerSane.cc:517 msgid "Failed to save image" msgstr "Falha ao gravar imagem" #: ../gtk/src/scanner/ScannerSane.cc:800 ../qt/src/scanner/ScannerSane.cc:797 msgid "Operation is cancelled." msgstr "A operação é cancelada." #: ../gtk/src/scanner/ScannerSane.cc:802 ../qt/src/scanner/ScannerSane.cc:799 msgid "Device is busy." msgstr "O dispositivo está ocupado." #: ../gtk/src/scanner/ScannerSane.cc:804 ../qt/src/scanner/ScannerSane.cc:801 msgid "Cover is opened." msgstr "A tampa está aberta." #: ../gtk/src/scanner/ScannerSane.cc:806 ../qt/src/scanner/ScannerSane.cc:803 msgid "Document feeder jammed." msgstr "Alimentador de documentos encravado." #: ../gtk/src/scanner/ScannerSane.cc:808 ../qt/src/scanner/ScannerSane.cc:805 msgid "Document feeder out of documents." msgstr "Falta de documentos no alimentador de documentos." #: ../gtk/src/scanner/ScannerSane.cc:810 ../qt/src/scanner/ScannerSane.cc:807 msgid "Access to scanner is denied." msgstr "Acesso ao scanner é negado." #: ../gtk/src/SourceManager.cc:118 ../qt/src/SourceManager.cc:124 msgid "PDFs with text" msgstr "PDF com texto" #: ../gtk/src/SourceManager.cc:118 ../qt/src/SourceManager.cc:124 msgid "" "These PDF files already contain text:\n" "%1" msgstr "" "Esses arquivos PDF já contêm texto:\n" "%1" #: ../gtk/src/SourceManager.cc:127 ../qt/src/SourceManager.cc:132 msgid "Unable to open files" msgstr "Não foi possível abrir os arquivos" #: ../gtk/src/SourceManager.cc:127 ../qt/src/SourceManager.cc:132 msgid "The following files could not be opened:%1" msgstr "Os arquivos a seguir não puderam ser abertos: %1" #: ../gtk/src/SourceManager.cc:141 ../qt/src/SourceManager.cc:143 msgid "Enter password for file '%1':" msgstr "Digite a palavra-passe para o ficheiro '%1':" #: ../gtk/src/SourceManager.cc:197 ../qt/src/SourceManager.cc:214 msgid "Images and PDFs" msgstr "Imagens e PDFs" #: ../gtk/src/SourceManager.cc:202 ../qt/src/SourceManager.cc:215 msgid "Select Files" msgstr "Selecione os arquivos" #: ../gtk/src/SourceManager.cc:208 ../qt/src/SourceManager.cc:226 msgid "Clipboard Error" msgstr "Erro da área de transferência" #: ../gtk/src/SourceManager.cc:208 ../qt/src/SourceManager.cc:226 msgid "Failed to read the clipboard." msgstr "Falha ao ler a área de transferência." #: ../gtk/src/SourceManager.cc:212 ../qt/src/SourceManager.cc:230 #: ../qt/src/SourceManager.cc:236 msgid "Pasted %1" msgstr "Colado %1" #: ../gtk/src/SourceManager.cc:224 ../qt/src/SourceManager.cc:243 msgid "Screenshot Error" msgstr "Erro de captura de ecrã" #: ../gtk/src/SourceManager.cc:224 ../qt/src/SourceManager.cc:243 msgid "Failed to take screenshot." msgstr "Falha ao capturar a ecrã." #: ../gtk/src/SourceManager.cc:228 ../qt/src/SourceManager.cc:247 msgid "Screenshot %1" msgstr "Captura de ecrã %1" #: ../gtk/src/SourceManager.cc:233 ../qt/src/SourceManager.cc:252 msgid "Saving image..." msgstr "Salvando imagem..." #: ../gtk/src/SourceManager.cc:240 ../qt/src/SourceManager.cc:265 msgid "Cannot Write File" msgstr "Não foi possível gravar o ficheiro" #: ../gtk/src/SourceManager.cc:240 ../qt/src/SourceManager.cc:265 msgid "Could not write to %1." msgstr "Não foi possível escrever no ficheiro %1." #: ../gtk/src/SourceManager.cc:267 ../qt/src/SourceManager.cc:287 msgid "Delete File?" msgstr "Apagar o ficheiro?" #: ../gtk/src/SourceManager.cc:267 ../qt/src/SourceManager.cc:287 msgid "The following files will be deleted:%1" msgstr "Os seguintes ficheiros serão apagados:%1" #: ../gtk/src/SourceManager.cc:332 ../qt/src/SourceManager.cc:338 msgid "Missing File" msgstr "Ficheiro ausente" #: ../gtk/src/SourceManager.cc:332 ../qt/src/SourceManager.cc:338 msgid "" "The following file has been deleted or moved:\n" "%1" msgstr "" "O seguinte ficheiro foi apagado ou movido:\n" "%1" #: ../gtk/src/SubstitutionsManager.cc:33 ../qt/src/SubstitutionsManager.cc:73 msgid "Search for" msgstr "Procurar por" #: ../gtk/src/SubstitutionsManager.cc:34 ../qt/src/SubstitutionsManager.cc:73 msgid "Replace with" msgstr "Substituir com" #: ../gtk/src/SubstitutionsManager.cc:69 ../gtk/src/SubstitutionsManager.cc:103 #: ../qt/src/SubstitutionsManager.cc:106 ../qt/src/SubstitutionsManager.cc:143 msgid "Substitutions List" msgstr "Lista de substituições" #: ../gtk/src/SubstitutionsManager.cc:70 ../qt/src/SubstitutionsManager.cc:106 msgid "Open Substitutions List" msgstr "Abrir lista de substituições" #: ../gtk/src/SubstitutionsManager.cc:75 ../qt/src/SubstitutionsManager.cc:112 msgid "Error Reading File" msgstr "Erro ao ler ficheiro" #: ../gtk/src/SubstitutionsManager.cc:75 ../qt/src/SubstitutionsManager.cc:112 msgid "Unable to read '%1'." msgstr "Não foi possível ler '%1'." #: ../gtk/src/SubstitutionsManager.cc:97 ../qt/src/SubstitutionsManager.cc:137 msgid "Errors Occurred Reading File" msgstr "Erros ocorreram na leitura do ficheiro" #: ../gtk/src/SubstitutionsManager.cc:97 ../qt/src/SubstitutionsManager.cc:137 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:104 ../qt/src/SubstitutionsManager.cc:143 msgid "Save Substitutions List" msgstr "Gravar lista de substituições" #: ../gtk/src/SubstitutionsManager.cc:110 ../qt/src/SubstitutionsManager.cc:149 msgid "Error Saving File" msgstr "Erro ao gravar ficheiro" #: ../gtk/src/SubstitutionsManager.cc:110 ../qt/src/SubstitutionsManager.cc:149 msgid "Unable to write to '%1'." msgstr "Não foi possível escrever em '%1'." #: ../gtk/src/SubstitutionsManager.cc:127 ../qt/src/SubstitutionsManager.cc:162 msgid "Save List?" msgstr "Gravar lista?" #: ../gtk/src/SubstitutionsManager.cc:127 ../qt/src/SubstitutionsManager.cc:162 msgid "Do you want to save the current list?" msgstr "Você deseja gravar a lista atual?" #: ../gtk/src/TessdataManager.cc:60 ../qt/src/TessdataManager.cc:74 #, fuzzy msgid "" "A session connection to the PackageKit backend is required for managing " "system-wide tesseract language packs, but it was not found. This service is " "usually provided by a software-management application such as Gnome " "Software. Please install software which provides the necessary PackageKit " "interface, use other system package management software to manage the " "tesseract language packs directly, or switch to using the user tessdata path " "in the configuration dialog." msgstr "" "PackageKit é necessária para o gerenciamento de pacotes de idiomas do " "tesseract de todo o sistema, mas não foi encontrado. Por favor use o " "software de gerenciamento de pacote do sistema para gerenciar os pacotes de " "idiomas do tesseract, ou alternar para usar o caminho de tessdata de usuário " "na caixa de diálogo de configuração." #: ../gtk/src/TessdataManager.cc:65 ../qt/src/TessdataManager.cc:79 msgid "Fetching available languages" msgstr "Buscando idiomas disponíveis" #: ../gtk/src/TessdataManager.cc:70 ../gtk/src/TessdataManager.cc:96 #: ../gtk/src/TessdataManager.cc:197 ../qt/src/TessdataManager.cc:84 #: ../qt/src/TessdataManager.cc:101 ../qt/src/TessdataManager.cc:197 msgid "Failed to fetch list of available languages: %1" msgstr "Falha ao obter a lista de idiomas disponíveis: %1" #: ../gtk/src/TessdataManager.cc:104 ../qt/src/TessdataManager.cc:113 #: ../qt/src/TessdataManager.cc:122 msgid "Parsing error: %1" msgstr "Erro de processamento: %1" #: ../gtk/src/TessdataManager.cc:235 ../qt/src/TessdataManager.cc:232 msgid "Applying changes..." msgstr "Aplicando alterações..." #: ../gtk/src/TessdataManager.cc:297 ../qt/src/TessdataManager.cc:278 msgid "Failed to create directory for tessdata files." msgstr "Falha ao criar o diretório para os ficheiros tessdata." #: ../gtk/src/TessdataManager.cc:306 ../qt/src/TessdataManager.cc:287 msgid "Downloading %1..." msgstr "Baixando %1..." #: ../gtk/src/TessdataManager.cc:330 msgid "" "The following files could not be downloaded or removed:\n" "%1\n" "\n" "Check the connectivity and directory permissions.\n" "\n" "Hint: If you don't have write permissions in system folders, you can switch " "to user paths in the settings dialog." msgstr "" "Os seguintes ficheiros não podem ser baixados ou removidos:\n" "%1\n" "\n" "Verifique as permissões de conectividade e diretório.\n" "\n" "Dica: Se você não tem permissões de gravação em pastas do sistema, você pode " "alternar para caminhos de usuário na caixa de diálogo Configurações." #: ../gtk/src/Utils.cc:64 msgid "Yes" msgstr "Sim" #: ../gtk/src/Utils.cc:67 msgid "No" msgstr "Não" #: ../gtk/src/Utils.cc:76 msgid "Discard" msgstr "Descartar" #: ../qt/data/AboutDialog.ui.h:1 msgid "About gImageReader" msgstr "Sobre o gImageReader" #: ../qt/data/AboutDialog.ui.h:3 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 "Codificação do sistema" #: ../qt/data/ConfigDialog.ui.h:15 msgid "UTF-8" msgstr "UTF-8" #: ../qt/data/ConfigDialog.ui.h:19 msgid "Text file encoding:" msgstr "Codificação de ficheiro 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 "" "

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/CrashHandler.ui.h:3 msgid "" "

Tesseract has " "aborted

Tesseract (the OCR engine) has aborted while " "recognizing text. This may occur if the used traineddatas are corrupt or " "incomplatible with the version of tesseract in use, or due to a bug in " "tesseract.

The stacktrace below may provide additional information " "about where the crash occured.

" msgstr "" #: ../qt/data/MainWindow.ui.h:17 msgid "Flatbed" msgstr "Mesa" #: ../qt/data/MainWindow.ui.h:18 msgid "ADF Front" msgstr "Frente do alimentador de documentos" #: ../qt/data/MainWindow.ui.h:19 msgid "ADF Back" msgstr "Verso do alimentador de documentos" #: ../qt/data/MainWindow.ui.h:20 msgid "ADF Duplex" msgstr "Duplex do alimentador de documentos" #. Remove & from some labels which designer insists in adding #: ../qt/data/MainWindow.ui.h:21 ../qt/src/Ui_MainWindow.hh:50 msgid "Sources" msgstr "Fontes" #: ../qt/data/MainWindow.ui.h:22 msgid "Zoom In" msgstr "Aumentar zoom" #: ../qt/data/MainWindow.ui.h:24 msgid "Zoom Out" msgstr "Diminuir zoom" #: ../qt/data/MainWindow.ui.h:26 msgid "Normal Size" msgstr "Tamanho Normal" #: ../qt/data/MainWindow.ui.h:28 msgid "Best Fit" msgstr "Melhor Ajuste" #: ../qt/data/MainWindow.ui.h:30 msgid "Rotate Left" msgstr "Rotacionar para a esquerda" #: ../qt/data/MainWindow.ui.h:31 msgid "Rotate left" msgstr "Rotacionar para a esquerda" #: ../qt/data/MainWindow.ui.h:32 msgid "Rotate Right" msgstr "Rotacionar para a direita" #: ../qt/data/MainWindow.ui.h:33 msgid "Rotate right" msgstr "Rotacionar para a direita" #: ../qt/data/MainWindow.ui.h:34 msgid "Image Controls" msgstr "Controles de Imagem" #: ../qt/data/MainWindow.ui.h:36 msgid "Autodetect Layout" msgstr "Detectar Layout Automaticamente" #: ../qt/data/MainWindow.ui.h:38 msgid "Toggle Output Pane" msgstr "Alternar Exibição do Painel de Saída" #: ../qt/data/PdfExportDialog.ui.h:5 msgid "Backend:" msgstr "Backend:" #: ../qt/data/PdfExportDialog.ui.h:8 msgid "Portrait" msgstr "Retrato" #: ../qt/data/PdfExportDialog.ui.h:9 msgid "Landscape" msgstr "Paisagem" #: ../qt/src/hocr/HOCRPdfExporter.cc:142 msgid "Failed to write to file" msgstr "Falha ao gravar ficheiro" #. Output toolbar #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:55 #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:56 msgid "Open hOCR file" msgstr "Abrir ficheiro hOCR" #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:57 #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:58 msgid "Save as hOCR text" msgstr "Gravar como texto hOCR" #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:79 #: ../qt/src/Ui_OutputEditorText.hh:106 msgid "Find and Replace" msgstr "Localizar e Substituir" #: ../qt/src/MainWindow.cc:581 #, fuzzy msgid "" "The following dictionary files were installed:\n" "%1" msgstr "Os seguintes dicionários foram instalados:%1" #: ../qt/src/TessdataManager.cc:308 msgid "" "The following files could not be downloaded or removed:\n" "%1\n" "\n" "Check the connectivity and directory permissions.\n" "Hint: If you don't have write permissions in system folders, you can switch " "to user paths in the settings dialog." msgstr "" "Os seguintes ficheiros não podem ser baixados ou removidos:\n" "%1\n" "\n" "Verifique as permissões de conectividade e diretório.\n" "\n" "Dica: Se você não tem permissões de gravação em pastas do sistema, você pode " "alternar para caminhos de usuário na caixa de diálogo Configurações." #: ../qt/src/Ui_MainWindow.hh:51 msgid "Output" msgstr "Saída" #: ../qt/src/Ui_MainWindow.hh:135 msgid "OCR mode:" msgstr "Modo de OCR:" #: ../qt/src/Ui_MainWindow.hh:209 msgid "Remove Image" msgstr "Remover imagem" #: ../qt/src/Ui_MainWindow.hh:212 msgid "Delete Image" msgstr "Apagar Imagem" #: ../qt/src/Ui_MainWindow.hh:215 msgid "Clear List" msgstr "Limpar Lista" #: ../qt/src/Ui_OutputEditorText.hh:101 msgid "Strip Line Breaks" msgstr "Remover quebras de linha" #: ../qt/src/Ui_OutputEditorText.hh:115 msgid "Save Output" msgstr "Gravar Saída" #: ../qt/src/Ui_OutputEditorText.hh:117 msgid "Clear Output" msgstr "Limpar Saída" #~ msgid "The application has crashed" #~ msgstr "A aplicação parou de funcionar" #~ 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 caiu com a seguinte mensagem:\n" #~ "\n" #~ "%1\n" #~ "\n" #~ "Isso normalmente acontece por uma das seguintes razões:\n" #~ "- Usando ficheiros traineddata desatualizados.\n" #~ "- Faltam arquivos de dados de idioma auxiliar.\n" #~ "- Ficheiros de dados de idioma corrompidos.\n" #~ "\n" #~ "Certifique-se de que seu idioma de arquivos de dados são válidos e " #~ "compatíveis com o tesseract %2." #~ msgid "Could not read %1: %2" #~ msgstr "Não foi possível ler 1%: %2" gImageReader-3.3.1/po/pt_BR.po000066400000000000000000002100131351740627400160240ustar00rootroot00000000000000# 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: 2019-07-25 23:17+0200\n" "PO-Revision-Date: 2018-04-05 00:04+0000\n" "Last-Translator: ssantos \n" "Language-Team: Portuguese (Brazil) \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: Weblate 2.20-dev\n" #: ../data/gimagereader.desktop.in.h:1 msgid "OCR application" msgstr "Aplicativo de OCR" #: ../gtk/data/appmenu.ui.h:1 ../qt/src/Ui_MainWindow.hh:167 msgid "Redetect Languages" msgstr "Detectar idiomas novamente" #: ../gtk/data/appmenu.ui.h:2 ../qt/src/Ui_MainWindow.hh:170 msgid "Manage Languages" msgstr "Gerenciar Idiomas" #: ../gtk/data/appmenu.ui.h:3 ../gtk/data/ConfigDialog.ui.h:1 #: ../qt/data/ConfigDialog.ui.h:1 ../qt/src/Ui_MainWindow.hh:173 msgid "Preferences" msgstr "Preferências" #: ../gtk/data/appmenu.ui.h:4 ../gtk/data/ConfigDialog.ui.h:2 #: ../gtk/src/MainWindow.cc:482 ../qt/src/MainWindow.cc:481 #: ../qt/src/Ui_MainWindow.hh:178 msgid "Help" msgstr "Ajuda" #: ../gtk/data/appmenu.ui.h:5 ../qt/data/AboutDialog.ui.h:2 #: ../qt/src/Ui_MainWindow.hh:181 msgid "About" msgstr "Sobre" #: ../gtk/data/appmenu.ui.h:6 msgid "Quit" msgstr "Sair" #: ../gtk/data/ConfigDialog.ui.h:3 ../gtk/data/MainWindow.ui.h:47 #: ../gtk/data/OutputEditorHOCR.ui.h:3 ../gtk/data/PdfExportDialog.ui.h:3 #: ../gtk/src/FileDialogs.cc:152 ../gtk/src/Utils.cc:61 #: ../qt/data/ConfigDialog.ui.h:26 msgid "OK" msgstr "OK" #: ../gtk/data/ConfigDialog.ui.h:4 msgid "Output pane orientation:" msgstr "Orientação do painel de saída:" #: ../gtk/data/ConfigDialog.ui.h:5 msgid "Horizontal" msgstr "Horizontal" #: ../gtk/data/ConfigDialog.ui.h:6 msgid "Vertical" msgstr "Vertical" #: ../gtk/data/ConfigDialog.ui.h:7 ../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/ConfigDialog.ui.h:8 ../qt/data/ConfigDialog.ui.h:4 msgid "Automatically check for new program versions" msgstr "Verificar automaticamente novas versões do programa" #: ../gtk/data/ConfigDialog.ui.h:9 ../qt/data/ConfigDialog.ui.h:3 msgid "Predefined language definitions:" msgstr "Definições de idioma predefinidas:" #: ../gtk/data/ConfigDialog.ui.h:10 ../qt/data/ConfigDialog.ui.h:12 msgid "Additional language definitions:" msgstr "Definições de idiomas adicionais:" #: ../gtk/data/ConfigDialog.ui.h:11 ../qt/data/ConfigDialog.ui.h:20 msgid "The prefix of the tesseract language data file" msgstr "O prefixo do ficheiro de dados do idioma do tesseract" #: ../gtk/data/ConfigDialog.ui.h:12 ../qt/data/ConfigDialog.ui.h:21 msgid "Prefix" msgstr "Prefixo" #: ../gtk/data/ConfigDialog.ui.h:13 ../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/ConfigDialog.ui.h:14 ../qt/data/ConfigDialog.ui.h:23 msgid "ISO Code" msgstr "Código ISO" #: ../gtk/data/ConfigDialog.ui.h:15 ../qt/data/ConfigDialog.ui.h:24 msgid "The name of the language" msgstr "O nome do idioma" #: ../gtk/data/ConfigDialog.ui.h:16 ../qt/data/ConfigDialog.ui.h:25 msgid "Name" msgstr "Nome" #: ../gtk/data/ConfigDialog.ui.h:17 ../gtk/data/MainWindow.ui.h:46 #: ../gtk/data/OutputEditorHOCR.ui.h:2 ../gtk/data/PdfExportDialog.ui.h:2 #: ../gtk/src/Acquirer.cc:34 ../gtk/src/FileDialogs.cc:151 #: ../gtk/src/Utils.cc:70 ../qt/data/ConfigDialog.ui.h:27 #: ../qt/data/MainWindow.ui.h:12 msgid "Cancel" msgstr "Cancelar" #: ../gtk/data/ConfigDialog.ui.h:18 ../qt/data/ConfigDialog.ui.h:5 msgid "Output pane font:" msgstr "Fonte do painel de saída:" #: ../gtk/data/ConfigDialog.ui.h:19 ../qt/data/ConfigDialog.ui.h:2 msgid "Default" msgstr "Padrão" #: ../gtk/data/ConfigDialog.ui.h:20 ../qt/data/ConfigDialog.ui.h:6 msgid "Language data locations:" msgstr "Locais de dados de idioma:" #: ../gtk/data/ConfigDialog.ui.h:21 ../qt/data/ConfigDialog.ui.h:13 msgid "Language definitions path:" msgstr "Caminho de definições de idioma:" #: ../gtk/data/ConfigDialog.ui.h:22 ../qt/data/ConfigDialog.ui.h:28 msgid "Spelling dictionaries path:" msgstr "Caminho de dicionários de ortografia:" #: ../gtk/data/ConfigDialog.ui.h:23 ../qt/data/ConfigDialog.ui.h:10 msgid "System-wide paths" msgstr "Caminhos de todo o sistema" #: ../gtk/data/ConfigDialog.ui.h:24 ../qt/data/ConfigDialog.ui.h:11 msgid "User paths" msgstr "Caminhos de usuário" #: ../gtk/data/ConfigDialog.ui.h:25 ../qt/data/ConfigDialog.ui.h:29 msgid "Automatically open exported documents with default application" msgstr "Abrir automaticamente documentos exportados com o aplicativo padrão" #: ../gtk/data/CrashHandler.ui.h:1 ../qt/src/CrashHandler.cc:38 msgid "Regenerate backtrace" msgstr "Regenerar backtrace" #: ../gtk/data/CrashHandler.ui.h:3 #, fuzzy, no-c-format msgid "" "The application has crashed\n" "\n" "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/CrashHandler.ui.h:6 msgid "" "Tesseract has aborted\n" "\n" "Tesseract (the OCR engine) has aborted while recognizing text. This may " "occur if the used traineddatas are corrupt or incomplatible with the version " "of tesseract in use, or due to a bug in tesseract.\n" "\n" "The stacktrace below may provide additional information about where the " "crash occured.\n" msgstr "" #: ../gtk/data/MainWindow.ui.h:1 ../qt/data/MainWindow.ui.h:39 msgid "Toggle output pane" msgstr "Alternar exibição do painel de saída" #: ../gtk/data/MainWindow.ui.h:2 ../qt/src/Ui_MainWindow.hh:66 msgid "Rotate current page" msgstr "Girar a página atual" #: ../gtk/data/MainWindow.ui.h:3 ../qt/src/Ui_MainWindow.hh:67 msgid "Rotate all pages" msgstr "Rodar todas as páginas" #. Sources toolbar #: ../gtk/data/MainWindow.ui.h:4 ../qt/src/Ui_MainWindow.hh:192 msgid "Recent" msgstr "Recente" #: ../gtk/data/MainWindow.ui.h:5 ../qt/src/Ui_MainWindow.hh:193 msgid "Paste" msgstr "Colar" #: ../gtk/data/MainWindow.ui.h:6 ../qt/src/Ui_MainWindow.hh:194 msgid "Take Screenshot" msgstr "Capturar a tela" #: ../gtk/data/MainWindow.ui.h:7 ../qt/data/MainWindow.ui.h:23 msgid "Zoom in" msgstr "Aumentar zoom" #: ../gtk/data/MainWindow.ui.h:8 ../qt/data/MainWindow.ui.h:25 msgid "Zoom out" msgstr "Diminuir zoom" #: ../gtk/data/MainWindow.ui.h:9 ../qt/data/MainWindow.ui.h:27 msgid "Normal size" msgstr "Tamanho normal" #: ../gtk/data/MainWindow.ui.h:10 ../qt/data/MainWindow.ui.h:29 msgid "Best fit" msgstr "Melhor ajuste" #: ../gtk/data/MainWindow.ui.h:11 ../qt/src/Ui_MainWindow.hh:75 msgid "Select rotation mode" msgstr "Selecione o modo de rotação" #: ../gtk/data/MainWindow.ui.h:12 ../gtk/data/OutputEditorText.ui.h:13 #: ../qt/src/Ui_OutputEditorText.hh:95 msgid "Select insert mode" msgstr "Selecione o modo de inserção" #: ../gtk/data/MainWindow.ui.h:13 ../qt/src/Ui_MainWindow.hh:109 #, fuzzy msgid "Select page" msgstr "Escolher idioma" #: ../gtk/data/MainWindow.ui.h:14 ../qt/data/MainWindow.ui.h:35 msgid "Image controls" msgstr "Controles de imagem" #: ../gtk/data/MainWindow.ui.h:15 ../qt/src/Ui_MainWindow.hh:139 msgid "Plain text" msgstr "Texto sem formatação" #: ../gtk/data/MainWindow.ui.h:16 ../qt/src/Ui_MainWindow.hh:139 msgid "hOCR, PDF" msgstr "hOCR, PDF" #: ../gtk/data/MainWindow.ui.h:17 ../qt/data/MainWindow.ui.h:37 msgid "Autodetect layout" msgstr "Detectar layout automaticamente" #: ../gtk/data/MainWindow.ui.h:18 msgid "Recognize all" msgstr "Reconhecer tudo" #: ../gtk/data/MainWindow.ui.h:19 msgid "Select language" msgstr "Escolher idioma" #: ../gtk/data/MainWindow.ui.h:20 ../qt/src/Ui_MainWindow.hh:205 msgid "Add images" msgstr "Adicionar imagens" #: ../gtk/data/MainWindow.ui.h:21 ../qt/src/Ui_MainWindow.hh:204 msgid "Add Images" msgstr "Adicionar imagens" #: ../gtk/data/MainWindow.ui.h:22 ../qt/src/Ui_MainWindow.hh:210 msgid "Remove image from list" msgstr "Remover imagem da lista" #: ../gtk/data/MainWindow.ui.h:23 ../qt/src/Ui_MainWindow.hh:213 msgid "Delete image" msgstr "Apagar imagem" #: ../gtk/data/MainWindow.ui.h:24 ../qt/src/Ui_MainWindow.hh:216 msgid "Clear list" msgstr "Limpar lista" #: ../gtk/data/MainWindow.ui.h:25 ../qt/data/MainWindow.ui.h:5 msgid "Files" msgstr "Arquivos" #: ../gtk/data/MainWindow.ui.h:26 ../qt/data/MainWindow.ui.h:8 msgid "Device:" msgstr "Dispositivo:" #: ../gtk/data/MainWindow.ui.h:27 ../gtk/data/TessdataManager.ui.h:4 #: ../qt/data/MainWindow.ui.h:7 ../qt/src/TessdataManager.cc:59 msgid "Refresh" msgstr "Atualizar" #: ../gtk/data/MainWindow.ui.h:28 ../qt/data/MainWindow.ui.h:9 msgid "Output:" msgstr "Saída:" #: ../gtk/data/MainWindow.ui.h:29 ../qt/data/MainWindow.ui.h:13 msgid "Mode:" msgstr "Modo:" #: ../gtk/data/MainWindow.ui.h:30 ../gtk/src/hocr/HOCRPdfExporter.cc:313 #: ../qt/data/MainWindow.ui.h:15 ../qt/src/hocr/HOCRPdfExporter.cc:347 msgid "Color" msgstr "Cor" #: ../gtk/data/MainWindow.ui.h:31 ../gtk/src/hocr/HOCRPdfExporter.cc:316 #: ../qt/data/MainWindow.ui.h:14 ../qt/src/hocr/HOCRPdfExporter.cc:349 #: ../qt/src/hocr/HOCRPdfExporter.cc:351 msgid "Grayscale" msgstr "Escala de cinza" #: ../gtk/data/MainWindow.ui.h:32 ../qt/data/MainWindow.ui.h:10 msgid "Resolution:" msgstr "Resolução:" #: ../gtk/data/MainWindow.ui.h:33 ../qt/data/MainWindow.ui.h:11 msgid "Scan" msgstr "Digitalizar" #: ../gtk/data/MainWindow.ui.h:34 ../qt/data/MainWindow.ui.h:16 msgid "Source:" msgstr "Origem:" #: ../gtk/data/MainWindow.ui.h:35 ../qt/data/MainWindow.ui.h:6 msgid "Acquire" msgstr "Obter" #: ../gtk/data/MainWindow.ui.h:36 ../qt/data/MainWindow.ui.h:1 msgid "Brightness" msgstr "Brilho" #: ../gtk/data/MainWindow.ui.h:37 ../qt/data/MainWindow.ui.h:2 msgid "Contrast" msgstr "Contraste" #: ../gtk/data/MainWindow.ui.h:38 ../qt/data/MainWindow.ui.h:3 msgid "Resolution" msgstr "Resolução" #: ../gtk/data/MainWindow.ui.h:39 ../qt/data/MainWindow.ui.h:4 msgid "Invert colors" msgstr "Inverter cores" #: ../gtk/data/MainWindow.ui.h:40 msgid "A graphical frontend to tesseract-ocr" msgstr "Uma interface gráfica para o tesseract-ocr" #: ../gtk/data/MainWindow.ui.h:41 ../qt/data/CharacterListDialog.ui.h:1 msgid "Character whitelist / blacklist" msgstr "" #: ../gtk/data/MainWindow.ui.h:42 ../qt/data/CharacterListDialog.ui.h:2 msgid "Exclude these characters from being recognized (blacklist):" msgstr "" #: ../gtk/data/MainWindow.ui.h:43 ../qt/data/CharacterListDialog.ui.h:3 #, fuzzy msgid "Enter a string of characters..." msgstr "Obtendo parâmetros..." #: ../gtk/data/MainWindow.ui.h:44 ../qt/data/CharacterListDialog.ui.h:4 msgid "Only allow the following characters to be recognized (whitelist):" msgstr "" #: ../gtk/data/MainWindow.ui.h:45 ../qt/data/PageRangeDialog.ui.h:1 msgid "Page Range" msgstr "Intervalo de páginas" #: ../gtk/data/MainWindow.ui.h:48 ../qt/data/PageRangeDialog.ui.h:2 msgid "Page range:" msgstr "Intervalo de páginas:" #: ../gtk/data/MainWindow.ui.h:49 ../qt/data/PageRangeDialog.ui.h:3 msgid "Example: 1-10, 13, 14-18" msgstr "Exemplo: 1-10, 13, 14-18" #: ../gtk/data/MainWindow.ui.h:50 ../qt/data/PageRangeDialog.ui.h:4 msgid "Recognition area:" msgstr "Ãrea de reconhecimento:" #: ../gtk/data/MainWindow.ui.h:51 ../gtk/src/Recognizer.cc:375 #: ../qt/data/PageRangeDialog.ui.h:5 ../qt/src/Recognizer.cc:369 msgid "Entire page" msgstr "Página inteira" #: ../gtk/data/MainWindow.ui.h:52 ../qt/data/PageRangeDialog.ui.h:6 msgid "Autodetect" msgstr "Detectar automaticamente" #: ../gtk/data/MainWindow.ui.h:53 ../qt/data/PageRangeDialog.ui.h:7 msgid "Prepend to output text:" msgstr "Antepor ao texto de saída:" #: ../gtk/data/MainWindow.ui.h:54 ../qt/data/PageRangeDialog.ui.h:8 msgid "Source filename" msgstr "Nome do ficheiro origem" #: ../gtk/data/MainWindow.ui.h:55 ../qt/data/PageRangeDialog.ui.h:9 msgid "Source page" msgstr "Página de origem" #: ../gtk/data/MainWindow.ui.h:56 ../qt/src/SourceManager.cc:146 msgid "Protected PDF" msgstr "PDF protegido" #: ../gtk/data/MainWindow.ui.h:57 ../qt/src/Recognizer.cc:76 msgid "Current Page" msgstr "Página atual" #: ../gtk/data/MainWindow.ui.h:58 ../qt/src/Recognizer.cc:79 msgid "Multiple Pages..." msgstr "Múltiplas páginas..." #: ../gtk/data/OutputEditorHOCR.ui.h:1 ../qt/src/hocr/OutputEditorHOCR.cc:580 msgid "Add Word" msgstr "Adicionar Palavra" #: ../gtk/data/OutputEditorHOCR.ui.h:4 ../qt/src/hocr/OutputEditorHOCR.cc:580 msgid "Enter word:" msgstr "Digite a palavra:" #: ../gtk/data/OutputEditorHOCR.ui.h:5 ../qt/src/hocr/Ui_OutputEditorHOCR.hh:61 #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:62 msgid "Export to plain text" msgstr "Exportar para texto sem formatação" #: ../gtk/data/OutputEditorHOCR.ui.h:6 ../qt/src/hocr/Ui_OutputEditorHOCR.hh:64 #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:65 msgid "Export to PDF" msgstr "Exportar para PDF" #: ../gtk/data/OutputEditorHOCR.ui.h:7 ../qt/src/hocr/Ui_OutputEditorHOCR.hh:67 #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:68 msgid "Export to ODT" msgstr "Exportar para ODT" #: ../gtk/data/OutputEditorHOCR.ui.h:8 ../gtk/data/OutputEditorText.ui.h:18 #: ../qt/src/Ui_OutputEditorText.hh:116 msgid "Save output" msgstr "Gravar saída" #: ../gtk/data/OutputEditorHOCR.ui.h:9 ../qt/src/hocr/Ui_OutputEditorHOCR.hh:72 #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:73 msgid "Export" msgstr "Exportar" #: ../gtk/data/OutputEditorHOCR.ui.h:10 ../gtk/data/OutputEditorText.ui.h:19 #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:77 #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:78 #: ../qt/src/Ui_OutputEditorText.hh:118 msgid "Clear output" msgstr "Limpar saída" #: ../gtk/data/OutputEditorHOCR.ui.h:11 ../gtk/data/OutputEditorText.ui.h:15 #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:80 #: ../qt/src/Ui_OutputEditorText.hh:107 msgid "Find and replace" msgstr "Localizar e substituir" #: ../gtk/data/OutputEditorHOCR.ui.h:12 #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:82 #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:83 msgid "Show confidence values" msgstr "Mostrar valores de confiança" #: ../gtk/data/OutputEditorHOCR.ui.h:13 ../gtk/data/PdfExportDialog.ui.h:41 #: ../qt/data/PdfExportDialog.ui.h:2 ../qt/src/hocr/Ui_OutputEditorHOCR.hh:85 #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:86 msgid "Show preview" msgstr "Mostrar pré-visualização" #: ../gtk/data/OutputEditorHOCR.ui.h:14 #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:121 msgid "Next (F3)" msgstr "Seguinte (F3)" #: ../gtk/data/OutputEditorHOCR.ui.h:15 #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:122 msgid "Previous (Shift+F3)" msgstr "Anterior (Shift+F3)" #: ../gtk/data/OutputEditorHOCR.ui.h:16 ../gtk/src/hocr/OutputEditorHOCR.cc:890 #: ../qt/src/hocr/OutputEditorHOCR.cc:730 #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:126 msgid "Expand all" msgstr "Expandir tudo" #: ../gtk/data/OutputEditorHOCR.ui.h:17 ../gtk/src/hocr/OutputEditorHOCR.cc:893 #: ../qt/src/hocr/OutputEditorHOCR.cc:731 #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:127 msgid "Collapse all" msgstr "Dobrar tudo" #: ../gtk/data/OutputEditorHOCR.ui.h:18 #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:148 msgid "Properties" msgstr "Propriedades" #: ../gtk/data/OutputEditorHOCR.ui.h:19 #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:152 msgid "Source" msgstr "Origem" #. Output insert mode #: ../gtk/data/OutputEditorText.ui.h:1 ../qt/src/Ui_OutputEditorText.hh:52 msgid "Append to current text" msgstr "Acrescentar no texto atual" #: ../gtk/data/OutputEditorText.ui.h:2 ../qt/src/Ui_OutputEditorText.hh:53 msgid "Insert at cursor" msgstr "Inserir no cursor" #: ../gtk/data/OutputEditorText.ui.h:3 ../qt/src/Ui_OutputEditorText.hh:54 msgid "Replace current text" msgstr "Substituir o texto atual" #. Output postprocessing #: ../gtk/data/OutputEditorText.ui.h:4 ../qt/src/Ui_OutputEditorText.hh:62 msgid "Keep line break if..." msgstr "Manter quebra de linha se..." #: ../gtk/data/OutputEditorText.ui.h:5 ../qt/src/Ui_OutputEditorText.hh:64 msgid "Preceded by end mark (.?!)" msgstr "Precedido por marca de fim (.?!)" #: ../gtk/data/OutputEditorText.ui.h:6 ../qt/src/Ui_OutputEditorText.hh:66 msgid "Preceded or succeeded by quote" msgstr "Precedida ou sucedida por citação" #: ../gtk/data/OutputEditorText.ui.h:7 ../qt/src/Ui_OutputEditorText.hh:68 msgid "Other options" msgstr "Outras opções" #: ../gtk/data/OutputEditorText.ui.h:8 ../qt/src/Ui_OutputEditorText.hh:70 msgid "Join hyphenated words" msgstr "Juntar palavras com hífen" #: ../gtk/data/OutputEditorText.ui.h:9 ../qt/src/Ui_OutputEditorText.hh:72 msgid "Collapse whitespace" msgstr "Juntar espaços em branco" #: ../gtk/data/OutputEditorText.ui.h:10 ../qt/src/Ui_OutputEditorText.hh:74 msgid "Preserve paragraphs" msgstr "Preservar parágrafos" #: ../gtk/data/OutputEditorText.ui.h:11 ../qt/src/Ui_OutputEditorText.hh:76 msgid "Visual aids" msgstr "Recursos visuais" #: ../gtk/data/OutputEditorText.ui.h:12 ../qt/src/Ui_OutputEditorText.hh:78 msgid "Draw whitespace" msgstr "Desenhar espaços" #: ../gtk/data/OutputEditorText.ui.h:14 ../qt/src/Ui_OutputEditorText.hh:102 msgid "Strip line breaks on selected text" msgstr "Remover quebras de linha do texto selecionado" #: ../gtk/data/OutputEditorText.ui.h:16 ../qt/src/Ui_OutputEditorText.hh:109 #: ../qt/src/Ui_OutputEditorText.hh:110 msgid "Undo" msgstr "Desfazer" #: ../gtk/data/OutputEditorText.ui.h:17 ../qt/src/Ui_OutputEditorText.hh:112 #: ../qt/src/Ui_OutputEditorText.hh:113 msgid "Redo" msgstr "Refazer" #: ../gtk/data/PdfExportDialog.ui.h:1 ../qt/data/PdfExportDialog.ui.h:1 msgid "PDF Export" msgstr "Exportação PDF" #: ../gtk/data/PdfExportDialog.ui.h:4 ../qt/data/PdfExportDialog.ui.h:4 msgid "Output mode:" msgstr "Modo de saída:" #: ../gtk/data/PdfExportDialog.ui.h:5 ../qt/data/PdfExportDialog.ui.h:6 msgid "PDF" msgstr "PDF" #: ../gtk/data/PdfExportDialog.ui.h:6 ../qt/data/PdfExportDialog.ui.h:7 msgid "PDF with invisible text overlay" msgstr "PDF com sobreposição de texto invisível" #: ../gtk/data/PdfExportDialog.ui.h:7 ../qt/data/PdfExportDialog.ui.h:16 msgid "Format:" msgstr "Formato:" #: ../gtk/data/PdfExportDialog.ui.h:8 ../qt/data/PdfExportDialog.ui.h:17 msgid "Compression:" msgstr "Compressão:" #: ../gtk/data/PdfExportDialog.ui.h:9 ../qt/data/PdfExportDialog.ui.h:14 msgid "Compression quality:" msgstr "Qualidade de compressão:" #: ../gtk/data/PdfExportDialog.ui.h:10 ../qt/data/PdfExportDialog.ui.h:15 msgid "DPI:" msgstr "DPI:" #: ../gtk/data/PdfExportDialog.ui.h:11 ../qt/data/PdfExportDialog.ui.h:18 msgid "Dithering algorithm:" msgstr "Algoritmo de pontilhamento:" #: ../gtk/data/PdfExportDialog.ui.h:12 ../qt/data/PdfExportDialog.ui.h:13 msgid "Image settings:" msgstr "Configurações de imagem:" #: ../gtk/data/PdfExportDialog.ui.h:13 ../qt/data/PdfExportDialog.ui.h:25 msgid "Uniformize line and word spacing" msgstr "Homogenizar a linha e espaçamento entre palavras" #: ../gtk/data/PdfExportDialog.ui.h:14 ../qt/data/PdfExportDialog.ui.h:21 msgid "Override font family:" msgstr "Sobrescrever a família da fonte:" #: ../gtk/data/PdfExportDialog.ui.h:15 ../qt/data/PdfExportDialog.ui.h:27 msgid "Fallback font family:" msgstr "Família de fonte fallback:" #: ../gtk/data/PdfExportDialog.ui.h:16 ../qt/data/PdfExportDialog.ui.h:20 msgid "Override font size:" msgstr "Sobrescrever o tamanho da fonte:" #: ../gtk/data/PdfExportDialog.ui.h:17 ../qt/data/PdfExportDialog.ui.h:23 msgid "Font scaling:" msgstr "Escala de fonte:" #: ../gtk/data/PdfExportDialog.ui.h:18 ../qt/data/PdfExportDialog.ui.h:26 msgid "pt" msgstr "pt" #: ../gtk/data/PdfExportDialog.ui.h:19 ../qt/data/PdfExportDialog.ui.h:22 msgid "Preserve spaces wider than:" msgstr "Preserve espaços mais largos do que:" #: ../gtk/data/PdfExportDialog.ui.h:20 ../qt/data/PdfExportDialog.ui.h:24 msgid "characters" msgstr "letras" #: ../gtk/data/PdfExportDialog.ui.h:21 ../qt/data/PdfExportDialog.ui.h:28 msgid "Sanitize hyphens before line breaks" msgstr "" #: ../gtk/data/PdfExportDialog.ui.h:22 ../qt/data/PdfExportDialog.ui.h:19 msgid "Text settings:" msgstr "Configurações de texto:" #: ../gtk/data/PdfExportDialog.ui.h:23 ../qt/data/PdfExportDialog.ui.h:10 msgid "Paper size:" msgstr "Tamanho do papel:" #: ../gtk/data/PdfExportDialog.ui.h:24 ../qt/data/PdfExportDialog.ui.h:11 msgid "Width" msgstr "Largura" #: ../gtk/data/PdfExportDialog.ui.h:25 ../qt/data/PdfExportDialog.ui.h:12 msgid "Height" msgstr "Altura" #: ../gtk/data/PdfExportDialog.ui.h:26 ../qt/data/PdfExportDialog.ui.h:29 msgid "Treat image sources as having true DPI:" msgstr "" #: ../gtk/data/PdfExportDialog.ui.h:27 ../qt/data/PdfExportDialog.ui.h:3 msgid "Basic" msgstr "Básico" #: ../gtk/data/PdfExportDialog.ui.h:28 ../qt/data/PdfExportDialog.ui.h:31 msgid "PDF version:" msgstr "Versão de PDF:" #: ../gtk/data/PdfExportDialog.ui.h:29 ../qt/data/PdfExportDialog.ui.h:33 msgid "Password:" msgstr "Senha:" #: ../gtk/data/PdfExportDialog.ui.h:30 ../qt/data/PdfExportDialog.ui.h:34 msgid "Confirm password:" msgstr "Confirmar senha:" #: ../gtk/data/PdfExportDialog.ui.h:31 ../qt/data/PdfExportDialog.ui.h:32 msgid "Encryption (optional):" msgstr "Criptografia (opcional):" #: ../gtk/data/PdfExportDialog.ui.h:32 ../qt/data/PdfExportDialog.ui.h:36 msgid "Author:" msgstr "Autor:" #: ../gtk/data/PdfExportDialog.ui.h:33 ../qt/data/PdfExportDialog.ui.h:38 msgid "Title:" msgstr "Título:" #: ../gtk/data/PdfExportDialog.ui.h:34 ../qt/data/PdfExportDialog.ui.h:40 msgid "Subject:" msgstr "Assunto:" #: ../gtk/data/PdfExportDialog.ui.h:35 ../qt/data/PdfExportDialog.ui.h:37 msgid "Creator:" msgstr "Criador:" #: ../gtk/data/PdfExportDialog.ui.h:36 ../qt/data/PdfExportDialog.ui.h:39 msgid "Producer:" msgstr "Produtor:" #: ../gtk/data/PdfExportDialog.ui.h:37 ../qt/data/PdfExportDialog.ui.h:41 msgid "Keywords:" msgstr "Palavras-chave:" #: ../gtk/data/PdfExportDialog.ui.h:38 ../qt/data/PdfExportDialog.ui.h:35 msgid "Additional information (optional):" msgstr "Informação adicional (opcional):" #: ../gtk/data/PdfExportDialog.ui.h:39 ../qt/data/PdfExportDialog.ui.h:42 msgid "Import from current source" msgstr "Importar da origem atual" #: ../gtk/data/PdfExportDialog.ui.h:40 ../qt/data/PdfExportDialog.ui.h:30 msgid "Advanced" msgstr "Avançado" #: ../gtk/data/SearchReplaceFrame.ui.h:1 ../qt/data/SearchReplaceFrame.ui.h:4 msgid "Find" msgstr "Localizar" #: ../gtk/data/SearchReplaceFrame.ui.h:2 ../qt/data/SearchReplaceFrame.ui.h:2 msgid "Replace" msgstr "Substituir" #: ../gtk/data/SearchReplaceFrame.ui.h:3 ../qt/data/SearchReplaceFrame.ui.h:3 msgid "Replace all" msgstr "Substituir todos" #: ../gtk/data/SearchReplaceFrame.ui.h:4 ../qt/data/SearchReplaceFrame.ui.h:5 msgid "Find previous" msgstr "Localizar anterior" #: ../gtk/data/SearchReplaceFrame.ui.h:5 ../qt/data/SearchReplaceFrame.ui.h:6 msgid "Find next" msgstr "Localizar próximo" #: ../gtk/data/SearchReplaceFrame.ui.h:6 ../qt/data/SearchReplaceFrame.ui.h:7 msgid "Match case" msgstr "Diferenciar maiúsculas e minúsculas" #: ../gtk/data/SearchReplaceFrame.ui.h:7 #: ../gtk/data/SubstitutionsManager.ui.h:1 ../qt/data/SearchReplaceFrame.ui.h:1 #: ../qt/src/SubstitutionsManager.cc:36 msgid "Substitutions" msgstr "Substituições" #: ../gtk/data/SelectionMenu.ui.h:1 ../qt/src/DisplayerToolSelect.cc:239 msgid "Delete" msgstr "Apagar" #: ../gtk/data/SelectionMenu.ui.h:2 ../qt/src/DisplayerToolSelect.cc:225 msgid "Order:" msgstr "Ordem:" #: ../gtk/data/SelectionMenu.ui.h:3 ../gtk/src/hocr/DisplayerToolHOCR.cc:29 #: ../qt/src/DisplayerToolSelect.cc:240 ../qt/src/hocr/DisplayerToolHOCR.cc:31 msgid "Recognize" msgstr "Reconhecer" #: ../gtk/data/SelectionMenu.ui.h:4 ../qt/src/DisplayerToolSelect.cc:241 msgid "Recognize to clipboard" msgstr "Reconhecer para a área de transferência" #: ../gtk/data/SelectionMenu.ui.h:5 ../qt/src/DisplayerToolSelect.cc:242 msgid "Save as image" msgstr "Gravar como imagem" #: ../gtk/data/SubstitutionsManager.ui.h:2 ../qt/src/SubstitutionsManager.cc:38 #: ../qt/src/SubstitutionsManager.cc:39 msgid "Open" msgstr "Abrir" #: ../gtk/data/SubstitutionsManager.ui.h:3 ../gtk/src/Utils.cc:73 #: ../qt/src/SubstitutionsManager.cc:41 ../qt/src/SubstitutionsManager.cc:42 msgid "Save" msgstr "Gravar" #: ../gtk/data/SubstitutionsManager.ui.h:4 ../qt/src/SubstitutionsManager.cc:44 #: ../qt/src/SubstitutionsManager.cc:45 msgid "Clear" msgstr "Limpar" #: ../gtk/data/SubstitutionsManager.ui.h:5 ../qt/data/ConfigDialog.ui.h:16 #: ../qt/src/SubstitutionsManager.cc:47 ../qt/src/SubstitutionsManager.cc:48 msgid "Add" msgstr "Adicionar" #: ../gtk/data/SubstitutionsManager.ui.h:6 #: ../gtk/src/hocr/OutputEditorHOCR.cc:886 ../qt/data/ConfigDialog.ui.h:17 #: ../qt/src/hocr/OutputEditorHOCR.cc:727 ../qt/src/SubstitutionsManager.cc:50 #: ../qt/src/SubstitutionsManager.cc:51 msgid "Remove" msgstr "Remover" #: ../gtk/data/SubstitutionsManager.ui.h:7 ../gtk/data/TessdataManager.ui.h:2 msgid "Apply" msgstr "Aplicar" #: ../gtk/data/SubstitutionsManager.ui.h:8 ../gtk/data/TessdataManager.ui.h:3 msgid "Close" msgstr "Fechar" #: ../gtk/data/TessdataManager.ui.h:1 ../qt/src/TessdataManager.cc:49 msgid "Tessdata Manager" msgstr "Gerenciador de Tessdata" #: ../gtk/data/TessdataManager.ui.h:5 ../qt/src/TessdataManager.cc:51 msgid "Manage installed languages:" msgstr "Gerenciar idiomas instalados:" #: ../gtk/src/Acquirer.cc:79 ../qt/src/Acquirer.cc:70 msgid "scan.png" msgstr "scan.png" #: ../gtk/src/Acquirer.cc:91 ../qt/src/Acquirer.cc:85 msgid "Images" msgstr "Imagens" #: ../gtk/src/Acquirer.cc:92 ../qt/src/Acquirer.cc:86 msgid "Choose Output Filename..." msgstr "Escolha nome do ficheiro de saída..." #: ../gtk/src/Acquirer.cc:106 ../qt/src/Acquirer.cc:100 msgid "Failed to initialize the scanning backend." msgstr "Falha ao inicializar a infraestrutura de digitalização." #: ../gtk/src/Acquirer.cc:115 ../qt/src/Acquirer.cc:106 msgid "Scan failed" msgstr "A digitalização falhou" #: ../gtk/src/Acquirer.cc:133 ../qt/src/Acquirer.cc:122 msgid "No scanners were detected." msgstr "Nenhum digitalizador foi detectado." #: ../gtk/src/Acquirer.cc:150 ../gtk/src/Acquirer.cc:168 #: ../qt/src/Acquirer.cc:136 ../qt/src/Acquirer.cc:154 msgid "Starting scan..." msgstr "Iniciando digitalização..." #: ../gtk/src/Acquirer.cc:164 ../qt/src/Acquirer.cc:150 msgid "Opening device..." msgstr "Abrindo dispositivo..." #: ../gtk/src/Acquirer.cc:166 ../qt/src/Acquirer.cc:152 msgid "Setting options..." msgstr "definindo opções..." #: ../gtk/src/Acquirer.cc:170 ../qt/src/Acquirer.cc:156 msgid "Getting parameters..." msgstr "Obtendo parâmetros..." #: ../gtk/src/Acquirer.cc:172 ../qt/src/Acquirer.cc:158 msgid "Transferring data..." msgstr "Transferindo dados..." #: ../gtk/src/Acquirer.cc:179 ../qt/src/Acquirer.cc:165 msgid "Canceling scan..." msgstr "Cancelando a digitalização..." #: ../gtk/src/Config.cc:49 ../qt/data/ConfigDialog.ui.h:7 msgid "Filename prefix" msgstr "Prefixo do nome do ficheiro" #: ../gtk/src/Config.cc:50 ../qt/data/ConfigDialog.ui.h:8 msgid "Code" msgstr "Código" #: ../gtk/src/Config.cc:51 ../qt/data/ConfigDialog.ui.h:9 msgid "Native name" msgstr "Nome nativo" #: ../gtk/src/Config.cc:109 ../qt/src/Config.cc:108 msgid "Script" msgstr "Script" #: ../gtk/src/CrashHandler.cc:25 ../gtk/src/CrashHandler.cc:41 #: ../qt/src/CrashHandler.cc:36 msgid "Crash Handler" msgstr "Gerenciador de erros" #: ../gtk/src/CrashHandler.cc:43 ../qt/src/CrashHandler.cc:31 msgid "Your work has been saved under %1." msgstr "O seu trabalho foi salvo em %1." #: ../gtk/src/CrashHandler.cc:45 ../qt/src/CrashHandler.cc:33 msgid "There was no unsaved work." msgstr "Não havia trabalho não salvo." #: ../gtk/src/CrashHandler.cc:106 ../qt/src/CrashHandler.cc:62 msgid "Failed to obtain backtrace. Is gdb installed?" msgstr "Falha ao obter o backtrace. O gdb está instalado?" #: ../gtk/src/Displayer.cc:232 ../qt/src/Displayer.cc:174 msgid "Failed to load image" msgstr "Falha ao carregar imagem" #: ../gtk/src/Displayer.cc:232 ../qt/src/Displayer.cc:174 msgid "" "The file might not be an image or be corrupt:\n" "%1" msgstr "" "O ficheiro pode não ser uma imagem ou está corrompido:\n" "%1" #: ../gtk/src/DisplayerToolSelect.cc:138 ../qt/src/DisplayerToolSelect.cc:135 msgid "PNG Images" msgstr "Imagens PNG" #: ../gtk/src/DisplayerToolSelect.cc:139 ../qt/src/DisplayerToolSelect.cc:135 msgid "Save Selection Image" msgstr "Gravar imagem selecionada" #: ../gtk/src/DisplayerToolSelect.cc:139 ../qt/src/DisplayerToolSelect.cc:135 msgid "selection.png" msgstr "selection.png" #: ../gtk/src/DisplayerToolSelect.cc:146 ../qt/src/DisplayerToolSelect.cc:142 msgid "Recognize all" msgstr "Reconhecer tudo" #: ../gtk/src/DisplayerToolSelect.cc:146 ../qt/src/DisplayerToolSelect.cc:142 msgid "Recognize selection" msgstr "Reconhecer seleção" #: ../gtk/src/DisplayerToolSelect.cc:186 ../qt/src/DisplayerToolSelect.cc:182 msgid "Performing layout analysis" msgstr "Executando análise de layout" #: ../gtk/src/FileDialogs.cc:235 msgid "" "A file named \"%1\" already exists. Are you sure you want to overwrite it?" msgstr "Um ficheiro chamado \"%1\" já existe. Você deseja sobrescrevê-lo?" #: ../gtk/src/FileDialogs.cc:237 msgid "Overwrite File?" msgstr "Sobrescrever ficheiro?" #: ../gtk/src/hocr/HOCRDocument.cc:611 ../gtk/src/hocr/OutputEditorHOCR.cc:266 #: ../qt/src/hocr/OutputEditorHOCR.cc:229 msgid "Page" msgstr "Página" #: ../gtk/src/hocr/HOCRDocument.cc:613 ../qt/src/hocr/HOCRDocument.cc:530 msgid "Text block" msgstr "Bloco de texto" #: ../gtk/src/hocr/HOCRDocument.cc:615 ../gtk/src/hocr/OutputEditorHOCR.cc:272 #: ../qt/src/hocr/HOCRDocument.cc:532 ../qt/src/hocr/OutputEditorHOCR.cc:231 msgid "Paragraph" msgstr "Parágrafo" #: ../gtk/src/hocr/HOCRDocument.cc:617 ../qt/src/hocr/HOCRDocument.cc:534 msgid "Textline" msgstr "Linha de texto" #: ../gtk/src/hocr/HOCRDocument.cc:621 ../qt/src/hocr/HOCRDocument.cc:538 msgid "Graphic" msgstr "Gráfico" #: ../gtk/src/hocr/HOCROdtExporter.cc:65 ../gtk/src/hocr/HOCRPdfExporter.cc:489 #: ../gtk/src/hocr/HOCRTextExporter.cc:34 #: ../gtk/src/hocr/OutputEditorHOCR.cc:963 ../gtk/src/OutputEditorText.cc:272 #: ../qt/src/hocr/HOCROdtExporter.cc:50 ../qt/src/hocr/HOCRPdfExporter.cc:478 #: ../qt/src/hocr/HOCRTextExporter.cc:36 ../qt/src/hocr/OutputEditorHOCR.cc:830 #: ../qt/src/OutputEditorText.cc:238 msgid "output" msgstr "saída" #: ../gtk/src/hocr/HOCROdtExporter.cc:68 ../qt/src/hocr/HOCROdtExporter.cc:53 msgid "OpenDocument Text Documents" msgstr "Documentos de texto OpenDocument" #: ../gtk/src/hocr/HOCROdtExporter.cc:69 ../qt/src/hocr/HOCROdtExporter.cc:53 msgid "Save ODT Output..." msgstr "Gravar saída ODT ..." #: ../gtk/src/hocr/HOCROdtExporter.cc:77 ../gtk/src/hocr/HOCROdtExporter.cc:342 #: ../gtk/src/hocr/HOCRPdfExporter.cc:619 #: ../gtk/src/hocr/HOCRTextExporter.cc:46 ../qt/src/hocr/HOCROdtExporter.cc:61 #: ../qt/src/hocr/HOCRPdfExporter.cc:609 ../qt/src/hocr/HOCRTextExporter.cc:47 msgid "Export failed" msgstr "Exportação falhada" #: ../gtk/src/hocr/HOCROdtExporter.cc:77 ../gtk/src/hocr/HOCROdtExporter.cc:342 #: ../qt/src/hocr/HOCROdtExporter.cc:61 msgid "The ODT export failed: unable to write output file." msgstr "A exportação ODT falhou: não é possível gravar o ficheiro de saída." #: ../gtk/src/hocr/HOCROdtExporter.cc:336 ../qt/src/hocr/HOCROdtExporter.cc:254 msgid "Exporting to ODT..." msgstr "Exportando para ODT..." #: ../gtk/src/hocr/HOCRPdfExporter.cc:283 ../qt/src/hocr/HOCRPdfExporter.cc:365 msgid "Same as source" msgstr "Igual à origem" #: ../gtk/src/hocr/HOCRPdfExporter.cc:286 ../qt/src/hocr/HOCRPdfExporter.cc:366 msgid "Custom" msgstr "Personalizado" #: ../gtk/src/hocr/HOCRPdfExporter.cc:300 ../qt/src/hocr/HOCRPdfExporter.cc:362 msgid "cm" msgstr "cm" #: ../gtk/src/hocr/HOCRPdfExporter.cc:303 ../qt/src/hocr/HOCRPdfExporter.cc:363 msgid "in" msgstr "em" #: ../gtk/src/hocr/HOCRPdfExporter.cc:319 ../qt/src/hocr/HOCRPdfExporter.cc:353 msgid "Monochrome" msgstr "Preto e branco" #: ../gtk/src/hocr/HOCRPdfExporter.cc:328 ../qt/src/hocr/HOCRPdfExporter.cc:355 msgid "Threshold (closest color)" msgstr "Limiar (cor mais próxima)" #: ../gtk/src/hocr/HOCRPdfExporter.cc:331 ../qt/src/hocr/HOCRPdfExporter.cc:356 msgid "Diffuse" msgstr "Difusa" #: ../gtk/src/hocr/HOCRPdfExporter.cc:340 ../qt/src/hocr/HOCRPdfExporter.cc:357 msgid "Zip (lossless)" msgstr "Zip (sem perdas)" #: ../gtk/src/hocr/HOCRPdfExporter.cc:344 ../qt/src/hocr/HOCRPdfExporter.cc:358 msgid "CCITT Group 4 (lossless)" msgstr "CCITT Grupo 4 (sem perdas)" #: ../gtk/src/hocr/HOCRPdfExporter.cc:348 ../qt/src/hocr/HOCRPdfExporter.cc:359 msgid "Jpeg (lossy)" msgstr "Jpeg (com perdas)" #: ../gtk/src/hocr/HOCRPdfExporter.cc:493 ../qt/src/hocr/HOCRPdfExporter.cc:482 msgid "PDF Files" msgstr "Ficheiros PDF" #: ../gtk/src/hocr/HOCRPdfExporter.cc:494 ../qt/src/hocr/HOCRPdfExporter.cc:482 msgid "Save PDF Output..." msgstr "Gravar saída PDF..." #: ../gtk/src/hocr/HOCRPdfExporter.cc:500 ../qt/src/hocr/HOCRPdfExporter.cc:488 msgid "Invalid Output" msgstr "Saída inválida" #: ../gtk/src/hocr/HOCRPdfExporter.cc:500 ../qt/src/hocr/HOCRPdfExporter.cc:488 msgid "Cannot overwrite a file which is a source image of this document." msgstr "" "Não pode sobrescrever um ficheiro que é uma imagem de origem do documento." #: ../gtk/src/hocr/HOCRPdfExporter.cc:516 ../qt/src/hocr/HOCRPdfExporter.cc:511 msgid "Failed to create output" msgstr "Falha ao criar a saída" #: ../gtk/src/hocr/HOCRPdfExporter.cc:516 ../qt/src/hocr/HOCRPdfExporter.cc:511 msgid "Failed to create output. The returned error was: %1" msgstr "Falha ao criar uma saída. O erro retornado foi: %1" #: ../gtk/src/hocr/HOCRPdfExporter.cc:558 ../qt/src/hocr/HOCRPdfExporter.cc:551 msgid "The operation was cancelled" msgstr "A operação foi cancelada" #: ../gtk/src/hocr/HOCRPdfExporter.cc:607 ../qt/src/hocr/HOCRPdfExporter.cc:597 msgid "Failed to render page %1" msgstr "Falha ao processar a página %1" #: ../gtk/src/hocr/HOCRPdfExporter.cc:614 ../qt/src/hocr/HOCRPdfExporter.cc:604 msgid "Exporting to PDF..." msgstr "Exportando para PDF..." #: ../gtk/src/hocr/HOCRPdfExporter.cc:619 ../qt/src/hocr/HOCRPdfExporter.cc:609 msgid "The PDF export failed: %1." msgstr "A exportação PDF falhou: %1." #: ../gtk/src/hocr/HOCRPdfExporter.cc:673 ../qt/src/hocr/HOCRPdfExporter.cc:662 msgid "The PDF library could not load the font '%1'." msgstr "A biblioteca PDF não pôde carregar a fonte '%1'." #: ../gtk/src/hocr/HOCRTextExporter.cc:37 ../gtk/src/OutputEditorText.cc:274 #: ../qt/src/hocr/HOCRTextExporter.cc:39 ../qt/src/OutputEditorText.cc:239 msgid "Text Files" msgstr "Arquivos de texto" #: ../gtk/src/hocr/HOCRTextExporter.cc:38 ../qt/src/hocr/HOCRTextExporter.cc:39 msgid "Save Text Output..." msgstr "Gravar saída de texto..." #: ../gtk/src/hocr/HOCRTextExporter.cc:46 ../qt/src/hocr/HOCRTextExporter.cc:47 msgid "The text export failed: unable to write output file." msgstr "" "A exportação de texto falhou: não é possível gravar o ficheiro de saída." #: ../gtk/src/hocr/OutputEditorHOCR.cc:269 #: ../qt/src/hocr/OutputEditorHOCR.cc:230 msgid "Block" msgstr "Bloco" #: ../gtk/src/hocr/OutputEditorHOCR.cc:275 #: ../qt/src/hocr/OutputEditorHOCR.cc:232 msgid "Line" msgstr "Linha" #: ../gtk/src/hocr/OutputEditorHOCR.cc:278 #: ../qt/src/hocr/OutputEditorHOCR.cc:233 msgid "Word" msgstr "Palavra" #: ../gtk/src/hocr/OutputEditorHOCR.cc:281 #: ../qt/src/hocr/OutputEditorHOCR.cc:234 msgid "Misspelled word" msgstr "Palavra incorreta" #: ../gtk/src/hocr/OutputEditorHOCR.cc:435 #: ../qt/src/hocr/OutputEditorHOCR.cc:317 msgid "" "The following pages could not be processed:\n" "%1" msgstr "" "As seguintes páginas não puderam ser processadas:\n" "%1" #: ../gtk/src/hocr/OutputEditorHOCR.cc:436 #: ../qt/src/hocr/OutputEditorHOCR.cc:318 msgid "Recognition errors" msgstr "Ocorreram erros de reconhecimento" #: ../gtk/src/hocr/OutputEditorHOCR.cc:594 #: ../qt/src/hocr/OutputEditorHOCR.cc:500 #: ../qt/src/hocr/OutputEditorHOCR.cc:512 msgid "Multiple values" msgstr "Vários valores" #. Merging allowed #: ../gtk/src/hocr/OutputEditorHOCR.cc:778 #: ../qt/src/hocr/OutputEditorHOCR.cc:641 msgid "Merge" msgstr "Unir" #: ../gtk/src/hocr/OutputEditorHOCR.cc:786 #: ../gtk/src/hocr/OutputEditorHOCR.cc:877 #: ../qt/src/hocr/OutputEditorHOCR.cc:643 #: ../qt/src/hocr/OutputEditorHOCR.cc:725 msgid "Split from parent" msgstr "Separar do pai" #. Swapping allowed #: ../gtk/src/hocr/OutputEditorHOCR.cc:797 #: ../qt/src/hocr/OutputEditorHOCR.cc:647 msgid "Swap" msgstr "Trocar" #: ../gtk/src/hocr/OutputEditorHOCR.cc:821 #: ../qt/src/hocr/OutputEditorHOCR.cc:693 msgid "Add graphic region" msgstr "Adicionar região gráfica" #: ../gtk/src/hocr/OutputEditorHOCR.cc:824 #: ../qt/src/hocr/OutputEditorHOCR.cc:694 msgid "Add text block" msgstr "Adicionar bloco de texto" #: ../gtk/src/hocr/OutputEditorHOCR.cc:828 #: ../qt/src/hocr/OutputEditorHOCR.cc:696 msgid "Add paragraph" msgstr "Adicionar parágrafo" #: ../gtk/src/hocr/OutputEditorHOCR.cc:832 #: ../qt/src/hocr/OutputEditorHOCR.cc:698 msgid "Add line" msgstr "Adicionar linha" #: ../gtk/src/hocr/OutputEditorHOCR.cc:836 #: ../qt/src/hocr/OutputEditorHOCR.cc:700 msgid "Add word" msgstr "Adicionar palavra" #: ../gtk/src/hocr/OutputEditorHOCR.cc:852 #: ../qt/src/hocr/OutputEditorHOCR.cc:710 msgid "No suggestions" msgstr "Sem sugestões" #: ../gtk/src/hocr/OutputEditorHOCR.cc:858 #: ../qt/src/hocr/OutputEditorHOCR.cc:714 msgid "Add to dictionary" msgstr "Adicionar ao dicionário" #: ../gtk/src/hocr/OutputEditorHOCR.cc:864 #: ../qt/src/hocr/OutputEditorHOCR.cc:716 msgid "Ignore word" msgstr "Ignorar palavra" #: ../gtk/src/hocr/OutputEditorHOCR.cc:926 #: ../gtk/src/hocr/OutputEditorHOCR.cc:965 #: ../qt/src/hocr/OutputEditorHOCR.cc:795 #: ../qt/src/hocr/OutputEditorHOCR.cc:832 msgid "hOCR HTML Files" msgstr "Ficheiros hOCR HTML" #: ../gtk/src/hocr/OutputEditorHOCR.cc:927 #: ../qt/src/hocr/OutputEditorHOCR.cc:795 msgid "Open hOCR File" msgstr "Abrir ficheiro hOCR" #: ../gtk/src/hocr/OutputEditorHOCR.cc:936 #: ../qt/src/hocr/OutputEditorHOCR.cc:802 msgid "Failed to open file" msgstr "Falha ao abrir o ficheiro" #: ../gtk/src/hocr/OutputEditorHOCR.cc:936 #: ../qt/src/hocr/OutputEditorHOCR.cc:802 msgid "The file could not be opened: %1." msgstr "O ficheiro não pode ser aberto: %1." #: ../gtk/src/hocr/OutputEditorHOCR.cc:945 #: ../qt/src/hocr/OutputEditorHOCR.cc:809 msgid "Invalid hOCR file" msgstr "Ficheiro hOCR inválido" #: ../gtk/src/hocr/OutputEditorHOCR.cc:945 #: ../qt/src/hocr/OutputEditorHOCR.cc:809 msgid "The file does not appear to contain valid hOCR HTML: %1" msgstr "O ficheiro parece não conter hOCR HTML válido: %1" #: ../gtk/src/hocr/OutputEditorHOCR.cc:966 #: ../qt/src/hocr/OutputEditorHOCR.cc:832 msgid "Save hOCR Output..." msgstr "Gravando saída hOCR..." #: ../gtk/src/hocr/OutputEditorHOCR.cc:973 ../gtk/src/OutputEditorText.cc:282 #: ../qt/src/hocr/OutputEditorHOCR.cc:839 ../qt/src/OutputEditorText.cc:246 msgid "Failed to save output" msgstr "Falha ao gravar a saída" #: ../gtk/src/hocr/OutputEditorHOCR.cc:973 ../gtk/src/OutputEditorText.cc:282 #: ../qt/src/hocr/OutputEditorHOCR.cc:839 ../qt/src/OutputEditorText.cc:246 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/hocr/OutputEditorHOCR.cc:1035 ../gtk/src/OutputEditorText.cc:296 #: ../qt/src/hocr/OutputEditorHOCR.cc:894 ../qt/src/OutputEditorText.cc:259 msgid "Output not saved" msgstr "Saída não salva" #: ../gtk/src/hocr/OutputEditorHOCR.cc:1035 ../gtk/src/OutputEditorText.cc:296 #: ../qt/src/hocr/OutputEditorHOCR.cc:894 ../qt/src/OutputEditorText.cc:259 msgid "Save output before proceeding?" msgstr "Gravar a saída antes de continuar?" #: ../gtk/src/hocr/OutputEditorHOCR.cc:1156 ../gtk/src/OutputEditorText.cc:184 #: ../qt/src/hocr/OutputEditorHOCR.cc:991 ../qt/src/OutputEditorText.cc:152 msgid "Replacing..." msgstr "Substituindo..." #: ../gtk/src/hocr/OutputEditorHOCR.cc:1181 ../gtk/src/OutputEditorText.cc:192 #: ../qt/src/hocr/OutputEditorHOCR.cc:1014 ../qt/src/OutputEditorText.cc:160 msgid "Applying substitutions..." msgstr "Aplicando substituições..." #: ../gtk/src/MainWindow.cc:131 ../qt/src/MainWindow.cc:295 msgid "Using tesseract" msgstr "Usando Tesseract" #: ../gtk/src/MainWindow.cc:178 ../qt/src/MainWindow.cc:194 msgid "Select an image to begin..." msgstr "Selecione uma imagem para começar..." #: ../gtk/src/MainWindow.cc:293 ../qt/src/MainWindow.cc:278 msgid "Multiple sources" msgstr "Várias origens" #: ../gtk/src/MainWindow.cc:295 ../qt/src/MainWindow.cc:280 msgid "Ready" msgstr "Pronto" #: ../gtk/src/MainWindow.cc:442 ../qt/src/MainWindow.cc:423 msgid "New version" msgstr "Nova versão" #: ../gtk/src/MainWindow.cc:442 ../qt/src/MainWindow.cc:423 msgid "gImageReader %1 is available" msgstr "gImageReader %1 está disponível" #: ../gtk/src/MainWindow.cc:443 ../qt/src/MainWindow.cc:424 msgid "Download" msgstr "Download" #: ../gtk/src/MainWindow.cc:444 ../qt/src/MainWindow.cc:425 msgid "Changelog" msgstr "Registro de mudanças" #: ../gtk/src/MainWindow.cc:445 ../qt/src/MainWindow.cc:426 msgid "Don't notify again" msgstr "Não avisar novamente" #: ../gtk/src/MainWindow.cc:466 ../qt/src/MainWindow.cc:474 msgid "Don't show again" msgstr "Não mostrar novamente" #: ../gtk/src/MainWindow.cc:467 ../gtk/src/MainWindow.cc:480 #: ../qt/src/MainWindow.cc:475 msgid "Install" msgstr "Instalar" #: ../gtk/src/MainWindow.cc:487 ../qt/src/MainWindow.cc:487 msgid "Spelling dictionary missing" msgstr "Dicionário de ortografia faltando" #: ../gtk/src/MainWindow.cc:487 ../qt/src/MainWindow.cc:487 msgid "The spellcheck dictionary for %1 is not installed" msgstr "O dicionário de ortografia para %1 no foi instalado" #: ../gtk/src/MainWindow.cc:494 ../gtk/src/MainWindow.cc:523 #: ../qt/src/MainWindow.cc:493 msgid "Installing spelling dictionary for '%1'" msgstr "Instalando dicionário de ortografia para '%1'" #: ../gtk/src/MainWindow.cc:515 ../gtk/src/MainWindow.cc:536 #: ../gtk/src/MainWindow.cc:544 ../gtk/src/MainWindow.cc:592 #: ../gtk/src/MainWindow.cc:597 ../gtk/src/TessdataManager.cc:60 #: ../gtk/src/TessdataManager.cc:70 ../gtk/src/TessdataManager.cc:339 #: ../qt/src/MainWindow.cc:512 ../qt/src/MainWindow.cc:525 #: ../qt/src/MainWindow.cc:534 ../qt/src/MainWindow.cc:578 #: ../qt/src/MainWindow.cc:583 ../qt/src/TessdataManager.cc:74 #: ../qt/src/TessdataManager.cc:84 ../qt/src/TessdataManager.cc:315 msgid "Error" msgstr "Erro" #: ../gtk/src/MainWindow.cc:515 ../qt/src/MainWindow.cc:512 msgid "Failed to install spelling dictionary: %1" msgstr "Falha ao instalar dicionário de ortografia: %1" #: ../gtk/src/MainWindow.cc:536 ../qt/src/MainWindow.cc:525 msgid "Failed to create directory for spelling dictionaries." msgstr "Falha ao criar o diretório de dicionários de ortografia." #: ../gtk/src/MainWindow.cc:544 ../qt/src/MainWindow.cc:534 msgid "Could not read %1: %2." msgstr "Não foi possível ler %1: %2." #: ../gtk/src/MainWindow.cc:571 ../qt/src/MainWindow.cc:558 msgid "Downloading '%1'..." msgstr "Baixando '%1'..." #: ../gtk/src/MainWindow.cc:592 ../qt/src/MainWindow.cc:578 msgid "" "The following dictionaries could not be downloaded:\n" "%1\n" "\n" "Check the connectivity and directory permissions.\n" "Hint: If you don't have write permissions in system folders, you can switch " "to user paths in the settings dialog." msgstr "" "Os seguintes dicionários não podem ser baixados:\n" "%1\n" "\n" "Verifique as permissões de conectividade e diretório.\n" "Dica: Se você não tem permissões de gravação em pastas do sistema, você pode " "alternar para caminhos de usuário na caixa de diálogo Configurações." #: ../gtk/src/MainWindow.cc:595 ../qt/src/MainWindow.cc:581 msgid "Dictionaries installed" msgstr "Dicionários instalados" #: ../gtk/src/MainWindow.cc:595 msgid "" "The following dictionaries were installed:\n" "%1" msgstr "" "Os seguintes dicionários foram instalados:\n" "%1" #: ../gtk/src/MainWindow.cc:597 ../qt/src/MainWindow.cc:583 msgid "No spelling dictionaries found for '%1'." msgstr "Nenhum dicionário de ortografia encontrado para '%1'." #: ../gtk/src/OutputEditorText.cc:154 ../qt/src/OutputEditorText.cc:137 msgid "Stripping line breaks..." msgstr "Removendo quebras de linhas..." #: ../gtk/src/OutputEditorText.cc:162 msgid "Check spelling" msgstr "Verificar ortografia" #: ../gtk/src/OutputEditorText.cc:231 ../qt/src/OutputEditorText.cc:196 msgid "File: %1" msgstr "Ficheiro: %1" #: ../gtk/src/OutputEditorText.cc:234 ../qt/src/OutputEditorText.cc:199 msgid "Page: %1" msgstr "Página: %1" #: ../gtk/src/OutputEditorText.cc:247 ../gtk/src/Recognizer.cc:471 #: ../qt/src/Recognizer.cc:462 msgid "" "\n" "[Failed to recognize page %1]\n" msgstr "" "\n" "[Falha ao reconhecer página %1]\n" #: ../gtk/src/OutputEditorText.cc:275 ../qt/src/OutputEditorText.cc:239 msgid "Save Output..." msgstr "Salvando saída..." #: ../gtk/src/Recognizer.cc:179 ../qt/src/Recognizer.cc:172 msgid "No languages available" msgstr "Nenhum idioma disponível" #: ../gtk/src/Recognizer.cc:179 ../qt/src/Recognizer.cc:172 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:233 ../qt/src/Recognizer.cc:232 msgid "Multilingual" msgstr "Multilingual" #: ../gtk/src/Recognizer.cc:285 ../qt/src/Recognizer.cc:277 msgid "Automatic page segmentation" msgstr "Segmentação automática de páginas" #: ../gtk/src/Recognizer.cc:286 ../qt/src/Recognizer.cc:278 msgid "Page segmentation with orientation and script detection" msgstr "Segmentação de página com detecção de orientação e de script" #: ../gtk/src/Recognizer.cc:287 ../qt/src/Recognizer.cc:279 msgid "Assume single column of text" msgstr "Assumir uma única coluna de texto" #: ../gtk/src/Recognizer.cc:288 ../qt/src/Recognizer.cc:280 msgid "Assume single block of vertically aligned text" msgstr "Assumir um único bloco de texto alinhado verticalmente" #: ../gtk/src/Recognizer.cc:289 ../qt/src/Recognizer.cc:281 msgid "Assume a single uniform block of text" msgstr "Assumir um bloco uniforme de texto" #: ../gtk/src/Recognizer.cc:290 ../qt/src/Recognizer.cc:282 msgid "Assume a line of text" msgstr "Assumir uma linha de texto" #: ../gtk/src/Recognizer.cc:291 ../qt/src/Recognizer.cc:283 msgid "Assume a single word" msgstr "Assumir uma única palavra" #: ../gtk/src/Recognizer.cc:292 ../qt/src/Recognizer.cc:284 msgid "Assume a single word in a circle" msgstr "Assumir uma única palavra em um círculo" #: ../gtk/src/Recognizer.cc:293 ../qt/src/Recognizer.cc:285 msgid "Sparse text in no particular order" msgstr "Texto esparso em nenhuma ordem particular" #: ../gtk/src/Recognizer.cc:294 ../qt/src/Recognizer.cc:286 msgid "Sparse text with orientation and script detection" msgstr "Texto esparso com deteção de orientação e script" #: ../gtk/src/Recognizer.cc:309 ../qt/src/Recognizer.cc:297 msgid "Page segmentation mode" msgstr "Modo de segmentação de página" #: ../gtk/src/Recognizer.cc:313 ../qt/src/Recognizer.cc:300 msgid "Character whitelist / blacklist..." msgstr "" #: ../gtk/src/Recognizer.cc:319 ../qt/src/Recognizer.cc:305 msgid "Manage languages..." msgstr "Gerenciar idiomas..." #: ../gtk/src/Recognizer.cc:375 ../qt/src/Recognizer.cc:369 msgid "Current selection" msgstr "Seleção atual" #: ../gtk/src/Recognizer.cc:465 ../qt/src/Recognizer.cc:455 msgid "Recognizing page %1 (%2 of %3)" msgstr "Reconhecendo página %1 (%2 de %3)" #: ../gtk/src/Recognizer.cc:470 ../qt/src/Recognizer.cc:461 msgid "" "\n" "- Page %1: failed to render page" msgstr "" "\n" "- Página %1: falha ao processar a página" #: ../gtk/src/Recognizer.cc:501 ../gtk/src/Recognizer.cc:531 #: ../gtk/src/Recognizer.cc:544 ../qt/src/Recognizer.cc:491 #: ../qt/src/Recognizer.cc:521 ../qt/src/Recognizer.cc:534 msgid "Recognizing..." msgstr "Reconhecendo..." #: ../gtk/src/Recognizer.cc:505 ../gtk/src/Recognizer.cc:514 #: ../qt/src/Recognizer.cc:495 ../qt/src/Recognizer.cc:504 msgid "Recognition errors occurred" msgstr "Ocorreram erros de reconhecimento" #: ../gtk/src/Recognizer.cc:505 ../qt/src/Recognizer.cc:495 msgid "The following errors occurred:%1" msgstr "Os seguinte erros ocorreram:%1" #: ../gtk/src/Recognizer.cc:514 ../qt/src/Recognizer.cc:504 msgid "Failed to initialize tesseract" msgstr "Falha ao inicializar o tesseract" #: ../gtk/src/scanner/ScannerSane.cc:84 ../gtk/src/scanner/ScannerTwain.cc:288 #: ../qt/src/scanner/ScannerSane.cc:85 ../qt/src/scanner/ScannerTwain.cc:286 msgid "Scan canceled" msgstr "Digitalização cancelada" #: ../gtk/src/scanner/ScannerSane.cc:159 ../gtk/src/scanner/ScannerTwain.cc:186 #: ../qt/src/scanner/ScannerSane.cc:159 ../qt/src/scanner/ScannerTwain.cc:178 msgid "No scanner specified" msgstr "Nenhum digitalizador especificado" #: ../gtk/src/scanner/ScannerSane.cc:168 ../gtk/src/scanner/ScannerTwain.cc:195 #: ../qt/src/scanner/ScannerSane.cc:168 ../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:403 ../gtk/src/scanner/ScannerTwain.cc:266 #: ../gtk/src/scanner/ScannerTwain.cc:292 ../qt/src/scanner/ScannerSane.cc:403 #: ../qt/src/scanner/ScannerTwain.cc:258 ../qt/src/scanner/ScannerTwain.cc:290 msgid "Unable to start scan" msgstr "Não foi possível iniciar a digitalização" #: ../gtk/src/scanner/ScannerSane.cc:411 ../gtk/src/scanner/ScannerSane.cc:461 #: ../gtk/src/scanner/ScannerTwain.cc:318 ../qt/src/scanner/ScannerSane.cc:411 #: ../qt/src/scanner/ScannerSane.cc:461 ../qt/src/scanner/ScannerTwain.cc:316 msgid "Error communicating with scanner" msgstr "Erro de comunicação com o digitalizador" #: ../gtk/src/scanner/ScannerSane.cc:520 ../qt/src/scanner/ScannerSane.cc:517 msgid "Failed to save image" msgstr "Falha ao gravar imagem" #: ../gtk/src/scanner/ScannerSane.cc:800 ../qt/src/scanner/ScannerSane.cc:797 msgid "Operation is cancelled." msgstr "A operação é cancelada." #: ../gtk/src/scanner/ScannerSane.cc:802 ../qt/src/scanner/ScannerSane.cc:799 msgid "Device is busy." msgstr "O dispositivo está ocupado." #: ../gtk/src/scanner/ScannerSane.cc:804 ../qt/src/scanner/ScannerSane.cc:801 msgid "Cover is opened." msgstr "A tampa está aberta." #: ../gtk/src/scanner/ScannerSane.cc:806 ../qt/src/scanner/ScannerSane.cc:803 msgid "Document feeder jammed." msgstr "Alimentador de documentos encravado." #: ../gtk/src/scanner/ScannerSane.cc:808 ../qt/src/scanner/ScannerSane.cc:805 msgid "Document feeder out of documents." msgstr "Falta de documentos no alimentador de documentos." #: ../gtk/src/scanner/ScannerSane.cc:810 ../qt/src/scanner/ScannerSane.cc:807 msgid "Access to scanner is denied." msgstr "Acesso ao scanner é negado." #: ../gtk/src/SourceManager.cc:118 ../qt/src/SourceManager.cc:124 msgid "PDFs with text" msgstr "PDF com texto" #: ../gtk/src/SourceManager.cc:118 ../qt/src/SourceManager.cc:124 msgid "" "These PDF files already contain text:\n" "%1" msgstr "" "Esses arquivos PDF já contêm texto:\n" "%1" #: ../gtk/src/SourceManager.cc:127 ../qt/src/SourceManager.cc:132 msgid "Unable to open files" msgstr "Não foi possível abrir os arquivos" #: ../gtk/src/SourceManager.cc:127 ../qt/src/SourceManager.cc:132 msgid "The following files could not be opened:%1" msgstr "Os arquivos a seguir não puderam ser abertos: %1" #: ../gtk/src/SourceManager.cc:141 ../qt/src/SourceManager.cc:143 msgid "Enter password for file '%1':" msgstr "Digite a senha para o ficheiro '%1':" #: ../gtk/src/SourceManager.cc:197 ../qt/src/SourceManager.cc:214 msgid "Images and PDFs" msgstr "Imagens e PDFs" #: ../gtk/src/SourceManager.cc:202 ../qt/src/SourceManager.cc:215 msgid "Select Files" msgstr "Selecione os arquivos" #: ../gtk/src/SourceManager.cc:208 ../qt/src/SourceManager.cc:226 msgid "Clipboard Error" msgstr "Erro da área de transferência" #: ../gtk/src/SourceManager.cc:208 ../qt/src/SourceManager.cc:226 msgid "Failed to read the clipboard." msgstr "Falha ao ler a área de transferência." #: ../gtk/src/SourceManager.cc:212 ../qt/src/SourceManager.cc:230 #: ../qt/src/SourceManager.cc:236 msgid "Pasted %1" msgstr "Colado %1" #: ../gtk/src/SourceManager.cc:224 ../qt/src/SourceManager.cc:243 msgid "Screenshot Error" msgstr "Erro de captura de tela" #: ../gtk/src/SourceManager.cc:224 ../qt/src/SourceManager.cc:243 msgid "Failed to take screenshot." msgstr "Falha ao capturar a tela." #: ../gtk/src/SourceManager.cc:228 ../qt/src/SourceManager.cc:247 msgid "Screenshot %1" msgstr "Captura de tela %1" #: ../gtk/src/SourceManager.cc:233 ../qt/src/SourceManager.cc:252 msgid "Saving image..." msgstr "Salvando imagem..." #: ../gtk/src/SourceManager.cc:240 ../qt/src/SourceManager.cc:265 msgid "Cannot Write File" msgstr "Não foi possível gravar o ficheiro" #: ../gtk/src/SourceManager.cc:240 ../qt/src/SourceManager.cc:265 msgid "Could not write to %1." msgstr "Não foi possível escrever no ficheiro %1." #: ../gtk/src/SourceManager.cc:267 ../qt/src/SourceManager.cc:287 msgid "Delete File?" msgstr "Apagar o ficheiro?" #: ../gtk/src/SourceManager.cc:267 ../qt/src/SourceManager.cc:287 msgid "The following files will be deleted:%1" msgstr "Os seguintes ficheiros serão apagados:%1" #: ../gtk/src/SourceManager.cc:332 ../qt/src/SourceManager.cc:338 msgid "Missing File" msgstr "Ficheiro ausente" #: ../gtk/src/SourceManager.cc:332 ../qt/src/SourceManager.cc:338 msgid "" "The following file has been deleted or moved:\n" "%1" msgstr "" "O seguinte ficheiro foi apagado ou movido:\n" "%1" #: ../gtk/src/SubstitutionsManager.cc:33 ../qt/src/SubstitutionsManager.cc:73 msgid "Search for" msgstr "Procurar por" #: ../gtk/src/SubstitutionsManager.cc:34 ../qt/src/SubstitutionsManager.cc:73 msgid "Replace with" msgstr "Substituir com" #: ../gtk/src/SubstitutionsManager.cc:69 ../gtk/src/SubstitutionsManager.cc:103 #: ../qt/src/SubstitutionsManager.cc:106 ../qt/src/SubstitutionsManager.cc:143 msgid "Substitutions List" msgstr "Lista de substituições" #: ../gtk/src/SubstitutionsManager.cc:70 ../qt/src/SubstitutionsManager.cc:106 msgid "Open Substitutions List" msgstr "Abrir lista de substituições" #: ../gtk/src/SubstitutionsManager.cc:75 ../qt/src/SubstitutionsManager.cc:112 msgid "Error Reading File" msgstr "Erro ao ler ficheiro" #: ../gtk/src/SubstitutionsManager.cc:75 ../qt/src/SubstitutionsManager.cc:112 msgid "Unable to read '%1'." msgstr "Não foi possível ler '%1'." #: ../gtk/src/SubstitutionsManager.cc:97 ../qt/src/SubstitutionsManager.cc:137 msgid "Errors Occurred Reading File" msgstr "Erros ocorreram na leitura do ficheiro" #: ../gtk/src/SubstitutionsManager.cc:97 ../qt/src/SubstitutionsManager.cc:137 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:104 ../qt/src/SubstitutionsManager.cc:143 msgid "Save Substitutions List" msgstr "Gravar lista de substituições" #: ../gtk/src/SubstitutionsManager.cc:110 ../qt/src/SubstitutionsManager.cc:149 msgid "Error Saving File" msgstr "Erro ao gravar ficheiro" #: ../gtk/src/SubstitutionsManager.cc:110 ../qt/src/SubstitutionsManager.cc:149 msgid "Unable to write to '%1'." msgstr "Não foi possível escrever em '%1'." #: ../gtk/src/SubstitutionsManager.cc:127 ../qt/src/SubstitutionsManager.cc:162 msgid "Save List?" msgstr "Gravar lista?" #: ../gtk/src/SubstitutionsManager.cc:127 ../qt/src/SubstitutionsManager.cc:162 msgid "Do you want to save the current list?" msgstr "Você deseja gravar a lista atual?" #: ../gtk/src/TessdataManager.cc:60 ../qt/src/TessdataManager.cc:74 #, fuzzy msgid "" "A session connection to the PackageKit backend is required for managing " "system-wide tesseract language packs, but it was not found. This service is " "usually provided by a software-management application such as Gnome " "Software. Please install software which provides the necessary PackageKit " "interface, use other system package management software to manage the " "tesseract language packs directly, or switch to using the user tessdata path " "in the configuration dialog." msgstr "" "PackageKit é necessária para o gerenciamento de pacotes de idiomas do " "tesseract de todo o sistema, mas não foi encontrado. Por favor use o " "software de gerenciamento de pacote do sistema para gerenciar os pacotes de " "idiomas do tesseract, ou alternar para usar o caminho de tessdata de usuário " "na caixa de diálogo de configuração." #: ../gtk/src/TessdataManager.cc:65 ../qt/src/TessdataManager.cc:79 msgid "Fetching available languages" msgstr "Buscando idiomas disponíveis" #: ../gtk/src/TessdataManager.cc:70 ../gtk/src/TessdataManager.cc:96 #: ../gtk/src/TessdataManager.cc:197 ../qt/src/TessdataManager.cc:84 #: ../qt/src/TessdataManager.cc:101 ../qt/src/TessdataManager.cc:197 msgid "Failed to fetch list of available languages: %1" msgstr "Falha ao obter a lista de idiomas disponíveis: %1" #: ../gtk/src/TessdataManager.cc:104 ../qt/src/TessdataManager.cc:113 #: ../qt/src/TessdataManager.cc:122 msgid "Parsing error: %1" msgstr "Erro de processamento: %1" #: ../gtk/src/TessdataManager.cc:235 ../qt/src/TessdataManager.cc:232 msgid "Applying changes..." msgstr "Aplicando alterações..." #: ../gtk/src/TessdataManager.cc:297 ../qt/src/TessdataManager.cc:278 msgid "Failed to create directory for tessdata files." msgstr "Falha ao criar o diretório para os ficheiros tessdata." #: ../gtk/src/TessdataManager.cc:306 ../qt/src/TessdataManager.cc:287 msgid "Downloading %1..." msgstr "Baixando %1..." #: ../gtk/src/TessdataManager.cc:330 msgid "" "The following files could not be downloaded or removed:\n" "%1\n" "\n" "Check the connectivity and directory permissions.\n" "\n" "Hint: If you don't have write permissions in system folders, you can switch " "to user paths in the settings dialog." msgstr "" "Os seguintes ficheiros não podem ser baixados ou removidos:\n" "%1\n" "\n" "Verifique as permissões de conectividade e diretório.\n" "\n" "Dica: Se você não tem permissões de gravação em pastas do sistema, você pode " "alternar para caminhos de usuário na caixa de diálogo Configurações." #: ../gtk/src/Utils.cc:64 msgid "Yes" msgstr "Sim" #: ../gtk/src/Utils.cc:67 msgid "No" msgstr "Não" #: ../gtk/src/Utils.cc:76 msgid "Discard" msgstr "Descartar" #: ../qt/data/AboutDialog.ui.h:1 msgid "About gImageReader" msgstr "Sobre o gImageReader" #: ../qt/data/AboutDialog.ui.h:3 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 "Codificação do sistema" #: ../qt/data/ConfigDialog.ui.h:15 msgid "UTF-8" msgstr "UTF-8" #: ../qt/data/ConfigDialog.ui.h:19 msgid "Text file encoding:" msgstr "Codificação de ficheiro 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 "" "

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/CrashHandler.ui.h:3 msgid "" "

Tesseract has " "aborted

Tesseract (the OCR engine) has aborted while " "recognizing text. This may occur if the used traineddatas are corrupt or " "incomplatible with the version of tesseract in use, or due to a bug in " "tesseract.

The stacktrace below may provide additional information " "about where the crash occured.

" msgstr "" #: ../qt/data/MainWindow.ui.h:17 msgid "Flatbed" msgstr "Mesa" #: ../qt/data/MainWindow.ui.h:18 msgid "ADF Front" msgstr "Frente do alimentador de documentos" #: ../qt/data/MainWindow.ui.h:19 msgid "ADF Back" msgstr "Verso do alimentador de documentos" #: ../qt/data/MainWindow.ui.h:20 msgid "ADF Duplex" msgstr "Duplex do alimentador de documentos" #. Remove & from some labels which designer insists in adding #: ../qt/data/MainWindow.ui.h:21 ../qt/src/Ui_MainWindow.hh:50 msgid "Sources" msgstr "Fontes" #: ../qt/data/MainWindow.ui.h:22 msgid "Zoom In" msgstr "Aumentar zoom" #: ../qt/data/MainWindow.ui.h:24 msgid "Zoom Out" msgstr "Diminuir zoom" #: ../qt/data/MainWindow.ui.h:26 msgid "Normal Size" msgstr "Tamanho normal" #: ../qt/data/MainWindow.ui.h:28 msgid "Best Fit" msgstr "Melhor ajuste" #: ../qt/data/MainWindow.ui.h:30 msgid "Rotate Left" msgstr "Rotacionar para a esquerda" #: ../qt/data/MainWindow.ui.h:31 msgid "Rotate left" msgstr "Rotacionar para a esquerda" #: ../qt/data/MainWindow.ui.h:32 msgid "Rotate Right" msgstr "Rotacionar para a direita" #: ../qt/data/MainWindow.ui.h:33 msgid "Rotate right" msgstr "Rotacionar para a direita" #: ../qt/data/MainWindow.ui.h:34 msgid "Image Controls" msgstr "Controles de imagem" #: ../qt/data/MainWindow.ui.h:36 msgid "Autodetect Layout" msgstr "Detectar layout automaticamente" #: ../qt/data/MainWindow.ui.h:38 msgid "Toggle Output Pane" msgstr "Alternar exibição do painel de saída" #: ../qt/data/PdfExportDialog.ui.h:5 msgid "Backend:" msgstr "Backend:" #: ../qt/data/PdfExportDialog.ui.h:8 msgid "Portrait" msgstr "Retrato" #: ../qt/data/PdfExportDialog.ui.h:9 msgid "Landscape" msgstr "Paisagem" #: ../qt/src/hocr/HOCRPdfExporter.cc:142 msgid "Failed to write to file" msgstr "Falha ao gravar ficheiro" #. Output toolbar #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:55 #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:56 msgid "Open hOCR file" msgstr "Abrir ficheiro hOCR" #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:57 #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:58 msgid "Save as hOCR text" msgstr "Gravar como texto hOCR" #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:79 #: ../qt/src/Ui_OutputEditorText.hh:106 msgid "Find and Replace" msgstr "Localizar e substituir" #: ../qt/src/MainWindow.cc:581 #, fuzzy msgid "" "The following dictionary files were installed:\n" "%1" msgstr "Os seguintes dicionários foram instalados:%1" #: ../qt/src/TessdataManager.cc:308 msgid "" "The following files could not be downloaded or removed:\n" "%1\n" "\n" "Check the connectivity and directory permissions.\n" "Hint: If you don't have write permissions in system folders, you can switch " "to user paths in the settings dialog." msgstr "" "Os seguintes ficheiros não podem ser baixados ou removidos:\n" "%1\n" "\n" "Verifique as permissões de conectividade e diretório.\n" "\n" "Dica: Se você não tem permissões de gravação em pastas do sistema, você pode " "alternar para caminhos de usuário na caixa de diálogo Configurações." #: ../qt/src/Ui_MainWindow.hh:51 msgid "Output" msgstr "Saída" #: ../qt/src/Ui_MainWindow.hh:135 msgid "OCR mode:" msgstr "Modo de OCR:" #: ../qt/src/Ui_MainWindow.hh:209 msgid "Remove Image" msgstr "Remover imagem" #: ../qt/src/Ui_MainWindow.hh:212 msgid "Delete Image" msgstr "Apagar imagem" #: ../qt/src/Ui_MainWindow.hh:215 msgid "Clear List" msgstr "Limpar lista" #: ../qt/src/Ui_OutputEditorText.hh:101 msgid "Strip Line Breaks" msgstr "Remover quebras de linha" #: ../qt/src/Ui_OutputEditorText.hh:115 msgid "Save Output" msgstr "Gravar saída" #: ../qt/src/Ui_OutputEditorText.hh:117 msgid "Clear Output" msgstr "Limpar saída" #~ msgid "The application has crashed" #~ msgstr "A aplicação parou de funcionar" #~ 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 caiu com a seguinte mensagem:\n" #~ "\n" #~ "%1\n" #~ "\n" #~ "Isso normalmente acontece por uma das seguintes razões:\n" #~ "- Usando ficheiros traineddata desatualizados.\n" #~ "- Faltam arquivos de dados de idioma auxiliar.\n" #~ "- Ficheiros de dados de idioma corrompidos.\n" #~ "\n" #~ "Certifique-se de que seu idioma de arquivos de dados são válidos e " #~ "compatíveis com o tesseract %2." #~ msgid "Could not read %1: %2" #~ msgstr "Não foi possível ler 1%: %2" #~ msgid "gImageReader" #~ msgstr "gImageReader" #, 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" #, fuzzy #~ msgid "Scale:" #~ msgstr "Escala" #, fuzzy #~ msgid "Errors occurred" #~ msgstr "Ocorreram erros de reconhecimento" #, fuzzy #~ msgid "" #~ "The following pages could not be rendered:\n" #~ "%1" #~ msgstr "Os arquivos a seguir não puderam ser abertos: %1" #~ msgid "substitution_list.txt" #~ msgstr "substituições.txt" #~ 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" #, 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.3.1/po/ru.po000066400000000000000000002313631351740627400154570ustar00rootroot00000000000000# 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: 2019-07-25 23:17+0200\n" "PO-Revision-Date: 2019-02-21 23:17+0000\n" "Last-Translator: Alexander \n" "Language-Team: Russian \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: Weblate 3.5-dev\n" #: ../data/gimagereader.desktop.in.h:1 msgid "OCR application" msgstr "Приложение OCR" #: ../gtk/data/appmenu.ui.h:1 ../qt/src/Ui_MainWindow.hh:167 msgid "Redetect Languages" msgstr "Повторить обнаружение Ñзыков" #: ../gtk/data/appmenu.ui.h:2 ../qt/src/Ui_MainWindow.hh:170 msgid "Manage Languages" msgstr "Управление Ñзыками" #: ../gtk/data/appmenu.ui.h:3 ../gtk/data/ConfigDialog.ui.h:1 #: ../qt/data/ConfigDialog.ui.h:1 ../qt/src/Ui_MainWindow.hh:173 msgid "Preferences" msgstr "ÐаÑтройки" #: ../gtk/data/appmenu.ui.h:4 ../gtk/data/ConfigDialog.ui.h:2 #: ../gtk/src/MainWindow.cc:482 ../qt/src/MainWindow.cc:481 #: ../qt/src/Ui_MainWindow.hh:178 msgid "Help" msgstr "Помощь" #: ../gtk/data/appmenu.ui.h:5 ../qt/data/AboutDialog.ui.h:2 #: ../qt/src/Ui_MainWindow.hh:181 msgid "About" msgstr "О программе" #: ../gtk/data/appmenu.ui.h:6 msgid "Quit" msgstr "Выход" #: ../gtk/data/ConfigDialog.ui.h:3 ../gtk/data/MainWindow.ui.h:47 #: ../gtk/data/OutputEditorHOCR.ui.h:3 ../gtk/data/PdfExportDialog.ui.h:3 #: ../gtk/src/FileDialogs.cc:152 ../gtk/src/Utils.cc:61 #: ../qt/data/ConfigDialog.ui.h:26 msgid "OK" msgstr "OK" #: ../gtk/data/ConfigDialog.ui.h:4 msgid "Output pane orientation:" msgstr "РаÑположение панели результатов:" #: ../gtk/data/ConfigDialog.ui.h:5 msgid "Horizontal" msgstr "Горизонтально" #: ../gtk/data/ConfigDialog.ui.h:6 msgid "Vertical" msgstr "Вертикально" #: ../gtk/data/ConfigDialog.ui.h:7 ../qt/data/ConfigDialog.ui.h:18 msgid "Query to install missing spellcheck dictionaries" msgstr "Ð—Ð°Ð¿Ñ€Ð¾Ñ Ð½Ð° уÑтановку недоÑтающих орфографичеÑких Ñловарей" #: ../gtk/data/ConfigDialog.ui.h:8 ../qt/data/ConfigDialog.ui.h:4 msgid "Automatically check for new program versions" msgstr "ÐвтоматичеÑки проверÑть наличие новых верÑий" #: ../gtk/data/ConfigDialog.ui.h:9 ../qt/data/ConfigDialog.ui.h:3 msgid "Predefined language definitions:" msgstr "Заданные Ð¾Ð¿Ñ€ÐµÐ´ÐµÐ»ÐµÐ½Ð¸Ñ Ñзыков:" #: ../gtk/data/ConfigDialog.ui.h:10 ../qt/data/ConfigDialog.ui.h:12 msgid "Additional language definitions:" msgstr "Дополнительные Ð¾Ð¿Ñ€ÐµÐ´ÐµÐ»ÐµÐ½Ð¸Ñ Ñзыков:" #: ../gtk/data/ConfigDialog.ui.h:11 ../qt/data/ConfigDialog.ui.h:20 msgid "The prefix of the tesseract language data file" msgstr "ÐŸÑ€ÐµÑ„Ð¸ÐºÑ Ñ„Ð°Ð¹Ð»Ð° Ñзыковых данных tesseract" #: ../gtk/data/ConfigDialog.ui.h:12 ../qt/data/ConfigDialog.ui.h:21 msgid "Prefix" msgstr "ПрефикÑ" #: ../gtk/data/ConfigDialog.ui.h:13 ../qt/data/ConfigDialog.ui.h:22 msgid "The ISO 639-1 language code followed by the country code" msgstr "Код Ñзыка (ISO 639-1) и код Ñтраны, Ñоединённые подчёркиванием" #: ../gtk/data/ConfigDialog.ui.h:14 ../qt/data/ConfigDialog.ui.h:23 msgid "ISO Code" msgstr "Код ISO" #: ../gtk/data/ConfigDialog.ui.h:15 ../qt/data/ConfigDialog.ui.h:24 msgid "The name of the language" msgstr "Ðазвание Ñзыка" #: ../gtk/data/ConfigDialog.ui.h:16 ../qt/data/ConfigDialog.ui.h:25 msgid "Name" msgstr "Ðазвание" #: ../gtk/data/ConfigDialog.ui.h:17 ../gtk/data/MainWindow.ui.h:46 #: ../gtk/data/OutputEditorHOCR.ui.h:2 ../gtk/data/PdfExportDialog.ui.h:2 #: ../gtk/src/Acquirer.cc:34 ../gtk/src/FileDialogs.cc:151 #: ../gtk/src/Utils.cc:70 ../qt/data/ConfigDialog.ui.h:27 #: ../qt/data/MainWindow.ui.h:12 msgid "Cancel" msgstr "Отмена" #: ../gtk/data/ConfigDialog.ui.h:18 ../qt/data/ConfigDialog.ui.h:5 msgid "Output pane font:" msgstr "Шрифт панели результатов:" #: ../gtk/data/ConfigDialog.ui.h:19 ../qt/data/ConfigDialog.ui.h:2 msgid "Default" msgstr "По умолчанию" #: ../gtk/data/ConfigDialog.ui.h:20 ../qt/data/ConfigDialog.ui.h:6 msgid "Language data locations:" msgstr "МеÑтоположение Ñзыковых данных:" #: ../gtk/data/ConfigDialog.ui.h:21 ../qt/data/ConfigDialog.ui.h:13 msgid "Language definitions path:" msgstr "Размещение определений Ñзыков:" #: ../gtk/data/ConfigDialog.ui.h:22 ../qt/data/ConfigDialog.ui.h:28 msgid "Spelling dictionaries path:" msgstr "Размещение орфографичеÑких Ñловарей:" #: ../gtk/data/ConfigDialog.ui.h:23 ../qt/data/ConfigDialog.ui.h:10 msgid "System-wide paths" msgstr "ОбщеÑиÑтемные пути" #: ../gtk/data/ConfigDialog.ui.h:24 ../qt/data/ConfigDialog.ui.h:11 msgid "User paths" msgstr "ПользовательÑкие пути" #: ../gtk/data/ConfigDialog.ui.h:25 ../qt/data/ConfigDialog.ui.h:29 msgid "Automatically open exported documents with default application" msgstr "ÐвтоматичеÑки открывать ÑкÑпортированные документы" #: ../gtk/data/CrashHandler.ui.h:1 ../qt/src/CrashHandler.cc:38 msgid "Regenerate backtrace" msgstr "Обновить обратную траÑÑировку" #: ../gtk/data/CrashHandler.ui.h:3 #, fuzzy, no-c-format msgid "" "The application has crashed\n" "\n" "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/CrashHandler.ui.h:6 msgid "" "Tesseract has aborted\n" "\n" "Tesseract (the OCR engine) has aborted while recognizing text. This may " "occur if the used traineddatas are corrupt or incomplatible with the version " "of tesseract in use, or due to a bug in tesseract.\n" "\n" "The stacktrace below may provide additional information about where the " "crash occured.\n" msgstr "" #: ../gtk/data/MainWindow.ui.h:1 ../qt/data/MainWindow.ui.h:39 msgid "Toggle output pane" msgstr "Показать/Ñкрыть панель результатов" #: ../gtk/data/MainWindow.ui.h:2 ../qt/src/Ui_MainWindow.hh:66 msgid "Rotate current page" msgstr "Повернуть текущую Ñтраницу" #: ../gtk/data/MainWindow.ui.h:3 ../qt/src/Ui_MainWindow.hh:67 msgid "Rotate all pages" msgstr "Повернуть вÑе Ñтраницы" #. Sources toolbar #: ../gtk/data/MainWindow.ui.h:4 ../qt/src/Ui_MainWindow.hh:192 msgid "Recent" msgstr "Предыдущие файлы" #: ../gtk/data/MainWindow.ui.h:5 ../qt/src/Ui_MainWindow.hh:193 msgid "Paste" msgstr "Ð’Ñтавить" #: ../gtk/data/MainWindow.ui.h:6 ../qt/src/Ui_MainWindow.hh:194 msgid "Take Screenshot" msgstr "Сделать Ñнимок Ñкрана" #: ../gtk/data/MainWindow.ui.h:7 ../qt/data/MainWindow.ui.h:23 msgid "Zoom in" msgstr "Увеличить" #: ../gtk/data/MainWindow.ui.h:8 ../qt/data/MainWindow.ui.h:25 msgid "Zoom out" msgstr "Уменьшить" #: ../gtk/data/MainWindow.ui.h:9 ../qt/data/MainWindow.ui.h:27 msgid "Normal size" msgstr "Обычный размер" #: ../gtk/data/MainWindow.ui.h:10 ../qt/data/MainWindow.ui.h:29 msgid "Best fit" msgstr "Ðаилучшее заполнение" #: ../gtk/data/MainWindow.ui.h:11 ../qt/src/Ui_MainWindow.hh:75 msgid "Select rotation mode" msgstr "Выбрать режим вращениÑ" #: ../gtk/data/MainWindow.ui.h:12 ../gtk/data/OutputEditorText.ui.h:13 #: ../qt/src/Ui_OutputEditorText.hh:95 msgid "Select insert mode" msgstr "Выбрать режим вÑтавки" #: ../gtk/data/MainWindow.ui.h:13 ../qt/src/Ui_MainWindow.hh:109 #, fuzzy msgid "Select page" msgstr "Выбрать Ñзык" #: ../gtk/data/MainWindow.ui.h:14 ../qt/data/MainWindow.ui.h:35 msgid "Image controls" msgstr "Управление изображением" #: ../gtk/data/MainWindow.ui.h:15 ../qt/src/Ui_MainWindow.hh:139 msgid "Plain text" msgstr "ПроÑтой текÑÑ‚" #: ../gtk/data/MainWindow.ui.h:16 ../qt/src/Ui_MainWindow.hh:139 msgid "hOCR, PDF" msgstr "hOCR, PDF" #: ../gtk/data/MainWindow.ui.h:17 ../qt/data/MainWindow.ui.h:37 msgid "Autodetect layout" msgstr "Ðвтоопределение Ñтруктуры" #: ../gtk/data/MainWindow.ui.h:18 msgid "Recognize all" msgstr "РаÑпознать вÑÑ‘" #: ../gtk/data/MainWindow.ui.h:19 msgid "Select language" msgstr "Выбрать Ñзык" #: ../gtk/data/MainWindow.ui.h:20 ../qt/src/Ui_MainWindow.hh:205 msgid "Add images" msgstr "Добавить изображениÑ" #: ../gtk/data/MainWindow.ui.h:21 ../qt/src/Ui_MainWindow.hh:204 msgid "Add Images" msgstr "Добавить изображениÑ" #: ../gtk/data/MainWindow.ui.h:22 ../qt/src/Ui_MainWindow.hh:210 msgid "Remove image from list" msgstr "Убрать изображение из ÑпиÑка" #: ../gtk/data/MainWindow.ui.h:23 ../qt/src/Ui_MainWindow.hh:213 msgid "Delete image" msgstr "Удалить изображение" #: ../gtk/data/MainWindow.ui.h:24 ../qt/src/Ui_MainWindow.hh:216 msgid "Clear list" msgstr "ОчиÑтить ÑпиÑок" #: ../gtk/data/MainWindow.ui.h:25 ../qt/data/MainWindow.ui.h:5 msgid "Files" msgstr "Файлы" #: ../gtk/data/MainWindow.ui.h:26 ../qt/data/MainWindow.ui.h:8 msgid "Device:" msgstr "УÑтройÑтво:" #: ../gtk/data/MainWindow.ui.h:27 ../gtk/data/TessdataManager.ui.h:4 #: ../qt/data/MainWindow.ui.h:7 ../qt/src/TessdataManager.cc:59 msgid "Refresh" msgstr "Обновить" #: ../gtk/data/MainWindow.ui.h:28 ../qt/data/MainWindow.ui.h:9 msgid "Output:" msgstr "Сканировать в:" #: ../gtk/data/MainWindow.ui.h:29 ../qt/data/MainWindow.ui.h:13 msgid "Mode:" msgstr "Режим:" #: ../gtk/data/MainWindow.ui.h:30 ../gtk/src/hocr/HOCRPdfExporter.cc:313 #: ../qt/data/MainWindow.ui.h:15 ../qt/src/hocr/HOCRPdfExporter.cc:347 msgid "Color" msgstr "Цветной" #: ../gtk/data/MainWindow.ui.h:31 ../gtk/src/hocr/HOCRPdfExporter.cc:316 #: ../qt/data/MainWindow.ui.h:14 ../qt/src/hocr/HOCRPdfExporter.cc:349 #: ../qt/src/hocr/HOCRPdfExporter.cc:351 msgid "Grayscale" msgstr "Ð’ оттенках Ñерого" #: ../gtk/data/MainWindow.ui.h:32 ../qt/data/MainWindow.ui.h:10 msgid "Resolution:" msgstr "Разрешение:" #: ../gtk/data/MainWindow.ui.h:33 ../qt/data/MainWindow.ui.h:11 msgid "Scan" msgstr "ОтÑканировать" #: ../gtk/data/MainWindow.ui.h:34 ../qt/data/MainWindow.ui.h:16 msgid "Source:" msgstr "ИÑточник:" #: ../gtk/data/MainWindow.ui.h:35 ../qt/data/MainWindow.ui.h:6 msgid "Acquire" msgstr "Сканировать" #: ../gtk/data/MainWindow.ui.h:36 ../qt/data/MainWindow.ui.h:1 msgid "Brightness" msgstr "ЯркоÑть" #: ../gtk/data/MainWindow.ui.h:37 ../qt/data/MainWindow.ui.h:2 msgid "Contrast" msgstr "КонтраÑтноÑть" #: ../gtk/data/MainWindow.ui.h:38 ../qt/data/MainWindow.ui.h:3 msgid "Resolution" msgstr "Разрешение" #: ../gtk/data/MainWindow.ui.h:39 ../qt/data/MainWindow.ui.h:4 msgid "Invert colors" msgstr "Инвертировать цвета" #: ../gtk/data/MainWindow.ui.h:40 msgid "A graphical frontend to tesseract-ocr" msgstr "ГрафичеÑкий Ð¸Ð½Ñ‚ÐµÑ€Ñ„ÐµÐ¹Ñ Ð´Ð»Ñ tesseract-ocr" #: ../gtk/data/MainWindow.ui.h:41 ../qt/data/CharacterListDialog.ui.h:1 msgid "Character whitelist / blacklist" msgstr "" #: ../gtk/data/MainWindow.ui.h:42 ../qt/data/CharacterListDialog.ui.h:2 msgid "Exclude these characters from being recognized (blacklist):" msgstr "" #: ../gtk/data/MainWindow.ui.h:43 ../qt/data/CharacterListDialog.ui.h:3 #, fuzzy msgid "Enter a string of characters..." msgstr "Получение параметров..." #: ../gtk/data/MainWindow.ui.h:44 ../qt/data/CharacterListDialog.ui.h:4 msgid "Only allow the following characters to be recognized (whitelist):" msgstr "" #: ../gtk/data/MainWindow.ui.h:45 ../qt/data/PageRangeDialog.ui.h:1 msgid "Page Range" msgstr "Диапазон Ñтраниц" #: ../gtk/data/MainWindow.ui.h:48 ../qt/data/PageRangeDialog.ui.h:2 msgid "Page range:" msgstr "Диапазон Ñтраниц:" #: ../gtk/data/MainWindow.ui.h:49 ../qt/data/PageRangeDialog.ui.h:3 msgid "Example: 1-10, 13, 14-18" msgstr "Пример: 1-10, 13, 14-18" #: ../gtk/data/MainWindow.ui.h:50 ../qt/data/PageRangeDialog.ui.h:4 msgid "Recognition area:" msgstr "ОблаÑть раÑпознаваниÑ:" #: ../gtk/data/MainWindow.ui.h:51 ../gtk/src/Recognizer.cc:375 #: ../qt/data/PageRangeDialog.ui.h:5 ../qt/src/Recognizer.cc:369 msgid "Entire page" msgstr "Страница целиком" #: ../gtk/data/MainWindow.ui.h:52 ../qt/data/PageRangeDialog.ui.h:6 msgid "Autodetect" msgstr "Ðвтоопределение" #: ../gtk/data/MainWindow.ui.h:53 ../qt/data/PageRangeDialog.ui.h:7 msgid "Prepend to output text:" msgstr "Добавить к текущему текÑту:" #: ../gtk/data/MainWindow.ui.h:54 ../qt/data/PageRangeDialog.ui.h:8 msgid "Source filename" msgstr "Ð˜Ð¼Ñ Ð¸Ñходного файла" #: ../gtk/data/MainWindow.ui.h:55 ../qt/data/PageRangeDialog.ui.h:9 msgid "Source page" msgstr "ИÑÑ…Ð¾Ð´Ð½Ð°Ñ Ñтраница" #: ../gtk/data/MainWindow.ui.h:56 ../qt/src/SourceManager.cc:146 msgid "Protected PDF" msgstr "PDF Ñ Ð¿Ð°Ñ€Ð¾Ð»ÐµÐ¼" #: ../gtk/data/MainWindow.ui.h:57 ../qt/src/Recognizer.cc:76 msgid "Current Page" msgstr "Текущую Ñтраницу" #: ../gtk/data/MainWindow.ui.h:58 ../qt/src/Recognizer.cc:79 msgid "Multiple Pages..." msgstr "ÐеÑколько Ñтраниц..." #: ../gtk/data/OutputEditorHOCR.ui.h:1 ../qt/src/hocr/OutputEditorHOCR.cc:580 msgid "Add Word" msgstr "Добавить Ñлово" #: ../gtk/data/OutputEditorHOCR.ui.h:4 ../qt/src/hocr/OutputEditorHOCR.cc:580 msgid "Enter word:" msgstr "Введите Ñлово:" #: ../gtk/data/OutputEditorHOCR.ui.h:5 ../qt/src/hocr/Ui_OutputEditorHOCR.hh:61 #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:62 msgid "Export to plain text" msgstr "ЭкÑпорт в текÑÑ‚" #: ../gtk/data/OutputEditorHOCR.ui.h:6 ../qt/src/hocr/Ui_OutputEditorHOCR.hh:64 #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:65 msgid "Export to PDF" msgstr "ЭкÑпорт в PDF" #: ../gtk/data/OutputEditorHOCR.ui.h:7 ../qt/src/hocr/Ui_OutputEditorHOCR.hh:67 #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:68 msgid "Export to ODT" msgstr "ЭкÑпорт в ODT" #: ../gtk/data/OutputEditorHOCR.ui.h:8 ../gtk/data/OutputEditorText.ui.h:18 #: ../qt/src/Ui_OutputEditorText.hh:116 msgid "Save output" msgstr "Сохранить результаты" #: ../gtk/data/OutputEditorHOCR.ui.h:9 ../qt/src/hocr/Ui_OutputEditorHOCR.hh:72 #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:73 msgid "Export" msgstr "ЭкÑпорт" #: ../gtk/data/OutputEditorHOCR.ui.h:10 ../gtk/data/OutputEditorText.ui.h:19 #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:77 #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:78 #: ../qt/src/Ui_OutputEditorText.hh:118 msgid "Clear output" msgstr "ОчиÑтить результаты" #: ../gtk/data/OutputEditorHOCR.ui.h:11 ../gtk/data/OutputEditorText.ui.h:15 #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:80 #: ../qt/src/Ui_OutputEditorText.hh:107 msgid "Find and replace" msgstr "Ðайти и заменить" #: ../gtk/data/OutputEditorHOCR.ui.h:12 #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:82 #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:83 msgid "Show confidence values" msgstr "Показать вероÑтноÑти" #: ../gtk/data/OutputEditorHOCR.ui.h:13 ../gtk/data/PdfExportDialog.ui.h:41 #: ../qt/data/PdfExportDialog.ui.h:2 ../qt/src/hocr/Ui_OutputEditorHOCR.hh:85 #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:86 msgid "Show preview" msgstr "Показать предпроÑмотр" #: ../gtk/data/OutputEditorHOCR.ui.h:14 #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:121 msgid "Next (F3)" msgstr "Следующий (F3)" #: ../gtk/data/OutputEditorHOCR.ui.h:15 #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:122 msgid "Previous (Shift+F3)" msgstr "Предыдущий (Shift+F3)" #: ../gtk/data/OutputEditorHOCR.ui.h:16 ../gtk/src/hocr/OutputEditorHOCR.cc:890 #: ../qt/src/hocr/OutputEditorHOCR.cc:730 #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:126 msgid "Expand all" msgstr "Развернуть" #: ../gtk/data/OutputEditorHOCR.ui.h:17 ../gtk/src/hocr/OutputEditorHOCR.cc:893 #: ../qt/src/hocr/OutputEditorHOCR.cc:731 #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:127 msgid "Collapse all" msgstr "Свернуть" #: ../gtk/data/OutputEditorHOCR.ui.h:18 #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:148 msgid "Properties" msgstr "СвойÑтва" #: ../gtk/data/OutputEditorHOCR.ui.h:19 #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:152 msgid "Source" msgstr "ИÑточник" #. Output insert mode #: ../gtk/data/OutputEditorText.ui.h:1 ../qt/src/Ui_OutputEditorText.hh:52 msgid "Append to current text" msgstr "Добавить к текущему текÑту" #: ../gtk/data/OutputEditorText.ui.h:2 ../qt/src/Ui_OutputEditorText.hh:53 msgid "Insert at cursor" msgstr "Ð’Ñтавить в позиции курÑора" #: ../gtk/data/OutputEditorText.ui.h:3 ../qt/src/Ui_OutputEditorText.hh:54 msgid "Replace current text" msgstr "Заменить текущий текÑÑ‚" #. Output postprocessing #: ../gtk/data/OutputEditorText.ui.h:4 ../qt/src/Ui_OutputEditorText.hh:62 msgid "Keep line break if..." msgstr "СохранÑть разрыв Ñтроки, еÑли..." #: ../gtk/data/OutputEditorText.ui.h:5 ../qt/src/Ui_OutputEditorText.hh:64 msgid "Preceded by end mark (.?!)" msgstr "Перед ним Ñтоит знак конца Ð¿Ñ€ÐµÐ´Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ (.?!)" #: ../gtk/data/OutputEditorText.ui.h:6 ../qt/src/Ui_OutputEditorText.hh:66 msgid "Preceded or succeeded by quote" msgstr "Перед ним или поÑле него Ñтоит кавычка" #: ../gtk/data/OutputEditorText.ui.h:7 ../qt/src/Ui_OutputEditorText.hh:68 msgid "Other options" msgstr "Прочие опции" #: ../gtk/data/OutputEditorText.ui.h:8 ../qt/src/Ui_OutputEditorText.hh:70 msgid "Join hyphenated words" msgstr "УдалÑть переноÑÑ‹ Ñлов" #: ../gtk/data/OutputEditorText.ui.h:9 ../qt/src/Ui_OutputEditorText.hh:72 msgid "Collapse whitespace" msgstr "Сжимать Ñимволы пробелов" #: ../gtk/data/OutputEditorText.ui.h:10 ../qt/src/Ui_OutputEditorText.hh:74 msgid "Preserve paragraphs" msgstr "СохранÑть абзацы" #: ../gtk/data/OutputEditorText.ui.h:11 ../qt/src/Ui_OutputEditorText.hh:76 msgid "Visual aids" msgstr "Ð’Ñпомогательные ÑредÑтва" #: ../gtk/data/OutputEditorText.ui.h:12 ../qt/src/Ui_OutputEditorText.hh:78 msgid "Draw whitespace" msgstr "Отображение пробелов" #: ../gtk/data/OutputEditorText.ui.h:14 ../qt/src/Ui_OutputEditorText.hh:102 msgid "Strip line breaks on selected text" msgstr "Удалить разрывы Ñтрок в выбранном текÑте" #: ../gtk/data/OutputEditorText.ui.h:16 ../qt/src/Ui_OutputEditorText.hh:109 #: ../qt/src/Ui_OutputEditorText.hh:110 msgid "Undo" msgstr "Отменить" #: ../gtk/data/OutputEditorText.ui.h:17 ../qt/src/Ui_OutputEditorText.hh:112 #: ../qt/src/Ui_OutputEditorText.hh:113 msgid "Redo" msgstr "Вернуть" #: ../gtk/data/PdfExportDialog.ui.h:1 ../qt/data/PdfExportDialog.ui.h:1 msgid "PDF Export" msgstr "ЭкÑпорт в PDF" #: ../gtk/data/PdfExportDialog.ui.h:4 ../qt/data/PdfExportDialog.ui.h:4 msgid "Output mode:" msgstr "Режим вывода:" #: ../gtk/data/PdfExportDialog.ui.h:5 ../qt/data/PdfExportDialog.ui.h:6 msgid "PDF" msgstr "PDF" #: ../gtk/data/PdfExportDialog.ui.h:6 ../qt/data/PdfExportDialog.ui.h:7 msgid "PDF with invisible text overlay" msgstr "PDF Ñ Ð½ÐµÐ²Ð¸Ð´Ð¸Ð¼Ñ‹Ð¼ наложенным текÑтом" #: ../gtk/data/PdfExportDialog.ui.h:7 ../qt/data/PdfExportDialog.ui.h:16 msgid "Format:" msgstr "Формат:" #: ../gtk/data/PdfExportDialog.ui.h:8 ../qt/data/PdfExportDialog.ui.h:17 msgid "Compression:" msgstr "Сжатие:" #: ../gtk/data/PdfExportDialog.ui.h:9 ../qt/data/PdfExportDialog.ui.h:14 msgid "Compression quality:" msgstr "КачеÑтво ÑжатиÑ:" #: ../gtk/data/PdfExportDialog.ui.h:10 ../qt/data/PdfExportDialog.ui.h:15 msgid "DPI:" msgstr "Точек на дюйм:" #: ../gtk/data/PdfExportDialog.ui.h:11 ../qt/data/PdfExportDialog.ui.h:18 msgid "Dithering algorithm:" msgstr "Ðлгоритм ÑглаживаниÑ:" #: ../gtk/data/PdfExportDialog.ui.h:12 ../qt/data/PdfExportDialog.ui.h:13 msgid "Image settings:" msgstr "Параметры изображениÑ:" #: ../gtk/data/PdfExportDialog.ui.h:13 ../qt/data/PdfExportDialog.ui.h:25 msgid "Uniformize line and word spacing" msgstr "УравнÑть интервалы между Ñтроками и Ñловами" #: ../gtk/data/PdfExportDialog.ui.h:14 ../qt/data/PdfExportDialog.ui.h:21 msgid "Override font family:" msgstr "Принудительно иÑпользовать шрифт:" #: ../gtk/data/PdfExportDialog.ui.h:15 ../qt/data/PdfExportDialog.ui.h:27 msgid "Fallback font family:" msgstr "Ð ÐµÐ·ÐµÑ€Ð²Ð½Ð°Ñ Ð³Ð°Ñ€Ð½Ð¸Ñ‚ÑƒÑ€Ð°:" #: ../gtk/data/PdfExportDialog.ui.h:16 ../qt/data/PdfExportDialog.ui.h:20 msgid "Override font size:" msgstr "Переопределить размер шрифта:" #: ../gtk/data/PdfExportDialog.ui.h:17 ../qt/data/PdfExportDialog.ui.h:23 msgid "Font scaling:" msgstr "МаÑштабирование шрифта:" #: ../gtk/data/PdfExportDialog.ui.h:18 ../qt/data/PdfExportDialog.ui.h:26 msgid "pt" msgstr "точек" #: ../gtk/data/PdfExportDialog.ui.h:19 ../qt/data/PdfExportDialog.ui.h:22 msgid "Preserve spaces wider than:" msgstr "Сохранить пробелы шире чем:" #: ../gtk/data/PdfExportDialog.ui.h:20 ../qt/data/PdfExportDialog.ui.h:24 msgid "characters" msgstr "Ñимволов" #: ../gtk/data/PdfExportDialog.ui.h:21 ../qt/data/PdfExportDialog.ui.h:28 msgid "Sanitize hyphens before line breaks" msgstr "" #: ../gtk/data/PdfExportDialog.ui.h:22 ../qt/data/PdfExportDialog.ui.h:19 msgid "Text settings:" msgstr "Параметры текÑта:" #: ../gtk/data/PdfExportDialog.ui.h:23 ../qt/data/PdfExportDialog.ui.h:10 msgid "Paper size:" msgstr "Размер Ñтраницы:" #: ../gtk/data/PdfExportDialog.ui.h:24 ../qt/data/PdfExportDialog.ui.h:11 msgid "Width" msgstr "Ширина" #: ../gtk/data/PdfExportDialog.ui.h:25 ../qt/data/PdfExportDialog.ui.h:12 msgid "Height" msgstr "Ð’Ñ‹Ñота" #: ../gtk/data/PdfExportDialog.ui.h:26 ../qt/data/PdfExportDialog.ui.h:29 msgid "Treat image sources as having true DPI:" msgstr "" #: ../gtk/data/PdfExportDialog.ui.h:27 ../qt/data/PdfExportDialog.ui.h:3 msgid "Basic" msgstr "Базовый" #: ../gtk/data/PdfExportDialog.ui.h:28 ../qt/data/PdfExportDialog.ui.h:31 msgid "PDF version:" msgstr "ВерÑÐ¸Ñ PDF:" #: ../gtk/data/PdfExportDialog.ui.h:29 ../qt/data/PdfExportDialog.ui.h:33 msgid "Password:" msgstr "Пароль:" #: ../gtk/data/PdfExportDialog.ui.h:30 ../qt/data/PdfExportDialog.ui.h:34 msgid "Confirm password:" msgstr "Подтвердить пароль:" #: ../gtk/data/PdfExportDialog.ui.h:31 ../qt/data/PdfExportDialog.ui.h:32 msgid "Encryption (optional):" msgstr "Шифрование (опционально):" #: ../gtk/data/PdfExportDialog.ui.h:32 ../qt/data/PdfExportDialog.ui.h:36 msgid "Author:" msgstr "Ðвтор:" #: ../gtk/data/PdfExportDialog.ui.h:33 ../qt/data/PdfExportDialog.ui.h:38 msgid "Title:" msgstr "Заголовок:" #: ../gtk/data/PdfExportDialog.ui.h:34 ../qt/data/PdfExportDialog.ui.h:40 msgid "Subject:" msgstr "Тема:" #: ../gtk/data/PdfExportDialog.ui.h:35 ../qt/data/PdfExportDialog.ui.h:37 msgid "Creator:" msgstr "Создатель:" #: ../gtk/data/PdfExportDialog.ui.h:36 ../qt/data/PdfExportDialog.ui.h:39 msgid "Producer:" msgstr "Изготовитель:" #: ../gtk/data/PdfExportDialog.ui.h:37 ../qt/data/PdfExportDialog.ui.h:41 msgid "Keywords:" msgstr "Ключевые Ñлова:" #: ../gtk/data/PdfExportDialog.ui.h:38 ../qt/data/PdfExportDialog.ui.h:35 msgid "Additional information (optional):" msgstr "Ð”Ð¾Ð¿Ð¾Ð»Ð½Ð¸Ñ‚ÐµÐ»ÑŒÐ½Ð°Ñ Ð¸Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ (опционально):" #: ../gtk/data/PdfExportDialog.ui.h:39 ../qt/data/PdfExportDialog.ui.h:42 msgid "Import from current source" msgstr "Импорт из текущего иÑточника" #: ../gtk/data/PdfExportDialog.ui.h:40 ../qt/data/PdfExportDialog.ui.h:30 msgid "Advanced" msgstr "РаÑширенный" #: ../gtk/data/SearchReplaceFrame.ui.h:1 ../qt/data/SearchReplaceFrame.ui.h:4 msgid "Find" msgstr "Ðайти" #: ../gtk/data/SearchReplaceFrame.ui.h:2 ../qt/data/SearchReplaceFrame.ui.h:2 msgid "Replace" msgstr "Заменить" #: ../gtk/data/SearchReplaceFrame.ui.h:3 ../qt/data/SearchReplaceFrame.ui.h:3 msgid "Replace all" msgstr "Заменить вÑÑ‘" #: ../gtk/data/SearchReplaceFrame.ui.h:4 ../qt/data/SearchReplaceFrame.ui.h:5 msgid "Find previous" msgstr "Ðайти предыдущее" #: ../gtk/data/SearchReplaceFrame.ui.h:5 ../qt/data/SearchReplaceFrame.ui.h:6 msgid "Find next" msgstr "Ðайти Ñледующее" #: ../gtk/data/SearchReplaceFrame.ui.h:6 ../qt/data/SearchReplaceFrame.ui.h:7 msgid "Match case" msgstr "СоглаÑовать региÑтр" #: ../gtk/data/SearchReplaceFrame.ui.h:7 #: ../gtk/data/SubstitutionsManager.ui.h:1 ../qt/data/SearchReplaceFrame.ui.h:1 #: ../qt/src/SubstitutionsManager.cc:36 msgid "Substitutions" msgstr "Замены" #: ../gtk/data/SelectionMenu.ui.h:1 ../qt/src/DisplayerToolSelect.cc:239 msgid "Delete" msgstr "Удалить" #: ../gtk/data/SelectionMenu.ui.h:2 ../qt/src/DisplayerToolSelect.cc:225 msgid "Order:" msgstr "ПорÑдок:" #: ../gtk/data/SelectionMenu.ui.h:3 ../gtk/src/hocr/DisplayerToolHOCR.cc:29 #: ../qt/src/DisplayerToolSelect.cc:240 ../qt/src/hocr/DisplayerToolHOCR.cc:31 msgid "Recognize" msgstr "РаÑпознать" #: ../gtk/data/SelectionMenu.ui.h:4 ../qt/src/DisplayerToolSelect.cc:241 msgid "Recognize to clipboard" msgstr "РаÑпознать в буфер обмена" #: ../gtk/data/SelectionMenu.ui.h:5 ../qt/src/DisplayerToolSelect.cc:242 msgid "Save as image" msgstr "Сохранить как изображение" #: ../gtk/data/SubstitutionsManager.ui.h:2 ../qt/src/SubstitutionsManager.cc:38 #: ../qt/src/SubstitutionsManager.cc:39 msgid "Open" msgstr "Открыть" #: ../gtk/data/SubstitutionsManager.ui.h:3 ../gtk/src/Utils.cc:73 #: ../qt/src/SubstitutionsManager.cc:41 ../qt/src/SubstitutionsManager.cc:42 msgid "Save" msgstr "Сохранить" #: ../gtk/data/SubstitutionsManager.ui.h:4 ../qt/src/SubstitutionsManager.cc:44 #: ../qt/src/SubstitutionsManager.cc:45 msgid "Clear" msgstr "ОчиÑтить" #: ../gtk/data/SubstitutionsManager.ui.h:5 ../qt/data/ConfigDialog.ui.h:16 #: ../qt/src/SubstitutionsManager.cc:47 ../qt/src/SubstitutionsManager.cc:48 msgid "Add" msgstr "Добавить" #: ../gtk/data/SubstitutionsManager.ui.h:6 #: ../gtk/src/hocr/OutputEditorHOCR.cc:886 ../qt/data/ConfigDialog.ui.h:17 #: ../qt/src/hocr/OutputEditorHOCR.cc:727 ../qt/src/SubstitutionsManager.cc:50 #: ../qt/src/SubstitutionsManager.cc:51 msgid "Remove" msgstr "Удалить" #: ../gtk/data/SubstitutionsManager.ui.h:7 ../gtk/data/TessdataManager.ui.h:2 msgid "Apply" msgstr "Применить" #: ../gtk/data/SubstitutionsManager.ui.h:8 ../gtk/data/TessdataManager.ui.h:3 msgid "Close" msgstr "Закрыть" #: ../gtk/data/TessdataManager.ui.h:1 ../qt/src/TessdataManager.cc:49 msgid "Tessdata Manager" msgstr "Менеджер tessdata" #: ../gtk/data/TessdataManager.ui.h:5 ../qt/src/TessdataManager.cc:51 msgid "Manage installed languages:" msgstr "Управление уÑтановленными Ñзыками:" #: ../gtk/src/Acquirer.cc:79 ../qt/src/Acquirer.cc:70 msgid "scan.png" msgstr "Ñкан.png" #: ../gtk/src/Acquirer.cc:91 ../qt/src/Acquirer.cc:85 msgid "Images" msgstr "ИзображениÑ" #: ../gtk/src/Acquirer.cc:92 ../qt/src/Acquirer.cc:86 msgid "Choose Output Filename..." msgstr "Выберите Ð¸Ð¼Ñ Ñ„Ð°Ð¹Ð»Ð° Ð´Ð»Ñ Ð·Ð°Ð¿Ð¸Ñи..." #: ../gtk/src/Acquirer.cc:106 ../qt/src/Acquirer.cc:100 msgid "Failed to initialize the scanning backend." msgstr "Ðе удалоÑÑŒ инициализировать программные ÑредÑтва ÑканированиÑ." #: ../gtk/src/Acquirer.cc:115 ../qt/src/Acquirer.cc:106 msgid "Scan failed" msgstr "Сканирование не удалоÑÑŒ" #: ../gtk/src/Acquirer.cc:133 ../qt/src/Acquirer.cc:122 msgid "No scanners were detected." msgstr "Сканеры не обнаружены." #: ../gtk/src/Acquirer.cc:150 ../gtk/src/Acquirer.cc:168 #: ../qt/src/Acquirer.cc:136 ../qt/src/Acquirer.cc:154 msgid "Starting scan..." msgstr "ЗапуÑк ÑканированиÑ..." #: ../gtk/src/Acquirer.cc:164 ../qt/src/Acquirer.cc:150 msgid "Opening device..." msgstr "Открытие уÑтройÑтва..." #: ../gtk/src/Acquirer.cc:166 ../qt/src/Acquirer.cc:152 msgid "Setting options..." msgstr "Задание уÑтановок..." #: ../gtk/src/Acquirer.cc:170 ../qt/src/Acquirer.cc:156 msgid "Getting parameters..." msgstr "Получение параметров..." #: ../gtk/src/Acquirer.cc:172 ../qt/src/Acquirer.cc:158 msgid "Transferring data..." msgstr "Передача данных..." #: ../gtk/src/Acquirer.cc:179 ../qt/src/Acquirer.cc:165 msgid "Canceling scan..." msgstr "Отмена ÑканированиÑ..." #: ../gtk/src/Config.cc:49 ../qt/data/ConfigDialog.ui.h:7 msgid "Filename prefix" msgstr "Файловый префикÑ" #: ../gtk/src/Config.cc:50 ../qt/data/ConfigDialog.ui.h:8 msgid "Code" msgstr "Код" #: ../gtk/src/Config.cc:51 ../qt/data/ConfigDialog.ui.h:9 msgid "Native name" msgstr "Родное название" #: ../gtk/src/Config.cc:109 ../qt/src/Config.cc:108 msgid "Script" msgstr "ПиÑьмо" #: ../gtk/src/CrashHandler.cc:25 ../gtk/src/CrashHandler.cc:41 #: ../qt/src/CrashHandler.cc:36 msgid "Crash Handler" msgstr "Обработчик Ñбоев" #: ../gtk/src/CrashHandler.cc:43 ../qt/src/CrashHandler.cc:31 msgid "Your work has been saved under %1." msgstr "Результаты вашей работы были Ñохранены в %1." #: ../gtk/src/CrashHandler.cc:45 ../qt/src/CrashHandler.cc:33 msgid "There was no unsaved work." msgstr "Результаты не изменилиÑÑŒ Ñ Ð¿Ñ€Ð¾ÑˆÐ»Ð¾Ð³Ð¾ ÑохранениÑ." #: ../gtk/src/CrashHandler.cc:106 ../qt/src/CrashHandler.cc:62 msgid "Failed to obtain backtrace. Is gdb installed?" msgstr "Ðе удалоÑÑŒ произвеÑти обратную траÑÑировку. УÑтановлен ли gdb?" #: ../gtk/src/Displayer.cc:232 ../qt/src/Displayer.cc:174 msgid "Failed to load image" msgstr "Ðе удалоÑÑŒ загрузить изображение" #: ../gtk/src/Displayer.cc:232 ../qt/src/Displayer.cc:174 msgid "" "The file might not be an image or be corrupt:\n" "%1" msgstr "" "Файл не ÑвлÑетÑÑ Ð¸Ð·Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸ÐµÐ¼ или повреждён:\n" "%1" #: ../gtk/src/DisplayerToolSelect.cc:138 ../qt/src/DisplayerToolSelect.cc:135 msgid "PNG Images" msgstr "Ð˜Ð·Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸Ñ PNG" #: ../gtk/src/DisplayerToolSelect.cc:139 ../qt/src/DisplayerToolSelect.cc:135 msgid "Save Selection Image" msgstr "Сохранить выделенный фрагмент" #: ../gtk/src/DisplayerToolSelect.cc:139 ../qt/src/DisplayerToolSelect.cc:135 msgid "selection.png" msgstr "фрагмент.png" #: ../gtk/src/DisplayerToolSelect.cc:146 ../qt/src/DisplayerToolSelect.cc:142 msgid "Recognize all" msgstr "РаÑпознать вÑÑ‘" #: ../gtk/src/DisplayerToolSelect.cc:146 ../qt/src/DisplayerToolSelect.cc:142 msgid "Recognize selection" msgstr "РаÑпознать выделенное" #: ../gtk/src/DisplayerToolSelect.cc:186 ../qt/src/DisplayerToolSelect.cc:182 msgid "Performing layout analysis" msgstr "ВыполнÑетÑÑ Ð°Ð½Ð°Ð»Ð¸Ð· Ñтруктуры" #: ../gtk/src/FileDialogs.cc:235 msgid "" "A file named \"%1\" already exists. Are you sure you want to overwrite it?" msgstr "" "Файл Ñ Ð¸Ð¼ÐµÐ½ÐµÐ¼ \"%1\" уже ÑущеÑтвует. Ð’Ñ‹ уверены, что хотите его перезапиÑать?" #: ../gtk/src/FileDialogs.cc:237 msgid "Overwrite File?" msgstr "ПерезапиÑать файл?" #: ../gtk/src/hocr/HOCRDocument.cc:611 ../gtk/src/hocr/OutputEditorHOCR.cc:266 #: ../qt/src/hocr/OutputEditorHOCR.cc:229 msgid "Page" msgstr "Страница" #: ../gtk/src/hocr/HOCRDocument.cc:613 ../qt/src/hocr/HOCRDocument.cc:530 msgid "Text block" msgstr "Блок текÑта" #: ../gtk/src/hocr/HOCRDocument.cc:615 ../gtk/src/hocr/OutputEditorHOCR.cc:272 #: ../qt/src/hocr/HOCRDocument.cc:532 ../qt/src/hocr/OutputEditorHOCR.cc:231 msgid "Paragraph" msgstr "Ðбзац" #: ../gtk/src/hocr/HOCRDocument.cc:617 ../qt/src/hocr/HOCRDocument.cc:534 msgid "Textline" msgstr "Строка" #: ../gtk/src/hocr/HOCRDocument.cc:621 ../qt/src/hocr/HOCRDocument.cc:538 msgid "Graphic" msgstr "Графика" #: ../gtk/src/hocr/HOCROdtExporter.cc:65 ../gtk/src/hocr/HOCRPdfExporter.cc:489 #: ../gtk/src/hocr/HOCRTextExporter.cc:34 #: ../gtk/src/hocr/OutputEditorHOCR.cc:963 ../gtk/src/OutputEditorText.cc:272 #: ../qt/src/hocr/HOCROdtExporter.cc:50 ../qt/src/hocr/HOCRPdfExporter.cc:478 #: ../qt/src/hocr/HOCRTextExporter.cc:36 ../qt/src/hocr/OutputEditorHOCR.cc:830 #: ../qt/src/OutputEditorText.cc:238 msgid "output" msgstr "результаты" #: ../gtk/src/hocr/HOCROdtExporter.cc:68 ../qt/src/hocr/HOCROdtExporter.cc:53 msgid "OpenDocument Text Documents" msgstr "ТекÑтовые документы OpenDocument" #: ../gtk/src/hocr/HOCROdtExporter.cc:69 ../qt/src/hocr/HOCROdtExporter.cc:53 msgid "Save ODT Output..." msgstr "Сохранить ODT..." #: ../gtk/src/hocr/HOCROdtExporter.cc:77 ../gtk/src/hocr/HOCROdtExporter.cc:342 #: ../gtk/src/hocr/HOCRPdfExporter.cc:619 #: ../gtk/src/hocr/HOCRTextExporter.cc:46 ../qt/src/hocr/HOCROdtExporter.cc:61 #: ../qt/src/hocr/HOCRPdfExporter.cc:609 ../qt/src/hocr/HOCRTextExporter.cc:47 msgid "Export failed" msgstr "Ошибка во Ð²Ñ€ÐµÐ¼Ñ ÑкÑпорта" #: ../gtk/src/hocr/HOCROdtExporter.cc:77 ../gtk/src/hocr/HOCROdtExporter.cc:342 #: ../qt/src/hocr/HOCROdtExporter.cc:61 msgid "The ODT export failed: unable to write output file." msgstr "Ошибка по Ð²Ñ€ÐµÐ¼Ñ ÑкÑпорта в ODT: невозможна запиÑÑŒ в выходной файл." #: ../gtk/src/hocr/HOCROdtExporter.cc:336 ../qt/src/hocr/HOCROdtExporter.cc:254 msgid "Exporting to ODT..." msgstr "ЭкÑпорт в ODT..." #: ../gtk/src/hocr/HOCRPdfExporter.cc:283 ../qt/src/hocr/HOCRPdfExporter.cc:365 msgid "Same as source" msgstr "Как оригинал" #: ../gtk/src/hocr/HOCRPdfExporter.cc:286 ../qt/src/hocr/HOCRPdfExporter.cc:366 msgid "Custom" msgstr "ОÑобый" #: ../gtk/src/hocr/HOCRPdfExporter.cc:300 ../qt/src/hocr/HOCRPdfExporter.cc:362 msgid "cm" msgstr "Ñм" #: ../gtk/src/hocr/HOCRPdfExporter.cc:303 ../qt/src/hocr/HOCRPdfExporter.cc:363 msgid "in" msgstr "дюйм" #: ../gtk/src/hocr/HOCRPdfExporter.cc:319 ../qt/src/hocr/HOCRPdfExporter.cc:353 msgid "Monochrome" msgstr "Монохромный" #: ../gtk/src/hocr/HOCRPdfExporter.cc:328 ../qt/src/hocr/HOCRPdfExporter.cc:355 msgid "Threshold (closest color)" msgstr "Пороговый (ближайший цвет)" #: ../gtk/src/hocr/HOCRPdfExporter.cc:331 ../qt/src/hocr/HOCRPdfExporter.cc:356 msgid "Diffuse" msgstr "Диффузный" #: ../gtk/src/hocr/HOCRPdfExporter.cc:340 ../qt/src/hocr/HOCRPdfExporter.cc:357 msgid "Zip (lossless)" msgstr "Zip (без потерь)" #: ../gtk/src/hocr/HOCRPdfExporter.cc:344 ../qt/src/hocr/HOCRPdfExporter.cc:358 msgid "CCITT Group 4 (lossless)" msgstr "CCITT Group 4 (без потерь)" #: ../gtk/src/hocr/HOCRPdfExporter.cc:348 ../qt/src/hocr/HOCRPdfExporter.cc:359 msgid "Jpeg (lossy)" msgstr "Jpeg (Ñ Ð¿Ð¾Ñ‚ÐµÑ€Ñми)" #: ../gtk/src/hocr/HOCRPdfExporter.cc:493 ../qt/src/hocr/HOCRPdfExporter.cc:482 msgid "PDF Files" msgstr "Файлы PDF" #: ../gtk/src/hocr/HOCRPdfExporter.cc:494 ../qt/src/hocr/HOCRPdfExporter.cc:482 msgid "Save PDF Output..." msgstr "Сохранить результаты в PDF..." #: ../gtk/src/hocr/HOCRPdfExporter.cc:500 ../qt/src/hocr/HOCRPdfExporter.cc:488 msgid "Invalid Output" msgstr "Ðеправильный результат" #: ../gtk/src/hocr/HOCRPdfExporter.cc:500 ../qt/src/hocr/HOCRPdfExporter.cc:488 msgid "Cannot overwrite a file which is a source image of this document." msgstr "" "Ðевозможно перезапиÑать файл, который ÑвлÑетÑÑ Ð¸Ñходным изображением данного " "документа." #: ../gtk/src/hocr/HOCRPdfExporter.cc:516 ../qt/src/hocr/HOCRPdfExporter.cc:511 msgid "Failed to create output" msgstr "Ðевозможно получить результат" #: ../gtk/src/hocr/HOCRPdfExporter.cc:516 ../qt/src/hocr/HOCRPdfExporter.cc:511 msgid "Failed to create output. The returned error was: %1" msgstr "Ðевозможно Ñделать результат. Ошибка: %1" #: ../gtk/src/hocr/HOCRPdfExporter.cc:558 ../qt/src/hocr/HOCRPdfExporter.cc:551 msgid "The operation was cancelled" msgstr "ÐžÐ¿ÐµÑ€Ð°Ñ†Ð¸Ñ Ð±Ñ‹Ð»Ð° отменена" #: ../gtk/src/hocr/HOCRPdfExporter.cc:607 ../qt/src/hocr/HOCRPdfExporter.cc:597 msgid "Failed to render page %1" msgstr "Ðе удалоÑÑŒ отриÑовать Ñтраницу %1" #: ../gtk/src/hocr/HOCRPdfExporter.cc:614 ../qt/src/hocr/HOCRPdfExporter.cc:604 msgid "Exporting to PDF..." msgstr "ЭкÑпорт в PDF..." #: ../gtk/src/hocr/HOCRPdfExporter.cc:619 ../qt/src/hocr/HOCRPdfExporter.cc:609 msgid "The PDF export failed: %1." msgstr "Ошибка ÑкÑпорта в PDF: %1." #: ../gtk/src/hocr/HOCRPdfExporter.cc:673 ../qt/src/hocr/HOCRPdfExporter.cc:662 msgid "The PDF library could not load the font '%1'." msgstr "Библиотека PDF не может загрузить выбранный шрифт '%1'." #: ../gtk/src/hocr/HOCRTextExporter.cc:37 ../gtk/src/OutputEditorText.cc:274 #: ../qt/src/hocr/HOCRTextExporter.cc:39 ../qt/src/OutputEditorText.cc:239 msgid "Text Files" msgstr "ТекÑтовые файлы" #: ../gtk/src/hocr/HOCRTextExporter.cc:38 ../qt/src/hocr/HOCRTextExporter.cc:39 msgid "Save Text Output..." msgstr "Сохранить текÑÑ‚..." #: ../gtk/src/hocr/HOCRTextExporter.cc:46 ../qt/src/hocr/HOCRTextExporter.cc:47 msgid "The text export failed: unable to write output file." msgstr "Ошибка во Ð²Ñ€ÐµÐ¼Ñ ÑкÑпорта в текÑÑ‚: невозможна запиÑÑŒ в выходной файл." #: ../gtk/src/hocr/OutputEditorHOCR.cc:269 #: ../qt/src/hocr/OutputEditorHOCR.cc:230 msgid "Block" msgstr "Блок" #: ../gtk/src/hocr/OutputEditorHOCR.cc:275 #: ../qt/src/hocr/OutputEditorHOCR.cc:232 msgid "Line" msgstr "ЛиниÑ" #: ../gtk/src/hocr/OutputEditorHOCR.cc:278 #: ../qt/src/hocr/OutputEditorHOCR.cc:233 msgid "Word" msgstr "Слово" #: ../gtk/src/hocr/OutputEditorHOCR.cc:281 #: ../qt/src/hocr/OutputEditorHOCR.cc:234 msgid "Misspelled word" msgstr "Слово Ñ Ð¾ÑˆÐ¸Ð±ÐºÐ¾Ð¹" #: ../gtk/src/hocr/OutputEditorHOCR.cc:435 #: ../qt/src/hocr/OutputEditorHOCR.cc:317 msgid "" "The following pages could not be processed:\n" "%1" msgstr "" "Ðевозможно обработать Ñледующие Ñтраницы:\n" "%1" #: ../gtk/src/hocr/OutputEditorHOCR.cc:436 #: ../qt/src/hocr/OutputEditorHOCR.cc:318 msgid "Recognition errors" msgstr "Ошибки раÑпознаваниÑ" #: ../gtk/src/hocr/OutputEditorHOCR.cc:594 #: ../qt/src/hocr/OutputEditorHOCR.cc:500 #: ../qt/src/hocr/OutputEditorHOCR.cc:512 msgid "Multiple values" msgstr "ÐеÑколько значений" #. Merging allowed #: ../gtk/src/hocr/OutputEditorHOCR.cc:778 #: ../qt/src/hocr/OutputEditorHOCR.cc:641 msgid "Merge" msgstr "Объединить" #: ../gtk/src/hocr/OutputEditorHOCR.cc:786 #: ../gtk/src/hocr/OutputEditorHOCR.cc:877 #: ../qt/src/hocr/OutputEditorHOCR.cc:643 #: ../qt/src/hocr/OutputEditorHOCR.cc:725 msgid "Split from parent" msgstr "Отделить от родителÑ" #. Swapping allowed #: ../gtk/src/hocr/OutputEditorHOCR.cc:797 #: ../qt/src/hocr/OutputEditorHOCR.cc:647 msgid "Swap" msgstr "Обмен" #: ../gtk/src/hocr/OutputEditorHOCR.cc:821 #: ../qt/src/hocr/OutputEditorHOCR.cc:693 msgid "Add graphic region" msgstr "Добавить графичеÑкую облаÑть" #: ../gtk/src/hocr/OutputEditorHOCR.cc:824 #: ../qt/src/hocr/OutputEditorHOCR.cc:694 msgid "Add text block" msgstr "Добавить текÑтовый блок" #: ../gtk/src/hocr/OutputEditorHOCR.cc:828 #: ../qt/src/hocr/OutputEditorHOCR.cc:696 msgid "Add paragraph" msgstr "Добавить абзац" #: ../gtk/src/hocr/OutputEditorHOCR.cc:832 #: ../qt/src/hocr/OutputEditorHOCR.cc:698 msgid "Add line" msgstr "Добавить линию" #: ../gtk/src/hocr/OutputEditorHOCR.cc:836 #: ../qt/src/hocr/OutputEditorHOCR.cc:700 msgid "Add word" msgstr "Добавить Ñлово" #: ../gtk/src/hocr/OutputEditorHOCR.cc:852 #: ../qt/src/hocr/OutputEditorHOCR.cc:710 msgid "No suggestions" msgstr "Ðет вариантов" #: ../gtk/src/hocr/OutputEditorHOCR.cc:858 #: ../qt/src/hocr/OutputEditorHOCR.cc:714 msgid "Add to dictionary" msgstr "Добавить в Ñловарь" #: ../gtk/src/hocr/OutputEditorHOCR.cc:864 #: ../qt/src/hocr/OutputEditorHOCR.cc:716 msgid "Ignore word" msgstr "Игнорировать Ñлово" #: ../gtk/src/hocr/OutputEditorHOCR.cc:926 #: ../gtk/src/hocr/OutputEditorHOCR.cc:965 #: ../qt/src/hocr/OutputEditorHOCR.cc:795 #: ../qt/src/hocr/OutputEditorHOCR.cc:832 msgid "hOCR HTML Files" msgstr "HTML-файлы hOCR" #: ../gtk/src/hocr/OutputEditorHOCR.cc:927 #: ../qt/src/hocr/OutputEditorHOCR.cc:795 msgid "Open hOCR File" msgstr "Открыть файл hOCR" #: ../gtk/src/hocr/OutputEditorHOCR.cc:936 #: ../qt/src/hocr/OutputEditorHOCR.cc:802 msgid "Failed to open file" msgstr "Ðе удалоÑÑŒ открыть файл" #: ../gtk/src/hocr/OutputEditorHOCR.cc:936 #: ../qt/src/hocr/OutputEditorHOCR.cc:802 msgid "The file could not be opened: %1." msgstr "Ðевозможно открыть файл: %1." #: ../gtk/src/hocr/OutputEditorHOCR.cc:945 #: ../qt/src/hocr/OutputEditorHOCR.cc:809 msgid "Invalid hOCR file" msgstr "Ðекорректный файл hOCR" #: ../gtk/src/hocr/OutputEditorHOCR.cc:945 #: ../qt/src/hocr/OutputEditorHOCR.cc:809 msgid "The file does not appear to contain valid hOCR HTML: %1" msgstr "Файл hOCR не Ñодержит правильной HTML-разметки: %1" #: ../gtk/src/hocr/OutputEditorHOCR.cc:966 #: ../qt/src/hocr/OutputEditorHOCR.cc:832 msgid "Save hOCR Output..." msgstr "Сохранить результаты в hOCR..." #: ../gtk/src/hocr/OutputEditorHOCR.cc:973 ../gtk/src/OutputEditorText.cc:282 #: ../qt/src/hocr/OutputEditorHOCR.cc:839 ../qt/src/OutputEditorText.cc:246 msgid "Failed to save output" msgstr "Ðе удалоÑÑŒ Ñохранить результаты" #: ../gtk/src/hocr/OutputEditorHOCR.cc:973 ../gtk/src/OutputEditorText.cc:282 #: ../qt/src/hocr/OutputEditorHOCR.cc:839 ../qt/src/OutputEditorText.cc:246 msgid "Check that you have writing permissions in the selected folder." msgstr "УбедитеÑÑŒ, что у Ð²Ð°Ñ ÐµÑть право на запиÑÑŒ в выбранную папку." #: ../gtk/src/hocr/OutputEditorHOCR.cc:1035 ../gtk/src/OutputEditorText.cc:296 #: ../qt/src/hocr/OutputEditorHOCR.cc:894 ../qt/src/OutputEditorText.cc:259 msgid "Output not saved" msgstr "Результаты не Ñохранены" #: ../gtk/src/hocr/OutputEditorHOCR.cc:1035 ../gtk/src/OutputEditorText.cc:296 #: ../qt/src/hocr/OutputEditorHOCR.cc:894 ../qt/src/OutputEditorText.cc:259 msgid "Save output before proceeding?" msgstr "Сохранить результаты, прежде чем продолжить?" #: ../gtk/src/hocr/OutputEditorHOCR.cc:1156 ../gtk/src/OutputEditorText.cc:184 #: ../qt/src/hocr/OutputEditorHOCR.cc:991 ../qt/src/OutputEditorText.cc:152 msgid "Replacing..." msgstr "Замена..." #: ../gtk/src/hocr/OutputEditorHOCR.cc:1181 ../gtk/src/OutputEditorText.cc:192 #: ../qt/src/hocr/OutputEditorHOCR.cc:1014 ../qt/src/OutputEditorText.cc:160 msgid "Applying substitutions..." msgstr "Применение замен..." #: ../gtk/src/MainWindow.cc:131 ../qt/src/MainWindow.cc:295 msgid "Using tesseract" msgstr "ИÑпользуетÑÑ tesseract" #: ../gtk/src/MainWindow.cc:178 ../qt/src/MainWindow.cc:194 msgid "Select an image to begin..." msgstr "Выберите изображение Ð´Ð»Ñ Ð½Ð°Ñ‡Ð°Ð»Ð° работы..." #: ../gtk/src/MainWindow.cc:293 ../qt/src/MainWindow.cc:278 msgid "Multiple sources" msgstr "ÐеÑколько иÑточников" #: ../gtk/src/MainWindow.cc:295 ../qt/src/MainWindow.cc:280 msgid "Ready" msgstr "Готов" #: ../gtk/src/MainWindow.cc:442 ../qt/src/MainWindow.cc:423 msgid "New version" msgstr "ÐÐ¾Ð²Ð°Ñ Ð²ÐµÑ€ÑиÑ" #: ../gtk/src/MainWindow.cc:442 ../qt/src/MainWindow.cc:423 msgid "gImageReader %1 is available" msgstr "ДоÑтупен gImageReader %1" #: ../gtk/src/MainWindow.cc:443 ../qt/src/MainWindow.cc:424 msgid "Download" msgstr "Скачать" #: ../gtk/src/MainWindow.cc:444 ../qt/src/MainWindow.cc:425 msgid "Changelog" msgstr "СпиÑок изменений" #: ../gtk/src/MainWindow.cc:445 ../qt/src/MainWindow.cc:426 msgid "Don't notify again" msgstr "Больше не показывать уведомление" #: ../gtk/src/MainWindow.cc:466 ../qt/src/MainWindow.cc:474 msgid "Don't show again" msgstr "Больше не показывать" #: ../gtk/src/MainWindow.cc:467 ../gtk/src/MainWindow.cc:480 #: ../qt/src/MainWindow.cc:475 msgid "Install" msgstr "УÑтановить" #: ../gtk/src/MainWindow.cc:487 ../qt/src/MainWindow.cc:487 msgid "Spelling dictionary missing" msgstr "ОтÑутÑтвует орфографичеÑкий Ñловарь" #: ../gtk/src/MainWindow.cc:487 ../qt/src/MainWindow.cc:487 msgid "The spellcheck dictionary for %1 is not installed" msgstr "ОрфографичеÑкий Ñловарь Ð´Ð»Ñ %1 не уÑтановлен" #: ../gtk/src/MainWindow.cc:494 ../gtk/src/MainWindow.cc:523 #: ../qt/src/MainWindow.cc:493 msgid "Installing spelling dictionary for '%1'" msgstr "УÑтанавливаетÑÑ Ð¾Ñ€Ñ„Ð¾Ð³Ñ€Ð°Ñ„Ð¸Ñ‡ÐµÑкий Ñловарь Ð´Ð»Ñ '%1'" #: ../gtk/src/MainWindow.cc:515 ../gtk/src/MainWindow.cc:536 #: ../gtk/src/MainWindow.cc:544 ../gtk/src/MainWindow.cc:592 #: ../gtk/src/MainWindow.cc:597 ../gtk/src/TessdataManager.cc:60 #: ../gtk/src/TessdataManager.cc:70 ../gtk/src/TessdataManager.cc:339 #: ../qt/src/MainWindow.cc:512 ../qt/src/MainWindow.cc:525 #: ../qt/src/MainWindow.cc:534 ../qt/src/MainWindow.cc:578 #: ../qt/src/MainWindow.cc:583 ../qt/src/TessdataManager.cc:74 #: ../qt/src/TessdataManager.cc:84 ../qt/src/TessdataManager.cc:315 msgid "Error" msgstr "Ошибка" #: ../gtk/src/MainWindow.cc:515 ../qt/src/MainWindow.cc:512 msgid "Failed to install spelling dictionary: %1" msgstr "Ðе удалоÑÑŒ уÑтановить орфографичеÑкий Ñловарь: %1" #: ../gtk/src/MainWindow.cc:536 ../qt/src/MainWindow.cc:525 msgid "Failed to create directory for spelling dictionaries." msgstr "Ðе удалоÑÑŒ Ñоздать папку Ð´Ð»Ñ Ð¾Ñ€Ñ„Ð¾Ð³Ñ€Ð°Ñ„Ð¸Ñ‡ÐµÑких Ñловарей." #: ../gtk/src/MainWindow.cc:544 ../qt/src/MainWindow.cc:534 msgid "Could not read %1: %2." msgstr "Ðевозможно прочеÑть %1: %2." #: ../gtk/src/MainWindow.cc:571 ../qt/src/MainWindow.cc:558 msgid "Downloading '%1'..." msgstr "СкачиваетÑÑ '%1'..." #: ../gtk/src/MainWindow.cc:592 ../qt/src/MainWindow.cc:578 msgid "" "The following dictionaries could not be downloaded:\n" "%1\n" "\n" "Check the connectivity and directory permissions.\n" "Hint: If you don't have write permissions in system folders, you can switch " "to user paths in the settings dialog." msgstr "" "Эта Ñловари не могут быть загружены:\n" "%1\n" "\n" "Проверьте Ñоединение и права директории.\n" "ПодÑказка: еÑли у Ð’Ð°Ñ Ð½ÐµÑ‚ прав на запиÑÑŒ в ÑиÑтемные директории, Ð’Ñ‹ можете " "Ñменить пути в наÑтройках." #: ../gtk/src/MainWindow.cc:595 ../qt/src/MainWindow.cc:581 msgid "Dictionaries installed" msgstr "Словари уÑтановлены" #: ../gtk/src/MainWindow.cc:595 msgid "" "The following dictionaries were installed:\n" "%1" msgstr "" "Были уÑтановлены Ñледующие Ñловари:\n" "%1" #: ../gtk/src/MainWindow.cc:597 ../qt/src/MainWindow.cc:583 msgid "No spelling dictionaries found for '%1'." msgstr "ОрфографичеÑкие Ñловари Ð´Ð»Ñ '%1' не найдены." #: ../gtk/src/OutputEditorText.cc:154 ../qt/src/OutputEditorText.cc:137 msgid "Stripping line breaks..." msgstr "Удаление разрывов Ñтрок..." #: ../gtk/src/OutputEditorText.cc:162 msgid "Check spelling" msgstr "Проверить орфографию" #: ../gtk/src/OutputEditorText.cc:231 ../qt/src/OutputEditorText.cc:196 msgid "File: %1" msgstr "Файл: %1" #: ../gtk/src/OutputEditorText.cc:234 ../qt/src/OutputEditorText.cc:199 msgid "Page: %1" msgstr "Страница: %1" #: ../gtk/src/OutputEditorText.cc:247 ../gtk/src/Recognizer.cc:471 #: ../qt/src/Recognizer.cc:462 msgid "" "\n" "[Failed to recognize page %1]\n" msgstr "" "\n" "[Ðе удалоÑÑŒ раÑпознать Ñтраницу %1]\n" #: ../gtk/src/OutputEditorText.cc:275 ../qt/src/OutputEditorText.cc:239 msgid "Save Output..." msgstr "Сохранить результаты..." #: ../gtk/src/Recognizer.cc:179 ../qt/src/Recognizer.cc:172 msgid "No languages available" msgstr "Языки недоÑтупны" #: ../gtk/src/Recognizer.cc:179 ../qt/src/Recognizer.cc:172 msgid "" "No tesseract languages are available for use. Recognition will not work." msgstr "" "ÐедоÑтупны Ñзыковые файлы Ð´Ð»Ñ tesseract. РаÑпознавание работать не будет." #: ../gtk/src/Recognizer.cc:233 ../qt/src/Recognizer.cc:232 msgid "Multilingual" msgstr "ÐеÑколько Ñзыков" #: ../gtk/src/Recognizer.cc:285 ../qt/src/Recognizer.cc:277 msgid "Automatic page segmentation" msgstr "ÐвтоматичеÑкое разбиение Ñтраницы" #: ../gtk/src/Recognizer.cc:286 ../qt/src/Recognizer.cc:278 msgid "Page segmentation with orientation and script detection" msgstr "Разбиение Ñтраницы Ñ Ð¾Ð¿Ñ€ÐµÐ´ÐµÐ»ÐµÐ½Ð¸ÐµÐ¼ ориентации и Ð½Ð°Ñ‡ÐµÑ€Ñ‚Ð°Ð½Ð¸Ñ ÑˆÑ€Ð¸Ñ„Ñ‚Ð°" #: ../gtk/src/Recognizer.cc:287 ../qt/src/Recognizer.cc:279 msgid "Assume single column of text" msgstr "РаÑценивать как текÑÑ‚ в одну колонку" #: ../gtk/src/Recognizer.cc:288 ../qt/src/Recognizer.cc:280 msgid "Assume single block of vertically aligned text" msgstr "РаÑценивать как блок текÑта, выровненного по вертикали" #: ../gtk/src/Recognizer.cc:289 ../qt/src/Recognizer.cc:281 msgid "Assume a single uniform block of text" msgstr "РаÑценивать как однородный блок текÑта" #: ../gtk/src/Recognizer.cc:290 ../qt/src/Recognizer.cc:282 msgid "Assume a line of text" msgstr "РаÑценивать как Ñтроку текÑта" #: ../gtk/src/Recognizer.cc:291 ../qt/src/Recognizer.cc:283 msgid "Assume a single word" msgstr "РаÑценивать как отдельное Ñлово" #: ../gtk/src/Recognizer.cc:292 ../qt/src/Recognizer.cc:284 msgid "Assume a single word in a circle" msgstr "РаÑценивать как отдельное Ñлово в круге" #: ../gtk/src/Recognizer.cc:293 ../qt/src/Recognizer.cc:285 msgid "Sparse text in no particular order" msgstr "РаÑÑеÑнный неупорÑдоченный текÑÑ‚" #: ../gtk/src/Recognizer.cc:294 ../qt/src/Recognizer.cc:286 msgid "Sparse text with orientation and script detection" msgstr "РаÑÑеÑнный текÑÑ‚ Ñ Ð¾Ð¿Ñ€ÐµÐ´ÐµÐ»ÐµÐ½Ð¸ÐµÐ¼ ориентации и Ð½Ð°Ñ‡ÐµÑ€Ñ‚Ð°Ð½Ð¸Ñ ÑˆÑ€Ð¸Ñ„Ñ‚Ð°" #: ../gtk/src/Recognizer.cc:309 ../qt/src/Recognizer.cc:297 msgid "Page segmentation mode" msgstr "Режим Ñ€Ð°Ð·Ð±Ð¸ÐµÐ½Ð¸Ñ Ñтраницы" #: ../gtk/src/Recognizer.cc:313 ../qt/src/Recognizer.cc:300 msgid "Character whitelist / blacklist..." msgstr "" #: ../gtk/src/Recognizer.cc:319 ../qt/src/Recognizer.cc:305 msgid "Manage languages..." msgstr "Управление Ñзыками..." #: ../gtk/src/Recognizer.cc:375 ../qt/src/Recognizer.cc:369 msgid "Current selection" msgstr "Выделенный объект" #: ../gtk/src/Recognizer.cc:465 ../qt/src/Recognizer.cc:455 msgid "Recognizing page %1 (%2 of %3)" msgstr "РаÑпознаётÑÑ Ñтраница %1 (%2 из %3)" #: ../gtk/src/Recognizer.cc:470 ../qt/src/Recognizer.cc:461 msgid "" "\n" "- Page %1: failed to render page" msgstr "" "\n" "- Страница %1: не удалоÑÑŒ отриÑовать Ñтраницу" #: ../gtk/src/Recognizer.cc:501 ../gtk/src/Recognizer.cc:531 #: ../gtk/src/Recognizer.cc:544 ../qt/src/Recognizer.cc:491 #: ../qt/src/Recognizer.cc:521 ../qt/src/Recognizer.cc:534 msgid "Recognizing..." msgstr "ВыполнÑетÑÑ Ñ€Ð°Ñпознавание..." #: ../gtk/src/Recognizer.cc:505 ../gtk/src/Recognizer.cc:514 #: ../qt/src/Recognizer.cc:495 ../qt/src/Recognizer.cc:504 msgid "Recognition errors occurred" msgstr "Произошли ошибки раÑпознаваниÑ" #: ../gtk/src/Recognizer.cc:505 ../qt/src/Recognizer.cc:495 msgid "The following errors occurred:%1" msgstr "Произошли Ñледующие ошибки:%1" #: ../gtk/src/Recognizer.cc:514 ../qt/src/Recognizer.cc:504 msgid "Failed to initialize tesseract" msgstr "Ðе удалоÑÑŒ инициализировать tesseract" #: ../gtk/src/scanner/ScannerSane.cc:84 ../gtk/src/scanner/ScannerTwain.cc:288 #: ../qt/src/scanner/ScannerSane.cc:85 ../qt/src/scanner/ScannerTwain.cc:286 msgid "Scan canceled" msgstr "Сканирование отменено" #: ../gtk/src/scanner/ScannerSane.cc:159 ../gtk/src/scanner/ScannerTwain.cc:186 #: ../qt/src/scanner/ScannerSane.cc:159 ../qt/src/scanner/ScannerTwain.cc:178 msgid "No scanner specified" msgstr "Ðе задан Ñканер" #: ../gtk/src/scanner/ScannerSane.cc:168 ../gtk/src/scanner/ScannerTwain.cc:195 #: ../qt/src/scanner/ScannerSane.cc:168 ../qt/src/scanner/ScannerTwain.cc:187 msgid "Unable to connect to scanner" msgstr "Ðевозможно подключитьÑÑ Ðº Ñканеру" #: ../gtk/src/scanner/ScannerSane.cc:403 ../gtk/src/scanner/ScannerTwain.cc:266 #: ../gtk/src/scanner/ScannerTwain.cc:292 ../qt/src/scanner/ScannerSane.cc:403 #: ../qt/src/scanner/ScannerTwain.cc:258 ../qt/src/scanner/ScannerTwain.cc:290 msgid "Unable to start scan" msgstr "Ðевозможно начать Ñканирование" #: ../gtk/src/scanner/ScannerSane.cc:411 ../gtk/src/scanner/ScannerSane.cc:461 #: ../gtk/src/scanner/ScannerTwain.cc:318 ../qt/src/scanner/ScannerSane.cc:411 #: ../qt/src/scanner/ScannerSane.cc:461 ../qt/src/scanner/ScannerTwain.cc:316 msgid "Error communicating with scanner" msgstr "Ошибка ÑвÑзи Ñо Ñканером" #: ../gtk/src/scanner/ScannerSane.cc:520 ../qt/src/scanner/ScannerSane.cc:517 msgid "Failed to save image" msgstr "Ðе удалоÑÑŒ Ñохранить изображение" #: ../gtk/src/scanner/ScannerSane.cc:800 ../qt/src/scanner/ScannerSane.cc:797 msgid "Operation is cancelled." msgstr "ÐžÐ¿ÐµÑ€Ð°Ñ†Ð¸Ñ Ð¾Ñ‚Ð¼ÐµÐ½ÐµÐ½Ð°." #: ../gtk/src/scanner/ScannerSane.cc:802 ../qt/src/scanner/ScannerSane.cc:799 msgid "Device is busy." msgstr "УÑтройÑтво занÑто." #: ../gtk/src/scanner/ScannerSane.cc:804 ../qt/src/scanner/ScannerSane.cc:801 msgid "Cover is opened." msgstr "Крышка открыта." #: ../gtk/src/scanner/ScannerSane.cc:806 ../qt/src/scanner/ScannerSane.cc:803 msgid "Document feeder jammed." msgstr "Сканер заклинило." #: ../gtk/src/scanner/ScannerSane.cc:808 ../qt/src/scanner/ScannerSane.cc:805 msgid "Document feeder out of documents." msgstr "Ð’ Ñканере больше нет документов." #: ../gtk/src/scanner/ScannerSane.cc:810 ../qt/src/scanner/ScannerSane.cc:807 msgid "Access to scanner is denied." msgstr "ДоÑтуп к Ñканеру запрещён." #: ../gtk/src/SourceManager.cc:118 ../qt/src/SourceManager.cc:124 msgid "PDFs with text" msgstr "PDF Ñ Ñ‚ÐµÐºÑтом" #: ../gtk/src/SourceManager.cc:118 ../qt/src/SourceManager.cc:124 msgid "" "These PDF files already contain text:\n" "%1" msgstr "" "Эта PDF файлы уже Ñодержат текÑÑ‚:\n" "%1" #: ../gtk/src/SourceManager.cc:127 ../qt/src/SourceManager.cc:132 msgid "Unable to open files" msgstr "Ðевозможно открыть файлы" #: ../gtk/src/SourceManager.cc:127 ../qt/src/SourceManager.cc:132 msgid "The following files could not be opened:%1" msgstr "Ðевозможно открыть Ñледующие файлы:%1" #: ../gtk/src/SourceManager.cc:141 ../qt/src/SourceManager.cc:143 msgid "Enter password for file '%1':" msgstr "Введите пароль Ð´Ð»Ñ Ñ„Ð°Ð¹Ð»Ð°: '%1':" #: ../gtk/src/SourceManager.cc:197 ../qt/src/SourceManager.cc:214 msgid "Images and PDFs" msgstr "Ð˜Ð·Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸Ñ Ð¸ файлы PDF" #: ../gtk/src/SourceManager.cc:202 ../qt/src/SourceManager.cc:215 msgid "Select Files" msgstr "Выберите файлы" #: ../gtk/src/SourceManager.cc:208 ../qt/src/SourceManager.cc:226 msgid "Clipboard Error" msgstr "Ошибка буфера обмена" #: ../gtk/src/SourceManager.cc:208 ../qt/src/SourceManager.cc:226 msgid "Failed to read the clipboard." msgstr "Ðе удалоÑÑŒ прочеÑть Ñодержимое буфера обмена." #: ../gtk/src/SourceManager.cc:212 ../qt/src/SourceManager.cc:230 #: ../qt/src/SourceManager.cc:236 msgid "Pasted %1" msgstr "Буфер обмена %1" #: ../gtk/src/SourceManager.cc:224 ../qt/src/SourceManager.cc:243 msgid "Screenshot Error" msgstr "Ошибка Ð¿Ð¾Ð»ÑƒÑ‡ÐµÐ½Ð¸Ñ Ñнимка Ñкрана" #: ../gtk/src/SourceManager.cc:224 ../qt/src/SourceManager.cc:243 msgid "Failed to take screenshot." msgstr "Ðе удалоÑÑŒ Ñделать Ñнимок Ñкрана." #: ../gtk/src/SourceManager.cc:228 ../qt/src/SourceManager.cc:247 msgid "Screenshot %1" msgstr "Снимок Ñкрана %1" #: ../gtk/src/SourceManager.cc:233 ../qt/src/SourceManager.cc:252 msgid "Saving image..." msgstr "Сохранение изображениÑ..." #: ../gtk/src/SourceManager.cc:240 ../qt/src/SourceManager.cc:265 msgid "Cannot Write File" msgstr "Ðевозможно запиÑать файл" #: ../gtk/src/SourceManager.cc:240 ../qt/src/SourceManager.cc:265 msgid "Could not write to %1." msgstr "Ðевозможно запиÑать в %1." #: ../gtk/src/SourceManager.cc:267 ../qt/src/SourceManager.cc:287 msgid "Delete File?" msgstr "Удалить файл?" #: ../gtk/src/SourceManager.cc:267 ../qt/src/SourceManager.cc:287 msgid "The following files will be deleted:%1" msgstr "Будут удалены Ñледующие файлы:%1" #: ../gtk/src/SourceManager.cc:332 ../qt/src/SourceManager.cc:338 msgid "Missing File" msgstr "Файл отÑутÑтвует" #: ../gtk/src/SourceManager.cc:332 ../qt/src/SourceManager.cc:338 msgid "" "The following file has been deleted or moved:\n" "%1" msgstr "" "Следующий файл был удалён или перемещён:\n" "%1" #: ../gtk/src/SubstitutionsManager.cc:33 ../qt/src/SubstitutionsManager.cc:73 msgid "Search for" msgstr "ИÑкать" #: ../gtk/src/SubstitutionsManager.cc:34 ../qt/src/SubstitutionsManager.cc:73 msgid "Replace with" msgstr "Заменить на" #: ../gtk/src/SubstitutionsManager.cc:69 ../gtk/src/SubstitutionsManager.cc:103 #: ../qt/src/SubstitutionsManager.cc:106 ../qt/src/SubstitutionsManager.cc:143 msgid "Substitutions List" msgstr "СпиÑок замен" #: ../gtk/src/SubstitutionsManager.cc:70 ../qt/src/SubstitutionsManager.cc:106 msgid "Open Substitutions List" msgstr "Открыть ÑпиÑок замен" #: ../gtk/src/SubstitutionsManager.cc:75 ../qt/src/SubstitutionsManager.cc:112 msgid "Error Reading File" msgstr "Ошибка Ñ‡Ñ‚ÐµÐ½Ð¸Ñ Ñ„Ð°Ð¹Ð»Ð°" #: ../gtk/src/SubstitutionsManager.cc:75 ../qt/src/SubstitutionsManager.cc:112 msgid "Unable to read '%1'." msgstr "Ðевозможно прочеÑть '%1'." #: ../gtk/src/SubstitutionsManager.cc:97 ../qt/src/SubstitutionsManager.cc:137 msgid "Errors Occurred Reading File" msgstr "Произошли ошибки при чтении файла" #: ../gtk/src/SubstitutionsManager.cc:97 ../qt/src/SubstitutionsManager.cc:137 msgid "Some entries of the substitutions list could not be read." msgstr "Ðе удалоÑÑŒ прочитать некоторые Ñлементы ÑпиÑка замен." #: ../gtk/src/SubstitutionsManager.cc:104 ../qt/src/SubstitutionsManager.cc:143 msgid "Save Substitutions List" msgstr "Сохранить ÑпиÑок замен" #: ../gtk/src/SubstitutionsManager.cc:110 ../qt/src/SubstitutionsManager.cc:149 msgid "Error Saving File" msgstr "Ошибка ÑÐ¾Ñ…Ñ€Ð°Ð½ÐµÐ½Ð¸Ñ Ñ„Ð°Ð¹Ð»Ð°" #: ../gtk/src/SubstitutionsManager.cc:110 ../qt/src/SubstitutionsManager.cc:149 msgid "Unable to write to '%1'." msgstr "Ðевозможно Ñохранить в '%1'." #: ../gtk/src/SubstitutionsManager.cc:127 ../qt/src/SubstitutionsManager.cc:162 msgid "Save List?" msgstr "Сохранить ÑпиÑок?" #: ../gtk/src/SubstitutionsManager.cc:127 ../qt/src/SubstitutionsManager.cc:162 msgid "Do you want to save the current list?" msgstr "Ð’Ñ‹ хотите Ñохранить текущий ÑпиÑок?" #: ../gtk/src/TessdataManager.cc:60 ../qt/src/TessdataManager.cc:74 #, fuzzy msgid "" "A session connection to the PackageKit backend is required for managing " "system-wide tesseract language packs, but it was not found. This service is " "usually provided by a software-management application such as Gnome " "Software. Please install software which provides the necessary PackageKit " "interface, use other system package management software to manage the " "tesseract language packs directly, or switch to using the user tessdata path " "in the configuration dialog." msgstr "" "Ð”Ð»Ñ ÑƒÐ¿Ñ€Ð°Ð²Ð»ÐµÐ½Ð¸Ñ Ð¾Ð±Ñ‰ÐµÑиÑтемными Ñзыковыми пакетами tesseract требуетÑÑ " "PackageKit, однако он не был найден. ПроÑьба иÑпользовать ÑиÑтемный пакетный " "менеджер Ð´Ð»Ñ ÑƒÐ¿Ñ€Ð°Ð²Ð»ÐµÐ½Ð¸Ñ Ñзыковыми пакетами tesseract, либо переключитьÑÑ Ð½Ð° " "пользовательÑкий путь к tessdata в диалоге конфигурации." #: ../gtk/src/TessdataManager.cc:65 ../qt/src/TessdataManager.cc:79 msgid "Fetching available languages" msgstr "ЗапрашиваютÑÑ Ð´Ð¾Ñтупные Ñзыки" #: ../gtk/src/TessdataManager.cc:70 ../gtk/src/TessdataManager.cc:96 #: ../gtk/src/TessdataManager.cc:197 ../qt/src/TessdataManager.cc:84 #: ../qt/src/TessdataManager.cc:101 ../qt/src/TessdataManager.cc:197 msgid "Failed to fetch list of available languages: %1" msgstr "Ðе удалоÑÑŒ получить ÑпиÑок доÑтупных Ñзыков: %1" #: ../gtk/src/TessdataManager.cc:104 ../qt/src/TessdataManager.cc:113 #: ../qt/src/TessdataManager.cc:122 msgid "Parsing error: %1" msgstr "Ошибка анализа: %1" #: ../gtk/src/TessdataManager.cc:235 ../qt/src/TessdataManager.cc:232 msgid "Applying changes..." msgstr "Применение изменений..." #: ../gtk/src/TessdataManager.cc:297 ../qt/src/TessdataManager.cc:278 msgid "Failed to create directory for tessdata files." msgstr "Ðе удалоÑÑŒ Ñоздать папку Ð´Ð»Ñ Ñ„Ð°Ð¹Ð»Ð¾Ð² tessdata." #: ../gtk/src/TessdataManager.cc:306 ../qt/src/TessdataManager.cc:287 msgid "Downloading %1..." msgstr "СкачиваетÑÑ %1..." #: ../gtk/src/TessdataManager.cc:330 msgid "" "The following files could not be downloaded or removed:\n" "%1\n" "\n" "Check the connectivity and directory permissions.\n" "\n" "Hint: If you don't have write permissions in system folders, you can switch " "to user paths in the settings dialog." msgstr "" "Следующие файлы не могут быть загружены или удалены:\n" "%1\n" "\n" "Проверьте Ñоединение и права доÑтупа к папкам.\n" "\n" "ПодÑказка: еÑли у Ð’Ð°Ñ Ð½ÐµÑ‚ прав Ð´Ð»Ñ Ð·Ð°Ð¿Ð¸Ñи в ÑиÑтемные директории, Ð’Ñ‹ можете " "наÑтроить иÑпользование пользовательÑких путей в наÑтройках." #: ../gtk/src/Utils.cc:64 msgid "Yes" msgstr "Да" #: ../gtk/src/Utils.cc:67 msgid "No" msgstr "Ðет" #: ../gtk/src/Utils.cc:76 msgid "Discard" msgstr "СброÑ" #: ../qt/data/AboutDialog.ui.h:1 msgid "About gImageReader" msgstr "О программе gImageReader" #: ../qt/data/AboutDialog.ui.h:3 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/CrashHandler.ui.h:3 msgid "" "

Tesseract has " "aborted

Tesseract (the OCR engine) has aborted while " "recognizing text. This may occur if the used traineddatas are corrupt or " "incomplatible with the version of tesseract in use, or due to a bug in " "tesseract.

The stacktrace below may provide additional information " "about where the crash occured.

" msgstr "" #: ../qt/data/MainWindow.ui.h:17 msgid "Flatbed" msgstr "Планшетный" #: ../qt/data/MainWindow.ui.h:18 msgid "ADF Front" msgstr "ÐПД (лицеваÑ)" #: ../qt/data/MainWindow.ui.h:19 msgid "ADF Back" msgstr "ÐПД (обратнаÑ)" #: ../qt/data/MainWindow.ui.h:20 msgid "ADF Duplex" msgstr "ÐПД (дуплекÑ)" #. Remove & from some labels which designer insists in adding #: ../qt/data/MainWindow.ui.h:21 ../qt/src/Ui_MainWindow.hh:50 msgid "Sources" msgstr "ИÑточники" #: ../qt/data/MainWindow.ui.h:22 msgid "Zoom In" msgstr "Увеличить" #: ../qt/data/MainWindow.ui.h:24 msgid "Zoom Out" msgstr "Уменьшить" #: ../qt/data/MainWindow.ui.h:26 msgid "Normal Size" msgstr "Обычный размер" #: ../qt/data/MainWindow.ui.h:28 msgid "Best Fit" msgstr "Ðаилучшее заполнение" #: ../qt/data/MainWindow.ui.h:30 msgid "Rotate Left" msgstr "Повернуть влево" #: ../qt/data/MainWindow.ui.h:31 msgid "Rotate left" msgstr "Повернуть влево" #: ../qt/data/MainWindow.ui.h:32 msgid "Rotate Right" msgstr "Повернуть вправо" #: ../qt/data/MainWindow.ui.h:33 msgid "Rotate right" msgstr "Повернуть вправо" #: ../qt/data/MainWindow.ui.h:34 msgid "Image Controls" msgstr "Управление изображением" #: ../qt/data/MainWindow.ui.h:36 msgid "Autodetect Layout" msgstr "Ðвтоопределение Ñтруктуры" #: ../qt/data/MainWindow.ui.h:38 msgid "Toggle Output Pane" msgstr "Показать/Ñкрыть панель результатов" #: ../qt/data/PdfExportDialog.ui.h:5 msgid "Backend:" msgstr "Метод ÑкÑпорта:" #: ../qt/data/PdfExportDialog.ui.h:8 msgid "Portrait" msgstr "Портретный" #: ../qt/data/PdfExportDialog.ui.h:9 msgid "Landscape" msgstr "Ðльбомный" #: ../qt/src/hocr/HOCRPdfExporter.cc:142 msgid "Failed to write to file" msgstr "Ðе удалоÑÑŒ запиÑать в файл" #. Output toolbar #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:55 #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:56 msgid "Open hOCR file" msgstr "Открыть файл hOCR" #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:57 #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:58 msgid "Save as hOCR text" msgstr "Сохранить как текÑÑ‚ hOCR" #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:79 #: ../qt/src/Ui_OutputEditorText.hh:106 msgid "Find and Replace" msgstr "Ðайти и заменить" #: ../qt/src/MainWindow.cc:581 #, fuzzy msgid "" "The following dictionary files were installed:\n" "%1" msgstr "Были уÑтановлены Ñледующие файлы Ñловарей:%1" #: ../qt/src/TessdataManager.cc:308 msgid "" "The following files could not be downloaded or removed:\n" "%1\n" "\n" "Check the connectivity and directory permissions.\n" "Hint: If you don't have write permissions in system folders, you can switch " "to user paths in the settings dialog." msgstr "" "Следующие файлы не могут быть загружены или удалены:\n" "%1\n" "\n" "Проверьте Ñоединение и права доÑтупа к папкам.\n" "ПодÑказка: ЕÑли у Ð²Ð°Ñ Ð½Ðµ прав Ð´Ð»Ñ Ð·Ð°Ð¿Ð¸Ñи в ÑиÑтемные папки, вы можете " "Ñменить пути в диалоге наÑтроек." #: ../qt/src/Ui_MainWindow.hh:51 msgid "Output" msgstr "Результаты" #: ../qt/src/Ui_MainWindow.hh:135 msgid "OCR mode:" msgstr "Режим раÑпознаваниÑ:" #: ../qt/src/Ui_MainWindow.hh:209 msgid "Remove Image" msgstr "Убрать изображение" #: ../qt/src/Ui_MainWindow.hh:212 msgid "Delete Image" msgstr "Удалить изображение" #: ../qt/src/Ui_MainWindow.hh:215 msgid "Clear List" msgstr "ОчиÑтить ÑпиÑок" #: ../qt/src/Ui_OutputEditorText.hh:101 msgid "Strip Line Breaks" msgstr "Удалить разрывы Ñтрок" #: ../qt/src/Ui_OutputEditorText.hh:115 msgid "Save Output" msgstr "Сохранить результаты" #: ../qt/src/Ui_OutputEditorText.hh:117 msgid "Clear Output" msgstr "ОчиÑтить результаты" #~ msgid "The application has crashed" #~ msgstr "Программа аварийно завершилаÑÑŒ" #~ 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." #~ msgid "Could not read %1: %2" #~ msgstr "Ðевозможно прочеÑть %1: %2" #~ msgid "gImageReader" #~ msgstr "gImageReader" #~ msgid "PoDoFo" #~ msgstr "PoDoFo" #~ msgid "QPrinter" #~ msgstr "QPrinter" #~ 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 "90" #~ msgstr "90" #~ msgid "300" #~ msgstr "300" #~ msgid "100" #~ msgstr "100" #~ msgid "10" #~ msgstr "10" #~ msgid "%" #~ msgstr "%" #~ msgid "4" #~ msgstr "4" #~ msgid "1" #~ msgstr "1" #~ msgid "Document font:" #~ msgstr "Шрифт документа:" #~ msgid "Scale:" #~ msgstr "МаÑштаб:" #~ msgid "Document" #~ msgstr "Документ" #~ msgid "Errors occurred" #~ msgstr "Произошли ошибки" #~ msgid "" #~ "The following pages could not be rendered:\n" #~ "%1" #~ msgstr "" #~ "Ðевозможно отриÑовать Ñледующие Ñтраницы:\n" #~ "%1" #~ msgid "substitution_list.txt" #~ msgstr "ÑпиÑок_замен.txt" #~ 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.3.1/po/sl.po000066400000000000000000002015771351740627400154530ustar00rootroot00000000000000# 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: 2019-07-25 23:17+0200\n" "PO-Revision-Date: 2017-08-29 12:50+0200\n" "Last-Translator: Bernard Banko \n" "Language-Team: lugos.si\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: Virtaal 0.7.1\n" #: ../data/gimagereader.desktop.in.h:1 msgid "OCR application" msgstr "" #: ../gtk/data/appmenu.ui.h:1 ../qt/src/Ui_MainWindow.hh:167 msgid "Redetect Languages" msgstr "Ponovno zaznaj jezike" #: ../gtk/data/appmenu.ui.h:2 ../qt/src/Ui_MainWindow.hh:170 #, fuzzy msgid "Manage Languages" msgstr "Upravljaj z jeziki ..." #: ../gtk/data/appmenu.ui.h:3 ../gtk/data/ConfigDialog.ui.h:1 #: ../qt/data/ConfigDialog.ui.h:1 ../qt/src/Ui_MainWindow.hh:173 msgid "Preferences" msgstr "Možnosti" #: ../gtk/data/appmenu.ui.h:4 ../gtk/data/ConfigDialog.ui.h:2 #: ../gtk/src/MainWindow.cc:482 ../qt/src/MainWindow.cc:481 #: ../qt/src/Ui_MainWindow.hh:178 msgid "Help" msgstr "PomoÄ" #: ../gtk/data/appmenu.ui.h:5 ../qt/data/AboutDialog.ui.h:2 #: ../qt/src/Ui_MainWindow.hh:181 msgid "About" msgstr "O programu" #: ../gtk/data/appmenu.ui.h:6 msgid "Quit" msgstr "KonÄaj" #: ../gtk/data/ConfigDialog.ui.h:3 ../gtk/data/MainWindow.ui.h:47 #: ../gtk/data/OutputEditorHOCR.ui.h:3 ../gtk/data/PdfExportDialog.ui.h:3 #: ../gtk/src/FileDialogs.cc:152 ../gtk/src/Utils.cc:61 #: ../qt/data/ConfigDialog.ui.h:26 msgid "OK" msgstr "V redu" #: ../gtk/data/ConfigDialog.ui.h:4 msgid "Output pane orientation:" msgstr "Postavitev rezultata:" #: ../gtk/data/ConfigDialog.ui.h:5 msgid "Horizontal" msgstr "Vodoravno" #: ../gtk/data/ConfigDialog.ui.h:6 msgid "Vertical" msgstr "NavpiÄno" #: ../gtk/data/ConfigDialog.ui.h:7 ../qt/data/ConfigDialog.ui.h:18 msgid "Query to install missing spellcheck dictionaries" msgstr "Poizvej za namestitev manjkajoÄih Ärkovalnikov" #: ../gtk/data/ConfigDialog.ui.h:8 ../qt/data/ConfigDialog.ui.h:4 msgid "Automatically check for new program versions" msgstr "Samodejno preveri morebitne posodobitve programa" #: ../gtk/data/ConfigDialog.ui.h:9 ../qt/data/ConfigDialog.ui.h:3 msgid "Predefined language definitions:" msgstr "PreddoloÄene nastavitve jezika:" #: ../gtk/data/ConfigDialog.ui.h:10 ../qt/data/ConfigDialog.ui.h:12 msgid "Additional language definitions:" msgstr "Dodatne nastavitve jezika:" #: ../gtk/data/ConfigDialog.ui.h:11 ../qt/data/ConfigDialog.ui.h:20 msgid "The prefix of the tesseract language data file" msgstr "Predpona datoteke z jezikovnimi podatki tesseract" #: ../gtk/data/ConfigDialog.ui.h:12 ../qt/data/ConfigDialog.ui.h:21 msgid "Prefix" msgstr "Predpona" #: ../gtk/data/ConfigDialog.ui.h:13 ../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/ConfigDialog.ui.h:14 ../qt/data/ConfigDialog.ui.h:23 msgid "ISO Code" msgstr "Koda ISO" #: ../gtk/data/ConfigDialog.ui.h:15 ../qt/data/ConfigDialog.ui.h:24 msgid "The name of the language" msgstr "Ime jezika" #: ../gtk/data/ConfigDialog.ui.h:16 ../qt/data/ConfigDialog.ui.h:25 msgid "Name" msgstr "Ime" #: ../gtk/data/ConfigDialog.ui.h:17 ../gtk/data/MainWindow.ui.h:46 #: ../gtk/data/OutputEditorHOCR.ui.h:2 ../gtk/data/PdfExportDialog.ui.h:2 #: ../gtk/src/Acquirer.cc:34 ../gtk/src/FileDialogs.cc:151 #: ../gtk/src/Utils.cc:70 ../qt/data/ConfigDialog.ui.h:27 #: ../qt/data/MainWindow.ui.h:12 msgid "Cancel" msgstr "PrekliÄi" #: ../gtk/data/ConfigDialog.ui.h:18 ../qt/data/ConfigDialog.ui.h:5 msgid "Output pane font:" msgstr "Pisava za rezultat:" #: ../gtk/data/ConfigDialog.ui.h:19 ../qt/data/ConfigDialog.ui.h:2 msgid "Default" msgstr "Privzeto" #: ../gtk/data/ConfigDialog.ui.h:20 ../qt/data/ConfigDialog.ui.h:6 msgid "Language data locations:" msgstr "Mesta jezikovnih podatkov:" #: ../gtk/data/ConfigDialog.ui.h:21 ../qt/data/ConfigDialog.ui.h:13 msgid "Language definitions path:" msgstr "Pot jezikovnih doloÄil:" #: ../gtk/data/ConfigDialog.ui.h:22 ../qt/data/ConfigDialog.ui.h:28 msgid "Spelling dictionaries path:" msgstr "Pot slovarjev Ärkovalnika:" #: ../gtk/data/ConfigDialog.ui.h:23 ../qt/data/ConfigDialog.ui.h:10 msgid "System-wide paths" msgstr "Sistemske poti" #: ../gtk/data/ConfigDialog.ui.h:24 ../qt/data/ConfigDialog.ui.h:11 msgid "User paths" msgstr "Uporabnikove poti" #: ../gtk/data/ConfigDialog.ui.h:25 ../qt/data/ConfigDialog.ui.h:29 msgid "Automatically open exported documents with default application" msgstr "" #: ../gtk/data/CrashHandler.ui.h:1 ../qt/src/CrashHandler.cc:38 msgid "Regenerate backtrace" msgstr "Ponovi povratno sledenje" #: ../gtk/data/CrashHandler.ui.h:3 #, fuzzy, no-c-format msgid "" "The application has crashed\n" "\n" "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/CrashHandler.ui.h:6 msgid "" "Tesseract has aborted\n" "\n" "Tesseract (the OCR engine) has aborted while recognizing text. This may " "occur if the used traineddatas are corrupt or incomplatible with the version " "of tesseract in use, or due to a bug in tesseract.\n" "\n" "The stacktrace below may provide additional information about where the " "crash occured.\n" msgstr "" #: ../gtk/data/MainWindow.ui.h:1 ../qt/data/MainWindow.ui.h:39 msgid "Toggle output pane" msgstr "Preklopi prikaz rezultata" #: ../gtk/data/MainWindow.ui.h:2 ../qt/src/Ui_MainWindow.hh:66 msgid "Rotate current page" msgstr "Zavrti trenutno stran" #: ../gtk/data/MainWindow.ui.h:3 ../qt/src/Ui_MainWindow.hh:67 msgid "Rotate all pages" msgstr "Zavrti vse strani" #. Sources toolbar #: ../gtk/data/MainWindow.ui.h:4 ../qt/src/Ui_MainWindow.hh:192 msgid "Recent" msgstr "Nedavno" #: ../gtk/data/MainWindow.ui.h:5 ../qt/src/Ui_MainWindow.hh:193 msgid "Paste" msgstr "Prilepi" #: ../gtk/data/MainWindow.ui.h:6 ../qt/src/Ui_MainWindow.hh:194 msgid "Take Screenshot" msgstr "Posnemi zaslon" #: ../gtk/data/MainWindow.ui.h:7 ../qt/data/MainWindow.ui.h:23 msgid "Zoom in" msgstr "Približaj" #: ../gtk/data/MainWindow.ui.h:8 ../qt/data/MainWindow.ui.h:25 msgid "Zoom out" msgstr "Oddalji" #: ../gtk/data/MainWindow.ui.h:9 ../qt/data/MainWindow.ui.h:27 msgid "Normal size" msgstr "Normalna velikost" #: ../gtk/data/MainWindow.ui.h:10 ../qt/data/MainWindow.ui.h:29 msgid "Best fit" msgstr "NajboljÅ¡e ujemanje" #: ../gtk/data/MainWindow.ui.h:11 ../qt/src/Ui_MainWindow.hh:75 msgid "Select rotation mode" msgstr "Izberi naÄin vrtenja" #: ../gtk/data/MainWindow.ui.h:12 ../gtk/data/OutputEditorText.ui.h:13 #: ../qt/src/Ui_OutputEditorText.hh:95 msgid "Select insert mode" msgstr "Izberi naÄin vstavljanja" #: ../gtk/data/MainWindow.ui.h:13 ../qt/src/Ui_MainWindow.hh:109 #, fuzzy msgid "Select page" msgstr "Izberi jezik" #: ../gtk/data/MainWindow.ui.h:14 ../qt/data/MainWindow.ui.h:35 msgid "Image controls" msgstr "Kontrolniki slike" #: ../gtk/data/MainWindow.ui.h:15 ../qt/src/Ui_MainWindow.hh:139 msgid "Plain text" msgstr "Neoblikovano besedilo" #: ../gtk/data/MainWindow.ui.h:16 ../qt/src/Ui_MainWindow.hh:139 msgid "hOCR, PDF" msgstr "hOCR, PDF" #: ../gtk/data/MainWindow.ui.h:17 ../qt/data/MainWindow.ui.h:37 msgid "Autodetect layout" msgstr "Samodejno zaznaj razporeditev" #: ../gtk/data/MainWindow.ui.h:18 msgid "Recognize all" msgstr "Prepoznaj vse" #: ../gtk/data/MainWindow.ui.h:19 msgid "Select language" msgstr "Izberi jezik" #: ../gtk/data/MainWindow.ui.h:20 ../qt/src/Ui_MainWindow.hh:205 msgid "Add images" msgstr "Dodaj slike" #: ../gtk/data/MainWindow.ui.h:21 ../qt/src/Ui_MainWindow.hh:204 msgid "Add Images" msgstr "Dodaj slike" #: ../gtk/data/MainWindow.ui.h:22 ../qt/src/Ui_MainWindow.hh:210 msgid "Remove image from list" msgstr "Odstrani slike s spiska" #: ../gtk/data/MainWindow.ui.h:23 ../qt/src/Ui_MainWindow.hh:213 msgid "Delete image" msgstr "ZbriÅ¡i sliko" #: ../gtk/data/MainWindow.ui.h:24 ../qt/src/Ui_MainWindow.hh:216 msgid "Clear list" msgstr "PoÄisti spisek" #: ../gtk/data/MainWindow.ui.h:25 ../qt/data/MainWindow.ui.h:5 msgid "Files" msgstr "Datoteke" #: ../gtk/data/MainWindow.ui.h:26 ../qt/data/MainWindow.ui.h:8 msgid "Device:" msgstr "Naprava:" #: ../gtk/data/MainWindow.ui.h:27 ../gtk/data/TessdataManager.ui.h:4 #: ../qt/data/MainWindow.ui.h:7 ../qt/src/TessdataManager.cc:59 msgid "Refresh" msgstr "Osveži" #: ../gtk/data/MainWindow.ui.h:28 ../qt/data/MainWindow.ui.h:9 msgid "Output:" msgstr "Izhod:" #: ../gtk/data/MainWindow.ui.h:29 ../qt/data/MainWindow.ui.h:13 msgid "Mode:" msgstr "NaÄin:" #: ../gtk/data/MainWindow.ui.h:30 ../gtk/src/hocr/HOCRPdfExporter.cc:313 #: ../qt/data/MainWindow.ui.h:15 ../qt/src/hocr/HOCRPdfExporter.cc:347 msgid "Color" msgstr "Barvno" #: ../gtk/data/MainWindow.ui.h:31 ../gtk/src/hocr/HOCRPdfExporter.cc:316 #: ../qt/data/MainWindow.ui.h:14 ../qt/src/hocr/HOCRPdfExporter.cc:349 #: ../qt/src/hocr/HOCRPdfExporter.cc:351 msgid "Grayscale" msgstr "Sivinsko" #: ../gtk/data/MainWindow.ui.h:32 ../qt/data/MainWindow.ui.h:10 msgid "Resolution:" msgstr "LoÄljivost:" #: ../gtk/data/MainWindow.ui.h:33 ../qt/data/MainWindow.ui.h:11 msgid "Scan" msgstr "Zaznaj" #: ../gtk/data/MainWindow.ui.h:34 ../qt/data/MainWindow.ui.h:16 #, fuzzy msgid "Source:" msgstr "Vir" #: ../gtk/data/MainWindow.ui.h:35 ../qt/data/MainWindow.ui.h:6 msgid "Acquire" msgstr "Pridobi" #: ../gtk/data/MainWindow.ui.h:36 ../qt/data/MainWindow.ui.h:1 msgid "Brightness" msgstr "Svetlost" #: ../gtk/data/MainWindow.ui.h:37 ../qt/data/MainWindow.ui.h:2 msgid "Contrast" msgstr "Kontrast" #: ../gtk/data/MainWindow.ui.h:38 ../qt/data/MainWindow.ui.h:3 msgid "Resolution" msgstr "LoÄljivost" #: ../gtk/data/MainWindow.ui.h:39 ../qt/data/MainWindow.ui.h:4 msgid "Invert colors" msgstr "Obrni barve" #: ../gtk/data/MainWindow.ui.h:40 msgid "A graphical frontend to tesseract-ocr" msgstr "GrafiÄni vmesnik za tesseract-ocr" #: ../gtk/data/MainWindow.ui.h:41 ../qt/data/CharacterListDialog.ui.h:1 msgid "Character whitelist / blacklist" msgstr "" #: ../gtk/data/MainWindow.ui.h:42 ../qt/data/CharacterListDialog.ui.h:2 msgid "Exclude these characters from being recognized (blacklist):" msgstr "" #: ../gtk/data/MainWindow.ui.h:43 ../qt/data/CharacterListDialog.ui.h:3 #, fuzzy msgid "Enter a string of characters..." msgstr "Pridobivanje nastavitev ..." #: ../gtk/data/MainWindow.ui.h:44 ../qt/data/CharacterListDialog.ui.h:4 msgid "Only allow the following characters to be recognized (whitelist):" msgstr "" #: ../gtk/data/MainWindow.ui.h:45 ../qt/data/PageRangeDialog.ui.h:1 msgid "Page Range" msgstr "Obseg strani" #: ../gtk/data/MainWindow.ui.h:48 ../qt/data/PageRangeDialog.ui.h:2 msgid "Page range:" msgstr "Obseg strani:" #: ../gtk/data/MainWindow.ui.h:49 ../qt/data/PageRangeDialog.ui.h:3 msgid "Example: 1-10, 13, 14-18" msgstr "Primer:1-10, 13, 14-18" #: ../gtk/data/MainWindow.ui.h:50 ../qt/data/PageRangeDialog.ui.h:4 msgid "Recognition area:" msgstr "PodroÄje prepoznavanja:" #: ../gtk/data/MainWindow.ui.h:51 ../gtk/src/Recognizer.cc:375 #: ../qt/data/PageRangeDialog.ui.h:5 ../qt/src/Recognizer.cc:369 msgid "Entire page" msgstr "Celotna stran" #: ../gtk/data/MainWindow.ui.h:52 ../qt/data/PageRangeDialog.ui.h:6 msgid "Autodetect" msgstr "Samodejno zaznaj" #: ../gtk/data/MainWindow.ui.h:53 ../qt/data/PageRangeDialog.ui.h:7 msgid "Prepend to output text:" msgstr "Pripni pred izhodno besedilo:" #: ../gtk/data/MainWindow.ui.h:54 ../qt/data/PageRangeDialog.ui.h:8 msgid "Source filename" msgstr "Izvorno ime datoteke" #: ../gtk/data/MainWindow.ui.h:55 ../qt/data/PageRangeDialog.ui.h:9 msgid "Source page" msgstr "Izvorna stran" #: ../gtk/data/MainWindow.ui.h:56 ../qt/src/SourceManager.cc:146 msgid "Protected PDF" msgstr "" #: ../gtk/data/MainWindow.ui.h:57 ../qt/src/Recognizer.cc:76 msgid "Current Page" msgstr "Trenutno stran" #: ../gtk/data/MainWindow.ui.h:58 ../qt/src/Recognizer.cc:79 msgid "Multiple Pages..." msgstr "VeÄ strani ..." #: ../gtk/data/OutputEditorHOCR.ui.h:1 ../qt/src/hocr/OutputEditorHOCR.cc:580 msgid "Add Word" msgstr "" #: ../gtk/data/OutputEditorHOCR.ui.h:4 ../qt/src/hocr/OutputEditorHOCR.cc:580 #, fuzzy msgid "Enter word:" msgstr "Prezri besedo" #: ../gtk/data/OutputEditorHOCR.ui.h:5 ../qt/src/hocr/Ui_OutputEditorHOCR.hh:61 #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:62 #, fuzzy msgid "Export to plain text" msgstr "Izvozi v PDF" #: ../gtk/data/OutputEditorHOCR.ui.h:6 ../qt/src/hocr/Ui_OutputEditorHOCR.hh:64 #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:65 msgid "Export to PDF" msgstr "Izvozi v PDF" #: ../gtk/data/OutputEditorHOCR.ui.h:7 ../qt/src/hocr/Ui_OutputEditorHOCR.hh:67 #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:68 #, fuzzy msgid "Export to ODT" msgstr "Izvozi v PDF" #: ../gtk/data/OutputEditorHOCR.ui.h:8 ../gtk/data/OutputEditorText.ui.h:18 #: ../qt/src/Ui_OutputEditorText.hh:116 msgid "Save output" msgstr "Shrani rezultat" #: ../gtk/data/OutputEditorHOCR.ui.h:9 ../qt/src/hocr/Ui_OutputEditorHOCR.hh:72 #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:73 #, fuzzy msgid "Export" msgstr "Izvoz v PDF" #: ../gtk/data/OutputEditorHOCR.ui.h:10 ../gtk/data/OutputEditorText.ui.h:19 #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:77 #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:78 #: ../qt/src/Ui_OutputEditorText.hh:118 msgid "Clear output" msgstr "PoÄisti rezultat" #: ../gtk/data/OutputEditorHOCR.ui.h:11 ../gtk/data/OutputEditorText.ui.h:15 #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:80 #: ../qt/src/Ui_OutputEditorText.hh:107 msgid "Find and replace" msgstr "Najdi in zamenjaj" #: ../gtk/data/OutputEditorHOCR.ui.h:12 #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:82 #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:83 msgid "Show confidence values" msgstr "" #: ../gtk/data/OutputEditorHOCR.ui.h:13 ../gtk/data/PdfExportDialog.ui.h:41 #: ../qt/data/PdfExportDialog.ui.h:2 ../qt/src/hocr/Ui_OutputEditorHOCR.hh:85 #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:86 msgid "Show preview" msgstr "Pokaži predogled" #: ../gtk/data/OutputEditorHOCR.ui.h:14 #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:121 msgid "Next (F3)" msgstr "" #: ../gtk/data/OutputEditorHOCR.ui.h:15 #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:122 msgid "Previous (Shift+F3)" msgstr "" #: ../gtk/data/OutputEditorHOCR.ui.h:16 ../gtk/src/hocr/OutputEditorHOCR.cc:890 #: ../qt/src/hocr/OutputEditorHOCR.cc:730 #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:126 msgid "Expand all" msgstr "RazÅ¡iri" #: ../gtk/data/OutputEditorHOCR.ui.h:17 ../gtk/src/hocr/OutputEditorHOCR.cc:893 #: ../qt/src/hocr/OutputEditorHOCR.cc:731 #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:127 msgid "Collapse all" msgstr "Zloži" #: ../gtk/data/OutputEditorHOCR.ui.h:18 #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:148 msgid "Properties" msgstr "Lastnosti" #: ../gtk/data/OutputEditorHOCR.ui.h:19 #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:152 msgid "Source" msgstr "Vir" #. Output insert mode #: ../gtk/data/OutputEditorText.ui.h:1 ../qt/src/Ui_OutputEditorText.hh:52 msgid "Append to current text" msgstr "Pripni pod trenutno besedilo" #: ../gtk/data/OutputEditorText.ui.h:2 ../qt/src/Ui_OutputEditorText.hh:53 msgid "Insert at cursor" msgstr "Dodaj pri kazalki" #: ../gtk/data/OutputEditorText.ui.h:3 ../qt/src/Ui_OutputEditorText.hh:54 msgid "Replace current text" msgstr "Zamenjaj trenutno besedilo" #. Output postprocessing #: ../gtk/data/OutputEditorText.ui.h:4 ../qt/src/Ui_OutputEditorText.hh:62 msgid "Keep line break if..." msgstr "Ohrani prelom vrstice, Äe ..." #: ../gtk/data/OutputEditorText.ui.h:5 ../qt/src/Ui_OutputEditorText.hh:64 msgid "Preceded by end mark (.?!)" msgstr "sledi loÄilu (.?!)" #: ../gtk/data/OutputEditorText.ui.h:6 ../qt/src/Ui_OutputEditorText.hh:66 msgid "Preceded or succeeded by quote" msgstr "je pred narekovajem ali za njim" #: ../gtk/data/OutputEditorText.ui.h:7 ../qt/src/Ui_OutputEditorText.hh:68 msgid "Other options" msgstr "Druge možnosti" #: ../gtk/data/OutputEditorText.ui.h:8 ../qt/src/Ui_OutputEditorText.hh:70 msgid "Join hyphenated words" msgstr "Združi deljene besede" #: ../gtk/data/OutputEditorText.ui.h:9 ../qt/src/Ui_OutputEditorText.hh:72 msgid "Collapse whitespace" msgstr "Strni presledke" #: ../gtk/data/OutputEditorText.ui.h:10 ../qt/src/Ui_OutputEditorText.hh:74 msgid "Preserve paragraphs" msgstr "Ohrani odstavke" #: ../gtk/data/OutputEditorText.ui.h:11 ../qt/src/Ui_OutputEditorText.hh:76 msgid "Visual aids" msgstr "Vidni pripomoÄki" #: ../gtk/data/OutputEditorText.ui.h:12 ../qt/src/Ui_OutputEditorText.hh:78 msgid "Draw whitespace" msgstr "Pokaži presledke" #: ../gtk/data/OutputEditorText.ui.h:14 ../qt/src/Ui_OutputEditorText.hh:102 msgid "Strip line breaks on selected text" msgstr "Odstrani prelome vrstic v izbranem besedilu" #: ../gtk/data/OutputEditorText.ui.h:16 ../qt/src/Ui_OutputEditorText.hh:109 #: ../qt/src/Ui_OutputEditorText.hh:110 msgid "Undo" msgstr "Razveljavi" #: ../gtk/data/OutputEditorText.ui.h:17 ../qt/src/Ui_OutputEditorText.hh:112 #: ../qt/src/Ui_OutputEditorText.hh:113 msgid "Redo" msgstr "Obnovi" #: ../gtk/data/PdfExportDialog.ui.h:1 ../qt/data/PdfExportDialog.ui.h:1 msgid "PDF Export" msgstr "Izvoz v PDF" #: ../gtk/data/PdfExportDialog.ui.h:4 ../qt/data/PdfExportDialog.ui.h:4 msgid "Output mode:" msgstr "Vrsta izpisa:" #: ../gtk/data/PdfExportDialog.ui.h:5 ../qt/data/PdfExportDialog.ui.h:6 msgid "PDF" msgstr "PDF" #: ../gtk/data/PdfExportDialog.ui.h:6 ../qt/data/PdfExportDialog.ui.h:7 msgid "PDF with invisible text overlay" msgstr "PDF z nevidno plastjo besedila" #: ../gtk/data/PdfExportDialog.ui.h:7 ../qt/data/PdfExportDialog.ui.h:16 msgid "Format:" msgstr "Vrsta:" #: ../gtk/data/PdfExportDialog.ui.h:8 ../qt/data/PdfExportDialog.ui.h:17 msgid "Compression:" msgstr "Stiskanje:" #: ../gtk/data/PdfExportDialog.ui.h:9 ../qt/data/PdfExportDialog.ui.h:14 msgid "Compression quality:" msgstr "Kakovost stiskanja:" #: ../gtk/data/PdfExportDialog.ui.h:10 ../qt/data/PdfExportDialog.ui.h:15 msgid "DPI:" msgstr "DPI:" #: ../gtk/data/PdfExportDialog.ui.h:11 ../qt/data/PdfExportDialog.ui.h:18 msgid "Dithering algorithm:" msgstr "Algoritem razprÅ¡evanja:" #: ../gtk/data/PdfExportDialog.ui.h:12 ../qt/data/PdfExportDialog.ui.h:13 msgid "Image settings:" msgstr "Nastavitve slike:" #: ../gtk/data/PdfExportDialog.ui.h:13 ../qt/data/PdfExportDialog.ui.h:25 msgid "Uniformize line and word spacing" msgstr "Poenoti razdalje med vrsticami in besedami" #: ../gtk/data/PdfExportDialog.ui.h:14 ../qt/data/PdfExportDialog.ui.h:21 msgid "Override font family:" msgstr "" #: ../gtk/data/PdfExportDialog.ui.h:15 ../qt/data/PdfExportDialog.ui.h:27 msgid "Fallback font family:" msgstr "" #: ../gtk/data/PdfExportDialog.ui.h:16 ../qt/data/PdfExportDialog.ui.h:20 #, fuzzy msgid "Override font size:" msgstr "Uporabi zaznane velikosti pisave" #: ../gtk/data/PdfExportDialog.ui.h:17 ../qt/data/PdfExportDialog.ui.h:23 msgid "Font scaling:" msgstr "" #: ../gtk/data/PdfExportDialog.ui.h:18 ../qt/data/PdfExportDialog.ui.h:26 msgid "pt" msgstr "" #: ../gtk/data/PdfExportDialog.ui.h:19 ../qt/data/PdfExportDialog.ui.h:22 msgid "Preserve spaces wider than:" msgstr "Ohrani presledke, Å¡irÅ¡e kot:" #: ../gtk/data/PdfExportDialog.ui.h:20 ../qt/data/PdfExportDialog.ui.h:24 msgid "characters" msgstr "znakov" #: ../gtk/data/PdfExportDialog.ui.h:21 ../qt/data/PdfExportDialog.ui.h:28 msgid "Sanitize hyphens before line breaks" msgstr "" #: ../gtk/data/PdfExportDialog.ui.h:22 ../qt/data/PdfExportDialog.ui.h:19 msgid "Text settings:" msgstr "Nastavitve besedila:" #: ../gtk/data/PdfExportDialog.ui.h:23 ../qt/data/PdfExportDialog.ui.h:10 msgid "Paper size:" msgstr "" #: ../gtk/data/PdfExportDialog.ui.h:24 ../qt/data/PdfExportDialog.ui.h:11 msgid "Width" msgstr "" #: ../gtk/data/PdfExportDialog.ui.h:25 ../qt/data/PdfExportDialog.ui.h:12 msgid "Height" msgstr "" #: ../gtk/data/PdfExportDialog.ui.h:26 ../qt/data/PdfExportDialog.ui.h:29 msgid "Treat image sources as having true DPI:" msgstr "" #: ../gtk/data/PdfExportDialog.ui.h:27 ../qt/data/PdfExportDialog.ui.h:3 msgid "Basic" msgstr "" #: ../gtk/data/PdfExportDialog.ui.h:28 ../qt/data/PdfExportDialog.ui.h:31 #, fuzzy msgid "PDF version:" msgstr "Nova razliÄica" #: ../gtk/data/PdfExportDialog.ui.h:29 ../qt/data/PdfExportDialog.ui.h:33 msgid "Password:" msgstr "" #: ../gtk/data/PdfExportDialog.ui.h:30 ../qt/data/PdfExportDialog.ui.h:34 msgid "Confirm password:" msgstr "" #: ../gtk/data/PdfExportDialog.ui.h:31 ../qt/data/PdfExportDialog.ui.h:32 msgid "Encryption (optional):" msgstr "" #: ../gtk/data/PdfExportDialog.ui.h:32 ../qt/data/PdfExportDialog.ui.h:36 msgid "Author:" msgstr "" #: ../gtk/data/PdfExportDialog.ui.h:33 ../qt/data/PdfExportDialog.ui.h:38 msgid "Title:" msgstr "" #: ../gtk/data/PdfExportDialog.ui.h:34 ../qt/data/PdfExportDialog.ui.h:40 msgid "Subject:" msgstr "" #: ../gtk/data/PdfExportDialog.ui.h:35 ../qt/data/PdfExportDialog.ui.h:37 msgid "Creator:" msgstr "" #: ../gtk/data/PdfExportDialog.ui.h:36 ../qt/data/PdfExportDialog.ui.h:39 msgid "Producer:" msgstr "" #: ../gtk/data/PdfExportDialog.ui.h:37 ../qt/data/PdfExportDialog.ui.h:41 msgid "Keywords:" msgstr "" #: ../gtk/data/PdfExportDialog.ui.h:38 ../qt/data/PdfExportDialog.ui.h:35 #, fuzzy msgid "Additional information (optional):" msgstr "Dodatne nastavitve jezika:" #: ../gtk/data/PdfExportDialog.ui.h:39 ../qt/data/PdfExportDialog.ui.h:42 msgid "Import from current source" msgstr "" #: ../gtk/data/PdfExportDialog.ui.h:40 ../qt/data/PdfExportDialog.ui.h:30 msgid "Advanced" msgstr "" #: ../gtk/data/SearchReplaceFrame.ui.h:1 ../qt/data/SearchReplaceFrame.ui.h:4 msgid "Find" msgstr "Najdi" #: ../gtk/data/SearchReplaceFrame.ui.h:2 ../qt/data/SearchReplaceFrame.ui.h:2 msgid "Replace" msgstr "Zamenjaj" #: ../gtk/data/SearchReplaceFrame.ui.h:3 ../qt/data/SearchReplaceFrame.ui.h:3 msgid "Replace all" msgstr "Zamenjaj vse" #: ../gtk/data/SearchReplaceFrame.ui.h:4 ../qt/data/SearchReplaceFrame.ui.h:5 msgid "Find previous" msgstr "Najdi predhodno" #: ../gtk/data/SearchReplaceFrame.ui.h:5 ../qt/data/SearchReplaceFrame.ui.h:6 msgid "Find next" msgstr "Najdi naslednje" #: ../gtk/data/SearchReplaceFrame.ui.h:6 ../qt/data/SearchReplaceFrame.ui.h:7 msgid "Match case" msgstr "UpoÅ¡tevaj velikost" #: ../gtk/data/SearchReplaceFrame.ui.h:7 #: ../gtk/data/SubstitutionsManager.ui.h:1 ../qt/data/SearchReplaceFrame.ui.h:1 #: ../qt/src/SubstitutionsManager.cc:36 msgid "Substitutions" msgstr "Zamenjave" #: ../gtk/data/SelectionMenu.ui.h:1 ../qt/src/DisplayerToolSelect.cc:239 msgid "Delete" msgstr "ZbriÅ¡i" #: ../gtk/data/SelectionMenu.ui.h:2 ../qt/src/DisplayerToolSelect.cc:225 msgid "Order:" msgstr "Vrstni red:" #: ../gtk/data/SelectionMenu.ui.h:3 ../gtk/src/hocr/DisplayerToolHOCR.cc:29 #: ../qt/src/DisplayerToolSelect.cc:240 ../qt/src/hocr/DisplayerToolHOCR.cc:31 msgid "Recognize" msgstr "Prepoznaj" #: ../gtk/data/SelectionMenu.ui.h:4 ../qt/src/DisplayerToolSelect.cc:241 msgid "Recognize to clipboard" msgstr "Prepoznaj na odložiÅ¡Äe" #: ../gtk/data/SelectionMenu.ui.h:5 ../qt/src/DisplayerToolSelect.cc:242 msgid "Save as image" msgstr "Shrani kot sliko" #: ../gtk/data/SubstitutionsManager.ui.h:2 ../qt/src/SubstitutionsManager.cc:38 #: ../qt/src/SubstitutionsManager.cc:39 msgid "Open" msgstr "Odpri" #: ../gtk/data/SubstitutionsManager.ui.h:3 ../gtk/src/Utils.cc:73 #: ../qt/src/SubstitutionsManager.cc:41 ../qt/src/SubstitutionsManager.cc:42 msgid "Save" msgstr "Shrani" #: ../gtk/data/SubstitutionsManager.ui.h:4 ../qt/src/SubstitutionsManager.cc:44 #: ../qt/src/SubstitutionsManager.cc:45 msgid "Clear" msgstr "PoÄisti" #: ../gtk/data/SubstitutionsManager.ui.h:5 ../qt/data/ConfigDialog.ui.h:16 #: ../qt/src/SubstitutionsManager.cc:47 ../qt/src/SubstitutionsManager.cc:48 msgid "Add" msgstr "Dodaj" #: ../gtk/data/SubstitutionsManager.ui.h:6 #: ../gtk/src/hocr/OutputEditorHOCR.cc:886 ../qt/data/ConfigDialog.ui.h:17 #: ../qt/src/hocr/OutputEditorHOCR.cc:727 ../qt/src/SubstitutionsManager.cc:50 #: ../qt/src/SubstitutionsManager.cc:51 msgid "Remove" msgstr "Odstrani" #: ../gtk/data/SubstitutionsManager.ui.h:7 ../gtk/data/TessdataManager.ui.h:2 msgid "Apply" msgstr "Uporabi" #: ../gtk/data/SubstitutionsManager.ui.h:8 ../gtk/data/TessdataManager.ui.h:3 msgid "Close" msgstr "Zapri" #: ../gtk/data/TessdataManager.ui.h:1 ../qt/src/TessdataManager.cc:49 msgid "Tessdata Manager" msgstr "Upravljalnik Tessdata" #: ../gtk/data/TessdataManager.ui.h:5 ../qt/src/TessdataManager.cc:51 msgid "Manage installed languages:" msgstr "Upravljaj nameÅ¡Äene jezike:" #: ../gtk/src/Acquirer.cc:79 ../qt/src/Acquirer.cc:70 msgid "scan.png" msgstr "scan.png" #: ../gtk/src/Acquirer.cc:91 ../qt/src/Acquirer.cc:85 msgid "Images" msgstr "Slike" #: ../gtk/src/Acquirer.cc:92 ../qt/src/Acquirer.cc:86 msgid "Choose Output Filename..." msgstr "Izberite ime datoteke za rezultat ..." #: ../gtk/src/Acquirer.cc:106 ../qt/src/Acquirer.cc:100 msgid "Failed to initialize the scanning backend." msgstr "Prednastavljanje zaledja obtiÄnega branja spodletelo." #: ../gtk/src/Acquirer.cc:115 ../qt/src/Acquirer.cc:106 msgid "Scan failed" msgstr "OptiÄno branje spodletelo" #: ../gtk/src/Acquirer.cc:133 ../qt/src/Acquirer.cc:122 msgid "No scanners were detected." msgstr "Ni zaznanega obtiÄnega bralnika." #: ../gtk/src/Acquirer.cc:150 ../gtk/src/Acquirer.cc:168 #: ../qt/src/Acquirer.cc:136 ../qt/src/Acquirer.cc:154 msgid "Starting scan..." msgstr "ZaÄenjanje branja ..." #: ../gtk/src/Acquirer.cc:164 ../qt/src/Acquirer.cc:150 msgid "Opening device..." msgstr "Odpiranje naprave ..." #: ../gtk/src/Acquirer.cc:166 ../qt/src/Acquirer.cc:152 msgid "Setting options..." msgstr "Nastavljanje možnosti ..." #: ../gtk/src/Acquirer.cc:170 ../qt/src/Acquirer.cc:156 msgid "Getting parameters..." msgstr "Pridobivanje nastavitev ..." #: ../gtk/src/Acquirer.cc:172 ../qt/src/Acquirer.cc:158 msgid "Transferring data..." msgstr "PrenaÅ¡anje podatkov ..." #: ../gtk/src/Acquirer.cc:179 ../qt/src/Acquirer.cc:165 msgid "Canceling scan..." msgstr "Preklicevanje branja ..." #: ../gtk/src/Config.cc:49 ../qt/data/ConfigDialog.ui.h:7 msgid "Filename prefix" msgstr "Predpona imena datoteke" #: ../gtk/src/Config.cc:50 ../qt/data/ConfigDialog.ui.h:8 msgid "Code" msgstr "Koda" #: ../gtk/src/Config.cc:51 ../qt/data/ConfigDialog.ui.h:9 msgid "Native name" msgstr "Izvorno ime" #: ../gtk/src/Config.cc:109 ../qt/src/Config.cc:108 msgid "Script" msgstr "" #: ../gtk/src/CrashHandler.cc:25 ../gtk/src/CrashHandler.cc:41 #: ../qt/src/CrashHandler.cc:36 msgid "Crash Handler" msgstr "Upravljalnik sesutij" #: ../gtk/src/CrashHandler.cc:43 ../qt/src/CrashHandler.cc:31 msgid "Your work has been saved under %1." msgstr "VaÅ¡e delo je bilo shranjeno pod %1." #: ../gtk/src/CrashHandler.cc:45 ../qt/src/CrashHandler.cc:33 msgid "There was no unsaved work." msgstr "Neshranjenega dela ni." #: ../gtk/src/CrashHandler.cc:106 ../qt/src/CrashHandler.cc:62 msgid "Failed to obtain backtrace. Is gdb installed?" msgstr "Pridobivanje povratnega sledenja spodletelo. Je gdb nameÅ¡Äen?" #: ../gtk/src/Displayer.cc:232 ../qt/src/Displayer.cc:174 msgid "Failed to load image" msgstr "Nalaganje slike spodletelo" #: ../gtk/src/Displayer.cc:232 ../qt/src/Displayer.cc:174 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:138 ../qt/src/DisplayerToolSelect.cc:135 msgid "PNG Images" msgstr "Slike PNG" #: ../gtk/src/DisplayerToolSelect.cc:139 ../qt/src/DisplayerToolSelect.cc:135 msgid "Save Selection Image" msgstr "Shrani sliko izbora" #: ../gtk/src/DisplayerToolSelect.cc:139 ../qt/src/DisplayerToolSelect.cc:135 msgid "selection.png" msgstr "izbor.png" #: ../gtk/src/DisplayerToolSelect.cc:146 ../qt/src/DisplayerToolSelect.cc:142 msgid "Recognize all" msgstr "Prepoznaj vse" #: ../gtk/src/DisplayerToolSelect.cc:146 ../qt/src/DisplayerToolSelect.cc:142 msgid "Recognize selection" msgstr "Prepoznaj izbor" #: ../gtk/src/DisplayerToolSelect.cc:186 ../qt/src/DisplayerToolSelect.cc:182 msgid "Performing layout analysis" msgstr "Analiziranje razporeditve" #: ../gtk/src/FileDialogs.cc:235 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:237 msgid "Overwrite File?" msgstr "Naj bo datoteka prepisana?" #: ../gtk/src/hocr/HOCRDocument.cc:611 ../gtk/src/hocr/OutputEditorHOCR.cc:266 #: ../qt/src/hocr/OutputEditorHOCR.cc:229 #, fuzzy msgid "Page" msgstr "Stran: %1" #: ../gtk/src/hocr/HOCRDocument.cc:613 ../qt/src/hocr/HOCRDocument.cc:530 #, fuzzy msgid "Text block" msgstr "Besedilne datoteke" #: ../gtk/src/hocr/HOCRDocument.cc:615 ../gtk/src/hocr/OutputEditorHOCR.cc:272 #: ../qt/src/hocr/HOCRDocument.cc:532 ../qt/src/hocr/OutputEditorHOCR.cc:231 msgid "Paragraph" msgstr "Odstavek" #: ../gtk/src/hocr/HOCRDocument.cc:617 ../qt/src/hocr/HOCRDocument.cc:534 msgid "Textline" msgstr "Vrstica" #: ../gtk/src/hocr/HOCRDocument.cc:621 ../qt/src/hocr/HOCRDocument.cc:538 msgid "Graphic" msgstr "Grafika" #: ../gtk/src/hocr/HOCROdtExporter.cc:65 ../gtk/src/hocr/HOCRPdfExporter.cc:489 #: ../gtk/src/hocr/HOCRTextExporter.cc:34 #: ../gtk/src/hocr/OutputEditorHOCR.cc:963 ../gtk/src/OutputEditorText.cc:272 #: ../qt/src/hocr/HOCROdtExporter.cc:50 ../qt/src/hocr/HOCRPdfExporter.cc:478 #: ../qt/src/hocr/HOCRTextExporter.cc:36 ../qt/src/hocr/OutputEditorHOCR.cc:830 #: ../qt/src/OutputEditorText.cc:238 msgid "output" msgstr "rezultat" #: ../gtk/src/hocr/HOCROdtExporter.cc:68 ../qt/src/hocr/HOCROdtExporter.cc:53 msgid "OpenDocument Text Documents" msgstr "" #: ../gtk/src/hocr/HOCROdtExporter.cc:69 ../qt/src/hocr/HOCROdtExporter.cc:53 #, fuzzy msgid "Save ODT Output..." msgstr "Shrani rezultat PDF ..." #: ../gtk/src/hocr/HOCROdtExporter.cc:77 ../gtk/src/hocr/HOCROdtExporter.cc:342 #: ../gtk/src/hocr/HOCRPdfExporter.cc:619 #: ../gtk/src/hocr/HOCRTextExporter.cc:46 ../qt/src/hocr/HOCROdtExporter.cc:61 #: ../qt/src/hocr/HOCRPdfExporter.cc:609 ../qt/src/hocr/HOCRTextExporter.cc:47 msgid "Export failed" msgstr "" #: ../gtk/src/hocr/HOCROdtExporter.cc:77 ../gtk/src/hocr/HOCROdtExporter.cc:342 #: ../qt/src/hocr/HOCROdtExporter.cc:61 msgid "The ODT export failed: unable to write output file." msgstr "" #: ../gtk/src/hocr/HOCROdtExporter.cc:336 ../qt/src/hocr/HOCROdtExporter.cc:254 #, fuzzy msgid "Exporting to ODT..." msgstr "Izvozi v PDF" #: ../gtk/src/hocr/HOCRPdfExporter.cc:283 ../qt/src/hocr/HOCRPdfExporter.cc:365 #, fuzzy msgid "Same as source" msgstr "Vir" #: ../gtk/src/hocr/HOCRPdfExporter.cc:286 ../qt/src/hocr/HOCRPdfExporter.cc:366 msgid "Custom" msgstr "" #: ../gtk/src/hocr/HOCRPdfExporter.cc:300 ../qt/src/hocr/HOCRPdfExporter.cc:362 msgid "cm" msgstr "" #: ../gtk/src/hocr/HOCRPdfExporter.cc:303 ../qt/src/hocr/HOCRPdfExporter.cc:363 #, fuzzy msgid "in" msgstr "Najdi" #: ../gtk/src/hocr/HOCRPdfExporter.cc:319 ../qt/src/hocr/HOCRPdfExporter.cc:353 msgid "Monochrome" msgstr "Enobarvno" #: ../gtk/src/hocr/HOCRPdfExporter.cc:328 ../qt/src/hocr/HOCRPdfExporter.cc:355 msgid "Threshold (closest color)" msgstr "Prag (najbližja barva)" #: ../gtk/src/hocr/HOCRPdfExporter.cc:331 ../qt/src/hocr/HOCRPdfExporter.cc:356 msgid "Diffuse" msgstr "Difuzno" #: ../gtk/src/hocr/HOCRPdfExporter.cc:340 ../qt/src/hocr/HOCRPdfExporter.cc:357 msgid "Zip (lossless)" msgstr "Zip (brezizgubno)" #: ../gtk/src/hocr/HOCRPdfExporter.cc:344 ../qt/src/hocr/HOCRPdfExporter.cc:358 msgid "CCITT Group 4 (lossless)" msgstr "CCITT Group 4 (brezizgubno)" #: ../gtk/src/hocr/HOCRPdfExporter.cc:348 ../qt/src/hocr/HOCRPdfExporter.cc:359 msgid "Jpeg (lossy)" msgstr "Jpeg (izgubno)" #: ../gtk/src/hocr/HOCRPdfExporter.cc:493 ../qt/src/hocr/HOCRPdfExporter.cc:482 msgid "PDF Files" msgstr "Datoteke PDF" #: ../gtk/src/hocr/HOCRPdfExporter.cc:494 ../qt/src/hocr/HOCRPdfExporter.cc:482 msgid "Save PDF Output..." msgstr "Shrani rezultat PDF ..." #: ../gtk/src/hocr/HOCRPdfExporter.cc:500 ../qt/src/hocr/HOCRPdfExporter.cc:488 #, fuzzy msgid "Invalid Output" msgstr "Shrani rezultat" #: ../gtk/src/hocr/HOCRPdfExporter.cc:500 ../qt/src/hocr/HOCRPdfExporter.cc:488 msgid "Cannot overwrite a file which is a source image of this document." msgstr "" #: ../gtk/src/hocr/HOCRPdfExporter.cc:516 ../qt/src/hocr/HOCRPdfExporter.cc:511 #, fuzzy msgid "Failed to create output" msgstr "Shranjevanje rezultata spodletelo" #: ../gtk/src/hocr/HOCRPdfExporter.cc:516 ../qt/src/hocr/HOCRPdfExporter.cc:511 msgid "Failed to create output. The returned error was: %1" msgstr "" #: ../gtk/src/hocr/HOCRPdfExporter.cc:558 ../qt/src/hocr/HOCRPdfExporter.cc:551 msgid "The operation was cancelled" msgstr "" #: ../gtk/src/hocr/HOCRPdfExporter.cc:607 ../qt/src/hocr/HOCRPdfExporter.cc:597 #, fuzzy msgid "Failed to render page %1" msgstr "" "\n" "[Prepoznavanje strani %1 spodletelo]\n" #: ../gtk/src/hocr/HOCRPdfExporter.cc:614 ../qt/src/hocr/HOCRPdfExporter.cc:604 #, fuzzy msgid "Exporting to PDF..." msgstr "Izvozi v PDF" #: ../gtk/src/hocr/HOCRPdfExporter.cc:619 ../qt/src/hocr/HOCRPdfExporter.cc:609 msgid "The PDF export failed: %1." msgstr "" #: ../gtk/src/hocr/HOCRPdfExporter.cc:673 ../qt/src/hocr/HOCRPdfExporter.cc:662 #, fuzzy msgid "The PDF library could not load the font '%1'." msgstr "Knjižnica PDF ne podpira izbrane pisave." #: ../gtk/src/hocr/HOCRTextExporter.cc:37 ../gtk/src/OutputEditorText.cc:274 #: ../qt/src/hocr/HOCRTextExporter.cc:39 ../qt/src/OutputEditorText.cc:239 msgid "Text Files" msgstr "Besedilne datoteke" #: ../gtk/src/hocr/HOCRTextExporter.cc:38 ../qt/src/hocr/HOCRTextExporter.cc:39 #, fuzzy msgid "Save Text Output..." msgstr "Shrani rezultat ..." #: ../gtk/src/hocr/HOCRTextExporter.cc:46 ../qt/src/hocr/HOCRTextExporter.cc:47 msgid "The text export failed: unable to write output file." msgstr "" #: ../gtk/src/hocr/OutputEditorHOCR.cc:269 #: ../qt/src/hocr/OutputEditorHOCR.cc:230 msgid "Block" msgstr "" #: ../gtk/src/hocr/OutputEditorHOCR.cc:275 #: ../qt/src/hocr/OutputEditorHOCR.cc:232 msgid "Line" msgstr "" #: ../gtk/src/hocr/OutputEditorHOCR.cc:278 #: ../qt/src/hocr/OutputEditorHOCR.cc:233 msgid "Word" msgstr "" #: ../gtk/src/hocr/OutputEditorHOCR.cc:281 #: ../qt/src/hocr/OutputEditorHOCR.cc:234 msgid "Misspelled word" msgstr "" #: ../gtk/src/hocr/OutputEditorHOCR.cc:435 #: ../qt/src/hocr/OutputEditorHOCR.cc:317 msgid "" "The following pages could not be processed:\n" "%1" msgstr "" "Naslednjih strani ni bilo mogoÄe obdelati:\n" "%1" #: ../gtk/src/hocr/OutputEditorHOCR.cc:436 #: ../qt/src/hocr/OutputEditorHOCR.cc:318 msgid "Recognition errors" msgstr "Napake pri prepoznavanju" #: ../gtk/src/hocr/OutputEditorHOCR.cc:594 #: ../qt/src/hocr/OutputEditorHOCR.cc:500 #: ../qt/src/hocr/OutputEditorHOCR.cc:512 #, fuzzy msgid "Multiple values" msgstr "VeÄ virov" #. Merging allowed #: ../gtk/src/hocr/OutputEditorHOCR.cc:778 #: ../qt/src/hocr/OutputEditorHOCR.cc:641 msgid "Merge" msgstr "Združi" #: ../gtk/src/hocr/OutputEditorHOCR.cc:786 #: ../gtk/src/hocr/OutputEditorHOCR.cc:877 #: ../qt/src/hocr/OutputEditorHOCR.cc:643 #: ../qt/src/hocr/OutputEditorHOCR.cc:725 msgid "Split from parent" msgstr "" #. Swapping allowed #: ../gtk/src/hocr/OutputEditorHOCR.cc:797 #: ../qt/src/hocr/OutputEditorHOCR.cc:647 msgid "Swap" msgstr "" #: ../gtk/src/hocr/OutputEditorHOCR.cc:821 #: ../qt/src/hocr/OutputEditorHOCR.cc:693 msgid "Add graphic region" msgstr "Dodaj podroÄje grafike" #: ../gtk/src/hocr/OutputEditorHOCR.cc:824 #: ../qt/src/hocr/OutputEditorHOCR.cc:694 msgid "Add text block" msgstr "" #: ../gtk/src/hocr/OutputEditorHOCR.cc:828 #: ../qt/src/hocr/OutputEditorHOCR.cc:696 #, fuzzy msgid "Add paragraph" msgstr "Odstavek" #: ../gtk/src/hocr/OutputEditorHOCR.cc:832 #: ../qt/src/hocr/OutputEditorHOCR.cc:698 #, fuzzy msgid "Add line" msgstr "Dodaj slike" #: ../gtk/src/hocr/OutputEditorHOCR.cc:836 #: ../qt/src/hocr/OutputEditorHOCR.cc:700 msgid "Add word" msgstr "" #: ../gtk/src/hocr/OutputEditorHOCR.cc:852 #: ../qt/src/hocr/OutputEditorHOCR.cc:710 msgid "No suggestions" msgstr "Ni predlogov" #: ../gtk/src/hocr/OutputEditorHOCR.cc:858 #: ../qt/src/hocr/OutputEditorHOCR.cc:714 msgid "Add to dictionary" msgstr "Dodaj v slovar" #: ../gtk/src/hocr/OutputEditorHOCR.cc:864 #: ../qt/src/hocr/OutputEditorHOCR.cc:716 msgid "Ignore word" msgstr "Prezri besedo" #: ../gtk/src/hocr/OutputEditorHOCR.cc:926 #: ../gtk/src/hocr/OutputEditorHOCR.cc:965 #: ../qt/src/hocr/OutputEditorHOCR.cc:795 #: ../qt/src/hocr/OutputEditorHOCR.cc:832 msgid "hOCR HTML Files" msgstr "Datoteke hOCR HTML" #: ../gtk/src/hocr/OutputEditorHOCR.cc:927 #: ../qt/src/hocr/OutputEditorHOCR.cc:795 msgid "Open hOCR File" msgstr "Odpri datoteko hOCR" #: ../gtk/src/hocr/OutputEditorHOCR.cc:936 #: ../qt/src/hocr/OutputEditorHOCR.cc:802 msgid "Failed to open file" msgstr "Odpiranje datoteke spodletelo" #: ../gtk/src/hocr/OutputEditorHOCR.cc:936 #: ../qt/src/hocr/OutputEditorHOCR.cc:802 msgid "The file could not be opened: %1." msgstr "Datoteke ni bilo mogoÄe odpreti: %1." #: ../gtk/src/hocr/OutputEditorHOCR.cc:945 #: ../qt/src/hocr/OutputEditorHOCR.cc:809 msgid "Invalid hOCR file" msgstr "Neveljavna datoteka hOCR" #: ../gtk/src/hocr/OutputEditorHOCR.cc:945 #: ../qt/src/hocr/OutputEditorHOCR.cc:809 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/hocr/OutputEditorHOCR.cc:966 #: ../qt/src/hocr/OutputEditorHOCR.cc:832 msgid "Save hOCR Output..." msgstr "Shrani rezultat hOCR ..." #: ../gtk/src/hocr/OutputEditorHOCR.cc:973 ../gtk/src/OutputEditorText.cc:282 #: ../qt/src/hocr/OutputEditorHOCR.cc:839 ../qt/src/OutputEditorText.cc:246 msgid "Failed to save output" msgstr "Shranjevanje rezultata spodletelo" #: ../gtk/src/hocr/OutputEditorHOCR.cc:973 ../gtk/src/OutputEditorText.cc:282 #: ../qt/src/hocr/OutputEditorHOCR.cc:839 ../qt/src/OutputEditorText.cc:246 msgid "Check that you have writing permissions in the selected folder." msgstr "Preverite, Äe imate v izbrani mapi pravico pisanja." #: ../gtk/src/hocr/OutputEditorHOCR.cc:1035 ../gtk/src/OutputEditorText.cc:296 #: ../qt/src/hocr/OutputEditorHOCR.cc:894 ../qt/src/OutputEditorText.cc:259 msgid "Output not saved" msgstr "Rezultat ni bil shranjen" #: ../gtk/src/hocr/OutputEditorHOCR.cc:1035 ../gtk/src/OutputEditorText.cc:296 #: ../qt/src/hocr/OutputEditorHOCR.cc:894 ../qt/src/OutputEditorText.cc:259 msgid "Save output before proceeding?" msgstr "Ali naj se pred nadaljevanjem shrani rezultat?" #: ../gtk/src/hocr/OutputEditorHOCR.cc:1156 ../gtk/src/OutputEditorText.cc:184 #: ../qt/src/hocr/OutputEditorHOCR.cc:991 ../qt/src/OutputEditorText.cc:152 msgid "Replacing..." msgstr "Zamenjevanje ..." #: ../gtk/src/hocr/OutputEditorHOCR.cc:1181 ../gtk/src/OutputEditorText.cc:192 #: ../qt/src/hocr/OutputEditorHOCR.cc:1014 ../qt/src/OutputEditorText.cc:160 msgid "Applying substitutions..." msgstr "Uveljavljanje zamenjav ..." #: ../gtk/src/MainWindow.cc:131 ../qt/src/MainWindow.cc:295 msgid "Using tesseract" msgstr "Uporaba tesseracta" #: ../gtk/src/MainWindow.cc:178 ../qt/src/MainWindow.cc:194 msgid "Select an image to begin..." msgstr "Izberite sliko za zaÄetek ..." #: ../gtk/src/MainWindow.cc:293 ../qt/src/MainWindow.cc:278 msgid "Multiple sources" msgstr "VeÄ virov" #: ../gtk/src/MainWindow.cc:295 ../qt/src/MainWindow.cc:280 msgid "Ready" msgstr "Pripravljeno" #: ../gtk/src/MainWindow.cc:442 ../qt/src/MainWindow.cc:423 msgid "New version" msgstr "Nova razliÄica" #: ../gtk/src/MainWindow.cc:442 ../qt/src/MainWindow.cc:423 msgid "gImageReader %1 is available" msgstr "gImageReader %1 je na voljo" #: ../gtk/src/MainWindow.cc:443 ../qt/src/MainWindow.cc:424 msgid "Download" msgstr "Prejmi" #: ../gtk/src/MainWindow.cc:444 ../qt/src/MainWindow.cc:425 msgid "Changelog" msgstr "Spremembe" #: ../gtk/src/MainWindow.cc:445 ../qt/src/MainWindow.cc:426 msgid "Don't notify again" msgstr "Ne obveÅ¡Äaj veÄ" #: ../gtk/src/MainWindow.cc:466 ../qt/src/MainWindow.cc:474 msgid "Don't show again" msgstr "Ne kaži veÄ" #: ../gtk/src/MainWindow.cc:467 ../gtk/src/MainWindow.cc:480 #: ../qt/src/MainWindow.cc:475 msgid "Install" msgstr "Namesti" #: ../gtk/src/MainWindow.cc:487 ../qt/src/MainWindow.cc:487 msgid "Spelling dictionary missing" msgstr "Slovar za Ärkovanje manjka" #: ../gtk/src/MainWindow.cc:487 ../qt/src/MainWindow.cc:487 msgid "The spellcheck dictionary for %1 is not installed" msgstr "Slovar Ärkovalnika za %1 ni nameÅ¡Äen" #: ../gtk/src/MainWindow.cc:494 ../gtk/src/MainWindow.cc:523 #: ../qt/src/MainWindow.cc:493 msgid "Installing spelling dictionary for '%1'" msgstr "NameÅ¡Äanje slovarja Ärkovalnika za '%1'" #: ../gtk/src/MainWindow.cc:515 ../gtk/src/MainWindow.cc:536 #: ../gtk/src/MainWindow.cc:544 ../gtk/src/MainWindow.cc:592 #: ../gtk/src/MainWindow.cc:597 ../gtk/src/TessdataManager.cc:60 #: ../gtk/src/TessdataManager.cc:70 ../gtk/src/TessdataManager.cc:339 #: ../qt/src/MainWindow.cc:512 ../qt/src/MainWindow.cc:525 #: ../qt/src/MainWindow.cc:534 ../qt/src/MainWindow.cc:578 #: ../qt/src/MainWindow.cc:583 ../qt/src/TessdataManager.cc:74 #: ../qt/src/TessdataManager.cc:84 ../qt/src/TessdataManager.cc:315 msgid "Error" msgstr "Napaka" #: ../gtk/src/MainWindow.cc:515 ../qt/src/MainWindow.cc:512 msgid "Failed to install spelling dictionary: %1" msgstr "NameÅ¡Äanje slovarja Ärkovalnika spodletelo: %1" #: ../gtk/src/MainWindow.cc:536 ../qt/src/MainWindow.cc:525 msgid "Failed to create directory for spelling dictionaries." msgstr "Ustvarjanje imenika za slovarje Ärkovalnika je spodletelo." #: ../gtk/src/MainWindow.cc:544 ../qt/src/MainWindow.cc:534 msgid "Could not read %1: %2." msgstr "Branje %1 ni bilo možno: %2." #: ../gtk/src/MainWindow.cc:571 ../qt/src/MainWindow.cc:558 msgid "Downloading '%1'..." msgstr "Prejemanje '%1' ..." #: ../gtk/src/MainWindow.cc:592 ../qt/src/MainWindow.cc:578 msgid "" "The following dictionaries could not be downloaded:\n" "%1\n" "\n" "Check the connectivity and directory permissions.\n" "Hint: If you don't have write permissions in system folders, you can switch " "to user paths in the settings dialog." msgstr "" #: ../gtk/src/MainWindow.cc:595 ../qt/src/MainWindow.cc:581 msgid "Dictionaries installed" msgstr "Slovarji nameÅ¡Äeni" #: ../gtk/src/MainWindow.cc:595 #, fuzzy msgid "" "The following dictionaries were installed:\n" "%1" msgstr "Naslednji slovarji so bili nameÅ¡Äeni: %1" #: ../gtk/src/MainWindow.cc:597 ../qt/src/MainWindow.cc:583 msgid "No spelling dictionaries found for '%1'." msgstr "Za '%1' ni bilo možno najti slovarjev." #: ../gtk/src/OutputEditorText.cc:154 ../qt/src/OutputEditorText.cc:137 msgid "Stripping line breaks..." msgstr "Odstranjevanje prelomov vrstic ..." #: ../gtk/src/OutputEditorText.cc:162 msgid "Check spelling" msgstr "Preveri Ärkovanje" #: ../gtk/src/OutputEditorText.cc:231 ../qt/src/OutputEditorText.cc:196 msgid "File: %1" msgstr "Datoteka: %1" #: ../gtk/src/OutputEditorText.cc:234 ../qt/src/OutputEditorText.cc:199 msgid "Page: %1" msgstr "Stran: %1" #: ../gtk/src/OutputEditorText.cc:247 ../gtk/src/Recognizer.cc:471 #: ../qt/src/Recognizer.cc:462 msgid "" "\n" "[Failed to recognize page %1]\n" msgstr "" "\n" "[Prepoznavanje strani %1 spodletelo]\n" #: ../gtk/src/OutputEditorText.cc:275 ../qt/src/OutputEditorText.cc:239 msgid "Save Output..." msgstr "Shrani rezultat ..." #: ../gtk/src/Recognizer.cc:179 ../qt/src/Recognizer.cc:172 msgid "No languages available" msgstr "Nobenega jezika ni na voljo" #: ../gtk/src/Recognizer.cc:179 ../qt/src/Recognizer.cc:172 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:233 ../qt/src/Recognizer.cc:232 msgid "Multilingual" msgstr "VeÄjeziÄno" #: ../gtk/src/Recognizer.cc:285 ../qt/src/Recognizer.cc:277 msgid "Automatic page segmentation" msgstr "Samodejen razrez strani" #: ../gtk/src/Recognizer.cc:286 ../qt/src/Recognizer.cc:278 msgid "Page segmentation with orientation and script detection" msgstr "Razrez strani z odkrivanjem postavitve in pisave" #: ../gtk/src/Recognizer.cc:287 ../qt/src/Recognizer.cc:279 msgid "Assume single column of text" msgstr "Predpostavi besedilo v enem stolpcu" #: ../gtk/src/Recognizer.cc:288 ../qt/src/Recognizer.cc:280 msgid "Assume single block of vertically aligned text" msgstr "Predpostavi en blok navpiÄno poravnanega besedila" #: ../gtk/src/Recognizer.cc:289 ../qt/src/Recognizer.cc:281 msgid "Assume a single uniform block of text" msgstr "Predpostavi en sam blok enotnega besedila" #: ../gtk/src/Recognizer.cc:290 ../qt/src/Recognizer.cc:282 msgid "Assume a line of text" msgstr "Predpostavi eno vrstico besedila" #: ../gtk/src/Recognizer.cc:291 ../qt/src/Recognizer.cc:283 msgid "Assume a single word" msgstr "Predpostavi eno samo besedo" #: ../gtk/src/Recognizer.cc:292 ../qt/src/Recognizer.cc:284 msgid "Assume a single word in a circle" msgstr "Predpostavi eno besedo v krogu" #: ../gtk/src/Recognizer.cc:293 ../qt/src/Recognizer.cc:285 msgid "Sparse text in no particular order" msgstr "Redko besedilo brez posebnega reda" #: ../gtk/src/Recognizer.cc:294 ../qt/src/Recognizer.cc:286 msgid "Sparse text with orientation and script detection" msgstr "Redko besedilo z odkrivanjem postavitve in pisave" #: ../gtk/src/Recognizer.cc:309 ../qt/src/Recognizer.cc:297 msgid "Page segmentation mode" msgstr "NaÄin razreza strani" #: ../gtk/src/Recognizer.cc:313 ../qt/src/Recognizer.cc:300 msgid "Character whitelist / blacklist..." msgstr "" #: ../gtk/src/Recognizer.cc:319 ../qt/src/Recognizer.cc:305 msgid "Manage languages..." msgstr "Upravljaj z jeziki ..." #: ../gtk/src/Recognizer.cc:375 ../qt/src/Recognizer.cc:369 msgid "Current selection" msgstr "Trenutni izbor" #: ../gtk/src/Recognizer.cc:465 ../qt/src/Recognizer.cc:455 msgid "Recognizing page %1 (%2 of %3)" msgstr "Prepoznavanje strani %1 (%2 od %3)" #: ../gtk/src/Recognizer.cc:470 ../qt/src/Recognizer.cc:461 msgid "" "\n" "- Page %1: failed to render page" msgstr "" "\n" "- Stran %1: prikaz strani spodletel" #: ../gtk/src/Recognizer.cc:501 ../gtk/src/Recognizer.cc:531 #: ../gtk/src/Recognizer.cc:544 ../qt/src/Recognizer.cc:491 #: ../qt/src/Recognizer.cc:521 ../qt/src/Recognizer.cc:534 msgid "Recognizing..." msgstr "Prepoznavanje ..." #: ../gtk/src/Recognizer.cc:505 ../gtk/src/Recognizer.cc:514 #: ../qt/src/Recognizer.cc:495 ../qt/src/Recognizer.cc:504 msgid "Recognition errors occurred" msgstr "Pri prepoznavanju je priÅ¡lo do napak" #: ../gtk/src/Recognizer.cc:505 ../qt/src/Recognizer.cc:495 msgid "The following errors occurred:%1" msgstr "PriÅ¡lo je do naslednjih napak: %1" #: ../gtk/src/Recognizer.cc:514 ../qt/src/Recognizer.cc:504 msgid "Failed to initialize tesseract" msgstr "Prednastavljanje zaÄelja tesseract spodletelo" #: ../gtk/src/scanner/ScannerSane.cc:84 ../gtk/src/scanner/ScannerTwain.cc:288 #: ../qt/src/scanner/ScannerSane.cc:85 ../qt/src/scanner/ScannerTwain.cc:286 msgid "Scan canceled" msgstr "OptiÄno branje preklicano" #: ../gtk/src/scanner/ScannerSane.cc:159 ../gtk/src/scanner/ScannerTwain.cc:186 #: ../qt/src/scanner/ScannerSane.cc:159 ../qt/src/scanner/ScannerTwain.cc:178 msgid "No scanner specified" msgstr "Ni navedenih optiÄnih bralnikov" #: ../gtk/src/scanner/ScannerSane.cc:168 ../gtk/src/scanner/ScannerTwain.cc:195 #: ../qt/src/scanner/ScannerSane.cc:168 ../qt/src/scanner/ScannerTwain.cc:187 msgid "Unable to connect to scanner" msgstr "Ni povezave z optiÄnim bralnikom" #: ../gtk/src/scanner/ScannerSane.cc:403 ../gtk/src/scanner/ScannerTwain.cc:266 #: ../gtk/src/scanner/ScannerTwain.cc:292 ../qt/src/scanner/ScannerSane.cc:403 #: ../qt/src/scanner/ScannerTwain.cc:258 ../qt/src/scanner/ScannerTwain.cc:290 msgid "Unable to start scan" msgstr "Ni mogoÄe zaÄeti optiÄnega branja" #: ../gtk/src/scanner/ScannerSane.cc:411 ../gtk/src/scanner/ScannerSane.cc:461 #: ../gtk/src/scanner/ScannerTwain.cc:318 ../qt/src/scanner/ScannerSane.cc:411 #: ../qt/src/scanner/ScannerSane.cc:461 ../qt/src/scanner/ScannerTwain.cc:316 msgid "Error communicating with scanner" msgstr "Napaka pri komunikaciji z optiÄnim bralnikom" #: ../gtk/src/scanner/ScannerSane.cc:520 ../qt/src/scanner/ScannerSane.cc:517 msgid "Failed to save image" msgstr "Shranjevanje slike spodletelo" #: ../gtk/src/scanner/ScannerSane.cc:800 ../qt/src/scanner/ScannerSane.cc:797 #, fuzzy msgid "Operation is cancelled." msgstr "OptiÄno branje preklicano" #: ../gtk/src/scanner/ScannerSane.cc:802 ../qt/src/scanner/ScannerSane.cc:799 msgid "Device is busy." msgstr "" #: ../gtk/src/scanner/ScannerSane.cc:804 ../qt/src/scanner/ScannerSane.cc:801 msgid "Cover is opened." msgstr "" #: ../gtk/src/scanner/ScannerSane.cc:806 ../qt/src/scanner/ScannerSane.cc:803 msgid "Document feeder jammed." msgstr "" #: ../gtk/src/scanner/ScannerSane.cc:808 ../qt/src/scanner/ScannerSane.cc:805 msgid "Document feeder out of documents." msgstr "" #: ../gtk/src/scanner/ScannerSane.cc:810 ../qt/src/scanner/ScannerSane.cc:807 #, fuzzy msgid "Access to scanner is denied." msgstr "Ni navedenih optiÄnih bralnikov" #: ../gtk/src/SourceManager.cc:118 ../qt/src/SourceManager.cc:124 msgid "PDFs with text" msgstr "" #: ../gtk/src/SourceManager.cc:118 ../qt/src/SourceManager.cc:124 msgid "" "These PDF files already contain text:\n" "%1" msgstr "" #: ../gtk/src/SourceManager.cc:127 ../qt/src/SourceManager.cc:132 msgid "Unable to open files" msgstr "Datotek ni mogoÄe odpreti" #: ../gtk/src/SourceManager.cc:127 ../qt/src/SourceManager.cc:132 msgid "The following files could not be opened:%1" msgstr "Naslednjih datotek ni bilo mogoÄe odpreti: %1" #: ../gtk/src/SourceManager.cc:141 ../qt/src/SourceManager.cc:143 msgid "Enter password for file '%1':" msgstr "" #: ../gtk/src/SourceManager.cc:197 ../qt/src/SourceManager.cc:214 msgid "Images and PDFs" msgstr "Slike in PDFji" #: ../gtk/src/SourceManager.cc:202 ../qt/src/SourceManager.cc:215 msgid "Select Files" msgstr "Izberi datoteke" #: ../gtk/src/SourceManager.cc:208 ../qt/src/SourceManager.cc:226 msgid "Clipboard Error" msgstr "Napaka odlagaliÅ¡Äa" #: ../gtk/src/SourceManager.cc:208 ../qt/src/SourceManager.cc:226 msgid "Failed to read the clipboard." msgstr "OdlagaliÅ¡Äa ni bilo mogoÄe prebrati." #: ../gtk/src/SourceManager.cc:212 ../qt/src/SourceManager.cc:230 #: ../qt/src/SourceManager.cc:236 msgid "Pasted %1" msgstr "Prilepljeno %1" #: ../gtk/src/SourceManager.cc:224 ../qt/src/SourceManager.cc:243 msgid "Screenshot Error" msgstr "Napaka pri posnetku zaslona" #: ../gtk/src/SourceManager.cc:224 ../qt/src/SourceManager.cc:243 msgid "Failed to take screenshot." msgstr "Zaslona ni bilo mogoÄe posneti." #: ../gtk/src/SourceManager.cc:228 ../qt/src/SourceManager.cc:247 msgid "Screenshot %1" msgstr "Posnetek %1" #: ../gtk/src/SourceManager.cc:233 ../qt/src/SourceManager.cc:252 msgid "Saving image..." msgstr "Shranjevanje slike ..." #: ../gtk/src/SourceManager.cc:240 ../qt/src/SourceManager.cc:265 msgid "Cannot Write File" msgstr "Ni mogoÄe pisati v datoteko" #: ../gtk/src/SourceManager.cc:240 ../qt/src/SourceManager.cc:265 msgid "Could not write to %1." msgstr "V datoteko %1 ni bilo mogoÄe pisati." #: ../gtk/src/SourceManager.cc:267 ../qt/src/SourceManager.cc:287 msgid "Delete File?" msgstr "Ali naj se datoteka izbriÅ¡e?" #: ../gtk/src/SourceManager.cc:267 ../qt/src/SourceManager.cc:287 msgid "The following files will be deleted:%1" msgstr "Naslednje datoteke bodo izbrisane: %1" #: ../gtk/src/SourceManager.cc:332 ../qt/src/SourceManager.cc:338 msgid "Missing File" msgstr "ManjkajoÄa datoteka" #: ../gtk/src/SourceManager.cc:332 ../qt/src/SourceManager.cc:338 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:33 ../qt/src/SubstitutionsManager.cc:73 msgid "Search for" msgstr "PoiÅ¡Äi" #: ../gtk/src/SubstitutionsManager.cc:34 ../qt/src/SubstitutionsManager.cc:73 msgid "Replace with" msgstr "Zamenjaj z" #: ../gtk/src/SubstitutionsManager.cc:69 ../gtk/src/SubstitutionsManager.cc:103 #: ../qt/src/SubstitutionsManager.cc:106 ../qt/src/SubstitutionsManager.cc:143 msgid "Substitutions List" msgstr "Spisek zamenjav" #: ../gtk/src/SubstitutionsManager.cc:70 ../qt/src/SubstitutionsManager.cc:106 msgid "Open Substitutions List" msgstr "Odpri spisek zamenjav" #: ../gtk/src/SubstitutionsManager.cc:75 ../qt/src/SubstitutionsManager.cc:112 msgid "Error Reading File" msgstr "Napaka pri branju datoteke" #: ../gtk/src/SubstitutionsManager.cc:75 ../qt/src/SubstitutionsManager.cc:112 msgid "Unable to read '%1'." msgstr "Datoteke '%1' ni bilo mogoÄe prebrati." #: ../gtk/src/SubstitutionsManager.cc:97 ../qt/src/SubstitutionsManager.cc:137 msgid "Errors Occurred Reading File" msgstr "Pri branju datoteke je priÅ¡lo do napak" #: ../gtk/src/SubstitutionsManager.cc:97 ../qt/src/SubstitutionsManager.cc:137 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:104 ../qt/src/SubstitutionsManager.cc:143 msgid "Save Substitutions List" msgstr "Shrani spisek zamenjav" #: ../gtk/src/SubstitutionsManager.cc:110 ../qt/src/SubstitutionsManager.cc:149 msgid "Error Saving File" msgstr "Napaka pri shranjevanju datoteke" #: ../gtk/src/SubstitutionsManager.cc:110 ../qt/src/SubstitutionsManager.cc:149 msgid "Unable to write to '%1'." msgstr "Datoteke '%1' ni bilo mogoÄe zapisati." #: ../gtk/src/SubstitutionsManager.cc:127 ../qt/src/SubstitutionsManager.cc:162 msgid "Save List?" msgstr "Ali naj bo spisek shranjen?" #: ../gtk/src/SubstitutionsManager.cc:127 ../qt/src/SubstitutionsManager.cc:162 msgid "Do you want to save the current list?" msgstr "Ali želite shraniti trenutni spisek?" #: ../gtk/src/TessdataManager.cc:60 ../qt/src/TessdataManager.cc:74 #, fuzzy msgid "" "A session connection to the PackageKit backend is required for managing " "system-wide tesseract language packs, but it was not found. This service is " "usually provided by a software-management application such as Gnome " "Software. Please install software which provides the necessary PackageKit " "interface, use other system package management software to manage the " "tesseract language packs directly, or switch to using 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:65 ../qt/src/TessdataManager.cc:79 msgid "Fetching available languages" msgstr "Pridobivanje jezikov na voljo" #: ../gtk/src/TessdataManager.cc:70 ../gtk/src/TessdataManager.cc:96 #: ../gtk/src/TessdataManager.cc:197 ../qt/src/TessdataManager.cc:84 #: ../qt/src/TessdataManager.cc:101 ../qt/src/TessdataManager.cc:197 msgid "Failed to fetch list of available languages: %1" msgstr "Spiska jezikov na voljo ni bilo mogoÄe pridobiti: %1" #: ../gtk/src/TessdataManager.cc:104 ../qt/src/TessdataManager.cc:113 #: ../qt/src/TessdataManager.cc:122 msgid "Parsing error: %1" msgstr "Napaka sejanja: %1" #: ../gtk/src/TessdataManager.cc:235 ../qt/src/TessdataManager.cc:232 msgid "Applying changes..." msgstr "Uveljavljanje sprememb ..." #: ../gtk/src/TessdataManager.cc:297 ../qt/src/TessdataManager.cc:278 msgid "Failed to create directory for tessdata files." msgstr "Ustvarjanje imenika za datoteke tessdata je spodletelo." #: ../gtk/src/TessdataManager.cc:306 ../qt/src/TessdataManager.cc:287 msgid "Downloading %1..." msgstr "Prejemanje %1 ..." #: ../gtk/src/TessdataManager.cc:330 #, fuzzy msgid "" "The following files could not be downloaded or removed:\n" "%1\n" "\n" "Check the connectivity and directory permissions.\n" "\n" "Hint: If you don't have write permissions in system folders, you can switch " "to user paths in the settings dialog." msgstr "" "Navedenih datotek ni bilo mogoÄe prejeti ali odstraniti:\n" "%1\n" "\n" "Preverite internetno povezavo in dovoljenja mape." #: ../gtk/src/Utils.cc:64 msgid "Yes" msgstr "Da" #: ../gtk/src/Utils.cc:67 msgid "No" msgstr "Ne" #: ../gtk/src/Utils.cc:76 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 za 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/CrashHandler.ui.h:3 msgid "" "

Tesseract has " "aborted

Tesseract (the OCR engine) has aborted while " "recognizing text. This may occur if the used traineddatas are corrupt or " "incomplatible with the version of tesseract in use, or due to a bug in " "tesseract.

The stacktrace below may provide additional information " "about where the crash occured.

" msgstr "" #: ../qt/data/MainWindow.ui.h:17 msgid "Flatbed" msgstr "" #: ../qt/data/MainWindow.ui.h:18 msgid "ADF Front" msgstr "" #: ../qt/data/MainWindow.ui.h:19 msgid "ADF Back" msgstr "" #: ../qt/data/MainWindow.ui.h:20 msgid "ADF Duplex" msgstr "" #. Remove & from some labels which designer insists in adding #: ../qt/data/MainWindow.ui.h:21 ../qt/src/Ui_MainWindow.hh:50 msgid "Sources" msgstr "Viri" #: ../qt/data/MainWindow.ui.h:22 msgid "Zoom In" msgstr "Približaj" #: ../qt/data/MainWindow.ui.h:24 msgid "Zoom Out" msgstr "Oddalji" #: ../qt/data/MainWindow.ui.h:26 msgid "Normal Size" msgstr "Normalna velikost" #: ../qt/data/MainWindow.ui.h:28 msgid "Best Fit" msgstr "NajboljÅ¡e ujemanje" #: ../qt/data/MainWindow.ui.h:30 msgid "Rotate Left" msgstr "Zasukaj levo" #: ../qt/data/MainWindow.ui.h:31 msgid "Rotate left" msgstr "Zasukaj levo" #: ../qt/data/MainWindow.ui.h:32 msgid "Rotate Right" msgstr "Zasukaj desno" #: ../qt/data/MainWindow.ui.h:33 msgid "Rotate right" msgstr "Zasukaj desno" #: ../qt/data/MainWindow.ui.h:34 msgid "Image Controls" msgstr "Kontrolniki slike" #: ../qt/data/MainWindow.ui.h:36 msgid "Autodetect Layout" msgstr "Samodejno zaznaj razporeditev" #: ../qt/data/MainWindow.ui.h:38 msgid "Toggle Output Pane" msgstr "Preklopi prikaz rezultata" #: ../qt/data/PdfExportDialog.ui.h:5 msgid "Backend:" msgstr "" #: ../qt/data/PdfExportDialog.ui.h:8 msgid "Portrait" msgstr "" #: ../qt/data/PdfExportDialog.ui.h:9 msgid "Landscape" msgstr "" #: ../qt/src/hocr/HOCRPdfExporter.cc:142 #, fuzzy msgid "Failed to write to file" msgstr "Odpiranje datoteke spodletelo" #. Output toolbar #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:55 #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:56 msgid "Open hOCR file" msgstr "Odpri datoteko hOCR" #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:57 #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:58 msgid "Save as hOCR text" msgstr "Shrani kot besedilo hOCR" #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:79 #: ../qt/src/Ui_OutputEditorText.hh:106 msgid "Find and Replace" msgstr "PoiÅ¡Äi in zamenjaj" #: ../qt/src/MainWindow.cc:581 #, fuzzy msgid "" "The following dictionary files were installed:\n" "%1" msgstr "Naslednje datoteke s slovarji so bile nameÅ¡Äene: %1" #: ../qt/src/TessdataManager.cc:308 #, fuzzy msgid "" "The following files could not be downloaded or removed:\n" "%1\n" "\n" "Check the connectivity and directory permissions.\n" "Hint: If you don't have write permissions in system folders, you can switch " "to user paths in the settings dialog." msgstr "" "Navedenih datotek ni bilo mogoÄe prejeti ali odstraniti:\n" "%1\n" "\n" "Preverite internetno povezavo in dovoljenja mape." #: ../qt/src/Ui_MainWindow.hh:51 msgid "Output" msgstr "Rezultat" #: ../qt/src/Ui_MainWindow.hh:135 msgid "OCR mode:" msgstr "NaÄin OCR:" #: ../qt/src/Ui_MainWindow.hh:209 msgid "Remove Image" msgstr "Odstrani sliko" #: ../qt/src/Ui_MainWindow.hh:212 msgid "Delete Image" msgstr "ZbriÅ¡i sliko" #: ../qt/src/Ui_MainWindow.hh:215 msgid "Clear List" msgstr "PoÄisti spisek" #: ../qt/src/Ui_OutputEditorText.hh:101 msgid "Strip Line Breaks" msgstr "Odstrani prelome vrstic" #: ../qt/src/Ui_OutputEditorText.hh:115 msgid "Save Output" msgstr "Shrani rezultat" #: ../qt/src/Ui_OutputEditorText.hh:117 msgid "Clear Output" msgstr "PoÄisti rezultat" #~ msgid "The application has crashed" #~ msgstr "Program se je sesul" #~ 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." #~ msgid "Could not read %1: %2" #~ msgstr "Branje %1 ni bilo možno: %2" #~ msgid "gImageReader" #~ msgstr "gImageReader" #, 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 "Document font:" #~ msgstr "Pisava dokumenta:" #~ msgid "Scale:" #~ msgstr "Merilo:" #~ msgid "Document" #~ msgstr "Dokument" #~ msgid "Errors occurred" #~ msgstr "Pojavile so se napake" #~ msgid "" #~ "The following pages could not be rendered:\n" #~ "%1" #~ msgstr "" #~ "Naslednjih strani ni bilo mogoÄe prikazati:\n" #~ "%1" #~ msgid "substitution_list.txt" #~ msgstr "spisek_zamenjav.txt" #~ 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.3.1/po/sr_CS.po000066400000000000000000001506341351740627400160430ustar00rootroot00000000000000# 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. # msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2019-07-25 23:17+0200\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: Automatically generated\n" "Language-Team: none\n" "Language: sr_CS\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: ../data/gimagereader.desktop.in.h:1 msgid "OCR application" msgstr "" #: ../gtk/data/appmenu.ui.h:1 ../qt/src/Ui_MainWindow.hh:167 msgid "Redetect Languages" msgstr "" #: ../gtk/data/appmenu.ui.h:2 ../qt/src/Ui_MainWindow.hh:170 msgid "Manage Languages" msgstr "" #: ../gtk/data/appmenu.ui.h:3 ../gtk/data/ConfigDialog.ui.h:1 #: ../qt/data/ConfigDialog.ui.h:1 ../qt/src/Ui_MainWindow.hh:173 msgid "Preferences" msgstr "" #: ../gtk/data/appmenu.ui.h:4 ../gtk/data/ConfigDialog.ui.h:2 #: ../gtk/src/MainWindow.cc:482 ../qt/src/MainWindow.cc:481 #: ../qt/src/Ui_MainWindow.hh:178 msgid "Help" msgstr "" #: ../gtk/data/appmenu.ui.h:5 ../qt/data/AboutDialog.ui.h:2 #: ../qt/src/Ui_MainWindow.hh:181 msgid "About" msgstr "" #: ../gtk/data/appmenu.ui.h:6 msgid "Quit" msgstr "" #: ../gtk/data/ConfigDialog.ui.h:3 ../gtk/data/MainWindow.ui.h:47 #: ../gtk/data/OutputEditorHOCR.ui.h:3 ../gtk/data/PdfExportDialog.ui.h:3 #: ../gtk/src/FileDialogs.cc:152 ../gtk/src/Utils.cc:61 #: ../qt/data/ConfigDialog.ui.h:26 msgid "OK" msgstr "" #: ../gtk/data/ConfigDialog.ui.h:4 msgid "Output pane orientation:" msgstr "" #: ../gtk/data/ConfigDialog.ui.h:5 msgid "Horizontal" msgstr "" #: ../gtk/data/ConfigDialog.ui.h:6 msgid "Vertical" msgstr "" #: ../gtk/data/ConfigDialog.ui.h:7 ../qt/data/ConfigDialog.ui.h:18 msgid "Query to install missing spellcheck dictionaries" msgstr "" #: ../gtk/data/ConfigDialog.ui.h:8 ../qt/data/ConfigDialog.ui.h:4 msgid "Automatically check for new program versions" msgstr "" #: ../gtk/data/ConfigDialog.ui.h:9 ../qt/data/ConfigDialog.ui.h:3 msgid "Predefined language definitions:" msgstr "" #: ../gtk/data/ConfigDialog.ui.h:10 ../qt/data/ConfigDialog.ui.h:12 msgid "Additional language definitions:" msgstr "" #: ../gtk/data/ConfigDialog.ui.h:11 ../qt/data/ConfigDialog.ui.h:20 msgid "The prefix of the tesseract language data file" msgstr "" #: ../gtk/data/ConfigDialog.ui.h:12 ../qt/data/ConfigDialog.ui.h:21 msgid "Prefix" msgstr "" #: ../gtk/data/ConfigDialog.ui.h:13 ../qt/data/ConfigDialog.ui.h:22 msgid "The ISO 639-1 language code followed by the country code" msgstr "" #: ../gtk/data/ConfigDialog.ui.h:14 ../qt/data/ConfigDialog.ui.h:23 msgid "ISO Code" msgstr "" #: ../gtk/data/ConfigDialog.ui.h:15 ../qt/data/ConfigDialog.ui.h:24 msgid "The name of the language" msgstr "" #: ../gtk/data/ConfigDialog.ui.h:16 ../qt/data/ConfigDialog.ui.h:25 msgid "Name" msgstr "" #: ../gtk/data/ConfigDialog.ui.h:17 ../gtk/data/MainWindow.ui.h:46 #: ../gtk/data/OutputEditorHOCR.ui.h:2 ../gtk/data/PdfExportDialog.ui.h:2 #: ../gtk/src/Acquirer.cc:34 ../gtk/src/FileDialogs.cc:151 #: ../gtk/src/Utils.cc:70 ../qt/data/ConfigDialog.ui.h:27 #: ../qt/data/MainWindow.ui.h:12 msgid "Cancel" msgstr "" #: ../gtk/data/ConfigDialog.ui.h:18 ../qt/data/ConfigDialog.ui.h:5 msgid "Output pane font:" msgstr "" #: ../gtk/data/ConfigDialog.ui.h:19 ../qt/data/ConfigDialog.ui.h:2 msgid "Default" msgstr "" #: ../gtk/data/ConfigDialog.ui.h:20 ../qt/data/ConfigDialog.ui.h:6 msgid "Language data locations:" msgstr "" #: ../gtk/data/ConfigDialog.ui.h:21 ../qt/data/ConfigDialog.ui.h:13 msgid "Language definitions path:" msgstr "" #: ../gtk/data/ConfigDialog.ui.h:22 ../qt/data/ConfigDialog.ui.h:28 msgid "Spelling dictionaries path:" msgstr "" #: ../gtk/data/ConfigDialog.ui.h:23 ../qt/data/ConfigDialog.ui.h:10 msgid "System-wide paths" msgstr "" #: ../gtk/data/ConfigDialog.ui.h:24 ../qt/data/ConfigDialog.ui.h:11 msgid "User paths" msgstr "" #: ../gtk/data/ConfigDialog.ui.h:25 ../qt/data/ConfigDialog.ui.h:29 msgid "Automatically open exported documents with default application" msgstr "" #: ../gtk/data/CrashHandler.ui.h:1 ../qt/src/CrashHandler.cc:38 msgid "Regenerate backtrace" msgstr "" #: ../gtk/data/CrashHandler.ui.h:3 #, no-c-format msgid "" "The application has crashed\n" "\n" "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/CrashHandler.ui.h:6 msgid "" "Tesseract has aborted\n" "\n" "Tesseract (the OCR engine) has aborted while recognizing text. This may " "occur if the used traineddatas are corrupt or incomplatible with the version " "of tesseract in use, or due to a bug in tesseract.\n" "\n" "The stacktrace below may provide additional information about where the " "crash occured.\n" msgstr "" #: ../gtk/data/MainWindow.ui.h:1 ../qt/data/MainWindow.ui.h:39 msgid "Toggle output pane" msgstr "" #: ../gtk/data/MainWindow.ui.h:2 ../qt/src/Ui_MainWindow.hh:66 msgid "Rotate current page" msgstr "" #: ../gtk/data/MainWindow.ui.h:3 ../qt/src/Ui_MainWindow.hh:67 msgid "Rotate all pages" msgstr "" #. Sources toolbar #: ../gtk/data/MainWindow.ui.h:4 ../qt/src/Ui_MainWindow.hh:192 msgid "Recent" msgstr "" #: ../gtk/data/MainWindow.ui.h:5 ../qt/src/Ui_MainWindow.hh:193 msgid "Paste" msgstr "" #: ../gtk/data/MainWindow.ui.h:6 ../qt/src/Ui_MainWindow.hh:194 msgid "Take Screenshot" msgstr "" #: ../gtk/data/MainWindow.ui.h:7 ../qt/data/MainWindow.ui.h:23 msgid "Zoom in" msgstr "" #: ../gtk/data/MainWindow.ui.h:8 ../qt/data/MainWindow.ui.h:25 msgid "Zoom out" msgstr "" #: ../gtk/data/MainWindow.ui.h:9 ../qt/data/MainWindow.ui.h:27 msgid "Normal size" msgstr "" #: ../gtk/data/MainWindow.ui.h:10 ../qt/data/MainWindow.ui.h:29 msgid "Best fit" msgstr "" #: ../gtk/data/MainWindow.ui.h:11 ../qt/src/Ui_MainWindow.hh:75 msgid "Select rotation mode" msgstr "" #: ../gtk/data/MainWindow.ui.h:12 ../gtk/data/OutputEditorText.ui.h:13 #: ../qt/src/Ui_OutputEditorText.hh:95 msgid "Select insert mode" msgstr "" #: ../gtk/data/MainWindow.ui.h:13 ../qt/src/Ui_MainWindow.hh:109 msgid "Select page" msgstr "" #: ../gtk/data/MainWindow.ui.h:14 ../qt/data/MainWindow.ui.h:35 msgid "Image controls" msgstr "" #: ../gtk/data/MainWindow.ui.h:15 ../qt/src/Ui_MainWindow.hh:139 msgid "Plain text" msgstr "" #: ../gtk/data/MainWindow.ui.h:16 ../qt/src/Ui_MainWindow.hh:139 msgid "hOCR, PDF" msgstr "" #: ../gtk/data/MainWindow.ui.h:17 ../qt/data/MainWindow.ui.h:37 msgid "Autodetect layout" msgstr "" #: ../gtk/data/MainWindow.ui.h:18 msgid "Recognize all" msgstr "" #: ../gtk/data/MainWindow.ui.h:19 msgid "Select language" msgstr "" #: ../gtk/data/MainWindow.ui.h:20 ../qt/src/Ui_MainWindow.hh:205 msgid "Add images" msgstr "" #: ../gtk/data/MainWindow.ui.h:21 ../qt/src/Ui_MainWindow.hh:204 msgid "Add Images" msgstr "" #: ../gtk/data/MainWindow.ui.h:22 ../qt/src/Ui_MainWindow.hh:210 msgid "Remove image from list" msgstr "" #: ../gtk/data/MainWindow.ui.h:23 ../qt/src/Ui_MainWindow.hh:213 msgid "Delete image" msgstr "" #: ../gtk/data/MainWindow.ui.h:24 ../qt/src/Ui_MainWindow.hh:216 msgid "Clear list" msgstr "" #: ../gtk/data/MainWindow.ui.h:25 ../qt/data/MainWindow.ui.h:5 msgid "Files" msgstr "" #: ../gtk/data/MainWindow.ui.h:26 ../qt/data/MainWindow.ui.h:8 msgid "Device:" msgstr "" #: ../gtk/data/MainWindow.ui.h:27 ../gtk/data/TessdataManager.ui.h:4 #: ../qt/data/MainWindow.ui.h:7 ../qt/src/TessdataManager.cc:59 msgid "Refresh" msgstr "" #: ../gtk/data/MainWindow.ui.h:28 ../qt/data/MainWindow.ui.h:9 msgid "Output:" msgstr "" #: ../gtk/data/MainWindow.ui.h:29 ../qt/data/MainWindow.ui.h:13 msgid "Mode:" msgstr "" #: ../gtk/data/MainWindow.ui.h:30 ../gtk/src/hocr/HOCRPdfExporter.cc:313 #: ../qt/data/MainWindow.ui.h:15 ../qt/src/hocr/HOCRPdfExporter.cc:347 msgid "Color" msgstr "" #: ../gtk/data/MainWindow.ui.h:31 ../gtk/src/hocr/HOCRPdfExporter.cc:316 #: ../qt/data/MainWindow.ui.h:14 ../qt/src/hocr/HOCRPdfExporter.cc:349 #: ../qt/src/hocr/HOCRPdfExporter.cc:351 msgid "Grayscale" msgstr "" #: ../gtk/data/MainWindow.ui.h:32 ../qt/data/MainWindow.ui.h:10 msgid "Resolution:" msgstr "" #: ../gtk/data/MainWindow.ui.h:33 ../qt/data/MainWindow.ui.h:11 msgid "Scan" msgstr "" #: ../gtk/data/MainWindow.ui.h:34 ../qt/data/MainWindow.ui.h:16 msgid "Source:" msgstr "" #: ../gtk/data/MainWindow.ui.h:35 ../qt/data/MainWindow.ui.h:6 msgid "Acquire" msgstr "" #: ../gtk/data/MainWindow.ui.h:36 ../qt/data/MainWindow.ui.h:1 msgid "Brightness" msgstr "" #: ../gtk/data/MainWindow.ui.h:37 ../qt/data/MainWindow.ui.h:2 msgid "Contrast" msgstr "" #: ../gtk/data/MainWindow.ui.h:38 ../qt/data/MainWindow.ui.h:3 msgid "Resolution" msgstr "" #: ../gtk/data/MainWindow.ui.h:39 ../qt/data/MainWindow.ui.h:4 msgid "Invert colors" msgstr "" #: ../gtk/data/MainWindow.ui.h:40 msgid "A graphical frontend to tesseract-ocr" msgstr "" #: ../gtk/data/MainWindow.ui.h:41 ../qt/data/CharacterListDialog.ui.h:1 msgid "Character whitelist / blacklist" msgstr "" #: ../gtk/data/MainWindow.ui.h:42 ../qt/data/CharacterListDialog.ui.h:2 msgid "Exclude these characters from being recognized (blacklist):" msgstr "" #: ../gtk/data/MainWindow.ui.h:43 ../qt/data/CharacterListDialog.ui.h:3 msgid "Enter a string of characters..." msgstr "" #: ../gtk/data/MainWindow.ui.h:44 ../qt/data/CharacterListDialog.ui.h:4 msgid "Only allow the following characters to be recognized (whitelist):" msgstr "" #: ../gtk/data/MainWindow.ui.h:45 ../qt/data/PageRangeDialog.ui.h:1 msgid "Page Range" msgstr "" #: ../gtk/data/MainWindow.ui.h:48 ../qt/data/PageRangeDialog.ui.h:2 msgid "Page range:" msgstr "" #: ../gtk/data/MainWindow.ui.h:49 ../qt/data/PageRangeDialog.ui.h:3 msgid "Example: 1-10, 13, 14-18" msgstr "" #: ../gtk/data/MainWindow.ui.h:50 ../qt/data/PageRangeDialog.ui.h:4 msgid "Recognition area:" msgstr "" #: ../gtk/data/MainWindow.ui.h:51 ../gtk/src/Recognizer.cc:375 #: ../qt/data/PageRangeDialog.ui.h:5 ../qt/src/Recognizer.cc:369 msgid "Entire page" msgstr "" #: ../gtk/data/MainWindow.ui.h:52 ../qt/data/PageRangeDialog.ui.h:6 msgid "Autodetect" msgstr "" #: ../gtk/data/MainWindow.ui.h:53 ../qt/data/PageRangeDialog.ui.h:7 msgid "Prepend to output text:" msgstr "" #: ../gtk/data/MainWindow.ui.h:54 ../qt/data/PageRangeDialog.ui.h:8 msgid "Source filename" msgstr "" #: ../gtk/data/MainWindow.ui.h:55 ../qt/data/PageRangeDialog.ui.h:9 msgid "Source page" msgstr "" #: ../gtk/data/MainWindow.ui.h:56 ../qt/src/SourceManager.cc:146 msgid "Protected PDF" msgstr "" #: ../gtk/data/MainWindow.ui.h:57 ../qt/src/Recognizer.cc:76 msgid "Current Page" msgstr "" #: ../gtk/data/MainWindow.ui.h:58 ../qt/src/Recognizer.cc:79 msgid "Multiple Pages..." msgstr "" #: ../gtk/data/OutputEditorHOCR.ui.h:1 ../qt/src/hocr/OutputEditorHOCR.cc:580 msgid "Add Word" msgstr "" #: ../gtk/data/OutputEditorHOCR.ui.h:4 ../qt/src/hocr/OutputEditorHOCR.cc:580 msgid "Enter word:" msgstr "" #: ../gtk/data/OutputEditorHOCR.ui.h:5 ../qt/src/hocr/Ui_OutputEditorHOCR.hh:61 #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:62 msgid "Export to plain text" msgstr "" #: ../gtk/data/OutputEditorHOCR.ui.h:6 ../qt/src/hocr/Ui_OutputEditorHOCR.hh:64 #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:65 msgid "Export to PDF" msgstr "" #: ../gtk/data/OutputEditorHOCR.ui.h:7 ../qt/src/hocr/Ui_OutputEditorHOCR.hh:67 #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:68 msgid "Export to ODT" msgstr "" #: ../gtk/data/OutputEditorHOCR.ui.h:8 ../gtk/data/OutputEditorText.ui.h:18 #: ../qt/src/Ui_OutputEditorText.hh:116 msgid "Save output" msgstr "" #: ../gtk/data/OutputEditorHOCR.ui.h:9 ../qt/src/hocr/Ui_OutputEditorHOCR.hh:72 #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:73 msgid "Export" msgstr "" #: ../gtk/data/OutputEditorHOCR.ui.h:10 ../gtk/data/OutputEditorText.ui.h:19 #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:77 #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:78 #: ../qt/src/Ui_OutputEditorText.hh:118 msgid "Clear output" msgstr "" #: ../gtk/data/OutputEditorHOCR.ui.h:11 ../gtk/data/OutputEditorText.ui.h:15 #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:80 #: ../qt/src/Ui_OutputEditorText.hh:107 msgid "Find and replace" msgstr "" #: ../gtk/data/OutputEditorHOCR.ui.h:12 #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:82 #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:83 msgid "Show confidence values" msgstr "" #: ../gtk/data/OutputEditorHOCR.ui.h:13 ../gtk/data/PdfExportDialog.ui.h:41 #: ../qt/data/PdfExportDialog.ui.h:2 ../qt/src/hocr/Ui_OutputEditorHOCR.hh:85 #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:86 msgid "Show preview" msgstr "" #: ../gtk/data/OutputEditorHOCR.ui.h:14 #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:121 msgid "Next (F3)" msgstr "" #: ../gtk/data/OutputEditorHOCR.ui.h:15 #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:122 msgid "Previous (Shift+F3)" msgstr "" #: ../gtk/data/OutputEditorHOCR.ui.h:16 ../gtk/src/hocr/OutputEditorHOCR.cc:890 #: ../qt/src/hocr/OutputEditorHOCR.cc:730 #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:126 msgid "Expand all" msgstr "" #: ../gtk/data/OutputEditorHOCR.ui.h:17 ../gtk/src/hocr/OutputEditorHOCR.cc:893 #: ../qt/src/hocr/OutputEditorHOCR.cc:731 #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:127 msgid "Collapse all" msgstr "" #: ../gtk/data/OutputEditorHOCR.ui.h:18 #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:148 msgid "Properties" msgstr "" #: ../gtk/data/OutputEditorHOCR.ui.h:19 #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:152 msgid "Source" msgstr "" #. Output insert mode #: ../gtk/data/OutputEditorText.ui.h:1 ../qt/src/Ui_OutputEditorText.hh:52 msgid "Append to current text" msgstr "" #: ../gtk/data/OutputEditorText.ui.h:2 ../qt/src/Ui_OutputEditorText.hh:53 msgid "Insert at cursor" msgstr "" #: ../gtk/data/OutputEditorText.ui.h:3 ../qt/src/Ui_OutputEditorText.hh:54 msgid "Replace current text" msgstr "" #. Output postprocessing #: ../gtk/data/OutputEditorText.ui.h:4 ../qt/src/Ui_OutputEditorText.hh:62 msgid "Keep line break if..." msgstr "" #: ../gtk/data/OutputEditorText.ui.h:5 ../qt/src/Ui_OutputEditorText.hh:64 msgid "Preceded by end mark (.?!)" msgstr "" #: ../gtk/data/OutputEditorText.ui.h:6 ../qt/src/Ui_OutputEditorText.hh:66 msgid "Preceded or succeeded by quote" msgstr "" #: ../gtk/data/OutputEditorText.ui.h:7 ../qt/src/Ui_OutputEditorText.hh:68 msgid "Other options" msgstr "" #: ../gtk/data/OutputEditorText.ui.h:8 ../qt/src/Ui_OutputEditorText.hh:70 msgid "Join hyphenated words" msgstr "" #: ../gtk/data/OutputEditorText.ui.h:9 ../qt/src/Ui_OutputEditorText.hh:72 msgid "Collapse whitespace" msgstr "" #: ../gtk/data/OutputEditorText.ui.h:10 ../qt/src/Ui_OutputEditorText.hh:74 msgid "Preserve paragraphs" msgstr "" #: ../gtk/data/OutputEditorText.ui.h:11 ../qt/src/Ui_OutputEditorText.hh:76 msgid "Visual aids" msgstr "" #: ../gtk/data/OutputEditorText.ui.h:12 ../qt/src/Ui_OutputEditorText.hh:78 msgid "Draw whitespace" msgstr "" #: ../gtk/data/OutputEditorText.ui.h:14 ../qt/src/Ui_OutputEditorText.hh:102 msgid "Strip line breaks on selected text" msgstr "" #: ../gtk/data/OutputEditorText.ui.h:16 ../qt/src/Ui_OutputEditorText.hh:109 #: ../qt/src/Ui_OutputEditorText.hh:110 msgid "Undo" msgstr "" #: ../gtk/data/OutputEditorText.ui.h:17 ../qt/src/Ui_OutputEditorText.hh:112 #: ../qt/src/Ui_OutputEditorText.hh:113 msgid "Redo" msgstr "" #: ../gtk/data/PdfExportDialog.ui.h:1 ../qt/data/PdfExportDialog.ui.h:1 msgid "PDF Export" msgstr "" #: ../gtk/data/PdfExportDialog.ui.h:4 ../qt/data/PdfExportDialog.ui.h:4 msgid "Output mode:" msgstr "" #: ../gtk/data/PdfExportDialog.ui.h:5 ../qt/data/PdfExportDialog.ui.h:6 msgid "PDF" msgstr "" #: ../gtk/data/PdfExportDialog.ui.h:6 ../qt/data/PdfExportDialog.ui.h:7 msgid "PDF with invisible text overlay" msgstr "" #: ../gtk/data/PdfExportDialog.ui.h:7 ../qt/data/PdfExportDialog.ui.h:16 msgid "Format:" msgstr "" #: ../gtk/data/PdfExportDialog.ui.h:8 ../qt/data/PdfExportDialog.ui.h:17 msgid "Compression:" msgstr "" #: ../gtk/data/PdfExportDialog.ui.h:9 ../qt/data/PdfExportDialog.ui.h:14 msgid "Compression quality:" msgstr "" #: ../gtk/data/PdfExportDialog.ui.h:10 ../qt/data/PdfExportDialog.ui.h:15 msgid "DPI:" msgstr "" #: ../gtk/data/PdfExportDialog.ui.h:11 ../qt/data/PdfExportDialog.ui.h:18 msgid "Dithering algorithm:" msgstr "" #: ../gtk/data/PdfExportDialog.ui.h:12 ../qt/data/PdfExportDialog.ui.h:13 msgid "Image settings:" msgstr "" #: ../gtk/data/PdfExportDialog.ui.h:13 ../qt/data/PdfExportDialog.ui.h:25 msgid "Uniformize line and word spacing" msgstr "" #: ../gtk/data/PdfExportDialog.ui.h:14 ../qt/data/PdfExportDialog.ui.h:21 msgid "Override font family:" msgstr "" #: ../gtk/data/PdfExportDialog.ui.h:15 ../qt/data/PdfExportDialog.ui.h:27 msgid "Fallback font family:" msgstr "" #: ../gtk/data/PdfExportDialog.ui.h:16 ../qt/data/PdfExportDialog.ui.h:20 msgid "Override font size:" msgstr "" #: ../gtk/data/PdfExportDialog.ui.h:17 ../qt/data/PdfExportDialog.ui.h:23 msgid "Font scaling:" msgstr "" #: ../gtk/data/PdfExportDialog.ui.h:18 ../qt/data/PdfExportDialog.ui.h:26 msgid "pt" msgstr "" #: ../gtk/data/PdfExportDialog.ui.h:19 ../qt/data/PdfExportDialog.ui.h:22 msgid "Preserve spaces wider than:" msgstr "" #: ../gtk/data/PdfExportDialog.ui.h:20 ../qt/data/PdfExportDialog.ui.h:24 msgid "characters" msgstr "" #: ../gtk/data/PdfExportDialog.ui.h:21 ../qt/data/PdfExportDialog.ui.h:28 msgid "Sanitize hyphens before line breaks" msgstr "" #: ../gtk/data/PdfExportDialog.ui.h:22 ../qt/data/PdfExportDialog.ui.h:19 msgid "Text settings:" msgstr "" #: ../gtk/data/PdfExportDialog.ui.h:23 ../qt/data/PdfExportDialog.ui.h:10 msgid "Paper size:" msgstr "" #: ../gtk/data/PdfExportDialog.ui.h:24 ../qt/data/PdfExportDialog.ui.h:11 msgid "Width" msgstr "" #: ../gtk/data/PdfExportDialog.ui.h:25 ../qt/data/PdfExportDialog.ui.h:12 msgid "Height" msgstr "" #: ../gtk/data/PdfExportDialog.ui.h:26 ../qt/data/PdfExportDialog.ui.h:29 msgid "Treat image sources as having true DPI:" msgstr "" #: ../gtk/data/PdfExportDialog.ui.h:27 ../qt/data/PdfExportDialog.ui.h:3 msgid "Basic" msgstr "" #: ../gtk/data/PdfExportDialog.ui.h:28 ../qt/data/PdfExportDialog.ui.h:31 msgid "PDF version:" msgstr "" #: ../gtk/data/PdfExportDialog.ui.h:29 ../qt/data/PdfExportDialog.ui.h:33 msgid "Password:" msgstr "" #: ../gtk/data/PdfExportDialog.ui.h:30 ../qt/data/PdfExportDialog.ui.h:34 msgid "Confirm password:" msgstr "" #: ../gtk/data/PdfExportDialog.ui.h:31 ../qt/data/PdfExportDialog.ui.h:32 msgid "Encryption (optional):" msgstr "" #: ../gtk/data/PdfExportDialog.ui.h:32 ../qt/data/PdfExportDialog.ui.h:36 msgid "Author:" msgstr "" #: ../gtk/data/PdfExportDialog.ui.h:33 ../qt/data/PdfExportDialog.ui.h:38 msgid "Title:" msgstr "" #: ../gtk/data/PdfExportDialog.ui.h:34 ../qt/data/PdfExportDialog.ui.h:40 msgid "Subject:" msgstr "" #: ../gtk/data/PdfExportDialog.ui.h:35 ../qt/data/PdfExportDialog.ui.h:37 msgid "Creator:" msgstr "" #: ../gtk/data/PdfExportDialog.ui.h:36 ../qt/data/PdfExportDialog.ui.h:39 msgid "Producer:" msgstr "" #: ../gtk/data/PdfExportDialog.ui.h:37 ../qt/data/PdfExportDialog.ui.h:41 msgid "Keywords:" msgstr "" #: ../gtk/data/PdfExportDialog.ui.h:38 ../qt/data/PdfExportDialog.ui.h:35 msgid "Additional information (optional):" msgstr "" #: ../gtk/data/PdfExportDialog.ui.h:39 ../qt/data/PdfExportDialog.ui.h:42 msgid "Import from current source" msgstr "" #: ../gtk/data/PdfExportDialog.ui.h:40 ../qt/data/PdfExportDialog.ui.h:30 msgid "Advanced" msgstr "" #: ../gtk/data/SearchReplaceFrame.ui.h:1 ../qt/data/SearchReplaceFrame.ui.h:4 msgid "Find" msgstr "" #: ../gtk/data/SearchReplaceFrame.ui.h:2 ../qt/data/SearchReplaceFrame.ui.h:2 msgid "Replace" msgstr "" #: ../gtk/data/SearchReplaceFrame.ui.h:3 ../qt/data/SearchReplaceFrame.ui.h:3 msgid "Replace all" msgstr "" #: ../gtk/data/SearchReplaceFrame.ui.h:4 ../qt/data/SearchReplaceFrame.ui.h:5 msgid "Find previous" msgstr "" #: ../gtk/data/SearchReplaceFrame.ui.h:5 ../qt/data/SearchReplaceFrame.ui.h:6 msgid "Find next" msgstr "" #: ../gtk/data/SearchReplaceFrame.ui.h:6 ../qt/data/SearchReplaceFrame.ui.h:7 msgid "Match case" msgstr "" #: ../gtk/data/SearchReplaceFrame.ui.h:7 #: ../gtk/data/SubstitutionsManager.ui.h:1 ../qt/data/SearchReplaceFrame.ui.h:1 #: ../qt/src/SubstitutionsManager.cc:36 msgid "Substitutions" msgstr "" #: ../gtk/data/SelectionMenu.ui.h:1 ../qt/src/DisplayerToolSelect.cc:239 msgid "Delete" msgstr "" #: ../gtk/data/SelectionMenu.ui.h:2 ../qt/src/DisplayerToolSelect.cc:225 msgid "Order:" msgstr "" #: ../gtk/data/SelectionMenu.ui.h:3 ../gtk/src/hocr/DisplayerToolHOCR.cc:29 #: ../qt/src/DisplayerToolSelect.cc:240 ../qt/src/hocr/DisplayerToolHOCR.cc:31 msgid "Recognize" msgstr "" #: ../gtk/data/SelectionMenu.ui.h:4 ../qt/src/DisplayerToolSelect.cc:241 msgid "Recognize to clipboard" msgstr "" #: ../gtk/data/SelectionMenu.ui.h:5 ../qt/src/DisplayerToolSelect.cc:242 msgid "Save as image" msgstr "" #: ../gtk/data/SubstitutionsManager.ui.h:2 ../qt/src/SubstitutionsManager.cc:38 #: ../qt/src/SubstitutionsManager.cc:39 msgid "Open" msgstr "" #: ../gtk/data/SubstitutionsManager.ui.h:3 ../gtk/src/Utils.cc:73 #: ../qt/src/SubstitutionsManager.cc:41 ../qt/src/SubstitutionsManager.cc:42 msgid "Save" msgstr "" #: ../gtk/data/SubstitutionsManager.ui.h:4 ../qt/src/SubstitutionsManager.cc:44 #: ../qt/src/SubstitutionsManager.cc:45 msgid "Clear" msgstr "" #: ../gtk/data/SubstitutionsManager.ui.h:5 ../qt/data/ConfigDialog.ui.h:16 #: ../qt/src/SubstitutionsManager.cc:47 ../qt/src/SubstitutionsManager.cc:48 msgid "Add" msgstr "" #: ../gtk/data/SubstitutionsManager.ui.h:6 #: ../gtk/src/hocr/OutputEditorHOCR.cc:886 ../qt/data/ConfigDialog.ui.h:17 #: ../qt/src/hocr/OutputEditorHOCR.cc:727 ../qt/src/SubstitutionsManager.cc:50 #: ../qt/src/SubstitutionsManager.cc:51 msgid "Remove" msgstr "" #: ../gtk/data/SubstitutionsManager.ui.h:7 ../gtk/data/TessdataManager.ui.h:2 msgid "Apply" msgstr "" #: ../gtk/data/SubstitutionsManager.ui.h:8 ../gtk/data/TessdataManager.ui.h:3 msgid "Close" msgstr "" #: ../gtk/data/TessdataManager.ui.h:1 ../qt/src/TessdataManager.cc:49 msgid "Tessdata Manager" msgstr "" #: ../gtk/data/TessdataManager.ui.h:5 ../qt/src/TessdataManager.cc:51 msgid "Manage installed languages:" msgstr "" #: ../gtk/src/Acquirer.cc:79 ../qt/src/Acquirer.cc:70 msgid "scan.png" msgstr "" #: ../gtk/src/Acquirer.cc:91 ../qt/src/Acquirer.cc:85 msgid "Images" msgstr "" #: ../gtk/src/Acquirer.cc:92 ../qt/src/Acquirer.cc:86 msgid "Choose Output Filename..." msgstr "" #: ../gtk/src/Acquirer.cc:106 ../qt/src/Acquirer.cc:100 msgid "Failed to initialize the scanning backend." msgstr "" #: ../gtk/src/Acquirer.cc:115 ../qt/src/Acquirer.cc:106 msgid "Scan failed" msgstr "" #: ../gtk/src/Acquirer.cc:133 ../qt/src/Acquirer.cc:122 msgid "No scanners were detected." msgstr "" #: ../gtk/src/Acquirer.cc:150 ../gtk/src/Acquirer.cc:168 #: ../qt/src/Acquirer.cc:136 ../qt/src/Acquirer.cc:154 msgid "Starting scan..." msgstr "" #: ../gtk/src/Acquirer.cc:164 ../qt/src/Acquirer.cc:150 msgid "Opening device..." msgstr "" #: ../gtk/src/Acquirer.cc:166 ../qt/src/Acquirer.cc:152 msgid "Setting options..." msgstr "" #: ../gtk/src/Acquirer.cc:170 ../qt/src/Acquirer.cc:156 msgid "Getting parameters..." msgstr "" #: ../gtk/src/Acquirer.cc:172 ../qt/src/Acquirer.cc:158 msgid "Transferring data..." msgstr "" #: ../gtk/src/Acquirer.cc:179 ../qt/src/Acquirer.cc:165 msgid "Canceling scan..." msgstr "" #: ../gtk/src/Config.cc:49 ../qt/data/ConfigDialog.ui.h:7 msgid "Filename prefix" msgstr "" #: ../gtk/src/Config.cc:50 ../qt/data/ConfigDialog.ui.h:8 msgid "Code" msgstr "" #: ../gtk/src/Config.cc:51 ../qt/data/ConfigDialog.ui.h:9 msgid "Native name" msgstr "" #: ../gtk/src/Config.cc:109 ../qt/src/Config.cc:108 msgid "Script" msgstr "" #: ../gtk/src/CrashHandler.cc:25 ../gtk/src/CrashHandler.cc:41 #: ../qt/src/CrashHandler.cc:36 msgid "Crash Handler" msgstr "" #: ../gtk/src/CrashHandler.cc:43 ../qt/src/CrashHandler.cc:31 msgid "Your work has been saved under %1." msgstr "" #: ../gtk/src/CrashHandler.cc:45 ../qt/src/CrashHandler.cc:33 msgid "There was no unsaved work." msgstr "" #: ../gtk/src/CrashHandler.cc:106 ../qt/src/CrashHandler.cc:62 msgid "Failed to obtain backtrace. Is gdb installed?" msgstr "" #: ../gtk/src/Displayer.cc:232 ../qt/src/Displayer.cc:174 msgid "Failed to load image" msgstr "" #: ../gtk/src/Displayer.cc:232 ../qt/src/Displayer.cc:174 msgid "" "The file might not be an image or be corrupt:\n" "%1" msgstr "" #: ../gtk/src/DisplayerToolSelect.cc:138 ../qt/src/DisplayerToolSelect.cc:135 msgid "PNG Images" msgstr "" #: ../gtk/src/DisplayerToolSelect.cc:139 ../qt/src/DisplayerToolSelect.cc:135 msgid "Save Selection Image" msgstr "" #: ../gtk/src/DisplayerToolSelect.cc:139 ../qt/src/DisplayerToolSelect.cc:135 msgid "selection.png" msgstr "" #: ../gtk/src/DisplayerToolSelect.cc:146 ../qt/src/DisplayerToolSelect.cc:142 msgid "Recognize all" msgstr "" #: ../gtk/src/DisplayerToolSelect.cc:146 ../qt/src/DisplayerToolSelect.cc:142 msgid "Recognize selection" msgstr "" #: ../gtk/src/DisplayerToolSelect.cc:186 ../qt/src/DisplayerToolSelect.cc:182 msgid "Performing layout analysis" msgstr "" #: ../gtk/src/FileDialogs.cc:235 msgid "" "A file named \"%1\" already exists. Are you sure you want to overwrite it?" msgstr "" #: ../gtk/src/FileDialogs.cc:237 msgid "Overwrite File?" msgstr "" #: ../gtk/src/hocr/HOCRDocument.cc:611 ../gtk/src/hocr/OutputEditorHOCR.cc:266 #: ../qt/src/hocr/OutputEditorHOCR.cc:229 msgid "Page" msgstr "" #: ../gtk/src/hocr/HOCRDocument.cc:613 ../qt/src/hocr/HOCRDocument.cc:530 msgid "Text block" msgstr "" #: ../gtk/src/hocr/HOCRDocument.cc:615 ../gtk/src/hocr/OutputEditorHOCR.cc:272 #: ../qt/src/hocr/HOCRDocument.cc:532 ../qt/src/hocr/OutputEditorHOCR.cc:231 msgid "Paragraph" msgstr "" #: ../gtk/src/hocr/HOCRDocument.cc:617 ../qt/src/hocr/HOCRDocument.cc:534 msgid "Textline" msgstr "" #: ../gtk/src/hocr/HOCRDocument.cc:621 ../qt/src/hocr/HOCRDocument.cc:538 msgid "Graphic" msgstr "" #: ../gtk/src/hocr/HOCROdtExporter.cc:65 ../gtk/src/hocr/HOCRPdfExporter.cc:489 #: ../gtk/src/hocr/HOCRTextExporter.cc:34 #: ../gtk/src/hocr/OutputEditorHOCR.cc:963 ../gtk/src/OutputEditorText.cc:272 #: ../qt/src/hocr/HOCROdtExporter.cc:50 ../qt/src/hocr/HOCRPdfExporter.cc:478 #: ../qt/src/hocr/HOCRTextExporter.cc:36 ../qt/src/hocr/OutputEditorHOCR.cc:830 #: ../qt/src/OutputEditorText.cc:238 msgid "output" msgstr "" #: ../gtk/src/hocr/HOCROdtExporter.cc:68 ../qt/src/hocr/HOCROdtExporter.cc:53 msgid "OpenDocument Text Documents" msgstr "" #: ../gtk/src/hocr/HOCROdtExporter.cc:69 ../qt/src/hocr/HOCROdtExporter.cc:53 msgid "Save ODT Output..." msgstr "" #: ../gtk/src/hocr/HOCROdtExporter.cc:77 ../gtk/src/hocr/HOCROdtExporter.cc:342 #: ../gtk/src/hocr/HOCRPdfExporter.cc:619 #: ../gtk/src/hocr/HOCRTextExporter.cc:46 ../qt/src/hocr/HOCROdtExporter.cc:61 #: ../qt/src/hocr/HOCRPdfExporter.cc:609 ../qt/src/hocr/HOCRTextExporter.cc:47 msgid "Export failed" msgstr "" #: ../gtk/src/hocr/HOCROdtExporter.cc:77 ../gtk/src/hocr/HOCROdtExporter.cc:342 #: ../qt/src/hocr/HOCROdtExporter.cc:61 msgid "The ODT export failed: unable to write output file." msgstr "" #: ../gtk/src/hocr/HOCROdtExporter.cc:336 ../qt/src/hocr/HOCROdtExporter.cc:254 msgid "Exporting to ODT..." msgstr "" #: ../gtk/src/hocr/HOCRPdfExporter.cc:283 ../qt/src/hocr/HOCRPdfExporter.cc:365 msgid "Same as source" msgstr "" #: ../gtk/src/hocr/HOCRPdfExporter.cc:286 ../qt/src/hocr/HOCRPdfExporter.cc:366 msgid "Custom" msgstr "" #: ../gtk/src/hocr/HOCRPdfExporter.cc:300 ../qt/src/hocr/HOCRPdfExporter.cc:362 msgid "cm" msgstr "" #: ../gtk/src/hocr/HOCRPdfExporter.cc:303 ../qt/src/hocr/HOCRPdfExporter.cc:363 msgid "in" msgstr "" #: ../gtk/src/hocr/HOCRPdfExporter.cc:319 ../qt/src/hocr/HOCRPdfExporter.cc:353 msgid "Monochrome" msgstr "" #: ../gtk/src/hocr/HOCRPdfExporter.cc:328 ../qt/src/hocr/HOCRPdfExporter.cc:355 msgid "Threshold (closest color)" msgstr "" #: ../gtk/src/hocr/HOCRPdfExporter.cc:331 ../qt/src/hocr/HOCRPdfExporter.cc:356 msgid "Diffuse" msgstr "" #: ../gtk/src/hocr/HOCRPdfExporter.cc:340 ../qt/src/hocr/HOCRPdfExporter.cc:357 msgid "Zip (lossless)" msgstr "" #: ../gtk/src/hocr/HOCRPdfExporter.cc:344 ../qt/src/hocr/HOCRPdfExporter.cc:358 msgid "CCITT Group 4 (lossless)" msgstr "" #: ../gtk/src/hocr/HOCRPdfExporter.cc:348 ../qt/src/hocr/HOCRPdfExporter.cc:359 msgid "Jpeg (lossy)" msgstr "" #: ../gtk/src/hocr/HOCRPdfExporter.cc:493 ../qt/src/hocr/HOCRPdfExporter.cc:482 msgid "PDF Files" msgstr "" #: ../gtk/src/hocr/HOCRPdfExporter.cc:494 ../qt/src/hocr/HOCRPdfExporter.cc:482 msgid "Save PDF Output..." msgstr "" #: ../gtk/src/hocr/HOCRPdfExporter.cc:500 ../qt/src/hocr/HOCRPdfExporter.cc:488 msgid "Invalid Output" msgstr "" #: ../gtk/src/hocr/HOCRPdfExporter.cc:500 ../qt/src/hocr/HOCRPdfExporter.cc:488 msgid "Cannot overwrite a file which is a source image of this document." msgstr "" #: ../gtk/src/hocr/HOCRPdfExporter.cc:516 ../qt/src/hocr/HOCRPdfExporter.cc:511 msgid "Failed to create output" msgstr "" #: ../gtk/src/hocr/HOCRPdfExporter.cc:516 ../qt/src/hocr/HOCRPdfExporter.cc:511 msgid "Failed to create output. The returned error was: %1" msgstr "" #: ../gtk/src/hocr/HOCRPdfExporter.cc:558 ../qt/src/hocr/HOCRPdfExporter.cc:551 msgid "The operation was cancelled" msgstr "" #: ../gtk/src/hocr/HOCRPdfExporter.cc:607 ../qt/src/hocr/HOCRPdfExporter.cc:597 msgid "Failed to render page %1" msgstr "" #: ../gtk/src/hocr/HOCRPdfExporter.cc:614 ../qt/src/hocr/HOCRPdfExporter.cc:604 msgid "Exporting to PDF..." msgstr "" #: ../gtk/src/hocr/HOCRPdfExporter.cc:619 ../qt/src/hocr/HOCRPdfExporter.cc:609 msgid "The PDF export failed: %1." msgstr "" #: ../gtk/src/hocr/HOCRPdfExporter.cc:673 ../qt/src/hocr/HOCRPdfExporter.cc:662 msgid "The PDF library could not load the font '%1'." msgstr "" #: ../gtk/src/hocr/HOCRTextExporter.cc:37 ../gtk/src/OutputEditorText.cc:274 #: ../qt/src/hocr/HOCRTextExporter.cc:39 ../qt/src/OutputEditorText.cc:239 msgid "Text Files" msgstr "" #: ../gtk/src/hocr/HOCRTextExporter.cc:38 ../qt/src/hocr/HOCRTextExporter.cc:39 msgid "Save Text Output..." msgstr "" #: ../gtk/src/hocr/HOCRTextExporter.cc:46 ../qt/src/hocr/HOCRTextExporter.cc:47 msgid "The text export failed: unable to write output file." msgstr "" #: ../gtk/src/hocr/OutputEditorHOCR.cc:269 #: ../qt/src/hocr/OutputEditorHOCR.cc:230 msgid "Block" msgstr "" #: ../gtk/src/hocr/OutputEditorHOCR.cc:275 #: ../qt/src/hocr/OutputEditorHOCR.cc:232 msgid "Line" msgstr "" #: ../gtk/src/hocr/OutputEditorHOCR.cc:278 #: ../qt/src/hocr/OutputEditorHOCR.cc:233 msgid "Word" msgstr "" #: ../gtk/src/hocr/OutputEditorHOCR.cc:281 #: ../qt/src/hocr/OutputEditorHOCR.cc:234 msgid "Misspelled word" msgstr "" #: ../gtk/src/hocr/OutputEditorHOCR.cc:435 #: ../qt/src/hocr/OutputEditorHOCR.cc:317 msgid "" "The following pages could not be processed:\n" "%1" msgstr "" #: ../gtk/src/hocr/OutputEditorHOCR.cc:436 #: ../qt/src/hocr/OutputEditorHOCR.cc:318 msgid "Recognition errors" msgstr "" #: ../gtk/src/hocr/OutputEditorHOCR.cc:594 #: ../qt/src/hocr/OutputEditorHOCR.cc:500 #: ../qt/src/hocr/OutputEditorHOCR.cc:512 msgid "Multiple values" msgstr "" #. Merging allowed #: ../gtk/src/hocr/OutputEditorHOCR.cc:778 #: ../qt/src/hocr/OutputEditorHOCR.cc:641 msgid "Merge" msgstr "" #: ../gtk/src/hocr/OutputEditorHOCR.cc:786 #: ../gtk/src/hocr/OutputEditorHOCR.cc:877 #: ../qt/src/hocr/OutputEditorHOCR.cc:643 #: ../qt/src/hocr/OutputEditorHOCR.cc:725 msgid "Split from parent" msgstr "" #. Swapping allowed #: ../gtk/src/hocr/OutputEditorHOCR.cc:797 #: ../qt/src/hocr/OutputEditorHOCR.cc:647 msgid "Swap" msgstr "" #: ../gtk/src/hocr/OutputEditorHOCR.cc:821 #: ../qt/src/hocr/OutputEditorHOCR.cc:693 msgid "Add graphic region" msgstr "" #: ../gtk/src/hocr/OutputEditorHOCR.cc:824 #: ../qt/src/hocr/OutputEditorHOCR.cc:694 msgid "Add text block" msgstr "" #: ../gtk/src/hocr/OutputEditorHOCR.cc:828 #: ../qt/src/hocr/OutputEditorHOCR.cc:696 msgid "Add paragraph" msgstr "" #: ../gtk/src/hocr/OutputEditorHOCR.cc:832 #: ../qt/src/hocr/OutputEditorHOCR.cc:698 msgid "Add line" msgstr "" #: ../gtk/src/hocr/OutputEditorHOCR.cc:836 #: ../qt/src/hocr/OutputEditorHOCR.cc:700 msgid "Add word" msgstr "" #: ../gtk/src/hocr/OutputEditorHOCR.cc:852 #: ../qt/src/hocr/OutputEditorHOCR.cc:710 msgid "No suggestions" msgstr "" #: ../gtk/src/hocr/OutputEditorHOCR.cc:858 #: ../qt/src/hocr/OutputEditorHOCR.cc:714 msgid "Add to dictionary" msgstr "" #: ../gtk/src/hocr/OutputEditorHOCR.cc:864 #: ../qt/src/hocr/OutputEditorHOCR.cc:716 msgid "Ignore word" msgstr "" #: ../gtk/src/hocr/OutputEditorHOCR.cc:926 #: ../gtk/src/hocr/OutputEditorHOCR.cc:965 #: ../qt/src/hocr/OutputEditorHOCR.cc:795 #: ../qt/src/hocr/OutputEditorHOCR.cc:832 msgid "hOCR HTML Files" msgstr "" #: ../gtk/src/hocr/OutputEditorHOCR.cc:927 #: ../qt/src/hocr/OutputEditorHOCR.cc:795 msgid "Open hOCR File" msgstr "" #: ../gtk/src/hocr/OutputEditorHOCR.cc:936 #: ../qt/src/hocr/OutputEditorHOCR.cc:802 msgid "Failed to open file" msgstr "" #: ../gtk/src/hocr/OutputEditorHOCR.cc:936 #: ../qt/src/hocr/OutputEditorHOCR.cc:802 msgid "The file could not be opened: %1." msgstr "" #: ../gtk/src/hocr/OutputEditorHOCR.cc:945 #: ../qt/src/hocr/OutputEditorHOCR.cc:809 msgid "Invalid hOCR file" msgstr "" #: ../gtk/src/hocr/OutputEditorHOCR.cc:945 #: ../qt/src/hocr/OutputEditorHOCR.cc:809 msgid "The file does not appear to contain valid hOCR HTML: %1" msgstr "" #: ../gtk/src/hocr/OutputEditorHOCR.cc:966 #: ../qt/src/hocr/OutputEditorHOCR.cc:832 msgid "Save hOCR Output..." msgstr "" #: ../gtk/src/hocr/OutputEditorHOCR.cc:973 ../gtk/src/OutputEditorText.cc:282 #: ../qt/src/hocr/OutputEditorHOCR.cc:839 ../qt/src/OutputEditorText.cc:246 msgid "Failed to save output" msgstr "" #: ../gtk/src/hocr/OutputEditorHOCR.cc:973 ../gtk/src/OutputEditorText.cc:282 #: ../qt/src/hocr/OutputEditorHOCR.cc:839 ../qt/src/OutputEditorText.cc:246 msgid "Check that you have writing permissions in the selected folder." msgstr "" #: ../gtk/src/hocr/OutputEditorHOCR.cc:1035 ../gtk/src/OutputEditorText.cc:296 #: ../qt/src/hocr/OutputEditorHOCR.cc:894 ../qt/src/OutputEditorText.cc:259 msgid "Output not saved" msgstr "" #: ../gtk/src/hocr/OutputEditorHOCR.cc:1035 ../gtk/src/OutputEditorText.cc:296 #: ../qt/src/hocr/OutputEditorHOCR.cc:894 ../qt/src/OutputEditorText.cc:259 msgid "Save output before proceeding?" msgstr "" #: ../gtk/src/hocr/OutputEditorHOCR.cc:1156 ../gtk/src/OutputEditorText.cc:184 #: ../qt/src/hocr/OutputEditorHOCR.cc:991 ../qt/src/OutputEditorText.cc:152 msgid "Replacing..." msgstr "" #: ../gtk/src/hocr/OutputEditorHOCR.cc:1181 ../gtk/src/OutputEditorText.cc:192 #: ../qt/src/hocr/OutputEditorHOCR.cc:1014 ../qt/src/OutputEditorText.cc:160 msgid "Applying substitutions..." msgstr "" #: ../gtk/src/MainWindow.cc:131 ../qt/src/MainWindow.cc:295 msgid "Using tesseract" msgstr "" #: ../gtk/src/MainWindow.cc:178 ../qt/src/MainWindow.cc:194 msgid "Select an image to begin..." msgstr "" #: ../gtk/src/MainWindow.cc:293 ../qt/src/MainWindow.cc:278 msgid "Multiple sources" msgstr "" #: ../gtk/src/MainWindow.cc:295 ../qt/src/MainWindow.cc:280 msgid "Ready" msgstr "" #: ../gtk/src/MainWindow.cc:442 ../qt/src/MainWindow.cc:423 msgid "New version" msgstr "" #: ../gtk/src/MainWindow.cc:442 ../qt/src/MainWindow.cc:423 msgid "gImageReader %1 is available" msgstr "" #: ../gtk/src/MainWindow.cc:443 ../qt/src/MainWindow.cc:424 msgid "Download" msgstr "" #: ../gtk/src/MainWindow.cc:444 ../qt/src/MainWindow.cc:425 msgid "Changelog" msgstr "" #: ../gtk/src/MainWindow.cc:445 ../qt/src/MainWindow.cc:426 msgid "Don't notify again" msgstr "" #: ../gtk/src/MainWindow.cc:466 ../qt/src/MainWindow.cc:474 msgid "Don't show again" msgstr "" #: ../gtk/src/MainWindow.cc:467 ../gtk/src/MainWindow.cc:480 #: ../qt/src/MainWindow.cc:475 msgid "Install" msgstr "" #: ../gtk/src/MainWindow.cc:487 ../qt/src/MainWindow.cc:487 msgid "Spelling dictionary missing" msgstr "" #: ../gtk/src/MainWindow.cc:487 ../qt/src/MainWindow.cc:487 msgid "The spellcheck dictionary for %1 is not installed" msgstr "" #: ../gtk/src/MainWindow.cc:494 ../gtk/src/MainWindow.cc:523 #: ../qt/src/MainWindow.cc:493 msgid "Installing spelling dictionary for '%1'" msgstr "" #: ../gtk/src/MainWindow.cc:515 ../gtk/src/MainWindow.cc:536 #: ../gtk/src/MainWindow.cc:544 ../gtk/src/MainWindow.cc:592 #: ../gtk/src/MainWindow.cc:597 ../gtk/src/TessdataManager.cc:60 #: ../gtk/src/TessdataManager.cc:70 ../gtk/src/TessdataManager.cc:339 #: ../qt/src/MainWindow.cc:512 ../qt/src/MainWindow.cc:525 #: ../qt/src/MainWindow.cc:534 ../qt/src/MainWindow.cc:578 #: ../qt/src/MainWindow.cc:583 ../qt/src/TessdataManager.cc:74 #: ../qt/src/TessdataManager.cc:84 ../qt/src/TessdataManager.cc:315 msgid "Error" msgstr "" #: ../gtk/src/MainWindow.cc:515 ../qt/src/MainWindow.cc:512 msgid "Failed to install spelling dictionary: %1" msgstr "" #: ../gtk/src/MainWindow.cc:536 ../qt/src/MainWindow.cc:525 msgid "Failed to create directory for spelling dictionaries." msgstr "" #: ../gtk/src/MainWindow.cc:544 ../qt/src/MainWindow.cc:534 msgid "Could not read %1: %2." msgstr "" #: ../gtk/src/MainWindow.cc:571 ../qt/src/MainWindow.cc:558 msgid "Downloading '%1'..." msgstr "" #: ../gtk/src/MainWindow.cc:592 ../qt/src/MainWindow.cc:578 msgid "" "The following dictionaries could not be downloaded:\n" "%1\n" "\n" "Check the connectivity and directory permissions.\n" "Hint: If you don't have write permissions in system folders, you can switch " "to user paths in the settings dialog." msgstr "" #: ../gtk/src/MainWindow.cc:595 ../qt/src/MainWindow.cc:581 msgid "Dictionaries installed" msgstr "" #: ../gtk/src/MainWindow.cc:595 msgid "" "The following dictionaries were installed:\n" "%1" msgstr "" #: ../gtk/src/MainWindow.cc:597 ../qt/src/MainWindow.cc:583 msgid "No spelling dictionaries found for '%1'." msgstr "" #: ../gtk/src/OutputEditorText.cc:154 ../qt/src/OutputEditorText.cc:137 msgid "Stripping line breaks..." msgstr "" #: ../gtk/src/OutputEditorText.cc:162 msgid "Check spelling" msgstr "" #: ../gtk/src/OutputEditorText.cc:231 ../qt/src/OutputEditorText.cc:196 msgid "File: %1" msgstr "" #: ../gtk/src/OutputEditorText.cc:234 ../qt/src/OutputEditorText.cc:199 msgid "Page: %1" msgstr "" #: ../gtk/src/OutputEditorText.cc:247 ../gtk/src/Recognizer.cc:471 #: ../qt/src/Recognizer.cc:462 msgid "" "\n" "[Failed to recognize page %1]\n" msgstr "" #: ../gtk/src/OutputEditorText.cc:275 ../qt/src/OutputEditorText.cc:239 msgid "Save Output..." msgstr "" #: ../gtk/src/Recognizer.cc:179 ../qt/src/Recognizer.cc:172 msgid "No languages available" msgstr "" #: ../gtk/src/Recognizer.cc:179 ../qt/src/Recognizer.cc:172 msgid "" "No tesseract languages are available for use. Recognition will not work." msgstr "" #: ../gtk/src/Recognizer.cc:233 ../qt/src/Recognizer.cc:232 msgid "Multilingual" msgstr "" #: ../gtk/src/Recognizer.cc:285 ../qt/src/Recognizer.cc:277 msgid "Automatic page segmentation" msgstr "" #: ../gtk/src/Recognizer.cc:286 ../qt/src/Recognizer.cc:278 msgid "Page segmentation with orientation and script detection" msgstr "" #: ../gtk/src/Recognizer.cc:287 ../qt/src/Recognizer.cc:279 msgid "Assume single column of text" msgstr "" #: ../gtk/src/Recognizer.cc:288 ../qt/src/Recognizer.cc:280 msgid "Assume single block of vertically aligned text" msgstr "" #: ../gtk/src/Recognizer.cc:289 ../qt/src/Recognizer.cc:281 msgid "Assume a single uniform block of text" msgstr "" #: ../gtk/src/Recognizer.cc:290 ../qt/src/Recognizer.cc:282 msgid "Assume a line of text" msgstr "" #: ../gtk/src/Recognizer.cc:291 ../qt/src/Recognizer.cc:283 msgid "Assume a single word" msgstr "" #: ../gtk/src/Recognizer.cc:292 ../qt/src/Recognizer.cc:284 msgid "Assume a single word in a circle" msgstr "" #: ../gtk/src/Recognizer.cc:293 ../qt/src/Recognizer.cc:285 msgid "Sparse text in no particular order" msgstr "" #: ../gtk/src/Recognizer.cc:294 ../qt/src/Recognizer.cc:286 msgid "Sparse text with orientation and script detection" msgstr "" #: ../gtk/src/Recognizer.cc:309 ../qt/src/Recognizer.cc:297 msgid "Page segmentation mode" msgstr "" #: ../gtk/src/Recognizer.cc:313 ../qt/src/Recognizer.cc:300 msgid "Character whitelist / blacklist..." msgstr "" #: ../gtk/src/Recognizer.cc:319 ../qt/src/Recognizer.cc:305 msgid "Manage languages..." msgstr "" #: ../gtk/src/Recognizer.cc:375 ../qt/src/Recognizer.cc:369 msgid "Current selection" msgstr "" #: ../gtk/src/Recognizer.cc:465 ../qt/src/Recognizer.cc:455 msgid "Recognizing page %1 (%2 of %3)" msgstr "" #: ../gtk/src/Recognizer.cc:470 ../qt/src/Recognizer.cc:461 msgid "" "\n" "- Page %1: failed to render page" msgstr "" #: ../gtk/src/Recognizer.cc:501 ../gtk/src/Recognizer.cc:531 #: ../gtk/src/Recognizer.cc:544 ../qt/src/Recognizer.cc:491 #: ../qt/src/Recognizer.cc:521 ../qt/src/Recognizer.cc:534 msgid "Recognizing..." msgstr "" #: ../gtk/src/Recognizer.cc:505 ../gtk/src/Recognizer.cc:514 #: ../qt/src/Recognizer.cc:495 ../qt/src/Recognizer.cc:504 msgid "Recognition errors occurred" msgstr "" #: ../gtk/src/Recognizer.cc:505 ../qt/src/Recognizer.cc:495 msgid "The following errors occurred:%1" msgstr "" #: ../gtk/src/Recognizer.cc:514 ../qt/src/Recognizer.cc:504 msgid "Failed to initialize tesseract" msgstr "" #: ../gtk/src/scanner/ScannerSane.cc:84 ../gtk/src/scanner/ScannerTwain.cc:288 #: ../qt/src/scanner/ScannerSane.cc:85 ../qt/src/scanner/ScannerTwain.cc:286 msgid "Scan canceled" msgstr "" #: ../gtk/src/scanner/ScannerSane.cc:159 ../gtk/src/scanner/ScannerTwain.cc:186 #: ../qt/src/scanner/ScannerSane.cc:159 ../qt/src/scanner/ScannerTwain.cc:178 msgid "No scanner specified" msgstr "" #: ../gtk/src/scanner/ScannerSane.cc:168 ../gtk/src/scanner/ScannerTwain.cc:195 #: ../qt/src/scanner/ScannerSane.cc:168 ../qt/src/scanner/ScannerTwain.cc:187 msgid "Unable to connect to scanner" msgstr "" #: ../gtk/src/scanner/ScannerSane.cc:403 ../gtk/src/scanner/ScannerTwain.cc:266 #: ../gtk/src/scanner/ScannerTwain.cc:292 ../qt/src/scanner/ScannerSane.cc:403 #: ../qt/src/scanner/ScannerTwain.cc:258 ../qt/src/scanner/ScannerTwain.cc:290 msgid "Unable to start scan" msgstr "" #: ../gtk/src/scanner/ScannerSane.cc:411 ../gtk/src/scanner/ScannerSane.cc:461 #: ../gtk/src/scanner/ScannerTwain.cc:318 ../qt/src/scanner/ScannerSane.cc:411 #: ../qt/src/scanner/ScannerSane.cc:461 ../qt/src/scanner/ScannerTwain.cc:316 msgid "Error communicating with scanner" msgstr "" #: ../gtk/src/scanner/ScannerSane.cc:520 ../qt/src/scanner/ScannerSane.cc:517 msgid "Failed to save image" msgstr "" #: ../gtk/src/scanner/ScannerSane.cc:800 ../qt/src/scanner/ScannerSane.cc:797 msgid "Operation is cancelled." msgstr "" #: ../gtk/src/scanner/ScannerSane.cc:802 ../qt/src/scanner/ScannerSane.cc:799 msgid "Device is busy." msgstr "" #: ../gtk/src/scanner/ScannerSane.cc:804 ../qt/src/scanner/ScannerSane.cc:801 msgid "Cover is opened." msgstr "" #: ../gtk/src/scanner/ScannerSane.cc:806 ../qt/src/scanner/ScannerSane.cc:803 msgid "Document feeder jammed." msgstr "" #: ../gtk/src/scanner/ScannerSane.cc:808 ../qt/src/scanner/ScannerSane.cc:805 msgid "Document feeder out of documents." msgstr "" #: ../gtk/src/scanner/ScannerSane.cc:810 ../qt/src/scanner/ScannerSane.cc:807 msgid "Access to scanner is denied." msgstr "" #: ../gtk/src/SourceManager.cc:118 ../qt/src/SourceManager.cc:124 msgid "PDFs with text" msgstr "" #: ../gtk/src/SourceManager.cc:118 ../qt/src/SourceManager.cc:124 msgid "" "These PDF files already contain text:\n" "%1" msgstr "" #: ../gtk/src/SourceManager.cc:127 ../qt/src/SourceManager.cc:132 msgid "Unable to open files" msgstr "" #: ../gtk/src/SourceManager.cc:127 ../qt/src/SourceManager.cc:132 msgid "The following files could not be opened:%1" msgstr "" #: ../gtk/src/SourceManager.cc:141 ../qt/src/SourceManager.cc:143 msgid "Enter password for file '%1':" msgstr "" #: ../gtk/src/SourceManager.cc:197 ../qt/src/SourceManager.cc:214 msgid "Images and PDFs" msgstr "" #: ../gtk/src/SourceManager.cc:202 ../qt/src/SourceManager.cc:215 msgid "Select Files" msgstr "" #: ../gtk/src/SourceManager.cc:208 ../qt/src/SourceManager.cc:226 msgid "Clipboard Error" msgstr "" #: ../gtk/src/SourceManager.cc:208 ../qt/src/SourceManager.cc:226 msgid "Failed to read the clipboard." msgstr "" #: ../gtk/src/SourceManager.cc:212 ../qt/src/SourceManager.cc:230 #: ../qt/src/SourceManager.cc:236 msgid "Pasted %1" msgstr "" #: ../gtk/src/SourceManager.cc:224 ../qt/src/SourceManager.cc:243 msgid "Screenshot Error" msgstr "" #: ../gtk/src/SourceManager.cc:224 ../qt/src/SourceManager.cc:243 msgid "Failed to take screenshot." msgstr "" #: ../gtk/src/SourceManager.cc:228 ../qt/src/SourceManager.cc:247 msgid "Screenshot %1" msgstr "" #: ../gtk/src/SourceManager.cc:233 ../qt/src/SourceManager.cc:252 msgid "Saving image..." msgstr "" #: ../gtk/src/SourceManager.cc:240 ../qt/src/SourceManager.cc:265 msgid "Cannot Write File" msgstr "" #: ../gtk/src/SourceManager.cc:240 ../qt/src/SourceManager.cc:265 msgid "Could not write to %1." msgstr "" #: ../gtk/src/SourceManager.cc:267 ../qt/src/SourceManager.cc:287 msgid "Delete File?" msgstr "" #: ../gtk/src/SourceManager.cc:267 ../qt/src/SourceManager.cc:287 msgid "The following files will be deleted:%1" msgstr "" #: ../gtk/src/SourceManager.cc:332 ../qt/src/SourceManager.cc:338 msgid "Missing File" msgstr "" #: ../gtk/src/SourceManager.cc:332 ../qt/src/SourceManager.cc:338 msgid "" "The following file has been deleted or moved:\n" "%1" msgstr "" #: ../gtk/src/SubstitutionsManager.cc:33 ../qt/src/SubstitutionsManager.cc:73 msgid "Search for" msgstr "" #: ../gtk/src/SubstitutionsManager.cc:34 ../qt/src/SubstitutionsManager.cc:73 msgid "Replace with" msgstr "" #: ../gtk/src/SubstitutionsManager.cc:69 ../gtk/src/SubstitutionsManager.cc:103 #: ../qt/src/SubstitutionsManager.cc:106 ../qt/src/SubstitutionsManager.cc:143 msgid "Substitutions List" msgstr "" #: ../gtk/src/SubstitutionsManager.cc:70 ../qt/src/SubstitutionsManager.cc:106 msgid "Open Substitutions List" msgstr "" #: ../gtk/src/SubstitutionsManager.cc:75 ../qt/src/SubstitutionsManager.cc:112 msgid "Error Reading File" msgstr "" #: ../gtk/src/SubstitutionsManager.cc:75 ../qt/src/SubstitutionsManager.cc:112 msgid "Unable to read '%1'." msgstr "" #: ../gtk/src/SubstitutionsManager.cc:97 ../qt/src/SubstitutionsManager.cc:137 msgid "Errors Occurred Reading File" msgstr "" #: ../gtk/src/SubstitutionsManager.cc:97 ../qt/src/SubstitutionsManager.cc:137 msgid "Some entries of the substitutions list could not be read." msgstr "" #: ../gtk/src/SubstitutionsManager.cc:104 ../qt/src/SubstitutionsManager.cc:143 msgid "Save Substitutions List" msgstr "" #: ../gtk/src/SubstitutionsManager.cc:110 ../qt/src/SubstitutionsManager.cc:149 msgid "Error Saving File" msgstr "" #: ../gtk/src/SubstitutionsManager.cc:110 ../qt/src/SubstitutionsManager.cc:149 msgid "Unable to write to '%1'." msgstr "" #: ../gtk/src/SubstitutionsManager.cc:127 ../qt/src/SubstitutionsManager.cc:162 msgid "Save List?" msgstr "" #: ../gtk/src/SubstitutionsManager.cc:127 ../qt/src/SubstitutionsManager.cc:162 msgid "Do you want to save the current list?" msgstr "" #: ../gtk/src/TessdataManager.cc:60 ../qt/src/TessdataManager.cc:74 msgid "" "A session connection to the PackageKit backend is required for managing " "system-wide tesseract language packs, but it was not found. This service is " "usually provided by a software-management application such as Gnome " "Software. Please install software which provides the necessary PackageKit " "interface, use other system package management software to manage the " "tesseract language packs directly, or switch to using the user tessdata path " "in the configuration dialog." msgstr "" #: ../gtk/src/TessdataManager.cc:65 ../qt/src/TessdataManager.cc:79 msgid "Fetching available languages" msgstr "" #: ../gtk/src/TessdataManager.cc:70 ../gtk/src/TessdataManager.cc:96 #: ../gtk/src/TessdataManager.cc:197 ../qt/src/TessdataManager.cc:84 #: ../qt/src/TessdataManager.cc:101 ../qt/src/TessdataManager.cc:197 msgid "Failed to fetch list of available languages: %1" msgstr "" #: ../gtk/src/TessdataManager.cc:104 ../qt/src/TessdataManager.cc:113 #: ../qt/src/TessdataManager.cc:122 msgid "Parsing error: %1" msgstr "" #: ../gtk/src/TessdataManager.cc:235 ../qt/src/TessdataManager.cc:232 msgid "Applying changes..." msgstr "" #: ../gtk/src/TessdataManager.cc:297 ../qt/src/TessdataManager.cc:278 msgid "Failed to create directory for tessdata files." msgstr "" #: ../gtk/src/TessdataManager.cc:306 ../qt/src/TessdataManager.cc:287 msgid "Downloading %1..." msgstr "" #: ../gtk/src/TessdataManager.cc:330 msgid "" "The following files could not be downloaded or removed:\n" "%1\n" "\n" "Check the connectivity and directory permissions.\n" "\n" "Hint: If you don't have write permissions in system folders, you can switch " "to user paths in the settings dialog." msgstr "" #: ../gtk/src/Utils.cc:64 msgid "Yes" msgstr "" #: ../gtk/src/Utils.cc:67 msgid "No" msgstr "" #: ../gtk/src/Utils.cc:76 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/CrashHandler.ui.h:3 msgid "" "

Tesseract has " "aborted

Tesseract (the OCR engine) has aborted while " "recognizing text. This may occur if the used traineddatas are corrupt or " "incomplatible with the version of tesseract in use, or due to a bug in " "tesseract.

The stacktrace below may provide additional information " "about where the crash occured.

" msgstr "" #: ../qt/data/MainWindow.ui.h:17 msgid "Flatbed" msgstr "" #: ../qt/data/MainWindow.ui.h:18 msgid "ADF Front" msgstr "" #: ../qt/data/MainWindow.ui.h:19 msgid "ADF Back" msgstr "" #: ../qt/data/MainWindow.ui.h:20 msgid "ADF Duplex" msgstr "" #. Remove & from some labels which designer insists in adding #: ../qt/data/MainWindow.ui.h:21 ../qt/src/Ui_MainWindow.hh:50 msgid "Sources" msgstr "" #: ../qt/data/MainWindow.ui.h:22 msgid "Zoom In" msgstr "" #: ../qt/data/MainWindow.ui.h:24 msgid "Zoom Out" msgstr "" #: ../qt/data/MainWindow.ui.h:26 msgid "Normal Size" msgstr "" #: ../qt/data/MainWindow.ui.h:28 msgid "Best Fit" msgstr "" #: ../qt/data/MainWindow.ui.h:30 msgid "Rotate Left" msgstr "" #: ../qt/data/MainWindow.ui.h:31 msgid "Rotate left" msgstr "" #: ../qt/data/MainWindow.ui.h:32 msgid "Rotate Right" msgstr "" #: ../qt/data/MainWindow.ui.h:33 msgid "Rotate right" msgstr "" #: ../qt/data/MainWindow.ui.h:34 msgid "Image Controls" msgstr "" #: ../qt/data/MainWindow.ui.h:36 msgid "Autodetect Layout" msgstr "" #: ../qt/data/MainWindow.ui.h:38 msgid "Toggle Output Pane" msgstr "" #: ../qt/data/PdfExportDialog.ui.h:5 msgid "Backend:" msgstr "" #: ../qt/data/PdfExportDialog.ui.h:8 msgid "Portrait" msgstr "" #: ../qt/data/PdfExportDialog.ui.h:9 msgid "Landscape" msgstr "" #: ../qt/src/hocr/HOCRPdfExporter.cc:142 msgid "Failed to write to file" msgstr "" #. Output toolbar #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:55 #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:56 msgid "Open hOCR file" msgstr "" #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:57 #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:58 msgid "Save as hOCR text" msgstr "" #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:79 #: ../qt/src/Ui_OutputEditorText.hh:106 msgid "Find and Replace" msgstr "" #: ../qt/src/MainWindow.cc:581 msgid "" "The following dictionary files were installed:\n" "%1" msgstr "" #: ../qt/src/TessdataManager.cc:308 msgid "" "The following files could not be downloaded or removed:\n" "%1\n" "\n" "Check the connectivity and directory permissions.\n" "Hint: If you don't have write permissions in system folders, you can switch " "to user paths in the settings dialog." msgstr "" #: ../qt/src/Ui_MainWindow.hh:51 msgid "Output" msgstr "" #: ../qt/src/Ui_MainWindow.hh:135 msgid "OCR mode:" msgstr "" #: ../qt/src/Ui_MainWindow.hh:209 msgid "Remove Image" msgstr "" #: ../qt/src/Ui_MainWindow.hh:212 msgid "Delete Image" msgstr "" #: ../qt/src/Ui_MainWindow.hh:215 msgid "Clear List" msgstr "" #: ../qt/src/Ui_OutputEditorText.hh:101 msgid "Strip Line Breaks" msgstr "" #: ../qt/src/Ui_OutputEditorText.hh:115 msgid "Save Output" msgstr "" #: ../qt/src/Ui_OutputEditorText.hh:117 msgid "Clear Output" msgstr "" gImageReader-3.3.1/po/sr_Cyrl.po000066400000000000000000001506361351740627400164510ustar00rootroot00000000000000# 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. # msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2019-07-25 23:17+0200\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: Automatically generated\n" "Language-Team: none\n" "Language: sr_Cyrl\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: ../data/gimagereader.desktop.in.h:1 msgid "OCR application" msgstr "" #: ../gtk/data/appmenu.ui.h:1 ../qt/src/Ui_MainWindow.hh:167 msgid "Redetect Languages" msgstr "" #: ../gtk/data/appmenu.ui.h:2 ../qt/src/Ui_MainWindow.hh:170 msgid "Manage Languages" msgstr "" #: ../gtk/data/appmenu.ui.h:3 ../gtk/data/ConfigDialog.ui.h:1 #: ../qt/data/ConfigDialog.ui.h:1 ../qt/src/Ui_MainWindow.hh:173 msgid "Preferences" msgstr "" #: ../gtk/data/appmenu.ui.h:4 ../gtk/data/ConfigDialog.ui.h:2 #: ../gtk/src/MainWindow.cc:482 ../qt/src/MainWindow.cc:481 #: ../qt/src/Ui_MainWindow.hh:178 msgid "Help" msgstr "" #: ../gtk/data/appmenu.ui.h:5 ../qt/data/AboutDialog.ui.h:2 #: ../qt/src/Ui_MainWindow.hh:181 msgid "About" msgstr "" #: ../gtk/data/appmenu.ui.h:6 msgid "Quit" msgstr "" #: ../gtk/data/ConfigDialog.ui.h:3 ../gtk/data/MainWindow.ui.h:47 #: ../gtk/data/OutputEditorHOCR.ui.h:3 ../gtk/data/PdfExportDialog.ui.h:3 #: ../gtk/src/FileDialogs.cc:152 ../gtk/src/Utils.cc:61 #: ../qt/data/ConfigDialog.ui.h:26 msgid "OK" msgstr "" #: ../gtk/data/ConfigDialog.ui.h:4 msgid "Output pane orientation:" msgstr "" #: ../gtk/data/ConfigDialog.ui.h:5 msgid "Horizontal" msgstr "" #: ../gtk/data/ConfigDialog.ui.h:6 msgid "Vertical" msgstr "" #: ../gtk/data/ConfigDialog.ui.h:7 ../qt/data/ConfigDialog.ui.h:18 msgid "Query to install missing spellcheck dictionaries" msgstr "" #: ../gtk/data/ConfigDialog.ui.h:8 ../qt/data/ConfigDialog.ui.h:4 msgid "Automatically check for new program versions" msgstr "" #: ../gtk/data/ConfigDialog.ui.h:9 ../qt/data/ConfigDialog.ui.h:3 msgid "Predefined language definitions:" msgstr "" #: ../gtk/data/ConfigDialog.ui.h:10 ../qt/data/ConfigDialog.ui.h:12 msgid "Additional language definitions:" msgstr "" #: ../gtk/data/ConfigDialog.ui.h:11 ../qt/data/ConfigDialog.ui.h:20 msgid "The prefix of the tesseract language data file" msgstr "" #: ../gtk/data/ConfigDialog.ui.h:12 ../qt/data/ConfigDialog.ui.h:21 msgid "Prefix" msgstr "" #: ../gtk/data/ConfigDialog.ui.h:13 ../qt/data/ConfigDialog.ui.h:22 msgid "The ISO 639-1 language code followed by the country code" msgstr "" #: ../gtk/data/ConfigDialog.ui.h:14 ../qt/data/ConfigDialog.ui.h:23 msgid "ISO Code" msgstr "" #: ../gtk/data/ConfigDialog.ui.h:15 ../qt/data/ConfigDialog.ui.h:24 msgid "The name of the language" msgstr "" #: ../gtk/data/ConfigDialog.ui.h:16 ../qt/data/ConfigDialog.ui.h:25 msgid "Name" msgstr "" #: ../gtk/data/ConfigDialog.ui.h:17 ../gtk/data/MainWindow.ui.h:46 #: ../gtk/data/OutputEditorHOCR.ui.h:2 ../gtk/data/PdfExportDialog.ui.h:2 #: ../gtk/src/Acquirer.cc:34 ../gtk/src/FileDialogs.cc:151 #: ../gtk/src/Utils.cc:70 ../qt/data/ConfigDialog.ui.h:27 #: ../qt/data/MainWindow.ui.h:12 msgid "Cancel" msgstr "" #: ../gtk/data/ConfigDialog.ui.h:18 ../qt/data/ConfigDialog.ui.h:5 msgid "Output pane font:" msgstr "" #: ../gtk/data/ConfigDialog.ui.h:19 ../qt/data/ConfigDialog.ui.h:2 msgid "Default" msgstr "" #: ../gtk/data/ConfigDialog.ui.h:20 ../qt/data/ConfigDialog.ui.h:6 msgid "Language data locations:" msgstr "" #: ../gtk/data/ConfigDialog.ui.h:21 ../qt/data/ConfigDialog.ui.h:13 msgid "Language definitions path:" msgstr "" #: ../gtk/data/ConfigDialog.ui.h:22 ../qt/data/ConfigDialog.ui.h:28 msgid "Spelling dictionaries path:" msgstr "" #: ../gtk/data/ConfigDialog.ui.h:23 ../qt/data/ConfigDialog.ui.h:10 msgid "System-wide paths" msgstr "" #: ../gtk/data/ConfigDialog.ui.h:24 ../qt/data/ConfigDialog.ui.h:11 msgid "User paths" msgstr "" #: ../gtk/data/ConfigDialog.ui.h:25 ../qt/data/ConfigDialog.ui.h:29 msgid "Automatically open exported documents with default application" msgstr "" #: ../gtk/data/CrashHandler.ui.h:1 ../qt/src/CrashHandler.cc:38 msgid "Regenerate backtrace" msgstr "" #: ../gtk/data/CrashHandler.ui.h:3 #, no-c-format msgid "" "The application has crashed\n" "\n" "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/CrashHandler.ui.h:6 msgid "" "Tesseract has aborted\n" "\n" "Tesseract (the OCR engine) has aborted while recognizing text. This may " "occur if the used traineddatas are corrupt or incomplatible with the version " "of tesseract in use, or due to a bug in tesseract.\n" "\n" "The stacktrace below may provide additional information about where the " "crash occured.\n" msgstr "" #: ../gtk/data/MainWindow.ui.h:1 ../qt/data/MainWindow.ui.h:39 msgid "Toggle output pane" msgstr "" #: ../gtk/data/MainWindow.ui.h:2 ../qt/src/Ui_MainWindow.hh:66 msgid "Rotate current page" msgstr "" #: ../gtk/data/MainWindow.ui.h:3 ../qt/src/Ui_MainWindow.hh:67 msgid "Rotate all pages" msgstr "" #. Sources toolbar #: ../gtk/data/MainWindow.ui.h:4 ../qt/src/Ui_MainWindow.hh:192 msgid "Recent" msgstr "" #: ../gtk/data/MainWindow.ui.h:5 ../qt/src/Ui_MainWindow.hh:193 msgid "Paste" msgstr "" #: ../gtk/data/MainWindow.ui.h:6 ../qt/src/Ui_MainWindow.hh:194 msgid "Take Screenshot" msgstr "" #: ../gtk/data/MainWindow.ui.h:7 ../qt/data/MainWindow.ui.h:23 msgid "Zoom in" msgstr "" #: ../gtk/data/MainWindow.ui.h:8 ../qt/data/MainWindow.ui.h:25 msgid "Zoom out" msgstr "" #: ../gtk/data/MainWindow.ui.h:9 ../qt/data/MainWindow.ui.h:27 msgid "Normal size" msgstr "" #: ../gtk/data/MainWindow.ui.h:10 ../qt/data/MainWindow.ui.h:29 msgid "Best fit" msgstr "" #: ../gtk/data/MainWindow.ui.h:11 ../qt/src/Ui_MainWindow.hh:75 msgid "Select rotation mode" msgstr "" #: ../gtk/data/MainWindow.ui.h:12 ../gtk/data/OutputEditorText.ui.h:13 #: ../qt/src/Ui_OutputEditorText.hh:95 msgid "Select insert mode" msgstr "" #: ../gtk/data/MainWindow.ui.h:13 ../qt/src/Ui_MainWindow.hh:109 msgid "Select page" msgstr "" #: ../gtk/data/MainWindow.ui.h:14 ../qt/data/MainWindow.ui.h:35 msgid "Image controls" msgstr "" #: ../gtk/data/MainWindow.ui.h:15 ../qt/src/Ui_MainWindow.hh:139 msgid "Plain text" msgstr "" #: ../gtk/data/MainWindow.ui.h:16 ../qt/src/Ui_MainWindow.hh:139 msgid "hOCR, PDF" msgstr "" #: ../gtk/data/MainWindow.ui.h:17 ../qt/data/MainWindow.ui.h:37 msgid "Autodetect layout" msgstr "" #: ../gtk/data/MainWindow.ui.h:18 msgid "Recognize all" msgstr "" #: ../gtk/data/MainWindow.ui.h:19 msgid "Select language" msgstr "" #: ../gtk/data/MainWindow.ui.h:20 ../qt/src/Ui_MainWindow.hh:205 msgid "Add images" msgstr "" #: ../gtk/data/MainWindow.ui.h:21 ../qt/src/Ui_MainWindow.hh:204 msgid "Add Images" msgstr "" #: ../gtk/data/MainWindow.ui.h:22 ../qt/src/Ui_MainWindow.hh:210 msgid "Remove image from list" msgstr "" #: ../gtk/data/MainWindow.ui.h:23 ../qt/src/Ui_MainWindow.hh:213 msgid "Delete image" msgstr "" #: ../gtk/data/MainWindow.ui.h:24 ../qt/src/Ui_MainWindow.hh:216 msgid "Clear list" msgstr "" #: ../gtk/data/MainWindow.ui.h:25 ../qt/data/MainWindow.ui.h:5 msgid "Files" msgstr "" #: ../gtk/data/MainWindow.ui.h:26 ../qt/data/MainWindow.ui.h:8 msgid "Device:" msgstr "" #: ../gtk/data/MainWindow.ui.h:27 ../gtk/data/TessdataManager.ui.h:4 #: ../qt/data/MainWindow.ui.h:7 ../qt/src/TessdataManager.cc:59 msgid "Refresh" msgstr "" #: ../gtk/data/MainWindow.ui.h:28 ../qt/data/MainWindow.ui.h:9 msgid "Output:" msgstr "" #: ../gtk/data/MainWindow.ui.h:29 ../qt/data/MainWindow.ui.h:13 msgid "Mode:" msgstr "" #: ../gtk/data/MainWindow.ui.h:30 ../gtk/src/hocr/HOCRPdfExporter.cc:313 #: ../qt/data/MainWindow.ui.h:15 ../qt/src/hocr/HOCRPdfExporter.cc:347 msgid "Color" msgstr "" #: ../gtk/data/MainWindow.ui.h:31 ../gtk/src/hocr/HOCRPdfExporter.cc:316 #: ../qt/data/MainWindow.ui.h:14 ../qt/src/hocr/HOCRPdfExporter.cc:349 #: ../qt/src/hocr/HOCRPdfExporter.cc:351 msgid "Grayscale" msgstr "" #: ../gtk/data/MainWindow.ui.h:32 ../qt/data/MainWindow.ui.h:10 msgid "Resolution:" msgstr "" #: ../gtk/data/MainWindow.ui.h:33 ../qt/data/MainWindow.ui.h:11 msgid "Scan" msgstr "" #: ../gtk/data/MainWindow.ui.h:34 ../qt/data/MainWindow.ui.h:16 msgid "Source:" msgstr "" #: ../gtk/data/MainWindow.ui.h:35 ../qt/data/MainWindow.ui.h:6 msgid "Acquire" msgstr "" #: ../gtk/data/MainWindow.ui.h:36 ../qt/data/MainWindow.ui.h:1 msgid "Brightness" msgstr "" #: ../gtk/data/MainWindow.ui.h:37 ../qt/data/MainWindow.ui.h:2 msgid "Contrast" msgstr "" #: ../gtk/data/MainWindow.ui.h:38 ../qt/data/MainWindow.ui.h:3 msgid "Resolution" msgstr "" #: ../gtk/data/MainWindow.ui.h:39 ../qt/data/MainWindow.ui.h:4 msgid "Invert colors" msgstr "" #: ../gtk/data/MainWindow.ui.h:40 msgid "A graphical frontend to tesseract-ocr" msgstr "" #: ../gtk/data/MainWindow.ui.h:41 ../qt/data/CharacterListDialog.ui.h:1 msgid "Character whitelist / blacklist" msgstr "" #: ../gtk/data/MainWindow.ui.h:42 ../qt/data/CharacterListDialog.ui.h:2 msgid "Exclude these characters from being recognized (blacklist):" msgstr "" #: ../gtk/data/MainWindow.ui.h:43 ../qt/data/CharacterListDialog.ui.h:3 msgid "Enter a string of characters..." msgstr "" #: ../gtk/data/MainWindow.ui.h:44 ../qt/data/CharacterListDialog.ui.h:4 msgid "Only allow the following characters to be recognized (whitelist):" msgstr "" #: ../gtk/data/MainWindow.ui.h:45 ../qt/data/PageRangeDialog.ui.h:1 msgid "Page Range" msgstr "" #: ../gtk/data/MainWindow.ui.h:48 ../qt/data/PageRangeDialog.ui.h:2 msgid "Page range:" msgstr "" #: ../gtk/data/MainWindow.ui.h:49 ../qt/data/PageRangeDialog.ui.h:3 msgid "Example: 1-10, 13, 14-18" msgstr "" #: ../gtk/data/MainWindow.ui.h:50 ../qt/data/PageRangeDialog.ui.h:4 msgid "Recognition area:" msgstr "" #: ../gtk/data/MainWindow.ui.h:51 ../gtk/src/Recognizer.cc:375 #: ../qt/data/PageRangeDialog.ui.h:5 ../qt/src/Recognizer.cc:369 msgid "Entire page" msgstr "" #: ../gtk/data/MainWindow.ui.h:52 ../qt/data/PageRangeDialog.ui.h:6 msgid "Autodetect" msgstr "" #: ../gtk/data/MainWindow.ui.h:53 ../qt/data/PageRangeDialog.ui.h:7 msgid "Prepend to output text:" msgstr "" #: ../gtk/data/MainWindow.ui.h:54 ../qt/data/PageRangeDialog.ui.h:8 msgid "Source filename" msgstr "" #: ../gtk/data/MainWindow.ui.h:55 ../qt/data/PageRangeDialog.ui.h:9 msgid "Source page" msgstr "" #: ../gtk/data/MainWindow.ui.h:56 ../qt/src/SourceManager.cc:146 msgid "Protected PDF" msgstr "" #: ../gtk/data/MainWindow.ui.h:57 ../qt/src/Recognizer.cc:76 msgid "Current Page" msgstr "" #: ../gtk/data/MainWindow.ui.h:58 ../qt/src/Recognizer.cc:79 msgid "Multiple Pages..." msgstr "" #: ../gtk/data/OutputEditorHOCR.ui.h:1 ../qt/src/hocr/OutputEditorHOCR.cc:580 msgid "Add Word" msgstr "" #: ../gtk/data/OutputEditorHOCR.ui.h:4 ../qt/src/hocr/OutputEditorHOCR.cc:580 msgid "Enter word:" msgstr "" #: ../gtk/data/OutputEditorHOCR.ui.h:5 ../qt/src/hocr/Ui_OutputEditorHOCR.hh:61 #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:62 msgid "Export to plain text" msgstr "" #: ../gtk/data/OutputEditorHOCR.ui.h:6 ../qt/src/hocr/Ui_OutputEditorHOCR.hh:64 #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:65 msgid "Export to PDF" msgstr "" #: ../gtk/data/OutputEditorHOCR.ui.h:7 ../qt/src/hocr/Ui_OutputEditorHOCR.hh:67 #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:68 msgid "Export to ODT" msgstr "" #: ../gtk/data/OutputEditorHOCR.ui.h:8 ../gtk/data/OutputEditorText.ui.h:18 #: ../qt/src/Ui_OutputEditorText.hh:116 msgid "Save output" msgstr "" #: ../gtk/data/OutputEditorHOCR.ui.h:9 ../qt/src/hocr/Ui_OutputEditorHOCR.hh:72 #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:73 msgid "Export" msgstr "" #: ../gtk/data/OutputEditorHOCR.ui.h:10 ../gtk/data/OutputEditorText.ui.h:19 #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:77 #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:78 #: ../qt/src/Ui_OutputEditorText.hh:118 msgid "Clear output" msgstr "" #: ../gtk/data/OutputEditorHOCR.ui.h:11 ../gtk/data/OutputEditorText.ui.h:15 #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:80 #: ../qt/src/Ui_OutputEditorText.hh:107 msgid "Find and replace" msgstr "" #: ../gtk/data/OutputEditorHOCR.ui.h:12 #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:82 #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:83 msgid "Show confidence values" msgstr "" #: ../gtk/data/OutputEditorHOCR.ui.h:13 ../gtk/data/PdfExportDialog.ui.h:41 #: ../qt/data/PdfExportDialog.ui.h:2 ../qt/src/hocr/Ui_OutputEditorHOCR.hh:85 #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:86 msgid "Show preview" msgstr "" #: ../gtk/data/OutputEditorHOCR.ui.h:14 #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:121 msgid "Next (F3)" msgstr "" #: ../gtk/data/OutputEditorHOCR.ui.h:15 #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:122 msgid "Previous (Shift+F3)" msgstr "" #: ../gtk/data/OutputEditorHOCR.ui.h:16 ../gtk/src/hocr/OutputEditorHOCR.cc:890 #: ../qt/src/hocr/OutputEditorHOCR.cc:730 #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:126 msgid "Expand all" msgstr "" #: ../gtk/data/OutputEditorHOCR.ui.h:17 ../gtk/src/hocr/OutputEditorHOCR.cc:893 #: ../qt/src/hocr/OutputEditorHOCR.cc:731 #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:127 msgid "Collapse all" msgstr "" #: ../gtk/data/OutputEditorHOCR.ui.h:18 #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:148 msgid "Properties" msgstr "" #: ../gtk/data/OutputEditorHOCR.ui.h:19 #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:152 msgid "Source" msgstr "" #. Output insert mode #: ../gtk/data/OutputEditorText.ui.h:1 ../qt/src/Ui_OutputEditorText.hh:52 msgid "Append to current text" msgstr "" #: ../gtk/data/OutputEditorText.ui.h:2 ../qt/src/Ui_OutputEditorText.hh:53 msgid "Insert at cursor" msgstr "" #: ../gtk/data/OutputEditorText.ui.h:3 ../qt/src/Ui_OutputEditorText.hh:54 msgid "Replace current text" msgstr "" #. Output postprocessing #: ../gtk/data/OutputEditorText.ui.h:4 ../qt/src/Ui_OutputEditorText.hh:62 msgid "Keep line break if..." msgstr "" #: ../gtk/data/OutputEditorText.ui.h:5 ../qt/src/Ui_OutputEditorText.hh:64 msgid "Preceded by end mark (.?!)" msgstr "" #: ../gtk/data/OutputEditorText.ui.h:6 ../qt/src/Ui_OutputEditorText.hh:66 msgid "Preceded or succeeded by quote" msgstr "" #: ../gtk/data/OutputEditorText.ui.h:7 ../qt/src/Ui_OutputEditorText.hh:68 msgid "Other options" msgstr "" #: ../gtk/data/OutputEditorText.ui.h:8 ../qt/src/Ui_OutputEditorText.hh:70 msgid "Join hyphenated words" msgstr "" #: ../gtk/data/OutputEditorText.ui.h:9 ../qt/src/Ui_OutputEditorText.hh:72 msgid "Collapse whitespace" msgstr "" #: ../gtk/data/OutputEditorText.ui.h:10 ../qt/src/Ui_OutputEditorText.hh:74 msgid "Preserve paragraphs" msgstr "" #: ../gtk/data/OutputEditorText.ui.h:11 ../qt/src/Ui_OutputEditorText.hh:76 msgid "Visual aids" msgstr "" #: ../gtk/data/OutputEditorText.ui.h:12 ../qt/src/Ui_OutputEditorText.hh:78 msgid "Draw whitespace" msgstr "" #: ../gtk/data/OutputEditorText.ui.h:14 ../qt/src/Ui_OutputEditorText.hh:102 msgid "Strip line breaks on selected text" msgstr "" #: ../gtk/data/OutputEditorText.ui.h:16 ../qt/src/Ui_OutputEditorText.hh:109 #: ../qt/src/Ui_OutputEditorText.hh:110 msgid "Undo" msgstr "" #: ../gtk/data/OutputEditorText.ui.h:17 ../qt/src/Ui_OutputEditorText.hh:112 #: ../qt/src/Ui_OutputEditorText.hh:113 msgid "Redo" msgstr "" #: ../gtk/data/PdfExportDialog.ui.h:1 ../qt/data/PdfExportDialog.ui.h:1 msgid "PDF Export" msgstr "" #: ../gtk/data/PdfExportDialog.ui.h:4 ../qt/data/PdfExportDialog.ui.h:4 msgid "Output mode:" msgstr "" #: ../gtk/data/PdfExportDialog.ui.h:5 ../qt/data/PdfExportDialog.ui.h:6 msgid "PDF" msgstr "" #: ../gtk/data/PdfExportDialog.ui.h:6 ../qt/data/PdfExportDialog.ui.h:7 msgid "PDF with invisible text overlay" msgstr "" #: ../gtk/data/PdfExportDialog.ui.h:7 ../qt/data/PdfExportDialog.ui.h:16 msgid "Format:" msgstr "" #: ../gtk/data/PdfExportDialog.ui.h:8 ../qt/data/PdfExportDialog.ui.h:17 msgid "Compression:" msgstr "" #: ../gtk/data/PdfExportDialog.ui.h:9 ../qt/data/PdfExportDialog.ui.h:14 msgid "Compression quality:" msgstr "" #: ../gtk/data/PdfExportDialog.ui.h:10 ../qt/data/PdfExportDialog.ui.h:15 msgid "DPI:" msgstr "" #: ../gtk/data/PdfExportDialog.ui.h:11 ../qt/data/PdfExportDialog.ui.h:18 msgid "Dithering algorithm:" msgstr "" #: ../gtk/data/PdfExportDialog.ui.h:12 ../qt/data/PdfExportDialog.ui.h:13 msgid "Image settings:" msgstr "" #: ../gtk/data/PdfExportDialog.ui.h:13 ../qt/data/PdfExportDialog.ui.h:25 msgid "Uniformize line and word spacing" msgstr "" #: ../gtk/data/PdfExportDialog.ui.h:14 ../qt/data/PdfExportDialog.ui.h:21 msgid "Override font family:" msgstr "" #: ../gtk/data/PdfExportDialog.ui.h:15 ../qt/data/PdfExportDialog.ui.h:27 msgid "Fallback font family:" msgstr "" #: ../gtk/data/PdfExportDialog.ui.h:16 ../qt/data/PdfExportDialog.ui.h:20 msgid "Override font size:" msgstr "" #: ../gtk/data/PdfExportDialog.ui.h:17 ../qt/data/PdfExportDialog.ui.h:23 msgid "Font scaling:" msgstr "" #: ../gtk/data/PdfExportDialog.ui.h:18 ../qt/data/PdfExportDialog.ui.h:26 msgid "pt" msgstr "" #: ../gtk/data/PdfExportDialog.ui.h:19 ../qt/data/PdfExportDialog.ui.h:22 msgid "Preserve spaces wider than:" msgstr "" #: ../gtk/data/PdfExportDialog.ui.h:20 ../qt/data/PdfExportDialog.ui.h:24 msgid "characters" msgstr "" #: ../gtk/data/PdfExportDialog.ui.h:21 ../qt/data/PdfExportDialog.ui.h:28 msgid "Sanitize hyphens before line breaks" msgstr "" #: ../gtk/data/PdfExportDialog.ui.h:22 ../qt/data/PdfExportDialog.ui.h:19 msgid "Text settings:" msgstr "" #: ../gtk/data/PdfExportDialog.ui.h:23 ../qt/data/PdfExportDialog.ui.h:10 msgid "Paper size:" msgstr "" #: ../gtk/data/PdfExportDialog.ui.h:24 ../qt/data/PdfExportDialog.ui.h:11 msgid "Width" msgstr "" #: ../gtk/data/PdfExportDialog.ui.h:25 ../qt/data/PdfExportDialog.ui.h:12 msgid "Height" msgstr "" #: ../gtk/data/PdfExportDialog.ui.h:26 ../qt/data/PdfExportDialog.ui.h:29 msgid "Treat image sources as having true DPI:" msgstr "" #: ../gtk/data/PdfExportDialog.ui.h:27 ../qt/data/PdfExportDialog.ui.h:3 msgid "Basic" msgstr "" #: ../gtk/data/PdfExportDialog.ui.h:28 ../qt/data/PdfExportDialog.ui.h:31 msgid "PDF version:" msgstr "" #: ../gtk/data/PdfExportDialog.ui.h:29 ../qt/data/PdfExportDialog.ui.h:33 msgid "Password:" msgstr "" #: ../gtk/data/PdfExportDialog.ui.h:30 ../qt/data/PdfExportDialog.ui.h:34 msgid "Confirm password:" msgstr "" #: ../gtk/data/PdfExportDialog.ui.h:31 ../qt/data/PdfExportDialog.ui.h:32 msgid "Encryption (optional):" msgstr "" #: ../gtk/data/PdfExportDialog.ui.h:32 ../qt/data/PdfExportDialog.ui.h:36 msgid "Author:" msgstr "" #: ../gtk/data/PdfExportDialog.ui.h:33 ../qt/data/PdfExportDialog.ui.h:38 msgid "Title:" msgstr "" #: ../gtk/data/PdfExportDialog.ui.h:34 ../qt/data/PdfExportDialog.ui.h:40 msgid "Subject:" msgstr "" #: ../gtk/data/PdfExportDialog.ui.h:35 ../qt/data/PdfExportDialog.ui.h:37 msgid "Creator:" msgstr "" #: ../gtk/data/PdfExportDialog.ui.h:36 ../qt/data/PdfExportDialog.ui.h:39 msgid "Producer:" msgstr "" #: ../gtk/data/PdfExportDialog.ui.h:37 ../qt/data/PdfExportDialog.ui.h:41 msgid "Keywords:" msgstr "" #: ../gtk/data/PdfExportDialog.ui.h:38 ../qt/data/PdfExportDialog.ui.h:35 msgid "Additional information (optional):" msgstr "" #: ../gtk/data/PdfExportDialog.ui.h:39 ../qt/data/PdfExportDialog.ui.h:42 msgid "Import from current source" msgstr "" #: ../gtk/data/PdfExportDialog.ui.h:40 ../qt/data/PdfExportDialog.ui.h:30 msgid "Advanced" msgstr "" #: ../gtk/data/SearchReplaceFrame.ui.h:1 ../qt/data/SearchReplaceFrame.ui.h:4 msgid "Find" msgstr "" #: ../gtk/data/SearchReplaceFrame.ui.h:2 ../qt/data/SearchReplaceFrame.ui.h:2 msgid "Replace" msgstr "" #: ../gtk/data/SearchReplaceFrame.ui.h:3 ../qt/data/SearchReplaceFrame.ui.h:3 msgid "Replace all" msgstr "" #: ../gtk/data/SearchReplaceFrame.ui.h:4 ../qt/data/SearchReplaceFrame.ui.h:5 msgid "Find previous" msgstr "" #: ../gtk/data/SearchReplaceFrame.ui.h:5 ../qt/data/SearchReplaceFrame.ui.h:6 msgid "Find next" msgstr "" #: ../gtk/data/SearchReplaceFrame.ui.h:6 ../qt/data/SearchReplaceFrame.ui.h:7 msgid "Match case" msgstr "" #: ../gtk/data/SearchReplaceFrame.ui.h:7 #: ../gtk/data/SubstitutionsManager.ui.h:1 ../qt/data/SearchReplaceFrame.ui.h:1 #: ../qt/src/SubstitutionsManager.cc:36 msgid "Substitutions" msgstr "" #: ../gtk/data/SelectionMenu.ui.h:1 ../qt/src/DisplayerToolSelect.cc:239 msgid "Delete" msgstr "" #: ../gtk/data/SelectionMenu.ui.h:2 ../qt/src/DisplayerToolSelect.cc:225 msgid "Order:" msgstr "" #: ../gtk/data/SelectionMenu.ui.h:3 ../gtk/src/hocr/DisplayerToolHOCR.cc:29 #: ../qt/src/DisplayerToolSelect.cc:240 ../qt/src/hocr/DisplayerToolHOCR.cc:31 msgid "Recognize" msgstr "" #: ../gtk/data/SelectionMenu.ui.h:4 ../qt/src/DisplayerToolSelect.cc:241 msgid "Recognize to clipboard" msgstr "" #: ../gtk/data/SelectionMenu.ui.h:5 ../qt/src/DisplayerToolSelect.cc:242 msgid "Save as image" msgstr "" #: ../gtk/data/SubstitutionsManager.ui.h:2 ../qt/src/SubstitutionsManager.cc:38 #: ../qt/src/SubstitutionsManager.cc:39 msgid "Open" msgstr "" #: ../gtk/data/SubstitutionsManager.ui.h:3 ../gtk/src/Utils.cc:73 #: ../qt/src/SubstitutionsManager.cc:41 ../qt/src/SubstitutionsManager.cc:42 msgid "Save" msgstr "" #: ../gtk/data/SubstitutionsManager.ui.h:4 ../qt/src/SubstitutionsManager.cc:44 #: ../qt/src/SubstitutionsManager.cc:45 msgid "Clear" msgstr "" #: ../gtk/data/SubstitutionsManager.ui.h:5 ../qt/data/ConfigDialog.ui.h:16 #: ../qt/src/SubstitutionsManager.cc:47 ../qt/src/SubstitutionsManager.cc:48 msgid "Add" msgstr "" #: ../gtk/data/SubstitutionsManager.ui.h:6 #: ../gtk/src/hocr/OutputEditorHOCR.cc:886 ../qt/data/ConfigDialog.ui.h:17 #: ../qt/src/hocr/OutputEditorHOCR.cc:727 ../qt/src/SubstitutionsManager.cc:50 #: ../qt/src/SubstitutionsManager.cc:51 msgid "Remove" msgstr "" #: ../gtk/data/SubstitutionsManager.ui.h:7 ../gtk/data/TessdataManager.ui.h:2 msgid "Apply" msgstr "" #: ../gtk/data/SubstitutionsManager.ui.h:8 ../gtk/data/TessdataManager.ui.h:3 msgid "Close" msgstr "" #: ../gtk/data/TessdataManager.ui.h:1 ../qt/src/TessdataManager.cc:49 msgid "Tessdata Manager" msgstr "" #: ../gtk/data/TessdataManager.ui.h:5 ../qt/src/TessdataManager.cc:51 msgid "Manage installed languages:" msgstr "" #: ../gtk/src/Acquirer.cc:79 ../qt/src/Acquirer.cc:70 msgid "scan.png" msgstr "" #: ../gtk/src/Acquirer.cc:91 ../qt/src/Acquirer.cc:85 msgid "Images" msgstr "" #: ../gtk/src/Acquirer.cc:92 ../qt/src/Acquirer.cc:86 msgid "Choose Output Filename..." msgstr "" #: ../gtk/src/Acquirer.cc:106 ../qt/src/Acquirer.cc:100 msgid "Failed to initialize the scanning backend." msgstr "" #: ../gtk/src/Acquirer.cc:115 ../qt/src/Acquirer.cc:106 msgid "Scan failed" msgstr "" #: ../gtk/src/Acquirer.cc:133 ../qt/src/Acquirer.cc:122 msgid "No scanners were detected." msgstr "" #: ../gtk/src/Acquirer.cc:150 ../gtk/src/Acquirer.cc:168 #: ../qt/src/Acquirer.cc:136 ../qt/src/Acquirer.cc:154 msgid "Starting scan..." msgstr "" #: ../gtk/src/Acquirer.cc:164 ../qt/src/Acquirer.cc:150 msgid "Opening device..." msgstr "" #: ../gtk/src/Acquirer.cc:166 ../qt/src/Acquirer.cc:152 msgid "Setting options..." msgstr "" #: ../gtk/src/Acquirer.cc:170 ../qt/src/Acquirer.cc:156 msgid "Getting parameters..." msgstr "" #: ../gtk/src/Acquirer.cc:172 ../qt/src/Acquirer.cc:158 msgid "Transferring data..." msgstr "" #: ../gtk/src/Acquirer.cc:179 ../qt/src/Acquirer.cc:165 msgid "Canceling scan..." msgstr "" #: ../gtk/src/Config.cc:49 ../qt/data/ConfigDialog.ui.h:7 msgid "Filename prefix" msgstr "" #: ../gtk/src/Config.cc:50 ../qt/data/ConfigDialog.ui.h:8 msgid "Code" msgstr "" #: ../gtk/src/Config.cc:51 ../qt/data/ConfigDialog.ui.h:9 msgid "Native name" msgstr "" #: ../gtk/src/Config.cc:109 ../qt/src/Config.cc:108 msgid "Script" msgstr "" #: ../gtk/src/CrashHandler.cc:25 ../gtk/src/CrashHandler.cc:41 #: ../qt/src/CrashHandler.cc:36 msgid "Crash Handler" msgstr "" #: ../gtk/src/CrashHandler.cc:43 ../qt/src/CrashHandler.cc:31 msgid "Your work has been saved under %1." msgstr "" #: ../gtk/src/CrashHandler.cc:45 ../qt/src/CrashHandler.cc:33 msgid "There was no unsaved work." msgstr "" #: ../gtk/src/CrashHandler.cc:106 ../qt/src/CrashHandler.cc:62 msgid "Failed to obtain backtrace. Is gdb installed?" msgstr "" #: ../gtk/src/Displayer.cc:232 ../qt/src/Displayer.cc:174 msgid "Failed to load image" msgstr "" #: ../gtk/src/Displayer.cc:232 ../qt/src/Displayer.cc:174 msgid "" "The file might not be an image or be corrupt:\n" "%1" msgstr "" #: ../gtk/src/DisplayerToolSelect.cc:138 ../qt/src/DisplayerToolSelect.cc:135 msgid "PNG Images" msgstr "" #: ../gtk/src/DisplayerToolSelect.cc:139 ../qt/src/DisplayerToolSelect.cc:135 msgid "Save Selection Image" msgstr "" #: ../gtk/src/DisplayerToolSelect.cc:139 ../qt/src/DisplayerToolSelect.cc:135 msgid "selection.png" msgstr "" #: ../gtk/src/DisplayerToolSelect.cc:146 ../qt/src/DisplayerToolSelect.cc:142 msgid "Recognize all" msgstr "" #: ../gtk/src/DisplayerToolSelect.cc:146 ../qt/src/DisplayerToolSelect.cc:142 msgid "Recognize selection" msgstr "" #: ../gtk/src/DisplayerToolSelect.cc:186 ../qt/src/DisplayerToolSelect.cc:182 msgid "Performing layout analysis" msgstr "" #: ../gtk/src/FileDialogs.cc:235 msgid "" "A file named \"%1\" already exists. Are you sure you want to overwrite it?" msgstr "" #: ../gtk/src/FileDialogs.cc:237 msgid "Overwrite File?" msgstr "" #: ../gtk/src/hocr/HOCRDocument.cc:611 ../gtk/src/hocr/OutputEditorHOCR.cc:266 #: ../qt/src/hocr/OutputEditorHOCR.cc:229 msgid "Page" msgstr "" #: ../gtk/src/hocr/HOCRDocument.cc:613 ../qt/src/hocr/HOCRDocument.cc:530 msgid "Text block" msgstr "" #: ../gtk/src/hocr/HOCRDocument.cc:615 ../gtk/src/hocr/OutputEditorHOCR.cc:272 #: ../qt/src/hocr/HOCRDocument.cc:532 ../qt/src/hocr/OutputEditorHOCR.cc:231 msgid "Paragraph" msgstr "" #: ../gtk/src/hocr/HOCRDocument.cc:617 ../qt/src/hocr/HOCRDocument.cc:534 msgid "Textline" msgstr "" #: ../gtk/src/hocr/HOCRDocument.cc:621 ../qt/src/hocr/HOCRDocument.cc:538 msgid "Graphic" msgstr "" #: ../gtk/src/hocr/HOCROdtExporter.cc:65 ../gtk/src/hocr/HOCRPdfExporter.cc:489 #: ../gtk/src/hocr/HOCRTextExporter.cc:34 #: ../gtk/src/hocr/OutputEditorHOCR.cc:963 ../gtk/src/OutputEditorText.cc:272 #: ../qt/src/hocr/HOCROdtExporter.cc:50 ../qt/src/hocr/HOCRPdfExporter.cc:478 #: ../qt/src/hocr/HOCRTextExporter.cc:36 ../qt/src/hocr/OutputEditorHOCR.cc:830 #: ../qt/src/OutputEditorText.cc:238 msgid "output" msgstr "" #: ../gtk/src/hocr/HOCROdtExporter.cc:68 ../qt/src/hocr/HOCROdtExporter.cc:53 msgid "OpenDocument Text Documents" msgstr "" #: ../gtk/src/hocr/HOCROdtExporter.cc:69 ../qt/src/hocr/HOCROdtExporter.cc:53 msgid "Save ODT Output..." msgstr "" #: ../gtk/src/hocr/HOCROdtExporter.cc:77 ../gtk/src/hocr/HOCROdtExporter.cc:342 #: ../gtk/src/hocr/HOCRPdfExporter.cc:619 #: ../gtk/src/hocr/HOCRTextExporter.cc:46 ../qt/src/hocr/HOCROdtExporter.cc:61 #: ../qt/src/hocr/HOCRPdfExporter.cc:609 ../qt/src/hocr/HOCRTextExporter.cc:47 msgid "Export failed" msgstr "" #: ../gtk/src/hocr/HOCROdtExporter.cc:77 ../gtk/src/hocr/HOCROdtExporter.cc:342 #: ../qt/src/hocr/HOCROdtExporter.cc:61 msgid "The ODT export failed: unable to write output file." msgstr "" #: ../gtk/src/hocr/HOCROdtExporter.cc:336 ../qt/src/hocr/HOCROdtExporter.cc:254 msgid "Exporting to ODT..." msgstr "" #: ../gtk/src/hocr/HOCRPdfExporter.cc:283 ../qt/src/hocr/HOCRPdfExporter.cc:365 msgid "Same as source" msgstr "" #: ../gtk/src/hocr/HOCRPdfExporter.cc:286 ../qt/src/hocr/HOCRPdfExporter.cc:366 msgid "Custom" msgstr "" #: ../gtk/src/hocr/HOCRPdfExporter.cc:300 ../qt/src/hocr/HOCRPdfExporter.cc:362 msgid "cm" msgstr "" #: ../gtk/src/hocr/HOCRPdfExporter.cc:303 ../qt/src/hocr/HOCRPdfExporter.cc:363 msgid "in" msgstr "" #: ../gtk/src/hocr/HOCRPdfExporter.cc:319 ../qt/src/hocr/HOCRPdfExporter.cc:353 msgid "Monochrome" msgstr "" #: ../gtk/src/hocr/HOCRPdfExporter.cc:328 ../qt/src/hocr/HOCRPdfExporter.cc:355 msgid "Threshold (closest color)" msgstr "" #: ../gtk/src/hocr/HOCRPdfExporter.cc:331 ../qt/src/hocr/HOCRPdfExporter.cc:356 msgid "Diffuse" msgstr "" #: ../gtk/src/hocr/HOCRPdfExporter.cc:340 ../qt/src/hocr/HOCRPdfExporter.cc:357 msgid "Zip (lossless)" msgstr "" #: ../gtk/src/hocr/HOCRPdfExporter.cc:344 ../qt/src/hocr/HOCRPdfExporter.cc:358 msgid "CCITT Group 4 (lossless)" msgstr "" #: ../gtk/src/hocr/HOCRPdfExporter.cc:348 ../qt/src/hocr/HOCRPdfExporter.cc:359 msgid "Jpeg (lossy)" msgstr "" #: ../gtk/src/hocr/HOCRPdfExporter.cc:493 ../qt/src/hocr/HOCRPdfExporter.cc:482 msgid "PDF Files" msgstr "" #: ../gtk/src/hocr/HOCRPdfExporter.cc:494 ../qt/src/hocr/HOCRPdfExporter.cc:482 msgid "Save PDF Output..." msgstr "" #: ../gtk/src/hocr/HOCRPdfExporter.cc:500 ../qt/src/hocr/HOCRPdfExporter.cc:488 msgid "Invalid Output" msgstr "" #: ../gtk/src/hocr/HOCRPdfExporter.cc:500 ../qt/src/hocr/HOCRPdfExporter.cc:488 msgid "Cannot overwrite a file which is a source image of this document." msgstr "" #: ../gtk/src/hocr/HOCRPdfExporter.cc:516 ../qt/src/hocr/HOCRPdfExporter.cc:511 msgid "Failed to create output" msgstr "" #: ../gtk/src/hocr/HOCRPdfExporter.cc:516 ../qt/src/hocr/HOCRPdfExporter.cc:511 msgid "Failed to create output. The returned error was: %1" msgstr "" #: ../gtk/src/hocr/HOCRPdfExporter.cc:558 ../qt/src/hocr/HOCRPdfExporter.cc:551 msgid "The operation was cancelled" msgstr "" #: ../gtk/src/hocr/HOCRPdfExporter.cc:607 ../qt/src/hocr/HOCRPdfExporter.cc:597 msgid "Failed to render page %1" msgstr "" #: ../gtk/src/hocr/HOCRPdfExporter.cc:614 ../qt/src/hocr/HOCRPdfExporter.cc:604 msgid "Exporting to PDF..." msgstr "" #: ../gtk/src/hocr/HOCRPdfExporter.cc:619 ../qt/src/hocr/HOCRPdfExporter.cc:609 msgid "The PDF export failed: %1." msgstr "" #: ../gtk/src/hocr/HOCRPdfExporter.cc:673 ../qt/src/hocr/HOCRPdfExporter.cc:662 msgid "The PDF library could not load the font '%1'." msgstr "" #: ../gtk/src/hocr/HOCRTextExporter.cc:37 ../gtk/src/OutputEditorText.cc:274 #: ../qt/src/hocr/HOCRTextExporter.cc:39 ../qt/src/OutputEditorText.cc:239 msgid "Text Files" msgstr "" #: ../gtk/src/hocr/HOCRTextExporter.cc:38 ../qt/src/hocr/HOCRTextExporter.cc:39 msgid "Save Text Output..." msgstr "" #: ../gtk/src/hocr/HOCRTextExporter.cc:46 ../qt/src/hocr/HOCRTextExporter.cc:47 msgid "The text export failed: unable to write output file." msgstr "" #: ../gtk/src/hocr/OutputEditorHOCR.cc:269 #: ../qt/src/hocr/OutputEditorHOCR.cc:230 msgid "Block" msgstr "" #: ../gtk/src/hocr/OutputEditorHOCR.cc:275 #: ../qt/src/hocr/OutputEditorHOCR.cc:232 msgid "Line" msgstr "" #: ../gtk/src/hocr/OutputEditorHOCR.cc:278 #: ../qt/src/hocr/OutputEditorHOCR.cc:233 msgid "Word" msgstr "" #: ../gtk/src/hocr/OutputEditorHOCR.cc:281 #: ../qt/src/hocr/OutputEditorHOCR.cc:234 msgid "Misspelled word" msgstr "" #: ../gtk/src/hocr/OutputEditorHOCR.cc:435 #: ../qt/src/hocr/OutputEditorHOCR.cc:317 msgid "" "The following pages could not be processed:\n" "%1" msgstr "" #: ../gtk/src/hocr/OutputEditorHOCR.cc:436 #: ../qt/src/hocr/OutputEditorHOCR.cc:318 msgid "Recognition errors" msgstr "" #: ../gtk/src/hocr/OutputEditorHOCR.cc:594 #: ../qt/src/hocr/OutputEditorHOCR.cc:500 #: ../qt/src/hocr/OutputEditorHOCR.cc:512 msgid "Multiple values" msgstr "" #. Merging allowed #: ../gtk/src/hocr/OutputEditorHOCR.cc:778 #: ../qt/src/hocr/OutputEditorHOCR.cc:641 msgid "Merge" msgstr "" #: ../gtk/src/hocr/OutputEditorHOCR.cc:786 #: ../gtk/src/hocr/OutputEditorHOCR.cc:877 #: ../qt/src/hocr/OutputEditorHOCR.cc:643 #: ../qt/src/hocr/OutputEditorHOCR.cc:725 msgid "Split from parent" msgstr "" #. Swapping allowed #: ../gtk/src/hocr/OutputEditorHOCR.cc:797 #: ../qt/src/hocr/OutputEditorHOCR.cc:647 msgid "Swap" msgstr "" #: ../gtk/src/hocr/OutputEditorHOCR.cc:821 #: ../qt/src/hocr/OutputEditorHOCR.cc:693 msgid "Add graphic region" msgstr "" #: ../gtk/src/hocr/OutputEditorHOCR.cc:824 #: ../qt/src/hocr/OutputEditorHOCR.cc:694 msgid "Add text block" msgstr "" #: ../gtk/src/hocr/OutputEditorHOCR.cc:828 #: ../qt/src/hocr/OutputEditorHOCR.cc:696 msgid "Add paragraph" msgstr "" #: ../gtk/src/hocr/OutputEditorHOCR.cc:832 #: ../qt/src/hocr/OutputEditorHOCR.cc:698 msgid "Add line" msgstr "" #: ../gtk/src/hocr/OutputEditorHOCR.cc:836 #: ../qt/src/hocr/OutputEditorHOCR.cc:700 msgid "Add word" msgstr "" #: ../gtk/src/hocr/OutputEditorHOCR.cc:852 #: ../qt/src/hocr/OutputEditorHOCR.cc:710 msgid "No suggestions" msgstr "" #: ../gtk/src/hocr/OutputEditorHOCR.cc:858 #: ../qt/src/hocr/OutputEditorHOCR.cc:714 msgid "Add to dictionary" msgstr "" #: ../gtk/src/hocr/OutputEditorHOCR.cc:864 #: ../qt/src/hocr/OutputEditorHOCR.cc:716 msgid "Ignore word" msgstr "" #: ../gtk/src/hocr/OutputEditorHOCR.cc:926 #: ../gtk/src/hocr/OutputEditorHOCR.cc:965 #: ../qt/src/hocr/OutputEditorHOCR.cc:795 #: ../qt/src/hocr/OutputEditorHOCR.cc:832 msgid "hOCR HTML Files" msgstr "" #: ../gtk/src/hocr/OutputEditorHOCR.cc:927 #: ../qt/src/hocr/OutputEditorHOCR.cc:795 msgid "Open hOCR File" msgstr "" #: ../gtk/src/hocr/OutputEditorHOCR.cc:936 #: ../qt/src/hocr/OutputEditorHOCR.cc:802 msgid "Failed to open file" msgstr "" #: ../gtk/src/hocr/OutputEditorHOCR.cc:936 #: ../qt/src/hocr/OutputEditorHOCR.cc:802 msgid "The file could not be opened: %1." msgstr "" #: ../gtk/src/hocr/OutputEditorHOCR.cc:945 #: ../qt/src/hocr/OutputEditorHOCR.cc:809 msgid "Invalid hOCR file" msgstr "" #: ../gtk/src/hocr/OutputEditorHOCR.cc:945 #: ../qt/src/hocr/OutputEditorHOCR.cc:809 msgid "The file does not appear to contain valid hOCR HTML: %1" msgstr "" #: ../gtk/src/hocr/OutputEditorHOCR.cc:966 #: ../qt/src/hocr/OutputEditorHOCR.cc:832 msgid "Save hOCR Output..." msgstr "" #: ../gtk/src/hocr/OutputEditorHOCR.cc:973 ../gtk/src/OutputEditorText.cc:282 #: ../qt/src/hocr/OutputEditorHOCR.cc:839 ../qt/src/OutputEditorText.cc:246 msgid "Failed to save output" msgstr "" #: ../gtk/src/hocr/OutputEditorHOCR.cc:973 ../gtk/src/OutputEditorText.cc:282 #: ../qt/src/hocr/OutputEditorHOCR.cc:839 ../qt/src/OutputEditorText.cc:246 msgid "Check that you have writing permissions in the selected folder." msgstr "" #: ../gtk/src/hocr/OutputEditorHOCR.cc:1035 ../gtk/src/OutputEditorText.cc:296 #: ../qt/src/hocr/OutputEditorHOCR.cc:894 ../qt/src/OutputEditorText.cc:259 msgid "Output not saved" msgstr "" #: ../gtk/src/hocr/OutputEditorHOCR.cc:1035 ../gtk/src/OutputEditorText.cc:296 #: ../qt/src/hocr/OutputEditorHOCR.cc:894 ../qt/src/OutputEditorText.cc:259 msgid "Save output before proceeding?" msgstr "" #: ../gtk/src/hocr/OutputEditorHOCR.cc:1156 ../gtk/src/OutputEditorText.cc:184 #: ../qt/src/hocr/OutputEditorHOCR.cc:991 ../qt/src/OutputEditorText.cc:152 msgid "Replacing..." msgstr "" #: ../gtk/src/hocr/OutputEditorHOCR.cc:1181 ../gtk/src/OutputEditorText.cc:192 #: ../qt/src/hocr/OutputEditorHOCR.cc:1014 ../qt/src/OutputEditorText.cc:160 msgid "Applying substitutions..." msgstr "" #: ../gtk/src/MainWindow.cc:131 ../qt/src/MainWindow.cc:295 msgid "Using tesseract" msgstr "" #: ../gtk/src/MainWindow.cc:178 ../qt/src/MainWindow.cc:194 msgid "Select an image to begin..." msgstr "" #: ../gtk/src/MainWindow.cc:293 ../qt/src/MainWindow.cc:278 msgid "Multiple sources" msgstr "" #: ../gtk/src/MainWindow.cc:295 ../qt/src/MainWindow.cc:280 msgid "Ready" msgstr "" #: ../gtk/src/MainWindow.cc:442 ../qt/src/MainWindow.cc:423 msgid "New version" msgstr "" #: ../gtk/src/MainWindow.cc:442 ../qt/src/MainWindow.cc:423 msgid "gImageReader %1 is available" msgstr "" #: ../gtk/src/MainWindow.cc:443 ../qt/src/MainWindow.cc:424 msgid "Download" msgstr "" #: ../gtk/src/MainWindow.cc:444 ../qt/src/MainWindow.cc:425 msgid "Changelog" msgstr "" #: ../gtk/src/MainWindow.cc:445 ../qt/src/MainWindow.cc:426 msgid "Don't notify again" msgstr "" #: ../gtk/src/MainWindow.cc:466 ../qt/src/MainWindow.cc:474 msgid "Don't show again" msgstr "" #: ../gtk/src/MainWindow.cc:467 ../gtk/src/MainWindow.cc:480 #: ../qt/src/MainWindow.cc:475 msgid "Install" msgstr "" #: ../gtk/src/MainWindow.cc:487 ../qt/src/MainWindow.cc:487 msgid "Spelling dictionary missing" msgstr "" #: ../gtk/src/MainWindow.cc:487 ../qt/src/MainWindow.cc:487 msgid "The spellcheck dictionary for %1 is not installed" msgstr "" #: ../gtk/src/MainWindow.cc:494 ../gtk/src/MainWindow.cc:523 #: ../qt/src/MainWindow.cc:493 msgid "Installing spelling dictionary for '%1'" msgstr "" #: ../gtk/src/MainWindow.cc:515 ../gtk/src/MainWindow.cc:536 #: ../gtk/src/MainWindow.cc:544 ../gtk/src/MainWindow.cc:592 #: ../gtk/src/MainWindow.cc:597 ../gtk/src/TessdataManager.cc:60 #: ../gtk/src/TessdataManager.cc:70 ../gtk/src/TessdataManager.cc:339 #: ../qt/src/MainWindow.cc:512 ../qt/src/MainWindow.cc:525 #: ../qt/src/MainWindow.cc:534 ../qt/src/MainWindow.cc:578 #: ../qt/src/MainWindow.cc:583 ../qt/src/TessdataManager.cc:74 #: ../qt/src/TessdataManager.cc:84 ../qt/src/TessdataManager.cc:315 msgid "Error" msgstr "" #: ../gtk/src/MainWindow.cc:515 ../qt/src/MainWindow.cc:512 msgid "Failed to install spelling dictionary: %1" msgstr "" #: ../gtk/src/MainWindow.cc:536 ../qt/src/MainWindow.cc:525 msgid "Failed to create directory for spelling dictionaries." msgstr "" #: ../gtk/src/MainWindow.cc:544 ../qt/src/MainWindow.cc:534 msgid "Could not read %1: %2." msgstr "" #: ../gtk/src/MainWindow.cc:571 ../qt/src/MainWindow.cc:558 msgid "Downloading '%1'..." msgstr "" #: ../gtk/src/MainWindow.cc:592 ../qt/src/MainWindow.cc:578 msgid "" "The following dictionaries could not be downloaded:\n" "%1\n" "\n" "Check the connectivity and directory permissions.\n" "Hint: If you don't have write permissions in system folders, you can switch " "to user paths in the settings dialog." msgstr "" #: ../gtk/src/MainWindow.cc:595 ../qt/src/MainWindow.cc:581 msgid "Dictionaries installed" msgstr "" #: ../gtk/src/MainWindow.cc:595 msgid "" "The following dictionaries were installed:\n" "%1" msgstr "" #: ../gtk/src/MainWindow.cc:597 ../qt/src/MainWindow.cc:583 msgid "No spelling dictionaries found for '%1'." msgstr "" #: ../gtk/src/OutputEditorText.cc:154 ../qt/src/OutputEditorText.cc:137 msgid "Stripping line breaks..." msgstr "" #: ../gtk/src/OutputEditorText.cc:162 msgid "Check spelling" msgstr "" #: ../gtk/src/OutputEditorText.cc:231 ../qt/src/OutputEditorText.cc:196 msgid "File: %1" msgstr "" #: ../gtk/src/OutputEditorText.cc:234 ../qt/src/OutputEditorText.cc:199 msgid "Page: %1" msgstr "" #: ../gtk/src/OutputEditorText.cc:247 ../gtk/src/Recognizer.cc:471 #: ../qt/src/Recognizer.cc:462 msgid "" "\n" "[Failed to recognize page %1]\n" msgstr "" #: ../gtk/src/OutputEditorText.cc:275 ../qt/src/OutputEditorText.cc:239 msgid "Save Output..." msgstr "" #: ../gtk/src/Recognizer.cc:179 ../qt/src/Recognizer.cc:172 msgid "No languages available" msgstr "" #: ../gtk/src/Recognizer.cc:179 ../qt/src/Recognizer.cc:172 msgid "" "No tesseract languages are available for use. Recognition will not work." msgstr "" #: ../gtk/src/Recognizer.cc:233 ../qt/src/Recognizer.cc:232 msgid "Multilingual" msgstr "" #: ../gtk/src/Recognizer.cc:285 ../qt/src/Recognizer.cc:277 msgid "Automatic page segmentation" msgstr "" #: ../gtk/src/Recognizer.cc:286 ../qt/src/Recognizer.cc:278 msgid "Page segmentation with orientation and script detection" msgstr "" #: ../gtk/src/Recognizer.cc:287 ../qt/src/Recognizer.cc:279 msgid "Assume single column of text" msgstr "" #: ../gtk/src/Recognizer.cc:288 ../qt/src/Recognizer.cc:280 msgid "Assume single block of vertically aligned text" msgstr "" #: ../gtk/src/Recognizer.cc:289 ../qt/src/Recognizer.cc:281 msgid "Assume a single uniform block of text" msgstr "" #: ../gtk/src/Recognizer.cc:290 ../qt/src/Recognizer.cc:282 msgid "Assume a line of text" msgstr "" #: ../gtk/src/Recognizer.cc:291 ../qt/src/Recognizer.cc:283 msgid "Assume a single word" msgstr "" #: ../gtk/src/Recognizer.cc:292 ../qt/src/Recognizer.cc:284 msgid "Assume a single word in a circle" msgstr "" #: ../gtk/src/Recognizer.cc:293 ../qt/src/Recognizer.cc:285 msgid "Sparse text in no particular order" msgstr "" #: ../gtk/src/Recognizer.cc:294 ../qt/src/Recognizer.cc:286 msgid "Sparse text with orientation and script detection" msgstr "" #: ../gtk/src/Recognizer.cc:309 ../qt/src/Recognizer.cc:297 msgid "Page segmentation mode" msgstr "" #: ../gtk/src/Recognizer.cc:313 ../qt/src/Recognizer.cc:300 msgid "Character whitelist / blacklist..." msgstr "" #: ../gtk/src/Recognizer.cc:319 ../qt/src/Recognizer.cc:305 msgid "Manage languages..." msgstr "" #: ../gtk/src/Recognizer.cc:375 ../qt/src/Recognizer.cc:369 msgid "Current selection" msgstr "" #: ../gtk/src/Recognizer.cc:465 ../qt/src/Recognizer.cc:455 msgid "Recognizing page %1 (%2 of %3)" msgstr "" #: ../gtk/src/Recognizer.cc:470 ../qt/src/Recognizer.cc:461 msgid "" "\n" "- Page %1: failed to render page" msgstr "" #: ../gtk/src/Recognizer.cc:501 ../gtk/src/Recognizer.cc:531 #: ../gtk/src/Recognizer.cc:544 ../qt/src/Recognizer.cc:491 #: ../qt/src/Recognizer.cc:521 ../qt/src/Recognizer.cc:534 msgid "Recognizing..." msgstr "" #: ../gtk/src/Recognizer.cc:505 ../gtk/src/Recognizer.cc:514 #: ../qt/src/Recognizer.cc:495 ../qt/src/Recognizer.cc:504 msgid "Recognition errors occurred" msgstr "" #: ../gtk/src/Recognizer.cc:505 ../qt/src/Recognizer.cc:495 msgid "The following errors occurred:%1" msgstr "" #: ../gtk/src/Recognizer.cc:514 ../qt/src/Recognizer.cc:504 msgid "Failed to initialize tesseract" msgstr "" #: ../gtk/src/scanner/ScannerSane.cc:84 ../gtk/src/scanner/ScannerTwain.cc:288 #: ../qt/src/scanner/ScannerSane.cc:85 ../qt/src/scanner/ScannerTwain.cc:286 msgid "Scan canceled" msgstr "" #: ../gtk/src/scanner/ScannerSane.cc:159 ../gtk/src/scanner/ScannerTwain.cc:186 #: ../qt/src/scanner/ScannerSane.cc:159 ../qt/src/scanner/ScannerTwain.cc:178 msgid "No scanner specified" msgstr "" #: ../gtk/src/scanner/ScannerSane.cc:168 ../gtk/src/scanner/ScannerTwain.cc:195 #: ../qt/src/scanner/ScannerSane.cc:168 ../qt/src/scanner/ScannerTwain.cc:187 msgid "Unable to connect to scanner" msgstr "" #: ../gtk/src/scanner/ScannerSane.cc:403 ../gtk/src/scanner/ScannerTwain.cc:266 #: ../gtk/src/scanner/ScannerTwain.cc:292 ../qt/src/scanner/ScannerSane.cc:403 #: ../qt/src/scanner/ScannerTwain.cc:258 ../qt/src/scanner/ScannerTwain.cc:290 msgid "Unable to start scan" msgstr "" #: ../gtk/src/scanner/ScannerSane.cc:411 ../gtk/src/scanner/ScannerSane.cc:461 #: ../gtk/src/scanner/ScannerTwain.cc:318 ../qt/src/scanner/ScannerSane.cc:411 #: ../qt/src/scanner/ScannerSane.cc:461 ../qt/src/scanner/ScannerTwain.cc:316 msgid "Error communicating with scanner" msgstr "" #: ../gtk/src/scanner/ScannerSane.cc:520 ../qt/src/scanner/ScannerSane.cc:517 msgid "Failed to save image" msgstr "" #: ../gtk/src/scanner/ScannerSane.cc:800 ../qt/src/scanner/ScannerSane.cc:797 msgid "Operation is cancelled." msgstr "" #: ../gtk/src/scanner/ScannerSane.cc:802 ../qt/src/scanner/ScannerSane.cc:799 msgid "Device is busy." msgstr "" #: ../gtk/src/scanner/ScannerSane.cc:804 ../qt/src/scanner/ScannerSane.cc:801 msgid "Cover is opened." msgstr "" #: ../gtk/src/scanner/ScannerSane.cc:806 ../qt/src/scanner/ScannerSane.cc:803 msgid "Document feeder jammed." msgstr "" #: ../gtk/src/scanner/ScannerSane.cc:808 ../qt/src/scanner/ScannerSane.cc:805 msgid "Document feeder out of documents." msgstr "" #: ../gtk/src/scanner/ScannerSane.cc:810 ../qt/src/scanner/ScannerSane.cc:807 msgid "Access to scanner is denied." msgstr "" #: ../gtk/src/SourceManager.cc:118 ../qt/src/SourceManager.cc:124 msgid "PDFs with text" msgstr "" #: ../gtk/src/SourceManager.cc:118 ../qt/src/SourceManager.cc:124 msgid "" "These PDF files already contain text:\n" "%1" msgstr "" #: ../gtk/src/SourceManager.cc:127 ../qt/src/SourceManager.cc:132 msgid "Unable to open files" msgstr "" #: ../gtk/src/SourceManager.cc:127 ../qt/src/SourceManager.cc:132 msgid "The following files could not be opened:%1" msgstr "" #: ../gtk/src/SourceManager.cc:141 ../qt/src/SourceManager.cc:143 msgid "Enter password for file '%1':" msgstr "" #: ../gtk/src/SourceManager.cc:197 ../qt/src/SourceManager.cc:214 msgid "Images and PDFs" msgstr "" #: ../gtk/src/SourceManager.cc:202 ../qt/src/SourceManager.cc:215 msgid "Select Files" msgstr "" #: ../gtk/src/SourceManager.cc:208 ../qt/src/SourceManager.cc:226 msgid "Clipboard Error" msgstr "" #: ../gtk/src/SourceManager.cc:208 ../qt/src/SourceManager.cc:226 msgid "Failed to read the clipboard." msgstr "" #: ../gtk/src/SourceManager.cc:212 ../qt/src/SourceManager.cc:230 #: ../qt/src/SourceManager.cc:236 msgid "Pasted %1" msgstr "" #: ../gtk/src/SourceManager.cc:224 ../qt/src/SourceManager.cc:243 msgid "Screenshot Error" msgstr "" #: ../gtk/src/SourceManager.cc:224 ../qt/src/SourceManager.cc:243 msgid "Failed to take screenshot." msgstr "" #: ../gtk/src/SourceManager.cc:228 ../qt/src/SourceManager.cc:247 msgid "Screenshot %1" msgstr "" #: ../gtk/src/SourceManager.cc:233 ../qt/src/SourceManager.cc:252 msgid "Saving image..." msgstr "" #: ../gtk/src/SourceManager.cc:240 ../qt/src/SourceManager.cc:265 msgid "Cannot Write File" msgstr "" #: ../gtk/src/SourceManager.cc:240 ../qt/src/SourceManager.cc:265 msgid "Could not write to %1." msgstr "" #: ../gtk/src/SourceManager.cc:267 ../qt/src/SourceManager.cc:287 msgid "Delete File?" msgstr "" #: ../gtk/src/SourceManager.cc:267 ../qt/src/SourceManager.cc:287 msgid "The following files will be deleted:%1" msgstr "" #: ../gtk/src/SourceManager.cc:332 ../qt/src/SourceManager.cc:338 msgid "Missing File" msgstr "" #: ../gtk/src/SourceManager.cc:332 ../qt/src/SourceManager.cc:338 msgid "" "The following file has been deleted or moved:\n" "%1" msgstr "" #: ../gtk/src/SubstitutionsManager.cc:33 ../qt/src/SubstitutionsManager.cc:73 msgid "Search for" msgstr "" #: ../gtk/src/SubstitutionsManager.cc:34 ../qt/src/SubstitutionsManager.cc:73 msgid "Replace with" msgstr "" #: ../gtk/src/SubstitutionsManager.cc:69 ../gtk/src/SubstitutionsManager.cc:103 #: ../qt/src/SubstitutionsManager.cc:106 ../qt/src/SubstitutionsManager.cc:143 msgid "Substitutions List" msgstr "" #: ../gtk/src/SubstitutionsManager.cc:70 ../qt/src/SubstitutionsManager.cc:106 msgid "Open Substitutions List" msgstr "" #: ../gtk/src/SubstitutionsManager.cc:75 ../qt/src/SubstitutionsManager.cc:112 msgid "Error Reading File" msgstr "" #: ../gtk/src/SubstitutionsManager.cc:75 ../qt/src/SubstitutionsManager.cc:112 msgid "Unable to read '%1'." msgstr "" #: ../gtk/src/SubstitutionsManager.cc:97 ../qt/src/SubstitutionsManager.cc:137 msgid "Errors Occurred Reading File" msgstr "" #: ../gtk/src/SubstitutionsManager.cc:97 ../qt/src/SubstitutionsManager.cc:137 msgid "Some entries of the substitutions list could not be read." msgstr "" #: ../gtk/src/SubstitutionsManager.cc:104 ../qt/src/SubstitutionsManager.cc:143 msgid "Save Substitutions List" msgstr "" #: ../gtk/src/SubstitutionsManager.cc:110 ../qt/src/SubstitutionsManager.cc:149 msgid "Error Saving File" msgstr "" #: ../gtk/src/SubstitutionsManager.cc:110 ../qt/src/SubstitutionsManager.cc:149 msgid "Unable to write to '%1'." msgstr "" #: ../gtk/src/SubstitutionsManager.cc:127 ../qt/src/SubstitutionsManager.cc:162 msgid "Save List?" msgstr "" #: ../gtk/src/SubstitutionsManager.cc:127 ../qt/src/SubstitutionsManager.cc:162 msgid "Do you want to save the current list?" msgstr "" #: ../gtk/src/TessdataManager.cc:60 ../qt/src/TessdataManager.cc:74 msgid "" "A session connection to the PackageKit backend is required for managing " "system-wide tesseract language packs, but it was not found. This service is " "usually provided by a software-management application such as Gnome " "Software. Please install software which provides the necessary PackageKit " "interface, use other system package management software to manage the " "tesseract language packs directly, or switch to using the user tessdata path " "in the configuration dialog." msgstr "" #: ../gtk/src/TessdataManager.cc:65 ../qt/src/TessdataManager.cc:79 msgid "Fetching available languages" msgstr "" #: ../gtk/src/TessdataManager.cc:70 ../gtk/src/TessdataManager.cc:96 #: ../gtk/src/TessdataManager.cc:197 ../qt/src/TessdataManager.cc:84 #: ../qt/src/TessdataManager.cc:101 ../qt/src/TessdataManager.cc:197 msgid "Failed to fetch list of available languages: %1" msgstr "" #: ../gtk/src/TessdataManager.cc:104 ../qt/src/TessdataManager.cc:113 #: ../qt/src/TessdataManager.cc:122 msgid "Parsing error: %1" msgstr "" #: ../gtk/src/TessdataManager.cc:235 ../qt/src/TessdataManager.cc:232 msgid "Applying changes..." msgstr "" #: ../gtk/src/TessdataManager.cc:297 ../qt/src/TessdataManager.cc:278 msgid "Failed to create directory for tessdata files." msgstr "" #: ../gtk/src/TessdataManager.cc:306 ../qt/src/TessdataManager.cc:287 msgid "Downloading %1..." msgstr "" #: ../gtk/src/TessdataManager.cc:330 msgid "" "The following files could not be downloaded or removed:\n" "%1\n" "\n" "Check the connectivity and directory permissions.\n" "\n" "Hint: If you don't have write permissions in system folders, you can switch " "to user paths in the settings dialog." msgstr "" #: ../gtk/src/Utils.cc:64 msgid "Yes" msgstr "" #: ../gtk/src/Utils.cc:67 msgid "No" msgstr "" #: ../gtk/src/Utils.cc:76 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/CrashHandler.ui.h:3 msgid "" "

Tesseract has " "aborted

Tesseract (the OCR engine) has aborted while " "recognizing text. This may occur if the used traineddatas are corrupt or " "incomplatible with the version of tesseract in use, or due to a bug in " "tesseract.

The stacktrace below may provide additional information " "about where the crash occured.

" msgstr "" #: ../qt/data/MainWindow.ui.h:17 msgid "Flatbed" msgstr "" #: ../qt/data/MainWindow.ui.h:18 msgid "ADF Front" msgstr "" #: ../qt/data/MainWindow.ui.h:19 msgid "ADF Back" msgstr "" #: ../qt/data/MainWindow.ui.h:20 msgid "ADF Duplex" msgstr "" #. Remove & from some labels which designer insists in adding #: ../qt/data/MainWindow.ui.h:21 ../qt/src/Ui_MainWindow.hh:50 msgid "Sources" msgstr "" #: ../qt/data/MainWindow.ui.h:22 msgid "Zoom In" msgstr "" #: ../qt/data/MainWindow.ui.h:24 msgid "Zoom Out" msgstr "" #: ../qt/data/MainWindow.ui.h:26 msgid "Normal Size" msgstr "" #: ../qt/data/MainWindow.ui.h:28 msgid "Best Fit" msgstr "" #: ../qt/data/MainWindow.ui.h:30 msgid "Rotate Left" msgstr "" #: ../qt/data/MainWindow.ui.h:31 msgid "Rotate left" msgstr "" #: ../qt/data/MainWindow.ui.h:32 msgid "Rotate Right" msgstr "" #: ../qt/data/MainWindow.ui.h:33 msgid "Rotate right" msgstr "" #: ../qt/data/MainWindow.ui.h:34 msgid "Image Controls" msgstr "" #: ../qt/data/MainWindow.ui.h:36 msgid "Autodetect Layout" msgstr "" #: ../qt/data/MainWindow.ui.h:38 msgid "Toggle Output Pane" msgstr "" #: ../qt/data/PdfExportDialog.ui.h:5 msgid "Backend:" msgstr "" #: ../qt/data/PdfExportDialog.ui.h:8 msgid "Portrait" msgstr "" #: ../qt/data/PdfExportDialog.ui.h:9 msgid "Landscape" msgstr "" #: ../qt/src/hocr/HOCRPdfExporter.cc:142 msgid "Failed to write to file" msgstr "" #. Output toolbar #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:55 #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:56 msgid "Open hOCR file" msgstr "" #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:57 #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:58 msgid "Save as hOCR text" msgstr "" #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:79 #: ../qt/src/Ui_OutputEditorText.hh:106 msgid "Find and Replace" msgstr "" #: ../qt/src/MainWindow.cc:581 msgid "" "The following dictionary files were installed:\n" "%1" msgstr "" #: ../qt/src/TessdataManager.cc:308 msgid "" "The following files could not be downloaded or removed:\n" "%1\n" "\n" "Check the connectivity and directory permissions.\n" "Hint: If you don't have write permissions in system folders, you can switch " "to user paths in the settings dialog." msgstr "" #: ../qt/src/Ui_MainWindow.hh:51 msgid "Output" msgstr "" #: ../qt/src/Ui_MainWindow.hh:135 msgid "OCR mode:" msgstr "" #: ../qt/src/Ui_MainWindow.hh:209 msgid "Remove Image" msgstr "" #: ../qt/src/Ui_MainWindow.hh:212 msgid "Delete Image" msgstr "" #: ../qt/src/Ui_MainWindow.hh:215 msgid "Clear List" msgstr "" #: ../qt/src/Ui_OutputEditorText.hh:101 msgid "Strip Line Breaks" msgstr "" #: ../qt/src/Ui_OutputEditorText.hh:115 msgid "Save Output" msgstr "" #: ../qt/src/Ui_OutputEditorText.hh:117 msgid "Clear Output" msgstr "" gImageReader-3.3.1/po/sr_Latn.po000066400000000000000000001506361351740627400164360ustar00rootroot00000000000000# 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. # msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2019-07-25 23:17+0200\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: Automatically generated\n" "Language-Team: none\n" "Language: sr_Latn\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: ../data/gimagereader.desktop.in.h:1 msgid "OCR application" msgstr "" #: ../gtk/data/appmenu.ui.h:1 ../qt/src/Ui_MainWindow.hh:167 msgid "Redetect Languages" msgstr "" #: ../gtk/data/appmenu.ui.h:2 ../qt/src/Ui_MainWindow.hh:170 msgid "Manage Languages" msgstr "" #: ../gtk/data/appmenu.ui.h:3 ../gtk/data/ConfigDialog.ui.h:1 #: ../qt/data/ConfigDialog.ui.h:1 ../qt/src/Ui_MainWindow.hh:173 msgid "Preferences" msgstr "" #: ../gtk/data/appmenu.ui.h:4 ../gtk/data/ConfigDialog.ui.h:2 #: ../gtk/src/MainWindow.cc:482 ../qt/src/MainWindow.cc:481 #: ../qt/src/Ui_MainWindow.hh:178 msgid "Help" msgstr "" #: ../gtk/data/appmenu.ui.h:5 ../qt/data/AboutDialog.ui.h:2 #: ../qt/src/Ui_MainWindow.hh:181 msgid "About" msgstr "" #: ../gtk/data/appmenu.ui.h:6 msgid "Quit" msgstr "" #: ../gtk/data/ConfigDialog.ui.h:3 ../gtk/data/MainWindow.ui.h:47 #: ../gtk/data/OutputEditorHOCR.ui.h:3 ../gtk/data/PdfExportDialog.ui.h:3 #: ../gtk/src/FileDialogs.cc:152 ../gtk/src/Utils.cc:61 #: ../qt/data/ConfigDialog.ui.h:26 msgid "OK" msgstr "" #: ../gtk/data/ConfigDialog.ui.h:4 msgid "Output pane orientation:" msgstr "" #: ../gtk/data/ConfigDialog.ui.h:5 msgid "Horizontal" msgstr "" #: ../gtk/data/ConfigDialog.ui.h:6 msgid "Vertical" msgstr "" #: ../gtk/data/ConfigDialog.ui.h:7 ../qt/data/ConfigDialog.ui.h:18 msgid "Query to install missing spellcheck dictionaries" msgstr "" #: ../gtk/data/ConfigDialog.ui.h:8 ../qt/data/ConfigDialog.ui.h:4 msgid "Automatically check for new program versions" msgstr "" #: ../gtk/data/ConfigDialog.ui.h:9 ../qt/data/ConfigDialog.ui.h:3 msgid "Predefined language definitions:" msgstr "" #: ../gtk/data/ConfigDialog.ui.h:10 ../qt/data/ConfigDialog.ui.h:12 msgid "Additional language definitions:" msgstr "" #: ../gtk/data/ConfigDialog.ui.h:11 ../qt/data/ConfigDialog.ui.h:20 msgid "The prefix of the tesseract language data file" msgstr "" #: ../gtk/data/ConfigDialog.ui.h:12 ../qt/data/ConfigDialog.ui.h:21 msgid "Prefix" msgstr "" #: ../gtk/data/ConfigDialog.ui.h:13 ../qt/data/ConfigDialog.ui.h:22 msgid "The ISO 639-1 language code followed by the country code" msgstr "" #: ../gtk/data/ConfigDialog.ui.h:14 ../qt/data/ConfigDialog.ui.h:23 msgid "ISO Code" msgstr "" #: ../gtk/data/ConfigDialog.ui.h:15 ../qt/data/ConfigDialog.ui.h:24 msgid "The name of the language" msgstr "" #: ../gtk/data/ConfigDialog.ui.h:16 ../qt/data/ConfigDialog.ui.h:25 msgid "Name" msgstr "" #: ../gtk/data/ConfigDialog.ui.h:17 ../gtk/data/MainWindow.ui.h:46 #: ../gtk/data/OutputEditorHOCR.ui.h:2 ../gtk/data/PdfExportDialog.ui.h:2 #: ../gtk/src/Acquirer.cc:34 ../gtk/src/FileDialogs.cc:151 #: ../gtk/src/Utils.cc:70 ../qt/data/ConfigDialog.ui.h:27 #: ../qt/data/MainWindow.ui.h:12 msgid "Cancel" msgstr "" #: ../gtk/data/ConfigDialog.ui.h:18 ../qt/data/ConfigDialog.ui.h:5 msgid "Output pane font:" msgstr "" #: ../gtk/data/ConfigDialog.ui.h:19 ../qt/data/ConfigDialog.ui.h:2 msgid "Default" msgstr "" #: ../gtk/data/ConfigDialog.ui.h:20 ../qt/data/ConfigDialog.ui.h:6 msgid "Language data locations:" msgstr "" #: ../gtk/data/ConfigDialog.ui.h:21 ../qt/data/ConfigDialog.ui.h:13 msgid "Language definitions path:" msgstr "" #: ../gtk/data/ConfigDialog.ui.h:22 ../qt/data/ConfigDialog.ui.h:28 msgid "Spelling dictionaries path:" msgstr "" #: ../gtk/data/ConfigDialog.ui.h:23 ../qt/data/ConfigDialog.ui.h:10 msgid "System-wide paths" msgstr "" #: ../gtk/data/ConfigDialog.ui.h:24 ../qt/data/ConfigDialog.ui.h:11 msgid "User paths" msgstr "" #: ../gtk/data/ConfigDialog.ui.h:25 ../qt/data/ConfigDialog.ui.h:29 msgid "Automatically open exported documents with default application" msgstr "" #: ../gtk/data/CrashHandler.ui.h:1 ../qt/src/CrashHandler.cc:38 msgid "Regenerate backtrace" msgstr "" #: ../gtk/data/CrashHandler.ui.h:3 #, no-c-format msgid "" "The application has crashed\n" "\n" "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/CrashHandler.ui.h:6 msgid "" "Tesseract has aborted\n" "\n" "Tesseract (the OCR engine) has aborted while recognizing text. This may " "occur if the used traineddatas are corrupt or incomplatible with the version " "of tesseract in use, or due to a bug in tesseract.\n" "\n" "The stacktrace below may provide additional information about where the " "crash occured.\n" msgstr "" #: ../gtk/data/MainWindow.ui.h:1 ../qt/data/MainWindow.ui.h:39 msgid "Toggle output pane" msgstr "" #: ../gtk/data/MainWindow.ui.h:2 ../qt/src/Ui_MainWindow.hh:66 msgid "Rotate current page" msgstr "" #: ../gtk/data/MainWindow.ui.h:3 ../qt/src/Ui_MainWindow.hh:67 msgid "Rotate all pages" msgstr "" #. Sources toolbar #: ../gtk/data/MainWindow.ui.h:4 ../qt/src/Ui_MainWindow.hh:192 msgid "Recent" msgstr "" #: ../gtk/data/MainWindow.ui.h:5 ../qt/src/Ui_MainWindow.hh:193 msgid "Paste" msgstr "" #: ../gtk/data/MainWindow.ui.h:6 ../qt/src/Ui_MainWindow.hh:194 msgid "Take Screenshot" msgstr "" #: ../gtk/data/MainWindow.ui.h:7 ../qt/data/MainWindow.ui.h:23 msgid "Zoom in" msgstr "" #: ../gtk/data/MainWindow.ui.h:8 ../qt/data/MainWindow.ui.h:25 msgid "Zoom out" msgstr "" #: ../gtk/data/MainWindow.ui.h:9 ../qt/data/MainWindow.ui.h:27 msgid "Normal size" msgstr "" #: ../gtk/data/MainWindow.ui.h:10 ../qt/data/MainWindow.ui.h:29 msgid "Best fit" msgstr "" #: ../gtk/data/MainWindow.ui.h:11 ../qt/src/Ui_MainWindow.hh:75 msgid "Select rotation mode" msgstr "" #: ../gtk/data/MainWindow.ui.h:12 ../gtk/data/OutputEditorText.ui.h:13 #: ../qt/src/Ui_OutputEditorText.hh:95 msgid "Select insert mode" msgstr "" #: ../gtk/data/MainWindow.ui.h:13 ../qt/src/Ui_MainWindow.hh:109 msgid "Select page" msgstr "" #: ../gtk/data/MainWindow.ui.h:14 ../qt/data/MainWindow.ui.h:35 msgid "Image controls" msgstr "" #: ../gtk/data/MainWindow.ui.h:15 ../qt/src/Ui_MainWindow.hh:139 msgid "Plain text" msgstr "" #: ../gtk/data/MainWindow.ui.h:16 ../qt/src/Ui_MainWindow.hh:139 msgid "hOCR, PDF" msgstr "" #: ../gtk/data/MainWindow.ui.h:17 ../qt/data/MainWindow.ui.h:37 msgid "Autodetect layout" msgstr "" #: ../gtk/data/MainWindow.ui.h:18 msgid "Recognize all" msgstr "" #: ../gtk/data/MainWindow.ui.h:19 msgid "Select language" msgstr "" #: ../gtk/data/MainWindow.ui.h:20 ../qt/src/Ui_MainWindow.hh:205 msgid "Add images" msgstr "" #: ../gtk/data/MainWindow.ui.h:21 ../qt/src/Ui_MainWindow.hh:204 msgid "Add Images" msgstr "" #: ../gtk/data/MainWindow.ui.h:22 ../qt/src/Ui_MainWindow.hh:210 msgid "Remove image from list" msgstr "" #: ../gtk/data/MainWindow.ui.h:23 ../qt/src/Ui_MainWindow.hh:213 msgid "Delete image" msgstr "" #: ../gtk/data/MainWindow.ui.h:24 ../qt/src/Ui_MainWindow.hh:216 msgid "Clear list" msgstr "" #: ../gtk/data/MainWindow.ui.h:25 ../qt/data/MainWindow.ui.h:5 msgid "Files" msgstr "" #: ../gtk/data/MainWindow.ui.h:26 ../qt/data/MainWindow.ui.h:8 msgid "Device:" msgstr "" #: ../gtk/data/MainWindow.ui.h:27 ../gtk/data/TessdataManager.ui.h:4 #: ../qt/data/MainWindow.ui.h:7 ../qt/src/TessdataManager.cc:59 msgid "Refresh" msgstr "" #: ../gtk/data/MainWindow.ui.h:28 ../qt/data/MainWindow.ui.h:9 msgid "Output:" msgstr "" #: ../gtk/data/MainWindow.ui.h:29 ../qt/data/MainWindow.ui.h:13 msgid "Mode:" msgstr "" #: ../gtk/data/MainWindow.ui.h:30 ../gtk/src/hocr/HOCRPdfExporter.cc:313 #: ../qt/data/MainWindow.ui.h:15 ../qt/src/hocr/HOCRPdfExporter.cc:347 msgid "Color" msgstr "" #: ../gtk/data/MainWindow.ui.h:31 ../gtk/src/hocr/HOCRPdfExporter.cc:316 #: ../qt/data/MainWindow.ui.h:14 ../qt/src/hocr/HOCRPdfExporter.cc:349 #: ../qt/src/hocr/HOCRPdfExporter.cc:351 msgid "Grayscale" msgstr "" #: ../gtk/data/MainWindow.ui.h:32 ../qt/data/MainWindow.ui.h:10 msgid "Resolution:" msgstr "" #: ../gtk/data/MainWindow.ui.h:33 ../qt/data/MainWindow.ui.h:11 msgid "Scan" msgstr "" #: ../gtk/data/MainWindow.ui.h:34 ../qt/data/MainWindow.ui.h:16 msgid "Source:" msgstr "" #: ../gtk/data/MainWindow.ui.h:35 ../qt/data/MainWindow.ui.h:6 msgid "Acquire" msgstr "" #: ../gtk/data/MainWindow.ui.h:36 ../qt/data/MainWindow.ui.h:1 msgid "Brightness" msgstr "" #: ../gtk/data/MainWindow.ui.h:37 ../qt/data/MainWindow.ui.h:2 msgid "Contrast" msgstr "" #: ../gtk/data/MainWindow.ui.h:38 ../qt/data/MainWindow.ui.h:3 msgid "Resolution" msgstr "" #: ../gtk/data/MainWindow.ui.h:39 ../qt/data/MainWindow.ui.h:4 msgid "Invert colors" msgstr "" #: ../gtk/data/MainWindow.ui.h:40 msgid "A graphical frontend to tesseract-ocr" msgstr "" #: ../gtk/data/MainWindow.ui.h:41 ../qt/data/CharacterListDialog.ui.h:1 msgid "Character whitelist / blacklist" msgstr "" #: ../gtk/data/MainWindow.ui.h:42 ../qt/data/CharacterListDialog.ui.h:2 msgid "Exclude these characters from being recognized (blacklist):" msgstr "" #: ../gtk/data/MainWindow.ui.h:43 ../qt/data/CharacterListDialog.ui.h:3 msgid "Enter a string of characters..." msgstr "" #: ../gtk/data/MainWindow.ui.h:44 ../qt/data/CharacterListDialog.ui.h:4 msgid "Only allow the following characters to be recognized (whitelist):" msgstr "" #: ../gtk/data/MainWindow.ui.h:45 ../qt/data/PageRangeDialog.ui.h:1 msgid "Page Range" msgstr "" #: ../gtk/data/MainWindow.ui.h:48 ../qt/data/PageRangeDialog.ui.h:2 msgid "Page range:" msgstr "" #: ../gtk/data/MainWindow.ui.h:49 ../qt/data/PageRangeDialog.ui.h:3 msgid "Example: 1-10, 13, 14-18" msgstr "" #: ../gtk/data/MainWindow.ui.h:50 ../qt/data/PageRangeDialog.ui.h:4 msgid "Recognition area:" msgstr "" #: ../gtk/data/MainWindow.ui.h:51 ../gtk/src/Recognizer.cc:375 #: ../qt/data/PageRangeDialog.ui.h:5 ../qt/src/Recognizer.cc:369 msgid "Entire page" msgstr "" #: ../gtk/data/MainWindow.ui.h:52 ../qt/data/PageRangeDialog.ui.h:6 msgid "Autodetect" msgstr "" #: ../gtk/data/MainWindow.ui.h:53 ../qt/data/PageRangeDialog.ui.h:7 msgid "Prepend to output text:" msgstr "" #: ../gtk/data/MainWindow.ui.h:54 ../qt/data/PageRangeDialog.ui.h:8 msgid "Source filename" msgstr "" #: ../gtk/data/MainWindow.ui.h:55 ../qt/data/PageRangeDialog.ui.h:9 msgid "Source page" msgstr "" #: ../gtk/data/MainWindow.ui.h:56 ../qt/src/SourceManager.cc:146 msgid "Protected PDF" msgstr "" #: ../gtk/data/MainWindow.ui.h:57 ../qt/src/Recognizer.cc:76 msgid "Current Page" msgstr "" #: ../gtk/data/MainWindow.ui.h:58 ../qt/src/Recognizer.cc:79 msgid "Multiple Pages..." msgstr "" #: ../gtk/data/OutputEditorHOCR.ui.h:1 ../qt/src/hocr/OutputEditorHOCR.cc:580 msgid "Add Word" msgstr "" #: ../gtk/data/OutputEditorHOCR.ui.h:4 ../qt/src/hocr/OutputEditorHOCR.cc:580 msgid "Enter word:" msgstr "" #: ../gtk/data/OutputEditorHOCR.ui.h:5 ../qt/src/hocr/Ui_OutputEditorHOCR.hh:61 #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:62 msgid "Export to plain text" msgstr "" #: ../gtk/data/OutputEditorHOCR.ui.h:6 ../qt/src/hocr/Ui_OutputEditorHOCR.hh:64 #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:65 msgid "Export to PDF" msgstr "" #: ../gtk/data/OutputEditorHOCR.ui.h:7 ../qt/src/hocr/Ui_OutputEditorHOCR.hh:67 #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:68 msgid "Export to ODT" msgstr "" #: ../gtk/data/OutputEditorHOCR.ui.h:8 ../gtk/data/OutputEditorText.ui.h:18 #: ../qt/src/Ui_OutputEditorText.hh:116 msgid "Save output" msgstr "" #: ../gtk/data/OutputEditorHOCR.ui.h:9 ../qt/src/hocr/Ui_OutputEditorHOCR.hh:72 #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:73 msgid "Export" msgstr "" #: ../gtk/data/OutputEditorHOCR.ui.h:10 ../gtk/data/OutputEditorText.ui.h:19 #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:77 #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:78 #: ../qt/src/Ui_OutputEditorText.hh:118 msgid "Clear output" msgstr "" #: ../gtk/data/OutputEditorHOCR.ui.h:11 ../gtk/data/OutputEditorText.ui.h:15 #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:80 #: ../qt/src/Ui_OutputEditorText.hh:107 msgid "Find and replace" msgstr "" #: ../gtk/data/OutputEditorHOCR.ui.h:12 #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:82 #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:83 msgid "Show confidence values" msgstr "" #: ../gtk/data/OutputEditorHOCR.ui.h:13 ../gtk/data/PdfExportDialog.ui.h:41 #: ../qt/data/PdfExportDialog.ui.h:2 ../qt/src/hocr/Ui_OutputEditorHOCR.hh:85 #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:86 msgid "Show preview" msgstr "" #: ../gtk/data/OutputEditorHOCR.ui.h:14 #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:121 msgid "Next (F3)" msgstr "" #: ../gtk/data/OutputEditorHOCR.ui.h:15 #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:122 msgid "Previous (Shift+F3)" msgstr "" #: ../gtk/data/OutputEditorHOCR.ui.h:16 ../gtk/src/hocr/OutputEditorHOCR.cc:890 #: ../qt/src/hocr/OutputEditorHOCR.cc:730 #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:126 msgid "Expand all" msgstr "" #: ../gtk/data/OutputEditorHOCR.ui.h:17 ../gtk/src/hocr/OutputEditorHOCR.cc:893 #: ../qt/src/hocr/OutputEditorHOCR.cc:731 #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:127 msgid "Collapse all" msgstr "" #: ../gtk/data/OutputEditorHOCR.ui.h:18 #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:148 msgid "Properties" msgstr "" #: ../gtk/data/OutputEditorHOCR.ui.h:19 #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:152 msgid "Source" msgstr "" #. Output insert mode #: ../gtk/data/OutputEditorText.ui.h:1 ../qt/src/Ui_OutputEditorText.hh:52 msgid "Append to current text" msgstr "" #: ../gtk/data/OutputEditorText.ui.h:2 ../qt/src/Ui_OutputEditorText.hh:53 msgid "Insert at cursor" msgstr "" #: ../gtk/data/OutputEditorText.ui.h:3 ../qt/src/Ui_OutputEditorText.hh:54 msgid "Replace current text" msgstr "" #. Output postprocessing #: ../gtk/data/OutputEditorText.ui.h:4 ../qt/src/Ui_OutputEditorText.hh:62 msgid "Keep line break if..." msgstr "" #: ../gtk/data/OutputEditorText.ui.h:5 ../qt/src/Ui_OutputEditorText.hh:64 msgid "Preceded by end mark (.?!)" msgstr "" #: ../gtk/data/OutputEditorText.ui.h:6 ../qt/src/Ui_OutputEditorText.hh:66 msgid "Preceded or succeeded by quote" msgstr "" #: ../gtk/data/OutputEditorText.ui.h:7 ../qt/src/Ui_OutputEditorText.hh:68 msgid "Other options" msgstr "" #: ../gtk/data/OutputEditorText.ui.h:8 ../qt/src/Ui_OutputEditorText.hh:70 msgid "Join hyphenated words" msgstr "" #: ../gtk/data/OutputEditorText.ui.h:9 ../qt/src/Ui_OutputEditorText.hh:72 msgid "Collapse whitespace" msgstr "" #: ../gtk/data/OutputEditorText.ui.h:10 ../qt/src/Ui_OutputEditorText.hh:74 msgid "Preserve paragraphs" msgstr "" #: ../gtk/data/OutputEditorText.ui.h:11 ../qt/src/Ui_OutputEditorText.hh:76 msgid "Visual aids" msgstr "" #: ../gtk/data/OutputEditorText.ui.h:12 ../qt/src/Ui_OutputEditorText.hh:78 msgid "Draw whitespace" msgstr "" #: ../gtk/data/OutputEditorText.ui.h:14 ../qt/src/Ui_OutputEditorText.hh:102 msgid "Strip line breaks on selected text" msgstr "" #: ../gtk/data/OutputEditorText.ui.h:16 ../qt/src/Ui_OutputEditorText.hh:109 #: ../qt/src/Ui_OutputEditorText.hh:110 msgid "Undo" msgstr "" #: ../gtk/data/OutputEditorText.ui.h:17 ../qt/src/Ui_OutputEditorText.hh:112 #: ../qt/src/Ui_OutputEditorText.hh:113 msgid "Redo" msgstr "" #: ../gtk/data/PdfExportDialog.ui.h:1 ../qt/data/PdfExportDialog.ui.h:1 msgid "PDF Export" msgstr "" #: ../gtk/data/PdfExportDialog.ui.h:4 ../qt/data/PdfExportDialog.ui.h:4 msgid "Output mode:" msgstr "" #: ../gtk/data/PdfExportDialog.ui.h:5 ../qt/data/PdfExportDialog.ui.h:6 msgid "PDF" msgstr "" #: ../gtk/data/PdfExportDialog.ui.h:6 ../qt/data/PdfExportDialog.ui.h:7 msgid "PDF with invisible text overlay" msgstr "" #: ../gtk/data/PdfExportDialog.ui.h:7 ../qt/data/PdfExportDialog.ui.h:16 msgid "Format:" msgstr "" #: ../gtk/data/PdfExportDialog.ui.h:8 ../qt/data/PdfExportDialog.ui.h:17 msgid "Compression:" msgstr "" #: ../gtk/data/PdfExportDialog.ui.h:9 ../qt/data/PdfExportDialog.ui.h:14 msgid "Compression quality:" msgstr "" #: ../gtk/data/PdfExportDialog.ui.h:10 ../qt/data/PdfExportDialog.ui.h:15 msgid "DPI:" msgstr "" #: ../gtk/data/PdfExportDialog.ui.h:11 ../qt/data/PdfExportDialog.ui.h:18 msgid "Dithering algorithm:" msgstr "" #: ../gtk/data/PdfExportDialog.ui.h:12 ../qt/data/PdfExportDialog.ui.h:13 msgid "Image settings:" msgstr "" #: ../gtk/data/PdfExportDialog.ui.h:13 ../qt/data/PdfExportDialog.ui.h:25 msgid "Uniformize line and word spacing" msgstr "" #: ../gtk/data/PdfExportDialog.ui.h:14 ../qt/data/PdfExportDialog.ui.h:21 msgid "Override font family:" msgstr "" #: ../gtk/data/PdfExportDialog.ui.h:15 ../qt/data/PdfExportDialog.ui.h:27 msgid "Fallback font family:" msgstr "" #: ../gtk/data/PdfExportDialog.ui.h:16 ../qt/data/PdfExportDialog.ui.h:20 msgid "Override font size:" msgstr "" #: ../gtk/data/PdfExportDialog.ui.h:17 ../qt/data/PdfExportDialog.ui.h:23 msgid "Font scaling:" msgstr "" #: ../gtk/data/PdfExportDialog.ui.h:18 ../qt/data/PdfExportDialog.ui.h:26 msgid "pt" msgstr "" #: ../gtk/data/PdfExportDialog.ui.h:19 ../qt/data/PdfExportDialog.ui.h:22 msgid "Preserve spaces wider than:" msgstr "" #: ../gtk/data/PdfExportDialog.ui.h:20 ../qt/data/PdfExportDialog.ui.h:24 msgid "characters" msgstr "" #: ../gtk/data/PdfExportDialog.ui.h:21 ../qt/data/PdfExportDialog.ui.h:28 msgid "Sanitize hyphens before line breaks" msgstr "" #: ../gtk/data/PdfExportDialog.ui.h:22 ../qt/data/PdfExportDialog.ui.h:19 msgid "Text settings:" msgstr "" #: ../gtk/data/PdfExportDialog.ui.h:23 ../qt/data/PdfExportDialog.ui.h:10 msgid "Paper size:" msgstr "" #: ../gtk/data/PdfExportDialog.ui.h:24 ../qt/data/PdfExportDialog.ui.h:11 msgid "Width" msgstr "" #: ../gtk/data/PdfExportDialog.ui.h:25 ../qt/data/PdfExportDialog.ui.h:12 msgid "Height" msgstr "" #: ../gtk/data/PdfExportDialog.ui.h:26 ../qt/data/PdfExportDialog.ui.h:29 msgid "Treat image sources as having true DPI:" msgstr "" #: ../gtk/data/PdfExportDialog.ui.h:27 ../qt/data/PdfExportDialog.ui.h:3 msgid "Basic" msgstr "" #: ../gtk/data/PdfExportDialog.ui.h:28 ../qt/data/PdfExportDialog.ui.h:31 msgid "PDF version:" msgstr "" #: ../gtk/data/PdfExportDialog.ui.h:29 ../qt/data/PdfExportDialog.ui.h:33 msgid "Password:" msgstr "" #: ../gtk/data/PdfExportDialog.ui.h:30 ../qt/data/PdfExportDialog.ui.h:34 msgid "Confirm password:" msgstr "" #: ../gtk/data/PdfExportDialog.ui.h:31 ../qt/data/PdfExportDialog.ui.h:32 msgid "Encryption (optional):" msgstr "" #: ../gtk/data/PdfExportDialog.ui.h:32 ../qt/data/PdfExportDialog.ui.h:36 msgid "Author:" msgstr "" #: ../gtk/data/PdfExportDialog.ui.h:33 ../qt/data/PdfExportDialog.ui.h:38 msgid "Title:" msgstr "" #: ../gtk/data/PdfExportDialog.ui.h:34 ../qt/data/PdfExportDialog.ui.h:40 msgid "Subject:" msgstr "" #: ../gtk/data/PdfExportDialog.ui.h:35 ../qt/data/PdfExportDialog.ui.h:37 msgid "Creator:" msgstr "" #: ../gtk/data/PdfExportDialog.ui.h:36 ../qt/data/PdfExportDialog.ui.h:39 msgid "Producer:" msgstr "" #: ../gtk/data/PdfExportDialog.ui.h:37 ../qt/data/PdfExportDialog.ui.h:41 msgid "Keywords:" msgstr "" #: ../gtk/data/PdfExportDialog.ui.h:38 ../qt/data/PdfExportDialog.ui.h:35 msgid "Additional information (optional):" msgstr "" #: ../gtk/data/PdfExportDialog.ui.h:39 ../qt/data/PdfExportDialog.ui.h:42 msgid "Import from current source" msgstr "" #: ../gtk/data/PdfExportDialog.ui.h:40 ../qt/data/PdfExportDialog.ui.h:30 msgid "Advanced" msgstr "" #: ../gtk/data/SearchReplaceFrame.ui.h:1 ../qt/data/SearchReplaceFrame.ui.h:4 msgid "Find" msgstr "" #: ../gtk/data/SearchReplaceFrame.ui.h:2 ../qt/data/SearchReplaceFrame.ui.h:2 msgid "Replace" msgstr "" #: ../gtk/data/SearchReplaceFrame.ui.h:3 ../qt/data/SearchReplaceFrame.ui.h:3 msgid "Replace all" msgstr "" #: ../gtk/data/SearchReplaceFrame.ui.h:4 ../qt/data/SearchReplaceFrame.ui.h:5 msgid "Find previous" msgstr "" #: ../gtk/data/SearchReplaceFrame.ui.h:5 ../qt/data/SearchReplaceFrame.ui.h:6 msgid "Find next" msgstr "" #: ../gtk/data/SearchReplaceFrame.ui.h:6 ../qt/data/SearchReplaceFrame.ui.h:7 msgid "Match case" msgstr "" #: ../gtk/data/SearchReplaceFrame.ui.h:7 #: ../gtk/data/SubstitutionsManager.ui.h:1 ../qt/data/SearchReplaceFrame.ui.h:1 #: ../qt/src/SubstitutionsManager.cc:36 msgid "Substitutions" msgstr "" #: ../gtk/data/SelectionMenu.ui.h:1 ../qt/src/DisplayerToolSelect.cc:239 msgid "Delete" msgstr "" #: ../gtk/data/SelectionMenu.ui.h:2 ../qt/src/DisplayerToolSelect.cc:225 msgid "Order:" msgstr "" #: ../gtk/data/SelectionMenu.ui.h:3 ../gtk/src/hocr/DisplayerToolHOCR.cc:29 #: ../qt/src/DisplayerToolSelect.cc:240 ../qt/src/hocr/DisplayerToolHOCR.cc:31 msgid "Recognize" msgstr "" #: ../gtk/data/SelectionMenu.ui.h:4 ../qt/src/DisplayerToolSelect.cc:241 msgid "Recognize to clipboard" msgstr "" #: ../gtk/data/SelectionMenu.ui.h:5 ../qt/src/DisplayerToolSelect.cc:242 msgid "Save as image" msgstr "" #: ../gtk/data/SubstitutionsManager.ui.h:2 ../qt/src/SubstitutionsManager.cc:38 #: ../qt/src/SubstitutionsManager.cc:39 msgid "Open" msgstr "" #: ../gtk/data/SubstitutionsManager.ui.h:3 ../gtk/src/Utils.cc:73 #: ../qt/src/SubstitutionsManager.cc:41 ../qt/src/SubstitutionsManager.cc:42 msgid "Save" msgstr "" #: ../gtk/data/SubstitutionsManager.ui.h:4 ../qt/src/SubstitutionsManager.cc:44 #: ../qt/src/SubstitutionsManager.cc:45 msgid "Clear" msgstr "" #: ../gtk/data/SubstitutionsManager.ui.h:5 ../qt/data/ConfigDialog.ui.h:16 #: ../qt/src/SubstitutionsManager.cc:47 ../qt/src/SubstitutionsManager.cc:48 msgid "Add" msgstr "" #: ../gtk/data/SubstitutionsManager.ui.h:6 #: ../gtk/src/hocr/OutputEditorHOCR.cc:886 ../qt/data/ConfigDialog.ui.h:17 #: ../qt/src/hocr/OutputEditorHOCR.cc:727 ../qt/src/SubstitutionsManager.cc:50 #: ../qt/src/SubstitutionsManager.cc:51 msgid "Remove" msgstr "" #: ../gtk/data/SubstitutionsManager.ui.h:7 ../gtk/data/TessdataManager.ui.h:2 msgid "Apply" msgstr "" #: ../gtk/data/SubstitutionsManager.ui.h:8 ../gtk/data/TessdataManager.ui.h:3 msgid "Close" msgstr "" #: ../gtk/data/TessdataManager.ui.h:1 ../qt/src/TessdataManager.cc:49 msgid "Tessdata Manager" msgstr "" #: ../gtk/data/TessdataManager.ui.h:5 ../qt/src/TessdataManager.cc:51 msgid "Manage installed languages:" msgstr "" #: ../gtk/src/Acquirer.cc:79 ../qt/src/Acquirer.cc:70 msgid "scan.png" msgstr "" #: ../gtk/src/Acquirer.cc:91 ../qt/src/Acquirer.cc:85 msgid "Images" msgstr "" #: ../gtk/src/Acquirer.cc:92 ../qt/src/Acquirer.cc:86 msgid "Choose Output Filename..." msgstr "" #: ../gtk/src/Acquirer.cc:106 ../qt/src/Acquirer.cc:100 msgid "Failed to initialize the scanning backend." msgstr "" #: ../gtk/src/Acquirer.cc:115 ../qt/src/Acquirer.cc:106 msgid "Scan failed" msgstr "" #: ../gtk/src/Acquirer.cc:133 ../qt/src/Acquirer.cc:122 msgid "No scanners were detected." msgstr "" #: ../gtk/src/Acquirer.cc:150 ../gtk/src/Acquirer.cc:168 #: ../qt/src/Acquirer.cc:136 ../qt/src/Acquirer.cc:154 msgid "Starting scan..." msgstr "" #: ../gtk/src/Acquirer.cc:164 ../qt/src/Acquirer.cc:150 msgid "Opening device..." msgstr "" #: ../gtk/src/Acquirer.cc:166 ../qt/src/Acquirer.cc:152 msgid "Setting options..." msgstr "" #: ../gtk/src/Acquirer.cc:170 ../qt/src/Acquirer.cc:156 msgid "Getting parameters..." msgstr "" #: ../gtk/src/Acquirer.cc:172 ../qt/src/Acquirer.cc:158 msgid "Transferring data..." msgstr "" #: ../gtk/src/Acquirer.cc:179 ../qt/src/Acquirer.cc:165 msgid "Canceling scan..." msgstr "" #: ../gtk/src/Config.cc:49 ../qt/data/ConfigDialog.ui.h:7 msgid "Filename prefix" msgstr "" #: ../gtk/src/Config.cc:50 ../qt/data/ConfigDialog.ui.h:8 msgid "Code" msgstr "" #: ../gtk/src/Config.cc:51 ../qt/data/ConfigDialog.ui.h:9 msgid "Native name" msgstr "" #: ../gtk/src/Config.cc:109 ../qt/src/Config.cc:108 msgid "Script" msgstr "" #: ../gtk/src/CrashHandler.cc:25 ../gtk/src/CrashHandler.cc:41 #: ../qt/src/CrashHandler.cc:36 msgid "Crash Handler" msgstr "" #: ../gtk/src/CrashHandler.cc:43 ../qt/src/CrashHandler.cc:31 msgid "Your work has been saved under %1." msgstr "" #: ../gtk/src/CrashHandler.cc:45 ../qt/src/CrashHandler.cc:33 msgid "There was no unsaved work." msgstr "" #: ../gtk/src/CrashHandler.cc:106 ../qt/src/CrashHandler.cc:62 msgid "Failed to obtain backtrace. Is gdb installed?" msgstr "" #: ../gtk/src/Displayer.cc:232 ../qt/src/Displayer.cc:174 msgid "Failed to load image" msgstr "" #: ../gtk/src/Displayer.cc:232 ../qt/src/Displayer.cc:174 msgid "" "The file might not be an image or be corrupt:\n" "%1" msgstr "" #: ../gtk/src/DisplayerToolSelect.cc:138 ../qt/src/DisplayerToolSelect.cc:135 msgid "PNG Images" msgstr "" #: ../gtk/src/DisplayerToolSelect.cc:139 ../qt/src/DisplayerToolSelect.cc:135 msgid "Save Selection Image" msgstr "" #: ../gtk/src/DisplayerToolSelect.cc:139 ../qt/src/DisplayerToolSelect.cc:135 msgid "selection.png" msgstr "" #: ../gtk/src/DisplayerToolSelect.cc:146 ../qt/src/DisplayerToolSelect.cc:142 msgid "Recognize all" msgstr "" #: ../gtk/src/DisplayerToolSelect.cc:146 ../qt/src/DisplayerToolSelect.cc:142 msgid "Recognize selection" msgstr "" #: ../gtk/src/DisplayerToolSelect.cc:186 ../qt/src/DisplayerToolSelect.cc:182 msgid "Performing layout analysis" msgstr "" #: ../gtk/src/FileDialogs.cc:235 msgid "" "A file named \"%1\" already exists. Are you sure you want to overwrite it?" msgstr "" #: ../gtk/src/FileDialogs.cc:237 msgid "Overwrite File?" msgstr "" #: ../gtk/src/hocr/HOCRDocument.cc:611 ../gtk/src/hocr/OutputEditorHOCR.cc:266 #: ../qt/src/hocr/OutputEditorHOCR.cc:229 msgid "Page" msgstr "" #: ../gtk/src/hocr/HOCRDocument.cc:613 ../qt/src/hocr/HOCRDocument.cc:530 msgid "Text block" msgstr "" #: ../gtk/src/hocr/HOCRDocument.cc:615 ../gtk/src/hocr/OutputEditorHOCR.cc:272 #: ../qt/src/hocr/HOCRDocument.cc:532 ../qt/src/hocr/OutputEditorHOCR.cc:231 msgid "Paragraph" msgstr "" #: ../gtk/src/hocr/HOCRDocument.cc:617 ../qt/src/hocr/HOCRDocument.cc:534 msgid "Textline" msgstr "" #: ../gtk/src/hocr/HOCRDocument.cc:621 ../qt/src/hocr/HOCRDocument.cc:538 msgid "Graphic" msgstr "" #: ../gtk/src/hocr/HOCROdtExporter.cc:65 ../gtk/src/hocr/HOCRPdfExporter.cc:489 #: ../gtk/src/hocr/HOCRTextExporter.cc:34 #: ../gtk/src/hocr/OutputEditorHOCR.cc:963 ../gtk/src/OutputEditorText.cc:272 #: ../qt/src/hocr/HOCROdtExporter.cc:50 ../qt/src/hocr/HOCRPdfExporter.cc:478 #: ../qt/src/hocr/HOCRTextExporter.cc:36 ../qt/src/hocr/OutputEditorHOCR.cc:830 #: ../qt/src/OutputEditorText.cc:238 msgid "output" msgstr "" #: ../gtk/src/hocr/HOCROdtExporter.cc:68 ../qt/src/hocr/HOCROdtExporter.cc:53 msgid "OpenDocument Text Documents" msgstr "" #: ../gtk/src/hocr/HOCROdtExporter.cc:69 ../qt/src/hocr/HOCROdtExporter.cc:53 msgid "Save ODT Output..." msgstr "" #: ../gtk/src/hocr/HOCROdtExporter.cc:77 ../gtk/src/hocr/HOCROdtExporter.cc:342 #: ../gtk/src/hocr/HOCRPdfExporter.cc:619 #: ../gtk/src/hocr/HOCRTextExporter.cc:46 ../qt/src/hocr/HOCROdtExporter.cc:61 #: ../qt/src/hocr/HOCRPdfExporter.cc:609 ../qt/src/hocr/HOCRTextExporter.cc:47 msgid "Export failed" msgstr "" #: ../gtk/src/hocr/HOCROdtExporter.cc:77 ../gtk/src/hocr/HOCROdtExporter.cc:342 #: ../qt/src/hocr/HOCROdtExporter.cc:61 msgid "The ODT export failed: unable to write output file." msgstr "" #: ../gtk/src/hocr/HOCROdtExporter.cc:336 ../qt/src/hocr/HOCROdtExporter.cc:254 msgid "Exporting to ODT..." msgstr "" #: ../gtk/src/hocr/HOCRPdfExporter.cc:283 ../qt/src/hocr/HOCRPdfExporter.cc:365 msgid "Same as source" msgstr "" #: ../gtk/src/hocr/HOCRPdfExporter.cc:286 ../qt/src/hocr/HOCRPdfExporter.cc:366 msgid "Custom" msgstr "" #: ../gtk/src/hocr/HOCRPdfExporter.cc:300 ../qt/src/hocr/HOCRPdfExporter.cc:362 msgid "cm" msgstr "" #: ../gtk/src/hocr/HOCRPdfExporter.cc:303 ../qt/src/hocr/HOCRPdfExporter.cc:363 msgid "in" msgstr "" #: ../gtk/src/hocr/HOCRPdfExporter.cc:319 ../qt/src/hocr/HOCRPdfExporter.cc:353 msgid "Monochrome" msgstr "" #: ../gtk/src/hocr/HOCRPdfExporter.cc:328 ../qt/src/hocr/HOCRPdfExporter.cc:355 msgid "Threshold (closest color)" msgstr "" #: ../gtk/src/hocr/HOCRPdfExporter.cc:331 ../qt/src/hocr/HOCRPdfExporter.cc:356 msgid "Diffuse" msgstr "" #: ../gtk/src/hocr/HOCRPdfExporter.cc:340 ../qt/src/hocr/HOCRPdfExporter.cc:357 msgid "Zip (lossless)" msgstr "" #: ../gtk/src/hocr/HOCRPdfExporter.cc:344 ../qt/src/hocr/HOCRPdfExporter.cc:358 msgid "CCITT Group 4 (lossless)" msgstr "" #: ../gtk/src/hocr/HOCRPdfExporter.cc:348 ../qt/src/hocr/HOCRPdfExporter.cc:359 msgid "Jpeg (lossy)" msgstr "" #: ../gtk/src/hocr/HOCRPdfExporter.cc:493 ../qt/src/hocr/HOCRPdfExporter.cc:482 msgid "PDF Files" msgstr "" #: ../gtk/src/hocr/HOCRPdfExporter.cc:494 ../qt/src/hocr/HOCRPdfExporter.cc:482 msgid "Save PDF Output..." msgstr "" #: ../gtk/src/hocr/HOCRPdfExporter.cc:500 ../qt/src/hocr/HOCRPdfExporter.cc:488 msgid "Invalid Output" msgstr "" #: ../gtk/src/hocr/HOCRPdfExporter.cc:500 ../qt/src/hocr/HOCRPdfExporter.cc:488 msgid "Cannot overwrite a file which is a source image of this document." msgstr "" #: ../gtk/src/hocr/HOCRPdfExporter.cc:516 ../qt/src/hocr/HOCRPdfExporter.cc:511 msgid "Failed to create output" msgstr "" #: ../gtk/src/hocr/HOCRPdfExporter.cc:516 ../qt/src/hocr/HOCRPdfExporter.cc:511 msgid "Failed to create output. The returned error was: %1" msgstr "" #: ../gtk/src/hocr/HOCRPdfExporter.cc:558 ../qt/src/hocr/HOCRPdfExporter.cc:551 msgid "The operation was cancelled" msgstr "" #: ../gtk/src/hocr/HOCRPdfExporter.cc:607 ../qt/src/hocr/HOCRPdfExporter.cc:597 msgid "Failed to render page %1" msgstr "" #: ../gtk/src/hocr/HOCRPdfExporter.cc:614 ../qt/src/hocr/HOCRPdfExporter.cc:604 msgid "Exporting to PDF..." msgstr "" #: ../gtk/src/hocr/HOCRPdfExporter.cc:619 ../qt/src/hocr/HOCRPdfExporter.cc:609 msgid "The PDF export failed: %1." msgstr "" #: ../gtk/src/hocr/HOCRPdfExporter.cc:673 ../qt/src/hocr/HOCRPdfExporter.cc:662 msgid "The PDF library could not load the font '%1'." msgstr "" #: ../gtk/src/hocr/HOCRTextExporter.cc:37 ../gtk/src/OutputEditorText.cc:274 #: ../qt/src/hocr/HOCRTextExporter.cc:39 ../qt/src/OutputEditorText.cc:239 msgid "Text Files" msgstr "" #: ../gtk/src/hocr/HOCRTextExporter.cc:38 ../qt/src/hocr/HOCRTextExporter.cc:39 msgid "Save Text Output..." msgstr "" #: ../gtk/src/hocr/HOCRTextExporter.cc:46 ../qt/src/hocr/HOCRTextExporter.cc:47 msgid "The text export failed: unable to write output file." msgstr "" #: ../gtk/src/hocr/OutputEditorHOCR.cc:269 #: ../qt/src/hocr/OutputEditorHOCR.cc:230 msgid "Block" msgstr "" #: ../gtk/src/hocr/OutputEditorHOCR.cc:275 #: ../qt/src/hocr/OutputEditorHOCR.cc:232 msgid "Line" msgstr "" #: ../gtk/src/hocr/OutputEditorHOCR.cc:278 #: ../qt/src/hocr/OutputEditorHOCR.cc:233 msgid "Word" msgstr "" #: ../gtk/src/hocr/OutputEditorHOCR.cc:281 #: ../qt/src/hocr/OutputEditorHOCR.cc:234 msgid "Misspelled word" msgstr "" #: ../gtk/src/hocr/OutputEditorHOCR.cc:435 #: ../qt/src/hocr/OutputEditorHOCR.cc:317 msgid "" "The following pages could not be processed:\n" "%1" msgstr "" #: ../gtk/src/hocr/OutputEditorHOCR.cc:436 #: ../qt/src/hocr/OutputEditorHOCR.cc:318 msgid "Recognition errors" msgstr "" #: ../gtk/src/hocr/OutputEditorHOCR.cc:594 #: ../qt/src/hocr/OutputEditorHOCR.cc:500 #: ../qt/src/hocr/OutputEditorHOCR.cc:512 msgid "Multiple values" msgstr "" #. Merging allowed #: ../gtk/src/hocr/OutputEditorHOCR.cc:778 #: ../qt/src/hocr/OutputEditorHOCR.cc:641 msgid "Merge" msgstr "" #: ../gtk/src/hocr/OutputEditorHOCR.cc:786 #: ../gtk/src/hocr/OutputEditorHOCR.cc:877 #: ../qt/src/hocr/OutputEditorHOCR.cc:643 #: ../qt/src/hocr/OutputEditorHOCR.cc:725 msgid "Split from parent" msgstr "" #. Swapping allowed #: ../gtk/src/hocr/OutputEditorHOCR.cc:797 #: ../qt/src/hocr/OutputEditorHOCR.cc:647 msgid "Swap" msgstr "" #: ../gtk/src/hocr/OutputEditorHOCR.cc:821 #: ../qt/src/hocr/OutputEditorHOCR.cc:693 msgid "Add graphic region" msgstr "" #: ../gtk/src/hocr/OutputEditorHOCR.cc:824 #: ../qt/src/hocr/OutputEditorHOCR.cc:694 msgid "Add text block" msgstr "" #: ../gtk/src/hocr/OutputEditorHOCR.cc:828 #: ../qt/src/hocr/OutputEditorHOCR.cc:696 msgid "Add paragraph" msgstr "" #: ../gtk/src/hocr/OutputEditorHOCR.cc:832 #: ../qt/src/hocr/OutputEditorHOCR.cc:698 msgid "Add line" msgstr "" #: ../gtk/src/hocr/OutputEditorHOCR.cc:836 #: ../qt/src/hocr/OutputEditorHOCR.cc:700 msgid "Add word" msgstr "" #: ../gtk/src/hocr/OutputEditorHOCR.cc:852 #: ../qt/src/hocr/OutputEditorHOCR.cc:710 msgid "No suggestions" msgstr "" #: ../gtk/src/hocr/OutputEditorHOCR.cc:858 #: ../qt/src/hocr/OutputEditorHOCR.cc:714 msgid "Add to dictionary" msgstr "" #: ../gtk/src/hocr/OutputEditorHOCR.cc:864 #: ../qt/src/hocr/OutputEditorHOCR.cc:716 msgid "Ignore word" msgstr "" #: ../gtk/src/hocr/OutputEditorHOCR.cc:926 #: ../gtk/src/hocr/OutputEditorHOCR.cc:965 #: ../qt/src/hocr/OutputEditorHOCR.cc:795 #: ../qt/src/hocr/OutputEditorHOCR.cc:832 msgid "hOCR HTML Files" msgstr "" #: ../gtk/src/hocr/OutputEditorHOCR.cc:927 #: ../qt/src/hocr/OutputEditorHOCR.cc:795 msgid "Open hOCR File" msgstr "" #: ../gtk/src/hocr/OutputEditorHOCR.cc:936 #: ../qt/src/hocr/OutputEditorHOCR.cc:802 msgid "Failed to open file" msgstr "" #: ../gtk/src/hocr/OutputEditorHOCR.cc:936 #: ../qt/src/hocr/OutputEditorHOCR.cc:802 msgid "The file could not be opened: %1." msgstr "" #: ../gtk/src/hocr/OutputEditorHOCR.cc:945 #: ../qt/src/hocr/OutputEditorHOCR.cc:809 msgid "Invalid hOCR file" msgstr "" #: ../gtk/src/hocr/OutputEditorHOCR.cc:945 #: ../qt/src/hocr/OutputEditorHOCR.cc:809 msgid "The file does not appear to contain valid hOCR HTML: %1" msgstr "" #: ../gtk/src/hocr/OutputEditorHOCR.cc:966 #: ../qt/src/hocr/OutputEditorHOCR.cc:832 msgid "Save hOCR Output..." msgstr "" #: ../gtk/src/hocr/OutputEditorHOCR.cc:973 ../gtk/src/OutputEditorText.cc:282 #: ../qt/src/hocr/OutputEditorHOCR.cc:839 ../qt/src/OutputEditorText.cc:246 msgid "Failed to save output" msgstr "" #: ../gtk/src/hocr/OutputEditorHOCR.cc:973 ../gtk/src/OutputEditorText.cc:282 #: ../qt/src/hocr/OutputEditorHOCR.cc:839 ../qt/src/OutputEditorText.cc:246 msgid "Check that you have writing permissions in the selected folder." msgstr "" #: ../gtk/src/hocr/OutputEditorHOCR.cc:1035 ../gtk/src/OutputEditorText.cc:296 #: ../qt/src/hocr/OutputEditorHOCR.cc:894 ../qt/src/OutputEditorText.cc:259 msgid "Output not saved" msgstr "" #: ../gtk/src/hocr/OutputEditorHOCR.cc:1035 ../gtk/src/OutputEditorText.cc:296 #: ../qt/src/hocr/OutputEditorHOCR.cc:894 ../qt/src/OutputEditorText.cc:259 msgid "Save output before proceeding?" msgstr "" #: ../gtk/src/hocr/OutputEditorHOCR.cc:1156 ../gtk/src/OutputEditorText.cc:184 #: ../qt/src/hocr/OutputEditorHOCR.cc:991 ../qt/src/OutputEditorText.cc:152 msgid "Replacing..." msgstr "" #: ../gtk/src/hocr/OutputEditorHOCR.cc:1181 ../gtk/src/OutputEditorText.cc:192 #: ../qt/src/hocr/OutputEditorHOCR.cc:1014 ../qt/src/OutputEditorText.cc:160 msgid "Applying substitutions..." msgstr "" #: ../gtk/src/MainWindow.cc:131 ../qt/src/MainWindow.cc:295 msgid "Using tesseract" msgstr "" #: ../gtk/src/MainWindow.cc:178 ../qt/src/MainWindow.cc:194 msgid "Select an image to begin..." msgstr "" #: ../gtk/src/MainWindow.cc:293 ../qt/src/MainWindow.cc:278 msgid "Multiple sources" msgstr "" #: ../gtk/src/MainWindow.cc:295 ../qt/src/MainWindow.cc:280 msgid "Ready" msgstr "" #: ../gtk/src/MainWindow.cc:442 ../qt/src/MainWindow.cc:423 msgid "New version" msgstr "" #: ../gtk/src/MainWindow.cc:442 ../qt/src/MainWindow.cc:423 msgid "gImageReader %1 is available" msgstr "" #: ../gtk/src/MainWindow.cc:443 ../qt/src/MainWindow.cc:424 msgid "Download" msgstr "" #: ../gtk/src/MainWindow.cc:444 ../qt/src/MainWindow.cc:425 msgid "Changelog" msgstr "" #: ../gtk/src/MainWindow.cc:445 ../qt/src/MainWindow.cc:426 msgid "Don't notify again" msgstr "" #: ../gtk/src/MainWindow.cc:466 ../qt/src/MainWindow.cc:474 msgid "Don't show again" msgstr "" #: ../gtk/src/MainWindow.cc:467 ../gtk/src/MainWindow.cc:480 #: ../qt/src/MainWindow.cc:475 msgid "Install" msgstr "" #: ../gtk/src/MainWindow.cc:487 ../qt/src/MainWindow.cc:487 msgid "Spelling dictionary missing" msgstr "" #: ../gtk/src/MainWindow.cc:487 ../qt/src/MainWindow.cc:487 msgid "The spellcheck dictionary for %1 is not installed" msgstr "" #: ../gtk/src/MainWindow.cc:494 ../gtk/src/MainWindow.cc:523 #: ../qt/src/MainWindow.cc:493 msgid "Installing spelling dictionary for '%1'" msgstr "" #: ../gtk/src/MainWindow.cc:515 ../gtk/src/MainWindow.cc:536 #: ../gtk/src/MainWindow.cc:544 ../gtk/src/MainWindow.cc:592 #: ../gtk/src/MainWindow.cc:597 ../gtk/src/TessdataManager.cc:60 #: ../gtk/src/TessdataManager.cc:70 ../gtk/src/TessdataManager.cc:339 #: ../qt/src/MainWindow.cc:512 ../qt/src/MainWindow.cc:525 #: ../qt/src/MainWindow.cc:534 ../qt/src/MainWindow.cc:578 #: ../qt/src/MainWindow.cc:583 ../qt/src/TessdataManager.cc:74 #: ../qt/src/TessdataManager.cc:84 ../qt/src/TessdataManager.cc:315 msgid "Error" msgstr "" #: ../gtk/src/MainWindow.cc:515 ../qt/src/MainWindow.cc:512 msgid "Failed to install spelling dictionary: %1" msgstr "" #: ../gtk/src/MainWindow.cc:536 ../qt/src/MainWindow.cc:525 msgid "Failed to create directory for spelling dictionaries." msgstr "" #: ../gtk/src/MainWindow.cc:544 ../qt/src/MainWindow.cc:534 msgid "Could not read %1: %2." msgstr "" #: ../gtk/src/MainWindow.cc:571 ../qt/src/MainWindow.cc:558 msgid "Downloading '%1'..." msgstr "" #: ../gtk/src/MainWindow.cc:592 ../qt/src/MainWindow.cc:578 msgid "" "The following dictionaries could not be downloaded:\n" "%1\n" "\n" "Check the connectivity and directory permissions.\n" "Hint: If you don't have write permissions in system folders, you can switch " "to user paths in the settings dialog." msgstr "" #: ../gtk/src/MainWindow.cc:595 ../qt/src/MainWindow.cc:581 msgid "Dictionaries installed" msgstr "" #: ../gtk/src/MainWindow.cc:595 msgid "" "The following dictionaries were installed:\n" "%1" msgstr "" #: ../gtk/src/MainWindow.cc:597 ../qt/src/MainWindow.cc:583 msgid "No spelling dictionaries found for '%1'." msgstr "" #: ../gtk/src/OutputEditorText.cc:154 ../qt/src/OutputEditorText.cc:137 msgid "Stripping line breaks..." msgstr "" #: ../gtk/src/OutputEditorText.cc:162 msgid "Check spelling" msgstr "" #: ../gtk/src/OutputEditorText.cc:231 ../qt/src/OutputEditorText.cc:196 msgid "File: %1" msgstr "" #: ../gtk/src/OutputEditorText.cc:234 ../qt/src/OutputEditorText.cc:199 msgid "Page: %1" msgstr "" #: ../gtk/src/OutputEditorText.cc:247 ../gtk/src/Recognizer.cc:471 #: ../qt/src/Recognizer.cc:462 msgid "" "\n" "[Failed to recognize page %1]\n" msgstr "" #: ../gtk/src/OutputEditorText.cc:275 ../qt/src/OutputEditorText.cc:239 msgid "Save Output..." msgstr "" #: ../gtk/src/Recognizer.cc:179 ../qt/src/Recognizer.cc:172 msgid "No languages available" msgstr "" #: ../gtk/src/Recognizer.cc:179 ../qt/src/Recognizer.cc:172 msgid "" "No tesseract languages are available for use. Recognition will not work." msgstr "" #: ../gtk/src/Recognizer.cc:233 ../qt/src/Recognizer.cc:232 msgid "Multilingual" msgstr "" #: ../gtk/src/Recognizer.cc:285 ../qt/src/Recognizer.cc:277 msgid "Automatic page segmentation" msgstr "" #: ../gtk/src/Recognizer.cc:286 ../qt/src/Recognizer.cc:278 msgid "Page segmentation with orientation and script detection" msgstr "" #: ../gtk/src/Recognizer.cc:287 ../qt/src/Recognizer.cc:279 msgid "Assume single column of text" msgstr "" #: ../gtk/src/Recognizer.cc:288 ../qt/src/Recognizer.cc:280 msgid "Assume single block of vertically aligned text" msgstr "" #: ../gtk/src/Recognizer.cc:289 ../qt/src/Recognizer.cc:281 msgid "Assume a single uniform block of text" msgstr "" #: ../gtk/src/Recognizer.cc:290 ../qt/src/Recognizer.cc:282 msgid "Assume a line of text" msgstr "" #: ../gtk/src/Recognizer.cc:291 ../qt/src/Recognizer.cc:283 msgid "Assume a single word" msgstr "" #: ../gtk/src/Recognizer.cc:292 ../qt/src/Recognizer.cc:284 msgid "Assume a single word in a circle" msgstr "" #: ../gtk/src/Recognizer.cc:293 ../qt/src/Recognizer.cc:285 msgid "Sparse text in no particular order" msgstr "" #: ../gtk/src/Recognizer.cc:294 ../qt/src/Recognizer.cc:286 msgid "Sparse text with orientation and script detection" msgstr "" #: ../gtk/src/Recognizer.cc:309 ../qt/src/Recognizer.cc:297 msgid "Page segmentation mode" msgstr "" #: ../gtk/src/Recognizer.cc:313 ../qt/src/Recognizer.cc:300 msgid "Character whitelist / blacklist..." msgstr "" #: ../gtk/src/Recognizer.cc:319 ../qt/src/Recognizer.cc:305 msgid "Manage languages..." msgstr "" #: ../gtk/src/Recognizer.cc:375 ../qt/src/Recognizer.cc:369 msgid "Current selection" msgstr "" #: ../gtk/src/Recognizer.cc:465 ../qt/src/Recognizer.cc:455 msgid "Recognizing page %1 (%2 of %3)" msgstr "" #: ../gtk/src/Recognizer.cc:470 ../qt/src/Recognizer.cc:461 msgid "" "\n" "- Page %1: failed to render page" msgstr "" #: ../gtk/src/Recognizer.cc:501 ../gtk/src/Recognizer.cc:531 #: ../gtk/src/Recognizer.cc:544 ../qt/src/Recognizer.cc:491 #: ../qt/src/Recognizer.cc:521 ../qt/src/Recognizer.cc:534 msgid "Recognizing..." msgstr "" #: ../gtk/src/Recognizer.cc:505 ../gtk/src/Recognizer.cc:514 #: ../qt/src/Recognizer.cc:495 ../qt/src/Recognizer.cc:504 msgid "Recognition errors occurred" msgstr "" #: ../gtk/src/Recognizer.cc:505 ../qt/src/Recognizer.cc:495 msgid "The following errors occurred:%1" msgstr "" #: ../gtk/src/Recognizer.cc:514 ../qt/src/Recognizer.cc:504 msgid "Failed to initialize tesseract" msgstr "" #: ../gtk/src/scanner/ScannerSane.cc:84 ../gtk/src/scanner/ScannerTwain.cc:288 #: ../qt/src/scanner/ScannerSane.cc:85 ../qt/src/scanner/ScannerTwain.cc:286 msgid "Scan canceled" msgstr "" #: ../gtk/src/scanner/ScannerSane.cc:159 ../gtk/src/scanner/ScannerTwain.cc:186 #: ../qt/src/scanner/ScannerSane.cc:159 ../qt/src/scanner/ScannerTwain.cc:178 msgid "No scanner specified" msgstr "" #: ../gtk/src/scanner/ScannerSane.cc:168 ../gtk/src/scanner/ScannerTwain.cc:195 #: ../qt/src/scanner/ScannerSane.cc:168 ../qt/src/scanner/ScannerTwain.cc:187 msgid "Unable to connect to scanner" msgstr "" #: ../gtk/src/scanner/ScannerSane.cc:403 ../gtk/src/scanner/ScannerTwain.cc:266 #: ../gtk/src/scanner/ScannerTwain.cc:292 ../qt/src/scanner/ScannerSane.cc:403 #: ../qt/src/scanner/ScannerTwain.cc:258 ../qt/src/scanner/ScannerTwain.cc:290 msgid "Unable to start scan" msgstr "" #: ../gtk/src/scanner/ScannerSane.cc:411 ../gtk/src/scanner/ScannerSane.cc:461 #: ../gtk/src/scanner/ScannerTwain.cc:318 ../qt/src/scanner/ScannerSane.cc:411 #: ../qt/src/scanner/ScannerSane.cc:461 ../qt/src/scanner/ScannerTwain.cc:316 msgid "Error communicating with scanner" msgstr "" #: ../gtk/src/scanner/ScannerSane.cc:520 ../qt/src/scanner/ScannerSane.cc:517 msgid "Failed to save image" msgstr "" #: ../gtk/src/scanner/ScannerSane.cc:800 ../qt/src/scanner/ScannerSane.cc:797 msgid "Operation is cancelled." msgstr "" #: ../gtk/src/scanner/ScannerSane.cc:802 ../qt/src/scanner/ScannerSane.cc:799 msgid "Device is busy." msgstr "" #: ../gtk/src/scanner/ScannerSane.cc:804 ../qt/src/scanner/ScannerSane.cc:801 msgid "Cover is opened." msgstr "" #: ../gtk/src/scanner/ScannerSane.cc:806 ../qt/src/scanner/ScannerSane.cc:803 msgid "Document feeder jammed." msgstr "" #: ../gtk/src/scanner/ScannerSane.cc:808 ../qt/src/scanner/ScannerSane.cc:805 msgid "Document feeder out of documents." msgstr "" #: ../gtk/src/scanner/ScannerSane.cc:810 ../qt/src/scanner/ScannerSane.cc:807 msgid "Access to scanner is denied." msgstr "" #: ../gtk/src/SourceManager.cc:118 ../qt/src/SourceManager.cc:124 msgid "PDFs with text" msgstr "" #: ../gtk/src/SourceManager.cc:118 ../qt/src/SourceManager.cc:124 msgid "" "These PDF files already contain text:\n" "%1" msgstr "" #: ../gtk/src/SourceManager.cc:127 ../qt/src/SourceManager.cc:132 msgid "Unable to open files" msgstr "" #: ../gtk/src/SourceManager.cc:127 ../qt/src/SourceManager.cc:132 msgid "The following files could not be opened:%1" msgstr "" #: ../gtk/src/SourceManager.cc:141 ../qt/src/SourceManager.cc:143 msgid "Enter password for file '%1':" msgstr "" #: ../gtk/src/SourceManager.cc:197 ../qt/src/SourceManager.cc:214 msgid "Images and PDFs" msgstr "" #: ../gtk/src/SourceManager.cc:202 ../qt/src/SourceManager.cc:215 msgid "Select Files" msgstr "" #: ../gtk/src/SourceManager.cc:208 ../qt/src/SourceManager.cc:226 msgid "Clipboard Error" msgstr "" #: ../gtk/src/SourceManager.cc:208 ../qt/src/SourceManager.cc:226 msgid "Failed to read the clipboard." msgstr "" #: ../gtk/src/SourceManager.cc:212 ../qt/src/SourceManager.cc:230 #: ../qt/src/SourceManager.cc:236 msgid "Pasted %1" msgstr "" #: ../gtk/src/SourceManager.cc:224 ../qt/src/SourceManager.cc:243 msgid "Screenshot Error" msgstr "" #: ../gtk/src/SourceManager.cc:224 ../qt/src/SourceManager.cc:243 msgid "Failed to take screenshot." msgstr "" #: ../gtk/src/SourceManager.cc:228 ../qt/src/SourceManager.cc:247 msgid "Screenshot %1" msgstr "" #: ../gtk/src/SourceManager.cc:233 ../qt/src/SourceManager.cc:252 msgid "Saving image..." msgstr "" #: ../gtk/src/SourceManager.cc:240 ../qt/src/SourceManager.cc:265 msgid "Cannot Write File" msgstr "" #: ../gtk/src/SourceManager.cc:240 ../qt/src/SourceManager.cc:265 msgid "Could not write to %1." msgstr "" #: ../gtk/src/SourceManager.cc:267 ../qt/src/SourceManager.cc:287 msgid "Delete File?" msgstr "" #: ../gtk/src/SourceManager.cc:267 ../qt/src/SourceManager.cc:287 msgid "The following files will be deleted:%1" msgstr "" #: ../gtk/src/SourceManager.cc:332 ../qt/src/SourceManager.cc:338 msgid "Missing File" msgstr "" #: ../gtk/src/SourceManager.cc:332 ../qt/src/SourceManager.cc:338 msgid "" "The following file has been deleted or moved:\n" "%1" msgstr "" #: ../gtk/src/SubstitutionsManager.cc:33 ../qt/src/SubstitutionsManager.cc:73 msgid "Search for" msgstr "" #: ../gtk/src/SubstitutionsManager.cc:34 ../qt/src/SubstitutionsManager.cc:73 msgid "Replace with" msgstr "" #: ../gtk/src/SubstitutionsManager.cc:69 ../gtk/src/SubstitutionsManager.cc:103 #: ../qt/src/SubstitutionsManager.cc:106 ../qt/src/SubstitutionsManager.cc:143 msgid "Substitutions List" msgstr "" #: ../gtk/src/SubstitutionsManager.cc:70 ../qt/src/SubstitutionsManager.cc:106 msgid "Open Substitutions List" msgstr "" #: ../gtk/src/SubstitutionsManager.cc:75 ../qt/src/SubstitutionsManager.cc:112 msgid "Error Reading File" msgstr "" #: ../gtk/src/SubstitutionsManager.cc:75 ../qt/src/SubstitutionsManager.cc:112 msgid "Unable to read '%1'." msgstr "" #: ../gtk/src/SubstitutionsManager.cc:97 ../qt/src/SubstitutionsManager.cc:137 msgid "Errors Occurred Reading File" msgstr "" #: ../gtk/src/SubstitutionsManager.cc:97 ../qt/src/SubstitutionsManager.cc:137 msgid "Some entries of the substitutions list could not be read." msgstr "" #: ../gtk/src/SubstitutionsManager.cc:104 ../qt/src/SubstitutionsManager.cc:143 msgid "Save Substitutions List" msgstr "" #: ../gtk/src/SubstitutionsManager.cc:110 ../qt/src/SubstitutionsManager.cc:149 msgid "Error Saving File" msgstr "" #: ../gtk/src/SubstitutionsManager.cc:110 ../qt/src/SubstitutionsManager.cc:149 msgid "Unable to write to '%1'." msgstr "" #: ../gtk/src/SubstitutionsManager.cc:127 ../qt/src/SubstitutionsManager.cc:162 msgid "Save List?" msgstr "" #: ../gtk/src/SubstitutionsManager.cc:127 ../qt/src/SubstitutionsManager.cc:162 msgid "Do you want to save the current list?" msgstr "" #: ../gtk/src/TessdataManager.cc:60 ../qt/src/TessdataManager.cc:74 msgid "" "A session connection to the PackageKit backend is required for managing " "system-wide tesseract language packs, but it was not found. This service is " "usually provided by a software-management application such as Gnome " "Software. Please install software which provides the necessary PackageKit " "interface, use other system package management software to manage the " "tesseract language packs directly, or switch to using the user tessdata path " "in the configuration dialog." msgstr "" #: ../gtk/src/TessdataManager.cc:65 ../qt/src/TessdataManager.cc:79 msgid "Fetching available languages" msgstr "" #: ../gtk/src/TessdataManager.cc:70 ../gtk/src/TessdataManager.cc:96 #: ../gtk/src/TessdataManager.cc:197 ../qt/src/TessdataManager.cc:84 #: ../qt/src/TessdataManager.cc:101 ../qt/src/TessdataManager.cc:197 msgid "Failed to fetch list of available languages: %1" msgstr "" #: ../gtk/src/TessdataManager.cc:104 ../qt/src/TessdataManager.cc:113 #: ../qt/src/TessdataManager.cc:122 msgid "Parsing error: %1" msgstr "" #: ../gtk/src/TessdataManager.cc:235 ../qt/src/TessdataManager.cc:232 msgid "Applying changes..." msgstr "" #: ../gtk/src/TessdataManager.cc:297 ../qt/src/TessdataManager.cc:278 msgid "Failed to create directory for tessdata files." msgstr "" #: ../gtk/src/TessdataManager.cc:306 ../qt/src/TessdataManager.cc:287 msgid "Downloading %1..." msgstr "" #: ../gtk/src/TessdataManager.cc:330 msgid "" "The following files could not be downloaded or removed:\n" "%1\n" "\n" "Check the connectivity and directory permissions.\n" "\n" "Hint: If you don't have write permissions in system folders, you can switch " "to user paths in the settings dialog." msgstr "" #: ../gtk/src/Utils.cc:64 msgid "Yes" msgstr "" #: ../gtk/src/Utils.cc:67 msgid "No" msgstr "" #: ../gtk/src/Utils.cc:76 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/CrashHandler.ui.h:3 msgid "" "

Tesseract has " "aborted

Tesseract (the OCR engine) has aborted while " "recognizing text. This may occur if the used traineddatas are corrupt or " "incomplatible with the version of tesseract in use, or due to a bug in " "tesseract.

The stacktrace below may provide additional information " "about where the crash occured.

" msgstr "" #: ../qt/data/MainWindow.ui.h:17 msgid "Flatbed" msgstr "" #: ../qt/data/MainWindow.ui.h:18 msgid "ADF Front" msgstr "" #: ../qt/data/MainWindow.ui.h:19 msgid "ADF Back" msgstr "" #: ../qt/data/MainWindow.ui.h:20 msgid "ADF Duplex" msgstr "" #. Remove & from some labels which designer insists in adding #: ../qt/data/MainWindow.ui.h:21 ../qt/src/Ui_MainWindow.hh:50 msgid "Sources" msgstr "" #: ../qt/data/MainWindow.ui.h:22 msgid "Zoom In" msgstr "" #: ../qt/data/MainWindow.ui.h:24 msgid "Zoom Out" msgstr "" #: ../qt/data/MainWindow.ui.h:26 msgid "Normal Size" msgstr "" #: ../qt/data/MainWindow.ui.h:28 msgid "Best Fit" msgstr "" #: ../qt/data/MainWindow.ui.h:30 msgid "Rotate Left" msgstr "" #: ../qt/data/MainWindow.ui.h:31 msgid "Rotate left" msgstr "" #: ../qt/data/MainWindow.ui.h:32 msgid "Rotate Right" msgstr "" #: ../qt/data/MainWindow.ui.h:33 msgid "Rotate right" msgstr "" #: ../qt/data/MainWindow.ui.h:34 msgid "Image Controls" msgstr "" #: ../qt/data/MainWindow.ui.h:36 msgid "Autodetect Layout" msgstr "" #: ../qt/data/MainWindow.ui.h:38 msgid "Toggle Output Pane" msgstr "" #: ../qt/data/PdfExportDialog.ui.h:5 msgid "Backend:" msgstr "" #: ../qt/data/PdfExportDialog.ui.h:8 msgid "Portrait" msgstr "" #: ../qt/data/PdfExportDialog.ui.h:9 msgid "Landscape" msgstr "" #: ../qt/src/hocr/HOCRPdfExporter.cc:142 msgid "Failed to write to file" msgstr "" #. Output toolbar #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:55 #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:56 msgid "Open hOCR file" msgstr "" #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:57 #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:58 msgid "Save as hOCR text" msgstr "" #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:79 #: ../qt/src/Ui_OutputEditorText.hh:106 msgid "Find and Replace" msgstr "" #: ../qt/src/MainWindow.cc:581 msgid "" "The following dictionary files were installed:\n" "%1" msgstr "" #: ../qt/src/TessdataManager.cc:308 msgid "" "The following files could not be downloaded or removed:\n" "%1\n" "\n" "Check the connectivity and directory permissions.\n" "Hint: If you don't have write permissions in system folders, you can switch " "to user paths in the settings dialog." msgstr "" #: ../qt/src/Ui_MainWindow.hh:51 msgid "Output" msgstr "" #: ../qt/src/Ui_MainWindow.hh:135 msgid "OCR mode:" msgstr "" #: ../qt/src/Ui_MainWindow.hh:209 msgid "Remove Image" msgstr "" #: ../qt/src/Ui_MainWindow.hh:212 msgid "Delete Image" msgstr "" #: ../qt/src/Ui_MainWindow.hh:215 msgid "Clear List" msgstr "" #: ../qt/src/Ui_OutputEditorText.hh:101 msgid "Strip Line Breaks" msgstr "" #: ../qt/src/Ui_OutputEditorText.hh:115 msgid "Save Output" msgstr "" #: ../qt/src/Ui_OutputEditorText.hh:117 msgid "Clear Output" msgstr "" gImageReader-3.3.1/po/sv.po000066400000000000000000002006451351740627400154600ustar00rootroot00000000000000# 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: 2019-07-25 23:17+0200\n" "PO-Revision-Date: 2018-08-20 18:43+0000\n" "Last-Translator: Allan Nordhøy \n" "Language-Team: Swedish \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: Weblate 3.2-dev\n" #: ../data/gimagereader.desktop.in.h:1 msgid "OCR application" msgstr "" #: ../gtk/data/appmenu.ui.h:1 ../qt/src/Ui_MainWindow.hh:167 msgid "Redetect Languages" msgstr "Känn igen språk på nytt" #: ../gtk/data/appmenu.ui.h:2 ../qt/src/Ui_MainWindow.hh:170 #, fuzzy msgid "Manage Languages" msgstr "Hantera språk..." #: ../gtk/data/appmenu.ui.h:3 ../gtk/data/ConfigDialog.ui.h:1 #: ../qt/data/ConfigDialog.ui.h:1 ../qt/src/Ui_MainWindow.hh:173 msgid "Preferences" msgstr "Inställningar" #: ../gtk/data/appmenu.ui.h:4 ../gtk/data/ConfigDialog.ui.h:2 #: ../gtk/src/MainWindow.cc:482 ../qt/src/MainWindow.cc:481 #: ../qt/src/Ui_MainWindow.hh:178 msgid "Help" msgstr "Hjälp" #: ../gtk/data/appmenu.ui.h:5 ../qt/data/AboutDialog.ui.h:2 #: ../qt/src/Ui_MainWindow.hh:181 msgid "About" msgstr "Om" #: ../gtk/data/appmenu.ui.h:6 msgid "Quit" msgstr "Avsluta" #: ../gtk/data/ConfigDialog.ui.h:3 ../gtk/data/MainWindow.ui.h:47 #: ../gtk/data/OutputEditorHOCR.ui.h:3 ../gtk/data/PdfExportDialog.ui.h:3 #: ../gtk/src/FileDialogs.cc:152 ../gtk/src/Utils.cc:61 #: ../qt/data/ConfigDialog.ui.h:26 msgid "OK" msgstr "OK" #: ../gtk/data/ConfigDialog.ui.h:4 msgid "Output pane orientation:" msgstr "Orientering för utgångstexten:" #: ../gtk/data/ConfigDialog.ui.h:5 msgid "Horizontal" msgstr "Horisontellt" #: ../gtk/data/ConfigDialog.ui.h:6 msgid "Vertical" msgstr "Vertikalt" #: ../gtk/data/ConfigDialog.ui.h:7 ../qt/data/ConfigDialog.ui.h:18 msgid "Query to install missing spellcheck dictionaries" msgstr "Föreslå installation av saknade ordlistor - ordböcker" #: ../gtk/data/ConfigDialog.ui.h:8 ../qt/data/ConfigDialog.ui.h:4 msgid "Automatically check for new program versions" msgstr "Sök automatiskt efter nya programvesioner" #: ../gtk/data/ConfigDialog.ui.h:9 ../qt/data/ConfigDialog.ui.h:3 msgid "Predefined language definitions:" msgstr "Fördefinierade språkdefinitioner:" #: ../gtk/data/ConfigDialog.ui.h:10 ../qt/data/ConfigDialog.ui.h:12 msgid "Additional language definitions:" msgstr "Övriga språkdefinitioner:" #: ../gtk/data/ConfigDialog.ui.h:11 ../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/ConfigDialog.ui.h:12 ../qt/data/ConfigDialog.ui.h:21 msgid "Prefix" msgstr "Prefix" #: ../gtk/data/ConfigDialog.ui.h:13 ../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/ConfigDialog.ui.h:14 ../qt/data/ConfigDialog.ui.h:23 msgid "ISO Code" msgstr "ISO Kod" #: ../gtk/data/ConfigDialog.ui.h:15 ../qt/data/ConfigDialog.ui.h:24 msgid "The name of the language" msgstr "Språkets namn" #: ../gtk/data/ConfigDialog.ui.h:16 ../qt/data/ConfigDialog.ui.h:25 msgid "Name" msgstr "Namn" #: ../gtk/data/ConfigDialog.ui.h:17 ../gtk/data/MainWindow.ui.h:46 #: ../gtk/data/OutputEditorHOCR.ui.h:2 ../gtk/data/PdfExportDialog.ui.h:2 #: ../gtk/src/Acquirer.cc:34 ../gtk/src/FileDialogs.cc:151 #: ../gtk/src/Utils.cc:70 ../qt/data/ConfigDialog.ui.h:27 #: ../qt/data/MainWindow.ui.h:12 msgid "Cancel" msgstr "Avbryt" #: ../gtk/data/ConfigDialog.ui.h:18 ../qt/data/ConfigDialog.ui.h:5 msgid "Output pane font:" msgstr "Font för utdata-fönstret:" #: ../gtk/data/ConfigDialog.ui.h:19 ../qt/data/ConfigDialog.ui.h:2 msgid "Default" msgstr "Standard" #: ../gtk/data/ConfigDialog.ui.h:20 ../qt/data/ConfigDialog.ui.h:6 msgid "Language data locations:" msgstr "Språkdata-lokalisering:" #: ../gtk/data/ConfigDialog.ui.h:21 ../qt/data/ConfigDialog.ui.h:13 msgid "Language definitions path:" msgstr "Lagringsplats för språkdefinitioner:" #: ../gtk/data/ConfigDialog.ui.h:22 ../qt/data/ConfigDialog.ui.h:28 msgid "Spelling dictionaries path:" msgstr "Sökväg till rättstavningslexikon:" #: ../gtk/data/ConfigDialog.ui.h:23 ../qt/data/ConfigDialog.ui.h:10 msgid "System-wide paths" msgstr "Systemomfattande sökväg" #: ../gtk/data/ConfigDialog.ui.h:24 ../qt/data/ConfigDialog.ui.h:11 msgid "User paths" msgstr "Användarsökväg" #: ../gtk/data/ConfigDialog.ui.h:25 ../qt/data/ConfigDialog.ui.h:29 msgid "Automatically open exported documents with default application" msgstr "" #: ../gtk/data/CrashHandler.ui.h:1 ../qt/src/CrashHandler.cc:38 msgid "Regenerate backtrace" msgstr "Återskapa bakåtspårning" #: ../gtk/data/CrashHandler.ui.h:3 #, fuzzy, no-c-format msgid "" "The application has crashed\n" "\n" "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/CrashHandler.ui.h:6 msgid "" "Tesseract has aborted\n" "\n" "Tesseract (the OCR engine) has aborted while recognizing text. This may " "occur if the used traineddatas are corrupt or incomplatible with the version " "of tesseract in use, or due to a bug in tesseract.\n" "\n" "The stacktrace below may provide additional information about where the " "crash occured.\n" msgstr "" #: ../gtk/data/MainWindow.ui.h:1 ../qt/data/MainWindow.ui.h:39 msgid "Toggle output pane" msgstr "Visa/stäng utgångsfönstret" #: ../gtk/data/MainWindow.ui.h:2 ../qt/src/Ui_MainWindow.hh:66 msgid "Rotate current page" msgstr "Rotera aktuell text" #: ../gtk/data/MainWindow.ui.h:3 ../qt/src/Ui_MainWindow.hh:67 msgid "Rotate all pages" msgstr "Rotera alla sidor" #. Sources toolbar #: ../gtk/data/MainWindow.ui.h:4 ../qt/src/Ui_MainWindow.hh:192 msgid "Recent" msgstr "Nyligen öppnad" #: ../gtk/data/MainWindow.ui.h:5 ../qt/src/Ui_MainWindow.hh:193 msgid "Paste" msgstr "Klistra in" #: ../gtk/data/MainWindow.ui.h:6 ../qt/src/Ui_MainWindow.hh:194 msgid "Take Screenshot" msgstr "Ta en skärmdump" #: ../gtk/data/MainWindow.ui.h:7 ../qt/data/MainWindow.ui.h:23 msgid "Zoom in" msgstr "Zooma in" #: ../gtk/data/MainWindow.ui.h:8 ../qt/data/MainWindow.ui.h:25 msgid "Zoom out" msgstr "Zooma ut" #: ../gtk/data/MainWindow.ui.h:9 ../qt/data/MainWindow.ui.h:27 msgid "Normal size" msgstr "Normal storlek" #: ../gtk/data/MainWindow.ui.h:10 ../qt/data/MainWindow.ui.h:29 msgid "Best fit" msgstr "Bästa passning" #: ../gtk/data/MainWindow.ui.h:11 ../qt/src/Ui_MainWindow.hh:75 msgid "Select rotation mode" msgstr "Välj sätt att rotera" #: ../gtk/data/MainWindow.ui.h:12 ../gtk/data/OutputEditorText.ui.h:13 #: ../qt/src/Ui_OutputEditorText.hh:95 msgid "Select insert mode" msgstr "Välj sätt att infoga" #: ../gtk/data/MainWindow.ui.h:13 ../qt/src/Ui_MainWindow.hh:109 #, fuzzy msgid "Select page" msgstr "Välj språk" #: ../gtk/data/MainWindow.ui.h:14 ../qt/data/MainWindow.ui.h:35 msgid "Image controls" msgstr "Bildanpassning" #: ../gtk/data/MainWindow.ui.h:15 ../qt/src/Ui_MainWindow.hh:139 msgid "Plain text" msgstr "Oformaterad text" #: ../gtk/data/MainWindow.ui.h:16 ../qt/src/Ui_MainWindow.hh:139 msgid "hOCR, PDF" msgstr "hOCR, PDF" #: ../gtk/data/MainWindow.ui.h:17 ../qt/data/MainWindow.ui.h:37 msgid "Autodetect layout" msgstr "Känn igen layout automatiskt" #: ../gtk/data/MainWindow.ui.h:18 msgid "Recognize all" msgstr "Känn igen alla" #: ../gtk/data/MainWindow.ui.h:19 msgid "Select language" msgstr "Välj språk" #: ../gtk/data/MainWindow.ui.h:20 ../qt/src/Ui_MainWindow.hh:205 msgid "Add images" msgstr "Lägg till bilder" #: ../gtk/data/MainWindow.ui.h:21 ../qt/src/Ui_MainWindow.hh:204 msgid "Add Images" msgstr "Infoga bilder" #: ../gtk/data/MainWindow.ui.h:22 ../qt/src/Ui_MainWindow.hh:210 msgid "Remove image from list" msgstr "Ta bort bild från lista" #: ../gtk/data/MainWindow.ui.h:23 ../qt/src/Ui_MainWindow.hh:213 msgid "Delete image" msgstr "Radera bild" #: ../gtk/data/MainWindow.ui.h:24 ../qt/src/Ui_MainWindow.hh:216 msgid "Clear list" msgstr "Töm lista" #: ../gtk/data/MainWindow.ui.h:25 ../qt/data/MainWindow.ui.h:5 msgid "Files" msgstr "Filer" #: ../gtk/data/MainWindow.ui.h:26 ../qt/data/MainWindow.ui.h:8 msgid "Device:" msgstr "Enhet:" #: ../gtk/data/MainWindow.ui.h:27 ../gtk/data/TessdataManager.ui.h:4 #: ../qt/data/MainWindow.ui.h:7 ../qt/src/TessdataManager.cc:59 msgid "Refresh" msgstr "Uppdatera" #: ../gtk/data/MainWindow.ui.h:28 ../qt/data/MainWindow.ui.h:9 msgid "Output:" msgstr "Spara bild:" #: ../gtk/data/MainWindow.ui.h:29 ../qt/data/MainWindow.ui.h:13 msgid "Mode:" msgstr "Modus:" #: ../gtk/data/MainWindow.ui.h:30 ../gtk/src/hocr/HOCRPdfExporter.cc:313 #: ../qt/data/MainWindow.ui.h:15 ../qt/src/hocr/HOCRPdfExporter.cc:347 msgid "Color" msgstr "Färg" #: ../gtk/data/MainWindow.ui.h:31 ../gtk/src/hocr/HOCRPdfExporter.cc:316 #: ../qt/data/MainWindow.ui.h:14 ../qt/src/hocr/HOCRPdfExporter.cc:349 #: ../qt/src/hocr/HOCRPdfExporter.cc:351 msgid "Grayscale" msgstr "Gråskala" #: ../gtk/data/MainWindow.ui.h:32 ../qt/data/MainWindow.ui.h:10 msgid "Resolution:" msgstr "Upplösning:" #: ../gtk/data/MainWindow.ui.h:33 ../qt/data/MainWindow.ui.h:11 msgid "Scan" msgstr "Skanna" #: ../gtk/data/MainWindow.ui.h:34 ../qt/data/MainWindow.ui.h:16 #, fuzzy msgid "Source:" msgstr "Källa" #: ../gtk/data/MainWindow.ui.h:35 ../qt/data/MainWindow.ui.h:6 msgid "Acquire" msgstr "Innefatta" #: ../gtk/data/MainWindow.ui.h:36 ../qt/data/MainWindow.ui.h:1 msgid "Brightness" msgstr "Ljusstyrka" #: ../gtk/data/MainWindow.ui.h:37 ../qt/data/MainWindow.ui.h:2 msgid "Contrast" msgstr "Kontrast" #: ../gtk/data/MainWindow.ui.h:38 ../qt/data/MainWindow.ui.h:3 msgid "Resolution" msgstr "Upplösning" #: ../gtk/data/MainWindow.ui.h:39 ../qt/data/MainWindow.ui.h:4 msgid "Invert colors" msgstr "Invertera färger" #: ../gtk/data/MainWindow.ui.h:40 msgid "A graphical frontend to tesseract-ocr" msgstr "Ett grafiskt gränssnitt för tesseract-ocr" #: ../gtk/data/MainWindow.ui.h:41 ../qt/data/CharacterListDialog.ui.h:1 msgid "Character whitelist / blacklist" msgstr "" #: ../gtk/data/MainWindow.ui.h:42 ../qt/data/CharacterListDialog.ui.h:2 msgid "Exclude these characters from being recognized (blacklist):" msgstr "" #: ../gtk/data/MainWindow.ui.h:43 ../qt/data/CharacterListDialog.ui.h:3 #, fuzzy msgid "Enter a string of characters..." msgstr "Hämtar parametrar..." #: ../gtk/data/MainWindow.ui.h:44 ../qt/data/CharacterListDialog.ui.h:4 msgid "Only allow the following characters to be recognized (whitelist):" msgstr "" #: ../gtk/data/MainWindow.ui.h:45 ../qt/data/PageRangeDialog.ui.h:1 msgid "Page Range" msgstr "Sidintervall" #: ../gtk/data/MainWindow.ui.h:48 ../qt/data/PageRangeDialog.ui.h:2 msgid "Page range:" msgstr "Sidintervall:" #: ../gtk/data/MainWindow.ui.h:49 ../qt/data/PageRangeDialog.ui.h:3 msgid "Example: 1-10, 13, 14-18" msgstr "Exempel: 1-10, 13, 14-18" #: ../gtk/data/MainWindow.ui.h:50 ../qt/data/PageRangeDialog.ui.h:4 msgid "Recognition area:" msgstr "Avkänningsområde" #: ../gtk/data/MainWindow.ui.h:51 ../gtk/src/Recognizer.cc:375 #: ../qt/data/PageRangeDialog.ui.h:5 ../qt/src/Recognizer.cc:369 msgid "Entire page" msgstr "Hela sidan" #: ../gtk/data/MainWindow.ui.h:52 ../qt/data/PageRangeDialog.ui.h:6 msgid "Autodetect" msgstr "Automatisk igenkänning" #: ../gtk/data/MainWindow.ui.h:53 ../qt/data/PageRangeDialog.ui.h:7 #, fuzzy msgid "Prepend to output text:" msgstr "Lägg till efter aktuell text" #: ../gtk/data/MainWindow.ui.h:54 ../qt/data/PageRangeDialog.ui.h:8 msgid "Source filename" msgstr "" #: ../gtk/data/MainWindow.ui.h:55 ../qt/data/PageRangeDialog.ui.h:9 #, fuzzy msgid "Source page" msgstr "Källa" #: ../gtk/data/MainWindow.ui.h:56 ../qt/src/SourceManager.cc:146 msgid "Protected PDF" msgstr "" #: ../gtk/data/MainWindow.ui.h:57 ../qt/src/Recognizer.cc:76 msgid "Current Page" msgstr "Aktuell Sida" #: ../gtk/data/MainWindow.ui.h:58 ../qt/src/Recognizer.cc:79 msgid "Multiple Pages..." msgstr "Flera sidor ..." #: ../gtk/data/OutputEditorHOCR.ui.h:1 ../qt/src/hocr/OutputEditorHOCR.cc:580 msgid "Add Word" msgstr "" #: ../gtk/data/OutputEditorHOCR.ui.h:4 ../qt/src/hocr/OutputEditorHOCR.cc:580 #, fuzzy msgid "Enter word:" msgstr "Ignorera ord" #: ../gtk/data/OutputEditorHOCR.ui.h:5 ../qt/src/hocr/Ui_OutputEditorHOCR.hh:61 #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:62 #, fuzzy msgid "Export to plain text" msgstr "Exportera till PDF" #: ../gtk/data/OutputEditorHOCR.ui.h:6 ../qt/src/hocr/Ui_OutputEditorHOCR.hh:64 #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:65 msgid "Export to PDF" msgstr "Exportera till PDF" #: ../gtk/data/OutputEditorHOCR.ui.h:7 ../qt/src/hocr/Ui_OutputEditorHOCR.hh:67 #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:68 #, fuzzy msgid "Export to ODT" msgstr "Exportera till PDF" #: ../gtk/data/OutputEditorHOCR.ui.h:8 ../gtk/data/OutputEditorText.ui.h:18 #: ../qt/src/Ui_OutputEditorText.hh:116 msgid "Save output" msgstr "Spara utdata" #: ../gtk/data/OutputEditorHOCR.ui.h:9 ../qt/src/hocr/Ui_OutputEditorHOCR.hh:72 #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:73 #, fuzzy msgid "Export" msgstr "PDF-export" #: ../gtk/data/OutputEditorHOCR.ui.h:10 ../gtk/data/OutputEditorText.ui.h:19 #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:77 #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:78 #: ../qt/src/Ui_OutputEditorText.hh:118 msgid "Clear output" msgstr "Rensa utdata" #: ../gtk/data/OutputEditorHOCR.ui.h:11 ../gtk/data/OutputEditorText.ui.h:15 #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:80 #: ../qt/src/Ui_OutputEditorText.hh:107 msgid "Find and replace" msgstr "Sök och ersätt" #: ../gtk/data/OutputEditorHOCR.ui.h:12 #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:82 #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:83 msgid "Show confidence values" msgstr "" #: ../gtk/data/OutputEditorHOCR.ui.h:13 ../gtk/data/PdfExportDialog.ui.h:41 #: ../qt/data/PdfExportDialog.ui.h:2 ../qt/src/hocr/Ui_OutputEditorHOCR.hh:85 #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:86 msgid "Show preview" msgstr "Förhandsvisa" #: ../gtk/data/OutputEditorHOCR.ui.h:14 #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:121 msgid "Next (F3)" msgstr "" #: ../gtk/data/OutputEditorHOCR.ui.h:15 #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:122 msgid "Previous (Shift+F3)" msgstr "" #: ../gtk/data/OutputEditorHOCR.ui.h:16 ../gtk/src/hocr/OutputEditorHOCR.cc:890 #: ../qt/src/hocr/OutputEditorHOCR.cc:730 #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:126 msgid "Expand all" msgstr "Expandera" #: ../gtk/data/OutputEditorHOCR.ui.h:17 ../gtk/src/hocr/OutputEditorHOCR.cc:893 #: ../qt/src/hocr/OutputEditorHOCR.cc:731 #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:127 msgid "Collapse all" msgstr "Dra ihop" #: ../gtk/data/OutputEditorHOCR.ui.h:18 #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:148 msgid "Properties" msgstr "Egenskaper" #: ../gtk/data/OutputEditorHOCR.ui.h:19 #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:152 msgid "Source" msgstr "Källa" #. Output insert mode #: ../gtk/data/OutputEditorText.ui.h:1 ../qt/src/Ui_OutputEditorText.hh:52 msgid "Append to current text" msgstr "Lägg till efter aktuell text" #: ../gtk/data/OutputEditorText.ui.h:2 ../qt/src/Ui_OutputEditorText.hh:53 msgid "Insert at cursor" msgstr "Infoga vid markören" #: ../gtk/data/OutputEditorText.ui.h:3 ../qt/src/Ui_OutputEditorText.hh:54 msgid "Replace current text" msgstr "Ersätt aktuell text" #. Output postprocessing #: ../gtk/data/OutputEditorText.ui.h:4 ../qt/src/Ui_OutputEditorText.hh:62 msgid "Keep line break if..." msgstr "Behåll radbrytning om..." #: ../gtk/data/OutputEditorText.ui.h:5 ../qt/src/Ui_OutputEditorText.hh:64 msgid "Preceded by end mark (.?!)" msgstr "Föregås av slut-tecken (.?!)" #: ../gtk/data/OutputEditorText.ui.h:6 ../qt/src/Ui_OutputEditorText.hh:66 msgid "Preceded or succeeded by quote" msgstr "Föregången eller efterträdd av citattecken" #: ../gtk/data/OutputEditorText.ui.h:7 ../qt/src/Ui_OutputEditorText.hh:68 msgid "Other options" msgstr "Andra alternativ" #: ../gtk/data/OutputEditorText.ui.h:8 ../qt/src/Ui_OutputEditorText.hh:70 msgid "Join hyphenated words" msgstr "Sammanfoga avstavade ord" #: ../gtk/data/OutputEditorText.ui.h:9 ../qt/src/Ui_OutputEditorText.hh:72 msgid "Collapse whitespace" msgstr "Ta bort blanktecken" #: ../gtk/data/OutputEditorText.ui.h:10 ../qt/src/Ui_OutputEditorText.hh:74 msgid "Preserve paragraphs" msgstr "Bevara stycken" #: ../gtk/data/OutputEditorText.ui.h:11 ../qt/src/Ui_OutputEditorText.hh:76 msgid "Visual aids" msgstr "Visuella hjälpmedel" #: ../gtk/data/OutputEditorText.ui.h:12 ../qt/src/Ui_OutputEditorText.hh:78 msgid "Draw whitespace" msgstr "Rita blanktecken" #: ../gtk/data/OutputEditorText.ui.h:14 ../qt/src/Ui_OutputEditorText.hh:102 msgid "Strip line breaks on selected text" msgstr "Rensa radbrytningar i markerad text" #: ../gtk/data/OutputEditorText.ui.h:16 ../qt/src/Ui_OutputEditorText.hh:109 #: ../qt/src/Ui_OutputEditorText.hh:110 msgid "Undo" msgstr "Ångra" #: ../gtk/data/OutputEditorText.ui.h:17 ../qt/src/Ui_OutputEditorText.hh:112 #: ../qt/src/Ui_OutputEditorText.hh:113 msgid "Redo" msgstr "Gör om" #: ../gtk/data/PdfExportDialog.ui.h:1 ../qt/data/PdfExportDialog.ui.h:1 msgid "PDF Export" msgstr "PDF-export" #: ../gtk/data/PdfExportDialog.ui.h:4 ../qt/data/PdfExportDialog.ui.h:4 msgid "Output mode:" msgstr "Utdata-sätt:" #: ../gtk/data/PdfExportDialog.ui.h:5 ../qt/data/PdfExportDialog.ui.h:6 msgid "PDF" msgstr "PDF-export" #: ../gtk/data/PdfExportDialog.ui.h:6 ../qt/data/PdfExportDialog.ui.h:7 msgid "PDF with invisible text overlay" msgstr "PDF med osynlig text gömd" #: ../gtk/data/PdfExportDialog.ui.h:7 ../qt/data/PdfExportDialog.ui.h:16 msgid "Format:" msgstr "Databasformat:" #: ../gtk/data/PdfExportDialog.ui.h:8 ../qt/data/PdfExportDialog.ui.h:17 msgid "Compression:" msgstr "Kompression:" #: ../gtk/data/PdfExportDialog.ui.h:9 ../qt/data/PdfExportDialog.ui.h:14 msgid "Compression quality:" msgstr "Kompressionskvalitet:" #: ../gtk/data/PdfExportDialog.ui.h:10 ../qt/data/PdfExportDialog.ui.h:15 msgid "DPI:" msgstr "DPI:" #: ../gtk/data/PdfExportDialog.ui.h:11 ../qt/data/PdfExportDialog.ui.h:18 msgid "Dithering algorithm:" msgstr "Dither-algoritm:" #: ../gtk/data/PdfExportDialog.ui.h:12 ../qt/data/PdfExportDialog.ui.h:13 msgid "Image settings:" msgstr "Bildinställning:" #: ../gtk/data/PdfExportDialog.ui.h:13 ../qt/data/PdfExportDialog.ui.h:25 msgid "Uniformize line and word spacing" msgstr "Gör rad och ordavstånden enhetliga" #: ../gtk/data/PdfExportDialog.ui.h:14 ../qt/data/PdfExportDialog.ui.h:21 msgid "Override font family:" msgstr "" #: ../gtk/data/PdfExportDialog.ui.h:15 ../qt/data/PdfExportDialog.ui.h:27 msgid "Fallback font family:" msgstr "" #: ../gtk/data/PdfExportDialog.ui.h:16 ../qt/data/PdfExportDialog.ui.h:20 #, fuzzy msgid "Override font size:" msgstr "Använd detekterad teckenstorlek" #: ../gtk/data/PdfExportDialog.ui.h:17 ../qt/data/PdfExportDialog.ui.h:23 msgid "Font scaling:" msgstr "" #: ../gtk/data/PdfExportDialog.ui.h:18 ../qt/data/PdfExportDialog.ui.h:26 msgid "pt" msgstr "" #: ../gtk/data/PdfExportDialog.ui.h:19 ../qt/data/PdfExportDialog.ui.h:22 msgid "Preserve spaces wider than:" msgstr "Behåll tomrum större än:" #: ../gtk/data/PdfExportDialog.ui.h:20 ../qt/data/PdfExportDialog.ui.h:24 msgid "characters" msgstr "tecken" #: ../gtk/data/PdfExportDialog.ui.h:21 ../qt/data/PdfExportDialog.ui.h:28 msgid "Sanitize hyphens before line breaks" msgstr "" #: ../gtk/data/PdfExportDialog.ui.h:22 ../qt/data/PdfExportDialog.ui.h:19 msgid "Text settings:" msgstr "Textinställning:" #: ../gtk/data/PdfExportDialog.ui.h:23 ../qt/data/PdfExportDialog.ui.h:10 msgid "Paper size:" msgstr "" #: ../gtk/data/PdfExportDialog.ui.h:24 ../qt/data/PdfExportDialog.ui.h:11 msgid "Width" msgstr "" #: ../gtk/data/PdfExportDialog.ui.h:25 ../qt/data/PdfExportDialog.ui.h:12 msgid "Height" msgstr "" #: ../gtk/data/PdfExportDialog.ui.h:26 ../qt/data/PdfExportDialog.ui.h:29 msgid "Treat image sources as having true DPI:" msgstr "" #: ../gtk/data/PdfExportDialog.ui.h:27 ../qt/data/PdfExportDialog.ui.h:3 msgid "Basic" msgstr "" #: ../gtk/data/PdfExportDialog.ui.h:28 ../qt/data/PdfExportDialog.ui.h:31 #, fuzzy msgid "PDF version:" msgstr "Ny version" #: ../gtk/data/PdfExportDialog.ui.h:29 ../qt/data/PdfExportDialog.ui.h:33 msgid "Password:" msgstr "" #: ../gtk/data/PdfExportDialog.ui.h:30 ../qt/data/PdfExportDialog.ui.h:34 msgid "Confirm password:" msgstr "" #: ../gtk/data/PdfExportDialog.ui.h:31 ../qt/data/PdfExportDialog.ui.h:32 msgid "Encryption (optional):" msgstr "" #: ../gtk/data/PdfExportDialog.ui.h:32 ../qt/data/PdfExportDialog.ui.h:36 msgid "Author:" msgstr "" #: ../gtk/data/PdfExportDialog.ui.h:33 ../qt/data/PdfExportDialog.ui.h:38 msgid "Title:" msgstr "" #: ../gtk/data/PdfExportDialog.ui.h:34 ../qt/data/PdfExportDialog.ui.h:40 msgid "Subject:" msgstr "" #: ../gtk/data/PdfExportDialog.ui.h:35 ../qt/data/PdfExportDialog.ui.h:37 msgid "Creator:" msgstr "" #: ../gtk/data/PdfExportDialog.ui.h:36 ../qt/data/PdfExportDialog.ui.h:39 msgid "Producer:" msgstr "" #: ../gtk/data/PdfExportDialog.ui.h:37 ../qt/data/PdfExportDialog.ui.h:41 msgid "Keywords:" msgstr "" #: ../gtk/data/PdfExportDialog.ui.h:38 ../qt/data/PdfExportDialog.ui.h:35 #, fuzzy msgid "Additional information (optional):" msgstr "Övriga språkdefinitioner:" #: ../gtk/data/PdfExportDialog.ui.h:39 ../qt/data/PdfExportDialog.ui.h:42 msgid "Import from current source" msgstr "" #: ../gtk/data/PdfExportDialog.ui.h:40 ../qt/data/PdfExportDialog.ui.h:30 msgid "Advanced" msgstr "" #: ../gtk/data/SearchReplaceFrame.ui.h:1 ../qt/data/SearchReplaceFrame.ui.h:4 msgid "Find" msgstr "Sök" #: ../gtk/data/SearchReplaceFrame.ui.h:2 ../qt/data/SearchReplaceFrame.ui.h:2 msgid "Replace" msgstr "Ersätt" #: ../gtk/data/SearchReplaceFrame.ui.h:3 ../qt/data/SearchReplaceFrame.ui.h:3 msgid "Replace all" msgstr "Ersätt allt" #: ../gtk/data/SearchReplaceFrame.ui.h:4 ../qt/data/SearchReplaceFrame.ui.h:5 msgid "Find previous" msgstr "Sök föregående" #: ../gtk/data/SearchReplaceFrame.ui.h:5 ../qt/data/SearchReplaceFrame.ui.h:6 msgid "Find next" msgstr "Sök nästa" #: ../gtk/data/SearchReplaceFrame.ui.h:6 ../qt/data/SearchReplaceFrame.ui.h:7 msgid "Match case" msgstr "Matcha skiftläge" #: ../gtk/data/SearchReplaceFrame.ui.h:7 #: ../gtk/data/SubstitutionsManager.ui.h:1 ../qt/data/SearchReplaceFrame.ui.h:1 #: ../qt/src/SubstitutionsManager.cc:36 msgid "Substitutions" msgstr "Ersättningar" #: ../gtk/data/SelectionMenu.ui.h:1 ../qt/src/DisplayerToolSelect.cc:239 msgid "Delete" msgstr "Radera" #: ../gtk/data/SelectionMenu.ui.h:2 ../qt/src/DisplayerToolSelect.cc:225 msgid "Order:" msgstr "Ordningsföljd:" #: ../gtk/data/SelectionMenu.ui.h:3 ../gtk/src/hocr/DisplayerToolHOCR.cc:29 #: ../qt/src/DisplayerToolSelect.cc:240 ../qt/src/hocr/DisplayerToolHOCR.cc:31 msgid "Recognize" msgstr "Tolka text" #: ../gtk/data/SelectionMenu.ui.h:4 ../qt/src/DisplayerToolSelect.cc:241 msgid "Recognize to clipboard" msgstr "Tolka text till klippbordet" #: ../gtk/data/SelectionMenu.ui.h:5 ../qt/src/DisplayerToolSelect.cc:242 msgid "Save as image" msgstr "Spara som bild" #: ../gtk/data/SubstitutionsManager.ui.h:2 ../qt/src/SubstitutionsManager.cc:38 #: ../qt/src/SubstitutionsManager.cc:39 msgid "Open" msgstr "Öppna" #: ../gtk/data/SubstitutionsManager.ui.h:3 ../gtk/src/Utils.cc:73 #: ../qt/src/SubstitutionsManager.cc:41 ../qt/src/SubstitutionsManager.cc:42 msgid "Save" msgstr "Spara" #: ../gtk/data/SubstitutionsManager.ui.h:4 ../qt/src/SubstitutionsManager.cc:44 #: ../qt/src/SubstitutionsManager.cc:45 msgid "Clear" msgstr "Töm" #: ../gtk/data/SubstitutionsManager.ui.h:5 ../qt/data/ConfigDialog.ui.h:16 #: ../qt/src/SubstitutionsManager.cc:47 ../qt/src/SubstitutionsManager.cc:48 msgid "Add" msgstr "Lägg till" #: ../gtk/data/SubstitutionsManager.ui.h:6 #: ../gtk/src/hocr/OutputEditorHOCR.cc:886 ../qt/data/ConfigDialog.ui.h:17 #: ../qt/src/hocr/OutputEditorHOCR.cc:727 ../qt/src/SubstitutionsManager.cc:50 #: ../qt/src/SubstitutionsManager.cc:51 msgid "Remove" msgstr "Ta bort" #: ../gtk/data/SubstitutionsManager.ui.h:7 ../gtk/data/TessdataManager.ui.h:2 msgid "Apply" msgstr "Använd" #: ../gtk/data/SubstitutionsManager.ui.h:8 ../gtk/data/TessdataManager.ui.h:3 msgid "Close" msgstr "Stäng" #: ../gtk/data/TessdataManager.ui.h:1 ../qt/src/TessdataManager.cc:49 msgid "Tessdata Manager" msgstr "Tessdata-hanterare" #: ../gtk/data/TessdataManager.ui.h:5 ../qt/src/TessdataManager.cc:51 msgid "Manage installed languages:" msgstr "Hantera installerade språk:" #: ../gtk/src/Acquirer.cc:79 ../qt/src/Acquirer.cc:70 msgid "scan.png" msgstr "skanna.png" #: ../gtk/src/Acquirer.cc:91 ../qt/src/Acquirer.cc:85 msgid "Images" msgstr "Bilder" #: ../gtk/src/Acquirer.cc:92 ../qt/src/Acquirer.cc:86 msgid "Choose Output Filename..." msgstr "Välj filnamn för utdatafilen..." #: ../gtk/src/Acquirer.cc:106 ../qt/src/Acquirer.cc:100 msgid "Failed to initialize the scanning backend." msgstr "Det gick inte att initiera skannern." #: ../gtk/src/Acquirer.cc:115 ../qt/src/Acquirer.cc:106 msgid "Scan failed" msgstr "Skanningen misslyckades" #: ../gtk/src/Acquirer.cc:133 ../qt/src/Acquirer.cc:122 msgid "No scanners were detected." msgstr "Ingen skanner hittades." #: ../gtk/src/Acquirer.cc:150 ../gtk/src/Acquirer.cc:168 #: ../qt/src/Acquirer.cc:136 ../qt/src/Acquirer.cc:154 msgid "Starting scan..." msgstr "Startar skanning..." #: ../gtk/src/Acquirer.cc:164 ../qt/src/Acquirer.cc:150 msgid "Opening device..." msgstr "Skannern startas..." #: ../gtk/src/Acquirer.cc:166 ../qt/src/Acquirer.cc:152 msgid "Setting options..." msgstr "Inställningsalternativ..." #: ../gtk/src/Acquirer.cc:170 ../qt/src/Acquirer.cc:156 msgid "Getting parameters..." msgstr "Hämtar parametrar..." #: ../gtk/src/Acquirer.cc:172 ../qt/src/Acquirer.cc:158 msgid "Transferring data..." msgstr "Överför data..." #: ../gtk/src/Acquirer.cc:179 ../qt/src/Acquirer.cc:165 msgid "Canceling scan..." msgstr "Skanning avbröts" #: ../gtk/src/Config.cc:49 ../qt/data/ConfigDialog.ui.h:7 msgid "Filename prefix" msgstr "Filnamnsprefix" #: ../gtk/src/Config.cc:50 ../qt/data/ConfigDialog.ui.h:8 msgid "Code" msgstr "Kod" #: ../gtk/src/Config.cc:51 ../qt/data/ConfigDialog.ui.h:9 msgid "Native name" msgstr "Ursprungligt namn" #: ../gtk/src/Config.cc:109 ../qt/src/Config.cc:108 msgid "Script" msgstr "" #: ../gtk/src/CrashHandler.cc:25 ../gtk/src/CrashHandler.cc:41 #: ../qt/src/CrashHandler.cc:36 msgid "Crash Handler" msgstr "Krasch-hanterare" #: ../gtk/src/CrashHandler.cc:43 ../qt/src/CrashHandler.cc:31 msgid "Your work has been saved under %1." msgstr "Ditt arbete sparas under %1." #: ../gtk/src/CrashHandler.cc:45 ../qt/src/CrashHandler.cc:33 msgid "There was no unsaved work." msgstr "Inget osparat arbete." #: ../gtk/src/CrashHandler.cc:106 ../qt/src/CrashHandler.cc:62 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:232 ../qt/src/Displayer.cc:174 msgid "Failed to load image" msgstr "Misslyckades att läsa in bild" #: ../gtk/src/Displayer.cc:232 ../qt/src/Displayer.cc:174 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:138 ../qt/src/DisplayerToolSelect.cc:135 msgid "PNG Images" msgstr "PNG-bilder" #: ../gtk/src/DisplayerToolSelect.cc:139 ../qt/src/DisplayerToolSelect.cc:135 msgid "Save Selection Image" msgstr "Spara utvald bild" #: ../gtk/src/DisplayerToolSelect.cc:139 ../qt/src/DisplayerToolSelect.cc:135 msgid "selection.png" msgstr "bildval.png" #: ../gtk/src/DisplayerToolSelect.cc:146 ../qt/src/DisplayerToolSelect.cc:142 msgid "Recognize all" msgstr "Tolka allt" #: ../gtk/src/DisplayerToolSelect.cc:146 ../qt/src/DisplayerToolSelect.cc:142 msgid "Recognize selection" msgstr "Tolkningsurval" #: ../gtk/src/DisplayerToolSelect.cc:186 ../qt/src/DisplayerToolSelect.cc:182 msgid "Performing layout analysis" msgstr "Utför layoutanalys" #: ../gtk/src/FileDialogs.cc:235 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:237 msgid "Overwrite File?" msgstr "Ska filen skrivas över?" #: ../gtk/src/hocr/HOCRDocument.cc:611 ../gtk/src/hocr/OutputEditorHOCR.cc:266 #: ../qt/src/hocr/OutputEditorHOCR.cc:229 #, fuzzy msgid "Page" msgstr "Tolkningsfel: %1" #: ../gtk/src/hocr/HOCRDocument.cc:613 ../qt/src/hocr/HOCRDocument.cc:530 #, fuzzy msgid "Text block" msgstr "Textfiler" #: ../gtk/src/hocr/HOCRDocument.cc:615 ../gtk/src/hocr/OutputEditorHOCR.cc:272 #: ../qt/src/hocr/HOCRDocument.cc:532 ../qt/src/hocr/OutputEditorHOCR.cc:231 msgid "Paragraph" msgstr "Stycke" #: ../gtk/src/hocr/HOCRDocument.cc:617 ../qt/src/hocr/HOCRDocument.cc:534 msgid "Textline" msgstr "Textrad" #: ../gtk/src/hocr/HOCRDocument.cc:621 ../qt/src/hocr/HOCRDocument.cc:538 msgid "Graphic" msgstr "Grafisk" #: ../gtk/src/hocr/HOCROdtExporter.cc:65 ../gtk/src/hocr/HOCRPdfExporter.cc:489 #: ../gtk/src/hocr/HOCRTextExporter.cc:34 #: ../gtk/src/hocr/OutputEditorHOCR.cc:963 ../gtk/src/OutputEditorText.cc:272 #: ../qt/src/hocr/HOCROdtExporter.cc:50 ../qt/src/hocr/HOCRPdfExporter.cc:478 #: ../qt/src/hocr/HOCRTextExporter.cc:36 ../qt/src/hocr/OutputEditorHOCR.cc:830 #: ../qt/src/OutputEditorText.cc:238 msgid "output" msgstr "utdata" #: ../gtk/src/hocr/HOCROdtExporter.cc:68 ../qt/src/hocr/HOCROdtExporter.cc:53 msgid "OpenDocument Text Documents" msgstr "" #: ../gtk/src/hocr/HOCROdtExporter.cc:69 ../qt/src/hocr/HOCROdtExporter.cc:53 #, fuzzy msgid "Save ODT Output..." msgstr "Spara PDF utdata..." #: ../gtk/src/hocr/HOCROdtExporter.cc:77 ../gtk/src/hocr/HOCROdtExporter.cc:342 #: ../gtk/src/hocr/HOCRPdfExporter.cc:619 #: ../gtk/src/hocr/HOCRTextExporter.cc:46 ../qt/src/hocr/HOCROdtExporter.cc:61 #: ../qt/src/hocr/HOCRPdfExporter.cc:609 ../qt/src/hocr/HOCRTextExporter.cc:47 msgid "Export failed" msgstr "" #: ../gtk/src/hocr/HOCROdtExporter.cc:77 ../gtk/src/hocr/HOCROdtExporter.cc:342 #: ../qt/src/hocr/HOCROdtExporter.cc:61 msgid "The ODT export failed: unable to write output file." msgstr "" #: ../gtk/src/hocr/HOCROdtExporter.cc:336 ../qt/src/hocr/HOCROdtExporter.cc:254 #, fuzzy msgid "Exporting to ODT..." msgstr "Exportera till PDF" #: ../gtk/src/hocr/HOCRPdfExporter.cc:283 ../qt/src/hocr/HOCRPdfExporter.cc:365 #, fuzzy msgid "Same as source" msgstr "Källa" #: ../gtk/src/hocr/HOCRPdfExporter.cc:286 ../qt/src/hocr/HOCRPdfExporter.cc:366 msgid "Custom" msgstr "" #: ../gtk/src/hocr/HOCRPdfExporter.cc:300 ../qt/src/hocr/HOCRPdfExporter.cc:362 msgid "cm" msgstr "" #: ../gtk/src/hocr/HOCRPdfExporter.cc:303 ../qt/src/hocr/HOCRPdfExporter.cc:363 #, fuzzy msgid "in" msgstr "Sök" #: ../gtk/src/hocr/HOCRPdfExporter.cc:319 ../qt/src/hocr/HOCRPdfExporter.cc:353 msgid "Monochrome" msgstr "Monokrom" #: ../gtk/src/hocr/HOCRPdfExporter.cc:328 ../qt/src/hocr/HOCRPdfExporter.cc:355 msgid "Threshold (closest color)" msgstr "Tröskelvärde (närmaste färgnyans)" #: ../gtk/src/hocr/HOCRPdfExporter.cc:331 ../qt/src/hocr/HOCRPdfExporter.cc:356 msgid "Diffuse" msgstr "Diffusera" #: ../gtk/src/hocr/HOCRPdfExporter.cc:340 ../qt/src/hocr/HOCRPdfExporter.cc:357 msgid "Zip (lossless)" msgstr "Zip (förlustfri)" #: ../gtk/src/hocr/HOCRPdfExporter.cc:344 ../qt/src/hocr/HOCRPdfExporter.cc:358 msgid "CCITT Group 4 (lossless)" msgstr "CCITT Grupp 4 (förlustfri)" #: ../gtk/src/hocr/HOCRPdfExporter.cc:348 ../qt/src/hocr/HOCRPdfExporter.cc:359 msgid "Jpeg (lossy)" msgstr "Jpeg (med förlust)" #: ../gtk/src/hocr/HOCRPdfExporter.cc:493 ../qt/src/hocr/HOCRPdfExporter.cc:482 msgid "PDF Files" msgstr "PDF-filer" #: ../gtk/src/hocr/HOCRPdfExporter.cc:494 ../qt/src/hocr/HOCRPdfExporter.cc:482 msgid "Save PDF Output..." msgstr "Spara PDF utdata..." #: ../gtk/src/hocr/HOCRPdfExporter.cc:500 ../qt/src/hocr/HOCRPdfExporter.cc:488 #, fuzzy msgid "Invalid Output" msgstr "Spara utdata" #: ../gtk/src/hocr/HOCRPdfExporter.cc:500 ../qt/src/hocr/HOCRPdfExporter.cc:488 msgid "Cannot overwrite a file which is a source image of this document." msgstr "" #: ../gtk/src/hocr/HOCRPdfExporter.cc:516 ../qt/src/hocr/HOCRPdfExporter.cc:511 #, fuzzy msgid "Failed to create output" msgstr "Det gick inte att spara utdata" #: ../gtk/src/hocr/HOCRPdfExporter.cc:516 ../qt/src/hocr/HOCRPdfExporter.cc:511 msgid "Failed to create output. The returned error was: %1" msgstr "" #: ../gtk/src/hocr/HOCRPdfExporter.cc:558 ../qt/src/hocr/HOCRPdfExporter.cc:551 msgid "The operation was cancelled" msgstr "" #: ../gtk/src/hocr/HOCRPdfExporter.cc:607 ../qt/src/hocr/HOCRPdfExporter.cc:597 #, fuzzy msgid "Failed to render page %1" msgstr "" "\n" "[Kunde inte tolka sidan %1]\n" #: ../gtk/src/hocr/HOCRPdfExporter.cc:614 ../qt/src/hocr/HOCRPdfExporter.cc:604 #, fuzzy msgid "Exporting to PDF..." msgstr "Exportera till PDF" #: ../gtk/src/hocr/HOCRPdfExporter.cc:619 ../qt/src/hocr/HOCRPdfExporter.cc:609 msgid "The PDF export failed: %1." msgstr "" #: ../gtk/src/hocr/HOCRPdfExporter.cc:673 ../qt/src/hocr/HOCRPdfExporter.cc:662 #, fuzzy msgid "The PDF library could not load the font '%1'." msgstr "PDF-biblioteket stöder inte den valda fonten." #: ../gtk/src/hocr/HOCRTextExporter.cc:37 ../gtk/src/OutputEditorText.cc:274 #: ../qt/src/hocr/HOCRTextExporter.cc:39 ../qt/src/OutputEditorText.cc:239 msgid "Text Files" msgstr "Textfiler" #: ../gtk/src/hocr/HOCRTextExporter.cc:38 ../qt/src/hocr/HOCRTextExporter.cc:39 #, fuzzy msgid "Save Text Output..." msgstr "Spara utdata..." #: ../gtk/src/hocr/HOCRTextExporter.cc:46 ../qt/src/hocr/HOCRTextExporter.cc:47 msgid "The text export failed: unable to write output file." msgstr "" #: ../gtk/src/hocr/OutputEditorHOCR.cc:269 #: ../qt/src/hocr/OutputEditorHOCR.cc:230 msgid "Block" msgstr "" #: ../gtk/src/hocr/OutputEditorHOCR.cc:275 #: ../qt/src/hocr/OutputEditorHOCR.cc:232 msgid "Line" msgstr "" #: ../gtk/src/hocr/OutputEditorHOCR.cc:278 #: ../qt/src/hocr/OutputEditorHOCR.cc:233 msgid "Word" msgstr "" #: ../gtk/src/hocr/OutputEditorHOCR.cc:281 #: ../qt/src/hocr/OutputEditorHOCR.cc:234 msgid "Misspelled word" msgstr "" #: ../gtk/src/hocr/OutputEditorHOCR.cc:435 #: ../qt/src/hocr/OutputEditorHOCR.cc:317 msgid "" "The following pages could not be processed:\n" "%1" msgstr "" "Följande sidor kunde inte behandlas:\n" "%1" #: ../gtk/src/hocr/OutputEditorHOCR.cc:436 #: ../qt/src/hocr/OutputEditorHOCR.cc:318 msgid "Recognition errors" msgstr "Igenkänningsfel" #: ../gtk/src/hocr/OutputEditorHOCR.cc:594 #: ../qt/src/hocr/OutputEditorHOCR.cc:500 #: ../qt/src/hocr/OutputEditorHOCR.cc:512 #, fuzzy msgid "Multiple values" msgstr "Flera källor" #. Merging allowed #: ../gtk/src/hocr/OutputEditorHOCR.cc:778 #: ../qt/src/hocr/OutputEditorHOCR.cc:641 msgid "Merge" msgstr "Sammanfoga" #: ../gtk/src/hocr/OutputEditorHOCR.cc:786 #: ../gtk/src/hocr/OutputEditorHOCR.cc:877 #: ../qt/src/hocr/OutputEditorHOCR.cc:643 #: ../qt/src/hocr/OutputEditorHOCR.cc:725 msgid "Split from parent" msgstr "" #. Swapping allowed #: ../gtk/src/hocr/OutputEditorHOCR.cc:797 #: ../qt/src/hocr/OutputEditorHOCR.cc:647 msgid "Swap" msgstr "" #: ../gtk/src/hocr/OutputEditorHOCR.cc:821 #: ../qt/src/hocr/OutputEditorHOCR.cc:693 msgid "Add graphic region" msgstr "Lägg till grafisk region" #: ../gtk/src/hocr/OutputEditorHOCR.cc:824 #: ../qt/src/hocr/OutputEditorHOCR.cc:694 msgid "Add text block" msgstr "" #: ../gtk/src/hocr/OutputEditorHOCR.cc:828 #: ../qt/src/hocr/OutputEditorHOCR.cc:696 #, fuzzy msgid "Add paragraph" msgstr "Stycke" #: ../gtk/src/hocr/OutputEditorHOCR.cc:832 #: ../qt/src/hocr/OutputEditorHOCR.cc:698 #, fuzzy msgid "Add line" msgstr "Lägg till bilder" #: ../gtk/src/hocr/OutputEditorHOCR.cc:836 #: ../qt/src/hocr/OutputEditorHOCR.cc:700 msgid "Add word" msgstr "" #: ../gtk/src/hocr/OutputEditorHOCR.cc:852 #: ../qt/src/hocr/OutputEditorHOCR.cc:710 msgid "No suggestions" msgstr "Inga förslag" #: ../gtk/src/hocr/OutputEditorHOCR.cc:858 #: ../qt/src/hocr/OutputEditorHOCR.cc:714 msgid "Add to dictionary" msgstr "Lägg till i ordlista" #: ../gtk/src/hocr/OutputEditorHOCR.cc:864 #: ../qt/src/hocr/OutputEditorHOCR.cc:716 msgid "Ignore word" msgstr "Ignorera ord" #: ../gtk/src/hocr/OutputEditorHOCR.cc:926 #: ../gtk/src/hocr/OutputEditorHOCR.cc:965 #: ../qt/src/hocr/OutputEditorHOCR.cc:795 #: ../qt/src/hocr/OutputEditorHOCR.cc:832 msgid "hOCR HTML Files" msgstr "hOCR HTML-filer" #: ../gtk/src/hocr/OutputEditorHOCR.cc:927 #: ../qt/src/hocr/OutputEditorHOCR.cc:795 msgid "Open hOCR File" msgstr "Öppna hOCR-fil" #: ../gtk/src/hocr/OutputEditorHOCR.cc:936 #: ../qt/src/hocr/OutputEditorHOCR.cc:802 msgid "Failed to open file" msgstr "Det gick inte att öppna filen" #: ../gtk/src/hocr/OutputEditorHOCR.cc:936 #: ../qt/src/hocr/OutputEditorHOCR.cc:802 msgid "The file could not be opened: %1." msgstr "Filen kunde inte öppnas: %1" #: ../gtk/src/hocr/OutputEditorHOCR.cc:945 #: ../qt/src/hocr/OutputEditorHOCR.cc:809 msgid "Invalid hOCR file" msgstr "Ogiltig hOCR-fil" #: ../gtk/src/hocr/OutputEditorHOCR.cc:945 #: ../qt/src/hocr/OutputEditorHOCR.cc:809 msgid "The file does not appear to contain valid hOCR HTML: %1" msgstr "Filen verkar inte innehålla giltig hOCR HTML: %1" #: ../gtk/src/hocr/OutputEditorHOCR.cc:966 #: ../qt/src/hocr/OutputEditorHOCR.cc:832 msgid "Save hOCR Output..." msgstr "Spara hOCR utdata..." #: ../gtk/src/hocr/OutputEditorHOCR.cc:973 ../gtk/src/OutputEditorText.cc:282 #: ../qt/src/hocr/OutputEditorHOCR.cc:839 ../qt/src/OutputEditorText.cc:246 msgid "Failed to save output" msgstr "Det gick inte att spara utdata" #: ../gtk/src/hocr/OutputEditorHOCR.cc:973 ../gtk/src/OutputEditorText.cc:282 #: ../qt/src/hocr/OutputEditorHOCR.cc:839 ../qt/src/OutputEditorText.cc:246 msgid "Check that you have writing permissions in the selected folder." msgstr "Kontrollera att du har skrivbehörighet i den markerade mappen." #: ../gtk/src/hocr/OutputEditorHOCR.cc:1035 ../gtk/src/OutputEditorText.cc:296 #: ../qt/src/hocr/OutputEditorHOCR.cc:894 ../qt/src/OutputEditorText.cc:259 msgid "Output not saved" msgstr "Utdata har inte sparats" #: ../gtk/src/hocr/OutputEditorHOCR.cc:1035 ../gtk/src/OutputEditorText.cc:296 #: ../qt/src/hocr/OutputEditorHOCR.cc:894 ../qt/src/OutputEditorText.cc:259 msgid "Save output before proceeding?" msgstr "Spara utdata innan du fortsätter?" #: ../gtk/src/hocr/OutputEditorHOCR.cc:1156 ../gtk/src/OutputEditorText.cc:184 #: ../qt/src/hocr/OutputEditorHOCR.cc:991 ../qt/src/OutputEditorText.cc:152 msgid "Replacing..." msgstr "Ersätter..." #: ../gtk/src/hocr/OutputEditorHOCR.cc:1181 ../gtk/src/OutputEditorText.cc:192 #: ../qt/src/hocr/OutputEditorHOCR.cc:1014 ../qt/src/OutputEditorText.cc:160 msgid "Applying substitutions..." msgstr "Tillämpa ersättningar..." #: ../gtk/src/MainWindow.cc:131 ../qt/src/MainWindow.cc:295 msgid "Using tesseract" msgstr "Använda tesseract" #: ../gtk/src/MainWindow.cc:178 ../qt/src/MainWindow.cc:194 msgid "Select an image to begin..." msgstr "Välj en bild för att börja..." #: ../gtk/src/MainWindow.cc:293 ../qt/src/MainWindow.cc:278 msgid "Multiple sources" msgstr "Flera källor" #: ../gtk/src/MainWindow.cc:295 ../qt/src/MainWindow.cc:280 msgid "Ready" msgstr "Klar" #: ../gtk/src/MainWindow.cc:442 ../qt/src/MainWindow.cc:423 msgid "New version" msgstr "Ny version" #: ../gtk/src/MainWindow.cc:442 ../qt/src/MainWindow.cc:423 msgid "gImageReader %1 is available" msgstr "gImageReader %1 är tillgänglig" #: ../gtk/src/MainWindow.cc:443 ../qt/src/MainWindow.cc:424 msgid "Download" msgstr "Ladda ner" #: ../gtk/src/MainWindow.cc:444 ../qt/src/MainWindow.cc:425 msgid "Changelog" msgstr "Ändringslogg" #: ../gtk/src/MainWindow.cc:445 ../qt/src/MainWindow.cc:426 msgid "Don't notify again" msgstr "Informera inte igen" #: ../gtk/src/MainWindow.cc:466 ../qt/src/MainWindow.cc:474 msgid "Don't show again" msgstr "Visa inte igen" #: ../gtk/src/MainWindow.cc:467 ../gtk/src/MainWindow.cc:480 #: ../qt/src/MainWindow.cc:475 msgid "Install" msgstr "Installera" #: ../gtk/src/MainWindow.cc:487 ../qt/src/MainWindow.cc:487 msgid "Spelling dictionary missing" msgstr "Rättstavningsordlista saknas" #: ../gtk/src/MainWindow.cc:487 ../qt/src/MainWindow.cc:487 msgid "The spellcheck dictionary for %1 is not installed" msgstr "Ordbok för stavningskontroll %1 är inte installerad" #: ../gtk/src/MainWindow.cc:494 ../gtk/src/MainWindow.cc:523 #: ../qt/src/MainWindow.cc:493 msgid "Installing spelling dictionary for '%1'" msgstr "Installerar stavningsordlistan för '%1'" #: ../gtk/src/MainWindow.cc:515 ../gtk/src/MainWindow.cc:536 #: ../gtk/src/MainWindow.cc:544 ../gtk/src/MainWindow.cc:592 #: ../gtk/src/MainWindow.cc:597 ../gtk/src/TessdataManager.cc:60 #: ../gtk/src/TessdataManager.cc:70 ../gtk/src/TessdataManager.cc:339 #: ../qt/src/MainWindow.cc:512 ../qt/src/MainWindow.cc:525 #: ../qt/src/MainWindow.cc:534 ../qt/src/MainWindow.cc:578 #: ../qt/src/MainWindow.cc:583 ../qt/src/TessdataManager.cc:74 #: ../qt/src/TessdataManager.cc:84 ../qt/src/TessdataManager.cc:315 msgid "Error" msgstr "Fel" #: ../gtk/src/MainWindow.cc:515 ../qt/src/MainWindow.cc:512 msgid "Failed to install spelling dictionary: %1" msgstr "Kunde inte installera rättstavningsordbok: %1" #: ../gtk/src/MainWindow.cc:536 ../qt/src/MainWindow.cc:525 msgid "Failed to create directory for spelling dictionaries." msgstr "Kunde inte skapa mapp för rättstavningsordböcker." #: ../gtk/src/MainWindow.cc:544 ../qt/src/MainWindow.cc:534 msgid "Could not read %1: %2." msgstr "Kunde inte läsa %1: %2." #: ../gtk/src/MainWindow.cc:571 ../qt/src/MainWindow.cc:558 msgid "Downloading '%1'..." msgstr "Laddar ner '%1'..." #: ../gtk/src/MainWindow.cc:592 ../qt/src/MainWindow.cc:578 msgid "" "The following dictionaries could not be downloaded:\n" "%1\n" "\n" "Check the connectivity and directory permissions.\n" "Hint: If you don't have write permissions in system folders, you can switch " "to user paths in the settings dialog." msgstr "" #: ../gtk/src/MainWindow.cc:595 ../qt/src/MainWindow.cc:581 msgid "Dictionaries installed" msgstr "Rättstavningsordbok installerad" #: ../gtk/src/MainWindow.cc:595 #, fuzzy msgid "" "The following dictionaries were installed:\n" "%1" msgstr "Följande rättstavningsordböcker installerades:%1" #: ../gtk/src/MainWindow.cc:597 ../qt/src/MainWindow.cc:583 msgid "No spelling dictionaries found for '%1'." msgstr "Ingen rättstavningsordbok hittades för '%1'." #: ../gtk/src/OutputEditorText.cc:154 ../qt/src/OutputEditorText.cc:137 msgid "Stripping line breaks..." msgstr "Tar bort radbrytningar..." #: ../gtk/src/OutputEditorText.cc:162 msgid "Check spelling" msgstr "Kontrollera stavning" #: ../gtk/src/OutputEditorText.cc:231 ../qt/src/OutputEditorText.cc:196 #, fuzzy msgid "File: %1" msgstr "Filer" #: ../gtk/src/OutputEditorText.cc:234 ../qt/src/OutputEditorText.cc:199 #, fuzzy msgid "Page: %1" msgstr "Tolkningsfel: %1" #: ../gtk/src/OutputEditorText.cc:247 ../gtk/src/Recognizer.cc:471 #: ../qt/src/Recognizer.cc:462 msgid "" "\n" "[Failed to recognize page %1]\n" msgstr "" "\n" "[Kunde inte tolka sidan %1]\n" #: ../gtk/src/OutputEditorText.cc:275 ../qt/src/OutputEditorText.cc:239 msgid "Save Output..." msgstr "Spara utdata..." #: ../gtk/src/Recognizer.cc:179 ../qt/src/Recognizer.cc:172 msgid "No languages available" msgstr "Inga tillgängliga språk finns" #: ../gtk/src/Recognizer.cc:179 ../qt/src/Recognizer.cc:172 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:233 ../qt/src/Recognizer.cc:232 msgid "Multilingual" msgstr "Flerspråkig" #: ../gtk/src/Recognizer.cc:285 ../qt/src/Recognizer.cc:277 msgid "Automatic page segmentation" msgstr "Automatisk sidsegmetering" #: ../gtk/src/Recognizer.cc:286 ../qt/src/Recognizer.cc:278 msgid "Page segmentation with orientation and script detection" msgstr "Sidsegmentering med orientering och skriptdetektering" #: ../gtk/src/Recognizer.cc:287 ../qt/src/Recognizer.cc:279 msgid "Assume single column of text" msgstr "Antas vara en kolumn med text" #: ../gtk/src/Recognizer.cc:288 ../qt/src/Recognizer.cc:280 msgid "Assume single block of vertically aligned text" msgstr "Antas vara ett block med vertikalt anordnad text" #: ../gtk/src/Recognizer.cc:289 ../qt/src/Recognizer.cc:281 msgid "Assume a single uniform block of text" msgstr "Antas vara ett enhetligt block med text" #: ../gtk/src/Recognizer.cc:290 ../qt/src/Recognizer.cc:282 msgid "Assume a line of text" msgstr "Antas vara en rad med text" #: ../gtk/src/Recognizer.cc:291 ../qt/src/Recognizer.cc:283 msgid "Assume a single word" msgstr "Antas vara endast ett ord" #: ../gtk/src/Recognizer.cc:292 ../qt/src/Recognizer.cc:284 msgid "Assume a single word in a circle" msgstr "Antas vara endast ett ord i cirkel" #: ../gtk/src/Recognizer.cc:293 ../qt/src/Recognizer.cc:285 msgid "Sparse text in no particular order" msgstr "Gles text utan särskild ordning" #: ../gtk/src/Recognizer.cc:294 ../qt/src/Recognizer.cc:286 msgid "Sparse text with orientation and script detection" msgstr "Gles text med orientering och skriptdetektering" #: ../gtk/src/Recognizer.cc:309 ../qt/src/Recognizer.cc:297 msgid "Page segmentation mode" msgstr "Sidsegmeteringssätt" #: ../gtk/src/Recognizer.cc:313 ../qt/src/Recognizer.cc:300 msgid "Character whitelist / blacklist..." msgstr "" #: ../gtk/src/Recognizer.cc:319 ../qt/src/Recognizer.cc:305 msgid "Manage languages..." msgstr "Hantera språk..." #: ../gtk/src/Recognizer.cc:375 ../qt/src/Recognizer.cc:369 msgid "Current selection" msgstr "Aktuellt val" #: ../gtk/src/Recognizer.cc:465 ../qt/src/Recognizer.cc:455 msgid "Recognizing page %1 (%2 of %3)" msgstr "Tolkar sida %1 (%2 av %3)" #: ../gtk/src/Recognizer.cc:470 ../qt/src/Recognizer.cc:461 msgid "" "\n" "- Page %1: failed to render page" msgstr "" "\n" "- Sidan %1: kunde inte rendera sidan" #: ../gtk/src/Recognizer.cc:501 ../gtk/src/Recognizer.cc:531 #: ../gtk/src/Recognizer.cc:544 ../qt/src/Recognizer.cc:491 #: ../qt/src/Recognizer.cc:521 ../qt/src/Recognizer.cc:534 msgid "Recognizing..." msgstr "Tolkning genomförs..." #: ../gtk/src/Recognizer.cc:505 ../gtk/src/Recognizer.cc:514 #: ../qt/src/Recognizer.cc:495 ../qt/src/Recognizer.cc:504 msgid "Recognition errors occurred" msgstr "Tolkningsfel har inträffat" #: ../gtk/src/Recognizer.cc:505 ../qt/src/Recognizer.cc:495 msgid "The following errors occurred:%1" msgstr "Följande fel har inträffat:%1" #: ../gtk/src/Recognizer.cc:514 ../qt/src/Recognizer.cc:504 msgid "Failed to initialize tesseract" msgstr "Tesseract kunde inte initieras" #: ../gtk/src/scanner/ScannerSane.cc:84 ../gtk/src/scanner/ScannerTwain.cc:288 #: ../qt/src/scanner/ScannerSane.cc:85 ../qt/src/scanner/ScannerTwain.cc:286 msgid "Scan canceled" msgstr "Skanning avbröts" #: ../gtk/src/scanner/ScannerSane.cc:159 ../gtk/src/scanner/ScannerTwain.cc:186 #: ../qt/src/scanner/ScannerSane.cc:159 ../qt/src/scanner/ScannerTwain.cc:178 msgid "No scanner specified" msgstr "Ingen skanner specificerad" #: ../gtk/src/scanner/ScannerSane.cc:168 ../gtk/src/scanner/ScannerTwain.cc:195 #: ../qt/src/scanner/ScannerSane.cc:168 ../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:403 ../gtk/src/scanner/ScannerTwain.cc:266 #: ../gtk/src/scanner/ScannerTwain.cc:292 ../qt/src/scanner/ScannerSane.cc:403 #: ../qt/src/scanner/ScannerTwain.cc:258 ../qt/src/scanner/ScannerTwain.cc:290 msgid "Unable to start scan" msgstr "Det går inte att starta skanningen" #: ../gtk/src/scanner/ScannerSane.cc:411 ../gtk/src/scanner/ScannerSane.cc:461 #: ../gtk/src/scanner/ScannerTwain.cc:318 ../qt/src/scanner/ScannerSane.cc:411 #: ../qt/src/scanner/ScannerSane.cc:461 ../qt/src/scanner/ScannerTwain.cc:316 msgid "Error communicating with scanner" msgstr "Fel vid kommunikation med skannern" #: ../gtk/src/scanner/ScannerSane.cc:520 ../qt/src/scanner/ScannerSane.cc:517 msgid "Failed to save image" msgstr "Det gick inte att spara bilden" #: ../gtk/src/scanner/ScannerSane.cc:800 ../qt/src/scanner/ScannerSane.cc:797 #, fuzzy msgid "Operation is cancelled." msgstr "Skanning avbröts" #: ../gtk/src/scanner/ScannerSane.cc:802 ../qt/src/scanner/ScannerSane.cc:799 msgid "Device is busy." msgstr "" #: ../gtk/src/scanner/ScannerSane.cc:804 ../qt/src/scanner/ScannerSane.cc:801 msgid "Cover is opened." msgstr "" #: ../gtk/src/scanner/ScannerSane.cc:806 ../qt/src/scanner/ScannerSane.cc:803 msgid "Document feeder jammed." msgstr "" #: ../gtk/src/scanner/ScannerSane.cc:808 ../qt/src/scanner/ScannerSane.cc:805 msgid "Document feeder out of documents." msgstr "" #: ../gtk/src/scanner/ScannerSane.cc:810 ../qt/src/scanner/ScannerSane.cc:807 #, fuzzy msgid "Access to scanner is denied." msgstr "Ingen skanner specificerad" #: ../gtk/src/SourceManager.cc:118 ../qt/src/SourceManager.cc:124 msgid "PDFs with text" msgstr "" #: ../gtk/src/SourceManager.cc:118 ../qt/src/SourceManager.cc:124 msgid "" "These PDF files already contain text:\n" "%1" msgstr "" #: ../gtk/src/SourceManager.cc:127 ../qt/src/SourceManager.cc:132 msgid "Unable to open files" msgstr "Det går inte att öppna filer" #: ../gtk/src/SourceManager.cc:127 ../qt/src/SourceManager.cc:132 msgid "The following files could not be opened:%1" msgstr "Följande filer kunde inte öppnas:%1" #: ../gtk/src/SourceManager.cc:141 ../qt/src/SourceManager.cc:143 msgid "Enter password for file '%1':" msgstr "" #: ../gtk/src/SourceManager.cc:197 ../qt/src/SourceManager.cc:214 msgid "Images and PDFs" msgstr "Bilder och PDF-filer" #: ../gtk/src/SourceManager.cc:202 ../qt/src/SourceManager.cc:215 msgid "Select Files" msgstr "Välj filer" #: ../gtk/src/SourceManager.cc:208 ../qt/src/SourceManager.cc:226 msgid "Clipboard Error" msgstr "Urklippsfel" #: ../gtk/src/SourceManager.cc:208 ../qt/src/SourceManager.cc:226 msgid "Failed to read the clipboard." msgstr "Det gick inte att läsa urklipp." #: ../gtk/src/SourceManager.cc:212 ../qt/src/SourceManager.cc:230 #: ../qt/src/SourceManager.cc:236 msgid "Pasted %1" msgstr "%1 inklistrat" #: ../gtk/src/SourceManager.cc:224 ../qt/src/SourceManager.cc:243 msgid "Screenshot Error" msgstr "Skärmdumpsfel" #: ../gtk/src/SourceManager.cc:224 ../qt/src/SourceManager.cc:243 msgid "Failed to take screenshot." msgstr "Det gick inte att ta skärmdump." #: ../gtk/src/SourceManager.cc:228 ../qt/src/SourceManager.cc:247 msgid "Screenshot %1" msgstr "Skärmdump %1" #: ../gtk/src/SourceManager.cc:233 ../qt/src/SourceManager.cc:252 msgid "Saving image..." msgstr "Bilden sparas..." #: ../gtk/src/SourceManager.cc:240 ../qt/src/SourceManager.cc:265 msgid "Cannot Write File" msgstr "Kan inte skriva filen" #: ../gtk/src/SourceManager.cc:240 ../qt/src/SourceManager.cc:265 msgid "Could not write to %1." msgstr "Det gick inte att skriva till %1" #: ../gtk/src/SourceManager.cc:267 ../qt/src/SourceManager.cc:287 msgid "Delete File?" msgstr "Radera fil?" #: ../gtk/src/SourceManager.cc:267 ../qt/src/SourceManager.cc:287 msgid "The following files will be deleted:%1" msgstr "Följande filer kommer att raderas:%1" #: ../gtk/src/SourceManager.cc:332 ../qt/src/SourceManager.cc:338 msgid "Missing File" msgstr "Fil saknas" #: ../gtk/src/SourceManager.cc:332 ../qt/src/SourceManager.cc:338 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:33 ../qt/src/SubstitutionsManager.cc:73 msgid "Search for" msgstr "Söker efter" #: ../gtk/src/SubstitutionsManager.cc:34 ../qt/src/SubstitutionsManager.cc:73 msgid "Replace with" msgstr "Ersätt med" #: ../gtk/src/SubstitutionsManager.cc:69 ../gtk/src/SubstitutionsManager.cc:103 #: ../qt/src/SubstitutionsManager.cc:106 ../qt/src/SubstitutionsManager.cc:143 msgid "Substitutions List" msgstr "Ersättningslista" #: ../gtk/src/SubstitutionsManager.cc:70 ../qt/src/SubstitutionsManager.cc:106 msgid "Open Substitutions List" msgstr "Öppna ersättningslista" #: ../gtk/src/SubstitutionsManager.cc:75 ../qt/src/SubstitutionsManager.cc:112 msgid "Error Reading File" msgstr "Fel vid läsning av fil" #: ../gtk/src/SubstitutionsManager.cc:75 ../qt/src/SubstitutionsManager.cc:112 msgid "Unable to read '%1'." msgstr "Det går inte att läsa '%1'." #: ../gtk/src/SubstitutionsManager.cc:97 ../qt/src/SubstitutionsManager.cc:137 msgid "Errors Occurred Reading File" msgstr "Fel vid läsning av fil" #: ../gtk/src/SubstitutionsManager.cc:97 ../qt/src/SubstitutionsManager.cc:137 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:104 ../qt/src/SubstitutionsManager.cc:143 msgid "Save Substitutions List" msgstr "Spara ersättningslistan" #: ../gtk/src/SubstitutionsManager.cc:110 ../qt/src/SubstitutionsManager.cc:149 msgid "Error Saving File" msgstr "Fel när filen sparades" #: ../gtk/src/SubstitutionsManager.cc:110 ../qt/src/SubstitutionsManager.cc:149 msgid "Unable to write to '%1'." msgstr "Det går inte att skriva till '%1'." #: ../gtk/src/SubstitutionsManager.cc:127 ../qt/src/SubstitutionsManager.cc:162 msgid "Save List?" msgstr "Spara listan?" #: ../gtk/src/SubstitutionsManager.cc:127 ../qt/src/SubstitutionsManager.cc:162 msgid "Do you want to save the current list?" msgstr "Vill du spara den nuvarande listan?" #: ../gtk/src/TessdataManager.cc:60 ../qt/src/TessdataManager.cc:74 #, fuzzy msgid "" "A session connection to the PackageKit backend is required for managing " "system-wide tesseract language packs, but it was not found. This service is " "usually provided by a software-management application such as Gnome " "Software. Please install software which provides the necessary PackageKit " "interface, use other system package management software to manage the " "tesseract language packs directly, or switch to using 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:65 ../qt/src/TessdataManager.cc:79 msgid "Fetching available languages" msgstr "Hämtar tillgängliga språk" #: ../gtk/src/TessdataManager.cc:70 ../gtk/src/TessdataManager.cc:96 #: ../gtk/src/TessdataManager.cc:197 ../qt/src/TessdataManager.cc:84 #: ../qt/src/TessdataManager.cc:101 ../qt/src/TessdataManager.cc:197 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:104 ../qt/src/TessdataManager.cc:113 #: ../qt/src/TessdataManager.cc:122 msgid "Parsing error: %1" msgstr "Tolkningsfel: %1" #: ../gtk/src/TessdataManager.cc:235 ../qt/src/TessdataManager.cc:232 msgid "Applying changes..." msgstr "Tillämpar ändringar..." #: ../gtk/src/TessdataManager.cc:297 ../qt/src/TessdataManager.cc:278 msgid "Failed to create directory for tessdata files." msgstr "Det gick inte att skapa katalog för tessdatafiler." #: ../gtk/src/TessdataManager.cc:306 ../qt/src/TessdataManager.cc:287 msgid "Downloading %1..." msgstr "Laddar ner %1..." #: ../gtk/src/TessdataManager.cc:330 #, fuzzy msgid "" "The following files could not be downloaded or removed:\n" "%1\n" "\n" "Check the connectivity and directory permissions.\n" "\n" "Hint: If you don't have write permissions in system folders, you can switch " "to user paths in the settings dialog." msgstr "" "Följande filer kunde inte hämtas eller tas bort:\n" "%1\n" "\n" "Kontrollera anslutningen och katalogbehörigheterna." #: ../gtk/src/Utils.cc:64 msgid "Yes" msgstr "Ja" #: ../gtk/src/Utils.cc:67 msgid "No" msgstr "Nej" #: ../gtk/src/Utils.cc:76 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/CrashHandler.ui.h:3 msgid "" "

Tesseract has " "aborted

Tesseract (the OCR engine) has aborted while " "recognizing text. This may occur if the used traineddatas are corrupt or " "incomplatible with the version of tesseract in use, or due to a bug in " "tesseract.

The stacktrace below may provide additional information " "about where the crash occured.

" msgstr "" #: ../qt/data/MainWindow.ui.h:17 msgid "Flatbed" msgstr "" #: ../qt/data/MainWindow.ui.h:18 msgid "ADF Front" msgstr "" #: ../qt/data/MainWindow.ui.h:19 msgid "ADF Back" msgstr "" #: ../qt/data/MainWindow.ui.h:20 msgid "ADF Duplex" msgstr "" #. Remove & from some labels which designer insists in adding #: ../qt/data/MainWindow.ui.h:21 ../qt/src/Ui_MainWindow.hh:50 msgid "Sources" msgstr "Källor" #: ../qt/data/MainWindow.ui.h:22 msgid "Zoom In" msgstr "Zooma In" #: ../qt/data/MainWindow.ui.h:24 msgid "Zoom Out" msgstr "Zooma ut" #: ../qt/data/MainWindow.ui.h:26 msgid "Normal Size" msgstr "Normal storlek" #: ../qt/data/MainWindow.ui.h:28 msgid "Best Fit" msgstr "Bästa passning" #: ../qt/data/MainWindow.ui.h:30 msgid "Rotate Left" msgstr "Rotera vänster" #: ../qt/data/MainWindow.ui.h:31 msgid "Rotate left" msgstr "Rotera vänster" #: ../qt/data/MainWindow.ui.h:32 msgid "Rotate Right" msgstr "Rotera höger" #: ../qt/data/MainWindow.ui.h:33 msgid "Rotate right" msgstr "Rotera höger" #: ../qt/data/MainWindow.ui.h:34 msgid "Image Controls" msgstr "Bildanpassning" #: ../qt/data/MainWindow.ui.h:36 msgid "Autodetect Layout" msgstr "Känn igen layout automatiskt" #: ../qt/data/MainWindow.ui.h:38 msgid "Toggle Output Pane" msgstr "Visa/stäng utgångsfönstret" #: ../qt/data/PdfExportDialog.ui.h:5 msgid "Backend:" msgstr "" #: ../qt/data/PdfExportDialog.ui.h:8 msgid "Portrait" msgstr "" #: ../qt/data/PdfExportDialog.ui.h:9 msgid "Landscape" msgstr "" #: ../qt/src/hocr/HOCRPdfExporter.cc:142 #, fuzzy msgid "Failed to write to file" msgstr "Det gick inte att öppna filen" #. Output toolbar #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:55 #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:56 msgid "Open hOCR file" msgstr "Öppna hOCR-fil" #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:57 #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:58 msgid "Save as hOCR text" msgstr "Spara som hOCR-text" #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:79 #: ../qt/src/Ui_OutputEditorText.hh:106 msgid "Find and Replace" msgstr "Sök och ersätt" #: ../qt/src/MainWindow.cc:581 #, fuzzy msgid "" "The following dictionary files were installed:\n" "%1" msgstr "Följande ordboks-filer installerades:%1" #: ../qt/src/TessdataManager.cc:308 #, fuzzy msgid "" "The following files could not be downloaded or removed:\n" "%1\n" "\n" "Check the connectivity and directory permissions.\n" "Hint: If you don't have write permissions in system folders, you can switch " "to user paths in the settings dialog." msgstr "" "Följande filer kunde inte hämtas eller tas bort:\n" "%1\n" "\n" "Kontrollera anslutningen och katalogbehörigheterna." #: ../qt/src/Ui_MainWindow.hh:51 msgid "Output" msgstr "Utdata" #: ../qt/src/Ui_MainWindow.hh:135 msgid "OCR mode:" msgstr "OCR-läge:" #: ../qt/src/Ui_MainWindow.hh:209 msgid "Remove Image" msgstr "Ta bort bild" #: ../qt/src/Ui_MainWindow.hh:212 msgid "Delete Image" msgstr "Radera bild" #: ../qt/src/Ui_MainWindow.hh:215 msgid "Clear List" msgstr "Töm Lista" #: ../qt/src/Ui_OutputEditorText.hh:101 msgid "Strip Line Breaks" msgstr "Rensa radbrytningar" #: ../qt/src/Ui_OutputEditorText.hh:115 msgid "Save Output" msgstr "Spara utdata" #: ../qt/src/Ui_OutputEditorText.hh:117 msgid "Clear Output" msgstr "Rensa utdata" #~ msgid "The application has crashed" #~ msgstr "Applikationen har kraschat" #~ 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." #~ msgid "Could not read %1: %2" #~ msgstr "Kunde inte läsa %1: %2" #~ msgid "gImageReader" #~ msgstr "gImageReader" #, 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 "Document font:" #~ msgstr "Dokument-teckensnitt:" #~ msgid "Scale:" #~ msgstr "Skala" #~ msgid "Document" #~ msgstr "Dokumentera" #~ msgid "Errors occurred" #~ msgstr "Fel har inträffat" #~ msgid "" #~ "The following pages could not be rendered:\n" #~ "%1" #~ msgstr "" #~ "Följande sidor kunde inte återges:\n" #~ "%1" #~ msgid "substitution_list.txt" #~ msgstr "ersättnings_lista.txt" #~ 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.3.1/po/tr.po000066400000000000000000002011511351740627400154460ustar00rootroot00000000000000# Sandro Mani , 2016, 2017. msgid "" msgstr "" "Project-Id-Version: \n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2019-07-25 23:17+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" #: ../data/gimagereader.desktop.in.h:1 msgid "OCR application" msgstr "" #: ../gtk/data/appmenu.ui.h:1 ../qt/src/Ui_MainWindow.hh:167 msgid "Redetect Languages" msgstr "Dilleri Yeniden Algıla" #: ../gtk/data/appmenu.ui.h:2 ../qt/src/Ui_MainWindow.hh:170 #, fuzzy msgid "Manage Languages" msgstr "Dilleri yönet..." #: ../gtk/data/appmenu.ui.h:3 ../gtk/data/ConfigDialog.ui.h:1 #: ../qt/data/ConfigDialog.ui.h:1 ../qt/src/Ui_MainWindow.hh:173 msgid "Preferences" msgstr "Tercihler" #: ../gtk/data/appmenu.ui.h:4 ../gtk/data/ConfigDialog.ui.h:2 #: ../gtk/src/MainWindow.cc:482 ../qt/src/MainWindow.cc:481 #: ../qt/src/Ui_MainWindow.hh:178 msgid "Help" msgstr "Yardım" #: ../gtk/data/appmenu.ui.h:5 ../qt/data/AboutDialog.ui.h:2 #: ../qt/src/Ui_MainWindow.hh:181 msgid "About" msgstr "Hakkında" #: ../gtk/data/appmenu.ui.h:6 msgid "Quit" msgstr "Çık" #: ../gtk/data/ConfigDialog.ui.h:3 ../gtk/data/MainWindow.ui.h:47 #: ../gtk/data/OutputEditorHOCR.ui.h:3 ../gtk/data/PdfExportDialog.ui.h:3 #: ../gtk/src/FileDialogs.cc:152 ../gtk/src/Utils.cc:61 #: ../qt/data/ConfigDialog.ui.h:26 msgid "OK" msgstr "Tamam" #: ../gtk/data/ConfigDialog.ui.h:4 msgid "Output pane orientation:" msgstr "Çıktı bölmesi yönelimi:" #: ../gtk/data/ConfigDialog.ui.h:5 msgid "Horizontal" msgstr "Yatay" #: ../gtk/data/ConfigDialog.ui.h:6 msgid "Vertical" msgstr "Dikey" #: ../gtk/data/ConfigDialog.ui.h:7 ../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/ConfigDialog.ui.h:8 ../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/ConfigDialog.ui.h:9 ../qt/data/ConfigDialog.ui.h:3 msgid "Predefined language definitions:" msgstr "Öntanımlı dil tanımlamaları:" #: ../gtk/data/ConfigDialog.ui.h:10 ../qt/data/ConfigDialog.ui.h:12 msgid "Additional language definitions:" msgstr "Ek dil tanımlamaları:" #: ../gtk/data/ConfigDialog.ui.h:11 ../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/ConfigDialog.ui.h:12 ../qt/data/ConfigDialog.ui.h:21 msgid "Prefix" msgstr "Ön ek" #: ../gtk/data/ConfigDialog.ui.h:13 ../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/ConfigDialog.ui.h:14 ../qt/data/ConfigDialog.ui.h:23 msgid "ISO Code" msgstr "ISO Kodu" #: ../gtk/data/ConfigDialog.ui.h:15 ../qt/data/ConfigDialog.ui.h:24 msgid "The name of the language" msgstr "Dilin adı" #: ../gtk/data/ConfigDialog.ui.h:16 ../qt/data/ConfigDialog.ui.h:25 msgid "Name" msgstr "Ad" #: ../gtk/data/ConfigDialog.ui.h:17 ../gtk/data/MainWindow.ui.h:46 #: ../gtk/data/OutputEditorHOCR.ui.h:2 ../gtk/data/PdfExportDialog.ui.h:2 #: ../gtk/src/Acquirer.cc:34 ../gtk/src/FileDialogs.cc:151 #: ../gtk/src/Utils.cc:70 ../qt/data/ConfigDialog.ui.h:27 #: ../qt/data/MainWindow.ui.h:12 msgid "Cancel" msgstr "İptal" #: ../gtk/data/ConfigDialog.ui.h:18 ../qt/data/ConfigDialog.ui.h:5 msgid "Output pane font:" msgstr "Çıktı bölmesi yazı tipi:" #: ../gtk/data/ConfigDialog.ui.h:19 ../qt/data/ConfigDialog.ui.h:2 msgid "Default" msgstr "Varsayılan" #: ../gtk/data/ConfigDialog.ui.h:20 ../qt/data/ConfigDialog.ui.h:6 msgid "Language data locations:" msgstr "Dil veri konumları:" #: ../gtk/data/ConfigDialog.ui.h:21 ../qt/data/ConfigDialog.ui.h:13 msgid "Language definitions path:" msgstr "Dil tanımlama yolu:" #: ../gtk/data/ConfigDialog.ui.h:22 ../qt/data/ConfigDialog.ui.h:28 msgid "Spelling dictionaries path:" msgstr "Yazım denetimi sözlüğü yolu" #: ../gtk/data/ConfigDialog.ui.h:23 ../qt/data/ConfigDialog.ui.h:10 msgid "System-wide paths" msgstr "Sistem geneli yolları" #: ../gtk/data/ConfigDialog.ui.h:24 ../qt/data/ConfigDialog.ui.h:11 msgid "User paths" msgstr "Kullanıcı yolları" #: ../gtk/data/ConfigDialog.ui.h:25 ../qt/data/ConfigDialog.ui.h:29 msgid "Automatically open exported documents with default application" msgstr "" #: ../gtk/data/CrashHandler.ui.h:1 ../qt/src/CrashHandler.cc:38 msgid "Regenerate backtrace" msgstr "Geri dönük izlemeyi yeniden oluştur" #: ../gtk/data/CrashHandler.ui.h:3 #, fuzzy, no-c-format msgid "" "The application has crashed\n" "\n" "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/CrashHandler.ui.h:6 msgid "" "Tesseract has aborted\n" "\n" "Tesseract (the OCR engine) has aborted while recognizing text. This may " "occur if the used traineddatas are corrupt or incomplatible with the version " "of tesseract in use, or due to a bug in tesseract.\n" "\n" "The stacktrace below may provide additional information about where the " "crash occured.\n" msgstr "" #: ../gtk/data/MainWindow.ui.h:1 ../qt/data/MainWindow.ui.h:39 msgid "Toggle output pane" msgstr "Çıktı bölmesini değiştir" #: ../gtk/data/MainWindow.ui.h:2 ../qt/src/Ui_MainWindow.hh:66 msgid "Rotate current page" msgstr "Mevcut sayfayı döndür" #: ../gtk/data/MainWindow.ui.h:3 ../qt/src/Ui_MainWindow.hh:67 msgid "Rotate all pages" msgstr "Tüm sayfaları döndür" #. Sources toolbar #: ../gtk/data/MainWindow.ui.h:4 ../qt/src/Ui_MainWindow.hh:192 msgid "Recent" msgstr "Son kullanılan" #: ../gtk/data/MainWindow.ui.h:5 ../qt/src/Ui_MainWindow.hh:193 msgid "Paste" msgstr "Yapıştır" #: ../gtk/data/MainWindow.ui.h:6 ../qt/src/Ui_MainWindow.hh:194 msgid "Take Screenshot" msgstr "Ekran Görüntüsü Al" #: ../gtk/data/MainWindow.ui.h:7 ../qt/data/MainWindow.ui.h:23 msgid "Zoom in" msgstr "Yakınlaştır" #: ../gtk/data/MainWindow.ui.h:8 ../qt/data/MainWindow.ui.h:25 msgid "Zoom out" msgstr "Uzaklaştır" #: ../gtk/data/MainWindow.ui.h:9 ../qt/data/MainWindow.ui.h:27 msgid "Normal size" msgstr "Normal boyut" #: ../gtk/data/MainWindow.ui.h:10 ../qt/data/MainWindow.ui.h:29 msgid "Best fit" msgstr "En uygun" #: ../gtk/data/MainWindow.ui.h:11 ../qt/src/Ui_MainWindow.hh:75 msgid "Select rotation mode" msgstr "Döndürme kipini seç" #: ../gtk/data/MainWindow.ui.h:12 ../gtk/data/OutputEditorText.ui.h:13 #: ../qt/src/Ui_OutputEditorText.hh:95 msgid "Select insert mode" msgstr "Ekleme kipini seç" #: ../gtk/data/MainWindow.ui.h:13 ../qt/src/Ui_MainWindow.hh:109 #, fuzzy msgid "Select page" msgstr "Dili seç" #: ../gtk/data/MainWindow.ui.h:14 ../qt/data/MainWindow.ui.h:35 msgid "Image controls" msgstr "Resim denetimleri" #: ../gtk/data/MainWindow.ui.h:15 ../qt/src/Ui_MainWindow.hh:139 msgid "Plain text" msgstr "Düz metin" #: ../gtk/data/MainWindow.ui.h:16 ../qt/src/Ui_MainWindow.hh:139 msgid "hOCR, PDF" msgstr "hOCR, PDF" #: ../gtk/data/MainWindow.ui.h:17 ../qt/data/MainWindow.ui.h:37 msgid "Autodetect layout" msgstr "Yerleşimi otomatik algıla" #: ../gtk/data/MainWindow.ui.h:18 msgid "Recognize all" msgstr "Tümünü tanı" #: ../gtk/data/MainWindow.ui.h:19 msgid "Select language" msgstr "Dili seç" #: ../gtk/data/MainWindow.ui.h:20 ../qt/src/Ui_MainWindow.hh:205 msgid "Add images" msgstr "Resim ekle" #: ../gtk/data/MainWindow.ui.h:21 ../qt/src/Ui_MainWindow.hh:204 msgid "Add Images" msgstr "Resim Ekle" #: ../gtk/data/MainWindow.ui.h:22 ../qt/src/Ui_MainWindow.hh:210 msgid "Remove image from list" msgstr "Resmi listeden çıkar" #: ../gtk/data/MainWindow.ui.h:23 ../qt/src/Ui_MainWindow.hh:213 msgid "Delete image" msgstr "Resmi sil" #: ../gtk/data/MainWindow.ui.h:24 ../qt/src/Ui_MainWindow.hh:216 msgid "Clear list" msgstr "Listeyi temizle" #: ../gtk/data/MainWindow.ui.h:25 ../qt/data/MainWindow.ui.h:5 msgid "Files" msgstr "Dosyalar" #: ../gtk/data/MainWindow.ui.h:26 ../qt/data/MainWindow.ui.h:8 msgid "Device:" msgstr "Aygıt:" #: ../gtk/data/MainWindow.ui.h:27 ../gtk/data/TessdataManager.ui.h:4 #: ../qt/data/MainWindow.ui.h:7 ../qt/src/TessdataManager.cc:59 msgid "Refresh" msgstr "Tazele" #: ../gtk/data/MainWindow.ui.h:28 ../qt/data/MainWindow.ui.h:9 msgid "Output:" msgstr "Çıktı:" #: ../gtk/data/MainWindow.ui.h:29 ../qt/data/MainWindow.ui.h:13 msgid "Mode:" msgstr "Kip:" #: ../gtk/data/MainWindow.ui.h:30 ../gtk/src/hocr/HOCRPdfExporter.cc:313 #: ../qt/data/MainWindow.ui.h:15 ../qt/src/hocr/HOCRPdfExporter.cc:347 msgid "Color" msgstr "Renk" #: ../gtk/data/MainWindow.ui.h:31 ../gtk/src/hocr/HOCRPdfExporter.cc:316 #: ../qt/data/MainWindow.ui.h:14 ../qt/src/hocr/HOCRPdfExporter.cc:349 #: ../qt/src/hocr/HOCRPdfExporter.cc:351 msgid "Grayscale" msgstr "Gri tonlama" #: ../gtk/data/MainWindow.ui.h:32 ../qt/data/MainWindow.ui.h:10 msgid "Resolution:" msgstr "Çözünürlük:" #: ../gtk/data/MainWindow.ui.h:33 ../qt/data/MainWindow.ui.h:11 msgid "Scan" msgstr "Tara" #: ../gtk/data/MainWindow.ui.h:34 ../qt/data/MainWindow.ui.h:16 #, fuzzy msgid "Source:" msgstr "Kaynak" #: ../gtk/data/MainWindow.ui.h:35 ../qt/data/MainWindow.ui.h:6 msgid "Acquire" msgstr "Edin" #: ../gtk/data/MainWindow.ui.h:36 ../qt/data/MainWindow.ui.h:1 msgid "Brightness" msgstr "Parlaklık" #: ../gtk/data/MainWindow.ui.h:37 ../qt/data/MainWindow.ui.h:2 msgid "Contrast" msgstr "Karşıtlık" #: ../gtk/data/MainWindow.ui.h:38 ../qt/data/MainWindow.ui.h:3 msgid "Resolution" msgstr "Çözünürlük" #: ../gtk/data/MainWindow.ui.h:39 ../qt/data/MainWindow.ui.h:4 msgid "Invert colors" msgstr "Renkleri tersine çevir" #: ../gtk/data/MainWindow.ui.h:40 msgid "A graphical frontend to tesseract-ocr" msgstr "tesseract-ocr komutu için bir grafiksel arayüz" #: ../gtk/data/MainWindow.ui.h:41 ../qt/data/CharacterListDialog.ui.h:1 msgid "Character whitelist / blacklist" msgstr "" #: ../gtk/data/MainWindow.ui.h:42 ../qt/data/CharacterListDialog.ui.h:2 msgid "Exclude these characters from being recognized (blacklist):" msgstr "" #: ../gtk/data/MainWindow.ui.h:43 ../qt/data/CharacterListDialog.ui.h:3 #, fuzzy msgid "Enter a string of characters..." msgstr "Parametreler alınıyor..." #: ../gtk/data/MainWindow.ui.h:44 ../qt/data/CharacterListDialog.ui.h:4 msgid "Only allow the following characters to be recognized (whitelist):" msgstr "" #: ../gtk/data/MainWindow.ui.h:45 ../qt/data/PageRangeDialog.ui.h:1 msgid "Page Range" msgstr "Sayfa Aralığı" #: ../gtk/data/MainWindow.ui.h:48 ../qt/data/PageRangeDialog.ui.h:2 msgid "Page range:" msgstr "Sayfa aralığı:" #: ../gtk/data/MainWindow.ui.h:49 ../qt/data/PageRangeDialog.ui.h:3 msgid "Example: 1-10, 13, 14-18" msgstr "Örnek: 1-10, 13, 14-18" #: ../gtk/data/MainWindow.ui.h:50 ../qt/data/PageRangeDialog.ui.h:4 msgid "Recognition area:" msgstr "Tanıma alanı:" #: ../gtk/data/MainWindow.ui.h:51 ../gtk/src/Recognizer.cc:375 #: ../qt/data/PageRangeDialog.ui.h:5 ../qt/src/Recognizer.cc:369 msgid "Entire page" msgstr "Tüm sayfa" #: ../gtk/data/MainWindow.ui.h:52 ../qt/data/PageRangeDialog.ui.h:6 msgid "Autodetect" msgstr "Otomatik Algıla" #: ../gtk/data/MainWindow.ui.h:53 ../qt/data/PageRangeDialog.ui.h:7 #, fuzzy msgid "Prepend to output text:" msgstr "Mevcut metne ekle" #: ../gtk/data/MainWindow.ui.h:54 ../qt/data/PageRangeDialog.ui.h:8 msgid "Source filename" msgstr "" #: ../gtk/data/MainWindow.ui.h:55 ../qt/data/PageRangeDialog.ui.h:9 #, fuzzy msgid "Source page" msgstr "Kaynak" #: ../gtk/data/MainWindow.ui.h:56 ../qt/src/SourceManager.cc:146 msgid "Protected PDF" msgstr "" #: ../gtk/data/MainWindow.ui.h:57 ../qt/src/Recognizer.cc:76 msgid "Current Page" msgstr "Geçerli Sayfa" #: ../gtk/data/MainWindow.ui.h:58 ../qt/src/Recognizer.cc:79 msgid "Multiple Pages..." msgstr "Çoklu Sayfalar..." #: ../gtk/data/OutputEditorHOCR.ui.h:1 ../qt/src/hocr/OutputEditorHOCR.cc:580 msgid "Add Word" msgstr "" #: ../gtk/data/OutputEditorHOCR.ui.h:4 ../qt/src/hocr/OutputEditorHOCR.cc:580 #, fuzzy msgid "Enter word:" msgstr "Kelimeyi yoksay" #: ../gtk/data/OutputEditorHOCR.ui.h:5 ../qt/src/hocr/Ui_OutputEditorHOCR.hh:61 #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:62 #, fuzzy msgid "Export to plain text" msgstr "PDF olarak dışa aktar" #: ../gtk/data/OutputEditorHOCR.ui.h:6 ../qt/src/hocr/Ui_OutputEditorHOCR.hh:64 #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:65 msgid "Export to PDF" msgstr "PDF olarak dışa aktar" #: ../gtk/data/OutputEditorHOCR.ui.h:7 ../qt/src/hocr/Ui_OutputEditorHOCR.hh:67 #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:68 #, fuzzy msgid "Export to ODT" msgstr "PDF olarak dışa aktar" #: ../gtk/data/OutputEditorHOCR.ui.h:8 ../gtk/data/OutputEditorText.ui.h:18 #: ../qt/src/Ui_OutputEditorText.hh:116 msgid "Save output" msgstr "Çıktıyı kaydet" #: ../gtk/data/OutputEditorHOCR.ui.h:9 ../qt/src/hocr/Ui_OutputEditorHOCR.hh:72 #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:73 #, fuzzy msgid "Export" msgstr "PDF Olarak Dışa Aktar" #: ../gtk/data/OutputEditorHOCR.ui.h:10 ../gtk/data/OutputEditorText.ui.h:19 #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:77 #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:78 #: ../qt/src/Ui_OutputEditorText.hh:118 msgid "Clear output" msgstr "Çıktıyı temizle" #: ../gtk/data/OutputEditorHOCR.ui.h:11 ../gtk/data/OutputEditorText.ui.h:15 #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:80 #: ../qt/src/Ui_OutputEditorText.hh:107 msgid "Find and replace" msgstr "Bul ve değiştir" #: ../gtk/data/OutputEditorHOCR.ui.h:12 #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:82 #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:83 msgid "Show confidence values" msgstr "" #: ../gtk/data/OutputEditorHOCR.ui.h:13 ../gtk/data/PdfExportDialog.ui.h:41 #: ../qt/data/PdfExportDialog.ui.h:2 ../qt/src/hocr/Ui_OutputEditorHOCR.hh:85 #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:86 msgid "Show preview" msgstr "Ön izlemeyi göster" #: ../gtk/data/OutputEditorHOCR.ui.h:14 #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:121 msgid "Next (F3)" msgstr "" #: ../gtk/data/OutputEditorHOCR.ui.h:15 #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:122 msgid "Previous (Shift+F3)" msgstr "" #: ../gtk/data/OutputEditorHOCR.ui.h:16 ../gtk/src/hocr/OutputEditorHOCR.cc:890 #: ../qt/src/hocr/OutputEditorHOCR.cc:730 #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:126 msgid "Expand all" msgstr "Genişlet" #: ../gtk/data/OutputEditorHOCR.ui.h:17 ../gtk/src/hocr/OutputEditorHOCR.cc:893 #: ../qt/src/hocr/OutputEditorHOCR.cc:731 #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:127 msgid "Collapse all" msgstr "Daralt" #: ../gtk/data/OutputEditorHOCR.ui.h:18 #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:148 msgid "Properties" msgstr "Özellikler" #: ../gtk/data/OutputEditorHOCR.ui.h:19 #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:152 msgid "Source" msgstr "Kaynak" #. Output insert mode #: ../gtk/data/OutputEditorText.ui.h:1 ../qt/src/Ui_OutputEditorText.hh:52 msgid "Append to current text" msgstr "Mevcut metne ekle" #: ../gtk/data/OutputEditorText.ui.h:2 ../qt/src/Ui_OutputEditorText.hh:53 msgid "Insert at cursor" msgstr "İmleç konumuna ekle" #: ../gtk/data/OutputEditorText.ui.h:3 ../qt/src/Ui_OutputEditorText.hh:54 msgid "Replace current text" msgstr "Mevcut metni değiştir" #. Output postprocessing #: ../gtk/data/OutputEditorText.ui.h:4 ../qt/src/Ui_OutputEditorText.hh:62 msgid "Keep line break if..." msgstr "Satır sonlarını koru..." #: ../gtk/data/OutputEditorText.ui.h:5 ../qt/src/Ui_OutputEditorText.hh:64 msgid "Preceded by end mark (.?!)" msgstr "Nokta öncesinde gelen (.?!)" #: ../gtk/data/OutputEditorText.ui.h:6 ../qt/src/Ui_OutputEditorText.hh:66 msgid "Preceded or succeeded by quote" msgstr "Tırnak işareti öncesi veya sonrasında ise" #: ../gtk/data/OutputEditorText.ui.h:7 ../qt/src/Ui_OutputEditorText.hh:68 msgid "Other options" msgstr "Diğer seçenekler" #: ../gtk/data/OutputEditorText.ui.h:8 ../qt/src/Ui_OutputEditorText.hh:70 msgid "Join hyphenated words" msgstr "Tire ile ayrılmış kelimeleri birleştir" #: ../gtk/data/OutputEditorText.ui.h:9 ../qt/src/Ui_OutputEditorText.hh:72 msgid "Collapse whitespace" msgstr "Boşlukları daralt" #: ../gtk/data/OutputEditorText.ui.h:10 ../qt/src/Ui_OutputEditorText.hh:74 msgid "Preserve paragraphs" msgstr "Paragrafları koru" #: ../gtk/data/OutputEditorText.ui.h:11 ../qt/src/Ui_OutputEditorText.hh:76 msgid "Visual aids" msgstr "Görsel yardım" #: ../gtk/data/OutputEditorText.ui.h:12 ../qt/src/Ui_OutputEditorText.hh:78 msgid "Draw whitespace" msgstr "Boşluk çiz" #: ../gtk/data/OutputEditorText.ui.h:14 ../qt/src/Ui_OutputEditorText.hh:102 msgid "Strip line breaks on selected text" msgstr "Seçili metinden satır sonlarını çıkart" #: ../gtk/data/OutputEditorText.ui.h:16 ../qt/src/Ui_OutputEditorText.hh:109 #: ../qt/src/Ui_OutputEditorText.hh:110 msgid "Undo" msgstr "Geri al" #: ../gtk/data/OutputEditorText.ui.h:17 ../qt/src/Ui_OutputEditorText.hh:112 #: ../qt/src/Ui_OutputEditorText.hh:113 msgid "Redo" msgstr "Yeniden yap" #: ../gtk/data/PdfExportDialog.ui.h:1 ../qt/data/PdfExportDialog.ui.h:1 msgid "PDF Export" msgstr "PDF Olarak Dışa Aktar" #: ../gtk/data/PdfExportDialog.ui.h:4 ../qt/data/PdfExportDialog.ui.h:4 msgid "Output mode:" msgstr "Çıktı kipi:" #: ../gtk/data/PdfExportDialog.ui.h:5 ../qt/data/PdfExportDialog.ui.h:6 msgid "PDF" msgstr "PDF" #: ../gtk/data/PdfExportDialog.ui.h:6 ../qt/data/PdfExportDialog.ui.h:7 msgid "PDF with invisible text overlay" msgstr "Görünmeyen metinlerle birlikte PDF" #: ../gtk/data/PdfExportDialog.ui.h:7 ../qt/data/PdfExportDialog.ui.h:16 msgid "Format:" msgstr "Biçim:" #: ../gtk/data/PdfExportDialog.ui.h:8 ../qt/data/PdfExportDialog.ui.h:17 msgid "Compression:" msgstr "Sıkıştırma:" #: ../gtk/data/PdfExportDialog.ui.h:9 ../qt/data/PdfExportDialog.ui.h:14 msgid "Compression quality:" msgstr "Sıkıştırma kalitesi:" #: ../gtk/data/PdfExportDialog.ui.h:10 ../qt/data/PdfExportDialog.ui.h:15 msgid "DPI:" msgstr "DPI:" #: ../gtk/data/PdfExportDialog.ui.h:11 ../qt/data/PdfExportDialog.ui.h:18 msgid "Dithering algorithm:" msgstr "Dithering algoritması:" #: ../gtk/data/PdfExportDialog.ui.h:12 ../qt/data/PdfExportDialog.ui.h:13 msgid "Image settings:" msgstr "Resim ayarları:" #: ../gtk/data/PdfExportDialog.ui.h:13 ../qt/data/PdfExportDialog.ui.h:25 msgid "Uniformize line and word spacing" msgstr "Satır ve kelime aralıklarını düzleştir" #: ../gtk/data/PdfExportDialog.ui.h:14 ../qt/data/PdfExportDialog.ui.h:21 msgid "Override font family:" msgstr "" #: ../gtk/data/PdfExportDialog.ui.h:15 ../qt/data/PdfExportDialog.ui.h:27 msgid "Fallback font family:" msgstr "" #: ../gtk/data/PdfExportDialog.ui.h:16 ../qt/data/PdfExportDialog.ui.h:20 #, fuzzy msgid "Override font size:" msgstr "Algılanan yazı tipi boyutunu kullan" #: ../gtk/data/PdfExportDialog.ui.h:17 ../qt/data/PdfExportDialog.ui.h:23 msgid "Font scaling:" msgstr "" #: ../gtk/data/PdfExportDialog.ui.h:18 ../qt/data/PdfExportDialog.ui.h:26 msgid "pt" msgstr "" #: ../gtk/data/PdfExportDialog.ui.h:19 ../qt/data/PdfExportDialog.ui.h:22 msgid "Preserve spaces wider than:" msgstr "BUndan geniş aralıkları koru:" #: ../gtk/data/PdfExportDialog.ui.h:20 ../qt/data/PdfExportDialog.ui.h:24 msgid "characters" msgstr "Karakterler" #: ../gtk/data/PdfExportDialog.ui.h:21 ../qt/data/PdfExportDialog.ui.h:28 msgid "Sanitize hyphens before line breaks" msgstr "" #: ../gtk/data/PdfExportDialog.ui.h:22 ../qt/data/PdfExportDialog.ui.h:19 msgid "Text settings:" msgstr "Metin ayarları:" #: ../gtk/data/PdfExportDialog.ui.h:23 ../qt/data/PdfExportDialog.ui.h:10 msgid "Paper size:" msgstr "" #: ../gtk/data/PdfExportDialog.ui.h:24 ../qt/data/PdfExportDialog.ui.h:11 msgid "Width" msgstr "" #: ../gtk/data/PdfExportDialog.ui.h:25 ../qt/data/PdfExportDialog.ui.h:12 msgid "Height" msgstr "" #: ../gtk/data/PdfExportDialog.ui.h:26 ../qt/data/PdfExportDialog.ui.h:29 msgid "Treat image sources as having true DPI:" msgstr "" #: ../gtk/data/PdfExportDialog.ui.h:27 ../qt/data/PdfExportDialog.ui.h:3 msgid "Basic" msgstr "" #: ../gtk/data/PdfExportDialog.ui.h:28 ../qt/data/PdfExportDialog.ui.h:31 #, fuzzy msgid "PDF version:" msgstr "Yeni sürüm" #: ../gtk/data/PdfExportDialog.ui.h:29 ../qt/data/PdfExportDialog.ui.h:33 msgid "Password:" msgstr "" #: ../gtk/data/PdfExportDialog.ui.h:30 ../qt/data/PdfExportDialog.ui.h:34 msgid "Confirm password:" msgstr "" #: ../gtk/data/PdfExportDialog.ui.h:31 ../qt/data/PdfExportDialog.ui.h:32 msgid "Encryption (optional):" msgstr "" #: ../gtk/data/PdfExportDialog.ui.h:32 ../qt/data/PdfExportDialog.ui.h:36 msgid "Author:" msgstr "" #: ../gtk/data/PdfExportDialog.ui.h:33 ../qt/data/PdfExportDialog.ui.h:38 msgid "Title:" msgstr "" #: ../gtk/data/PdfExportDialog.ui.h:34 ../qt/data/PdfExportDialog.ui.h:40 msgid "Subject:" msgstr "" #: ../gtk/data/PdfExportDialog.ui.h:35 ../qt/data/PdfExportDialog.ui.h:37 msgid "Creator:" msgstr "" #: ../gtk/data/PdfExportDialog.ui.h:36 ../qt/data/PdfExportDialog.ui.h:39 msgid "Producer:" msgstr "" #: ../gtk/data/PdfExportDialog.ui.h:37 ../qt/data/PdfExportDialog.ui.h:41 msgid "Keywords:" msgstr "" #: ../gtk/data/PdfExportDialog.ui.h:38 ../qt/data/PdfExportDialog.ui.h:35 #, fuzzy msgid "Additional information (optional):" msgstr "Ek dil tanımlamaları:" #: ../gtk/data/PdfExportDialog.ui.h:39 ../qt/data/PdfExportDialog.ui.h:42 msgid "Import from current source" msgstr "" #: ../gtk/data/PdfExportDialog.ui.h:40 ../qt/data/PdfExportDialog.ui.h:30 msgid "Advanced" msgstr "" #: ../gtk/data/SearchReplaceFrame.ui.h:1 ../qt/data/SearchReplaceFrame.ui.h:4 msgid "Find" msgstr "Bul" #: ../gtk/data/SearchReplaceFrame.ui.h:2 ../qt/data/SearchReplaceFrame.ui.h:2 msgid "Replace" msgstr "Değiştir" #: ../gtk/data/SearchReplaceFrame.ui.h:3 ../qt/data/SearchReplaceFrame.ui.h:3 msgid "Replace all" msgstr "Tümünü değiştir" #: ../gtk/data/SearchReplaceFrame.ui.h:4 ../qt/data/SearchReplaceFrame.ui.h:5 msgid "Find previous" msgstr "Öncekini bul" #: ../gtk/data/SearchReplaceFrame.ui.h:5 ../qt/data/SearchReplaceFrame.ui.h:6 msgid "Find next" msgstr "Sonrakini bul" #: ../gtk/data/SearchReplaceFrame.ui.h:6 ../qt/data/SearchReplaceFrame.ui.h:7 msgid "Match case" msgstr "Büyük Küçük Harf eşleştir" #: ../gtk/data/SearchReplaceFrame.ui.h:7 #: ../gtk/data/SubstitutionsManager.ui.h:1 ../qt/data/SearchReplaceFrame.ui.h:1 #: ../qt/src/SubstitutionsManager.cc:36 msgid "Substitutions" msgstr "Yerine Koyma" #: ../gtk/data/SelectionMenu.ui.h:1 ../qt/src/DisplayerToolSelect.cc:239 msgid "Delete" msgstr "Sil" #: ../gtk/data/SelectionMenu.ui.h:2 ../qt/src/DisplayerToolSelect.cc:225 msgid "Order:" msgstr "Sıralama:" #: ../gtk/data/SelectionMenu.ui.h:3 ../gtk/src/hocr/DisplayerToolHOCR.cc:29 #: ../qt/src/DisplayerToolSelect.cc:240 ../qt/src/hocr/DisplayerToolHOCR.cc:31 msgid "Recognize" msgstr "Tanı" #: ../gtk/data/SelectionMenu.ui.h:4 ../qt/src/DisplayerToolSelect.cc:241 msgid "Recognize to clipboard" msgstr "Taşıma panosuna tanıt" #: ../gtk/data/SelectionMenu.ui.h:5 ../qt/src/DisplayerToolSelect.cc:242 msgid "Save as image" msgstr "Resim olarak kaydet" #: ../gtk/data/SubstitutionsManager.ui.h:2 ../qt/src/SubstitutionsManager.cc:38 #: ../qt/src/SubstitutionsManager.cc:39 msgid "Open" msgstr "Aç" #: ../gtk/data/SubstitutionsManager.ui.h:3 ../gtk/src/Utils.cc:73 #: ../qt/src/SubstitutionsManager.cc:41 ../qt/src/SubstitutionsManager.cc:42 msgid "Save" msgstr "Kaydet" #: ../gtk/data/SubstitutionsManager.ui.h:4 ../qt/src/SubstitutionsManager.cc:44 #: ../qt/src/SubstitutionsManager.cc:45 msgid "Clear" msgstr "Temizle" #: ../gtk/data/SubstitutionsManager.ui.h:5 ../qt/data/ConfigDialog.ui.h:16 #: ../qt/src/SubstitutionsManager.cc:47 ../qt/src/SubstitutionsManager.cc:48 msgid "Add" msgstr "Ekle" #: ../gtk/data/SubstitutionsManager.ui.h:6 #: ../gtk/src/hocr/OutputEditorHOCR.cc:886 ../qt/data/ConfigDialog.ui.h:17 #: ../qt/src/hocr/OutputEditorHOCR.cc:727 ../qt/src/SubstitutionsManager.cc:50 #: ../qt/src/SubstitutionsManager.cc:51 msgid "Remove" msgstr "Çıkar" #: ../gtk/data/SubstitutionsManager.ui.h:7 ../gtk/data/TessdataManager.ui.h:2 msgid "Apply" msgstr "Uygula" #: ../gtk/data/SubstitutionsManager.ui.h:8 ../gtk/data/TessdataManager.ui.h:3 msgid "Close" msgstr "Kapat" #: ../gtk/data/TessdataManager.ui.h:1 ../qt/src/TessdataManager.cc:49 msgid "Tessdata Manager" msgstr "Tessdata Yöneticisi" #: ../gtk/data/TessdataManager.ui.h:5 ../qt/src/TessdataManager.cc:51 msgid "Manage installed languages:" msgstr "Kurulan Dilleri Yönet" #: ../gtk/src/Acquirer.cc:79 ../qt/src/Acquirer.cc:70 msgid "scan.png" msgstr "tarama.png" #: ../gtk/src/Acquirer.cc:91 ../qt/src/Acquirer.cc:85 msgid "Images" msgstr "Resimler" #: ../gtk/src/Acquirer.cc:92 ../qt/src/Acquirer.cc:86 msgid "Choose Output Filename..." msgstr "Çıktı Dosya Adını Seçin..." #: ../gtk/src/Acquirer.cc:106 ../qt/src/Acquirer.cc:100 msgid "Failed to initialize the scanning backend." msgstr "Tarama uygulaması başlatılamadı." #: ../gtk/src/Acquirer.cc:115 ../qt/src/Acquirer.cc:106 msgid "Scan failed" msgstr "Tarama başarısız oldu" #: ../gtk/src/Acquirer.cc:133 ../qt/src/Acquirer.cc:122 msgid "No scanners were detected." msgstr "Hiç tarayıcı bulunamadı." #: ../gtk/src/Acquirer.cc:150 ../gtk/src/Acquirer.cc:168 #: ../qt/src/Acquirer.cc:136 ../qt/src/Acquirer.cc:154 msgid "Starting scan..." msgstr "Tarama başlatılıyor..." #: ../gtk/src/Acquirer.cc:164 ../qt/src/Acquirer.cc:150 msgid "Opening device..." msgstr "Aygıt açılıyor..." #: ../gtk/src/Acquirer.cc:166 ../qt/src/Acquirer.cc:152 msgid "Setting options..." msgstr "Seçenekler ayarlanıyor..." #: ../gtk/src/Acquirer.cc:170 ../qt/src/Acquirer.cc:156 msgid "Getting parameters..." msgstr "Parametreler alınıyor..." #: ../gtk/src/Acquirer.cc:172 ../qt/src/Acquirer.cc:158 msgid "Transferring data..." msgstr "Veri aktarılıyor..." #: ../gtk/src/Acquirer.cc:179 ../qt/src/Acquirer.cc:165 msgid "Canceling scan..." msgstr "Tarama iptal ediliyor..." #: ../gtk/src/Config.cc:49 ../qt/data/ConfigDialog.ui.h:7 msgid "Filename prefix" msgstr "Dosya adı ön eki" #: ../gtk/src/Config.cc:50 ../qt/data/ConfigDialog.ui.h:8 msgid "Code" msgstr "Kod" #: ../gtk/src/Config.cc:51 ../qt/data/ConfigDialog.ui.h:9 msgid "Native name" msgstr "Doğal isim" #: ../gtk/src/Config.cc:109 ../qt/src/Config.cc:108 msgid "Script" msgstr "" #: ../gtk/src/CrashHandler.cc:25 ../gtk/src/CrashHandler.cc:41 #: ../qt/src/CrashHandler.cc:36 msgid "Crash Handler" msgstr "Çökme İşleyici" #: ../gtk/src/CrashHandler.cc:43 ../qt/src/CrashHandler.cc:31 msgid "Your work has been saved under %1." msgstr "Çalışmanız %1 altına kaydedildi." #: ../gtk/src/CrashHandler.cc:45 ../qt/src/CrashHandler.cc:33 msgid "There was no unsaved work." msgstr "Kaydedilmemiş çalışma yok." #: ../gtk/src/CrashHandler.cc:106 ../qt/src/CrashHandler.cc:62 msgid "Failed to obtain backtrace. Is gdb installed?" msgstr "Geri dönük izleme yapılamadı. gdb kurulu mu?" #: ../gtk/src/Displayer.cc:232 ../qt/src/Displayer.cc:174 msgid "Failed to load image" msgstr "Resim yüklenemedi" #: ../gtk/src/Displayer.cc:232 ../qt/src/Displayer.cc:174 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:138 ../qt/src/DisplayerToolSelect.cc:135 msgid "PNG Images" msgstr "PNG Resimleri" #: ../gtk/src/DisplayerToolSelect.cc:139 ../qt/src/DisplayerToolSelect.cc:135 msgid "Save Selection Image" msgstr "Seçim Resmini Kaydet" #: ../gtk/src/DisplayerToolSelect.cc:139 ../qt/src/DisplayerToolSelect.cc:135 msgid "selection.png" msgstr "secim.png" #: ../gtk/src/DisplayerToolSelect.cc:146 ../qt/src/DisplayerToolSelect.cc:142 msgid "Recognize all" msgstr "Tümünü tanı" #: ../gtk/src/DisplayerToolSelect.cc:146 ../qt/src/DisplayerToolSelect.cc:142 msgid "Recognize selection" msgstr "Seçimi tanı" #: ../gtk/src/DisplayerToolSelect.cc:186 ../qt/src/DisplayerToolSelect.cc:182 msgid "Performing layout analysis" msgstr "Yerleşim çözümlemesi yapılıyor" #: ../gtk/src/FileDialogs.cc:235 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:237 msgid "Overwrite File?" msgstr "Dosyanın Üstüne Yazılsın mı?" #: ../gtk/src/hocr/HOCRDocument.cc:611 ../gtk/src/hocr/OutputEditorHOCR.cc:266 #: ../qt/src/hocr/OutputEditorHOCR.cc:229 #, fuzzy msgid "Page" msgstr "İşleme hatası: %1" #: ../gtk/src/hocr/HOCRDocument.cc:613 ../qt/src/hocr/HOCRDocument.cc:530 #, fuzzy msgid "Text block" msgstr "Metin Dosyaları" #: ../gtk/src/hocr/HOCRDocument.cc:615 ../gtk/src/hocr/OutputEditorHOCR.cc:272 #: ../qt/src/hocr/HOCRDocument.cc:532 ../qt/src/hocr/OutputEditorHOCR.cc:231 msgid "Paragraph" msgstr "Paragraf" #: ../gtk/src/hocr/HOCRDocument.cc:617 ../qt/src/hocr/HOCRDocument.cc:534 msgid "Textline" msgstr "Metin" #: ../gtk/src/hocr/HOCRDocument.cc:621 ../qt/src/hocr/HOCRDocument.cc:538 msgid "Graphic" msgstr "Grafik" #: ../gtk/src/hocr/HOCROdtExporter.cc:65 ../gtk/src/hocr/HOCRPdfExporter.cc:489 #: ../gtk/src/hocr/HOCRTextExporter.cc:34 #: ../gtk/src/hocr/OutputEditorHOCR.cc:963 ../gtk/src/OutputEditorText.cc:272 #: ../qt/src/hocr/HOCROdtExporter.cc:50 ../qt/src/hocr/HOCRPdfExporter.cc:478 #: ../qt/src/hocr/HOCRTextExporter.cc:36 ../qt/src/hocr/OutputEditorHOCR.cc:830 #: ../qt/src/OutputEditorText.cc:238 msgid "output" msgstr "çıktı" #: ../gtk/src/hocr/HOCROdtExporter.cc:68 ../qt/src/hocr/HOCROdtExporter.cc:53 msgid "OpenDocument Text Documents" msgstr "" #: ../gtk/src/hocr/HOCROdtExporter.cc:69 ../qt/src/hocr/HOCROdtExporter.cc:53 #, fuzzy msgid "Save ODT Output..." msgstr "PDF Çıktısını Kaydet..." #: ../gtk/src/hocr/HOCROdtExporter.cc:77 ../gtk/src/hocr/HOCROdtExporter.cc:342 #: ../gtk/src/hocr/HOCRPdfExporter.cc:619 #: ../gtk/src/hocr/HOCRTextExporter.cc:46 ../qt/src/hocr/HOCROdtExporter.cc:61 #: ../qt/src/hocr/HOCRPdfExporter.cc:609 ../qt/src/hocr/HOCRTextExporter.cc:47 msgid "Export failed" msgstr "" #: ../gtk/src/hocr/HOCROdtExporter.cc:77 ../gtk/src/hocr/HOCROdtExporter.cc:342 #: ../qt/src/hocr/HOCROdtExporter.cc:61 msgid "The ODT export failed: unable to write output file." msgstr "" #: ../gtk/src/hocr/HOCROdtExporter.cc:336 ../qt/src/hocr/HOCROdtExporter.cc:254 #, fuzzy msgid "Exporting to ODT..." msgstr "PDF olarak dışa aktar" #: ../gtk/src/hocr/HOCRPdfExporter.cc:283 ../qt/src/hocr/HOCRPdfExporter.cc:365 #, fuzzy msgid "Same as source" msgstr "Kaynak" #: ../gtk/src/hocr/HOCRPdfExporter.cc:286 ../qt/src/hocr/HOCRPdfExporter.cc:366 msgid "Custom" msgstr "" #: ../gtk/src/hocr/HOCRPdfExporter.cc:300 ../qt/src/hocr/HOCRPdfExporter.cc:362 msgid "cm" msgstr "" #: ../gtk/src/hocr/HOCRPdfExporter.cc:303 ../qt/src/hocr/HOCRPdfExporter.cc:363 #, fuzzy msgid "in" msgstr "Bul" #: ../gtk/src/hocr/HOCRPdfExporter.cc:319 ../qt/src/hocr/HOCRPdfExporter.cc:353 msgid "Monochrome" msgstr "Siyah beyaz" #: ../gtk/src/hocr/HOCRPdfExporter.cc:328 ../qt/src/hocr/HOCRPdfExporter.cc:355 msgid "Threshold (closest color)" msgstr "Eşik (en yakın renk)" #: ../gtk/src/hocr/HOCRPdfExporter.cc:331 ../qt/src/hocr/HOCRPdfExporter.cc:356 msgid "Diffuse" msgstr "Yayılmış" #: ../gtk/src/hocr/HOCRPdfExporter.cc:340 ../qt/src/hocr/HOCRPdfExporter.cc:357 msgid "Zip (lossless)" msgstr "Zip (kayıpsız)" #: ../gtk/src/hocr/HOCRPdfExporter.cc:344 ../qt/src/hocr/HOCRPdfExporter.cc:358 msgid "CCITT Group 4 (lossless)" msgstr "CCITT Grup 4 (kayıpsız)" #: ../gtk/src/hocr/HOCRPdfExporter.cc:348 ../qt/src/hocr/HOCRPdfExporter.cc:359 msgid "Jpeg (lossy)" msgstr "Jpeg (kayıplı)" #: ../gtk/src/hocr/HOCRPdfExporter.cc:493 ../qt/src/hocr/HOCRPdfExporter.cc:482 msgid "PDF Files" msgstr "PDF Dosyaları" #: ../gtk/src/hocr/HOCRPdfExporter.cc:494 ../qt/src/hocr/HOCRPdfExporter.cc:482 msgid "Save PDF Output..." msgstr "PDF Çıktısını Kaydet..." #: ../gtk/src/hocr/HOCRPdfExporter.cc:500 ../qt/src/hocr/HOCRPdfExporter.cc:488 #, fuzzy msgid "Invalid Output" msgstr "Çıktıyı Kaydet" #: ../gtk/src/hocr/HOCRPdfExporter.cc:500 ../qt/src/hocr/HOCRPdfExporter.cc:488 msgid "Cannot overwrite a file which is a source image of this document." msgstr "" #: ../gtk/src/hocr/HOCRPdfExporter.cc:516 ../qt/src/hocr/HOCRPdfExporter.cc:511 #, fuzzy msgid "Failed to create output" msgstr "Çıktının kaydedilmesi başarısız oldu" #: ../gtk/src/hocr/HOCRPdfExporter.cc:516 ../qt/src/hocr/HOCRPdfExporter.cc:511 msgid "Failed to create output. The returned error was: %1" msgstr "" #: ../gtk/src/hocr/HOCRPdfExporter.cc:558 ../qt/src/hocr/HOCRPdfExporter.cc:551 msgid "The operation was cancelled" msgstr "" #: ../gtk/src/hocr/HOCRPdfExporter.cc:607 ../qt/src/hocr/HOCRPdfExporter.cc:597 #, fuzzy msgid "Failed to render page %1" msgstr "" "\n" "[Sayfanın tanınması başarısız oldu %1]\n" #: ../gtk/src/hocr/HOCRPdfExporter.cc:614 ../qt/src/hocr/HOCRPdfExporter.cc:604 #, fuzzy msgid "Exporting to PDF..." msgstr "PDF olarak dışa aktar" #: ../gtk/src/hocr/HOCRPdfExporter.cc:619 ../qt/src/hocr/HOCRPdfExporter.cc:609 msgid "The PDF export failed: %1." msgstr "" #: ../gtk/src/hocr/HOCRPdfExporter.cc:673 ../qt/src/hocr/HOCRPdfExporter.cc:662 #, fuzzy msgid "The PDF library could not load the font '%1'." msgstr "PDF kitaplığı seçilen yazı tipini desteklemiyor." #: ../gtk/src/hocr/HOCRTextExporter.cc:37 ../gtk/src/OutputEditorText.cc:274 #: ../qt/src/hocr/HOCRTextExporter.cc:39 ../qt/src/OutputEditorText.cc:239 msgid "Text Files" msgstr "Metin Dosyaları" #: ../gtk/src/hocr/HOCRTextExporter.cc:38 ../qt/src/hocr/HOCRTextExporter.cc:39 #, fuzzy msgid "Save Text Output..." msgstr "Çıktıyı Kaydet..." #: ../gtk/src/hocr/HOCRTextExporter.cc:46 ../qt/src/hocr/HOCRTextExporter.cc:47 msgid "The text export failed: unable to write output file." msgstr "" #: ../gtk/src/hocr/OutputEditorHOCR.cc:269 #: ../qt/src/hocr/OutputEditorHOCR.cc:230 msgid "Block" msgstr "" #: ../gtk/src/hocr/OutputEditorHOCR.cc:275 #: ../qt/src/hocr/OutputEditorHOCR.cc:232 msgid "Line" msgstr "" #: ../gtk/src/hocr/OutputEditorHOCR.cc:278 #: ../qt/src/hocr/OutputEditorHOCR.cc:233 msgid "Word" msgstr "" #: ../gtk/src/hocr/OutputEditorHOCR.cc:281 #: ../qt/src/hocr/OutputEditorHOCR.cc:234 msgid "Misspelled word" msgstr "" #: ../gtk/src/hocr/OutputEditorHOCR.cc:435 #: ../qt/src/hocr/OutputEditorHOCR.cc:317 msgid "" "The following pages could not be processed:\n" "%1" msgstr "" "Aşağıdaki sayfalar işlenemedi:\n" "%1" #: ../gtk/src/hocr/OutputEditorHOCR.cc:436 #: ../qt/src/hocr/OutputEditorHOCR.cc:318 msgid "Recognition errors" msgstr "Tanıma hataları" #: ../gtk/src/hocr/OutputEditorHOCR.cc:594 #: ../qt/src/hocr/OutputEditorHOCR.cc:500 #: ../qt/src/hocr/OutputEditorHOCR.cc:512 #, fuzzy msgid "Multiple values" msgstr "Çoklu kaynak" #. Merging allowed #: ../gtk/src/hocr/OutputEditorHOCR.cc:778 #: ../qt/src/hocr/OutputEditorHOCR.cc:641 msgid "Merge" msgstr "Birleştir" #: ../gtk/src/hocr/OutputEditorHOCR.cc:786 #: ../gtk/src/hocr/OutputEditorHOCR.cc:877 #: ../qt/src/hocr/OutputEditorHOCR.cc:643 #: ../qt/src/hocr/OutputEditorHOCR.cc:725 msgid "Split from parent" msgstr "" #. Swapping allowed #: ../gtk/src/hocr/OutputEditorHOCR.cc:797 #: ../qt/src/hocr/OutputEditorHOCR.cc:647 msgid "Swap" msgstr "" #: ../gtk/src/hocr/OutputEditorHOCR.cc:821 #: ../qt/src/hocr/OutputEditorHOCR.cc:693 msgid "Add graphic region" msgstr "Grafik alanı ekle" #: ../gtk/src/hocr/OutputEditorHOCR.cc:824 #: ../qt/src/hocr/OutputEditorHOCR.cc:694 msgid "Add text block" msgstr "" #: ../gtk/src/hocr/OutputEditorHOCR.cc:828 #: ../qt/src/hocr/OutputEditorHOCR.cc:696 #, fuzzy msgid "Add paragraph" msgstr "Paragraf" #: ../gtk/src/hocr/OutputEditorHOCR.cc:832 #: ../qt/src/hocr/OutputEditorHOCR.cc:698 #, fuzzy msgid "Add line" msgstr "Resim ekle" #: ../gtk/src/hocr/OutputEditorHOCR.cc:836 #: ../qt/src/hocr/OutputEditorHOCR.cc:700 msgid "Add word" msgstr "" #: ../gtk/src/hocr/OutputEditorHOCR.cc:852 #: ../qt/src/hocr/OutputEditorHOCR.cc:710 msgid "No suggestions" msgstr "Öneri yok" #: ../gtk/src/hocr/OutputEditorHOCR.cc:858 #: ../qt/src/hocr/OutputEditorHOCR.cc:714 msgid "Add to dictionary" msgstr "Sözlük ekle" #: ../gtk/src/hocr/OutputEditorHOCR.cc:864 #: ../qt/src/hocr/OutputEditorHOCR.cc:716 msgid "Ignore word" msgstr "Kelimeyi yoksay" #: ../gtk/src/hocr/OutputEditorHOCR.cc:926 #: ../gtk/src/hocr/OutputEditorHOCR.cc:965 #: ../qt/src/hocr/OutputEditorHOCR.cc:795 #: ../qt/src/hocr/OutputEditorHOCR.cc:832 msgid "hOCR HTML Files" msgstr "hOCR HTML Dosyaları" #: ../gtk/src/hocr/OutputEditorHOCR.cc:927 #: ../qt/src/hocr/OutputEditorHOCR.cc:795 msgid "Open hOCR File" msgstr "hOCR Dosyasını Aç" #: ../gtk/src/hocr/OutputEditorHOCR.cc:936 #: ../qt/src/hocr/OutputEditorHOCR.cc:802 msgid "Failed to open file" msgstr "Dosya açılamadı" #: ../gtk/src/hocr/OutputEditorHOCR.cc:936 #: ../qt/src/hocr/OutputEditorHOCR.cc:802 msgid "The file could not be opened: %1." msgstr "Bu dosya açılamadı:%1" #: ../gtk/src/hocr/OutputEditorHOCR.cc:945 #: ../qt/src/hocr/OutputEditorHOCR.cc:809 msgid "Invalid hOCR file" msgstr "Geçersiz hOCR dosyası" #: ../gtk/src/hocr/OutputEditorHOCR.cc:945 #: ../qt/src/hocr/OutputEditorHOCR.cc:809 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/hocr/OutputEditorHOCR.cc:966 #: ../qt/src/hocr/OutputEditorHOCR.cc:832 msgid "Save hOCR Output..." msgstr "oOCR Çıktısını Kaydet..." #: ../gtk/src/hocr/OutputEditorHOCR.cc:973 ../gtk/src/OutputEditorText.cc:282 #: ../qt/src/hocr/OutputEditorHOCR.cc:839 ../qt/src/OutputEditorText.cc:246 msgid "Failed to save output" msgstr "Çıktının kaydedilmesi başarısız oldu" #: ../gtk/src/hocr/OutputEditorHOCR.cc:973 ../gtk/src/OutputEditorText.cc:282 #: ../qt/src/hocr/OutputEditorHOCR.cc:839 ../qt/src/OutputEditorText.cc:246 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/hocr/OutputEditorHOCR.cc:1035 ../gtk/src/OutputEditorText.cc:296 #: ../qt/src/hocr/OutputEditorHOCR.cc:894 ../qt/src/OutputEditorText.cc:259 msgid "Output not saved" msgstr "Çıktı kaydedilmedi" #: ../gtk/src/hocr/OutputEditorHOCR.cc:1035 ../gtk/src/OutputEditorText.cc:296 #: ../qt/src/hocr/OutputEditorHOCR.cc:894 ../qt/src/OutputEditorText.cc:259 msgid "Save output before proceeding?" msgstr "Devam etmeden çıktı kaydedilsin mi?" #: ../gtk/src/hocr/OutputEditorHOCR.cc:1156 ../gtk/src/OutputEditorText.cc:184 #: ../qt/src/hocr/OutputEditorHOCR.cc:991 ../qt/src/OutputEditorText.cc:152 msgid "Replacing..." msgstr "Değiştiriliyor..." #: ../gtk/src/hocr/OutputEditorHOCR.cc:1181 ../gtk/src/OutputEditorText.cc:192 #: ../qt/src/hocr/OutputEditorHOCR.cc:1014 ../qt/src/OutputEditorText.cc:160 msgid "Applying substitutions..." msgstr "Değişiklikler uygulanıyor..." #: ../gtk/src/MainWindow.cc:131 ../qt/src/MainWindow.cc:295 msgid "Using tesseract" msgstr "Tesseract'i kullanmak" #: ../gtk/src/MainWindow.cc:178 ../qt/src/MainWindow.cc:194 msgid "Select an image to begin..." msgstr "Başlamak için bir resim seçin..." #: ../gtk/src/MainWindow.cc:293 ../qt/src/MainWindow.cc:278 msgid "Multiple sources" msgstr "Çoklu kaynak" #: ../gtk/src/MainWindow.cc:295 ../qt/src/MainWindow.cc:280 msgid "Ready" msgstr "Hazır" #: ../gtk/src/MainWindow.cc:442 ../qt/src/MainWindow.cc:423 msgid "New version" msgstr "Yeni sürüm" #: ../gtk/src/MainWindow.cc:442 ../qt/src/MainWindow.cc:423 msgid "gImageReader %1 is available" msgstr "gImageReader %1 kullanılabilir durumda" #: ../gtk/src/MainWindow.cc:443 ../qt/src/MainWindow.cc:424 msgid "Download" msgstr "İndir" #: ../gtk/src/MainWindow.cc:444 ../qt/src/MainWindow.cc:425 msgid "Changelog" msgstr "Değişim günlüğü" #: ../gtk/src/MainWindow.cc:445 ../qt/src/MainWindow.cc:426 msgid "Don't notify again" msgstr "Tekrar uyarma" #: ../gtk/src/MainWindow.cc:466 ../qt/src/MainWindow.cc:474 msgid "Don't show again" msgstr "Tekrar gösterme" #: ../gtk/src/MainWindow.cc:467 ../gtk/src/MainWindow.cc:480 #: ../qt/src/MainWindow.cc:475 msgid "Install" msgstr "Kur" #: ../gtk/src/MainWindow.cc:487 ../qt/src/MainWindow.cc:487 msgid "Spelling dictionary missing" msgstr "Yazım denetimi sözlüğü eksik" #: ../gtk/src/MainWindow.cc:487 ../qt/src/MainWindow.cc:487 msgid "The spellcheck dictionary for %1 is not installed" msgstr "%1 için yazım denetimi sözlüğü kurulmadı" #: ../gtk/src/MainWindow.cc:494 ../gtk/src/MainWindow.cc:523 #: ../qt/src/MainWindow.cc:493 msgid "Installing spelling dictionary for '%1'" msgstr "'%1' için yazım denetimi sözlüğü kuruluyor" #: ../gtk/src/MainWindow.cc:515 ../gtk/src/MainWindow.cc:536 #: ../gtk/src/MainWindow.cc:544 ../gtk/src/MainWindow.cc:592 #: ../gtk/src/MainWindow.cc:597 ../gtk/src/TessdataManager.cc:60 #: ../gtk/src/TessdataManager.cc:70 ../gtk/src/TessdataManager.cc:339 #: ../qt/src/MainWindow.cc:512 ../qt/src/MainWindow.cc:525 #: ../qt/src/MainWindow.cc:534 ../qt/src/MainWindow.cc:578 #: ../qt/src/MainWindow.cc:583 ../qt/src/TessdataManager.cc:74 #: ../qt/src/TessdataManager.cc:84 ../qt/src/TessdataManager.cc:315 msgid "Error" msgstr "Hata" #: ../gtk/src/MainWindow.cc:515 ../qt/src/MainWindow.cc:512 msgid "Failed to install spelling dictionary: %1" msgstr "Yazım denetimi sözlüğü kurulamadı: %1" #: ../gtk/src/MainWindow.cc:536 ../qt/src/MainWindow.cc:525 msgid "Failed to create directory for spelling dictionaries." msgstr "Yazım denetimi sözlüğü kurulamadı." #: ../gtk/src/MainWindow.cc:544 ../qt/src/MainWindow.cc:534 msgid "Could not read %1: %2." msgstr "%1 okunamadı: %2" #: ../gtk/src/MainWindow.cc:571 ../qt/src/MainWindow.cc:558 msgid "Downloading '%1'..." msgstr "'%1' indiriliyor..." #: ../gtk/src/MainWindow.cc:592 ../qt/src/MainWindow.cc:578 msgid "" "The following dictionaries could not be downloaded:\n" "%1\n" "\n" "Check the connectivity and directory permissions.\n" "Hint: If you don't have write permissions in system folders, you can switch " "to user paths in the settings dialog." msgstr "" #: ../gtk/src/MainWindow.cc:595 ../qt/src/MainWindow.cc:581 msgid "Dictionaries installed" msgstr "Sözlükler kuruldu" #: ../gtk/src/MainWindow.cc:595 #, fuzzy msgid "" "The following dictionaries were installed:\n" "%1" msgstr "Kurulan sözlükler: %1" #: ../gtk/src/MainWindow.cc:597 ../qt/src/MainWindow.cc:583 msgid "No spelling dictionaries found for '%1'." msgstr "'%1' için yazım denetimi sözlüğü bulunamadı." #: ../gtk/src/OutputEditorText.cc:154 ../qt/src/OutputEditorText.cc:137 msgid "Stripping line breaks..." msgstr "Satır sonları çıkartılıyor..." #: ../gtk/src/OutputEditorText.cc:162 msgid "Check spelling" msgstr "Yazım denetimi yap" #: ../gtk/src/OutputEditorText.cc:231 ../qt/src/OutputEditorText.cc:196 #, fuzzy msgid "File: %1" msgstr "Dosyalar" #: ../gtk/src/OutputEditorText.cc:234 ../qt/src/OutputEditorText.cc:199 #, fuzzy msgid "Page: %1" msgstr "İşleme hatası: %1" #: ../gtk/src/OutputEditorText.cc:247 ../gtk/src/Recognizer.cc:471 #: ../qt/src/Recognizer.cc:462 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:275 ../qt/src/OutputEditorText.cc:239 msgid "Save Output..." msgstr "Çıktıyı Kaydet..." #: ../gtk/src/Recognizer.cc:179 ../qt/src/Recognizer.cc:172 msgid "No languages available" msgstr "Kullanılabilir dil yok" #: ../gtk/src/Recognizer.cc:179 ../qt/src/Recognizer.cc:172 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:233 ../qt/src/Recognizer.cc:232 msgid "Multilingual" msgstr "Çokdilli" #: ../gtk/src/Recognizer.cc:285 ../qt/src/Recognizer.cc:277 msgid "Automatic page segmentation" msgstr "Otomatik sayfa bölümlendirme" #: ../gtk/src/Recognizer.cc:286 ../qt/src/Recognizer.cc:278 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:287 ../qt/src/Recognizer.cc:279 msgid "Assume single column of text" msgstr "Tek sütünlu metin olarak kabul et" #: ../gtk/src/Recognizer.cc:288 ../qt/src/Recognizer.cc:280 msgid "Assume single block of vertically aligned text" msgstr "Dikey olarak hizalanan metnin tek blok olduğunu varsay" #: ../gtk/src/Recognizer.cc:289 ../qt/src/Recognizer.cc:281 msgid "Assume a single uniform block of text" msgstr "Tek bir metin bloğu varsay" #: ../gtk/src/Recognizer.cc:290 ../qt/src/Recognizer.cc:282 msgid "Assume a line of text" msgstr "Bir satırlık metin varsay" #: ../gtk/src/Recognizer.cc:291 ../qt/src/Recognizer.cc:283 msgid "Assume a single word" msgstr "Tek bir kelime varsay" #: ../gtk/src/Recognizer.cc:292 ../qt/src/Recognizer.cc:284 msgid "Assume a single word in a circle" msgstr "Çember içinde tek bir kelime varsay" #: ../gtk/src/Recognizer.cc:293 ../qt/src/Recognizer.cc:285 msgid "Sparse text in no particular order" msgstr "Düzenli bir sırası olmayan aralıklı metin" #: ../gtk/src/Recognizer.cc:294 ../qt/src/Recognizer.cc:286 msgid "Sparse text with orientation and script detection" msgstr "Yönlendirme ve komut dosyası algılama özellikli metin" #: ../gtk/src/Recognizer.cc:309 ../qt/src/Recognizer.cc:297 msgid "Page segmentation mode" msgstr "Sayfa parçalama kipi" #: ../gtk/src/Recognizer.cc:313 ../qt/src/Recognizer.cc:300 msgid "Character whitelist / blacklist..." msgstr "" #: ../gtk/src/Recognizer.cc:319 ../qt/src/Recognizer.cc:305 msgid "Manage languages..." msgstr "Dilleri yönet..." #: ../gtk/src/Recognizer.cc:375 ../qt/src/Recognizer.cc:369 msgid "Current selection" msgstr "Mevcut seçim" #: ../gtk/src/Recognizer.cc:465 ../qt/src/Recognizer.cc:455 msgid "Recognizing page %1 (%2 of %3)" msgstr "Tanınan sayfa %1 (%2 of %3)" #: ../gtk/src/Recognizer.cc:470 ../qt/src/Recognizer.cc:461 msgid "" "\n" "- Page %1: failed to render page" msgstr "" "\n" "- Sayfa %1: sayfanın işlenemedi" #: ../gtk/src/Recognizer.cc:501 ../gtk/src/Recognizer.cc:531 #: ../gtk/src/Recognizer.cc:544 ../qt/src/Recognizer.cc:491 #: ../qt/src/Recognizer.cc:521 ../qt/src/Recognizer.cc:534 msgid "Recognizing..." msgstr "Tanınıyor..." #: ../gtk/src/Recognizer.cc:505 ../gtk/src/Recognizer.cc:514 #: ../qt/src/Recognizer.cc:495 ../qt/src/Recognizer.cc:504 msgid "Recognition errors occurred" msgstr "Tanıma hataları oluştu" #: ../gtk/src/Recognizer.cc:505 ../qt/src/Recognizer.cc:495 msgid "The following errors occurred:%1" msgstr "Aşağıdaki hatalar oluştu: %1" #: ../gtk/src/Recognizer.cc:514 ../qt/src/Recognizer.cc:504 msgid "Failed to initialize tesseract" msgstr "tesseract başlatılamadı" #: ../gtk/src/scanner/ScannerSane.cc:84 ../gtk/src/scanner/ScannerTwain.cc:288 #: ../qt/src/scanner/ScannerSane.cc:85 ../qt/src/scanner/ScannerTwain.cc:286 msgid "Scan canceled" msgstr "Tarama iptal edildi" #: ../gtk/src/scanner/ScannerSane.cc:159 ../gtk/src/scanner/ScannerTwain.cc:186 #: ../qt/src/scanner/ScannerSane.cc:159 ../qt/src/scanner/ScannerTwain.cc:178 msgid "No scanner specified" msgstr "Trayıcı belirtilmedi" #: ../gtk/src/scanner/ScannerSane.cc:168 ../gtk/src/scanner/ScannerTwain.cc:195 #: ../qt/src/scanner/ScannerSane.cc:168 ../qt/src/scanner/ScannerTwain.cc:187 msgid "Unable to connect to scanner" msgstr "Tarayıcıya bağlanılamadı" #: ../gtk/src/scanner/ScannerSane.cc:403 ../gtk/src/scanner/ScannerTwain.cc:266 #: ../gtk/src/scanner/ScannerTwain.cc:292 ../qt/src/scanner/ScannerSane.cc:403 #: ../qt/src/scanner/ScannerTwain.cc:258 ../qt/src/scanner/ScannerTwain.cc:290 msgid "Unable to start scan" msgstr "Tarama başlatılamadı" #: ../gtk/src/scanner/ScannerSane.cc:411 ../gtk/src/scanner/ScannerSane.cc:461 #: ../gtk/src/scanner/ScannerTwain.cc:318 ../qt/src/scanner/ScannerSane.cc:411 #: ../qt/src/scanner/ScannerSane.cc:461 ../qt/src/scanner/ScannerTwain.cc:316 msgid "Error communicating with scanner" msgstr "Tarayıcı ile iletişim kurma hatası" #: ../gtk/src/scanner/ScannerSane.cc:520 ../qt/src/scanner/ScannerSane.cc:517 msgid "Failed to save image" msgstr "Resim kaydedilemedi" #: ../gtk/src/scanner/ScannerSane.cc:800 ../qt/src/scanner/ScannerSane.cc:797 #, fuzzy msgid "Operation is cancelled." msgstr "Tarama iptal edildi" #: ../gtk/src/scanner/ScannerSane.cc:802 ../qt/src/scanner/ScannerSane.cc:799 msgid "Device is busy." msgstr "" #: ../gtk/src/scanner/ScannerSane.cc:804 ../qt/src/scanner/ScannerSane.cc:801 msgid "Cover is opened." msgstr "" #: ../gtk/src/scanner/ScannerSane.cc:806 ../qt/src/scanner/ScannerSane.cc:803 msgid "Document feeder jammed." msgstr "" #: ../gtk/src/scanner/ScannerSane.cc:808 ../qt/src/scanner/ScannerSane.cc:805 msgid "Document feeder out of documents." msgstr "" #: ../gtk/src/scanner/ScannerSane.cc:810 ../qt/src/scanner/ScannerSane.cc:807 #, fuzzy msgid "Access to scanner is denied." msgstr "Trayıcı belirtilmedi" #: ../gtk/src/SourceManager.cc:118 ../qt/src/SourceManager.cc:124 msgid "PDFs with text" msgstr "" #: ../gtk/src/SourceManager.cc:118 ../qt/src/SourceManager.cc:124 msgid "" "These PDF files already contain text:\n" "%1" msgstr "" #: ../gtk/src/SourceManager.cc:127 ../qt/src/SourceManager.cc:132 msgid "Unable to open files" msgstr "Dosyalar açılamadı" #: ../gtk/src/SourceManager.cc:127 ../qt/src/SourceManager.cc:132 msgid "The following files could not be opened:%1" msgstr "Bu dosyalar açılamadı:%1" #: ../gtk/src/SourceManager.cc:141 ../qt/src/SourceManager.cc:143 msgid "Enter password for file '%1':" msgstr "" #: ../gtk/src/SourceManager.cc:197 ../qt/src/SourceManager.cc:214 msgid "Images and PDFs" msgstr "Resimler ve PDF dosyaları" #: ../gtk/src/SourceManager.cc:202 ../qt/src/SourceManager.cc:215 msgid "Select Files" msgstr "Dosyaları Seçin" #: ../gtk/src/SourceManager.cc:208 ../qt/src/SourceManager.cc:226 msgid "Clipboard Error" msgstr "Geçici Taşıma Panosu Hatası" #: ../gtk/src/SourceManager.cc:208 ../qt/src/SourceManager.cc:226 msgid "Failed to read the clipboard." msgstr "Taşıma panosu okunamadı." #: ../gtk/src/SourceManager.cc:212 ../qt/src/SourceManager.cc:230 #: ../qt/src/SourceManager.cc:236 msgid "Pasted %1" msgstr "%1 Yapıştırıldı" #: ../gtk/src/SourceManager.cc:224 ../qt/src/SourceManager.cc:243 msgid "Screenshot Error" msgstr "Ekran Görüntüsü Hatası" #: ../gtk/src/SourceManager.cc:224 ../qt/src/SourceManager.cc:243 msgid "Failed to take screenshot." msgstr "Ekran görüntüsü alınamadı." #: ../gtk/src/SourceManager.cc:228 ../qt/src/SourceManager.cc:247 msgid "Screenshot %1" msgstr "Ekran Görüntüsü %1" #: ../gtk/src/SourceManager.cc:233 ../qt/src/SourceManager.cc:252 msgid "Saving image..." msgstr "Resim kaydediliyor..." #: ../gtk/src/SourceManager.cc:240 ../qt/src/SourceManager.cc:265 msgid "Cannot Write File" msgstr "Dosya Yazılamıyor" #: ../gtk/src/SourceManager.cc:240 ../qt/src/SourceManager.cc:265 msgid "Could not write to %1." msgstr "%1 dosyasına yazılamadı." #: ../gtk/src/SourceManager.cc:267 ../qt/src/SourceManager.cc:287 msgid "Delete File?" msgstr "Dosya Silinsin mi?" #: ../gtk/src/SourceManager.cc:267 ../qt/src/SourceManager.cc:287 msgid "The following files will be deleted:%1" msgstr "Aşağıdaki dosyalar silinecek:%1" #: ../gtk/src/SourceManager.cc:332 ../qt/src/SourceManager.cc:338 msgid "Missing File" msgstr "Eksik Dosya" #: ../gtk/src/SourceManager.cc:332 ../qt/src/SourceManager.cc:338 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:33 ../qt/src/SubstitutionsManager.cc:73 msgid "Search for" msgstr "Ara" #: ../gtk/src/SubstitutionsManager.cc:34 ../qt/src/SubstitutionsManager.cc:73 msgid "Replace with" msgstr "Bununla değiştir" #: ../gtk/src/SubstitutionsManager.cc:69 ../gtk/src/SubstitutionsManager.cc:103 #: ../qt/src/SubstitutionsManager.cc:106 ../qt/src/SubstitutionsManager.cc:143 msgid "Substitutions List" msgstr "Değiştirme Listesi" #: ../gtk/src/SubstitutionsManager.cc:70 ../qt/src/SubstitutionsManager.cc:106 msgid "Open Substitutions List" msgstr "Değiştirme Listesini Aç" #: ../gtk/src/SubstitutionsManager.cc:75 ../qt/src/SubstitutionsManager.cc:112 msgid "Error Reading File" msgstr "Dosya Okunurken Hata" #: ../gtk/src/SubstitutionsManager.cc:75 ../qt/src/SubstitutionsManager.cc:112 msgid "Unable to read '%1'." msgstr "'%1' okunamadı." #: ../gtk/src/SubstitutionsManager.cc:97 ../qt/src/SubstitutionsManager.cc:137 msgid "Errors Occurred Reading File" msgstr "Dosya Okunurken Hatalar Oluştu" #: ../gtk/src/SubstitutionsManager.cc:97 ../qt/src/SubstitutionsManager.cc:137 msgid "Some entries of the substitutions list could not be read." msgstr "Değiştirme listesindeki bazı girdiler okunamadı." #: ../gtk/src/SubstitutionsManager.cc:104 ../qt/src/SubstitutionsManager.cc:143 msgid "Save Substitutions List" msgstr "Değiştirme Listesini Kaydet" #: ../gtk/src/SubstitutionsManager.cc:110 ../qt/src/SubstitutionsManager.cc:149 msgid "Error Saving File" msgstr "Dosya Kaydetmede Hata" #: ../gtk/src/SubstitutionsManager.cc:110 ../qt/src/SubstitutionsManager.cc:149 msgid "Unable to write to '%1'." msgstr "'%1' dosyasına yazılamadı." #: ../gtk/src/SubstitutionsManager.cc:127 ../qt/src/SubstitutionsManager.cc:162 msgid "Save List?" msgstr "Liste Kaydedilsin mi?" #: ../gtk/src/SubstitutionsManager.cc:127 ../qt/src/SubstitutionsManager.cc:162 msgid "Do you want to save the current list?" msgstr "Mevcut listeyi kaydetmek istiyor musunuz?" #: ../gtk/src/TessdataManager.cc:60 ../qt/src/TessdataManager.cc:74 #, fuzzy msgid "" "A session connection to the PackageKit backend is required for managing " "system-wide tesseract language packs, but it was not found. This service is " "usually provided by a software-management application such as Gnome " "Software. Please install software which provides the necessary PackageKit " "interface, use other system package management software to manage the " "tesseract language packs directly, or switch to using 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:65 ../qt/src/TessdataManager.cc:79 msgid "Fetching available languages" msgstr "Kullanılabilir diller getiriliyor" #: ../gtk/src/TessdataManager.cc:70 ../gtk/src/TessdataManager.cc:96 #: ../gtk/src/TessdataManager.cc:197 ../qt/src/TessdataManager.cc:84 #: ../qt/src/TessdataManager.cc:101 ../qt/src/TessdataManager.cc:197 msgid "Failed to fetch list of available languages: %1" msgstr "Kullanılabilir dillerin listesi getirilemedi: %1" #: ../gtk/src/TessdataManager.cc:104 ../qt/src/TessdataManager.cc:113 #: ../qt/src/TessdataManager.cc:122 msgid "Parsing error: %1" msgstr "İşleme hatası: %1" #: ../gtk/src/TessdataManager.cc:235 ../qt/src/TessdataManager.cc:232 msgid "Applying changes..." msgstr "Değişiklikler uygulanıyor..." #: ../gtk/src/TessdataManager.cc:297 ../qt/src/TessdataManager.cc:278 msgid "Failed to create directory for tessdata files." msgstr "Tessdata dosyaları için dizin oluşturulamadı." #: ../gtk/src/TessdataManager.cc:306 ../qt/src/TessdataManager.cc:287 msgid "Downloading %1..." msgstr "%1 indiriliyor..." #: ../gtk/src/TessdataManager.cc:330 #, fuzzy msgid "" "The following files could not be downloaded or removed:\n" "%1\n" "\n" "Check the connectivity and directory permissions.\n" "\n" "Hint: If you don't have write permissions in system folders, you can switch " "to user paths in the settings dialog." msgstr "" "Aşağıdaki dosyalar indirilemedi veya silinemedi:\n" "%1\n" "\n" "Bağlantınızı ve dizin izinlerini denetleyin." #: ../gtk/src/Utils.cc:64 msgid "Yes" msgstr "Evet" #: ../gtk/src/Utils.cc:67 msgid "No" msgstr "Hayır" #: ../gtk/src/Utils.cc:76 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/CrashHandler.ui.h:3 msgid "" "

Tesseract has " "aborted

Tesseract (the OCR engine) has aborted while " "recognizing text. This may occur if the used traineddatas are corrupt or " "incomplatible with the version of tesseract in use, or due to a bug in " "tesseract.

The stacktrace below may provide additional information " "about where the crash occured.

" msgstr "" #: ../qt/data/MainWindow.ui.h:17 msgid "Flatbed" msgstr "" #: ../qt/data/MainWindow.ui.h:18 msgid "ADF Front" msgstr "" #: ../qt/data/MainWindow.ui.h:19 msgid "ADF Back" msgstr "" #: ../qt/data/MainWindow.ui.h:20 msgid "ADF Duplex" msgstr "" #. Remove & from some labels which designer insists in adding #: ../qt/data/MainWindow.ui.h:21 ../qt/src/Ui_MainWindow.hh:50 msgid "Sources" msgstr "Kaynaklar" #: ../qt/data/MainWindow.ui.h:22 msgid "Zoom In" msgstr "Yaklaştır" #: ../qt/data/MainWindow.ui.h:24 msgid "Zoom Out" msgstr "Uzaklaştır" #: ../qt/data/MainWindow.ui.h:26 msgid "Normal Size" msgstr "Normal Boyut" #: ../qt/data/MainWindow.ui.h:28 msgid "Best Fit" msgstr "En Uygun" #: ../qt/data/MainWindow.ui.h:30 msgid "Rotate Left" msgstr "Sola Döndür" #: ../qt/data/MainWindow.ui.h:31 msgid "Rotate left" msgstr "Sola döndür" #: ../qt/data/MainWindow.ui.h:32 msgid "Rotate Right" msgstr "Sağa Döndür" #: ../qt/data/MainWindow.ui.h:33 msgid "Rotate right" msgstr "Sağa döndür" #: ../qt/data/MainWindow.ui.h:34 msgid "Image Controls" msgstr "Resim Denetimleri" #: ../qt/data/MainWindow.ui.h:36 msgid "Autodetect Layout" msgstr "Yerleşimi Otomatik Algıla" #: ../qt/data/MainWindow.ui.h:38 msgid "Toggle Output Pane" msgstr "Çıktı Bölmesini Değiştir" #: ../qt/data/PdfExportDialog.ui.h:5 msgid "Backend:" msgstr "" #: ../qt/data/PdfExportDialog.ui.h:8 msgid "Portrait" msgstr "" #: ../qt/data/PdfExportDialog.ui.h:9 msgid "Landscape" msgstr "" #: ../qt/src/hocr/HOCRPdfExporter.cc:142 #, fuzzy msgid "Failed to write to file" msgstr "Dosya açılamadı" #. Output toolbar #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:55 #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:56 msgid "Open hOCR file" msgstr "hOCR dosyasını aç" #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:57 #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:58 msgid "Save as hOCR text" msgstr "oOCR metni olarak kaydet" #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:79 #: ../qt/src/Ui_OutputEditorText.hh:106 msgid "Find and Replace" msgstr "Bul ve Değiştir" #: ../qt/src/MainWindow.cc:581 #, fuzzy msgid "" "The following dictionary files were installed:\n" "%1" msgstr "Kurulan sözlük dosyaları: %1" #: ../qt/src/TessdataManager.cc:308 #, fuzzy msgid "" "The following files could not be downloaded or removed:\n" "%1\n" "\n" "Check the connectivity and directory permissions.\n" "Hint: If you don't have write permissions in system folders, you can switch " "to user paths in the settings dialog." msgstr "" "Aşağıdaki dosyalar indirilemedi veya silinemedi:\n" "%1\n" "\n" "Bağlantınızı ve dizin izinlerini denetleyin." #: ../qt/src/Ui_MainWindow.hh:51 msgid "Output" msgstr "Çıktı" #: ../qt/src/Ui_MainWindow.hh:135 msgid "OCR mode:" msgstr "OCR kipi:" #: ../qt/src/Ui_MainWindow.hh:209 msgid "Remove Image" msgstr "Resmi Kaldır" #: ../qt/src/Ui_MainWindow.hh:212 msgid "Delete Image" msgstr "Resmi Sil" #: ../qt/src/Ui_MainWindow.hh:215 msgid "Clear List" msgstr "Listeyi Temizle" #: ../qt/src/Ui_OutputEditorText.hh:101 msgid "Strip Line Breaks" msgstr "Satır Sonlarını Çıkart" #: ../qt/src/Ui_OutputEditorText.hh:115 msgid "Save Output" msgstr "Çıktıyı Kaydet" #: ../qt/src/Ui_OutputEditorText.hh:117 msgid "Clear Output" msgstr "Çıktıyı Temizle" #~ msgid "The application has crashed" #~ msgstr "Uygulama çöktü" #~ 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." #~ msgid "Could not read %1: %2" #~ msgstr "%1 okunamadı: %2" #~ msgid "gImageReader" #~ msgstr "gImageReader" #, 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 "Document font:" #~ msgstr "Belge yazı tipi:" #~ msgid "Scale:" #~ msgstr "Ölçek:" #~ msgid "Document" #~ msgstr "Belge" #~ msgid "Errors occurred" #~ msgstr "Hatalar oluÅŸtu" #~ msgid "" #~ "The following pages could not be rendered:\n" #~ "%1" #~ msgstr "" #~ "AÅŸağıdaki dosyalar iÅŸlenemedi:\n" #~ "%1" #~ msgid "substitution_list.txt" #~ msgstr "degistirme_listesi.txt" #~ 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.3.1/po/uk.po000066400000000000000000002304561351740627400154520ustar00rootroot00000000000000# 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: 2019-07-25 23:17+0200\n" "PO-Revision-Date: 2019-04-04 14:04+0000\n" "Last-Translator: ___ \n" "Language-Team: Ukrainian \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: Weblate 3.6-dev\n" #: ../data/gimagereader.desktop.in.h:1 msgid "OCR application" msgstr "OCR-додаток" #: ../gtk/data/appmenu.ui.h:1 ../qt/src/Ui_MainWindow.hh:167 msgid "Redetect Languages" msgstr "Повторно виÑвити мови" #: ../gtk/data/appmenu.ui.h:2 ../qt/src/Ui_MainWindow.hh:170 msgid "Manage Languages" msgstr "Керувати мовами" #: ../gtk/data/appmenu.ui.h:3 ../gtk/data/ConfigDialog.ui.h:1 #: ../qt/data/ConfigDialog.ui.h:1 ../qt/src/Ui_MainWindow.hh:173 msgid "Preferences" msgstr "ÐалаштуваннÑ" #: ../gtk/data/appmenu.ui.h:4 ../gtk/data/ConfigDialog.ui.h:2 #: ../gtk/src/MainWindow.cc:482 ../qt/src/MainWindow.cc:481 #: ../qt/src/Ui_MainWindow.hh:178 msgid "Help" msgstr "Допомога" #: ../gtk/data/appmenu.ui.h:5 ../qt/data/AboutDialog.ui.h:2 #: ../qt/src/Ui_MainWindow.hh:181 msgid "About" msgstr "Про програму" #: ../gtk/data/appmenu.ui.h:6 msgid "Quit" msgstr "Вихід" #: ../gtk/data/ConfigDialog.ui.h:3 ../gtk/data/MainWindow.ui.h:47 #: ../gtk/data/OutputEditorHOCR.ui.h:3 ../gtk/data/PdfExportDialog.ui.h:3 #: ../gtk/src/FileDialogs.cc:152 ../gtk/src/Utils.cc:61 #: ../qt/data/ConfigDialog.ui.h:26 msgid "OK" msgstr "Гаразд" #: ../gtk/data/ConfigDialog.ui.h:4 msgid "Output pane orientation:" msgstr "ÐžÑ€Ñ–Ñ”Ð½Ñ‚Ð°Ñ†Ñ–Ñ Ð¿Ð°Ð½ÐµÐ»Ñ– результатів:" #: ../gtk/data/ConfigDialog.ui.h:5 msgid "Horizontal" msgstr "Горизонтально" #: ../gtk/data/ConfigDialog.ui.h:6 msgid "Vertical" msgstr "Вертикально" #: ../gtk/data/ConfigDialog.ui.h:7 ../qt/data/ConfigDialog.ui.h:18 msgid "Query to install missing spellcheck dictionaries" msgstr "Запит на вÑÑ‚Ð°Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ Ð²Ñ–Ð´Ñутніх орфографічних Ñловників" #: ../gtk/data/ConfigDialog.ui.h:8 ../qt/data/ConfigDialog.ui.h:4 msgid "Automatically check for new program versions" msgstr "Ðвтоматично перевірÑти наÑвніÑть нових верÑій програми" #: ../gtk/data/ConfigDialog.ui.h:9 ../qt/data/ConfigDialog.ui.h:3 msgid "Predefined language definitions:" msgstr "Задані Ð²Ð¸Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ð¼Ð¾Ð²:" #: ../gtk/data/ConfigDialog.ui.h:10 ../qt/data/ConfigDialog.ui.h:12 msgid "Additional language definitions:" msgstr "Додаткові Ð²Ð¸Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ð¼Ð¾Ð²:" #: ../gtk/data/ConfigDialog.ui.h:11 ../qt/data/ConfigDialog.ui.h:20 msgid "The prefix of the tesseract language data file" msgstr "ÐŸÑ€ÐµÑ„Ñ–ÐºÑ Ð¼Ð¾Ð²Ð½Ð¾Ð³Ð¾ файлу даних tesseract" #: ../gtk/data/ConfigDialog.ui.h:12 ../qt/data/ConfigDialog.ui.h:21 msgid "Prefix" msgstr "ПрефікÑ" #: ../gtk/data/ConfigDialog.ui.h:13 ../qt/data/ConfigDialog.ui.h:22 msgid "The ISO 639-1 language code followed by the country code" msgstr "Код мови за ISO 639-1 з кодом країни" #: ../gtk/data/ConfigDialog.ui.h:14 ../qt/data/ConfigDialog.ui.h:23 msgid "ISO Code" msgstr "Код ISO" #: ../gtk/data/ConfigDialog.ui.h:15 ../qt/data/ConfigDialog.ui.h:24 msgid "The name of the language" msgstr "Ðазва мови" #: ../gtk/data/ConfigDialog.ui.h:16 ../qt/data/ConfigDialog.ui.h:25 msgid "Name" msgstr "Ðазва" #: ../gtk/data/ConfigDialog.ui.h:17 ../gtk/data/MainWindow.ui.h:46 #: ../gtk/data/OutputEditorHOCR.ui.h:2 ../gtk/data/PdfExportDialog.ui.h:2 #: ../gtk/src/Acquirer.cc:34 ../gtk/src/FileDialogs.cc:151 #: ../gtk/src/Utils.cc:70 ../qt/data/ConfigDialog.ui.h:27 #: ../qt/data/MainWindow.ui.h:12 msgid "Cancel" msgstr "СкаÑувати" #: ../gtk/data/ConfigDialog.ui.h:18 ../qt/data/ConfigDialog.ui.h:5 msgid "Output pane font:" msgstr "Шрифт панелі результатів:" #: ../gtk/data/ConfigDialog.ui.h:19 ../qt/data/ConfigDialog.ui.h:2 msgid "Default" msgstr "За-замовчуваннÑм" #: ../gtk/data/ConfigDialog.ui.h:20 ../qt/data/ConfigDialog.ui.h:6 msgid "Language data locations:" msgstr "Ð Ð¾Ð·Ñ‚Ð°ÑˆÑƒÐ²Ð°Ð½Ð½Ñ Ð¼Ð¾Ð²Ð½Ð¸Ñ… даних:" #: ../gtk/data/ConfigDialog.ui.h:21 ../qt/data/ConfigDialog.ui.h:13 msgid "Language definitions path:" msgstr "Ð Ð¾Ð·Ñ‚Ð°ÑˆÑƒÐ²Ð°Ð½Ð½Ñ Ð²Ð¸Ð·Ð½Ð°Ñ‡ÐµÐ½ÑŒ мови:" #: ../gtk/data/ConfigDialog.ui.h:22 ../qt/data/ConfigDialog.ui.h:28 msgid "Spelling dictionaries path:" msgstr "Ð Ð¾Ð·Ñ‚Ð°ÑˆÑƒÐ²Ð°Ð½Ð½Ñ Ð¾Ñ€Ñ„Ð¾Ð³Ñ€Ð°Ñ„Ñ–Ñ‡Ð½Ð¸Ñ… Ñловників:" #: ../gtk/data/ConfigDialog.ui.h:23 ../qt/data/ConfigDialog.ui.h:10 msgid "System-wide paths" msgstr "ЗагальноÑиÑтемні шлÑхи" #: ../gtk/data/ConfigDialog.ui.h:24 ../qt/data/ConfigDialog.ui.h:11 msgid "User paths" msgstr "КориÑтувацькі шлÑхи" #: ../gtk/data/ConfigDialog.ui.h:25 ../qt/data/ConfigDialog.ui.h:29 msgid "Automatically open exported documents with default application" msgstr "" "Ðвтоматично відкривати екÑпортовані документи у додатку за-замовчуваннÑм" #: ../gtk/data/CrashHandler.ui.h:1 ../qt/src/CrashHandler.cc:38 msgid "Regenerate backtrace" msgstr "Відновити зворотнє траÑуваннÑ" #: ../gtk/data/CrashHandler.ui.h:3 #, fuzzy, no-c-format msgid "" "The application has crashed\n" "\n" "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/CrashHandler.ui.h:6 msgid "" "Tesseract has aborted\n" "\n" "Tesseract (the OCR engine) has aborted while recognizing text. This may " "occur if the used traineddatas are corrupt or incomplatible with the version " "of tesseract in use, or due to a bug in tesseract.\n" "\n" "The stacktrace below may provide additional information about where the " "crash occured.\n" msgstr "" #: ../gtk/data/MainWindow.ui.h:1 ../qt/data/MainWindow.ui.h:39 msgid "Toggle output pane" msgstr "Показати/приховати панель результатів" #: ../gtk/data/MainWindow.ui.h:2 ../qt/src/Ui_MainWindow.hh:66 msgid "Rotate current page" msgstr "Обернути поточну Ñторінку" #: ../gtk/data/MainWindow.ui.h:3 ../qt/src/Ui_MainWindow.hh:67 msgid "Rotate all pages" msgstr "Обернути уÑÑ– Ñторінки" #. Sources toolbar #: ../gtk/data/MainWindow.ui.h:4 ../qt/src/Ui_MainWindow.hh:192 msgid "Recent" msgstr "Ðедавні файли" #: ../gtk/data/MainWindow.ui.h:5 ../qt/src/Ui_MainWindow.hh:193 msgid "Paste" msgstr "Ð’Ñтавити" #: ../gtk/data/MainWindow.ui.h:6 ../qt/src/Ui_MainWindow.hh:194 msgid "Take Screenshot" msgstr "Зробити знімок екрану" #: ../gtk/data/MainWindow.ui.h:7 ../qt/data/MainWindow.ui.h:23 msgid "Zoom in" msgstr "Збільшити" #: ../gtk/data/MainWindow.ui.h:8 ../qt/data/MainWindow.ui.h:25 msgid "Zoom out" msgstr "Зменшити" #: ../gtk/data/MainWindow.ui.h:9 ../qt/data/MainWindow.ui.h:27 msgid "Normal size" msgstr "Звичайний розмір" #: ../gtk/data/MainWindow.ui.h:10 ../qt/data/MainWindow.ui.h:29 msgid "Best fit" msgstr "Оптимальне заповненнÑ" #: ../gtk/data/MainWindow.ui.h:11 ../qt/src/Ui_MainWindow.hh:75 msgid "Select rotation mode" msgstr "Обрати режим обертаннÑ" #: ../gtk/data/MainWindow.ui.h:12 ../gtk/data/OutputEditorText.ui.h:13 #: ../qt/src/Ui_OutputEditorText.hh:95 msgid "Select insert mode" msgstr "Обрати режим вÑтавки" #: ../gtk/data/MainWindow.ui.h:13 ../qt/src/Ui_MainWindow.hh:109 #, fuzzy msgid "Select page" msgstr "Обрати мову" #: ../gtk/data/MainWindow.ui.h:14 ../qt/data/MainWindow.ui.h:35 msgid "Image controls" msgstr "ÐšÐµÑ€ÑƒÐ²Ð°Ð½Ð½Ñ Ð·Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð½Ñм" #: ../gtk/data/MainWindow.ui.h:15 ../qt/src/Ui_MainWindow.hh:139 msgid "Plain text" msgstr "Звичайний текÑÑ‚" #: ../gtk/data/MainWindow.ui.h:16 ../qt/src/Ui_MainWindow.hh:139 msgid "hOCR, PDF" msgstr "hOCR, PDF" #: ../gtk/data/MainWindow.ui.h:17 ../qt/data/MainWindow.ui.h:37 msgid "Autodetect layout" msgstr "ÐÐ²Ñ‚Ð¾Ð²Ð¸Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ð¼Ð°ÐºÐµÑ‚Ñƒ Ñторінки" #: ../gtk/data/MainWindow.ui.h:18 msgid "Recognize all" msgstr "Розпізнати вÑе" #: ../gtk/data/MainWindow.ui.h:19 msgid "Select language" msgstr "Обрати мову" #: ../gtk/data/MainWindow.ui.h:20 ../qt/src/Ui_MainWindow.hh:205 msgid "Add images" msgstr "Додати зображеннÑ" #: ../gtk/data/MainWindow.ui.h:21 ../qt/src/Ui_MainWindow.hh:204 msgid "Add Images" msgstr "Додати зображеннÑ" #: ../gtk/data/MainWindow.ui.h:22 ../qt/src/Ui_MainWindow.hh:210 msgid "Remove image from list" msgstr "Видалити Ð·Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð½Ñ Ð·Ñ– ÑпиÑку" #: ../gtk/data/MainWindow.ui.h:23 ../qt/src/Ui_MainWindow.hh:213 msgid "Delete image" msgstr "Видалити зображеннÑ" #: ../gtk/data/MainWindow.ui.h:24 ../qt/src/Ui_MainWindow.hh:216 msgid "Clear list" msgstr "ОчиÑтити ÑпиÑок" #: ../gtk/data/MainWindow.ui.h:25 ../qt/data/MainWindow.ui.h:5 msgid "Files" msgstr "Файли" #: ../gtk/data/MainWindow.ui.h:26 ../qt/data/MainWindow.ui.h:8 msgid "Device:" msgstr "ПриÑтрій:" #: ../gtk/data/MainWindow.ui.h:27 ../gtk/data/TessdataManager.ui.h:4 #: ../qt/data/MainWindow.ui.h:7 ../qt/src/TessdataManager.cc:59 msgid "Refresh" msgstr "Оновити" #: ../gtk/data/MainWindow.ui.h:28 ../qt/data/MainWindow.ui.h:9 msgid "Output:" msgstr "Сканувати до теки:" #: ../gtk/data/MainWindow.ui.h:29 ../qt/data/MainWindow.ui.h:13 msgid "Mode:" msgstr "Режим:" #: ../gtk/data/MainWindow.ui.h:30 ../gtk/src/hocr/HOCRPdfExporter.cc:313 #: ../qt/data/MainWindow.ui.h:15 ../qt/src/hocr/HOCRPdfExporter.cc:347 msgid "Color" msgstr "Кольоровий" #: ../gtk/data/MainWindow.ui.h:31 ../gtk/src/hocr/HOCRPdfExporter.cc:316 #: ../qt/data/MainWindow.ui.h:14 ../qt/src/hocr/HOCRPdfExporter.cc:349 #: ../qt/src/hocr/HOCRPdfExporter.cc:351 msgid "Grayscale" msgstr "Відтінки Ñірого" #: ../gtk/data/MainWindow.ui.h:32 ../qt/data/MainWindow.ui.h:10 msgid "Resolution:" msgstr "Роздільна здатніÑть:" #: ../gtk/data/MainWindow.ui.h:33 ../qt/data/MainWindow.ui.h:11 msgid "Scan" msgstr "Сканувати" #: ../gtk/data/MainWindow.ui.h:34 ../qt/data/MainWindow.ui.h:16 msgid "Source:" msgstr "Джерело:" #: ../gtk/data/MainWindow.ui.h:35 ../qt/data/MainWindow.ui.h:6 msgid "Acquire" msgstr "СкануваннÑ" #: ../gtk/data/MainWindow.ui.h:36 ../qt/data/MainWindow.ui.h:1 msgid "Brightness" msgstr "ЯÑкравіÑть" #: ../gtk/data/MainWindow.ui.h:37 ../qt/data/MainWindow.ui.h:2 msgid "Contrast" msgstr "КонтраÑÑ‚" #: ../gtk/data/MainWindow.ui.h:38 ../qt/data/MainWindow.ui.h:3 msgid "Resolution" msgstr "Роздільна здатніÑть" #: ../gtk/data/MainWindow.ui.h:39 ../qt/data/MainWindow.ui.h:4 msgid "Invert colors" msgstr "ІнверÑÑ–Ñ ÐºÐ¾Ð»ÑŒÐ¾Ñ€Ñƒ" #: ../gtk/data/MainWindow.ui.h:40 msgid "A graphical frontend to tesseract-ocr" msgstr "Графічний Ñ–Ð½Ñ‚ÐµÑ€Ñ„ÐµÐ¹Ñ Ð´Ð»Ñ tesseract-ocr" #: ../gtk/data/MainWindow.ui.h:41 ../qt/data/CharacterListDialog.ui.h:1 msgid "Character whitelist / blacklist" msgstr "" #: ../gtk/data/MainWindow.ui.h:42 ../qt/data/CharacterListDialog.ui.h:2 msgid "Exclude these characters from being recognized (blacklist):" msgstr "" #: ../gtk/data/MainWindow.ui.h:43 ../qt/data/CharacterListDialog.ui.h:3 #, fuzzy msgid "Enter a string of characters..." msgstr "ÐžÑ‚Ñ€Ð¸Ð¼Ð°Ð½Ð½Ñ Ð¿Ð°Ñ€Ð°Ð¼ÐµÑ‚Ñ€Ñ–Ð²..." #: ../gtk/data/MainWindow.ui.h:44 ../qt/data/CharacterListDialog.ui.h:4 msgid "Only allow the following characters to be recognized (whitelist):" msgstr "" #: ../gtk/data/MainWindow.ui.h:45 ../qt/data/PageRangeDialog.ui.h:1 msgid "Page Range" msgstr "Діапазон Ñторінок" #: ../gtk/data/MainWindow.ui.h:48 ../qt/data/PageRangeDialog.ui.h:2 msgid "Page range:" msgstr "Діапазон Ñторінок:" #: ../gtk/data/MainWindow.ui.h:49 ../qt/data/PageRangeDialog.ui.h:3 msgid "Example: 1-10, 13, 14-18" msgstr "Приклад: 1-10, 13, 14-18" #: ../gtk/data/MainWindow.ui.h:50 ../qt/data/PageRangeDialog.ui.h:4 msgid "Recognition area:" msgstr "ОблаÑть розпізнаваннÑ:" #: ../gtk/data/MainWindow.ui.h:51 ../gtk/src/Recognizer.cc:375 #: ../qt/data/PageRangeDialog.ui.h:5 ../qt/src/Recognizer.cc:369 msgid "Entire page" msgstr "Ð’ÑÑ Ñторінка" #: ../gtk/data/MainWindow.ui.h:52 ../qt/data/PageRangeDialog.ui.h:6 msgid "Autodetect" msgstr "ÐвтовизначеннÑ" #: ../gtk/data/MainWindow.ui.h:53 ../qt/data/PageRangeDialog.ui.h:7 msgid "Prepend to output text:" msgstr "Додати перед текÑтом, що виводитьÑÑ:" #: ../gtk/data/MainWindow.ui.h:54 ../qt/data/PageRangeDialog.ui.h:8 msgid "Source filename" msgstr "Ім'Ñ Ð²Ð¸Ñ…Ñ–Ð´Ð½Ð¾Ð³Ð¾ файлу" #: ../gtk/data/MainWindow.ui.h:55 ../qt/data/PageRangeDialog.ui.h:9 msgid "Source page" msgstr "Вихідна Ñторінка" #: ../gtk/data/MainWindow.ui.h:56 ../qt/src/SourceManager.cc:146 msgid "Protected PDF" msgstr "Захищений PDF" #: ../gtk/data/MainWindow.ui.h:57 ../qt/src/Recognizer.cc:76 msgid "Current Page" msgstr "Поточна Ñторінка" #: ../gtk/data/MainWindow.ui.h:58 ../qt/src/Recognizer.cc:79 msgid "Multiple Pages..." msgstr "Кілька Ñторінок..." #: ../gtk/data/OutputEditorHOCR.ui.h:1 ../qt/src/hocr/OutputEditorHOCR.cc:580 msgid "Add Word" msgstr "Додати Ñлово" #: ../gtk/data/OutputEditorHOCR.ui.h:4 ../qt/src/hocr/OutputEditorHOCR.cc:580 msgid "Enter word:" msgstr "Введіть Ñлово:" #: ../gtk/data/OutputEditorHOCR.ui.h:5 ../qt/src/hocr/Ui_OutputEditorHOCR.hh:61 #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:62 msgid "Export to plain text" msgstr "ЕкÑпорт у проÑтий текÑÑ‚" #: ../gtk/data/OutputEditorHOCR.ui.h:6 ../qt/src/hocr/Ui_OutputEditorHOCR.hh:64 #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:65 msgid "Export to PDF" msgstr "ЕкÑпорт у PDF" #: ../gtk/data/OutputEditorHOCR.ui.h:7 ../qt/src/hocr/Ui_OutputEditorHOCR.hh:67 #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:68 msgid "Export to ODT" msgstr "ЕкÑпорт у ODT" #: ../gtk/data/OutputEditorHOCR.ui.h:8 ../gtk/data/OutputEditorText.ui.h:18 #: ../qt/src/Ui_OutputEditorText.hh:116 msgid "Save output" msgstr "Зберегти результати" #: ../gtk/data/OutputEditorHOCR.ui.h:9 ../qt/src/hocr/Ui_OutputEditorHOCR.hh:72 #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:73 msgid "Export" msgstr "ЕкÑпорт" #: ../gtk/data/OutputEditorHOCR.ui.h:10 ../gtk/data/OutputEditorText.ui.h:19 #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:77 #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:78 #: ../qt/src/Ui_OutputEditorText.hh:118 msgid "Clear output" msgstr "ОчиÑтити результати" #: ../gtk/data/OutputEditorHOCR.ui.h:11 ../gtk/data/OutputEditorText.ui.h:15 #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:80 #: ../qt/src/Ui_OutputEditorText.hh:107 msgid "Find and replace" msgstr "Знайти Ñ– замінити" #: ../gtk/data/OutputEditorHOCR.ui.h:12 #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:82 #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:83 msgid "Show confidence values" msgstr "Відображати величини доÑтовірноÑті" #: ../gtk/data/OutputEditorHOCR.ui.h:13 ../gtk/data/PdfExportDialog.ui.h:41 #: ../qt/data/PdfExportDialog.ui.h:2 ../qt/src/hocr/Ui_OutputEditorHOCR.hh:85 #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:86 msgid "Show preview" msgstr "Відображати попередній переглÑд" #: ../gtk/data/OutputEditorHOCR.ui.h:14 #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:121 msgid "Next (F3)" msgstr "ÐаÑтупний (F3)" #: ../gtk/data/OutputEditorHOCR.ui.h:15 #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:122 msgid "Previous (Shift+F3)" msgstr "Попередній (Shift+F3)" #: ../gtk/data/OutputEditorHOCR.ui.h:16 ../gtk/src/hocr/OutputEditorHOCR.cc:890 #: ../qt/src/hocr/OutputEditorHOCR.cc:730 #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:126 msgid "Expand all" msgstr "Розгорнути уÑе" #: ../gtk/data/OutputEditorHOCR.ui.h:17 ../gtk/src/hocr/OutputEditorHOCR.cc:893 #: ../qt/src/hocr/OutputEditorHOCR.cc:731 #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:127 msgid "Collapse all" msgstr "Згорнути уÑе" #: ../gtk/data/OutputEditorHOCR.ui.h:18 #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:148 msgid "Properties" msgstr "ВлаÑтивоÑті" #: ../gtk/data/OutputEditorHOCR.ui.h:19 #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:152 msgid "Source" msgstr "Джерело" #. Output insert mode #: ../gtk/data/OutputEditorText.ui.h:1 ../qt/src/Ui_OutputEditorText.hh:52 msgid "Append to current text" msgstr "Додати до поточного текÑту" #: ../gtk/data/OutputEditorText.ui.h:2 ../qt/src/Ui_OutputEditorText.hh:53 msgid "Insert at cursor" msgstr "Ð’Ñтавити на міÑці курÑору" #: ../gtk/data/OutputEditorText.ui.h:3 ../qt/src/Ui_OutputEditorText.hh:54 msgid "Replace current text" msgstr "Замінити поточний текÑÑ‚" #. Output postprocessing #: ../gtk/data/OutputEditorText.ui.h:4 ../qt/src/Ui_OutputEditorText.hh:62 msgid "Keep line break if..." msgstr "Зберігати розрив Ñ€Ñдка, Ñкщо..." #: ../gtk/data/OutputEditorText.ui.h:5 ../qt/src/Ui_OutputEditorText.hh:64 msgid "Preceded by end mark (.?!)" msgstr "Перед ним Ñ” знак ÐºÑ–Ð½Ñ†Ñ Ñ€ÐµÑ‡ÐµÐ½Ð½Ñ (.?!)" #: ../gtk/data/OutputEditorText.ui.h:6 ../qt/src/Ui_OutputEditorText.hh:66 msgid "Preceded or succeeded by quote" msgstr "Перед ним або піÑÐ»Ñ Ð½ÑŒÐ¾Ð³Ð¾ Ñ” лапки" #: ../gtk/data/OutputEditorText.ui.h:7 ../qt/src/Ui_OutputEditorText.hh:68 msgid "Other options" msgstr "Інші опції" #: ../gtk/data/OutputEditorText.ui.h:8 ../qt/src/Ui_OutputEditorText.hh:70 msgid "Join hyphenated words" msgstr "Об'єднати перенеÑені Ñлова" #: ../gtk/data/OutputEditorText.ui.h:9 ../qt/src/Ui_OutputEditorText.hh:72 msgid "Collapse whitespace" msgstr "СтиÑкати пробіли" #: ../gtk/data/OutputEditorText.ui.h:10 ../qt/src/Ui_OutputEditorText.hh:74 msgid "Preserve paragraphs" msgstr "Зберігати поділ на абзаци" #: ../gtk/data/OutputEditorText.ui.h:11 ../qt/src/Ui_OutputEditorText.hh:76 msgid "Visual aids" msgstr "Візуальні підказки" #: ../gtk/data/OutputEditorText.ui.h:12 ../qt/src/Ui_OutputEditorText.hh:78 msgid "Draw whitespace" msgstr "Відобразити пробіли" #: ../gtk/data/OutputEditorText.ui.h:14 ../qt/src/Ui_OutputEditorText.hh:102 msgid "Strip line breaks on selected text" msgstr "Видалити розриви Ñ€Ñдків у вибраному текÑті" #: ../gtk/data/OutputEditorText.ui.h:16 ../qt/src/Ui_OutputEditorText.hh:109 #: ../qt/src/Ui_OutputEditorText.hh:110 msgid "Undo" msgstr "СкаÑувати" #: ../gtk/data/OutputEditorText.ui.h:17 ../qt/src/Ui_OutputEditorText.hh:112 #: ../qt/src/Ui_OutputEditorText.hh:113 msgid "Redo" msgstr "Повторити" #: ../gtk/data/PdfExportDialog.ui.h:1 ../qt/data/PdfExportDialog.ui.h:1 msgid "PDF Export" msgstr "ЕкÑпорт у PDF" #: ../gtk/data/PdfExportDialog.ui.h:4 ../qt/data/PdfExportDialog.ui.h:4 msgid "Output mode:" msgstr "Режим виводу:" #: ../gtk/data/PdfExportDialog.ui.h:5 ../qt/data/PdfExportDialog.ui.h:6 msgid "PDF" msgstr "PDF" #: ../gtk/data/PdfExportDialog.ui.h:6 ../qt/data/PdfExportDialog.ui.h:7 msgid "PDF with invisible text overlay" msgstr "PDF з невидимим текÑтовим шаром" #: ../gtk/data/PdfExportDialog.ui.h:7 ../qt/data/PdfExportDialog.ui.h:16 msgid "Format:" msgstr "Формат:" #: ../gtk/data/PdfExportDialog.ui.h:8 ../qt/data/PdfExportDialog.ui.h:17 msgid "Compression:" msgstr "СтиÑненнÑ:" #: ../gtk/data/PdfExportDialog.ui.h:9 ../qt/data/PdfExportDialog.ui.h:14 msgid "Compression quality:" msgstr "ЯкіÑть ÑтиÑненнÑ:" #: ../gtk/data/PdfExportDialog.ui.h:10 ../qt/data/PdfExportDialog.ui.h:15 msgid "DPI:" msgstr "DPI (точок на дюйм):" #: ../gtk/data/PdfExportDialog.ui.h:11 ../qt/data/PdfExportDialog.ui.h:18 msgid "Dithering algorithm:" msgstr "Ðлгоритм згладжуваннÑ:" #: ../gtk/data/PdfExportDialog.ui.h:12 ../qt/data/PdfExportDialog.ui.h:13 msgid "Image settings:" msgstr "ÐÐ°Ð»Ð°ÑˆÑ‚ÑƒÐ²Ð°Ð½Ð½Ñ Ð·Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð½Ñ:" #: ../gtk/data/PdfExportDialog.ui.h:13 ../qt/data/PdfExportDialog.ui.h:25 msgid "Uniformize line and word spacing" msgstr "ВирівнÑти інтервали між Ñ€Ñдками Ñ– Ñловами" #: ../gtk/data/PdfExportDialog.ui.h:14 ../qt/data/PdfExportDialog.ui.h:21 msgid "Override font family:" msgstr "ПримуÑово викориÑтовувати ÑімейÑтво шрифтів:" #: ../gtk/data/PdfExportDialog.ui.h:15 ../qt/data/PdfExportDialog.ui.h:27 msgid "Fallback font family:" msgstr "ЗапаÑне ÑімейÑтво шрифтів:" #: ../gtk/data/PdfExportDialog.ui.h:16 ../qt/data/PdfExportDialog.ui.h:20 msgid "Override font size:" msgstr "ПримуÑово викориÑтовувати розмір шрифту:" #: ../gtk/data/PdfExportDialog.ui.h:17 ../qt/data/PdfExportDialog.ui.h:23 msgid "Font scaling:" msgstr "МаÑÑˆÑ‚Ð°Ð±ÑƒÐ²Ð°Ð½Ð½Ñ ÑˆÑ€Ð¸Ñ„Ñ‚Ñƒ:" #: ../gtk/data/PdfExportDialog.ui.h:18 ../qt/data/PdfExportDialog.ui.h:26 msgid "pt" msgstr "pt (точок)" #: ../gtk/data/PdfExportDialog.ui.h:19 ../qt/data/PdfExportDialog.ui.h:22 msgid "Preserve spaces wider than:" msgstr "Зберігати пробіли, ширші за:" #: ../gtk/data/PdfExportDialog.ui.h:20 ../qt/data/PdfExportDialog.ui.h:24 msgid "characters" msgstr "Ñимволів" #: ../gtk/data/PdfExportDialog.ui.h:21 ../qt/data/PdfExportDialog.ui.h:28 msgid "Sanitize hyphens before line breaks" msgstr "" #: ../gtk/data/PdfExportDialog.ui.h:22 ../qt/data/PdfExportDialog.ui.h:19 msgid "Text settings:" msgstr "ÐÐ°Ð»Ð°ÑˆÑ‚ÑƒÐ²Ð°Ð½Ð½Ñ Ñ‚ÐµÐºÑту:" #: ../gtk/data/PdfExportDialog.ui.h:23 ../qt/data/PdfExportDialog.ui.h:10 msgid "Paper size:" msgstr "Розмір Ñторінки:" #: ../gtk/data/PdfExportDialog.ui.h:24 ../qt/data/PdfExportDialog.ui.h:11 msgid "Width" msgstr "Ширина" #: ../gtk/data/PdfExportDialog.ui.h:25 ../qt/data/PdfExportDialog.ui.h:12 msgid "Height" msgstr "ВиÑота" #: ../gtk/data/PdfExportDialog.ui.h:26 ../qt/data/PdfExportDialog.ui.h:29 msgid "Treat image sources as having true DPI:" msgstr "" #: ../gtk/data/PdfExportDialog.ui.h:27 ../qt/data/PdfExportDialog.ui.h:3 msgid "Basic" msgstr "Базовий" #: ../gtk/data/PdfExportDialog.ui.h:28 ../qt/data/PdfExportDialog.ui.h:31 msgid "PDF version:" msgstr "PDF-верÑÑ–Ñ:" #: ../gtk/data/PdfExportDialog.ui.h:29 ../qt/data/PdfExportDialog.ui.h:33 msgid "Password:" msgstr "Пароль:" #: ../gtk/data/PdfExportDialog.ui.h:30 ../qt/data/PdfExportDialog.ui.h:34 msgid "Confirm password:" msgstr "Підтвердіть пароль:" #: ../gtk/data/PdfExportDialog.ui.h:31 ../qt/data/PdfExportDialog.ui.h:32 msgid "Encryption (optional):" msgstr "Ð¨Ð¸Ñ„Ñ€ÑƒÐ²Ð°Ð½Ð½Ñ (необов'Ñзково):" #: ../gtk/data/PdfExportDialog.ui.h:32 ../qt/data/PdfExportDialog.ui.h:36 msgid "Author:" msgstr "Ðвтор:" #: ../gtk/data/PdfExportDialog.ui.h:33 ../qt/data/PdfExportDialog.ui.h:38 msgid "Title:" msgstr "Заголовок:" #: ../gtk/data/PdfExportDialog.ui.h:34 ../qt/data/PdfExportDialog.ui.h:40 msgid "Subject:" msgstr "Тема:" #: ../gtk/data/PdfExportDialog.ui.h:35 ../qt/data/PdfExportDialog.ui.h:37 msgid "Creator:" msgstr "Творець:" #: ../gtk/data/PdfExportDialog.ui.h:36 ../qt/data/PdfExportDialog.ui.h:39 msgid "Producer:" msgstr "Виробник:" #: ../gtk/data/PdfExportDialog.ui.h:37 ../qt/data/PdfExportDialog.ui.h:41 msgid "Keywords:" msgstr "Ключові Ñлова:" #: ../gtk/data/PdfExportDialog.ui.h:38 ../qt/data/PdfExportDialog.ui.h:35 msgid "Additional information (optional):" msgstr "Додаткова Ñ–Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ñ–Ñ (необов'Ñзково):" #: ../gtk/data/PdfExportDialog.ui.h:39 ../qt/data/PdfExportDialog.ui.h:42 msgid "Import from current source" msgstr "Імпортувати з поточного джерела" #: ../gtk/data/PdfExportDialog.ui.h:40 ../qt/data/PdfExportDialog.ui.h:30 msgid "Advanced" msgstr "Розширені" #: ../gtk/data/SearchReplaceFrame.ui.h:1 ../qt/data/SearchReplaceFrame.ui.h:4 msgid "Find" msgstr "Знайти" #: ../gtk/data/SearchReplaceFrame.ui.h:2 ../qt/data/SearchReplaceFrame.ui.h:2 msgid "Replace" msgstr "Замінити" #: ../gtk/data/SearchReplaceFrame.ui.h:3 ../qt/data/SearchReplaceFrame.ui.h:3 msgid "Replace all" msgstr "Замінити вÑе" #: ../gtk/data/SearchReplaceFrame.ui.h:4 ../qt/data/SearchReplaceFrame.ui.h:5 msgid "Find previous" msgstr "Знайти попереднє" #: ../gtk/data/SearchReplaceFrame.ui.h:5 ../qt/data/SearchReplaceFrame.ui.h:6 msgid "Find next" msgstr "Знайти наÑтупне" #: ../gtk/data/SearchReplaceFrame.ui.h:6 ../qt/data/SearchReplaceFrame.ui.h:7 msgid "Match case" msgstr "Враховувати регіÑтр" #: ../gtk/data/SearchReplaceFrame.ui.h:7 #: ../gtk/data/SubstitutionsManager.ui.h:1 ../qt/data/SearchReplaceFrame.ui.h:1 #: ../qt/src/SubstitutionsManager.cc:36 msgid "Substitutions" msgstr "Заміни" #: ../gtk/data/SelectionMenu.ui.h:1 ../qt/src/DisplayerToolSelect.cc:239 msgid "Delete" msgstr "Видалити" #: ../gtk/data/SelectionMenu.ui.h:2 ../qt/src/DisplayerToolSelect.cc:225 msgid "Order:" msgstr "ПорÑдок:" #: ../gtk/data/SelectionMenu.ui.h:3 ../gtk/src/hocr/DisplayerToolHOCR.cc:29 #: ../qt/src/DisplayerToolSelect.cc:240 ../qt/src/hocr/DisplayerToolHOCR.cc:31 msgid "Recognize" msgstr "Розпізнати" #: ../gtk/data/SelectionMenu.ui.h:4 ../qt/src/DisplayerToolSelect.cc:241 msgid "Recognize to clipboard" msgstr "Розпізнати в буфер обміну" #: ../gtk/data/SelectionMenu.ui.h:5 ../qt/src/DisplayerToolSelect.cc:242 msgid "Save as image" msgstr "Зберегти Ñк зображеннÑ" #: ../gtk/data/SubstitutionsManager.ui.h:2 ../qt/src/SubstitutionsManager.cc:38 #: ../qt/src/SubstitutionsManager.cc:39 msgid "Open" msgstr "Відкрити" #: ../gtk/data/SubstitutionsManager.ui.h:3 ../gtk/src/Utils.cc:73 #: ../qt/src/SubstitutionsManager.cc:41 ../qt/src/SubstitutionsManager.cc:42 msgid "Save" msgstr "Зберегти" #: ../gtk/data/SubstitutionsManager.ui.h:4 ../qt/src/SubstitutionsManager.cc:44 #: ../qt/src/SubstitutionsManager.cc:45 msgid "Clear" msgstr "ОчиÑтити" #: ../gtk/data/SubstitutionsManager.ui.h:5 ../qt/data/ConfigDialog.ui.h:16 #: ../qt/src/SubstitutionsManager.cc:47 ../qt/src/SubstitutionsManager.cc:48 msgid "Add" msgstr "Додати" #: ../gtk/data/SubstitutionsManager.ui.h:6 #: ../gtk/src/hocr/OutputEditorHOCR.cc:886 ../qt/data/ConfigDialog.ui.h:17 #: ../qt/src/hocr/OutputEditorHOCR.cc:727 ../qt/src/SubstitutionsManager.cc:50 #: ../qt/src/SubstitutionsManager.cc:51 msgid "Remove" msgstr "Видалити" #: ../gtk/data/SubstitutionsManager.ui.h:7 ../gtk/data/TessdataManager.ui.h:2 msgid "Apply" msgstr "ЗаÑтоÑувати" #: ../gtk/data/SubstitutionsManager.ui.h:8 ../gtk/data/TessdataManager.ui.h:3 msgid "Close" msgstr "Закрити" #: ../gtk/data/TessdataManager.ui.h:1 ../qt/src/TessdataManager.cc:49 msgid "Tessdata Manager" msgstr "Менеджер tessdata" #: ../gtk/data/TessdataManager.ui.h:5 ../qt/src/TessdataManager.cc:51 msgid "Manage installed languages:" msgstr "ÐšÐµÑ€ÑƒÐ²Ð°Ð½Ð½Ñ Ð²Ñтановленими мовами:" #: ../gtk/src/Acquirer.cc:79 ../qt/src/Acquirer.cc:70 msgid "scan.png" msgstr "scan.png" #: ../gtk/src/Acquirer.cc:91 ../qt/src/Acquirer.cc:85 msgid "Images" msgstr "ЗображеннÑ" #: ../gtk/src/Acquirer.cc:92 ../qt/src/Acquirer.cc:86 msgid "Choose Output Filename..." msgstr "Ð”Ð»Ñ Ð·Ð±ÐµÑ€ÐµÐ¶ÐµÐ½Ð½Ñ Ð²ÐºÐ°Ð¶Ñ–Ñ‚ÑŒ ім'Ñ Ñ„Ð°Ð¹Ð»Ñƒ..." #: ../gtk/src/Acquirer.cc:106 ../qt/src/Acquirer.cc:100 msgid "Failed to initialize the scanning backend." msgstr "Помилка ініціалізації програми ÑкануваннÑ." #: ../gtk/src/Acquirer.cc:115 ../qt/src/Acquirer.cc:106 msgid "Scan failed" msgstr "Ð¡ÐºÐ°Ð½ÑƒÐ²Ð°Ð½Ð½Ñ Ð½Ðµ вдалоÑÑ" #: ../gtk/src/Acquirer.cc:133 ../qt/src/Acquirer.cc:122 msgid "No scanners were detected." msgstr "Сканери не виÑвлено." #: ../gtk/src/Acquirer.cc:150 ../gtk/src/Acquirer.cc:168 #: ../qt/src/Acquirer.cc:136 ../qt/src/Acquirer.cc:154 msgid "Starting scan..." msgstr "ЗапуÑк ÑкануваннÑ..." #: ../gtk/src/Acquirer.cc:164 ../qt/src/Acquirer.cc:150 msgid "Opening device..." msgstr "Ð’Ñ–Ð´ÐºÑ€Ð¸Ñ‚Ñ‚Ñ Ð¿Ñ€Ð¸Ñтрою..." #: ../gtk/src/Acquirer.cc:166 ../qt/src/Acquirer.cc:152 msgid "Setting options..." msgstr "Ð’ÑÑ‚Ð°Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ Ð½Ð°Ð»Ð°ÑˆÑ‚ÑƒÐ²Ð°Ð½ÑŒ..." #: ../gtk/src/Acquirer.cc:170 ../qt/src/Acquirer.cc:156 msgid "Getting parameters..." msgstr "ÐžÑ‚Ñ€Ð¸Ð¼Ð°Ð½Ð½Ñ Ð¿Ð°Ñ€Ð°Ð¼ÐµÑ‚Ñ€Ñ–Ð²..." #: ../gtk/src/Acquirer.cc:172 ../qt/src/Acquirer.cc:158 msgid "Transferring data..." msgstr "Передача даних..." #: ../gtk/src/Acquirer.cc:179 ../qt/src/Acquirer.cc:165 msgid "Canceling scan..." msgstr "Відміна ÑкануваннÑ..." #: ../gtk/src/Config.cc:49 ../qt/data/ConfigDialog.ui.h:7 msgid "Filename prefix" msgstr "ÐŸÑ€ÐµÑ„Ñ–ÐºÑ Ñ–Ð¼ÐµÐ½Ñ– файлу" #: ../gtk/src/Config.cc:50 ../qt/data/ConfigDialog.ui.h:8 msgid "Code" msgstr "Код" #: ../gtk/src/Config.cc:51 ../qt/data/ConfigDialog.ui.h:9 msgid "Native name" msgstr "Рідна назва" #: ../gtk/src/Config.cc:109 ../qt/src/Config.cc:108 msgid "Script" msgstr "Шрифт" #: ../gtk/src/CrashHandler.cc:25 ../gtk/src/CrashHandler.cc:41 #: ../qt/src/CrashHandler.cc:36 msgid "Crash Handler" msgstr "Обробник збоїв" #: ../gtk/src/CrashHandler.cc:43 ../qt/src/CrashHandler.cc:31 msgid "Your work has been saved under %1." msgstr "Ваша робота була збережена у %1." #: ../gtk/src/CrashHandler.cc:45 ../qt/src/CrashHandler.cc:33 msgid "There was no unsaved work." msgstr "Ðезбережена робота відÑутнÑ." #: ../gtk/src/CrashHandler.cc:106 ../qt/src/CrashHandler.cc:62 msgid "Failed to obtain backtrace. Is gdb installed?" msgstr "Зворотнє траÑÑƒÐ²Ð°Ð½Ð½Ñ Ð½Ðµ вдалоÑÑ. Чи вÑтановлено gdb?" #: ../gtk/src/Displayer.cc:232 ../qt/src/Displayer.cc:174 msgid "Failed to load image" msgstr "Ðе вдалоÑÑ Ð·Ð°Ð²Ð°Ð½Ñ‚Ð°Ð¶Ð¸Ñ‚Ð¸ зображеннÑ" #: ../gtk/src/Displayer.cc:232 ../qt/src/Displayer.cc:174 msgid "" "The file might not be an image or be corrupt:\n" "%1" msgstr "" "Файл, можливо, не Ñ” зображеннÑм або він пошкоджений:\n" "%1" #: ../gtk/src/DisplayerToolSelect.cc:138 ../qt/src/DisplayerToolSelect.cc:135 msgid "PNG Images" msgstr "Ð—Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ñ PNG" #: ../gtk/src/DisplayerToolSelect.cc:139 ../qt/src/DisplayerToolSelect.cc:135 msgid "Save Selection Image" msgstr "Зберегти виділене" #: ../gtk/src/DisplayerToolSelect.cc:139 ../qt/src/DisplayerToolSelect.cc:135 msgid "selection.png" msgstr "selection.png" #: ../gtk/src/DisplayerToolSelect.cc:146 ../qt/src/DisplayerToolSelect.cc:142 msgid "Recognize all" msgstr "Розпізнати вÑе" #: ../gtk/src/DisplayerToolSelect.cc:146 ../qt/src/DisplayerToolSelect.cc:142 msgid "Recognize selection" msgstr "Розпізнати виділене" #: ../gtk/src/DisplayerToolSelect.cc:186 ../qt/src/DisplayerToolSelect.cc:182 msgid "Performing layout analysis" msgstr "ВиконуєтьÑÑ Ð°Ð½Ð°Ð»Ñ–Ð· макету Ñторінки" #: ../gtk/src/FileDialogs.cc:235 msgid "" "A file named \"%1\" already exists. Are you sure you want to overwrite it?" msgstr "" "Файл з ім'Ñм \"%1\" вже Ñ–Ñнує. Ви впевнені, що хочете його перезапиÑати?" #: ../gtk/src/FileDialogs.cc:237 msgid "Overwrite File?" msgstr "ПерезапиÑати файл?" #: ../gtk/src/hocr/HOCRDocument.cc:611 ../gtk/src/hocr/OutputEditorHOCR.cc:266 #: ../qt/src/hocr/OutputEditorHOCR.cc:229 msgid "Page" msgstr "Сторінка" #: ../gtk/src/hocr/HOCRDocument.cc:613 ../qt/src/hocr/HOCRDocument.cc:530 msgid "Text block" msgstr "Блок текÑту" #: ../gtk/src/hocr/HOCRDocument.cc:615 ../gtk/src/hocr/OutputEditorHOCR.cc:272 #: ../qt/src/hocr/HOCRDocument.cc:532 ../qt/src/hocr/OutputEditorHOCR.cc:231 msgid "Paragraph" msgstr "Ðбзац" #: ../gtk/src/hocr/HOCRDocument.cc:617 ../qt/src/hocr/HOCRDocument.cc:534 msgid "Textline" msgstr "РÑдок текÑту" #: ../gtk/src/hocr/HOCRDocument.cc:621 ../qt/src/hocr/HOCRDocument.cc:538 msgid "Graphic" msgstr "Графіка" #: ../gtk/src/hocr/HOCROdtExporter.cc:65 ../gtk/src/hocr/HOCRPdfExporter.cc:489 #: ../gtk/src/hocr/HOCRTextExporter.cc:34 #: ../gtk/src/hocr/OutputEditorHOCR.cc:963 ../gtk/src/OutputEditorText.cc:272 #: ../qt/src/hocr/HOCROdtExporter.cc:50 ../qt/src/hocr/HOCRPdfExporter.cc:478 #: ../qt/src/hocr/HOCRTextExporter.cc:36 ../qt/src/hocr/OutputEditorHOCR.cc:830 #: ../qt/src/OutputEditorText.cc:238 msgid "output" msgstr "результати" #: ../gtk/src/hocr/HOCROdtExporter.cc:68 ../qt/src/hocr/HOCROdtExporter.cc:53 msgid "OpenDocument Text Documents" msgstr "ТекÑтові документи OpenDocument" #: ../gtk/src/hocr/HOCROdtExporter.cc:69 ../qt/src/hocr/HOCROdtExporter.cc:53 msgid "Save ODT Output..." msgstr "Зберегти результати в ODT..." #: ../gtk/src/hocr/HOCROdtExporter.cc:77 ../gtk/src/hocr/HOCROdtExporter.cc:342 #: ../gtk/src/hocr/HOCRPdfExporter.cc:619 #: ../gtk/src/hocr/HOCRTextExporter.cc:46 ../qt/src/hocr/HOCROdtExporter.cc:61 #: ../qt/src/hocr/HOCRPdfExporter.cc:609 ../qt/src/hocr/HOCRTextExporter.cc:47 msgid "Export failed" msgstr "Ðе вдалоÑÑ ÐµÐºÑпортувати" #: ../gtk/src/hocr/HOCROdtExporter.cc:77 ../gtk/src/hocr/HOCROdtExporter.cc:342 #: ../qt/src/hocr/HOCROdtExporter.cc:61 msgid "The ODT export failed: unable to write output file." msgstr "Ðе вдалоÑÑ ÐµÐºÑпортувати ODT: неможливо запиÑати цільовий файл." #: ../gtk/src/hocr/HOCROdtExporter.cc:336 ../qt/src/hocr/HOCROdtExporter.cc:254 msgid "Exporting to ODT..." msgstr "ЕкÑпорт у ODT..." #: ../gtk/src/hocr/HOCRPdfExporter.cc:283 ../qt/src/hocr/HOCRPdfExporter.cc:365 msgid "Same as source" msgstr "Як джерело" #: ../gtk/src/hocr/HOCRPdfExporter.cc:286 ../qt/src/hocr/HOCRPdfExporter.cc:366 msgid "Custom" msgstr "КориÑтувацький" #: ../gtk/src/hocr/HOCRPdfExporter.cc:300 ../qt/src/hocr/HOCRPdfExporter.cc:362 msgid "cm" msgstr "Ñм" #: ../gtk/src/hocr/HOCRPdfExporter.cc:303 ../qt/src/hocr/HOCRPdfExporter.cc:363 msgid "in" msgstr "дюйм" #: ../gtk/src/hocr/HOCRPdfExporter.cc:319 ../qt/src/hocr/HOCRPdfExporter.cc:353 msgid "Monochrome" msgstr "Монохромний" #: ../gtk/src/hocr/HOCRPdfExporter.cc:328 ../qt/src/hocr/HOCRPdfExporter.cc:355 msgid "Threshold (closest color)" msgstr "Поріг (найближчий колір)" #: ../gtk/src/hocr/HOCRPdfExporter.cc:331 ../qt/src/hocr/HOCRPdfExporter.cc:356 msgid "Diffuse" msgstr "РозÑÑ–Ñний" #: ../gtk/src/hocr/HOCRPdfExporter.cc:340 ../qt/src/hocr/HOCRPdfExporter.cc:357 msgid "Zip (lossless)" msgstr "Zip (без втрат)" #: ../gtk/src/hocr/HOCRPdfExporter.cc:344 ../qt/src/hocr/HOCRPdfExporter.cc:358 msgid "CCITT Group 4 (lossless)" msgstr "CCITT Group 4 (без втрат)" #: ../gtk/src/hocr/HOCRPdfExporter.cc:348 ../qt/src/hocr/HOCRPdfExporter.cc:359 msgid "Jpeg (lossy)" msgstr "Jpeg (з втратами)" #: ../gtk/src/hocr/HOCRPdfExporter.cc:493 ../qt/src/hocr/HOCRPdfExporter.cc:482 msgid "PDF Files" msgstr "PDF-файли" #: ../gtk/src/hocr/HOCRPdfExporter.cc:494 ../qt/src/hocr/HOCRPdfExporter.cc:482 msgid "Save PDF Output..." msgstr "Зберегти результати в PDF..." #: ../gtk/src/hocr/HOCRPdfExporter.cc:500 ../qt/src/hocr/HOCRPdfExporter.cc:488 msgid "Invalid Output" msgstr "ÐеприпуÑтимий результат" #: ../gtk/src/hocr/HOCRPdfExporter.cc:500 ../qt/src/hocr/HOCRPdfExporter.cc:488 msgid "Cannot overwrite a file which is a source image of this document." msgstr "Ðеможливо перезапиÑати файл, Ñкий Ñ” вихідним Ð´Ð»Ñ Ñ†ÑŒÐ¾Ð³Ð¾ документу." #: ../gtk/src/hocr/HOCRPdfExporter.cc:516 ../qt/src/hocr/HOCRPdfExporter.cc:511 msgid "Failed to create output" msgstr "Ðе вдалоÑÑ Ñтворити результат" #: ../gtk/src/hocr/HOCRPdfExporter.cc:516 ../qt/src/hocr/HOCRPdfExporter.cc:511 msgid "Failed to create output. The returned error was: %1" msgstr "Ðе вдалоÑÑ Ñтворити результат. Помилка: %1" #: ../gtk/src/hocr/HOCRPdfExporter.cc:558 ../qt/src/hocr/HOCRPdfExporter.cc:551 msgid "The operation was cancelled" msgstr "Операцію було ÑкаÑовано" #: ../gtk/src/hocr/HOCRPdfExporter.cc:607 ../qt/src/hocr/HOCRPdfExporter.cc:597 msgid "Failed to render page %1" msgstr "Ðе вдалоÑÑ Ð²Ñ–Ð·ÑƒÐ°Ð»Ñ–Ð·ÑƒÐ²Ð°Ñ‚Ð¸ Ñторінку %1" #: ../gtk/src/hocr/HOCRPdfExporter.cc:614 ../qt/src/hocr/HOCRPdfExporter.cc:604 msgid "Exporting to PDF..." msgstr "ЕкÑпортую у PDF..." #: ../gtk/src/hocr/HOCRPdfExporter.cc:619 ../qt/src/hocr/HOCRPdfExporter.cc:609 msgid "The PDF export failed: %1." msgstr "Ðе вдалоÑÑ ÐµÐºÑпортувати у PDF: %1." #: ../gtk/src/hocr/HOCRPdfExporter.cc:673 ../qt/src/hocr/HOCRPdfExporter.cc:662 msgid "The PDF library could not load the font '%1'." msgstr "Бібліотека PDF не може завантажити шрифт '%1'." #: ../gtk/src/hocr/HOCRTextExporter.cc:37 ../gtk/src/OutputEditorText.cc:274 #: ../qt/src/hocr/HOCRTextExporter.cc:39 ../qt/src/OutputEditorText.cc:239 msgid "Text Files" msgstr "ТекÑтові файли" #: ../gtk/src/hocr/HOCRTextExporter.cc:38 ../qt/src/hocr/HOCRTextExporter.cc:39 msgid "Save Text Output..." msgstr "Зберегти результати Ñк текÑÑ‚..." #: ../gtk/src/hocr/HOCRTextExporter.cc:46 ../qt/src/hocr/HOCRTextExporter.cc:47 msgid "The text export failed: unable to write output file." msgstr "Ðе вдалоÑÑ ÐµÐºÑпортувати текÑÑ‚: неможливо запиÑати цільовий файл." #: ../gtk/src/hocr/OutputEditorHOCR.cc:269 #: ../qt/src/hocr/OutputEditorHOCR.cc:230 msgid "Block" msgstr "Блок" #: ../gtk/src/hocr/OutputEditorHOCR.cc:275 #: ../qt/src/hocr/OutputEditorHOCR.cc:232 msgid "Line" msgstr "РÑдок" #: ../gtk/src/hocr/OutputEditorHOCR.cc:278 #: ../qt/src/hocr/OutputEditorHOCR.cc:233 msgid "Word" msgstr "Слово" #: ../gtk/src/hocr/OutputEditorHOCR.cc:281 #: ../qt/src/hocr/OutputEditorHOCR.cc:234 msgid "Misspelled word" msgstr "Слово з помилкою" #: ../gtk/src/hocr/OutputEditorHOCR.cc:435 #: ../qt/src/hocr/OutputEditorHOCR.cc:317 msgid "" "The following pages could not be processed:\n" "%1" msgstr "" "Ðеможливо опрацювати наÑтупні Ñторінки:\n" "%1" #: ../gtk/src/hocr/OutputEditorHOCR.cc:436 #: ../qt/src/hocr/OutputEditorHOCR.cc:318 msgid "Recognition errors" msgstr "Помилки розпізнаваннÑ" #: ../gtk/src/hocr/OutputEditorHOCR.cc:594 #: ../qt/src/hocr/OutputEditorHOCR.cc:500 #: ../qt/src/hocr/OutputEditorHOCR.cc:512 msgid "Multiple values" msgstr "Кілька значень" #. Merging allowed #: ../gtk/src/hocr/OutputEditorHOCR.cc:778 #: ../qt/src/hocr/OutputEditorHOCR.cc:641 msgid "Merge" msgstr "Об'єднати" #: ../gtk/src/hocr/OutputEditorHOCR.cc:786 #: ../gtk/src/hocr/OutputEditorHOCR.cc:877 #: ../qt/src/hocr/OutputEditorHOCR.cc:643 #: ../qt/src/hocr/OutputEditorHOCR.cc:725 msgid "Split from parent" msgstr "Виокремити з батьківÑького об'єкту" #. Swapping allowed #: ../gtk/src/hocr/OutputEditorHOCR.cc:797 #: ../qt/src/hocr/OutputEditorHOCR.cc:647 msgid "Swap" msgstr "ОбмінÑти" #: ../gtk/src/hocr/OutputEditorHOCR.cc:821 #: ../qt/src/hocr/OutputEditorHOCR.cc:693 msgid "Add graphic region" msgstr "Додати облаÑть графіки" #: ../gtk/src/hocr/OutputEditorHOCR.cc:824 #: ../qt/src/hocr/OutputEditorHOCR.cc:694 msgid "Add text block" msgstr "Додати текÑтовий блок" #: ../gtk/src/hocr/OutputEditorHOCR.cc:828 #: ../qt/src/hocr/OutputEditorHOCR.cc:696 msgid "Add paragraph" msgstr "Додати абзац" #: ../gtk/src/hocr/OutputEditorHOCR.cc:832 #: ../qt/src/hocr/OutputEditorHOCR.cc:698 msgid "Add line" msgstr "Додати Ñ€Ñдок" #: ../gtk/src/hocr/OutputEditorHOCR.cc:836 #: ../qt/src/hocr/OutputEditorHOCR.cc:700 msgid "Add word" msgstr "Додати Ñлово" #: ../gtk/src/hocr/OutputEditorHOCR.cc:852 #: ../qt/src/hocr/OutputEditorHOCR.cc:710 msgid "No suggestions" msgstr "Ðемає пропозицій" #: ../gtk/src/hocr/OutputEditorHOCR.cc:858 #: ../qt/src/hocr/OutputEditorHOCR.cc:714 msgid "Add to dictionary" msgstr "Додати у Ñловник" #: ../gtk/src/hocr/OutputEditorHOCR.cc:864 #: ../qt/src/hocr/OutputEditorHOCR.cc:716 msgid "Ignore word" msgstr "Ігнорувати Ñлово" #: ../gtk/src/hocr/OutputEditorHOCR.cc:926 #: ../gtk/src/hocr/OutputEditorHOCR.cc:965 #: ../qt/src/hocr/OutputEditorHOCR.cc:795 #: ../qt/src/hocr/OutputEditorHOCR.cc:832 msgid "hOCR HTML Files" msgstr "Файли hOCR HTML" #: ../gtk/src/hocr/OutputEditorHOCR.cc:927 #: ../qt/src/hocr/OutputEditorHOCR.cc:795 msgid "Open hOCR File" msgstr "Відкрити файл hORC" #: ../gtk/src/hocr/OutputEditorHOCR.cc:936 #: ../qt/src/hocr/OutputEditorHOCR.cc:802 msgid "Failed to open file" msgstr "Ðе вдалоÑÑ Ð²Ñ–Ð´ÐºÑ€Ð¸Ñ‚Ð¸ файл" #: ../gtk/src/hocr/OutputEditorHOCR.cc:936 #: ../qt/src/hocr/OutputEditorHOCR.cc:802 msgid "The file could not be opened: %1." msgstr "Файл не можна відкрити :%1." #: ../gtk/src/hocr/OutputEditorHOCR.cc:945 #: ../qt/src/hocr/OutputEditorHOCR.cc:809 msgid "Invalid hOCR file" msgstr "Ðекоректний файл hORC" #: ../gtk/src/hocr/OutputEditorHOCR.cc:945 #: ../qt/src/hocr/OutputEditorHOCR.cc:809 msgid "The file does not appear to contain valid hOCR HTML: %1" msgstr "Файл не міÑтить коректного вміÑту hORC HTML: %1" #: ../gtk/src/hocr/OutputEditorHOCR.cc:966 #: ../qt/src/hocr/OutputEditorHOCR.cc:832 msgid "Save hOCR Output..." msgstr "Зберегти результати в hOCR..." #: ../gtk/src/hocr/OutputEditorHOCR.cc:973 ../gtk/src/OutputEditorText.cc:282 #: ../qt/src/hocr/OutputEditorHOCR.cc:839 ../qt/src/OutputEditorText.cc:246 msgid "Failed to save output" msgstr "Зберегти результати не вдалоÑÑ" #: ../gtk/src/hocr/OutputEditorHOCR.cc:973 ../gtk/src/OutputEditorText.cc:282 #: ../qt/src/hocr/OutputEditorHOCR.cc:839 ../qt/src/OutputEditorText.cc:246 msgid "Check that you have writing permissions in the selected folder." msgstr "ПереконайтеÑÑ, що у Ð²Ð°Ñ Ñ” дозвіл на Ð·Ð°Ð¿Ð¸Ñ Ð² обрану теку." #: ../gtk/src/hocr/OutputEditorHOCR.cc:1035 ../gtk/src/OutputEditorText.cc:296 #: ../qt/src/hocr/OutputEditorHOCR.cc:894 ../qt/src/OutputEditorText.cc:259 msgid "Output not saved" msgstr "Результати не збережено" #: ../gtk/src/hocr/OutputEditorHOCR.cc:1035 ../gtk/src/OutputEditorText.cc:296 #: ../qt/src/hocr/OutputEditorHOCR.cc:894 ../qt/src/OutputEditorText.cc:259 msgid "Save output before proceeding?" msgstr "Зберегти результати, перш ніж продовжити?" #: ../gtk/src/hocr/OutputEditorHOCR.cc:1156 ../gtk/src/OutputEditorText.cc:184 #: ../qt/src/hocr/OutputEditorHOCR.cc:991 ../qt/src/OutputEditorText.cc:152 msgid "Replacing..." msgstr "Заміна..." #: ../gtk/src/hocr/OutputEditorHOCR.cc:1181 ../gtk/src/OutputEditorText.cc:192 #: ../qt/src/hocr/OutputEditorHOCR.cc:1014 ../qt/src/OutputEditorText.cc:160 msgid "Applying substitutions..." msgstr "ЗаÑтоÑÑƒÐ²Ð°Ð½Ð½Ñ Ð¿Ñ–Ð´Ñтановок..." #: ../gtk/src/MainWindow.cc:131 ../qt/src/MainWindow.cc:295 msgid "Using tesseract" msgstr "З викориÑтаннÑм tesseract" #: ../gtk/src/MainWindow.cc:178 ../qt/src/MainWindow.cc:194 msgid "Select an image to begin..." msgstr "Щоб розпочати, виберіть зображеннÑ..." #: ../gtk/src/MainWindow.cc:293 ../qt/src/MainWindow.cc:278 msgid "Multiple sources" msgstr "Кілька джерел" #: ../gtk/src/MainWindow.cc:295 ../qt/src/MainWindow.cc:280 msgid "Ready" msgstr "Готовий" #: ../gtk/src/MainWindow.cc:442 ../qt/src/MainWindow.cc:423 msgid "New version" msgstr "Ðова верÑÑ–Ñ" #: ../gtk/src/MainWindow.cc:442 ../qt/src/MainWindow.cc:423 msgid "gImageReader %1 is available" msgstr "ДоÑтупний gImageReader %1" #: ../gtk/src/MainWindow.cc:443 ../qt/src/MainWindow.cc:424 msgid "Download" msgstr "Завантажити" #: ../gtk/src/MainWindow.cc:444 ../qt/src/MainWindow.cc:425 msgid "Changelog" msgstr "СпиÑок змін" #: ../gtk/src/MainWindow.cc:445 ../qt/src/MainWindow.cc:426 msgid "Don't notify again" msgstr "Більше не Ñповіщувати" #: ../gtk/src/MainWindow.cc:466 ../qt/src/MainWindow.cc:474 msgid "Don't show again" msgstr "Більше не показувати" #: ../gtk/src/MainWindow.cc:467 ../gtk/src/MainWindow.cc:480 #: ../qt/src/MainWindow.cc:475 msgid "Install" msgstr "Ð’Ñтановити" #: ../gtk/src/MainWindow.cc:487 ../qt/src/MainWindow.cc:487 msgid "Spelling dictionary missing" msgstr "Орфографічний Ñловник відÑутній" #: ../gtk/src/MainWindow.cc:487 ../qt/src/MainWindow.cc:487 msgid "The spellcheck dictionary for %1 is not installed" msgstr "Орфографічний Ñловник Ð´Ð»Ñ %1 не вÑтановлено" #: ../gtk/src/MainWindow.cc:494 ../gtk/src/MainWindow.cc:523 #: ../qt/src/MainWindow.cc:493 msgid "Installing spelling dictionary for '%1'" msgstr "Ð’ÑтановлюєтьÑÑ Ð¾Ñ€Ñ„Ð¾Ð³Ñ€Ð°Ñ„Ñ–Ñ‡Ð½Ð¸Ð¹ Ñловник Ð´Ð»Ñ '%1'" #: ../gtk/src/MainWindow.cc:515 ../gtk/src/MainWindow.cc:536 #: ../gtk/src/MainWindow.cc:544 ../gtk/src/MainWindow.cc:592 #: ../gtk/src/MainWindow.cc:597 ../gtk/src/TessdataManager.cc:60 #: ../gtk/src/TessdataManager.cc:70 ../gtk/src/TessdataManager.cc:339 #: ../qt/src/MainWindow.cc:512 ../qt/src/MainWindow.cc:525 #: ../qt/src/MainWindow.cc:534 ../qt/src/MainWindow.cc:578 #: ../qt/src/MainWindow.cc:583 ../qt/src/TessdataManager.cc:74 #: ../qt/src/TessdataManager.cc:84 ../qt/src/TessdataManager.cc:315 msgid "Error" msgstr "Помилка" #: ../gtk/src/MainWindow.cc:515 ../qt/src/MainWindow.cc:512 msgid "Failed to install spelling dictionary: %1" msgstr "Ðе вдалоÑÑ Ð²Ñтановити орфографічний Ñловник: %1" #: ../gtk/src/MainWindow.cc:536 ../qt/src/MainWindow.cc:525 msgid "Failed to create directory for spelling dictionaries." msgstr "Ðе вдалоÑÑ Ñтворити теку Ð´Ð»Ñ Ð¾Ñ€Ñ„Ð¾Ð³Ñ€Ð°Ñ„Ñ–Ñ‡Ð½Ð¸Ñ… Ñловників." #: ../gtk/src/MainWindow.cc:544 ../qt/src/MainWindow.cc:534 msgid "Could not read %1: %2." msgstr "Ðеможливо прочитати %1: %2." #: ../gtk/src/MainWindow.cc:571 ../qt/src/MainWindow.cc:558 msgid "Downloading '%1'..." msgstr "ЗавантажуєтьÑÑ '%1'..." #: ../gtk/src/MainWindow.cc:592 ../qt/src/MainWindow.cc:578 msgid "" "The following dictionaries could not be downloaded:\n" "%1\n" "\n" "Check the connectivity and directory permissions.\n" "Hint: If you don't have write permissions in system folders, you can switch " "to user paths in the settings dialog." msgstr "" "Ðе вдалоÑÑ Ð·Ð°Ð²Ð°Ð½Ñ‚Ð°Ð¶Ð¸Ñ‚Ð¸ наÑтупні Ñловники:\n" "%1\n" "\n" "Перевірте мережеве з'Ñ”Ð´Ð½Ð°Ð½Ð½Ñ Ñ‚Ð° права доÑтупу до теки.\n" "Порада: Якщо ви не маєте дозволу на Ð·Ð°Ð¿Ð¸Ñ Ñƒ ÑиÑтемні теки, ви можете " "перемкнутиÑÑ Ð½Ð° кориÑтувацькі шлÑхи у ÐалаштуваннÑÑ…." #: ../gtk/src/MainWindow.cc:595 ../qt/src/MainWindow.cc:581 msgid "Dictionaries installed" msgstr "Словники вÑтановлено" #: ../gtk/src/MainWindow.cc:595 msgid "" "The following dictionaries were installed:\n" "%1" msgstr "" "Було вÑтановлено наÑтупні Ñловники:\n" "%1" #: ../gtk/src/MainWindow.cc:597 ../qt/src/MainWindow.cc:583 msgid "No spelling dictionaries found for '%1'." msgstr "Орфографічні Ñловники Ð´Ð»Ñ '%1' не знайдено." #: ../gtk/src/OutputEditorText.cc:154 ../qt/src/OutputEditorText.cc:137 msgid "Stripping line breaks..." msgstr "Ð’Ð¸Ð´Ð°Ð»ÐµÐ½Ð½Ñ Ñ€Ð¾Ð·Ñ€Ð¸Ð²Ñ–Ð² Ñ€Ñдків..." #: ../gtk/src/OutputEditorText.cc:162 msgid "Check spelling" msgstr "Перевірити орфографію" #: ../gtk/src/OutputEditorText.cc:231 ../qt/src/OutputEditorText.cc:196 msgid "File: %1" msgstr "Файл: %1" #: ../gtk/src/OutputEditorText.cc:234 ../qt/src/OutputEditorText.cc:199 msgid "Page: %1" msgstr "Сторінка: %1" #: ../gtk/src/OutputEditorText.cc:247 ../gtk/src/Recognizer.cc:471 #: ../qt/src/Recognizer.cc:462 msgid "" "\n" "[Failed to recognize page %1]\n" msgstr "" "\n" "[Ðе вдалоÑÑ Ñ€Ð¾Ð·Ð¿Ñ–Ð·Ð½Ð°Ñ‚Ð¸ Ñторінку %1]\n" #: ../gtk/src/OutputEditorText.cc:275 ../qt/src/OutputEditorText.cc:239 msgid "Save Output..." msgstr "Зберегти результати..." #: ../gtk/src/Recognizer.cc:179 ../qt/src/Recognizer.cc:172 msgid "No languages available" msgstr "Ðемає доÑтупних мов" #: ../gtk/src/Recognizer.cc:179 ../qt/src/Recognizer.cc:172 msgid "" "No tesseract languages are available for use. Recognition will not work." msgstr "" "Ðемає доÑтупних Ð´Ð»Ñ Ð²Ð¸ÐºÐ¾Ñ€Ð¸ÑÑ‚Ð°Ð½Ð½Ñ Ð¼Ð¾Ð² tesseract. Ð Ð¾Ð·Ð¿Ñ–Ð·Ð½Ð°Ð²Ð°Ð½Ð½Ñ Ð½Ðµ працюватиме." #: ../gtk/src/Recognizer.cc:233 ../qt/src/Recognizer.cc:232 msgid "Multilingual" msgstr "Багатомовний" #: ../gtk/src/Recognizer.cc:285 ../qt/src/Recognizer.cc:277 msgid "Automatic page segmentation" msgstr "Ðвтоматична ÑÐµÐ³Ð¼ÐµÐ½Ñ‚Ð°Ñ†Ñ–Ñ Ñторінки" #: ../gtk/src/Recognizer.cc:286 ../qt/src/Recognizer.cc:278 msgid "Page segmentation with orientation and script detection" msgstr "Ð¡ÐµÐ³Ð¼ÐµÐ½Ñ‚Ð°Ñ†Ñ–Ñ Ñторінки з визначеннÑм орієнтації та шрифту" #: ../gtk/src/Recognizer.cc:287 ../qt/src/Recognizer.cc:279 msgid "Assume single column of text" msgstr "Вважати текÑтом в один Ñтовпець" #: ../gtk/src/Recognizer.cc:288 ../qt/src/Recognizer.cc:280 msgid "Assume single block of vertically aligned text" msgstr "Вважати блоком текÑту, вирівнÑного вертикально" #: ../gtk/src/Recognizer.cc:289 ../qt/src/Recognizer.cc:281 msgid "Assume a single uniform block of text" msgstr "Вважати однорідним блоком текÑту" #: ../gtk/src/Recognizer.cc:290 ../qt/src/Recognizer.cc:282 msgid "Assume a line of text" msgstr "Вважати Ñ€Ñдком текÑту" #: ../gtk/src/Recognizer.cc:291 ../qt/src/Recognizer.cc:283 msgid "Assume a single word" msgstr "Вважати окремим Ñловом" #: ../gtk/src/Recognizer.cc:292 ../qt/src/Recognizer.cc:284 msgid "Assume a single word in a circle" msgstr "Вважати окремим Ñловом в колі" #: ../gtk/src/Recognizer.cc:293 ../qt/src/Recognizer.cc:285 msgid "Sparse text in no particular order" msgstr "Розріджений неупорÑдочений текÑÑ‚" #: ../gtk/src/Recognizer.cc:294 ../qt/src/Recognizer.cc:286 msgid "Sparse text with orientation and script detection" msgstr "Розріджений текÑÑ‚ з визначеннÑм орієнтації та шрифту" #: ../gtk/src/Recognizer.cc:309 ../qt/src/Recognizer.cc:297 msgid "Page segmentation mode" msgstr "Режим Ñегментації Ñторінки" #: ../gtk/src/Recognizer.cc:313 ../qt/src/Recognizer.cc:300 msgid "Character whitelist / blacklist..." msgstr "" #: ../gtk/src/Recognizer.cc:319 ../qt/src/Recognizer.cc:305 msgid "Manage languages..." msgstr "Керувати мовами..." #: ../gtk/src/Recognizer.cc:375 ../qt/src/Recognizer.cc:369 msgid "Current selection" msgstr "Поточне виділеннÑ" #: ../gtk/src/Recognizer.cc:465 ../qt/src/Recognizer.cc:455 msgid "Recognizing page %1 (%2 of %3)" msgstr "Ð Ð¾Ð·Ð¿Ñ–Ð·Ð½Ð°Ð²Ð°Ð½Ð½Ñ Ñторінки %1 (%2 із %3)" #: ../gtk/src/Recognizer.cc:470 ../qt/src/Recognizer.cc:461 msgid "" "\n" "- Page %1: failed to render page" msgstr "" "\n" "- Сторінка %1: не вдалоÑÑ Ð²Ñ–Ð·ÑƒÐ°Ð»Ñ–Ð·ÑƒÐ²Ð°Ñ‚Ð¸ Ñторінку" #: ../gtk/src/Recognizer.cc:501 ../gtk/src/Recognizer.cc:531 #: ../gtk/src/Recognizer.cc:544 ../qt/src/Recognizer.cc:491 #: ../qt/src/Recognizer.cc:521 ../qt/src/Recognizer.cc:534 msgid "Recognizing..." msgstr "Триває розпізнаваннÑ..." #: ../gtk/src/Recognizer.cc:505 ../gtk/src/Recognizer.cc:514 #: ../qt/src/Recognizer.cc:495 ../qt/src/Recognizer.cc:504 msgid "Recognition errors occurred" msgstr "СталиÑÑ Ð¿Ð¾Ð¼Ð¸Ð»ÐºÐ¸ при розпізнаванні" #: ../gtk/src/Recognizer.cc:505 ../qt/src/Recognizer.cc:495 msgid "The following errors occurred:%1" msgstr "СталиÑÑ Ð½Ð°Ñтупні помилки:%1" #: ../gtk/src/Recognizer.cc:514 ../qt/src/Recognizer.cc:504 msgid "Failed to initialize tesseract" msgstr "Помилка ініціалізації tesseract" #: ../gtk/src/scanner/ScannerSane.cc:84 ../gtk/src/scanner/ScannerTwain.cc:288 #: ../qt/src/scanner/ScannerSane.cc:85 ../qt/src/scanner/ScannerTwain.cc:286 msgid "Scan canceled" msgstr "Ð¡ÐºÐ°Ð½ÑƒÐ²Ð°Ð½Ð½Ñ ÑкаÑовано" #: ../gtk/src/scanner/ScannerSane.cc:159 ../gtk/src/scanner/ScannerTwain.cc:186 #: ../qt/src/scanner/ScannerSane.cc:159 ../qt/src/scanner/ScannerTwain.cc:178 msgid "No scanner specified" msgstr "Сканер не вказано" #: ../gtk/src/scanner/ScannerSane.cc:168 ../gtk/src/scanner/ScannerTwain.cc:195 #: ../qt/src/scanner/ScannerSane.cc:168 ../qt/src/scanner/ScannerTwain.cc:187 msgid "Unable to connect to scanner" msgstr "Ðеможливо під'єднатиÑÑ Ð´Ð¾ Ñканера" #: ../gtk/src/scanner/ScannerSane.cc:403 ../gtk/src/scanner/ScannerTwain.cc:266 #: ../gtk/src/scanner/ScannerTwain.cc:292 ../qt/src/scanner/ScannerSane.cc:403 #: ../qt/src/scanner/ScannerTwain.cc:258 ../qt/src/scanner/ScannerTwain.cc:290 msgid "Unable to start scan" msgstr "Ðеможливо розпочати ÑкануваннÑ" #: ../gtk/src/scanner/ScannerSane.cc:411 ../gtk/src/scanner/ScannerSane.cc:461 #: ../gtk/src/scanner/ScannerTwain.cc:318 ../qt/src/scanner/ScannerSane.cc:411 #: ../qt/src/scanner/ScannerSane.cc:461 ../qt/src/scanner/ScannerTwain.cc:316 msgid "Error communicating with scanner" msgstr "Помилка зв'Ñзку зі Ñканером" #: ../gtk/src/scanner/ScannerSane.cc:520 ../qt/src/scanner/ScannerSane.cc:517 msgid "Failed to save image" msgstr "Ðе вдалоÑÑ Ð·Ð±ÐµÑ€ÐµÐ³Ñ‚Ð¸ зображеннÑ" #: ../gtk/src/scanner/ScannerSane.cc:800 ../qt/src/scanner/ScannerSane.cc:797 msgid "Operation is cancelled." msgstr "Операцію ÑкаÑовано." #: ../gtk/src/scanner/ScannerSane.cc:802 ../qt/src/scanner/ScannerSane.cc:799 msgid "Device is busy." msgstr "ПриÑтрій зайнÑтий." #: ../gtk/src/scanner/ScannerSane.cc:804 ../qt/src/scanner/ScannerSane.cc:801 msgid "Cover is opened." msgstr "Кришка відкрита." #: ../gtk/src/scanner/ScannerSane.cc:806 ../qt/src/scanner/ScannerSane.cc:803 msgid "Document feeder jammed." msgstr "Подавач документів заклинило." #: ../gtk/src/scanner/ScannerSane.cc:808 ../qt/src/scanner/ScannerSane.cc:805 msgid "Document feeder out of documents." msgstr "Подавач документів порожній." #: ../gtk/src/scanner/ScannerSane.cc:810 ../qt/src/scanner/ScannerSane.cc:807 msgid "Access to scanner is denied." msgstr "ДоÑтуп до Ñканеру заборонено." #: ../gtk/src/SourceManager.cc:118 ../qt/src/SourceManager.cc:124 msgid "PDFs with text" msgstr "PDF-файли з текÑтом" #: ../gtk/src/SourceManager.cc:118 ../qt/src/SourceManager.cc:124 msgid "" "These PDF files already contain text:\n" "%1" msgstr "" "Ці PDF-файли вже міÑÑ‚Ñть текÑÑ‚:\n" "%1" #: ../gtk/src/SourceManager.cc:127 ../qt/src/SourceManager.cc:132 msgid "Unable to open files" msgstr "Ðеможливо відкрити файли" #: ../gtk/src/SourceManager.cc:127 ../qt/src/SourceManager.cc:132 msgid "The following files could not be opened:%1" msgstr "Ðеможливо відкрити такі файли:%1" #: ../gtk/src/SourceManager.cc:141 ../qt/src/SourceManager.cc:143 msgid "Enter password for file '%1':" msgstr "Введіть пароль Ð´Ð»Ñ Ñ„Ð°Ð¹Ð»Ñƒ '%1':" #: ../gtk/src/SourceManager.cc:197 ../qt/src/SourceManager.cc:214 msgid "Images and PDFs" msgstr "Ð—Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð½Ñ Ñ– файли PDF" #: ../gtk/src/SourceManager.cc:202 ../qt/src/SourceManager.cc:215 msgid "Select Files" msgstr "Виберіть файли" #: ../gtk/src/SourceManager.cc:208 ../qt/src/SourceManager.cc:226 msgid "Clipboard Error" msgstr "Помилка буфера обміну" #: ../gtk/src/SourceManager.cc:208 ../qt/src/SourceManager.cc:226 msgid "Failed to read the clipboard." msgstr "Ðе вдалоÑÑ Ð¿Ñ€Ð¾Ñ‡Ð¸Ñ‚Ð°Ñ‚Ð¸ вміÑÑ‚ буфера обміну." #: ../gtk/src/SourceManager.cc:212 ../qt/src/SourceManager.cc:230 #: ../qt/src/SourceManager.cc:236 msgid "Pasted %1" msgstr "Ð’Ñтавлено %1" #: ../gtk/src/SourceManager.cc:224 ../qt/src/SourceManager.cc:243 msgid "Screenshot Error" msgstr "Помилка Ð¾Ñ‚Ñ€Ð¸Ð¼Ð°Ð½Ð½Ñ Ð·Ð½Ñ–Ð¼ÐºÐ° екрану" #: ../gtk/src/SourceManager.cc:224 ../qt/src/SourceManager.cc:243 msgid "Failed to take screenshot." msgstr "Ðе вдалоÑÑ Ð·Ñ€Ð¾Ð±Ð¸Ñ‚Ð¸ знімок екрану." #: ../gtk/src/SourceManager.cc:228 ../qt/src/SourceManager.cc:247 msgid "Screenshot %1" msgstr "Знімок екрану %1" #: ../gtk/src/SourceManager.cc:233 ../qt/src/SourceManager.cc:252 msgid "Saving image..." msgstr "Ð—Ð±ÐµÑ€ÐµÐ¶ÐµÐ½Ð½Ñ Ð·Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð½Ñ..." #: ../gtk/src/SourceManager.cc:240 ../qt/src/SourceManager.cc:265 msgid "Cannot Write File" msgstr "Ðеможливо запиÑати файл" #: ../gtk/src/SourceManager.cc:240 ../qt/src/SourceManager.cc:265 msgid "Could not write to %1." msgstr "Ðеможливо запиÑати в %1." #: ../gtk/src/SourceManager.cc:267 ../qt/src/SourceManager.cc:287 msgid "Delete File?" msgstr "Видалити файл?" #: ../gtk/src/SourceManager.cc:267 ../qt/src/SourceManager.cc:287 msgid "The following files will be deleted:%1" msgstr "Буде видалено наÑтупні файли:%1" #: ../gtk/src/SourceManager.cc:332 ../qt/src/SourceManager.cc:338 msgid "Missing File" msgstr "Файл відÑутній" #: ../gtk/src/SourceManager.cc:332 ../qt/src/SourceManager.cc:338 msgid "" "The following file has been deleted or moved:\n" "%1" msgstr "" "ÐаÑтупний файл було видалено або переміщено:\n" "%1" #: ../gtk/src/SubstitutionsManager.cc:33 ../qt/src/SubstitutionsManager.cc:73 msgid "Search for" msgstr "Шукати" #: ../gtk/src/SubstitutionsManager.cc:34 ../qt/src/SubstitutionsManager.cc:73 msgid "Replace with" msgstr "Замінити на" #: ../gtk/src/SubstitutionsManager.cc:69 ../gtk/src/SubstitutionsManager.cc:103 #: ../qt/src/SubstitutionsManager.cc:106 ../qt/src/SubstitutionsManager.cc:143 msgid "Substitutions List" msgstr "СпиÑок замін" #: ../gtk/src/SubstitutionsManager.cc:70 ../qt/src/SubstitutionsManager.cc:106 msgid "Open Substitutions List" msgstr "Відкрити ÑпиÑок замін" #: ../gtk/src/SubstitutionsManager.cc:75 ../qt/src/SubstitutionsManager.cc:112 msgid "Error Reading File" msgstr "Помилка Ñ‡Ð¸Ñ‚Ð°Ð½Ð½Ñ Ñ„Ð°Ð¹Ð»Ñƒ" #: ../gtk/src/SubstitutionsManager.cc:75 ../qt/src/SubstitutionsManager.cc:112 msgid "Unable to read '%1'." msgstr "Ðеможливо прочитати '%1'." #: ../gtk/src/SubstitutionsManager.cc:97 ../qt/src/SubstitutionsManager.cc:137 msgid "Errors Occurred Reading File" msgstr "СталиÑÑ Ð¿Ð¾Ð¼Ð¸Ð»ÐºÐ¸ при читанні файлу" #: ../gtk/src/SubstitutionsManager.cc:97 ../qt/src/SubstitutionsManager.cc:137 msgid "Some entries of the substitutions list could not be read." msgstr "Ðе вдалоÑÑ Ð¿Ñ€Ð¾Ñ‡Ð¸Ñ‚Ð°Ñ‚Ð¸ певні елементи ÑпиÑку замін." #: ../gtk/src/SubstitutionsManager.cc:104 ../qt/src/SubstitutionsManager.cc:143 msgid "Save Substitutions List" msgstr "Зберегти ÑпиÑок замін" #: ../gtk/src/SubstitutionsManager.cc:110 ../qt/src/SubstitutionsManager.cc:149 msgid "Error Saving File" msgstr "Помилка Ð·Ð±ÐµÑ€ÐµÐ¶ÐµÐ½Ð½Ñ Ñ„Ð°Ð¹Ð»Ñƒ" #: ../gtk/src/SubstitutionsManager.cc:110 ../qt/src/SubstitutionsManager.cc:149 msgid "Unable to write to '%1'." msgstr "Ðеможливо запиÑати в '%1'." #: ../gtk/src/SubstitutionsManager.cc:127 ../qt/src/SubstitutionsManager.cc:162 msgid "Save List?" msgstr "Зберегти ÑпиÑок?" #: ../gtk/src/SubstitutionsManager.cc:127 ../qt/src/SubstitutionsManager.cc:162 msgid "Do you want to save the current list?" msgstr "Ви хочете зберегти поточний ÑпиÑок?" #: ../gtk/src/TessdataManager.cc:60 ../qt/src/TessdataManager.cc:74 #, fuzzy msgid "" "A session connection to the PackageKit backend is required for managing " "system-wide tesseract language packs, but it was not found. This service is " "usually provided by a software-management application such as Gnome " "Software. Please install software which provides the necessary PackageKit " "interface, use other system package management software to manage the " "tesseract language packs directly, or switch to using the user tessdata path " "in the configuration dialog." msgstr "" "Ð”Ð»Ñ ÐºÐµÑ€ÑƒÐ²Ð°Ð½Ð½Ñ Ð·Ð°Ð³Ð°Ð»ÑŒÐ½Ð¾ÑиÑтемними мовними пакунками tesseract потрібен " "PackageKit, але його не знайдено. Будь лаÑка, ÑкориÑтайтеÑÑ ÑиÑтемним " "менеджером додатків Ð´Ð»Ñ ÐºÐµÑ€ÑƒÐ²Ð°Ð½Ð½Ñ Ð¼Ð¾Ð²Ð½Ð¸Ð¼Ð¸ пакунками tesseract або оберіть " "викориÑÑ‚Ð°Ð½Ð½Ñ ÐºÐ¾Ñ€Ð¸Ñтувацького шлÑху до tessdata в діалозі конфігурації." #: ../gtk/src/TessdataManager.cc:65 ../qt/src/TessdataManager.cc:79 msgid "Fetching available languages" msgstr "Ð—Ð°Ð²Ð°Ð½Ñ‚Ð°Ð¶ÐµÐ½Ð½Ñ Ð´Ð¾Ñтупних мов" #: ../gtk/src/TessdataManager.cc:70 ../gtk/src/TessdataManager.cc:96 #: ../gtk/src/TessdataManager.cc:197 ../qt/src/TessdataManager.cc:84 #: ../qt/src/TessdataManager.cc:101 ../qt/src/TessdataManager.cc:197 msgid "Failed to fetch list of available languages: %1" msgstr "Ðе вдалоÑÑ Ð·Ð°Ð²Ð°Ð½Ñ‚Ð°Ð¶Ð¸Ñ‚Ð¸ перелік доÑтупних мов: %1" #: ../gtk/src/TessdataManager.cc:104 ../qt/src/TessdataManager.cc:113 #: ../qt/src/TessdataManager.cc:122 msgid "Parsing error: %1" msgstr "Помилка аналізу: %1" #: ../gtk/src/TessdataManager.cc:235 ../qt/src/TessdataManager.cc:232 msgid "Applying changes..." msgstr "ЗаÑтоÑÑƒÐ²Ð°Ð½Ð½Ñ Ð·Ð¼Ñ–Ð½..." #: ../gtk/src/TessdataManager.cc:297 ../qt/src/TessdataManager.cc:278 msgid "Failed to create directory for tessdata files." msgstr "Ðе вдалоÑÑ Ñтворити теку Ð´Ð»Ñ Ñ„Ð°Ð¹Ð»Ñ–Ð² tessdata." #: ../gtk/src/TessdataManager.cc:306 ../qt/src/TessdataManager.cc:287 msgid "Downloading %1..." msgstr "ЗавантажуєтьÑÑ %1..." #: ../gtk/src/TessdataManager.cc:330 msgid "" "The following files could not be downloaded or removed:\n" "%1\n" "\n" "Check the connectivity and directory permissions.\n" "\n" "Hint: If you don't have write permissions in system folders, you can switch " "to user paths in the settings dialog." msgstr "" "ÐаÑтупні файли не вдалоÑÑ Ð·Ð°Ð²Ð°Ð½Ñ‚Ð°Ð¶Ð¸Ñ‚Ð¸ чи вилучити:\n" "%1\n" "\n" "Перевірте мережеве з'Ñ”Ð´Ð°Ð½Ð½Ñ Ñ‚Ð° права доÑтупу до тек.\n" "\n" "Порада: Якщо ви не маєте дозволу на Ð·Ð°Ð¿Ð¸Ñ Ñƒ ÑиÑтемні теки, ви можете " "перемкнутиÑÑ Ð½Ð° кориÑтувацькі шлÑхи у ÐалаштуваннÑÑ…." #: ../gtk/src/Utils.cc:64 msgid "Yes" msgstr "Так" #: ../gtk/src/Utils.cc:67 msgid "No" msgstr "ÐÑ–" #: ../gtk/src/Utils.cc:76 msgid "Discard" msgstr "Відхилити" #: ../qt/data/AboutDialog.ui.h:1 msgid "About gImageReader" msgstr "Про програму gImageReader" #: ../qt/data/AboutDialog.ui.h:3 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/CrashHandler.ui.h:3 msgid "" "

Tesseract has " "aborted

Tesseract (the OCR engine) has aborted while " "recognizing text. This may occur if the used traineddatas are corrupt or " "incomplatible with the version of tesseract in use, or due to a bug in " "tesseract.

The stacktrace below may provide additional information " "about where the crash occured.

" msgstr "" #: ../qt/data/MainWindow.ui.h:17 msgid "Flatbed" msgstr "Планшетний" #: ../qt/data/MainWindow.ui.h:18 msgid "ADF Front" msgstr "ADF лицьова" #: ../qt/data/MainWindow.ui.h:19 msgid "ADF Back" msgstr "ADF зворотнÑ" #: ../qt/data/MainWindow.ui.h:20 msgid "ADF Duplex" msgstr "ADF дуплекÑ" #. Remove & from some labels which designer insists in adding #: ../qt/data/MainWindow.ui.h:21 ../qt/src/Ui_MainWindow.hh:50 msgid "Sources" msgstr "Джерела" #: ../qt/data/MainWindow.ui.h:22 msgid "Zoom In" msgstr "Збільшити" #: ../qt/data/MainWindow.ui.h:24 msgid "Zoom Out" msgstr "Зменшити" #: ../qt/data/MainWindow.ui.h:26 msgid "Normal Size" msgstr "Справжній розмір" #: ../qt/data/MainWindow.ui.h:28 msgid "Best Fit" msgstr "Оптимальний розмір" #: ../qt/data/MainWindow.ui.h:30 msgid "Rotate Left" msgstr "Обернути вліво" #: ../qt/data/MainWindow.ui.h:31 msgid "Rotate left" msgstr "Обернути вліво" #: ../qt/data/MainWindow.ui.h:32 msgid "Rotate Right" msgstr "Обернути вправо" #: ../qt/data/MainWindow.ui.h:33 msgid "Rotate right" msgstr "Обернути вправо" #: ../qt/data/MainWindow.ui.h:34 msgid "Image Controls" msgstr "Елементи ÐºÐµÑ€ÑƒÐ²Ð°Ð½Ð½Ñ Ð·Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð½Ñм" #: ../qt/data/MainWindow.ui.h:36 msgid "Autodetect Layout" msgstr "ÐÐ²Ñ‚Ð¾Ð²Ð¸Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ð¼Ð°ÐºÐµÑ‚Ñƒ" #: ../qt/data/MainWindow.ui.h:38 msgid "Toggle Output Pane" msgstr "Показати/приховати панель результатів" #: ../qt/data/PdfExportDialog.ui.h:5 msgid "Backend:" msgstr "Метод екÑпорту:" #: ../qt/data/PdfExportDialog.ui.h:8 msgid "Portrait" msgstr "Портретний" #: ../qt/data/PdfExportDialog.ui.h:9 msgid "Landscape" msgstr "Ðльбомний" #: ../qt/src/hocr/HOCRPdfExporter.cc:142 msgid "Failed to write to file" msgstr "Ðе вдалоÑÑ Ð·Ð°Ð¿Ð¸Ñати у файл" #. Output toolbar #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:55 #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:56 msgid "Open hOCR file" msgstr "Відкрити файл hORC" #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:57 #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:58 msgid "Save as hOCR text" msgstr "Зберегти Ñк текÑÑ‚ hOCR" #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:79 #: ../qt/src/Ui_OutputEditorText.hh:106 msgid "Find and Replace" msgstr "Знайти Ñ– замінити" #: ../qt/src/MainWindow.cc:581 #, fuzzy msgid "" "The following dictionary files were installed:\n" "%1" msgstr "Було вÑтановлено наÑтупні Ñловники:%1" #: ../qt/src/TessdataManager.cc:308 msgid "" "The following files could not be downloaded or removed:\n" "%1\n" "\n" "Check the connectivity and directory permissions.\n" "Hint: If you don't have write permissions in system folders, you can switch " "to user paths in the settings dialog." msgstr "" "ÐаÑтупні файли не вдалоÑÑ Ð·Ð°Ð²Ð°Ð½Ñ‚Ð°Ð¶Ð¸Ñ‚Ð¸ чи вилучити:\n" "%1\n" "\n" "Перевірте мережеве з'Ñ”Ð´Ð°Ð½Ð½Ñ Ñ‚Ð° права доÑтупу до тек.\n" "Порада: Якщо ви не маєте дозволу на Ð·Ð°Ð¿Ð¸Ñ Ñƒ ÑиÑтемні теки, ви можете " "перемкнутиÑÑ Ð½Ð° кориÑтувацькі шлÑхи у ÐалаштуваннÑÑ…." #: ../qt/src/Ui_MainWindow.hh:51 msgid "Output" msgstr "Результати" #: ../qt/src/Ui_MainWindow.hh:135 msgid "OCR mode:" msgstr "Режим Ñ€Ð¾Ð·Ð¿Ñ–Ð·Ð½Ð°Ð²Ð°Ð½Ð½Ñ OCR:" #: ../qt/src/Ui_MainWindow.hh:209 msgid "Remove Image" msgstr "Видалити зображеннÑ" #: ../qt/src/Ui_MainWindow.hh:212 msgid "Delete Image" msgstr "Видалити зображеннÑ" #: ../qt/src/Ui_MainWindow.hh:215 msgid "Clear List" msgstr "ОчиÑтити ÑпиÑок" #: ../qt/src/Ui_OutputEditorText.hh:101 msgid "Strip Line Breaks" msgstr "Видалити розриви Ñ€Ñдків" #: ../qt/src/Ui_OutputEditorText.hh:115 msgid "Save Output" msgstr "Зберегти результати" #: ../qt/src/Ui_OutputEditorText.hh:117 msgid "Clear Output" msgstr "ОчиÑтити результати" #~ msgid "The application has crashed" #~ msgstr "Додаток аварійно завершивÑÑ" #~ 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." #~ msgid "Could not read %1: %2" #~ msgstr "Ðеможливо прочитати %1: %2" #~ msgid "gImageReader" #~ msgstr "gImageReader" #~ 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 "Document font:" #~ msgstr "Шрифт документа:" #, fuzzy #~ msgid "Document" #~ msgstr "Шрифт документа:" #, fuzzy #~ msgid "Errors occurred" #~ msgstr "СталиÑÑ Ð¿Ð¾Ð¼Ð¸Ð»ÐºÐ¸ при розпізнаванні" #, fuzzy #~ msgid "" #~ "The following pages could not be rendered:\n" #~ "%1" #~ msgstr "" #~ "Ðеможливо відкрити наÑтупні файли:\n" #~ "%1" #~ msgid "substitution_list.txt" #~ msgstr "ÑпиÑок_замін.txt" #, 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.3.1/po/zh_CN.po000066400000000000000000001735351351740627400160400ustar00rootroot00000000000000# 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-2018. # Sandro Mani , 2016, 2017. msgid "" msgstr "" "Project-Id-Version: \n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2019-07-25 23:17+0200\n" "PO-Revision-Date: 2018-05-29 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" #: ../data/gimagereader.desktop.in.h:1 msgid "OCR application" msgstr "OCR 应用程åº" #: ../gtk/data/appmenu.ui.h:1 ../qt/src/Ui_MainWindow.hh:167 msgid "Redetect Languages" msgstr "釿–°æ£€æµ‹è¯­è¨€" #: ../gtk/data/appmenu.ui.h:2 ../qt/src/Ui_MainWindow.hh:170 msgid "Manage Languages" msgstr "管ç†è¯­è¨€" #: ../gtk/data/appmenu.ui.h:3 ../gtk/data/ConfigDialog.ui.h:1 #: ../qt/data/ConfigDialog.ui.h:1 ../qt/src/Ui_MainWindow.hh:173 msgid "Preferences" msgstr "选项" #: ../gtk/data/appmenu.ui.h:4 ../gtk/data/ConfigDialog.ui.h:2 #: ../gtk/src/MainWindow.cc:482 ../qt/src/MainWindow.cc:481 #: ../qt/src/Ui_MainWindow.hh:178 msgid "Help" msgstr "å助" #: ../gtk/data/appmenu.ui.h:5 ../qt/data/AboutDialog.ui.h:2 #: ../qt/src/Ui_MainWindow.hh:181 msgid "About" msgstr "关于" #: ../gtk/data/appmenu.ui.h:6 msgid "Quit" msgstr "离开" #: ../gtk/data/ConfigDialog.ui.h:3 ../gtk/data/MainWindow.ui.h:47 #: ../gtk/data/OutputEditorHOCR.ui.h:3 ../gtk/data/PdfExportDialog.ui.h:3 #: ../gtk/src/FileDialogs.cc:152 ../gtk/src/Utils.cc:61 #: ../qt/data/ConfigDialog.ui.h:26 msgid "OK" msgstr "确定" #: ../gtk/data/ConfigDialog.ui.h:4 msgid "Output pane orientation:" msgstr "è¾“å‡ºé¢æ¿çš„æ–¹å‘:" #: ../gtk/data/ConfigDialog.ui.h:5 msgid "Horizontal" msgstr "横å‘" #: ../gtk/data/ConfigDialog.ui.h:6 msgid "Vertical" msgstr "纵å‘" #: ../gtk/data/ConfigDialog.ui.h:7 ../qt/data/ConfigDialog.ui.h:18 msgid "Query to install missing spellcheck dictionaries" msgstr "æŸ¥æ‰¾é—æ¼å®‰è£…的拼写è¯å…¸" #: ../gtk/data/ConfigDialog.ui.h:8 ../qt/data/ConfigDialog.ui.h:4 msgid "Automatically check for new program versions" msgstr "自动检查新版本" #: ../gtk/data/ConfigDialog.ui.h:9 ../qt/data/ConfigDialog.ui.h:3 msgid "Predefined language definitions:" msgstr "缺çœè¯­è¨€å®šä¹‰ï¼š" #: ../gtk/data/ConfigDialog.ui.h:10 ../qt/data/ConfigDialog.ui.h:12 msgid "Additional language definitions:" msgstr "é¢å¤–语言定义:" #: ../gtk/data/ConfigDialog.ui.h:11 ../qt/data/ConfigDialog.ui.h:20 msgid "The prefix of the tesseract language data file" msgstr "tesseract è¯­è¨€æ•°æ®æ¡£çš„å‰ç¼€" #: ../gtk/data/ConfigDialog.ui.h:12 ../qt/data/ConfigDialog.ui.h:21 msgid "Prefix" msgstr "å‰ç¼€" #: ../gtk/data/ConfigDialog.ui.h:13 ../qt/data/ConfigDialog.ui.h:22 msgid "The ISO 639-1 language code followed by the country code" msgstr "ISO 639-1 语言代ç å¹¶å›½å®¶ä»£ç " #: ../gtk/data/ConfigDialog.ui.h:14 ../qt/data/ConfigDialog.ui.h:23 msgid "ISO Code" msgstr "ISO 代ç " #: ../gtk/data/ConfigDialog.ui.h:15 ../qt/data/ConfigDialog.ui.h:24 msgid "The name of the language" msgstr "语言åç§°" #: ../gtk/data/ConfigDialog.ui.h:16 ../qt/data/ConfigDialog.ui.h:25 msgid "Name" msgstr "åç§°" #: ../gtk/data/ConfigDialog.ui.h:17 ../gtk/data/MainWindow.ui.h:46 #: ../gtk/data/OutputEditorHOCR.ui.h:2 ../gtk/data/PdfExportDialog.ui.h:2 #: ../gtk/src/Acquirer.cc:34 ../gtk/src/FileDialogs.cc:151 #: ../gtk/src/Utils.cc:70 ../qt/data/ConfigDialog.ui.h:27 #: ../qt/data/MainWindow.ui.h:12 msgid "Cancel" msgstr "å–æ¶ˆ" #: ../gtk/data/ConfigDialog.ui.h:18 ../qt/data/ConfigDialog.ui.h:5 msgid "Output pane font:" msgstr "è¾“å‡ºé¢æ¿å­—体:" #: ../gtk/data/ConfigDialog.ui.h:19 ../qt/data/ConfigDialog.ui.h:2 msgid "Default" msgstr "缺çœå€¼" #: ../gtk/data/ConfigDialog.ui.h:20 ../qt/data/ConfigDialog.ui.h:6 msgid "Language data locations:" msgstr "语言数æ®ä½ç½®ï¼š" #: ../gtk/data/ConfigDialog.ui.h:21 ../qt/data/ConfigDialog.ui.h:13 msgid "Language definitions path:" msgstr "语言定义路径:" #: ../gtk/data/ConfigDialog.ui.h:22 ../qt/data/ConfigDialog.ui.h:28 msgid "Spelling dictionaries path:" msgstr "拼写è¯å…¸è·¯å¾„:" #: ../gtk/data/ConfigDialog.ui.h:23 ../qt/data/ConfigDialog.ui.h:10 msgid "System-wide paths" msgstr "系统路径" #: ../gtk/data/ConfigDialog.ui.h:24 ../qt/data/ConfigDialog.ui.h:11 msgid "User paths" msgstr "用户路径" #: ../gtk/data/ConfigDialog.ui.h:25 ../qt/data/ConfigDialog.ui.h:29 msgid "Automatically open exported documents with default application" msgstr "自动以缺çœåº”ç”¨ç¨‹åºæ‰“开输出的文件" #: ../gtk/data/CrashHandler.ui.h:1 ../qt/src/CrashHandler.cc:38 msgid "Regenerate backtrace" msgstr "é‡å»º backtrace" #: ../gtk/data/CrashHandler.ui.h:3 #, fuzzy, no-c-format msgid "" "The application has crashed\n" "\n" "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/CrashHandler.ui.h:6 msgid "" "Tesseract has aborted\n" "\n" "Tesseract (the OCR engine) has aborted while recognizing text. This may " "occur if the used traineddatas are corrupt or incomplatible with the version " "of tesseract in use, or due to a bug in tesseract.\n" "\n" "The stacktrace below may provide additional information about where the " "crash occured.\n" msgstr "" #: ../gtk/data/MainWindow.ui.h:1 ../qt/data/MainWindow.ui.h:39 msgid "Toggle output pane" msgstr "切æ¢è¾“å‡ºé¢æ¿" #: ../gtk/data/MainWindow.ui.h:2 ../qt/src/Ui_MainWindow.hh:66 msgid "Rotate current page" msgstr "旋转现有文字" #: ../gtk/data/MainWindow.ui.h:3 ../qt/src/Ui_MainWindow.hh:67 msgid "Rotate all pages" msgstr "旋转所有页é¢" #. Sources toolbar #: ../gtk/data/MainWindow.ui.h:4 ../qt/src/Ui_MainWindow.hh:192 msgid "Recent" msgstr "最近" #: ../gtk/data/MainWindow.ui.h:5 ../qt/src/Ui_MainWindow.hh:193 msgid "Paste" msgstr "贴上" #: ../gtk/data/MainWindow.ui.h:6 ../qt/src/Ui_MainWindow.hh:194 msgid "Take Screenshot" msgstr "ç”»é¢æˆªå›¾" #: ../gtk/data/MainWindow.ui.h:7 ../qt/data/MainWindow.ui.h:23 msgid "Zoom in" msgstr "放大" #: ../gtk/data/MainWindow.ui.h:8 ../qt/data/MainWindow.ui.h:25 msgid "Zoom out" msgstr "缩å°" #: ../gtk/data/MainWindow.ui.h:9 ../qt/data/MainWindow.ui.h:27 msgid "Normal size" msgstr "正常尺寸" #: ../gtk/data/MainWindow.ui.h:10 ../qt/data/MainWindow.ui.h:29 msgid "Best fit" msgstr "最佳尺寸" #: ../gtk/data/MainWindow.ui.h:11 ../qt/src/Ui_MainWindow.hh:75 msgid "Select rotation mode" msgstr "选择旋转模å¼" #: ../gtk/data/MainWindow.ui.h:12 ../gtk/data/OutputEditorText.ui.h:13 #: ../qt/src/Ui_OutputEditorText.hh:95 msgid "Select insert mode" msgstr "选用æ’入模å¼" #: ../gtk/data/MainWindow.ui.h:13 ../qt/src/Ui_MainWindow.hh:109 #, fuzzy msgid "Select page" msgstr "选择语言" #: ../gtk/data/MainWindow.ui.h:14 ../qt/data/MainWindow.ui.h:35 msgid "Image controls" msgstr "å›¾åƒæŽ§åˆ¶" #: ../gtk/data/MainWindow.ui.h:15 ../qt/src/Ui_MainWindow.hh:139 msgid "Plain text" msgstr "纯文本" #: ../gtk/data/MainWindow.ui.h:16 ../qt/src/Ui_MainWindow.hh:139 msgid "hOCR, PDF" msgstr "hOCRã€PDF" #: ../gtk/data/MainWindow.ui.h:17 ../qt/data/MainWindow.ui.h:37 msgid "Autodetect layout" msgstr "自动检测布局" #: ../gtk/data/MainWindow.ui.h:18 msgid "Recognize all" msgstr "辨认全部" #: ../gtk/data/MainWindow.ui.h:19 msgid "Select language" msgstr "选择语言" #: ../gtk/data/MainWindow.ui.h:20 ../qt/src/Ui_MainWindow.hh:205 msgid "Add images" msgstr "新增图åƒ" #: ../gtk/data/MainWindow.ui.h:21 ../qt/src/Ui_MainWindow.hh:204 msgid "Add Images" msgstr "新增图åƒ" #: ../gtk/data/MainWindow.ui.h:22 ../qt/src/Ui_MainWindow.hh:210 msgid "Remove image from list" msgstr "从清å•删除图åƒ" #: ../gtk/data/MainWindow.ui.h:23 ../qt/src/Ui_MainWindow.hh:213 msgid "Delete image" msgstr "删除图åƒ" #: ../gtk/data/MainWindow.ui.h:24 ../qt/src/Ui_MainWindow.hh:216 msgid "Clear list" msgstr "清除清å•" #: ../gtk/data/MainWindow.ui.h:25 ../qt/data/MainWindow.ui.h:5 msgid "Files" msgstr "文件" #: ../gtk/data/MainWindow.ui.h:26 ../qt/data/MainWindow.ui.h:8 msgid "Device:" msgstr "设备:" #: ../gtk/data/MainWindow.ui.h:27 ../gtk/data/TessdataManager.ui.h:4 #: ../qt/data/MainWindow.ui.h:7 ../qt/src/TessdataManager.cc:59 msgid "Refresh" msgstr "æ›´æ–°" #: ../gtk/data/MainWindow.ui.h:28 ../qt/data/MainWindow.ui.h:9 msgid "Output:" msgstr "输出:" #: ../gtk/data/MainWindow.ui.h:29 ../qt/data/MainWindow.ui.h:13 msgid "Mode:" msgstr "模å¼ï¼š" #: ../gtk/data/MainWindow.ui.h:30 ../gtk/src/hocr/HOCRPdfExporter.cc:313 #: ../qt/data/MainWindow.ui.h:15 ../qt/src/hocr/HOCRPdfExporter.cc:347 msgid "Color" msgstr "彩色" #: ../gtk/data/MainWindow.ui.h:31 ../gtk/src/hocr/HOCRPdfExporter.cc:316 #: ../qt/data/MainWindow.ui.h:14 ../qt/src/hocr/HOCRPdfExporter.cc:349 #: ../qt/src/hocr/HOCRPdfExporter.cc:351 msgid "Grayscale" msgstr "ç°åº¦" #: ../gtk/data/MainWindow.ui.h:32 ../qt/data/MainWindow.ui.h:10 msgid "Resolution:" msgstr "è§£åƒåº¦ï¼š" #: ../gtk/data/MainWindow.ui.h:33 ../qt/data/MainWindow.ui.h:11 msgid "Scan" msgstr "扫æ" #: ../gtk/data/MainWindow.ui.h:34 ../qt/data/MainWindow.ui.h:16 msgid "Source:" msgstr "æ¥æºï¼š" #: ../gtk/data/MainWindow.ui.h:35 ../qt/data/MainWindow.ui.h:6 msgid "Acquire" msgstr "æ•获" #: ../gtk/data/MainWindow.ui.h:36 ../qt/data/MainWindow.ui.h:1 msgid "Brightness" msgstr "亮度" #: ../gtk/data/MainWindow.ui.h:37 ../qt/data/MainWindow.ui.h:2 msgid "Contrast" msgstr "对比" #: ../gtk/data/MainWindow.ui.h:38 ../qt/data/MainWindow.ui.h:3 msgid "Resolution" msgstr "è§£åƒåº¦" #: ../gtk/data/MainWindow.ui.h:39 ../qt/data/MainWindow.ui.h:4 msgid "Invert colors" msgstr "倒置色版" #: ../gtk/data/MainWindow.ui.h:40 msgid "A graphical frontend to tesseract-ocr" msgstr "tesseract-ocr 的图åƒç•Œé¢" #: ../gtk/data/MainWindow.ui.h:41 ../qt/data/CharacterListDialog.ui.h:1 msgid "Character whitelist / blacklist" msgstr "" #: ../gtk/data/MainWindow.ui.h:42 ../qt/data/CharacterListDialog.ui.h:2 msgid "Exclude these characters from being recognized (blacklist):" msgstr "" #: ../gtk/data/MainWindow.ui.h:43 ../qt/data/CharacterListDialog.ui.h:3 #, fuzzy msgid "Enter a string of characters..." msgstr "获å–傿•°â€¦â€¦" #: ../gtk/data/MainWindow.ui.h:44 ../qt/data/CharacterListDialog.ui.h:4 msgid "Only allow the following characters to be recognized (whitelist):" msgstr "" #: ../gtk/data/MainWindow.ui.h:45 ../qt/data/PageRangeDialog.ui.h:1 msgid "Page Range" msgstr "页é¢èŒƒå›´" #: ../gtk/data/MainWindow.ui.h:48 ../qt/data/PageRangeDialog.ui.h:2 msgid "Page range:" msgstr "页é¢èŒƒå›´ï¼š" #: ../gtk/data/MainWindow.ui.h:49 ../qt/data/PageRangeDialog.ui.h:3 msgid "Example: 1-10, 13, 14-18" msgstr "例如: 1-10, 13, 14-18" #: ../gtk/data/MainWindow.ui.h:50 ../qt/data/PageRangeDialog.ui.h:4 msgid "Recognition area:" msgstr "辨认本地:" #: ../gtk/data/MainWindow.ui.h:51 ../gtk/src/Recognizer.cc:375 #: ../qt/data/PageRangeDialog.ui.h:5 ../qt/src/Recognizer.cc:369 msgid "Entire page" msgstr "整页" #: ../gtk/data/MainWindow.ui.h:52 ../qt/data/PageRangeDialog.ui.h:6 msgid "Autodetect" msgstr "自动检测" #: ../gtk/data/MainWindow.ui.h:53 ../qt/data/PageRangeDialog.ui.h:7 msgid "Prepend to output text:" msgstr "é å…ˆè¼¸å‡ºæ–‡å­—:" #: ../gtk/data/MainWindow.ui.h:54 ../qt/data/PageRangeDialog.ui.h:8 msgid "Source filename" msgstr "æºæ–‡ä»¶å" #: ../gtk/data/MainWindow.ui.h:55 ../qt/data/PageRangeDialog.ui.h:9 msgid "Source page" msgstr "æ¥æºé¡µ" #: ../gtk/data/MainWindow.ui.h:56 ../qt/src/SourceManager.cc:146 msgid "Protected PDF" msgstr "å—ä¿æŠ¤ PDF" #: ../gtk/data/MainWindow.ui.h:57 ../qt/src/Recognizer.cc:76 msgid "Current Page" msgstr "现时页é¢" #: ../gtk/data/MainWindow.ui.h:58 ../qt/src/Recognizer.cc:79 msgid "Multiple Pages..." msgstr "多页……" #: ../gtk/data/OutputEditorHOCR.ui.h:1 ../qt/src/hocr/OutputEditorHOCR.cc:580 msgid "Add Word" msgstr "新增字è¯" #: ../gtk/data/OutputEditorHOCR.ui.h:4 ../qt/src/hocr/OutputEditorHOCR.cc:580 msgid "Enter word:" msgstr "输入字è¯" #: ../gtk/data/OutputEditorHOCR.ui.h:5 ../qt/src/hocr/Ui_OutputEditorHOCR.hh:61 #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:62 msgid "Export to plain text" msgstr "输出为纯文本" #: ../gtk/data/OutputEditorHOCR.ui.h:6 ../qt/src/hocr/Ui_OutputEditorHOCR.hh:64 #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:65 msgid "Export to PDF" msgstr "输出至 PDF" #: ../gtk/data/OutputEditorHOCR.ui.h:7 ../qt/src/hocr/Ui_OutputEditorHOCR.hh:67 #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:68 msgid "Export to ODT" msgstr "输出至 ODT" #: ../gtk/data/OutputEditorHOCR.ui.h:8 ../gtk/data/OutputEditorText.ui.h:18 #: ../qt/src/Ui_OutputEditorText.hh:116 msgid "Save output" msgstr "存储输出" #: ../gtk/data/OutputEditorHOCR.ui.h:9 ../qt/src/hocr/Ui_OutputEditorHOCR.hh:72 #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:73 msgid "Export" msgstr "输出" #: ../gtk/data/OutputEditorHOCR.ui.h:10 ../gtk/data/OutputEditorText.ui.h:19 #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:77 #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:78 #: ../qt/src/Ui_OutputEditorText.hh:118 msgid "Clear output" msgstr "清除输出" #: ../gtk/data/OutputEditorHOCR.ui.h:11 ../gtk/data/OutputEditorText.ui.h:15 #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:80 #: ../qt/src/Ui_OutputEditorText.hh:107 msgid "Find and replace" msgstr "寻找åŠå–代" #: ../gtk/data/OutputEditorHOCR.ui.h:12 #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:82 #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:83 msgid "Show confidence values" msgstr "显示å¯ä¿¡åº¦" #: ../gtk/data/OutputEditorHOCR.ui.h:13 ../gtk/data/PdfExportDialog.ui.h:41 #: ../qt/data/PdfExportDialog.ui.h:2 ../qt/src/hocr/Ui_OutputEditorHOCR.hh:85 #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:86 msgid "Show preview" msgstr "显示预览" #: ../gtk/data/OutputEditorHOCR.ui.h:14 #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:121 msgid "Next (F3)" msgstr "下一个(F3)" #: ../gtk/data/OutputEditorHOCR.ui.h:15 #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:122 msgid "Previous (Shift+F3)" msgstr "上一个(Shift+F3)" #: ../gtk/data/OutputEditorHOCR.ui.h:16 ../gtk/src/hocr/OutputEditorHOCR.cc:890 #: ../qt/src/hocr/OutputEditorHOCR.cc:730 #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:126 msgid "Expand all" msgstr "递归展开" #: ../gtk/data/OutputEditorHOCR.ui.h:17 ../gtk/src/hocr/OutputEditorHOCR.cc:893 #: ../qt/src/hocr/OutputEditorHOCR.cc:731 #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:127 msgid "Collapse all" msgstr "递归折å " #: ../gtk/data/OutputEditorHOCR.ui.h:18 #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:148 msgid "Properties" msgstr "属性" #: ../gtk/data/OutputEditorHOCR.ui.h:19 #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:152 msgid "Source" msgstr "æ¥æº" #. Output insert mode #: ../gtk/data/OutputEditorText.ui.h:1 ../qt/src/Ui_OutputEditorText.hh:52 msgid "Append to current text" msgstr "附加到现有文字" #: ../gtk/data/OutputEditorText.ui.h:2 ../qt/src/Ui_OutputEditorText.hh:53 msgid "Insert at cursor" msgstr "于光标ä½ç½®æ’å…¥" #: ../gtk/data/OutputEditorText.ui.h:3 ../qt/src/Ui_OutputEditorText.hh:54 msgid "Replace current text" msgstr "å–代现有文字" #. Output postprocessing #: ../gtk/data/OutputEditorText.ui.h:4 ../qt/src/Ui_OutputEditorText.hh:62 msgid "Keep line break if..." msgstr "ä¿ç•™æ¢è¡Œç¬¦å·ï¼Œå¦‚果……" #: ../gtk/data/OutputEditorText.ui.h:5 ../qt/src/Ui_OutputEditorText.hh:64 msgid "Preceded by end mark (.?!)" msgstr "以终结å·èµ·é¦–(.?!)" #: ../gtk/data/OutputEditorText.ui.h:6 ../qt/src/Ui_OutputEditorText.hh:66 msgid "Preceded or succeeded by quote" msgstr "以引å·èµ·é¦–或结尾" #: ../gtk/data/OutputEditorText.ui.h:7 ../qt/src/Ui_OutputEditorText.hh:68 msgid "Other options" msgstr "其它选项" #: ../gtk/data/OutputEditorText.ui.h:8 ../qt/src/Ui_OutputEditorText.hh:70 msgid "Join hyphenated words" msgstr "连接断字符å·å‰åŽçš„å­—" #: ../gtk/data/OutputEditorText.ui.h:9 ../qt/src/Ui_OutputEditorText.hh:72 msgid "Collapse whitespace" msgstr "åˆå¹¶ç©ºæ ¼" #: ../gtk/data/OutputEditorText.ui.h:10 ../qt/src/Ui_OutputEditorText.hh:74 msgid "Preserve paragraphs" msgstr "ä¿ç•™æ®µè½" #: ../gtk/data/OutputEditorText.ui.h:11 ../qt/src/Ui_OutputEditorText.hh:76 msgid "Visual aids" msgstr "视觉辅助" #: ../gtk/data/OutputEditorText.ui.h:12 ../qt/src/Ui_OutputEditorText.hh:78 msgid "Draw whitespace" msgstr "绘画空格" #: ../gtk/data/OutputEditorText.ui.h:14 ../qt/src/Ui_OutputEditorText.hh:102 msgid "Strip line breaks on selected text" msgstr "去除选择文字的æ¢è¡Œç¬¦å·" #: ../gtk/data/OutputEditorText.ui.h:16 ../qt/src/Ui_OutputEditorText.hh:109 #: ../qt/src/Ui_OutputEditorText.hh:110 msgid "Undo" msgstr "æ¢å¤" #: ../gtk/data/OutputEditorText.ui.h:17 ../qt/src/Ui_OutputEditorText.hh:112 #: ../qt/src/Ui_OutputEditorText.hh:113 msgid "Redo" msgstr "é‡åš" #: ../gtk/data/PdfExportDialog.ui.h:1 ../qt/data/PdfExportDialog.ui.h:1 msgid "PDF Export" msgstr "输出 PDF" #: ../gtk/data/PdfExportDialog.ui.h:4 ../qt/data/PdfExportDialog.ui.h:4 msgid "Output mode:" msgstr "输出模å¼ï¼š" #: ../gtk/data/PdfExportDialog.ui.h:5 ../qt/data/PdfExportDialog.ui.h:6 msgid "PDF" msgstr "PDF" #: ../gtk/data/PdfExportDialog.ui.h:6 ../qt/data/PdfExportDialog.ui.h:7 msgid "PDF with invisible text overlay" msgstr "包å«éšå½¢æ–‡å­—层的 PDF" #: ../gtk/data/PdfExportDialog.ui.h:7 ../qt/data/PdfExportDialog.ui.h:16 msgid "Format:" msgstr "æ ¼å¼ï¼š" #: ../gtk/data/PdfExportDialog.ui.h:8 ../qt/data/PdfExportDialog.ui.h:17 msgid "Compression:" msgstr "压缩:" #: ../gtk/data/PdfExportDialog.ui.h:9 ../qt/data/PdfExportDialog.ui.h:14 msgid "Compression quality:" msgstr "压缩质é‡ï¼š" #: ../gtk/data/PdfExportDialog.ui.h:10 ../qt/data/PdfExportDialog.ui.h:15 msgid "DPI:" msgstr "DPI:" #: ../gtk/data/PdfExportDialog.ui.h:11 ../qt/data/PdfExportDialog.ui.h:18 msgid "Dithering algorithm:" msgstr "递色演算法:" #: ../gtk/data/PdfExportDialog.ui.h:12 ../qt/data/PdfExportDialog.ui.h:13 msgid "Image settings:" msgstr "图åƒè®¾ç½®ï¼š" #: ../gtk/data/PdfExportDialog.ui.h:13 ../qt/data/PdfExportDialog.ui.h:25 msgid "Uniformize line and word spacing" msgstr "统一行è·åŠå­—è·" #: ../gtk/data/PdfExportDialog.ui.h:14 ../qt/data/PdfExportDialog.ui.h:21 msgid "Override font family:" msgstr "改写字体:" #: ../gtk/data/PdfExportDialog.ui.h:15 ../qt/data/PdfExportDialog.ui.h:27 msgid "Fallback font family:" msgstr "åŽå¤‡å­—体:" #: ../gtk/data/PdfExportDialog.ui.h:16 ../qt/data/PdfExportDialog.ui.h:20 msgid "Override font size:" msgstr "改写字体尺寸:" #: ../gtk/data/PdfExportDialog.ui.h:17 ../qt/data/PdfExportDialog.ui.h:23 msgid "Font scaling:" msgstr "字体缩放:" #: ../gtk/data/PdfExportDialog.ui.h:18 ../qt/data/PdfExportDialog.ui.h:26 msgid "pt" msgstr "" #: ../gtk/data/PdfExportDialog.ui.h:19 ../qt/data/PdfExportDialog.ui.h:22 msgid "Preserve spaces wider than:" msgstr "ä¿ç•™ç©ºæ ¼å¤§äºŽï¼š" #: ../gtk/data/PdfExportDialog.ui.h:20 ../qt/data/PdfExportDialog.ui.h:24 msgid "characters" msgstr "字符" #: ../gtk/data/PdfExportDialog.ui.h:21 ../qt/data/PdfExportDialog.ui.h:28 msgid "Sanitize hyphens before line breaks" msgstr "" #: ../gtk/data/PdfExportDialog.ui.h:22 ../qt/data/PdfExportDialog.ui.h:19 msgid "Text settings:" msgstr "文本设置:" #: ../gtk/data/PdfExportDialog.ui.h:23 ../qt/data/PdfExportDialog.ui.h:10 msgid "Paper size:" msgstr "纸张尺寸:" #: ../gtk/data/PdfExportDialog.ui.h:24 ../qt/data/PdfExportDialog.ui.h:11 msgid "Width" msgstr "阔度" #: ../gtk/data/PdfExportDialog.ui.h:25 ../qt/data/PdfExportDialog.ui.h:12 msgid "Height" msgstr "高度" #: ../gtk/data/PdfExportDialog.ui.h:26 ../qt/data/PdfExportDialog.ui.h:29 msgid "Treat image sources as having true DPI:" msgstr "" #: ../gtk/data/PdfExportDialog.ui.h:27 ../qt/data/PdfExportDialog.ui.h:3 msgid "Basic" msgstr "基本" #: ../gtk/data/PdfExportDialog.ui.h:28 ../qt/data/PdfExportDialog.ui.h:31 msgid "PDF version:" msgstr "PDF 版本:" #: ../gtk/data/PdfExportDialog.ui.h:29 ../qt/data/PdfExportDialog.ui.h:33 msgid "Password:" msgstr "å£ä»¤ï¼š" #: ../gtk/data/PdfExportDialog.ui.h:30 ../qt/data/PdfExportDialog.ui.h:34 msgid "Confirm password:" msgstr "确认å£ä»¤ï¼š" #: ../gtk/data/PdfExportDialog.ui.h:31 ../qt/data/PdfExportDialog.ui.h:32 msgid "Encryption (optional):" msgstr "加密(选择性):" #: ../gtk/data/PdfExportDialog.ui.h:32 ../qt/data/PdfExportDialog.ui.h:36 msgid "Author:" msgstr "作者:" #: ../gtk/data/PdfExportDialog.ui.h:33 ../qt/data/PdfExportDialog.ui.h:38 msgid "Title:" msgstr "å称:" #: ../gtk/data/PdfExportDialog.ui.h:34 ../qt/data/PdfExportDialog.ui.h:40 msgid "Subject:" msgstr "主题:" #: ../gtk/data/PdfExportDialog.ui.h:35 ../qt/data/PdfExportDialog.ui.h:37 msgid "Creator:" msgstr "创建者:" #: ../gtk/data/PdfExportDialog.ui.h:36 ../qt/data/PdfExportDialog.ui.h:39 msgid "Producer:" msgstr "å‘行者:" #: ../gtk/data/PdfExportDialog.ui.h:37 ../qt/data/PdfExportDialog.ui.h:41 msgid "Keywords:" msgstr "关键字:" #: ../gtk/data/PdfExportDialog.ui.h:38 ../qt/data/PdfExportDialog.ui.h:35 msgid "Additional information (optional):" msgstr "附加的信æ¯(å¯é€‰):" #: ../gtk/data/PdfExportDialog.ui.h:39 ../qt/data/PdfExportDialog.ui.h:42 msgid "Import from current source" msgstr "è¾“å…¥çŽ°æœ‰æ¥æº" #: ../gtk/data/PdfExportDialog.ui.h:40 ../qt/data/PdfExportDialog.ui.h:30 msgid "Advanced" msgstr "高级" #: ../gtk/data/SearchReplaceFrame.ui.h:1 ../qt/data/SearchReplaceFrame.ui.h:4 msgid "Find" msgstr "寻找" #: ../gtk/data/SearchReplaceFrame.ui.h:2 ../qt/data/SearchReplaceFrame.ui.h:2 msgid "Replace" msgstr "å–代" #: ../gtk/data/SearchReplaceFrame.ui.h:3 ../qt/data/SearchReplaceFrame.ui.h:3 msgid "Replace all" msgstr "全部å–代" #: ../gtk/data/SearchReplaceFrame.ui.h:4 ../qt/data/SearchReplaceFrame.ui.h:5 msgid "Find previous" msgstr "寻找å‰ä¸€ä¸ª" #: ../gtk/data/SearchReplaceFrame.ui.h:5 ../qt/data/SearchReplaceFrame.ui.h:6 msgid "Find next" msgstr "寻找下一个" #: ../gtk/data/SearchReplaceFrame.ui.h:6 ../qt/data/SearchReplaceFrame.ui.h:7 msgid "Match case" msgstr "尺寸写å»åˆ" #: ../gtk/data/SearchReplaceFrame.ui.h:7 #: ../gtk/data/SubstitutionsManager.ui.h:1 ../qt/data/SearchReplaceFrame.ui.h:1 #: ../qt/src/SubstitutionsManager.cc:36 msgid "Substitutions" msgstr "替æ¢å€¼" #: ../gtk/data/SelectionMenu.ui.h:1 ../qt/src/DisplayerToolSelect.cc:239 msgid "Delete" msgstr "删除" #: ../gtk/data/SelectionMenu.ui.h:2 ../qt/src/DisplayerToolSelect.cc:225 msgid "Order:" msgstr "排åºï¼š" #: ../gtk/data/SelectionMenu.ui.h:3 ../gtk/src/hocr/DisplayerToolHOCR.cc:29 #: ../qt/src/DisplayerToolSelect.cc:240 ../qt/src/hocr/DisplayerToolHOCR.cc:31 msgid "Recognize" msgstr "辨认" #: ../gtk/data/SelectionMenu.ui.h:4 ../qt/src/DisplayerToolSelect.cc:241 msgid "Recognize to clipboard" msgstr "辨认至剪贴æ¿" #: ../gtk/data/SelectionMenu.ui.h:5 ../qt/src/DisplayerToolSelect.cc:242 msgid "Save as image" msgstr "存储为图åƒ" #: ../gtk/data/SubstitutionsManager.ui.h:2 ../qt/src/SubstitutionsManager.cc:38 #: ../qt/src/SubstitutionsManager.cc:39 msgid "Open" msgstr "打开" #: ../gtk/data/SubstitutionsManager.ui.h:3 ../gtk/src/Utils.cc:73 #: ../qt/src/SubstitutionsManager.cc:41 ../qt/src/SubstitutionsManager.cc:42 msgid "Save" msgstr "存储" #: ../gtk/data/SubstitutionsManager.ui.h:4 ../qt/src/SubstitutionsManager.cc:44 #: ../qt/src/SubstitutionsManager.cc:45 msgid "Clear" msgstr "清除" #: ../gtk/data/SubstitutionsManager.ui.h:5 ../qt/data/ConfigDialog.ui.h:16 #: ../qt/src/SubstitutionsManager.cc:47 ../qt/src/SubstitutionsManager.cc:48 msgid "Add" msgstr "新增" #: ../gtk/data/SubstitutionsManager.ui.h:6 #: ../gtk/src/hocr/OutputEditorHOCR.cc:886 ../qt/data/ConfigDialog.ui.h:17 #: ../qt/src/hocr/OutputEditorHOCR.cc:727 ../qt/src/SubstitutionsManager.cc:50 #: ../qt/src/SubstitutionsManager.cc:51 msgid "Remove" msgstr "删除" #: ../gtk/data/SubstitutionsManager.ui.h:7 ../gtk/data/TessdataManager.ui.h:2 msgid "Apply" msgstr "应用" #: ../gtk/data/SubstitutionsManager.ui.h:8 ../gtk/data/TessdataManager.ui.h:3 msgid "Close" msgstr "关闭" #: ../gtk/data/TessdataManager.ui.h:1 ../qt/src/TessdataManager.cc:49 msgid "Tessdata Manager" msgstr "Tessdata 管ç†å‘˜" #: ../gtk/data/TessdataManager.ui.h:5 ../qt/src/TessdataManager.cc:51 msgid "Manage installed languages:" msgstr "管ç†å·²å®‰è£…的语言:" #: ../gtk/src/Acquirer.cc:79 ../qt/src/Acquirer.cc:70 msgid "scan.png" msgstr "" #: ../gtk/src/Acquirer.cc:91 ../qt/src/Acquirer.cc:85 msgid "Images" msgstr "图åƒ" #: ../gtk/src/Acquirer.cc:92 ../qt/src/Acquirer.cc:86 msgid "Choose Output Filename..." msgstr "选择输出文件å……" #: ../gtk/src/Acquirer.cc:106 ../qt/src/Acquirer.cc:100 msgid "Failed to initialize the scanning backend." msgstr "ä¸èƒ½åˆå§‹åŒ–æ‰«ææœåŠ¡ã€‚" #: ../gtk/src/Acquirer.cc:115 ../qt/src/Acquirer.cc:106 msgid "Scan failed" msgstr "ä¸èƒ½æ‘ºæ‰«æ" #: ../gtk/src/Acquirer.cc:133 ../qt/src/Acquirer.cc:122 msgid "No scanners were detected." msgstr "检测ä¸åˆ°æ‰«æå™¨ã€‚" #: ../gtk/src/Acquirer.cc:150 ../gtk/src/Acquirer.cc:168 #: ../qt/src/Acquirer.cc:136 ../qt/src/Acquirer.cc:154 msgid "Starting scan..." msgstr "开始扫æâ€¦â€¦" #: ../gtk/src/Acquirer.cc:164 ../qt/src/Acquirer.cc:150 msgid "Opening device..." msgstr "打开设备……" #: ../gtk/src/Acquirer.cc:166 ../qt/src/Acquirer.cc:152 msgid "Setting options..." msgstr "设置选项……" #: ../gtk/src/Acquirer.cc:170 ../qt/src/Acquirer.cc:156 msgid "Getting parameters..." msgstr "获å–傿•°â€¦â€¦" #: ../gtk/src/Acquirer.cc:172 ../qt/src/Acquirer.cc:158 msgid "Transferring data..." msgstr "转输数æ®â€¦â€¦" #: ../gtk/src/Acquirer.cc:179 ../qt/src/Acquirer.cc:165 msgid "Canceling scan..." msgstr "å–æ¶ˆæ‰«æâ€¦â€¦" #: ../gtk/src/Config.cc:49 ../qt/data/ConfigDialog.ui.h:7 msgid "Filename prefix" msgstr "文件åå‰ç¼€" #: ../gtk/src/Config.cc:50 ../qt/data/ConfigDialog.ui.h:8 msgid "Code" msgstr "代ç " #: ../gtk/src/Config.cc:51 ../qt/data/ConfigDialog.ui.h:9 msgid "Native name" msgstr "原生åç§°" #: ../gtk/src/Config.cc:109 ../qt/src/Config.cc:108 msgid "Script" msgstr "脚本" #: ../gtk/src/CrashHandler.cc:25 ../gtk/src/CrashHandler.cc:41 #: ../qt/src/CrashHandler.cc:36 msgid "Crash Handler" msgstr "异常终止处ç†å™¨" #: ../gtk/src/CrashHandler.cc:43 ../qt/src/CrashHandler.cc:31 msgid "Your work has been saved under %1." msgstr "你的工作已存储于 %1。" #: ../gtk/src/CrashHandler.cc:45 ../qt/src/CrashHandler.cc:33 msgid "There was no unsaved work." msgstr "没有未存储的工作。" #: ../gtk/src/CrashHandler.cc:106 ../qt/src/CrashHandler.cc:62 msgid "Failed to obtain backtrace. Is gdb installed?" msgstr "ä¸èƒ½å–å¾— backtrace。已安装 gdb å—?" #: ../gtk/src/Displayer.cc:232 ../qt/src/Displayer.cc:174 msgid "Failed to load image" msgstr "ä¸èƒ½è£…入图åƒ" #: ../gtk/src/Displayer.cc:232 ../qt/src/Displayer.cc:174 msgid "" "The file might not be an image or be corrupt:\n" "%1" msgstr "" "该文件å¯èƒ½ä¸æ˜¯å›¾åƒæˆ–已被æŸå:\n" "%1" #: ../gtk/src/DisplayerToolSelect.cc:138 ../qt/src/DisplayerToolSelect.cc:135 msgid "PNG Images" msgstr "PNG 图åƒ" #: ../gtk/src/DisplayerToolSelect.cc:139 ../qt/src/DisplayerToolSelect.cc:135 msgid "Save Selection Image" msgstr "存储选择图åƒ" #: ../gtk/src/DisplayerToolSelect.cc:139 ../qt/src/DisplayerToolSelect.cc:135 msgid "selection.png" msgstr "" #: ../gtk/src/DisplayerToolSelect.cc:146 ../qt/src/DisplayerToolSelect.cc:142 msgid "Recognize all" msgstr "辨认全部" #: ../gtk/src/DisplayerToolSelect.cc:146 ../qt/src/DisplayerToolSelect.cc:142 msgid "Recognize selection" msgstr "辨认选择区" #: ../gtk/src/DisplayerToolSelect.cc:186 ../qt/src/DisplayerToolSelect.cc:182 msgid "Performing layout analysis" msgstr "进行布局分æž" #: ../gtk/src/FileDialogs.cc:235 msgid "" "A file named \"%1\" already exists. Are you sure you want to overwrite it?" msgstr "å为 \"%1\" çš„æ–‡ä»¶å·²å­˜åœ¨ã€‚ä½ ç¡®å®šè¦æ”¹å†™å®ƒï¼Ÿ" #: ../gtk/src/FileDialogs.cc:237 msgid "Overwrite File?" msgstr "改写文件?" #: ../gtk/src/hocr/HOCRDocument.cc:611 ../gtk/src/hocr/OutputEditorHOCR.cc:266 #: ../qt/src/hocr/OutputEditorHOCR.cc:229 msgid "Page" msgstr "页é¢" #: ../gtk/src/hocr/HOCRDocument.cc:613 ../qt/src/hocr/HOCRDocument.cc:530 msgid "Text block" msgstr "文字å—" #: ../gtk/src/hocr/HOCRDocument.cc:615 ../gtk/src/hocr/OutputEditorHOCR.cc:272 #: ../qt/src/hocr/HOCRDocument.cc:532 ../qt/src/hocr/OutputEditorHOCR.cc:231 msgid "Paragraph" msgstr "段è½" #: ../gtk/src/hocr/HOCRDocument.cc:617 ../qt/src/hocr/HOCRDocument.cc:534 msgid "Textline" msgstr "文字" #: ../gtk/src/hocr/HOCRDocument.cc:621 ../qt/src/hocr/HOCRDocument.cc:538 msgid "Graphic" msgstr "图åƒ" #: ../gtk/src/hocr/HOCROdtExporter.cc:65 ../gtk/src/hocr/HOCRPdfExporter.cc:489 #: ../gtk/src/hocr/HOCRTextExporter.cc:34 #: ../gtk/src/hocr/OutputEditorHOCR.cc:963 ../gtk/src/OutputEditorText.cc:272 #: ../qt/src/hocr/HOCROdtExporter.cc:50 ../qt/src/hocr/HOCRPdfExporter.cc:478 #: ../qt/src/hocr/HOCRTextExporter.cc:36 ../qt/src/hocr/OutputEditorHOCR.cc:830 #: ../qt/src/OutputEditorText.cc:238 msgid "output" msgstr "输出" #: ../gtk/src/hocr/HOCROdtExporter.cc:68 ../qt/src/hocr/HOCROdtExporter.cc:53 msgid "OpenDocument Text Documents" msgstr "OpenDocument 文件档" #: ../gtk/src/hocr/HOCROdtExporter.cc:69 ../qt/src/hocr/HOCROdtExporter.cc:53 msgid "Save ODT Output..." msgstr "存储 ODT 输出……" #: ../gtk/src/hocr/HOCROdtExporter.cc:77 ../gtk/src/hocr/HOCROdtExporter.cc:342 #: ../gtk/src/hocr/HOCRPdfExporter.cc:619 #: ../gtk/src/hocr/HOCRTextExporter.cc:46 ../qt/src/hocr/HOCROdtExporter.cc:61 #: ../qt/src/hocr/HOCRPdfExporter.cc:609 ../qt/src/hocr/HOCRTextExporter.cc:47 msgid "Export failed" msgstr "ä¸èƒ½è¾“出" #: ../gtk/src/hocr/HOCROdtExporter.cc:77 ../gtk/src/hocr/HOCROdtExporter.cc:342 #: ../qt/src/hocr/HOCROdtExporter.cc:61 msgid "The ODT export failed: unable to write output file." msgstr "ä¸èƒ½è¾“出 ODT:ä¸èƒ½åˆ›å»ºè¾“出档。" #: ../gtk/src/hocr/HOCROdtExporter.cc:336 ../qt/src/hocr/HOCROdtExporter.cc:254 msgid "Exporting to ODT..." msgstr "输出至 ODT..." #: ../gtk/src/hocr/HOCRPdfExporter.cc:283 ../qt/src/hocr/HOCRPdfExporter.cc:365 msgid "Same as source" msgstr "ä¸Žæ¥æºç›¸åŒ" #: ../gtk/src/hocr/HOCRPdfExporter.cc:286 ../qt/src/hocr/HOCRPdfExporter.cc:366 msgid "Custom" msgstr "自定" #: ../gtk/src/hocr/HOCRPdfExporter.cc:300 ../qt/src/hocr/HOCRPdfExporter.cc:362 msgid "cm" msgstr "" #: ../gtk/src/hocr/HOCRPdfExporter.cc:303 ../qt/src/hocr/HOCRPdfExporter.cc:363 msgid "in" msgstr "在" #: ../gtk/src/hocr/HOCRPdfExporter.cc:319 ../qt/src/hocr/HOCRPdfExporter.cc:353 msgid "Monochrome" msgstr "黑白" #: ../gtk/src/hocr/HOCRPdfExporter.cc:328 ../qt/src/hocr/HOCRPdfExporter.cc:355 msgid "Threshold (closest color)" msgstr "定é™ï¼ˆæœ€æŽ¥è¿‘颜色)" #: ../gtk/src/hocr/HOCRPdfExporter.cc:331 ../qt/src/hocr/HOCRPdfExporter.cc:356 msgid "Diffuse" msgstr "扩散" #: ../gtk/src/hocr/HOCRPdfExporter.cc:340 ../qt/src/hocr/HOCRPdfExporter.cc:357 msgid "Zip (lossless)" msgstr "Zip(无æŸï¼‰" #: ../gtk/src/hocr/HOCRPdfExporter.cc:344 ../qt/src/hocr/HOCRPdfExporter.cc:358 msgid "CCITT Group 4 (lossless)" msgstr "CCITT 第 4 组(无æŸï¼‰" #: ../gtk/src/hocr/HOCRPdfExporter.cc:348 ../qt/src/hocr/HOCRPdfExporter.cc:359 msgid "Jpeg (lossy)" msgstr "Jpeg(失真)" #: ../gtk/src/hocr/HOCRPdfExporter.cc:493 ../qt/src/hocr/HOCRPdfExporter.cc:482 msgid "PDF Files" msgstr "PDF æ¡£" #: ../gtk/src/hocr/HOCRPdfExporter.cc:494 ../qt/src/hocr/HOCRPdfExporter.cc:482 msgid "Save PDF Output..." msgstr "存储 PDF 输出……" #: ../gtk/src/hocr/HOCRPdfExporter.cc:500 ../qt/src/hocr/HOCRPdfExporter.cc:488 msgid "Invalid Output" msgstr "无效输出" #: ../gtk/src/hocr/HOCRPdfExporter.cc:500 ../qt/src/hocr/HOCRPdfExporter.cc:488 msgid "Cannot overwrite a file which is a source image of this document." msgstr "ä¸èƒ½æ”¹å†™æ­¤æ–‡ä»¶çš„æ¥æºå›¾åƒæ¡£ã€‚" #: ../gtk/src/hocr/HOCRPdfExporter.cc:516 ../qt/src/hocr/HOCRPdfExporter.cc:511 msgid "Failed to create output" msgstr "ä¸èƒ½åˆ›å»ºè¾“出" #: ../gtk/src/hocr/HOCRPdfExporter.cc:516 ../qt/src/hocr/HOCRPdfExporter.cc:511 msgid "Failed to create output. The returned error was: %1" msgstr "ä¸èƒ½åˆ›å»ºè¾“出。返回错误:%1" #: ../gtk/src/hocr/HOCRPdfExporter.cc:558 ../qt/src/hocr/HOCRPdfExporter.cc:551 msgid "The operation was cancelled" msgstr "已喿¶ˆæ“作" #: ../gtk/src/hocr/HOCRPdfExporter.cc:607 ../qt/src/hocr/HOCRPdfExporter.cc:597 msgid "Failed to render page %1" msgstr "ä¸èƒ½ç»˜ç”»ç¬¬ %1 页" #: ../gtk/src/hocr/HOCRPdfExporter.cc:614 ../qt/src/hocr/HOCRPdfExporter.cc:604 msgid "Exporting to PDF..." msgstr "输出至 PDF..." #: ../gtk/src/hocr/HOCRPdfExporter.cc:619 ../qt/src/hocr/HOCRPdfExporter.cc:609 msgid "The PDF export failed: %1." msgstr "ä¸èƒ½è¾“出 PDF:%1。" #: ../gtk/src/hocr/HOCRPdfExporter.cc:673 ../qt/src/hocr/HOCRPdfExporter.cc:662 msgid "The PDF library could not load the font '%1'." msgstr "PDF åº“ä¸æ”¯æŒæ‰€é€‰æ‹©å­—体 '%1'。" #: ../gtk/src/hocr/HOCRTextExporter.cc:37 ../gtk/src/OutputEditorText.cc:274 #: ../qt/src/hocr/HOCRTextExporter.cc:39 ../qt/src/OutputEditorText.cc:239 msgid "Text Files" msgstr "文本" #: ../gtk/src/hocr/HOCRTextExporter.cc:38 ../qt/src/hocr/HOCRTextExporter.cc:39 msgid "Save Text Output..." msgstr "存储文字输出……" #: ../gtk/src/hocr/HOCRTextExporter.cc:46 ../qt/src/hocr/HOCRTextExporter.cc:47 msgid "The text export failed: unable to write output file." msgstr "ä¸èƒ½è¾“出文本:ä¸èƒ½åˆ›å»ºè¾“出档。" #: ../gtk/src/hocr/OutputEditorHOCR.cc:269 #: ../qt/src/hocr/OutputEditorHOCR.cc:230 msgid "Block" msgstr "æ–¹å—" #: ../gtk/src/hocr/OutputEditorHOCR.cc:275 #: ../qt/src/hocr/OutputEditorHOCR.cc:232 msgid "Line" msgstr "线æ¡" #: ../gtk/src/hocr/OutputEditorHOCR.cc:278 #: ../qt/src/hocr/OutputEditorHOCR.cc:233 msgid "Word" msgstr "å­—è¯" #: ../gtk/src/hocr/OutputEditorHOCR.cc:281 #: ../qt/src/hocr/OutputEditorHOCR.cc:234 msgid "Misspelled word" msgstr "错拼字è¯" #: ../gtk/src/hocr/OutputEditorHOCR.cc:435 #: ../qt/src/hocr/OutputEditorHOCR.cc:317 msgid "" "The following pages could not be processed:\n" "%1" msgstr "" "ä¸èƒ½å¤„ç†ä¸‹åˆ—页é¢ï¼š\n" "%1" #: ../gtk/src/hocr/OutputEditorHOCR.cc:436 #: ../qt/src/hocr/OutputEditorHOCR.cc:318 msgid "Recognition errors" msgstr "辨认时出现错误" #: ../gtk/src/hocr/OutputEditorHOCR.cc:594 #: ../qt/src/hocr/OutputEditorHOCR.cc:500 #: ../qt/src/hocr/OutputEditorHOCR.cc:512 msgid "Multiple values" msgstr "多个数值" #. Merging allowed #: ../gtk/src/hocr/OutputEditorHOCR.cc:778 #: ../qt/src/hocr/OutputEditorHOCR.cc:641 msgid "Merge" msgstr "åˆå¹¶" #: ../gtk/src/hocr/OutputEditorHOCR.cc:786 #: ../gtk/src/hocr/OutputEditorHOCR.cc:877 #: ../qt/src/hocr/OutputEditorHOCR.cc:643 #: ../qt/src/hocr/OutputEditorHOCR.cc:725 msgid "Split from parent" msgstr "从上层分拆出æ¥" #. Swapping allowed #: ../gtk/src/hocr/OutputEditorHOCR.cc:797 #: ../qt/src/hocr/OutputEditorHOCR.cc:647 msgid "Swap" msgstr "对æ¢" #: ../gtk/src/hocr/OutputEditorHOCR.cc:821 #: ../qt/src/hocr/OutputEditorHOCR.cc:693 msgid "Add graphic region" msgstr "æ–°å¢žå›¾åƒæœ¬åœ°" #: ../gtk/src/hocr/OutputEditorHOCR.cc:824 #: ../qt/src/hocr/OutputEditorHOCR.cc:694 msgid "Add text block" msgstr "新增文字方å—" #: ../gtk/src/hocr/OutputEditorHOCR.cc:828 #: ../qt/src/hocr/OutputEditorHOCR.cc:696 msgid "Add paragraph" msgstr "新增段è½" #: ../gtk/src/hocr/OutputEditorHOCR.cc:832 #: ../qt/src/hocr/OutputEditorHOCR.cc:698 msgid "Add line" msgstr "新增线æ¡" #: ../gtk/src/hocr/OutputEditorHOCR.cc:836 #: ../qt/src/hocr/OutputEditorHOCR.cc:700 msgid "Add word" msgstr "新增字è¯" #: ../gtk/src/hocr/OutputEditorHOCR.cc:852 #: ../qt/src/hocr/OutputEditorHOCR.cc:710 msgid "No suggestions" msgstr "没有推è" #: ../gtk/src/hocr/OutputEditorHOCR.cc:858 #: ../qt/src/hocr/OutputEditorHOCR.cc:714 msgid "Add to dictionary" msgstr "新增至è¯å…¸" #: ../gtk/src/hocr/OutputEditorHOCR.cc:864 #: ../qt/src/hocr/OutputEditorHOCR.cc:716 msgid "Ignore word" msgstr "忽略字è¯" #: ../gtk/src/hocr/OutputEditorHOCR.cc:926 #: ../gtk/src/hocr/OutputEditorHOCR.cc:965 #: ../qt/src/hocr/OutputEditorHOCR.cc:795 #: ../qt/src/hocr/OutputEditorHOCR.cc:832 msgid "hOCR HTML Files" msgstr "hOCR HTML æ¡£" #: ../gtk/src/hocr/OutputEditorHOCR.cc:927 #: ../qt/src/hocr/OutputEditorHOCR.cc:795 msgid "Open hOCR File" msgstr "打开 hOCR æ¡£" #: ../gtk/src/hocr/OutputEditorHOCR.cc:936 #: ../qt/src/hocr/OutputEditorHOCR.cc:802 msgid "Failed to open file" msgstr "ä¸èƒ½æ‰“开文件" #: ../gtk/src/hocr/OutputEditorHOCR.cc:936 #: ../qt/src/hocr/OutputEditorHOCR.cc:802 msgid "The file could not be opened: %1." msgstr "ä¸èƒ½æ‰“开文件:%1。" #: ../gtk/src/hocr/OutputEditorHOCR.cc:945 #: ../qt/src/hocr/OutputEditorHOCR.cc:809 msgid "Invalid hOCR file" msgstr "无效的 hOCR æ¡£" #: ../gtk/src/hocr/OutputEditorHOCR.cc:945 #: ../qt/src/hocr/OutputEditorHOCR.cc:809 msgid "The file does not appear to contain valid hOCR HTML: %1" msgstr "此文件似乎并ä¸åŒ…嫿œ‰æ•ˆçš„ hOCR HTML:%1" #: ../gtk/src/hocr/OutputEditorHOCR.cc:966 #: ../qt/src/hocr/OutputEditorHOCR.cc:832 msgid "Save hOCR Output..." msgstr "存储 hOCR 输出……" #: ../gtk/src/hocr/OutputEditorHOCR.cc:973 ../gtk/src/OutputEditorText.cc:282 #: ../qt/src/hocr/OutputEditorHOCR.cc:839 ../qt/src/OutputEditorText.cc:246 msgid "Failed to save output" msgstr "ä¸èƒ½å­˜å‚¨è¾“出……" #: ../gtk/src/hocr/OutputEditorHOCR.cc:973 ../gtk/src/OutputEditorText.cc:282 #: ../qt/src/hocr/OutputEditorHOCR.cc:839 ../qt/src/OutputEditorText.cc:246 msgid "Check that you have writing permissions in the selected folder." msgstr "请检查你在所选择数æ®å¤¹æ‹¥æœ‰å†™å…¥æƒé™ã€‚" #: ../gtk/src/hocr/OutputEditorHOCR.cc:1035 ../gtk/src/OutputEditorText.cc:296 #: ../qt/src/hocr/OutputEditorHOCR.cc:894 ../qt/src/OutputEditorText.cc:259 msgid "Output not saved" msgstr "未存储输出" #: ../gtk/src/hocr/OutputEditorHOCR.cc:1035 ../gtk/src/OutputEditorText.cc:296 #: ../qt/src/hocr/OutputEditorHOCR.cc:894 ../qt/src/OutputEditorText.cc:259 msgid "Save output before proceeding?" msgstr "先存储输出å†ç»§ç»­ï¼Ÿ" #: ../gtk/src/hocr/OutputEditorHOCR.cc:1156 ../gtk/src/OutputEditorText.cc:184 #: ../qt/src/hocr/OutputEditorHOCR.cc:991 ../qt/src/OutputEditorText.cc:152 msgid "Replacing..." msgstr "å–代中……" #: ../gtk/src/hocr/OutputEditorHOCR.cc:1181 ../gtk/src/OutputEditorText.cc:192 #: ../qt/src/hocr/OutputEditorHOCR.cc:1014 ../qt/src/OutputEditorText.cc:160 msgid "Applying substitutions..." msgstr "正在套用替æ¢å€¼â€¦â€¦" #: ../gtk/src/MainWindow.cc:131 ../qt/src/MainWindow.cc:295 msgid "Using tesseract" msgstr "采用 tesseract" #: ../gtk/src/MainWindow.cc:178 ../qt/src/MainWindow.cc:194 msgid "Select an image to begin..." msgstr "请选择图åƒä½œä¸ºå¼€å§‹â€¦â€¦" #: ../gtk/src/MainWindow.cc:293 ../qt/src/MainWindow.cc:278 msgid "Multiple sources" msgstr "å¤šä¸ªæ¥æº" #: ../gtk/src/MainWindow.cc:295 ../qt/src/MainWindow.cc:280 msgid "Ready" msgstr "就绪" #: ../gtk/src/MainWindow.cc:442 ../qt/src/MainWindow.cc:423 msgid "New version" msgstr "新版本" #: ../gtk/src/MainWindow.cc:442 ../qt/src/MainWindow.cc:423 msgid "gImageReader %1 is available" msgstr "gImageReader %1 å·²é¢ä¸–" #: ../gtk/src/MainWindow.cc:443 ../qt/src/MainWindow.cc:424 msgid "Download" msgstr "下载" #: ../gtk/src/MainWindow.cc:444 ../qt/src/MainWindow.cc:425 msgid "Changelog" msgstr "修改日志" #: ../gtk/src/MainWindow.cc:445 ../qt/src/MainWindow.cc:426 msgid "Don't notify again" msgstr "ä¸å†æç¤º" #: ../gtk/src/MainWindow.cc:466 ../qt/src/MainWindow.cc:474 msgid "Don't show again" msgstr "ä¸å†æ˜¾ç¤º" #: ../gtk/src/MainWindow.cc:467 ../gtk/src/MainWindow.cc:480 #: ../qt/src/MainWindow.cc:475 msgid "Install" msgstr "安装" #: ../gtk/src/MainWindow.cc:487 ../qt/src/MainWindow.cc:487 msgid "Spelling dictionary missing" msgstr "é—æ¼æ‹¼å†™è¯å…¸" #: ../gtk/src/MainWindow.cc:487 ../qt/src/MainWindow.cc:487 msgid "The spellcheck dictionary for %1 is not installed" msgstr "未安装 %1 的拼写è¯å…¸" #: ../gtk/src/MainWindow.cc:494 ../gtk/src/MainWindow.cc:523 #: ../qt/src/MainWindow.cc:493 msgid "Installing spelling dictionary for '%1'" msgstr "正在安装 '%1' 的拼写è¯å…¸" #: ../gtk/src/MainWindow.cc:515 ../gtk/src/MainWindow.cc:536 #: ../gtk/src/MainWindow.cc:544 ../gtk/src/MainWindow.cc:592 #: ../gtk/src/MainWindow.cc:597 ../gtk/src/TessdataManager.cc:60 #: ../gtk/src/TessdataManager.cc:70 ../gtk/src/TessdataManager.cc:339 #: ../qt/src/MainWindow.cc:512 ../qt/src/MainWindow.cc:525 #: ../qt/src/MainWindow.cc:534 ../qt/src/MainWindow.cc:578 #: ../qt/src/MainWindow.cc:583 ../qt/src/TessdataManager.cc:74 #: ../qt/src/TessdataManager.cc:84 ../qt/src/TessdataManager.cc:315 msgid "Error" msgstr "错误" #: ../gtk/src/MainWindow.cc:515 ../qt/src/MainWindow.cc:512 msgid "Failed to install spelling dictionary: %1" msgstr "ä¸èƒ½å®‰è£…拼写è¯å…¸ï¼š%1" #: ../gtk/src/MainWindow.cc:536 ../qt/src/MainWindow.cc:525 msgid "Failed to create directory for spelling dictionaries." msgstr "ä¸èƒ½åˆ›å»ºæ‹¼å†™è¯å…¸ç›®å½•。" #: ../gtk/src/MainWindow.cc:544 ../qt/src/MainWindow.cc:534 msgid "Could not read %1: %2." msgstr "ä¸èƒ½è¯»å…¥ %1:%2。" #: ../gtk/src/MainWindow.cc:571 ../qt/src/MainWindow.cc:558 msgid "Downloading '%1'..." msgstr "正在下载 '%1'……" #: ../gtk/src/MainWindow.cc:592 ../qt/src/MainWindow.cc:578 msgid "" "The following dictionaries could not be downloaded:\n" "%1\n" "\n" "Check the connectivity and directory permissions.\n" "Hint: If you don't have write permissions in system folders, you can switch " "to user paths in the settings dialog." msgstr "" "ä¸èƒ½ä¸‹è½½æˆ–删除下列è¯å…¸ï¼š\n" "%1\n" "\n" "请检查连接åŠç›®å½•æƒé™ã€‚\n" "æç¤ºï¼šå¦‚果您在系统数æ®å¤¹ä¸­æ²¡æœ‰å†™å…¥æƒé™ï¼Œæ‚¨å¯ä»¥åœ¨è®¾ç½®å¯¹è¯æ¡†ä¸­åˆ‡æ¢åˆ°ç”¨æˆ·è·¯å¾„。" #: ../gtk/src/MainWindow.cc:595 ../qt/src/MainWindow.cc:581 msgid "Dictionaries installed" msgstr "已安装è¯å…¸" #: ../gtk/src/MainWindow.cc:595 msgid "" "The following dictionaries were installed:\n" "%1" msgstr "" "已安装下列è¯å…¸ï¼š\n" "%1" #: ../gtk/src/MainWindow.cc:597 ../qt/src/MainWindow.cc:583 msgid "No spelling dictionaries found for '%1'." msgstr "找ä¸åˆ° '%1' 的拼写è¯å…¸ã€‚" #: ../gtk/src/OutputEditorText.cc:154 ../qt/src/OutputEditorText.cc:137 msgid "Stripping line breaks..." msgstr "去除æ¢è¡Œç¬¦å·â€¦â€¦" #: ../gtk/src/OutputEditorText.cc:162 msgid "Check spelling" msgstr "检查拼写" #: ../gtk/src/OutputEditorText.cc:231 ../qt/src/OutputEditorText.cc:196 msgid "File: %1" msgstr "文件:%1" #: ../gtk/src/OutputEditorText.cc:234 ../qt/src/OutputEditorText.cc:199 msgid "Page: %1" msgstr "页é¢ï¼š%1" #: ../gtk/src/OutputEditorText.cc:247 ../gtk/src/Recognizer.cc:471 #: ../qt/src/Recognizer.cc:462 msgid "" "\n" "[Failed to recognize page %1]\n" msgstr "" "\n" "[ä¸èƒ½è¾¨è®¤ç¬¬ %1 页]\n" #: ../gtk/src/OutputEditorText.cc:275 ../qt/src/OutputEditorText.cc:239 msgid "Save Output..." msgstr "存储输出……" #: ../gtk/src/Recognizer.cc:179 ../qt/src/Recognizer.cc:172 msgid "No languages available" msgstr "没有å¯ç”¨è¯­è¨€" #: ../gtk/src/Recognizer.cc:179 ../qt/src/Recognizer.cc:172 msgid "" "No tesseract languages are available for use. Recognition will not work." msgstr "没有å¯ç”¨çš„ tesseract 语言。辨认将会失败。" #: ../gtk/src/Recognizer.cc:233 ../qt/src/Recognizer.cc:232 msgid "Multilingual" msgstr "多语言" #: ../gtk/src/Recognizer.cc:285 ../qt/src/Recognizer.cc:277 msgid "Automatic page segmentation" msgstr "自动分割页é¢" #: ../gtk/src/Recognizer.cc:286 ../qt/src/Recognizer.cc:278 msgid "Page segmentation with orientation and script detection" msgstr "分割页é¢å¹¶æ£€æµ‹æ–¹å‘åŠæ–‡å­—" #: ../gtk/src/Recognizer.cc:287 ../qt/src/Recognizer.cc:279 msgid "Assume single column of text" msgstr "å‡è®¾åªæœ‰ä¸€æ æ–‡å­—" #: ../gtk/src/Recognizer.cc:288 ../qt/src/Recognizer.cc:280 msgid "Assume single block of vertically aligned text" msgstr "å‡è®¾åªæœ‰ä¸€æ®µçºµå‘对整的文字" #: ../gtk/src/Recognizer.cc:289 ../qt/src/Recognizer.cc:281 msgid "Assume a single uniform block of text" msgstr "å‡è®¾åªæœ‰ä¸€æ®µå‡åŒ€çš„æ–‡å­—" #: ../gtk/src/Recognizer.cc:290 ../qt/src/Recognizer.cc:282 msgid "Assume a line of text" msgstr "å‡è®¾åªæœ‰ä¸€è¡Œæ–‡å­—" #: ../gtk/src/Recognizer.cc:291 ../qt/src/Recognizer.cc:283 msgid "Assume a single word" msgstr "å‡è®¾åªæœ‰ä¸€ä¸ªå­—" #: ../gtk/src/Recognizer.cc:292 ../qt/src/Recognizer.cc:284 msgid "Assume a single word in a circle" msgstr "å‡è®¾æ˜¯åœ†åœˆå†…的一个字" #: ../gtk/src/Recognizer.cc:293 ../qt/src/Recognizer.cc:285 msgid "Sparse text in no particular order" msgstr "没有特定次åºçš„ç¨€ç–æ–‡å­—" #: ../gtk/src/Recognizer.cc:294 ../qt/src/Recognizer.cc:286 msgid "Sparse text with orientation and script detection" msgstr "æ£€æµ‹ç¨€ç–æ–‡å­—的方å‘åŠæ–‡å­—" #: ../gtk/src/Recognizer.cc:309 ../qt/src/Recognizer.cc:297 msgid "Page segmentation mode" msgstr "åˆ†å‰²é¡µé¢æ¨¡å¼" #: ../gtk/src/Recognizer.cc:313 ../qt/src/Recognizer.cc:300 msgid "Character whitelist / blacklist..." msgstr "" #: ../gtk/src/Recognizer.cc:319 ../qt/src/Recognizer.cc:305 msgid "Manage languages..." msgstr "管ç†è¯­è¨€â€¦â€¦" #: ../gtk/src/Recognizer.cc:375 ../qt/src/Recognizer.cc:369 msgid "Current selection" msgstr "现有选择区" #: ../gtk/src/Recognizer.cc:465 ../qt/src/Recognizer.cc:455 msgid "Recognizing page %1 (%2 of %3)" msgstr "辨认第 %1 页(%3 之 %2)" #: ../gtk/src/Recognizer.cc:470 ../qt/src/Recognizer.cc:461 msgid "" "\n" "- Page %1: failed to render page" msgstr "" "\n" "- 第 %1 页:ä¸èƒ½ç»˜ç”»é¡µé¢" #: ../gtk/src/Recognizer.cc:501 ../gtk/src/Recognizer.cc:531 #: ../gtk/src/Recognizer.cc:544 ../qt/src/Recognizer.cc:491 #: ../qt/src/Recognizer.cc:521 ../qt/src/Recognizer.cc:534 msgid "Recognizing..." msgstr "辨认中……" #: ../gtk/src/Recognizer.cc:505 ../gtk/src/Recognizer.cc:514 #: ../qt/src/Recognizer.cc:495 ../qt/src/Recognizer.cc:504 msgid "Recognition errors occurred" msgstr "辨认时出现错误" #: ../gtk/src/Recognizer.cc:505 ../qt/src/Recognizer.cc:495 msgid "The following errors occurred:%1" msgstr "出现下列错误:%1" #: ../gtk/src/Recognizer.cc:514 ../qt/src/Recognizer.cc:504 msgid "Failed to initialize tesseract" msgstr "ä¸èƒ½åˆå§‹åŒ– tesseract" #: ../gtk/src/scanner/ScannerSane.cc:84 ../gtk/src/scanner/ScannerTwain.cc:288 #: ../qt/src/scanner/ScannerSane.cc:85 ../qt/src/scanner/ScannerTwain.cc:286 msgid "Scan canceled" msgstr "已喿¶ˆæ‰«æ" #: ../gtk/src/scanner/ScannerSane.cc:159 ../gtk/src/scanner/ScannerTwain.cc:186 #: ../qt/src/scanner/ScannerSane.cc:159 ../qt/src/scanner/ScannerTwain.cc:178 msgid "No scanner specified" msgstr "未指定扫æå™¨" #: ../gtk/src/scanner/ScannerSane.cc:168 ../gtk/src/scanner/ScannerTwain.cc:195 #: ../qt/src/scanner/ScannerSane.cc:168 ../qt/src/scanner/ScannerTwain.cc:187 msgid "Unable to connect to scanner" msgstr "ä¸èƒ½è¿žæŽ¥è‡³æ‰«æå™¨" #: ../gtk/src/scanner/ScannerSane.cc:403 ../gtk/src/scanner/ScannerTwain.cc:266 #: ../gtk/src/scanner/ScannerTwain.cc:292 ../qt/src/scanner/ScannerSane.cc:403 #: ../qt/src/scanner/ScannerTwain.cc:258 ../qt/src/scanner/ScannerTwain.cc:290 msgid "Unable to start scan" msgstr "ä¸èƒ½å¼€å§‹æ‰«æ" #: ../gtk/src/scanner/ScannerSane.cc:411 ../gtk/src/scanner/ScannerSane.cc:461 #: ../gtk/src/scanner/ScannerTwain.cc:318 ../qt/src/scanner/ScannerSane.cc:411 #: ../qt/src/scanner/ScannerSane.cc:461 ../qt/src/scanner/ScannerTwain.cc:316 msgid "Error communicating with scanner" msgstr "与扫æå™¨æ²Ÿé€šå‡ºçŽ°é”™è¯¯" #: ../gtk/src/scanner/ScannerSane.cc:520 ../qt/src/scanner/ScannerSane.cc:517 msgid "Failed to save image" msgstr "ä¸èƒ½å­˜å‚¨å›¾åƒ" #: ../gtk/src/scanner/ScannerSane.cc:800 ../qt/src/scanner/ScannerSane.cc:797 msgid "Operation is cancelled." msgstr "已喿¶ˆæ“作。" #: ../gtk/src/scanner/ScannerSane.cc:802 ../qt/src/scanner/ScannerSane.cc:799 msgid "Device is busy." msgstr "设备现正ç¹å¿™ã€‚" #: ../gtk/src/scanner/ScannerSane.cc:804 ../qt/src/scanner/ScannerSane.cc:801 msgid "Cover is opened." msgstr "机盖已打开。" #: ../gtk/src/scanner/ScannerSane.cc:806 ../qt/src/scanner/ScannerSane.cc:803 msgid "Document feeder jammed." msgstr "进纸器å¡çº¸ã€‚" #: ../gtk/src/scanner/ScannerSane.cc:808 ../qt/src/scanner/ScannerSane.cc:805 msgid "Document feeder out of documents." msgstr "进纸器缺文件。" #: ../gtk/src/scanner/ScannerSane.cc:810 ../qt/src/scanner/ScannerSane.cc:807 msgid "Access to scanner is denied." msgstr "访问扫æå™¨è¢«æ‹’ç»ã€‚" #: ../gtk/src/SourceManager.cc:118 ../qt/src/SourceManager.cc:124 msgid "PDFs with text" msgstr "嫿–‡å­—çš„ PDF" #: ../gtk/src/SourceManager.cc:118 ../qt/src/SourceManager.cc:124 msgid "" "These PDF files already contain text:\n" "%1" msgstr "" "这些 PDF æ¡£å·²åŒ…å«æ–‡å­—:\n" "%1" #: ../gtk/src/SourceManager.cc:127 ../qt/src/SourceManager.cc:132 msgid "Unable to open files" msgstr "ä¸èƒ½æ‰“开文件" #: ../gtk/src/SourceManager.cc:127 ../qt/src/SourceManager.cc:132 msgid "The following files could not be opened:%1" msgstr "ä¸èƒ½æ‰“开下列文件:%1" #: ../gtk/src/SourceManager.cc:141 ../qt/src/SourceManager.cc:143 msgid "Enter password for file '%1':" msgstr "请为 '%1' 档输入å£ä»¤ï¼š" #: ../gtk/src/SourceManager.cc:197 ../qt/src/SourceManager.cc:214 msgid "Images and PDFs" msgstr "图åƒä¸Ž PDF æ¡£" #: ../gtk/src/SourceManager.cc:202 ../qt/src/SourceManager.cc:215 msgid "Select Files" msgstr "选择文件" #: ../gtk/src/SourceManager.cc:208 ../qt/src/SourceManager.cc:226 msgid "Clipboard Error" msgstr "剪贴æ¿é”™è¯¯" #: ../gtk/src/SourceManager.cc:208 ../qt/src/SourceManager.cc:226 msgid "Failed to read the clipboard." msgstr "ä¸èƒ½è¯»å…¥å‰ªè´´æ¿ã€‚" #: ../gtk/src/SourceManager.cc:212 ../qt/src/SourceManager.cc:230 #: ../qt/src/SourceManager.cc:236 msgid "Pasted %1" msgstr "已贴上 %1" #: ../gtk/src/SourceManager.cc:224 ../qt/src/SourceManager.cc:243 msgid "Screenshot Error" msgstr "ç”»é¢æˆªå›¾é”™è¯¯" #: ../gtk/src/SourceManager.cc:224 ../qt/src/SourceManager.cc:243 msgid "Failed to take screenshot." msgstr "ä¸èƒ½æˆªå–ç”»é¢ã€‚" #: ../gtk/src/SourceManager.cc:228 ../qt/src/SourceManager.cc:247 msgid "Screenshot %1" msgstr "截图 %1" #: ../gtk/src/SourceManager.cc:233 ../qt/src/SourceManager.cc:252 msgid "Saving image..." msgstr "存储图åƒä¸­â€¦â€¦" #: ../gtk/src/SourceManager.cc:240 ../qt/src/SourceManager.cc:265 msgid "Cannot Write File" msgstr "ä¸èƒ½å†™å…¥æ–‡ä»¶" #: ../gtk/src/SourceManager.cc:240 ../qt/src/SourceManager.cc:265 msgid "Could not write to %1." msgstr "ä¸èƒ½å†™è¿› %1。" #: ../gtk/src/SourceManager.cc:267 ../qt/src/SourceManager.cc:287 msgid "Delete File?" msgstr "删除文件?" #: ../gtk/src/SourceManager.cc:267 ../qt/src/SourceManager.cc:287 msgid "The following files will be deleted:%1" msgstr "下列文件将会被删除:%1" #: ../gtk/src/SourceManager.cc:332 ../qt/src/SourceManager.cc:338 msgid "Missing File" msgstr "é—æ¼æ–‡ä»¶" #: ../gtk/src/SourceManager.cc:332 ../qt/src/SourceManager.cc:338 msgid "" "The following file has been deleted or moved:\n" "%1" msgstr "" "下列文件已被删除或删除:\n" "%1" #: ../gtk/src/SubstitutionsManager.cc:33 ../qt/src/SubstitutionsManager.cc:73 msgid "Search for" msgstr "寻找" #: ../gtk/src/SubstitutionsManager.cc:34 ../qt/src/SubstitutionsManager.cc:73 msgid "Replace with" msgstr "å–代" #: ../gtk/src/SubstitutionsManager.cc:69 ../gtk/src/SubstitutionsManager.cc:103 #: ../qt/src/SubstitutionsManager.cc:106 ../qt/src/SubstitutionsManager.cc:143 msgid "Substitutions List" msgstr "æ›¿æ¢æ¸…å•" #: ../gtk/src/SubstitutionsManager.cc:70 ../qt/src/SubstitutionsManager.cc:106 msgid "Open Substitutions List" msgstr "å¼€å§‹æ›¿æ¢æ¸…å•" #: ../gtk/src/SubstitutionsManager.cc:75 ../qt/src/SubstitutionsManager.cc:112 msgid "Error Reading File" msgstr "读案错误" #: ../gtk/src/SubstitutionsManager.cc:75 ../qt/src/SubstitutionsManager.cc:112 msgid "Unable to read '%1'." msgstr "ä¸èƒ½è¯»å…¥ '%1'。" #: ../gtk/src/SubstitutionsManager.cc:97 ../qt/src/SubstitutionsManager.cc:137 msgid "Errors Occurred Reading File" msgstr "读入文件时出现错误" #: ../gtk/src/SubstitutionsManager.cc:97 ../qt/src/SubstitutionsManager.cc:137 msgid "Some entries of the substitutions list could not be read." msgstr "ä¸èƒ½è¯»å…¥æ›¿æ¢æ¸…å•内æŸäº›é¡¹ç›®ã€‚" #: ../gtk/src/SubstitutionsManager.cc:104 ../qt/src/SubstitutionsManager.cc:143 msgid "Save Substitutions List" msgstr "å­˜å‚¨æ›¿æ¢æ¸…å•" #: ../gtk/src/SubstitutionsManager.cc:110 ../qt/src/SubstitutionsManager.cc:149 msgid "Error Saving File" msgstr "存档错误" #: ../gtk/src/SubstitutionsManager.cc:110 ../qt/src/SubstitutionsManager.cc:149 msgid "Unable to write to '%1'." msgstr "ä¸èƒ½å†™è¿› '%1'。" #: ../gtk/src/SubstitutionsManager.cc:127 ../qt/src/SubstitutionsManager.cc:162 msgid "Save List?" msgstr "存储清å•?" #: ../gtk/src/SubstitutionsManager.cc:127 ../qt/src/SubstitutionsManager.cc:162 msgid "Do you want to save the current list?" msgstr "是å¦éœ€è¦å­˜å‚¨çŽ°æœ‰æ¸…å•?" #: ../gtk/src/TessdataManager.cc:60 ../qt/src/TessdataManager.cc:74 #, fuzzy msgid "" "A session connection to the PackageKit backend is required for managing " "system-wide tesseract language packs, but it was not found. This service is " "usually provided by a software-management application such as Gnome " "Software. Please install software which provides the necessary PackageKit " "interface, use other system package management software to manage the " "tesseract language packs directly, or switch to using the user tessdata path " "in the configuration dialog." msgstr "" "ç®¡ç† tesseract çš„ç³»ç»Ÿè¯­è¨€åŒ…é¡»è¦ PackageKit,但它并ä¸å­˜åœ¨ã€‚请利用系统的组件管" "ç†è½¯ä»¶æ¥ç®¡ç† tesseract 的语言包,或改用设置页é¢å†…çš„ tessdata 用户路径。" #: ../gtk/src/TessdataManager.cc:65 ../qt/src/TessdataManager.cc:79 msgid "Fetching available languages" msgstr "å–å¾—å¯ç”¨è¯­è¨€" #: ../gtk/src/TessdataManager.cc:70 ../gtk/src/TessdataManager.cc:96 #: ../gtk/src/TessdataManager.cc:197 ../qt/src/TessdataManager.cc:84 #: ../qt/src/TessdataManager.cc:101 ../qt/src/TessdataManager.cc:197 msgid "Failed to fetch list of available languages: %1" msgstr "ä¸èƒ½å–å¾—å¯ç”¨è¯­è¨€çš„æ¸…å•:%1" #: ../gtk/src/TessdataManager.cc:104 ../qt/src/TessdataManager.cc:113 #: ../qt/src/TessdataManager.cc:122 msgid "Parsing error: %1" msgstr "分æžé”™è¯¯ï¼š%1" #: ../gtk/src/TessdataManager.cc:235 ../qt/src/TessdataManager.cc:232 msgid "Applying changes..." msgstr "正在套用改动……" #: ../gtk/src/TessdataManager.cc:297 ../qt/src/TessdataManager.cc:278 msgid "Failed to create directory for tessdata files." msgstr "ä¸èƒ½ä¸º tessdata 档创建目录。" #: ../gtk/src/TessdataManager.cc:306 ../qt/src/TessdataManager.cc:287 msgid "Downloading %1..." msgstr "正在下载 %1……" #: ../gtk/src/TessdataManager.cc:330 msgid "" "The following files could not be downloaded or removed:\n" "%1\n" "\n" "Check the connectivity and directory permissions.\n" "\n" "Hint: If you don't have write permissions in system folders, you can switch " "to user paths in the settings dialog." msgstr "" "ä¸èƒ½ä¸‹è½½æˆ–删除下列文件:\n" "%1\n" "\n" "请检查连接åŠç›®å½•æƒé™ã€‚\n" "\n" "æç¤ºï¼šå¦‚果您在系统数æ®å¤¹ä¸­æ²¡æœ‰å†™å…¥æƒé™ï¼Œæ‚¨å¯ä»¥åœ¨è®¾ç½®å¯¹è¯æ¡†ä¸­åˆ‡æ¢åˆ°ç”¨æˆ·è·¯å¾„。" #: ../gtk/src/Utils.cc:64 msgid "Yes" msgstr "是" #: ../gtk/src/Utils.cc:67 msgid "No" msgstr "å¦" #: ../gtk/src/Utils.cc:76 msgid "Discard" msgstr "弃置" #: ../qt/data/AboutDialog.ui.h:1 msgid "About gImageReader" msgstr "有关 gImageReader" #: ../qt/data/AboutDialog.ui.h:3 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/CrashHandler.ui.h:3 msgid "" "

Tesseract has " "aborted

Tesseract (the OCR engine) has aborted while " "recognizing text. This may occur if the used traineddatas are corrupt or " "incomplatible with the version of tesseract in use, or due to a bug in " "tesseract.

The stacktrace below may provide additional information " "about where the crash occured.

" msgstr "" #: ../qt/data/MainWindow.ui.h:17 msgid "Flatbed" msgstr "å¹³æ¿" #: ../qt/data/MainWindow.ui.h:18 msgid "ADF Front" msgstr "ADF æ­£é¢" #: ../qt/data/MainWindow.ui.h:19 msgid "ADF Back" msgstr "ADF 背é¢" #: ../qt/data/MainWindow.ui.h:20 msgid "ADF Duplex" msgstr "ADF åŒé¢" #. Remove & from some labels which designer insists in adding #: ../qt/data/MainWindow.ui.h:21 ../qt/src/Ui_MainWindow.hh:50 msgid "Sources" msgstr "æ¥æº" #: ../qt/data/MainWindow.ui.h:22 msgid "Zoom In" msgstr "放大" #: ../qt/data/MainWindow.ui.h:24 msgid "Zoom Out" msgstr "缩å°" #: ../qt/data/MainWindow.ui.h:26 msgid "Normal Size" msgstr "正常尺寸" #: ../qt/data/MainWindow.ui.h:28 msgid "Best Fit" msgstr "最佳尺寸" #: ../qt/data/MainWindow.ui.h:30 msgid "Rotate Left" msgstr "å‘左旋转" #: ../qt/data/MainWindow.ui.h:31 msgid "Rotate left" msgstr "å‘左旋转" #: ../qt/data/MainWindow.ui.h:32 msgid "Rotate Right" msgstr "å‘峿—‹è½¬" #: ../qt/data/MainWindow.ui.h:33 msgid "Rotate right" msgstr "å‘峿—‹è½¬" #: ../qt/data/MainWindow.ui.h:34 msgid "Image Controls" msgstr "å›¾åƒæŽ§åˆ¶" #: ../qt/data/MainWindow.ui.h:36 msgid "Autodetect Layout" msgstr "自动检测布局" #: ../qt/data/MainWindow.ui.h:38 msgid "Toggle Output Pane" msgstr "切æ¢è¾“å‡ºé¢æ¿" #: ../qt/data/PdfExportDialog.ui.h:5 msgid "Backend:" msgstr "åŽç«¯ï¼š" #: ../qt/data/PdfExportDialog.ui.h:8 msgid "Portrait" msgstr "纵å‘" #: ../qt/data/PdfExportDialog.ui.h:9 msgid "Landscape" msgstr "横å‘" #: ../qt/src/hocr/HOCRPdfExporter.cc:142 msgid "Failed to write to file" msgstr "ä¸èƒ½å†™å…¥æ–‡ä»¶" #. Output toolbar #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:55 #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:56 msgid "Open hOCR file" msgstr "打开 hOCR æ¡£" #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:57 #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:58 msgid "Save as hOCR text" msgstr "存储为 hOCR 文字" #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:79 #: ../qt/src/Ui_OutputEditorText.hh:106 msgid "Find and Replace" msgstr "寻找åŠå–代" #: ../qt/src/MainWindow.cc:581 #, fuzzy msgid "" "The following dictionary files were installed:\n" "%1" msgstr "已安装下列è¯å…¸æ¡£ï¼š%1" #: ../qt/src/TessdataManager.cc:308 msgid "" "The following files could not be downloaded or removed:\n" "%1\n" "\n" "Check the connectivity and directory permissions.\n" "Hint: If you don't have write permissions in system folders, you can switch " "to user paths in the settings dialog." msgstr "" "ä¸èƒ½ä¸‹è½½æˆ–删除下列文件:\n" "%1\n" "\n" "请检查连接åŠç›®å½•æƒé™ã€‚\n" "æç¤ºï¼šå¦‚果您在系统数æ®å¤¹ä¸­æ²¡æœ‰å†™å…¥æƒé™ï¼Œæ‚¨å¯ä»¥åœ¨è®¾ç½®å¯¹è¯æ¡†ä¸­åˆ‡æ¢åˆ°ç”¨æˆ·è·¯å¾„。" #: ../qt/src/Ui_MainWindow.hh:51 msgid "Output" msgstr "输出:" #: ../qt/src/Ui_MainWindow.hh:135 msgid "OCR mode:" msgstr "OCR 模å¼ï¼š" #: ../qt/src/Ui_MainWindow.hh:209 msgid "Remove Image" msgstr "删除图åƒ" #: ../qt/src/Ui_MainWindow.hh:212 msgid "Delete Image" msgstr "删除图åƒ" #: ../qt/src/Ui_MainWindow.hh:215 msgid "Clear List" msgstr "清除清å•" #: ../qt/src/Ui_OutputEditorText.hh:101 msgid "Strip Line Breaks" msgstr "去除æ¢è¡Œç¬¦å·" #: ../qt/src/Ui_OutputEditorText.hh:115 msgid "Save Output" msgstr "存储输出" #: ../qt/src/Ui_OutputEditorText.hh:117 msgid "Clear Output" msgstr "清除输出" #~ msgid "The application has crashed" #~ msgstr "应用程åºå·²å¼‚常终止" #~ msgid "Could not read %1: %2" #~ msgstr "ä¸èƒ½è¯»å…¥ %1:%2。" #~ 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 。" gImageReader-3.3.1/po/zh_HK.po000066400000000000000000001736101351740627400160340ustar00rootroot00000000000000# 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-2018. # Sandro Mani , 2016, 2017. msgid "" msgstr "" "Project-Id-Version: \n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2019-07-25 23:17+0200\n" "PO-Revision-Date: 2018-05-29 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" #: ../data/gimagereader.desktop.in.h:1 msgid "OCR application" msgstr "OCR 應用程å¼" #: ../gtk/data/appmenu.ui.h:1 ../qt/src/Ui_MainWindow.hh:167 msgid "Redetect Languages" msgstr "釿–°åµæ¸¬èªžè¨€" #: ../gtk/data/appmenu.ui.h:2 ../qt/src/Ui_MainWindow.hh:170 msgid "Manage Languages" msgstr "管ç†èªžè¨€" #: ../gtk/data/appmenu.ui.h:3 ../gtk/data/ConfigDialog.ui.h:1 #: ../qt/data/ConfigDialog.ui.h:1 ../qt/src/Ui_MainWindow.hh:173 msgid "Preferences" msgstr "é¸é …" #: ../gtk/data/appmenu.ui.h:4 ../gtk/data/ConfigDialog.ui.h:2 #: ../gtk/src/MainWindow.cc:482 ../qt/src/MainWindow.cc:481 #: ../qt/src/Ui_MainWindow.hh:178 msgid "Help" msgstr "å”助" #: ../gtk/data/appmenu.ui.h:5 ../qt/data/AboutDialog.ui.h:2 #: ../qt/src/Ui_MainWindow.hh:181 msgid "About" msgstr "關於" #: ../gtk/data/appmenu.ui.h:6 msgid "Quit" msgstr "離開" #: ../gtk/data/ConfigDialog.ui.h:3 ../gtk/data/MainWindow.ui.h:47 #: ../gtk/data/OutputEditorHOCR.ui.h:3 ../gtk/data/PdfExportDialog.ui.h:3 #: ../gtk/src/FileDialogs.cc:152 ../gtk/src/Utils.cc:61 #: ../qt/data/ConfigDialog.ui.h:26 msgid "OK" msgstr "確定" #: ../gtk/data/ConfigDialog.ui.h:4 msgid "Output pane orientation:" msgstr "è¼¸å‡ºé¢æ¿çš„æ–¹å‘:" #: ../gtk/data/ConfigDialog.ui.h:5 msgid "Horizontal" msgstr "æ©«å‘" #: ../gtk/data/ConfigDialog.ui.h:6 msgid "Vertical" msgstr "縱å‘" #: ../gtk/data/ConfigDialog.ui.h:7 ../qt/data/ConfigDialog.ui.h:18 msgid "Query to install missing spellcheck dictionaries" msgstr "æŸ¥æ‰¾éºæ¼å®‰è£çš„æ‹¼å­—詞典" #: ../gtk/data/ConfigDialog.ui.h:8 ../qt/data/ConfigDialog.ui.h:4 msgid "Automatically check for new program versions" msgstr "自動檢查新版本" #: ../gtk/data/ConfigDialog.ui.h:9 ../qt/data/ConfigDialog.ui.h:3 msgid "Predefined language definitions:" msgstr "é è¨­èªžè¨€å®šç¾©ï¼š" #: ../gtk/data/ConfigDialog.ui.h:10 ../qt/data/ConfigDialog.ui.h:12 msgid "Additional language definitions:" msgstr "é¡å¤–語言定義:" #: ../gtk/data/ConfigDialog.ui.h:11 ../qt/data/ConfigDialog.ui.h:20 msgid "The prefix of the tesseract language data file" msgstr "tesseract 語言資料檔的å‰ç½®" #: ../gtk/data/ConfigDialog.ui.h:12 ../qt/data/ConfigDialog.ui.h:21 msgid "Prefix" msgstr "å‰ç½®" #: ../gtk/data/ConfigDialog.ui.h:13 ../qt/data/ConfigDialog.ui.h:22 msgid "The ISO 639-1 language code followed by the country code" msgstr "ISO 639-1 語言代碼並國家代碼" #: ../gtk/data/ConfigDialog.ui.h:14 ../qt/data/ConfigDialog.ui.h:23 msgid "ISO Code" msgstr "ISO 代碼" #: ../gtk/data/ConfigDialog.ui.h:15 ../qt/data/ConfigDialog.ui.h:24 msgid "The name of the language" msgstr "語言å稱" #: ../gtk/data/ConfigDialog.ui.h:16 ../qt/data/ConfigDialog.ui.h:25 msgid "Name" msgstr "å稱" #: ../gtk/data/ConfigDialog.ui.h:17 ../gtk/data/MainWindow.ui.h:46 #: ../gtk/data/OutputEditorHOCR.ui.h:2 ../gtk/data/PdfExportDialog.ui.h:2 #: ../gtk/src/Acquirer.cc:34 ../gtk/src/FileDialogs.cc:151 #: ../gtk/src/Utils.cc:70 ../qt/data/ConfigDialog.ui.h:27 #: ../qt/data/MainWindow.ui.h:12 msgid "Cancel" msgstr "å–æ¶ˆ" #: ../gtk/data/ConfigDialog.ui.h:18 ../qt/data/ConfigDialog.ui.h:5 msgid "Output pane font:" msgstr "è¼¸å‡ºé¢æ¿å­—型:" #: ../gtk/data/ConfigDialog.ui.h:19 ../qt/data/ConfigDialog.ui.h:2 msgid "Default" msgstr "é è¨­å€¼" #: ../gtk/data/ConfigDialog.ui.h:20 ../qt/data/ConfigDialog.ui.h:6 msgid "Language data locations:" msgstr "語言資料ä½ç½®ï¼š" #: ../gtk/data/ConfigDialog.ui.h:21 ../qt/data/ConfigDialog.ui.h:13 msgid "Language definitions path:" msgstr "語言定義路徑:" #: ../gtk/data/ConfigDialog.ui.h:22 ../qt/data/ConfigDialog.ui.h:28 msgid "Spelling dictionaries path:" msgstr "拼字詞典路徑:" #: ../gtk/data/ConfigDialog.ui.h:23 ../qt/data/ConfigDialog.ui.h:10 msgid "System-wide paths" msgstr "系統路徑" #: ../gtk/data/ConfigDialog.ui.h:24 ../qt/data/ConfigDialog.ui.h:11 msgid "User paths" msgstr "用戶路徑" #: ../gtk/data/ConfigDialog.ui.h:25 ../qt/data/ConfigDialog.ui.h:29 msgid "Automatically open exported documents with default application" msgstr "自動以é è¨­æ‡‰ç”¨ç¨‹å¼é–‹å•ŸåŒ¯å‡ºçš„æ–‡ä»¶" #: ../gtk/data/CrashHandler.ui.h:1 ../qt/src/CrashHandler.cc:38 msgid "Regenerate backtrace" msgstr "é‡å»º backtrace" #: ../gtk/data/CrashHandler.ui.h:3 #, fuzzy, no-c-format msgid "" "The application has crashed\n" "\n" "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/CrashHandler.ui.h:6 msgid "" "Tesseract has aborted\n" "\n" "Tesseract (the OCR engine) has aborted while recognizing text. This may " "occur if the used traineddatas are corrupt or incomplatible with the version " "of tesseract in use, or due to a bug in tesseract.\n" "\n" "The stacktrace below may provide additional information about where the " "crash occured.\n" msgstr "" #: ../gtk/data/MainWindow.ui.h:1 ../qt/data/MainWindow.ui.h:39 msgid "Toggle output pane" msgstr "切æ›è¼¸å‡ºé¢æ¿" #: ../gtk/data/MainWindow.ui.h:2 ../qt/src/Ui_MainWindow.hh:66 msgid "Rotate current page" msgstr "æ—‹è½‰ç¾æœ‰æ–‡å­—" #: ../gtk/data/MainWindow.ui.h:3 ../qt/src/Ui_MainWindow.hh:67 msgid "Rotate all pages" msgstr "旋轉所有é é¢" #. Sources toolbar #: ../gtk/data/MainWindow.ui.h:4 ../qt/src/Ui_MainWindow.hh:192 msgid "Recent" msgstr "最近" #: ../gtk/data/MainWindow.ui.h:5 ../qt/src/Ui_MainWindow.hh:193 msgid "Paste" msgstr "貼上" #: ../gtk/data/MainWindow.ui.h:6 ../qt/src/Ui_MainWindow.hh:194 msgid "Take Screenshot" msgstr "ç•«é¢æˆªåœ–" #: ../gtk/data/MainWindow.ui.h:7 ../qt/data/MainWindow.ui.h:23 msgid "Zoom in" msgstr "放大" #: ../gtk/data/MainWindow.ui.h:8 ../qt/data/MainWindow.ui.h:25 msgid "Zoom out" msgstr "縮å°" #: ../gtk/data/MainWindow.ui.h:9 ../qt/data/MainWindow.ui.h:27 msgid "Normal size" msgstr "正常大å°" #: ../gtk/data/MainWindow.ui.h:10 ../qt/data/MainWindow.ui.h:29 msgid "Best fit" msgstr "最佳大å°" #: ../gtk/data/MainWindow.ui.h:11 ../qt/src/Ui_MainWindow.hh:75 msgid "Select rotation mode" msgstr "é¸å–旋轉模å¼" #: ../gtk/data/MainWindow.ui.h:12 ../gtk/data/OutputEditorText.ui.h:13 #: ../qt/src/Ui_OutputEditorText.hh:95 msgid "Select insert mode" msgstr "é¸ç”¨æ’入模å¼" #: ../gtk/data/MainWindow.ui.h:13 ../qt/src/Ui_MainWindow.hh:109 #, fuzzy msgid "Select page" msgstr "é¸å–語言" #: ../gtk/data/MainWindow.ui.h:14 ../qt/data/MainWindow.ui.h:35 msgid "Image controls" msgstr "åœ–åƒæŽ§åˆ¶" #: ../gtk/data/MainWindow.ui.h:15 ../qt/src/Ui_MainWindow.hh:139 msgid "Plain text" msgstr "純文字" #: ../gtk/data/MainWindow.ui.h:16 ../qt/src/Ui_MainWindow.hh:139 msgid "hOCR, PDF" msgstr "hOCRã€PDF" #: ../gtk/data/MainWindow.ui.h:17 ../qt/data/MainWindow.ui.h:37 msgid "Autodetect layout" msgstr "è‡ªå‹•åµæ¸¬ä½ˆå±€" #: ../gtk/data/MainWindow.ui.h:18 msgid "Recognize all" msgstr "辨èªå…¨éƒ¨" #: ../gtk/data/MainWindow.ui.h:19 msgid "Select language" msgstr "é¸å–語言" #: ../gtk/data/MainWindow.ui.h:20 ../qt/src/Ui_MainWindow.hh:205 msgid "Add images" msgstr "新增圖åƒ" #: ../gtk/data/MainWindow.ui.h:21 ../qt/src/Ui_MainWindow.hh:204 msgid "Add Images" msgstr "新增圖åƒ" #: ../gtk/data/MainWindow.ui.h:22 ../qt/src/Ui_MainWindow.hh:210 msgid "Remove image from list" msgstr "從清單移除圖åƒ" #: ../gtk/data/MainWindow.ui.h:23 ../qt/src/Ui_MainWindow.hh:213 msgid "Delete image" msgstr "刪除圖åƒ" #: ../gtk/data/MainWindow.ui.h:24 ../qt/src/Ui_MainWindow.hh:216 msgid "Clear list" msgstr "清除清單" #: ../gtk/data/MainWindow.ui.h:25 ../qt/data/MainWindow.ui.h:5 msgid "Files" msgstr "檔案" #: ../gtk/data/MainWindow.ui.h:26 ../qt/data/MainWindow.ui.h:8 msgid "Device:" msgstr "è£ç½®ï¼š" #: ../gtk/data/MainWindow.ui.h:27 ../gtk/data/TessdataManager.ui.h:4 #: ../qt/data/MainWindow.ui.h:7 ../qt/src/TessdataManager.cc:59 msgid "Refresh" msgstr "æ›´æ–°" #: ../gtk/data/MainWindow.ui.h:28 ../qt/data/MainWindow.ui.h:9 msgid "Output:" msgstr "輸出:" #: ../gtk/data/MainWindow.ui.h:29 ../qt/data/MainWindow.ui.h:13 msgid "Mode:" msgstr "模å¼ï¼š" #: ../gtk/data/MainWindow.ui.h:30 ../gtk/src/hocr/HOCRPdfExporter.cc:313 #: ../qt/data/MainWindow.ui.h:15 ../qt/src/hocr/HOCRPdfExporter.cc:347 msgid "Color" msgstr "彩色" #: ../gtk/data/MainWindow.ui.h:31 ../gtk/src/hocr/HOCRPdfExporter.cc:316 #: ../qt/data/MainWindow.ui.h:14 ../qt/src/hocr/HOCRPdfExporter.cc:349 #: ../qt/src/hocr/HOCRPdfExporter.cc:351 msgid "Grayscale" msgstr "ç°éšŽ" #: ../gtk/data/MainWindow.ui.h:32 ../qt/data/MainWindow.ui.h:10 msgid "Resolution:" msgstr "è§£åƒåº¦ï¼š" #: ../gtk/data/MainWindow.ui.h:33 ../qt/data/MainWindow.ui.h:11 msgid "Scan" msgstr "掃æ" #: ../gtk/data/MainWindow.ui.h:34 ../qt/data/MainWindow.ui.h:16 msgid "Source:" msgstr "來æºï¼š" #: ../gtk/data/MainWindow.ui.h:35 ../qt/data/MainWindow.ui.h:6 msgid "Acquire" msgstr "æ“·å–" #: ../gtk/data/MainWindow.ui.h:36 ../qt/data/MainWindow.ui.h:1 msgid "Brightness" msgstr "亮度" #: ../gtk/data/MainWindow.ui.h:37 ../qt/data/MainWindow.ui.h:2 msgid "Contrast" msgstr "å°æ¯”" #: ../gtk/data/MainWindow.ui.h:38 ../qt/data/MainWindow.ui.h:3 msgid "Resolution" msgstr "è§£åƒåº¦" #: ../gtk/data/MainWindow.ui.h:39 ../qt/data/MainWindow.ui.h:4 msgid "Invert colors" msgstr "å轉色版" #: ../gtk/data/MainWindow.ui.h:40 msgid "A graphical frontend to tesseract-ocr" msgstr "tesseract-ocr 的圖åƒä»‹é¢" #: ../gtk/data/MainWindow.ui.h:41 ../qt/data/CharacterListDialog.ui.h:1 msgid "Character whitelist / blacklist" msgstr "" #: ../gtk/data/MainWindow.ui.h:42 ../qt/data/CharacterListDialog.ui.h:2 msgid "Exclude these characters from being recognized (blacklist):" msgstr "" #: ../gtk/data/MainWindow.ui.h:43 ../qt/data/CharacterListDialog.ui.h:3 #, fuzzy msgid "Enter a string of characters..." msgstr "ç²å–åƒæ•¸â€¦â€¦" #: ../gtk/data/MainWindow.ui.h:44 ../qt/data/CharacterListDialog.ui.h:4 msgid "Only allow the following characters to be recognized (whitelist):" msgstr "" #: ../gtk/data/MainWindow.ui.h:45 ../qt/data/PageRangeDialog.ui.h:1 msgid "Page Range" msgstr "é é¢ç¯„åœ" #: ../gtk/data/MainWindow.ui.h:48 ../qt/data/PageRangeDialog.ui.h:2 msgid "Page range:" msgstr "é é¢ç¯„åœï¼š" #: ../gtk/data/MainWindow.ui.h:49 ../qt/data/PageRangeDialog.ui.h:3 msgid "Example: 1-10, 13, 14-18" msgstr "例如: 1-10, 13, 14-18" #: ../gtk/data/MainWindow.ui.h:50 ../qt/data/PageRangeDialog.ui.h:4 msgid "Recognition area:" msgstr "辨èªå€åŸŸï¼š" #: ../gtk/data/MainWindow.ui.h:51 ../gtk/src/Recognizer.cc:375 #: ../qt/data/PageRangeDialog.ui.h:5 ../qt/src/Recognizer.cc:369 msgid "Entire page" msgstr "æ•´é " #: ../gtk/data/MainWindow.ui.h:52 ../qt/data/PageRangeDialog.ui.h:6 msgid "Autodetect" msgstr "è‡ªå‹•åµæ¸¬" #: ../gtk/data/MainWindow.ui.h:53 ../qt/data/PageRangeDialog.ui.h:7 msgid "Prepend to output text:" msgstr "é å…ˆè¼¸å‡ºæ–‡å­—:" #: ../gtk/data/MainWindow.ui.h:54 ../qt/data/PageRangeDialog.ui.h:8 msgid "Source filename" msgstr "ä¾†æºæª”å" #: ../gtk/data/MainWindow.ui.h:55 ../qt/data/PageRangeDialog.ui.h:9 msgid "Source page" msgstr "來æºé " #: ../gtk/data/MainWindow.ui.h:56 ../qt/src/SourceManager.cc:146 msgid "Protected PDF" msgstr "å—ä¿è­· PDF" #: ../gtk/data/MainWindow.ui.h:57 ../qt/src/Recognizer.cc:76 msgid "Current Page" msgstr "ç¾æ™‚é é¢" #: ../gtk/data/MainWindow.ui.h:58 ../qt/src/Recognizer.cc:79 msgid "Multiple Pages..." msgstr "多é â€¦â€¦" #: ../gtk/data/OutputEditorHOCR.ui.h:1 ../qt/src/hocr/OutputEditorHOCR.cc:580 msgid "Add Word" msgstr "新增字詞" #: ../gtk/data/OutputEditorHOCR.ui.h:4 ../qt/src/hocr/OutputEditorHOCR.cc:580 msgid "Enter word:" msgstr "輸入字詞" #: ../gtk/data/OutputEditorHOCR.ui.h:5 ../qt/src/hocr/Ui_OutputEditorHOCR.hh:61 #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:62 msgid "Export to plain text" msgstr "匯出為純文字" #: ../gtk/data/OutputEditorHOCR.ui.h:6 ../qt/src/hocr/Ui_OutputEditorHOCR.hh:64 #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:65 msgid "Export to PDF" msgstr "匯出至 PDF" #: ../gtk/data/OutputEditorHOCR.ui.h:7 ../qt/src/hocr/Ui_OutputEditorHOCR.hh:67 #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:68 msgid "Export to ODT" msgstr "匯出至 ODT" #: ../gtk/data/OutputEditorHOCR.ui.h:8 ../gtk/data/OutputEditorText.ui.h:18 #: ../qt/src/Ui_OutputEditorText.hh:116 msgid "Save output" msgstr "儲存輸出" #: ../gtk/data/OutputEditorHOCR.ui.h:9 ../qt/src/hocr/Ui_OutputEditorHOCR.hh:72 #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:73 msgid "Export" msgstr "匯出" #: ../gtk/data/OutputEditorHOCR.ui.h:10 ../gtk/data/OutputEditorText.ui.h:19 #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:77 #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:78 #: ../qt/src/Ui_OutputEditorText.hh:118 msgid "Clear output" msgstr "清除輸出" #: ../gtk/data/OutputEditorHOCR.ui.h:11 ../gtk/data/OutputEditorText.ui.h:15 #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:80 #: ../qt/src/Ui_OutputEditorText.hh:107 msgid "Find and replace" msgstr "æœå°‹åŠå–代" #: ../gtk/data/OutputEditorHOCR.ui.h:12 #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:82 #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:83 msgid "Show confidence values" msgstr "顯示å¯ä¿¡åº¦" #: ../gtk/data/OutputEditorHOCR.ui.h:13 ../gtk/data/PdfExportDialog.ui.h:41 #: ../qt/data/PdfExportDialog.ui.h:2 ../qt/src/hocr/Ui_OutputEditorHOCR.hh:85 #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:86 msgid "Show preview" msgstr "顯示é è¦½" #: ../gtk/data/OutputEditorHOCR.ui.h:14 #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:121 msgid "Next (F3)" msgstr "下一個(F3)" #: ../gtk/data/OutputEditorHOCR.ui.h:15 #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:122 msgid "Previous (Shift+F3)" msgstr "上一個(Shift+F3)" #: ../gtk/data/OutputEditorHOCR.ui.h:16 ../gtk/src/hocr/OutputEditorHOCR.cc:890 #: ../qt/src/hocr/OutputEditorHOCR.cc:730 #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:126 msgid "Expand all" msgstr "展開" #: ../gtk/data/OutputEditorHOCR.ui.h:17 ../gtk/src/hocr/OutputEditorHOCR.cc:893 #: ../qt/src/hocr/OutputEditorHOCR.cc:731 #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:127 msgid "Collapse all" msgstr "æ”¶èµ·" #: ../gtk/data/OutputEditorHOCR.ui.h:18 #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:148 msgid "Properties" msgstr "屬性" #: ../gtk/data/OutputEditorHOCR.ui.h:19 #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:152 msgid "Source" msgstr "來æº" #. Output insert mode #: ../gtk/data/OutputEditorText.ui.h:1 ../qt/src/Ui_OutputEditorText.hh:52 msgid "Append to current text" msgstr "é™„åŠ åˆ°ç¾æœ‰æ–‡å­—" #: ../gtk/data/OutputEditorText.ui.h:2 ../qt/src/Ui_OutputEditorText.hh:53 msgid "Insert at cursor" msgstr "於游標ä½ç½®æ’å…¥" #: ../gtk/data/OutputEditorText.ui.h:3 ../qt/src/Ui_OutputEditorText.hh:54 msgid "Replace current text" msgstr "å–ä»£ç¾æœ‰æ–‡å­—" #. Output postprocessing #: ../gtk/data/OutputEditorText.ui.h:4 ../qt/src/Ui_OutputEditorText.hh:62 msgid "Keep line break if..." msgstr "ä¿ç•™æ›è¡Œç¬¦è™Ÿï¼Œå¦‚果……" #: ../gtk/data/OutputEditorText.ui.h:5 ../qt/src/Ui_OutputEditorText.hh:64 msgid "Preceded by end mark (.?!)" msgstr "以終çµè™Ÿèµ·é¦–(.?!)" #: ../gtk/data/OutputEditorText.ui.h:6 ../qt/src/Ui_OutputEditorText.hh:66 msgid "Preceded or succeeded by quote" msgstr "以引號起首或çµå°¾" #: ../gtk/data/OutputEditorText.ui.h:7 ../qt/src/Ui_OutputEditorText.hh:68 msgid "Other options" msgstr "å…¶ä»–é¸é …" #: ../gtk/data/OutputEditorText.ui.h:8 ../qt/src/Ui_OutputEditorText.hh:70 msgid "Join hyphenated words" msgstr "連接斷字符號å‰å¾Œçš„å­—" #: ../gtk/data/OutputEditorText.ui.h:9 ../qt/src/Ui_OutputEditorText.hh:72 msgid "Collapse whitespace" msgstr "åˆä½µç©ºæ ¼" #: ../gtk/data/OutputEditorText.ui.h:10 ../qt/src/Ui_OutputEditorText.hh:74 msgid "Preserve paragraphs" msgstr "ä¿ç•™æ®µè½" #: ../gtk/data/OutputEditorText.ui.h:11 ../qt/src/Ui_OutputEditorText.hh:76 msgid "Visual aids" msgstr "視覺輔助" #: ../gtk/data/OutputEditorText.ui.h:12 ../qt/src/Ui_OutputEditorText.hh:78 msgid "Draw whitespace" msgstr "繪畫空格" #: ../gtk/data/OutputEditorText.ui.h:14 ../qt/src/Ui_OutputEditorText.hh:102 msgid "Strip line breaks on selected text" msgstr "去除é¸å–文字的æ›è¡Œç¬¦è™Ÿ" #: ../gtk/data/OutputEditorText.ui.h:16 ../qt/src/Ui_OutputEditorText.hh:109 #: ../qt/src/Ui_OutputEditorText.hh:110 msgid "Undo" msgstr "復原" #: ../gtk/data/OutputEditorText.ui.h:17 ../qt/src/Ui_OutputEditorText.hh:112 #: ../qt/src/Ui_OutputEditorText.hh:113 msgid "Redo" msgstr "é‡åš" #: ../gtk/data/PdfExportDialog.ui.h:1 ../qt/data/PdfExportDialog.ui.h:1 msgid "PDF Export" msgstr "匯出 PDF" #: ../gtk/data/PdfExportDialog.ui.h:4 ../qt/data/PdfExportDialog.ui.h:4 msgid "Output mode:" msgstr "輸出模å¼ï¼š" #: ../gtk/data/PdfExportDialog.ui.h:5 ../qt/data/PdfExportDialog.ui.h:6 msgid "PDF" msgstr "PDF" #: ../gtk/data/PdfExportDialog.ui.h:6 ../qt/data/PdfExportDialog.ui.h:7 msgid "PDF with invisible text overlay" msgstr "包å«éš±å½¢æ–‡å­—層的 PDF" #: ../gtk/data/PdfExportDialog.ui.h:7 ../qt/data/PdfExportDialog.ui.h:16 msgid "Format:" msgstr "æ ¼å¼ï¼š" #: ../gtk/data/PdfExportDialog.ui.h:8 ../qt/data/PdfExportDialog.ui.h:17 msgid "Compression:" msgstr "壓縮:" #: ../gtk/data/PdfExportDialog.ui.h:9 ../qt/data/PdfExportDialog.ui.h:14 msgid "Compression quality:" msgstr "壓縮å“質:" #: ../gtk/data/PdfExportDialog.ui.h:10 ../qt/data/PdfExportDialog.ui.h:15 msgid "DPI:" msgstr "DPI:" #: ../gtk/data/PdfExportDialog.ui.h:11 ../qt/data/PdfExportDialog.ui.h:18 msgid "Dithering algorithm:" msgstr "éžè‰²æ¼”算法:" #: ../gtk/data/PdfExportDialog.ui.h:12 ../qt/data/PdfExportDialog.ui.h:13 msgid "Image settings:" msgstr "圖åƒè¨­å®šï¼š" #: ../gtk/data/PdfExportDialog.ui.h:13 ../qt/data/PdfExportDialog.ui.h:25 msgid "Uniformize line and word spacing" msgstr "統一行è·åŠå­—è·" #: ../gtk/data/PdfExportDialog.ui.h:14 ../qt/data/PdfExportDialog.ui.h:21 msgid "Override font family:" msgstr "改寫字型:" #: ../gtk/data/PdfExportDialog.ui.h:15 ../qt/data/PdfExportDialog.ui.h:27 msgid "Fallback font family:" msgstr "後備字型:" #: ../gtk/data/PdfExportDialog.ui.h:16 ../qt/data/PdfExportDialog.ui.h:20 msgid "Override font size:" msgstr "改寫字型大å°ï¼š" #: ../gtk/data/PdfExportDialog.ui.h:17 ../qt/data/PdfExportDialog.ui.h:23 msgid "Font scaling:" msgstr "字型縮放:" #: ../gtk/data/PdfExportDialog.ui.h:18 ../qt/data/PdfExportDialog.ui.h:26 msgid "pt" msgstr "" #: ../gtk/data/PdfExportDialog.ui.h:19 ../qt/data/PdfExportDialog.ui.h:22 msgid "Preserve spaces wider than:" msgstr "ä¿ç•™ç©ºæ ¼å¤§æ–¼ï¼š" #: ../gtk/data/PdfExportDialog.ui.h:20 ../qt/data/PdfExportDialog.ui.h:24 msgid "characters" msgstr "å­—å…ƒ" #: ../gtk/data/PdfExportDialog.ui.h:21 ../qt/data/PdfExportDialog.ui.h:28 msgid "Sanitize hyphens before line breaks" msgstr "" #: ../gtk/data/PdfExportDialog.ui.h:22 ../qt/data/PdfExportDialog.ui.h:19 msgid "Text settings:" msgstr "文字檔設定:" #: ../gtk/data/PdfExportDialog.ui.h:23 ../qt/data/PdfExportDialog.ui.h:10 msgid "Paper size:" msgstr "紙張尺寸:" #: ../gtk/data/PdfExportDialog.ui.h:24 ../qt/data/PdfExportDialog.ui.h:11 msgid "Width" msgstr "闊度" #: ../gtk/data/PdfExportDialog.ui.h:25 ../qt/data/PdfExportDialog.ui.h:12 msgid "Height" msgstr "高度" #: ../gtk/data/PdfExportDialog.ui.h:26 ../qt/data/PdfExportDialog.ui.h:29 msgid "Treat image sources as having true DPI:" msgstr "" #: ../gtk/data/PdfExportDialog.ui.h:27 ../qt/data/PdfExportDialog.ui.h:3 msgid "Basic" msgstr "基本" #: ../gtk/data/PdfExportDialog.ui.h:28 ../qt/data/PdfExportDialog.ui.h:31 msgid "PDF version:" msgstr "PDF 版本:" #: ../gtk/data/PdfExportDialog.ui.h:29 ../qt/data/PdfExportDialog.ui.h:33 msgid "Password:" msgstr "密碼:" #: ../gtk/data/PdfExportDialog.ui.h:30 ../qt/data/PdfExportDialog.ui.h:34 msgid "Confirm password:" msgstr "確èªå¯†ç¢¼ï¼š" #: ../gtk/data/PdfExportDialog.ui.h:31 ../qt/data/PdfExportDialog.ui.h:32 msgid "Encryption (optional):" msgstr "åŠ å¯†ï¼ˆé¸æ“‡æ€§ï¼‰ï¼š" #: ../gtk/data/PdfExportDialog.ui.h:32 ../qt/data/PdfExportDialog.ui.h:36 msgid "Author:" msgstr "作者:" #: ../gtk/data/PdfExportDialog.ui.h:33 ../qt/data/PdfExportDialog.ui.h:38 msgid "Title:" msgstr "å稱:" #: ../gtk/data/PdfExportDialog.ui.h:34 ../qt/data/PdfExportDialog.ui.h:40 msgid "Subject:" msgstr "主題:" #: ../gtk/data/PdfExportDialog.ui.h:35 ../qt/data/PdfExportDialog.ui.h:37 msgid "Creator:" msgstr "創建者:" #: ../gtk/data/PdfExportDialog.ui.h:36 ../qt/data/PdfExportDialog.ui.h:39 msgid "Producer:" msgstr "發行者:" #: ../gtk/data/PdfExportDialog.ui.h:37 ../qt/data/PdfExportDialog.ui.h:41 msgid "Keywords:" msgstr "é—œéµå­—:" #: ../gtk/data/PdfExportDialog.ui.h:38 ../qt/data/PdfExportDialog.ui.h:35 msgid "Additional information (optional):" msgstr "附加的資訊(å¯é¸):" #: ../gtk/data/PdfExportDialog.ui.h:39 ../qt/data/PdfExportDialog.ui.h:42 msgid "Import from current source" msgstr "åŒ¯å…¥ç¾æœ‰ä¾†æº" #: ../gtk/data/PdfExportDialog.ui.h:40 ../qt/data/PdfExportDialog.ui.h:30 msgid "Advanced" msgstr "進階" #: ../gtk/data/SearchReplaceFrame.ui.h:1 ../qt/data/SearchReplaceFrame.ui.h:4 msgid "Find" msgstr "尋找" #: ../gtk/data/SearchReplaceFrame.ui.h:2 ../qt/data/SearchReplaceFrame.ui.h:2 msgid "Replace" msgstr "å–代" #: ../gtk/data/SearchReplaceFrame.ui.h:3 ../qt/data/SearchReplaceFrame.ui.h:3 msgid "Replace all" msgstr "全部å–代" #: ../gtk/data/SearchReplaceFrame.ui.h:4 ../qt/data/SearchReplaceFrame.ui.h:5 msgid "Find previous" msgstr "尋找å‰ä¸€å€‹" #: ../gtk/data/SearchReplaceFrame.ui.h:5 ../qt/data/SearchReplaceFrame.ui.h:6 msgid "Find next" msgstr "尋找下一個" #: ../gtk/data/SearchReplaceFrame.ui.h:6 ../qt/data/SearchReplaceFrame.ui.h:7 msgid "Match case" msgstr "大å°å¯«å»åˆ" #: ../gtk/data/SearchReplaceFrame.ui.h:7 #: ../gtk/data/SubstitutionsManager.ui.h:1 ../qt/data/SearchReplaceFrame.ui.h:1 #: ../qt/src/SubstitutionsManager.cc:36 msgid "Substitutions" msgstr "替æ›å€¼" #: ../gtk/data/SelectionMenu.ui.h:1 ../qt/src/DisplayerToolSelect.cc:239 msgid "Delete" msgstr "刪除" #: ../gtk/data/SelectionMenu.ui.h:2 ../qt/src/DisplayerToolSelect.cc:225 msgid "Order:" msgstr "排åºï¼š" #: ../gtk/data/SelectionMenu.ui.h:3 ../gtk/src/hocr/DisplayerToolHOCR.cc:29 #: ../qt/src/DisplayerToolSelect.cc:240 ../qt/src/hocr/DisplayerToolHOCR.cc:31 msgid "Recognize" msgstr "辨èª" #: ../gtk/data/SelectionMenu.ui.h:4 ../qt/src/DisplayerToolSelect.cc:241 msgid "Recognize to clipboard" msgstr "辨èªè‡³å‰ªè²¼ç°¿" #: ../gtk/data/SelectionMenu.ui.h:5 ../qt/src/DisplayerToolSelect.cc:242 msgid "Save as image" msgstr "儲存為圖åƒ" #: ../gtk/data/SubstitutionsManager.ui.h:2 ../qt/src/SubstitutionsManager.cc:38 #: ../qt/src/SubstitutionsManager.cc:39 msgid "Open" msgstr "開啟" #: ../gtk/data/SubstitutionsManager.ui.h:3 ../gtk/src/Utils.cc:73 #: ../qt/src/SubstitutionsManager.cc:41 ../qt/src/SubstitutionsManager.cc:42 msgid "Save" msgstr "儲存" #: ../gtk/data/SubstitutionsManager.ui.h:4 ../qt/src/SubstitutionsManager.cc:44 #: ../qt/src/SubstitutionsManager.cc:45 msgid "Clear" msgstr "清除" #: ../gtk/data/SubstitutionsManager.ui.h:5 ../qt/data/ConfigDialog.ui.h:16 #: ../qt/src/SubstitutionsManager.cc:47 ../qt/src/SubstitutionsManager.cc:48 msgid "Add" msgstr "新增" #: ../gtk/data/SubstitutionsManager.ui.h:6 #: ../gtk/src/hocr/OutputEditorHOCR.cc:886 ../qt/data/ConfigDialog.ui.h:17 #: ../qt/src/hocr/OutputEditorHOCR.cc:727 ../qt/src/SubstitutionsManager.cc:50 #: ../qt/src/SubstitutionsManager.cc:51 msgid "Remove" msgstr "刪除" #: ../gtk/data/SubstitutionsManager.ui.h:7 ../gtk/data/TessdataManager.ui.h:2 msgid "Apply" msgstr "應用" #: ../gtk/data/SubstitutionsManager.ui.h:8 ../gtk/data/TessdataManager.ui.h:3 msgid "Close" msgstr "關閉" #: ../gtk/data/TessdataManager.ui.h:1 ../qt/src/TessdataManager.cc:49 msgid "Tessdata Manager" msgstr "Tessdata 管ç†å“¡" #: ../gtk/data/TessdataManager.ui.h:5 ../qt/src/TessdataManager.cc:51 msgid "Manage installed languages:" msgstr "管ç†å·²å®‰è£çš„語言:" #: ../gtk/src/Acquirer.cc:79 ../qt/src/Acquirer.cc:70 msgid "scan.png" msgstr "" #: ../gtk/src/Acquirer.cc:91 ../qt/src/Acquirer.cc:85 msgid "Images" msgstr "圖åƒ" #: ../gtk/src/Acquirer.cc:92 ../qt/src/Acquirer.cc:86 msgid "Choose Output Filename..." msgstr "é¸å–輸出檔å……" #: ../gtk/src/Acquirer.cc:106 ../qt/src/Acquirer.cc:100 msgid "Failed to initialize the scanning backend." msgstr "無法åˆå§‹åŒ–æŽƒææœå‹™ã€‚" #: ../gtk/src/Acquirer.cc:115 ../qt/src/Acquirer.cc:106 msgid "Scan failed" msgstr "無法摺掃æ" #: ../gtk/src/Acquirer.cc:133 ../qt/src/Acquirer.cc:122 msgid "No scanners were detected." msgstr "嵿¸¬ä¸åˆ°æŽƒæå™¨ã€‚" #: ../gtk/src/Acquirer.cc:150 ../gtk/src/Acquirer.cc:168 #: ../qt/src/Acquirer.cc:136 ../qt/src/Acquirer.cc:154 msgid "Starting scan..." msgstr "開始掃æâ€¦â€¦" #: ../gtk/src/Acquirer.cc:164 ../qt/src/Acquirer.cc:150 msgid "Opening device..." msgstr "開啟è£ç½®â€¦â€¦" #: ../gtk/src/Acquirer.cc:166 ../qt/src/Acquirer.cc:152 msgid "Setting options..." msgstr "設定é¸é ………" #: ../gtk/src/Acquirer.cc:170 ../qt/src/Acquirer.cc:156 msgid "Getting parameters..." msgstr "ç²å–åƒæ•¸â€¦â€¦" #: ../gtk/src/Acquirer.cc:172 ../qt/src/Acquirer.cc:158 msgid "Transferring data..." msgstr "轉輸數據……" #: ../gtk/src/Acquirer.cc:179 ../qt/src/Acquirer.cc:165 msgid "Canceling scan..." msgstr "å–æ¶ˆæŽƒæâ€¦â€¦" #: ../gtk/src/Config.cc:49 ../qt/data/ConfigDialog.ui.h:7 msgid "Filename prefix" msgstr "檔åå‰ç½®" #: ../gtk/src/Config.cc:50 ../qt/data/ConfigDialog.ui.h:8 msgid "Code" msgstr "代碼" #: ../gtk/src/Config.cc:51 ../qt/data/ConfigDialog.ui.h:9 msgid "Native name" msgstr "原生å稱" #: ../gtk/src/Config.cc:109 ../qt/src/Config.cc:108 msgid "Script" msgstr "腳本" #: ../gtk/src/CrashHandler.cc:25 ../gtk/src/CrashHandler.cc:41 #: ../qt/src/CrashHandler.cc:36 msgid "Crash Handler" msgstr "異常終止處ç†å™¨" #: ../gtk/src/CrashHandler.cc:43 ../qt/src/CrashHandler.cc:31 msgid "Your work has been saved under %1." msgstr "你的工作已儲存於 %1。" #: ../gtk/src/CrashHandler.cc:45 ../qt/src/CrashHandler.cc:33 msgid "There was no unsaved work." msgstr "沒有未儲存的工作。" #: ../gtk/src/CrashHandler.cc:106 ../qt/src/CrashHandler.cc:62 msgid "Failed to obtain backtrace. Is gdb installed?" msgstr "無法å–å¾— backtraceã€‚å·²å®‰è£ gdb 嗎?" #: ../gtk/src/Displayer.cc:232 ../qt/src/Displayer.cc:174 msgid "Failed to load image" msgstr "無法載入圖åƒ" #: ../gtk/src/Displayer.cc:232 ../qt/src/Displayer.cc:174 msgid "" "The file might not be an image or be corrupt:\n" "%1" msgstr "" "該檔案å¯èƒ½ä¸æ˜¯åœ–åƒæˆ–已被æå£žï¼š\n" "%1" #: ../gtk/src/DisplayerToolSelect.cc:138 ../qt/src/DisplayerToolSelect.cc:135 msgid "PNG Images" msgstr "PNG 圖åƒ" #: ../gtk/src/DisplayerToolSelect.cc:139 ../qt/src/DisplayerToolSelect.cc:135 msgid "Save Selection Image" msgstr "儲存é¸å–圖åƒ" #: ../gtk/src/DisplayerToolSelect.cc:139 ../qt/src/DisplayerToolSelect.cc:135 msgid "selection.png" msgstr "" #: ../gtk/src/DisplayerToolSelect.cc:146 ../qt/src/DisplayerToolSelect.cc:142 msgid "Recognize all" msgstr "辨èªå…¨éƒ¨" #: ../gtk/src/DisplayerToolSelect.cc:146 ../qt/src/DisplayerToolSelect.cc:142 msgid "Recognize selection" msgstr "辨èªé¸å–å€" #: ../gtk/src/DisplayerToolSelect.cc:186 ../qt/src/DisplayerToolSelect.cc:182 msgid "Performing layout analysis" msgstr "進行佈局分æž" #: ../gtk/src/FileDialogs.cc:235 msgid "" "A file named \"%1\" already exists. Are you sure you want to overwrite it?" msgstr "å為 \"%1\" çš„æª”æ¡ˆå·²å­˜åœ¨ã€‚ä½ ç¢ºå®šè¦æ”¹å¯«å®ƒï¼Ÿ" #: ../gtk/src/FileDialogs.cc:237 msgid "Overwrite File?" msgstr "改寫檔案?" #: ../gtk/src/hocr/HOCRDocument.cc:611 ../gtk/src/hocr/OutputEditorHOCR.cc:266 #: ../qt/src/hocr/OutputEditorHOCR.cc:229 msgid "Page" msgstr "é é¢" #: ../gtk/src/hocr/HOCRDocument.cc:613 ../qt/src/hocr/HOCRDocument.cc:530 msgid "Text block" msgstr "文字å€å¡Š" #: ../gtk/src/hocr/HOCRDocument.cc:615 ../gtk/src/hocr/OutputEditorHOCR.cc:272 #: ../qt/src/hocr/HOCRDocument.cc:532 ../qt/src/hocr/OutputEditorHOCR.cc:231 msgid "Paragraph" msgstr "段è½" #: ../gtk/src/hocr/HOCRDocument.cc:617 ../qt/src/hocr/HOCRDocument.cc:534 msgid "Textline" msgstr "文字" #: ../gtk/src/hocr/HOCRDocument.cc:621 ../qt/src/hocr/HOCRDocument.cc:538 msgid "Graphic" msgstr "圖åƒ" #: ../gtk/src/hocr/HOCROdtExporter.cc:65 ../gtk/src/hocr/HOCRPdfExporter.cc:489 #: ../gtk/src/hocr/HOCRTextExporter.cc:34 #: ../gtk/src/hocr/OutputEditorHOCR.cc:963 ../gtk/src/OutputEditorText.cc:272 #: ../qt/src/hocr/HOCROdtExporter.cc:50 ../qt/src/hocr/HOCRPdfExporter.cc:478 #: ../qt/src/hocr/HOCRTextExporter.cc:36 ../qt/src/hocr/OutputEditorHOCR.cc:830 #: ../qt/src/OutputEditorText.cc:238 msgid "output" msgstr "輸出" #: ../gtk/src/hocr/HOCROdtExporter.cc:68 ../qt/src/hocr/HOCROdtExporter.cc:53 msgid "OpenDocument Text Documents" msgstr "OpenDocument 文件檔" #: ../gtk/src/hocr/HOCROdtExporter.cc:69 ../qt/src/hocr/HOCROdtExporter.cc:53 msgid "Save ODT Output..." msgstr "儲存 ODT 輸出……" #: ../gtk/src/hocr/HOCROdtExporter.cc:77 ../gtk/src/hocr/HOCROdtExporter.cc:342 #: ../gtk/src/hocr/HOCRPdfExporter.cc:619 #: ../gtk/src/hocr/HOCRTextExporter.cc:46 ../qt/src/hocr/HOCROdtExporter.cc:61 #: ../qt/src/hocr/HOCRPdfExporter.cc:609 ../qt/src/hocr/HOCRTextExporter.cc:47 msgid "Export failed" msgstr "無法匯出" #: ../gtk/src/hocr/HOCROdtExporter.cc:77 ../gtk/src/hocr/HOCROdtExporter.cc:342 #: ../qt/src/hocr/HOCROdtExporter.cc:61 msgid "The ODT export failed: unable to write output file." msgstr "無法匯出 ODT:無法建立輸出檔。" #: ../gtk/src/hocr/HOCROdtExporter.cc:336 ../qt/src/hocr/HOCROdtExporter.cc:254 msgid "Exporting to ODT..." msgstr "匯出至 ODT..." #: ../gtk/src/hocr/HOCRPdfExporter.cc:283 ../qt/src/hocr/HOCRPdfExporter.cc:365 msgid "Same as source" msgstr "與來æºç›¸åŒ" #: ../gtk/src/hocr/HOCRPdfExporter.cc:286 ../qt/src/hocr/HOCRPdfExporter.cc:366 msgid "Custom" msgstr "自訂" #: ../gtk/src/hocr/HOCRPdfExporter.cc:300 ../qt/src/hocr/HOCRPdfExporter.cc:362 msgid "cm" msgstr "" #: ../gtk/src/hocr/HOCRPdfExporter.cc:303 ../qt/src/hocr/HOCRPdfExporter.cc:363 msgid "in" msgstr "在" #: ../gtk/src/hocr/HOCRPdfExporter.cc:319 ../qt/src/hocr/HOCRPdfExporter.cc:353 msgid "Monochrome" msgstr "黑白" #: ../gtk/src/hocr/HOCRPdfExporter.cc:328 ../qt/src/hocr/HOCRPdfExporter.cc:355 msgid "Threshold (closest color)" msgstr "定é™ï¼ˆæœ€æŽ¥è¿‘é¡è‰²ï¼‰" #: ../gtk/src/hocr/HOCRPdfExporter.cc:331 ../qt/src/hocr/HOCRPdfExporter.cc:356 msgid "Diffuse" msgstr "æ“´æ•£" #: ../gtk/src/hocr/HOCRPdfExporter.cc:340 ../qt/src/hocr/HOCRPdfExporter.cc:357 msgid "Zip (lossless)" msgstr "Zip(無æï¼‰" #: ../gtk/src/hocr/HOCRPdfExporter.cc:344 ../qt/src/hocr/HOCRPdfExporter.cc:358 msgid "CCITT Group 4 (lossless)" msgstr "CCITT 第 4 組(無æï¼‰" #: ../gtk/src/hocr/HOCRPdfExporter.cc:348 ../qt/src/hocr/HOCRPdfExporter.cc:359 msgid "Jpeg (lossy)" msgstr "Jpeg(失真)" #: ../gtk/src/hocr/HOCRPdfExporter.cc:493 ../qt/src/hocr/HOCRPdfExporter.cc:482 msgid "PDF Files" msgstr "PDF 檔" #: ../gtk/src/hocr/HOCRPdfExporter.cc:494 ../qt/src/hocr/HOCRPdfExporter.cc:482 msgid "Save PDF Output..." msgstr "儲存 PDF 輸出……" #: ../gtk/src/hocr/HOCRPdfExporter.cc:500 ../qt/src/hocr/HOCRPdfExporter.cc:488 msgid "Invalid Output" msgstr "無效輸出" #: ../gtk/src/hocr/HOCRPdfExporter.cc:500 ../qt/src/hocr/HOCRPdfExporter.cc:488 msgid "Cannot overwrite a file which is a source image of this document." msgstr "無法改寫此文件的來æºåœ–åƒæª”。" #: ../gtk/src/hocr/HOCRPdfExporter.cc:516 ../qt/src/hocr/HOCRPdfExporter.cc:511 msgid "Failed to create output" msgstr "無法建立輸出" #: ../gtk/src/hocr/HOCRPdfExporter.cc:516 ../qt/src/hocr/HOCRPdfExporter.cc:511 msgid "Failed to create output. The returned error was: %1" msgstr "無法建立輸出。傳回錯誤:%1" #: ../gtk/src/hocr/HOCRPdfExporter.cc:558 ../qt/src/hocr/HOCRPdfExporter.cc:551 msgid "The operation was cancelled" msgstr "已喿¶ˆæ“作" #: ../gtk/src/hocr/HOCRPdfExporter.cc:607 ../qt/src/hocr/HOCRPdfExporter.cc:597 msgid "Failed to render page %1" msgstr "無法繪畫第 %1 é " #: ../gtk/src/hocr/HOCRPdfExporter.cc:614 ../qt/src/hocr/HOCRPdfExporter.cc:604 msgid "Exporting to PDF..." msgstr "匯出至 PDF..." #: ../gtk/src/hocr/HOCRPdfExporter.cc:619 ../qt/src/hocr/HOCRPdfExporter.cc:609 msgid "The PDF export failed: %1." msgstr "無法匯出 PDF:%1。" #: ../gtk/src/hocr/HOCRPdfExporter.cc:673 ../qt/src/hocr/HOCRPdfExporter.cc:662 msgid "The PDF library could not load the font '%1'." msgstr "PDF 程å¼åº«ä¸æ”¯æ´æ‰€é¸å–å­—åž‹ '%1'。" #: ../gtk/src/hocr/HOCRTextExporter.cc:37 ../gtk/src/OutputEditorText.cc:274 #: ../qt/src/hocr/HOCRTextExporter.cc:39 ../qt/src/OutputEditorText.cc:239 msgid "Text Files" msgstr "文字檔" #: ../gtk/src/hocr/HOCRTextExporter.cc:38 ../qt/src/hocr/HOCRTextExporter.cc:39 msgid "Save Text Output..." msgstr "儲存文字輸出……" #: ../gtk/src/hocr/HOCRTextExporter.cc:46 ../qt/src/hocr/HOCRTextExporter.cc:47 msgid "The text export failed: unable to write output file." msgstr "無法匯出文字檔:無法建立輸出檔。" #: ../gtk/src/hocr/OutputEditorHOCR.cc:269 #: ../qt/src/hocr/OutputEditorHOCR.cc:230 msgid "Block" msgstr "å€å¡Š" #: ../gtk/src/hocr/OutputEditorHOCR.cc:275 #: ../qt/src/hocr/OutputEditorHOCR.cc:232 msgid "Line" msgstr "ç·šæ¢" #: ../gtk/src/hocr/OutputEditorHOCR.cc:278 #: ../qt/src/hocr/OutputEditorHOCR.cc:233 msgid "Word" msgstr "字詞" #: ../gtk/src/hocr/OutputEditorHOCR.cc:281 #: ../qt/src/hocr/OutputEditorHOCR.cc:234 msgid "Misspelled word" msgstr "錯拼字詞" #: ../gtk/src/hocr/OutputEditorHOCR.cc:435 #: ../qt/src/hocr/OutputEditorHOCR.cc:317 msgid "" "The following pages could not be processed:\n" "%1" msgstr "" "無法處ç†ä¸‹åˆ—é é¢ï¼š\n" "%1" #: ../gtk/src/hocr/OutputEditorHOCR.cc:436 #: ../qt/src/hocr/OutputEditorHOCR.cc:318 msgid "Recognition errors" msgstr "è¾¨èªæ™‚出ç¾éŒ¯èª¤" #: ../gtk/src/hocr/OutputEditorHOCR.cc:594 #: ../qt/src/hocr/OutputEditorHOCR.cc:500 #: ../qt/src/hocr/OutputEditorHOCR.cc:512 msgid "Multiple values" msgstr "多個數值" #. Merging allowed #: ../gtk/src/hocr/OutputEditorHOCR.cc:778 #: ../qt/src/hocr/OutputEditorHOCR.cc:641 msgid "Merge" msgstr "åˆä½µ" #: ../gtk/src/hocr/OutputEditorHOCR.cc:786 #: ../gtk/src/hocr/OutputEditorHOCR.cc:877 #: ../qt/src/hocr/OutputEditorHOCR.cc:643 #: ../qt/src/hocr/OutputEditorHOCR.cc:725 msgid "Split from parent" msgstr "從上層分拆出來" #. Swapping allowed #: ../gtk/src/hocr/OutputEditorHOCR.cc:797 #: ../qt/src/hocr/OutputEditorHOCR.cc:647 msgid "Swap" msgstr "å°æ›" #: ../gtk/src/hocr/OutputEditorHOCR.cc:821 #: ../qt/src/hocr/OutputEditorHOCR.cc:693 msgid "Add graphic region" msgstr "新增圖åƒå€åŸŸ" #: ../gtk/src/hocr/OutputEditorHOCR.cc:824 #: ../qt/src/hocr/OutputEditorHOCR.cc:694 msgid "Add text block" msgstr "新增文字å€å¡Š" #: ../gtk/src/hocr/OutputEditorHOCR.cc:828 #: ../qt/src/hocr/OutputEditorHOCR.cc:696 msgid "Add paragraph" msgstr "新增段è½" #: ../gtk/src/hocr/OutputEditorHOCR.cc:832 #: ../qt/src/hocr/OutputEditorHOCR.cc:698 msgid "Add line" msgstr "新增線æ¢" #: ../gtk/src/hocr/OutputEditorHOCR.cc:836 #: ../qt/src/hocr/OutputEditorHOCR.cc:700 msgid "Add word" msgstr "新增字詞" #: ../gtk/src/hocr/OutputEditorHOCR.cc:852 #: ../qt/src/hocr/OutputEditorHOCR.cc:710 msgid "No suggestions" msgstr "沒有建議" #: ../gtk/src/hocr/OutputEditorHOCR.cc:858 #: ../qt/src/hocr/OutputEditorHOCR.cc:714 msgid "Add to dictionary" msgstr "新增至詞典" #: ../gtk/src/hocr/OutputEditorHOCR.cc:864 #: ../qt/src/hocr/OutputEditorHOCR.cc:716 msgid "Ignore word" msgstr "忽略字詞" #: ../gtk/src/hocr/OutputEditorHOCR.cc:926 #: ../gtk/src/hocr/OutputEditorHOCR.cc:965 #: ../qt/src/hocr/OutputEditorHOCR.cc:795 #: ../qt/src/hocr/OutputEditorHOCR.cc:832 msgid "hOCR HTML Files" msgstr "hOCR HTML 檔" #: ../gtk/src/hocr/OutputEditorHOCR.cc:927 #: ../qt/src/hocr/OutputEditorHOCR.cc:795 msgid "Open hOCR File" msgstr "開啟 hOCR 檔" #: ../gtk/src/hocr/OutputEditorHOCR.cc:936 #: ../qt/src/hocr/OutputEditorHOCR.cc:802 msgid "Failed to open file" msgstr "無法開啟檔案" #: ../gtk/src/hocr/OutputEditorHOCR.cc:936 #: ../qt/src/hocr/OutputEditorHOCR.cc:802 msgid "The file could not be opened: %1." msgstr "無法開啟檔案:%1。" #: ../gtk/src/hocr/OutputEditorHOCR.cc:945 #: ../qt/src/hocr/OutputEditorHOCR.cc:809 msgid "Invalid hOCR file" msgstr "無效的 hOCR 檔" #: ../gtk/src/hocr/OutputEditorHOCR.cc:945 #: ../qt/src/hocr/OutputEditorHOCR.cc:809 msgid "The file does not appear to contain valid hOCR HTML: %1" msgstr "此檔案似乎並ä¸åŒ…嫿œ‰æ•ˆçš„ hOCR HTML:%1" #: ../gtk/src/hocr/OutputEditorHOCR.cc:966 #: ../qt/src/hocr/OutputEditorHOCR.cc:832 msgid "Save hOCR Output..." msgstr "儲存 hOCR 輸出……" #: ../gtk/src/hocr/OutputEditorHOCR.cc:973 ../gtk/src/OutputEditorText.cc:282 #: ../qt/src/hocr/OutputEditorHOCR.cc:839 ../qt/src/OutputEditorText.cc:246 msgid "Failed to save output" msgstr "無法儲存輸出……" #: ../gtk/src/hocr/OutputEditorHOCR.cc:973 ../gtk/src/OutputEditorText.cc:282 #: ../qt/src/hocr/OutputEditorHOCR.cc:839 ../qt/src/OutputEditorText.cc:246 msgid "Check that you have writing permissions in the selected folder." msgstr "請檢查你在所é¸å–è³‡æ–™å¤¾æ“æœ‰å¯«å…¥æ¬Šé™ã€‚" #: ../gtk/src/hocr/OutputEditorHOCR.cc:1035 ../gtk/src/OutputEditorText.cc:296 #: ../qt/src/hocr/OutputEditorHOCR.cc:894 ../qt/src/OutputEditorText.cc:259 msgid "Output not saved" msgstr "未儲存輸出" #: ../gtk/src/hocr/OutputEditorHOCR.cc:1035 ../gtk/src/OutputEditorText.cc:296 #: ../qt/src/hocr/OutputEditorHOCR.cc:894 ../qt/src/OutputEditorText.cc:259 msgid "Save output before proceeding?" msgstr "先儲存輸出å†ç¹¼çºŒï¼Ÿ" #: ../gtk/src/hocr/OutputEditorHOCR.cc:1156 ../gtk/src/OutputEditorText.cc:184 #: ../qt/src/hocr/OutputEditorHOCR.cc:991 ../qt/src/OutputEditorText.cc:152 msgid "Replacing..." msgstr "å–代中……" #: ../gtk/src/hocr/OutputEditorHOCR.cc:1181 ../gtk/src/OutputEditorText.cc:192 #: ../qt/src/hocr/OutputEditorHOCR.cc:1014 ../qt/src/OutputEditorText.cc:160 msgid "Applying substitutions..." msgstr "正在套用替æ›å€¼â€¦â€¦" #: ../gtk/src/MainWindow.cc:131 ../qt/src/MainWindow.cc:295 msgid "Using tesseract" msgstr "採用 tesseract" #: ../gtk/src/MainWindow.cc:178 ../qt/src/MainWindow.cc:194 msgid "Select an image to begin..." msgstr "è«‹é¸å–圖åƒä½œç‚ºé–‹å§‹â€¦â€¦" #: ../gtk/src/MainWindow.cc:293 ../qt/src/MainWindow.cc:278 msgid "Multiple sources" msgstr "多個來æº" #: ../gtk/src/MainWindow.cc:295 ../qt/src/MainWindow.cc:280 msgid "Ready" msgstr "就緒" #: ../gtk/src/MainWindow.cc:442 ../qt/src/MainWindow.cc:423 msgid "New version" msgstr "新版本" #: ../gtk/src/MainWindow.cc:442 ../qt/src/MainWindow.cc:423 msgid "gImageReader %1 is available" msgstr "gImageReader %1 å·²é¢ä¸–" #: ../gtk/src/MainWindow.cc:443 ../qt/src/MainWindow.cc:424 msgid "Download" msgstr "下載" #: ../gtk/src/MainWindow.cc:444 ../qt/src/MainWindow.cc:425 msgid "Changelog" msgstr "修改日誌" #: ../gtk/src/MainWindow.cc:445 ../qt/src/MainWindow.cc:426 msgid "Don't notify again" msgstr "ä¸å†æç¤º" #: ../gtk/src/MainWindow.cc:466 ../qt/src/MainWindow.cc:474 msgid "Don't show again" msgstr "ä¸å†é¡¯ç¤º" #: ../gtk/src/MainWindow.cc:467 ../gtk/src/MainWindow.cc:480 #: ../qt/src/MainWindow.cc:475 msgid "Install" msgstr "安è£" #: ../gtk/src/MainWindow.cc:487 ../qt/src/MainWindow.cc:487 msgid "Spelling dictionary missing" msgstr "éºæ¼æ‹¼å­—詞典" #: ../gtk/src/MainWindow.cc:487 ../qt/src/MainWindow.cc:487 msgid "The spellcheck dictionary for %1 is not installed" msgstr "æœªå®‰è£ %1 的拼字詞典" #: ../gtk/src/MainWindow.cc:494 ../gtk/src/MainWindow.cc:523 #: ../qt/src/MainWindow.cc:493 msgid "Installing spelling dictionary for '%1'" msgstr "æ­£åœ¨å®‰è£ '%1' 的拼字詞典" #: ../gtk/src/MainWindow.cc:515 ../gtk/src/MainWindow.cc:536 #: ../gtk/src/MainWindow.cc:544 ../gtk/src/MainWindow.cc:592 #: ../gtk/src/MainWindow.cc:597 ../gtk/src/TessdataManager.cc:60 #: ../gtk/src/TessdataManager.cc:70 ../gtk/src/TessdataManager.cc:339 #: ../qt/src/MainWindow.cc:512 ../qt/src/MainWindow.cc:525 #: ../qt/src/MainWindow.cc:534 ../qt/src/MainWindow.cc:578 #: ../qt/src/MainWindow.cc:583 ../qt/src/TessdataManager.cc:74 #: ../qt/src/TessdataManager.cc:84 ../qt/src/TessdataManager.cc:315 msgid "Error" msgstr "錯誤" #: ../gtk/src/MainWindow.cc:515 ../qt/src/MainWindow.cc:512 msgid "Failed to install spelling dictionary: %1" msgstr "ç„¡æ³•å®‰è£æ‹¼å­—詞典:%1" #: ../gtk/src/MainWindow.cc:536 ../qt/src/MainWindow.cc:525 msgid "Failed to create directory for spelling dictionaries." msgstr "無法建立拼字詞典目錄。" #: ../gtk/src/MainWindow.cc:544 ../qt/src/MainWindow.cc:534 msgid "Could not read %1: %2." msgstr "ç„¡æ³•è®€å– %1:%2。" #: ../gtk/src/MainWindow.cc:571 ../qt/src/MainWindow.cc:558 msgid "Downloading '%1'..." msgstr "正在下載 '%1'……" #: ../gtk/src/MainWindow.cc:592 ../qt/src/MainWindow.cc:578 msgid "" "The following dictionaries could not be downloaded:\n" "%1\n" "\n" "Check the connectivity and directory permissions.\n" "Hint: If you don't have write permissions in system folders, you can switch " "to user paths in the settings dialog." msgstr "" "無法下載或刪除下列詞典:\n" "%1\n" "\n" "請檢查連線åŠç›®éŒ„權é™ã€‚\n" "æç¤ºï¼šå¦‚果您在系統資料夾中沒有寫入權é™ï¼Œæ‚¨å¯ä»¥åœ¨è¨­å®šå°è©±æ–¹å¡Šä¸­åˆ‡æ›åˆ°ä½¿ç”¨è€…è·¯" "徑。" #: ../gtk/src/MainWindow.cc:595 ../qt/src/MainWindow.cc:581 msgid "Dictionaries installed" msgstr "已安è£è©žå…¸" #: ../gtk/src/MainWindow.cc:595 msgid "" "The following dictionaries were installed:\n" "%1" msgstr "" "已安è£ä¸‹åˆ—詞典:\n" "%1" #: ../gtk/src/MainWindow.cc:597 ../qt/src/MainWindow.cc:583 msgid "No spelling dictionaries found for '%1'." msgstr "找ä¸åˆ° '%1' 的拼字詞典。" #: ../gtk/src/OutputEditorText.cc:154 ../qt/src/OutputEditorText.cc:137 msgid "Stripping line breaks..." msgstr "去除æ›è¡Œç¬¦è™Ÿâ€¦â€¦" #: ../gtk/src/OutputEditorText.cc:162 msgid "Check spelling" msgstr "檢查拼字" #: ../gtk/src/OutputEditorText.cc:231 ../qt/src/OutputEditorText.cc:196 msgid "File: %1" msgstr "檔案:%1" #: ../gtk/src/OutputEditorText.cc:234 ../qt/src/OutputEditorText.cc:199 msgid "Page: %1" msgstr "é é¢ï¼š%1" #: ../gtk/src/OutputEditorText.cc:247 ../gtk/src/Recognizer.cc:471 #: ../qt/src/Recognizer.cc:462 msgid "" "\n" "[Failed to recognize page %1]\n" msgstr "" "\n" "[無法辨èªç¬¬ %1 é ]\n" #: ../gtk/src/OutputEditorText.cc:275 ../qt/src/OutputEditorText.cc:239 msgid "Save Output..." msgstr "儲存輸出……" #: ../gtk/src/Recognizer.cc:179 ../qt/src/Recognizer.cc:172 msgid "No languages available" msgstr "沒有å¯ç”¨èªžè¨€" #: ../gtk/src/Recognizer.cc:179 ../qt/src/Recognizer.cc:172 msgid "" "No tesseract languages are available for use. Recognition will not work." msgstr "沒有å¯ç”¨çš„ tesseract 語言。辨èªå°‡æœƒå¤±æ•—。" #: ../gtk/src/Recognizer.cc:233 ../qt/src/Recognizer.cc:232 msgid "Multilingual" msgstr "多語言" #: ../gtk/src/Recognizer.cc:285 ../qt/src/Recognizer.cc:277 msgid "Automatic page segmentation" msgstr "自動分割é é¢" #: ../gtk/src/Recognizer.cc:286 ../qt/src/Recognizer.cc:278 msgid "Page segmentation with orientation and script detection" msgstr "分割é é¢ä¸¦åµæ¸¬æ–¹å‘åŠæ–‡å­—" #: ../gtk/src/Recognizer.cc:287 ../qt/src/Recognizer.cc:279 msgid "Assume single column of text" msgstr "å‡è¨­åªæœ‰ä¸€æ¬„文字" #: ../gtk/src/Recognizer.cc:288 ../qt/src/Recognizer.cc:280 msgid "Assume single block of vertically aligned text" msgstr "å‡è¨­åªæœ‰ä¸€æ®µåž‚ç›´å°æ•´çš„æ–‡å­—" #: ../gtk/src/Recognizer.cc:289 ../qt/src/Recognizer.cc:281 msgid "Assume a single uniform block of text" msgstr "å‡è¨­åªæœ‰ä¸€æ®µå‡å‹»çš„æ–‡å­—" #: ../gtk/src/Recognizer.cc:290 ../qt/src/Recognizer.cc:282 msgid "Assume a line of text" msgstr "å‡è¨­åªæœ‰ä¸€è¡Œæ–‡å­—" #: ../gtk/src/Recognizer.cc:291 ../qt/src/Recognizer.cc:283 msgid "Assume a single word" msgstr "å‡è¨­åªæœ‰ä¸€å€‹å­—" #: ../gtk/src/Recognizer.cc:292 ../qt/src/Recognizer.cc:284 msgid "Assume a single word in a circle" msgstr "å‡è¨­æ˜¯åœ“圈內的一個字" #: ../gtk/src/Recognizer.cc:293 ../qt/src/Recognizer.cc:285 msgid "Sparse text in no particular order" msgstr "沒有特定次åºçš„ç¨€ç–æ–‡å­—" #: ../gtk/src/Recognizer.cc:294 ../qt/src/Recognizer.cc:286 msgid "Sparse text with orientation and script detection" msgstr "嵿¸¬ç¨€ç–文字的方å‘åŠæ–‡å­—" #: ../gtk/src/Recognizer.cc:309 ../qt/src/Recognizer.cc:297 msgid "Page segmentation mode" msgstr "分割é é¢æ¨¡å¼" #: ../gtk/src/Recognizer.cc:313 ../qt/src/Recognizer.cc:300 msgid "Character whitelist / blacklist..." msgstr "" #: ../gtk/src/Recognizer.cc:319 ../qt/src/Recognizer.cc:305 msgid "Manage languages..." msgstr "管ç†èªžè¨€â€¦â€¦" #: ../gtk/src/Recognizer.cc:375 ../qt/src/Recognizer.cc:369 msgid "Current selection" msgstr "ç¾æœ‰é¸å–å€" #: ../gtk/src/Recognizer.cc:465 ../qt/src/Recognizer.cc:455 msgid "Recognizing page %1 (%2 of %3)" msgstr "辨èªç¬¬ %1 é ï¼ˆ%3 之 %2)" #: ../gtk/src/Recognizer.cc:470 ../qt/src/Recognizer.cc:461 msgid "" "\n" "- Page %1: failed to render page" msgstr "" "\n" "- 第 %1 é ï¼šç„¡æ³•繪畫é é¢" #: ../gtk/src/Recognizer.cc:501 ../gtk/src/Recognizer.cc:531 #: ../gtk/src/Recognizer.cc:544 ../qt/src/Recognizer.cc:491 #: ../qt/src/Recognizer.cc:521 ../qt/src/Recognizer.cc:534 msgid "Recognizing..." msgstr "辨èªä¸­â€¦â€¦" #: ../gtk/src/Recognizer.cc:505 ../gtk/src/Recognizer.cc:514 #: ../qt/src/Recognizer.cc:495 ../qt/src/Recognizer.cc:504 msgid "Recognition errors occurred" msgstr "è¾¨èªæ™‚出ç¾éŒ¯èª¤" #: ../gtk/src/Recognizer.cc:505 ../qt/src/Recognizer.cc:495 msgid "The following errors occurred:%1" msgstr "出ç¾ä¸‹åˆ—錯誤:%1" #: ../gtk/src/Recognizer.cc:514 ../qt/src/Recognizer.cc:504 msgid "Failed to initialize tesseract" msgstr "無法åˆå§‹åŒ– tesseract" #: ../gtk/src/scanner/ScannerSane.cc:84 ../gtk/src/scanner/ScannerTwain.cc:288 #: ../qt/src/scanner/ScannerSane.cc:85 ../qt/src/scanner/ScannerTwain.cc:286 msgid "Scan canceled" msgstr "已喿¶ˆæŽƒæ" #: ../gtk/src/scanner/ScannerSane.cc:159 ../gtk/src/scanner/ScannerTwain.cc:186 #: ../qt/src/scanner/ScannerSane.cc:159 ../qt/src/scanner/ScannerTwain.cc:178 msgid "No scanner specified" msgstr "未指定掃æå™¨" #: ../gtk/src/scanner/ScannerSane.cc:168 ../gtk/src/scanner/ScannerTwain.cc:195 #: ../qt/src/scanner/ScannerSane.cc:168 ../qt/src/scanner/ScannerTwain.cc:187 msgid "Unable to connect to scanner" msgstr "無法連線至掃æå™¨" #: ../gtk/src/scanner/ScannerSane.cc:403 ../gtk/src/scanner/ScannerTwain.cc:266 #: ../gtk/src/scanner/ScannerTwain.cc:292 ../qt/src/scanner/ScannerSane.cc:403 #: ../qt/src/scanner/ScannerTwain.cc:258 ../qt/src/scanner/ScannerTwain.cc:290 msgid "Unable to start scan" msgstr "無法開始掃æ" #: ../gtk/src/scanner/ScannerSane.cc:411 ../gtk/src/scanner/ScannerSane.cc:461 #: ../gtk/src/scanner/ScannerTwain.cc:318 ../qt/src/scanner/ScannerSane.cc:411 #: ../qt/src/scanner/ScannerSane.cc:461 ../qt/src/scanner/ScannerTwain.cc:316 msgid "Error communicating with scanner" msgstr "與掃æå™¨æºé€šå‡ºç¾éŒ¯èª¤" #: ../gtk/src/scanner/ScannerSane.cc:520 ../qt/src/scanner/ScannerSane.cc:517 msgid "Failed to save image" msgstr "無法儲存圖åƒ" #: ../gtk/src/scanner/ScannerSane.cc:800 ../qt/src/scanner/ScannerSane.cc:797 msgid "Operation is cancelled." msgstr "已喿¶ˆæ“作。" #: ../gtk/src/scanner/ScannerSane.cc:802 ../qt/src/scanner/ScannerSane.cc:799 msgid "Device is busy." msgstr "è£ç½®ç¾æ­£ç¹å¿™ã€‚" #: ../gtk/src/scanner/ScannerSane.cc:804 ../qt/src/scanner/ScannerSane.cc:801 msgid "Cover is opened." msgstr "機蓋已打開。" #: ../gtk/src/scanner/ScannerSane.cc:806 ../qt/src/scanner/ScannerSane.cc:803 msgid "Document feeder jammed." msgstr "進紙器å¡ç´™ã€‚" #: ../gtk/src/scanner/ScannerSane.cc:808 ../qt/src/scanner/ScannerSane.cc:805 msgid "Document feeder out of documents." msgstr "進紙器缺文件。" #: ../gtk/src/scanner/ScannerSane.cc:810 ../qt/src/scanner/ScannerSane.cc:807 msgid "Access to scanner is denied." msgstr "å­˜å–æŽƒæå™¨è¢«æ‹’絕。" #: ../gtk/src/SourceManager.cc:118 ../qt/src/SourceManager.cc:124 msgid "PDFs with text" msgstr "嫿–‡å­—çš„ PDF" #: ../gtk/src/SourceManager.cc:118 ../qt/src/SourceManager.cc:124 msgid "" "These PDF files already contain text:\n" "%1" msgstr "" "這些 PDF æª”å·²åŒ…å«æ–‡å­—:\n" "%1" #: ../gtk/src/SourceManager.cc:127 ../qt/src/SourceManager.cc:132 msgid "Unable to open files" msgstr "無法開啟檔案" #: ../gtk/src/SourceManager.cc:127 ../qt/src/SourceManager.cc:132 msgid "The following files could not be opened:%1" msgstr "無法開啟下列檔案:%1" #: ../gtk/src/SourceManager.cc:141 ../qt/src/SourceManager.cc:143 msgid "Enter password for file '%1':" msgstr "請為 '%1' 檔輸入密碼:" #: ../gtk/src/SourceManager.cc:197 ../qt/src/SourceManager.cc:214 msgid "Images and PDFs" msgstr "圖åƒèˆ‡ PDF 檔" #: ../gtk/src/SourceManager.cc:202 ../qt/src/SourceManager.cc:215 msgid "Select Files" msgstr "é¸å–檔案" #: ../gtk/src/SourceManager.cc:208 ../qt/src/SourceManager.cc:226 msgid "Clipboard Error" msgstr "剪貼簿錯誤" #: ../gtk/src/SourceManager.cc:208 ../qt/src/SourceManager.cc:226 msgid "Failed to read the clipboard." msgstr "無法讀å–剪貼簿。" #: ../gtk/src/SourceManager.cc:212 ../qt/src/SourceManager.cc:230 #: ../qt/src/SourceManager.cc:236 msgid "Pasted %1" msgstr "已貼上 %1" #: ../gtk/src/SourceManager.cc:224 ../qt/src/SourceManager.cc:243 msgid "Screenshot Error" msgstr "ç•«é¢æˆªåœ–錯誤" #: ../gtk/src/SourceManager.cc:224 ../qt/src/SourceManager.cc:243 msgid "Failed to take screenshot." msgstr "無法截å–ç•«é¢ã€‚" #: ../gtk/src/SourceManager.cc:228 ../qt/src/SourceManager.cc:247 msgid "Screenshot %1" msgstr "截圖 %1" #: ../gtk/src/SourceManager.cc:233 ../qt/src/SourceManager.cc:252 msgid "Saving image..." msgstr "儲存圖åƒä¸­â€¦â€¦" #: ../gtk/src/SourceManager.cc:240 ../qt/src/SourceManager.cc:265 msgid "Cannot Write File" msgstr "無法寫入檔案" #: ../gtk/src/SourceManager.cc:240 ../qt/src/SourceManager.cc:265 msgid "Could not write to %1." msgstr "無法寫進 %1。" #: ../gtk/src/SourceManager.cc:267 ../qt/src/SourceManager.cc:287 msgid "Delete File?" msgstr "刪除檔案?" #: ../gtk/src/SourceManager.cc:267 ../qt/src/SourceManager.cc:287 msgid "The following files will be deleted:%1" msgstr "下列檔案將會被刪除:%1" #: ../gtk/src/SourceManager.cc:332 ../qt/src/SourceManager.cc:338 msgid "Missing File" msgstr "éºæ¼æª”案" #: ../gtk/src/SourceManager.cc:332 ../qt/src/SourceManager.cc:338 msgid "" "The following file has been deleted or moved:\n" "%1" msgstr "" "下列檔案已被刪除或移除:\n" "%1" #: ../gtk/src/SubstitutionsManager.cc:33 ../qt/src/SubstitutionsManager.cc:73 msgid "Search for" msgstr "尋找" #: ../gtk/src/SubstitutionsManager.cc:34 ../qt/src/SubstitutionsManager.cc:73 msgid "Replace with" msgstr "å–代" #: ../gtk/src/SubstitutionsManager.cc:69 ../gtk/src/SubstitutionsManager.cc:103 #: ../qt/src/SubstitutionsManager.cc:106 ../qt/src/SubstitutionsManager.cc:143 msgid "Substitutions List" msgstr "æ›¿æ›æ¸…å–®" #: ../gtk/src/SubstitutionsManager.cc:70 ../qt/src/SubstitutionsManager.cc:106 msgid "Open Substitutions List" msgstr "é–‹å§‹æ›¿æ›æ¸…å–®" #: ../gtk/src/SubstitutionsManager.cc:75 ../qt/src/SubstitutionsManager.cc:112 msgid "Error Reading File" msgstr "讀案錯誤" #: ../gtk/src/SubstitutionsManager.cc:75 ../qt/src/SubstitutionsManager.cc:112 msgid "Unable to read '%1'." msgstr "ç„¡æ³•è®€å– '%1'。" #: ../gtk/src/SubstitutionsManager.cc:97 ../qt/src/SubstitutionsManager.cc:137 msgid "Errors Occurred Reading File" msgstr "è®€å–æª”案時出ç¾éŒ¯èª¤" #: ../gtk/src/SubstitutionsManager.cc:97 ../qt/src/SubstitutionsManager.cc:137 msgid "Some entries of the substitutions list could not be read." msgstr "ç„¡æ³•è®€å–æ›¿æ›æ¸…單內æŸäº›é …目。" #: ../gtk/src/SubstitutionsManager.cc:104 ../qt/src/SubstitutionsManager.cc:143 msgid "Save Substitutions List" msgstr "å„²å­˜æ›¿æ›æ¸…å–®" #: ../gtk/src/SubstitutionsManager.cc:110 ../qt/src/SubstitutionsManager.cc:149 msgid "Error Saving File" msgstr "存檔錯誤" #: ../gtk/src/SubstitutionsManager.cc:110 ../qt/src/SubstitutionsManager.cc:149 msgid "Unable to write to '%1'." msgstr "無法寫進 '%1'。" #: ../gtk/src/SubstitutionsManager.cc:127 ../qt/src/SubstitutionsManager.cc:162 msgid "Save List?" msgstr "儲存清單?" #: ../gtk/src/SubstitutionsManager.cc:127 ../qt/src/SubstitutionsManager.cc:162 msgid "Do you want to save the current list?" msgstr "是å¦éœ€è¦å„²å­˜ç¾æœ‰æ¸…單?" #: ../gtk/src/TessdataManager.cc:60 ../qt/src/TessdataManager.cc:74 #, fuzzy msgid "" "A session connection to the PackageKit backend is required for managing " "system-wide tesseract language packs, but it was not found. This service is " "usually provided by a software-management application such as Gnome " "Software. Please install software which provides the necessary PackageKit " "interface, use other system package management software to manage the " "tesseract language packs directly, or switch to using the user tessdata path " "in the configuration dialog." msgstr "" "ç®¡ç† tesseract çš„ç³»çµ±èªžè¨€åŒ…é ˆè¦ PackageKit,但它並ä¸å­˜åœ¨ã€‚請利用系統的套件管" "ç†è»Ÿä»¶ä¾†ç®¡ç† tesseract 的語言包,或改用設置é é¢å…§çš„ tessdata 用戶路徑。" #: ../gtk/src/TessdataManager.cc:65 ../qt/src/TessdataManager.cc:79 msgid "Fetching available languages" msgstr "å–å¾—å¯ç”¨èªžè¨€" #: ../gtk/src/TessdataManager.cc:70 ../gtk/src/TessdataManager.cc:96 #: ../gtk/src/TessdataManager.cc:197 ../qt/src/TessdataManager.cc:84 #: ../qt/src/TessdataManager.cc:101 ../qt/src/TessdataManager.cc:197 msgid "Failed to fetch list of available languages: %1" msgstr "無法å–å¾—å¯ç”¨èªžè¨€çš„æ¸…單:%1" #: ../gtk/src/TessdataManager.cc:104 ../qt/src/TessdataManager.cc:113 #: ../qt/src/TessdataManager.cc:122 msgid "Parsing error: %1" msgstr "剖æžéŒ¯èª¤ï¼š%1" #: ../gtk/src/TessdataManager.cc:235 ../qt/src/TessdataManager.cc:232 msgid "Applying changes..." msgstr "正在套用改動……" #: ../gtk/src/TessdataManager.cc:297 ../qt/src/TessdataManager.cc:278 msgid "Failed to create directory for tessdata files." msgstr "無法為 tessdata 檔建立目錄。" #: ../gtk/src/TessdataManager.cc:306 ../qt/src/TessdataManager.cc:287 msgid "Downloading %1..." msgstr "正在下載 %1……" #: ../gtk/src/TessdataManager.cc:330 msgid "" "The following files could not be downloaded or removed:\n" "%1\n" "\n" "Check the connectivity and directory permissions.\n" "\n" "Hint: If you don't have write permissions in system folders, you can switch " "to user paths in the settings dialog." msgstr "" "無法下載或刪除下列檔案:\n" "%1\n" "\n" "請檢查連線åŠç›®éŒ„權é™ã€‚\n" "\n" "æç¤ºï¼šå¦‚果您在系統資料夾中沒有寫入權é™ï¼Œæ‚¨å¯ä»¥åœ¨è¨­å®šå°è©±æ–¹å¡Šä¸­åˆ‡æ›åˆ°ä½¿ç”¨è€…è·¯" "徑。" #: ../gtk/src/Utils.cc:64 msgid "Yes" msgstr "是" #: ../gtk/src/Utils.cc:67 msgid "No" msgstr "å¦" #: ../gtk/src/Utils.cc:76 msgid "Discard" msgstr "棄置" #: ../qt/data/AboutDialog.ui.h:1 msgid "About gImageReader" msgstr "有關 gImageReader" #: ../qt/data/AboutDialog.ui.h:3 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/CrashHandler.ui.h:3 msgid "" "

Tesseract has " "aborted

Tesseract (the OCR engine) has aborted while " "recognizing text. This may occur if the used traineddatas are corrupt or " "incomplatible with the version of tesseract in use, or due to a bug in " "tesseract.

The stacktrace below may provide additional information " "about where the crash occured.

" msgstr "" #: ../qt/data/MainWindow.ui.h:17 msgid "Flatbed" msgstr "å¹³æ¿" #: ../qt/data/MainWindow.ui.h:18 msgid "ADF Front" msgstr "ADF æ­£é¢" #: ../qt/data/MainWindow.ui.h:19 msgid "ADF Back" msgstr "ADF 背é¢" #: ../qt/data/MainWindow.ui.h:20 msgid "ADF Duplex" msgstr "ADF é›™é¢" #. Remove & from some labels which designer insists in adding #: ../qt/data/MainWindow.ui.h:21 ../qt/src/Ui_MainWindow.hh:50 msgid "Sources" msgstr "來æº" #: ../qt/data/MainWindow.ui.h:22 msgid "Zoom In" msgstr "放大" #: ../qt/data/MainWindow.ui.h:24 msgid "Zoom Out" msgstr "縮å°" #: ../qt/data/MainWindow.ui.h:26 msgid "Normal Size" msgstr "正常大å°" #: ../qt/data/MainWindow.ui.h:28 msgid "Best Fit" msgstr "最佳大å°" #: ../qt/data/MainWindow.ui.h:30 msgid "Rotate Left" msgstr "å‘左旋轉" #: ../qt/data/MainWindow.ui.h:31 msgid "Rotate left" msgstr "å‘左旋轉" #: ../qt/data/MainWindow.ui.h:32 msgid "Rotate Right" msgstr "å‘峿—‹è½‰" #: ../qt/data/MainWindow.ui.h:33 msgid "Rotate right" msgstr "å‘峿—‹è½‰" #: ../qt/data/MainWindow.ui.h:34 msgid "Image Controls" msgstr "åœ–åƒæŽ§åˆ¶" #: ../qt/data/MainWindow.ui.h:36 msgid "Autodetect Layout" msgstr "è‡ªå‹•åµæ¸¬ä½ˆå±€" #: ../qt/data/MainWindow.ui.h:38 msgid "Toggle Output Pane" msgstr "切æ›è¼¸å‡ºé¢æ¿" #: ../qt/data/PdfExportDialog.ui.h:5 msgid "Backend:" msgstr "後端:" #: ../qt/data/PdfExportDialog.ui.h:8 msgid "Portrait" msgstr "縱å‘" #: ../qt/data/PdfExportDialog.ui.h:9 msgid "Landscape" msgstr "æ©«å‘" #: ../qt/src/hocr/HOCRPdfExporter.cc:142 msgid "Failed to write to file" msgstr "無法寫入檔案" #. Output toolbar #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:55 #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:56 msgid "Open hOCR file" msgstr "開啟 hOCR 檔" #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:57 #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:58 msgid "Save as hOCR text" msgstr "儲存為 hOCR 文字" #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:79 #: ../qt/src/Ui_OutputEditorText.hh:106 msgid "Find and Replace" msgstr "尋找åŠå–代" #: ../qt/src/MainWindow.cc:581 #, fuzzy msgid "" "The following dictionary files were installed:\n" "%1" msgstr "已安è£ä¸‹åˆ—詞典檔:%1" #: ../qt/src/TessdataManager.cc:308 msgid "" "The following files could not be downloaded or removed:\n" "%1\n" "\n" "Check the connectivity and directory permissions.\n" "Hint: If you don't have write permissions in system folders, you can switch " "to user paths in the settings dialog." msgstr "" "無法下載或刪除下列檔案:\n" "%1\n" "\n" "請檢查連線åŠç›®éŒ„權é™ã€‚\n" "æç¤ºï¼šå¦‚果您在系統資料夾中沒有寫入權é™ï¼Œæ‚¨å¯ä»¥åœ¨è¨­å®šå°è©±æ–¹å¡Šä¸­åˆ‡æ›åˆ°ä½¿ç”¨è€…è·¯" "徑。" #: ../qt/src/Ui_MainWindow.hh:51 msgid "Output" msgstr "輸出:" #: ../qt/src/Ui_MainWindow.hh:135 msgid "OCR mode:" msgstr "OCR 模å¼ï¼š" #: ../qt/src/Ui_MainWindow.hh:209 msgid "Remove Image" msgstr "移除圖åƒ" #: ../qt/src/Ui_MainWindow.hh:212 msgid "Delete Image" msgstr "刪除圖åƒ" #: ../qt/src/Ui_MainWindow.hh:215 msgid "Clear List" msgstr "清除清單" #: ../qt/src/Ui_OutputEditorText.hh:101 msgid "Strip Line Breaks" msgstr "去除æ›è¡Œç¬¦è™Ÿ" #: ../qt/src/Ui_OutputEditorText.hh:115 msgid "Save Output" msgstr "儲存輸出" #: ../qt/src/Ui_OutputEditorText.hh:117 msgid "Clear Output" msgstr "清除輸出" #~ msgid "The application has crashed" #~ msgstr "應用程å¼å·²ç•°å¸¸çµ‚æ­¢" #~ msgid "Could not read %1: %2" #~ msgstr "ç„¡æ³•è®€å– %1:%2。" #~ 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 。" gImageReader-3.3.1/po/zh_TW.po000066400000000000000000001736561351740627400160760ustar00rootroot00000000000000# 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-2018. # Sandro Mani , 2016, 2017. msgid "" msgstr "" "Project-Id-Version: \n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2019-07-25 23:17+0200\n" "PO-Revision-Date: 2018-07-17 13:15+0000\n" "Last-Translator: ezjerry liao \n" "Language-Team: Chinese (Traditional) \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: Weblate 3.1-dev\n" #: ../data/gimagereader.desktop.in.h:1 msgid "OCR application" msgstr "OCR 應用程å¼" #: ../gtk/data/appmenu.ui.h:1 ../qt/src/Ui_MainWindow.hh:167 msgid "Redetect Languages" msgstr "釿–°åµæ¸¬èªžè¨€" #: ../gtk/data/appmenu.ui.h:2 ../qt/src/Ui_MainWindow.hh:170 msgid "Manage Languages" msgstr "管ç†èªžè¨€" #: ../gtk/data/appmenu.ui.h:3 ../gtk/data/ConfigDialog.ui.h:1 #: ../qt/data/ConfigDialog.ui.h:1 ../qt/src/Ui_MainWindow.hh:173 msgid "Preferences" msgstr "é¸é …" #: ../gtk/data/appmenu.ui.h:4 ../gtk/data/ConfigDialog.ui.h:2 #: ../gtk/src/MainWindow.cc:482 ../qt/src/MainWindow.cc:481 #: ../qt/src/Ui_MainWindow.hh:178 msgid "Help" msgstr "å”助" #: ../gtk/data/appmenu.ui.h:5 ../qt/data/AboutDialog.ui.h:2 #: ../qt/src/Ui_MainWindow.hh:181 msgid "About" msgstr "關於" #: ../gtk/data/appmenu.ui.h:6 msgid "Quit" msgstr "離開" #: ../gtk/data/ConfigDialog.ui.h:3 ../gtk/data/MainWindow.ui.h:47 #: ../gtk/data/OutputEditorHOCR.ui.h:3 ../gtk/data/PdfExportDialog.ui.h:3 #: ../gtk/src/FileDialogs.cc:152 ../gtk/src/Utils.cc:61 #: ../qt/data/ConfigDialog.ui.h:26 msgid "OK" msgstr "確定" #: ../gtk/data/ConfigDialog.ui.h:4 msgid "Output pane orientation:" msgstr "è¼¸å‡ºé¢æ¿çš„æ–¹å‘:" #: ../gtk/data/ConfigDialog.ui.h:5 msgid "Horizontal" msgstr "æ©«å‘" #: ../gtk/data/ConfigDialog.ui.h:6 msgid "Vertical" msgstr "縱å‘" #: ../gtk/data/ConfigDialog.ui.h:7 ../qt/data/ConfigDialog.ui.h:18 msgid "Query to install missing spellcheck dictionaries" msgstr "æŸ¥æ‰¾éºæ¼å®‰è£çš„æ‹¼å­—詞典" #: ../gtk/data/ConfigDialog.ui.h:8 ../qt/data/ConfigDialog.ui.h:4 msgid "Automatically check for new program versions" msgstr "自動檢查新版本" #: ../gtk/data/ConfigDialog.ui.h:9 ../qt/data/ConfigDialog.ui.h:3 msgid "Predefined language definitions:" msgstr "é è¨­èªžè¨€å®šç¾©ï¼š" #: ../gtk/data/ConfigDialog.ui.h:10 ../qt/data/ConfigDialog.ui.h:12 msgid "Additional language definitions:" msgstr "é¡å¤–語言定義:" #: ../gtk/data/ConfigDialog.ui.h:11 ../qt/data/ConfigDialog.ui.h:20 msgid "The prefix of the tesseract language data file" msgstr "tesseract 語言資料檔的å‰ç½®" #: ../gtk/data/ConfigDialog.ui.h:12 ../qt/data/ConfigDialog.ui.h:21 msgid "Prefix" msgstr "å‰ç½®" #: ../gtk/data/ConfigDialog.ui.h:13 ../qt/data/ConfigDialog.ui.h:22 msgid "The ISO 639-1 language code followed by the country code" msgstr "ISO 639-1 語言代碼並國家代碼" #: ../gtk/data/ConfigDialog.ui.h:14 ../qt/data/ConfigDialog.ui.h:23 msgid "ISO Code" msgstr "ISO 代碼" #: ../gtk/data/ConfigDialog.ui.h:15 ../qt/data/ConfigDialog.ui.h:24 msgid "The name of the language" msgstr "語言å稱" #: ../gtk/data/ConfigDialog.ui.h:16 ../qt/data/ConfigDialog.ui.h:25 msgid "Name" msgstr "å稱" #: ../gtk/data/ConfigDialog.ui.h:17 ../gtk/data/MainWindow.ui.h:46 #: ../gtk/data/OutputEditorHOCR.ui.h:2 ../gtk/data/PdfExportDialog.ui.h:2 #: ../gtk/src/Acquirer.cc:34 ../gtk/src/FileDialogs.cc:151 #: ../gtk/src/Utils.cc:70 ../qt/data/ConfigDialog.ui.h:27 #: ../qt/data/MainWindow.ui.h:12 msgid "Cancel" msgstr "å–æ¶ˆ" #: ../gtk/data/ConfigDialog.ui.h:18 ../qt/data/ConfigDialog.ui.h:5 msgid "Output pane font:" msgstr "è¼¸å‡ºé¢æ¿å­—型:" #: ../gtk/data/ConfigDialog.ui.h:19 ../qt/data/ConfigDialog.ui.h:2 msgid "Default" msgstr "é è¨­å€¼" #: ../gtk/data/ConfigDialog.ui.h:20 ../qt/data/ConfigDialog.ui.h:6 msgid "Language data locations:" msgstr "語言資料ä½ç½®ï¼š" #: ../gtk/data/ConfigDialog.ui.h:21 ../qt/data/ConfigDialog.ui.h:13 msgid "Language definitions path:" msgstr "語言定義路徑:" #: ../gtk/data/ConfigDialog.ui.h:22 ../qt/data/ConfigDialog.ui.h:28 msgid "Spelling dictionaries path:" msgstr "拼字詞典路徑:" #: ../gtk/data/ConfigDialog.ui.h:23 ../qt/data/ConfigDialog.ui.h:10 msgid "System-wide paths" msgstr "系統路徑" #: ../gtk/data/ConfigDialog.ui.h:24 ../qt/data/ConfigDialog.ui.h:11 msgid "User paths" msgstr "用戶路徑" #: ../gtk/data/ConfigDialog.ui.h:25 ../qt/data/ConfigDialog.ui.h:29 msgid "Automatically open exported documents with default application" msgstr "自動以é è¨­æ‡‰ç”¨ç¨‹å¼é–‹å•ŸåŒ¯å‡ºçš„æ–‡ä»¶" #: ../gtk/data/CrashHandler.ui.h:1 ../qt/src/CrashHandler.cc:38 msgid "Regenerate backtrace" msgstr "é‡å»º backtrace" #: ../gtk/data/CrashHandler.ui.h:3 #, fuzzy, no-c-format msgid "" "The application has crashed\n" "\n" "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/CrashHandler.ui.h:6 msgid "" "Tesseract has aborted\n" "\n" "Tesseract (the OCR engine) has aborted while recognizing text. This may " "occur if the used traineddatas are corrupt or incomplatible with the version " "of tesseract in use, or due to a bug in tesseract.\n" "\n" "The stacktrace below may provide additional information about where the " "crash occured.\n" msgstr "" #: ../gtk/data/MainWindow.ui.h:1 ../qt/data/MainWindow.ui.h:39 msgid "Toggle output pane" msgstr "切æ›è¼¸å‡ºé¢æ¿" #: ../gtk/data/MainWindow.ui.h:2 ../qt/src/Ui_MainWindow.hh:66 msgid "Rotate current page" msgstr "æ—‹è½‰ç¾æœ‰æ–‡å­—" #: ../gtk/data/MainWindow.ui.h:3 ../qt/src/Ui_MainWindow.hh:67 msgid "Rotate all pages" msgstr "旋轉所有é é¢" #. Sources toolbar #: ../gtk/data/MainWindow.ui.h:4 ../qt/src/Ui_MainWindow.hh:192 msgid "Recent" msgstr "最近" #: ../gtk/data/MainWindow.ui.h:5 ../qt/src/Ui_MainWindow.hh:193 msgid "Paste" msgstr "貼上" #: ../gtk/data/MainWindow.ui.h:6 ../qt/src/Ui_MainWindow.hh:194 msgid "Take Screenshot" msgstr "ç•«é¢æˆªåœ–" #: ../gtk/data/MainWindow.ui.h:7 ../qt/data/MainWindow.ui.h:23 msgid "Zoom in" msgstr "放大" #: ../gtk/data/MainWindow.ui.h:8 ../qt/data/MainWindow.ui.h:25 msgid "Zoom out" msgstr "縮å°" #: ../gtk/data/MainWindow.ui.h:9 ../qt/data/MainWindow.ui.h:27 msgid "Normal size" msgstr "正常大å°" #: ../gtk/data/MainWindow.ui.h:10 ../qt/data/MainWindow.ui.h:29 msgid "Best fit" msgstr "最佳大å°" #: ../gtk/data/MainWindow.ui.h:11 ../qt/src/Ui_MainWindow.hh:75 msgid "Select rotation mode" msgstr "é¸å–旋轉模å¼" #: ../gtk/data/MainWindow.ui.h:12 ../gtk/data/OutputEditorText.ui.h:13 #: ../qt/src/Ui_OutputEditorText.hh:95 msgid "Select insert mode" msgstr "é¸ç”¨æ’入模å¼" #: ../gtk/data/MainWindow.ui.h:13 ../qt/src/Ui_MainWindow.hh:109 #, fuzzy msgid "Select page" msgstr "é¸å–語言" #: ../gtk/data/MainWindow.ui.h:14 ../qt/data/MainWindow.ui.h:35 msgid "Image controls" msgstr "åœ–åƒæŽ§åˆ¶" #: ../gtk/data/MainWindow.ui.h:15 ../qt/src/Ui_MainWindow.hh:139 msgid "Plain text" msgstr "純文字" #: ../gtk/data/MainWindow.ui.h:16 ../qt/src/Ui_MainWindow.hh:139 msgid "hOCR, PDF" msgstr "hOCRã€PDF" #: ../gtk/data/MainWindow.ui.h:17 ../qt/data/MainWindow.ui.h:37 msgid "Autodetect layout" msgstr "è‡ªå‹•åµæ¸¬ä½ˆå±€" #: ../gtk/data/MainWindow.ui.h:18 msgid "Recognize all" msgstr "辨èªå…¨éƒ¨" #: ../gtk/data/MainWindow.ui.h:19 msgid "Select language" msgstr "é¸å–語言" #: ../gtk/data/MainWindow.ui.h:20 ../qt/src/Ui_MainWindow.hh:205 msgid "Add images" msgstr "新增圖åƒ" #: ../gtk/data/MainWindow.ui.h:21 ../qt/src/Ui_MainWindow.hh:204 msgid "Add Images" msgstr "新增圖åƒ" #: ../gtk/data/MainWindow.ui.h:22 ../qt/src/Ui_MainWindow.hh:210 msgid "Remove image from list" msgstr "從清單移除圖åƒ" #: ../gtk/data/MainWindow.ui.h:23 ../qt/src/Ui_MainWindow.hh:213 msgid "Delete image" msgstr "刪除圖åƒ" #: ../gtk/data/MainWindow.ui.h:24 ../qt/src/Ui_MainWindow.hh:216 msgid "Clear list" msgstr "清除清單" #: ../gtk/data/MainWindow.ui.h:25 ../qt/data/MainWindow.ui.h:5 msgid "Files" msgstr "檔案" #: ../gtk/data/MainWindow.ui.h:26 ../qt/data/MainWindow.ui.h:8 msgid "Device:" msgstr "è£ç½®ï¼š" #: ../gtk/data/MainWindow.ui.h:27 ../gtk/data/TessdataManager.ui.h:4 #: ../qt/data/MainWindow.ui.h:7 ../qt/src/TessdataManager.cc:59 msgid "Refresh" msgstr "æ›´æ–°" #: ../gtk/data/MainWindow.ui.h:28 ../qt/data/MainWindow.ui.h:9 msgid "Output:" msgstr "輸出:" #: ../gtk/data/MainWindow.ui.h:29 ../qt/data/MainWindow.ui.h:13 msgid "Mode:" msgstr "模å¼ï¼š" #: ../gtk/data/MainWindow.ui.h:30 ../gtk/src/hocr/HOCRPdfExporter.cc:313 #: ../qt/data/MainWindow.ui.h:15 ../qt/src/hocr/HOCRPdfExporter.cc:347 msgid "Color" msgstr "彩色" #: ../gtk/data/MainWindow.ui.h:31 ../gtk/src/hocr/HOCRPdfExporter.cc:316 #: ../qt/data/MainWindow.ui.h:14 ../qt/src/hocr/HOCRPdfExporter.cc:349 #: ../qt/src/hocr/HOCRPdfExporter.cc:351 msgid "Grayscale" msgstr "ç°éšŽ" #: ../gtk/data/MainWindow.ui.h:32 ../qt/data/MainWindow.ui.h:10 msgid "Resolution:" msgstr "è§£åƒåº¦ï¼š" #: ../gtk/data/MainWindow.ui.h:33 ../qt/data/MainWindow.ui.h:11 msgid "Scan" msgstr "掃æ" #: ../gtk/data/MainWindow.ui.h:34 ../qt/data/MainWindow.ui.h:16 msgid "Source:" msgstr "來æºï¼š" #: ../gtk/data/MainWindow.ui.h:35 ../qt/data/MainWindow.ui.h:6 msgid "Acquire" msgstr "æ“·å–" #: ../gtk/data/MainWindow.ui.h:36 ../qt/data/MainWindow.ui.h:1 msgid "Brightness" msgstr "亮度" #: ../gtk/data/MainWindow.ui.h:37 ../qt/data/MainWindow.ui.h:2 msgid "Contrast" msgstr "å°æ¯”" #: ../gtk/data/MainWindow.ui.h:38 ../qt/data/MainWindow.ui.h:3 msgid "Resolution" msgstr "è§£åƒåº¦" #: ../gtk/data/MainWindow.ui.h:39 ../qt/data/MainWindow.ui.h:4 msgid "Invert colors" msgstr "å轉色版" #: ../gtk/data/MainWindow.ui.h:40 msgid "A graphical frontend to tesseract-ocr" msgstr "tesseract-ocr 的圖åƒä»‹é¢" #: ../gtk/data/MainWindow.ui.h:41 ../qt/data/CharacterListDialog.ui.h:1 msgid "Character whitelist / blacklist" msgstr "" #: ../gtk/data/MainWindow.ui.h:42 ../qt/data/CharacterListDialog.ui.h:2 msgid "Exclude these characters from being recognized (blacklist):" msgstr "" #: ../gtk/data/MainWindow.ui.h:43 ../qt/data/CharacterListDialog.ui.h:3 #, fuzzy msgid "Enter a string of characters..." msgstr "ç²å–åƒæ•¸â€¦â€¦" #: ../gtk/data/MainWindow.ui.h:44 ../qt/data/CharacterListDialog.ui.h:4 msgid "Only allow the following characters to be recognized (whitelist):" msgstr "" #: ../gtk/data/MainWindow.ui.h:45 ../qt/data/PageRangeDialog.ui.h:1 msgid "Page Range" msgstr "é é¢ç¯„åœ" #: ../gtk/data/MainWindow.ui.h:48 ../qt/data/PageRangeDialog.ui.h:2 msgid "Page range:" msgstr "é é¢ç¯„åœï¼š" #: ../gtk/data/MainWindow.ui.h:49 ../qt/data/PageRangeDialog.ui.h:3 msgid "Example: 1-10, 13, 14-18" msgstr "例如: 1-10, 13, 14-18" #: ../gtk/data/MainWindow.ui.h:50 ../qt/data/PageRangeDialog.ui.h:4 msgid "Recognition area:" msgstr "辨èªå€åŸŸï¼š" #: ../gtk/data/MainWindow.ui.h:51 ../gtk/src/Recognizer.cc:375 #: ../qt/data/PageRangeDialog.ui.h:5 ../qt/src/Recognizer.cc:369 msgid "Entire page" msgstr "æ•´é " #: ../gtk/data/MainWindow.ui.h:52 ../qt/data/PageRangeDialog.ui.h:6 msgid "Autodetect" msgstr "è‡ªå‹•åµæ¸¬" #: ../gtk/data/MainWindow.ui.h:53 ../qt/data/PageRangeDialog.ui.h:7 msgid "Prepend to output text:" msgstr "é å…ˆè¼¸å‡ºæ–‡å­—:" #: ../gtk/data/MainWindow.ui.h:54 ../qt/data/PageRangeDialog.ui.h:8 msgid "Source filename" msgstr "ä¾†æºæª”å" #: ../gtk/data/MainWindow.ui.h:55 ../qt/data/PageRangeDialog.ui.h:9 msgid "Source page" msgstr "來æºé " #: ../gtk/data/MainWindow.ui.h:56 ../qt/src/SourceManager.cc:146 msgid "Protected PDF" msgstr "å—ä¿è­· PDF" #: ../gtk/data/MainWindow.ui.h:57 ../qt/src/Recognizer.cc:76 msgid "Current Page" msgstr "ç¾æ™‚é é¢" #: ../gtk/data/MainWindow.ui.h:58 ../qt/src/Recognizer.cc:79 msgid "Multiple Pages..." msgstr "多é â€¦â€¦" #: ../gtk/data/OutputEditorHOCR.ui.h:1 ../qt/src/hocr/OutputEditorHOCR.cc:580 msgid "Add Word" msgstr "新增字詞" #: ../gtk/data/OutputEditorHOCR.ui.h:4 ../qt/src/hocr/OutputEditorHOCR.cc:580 msgid "Enter word:" msgstr "輸入字詞:" #: ../gtk/data/OutputEditorHOCR.ui.h:5 ../qt/src/hocr/Ui_OutputEditorHOCR.hh:61 #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:62 msgid "Export to plain text" msgstr "匯出為純文字" #: ../gtk/data/OutputEditorHOCR.ui.h:6 ../qt/src/hocr/Ui_OutputEditorHOCR.hh:64 #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:65 msgid "Export to PDF" msgstr "匯出至 PDF" #: ../gtk/data/OutputEditorHOCR.ui.h:7 ../qt/src/hocr/Ui_OutputEditorHOCR.hh:67 #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:68 msgid "Export to ODT" msgstr "匯出至 ODT" #: ../gtk/data/OutputEditorHOCR.ui.h:8 ../gtk/data/OutputEditorText.ui.h:18 #: ../qt/src/Ui_OutputEditorText.hh:116 msgid "Save output" msgstr "儲存輸出" #: ../gtk/data/OutputEditorHOCR.ui.h:9 ../qt/src/hocr/Ui_OutputEditorHOCR.hh:72 #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:73 msgid "Export" msgstr "匯出" #: ../gtk/data/OutputEditorHOCR.ui.h:10 ../gtk/data/OutputEditorText.ui.h:19 #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:77 #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:78 #: ../qt/src/Ui_OutputEditorText.hh:118 msgid "Clear output" msgstr "清除輸出" #: ../gtk/data/OutputEditorHOCR.ui.h:11 ../gtk/data/OutputEditorText.ui.h:15 #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:80 #: ../qt/src/Ui_OutputEditorText.hh:107 msgid "Find and replace" msgstr "æœå°‹åŠå–代" #: ../gtk/data/OutputEditorHOCR.ui.h:12 #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:82 #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:83 msgid "Show confidence values" msgstr "顯示å¯ä¿¡åº¦" #: ../gtk/data/OutputEditorHOCR.ui.h:13 ../gtk/data/PdfExportDialog.ui.h:41 #: ../qt/data/PdfExportDialog.ui.h:2 ../qt/src/hocr/Ui_OutputEditorHOCR.hh:85 #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:86 msgid "Show preview" msgstr "顯示é è¦½" #: ../gtk/data/OutputEditorHOCR.ui.h:14 #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:121 msgid "Next (F3)" msgstr "下一個(F3)" #: ../gtk/data/OutputEditorHOCR.ui.h:15 #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:122 msgid "Previous (Shift+F3)" msgstr "上一個(Shift+F3)" #: ../gtk/data/OutputEditorHOCR.ui.h:16 ../gtk/src/hocr/OutputEditorHOCR.cc:890 #: ../qt/src/hocr/OutputEditorHOCR.cc:730 #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:126 msgid "Expand all" msgstr "éžè¿´å±•é–‹" #: ../gtk/data/OutputEditorHOCR.ui.h:17 ../gtk/src/hocr/OutputEditorHOCR.cc:893 #: ../qt/src/hocr/OutputEditorHOCR.cc:731 #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:127 msgid "Collapse all" msgstr "éžè¿´æŠ˜ç–Š" #: ../gtk/data/OutputEditorHOCR.ui.h:18 #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:148 msgid "Properties" msgstr "屬性" #: ../gtk/data/OutputEditorHOCR.ui.h:19 #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:152 msgid "Source" msgstr "來æº" #. Output insert mode #: ../gtk/data/OutputEditorText.ui.h:1 ../qt/src/Ui_OutputEditorText.hh:52 msgid "Append to current text" msgstr "é™„åŠ åˆ°ç¾æœ‰æ–‡å­—" #: ../gtk/data/OutputEditorText.ui.h:2 ../qt/src/Ui_OutputEditorText.hh:53 msgid "Insert at cursor" msgstr "於游標ä½ç½®æ’å…¥" #: ../gtk/data/OutputEditorText.ui.h:3 ../qt/src/Ui_OutputEditorText.hh:54 msgid "Replace current text" msgstr "å–ä»£ç¾æœ‰æ–‡å­—" #. Output postprocessing #: ../gtk/data/OutputEditorText.ui.h:4 ../qt/src/Ui_OutputEditorText.hh:62 msgid "Keep line break if..." msgstr "ä¿ç•™æ›è¡Œç¬¦è™Ÿï¼Œå¦‚果……" #: ../gtk/data/OutputEditorText.ui.h:5 ../qt/src/Ui_OutputEditorText.hh:64 msgid "Preceded by end mark (.?!)" msgstr "以終çµè™Ÿèµ·é¦–(.?!)" #: ../gtk/data/OutputEditorText.ui.h:6 ../qt/src/Ui_OutputEditorText.hh:66 msgid "Preceded or succeeded by quote" msgstr "以引號起首或çµå°¾" #: ../gtk/data/OutputEditorText.ui.h:7 ../qt/src/Ui_OutputEditorText.hh:68 msgid "Other options" msgstr "å…¶ä»–é¸é …" #: ../gtk/data/OutputEditorText.ui.h:8 ../qt/src/Ui_OutputEditorText.hh:70 msgid "Join hyphenated words" msgstr "連接斷字符號å‰å¾Œçš„å­—" #: ../gtk/data/OutputEditorText.ui.h:9 ../qt/src/Ui_OutputEditorText.hh:72 msgid "Collapse whitespace" msgstr "åˆä½µç©ºæ ¼" #: ../gtk/data/OutputEditorText.ui.h:10 ../qt/src/Ui_OutputEditorText.hh:74 msgid "Preserve paragraphs" msgstr "ä¿ç•™æ®µè½" #: ../gtk/data/OutputEditorText.ui.h:11 ../qt/src/Ui_OutputEditorText.hh:76 msgid "Visual aids" msgstr "視覺輔助" #: ../gtk/data/OutputEditorText.ui.h:12 ../qt/src/Ui_OutputEditorText.hh:78 msgid "Draw whitespace" msgstr "繪畫空格" #: ../gtk/data/OutputEditorText.ui.h:14 ../qt/src/Ui_OutputEditorText.hh:102 msgid "Strip line breaks on selected text" msgstr "去除é¸å–文字的æ›è¡Œç¬¦è™Ÿ" #: ../gtk/data/OutputEditorText.ui.h:16 ../qt/src/Ui_OutputEditorText.hh:109 #: ../qt/src/Ui_OutputEditorText.hh:110 msgid "Undo" msgstr "復原" #: ../gtk/data/OutputEditorText.ui.h:17 ../qt/src/Ui_OutputEditorText.hh:112 #: ../qt/src/Ui_OutputEditorText.hh:113 msgid "Redo" msgstr "é‡åš" #: ../gtk/data/PdfExportDialog.ui.h:1 ../qt/data/PdfExportDialog.ui.h:1 msgid "PDF Export" msgstr "匯出 PDF" #: ../gtk/data/PdfExportDialog.ui.h:4 ../qt/data/PdfExportDialog.ui.h:4 msgid "Output mode:" msgstr "輸出模å¼ï¼š" #: ../gtk/data/PdfExportDialog.ui.h:5 ../qt/data/PdfExportDialog.ui.h:6 msgid "PDF" msgstr "PDF" #: ../gtk/data/PdfExportDialog.ui.h:6 ../qt/data/PdfExportDialog.ui.h:7 msgid "PDF with invisible text overlay" msgstr "包å«éš±å½¢æ–‡å­—層的 PDF" #: ../gtk/data/PdfExportDialog.ui.h:7 ../qt/data/PdfExportDialog.ui.h:16 msgid "Format:" msgstr "æ ¼å¼ï¼š" #: ../gtk/data/PdfExportDialog.ui.h:8 ../qt/data/PdfExportDialog.ui.h:17 msgid "Compression:" msgstr "壓縮:" #: ../gtk/data/PdfExportDialog.ui.h:9 ../qt/data/PdfExportDialog.ui.h:14 msgid "Compression quality:" msgstr "壓縮å“質:" #: ../gtk/data/PdfExportDialog.ui.h:10 ../qt/data/PdfExportDialog.ui.h:15 msgid "DPI:" msgstr "DPI:" #: ../gtk/data/PdfExportDialog.ui.h:11 ../qt/data/PdfExportDialog.ui.h:18 msgid "Dithering algorithm:" msgstr "éžè‰²æ¼”算法:" #: ../gtk/data/PdfExportDialog.ui.h:12 ../qt/data/PdfExportDialog.ui.h:13 msgid "Image settings:" msgstr "圖åƒè¨­å®šï¼š" #: ../gtk/data/PdfExportDialog.ui.h:13 ../qt/data/PdfExportDialog.ui.h:25 msgid "Uniformize line and word spacing" msgstr "統一行è·åŠå­—è·" #: ../gtk/data/PdfExportDialog.ui.h:14 ../qt/data/PdfExportDialog.ui.h:21 msgid "Override font family:" msgstr "改寫字型:" #: ../gtk/data/PdfExportDialog.ui.h:15 ../qt/data/PdfExportDialog.ui.h:27 msgid "Fallback font family:" msgstr "後備字型:" #: ../gtk/data/PdfExportDialog.ui.h:16 ../qt/data/PdfExportDialog.ui.h:20 msgid "Override font size:" msgstr "改寫字型大å°ï¼š" #: ../gtk/data/PdfExportDialog.ui.h:17 ../qt/data/PdfExportDialog.ui.h:23 msgid "Font scaling:" msgstr "字型縮放:" #: ../gtk/data/PdfExportDialog.ui.h:18 ../qt/data/PdfExportDialog.ui.h:26 msgid "pt" msgstr "pt" #: ../gtk/data/PdfExportDialog.ui.h:19 ../qt/data/PdfExportDialog.ui.h:22 msgid "Preserve spaces wider than:" msgstr "ä¿ç•™ç©ºæ ¼å¤§æ–¼ï¼š" #: ../gtk/data/PdfExportDialog.ui.h:20 ../qt/data/PdfExportDialog.ui.h:24 msgid "characters" msgstr "å­—å…ƒ" #: ../gtk/data/PdfExportDialog.ui.h:21 ../qt/data/PdfExportDialog.ui.h:28 msgid "Sanitize hyphens before line breaks" msgstr "" #: ../gtk/data/PdfExportDialog.ui.h:22 ../qt/data/PdfExportDialog.ui.h:19 msgid "Text settings:" msgstr "文字檔設定:" #: ../gtk/data/PdfExportDialog.ui.h:23 ../qt/data/PdfExportDialog.ui.h:10 msgid "Paper size:" msgstr "紙張尺寸:" #: ../gtk/data/PdfExportDialog.ui.h:24 ../qt/data/PdfExportDialog.ui.h:11 msgid "Width" msgstr "闊度" #: ../gtk/data/PdfExportDialog.ui.h:25 ../qt/data/PdfExportDialog.ui.h:12 msgid "Height" msgstr "高度" #: ../gtk/data/PdfExportDialog.ui.h:26 ../qt/data/PdfExportDialog.ui.h:29 msgid "Treat image sources as having true DPI:" msgstr "" #: ../gtk/data/PdfExportDialog.ui.h:27 ../qt/data/PdfExportDialog.ui.h:3 msgid "Basic" msgstr "基本" #: ../gtk/data/PdfExportDialog.ui.h:28 ../qt/data/PdfExportDialog.ui.h:31 msgid "PDF version:" msgstr "PDF 版本:" #: ../gtk/data/PdfExportDialog.ui.h:29 ../qt/data/PdfExportDialog.ui.h:33 msgid "Password:" msgstr "密碼:" #: ../gtk/data/PdfExportDialog.ui.h:30 ../qt/data/PdfExportDialog.ui.h:34 msgid "Confirm password:" msgstr "確èªå¯†ç¢¼ï¼š" #: ../gtk/data/PdfExportDialog.ui.h:31 ../qt/data/PdfExportDialog.ui.h:32 msgid "Encryption (optional):" msgstr "åŠ å¯†ï¼ˆé¸æ“‡æ€§ï¼‰ï¼š" #: ../gtk/data/PdfExportDialog.ui.h:32 ../qt/data/PdfExportDialog.ui.h:36 msgid "Author:" msgstr "作者:" #: ../gtk/data/PdfExportDialog.ui.h:33 ../qt/data/PdfExportDialog.ui.h:38 msgid "Title:" msgstr "å稱:" #: ../gtk/data/PdfExportDialog.ui.h:34 ../qt/data/PdfExportDialog.ui.h:40 msgid "Subject:" msgstr "主題:" #: ../gtk/data/PdfExportDialog.ui.h:35 ../qt/data/PdfExportDialog.ui.h:37 msgid "Creator:" msgstr "創建者:" #: ../gtk/data/PdfExportDialog.ui.h:36 ../qt/data/PdfExportDialog.ui.h:39 msgid "Producer:" msgstr "發行者:" #: ../gtk/data/PdfExportDialog.ui.h:37 ../qt/data/PdfExportDialog.ui.h:41 msgid "Keywords:" msgstr "é—œéµå­—:" #: ../gtk/data/PdfExportDialog.ui.h:38 ../qt/data/PdfExportDialog.ui.h:35 msgid "Additional information (optional):" msgstr "附加的資訊(å¯é¸):" #: ../gtk/data/PdfExportDialog.ui.h:39 ../qt/data/PdfExportDialog.ui.h:42 msgid "Import from current source" msgstr "åŒ¯å…¥ç¾æœ‰ä¾†æº" #: ../gtk/data/PdfExportDialog.ui.h:40 ../qt/data/PdfExportDialog.ui.h:30 msgid "Advanced" msgstr "進階" #: ../gtk/data/SearchReplaceFrame.ui.h:1 ../qt/data/SearchReplaceFrame.ui.h:4 msgid "Find" msgstr "尋找" #: ../gtk/data/SearchReplaceFrame.ui.h:2 ../qt/data/SearchReplaceFrame.ui.h:2 msgid "Replace" msgstr "å–代" #: ../gtk/data/SearchReplaceFrame.ui.h:3 ../qt/data/SearchReplaceFrame.ui.h:3 msgid "Replace all" msgstr "全部å–代" #: ../gtk/data/SearchReplaceFrame.ui.h:4 ../qt/data/SearchReplaceFrame.ui.h:5 msgid "Find previous" msgstr "尋找å‰ä¸€å€‹" #: ../gtk/data/SearchReplaceFrame.ui.h:5 ../qt/data/SearchReplaceFrame.ui.h:6 msgid "Find next" msgstr "尋找下一個" #: ../gtk/data/SearchReplaceFrame.ui.h:6 ../qt/data/SearchReplaceFrame.ui.h:7 msgid "Match case" msgstr "大å°å¯«å»åˆ" #: ../gtk/data/SearchReplaceFrame.ui.h:7 #: ../gtk/data/SubstitutionsManager.ui.h:1 ../qt/data/SearchReplaceFrame.ui.h:1 #: ../qt/src/SubstitutionsManager.cc:36 msgid "Substitutions" msgstr "替æ›å€¼" #: ../gtk/data/SelectionMenu.ui.h:1 ../qt/src/DisplayerToolSelect.cc:239 msgid "Delete" msgstr "刪除" #: ../gtk/data/SelectionMenu.ui.h:2 ../qt/src/DisplayerToolSelect.cc:225 msgid "Order:" msgstr "排åºï¼š" #: ../gtk/data/SelectionMenu.ui.h:3 ../gtk/src/hocr/DisplayerToolHOCR.cc:29 #: ../qt/src/DisplayerToolSelect.cc:240 ../qt/src/hocr/DisplayerToolHOCR.cc:31 msgid "Recognize" msgstr "辨èª" #: ../gtk/data/SelectionMenu.ui.h:4 ../qt/src/DisplayerToolSelect.cc:241 msgid "Recognize to clipboard" msgstr "辨èªè‡³å‰ªè²¼ç°¿" #: ../gtk/data/SelectionMenu.ui.h:5 ../qt/src/DisplayerToolSelect.cc:242 msgid "Save as image" msgstr "儲存為圖åƒ" #: ../gtk/data/SubstitutionsManager.ui.h:2 ../qt/src/SubstitutionsManager.cc:38 #: ../qt/src/SubstitutionsManager.cc:39 msgid "Open" msgstr "開啟" #: ../gtk/data/SubstitutionsManager.ui.h:3 ../gtk/src/Utils.cc:73 #: ../qt/src/SubstitutionsManager.cc:41 ../qt/src/SubstitutionsManager.cc:42 msgid "Save" msgstr "儲存" #: ../gtk/data/SubstitutionsManager.ui.h:4 ../qt/src/SubstitutionsManager.cc:44 #: ../qt/src/SubstitutionsManager.cc:45 msgid "Clear" msgstr "清除" #: ../gtk/data/SubstitutionsManager.ui.h:5 ../qt/data/ConfigDialog.ui.h:16 #: ../qt/src/SubstitutionsManager.cc:47 ../qt/src/SubstitutionsManager.cc:48 msgid "Add" msgstr "新增" #: ../gtk/data/SubstitutionsManager.ui.h:6 #: ../gtk/src/hocr/OutputEditorHOCR.cc:886 ../qt/data/ConfigDialog.ui.h:17 #: ../qt/src/hocr/OutputEditorHOCR.cc:727 ../qt/src/SubstitutionsManager.cc:50 #: ../qt/src/SubstitutionsManager.cc:51 msgid "Remove" msgstr "刪除" #: ../gtk/data/SubstitutionsManager.ui.h:7 ../gtk/data/TessdataManager.ui.h:2 msgid "Apply" msgstr "應用" #: ../gtk/data/SubstitutionsManager.ui.h:8 ../gtk/data/TessdataManager.ui.h:3 msgid "Close" msgstr "關閉" #: ../gtk/data/TessdataManager.ui.h:1 ../qt/src/TessdataManager.cc:49 msgid "Tessdata Manager" msgstr "Tessdata 管ç†å“¡" #: ../gtk/data/TessdataManager.ui.h:5 ../qt/src/TessdataManager.cc:51 msgid "Manage installed languages:" msgstr "管ç†å·²å®‰è£çš„語言:" #: ../gtk/src/Acquirer.cc:79 ../qt/src/Acquirer.cc:70 msgid "scan.png" msgstr "scan.png" #: ../gtk/src/Acquirer.cc:91 ../qt/src/Acquirer.cc:85 msgid "Images" msgstr "圖åƒ" #: ../gtk/src/Acquirer.cc:92 ../qt/src/Acquirer.cc:86 msgid "Choose Output Filename..." msgstr "é¸å–輸出檔å……" #: ../gtk/src/Acquirer.cc:106 ../qt/src/Acquirer.cc:100 msgid "Failed to initialize the scanning backend." msgstr "無法åˆå§‹åŒ–æŽƒææœå‹™ã€‚" #: ../gtk/src/Acquirer.cc:115 ../qt/src/Acquirer.cc:106 msgid "Scan failed" msgstr "無法摺掃æ" #: ../gtk/src/Acquirer.cc:133 ../qt/src/Acquirer.cc:122 msgid "No scanners were detected." msgstr "嵿¸¬ä¸åˆ°æŽƒæå™¨ã€‚" #: ../gtk/src/Acquirer.cc:150 ../gtk/src/Acquirer.cc:168 #: ../qt/src/Acquirer.cc:136 ../qt/src/Acquirer.cc:154 msgid "Starting scan..." msgstr "開始掃æâ€¦â€¦" #: ../gtk/src/Acquirer.cc:164 ../qt/src/Acquirer.cc:150 msgid "Opening device..." msgstr "開啟è£ç½®â€¦â€¦" #: ../gtk/src/Acquirer.cc:166 ../qt/src/Acquirer.cc:152 msgid "Setting options..." msgstr "設定é¸é ………" #: ../gtk/src/Acquirer.cc:170 ../qt/src/Acquirer.cc:156 msgid "Getting parameters..." msgstr "ç²å–åƒæ•¸â€¦â€¦" #: ../gtk/src/Acquirer.cc:172 ../qt/src/Acquirer.cc:158 msgid "Transferring data..." msgstr "轉輸數據……" #: ../gtk/src/Acquirer.cc:179 ../qt/src/Acquirer.cc:165 msgid "Canceling scan..." msgstr "å–æ¶ˆæŽƒæâ€¦â€¦" #: ../gtk/src/Config.cc:49 ../qt/data/ConfigDialog.ui.h:7 msgid "Filename prefix" msgstr "檔åå‰ç½®" #: ../gtk/src/Config.cc:50 ../qt/data/ConfigDialog.ui.h:8 msgid "Code" msgstr "代碼" #: ../gtk/src/Config.cc:51 ../qt/data/ConfigDialog.ui.h:9 msgid "Native name" msgstr "原生å稱" #: ../gtk/src/Config.cc:109 ../qt/src/Config.cc:108 msgid "Script" msgstr "腳本" #: ../gtk/src/CrashHandler.cc:25 ../gtk/src/CrashHandler.cc:41 #: ../qt/src/CrashHandler.cc:36 msgid "Crash Handler" msgstr "異常終止處ç†å™¨" #: ../gtk/src/CrashHandler.cc:43 ../qt/src/CrashHandler.cc:31 msgid "Your work has been saved under %1." msgstr "你的工作已儲存於 %1。" #: ../gtk/src/CrashHandler.cc:45 ../qt/src/CrashHandler.cc:33 msgid "There was no unsaved work." msgstr "沒有未儲存的工作。" #: ../gtk/src/CrashHandler.cc:106 ../qt/src/CrashHandler.cc:62 msgid "Failed to obtain backtrace. Is gdb installed?" msgstr "無法å–å¾— backtraceã€‚å·²å®‰è£ gdb 嗎?" #: ../gtk/src/Displayer.cc:232 ../qt/src/Displayer.cc:174 msgid "Failed to load image" msgstr "無法載入圖åƒ" #: ../gtk/src/Displayer.cc:232 ../qt/src/Displayer.cc:174 msgid "" "The file might not be an image or be corrupt:\n" "%1" msgstr "" "該檔案å¯èƒ½ä¸æ˜¯åœ–åƒæˆ–已被æå£žï¼š\n" "%1" #: ../gtk/src/DisplayerToolSelect.cc:138 ../qt/src/DisplayerToolSelect.cc:135 msgid "PNG Images" msgstr "PNG 圖åƒ" #: ../gtk/src/DisplayerToolSelect.cc:139 ../qt/src/DisplayerToolSelect.cc:135 msgid "Save Selection Image" msgstr "儲存é¸å–圖åƒ" #: ../gtk/src/DisplayerToolSelect.cc:139 ../qt/src/DisplayerToolSelect.cc:135 msgid "selection.png" msgstr "selection.png" #: ../gtk/src/DisplayerToolSelect.cc:146 ../qt/src/DisplayerToolSelect.cc:142 msgid "Recognize all" msgstr "辨èªå…¨éƒ¨" #: ../gtk/src/DisplayerToolSelect.cc:146 ../qt/src/DisplayerToolSelect.cc:142 msgid "Recognize selection" msgstr "辨èªé¸å–å€" #: ../gtk/src/DisplayerToolSelect.cc:186 ../qt/src/DisplayerToolSelect.cc:182 msgid "Performing layout analysis" msgstr "進行佈局分æž" #: ../gtk/src/FileDialogs.cc:235 msgid "" "A file named \"%1\" already exists. Are you sure you want to overwrite it?" msgstr "å為 \"%1\" çš„æª”æ¡ˆå·²å­˜åœ¨ã€‚ä½ ç¢ºå®šè¦æ”¹å¯«å®ƒï¼Ÿ" #: ../gtk/src/FileDialogs.cc:237 msgid "Overwrite File?" msgstr "改寫檔案?" #: ../gtk/src/hocr/HOCRDocument.cc:611 ../gtk/src/hocr/OutputEditorHOCR.cc:266 #: ../qt/src/hocr/OutputEditorHOCR.cc:229 msgid "Page" msgstr "é é¢" #: ../gtk/src/hocr/HOCRDocument.cc:613 ../qt/src/hocr/HOCRDocument.cc:530 msgid "Text block" msgstr "文字å€å¡Š" #: ../gtk/src/hocr/HOCRDocument.cc:615 ../gtk/src/hocr/OutputEditorHOCR.cc:272 #: ../qt/src/hocr/HOCRDocument.cc:532 ../qt/src/hocr/OutputEditorHOCR.cc:231 msgid "Paragraph" msgstr "段è½" #: ../gtk/src/hocr/HOCRDocument.cc:617 ../qt/src/hocr/HOCRDocument.cc:534 msgid "Textline" msgstr "文字" #: ../gtk/src/hocr/HOCRDocument.cc:621 ../qt/src/hocr/HOCRDocument.cc:538 msgid "Graphic" msgstr "圖åƒ" #: ../gtk/src/hocr/HOCROdtExporter.cc:65 ../gtk/src/hocr/HOCRPdfExporter.cc:489 #: ../gtk/src/hocr/HOCRTextExporter.cc:34 #: ../gtk/src/hocr/OutputEditorHOCR.cc:963 ../gtk/src/OutputEditorText.cc:272 #: ../qt/src/hocr/HOCROdtExporter.cc:50 ../qt/src/hocr/HOCRPdfExporter.cc:478 #: ../qt/src/hocr/HOCRTextExporter.cc:36 ../qt/src/hocr/OutputEditorHOCR.cc:830 #: ../qt/src/OutputEditorText.cc:238 msgid "output" msgstr "輸出" #: ../gtk/src/hocr/HOCROdtExporter.cc:68 ../qt/src/hocr/HOCROdtExporter.cc:53 msgid "OpenDocument Text Documents" msgstr "OpenDocument 文件檔" #: ../gtk/src/hocr/HOCROdtExporter.cc:69 ../qt/src/hocr/HOCROdtExporter.cc:53 msgid "Save ODT Output..." msgstr "儲存 ODT 輸出..." #: ../gtk/src/hocr/HOCROdtExporter.cc:77 ../gtk/src/hocr/HOCROdtExporter.cc:342 #: ../gtk/src/hocr/HOCRPdfExporter.cc:619 #: ../gtk/src/hocr/HOCRTextExporter.cc:46 ../qt/src/hocr/HOCROdtExporter.cc:61 #: ../qt/src/hocr/HOCRPdfExporter.cc:609 ../qt/src/hocr/HOCRTextExporter.cc:47 msgid "Export failed" msgstr "無法匯出" #: ../gtk/src/hocr/HOCROdtExporter.cc:77 ../gtk/src/hocr/HOCROdtExporter.cc:342 #: ../qt/src/hocr/HOCROdtExporter.cc:61 msgid "The ODT export failed: unable to write output file." msgstr "無法匯出 ODT:無法建立輸出檔。" #: ../gtk/src/hocr/HOCROdtExporter.cc:336 ../qt/src/hocr/HOCROdtExporter.cc:254 msgid "Exporting to ODT..." msgstr "匯出至 ODT..." #: ../gtk/src/hocr/HOCRPdfExporter.cc:283 ../qt/src/hocr/HOCRPdfExporter.cc:365 msgid "Same as source" msgstr "與來æºç›¸åŒ" #: ../gtk/src/hocr/HOCRPdfExporter.cc:286 ../qt/src/hocr/HOCRPdfExporter.cc:366 msgid "Custom" msgstr "自訂" #: ../gtk/src/hocr/HOCRPdfExporter.cc:300 ../qt/src/hocr/HOCRPdfExporter.cc:362 msgid "cm" msgstr "公分" #: ../gtk/src/hocr/HOCRPdfExporter.cc:303 ../qt/src/hocr/HOCRPdfExporter.cc:363 msgid "in" msgstr "在" #: ../gtk/src/hocr/HOCRPdfExporter.cc:319 ../qt/src/hocr/HOCRPdfExporter.cc:353 msgid "Monochrome" msgstr "黑白" #: ../gtk/src/hocr/HOCRPdfExporter.cc:328 ../qt/src/hocr/HOCRPdfExporter.cc:355 msgid "Threshold (closest color)" msgstr "定é™ï¼ˆæœ€æŽ¥è¿‘é¡è‰²ï¼‰" #: ../gtk/src/hocr/HOCRPdfExporter.cc:331 ../qt/src/hocr/HOCRPdfExporter.cc:356 msgid "Diffuse" msgstr "æ“´æ•£" #: ../gtk/src/hocr/HOCRPdfExporter.cc:340 ../qt/src/hocr/HOCRPdfExporter.cc:357 msgid "Zip (lossless)" msgstr "Zip(無æï¼‰" #: ../gtk/src/hocr/HOCRPdfExporter.cc:344 ../qt/src/hocr/HOCRPdfExporter.cc:358 msgid "CCITT Group 4 (lossless)" msgstr "CCITT 第 4 組(無æï¼‰" #: ../gtk/src/hocr/HOCRPdfExporter.cc:348 ../qt/src/hocr/HOCRPdfExporter.cc:359 msgid "Jpeg (lossy)" msgstr "Jpeg(失真)" #: ../gtk/src/hocr/HOCRPdfExporter.cc:493 ../qt/src/hocr/HOCRPdfExporter.cc:482 msgid "PDF Files" msgstr "PDF 檔" #: ../gtk/src/hocr/HOCRPdfExporter.cc:494 ../qt/src/hocr/HOCRPdfExporter.cc:482 msgid "Save PDF Output..." msgstr "儲存 PDF 輸出……" #: ../gtk/src/hocr/HOCRPdfExporter.cc:500 ../qt/src/hocr/HOCRPdfExporter.cc:488 msgid "Invalid Output" msgstr "無效輸出" #: ../gtk/src/hocr/HOCRPdfExporter.cc:500 ../qt/src/hocr/HOCRPdfExporter.cc:488 msgid "Cannot overwrite a file which is a source image of this document." msgstr "無法改寫此文件的來æºåœ–åƒæª”。" #: ../gtk/src/hocr/HOCRPdfExporter.cc:516 ../qt/src/hocr/HOCRPdfExporter.cc:511 msgid "Failed to create output" msgstr "無法建立輸出" #: ../gtk/src/hocr/HOCRPdfExporter.cc:516 ../qt/src/hocr/HOCRPdfExporter.cc:511 msgid "Failed to create output. The returned error was: %1" msgstr "無法建立輸出。傳回錯誤:%1" #: ../gtk/src/hocr/HOCRPdfExporter.cc:558 ../qt/src/hocr/HOCRPdfExporter.cc:551 msgid "The operation was cancelled" msgstr "已喿¶ˆæ“作" #: ../gtk/src/hocr/HOCRPdfExporter.cc:607 ../qt/src/hocr/HOCRPdfExporter.cc:597 msgid "Failed to render page %1" msgstr "無法繪畫第 %1 é " #: ../gtk/src/hocr/HOCRPdfExporter.cc:614 ../qt/src/hocr/HOCRPdfExporter.cc:604 msgid "Exporting to PDF..." msgstr "匯出至 PDF..." #: ../gtk/src/hocr/HOCRPdfExporter.cc:619 ../qt/src/hocr/HOCRPdfExporter.cc:609 msgid "The PDF export failed: %1." msgstr "無法匯出 PDF:%1。" #: ../gtk/src/hocr/HOCRPdfExporter.cc:673 ../qt/src/hocr/HOCRPdfExporter.cc:662 msgid "The PDF library could not load the font '%1'." msgstr "PDF 程å¼åº«ä¸æ”¯æ´æ‰€é¸å–å­—åž‹ '%1'。" #: ../gtk/src/hocr/HOCRTextExporter.cc:37 ../gtk/src/OutputEditorText.cc:274 #: ../qt/src/hocr/HOCRTextExporter.cc:39 ../qt/src/OutputEditorText.cc:239 msgid "Text Files" msgstr "文字檔" #: ../gtk/src/hocr/HOCRTextExporter.cc:38 ../qt/src/hocr/HOCRTextExporter.cc:39 msgid "Save Text Output..." msgstr "儲存文字輸出..." #: ../gtk/src/hocr/HOCRTextExporter.cc:46 ../qt/src/hocr/HOCRTextExporter.cc:47 msgid "The text export failed: unable to write output file." msgstr "無法匯出文字檔:無法建立輸出檔。" #: ../gtk/src/hocr/OutputEditorHOCR.cc:269 #: ../qt/src/hocr/OutputEditorHOCR.cc:230 msgid "Block" msgstr "å€å¡Š" #: ../gtk/src/hocr/OutputEditorHOCR.cc:275 #: ../qt/src/hocr/OutputEditorHOCR.cc:232 msgid "Line" msgstr "ç·šæ¢" #: ../gtk/src/hocr/OutputEditorHOCR.cc:278 #: ../qt/src/hocr/OutputEditorHOCR.cc:233 msgid "Word" msgstr "單字" #: ../gtk/src/hocr/OutputEditorHOCR.cc:281 #: ../qt/src/hocr/OutputEditorHOCR.cc:234 msgid "Misspelled word" msgstr "錯拼字詞" #: ../gtk/src/hocr/OutputEditorHOCR.cc:435 #: ../qt/src/hocr/OutputEditorHOCR.cc:317 msgid "" "The following pages could not be processed:\n" "%1" msgstr "" "無法處ç†ä¸‹åˆ—é é¢ï¼š\n" "%1" #: ../gtk/src/hocr/OutputEditorHOCR.cc:436 #: ../qt/src/hocr/OutputEditorHOCR.cc:318 msgid "Recognition errors" msgstr "è¾¨èªæ™‚出ç¾éŒ¯èª¤" #: ../gtk/src/hocr/OutputEditorHOCR.cc:594 #: ../qt/src/hocr/OutputEditorHOCR.cc:500 #: ../qt/src/hocr/OutputEditorHOCR.cc:512 msgid "Multiple values" msgstr "多個數值" #. Merging allowed #: ../gtk/src/hocr/OutputEditorHOCR.cc:778 #: ../qt/src/hocr/OutputEditorHOCR.cc:641 msgid "Merge" msgstr "åˆä½µ" #: ../gtk/src/hocr/OutputEditorHOCR.cc:786 #: ../gtk/src/hocr/OutputEditorHOCR.cc:877 #: ../qt/src/hocr/OutputEditorHOCR.cc:643 #: ../qt/src/hocr/OutputEditorHOCR.cc:725 msgid "Split from parent" msgstr "從上層分拆出來" #. Swapping allowed #: ../gtk/src/hocr/OutputEditorHOCR.cc:797 #: ../qt/src/hocr/OutputEditorHOCR.cc:647 msgid "Swap" msgstr "å°æ›" #: ../gtk/src/hocr/OutputEditorHOCR.cc:821 #: ../qt/src/hocr/OutputEditorHOCR.cc:693 msgid "Add graphic region" msgstr "新增圖åƒå€åŸŸ" #: ../gtk/src/hocr/OutputEditorHOCR.cc:824 #: ../qt/src/hocr/OutputEditorHOCR.cc:694 msgid "Add text block" msgstr "新增文字å€å¡Š" #: ../gtk/src/hocr/OutputEditorHOCR.cc:828 #: ../qt/src/hocr/OutputEditorHOCR.cc:696 msgid "Add paragraph" msgstr "新增段è½" #: ../gtk/src/hocr/OutputEditorHOCR.cc:832 #: ../qt/src/hocr/OutputEditorHOCR.cc:698 msgid "Add line" msgstr "新增線æ¢" #: ../gtk/src/hocr/OutputEditorHOCR.cc:836 #: ../qt/src/hocr/OutputEditorHOCR.cc:700 msgid "Add word" msgstr "新增字詞" #: ../gtk/src/hocr/OutputEditorHOCR.cc:852 #: ../qt/src/hocr/OutputEditorHOCR.cc:710 msgid "No suggestions" msgstr "沒有建議" #: ../gtk/src/hocr/OutputEditorHOCR.cc:858 #: ../qt/src/hocr/OutputEditorHOCR.cc:714 msgid "Add to dictionary" msgstr "新增至詞典" #: ../gtk/src/hocr/OutputEditorHOCR.cc:864 #: ../qt/src/hocr/OutputEditorHOCR.cc:716 msgid "Ignore word" msgstr "忽略字詞" #: ../gtk/src/hocr/OutputEditorHOCR.cc:926 #: ../gtk/src/hocr/OutputEditorHOCR.cc:965 #: ../qt/src/hocr/OutputEditorHOCR.cc:795 #: ../qt/src/hocr/OutputEditorHOCR.cc:832 msgid "hOCR HTML Files" msgstr "hOCR HTML 檔" #: ../gtk/src/hocr/OutputEditorHOCR.cc:927 #: ../qt/src/hocr/OutputEditorHOCR.cc:795 msgid "Open hOCR File" msgstr "開啟 hOCR 檔" #: ../gtk/src/hocr/OutputEditorHOCR.cc:936 #: ../qt/src/hocr/OutputEditorHOCR.cc:802 msgid "Failed to open file" msgstr "無法開啟檔案" #: ../gtk/src/hocr/OutputEditorHOCR.cc:936 #: ../qt/src/hocr/OutputEditorHOCR.cc:802 msgid "The file could not be opened: %1." msgstr "無法開啟檔案:%1。" #: ../gtk/src/hocr/OutputEditorHOCR.cc:945 #: ../qt/src/hocr/OutputEditorHOCR.cc:809 msgid "Invalid hOCR file" msgstr "無效的 hOCR 檔" #: ../gtk/src/hocr/OutputEditorHOCR.cc:945 #: ../qt/src/hocr/OutputEditorHOCR.cc:809 msgid "The file does not appear to contain valid hOCR HTML: %1" msgstr "此檔案似乎並ä¸åŒ…嫿œ‰æ•ˆçš„ hOCR HTML:%1" #: ../gtk/src/hocr/OutputEditorHOCR.cc:966 #: ../qt/src/hocr/OutputEditorHOCR.cc:832 msgid "Save hOCR Output..." msgstr "儲存 hOCR 輸出……" #: ../gtk/src/hocr/OutputEditorHOCR.cc:973 ../gtk/src/OutputEditorText.cc:282 #: ../qt/src/hocr/OutputEditorHOCR.cc:839 ../qt/src/OutputEditorText.cc:246 msgid "Failed to save output" msgstr "無法儲存輸出" #: ../gtk/src/hocr/OutputEditorHOCR.cc:973 ../gtk/src/OutputEditorText.cc:282 #: ../qt/src/hocr/OutputEditorHOCR.cc:839 ../qt/src/OutputEditorText.cc:246 msgid "Check that you have writing permissions in the selected folder." msgstr "請檢查你在所é¸å–è³‡æ–™å¤¾æ“æœ‰å¯«å…¥æ¬Šé™ã€‚" #: ../gtk/src/hocr/OutputEditorHOCR.cc:1035 ../gtk/src/OutputEditorText.cc:296 #: ../qt/src/hocr/OutputEditorHOCR.cc:894 ../qt/src/OutputEditorText.cc:259 msgid "Output not saved" msgstr "未儲存輸出" #: ../gtk/src/hocr/OutputEditorHOCR.cc:1035 ../gtk/src/OutputEditorText.cc:296 #: ../qt/src/hocr/OutputEditorHOCR.cc:894 ../qt/src/OutputEditorText.cc:259 msgid "Save output before proceeding?" msgstr "先儲存輸出å†ç¹¼çºŒï¼Ÿ" #: ../gtk/src/hocr/OutputEditorHOCR.cc:1156 ../gtk/src/OutputEditorText.cc:184 #: ../qt/src/hocr/OutputEditorHOCR.cc:991 ../qt/src/OutputEditorText.cc:152 msgid "Replacing..." msgstr "å–代中……" #: ../gtk/src/hocr/OutputEditorHOCR.cc:1181 ../gtk/src/OutputEditorText.cc:192 #: ../qt/src/hocr/OutputEditorHOCR.cc:1014 ../qt/src/OutputEditorText.cc:160 msgid "Applying substitutions..." msgstr "正在套用替æ›å€¼â€¦â€¦" #: ../gtk/src/MainWindow.cc:131 ../qt/src/MainWindow.cc:295 msgid "Using tesseract" msgstr "採用 tesseract" #: ../gtk/src/MainWindow.cc:178 ../qt/src/MainWindow.cc:194 msgid "Select an image to begin..." msgstr "è«‹é¸å–圖åƒä½œç‚ºé–‹å§‹â€¦â€¦" #: ../gtk/src/MainWindow.cc:293 ../qt/src/MainWindow.cc:278 msgid "Multiple sources" msgstr "多個來æº" #: ../gtk/src/MainWindow.cc:295 ../qt/src/MainWindow.cc:280 msgid "Ready" msgstr "就緒" #: ../gtk/src/MainWindow.cc:442 ../qt/src/MainWindow.cc:423 msgid "New version" msgstr "新版本" #: ../gtk/src/MainWindow.cc:442 ../qt/src/MainWindow.cc:423 msgid "gImageReader %1 is available" msgstr "gImageReader %1 å·²é¢ä¸–" #: ../gtk/src/MainWindow.cc:443 ../qt/src/MainWindow.cc:424 msgid "Download" msgstr "下載" #: ../gtk/src/MainWindow.cc:444 ../qt/src/MainWindow.cc:425 msgid "Changelog" msgstr "修改日誌" #: ../gtk/src/MainWindow.cc:445 ../qt/src/MainWindow.cc:426 msgid "Don't notify again" msgstr "ä¸å†æç¤º" #: ../gtk/src/MainWindow.cc:466 ../qt/src/MainWindow.cc:474 msgid "Don't show again" msgstr "ä¸å†é¡¯ç¤º" #: ../gtk/src/MainWindow.cc:467 ../gtk/src/MainWindow.cc:480 #: ../qt/src/MainWindow.cc:475 msgid "Install" msgstr "安è£" #: ../gtk/src/MainWindow.cc:487 ../qt/src/MainWindow.cc:487 msgid "Spelling dictionary missing" msgstr "éºæ¼æ‹¼å­—詞典" #: ../gtk/src/MainWindow.cc:487 ../qt/src/MainWindow.cc:487 msgid "The spellcheck dictionary for %1 is not installed" msgstr "æœªå®‰è£ %1 的拼字詞典" #: ../gtk/src/MainWindow.cc:494 ../gtk/src/MainWindow.cc:523 #: ../qt/src/MainWindow.cc:493 msgid "Installing spelling dictionary for '%1'" msgstr "æ­£åœ¨å®‰è£ '%1' 的拼字詞典" #: ../gtk/src/MainWindow.cc:515 ../gtk/src/MainWindow.cc:536 #: ../gtk/src/MainWindow.cc:544 ../gtk/src/MainWindow.cc:592 #: ../gtk/src/MainWindow.cc:597 ../gtk/src/TessdataManager.cc:60 #: ../gtk/src/TessdataManager.cc:70 ../gtk/src/TessdataManager.cc:339 #: ../qt/src/MainWindow.cc:512 ../qt/src/MainWindow.cc:525 #: ../qt/src/MainWindow.cc:534 ../qt/src/MainWindow.cc:578 #: ../qt/src/MainWindow.cc:583 ../qt/src/TessdataManager.cc:74 #: ../qt/src/TessdataManager.cc:84 ../qt/src/TessdataManager.cc:315 msgid "Error" msgstr "錯誤" #: ../gtk/src/MainWindow.cc:515 ../qt/src/MainWindow.cc:512 msgid "Failed to install spelling dictionary: %1" msgstr "ç„¡æ³•å®‰è£æ‹¼å­—詞典:%1" #: ../gtk/src/MainWindow.cc:536 ../qt/src/MainWindow.cc:525 msgid "Failed to create directory for spelling dictionaries." msgstr "無法建立拼字詞典目錄。" #: ../gtk/src/MainWindow.cc:544 ../qt/src/MainWindow.cc:534 msgid "Could not read %1: %2." msgstr "ç„¡æ³•è®€å– %1:%2。" #: ../gtk/src/MainWindow.cc:571 ../qt/src/MainWindow.cc:558 msgid "Downloading '%1'..." msgstr "正在下載 '%1'……" #: ../gtk/src/MainWindow.cc:592 ../qt/src/MainWindow.cc:578 msgid "" "The following dictionaries could not be downloaded:\n" "%1\n" "\n" "Check the connectivity and directory permissions.\n" "Hint: If you don't have write permissions in system folders, you can switch " "to user paths in the settings dialog." msgstr "" "無法下載或刪除下列詞典:\n" "%1\n" "\n" "請檢查連線åŠç›®éŒ„權é™ã€‚\n" "æç¤ºï¼šå¦‚果您在系統資料夾中沒有寫入權é™ï¼Œæ‚¨å¯ä»¥åœ¨è¨­å®šå°è©±æ–¹å¡Šä¸­åˆ‡æ›åˆ°ä½¿ç”¨è€…è·¯" "徑。" #: ../gtk/src/MainWindow.cc:595 ../qt/src/MainWindow.cc:581 msgid "Dictionaries installed" msgstr "已安è£è©žå…¸" #: ../gtk/src/MainWindow.cc:595 msgid "" "The following dictionaries were installed:\n" "%1" msgstr "" "已安è£ä¸‹åˆ—詞典:\n" "%1" #: ../gtk/src/MainWindow.cc:597 ../qt/src/MainWindow.cc:583 msgid "No spelling dictionaries found for '%1'." msgstr "找ä¸åˆ° '%1' 的拼字詞典。" #: ../gtk/src/OutputEditorText.cc:154 ../qt/src/OutputEditorText.cc:137 msgid "Stripping line breaks..." msgstr "去除æ›è¡Œç¬¦è™Ÿâ€¦â€¦" #: ../gtk/src/OutputEditorText.cc:162 msgid "Check spelling" msgstr "檢查拼字" #: ../gtk/src/OutputEditorText.cc:231 ../qt/src/OutputEditorText.cc:196 msgid "File: %1" msgstr "檔案:%1" #: ../gtk/src/OutputEditorText.cc:234 ../qt/src/OutputEditorText.cc:199 msgid "Page: %1" msgstr "é é¢ï¼š%1" #: ../gtk/src/OutputEditorText.cc:247 ../gtk/src/Recognizer.cc:471 #: ../qt/src/Recognizer.cc:462 msgid "" "\n" "[Failed to recognize page %1]\n" msgstr "" "\n" "[無法辨èªç¬¬ %1 é ]\n" #: ../gtk/src/OutputEditorText.cc:275 ../qt/src/OutputEditorText.cc:239 msgid "Save Output..." msgstr "儲存輸出……" #: ../gtk/src/Recognizer.cc:179 ../qt/src/Recognizer.cc:172 msgid "No languages available" msgstr "沒有å¯ç”¨èªžè¨€" #: ../gtk/src/Recognizer.cc:179 ../qt/src/Recognizer.cc:172 msgid "" "No tesseract languages are available for use. Recognition will not work." msgstr "沒有å¯ç”¨çš„ tesseract 語言。辨èªå°‡æœƒå¤±æ•—。" #: ../gtk/src/Recognizer.cc:233 ../qt/src/Recognizer.cc:232 msgid "Multilingual" msgstr "多語言" #: ../gtk/src/Recognizer.cc:285 ../qt/src/Recognizer.cc:277 msgid "Automatic page segmentation" msgstr "自動分割é é¢" #: ../gtk/src/Recognizer.cc:286 ../qt/src/Recognizer.cc:278 msgid "Page segmentation with orientation and script detection" msgstr "分割é é¢ä¸¦åµæ¸¬æ–¹å‘åŠæ–‡å­—" #: ../gtk/src/Recognizer.cc:287 ../qt/src/Recognizer.cc:279 msgid "Assume single column of text" msgstr "å‡è¨­åªæœ‰ä¸€æ¬„文字" #: ../gtk/src/Recognizer.cc:288 ../qt/src/Recognizer.cc:280 msgid "Assume single block of vertically aligned text" msgstr "å‡è¨­åªæœ‰ä¸€æ®µåž‚ç›´å°æ•´çš„æ–‡å­—" #: ../gtk/src/Recognizer.cc:289 ../qt/src/Recognizer.cc:281 msgid "Assume a single uniform block of text" msgstr "å‡è¨­åªæœ‰ä¸€æ®µå‡å‹»çš„æ–‡å­—" #: ../gtk/src/Recognizer.cc:290 ../qt/src/Recognizer.cc:282 msgid "Assume a line of text" msgstr "å‡è¨­åªæœ‰ä¸€è¡Œæ–‡å­—" #: ../gtk/src/Recognizer.cc:291 ../qt/src/Recognizer.cc:283 msgid "Assume a single word" msgstr "å‡è¨­åªæœ‰ä¸€å€‹å­—" #: ../gtk/src/Recognizer.cc:292 ../qt/src/Recognizer.cc:284 msgid "Assume a single word in a circle" msgstr "å‡è¨­æ˜¯åœ“圈內的一個字" #: ../gtk/src/Recognizer.cc:293 ../qt/src/Recognizer.cc:285 msgid "Sparse text in no particular order" msgstr "沒有特定次åºçš„ç¨€ç–æ–‡å­—" #: ../gtk/src/Recognizer.cc:294 ../qt/src/Recognizer.cc:286 msgid "Sparse text with orientation and script detection" msgstr "嵿¸¬ç¨€ç–文字的方å‘åŠæ–‡å­—" #: ../gtk/src/Recognizer.cc:309 ../qt/src/Recognizer.cc:297 msgid "Page segmentation mode" msgstr "分割é é¢æ¨¡å¼" #: ../gtk/src/Recognizer.cc:313 ../qt/src/Recognizer.cc:300 msgid "Character whitelist / blacklist..." msgstr "" #: ../gtk/src/Recognizer.cc:319 ../qt/src/Recognizer.cc:305 msgid "Manage languages..." msgstr "管ç†èªžè¨€â€¦â€¦" #: ../gtk/src/Recognizer.cc:375 ../qt/src/Recognizer.cc:369 msgid "Current selection" msgstr "ç¾æœ‰é¸å–å€" #: ../gtk/src/Recognizer.cc:465 ../qt/src/Recognizer.cc:455 msgid "Recognizing page %1 (%2 of %3)" msgstr "辨èªç¬¬ %1 é ï¼ˆ%3 之 %2)" #: ../gtk/src/Recognizer.cc:470 ../qt/src/Recognizer.cc:461 msgid "" "\n" "- Page %1: failed to render page" msgstr "" "\n" "- 第 %1 é ï¼šç„¡æ³•繪畫é é¢" #: ../gtk/src/Recognizer.cc:501 ../gtk/src/Recognizer.cc:531 #: ../gtk/src/Recognizer.cc:544 ../qt/src/Recognizer.cc:491 #: ../qt/src/Recognizer.cc:521 ../qt/src/Recognizer.cc:534 msgid "Recognizing..." msgstr "辨èªä¸­â€¦â€¦" #: ../gtk/src/Recognizer.cc:505 ../gtk/src/Recognizer.cc:514 #: ../qt/src/Recognizer.cc:495 ../qt/src/Recognizer.cc:504 msgid "Recognition errors occurred" msgstr "è¾¨èªæ™‚出ç¾éŒ¯èª¤" #: ../gtk/src/Recognizer.cc:505 ../qt/src/Recognizer.cc:495 msgid "The following errors occurred:%1" msgstr "出ç¾ä¸‹åˆ—錯誤:%1" #: ../gtk/src/Recognizer.cc:514 ../qt/src/Recognizer.cc:504 msgid "Failed to initialize tesseract" msgstr "無法åˆå§‹åŒ– tesseract" #: ../gtk/src/scanner/ScannerSane.cc:84 ../gtk/src/scanner/ScannerTwain.cc:288 #: ../qt/src/scanner/ScannerSane.cc:85 ../qt/src/scanner/ScannerTwain.cc:286 msgid "Scan canceled" msgstr "已喿¶ˆæŽƒæ" #: ../gtk/src/scanner/ScannerSane.cc:159 ../gtk/src/scanner/ScannerTwain.cc:186 #: ../qt/src/scanner/ScannerSane.cc:159 ../qt/src/scanner/ScannerTwain.cc:178 msgid "No scanner specified" msgstr "未指定掃æå™¨" #: ../gtk/src/scanner/ScannerSane.cc:168 ../gtk/src/scanner/ScannerTwain.cc:195 #: ../qt/src/scanner/ScannerSane.cc:168 ../qt/src/scanner/ScannerTwain.cc:187 msgid "Unable to connect to scanner" msgstr "無法連線至掃æå™¨" #: ../gtk/src/scanner/ScannerSane.cc:403 ../gtk/src/scanner/ScannerTwain.cc:266 #: ../gtk/src/scanner/ScannerTwain.cc:292 ../qt/src/scanner/ScannerSane.cc:403 #: ../qt/src/scanner/ScannerTwain.cc:258 ../qt/src/scanner/ScannerTwain.cc:290 msgid "Unable to start scan" msgstr "無法開始掃æ" #: ../gtk/src/scanner/ScannerSane.cc:411 ../gtk/src/scanner/ScannerSane.cc:461 #: ../gtk/src/scanner/ScannerTwain.cc:318 ../qt/src/scanner/ScannerSane.cc:411 #: ../qt/src/scanner/ScannerSane.cc:461 ../qt/src/scanner/ScannerTwain.cc:316 msgid "Error communicating with scanner" msgstr "與掃æå™¨æºé€šå‡ºç¾éŒ¯èª¤" #: ../gtk/src/scanner/ScannerSane.cc:520 ../qt/src/scanner/ScannerSane.cc:517 msgid "Failed to save image" msgstr "無法儲存圖åƒ" #: ../gtk/src/scanner/ScannerSane.cc:800 ../qt/src/scanner/ScannerSane.cc:797 msgid "Operation is cancelled." msgstr "已喿¶ˆæ“作。" #: ../gtk/src/scanner/ScannerSane.cc:802 ../qt/src/scanner/ScannerSane.cc:799 msgid "Device is busy." msgstr "è£ç½®ç¾æ­£ç¹å¿™ã€‚" #: ../gtk/src/scanner/ScannerSane.cc:804 ../qt/src/scanner/ScannerSane.cc:801 msgid "Cover is opened." msgstr "機蓋已打開。" #: ../gtk/src/scanner/ScannerSane.cc:806 ../qt/src/scanner/ScannerSane.cc:803 msgid "Document feeder jammed." msgstr "進紙器å¡ç´™ã€‚" #: ../gtk/src/scanner/ScannerSane.cc:808 ../qt/src/scanner/ScannerSane.cc:805 msgid "Document feeder out of documents." msgstr "進紙器缺文件。" #: ../gtk/src/scanner/ScannerSane.cc:810 ../qt/src/scanner/ScannerSane.cc:807 msgid "Access to scanner is denied." msgstr "å­˜å–æŽƒæå™¨è¢«æ‹’絕。" #: ../gtk/src/SourceManager.cc:118 ../qt/src/SourceManager.cc:124 msgid "PDFs with text" msgstr "嫿–‡å­—çš„ PDF" #: ../gtk/src/SourceManager.cc:118 ../qt/src/SourceManager.cc:124 msgid "" "These PDF files already contain text:\n" "%1" msgstr "" "這些 PDF æª”å·²åŒ…å«æ–‡å­—:\n" "%1" #: ../gtk/src/SourceManager.cc:127 ../qt/src/SourceManager.cc:132 msgid "Unable to open files" msgstr "無法開啟檔案" #: ../gtk/src/SourceManager.cc:127 ../qt/src/SourceManager.cc:132 msgid "The following files could not be opened:%1" msgstr "無法開啟下列檔案:%1" #: ../gtk/src/SourceManager.cc:141 ../qt/src/SourceManager.cc:143 msgid "Enter password for file '%1':" msgstr "請為 '%1' 檔輸入密碼:" #: ../gtk/src/SourceManager.cc:197 ../qt/src/SourceManager.cc:214 msgid "Images and PDFs" msgstr "圖åƒèˆ‡ PDF 檔" #: ../gtk/src/SourceManager.cc:202 ../qt/src/SourceManager.cc:215 msgid "Select Files" msgstr "é¸å–檔案" #: ../gtk/src/SourceManager.cc:208 ../qt/src/SourceManager.cc:226 msgid "Clipboard Error" msgstr "剪貼簿錯誤" #: ../gtk/src/SourceManager.cc:208 ../qt/src/SourceManager.cc:226 msgid "Failed to read the clipboard." msgstr "無法讀å–剪貼簿。" #: ../gtk/src/SourceManager.cc:212 ../qt/src/SourceManager.cc:230 #: ../qt/src/SourceManager.cc:236 msgid "Pasted %1" msgstr "已貼上 %1" #: ../gtk/src/SourceManager.cc:224 ../qt/src/SourceManager.cc:243 msgid "Screenshot Error" msgstr "ç•«é¢æˆªåœ–錯誤" #: ../gtk/src/SourceManager.cc:224 ../qt/src/SourceManager.cc:243 msgid "Failed to take screenshot." msgstr "無法截å–ç•«é¢ã€‚" #: ../gtk/src/SourceManager.cc:228 ../qt/src/SourceManager.cc:247 msgid "Screenshot %1" msgstr "截圖 %1" #: ../gtk/src/SourceManager.cc:233 ../qt/src/SourceManager.cc:252 msgid "Saving image..." msgstr "儲存圖åƒä¸­â€¦â€¦" #: ../gtk/src/SourceManager.cc:240 ../qt/src/SourceManager.cc:265 msgid "Cannot Write File" msgstr "無法寫入檔案" #: ../gtk/src/SourceManager.cc:240 ../qt/src/SourceManager.cc:265 msgid "Could not write to %1." msgstr "無法寫進 %1。" #: ../gtk/src/SourceManager.cc:267 ../qt/src/SourceManager.cc:287 msgid "Delete File?" msgstr "刪除檔案?" #: ../gtk/src/SourceManager.cc:267 ../qt/src/SourceManager.cc:287 msgid "The following files will be deleted:%1" msgstr "下列檔案將會被刪除:%1" #: ../gtk/src/SourceManager.cc:332 ../qt/src/SourceManager.cc:338 msgid "Missing File" msgstr "éºæ¼æª”案" #: ../gtk/src/SourceManager.cc:332 ../qt/src/SourceManager.cc:338 msgid "" "The following file has been deleted or moved:\n" "%1" msgstr "" "下列檔案已被刪除或移除:\n" "%1" #: ../gtk/src/SubstitutionsManager.cc:33 ../qt/src/SubstitutionsManager.cc:73 msgid "Search for" msgstr "尋找" #: ../gtk/src/SubstitutionsManager.cc:34 ../qt/src/SubstitutionsManager.cc:73 msgid "Replace with" msgstr "å–代" #: ../gtk/src/SubstitutionsManager.cc:69 ../gtk/src/SubstitutionsManager.cc:103 #: ../qt/src/SubstitutionsManager.cc:106 ../qt/src/SubstitutionsManager.cc:143 msgid "Substitutions List" msgstr "æ›¿æ›æ¸…å–®" #: ../gtk/src/SubstitutionsManager.cc:70 ../qt/src/SubstitutionsManager.cc:106 msgid "Open Substitutions List" msgstr "é–‹å§‹æ›¿æ›æ¸…å–®" #: ../gtk/src/SubstitutionsManager.cc:75 ../qt/src/SubstitutionsManager.cc:112 msgid "Error Reading File" msgstr "讀案錯誤" #: ../gtk/src/SubstitutionsManager.cc:75 ../qt/src/SubstitutionsManager.cc:112 msgid "Unable to read '%1'." msgstr "ç„¡æ³•è®€å– '%1'。" #: ../gtk/src/SubstitutionsManager.cc:97 ../qt/src/SubstitutionsManager.cc:137 msgid "Errors Occurred Reading File" msgstr "è®€å–æª”案時出ç¾éŒ¯èª¤" #: ../gtk/src/SubstitutionsManager.cc:97 ../qt/src/SubstitutionsManager.cc:137 msgid "Some entries of the substitutions list could not be read." msgstr "ç„¡æ³•è®€å–æ›¿æ›æ¸…單內æŸäº›é …目。" #: ../gtk/src/SubstitutionsManager.cc:104 ../qt/src/SubstitutionsManager.cc:143 msgid "Save Substitutions List" msgstr "å„²å­˜æ›¿æ›æ¸…å–®" #: ../gtk/src/SubstitutionsManager.cc:110 ../qt/src/SubstitutionsManager.cc:149 msgid "Error Saving File" msgstr "存檔錯誤" #: ../gtk/src/SubstitutionsManager.cc:110 ../qt/src/SubstitutionsManager.cc:149 msgid "Unable to write to '%1'." msgstr "無法寫進 '%1'。" #: ../gtk/src/SubstitutionsManager.cc:127 ../qt/src/SubstitutionsManager.cc:162 msgid "Save List?" msgstr "儲存清單?" #: ../gtk/src/SubstitutionsManager.cc:127 ../qt/src/SubstitutionsManager.cc:162 msgid "Do you want to save the current list?" msgstr "是å¦éœ€è¦å„²å­˜ç¾æœ‰æ¸…單?" #: ../gtk/src/TessdataManager.cc:60 ../qt/src/TessdataManager.cc:74 #, fuzzy msgid "" "A session connection to the PackageKit backend is required for managing " "system-wide tesseract language packs, but it was not found. This service is " "usually provided by a software-management application such as Gnome " "Software. Please install software which provides the necessary PackageKit " "interface, use other system package management software to manage the " "tesseract language packs directly, or switch to using the user tessdata path " "in the configuration dialog." msgstr "" "ç®¡ç† tesseract èªžè¨€åŒ…é ˆè¦ PackageKit,但它並ä¸å­˜åœ¨ã€‚請利用系統的套件管ç†è»Ÿä»¶" "ä¾†ç®¡ç† tesseract 的語言包。" #: ../gtk/src/TessdataManager.cc:65 ../qt/src/TessdataManager.cc:79 msgid "Fetching available languages" msgstr "å–å¾—å¯ç”¨èªžè¨€" #: ../gtk/src/TessdataManager.cc:70 ../gtk/src/TessdataManager.cc:96 #: ../gtk/src/TessdataManager.cc:197 ../qt/src/TessdataManager.cc:84 #: ../qt/src/TessdataManager.cc:101 ../qt/src/TessdataManager.cc:197 msgid "Failed to fetch list of available languages: %1" msgstr "無法å–å¾—å¯ç”¨èªžè¨€çš„æ¸…單:%1" #: ../gtk/src/TessdataManager.cc:104 ../qt/src/TessdataManager.cc:113 #: ../qt/src/TessdataManager.cc:122 msgid "Parsing error: %1" msgstr "剖æžéŒ¯èª¤ï¼š%1" #: ../gtk/src/TessdataManager.cc:235 ../qt/src/TessdataManager.cc:232 msgid "Applying changes..." msgstr "正在套用改動……" #: ../gtk/src/TessdataManager.cc:297 ../qt/src/TessdataManager.cc:278 msgid "Failed to create directory for tessdata files." msgstr "無法為 tessdata 檔建立目錄。" #: ../gtk/src/TessdataManager.cc:306 ../qt/src/TessdataManager.cc:287 msgid "Downloading %1..." msgstr "正在下載 %1……" #: ../gtk/src/TessdataManager.cc:330 msgid "" "The following files could not be downloaded or removed:\n" "%1\n" "\n" "Check the connectivity and directory permissions.\n" "\n" "Hint: If you don't have write permissions in system folders, you can switch " "to user paths in the settings dialog." msgstr "" "無法下載或刪除下列檔案:\n" "%1\n" "\n" "請檢查連線åŠç›®éŒ„權é™ã€‚\n" "\n" "æç¤ºï¼šå¦‚果您在系統資料夾中沒有寫入權é™ï¼Œæ‚¨å¯ä»¥åœ¨è¨­å®šå°è©±æ–¹å¡Šä¸­åˆ‡æ›åˆ°ä½¿ç”¨è€…è·¯" "徑。" #: ../gtk/src/Utils.cc:64 msgid "Yes" msgstr "是" #: ../gtk/src/Utils.cc:67 msgid "No" msgstr "å¦" #: ../gtk/src/Utils.cc:76 msgid "Discard" msgstr "棄置" #: ../qt/data/AboutDialog.ui.h:1 msgid "About gImageReader" msgstr "有關 gImageReader" #: ../qt/data/AboutDialog.ui.h:3 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/CrashHandler.ui.h:3 msgid "" "

Tesseract has " "aborted

Tesseract (the OCR engine) has aborted while " "recognizing text. This may occur if the used traineddatas are corrupt or " "incomplatible with the version of tesseract in use, or due to a bug in " "tesseract.

The stacktrace below may provide additional information " "about where the crash occured.

" msgstr "" #: ../qt/data/MainWindow.ui.h:17 msgid "Flatbed" msgstr "å¹³æ¿" #: ../qt/data/MainWindow.ui.h:18 msgid "ADF Front" msgstr "ADF æ­£é¢" #: ../qt/data/MainWindow.ui.h:19 msgid "ADF Back" msgstr "ADF 背é¢" #: ../qt/data/MainWindow.ui.h:20 msgid "ADF Duplex" msgstr "ADF é›™é¢" #. Remove & from some labels which designer insists in adding #: ../qt/data/MainWindow.ui.h:21 ../qt/src/Ui_MainWindow.hh:50 msgid "Sources" msgstr "來æº" #: ../qt/data/MainWindow.ui.h:22 msgid "Zoom In" msgstr "放大" #: ../qt/data/MainWindow.ui.h:24 msgid "Zoom Out" msgstr "縮å°" #: ../qt/data/MainWindow.ui.h:26 msgid "Normal Size" msgstr "正常大å°" #: ../qt/data/MainWindow.ui.h:28 msgid "Best Fit" msgstr "最佳大å°" #: ../qt/data/MainWindow.ui.h:30 msgid "Rotate Left" msgstr "å‘左旋轉" #: ../qt/data/MainWindow.ui.h:31 msgid "Rotate left" msgstr "å‘左旋轉" #: ../qt/data/MainWindow.ui.h:32 msgid "Rotate Right" msgstr "å‘峿—‹è½‰" #: ../qt/data/MainWindow.ui.h:33 msgid "Rotate right" msgstr "å‘峿—‹è½‰" #: ../qt/data/MainWindow.ui.h:34 msgid "Image Controls" msgstr "åœ–åƒæŽ§åˆ¶" #: ../qt/data/MainWindow.ui.h:36 msgid "Autodetect Layout" msgstr "è‡ªå‹•åµæ¸¬ä½ˆå±€" #: ../qt/data/MainWindow.ui.h:38 msgid "Toggle Output Pane" msgstr "切æ›è¼¸å‡ºé¢æ¿" #: ../qt/data/PdfExportDialog.ui.h:5 msgid "Backend:" msgstr "後端:" #: ../qt/data/PdfExportDialog.ui.h:8 msgid "Portrait" msgstr "縱å‘" #: ../qt/data/PdfExportDialog.ui.h:9 msgid "Landscape" msgstr "æ©«å‘" #: ../qt/src/hocr/HOCRPdfExporter.cc:142 msgid "Failed to write to file" msgstr "無法寫入檔案" #. Output toolbar #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:55 #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:56 msgid "Open hOCR file" msgstr "開啟 hOCR 檔" #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:57 #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:58 msgid "Save as hOCR text" msgstr "儲存為 hOCR 文字" #: ../qt/src/hocr/Ui_OutputEditorHOCR.hh:79 #: ../qt/src/Ui_OutputEditorText.hh:106 msgid "Find and Replace" msgstr "尋找åŠå–代" #: ../qt/src/MainWindow.cc:581 #, fuzzy msgid "" "The following dictionary files were installed:\n" "%1" msgstr "已安è£ä¸‹åˆ—詞典檔:%1" #: ../qt/src/TessdataManager.cc:308 msgid "" "The following files could not be downloaded or removed:\n" "%1\n" "\n" "Check the connectivity and directory permissions.\n" "Hint: If you don't have write permissions in system folders, you can switch " "to user paths in the settings dialog." msgstr "" "下列的檔案無法下載或移除:\n" "%1\n" "\n" "請檢查連線åŠç›®éŒ„權é™ã€‚\n" "æç¤ºï¼šå¦‚果您在系統資料夾中沒有寫入權é™ï¼Œæ‚¨å¯ä»¥åœ¨è¨­å®šå°è©±æ–¹å¡Šä¸­åˆ‡æ›åˆ°ä½¿ç”¨è€…è·¯" "徑。" #: ../qt/src/Ui_MainWindow.hh:51 msgid "Output" msgstr "輸出" #: ../qt/src/Ui_MainWindow.hh:135 msgid "OCR mode:" msgstr "OCR 模å¼ï¼š" #: ../qt/src/Ui_MainWindow.hh:209 msgid "Remove Image" msgstr "移除圖åƒ" #: ../qt/src/Ui_MainWindow.hh:212 msgid "Delete Image" msgstr "刪除圖åƒ" #: ../qt/src/Ui_MainWindow.hh:215 msgid "Clear List" msgstr "清除清單" #: ../qt/src/Ui_OutputEditorText.hh:101 msgid "Strip Line Breaks" msgstr "去除æ›è¡Œç¬¦è™Ÿ" #: ../qt/src/Ui_OutputEditorText.hh:115 msgid "Save Output" msgstr "儲存輸出" #: ../qt/src/Ui_OutputEditorText.hh:117 msgid "Clear Output" msgstr "清除輸出" #~ msgid "The application has crashed" #~ msgstr "應用程å¼å·²ç•°å¸¸çµ‚æ­¢" #~ msgid "Could not read %1: %2" #~ msgstr "ç„¡æ³•è®€å– %1:%2" #~ 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 。" gImageReader-3.3.1/qt/000077500000000000000000000000001351740627400144675ustar00rootroot00000000000000gImageReader-3.3.1/qt/data/000077500000000000000000000000001351740627400154005ustar00rootroot00000000000000gImageReader-3.3.1/qt/data/AboutDialog.ui000066400000000000000000000216701351740627400201370ustar00rootroot00000000000000 AboutDialog 0 0 492 391 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-2019 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> <td></td></tr> <tr> <td colspan="2"> <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 the community using <a href="https://hosted.weblate.org/projects/gimagereader/translations/"><span style=" text-decoration: underline; color:#2980b9;">Weblate</span></a></p></td> <td></td></tr></table></body></html> true License 0 0 0 0 true Copyright 2009-2019 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.3.1/qt/data/CharacterListDialog.ui000066400000000000000000000060471351740627400216160ustar00rootroot00000000000000 CharacterListDialog 0 0 427 160 Character whitelist / blacklist Exclude these characters from being recognized (blacklist): buttonGroup false Enter a string of characters... Only allow the following characters to be recognized (whitelist): buttonGroup false Enter a string of characters... Qt::Vertical 20 40 Qt::Horizontal QDialogButtonBox::Close buttonBox accepted() CharacterListDialog accept() 248 254 157 274 buttonBox rejected() CharacterListDialog reject() 316 260 286 274 true gImageReader-3.3.1/qt/data/ConfigDialog.ui000066400000000000000000000273611351740627400202750ustar00rootroot00000000000000 ConfigDialog 0 0 480 540 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 Automatically open exported documents with default application buttonBox accepted() ConfigDialog accept() 248 254 157 274 buttonBox rejected() ConfigDialog reject() 316 260 286 274 gImageReader-3.3.1/qt/data/CrashHandler.ui000066400000000000000000000110631351740627400202760ustar00rootroot00000000000000 CrashHandler 0 0 480 352 4 4 4 4 4 0 0 <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 0 0 <html><head/><body><p><span style=" font-weight:600;">Tesseract has aborted</span></p><p>Tesseract (the OCR engine) has aborted while recognizing text. This may occur if the used traineddatas are corrupt or incomplatible with the version of tesseract in use, or due to a bug in tesseract.</p><p>The stacktrace below may provide additional information about where the crash occured.</p></body></html> true 0 0 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.3.1/qt/data/MainWindow.ui000066400000000000000000000541331351740627400200210ustar00rootroot00000000000000 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 0 0 .. Refresh .. Device: Output: Resolution: 0 0 Qt::AlignCenter 75 dpi 100 dpi 200 dpi 300 dpi 600 dpi 1200 dpi Qt::AlignHCenter|Qt::AlignTop 0 0 0 0 Scan .. 0 0 Cancel .. 0 0 Mode: Grayscale Color true true Source: Flatbed ADF Front ADF Back ADF Duplex 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.3.1/qt/data/PageRangeDialog.ui000066400000000000000000000075251351740627400207210ustar00rootroot00000000000000 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.3.1/qt/data/PdfExportDialog.ui000066400000000000000000000636301351740627400210020ustar00rootroot00000000000000 PdfExportDialog 0 0 502 689 PDF Export 2 Qt::Vertical 20 40 Qt::Horizontal QDialogButtonBox::Cancel|QDialogButtonBox::Ok Show preview 0 Basic Output mode: Qt::Vertical 20 40 Backend: PDF PDF with invisible text overlay 0 0 0 0 0 0 0 0 0 0 2 0 0 0 Portrait :/icons/portrait:/icons/portrait true true true Landscape :/icons/landscape:/icons/landscape true true Paper size: 0 0 0 0 0 .. false true 2 0 0 0 0 Width x Height Image settings: false 4 4 4 4 50 1200 10 300 false Compression quality: DPI: 100 90 Format: Compression: false Dithering algorithm: false Text settings: 4 4 4 4 Override font size: Override font family: false false Preserve spaces wider than: 0 20 true Font scaling: 20 false 0 0 1 false 0 0 characters true 0 0 % 50 200 100 Uniformize line and word spacing false pt 1 10 Fallback font family: 20 Sanitize hyphens before line breaks 6 0 0 0 0 Treat image sources as having true DPI: 50 1200 10 300 Advanced PDF version: Encryption (optional): Password: 0 0 QLineEdit::Password true Confirm password: 0 0 QLineEdit::Password true 0 0 Additional information (optional): Author: Creator: Title: Producer: Subject: Keywords: Import from current source Qt::Vertical 20 40 buttonBox accepted() PdfExportDialog accept() 248 254 157 274 buttonBox rejected() PdfExportDialog reject() 316 260 286 274 gImageReader-3.3.1/qt/data/SearchReplaceFrame.ui000066400000000000000000000066021351740627400214170ustar00rootroot00000000000000 SearchReplaceFrame 0 0 337 103 QFrame::StyledPanel 2 2 2 2 2 Substitutions .. Replace Replace all .. Find Find previous .. Find next .. Replace .. Match case lineEditSearch toolButtonFindNext toolButtonFindPrev lineEditReplace toolButtonReplace toolButtonReplaceAll checkBoxMatchCase pushButtonSubstitutions gImageReader-3.3.1/qt/data/gimagereader.qrc000066400000000000000000000040711351740627400205250ustar00rootroot00000000000000 ../../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 ../../data/icons/wconf.png ../../data/icons/landscape.png ../../data/icons/portrait.png ../../data/icons/collapse.png ../../data/icons/expand.png gImageReader-3.3.1/qt/src/000077500000000000000000000000001351740627400152565ustar00rootroot00000000000000gImageReader-3.3.1/qt/src/Acquirer.cc000066400000000000000000000154401351740627400173440ustar00rootroot00000000000000/* -*- Mode: C++; indent-tabs-mode: t; c-basic-offset: 4; tab-width: 4 -*- */ /* * Acquirer.cc * Copyright (C) 2013-2019 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 "Acquirer.hh" #include "ConfigSettings.hh" #include "FileDialogs.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))); ADD_SETTING(ComboSetting("scanres", ui.comboBoxScanResolution, 2)); ADD_SETTING(ComboSetting("scanmode", ui.comboBoxScanMode, 0)); ADD_SETTING(ComboSetting("scandev", ui.comboBoxScanDevice, 0)); ADD_SETTING(ComboSetting("scansource", ui.comboBoxScanSource, 0)); #ifdef Q_OS_WIN32 ui.labelScanSource->setVisible(false); ui.comboBoxScanSource->setVisible(false); #endif QString sourcedir = ConfigSettings::get>("sourcedir")->getValue(); m_outputPath = QDir(sourcedir.isEmpty() ? Utils::documentsFolder() : sourcedir).absoluteFilePath(_("scan.png")); 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 = FileDialogs::saveDialog(_("Choose Output Filename..."), m_outputPath, "sourcedir", 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); } 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.0, 100.0, 200.0, 300.0, 600.0, 1200.0}; Scanner::ScanMode modes[] = {Scanner::ScanMode::GRAY, Scanner::ScanMode::COLOR}; Scanner::ScanType types[] = {Scanner::ScanType::SINGLE, Scanner::ScanType::ADF_FRONT, Scanner::ScanType::ADF_BACK, Scanner::ScanType::ADF_BOTH}; 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, types[ui.comboBoxScanSource->currentIndex()], 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.3.1/qt/src/Acquirer.hh000066400000000000000000000030031351740627400173460ustar00rootroot00000000000000/* -*- Mode: C++; indent-tabs-mode: t; c-basic-offset: 4; tab-width: 4 -*- */ /* * Acquirer.hh * Copyright (C) 2013-2019 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.3.1/qt/src/Config.cc000066400000000000000000000266721351740627400170070ustar00rootroot00000000000000/* -*- Mode: C++; indent-tabs-mode: t; c-basic-offset: 4; tab-width: 4 -*- */ /* * Config.cc * Copyright (C) 2013-2019 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 "ConfigSettings.hh" #include "LangTables.hh" #include "MainWindow.hh" #include "Utils.hh" #include #include #include #if QT_VERSION >= QT_VERSION_CHECK(5, 0, 0) #include #endif #include #include #define USE_STD_NAMESPACE #include #undef USE_STD_NAMESPACE const QList Config::LANGUAGES = LangTables::languages, QString>([](const char* str) { return QString::fromUtf8(str); }); const QMap Config::LANG_LOOKUP = [] { QMap lookup; for(const Config::Lang& lang : LANGUAGES) { lookup.insert(lang.prefix, lang.code); } return lookup; }(); const QMultiMap Config::LANGUAGE_CULTURES = LangTables::languageCultures>(); 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))); ADD_SETTING(SwitchSetting("dictinstall", ui.checkBoxDictInstall, true)); ADD_SETTING(SwitchSetting("updatecheck", ui.checkBoxUpdateCheck, true)); ADD_SETTING(SwitchSetting("openafterexport", ui.checkBoxOpenAfterExport, false)); ADD_SETTING(TableSetting("customlangs", ui.tableWidgetAdditionalLang)); ADD_SETTING(SwitchSetting("systemoutputfont", ui.checkBoxDefaultOutputFont, true)); ADD_SETTING(FontSetting("customoutputfont", &m_fontDialog, QFont().toString())); ADD_SETTING(ComboSetting("textencoding", ui.comboBoxEncoding, 0)); ADD_SETTING(ComboSetting("datadirs", ui.comboBoxDataLocation, 0)); ADD_SETTING(VarSetting("sourcedir", Utils::documentsFolder())); ADD_SETTING(VarSetting("outputdir", Utils::documentsFolder())); ADD_SETTING(VarSetting("auxdir", Utils::documentsFolder())); updateFontButton(m_fontDialog.currentFont()); } bool Config::searchLangSpec(Lang& lang) const { // Tesseract 4.x up to beta.1 had script tessdatas on same level as language tessdatas, but they are distinguishable in that they begin with an upper case character if(lang.prefix.startsWith("script", Qt::CaseInsensitive) || lang.prefix.left(1).toUpper() == lang.prefix.left(1)) { QString name = lang.prefix.startsWith("script", Qt::CaseInsensitive) ? lang.prefix.mid(7) : lang.prefix; lang.name = QString("%1 [%2]").arg(name).arg(_("Script")); return true; } 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 = {lang.prefix, table->item(row, 1)->text(), QString("%1 [%2]").arg(table->item(row, 2)->text(), lang.prefix)}; return true; } } } return false; } QList Config::searchLangCultures(const QString& code) const { return LANGUAGE_CULTURES.values(code); } void Config::showDialog() { toggleAddLanguage(true); exec(); ConfigSettings::get("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() { ConfigSettings::get("dictinstall")->setValue(false); } void Config::disableUpdateCheck() { ConfigSettings::get("updatecheck")->setValue(false); } void Config::setDataLocations(int idx) { ui.lineEditSpellLocation->setText(spellingLocation(static_cast(idx))); ui.lineEditTessdataLocation->setText(tessdataLocation(static_cast(idx))); } void Config::openTessdataDir() { int idx = QSettings().value("datadirs").toInt(); QString tessdataDir = tessdataLocation(static_cast(idx)); QDir().mkpath(tessdataDir); QDesktopServices::openUrl(QUrl::fromLocalFile(tessdataDir)); } void Config::openSpellingDir() { int idx = QSettings().value("datadirs").toInt(); QString spellingDir = spellingLocation(static_cast(idx)); QDir().mkpath(spellingDir); QDesktopServices::openUrl(QUrl::fromLocalFile(spellingDir)); } QString Config::spellingLocation(Location location) { if(location == SystemLocation) { #ifdef Q_OS_WIN QDir dataDir = QDir(QString("%1/../share/").arg(QApplication::applicationDirPath())); #else char* prefix = enchant_get_prefix_dir(); QDir dataDir(QDir(prefix).absoluteFilePath("share")); free(prefix); #endif #if HAVE_ENCHANT2 if(QDir(dataDir.absoluteFilePath("myspell")).exists()) { return dataDir.absoluteFilePath("myspell"); } else { return dataDir.absoluteFilePath("hunspell"); } #else return dataDir.absoluteFilePath("myspell/dicts"); #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 #if HAVE_ENCHANT2 return configDir.absoluteFilePath("enchant/hunspell"); #else return configDir.absoluteFilePath("enchant/myspell"); #endif } } QString Config::tessdataLocation(Location location) { if(location == SystemLocation) { #ifdef Q_OS_WIN QDir dataDir = QDir(QString("%1/../share/").arg(QApplication::applicationDirPath())); qputenv("TESSDATA_PREFIX", dataDir.absoluteFilePath("tessdata").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()); } QByteArray current = setlocale(LC_ALL, NULL); setlocale(LC_ALL, "C"); tesseract::TessBaseAPI tess; tess.Init(nullptr, nullptr); setlocale(LC_ALL, current.constData()); return QString(tess.GetDatapath()); } 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+").exactMatch(ui.lineEditLangPrefix->text())) { invalid = true; ui.lineEditLangPrefix->setStyleSheet(errorStyle); } if(!QRegExp(".+").exactMatch(ui.lineEditLangName->text())) { invalid = true; ui.lineEditLangName->setStyleSheet(errorStyle); } if(!QRegExp("[a-z]{2,}(_[A-Z]{2,})?").exactMatch(ui.lineEditLangCode->text())) { 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.3.1/qt/src/Config.hh000066400000000000000000000043721351740627400170120ustar00rootroot00000000000000/* -*- Mode: C++; indent-tabs-mode: t; c-basic-offset: 4; tab-width: 4 -*- */ /* * Config.hh * Copyright (C) 2013-2019 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 #include class Config : public QDialog { Q_OBJECT public: struct Lang { QString prefix, code, name; }; Config(QWidget* parent = nullptr); 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(); static QString lookupLangCode(const QString& prefix) { return LANG_LOOKUP[prefix]; } public slots: void disableDictInstall(); void disableUpdateCheck(); private: enum Location {SystemLocation = 0, UserLocation = 1}; static const QList LANGUAGES; static const QMap LANG_LOOKUP; static const QMultiMap LANGUAGE_CULTURES; Ui::ConfigDialog ui; QFontDialog m_fontDialog; static QString spellingLocation(Location location); static QString tessdataLocation(Location location); 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.3.1/qt/src/ConfigSettings.cc000066400000000000000000000042731351740627400205210ustar00rootroot00000000000000/* -*- Mode: C++; indent-tabs-mode: t; c-basic-offset: 4; tab-width: 4 -*- */ /* * ConfigSettings.cc * Copyright (C) 2013-2019 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" QMap ConfigSettings::s_settings; void ConfigSettings::add(AbstractSetting* setting) { s_settings.insert(setting->key(), setting); } void ConfigSettings::remove(const QString& key) { auto it = s_settings.find(key); if(it != s_settings.end()) { s_settings.erase(it); } } 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.3.1/qt/src/ConfigSettings.hh000066400000000000000000000151331351740627400205300ustar00rootroot00000000000000/* -*- Mode: C++; indent-tabs-mode: t; c-basic-offset: 4; tab-width: 4 -*- */ /* * ConfigSettings.hh * Copyright (C) 2013-2019 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 #include #include class AbstractSetting; #define ADD_SETTING(...) ((new __VA_ARGS__)->setParent(this)) class ConfigSettings { public: template static T* get(const QString& key) { auto it = s_settings.find(key); return it == s_settings.end() ? nullptr : static_cast(it.value()); } private: friend class AbstractSetting; static QMap s_settings; static void add(AbstractSetting* setting); static void remove(const QString& key); }; class AbstractSetting : public QObject { Q_OBJECT public: AbstractSetting(const QString& key) : m_key(key) { ConfigSettings::add(this); } virtual ~AbstractSetting() { ConfigSettings::remove(m_key); } 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 FontComboSetting : public AbstractSetting { Q_OBJECT public: FontComboSetting(const QString& key, QFontComboBox* combo, const QFont defaultFont = QFont()) : AbstractSetting(key), m_combo(combo) { combo->setCurrentFont(QFont(QSettings().value(m_key, defaultFont.family()).toString())); connect(combo, SIGNAL(currentFontChanged(QFont)), this, SLOT(serialize())); } public slots: void serialize() override { QSettings().setValue(m_key, m_combo->currentFont().family()); emit changed(); } private: QFontComboBox* 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; }; class LineEditSetting : public AbstractSetting { Q_OBJECT public: LineEditSetting(const QString& key, QLineEdit* lineEdit, const QString& defaultValue = "") : AbstractSetting(key), m_lineEdit(lineEdit) { lineEdit->setText(QSettings().value(m_key, QVariant::fromValue(defaultValue)).toString()); connect(lineEdit, SIGNAL(textChanged(const QString&)), this, SLOT(serialize())); } public slots: void serialize() override { QSettings().setValue(m_key, QVariant::fromValue(m_lineEdit->text())); emit changed(); } private: QLineEdit* m_lineEdit; }; #endif // CONFIGSETTINGS_HH gImageReader-3.3.1/qt/src/CrashHandler.cc000066400000000000000000000072421351740627400201300ustar00rootroot00000000000000/* -*- Mode: C++; indent-tabs-mode: t; c-basic-offset: 4; tab-width: 4 -*- */ /* * CrashHandler.cc * Copyright (C) 2013-2019 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, int tesseractCrash, const QString& savefile, QWidget* parent): QDialog(parent), m_pid(pid) { ui.setupUi(this); ui.labelIntroTesseract->setVisible(tesseractCrash); ui.labelIntro->setVisible(!tesseractCrash); 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.3.1/qt/src/CrashHandler.hh000066400000000000000000000025621351740627400201420ustar00rootroot00000000000000/* -*- Mode: C++; indent-tabs-mode: t; c-basic-offset: 4; tab-width: 4 -*- */ /* * CrashHandler.hh * Copyright (C) 2013-2019 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, int tesseractCrash, 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.3.1/qt/src/DisplayRenderer.cc000066400000000000000000000075311351740627400206670ustar00rootroot00000000000000/* -*- Mode: C++; indent-tabs-mode: t; c-basic-offset: 4; tab-width: 4 -*- */ /* * DisplayRenderer.cc * Copyright (C) 2013-2019 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 #include "DjVuDocument.hh" #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.0 - std::abs(brightness / 200.0); double dBr = brightness > 0 ? 255.0 : 0.0; double kCn = contrast * 2.55; double FCn = (259.0 * (kCn + 255.0)) / (255.0 * (259.0 - 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.0 - kBr) + red * kBr; green = dBr * (1.0 - kBr) + green * kBr; blue = dBr * (1.0 - kBr) + blue * kBr; // Contrast red = std::max(0.0, std::min(FCn * (red - 128.0) + 128.0, 255.0)); green = std::max(0.0, std::min(FCn * (green - 128.0) + 128.0, 255.0)); blue = std::max(0.0, std::min(FCn * (blue - 128.0) + 128.0, 255.0)); // 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.0); return reader.read().convertToFormat(QImage::Format_RGB32); } PDFRenderer::PDFRenderer(const QString& filename, const QByteArray& password) : DisplayRenderer(filename) { m_document = Poppler::Document::load(filename); if(m_document) { if(m_document->isLocked()) { m_document->unlock(password, password); } 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; } DJVURenderer::DJVURenderer(const QString& filename) : DisplayRenderer(filename) { m_djvu = new DjVuDocument(); m_djvu->openFile(filename); } DJVURenderer::~DJVURenderer() { delete m_djvu; } QImage DJVURenderer::render(int page, double resolution) const { return m_djvu->image(page, resolution); } int DJVURenderer::getNPages() const { return m_djvu->pageCount(); } gImageReader-3.3.1/qt/src/DisplayRenderer.hh000066400000000000000000000042321351740627400206740ustar00rootroot00000000000000/* -*- Mode: C++; indent-tabs-mode: t; c-basic-offset: 4; tab-width: 4 -*- */ /* * DisplayRenderer.hh * Copyright (C) 2013-2019 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 #include class DjVuDocument; 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, const QByteArray& password); ~PDFRenderer(); QImage render(int page, double resolution) const override; int getNPages() const override; private: Poppler::Document* m_document; mutable QMutex m_mutex; }; class DJVURenderer : public DisplayRenderer { public: DJVURenderer(const QString& filename); ~DJVURenderer(); QImage render(int page, double resolution) const override; int getNPages() const override; private: DjVuDocument* m_djvu; mutable QMutex m_mutex; }; #endif // IMAGERENDERER_HH gImageReader-3.3.1/qt/src/Displayer.cc000066400000000000000000000524151351740627400175300ustar00rootroot00000000000000/* -*- Mode: C++; indent-tabs-mode: t; c-basic-offset: 4; tab-width: 4 -*- */ /* * Displayer.cc * Copyright (C) 2013-2019 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 "Displayer.hh" #include "DisplayRenderer.hh" #include "SourceManager.hh" #include "Utils.hh" #include #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.0); ui.actionRotateRight->setData(90.0); 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(queueRenderImage())); connect(ui.spinBoxBrightness, SIGNAL(valueChanged(int)), this, SLOT(queueRenderImage())); connect(ui.spinBoxContrast, SIGNAL(valueChanged(int)), this, SLOT(queueRenderImage())); connect(ui.spinBoxResolution, SIGNAL(valueChanged(int)), this, SLOT(queueRenderImage())); connect(ui.checkBoxInvertColors, SIGNAL(toggled(bool)), this, SLOT(queueRenderImage())); 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::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); } m_scaleRequests.clear(); } if(m_tool) { m_tool->reset(); } m_renderTimer.stop(); m_scene->removeItem(m_imageItem); 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.actionPage->setVisible(false); ui.spinBoxPage->blockSignals(true); ui.spinBoxPage->setRange(1, 1); ui.spinBoxPage->blockSignals(false); Utils::setSpinBlocked(ui.spinBoxRotation, 0); Utils::setSpinBlocked(ui.spinBoxBrightness, 0); Utils::setSpinBlocked(ui.spinBoxContrast, 0); Utils::setSpinBlocked(ui.spinBoxResolution, 100); ui.checkBoxInvertColors->blockSignals(true); ui.checkBoxInvertColors->setChecked(false); ui.checkBoxInvertColors->blockSignals(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, source->password); } else if(source->path.endsWith(".djvu", Qt::CaseInsensitive)) { renderer = new DJVURenderer(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); m_imageItem = new QGraphicsPixmapItem(); m_imageItem->setTransformationMode(Qt::SmoothTransformation); m_scene->addItem(m_imageItem); if(!renderImage()) { 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::setup(const int* page, const int* resolution, const double* angle) { bool changed = false; if(page) { changed |= *page != ui.spinBoxPage->value(); Utils::setSpinBlocked(ui.spinBoxPage, *page); } if(resolution) { changed |= *resolution != ui.spinBoxResolution->value(); Utils::setSpinBlocked(ui.spinBoxResolution, *resolution); } if(changed && !renderImage()) { return false; } if(angle) { setAngle(*angle); } return true; } void Displayer::queueRenderImage() { m_renderTimer.start(500); } bool Displayer::renderImage() { if(m_sources.isEmpty()) { return false; } int page = ui.spinBoxPage->value(); // Set current source according to selected page Source* source = m_pageMap[page].first; if(!source) { return false; } int oldResolution = m_currentSource ? m_currentSource->resolution : -1; int oldPage = m_currentSource ? m_currentSource->page : -1; Source* oldSource = m_currentSource; if(source != m_currentSource) { sendScaleRequest({ScaleRequest::Abort}); sendScaleRequest({ScaleRequest::Quit}); while(m_scaleThread.isRunning()) { QApplication::processEvents(QEventLoop::ExcludeUserInputEvents); } m_scaleRequests.clear(); delete m_renderer; if(source->path.endsWith(".pdf", Qt::CaseInsensitive)) { m_renderer = new PDFRenderer(source->path, source->password); if(source->resolution == -1) { source->resolution = 300; } } else if(source->path.endsWith(".djvu", Qt::CaseInsensitive)) { m_renderer = new DJVURenderer(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.spinBoxResolution, source->resolution); Utils::setSpinBlocked(ui.spinBoxBrightness, source->brightness); Utils::setSpinBlocked(ui.spinBoxContrast, source->contrast); ui.checkBoxInvertColors->blockSignals(true); ui.checkBoxInvertColors->setChecked(source->invert); ui.checkBoxInvertColors->blockSignals(false); m_currentSource = source; m_scaleThread.start(); } // Update source struct 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(); // Notify tools about changes if(m_tool) { if(m_currentSource != oldSource || m_currentSource->page != oldPage) { m_tool->pageChanged(); } if(oldResolution != m_currentSource->resolution) { double factor = double(m_currentSource->resolution) / double(oldResolution); m_tool->resolutionChanged(factor); } } Utils::setSpinBlocked(ui.spinBoxRotation, m_currentSource->angle[m_currentSource->page - 1]); // Render new image sendScaleRequest({ScaleRequest::Abort}); 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; } int Displayer::getCurrentPage() const { return ui.spinBoxPage->value(); } int Displayer::getNPages() const { return ui.spinBoxPage->maximum(); } 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 : ""; } 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(); } void Displayer::setZoom(Zoom action, ViewportAnchor anchor) { if(!m_imageItem) { return; } sendScaleRequest({ScaleRequest::Abort}); setUpdatesEnabled(false); QRectF bb = m_imageItem->sceneBoundingRect(); double fit = std::min(viewport()->width() / bb.width(), viewport()->height() / bb.height()); if(action == Zoom::Original) { m_scale = 1.0; } else if(action == Zoom::In) { m_scale = std::min(10., m_scale * 1.25); } else if(action == Zoom::Out) { m_scale = std::max(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.0 ? angle + 360.0 : angle >= 360.0 ? angle - 360.0 : 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]; double newangle = pair.first->angle[pair.second - 1] + delta; newangle = newangle < 0.0 ? newangle + 360.0 : newangle >= 360.0 ? newangle - 360.0 : newangle, pair.first->angle[pair.second - 1] = newangle; } } m_imageItem->setRotation(angle); if(m_tool && delta != 0) { m_tool->rotationChanged(delta); } m_scene->setSceneRect(m_imageItem->sceneBoundingRect()); if(ui.actionBestFit->isChecked()) { setZoom(Zoom::Fit); } } } void Displayer::rotate90() { setAngle(ui.spinBoxRotation->value() + qobject_cast(QObject::sender())->data().toDouble()); } 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() = std::min(std::max(bb.x(), q.x()), bb.x() + bb.width()); q.ry() = std::min(std::max(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()); } 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::scaleTimerElapsed() { sendScaleRequest(m_pendingScaleRequest); } 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.0 / 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 = std::abs(r.x() - p.x()) < tol; bool right = std::abs(r.x() + r.width() - p.x()) < tol; bool top = std::abs(r.y() - p.y()) < tol; bool bottom = std::abs(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, 0.0); if(std::abs(m_point.x() - p.x()) < tol) { // pointx m_resizeHandlers.append(resizePointX); m_resizeOffset.setX(event->pos().x() - m_point.x()); } else if(std::abs(m_anchor.x() - p.x()) < tol) { // anchorx m_resizeHandlers.append(resizeAnchorX); m_resizeOffset.setX(event->pos().x() - m_anchor.x()); } if(std::abs(m_point.y() - p.y()) < tol) { // pointy m_resizeHandlers.append(resizePointY); m_resizeOffset.setY(event->pos().y() - m_point.y()); } else if(std::abs(m_anchor.y() - p.y()) < tol) { // anchory m_resizeHandlers.append(resizeAnchorY); m_resizeOffset.setY(event->pos().y() - m_anchor.y()); } if(!m_resizeHandlers.empty()) { event->accept(); } else { event->ignore(); } } void DisplayerSelection::mouseMoveEvent(QGraphicsSceneMouseEvent* event) { QPointF p = event->pos() - m_resizeOffset; QRectF bb = m_tool->getDisplayer()->getSceneBoundingRect(); p.rx() = std::min(std::max(bb.x(), p.x()), bb.x() + bb.width()); p.ry() = std::min(std::max(bb.y(), p.y()), bb.y() + bb.height()); if(!m_resizeHandlers.isEmpty()) { for(const ResizeHandler& handler : m_resizeHandlers) { handler(p, m_anchor, m_point); } QRectF newRect = QRectF(m_anchor, m_point).normalized().united(m_minRect); setRect(newRect); emit geometryChanged(rect()); event->accept(); } else { event->ignore(); } } gImageReader-3.3.1/qt/src/Displayer.hh000066400000000000000000000152131351740627400175350ustar00rootroot00000000000000/* -*- Mode: C++; indent-tabs-mode: t; c-basic-offset: 4; tab-width: 4 -*- */ /* * Displayer.hh * Copyright (C) 2013-2019 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); bool setup(const int* page = nullptr, const int* resolution = nullptr, const double* angle = nullptr); int getCurrentPage() const; int getNPages() const; int getCurrentResolution() const; double getCurrentAngle() const; double getCurrentScale() const { return m_scale; } QString getCurrentImage(int& page) const; QImage getImage(const QRectF& rect); QRectF getSceneBoundingRect() const; QPointF mapToSceneClamped(const QPoint& p) const; bool hasMultipleOCRAreas(); QList getOCRAreas(); bool allowAutodetectOCRAreas() const; void setCursor(const QCursor& cursor) { viewport()->setCursor(cursor); } void unsetCursor() { viewport()->unsetCursor(); } public slots: void autodetectOCRAreas(); 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(); void sendScaleRequest(const ScaleRequest& request); bool renderImage(); void rotate90(); void setAngle(double angle); void setRotateMode(QAction* action); 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); setZValue(10); } void setAnchorAndPoint(const QPointF& anchor, const QPointF& point) { m_anchor = anchor; m_point = point; setRect(QRectF(m_anchor, m_point).normalized()); } void setMinimumRect(const QRectF& rect) { m_minRect = rect; } 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; QRectF m_minRect; 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.3.1/qt/src/DisplayerToolSelect.cc000066400000000000000000000230711351740627400215220ustar00rootroot00000000000000/* -*- Mode: C++; indent-tabs-mode: t; c-basic-offset: 4; tab-width: 4 -*- */ /* * DisplayerToolSelect.cc * Copyright (C) 2013-2019 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 #define USE_STD_NAMESPACE #include #undef USE_STD_NAMESPACE #include #include #include #include #include DisplayerToolSelect::DisplayerToolSelect(Displayer* displayer, QObject* parent) : DisplayerTool(displayer, parent) { displayer->setCursor(Qt::CrossCursor); updateRecognitionModeLabel(); } DisplayerToolSelect::~DisplayerToolSelect() { clearSelections(); } 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.0 || m_curSel->rect().height() < 5.0) { 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 = FileDialogs::saveDialog(_("Save Selection Image"), _("selection.png"), "outputdir", QString("%1 (*.png)").arg(_("PNG Images")), true); if(!filename.isEmpty()) { 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.0; int nDeskew = 0; QList rects; QImage img = m_displayer->getImage(m_displayer->getSceneBoundingRect()); // Perform layout analysis Utils::busyTask([this, &nDeskew, &avgDeskew, &rects, &img] { QByteArray current = setlocale(LC_ALL, NULL); setlocale(LC_ALL, "C"); tesseract::TessBaseAPI tess; tess.InitForAnalysePage(); setlocale(LC_ALL, current.constData()); 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.0) * 10.0) / 10.0; if(std::abs(avgDeskew) > 0.1 && !noDeskew) { double newangle = m_displayer->getCurrentAngle() - avgDeskew; m_displayer->setup(nullptr, nullptr, &newangle); 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.0 / m_tool->getDisplayer()->getCurrentScale(); w = std::min(w, std::min(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.3.1/qt/src/DisplayerToolSelect.hh000066400000000000000000000053121351740627400215320ustar00rootroot00000000000000/* -*- Mode: C++; indent-tabs-mode: t; c-basic-offset: 4; tab-width: 4 -*- */ /* * DisplayerToolSelect.hh * Copyright (C) 2013-2019 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(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; 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(); 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.3.1/qt/src/DjVuDocument.cc000066400000000000000000000076721351740627400201500ustar00rootroot00000000000000/* -*- Mode: C++; indent-tabs-mode: t; c-basic-offset: 4; tab-width: 4 -*- */ /* * DjVuDocument.cc * Based on code from Okular, which is: * Copyright (C) 2006 by Pino Toscano * * 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 2 of the License, or * (at your option) any later version. */ #include "DjVuDocument.hh" #include #include #include #include /** * Explore the message queue until there are no message left in it. */ static void handle_ddjvu_messages( ddjvu_context_t* ctx, int wait ) { const ddjvu_message_t* msg; if ( wait ) { ddjvu_message_wait( ctx ); } while ( ( msg = ddjvu_message_peek( ctx ) ) ) { ddjvu_message_pop( ctx ); } } /** * Explore the message queue until the message \p mid is found. */ static void wait_for_ddjvu_message( ddjvu_context_t* ctx, ddjvu_message_tag_t mid ) { ddjvu_message_wait( ctx ); const ddjvu_message_t* msg; while ( ( msg = ddjvu_message_peek( ctx ) ) && msg && ( msg->m_any.tag != mid ) ) { ddjvu_message_pop( ctx ); } } DjVuDocument::DjVuDocument() { // creating the djvu context m_djvu_cxt = ddjvu_context_create( "DjVuDocument" ); // creating the rendering format unsigned int formatmask[4] = { 0x00ff0000, 0x0000ff00, 0x000000ff, 0xff000000 }; // R, G, B, A masks m_format = ddjvu_format_create( DDJVU_FORMAT_RGBMASK32, 4, formatmask ); ddjvu_format_set_row_order( m_format, 1 ); ddjvu_format_set_y_direction( m_format, 1 ); } DjVuDocument::~DjVuDocument() { closeFile(); ddjvu_format_release( m_format ); ddjvu_context_release( m_djvu_cxt ); } bool DjVuDocument::openFile( const QString& fileName ) { // first, close the old file if ( m_djvu_document ) { closeFile(); } // load the document... m_djvu_document = ddjvu_document_create_by_filename( m_djvu_cxt, QFile::encodeName( fileName ).constData(), true ); if ( !m_djvu_document ) { return false; } // ...and wait for its loading wait_for_ddjvu_message( m_djvu_cxt, DDJVU_DOCINFO ); if ( ddjvu_document_decoding_error( m_djvu_document ) ) { ddjvu_document_release( m_djvu_document ); m_djvu_document = nullptr; return false; } int numofpages = ddjvu_document_get_pagenum( m_djvu_document ); m_pages.clear(); m_pages.resize( numofpages ); // read the pages for ( int i = 0; i < numofpages; ++i ) { ddjvu_status_t sts; ddjvu_pageinfo_t info; while ( ( sts = ddjvu_document_get_pageinfo( m_djvu_document, i, &info ) ) < DDJVU_JOB_OK ) { handle_ddjvu_messages( m_djvu_cxt, true ); } if ( sts >= DDJVU_JOB_FAILED ) { closeFile(); return false; } m_pages[i] = {info.width, info.height, info.dpi}; } return true; } void DjVuDocument::closeFile() { m_pages.clear(); // releasing the old document if ( m_djvu_document ) { ddjvu_document_release( m_djvu_document ); } m_djvu_document = nullptr; } QImage DjVuDocument::image( int pageno, int resolution ) { if(pageno < 0 || pageno >= pageCount()) { return QImage(); } const DjVuDocument::Page& page = m_pages[pageno]; ddjvu_page_t* djvupage = ddjvu_page_create_by_pageno( m_djvu_document, pageno ); // wait for the new page to be loaded ddjvu_status_t sts; while ( ( sts = ddjvu_page_decoding_status( djvupage ) ) < DDJVU_JOB_OK ) { handle_ddjvu_messages( m_djvu_cxt, true ); } double scaleFactor = double(resolution) / double(page.dpi); ddjvu_rect_t pagerect; pagerect.x = 0; pagerect.y = 0; pagerect.w = page.width * scaleFactor; pagerect.h = page.height * scaleFactor; ddjvu_rect_t renderrect = pagerect; QImage res_img( renderrect.w, renderrect.h, QImage::Format_RGB32 ); int res = ddjvu_page_render( djvupage, DDJVU_RENDER_COLOR, &pagerect, &renderrect, m_format, res_img.bytesPerLine(), (char*)res_img.bits() ); if (!res) { res_img.fill(Qt::white); } ddjvu_page_release(djvupage); return res_img; } gImageReader-3.3.1/qt/src/DjVuDocument.hh000066400000000000000000000022151351740627400201460ustar00rootroot00000000000000/* -*- Mode: C++; indent-tabs-mode: t; c-basic-offset: 4; tab-width: 4 -*- */ /* * DjVuDocument.hh * Based on code from Okular, which is: * Copyright (C) 2006 by Pino Toscano * * 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 2 of the License, or * (at your option) any later version. */ #ifndef DJVUDOCUMENT_HH #define DJVUDOCUMENT_HH #include #include typedef struct ddjvu_context_s ddjvu_context_t; typedef struct ddjvu_document_s ddjvu_document_t; typedef struct ddjvu_format_s ddjvu_format_t; class DjVuDocument { public: DjVuDocument(); ~DjVuDocument(); bool openFile( const QString& fileName ); void closeFile(); QImage image(int pageno, int resolution); int pageCount() const { return m_pages.size(); } private: struct Page { int width; int height; int dpi; }; ddjvu_context_t* m_djvu_cxt = nullptr; ddjvu_document_t* m_djvu_document = nullptr; ddjvu_format_t* m_format = nullptr; QVector m_pages; }; #endif gImageReader-3.3.1/qt/src/FileDialogs.cc000066400000000000000000000057511351740627400177570ustar00rootroot00000000000000/* -*- Mode: C++; indent-tabs-mode: t; c-basic-offset: 4; tab-width: 4 -*- */ /* * FileDialogs.cc * Copyright (C) 2013-2019 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 "ConfigSettings.hh" #include "FileDialogs.hh" #include "MainWindow.hh" #include "Utils.hh" namespace FileDialogs { QStringList openDialog(const QString& title, const QString& initialDirectory, const QString& initialDirSetting, const QString& filter, bool multiple, QWidget* parent) { parent = parent == nullptr ? MAIN : parent; QString initialDir = initialDirectory; if(initialDir.isEmpty()) { initialDir = ConfigSettings::get>(initialDirSetting)->getValue(); if(initialDir.isEmpty()) { initialDir = Utils::documentsFolder(); } } QStringList filenames; if(multiple) { filenames.append(QFileDialog::getOpenFileNames(parent, title, initialDir, filter)); } else { QString filename = QFileDialog::getOpenFileName(parent, title, initialDir, filter); if(!filename.isEmpty()) { filenames.append(filename); } } if(!filenames.isEmpty()) { ConfigSettings::get>(initialDirSetting)->setValue(QFileInfo(filenames.first()).absolutePath()); } return filenames; } QString saveDialog(const QString& title, const QString& initialFilename, const QString& initialDirSetting, const QString& filter, bool generateUniqueName, QWidget* parent) { parent = parent == nullptr ? MAIN : parent; QString suggestedFile; if(!initialFilename.isEmpty() && QFileInfo(initialFilename).isAbsolute()) { suggestedFile = initialFilename; } else { QString initialDir = ConfigSettings::get>(initialDirSetting)->getValue(); if(initialDir.isEmpty()) { initialDir = Utils::documentsFolder(); } suggestedFile = QDir(initialDir).absoluteFilePath(initialFilename); if(generateUniqueName) { suggestedFile = Utils::makeOutputFilename(suggestedFile); } } QString filename = QFileDialog::getSaveFileName(parent, title, suggestedFile, filter); if(!filename.isEmpty()) { QString sext = QFileInfo(suggestedFile).completeSuffix(); QString ext = QFileInfo(filename).completeSuffix(); if(ext.isEmpty()) { filename += "." + sext; } ConfigSettings::get>(initialDirSetting)->setValue(QFileInfo(filename).absolutePath()); } return filename; } } // FileDialogs gImageReader-3.3.1/qt/src/FileDialogs.hh000066400000000000000000000024701351740627400177640ustar00rootroot00000000000000/* -*- Mode: C++; indent-tabs-mode: t; c-basic-offset: 4; tab-width: 4 -*- */ /* * FileDialogs.hh * Copyright (C) 2013-2019 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 class QWidget; namespace FileDialogs { QStringList openDialog(const QString& title, const QString& initialDirectory, const QString& initialDirSetting, const QString& filter, bool multiple, QWidget* parent = nullptr); QString saveDialog(const QString& title, const QString& initialFilename, const QString& initialDirSetting, const QString& filter, bool generateUniqueName = false, QWidget* parent = nullptr); } // FileDialogs #endif // FILEDIALOGS_HH gImageReader-3.3.1/qt/src/MainWindow.cc000066400000000000000000000520271351740627400176470ustar00rootroot00000000000000/* -*- Mode: C++; indent-tabs-mode: t; c-basic-offset: 4; tab-width: 4 -*- */ /* * MainWindow.cc * Copyright (C) 2013-2019 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 #define USE_STD_NAMESPACE #include #undef USE_STD_NAMESPACE #include "MainWindow.hh" #include "Acquirer.hh" #include "ConfigSettings.hh" #include "Displayer.hh" #include "DisplayerToolSelect.hh" #include "DisplayerToolHOCR.hh" #include "OutputEditorText.hh" #include "OutputEditorHOCR.hh" #include "Recognizer.hh" #include "SourceManager.hh" #include "TessdataManager.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) { signalHandlerExec(signal, false); } void MainWindow::tesseractCrash(int signal) { signalHandlerExec(signal, true); } void MainWindow::signalHandlerExec(int signal, bool tesseractCrash) { 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()) << QString::number(tesseractCrash) << 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); } #if !(defined(__ARMEL__) || defined(__LCC__) && __LCC__ <= 121) 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); #if !(defined(__ARMEL__) || defined(__LCC__) && __LCC__ <= 121) 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); ui.toolBarMain->setLayoutDirection(Qt::LeftToRight); 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.actionManageLanguages, SIGNAL(triggered()), this, SLOT(manageLanguages())); 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(Config::Lang))); connect(ui.actionAutodetectLayout, SIGNAL(triggered()), m_displayer, SLOT(autodetectOCRAreas())); ADD_SETTING(VarSetting("wingeom")); ADD_SETTING(VarSetting("winstate")); ADD_SETTING(ActionSetting("showcontrols", ui.actionImageControls)); ADD_SETTING(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(ConfigSettings::get>("wingeom")->getValue()); restoreState(ConfigSettings::get>("winstate")->getValue()); ui.dockWidgetOutput->setVisible(false); ui.actionSources->trigger(); #if ENABLE_VERSIONCHECK if(ConfigSettings::get("updatecheck")->getValue()) { connect(&m_versionCheckThread, SIGNAL(finished()), this, SLOT(checkVersion())); m_versionCheckThread.start(); } #endif m_sourceManager->addSources(files); } MainWindow::~MainWindow() { #if ENABLE_VERSIONCHECK while(m_versionCheckThread.isRunning()) { QApplication::processEvents(QEventLoop::ExcludeUserInputEvents); } #endif 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()) { ConfigSettings::get>("wingeom")->setValue(saveGeometry()); ConfigSettings::get>("winstate")->setValue(saveState()); } } void MainWindow::onSourceChanged() { 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)); if(m_stateStack.top().first == State::Idle) { pushState(State::Normal, _("Ready")); } } else { if(m_stateStack.top().first == State::Normal) { popState(); } setWindowTitle(PACKAGE_NAME); } } void MainWindow::showAbout() { QDialog d(this); Ui::AboutDialog aboutDialogUi; aboutDialogUi.setupUi(&d); aboutDialogUi.labelVersion->setText(QString("%1 (%2)").arg(PACKAGE_VERSION, QString(PACKAGE_REVISION).left(6)));; 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 // Always use relative path on Windows QString manualDirPath; #else QString manualDirPath(MANUAL_DIR); #endif if(manualDirPath.isEmpty()) { manualDirPath = QString("%1/../share/doc/gimagereader").arg(QApplication::applicationDirPath()); } QDir manualDir(manualDirPath); 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::manageLanguages() { TessdataManager manager(MAIN); if(manager.setup()) { manager.exec(); } } 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(m_displayer); m_outputEditor = new OutputEditorText(); } else { /*if(idx == 1)*/ m_displayerTool = new DisplayerToolHOCR(m_displayer); m_outputEditor = new OutputEditorHOCR(static_cast(m_displayerTool)); } ui.actionAutodetectLayout->setVisible(m_displayerTool->allowAutodetectOCRAreas()); m_displayer->setTool(m_displayerTool); 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(const Config::Lang& lang) { if(m_outputEditor) { m_outputEditor->setLanguage(lang); } hideNotification(m_notifierHandle); m_notifierHandle = nullptr; const QString& code = lang.code; if(!code.isEmpty() && !QtSpell::checkLanguageInstalled(code) && ConfigSettings::get("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() { QString code = m_recognizer->getSelectedLanguage().code; 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 messages; QString html = QString(Utils::download(url, messages)); if(html.isEmpty()) { 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; } int pos = 0; QString langCode = code.left(code.indexOf('_')); QRegExp langPat(QString(">(%1_?[A-Z]*)<").arg(langCode)); QRegExp dictPat(QString(">(%1_?[\\w_]*\\.(dic|aff))<").arg(langCode)); QStringList downloaded; QStringList failed; while((pos = langPat.indexIn(html, pos)) != -1) { QString lang = langPat.cap(1); pos += langPat.matchedLength(); QString dictHtml = QString(Utils::download(url + lang + "/", messages)); if(dictHtml.isEmpty()) { continue; } int dictPos = 0; while((dictPos = dictHtml.indexOf(dictPat, dictPos)) != -1) { QString filename = dictPat.cap(1); pushState(State::Busy, _("Downloading '%1'...").arg(filename)); QByteArray data = Utils::download(plainurl + lang + "/" + filename, messages); if(!data.isNull()) { QFile file(spellingDir.absoluteFilePath(filename)); if(file.open(QIODevice::WriteOnly)) { file.write(data); downloaded.append(filename); } else { failed.append(filename); } } else { failed.append(filename); } popState(); dictPos += dictPat.matchedLength(); } } popState(); if(!failed.isEmpty()) { QMessageBox::critical(this, _("Error"), _("The following dictionaries could not be downloaded:\n%1\n\nCheck the connectivity and directory permissions.\nHint: If you don't have write permissions in system folders, you can switch to user paths in the settings dialog.").arg(failed.join("\n"))); } else if(!downloaded.isEmpty()) { m_recognizer->updateLanguagesMenu(); QMessageBox::information(this, _("Dictionaries installed"), _("The following dictionary files were installed:\n%1").arg(downloaded.join("\n"))); } 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.3.1/qt/src/MainWindow.hh000066400000000000000000000106741351740627400176630ustar00rootroot00000000000000/* -*- Mode: C++; indent-tabs-mode: t; c-basic-offset: 4; tab-width: 4 -*- */ /* * MainWindow.hh * Copyright (C) 2013-2019 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 #include "common.hh" #include "Config.hh" #include "Ui_MainWindow.hh" #define MAIN MainWindow::getInstance() 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; }; class ProgressMonitor { public: ProgressMonitor(int total) : mTotal(total) {} virtual ~ProgressMonitor() {} void increaseProgress() { QMutexLocker locker(&mMutex); ++mProgress; } virtual int getProgress() const { QMutexLocker locker(&mMutex); return (mProgress * 100) / mTotal; } virtual void cancel() { QMutexLocker locker(&mMutex); mCancelled = true; } bool cancelled() const { QMutexLocker locker(&mMutex); return mCancelled; } protected: mutable QMutex mMutex; const int mTotal; int mProgress = 0; bool mCancelled = false; }; typedef void* Notification; static MainWindow* getInstance() { return s_instance; } static void signalHandler(int signal); static void tesseractCrash(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 manageLanguages(); void popState(); void pushState(MainWindow::State state, const QString& msg); void showHelp(const QString& chapter = ""); void hideNotification(Notification handle = nullptr); private: static void signalHandlerExec(int signal, bool tesseractCrash); 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(const Config::Lang& lang); void dictionaryAutoinstall(); }; Q_DECLARE_METATYPE(MainWindow::State) #endif gImageReader-3.3.1/qt/src/OutputEditor.cc000066400000000000000000000020331351740627400202320ustar00rootroot00000000000000/* -*- Mode: C++; indent-tabs-mode: t; c-basic-offset: 4; tab-width: 4 -*- */ /* * OutputEditor.cc * Copyright (C) 2013-2019 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.3.1/qt/src/OutputEditor.hh000066400000000000000000000034511351740627400202510ustar00rootroot00000000000000/* -*- Mode: C++; indent-tabs-mode: t; c-basic-offset: 4; tab-width: 4 -*- */ /* * OutputEditor.hh * Copyright (C) 2013-2019 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.3.1/qt/src/OutputEditorText.cc000066400000000000000000000256551351740627400211160ustar00rootroot00000000000000/* -*- Mode: C++; indent-tabs-mode: t; c-basic-offset: 4; tab-width: 4 -*- */ /* * OutputEditorText.cc * Copyright (C) 2013-2019 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 #define USE_STD_NAMESPACE #include #undef USE_STD_NAMESPACE #include "ConfigSettings.hh" #include "FileDialogs.hh" #include "OutputEditorText.hh" #include "Recognizer.hh" #include "SourceManager.hh" #include "Utils.hh" OutputEditorText::OutputEditorText() { m_insertMode = InsertMode::Append; m_widget = new QWidget; ui.setupUi(m_widget); ui.actionOutputModeAppend->setData(static_cast(InsertMode::Append)); ui.actionOutputModeCursor->setData(static_cast(InsertMode::Cursor)); ui.actionOutputModeReplace->setData(static_cast(InsertMode::Replace)); 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.searchFrame, SLOT(setVisible(bool))); connect(ui.actionOutputReplace, SIGNAL(toggled(bool)), ui.searchFrame, 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(ui.searchFrame, SIGNAL(findReplace(QString, QString, bool, bool, bool)), this, SLOT(findReplace(QString, QString, bool, bool, bool))); connect(ui.searchFrame, SIGNAL(replaceAll(QString, QString, bool)), this, SLOT(replaceAll(QString, QString, bool))); connect(ui.searchFrame, SIGNAL(applySubstitutions(QMap, bool)), this, SLOT(applySubstitutions(QMap, bool))); connect(&m_spell, SIGNAL(undoAvailable(bool)), ui.actionOutputUndo, SLOT(setEnabled(bool))); connect(&m_spell, SIGNAL(redoAvailable(bool)), ui.actionOutputRedo, SLOT(setEnabled(bool))); connect(ConfigSettings::get("customoutputfont"), SIGNAL(changed()), this, SLOT(setFont())); connect(ConfigSettings::get("systemoutputfont"), SIGNAL(changed()), this, SLOT(setFont())); connect(ui.actionOutputPostprocDrawWhitespace, SIGNAL(toggled(bool)), ui.plainTextEditOutput, SLOT(setDrawWhitespace(bool))); ADD_SETTING(ActionSetting("keepdot", ui.actionOutputPostprocKeepEndMark, true)); ADD_SETTING(ActionSetting("keepquote", ui.actionOutputPostprocKeepQuote)); ADD_SETTING(ActionSetting("joinhyphen", ui.actionOutputPostprocJoinHyphen, true)); ADD_SETTING(ActionSetting("joinspace", ui.actionOutputPostprocCollapseSpaces, true)); ADD_SETTING(ActionSetting("keepparagraphs", ui.actionOutputPostprocKeepParagraphs, true)); ADD_SETTING(ActionSetting("drawwhitespace", ui.actionOutputPostprocDrawWhitespace)); setFont(); } OutputEditorText::~OutputEditorText() { delete m_widget; } void OutputEditorText::setFont() { if(ConfigSettings::get("systemoutputfont")->getValue()) { ui.plainTextEditOutput->setFont(QFont()); } else { ui.plainTextEditOutput->setFont(ConfigSettings::get("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::findReplace(const QString& searchstr, const QString& replacestr, bool matchCase, bool backwards, bool replace) { ui.searchFrame->clearErrorState(); if(!ui.plainTextEditOutput->findReplace(backwards, replace, matchCase, searchstr, replacestr)) { ui.searchFrame->setErrorState(); } } void OutputEditorText::replaceAll(const QString& searchstr, const QString& replacestr, bool matchCase) { MAIN->pushState(MainWindow::State::Busy, _("Replacing...")); if(!ui.plainTextEditOutput->replaceAll(searchstr, replacestr, matchCase)) { ui.searchFrame->setErrorState(); } MAIN->popState(); } void OutputEditorText::applySubstitutions(const QMap& substitutions, bool matchCase) { MAIN->pushState(MainWindow::State::Busy, _("Applying substitutions...")); QTextCursor cursor = ui.plainTextEditOutput->regionBounds(); int end = cursor.position(); cursor.setPosition(cursor.anchor()); QTextDocument::FindFlags flags = 0; if(matchCase) { flags = QTextDocument::FindCaseSensitively; } int start = cursor.position(); for(auto it = substitutions.begin(), itEnd = substitutions.end(); it != itEnd; ++it) { QString search = it.key(); QString replace = it.value(); int diff = replace.length() - search.length(); cursor.setPosition(start); while(true) { cursor = ui.plainTextEditOutput->document()->find(search, cursor, flags); if(cursor.isNull() || std::max(cursor.anchor(), cursor.position()) > end) { break; } cursor.insertText(replace); end += diff; } QCoreApplication::processEvents(QEventLoop::ExcludeUserInputEvents); } MAIN->popState(); } 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 = FileDialogs::saveDialog(_("Save Output..."), base + ".txt", "outputdir", QString("%1 (*.txt)").arg(_("Text Files"))); if(outname.isEmpty()) { return false; } } 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 /*visible*/) { ui.searchFrame->hideSubstitutionsManager(); } void OutputEditorText::setLanguage(const Config::Lang& lang) { m_spell.setLanguage(lang.code.isEmpty() ? Utils::getSpellingLanguage() : lang.code); } gImageReader-3.3.1/qt/src/OutputEditorText.hh000066400000000000000000000045261351740627400211220ustar00rootroot00000000000000/* -*- Mode: C++; indent-tabs-mode: t; c-basic-offset: 4; tab-width: 4 -*- */ /* * OutputEditorText.hh * Copyright (C) 2013-2019 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 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; private slots: void addText(const QString& text, bool insert); void filterBuffer(); void findReplace(const QString& searchstr, const QString& replacestr, bool matchCase, bool backwards, bool replace); void replaceAll(const QString& searchstr, const QString& replacestr, bool matchCase); void applySubstitutions(const QMap& substitutions, bool matchCase); void setFont(); void setInsertMode(QAction* action); }; #endif // OUTPUTEDITORTEXT_HH gImageReader-3.3.1/qt/src/OutputTextEdit.cc000066400000000000000000000241571351740627400205510ustar00rootroot00000000000000/* -*- Mode: C++; indent-tabs-mode: t; c-basic-offset: 4; tab-width: 4 -*- */ /* * OutputTextEdit.cc * Copyright (C) 2013-2019 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(std::min(selCursor.position(), selCursor.anchor())); } else { selCursor.setPosition(std::max(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(std::min(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 in between 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.3.1/qt/src/OutputTextEdit.hh000066400000000000000000000031431351740627400205530ustar00rootroot00000000000000/* -*- Mode: C++; indent-tabs-mode: t; c-basic-offset: 4; tab-width: 4 -*- */ /* * OutputTextEdit.hh * Copyright (C) 2013-2019 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.3.1/qt/src/Recognizer.cc000066400000000000000000000526031351740627400177020ustar00rootroot00000000000000/* -*- Mode: C++; indent-tabs-mode: t; c-basic-offset: 4; tab-width: 4 -*- */ /* * Recognizer.hh * Copyright (C) 2013-2019 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 #define USE_STD_NAMESPACE #include #include #include #include #undef USE_STD_NAMESPACE #include #include #include #ifdef Q_OS_WIN #include #define pipe(fds) _pipe(fds, 5000, _O_BINARY) #endif #include "ConfigSettings.hh" #include "Displayer.hh" #include "MainWindow.hh" #include "OutputEditor.hh" #include "Recognizer.hh" #include "Utils.hh" class Recognizer::ProgressMonitor : public MainWindow::ProgressMonitor { public: ETEXT_DESC desc; ProgressMonitor(int nPages) : MainWindow::ProgressMonitor(nPages) { desc.progress = 0; desc.cancel = cancelCallback; desc.cancel_this = this; } int getProgress() const override { QMutexLocker locker(&mMutex); return 100.0 * ((mProgress + desc.progress / 100.0) / mTotal); } static bool cancelCallback(void* instance, int /*words*/) { ProgressMonitor* monitor = reinterpret_cast(instance); QMutexLocker locker(&monitor->mMutex); return monitor->mCancelled; } }; 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); m_charListDialog = new QDialog(MAIN); m_charListDialogUi.setupUi(m_charListDialog); 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())); connect(m_charListDialogUi.radioButtonBlacklist, SIGNAL(toggled(bool)), m_charListDialogUi.lineEditBlacklist, SLOT(setEnabled(bool))); connect(m_charListDialogUi.radioButtonWhitelist, SIGNAL(toggled(bool)), m_charListDialogUi.lineEditWhitelist, SLOT(setEnabled(bool))); ADD_SETTING(VarSetting("language", "eng:en_EN")); ADD_SETTING(ComboSetting("ocrregionstrategy", m_pagesDialogUi.comboBoxRecognitionArea, 0)); ADD_SETTING(SwitchSetting("ocraddsourcefilename", m_pagesDialogUi.checkBoxPrependFilename)); ADD_SETTING(SwitchSetting("ocraddsourcepage", m_pagesDialogUi.checkBoxPrependPage)); ADD_SETTING(LineEditSetting("ocrcharwhitelist", m_charListDialogUi.lineEditWhitelist)); ADD_SETTING(LineEditSetting("ocrcharblacklist", m_charListDialogUi.lineEditBlacklist)); ADD_SETTING(SwitchSetting("ocrblacklistenabled", m_charListDialogUi.radioButtonBlacklist, true)); ADD_SETTING(SwitchSetting("ocrwhitelistenabled", m_charListDialogUi.radioButtonWhitelist, false)); ADD_SETTING(VarSetting("psm", 6)); } QStringList Recognizer::getAvailableLanguages() const { tesseract::TessBaseAPI tess = initTesseract(); GenericVector availLanguages; tess.GetAvailableLanguagesAsVector(&availLanguages); QStringList result; for(int i = 0; i < availLanguages.size(); ++i) { result.append(availLanguages[i].string()); } qSort(result.begin(), result.end(), [](const QString & s1, const QString & s2) { bool s1Script = s1.startsWith("script") || s1.left(1) == s1.left(1).toUpper(); bool s2Script = s2.startsWith("script") || s2.left(1) == s2.left(1).toUpper(); if(s1Script != s2Script) { return !s1Script; } else { return s1 < s2; } }); return result; } tesseract::TessBaseAPI Recognizer::initTesseract(const char* language, bool* ok) const { // unfortunately tesseract creates deliberate aborts when an error occurs std::signal(SIGABRT, MainWindow::tesseractCrash); QByteArray current = setlocale(LC_ALL, NULL); setlocale(LC_ALL, "C"); tesseract::TessBaseAPI tess; int ret = tess.Init(nullptr, language); setlocale(LC_NUMERIC, current.constData()); if(ok) { *ok = ret != -1; } return tess; } 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 = ConfigSettings::get>("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); } } std::sort(spelldicts.begin(), spelldicts.end()); } 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 = ConfigSettings::get>("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); ui.menuLanguages->addAction(_("Character whitelist / blacklist..."), this, SLOT(manageCharacterLists())); // Add installer item ui.menuLanguages->addSeparator(); ui.menuLanguages->addAction(_("Manage languages..."), MAIN, SLOT(manageLanguages())); } 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; ConfigSettings::get>("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"}; ConfigSettings::get>("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) { ConfigSettings::get>("psm")->setValue(action->data().toInt()); } void Recognizer::manageCharacterLists() { m_charListDialog->exec(); } 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")); QRegExp validateRegEx("^[\\d,\\-\\s]+$"); QList pages; while(m_pagesDialog->exec() == QDialog::Accepted) { pages.clear(); QString text = m_pagesDialogUi.lineEditPageRange->text(); if(validateRegEx.indexIn(text) != -1) { 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 = std::max(1, ranges[0].toInt()); int end = std::min(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;"); } else { break; } } std::sort(pages.begin(), pages.end()); 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) { bool prependFile = pages.size() > 1 && ConfigSettings::get("ocraddsourcefilename")->getValue(); bool prependPage = pages.size() > 1 && ConfigSettings::get("ocraddsourcepage")->getValue(); bool ok = false; tesseract::TessBaseAPI tess = initTesseract(m_curLang.prefix.toLocal8Bit().constData(), &ok); if(ok) { QString failed; tess.SetPageSegMode(static_cast(m_psmCheckGroup->checkedAction()->data().toInt())); if(m_charListDialogUi.radioButtonWhitelist->isChecked()) { tess.SetVariable("tessedit_char_whitelist", m_charListDialogUi.lineEditWhitelist->text().toLocal8Bit()); } if(m_charListDialogUi.radioButtonBlacklist->isChecked()) { tess.SetVariable("tessedit_char_blacklist", m_charListDialogUi.lineEditBlacklist->text().toLocal8Bit()); } 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))); PageData pageData; pageData.success = false; QMetaObject::invokeMethod(this, "setPage", Qt::BlockingQueuedConnection, Q_RETURN_ARG(PageData, pageData), Q_ARG(int, page), Q_ARG(bool, autodetectLayout)); if(!pageData.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 = pageData.filename; readSessionData->page = pageData.page; readSessionData->angle = pageData.angle; readSessionData->resolution = pageData.resolution; bool firstChunk = true; bool newFile = readSessionData->file != prevFile; prevFile = readSessionData->file; for(const QImage& image : pageData.ocrAreas) { 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.cancelled()) { MAIN->getOutputEditor()->read(tess, readSessionData); } } QMetaObject::invokeMethod(MAIN, "popState", Qt::QueuedConnection); monitor.increaseProgress(); if(monitor.cancelled()) { 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) { bool ok = false; tesseract::TessBaseAPI tess = initTesseract(m_curLang.prefix.toLocal8Bit().constData(), &ok); if(!ok) { 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.cancelled()) { 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.cancelled()) { char* text = tess.GetUTF8Text(); output = QString::fromUtf8(text); delete[] text; return true; } return false; }, _("Recognizing..."))) { QApplication::clipboard()->setText(output); } } MAIN->hideProgress(); return true; } Recognizer::PageData Recognizer::setPage(int page, bool autodetectLayout) { PageData pageData; pageData.success = MAIN->getDisplayer()->setup(&page); if(pageData.success) { if(autodetectLayout) { MAIN->getDisplayer()->autodetectOCRAreas(); } pageData.filename = MAIN->getDisplayer()->getCurrentImage(pageData.page); pageData.angle = MAIN->getDisplayer()->getCurrentAngle(); pageData.resolution = MAIN->getDisplayer()->getCurrentResolution(); pageData.ocrAreas = MAIN->getDisplayer()->getOCRAreas(); } return pageData; } 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); } gImageReader-3.3.1/qt/src/Recognizer.hh000066400000000000000000000055371351740627400177200ustar00rootroot00000000000000/* -*- Mode: C++; indent-tabs-mode: t; c-basic-offset: 4; tab-width: 4 -*- */ /* * Recognizer.hh * Copyright (C) 2013-2019 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" #include "ui_CharacterListDialog.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 }; struct PageData { bool success; QString filename; int page; double angle; int resolution; QList ocrAreas; }; const UI_MainWindow& ui; QMenu* m_menuPages = nullptr; QMenu* m_menuMultilanguage = nullptr; QDialog* m_pagesDialog; Ui::PageRangeDialog m_pagesDialogUi; QDialog* m_charListDialog; Ui::CharacterListDialog m_charListDialogUi; 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; tesseract::TessBaseAPI initTesseract(const char* language = nullptr, bool* ok = 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 manageCharacterLists(); void psmSelected(QAction* action); void recognizeButtonClicked(); void recognizeCurrentPage(); void recognizeMultiplePages(); void setLanguage(); void setMultiLanguage(); PageData setPage(int page, bool autodetectLayout); }; #endif // RECOGNIZER_HPP gImageReader-3.3.1/qt/src/Scanner.cc000066400000000000000000000015721351740627400171630ustar00rootroot00000000000000/* -*- Mode: C++; indent-tabs-mode: t; c-basic-offset: 4; tab-width: 4 -*- */ /* * Scanner.cc * Copyright (C) 2013-2019 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.3.1/qt/src/Scanner.hh000066400000000000000000000034751351740627400172010ustar00rootroot00000000000000/* -*- Mode: C++; indent-tabs-mode: t; c-basic-offset: 4; tab-width: 4 -*- */ /* * Scanner.hh * Copyright (C) 2013-2019 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.3.1/qt/src/SearchReplaceFrame.cc000066400000000000000000000047711351740627400212520ustar00rootroot00000000000000/* -*- Mode: C++; indent-tabs-mode: t; c-basic-offset: 4; tab-width: 4 -*- */ /* * SearchReplaceFrame.cc * Copyright (C) 2013-2019 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 "SearchReplaceFrame.hh" #include "SubstitutionsManager.hh" SearchReplaceFrame::SearchReplaceFrame(QWidget* parent, Qt::WindowFlags f) : QFrame(parent, f) { ui.setupUi(this); m_substitutionsManager = new SubstitutionsManager(this); connect(ui.checkBoxMatchCase, SIGNAL(toggled(bool)), this, SLOT(clearErrorState())); connect(ui.lineEditSearch, SIGNAL(textChanged(QString)), this, SLOT(clearErrorState())); connect(ui.lineEditSearch, SIGNAL(returnPressed()), this, SLOT(findNext())); connect(ui.lineEditReplace, SIGNAL(returnPressed()), this, SLOT(replaceNext())); connect(ui.toolButtonFindNext, SIGNAL(clicked()), this, SLOT(findNext())); connect(ui.toolButtonFindPrev, SIGNAL(clicked()), this, SLOT(findPrev())); connect(ui.toolButtonReplace, SIGNAL(clicked()), this, SLOT(replaceNext())); connect(ui.toolButtonReplaceAll, SIGNAL(clicked()), this, SLOT(emitReplaceAll())); connect(ui.pushButtonSubstitutions, SIGNAL(clicked()), m_substitutionsManager, SLOT(show())); connect(ui.pushButtonSubstitutions, SIGNAL(clicked()), m_substitutionsManager, SLOT(raise())); connect(m_substitutionsManager, SIGNAL(applySubstitutions(QMap)), this, SLOT(emitApplySubstitutions(QMap))); ADD_SETTING(SwitchSetting("searchmatchcase", ui.checkBoxMatchCase)); } void SearchReplaceFrame::clear() { ui.lineEditSearch->clear(); ui.lineEditReplace->clear(); } void SearchReplaceFrame::clearErrorState() { ui.lineEditSearch->setStyleSheet(""); } void SearchReplaceFrame::setErrorState() { ui.lineEditSearch->setStyleSheet("background: #FF7777; color: #FFFFFF;"); } void SearchReplaceFrame::hideSubstitutionsManager() { m_substitutionsManager->hide(); } gImageReader-3.3.1/qt/src/SearchReplaceFrame.hh000066400000000000000000000045741351740627400212650ustar00rootroot00000000000000/* -*- Mode: C++; indent-tabs-mode: t; c-basic-offset: 4; tab-width: 4 -*- */ /* * SearchReplaceFrame.hh * Copyright (C) 2013-2019 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 SEARCHREPLACEFRAME_HH #define SEARCHREPLACEFRAME_HH #include "common.hh" #include "ui_SearchReplaceFrame.h" #include class SubstitutionsManager; class SearchReplaceFrame : public QFrame { Q_OBJECT public: explicit SearchReplaceFrame(QWidget* parent = nullptr, Qt::WindowFlags f = Qt::WindowFlags()); public slots: void clear(); void clearErrorState(); void setErrorState(); void hideSubstitutionsManager(); signals: void findReplace(const QString& searchstr, const QString& replacestr, bool matchCase, bool backwards, bool replace); void replaceAll(const QString& searchstr, const QString& replacestr, bool matchCase); void applySubstitutions(const QMap& substitutions, bool matchCase); private: Ui::SearchReplaceFrame ui; SubstitutionsManager* m_substitutionsManager; private slots: void findNext() { emit findReplace(ui.lineEditSearch->text(), ui.lineEditReplace->text(), ui.checkBoxMatchCase->isChecked(), false, false); } void findPrev() { emit findReplace(ui.lineEditSearch->text(), ui.lineEditReplace->text(), ui.checkBoxMatchCase->isChecked(), true, false); } void replaceNext() { emit findReplace(ui.lineEditSearch->text(), ui.lineEditReplace->text(), ui.checkBoxMatchCase->isChecked(), false, true); } void emitReplaceAll() { emit replaceAll(ui.lineEditSearch->text(), ui.lineEditReplace->text(), ui.checkBoxMatchCase->isChecked()); } void emitApplySubstitutions(const QMap& substitutions) { emit applySubstitutions(substitutions, ui.checkBoxMatchCase->isChecked()); } }; #endif // SEARCHREPLACEFRAME_HH gImageReader-3.3.1/qt/src/SourceManager.cc000066400000000000000000000305441351740627400203260ustar00rootroot00000000000000/* -*- Mode: C++; indent-tabs-mode: t; c-basic-offset: 4; tab-width: 4 -*- */ /* * SourceManager.cc * Copyright (C) 2013-2019 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 #if QT_VERSION < QT_VERSION_CHECK(5, 0, 0) #include #else #include #endif #include "ConfigSettings.hh" #include "FileDialogs.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))); ADD_SETTING(VarSetting("recentitems")); qRegisterMetaType("Source*"); qRegisterMetaTypeStreamOperators("Source*"); } SourceManager::~SourceManager() { clearSources(); } int SourceManager::addSources(const QStringList& files, bool suppressTextWarning) { QString failed; QListWidgetItem* item = nullptr; QStringList recentItems = ConfigSettings::get>("recentitems")->getValue(); int added = 0; QStringList filesWithText; for(const QString& filename : files) { if(!QFile(filename).exists()) { failed += "\n " + filename; continue; } item = ui.listWidgetSources->currentItem(); bool contains = item ? item->toolTip() == filename : false; for(int row = 0, nRows = ui.listWidgetSources->count(); !contains && row < nRows; ++row) { if(ui.listWidgetSources->item(row)->toolTip() == filename) { item = ui.listWidgetSources->item(row); contains = true; } } if(contains) { ++added; continue; } Source* source = new Source(filename, QFileInfo(filename).fileName()); if(source->path.endsWith(".pdf", Qt::CaseInsensitive) && !checkPdfSource(source, filesWithText)) { delete source; continue; } item = new QListWidgetItem(QFileInfo(filename).fileName(), ui.listWidgetSources); item->setToolTip(filename); item->setData(Qt::UserRole, QVariant::fromValue(source)); m_fsWatcher.addPath(filename); recentItems.removeAll(filename); recentItems.prepend(filename); ++added; } if(!suppressTextWarning && !filesWithText.empty()) { QMessageBox::information(MAIN->getInstance(), _("PDFs with text"), _("These PDF files already contain text:\n%1").arg(filesWithText.join('\n'))); } ConfigSettings::get>("recentitems")->setValue(recentItems); 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)); } return added; } bool SourceManager::checkPdfSource(Source* source, QStringList& filesWithText) const { std::unique_ptr document(Poppler::Document::load(source->path)); // Unlock if necessary if(document->isLocked()) { bool ok = false; QString message = QString(_("Enter password for file '%1':")).arg(QFileInfo(source->path).fileName()); QString text; while(true) { text = QInputDialog::getText(MAIN, _("Protected PDF"), message, QLineEdit::Password, text, &ok); if(!ok) { return false; } if(!document->unlock(text.toLocal8Bit(), text.toLocal8Bit())) { source->password = text.toLocal8Bit(); break; } } } // Check whether the PDF already contains text for (int i = 0, n = document->numPages(); i < n; ++i) { if(!document->page(i)->text(QRectF()).isEmpty()) { filesWithText.append(source->path); break; } } // Extract document metadata source->author = document->author(); source->creator = document->creator(); source->keywords = document->keywords(); source->producer = document->producer(); source->title = document->title(); source->subject = document->subject(); document->getPdfVersion(&source->pdfVersionMajor, &source->pdfVersionMinor); return true; } 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 : ConfigSettings::get>("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 initialFolder; if(!current.isEmpty() && !current.front()->isTemp) { initialFolder = QFileInfo(current.front()->path).absolutePath(); } QSet formats; for(const QByteArray& format : QImageReader::supportedImageFormats()) { formats.insert(QString("*.%1").arg(QString(format).toLower())); } formats.insert("*.pdf"); formats.insert("*.djvu"); QString filter = QString("%1 (%2)").arg(_("Images and PDFs")).arg(QStringList(formats.toList()).join(" ")); addSources(FileDialogs::openDialog(_("Select Files"), initialFolder, "sourcedir", filter, true)); } 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, QByteArray(), 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.3.1/qt/src/SourceManager.hh000066400000000000000000000053141351740627400203350ustar00rootroot00000000000000/* -*- Mode: C++; indent-tabs-mode: t; c-basic-offset: 4; tab-width: 4 -*- */ /* * SourceManager.hh * Copyright (C) 2013-2019 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, const QByteArray& _password = "", bool _isTemp = false) : path(_path), displayname(_displayname), password(_password), isTemp(_isTemp) {} QString path; QString displayname; QByteArray password; bool isTemp; int brightness = 0; int contrast = 0; int resolution = -1; int page = 1; QVector angle; bool invert = false; //Additional info from original file QString author, title, creator, producer, keywords, subject; int pdfVersionMajor = -1, pdfVersionMinor = -1; }; class SourceManager : public QObject { Q_OBJECT public: SourceManager(const UI_MainWindow& _ui); ~SourceManager(); QList getSelectedSources() const; void addSourceImage(const QImage& image); int addSources(const QStringList& files, bool suppressTextWarning = false); public slots: bool addSource(const QString& file, bool suppressTextWarning = false) { return addSources(QStringList() << file, suppressTextWarning) == 1; } signals: void sourceChanged(); private: const UI_MainWindow& ui; QMenu* m_recentMenu; QFileSystemWatcher m_fsWatcher; int m_screenshotCount = 0; int m_pasteCount = 0; bool checkPdfSource(Source* source, QStringList& filesWithText) const; 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.3.1/qt/src/SubstitutionsManager.cc000066400000000000000000000166611351740627400217710ustar00rootroot00000000000000/* -*- Mode: C++; indent-tabs-mode: t; c-basic-offset: 4; tab-width: 4 -*- */ /* * SubstitutionsManager.cc * Copyright (C) 2013-2019 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 "ConfigSettings.hh" #include "FileDialogs.hh" #include "MainWindow.hh" #include "OutputTextEdit.hh" #include "SubstitutionsManager.hh" #include "Utils.hh" SubstitutionsManager::SubstitutionsManager(QWidget* parent) : QDialog(parent) { setWindowTitle(_("Substitutions")); 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(emitApplySubstitutions())); 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))); ADD_SETTING(TableSetting("substitutionslist", m_tableWidget)); } SubstitutionsManager::~SubstitutionsManager() { ConfigSettings::get("substitutionslist")->serialize(); } void SubstitutionsManager::openList() { if(!clearList()) { return; } QString dir = !m_currentFile.isEmpty() ? QFileInfo(m_currentFile).absolutePath() : ""; QStringList files = FileDialogs::openDialog(_("Open Substitutions List"), dir, "auxdir", QString("%1 (*.txt)").arg(_("Substitutions List")), false, this); if(!files.isEmpty()) { QString filename = files.front(); QFile file(filename); if(!file.open(QIODevice::ReadOnly)) { QMessageBox::critical(this, _("Error Reading File"), _("Unable to read '%1'.").arg(filename)); return; } m_currentFile = filename; 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); if(errors) { QMessageBox::warning(this, _("Errors Occurred Reading File"), _("Some entries of the substitutions list could not be read.")); } } } bool SubstitutionsManager::saveList() { QString filename = FileDialogs::saveDialog(_("Save Substitutions List"), m_currentFile, "auxdir", QString("%1 (*.txt)").arg(_("Substitutions List")), false, this); 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; 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); } 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); } void SubstitutionsManager::onTableSelectionChanged(const QItemSelection& selected, const QItemSelection& /*deselected*/) { m_removeAction->setEnabled(!selected.isEmpty()); } void SubstitutionsManager::emitApplySubstitutions() { QMap substitutions; for(int row = 0, nRows = m_tableWidget->rowCount(); row < nRows; ++row) { substitutions.insert(m_tableWidget->item(row, 0)->text(), m_tableWidget->item(row, 1)->text()); } emit applySubstitutions(substitutions); } gImageReader-3.3.1/qt/src/SubstitutionsManager.hh000066400000000000000000000030531351740627400217720ustar00rootroot00000000000000/* -*- Mode: C++; indent-tabs-mode: t; c-basic-offset: 4; tab-width: 4 -*- */ /* * SubstitutionsManager.hh * Copyright (C) 2013-2019 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(QWidget* parent = nullptr); ~SubstitutionsManager(); signals: void applySubstitutions(const QMap& substitutions); private: QAction* m_removeAction; QString m_currentFile; QTableWidget* m_tableWidget; private slots: void addRow(); void emitApplySubstitutions(); bool clearList(); void onTableSelectionChanged(const QItemSelection& selected, const QItemSelection& deselected); void openList(); void removeRows(); bool saveList(); }; #endif // SUBSTITUTIONS_MANAGER_HH gImageReader-3.3.1/qt/src/TessdataManager.cc000066400000000000000000000306341351740627400206360ustar00rootroot00000000000000/* -*- Mode: C++; indent-tabs-mode: t; c-basic-offset: 4; tab-width: 4 -*- */ /* * TessdataManager.hh * Copyright (C) 2013-2019 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 #define USE_STD_NAMESPACE #include #undef USE_STD_NAMESPACE #include "ConfigSettings.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"), _("A session connection to the PackageKit backend is required for managing system-wide tesseract language packs, but it was not found. This service is usually provided by a software-management application such as Gnome Software. Please install software which provides the necessary PackageKit interface, use other system package management software to manage the tesseract language packs directly, or switch to using 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 #if TESSERACT_VERSION >= TESSERACT_MAKE_VERSION(4, 0, 0) QUrl url("https://api.github.com/repos/tesseract-ocr/tessdata_fast/tags"); #else QUrl url("https://api.github.com/repos/tesseract-ocr/tessdata/tags"); #endif QByteArray data = Utils::download(url, messages); if(data.isEmpty()) { messages = _("Failed to fetch list of available languages: %1").arg(messages); return false; } QString tessdataVer; int bestMatchDist = std::numeric_limits::max(); static const QRegExp verRegEx("^[vV]?(\\d+).(\\d+).(\\d+)-?(\\w?.*)$"); #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(verRegEx.indexIn(tag) != -1) { int tagVer = TESSERACT_MAKE_VERSION(verRegEx.cap(1).toInt(), verRegEx.cap(2).toInt(), verRegEx.cap(3).toInt()); int dist = TESSERACT_VERSION - tagVer; if(dist >= 0 && dist < bestMatchDist) { bestMatchDist = dist; tessdataVer = tag; } } } QVector> extraFiles; QList dataUrls; #if TESSERACT_VERSION >= TESSERACT_MAKE_VERSION(4, 0, 0) dataUrls.append(QUrl("https://api.github.com/repos/tesseract-ocr/tessdata_fast/contents?ref=" + tessdataVer)); dataUrls.append(QUrl("https://api.github.com/repos/tesseract-ocr/tessdata_fast/contents/script?ref=" + tessdataVer)); #else dataUrls.append(QUrl("https://api.github.com/repos/tesseract-ocr/tessdata/contents?ref=" + tessdataVer)); #endif for(const QUrl& url : dataUrls) { data = Utils::download(url, messages); if(data.isEmpty()) { continue; } #if QT_VERSION < QT_VERSION_CHECK(5, 0, 0) ok = false; json = parser.parse( data, &ok ).toList(); if(!ok) { continue; } 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()) { continue; } for(const QJsonValue& value : json.array()) { QJsonObject treeObj = value.toObject(); QString fileName = treeObj.value("name").toString(); QString url = treeObj.value("download_url").toString(); #endif QString subdir = ""; // If filename starts with upper case letter, it is a script if(fileName.left(1) == fileName.left(1).toUpper()) { subdir = "script/"; } if(fileName.endsWith(".traineddata")) { QString prefix = subdir + fileName.left(fileName.indexOf(".")); m_languageFiles[prefix].append({subdir + fileName, url}); } else { // Delay decision to determine whether file is a supplementary language file extraFiles.append(qMakePair(subdir + fileName, 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}); } } } if(m_languageFiles.isEmpty()) { messages = _("Failed to fetch list of available languages: %1").arg(messages); return false; } QStringList availableLanguages = MAIN->getRecognizer()->getAvailableLanguages(); QStringList languages = QStringList(m_languageFiles.keys()); qSort(languages.begin(), languages.end(), [](const QString & s1, const QString & s2) { bool s1Script = s1.startsWith("script") || s1.left(1) == s1.left(1).toUpper(); bool s2Script = s2.startsWith("script") || s2.left(1) == s2.left(1).toUpper(); if(s1Script != s2Script) { return !s1Script; } else { return s1 < s2; } }); for(const QString& prefix : languages) { Config::Lang lang; lang.prefix = prefix; QString label; if(MAIN->getConfig()->searchLangSpec(lang)) { label = lang.name; } else { label = lang.prefix; } QListWidgetItem* item = new QListWidgetItem(label); item->setData(Qt::UserRole, lang.prefix); item->setCheckState(availableLanguages.contains(lang.prefix) ? Qt::Checked : Qt::Unchecked); m_languageList->addItem(item); } return true; } void TessdataManager::applyChanges() { MAIN->pushState(MainWindow::State::Busy, _("Applying changes...")); setEnabled(false); 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; QDir scriptDir = QDir(tessDataDir.absoluteFilePath("script")); if(!QDir().mkpath(tessDataDir.absoluteFilePath("script"))) { 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)) { QFile file(QDir(tessDataDir).absoluteFilePath(langFile.name)); if(!file.exists()) { MAIN->pushState(MainWindow::State::Busy, _("Downloading %1...").arg(langFile.name)); QString messages; QByteArray data = Utils::download(QUrl(langFile.url), messages); 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)) { for(const LangFile& langFile : m_languageFiles.value(prefix)) { if(!QFile(QDir(tessDataDir).absoluteFilePath(langFile.name)).remove()) { errors.append(langFile.name); } } } } } if(!errors.isEmpty()) { errorMsg = _("The following files could not be downloaded or removed:\n%1\n\nCheck the connectivity and directory permissions.\nHint: If you don't have write permissions in system folders, you can switch to user paths in the settings dialog.").arg(errors.join("\n")); } } 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.3.1/qt/src/TessdataManager.hh000066400000000000000000000024501351740627400206430ustar00rootroot00000000000000/* -*- Mode: C++; indent-tabs-mode: t; c-basic-offset: 4; tab-width: 4 -*- */ /* * TessdataManager.hh * Copyright (C) 2013-2019 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.3.1/qt/src/Ui_MainWindow.hh000066400000000000000000000217651351740627400203230ustar00rootroot00000000000000#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* actionManageLanguages; 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->setToolTip(gettext("Select 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); actionManageLanguages = new QAction(QIcon::fromTheme("applications-education-language"), gettext("Manage Languages"), MainWindow); menuAppMenu->addAction(actionManageLanguages); 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.3.1/qt/src/Ui_OutputEditorText.hh000066400000000000000000000143571351740627400215620ustar00rootroot00000000000000#ifndef UI_OUTPUTEDITORTEXT_HH #define UI_OUTPUTEDITORTEXT_HH #include "common.hh" #include "OutputTextEdit.hh" #include "SearchReplaceFrame.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; OutputTextEdit* plainTextEditOutput; SearchReplaceFrame* searchFrame; 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); searchFrame = new SearchReplaceFrame(widget); searchFrame->setVisible(false); widget->layout()->addWidget(searchFrame); plainTextEditOutput = new OutputTextEdit(widget); widget->layout()->addWidget(plainTextEditOutput); } }; #endif // UI_OUTPUTEDITORTEXT_HH gImageReader-3.3.1/qt/src/Utils.cc000066400000000000000000000145721351740627400166760ustar00rootroot00000000000000/* -*- Mode: C++; indent-tabs-mode: t; c-basic-offset: 4; tab-width: 4 -*- */ /* * Utils.cc * Copyright (C) 2013-2019 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 "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(documentsFolder).exists()) ? 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()) { 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()) { MAIN->getSourceManager()->addSourceImage(qvariant_cast(mimeData->imageData())); return; } QList formats = QImageReader::supportedImageFormats(); formats.append("pdf"); formats.append("djvu"); 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) { // If it is already a valid code, return it if(QRegExp("[a-z]{2,}(_[A-Z]{2,})?").exactMatch(lang)) { return lang; } // Treat the language as a tesseract lang spec and try to find a matching code Config::Lang langspec = {lang}; if(!lang.isEmpty() && MAIN->getConfig()->searchLangSpec(langspec)) { return langspec.code; } // 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.3.1/qt/src/Utils.hh000066400000000000000000000042631351740627400167040ustar00rootroot00000000000000/* -*- Mode: C++; indent-tabs-mode: t; c-basic-offset: 4; tab-width: 4 -*- */ /* * Utils.hh * Copyright (C) 2013-2019 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; #ifdef MAKE_VERSION #define TESSERACT_MAKE_VERSION(maj,min,patch) MAKE_VERSION((maj),(min),(patch)) #else #define TESSERACT_MAKE_VERSION(maj,min,patch) ((maj) << 16 | (min) << 8 | (patch)) #endif 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.3.1/qt/src/common.hh000066400000000000000000000016141351740627400170710ustar00rootroot00000000000000/* -*- Mode: C++; indent-tabs-mode: t; c-basic-offset: 4; tab-width: 4 -*- */ /* * common.hh * Copyright (C) 2013-2019 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.3.1/qt/src/hocr/000077500000000000000000000000001351740627400162115ustar00rootroot00000000000000gImageReader-3.3.1/qt/src/hocr/DisplayerToolHOCR.cc000066400000000000000000000104671351740627400217760ustar00rootroot00000000000000/* -*- Mode: C++; indent-tabs-mode: t; c-basic-offset: 4; tab-width: 4 -*- */ /* * DisplayerToolHOCR.cc * Copyright (C) 2016-2019 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) { displayer->setCursor(Qt::ArrowCursor); MAIN->getRecognizer()->setRecognizeMode(_("Recognize")); } DisplayerToolHOCR::~DisplayerToolHOCR() { clearSelection(); } QList DisplayerToolHOCR::getOCRAreas() { return QList() << m_displayer->getImage(m_displayer->getSceneBoundingRect()); } void DisplayerToolHOCR::mousePressEvent(QMouseEvent* event) { m_pressed = true; if(event->button() == Qt::LeftButton && m_currentAction >= ACTION_DRAW_GRAPHIC_RECT && m_currentAction <= ACTION_DRAW_WORD_RECT) { clearSelection(); m_selection = new DisplayerSelection(this, m_displayer->mapToSceneClamped(event->pos())); connect(m_selection, SIGNAL(geometryChanged(QRectF)), this, SLOT(selectionChanged(QRectF))); m_displayer->scene()->addItem(m_selection); event->accept(); } } void DisplayerToolHOCR::mouseMoveEvent(QMouseEvent* event) { if(m_selection && m_currentAction >= ACTION_DRAW_GRAPHIC_RECT && m_currentAction <= ACTION_DRAW_WORD_RECT) { QPointF p = m_displayer->mapToSceneClamped(event->pos()); m_selection->setPoint(p); m_displayer->ensureVisible(QRectF(p, p)); event->accept(); } } void DisplayerToolHOCR::mouseReleaseEvent(QMouseEvent* event) { // Don't do anything if the release event does not follow a press event... if(!m_pressed) { return; } m_pressed = false; if(m_selection && m_currentAction >= ACTION_DRAW_GRAPHIC_RECT && m_currentAction <= ACTION_DRAW_WORD_RECT) { if(m_selection->rect().width() < 5.0 || m_selection->rect().height() < 5.0) { clearSelection(); } else { QRect r = m_selection->rect().translated(-m_displayer->getSceneBoundingRect().toRect().topLeft()).toRect(); emit bboxDrawn(r, m_currentAction); } event->accept(); } else { QPoint p = m_displayer->mapToSceneClamped(event->pos()).toPoint(); emit positionPicked(p); } setAction(ACTION_NONE, false); } void DisplayerToolHOCR::setAction(Action action, bool clearSel) { if(action != m_currentAction) { emit actionChanged(action); } if(clearSel) { clearSelection(); } m_currentAction = action; if(m_currentAction >= ACTION_DRAW_GRAPHIC_RECT && m_currentAction <= ACTION_DRAW_WORD_RECT) { m_displayer->setCursor(Qt::CrossCursor); } else { m_displayer->setCursor(Qt::ArrowCursor); } } void DisplayerToolHOCR::setSelection(const QRect& rect, const QRect& minRect) { setAction(ACTION_NONE, false); QRect r = rect.translated(m_displayer->getSceneBoundingRect().toRect().topLeft()); QRect mr = minRect.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()); m_selection->setMinimumRect(mr); m_displayer->ensureVisible(m_selection); } QImage DisplayerToolHOCR::getSelection(const QRect& rect) const { 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 bboxChanged(r); } gImageReader-3.3.1/qt/src/hocr/DisplayerToolHOCR.hh000066400000000000000000000043101351740627400217760ustar00rootroot00000000000000/* -*- Mode: C++; indent-tabs-mode: t; c-basic-offset: 4; tab-width: 4 -*- */ /* * DisplayerToolHOCR.hh * Copyright (C) 2016-2019 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: enum Action {ACTION_NONE, ACTION_DRAW_GRAPHIC_RECT, ACTION_DRAW_CAREA_RECT, ACTION_DRAW_PAR_RECT, ACTION_DRAW_LINE_RECT, ACTION_DRAW_WORD_RECT}; DisplayerToolHOCR(Displayer* displayer, QObject* parent = 0); ~DisplayerToolHOCR(); QList getOCRAreas() override; void pageChanged() override { emit displayedSourceChanged(); reset(); } void resolutionChanged(double /*factor*/) override { reset(); } void rotationChanged(double /*delta*/) override { reset(); } void reset() override { setAction(ACTION_NONE, true); } void mousePressEvent(QMouseEvent* event) override; void mouseMoveEvent(QMouseEvent* event) override; void mouseReleaseEvent(QMouseEvent* event) override; void setAction(Action action, bool clearSel = true); void setSelection(const QRect& rect, const QRect& minRect); QImage getSelection(const QRect& rect) const; void clearSelection(); signals: void displayedSourceChanged(); void bboxDrawn(QRect rect, int action); void bboxChanged(QRect rect); void positionPicked(QPoint pos); void actionChanged(int action); private: DisplayerSelection* m_selection = nullptr; Action m_currentAction = ACTION_NONE; bool m_pressed = false; private slots: void selectionChanged(QRectF rect); }; #endif // DISPLAYERTOOLHOCR_HH gImageReader-3.3.1/qt/src/hocr/HOCRDocument.cc000066400000000000000000000756451351740627400207730ustar00rootroot00000000000000/* -*- Mode: C++; indent-tabs-mode: t; c-basic-offset: 4; tab-width: 4 -*- */ /* * HOCRDocument.cc * Copyright (C) 2013-2019 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 "common.hh" #include "HOCRDocument.hh" #include "Utils.hh" HOCRDocument::HOCRDocument(QtSpell::TextEditChecker* spell, QObject* parent) : QAbstractItemModel(parent), m_spell(spell) { } HOCRDocument::~HOCRDocument() { qDeleteAll(m_pages); } void HOCRDocument::clear() { beginResetModel(); qDeleteAll(m_pages); m_pages.clear(); m_pageIdCounter = 0; endResetModel(); } void HOCRDocument::recheckSpelling() { recursiveDataChanged(QModelIndex(), {Qt::DisplayRole}, {"ocrx_word"}); } QString HOCRDocument::toHTML() const { QString html = "\n"; for(const HOCRPage* page : m_pages) { html += page->toHtml(1); } html += "\n"; return html; } QModelIndex HOCRDocument::addPage(const QDomElement& pageElement, bool cleanGraphics) { int newRow = m_pages.size(); beginInsertRows(QModelIndex(), newRow, newRow); m_pages.append(new HOCRPage(pageElement, ++m_pageIdCounter, m_defaultLanguage, cleanGraphics, m_pages.size())); endInsertRows(); emit dataChanged(index(0, 0), index(m_pages.size() - 1, 0), {Qt::DisplayRole}); return index(newRow, 0); } bool HOCRDocument::editItemAttribute(const QModelIndex& index, const QString& name, const QString& value, const QString& attrItemClass) { HOCRItem* item = mutableItemAtIndex(index); if(!item) { return false; } item->setAttribute(name, value, attrItemClass); if(name == "title:x_wconf") { QModelIndex colIdx = index.sibling(index.row(), 1); emit dataChanged(colIdx, colIdx, {Qt::DisplayRole}); } if(name == "lang") { recursiveDataChanged(index, {Qt::DisplayRole}, {"ocrx_word"}); } emit itemAttributeChanged(index, name, value); if(name == "title:bbox") { recomputeBBoxes(item->parent()); } return true; } // Might be more logical to accept oldParent and oldRow as parameters rather than itemIndex // (since we need them anyway), if all our callers are likely to know them. Swap does; drag&drop might not. QModelIndex HOCRDocument::moveItem(const QModelIndex& itemIndex, const QModelIndex& newParent, int newRow) { HOCRItem* item = mutableItemAtIndex(itemIndex); HOCRItem* parentItem = mutableItemAtIndex(newParent); if(!item || (!parentItem && item->itemClass() != "ocr_page")) { return QModelIndex(); } QModelIndex ancestor = newParent; while(ancestor.isValid()) { if(ancestor == itemIndex) { return QModelIndex(); } ancestor = ancestor.parent(); } int oldRow = itemIndex.row(); QModelIndex oldParent = itemIndex.parent(); if(oldParent == newParent && oldRow < newRow) { --newRow; } beginRemoveRows(oldParent, oldRow, oldRow); takeItem(item); endRemoveRows(); recomputeBBoxes(mutableItemAtIndex(oldParent)); beginInsertRows(newParent, newRow, newRow); insertItem(parentItem, item, newRow); endInsertRows(); recomputeBBoxes(parentItem); return itemIndex; } QModelIndex HOCRDocument::swapItems(const QModelIndex& parent, int firstRow, int secondRow) { moveItem(index(firstRow, 0, parent), parent, secondRow); moveItem(index(secondRow, 0, parent), parent, firstRow); return index(firstRow, 0, parent); } QModelIndex HOCRDocument::mergeItems(const QModelIndex& parent, int startRow, int endRow) { if(endRow - startRow <= 0) { return QModelIndex(); } QModelIndex targetIndex = parent.child(startRow, 0); HOCRItem* targetItem = mutableItemAtIndex(targetIndex); if(!targetItem || targetItem->itemClass() == "ocr_page") { return QModelIndex(); } QRect bbox = targetItem->bbox(); if(targetItem->itemClass() == "ocrx_word") { // Merge word items: join text, merge bounding boxes QString text = targetItem->text(); beginRemoveRows(parent, startRow + 1, endRow); for(int row = ++startRow; row <= endRow; ++row) { HOCRItem* item = mutableItemAtIndex(parent.child(startRow, 0)); Q_ASSERT(item); text += item->text(); bbox = bbox.united(item->bbox()); deleteItem(item); } endRemoveRows(); targetItem->setText(text); emit dataChanged(targetIndex, targetIndex, {Qt::DisplayRole, Qt::ForegroundRole}); } else { // Merge other items: merge dom trees and bounding boxes QVector moveChilds; beginRemoveRows(parent, startRow + 1, endRow); for(int row = ++startRow; row <= endRow; ++row) { HOCRItem* item = mutableItemAtIndex(parent.child(startRow, 0)); Q_ASSERT(item); moveChilds.append(item->takeChildren()); bbox = bbox.united(item->bbox()); deleteItem(item); } endRemoveRows(); int pos = targetItem->children().size(); beginInsertRows(targetIndex, pos, pos + moveChilds.size() - 1); for(HOCRItem* child : moveChilds) { targetItem->addChild(child); } endInsertRows(); } QString bboxstr = QString("%1 %2 %3 %4").arg(bbox.left()).arg(bbox.top()).arg(bbox.right()).arg(bbox.bottom()); targetItem->setAttribute("title:bbox", bboxstr); emit itemAttributeChanged(targetIndex, "title:bbox", bboxstr); return targetIndex; } QModelIndex HOCRDocument::splitItem(const QModelIndex& index, int startRow, int endRow) { if(endRow - startRow < 0) { return QModelIndex(); } HOCRItem* item = mutableItemAtIndex(index); if(!item) { return QModelIndex(); } QString itemClass = item->itemClass(); QDomDocument doc; QDomElement newElement; if(itemClass == "ocr_carea") { newElement = doc.createElement("div"); } else if(itemClass == "ocr_par") { newElement = doc.createElement("p"); } else if(itemClass == "ocr_line") { newElement = doc.createElement("span"); } else { return QModelIndex(); } newElement.setAttribute("class", itemClass); newElement.setAttribute("title", HOCRItem::serializeAttrGroup(item->getTitleAttributes())); HOCRItem* newItem = new HOCRItem(newElement, item->page(), item->parent(), item->index() + 1); beginInsertRows(index.parent(), item->index() + 1, item->index() + 1); insertItem(item->parent(), newItem, item->index() + 1); endInsertRows(); QModelIndex newIndex = index.sibling(index.row() + 1, 0); for(int row = 0; row <= (endRow - startRow); ++row) { QModelIndex childIndex = index.child(startRow, 0); HOCRItem* child = mutableItemAtIndex(childIndex); Q_ASSERT(child); moveItem(childIndex, newIndex, row); } return newIndex; } QModelIndex HOCRDocument::addItem(const QModelIndex& parent, const QDomElement& element) { HOCRItem* parentItem = mutableItemAtIndex(parent); if(!parentItem) { return QModelIndex(); } HOCRItem* item = new HOCRItem(element, parentItem->page(), parentItem); int pos = parentItem->children().size(); beginInsertRows(parent, pos, pos); parentItem->addChild(item); recomputeBBoxes(parentItem); endInsertRows(); return index(pos, 0, parent); } bool HOCRDocument::removeItem(const QModelIndex& index) { HOCRItem* item = mutableItemAtIndex(index); if(!item) { return false; } HOCRItem* parentItem = item->parent(); beginRemoveRows(index.parent(), index.row(), index.row()); deleteItem(item); endRemoveRows(); recomputeBBoxes(parentItem); return true; } QModelIndex HOCRDocument::nextIndex(const QModelIndex& current) { QModelIndex idx = current; // If the current index is invalid return first index if(!idx.isValid()) { return index(0, 0); } // If item has children, return first child if(rowCount(idx) > 0) { return idx.child(0, 0); } // Return next possible sibling QModelIndex next = idx.sibling(idx.row() + 1, 0); while(idx.isValid() && !next.isValid()) { idx = idx.parent(); next = idx.sibling(idx.row() + 1, 0); } if(!idx.isValid()) { // Wrap around return index(0, 0); } return next; } QModelIndex HOCRDocument::prevIndex(const QModelIndex& current) { QModelIndex idx = current; // If the current index is invalid return last index if(!idx.isValid()) { return index(rowCount() - 1, 0); } // Return last possible leaf of previous sibling, if any, or parent if(idx.row() > 0) { idx = idx.sibling(idx.row() - 1, 0); } else { if(idx.parent().isValid()) { return idx.parent(); } // Wrap around idx = index(rowCount() - 1, 0); } while(rowCount(idx) > 0) { idx = idx.child(rowCount(idx) - 1, 0); } return idx; } bool HOCRDocument::indexIsMisspelledWord(const QModelIndex& index) const { return !checkItemSpelling(index); } bool HOCRDocument::checkItemSpelling(const QModelIndex& index, QStringList* suggestions, int limit) const { const HOCRItem* item = itemAtIndex(index); if(item->itemClass() != "ocrx_word") { return true; } QString prefix, suffix, trimmed = HOCRItem::trimmedWord(item->text(), &prefix, &suffix); if(trimmed.isEmpty()) { return true; } QString lang = item->spellingLang(); if(m_spell->getLanguage() != lang && !(m_spell->setLanguage(lang))) { return true; } // check word, including (if requested) setting suggestions; handle hyphenated phrases correctly if(checkSpelling(trimmed, suggestions, limit)) { return true; } // handle some hyphenated words // don't bother with words not broken over sibling text lines (ie interrupted by other blocks), it's human hard // don't bother with words broken over three or more lines, it's implausible and this treatment is ^ necessarily incomplete HOCRItem* parent = item->parent(); if(!parent) { return false; } HOCRItem* grandparent = parent->parent(); if(!grandparent) { return false; } int idx = item->index(); int parentIdx = parent->index(); QVector parentSiblings = grandparent->children(); if(idx == 0 && parentIdx > 0) { HOCRItem* parentPrevSibling = parentSiblings.at(parentIdx - 1); if(!parentPrevSibling) { return false; } QVector cousins = parentPrevSibling->children(); if(cousins.size() < 1) { return false; } HOCRItem* prevCousin = cousins.back(); if(!prevCousin || prevCousin->itemClass() != "ocrx_word") { return false; } QString prevText = prevCousin->text(); if(prevText.isEmpty() || prevText[prevText.size() - 1] != '-') { return false; } // don't bother with (reassembled) suggestions for broken words since we can't re-break them return checkSpelling(HOCRItem::trimmedWord(prevText) + trimmed); } QString text = item->text(); if(idx + 1 == parent->children().size() && parentIdx + 1 < parentSiblings.size() && !text.isEmpty() && text[text.size() - 1] == '-') { HOCRItem* parentNextSibling = parentSiblings.at(parentIdx + 1); if(!parentNextSibling) { return false; } QVector cousins = parentNextSibling->children(); if(cousins.size() < 1) { return false; } HOCRItem* nextCousin = cousins.front(); if(!nextCousin || nextCousin->itemClass() != "ocrx_word") { return false; } return checkSpelling(trimmed + HOCRItem::trimmedWord(nextCousin->text())); } return false; } bool HOCRDocument::referencesSource(const QString& filename) const { for(const HOCRPage* page : m_pages) { if(page->sourceFile() == filename) { return true; } } return false; } QModelIndex HOCRDocument::searchPage(const QString& filename, int pageNr) const { for(int iPage = 0, nPages = m_pages.size(); iPage < nPages; ++iPage) { const HOCRPage* page = m_pages[iPage]; if(page->sourceFile() == filename && page->pageNr() == pageNr) { return index(iPage, 0); } } return QModelIndex(); } QModelIndex HOCRDocument::searchAtCanvasPos(const QModelIndex& pageIndex, const QPoint& pos) const { QModelIndex index = pageIndex; if(!index.isValid()) { return QModelIndex(); } const HOCRItem* item = itemAtIndex(index); while(true) { int iChild = 0, nChildren = item->children().size(); for(; iChild < nChildren; ++iChild) { const HOCRItem* childItem = item->children()[iChild]; if(childItem->bbox().contains(pos)) { item = childItem; index = index.child(iChild, 0); break; } } if(iChild == nChildren) { break; } } return index; } void HOCRDocument::convertSourcePaths(const QString& basepath, bool absolute) { for(HOCRPage* page : m_pages) { page->convertSourcePath(basepath, absolute); } } QVariant HOCRDocument::data(const QModelIndex& index, int role) const { if (!index.isValid()) { return QVariant(); } HOCRItem* item = mutableItemAtIndex(index); if(index.column() == 0) { switch (role) { case Qt::DisplayRole: case Qt::EditRole: return displayRoleForItem(item); case Qt::DecorationRole: return decorationRoleForItem(item); case Qt::ForegroundRole: { bool enabled = item->isEnabled(); const HOCRItem* parent = item->parent(); while(enabled && parent) { enabled = parent->isEnabled(); parent = parent->parent(); } if(enabled) { return checkItemSpelling(index) ? QVariant() : QVariant(QColor(Qt::red)); } else { return checkItemSpelling(index) ? QVariant(QColor(Qt::gray)) : QVariant(QColor(208, 80, 82)); } } case Qt::CheckStateRole: return item->isEnabled() ? Qt::Checked : Qt::Unchecked; default: break; } } else if(index.column() == 1) { if(role == Qt::DisplayRole && item->itemClass() == "ocrx_word") { return item->getTitleAttributes()["x_wconf"]; } } return QVariant(); } bool HOCRDocument::setData(const QModelIndex& index, const QVariant& value, int role) { if(!index.isValid()) { return false; } HOCRItem* item = mutableItemAtIndex(index); if(role == Qt::EditRole && item->itemClass() == "ocrx_word") { item->setText(value.toString()); emit dataChanged(index, index, {Qt::DisplayRole, Qt::ForegroundRole}); return true; } else if(role == Qt::CheckStateRole) { item->setEnabled(value == Qt::Checked); emit dataChanged(index, index, {Qt::CheckStateRole}); recursiveDataChanged(index, {Qt::CheckStateRole}); return true; } return false; } void HOCRDocument::recursiveDataChanged(const QModelIndex& parent, const QVector& roles, const QStringList& itemClasses) { int rows = rowCount(parent); if(rows > 0) { QModelIndex firstChild = index(0, 0, parent); QString childItemClass = itemAtIndex(firstChild)->itemClass(); if(itemClasses.isEmpty() || itemClasses.contains(childItemClass)) { emit dataChanged(firstChild, index(rows - 1, 0, parent), roles); } for(int i = 0; i < rows; ++i) { recursiveDataChanged(index(i, 0, parent), roles, itemClasses); } } } void HOCRDocument::recomputeBBoxes(HOCRItem* item) { // Update parent bboxes (except page) while(item && item->parent()) { QRect bbox; for(const HOCRItem* child : item->children()) { bbox = bbox.united(child->bbox()); } QString bboxstr = QString("%1 %2 %3 %4").arg(bbox.left()).arg(bbox.top()).arg(bbox.right()).arg(bbox.bottom()); item->setAttribute("title:bbox", bboxstr); item = item->parent(); } } Qt::ItemFlags HOCRDocument::flags(const QModelIndex& index) const { if (!index.isValid()) { return 0; } HOCRItem* item = mutableItemAtIndex(index); return Qt::ItemIsEnabled | Qt::ItemIsSelectable | Qt::ItemIsUserCheckable | (item->itemClass() == "ocrx_word" && index.column() == 0 ? Qt::ItemIsEditable : Qt::NoItemFlags); } QModelIndex HOCRDocument::index(int row, int column, const QModelIndex& parent) const { if (!hasIndex(row, column, parent)) { return QModelIndex(); } HOCRItem* childItem = nullptr; if(!parent.isValid()) { childItem = m_pages.value(row); } else { HOCRItem* parentItem = mutableItemAtIndex(parent); childItem = parentItem->children().value(row); } return childItem ? createIndex(row, column, childItem) : QModelIndex(); } QModelIndex HOCRDocument::parent(const QModelIndex& child) const { if (!child.isValid()) { return QModelIndex(); } HOCRItem* item = mutableItemAtIndex(child)->parent(); if(!item) { return QModelIndex(); } int row = item->index(); return row >= 0 ? createIndex(row, 0, item) : QModelIndex(); } int HOCRDocument::rowCount(const QModelIndex& parent) const { if (parent.column() > 0) { return 0; } return !parent.isValid() ? m_pages.size() : itemAtIndex(parent)->children().size(); } int HOCRDocument::columnCount(const QModelIndex& /*parent*/) const { return 2; } QString HOCRDocument::displayRoleForItem(const HOCRItem* item) const { QString itemClass = item->itemClass(); if(itemClass == "ocr_page") { const HOCRPage* page = static_cast(item); return QString("%1 (%2 %3/%4)").arg(page->title()).arg(tr("Page")).arg(item->index() + 1).arg(m_pages.size()); } else if(itemClass == "ocr_carea") { return _("Text block"); } else if(itemClass == "ocr_par") { return _("Paragraph"); } else if(itemClass == "ocr_line") { return _("Textline"); } else if(itemClass == "ocrx_word") { return item->text(); } else if(itemClass == "ocr_graphic") { return _("Graphic"); } return ""; } QIcon HOCRDocument::decorationRoleForItem(const HOCRItem* item) const { QString itemClass = item->itemClass(); if(itemClass == "ocr_page") { return QIcon(":/icons/item_page"); } else if(itemClass == "ocr_carea") { return QIcon(":/icons/item_block"); } else if(itemClass == "ocr_par") { return QIcon(":/icons/item_par"); } else if(itemClass == "ocr_line") { return QIcon(":/icons/item_line"); } else if(itemClass == "ocrx_word") { return QIcon(":/icons/item_word"); } else if(itemClass == "ocr_graphic") { return QIcon(":/icons/item_halftone"); } return QIcon(); } bool HOCRDocument::checkSpelling(const QString& trimmed, QStringList* suggestions, int limit) const { QVector words = trimmed.splitRef(QRegExp("[\\x2013\\x2014]+")); int perWordLimit = 0; // s = p^w => w = log_p(c) = log(c)/log(p) => p = 10^(log(c)/w) if(limit > 0) { perWordLimit = int(std::pow(10, std::log10(limit) / words.size())); } QList> wordSuggestions; bool valid = true; bool multipleWords = words.size() > 1; for(const QStringRef& word : words) { QString wordString = word.toString(); bool wordValid = m_spell->checkWord(wordString); valid &= wordValid; if(suggestions) { QList ws = m_spell->getSpellingSuggestions(wordString); if(wordValid && multipleWords) { ws.prepend(wordString); } if(limit == -1) { wordSuggestions.append(ws); } else if(limit > 0) { wordSuggestions.append(ws.mid(0, perWordLimit)); } } } if(suggestions) { suggestions->clear(); QList> suggestionCombinations; generateCombinations(wordSuggestions, suggestionCombinations, 0, QList()); for(const QList& combination : suggestionCombinations) { QString s = ""; const QStringRef* originalWord = words.begin(); int last = 0; int next; for(const QString& suggestedWord : combination) { next = originalWord->position(); s.append(trimmed.midRef(last, next - last)); s.append(suggestedWord); last = next + originalWord->length(); originalWord++; } s.append(trimmed.midRef(last)); suggestions->append(s); } } return valid; } // each suggestion for each word => each word in each suggestion void HOCRDocument::generateCombinations(const QList>& lists, QList>& results, int depth, const QList c) const { if(depth == lists.size()) { results.append(c); return; } for(int i = 0; i < lists[depth].size(); ++i) { generateCombinations(lists, results, depth + 1, c + QList({lists[depth][i]})); } } void HOCRDocument::insertItem(HOCRItem* parent, HOCRItem* item, int i) { if(parent) { parent->insertChild(item, i); } else if(HOCRPage* page = dynamic_cast(item)) { page->m_index = i; m_pages.insert(i++, page); for(int n = m_pages.size(); i < n; ++i) { m_pages[i]->m_index = i; } emit dataChanged(index(page->index(), 0), index(m_pages.size() - 1, 0), {Qt::DisplayRole}); } } void HOCRDocument::deleteItem(HOCRItem* item) { takeItem(item); delete item; } void HOCRDocument::takeItem(HOCRItem* item) { if(item->parent()) { item->parent()->takeChild(item); } else if(HOCRPage* page = dynamic_cast(item)) { int i = page->index(); m_pages.remove(i); for(int n = m_pages.size(); i < n; ++i) { m_pages[i]->m_index = i; } emit dataChanged(index(page->index(), 0), index(m_pages.size() - 1, 0), {Qt::DisplayRole}); } } /////////////////////////////////////////////////////////////////////////////// QMap HOCRItem::s_langCache = QMap(); QMap HOCRItem::deserializeAttrGroup(const QString& string) { QMap attrs; for(const QString& attr : string.split(QRegExp("\\s*;\\s*"))) { int splitPos = attr.indexOf(QRegExp("\\s+")); attrs.insert(attr.left(splitPos), splitPos > 0 ? attr.mid(splitPos + 1) : ""); } return attrs; } QString HOCRItem::serializeAttrGroup(const QMap& attrs) { QStringList list; for(auto it = attrs.begin(), itEnd = attrs.end(); it != itEnd; ++it) { list.append(QString("%1 %2").arg(it.key(), it.value())); } return list.join("; "); } QString HOCRItem::trimmedWord(const QString& word, QString* prefix, QString* suffix) { // correctly trim words with apostrophes or hyphens within them, phrases with dashes, initialisms/acronyms, and numeric citations QRegExp wordRe("^(\\W*)(\\w?|\\w(\\w|[-\\x2013\\x2014'’])*\\w|(\\w+\\.){2,})([\\W\\x00b2\\x00b3\\x00b9\\x2070-\\x207e]*)$"); if(wordRe.indexIn(word) != -1) { if(prefix) { *prefix = wordRe.cap(1); } if(suffix) { *suffix = wordRe.cap(5); } return wordRe.cap(2); } return word; } HOCRItem::HOCRItem(const QDomElement& element, HOCRPage* page, HOCRItem* parent, int index) : m_pageItem(page), m_parentItem(parent), m_index(index) { // Read attrs QDomNamedNodeMap attributes = element.attributes(); for(int i = 0, n = attributes.size(); i < n; ++i) { QString attrName = attributes.item(i).nodeName(); if(attrName == "title") { m_titleAttrs = deserializeAttrGroup(attributes.item(i).nodeValue()); } else { m_attrs[attrName] = attributes.item(i).nodeValue(); } } // Adjust item id based on pageId if(parent) { QString idClass = itemClass().mid(itemClass().indexOf("_") + 1); int counter = page->m_idCounters.value(idClass, 0) + 1; page->m_idCounters[idClass] = counter; QString newId = QString("%1_%2_%3").arg(idClass).arg(page->pageId()).arg(counter); m_attrs["id"] = newId; } // Parse item bbox QStringList bbox = m_titleAttrs["bbox"].split(QRegExp("\\s+")); if(bbox.size() == 4) { m_bbox.setCoords(bbox[0].toInt(), bbox[1].toInt(), bbox[2].toInt(), bbox[3].toInt()); } if(itemClass() == "ocrx_word") { m_text = element.text(); m_bold = !element.elementsByTagName("strong").isEmpty(); m_italic = !element.elementsByTagName("em").isEmpty(); } else if(itemClass() == "ocr_line") { // Depending on the locale, tesseract can use a comma instead of a dot as decimal separator in the baseline... m_titleAttrs["baseline"] = m_titleAttrs["baseline"].replace(",", "."); } } HOCRItem::~HOCRItem() { qDeleteAll(m_childItems); } void HOCRItem::addChild(HOCRItem* child) { m_childItems.append(child); child->m_parentItem = this; child->m_pageItem = m_pageItem; child->m_index = m_childItems.size() - 1; } void HOCRItem::insertChild(HOCRItem* child, int i) { m_childItems.insert(i, child); child->m_parentItem = this; child->m_pageItem = m_pageItem; child->m_index = i++; for(int n = m_childItems.size(); i < n; ++i) { m_childItems[i]->m_index = i; } } void HOCRItem::removeChild(HOCRItem* child) { takeChild(child); delete child; } void HOCRItem::takeChild(HOCRItem* child) { if(this != child->parent()) { return; } int i = child->index(); m_childItems.remove(i); for(int n = m_childItems.size(); i < n; ++i) { m_childItems[i]->m_index = i; } } QVector HOCRItem::takeChildren() { QVector children(m_childItems); m_childItems.clear(); return children; } QMap HOCRItem::getAllAttributes() const { QMap attrValues; for(auto it = m_attrs.begin(), itEnd = m_attrs.end(); it != itEnd; ++it) { attrValues.insert(it.key(), it.value()); } for(auto it = m_titleAttrs.begin(), itEnd = m_titleAttrs.end(); it != itEnd; ++it) { attrValues.insert(QString("title:%1").arg(it.key()), it.value()); } if(itemClass() == "ocrx_word") { if(!attrValues.contains("title:x_font")) { attrValues.insert("title:x_font", ""); } attrValues.insert("bold", fontBold() ? "1" : "0"); attrValues.insert("italic", fontItalic() ? "1" : "0"); } return attrValues; } QMap HOCRItem::getAttributes(const QList& names = QList()) const { QMap attrValues; for(const QString& attrName : names) { QStringList parts = attrName.split(":"); if(parts.size() > 1) { Q_ASSERT(parts[0] == "title"); attrValues.insert(attrName, m_titleAttrs.value(parts[1])); } else if(attrName == "bold") { attrValues.insert(attrName, fontBold() ? "1" : "0"); } else if(attrName == "italic") { attrValues.insert(attrName, fontItalic() ? "1" : "0"); } else { attrValues.insert(attrName, m_attrs[attrName]); } } return attrValues; } // ocr_class:attr_key:attr_values void HOCRItem::getPropagatableAttributes(QMap>>& occurrences) const { static QMap s_propagatableAttributes = { {"ocr_line", {"title:baseline"}}, {"ocrx_word", {"lang", "title:x_fsize", "title:x_font", "bold", "italic"}} }; QString childClass = m_childItems.isEmpty() ? "" : m_childItems.front()->itemClass(); auto it = s_propagatableAttributes.find(childClass); if(it != s_propagatableAttributes.end()) { for(HOCRItem* child : m_childItems) { QMap attrs = child->getAttributes(it.value()); for(auto attrIt = attrs.begin(), attrItEnd = attrs.end(); attrIt != attrItEnd; ++attrIt) { occurrences[childClass][attrIt.key()].insert(attrIt.value()); } } } if(childClass != "ocrx_word") { for(HOCRItem* child : m_childItems) { child->getPropagatableAttributes(occurrences); } } } void HOCRItem::setAttribute(const QString& name, const QString& value, const QString& attrItemClass) { if(!attrItemClass.isEmpty() && itemClass() != attrItemClass) { for(HOCRItem* child : m_childItems) { child->setAttribute(name, value, attrItemClass); } return; } QStringList parts = name.split(":"); if(name == "bold") { m_bold = value == "1"; } else if(name == "italic") { m_italic = value == "1"; } else if(parts.size() < 2) { m_attrs[name] = value; } else { Q_ASSERT(parts[0] == "title"); m_titleAttrs[parts[1]] = value; if(name == "title:bbox") { QStringList bbox = value.split(QRegExp("\\s+")); Q_ASSERT(bbox.size() == 4); m_bbox.setCoords(bbox[0].toInt(), bbox[1].toInt(), bbox[2].toInt(), bbox[3].toInt()); } } } QString HOCRItem::toHtml(int indent) const { QString cls = itemClass(); QString tag; if(cls == "ocr_page" || cls == "ocr_carea" || cls == "ocr_graphic") { tag = "div"; } else if(cls == "ocr_par") { tag = "p"; } else { tag = "span"; } QString html = QString(indent, ' ') + "<" + tag; html += QString(" title=\"%1\"").arg(serializeAttrGroup(m_titleAttrs)); for(auto it = m_attrs.begin(), itEnd = m_attrs.end(); it != itEnd; ++it) { html += QString(" %1=\"%2\"").arg(it.key(), it.value()); } html += ">"; if(cls == "ocrx_word") { if(m_bold) { html += ""; } if(m_italic) { html += ""; } #if QT_VERSION >= QT_VERSION_CHECK(5, 0, 0) html += m_text.toHtmlEscaped(); #else html += Qt::escape(m_text); #endif if(m_italic) { html += ""; } if(m_bold) { html += ""; } } else { html += "\n"; for(const HOCRItem* child : m_childItems) { html += child->toHtml(indent + 1); } html += QString(indent, ' '); } html += "\n"; return html; } QPair HOCRItem::baseLine() const { static const QRegExp baseLineRx = QRegExp("([+-]?\\d+\\.?\\d*)\\s+([+-]?\\d+\\.?\\d*)"); if(baseLineRx.indexIn(m_titleAttrs["baseline"]) != -1) { return qMakePair(baseLineRx.cap(1).toDouble(), baseLineRx.cap(2).toDouble()); } return qMakePair(0.0, 0.0); } bool HOCRItem::parseChildren(const QDomElement& element, QString language) { // Determine item language (inherit from parent if not specified) QString elemLang = element.attribute("lang"); if(!elemLang.isEmpty()) { auto it = s_langCache.find(elemLang); if(it == s_langCache.end()) { it = s_langCache.insert(elemLang, Utils::getSpellingLanguage(elemLang)); } m_attrs.remove("lang"); language = it.value(); } if(itemClass() == "ocrx_word") { m_attrs["lang"] = language; return !m_text.isEmpty(); } bool haveWords = false; QDomElement childElement = element.firstChildElement(); while(!childElement.isNull()) { m_childItems.append(new HOCRItem(childElement, m_pageItem, this, m_childItems.size())); haveWords |= m_childItems.last()->parseChildren(childElement, language); childElement = childElement.nextSiblingElement(); } return haveWords; } /////////////////////////////////////////////////////////////////////////////// HOCRPage::HOCRPage(const QDomElement& element, int pageId, const QString& language, bool cleanGraphics, int index) : HOCRItem(element, this, nullptr, index), m_pageId(pageId) { m_attrs["id"] = QString("page_%1").arg(pageId); m_sourceFile = m_titleAttrs["image"].replace(QRegExp("^['\"]"), "").replace(QRegExp("['\"]$"), ""); m_pageNr = m_titleAttrs["ppageno"].toInt(); // Code to handle pageno -> ppageno typo in previous versions of gImageReader if(m_pageNr == 0) { m_pageNr = m_titleAttrs["pageno"].toInt(); m_titleAttrs["ppageno"] = m_titleAttrs["pageno"]; m_titleAttrs.remove("pageno"); } m_angle = m_titleAttrs["rot"].toDouble(); m_resolution = m_titleAttrs["res"].toInt(); QDomElement childElement = element.firstChildElement("div"); while(!childElement.isNull()) { HOCRItem* item = new HOCRItem(childElement, this, this, m_childItems.size()); m_childItems.append(item); if(!item->parseChildren(childElement, language)) { // No word children -> treat as graphic if(cleanGraphics && (item->bbox().width() < 10 || item->bbox().height() < 10)) { // Ignore graphics which are less than 10 x 10 delete m_childItems.takeLast(); } else { item->setAttribute("class", "ocr_graphic"); qDeleteAll(item->m_childItems); item->m_childItems.clear(); } } childElement = childElement.nextSiblingElement(); } } QString HOCRPage::title() const { return QString("%1 [%2]").arg(QFileInfo(m_sourceFile).fileName()).arg(m_pageNr); } void HOCRPage::convertSourcePath(const QString& basepath, bool absolute) { if(absolute && !QFileInfo(m_sourceFile).isAbsolute()) { m_sourceFile = QDir::cleanPath(QDir(basepath).absoluteFilePath(m_sourceFile)); } else if(!absolute && QFileInfo(m_sourceFile).isAbsolute() && m_sourceFile.startsWith(basepath)) { m_sourceFile = QString(".%1%2").arg("/").arg(QDir(basepath).relativeFilePath(m_sourceFile)); } m_titleAttrs["image"] = QString("'%1'").arg(m_sourceFile); } gImageReader-3.3.1/qt/src/hocr/HOCRDocument.hh000066400000000000000000000173331351740627400207730ustar00rootroot00000000000000/* -*- Mode: C++; indent-tabs-mode: t; c-basic-offset: 4; tab-width: 4 -*- */ /* * HOCRDocument.hh * Copyright (C) 2013-2019 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 HOCRDOCUMENT_HH #define HOCRDOCUMENT_HH #include "Config.hh" #include #include class QDomElement; namespace QtSpell { class TextEditChecker; } class HOCRItem; class HOCRPage; class HOCRDocument : public QAbstractItemModel { Q_OBJECT public: HOCRDocument(QtSpell::TextEditChecker* spell, QObject* parent = 0); ~HOCRDocument(); void clear(); void setDefaultLanguage(const QString& language) { m_defaultLanguage = language; } void recheckSpelling(); QString toHTML() const; QModelIndex addPage(const QDomElement& pageElement, bool cleanGraphics); const HOCRPage* page(int i) const { return m_pages.value(i); } int pageCount() const { return m_pages.size(); } const HOCRItem* itemAtIndex(const QModelIndex& index) const { return index.isValid() ? static_cast(index.internalPointer()) : nullptr; } bool editItemAttribute(const QModelIndex& index, const QString& name, const QString& value, const QString& attrItemClass = QString()); QModelIndex moveItem(const QModelIndex& itemIndex, const QModelIndex& newParent, int row); QModelIndex swapItems(const QModelIndex& parent, int startRow, int endRow); QModelIndex mergeItems(const QModelIndex& parent, int startRow, int endRow); QModelIndex splitItem(const QModelIndex& item, int startRow, int endRow); QModelIndex addItem(const QModelIndex& parent, const QDomElement& element); bool removeItem(const QModelIndex& index); QModelIndex nextIndex(const QModelIndex& current); QModelIndex prevIndex(const QModelIndex& current); bool indexIsMisspelledWord(const QModelIndex& index) const; bool checkItemSpelling(const QModelIndex&, QStringList* suggestions = nullptr, int limit = -1) const; bool referencesSource(const QString& filename) const; QModelIndex searchPage(const QString& filename, int pageNr) const; QModelIndex searchAtCanvasPos(const QModelIndex& pageIndex, const QPoint& pos) const; void convertSourcePaths(const QString& basepath, bool absolute); QVariant data(const QModelIndex& index, int role) const override; bool setData(const QModelIndex& index, const QVariant& value, int role) override; Qt::ItemFlags flags(const QModelIndex& index) const override; QModelIndex index(int row, int column, const QModelIndex& parent = QModelIndex()) const override; QModelIndex parent(const QModelIndex& child) const override; int rowCount(const QModelIndex& parent = QModelIndex()) const override; int columnCount(const QModelIndex& parent = QModelIndex()) const override; signals: void itemAttributeChanged(const QModelIndex& itemIndex, const QString& name, const QString& value); private: int m_pageIdCounter = 0; QString m_defaultLanguage = "en_US"; QtSpell::TextEditChecker* m_spell; QVector m_pages; QString displayRoleForItem(const HOCRItem* item) const; QIcon decorationRoleForItem(const HOCRItem* item) const; bool checkSpelling(const QString& trimmed, QStringList* suggestions = nullptr, int limit = -1) const; void generateCombinations(const QList>& lists, QList>& results, int depth, const QList c) const; void insertItem(HOCRItem* parent, HOCRItem* item, int i); void deleteItem(HOCRItem* item); void takeItem(HOCRItem* item); void recursiveDataChanged(const QModelIndex& parent, const QVector& roles, const QStringList& itemClasses = QStringList()); void recomputeBBoxes(HOCRItem* item); HOCRItem* mutableItemAtIndex(const QModelIndex& index) const { return index.isValid() ? static_cast(index.internalPointer()) : nullptr; } }; class HOCRItem { public: // attrname : attrvalue : occurrences typedef QMap> AttrOccurenceMap_t; HOCRItem(const QDomElement& element, HOCRPage* page, HOCRItem* parent, int index = -1); virtual ~HOCRItem(); HOCRPage* page() const { return m_pageItem; } const QVector& children() const { return m_childItems; } HOCRItem* parent() const { return m_parentItem; } int index() const { return m_index; } bool isEnabled() const { return m_enabled; } // HOCR specific convenience getters QString itemClass() const { return m_attrs["class"]; } const QRect& bbox() const { return m_bbox; } QString text() const { return m_text; } QString lang() const { return m_attrs["lang"]; } QString spellingLang() const { QString l = lang(); QString code = Config::lookupLangCode(l); return code.isEmpty() ? l : code; } const QMap getAttributes() const { return m_attrs; } const QMap getTitleAttributes() const { return m_titleAttrs; } QMap getAllAttributes() const; QMap getAttributes(const QList& names) const; void getPropagatableAttributes(QMap > >& occurrences) const; QString toHtml(int indent = 0) const; QPair baseLine() const; QString fontFamily() const { return m_titleAttrs["x_font"]; } double fontSize() const { return m_titleAttrs["x_fsize"].toDouble(); } bool fontBold() const { return m_bold; } bool fontItalic() const { return m_italic; } void addChild(HOCRItem* child); void insertChild(HOCRItem* child, int index); void removeChild(HOCRItem* child); void takeChild(HOCRItem* child); QVector takeChildren(); void setEnabled(bool enabled) { m_enabled = enabled; } void setText(const QString& newText) { m_text = newText; } void setAttribute(const QString& name, const QString& value, const QString& attrItemClass = QString()); static QMap deserializeAttrGroup(const QString& string); static QString serializeAttrGroup(const QMap& attrs); static QString trimmedWord(const QString& word, QString* prefix = nullptr, QString* suffix = nullptr); protected: friend class HOCRDocument; friend class HOCRPage; static QMap s_langCache; QString m_text; bool m_bold; bool m_italic; QMap m_attrs; QMap m_titleAttrs; QVector m_childItems; HOCRPage* m_pageItem = nullptr; HOCRItem* m_parentItem = nullptr; int m_index; bool m_enabled = true; QRect m_bbox; bool parseChildren(const QDomElement& element, QString language); }; class HOCRPage : public HOCRItem { public: HOCRPage(const QDomElement& element, int pageId, const QString& language, bool cleanGraphics, int index); const QString& sourceFile() const { return m_sourceFile; } // const-refs here to avoid taking reference from temporaries const int& pageNr() const { return m_pageNr; } const double& angle() const { return m_angle; } const int& resolution() const { return m_resolution; } int pageId() const { return m_pageId; } QString title() const; private: friend class HOCRItem; friend class HOCRDocument; int m_pageId; QMap m_idCounters; QString m_sourceFile; int m_pageNr; double m_angle; int m_resolution; void convertSourcePath(const QString& basepath, bool absolute); }; #endif // HOCRDOCUMENT_HH gImageReader-3.3.1/qt/src/hocr/HOCROdtExporter.cc000066400000000000000000000412421351740627400214560ustar00rootroot00000000000000/* -*- Mode: C++; indent-tabs-mode: t; c-basic-offset: 4; tab-width: 4 -*- */ /* * HOCROdtExporter.cc * Copyright (C) 2013-2019 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 "DisplayerToolHOCR.hh" #include "HOCRDocument.hh" #include "HOCROdtExporter.hh" #include "MainWindow.hh" #include "FileDialogs.hh" #include "SourceManager.hh" #include "Utils.hh" #include #include #include #include #include #include static QString manifestNS("urn:oasis:names:tc:opendocument:xmlns:manifest:1.0"); static QString officeNS("urn:oasis:names:tc:opendocument:xmlns:office:1.0"); static QString textNS ("urn:oasis:names:tc:opendocument:xmlns:text:1.0"); static QString styleNS ("urn:oasis:names:tc:opendocument:xmlns:style:1.0"); static QString foNS ("urn:oasis:names:tc:opendocument:xmlns:xsl-fo-compatible:1.0"); static QString tableNS ("urn:oasis:names:tc:opendocument:xmlns:table:1.0"); static QString drawNS ("urn:oasis:names:tc:opendocument:xmlns:drawing:1.0"); static QString xlinkNS ("http://www.w3.org/1999/xlink"); static QString svgNS ("urn:oasis:names:tc:opendocument:xmlns:svg-compatible:1.0"); bool HOCROdtExporter::run(const HOCRDocument* hocrdocument, QString& filebasename) { QString suggestion = filebasename; if(suggestion.isEmpty()) { QList sources = MAIN->getSourceManager()->getSelectedSources(); suggestion = !sources.isEmpty() ? QFileInfo(sources.first()->displayname).baseName() : _("output"); } QString outname = FileDialogs::saveDialog(_("Save ODT Output..."), suggestion + ".odt", "outputdir", QString("%1 (*.odt)").arg(_("OpenDocument Text Documents"))); if(outname.isEmpty()) { return false; } filebasename = QFileInfo(outname).completeBaseName(); QuaZip zip(outname); if(!zip.open( QuaZip::mdCreate )) { QMessageBox::warning(MAIN, _("Export failed"), _("The ODT export failed: unable to write output file.")); return false; } int pageCount = hocrdocument->pageCount(); MainWindow::ProgressMonitor monitor(2 * pageCount); MAIN->showProgress(&monitor); Utils::busyTask([&] { // Image files QMap imageFiles; for(int i = 0; i < pageCount; ++i) { monitor.increaseProgress(); const HOCRPage* page = hocrdocument->page(i); if(!page->isEnabled()) { continue; } bool success = false; QMetaObject::invokeMethod(this, "setSource", Qt::BlockingQueuedConnection, Q_RETURN_ARG(bool, success), Q_ARG(QString, page->sourceFile()), Q_ARG(int, page->pageNr()), Q_ARG(int, page->resolution()), Q_ARG(double, page->angle())); if(!success) { continue; } for(const HOCRItem* item : page->children()) { writeImage(zip, imageFiles, item); } } // Mimetype QuaZipFile* mimetype = new QuaZipFile(&zip); mimetype->open(QIODevice::WriteOnly, QuaZipNewInfo("mimetype")); mimetype->write("application/vnd.oasis.opendocument.text"); mimetype->close(); // Manifest QuaZipFile* manifest = new QuaZipFile(&zip); manifest->open(QIODevice::WriteOnly, QuaZipNewInfo("META-INF/manifest.xml")); QXmlStreamWriter manifestWriter(manifest); manifestWriter.writeNamespace(manifestNS, "manifest"); manifestWriter.writeStartDocument(); manifestWriter.writeStartElement(manifestNS, "manifest"); manifestWriter.writeAttribute(manifestNS, "version", "1.2"); manifestWriter.writeEmptyElement(manifestNS, "file-entry"); manifestWriter.writeAttribute(manifestNS, "media-type", "application/vnd.oasis.opendocument.text"); manifestWriter.writeAttribute(manifestNS, "full-path", "/"); manifestWriter.writeEmptyElement(manifestNS, "file-entry"); manifestWriter.writeAttribute(manifestNS, "media-type", "text/xml"); manifestWriter.writeAttribute(manifestNS, "full-path", "content.xml"); for(const QString& imageFile : imageFiles.values()) { manifestWriter.writeEmptyElement(manifestNS, "file-entry"); manifestWriter.writeAttribute(manifestNS, "media-type", "image/png"); manifestWriter.writeAttribute(manifestNS, "full-path", imageFile); } manifestWriter.writeEndElement(); // manifest manifestWriter.writeEndDocument(); manifest->close(); // Content QuaZipFile* content = new QuaZipFile(&zip); content->open(QIODevice::WriteOnly, QuaZipNewInfo("content.xml")); QXmlStreamWriter writer(content); writer.writeNamespace(officeNS, "office"); writer.writeNamespace(textNS, "text"); writer.writeNamespace(styleNS, "style"); writer.writeNamespace(foNS, "fo"); writer.writeNamespace(drawNS, "draw"); writer.writeNamespace(xlinkNS, "xlink"); writer.writeNamespace(svgNS, "svg"); writer.writeStartDocument(); writer.writeStartElement(officeNS, "document-content"); writer.writeAttribute(officeNS, "version", "1.2"); // - Font face decls writer.writeStartElement(officeNS, "font-face-decls"); QSet families; for(int i = 0; i < pageCount; ++i) { const HOCRPage* page = hocrdocument->page(i); if(page->isEnabled()) { writeFontFaceDecls(families, page, writer); } } writer.writeEndElement(); // - Page styles writer.writeStartElement(officeNS, "automatic-styles"); for(int i = 0; i < pageCount; ++i) { const HOCRPage* page = hocrdocument->page(i); if(page->isEnabled()) { writer.writeStartElement(styleNS, "page-layout"); writer.writeAttribute(styleNS, "name", QString("PL%1").arg(i)); writer.writeEmptyElement(styleNS, "page-layout-properties"); writer.writeAttribute(foNS, "page-width", QString("%1in").arg(page->bbox().width() / double(page->resolution()))); writer.writeAttribute(foNS, "page-height", QString("%1in").arg(page->bbox().height() / double(page->resolution()))); writer.writeAttribute(styleNS, "print-orientation", page->bbox().width() > page->bbox().height() ? "landscape" : "portrait"); writer.writeAttribute(styleNS, "writing-mode", "lr-tb"); writer.writeAttribute(foNS, "margin-top", "0in"); writer.writeAttribute(foNS, "margin-bottom", "0in"); writer.writeAttribute(foNS, "margin-left", "0in"); writer.writeAttribute(foNS, "margin-right", "0in"); writer.writeEndElement(); // page-layout } } writer.writeEndElement(); // automatic-styles writer.writeStartElement(officeNS, "master-styles"); for(int i = 0; i < pageCount; ++i) { if(hocrdocument->page(i)->isEnabled()) { writer.writeEmptyElement(styleNS, "master-page"); writer.writeAttribute(styleNS, "name", QString("MP%1").arg(i)); writer.writeAttribute(styleNS, "page-layout-name", QString("PL%1").arg(i)); } } writer.writeEndElement(); // master-styles // - Styles writer.writeStartElement(officeNS, "automatic-styles"); // -- Standard paragraph writer.writeStartElement(styleNS, "style"); writer.writeAttribute(styleNS, "name", "P"); writer.writeAttribute(styleNS, "parent-style-name", "Standard"); writer.writeEndElement(); // -- Page paragraphs for(int i = 0; i < pageCount; ++i) { if(hocrdocument->page(i)->isEnabled()) { writer.writeStartElement(styleNS, "style"); writer.writeAttribute(styleNS, "name", QString("PP%1").arg(i)); writer.writeAttribute(styleNS, "family", "paragraph"); writer.writeAttribute(styleNS, "parent-style-name", "Standard"); writer.writeAttribute(styleNS, "master-page-name", QString("MP%1").arg(i)); writer.writeEmptyElement(styleNS, "paragraph-properties"); writer.writeAttribute(foNS, "break-before", "page"); writer.writeEndElement(); } } // -- Frame, absolutely positioned on page writer.writeStartElement(styleNS, "style"); writer.writeAttribute(styleNS, "name", "F"); writer.writeAttribute(styleNS, "family", "graphic"); writer.writeStartElement(styleNS, "graphic-properties"); writer.writeAttribute(drawNS, "stroke", "none"); writer.writeAttribute(drawNS, "fill", "none"); writer.writeAttribute(styleNS, "vertical-pos", "from-top"); writer.writeAttribute(styleNS, "vertical-rel", "page"); writer.writeAttribute(styleNS, "horizontal-pos", "from-left"); writer.writeAttribute(styleNS, "horizontal-rel", "page"); writer.writeAttribute(styleNS, "flow-with-text", "false"); writer.writeEndElement(); writer.writeEndElement(); // -- Text styles int counter = 0; QMap> fontStyles; for(int i = 0; i < pageCount; ++i) { const HOCRPage* page = hocrdocument->page(i); if(page->isEnabled()) { for(const HOCRItem* item : page->children()) { writeFontStyles(fontStyles, item, writer, counter); } } } writer.writeEndElement(); // automatic-styles // - Body writer.writeStartElement(officeNS, "body"); writer.writeStartElement(officeNS, "text"); int pageCounter = 1; for(int i = 0; i < pageCount; ++i) { monitor.increaseProgress(); const HOCRPage* page = hocrdocument->page(i); if(!page->isEnabled()) { continue; } writer.writeStartElement(textNS, "p"); writer.writeAttribute(textNS, "style-name", QString("PP%1").arg(i)); for(const HOCRItem* item : page->children()) { printItem(writer, item, pageCounter, page->resolution(), fontStyles, imageFiles); } writer.writeEndElement(); ++pageCounter; } writer.writeEndElement(); // text writer.writeEndElement(); // body writer.writeEndElement(); // document-content writer.writeEndDocument(); content->close(); return true; }, _("Exporting to ODT...")); MAIN->hideProgress(); zip.close(); bool openAfterExport = ConfigSettings::get("openafterexport")->getValue(); if(openAfterExport) { QDesktopServices::openUrl(QUrl::fromLocalFile(outname)); } return true; } void HOCROdtExporter::writeImage(QuaZip& zip, QMap& images, const HOCRItem* item) { if(!item->isEnabled()) { return; } if(item->itemClass() == "ocr_graphic") { QImage image; QMetaObject::invokeMethod(this, "getSelection", Qt::BlockingQueuedConnection, Q_RETURN_ARG(QImage, image), Q_ARG(QRect, item->bbox())); QString filename = QString("Pictures/%1.png").arg(QUuid::createUuid().toString()); QuaZipFile* file = new QuaZipFile(&zip); if(file->open(QIODevice::WriteOnly, QuaZipNewInfo(filename))) { image.save(file, "png"); images.insert(item, filename); } } } void HOCROdtExporter::writeFontFaceDecls(QSet& families, const HOCRItem* item, QXmlStreamWriter& writer) { if(!item->isEnabled()) { return; } if(item->itemClass() == "ocrx_word") { QString fontFamily = item->fontFamily(); if(!families.contains(fontFamily)) { if(!fontFamily.isEmpty()) { writer.writeEmptyElement(styleNS, "font-face"); writer.writeAttribute(styleNS, "name", fontFamily); writer.writeAttribute(svgNS, "font-family", fontFamily); } families.insert(fontFamily); } } else { for(const HOCRItem* child : item->children()) { writeFontFaceDecls(families, child, writer); } } } void HOCROdtExporter::writeFontStyles(QMap>& styles, const HOCRItem* item, QXmlStreamWriter& writer, int& counter) { if(!item->isEnabled()) { return; } if(item->itemClass() == "ocrx_word") { QString fontKey = item->fontFamily() + (item->fontBold() ? "@bold" : "") + (item->fontItalic() ? "@italic" : ""); if(!styles.contains(fontKey) || !styles[fontKey].contains(item->fontSize())) { QString styleName = QString("T%1").arg(++counter); writer.writeStartElement(styleNS, "style"); writer.writeAttribute(styleNS, "name", styleName); writer.writeAttribute(styleNS, "family", "text"); writer.writeStartElement(styleNS, "text-properties"); writer.writeAttribute(styleNS, "font-name", item->fontFamily()); writer.writeAttribute(foNS, "font-size", QString("%1pt").arg(item->fontSize())); if(item->fontBold()) { writer.writeAttribute(foNS, "font-weight", "bold"); } if(item->fontItalic()) { writer.writeAttribute(foNS, "font-style", "italic"); } writer.writeEndElement(); // text-properties writer.writeEndElement(); // style styles[fontKey].insert(item->fontSize(), styleName); } } else { for(const HOCRItem* child : item->children()) { writeFontStyles(styles, child, writer, counter); } } } void HOCROdtExporter::printItem(QXmlStreamWriter& writer, const HOCRItem* item, int pageNr, int dpi, const QMap>& fontStyleNames, const QMap& images) { if(!item->isEnabled()) { return; } QString itemClass = item->itemClass(); const QRect& bbox = item->bbox(); if(itemClass == "ocr_graphic") { writer.writeStartElement(drawNS, "frame"); writer.writeAttribute(drawNS, "style-name", "F"); writer.writeAttribute(textNS, "anchor-type", "page"); writer.writeAttribute(textNS, "anchor-page-number", QString::number(pageNr)); writer.writeAttribute(svgNS, "x", QString("%1in").arg(bbox.x() / double(dpi))); writer.writeAttribute(svgNS, "y", QString("%1in").arg(bbox.y() / double(dpi))); writer.writeAttribute(svgNS, "width", QString("%1in").arg(bbox.width() / double(dpi))); writer.writeAttribute(svgNS, "height", QString("%1in").arg(bbox.height() / double(dpi))); writer.writeAttribute(drawNS, "z-index", "0"); writer.writeStartElement(drawNS, "image"); writer.writeAttribute(xlinkNS, "href", images[item]); writer.writeAttribute(xlinkNS, "type", "simple"); writer.writeAttribute(xlinkNS, "show", "embed"); writer.writeEndElement(); // image writer.writeEndElement(); // frame } else if(itemClass == "ocr_par") { writer.writeStartElement(drawNS, "frame"); writer.writeAttribute(drawNS, "style-name", "F"); writer.writeAttribute(textNS, "anchor-type", "page"); writer.writeAttribute(textNS, "anchor-page-number", QString::number(pageNr)); writer.writeAttribute(svgNS, "x", QString("%1in").arg(bbox.x() / double(dpi))); writer.writeAttribute(svgNS, "y", QString("%1in").arg(bbox.y() / double(dpi))); writer.writeAttribute(svgNS, "width", QString("%1in").arg(bbox.width() / double(dpi))); writer.writeAttribute(svgNS, "height", QString("%1in").arg(bbox.height() / double(dpi))); writer.writeAttribute(drawNS, "z-index", "1"); writer.writeStartElement(drawNS, "text-box"); writer.writeStartElement(textNS, "p"); writer.writeAttribute(textNS, "style-name", "P"); for(const HOCRItem* child : item->children()) { printItem(writer, child, pageNr, dpi, fontStyleNames, images); } writer.writeEndElement(); writer.writeEndElement(); // text-box writer.writeEndElement(); // frame } else if(itemClass == "ocr_line") { const HOCRItem* firstWord = nullptr; int iChild = 0, nChilds = item->children().size(); for(; iChild < nChilds; ++iChild) { const HOCRItem* child = item->children()[iChild]; if(child->isEnabled()) { firstWord = child; break; } } if(!firstWord) { return; } QString fontKey = firstWord->fontFamily() + (firstWord->fontBold() ? "@bold" : "") + (firstWord->fontItalic() ? "@italic" : ""); QString currentFontStyleName = fontStyleNames[fontKey][firstWord->fontSize()]; writer.writeStartElement(textNS, "span"); writer.writeAttribute(textNS, "style-name", currentFontStyleName); writer.writeCharacters(firstWord->text()); ++iChild; for(; iChild < nChilds; ++iChild) { const HOCRItem* child = item->children()[iChild]; if(!child->isEnabled()) { continue; } fontKey = child->fontFamily() + (child->fontBold() ? "@bold" : "") + (child->fontItalic() ? "@italic" : ""); QString fontStyleName = fontStyleNames[fontKey][child->fontSize()]; if(fontStyleName != currentFontStyleName) { currentFontStyleName = fontStyleName; writer.writeEndElement(); writer.writeStartElement(textNS, "span"); writer.writeAttribute(textNS, "style-name", currentFontStyleName); } writer.writeCharacters(" "); writer.writeCharacters(child->text()); } writer.writeEndElement(); writer.writeEmptyElement(textNS, "line-break"); } else { for(const HOCRItem* child : item->children()) { printItem(writer, child, pageNr, dpi, fontStyleNames, images); } } } bool HOCROdtExporter::setSource(const QString& sourceFile, int page, int dpi, double angle) { if(MAIN->getSourceManager()->addSource(sourceFile, true)) { MAIN->getDisplayer()->setup(&page, &dpi, &angle); return true; } else { return false; } } QImage HOCROdtExporter::getSelection(const QRect& bbox) { return m_displayerTool->getSelection(bbox); } gImageReader-3.3.1/qt/src/hocr/HOCROdtExporter.hh000066400000000000000000000037311351740627400214710ustar00rootroot00000000000000/* -*- Mode: C++; indent-tabs-mode: t; c-basic-offset: 4; tab-width: 4 -*- */ /* * HOCROdtExporter.hh * Copyright (C) 2013-2019 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 HOCRODTEXPORTER_HH #define HOCRODTEXPORTER_HH #include "common.hh" #include #include class DisplayerToolHOCR; class HOCRDocument; class HOCRItem; class QImage; class QRect; class QuaZip; class QXmlStreamWriter; class HOCROdtExporter : public QObject { Q_OBJECT public: HOCROdtExporter(DisplayerToolHOCR* displayerTool) : m_displayerTool(displayerTool) {} bool run(const HOCRDocument* hocrdocument, QString& filebasename); private: DisplayerToolHOCR* m_displayerTool; void writeImage(QuaZip& zip, QMap& images, const HOCRItem* item); void writeFontFaceDecls(QSet& families, const HOCRItem* item, QXmlStreamWriter& writer); void writeFontStyles(QMap >& styles, const HOCRItem* item, QXmlStreamWriter& writer, int& counter); void printItem(QXmlStreamWriter& writer, const HOCRItem* item, int pageNr, int dpi, const QMap >& fontStyleNames, const QMap& images); private slots: bool setSource(const QString& sourceFile, int page, int dpi, double angle); QImage getSelection(const QRect& bbox); }; #endif // HOCRODTEXPORTER_HH gImageReader-3.3.1/qt/src/hocr/HOCRPdfExporter.cc000066400000000000000000001272311351740627400214440ustar00rootroot00000000000000/* -*- Mode: C++; indent-tabs-mode: t; c-basic-offset: 4; tab-width: 4 -*- */ /* * HOCRPdfExporter.cc * Copyright (C) 2013-2019 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 #define USE_STD_NAMESPACE #include #undef USE_STD_NAMESPACE #include "CCITTFax4Encoder.hh" #include "ConfigSettings.hh" #include "Displayer.hh" #include "DisplayerToolHOCR.hh" #include "FileDialogs.hh" #include "HOCRDocument.hh" #include "HOCRPdfExporter.hh" #include "MainWindow.hh" #include "SourceManager.hh" #include "PaperSize.hh" #include "Utils.hh" class HOCRPdfExporter::QPainterPDFPainter : public HOCRPdfExporter::PDFPainter { public: QPainterPDFPainter(QPainter* painter, const QFont& defaultFont) : m_painter(painter), m_defaultFont(defaultFont) { m_curFont = m_defaultFont; } void setFontFamily(const QString& family, bool bold, bool italic) override { float curSize = m_curFont.pointSize(); if(m_fontDatabase.hasFamily(family)) { m_curFont.setFamily(family); } else { m_curFont = m_defaultFont; } m_curFont.setPointSize(curSize); m_curFont.setBold(bold); m_curFont.setItalic(italic); m_painter->setFont(m_curFont); } void setFontSize(double pointSize) override { if(pointSize != m_curFont.pointSize()) { m_curFont.setPointSize(pointSize); m_painter->setFont(m_curFont); } } void drawText(double x, double y, const QString& text) override { m_painter->drawText(m_offsetX + x, m_offsetY + 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); } protected: QFontDatabase m_fontDatabase; QPainter* m_painter; QFont m_curFont; QFont m_defaultFont; double m_offsetX = 0.0; double m_offsetY = 0.0; }; class HOCRPdfExporter::QPrinterPDFPainter : public HOCRPdfExporter::QPainterPDFPainter { public: QPrinterPDFPainter(const QString& filename, const QString& creator, const QFont& defaultFont) : QPainterPDFPainter(nullptr, defaultFont) { m_printer.setOutputFormat(QPrinter::PdfFormat); m_printer.setOutputFileName(filename); m_printer.setResolution(72); // This to ensure that painter units are points - images are passed pre-scaled to drawImage, so that the resulting dpi in the box is the output dpi (the document resolution only matters for images) m_printer.setFontEmbeddingEnabled(true); m_printer.setFullPage(true); m_printer.setCreator(creator); } ~QPrinterPDFPainter() { delete m_painter; } bool createPage(double width, double height, double offsetX, double offsetY, QString& errMsg) override { #if QT_VERSION < QT_VERSION_CHECK(5, 0, 0) m_printer.setPaperSize(width, pageDpi), QPrinter::Point); #else m_printer.setPageSize(QPageSize(QSizeF(width, height), QPageSize::Point)); #endif if(!m_firstPage) { if(!m_printer.newPage()) { return false; } } else { // Need to create painter after setting paper size, otherwise default paper size is used for first page... m_painter = new QPainter(); m_painter->setRenderHint(QPainter::Antialiasing); if(!m_painter->begin(&m_printer)) { errMsg = _("Failed to write to file"); return false; } m_firstPage = false; } m_curFont = m_defaultFont; m_painter->setFont(m_curFont); m_offsetX = offsetX; m_offsetY = offsetY; return true; } bool finishDocument(QString& /*errMsg*/) override { return m_painter->end(); } void drawImage(const QRect& bbox, const QImage& image, const PDFSettings& settings) override { QImage img = convertedImage(image, settings.colorFormat, settings.conversionFlags); m_painter->drawImage(bbox, img); } private: QPrinter m_printer; bool m_firstPage = true; }; #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 HOCRPdfExporter::PoDoFoPDFPainter : public HOCRPdfExporter::PDFPainter { public: #if PODOFO_VERSION >= PODOFO_MAKE_VERSION(0,9,3) PoDoFoPDFPainter(PoDoFo::PdfStreamedDocument* document, const PoDoFo::PdfEncoding* fontEncoding, PoDoFo::PdfFont* defaultFont, const QString& defaultFontFamily, double defaultFontSize) #else PoDoFoPDFPainter(PoDoFo::PdfStreamedDocument* document, PoDoFo::PdfEncoding* fontEncoding, PoDoFo::PdfFont* defaultFont, const QString& defaultFontFamily, double defaultFontSize) #endif : m_document(document), m_pdfFontEncoding(fontEncoding), m_defaultFont(defaultFont), m_defaultFontFamily(defaultFontFamily), m_defaultFontSize(defaultFontSize) { } ~PoDoFoPDFPainter() { #if PODOFO_VERSION < PODOFO_MAKE_VERSION(0,9,3) delete m_pdfFontEncoding; #endif delete m_document; // Fonts are deleted by the internal PoDoFo font cache of the document } bool createPage(double width, double height, double offsetX, double offsetY, QString& /*errMsg*/) override { PoDoFo::PdfPage* pdfpage = m_document->CreatePage(PoDoFo::PdfRect(0, 0, width, height)); m_painter.SetPage(pdfpage); m_pageHeight = m_painter.GetPage()->GetPageSize().GetHeight(); m_painter.SetFont(m_defaultFont); if(m_defaultFontSize > 0) { m_painter.GetFont()->SetFontSize(m_defaultFontSize); } m_offsetX = offsetX; m_offsetY = offsetY; return true; } void finishPage() override { m_painter.FinishPage(); } bool finishDocument(QString& errMsg) override { try { m_document->Close(); } catch(PoDoFo::PdfError& e) { errMsg = e.what(); return false; } return true; } void setFontFamily(const QString& family, bool bold, bool italic) override { float curSize = m_painter.GetFont()->GetFontSize(); m_painter.SetFont(getFont(family, bold, italic)); m_painter.GetFont()->SetFontSize(curSize); } 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(m_offsetX + x, m_pageHeight - m_offsetY - y, 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(m_offsetX + bbox.x(), m_pageHeight - m_offsetY - (bbox.y() + bbox.height()), &pdfImage, bbox.width() / double(image.width()), bbox.height() / double(image.height())); } double getAverageCharWidth() const override { return m_painter.GetFont()->GetFontMetrics()->CharWidth(static_cast('x')); } double getTextWidth(const QString& text) const override { PoDoFo::PdfString pdfString(reinterpret_cast(text.toUtf8().data())); return m_painter.GetFont()->GetFontMetrics()->StringWidth(pdfString); } private: QFontDatabase m_fontDatabase; QMap m_fontCache; PoDoFo::PdfPainter m_painter; PoDoFo::PdfStreamedDocument* m_document; #if PODOFO_VERSION >= PODOFO_MAKE_VERSION(0,9,3) const PoDoFo::PdfEncoding* m_pdfFontEncoding; #else PoDoFo::PdfEncoding* m_pdfFontEncoding; #endif PoDoFo::PdfFont* m_defaultFont; QString m_defaultFontFamily; double m_defaultFontSize = -1.0; double m_pageHeight = 0.0; double m_offsetX = 0.0; double m_offsetY = 0.0; PoDoFo::PdfFont* getFont(QString family, bool bold, bool italic) { QString key = family + (bold ? "@bold" : "") + (italic ? "@italic" : ""); auto it = m_fontCache.find(key); if(it == m_fontCache.end()) { if(family.isEmpty() || !m_fontDatabase.hasFamily(family)) { family = m_defaultFontFamily; } PoDoFo::PdfFont* font = nullptr; try { #if PODOFO_VERSION >= PODOFO_MAKE_VERSION(0,9,3) font = m_document->CreateFontSubset(family.toLocal8Bit().data(), bold, italic, false, m_pdfFontEncoding); #else font = m_document->CreateFontSubset(family.toLocal8Bit().data(), bold, italic, m_pdfFontEncoding); #endif it = m_fontCache.insert(key, font); } catch(PoDoFo::PdfError& /*err*/) { it = m_fontCache.insert(key, m_defaultFont);; } } return it.value(); } }; HOCRPdfExporter::HOCRPdfExporter(const HOCRDocument* hocrdocument, const HOCRPage* previewPage, DisplayerToolHOCR* displayerTool, QWidget* parent) : QDialog(parent), m_hocrdocument(hocrdocument), m_previewPage(previewPage), m_displayerTool(displayerTool) { ui.setupUi(this); ui.comboBoxBackend->addItem("PoDoFo", BackendPoDoFo); ui.comboBoxBackend->addItem("QPrinter", BackendQPrinter); ui.comboBoxBackend->setCurrentIndex(-1); ui.comboBoxImageFormat->addItem(_("Color"), QImage::Format_RGB888); #if QT_VERSION < QT_VERSION_CHECK(5, 0, 0) ui.comboBoxImageFormat->addItem(_("Grayscale"), QImage::Format_Indexed8); #else ui.comboBoxImageFormat->addItem(_("Grayscale"), QImage::Format_Grayscale8); #endif ui.comboBoxImageFormat->addItem(_("Monochrome"), QImage::Format_Mono); ui.comboBoxImageFormat->setCurrentIndex(-1); ui.comboBoxDithering->addItem(_("Threshold (closest color)"), Qt::ThresholdDither); ui.comboBoxDithering->addItem(_("Diffuse"), Qt::DiffuseDither); ui.comboBoxImageCompression->addItem(_("Zip (lossless)"), PDFSettings::CompressZip); ui.comboBoxImageCompression->addItem(_("CCITT Group 4 (lossless)"), PDFSettings::CompressFax4); ui.comboBoxImageCompression->addItem(_("Jpeg (lossy)"), PDFSettings::CompressJpeg); ui.comboBoxImageCompression->setCurrentIndex(-1); ui.comboBoxPaperSizeUnit->addItem(_("cm"), static_cast(PaperSize::cm)); ui.comboBoxPaperSizeUnit->addItem(_("in"), static_cast(PaperSize::inch)); ui.comboBoxPaperSize->addItem(_("Same as source"), "source"); ui.comboBoxPaperSize->addItem(_("Custom"), "custom"); for(const auto& size : PaperSize::paperSizes) { ui.comboBoxPaperSize->addItem(size.first.c_str(), size.first.c_str()); } ui.comboBoxPaperSize->setCurrentIndex(-1); ui.lineEditPaperHeight->setValidator(new QDoubleValidator(0.0, 10000000.0, 1)); ui.lineEditPaperWidth->setValidator(new QDoubleValidator(0.0, 10000000.0, 1)); ui.comboBoxPdfVersion->addItem("1.0", PoDoFo::EPdfVersion::ePdfVersion_1_0); ui.comboBoxPdfVersion->addItem("1.1", PoDoFo::EPdfVersion::ePdfVersion_1_1); ui.comboBoxPdfVersion->addItem("1.2", PoDoFo::EPdfVersion::ePdfVersion_1_2); ui.comboBoxPdfVersion->addItem("1.3", PoDoFo::EPdfVersion::ePdfVersion_1_3); ui.comboBoxPdfVersion->addItem("1.4", PoDoFo::EPdfVersion::ePdfVersion_1_4); ui.comboBoxPdfVersion->addItem("1.5", PoDoFo::EPdfVersion::ePdfVersion_1_5); ui.comboBoxPdfVersion->addItem("1.6", PoDoFo::EPdfVersion::ePdfVersion_1_6); ui.comboBoxPdfVersion->addItem("1.7", PoDoFo::EPdfVersion::ePdfVersion_1_7); ui.comboBoxPdfVersion->setCurrentIndex(-1); connect(ui.comboBoxBackend, SIGNAL(currentIndexChanged(int)), this, SLOT(backendChanged())); connect(ui.toolButtonBackendHint, SIGNAL(clicked(bool)), this, SLOT(toggleBackendHint())); connect(ui.comboBoxOutputMode, SIGNAL(currentIndexChanged(int)), this, SLOT(updatePreview())); connect(ui.comboBoxImageFormat, SIGNAL(currentIndexChanged(int)), this, SLOT(updatePreview())); connect(ui.comboBoxImageFormat, SIGNAL(currentIndexChanged(int)), this, SLOT(imageFormatChanged())); connect(ui.comboBoxDithering, SIGNAL(currentIndexChanged(int)), this, SLOT(updatePreview())); connect(ui.comboBoxImageCompression, SIGNAL(currentIndexChanged(int)), this, SLOT(imageCompressionChanged())); connect(ui.spinBoxCompressionQuality, SIGNAL(valueChanged(int)), this, SLOT(updatePreview())); connect(ui.checkBoxFontFamily, SIGNAL(toggled(bool)), ui.comboBoxFontFamily, SLOT(setEnabled(bool))); connect(ui.checkBoxFontFamily, SIGNAL(toggled(bool)), this, SLOT(updatePreview())); connect(ui.checkBoxFontFamily, SIGNAL(toggled(bool)), ui.labelFallbackFontFamily, SLOT(setDisabled(bool))); connect(ui.checkBoxFontFamily, SIGNAL(toggled(bool)), ui.comboBoxFallbackFontFamily, SLOT(setDisabled(bool))); connect(ui.comboBoxFontFamily, SIGNAL(currentFontChanged(QFont)), this, SLOT(updatePreview())); connect(ui.comboBoxFallbackFontFamily, SIGNAL(currentFontChanged(QFont)), this, SLOT(updatePreview())); connect(ui.checkBoxFontSize, SIGNAL(toggled(bool)), ui.spinBoxFontSize, SLOT(setEnabled(bool))); connect(ui.checkBoxFontSize, SIGNAL(toggled(bool)), this, SLOT(updatePreview())); connect(ui.checkBoxFontSize, SIGNAL(toggled(bool)), ui.labelFontScaling, SLOT(setDisabled(bool))); connect(ui.checkBoxFontSize, SIGNAL(toggled(bool)), ui.spinFontScaling, SLOT(setDisabled(bool))); connect(ui.spinBoxFontSize, SIGNAL(valueChanged(int)), this, SLOT(updatePreview())); connect(ui.spinFontScaling, SIGNAL(valueChanged(int)), this, SLOT(updatePreview())); connect(ui.checkBoxUniformizeSpacing, SIGNAL(toggled(bool)), this, SLOT(updatePreview())); connect(ui.spinBoxPreserve, SIGNAL(valueChanged(int)), this, SLOT(updatePreview())); connect(ui.checkBoxUniformizeSpacing, SIGNAL(toggled(bool)), ui.labelPreserve, SLOT(setEnabled(bool))); connect(ui.checkBoxUniformizeSpacing, SIGNAL(toggled(bool)), ui.labelPreserveCharacters, SLOT(setEnabled(bool))); connect(ui.checkBoxUniformizeSpacing, SIGNAL(toggled(bool)), ui.spinBoxPreserve, SLOT(setEnabled(bool))); connect(ui.lineEditPasswordOpen, SIGNAL(textChanged(const QString&)), this, SLOT(updateValid())); connect(ui.lineEditConfirmPasswordOpen, SIGNAL(textChanged(const QString&)), this, SLOT(updateValid())); connect(ui.checkBoxPreview, SIGNAL(toggled(bool)), this, SLOT(updatePreview())); connect(ui.comboBoxPaperSize, SIGNAL(currentIndexChanged(int)), this, SLOT(paperSizeChanged())); connect(ui.comboBoxPaperSizeUnit, SIGNAL(currentIndexChanged(int)), this, SLOT(paperSizeChanged())); connect(ui.toolButtonLandscape, SIGNAL(toggled(bool)), this, SLOT(paperSizeChanged())); connect(ui.lineEditPaperWidth, SIGNAL(textChanged(QString)), this, SLOT(updateValid())); connect(ui.lineEditPaperHeight, SIGNAL(textChanged(QString)), this, SLOT(updateValid())); connect(ui.pushButtonImport, SIGNAL(clicked(bool)), this, SLOT(importMetadataFromSource())); ADD_SETTING(ComboSetting("pdfexportmode", ui.comboBoxOutputMode)); ADD_SETTING(SpinSetting("pdfimagecompressionquality", ui.spinBoxCompressionQuality, 90)); ADD_SETTING(ComboSetting("pdfimagecompression", ui.comboBoxImageCompression)); ADD_SETTING(ComboSetting("pdfimageformat", ui.comboBoxImageFormat)); ADD_SETTING(ComboSetting("pdfimageconversionflags", ui.comboBoxDithering)); ADD_SETTING(SpinSetting("pdfimagedpi", ui.spinBoxDpi, 300)); ADD_SETTING(SwitchSetting("pdfoverridefontfamily", ui.checkBoxFontFamily, true)); ADD_SETTING(FontComboSetting("pdffontfamily", ui.comboBoxFontFamily)); ADD_SETTING(FontComboSetting("pdffallbackfontfamily", ui.comboBoxFallbackFontFamily)); ADD_SETTING(SwitchSetting("pdfoverridefontsizes", ui.checkBoxFontSize, true)); ADD_SETTING(SpinSetting("pdffontsize", ui.spinBoxFontSize, 10)); ADD_SETTING(SpinSetting("pdffontscale", ui.spinFontScaling, 100)); ADD_SETTING(SwitchSetting("pdfuniformizelinespacing", ui.checkBoxUniformizeSpacing, false)); ADD_SETTING(SwitchSetting("pdfsanitizehyphens", ui.checkBoxSanitizeHyphens, true)); ADD_SETTING(SpinSetting("pdfpreservespaces", ui.spinBoxPreserve, 4)); ADD_SETTING(SwitchSetting("pdfpreview", ui.checkBoxPreview, false)); ADD_SETTING(ComboSetting("pdfexportpapersize", ui.comboBoxPaperSize)); ADD_SETTING(LineEditSetting("pdfexportpaperwidth", ui.lineEditPaperWidth)); ADD_SETTING(LineEditSetting("pdfexportpaperheight", ui.lineEditPaperHeight)); ADD_SETTING(ComboSetting("pdfexportpapersizeunit", ui.comboBoxPaperSize)); ADD_SETTING(SwitchSetting("pdfexportpaperlandscape", ui.toolButtonLandscape)); ADD_SETTING(LineEditSetting("pdfexportinfoauthor", ui.lineEditAuthor, PACKAGE_NAME)); ADD_SETTING(LineEditSetting("pdfexportinfoproducer", ui.lineEditProducer, PACKAGE_NAME)); ADD_SETTING(LineEditSetting("pdfexportinfocreator", ui.lineEditCreator, PACKAGE_NAME)); ADD_SETTING(ComboSetting("pdfexportpdfversion", ui.comboBoxPdfVersion, ui.comboBoxPdfVersion->findData(PoDoFo::EPdfVersion::ePdfVersion_1_7))); ADD_SETTING(ComboSetting("pdfexportbackend", ui.comboBoxBackend)); #if !defined(TESSERACT_VERSION) || TESSERACT_VERSION < TESSERACT_MAKE_VERSION(3,04,00) ui.checkBoxFontFamily->setChecked(true); ui.checkBoxFontFamily->setEnabled(false); ui.checkBoxFontSize->setChecked(true); ui.checkBoxFontSize->setEnabled(false); #endif } bool HOCRPdfExporter::run(QString& filebasename) { m_preview = new QGraphicsPixmapItem(); m_preview->setTransformationMode(Qt::SmoothTransformation); m_preview->setZValue(2); updatePreview(); MAIN->getDisplayer()->scene()->addItem(m_preview); bool accepted = false; PDFPainter* painter = nullptr; int pageCount = m_hocrdocument->pageCount(); QString outname; while(true) { accepted = (exec() == QDialog::Accepted); if(!accepted) { break; } QString suggestion = filebasename; if(suggestion.isEmpty()) { QList sources = MAIN->getSourceManager()->getSelectedSources(); suggestion = !sources.isEmpty() ? QFileInfo(sources.first()->displayname).baseName() : _("output"); } while(true) { outname = FileDialogs::saveDialog(_("Save PDF Output..."), suggestion + ".pdf", "outputdir", QString("%1 (*.pdf)").arg(_("PDF Files"))); if(outname.isEmpty()) { accepted = false; break; } if(m_hocrdocument->referencesSource(outname)) { QMessageBox::warning(MAIN, _("Invalid Output"), _("Cannot overwrite a file which is a source image of this document.")); continue; } break; } if(!accepted) { break; } filebasename = QFileInfo(outname).completeBaseName(); QFont defaultFont = ui.checkBoxFontFamily->isChecked() ? ui.comboBoxFontFamily->currentFont() : ui.comboBoxFallbackFontFamily->currentFont(); defaultFont.setPointSize(ui.checkBoxFontSize->isChecked() ? ui.spinBoxFontSize->value() : 0); QString errMsg; PDFBackend backend = static_cast(ui.comboBoxBackend->itemData(ui.comboBoxBackend->currentIndex()).toInt()); if(backend == BackendPoDoFo) { painter = createPoDoFoPrinter(outname, defaultFont, errMsg); } else if(backend == BackendQPrinter) { painter = new QPrinterPDFPainter(outname, ui.lineEditCreator->text(), defaultFont); } if(!painter) { QMessageBox::critical(MAIN, _("Failed to create output"), _("Failed to create output. The returned error was: %1").arg(errMsg)); continue; } break; } MAIN->getDisplayer()->scene()->removeItem(m_preview); delete m_preview; m_preview = nullptr; if(!accepted) { return false; } PDFSettings pdfSettings = getPdfSettings(); int outputDpi = ui.spinBoxDpi->value(); QString paperSize = ui.comboBoxPaperSize->itemData(ui.comboBoxPaperSize->currentIndex()).toString(); double pageWidth, pageHeight; // Page dimensions are in points: 1 in = 72 pt if(paperSize == "custom") { pageWidth = ui.lineEditPaperWidth->text().toDouble() * 72.0; pageHeight = ui.lineEditPaperHeight->text().toDouble() * 72.0; PaperSize::Unit unit = static_cast(ui.comboBoxPaperSizeUnit->itemData(ui.comboBoxPaperSizeUnit->currentIndex()).toInt()); if(unit == PaperSize::cm) { pageWidth /= PaperSize::CMtoInch; pageHeight /= PaperSize::CMtoInch; } } else if (paperSize != "source") { auto inchSize = PaperSize::getSize(PaperSize::inch, paperSize.toStdString(), ui.toolButtonLandscape->isChecked()); pageWidth = inchSize.width * 72.0; pageHeight = inchSize.height * 72.0; } MainWindow::ProgressMonitor monitor(pageCount); MAIN->showProgress(&monitor); QString errMsg; bool success = Utils::busyTask([&] { for(int i = 0; i < pageCount; ++i) { if(monitor.cancelled()) { errMsg = _("The operation was cancelled"); return false; } const HOCRPage* page = m_hocrdocument->page(i); if(page->isEnabled()) { QRect bbox = page->bbox(); QString sourceFile = page->sourceFile(); // If the source file is an image, its "resolution" is actually just the scale factor that was used for recognizing. bool isImage = !sourceFile.endsWith(".pdf", Qt::CaseInsensitive) && !sourceFile.endsWith(".djvu", Qt::CaseInsensitive); int sourceDpi = page->resolution(); int sourceScale = sourceDpi; if(isImage) { sourceDpi *= ui.spinBoxPaperSizeDpi->value() / 100; } // [pt] = 72 * [in] // [in] = 1 / dpi * [px] // => [pt] = 72 / dpi * [px] double px2pt = (72.0 / sourceDpi); double imgScale = double(outputDpi) / sourceDpi; bool success = false; if(isImage) { QMetaObject::invokeMethod(this, "setSource", Qt::BlockingQueuedConnection, Q_RETURN_ARG(bool, success), Q_ARG(QString, sourceFile), Q_ARG(int, page->pageNr()), Q_ARG(int, int(sourceScale * imgScale)), Q_ARG(double, page->angle())); } else { QMetaObject::invokeMethod(this, "setSource", Qt::BlockingQueuedConnection, Q_RETURN_ARG(bool, success), Q_ARG(QString, sourceFile), Q_ARG(int, page->pageNr()), Q_ARG(int, outputDpi), Q_ARG(double, page->angle())); } if(success) { if(paperSize == "source") { pageWidth = bbox.width() * px2pt; pageHeight = bbox.height() * px2pt; } double offsetX = 0.5 * (pageWidth - bbox.width() * px2pt); double offsetY = 0.5 * (pageHeight - bbox.height() * px2pt); if(!painter->createPage(pageWidth, pageHeight, offsetX, offsetY, errMsg)) { return false; } printChildren(*painter, page, pdfSettings, px2pt, imgScale, double(sourceScale) / sourceDpi); if(pdfSettings.overlay) { QRect scaledRect(imgScale * bbox.left(), imgScale * bbox.top(), imgScale * bbox.width(), imgScale * bbox.height()); QRect printRect(bbox.left() * px2pt, bbox.top() * px2pt, bbox.width() * px2pt, bbox.height() * px2pt); QImage selection; QMetaObject::invokeMethod(this, "getSelection", Qt::BlockingQueuedConnection, Q_RETURN_ARG(QImage, selection), Q_ARG(QRect, scaledRect)); painter->drawImage(printRect, selection, pdfSettings); } QMetaObject::invokeMethod(this, "setSource", Qt::BlockingQueuedConnection, Q_RETURN_ARG(bool, success), Q_ARG(QString, page->sourceFile()), Q_ARG(int, page->pageNr()), Q_ARG(int, sourceScale), Q_ARG(double, page->angle())); painter->finishPage(); } else { errMsg = _("Failed to render page %1").arg(page->title()); return false; } } monitor.increaseProgress(); } return painter->finishDocument(errMsg); }, _("Exporting to PDF...")); MAIN->hideProgress(); bool openAfterExport = ConfigSettings::get("openafterexport")->getValue(); if(!success) { QMessageBox::warning(MAIN, _("Export failed"), _("The PDF export failed: %1.").arg(errMsg)); } else if(openAfterExport) { QDesktopServices::openUrl(QUrl::fromLocalFile(outname)); } delete painter; return success; } HOCRPdfExporter::PDFPainter* HOCRPdfExporter::createPoDoFoPrinter(const QString& filename, const QFont& defaultFont, QString& errMsg) { PoDoFo::PdfStreamedDocument* document = nullptr; PoDoFo::PdfFont* defaultPdfFont = nullptr; #if PODOFO_VERSION >= PODOFO_MAKE_VERSION(0,9,3) const PoDoFo::PdfEncoding* pdfFontEncoding = PoDoFo::PdfEncodingFactory::GlobalIdentityEncodingInstance(); #else PoDoFo::PdfEncoding* pdfFontEncoding = new PoDoFo::PdfIdentityEncoding; #endif try { const std::string password = ui.lineEditPasswordOpen->text().toStdString(); PoDoFo::PdfEncrypt* encrypt = nullptr; if(!password.empty()) { encrypt = PoDoFo::PdfEncrypt::CreatePdfEncrypt(password, password, PoDoFo::PdfEncrypt::EPdfPermissions::ePdfPermissions_Print | PoDoFo::PdfEncrypt::EPdfPermissions::ePdfPermissions_Edit | PoDoFo::PdfEncrypt::EPdfPermissions::ePdfPermissions_Copy | PoDoFo::PdfEncrypt::EPdfPermissions::ePdfPermissions_EditNotes | PoDoFo::PdfEncrypt::EPdfPermissions::ePdfPermissions_FillAndSign | PoDoFo::PdfEncrypt::EPdfPermissions::ePdfPermissions_Accessible | PoDoFo::PdfEncrypt::EPdfPermissions::ePdfPermissions_DocAssembly | PoDoFo::PdfEncrypt::EPdfPermissions::ePdfPermissions_HighPrint, PoDoFo::PdfEncrypt::EPdfEncryptAlgorithm::ePdfEncryptAlgorithm_RC4V2); } PoDoFo::EPdfVersion pdfVersion = static_cast(ui.comboBoxPdfVersion->itemData(ui.comboBoxPdfVersion->currentIndex()).toInt()); document = new PoDoFo::PdfStreamedDocument(filename.toLocal8Bit().data(), pdfVersion, encrypt); } catch(PoDoFo::PdfError& err) { errMsg = err.what(); return nullptr; } QFontInfo info(defaultFont); // Attempt to load the default/fallback font to ensure it is valid try { #if PODOFO_VERSION >= PODOFO_MAKE_VERSION(0,9,3) defaultPdfFont = document->CreateFontSubset(info.family().toLocal8Bit().data(), false, false, false, pdfFontEncoding); #else defaultPdfFont = document->CreateFontSubset(info.family().toLocal8Bit().data(), false, false, pdfFontEncoding); #endif } catch(PoDoFo::PdfError&) { } if(!defaultPdfFont) { errMsg = _("The PDF library could not load the font '%1'.").arg(defaultFont.family()); return nullptr; } // Set PDF info PoDoFo::PdfInfo* pdfInfo = document->GetInfo(); pdfInfo->SetProducer(ui.lineEditProducer->text().toStdString()); pdfInfo->SetCreator(ui.lineEditCreator->text().toStdString()); pdfInfo->SetTitle(ui.lineEditTitle->text().toStdString()); pdfInfo->SetSubject(ui.lineEditSubject->text().toStdString()); pdfInfo->SetKeywords(ui.lineEditKeywords->text().toStdString()); pdfInfo->SetAuthor(ui.lineEditAuthor->text().toStdString()); return new PoDoFoPDFPainter(document, pdfFontEncoding, defaultPdfFont, defaultFont.family(), defaultFont.pointSize()); } HOCRPdfExporter::PDFSettings HOCRPdfExporter::getPdfSettings() const { PDFSettings pdfSettings; pdfSettings.colorFormat = static_cast(ui.comboBoxImageFormat->itemData(ui.comboBoxImageFormat->currentIndex()).toInt()); pdfSettings.conversionFlags = pdfSettings.colorFormat == QImage::Format_Mono ? static_cast(ui.comboBoxDithering->itemData(ui.comboBoxDithering->currentIndex()).toInt()) : Qt::AutoColor; pdfSettings.compression = static_cast(ui.comboBoxImageCompression->itemData(ui.comboBoxImageCompression->currentIndex()).toInt()); pdfSettings.compressionQuality = ui.spinBoxCompressionQuality->value(); pdfSettings.fontFamily = ui.checkBoxFontFamily->isChecked() ? ui.comboBoxFontFamily->currentFont().family() : ""; pdfSettings.fontSize = ui.checkBoxFontSize->isChecked() ? ui.spinBoxFontSize->value() : -1; pdfSettings.uniformizeLineSpacing = ui.checkBoxUniformizeSpacing->isChecked(); pdfSettings.preserveSpaceWidth = ui.spinBoxPreserve->value(); pdfSettings.overlay = ui.comboBoxOutputMode->currentIndex() == 1; pdfSettings.detectedFontScaling = ui.spinFontScaling->value() / 100.; pdfSettings.sanitizeHyphens = ui.checkBoxSanitizeHyphens->isChecked(); return pdfSettings; } void HOCRPdfExporter::printChildren(PDFPainter& painter, const HOCRItem* item, const PDFSettings& pdfSettings, double px2pu/*pixels to printer units*/, double imgScale, double fontScale) { if(!item->isEnabled()) { return; } if(pdfSettings.fontSize != -1) { painter.setFontSize(pdfSettings.fontSize * fontScale); } QString itemClass = item->itemClass(); QRect itemRect = item->bbox(); int childCount = item->children().size(); if(itemClass == "ocr_par" && pdfSettings.uniformizeLineSpacing) { double yInc = double(itemRect.height()) / childCount; double y = itemRect.top() + yInc; QPair baseline = childCount > 0 ? item->children()[0]->baseLine() : qMakePair(0.0, 0.0); for(int iLine = 0; iLine < childCount; ++iLine, y += yInc) { HOCRItem* lineItem = item->children()[iLine]; int x = itemRect.x(); int prevWordRight = itemRect.x(); for(int iWord = 0, nWords = lineItem->children().size(); iWord < nWords; ++iWord) { HOCRItem* wordItem = lineItem->children()[iWord]; if(!wordItem->isEnabled()) { continue; } QRect wordRect = wordItem->bbox(); painter.setFontFamily(pdfSettings.fontFamily.isEmpty() ? wordItem->fontFamily() : pdfSettings.fontFamily, wordItem->fontBold(), wordItem->fontItalic()); if(pdfSettings.fontSize == -1) { painter.setFontSize(wordItem->fontSize() * pdfSettings.detectedFontScaling * fontScale); } // If distance from previous word is large, keep the space if(wordRect.x() - prevWordRight > pdfSettings.preserveSpaceWidth * painter.getAverageCharWidth() / px2pu) { x = wordRect.x(); } prevWordRight = wordRect.right(); QString text = wordItem->text(); if(iWord == nWords - 1 && pdfSettings.sanitizeHyphens) { text.replace(QRegExp("[-\u2014]\\s*$"), "-"); } double wordBaseline = (x - itemRect.x()) * baseline.first + baseline.second; painter.drawText(x * px2pu, (y + wordBaseline) * px2pu, text); x += painter.getTextWidth(text + " ") / px2pu; } } } else if(itemClass == "ocr_line" && !pdfSettings.uniformizeLineSpacing) { QPair baseline = item->baseLine(); for(int iWord = 0, nWords = item->children().size(); iWord < nWords; ++iWord) { HOCRItem* wordItem = item->children()[iWord]; if(!wordItem->isEnabled()) { continue; } QRect wordRect = wordItem->bbox(); painter.setFontFamily(pdfSettings.fontFamily.isEmpty() ? wordItem->fontFamily() : pdfSettings.fontFamily, wordItem->fontBold(), wordItem->fontItalic()); if(pdfSettings.fontSize == -1) { painter.setFontSize(wordItem->fontSize() * pdfSettings.detectedFontScaling * fontScale); } double y = itemRect.bottom() + (wordRect.center().x() - itemRect.x()) * baseline.first + baseline.second; QString text = wordItem->text(); if(iWord == nWords - 1 && pdfSettings.sanitizeHyphens) { text.replace(QRegExp("[-\u2014]\\s*$"), "-"); } painter.drawText(wordRect.x() * px2pu, y * px2pu, text); } } else if(itemClass == "ocr_graphic" && !pdfSettings.overlay) { QRect scaledItemRect(itemRect.left() * imgScale, itemRect.top() * imgScale, itemRect.width() * imgScale, itemRect.height() * imgScale); QRect printRect(itemRect.left() * px2pu, itemRect.top() * px2pu, itemRect.width() * px2pu, itemRect.height() * px2pu); QImage selection; QMetaObject::invokeMethod(this, "getSelection", QThread::currentThread() == qApp->thread() ? Qt::DirectConnection : Qt::BlockingQueuedConnection, Q_RETURN_ARG(QImage, selection), Q_ARG(QRect, scaledItemRect)); painter.drawImage(printRect, selection, pdfSettings); } else { for(int i = 0, n = item->children().size(); i < n; ++i) { printChildren(painter, item->children()[i], pdfSettings, px2pu, imgScale, fontScale); } } } void HOCRPdfExporter::updatePreview() { if(!m_preview) { return; } m_preview->setVisible(ui.checkBoxPreview->isChecked()); if(m_hocrdocument->pageCount() == 0 || !ui.checkBoxPreview->isChecked()) { return; } const HOCRPage* page = m_previewPage; QRect bbox = page->bbox(); int pageDpi = page->resolution(); PDFSettings pdfSettings = getPdfSettings(); QFont defaultFont = ui.checkBoxFontFamily->isChecked() ? ui.comboBoxFontFamily->currentFont() : ui.comboBoxFallbackFontFamily->currentFont(); QImage image(bbox.size(), QImage::Format_ARGB32); image.setDotsPerMeterX(pageDpi / 0.0254); // 1 in = 0.0254 m image.setDotsPerMeterY(pageDpi / 0.0254); QPainter painter(&image); painter.setRenderHint(QPainter::Antialiasing); QPainterPDFPainter pdfPrinter(&painter, defaultFont); if(!pdfSettings.fontFamily.isEmpty()) { pdfPrinter.setFontFamily(pdfSettings.fontFamily, false, false); } if(pdfSettings.fontSize != -1) { pdfPrinter.setFontSize(pdfSettings.fontSize); } if(pdfSettings.overlay) { pdfPrinter.drawImage(bbox, m_displayerTool->getSelection(bbox), pdfSettings); painter.fillRect(0, 0, bbox.width(), bbox.height(), QColor(255, 255, 255, 127)); } else { image.fill(Qt::white); } // Units of QPainter on pixel based devices is pixels, so px2pu = 1. printChildren(pdfPrinter, page, pdfSettings, 1.); m_preview->setPixmap(QPixmap::fromImage(image)); m_preview->setPos(-0.5 * bbox.width(), -0.5 * bbox.height()); } void HOCRPdfExporter::backendChanged() { int jpegIdx = ui.comboBoxImageCompression->findData(PDFSettings::CompressJpeg); bool podofoBackend = ui.comboBoxBackend->itemData(ui.comboBoxBackend->currentIndex()).toInt() == BackendPoDoFo; ui.groupBoxEncryption->setEnabled(podofoBackend); ui.labelImageCompression->setEnabled(podofoBackend); ui.comboBoxImageCompression->setEnabled(podofoBackend); if(!podofoBackend) { // QPainter compresses images in PDFs to JPEG at 94% quality ui.comboBoxImageCompression->setCurrentIndex(jpegIdx); ui.spinBoxCompressionQuality->setValue(94); } ui.labelAuthor->setEnabled(podofoBackend); ui.lineEditAuthor->setEnabled(podofoBackend); ui.labelTitle->setEnabled(podofoBackend); ui.lineEditTitle->setEnabled(podofoBackend); ui.labelProducer->setEnabled(podofoBackend); ui.lineEditProducer->setEnabled(podofoBackend); ui.labelKeywords->setEnabled(podofoBackend); ui.lineEditKeywords->setEnabled(podofoBackend); ui.labelSubject->setEnabled(podofoBackend); ui.lineEditSubject->setEnabled(podofoBackend); ui.labelPdfVersion->setEnabled(podofoBackend); ui.comboBoxPdfVersion->setEnabled(podofoBackend); ui.spinBoxCompressionQuality->setEnabled(podofoBackend); ui.labelCompressionQuality->setEnabled(podofoBackend); } void HOCRPdfExporter::toggleBackendHint() { QString tooltip = tr("
  • PoDoFo: offers more image compression options, but does not handle complex scripts.
  • QPrinter: only supports JPEG compression for storing images, but supports complex scripts.
"); QRect r = ui.toolButtonBackendHint->rect(); QToolTip::showText(ui.toolButtonBackendHint->mapToGlobal(QPoint(0, 0.5 * r.height())), tooltip, ui.toolButtonBackendHint, r); } void HOCRPdfExporter::imageFormatChanged() { QImage::Format format = static_cast(ui.comboBoxImageFormat->itemData(ui.comboBoxImageFormat->currentIndex()).toInt()); QStandardItemModel* model = static_cast(ui.comboBoxImageCompression->model()); int zipIdx = ui.comboBoxImageCompression->findData(PDFSettings::CompressZip); int ccittIdx = ui.comboBoxImageCompression->findData(PDFSettings::CompressFax4); int jpegIdx = ui.comboBoxImageCompression->findData(PDFSettings::CompressJpeg); QStandardItem* ccittItem = model->item(ccittIdx); QStandardItem* jpegItem = model->item(jpegIdx); if(format == QImage::Format_Mono) { // for monochrome images, allow zip and ccitt4 (but not jpeg, unless QPrinter is forcing us) if(ui.comboBoxImageCompression->currentIndex() == jpegIdx && ui.comboBoxBackend->itemData(ui.comboBoxBackend->currentIndex()).toInt() != BackendQPrinter) { ui.comboBoxImageCompression->setCurrentIndex(zipIdx); } ccittItem->setFlags(ccittItem->flags() | Qt::ItemIsSelectable | Qt::ItemIsEnabled); jpegItem->setFlags(jpegItem->flags() & ~(Qt::ItemIsSelectable | Qt::ItemIsEnabled)); ui.labelDithering->setEnabled(true); ui.comboBoxDithering->setEnabled(true); } else { // for color and grayscale images, allow jpeg and zip (but not ccitt4) if(ui.comboBoxImageCompression->currentIndex() == ccittIdx) { ui.comboBoxImageCompression->setCurrentIndex(zipIdx); } ccittItem->setFlags(ccittItem->flags() & ~(Qt::ItemIsSelectable | Qt::ItemIsEnabled)); jpegItem->setFlags(jpegItem->flags() | Qt::ItemIsSelectable | Qt::ItemIsEnabled); ui.labelDithering->setEnabled(false); ui.comboBoxDithering->setEnabled(false); } } void HOCRPdfExporter::imageCompressionChanged() { PDFSettings::Compression compression = static_cast(ui.comboBoxImageCompression->itemData(ui.comboBoxImageCompression->currentIndex()).toInt()); bool jpegCompression = compression == PDFSettings::CompressJpeg; ui.spinBoxCompressionQuality->setEnabled(jpegCompression); ui.labelCompressionQuality->setEnabled(jpegCompression); } bool HOCRPdfExporter::setSource(const QString& sourceFile, int page, int dpi, double angle) { if(MAIN->getSourceManager()->addSource(sourceFile, true)) { MAIN->getDisplayer()->setup(&page, &dpi, &angle); return true; } else { return false; } } QImage HOCRPdfExporter::getSelection(const QRect& bbox) { return m_displayerTool->getSelection(bbox); } void HOCRPdfExporter::paperSizeChanged() { QString paperSize = ui.comboBoxPaperSize->itemData(ui.comboBoxPaperSize->currentIndex()).toString(); if(paperSize == "custom") { ui.lineEditPaperWidth->setEnabled(true); ui.lineEditPaperHeight->setEnabled(true); ui.widgetPaperSize->setVisible(true); ui.widgetPaperOrientation->setVisible(false); ui.widgetPaperSizeDpi->setVisible(false); } else if(paperSize == "source") { ui.lineEditPaperWidth->setEnabled(true); ui.lineEditPaperHeight->setEnabled(true); ui.widgetPaperSize->setVisible(false); ui.widgetPaperOrientation->setVisible(false); ui.widgetPaperSizeDpi->setVisible(true); } else { ui.widgetPaperSize->setVisible(true); ui.widgetPaperOrientation->setVisible(true); ui.widgetPaperSizeDpi->setVisible(false); ui.lineEditPaperWidth->setDisabled(true); ui.lineEditPaperHeight->setDisabled(true); PaperSize::Unit unit = static_cast(ui.comboBoxPaperSizeUnit->itemData(ui.comboBoxPaperSizeUnit->currentIndex()).toInt()); auto outputPaperSize = PaperSize::getSize(unit, paperSize.toStdString(), ui.toolButtonLandscape->isChecked()); QLocale locale; ui.lineEditPaperWidth->setText(locale.toString(outputPaperSize.width, 'f', 1)); ui.lineEditPaperHeight->setText(locale.toString(outputPaperSize.height, 'f', 1)); } updateValid(); } void HOCRPdfExporter::updateValid() { bool valid = true; // Passwords must match if(ui.lineEditPasswordOpen->text() == ui.lineEditConfirmPasswordOpen->text()) { ui.lineEditConfirmPasswordOpen->setStyleSheet(QStringLiteral("")); } else { ui.lineEditConfirmPasswordOpen->setStyleSheet("background: #FF7777; color: #FFFFFF;"); valid = false; } // In custom paper size mode, size must be specified QString paperSize = ui.comboBoxPaperSize->itemData(ui.comboBoxPaperSize->currentIndex()).toString(); ui.lineEditPaperWidth->setStyleSheet(QStringLiteral("")); ui.lineEditPaperHeight->setStyleSheet(QStringLiteral("")); if(paperSize == "custom") { if(ui.lineEditPaperWidth->text().isEmpty()) { ui.lineEditPaperWidth->setStyleSheet("background: #FF7777; color: #FFFFFF;"); valid = false; } if(ui.lineEditPaperHeight->text().isEmpty()) { ui.lineEditPaperHeight->setStyleSheet("background: #FF7777; color: #FFFFFF;"); valid = false; } } ui.buttonBox->button(QDialogButtonBox::Ok)->setEnabled(valid); } void HOCRPdfExporter::importMetadataFromSource() { QList sources = MAIN->getSourceManager()->getSelectedSources(); if(!sources.isEmpty()) { Source* source = sources.first(); ui.lineEditAuthor->setText(source->author); ui.lineEditCreator->setText(source->creator); ui.lineEditKeywords->setText(source->keywords); ui.lineEditTitle->setText(source->title); ui.lineEditSubject->setText(source->subject); ui.lineEditProducer->setText(source->producer); PoDoFo::EPdfVersion sourcePdfVersion = PoDoFo::EPdfVersion::ePdfVersion_1_7; if(source->pdfVersionMajor == 1 && source->pdfVersionMinor >= 0 && source->pdfVersionMinor <= 7) { sourcePdfVersion = static_cast(PoDoFo::EPdfVersion::ePdfVersion_1_0 + source->pdfVersionMinor); } ui.comboBoxPdfVersion->setCurrentIndex(ui.comboBoxPdfVersion->findData(sourcePdfVersion)); } } gImageReader-3.3.1/qt/src/hocr/HOCRPdfExporter.hh000066400000000000000000000101471351740627400214530ustar00rootroot00000000000000/* -*- Mode: C++; indent-tabs-mode: t; c-basic-offset: 4; tab-width: 4 -*- */ /* * HOCRPdfExporter.hh * Copyright (C) 2013-2019 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 HOCRPDFEXPORTER_HH #define HOCRPDFEXPORTER_HH #include #include #include "common.hh" #include "ui_PdfExportDialog.h" class QFontDialog; class QGraphicsPixmapItem; class DisplayerToolHOCR; class HOCRDocument; class HOCRPage; class HOCRItem; class HOCRPdfExporter: public QDialog { Q_OBJECT public: HOCRPdfExporter(const HOCRDocument* hocrdocument, const HOCRPage* previewPage, DisplayerToolHOCR* displayerTool, QWidget* parent = 0); bool run(QString& filebasename); private: enum PDFBackend { BackendPoDoFo, BackendQPrinter}; struct PDFSettings { QImage::Format colorFormat; Qt::ImageConversionFlags conversionFlags; enum Compression { CompressZip, CompressFax4, CompressJpeg } compression; int compressionQuality; QString fontFamily; int fontSize; bool uniformizeLineSpacing; int preserveSpaceWidth; bool overlay; double detectedFontScaling; bool sanitizeHyphens; }; class PDFPainter { public: virtual ~PDFPainter() {} virtual void setFontFamily(const QString& family, bool bold, bool italic) = 0; 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; virtual bool createPage(double /*width*/, double /*height*/, double /*offsetX*/, double /*offsetY*/, QString& /*errMsg*/) { return true; } virtual void finishPage() {} virtual bool finishDocument(QString& /*errMsg*/) { return true; } 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; class QPrinterPDFPainter; Ui::PdfExportDialog ui; QGraphicsPixmapItem* m_preview = nullptr; const HOCRDocument* m_hocrdocument; const HOCRPage* m_previewPage; DisplayerToolHOCR* m_displayerTool; PDFSettings getPdfSettings() const; PDFPainter* createPoDoFoPrinter(const QString& filename, const QFont& defaultFont, QString& errMsg); void printChildren(PDFPainter& painter, const HOCRItem* item, const PDFSettings& pdfSettings, double px2pu, double imgScale = 1., double fontScale = 1.); private slots: void backendChanged(); void toggleBackendHint(); void importMetadataFromSource(); void imageFormatChanged(); void imageCompressionChanged(); void paperSizeChanged(); void updatePreview(); bool setSource(const QString& sourceFile, int page, int dpi, double angle); QImage getSelection(const QRect& bbox); void updateValid(); }; #endif // HOCRPDFEXPORTER_HH gImageReader-3.3.1/qt/src/hocr/HOCRTextExporter.cc000066400000000000000000000056031351740627400216550ustar00rootroot00000000000000/* -*- Mode: C++; indent-tabs-mode: t; c-basic-offset: 4; tab-width: 4 -*- */ /* * HOCRTextExporter.cc * Copyright (C) 2013-2019 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 "HOCRDocument.hh" #include "HOCRTextExporter.hh" #include "MainWindow.hh" #include "FileDialogs.hh" #include "SourceManager.hh" #include #include #include #include bool HOCRTextExporter::run(const HOCRDocument* hocrdocument, QString& filebasename) { QString suggestion = filebasename; if(suggestion.isEmpty()) { QList sources = MAIN->getSourceManager()->getSelectedSources(); suggestion = !sources.isEmpty() ? QFileInfo(sources.first()->displayname).baseName() : _("output"); } QString outname = FileDialogs::saveDialog(_("Save Text Output..."), suggestion + ".txt", "outputdir", QString("%1 (*.txt)").arg(_("Text Files"))); if(outname.isEmpty()) { return false; } filebasename = QFileInfo(outname).completeBaseName(); QFile outputFile(outname); if(!outputFile.open(QIODevice::WriteOnly)) { QMessageBox::warning(MAIN, _("Export failed"), _("The text export failed: unable to write output file.")); return false; } QString output; QTextStream outputStream(&output, QIODevice::WriteOnly); for(int i = 0, n = hocrdocument->pageCount(); i < n; ++i) { const HOCRPage* page = hocrdocument->page(i); if(!page->isEnabled()) { continue; } printItem(outputStream, page); } outputFile.write(MAIN->getConfig()->useUtf8() ? output.toUtf8() : output.toLocal8Bit()); outputFile.close(); bool openAfterExport = ConfigSettings::get("openafterexport")->getValue(); if(openAfterExport) { QDesktopServices::openUrl(QUrl::fromLocalFile(outname)); } return true; } void HOCRTextExporter::printItem(QTextStream& outputStream, const HOCRItem* item, bool lastChild) { if(!item->isEnabled()) { return; } QString itemClass = item->itemClass(); if(itemClass == "ocrx_word") { outputStream << item->text(); if(!lastChild) { outputStream << " "; } } else { for(int i = 0, n = item->children().size(); i < n; ++i) { printItem(outputStream, item->children()[i], i == n - 1); } } if(itemClass == "ocr_line" || itemClass == "ocr_par") { outputStream << "\n"; } } gImageReader-3.3.1/qt/src/hocr/HOCRTextExporter.hh000066400000000000000000000022731351740627400216670ustar00rootroot00000000000000/* -*- Mode: C++; indent-tabs-mode: t; c-basic-offset: 4; tab-width: 4 -*- */ /* * HOCRTextExporter.hh * Copyright (C) 2013-2019 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 HOCRTEXTEXPORTER_HH #define HOCRTEXTEXPORTER_HH #include "common.hh" #include class HOCRDocument; class HOCRItem; class QTextStream; class HOCRTextExporter { public: bool run(const HOCRDocument* hocrdocument, QString& filebasename); private: void printItem(QTextStream& outputStream, const HOCRItem* item, bool lastChild = false); }; #endif // HOCRTEXTEXPORTER_HH gImageReader-3.3.1/qt/src/hocr/OutputEditorHOCR.cc000066400000000000000000001302701351740627400216460ustar00rootroot00000000000000/* -*- Mode: C++; indent-tabs-mode: t; c-basic-offset: 4; tab-width: 4 -*- */ /* * OutputEditorHOCR.cc * Copyright (C) 2013-2019 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 #define USE_STD_NAMESPACE #include #include #undef USE_STD_NAMESPACE #include "ConfigSettings.hh" #include "DisplayerToolHOCR.hh" #include "FileDialogs.hh" #include "HOCRDocument.hh" #include "HOCROdtExporter.hh" #include "HOCRPdfExporter.hh" #include "HOCRTextExporter.hh" #include "MainWindow.hh" #include "OutputEditorHOCR.hh" #include "Recognizer.hh" #include "SourceManager.hh" #include "Utils.hh" 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); } }; /////////////////////////////////////////////////////////////////////////////// HOCRAttributeEditor::HOCRAttributeEditor(const QString& value, HOCRDocument* doc, const QModelIndex& itemIndex, const QString& attrName, const QString& attrItemClass) : QLineEdit(value), m_doc(doc), m_itemIndex(itemIndex), m_attrName(attrName), m_origValue(value), m_attrItemClass(attrItemClass) { setFrame(false); connect(m_doc, SIGNAL(itemAttributeChanged(QModelIndex, QString, QString)), this, SLOT(updateValue(QModelIndex, QString, QString))); connect(this, SIGNAL(textChanged(QString)), this, SLOT(validateChanges())); } void HOCRAttributeEditor::focusOutEvent(QFocusEvent* ev) { QLineEdit::focusOutEvent(ev); validateChanges(); } void HOCRAttributeEditor::updateValue(const QModelIndex& itemIndex, const QString& name, const QString& value) { if(itemIndex == m_itemIndex && name == m_attrName) { blockSignals(true); setText(value); blockSignals(false); } } void HOCRAttributeEditor::validateChanges() { if(!hasFocus()) { int pos; QString newValue = text(); if(newValue == m_origValue) { return; } if(validator() && validator()->validate(newValue, pos) != QValidator::Acceptable) { setText(m_origValue); } else { m_doc->editItemAttribute(m_itemIndex, m_attrName, newValue, m_attrItemClass); m_origValue = newValue; } } } /////////////////////////////////////////////////////////////////////////////// HOCRAttributeCheckbox::HOCRAttributeCheckbox(Qt::CheckState value, HOCRDocument* doc, const QModelIndex& itemIndex, const QString& attrName, const QString& attrItemClass) : m_doc(doc), m_itemIndex(itemIndex), m_attrName(attrName), m_attrItemClass(attrItemClass) { setCheckState(value); connect(m_doc, SIGNAL(itemAttributeChanged(QModelIndex, QString, QString)), this, SLOT(updateValue(QModelIndex, QString, QString))); connect(this, SIGNAL(stateChanged(int)), this, SLOT(valueChanged())); } void HOCRAttributeCheckbox::updateValue(const QModelIndex& itemIndex, const QString& name, const QString& value) { if(itemIndex == m_itemIndex && name == m_attrName) { blockSignals(true); setChecked(value == "1"); blockSignals(false); } } void HOCRAttributeCheckbox::valueChanged() { m_doc->editItemAttribute(m_itemIndex, m_attrName, isChecked() ? "1" : "0", m_attrItemClass); } /////////////////////////////////////////////////////////////////////////////// class HOCRTextDelegate : public QStyledItemDelegate { public: using QStyledItemDelegate::QStyledItemDelegate; QWidget* createEditor(QWidget* parent, const QStyleOptionViewItem& /* option */, const QModelIndex& /* index */) const { return new QLineEdit(parent); } void setEditorData(QWidget* editor, const QModelIndex& index) const { m_currentIndex = index; m_currentEditor = static_cast(editor); static_cast(editor)->setText(index.model()->data(index, Qt::EditRole).toString()); } void setModelData(QWidget* editor, QAbstractItemModel* model, const QModelIndex& index) const { model->setData(index, static_cast(editor)->text(), Qt::EditRole); } const QModelIndex& getCurrentIndex() const { return m_currentIndex; } QLineEdit* getCurrentEditor() const { return m_currentEditor; } private: mutable QModelIndex m_currentIndex; mutable QPointer m_currentEditor; }; /////////////////////////////////////////////////////////////////////////////// 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_preview = new QGraphicsPixmapItem(); m_preview->setTransformationMode(Qt::SmoothTransformation); m_preview->setZValue(2); MAIN->getDisplayer()->scene()->addItem(m_preview); m_previewTimer.setSingleShot(true); ui.actionOutputReplace->setShortcut(Qt::CTRL + Qt::Key_F); ui.actionOutputSaveHOCR->setShortcut(Qt::CTRL + Qt::Key_S); ui.actionNavigateNext->setShortcut(Qt::Key_F3); ui.actionNavigatePrev->setShortcut(Qt::SHIFT + Qt::Key_F3); m_document = new HOCRDocument(&m_spell, ui.treeViewHOCR); ui.treeViewHOCR->setModel(m_document); ui.treeViewHOCR->setContextMenuPolicy(Qt::CustomContextMenu); ui.treeViewHOCR->header()->setStretchLastSection(false); ui.treeViewHOCR->header()->setSectionResizeMode(0, QHeaderView::Stretch); ui.treeViewHOCR->setColumnWidth(1, 32); ui.treeViewHOCR->setColumnHidden(1, true); ui.treeViewHOCR->setItemDelegateForColumn(0, new HOCRTextDelegate(ui.treeViewHOCR)); ui.comboBoxNavigate->addItem(_("Page"), "ocr_page"); ui.comboBoxNavigate->addItem(_("Block"), "ocr_carea"); ui.comboBoxNavigate->addItem(_("Paragraph"), "ocr_par"); ui.comboBoxNavigate->addItem(_("Line"), "ocr_line"); ui.comboBoxNavigate->addItem(_("Word"), "ocrx_word"); ui.comboBoxNavigate->addItem(_("Misspelled word"), "ocrx_word_bad"); QShortcut* shortcut = new QShortcut(QKeySequence(Qt::Key_Delete), m_widget); QObject::connect(shortcut, SIGNAL(activated()), this, SLOT(removeItem())); connect(ui.actionOutputOpen, SIGNAL(triggered()), this, SLOT(open())); connect(ui.actionOutputSaveHOCR, SIGNAL(triggered()), this, SLOT(save())); connect(ui.actionOutputExportODT, SIGNAL(triggered()), this, SLOT(exportToODT())); connect(ui.actionOutputExportPDF, SIGNAL(triggered()), this, SLOT(exportToPDF())); connect(ui.actionOutputExportText, SIGNAL(triggered()), this, SLOT(exportToText())); connect(ui.actionOutputClear, SIGNAL(triggered()), this, SLOT(clear())); connect(ui.actionOutputReplace, SIGNAL(toggled(bool)), ui.searchFrame, SLOT(setVisible(bool))); connect(ui.actionOutputReplace, SIGNAL(toggled(bool)), ui.searchFrame, SLOT(clear())); connect(ui.actionToggleWConf, SIGNAL(toggled(bool)), this, SLOT(toggleWConfColumn(bool))); connect(ui.actionPreview, SIGNAL(toggled(bool)), this, SLOT(updatePreview())); connect(&m_previewTimer, SIGNAL(timeout()), this, SLOT(updatePreview())); connect(ui.searchFrame, SIGNAL(findReplace(QString, QString, bool, bool, bool)), this, SLOT(findReplace(QString, QString, bool, bool, bool))); connect(ui.searchFrame, SIGNAL(replaceAll(QString, QString, bool)), this, SLOT(replaceAll(QString, QString, bool))); connect(ui.searchFrame, SIGNAL(applySubstitutions(QMap, bool)), this, SLOT(applySubstitutions(QMap, bool))); connect(ConfigSettings::get("customoutputfont"), SIGNAL(changed()), this, SLOT(setFont())); connect(ConfigSettings::get("systemoutputfont"), SIGNAL(changed()), this, SLOT(setFont())); connect(ui.treeViewHOCR->selectionModel(), SIGNAL(currentRowChanged(QModelIndex, QModelIndex)), this, SLOT(showItemProperties(QModelIndex, QModelIndex))); connect(ui.treeViewHOCR, SIGNAL(customContextMenuRequested(QPoint)), this, SLOT(showTreeWidgetContextMenu(QPoint))); connect(ui.tabWidget, SIGNAL(currentChanged(int)), this, SLOT(updateSourceText())); connect(m_tool, SIGNAL(bboxChanged(QRect)), this, SLOT(updateCurrentItemBBox(QRect))); connect(m_tool, SIGNAL(bboxDrawn(QRect, int)), this, SLOT(bboxDrawn(QRect, int))); connect(m_tool, SIGNAL(positionPicked(QPoint)), this, SLOT(pickItem(QPoint))); connect(m_document, SIGNAL(dataChanged(QModelIndex, QModelIndex, QVector)), this, SLOT(setModified())); connect(m_document, SIGNAL(rowsInserted(QModelIndex, int, int)), this, SLOT(setModified())); connect(m_document, SIGNAL(rowsRemoved(QModelIndex, int, int)), this, SLOT(setModified())); connect(m_document, SIGNAL(itemAttributeChanged(QModelIndex, QString, QString)), this, SLOT(setModified())); connect(m_document, SIGNAL(itemAttributeChanged(QModelIndex, QString, QString)), this, SLOT(updateSourceText())); connect(ui.comboBoxNavigate, SIGNAL(currentIndexChanged(int)), this, SLOT(navigateTargetChanged())); connect(ui.actionNavigateNext, SIGNAL(triggered(bool)), this, SLOT(navigateNext())); connect(ui.actionNavigatePrev, SIGNAL(triggered(bool)), this, SLOT(navigatePrev())); connect(ui.actionExpandAll, SIGNAL(triggered(bool)), this, SLOT(expandItemClass())); connect(ui.actionCollapseAll, SIGNAL(triggered(bool)), this, SLOT(collapseItemClass())); setFont(); } OutputEditorHOCR::~OutputEditorHOCR() { m_previewTimer.stop(); delete m_preview; delete m_widget; } void OutputEditorHOCR::setFont() { if(ConfigSettings::get("systemoutputfont")->getValue()) { ui.plainTextEditOutput->setFont(QFont()); } else { ui.plainTextEditOutput->setFont(ConfigSettings::get("customoutputfont")->getValue()); } } void OutputEditorHOCR::setModified() { ui.actionOutputSaveHOCR->setEnabled(m_document->pageCount() > 0); ui.toolButtonOutputExport->setEnabled(m_document->pageCount() > 0); ui.toolBarNavigate->setEnabled(m_document->pageCount() > 0); m_preview->setVisible(false); m_previewTimer.start(100); // Use a timer because setModified is potentially called a large number of times when the HOCR tree changes m_modified = true; } 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"); QMap attrs = HOCRItem::deserializeAttrGroup(pageDiv.attribute("title")); attrs["image"] = QString("'%1'").arg(data.file); attrs["ppageno"] = QString::number(data.page); attrs["rot"] = QString::number(data.angle); attrs["res"] = QString::number(data.resolution); pageDiv.setAttribute("title", HOCRItem::serializeAttrGroup(attrs)); QModelIndex index = m_document->addPage(pageDiv, true); expandCollapseChildren(index, true); MAIN->setOutputPaneVisible(true); m_modified = true; } void OutputEditorHOCR::navigateTargetChanged() { QString target = ui.comboBoxNavigate->itemData(ui.comboBoxNavigate->currentIndex()).toString(); bool allowExpandCollapse = !target.startsWith("ocrx_word"); ui.actionExpandAll->setEnabled(allowExpandCollapse); ui.actionCollapseAll->setEnabled(allowExpandCollapse); } void OutputEditorHOCR::expandCollapseItemClass(bool expand) { QString target = ui.comboBoxNavigate->itemData(ui.comboBoxNavigate->currentIndex()).toString(); QModelIndex start = m_document->index(0, 0); QModelIndex next = start; do { const HOCRItem* item = m_document->itemAtIndex(next); if(item && item->itemClass() == target) { if(expand) { ui.treeViewHOCR->setExpanded(next, expand); for(QModelIndex parent = next.parent(); parent.isValid(); parent = parent.parent()) { ui.treeViewHOCR->setExpanded(parent, true); } for(QModelIndex child = next.child(0, 0); child.isValid(); child = child.sibling(child.row() + 1, 0)) { expandCollapseChildren(child, false); } } else { expandCollapseChildren(next, false); } } next = m_document->nextIndex(next); } while(next != start); ui.treeViewHOCR->scrollTo(ui.treeViewHOCR->currentIndex()); } void OutputEditorHOCR::navigateNextPrev(bool next) { QString target = ui.comboBoxNavigate->itemData(ui.comboBoxNavigate->currentIndex()).toString(); bool misspelled = false; if(target == "ocrx_word_bad") { target = "ocrx_word"; misspelled = true; } QModelIndex start = ui.treeViewHOCR->currentIndex(); if(!start.isValid()) { start = m_document->index(0, 0); } QModelIndex curr = next ? m_document->nextIndex(start) : m_document->prevIndex(start); while(curr != start) { const HOCRItem* item = m_document->itemAtIndex(curr); if(item && item->itemClass() == target && (!misspelled || m_document->indexIsMisspelledWord(curr))) { break; } curr = next ? m_document->nextIndex(curr) : m_document->prevIndex(curr); }; ui.treeViewHOCR->setCurrentIndex(curr); } void OutputEditorHOCR::expandCollapseChildren(const QModelIndex& index, bool expand) const { int nChildren = m_document->rowCount(index); if(nChildren > 0) { ui.treeViewHOCR->setExpanded(index, expand); for(int i = 0; i < nChildren; ++i) { expandCollapseChildren(index.child(i, 0), expand); } } } bool OutputEditorHOCR::showPage(const HOCRPage* page) { return page && MAIN->getSourceManager()->addSource(page->sourceFile(), true) && MAIN->getDisplayer()->setup(&page->pageNr(), &page->resolution(), &page->angle()); } void OutputEditorHOCR::showItemProperties(const QModelIndex& index, const QModelIndex& prev) { m_tool->setAction(DisplayerToolHOCR::ACTION_NONE); const HOCRItem* prevItem = m_document->itemAtIndex(prev); if(ui.treeViewHOCR->currentIndex() != index) { ui.treeViewHOCR->blockSignals(true); ui.treeViewHOCR->setCurrentIndex(index); ui.treeViewHOCR->blockSignals(false); } ui.tableWidgetProperties->setRowCount(0); ui.plainTextEditOutput->setPlainText(""); const HOCRItem* currentItem = m_document->itemAtIndex(index); if(!currentItem) { m_tool->clearSelection(); return; } const HOCRPage* page = currentItem->page(); int row = -1; QMap attrs = currentItem->getAllAttributes(); for(auto it = attrs.begin(), itEnd = attrs.end(); it != itEnd; ++it) { QString attrName = it.key(); if(attrName == "class" || attrName == "id") { continue; } QStringList parts = attrName.split(":"); ui.tableWidgetProperties->insertRow(++row); QTableWidgetItem* attrNameItem = new QTableWidgetItem(parts.last()); attrNameItem->setFlags(attrNameItem->flags() & ~Qt::ItemIsEditable); ui.tableWidgetProperties->setItem(row, 0, attrNameItem); ui.tableWidgetProperties->setCellWidget(row, 1, createAttrWidget(index, attrName, it.value())); } // ocr_class:attr_key:attr_values QMap>> occurrences; currentItem->getPropagatableAttributes(occurrences); for(auto it = occurrences.begin(), itEnd = occurrences.end(); it != itEnd; ++it) { ui.tableWidgetProperties->insertRow(++row); QTableWidgetItem* sectionItem = new QTableWidgetItem(it.key()); sectionItem->setFlags(sectionItem->flags() & ~(Qt::ItemIsEditable | Qt::ItemIsSelectable)); sectionItem->setBackgroundColor(Qt::lightGray); QFont sectionFont = sectionItem->font(); sectionFont.setBold(true); sectionItem->setFont(sectionFont); ui.tableWidgetProperties->setItem(row, 0, sectionItem); ui.tableWidgetProperties->setSpan(row, 0, 1, 2); for(auto attrIt = it.value().begin(), attrItEnd = it.value().end(); attrIt != attrItEnd; ++attrIt) { const QString& attrName = attrIt.key(); const QSet& attrValues = attrIt.value(); int attrValueCount = attrValues.size(); ui.tableWidgetProperties->insertRow(++row); QStringList parts = attrName.split(":"); QTableWidgetItem* attrNameItem = new QTableWidgetItem(parts.last()); attrNameItem->setFlags(attrNameItem->flags() & ~Qt::ItemIsEditable); ui.tableWidgetProperties->setItem(row, 0, attrNameItem); ui.tableWidgetProperties->setCellWidget(row, 1, createAttrWidget(index, attrName, attrValueCount == 1 ? * (attrValues.begin()) : "", it.key(), attrValueCount > 1)); } } ui.plainTextEditOutput->setPlainText(currentItem->toHtml()); if(showPage(page)) { // Update preview if necessary if(!prevItem || prevItem->page() != page) { updatePreview(); } // Minimum bounding box QRect minBBox; if(currentItem->itemClass() == "ocr_page") { minBBox = currentItem->bbox(); } else { for(const HOCRItem* child : currentItem->children()) { minBBox = minBBox.united(child->bbox()); } } m_tool->setSelection(currentItem->bbox(), minBBox); } } QWidget* OutputEditorHOCR::createAttrWidget(const QModelIndex& itemIndex, const QString& attrName, const QString& attrValue, const QString& attrItemClass, bool multiple) { static QMap attrLineEdits = { {"title:bbox", "\\d+\\s+\\d+\\s+\\d+\\s+\\d+"}, {"lang", "[a-z]{2,}(?:_[A-Z]{2,})?"}, {"title:x_fsize", "\\d+"}, {"title:baseline", "[-+]?\\d+\\.?\\d*\\s[-+]?\\d+\\.?\\d*"} }; auto it = attrLineEdits.find(attrName); if(it != attrLineEdits.end()) { QLineEdit* lineEdit = new HOCRAttributeEditor(attrValue, m_document, itemIndex, attrName, attrItemClass); lineEdit->setValidator(new QRegExpValidator(QRegExp(it.value()))); if(multiple) { lineEdit->setPlaceholderText(_("Multiple values")); } return lineEdit; } else if(attrName == "title:x_font") { QFontComboBox* combo = new QFontComboBox(); combo->setCurrentIndex(-1); QLineEdit* edit = new HOCRAttributeEditor(attrValue, m_document, itemIndex, attrName, attrItemClass); edit->blockSignals(true); // Because the combobox alters the text as soon as setLineEdit is called... combo->setLineEdit(edit); edit->setText(attrValue); edit->blockSignals(false); if(multiple) { combo->lineEdit()->setPlaceholderText(_("Multiple values")); } return combo; } else if(attrName == "bold" || attrName == "italic") { Qt::CheckState value = multiple ? Qt::PartiallyChecked : attrValue == "1" ? Qt::Checked : Qt::Unchecked; return new HOCRAttributeCheckbox(value, m_document, itemIndex, attrName, attrItemClass); } else { QLineEdit* lineEdit = new QLineEdit(attrValue); lineEdit->setFrame(false); lineEdit->setReadOnly(true); return lineEdit; } } void OutputEditorHOCR::updateCurrentItemBBox(QRect bbox) { QModelIndex current = ui.treeViewHOCR->selectionModel()->currentIndex(); QString bboxstr = QString("%1 %2 %3 %4").arg(bbox.left()).arg(bbox.top()).arg(bbox.right()).arg(bbox.bottom()); m_document->editItemAttribute(current, "title:bbox", bboxstr); } void OutputEditorHOCR::updateSourceText() { if(ui.tabWidget->currentWidget() == ui.plainTextEditOutput) { QModelIndex current = ui.treeViewHOCR->selectionModel()->currentIndex(); const HOCRItem* currentItem = m_document->itemAtIndex(current); if(currentItem) { ui.plainTextEditOutput->setPlainText(currentItem->toHtml()); } } } void OutputEditorHOCR::bboxDrawn(const QRect& bbox, int action) { QDomDocument doc; QModelIndex current = ui.treeViewHOCR->selectionModel()->currentIndex(); const HOCRItem* currentItem = m_document->itemAtIndex(current); if(!currentItem) { return; } QMap>> propAttrs; currentItem->getPropagatableAttributes(propAttrs); QDomElement newElement; if(action == DisplayerToolHOCR::ACTION_DRAW_GRAPHIC_RECT) { newElement = doc.createElement("div"); newElement.setAttribute("class", "ocr_graphic"); newElement.setAttribute("title", QString("bbox %1 %2 %3 %4").arg(bbox.left()).arg(bbox.top()).arg(bbox.right()).arg(bbox.bottom())); } else if(action == DisplayerToolHOCR::ACTION_DRAW_CAREA_RECT) { newElement = doc.createElement("div"); newElement.setAttribute("class", "ocr_carea"); newElement.setAttribute("title", QString("bbox %1 %2 %3 %4").arg(bbox.left()).arg(bbox.top()).arg(bbox.right()).arg(bbox.bottom())); } else if(action == DisplayerToolHOCR::ACTION_DRAW_PAR_RECT) { newElement = doc.createElement("p"); newElement.setAttribute("class", "ocr_par"); newElement.setAttribute("title", QString("bbox %1 %2 %3 %4").arg(bbox.left()).arg(bbox.top()).arg(bbox.right()).arg(bbox.bottom())); } else if(action == DisplayerToolHOCR::ACTION_DRAW_LINE_RECT) { newElement = doc.createElement("span"); newElement.setAttribute("class", "ocr_line"); QSet propLineBaseline = propAttrs["ocrx_line"]["baseline"]; // Tesseract does as follows: // row_height = x_height + ascenders - descenders // font_pt_size = row_height * 72 / dpi (72 = pointsPerInch) // As a first approximation, assume x_size = bbox.height() and ascenders = descenders = bbox.height() / 4 QMap titleAttrs; titleAttrs["bbox"] = QString("%1 %2 %3 %4").arg(bbox.left()).arg(bbox.top()).arg(bbox.right()).arg(bbox.bottom()); titleAttrs["x_ascenders"] = QString("%1").arg(0.25 * bbox.height()); titleAttrs["x_descenders"] = QString("%1").arg(0.25 * bbox.height()); titleAttrs["x_size"] = QString("%1").arg(bbox.height()); titleAttrs["baseline"] = propLineBaseline.size() == 1 ? *propLineBaseline.begin() : QString("0 0"); newElement.setAttribute("title", HOCRItem::serializeAttrGroup(titleAttrs)); } else if(action == DisplayerToolHOCR::ACTION_DRAW_WORD_RECT) { QString text = QInputDialog::getText(m_widget, _("Add Word"), _("Enter word:")); if(text.isEmpty()) { return; } newElement = doc.createElement("span"); newElement.setAttribute("class", "ocrx_word"); QMap> propWord = propAttrs["ocrx_word"]; newElement.setAttribute("lang", propWord["lang"].size() == 1 ? *propWord["lang"].begin() : m_spell.getLanguage()); QMap titleAttrs; titleAttrs["bbox"] = QString("%1 %2 %3 %4").arg(bbox.left()).arg(bbox.top()).arg(bbox.right()).arg(bbox.bottom()); titleAttrs["x_wconf"] = "100"; titleAttrs["x_font"] = propWord["title:x_font"].size() == 1 ? *propWord["title:x_font"].begin() : QFont().family(); titleAttrs["x_fsize"] = propWord["title:x_fsize"].size() == 1 ? *propWord["title:x_fsize"].begin() : QString("%1").arg(qRound(bbox.height() * 72. / currentItem->page()->resolution())); newElement.setAttribute("title", HOCRItem::serializeAttrGroup(titleAttrs)); if (propWord["bold"].size() == 1) { newElement.setAttribute("bold", *propWord["bold"].begin()); } if (propWord["italic"].size() == 1) { newElement.setAttribute("italic", *propWord["italic"].begin()); } newElement.appendChild(doc.createTextNode(text)); } else { return; } QModelIndex index = m_document->addItem(current, newElement); if(index.isValid()) { ui.treeViewHOCR->selectionModel()->setCurrentIndex(index, QItemSelectionModel::ClearAndSelect | QItemSelectionModel::Rows); } } void OutputEditorHOCR::showTreeWidgetContextMenu(const QPoint& point) { QModelIndexList indices = ui.treeViewHOCR->selectionModel()->selectedRows(); int nIndices = indices.size(); if(nIndices > 1) { // Check if merging or swapping is allowed (items are valid siblings) const HOCRItem* firstItem = m_document->itemAtIndex(indices.first()); if(!firstItem) { return; } QSet classes; classes.insert(firstItem->itemClass()); QVector rows = {indices.first().row()}; for(int i = 1; i < nIndices; ++i) { const HOCRItem* item = m_document->itemAtIndex(indices[i]); if(!item || item->parent() != firstItem->parent()) { return; } classes.insert(item->itemClass()); rows.append(indices[i].row()); } QMenu menu; std::sort(rows.begin(), rows.end()); bool consecutive = (rows.last() - rows.first()) == nIndices - 1; bool graphics = firstItem->itemClass() == "ocr_graphic"; bool pages = firstItem->itemClass() == "ocr_page"; bool sameClass = classes.size() == 1; QAction* actionMerge = nullptr; QAction* actionSplit = nullptr; QAction* actionSwap = nullptr; if(consecutive && !graphics && !pages && sameClass) { // Merging allowed actionMerge = menu.addAction(_("Merge")); if(firstItem->itemClass() != "ocr_carea") { actionSplit = menu.addAction(_("Split from parent")); } } if(nIndices == 2) { // Swapping allowed actionSwap = menu.addAction(_("Swap")); } QAction* clickedAction = menu.exec(ui.treeViewHOCR->mapToGlobal(point)); if(!clickedAction) { return; } ui.treeViewHOCR->selectionModel()->blockSignals(true); QModelIndex newIndex; if(clickedAction == actionMerge) { newIndex = m_document->mergeItems(indices.first().parent(), rows.first(), rows.last()); } else if(clickedAction == actionSplit) { newIndex = m_document->splitItem(indices.first().parent(), rows.first(), rows.last()); expandCollapseChildren(newIndex, true); } else if(clickedAction == actionSwap) { newIndex = m_document->swapItems(indices.first().parent(), rows.first(), rows.last()); } if(newIndex.isValid()) { ui.treeViewHOCR->selectionModel()->setCurrentIndex(newIndex, QItemSelectionModel::ClearAndSelect | QItemSelectionModel::Rows); showItemProperties(newIndex); } ui.treeViewHOCR->selectionModel()->blockSignals(false); // Nothing else is allowed with multiple items selected return; } QModelIndex index = ui.treeViewHOCR->indexAt(point); const HOCRItem* item = m_document->itemAtIndex(index); if(!item) { return; } QMenu menu; QAction* actionAddGraphic = nullptr; QAction* actionAddCArea = nullptr; QAction* actionAddPar = nullptr; QAction* actionAddLine = nullptr; QAction* actionAddWord = nullptr; QAction* actionSplit = nullptr; QAction* actionDictAddWord = nullptr; QAction* actionDictIgnoreWord = nullptr; QList setTextActions; QAction* actionRemove = nullptr; QAction* actionExpand = nullptr; QAction* actionCollapse = nullptr; QString itemClass = item->itemClass(); if(itemClass == "ocr_page") { actionAddGraphic = menu.addAction(_("Add graphic region")); actionAddCArea = menu.addAction(_("Add text block")); } else if(itemClass == "ocr_carea") { actionAddPar = menu.addAction(_("Add paragraph")); } else if(itemClass == "ocr_par") { actionAddLine = menu.addAction(_("Add line")); } else if(itemClass == "ocr_line") { actionAddWord = menu.addAction(_("Add word")); } else if(itemClass == "ocrx_word") { QString prefix, suffix, trimmedWord = HOCRItem::trimmedWord(item->text(), &prefix, &suffix); QStringList suggestions; bool valid = m_document->checkItemSpelling(index, &suggestions, 16); for(const QString& suggestion : suggestions) { setTextActions.append(menu.addAction(prefix + suggestion + suffix)); } if(!trimmedWord.isEmpty()) { if(setTextActions.isEmpty()) { menu.addAction(_("No suggestions"))->setEnabled(false); } if(!valid) { menu.addSeparator(); actionDictAddWord = menu.addAction(_("Add to dictionary")); actionDictAddWord->setData(trimmedWord); actionDictIgnoreWord = menu.addAction(_("Ignore word")); actionDictIgnoreWord->setData(trimmedWord); } } } if(!menu.actions().isEmpty()) { menu.addSeparator(); } if(itemClass == "ocr_par" || itemClass == "ocr_line" || itemClass == "ocrx_word") { actionSplit = menu.addAction(_("Split from parent")); } actionRemove = menu.addAction(_("Remove")); actionRemove->setShortcut(QKeySequence(Qt::Key_Delete)); if(m_document->rowCount(index) > 0) { actionExpand = menu.addAction(_("Expand all")); actionCollapse = menu.addAction(_("Collapse all")); } QAction* clickedAction = menu.exec(ui.treeViewHOCR->mapToGlobal(point)); if(!clickedAction) { return; } if(clickedAction == actionAddGraphic) { m_tool->setAction(DisplayerToolHOCR::ACTION_DRAW_GRAPHIC_RECT); } else if(clickedAction == actionAddCArea) { m_tool->setAction(DisplayerToolHOCR::ACTION_DRAW_CAREA_RECT); } else if(clickedAction == actionAddPar) { m_tool->setAction(DisplayerToolHOCR::ACTION_DRAW_PAR_RECT); } else if(clickedAction == actionAddLine) { m_tool->setAction(DisplayerToolHOCR::ACTION_DRAW_LINE_RECT); } else if(clickedAction == actionAddWord) { m_tool->setAction(DisplayerToolHOCR::ACTION_DRAW_WORD_RECT); } else if(clickedAction == actionDictAddWord) { m_spell.addWordToDictionary(actionDictAddWord->data().toString()); m_document->recheckSpelling(); } else if(clickedAction == actionDictIgnoreWord) { m_spell.ignoreWord(actionDictIgnoreWord->data().toString()); m_document->recheckSpelling(); } else if(setTextActions.contains(clickedAction)) { m_document->setData(index, clickedAction->text(), Qt::EditRole); } else if(clickedAction == actionSplit) { QModelIndex newIndex = m_document->splitItem(index.parent(), index.row(), index.row()); ui.treeViewHOCR->selectionModel()->setCurrentIndex(newIndex, QItemSelectionModel::ClearAndSelect | QItemSelectionModel::Rows); expandCollapseChildren(newIndex, true); } else if(clickedAction == actionRemove) { m_document->removeItem(ui.treeViewHOCR->selectionModel()->currentIndex()); } else if(clickedAction == actionExpand) { expandCollapseChildren(index, true); } else if(clickedAction == actionCollapse) { expandCollapseChildren(index, false); } } void OutputEditorHOCR::pickItem(const QPoint& point) { int pageNr; QString filename = MAIN->getDisplayer()->getCurrentImage(pageNr); QModelIndex pageIndex = m_document->searchPage(filename, pageNr); const HOCRItem* currentItem = m_document->itemAtIndex(pageIndex); if(!currentItem) { return; } const HOCRPage* page = currentItem->page(); // Transform point in coordinate space used when page was OCRed double alpha = (page->angle() - MAIN->getDisplayer()->getCurrentAngle()) / 180. * M_PI; double scale = double(page->resolution()) / double(MAIN->getDisplayer()->getCurrentResolution()); QPoint newPoint( scale * (point.x() * std::cos(alpha) - point.y() * std::sin(alpha)) + 0.5 * page->bbox().width(), scale * (point.x() * std::sin(alpha) + point.y() * std::cos(alpha)) + 0.5 * page->bbox().height()); showItemProperties(m_document->searchAtCanvasPos(pageIndex, newPoint)); ui.treeViewHOCR->setFocus(); } void OutputEditorHOCR::toggleWConfColumn(bool active) { ui.treeViewHOCR->setColumnHidden(1, !active); } void OutputEditorHOCR::open() { if(!clear(false)) { return; } QStringList files = FileDialogs::openDialog(_("Open hOCR File"), "", "outputdir", QString("%1 (*.html)").arg(_("hOCR HTML Files")), false); if(files.isEmpty()) { return; } QString filename = files.front(); 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; } while(!div.isNull()) { // Need to query next before adding page since the element is reparented QDomElement nextDiv = div.nextSiblingElement("div"); m_document->addPage(div, false); div = nextDiv; } m_document->convertSourcePaths(QFileInfo(filename).absolutePath(), true); m_modified = false; m_filebasename = QFileInfo(filename).completeBaseName(); } bool OutputEditorHOCR::save(const QString& filename) { ui.treeViewHOCR->setFocus(); // Ensure any item editor loses focus and commits its changes QString outname = filename; if(outname.isEmpty()) { QString suggestion = m_filebasename; if(suggestion.isEmpty()) { QList sources = MAIN->getSourceManager()->getSelectedSources(); suggestion = !sources.isEmpty() ? QFileInfo(sources.first()->displayname).baseName() : _("output"); } outname = FileDialogs::saveDialog(_("Save hOCR Output..."), suggestion + ".html", "outputdir", QString("%1 (*.html)").arg(_("hOCR HTML Files"))); if(outname.isEmpty()) { return false; } } 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; } QByteArray current = setlocale(LC_ALL, NULL); setlocale(LC_ALL, "C"); tesseract::TessBaseAPI tess; setlocale(LC_ALL, current.constData()); QString header = QString( "\n" "\n" "\n" " %1\n" " \n" " \n" " \n" "\n").arg(QFileInfo(outname).fileName()).arg(tess.Version()); file.write(header.toUtf8()); m_document->convertSourcePaths(QFileInfo(outname).absolutePath(), false); file.write(m_document->toHTML().toUtf8()); m_document->convertSourcePaths(QFileInfo(outname).absolutePath(), true); file.write("\n"); m_modified = false; m_filebasename = QFileInfo(outname).completeBaseName(); return true; } bool OutputEditorHOCR::exportToODT() { ui.treeViewHOCR->setFocus(); // Ensure any item editor loses focus and commits its changes return HOCROdtExporter(m_tool).run(m_document, m_filebasename); } bool OutputEditorHOCR::exportToPDF() { ui.treeViewHOCR->setFocus(); // Ensure any item editor loses focus and commits its changes ui.actionPreview->setChecked(false); // Disable preview because if conflicts with preview from PDF dialog QModelIndex current = ui.treeViewHOCR->selectionModel()->currentIndex(); const HOCRItem* item = m_document->itemAtIndex(current); const HOCRPage* page = item ? item->page() : m_document->page(0); if(showPage(page)) { return HOCRPdfExporter(m_document, page, m_tool).run(m_filebasename); } return false; } bool OutputEditorHOCR::exportToText() { ui.treeViewHOCR->setFocus(); // Ensure any item editor loses focus and commits its changes return HOCRTextExporter().run(m_document, m_filebasename); } bool OutputEditorHOCR::clear(bool hide) { m_previewTimer.stop(); m_preview->setVisible(false); 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_document->clear(); ui.tableWidgetProperties->setRowCount(0); ui.plainTextEditOutput->clear(); m_tool->clearSelection(); m_modified = false; m_filebasename.clear(); if(hide) { MAIN->setOutputPaneVisible(false); } return true; } void OutputEditorHOCR::setLanguage(const Config::Lang& lang) { m_document->setDefaultLanguage(lang.code); } void OutputEditorHOCR::onVisibilityChanged(bool /*visible*/) { ui.searchFrame->hideSubstitutionsManager(); } bool OutputEditorHOCR::findReplaceInItem(const QModelIndex& index, const QString& searchstr, const QString& replacestr, bool matchCase, bool backwards, bool replace, bool& currentSelectionMatchesSearch) { // Check that the item is a word const HOCRItem* item = m_document->itemAtIndex(index); if(!item || item->itemClass() != "ocrx_word") { return false; } Qt::CaseSensitivity cs = matchCase ? Qt::CaseSensitive : Qt::CaseInsensitive; HOCRTextDelegate* delegate = static_cast(ui.treeViewHOCR->itemDelegateForColumn(0)); // If the item is already in edit mode, continue searching inside the text if(delegate->getCurrentIndex() == index && delegate->getCurrentEditor()) { QLineEdit* editor = delegate->getCurrentEditor(); bool matchesSearch = editor->selectedText().compare(searchstr, cs) == 0; int selStart = editor->selectionStart(); if(matchesSearch && replace) { QString oldText = editor->text(); editor->setText(oldText.left(selStart) + replacestr + oldText.mid(selStart + searchstr.length())); editor->setSelection(selStart, replacestr.length()); return true; } bool matchesReplace = editor->selectedText().compare(replacestr, cs) == 0; int pos = -1; if(backwards) { pos = selStart - 1; pos = pos < 0 ? -1 : editor->text().lastIndexOf(searchstr, pos, cs); } else { pos = matchesSearch ? selStart + searchstr.length() : matchesReplace ? selStart + replacestr.length() : selStart; pos = editor->text().indexOf(searchstr, pos, cs); } if(pos != -1) { editor->setSelection(pos, searchstr.length()); return true; } currentSelectionMatchesSearch = matchesSearch; return false; } // Otherwise, if item contains text, set it in edit mode int pos = backwards ? item->text().lastIndexOf(searchstr, -1, cs) : item->text().indexOf(searchstr, 0, cs); if(pos != -1) { ui.treeViewHOCR->setCurrentIndex(index); ui.treeViewHOCR->edit(index); Q_ASSERT(delegate->getCurrentIndex() == index && delegate->getCurrentEditor()); delegate->getCurrentEditor()->setSelection(pos, searchstr.length()); return true; } return false; } void OutputEditorHOCR::findReplace(const QString& searchstr, const QString& replacestr, bool matchCase, bool backwards, bool replace) { ui.searchFrame->clearErrorState(); QModelIndex current = ui.treeViewHOCR->currentIndex(); if(!current.isValid()) { current = m_document->index(backwards ? (m_document->rowCount() - 1) : 0, 0); } QModelIndex neww = current; bool currentSelectionMatchesSearch = false; while(!findReplaceInItem(neww, searchstr, replacestr, matchCase, backwards, replace, currentSelectionMatchesSearch)) { neww = backwards ? m_document->prevIndex(neww) : m_document->nextIndex(neww); if(!neww.isValid() || neww == current) { // Break endless loop if(!currentSelectionMatchesSearch) { ui.searchFrame->setErrorState(); } return; } } } void OutputEditorHOCR::replaceAll(const QString& searchstr, const QString& replacestr, bool matchCase) { MAIN->pushState(MainWindow::State::Busy, _("Replacing...")); QModelIndex start = m_document->index(0, 0); QModelIndex curr = start; Qt::CaseSensitivity cs = matchCase ? Qt::CaseSensitive : Qt::CaseInsensitive; int count = 0; do { const HOCRItem* item = m_document->itemAtIndex(curr); if(item && item->itemClass() == "ocrx_word") { if(item->text().contains(searchstr, cs)) { ++count; m_document->setData(curr, item->text().replace(searchstr, replacestr, cs), Qt::EditRole); } } curr = m_document->nextIndex(curr); QApplication::processEvents(QEventLoop::ExcludeUserInputEvents); } while(curr != start); if(count == 0) { ui.searchFrame->setErrorState(); } MAIN->popState(); } void OutputEditorHOCR::applySubstitutions(const QMap& substitutions, bool matchCase) { MAIN->pushState(MainWindow::State::Busy, _("Applying substitutions...")); QModelIndex start = m_document->index(0, 0); Qt::CaseSensitivity cs = matchCase ? Qt::CaseSensitive : Qt::CaseInsensitive; for(auto it = substitutions.begin(), itEnd = substitutions.end(); it != itEnd; ++it) { QString search = it.key(); QString replace = it.value(); QModelIndex curr = start; do { const HOCRItem* item = m_document->itemAtIndex(curr); if(item && item->itemClass() == "ocrx_word") { m_document->setData(curr, item->text().replace(search, replace, cs), Qt::EditRole); } curr = m_document->nextIndex(curr); QApplication::processEvents(QEventLoop::ExcludeUserInputEvents); } while(curr != start); } MAIN->popState(); } void OutputEditorHOCR::removeItem() { m_document->removeItem(ui.treeViewHOCR->selectionModel()->currentIndex()); } void OutputEditorHOCR::updatePreview() { const HOCRItem* item = m_document->itemAtIndex(ui.treeViewHOCR->currentIndex()); if(!ui.actionPreview->isChecked() || !item) { m_preview->setVisible(false); return; } const HOCRPage* page = item->page(); const QRect& bbox = page->bbox(); int pageDpi = page->resolution(); QImage image(bbox.size(), QImage::Format_ARGB32); image.fill(QColor(255, 255, 255, 127)); image.setDotsPerMeterX(pageDpi / 0.0254); // 1 in = 0.0254 m image.setDotsPerMeterY(pageDpi / 0.0254); QPainter painter(&image); painter.setRenderHint(QPainter::Antialiasing); drawPreview(painter, page); m_preview->setPixmap(QPixmap::fromImage(image)); m_preview->setPos(-0.5 * bbox.width(), -0.5 * bbox.height()); m_preview->setVisible(true); } void OutputEditorHOCR::drawPreview(QPainter& painter, const HOCRItem* item) { if(!item->isEnabled()) { return; } QString itemClass = item->itemClass(); if(itemClass == "ocr_line") { QPair baseline = item->baseLine(); const QRect& lineRect = item->bbox(); for(HOCRItem* wordItem : item->children()) { if(!wordItem->isEnabled()) { continue; } const QRect& wordRect = wordItem->bbox(); QFont font; if(!wordItem->fontFamily().isEmpty()) { font.setFamily(wordItem->fontFamily()); } font.setBold(wordItem->fontBold()); font.setItalic(wordItem->fontItalic()); font.setPointSizeF(wordItem->fontSize()); painter.setFont(font); // See https://github.com/kba/hocr-spec/issues/15 double y = lineRect.bottom() + (wordRect.center().x() - lineRect.x()) * baseline.first + baseline.second; painter.drawText(wordRect.x(), y, wordItem->text()); } } else if(itemClass == "ocr_graphic") { painter.drawImage(item->bbox(), m_tool->getSelection(item->bbox())); } else { for(HOCRItem* childItem : item->children()) { drawPreview(painter, childItem);; } } } gImageReader-3.3.1/qt/src/hocr/OutputEditorHOCR.hh000066400000000000000000000115221351740627400216560ustar00rootroot00000000000000/* -*- Mode: C++; indent-tabs-mode: t; c-basic-offset: 4; tab-width: 4 -*- */ /* * OutputEditorHOCR.hh * Copyright (C) 2013-2019 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 #include "OutputEditor.hh" #include "Ui_OutputEditorHOCR.hh" class DisplayerToolHOCR; class HOCRDocument; class HOCRPage; class HOCRItem; 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 { return m_modified; } public slots: bool clear(bool hide = true) override; void setLanguage(const Config::Lang& lang) override; void onVisibilityChanged(bool visible) override; void open(); bool save(const QString& filename = "") override; bool exportToODT(); bool exportToPDF(); bool exportToText(); void removeItem(); private: class HTMLHighlighter; struct HOCRReadSessionData : ReadSessionData { QStringList errors; }; DisplayerToolHOCR* m_tool; QWidget* m_widget; QGraphicsPixmapItem* m_preview = nullptr; QTimer m_previewTimer; UI_OutputEditorHOCR ui; HTMLHighlighter* m_highlighter; bool m_modified = false; QString m_filebasename; QtSpell::TextEditChecker m_spell; HOCRDocument* m_document; QWidget* createAttrWidget(const QModelIndex& itemIndex, const QString& attrName, const QString& attrValue, const QString& attrItemClass = QString(), bool multiple = false); void expandCollapseChildren(const QModelIndex& index, bool expand) const; void expandCollapseItemClass(bool expand); void navigateNextPrev(bool next); bool findReplaceInItem(const QModelIndex& index, const QString& searchstr, const QString& replacestr, bool matchCase, bool backwards, bool replace, bool& currentSelectionMatchesSearch); bool showPage(const HOCRPage* page); void drawPreview(QPainter& painter, const HOCRItem* item); private slots: void bboxDrawn(const QRect& bbox, int action); void addPage(const QString& hocrText, ReadSessionData data); void expandItemClass() { expandCollapseItemClass(true); } void collapseItemClass() { expandCollapseItemClass(false); } void navigateTargetChanged(); void navigateNext() { navigateNextPrev(true); } void navigatePrev() { navigateNextPrev(false); } void pickItem(const QPoint& point); void setFont(); void setModified(); void showItemProperties(const QModelIndex& index, const QModelIndex& prev = QModelIndex()); void showTreeWidgetContextMenu(const QPoint& point); void toggleWConfColumn(bool active); void updateSourceText(); void updateCurrentItemBBox(QRect bbox); void findReplace(const QString& searchstr, const QString& replacestr, bool matchCase, bool backwards, bool replace); void replaceAll(const QString& searchstr, const QString& replacestr, bool matchCase); void applySubstitutions(const QMap& substitutions, bool matchCase); void updatePreview(); }; class HOCRAttributeEditor : public QLineEdit { Q_OBJECT public: HOCRAttributeEditor(const QString& value, HOCRDocument* doc, const QModelIndex& itemIndex, const QString& attrName, const QString& attrItemClass); protected: void focusOutEvent(QFocusEvent* ev); private: HOCRDocument* m_doc; QModelIndex m_itemIndex; QString m_attrName; QString m_origValue; QString m_attrItemClass; private slots: void updateValue(const QModelIndex& itemIndex, const QString& name, const QString& value); void validateChanges(); }; class HOCRAttributeCheckbox : public QCheckBox { Q_OBJECT public: HOCRAttributeCheckbox(Qt::CheckState value, HOCRDocument* doc, const QModelIndex& itemIndex, const QString& attrName, const QString& attrItemClass); private: HOCRDocument* m_doc; QModelIndex m_itemIndex; QString m_attrName; QString m_attrItemClass; private slots: void updateValue(const QModelIndex& itemIndex, const QString& name, const QString& value); void valueChanged(); }; #endif // OUTPUTEDITORHOCR_HH gImageReader-3.3.1/qt/src/hocr/Ui_OutputEditorHOCR.hh000066400000000000000000000150201351740627400223100ustar00rootroot00000000000000#ifndef UI_OUTPUTEDITORHOCR_HH #define UI_OUTPUTEDITORHOCR_HH #include "common.hh" #include "OutputTextEdit.hh" #include "SearchReplaceFrame.hh" #include #include #include #include #include #include #include #include #include #include #include #include #include class UI_OutputEditorHOCR { public: QToolButton* toolButtonOutputExport; QAction* actionOutputOpen; QAction* actionOutputClear; QAction* actionOutputSaveHOCR; QAction* actionOutputExportText; QAction* actionOutputExportPDF; QAction* actionOutputExportODT; QAction* actionOutputReplace; QAction* actionToggleWConf; QAction* actionPreview; QAction* actionNavigateNext; QAction* actionNavigatePrev; QAction* actionExpandAll; QAction* actionCollapseAll; QComboBox* comboBoxNavigate; QToolBar* toolBarOutput; QToolBar* toolBarNavigate; QTabWidget* tabWidget; QSplitter* splitter; QTreeView* treeViewHOCR; QTableWidget* tableWidgetProperties; OutputTextEdit* plainTextEditOutput; SearchReplaceFrame* searchFrame; 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); QMenu* exportMenu = new QMenu(); actionOutputExportText = new QAction(QIcon::fromTheme("text-plain"), gettext("Export to plain text"), widget); actionOutputExportText->setToolTip(gettext("Export to plain text")); exportMenu->addAction(actionOutputExportText); actionOutputExportPDF = new QAction(QIcon::fromTheme("application-pdf"), gettext("Export to PDF"), widget); actionOutputExportPDF->setToolTip(gettext("Export to PDF")); exportMenu->addAction(actionOutputExportPDF); actionOutputExportODT = new QAction(QIcon::fromTheme("x-office-document"), gettext("Export to ODT"), widget); actionOutputExportODT->setToolTip(gettext("Export to ODT")); exportMenu->addAction(actionOutputExportODT); toolButtonOutputExport = new QToolButton(widget); toolButtonOutputExport->setIcon(QIcon::fromTheme("document-export")); toolButtonOutputExport->setText(gettext("Export")); toolButtonOutputExport->setToolTip(gettext("Export")); toolButtonOutputExport->setEnabled(false); toolButtonOutputExport->setMenu(exportMenu); toolButtonOutputExport->setPopupMode(QToolButton::InstantPopup); actionOutputClear = new QAction(QIcon::fromTheme("edit-clear"), gettext("Clear output"), widget); actionOutputClear->setToolTip(gettext("Clear output")); actionOutputReplace = new QAction(QIcon::fromTheme("edit-find-replace"), gettext("Find and Replace"), widget); actionOutputReplace->setToolTip(gettext("Find and replace")); actionOutputReplace->setCheckable(true); actionToggleWConf = new QAction(QIcon(":/icons/wconf"), gettext("Show confidence values"), widget); actionToggleWConf->setToolTip(gettext("Show confidence values")); actionToggleWConf->setCheckable(true); actionPreview = new QAction(QIcon::fromTheme("document-preview"), gettext("Show preview"), widget); actionPreview->setToolTip(gettext("Show preview")); actionPreview->setCheckable(true); 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->addWidget(toolButtonOutputExport); toolBarOutput->addAction(actionOutputClear); toolBarOutput->addSeparator(); toolBarOutput->addAction(actionOutputReplace); toolBarOutput->addAction(actionToggleWConf); toolBarOutput->addAction(actionPreview); widget->layout()->addWidget(toolBarOutput); searchFrame = new SearchReplaceFrame(widget); searchFrame->setVisible(false); widget->layout()->addWidget(searchFrame); splitter = new QSplitter(Qt::Vertical, widget); widget->layout()->addWidget(splitter); QWidget* treeContainer = new QWidget(widget); treeContainer->setLayout(new QVBoxLayout()); treeContainer->layout()->setSpacing(0); treeContainer->layout()->setContentsMargins(0, 0, 0, 0); splitter->addWidget(treeContainer); treeViewHOCR = new QTreeView(widget); treeViewHOCR->setHeaderHidden(true); treeViewHOCR->setSelectionMode(QTreeWidget::ExtendedSelection); treeContainer->layout()->addWidget(treeViewHOCR); actionNavigateNext = new QAction(QIcon::fromTheme("go-down"), gettext("Next (F3)"), widget); actionNavigatePrev = new QAction(QIcon::fromTheme("go-up"), gettext("Previous (Shift+F3)"), widget); comboBoxNavigate = new QComboBox(); comboBoxNavigate->setSizeAdjustPolicy(QComboBox::AdjustToMinimumContentsLength); comboBoxNavigate->setMinimumContentsLength(10); actionExpandAll = new QAction(QIcon(":/icons/expand"), gettext("Expand all"), widget); actionCollapseAll = new QAction(QIcon(":/icons/collapse"), gettext("Collapse all"), widget); toolBarNavigate = new QToolBar(widget); toolBarNavigate->setToolButtonStyle(Qt::ToolButtonIconOnly); toolBarNavigate->setIconSize(QSize(1, 1) * toolBarOutput->style()->pixelMetric(QStyle::PM_SmallIconSize)); toolBarNavigate->addWidget(comboBoxNavigate); toolBarNavigate->addSeparator(); toolBarNavigate->addAction(actionNavigateNext); toolBarNavigate->addAction(actionNavigatePrev); toolBarNavigate->addSeparator(); toolBarNavigate->addAction(actionExpandAll); toolBarNavigate->addAction(actionCollapseAll); treeContainer->layout()->addWidget(toolBarNavigate); 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.3.1/qt/src/main.cc000066400000000000000000000064611351740627400165200ustar00rootroot00000000000000/* -*- Mode: C++; indent-tabs-mode: t; c-basic-offset: 4; tab-width: 4 -*- */ /* * main.cc * Copyright (C) 2013-2019 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]); int tesseractCrash = std::atoi(argv[3]); QString savefile = argc >= 5 ? argv[4] : ""; window = new CrashHandler(pid, tesseractCrash, 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.3.1/qt/src/scanner/000077500000000000000000000000001351740627400167075ustar00rootroot00000000000000gImageReader-3.3.1/qt/src/scanner/ScannerSane.cc000066400000000000000000000640571351740627400214320ustar00rootroot00000000000000/* -*- 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-2019 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(getErrorMessage(status, _("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(getErrorMessage(status, _("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(getErrorMessage(status, _("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 = 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); qDebug("sane_read(%d) -> (%s, %d)", n_to_read, sane_strstatus(status), n_read); /* Completed read */ if(status == SANE_STATUS_EOF) { // EOF with no data read, means ADF has no further page if(m_job->lineCount == 0) { doStop(); return; } 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(getErrorMessage(status, _("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 = 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 = 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 = 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 = 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); } } QString ScannerSane::getErrorMessage(SANE_Status status, const QString& defaultMessage) { switch (status) { case SANE_STATUS_CANCELLED: return _("Operation is cancelled."); case SANE_STATUS_DEVICE_BUSY: return _("Device is busy."); case SANE_STATUS_COVER_OPEN: return _("Cover is opened."); case SANE_STATUS_JAMMED: return _("Document feeder jammed."); case SANE_STATUS_NO_DOCS: return _("Document feeder out of documents."); case SANE_STATUS_ACCESS_DENIED: return _("Access to scanner is denied."); default: return defaultMessage; } } gImageReader-3.3.1/qt/src/scanner/ScannerSane.hh000066400000000000000000000065351351740627400214410ustar00rootroot00000000000000/* -*- 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-2019 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); static QString getErrorMessage(SANE_Status status, const QString& defaultMessage); private slots: void run(); }; typedef ScannerSane ScannerImpl; #endif // SCANNER_SANE_HH gImageReader-3.3.1/qt/src/scanner/ScannerTwain.cc000066400000000000000000000340671351740627400216240ustar00rootroot00000000000000/* -*- Mode: C++; indent-tabs-mode: t; c-basic-offset: 4; tab-width: 4 -*- */ /* * ScannerTwain.cc * Copyright (C) 2013-2019 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& params) { 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.3.1/qt/src/scanner/ScannerTwain.hh000066400000000000000000000064041351740627400216300ustar00rootroot00000000000000/* -*- Mode: C++; indent-tabs-mode: t; c-basic-offset: 4; tab-width: 4 -*- */ /* * ScannerTwain.hh * Copyright (C) 2013-2019 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.3.1/updateTranslations.sh000077500000000000000000000015621351740627400202720ustar00rootroot00000000000000#!/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 echo "data/gimagereader.desktop.in" >> 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 )