diff -Nru goldendict-1.5.0~git20131003/aard.cc goldendict-1.5.0~git20150923/aard.cc --- goldendict-1.5.0~git20131003/aard.cc 2013-10-02 20:42:04.000000000 +0000 +++ goldendict-1.5.0~git20150923/aard.cc 2015-09-23 08:26:24.000000000 +0000 @@ -9,6 +9,9 @@ #include "langcoder.hh" #include "fsencoding.hh" #include "decompress.hh" +#include "gddebug.hh" +#include "ftshelpers.hh" +#include "htmlescape.hh" #include #include @@ -44,7 +47,7 @@ namespace { -DEF_EX_STR( exNotDctFile, "Not an Sdictionary file", Dictionary::Ex ) +DEF_EX_STR( exNotAardFile, "Not an AARD file", Dictionary::Ex ) DEF_EX_STR( exCantReadFile, "Can't read file", Dictionary::Ex ) DEF_EX_STR( exWordIsTooLarge, "Enountered a word that is too large:", Dictionary::Ex ) DEF_EX_STR( exSuddenEndOfFile, "Sudden end of file", Dictionary::Ex ) @@ -261,6 +264,21 @@ virtual QString const& getDescription(); + virtual sptr< Dictionary::DataRequest > getSearchResults( QString const & searchString, + int searchMode, bool matchCase, + int distanceBetweenWords, + int maxResults ); + virtual void getArticleText( uint32_t articleAddress, QString & headword, QString & text ); + + virtual void makeFTSIndex(QAtomicInt & isCancelled, bool firstIteration ); + + virtual void setFTSParameters( Config::FullTextSearch const & fts ) + { + can_FTS = fts.enabled + && !fts.disabledTypes.contains( "AARD", Qt::CaseInsensitive ) + && ( fts.maxDictionarySize == 0 || getArticleCount() <= fts.maxDictionarySize ); + } + protected: virtual void loadIcon() throw(); @@ -269,7 +287,8 @@ /// Loads the article. void loadArticle( quint32 address, - string & articleText ); + string & articleText, + bool rawText = false ); string convert( string const & in_data ); friend class AardArticleRequest; @@ -300,8 +319,15 @@ idxHeader.indexRootOffset ), idx, idxMutex ); - // Read decription + // Full-text search parameters + + can_FTS = true; + ftsIdxName = indexFile + "_FTS"; + + if( !Dictionary::needToRebuildIndex( dictionaryFiles, ftsIdxName ) + && !FtsHelpers::ftsIndexIsOldOrBad( ftsIdxName, this ) ) + FTS_index_completed.ref(); } AardDictionary::~AardDictionary() @@ -362,7 +388,9 @@ } QString text = QString::fromUtf8( inConverted.c_str() ); - text.replace( QRegExp( "<\\s*a\\s*href\\s*=\\s*[\\\"'](w:|s:){0,1}([^#](?!ttp://)[^\\\"']*)(.)" ), + text.replace( QRegExp( "<\\s*a\\s*href\\s*=\\s*\\\"(w:|s:){0,1}([^#](?!ttp://)[^\\\"]*)(.)" ), + "]*)/>", Qt::CaseInsensitive ); //
@@ -375,7 +403,8 @@ } void AardDictionary::loadArticle( quint32 address, - string & articleText ) + string & articleText, + bool rawText ) { quint32 articleOffset = address; quint32 articleSize; @@ -406,7 +435,7 @@ } catch( std::exception &ex ) { - qWarning( "AARD: Failed loading article from \"%s\", reason: %s\n", getName().c_str(), ex.what() ); + gdWarning( "AARD: Failed loading article from \"%s\", reason: %s\n", getName().c_str(), ex.what() ); break; } catch(...) @@ -473,7 +502,12 @@ } if( !articleText.empty() ) + { + if( rawText ) + return; + articleText = convert( articleText ); + } else articleText = string( QObject::tr( "Article decoding error" ).toUtf8().constData() ); @@ -542,6 +576,61 @@ return dictionaryDescription; } +void AardDictionary::makeFTSIndex( QAtomicInt & isCancelled, bool firstIteration ) +{ + if( !( Dictionary::needToRebuildIndex( getDictionaryFilenames(), ftsIdxName ) + || FtsHelpers::ftsIndexIsOldOrBad( ftsIdxName, this ) ) ) + FTS_index_completed.ref(); + + if( haveFTSIndex() ) + return; + + if( ensureInitDone().size() ) + return; + + if( firstIteration && getArticleCount() > FTS::MaxDictionarySizeForFastSearch ) + return; + + gdDebug( "Aard: Building the full-text index for dictionary: %s\n", + getName().c_str() ); + + try + { + FtsHelpers::makeFTSIndex( this, isCancelled ); + FTS_index_completed.ref(); + } + catch( std::exception &ex ) + { + gdWarning( "Aard: Failed building full-text search index for \"%s\", reason: %s\n", getName().c_str(), ex.what() ); + QFile::remove( FsEncoding::decode( ftsIdxName.c_str() ) ); + } +} + +void AardDictionary::getArticleText( uint32_t articleAddress, QString & headword, QString & text ) +{ + try + { + headword.clear(); + string articleText; + + loadArticle( articleAddress, articleText ); + + text = Html::unescape( QString::fromUtf8( articleText.data(), articleText.size() ) ); + } + catch( std::exception &ex ) + { + gdWarning( "Aard: Failed retrieving article from \"%s\", reason: %s\n", getName().c_str(), ex.what() ); + } +} + +sptr< Dictionary::DataRequest > AardDictionary::getSearchResults( QString const & searchString, + int searchMode, bool matchCase, + int distanceBetweenWords, + int maxResults ) +{ + return new FtsHelpers::FTSResultsRequest( *this, searchString,searchMode, matchCase, distanceBetweenWords, maxResults ); +} + /// AardDictionary::getArticle() class AardArticleRequest; @@ -756,13 +845,13 @@ try { - qDebug( "Aard: Building the index for dictionary: %s", i->c_str() ); + gdDebug( "Aard: Building the index for dictionary: %s\n", i->c_str() ); { QFileInfo info( FsEncoding::decode( i->c_str() ) ); - if( info.size() > ULONG_MAX ) + if( static_cast< quint64 >( info.size() ) > ULONG_MAX ) { - qWarning( "File %s is too large", i->c_str() ); + gdWarning( "File %s is too large\n", i->c_str() ); continue; } } @@ -778,7 +867,7 @@ || strncmp( dictHeader.keyLengthFormat, ">H", 2 ) || strncmp( dictHeader.articleLengthFormat, ">L", 2) ) { - qWarning( "File %s is not in supported aard format", i->c_str() ); + gdWarning( "File %s is not in supported aard format\n", i->c_str() ); continue; } @@ -787,7 +876,7 @@ if( size == 0 ) { - qWarning( "File %s has invalid metadata", i->c_str() ); + gdWarning( "File %s has invalid metadata", i->c_str() ); continue; } @@ -801,7 +890,7 @@ if( meta.empty() ) { - qWarning( "File %s has invalid metadata", i->c_str() ); + gdWarning( "File %s has invalid metadata", i->c_str() ); continue; } @@ -945,19 +1034,28 @@ } catch( std::exception & e ) { - qWarning( "Aard dictionary indexing failed: %s, error: %s\n", + gdWarning( "Aard dictionary indexing failed: %s, error: %s\n", i->c_str(), e.what() ); continue; } catch( ... ) { - qWarning( "Aard dictionary indexing failed\n" ); + gdWarning( "Aard dictionary indexing failed\n" ); continue; } } // if need to rebuild - dictionaries.push_back( new AardDictionary( dictId, - indexFile, - dictFiles ) ); + try + { + dictionaries.push_back( new AardDictionary( dictId, + indexFile, + dictFiles ) ); + } + catch( std::exception & e ) + { + gdWarning( "Aard dictionary initializing failed: %s, error: %s\n", + i->c_str(), e.what() ); + continue; + } } return dictionaries; } diff -Nru goldendict-1.5.0~git20131003/about.cc goldendict-1.5.0~git20150923/about.cc --- goldendict-1.5.0~git20131003/about.cc 2013-08-16 09:45:56.000000000 +0000 +++ goldendict-1.5.0~git20150923/about.cc 2015-09-23 08:26:24.000000000 +0000 @@ -25,6 +25,8 @@ .arg( GD_CXX_MSVC_MAJOR ) .arg( GD_CXX_MSVC_MINOR ) .arg( GD_CXX_MSVC_BUILD ); +#elif defined (__clang__) && defined (__clang_version__) + QString compilerVersion = QLatin1String( "Clang " ) + QLatin1String( __clang_version__ ); #else QString compilerVersion = QLatin1String( "GCC " ) + QLatin1String( __VERSION__ ); #endif diff -Nru goldendict-1.5.0~git20131003/article_maker.cc goldendict-1.5.0~git20150923/article_maker.cc --- goldendict-1.5.0~git20131003/article_maker.cc 2013-10-02 20:42:04.000000000 +0000 +++ goldendict-1.5.0~git20150923/article_maker.cc 2015-09-23 08:26:24.000000000 +0000 @@ -12,7 +12,7 @@ #include #include "folding.hh" #include "langcoder.hh" -#include "dprintf.hh" +#include "gddebug.hh" using std::vector; using std::string; @@ -41,7 +41,8 @@ } std::string ArticleMaker::makeHtmlHeader( QString const & word, - QString const & icon ) const + QString const & icon, + bool expandOptionalParts ) const { string result = "" @@ -81,7 +82,7 @@ result += css.data(); // Turn on/off expanding of article optional parts - if( needExpandOptionalParts ) + if( expandOptionalParts ) result += "\n.dsl_opt\n{\n display: inline;\n}\n\n.hidden_expand_opt\n{\n display: none;\n}\n"; result += "\n"; @@ -201,12 +202,41 @@ sptr< Dictionary::DataRequest > ArticleMaker::makeDefinitionFor( QString const & inWord, unsigned groupId, QMap< QString, QString > const & contexts, - QSet< QString > const & mutedDicts ) const + QSet< QString > const & mutedDicts, + QStringList const & dictIDs ) const { + if( !dictIDs.isEmpty() ) + { + QStringList ids = dictIDs; + std::vector< sptr< Dictionary::Class > > ftsDicts; + + // Find dictionaries by ID's + for( unsigned x = 0; x < dictionaries.size(); x++ ) + { + for( QStringList::Iterator it = ids.begin(); it != ids.end(); ++it ) + { + if( *it == QString::fromStdString( dictionaries[ x ]->getId() ) ) + { + ftsDicts.push_back( dictionaries[ x ] ); + ids.erase( it ); + break; + } + } + if( ids.isEmpty() ) + break; + } + + string header = makeHtmlHeader( inWord.trimmed(), QString(), true ); + + return new ArticleRequest( inWord.trimmed(), "", + contexts, ftsDicts, header, + -1, true ); + } + if ( groupId == Instances::Group::HelpGroupId ) { // This is a special group containing internal welcome/help pages - string result = makeHtmlHeader( inWord, QString() ); + string result = makeHtmlHeader( inWord, QString(), needExpandOptionalParts ); if ( inWord == tr( "Welcome!" ) ) { @@ -278,7 +308,8 @@ string header = makeHtmlHeader( inWord.trimmed(), activeGroup && activeGroup->icon.size() ? - activeGroup->icon : QString() ); + activeGroup->icon : QString(), + needExpandOptionalParts ); if ( mutedDicts.size() ) { @@ -306,7 +337,7 @@ sptr< Dictionary::DataRequest > ArticleMaker::makeNotFoundTextFor( QString const & word, QString const & group ) const { - string result = makeHtmlHeader( word, QString() ) + makeNotFoundBody( word, group ) + + string result = makeHtmlHeader( word, QString(), true ) + makeNotFoundBody( word, group ) + ""; sptr< Dictionary::DataRequestInstant > r = new Dictionary::DataRequestInstant( true ); @@ -319,7 +350,7 @@ sptr< Dictionary::DataRequest > ArticleMaker::makeEmptyPage() const { - string result = makeHtmlHeader( tr( "(untitled)" ), QString() ) + + string result = makeHtmlHeader( tr( "(untitled)" ), QString(), true ) + ""; sptr< Dictionary::DataRequestInstant > r = @@ -333,7 +364,7 @@ sptr< Dictionary::DataRequest > ArticleMaker::makePicturePage( string const & url ) const { - string result = makeHtmlHeader( tr( "(picture)" ), QString() ) + string result = makeHtmlHeader( tr( "(picture)" ), QString(), true ) + "2) history.go(-1)\">" + "" + ""; @@ -473,8 +504,8 @@ } catch( std::exception & e ) { - qWarning( "getArticle request error (%s) in \"%s\"\n", - e.what(), activeDicts[ x ]->getName().c_str() ); + gdWarning( "getArticle request error (%s) in \"%s\"\n", + e.what(), activeDicts[ x ]->getName().c_str() ); } } @@ -505,7 +536,7 @@ if ( bodyDone ) return; - DPRINTF( "some body finished\n" ); + GD_DPRINTF( "some body finished\n" ); bool wasUpdated = false; @@ -516,7 +547,7 @@ { // Good - DPRINTF( "one finished.\n" ); + GD_DPRINTF( "one finished.\n" ); Dictionary::DataRequest & req = *bodyRequests.front(); @@ -645,21 +676,21 @@ } catch( std::exception & e ) { - qWarning( "getDataSlice error: %s\n", e.what() ); + gdWarning( "getDataSlice error: %s\n", e.what() ); } wasUpdated = true; foundAnyDefinitions = true; } - DPRINTF( "erasing..\n" ); + GD_DPRINTF( "erasing..\n" ); bodyRequests.pop_front(); - DPRINTF( "erase done..\n" ); + GD_DPRINTF( "erase done..\n" ); } else { - DPRINTF( "one not finished.\n" ); - break; + GD_DPRINTF( "one not finished.\n" ); + break; } } @@ -896,8 +927,8 @@ // DPRINTF( "Looking up %s\n", qPrintable( currentSplittedWordCompound ) ); - stemmedWordFinder->prefixMatch( currentSplittedWordCompound, activeDicts, 40, // Would one be enough? Leave 40 to be safe. - Dictionary::SuitableForCompoundSearching ); + stemmedWordFinder->expressionMatch( currentSplittedWordCompound, activeDicts, 40, // Would one be enough? Leave 40 to be safe. + Dictionary::SuitableForCompoundSearching ); } QString ArticleRequest::makeSplittedWordCompound() @@ -929,7 +960,6 @@ if ( results.size() ) { - // Check if the aliases are acceptable wstring source = Folding::applySimpleCaseOnly( gd::toWString( currentSplittedWordCompound ) ); bool hadSomething = false; @@ -937,7 +967,14 @@ for( unsigned x = 0; x < results.size(); ++x ) { if ( results[ x ].second ) - continue; // We're not interested in suggestions + { + // Spelling suggestion match found. No need to continue. + hadSomething = true; + lastGoodCompoundResult = currentSplittedWordCompound; + break; + } + + // Prefix match found. Check if the aliases are acceptable. wstring result( Folding::applySimpleCaseOnly( gd::toWString( results[ x ].first ) ) ); diff -Nru goldendict-1.5.0~git20131003/article_maker.hh goldendict-1.5.0~git20150923/article_maker.hh --- goldendict-1.5.0~git20131003/article_maker.hh 2013-08-16 09:41:47.000000000 +0000 +++ goldendict-1.5.0~git20150923/article_maker.hh 2015-09-23 08:26:24.000000000 +0000 @@ -53,7 +53,8 @@ sptr< Dictionary::DataRequest > makeDefinitionFor( QString const & word, unsigned groupId, QMap< QString, QString > const & contexts, QSet< QString > const & mutedDicts = - QSet< QString >() ) const; + QSet< QString >(), + QStringList const & dictIDs = QStringList() ) const; /// Makes up a text which states that no translation for the given word /// was found. Sometimes it's better to call this directly when it's already @@ -79,7 +80,8 @@ private: /// Makes everything up to and including the opening body tag. - std::string makeHtmlHeader( QString const & word, QString const & icon ) const; + std::string makeHtmlHeader( QString const & word, QString const & icon, + bool expandOptionalParts ) const; /// Makes the html body for makeNotFoundTextFor() static std::string makeNotFoundBody( QString const & word, QString const & group ); diff -Nru goldendict-1.5.0~git20131003/article_netmgr.cc goldendict-1.5.0~git20150923/article_netmgr.cc --- goldendict-1.5.0~git20131003/article_netmgr.cc 2013-10-02 20:42:04.000000000 +0000 +++ goldendict-1.5.0~git20150923/article_netmgr.cc 2015-09-23 08:26:24.000000000 +0000 @@ -9,7 +9,7 @@ #include "article_netmgr.hh" #include "wstring_qt.hh" -#include "dprintf.hh" +#include "gddebug.hh" using std::string; namespace @@ -90,7 +90,7 @@ if ( !req.url().host().endsWith( refererUrl.host() ) && getHostBase( req.url() ) != getHostBase( refererUrl ) && !req.url().scheme().startsWith("data") ) { - qWarning( "Blocking element \"%s\"\n", req.url().toEncoded().data() ); + gdWarning( "Blocking element \"%s\"\n", req.url().toEncoded().data() ); return new BlockedNetworkReply( this ); } @@ -126,12 +126,18 @@ sptr< Dictionary::DataRequest > ArticleNetworkAccessManager::getResource( QUrl const & url, QString & contentType ) { - DPRINTF( "getResource: %ls\n", url.toString().toStdWString().c_str() ); - DPRINTF( "scheme: %ls\n", url.scheme().toStdWString().c_str() ); - DPRINTF( "host: %ls\n", url.host().toStdWString().c_str() ); + GD_DPRINTF( "getResource: %ls\n", url.toString().toStdWString().c_str() ); + GD_DPRINTF( "scheme: %ls\n", url.scheme().toStdWString().c_str() ); + GD_DPRINTF( "host: %ls\n", url.host().toStdWString().c_str() ); if ( url.scheme() == "gdlookup" ) { + if( !url.host().isEmpty() && url.host() != "localhost" ) + { + // Strange request - ignore it + return new Dictionary::DataRequestInstant( false ); + } + contentType = "text/html"; if ( url.queryItemValue( "blank" ) == "1" ) @@ -140,6 +146,15 @@ bool groupIsValid = false; QString word = url.queryItemValue( "word" ); + + QString dictIDs = url.queryItemValue( "dictionaries" ); + if( !dictIDs.isEmpty() ) + { + // Individual dictionaries set from full-text search + QStringList dictIDList = dictIDs.split( "," ); + return articleMaker.makeDefinitionFor( word, 0, QMap< QString, QString >(), QSet< QString >(), dictIDList ); + } + unsigned group = url.queryItemValue( "group" ).toUInt( &groupIsValid ); // See if we have some dictionaries muted @@ -203,8 +218,8 @@ } catch( std::exception & e ) { - qWarning( "getResource request error (%s) in \"%s\"\n", e.what(), - dictionaries[ x ]->getName().c_str() ); + gdWarning( "getResource request error (%s) in \"%s\"\n", e.what(), + dictionaries[ x ]->getName().c_str() ); return sptr< Dictionary::DataRequest >(); } } @@ -277,7 +292,7 @@ if ( req->isFinished() ) { emit finishedSignal(); - DPRINTF( "In-place finish.\n" ); + GD_DPRINTF( "In-place finish.\n" ); } } } @@ -300,12 +315,12 @@ qint64 ArticleResourceReply::bytesAvailable() const { - long avail = req->dataSize(); + qint64 avail = req->dataSize(); if ( avail < 0 ) return 0; - return (size_t) avail - alreadyRead + QNetworkReply::bytesAvailable(); + return avail - alreadyRead + QNetworkReply::bytesAvailable(); } qint64 ArticleResourceReply::readData( char * out, qint64 maxSize ) @@ -315,18 +330,18 @@ if ( maxSize == 0 ) return 0; - DPRINTF( "====reading %d bytes\n", (int)maxSize ); + GD_DPRINTF( "====reading %d bytes\n", (int)maxSize ); bool finished = req->isFinished(); - long avail = req->dataSize(); + qint64 avail = req->dataSize(); if ( avail < 0 ) return finished ? -1 : 0; - size_t left = (size_t) avail - alreadyRead; + qint64 left = avail - alreadyRead; - size_t toRead = maxSize < left ? maxSize : left; + qint64 toRead = maxSize < left ? maxSize : left; try { diff -Nru goldendict-1.5.0~git20131003/article_netmgr.hh goldendict-1.5.0~git20150923/article_netmgr.hh --- goldendict-1.5.0~git20131003/article_netmgr.hh 2013-08-16 09:41:47.000000000 +0000 +++ goldendict-1.5.0~git20150923/article_netmgr.hh 2015-09-23 08:26:24.000000000 +0000 @@ -53,7 +53,7 @@ Q_OBJECT sptr< Dictionary::DataRequest > req; - size_t alreadyRead; + qint64 alreadyRead; public: diff -Nru goldendict-1.5.0~git20131003/article-style.css goldendict-1.5.0~git20150923/article-style.css --- goldendict-1.5.0~git20131003/article-style.css 2013-10-02 20:42:04.000000000 +0000 +++ goldendict-1.5.0~git20150923/article-style.css 2015-09-23 08:26:24.000000000 +0000 @@ -398,15 +398,9 @@ padding-left: 81px; } -.dsl_ex, -.dsl_ex font[color] /* DSL Feature: Enforce the example color even if the childen tags say otherwise */ -{ - color: gray; -} - .dsl_p, .dsl_p :not(a) /* DSL Feature: Enforce the style even if the childen tags say otherwise, except links */ { - color: green; + color: green !important; /* DSL label color must have highest priority */ font-style: italic; cursor: default; font-weight: normal; /* DSL feature: labels are always of normal weight */ @@ -443,7 +437,19 @@ .dsl_opt { display: none; - color: grey; +} + +.dsl_opt, +.dsl_opt .dsl_ex, +.dsl_opt .dsl_ex :not(a), +.dsl_opt .dsl_ex font[color] /* DSL Feature: Enforce the optional zone color even if the childen tags say otherwise */ +{ + color: gray; +} + +.dsl_ex, .dsl_ex .dsl_opt +{ + color: gray; } /* Style for expand optional parts button */ @@ -493,10 +499,14 @@ /************* Zim dictionaries **************/ +.zimdict +{ + font-size: 110%!important; +} + .zimdict_headword { font-weight: bold!important; -/* font-size: 150%; */ } /************* Spelling suggestions *****************/ @@ -556,6 +566,28 @@ color: #0000FF; } +.dictserver_from +{ + font-size: 110%; + font-weight: 600; +} + +/************* Epwing dictionaries *****************/ + +.epwing_narrow_font +{ + width: 7px; + height: 13px; + vertical-align: -15%; +} + +.epwing_wide_font +{ + width: 13px; + height: 13px; + vertical-align: -15%; +} + /************* Websites *****************/ .website_padding @@ -2844,3 +2876,11 @@ vertical-align: text-bottom; background-image:url('qrcx://localhost/icons/downarrow.png'); } + +/********** Slob dictionaries ***********/ + +.slobdict img.imgtex +{ + vertical-align: baseline !important; +} + diff -Nru goldendict-1.5.0~git20131003/article-style-st-lingoes-blue.css goldendict-1.5.0~git20150923/article-style-st-lingoes-blue.css --- goldendict-1.5.0~git20131003/article-style-st-lingoes-blue.css 2013-08-16 09:45:56.000000000 +0000 +++ goldendict-1.5.0~git20150923/article-style-st-lingoes-blue.css 2015-09-23 08:26:24.000000000 +0000 @@ -60,6 +60,7 @@ { display:block; -webkit-box-ordinal-group: 1; + -webkit-box-flex: 1; } .gdactivearticle .gddictname { @@ -179,8 +180,7 @@ font-family: Arial; } -.dsl_ex, -.dsl_ex font[color] +.dsl_ex, .dsl_ex .dsl_opt { color: slategray; } @@ -194,16 +194,19 @@ } /* Stress settings */ -.dsl_stress_without_accent { +.dsl_stress_without_accent, +.dsl_opt .dsl_ex .dsl_stress_without_accent { display: none; color: green; } -.dsl_stress_with_accent { +.dsl_stress_with_accent, +.dsl_opt .dsl_ex .dsl_stress_with_accent { display: inline; color: #DD0000; } -.dsl_stress { +.dsl_stress, +.dsl_opt .dsl_ex .dsl_stress { display: inline; color: blue; } diff -Nru goldendict-1.5.0~git20131003/article-style-st-lingvo.css goldendict-1.5.0~git20150923/article-style-st-lingvo.css --- goldendict-1.5.0~git20131003/article-style-st-lingvo.css 2013-08-16 09:41:47.000000000 +0000 +++ goldendict-1.5.0~git20150923/article-style-st-lingvo.css 2015-09-23 08:26:24.000000000 +0000 @@ -89,7 +89,12 @@ margin-top: 10px; } -.dsl_ex +.dsl_ex, .dsl_ex .dsl_opt { color: inherit; } + +.dsl_com +{ + color: black; +} diff -Nru goldendict-1.5.0~git20131003/article-style-st-modern.css goldendict-1.5.0~git20150923/article-style-st-modern.css --- goldendict-1.5.0~git20131003/article-style-st-modern.css 2013-08-16 09:45:56.000000000 +0000 +++ goldendict-1.5.0~git20150923/article-style-st-modern.css 2015-09-23 08:26:24.000000000 +0000 @@ -81,6 +81,7 @@ { display:block; -webkit-box-ordinal-group: 1; + -webkit-box-flex: 1; } .gdactivearticle .gddictname @@ -165,8 +166,7 @@ margin-top: 1.5em; } -.dsl_ex, -.dsl_ex font[color] +.dsl_ex, .dsl_ex .dsl_opt { color: steelblue; } diff -Nru goldendict-1.5.0~git20131003/articleview.cc goldendict-1.5.0~git20150923/articleview.cc --- goldendict-1.5.0~git20131003/articleview.cc 2013-10-02 20:42:04.000000000 +0000 +++ goldendict-1.5.0~git20150923/articleview.cc 2015-09-23 08:26:24.000000000 +0000 @@ -16,10 +16,12 @@ #include "wstring_qt.hh" #include "webmultimediadownload.hh" #include "programs.hh" -#include "dprintf.hh" +#include "gddebug.hh" #include "ffmpegaudio.hh" #include #include +#include "gestures.hh" +#include "fulltextsearch.hh" #if QT_VERSION >= 0x040600 #include @@ -35,13 +37,67 @@ #include -#if defined( Q_OS_WIN32 ) || defined( Q_OS_MACX ) +#if defined( Q_OS_WIN32 ) || defined( Q_OS_MAC ) #include "speechclient.hh" #endif using std::map; using std::list; +/// AccentMarkHandler class +/// +/// Remove accent marks from text +/// and mirror position in normalized text to original text + +class AccentMarkHandler +{ + QString normalizedString; + QVector< int > accentMarkPos; +public: + static QChar accentMark() + { return QChar( 0x301 ); } + + /// Create text without accent marks + /// and store mark positions + void setText( QString const & baseString ) + { + accentMarkPos.clear(); + normalizedString.clear(); + int pos = 0; + QChar mark = accentMark(); + + for( int x = 0; x < baseString.length(); x++ ) + { + if( baseString.at( x ) == mark ) + { + accentMarkPos.append( pos ); + continue; + } + normalizedString.append( baseString.at( x ) ); + pos++; + } + } + + /// Return text without accent marks + QString const & normalizedText() const + { return normalizedString; } + + /// Convert position into position in original text + int mirrorPosition( int const & pos ) const + { + int newPos = pos; + for( int x = 0; x < accentMarkPos.size(); x++ ) + { + if( accentMarkPos.at( x ) < pos ) + newPos++; + else + break; + } + return newPos; + } +}; + +/// End of DslAccentMark class static QVariant evaluateJavaScriptVariableSafe( QWebFrame * frame, const QString & variable ) { @@ -54,6 +110,7 @@ std::vector< sptr< Dictionary::Class > > const & allDictionaries_, Instances::Groups const & groups_, bool popupView_, Config::Class const & cfg_, + QAction & openSearchAction_, QAction * dictionaryBarToggled_, GroupComboBox const * groupComboBox_ ): QFrame( parent ), @@ -67,13 +124,16 @@ articleDownAction( this ), goBackAction( this ), goForwardAction( this ), - openSearchAction( this ), selectCurrentArticleAction( this ), copyAsTextAction( this ), inspectAction( this ), + openSearchAction( openSearchAction_ ), searchIsOpened( false ), dictionaryBarToggled( dictionaryBarToggled_ ), - groupComboBox( groupComboBox_ ) + groupComboBox( groupComboBox_ ), + ftsSearchIsOpened( false ), + ftsSearchMatchCase( false ), + ftsPosition( 0 ) { ui.setupUi( this ); @@ -139,7 +199,6 @@ ui.definition->addAction( &articleDownAction ); connect( &articleDownAction, SIGNAL( triggered() ), this, SLOT( moveOneArticleDown() ) ); - openSearchAction.setShortcut( QKeySequence( "Ctrl+F" ) ); ui.definition->addAction( &openSearchAction ); connect( &openSearchAction, SIGNAL( triggered() ), this, SLOT( openSearch() ) ); @@ -162,6 +221,7 @@ ui.definition->installEventFilter( this ); ui.searchFrame->installEventFilter( this ); + ui.ftsSearchFrame->installEventFilter( this ); // Load the default blank page instantly, so there would be no flicker. @@ -176,6 +236,14 @@ blankPage ); expandOptionalParts = cfg.preferences.alwaysExpandOptionalParts; + +#if QT_VERSION >= QT_VERSION_CHECK(4, 6, 0) + ui.definition->grabGesture( Gestures::GDPinchGestureType ); + ui.definition->grabGesture( Gestures::GDSwipeGestureType ); +#endif + + // Variable name for store current selection range + rangeVarName = QString( "sr_%1" ).arg( QString::number( (quint64)this, 16 ) ); } // explicitly report the minimum size, to avoid @@ -198,6 +266,11 @@ if ( cfg.preferences.useInternalPlayer ) Ffmpeg::AudioPlayer::instance().stop(); #endif + +#if QT_VERSION >= QT_VERSION_CHECK(4, 6, 0) + ui.definition->ungrabGesture( Gestures::GDPinchGestureType ); + ui.definition->ungrabGesture( Gestures::GDSwipeGestureType ); +#endif } void ArticleView::showDefinition( QString const & word, unsigned group, @@ -259,6 +332,49 @@ ui.definition->setCursor( Qt::WaitCursor ); } +void ArticleView::showDefinition( QString const & word, QStringList const & dictIDs, + QRegExp const & searchRegExp, unsigned group ) +{ + if( dictIDs.isEmpty() ) + return; + +#ifndef DISABLE_INTERNAL_PLAYER + // first, let's stop the player + if ( cfg.preferences.useInternalPlayer ) + Ffmpeg::AudioPlayer::instance().stop(); +#endif + + QUrl req; + + req.setScheme( "gdlookup" ); + req.setHost( "localhost" ); + req.addQueryItem( "word", word ); + req.addQueryItem( "dictionaries", dictIDs.join( ",") ); + req.addQueryItem( "regexp", searchRegExp.pattern() ); + if( searchRegExp.caseSensitivity() == Qt::CaseSensitive ) + req.addQueryItem( "matchcase", "1" ); + if( searchRegExp.patternSyntax() == QRegExp::WildcardUnix ) + req.addQueryItem( "wildcards", "1" ); + req.addQueryItem( "group", QString::number( group ) ); + + // Update both histories (pages history and headwords history) + saveHistoryUserData(); + emit sendWordToHistory( word ); + + // Any search opened is probably irrelevant now + closeSearch(); + + // Clear highlight all button selection + ui.highlightAllButton->setChecked(false); + + emit setExpandMode( expandOptionalParts ); + + ui.definition->load( req ); + + //QApplication::setOverrideCursor( Qt::WaitCursor ); + ui.definition->setCursor( Qt::WaitCursor ); +} + void ArticleView::showAnticipation() { ui.definition->setHtml( "" ); @@ -362,6 +478,9 @@ } emit pageLoaded( this ); + + if( ui.definition->url().hasQueryItem( "regexp" ) ) + highlightFTSResults(); } void ArticleView::handleTitleChanged( QString const & title ) @@ -440,6 +559,9 @@ if ( !id.startsWith( "gdfrom-" ) ) return; // Incorrect id + if ( !ui.definition->isVisible() ) + return; // No action on background page, scrollIntoView there don't work + if ( getArticlesList().contains( id.mid( 7 ) ) ) { if ( moveToIt ) @@ -567,19 +689,45 @@ bool ArticleView::handleF3( QObject * /*obj*/, QEvent * ev ) { - if ( ev->type() == QEvent::ShortcutOverride ) { + if ( ev->type() == QEvent::ShortcutOverride + || ev->type() == QEvent::KeyPress ) + { QKeyEvent * ke = static_cast( ev ); if ( ke->key() == Qt::Key_F3 && isSearchOpened() ) { if ( !ke->modifiers() ) { - on_searchNext_clicked(); + if( ev->type() == QEvent::KeyPress ) + on_searchNext_clicked(); + + ev->accept(); + return true; + } + + if ( ke->modifiers() == Qt::ShiftModifier ) + { + if( ev->type() == QEvent::KeyPress ) + on_searchPrevious_clicked(); + + ev->accept(); + return true; + } + } + if ( ke->key() == Qt::Key_F3 && ftsSearchIsOpened ) + { + if ( !ke->modifiers() ) + { + if( ev->type() == QEvent::KeyPress ) + on_ftsSearchNext_clicked(); + ev->accept(); return true; } if ( ke->modifiers() == Qt::ShiftModifier ) { - on_searchPrevious_clicked(); + if( ev->type() == QEvent::KeyPress ) + on_ftsSearchPrevious_clicked(); + ev->accept(); return true; } @@ -591,6 +739,59 @@ bool ArticleView::eventFilter( QObject * obj, QEvent * ev ) { +#if QT_VERSION >= QT_VERSION_CHECK(4, 6, 0) + if( ev->type() == QEvent::Gesture ) + { + Gestures::GestureResult result; + QPoint pt; + + bool handled = Gestures::handleGestureEvent( obj, ev, result, pt ); + + if( handled ) + { + if( result == Gestures::ZOOM_IN ) + zoomIn(); + else + if( result == Gestures::ZOOM_OUT ) + zoomOut(); + else + if( result == Gestures::SWIPE_LEFT ) + back(); + else + if( result == Gestures::SWIPE_RIGHT ) + forward(); + else + if( result == Gestures::SWIPE_UP || result == Gestures::SWIPE_DOWN ) + { + int delta = result == Gestures::SWIPE_UP ? -120 : 120; + QWidget *widget = static_cast< QWidget * >( obj ); + + QWidget *child = widget->childAt( widget->mapFromGlobal( pt ) ); + if( child ) + { + QWheelEvent whev( child->mapFromGlobal( pt ), pt, delta, Qt::NoButton, Qt::NoModifier ); + qApp->sendEvent( child, &whev ); + } + else + { + QWheelEvent whev( widget->mapFromGlobal( pt ), pt, delta, Qt::NoButton, Qt::NoModifier ); + qApp->sendEvent( widget, &whev ); + } + } + } + + return handled; + } + + if( ev->type() == QEvent::MouseMove ) + { + if( Gestures::isFewTouchPointsPresented() ) + { + ev->accept(); + return true; + } + } +#endif if ( handleF3( obj, ev ) ) { @@ -622,7 +823,9 @@ if ( keyEvent->key() == Qt::Key_Space || keyEvent->key() == Qt::Key_Backspace || keyEvent->key() == Qt::Key_Tab || - keyEvent->key() == Qt::Key_Backtab ) + keyEvent->key() == Qt::Key_Backtab || + keyEvent->key() == Qt::Key_Return || + keyEvent->key() == Qt::Key_Enter ) return false; // Those key have other uses than to start typing QString text = keyEvent->text(); @@ -784,8 +987,16 @@ else if ( url.scheme().compare( "bword" ) == 0 ) { - showDefinition( url.path(), - getGroup( ref ), scrollTo, contexts ); + if( ref.hasQueryItem( "dictionaries" ) ) + { + QStringList dictsList = ref.queryItemValue( "dictionaries" ) + .split( ",", QString::SkipEmptyParts ); + + showDefinition( url.path(), dictsList, QRegExp(), getGroup( ref ) ); + } + else + showDefinition( url.path(), + getGroup( ref ), scrollTo, contexts ); } else if ( url.scheme() == "gdlookup" ) // Plain html links inherit gdlookup scheme @@ -797,6 +1008,16 @@ } else { + if( ref.hasQueryItem( "dictionaries" ) ) + { + // Specific dictionary group from full-text search + QStringList dictsList = ref.queryItemValue( "dictionaries" ) + .split( ",", QString::SkipEmptyParts ); + + showDefinition( url.path().mid( 1 ), dictsList, QRegExp(), getGroup( ref ) ); + return; + } + QString newScrollTo( scrollTo ); if( url.hasQueryItem( "dict" ) ) { @@ -863,30 +1084,39 @@ if ( activeDicts ) for( unsigned x = 0; x < activeDicts->size(); ++x ) { - sptr< Dictionary::DataRequest > req = - (*activeDicts)[ x ]->getResource( - url.path().mid( 1 ).toUtf8().data() ); - - if ( req->isFinished() && req->dataSize() >= 0 ) + try { - // A request was instantly finished with success. - // If we've managed to spawn some lingering requests already, - // erase them. - resourceDownloadRequests.clear(); - - // Handle the result - resourceDownloadRequests.push_back( req ); - resourceDownloadFinished(); + sptr< Dictionary::DataRequest > req = + (*activeDicts)[ x ]->getResource( + url.path().mid( 1 ).toUtf8().data() ); + + if ( req->isFinished() && req->dataSize() >= 0 ) + { + // A request was instantly finished with success. + // If we've managed to spawn some lingering requests already, + // erase them. + resourceDownloadRequests.clear(); + + // Handle the result + resourceDownloadRequests.push_back( req ); + resourceDownloadFinished(); + + return; + } + else + if ( !req->isFinished() ) + { + resourceDownloadRequests.push_back( req ); - return; + connect( req.get(), SIGNAL( finished() ), + this, SLOT( resourceDownloadFinished() ) ); + } } - else - if ( !req->isFinished() ) + catch( std::exception & e ) { - resourceDownloadRequests.push_back( req ); - - connect( req.get(), SIGNAL( finished() ), - this, SLOT( resourceDownloadFinished() ) ); + emit statusBarMessage( + tr( "ERROR: %1" ).arg( e.what() ), + 10000, QPixmap( ":/icons/error.png" ) ); } } } @@ -971,7 +1201,7 @@ if ( url.scheme() == "gdtts" ) { // TODO: Port TTS -#if defined( Q_OS_WIN32 ) || defined( Q_OS_MACX ) +#if defined( Q_OS_WIN32 ) || defined( Q_OS_MAC ) // Text to speech QString md5Id = url.queryItemValue( "engine" ); QString text( url.path().mid( 1 ) ); @@ -1039,11 +1269,19 @@ { for( unsigned x = 0; x < activeDicts->size(); ++x ) { - req = (*activeDicts)[ x ]->getResource( - url.path().mid( 1 ).toUtf8().data() ); + try + { + req = (*activeDicts)[ x ]->getResource( + url.path().mid( 1 ).toUtf8().data() ); - ResourceToSaveHandler * handler = new ResourceToSaveHandler( this, req, fileName ); - handlers.push_back( handler ); + ResourceToSaveHandler * handler = new ResourceToSaveHandler( this, req, fileName ); + handlers.push_back( handler ); + } + catch( std::exception & e ) + { + gdWarning( "getResource request error (%s) in \"%s\"\n", e.what(), + (*activeDicts)[ x ]->getName().c_str() ); + } } } } @@ -1053,8 +1291,11 @@ QString contentType; req = articleNetMgr.getResource( url, contentType ); - ResourceToSaveHandler * handler = new ResourceToSaveHandler( this, req, fileName ); - handlers.push_back( handler ); + if( req.get() ) + { + ResourceToSaveHandler * handler = new ResourceToSaveHandler( this, req, fileName ); + handlers.push_back( handler ); + } } } else @@ -1676,6 +1917,12 @@ void ArticleView::openSearch() { + if( !isVisible() ) + return; + + if( ftsSearchIsOpened ) + closeSearch(); + if ( !searchIsOpened ) { ui.searchFrame->show(); @@ -1690,7 +1937,7 @@ if ( ui.definition->selectedText().size() ) { ui.definition->page()->currentFrame()-> - evaluateJavaScript( "window.getSelection().removeAllRanges();" ); + evaluateJavaScript( "window.getSelection().removeAllRanges();_=0;" ); } if ( ui.searchText->property( "noResults" ).toBool() ) @@ -1744,7 +1991,7 @@ if ( !id.startsWith( "gdfrom-" ) ) return; // Incorrect id - emit activeArticleChanged( id.mid( 7 ) ); + emit activeArticleChanged( this, id.mid( 7 ) ); } void ArticleView::doubleClicked() @@ -1767,7 +2014,18 @@ getCurrentArticle(), Contexts() ); } else - showDefinition( selectedText, getGroup( ui.definition->url() ), getCurrentArticle() ); + { + QUrl const & ref = ui.definition->url(); + + if( ref.hasQueryItem( "dictionaries" ) ) + { + QStringList dictsList = ref.queryItemValue( "dictionaries" ) + .split( ",", QString::SkipEmptyParts ); + showDefinition( selectedText, dictsList, QRegExp(), getGroup( ref ) ); + } + else + showDefinition( selectedText, getGroup( ref ), getCurrentArticle() ); + } } } } @@ -1785,7 +2043,7 @@ if ( ui.definition->selectedText().size() ) { ui.definition->page()->currentFrame()-> - evaluateJavaScript( "window.getSelection().removeAllRanges();" ); + evaluateJavaScript( "window.getSelection().removeAllRanges();_=0;" ); } } @@ -1849,6 +2107,27 @@ return true; } else + if( ftsSearchIsOpened ) + { + allMatches.clear(); + uniqueMatches.clear(); + ftsPosition = 0; + ftsSearchIsOpened = false; + + ui.ftsSearchFrame->hide(); + ui.definition->setFocus(); + + QWebPage::FindFlags flags ( 0 ); + + #if QT_VERSION >= 0x040600 + flags |= QWebPage::HighlightAllOccurrences; + #endif + + ui.definition->findText( "", flags ); + + return true; + } + else return false; } @@ -1863,6 +2142,9 @@ if ( !searchIsOpened ) ui.searchFrame->hide(); + + if( !ftsSearchIsOpened ) + ui.ftsSearchFrame->hide(); } void ArticleView::receiveExpandOptionalParts( bool expand ) @@ -1903,6 +2185,159 @@ ui.definition->triggerPageAction( QWebPage::InspectElement ); } +void ArticleView::highlightFTSResults() +{ + closeSearch(); + + AccentMarkHandler markHandler; + + const QUrl & url = ui.definition->url(); + QRegExp regexp( url.queryItemValue( "regexp" ).remove( AccentMarkHandler::accentMark() ), + url.hasQueryItem( "matchcase" ) ? Qt::CaseSensitive : Qt::CaseInsensitive, + url.hasQueryItem( "wildcards" ) ? QRegExp::WildcardUnix : QRegExp::RegExp2 ); + + if( regexp.pattern().isEmpty() ) + return; + + regexp.setMinimal( true ); + + // Clear any current selection + if ( ui.definition->selectedText().size() ) + { + ui.definition->page()->currentFrame()-> + evaluateJavaScript( "window.getSelection().removeAllRanges();_=0;" ); + } + + QString pageText = ui.definition->page()->currentFrame()->toPlainText(); + markHandler.setText( pageText ); + + int pos = 0; + + while( pos >= 0 ) + { + pos = regexp.indexIn( markHandler.normalizedText(), pos ); + if( pos >= 0 ) + { + // Mirror pos and matched length to original string + int spos = markHandler.mirrorPosition( pos ); + int matched = markHandler.mirrorPosition( pos + regexp.matchedLength() ) - spos; + + if( matched > FTS::MaxMatchLengthForHighlightResults ) + { + gdWarning( "ArticleView::highlightFTSResults(): Too long match - skipped (matched length %i, allowed %i)", + regexp.matchedLength(), FTS::MaxMatchLengthForHighlightResults ); + } + else + allMatches.append( pageText.mid( spos, matched ) ); + + pos += regexp.matchedLength(); + } + } + + ftsSearchMatchCase = url.hasQueryItem( "matchcase" ); + + QWebPage::FindFlags flags ( 0 ); + + if( ftsSearchMatchCase ) + flags |= QWebPage::FindCaseSensitively; + +#if QT_VERSION >= 0x040600 + flags |= QWebPage::HighlightAllOccurrences; + + for( int x = 0; x < allMatches.size(); x++ ) + ui.definition->findText( allMatches.at( x ), flags ); + + flags &= ~QWebPage::HighlightAllOccurrences; +#endif + + if( !allMatches.isEmpty() ) + { + if( ui.definition->findText( allMatches.at( 0 ), flags ) ) + { + ui.definition->page()->currentFrame()-> + evaluateJavaScript( QString( "%1=window.getSelection().getRangeAt(0);_=0;" ) + .arg( rangeVarName ) ); + } + } + + ui.ftsSearchFrame->show(); + ui.ftsSearchPrevious->setEnabled( false ); + ui.ftsSearchNext->setEnabled( !allMatches.isEmpty() ); + + ftsSearchIsOpened = true; +} + +void ArticleView::performFtsFindOperation( bool backwards ) +{ + if( !ftsSearchIsOpened ) + return; + + if( allMatches.isEmpty() ) + { + ui.ftsSearchNext->setEnabled( false ); + ui.ftsSearchPrevious->setEnabled( false ); + return; + } + + QWebPage::FindFlags flags( 0 ); + + if( ftsSearchMatchCase ) + flags |= QWebPage::FindCaseSensitively; + + + // Restore saved highlighted selection + ui.definition->page()->currentFrame()-> + evaluateJavaScript( QString( "var sel=window.getSelection();sel.removeAllRanges();sel.addRange(%1);_=0;" ) + .arg( rangeVarName ) ); + + bool res; + if( backwards ) + { + if( ftsPosition > 0 ) + { + res = ui.definition->findText( allMatches.at( ftsPosition - 1 ), + flags | QWebPage::FindBackward ); + ftsPosition -= 1; + } + else + res = ui.definition->findText( allMatches.at( ftsPosition ), + flags | QWebPage::FindBackward ); + + ui.ftsSearchPrevious->setEnabled( res ); + if( !ui.ftsSearchNext->isEnabled() ) + ui.ftsSearchNext->setEnabled( res ); + } + else + { + if( ftsPosition < allMatches.size() - 1 ) + { + res = ui.definition->findText( allMatches.at( ftsPosition + 1 ), flags ); + ftsPosition += 1; + } + else + res = ui.definition->findText( allMatches.at( ftsPosition ), flags ); + + ui.ftsSearchNext->setEnabled( res ); + if( !ui.ftsSearchPrevious->isEnabled() ) + ui.ftsSearchPrevious->setEnabled( res ); + } + + // Store new highlighted selection + ui.definition->page()->currentFrame()-> + evaluateJavaScript( QString( "%1=window.getSelection().getRangeAt(0);_=0;" ) + .arg( rangeVarName ) ); +} + +void ArticleView::on_ftsSearchPrevious_clicked() +{ + performFtsFindOperation( true ); +} + +void ArticleView::on_ftsSearchNext_clicked() +{ + performFtsFindOperation( false ); +} + #ifdef Q_OS_WIN32 void ArticleView::readTag( const QString & from, QString & to, int & count ) diff -Nru goldendict-1.5.0~git20131003/articleview.hh goldendict-1.5.0~git20150923/articleview.hh --- goldendict-1.5.0~git20131003/articleview.hh 2013-08-16 09:45:56.000000000 +0000 +++ goldendict-1.5.0~git20150923/articleview.hh 2015-09-23 08:26:24.000000000 +0000 @@ -30,11 +30,13 @@ Ui::ArticleView ui; QAction pasteAction, articleUpAction, articleDownAction, - goBackAction, goForwardAction, openSearchAction, selectCurrentArticleAction, + goBackAction, goForwardAction, selectCurrentArticleAction, copyAsTextAction, inspectAction; + QAction & openSearchAction; bool searchIsOpened; bool expandOptionalParts; QString articleToJump; + QString rangeVarName; /// Any resource we've decided to download off the dictionary gets stored here. /// Full vector capacity is used for search requests, where we have to make @@ -49,6 +51,16 @@ QAction * dictionaryBarToggled; GroupComboBox const * groupComboBox; + /// Search in results of full-text search + QStringList allMatches; + QStringList uniqueMatches; + bool ftsSearchIsOpened, ftsSearchMatchCase; + int ftsPosition; + + void highlightFTSResults(); + void performFtsFindOperation( bool backwards ); + void showFindButtons(); + public: /// The popupView flag influences contents of the context menus to be /// appropriate to the context of the view. @@ -59,6 +71,7 @@ Instances::Groups const &, bool popupView, Config::Class const & cfg, + QAction & openSearchAction_, QAction * dictionaryBarToggled = 0, GroupComboBox const * groupComboBox = 0 ); @@ -83,6 +96,9 @@ QString const & scrollTo = QString(), Contexts const & contexts = Contexts() ); + void showDefinition( QString const & word, QStringList const & dictIDs, + QRegExp const & searchRegExp, unsigned group ); + /// Clears the view and sets the application-global waiting cursor, /// which will be restored when some article loads eventually. void showAnticipation(); @@ -196,7 +212,7 @@ /// typically in response to user actions /// (clicking on the article or using shortcuts). /// id - the dictionary id of the active article. - void activeArticleChanged ( QString const & id ); + void activeArticleChanged ( ArticleView const *, QString const & id ); /// Signal to add word to history even if history is disabled void forceAddWordToHistory( const QString & word); @@ -211,6 +227,9 @@ void storeResourceSavePath(QString const & ); + void zoomIn(); + void zoomOut(); + public slots: void on_searchPrevious_clicked(); @@ -258,6 +277,9 @@ void on_searchCaseSensitive_clicked(); void on_highlightAllButton_clicked(); + void on_ftsSearchPrevious_clicked(); + void on_ftsSearchNext_clicked(); + /// Handles the double-click from the definition. void doubleClicked(); diff -Nru goldendict-1.5.0~git20131003/articleview.ui goldendict-1.5.0~git20150923/articleview.ui --- goldendict-1.5.0~git20131003/articleview.ui 2013-08-16 09:41:47.000000000 +0000 +++ goldendict-1.5.0~git20150923/articleview.ui 2015-09-23 08:26:24.000000000 +0000 @@ -13,8 +13,17 @@ Form - - + + + 0 + + + 0 + + + 0 + + 0 @@ -26,7 +35,16 @@ QFrame::Raised - + + 0 + + + 0 + + + 0 + + 0 @@ -40,6 +58,56 @@ + + + + + QFrame::Raised + + + + + + &Previous + + + + :/icons/previous.png:/icons/previous.png + + + Qt::ToolButtonTextBesideIcon + + + + + + + &Next + + + + :/icons/next.png:/icons/next.png + + + Qt::ToolButtonTextBesideIcon + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + diff -Nru goldendict-1.5.0~git20131003/authentication.ui goldendict-1.5.0~git20150923/authentication.ui --- goldendict-1.5.0~git20131003/authentication.ui 1970-01-01 00:00:00.000000000 +0000 +++ goldendict-1.5.0~git20150923/authentication.ui 2015-09-23 08:26:24.000000000 +0000 @@ -0,0 +1,111 @@ + + + Dialog + + + + 0 + 0 + 389 + 120 + + + + Proxy authentication required + + + + + + You need to supply a Username and a Password to access via proxy + + + false + + + + + + + Username: + + + + + + + + + + Password: + + + + + + + QLineEdit::Password + + + + + + + Qt::Horizontal + + + QDialogButtonBox::Cancel|QDialogButtonBox::Ok + + + + + + + Qt::Vertical + + + + 20 + 40 + + + + + + + + + + buttonBox + accepted() + Dialog + accept() + + + 248 + 254 + + + 157 + 274 + + + + + buttonBox + rejected() + Dialog + reject() + + + 316 + 260 + + + 286 + 274 + + + + + diff -Nru goldendict-1.5.0~git20131003/bgl_babylon.cc goldendict-1.5.0~git20150923/bgl_babylon.cc --- goldendict-1.5.0~git20131003/bgl_babylon.cc 2013-10-02 20:42:04.000000000 +0000 +++ goldendict-1.5.0~git20150923/bgl_babylon.cc 2015-09-23 08:26:24.000000000 +0000 @@ -28,12 +28,13 @@ #include #include #include -#include "dprintf.hh" +#include "gddebug.hh" #include "ufile.hh" #include "iconv.hh" #include "htmlescape.hh" #include #include +#include "dictionary.hh" #ifdef _WIN32 #include @@ -44,6 +45,11 @@ using std::string; +DEF_EX_STR( exCantReadFile, "Can't read file", Dictionary::Ex ) +DEF_EX( exUserAbort, "User abort", Dictionary::Ex ) +DEF_EX( exIconv, "Iconv library error", Dictionary::Ex ) +DEF_EX( exAllocation, "Error memory allocation", Dictionary::Ex ) + Babylon::Babylon( std::string filename ) : m_filename( filename ) { @@ -100,7 +106,7 @@ fflush( f ); -#ifdef Q_OS_MACX +#ifdef Q_OS_MAC /* Under Mac OS X the above technique don't set reopen position properly */ int fn = DUP( fileno( f ) ); lseek( fn, i, SEEK_SET ); @@ -141,6 +147,9 @@ if( block.length ) { block.data = (char *)malloc( block.length ); + if( !block.data ) + throw exAllocation(); + unsigned res = gzread( file, block.data, block.length ); if( block.length != res ) { @@ -315,7 +324,7 @@ convertToUtf8( m_email, TARGET_CHARSET ); convertToUtf8( m_copyright, TARGET_CHARSET ); convertToUtf8( m_description, TARGET_CHARSET ); - DPRINTF("Default charset: %s\nSource Charset: %s\nTargetCharset: %s\n", m_defaultCharset.c_str(), m_sourceCharset.c_str(), m_targetCharset.c_str()); + GD_DPRINTF("Default charset: %s\nSource Charset: %s\nTargetCharset: %s\n", m_defaultCharset.c_str(), m_sourceCharset.c_str(), m_targetCharset.c_str()); return true; } @@ -495,7 +504,7 @@ if ( length > len - a - 2 ) { - FDPRINTF( stderr, "Hidden displayed headword is too large %s\n", headword.c_str() ); + GD_FDPRINTF( stderr, "Hidden displayed headword is too large %s\n", headword.c_str() ); pos += len - a; break; } @@ -510,7 +519,7 @@ if ( length > len - a - 2 ) { - FDPRINTF( stderr, "Displayed headword's length is too large for headword %s\n", headword.c_str() ); + GD_FDPRINTF( stderr, "Displayed headword's length is too large for headword %s\n", headword.c_str() ); pos += len - a; break; } @@ -530,7 +539,7 @@ if ( length > len - a - 3 ) { - FDPRINTF( stderr, "2-byte sized displayed headword for %s is too large\n", headword.c_str() ); + GD_FDPRINTF( stderr, "2-byte sized displayed headword for %s is too large\n", headword.c_str() ); pos += len - a; break; } @@ -548,7 +557,7 @@ if ( length > len - a - 3 ) { - FDPRINTF( stderr, "1-byte-sized transcription's length is too large for headword %s\n", headword.c_str() ); + GD_FDPRINTF( stderr, "1-byte-sized transcription's length is too large for headword %s\n", headword.c_str() ); pos += len - a; break; } @@ -561,7 +570,7 @@ } catch( Iconv::Ex & e ) { - qWarning() << "Bgl: charset convertion error, no trancription processing's done: " << e.what(); + qWarning( "Bgl: charset convertion error, no trancription processing's done: %s\n", e.what() ); transcription = std::string( block.data + pos + 3, length ); } } @@ -581,7 +590,7 @@ if ( length > len - a - 4) { - FDPRINTF( stderr, "2-byte-sized transcription's length is too large for headword %s\n", headword.c_str() ); + GD_FDPRINTF( stderr, "2-byte-sized transcription's length is too large for headword %s\n", headword.c_str() ); pos += len - a; break; } @@ -594,7 +603,7 @@ } catch( Iconv::Ex & e ) { - qWarning() << "Bgl: charset convertion error, no trancription processing's done: " << e.what(); + qWarning( "Bgl: charset convertion error, no trancription processing's done: %s\n", e.what() ); transcription = std::string( block.data + pos + 4, length ); } } @@ -614,7 +623,7 @@ if ( length > len - a - 2 ) { - FDPRINTF( stderr, "Hidden transcription is too large %s\n", headword.c_str() ); + GD_FDPRINTF( stderr, "Hidden transcription is too large %s\n", headword.c_str() ); pos += len - a; break; } @@ -786,10 +795,7 @@ iconv_t cd = iconv_open( "UTF-8", charset.c_str() ); if( cd == (iconv_t)(-1) ) - { - qFatal( "Error openning iconv library" ); - exit(1); - } + throw exIconv(); char *outbuf, *defbuf; size_t inbufbytes, outbufbytes; @@ -800,11 +806,17 @@ char *inbuf; inbuf = (char *)s.data(); outbuf = (char*)malloc( outbufbytes + 1 ); + if( !outbuf ) + { + iconv_close( cd ); + throw exAllocation(); + } + memset( outbuf, '\0', outbufbytes + 1 ); defbuf = outbuf; while (inbufbytes) { if (iconv(cd, &inbuf, &inbufbytes, &outbuf, &outbufbytes) == (size_t)-1) { - qWarning() << "\"" << inbuf << "\" - error in iconv conversion"; + gdWarning( "\"%s\" - error in iconv conversion\n", inbuf ); break; // inbuf++; // inbufbytes--; diff -Nru goldendict-1.5.0~git20131003/bgl.cc goldendict-1.5.0~git20150923/bgl.cc --- goldendict-1.5.0~git20131003/bgl.cc 2013-10-02 20:42:04.000000000 +0000 +++ goldendict-1.5.0~git20150923/bgl.cc 2015-09-23 08:26:24.000000000 +0000 @@ -10,9 +10,10 @@ #include "chunkedstorage.hh" #include "langcoder.hh" #include "language.hh" -#include "dprintf.hh" +#include "gddebug.hh" #include "fsencoding.hh" #include "htmlescape.hh" +#include "ftshelpers.hh" #include #include @@ -198,7 +199,7 @@ if ( result < 0 ) { - qWarning( "Failed to decode utf8 of headword \"%s\", skipping it.", word.c_str() ); + gdWarning( "Failed to decode utf8 of headword \"%s\", skipping it.", word.c_str() ); return; } @@ -251,8 +252,23 @@ virtual sptr< Dictionary::DataRequest > getResource( string const & name ) throw( std::exception ); + virtual sptr< Dictionary::DataRequest > getSearchResults( QString const & searchString, + int searchMode, bool matchCase, + int distanceBetweenWords, + int maxResults ); virtual QString const& getDescription(); + virtual void getArticleText( uint32_t articleAddress, QString & headword, QString & text ); + + virtual void makeFTSIndex(QAtomicInt & isCancelled, bool firstIteration ); + + virtual void setFTSParameters( Config::FullTextSearch const & fts ) + { + can_FTS = fts.enabled + && !fts.disabledTypes.contains( "BGL", Qt::CaseInsensitive ) + && ( fts.maxDictionarySize == 0 || getArticleCount() <= fts.maxDictionarySize ); + } + protected: virtual void loadIcon() throw(); @@ -295,6 +311,14 @@ openIndex( IndexInfo( idxHeader.indexBtreeMaxElements, idxHeader.indexRootOffset ), idx, idxMutex ); + + can_FTS = true; + + ftsIdxName = indexFile + "_FTS"; + + if( !Dictionary::needToRebuildIndex( getDictionaryFilenames(), ftsIdxName ) + && !FtsHelpers::ftsIndexIsOldOrBad( ftsIdxName, this ) ) + FTS_index_completed.ref(); } void BglDictionary::loadIcon() throw() @@ -382,6 +406,7 @@ dictionaryDescription = "NONE"; else { + Mutex::Lock _( idxMutex ); vector< char > chunk; char * dictDescription = chunks.getBlock( idxHeader.descriptionAddress, chunk ); string str( dictDescription ); @@ -407,6 +432,74 @@ return dictionaryDescription; } + void BglDictionary::getArticleText( uint32_t articleAddress, QString & headword, QString & text ) + { + try + { + string headwordStr, displayedHeadwordStr, articleStr; + loadArticle( articleAddress, headwordStr, displayedHeadwordStr, articleStr ); + + // Some headword normalization similar while indexing + trimWs( headwordStr ); + + if ( headwordStr.size() && headwordStr[ 0 ] == '/' ) + headwordStr.erase(); // We will take headword from index later + + if ( headwordStr.size() + && headwordStr[ headwordStr.size() - 1 ] == '$' ) + { + headwordStr = removePostfix( headwordStr ); + trimWs( headwordStr ); + } + + headword = QString::fromUtf8( headwordStr.data(), headwordStr.size() ); + + wstring wstr = Utf8::decode( articleStr ); + + if ( getLangTo() == LangCoder::code2toInt( "he" ) ) + { + for ( unsigned int i = 0; i < wstr.size(); i++ ) + { + if ( (wstr[ i ] >= 224 && wstr[ i ] <= 250) || (wstr[ i ] >= 192 && wstr[ i ] <= 210) ) // Hebrew chars encoded ecoded as windows-1255 or ISO-8859-8, or as vowel-points of windows-1255 + wstr[ i ] += 1488 - 224; // Convert to Hebrew unicode + } + } + + text = Html::unescape( gd::toQString( wstr ) ); + } + catch( std::exception &ex ) + { + gdWarning( "BGL: Failed retrieving article from \"%s\", reason: %s\n", getName().c_str(), ex.what() ); + } + } + + void BglDictionary::makeFTSIndex( QAtomicInt & isCancelled, bool firstIteration ) + { + if( !( Dictionary::needToRebuildIndex( getDictionaryFilenames(), ftsIdxName ) + || FtsHelpers::ftsIndexIsOldOrBad( ftsIdxName, this ) ) ) + FTS_index_completed.ref(); + + if( haveFTSIndex() ) + return; + + if( firstIteration && getArticleCount() > FTS::MaxDictionarySizeForFastSearch ) + return; + + gdDebug( "Bgl: Building the full-text index for dictionary: %s\n", + getName().c_str() ); + + try + { + FtsHelpers::makeFTSIndex( this, isCancelled ); + FTS_index_completed.ref(); + } + catch( std::exception &ex ) + { + gdWarning( "Bgl: Failed building full-text search index for \"%s\", reason: %s\n", getName().c_str(), ex.what() ); + QFile::remove( FsEncoding::decode( ftsIdxName.c_str() ) ); + } + } + /// BglDictionary::findHeadwordsForSynonym() class BglHeadwordsRequest; @@ -636,7 +729,7 @@ for (unsigned int i=0; i=224 && hebWStr[i]<=250) // Hebrew chars encoded ecoded as windows-1255 or ISO-8859-8 + if ( (hebWStr[ i ] >= 224 && hebWStr[ i ] <= 250) || (hebWStr[ i ] >= 192 && hebWStr[ i ] <= 210) ) // Hebrew chars encoded ecoded as windows-1255 or ISO-8859-8, or as vowel-points of windows-1255 hebWStr[i]+=1488-224; // Convert to Hebrew unicode } hebStr=Utf8::encode(hebWStr); @@ -748,7 +841,7 @@ } // try catch( std::exception &ex ) { - qWarning( "BGL: Failed loading article from \"%s\", reason: %s\n", dict.getName().c_str(), ex.what() ); + gdWarning( "BGL: Failed loading article from \"%s\", reason: %s\n", dict.getName().c_str(), ex.what() ); } } @@ -807,7 +900,7 @@ .replace( QRegExp( "(<\\s*a\\s+[^>]*href\\s*=\\s*[\"']\\s*)bword://", Qt::CaseInsensitive ), "\\1bword:" ) //remove invalid width, height attrs - .replace(QRegExp( "(width)|(height)\\s*=\\s*[\"']\\d{7,}[\"'']" ), + .replace(QRegExp( "(width|height)\\s*=\\s*[\"']\\d{7,}[\"'']" ), "" ) //remove invalid
tag .replace( QRegExp( "
(|||||function addScript|var scNode|scNode|var atag|while\\(atag|atag=atag|document\\.getElementsByTagName|addScript|src=\"bres| BglDictionary::getSearchResults( QString const & searchString, + int searchMode, bool matchCase, + int distanceBetweenWords, + int maxResults ) +{ + return new FtsHelpers::FTSResultsRequest( *this, searchString,searchMode, matchCase, distanceBetweenWords, maxResults ); +} vector< sptr< Dictionary::Class > > makeDictionaries( @@ -1086,151 +1186,167 @@ { // Building the index - qDebug() << "Bgl: Building the index for dictionary: " << i->c_str(); + gdDebug( "Bgl: Building the index for dictionary: %s\n", i->c_str() ); - Babylon b( *i ); + try + { + Babylon b( *i ); - if ( !b.open() ) - continue; + if ( !b.open() ) + continue; - std::string sourceCharset, targetCharset; + std::string sourceCharset, targetCharset; - if ( !b.read( sourceCharset, targetCharset ) ) - { - qWarning( "Failed to start reading from %s, skipping it\n", i->c_str() ); - continue; - } + if ( !b.read( sourceCharset, targetCharset ) ) + { + gdWarning( "Failed to start reading from %s, skipping it\n", i->c_str() ); + continue; + } - initializing.indexingDictionary( b.title() ); + initializing.indexingDictionary( b.title() ); - File::Class idx( indexFile, "wb" ); + File::Class idx( indexFile, "wb" ); - IdxHeader idxHeader; + IdxHeader idxHeader; - memset( &idxHeader, 0, sizeof( idxHeader ) ); + memset( &idxHeader, 0, sizeof( idxHeader ) ); - // We write a dummy header first. At the end of the process the header - // will be rewritten with the right values. + // We write a dummy header first. At the end of the process the header + // will be rewritten with the right values. - idx.write( idxHeader ); + idx.write( idxHeader ); - idx.write< uint32_t >( b.title().size() ); - idx.write( b.title().data(), b.title().size() ); + idx.write< uint32_t >( b.title().size() ); + idx.write( b.title().data(), b.title().size() ); - // This is our index data that we accumulate during the loading process. - // For each new word encountered, we emit the article's body to the file - // immediately, inserting the word itself and its offset in this map. - // This map maps folded words to the original words and the corresponding - // articles' offsets. - IndexedWords indexedWords; + // This is our index data that we accumulate during the loading process. + // For each new word encountered, we emit the article's body to the file + // immediately, inserting the word itself and its offset in this map. + // This map maps folded words to the original words and the corresponding + // articles' offsets. + IndexedWords indexedWords; - // We use this buffer to decode utf8 into it. - vector< wchar > wcharBuffer; + // We use this buffer to decode utf8 into it. + vector< wchar > wcharBuffer; - ChunkedStorage::Writer chunks( idx ); + ChunkedStorage::Writer chunks( idx ); - uint32_t articleCount = 0, wordCount = 0; + uint32_t articleCount = 0, wordCount = 0; - ResourceHandler resourceHandler( idx ); + ResourceHandler resourceHandler( idx ); - b.setResourcePrefix( string( "bres://" ) + dictId + "/" ); + b.setResourcePrefix( string( "bres://" ) + dictId + "/" ); - // Save icon if there's one - if ( size_t sz = b.getIcon().size() ) - { - idxHeader.iconAddress = chunks.startNewBlock(); - chunks.addToBlock( &b.getIcon().front(), sz ); - idxHeader.iconSize = sz; - } - - // Save dictionary description if there's one - idxHeader.descriptionSize = 0; - idxHeader.descriptionAddress = chunks.startNewBlock(); + // Save icon if there's one + if ( size_t sz = b.getIcon().size() ) + { + idxHeader.iconAddress = chunks.startNewBlock(); + chunks.addToBlock( &b.getIcon().front(), sz ); + idxHeader.iconSize = sz; + } - chunks.addToBlock( b.copyright().c_str(), b.copyright().size() + 1 ); - idxHeader.descriptionSize += b.copyright().size() + 1; + // Save dictionary description if there's one + idxHeader.descriptionSize = 0; + idxHeader.descriptionAddress = chunks.startNewBlock(); - chunks.addToBlock( b.author().c_str(), b.author().size() + 1 ); - idxHeader.descriptionSize += b.author().size() + 1; + chunks.addToBlock( b.copyright().c_str(), b.copyright().size() + 1 ); + idxHeader.descriptionSize += b.copyright().size() + 1; - chunks.addToBlock( b.email().c_str(), b.email().size() + 1 ); - idxHeader.descriptionSize += b.email().size() + 1; + chunks.addToBlock( b.author().c_str(), b.author().size() + 1 ); + idxHeader.descriptionSize += b.author().size() + 1; - chunks.addToBlock( b.description().c_str(), b.description().size() + 1 ); - idxHeader.descriptionSize += b.description().size() + 1; + chunks.addToBlock( b.email().c_str(), b.email().size() + 1 ); + idxHeader.descriptionSize += b.email().size() + 1; - for( ; ; ) - { - bgl_entry e = b.readEntry( &resourceHandler ); + chunks.addToBlock( b.description().c_str(), b.description().size() + 1 ); + idxHeader.descriptionSize += b.description().size() + 1; - if ( e.headword.empty() ) - break; + for( ; ; ) + { + bgl_entry e = b.readEntry( &resourceHandler ); - // Save the article's body itself first + if ( e.headword.empty() ) + break; - uint32_t articleAddress = chunks.startNewBlock(); + // Save the article's body itself first - chunks.addToBlock( e.headword.c_str(), e.headword.size() + 1 ); - chunks.addToBlock( e.displayedHeadword.c_str(), e.displayedHeadword.size() + 1 ); - chunks.addToBlock( e.definition.c_str(), e.definition.size() + 1 ); + uint32_t articleAddress = chunks.startNewBlock(); - // Add entries to the index + chunks.addToBlock( e.headword.c_str(), e.headword.size() + 1 ); + chunks.addToBlock( e.displayedHeadword.c_str(), e.displayedHeadword.size() + 1 ); + chunks.addToBlock( e.definition.c_str(), e.definition.size() + 1 ); - addEntryToIndex( e.headword, articleAddress, indexedWords, wcharBuffer ); + // Add entries to the index - for( unsigned x = 0; x < e.alternates.size(); ++x ) - addEntryToIndex( e.alternates[ x ], articleAddress, indexedWords, wcharBuffer ); + addEntryToIndex( e.headword, articleAddress, indexedWords, wcharBuffer ); - wordCount += 1 + e.alternates.size(); - ++articleCount; - } + for( unsigned x = 0; x < e.alternates.size(); ++x ) + addEntryToIndex( e.alternates[ x ], articleAddress, indexedWords, wcharBuffer ); - // Finish with the chunks + wordCount += 1 + e.alternates.size(); + ++articleCount; + } - idxHeader.chunksOffset = chunks.finish(); + // Finish with the chunks - DPRINTF( "Writing index...\n" ); + idxHeader.chunksOffset = chunks.finish(); - // Good. Now build the index + GD_DPRINTF( "Writing index...\n" ); - IndexInfo idxInfo = BtreeIndexing::buildIndex( indexedWords, idx ); + // Good. Now build the index - idxHeader.indexBtreeMaxElements = idxInfo.btreeMaxElements; - idxHeader.indexRootOffset = idxInfo.rootOffset; + IndexInfo idxInfo = BtreeIndexing::buildIndex( indexedWords, idx ); - // Save the resource's list. + idxHeader.indexBtreeMaxElements = idxInfo.btreeMaxElements; + idxHeader.indexRootOffset = idxInfo.rootOffset; - idxHeader.resourceListOffset = idx.tell(); - idxHeader.resourcesCount = resourceHandler.getResources().size(); + // Save the resource's list. - for( list< pair< string, uint32_t > >::const_iterator j = - resourceHandler.getResources().begin(); - j != resourceHandler.getResources().end(); ++j ) - { - idx.write< uint32_t >( j->first.size() ); - idx.write( j->first.data(), j->first.size() ); - idx.write< uint32_t >( j->second ); - } + idxHeader.resourceListOffset = idx.tell(); + idxHeader.resourcesCount = resourceHandler.getResources().size(); + + for( list< pair< string, uint32_t > >::const_iterator j = + resourceHandler.getResources().begin(); + j != resourceHandler.getResources().end(); ++j ) + { + idx.write< uint32_t >( j->first.size() ); + idx.write( j->first.data(), j->first.size() ); + idx.write< uint32_t >( j->second ); + } - // That concludes it. Update the header. + // That concludes it. Update the header. - idxHeader.signature = Signature; - idxHeader.formatVersion = CurrentFormatVersion; - idxHeader.parserVersion = Babylon::ParserVersion; - idxHeader.foldingVersion = Folding::Version; - idxHeader.articleCount = articleCount; - idxHeader.wordCount = wordCount; - idxHeader.langFrom = b.sourceLang();//LangCoder::findIdForLanguage( Utf8::decode( b.sourceLang() ) ); - idxHeader.langTo = b.targetLang();//LangCoder::findIdForLanguage( Utf8::decode( b.targetLang() ) ); + idxHeader.signature = Signature; + idxHeader.formatVersion = CurrentFormatVersion; + idxHeader.parserVersion = Babylon::ParserVersion; + idxHeader.foldingVersion = Folding::Version; + idxHeader.articleCount = articleCount; + idxHeader.wordCount = wordCount; + idxHeader.langFrom = b.sourceLang();//LangCoder::findIdForLanguage( Utf8::decode( b.sourceLang() ) ); + idxHeader.langTo = b.targetLang();//LangCoder::findIdForLanguage( Utf8::decode( b.targetLang() ) ); - idx.rewind(); + idx.rewind(); - idx.write( &idxHeader, sizeof( idxHeader ) ); + idx.write( &idxHeader, sizeof( idxHeader ) ); + } + catch( std::exception & e ) + { + gdWarning( "BGL dictionary indexing failed: %s, error: %s\n", + i->c_str(), e.what() ); + } } - dictionaries.push_back( new BglDictionary( dictId, - indexFile, - *i ) ); + try + { + dictionaries.push_back( new BglDictionary( dictId, + indexFile, + *i ) ); + } + catch( std::exception & e ) + { + gdWarning( "BGL dictionary initializing failed: %s, error: %s\n", + i->c_str(), e.what() ); + } } return dictionaries; diff -Nru goldendict-1.5.0~git20131003/btreeidx.cc goldendict-1.5.0~git20150923/btreeidx.cc --- goldendict-1.5.0~git20131003/btreeidx.cc 2013-10-02 20:42:04.000000000 +0000 +++ goldendict-1.5.0~git20150923/btreeidx.cc 2015-09-23 08:26:24.000000000 +0000 @@ -10,7 +10,7 @@ #include #include #include -#include "dprintf.hh" +#include "gddebug.hh" #include "wstring_qt.hh" //#define __BTREE_USE_LZO @@ -38,6 +38,7 @@ using gd::wstring; using gd::wchar; +using std::pair; enum { @@ -76,15 +77,15 @@ rootNode.clear(); } -vector< WordArticleLink > BtreeIndex::findArticles( wstring const & str ) +vector< WordArticleLink > BtreeIndex::findArticles( wstring const & word ) { vector< WordArticleLink > result; try { - wstring folded = Folding::apply( str ); + wstring folded = Folding::apply( word ); if( folded.empty() ) - folded = Folding::applyWhitespaceOnly( str ); + folded = Folding::applyWhitespaceOnly( word ); bool exactMatch; @@ -101,12 +102,12 @@ { result = readChain( chainOffset ); - antialias( str, result ); + antialias( word, result ); } } catch( std::exception & e ) { - qWarning( "Articles searching failed, error: %s\n", e.what() ); + gdWarning( "Articles searching failed, error: %s\n", e.what() ); result.clear(); } catch(...) @@ -118,8 +119,6 @@ return result; } -class BtreeWordSearchRequest; - class BtreeWordSearchRunnable: public QRunnable { BtreeWordSearchRequest & r; @@ -140,74 +139,138 @@ virtual void run(); }; -class BtreeWordSearchRequest: public Dictionary::WordSearchRequest +void BtreeWordSearchRunnable::run() { - friend class BtreeWordSearchRunnable; - - BtreeDictionary & dict; - wstring str; - unsigned long maxResults; - unsigned minLength; - int maxSuffixVariation; - bool allowMiddleMatches; - QAtomicInt isCancelled; - QSemaphore hasExited; - -public: + r.run(); +} - BtreeWordSearchRequest( BtreeDictionary & dict_, - wstring const & str_, - unsigned minLength_, - int maxSuffixVariation_, - bool allowMiddleMatches_, - unsigned long maxResults_ ): - dict( dict_ ), str( str_ ), - maxResults( maxResults_ ), - minLength( minLength_ ), - maxSuffixVariation( maxSuffixVariation_ ), - allowMiddleMatches( allowMiddleMatches_ ) +BtreeWordSearchRequest::BtreeWordSearchRequest( BtreeDictionary & dict_, + wstring const & str_, + unsigned minLength_, + int maxSuffixVariation_, + bool allowMiddleMatches_, + unsigned long maxResults_, + bool startRunnable ): + dict( dict_ ), str( str_ ), + maxResults( maxResults_ ), + minLength( minLength_ ), + maxSuffixVariation( maxSuffixVariation_ ), + allowMiddleMatches( allowMiddleMatches_ ) +{ + if( startRunnable ) { QThreadPool::globalInstance()->start( new BtreeWordSearchRunnable( *this, hasExited ) ); } +} - void run(); // Run from another thread by BtreeWordSearchRunnable +void BtreeWordSearchRequest::findMatches() +{ + QRegExp regexp; + bool useWildcards = false; + if( allowMiddleMatches ) + useWildcards = ( str.find( '*' ) != wstring::npos || + str.find( '?' ) != wstring::npos || + str.find( '[' ) != wstring::npos || + str.find( ']' ) != wstring::npos ); - virtual void cancel() - { - isCancelled.ref(); - } - - ~BtreeWordSearchRequest() - { - isCancelled.ref(); - hasExited.acquire(); - } -}; + wstring folded = Folding::apply( str ); -void BtreeWordSearchRunnable::run() -{ - r.run(); -} + int minMatchLength = 0; -void BtreeWordSearchRequest::run() -{ - if ( isCancelled ) + if( useWildcards ) { - finish(); - return; - } + regexp.setPattern( gd::toQString( Folding::applyDiacriticsOnly( Folding::applySimpleCaseOnly( str ) ) ) ); + regexp.setPatternSyntax( QRegExp::WildcardUnix ); + regexp.setCaseSensitivity( Qt::CaseInsensitive ); - if ( dict.ensureInitDone().size() ) + bool bNoLetters = folded.empty(); + wstring foldedWithWildcards; + + if( bNoLetters ) + foldedWithWildcards = Folding::applyWhitespaceOnly( str ); + else + foldedWithWildcards = Folding::apply( str, useWildcards ); + + // Calculate minimum match length + + bool insideSet = false; + bool escaped = false; + for( wstring::size_type x = 0; x < foldedWithWildcards.size(); x++ ) + { + wchar ch = foldedWithWildcards[ x ]; + + if( ch == L'\\' && !escaped ) + { + escaped = true; + continue; + } + + if( ch == L']' && !escaped ) + { + insideSet = false; + continue; + } + + if( insideSet ) + { + escaped = false; + continue; + } + + if( ch == L'[' && !escaped ) + { + minMatchLength += 1; + insideSet = true; + continue; + } + + if( ch == L'*' && !escaped ) + continue; + + escaped = false; + minMatchLength += 1; + } + + // Fill first match chars + + folded.clear(); + folded.reserve( foldedWithWildcards.size() ); + escaped = false; + for( wstring::size_type x = 0; x < foldedWithWildcards.size(); x++ ) + { + wchar ch = foldedWithWildcards[ x ]; + + if( escaped ) + { + if( bNoLetters || ( ch != L'*' && ch != L'?' && ch != L'[' && ch != L']' ) ) + folded.push_back( ch ); + escaped = false; + continue; + } + + if( ch == L'\\' ) + { + if( bNoLetters || folded.empty() ) + { + escaped = true; + continue; + } + else + break; + } + + if( ch == '*' || ch == '?' || ch == '[' || ch == ']' ) + break; + + folded.push_back( ch ); + } + } + else { - setErrorString( QString::fromUtf8( dict.ensureInitDone().c_str() ) ); - finish(); - return; + if( folded.empty() ) + folded = Folding::applyWhitespaceOnly( str ); } - - wstring folded = Folding::apply( str ); - if( folded.empty() ) - folded = Folding::applyWhitespaceOnly( str ); int initialFoldedSize = folded.size(); @@ -254,7 +317,9 @@ if( resultFolded.empty() ) resultFolded = Folding::applyWhitespaceOnly( chainHead ); - if ( resultFolded.size() >= folded.size() && !resultFolded.compare( 0, folded.size(), folded ) ) + if ( ( useWildcards && folded.empty() ) || + ( resultFolded.size() >= folded.size() + && !resultFolded.compare( 0, folded.size(), folded ) ) ) { // Exact or prefix match @@ -262,13 +327,30 @@ for( unsigned x = 0; x < chain.size(); ++x ) { - // Skip middle matches, if requested. If suffix variation is specified, - // make sure the string isn't larger than requested. - if ( ( allowMiddleMatches || Folding::apply( Utf8::decode( chain[ x ].prefix ) ).empty() ) && - ( maxSuffixVariation < 0 || (int)resultFolded.size() - initialFoldedSize <= maxSuffixVariation ) ) - matches.push_back( Utf8::decode( chain[ x ].prefix + chain[ x ].word ) ); + if( useWildcards ) + { + wstring word = Utf8::decode( chain[ x ].prefix + chain[ x ].word ); + wstring result = Folding::applyDiacriticsOnly( word ); + if( result.size() >= (wstring::size_type)minMatchLength + && regexp.indexIn( gd::toQString( result ) ) == 0 + && regexp.matchedLength() >= minMatchLength ) + { + addMatch( word ); + } + } + else + { + // Skip middle matches, if requested. If suffix variation is specified, + // make sure the string isn't larger than requested. + if ( ( allowMiddleMatches || Folding::apply( Utf8::decode( chain[ x ].prefix ) ).empty() ) && + ( maxSuffixVariation < 0 || (int)resultFolded.size() - initialFoldedSize <= maxSuffixVariation ) ) + addMatch( Utf8::decode( chain[ x ].prefix + chain[ x ].word ) ); + } } + if( isCancelled ) + break; + if ( matches.size() >= maxResults ) { // For now we actually allow more than maxResults if the last @@ -326,17 +408,41 @@ } catch( std::exception & e ) { - qWarning( "Index searching failed: \"%s\", error: %s\n", e.what(), - dict.getName().c_str() ); + qWarning( "Index searching failed: \"%s\", error: %s\n", + dict.getName().c_str(), e.what() ); } catch(...) { - qWarning( "Index searching failed: \"%s\"\n", dict.getName().c_str() ); + gdWarning( "Index searching failed: \"%s\"\n", dict.getName().c_str() ); + } +} + +void BtreeWordSearchRequest::run() +{ + if ( isCancelled ) + { + finish(); + return; + } + + if ( dict.ensureInitDone().size() ) + { + setErrorString( QString::fromUtf8( dict.ensureInitDone().c_str() ) ); + finish(); + return; } + findMatches(); + finish(); } +BtreeWordSearchRequest::~BtreeWordSearchRequest() +{ + isCancelled.ref(); + hasExited.acquire(); +} + sptr< Dictionary::WordSearchRequest > BtreeDictionary::prefixMatch( wstring const & str, unsigned long maxResults ) throw( std::exception ) @@ -421,6 +527,30 @@ char const * leaf = &rootNode.front(); leafEnd = leaf + rootNode.size(); + if( target.empty() ) + { + //For empty target string we return first chain in index + for( ; ; ) + { + uint32_t leafEntries = *(uint32_t *)leaf; + + if ( leafEntries == 0xffffFFFF ) + { + // A node + currentNodeOffset = *( (uint32_t *)leaf + 1 ); + readNode( currentNodeOffset, extLeaf ); + leaf = &extLeaf.front(); + leafEnd = leaf + extLeaf.size(); + nextLeaf = idxFile->read< uint32_t >(); + } + else + { + // A leaf + return leaf + sizeof( uint32_t ); + } + } + } + for( ; ; ) { // Is it a leaf or a node? @@ -709,8 +839,6 @@ vector< WordArticleLink > result; - vector< char > charBuffer; - while( chainSize ) { string str = ptr; @@ -937,7 +1065,22 @@ // Safeguard us against various bugs here. Don't attempt adding words // which are freakishly huge. if ( wordSize > maxHeadwordSize ) + { +#define MAX_LOG_WORD_SIZE 500 + string headword; + if( wordSize <= MAX_LOG_WORD_SIZE ) + headword = Utf8::encode( word ); + else + { + std::vector< char > buffer( MAX_LOG_WORD_SIZE * 4 ); + headword = string( &buffer.front(), + Utf8::encode( wordBegin, MAX_LOG_WORD_SIZE, &buffer.front() ) ); + headword += "..."; + } + gdWarning( "Skipped too long headword: \"%s\"", headword.c_str() ); return; +#undef MAX_LOG_WORD_SIZE + } // Skip any leading whitespace while( *wordBegin && Folding::isWhitespace( *wordBegin ) ) @@ -1061,7 +1204,7 @@ if ( btreeMaxElements > BtreeMaxElements ) btreeMaxElements = BtreeMaxElements; - DPRINTF( "Building a tree of %u elements\n", (unsigned) btreeMaxElements ); + GD_DPRINTF( "Building a tree of %u elements\n", (unsigned) btreeMaxElements ); uint32_t lastLeafOffset = 0; @@ -1073,4 +1216,275 @@ return IndexInfo( btreeMaxElements, rootOffset ); } +void BtreeIndex::getAllHeadwords( QSet< QString > & headwords ) +{ + if ( !idxFile ) + throw exIndexWasNotOpened(); + + findArticleLinks( NULL, NULL, &headwords ); +} + +void BtreeIndex::findAllArticleLinks( QVector< WordArticleLink > & articleLinks ) +{ + if ( !idxFile ) + throw exIndexWasNotOpened(); + + QSet< uint32_t > offsets; + + findArticleLinks( &articleLinks, &offsets, NULL ); +} + +void BtreeIndex::findArticleLinks( QVector< WordArticleLink > * articleLinks, + QSet< uint32_t > * offsets, + QSet< QString > *headwords, + QAtomicInt * isCancelled ) +{ + uint32_t currentNodeOffset = rootOffset; + uint32_t nextLeaf = 0; + uint32_t leafEntries; + + Mutex::Lock _( *idxFileMutex ); + + if ( !rootNodeLoaded ) + { + // Time to load our root node. We do it only once, at the first request. + readNode( rootOffset, rootNode ); + rootNodeLoaded = true; + } + + char const * leaf = &rootNode.front(); + char const * leafEnd = leaf + rootNode.size(); + char const * chainPtr = 0; + + vector< char > extLeaf; + + // Find first leaf + + for( ; ; ) + { + leafEntries = *(uint32_t *)leaf; + + if( isCancelled && *isCancelled ) + return; + + if ( leafEntries == 0xffffFFFF ) + { + // A node + currentNodeOffset = *( (uint32_t *)leaf + 1 ); + readNode( currentNodeOffset, extLeaf ); + leaf = &extLeaf.front(); + leafEnd = leaf + extLeaf.size(); + nextLeaf = idxFile->read< uint32_t >(); + } + else + { + // A leaf + chainPtr = leaf + sizeof( uint32_t ); + break; + } + } + + if ( !leafEntries ) + { + // Empty leaf? This may only be possible for entirely empty trees only. + if ( currentNodeOffset != rootOffset ) + throw exCorruptedChainData(); + else + return; // No match + } + + // Read all chains + + for( ; ; ) + { + vector< WordArticleLink > result = readChain( chainPtr ); + for( unsigned i = 0; i < result.size(); i++ ) + { + if( isCancelled && *isCancelled ) + return; + + if( headwords ) + headwords->insert( QString::fromUtf8( ( result[ i ].prefix + result[ i ].word ).c_str() ) ); + + if( offsets && offsets->contains( result[ i ].articleOffset ) ) + continue; + + if( offsets ) + offsets->insert( result[ i ].articleOffset ); + + if( articleLinks ) + articleLinks->push_back( WordArticleLink( result[ i ].prefix + result[ i ].word, result[ i ].articleOffset ) ); + } + + if ( chainPtr >= leafEnd ) + { + // We're past the current leaf, fetch the next one + + if ( nextLeaf ) + { + readNode( nextLeaf, extLeaf ); + leaf = &extLeaf.front(); + leafEnd = leaf + extLeaf.size(); + + nextLeaf = idxFile->read< uint32_t >(); + chainPtr = leaf + sizeof( uint32_t ); + + leafEntries = *(uint32_t *)leaf; + + if ( leafEntries == 0xffffFFFF ) + throw exCorruptedChainData(); + } + else + break; // That was the last leaf + } + } +} + +void BtreeIndex::getHeadwordsFromOffsets( QList & offsets, + QVector & headwords, + QAtomicInt * isCancelled ) +{ + uint32_t currentNodeOffset = rootOffset; + uint32_t nextLeaf = 0; + uint32_t leafEntries; + + Mutex::Lock _( *idxFileMutex ); + + if ( !rootNodeLoaded ) + { + // Time to load our root node. We do it only once, at the first request. + readNode( rootOffset, rootNode ); + rootNodeLoaded = true; + } + + char const * leaf = &rootNode.front(); + char const * leafEnd = leaf + rootNode.size(); + char const * chainPtr = 0; + + vector< char > extLeaf; + + // Find first leaf + + for( ; ; ) + { + leafEntries = *(uint32_t *)leaf; + + if( isCancelled && *isCancelled ) + return; + + if ( leafEntries == 0xffffFFFF ) + { + // A node + currentNodeOffset = *( (uint32_t *)leaf + 1 ); + readNode( currentNodeOffset, extLeaf ); + leaf = &extLeaf.front(); + leafEnd = leaf + extLeaf.size(); + nextLeaf = idxFile->read< uint32_t >(); + } + else + { + // A leaf + chainPtr = leaf + sizeof( uint32_t ); + break; + } + } + + if ( !leafEntries ) + { + // Empty leaf? This may only be possible for entirely empty trees only. + if ( currentNodeOffset != rootOffset ) + throw exCorruptedChainData(); + else + return; // No match + } + + // Read all chains + + QList< uint32_t >::Iterator begOffsets = offsets.begin(); + QList< uint32_t >::Iterator endOffsets = offsets.end(); + + for( ; ; ) + { + vector< WordArticleLink > result = readChain( chainPtr ); + + for( unsigned i = 0; i < result.size(); i++ ) + { + QList< uint32_t >::Iterator it = qBinaryFind( begOffsets, endOffsets, + result.at( i ).articleOffset ); + + if( it != offsets.end() ) + { + headwords.append( QString::fromUtf8( ( result[ i ].prefix + result[ i ].word ).c_str() ) ); + offsets.erase( it ); + begOffsets = offsets.begin(); + endOffsets = offsets.end(); + } + + if( offsets.isEmpty() ) + break; + } + + if( offsets.isEmpty() ) + break; + + if ( chainPtr >= leafEnd ) + { + // We're past the current leaf, fetch the next one + + if ( nextLeaf ) + { + readNode( nextLeaf, extLeaf ); + leaf = &extLeaf.front(); + leafEnd = leaf + extLeaf.size(); + + nextLeaf = idxFile->read< uint32_t >(); + chainPtr = leaf + sizeof( uint32_t ); + + leafEntries = *(uint32_t *)leaf; + + if ( leafEntries == 0xffffFFFF ) + throw exCorruptedChainData(); + } + else + break; // That was the last leaf + } + } +} + +bool BtreeDictionary::getHeadwords( QStringList &headwords ) +{ + QSet< QString > setOfHeadwords; + + headwords.clear(); + setOfHeadwords.reserve( getWordCount() ); + + try + { + getAllHeadwords( setOfHeadwords ); + + if( setOfHeadwords.size() ) + { +#if QT_VERSION >= 0x040700 + headwords.reserve( setOfHeadwords.size() ); +#endif + + QSet< QString >::const_iterator it = setOfHeadwords.constBegin(); + QSet< QString >::const_iterator end = setOfHeadwords.constEnd(); + + for( ; it != end; ++it ) + headwords.append( *it ); + } + } + catch( std::exception &ex ) + { + gdWarning( "Failed headwords retrieving for \"%s\", reason: %s\n", getName().c_str(), ex.what() ); + } + + return headwords.size() > 0; +} + +void BtreeDictionary::getArticleText(uint32_t, QString &, QString & ) +{ +} + } diff -Nru goldendict-1.5.0~git20131003/btreeidx.hh goldendict-1.5.0~git20150923/btreeidx.hh --- goldendict-1.5.0~git20131003/btreeidx.hh 2013-10-02 20:42:04.000000000 +0000 +++ goldendict-1.5.0~git20150923/btreeidx.hh 2015-09-23 08:26:24.000000000 +0000 @@ -10,6 +10,9 @@ #include #include #include +#include +#include +#include #ifdef _MSC_VER #include @@ -83,6 +86,23 @@ /// is performed. vector< WordArticleLink > findArticles( wstring const & ); + /// Find all unique article links in the index + void findAllArticleLinks( QVector< WordArticleLink > & articleLinks ); + + /// Retrieve all unique headwors from index + void getAllHeadwords( QSet< QString > & headwords ); + + /// Find all article links and/or headwords in the index + void findArticleLinks( QVector< WordArticleLink > * articleLinks, + QSet< uint32_t > * offsets, + QSet< QString > * headwords, + QAtomicInt * isCancelled = 0 ); + + /// Retrieve headwords for presented article adresses + void getHeadwordsFromOffsets( QList< uint32_t > & offsets, + QVector< QString > & headwords, + QAtomicInt * isCancelled = 0 ); + protected: /// Finds the offset in the btree leaf for the given word, either matching @@ -129,8 +149,6 @@ // since all searches always start with it. }; -class BtreeWordSearchRequest; - /// A base for the dictionary that utilizes a btree index build using /// buildIndex() function declared below. class BtreeDictionary: public Dictionary::Class, public BtreeIndex @@ -143,7 +161,7 @@ virtual Dictionary::Features getFeatures() const throw() { return Dictionary::SuitableForCompoundSearching; } - /// This function does the search using the btree index. Derivatives + /// This function does the search using the btree index. Derivatives usually /// need not to implement this function. virtual sptr< Dictionary::WordSearchRequest > prefixMatch( wstring const &, unsigned long ) @@ -158,7 +176,18 @@ virtual bool isLocalDictionary() { return true; } -protected: + virtual bool getHeadwords( QStringList &headwords ); + + virtual void getArticleText( uint32_t articleAddress, QString & headword, QString & text ); + + string const & ftsIndexName() const + { return ftsIdxName; } + + Mutex & getFtsMutex() + { return ftsIdxMutex; } + + virtual uint32_t getFtsIndexVersion() + { return 0; } /// Called before each matching operation to ensure that any child init /// has completed. Mainly used for deferred init. The default implementation @@ -167,7 +196,47 @@ /// successful, or a human-readable error string otherwise. virtual string const & ensureInitDone(); +protected: + Mutex ftsIdxMutex; + string ftsIdxName; + friend class BtreeWordSearchRequest; + friend class FTSResultsRequest; +}; + +class BtreeWordSearchRequest: public Dictionary::WordSearchRequest +{ + friend class BtreeWordSearchRunnable; +protected: + BtreeDictionary & dict; + wstring str; + unsigned long maxResults; + unsigned minLength; + int maxSuffixVariation; + bool allowMiddleMatches; + QAtomicInt isCancelled; + QSemaphore hasExited; + +public: + + BtreeWordSearchRequest( BtreeDictionary & dict_, + wstring const & str_, + unsigned minLength_, + int maxSuffixVariation_, + bool allowMiddleMatches_, + unsigned long maxResults_, + bool startRunnable = true ); + + virtual void findMatches(); + + void run(); // Run from another thread by BtreeWordSearchRunnable + + virtual void cancel() + { + isCancelled.ref(); + } + + ~BtreeWordSearchRequest(); }; // Everything below is for building the index data. diff -Nru goldendict-1.5.0~git20131003/config.cc goldendict-1.5.0~git20150923/config.cc --- goldendict-1.5.0~git20131003/config.cc 2013-10-02 20:48:41.000000000 +0000 +++ goldendict-1.5.0~git20150923/config.cc 2015-09-23 09:22:38.000000000 +0000 @@ -5,7 +5,7 @@ #include #include #include -#include "dprintf.hh" +#include "gddebug.hh" #ifdef _MSC_VER #include @@ -50,7 +50,7 @@ } -ProxyServer::ProxyServer(): enabled( false ), type( Socks5 ), port( 3128 ) +ProxyServer::ProxyServer(): enabled( false ), useSystemProxy( false ), type( Socks5 ), port( 3128 ) { } @@ -122,14 +122,18 @@ enableWebPlugins( false ), hideGoldenDictHeader( false ), zoomFactor( 1 ), + helpZoomFactor( 1 ), wordsZoomLevel( 0 ), maxStringsInHistory( 500 ), storeHistory( 1 ), - alwaysExpandOptionalParts( true ) + alwaysExpandOptionalParts( false ) , historyStoreInterval( 0 ) , collapseBigArticles( false ) , articleSizeLimit( 2000 ) , maxDictionaryRefsInContextMenu ( 20 ) +#ifndef Q_WS_X11 +, trackClipboardChanges( false ) +#endif { } @@ -172,8 +176,8 @@ mw.push_back( MediaWiki( "ae6f89aac7151829681b85f035d54e48", "English Wikipedia", "http://en.wikipedia.org/w", enable, "" ) ); mw.push_back( MediaWiki( "affcf9678e7bfe701c9b071f97eccba3", "English Wiktionary", "http://en.wiktionary.org/w", false, "" ) ); - mw.push_back( MediaWiki( "8e0c1c2b6821dab8bdba8eb869ca7176", "Russian Wikipedia", "http://ru.wikipedia.org/w", false, "" ) ); - mw.push_back( MediaWiki( "b09947600ae3902654f8ad4567ae8567", "Russian Wiktionary", "http://ru.wiktionary.org/w", false, "" ) ); + mw.push_back( MediaWiki( "8e0c1c2b6821dab8bdba8eb869ca7176", "Russian Wikipedia", "https://ru.wikipedia.org/w", false, "" ) ); + mw.push_back( MediaWiki( "b09947600ae3902654f8ad4567ae8567", "Russian Wiktionary", "https://ru.wiktionary.org/w", false, "" ) ); mw.push_back( MediaWiki( "a8a66331a1242ca2aeb0b4aed361c41d", "German Wikipedia", "http://de.wikipedia.org/w", false, "" ) ); mw.push_back( MediaWiki( "21c64bca5ec10ba17ff19f3066bc962a", "German Wiktionary", "http://de.wiktionary.org/w", false, "" ) ); mw.push_back( MediaWiki( "96957cb2ad73a20c7a1d561fc83c253a", "Portuguese Wikipedia", "http://pt.wikipedia.org/w", false, "" ) ); @@ -197,6 +201,13 @@ return ws; } +DictServers makeDefaultDictServers() +{ + DictServers ds; + + return ds; +} + Programs makeDefaultPrograms() { Programs programs; @@ -367,6 +378,7 @@ c.mediawikis = makeDefaultMediaWikis( true ); c.webSites = makeDefaultWebSites(); + c.dictServers = makeDefaultDictServers(); // Check if we have a template config file. If we do, load it instead @@ -398,7 +410,7 @@ // Load the config as usual if ( !dd.setContent( &configFile, false, &errorStr, &errorLine, &errorColumn ) ) { - DPRINTF( "Error: %s at %d,%d\n", errorStr.toLocal8Bit().constData(), errorLine, errorColumn ); + GD_DPRINTF( "Error: %s at %d,%d\n", errorStr.toLocal8Bit().constData(), errorLine, errorColumn ); throw exMalformedConfigFile(); } } @@ -413,7 +425,7 @@ if ( !dd.setContent( &bufferedData, false, &errorStr, &errorLine, &errorColumn ) ) { - DPRINTF( "Error: %s at %d,%d\n", errorStr.toLocal8Bit().constData(), errorLine, errorColumn ); + GD_DPRINTF( "Error: %s at %d,%d\n", errorStr.toLocal8Bit().constData(), errorLine, errorColumn ); throw exMalformedConfigFile(); } } @@ -609,6 +621,35 @@ c.webSites = makeDefaultWebSites(); } + QDomNode dss = root.namedItem( "dictservers" ); + + if ( !dss.isNull() ) + { + QDomNodeList nl = dss.toElement().elementsByTagName( "server" ); + + for( unsigned x = 0; x < nl.length(); ++x ) + { + QDomElement ds = nl.item( x ).toElement(); + + DictServer d; + + d.id = ds.attribute( "id" ); + d.name = ds.attribute( "name" ); + d.url = ds.attribute( "url" ); + d.enabled = ( ds.attribute( "enabled" ) == "1" ); + d.databases = ds.attribute( "databases" ); + d.strategies = ds.attribute( "strategies" ); + d.iconFilename = ds.attribute( "icon" ); + + c.dictServers.push_back( d ); + } + } + else + { + // Upgrading + c.dictServers = makeDefaultDictServers(); + } + QDomNode ves = root.namedItem( "voiceEngines" ); if ( !ves.isNull() ) @@ -642,6 +683,7 @@ if ( !preferences.isNull() ) { c.preferences.interfaceLanguage = preferences.namedItem( "interfaceLanguage" ).toElement().text(); + c.preferences.helpLanguage = preferences.namedItem( "helpLanguage" ).toElement().text(); c.preferences.displayStyle = preferences.namedItem( "displayStyle" ).toElement().text(); c.preferences.newTabsOpenAfterCurrentOne = ( preferences.namedItem( "newTabsOpenAfterCurrentOne" ).toElement().text() == "1" ); c.preferences.newTabsOpenInBackground = ( preferences.namedItem( "newTabsOpenInBackground" ).toElement().text() == "1" ); @@ -667,6 +709,9 @@ if ( !preferences.namedItem( "zoomFactor" ).isNull() ) c.preferences.zoomFactor = preferences.namedItem( "zoomFactor" ).toElement().text().toDouble(); + if ( !preferences.namedItem( "helpZoomFactor" ).isNull() ) + c.preferences.helpZoomFactor = preferences.namedItem( "helpZoomFactor" ).toElement().text().toDouble(); + if ( !preferences.namedItem( "wordsZoomLevel" ).isNull() ) c.preferences.wordsZoomLevel = preferences.namedItem( "wordsZoomLevel" ).toElement().text().toInt(); @@ -713,11 +758,14 @@ if ( !proxy.isNull() ) { c.preferences.proxyServer.enabled = ( proxy.toElement().attribute( "enabled" ) == "1" ); + c.preferences.proxyServer.useSystemProxy = ( proxy.toElement().attribute( "useSystemProxy" ) == "1" ); c.preferences.proxyServer.type = ( ProxyServer::Type ) proxy.namedItem( "type" ).toElement().text().toULong(); c.preferences.proxyServer.host = proxy.namedItem( "host" ).toElement().text(); c.preferences.proxyServer.port = proxy.namedItem( "port" ).toElement().text().toULong(); c.preferences.proxyServer.user = proxy.namedItem( "user" ).toElement().text(); c.preferences.proxyServer.password = proxy.namedItem( "password" ).toElement().text(); + c.preferences.proxyServer.systemProxyUser = proxy.namedItem( "systemProxyUser" ).toElement().text(); + c.preferences.proxyServer.systemProxyPassword = proxy.namedItem( "systemProxyPassword" ).toElement().text(); } if ( !preferences.namedItem( "checkForNewReleases" ).isNull() ) @@ -755,6 +803,47 @@ if ( !preferences.namedItem( "maxDictionaryRefsInContextMenu" ).isNull() ) c.preferences.maxDictionaryRefsInContextMenu = preferences.namedItem( "maxDictionaryRefsInContextMenu" ).toElement().text().toUShort(); + +#ifndef Q_WS_X11 + if ( !preferences.namedItem( "trackClipboardChanges" ).isNull() ) + c.preferences.trackClipboardChanges = ( preferences.namedItem( "trackClipboardChanges" ).toElement().text() == "1" ); +#endif + + QDomNode fts = preferences.namedItem( "fullTextSearch" ); + + if ( !fts.isNull() ) + { + if ( !fts.namedItem( "searchMode" ).isNull() ) + c.preferences.fts.searchMode = fts.namedItem( "searchMode" ).toElement().text().toInt(); + + if ( !fts.namedItem( "matchCase" ).isNull() ) + c.preferences.fts.matchCase = ( fts.namedItem( "matchCase" ).toElement().text() == "1" ); + + if ( !fts.namedItem( "maxArticlesPerDictionary" ).isNull() ) + c.preferences.fts.maxArticlesPerDictionary = fts.namedItem( "maxArticlesPerDictionary" ).toElement().text().toInt(); + + if ( !fts.namedItem( "maxDistanceBetweenWords" ).isNull() ) + c.preferences.fts.maxDistanceBetweenWords = fts.namedItem( "maxDistanceBetweenWords" ).toElement().text().toInt(); + + if ( !fts.namedItem( "useMaxArticlesPerDictionary" ).isNull() ) + c.preferences.fts.useMaxArticlesPerDictionary = ( fts.namedItem( "useMaxArticlesPerDictionary" ).toElement().text() == "1" ); + + if ( !fts.namedItem( "useMaxDistanceBetweenWords" ).isNull() ) + c.preferences.fts.useMaxDistanceBetweenWords = ( fts.namedItem( "useMaxDistanceBetweenWords" ).toElement().text() == "1" ); + + if ( !fts.namedItem( "dialogGeometry" ).isNull() ) + c.preferences.fts.dialogGeometry = QByteArray::fromBase64( fts.namedItem( "dialogGeometry" ).toElement().text().toLatin1() ); + + if( !fts.namedItem( "disabledTypes" ).isNull() ) + c.preferences.fts.disabledTypes = fts.namedItem( "disabledTypes" ).toElement().text(); + + if ( !fts.namedItem( "enabled" ).isNull() ) + c.preferences.fts.enabled = ( fts.namedItem( "enabled" ).toElement().text() == "1" ); + + if ( !fts.namedItem( "maxDictionarySize" ).isNull() ) + c.preferences.fts.maxDictionarySize = fts.namedItem( "maxDictionarySize" ).toElement().text().toUInt(); + } + } c.lastMainGroupId = root.namedItem( "lastMainGroupId" ).toElement().text().toUInt(); @@ -782,6 +871,16 @@ if ( !mainWindowGeometry.isNull() ) c.mainWindowGeometry = QByteArray::fromBase64( mainWindowGeometry.toElement().text().toLatin1() ); + QDomNode helpWindowGeometry = root.namedItem( "helpWindowGeometry" ); + + if ( !helpWindowGeometry.isNull() ) + c.helpWindowGeometry = QByteArray::fromBase64( helpWindowGeometry.toElement().text().toLatin1() ); + + QDomNode helpSplitterState = root.namedItem( "helpSplitterState" ); + + if ( !helpSplitterState.isNull() ) + c.helpSplitterState = QByteArray::fromBase64( helpSplitterState.toElement().text().toLatin1() ); + #ifdef Q_OS_WIN QDomNode maximizedMainWindowGeometry = root.namedItem( "maximizedMainWindowGeometry" ); @@ -798,6 +897,22 @@ height = maximizedMainWindowGeometry.namedItem( "height" ).toElement().text().toInt(); c.maximizedMainWindowGeometry = QRect( x, y, width, height ); } + + QDomNode normalMainWindowGeometry = root.namedItem( "normalMainWindowGeometry" ); + + if ( !normalMainWindowGeometry.isNull() ) + { + int x = 0, y = 0, width = 0, height = 0; + if( !normalMainWindowGeometry.namedItem( "x" ).isNull() ) + x = normalMainWindowGeometry.namedItem( "x" ).toElement().text().toInt(); + if( !normalMainWindowGeometry.namedItem( "y" ).isNull() ) + y = normalMainWindowGeometry.namedItem( "y" ).toElement().text().toInt(); + if( !normalMainWindowGeometry.namedItem( "width" ).isNull() ) + width = normalMainWindowGeometry.namedItem( "width" ).toElement().text().toInt(); + if( !normalMainWindowGeometry.namedItem( "height" ).isNull() ) + height = normalMainWindowGeometry.namedItem( "height" ).toElement().text().toInt(); + c.normalMainWindowGeometry = QRect( x, y, width, height ); + } #endif QDomNode dictInfoGeometry = root.namedItem( "dictInfoGeometry" ); @@ -846,6 +961,26 @@ } } + QDomNode headwordsDialog = root.namedItem( "headwordsDialog" ); + + if ( !headwordsDialog.isNull() ) + { + if ( !headwordsDialog.namedItem( "searchMode" ).isNull() ) + c.headwordsDialog.searchMode = headwordsDialog.namedItem( "searchMode" ).toElement().text().toInt(); + + if ( !headwordsDialog.namedItem( "matchCase" ).isNull() ) + c.headwordsDialog.matchCase = ( headwordsDialog.namedItem( "matchCase" ).toElement().text() == "1" ); + + if ( !headwordsDialog.namedItem( "autoApply" ).isNull() ) + c.headwordsDialog.autoApply = ( headwordsDialog.namedItem( "autoApply" ).toElement().text() == "1" ); + + if ( !headwordsDialog.namedItem( "headwordsExportPath" ).isNull() ) + c.headwordsDialog.headwordsExportPath = headwordsDialog.namedItem( "headwordsExportPath" ).toElement().text(); + + if ( !headwordsDialog.namedItem( "headwordsDialogGeometry" ).isNull() ) + c.headwordsDialog.headwordsDialogGeometry = QByteArray::fromBase64( headwordsDialog.namedItem( "headwordsDialogGeometry" ).toElement().text().toLatin1() ); + } + return c; } @@ -1176,6 +1311,45 @@ } { + QDomElement dss = dd.createElement( "dictservers" ); + root.appendChild( dss ); + + for( DictServers::const_iterator i = c.dictServers.begin(); i != c.dictServers.end(); ++i ) + { + QDomElement ds = dd.createElement( "server" ); + dss.appendChild( ds ); + + QDomAttr id = dd.createAttribute( "id" ); + id.setValue( i->id ); + ds.setAttributeNode( id ); + + QDomAttr name = dd.createAttribute( "name" ); + name.setValue( i->name ); + ds.setAttributeNode( name ); + + QDomAttr url = dd.createAttribute( "url" ); + url.setValue( i->url ); + ds.setAttributeNode( url ); + + QDomAttr enabled = dd.createAttribute( "enabled" ); + enabled.setValue( i->enabled ? "1" : "0" ); + ds.setAttributeNode( enabled ); + + QDomAttr databases = dd.createAttribute( "databases" ); + databases.setValue( i->databases ); + ds.setAttributeNode( databases ); + + QDomAttr strategies = dd.createAttribute( "strategies" ); + strategies.setValue( i->strategies ); + ds.setAttributeNode( strategies ); + + QDomAttr icon = dd.createAttribute( "icon" ); + icon.setValue( i->iconFilename ); + ds.setAttributeNode( icon ); + } + } + + { QDomElement programs = dd.createElement( "programs" ); root.appendChild( programs ); @@ -1265,6 +1439,10 @@ opt.appendChild( dd.createTextNode( c.preferences.interfaceLanguage ) ); preferences.appendChild( opt ); + opt = dd.createElement( "helpLanguage" ); + opt.appendChild( dd.createTextNode( c.preferences.helpLanguage ) ); + preferences.appendChild( opt ); + opt = dd.createElement( "displayStyle" ); opt.appendChild( dd.createTextNode( c.preferences.displayStyle ) ); preferences.appendChild( opt ); @@ -1321,6 +1499,10 @@ opt.appendChild( dd.createTextNode( QString::number( c.preferences.zoomFactor ) ) ); preferences.appendChild( opt ); + opt = dd.createElement( "helpZoomFactor" ); + opt.appendChild( dd.createTextNode( QString::number( c.preferences.helpZoomFactor ) ) ); + preferences.appendChild( opt ); + opt = dd.createElement( "wordsZoomLevel" ); opt.appendChild( dd.createTextNode( QString::number( c.preferences.wordsZoomLevel ) ) ); preferences.appendChild( opt ); @@ -1421,6 +1603,10 @@ enabled.setValue( c.preferences.proxyServer.enabled ? "1" : "0" ); proxy.setAttributeNode( enabled ); + QDomAttr useSystemProxy = dd.createAttribute( "useSystemProxy" ); + useSystemProxy.setValue( c.preferences.proxyServer.useSystemProxy ? "1" : "0" ); + proxy.setAttributeNode( useSystemProxy ); + opt = dd.createElement( "type" ); opt.appendChild( dd.createTextNode( QString::number( c.preferences.proxyServer.type ) ) ); proxy.appendChild( opt ); @@ -1440,6 +1626,14 @@ opt = dd.createElement( "password" ); opt.appendChild( dd.createTextNode( c.preferences.proxyServer.password ) ); proxy.appendChild( opt ); + + opt = dd.createElement( "systemProxyUser" ); + opt.appendChild( dd.createTextNode( c.preferences.proxyServer.systemProxyUser ) ); + proxy.appendChild( opt ); + + opt = dd.createElement( "systemProxyPassword" ); + opt.appendChild( dd.createTextNode( c.preferences.proxyServer.systemProxyPassword ) ); + proxy.appendChild( opt ); } opt = dd.createElement( "checkForNewReleases" ); @@ -1484,7 +1678,59 @@ opt = dd.createElement( "maxDictionaryRefsInContextMenu" ); opt.appendChild( dd.createTextNode( QString::number( c.preferences.maxDictionaryRefsInContextMenu ) ) ); - preferences.appendChild( opt ); } + preferences.appendChild( opt ); + +#ifndef Q_WS_X11 + opt = dd.createElement( "trackClipboardChanges" ); + opt.appendChild( dd.createTextNode( c.preferences.trackClipboardChanges ? "1" : "0" ) ); + preferences.appendChild( opt ); +#endif + { + QDomNode hd = dd.createElement( "fullTextSearch" ); + preferences.appendChild( hd ); + + QDomElement opt = dd.createElement( "searchMode" ); + opt.appendChild( dd.createTextNode( QString::number( c.preferences.fts.searchMode ) ) ); + hd.appendChild( opt ); + + opt = dd.createElement( "matchCase" ); + opt.appendChild( dd.createTextNode( c.preferences.fts.matchCase ? "1" : "0" ) ); + hd.appendChild( opt ); + + opt = dd.createElement( "maxArticlesPerDictionary" ); + opt.appendChild( dd.createTextNode( QString::number( c.preferences.fts.maxArticlesPerDictionary ) ) ); + hd.appendChild( opt ); + + opt = dd.createElement( "maxDistanceBetweenWords" ); + opt.appendChild( dd.createTextNode( QString::number( c.preferences.fts.maxDistanceBetweenWords ) ) ); + hd.appendChild( opt ); + + opt = dd.createElement( "useMaxArticlesPerDictionary" ); + opt.appendChild( dd.createTextNode( c.preferences.fts.useMaxArticlesPerDictionary ? "1" : "0" ) ); + hd.appendChild( opt ); + + opt = dd.createElement( "useMaxDistanceBetweenWords" ); + opt.appendChild( dd.createTextNode( c.preferences.fts.useMaxDistanceBetweenWords ? "1" : "0" ) ); + hd.appendChild( opt ); + + opt = dd.createElement( "dialogGeometry" ); + opt.appendChild( dd.createTextNode( QString::fromLatin1( c.preferences.fts.dialogGeometry.toBase64() ) ) ); + hd.appendChild( opt ); + + opt = dd.createElement( "disabledTypes" ); + opt.appendChild( dd.createTextNode( c.preferences.fts.disabledTypes ) ); + hd.appendChild( opt ); + + opt = dd.createElement( "enabled" ); + opt.appendChild( dd.createTextNode( c.preferences.fts.enabled ? "1" : "0" ) ); + hd.appendChild( opt ); + + opt = dd.createElement( "maxDictionarySize" ); + opt.appendChild( dd.createTextNode( QString::number( c.preferences.fts.maxDictionarySize ) ) ); + hd.appendChild( opt ); + } + + } { QDomElement opt = dd.createElement( "lastMainGroupId" ); @@ -1515,6 +1761,14 @@ opt.appendChild( dd.createTextNode( QString::fromLatin1( c.mainWindowGeometry.toBase64() ) ) ); root.appendChild( opt ); + opt = dd.createElement( "helpWindowGeometry" ); + opt.appendChild( dd.createTextNode( QString::fromLatin1( c.helpWindowGeometry.toBase64() ) ) ); + root.appendChild( opt ); + + opt = dd.createElement( "helpSplitterState" ); + opt.appendChild( dd.createTextNode( QString::fromLatin1( c.helpSplitterState.toBase64() ) ) ); + root.appendChild( opt ); + #ifdef Q_OS_WIN { QDomElement maximizedMainWindowGeometry = dd.createElement( "maximizedMainWindowGeometry" ); @@ -1535,6 +1789,25 @@ opt = dd.createElement( "height" ); opt.appendChild( dd.createTextNode( QString::number( c.maximizedMainWindowGeometry.height() ) ) ); maximizedMainWindowGeometry.appendChild( opt ); + + QDomElement normalMainWindowGeometry = dd.createElement( "normalMainWindowGeometry" ); + root.appendChild( normalMainWindowGeometry ); + + opt = dd.createElement( "x" ); + opt.appendChild( dd.createTextNode( QString::number( c.normalMainWindowGeometry.x() ) ) ); + normalMainWindowGeometry.appendChild( opt ); + + opt = dd.createElement( "y" ); + opt.appendChild( dd.createTextNode( QString::number( c.normalMainWindowGeometry.y() ) ) ); + normalMainWindowGeometry.appendChild( opt ); + + opt = dd.createElement( "width" ); + opt.appendChild( dd.createTextNode( QString::number( c.normalMainWindowGeometry.width() ) ) ); + normalMainWindowGeometry.appendChild( opt ); + + opt = dd.createElement( "height" ); + opt.appendChild( dd.createTextNode( QString::number( c.normalMainWindowGeometry.height() ) ) ); + normalMainWindowGeometry.appendChild( opt ); } #endif @@ -1596,6 +1869,31 @@ root.appendChild( opt ); } + { + QDomNode hd = dd.createElement( "headwordsDialog" ); + root.appendChild( hd ); + + QDomElement opt = dd.createElement( "searchMode" ); + opt.appendChild( dd.createTextNode( QString::number( c.headwordsDialog.searchMode ) ) ); + hd.appendChild( opt ); + + opt = dd.createElement( "matchCase" ); + opt.appendChild( dd.createTextNode( c.headwordsDialog.matchCase ? "1" : "0" ) ); + hd.appendChild( opt ); + + opt = dd.createElement( "autoApply" ); + opt.appendChild( dd.createTextNode( c.headwordsDialog.autoApply ? "1" : "0" ) ); + hd.appendChild( opt ); + + opt = dd.createElement( "headwordsExportPath" ); + opt.appendChild( dd.createTextNode( c.headwordsDialog.headwordsExportPath ) ); + hd.appendChild( opt ); + + opt = dd.createElement( "headwordsDialogGeometry" ); + opt.appendChild( dd.createTextNode( QString::fromLatin1( c.headwordsDialog.headwordsDialogGeometry.toBase64() ) ) ); + hd.appendChild( opt ); + } + QByteArray result( dd.toByteArray() ); if ( configFile.write( result ) != result.size() ) @@ -1673,6 +1971,14 @@ return QCoreApplication::applicationDirPath() + "/locale"; } +QString getHelpDir() throw() +{ + if ( QDir( getProgramDataDir() ).cd( "help" ) ) + return getProgramDataDir() + "/help"; + else + return QCoreApplication::applicationDirPath() + "/help"; +} + bool isPortableVersion() throw() { struct IsPortable diff -Nru goldendict-1.5.0~git20131003/config.hh goldendict-1.5.0~git20150923/config.hh --- goldendict-1.5.0~git20131003/config.hh 2013-08-16 09:41:47.000000000 +0000 +++ goldendict-1.5.0~git20150923/config.hh 2015-09-23 08:26:24.000000000 +0000 @@ -116,6 +116,7 @@ struct ProxyServer { bool enabled; + bool useSystemProxy; enum Type { @@ -127,6 +128,7 @@ QString host; unsigned port; QString user, password; + QString systemProxyUser, systemProxyPassword; ProxyServer(); }; @@ -146,10 +148,35 @@ QKeySequence toKeySequence() const; }; +struct FullTextSearch +{ + int searchMode; + bool matchCase; + int maxArticlesPerDictionary; + int maxDistanceBetweenWords; + bool useMaxDistanceBetweenWords; + bool useMaxArticlesPerDictionary; + bool enabled; + quint32 maxDictionarySize; + QByteArray dialogGeometry; + QString disabledTypes; + + FullTextSearch() : + searchMode( 0 ), matchCase( false ), + maxArticlesPerDictionary( 100 ), + maxDistanceBetweenWords( 2 ), + useMaxDistanceBetweenWords( true ), + useMaxArticlesPerDictionary( false ), + enabled( true ), + maxDictionarySize( 0 ) + {} +}; + /// Various user preferences struct Preferences { QString interfaceLanguage; // Empty value corresponds to system default + QString helpLanguage; // Empty value corresponds to interface language QString displayStyle; // Empty value corresponds to the default one bool newTabsOpenAfterCurrentOne; bool newTabsOpenInBackground; @@ -199,6 +226,7 @@ bool hideGoldenDictHeader; qreal zoomFactor; + qreal helpZoomFactor; int wordsZoomLevel; unsigned maxStringsInHistory; @@ -211,9 +239,14 @@ int articleSizeLimit; unsigned short maxDictionaryRefsInContextMenu; +#ifndef Q_WS_X11 + bool trackClipboardChanges; +#endif QString addonStyle; + FullTextSearch fts; + Preferences(); }; @@ -258,6 +291,34 @@ /// All the WebSites typedef QVector< WebSite > WebSites; +/// Any DICT server +struct DictServer +{ + QString id, name, url; + bool enabled; + QString databases; + QString strategies; + QString iconFilename; + + DictServer(): enabled( false ) + {} + + DictServer( QString const & id_, QString const & name_, QString const & url_, + bool enabled_, QString const & databases_, QString const & strategies_, + QString const & iconFilename_ ): + id( id_ ), name( name_ ), url( url_ ), enabled( enabled_ ), databases( databases_ ), + strategies( strategies_ ), iconFilename( iconFilename_ ) {} + + bool operator == ( DictServer const & other ) const + { return id == other.id && name == other.name && url == other.url + && enabled == other.enabled && databases == other.databases + && strategies == other.strategies + && iconFilename == other.iconFilename; } +}; + +/// All the DictServers +typedef QVector< DictServer > DictServers; + /// Hunspell configuration struct Hunspell { @@ -423,6 +484,20 @@ typedef QVector< VoiceEngine> VoiceEngines; +struct HeadwordsDialog +{ + int searchMode; + bool matchCase; + bool autoApply; + QString headwordsExportPath; + QByteArray headwordsDialogGeometry; + + HeadwordsDialog() : + searchMode( 0 ), matchCase( false ) + , autoApply( false ) + {} +}; + struct Class { Paths paths; @@ -433,6 +508,7 @@ Preferences preferences; MediaWikis mediawikis; WebSites webSites; + DictServers dictServers; Hunspell hunspell; Transliteration transliteration; Forvo forvo; @@ -446,6 +522,8 @@ QByteArray popupWindowGeometry; // Geometry saved by QMainWindow QByteArray dictInfoGeometry; // Geometry of "Dictionary info" window QByteArray inspectorGeometry; // Geometry of WebKit inspector window + QByteArray helpWindowGeometry; // Geometry of help window + QByteArray helpSplitterState; // Geometry of help splitter QString historyExportPath; // Path for export/import history QString resourceSavePath; // Path to save images/audio @@ -473,8 +551,11 @@ /// Bigger headwords won't be indexed. For now, only in DSL. unsigned int maxHeadwordSize; + HeadwordsDialog headwordsDialog; + #ifdef Q_OS_WIN QRect maximizedMainWindowGeometry; + QRect normalMainWindowGeometry; #endif QString editDictionaryCommandLine; // Command line to call external editor for dictionary @@ -561,6 +642,9 @@ /// Returns the directory storing program localizized files (.qm). QString getLocDir() throw(); +/// Returns the directory storing program help files (.qch). +QString getHelpDir() throw(); + /// Returns true if the program is configured as a portable version. In that /// mode, all the settings and indices are kept in the program's directory. bool isPortableVersion() throw(); diff -Nru goldendict-1.5.0~git20131003/CREDITS.txt goldendict-1.5.0~git20150923/CREDITS.txt --- goldendict-1.5.0~git20131003/CREDITS.txt 2013-10-02 20:42:04.000000000 +0000 +++ goldendict-1.5.0~git20150923/CREDITS.txt 2015-09-23 08:26:24.000000000 +0000 @@ -2,15 +2,15 @@ Jennie Petoumenou : Greek transliteration and Greek translation Mindaugas Baranauskas : Lithuanian translation Vit Pelcak : Czech translation -Hero Phương : Vietnamese translation +Hero Phương , Trần Đình Anh Tuấn : Vietnamese translation Daniele Di Pisa : Italian translation Daniel Kaneider: German translation Zhang Jinsong : Simplified Chinese translation -Usama Akkad : Arabic translation +Usama Akkad , Linux Arab Community Team : Arabic translation Korostil Daniel : Ukrainian translation Grzegorz Karpowicz : Polish translation Nardog : Japanese translation -Maha 吳寶原, Ray Chou 周邦信, Marcus Bingenheimer: Traditional Chinese translation +Maha 吳寶原, Ray Chou 周邦信, Marcus Bingenheimer, 黃文龍 : Traditional Chinese translation Besmir Godole : Albanian translation Leonardo Montenegro , MCHAL , Alexandro Casanova : Brazilian Portuguese translation Julian Depetris Chauvin : Interface enhancements @@ -28,3 +28,5 @@ Cris van Minnen: Dutch translation Timon Wong : MDict (*.mdx/*.mdd) dictionary format PICTT Turkmenistan: Turkmen translation +Nasrollah Noori : Persian translation +Vladimir Gerovski: Macedonian Translation diff -Nru goldendict-1.5.0~git20131003/debian/changelog goldendict-1.5.0~git20150923/debian/changelog --- goldendict-1.5.0~git20131003/debian/changelog 2015-08-10 19:41:16.000000000 +0000 +++ goldendict-1.5.0~git20150923/debian/changelog 2015-09-23 08:54:24.000000000 +0000 @@ -1,26 +1,9 @@ -goldendict (1.5.0~git20131003-1build4) wily; urgency=medium +goldendict (1.5.0~git20150923-1) unstable; urgency=medium - * No-change rebuild against libhunspell-1.3-0v5 + * New snapshot. + - Updated Homepage (debian/control), closes: #786649. - -- Steve Langasek Mon, 10 Aug 2015 19:41:16 +0000 - -goldendict (1.5.0~git20131003-1build3) utopic; urgency=medium - - * Rebuild against libav11. - - -- Colin Watson Thu, 04 Sep 2014 21:01:45 +0100 - -goldendict (1.5.0~git20131003-1build2) utopic; urgency=medium - - * No-change rebuild against libav10. - - -- Logan Rosen Sat, 31 May 2014 22:10:48 -0400 - -goldendict (1.5.0~git20131003-1build1) trusty; urgency=low - - * No change rebuild against libav 9. - - -- Dmitrijs Ledkovs Sat, 09 Nov 2013 20:37:54 +0000 + -- Dmitry E. Oboukhov Wed, 23 Sep 2015 10:27:23 +0200 goldendict (1.5.0~git20131003-1) unstable; urgency=low diff -Nru goldendict-1.5.0~git20131003/debian/control goldendict-1.5.0~git20150923/debian/control --- goldendict-1.5.0~git20131003/debian/control 2013-11-09 20:37:54.000000000 +0000 +++ goldendict-1.5.0~git20150923/debian/control 2015-09-23 09:25:35.000000000 +0000 @@ -1,10 +1,11 @@ Source: goldendict Priority: optional Section: utils -Maintainer: Ubuntu Developers -XSBC-Original-Maintainer: Dmitry E. Oboukhov -Standards-Version: 3.9.3 +Maintainer: Dmitry E. Oboukhov +Standards-Version: 3.9.6 Build-Depends: cdbs, debhelper (>= 7), + libeb16-dev, + libtiff5-dev, libao-dev, libavformat-dev, libavutil-dev, @@ -22,7 +23,7 @@ qt4-qmake, x11proto-record-dev, zlib1g-dev -Homepage: http://goldendict.berlios.de/ +Homepage: http://goldendict.org VCS-Browser: http://git.debian.org/?p=collab-maint/goldendict.git;a=summary VCS-Git: git://git.debian.org/collab-maint/goldendict.git diff -Nru goldendict-1.5.0~git20131003/debian/watch goldendict-1.5.0~git20150923/debian/watch --- goldendict-1.5.0~git20131003/debian/watch 2012-10-01 07:15:20.000000000 +0000 +++ goldendict-1.5.0~git20150923/debian/watch 1970-01-01 00:00:00.000000000 +0000 @@ -1,4 +0,0 @@ -version=3 -opts=dversionmangle=s/\+deb\d+$// \ -http://goldendict.berlios.de/download.php \ - http://prdownload.berlios.de/goldendict/goldendict-(\d+(?:\.\d+)+)-src.*?.tar.bz2 diff -Nru goldendict-1.5.0~git20131003/decompress.cc goldendict-1.5.0~git20150923/decompress.cc --- goldendict-1.5.0~git20131003/decompress.cc 2013-10-02 20:42:04.000000000 +0000 +++ goldendict-1.5.0~git20150923/decompress.cc 2015-09-23 08:26:24.000000000 +0000 @@ -82,7 +82,8 @@ #define BUFSIZE 0xFFFF -string decompressLzma2( const char * bufptr, unsigned length ) +string decompressLzma2( const char * bufptr, unsigned length, + bool raw_decoder ) { string str; lzma_ret res; @@ -92,9 +93,25 @@ strm.next_in = reinterpret_cast< const uint8_t * >( bufptr ); strm.avail_in = length; + lzma_options_lzma opt; + lzma_filter filters[ 2 ]; + + if( raw_decoder ) + { + lzma_lzma_preset(&opt, LZMA_PRESET_DEFAULT); + + filters[ 0 ].id = LZMA_FILTER_LZMA2; + filters[ 0 ].options = &opt; + filters[ 1 ].id = LZMA_VLI_UNKNOWN; + } + while( 1 ) { - res = lzma_stream_decoder( &strm, UINT64_MAX, 0 ); + if( raw_decoder ) + res = lzma_raw_decoder( &strm, filters ); + else + res = lzma_stream_decoder( &strm, UINT64_MAX, 0 ); + if( res != LZMA_OK ) break; diff -Nru goldendict-1.5.0~git20131003/decompress.hh goldendict-1.5.0~git20150923/decompress.hh --- goldendict-1.5.0~git20131003/decompress.hh 2013-10-02 20:42:04.000000000 +0000 +++ goldendict-1.5.0~git20150923/decompress.hh 2015-09-23 08:26:24.000000000 +0000 @@ -14,7 +14,8 @@ #ifdef MAKE_ZIM_SUPPORT -string decompressLzma2( const char * bufptr, unsigned length ); +string decompressLzma2( const char * bufptr, unsigned length, + bool raw_decoder = false ); #endif diff -Nru goldendict-1.5.0~git20131003/dictdfiles.cc goldendict-1.5.0~git20150923/dictdfiles.cc --- goldendict-1.5.0~git20131003/dictdfiles.cc 2013-10-02 20:42:04.000000000 +0000 +++ goldendict-1.5.0~git20150923/dictdfiles.cc 2015-09-23 08:26:24.000000000 +0000 @@ -16,7 +16,8 @@ #include #include #include -#include "dprintf.hh" +#include "gddebug.hh" +#include "ftshelpers.hh" #include @@ -45,6 +46,7 @@ DEF_EX( exFailedToReadLineFromIndex, "Failed to read line from index file", Dictionary::Ex ) DEF_EX( exMalformedIndexFileLine, "Malformed index file line encountered", Dictionary::Ex ) DEF_EX( exInvalidBase64, "Invalid base64 sequence encountered", Dictionary::Ex ) +DEF_EX_STR( exDictzipError, "DICTZIP error", Dictionary::Ex ) enum { @@ -86,6 +88,7 @@ IdxHeader idxHeader; dictData * dz; string dictionaryName; + Mutex indexFileMutex, dzMutex; public: @@ -118,6 +121,23 @@ vector< wstring > const & alts, wstring const & ) throw( std::exception ); + + virtual QString const& getDescription(); + + virtual sptr< Dictionary::DataRequest > getSearchResults( QString const & searchString, + int searchMode, bool matchCase, + int distanceBetweenWords, + int maxResults ); + void getArticleText( uint32_t articleAddress, QString & headword, QString & text ); + + virtual void makeFTSIndex(QAtomicInt & isCancelled, bool firstIteration ); + + virtual void setFTSParameters( Config::FullTextSearch const & fts ) + { + can_FTS = fts.enabled + && !fts.disabledTypes.contains( "DICTD", Qt::CaseInsensitive ) + && ( fts.maxDictionarySize == 0 || getArticleCount() <= fts.maxDictionarySize ); + } }; DictdDictionary::DictdDictionary( string const & id, @@ -138,16 +158,28 @@ // Open the .dict file - dz = dict_data_open( dictionaryFiles[ 1 ].c_str(), 0 ); + DZ_ERRORS error; + dz = dict_data_open( dictionaryFiles[ 1 ].c_str(), &error, 0 ); if ( !dz ) - throw exCantReadFile( dictionaryFiles[ 1 ] ); + throw exDictzipError( string( dz_error_str( error ) ) + + "(" + getDictionaryFilenames()[ 1 ] + ")" ); // Initialize the index openIndex( IndexInfo( idxHeader.indexBtreeMaxElements, idxHeader.indexRootOffset ), idx, idxMutex ); + + // Full-text search parameters + + can_FTS = true; + + ftsIdxName = indexFile + "_FTS"; + + if( !Dictionary::needToRebuildIndex( dictionaryFiles, ftsIdxName ) + && !FtsHelpers::ftsIndexIsOldOrBad( ftsIdxName, this ) ) + FTS_index_completed.ref(); } DictdDictionary::~DictdDictionary() @@ -248,10 +280,13 @@ // Now load that article - indexFile.seek( chain[ x ].articleOffset ); + { + Mutex::Lock _( indexFileMutex ); + indexFile.seek( chain[ x ].articleOffset ); - if ( !indexFile.gets( buf, sizeof( buf ), true ) ) - throw exFailedToReadLineFromIndex(); + if ( !indexFile.gets( buf, sizeof( buf ), true ) ) + throw exFailedToReadLineFromIndex(); + } char * tab1 = strchr( buf, '\t' ); @@ -281,7 +316,11 @@ string articleText; - char * articleBody = dict_data_read_( dz, articleOffset, articleSize, 0, 0 ); + char * articleBody; + { + Mutex::Lock _( dzMutex ); + articleBody = dict_data_read_( dz, articleOffset, articleSize, 0, 0 ); + } if ( !articleBody ) { @@ -355,6 +394,134 @@ } } +QString const& DictdDictionary::getDescription() +{ + if( !dictionaryDescription.isEmpty() ) + return dictionaryDescription; + + sptr< Dictionary::DataRequest > req = getArticle( GD_NATIVE_TO_WS( L"00databaseinfo" ), + vector< wstring >(), wstring() ); + + if( req->dataSize() > 0 ) + dictionaryDescription = Html::unescape( QString::fromUtf8( req->getFullData().data(), req->getFullData().size() ), true ); + else + dictionaryDescription = "NONE"; + + return dictionaryDescription; +} + +void DictdDictionary::makeFTSIndex( QAtomicInt & isCancelled, bool firstIteration ) +{ + if( !( Dictionary::needToRebuildIndex( getDictionaryFilenames(), ftsIdxName ) + || FtsHelpers::ftsIndexIsOldOrBad( ftsIdxName, this ) ) ) + FTS_index_completed.ref(); + + if( haveFTSIndex() ) + return; + + if( ensureInitDone().size() ) + return; + + if( firstIteration && getArticleCount() > FTS::MaxDictionarySizeForFastSearch ) + return; + + gdDebug( "DictD: Building the full-text index for dictionary: %s\n", + getName().c_str() ); + + try + { + FtsHelpers::makeFTSIndex( this, isCancelled ); + FTS_index_completed.ref(); + } + catch( std::exception &ex ) + { + gdWarning( "DictD: Failed building full-text search index for \"%s\", reason: %s\n", getName().c_str(), ex.what() ); + QFile::remove( FsEncoding::decode( ftsIdxName.c_str() ) ); + } +} + +void DictdDictionary::getArticleText( uint32_t articleAddress, QString & headword, QString & text ) +{ + try + { + char buf[ 16384 ]; + { + Mutex::Lock _( indexFileMutex ); + indexFile.seek( articleAddress ); + + if ( !indexFile.gets( buf, sizeof( buf ), true ) ) + throw exFailedToReadLineFromIndex(); + } + + char * tab1 = strchr( buf, '\t' ); + + if ( !tab1 ) + throw exMalformedIndexFileLine(); + + headword = QString::fromUtf8( buf, tab1 - buf ); + + char * tab2 = strchr( tab1 + 1, '\t' ); + + if ( !tab2 ) + throw exMalformedIndexFileLine(); + + // After tab1 should be article offset, after tab2 -- article size + + uint32_t articleOffset = decodeBase64( string( tab1 + 1, tab2 - tab1 - 1 ) ); + + char * tab3 = strchr( tab2 + 1, '\t'); + + uint32_t articleSize; + if ( tab3 ) + { + articleSize = decodeBase64( string( tab2 + 1, tab3 - tab2 - 1 ) ); + } + else + { + articleSize = decodeBase64( tab2 + 1 ); + } + + string articleText; + + char * articleBody; + { + Mutex::Lock _( dzMutex ); + articleBody = dict_data_read_( dz, articleOffset, articleSize, 0, 0 ); + } + + if ( !articleBody ) + { + articleText = dict_error_str( dz ); + } + else + { + static QRegExp phonetic( "\\\\([^\\\\]+)\\\\", Qt::CaseInsensitive ); // phonetics: \stuff\ ... + static QRegExp refs( "\\{([^\\{\\}]+)\\}", Qt::CaseInsensitive ); // links: {stuff} + + string convertedText = Html::preformat( articleBody, isToLanguageRTL() ); + free( articleBody ); + + text = QString::fromUtf8( convertedText.data(), convertedText.size() ) + .replace(phonetic, "\\1") + .replace(refs, "\\1"); + + text = Html::unescape( text ); + } + } + catch( std::exception &ex ) + { + gdWarning( "DictD: Failed retrieving article from \"%s\", reason: %s\n", getName().c_str(), ex.what() ); + } +} + +sptr< Dictionary::DataRequest > DictdDictionary::getSearchResults( QString const & searchString, + int searchMode, bool matchCase, + int distanceBetweenWords, + int maxResults ) +{ + return new FtsHelpers::FTSResultsRequest( *this, searchString,searchMode, matchCase, distanceBetweenWords, maxResults ); +} + } // anonymous namespace vector< sptr< Dictionary::Class > > makeDictionaries( @@ -400,7 +567,7 @@ // Building the index string dictionaryName = nameFromFileName( dictFiles[ 0 ] ); - qDebug( "DictD: Building the index for dictionary: %s\n", dictionaryName.c_str() ); + gdDebug( "DictD: Building the index for dictionary: %s\n", dictionaryName.c_str() ); initializing.indexingDictionary( dictionaryName ); @@ -443,7 +610,7 @@ char * tab4 = strchr( tab3 + 1, '\t'); if ( tab4 ) { - DPRINTF( "Warning: too many tabs present, skipping: %s\n", buf ); + GD_DPRINTF( "Warning: too many tabs present, skipping: %s\n", buf ); continue; } @@ -463,7 +630,9 @@ // After tab1 should be article offset, after tab2 -- article size uint32_t articleOffset = decodeBase64( string( tab1 + 1, tab2 - tab1 - 1 ) ); uint32_t articleSize = decodeBase64( tab2 + 1 ); - dictData * dz = dict_data_open( dictFiles[ 1 ].c_str(), 0 ); + + DZ_ERRORS error; + dictData * dz = dict_data_open( dictFiles[ 1 ].c_str(), &error, 0 ); if ( dz ) { @@ -480,23 +649,26 @@ if ( endEol ) *endEol = 0; - DPRINTF( "DICT NAME: '%s'\n", eol ); + GD_DPRINTF( "DICT NAME: '%s'\n", eol ); dictionaryName = eol; } } dict_data_close( dz ); } + else + throw exDictzipError( string( dz_error_str( error ) ) + + "(" + dictFiles[ 1 ] + ")" ); } } else { - DPRINTF( "Warning: only a single tab present, skipping: %s\n", buf ); + GD_DPRINTF( "Warning: only a single tab present, skipping: %s\n", buf ); continue; } } else { - DPRINTF( "Warning: no tabs present, skipping: %s\n", buf ); + GD_DPRINTF( "Warning: no tabs present, skipping: %s\n", buf ); continue; } @@ -546,8 +718,8 @@ } catch( std::exception & e ) { - qWarning( "Dictd dictionary \"%s\" reading failed, error: %s\n", - i->c_str(), e.what() ); + gdWarning( "Dictd dictionary \"%s\" reading failed, error: %s\n", + i->c_str(), e.what() ); } } diff -Nru goldendict-1.5.0~git20131003/dictheadwords.cc goldendict-1.5.0~git20150923/dictheadwords.cc --- goldendict-1.5.0~git20131003/dictheadwords.cc 1970-01-01 00:00:00.000000000 +0000 +++ goldendict-1.5.0~git20150923/dictheadwords.cc 2015-09-23 08:26:24.000000000 +0000 @@ -0,0 +1,342 @@ +/* This file is (c) 2014 Abs62 + * Part of GoldenDict. Licensed under GPLv3 or later, see the LICENSE file */ + +#include "dictheadwords.hh" +#include "gddebug.hh" +#include "mainwindow.hh" + +#include +#include +#include +#include +#include + +#define AUTO_APPLY_LIMIT 150000 + +DictHeadwords::DictHeadwords( QWidget *parent, Config::Class & cfg_, + Dictionary::Class * dict_ ) : + QDialog(parent) +, cfg( cfg_ ) +, dict( dict_ ) +, helpAction( this ) +{ + ui.setupUi( this ); + + if( cfg.headwordsDialog.headwordsDialogGeometry.size() > 0 ) + restoreGeometry( cfg.headwordsDialog.headwordsDialogGeometry ); + + bool fromMainWindow = parent->objectName() == "MainWindow"; + + if( fromMainWindow ) + setAttribute( Qt::WA_DeleteOnClose, false ); + + setWindowFlags( windowFlags() & ~Qt::WindowContextHelpButtonHint ); + + ui.searchModeCombo->addItem( tr( "Text" ), QRegExp::FixedString ); + ui.searchModeCombo->addItem( tr( "Wildcards" ), QRegExp::WildcardUnix ); + ui.searchModeCombo->addItem( tr( "RegExp" ), QRegExp::RegExp ); + ui.searchModeCombo->setCurrentIndex( cfg.headwordsDialog.searchMode ); + + ui.exportButton->setAutoDefault( false ); + ui.OKButton->setAutoDefault( false); + ui.applyButton->setAutoDefault( true ); + ui.applyButton->setDefault( true ); + + ui.matchCase->setChecked( cfg.headwordsDialog.matchCase ); + + model = new QStringListModel( this ); + model->setStringList( headers ); + + proxy = new QSortFilterProxyModel( this ); + + proxy->setSourceModel( model ); + + proxy->setSortCaseSensitivity( Qt::CaseInsensitive ); + proxy->setSortLocaleAware( true ); + proxy->setDynamicSortFilter( false ); + + ui.headersListView->setModel( proxy ); + ui.headersListView->setEditTriggers( QAbstractItemView::NoEditTriggers ); + + // very important call, for performance reasons: + ui.headersListView->setUniformItemSizes( true ); + + delegate = new WordListItemDelegate( ui.headersListView->itemDelegate() ); + if( delegate ) + ui.headersListView->setItemDelegate( delegate ); + + ui.autoApply->setChecked( cfg.headwordsDialog.autoApply ); + + connect( this, SIGNAL( finished( int ) ), this, SLOT( savePos() ) ); + + if( !fromMainWindow ) + { + ui.helpButton->hide(); + connect( this, SIGNAL( closeDialog() ), this, SLOT( accept() ) ); + } + else + { + connect( ui.helpButton, SIGNAL( clicked() ), + this, SLOT( helpRequested() ) ); + + helpAction.setShortcut( QKeySequence( "F1" ) ); + helpAction.setShortcutContext( Qt::WidgetWithChildrenShortcut ); + + connect( &helpAction, SIGNAL( triggered() ), + this, SLOT( helpRequested() ) ); + + addAction( &helpAction ); + } + + connect( ui.OKButton, SIGNAL( clicked( bool ) ), this, SLOT( okButtonClicked() ) ); + connect( ui.exportButton, SIGNAL( clicked( bool ) ), this, SLOT( exportButtonClicked() ) ); + connect( ui.applyButton, SIGNAL( clicked( bool ) ), this, SLOT( filterChanged() ) ); + + connect( ui.autoApply, SIGNAL( stateChanged( int ) ), + this, SLOT( autoApplyStateChanged( int ) ) ); + + connect( ui.filterLine, SIGNAL( textChanged( QString ) ), + this, SLOT( filterChangedInternal() ) ); + connect( ui.searchModeCombo, SIGNAL( currentIndexChanged( int ) ), + this, SLOT( filterChangedInternal() ) ); + connect( ui.matchCase, SIGNAL( stateChanged( int ) ), + this, SLOT( filterChangedInternal() ) ); + + connect( ui.headersListView, SIGNAL( clicked( QModelIndex ) ), + this, SLOT( itemClicked( QModelIndex ) ) ); + + connect( proxy, SIGNAL( dataChanged( QModelIndex, QModelIndex ) ), + this, SLOT( showHeadwordsNumber() ) ); + + ui.headersListView->installEventFilter( this ); + + setup( dict_ ); +} + +DictHeadwords::~DictHeadwords() +{ + if( delegate ) + delete delegate; +} + +void DictHeadwords::setup( Dictionary::Class *dict_ ) +{ + QApplication::setOverrideCursor( Qt::WaitCursor ); + + dict = dict_; + + setWindowTitle( QString::fromUtf8( dict->getName().c_str() ) ); + + headers.clear(); + model->setStringList( headers ); + + dict->getHeadwords( headers ); + model->setStringList( headers ); + + proxy->sort( 0 ); + filterChanged(); + + if( headers.size() > AUTO_APPLY_LIMIT ) + { + cfg.headwordsDialog.autoApply = ui.autoApply->isChecked(); + ui.autoApply->setChecked( false ); + ui.autoApply->setEnabled( false ); + } + else + { + ui.autoApply->setEnabled( true ); + ui.autoApply->setChecked( cfg.headwordsDialog.autoApply ); + } + + ui.applyButton->setEnabled( !ui.autoApply->isChecked() ); + + setWindowIcon( dict->getIcon() ); + + dictId = QString( dict->getId().c_str() ); + + QApplication::restoreOverrideCursor(); +} + +void DictHeadwords::savePos() +{ + cfg.headwordsDialog.searchMode = ui.searchModeCombo->currentIndex(); + cfg.headwordsDialog.matchCase = ui.matchCase->isChecked(); + + if( headers.size() <= AUTO_APPLY_LIMIT ) + cfg.headwordsDialog.autoApply = ui.autoApply->isChecked(); + + cfg.headwordsDialog.headwordsDialogGeometry = saveGeometry(); +} + +bool DictHeadwords::eventFilter( QObject * obj, QEvent * ev ) +{ + if( obj == ui.headersListView && ev->type() == QEvent::KeyPress ) + { + QKeyEvent * kev = static_cast< QKeyEvent * >( ev ); + if( kev->key() == Qt::Key_Return || kev->key() == Qt::Key_Enter ) + { + itemClicked( ui.headersListView->currentIndex() ); + return true; + } + } + return QDialog::eventFilter( obj, ev ); +} + +void DictHeadwords::okButtonClicked() +{ + savePos(); + closeDialog(); +} + +void DictHeadwords::reject() +{ + savePos(); + closeDialog(); +} + +void DictHeadwords::exportButtonClicked() +{ + saveHeadersToFile(); +} + +void DictHeadwords::filterChangedInternal() +{ + // emit signal in async manner, to avoid UI slowdown + if( ui.autoApply->isChecked() ) + QTimer::singleShot( 100, this, SLOT( filterChanged() ) ); +} + +void DictHeadwords::filterChanged() +{ + QRegExp::PatternSyntax syntax = + QRegExp::PatternSyntax( ui.searchModeCombo->itemData( + ui.searchModeCombo->currentIndex()).toInt() ); + + Qt::CaseSensitivity caseSensitivity = ui.matchCase->isChecked() ? Qt::CaseSensitive + : Qt::CaseInsensitive; + + QRegExp regExp( ui.filterLine->text(), caseSensitivity, syntax ); + + QApplication::setOverrideCursor( Qt::WaitCursor ); + + proxy->setFilterRegExp( regExp ); + proxy->sort( 0 ); + + QApplication::restoreOverrideCursor(); + + showHeadwordsNumber(); +} + +void DictHeadwords::itemClicked( const QModelIndex & index ) +{ + QVariant value = proxy->data( index, Qt::DisplayRole ); + if ( value.canConvert< QString >() ) + { + QString headword = value.toString(); + emit headwordSelected( headword, dictId ); + } +} + +void DictHeadwords::autoApplyStateChanged( int state ) +{ + ui.applyButton->setEnabled( state == Qt::Unchecked ); +} + +void DictHeadwords::showHeadwordsNumber() +{ + ui.headersNumber->setText( tr( "Unique headwords total: %1, filtered: %2" ) + .arg( QString::number( headers.size() ) ) + .arg( QString::number( proxy->rowCount() ) ) ); +} + +void DictHeadwords::saveHeadersToFile() +{ + QString exportPath; + if( cfg.headwordsDialog.headwordsExportPath.isEmpty() ) + exportPath = QDir::homePath(); + else + { + exportPath = QDir::fromNativeSeparators( cfg.headwordsDialog.headwordsExportPath ); + if( !QDir( exportPath ).exists() ) + exportPath = QDir::homePath(); + } + + QString fileName = QFileDialog::getSaveFileName( this, tr( "Save headwords to file" ), + exportPath, + tr( "Text files (*.txt);;All files (*.*)" ) ); + if( fileName.size() == 0) + return; + + cfg.headwordsDialog.headwordsExportPath = QDir::toNativeSeparators( + QFileInfo( fileName ).absoluteDir().absolutePath() ); + QFile file( fileName ); + + for(;;) + { + if ( !file.open( QFile::WriteOnly | QIODevice::Text ) ) + break; + + int headwordsNumber = proxy->rowCount(); + + // Setup progress dialog + int n = headwordsNumber; + int step = 1; + while( n > 1000 ) + { + step *= 10; + n /= 10; + } + + QProgressDialog progress( tr( "Export headwords..."), tr( "Cancel" ), + 0, n, this ); + progress.setWindowModality( Qt::WindowModal ); + + // Write UTF-8 BOM + QByteArray line; + line.append( 0xEF ).append( 0xBB ).append( 0xBF ); + if ( file.write( line ) != line.size() ) + break; + + // Write headwords + + int i; + for( i = 0; i < headwordsNumber; ++i ) + { + if( i % step == 0 ) + progress.setValue( i / step ); + + if( progress.wasCanceled() ) + break; + + QVariant value = proxy->data( proxy->index( i, 0 ) ); + if( !value.canConvert< QString >() ) + continue; + + line = value.toString().toUtf8(); + + line.replace( '\n', ' ' ); + line.replace( '\r', ' ' ); + + line += "\n"; + + if ( file.write( line ) != line.size() ) + break; + } + + if( i < headwordsNumber && !progress.wasCanceled() ) + break; + + file.close(); + return; + } + + gdWarning( "Headers export error: %s", file.errorString().toUtf8().data() ); + file.close(); +} + +void DictHeadwords::helpRequested() +{ + MainWindow * mainWindow = qobject_cast< MainWindow * >( parentWidget() ); + if( mainWindow ) + mainWindow->showGDHelpForID( "Dictionary headwords" ); +} diff -Nru goldendict-1.5.0~git20131003/dictheadwords.hh goldendict-1.5.0~git20150923/dictheadwords.hh --- goldendict-1.5.0~git20131003/dictheadwords.hh 1970-01-01 00:00:00.000000000 +0000 +++ goldendict-1.5.0~git20150923/dictheadwords.hh 2015-09-23 08:26:24.000000000 +0000 @@ -0,0 +1,62 @@ +#ifndef __DICTHEADWORDS_H_INCLUDED__ +#define __DICTHEADWORDS_H_INCLUDED__ + +#include +#include +#include +#include +#include +#include +#include + +#include "config.hh" +#include "ui_dictheadwords.h" +#include "dictionary.hh" +#include "delegate.hh" +#include "helpwindow.hh" + +class DictHeadwords : public QDialog +{ + Q_OBJECT + +public: + explicit DictHeadwords( QWidget * parent, Config::Class & cfg_, + Dictionary::Class * dict_ ); + virtual ~DictHeadwords(); + + void setup( Dictionary::Class * dict_ ); + +protected: + Config::Class & cfg; + Dictionary::Class * dict; + QStringList headers; + QStringListModel * model; + QSortFilterProxyModel * proxy; + WordListItemDelegate * delegate; + QString dictId; + + QAction helpAction; + + void saveHeadersToFile(); + bool eventFilter( QObject * obj, QEvent * ev ); + +private: + Ui::DictHeadwords ui; +private slots: + void savePos(); + void filterChangedInternal(); + void filterChanged(); + void exportButtonClicked(); + void okButtonClicked(); + void itemClicked( const QModelIndex & index ); + void autoApplyStateChanged( int state ); + void showHeadwordsNumber(); + virtual void reject(); + void helpRequested(); + +signals: + void headwordSelected( QString const &, QString const & ); + void closeDialog(); +}; + +#endif // __DICTHEADWORDS_H_INCLUDED__ diff -Nru goldendict-1.5.0~git20131003/dictheadwords.ui goldendict-1.5.0~git20150923/dictheadwords.ui --- goldendict-1.5.0~git20131003/dictheadwords.ui 1970-01-01 00:00:00.000000000 +0000 +++ goldendict-1.5.0~git20150923/dictheadwords.ui 2015-09-23 08:26:24.000000000 +0000 @@ -0,0 +1,151 @@ + + + DictHeadwords + + + + 0 + 0 + 458 + 550 + + + + + + + + + + + + + + + + + Search mode + + + + + + This element determines how filter string will be interpreted + + + + + + + If checked on the symbols case will be take in account when filtering + + + Match case + + + + + + + + + + Exports headwords to file + + + Export + + + false + + + + + + + Qt::Vertical + + + + 20 + 40 + + + + + + + + Help + + + false + + + + + + + OK + + + false + + + + + + + + + Press this button to apply filter to headwords list + + + Apply + + + false + + + true + + + + + + + If checked any filter changes will we immediately applied to headwords list + + + Auto apply + + + + + + + Filter: + + + + + + + Filter string (fixed string, wildcards or regular expression) + + + + + + + + + + + + + + + + + diff -Nru goldendict-1.5.0~git20131003/dictinfo.cc goldendict-1.5.0~git20150923/dictinfo.cc --- goldendict-1.5.0~git20131003/dictinfo.cc 2013-08-16 09:41:47.000000000 +0000 +++ goldendict-1.5.0~git20150923/dictinfo.cc 2015-09-23 08:26:24.000000000 +0000 @@ -28,6 +28,11 @@ ui.editDictionary->setToolTip( tr( "Edit the dictionary via command:\n%1" ).arg( cfg.editDictionaryCommandLine ) ); + if( dict->getWordCount() == 0 ) + ui.headwordsButton->setVisible( false ); + else + ui.buttonsLayout->insertSpacerItem( 0, new QSpacerItem( 40, 20, QSizePolicy::Expanding ) ); + std::vector< std::string > const & filenames = dict->getDictionaryFilenames(); QString filenamesText; @@ -46,6 +51,8 @@ ui.infoLabel->setPlainText( info ); else ui.infoLabel->clear(); + + setWindowIcon( dict->getIcon() ); } void DictInfo::savePos( int ) @@ -62,3 +69,13 @@ { done( OPEN_FOLDER ); } + +void DictInfo::on_OKButton_clicked() +{ + done( ACCEPTED ); +} + +void DictInfo::on_headwordsButton_clicked() +{ + done( SHOW_HEADWORDS ); +} diff -Nru goldendict-1.5.0~git20131003/dictinfo.hh goldendict-1.5.0~git20150923/dictinfo.hh --- goldendict-1.5.0~git20131003/dictinfo.hh 2013-08-16 09:41:47.000000000 +0000 +++ goldendict-1.5.0~git20150923/dictinfo.hh 2015-09-23 08:26:24.000000000 +0000 @@ -16,7 +16,8 @@ REJECTED, ACCEPTED, OPEN_FOLDER, - EDIT_DICTIONARY + EDIT_DICTIONARY, + SHOW_HEADWORDS }; DictInfo( Config::Class &cfg_, QWidget * parent = 0 ); @@ -29,6 +30,8 @@ void savePos( int ); void on_editDictionary_clicked(); void on_openFolder_clicked(); + void on_OKButton_clicked(); + void on_headwordsButton_clicked(); }; #endif // DICTINFO_HH diff -Nru goldendict-1.5.0~git20131003/dictinfo.ui goldendict-1.5.0~git20150923/dictinfo.ui --- goldendict-1.5.0~git20131003/dictinfo.ui 2013-08-16 09:41:47.000000000 +0000 +++ goldendict-1.5.0~git20150923/dictinfo.ui 2015-09-23 08:26:24.000000000 +0000 @@ -256,50 +256,60 @@
- - - QDialogButtonBox::Ok - - - true - - + + + + + Show all unique dictionary headwords + + + Headwords + + + false + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + OK + + + true + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + +
- - - buttonBox - accepted() - DictInfo - accept() - - - 180 - 379 - - - 25 - 791 - - - - - buttonBox - rejected() - DictInfo - reject() - - - 199 - 378 - - - 199 - 199 - - - - + diff -Nru goldendict-1.5.0~git20131003/dictionarybar.cc goldendict-1.5.0~git20150923/dictionarybar.cc --- goldendict-1.5.0~git20131003/dictionarybar.cc 2013-08-16 09:41:47.000000000 +0000 +++ goldendict-1.5.0~git20150923/dictionarybar.cc 2015-09-23 08:26:24.000000000 +0000 @@ -4,7 +4,7 @@ #include #include #include -#include "dprintf.hh" +#include "gddebug.hh" #include "fsencoding.hh" #include @@ -112,6 +112,7 @@ menu.addAction( QIcon( ":/icons/bookcase.png" ), tr( "Edit this group" ) ); QAction * infoAction = NULL; + QAction * headwordsAction = NULL; QAction * editDictAction = NULL; QAction * openDictFolderAction = NULL; QString dictFilename; @@ -136,6 +137,9 @@ if( pDict->isLocalDictionary() ) { + if( pDict->getWordCount() > 0 ) + headwordsAction = menu.addAction( tr( "Dictionary headwords" ) ); + openDictFolderAction = menu.addAction( tr( "Open dictionary folder" ) ); if( !editDictionaryCommand.isEmpty() ) @@ -189,6 +193,13 @@ return; } + if( result && result == headwordsAction ) + { + QString id = dictAction->data().toString(); + emit showDictionaryHeadwords( id ); + return; + } + if( result && result == openDictFolderAction ) { QString id = dictAction->data().toString(); diff -Nru goldendict-1.5.0~git20131003/dictionarybar.hh goldendict-1.5.0~git20150923/dictionarybar.hh --- goldendict-1.5.0~git20131003/dictionarybar.hh 2013-08-16 09:41:47.000000000 +0000 +++ goldendict-1.5.0~git20150923/dictionarybar.hh 2015-09-23 08:26:24.000000000 +0000 @@ -39,6 +39,9 @@ /// Signal for show dictionary info command from context menu void showDictionaryInfo( QString const & id ); + /// Signal for show dictionary headwords command from context menu + void showDictionaryHeadwords( QString const & id ); + /// Signal for open dictionary folder from context menu void openDictionaryFolder( QString const & id ); diff -Nru goldendict-1.5.0~git20131003/dictionary.cc goldendict-1.5.0~git20150923/dictionary.cc --- goldendict-1.5.0~git20131003/dictionary.cc 2013-08-16 09:45:56.000000000 +0000 +++ goldendict-1.5.0~git20150923/dictionary.cc 2015-09-23 08:26:24.000000000 +0000 @@ -89,6 +89,17 @@ return matches; } +void WordSearchRequest::addMatch( WordMatch const & match ) +{ + unsigned n; + for( n = 0; n < matches.size(); n++ ) + if( matches[ n ].word.compare( match.word ) == 0 ) + break; + + if( n >= matches.size() ) + matches.push_back( match ); +} + ////////////// DataRequest long DataRequest::dataSize() @@ -122,6 +133,7 @@ Class::Class( string const & id_, vector< string > const & dictionaryFiles_ ): id( id_ ), dictionaryFiles( dictionaryFiles_ ), dictionaryIconLoaded( false ) + , can_FTS( false), FTS_index_completed( false ) { } @@ -156,6 +168,11 @@ return new DataRequestInstant( false ); } +sptr< DataRequest > Class::getSearchResults(const QString &, int, bool, int, int ) +{ + return new DataRequestInstant( false ); +} + QString const& Class::getDescription() { return dictionaryDescription; @@ -426,6 +443,9 @@ { QFileInfo fileInfo( FsEncoding::decode( i->c_str() ) ); + if( fileInfo.isDir() ) + continue; + if ( !fileInfo.exists() ) return true; diff -Nru goldendict-1.5.0~git20131003/dictionary.hh goldendict-1.5.0~git20150923/dictionary.hh --- goldendict-1.5.0~git20131003/dictionary.hh 2013-08-16 09:45:56.000000000 +0000 +++ goldendict-1.5.0~git20150923/dictionary.hh 2015-09-23 08:26:24.000000000 +0000 @@ -14,6 +14,7 @@ #include "mutex.hh" #include "wstring.hh" #include "langcoder.hh" +#include "config.hh" /// Abstract dictionary-related stuff namespace Dictionary { @@ -153,6 +154,9 @@ bool isUncertain() const { return uncertain; } + /// Add match if one is not presented in matches list + void addMatch( WordMatch const & match ); + protected: // Subclasses should be filling up the 'matches' array, locking the mutex when @@ -259,6 +263,8 @@ QString dictionaryDescription; QIcon dictionaryIcon, dictionaryNativeIcon; bool dictionaryIconLoaded; + bool can_FTS; + QAtomicInt FTS_index_completed; // Load user icon if it exist // By default set icon to empty @@ -384,6 +390,12 @@ virtual sptr< DataRequest > getResource( string const & /*name*/ ) throw( std::exception ); + /// Returns a results of full-text search of given string similar getArticle(). + virtual sptr< DataRequest > getSearchResults( QString const & searchString, + int searchMode, bool matchCase, + int distanceBetweenWords, + int maxArticlesPerDictionary ); + // Return dictionary description if presented virtual QString const& getDescription(); @@ -400,6 +412,26 @@ virtual bool isLocalDictionary() { return false; } + /// Dictionary can full-text search + bool canFTS() + { return can_FTS; } + + /// Dictionary have index for full-text search + bool haveFTSIndex() + { return FTS_index_completed != 0; } + + /// Make index for full-text search + virtual void makeFTSIndex( QAtomicInt &, bool ) + {} + + /// Set full-text search parameters + virtual void setFTSParameters( Config::FullTextSearch const & ) + {} + + /// Retrieve all dictionary headwords + virtual bool getHeadwords( QStringList & ) + { return false; } + virtual ~Class() {} }; diff -Nru goldendict-1.5.0~git20131003/dictserver.cc goldendict-1.5.0~git20150923/dictserver.cc --- goldendict-1.5.0~git20131003/dictserver.cc 1970-01-01 00:00:00.000000000 +0000 +++ goldendict-1.5.0~git20150923/dictserver.cc 2015-09-23 08:26:24.000000000 +0000 @@ -0,0 +1,875 @@ +/* This file is (c) 2014 Abs62 + * Part of GoldenDict. Licensed under GPLv3 or later, see the LICENSE file */ + +#include "dictserver.hh" +#include "wstring_qt.hh" +#include +#include +#include +#include +#include "gddebug.hh" +#include "htmlescape.hh" + +namespace DictServer { + +using namespace Dictionary; + +enum { + DefaultPort = 2628 +}; + +namespace { + +#define MAX_MATCHES_COUNT 60 + +bool readLine( QTcpSocket & socket, QString & line, + QString & errorString, QAtomicInt & isCancelled ) +{ + line.clear(); + errorString.clear(); + if( socket.state() != QTcpSocket::ConnectedState ) + return false; + + for( ; ; ) + { + if( isCancelled ) + return false; + + if( socket.canReadLine() ) + { + QByteArray reply = socket.readLine(); + line = QString::fromUtf8( reply.data(), reply.size() ); + return true; + } + + if( !socket.waitForReadyRead( 2000 ) ) + { + errorString = "Data reading error: socket error " + QString::number( socket.error() ) + + ": \"" + socket.errorString() + "\""; + break; + } + } + return false; +} + +bool connectToServer( QTcpSocket & socket, QString const & url, + QString & errorString, QAtomicInt & isCancelled ) +{ + QUrl serverUrl( url ); + quint16 port = serverUrl.port( DefaultPort ); + QString reply; + + for( ; ; ) + { + if( isCancelled ) + return false; + + socket.connectToHost( serverUrl.host(), port ); + + if( socket.state() != QTcpSocket::ConnectedState ) + { + if( !socket.waitForConnected( 5000 ) ) + break; + } + + if( isCancelled ) + return false; + + if( !readLine( socket, reply, errorString, isCancelled ) ) + break; + + if( !reply.isEmpty() && reply.left( 3 ) != "220" ) + { + errorString = "Server refuse connection: " + reply; + return false; + } + + socket.write( QByteArray( "CLIENT GoldenDict\r\n") ); + if( !socket.waitForBytesWritten( 1000 ) ) + break; + + if( isCancelled ) + return false; + + if( !readLine( socket, reply, errorString, isCancelled ) ) + break; + + if( !serverUrl.userInfo().isEmpty() ) + { + QString authCommand = QString( "AUTH " ); + + int pos = serverUrl.userInfo().indexOf( QRegExp( "[:;]" ) ); + if( pos > 0 ) + authCommand += serverUrl.userInfo().left( pos ) + + " " + serverUrl.userInfo().mid( pos + 1 ); + else + authCommand += serverUrl.userInfo(); + + authCommand += "\r\n"; + + socket.write( authCommand.toUtf8() ); + + if( isCancelled ) + return false; + + if( socket.waitForBytesWritten( 1000 ) ) + break; + + if( isCancelled ) + return false; + + if( readLine( socket, reply, errorString, isCancelled ) ) + break; + + if( reply.left( 3 ) != "230" ) + { + errorString = "Authentication error: " + reply; + return false; + } + } + + return true; + } + + if( !isCancelled ) + errorString = QString( "Server connection fault, socket error %1: \"%2\"" ) + .arg( QString::number( socket.error() ) ) + .arg( socket.errorString() ); + return false; +} + +void disconnectFromServer( QTcpSocket & socket ) +{ + if( socket.state() == QTcpSocket::ConnectedState ) + socket.write( QByteArray( "QUIT\r\n" ) ); + + socket.disconnectFromHost(); +} + +class DictServerDictionary: public Dictionary::Class +{ + string name; + QString url, icon; + quint32 langId; + QString errorString; + QTcpSocket socket; + QStringList databases; + QStringList strategies; + QStringList serverDatabases; + +public: + + DictServerDictionary( string const & id, string const & name_, + QString const & url_, + QString const & database_, + QString const & strategies_, + QString const & icon_ ): + Dictionary::Class( id, vector< string >() ), + name( name_ ), + url( url_ ), + icon( icon_ ), + langId( 0 ) + { + int pos = url.indexOf( "://" ); + if( pos < 0 ) + url = "dict://" + url; + + databases = database_.split( QRegExp( "[ ,;]" ), QString::SkipEmptyParts ); + if( databases.isEmpty() ) + databases.append( "*" ); + + strategies = strategies_.split( QRegExp( "[ ,;]" ), QString::SkipEmptyParts ); + if( strategies.isEmpty() ) + strategies.append( "prefix" ); + } + + virtual string getName() throw() + { return name; } + + virtual map< Property, string > getProperties() throw() + { return map< Property, string >(); } + + virtual unsigned long getArticleCount() throw() + { return 0; } + + virtual unsigned long getWordCount() throw() + { return 0; } + + virtual sptr< WordSearchRequest > prefixMatch( wstring const &, + unsigned long maxResults ) throw( std::exception ); + + virtual sptr< DataRequest > getArticle( wstring const &, vector< wstring > const & alts, + wstring const & ) + throw( std::exception ); + + virtual quint32 getLangFrom() const + { return langId; } + + virtual quint32 getLangTo() const + { return langId; } + + virtual QString const & getDescription(); +protected: + + virtual void loadIcon() throw(); + + void getServerDatabases(); + + friend class DictServerWordSearchRequest; + friend class DictServerArticleRequest; +}; + +void DictServerDictionary::loadIcon() throw() +{ + if ( dictionaryIconLoaded ) + return; + + if( !icon.isEmpty() ) + { + QFileInfo fInfo( QDir( Config::getConfigDir() ), icon ); + if( fInfo.isFile() ) + loadIconFromFile( fInfo.absoluteFilePath(), true ); + } + if( dictionaryIcon.isNull() ) + dictionaryIcon = dictionaryNativeIcon = QIcon(":/icons/network.png"); + dictionaryIconLoaded = true; +} + +QString const & DictServerDictionary::getDescription() +{ + if( serverDatabases.isEmpty() ) + { + dictionaryDescription.clear(); + getServerDatabases(); + } + + if( dictionaryDescription.isEmpty() ) + { + dictionaryDescription = QCoreApplication::translate( "DictServer", "Url: " ) + url + "\n"; + dictionaryDescription += QCoreApplication::translate( "DictServer", "Databases: " ) + databases.join( ", " ) + "\n"; + dictionaryDescription += QCoreApplication::translate( "DictServer", "Search strategies: " ) + strategies.join( ", " ); + if( !serverDatabases.isEmpty() ) + { + dictionaryDescription += "\n\n"; + dictionaryDescription += QCoreApplication::translate( "DictServer", "Server databases" ) + + " (" + QString::number( serverDatabases.size()) + "):"; + for( QStringList::const_iterator i = serverDatabases.begin(); i != serverDatabases.end(); ++i ) + dictionaryDescription += "\n" + *i; + } + } + return dictionaryDescription; +} + +void DictServerDictionary::getServerDatabases() +{ + QAtomicInt isCancelled; + QTcpSocket * socket = new QTcpSocket; + + if( !socket ) + return; + + if( connectToServer( *socket, url, errorString, isCancelled ) ) + { + for( ; ; ) + { + QString req = QString( "SHOW DB\r\n" ); + socket->write( req.toUtf8() ); + socket->waitForBytesWritten( 1000 ); + + QString reply; + + if( !readLine( *socket, reply, errorString, isCancelled ) ) + return; + + if( reply.left( 3 ) == "110" ) + { + int countPos = reply.indexOf( ' ', 4 ); + // Get databases count + int count = reply.mid( 4, countPos > 4 ? countPos - 4 : -1 ).toInt(); + + // Read databases + for( int x = 0; x < count; x++ ) + { + if( !readLine( *socket, reply, errorString, isCancelled ) ) + break; + + if( reply[ 0 ] == '.' ) + break; + + while( reply.endsWith( '\r' ) || reply.endsWith( '\n' ) ) + reply.chop( 1 ); + + if( !reply.isEmpty() ) + serverDatabases.append( reply ); + } + + break; + } + else + { + gdWarning( "Retrieving databases from \"%s\" fault: %s\n", + getName().c_str(), reply.toUtf8().data() ); + break; + } + } + disconnectFromServer( *socket ); + } + + if( !errorString.isEmpty() ) + gdWarning( "Retrieving databases from \"%s\" fault: %s\n", + getName().c_str(), errorString.toUtf8().data() ); + delete socket; +} + +class DictServerWordSearchRequest; + +class DictServerWordSearchRequestRunnable: public QRunnable +{ + DictServerWordSearchRequest & r; + QSemaphore & hasExited; + +public: + + DictServerWordSearchRequestRunnable( DictServerWordSearchRequest & r_, + QSemaphore & hasExited_ ): r( r_ ), + hasExited( hasExited_ ) + {} + + ~DictServerWordSearchRequestRunnable() + { + hasExited.release(); + } + + virtual void run(); +}; + +class DictServerWordSearchRequest: public Dictionary::WordSearchRequest +{ + QAtomicInt isCancelled; + wstring word; + QString errorString; + QSemaphore hasExited; + DictServerDictionary & dict; + QTcpSocket * socket; + +public: + + DictServerWordSearchRequest( wstring const & word_, + DictServerDictionary & dict_ ) : + word( word_ ), + dict( dict_ ), + socket( 0 ) + { + QThreadPool::globalInstance()->start( + new DictServerWordSearchRequestRunnable( *this, hasExited ) ); + } + + void run(); + + ~DictServerWordSearchRequest() + { + hasExited.acquire(); + } + + virtual void cancel(); + +}; + +void DictServerWordSearchRequestRunnable::run() +{ + r.run(); +} + +void DictServerWordSearchRequest::run() +{ + if( isCancelled ) + { + finish(); + return; + } + + socket = new QTcpSocket; + + if( !socket ) + { + finish(); + return; + } + + if( connectToServer( *socket, dict.url, errorString, isCancelled ) ) + { + QStringList matchesList; + + for( int ns = 0; ns < dict.strategies.size(); ns++ ) + { + for( int i = 0; i < dict.databases.size(); i++ ) + { + QString matchReq = QString( "MATCH " ) + + dict.databases.at( i ) + + " " + dict.strategies.at( ns ) + + " \"" + gd::toQString( word ) + + "\"\r\n"; + socket->write( matchReq.toUtf8() ); + socket->waitForBytesWritten( 1000 ); + + if( isCancelled ) + break; + + QString reply; + + if( !readLine( *socket, reply, errorString, isCancelled ) ) + break; + + if( isCancelled ) + break; + + if( reply.left( 3 ) == "250" ) + { + // "OK" reply - matches info will be later + if( !readLine( *socket, reply, errorString, isCancelled ) ) + break; + + if( isCancelled ) + break; + } + + if( reply.left( 3 ) == "552" ) + { + // No matches + continue; + } + + if( reply[ 0 ] == '5' || reply[ 0 ] == '4' ) + { + // Database error + gdWarning( "Find matches in \"%s\", database \"%s\", strategy \"%s\" fault: %s\n", + dict.getName().c_str(), dict.databases.at( i ).toUtf8().data(), + dict.strategies.at( ns ).toUtf8().data(), reply.toUtf8().data() ); + continue; + } + + if( reply.left( 3 ) == "152" ) + { + // Matches found + int countPos = reply.indexOf( ' ', 4 ); + + // Get matches count + int count = reply.mid( 4, countPos > 4 ? countPos - 4 : -1 ).toInt(); + + // Read matches + for( int x = 0; x <= count; x++ ) + { + if( isCancelled ) + break; + + if( !readLine( *socket, reply, errorString, isCancelled ) ) + break; + + if( reply[ 0 ] == '.' ) + break; + + while( reply.endsWith( '\r' ) || reply.endsWith( '\n' ) ) + reply.chop( 1 ); + + int pos = reply.indexOf( ' ' ); + if( pos >= 0 ) + { + QString word = reply.mid( pos + 1 ); + if( word.endsWith( '\"') ) + word.chop( 1 ); + if( word[ 0 ] == '\"' ) + word = word.mid( 1 ); + + matchesList.append( word ); + } + } + if( isCancelled || !errorString.isEmpty() ) + break; + } + } + + if( isCancelled || !errorString.isEmpty() ) + break; + + matchesList.removeDuplicates(); + if( matchesList.size() >= MAX_MATCHES_COUNT ) + break; + } + + if( !isCancelled && errorString.isEmpty() ) + { + matchesList.removeDuplicates(); + + int count = matchesList.size(); + if( count > MAX_MATCHES_COUNT ) + count = MAX_MATCHES_COUNT; + + if( count ) + { + Mutex::Lock _( dataMutex ); + for( int x = 0; x < count; x++ ) + matches.push_back( gd::toWString( matchesList.at( x ) ) ); + } + } + } + + if( !errorString.isEmpty() ) + gdWarning( "Prefix find in \"%s\" fault: %s\n", dict.getName().c_str(), + errorString.toUtf8().data() ); + + if( isCancelled ) + socket->abort(); + else + disconnectFromServer( *socket ); + + delete socket; + if( !isCancelled ) + finish(); +} + +void DictServerWordSearchRequest::cancel() +{ + isCancelled.ref(); + + Mutex::Lock _( dataMutex ); + finish(); +} + +class DictServerArticleRequest; + +class DictServerArticleRequestRunnable: public QRunnable +{ + DictServerArticleRequest & r; + QSemaphore & hasExited; + +public: + + DictServerArticleRequestRunnable( DictServerArticleRequest & r_, + QSemaphore & hasExited_ ): r( r_ ), + hasExited( hasExited_ ) + {} + + ~DictServerArticleRequestRunnable() + { + hasExited.release(); + } + + virtual void run(); +}; + +class DictServerArticleRequest: public Dictionary::DataRequest +{ + QAtomicInt isCancelled; + wstring word; + QString errorString; + QSemaphore hasExited; + DictServerDictionary & dict; + QTcpSocket * socket; + +public: + + DictServerArticleRequest( wstring const & word_, + DictServerDictionary & dict_ ) : + word( word_ ), + dict( dict_ ), + socket( 0 ) + { + QThreadPool::globalInstance()->start( + new DictServerArticleRequestRunnable( *this, hasExited ) ); + } + + void run(); + + ~DictServerArticleRequest() + { + hasExited.acquire(); + } + + virtual void cancel(); + +}; + +void DictServerArticleRequestRunnable::run() +{ + r.run(); +} + +void DictServerArticleRequest::run() +{ + if( isCancelled ) + { + finish(); + return; + } + + socket = new QTcpSocket; + + if( !socket ) + { + finish(); + return; + } + + if( connectToServer( *socket, dict.url, errorString, isCancelled ) ) + { + string articleData; + + for( int i = 0; i < dict.databases.size(); i++ ) + { + QString matchReq = QString( "DEFINE " ) + + dict.databases.at( i ) + + " \"" + gd::toQString( word ) + "\"\r\n"; + socket->write( matchReq.toUtf8() ); + socket->waitForBytesWritten( 1000 ); + + QString reply; + + if( isCancelled ) + break; + + if( !readLine( *socket, reply, errorString, isCancelled ) ) + break; + + if( isCancelled ) + break; + + if( reply.left( 3 ) == "250" ) + { + // "OK" reply - matches info will be later + if( !readLine( *socket, reply, errorString, isCancelled ) ) + break; + + if( isCancelled ) + break; + } + + if( reply.left( 3 ) == "552" ) + { + // No matches found + continue; + } + + if( reply[ 0 ] == '5' || reply[ 0 ] == '4' ) + { + // Database error + gdWarning( "Articles request from \"%s\", database \"%s\" fault: %s\n", + dict.getName().c_str(), dict.databases.at( i ).toUtf8().data(), + reply.toUtf8().data() ); + continue; + } + + if( reply.left( 3 ) == "150" ) + { + // Articles found + int countPos = reply.indexOf( ' ', 4 ); + + QString articleText; + + // Get articles count + int count = reply.mid( 4, countPos > 4 ? countPos - 4 : -1 ).toInt(); + + // Read articles + for( int x = 0; x < count; x++ ) + { + if( isCancelled ) + break; + + if( !readLine( *socket, reply, errorString, isCancelled ) ) + break; + + if( reply.left( 3 ) == "250" ) + break; + + if( reply.left( 3 ) == "151" ) + { + int pos = 4; + int endPos; + + // Skip requested word + if( reply[ pos ] == '\"' ) + endPos = reply.indexOf( '\"', pos + 1 ) + 1; + else + endPos = reply.indexOf( ' ', pos ); + + if( endPos < pos ) + { + // It seems mailformed string + break; + } + + pos = endPos + 1; + + QString dbID, dbName; + + // Retrieve database ID + endPos = reply.indexOf( ' ', pos ); + + if( endPos < pos ) + { + // It seems mailformed string + break; + } + + dbID = reply.mid( pos, endPos - pos ); + + // Retrieve database ID + pos = endPos + 1; + endPos = reply.indexOf( ' ', pos ); + if( reply[ pos ] == '\"' ) + endPos = reply.indexOf( '\"', pos + 1 ) + 1; + else + endPos = reply.indexOf( ' ', pos ); + + if( endPos < pos ) + { + // It seems mailformed string + break; + } + + dbName = reply.mid( pos, endPos - pos ); + if( dbName.endsWith( '\"' ) ) + dbName.chop( 1 ); + if( dbName[ 0 ] == '\"' ) + dbName = dbName.mid( 1 ); + + articleData += string( "
From " ) + + dbName.toUtf8().data() + + " [" + dbID.toUtf8().data() + "]:" + + "
"; + + // Retrieve article text + + articleText.clear(); + for( ; ; ) + { + if( !readLine( *socket, reply, errorString, isCancelled ) ) + break; + + if( reply == ".\r\n" ) + break; + + articleText += reply; + } + + if( isCancelled || !errorString.isEmpty() ) + break; + + QRegExp phonetic( "\\\\([^\\\\]+)\\\\", Qt::CaseInsensitive ); // phonetics: \stuff\ ... + QRegExp refs( "\\{([^\\{\\}]+)\\}", Qt::CaseInsensitive ); // links: {stuff} + QRegExp links( "", Qt::CaseInsensitive ); + QRegExp tags( "<[^>]*>", Qt::CaseInsensitive ); + + string articleStr = Html::preformat( articleText.toUtf8().data() ); + articleText = QString::fromUtf8( articleStr.c_str(), articleStr.size() ) + .replace(phonetic, "\\1" ) + .replace(refs, "\\1" ); + pos = 0; + for( ; ; ) + { + pos = articleText.indexOf( links, pos ); + if( pos < 0 ) + break; + + QString link = links.cap( 1 ); + link.replace( tags, " " ); + link.replace( " ", " " ); + articleText.replace( pos + 30, links.cap( 1 ).length(), + link.simplified() ); + pos += 30; + } + + articleData += string( "
" ) + + articleText.toUtf8().data() + + "
"; + } + + if( isCancelled || !errorString.isEmpty() ) + break; + } + } + } + if( !isCancelled && errorString.isEmpty() && !articleData.empty() ) + { + Mutex::Lock _( dataMutex ); + + data.resize( articleData.size() ); + memcpy( &data.front(), articleData.data(), articleData.size() ); + + hasAnyData = true; + } + } + + if( !errorString.isEmpty() ) + gdWarning( "Articles request from \"%s\" fault: %s\n", dict.getName().c_str(), + errorString.toUtf8().data() ); + + if( isCancelled ) + socket->abort(); + else + disconnectFromServer( *socket ); + + delete socket; + if( !isCancelled ) + finish(); +} + +void DictServerArticleRequest::cancel() +{ + isCancelled.ref(); + + Mutex::Lock _( dataMutex ); + finish(); +} + +sptr< WordSearchRequest > DictServerDictionary::prefixMatch( wstring const & word, + unsigned long maxResults ) + throw( std::exception ) +{ + (void) maxResults; + if ( word.size() > 80 ) + { + // Don't make excessively large queries -- they're fruitless anyway + + return new WordSearchRequestInstant(); + } + else + return new DictServerWordSearchRequest( word, *this ); +} + +sptr< DataRequest > DictServerDictionary::getArticle( wstring const & word, + vector< wstring > const &, + wstring const & ) + throw( std::exception ) +{ + if ( word.size() > 80 ) + { + // Don't make excessively large queries -- they're fruitless anyway + + return new DataRequestInstant( false ); + } + else + return new DictServerArticleRequest( word, *this ); +} + +} // Anonimuos namespace + +vector< sptr< Dictionary::Class > > makeDictionaries( Config::DictServers const & servers ) + throw( std::exception ) +{ + vector< sptr< Dictionary::Class > > result; + + for( int x = 0; x < servers.size(); ++x ) + { + if ( servers[ x ].enabled ) + result.push_back( new DictServerDictionary( servers[ x ].id.toStdString(), + servers[ x ].name.toUtf8().data(), + servers[ x ].url, + servers[ x ].databases, + servers[ x ].strategies, + servers[ x ].iconFilename ) ); + } + + return result; +} + +} // namespace DictServer diff -Nru goldendict-1.5.0~git20131003/dictserver.hh goldendict-1.5.0~git20150923/dictserver.hh --- goldendict-1.5.0~git20131003/dictserver.hh 1970-01-01 00:00:00.000000000 +0000 +++ goldendict-1.5.0~git20150923/dictserver.hh 2015-09-23 08:26:24.000000000 +0000 @@ -0,0 +1,19 @@ +#ifndef __DICTSERVER_HH__INCLUDED__ +#define __DICTSERVER_HH__INCLUDED__ + +#include "dictionary.hh" +#include "config.hh" + +/// Support for servers supporting DICT protocol. +namespace DictServer { + +using std::vector; +using std::string; + +vector< sptr< Dictionary::Class > > makeDictionaries( + Config::DictServers const & servers ) + throw( std::exception ); + +} + +#endif // __DICTSERVER_HH__INCLUDED__ diff -Nru goldendict-1.5.0~git20131003/dictzip.c goldendict-1.5.0~git20150923/dictzip.c --- goldendict-1.5.0~git20131003/dictzip.c 2013-08-16 09:45:56.000000000 +0000 +++ goldendict-1.5.0~git20150923/dictzip.c 2015-09-23 08:26:24.000000000 +0000 @@ -257,8 +257,9 @@ # endif #endif -static int dict_read_header( const char *filename, - dictData *header, int computeCRC ) +static enum DZ_ERRORS dict_read_header( const char *filename, + dictData *header, + int computeCRC ) { FILE *str; int id1, id2, si1, si2; @@ -276,7 +277,7 @@ { err_fatal_errno( __func__, "Cannot open data file \"%s\" for read\n", filename ); - return 1; + return DZ_ERR_OPENFILE; } header->filename = NULL;//str_find( filename ); @@ -302,7 +303,7 @@ } header->crc = crc; fclose( str ); - return 0; + return DZ_NOERROR; } header->type = DICT_GZIP; @@ -334,7 +335,7 @@ "dzip header version %d not supported\n", header->version ); fclose( str ); - return 1; + return DZ_ERR_UNSUPPORTED_FORMAT; } header->chunkLength = getc( str ) << 0; @@ -344,10 +345,14 @@ if (header->chunkCount <= 0) { fclose( str ); - return 5; + return DZ_ERR_INVALID_FORMAT; } header->chunks = xmalloc( sizeof( header->chunks[0] ) * header->chunkCount ); + if( header->chunks == 0 ) { + return DZ_ERR_NOMEMORY; + } + for (i = 0; i < header->chunkCount; i++) { header->chunks[i] = getc( str ) << 0; header->chunks[i] |= getc( str ) << 8; @@ -368,7 +373,9 @@ __func__, "too long FNAME field in dzip file \"%s\"\n", filename); fclose( str ); - return 1; + if( header->chunks ) + free( header->chunks ); + return DZ_ERR_INVALID_FORMAT; } } @@ -389,7 +396,9 @@ __func__, "too long COMMENT field in dzip file \"%s\"\n", filename); fclose( str ); - return 1; + if( header->chunks ) + free( header->chunks ); + return DZ_ERR_INVALID_FORMAT; } } @@ -412,7 +421,9 @@ "File position (%lu) != header length + 1 (%d)\n", ftell( str ), header->headerLength + 1 ); fclose( str ); - return 1; + if( header->chunks ) + free( header->chunks ); + return DZ_ERR_INVALID_FORMAT; } fseek( str, -8, SEEK_END ); @@ -429,6 +440,12 @@ /* Compute offsets */ header->offsets = xmalloc( sizeof( header->offsets[0] ) * header->chunkCount ); + if( header->offsets == 0 ) { + if( header->chunks ) + free( header->chunks ); + return DZ_ERR_NOMEMORY; + } + for (offset = header->headerLength + 1, i = 0; i < header->chunkCount; i++) @@ -438,19 +455,29 @@ } fclose( str ); - return 0; + return DZ_NOERROR; } -dictData *dict_data_open( const char *filename, int computeCRC ) +dictData *dict_data_open( const char *filename, + enum DZ_ERRORS * error, + int computeCRC ) { dictData *h = NULL; // struct stat sb; int j; if (!filename) - return NULL; + { + *error = DZ_ERR_OPENFILE; + return NULL; + } h = xmalloc( sizeof( struct dictData ) ); + if( h == 0 ) + { + *error = DZ_ERR_NOMEMORY; + return 0; + } memset( h, 0, sizeof( struct dictData ) ); #ifdef __WIN32 @@ -463,7 +490,8 @@ #ifdef __WIN32 wchar_t wname[16384]; #endif - if (dict_read_header( filename, h, computeCRC )) { + *error = dict_read_header( filename, h, computeCRC ); + if ( *error != DZ_NOERROR ) { break; /* err_fatal( __func__, "\"%s\" not in text or dzip format\n", filename );*/ @@ -471,12 +499,18 @@ #ifdef __WIN32 if( MultiByteToWideChar( CP_UTF8, 0, filename, -1, wname, 16384 ) == 0 ) + { + *error = DZ_ERR_OPENFILE; break; + } h->fd = CreateFileW( wname, GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_WRITE, 0, OPEN_EXISTING, FILE_FLAG_RANDOM_ACCESS, 0); if( h->fd == INVALID_HANDLE_VALUE ) + { + *error = DZ_ERR_OPENFILE; break; + } h->size = GetFileSize( h->fd, 0 ); #else @@ -484,6 +518,7 @@ if ( !h->fd ) { + *error = DZ_ERR_OPENFILE; break; /*err_fatal_errno( __func__, "Cannot open data file \"%s\"\n", filename );*/ @@ -501,6 +536,7 @@ h->cache[j].count = 0; } + *error = DZ_NOERROR; return h; } dict_data_close( h ); @@ -563,7 +599,7 @@ buffer = xmalloc( size + 1 ); if( !buffer ) { - strcpy( h->errorString, "Cannot allocate memory" ); + strcpy( h->errorString, dz_error_str( DZ_ERR_NOMEMORY ) ); return 0; } @@ -603,7 +639,7 @@ fread( buffer, size, 1, h->fd ) != 1 ) #endif { - strcpy( h->errorString, "Cannot read file" ); + strcpy( h->errorString, dz_error_str( DZ_ERR_READFILE ) ); xfree( buffer ); return 0; } @@ -681,6 +717,12 @@ if (!h->cache[target].inBuffer) h->cache[target].inBuffer = xmalloc( h->chunkLength ); inBuffer = h->cache[target].inBuffer; + if( !inBuffer ) + { + strcpy( h->errorString, dz_error_str( DZ_ERR_NOMEMORY ) ); + xfree( buffer ); + return 0; + } if (h->chunks[i] >= OUT_BUFFER_SIZE ) { /* @@ -699,12 +741,13 @@ readed = 0; if( pos != INVALID_SET_FILE_POINTER || GetLastError() != NO_ERROR ) ReadFile( h->fd, outBuffer, h->chunks[ i ], &readed, 0 ); - if( h->chunks[ i ] != readed ) + if( h->chunks[ i ] != (int)readed ) #else if ( fseek( h->fd, h->offsets[ i ], SEEK_SET ) != 0 || fread( outBuffer, h->chunks[ i ], 1, h->fd ) != 1 ) #endif { + strcpy( h->errorString, dz_error_str( DZ_ERR_READFILE ) ); xfree( buffer ); return 0; } @@ -780,7 +823,7 @@ xfree( buffer ); return 0; } - + h->errorString[ 0 ] = 0; return buffer; } @@ -788,3 +831,18 @@ { return data->errorString; } + +const char * dz_error_str( enum DZ_ERRORS error ) +{ + switch( error ) + { + case DZ_NOERROR: return "No error"; + case DZ_ERR_OPENFILE: return "Open file error"; + case DZ_ERR_READFILE: return "Read file error"; + case DZ_ERR_INVALID_FORMAT: return "Invalid file format"; + case DZ_ERR_UNSUPPORTED_FORMAT: return "Unsupported file format"; + case DZ_ERR_NOMEMORY: return "Memory allocation error"; + case DZ_ERR_INTERNAL: return "Internal error"; + } + return "Unknown error"; +} diff -Nru goldendict-1.5.0~git20131003/dictzip.h goldendict-1.5.0~git20150923/dictzip.h --- goldendict-1.5.0~git20131003/dictzip.h 2013-08-16 09:41:47.000000000 +0000 +++ goldendict-1.5.0~git20150923/dictzip.h 2015-09-23 08:26:24.000000000 +0000 @@ -48,6 +48,16 @@ int count; } dictCache; +enum DZ_ERRORS { + DZ_NOERROR = 0, + DZ_ERR_INTERNAL, + DZ_ERR_OPENFILE, + DZ_ERR_READFILE, + DZ_ERR_UNSUPPORTED_FORMAT, + DZ_ERR_INVALID_FORMAT, + DZ_ERR_NOMEMORY +}; + typedef struct dictData { #ifdef __WIN32 HANDLE fd; /* file handle */ @@ -86,7 +96,7 @@ /* initialize .data file */ extern dictData *dict_data_open ( - const char *filename, int computeCRC); + const char *filename, enum DZ_ERRORS * error, int computeCRC); /* */ extern void dict_data_close ( dictData *data); @@ -99,6 +109,8 @@ extern char *dict_error_str( dictData *data ); +extern const char *dz_error_str( enum DZ_ERRORS error ); + extern int mmap_mode; #ifdef __cplusplus diff -Nru goldendict-1.5.0~git20131003/dprintf.hh goldendict-1.5.0~git20150923/dprintf.hh --- goldendict-1.5.0~git20131003/dprintf.hh 2012-10-01 07:15:20.000000000 +0000 +++ goldendict-1.5.0~git20150923/dprintf.hh 1970-01-01 00:00:00.000000000 +0000 @@ -1,12 +0,0 @@ -#ifndef __DPRINTF_HH_INCLUDED__ -#define __DPRINTF_HH_INCLUDED__ - -#ifdef NO_CONSOLE -#define DPRINTF(...) -#define FDPRINTF(...) -#else -#define DPRINTF(...) printf(__VA_ARGS__) -#define FDPRINTF(...) fprintf(__VA_ARGS__) -#endif - -#endif // __DPRINTF_HH_INCLUDED__ diff -Nru goldendict-1.5.0~git20131003/dsl.cc goldendict-1.5.0~git20150923/dsl.cc --- goldendict-1.5.0~git20131003/dsl.cc 2013-10-02 20:42:04.000000000 +0000 +++ goldendict-1.5.0~git20150923/dsl.cc 2015-09-23 08:26:24.000000000 +0000 @@ -17,7 +17,11 @@ #include "wstring_qt.hh" #include "zipfile.hh" #include "indexedzip.hh" -#include "dprintf.hh" +#include "gddebug.hh" +#include "tiff.hh" +#include "fulltextsearch.hh" +#include "ftshelpers.hh" +#include "language.hh" #include #include @@ -39,6 +43,9 @@ #include #include #include +#include +#include +#include // For TIFF conversion #include @@ -69,12 +76,15 @@ namespace { DEF_EX_STR( exCantReadFile, "Can't read file", Dictionary::Ex ) +DEF_EX( exUserAbort, "User abort", Dictionary::Ex ) +DEF_EX_STR( exDictzipError, "DICTZIP error", Dictionary::Ex ) enum { Signature = 0x584c5344, // DSLX on little-endian, XLSD on big-endian - CurrentFormatVersion = 19 + BtreeIndexing::FormatVersion + Folding::Version, - CurrentZipSupportVersion = 2 + CurrentFormatVersion = 21 + BtreeIndexing::FormatVersion + Folding::Version, + CurrentZipSupportVersion = 2, + CurrentFtsIndexVersion = 1 }; struct IdxHeader @@ -109,12 +119,12 @@ { uint32_t offset; uint32_t size; - wstring headword; - InsidedCard( uint32_t _offset, uint32_t _size, wstring const & word ) : - offset( _offset ), size( _size ), headword( word ) + QVector< wstring > headwords; + InsidedCard( uint32_t _offset, uint32_t _size, QVector< wstring > const & words ) : + offset( _offset ), size( _size ), headwords( words ) {} InsidedCard( InsidedCard const & e ) : - offset( e.offset ), size( e.size ), headword( e.headword ) + offset( e.offset ), size( e.size ), headwords( e.headwords ) {} InsidedCard() {} @@ -202,10 +212,31 @@ virtual sptr< Dictionary::DataRequest > getResource( string const & name ) throw( std::exception ); + virtual sptr< Dictionary::DataRequest > getSearchResults( QString const & searchString, + int searchMode, bool matchCase, + int distanceBetweenWords, + int maxResults ); virtual QString const& getDescription(); virtual QString getMainFilename(); + virtual void getArticleText( uint32_t articleAddress, QString & headword, QString & text ); + + virtual void makeFTSIndex(QAtomicInt & isCancelled, bool firstIteration ); + + virtual void setFTSParameters( Config::FullTextSearch const & fts ) + { + if( ensureInitDone().size() ) + return; + + can_FTS = fts.enabled + && !fts.disabledTypes.contains( "DSL", Qt::CaseInsensitive ) + && ( fts.maxDictionarySize == 0 || getArticleCount() <= fts.maxDictionarySize ); + } + + virtual uint32_t getFtsIndexVersion() + { return CurrentFtsIndexVersion; } + protected: virtual void loadIcon() throw(); @@ -224,7 +255,7 @@ wstring & articleText ); /// Converts DSL language to an Html. - string dslToHtml( wstring const & ); + string dslToHtml( wstring const &, wstring const & headword = wstring() ); // Parts of dslToHtml() string nodeToHtml( ArticleDom::Node const & ); @@ -235,6 +266,7 @@ friend class DslArticleRequest; friend class DslResourceRequest; + friend class DslFTSResultsRequest; friend class DslDeferredInitRunnable; }; @@ -251,6 +283,14 @@ articleNom( 0 ), maxPictureWidth( maxPictureWidth_ ) { + can_FTS = true; + + ftsIdxName = indexFile + "_FTS"; + + if( !Dictionary::needToRebuildIndex( dictionaryFiles, ftsIdxName ) + && !FtsHelpers::ftsIndexIsOldOrBad( ftsIdxName, this ) ) + FTS_index_completed.ref(); + // Read the dictionary name idx.seek( sizeof( idxHeader ) ); @@ -348,10 +388,12 @@ // Open the .dsl file - dz = dict_data_open( getDictionaryFilenames()[ 0 ].c_str(), 0 ); + DZ_ERRORS error; + dz = dict_data_open( getDictionaryFilenames()[ 0 ].c_str(), &error, 0 ); if ( !dz ) - throw exCantReadFile( getDictionaryFilenames()[ 0 ] ); + throw exDictzipError( string( dz_error_str( error ) ) + + "(" + getDictionaryFilenames()[ 0 ] + ")" ); // Read the abrv, if any @@ -365,7 +407,7 @@ memcpy( &total, abrvBlock, sizeof( uint32_t ) ); abrvBlock += sizeof( uint32_t ); - DPRINTF( "Loading %u abbrv\n", total ); + GD_DPRINTF( "Loading %u abbrv\n", total ); while( total-- ) { @@ -494,7 +536,7 @@ memcpy( &articleSize, articleProps + sizeof( articleOffset ), sizeof( articleSize ) ); - DPRINTF( "offset = %x\n", articleOffset ); + GD_DPRINTF( "offset = %x\n", articleOffset ); char * articleBody; @@ -536,6 +578,9 @@ bool hadFirstHeadword = false; bool foundDisplayedHeadword = false; + // Check is we retrieve insided card + bool insidedCard = isDslWs( articleData.at( 0 ) ); + wstring tildeValueWithUnsorted; // This one has unsorted parts left for( headwordIndex = 0; ; ) { @@ -552,89 +597,89 @@ wstring rawHeadword = wstring( articleData, begin, pos - begin ); - if ( !hadFirstHeadword ) + if( insidedCard && !rawHeadword.empty() && isDslWs( rawHeadword[ 0 ] ) ) { - // We need our tilde expansion value - tildeValue = rawHeadword; - - list< wstring > lst; + // Headword of the insided card + wstring::size_type hpos = rawHeadword.find( L'@' ); + if( hpos != string::npos ) + { + wstring head = Folding::trimWhitespace( rawHeadword.substr( hpos + 1 ) ); + hpos = head.find( L'~' ); + while( hpos != string::npos ) + { + if( hpos == 0 || head[ hpos ] != L'\\' ) + break; + hpos = head.find( L'~', hpos + 1 ); + } + if( hpos == string::npos ) + rawHeadword = head; + else + rawHeadword.clear(); + } + } - expandOptionalParts( tildeValue, &lst ); + if( !rawHeadword.empty() ) + { + if ( !hadFirstHeadword ) + { + // We need our tilde expansion value + tildeValue = rawHeadword; - if ( lst.size() ) // Should always be - tildeValue = lst.front(); + list< wstring > lst; - tildeValueWithUnsorted = tildeValue; + expandOptionalParts( tildeValue, &lst ); - processUnsortedParts( tildeValue, false ); - } + if ( lst.size() ) // Should always be + tildeValue = lst.front(); - wstring str = rawHeadword; + tildeValueWithUnsorted = tildeValue; - if ( hadFirstHeadword ) - expandTildes( str, tildeValueWithUnsorted ); + processUnsortedParts( tildeValue, false ); + } + wstring str = rawHeadword; - processUnsortedParts( str, true ); + if ( hadFirstHeadword ) + expandTildes( str, tildeValueWithUnsorted ); - str = Folding::applySimpleCaseOnly( str ); + processUnsortedParts( str, true ); - list< wstring > lst; - expandOptionalParts( str, &lst ); + str = Folding::applySimpleCaseOnly( str ); - // Does one of the results match the requested word? If so, we'd choose - // it as our headword. + list< wstring > lst; + expandOptionalParts( str, &lst ); - for( list< wstring >::iterator i = lst.begin(); i != lst.end(); ++i ) - { - unescapeDsl( *i ); - normalizeHeadword( *i ); + // Does one of the results match the requested word? If so, we'd choose + // it as our headword. - if ( Folding::trimWhitespace( *i ) == requestedHeadwordFolded ) + for( list< wstring >::iterator i = lst.begin(); i != lst.end(); ++i ) { - // Found it. Now we should make a displayed headword for it. - if ( hadFirstHeadword ) - expandTildes( rawHeadword, tildeValueWithUnsorted ); + unescapeDsl( *i ); + normalizeHeadword( *i ); - processUnsortedParts( rawHeadword, false ); + if ( Folding::trimWhitespace( *i ) == requestedHeadwordFolded ) + { + // Found it. Now we should make a displayed headword for it. + if ( hadFirstHeadword ) + expandTildes( rawHeadword, tildeValueWithUnsorted ); - displayedHeadword = rawHeadword; + processUnsortedParts( rawHeadword, false ); - foundDisplayedHeadword = true; - break; - } - } + displayedHeadword = rawHeadword; - if( !rawHeadword.empty() && isDslWs( rawHeadword[ 0 ] ) ) - { - // Headword of the insided card - // Take it from card if no '~' presented - string::size_type pos = rawHeadword.find( L'@' ); - if( pos != string::npos ) - { - wstring head = Folding::trimWhitespace( rawHeadword.substr( pos + 1 ) ); - string::size_type tildaPos = head.find( L'~' ); - while( tildaPos != string::npos ) - { - if( tildaPos == 0 || head[ tildaPos ] != L'\\' ) - break; - tildaPos = head.find( L'~', tildaPos + 1 ); - } - if( tildaPos == string::npos ) - { - processUnsortedParts( head, false ); - displayedHeadword = head; foundDisplayedHeadword = true; + break; } } - } - if ( !foundDisplayedHeadword ) - { - ++headwordIndex; - hadFirstHeadword = true; + if ( !foundDisplayedHeadword ) + { + ++headwordIndex; + hadFirstHeadword = true; + } } } + if ( pos == articleData.size() ) break; @@ -649,18 +694,40 @@ ++pos; } - if ( pos == articleData.size() || isDslWs( articleData[ pos ] ) ) + if ( pos == articleData.size() ) { - // Ok, it's either end of article, or the begining of the article's text + // Ok, it's end of article break; } + if( isDslWs( articleData[ pos ] ) ) + { + // Check for begin article text + if( insidedCard ) + { + // Check for next insided headword + wstring::size_type hpos = articleData.find_first_of( GD_NATIVE_TO_WS( L"\n\r" ), pos ); + if ( hpos == wstring::npos ) + hpos = articleData.size(); + + wstring str = wstring( articleData, pos, hpos - pos ); + + hpos = str.find( L'@'); + if( hpos == wstring::npos || str[ hpos - 1 ] == L'\\' ) + break; + } + else + break; + } } if ( !foundDisplayedHeadword ) { // This is strange. Anyway, use tilde expansion value, it's better - // than nothing. - displayedHeadword = tildeValue; + // than nothing (or requestedHeadwordFolded for insided card. + if( insidedCard ) + displayedHeadword = requestedHeadwordFolded; + else + displayedHeadword = tildeValue; } if ( pos != articleData.size() ) @@ -669,29 +736,18 @@ articleText.clear(); } -string DslDictionary::dslToHtml( wstring const & str ) +string DslDictionary::dslToHtml( wstring const & str, wstring const & headword ) { // Normalize the string wstring normalizedStr = gd::normalize( str ); - ArticleDom dom( normalizedStr ); + ArticleDom dom( normalizedStr, getName(), headword ); optionalPartNom = 0; string html = processNodeChildren( dom.root ); - // Lines seem to indicate paragraphs in Dsls, so we enclose each line within - // a

. - - for( size_t x = html.size(); x--; ) - if ( html[ x ] == '\n' ) - html.insert( x + 1, "

" ); - - return -#if 0 // Enable this to enable dsl source in html as a comment - "" -#endif - "

" + html + "

"; + return html; } string DslDictionary::processNodeChildren( ArticleDom::Node const & node ) @@ -706,10 +762,26 @@ } string DslDictionary::nodeToHtml( ArticleDom::Node const & node ) { + string result; + if ( !node.isTag ) - return Html::escape( Utf8::encode( node.text ) ); + { + result = Html::escape( Utf8::encode( node.text ) ); - string result; + // Handle all end-of-line + + string::size_type n; + + // Strip all '\r' + while( ( n = result.find( '\r' ) ) != string::npos ) + result.erase( n, 1 ); + + // Replace all '\n' + while( ( n = result.find( '\n' ) ) != string::npos ) + result.replace( n, 1, "

" ); + + return result; + } if ( node.tagName == GD_NATIVE_TO_WS( L"b" ) ) result += "" + processNodeChildren( node ) + ""; @@ -759,7 +831,7 @@ if ( node.tagName == GD_NATIVE_TO_WS( L"com" ) ) result += "" + processNodeChildren( node ) + ""; else - if ( node.tagName == GD_NATIVE_TO_WS( L"s" ) ) + if ( node.tagName == GD_NATIVE_TO_WS( L"s" ) || node.tagName == GD_NATIVE_TO_WS( L"video" ) ) { string filename = Utf8::encode( node.renderAsText() ); string n = @@ -848,6 +920,12 @@ { QImage img = QImage::fromData( (unsigned char *) &imgdata.front(), imgdata.size() ); + +#ifdef MAKE_EXTRA_TIFF_HANDLER + if( img.isNull() && Filetype::isNameOfTiff( filename ) ) + GdTiff::tiffToQImage( &imgdata.front(), imgdata.size(), img ); +#endif + resize = maxPictureWidth > 0 && img.width() > maxPictureWidth; } @@ -901,7 +979,9 @@ } else if ( node.tagName == GD_NATIVE_TO_WS( L"!trs" ) ) + { result += "" + processNodeChildren( node ) + ""; + } else if ( node.tagName == GD_NATIVE_TO_WS( L"p") ) { @@ -977,7 +1057,8 @@ } } - result += string( "" + processNodeChildren( node ) + ""; + result += string( "" + + processNodeChildren( node ) + ""; } else if ( node.tagName == GD_NATIVE_TO_WS( L"@" ) ) @@ -992,7 +1073,8 @@ normalizeHeadword( nodeStr ); url.setPath( gd::toQString( nodeStr ) ); - result += string( "" + processNodeChildren( node ) + ""; + result += string( "" + + processNodeChildren( node ) + ""; } else if ( node.tagName == GD_NATIVE_TO_WS( L"sub" ) ) @@ -1092,36 +1174,306 @@ return FsEncoding::decode( getDictionaryFilenames()[ 0 ].c_str() ); } -#if 0 -vector< wstring > StardictDictionary::findHeadwordsForSynonym( wstring const & str ) - throw( std::exception ) +void DslDictionary::makeFTSIndex( QAtomicInt & isCancelled, bool firstIteration ) { - vector< wstring > result; + if( !( Dictionary::needToRebuildIndex( getDictionaryFilenames(), ftsIdxName ) + || FtsHelpers::ftsIndexIsOldOrBad( ftsIdxName, this ) ) ) + FTS_index_completed.ref(); - vector< WordArticleLink > chain = findArticles( str ); - wstring caseFolded = Folding::applySimpleCaseOnly( str ); + if( haveFTSIndex() ) + return; + + if( ensureInitDone().size() ) + return; + + if( firstIteration && getArticleCount() > FTS::MaxDictionarySizeForFastSearch ) + return; + + gdDebug( "Dsl: Building the full-text index for dictionary: %s\n", + getName().c_str() ); + + try + { + FtsHelpers::makeFTSIndex( this, isCancelled ); + FTS_index_completed.ref(); + } + catch( std::exception &ex ) + { + gdWarning( "DSL: Failed building full-text search index for \"%s\", reason: %s\n", getName().c_str(), ex.what() ); + QFile::remove( FsEncoding::decode( ftsIdxName.c_str() ) ); + } +} + +void DslDictionary::getArticleText( uint32_t articleAddress, QString & headword, QString & text ) +{ + headword.clear(); + text.clear(); + + vector< char > chunk; + + char * articleProps; + wstring articleData; - for( unsigned x = 0; x < chain.size(); ++x ) { - string headword, articleText; + Mutex::Lock _( idxMutex ); + articleProps = chunks->getBlock( articleAddress, chunk ); + } + + uint32_t articleOffset, articleSize; - loadArticle( chain[ x ].articleOffset, - headword, articleText ); + memcpy( &articleOffset, articleProps, sizeof( articleOffset ) ); + memcpy( &articleSize, articleProps + sizeof( articleOffset ), + sizeof( articleSize ) ); - wstring headwordDecoded = Utf8::decode( headword ); + char * articleBody; - if ( caseFolded != Folding::applySimpleCaseOnly( headwordDecoded ) ) + { + Mutex::Lock _( dzMutex ); + articleBody = dict_data_read_( dz, articleOffset, articleSize, 0, 0 ); + } + + if ( !articleBody ) + { + return; + } + else + { + try + { + articleData = + DslIconv::toWstring( + DslIconv::getEncodingNameFor( DslEncoding( idxHeader.dslEncoding ) ), + articleBody, articleSize ); + free( articleBody ); + + // Strip DSL comments + bool b = false; + stripComments( articleData, b ); + } + catch( ... ) { - // The headword seems to differ from the input word, which makes the - // input word its synonym. - result.push_back( headwordDecoded ); + free( articleBody ); + return; } } - return result; + // Skip headword + + size_t pos = 0; + wstring articleHeadword; + + // Check if we retrieve insided card + bool insidedCard = isDslWs( articleData.at( 0 ) ); + + for( ; ; ) + { + size_t begin = pos; + + pos = articleData.find_first_of( GD_NATIVE_TO_WS( L"\n\r" ), begin ); + + if ( articleHeadword.empty() ) + { + // Process the headword + + articleHeadword = wstring( articleData, begin, pos - begin ); + + if( insidedCard && !articleHeadword.empty() && isDslWs( articleHeadword[ 0 ] ) ) + { + // Headword of the insided card + wstring::size_type hpos = articleHeadword.find( L'@' ); + if( hpos != string::npos ) + { + wstring head = Folding::trimWhitespace( articleHeadword.substr( hpos + 1 ) ); + hpos = head.find( L'~' ); + while( hpos != string::npos ) + { + if( hpos == 0 || head[ hpos ] != L'\\' ) + break; + hpos = head.find( L'~', hpos + 1 ); + } + if( hpos == string::npos ) + articleHeadword = head; + else + articleHeadword.clear(); + } + } + + if( !articleHeadword.empty() ) + { + list< wstring > lst; + + expandOptionalParts( articleHeadword, &lst ); + + if ( lst.size() ) // Should always be + articleHeadword = lst.front(); + + processUnsortedParts( articleHeadword, true ); + } + } + + if ( pos == articleData.size() ) + break; + + // Skip \n\r + + if ( articleData[ pos ] == '\r' ) + ++pos; + + if ( pos != articleData.size() ) + { + if ( articleData[ pos ] == '\n' ) + ++pos; + } + + if ( pos == articleData.size() ) + { + // Ok, it's end of article + break; + } + if( isDslWs( articleData[ pos ] ) ) + { + // Check for begin article text + if( insidedCard ) + { + // Check for next insided headword + wstring::size_type hpos = articleData.find_first_of( GD_NATIVE_TO_WS( L"\n\r" ), pos ); + if ( hpos == wstring::npos ) + hpos = articleData.size(); + + wstring str = wstring( articleData, pos, hpos - pos ); + + hpos = str.find( L'@'); + if( hpos == wstring::npos || str[ hpos - 1 ] == L'\\' ) + break; + } + else + break; + } + } + + if( !articleHeadword.empty() ) + { + unescapeDsl( articleHeadword ); + normalizeHeadword( articleHeadword ); + headword = gd::toQString( articleHeadword ); + } + + wstring articleText; + + if ( pos != articleData.size() ) + articleText = wstring( articleData, pos ); + else + articleText.clear(); + + if( !articleText.empty() ) + { + text = gd::toQString( articleText ).normalized( QString::NormalizationForm_C ); + + articleText.clear(); + + // Parse article text + + // Strip some areas + + const int stripTagsNumber = 5; + static QString stripTags[ stripTagsNumber ] = + { + "s", + "url", + "!trs", + "video", + "preview" + }; + static QString stripEndTags[ stripTagsNumber ] = + { + "[/s]", + "[/url]", + "[/!trs]", + "[/video]", + "[/preview]" + }; + + int pos = 0; + while( pos >= 0 ) + { + pos = text.indexOf( '[', pos, Qt::CaseInsensitive ); + if( pos >= 0 ) + { + if( ( pos > 0 && text[ pos - 1 ] == '\\' && ( pos < 2 || text[ pos - 2 ] != '\\' ) ) + || ( pos > text.size() - 2 || text[ pos + 1 ] == '/' ) ) + { + pos += 1; + continue; + } + + int pos2 = text.indexOf( ']', pos + 1, Qt::CaseInsensitive ); + if( pos2 < 0 ) + break; + + QString tag = text.mid( pos + 1, pos2 - pos - 1 ); + + int n; + for( n = 0; n < stripTagsNumber; n++ ) + { + if( tag.compare( stripTags[ n ], Qt::CaseInsensitive ) == 0 ) + { + pos2 = text.indexOf( stripEndTags[ n ] , pos + stripTags[ n ].size() + 2, Qt::CaseInsensitive ); + text.remove( pos, pos2 > 0 ? pos2 - pos + stripEndTags[ n ].length() : text.length() - pos ); + break; + } + } + + if( n >= stripTagsNumber ) + pos += 1; + } + } + + // Strip tags + + text.remove( QRegExp( "\\[[^\\\\\\[\\]]+\\]", Qt::CaseInsensitive ) ); + + // Chech for insided cards + + bool haveInsidedCards = false; + pos = 0; + while( pos >= 0 ) + { + pos = text.indexOf( "@", pos ); + if( pos > 0 && text.at( pos - 1 ) != '\\' ) + { + haveInsidedCards = true; + break; + } + + if( pos >= 0 ) + pos += 1; + } + + if( haveInsidedCards ) + { + // Use base DSL parser for articles with insided cards + ArticleDom dom( gd::toWString( text ), getName(), articleHeadword ); + text = gd::toQString( dom.root.renderAsText( true ) ); + } + else + { + // Unescape DSL symbols + pos = 0; + while( pos >= 0 ) + { + pos = text.indexOf( '\\', pos ); + if( pos >= 0 ) + { + if( text[ pos + 1 ] == '\\' ) + pos += 1; + + text.remove( pos, 1 ); + } + } + } + } } -#endif /// DslDictionary::getArticle() @@ -1258,16 +1610,16 @@ articleText += "
"; if( articleText.compare( articleText.size() - 4, 4, "

" ) == 0 ) articleText.insert( articleText.size() - 4, " " + button ); @@ -1297,7 +1649,7 @@ } catch( std::exception &ex ) { - qWarning( "DSL: Failed loading article from \"%s\", reason: %s\n", dict.getName().c_str(), ex.what() ); + gdWarning( "DSL: Failed loading article from \"%s\", reason: %s\n", dict.getName().c_str(), ex.what() ); articleText = string( "" ) + string( QObject::tr( "Article loading error" ).toUtf8().constData() ) + ""; @@ -1410,7 +1762,7 @@ FsEncoding::separator() + FsEncoding::encode( resourceName ); - DPRINTF( "n is %s\n", n.c_str() ); + GD_DPRINTF( "n is %s\n", n.c_str() ); try { @@ -1459,6 +1811,11 @@ QImage img = QImage::fromData( (unsigned char *) &data.front(), data.size() ); +#ifdef MAKE_EXTRA_TIFF_HANDLER + if( img.isNull() ) + GdTiff::tiffToQImage( &data.front(), data.size(), img ); +#endif + dataMutex.unlock(); if ( !img.isNull() ) @@ -1484,8 +1841,8 @@ } catch( std::exception &ex ) { - qWarning( "DSL: Failed loading resource \"%s\" for \"%s\", reason: %s\n", - resourceName.c_str(), dict.getName().c_str(), ex.what() ); + gdWarning( "DSL: Failed loading resource \"%s\" for \"%s\", reason: %s\n", + resourceName.c_str(), dict.getName().c_str(), ex.what() ); // Resource not loaded -- we don't set the hasAnyData flag then } @@ -1498,8 +1855,6 @@ return new DslResourceRequest( *this, name ); } -} // anonymous namespace - #if 0 static void findCorrespondingFiles( string const & ifo, string & idx, string & dict, string & syn, @@ -1537,6 +1892,18 @@ } #endif +sptr< Dictionary::DataRequest > DslDictionary::getSearchResults( QString const & searchString, + int searchMode, bool matchCase, + int distanceBetweenWords, + int maxResults ) +{ + return new FtsHelpers::FTSResultsRequest( *this, searchString,searchMode, matchCase, distanceBetweenWords, maxResults ); +} + +} // anonymous namespace + +/// makeDictionaries + vector< sptr< Dictionary::Class > > makeDictionaries( vector< string > const & fileNames, string const & indicesDir, @@ -1615,8 +1982,8 @@ // Building the index initializing.indexingDictionary( Utf8::encode( scanner.getDictionaryName() ) ); - qDebug() << "Dsl: Building the index for dictionary:" - << gd::toQString( scanner.getDictionaryName() ); + gdDebug( "Dsl: Building the index for dictionary: %s\n", + gd::toQString( scanner.getDictionaryName() ).toUtf8().data() ); File::Class idx( indexFile, "wb" ); @@ -1677,7 +2044,7 @@ if ( !abrvScanner.readNextLineWithoutComments( curString, curOffset ) || curString.empty() ) { - qWarning( "Warning: premature end of file %s\n", abrvFileName.c_str() ); + gdWarning( "Warning: premature end of file %s\n", abrvFileName.c_str() ); eof = true; break; } @@ -1729,8 +2096,8 @@ } catch( std::exception & e ) { - qWarning( "Error reading abrv file \"%s\", error: %s. Skipping it.\n", - abrvFileName.c_str(), e.what() ); + gdWarning( "Error reading abrv file \"%s\", error: %s. Skipping it.\n", + abrvFileName.c_str(), e.what() ); } } @@ -1763,7 +2130,7 @@ { if ( !isDslWs( curString[ x ] ) ) { - qWarning( "Warning: garbage string in %s at offset 0x%lX\n", i->c_str(), (unsigned long) curOffset ); + gdWarning( "Warning: garbage string in %s at offset 0x%lX\n", i->c_str(), (unsigned long) curOffset ); break; } } @@ -1787,7 +2154,7 @@ { if ( ! ( hasString = scanner.readNextLineWithoutComments( curString, curOffset ) ) ) { - qWarning( "Warning: premature end of file %s\n", i->c_str() ); + gdWarning( "Warning: premature end of file %s\n", i->c_str() ); break; } @@ -1831,6 +2198,8 @@ wstring headword; QVector< InsidedCard > insidedCards; uint32_t offset = curOffset; + QVector< wstring > insidedHeadwords; + unsigned linesInsideCard = 0; // Skip the article's body for( ; ; ) @@ -1840,7 +2209,7 @@ || ( curString.size() && !isDslWs( curString[ 0 ] ) ) ) { if( insideInsided ) - insidedCards.append( InsidedCard( offset, curOffset - offset, headword ) ); + insidedCards.append( InsidedCard( offset, curOffset - offset, insidedHeadwords ) ); break; } @@ -1848,20 +2217,39 @@ wstring::size_type n = curString.find( L'@' ); if( n == wstring::npos || curString[ n - 1 ] == L'\\' ) + { + if( insideInsided ) + linesInsideCard++; + continue; + } // Handle embedded card if( insideInsided ) - insidedCards.append( InsidedCard( offset, curOffset - offset, headword ) ); + { + if( linesInsideCard ) + { + insidedCards.append( InsidedCard( offset, curOffset - offset, insidedHeadwords ) ); + + insidedHeadwords.clear(); + linesInsideCard = 0; + offset = curOffset; + } + } + else + { + offset = curOffset; + linesInsideCard = 0; + } - offset = curOffset; headword = Folding::trimWhitespace( curString.substr( n + 1 ) ); if( !headword.empty() ) { processUnsortedParts( headword, true ); expandTildes( headword, allEntryWords.front() ); + insidedHeadwords.append( headword ); insideInsided = true; } else @@ -1882,19 +2270,22 @@ chunks.addToBlock( &(*i).offset, sizeof( (*i).offset ) ); chunks.addToBlock( &(*i).size, sizeof( (*i).size ) ); - allEntryWords.clear(); - expandOptionalParts( (*i).headword, &allEntryWords ); - - for( list< wstring >::iterator j = allEntryWords.begin(); - j != allEntryWords.end(); ++j ) + for( int x = 0; x < (*i).headwords.size(); x++ ) { - unescapeDsl( *j ); - normalizeHeadword( *j ); - indexedWords.addWord( *j, descOffset, maxHeadwordSize ); - } + allEntryWords.clear(); + expandOptionalParts( (*i).headwords[ x ], &allEntryWords ); + for( list< wstring >::iterator j = allEntryWords.begin(); + j != allEntryWords.end(); ++j ) + { + unescapeDsl( *j ); + normalizeHeadword( *j ); + indexedWords.addWord( *j, descOffset, maxHeadwordSize ); + } + + wordCount += allEntryWords.size(); + } ++articleCount; - wordCount += allEntryWords.size(); } if ( !hasString ) @@ -1918,7 +2309,7 @@ if ( zipFileName.size() ) { - DPRINTF( "Indexing zip file\n" ); + GD_DPRINTF( "Indexing zip file\n" ); idxHeader.hasZipFile = 1; @@ -1980,8 +2371,8 @@ } catch( std::exception & e ) { - qWarning( "DSL dictionary reading failed: %s:%u, error: %s\n", - i->c_str(), atLine, e.what() ); + gdWarning( "DSL dictionary reading failed: %s:%u, error: %s\n", + i->c_str(), atLine, e.what() ); } } diff -Nru goldendict-1.5.0~git20131003/dsl_details.cc goldendict-1.5.0~git20150923/dsl_details.cc --- goldendict-1.5.0~git20131003/dsl_details.cc 2013-08-16 09:45:56.000000000 +0000 +++ goldendict-1.5.0~git20150923/dsl_details.cc 2015-09-23 08:26:24.000000000 +0000 @@ -5,9 +5,10 @@ #include "folding.hh" #include "langcoder.hh" -#include "dprintf.hh" +#include "gddebug.hh" #include "ufile.hh" #include "wstring_qt.hh" +#include "utf8.hh" #include #include @@ -41,7 +42,7 @@ /////////////// ArticleDom -wstring ArticleDom::Node::renderAsText() const +wstring ArticleDom::Node::renderAsText( bool stripTrsTag ) const { if ( !isTag ) return text; @@ -49,7 +50,8 @@ wstring result; for( list< Node >::const_iterator i = begin(); i != end(); ++i ) - result += i->renderAsText(); + if( !stripTrsTag || i->tagName != GD_NATIVE_TO_WS( L"!trs" ) ) + result += i->renderAsText( stripTrsTag ); return result; } @@ -61,9 +63,12 @@ dest[ 0 ] == L'm' && iswdigit( dest[ 1 ] ) ); } -ArticleDom::ArticleDom( wstring const & str ): +ArticleDom::ArticleDom( wstring const & str, string const & dictName, + wstring const & headword_): root( Node::Tag(), wstring(), wstring() ), stringPos( str.c_str() ), - transcriptionCount( 0 ) + transcriptionCount( 0 ), + dictionaryName( dictName ), + headword( headword_ ) { list< Node * > stack; // Currently opened tags @@ -122,8 +127,8 @@ textNode = 0; wstring linkText = Folding::trimWhitespace( *entry ); - processUnsortedParts( linkText, false ); - ArticleDom nodeDom( linkText ); + processUnsortedParts( linkText, true ); + ArticleDom nodeDom( linkText, dictName, headword_ ); Node link( Node::Tag(), GD_NATIVE_TO_WS( L"@" ), wstring() ); for( Node::iterator n = nodeDom.root.begin(); n != nodeDom.root.end(); ++n ) @@ -229,18 +234,11 @@ // Opening an 'mX' or 'm' tag closes any previous 'm' tag closeTag( GD_NATIVE_TO_WS( L"m" ), stack, false ); } - - Node node( Node::Tag(), name, attrs ); - - if ( stack.empty() ) + openTag( name, attrs, stack ); + if ( name == GD_NATIVE_TO_WS( L"br" ) ) { - root.push_back( node ); - stack.push_back( &root.back() ); - } - else - { - stack.back()->push_back( node ); - stack.push_back( &stack.back()->back() ); + // [br] tag don't have closing tag + closeTag( name, stack ); } } else @@ -276,7 +274,7 @@ nextChar(); } while( Folding::isWhitespace( ch ) ); - wstring linkTo; + wstring linkTo, linkText; for( ; ; nextChar() ) { @@ -291,10 +289,21 @@ { linkTo.push_back( L'>' ); linkTo.push_back( ch ); + + linkText.push_back( L'>' ); + if( escaped ) + linkText.push_back( L'\\' ); + linkText.push_back( ch ); } } else + { linkTo.push_back( ch ); + + if( escaped ) + linkText.push_back( L'\\' ); + linkText.push_back( ch ); + } } // Add the corresponding node @@ -306,8 +315,13 @@ textNode = 0; } + linkText = Folding::trimWhitespace( linkText ); + processUnsortedParts( linkText, true ); + ArticleDom nodeDom( linkText, dictName, headword_ ); + Node link( Node::Tag(), GD_NATIVE_TO_WS( L"ref" ), wstring() ); - link.push_back( Node( Node::Text(), linkTo ) ); + for( Node::iterator n = nodeDom.root.begin(); n != nodeDom.root.end(); ++n ) + link.push_back( *n ); if ( stack.empty() ) root.push_back( link ); @@ -470,10 +484,76 @@ if ( stack.size() ) { - FDPRINTF( stderr, "Warning: %u tags were unclosed.\n", (unsigned) stack.size() ); + GD_FDPRINTF( stderr, "Warning: %u tags were unclosed.\n", (unsigned) stack.size() ); } } +void ArticleDom::openTag( wstring const & name, + wstring const & attrs, + list &stack ) +{ + list< Node > nodesToReopen; + + if( name == GD_NATIVE_TO_WS( L"m" ) || checkM( name, GD_NATIVE_TO_WS( L"m" ) ) ) + { + // All tags above [m] tag will be closed and reopened after + // to avoid break this tag by closing some other tag. + + while( stack.size() ) + { + nodesToReopen.push_back( Node( Node::Tag(), stack.back()->tagName, + stack.back()->tagAttrs ) ); + + if ( stack.back()->empty() ) + { + // Empty nodes are deleted since they're no use + + stack.pop_back(); + + Node * parent = stack.size() ? stack.back() : &root; + + parent->pop_back(); + } + else + stack.pop_back(); + } + } + + // Add tag + + Node node( Node::Tag(), name, attrs ); + + if ( stack.empty() ) + { + root.push_back( node ); + stack.push_back( &root.back() ); + } + else + { + stack.back()->push_back( node ); + stack.push_back( &stack.back()->back() ); + } + + // Reopen tags if needed + + while( nodesToReopen.size() ) + { + if ( stack.empty() ) + { + root.push_back( nodesToReopen.back() ); + stack.push_back( &root.back() ); + } + else + { + stack.back()->push_back( nodesToReopen.back() ); + stack.push_back( &stack.back()->back() ); + } + + nodesToReopen.pop_back(); + } + +} + void ArticleDom::closeTag( wstring const & name, list< Node * > & stack, bool warn ) @@ -508,9 +588,9 @@ nodesToReopen.push_back( Node( Node::Tag(), stack.back()->tagName, stack.back()->tagAttrs ) ); - if ( stack.back()->empty() ) + if ( stack.back()->empty() && stack.back()->tagName != GD_NATIVE_TO_WS( L"br" ) ) { - // Empty nodes are deleted since they're no use + // Empty nodes except [br] tag are deleted since they're no use stack.pop_back(); @@ -544,8 +624,13 @@ else if ( warn ) { - qWarning() << "Warning: no corresponding opening tag for closing tag" << - gd::toQString( name ) << "found."; + if( !dictionaryName.empty() ) + gdWarning( "Warning: no corresponding opening tag for closing tag \"%s\" found in \"%s\", article \"%s\".", + gd::toQString( name ).toUtf8().data(), dictionaryName.c_str(), + gd::toQString( headword ).toUtf8().data() ); + else + gdWarning( "Warning: no corresponding opening tag for closing tag \"%s\" found.", + gd::toQString( name ).toUtf8().data() ); } } @@ -712,7 +797,7 @@ if ( !needExactEncoding ) { // We don't need that! - FDPRINTF( stderr, "Warning: encoding was specified in a Unicode file, ignoring.\n" ); + GD_FDPRINTF( stderr, "Warning: encoding was specified in a Unicode file, ignoring.\n" ); } else if ( !wcscasecmp( arg.c_str(), GD_NATIVE_TO_WS( L"Latin" ) ) ) @@ -959,7 +1044,7 @@ if ( refCount < 0 ) { - FDPRINTF( stderr, "Warning: an unmatched closing brace was encountered.\n" ); + GD_FDPRINTF( stderr, "Warning: an unmatched closing brace was encountered.\n" ); refCount = 0; // But we remove that thing either way str.erase( x, 1 ); @@ -988,7 +1073,7 @@ if ( strip && refCount ) { - FDPRINTF( stderr, "Warning: unclosed brace(s) encountered.\n" ); + GD_FDPRINTF( stderr, "Warning: unclosed brace(s) encountered.\n" ); str.erase( startPos ); } } @@ -1170,6 +1255,10 @@ } } } + if( !str.empty() && str[ str.size() - 1 ] == L' ' ) + str.erase( str.size() - 1, 1 ); + if( !str.empty() && str[ 0 ] == L' ' ) + str.erase( 0, 1 ); } namespace diff -Nru goldendict-1.5.0~git20131003/dsl_details.hh goldendict-1.5.0~git20150923/dsl_details.hh --- goldendict-1.5.0~git20131003/dsl_details.hh 2013-08-16 09:45:56.000000000 +0000 +++ goldendict-1.5.0~git20150923/dsl_details.hh 2015-09-23 08:26:24.000000000 +0000 @@ -57,18 +57,21 @@ /// Concatenates all childen text nodes recursively to form all text /// the node contains stripped of any markup. - wstring renderAsText() const; + wstring renderAsText( bool stripTrsTag = false ) const; }; /// Does the parse at construction. Refer to the 'root' member variable /// afterwards. - ArticleDom( wstring const & ); + ArticleDom( wstring const &, string const & dictName = string(), + wstring const & headword_ = wstring() ); /// Root of DOM's tree Node root; private: + void openTag( wstring const & name, wstring const & attr, list< Node * > & stack ); + void closeTag( wstring const & name, list< Node * > & stack, bool warn = true ); @@ -81,6 +84,10 @@ unsigned transcriptionCount; // >0 = inside a [t] tag void nextChar() throw( eot ); + + /// Infomation for diagnostic purposes + string dictionaryName; + wstring headword; }; /// A adapted version of Iconv which takes Dsl encoding and decodes to wchar. diff -Nru goldendict-1.5.0~git20131003/editdictionaries.cc goldendict-1.5.0~git20150923/editdictionaries.cc --- goldendict-1.5.0~git20131003/editdictionaries.cc 2013-08-16 09:45:56.000000000 +0000 +++ goldendict-1.5.0~git20150923/editdictionaries.cc 2015-09-23 08:26:24.000000000 +0000 @@ -4,6 +4,7 @@ #include "editdictionaries.hh" #include "loaddictionaries.hh" #include "dictinfo.hh" +#include "mainwindow.hh" #include using std::vector; @@ -23,6 +24,8 @@ dictionariesChanged( false ), groupsChanged( false ), lastCurrentTab( 0 ) +, helpWindow( 0 ) +, helpAction( this ) { // Some groups may have contained links to non-existnent dictionaries. We // would like to preserve them if no edits were done. To that end, we save @@ -48,7 +51,22 @@ connect( &sources, SIGNAL( rescan() ), this, SLOT( rescanSources() ) ); connect( groups.get(), SIGNAL( showDictionaryInfo( QString const & ) ), - this, SIGNAL( showDictionaryInfo(QString const & ) ) ); + this, SIGNAL( showDictionaryInfo( QString const & ) ) ); + + connect( orderAndProps.get(), SIGNAL( showDictionaryHeadwords( QString const & ) ), + this, SIGNAL( showDictionaryHeadwords( QString const & ) ) ); + + connect( ui.buttons, SIGNAL( helpRequested() ), + this, SLOT( helpRequested() ) ); + + helpAction.setShortcut( QKeySequence( "F1" ) ); + helpAction.setShortcutContext( Qt::WidgetWithChildrenShortcut ); + + connect( &helpAction, SIGNAL( triggered() ), + this, SLOT( helpRequested() ) ); + + addAction( &helpAction ); + } void EditDictionaries::editGroup( unsigned id ) @@ -161,6 +179,7 @@ sources.getForvo() != cfg.forvo || sources.getMediaWikis() != cfg.mediawikis || sources.getWebSites() != cfg.webSites || + sources.getDictServers() != cfg.dictServers || sources.getPrograms() != cfg.programs || sources.getVoiceEngines() != cfg.voiceEngines; } @@ -180,6 +199,7 @@ cfg.forvo = sources.getForvo(); cfg.mediawikis = sources.getMediaWikis(); cfg.webSites = sources.getWebSites(); + cfg.dictServers = sources.getDictServers(); cfg.programs = sources.getPrograms(); cfg.voiceEngines = sources.getVoiceEngines(); @@ -236,3 +256,38 @@ origCfg.inactiveDictionaries = orderAndProps->getCurrentInactiveDictionaries(); } } + +void EditDictionaries::helpRequested() +{ + if( !helpWindow ) + { + MainWindow * mainWindow = qobject_cast< MainWindow * >( parentWidget() ); + if( mainWindow ) + mainWindow->closeGDHelp(); + + helpWindow = new Help::HelpWindow( this, cfg ); + + if( helpWindow ) + { + helpWindow->setWindowFlags( Qt::Window ); + + connect( helpWindow, SIGNAL( needClose() ), + this, SLOT( closeHelp() ) ); + helpWindow->showHelpFor( "Manage dictionaries" ); + helpWindow->show(); + } + } + else + { + if( !helpWindow->isVisible() ) + helpWindow->show(); + + helpWindow->activateWindow(); + } +} + +void EditDictionaries::closeHelp() +{ + if( helpWindow ) + helpWindow->hide(); +} diff -Nru goldendict-1.5.0~git20131003/editdictionaries.hh goldendict-1.5.0~git20150923/editdictionaries.hh --- goldendict-1.5.0~git20131003/editdictionaries.hh 2013-08-16 09:45:56.000000000 +0000 +++ goldendict-1.5.0~git20150923/editdictionaries.hh 2015-09-23 08:26:24.000000000 +0000 @@ -11,7 +11,9 @@ #include "orderandprops.hh" #include "groups.hh" #include "instances.hh" +#include "helpwindow.hh" #include +#include class EditDictionaries: public QDialog { @@ -24,6 +26,9 @@ Instances::Groups & groupInstances, // We only clear those on rescan QNetworkAccessManager & dictNetMgr ); + ~EditDictionaries() + { if( helpWindow ) delete helpWindow; } + /// Instructs the dialog to position itself on editing the given group. void editGroup( unsigned id ); @@ -47,10 +52,15 @@ void rescanSources(); + void helpRequested(); + void closeHelp(); + signals: void showDictionaryInfo( QString const & dictId ); + void showDictionaryHeadwords( QString const & dictId ); + private: bool isSourcesChanged() const; @@ -77,7 +87,10 @@ bool dictionariesChanged; bool groupsChanged; - int lastCurrentTab; + int lastCurrentTab; + + Help::HelpWindow * helpWindow; + QAction helpAction; }; #endif diff -Nru goldendict-1.5.0~git20131003/editdictionaries.ui goldendict-1.5.0~git20150923/editdictionaries.ui --- goldendict-1.5.0~git20131003/editdictionaries.ui 2012-10-01 07:15:20.000000000 +0000 +++ goldendict-1.5.0~git20150923/editdictionaries.ui 2015-09-23 08:26:24.000000000 +0000 @@ -32,7 +32,7 @@ Qt::Horizontal - QDialogButtonBox::Apply|QDialogButtonBox::Cancel|QDialogButtonBox::Ok + QDialogButtonBox::Apply|QDialogButtonBox::Cancel|QDialogButtonBox::Help|QDialogButtonBox::Ok diff -Nru goldendict-1.5.0~git20131003/epwing_book.cc goldendict-1.5.0~git20150923/epwing_book.cc --- goldendict-1.5.0~git20131003/epwing_book.cc 1970-01-01 00:00:00.000000000 +0000 +++ goldendict-1.5.0~git20150923/epwing_book.cc 2015-09-23 08:26:24.000000000 +0000 @@ -0,0 +1,1928 @@ +/* This file is (c) 2014 Abs62 + * Part of GoldenDict. Licensed under GPLv3 or later, see the LICENSE file */ + +#include "epwing_book.hh" + +#include +#include +#include +#include "gddebug.hh" +#include "fsencoding.hh" +#include "audiolink.hh" +#include "wstring.hh" +#include "wstring_qt.hh" +#include "folding.hh" +#include "epwing_charmap.hh" + +#if defined( Q_OS_WIN32 ) || defined( Q_OS_MAC ) +#define _FILE_OFFSET_BITS 64 +#endif + +#include +#include +#include +#include +#include + +#define HitsBufferSize 512 + +namespace Epwing { + +void initialize() +{ + eb_initialize_library(); +} + +void finalize() +{ + eb_finalize_library(); +} + +namespace Book { + +#define HookFunc(name) \ + EB_Error_Code name(EB_Book *, EB_Appendix *, void*, EB_Hook_Code, int, \ + const unsigned int*) + +HookFunc( hook_newline ); +HookFunc( hook_iso8859_1 ); +HookFunc( hook_narrow_jisx0208 ); +HookFunc( hook_wide_jisx0208 ); +HookFunc( hook_gb2312 ); +HookFunc( hook_superscript ); +HookFunc( hook_subscript ); +HookFunc( hook_decoration ); +HookFunc( hook_color_image ); +HookFunc( hook_gray_image ); +HookFunc( hook_mono_image ); +HookFunc( hook_wave ); +HookFunc( hook_mpeg ); +HookFunc( hook_narrow_font ); +HookFunc( hook_wide_font ); +HookFunc( hook_reference ); + +const EB_Hook hooks[] = { + { EB_HOOK_NEWLINE, hook_newline }, + { EB_HOOK_ISO8859_1, hook_iso8859_1 }, + { EB_HOOK_NARROW_JISX0208, hook_narrow_jisx0208 }, + { EB_HOOK_WIDE_JISX0208, hook_wide_jisx0208 }, + { EB_HOOK_GB2312, hook_gb2312 }, + { EB_HOOK_BEGIN_SUBSCRIPT, hook_subscript }, + { EB_HOOK_END_SUBSCRIPT, hook_subscript }, + { EB_HOOK_BEGIN_SUPERSCRIPT, hook_superscript }, + { EB_HOOK_END_SUPERSCRIPT, hook_superscript }, + { EB_HOOK_BEGIN_DECORATION, hook_decoration }, + { EB_HOOK_END_DECORATION, hook_decoration }, + { EB_HOOK_BEGIN_COLOR_BMP, hook_color_image }, + { EB_HOOK_BEGIN_COLOR_JPEG, hook_color_image }, + { EB_HOOK_END_COLOR_GRAPHIC, hook_color_image }, + { EB_HOOK_BEGIN_IN_COLOR_BMP, hook_color_image }, + { EB_HOOK_BEGIN_IN_COLOR_JPEG, hook_color_image }, + { EB_HOOK_END_IN_COLOR_GRAPHIC, hook_color_image }, + { EB_HOOK_BEGIN_MONO_GRAPHIC, hook_mono_image }, + { EB_HOOK_END_MONO_GRAPHIC, hook_mono_image }, + { EB_HOOK_BEGIN_WAVE, hook_wave }, + { EB_HOOK_END_WAVE, hook_wave }, + { EB_HOOK_BEGIN_MPEG, hook_mpeg }, + { EB_HOOK_END_MPEG, hook_mpeg }, + { EB_HOOK_NARROW_FONT, hook_narrow_font }, + { EB_HOOK_WIDE_FONT, hook_wide_font }, + { EB_HOOK_BEGIN_REFERENCE, hook_reference }, + { EB_HOOK_END_REFERENCE, hook_reference }, + { EB_HOOK_NULL, NULL } +}; + +const EB_Hook refHooks[] = { + { EB_HOOK_BEGIN_REFERENCE, hook_reference }, + { EB_HOOK_END_REFERENCE, hook_reference }, + { EB_HOOK_NULL, NULL } +}; + +#define EUC_TO_ASCII_TABLE_START 0xa0 +#define EUC_TO_ASCII_TABLE_END 0xff + +// Tables from EB library + +static const unsigned char euc_a1_to_ascii_table[] = { + 0x00, 0x20, 0x00, 0x00, 0x2c, 0x2e, 0x00, 0x3a, /* 0xa0 */ + 0x3b, 0x3f, 0x21, 0x00, 0x00, 0x00, 0x60, 0x00, /* 0xa8 */ + 0x5e, 0x7e, 0x5f, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xb0 */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2d, 0x2f, /* 0xb8 */ + 0x5c, 0x00, 0x00, 0x7c, 0x00, 0x00, 0x00, 0x27, /* 0xc0 */ + 0x00, 0x22, 0x28, 0x29, 0x00, 0x00, 0x5b, 0x5d, /* 0xc8 */ + 0x7b, 0x7d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xd0 */ + 0x00, 0x00, 0x00, 0x00, 0x2b, 0x2d, 0x00, 0x00, /* 0xd8 */ + 0x00, 0x3d, 0x00, 0x3c, 0x3e, 0x00, 0x00, 0x00, /* 0xe0 */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5c, /* 0xe8 */ + 0x24, 0x00, 0x00, 0x25, 0x23, 0x26, 0x2a, 0x40, /* 0xf0 */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xf8 */ +}; + +static const unsigned char euc_a3_to_ascii_table[] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xa0 */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xa8 */ + 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, /* 0xb0 */ + 0x38, 0x39, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xb8 */ + 0x00, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, /* 0xc0 */ + 0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f, /* 0xc8 */ + 0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, /* 0xd0 */ + 0x58, 0x59, 0x5a, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xd8 */ + 0x00, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, /* 0xe0 */ + 0x68, 0x69, 0x6a, 0x6b, 0x6c, 0x6d, 0x6e, 0x6f, /* 0xe8 */ + 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77, /* 0xf0 */ + 0x78, 0x79, 0x7a, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xf8 */ +}; + +// Hook functions + +EB_Error_Code hook_newline( EB_Book * book, EB_Appendix *, void * ptr, + EB_Hook_Code, int, const unsigned int * ) +{ + EContainer * container = static_cast< EContainer * >( ptr ); + + if( container->textOnly ) + eb_write_text_byte1( book, '\n' ); + else + eb_write_text_string( book, "
" ); + return EB_SUCCESS; +} + +EB_Error_Code hook_iso8859_1( EB_Book * book, EB_Appendix *, void * container, + EB_Hook_Code, int, const unsigned int * argv ) +{ + EpwingBook * ebook = static_cast< EpwingBook * >( container ); + if( ebook->codecISO() ) + { + QByteArray b = ebook->codecISO()->toUnicode( (const char *)argv, 1 ).toUtf8(); + eb_write_text( book, b.data(), b.size() ); + } + return EB_SUCCESS; +} + +EB_Error_Code hook_narrow_jisx0208( EB_Book * book, EB_Appendix *, + void * container, EB_Hook_Code, int, + const unsigned int * argv ) +{ + if( *argv == 0xA1E3 ) + eb_write_text_string( book, "<" ); + else + if( *argv == 0xA1E4 ) + eb_write_text_string( book, ">" ); + else + if( *argv == 0xA1F5 ) + eb_write_text_string( book, "&" ); + else + { + unsigned char buf[ 2 ]; + buf[ 0 ] = argv[ 0 ] >> 8; + buf[ 1 ] = argv[ 0 ] & 0xff; + int out_code = 0; + + if( buf[ 0 ] == 0xA1 && buf[ 1 ] >= EUC_TO_ASCII_TABLE_START ) + out_code = euc_a1_to_ascii_table[ buf[ 1 ] - EUC_TO_ASCII_TABLE_START ]; + else + if( buf[ 0 ] == 0xA3 && buf[ 1 ] >= EUC_TO_ASCII_TABLE_START ) + out_code = euc_a3_to_ascii_table[ buf[ 1 ] - EUC_TO_ASCII_TABLE_START ]; + + if( out_code == 0 ) + { + EContainer * cont = static_cast< EContainer * >( container ); + if( cont->book->codecEuc() ) + { + QByteArray str = cont->book->codecEuc()->toUnicode( (const char *)buf, 2 ).toUtf8(); + eb_write_text( book, str.data(), str.size() ); + } + else + eb_write_text( book, (const char *)buf, 2 ); + } + else + eb_write_text_byte1( book, out_code ); + } + + return EB_SUCCESS; +} + +EB_Error_Code hook_wide_jisx0208( EB_Book * book, EB_Appendix *, void * ptr, + EB_Hook_Code, int, const unsigned int * argv ) +{ + EpwingBook * ebook = static_cast< EContainer * >( ptr )->book; + + char buf[2]; + buf[1] = *argv & 0xFF; + buf[0] = ( *argv & 0xFF00 ) >> 8; + + if( ebook->codecEuc() ) + { + QByteArray b = ebook->codecEuc()->toUnicode( buf, 2 ).toUtf8(); + eb_write_text( book, b.data(), b.size() ); + } + else + eb_write_text_byte2( book, buf[ 0 ], buf[ 1 ] ); + + return EB_SUCCESS; +} + +EB_Error_Code hook_gb2312( EB_Book * book, EB_Appendix *, void * container, + EB_Hook_Code, int, const unsigned int * argv ) +{ + EpwingBook * ebook = static_cast< EContainer * >( container )->book; + + char buf[2]; + buf[1] = *argv & 0xFF; + buf[0] = ( *argv & 0xFF00 ) >> 8 ; + + if( ebook->codecGB() ) + { + QByteArray b = ebook->codecGB()->toUnicode( buf, 2 ).toUtf8(); + eb_write_text( book, b.data(), b.size() ); + } + else + eb_write_text_byte2( book, buf[ 0 ], buf[ 1 ] ); + + return EB_SUCCESS; +} + +EB_Error_Code hook_subscript( EB_Book * book, EB_Appendix *, void * container, + EB_Hook_Code code, int, const unsigned int * ) +{ + EContainer * cn = static_cast< EContainer * >( container ); + + if( cn->textOnly ) + return EB_SUCCESS; + + if( code == EB_HOOK_BEGIN_SUBSCRIPT ) + eb_write_text_string( book, cn->book->beginDecoration( EpwingBook::SUBSCRIPT ) ); + + if( code == EB_HOOK_END_SUBSCRIPT ) + eb_write_text_string( book, cn->book->endDecoration( EpwingBook::SUBSCRIPT ) ); + + return EB_SUCCESS; +} + +EB_Error_Code hook_superscript( EB_Book * book, EB_Appendix *, void * container, + EB_Hook_Code code, int, const unsigned int * ) +{ + EContainer * cn = static_cast< EContainer * >( container ); + + if( cn->textOnly ) + return EB_SUCCESS; + + if( code == EB_HOOK_BEGIN_SUPERSCRIPT ) + eb_write_text_string( book, cn->book->beginDecoration( EpwingBook::SUPERSCRIPT ) ); + + if( code == EB_HOOK_END_SUPERSCRIPT ) + eb_write_text_string( book, cn->book->endDecoration( EpwingBook::SUPERSCRIPT ) ); + + return EB_SUCCESS; +} + +EB_Error_Code hook_decoration( EB_Book * book, EB_Appendix *, void * container, + EB_Hook_Code code, int, const unsigned int * argv ) +{ + EContainer * cn = static_cast< EContainer * >( container ); + + if( cn->textOnly ) + return EB_SUCCESS; + + if( code == EB_HOOK_BEGIN_DECORATION ) + eb_write_text_string( book, cn->book->beginDecoration( argv[ 1 ] ) ); + + if( code == EB_HOOK_END_DECORATION ) + eb_write_text_string( book, cn->book->endDecoration( argv[ 1 ] ) ); + + return EB_SUCCESS; +} + +EB_Error_Code hook_color_image( EB_Book * book, EB_Appendix *, void * container, + EB_Hook_Code code, int, const unsigned int * argv ) +{ + EContainer * cn = static_cast< EContainer * >( container ); + + if( cn->textOnly ) + return EB_SUCCESS; + + QByteArray str = cn->book->handleColorImage( code, argv ); + if( !str.isEmpty() ) + eb_write_text( book, str.data(), str.size() ); + + return EB_SUCCESS; +} + +EB_Error_Code hook_mono_image( EB_Book * book, EB_Appendix *, void * container, + EB_Hook_Code code, int, const unsigned int * argv ) +{ + EContainer * cn = static_cast< EContainer * >( container ); + + if( cn->textOnly ) + return EB_SUCCESS; + + QByteArray str = cn->book->handleMonoImage( code, argv ); + if( !str.isEmpty() ) + eb_write_text( book, str.data(), str.size() ); + + return EB_SUCCESS; +} + +EB_Error_Code hook_wave( EB_Book * book, EB_Appendix *, void * container, + EB_Hook_Code code, int, const unsigned int * argv ) +{ + EContainer * cn = static_cast< EContainer * >( container ); + + if( cn->textOnly ) + return EB_SUCCESS; + + QByteArray str = cn->book->handleWave( code, argv ); + if( !str.isEmpty() ) + eb_write_text( book, str.data(), str.size() ); + + return EB_SUCCESS; +} + +EB_Error_Code hook_mpeg( EB_Book * book, EB_Appendix *, void * container, + EB_Hook_Code code, int, const unsigned int * argv ) +{ + EContainer * cn = static_cast< EContainer * >( container ); + + if( cn->textOnly ) + return EB_SUCCESS; + + QByteArray str = cn->book->handleMpeg( code, argv ); + if( !str.isEmpty() ) + eb_write_text( book, str.data(), str.size() ); + + return EB_SUCCESS; +} + +EB_Error_Code hook_narrow_font( EB_Book * book, EB_Appendix *, void * container, + EB_Hook_Code, int, const unsigned int * argv ) +{ + EContainer * cn = static_cast< EContainer * >( container ); + + QByteArray str = cn->book->handleNarrowFont( argv, cn->textOnly ); + if( !str.isEmpty() ) + eb_write_text( book, str.data(), str.size() ); + + return EB_SUCCESS; +} + +EB_Error_Code hook_wide_font( EB_Book * book, EB_Appendix *, void * container, + EB_Hook_Code, int, const unsigned int * argv ) +{ + EContainer * cn = static_cast< EContainer * >( container ); + + QByteArray str = cn->book->handleWideFont( argv, cn->textOnly ); + if( !str.isEmpty() ) + eb_write_text( book, str.data(), str.size() ); + + return EB_SUCCESS; +} + +EB_Error_Code hook_reference( EB_Book * book, EB_Appendix *, void * container, + EB_Hook_Code code, int, const unsigned int * argv ) +{ + EContainer * cn = static_cast< EContainer * >( container ); + + if( cn->textOnly ) + return EB_SUCCESS; + + QByteArray str = cn->book->handleReference( code, argv ); + if( !str.isEmpty() ) + eb_write_text( book, str.data(), str.size() ); + + return EB_SUCCESS; +} + +// EpwingBook class + +EpwingBook::EpwingBook() : + currentSubBook( -1 ) +{ + codec_ISO = QTextCodec::codecForName( "ISO8859-1" ); + codec_GB = QTextCodec::codecForName( "GB2312" ); + codec_Euc = QTextCodec::codecForName("EUC-JP"); + + eb_initialize_book( &book ); + eb_initialize_appendix( &appendix ); + + eb_initialize_hookset( &hookSet ); + eb_set_hooks( &hookSet, hooks ); + + eb_initialize_hookset( &refHookSet ); + eb_set_hooks( &refHookSet, refHooks ); +} + +EpwingBook::~EpwingBook() +{ + eb_finalize_hookset( &hookSet ); + eb_finalize_appendix( &appendix ); + eb_finalize_book( &book ); +} + +void EpwingBook::setErrorString( QString const & func, EB_Error_Code code ) +{ + error_string = QString( "EB \"%1\" function error: %2 (%3)" ) + .arg( func ) + .arg( QTextCodec::codecForLocale()->toUnicode( eb_error_string( code ) ) ) + .arg( QTextCodec::codecForLocale()->toUnicode( eb_error_message( code ) ) ); + + if( currentPosition.page != 0 ) + error_string += QString( " on page %1, offset %2" ).arg( QString::number( currentPosition.page ) ) + .arg( QString::number( currentPosition.offset ) ); +} + +void EpwingBook::collectFilenames( QString const & directory, vector< string > & files ) +{ + QDir dir( directory ); + QString catName; + catName += QDir::separator(); + catName += "catalogs"; + + QFileInfoList entries = dir.entryInfoList( QDir::AllDirs | QDir::Files | QDir::NoDotAndDotDot, + QDir::Name | QDir::DirsLast ); + + for( QFileInfoList::const_iterator i = entries.constBegin(); + i != entries.constEnd(); ++i ) + { + QString fullName = QDir::toNativeSeparators( i->filePath() ); + + if( i->isDir() ) + collectFilenames( fullName, files ); + else + files.push_back( FsEncoding::encode( fullName ) ); + } +} + +int EpwingBook::setBook( string const & directory ) +{ + error_string.clear(); + + if( directory.empty() ) + throw exEpwing( "No such directory" ); + + currentPosition.page = 0; + + indexHeadwordsPosition.page = 0; + indexHeadwordsPosition.offset = 0; + + currentSubBook = -1; + + EB_Error_Code ret = eb_bind( &book, directory.c_str() ); + if( ret != EB_SUCCESS ) + { + setErrorString( "eb_bind", ret ); + throw exEbLibrary( error_string.toUtf8().data() ); + return -1; + } + + ret = eb_bind_appendix( &appendix, directory.c_str() ); + if( ret != EB_SUCCESS ) + { + setErrorString( "eb_bind_appendix", ret ); + } + + ret = eb_subbook_list( &book, subBookList, &subBookCount ); + if( ret != EB_SUCCESS ) + { + setErrorString( "eb_subbook_list", ret ); + throw exEbLibrary( error_string.toUtf8().data() ); + } + + ret = eb_appendix_subbook_list( &appendix, subAppendixList, &subAppendixCount ); + if( ret != EB_SUCCESS ) + { + setErrorString( "eb_appendix_subbook_list", ret ); + } + + if( !codec_Euc + || ( book.character_code == EB_CHARCODE_ISO8859_1 && !codec_ISO ) + || ( book.character_code == EB_CHARCODE_JISX0208_GB2312 && !codec_GB ) ) + throw exEpwing( "No required codec to decode dictionary" ); + + rootDir = FsEncoding::decode( directory.c_str() ); + + return subBookCount; +} + +bool EpwingBook::setSubBook( int book_nom ) +{ + error_string.clear(); + + customFontsMap.clear(); + + currentPosition.page = 0; + + if( book_nom < 0 || book_nom >= subBookCount ) + throw exEpwing( "Invalid subbook number" ); + + if( currentSubBook == book_nom ) + return true; + + EB_Error_Code ret = eb_set_subbook( &book, subBookList[ book_nom ] ); + if( ret != EB_SUCCESS ) + { + setErrorString( "eb_set_subbook", ret ); + throw exEbLibrary( error_string.toUtf8().data() ); + } + currentSubBook = book_nom; + + if( book_nom < subAppendixCount ) + { + ret = eb_set_appendix_subbook( &appendix, subAppendixList[ book_nom ] ); + if( ret != EB_SUCCESS ) + { + setErrorString( "eb_set_appendix_subbook", ret ); + } + } + + if( eb_have_font( &book, EB_FONT_16 ) ) + { + ret = eb_set_font( &book, EB_FONT_16 ); + if( ret != EB_SUCCESS ) + setErrorString( "eb_set_font", ret ); + } + + // Load fonts list + + QString fileName = rootDir + QDir::separator() + + "afonts_" + QString::number( book_nom ); + + QFile f( fileName ); + if( f.open( QFile::ReadOnly | QFile::Text ) ) + { + QTextStream ts( &f ); + ts.setCodec( "UTF-8" ); + + QString line = ts.readLine(); + while( !line.isEmpty() ) + { + QStringList list = line.remove( '\n' ).split( ' ', QString::SkipEmptyParts ); + if( list.count() == 2 ) + customFontsMap[ list[ 0 ] ] = list[ 1 ]; + line = ts.readLine(); + } + + f.close(); + } + + return true; +} + +void EpwingBook::setCacheDirectory( QString const & cacheDir ) +{ + mainCacheDir = cacheDir; + cacheImagesDir.clear(); + cacheSoundsDir.clear(); + cacheMoviesDir.clear(); + cacheFontsDir.clear(); + + imageCacheList.clear(); + soundsCacheList.clear(); + moviesCacheList.clear(); + fontsCacheList.clear(); +} + +QString EpwingBook::createCacheDir( QString const & dirName ) +{ + QDir dir; + QFileInfo info( mainCacheDir ); + if( !info.exists() || !info.isDir() ) + { + if( !dir.mkdir( mainCacheDir ) ) + { + gdWarning( "Epwing: can't create cache directory \"%s\"", mainCacheDir.toUtf8().data() ); + return QString(); + } + } + + QString cacheDir = mainCacheDir + QDir::separator() + dirName; + info = QFileInfo( cacheDir ); + if( !info.exists() || !info.isDir() ) + { + if( !dir.mkdir( cacheDir ) ) + { + gdWarning( "Epwing: can't create cache directory \"%s\"", cacheDir.toUtf8().data() ); + return QString(); + } + } + return cacheDir; +} + +QString EpwingBook::getCurrentSubBookDirectory() +{ + error_string.clear(); + + if( currentSubBook < 0 || currentSubBook >= subBookCount ) + { + setErrorString( "eb_subbook_directory2", EB_ERR_NO_SUCH_BOOK ); + throw exEbLibrary( error_string.toUtf8().data() ); + } + + char buffer[ EB_MAX_PATH_LENGTH + 1 ]; + + EB_Error_Code ret = eb_subbook_directory2( &book, subBookList[ currentSubBook ], buffer ); + if( ret != EB_SUCCESS ) + { + setErrorString( "eb_subbook_directory2", ret ); + throw exEbLibrary( error_string.toUtf8().data() ); + } + + return QString::fromLocal8Bit( buffer ); +} + +QString EpwingBook::makeFName( QString const & ext, int page, int offset ) const +{ + QString name = QString::number( page ) + + "x" + + QString::number( offset ) + + "." + + ext; + return name; +} + +QString EpwingBook::title() +{ + char buf[ EB_MAX_TITLE_LENGTH + 1 ]; + error_string.clear(); + + EB_Error_Code ret = eb_subbook_title( &book, buf ); + if( ret != EB_SUCCESS ) + { + setErrorString( "eb_subbook_title", ret ); + throw exEbLibrary( error_string.toUtf8().data() ); + } + + buf[ EB_MAX_TITLE_LENGTH ] = 0; + if( codec_Euc ) + return codec_Euc->toUnicode( buf ); + + return QString(); +} + +QString EpwingBook::copyright() +{ + error_string.clear(); + + if( !eb_have_copyright( &book ) ) + return QString(); + + EB_Position position; + EB_Error_Code ret = eb_copyright( &book, &position ); + if( ret != EB_SUCCESS ) + { + setErrorString( "eb_copyright", ret ); + throw exEbLibrary( error_string.toUtf8().data() ); + } + + currentPosition = position; + + return getText( position.page, position.offset, true ); +} + +QString EpwingBook::getText( int page, int offset, bool text_only ) +{ + error_string.clear(); + + EB_Position pos; + pos.page = page; + pos.offset = offset; + currentPosition = pos; + + EB_Error_Code ret = eb_seek_text(&book, &pos); + if( ret != EB_SUCCESS ) + { + setErrorString( "eb_seek_text", ret ); + currentPosition.page = 0; + throw exEbLibrary( error_string.toUtf8().data() ); + } + + QByteArray buf; + char buffer[ TextBufferSize + 1 ]; + ssize_t buffer_length; + + EContainer container( this, text_only ); + + prepareToRead(); + + for( ; ; ) + { + ret = eb_read_text( &book, &appendix, &hookSet, &container, + TextBufferSize, buffer, &buffer_length ); + + if( ret != EB_SUCCESS ) + { + setErrorString( "eb_read_text", ret ); + break; + } + + buf += QByteArray( buffer, buffer_length ); + + if( eb_is_text_stopped( &book ) ) + break; + + if( buf.length() > TextSizeLimit ) + { + error_string = "Data too large"; + currentPosition.page = 0; + return QString(); + } + } + + QString text = QString::fromUtf8( buf.data(), buf.size() ).trimmed(); + finalizeText( text ); + return text; +} + +void EpwingBook::getReferencesFromText( int page, int offset ) +{ + error_string.clear(); + + EB_Position pos; + pos.page = page; + pos.offset = offset; + + currentPosition = pos; + + EB_Error_Code ret = eb_seek_text(&book, &pos); + if( ret != EB_SUCCESS ) + { + setErrorString( "eb_seek_text", ret ); + throw exEbLibrary( error_string.toUtf8().data() ); + } + + char buffer[ TextBufferSize + 1 ]; + ssize_t buffer_length; + + EContainer container( this, false ); + + prepareToRead(); + + for( ; ; ) + { + ret = eb_read_text( &book, &appendix, &refHookSet, &container, + TextBufferSize, buffer, &buffer_length ); + + if( ret != EB_SUCCESS ) + { + setErrorString( "eb_read_text", ret ); + break; + } + + if( eb_is_text_stopped( &book ) ) + break; + } + + for( int x = 0; x < refPages.size(); x++ ) + LinksQueue.push_back( EWPos( refPages[ x ], refOffsets[ x ] ) ); +} + +EB_Error_Code EpwingBook::forwardText( EB_Position & startPos ) +{ + EB_Error_Code ret = eb_seek_text( &book, &startPos ); + if( ret != EB_SUCCESS ) + { + setErrorString( "eb_seek_text", ret ); + throw exEbLibrary( error_string.toUtf8().data() ); + } + + ret = eb_forward_text( &book, &appendix ); + while( ret == EB_ERR_END_OF_CONTENT ) + { + ret = eb_tell_text( &book, &startPos ); + if( ret != EB_SUCCESS ) + break; + + if( startPos.page >= book.subbook_current->text.end_page ) + return EB_ERR_END_OF_CONTENT; + + startPos.offset += 2; + currentPosition = startPos; + + ret = eb_seek_text( &book, &startPos ); + + if( ret == EB_SUCCESS ) + ret = eb_forward_text( &book, &appendix ); + } + return ret; +} + +void EpwingBook::getFirstHeadword( EpwingHeadword & head ) +{ + error_string.clear(); + + EB_Position pos; + + EB_Error_Code ret = eb_text( &book, &pos ); + if( ret != EB_SUCCESS ) + { + setErrorString( "eb_text", ret ); + throw exEbLibrary( error_string.toUtf8().data() ); + } + + ret = forwardText( pos ); + if( ret != EB_SUCCESS ) + { + setErrorString( "forwardText", ret ); + throw exEbLibrary( error_string.toUtf8().data() ); + } + + eb_backward_text( &book, &appendix ); + + ret = eb_tell_text( &book, &pos ); + if( ret != EB_SUCCESS ) + { + setErrorString( "eb_tell_text", ret ); + throw exEbLibrary( error_string.toUtf8().data() ); + } + + currentPosition = pos; + indexHeadwordsPosition = pos; + + head.page = pos.page; + head.offset = pos.offset; + + if( !readHeadword( pos, head.headword, true ) ) + throw exEbLibrary( error_string.toUtf8().data() ); + + fixHeadword( head.headword ); + + EWPos epos( pos.page, pos.offset ); + allHeadwordPositions[ head.headword ] = epos; +} + +bool EpwingBook::getNextHeadword( EpwingHeadword & head ) +{ + EB_Position pos; + + QRegExp badLinks( "#(v|n)\\d" ); + + // At first we check references queue + while( !LinksQueue.isEmpty() ) + { + EWPos epos = LinksQueue.last(); + LinksQueue.pop_back(); + + pos.page = epos.first; + pos.offset = epos.second; + + if( readHeadword( pos, head.headword, true ) ) + { + if( head.headword.isEmpty() + || head.headword.contains( badLinks ) ) + continue; + + fixHeadword( head.headword ); + + head.page = pos.page; + head.offset = pos.offset; + + if( allHeadwordPositions.contains( head.headword ) ) + { + EWPos epos = allHeadwordPositions[ head.headword ]; + if( pos.page != epos.first || abs( pos.offset - epos.second ) > 4 ) + return true; + } + else + { + allHeadwordPositions[ head.headword ] = EWPos( pos.page, pos.offset ); + return true; + } + } + } + + // No queued positions - forward to next article + + error_string.clear(); + + pos = indexHeadwordsPosition; + + for( ; ; ) + { + EB_Error_Code ret = forwardText( pos ); + indexHeadwordsPosition = pos; + + if( ret == EB_ERR_END_OF_CONTENT ) + return false; + else + if( ret != EB_SUCCESS ) + { + setErrorString( "eb_forward_text", ret ); + throw exEbLibrary( error_string.toUtf8().data() ); + } + + ret = eb_tell_text( &book, &pos ); + if( ret != EB_SUCCESS ) + { + setErrorString( "eb_tell_text", ret ); + throw exEbLibrary( error_string.toUtf8().data() ); + } + + indexHeadwordsPosition = pos; + + try + { + getReferencesFromText( pos.page, pos.offset ); + } + catch( std::exception ) + { + } + + head.page = pos.page; + head.offset = pos.offset; + + if( !readHeadword( pos, head.headword, true ) ) + throw exEbLibrary( error_string.toUtf8().data() ); + + if( head.headword.isEmpty() ) + continue; + + fixHeadword( head.headword ); + + if( allHeadwordPositions.contains( head.headword ) ) + { + EWPos epos = allHeadwordPositions[ head.headword ]; + if( pos.page != epos.first || abs( pos.offset - epos.second ) > 4 ) + break; + } + else + { + allHeadwordPositions[ head.headword ] = EWPos( pos.page, pos.offset ); + break; + } + } + + return true; +} + +bool EpwingBook::readHeadword( EB_Position const& pos, + QString & headword, + bool text_only ) +{ + EContainer container( this, text_only ); + ssize_t head_length; + + EB_Position newPos = pos; + + EB_Error_Code ret = eb_seek_text( &book, &newPos ); + if( ret != EB_SUCCESS ) + { + setErrorString( "eb_seek_text", ret ); + return false; + } + + char buffer[ TextBufferSize + 1 ]; + + ret = eb_read_heading( &book, &appendix, &hookSet, &container, + TextBufferSize, buffer, &head_length ); + if( ret != EB_SUCCESS ) + { + setErrorString( "eb_read_heading", ret ); + return false; + } + + headword = QString::fromUtf8( buffer, head_length ); + return true; +} + +bool EpwingBook::isHeadwordCorrect( QString const & headword ) +{ + QByteArray buf, buf2; + EB_Hit hits[ 2 ]; + int hit_count; + EB_Error_Code ret; + + if( headword.isEmpty() ) + return false; + + if( book.character_code == EB_CHARCODE_ISO8859_1 && codec_ISO ) + buf = codec_ISO->fromUnicode( headword ); + else + if( ( book.character_code == EB_CHARCODE_JISX0208 || book.character_code == EB_CHARCODE_JISX0208_GB2312 ) + && codec_Euc ) + buf = codec_Euc->fromUnicode( headword ); + + if( book.character_code == EB_CHARCODE_JISX0208_GB2312 && codec_GB ) + buf2 = codec_GB->fromUnicode( headword ); + + if( !buf.isEmpty() && eb_search_exactword( &book, buf.data() ) == EB_SUCCESS ) + { + ret = eb_hit_list( &book, 2, hits, &hit_count ); + if( ret == EB_SUCCESS && hit_count > 0 ) + return true; + } + + if( !buf2.isEmpty() && eb_search_exactword( &book, buf2.data() ) == EB_SUCCESS ) + { + ret = eb_hit_list( &book, 2, hits, &hit_count ); + if( ret == EB_SUCCESS && hit_count > 0 ) + return true; + } + + return false; +} + +void EpwingBook::fixHeadword( QString & headword ) +{ + if(headword.isEmpty() ) + return; + + headword.remove( QChar( 0x30FB ) ); // Used in Japan transcription + + if( isHeadwordCorrect( headword) ) + return; + + QString fixed = headword; + fixed.remove( QRegExp( "/[^/]+/", Qt::CaseSensitive ) ); + + if( isHeadwordCorrect( fixed ) ) + { + headword = fixed; + return; + } + + gd::wstring folded = Folding::applyPunctOnly( gd::toWString( fixed ) ); + fixed = gd::toQString( folded ); + + if( isHeadwordCorrect( fixed ) ) + { + headword = fixed; + return; + } + + folded = Folding::applyDiacriticsOnly( folded ); + fixed = gd::toQString( folded ); + + if( isHeadwordCorrect( fixed ) ) + { + headword = fixed; + return; + } + + folded = Folding::applyWhitespaceOnly( folded ); + fixed = gd::toQString( folded ); + + if( isHeadwordCorrect( fixed ) ) + headword = fixed; +} + +void EpwingBook::getArticle( QString & headword, QString & articleText, + int page, int offset, bool text_only) +{ + error_string.clear(); + char buffer[ TextBufferSize + 1 ]; + + EB_Position pos; + pos.page = page; + pos.offset = offset; + + currentPosition = pos; + + EB_Error_Code ret = eb_seek_text( &book, &pos ); + if( ret != EB_SUCCESS ) + { + setErrorString( "eb_seek_text", ret ); + throw exEbLibrary( error_string.toUtf8().data() ); + } + + EContainer container( this, text_only ); + ssize_t length; + + prepareToRead(); + + ret = eb_read_heading( &book, &appendix, &hookSet, &container, + TextBufferSize, buffer, &length ); + if( ret != EB_SUCCESS ) + { + setErrorString( "eb_read_heading", ret ); + throw exEbLibrary( error_string.toUtf8().data() ); + } + + headword = QString::fromUtf8( buffer, length ); + finalizeText( headword ); + + articleText = getText( pos.page, pos.offset, text_only ); +} + +const char * EpwingBook::beginDecoration( unsigned int code ) +{ + const char * str = ""; + + code = normalizeDecorationCode( code ); + + switch( code ) + { + case ITALIC: str = ""; + break; + case BOLD: str = ""; + break; + case EMPHASIS: str = ""; + break; + case SUBSCRIPT: str = ""; + break; + case SUPERSCRIPT: str = ""; + break; + default: gdWarning( "Epwing: Unknown decoration code %i", code ); + code = UNKNOWN; + break; + } + decorationStack.push( code ); + return str; +} + +const char * EpwingBook::endDecoration( unsigned int code ) +{ + const char * str = ""; + + code = normalizeDecorationCode( code ); + + if( code != ITALIC && code != BOLD && code != EMPHASIS + && code != SUBSCRIPT && code != SUPERSCRIPT ) + code = UNKNOWN; + + unsigned int storedCode = UNKNOWN; + if( !decorationStack.isEmpty() ) + storedCode = decorationStack.pop(); + + if( storedCode != code ) + { + gdWarning( "Epwing: tags mismatch detected" ); + if( storedCode == UNKNOWN ) + storedCode = code; + } + + switch( storedCode ) + { + case ITALIC: str = ""; + break; + case BOLD: str = ""; + break; + case EMPHASIS: str = ""; + break; + case SUBSCRIPT: str = ""; + break; + case SUPERSCRIPT: str = ""; + break; + case UNKNOWN: break; + } + + return str; +} + +unsigned int EpwingBook::normalizeDecorationCode( unsigned int code ) +{ + // Some non-standard codes + switch( code ) + { + case 0x1101: return BOLD; + case 0x1103: return ITALIC; + } + return code; +} + +void EpwingBook::finalizeText( QString & text ) +{ + // Close unclosed tags + while( !decorationStack.isEmpty() ) + { + unsigned int code = decorationStack.pop(); + switch( code ) + { + case ITALIC: text += ""; + break; + case BOLD: text += ""; + break; + case EMPHASIS: text += ""; + break; + case SUBSCRIPT: text += ""; + break; + case SUPERSCRIPT: text += ""; + break; + } + } + + // Replace references + + int pos = 0; + QRegExp reg1( "" ); + QRegExp reg2( "" ); + + EContainer cont( this, true ); + + char buf[ TextBufferSize + 1 ]; + + for( int x = 0; x < refCloseCount; x++ ) + { + pos = text.indexOf( reg1, pos ); + if( pos < 0 ) + break; + + EB_Position ebpos; + ebpos.page = refPages[ x ]; + ebpos.offset = refOffsets[ x ]; + + QUrl url; + url.setScheme( "gdlookup" ); + url.setHost( "localhost" ); + + // Read headword + + eb_seek_text( &book, &ebpos ); + + ssize_t length; + EB_Error_Code ret = eb_read_heading( &book, &appendix, &hookSet, &cont, + TextBufferSize, buf, &length ); + if( ret == EB_SUCCESS ) + { + QString headword = QString::fromUtf8( buf, length ); + fixHeadword( headword ); + url.setPath( headword ); + } + + QString link = ""; + + text.replace( reg1.cap(), link ); + + pos = text.indexOf( reg2, pos ); + if( pos < 0 ) + break; + + text.replace( reg2.cap(), "" ); + } +} + +void EpwingBook::prepareToRead() +{ + refPages.clear(); + refOffsets.clear(); + refOpenCount = refCloseCount = 0; +} + +QByteArray EpwingBook::handleColorImage( EB_Hook_Code code, + const unsigned int * argv ) +{ + QString name, fullName; + EB_Position pos; + + if( code == EB_HOOK_END_COLOR_GRAPHIC + || code == EB_HOOK_END_IN_COLOR_GRAPHIC ) + return QByteArray(); + + pos.page = argv[ 2 ]; + pos.offset = argv[ 3 ]; + + EB_Error_Code ret = eb_set_binary_color_graphic( &book, & pos ); + if( ret != EB_SUCCESS ) + { + setErrorString( "eb_set_binary_color_graphic", ret ); + gdWarning( "Epwing image retrieve error: %s", + error_string.toUtf8().data() ); + return QByteArray(); + } + + if( cacheImagesDir.isEmpty() ) + cacheImagesDir = createCacheDir( "images" ); + + if( code == EB_HOOK_BEGIN_COLOR_BMP + || code == EB_HOOK_BEGIN_IN_COLOR_BMP ) + name = makeFName( "bmp", pos.page, pos.offset ); + else + if( code == EB_HOOK_BEGIN_COLOR_JPEG + || code == EB_HOOK_BEGIN_IN_COLOR_JPEG ) + name = makeFName( "jpg", pos.page, pos.offset ); + + if( !cacheImagesDir.isEmpty() ) + fullName = cacheImagesDir + QDir::separator() + name; + + QUrl url; + url.setScheme( "bres" ); + url.setHost( dictID ); + url.setPath( name ); + QByteArray urlStr = "

\""

"; + + if( imageCacheList.contains( name, Qt::CaseSensitive ) ) + { + // We already have this image in cache + return urlStr; + } + + if( !fullName.isEmpty() ) + { + QFile f( fullName ); + if( f.open( QFile::WriteOnly ) ) + { + QByteArray buffer; + buffer.resize( BinaryBufferSize ); + ssize_t length; + + for( ; ; ) + { + ret = eb_read_binary( &book, BinaryBufferSize, + buffer.data(), &length ); + if( ret != EB_SUCCESS ) + { + setErrorString( "eb_read_binary", ret ); + gdWarning( "Epwing image retrieve error: %s", + error_string.toUtf8().data() ); + break; + } + + f.write( buffer.data(), length ); + + if( length < BinaryBufferSize ) + break; + } + f.close(); + + imageCacheList.append( name ); + } + } + + return urlStr; +} + +QByteArray EpwingBook::handleMonoImage( EB_Hook_Code code, + const unsigned int * argv ) +{ + QString name, fullName; + EB_Position pos; + + if( code == EB_HOOK_BEGIN_MONO_GRAPHIC ) + { + monoHeight = argv[ 2 ]; + monoWidth = argv[ 3 ]; + return QByteArray(); + } + + // Handle EB_HOOK_END_MONO_GRAPHIC hook + + pos.page = argv[ 1 ]; + pos.offset = argv[ 2 ]; + + EB_Error_Code ret = eb_set_binary_mono_graphic( &book, &pos, monoWidth, monoHeight ); + if( ret != EB_SUCCESS ) + { + setErrorString( "eb_set_binary_mono_graphic", ret ); + gdWarning( "Epwing image retrieve error: %s", + error_string.toUtf8().data() ); + return QByteArray(); + } + + if( cacheImagesDir.isEmpty() ) + cacheImagesDir = createCacheDir( "images" ); + + name = makeFName( "bmp", pos.page, pos.offset ); + + if( !cacheImagesDir.isEmpty() ) + fullName = cacheImagesDir + QDir::separator() + name; + + QUrl url; + url.setScheme( "bres" ); + url.setHost( dictID ); + url.setPath( name ); + QByteArray urlStr = "\"""; + + if( imageCacheList.contains( name, Qt::CaseSensitive ) ) + { + // We already have this image in cache + return urlStr; + } + + if( !fullName.isEmpty() ) + { + QFile f( fullName ); + if( f.open( QFile::WriteOnly | QFile::Truncate ) ) + { + QByteArray buffer; + buffer.resize( BinaryBufferSize ); + ssize_t length; + + for( ; ; ) + { + ret = eb_read_binary( &book, BinaryBufferSize, + buffer.data(), &length ); + if( ret != EB_SUCCESS ) + { + setErrorString( "eb_read_binary", ret ); + gdWarning( "Epwing image retrieve error: %s", + error_string.toUtf8().data() ); + break; + } + + f.write( buffer.data(), length ); + + if( length < BinaryBufferSize ) + break; + } + f.close(); + + imageCacheList.append( name ); + } + } + + return urlStr; +} + +QByteArray EpwingBook::handleWave( EB_Hook_Code code, const unsigned int * argv ) +{ + + if( code == EB_HOOK_END_WAVE ) + return QByteArray( "\"Play\"/" ); + + // Handle EB_HOOK_BEGIN_WAVE + + EB_Position spos, epos; + spos.page = argv[ 2 ]; + spos.offset = argv[ 3 ]; + epos.page = argv[ 4 ]; + epos.offset = argv[ 5 ]; + + eb_set_binary_wave( &book, &spos, &epos ); + + if( cacheSoundsDir.isEmpty() ) + cacheSoundsDir = createCacheDir( "sounds" ); + + QString name = makeFName( "wav", spos.page, spos.offset ); + QString fullName; + + if( !cacheSoundsDir.isEmpty() ) + fullName = cacheSoundsDir + QDir::separator() + name; + + QUrl url; + url.setScheme( "gdau" ); + url.setHost( dictID ); + url.setPath( name ); + + string ref = string( "\"" )+ url.toEncoded().data() + "\""; + QByteArray result = addAudioLink( ref , dictID.toUtf8().data() ).c_str(); + + result += QByteArray( ""; + + if( soundsCacheList.contains( name, Qt::CaseSensitive ) ) + { + // We already have this sound in cache + return result; + } + + if( !fullName.isEmpty() ) + { + QFile f( fullName ); + if( f.open( QFile::WriteOnly | QFile::Truncate ) ) + { + QByteArray buffer; + buffer.resize( BinaryBufferSize ); + ssize_t length; + + for( ; ; ) + { + EB_Error_Code ret = eb_read_binary( &book, BinaryBufferSize, + buffer.data(), &length ); + if( ret != EB_SUCCESS ) + { + setErrorString( "eb_read_binary", ret ); + gdWarning( "Epwing sound retrieve error: %s", + error_string.toUtf8().data() ); + break; + } + + f.write( buffer.data(), length ); + + if( length < BinaryBufferSize ) + break; + } + f.close(); + + soundsCacheList.append( name ); + } + } + return result; +} + +QByteArray EpwingBook::handleMpeg( EB_Hook_Code code, const unsigned int * argv ) +{ + + if( code == EB_HOOK_END_MPEG ) + return QByteArray( "" ); + + // Handle EB_HOOK_BEGIN_MPEG + + char file[ EB_MAX_PATH_LENGTH + 1 ]; + + unsigned int *p = (unsigned int *)( argv + 2 ); + eb_compose_movie_path_name( &book, p, file ); + + QString name = QString::fromLocal8Bit( file ); + name = QFileInfo( name ).fileName(); + name += ".mpg"; + + eb_set_binary_mpeg( &book, argv + 2 ); + + if( cacheMoviesDir.isEmpty() ) + cacheMoviesDir = createCacheDir( "movies" ); + + QString fullName; + + if( !cacheMoviesDir.isEmpty() ) + fullName = cacheMoviesDir + QDir::separator() + name; + + QUrl url; + url.setScheme( "gdvideo" ); + url.setHost( dictID ); + url.setPath( name ); + + QByteArray result = QByteArray( ""; + + if( moviesCacheList.contains( name, Qt::CaseSensitive ) ) + { + // We already have this movie in cache + return result; + } + + if( !fullName.isEmpty() ) + { + QFile f( fullName ); + if( f.open( QFile::WriteOnly | QFile::Truncate ) ) + { + QByteArray buffer; + buffer.resize( BinaryBufferSize ); + ssize_t length; + + for( ; ; ) + { + EB_Error_Code ret = eb_read_binary( &book, BinaryBufferSize, + buffer.data(), &length ); + if( ret != EB_SUCCESS ) + { + setErrorString( "eb_read_binary", ret ); + gdWarning( "Epwing movie retrieve error: %s", + error_string.toUtf8().data() ); + break; + } + + f.write( buffer.data(), length ); + + if( length < BinaryBufferSize ) + break; + } + f.close(); + + moviesCacheList.append( name ); + } + } + return result; +} + +QByteArray EpwingBook::codeToUnicode( QString const & code ) +{ + QString subst; + + if( !customFontsMap.isEmpty() && customFontsMap.contains( code ) ) + { + subst = QTextDocumentFragment::fromHtml( customFontsMap[ code ] ) + .toPlainText(); + return subst.toUtf8(); + } + + return EpwingCharmap::instance().mapToUtf8( code ); +} + +QByteArray EpwingBook::handleNarrowFont( const unsigned int * argv, + bool text_only ) +{ + QString fcode = "n" + QString::number( *argv, 16 ); + + // Check substitution list + + QByteArray b = codeToUnicode( fcode ); + if( !b.isEmpty() || text_only ) + return b; + + // Find font image in book + + if( !eb_have_narrow_font( &book ) ) + return QByteArray( "?" ); + + QString fname = fcode + ".png"; + + if( cacheFontsDir.isEmpty() ) + cacheFontsDir = createCacheDir( "fonts" ); + + QString fullName = cacheFontsDir + QDir::separator() + fname; + + QUrl url; + url.setScheme( "file" ); + url.setHost( "/"); + url.setPath( fullName ); + + QByteArray link = ""; + + if( fontsCacheList.contains( fname, Qt::CaseSensitive ) ) + { + // We already have this image in cache + return link; + } + + if( !cacheFontsDir.isEmpty() ) + { + char bitmap[EB_SIZE_NARROW_FONT_16]; + EB_Error_Code ret = eb_narrow_font_character_bitmap( &book, *argv, bitmap ); + if( ret != EB_SUCCESS ) + { + setErrorString( "eb_narrow_font_character_bitmap", ret ); + gdWarning( "Epwing: Font retrieve error: %s", error_string.toUtf8().data() ); + return QByteArray( "?" ); + } + + size_t nlen; + char buff[EB_SIZE_NARROW_FONT_16_PNG]; + ret = eb_bitmap_to_png( bitmap, 8, 16, buff, &nlen ); + if( ret != EB_SUCCESS ) + { + setErrorString( "eb_bitmap_to_png", ret ); + gdWarning( "Epwing: Font retrieve error: %s", error_string.toUtf8().data() ); + return QByteArray( "?" ); + } + + + QFile f( fullName ); + if( f.open( QFile::WriteOnly | QFile::Truncate ) ) + { + f.write( buff, nlen ); + f.close(); + fontsCacheList.append( fname ); + } + } + + return link; +} + +QByteArray EpwingBook::handleWideFont( const unsigned int * argv, + bool text_only ) +{ + QString fcode = "w" + QString::number( *argv, 16 ); + + // Check substitution list + + QByteArray b = codeToUnicode( fcode ); + if( !b.isEmpty() || text_only ) + return b; + + // Find font image in book + + if( !eb_have_wide_font( &book ) ) + return QByteArray( "?" ); + + QString fname = fcode + ".png"; + + if( cacheFontsDir.isEmpty() ) + cacheFontsDir = createCacheDir( "fonts" ); + + QString fullName = cacheFontsDir + QDir::separator() + fname; + + QUrl url; + url.setScheme( "file" ); + url.setHost( "/"); + url.setPath( fullName ); + + QByteArray link = ""; + + if( fontsCacheList.contains( fname, Qt::CaseSensitive ) ) + { + // We already have this image in cache + return link; + } + + if( !cacheFontsDir.isEmpty() ) + { + char bitmap[EB_SIZE_WIDE_FONT_16]; + EB_Error_Code ret = eb_wide_font_character_bitmap( &book, *argv, bitmap ); + if( ret != EB_SUCCESS ) + { + setErrorString( "eb_wide_font_character_bitmap", ret ); + gdWarning( "Epwing: Font retrieve error: %s", error_string.toUtf8().data() ); + return QByteArray( "?" ); + } + + size_t wlen; + char buff[EB_SIZE_WIDE_FONT_16_PNG]; + ret = eb_bitmap_to_png( bitmap, 16, 16, buff, &wlen ); + if( ret != EB_SUCCESS ) + { + setErrorString( "eb_bitmap_to_png", ret ); + gdWarning( "Epwing: Font retrieve error: %s", error_string.toUtf8().data() ); + return QByteArray( "?" ); + } + + QFile f( fullName ); + if( f.open( QFile::WriteOnly | QFile::Truncate ) ) + { + f.write( buff, wlen ); + f.close(); + fontsCacheList.append( fname ); + } + } + + return link; +} + +QByteArray EpwingBook::handleReference( EB_Hook_Code code, const unsigned int * argv ) +{ + if( code == EB_HOOK_BEGIN_REFERENCE ) + { + if( refOpenCount > refCloseCount ) + return QByteArray(); + + QString str; + str.sprintf( "", refOpenCount ); + refOpenCount += 1; + return str.toUtf8(); + } + + // EB_HOOK_END_REFERENCE + + if( refCloseCount >= refOpenCount ) + return QByteArray(); + + refPages.append( argv[ 1 ] ); + refOffsets.append( argv[ 2 ] ); + + QString str; + str.sprintf( "", refCloseCount ); + refCloseCount += 1; + + return str.toUtf8(); +} + +bool EpwingBook::getMatches( QString word, QVector< QString > & matches ) +{ + QByteArray bword, bword2; + EB_Hit hits[ HitsBufferSize ]; + int hitCount = 0; + + if( book.character_code == EB_CHARCODE_ISO8859_1 && codec_ISO ) + bword = codec_ISO->fromUnicode( word ); + else + if( ( book.character_code == EB_CHARCODE_JISX0208 || book.character_code == EB_CHARCODE_JISX0208_GB2312 ) + && codec_Euc ) + bword = codec_Euc->fromUnicode( word ); + + if( book.character_code == EB_CHARCODE_JISX0208_GB2312 && codec_GB ) + bword2 = codec_GB->fromUnicode( word ); + + if( !bword.isEmpty() ) + { + EB_Error_Code ret = eb_search_word( &book, bword.data() ); + if( ret != EB_SUCCESS ) + { + setErrorString( "eb_search_word", ret ); + gdWarning( "Epwing word search error: %s", + error_string.toUtf8().data() ); + return false; + } + + ret = eb_hit_list( &book, 10, hits, &hitCount ); + if( ret != EB_SUCCESS ) + { + setErrorString( "eb_hit_list", ret ); + gdWarning( "Epwing word search error: %s", + error_string.toUtf8().data() ); + return false; + } + } + + if( hitCount == 0 && !bword2.isEmpty() ) + { + EB_Error_Code ret = eb_search_word( &book, bword2.data() ); + if( ret != EB_SUCCESS ) + { + setErrorString( "eb_search_word", ret ); + gdWarning( "Epwing word search error: %s", + error_string.toUtf8().data() ); + return false; + } + + ret = eb_hit_list( &book, 10, hits, &hitCount ); + if( ret != EB_SUCCESS ) + { + setErrorString( "eb_hit_list", ret ); + gdWarning( "Epwing word search error: %s", + error_string.toUtf8().data() ); + return false; + } + } + + QVector< int > pages, offsets; + + for( int i = 0; i < hitCount; i++ ) + { + bool same_article = false; + for( int n = 0; n < pages.size(); n++ ) + { + if( pages.at( n ) == hits[ i ].text.page + && offsets.at( n ) == hits[ i ].text.offset ) + { + same_article = true; + continue; + } + } + if( !same_article ) + { + pages.push_back( hits[ i ].text.page ); + offsets.push_back( hits[ i ].text.offset ); + + QString headword; + if( readHeadword( hits[ i ].heading, headword, true ) ) + { + if( isHeadwordCorrect( headword ) ) + matches.push_back( headword ); + } + } + } + return true; +} + +bool EpwingBook::getArticlePos( QString word, QVector< int > & pages, QVector< int > & offsets ) +{ + QByteArray bword, bword2; + EB_Hit hits[ HitsBufferSize ]; + int hitCount = 0; + + if( book.character_code == EB_CHARCODE_ISO8859_1 && codec_ISO ) + bword = codec_ISO->fromUnicode( word ); + else + if( ( book.character_code == EB_CHARCODE_JISX0208 || book.character_code == EB_CHARCODE_JISX0208_GB2312 ) + && codec_Euc ) + bword = codec_Euc->fromUnicode( word ); + + if( book.character_code == EB_CHARCODE_JISX0208_GB2312 && codec_GB ) + bword2 = codec_GB->fromUnicode( word ); + + if( !bword.isEmpty() ) + { + EB_Error_Code ret = eb_search_exactword( &book, bword.data() ); + if( ret != EB_SUCCESS ) + { + setErrorString( "eb_search_word", ret ); + gdWarning( "Epwing word search error: %s", + error_string.toUtf8().data() ); + return false; + } + + ret = eb_hit_list( &book, HitsBufferSize, hits, &hitCount ); + if( ret != EB_SUCCESS ) + { + setErrorString( "eb_hit_list", ret ); + gdWarning( "Epwing word search error: %s", + error_string.toUtf8().data() ); + return false; + } + } + + if( hitCount == 0 && !bword2.isEmpty() ) + { + EB_Error_Code ret = eb_search_exactword( &book, bword2.data() ); + if( ret != EB_SUCCESS ) + { + setErrorString( "eb_search_word", ret ); + gdWarning( "Epwing word search error: %s", + error_string.toUtf8().data() ); + return false; + } + + ret = eb_hit_list( &book, HitsBufferSize, hits, &hitCount ); + if( ret != EB_SUCCESS ) + { + setErrorString( "eb_hit_list", ret ); + gdWarning( "Epwing word search error: %s", + error_string.toUtf8().data() ); + return false; + } + } + + for( int i = 0; i < hitCount; i++ ) + { + bool same_article = false; + for( int n = 0; n < pages.size(); n++ ) + { + if( pages.at( n ) == hits[ i ].text.page + && offsets.at( n ) == hits[ i ].text.offset ) + { + same_article = true; + continue; + } + } + if( !same_article ) + { + pages.push_back( hits[ i ].text.page ); + offsets.push_back( hits[ i ].text.offset ); + } + } + + return !pages.empty(); +} + +Mutex EpwingBook::libMutex; + +} // namespace Book + +} // namespace Epwing diff -Nru goldendict-1.5.0~git20131003/epwing_book.hh goldendict-1.5.0~git20150923/epwing_book.hh --- goldendict-1.5.0~git20131003/epwing_book.hh 1970-01-01 00:00:00.000000000 +0000 +++ goldendict-1.5.0~git20150923/epwing_book.hh 2015-09-23 08:26:24.000000000 +0000 @@ -0,0 +1,239 @@ +#ifndef __EPWING_BOOK_HH_INCLUDED__ +#define __EPWING_BOOK_HH_INCLUDED__ + +#include + +#if defined( Q_OS_WIN32 ) || defined( Q_OS_MAC ) +#define _FILE_OFFSET_BITS 64 +#endif + +#include "dictionary.hh" +#include "ex.hh" +#include "mutex.hh" + +#include +#include +#include +#include +#include +#include + +#include + +namespace Epwing { + +DEF_EX_STR( exEbLibrary, "EB library report error", Dictionary::Ex ) +DEF_EX_STR( exEpwing, "Epwing parsing error:", Dictionary::Ex ) + +void initialize(); +void finalize(); + +namespace Book { + +using std::vector; +using std::string; + +enum { + TextBufferSize = 4095, + BinaryBufferSize = 50000, + TextSizeLimit = 2800000 +}; + +struct EpwingHeadword +{ + QString headword; + quint32 page; + quint32 offset; +}; + +class EpwingBook +{ + typedef QPair< int, int > EWPos; + + void setErrorString( QString const & func, EB_Error_Code code ); + + EB_Book book; + EB_Appendix appendix; + EB_Hookset hookSet, refHookSet; + EB_Subbook_Code subBookList[ EB_MAX_SUBBOOKS ]; + EB_Subbook_Code subAppendixList[ EB_MAX_SUBBOOKS ]; + EB_Position currentPosition, indexHeadwordsPosition; + int subBookCount, subAppendixCount; + int currentSubBook; + QString error_string; + QString mainCacheDir, rootDir; + QString cacheImagesDir, cacheSoundsDir, cacheMoviesDir, cacheFontsDir; + QString dictID; + QTextCodec * codec_ISO, * codec_GB, * codec_Euc; + QStack< unsigned int > decorationStack; + int monoWidth, monoHeight; + QStringList imageCacheList, soundsCacheList, moviesCacheList, fontsCacheList; + QMap< QString, QString > baseFontsMap, customFontsMap; + QVector< int > refPages, refOffsets; + QMap< QString, EWPos > allHeadwordPositions; + QVector< EWPos > LinksQueue; + int refOpenCount, refCloseCount; + static Mutex libMutex; + + QString createCacheDir( QString const & dir); + + // Close unslosed tags + void finalizeText( QString & text ); + + // Reset internal variables + void prepareToRead(); + + // Retrieve references from article + void getReferencesFromText( int page, int offset ); + + // Move to next article + EB_Error_Code forwardText( EB_Position & startPos ); + + // Retrieve article text from dictionary + QString getText( int page, int offset, bool text_only ); + + unsigned int normalizeDecorationCode( unsigned int code ); + + QByteArray codeToUnicode( QString const & code ); + +public: + + enum DecorationCodes { + UNKNOWN = 0, + ITALIC = 1, + BOLD = 3, + EMPHASIS = 4, + SUBSCRIPT = 5, + SUPERSCRIPT = 6 + }; + + EpwingBook(); + ~EpwingBook(); + + Mutex & getLibMutex() + { return libMutex; } + + QString const &errorString() const + { return error_string; } + + QTextCodec * codecISO() + { return codec_ISO; } + + QTextCodec * codecGB() + { return codec_GB; } + + QTextCodec *codecEuc() + { return codec_Euc; } + + int getSubBookCount() + { return subBookCount; } + + void setDictID( const string & id ) + { dictID = QString::fromUtf8( id.c_str() ); } + + QString const & getImagesCacheDir() + { return cacheImagesDir; } + + QString const & getSoundsCacheDir() + { return cacheSoundsDir; } + + QString const & getMoviesCacheDir() + { return cacheMoviesDir; } + + void clearBuffers() + { + allHeadwordPositions.clear(); + LinksQueue.clear(); + } + + + // Make name for resource + QString makeFName( QString const & ext, int page, int offset ) const; + + // Store all files in Epwing folder + static void collectFilenames( QString const & directory, + vector< string > & files ); + + // Initialize dictionary book + int setBook( string const & directory ); + + // Set subbook inside dictionary + bool setSubBook( int book_nom ); + + void setCacheDirectory( QString const & cacheDir ); + + QString getCurrentSubBookDirectory(); + + QString copyright(); + QString title(); + + // Seek to first article + void getFirstHeadword( EpwingHeadword & head ); + + // Find next headword and article position + bool getNextHeadword( EpwingHeadword & head ); + + bool readHeadword( EB_Position const & pos, + QString & headword, + bool text_only ); + + bool isHeadwordCorrect( QString const & headword ); + + void fixHeadword( QString & headword ); + + // Retrieve article from dictionary + void getArticle( QString & headword, QString & articleText, + int page, int offset, bool text_only ); + + const char * beginDecoration( unsigned int code ); + const char * endDecoration( unsigned int code ); + + QByteArray handleColorImage( EB_Hook_Code code, + const unsigned int * argv ); + + QByteArray handleMonoImage( EB_Hook_Code code, + const unsigned int * argv ); + + QByteArray handleWave( EB_Hook_Code code, + const unsigned int * argv ); + + QByteArray handleMpeg( EB_Hook_Code code, + const unsigned int * argv ); + + QByteArray handleNarrowFont( const unsigned int * argv, + bool text_only ); + + QByteArray handleWideFont( const unsigned int * argv, + bool text_only ); + + QByteArray handleReference( EB_Hook_Code code, + const unsigned int * argv ); + + bool getMatches( QString word, QVector< QString > & matches ); + + bool getArticlePos( QString word, QVector< int > & pages, QVector< int > & offsets ); +}; + +struct EContainer +{ + EpwingBook * book; + bool textOnly; + + EContainer( EpwingBook * book_ ) : + book( book_ ), + textOnly( false ) + {} + + EContainer( EpwingBook * book_, bool text_only ) : + book( book_ ), + textOnly( text_only ) + {} +}; + + +} + +} + + +#endif // __EPWING_BOOK_HH_INCLUDED__ diff -Nru goldendict-1.5.0~git20131003/epwing.cc goldendict-1.5.0~git20150923/epwing.cc --- goldendict-1.5.0~git20131003/epwing.cc 1970-01-01 00:00:00.000000000 +0000 +++ goldendict-1.5.0~git20150923/epwing.cc 2015-09-23 08:26:24.000000000 +0000 @@ -0,0 +1,1185 @@ +/* This file is (c) 2014 Abs62 + * Part of GoldenDict. Licensed under GPLv3 or later, see the LICENSE file */ + +#include "epwing_book.hh" +#include "epwing.hh" + +#include +#include +#include +#include + +#include +#include +#include + +#include "btreeidx.hh" +#include "folding.hh" +#include "gddebug.hh" +#include "fsencoding.hh" +#include "chunkedstorage.hh" +#include "wstring.hh" +#include "wstring_qt.hh" +#include "utf8.hh" +#include "filetype.hh" +#include "ftshelpers.hh" +#include "btreeidx.hh" + +namespace Epwing { + +using BtreeIndexing::WordArticleLink; +using BtreeIndexing::IndexedWords; +using BtreeIndexing::IndexInfo; + +using std::map; +using std::multimap; +using std::vector; +using std::set; +using std::pair; +using gd::wstring; + +namespace { + +#pragma pack( push, 1 ) + +enum +{ + Signature = 0x58575045, // EPWX on little-endian, XWPE on big-endian + CurrentFormatVersion = 5 + BtreeIndexing::FormatVersion + Folding::Version +}; + +struct IdxHeader +{ + quint32 signature; // First comes the signature, EPWX + quint32 formatVersion; // File format version (CurrentFormatVersion) + quint32 chunksOffset; // The offset to chunks' storage + quint32 indexBtreeMaxElements; // Two fields from IndexInfo + quint32 indexRootOffset; + quint32 wordCount; + quint32 articleCount; + quint32 nameSize; + quint32 langFrom; // Source language + quint32 langTo; // Target language +} +#ifndef _MSC_VER +__attribute__((packed)) +#endif +; + +#pragma pack( pop ) + +bool indexIsOldOrBad( string const & indexFile ) +{ + File::Class idx( indexFile, "rb" ); + + IdxHeader header; + + return idx.readRecords( &header, sizeof( header ), 1 ) != 1 || + header.signature != Signature || + header.formatVersion != CurrentFormatVersion; +} + +class EpwingDictionary: public BtreeIndexing::BtreeDictionary +{ + Mutex idxMutex; + File::Class idx; + IdxHeader idxHeader; + string bookName; + ChunkedStorage::Reader chunks; + Epwing::Book::EpwingBook eBook; + QString cacheDirectory; + +public: + + EpwingDictionary( string const & id, string const & indexFile, + vector< string > const & dictionaryFiles, + int subBook ); + + ~EpwingDictionary(); + + virtual string getName() throw() + { return bookName; } + + virtual map< Dictionary::Property, string > getProperties() throw() + { return map< Dictionary::Property, string >(); } + + virtual unsigned long getArticleCount() throw() + { return idxHeader.articleCount; } + + virtual unsigned long getWordCount() throw() + { return idxHeader.wordCount; } + + inline virtual quint32 getLangFrom() const + { return idxHeader.langFrom; } + + inline virtual quint32 getLangTo() const + { return idxHeader.langTo; } + + virtual QString const& getDescription(); + + virtual sptr< Dictionary::DataRequest > getArticle( wstring const &, + vector< wstring > const & alts, + wstring const & ) + throw( std::exception ); + + virtual sptr< Dictionary::DataRequest > getResource( string const & name ) + throw( std::exception ); + + virtual sptr< Dictionary::DataRequest > getSearchResults( QString const & searchString, + int searchMode, bool matchCase, + int distanceBetweenWords, + int maxResults ); + virtual void getArticleText( uint32_t articleAddress, QString & headword, QString & text ); + + virtual void makeFTSIndex(QAtomicInt & isCancelled, bool firstIteration ); + + virtual void setFTSParameters( Config::FullTextSearch const & fts ) + { + if( ensureInitDone().size() ) + return; + + can_FTS = fts.enabled + && !fts.disabledTypes.contains( "EPWING", Qt::CaseInsensitive ) + && ( fts.maxDictionarySize == 0 || getArticleCount() <= fts.maxDictionarySize ); + } + + static int japaneseWriting( gd::wchar ch ); + + static bool isSign( gd::wchar ch ); + + static bool isJapanesePunctiation( gd::wchar ch ); + + virtual sptr< Dictionary::WordSearchRequest > prefixMatch( wstring const &, + unsigned long ) + throw( std::exception ); + + virtual sptr< Dictionary::WordSearchRequest > stemmedMatch( wstring const &, + unsigned minLength, + unsigned maxSuffixVariation, + unsigned long maxResults ) + throw( std::exception ); + +protected: + + void loadIcon() throw(); + +private: + + /// Loads the article. + void loadArticle( quint32 address, string & articleHeadword, + string & articleText, int & articlePage, int & articleOffset ); + + void loadArticle( int articlePage, int articleOffset, string & articleHeadword, + string & articleText ); + + void createCacheDirectory(); + + void removeDirectory( QString const & directory ); + + QString const & getImagesCacheDir() + { return eBook.getImagesCacheDir(); } + + QString const & getSoundsCacheDir() + { return eBook.getSoundsCacheDir(); } + + QString const & getMoviesCacheDir() + { return eBook.getMoviesCacheDir(); } + + friend class EpwingArticleRequest; + friend class EpwingResourceRequest; + friend class EpwingWordSearchRequest; +}; + + +EpwingDictionary::EpwingDictionary( string const & id, + string const & indexFile, + vector< string > const & dictionaryFiles, + int subBook ): + BtreeDictionary( id, dictionaryFiles ), + idx( indexFile, "rb" ), + idxHeader( idx.read< IdxHeader >() ), + chunks( idx, idxHeader.chunksOffset ) +{ + vector< char > data( idxHeader.nameSize ); + idx.seek( sizeof( idxHeader ) ); + idx.read( &data.front(), idxHeader.nameSize ); + bookName = string( &data.front(), idxHeader.nameSize ); + + // Initialize eBook + + eBook.setBook( dictionaryFiles[ 0 ] ); + eBook.setSubBook( subBook ); + + // Initialize the index + + openIndex( IndexInfo( idxHeader.indexBtreeMaxElements, + idxHeader.indexRootOffset ), + idx, idxMutex ); + + eBook.setDictID( getId() ); + + cacheDirectory = QDir::tempPath() + QDir::separator() + + QString::fromUtf8( getId().c_str() ) + + ".cache"; + eBook.setCacheDirectory( cacheDirectory ); + + // Full-text search parameters + + can_FTS = true; + + ftsIdxName = indexFile + "_FTS"; + + if( !Dictionary::needToRebuildIndex( dictionaryFiles, ftsIdxName ) + && !FtsHelpers::ftsIndexIsOldOrBad( ftsIdxName, this ) ) + FTS_index_completed.ref(); +} + +EpwingDictionary::~EpwingDictionary() +{ + removeDirectory( cacheDirectory ); +} + +void EpwingDictionary::loadIcon() throw() +{ + if ( dictionaryIconLoaded ) + return; + + QString fileName = FsEncoding::decode( getDictionaryFilenames()[ 0 ].c_str() ) + + QDir::separator() + + eBook.getCurrentSubBookDirectory() + "."; + + if( !fileName.isEmpty() ) + loadIconFromFile( fileName ); + + if( dictionaryIcon.isNull() ) + { + // Load failed -- use default icons + dictionaryNativeIcon = dictionaryIcon = QIcon(":/icons/icon32_epwing.png"); + } + + dictionaryIconLoaded = true; +} + +void EpwingDictionary::removeDirectory( QString const & directory ) +{ + QDir dir( directory ); + Q_FOREACH( QFileInfo info, dir.entryInfoList( QDir::NoDotAndDotDot + | QDir::AllDirs + | QDir::Files, + QDir::DirsFirst)) + { + if( info.isDir() ) + removeDirectory( info.absoluteFilePath() ); + else + QFile::remove( info.absoluteFilePath() ); + } + + dir.rmdir( directory ); +} + +void EpwingDictionary::loadArticle( quint32 address, + string & articleHeadword, + string & articleText, + int & articlePage, + int & articleOffset ) +{ + vector< char > chunk; + + char * articleProps; + + { + Mutex::Lock _( idxMutex ); + articleProps = chunks.getBlock( address, chunk ); + } + + memcpy( &articlePage, articleProps, sizeof( articlePage ) ); + memcpy( &articleOffset, articleProps + sizeof( articlePage ), + sizeof( articleOffset ) ); + + QString headword, text; + + try + { + Mutex::Lock _( eBook.getLibMutex() ); + eBook.getArticle( headword, text, articlePage, articleOffset, false ); + } + catch( std::exception & e ) + { + text = QString( "Article reading error: %1") + .arg( QString::fromUtf8( e.what() ) ); + } + + articleHeadword = string( headword.toUtf8().data() ); + articleText = string( text.toUtf8().data() ); + + string prefix( "
" ); + + articleText = prefix + articleText + "
"; +} + +void EpwingDictionary::loadArticle( int articlePage, + int articleOffset, + string & articleHeadword, + string & articleText ) +{ + QString headword, text; + + try + { + Mutex::Lock _( eBook.getLibMutex() ); + eBook.getArticle( headword, text, articlePage, articleOffset, false ); + } + catch( std::exception & e ) + { + text = QString( "Article reading error: %1") + .arg( QString::fromUtf8( e.what() ) ); + } + + articleHeadword = string( headword.toUtf8().data() ); + articleText = string( text.toUtf8().data() ); + + string prefix( "
" ); + + articleText = prefix + articleText + "
"; +} + +QString const& EpwingDictionary::getDescription() +{ + if( !dictionaryDescription.isEmpty() ) + return dictionaryDescription; + + dictionaryDescription = "NONE"; + + QString str; + { + Mutex::Lock _( eBook.getLibMutex() ); + str = eBook.copyright(); + } + + if( !str.isEmpty() ) + dictionaryDescription = str; + + return dictionaryDescription; +} + +void EpwingDictionary::makeFTSIndex( QAtomicInt & isCancelled, bool firstIteration ) +{ + if( !( Dictionary::needToRebuildIndex( getDictionaryFilenames(), ftsIdxName ) + || FtsHelpers::ftsIndexIsOldOrBad( ftsIdxName, this ) ) ) + FTS_index_completed.ref(); + + + if( haveFTSIndex() ) + return; + + if( firstIteration && getArticleCount() > FTS::MaxDictionarySizeForFastSearch ) + return; + + gdDebug( "Epwing: Building the full-text index for dictionary: %s\n", + getName().c_str() ); + + try + { + FtsHelpers::makeFTSIndex( this, isCancelled ); + FTS_index_completed.ref(); + } + catch( std::exception &ex ) + { + gdWarning( "Epwing: Failed building full-text search index for \"%s\", reason: %s\n", getName().c_str(), ex.what() ); + QFile::remove( FsEncoding::decode( ftsIdxName.c_str() ) ); + } +} + +void EpwingDictionary::getArticleText( uint32_t articleAddress, QString & headword, QString & text ) +{ + headword.clear(); + text.clear(); + + vector< char > chunk; + char * articleProps; + + { + Mutex::Lock _( idxMutex ); + articleProps = chunks.getBlock( articleAddress, chunk ); + } + + uint32_t articlePage, articleOffset; + + memcpy( &articlePage, articleProps, sizeof( articlePage ) ); + memcpy( &articleOffset, articleProps + sizeof( articlePage ), + sizeof( articleOffset ) ); + + try + { + Mutex::Lock _( eBook.getLibMutex() ); + eBook.getArticle( headword, text, articlePage, articleOffset, true ); + } + catch( std::exception & e ) + { + text = QString( "Article reading error: %1") + .arg( QString::fromUtf8( e.what() ) ); + } +} + +/// EpwingDictionary::getArticle() + +class EpwingArticleRequest; + +class EpwingArticleRequestRunnable: public QRunnable +{ + EpwingArticleRequest & r; + QSemaphore & hasExited; + +public: + + EpwingArticleRequestRunnable( EpwingArticleRequest & r_, + QSemaphore & hasExited_ ): r( r_ ), + hasExited( hasExited_ ) + {} + + ~EpwingArticleRequestRunnable() + { + hasExited.release(); + } + + virtual void run(); +}; + +class EpwingArticleRequest: public Dictionary::DataRequest +{ + friend class EpwingArticleRequestRunnable; + + wstring word; + vector< wstring > alts; + EpwingDictionary & dict; + + QAtomicInt isCancelled; + QSemaphore hasExited; + +public: + + EpwingArticleRequest( wstring const & word_, + vector< wstring > const & alts_, + EpwingDictionary & dict_ ): + word( word_ ), alts( alts_ ), dict( dict_ ) + { + QThreadPool::globalInstance()->start( + new EpwingArticleRequestRunnable( *this, hasExited ) ); + } + + void run(); // Run from another thread by EpwingArticleRequestRunnable + + virtual void cancel() + { + isCancelled.ref(); + } + + ~EpwingArticleRequest() + { + isCancelled.ref(); + hasExited.acquire(); + } +}; + +void EpwingArticleRequestRunnable::run() +{ + r.run(); +} + +void EpwingArticleRequest::run() +{ + if ( isCancelled ) + { + finish(); + return; + } + + vector< WordArticleLink > chain = dict.findArticles( word ); + + for( unsigned x = 0; x < alts.size(); ++x ) + { + /// Make an additional query for each alt + + vector< WordArticleLink > altChain = dict.findArticles( alts[ x ] ); + + chain.insert( chain.end(), altChain.begin(), altChain.end() ); + } + + multimap< wstring, pair< string, string > > mainArticles, alternateArticles; + + set< quint32 > articlesIncluded; // Some synonims make it that the articles + // appear several times. We combat this + // by only allowing them to appear once. + + wstring wordCaseFolded = Folding::applySimpleCaseOnly( word ); + + QVector< int > pages, offsets; + + for( unsigned x = 0; x < chain.size(); ++x ) + { + if ( isCancelled ) + { + finish(); + return; + } + + if ( articlesIncluded.find( chain[ x ].articleOffset ) != articlesIncluded.end() ) + continue; // We already have this article in the body. + + // Now grab that article + + string headword, articleText; + int articlePage, articleOffset; + + try + { + dict.loadArticle( chain[ x ].articleOffset, headword, articleText, + articlePage, articleOffset ); + } + catch(...) + { + } + + pages.append( articlePage ); + offsets.append( articleOffset ); + + // Ok. Now, does it go to main articles, or to alternate ones? We list + // main ones first, and alternates after. + + // We do the case-folded comparison here. + + wstring headwordStripped = + Folding::applySimpleCaseOnly( Utf8::decode( headword ) ); + + multimap< wstring, pair< string, string > > & mapToUse = + ( wordCaseFolded == headwordStripped ) ? + mainArticles : alternateArticles; + + mapToUse.insert( pair< wstring, pair< string, string > >( + Folding::applySimpleCaseOnly( Utf8::decode( headword ) ), + pair< string, string >( headword, articleText ) ) ); + + articlesIncluded.insert( chain[ x ].articleOffset ); + } + + // Also try to find word in the built-in dictionary index + try + { + string headword, articleText; + + QVector< int > pg, off; + { + Mutex::Lock _( dict.eBook.getLibMutex() ); + dict.eBook.getArticlePos( gd::toQString( word ), pg, off ); + } + + for( int i = 0; i < pg.size(); i++ ) + { + bool already = false; + for( int n = 0; n < pages.size(); n++ ) + { + if( pages.at( n ) == pg.at( i ) + && abs( offsets.at( n ) - off.at( i ) ) <= 4 ) + { + already = true; + break; + } + } + + if( !already ) + { + dict.loadArticle( pg.at( i ), off.at( i ), headword, articleText ); + + mainArticles.insert( pair< wstring, pair< string, string > >( + Folding::applySimpleCaseOnly( Utf8::decode( headword ) ), + pair< string, string >( headword, articleText ) ) ); + + pages.append( pg.at( i ) ); + offsets.append( off.at( i ) ); + } + } + } + catch(...) + { + } + + if ( mainArticles.empty() && alternateArticles.empty() ) + { + // No such word + finish(); + return; + } + + string result = ""; + + multimap< wstring, pair< string, string > >::const_iterator i; + + for( i = mainArticles.begin(); i != mainArticles.end(); ++i ) + { + result += "

"; + result += i->second.first; + result += "

"; + result += i->second.second; + } + + for( i = alternateArticles.begin(); i != alternateArticles.end(); ++i ) + { + result += "

"; + result += i->second.first; + result += "

"; + result += i->second.second; + } + + result += "
"; + + Mutex::Lock _( dataMutex ); + + data.resize( result.size() ); + + memcpy( &data.front(), result.data(), result.size() ); + + hasAnyData = true; + + finish(); +} + +sptr< Dictionary::DataRequest > EpwingDictionary::getArticle( wstring const & word, + vector< wstring > const & alts, + wstring const & ) + throw( std::exception ) +{ + return new EpwingArticleRequest( word, alts, *this ); +} + +//// EpwingDictionary::getResource() + +class EpwingResourceRequest; + +class EpwingResourceRequestRunnable: public QRunnable +{ + EpwingResourceRequest & r; + QSemaphore & hasExited; + +public: + + EpwingResourceRequestRunnable( EpwingResourceRequest & r_, + QSemaphore & hasExited_ ): r( r_ ), + hasExited( hasExited_ ) + {} + + ~EpwingResourceRequestRunnable() + { + hasExited.release(); + } + + virtual void run(); +}; + +class EpwingResourceRequest: public Dictionary::DataRequest +{ + friend class EpwingResourceRequestRunnable; + + EpwingDictionary & dict; + + string resourceName; + + QAtomicInt isCancelled; + QSemaphore hasExited; + +public: + + EpwingResourceRequest( EpwingDictionary & dict_, + string const & resourceName_ ): + dict( dict_ ), + resourceName( resourceName_ ) + { + QThreadPool::globalInstance()->start( + new EpwingResourceRequestRunnable( *this, hasExited ) ); + } + + void run(); // Run from another thread by EpwingResourceRequestRunnable + + virtual void cancel() + { + isCancelled.ref(); + } + + ~EpwingResourceRequest() + { + isCancelled.ref(); + hasExited.acquire(); + } +}; + +void EpwingResourceRequestRunnable::run() +{ + r.run(); +} + +void EpwingResourceRequest::run() +{ + // Some runnables linger enough that they are cancelled before they start + if ( isCancelled ) + { + finish(); + return; + } + + QString cacheDir; + { + Mutex::Lock _( dict.eBook.getLibMutex() ); + if( Filetype::isNameOfPicture( resourceName ) ) + cacheDir = dict.getImagesCacheDir(); + else + if( Filetype::isNameOfSound( resourceName ) ) + cacheDir = dict.getSoundsCacheDir(); + else + if( Filetype::isNameOfVideo( resourceName ) ) + cacheDir = dict.getMoviesCacheDir(); + } + + try + { + if( cacheDir.isEmpty() ) + { + finish(); + return; + } + + QString fullName = cacheDir + QDir::separator() + + FsEncoding::decode( resourceName.c_str() ); + + QFile f( fullName ); + if( f.open( QFile::ReadOnly ) ) + { + QByteArray buffer = f.readAll(); + + Mutex::Lock _( dataMutex ); + + data.resize( buffer.size() ); + + memcpy( &data.front(), buffer.data(), data.size() ); + + hasAnyData = true; + } + } + catch( std::exception &ex ) + { + gdWarning( "Epwing: Failed loading resource \"%s\" for \"%s\", reason: %s\n", + resourceName.c_str(), dict.getName().c_str(), ex.what() ); + // Resource not loaded -- we don't set the hasAnyData flag then + } + + finish(); +} + +sptr< Dictionary::DataRequest > EpwingDictionary::getResource( string const & name ) + throw( std::exception ) +{ + return new EpwingResourceRequest( *this, name ); +} + + +sptr< Dictionary::DataRequest > EpwingDictionary::getSearchResults( QString const & searchString, + int searchMode, bool matchCase, + int distanceBetweenWords, + int maxResults ) +{ + return new FtsHelpers::FTSResultsRequest( *this, searchString,searchMode, matchCase, distanceBetweenWords, maxResults ); +} + +int EpwingDictionary::japaneseWriting( gd::wchar ch ) +{ + if( ( ch >= 0x30A0 && ch <= 0x30FF ) + || ( ch >= 0x31F0 && ch <= 0x31FF ) + || ( ch >= 0x3200 && ch <= 0x32FF ) + || ( ch >= 0xFF00 && ch <= 0xFFEF ) + || ( ch == 0x1B000 ) ) + return 1; // Katakana + else + if( ( ch >= 0x3040 && ch <= 0x309F ) + || ( ch == 0x1B001 ) ) + return 2; // Hiragana + else + if( ( ch >= 0x4E00 && ch <= 0x9FAF ) + || ( ch >= 0x3400 && ch <= 0x4DBF ) ) + return 3; // Kanji + + return 0; +} + +bool EpwingDictionary::isSign( gd::wchar ch ) +{ + switch( ch ) + { + case 0x002B: // PLUS SIGN + case 0x003C: // LESS-THAN SIGN + case 0x003D: // EQUALS SIGN + case 0x003E: // GREATER-THAN SIGN + case 0x00AC: // NOT SIGN + case 0xFF0B: // FULLWIDTH PLUS SIGN + case 0xFF1C: // FULLWIDTH LESS-THAN SIGN + case 0xFF1D: // FULLWIDTH EQUALS SIGN + case 0xFF1E: // FULLWIDTH GREATER-THAN SIGN + case 0xFFE2: // FULLWIDTH NOT SIGN + return true; + + default: + return false; + } +} + +bool EpwingDictionary::isJapanesePunctiation( gd::wchar ch ) +{ + return ch >= 0x3000 && ch <= 0x303F; +} + +class EpwingWordSearchRequest; + +class EpwingWordSearchRunnable: public QRunnable +{ + EpwingWordSearchRequest & r; + QSemaphore & hasExited; + +public: + + EpwingWordSearchRunnable( EpwingWordSearchRequest & r_, + QSemaphore & hasExited_ ): r( r_ ), + hasExited( hasExited_ ) + {} + + ~EpwingWordSearchRunnable() + { + hasExited.release(); + } + + virtual void run(); +}; + +class EpwingWordSearchRequest: public BtreeIndexing::BtreeWordSearchRequest +{ + friend class EpwingWordSearchRunnable; + + EpwingDictionary & edict; + +public: + + EpwingWordSearchRequest( EpwingDictionary & dict_, + wstring const & str_, + unsigned minLength_, + int maxSuffixVariation_, + bool allowMiddleMatches_, + unsigned long maxResults_ ): + BtreeWordSearchRequest( dict_, str_, minLength_, maxSuffixVariation_, allowMiddleMatches_, maxResults_, false ), + edict( dict_ ) + { + QThreadPool::globalInstance()->start( + new EpwingWordSearchRunnable( *this, hasExited ) ); + } + + virtual void findMatches(); +}; + +void EpwingWordSearchRunnable::run() +{ + r.run(); +} + +void EpwingWordSearchRequest::findMatches() +{ + BtreeWordSearchRequest::findMatches(); + if ( isCancelled ) + { + finish(); + return; + } + + while( matches.size() < maxResults ) + { + QVector< QString > headwords; + { + Mutex::Lock _( edict.eBook.getLibMutex() ); + if( isCancelled ) + break; + + if( !edict.eBook.getMatches( gd::toQString( str ), headwords ) ) + break; + } + + Mutex::Lock _( dataMutex ); + + for( int i = 0; i < headwords.size(); i++ ) + addMatch( gd::toWString( headwords.at( i ) ) ); + + break; + } + + finish(); +} + +sptr< Dictionary::WordSearchRequest > EpwingDictionary::prefixMatch( + wstring const & str, unsigned long maxResults ) + throw( std::exception ) +{ + return new EpwingWordSearchRequest( *this, str, 0, -1, true, maxResults ); +} + +sptr< Dictionary::WordSearchRequest > EpwingDictionary::stemmedMatch( + wstring const & str, unsigned minLength, unsigned maxSuffixVariation, + unsigned long maxResults ) + throw( std::exception ) +{ + return new EpwingWordSearchRequest( *this, str, minLength, (int)maxSuffixVariation, + false, maxResults ); +} + +} // anonymous namespace + +vector< sptr< Dictionary::Class > > makeDictionaries( + vector< string > const & fileNames, + string const & indicesDir, + Dictionary::Initializing & initializing ) + throw( std::exception ) +{ + vector< sptr< Dictionary::Class > > dictionaries; + + vector< string > dictFiles; + QByteArray catName; + catName += QDir::separator(); + catName += "catalogs"; + + for( vector< string >::const_iterator i = fileNames.begin(); i != fileNames.end(); + ++i ) + { + // Skip files other than "catalogs" to speed up the scanning + + if ( i->size() < (unsigned)catName.size() || + strcasecmp( i->c_str() + ( i->size() - catName.size() ), catName.data() ) != 0 ) + continue; + + int ndir = i->size() - catName.size(); + if( ndir < 1 ) + ndir = 1; + + string mainDirectory = i->substr( 0, ndir ); + + Epwing::Book::EpwingBook dict; + + int subBooksNumber = dict.setBook( mainDirectory ); + + for( int sb = 0; sb < subBooksNumber; sb++ ) + { + QString dir; + + try + { + dictFiles.clear(); + dictFiles.push_back( mainDirectory ); + dictFiles.push_back( *i ); + + dict.setSubBook( sb ); + + dir = FsEncoding::decode( mainDirectory.c_str() ) + + FsEncoding::separator() + + dict.getCurrentSubBookDirectory(); + + Epwing::Book::EpwingBook::collectFilenames( dir, dictFiles ); + + QString fontSubName = FsEncoding::decode( mainDirectory.c_str() ) + + QDir::separator() + + "afonts_" + QString::number( sb ); + QFileInfo info( fontSubName ); + if( info.exists() && info.isFile() ) + dictFiles.push_back( FsEncoding::encode( fontSubName ) ); + + // Check if we need to rebuid the index + + string dictId = Dictionary::makeDictionaryId( dictFiles ); + + string indexFile = indicesDir + dictId; + + if ( Dictionary::needToRebuildIndex( dictFiles, indexFile ) || + indexIsOldOrBad( indexFile ) ) + { + gdDebug( "Epwing: Building the index for dictionary in directory %s\n", dir.toUtf8().data() ); + + QString str = dict.title(); + QByteArray nameData = str.toUtf8(); + initializing.indexingDictionary( nameData.data() ); + + File::Class idx( indexFile, "wb" ); + + IdxHeader idxHeader; + + memset( &idxHeader, 0, sizeof( idxHeader ) ); + + // We write a dummy header first. At the end of the process the header + // will be rewritten with the right values. + + idx.write( idxHeader ); + + idx.write( nameData.data(), nameData.size() ); + idxHeader.nameSize = nameData.size(); + + IndexedWords indexedWords; + + ChunkedStorage::Writer chunks( idx ); + + Epwing::Book::EpwingHeadword head; + + dict.getFirstHeadword( head ); + + int wordCount = 0; + int articleCount = 0; + + for( ; ; ) + { + if( !head.headword.isEmpty() ) + { + uint32_t offset = chunks.startNewBlock(); + chunks.addToBlock( &head.page, sizeof( head.page ) ); + chunks.addToBlock( &head.offset, sizeof( head.offset ) ); + + wstring hw = gd::toWString( head.headword ); + + indexedWords.addWord( hw, offset ); + wordCount++; + articleCount++; + + vector< wstring > words; + + // Parse combined kanji/katakana/hiragana headwords + + int w_prev = 0; + wstring word; + for( wstring::size_type n = 0; n < hw.size(); n++ ) + { + gd::wchar ch = hw[ n ]; + + if( Folding::isPunct( ch ) || Folding::isWhitespace( ch ) + || EpwingDictionary::isSign( ch ) || EpwingDictionary::isJapanesePunctiation( ch ) ) + continue; + + int w = EpwingDictionary::japaneseWriting( ch ); + + if( w > 0 ) + { + // Store only separated words + gd::wchar ch_prev = 0; + if( n ) + ch_prev = hw[ n - 1 ]; + bool needStore = ( n == 0 + || Folding::isPunct( ch_prev ) + || Folding::isWhitespace( ch_prev ) + || EpwingDictionary::isJapanesePunctiation( ch ) ); + + word.push_back( ch ); + w_prev = w; + wstring::size_type i; + for( i = n + 1; i < hw.size(); i++ ) + { + ch = hw[ i ]; + if( Folding::isPunct( ch ) || Folding::isWhitespace( ch ) + || EpwingDictionary::isJapanesePunctiation( ch ) ) + break; + w = EpwingDictionary::japaneseWriting( ch ); + if( w != w_prev ) + break; + word.push_back( ch ); + } + + if( needStore ) + { + if( i >= hw.size() || Folding::isPunct( ch ) || Folding::isWhitespace( ch ) + || EpwingDictionary::isJapanesePunctiation( ch ) ) + words.push_back( word ); + } + word.clear(); + + if( i < hw.size() ) + n = i; + else + break; + } + } + + if( words.size() > 1 ) + { + // Allow only one word in every charset + + size_t n; + int writings[ 4 ]; + memset( writings, 0, sizeof(writings) ); + + for( n = 0; n < words.size(); n++ ) + { + int w = EpwingDictionary::japaneseWriting( words[ n ][ 0 ] ); + if( writings[ w ] ) + break; + else + writings[ w ] = 1; + } + + if( n >= words.size() ) + { + for( n = 0; n < words.size(); n++ ) + { + indexedWords.addWord( words[ n ], offset ); + wordCount++; + } + } + } + + } + if( !dict.getNextHeadword( head ) ) + break; + } + + dict.clearBuffers(); + + // Finish with the chunks + + idxHeader.chunksOffset = chunks.finish(); + + // Build index + + IndexInfo idxInfo = BtreeIndexing::buildIndex( indexedWords, idx ); + + idxHeader.indexBtreeMaxElements = idxInfo.btreeMaxElements; + idxHeader.indexRootOffset = idxInfo.rootOffset; + + indexedWords.clear(); // Release memory -- no need for this data + + // That concludes it. Update the header. + + idxHeader.signature = Signature; + idxHeader.formatVersion = CurrentFormatVersion; + + idxHeader.wordCount = wordCount; + idxHeader.articleCount = articleCount; + + idx.rewind(); + + idx.write( &idxHeader, sizeof( idxHeader ) ); + + + } // If need to rebuild + + dictionaries.push_back( new EpwingDictionary( dictId, + indexFile, + dictFiles, + sb ) ); + } + catch( std::exception & e ) + { + gdWarning( "Epwing dictionary initializing failed: %s, error: %s\n", + dir.toUtf8().data(), e.what() ); + continue; + } + } + + } + return dictionaries; +} + +} // namespace Epwing diff -Nru goldendict-1.5.0~git20131003/epwing_charmap.cc goldendict-1.5.0~git20150923/epwing_charmap.cc --- goldendict-1.5.0~git20131003/epwing_charmap.cc 1970-01-01 00:00:00.000000000 +0000 +++ goldendict-1.5.0~git20150923/epwing_charmap.cc 2015-09-23 08:26:24.000000000 +0000 @@ -0,0 +1,97 @@ +/* This file is (c) 2014 Abs62 + * Part of GoldenDict. Licensed under GPLv3 or later, see the LICENSE file */ + +#include "epwing_charmap.hh" + +namespace Epwing { + +EpwingCharmap & EpwingCharmap::instance() +{ + static EpwingCharmap ec; + return ec; +} + +QByteArray EpwingCharmap::mapToUtf8( QString const & code ) +{ + if( charMap.contains( code ) ) + return QString( charMap[ code ] ).toUtf8(); + + return QByteArray(); +} + +void EpwingCharmap::addEntry( QString const & code, QChar ch ) +{ + charMap[ code ] = ch; +} + +EpwingCharmap::EpwingCharmap() +{ + addEntry( "na121", 0x00E1 ); + addEntry( "na122", 0x00E0 ); + addEntry( "na12a", 0x01DD ); + addEntry( "na12e", 0x00E9 ); + addEntry( "na12f", 0x00E8 ); + addEntry( "na134", 0x00ED ); + addEntry( "na135", 0x00EC ); + addEntry( "na136", 0x00F3 ); + addEntry( "na137", 0x00F2 ); + addEntry( "na13e", 0x00FA ); + addEntry( "na13f", 0x00F9 ); + addEntry( "na143", 0x00E6 ); + addEntry( "na144", 0x01FD ); + addEntry( "na149", 0x0067 ); + addEntry( "na157", 0x00E9 ); + addEntry( "na16a", 0x00C1 ); + addEntry( "na16b", 0x00C0 ); + addEntry( "na16d", 0x00C9 ); + addEntry( "na171", 0x00FD ); + addEntry( "na172", 0x1EF3 ); + addEntry( "na17d", 0x00DA ); + addEntry( "na235", 0x002F ); + addEntry( "na240", 0x0154 ); + addEntry( "na244", 0x0179 ); + addEntry( "na627", 0x00A7 ); + addEntry( "na62b", 0x00AB ); + addEntry( "na637", 0x30FB ); + addEntry( "na63b", 0x00BB ); + addEntry( "na646", 0x00C6 ); + addEntry( "na647", 0x00C7 ); + addEntry( "na649", 0x00C9 ); + addEntry( "na660", 0x00E0 ); + addEntry( "na662", 0x00E2 ); + addEntry( "na664", 0x00E4 ); + addEntry( "na667", 0x00E7 ); + addEntry( "na668", 0x00E8 ); + addEntry( "na669", 0x00E9 ); + addEntry( "na66a", 0x00EA ); + addEntry( "na66b", 0x00EB ); + addEntry( "na66e", 0x00EE ); + addEntry( "na66f", 0x00EF ); + addEntry( "na671", 0x00F1 ); + addEntry( "na674", 0x00F4 ); + addEntry( "na676", 0x00F6 ); + addEntry( "na67b", 0x00FB ); + addEntry( "na67c", 0x00FC ); + addEntry( "na722", 0x0152 ); + addEntry( "na723", 0x0153 ); + addEntry( "na73e", 0x0101 ); + addEntry( "na73f", 0x0103 ); + addEntry( "na740", 0x0113 ); + addEntry( "na741", 0x0115 ); + addEntry( "na742", 0x012B ); + addEntry( "na743", 0x012D ); + addEntry( "na744", 0x014F ); + addEntry( "na746", 0x016B ); + addEntry( "na747", 0x01D4 ); + addEntry( "na74b", 0x0227 ); + addEntry( "na753", 0x1EBD ); + addEntry( "na823", 0x2026 ); + addEntry( "wa424", 0x00E6 ); + addEntry( "wa460", 0x2460 ); + addEntry( "wa461", 0x2461 ); + addEntry( "wa462", 0x2462 ); + addEntry( "wa463", 0x2463 ); + addEntry( "wa464", 0x2464 ); +} + +} // namespace Epwing diff -Nru goldendict-1.5.0~git20131003/epwing_charmap.hh goldendict-1.5.0~git20150923/epwing_charmap.hh --- goldendict-1.5.0~git20131003/epwing_charmap.hh 1970-01-01 00:00:00.000000000 +0000 +++ goldendict-1.5.0~git20150923/epwing_charmap.hh 2015-09-23 08:26:24.000000000 +0000 @@ -0,0 +1,30 @@ +#ifndef __EPWING_CHARMAP_HH_INCLUDED_ +#define __EPWING_CHARMAP_HH_INCLUDED_ + +#include +#include +#include + +namespace Epwing { + +class EpwingCharmap +{ +public: + + /// The class is a singleton. + static EpwingCharmap & instance(); + + /// Map Epwing extra char to Utf-8 + QByteArray mapToUtf8( QString const & code ); + +private: + EpwingCharmap(); + + void addEntry( QString const & code, QChar ch ); + + QMap< QString, QChar > charMap; +}; + +} + +#endif // __EPWING_CHARMAP_HH_INCLUDED_ diff -Nru goldendict-1.5.0~git20131003/epwing.hh goldendict-1.5.0~git20150923/epwing.hh --- goldendict-1.5.0~git20131003/epwing.hh 1970-01-01 00:00:00.000000000 +0000 +++ goldendict-1.5.0~git20150923/epwing.hh 2015-09-23 08:26:24.000000000 +0000 @@ -0,0 +1,19 @@ +#ifndef __EPWING_HH__INCLUDED__ +#define __EPWING_HH__INCLUDED__ + +#include "dictionary.hh" + +/// Support for the Epwing dictionaries. +namespace Epwing { + +using std::vector; +using std::string; + +vector< sptr< Dictionary::Class > > makeDictionaries( + vector< string > const & fileNames, + string const & indicesDir, + Dictionary::Initializing & ) + throw( std::exception ); +} + +#endif // __EPWING_HH__INCLUDED__ diff -Nru goldendict-1.5.0~git20131003/externalviewer.cc goldendict-1.5.0~git20150923/externalviewer.cc --- goldendict-1.5.0~git20131003/externalviewer.cc 2013-08-16 09:41:47.000000000 +0000 +++ goldendict-1.5.0~git20150923/externalviewer.cc 2015-09-23 08:26:24.000000000 +0000 @@ -4,7 +4,7 @@ #include #include "externalviewer.hh" #include "parsecmdline.hh" -#include "dprintf.hh" +#include "gddebug.hh" using std::vector; @@ -29,7 +29,7 @@ tempFile.close(); - DPRINTF( "%s\n", tempFile.fileName().toLocal8Bit().data() ); + GD_DPRINTF( "%s\n", tempFile.fileName().toLocal8Bit().data() ); } void ExternalViewer::start() throw( exCantRunViewer ) diff -Nru goldendict-1.5.0~git20131003/ffmpegaudio.cc goldendict-1.5.0~git20150923/ffmpegaudio.cc --- goldendict-1.5.0~git20131003/ffmpegaudio.cc 2013-08-16 09:45:56.000000000 +0000 +++ goldendict-1.5.0~git20150923/ffmpegaudio.cc 2015-09-23 08:26:24.000000000 +0000 @@ -348,12 +348,21 @@ { if ( packet.stream_index == audioStream_->index ) { + AVPacket pack = packet; int gotFrame = 0; - avcodec_decode_audio4( codecContext_, frame, &gotFrame, &packet ); - if ( !isCancelled_ && gotFrame ) + do { - playFrame( frame ); + int len = avcodec_decode_audio4( codecContext_, frame, &gotFrame, &pack ); + if ( !isCancelled_ && gotFrame ) + { + playFrame( frame ); + } + if( len <= 0 || isCancelled_ ) + break; + pack.size -= len; + pack.data += len; } + while( pack.size > 0 ); } // av_free_packet() must be called after each call to av_read_frame() av_free_packet( &packet ); diff -Nru goldendict-1.5.0~git20131003/file.cc goldendict-1.5.0~git20150923/file.cc --- goldendict-1.5.0~git20131003/file.cc 2013-08-16 09:45:56.000000000 +0000 +++ goldendict-1.5.0~git20150923/file.cc 2015-09-23 08:26:24.000000000 +0000 @@ -18,6 +18,7 @@ #endif #include "ufile.hh" +#include "fsencoding.hh" namespace File { @@ -69,9 +70,31 @@ void Class::open( char const * filename, char const * mode ) throw( exCantOpen ) { - f = gd_fopen( filename, mode ); + QFile::OpenMode openMode = QIODevice::Text; + const char * pch = mode; + while( *pch ) + { + switch( *pch ) + { + case 'r': openMode |= QIODevice::ReadOnly; + break; + case 'w': openMode |= QIODevice::WriteOnly; + break; + case '+': openMode &= ~( QIODevice::ReadOnly | QIODevice::WriteOnly ); + openMode |= QIODevice::ReadWrite; + break; + case 'a': openMode |= QIODevice::Append; + break; + case 'b': openMode &= ~QIODevice::Text; + break; + default: break; + } + ++pch; + } - if ( !f ) + f.setFileName( FsEncoding::decode( filename ) ); + + if ( !f.open( openMode ) ) throw exCantOpen( std::string( filename ) + ": " + strerror( errno ) ); } @@ -87,7 +110,7 @@ open( filename.c_str(), mode ); } -void Class::read( void * buf, size_t size ) throw( exReadError, exWriteError ) +void Class::read( void * buf, qint64 size ) throw( exReadError, exWriteError ) { if ( !size ) return; @@ -95,21 +118,22 @@ if ( writeBuffer ) flushWriteBuffer(); - size_t result = fread( buf, size, 1, f ); + qint64 result = f.read( reinterpret_cast( buf ), size ); - if ( result != 1 ) + if ( result != size ) throw exReadError(); } -size_t Class::readRecords( void * buf, size_t size, size_t count ) throw( exWriteError ) +size_t Class::readRecords( void * buf, qint64 size, size_t count ) throw( exWriteError ) { if ( writeBuffer ) flushWriteBuffer(); - return fread( buf, size, count, f ); + qint64 result = f.read( reinterpret_cast( buf ), size * count ); + return result < 0 ? result : result / size; } -void Class::write( void const * buf, size_t size ) throw( exWriteError ) +void Class::write( void const * buf, qint64 size ) throw( exWriteError, exAllocation ) { if ( !size ) return; @@ -119,9 +143,9 @@ // If the write is large, there's not much point in buffering flushWriteBuffer(); - size_t result = fwrite( buf, size, 1, f ); + qint64 result = f.write( reinterpret_cast( buf ), size ); - if ( result != 1 ) + if ( result != size ) throw exWriteError(); return; @@ -131,6 +155,8 @@ { // Allocate the writing buffer since we don't have any yet writeBuffer = new char[ WriteBufferSize ]; + if( !writeBuffer ) + throw exAllocation(); writeBufferLeft = WriteBufferSize; } @@ -154,12 +180,13 @@ } } -size_t Class::writeRecords( void const * buf, size_t size, size_t count ) +size_t Class::writeRecords( void const * buf, qint64 size, size_t count ) throw( exWriteError ) { flushWriteBuffer(); - return fwrite( buf, size, count, f ); + qint64 result = f.write( reinterpret_cast( buf ), size * count ); + return result < 0 ? result : result / size; } char * Class::gets( char * s, int size, bool stripNl ) @@ -168,11 +195,11 @@ if ( writeBuffer ) flushWriteBuffer(); - char * result = fgets( s, size, f ); + qint64 len = f.readLine( s, size ); + char * result = len > 0 ? s : NULL; if ( result && stripNl ) { - size_t len = strlen( result ); char * last = result + len; @@ -205,7 +232,7 @@ if ( writeBuffer ) flushWriteBuffer(); - if ( fseek( f, offset, SEEK_SET ) != 0 ) + if ( !f.seek( offset ) ) throw exSeekError(); } @@ -214,7 +241,7 @@ if ( writeBuffer ) flushWriteBuffer(); - if ( fseek( f, offset, SEEK_CUR ) != 0 ) + if( !f.seek( f.pos() + offset ) ) throw exSeekError(); } @@ -223,7 +250,7 @@ if ( writeBuffer ) flushWriteBuffer(); - if ( fseek( f, offset, SEEK_END ) != 0 ) + if( !f.seek( f.size() + offset ) ) throw exSeekError(); } @@ -234,7 +261,7 @@ size_t Class::tell() throw( exSeekError ) { - long result = ftell( f ); + qint64 result = f.pos(); if ( result == -1 ) throw exSeekError(); @@ -250,35 +277,25 @@ if ( writeBuffer ) flushWriteBuffer(); - return feof( f ) != 0; + return f.atEnd(); } -FILE * Class::file() throw( exWriteError ) +QFile & Class::file() throw( exWriteError ) { flushWriteBuffer(); return f; } -FILE * Class::release() throw( exWriteError ) -{ - releaseWriteBuffer(); - - FILE * c = f; - - f = 0; - - return c; -} - void Class::close() throw( exWriteError ) { - fclose( release() ); + releaseWriteBuffer(); + f.close(); } Class::~Class() throw() { - if ( f ) + if ( f.isOpen() ) { try { @@ -287,7 +304,7 @@ catch( exWriteError & ) { } - fclose( f ); + f.close(); } } @@ -295,9 +312,9 @@ { if ( writeBuffer && writeBufferLeft != WriteBufferSize ) { - size_t result = fwrite( writeBuffer, WriteBufferSize - writeBufferLeft, 1, f ); + qint64 result = f.write( writeBuffer, WriteBufferSize - writeBufferLeft ); - if ( result != 1 ) + if ( result != WriteBufferSize - writeBufferLeft ) throw exWriteError(); writeBufferLeft = WriteBufferSize; diff -Nru goldendict-1.5.0~git20131003/file.hh goldendict-1.5.0~git20150923/file.hh --- goldendict-1.5.0~git20131003/file.hh 2012-10-01 07:15:20.000000000 +0000 +++ goldendict-1.5.0~git20150923/file.hh 2015-09-23 08:26:24.000000000 +0000 @@ -7,6 +7,7 @@ #include #include #include +#include #include "ex.hh" /// A simple wrapper over FILE * operations with added write-buffering, @@ -19,6 +20,7 @@ DEF_EX( exReadError, "Error reading from the file", Ex ) DEF_EX( exWriteError, "Error writing to the file", Ex ) DEF_EX( exSeekError, "File seek error", Ex ) +DEF_EX( exAllocation, "Memory allocation error", Ex ) /// Checks if the file exists or not. @@ -33,9 +35,9 @@ class Class { - FILE * f; + QFile f; char * writeBuffer; - size_t writeBufferLeft; + qint64 writeBufferLeft; void open( char const * filename, char const * mode ) throw( exCantOpen ); @@ -47,7 +49,7 @@ /// Reads the number of bytes to the buffer, throws an error if it /// failed to fill the whole buffer (short read, i/o error etc). - void read( void * buf, size_t size ) throw( exReadError, exWriteError ); + void read( void * buf, qint64 size ) throw( exReadError, exWriteError ); template< typename T > void read( T & value ) throw( exReadError, exWriteError ) @@ -59,7 +61,7 @@ /// Attempts reading at most 'count' records sized 'size'. Returns /// the number of records it managed to read, up to 'count'. - size_t readRecords( void * buf, size_t size, size_t count ) throw( exWriteError ); + size_t readRecords( void * buf, qint64 size, size_t count ) throw( exWriteError ); /// Writes the number of bytes from the buffer, throws an error if it /// failed to write the whole buffer (short write, i/o error etc). @@ -67,7 +69,7 @@ /// end up on disk immediately, or a short write may occur later /// than it really did. If you don't want write buffering, use /// writeRecords() function instead. - void write( void const * buf, size_t size ) throw( exWriteError ); + void write( void const * buf, qint64 size ) throw( exWriteError, exAllocation ); template< typename T > void write( T const & value ) throw( exWriteError ) @@ -77,7 +79,7 @@ /// the number of records it managed to write, up to 'count'. /// This function does not employ buffering, but flushes the buffer if it /// was used before. - size_t writeRecords( void const * buf, size_t size, size_t count ) + size_t writeRecords( void const * buf, qint64 size, size_t count ) throw( exWriteError ); /// Reads a string from the file. Unlike the normal fgets(), this one @@ -107,11 +109,7 @@ /// Returns the underlying FILE * record, so other operations can be /// performed on it. - FILE * file() throw( exWriteError ); - - /// Releases the file handle out of the control of the class. No further - /// operations are valid. The file will not be closed on destruction. - FILE * release() throw( exWriteError ); + QFile & file() throw( exWriteError ); /// Closes the file. No further operations are valid. void close() throw( exWriteError ); diff -Nru goldendict-1.5.0~git20131003/folding.cc goldendict-1.5.0~git20150923/folding.cc --- goldendict-1.5.0~git20131003/folding.cc 2012-10-01 07:15:20.000000000 +0000 +++ goldendict-1.5.0~git20150923/folding.cc 2015-09-23 08:26:24.000000000 +0000 @@ -2,6 +2,7 @@ * Part of GoldenDict. Licensed under GPLv3 or later, see the LICENSE file */ #include "folding.hh" +#include namespace Folding { @@ -25,7 +26,7 @@ } } -wstring apply( wstring const & in ) +wstring apply( wstring const & in, bool preserveWildcards ) { // First, strip diacritics and apply ws/punctuation removal @@ -41,7 +42,12 @@ { wchar ch = foldDiacritic( nextChar, left, consumed ); - if ( !isCombiningMark( ch ) && !isWhitespace( ch ) && !isPunct( ch ) ) + if ( !isCombiningMark( ch ) && !isWhitespace( ch ) + && ( !isPunct( ch ) + || ( preserveWildcards && + ( ch == '\\' || ch == '?' || ch == '*' || ch == '[' || ch == ']' ) ) + ) + ) withoutDiacritics.push_back( ch ); nextChar += consumed; @@ -659,4 +665,18 @@ } } +QString escapeWildcardSymbols( const QString & str ) +{ + QString escaped( str ); + escaped.replace( QRegExp( "([\\[\\]\\?\\*])", Qt::CaseInsensitive ), "\\\\1" ); + return escaped; +} + +QString unescapeWildcardSymbols( const QString & str ) +{ + QString unescaped( str ); + unescaped.replace( QRegExp( "\\\\([\\[\\]\\?\\*])", Qt::CaseInsensitive ), "\\1" ); + return unescaped; +} + } diff -Nru goldendict-1.5.0~git20131003/folding.hh goldendict-1.5.0~git20150923/folding.hh --- goldendict-1.5.0~git20131003/folding.hh 2012-10-01 07:15:20.000000000 +0000 +++ goldendict-1.5.0~git20150923/folding.hh 2015-09-23 08:26:24.000000000 +0000 @@ -5,6 +5,7 @@ #define __FOLDING_HH_INCLUDED__ #include "wstring.hh" +#include /// Folding provides means to translate several possible ways to write a /// symbol into one. This facilitates searching. Here we currently perform @@ -28,7 +29,7 @@ /// Applies the folding algorithm to each character in the given string, /// making another one as a result. -wstring apply( wstring const & ); +wstring apply( wstring const &, bool preserveWildcards = false ); /// Applies only simple case folding algorithm. Since many dictionaries have /// different case style, we interpret words differing only by case as synonyms. @@ -78,6 +79,12 @@ /// generation would be too slow. //ssize_t apply( wchar const * in, wchar * out, size_t outSize ); +/// Unescape all wildcard symbols (for exast search) +QString unescapeWildcardSymbols( QString const & ); + +/// Escape all wildcard symbols (for place word to input line) +QString escapeWildcardSymbols( QString const & ); + } #endif diff -Nru goldendict-1.5.0~git20131003/forvo.cc goldendict-1.5.0~git20150923/forvo.cc --- goldendict-1.5.0~git20131003/forvo.cc 2013-10-02 20:42:04.000000000 +0000 +++ goldendict-1.5.0~git20150923/forvo.cc 2015-09-23 08:26:24.000000000 +0000 @@ -14,7 +14,7 @@ #include "language.hh" #include "langcoder.hh" #include "utf8.hh" -#include "dprintf.hh" +#include "gddebug.hh" namespace Forvo { @@ -153,7 +153,7 @@ void ForvoArticleRequest::addQuery( QNetworkAccessManager & mgr, wstring const & str ) { - qDebug() << "Forvo: requesting article" << gd::toQString( str ); + gdDebug( "Forvo: requesting article %s\n", gd::toQString( str ).toUtf8().data() ); QString key; @@ -181,7 +181,7 @@ void ForvoArticleRequest::requestFinished( QNetworkReply * r ) { - DPRINTF( "Finished.\n" ); + GD_DPRINTF( "Finished.\n" ); if ( isFinished() ) // Was cancelled return; @@ -350,7 +350,7 @@ setErrorString( text ); } } - DPRINTF( "done.\n" ); + GD_DPRINTF( "done.\n" ); } else setErrorString( netReply->errorString() ); diff -Nru goldendict-1.5.0~git20131003/ftshelpers.cc goldendict-1.5.0~git20150923/ftshelpers.cc --- goldendict-1.5.0~git20131003/ftshelpers.cc 1970-01-01 00:00:00.000000000 +0000 +++ goldendict-1.5.0~git20150923/ftshelpers.cc 2015-09-23 08:26:24.000000000 +0000 @@ -0,0 +1,856 @@ +/* This file is (c) 2014 Abs62 + * Part of GoldenDict. Licensed under GPLv3 or later, see the LICENSE file */ + +#include "fulltextsearch.hh" +#include "ftshelpers.hh" +#include "wstring_qt.hh" +#include "file.hh" +#include "gddebug.hh" + +#include +#include + +using std::vector; +using std::string; + +DEF_EX( exUserAbort, "User abort", Dictionary::Ex ) + +namespace FtsHelpers +{ + +bool ftsIndexIsOldOrBad( string const & indexFile, + BtreeIndexing::BtreeDictionary * dict ) +{ + File::Class idx( indexFile, "rb" ); + + FtsIdxHeader header; + + return idx.readRecords( &header, sizeof( header ), 1 ) != 1 || + header.signature != FtsSignature || + header.formatVersion != CurrentFtsFormatVersion + dict->getFtsIndexVersion(); +} + +bool parseSearchString( QString const & str, QStringList & indexWords, + QStringList & searchWords, + QRegExp & searchRegExp, int searchMode, + bool matchCase, + int distanceBetweenWords, + bool & hasCJK ) +{ + searchWords.clear(); + indexWords.clear(); + QRegExp spacesRegExp( "\\W+" ); + QRegExp wordRegExp( QString( "\\w{" ) + QString::number( FTS::MinimumWordSize ) + ",}" ); + QRegExp setsRegExp( "\\[[^\\]]+\\]", Qt::CaseInsensitive, QRegExp::RegExp2 ); + + hasCJK = false; + for( int x = 0; x < str.size(); x++ ) + if( isCJKChar( str.at( x ).unicode() ) ) + { + hasCJK = true; + break; + } + + if( searchMode == FTS::WholeWords || searchMode == FTS::PlainText ) + { + if( hasCJK ) + return false; + + // Make words list for search in article text + searchWords = str.normalized( QString::NormalizationForm_C ) + .split( spacesRegExp, QString::SkipEmptyParts ); + + // Make words list for index search + QStringList list = str.normalized( QString::NormalizationForm_C ) + .toLower().split( spacesRegExp, QString::SkipEmptyParts ); + indexWords = list.filter( wordRegExp ); + indexWords.removeDuplicates(); + + // Make regexp for results hilite + + QStringList allWords = str.split( spacesRegExp, QString::SkipEmptyParts ); + QString searchString( "(" ); + + QString stripWords( "(?:\\W+\\w+){0," ); + if( distanceBetweenWords >= 0 ) + stripWords += QString::number( distanceBetweenWords ); + stripWords += "}\\W+"; + + QString boundWord( searchMode == FTS::WholeWords ? "\\b" : "(?:\\w*)"); + + for( int x = 0; x < allWords.size(); x++ ) + { + if( x ) + searchString += stripWords; + + searchString += boundWord + allWords[ x ] + boundWord; + } + + searchString += ")"; + + searchRegExp = QRegExp( searchString, matchCase ? Qt::CaseSensitive : Qt::CaseInsensitive, + QRegExp::RegExp2 ); + searchRegExp.setMinimal( true ); + + return !indexWords.isEmpty(); + } + else + { + // Make words list for index search + + QString tmp = str; + + // Remove all symbol sets + tmp.replace( setsRegExp, " " ); + + QStringList list = tmp.normalized( QString::NormalizationForm_C ) + .toLower().split( spacesRegExp, QString::SkipEmptyParts ); + + if( hasCJK ) + { + QStringList wordList, hieroglyphList; + for( int i = 0; i < list.size(); i ++ ) + { + QString word = list.at( i ); + + // Check for CJK symbols in word + bool parsed = false; + QString hieroglyph; + for( int x = 0; x < word.size(); x++ ) + if( isCJKChar( word.at( x ).unicode() ) ) + { + parsed = true; + hieroglyph.append( word[ x ] ); + + if( QChar( word.at( x ) ).isHighSurrogate() + && QChar( word[ x + 1 ] ).isLowSurrogate() ) + hieroglyph.append( word[ ++x ] ); + + hieroglyphList.append( hieroglyph ); + hieroglyph.clear(); + } + + // If word don't contains CJK symbols put it in list as is + if( !parsed ) + wordList.append( word ); + } + + indexWords = wordList.filter( wordRegExp ); + indexWords.removeDuplicates(); + + hieroglyphList.removeDuplicates(); + indexWords += hieroglyphList; + } + else + { + indexWords = list.filter( wordRegExp ); + indexWords.removeDuplicates(); + } + + searchRegExp = QRegExp( str, matchCase ? Qt::CaseSensitive : Qt::CaseInsensitive, + searchMode == FTS::Wildcards ? QRegExp::WildcardUnix : QRegExp::RegExp2 ); + searchRegExp.setMinimal( true ); + } + + return true; +} + +void parseArticleForFts( uint32_t articleAddress, QString & articleText, + QMap< QString, QVector< uint32_t > > & words ) +{ + if( articleText.isEmpty() ) + return; + + QStringList articleWords = articleText.normalized( QString::NormalizationForm_C ) + .split( QRegExp( "\\W+" ), QString::SkipEmptyParts ); + QSet< QString > setOfWords; + + for( int x = 0; x < articleWords.size(); x++ ) + { + QString word = articleWords.at( x ).toLower(); + + bool hasCJK = false; + QString hieroglyph; + + // If word contains CJK symbols we add to index only these symbols separately + for( int y = 0; y < word.size(); y++ ) + if( isCJKChar( word.at( y ).unicode() ) ) + { + hasCJK = true; + hieroglyph.append( word[ y ] ); + + if( QChar( word.at( y ) ).isHighSurrogate() + && QChar( word[ y + 1 ] ).isLowSurrogate() ) + hieroglyph.append( word[ ++y ] ); + + if( !setOfWords.contains( hieroglyph ) ) + { + setOfWords.insert( hieroglyph ); + words[ hieroglyph ].push_back( articleAddress ); + } + + hieroglyph.clear(); + } + + if( !hasCJK ) + { + // Else we add word to index as is + if( word.size() < FTS::MinimumWordSize ) + continue; + + if( !setOfWords.contains( word ) ) + { + setOfWords.insert( word ); + words[ word ].push_back( articleAddress ); + } + } + } +} + +void makeFTSIndex( BtreeIndexing::BtreeDictionary * dict, QAtomicInt & isCancelled ) +{ + Mutex::Lock _( dict->getFtsMutex() ); + + if( isCancelled ) + throw exUserAbort(); + + File::Class ftsIdx( dict->ftsIndexName(), "wb" ); + + FtsIdxHeader ftsIdxHeader; + memset( &ftsIdxHeader, 0, sizeof( ftsIdxHeader ) ); + + // We write a dummy header first. At the end of the process the header + // will be rewritten with the right values. + + ftsIdx.write( ftsIdxHeader ); + + ChunkedStorage::Writer chunks( ftsIdx ); + + BtreeIndexing::IndexedWords indexedWords; + + QSet< uint32_t > setOfOffsets; + + dict->findArticleLinks( 0, &setOfOffsets, 0, &isCancelled ); + + if( isCancelled ) + throw exUserAbort(); + + QVector< uint32_t > offsets; + offsets.resize( setOfOffsets.size() ); + uint32_t * ptr = &offsets.front(); + + for( QSet< uint32_t >::ConstIterator it = setOfOffsets.constBegin(); + it != setOfOffsets.constEnd(); ++it ) + { + *ptr = *it; + ptr++; + } + + // Free memory + setOfOffsets.clear(); + + if( isCancelled ) + throw exUserAbort(); + + qSort( offsets ); + + QMap< QString, QVector< uint32_t > > ftsWords; + + // index articles for full-text search + for( int i = 0; i < offsets.size(); i++ ) + { + if( isCancelled ) + throw exUserAbort(); + + QString headword, articleStr; + + dict->getArticleText( offsets.at( i ), headword, articleStr ); + + parseArticleForFts( offsets.at( i ), articleStr, ftsWords ); + } + + // Free memory + offsets.clear(); + + QMap< QString, QVector< uint32_t > >::iterator it = ftsWords.begin(); + while( it != ftsWords.end() ) + { + if( isCancelled ) + throw exUserAbort(); + + uint32_t offset = chunks.startNewBlock(); + uint32_t size = it.value().size(); + + chunks.addToBlock( &size, sizeof(uint32_t) ); + chunks.addToBlock( it.value().data(), size * sizeof(uint32_t) ); + + indexedWords.addSingleWord( gd::toWString( it.key() ), offset ); + + it = ftsWords.erase( it ); + } + + ftsIdxHeader.chunksOffset = chunks.finish(); + ftsIdxHeader.wordCount = indexedWords.size(); + + if( isCancelled ) + throw exUserAbort(); + + BtreeIndexing::IndexInfo ftsIdxInfo = BtreeIndexing::buildIndex( indexedWords, ftsIdx ); + + // Free memory + indexedWords.clear(); + + ftsIdxHeader.indexBtreeMaxElements = ftsIdxInfo.btreeMaxElements; + ftsIdxHeader.indexRootOffset = ftsIdxInfo.rootOffset; + + ftsIdxHeader.signature = FtsHelpers::FtsSignature; + ftsIdxHeader.formatVersion = FtsHelpers::CurrentFtsFormatVersion + dict->getFtsIndexVersion(); + + ftsIdx.rewind(); + ftsIdx.writeRecords( &ftsIdxHeader, sizeof(ftsIdxHeader), 1 ); +} + +bool isCJKChar( ushort ch ) +{ + if( ( ch >= 0x3400 && ch <= 0x9FFF ) + || ( ch >= 0xF900 && ch <= 0xFAFF ) + || ( ch >= 0xD800 && ch <= 0xDFFF ) ) + return true; + + return false; +} + +void FTSResultsRequestRunnable::run() +{ + r.run(); +} + +void FTSResultsRequest::checkArticles( QVector< uint32_t > const & offsets, + QStringList const & words, + QRegExp const & searchRegexp ) +{ + int results = 0; + QString headword, articleText; + QList< uint32_t > offsetsForHeadwords; + + QString id = QString::fromUtf8( dict.getId().c_str() ); + + if( searchMode == FTS::Wildcards || searchMode == FTS::RegExp ) + { + // RegExp mode + + for( int i = 0; i < offsets.size(); i++ ) + { + if( isCancelled ) + break; + + dict.getArticleText( offsets.at( i ), headword, articleText ); + + if( articleText.contains( searchRegexp ) ) + { + if( headword.isEmpty() ) + offsetsForHeadwords.append( offsets.at( i ) ); + else + foundHeadwords->append( FTS::FtsHeadword( headword, id ) ); + + results++; + if( maxResults > 0 && results >= maxResults ) + break; + } + } + } + else + { + // Words mode + + QRegExp regex( "\\b\\w+\\b" ); + Qt::CaseSensitivity cs = matchCase ? Qt::CaseSensitive : Qt::CaseInsensitive; + + for( int i = 0; i < offsets.size(); i++ ) + { + if( isCancelled ) + break; + + int pos = 0; + int matchWordNom = 0; + int unmatchWordNom = 0; + + dict.getArticleText( offsets.at( i ), headword, articleText ); + + int articleLength = articleText.length(); + while ( pos >= 0 && pos < articleLength ) + { + pos = articleText.indexOf( regex, pos ); + if( pos >= 0 ) + { + QString s = regex.cap().normalized( QString::NormalizationForm_C ); + if( ( searchMode == FTS::WholeWords && s.compare( words.at( matchWordNom ), cs ) == 0 ) + || ( searchMode == FTS::PlainText && s.contains( words.at( matchWordNom ), cs ) ) ) + { + matchWordNom += 1; + + if( matchWordNom >= words.size() ) + break; // All words are found + + unmatchWordNom = 0; + } + else + if( matchWordNom > 0 ) + { + unmatchWordNom += 1; + if( distanceBetweenWords >= 0 && unmatchWordNom > distanceBetweenWords ) + { + matchWordNom = 0; + unmatchWordNom = 0; + } + } + pos += s.isEmpty() ? 1 : s.length(); + } + } + + if( matchWordNom >= words.size() ) + { + if( headword.isEmpty() ) + offsetsForHeadwords.append( offsets.at( i ) ); + else + foundHeadwords->append( FTS::FtsHeadword( headword, id ) ); + + results++; + if( maxResults > 0 && results >= maxResults ) + break; + } + } + } + if( !offsetsForHeadwords.isEmpty() ) + { + QVector< QString > headwords; + dict.getHeadwordsFromOffsets( offsetsForHeadwords, headwords, &isCancelled ); + for( int x = 0; x < headwords.size(); x++ ) + foundHeadwords->append( FTS::FtsHeadword( headwords.at( x ), id ) ); + } +} + +void FTSResultsRequest::indexSearch( BtreeIndexing::BtreeIndex & ftsIndex, + sptr< ChunkedStorage::Reader > chunks, + QStringList & indexWords, + QStringList & searchWords ) +{ + // Find articles which contains all requested words + + vector< BtreeIndexing::WordArticleLink > links; + QSet< uint32_t > setOfOffsets, tmp; + uint32_t size; + + if( indexWords.isEmpty() ) + return; + + int n = indexWords.length(); + for( int i = 0; i < n; i++ ) + { + if( isCancelled ) + return; + + tmp.clear(); + + links = ftsIndex.findArticles( gd::toWString( indexWords.at( i ) ) ); + for( unsigned x = 0; x < links.size(); x++ ) + { + + if( isCancelled ) + return; + + vector< char > chunk; + char * linksPtr; + { + Mutex::Lock _( dict.getFtsMutex() ); + linksPtr = chunks->getBlock( links[ x ].articleOffset, chunk ); + } + + memcpy( &size, linksPtr, sizeof(uint32_t) ); + linksPtr += sizeof(uint32_t); + for( uint32_t y = 0; y < size; y++ ) + { + tmp.insert( *( reinterpret_cast< uint32_t * >( linksPtr ) ) ); + linksPtr += sizeof(uint32_t); + } + } + + links.clear(); + + if( i == 0 ) + setOfOffsets = tmp; + else + setOfOffsets = setOfOffsets.intersect( tmp ); + } + + tmp.clear(); + + if( setOfOffsets.isEmpty() ) + return; + + QVector< uint32_t > offsets; + offsets.resize( setOfOffsets.size() ); + uint32_t * ptr = &offsets.front(); + + for( QSet< uint32_t >::ConstIterator it = setOfOffsets.constBegin(); + it != setOfOffsets.constEnd(); ++it ) + { + *ptr = *it; + ptr++; + } + + setOfOffsets.clear(); + + qSort( offsets ); + + checkArticles( offsets, searchWords ); +} + +void FTSResultsRequest::combinedIndexSearch( BtreeIndexing::BtreeIndex & ftsIndex, + sptr< ChunkedStorage::Reader > chunks, + QStringList & indexWords, + QStringList & searchWords, + QRegExp & regexp ) +{ + // Special case - combination of index search for hieroglyphs + // and full index search for other words + + QSet< uint32_t > setOfOffsets; + uint32_t size; + + if( isCancelled ) + return; + + if( indexWords.isEmpty() ) + return; + + QStringList wordsList, hieroglyphsList; + + for( int x = 0; x < indexWords.size(); x++ ) + { + QString const & word = indexWords.at( x ); + if( isCJKChar( word[ 0 ].unicode() ) ) + hieroglyphsList.append( word ); + else + wordsList.append( word ); + } + + QVector< QSet< uint32_t > > allWordsLinks; + + int n = wordsList.size(); + if( !hieroglyphsList.isEmpty() ) + n += 1; + + allWordsLinks.resize( n ); + int wordNom = 0; + + if( !hieroglyphsList.empty() ) + { + QSet< uint32_t > tmp; + vector< BtreeIndexing::WordArticleLink > links; + + for( int i = 0; i < hieroglyphsList.size(); i++ ) + { + links = ftsIndex.findArticles( gd::toWString( hieroglyphsList.at( i ) ) ); + for( unsigned x = 0; x < links.size(); x++ ) + { + + if( isCancelled ) + return; + + vector< char > chunk; + char * linksPtr; + { + Mutex::Lock _( dict.getFtsMutex() ); + linksPtr = chunks->getBlock( links[ x ].articleOffset, chunk ); + } + + memcpy( &size, linksPtr, sizeof(uint32_t) ); + linksPtr += sizeof(uint32_t); + for( uint32_t y = 0; y < size; y++ ) + { + tmp.insert( *( reinterpret_cast< uint32_t * >( linksPtr ) ) ); + linksPtr += sizeof(uint32_t); + } + } + + links.clear(); + + if( i == 0 ) + setOfOffsets = tmp; + else + setOfOffsets = setOfOffsets.intersect( tmp ); + } + + allWordsLinks[ wordNom ] = setOfOffsets; + setOfOffsets.clear(); + wordNom += 1; + } + + if( !wordsList.isEmpty() ) + { + QVector< BtreeIndexing::WordArticleLink > links; + ftsIndex.findArticleLinks( &links, 0, 0 ); + + for( int x = 0; x < links.size(); x++ ) + { + if( isCancelled ) + return; + + QString word = QString::fromUtf8( links[ x ].word.data(), links[ x ].word.size() ); + for( int i = 0; i < wordsList.size(); i++ ) + { + if( word.length() >= wordsList.at( i ).length() && word.contains( wordsList.at( i ) ) ) + { + vector< char > chunk; + char * linksPtr; + { + Mutex::Lock _( dict.getFtsMutex() ); + linksPtr = chunks->getBlock( links[ x ].articleOffset, chunk ); + } + + memcpy( &size, linksPtr, sizeof(uint32_t) ); + linksPtr += sizeof(uint32_t); + for( uint32_t y = 0; y < size; y++ ) + { + allWordsLinks[ wordNom ].insert( *( reinterpret_cast< uint32_t * >( linksPtr ) ) ); + linksPtr += sizeof(uint32_t); + } + wordNom += 1; + break; + } + } + } + + links.clear(); + } + + for( int i = 0; i < allWordsLinks.size(); i++ ) + { + if( i == 0 ) + setOfOffsets = allWordsLinks.at( i ); + else + setOfOffsets = setOfOffsets.intersect( allWordsLinks.at( i ) ); + } + + if( setOfOffsets.isEmpty() ) + return; + + allWordsLinks.clear(); + + QVector< uint32_t > offsets; + offsets.resize( setOfOffsets.size() ); + uint32_t * ptr = &offsets.front(); + + for( QSet< uint32_t >::ConstIterator it = setOfOffsets.constBegin(); + it != setOfOffsets.constEnd(); ++it ) + { + *ptr = *it; + ptr++; + } + + setOfOffsets.clear(); + + qSort( offsets ); + + checkArticles( offsets, searchWords, regexp ); +} + +void FTSResultsRequest::fullIndexSearch( BtreeIndexing::BtreeIndex & ftsIndex, + sptr< ChunkedStorage::Reader > chunks, + QStringList & indexWords, + QStringList & searchWords, + QRegExp & regexp ) +{ + QSet< uint32_t > setOfOffsets; + uint32_t size; + QVector< BtreeIndexing::WordArticleLink > links; + + if( isCancelled ) + return; + + if( indexWords.isEmpty() ) + return; + + ftsIndex.findArticleLinks( &links, 0, 0 ); + + QVector< QSet< uint32_t > > allWordsLinks; + allWordsLinks.resize( indexWords.size() ); + + for( int x = 0; x < links.size(); x++ ) + { + if( isCancelled ) + return; + + QString word = QString::fromUtf8( links[ x ].word.data(), links[ x ].word.size() ); + for( int i = 0; i < indexWords.size(); i++ ) + { + if( word.length() >= indexWords.at( i ).length() && word.contains( indexWords.at( i ) ) ) + { + vector< char > chunk; + char * linksPtr; + { + Mutex::Lock _( dict.getFtsMutex() ); + linksPtr = chunks->getBlock( links[ x ].articleOffset, chunk ); + } + + memcpy( &size, linksPtr, sizeof(uint32_t) ); + linksPtr += sizeof(uint32_t); + for( uint32_t y = 0; y < size; y++ ) + { + allWordsLinks[ i ].insert( *( reinterpret_cast< uint32_t * >( linksPtr ) ) ); + linksPtr += sizeof(uint32_t); + } + break; + } + } + } + + links.clear(); + + for( int i = 0; i < allWordsLinks.size(); i++ ) + { + if( i == 0 ) + setOfOffsets = allWordsLinks.at( i ); + else + setOfOffsets = setOfOffsets.intersect( allWordsLinks.at( i ) ); + } + + if( setOfOffsets.isEmpty() ) + return; + + allWordsLinks.clear(); + + QVector< uint32_t > offsets; + offsets.resize( setOfOffsets.size() ); + uint32_t * ptr = &offsets.front(); + + for( QSet< uint32_t >::ConstIterator it = setOfOffsets.constBegin(); + it != setOfOffsets.constEnd(); ++it ) + { + *ptr = *it; + ptr++; + } + + setOfOffsets.clear(); + + qSort( offsets ); + + checkArticles( offsets, searchWords, regexp ); +} + +void FTSResultsRequest::fullSearch( QStringList & searchWords, QRegExp & regexp ) +{ + // Whole file survey + + if( isCancelled ) + return; + + QSet< uint32_t > setOfOffsets; + setOfOffsets.reserve( dict.getArticleCount() ); + dict.findArticleLinks( 0, &setOfOffsets, 0 ); + + if( isCancelled ) + return; + + QVector< uint32_t > offsets; + offsets.resize( setOfOffsets.size() ); + uint32_t * ptr = &offsets.front(); + + for( QSet< uint32_t >::ConstIterator it = setOfOffsets.constBegin(); + it != setOfOffsets.constEnd(); ++it ) + { + *ptr = *it; + ptr++; + } + + if( isCancelled ) + return; + + setOfOffsets.clear(); + + qSort( offsets ); + + if( isCancelled ) + return; + + checkArticles( offsets, searchWords, regexp ); +} + +void FTSResultsRequest::run() +{ + if ( dict.ensureInitDone().size() ) + { + setErrorString( QString::fromUtf8( dict.ensureInitDone().c_str() ) ); + finish(); + return; + } + + try + { + QStringList indexWords, searchWords; + QRegExp searchRegExp; + + if( !FtsHelpers::parseSearchString( searchString, indexWords, searchWords, searchRegExp, + searchMode, matchCase, distanceBetweenWords, hasCJK ) ) + { + finish(); + return; + } + + if( dict.haveFTSIndex() && !indexWords.isEmpty() ) + { + FtsIdxHeader ftsIdxHeader; + BtreeIndexing::BtreeIndex ftsIndex; + sptr< ChunkedStorage::Reader > chunks; + + File::Class ftsIdx( dict.ftsIndexName(), "rb" ); + + { + Mutex::Lock _( dict.getFtsMutex() ); + + ftsIdxHeader = ftsIdx.read< FtsIdxHeader >(); + + ftsIndex.openIndex( BtreeIndexing::IndexInfo( ftsIdxHeader.indexBtreeMaxElements, + ftsIdxHeader.indexRootOffset ), + ftsIdx, dict.getFtsMutex() ); + + chunks = new ChunkedStorage::Reader( ftsIdx, ftsIdxHeader.chunksOffset ); + } + + if( hasCJK ) + combinedIndexSearch( ftsIndex, chunks, indexWords, searchWords, searchRegExp ); + else + { + if( searchMode == FTS::WholeWords ) + indexSearch( ftsIndex, chunks, indexWords, searchWords ); + else + fullIndexSearch( ftsIndex, chunks, indexWords, searchWords, searchRegExp ); + } + } + else + { + fullSearch( searchWords, searchRegExp ); + } + + if( foundHeadwords && foundHeadwords->size() > 0 ) + { + Mutex::Lock _( dataMutex ); + data.resize( sizeof( foundHeadwords ) ); + memcpy( &data.front(), &foundHeadwords, sizeof( foundHeadwords ) ); + foundHeadwords = 0; + hasAnyData = true; + } + } + catch( std::exception &ex ) + { + gdWarning( "FTS: Failed full-text search for \"%s\", reason: %s\n", + dict.getName().c_str(), ex.what() ); + // Results not loaded -- we don't set the hasAnyData flag then + } + + finish(); +} + +} // namespace + diff -Nru goldendict-1.5.0~git20131003/ftshelpers.hh goldendict-1.5.0~git20150923/ftshelpers.hh --- goldendict-1.5.0~git20131003/ftshelpers.hh 1970-01-01 00:00:00.000000000 +0000 +++ goldendict-1.5.0~git20150923/ftshelpers.hh 2015-09-23 08:26:24.000000000 +0000 @@ -0,0 +1,157 @@ +#ifndef __FTSHELPERS_HH_INCLUDED__ +#define __FTSHELPERS_HH_INCLUDED__ + +#include +#include +#include +#include +#include + +#include "dictionary.hh" +#include "btreeidx.hh" +#include "fulltextsearch.hh" +#include "chunkedstorage.hh" + +#include + +namespace FtsHelpers +{ + +enum +{ + FtsSignature = 0x58535446, // FTSX on little-endian, XSTF on big-endian + CurrentFtsFormatVersion = 2 + BtreeIndexing::FormatVersion, +}; + +#pragma pack(push,1) + +struct FtsIdxHeader +{ + uint32_t signature; // First comes the signature, FTSX + uint32_t formatVersion; // File format version + uint32_t chunksOffset; // The offset to chunks' storage + uint32_t indexBtreeMaxElements; // Two fields from IndexInfo + uint32_t indexRootOffset; + uint32_t wordCount; // Number of unique words this dictionary has +} +#ifndef _MSC_VER +__attribute__((packed)) +#endif +; + +#pragma pack(pop) + +bool ftsIndexIsOldOrBad( std::string const & indexFile, + BtreeIndexing::BtreeDictionary * dict ); + +bool parseSearchString( QString const & str, QStringList & IndexWords, + QStringList & searchWords, + QRegExp & searchRegExp, int searchMode, + bool matchCase, + int distanceBetweenWords, + bool & hasCJK ); + +void parseArticleForFts( uint32_t articleAddress, QString & articleText, + QMap< QString, QVector< uint32_t > > & words ); + +void makeFTSIndex( BtreeIndexing::BtreeDictionary * dict, QAtomicInt & isCancelled ); + +bool isCJKChar( ushort ch ); + +class FTSResultsRequest; + +class FTSResultsRequestRunnable : public QRunnable +{ + FTSResultsRequest & r; + QSemaphore & hasExited; + +public: + + FTSResultsRequestRunnable( FTSResultsRequest & r_, + QSemaphore & hasExited_ ) : r( r_ ), + hasExited( hasExited_ ) + {} + + ~FTSResultsRequestRunnable() + { + hasExited.release(); + } + + virtual void run(); +}; + +class FTSResultsRequest : public Dictionary::DataRequest +{ + BtreeIndexing::BtreeDictionary & dict; + + QString searchString; + int searchMode; + bool matchCase; + int distanceBetweenWords; + int maxResults; + bool hasCJK; + + QAtomicInt isCancelled; + QSemaphore hasExited; + + QList< FTS::FtsHeadword > * foundHeadwords; + + void checkArticles( QVector< uint32_t > const & offsets, + QStringList const & words, + QRegExp const & searchRegexp = QRegExp() ); + + void indexSearch( BtreeIndexing::BtreeIndex & ftsIndex, + sptr< ChunkedStorage::Reader > chunks, + QStringList & indexWords, + QStringList & searchWords ); + + void combinedIndexSearch( BtreeIndexing::BtreeIndex & ftsIndex, + sptr< ChunkedStorage::Reader > chunks, + QStringList & indexWords, + QStringList & searchWords, + QRegExp & regexp ); + + void fullIndexSearch( BtreeIndexing::BtreeIndex & ftsIndex, + sptr< ChunkedStorage::Reader > chunks, + QStringList & indexWords, + QStringList & searchWords, + QRegExp & regexp ); + + void fullSearch( QStringList & searchWords, QRegExp & regexp ); + +public: + + FTSResultsRequest( BtreeIndexing::BtreeDictionary & dict_, QString const & searchString_, + int searchMode_, bool matchCase_, int distanceBetweenWords_, int maxResults_ ): + dict( dict_ ), + searchString( searchString_ ), + searchMode( searchMode_ ), + matchCase( matchCase_ ), + distanceBetweenWords( distanceBetweenWords_ ), + maxResults( maxResults_ ), + hasCJK( false ) + { + foundHeadwords = new QList< FTS::FtsHeadword >; + QThreadPool::globalInstance()->start( + new FTSResultsRequestRunnable( *this, hasExited ), -100 ); + } + + void run(); // Run from another thread by DslResourceRequestRunnable + + virtual void cancel() + { + isCancelled.ref(); + } + + ~FTSResultsRequest() + { + isCancelled.ref(); + if( foundHeadwords ) + delete foundHeadwords; + hasExited.acquire(); + } +}; + +} // namespace + +#endif // __FTSHELPERS_HH_INCLUDED__ diff -Nru goldendict-1.5.0~git20131003/fulltextsearch.cc goldendict-1.5.0~git20150923/fulltextsearch.cc --- goldendict-1.5.0~git20131003/fulltextsearch.cc 1970-01-01 00:00:00.000000000 +0000 +++ goldendict-1.5.0~git20150923/fulltextsearch.cc 2015-09-23 08:26:24.000000000 +0000 @@ -0,0 +1,599 @@ +/* This file is (c) 2014 Abs62 + * Part of GoldenDict. Licensed under GPLv3 or later, see the LICENSE file */ + +#include "fulltextsearch.hh" +#include "ftshelpers.hh" +#include "gddebug.hh" +#include "mainwindow.hh" + +#include +#include +#include +#include + +namespace FTS +{ + +enum +{ + MinDistanceBetweenWords = 0, + MaxDistanceBetweenWords = 15, + MinArticlesPerDictionary = 1, + MaxArticlesPerDictionary = 10000 +}; + +void Indexing::run() +{ + try + { + // First iteration - dictionaries with no more MaxDictionarySizeForFastSearch articles + for( size_t x = 0; x < dictionaries.size(); x++ ) + { + if( isCancelled ) + break; + + if( dictionaries.at( x )->canFTS() + &&!dictionaries.at( x )->haveFTSIndex() ) + { + emit sendNowIndexingName( QString::fromUtf8( dictionaries.at( x )->getName().c_str() ) ); + dictionaries.at( x )->makeFTSIndex( isCancelled, true ); + } + } + + // Second iteration - all remaining dictionaries + for( size_t x = 0; x < dictionaries.size(); x++ ) + { + if( isCancelled ) + break; + + if( dictionaries.at( x )->canFTS() + &&!dictionaries.at( x )->haveFTSIndex() ) + { + emit sendNowIndexingName( QString::fromUtf8( dictionaries.at( x )->getName().c_str() ) ); + dictionaries.at( x )->makeFTSIndex( isCancelled, false ); + } + } + } + catch( std::exception &ex ) + { + gdWarning( "Exception occured while full-text search: %s", ex.what() ); + } + emit sendNowIndexingName( tr( "None" ) ); +} + + +FtsIndexing::FtsIndexing( std::vector< sptr< Dictionary::Class > > const & dicts): + dictionaries( dicts ), + started( false ), + nowIndexing( tr( "None" ) ) +{ +} + +void FtsIndexing::doIndexing() +{ + if( started ) + stopIndexing(); + + if( !started ) + { + while( isCancelled ) + isCancelled.deref(); + + Indexing *idx = new Indexing( isCancelled, dictionaries, indexingExited ); + + connect( idx, SIGNAL( sendNowIndexingName( QString ) ), this, SLOT( setNowIndexedName( QString ) ) ); + + QThreadPool::globalInstance()->start( idx ); + + started = true; + } +} + +void FtsIndexing::stopIndexing() +{ + if( started ) + { + if( !isCancelled ) + isCancelled.ref(); + + indexingExited.acquire(); + started = false; + } +} + +void FtsIndexing::setNowIndexedName( QString name ) +{ + { + Mutex::Lock _( nameMutex ); + nowIndexing = name; + } + emit newIndexingName( name ); +} + +QString FtsIndexing::nowIndexingName() +{ + Mutex::Lock _( nameMutex ); + return nowIndexing; +} + +FullTextSearchDialog::FullTextSearchDialog( QWidget * parent, + Config::Class & cfg_, + std::vector< sptr< Dictionary::Class > > const & dictionaries_, + std::vector< Instances::Group > const & groups_, + FtsIndexing & ftsidx ) : + QDialog( parent ), + cfg( cfg_ ), + dictionaries( dictionaries_ ), + groups( groups_ ), + group( 0 ), + ftsIdx( ftsidx ) +, helpAction( this ) +{ + ui.setupUi( this ); + + if( cfg.preferences.fts.dialogGeometry.size() > 0 ) + restoreGeometry( cfg.preferences.fts.dialogGeometry ); + + setAttribute( Qt::WA_DeleteOnClose, false ); + setWindowFlags( windowFlags() & ~Qt::WindowContextHelpButtonHint ); + + setWindowTitle( tr( "Full-text search" ) ); + + setNewIndexingName( ftsIdx.nowIndexingName() ); + + connect( &ftsIdx, SIGNAL( newIndexingName( QString ) ), + this, SLOT( setNewIndexingName( QString ) ) ); + + ui.searchMode->addItem( tr( "Whole words" ), WholeWords ); + ui.searchMode->addItem( tr( "Plain text"), PlainText ); + ui.searchMode->addItem( tr( "Wildcards" ), Wildcards ); + ui.searchMode->addItem( tr( "RegExp" ), RegExp ); + ui.searchMode->setCurrentIndex( cfg.preferences.fts.searchMode ); + + ui.searchProgressBar->hide(); + + ui.checkBoxDistanceBetweenWords->setText( tr( "Max distance between words (%1-%2):" ) + .arg( QString::number( MinDistanceBetweenWords ) ) + .arg( QString::number( MaxDistanceBetweenWords ) ) ); + ui.checkBoxDistanceBetweenWords->setChecked( cfg.preferences.fts.useMaxDistanceBetweenWords ); + + ui.distanceBetweenWords->setMinimum( MinDistanceBetweenWords ); + ui.distanceBetweenWords->setMaximum( MaxDistanceBetweenWords ); + ui.distanceBetweenWords->setValue( cfg.preferences.fts.maxDistanceBetweenWords ); + + ui.checkBoxArticlesPerDictionary->setText( tr( "Max articles per dictionary (%1-%2):" ) + .arg( QString::number( MinArticlesPerDictionary ) ) + .arg( QString::number( MaxArticlesPerDictionary ) ) ); + ui.checkBoxArticlesPerDictionary->setChecked( cfg.preferences.fts.useMaxArticlesPerDictionary ); + + ui.articlesPerDictionary->setMinimum( MinArticlesPerDictionary ); + ui.articlesPerDictionary->setMaximum( MaxArticlesPerDictionary ); + ui.articlesPerDictionary->setValue( cfg.preferences.fts.maxArticlesPerDictionary ); + + ui.matchCase->setChecked( cfg.preferences.fts.matchCase ); + + setLimitsUsing(); + + connect( ui.checkBoxDistanceBetweenWords, SIGNAL( stateChanged( int ) ), + this, SLOT( setLimitsUsing() ) ); + connect( ui.checkBoxArticlesPerDictionary, SIGNAL( stateChanged( int ) ), + this, SLOT( setLimitsUsing() ) ); + connect( ui.searchMode, SIGNAL( currentIndexChanged( int ) ), + this, SLOT( setLimitsUsing() ) ); + + model = new HeadwordsListModel( this, results, activeDicts ); + ui.headwordsView->setModel( model ); + + ui.articlesFoundLabel->setText( tr( "Articles found: " ) + "0" ); + + connect( ui.headwordsView, SIGNAL( clicked( QModelIndex ) ), + this, SLOT( itemClicked( QModelIndex ) ) ); + + connect( this, SIGNAL( finished( int ) ), this, SLOT( saveData() ) ); + + connect( ui.OKButton, SIGNAL( clicked() ), this, SLOT( accept() ) ); + connect( ui.cancelButton, SIGNAL( clicked() ), this, SLOT( reject() ) ); + + connect( ui.helpButton, SIGNAL( clicked() ), + this, SLOT( helpRequested() ) ); + + helpAction.setShortcut( QKeySequence( "F1" ) ); + helpAction.setShortcutContext( Qt::WidgetWithChildrenShortcut ); + + connect( &helpAction, SIGNAL( triggered() ), + this, SLOT( helpRequested() ) ); + + addAction( &helpAction ); + + ui.headwordsView->installEventFilter( this ); + + delegate = new WordListItemDelegate( ui.headwordsView->itemDelegate() ); + if( delegate ) + ui.headwordsView->setItemDelegate( delegate ); +} + +FullTextSearchDialog::~FullTextSearchDialog() +{ + if( delegate ) + delete delegate; +} + +void FullTextSearchDialog::stopSearch() +{ + if( !searchReqs.empty() ) + { + for( std::list< sptr< Dictionary::DataRequest > >::iterator it = searchReqs.begin(); + it != searchReqs.end(); ++it ) + if( !(*it)->isFinished() ) + (*it)->cancel(); + + while( searchReqs.size() ) + QApplication::processEvents(); + } +} + +void FullTextSearchDialog::showDictNumbers() +{ + ui.totalDicts->setText( QString::number( activeDicts.size() ) ); + + unsigned ready = 0, toIndex = 0; + for( unsigned x = 0; x < activeDicts.size(); x++ ) + { + if( activeDicts.at( x )->haveFTSIndex() ) + ready++; + else + toIndex++; + } + + ui.readyDicts->setText( QString::number( ready ) ); + ui.toIndexDicts->setText( QString::number( toIndex ) ); +} + +void FullTextSearchDialog::saveData() +{ + cfg.preferences.fts.searchMode = ui.searchMode->currentIndex(); + cfg.preferences.fts.matchCase = ui.matchCase->isChecked(); + cfg.preferences.fts.maxArticlesPerDictionary = ui.articlesPerDictionary->text().toInt(); + cfg.preferences.fts.maxDistanceBetweenWords = ui.distanceBetweenWords->text().toInt(); + cfg.preferences.fts.useMaxDistanceBetweenWords = ui.checkBoxDistanceBetweenWords->isChecked(); + cfg.preferences.fts.useMaxArticlesPerDictionary = ui.checkBoxArticlesPerDictionary->isChecked(); + + cfg.preferences.fts.dialogGeometry = saveGeometry(); +} + +void FullTextSearchDialog::setNewIndexingName( QString name ) +{ + ui.nowIndexingLabel->setText( tr( "Now indexing: " ) + name ); + showDictNumbers(); +} + +void FullTextSearchDialog::setLimitsUsing() +{ + int mode = ui.searchMode->itemData( ui.searchMode->currentIndex() ).toInt(); + if( mode == WholeWords || mode == PlainText ) + { + ui.checkBoxDistanceBetweenWords->setEnabled( true ); + ui.distanceBetweenWords->setEnabled( ui.checkBoxDistanceBetweenWords->isChecked() ); + } + else + { + ui.checkBoxDistanceBetweenWords->setEnabled( false ); + ui.distanceBetweenWords->setEnabled( false ); + } + ui.articlesPerDictionary->setEnabled( ui.checkBoxArticlesPerDictionary->isChecked() ); +} + +void FullTextSearchDialog::accept() +{ + QStringList list1, list2; + int mode = ui.searchMode->itemData( ui.searchMode->currentIndex() ).toInt(); + + int maxResultsPerDict = ui.checkBoxArticlesPerDictionary->isChecked() ? + ui.articlesPerDictionary->value() : -1; + int distanceBetweenWords = ui.checkBoxDistanceBetweenWords->isChecked() ? + ui.distanceBetweenWords->value() : -1; + + model->clear(); + ui.articlesFoundLabel->setText( tr( "Articles found: " ) + QString::number( results.size() ) ); + + bool hasCJK; + if( !FtsHelpers::parseSearchString( ui.searchLine->text(), list1, list2, + searchRegExp, mode, + ui.matchCase->isChecked(), + distanceBetweenWords, + hasCJK ) ) + { + if( hasCJK && ( mode == WholeWords || mode == PlainText ) ) + { + QMessageBox message( QMessageBox::Warning, + "GoldenDict", + tr( "CJK symbols in search string are not compatible with search modes \"Whole words\" and \"Plain text\"" ), + QMessageBox::Ok, + this ); + message.exec(); + } + else + { + QMessageBox message( QMessageBox::Warning, + "GoldenDict", + tr( "The search line must contains at least one word containing " ) + + QString::number( MinimumWordSize ) + tr( " or more symbols" ), + QMessageBox::Ok, + this ); + message.exec(); + } + return; + } + + if( activeDicts.empty() ) + { + QMessageBox message( QMessageBox::Warning, + "GoldenDict", + tr( "No dictionaries for full-text search" ), + QMessageBox::Ok, + this ); + message.exec(); + return; + } + + ui.OKButton->setEnabled( false ); + ui.searchProgressBar->show(); + + // Make search requests + + for( unsigned x = 0; x < activeDicts.size(); ++x ) + { + sptr< Dictionary::DataRequest > req = activeDicts[ x ]->getSearchResults( + ui.searchLine->text(), + mode, + ui.matchCase->isChecked(), + distanceBetweenWords, + maxResultsPerDict + ); + connect( req.get(), SIGNAL( finished() ), + this, SLOT( searchReqFinished() ), Qt::QueuedConnection ); + + searchReqs.push_back( req ); + } + + searchReqFinished(); // Handle any ones which have already finished +} + +void FullTextSearchDialog::searchReqFinished() +{ + while ( searchReqs.size() ) + { + std::list< sptr< Dictionary::DataRequest > >::iterator it; + for( it = searchReqs.begin(); it != searchReqs.end(); ++it ) + { + if ( (*it)->isFinished() ) + { + GD_DPRINTF( "one finished.\n" ); + + QString errorString = (*it)->getErrorString(); + + if ( (*it)->dataSize() >= 0 || errorString.size() ) + { + QList< FtsHeadword > * headwords; + if( (unsigned)(*it)->dataSize() >= sizeof( headwords ) ) + { + try + { + (*it)->getDataSlice( 0, sizeof( headwords ), &headwords ); + model->addResults( QModelIndex(), *headwords ); + delete headwords; + ui.articlesFoundLabel->setText( tr( "Articles found: " ) + + QString::number( results.size() ) ); + } + catch( std::exception & e ) + { + gdWarning( "getDataSlice error: %s\n", e.what() ); + } + } + + } + break; + } + } + if( it != searchReqs.end() ) + { + GD_DPRINTF( "erasing..\n" ); + searchReqs.erase( it ); + GD_DPRINTF( "erase done..\n" ); + continue; + } + else + break; + } + if ( searchReqs.empty() ) + { + ui.searchProgressBar->hide(); + ui.OKButton->setEnabled( true ); + QApplication::beep(); + } +} + +void FullTextSearchDialog::reject() +{ + if( !searchReqs.empty() ) + stopSearch(); + else + { + saveData(); + emit closeDialog(); + } +} + +void FullTextSearchDialog::itemClicked( const QModelIndex & idx ) +{ + if( idx.isValid() && idx.row() < results.size() ) + { + QString headword = results[ idx.row() ].headword; + emit showTranslationFor( headword, results[ idx.row() ].dictIDs, searchRegExp ); + } +} + +void FullTextSearchDialog::updateDictionaries() +{ + activeDicts.clear(); + + // Find the given group + + Instances::Group const * activeGroup = 0; + + for( unsigned x = 0; x < groups.size(); ++x ) + if ( groups[ x ].id == group ) + { + activeGroup = &groups[ x ]; + break; + } + + // If we've found a group, use its dictionaries; otherwise, use the global + // heap. + std::vector< sptr< Dictionary::Class > > const & groupDicts = + activeGroup ? activeGroup->dictionaries : dictionaries; + + // Exclude muted dictionaries + + Config::Group const * grp = cfg.getGroup( group ); + Config::MutedDictionaries const * mutedDicts; + + if( group == Instances::Group::AllGroupId ) + mutedDicts = &cfg.mutedDictionaries; + else + mutedDicts = grp ? &grp->mutedDictionaries : 0; + + if( mutedDicts && !mutedDicts->isEmpty() ) + { + activeDicts.reserve( groupDicts.size() ); + for( unsigned x = 0; x < groupDicts.size(); ++x ) + if ( groupDicts[ x ]->canFTS() + && !mutedDicts->contains( QString::fromStdString( groupDicts[ x ]->getId() ) ) + ) + activeDicts.push_back( groupDicts[ x ] ); + } + else + { + for( unsigned x = 0; x < groupDicts.size(); ++x ) + if ( groupDicts[ x ]->canFTS() ) + activeDicts.push_back( groupDicts[ x ] ); + } + + showDictNumbers(); +} + +bool FullTextSearchDialog::eventFilter( QObject * obj, QEvent * ev ) +{ + if( obj == ui.headwordsView && ev->type() == QEvent::KeyPress ) + { + QKeyEvent * kev = static_cast< QKeyEvent * >( ev ); + if( kev->key() == Qt::Key_Return || kev->key() == Qt::Key_Enter ) + { + itemClicked( ui.headwordsView->currentIndex() ); + return true; + } + } + return QDialog::eventFilter( obj, ev ); +} + +void FullTextSearchDialog::helpRequested() +{ + MainWindow * mainWindow = qobject_cast< MainWindow * >( parentWidget() ); + if( mainWindow ) + mainWindow->showGDHelpForID( "Full-text search" ); +} + +/// HeadwordsListModel + +int HeadwordsListModel::rowCount( QModelIndex const & ) const +{ + return headwords.size(); +} + +QVariant HeadwordsListModel::data( QModelIndex const & index, int role ) const +{ + if( index.row() < 0 ) + return QVariant(); + + FtsHeadword const & head = headwords[ index.row() ]; + + if ( head.headword.isEmpty() ) + return QVariant(); + + switch ( role ) + { + case Qt::ToolTipRole: + { + QString tt; + for( int x = 0; x < head.dictIDs.size(); x++ ) + { + if( x != 0 ) + tt += "
"; + + int n = getDictIndex( head.dictIDs[ x ] ); + if( n != -1 ) + tt += QString::fromUtf8( dictionaries[ n ]->getName().c_str() ) ; + } + return tt; + } + + case Qt::DisplayRole : + return head.headword; + + case Qt::EditRole : + return head.headword; + + default:; + } + + return QVariant(); +} + +void HeadwordsListModel::addResults(const QModelIndex & parent, QList< FtsHeadword > const & hws ) +{ +Q_UNUSED( parent ); + beginResetModel(); + + QList< FtsHeadword > temp; + + for( int x = 0; x < hws.length(); x++ ) + { + QList< FtsHeadword >::iterator it = qBinaryFind( headwords.begin(), headwords.end(), hws.at( x ) ); + if( it != headwords.end() ) + it->dictIDs.push_back( hws.at( x ).dictIDs.front() ); + else + temp.append( hws.at( x ) ); + } + + headwords.append( temp ); + qSort( headwords ); + + endResetModel(); + emit contentChanged(); +} + +bool HeadwordsListModel::clear() +{ + beginResetModel(); + + headwords.clear(); + + endResetModel(); + + emit contentChanged(); + + return true; +} + +int HeadwordsListModel::getDictIndex( QString const & id ) const +{ + std::string dictID( id.toUtf8().data() ); + for( unsigned x = 0; x < dictionaries.size(); x++ ) + { + if( dictionaries[ x ]->getId().compare( dictID ) == 0 ) + return x; + } + return -1; +} + +} // namespace FTS diff -Nru goldendict-1.5.0~git20131003/fulltextsearch.hh goldendict-1.5.0~git20150923/fulltextsearch.hh --- goldendict-1.5.0~git20131003/fulltextsearch.hh 1970-01-01 00:00:00.000000000 +0000 +++ goldendict-1.5.0~git20150923/fulltextsearch.hh 2015-09-23 08:26:24.000000000 +0000 @@ -0,0 +1,227 @@ +#ifndef __FULLTEXTSEARCH_HH_INCLUDED__ +#define __FULLTEXTSEARCH_HH_INCLUDED__ + +#include +#include +#include +#include +#include + +#include "dictionary.hh" +#include "ui_fulltextsearch.h" +#include "mutex.hh" +#include "config.hh" +#include "instances.hh" +#include "delegate.hh" + +namespace FTS +{ + +enum { + // Minimum word length for indexing + MinimumWordSize = 4, + + // Maximum dictionary size for first iteration of FTS indexing + MaxDictionarySizeForFastSearch = 150000, + + // Maxumum match length for highlight search results + // (QWebPage::findText() crashes on too long strings) + MaxMatchLengthForHighlightResults = 500 +}; + +enum SearchMode +{ + WholeWords = 0, + PlainText, + Wildcards, + RegExp +}; + +struct FtsHeadword +{ + QString headword; + QStringList dictIDs; + + FtsHeadword( QString const & headword_, QString const & dictid_ ) : + headword( headword_ ) + { + dictIDs.append( dictid_ ); + } + + bool operator <( FtsHeadword const & other ) const + { + if( headword[ 0 ] == '\"' || headword[ 0 ] == '\'' ) + return headword.mid( 1 ).localeAwareCompare( other.headword ) < 0; + else + return headword.localeAwareCompare( other.headword ) < 0; + } + + bool operator ==( FtsHeadword const & other ) const + { return headword.compare( other.headword, Qt::CaseInsensitive ) == 0; } + + bool operator !=( FtsHeadword const & other ) const + { return headword.compare( other.headword, Qt::CaseInsensitive ) != 0; } +}; + +class Indexing : public QObject, public QRunnable +{ +Q_OBJECT + + QAtomicInt & isCancelled; + std::vector< sptr< Dictionary::Class > > const & dictionaries; + QSemaphore & hasExited; + +public: + Indexing( QAtomicInt & cancelled, std::vector< sptr< Dictionary::Class > > const & dicts, + QSemaphore & hasExited_): + isCancelled( cancelled ), + dictionaries( dicts ), + hasExited( hasExited_ ) + {} + + ~Indexing() + { + hasExited.release(); + } + + virtual void run(); + +signals: + void sendNowIndexingName( QString ); +}; + +class FtsIndexing : public QObject +{ +Q_OBJECT +public: + FtsIndexing( std::vector< sptr< Dictionary::Class > > const & dicts ); + virtual ~FtsIndexing() + { stopIndexing(); } + + void setDictionaries( std::vector< sptr< Dictionary::Class > > const & dicts ) + { + clearDictionaries(); + dictionaries = dicts; + } + + void clearDictionaries() + { dictionaries.clear(); } + + /// Start dictionaries indexing for full-text search + void doIndexing(); + + /// Break indexing thread + void stopIndexing(); + + QString nowIndexingName(); + +protected: + QAtomicInt isCancelled; + QSemaphore indexingExited; + std::vector< sptr< Dictionary::Class > > dictionaries; + bool started; + QString nowIndexing; + Mutex nameMutex; + +private slots: + void setNowIndexedName( QString name ); + +signals: + void newIndexingName( QString name ); +}; + +/// A model to be projected into the view, according to Qt's MVC model +class HeadwordsListModel: public QAbstractListModel +{ + Q_OBJECT + +public: + + HeadwordsListModel( QWidget * parent, QList< FtsHeadword > & headwords_, + std::vector< sptr< Dictionary::Class > > const & dicts ): + QAbstractListModel( parent ), headwords( headwords_ ), + dictionaries( dicts ) + {} + + int rowCount( QModelIndex const & parent ) const; + QVariant data( QModelIndex const & index, int role ) const; + +// bool insertRows( int row, int count, const QModelIndex & parent ); +// bool removeRows( int row, int count, const QModelIndex & parent ); +// bool setData( QModelIndex const & index, const QVariant & value, int role ); + + void addResults(const QModelIndex & parent, QList< FtsHeadword > const & headwords ); + bool clear(); + +private: + + QList< FtsHeadword > & headwords; + std::vector< sptr< Dictionary::Class > > const & dictionaries; + + int getDictIndex( QString const & id ) const; + +signals: + void contentChanged(); +}; + +class FullTextSearchDialog : public QDialog +{ + Q_OBJECT + + Config::Class & cfg; + std::vector< sptr< Dictionary::Class > > const & dictionaries; + std::vector< Instances::Group > const & groups; + unsigned group; + std::vector< sptr< Dictionary::Class > > activeDicts; + + std::list< sptr< Dictionary::DataRequest > > searchReqs; + + FtsIndexing & ftsIdx; + + QRegExp searchRegExp; +public: + FullTextSearchDialog( QWidget * parent, + Config::Class & cfg_, + std::vector< sptr< Dictionary::Class > > const & dictionaries_, + std::vector< Instances::Group > const & groups_, + FtsIndexing & ftsidx ); + virtual ~FullTextSearchDialog(); + + void setCurrentGroup( unsigned group_ ) + { group = group_; updateDictionaries(); } + + void stopSearch(); + +protected: + bool eventFilter( QObject * obj, QEvent * ev ); + +private: + Ui::FullTextSearchDialog ui; + QList< FtsHeadword > results; + HeadwordsListModel * model; + WordListItemDelegate * delegate; + QAction helpAction; + + void showDictNumbers(); + +private slots: + void setNewIndexingName( QString ); + void saveData(); + void accept(); + void setLimitsUsing(); + void searchReqFinished(); + void reject(); + void itemClicked( QModelIndex const & idx ); + void updateDictionaries(); + void helpRequested(); + +signals: + void showTranslationFor( QString const &, QStringList const & dictIDs, + QRegExp const & searchRegExp ); + void closeDialog(); +}; + + +} // namespace FTS + +#endif // __FULLTEXTSEARCH_HH_INCLUDED__ diff -Nru goldendict-1.5.0~git20131003/fulltextsearch.ui goldendict-1.5.0~git20150923/fulltextsearch.ui --- goldendict-1.5.0~git20131003/fulltextsearch.ui 1970-01-01 00:00:00.000000000 +0000 +++ goldendict-1.5.0~git20150923/fulltextsearch.ui 2015-09-23 08:26:24.000000000 +0000 @@ -0,0 +1,270 @@ + + + FullTextSearchDialog + + + + 0 + 0 + 492 + 593 + + + + + 430 + 450 + + + + + + + + + + Search + + + + + + + + + + + Match case + + + + + + + + + Mode: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 0 + 21 + + + + Articles found: + + + + + + + 0 + + + -1 + + + Qt::AlignCenter + + + + + + + + + Available dictionaries in group: + + + + + + Wait for indexing: + + + + + + + + + + + + + + + + + + + + + Total: + + + + + + + Indexed: + + + + + + + + + + + + + + + + + Now indexing: None + + + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + Search + + + false + + + true + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + Cancel + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + Help + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + + + searchLine + headwordsView + checkBoxDistanceBetweenWords + distanceBetweenWords + searchMode + checkBoxArticlesPerDictionary + articlesPerDictionary + matchCase + OKButton + cancelButton + + + + diff -Nru goldendict-1.5.0~git20131003/gdappstyle.cc goldendict-1.5.0~git20150923/gdappstyle.cc --- goldendict-1.5.0~git20131003/gdappstyle.cc 2013-08-16 09:45:56.000000000 +0000 +++ goldendict-1.5.0~git20150923/gdappstyle.cc 2015-09-23 08:26:24.000000000 +0000 @@ -33,6 +33,12 @@ } } + // Qt don't upscale icons for high dpi scales + // We limit maximum small icon size to 21 pixel + // (standard icon size for Lingvo dictionaries) + if( metric == QStyle::PM_SmallIconSize ) + return defaultVal < 21 ? defaultVal : 21; + return defaultVal; } diff -Nru goldendict-1.5.0~git20131003/gddebug.cc goldendict-1.5.0~git20150923/gddebug.cc --- goldendict-1.5.0~git20131003/gddebug.cc 1970-01-01 00:00:00.000000000 +0000 +++ goldendict-1.5.0~git20150923/gddebug.cc 2015-09-23 08:26:24.000000000 +0000 @@ -0,0 +1,55 @@ +/* This file is (c) 2013 Abs62 + * Part of GoldenDict. Licensed under GPLv3 or later, see the LICENSE file */ + +#include +#include +#include "gddebug.hh" + +QFile logFile; +static QTextCodec * utf8Codec; + +void gdWarning(const char *msg, ...) +{ +va_list ap; +va_start(ap, msg); +QTextCodec *localeCodec = 0; + + if( logFile.isOpen() ) + { + if( utf8Codec == 0 ) + utf8Codec = QTextCodec::codecForName( "UTF8" ); + + localeCodec = QTextCodec::codecForLocale(); + QTextCodec::setCodecForLocale( utf8Codec ); + } + + qWarning( "%s", QString().vsprintf( msg, ap ).toUtf8().data() ); + + if( logFile.isOpen() ) + { + QTextCodec::setCodecForLocale( localeCodec ); + } +} + +void gdDebug(const char *msg, ...) +{ +va_list ap; +va_start(ap, msg); +QTextCodec *localeCodec = 0; + + if( logFile.isOpen() ) + { + if( utf8Codec == 0 ) + utf8Codec = QTextCodec::codecForName( "UTF8" ); + + localeCodec = QTextCodec::codecForLocale(); + QTextCodec::setCodecForLocale( utf8Codec ); + } + + qDebug( "%s", QString().vsprintf( msg, ap ).toUtf8().data() ); + + if( logFile.isOpen() ) + { + QTextCodec::setCodecForLocale( localeCodec ); + } +} diff -Nru goldendict-1.5.0~git20131003/gddebug.hh goldendict-1.5.0~git20150923/gddebug.hh --- goldendict-1.5.0~git20131003/gddebug.hh 1970-01-01 00:00:00.000000000 +0000 +++ goldendict-1.5.0~git20150923/gddebug.hh 2015-09-23 08:26:24.000000000 +0000 @@ -0,0 +1,28 @@ +#ifndef __GDDEBUG_HH_INCLUDED__ +#define __GDDEBUG_HH_INCLUDED__ + +#include + +#ifdef NO_CONSOLE +#define GD_DPRINTF(...) +#define GD_FDPRINTF(...) +#else +#define GD_DPRINTF(...) printf(__VA_ARGS__) +#define GD_FDPRINTF(...) fprintf(__VA_ARGS__) +#endif + +void gdWarning(const char *, ...) /* print warning message */ +#if defined(Q_CC_GNU) && !defined(__INSURE__) + __attribute__ ((format (printf, 1, 2))) +#endif +; + +void gdDebug(const char *, ...) +#if defined(Q_CC_GNU) && !defined(__INSURE__) + __attribute__ ((format (printf, 1, 2))) +#endif +; + +extern QFile logFile; + +#endif // __GDDEBUG_HH_INCLUDED__ diff -Nru goldendict-1.5.0~git20131003/gestures.cc goldendict-1.5.0~git20150923/gestures.cc --- goldendict-1.5.0~git20131003/gestures.cc 1970-01-01 00:00:00.000000000 +0000 +++ goldendict-1.5.0~git20150923/gestures.cc 2015-09-23 08:26:24.000000000 +0000 @@ -0,0 +1,395 @@ +/* This file is (c) 2014 Abs62 + * Part of GoldenDict. Licensed under GPLv3 or later, see the LICENSE file */ + +#include +#include +#include +#include +#include "articleview.hh" +#include "gestures.hh" + +#if QT_VERSION >= QT_VERSION_CHECK(4, 6, 0) + +namespace Gestures +{ + +Qt::GestureType GDPinchGestureType; +Qt::GestureType GDSwipeGestureType; +static bool fewTouchPointsPresented; + +bool isFewTouchPointsPresented() +{ + return fewTouchPointsPresented; +} + +QSwipeGesture::SwipeDirection getHorizontalDirection( qreal angle ) +{ + if ( ( 0 <= angle && angle <= 45 ) + || ( 315 <= angle && angle <= 360 ) ) + return QSwipeGesture::Right; + + if ( 135 <= angle && angle <= 225 ) + return QSwipeGesture::Left; + + return QSwipeGesture::NoDirection; +} + +QSwipeGesture::SwipeDirection getVerticalDirection( qreal angle ) +{ + if ( 45 < angle && angle < 135 ) + return QSwipeGesture::Up; + + if ( 225 < angle && angle < 315 ) + return QSwipeGesture::Down; + + return QSwipeGesture::NoDirection; +} + +GDPinchGesture::GDPinchGesture() : +isNewSequence( true ) +{ +} + +QGesture * GDPinchGestureRecognizer::create( QObject * pTarget ) +{ + if ( pTarget && pTarget->isWidgetType()) { + static_cast< QWidget * >( pTarget )->setAttribute( Qt::WA_AcceptTouchEvents ); + } + QGesture *pGesture = new GDPinchGesture; + return pGesture; +} + +void GDPinchGestureRecognizer::reset( QGesture * pGesture ) +{ + QGestureRecognizer::reset( pGesture ); +} + +QGestureRecognizer::Result GDPinchGestureRecognizer::recognize( QGesture * state, + QObject *, + QEvent * event) +{ + const QTouchEvent *ev = static_cast< const QTouchEvent * >( event ); + QGestureRecognizer::Result result = QGestureRecognizer::Ignore; + GDPinchGesture * gest = static_cast< GDPinchGesture * >( state ); + + switch ( event->type() ) + { + case QEvent::TouchBegin: + { + result = QGestureRecognizer::MayBeGesture; + gest->isNewSequence = true; + break; + } +#if QT_VERSION >= QT_VERSION_CHECK(5, 0, 0) + case QEvent::TouchCancel: +#endif + case QEvent::TouchEnd: + { + result = QGestureRecognizer::CancelGesture; + fewTouchPointsPresented = false; + break; + } + case QEvent::TouchUpdate: + { + gest->scaleChanged = false; + fewTouchPointsPresented = ( ev->touchPoints().size() > 1 ); + if ( ev->touchPoints().size() == 2 ) + { + QTouchEvent::TouchPoint p1 = ev->touchPoints().at( 0 ); + QTouchEvent::TouchPoint p2 = ev->touchPoints().at( 1 ); + + QPointF centerPoint = ( p1.screenPos() + p2.screenPos() ) / 2.0; + gest->setHotSpot( centerPoint ); + if ( gest->isNewSequence ) + { + gest->startPosition[ 0 ] = p1.screenPos(); + gest->startPosition[ 1 ] = p2.screenPos(); + gest->lastCenterPoint = centerPoint; + } + else + { + gest->lastCenterPoint = gest->centerPoint; + } + gest->centerPoint = centerPoint; + + if ( gest->isNewSequence ) + { + gest->scaleFactor = 1.0; + gest->lastScaleFactor = 1.0; + gest->totalScaleFactor = 1.0; + } + else + { + gest->lastScaleFactor = gest->scaleFactor; + QLineF line( p1.screenPos(), p2.screenPos() ); + QLineF lastLine( p1.lastScreenPos(), p2.lastScreenPos() ); + gest->scaleFactor = line.length() / lastLine.length(); + } + + gest->totalScaleFactor = gest->totalScaleFactor * gest->scaleFactor; + gest->scaleChanged = true; + + gest->isNewSequence = false; + if( gest->totalScaleFactor <= OUT_SCALE_LIMIT || gest->totalScaleFactor >= IN_SCALE_LIMIT ) + { + result = QGestureRecognizer::TriggerGesture; + gest->isNewSequence = true; + } + else + result = QGestureRecognizer::MayBeGesture; + } + else + { + gest->isNewSequence = true; + if ( gest->state() == Qt::NoGesture ) + result = QGestureRecognizer::Ignore; + else + result = QGestureRecognizer::FinishGesture; + } + break; + } + case QEvent::MouseButtonPress: + case QEvent::MouseMove: + case QEvent::MouseButtonRelease: + result = QGestureRecognizer::Ignore; + break; + default: + result = QGestureRecognizer::Ignore; + break; + } + return result; +} + + +GDSwipeGesture::GDSwipeGesture() : +vertDirection( QSwipeGesture::NoDirection ), +horizDirection( QSwipeGesture::NoDirection ), +started( false ) +{ +} + +QGesture * GDSwipeGestureRecognizer::create( QObject * pTarget ) +{ + if ( pTarget && pTarget->isWidgetType() ) { + static_cast< QWidget * >( pTarget )->setAttribute( Qt::WA_AcceptTouchEvents ); + } + QGesture *pGesture = new GDSwipeGesture; + return pGesture; +} + +void GDSwipeGestureRecognizer::reset( QGesture * pGesture ) +{ + GDSwipeGesture * gest = static_cast< GDSwipeGesture * >( pGesture ); + gest->vertDirection = QSwipeGesture::NoDirection; + gest->horizDirection = QSwipeGesture::NoDirection; + gest->lastPositions[ 0 ] = QPoint(); + gest->lastPositions[ 1 ] = QPoint(); + + QGestureRecognizer::reset( pGesture ); +} + +qreal GDSwipeGestureRecognizer::computeAngle( int dx, int dy ) +{ + double PI = 3.14159265; + + // Need to convert from screen coordinates direction + // into classical coordinates direction. + dy = -dy; + + double result = atan2( (double)dy, (double)dx ) ; + result = ( result * 180 ) / PI; + + // Always return positive angle. + if ( result < 0 ) + result += 360; + + return result; +} + +QGestureRecognizer::Result GDSwipeGestureRecognizer::recognize( QGesture * state, + QObject *, + QEvent * event) +{ + GDSwipeGesture * swipe = static_cast< GDSwipeGesture * >( state ); + const QTouchEvent * ev = static_cast< const QTouchEvent * >( event ); + QGestureRecognizer::Result result = QGestureRecognizer::Ignore; + + switch( event->type() ) + { + case QEvent::TouchBegin: + { + swipe->unsetHotSpot(); + swipe->lastPositions[ 0 ] = QPoint(); + swipe->started = true; + result = QGestureRecognizer::MayBeGesture; + break; + } +#if QT_VERSION >= QT_VERSION_CHECK(5, 0, 0) + case QEvent::TouchCancel: +#endif + case QEvent::TouchEnd: + { + fewTouchPointsPresented = false; + result = QGestureRecognizer::CancelGesture; + break; + } + case QEvent::TouchUpdate: + { + fewTouchPointsPresented = ( ev->touchPoints().size() > 1 ); + if( !swipe->started ) + result = QGestureRecognizer::CancelGesture; + else + if( ev->touchPoints().size() == 2 ) + { + //2-point gesture + + QTouchEvent::TouchPoint p1 = ev->touchPoints().at( 0 ); + QTouchEvent::TouchPoint p2 = ev->touchPoints().at( 1 ); + + if (swipe->lastPositions[0].isNull()) { + swipe->lastPositions[ 0 ] = p1.startScreenPos().toPoint(); + swipe->lastPositions[ 1 ] = p2.startScreenPos().toPoint(); + } + + if( !swipe->hasHotSpot() ) + { + swipe->setHotSpot( ( p1.startScreenPos() + p2.startScreenPos() ) / 2 ); + } + + int dx1 = p1.screenPos().toPoint().x() - swipe->lastPositions[ 0 ].x(); + int dx2 = p2.screenPos().toPoint().x() - swipe->lastPositions[ 1 ].x(); + int dy1 = p1.screenPos().toPoint().y() - swipe->lastPositions[ 0 ].y(); + int dy2 = p2.screenPos().toPoint().y() - swipe->lastPositions[ 1 ].y(); + + if( qAbs( ( dx1 + dx2 ) / 2.0 ) >= MOVE_X_TRESHOLD || + qAbs( ( dy1 + dy2 ) / 2.0 ) >= MOVE_Y_TRESHOLD ) + { + qreal angle1 = computeAngle( dx1, dy1 ); + qreal angle2 = computeAngle( dx2, dy2 ); + QSwipeGesture::SwipeDirection vertDir = getVerticalDirection( angle1 ); + QSwipeGesture::SwipeDirection horizDir = getHorizontalDirection( angle1 ); + + if( vertDir != getVerticalDirection( angle2 ) || + horizDir != getHorizontalDirection( angle2 ) ) + { + // It seems it is no swipe gesture + result = QGestureRecognizer::CancelGesture; + break; + } + + if( ( swipe->vertDirection != QSwipeGesture::NoDirection && horizDir != QSwipeGesture::NoDirection ) || + ( swipe->horizDirection != QSwipeGesture::NoDirection && vertDir != QSwipeGesture::NoDirection ) ) + { + // Gesture direction changed + result = QGestureRecognizer::CancelGesture; + break; + } + + swipe->vertDirection = vertDir; + swipe->horizDirection = horizDir; + + swipe->lastPositions[ 0 ] = p1.screenPos().toPoint(); + swipe->lastPositions[ 1 ] = p2.screenPos().toPoint(); + + result = QGestureRecognizer::TriggerGesture; + } + else + result = QGestureRecognizer::MayBeGesture; + } + else // No 2-point gesture + result = QGestureRecognizer::CancelGesture; + break; + } + case QEvent::MouseButtonPress: + case QEvent::MouseMove: + case QEvent::MouseButtonRelease: + result = QGestureRecognizer::Ignore; + break; + default: + result = QGestureRecognizer::Ignore; + break; + } + + return result; +} + +const qreal GDPinchGestureRecognizer::OUT_SCALE_LIMIT = 0.5; +const qreal GDPinchGestureRecognizer::IN_SCALE_LIMIT = 2; + +bool handleGestureEvent( QObject * obj, QEvent * event, GestureResult & result, + QPoint & point ) +{ + result = NOT_HANLDED; + + if( event->type() != QEvent::Gesture || !obj->isWidgetType() ) + return false; + + QGestureEvent * gev = static_cast( event ); + + gev->accept( Qt::PanGesture ); + + QGesture * gesture = gev->gesture( GDSwipeGestureType ); + if( gesture ) + { + GDSwipeGesture * swipe = static_cast< GDSwipeGesture * >( gesture ); + point = swipe->hotSpot().toPoint(); + + if( swipe->getHorizDirection() != QSwipeGesture::NoDirection ) + result = swipe->getHorizDirection() == QSwipeGesture::Left ? + SWIPE_LEFT : SWIPE_RIGHT; + + if( swipe->getVertDirection() != QSwipeGesture::NoDirection ) + result = swipe->getVertDirection() == QSwipeGesture::Up ? + SWIPE_UP : SWIPE_DOWN; + + gev->setAccepted( true ); + return true; + } + + gesture = gev->gesture( GDPinchGestureType ); + if( gesture ) + { + GDPinchGesture * pinch = static_cast< GDPinchGesture * >( gesture ); + point = pinch->getCenterPoint().toPoint(); + + if( pinch->isScaleChanged() ) + { + if( pinch->getTotalScaleFactor() <= GDPinchGestureRecognizer::OUT_SCALE_LIMIT ) + result = ZOOM_OUT; + if( pinch->getTotalScaleFactor() >= GDPinchGestureRecognizer::IN_SCALE_LIMIT ) + result = ZOOM_IN; + } + gev->setAccepted( true ); + return true; + } + + gesture = gev->gesture( Qt::PanGesture ); + if( gesture ) + { + gev->setAccepted( true ); + return true; + } + return false; +} + +void registerRecognizers() +{ + QGestureRecognizer * pRecognizer = new Gestures::GDPinchGestureRecognizer(); + GDPinchGestureType = QGestureRecognizer::registerRecognizer( pRecognizer ); + + pRecognizer = new Gestures::GDSwipeGestureRecognizer(); + GDSwipeGestureType = QGestureRecognizer::registerRecognizer( pRecognizer ); +} + +void unregisterRecognizers() +{ + if( GDPinchGestureType ) + QGestureRecognizer::unregisterRecognizer( GDPinchGestureType ); + + if( GDSwipeGestureType ) + QGestureRecognizer::unregisterRecognizer( GDSwipeGestureType ); +} + +} // namespace + +#endif //QT_VERSION diff -Nru goldendict-1.5.0~git20131003/gestures.hh goldendict-1.5.0~git20150923/gestures.hh --- goldendict-1.5.0~git20131003/gestures.hh 1970-01-01 00:00:00.000000000 +0000 +++ goldendict-1.5.0~git20150923/gestures.hh 2015-09-23 08:26:24.000000000 +0000 @@ -0,0 +1,117 @@ +#ifndef __GESTURES_HH_INCLUDED__ +#define __GESTURES_HH_INCLUDED__ + +#if QT_VERSION >= QT_VERSION_CHECK(4, 6, 0) + +#include +#include +#include +#include +#include + +namespace Gestures +{ + +enum GestureResult +{ + NOT_HANLDED, + SWIPE_LEFT, + SWIPE_RIGHT, + SWIPE_UP, + SWIPE_DOWN, + ZOOM_IN, + ZOOM_OUT +}; + +extern Qt::GestureType GDPinchGestureType; +extern Qt::GestureType GDSwipeGestureType; + +void registerRecognizers(); + +void unregisterRecognizers(); + +bool isFewTouchPointsPresented(); + +class GDPinchGestureRecognizer; +class GDPinchGesture : public QGesture +{ +public: + GDPinchGesture(); + + bool isScaleChanged() const + { return scaleChanged; } + QPointF const & getCenterPoint() const + { return centerPoint; } + qreal getTotalScaleFactor() const + { return totalScaleFactor; } + +protected: + QPointF startCenterPoint; + QPointF lastCenterPoint; + QPointF centerPoint; + + qreal lastScaleFactor; + qreal scaleFactor; + qreal totalScaleFactor; + + bool isNewSequence; + QPointF startPosition[ 2 ]; + bool scaleChanged; + + friend class GDPinchGestureRecognizer; +}; + +class GDSwipeGestureRecognizer; +class GDSwipeGesture : public QGesture +{ +public: + GDSwipeGesture(); + QSwipeGesture::SwipeDirection getHorizDirection() const + { return horizDirection; } + QSwipeGesture::SwipeDirection getVertDirection() const + { return vertDirection; } + +protected: + QSwipeGesture::SwipeDirection vertDirection; + QSwipeGesture::SwipeDirection horizDirection; + QPoint lastPositions[ 2 ]; + bool started; + + friend class GDSwipeGestureRecognizer; +}; + +class GDPinchGestureRecognizer : public QGestureRecognizer +{ +public: + static const qreal OUT_SCALE_LIMIT; + static const qreal IN_SCALE_LIMIT; + + GDPinchGestureRecognizer() {} +private: + + virtual QGesture* create( QObject* pTarget ); + virtual QGestureRecognizer::Result recognize( QGesture* pGesture, QObject *pWatched, QEvent * pEvent ); + void reset( QGesture *pGesture ); +}; + +class GDSwipeGestureRecognizer : public QGestureRecognizer +{ +public: + GDSwipeGestureRecognizer(){} +private: + static const int MOVE_X_TRESHOLD = 100; + static const int MOVE_Y_TRESHOLD = 50; + + virtual QGesture * create( QObject* pTarget ); + virtual QGestureRecognizer::Result recognize( QGesture* pGesture, QObject * pWatched, QEvent * pEvent ); + void reset ( QGesture * pGesture ); + qreal computeAngle( int dx, int dy ); +}; + +bool handleGestureEvent( QObject * obj, QEvent * event, GestureResult & result, QPoint & point ); + +} // namespace + +#endif + +#endif // __GESTURES_HH_INCLUDED__ diff -Nru goldendict-1.5.0~git20131003/goldendict.pro goldendict-1.5.0~git20150923/goldendict.pro --- goldendict-1.5.0~git20131003/goldendict.pro 2013-10-02 20:42:04.000000000 +0000 +++ goldendict-1.5.0~git20150923/goldendict.pro 2015-09-23 08:26:24.000000000 +0000 @@ -20,9 +20,11 @@ QT += xml QT += network QT += svg +QT += sql CONFIG += exceptions \ rtti \ - stl + stl \ + help OBJECTS_DIR = build UI_DIR = build MOC_DIR = build @@ -139,6 +141,9 @@ desktops.path = $$PREFIX/share/applications desktops.files = redist/*.desktop INSTALLS += desktops + helps.path = $$PREFIX/share/goldendict/help/ + helps.files = help/*.qch + INSTALLS += helps } mac { TARGET = GoldenDict @@ -171,7 +176,9 @@ QMAKE_POST_LINK = mkdir -p GoldenDict.app/Contents/Frameworks & \ cp -nR $${PWD}/maclibs/lib/ GoldenDict.app/Contents/Frameworks/ & \ mkdir -p GoldenDict.app/Contents/MacOS/locale & \ - cp -R locale/*.qm GoldenDict.app/Contents/MacOS/locale/ + cp -R locale/*.qm GoldenDict.app/Contents/MacOS/locale/ & \ + mkdir -p GoldenDict.app/Contents/MacOS/help & \ + cp -R $${PWD}/help/*.qch GoldenDict.app/Contents/MacOS/help/ CONFIG += zim_support } @@ -257,7 +264,6 @@ parsecmdline.hh \ dictspanewidget.hh \ maintabwidget.hh \ - dprintf.hh \ mainstatusbar.hh \ gdappstyle.hh \ ufile.hh \ @@ -279,7 +285,16 @@ ffmpegaudio.hh \ articleinspector.hh \ delegate.hh \ - zim.hh + zim.hh \ + gddebug.hh \ + gestures.hh \ + tiff.hh \ + dictheadwords.hh \ + fulltextsearch.hh \ + ftshelpers.hh \ + dictserver.hh \ + helpwindow.hh \ + slob.hh FORMS += groups.ui \ dictgroupwidget.ui \ @@ -293,7 +308,11 @@ about.ui \ editdictionaries.ui \ orderandprops.ui \ - dictinfo.ui + dictinfo.ui \ + dictheadwords.ui \ + authentication.ui \ + fulltextsearch.ui + SOURCES += folding.cc \ main.cc \ dictionary.cc \ @@ -389,7 +408,16 @@ ffmpegaudio.cc \ articleinspector.cc \ delegate.cc \ - zim.cc + zim.cc \ + gddebug.cc \ + gestures.cc \ + tiff.cc \ + dictheadwords.cc \ + fulltextsearch.cc \ + ftshelpers.cc \ + dictserver.cc \ + helpwindow.cc \ + slob.cc win32 { FORMS += texttospeechsource.ui @@ -424,6 +452,25 @@ LIBS += -llzma } +!CONFIG( no_extra_tiff_handler ) { + DEFINES += MAKE_EXTRA_TIFF_HANDLER + LIBS += -ltiff +} + +CONFIG( no_epwing_support ) { + DEFINES += NO_EPWING_SUPPORT +} + +!CONFIG( no_epwing_support ) { + HEADERS += epwing.hh \ + epwing_book.hh \ + epwing_charmap.hh + SOURCES += epwing.cc \ + epwing_book.cc \ + epwing_charmap.cc + LIBS += -leb +} + RESOURCES += resources.qrc \ flags.qrc TRANSLATIONS += locale/ru_RU.ts \ @@ -457,7 +504,9 @@ locale/nl_NL.ts \ locale/sr_SR.ts \ locale/sv_SE.ts \ - locale/tk_TM.ts + locale/tk_TM.ts \ + locale/fa_IR.ts \ + locale/mk_MK.ts # Build version file !isEmpty( hasGit ) { diff -Nru goldendict-1.5.0~git20131003/groups.cc goldendict-1.5.0~git20150923/groups.cc --- goldendict-1.5.0~git20131003/groups.cc 2013-08-16 09:41:47.000000000 +0000 +++ goldendict-1.5.0~git20150923/groups.cc 2015-09-23 08:26:24.000000000 +0000 @@ -26,6 +26,21 @@ ui.searchLine->applyTo( ui.dictionaries ); addAction( ui.searchLine->getFocusAction() ); + groupsListMenu = new QMenu( tr( "Group tabs" ), ui.groups ); + + groupsListButton = new QToolButton( ui.groups ); + groupsListButton->setAutoRaise( true ); + groupsListButton->setIcon( QIcon( ":/icons/windows-list.png" ) ); + groupsListButton->setMenu( groupsListMenu ); + groupsListButton->setToolTip( tr( "Open groups list" ) ); + groupsListButton->setPopupMode( QToolButton::InstantPopup ); + ui.groups->setCornerWidget( groupsListButton ); + groupsListButton->setFocusPolicy( Qt::ClickFocus ); + + connect(groupsListMenu, SIGNAL( aboutToShow() ), this, SLOT( fillGroupsMenu() ) ); + connect(groupsListMenu, SIGNAL( triggered( QAction * ) ), + this, SLOT( switchToGroup( QAction * ) ) ); + // Populate groups' widget ui.groups->populate( groups, dicts, ui.dictionaries->getCurrentDictionaries() ); @@ -205,4 +220,27 @@ } } +void Groups::fillGroupsMenu() +{ + groupsListMenu->clear(); + for( int i = 0; i < ui.groups->count(); i++ ) + { + QAction * act = groupsListMenu->addAction( ui.groups->tabText( i ) ); + act->setData( i ); + if (ui.groups->currentIndex() == i) + { + QFont f( act->font() ); + f.setBold( true ); + act->setFont( f ); + } + } + + if( groupsListMenu->actions().size() > 1 ) + groupsListMenu->setActiveAction( groupsListMenu->actions().at( ui.groups->currentIndex() ) ); +} +void Groups::switchToGroup( QAction * act ) +{ + int idx = act->data().toInt(); + ui.groups->setCurrentIndex(idx); +} diff -Nru goldendict-1.5.0~git20131003/groups.hh goldendict-1.5.0~git20150923/groups.hh --- goldendict-1.5.0~git20131003/groups.hh 2013-08-16 09:41:47.000000000 +0000 +++ goldendict-1.5.0~git20150923/groups.hh 2015-09-23 08:26:24.000000000 +0000 @@ -9,6 +9,7 @@ #include "dictionary.hh" #include "groups_widgets.hh" #include +#include class Groups: public QWidget { @@ -35,6 +36,9 @@ std::vector< sptr< Dictionary::Class > > const & dicts; Config::Groups groups; + QToolButton * groupsListButton; + QMenu * groupsListMenu; + // Reacts to the event that the number of groups is possibly changed void countChanged(); @@ -47,6 +51,8 @@ void removeFromGroup(); void addAutoGroups(); void showDictInfo( const QPoint & pos ); + void fillGroupsMenu(); + void switchToGroup( QAction * act ); signals: void showDictionaryInfo( QString const & id ); Binary files /tmp/tfsuf_fVoJ/goldendict-1.5.0~git20131003/help/gdhelp_en.qch and /tmp/nAvqxsPo0O/goldendict-1.5.0~git20150923/help/gdhelp_en.qch differ Binary files /tmp/tfsuf_fVoJ/goldendict-1.5.0~git20131003/help/gdhelp_ru.qch and /tmp/nAvqxsPo0O/goldendict-1.5.0~git20150923/help/gdhelp_ru.qch differ diff -Nru goldendict-1.5.0~git20131003/helpwindow.cc goldendict-1.5.0~git20150923/helpwindow.cc --- goldendict-1.5.0~git20131003/helpwindow.cc 1970-01-01 00:00:00.000000000 +0000 +++ goldendict-1.5.0~git20150923/helpwindow.cc 2015-09-23 08:26:24.000000000 +0000 @@ -0,0 +1,264 @@ +/* This file is (c) 2014 Abs62 + * Part of GoldenDict. Licensed under GPLv3 or later, see the LICENSE file */ + +#include +#include +#include +#include +#include +#include +#include + +#include "helpwindow.hh" +#include "gddebug.hh" + +namespace Help { + +HelpBrowser::HelpBrowser( QHelpEngineCore * engine, QWidget *parent ) : + QTextBrowser( parent ), + helpEngine( engine ) +{ + connect( this, SIGNAL( anchorClicked( QUrl ) ), this, SLOT( linkClicked( QUrl ) ) ); +} + +void HelpBrowser::showHelpForKeyword( QString const & id ) +{ + if ( helpEngine ) + { + QMap< QString, QUrl > links = helpEngine->linksForIdentifier( id ); + if( !links.isEmpty() ) + setSource( links.constBegin().value() ); + } +} + +QVariant HelpBrowser::loadResource( int type, QUrl const & name ) +{ + QByteArray ba; + if( type < 4 && helpEngine ) + { + QUrl url(name); + if( name.isRelative() ) + url = source().resolved( url ); + + ba = helpEngine->fileData(url ); + } + return ba; +} + +void HelpBrowser::linkClicked( QUrl const & url ) +{ + if( url.scheme() == "http" || url.scheme() == "https" ) + { + QDesktopServices::openUrl( url ); + } + else + setSource( url ); +} + +HelpWindow::HelpWindow( QWidget * parent, Config::Class & cfg_ ) : + QDialog( parent ), + cfg( cfg_ ), + helpEngine( 0 ) +{ + resize( QSize( 600, 450 ) ); + setWindowTitle( tr( "GoldenDict help" ) ); + setWindowFlags( windowFlags() & ~Qt::WindowContextHelpButtonHint ); + + QVBoxLayout * mainLayout = new QVBoxLayout( this ); + setLayout( mainLayout ); + + navToolBar = new QToolBar( this ); + navHome = navToolBar->addAction( QIcon( ":/icons/home.png" ), tr( "Home" ) ); + navToolBar->widgetForAction( navHome )->setObjectName( "helpHomeButton" ); + navBack = navToolBar->addAction( QIcon( ":/icons/previous.png" ), tr( "Back" ) ); + navToolBar->widgetForAction( navBack )->setObjectName( "helpBackButton" ); + navForward = navToolBar->addAction( QIcon( ":/icons/next.png" ), tr( "Forward" ) ); + navToolBar->widgetForAction( navForward )->setObjectName( "helpForwardButton" ); + + navToolBar->addSeparator(); + + zoomInAction = navToolBar->addAction( QIcon( ":/icons/icon32_zoomin" ), tr( "Zoom In" ) ); + navToolBar->widgetForAction( zoomInAction )->setObjectName( "zoomInButton" ); + zoomOutAction = navToolBar->addAction( QIcon( ":/icons/icon32_zoomout" ), tr( "Zoom Out" ) ); + navToolBar->widgetForAction( zoomInAction )->setObjectName( "zoomOutButton" ); + zoomBaseAction = navToolBar->addAction( QIcon( ":/icons/icon32_zoombase" ), tr( "Normal Size" ) ); + navToolBar->widgetForAction( zoomBaseAction )->setObjectName( "zoomBaseButton" ); + + navForward->setEnabled( false ); + navBack->setEnabled( false ); + + mainLayout->addWidget( navToolBar ); + + QString localeName = cfg.preferences.helpLanguage; + + if( localeName.isEmpty() ) + localeName = cfg.preferences.interfaceLanguage; + + if( localeName.isEmpty() ) + localeName = QLocale::system().name(); + + QString helpDir = Config::getHelpDir(); + helpFile = QDir::toNativeSeparators( helpDir + "/gdhelp_" + localeName + ".qch" ); + + if( !QFileInfo( helpFile ).isFile() ) + helpFile = QDir::toNativeSeparators( helpDir + "/gdhelp_" + localeName.left( 2 ) + ".qch" ); + + if( !QFileInfo( helpFile ).isFile() ) + helpFile = QDir::toNativeSeparators( helpDir + "/gdhelp_en.qch" ); + + helpCollectionFile = QDir::toNativeSeparators( Config::getConfigDir() + "gdhelp.qhc" ); + + helpEngine = new QHelpEngine( helpCollectionFile ); + + if( !helpEngine->setupData() ) + { + gdWarning( "Help engine initialization error: %s", helpEngine->error().toUtf8().data() ); + delete helpEngine; + helpEngine = 0; + } + else + { + if( !helpEngine->registerDocumentation( helpFile ) ) + { + gdWarning( "Help engine set file error: %s", helpEngine->error().toUtf8().data() ); + } + + tabWidget = new QTabWidget( this ); + tabWidget->addTab( helpEngine->contentWidget(), tr( "Content" ) ); + tabWidget->addTab( helpEngine->indexWidget(), tr( "Index" ) ); + + helpBrowser = new HelpBrowser( helpEngine, this ); + + helpBrowser->setOpenLinks( false ); + + connect( helpEngine->contentWidget(), SIGNAL( linkActivated( QUrl ) ), + helpBrowser, SLOT( setSource( QUrl ) ) ); + connect( helpEngine->indexWidget(), SIGNAL( linkActivated( QUrl, QString ) ), + helpBrowser, SLOT( setSource( QUrl ) ) ); + + connect( navHome, SIGNAL( triggered() ), helpBrowser, SLOT( home() ) ); + connect( navForward, SIGNAL( triggered() ), helpBrowser, SLOT( forward() ) ); + connect( navBack, SIGNAL( triggered() ), helpBrowser, SLOT( backward() ) ); + + connect( helpBrowser, SIGNAL( forwardAvailable( bool ) ), + this, SLOT( forwardEnabled( bool ) ) ); + + connect( helpBrowser, SIGNAL( backwardAvailable( bool ) ), + this, SLOT( backwardEnabled( bool ) ) ); + + connect( helpEngine->contentWidget(), SIGNAL( clicked( QModelIndex ) ), + this, SLOT( contentsItemClicked( QModelIndex ) ) ); + + connect( zoomInAction, SIGNAL( triggered( ) ), this, SLOT( zoomIn() ) ); + connect( zoomOutAction, SIGNAL( triggered( ) ), this, SLOT( zoomOut() ) ); + connect( zoomBaseAction, SIGNAL( triggered( ) ), this, SLOT( zoomBase() ) ); + + splitter = new QSplitter( this ); + splitter->addWidget( tabWidget ); + splitter->addWidget( helpBrowser ); + + splitter->setStretchFactor( 0, 1 ); + splitter->setStretchFactor( 1, 4 ); + mainLayout->addWidget( splitter ); + } + + if( !cfg.helpWindowGeometry.isEmpty() ) + restoreGeometry( cfg.helpWindowGeometry ); + if( !cfg.helpSplitterState.isEmpty() ) + splitter->restoreState( cfg.helpSplitterState ); + + QFont f = helpBrowser->font(); + fontSize = f.pointSize(); + if( fontSize < 10 ) + { + fontSize = 10; + f.setPointSize( fontSize ); + helpBrowser->setFont( f ); + } + + applyZoomFactor(); +} + +HelpWindow::~HelpWindow() +{ + if( helpEngine ) + delete helpEngine; + + QFile f( helpCollectionFile ); + f.remove(); +} + +void HelpWindow::reject() +{ + cfg.helpWindowGeometry = saveGeometry(); + cfg.helpSplitterState = splitter->saveState(); + emit needClose(); +} + +void HelpWindow::accept() +{ + cfg.helpWindowGeometry = saveGeometry(); + cfg.helpSplitterState = splitter->saveState(); + emit needClose(); +} + +void HelpWindow::showHelpFor( QString const & keyword ) +{ + helpBrowser->showHelpForKeyword( keyword ); +} + +void HelpWindow::forwardEnabled( bool enabled ) +{ + navForward->setEnabled( enabled ); +} + +void HelpWindow::backwardEnabled( bool enabled ) +{ + navBack->setEnabled( enabled ); +} + +void HelpWindow::contentsItemClicked( QModelIndex const & index ) +{ + QHelpContentItem * item = helpEngine->contentModel()->contentItemAt( index ); + if( !item->url().isEmpty() ) + helpBrowser->setSource( item->url() ); +} + +void HelpWindow::zoomIn() +{ + cfg.preferences.helpZoomFactor += 0.2; + applyZoomFactor(); +} + +void HelpWindow::zoomOut() +{ + cfg.preferences.helpZoomFactor -= 0.2; + applyZoomFactor(); +} + +void HelpWindow::zoomBase() +{ + cfg.preferences.helpZoomFactor = 1; + applyZoomFactor(); +} + +void HelpWindow::applyZoomFactor() +{ + if ( cfg.preferences.helpZoomFactor >= 5 ) + cfg.preferences.helpZoomFactor = 5; + else if ( cfg.preferences.helpZoomFactor <= 0.2 ) + cfg.preferences.helpZoomFactor = 0.2; + + zoomInAction->setEnabled( cfg.preferences.helpZoomFactor < 5 ); + zoomOutAction->setEnabled( cfg.preferences.helpZoomFactor > 0.2 ); + zoomBaseAction->setEnabled( cfg.preferences.helpZoomFactor != 1.0 ); + + if( fontSize > 0 ) + { + QFont f = helpBrowser->font(); + f.setPointSize( fontSize * cfg.preferences.helpZoomFactor ); + helpBrowser->setFont( f ); + } +} + +} // namespace Help diff -Nru goldendict-1.5.0~git20131003/helpwindow.hh goldendict-1.5.0~git20150923/helpwindow.hh --- goldendict-1.5.0~git20131003/helpwindow.hh 1970-01-01 00:00:00.000000000 +0000 +++ goldendict-1.5.0~git20150923/helpwindow.hh 2015-09-23 08:26:24.000000000 +0000 @@ -0,0 +1,79 @@ +#ifndef __HELPWINDOW_HH_INCLUDED__ +#define __HELPWINDOW_HH_INCLUDED__ + +#include +#include +#include +#include +#include +#include +#include +#include + +#include + +#include "config.hh" + +namespace Help { + +class HelpBrowser : public QTextBrowser +{ +Q_OBJECT +public: + HelpBrowser( QHelpEngineCore * engine, QWidget *parent ); + void showHelpForKeyword( QString const & id ); +private: + QVariant loadResource( int type, QUrl const & name ); + QHelpEngineCore * helpEngine; + +private slots: + void linkClicked( QUrl const & url ); +}; + + +class HelpWindow : public QDialog +{ +Q_OBJECT + + Config::Class & cfg; + QToolBar * navToolBar; + QHelpEngine * helpEngine; + QTabWidget * tabWidget; + HelpBrowser * helpBrowser; + QAction * navForward, * navBack, * navHome; + QAction * zoomInAction, * zoomOutAction, * zoomBaseAction; + QSplitter * splitter; + + QString helpFile, helpCollectionFile; + + int fontSize; + + void applyZoomFactor(); + +public: + HelpWindow( QWidget * parent, Config::Class & cfg_ ); + ~HelpWindow(); + + QHelpEngine const * getHelpEngine() + { return helpEngine; } + + void showHelpFor( QString const & keyword ); + +public slots: + virtual void reject(); + virtual void accept(); + void forwardEnabled( bool enabled ); + void backwardEnabled( bool enabled ); + void contentsItemClicked( QModelIndex const & index ); + + void zoomIn(); + void zoomOut(); + void zoomBase(); + +signals: + void needClose(); +}; + +} // namespace Help + +#endif // __HELPWINDOW_HH_INCLUDED__ diff -Nru goldendict-1.5.0~git20131003/hotkeyedit.cc goldendict-1.5.0~git20150923/hotkeyedit.cc --- goldendict-1.5.0~git20131003/hotkeyedit.cc 2013-08-16 09:41:47.000000000 +0000 +++ goldendict-1.5.0~git20150923/hotkeyedit.cc 2015-09-23 08:26:24.000000000 +0000 @@ -10,6 +10,7 @@ continuingCombo( false ) { renderCurrentValue(); + installEventFilter( this ); } void HotKeyEdit::setHotKey( Config::HotKey const & hk ) @@ -38,10 +39,10 @@ if ( currentKey1 ) { - result = QKeySequence( currentKey1 | currentModifiers ).toString( QKeySequence::PortableText ); + result = QKeySequence( currentKey1 | currentModifiers ).toString( QKeySequence::NativeText ); if ( currentKey2 ) - result += "+" + QKeySequence( currentKey2 ).toString( QKeySequence::PortableText ); + result += "+" + QKeySequence( currentKey2 ).toString( QKeySequence::NativeText ); } setText( result ); @@ -117,3 +118,12 @@ QLineEdit::keyReleaseEvent( event ); } +bool HotKeyEdit::eventFilter( QObject *, QEvent * event ) +{ + if( event->type() == QEvent::ShortcutOverride ) + { + event->accept(); + return true; + } + return false; +} diff -Nru goldendict-1.5.0~git20131003/hotkeyedit.hh goldendict-1.5.0~git20150923/hotkeyedit.hh --- goldendict-1.5.0~git20131003/hotkeyedit.hh 2012-10-01 07:15:20.000000000 +0000 +++ goldendict-1.5.0~git20150923/hotkeyedit.hh 2015-09-23 08:26:24.000000000 +0000 @@ -32,6 +32,7 @@ private: void renderCurrentValue(); + bool eventFilter( QObject *, QEvent * event ); }; #endif diff -Nru goldendict-1.5.0~git20131003/hotkeywrapper.cc goldendict-1.5.0~git20150923/hotkeywrapper.cc --- goldendict-1.5.0~git20131003/hotkeywrapper.cc 2013-10-02 20:42:04.000000000 +0000 +++ goldendict-1.5.0~git20150923/hotkeywrapper.cc 2015-09-23 08:26:24.000000000 +0000 @@ -4,22 +4,32 @@ #endif #include "hotkeywrapper.hh" -#include "dprintf.hh" +#include "gddebug.hh" #ifdef Q_WS_X11 #include #endif +#ifdef Q_OS_WIN32 +#include "mainwindow.hh" +#endif + ////////////////////////////////////////////////////////////////////////// QHotkeyApplication::QHotkeyApplication( int & argc, char ** argv ): QtSingleApplication( argc, argv ) +#ifdef Q_OS_WIN32 +, mainWindow( 0 ) +#endif { } QHotkeyApplication::QHotkeyApplication( QString const & id, int & argc, char ** argv ): QtSingleApplication( id, argc, argv ) +#ifdef Q_OS_WIN32 +, mainWindow( 0 ) +#endif { } @@ -60,7 +70,7 @@ modifier( modifier_ ), handle( handle_ ), id( id_ ) -#ifdef Q_OS_MACX +#ifdef Q_OS_MAC , hkRef( 0 ) , hkRef2( 0 ) #endif @@ -383,6 +393,12 @@ } } + if( mainWindow ) + { + if( ( static_cast< MainWindow * >( mainWindow ) )->handleGDMessage( message, result ) ) + return true; + } + return QApplication::winEventFilter( message, result ); } @@ -465,7 +481,7 @@ if ( !XRecordEnableContext( dataDisplay, recordContext, recordEventCallback, (XPointer) this ) ) - DPRINTF( "Failed to enable record context\n" ); + GD_DPRINTF( "Failed to enable record context\n" ); } diff -Nru goldendict-1.5.0~git20131003/hotkeywrapper.hh goldendict-1.5.0~git20150923/hotkeywrapper.hh --- goldendict-1.5.0~git20131003/hotkeywrapper.hh 2013-10-02 20:42:04.000000000 +0000 +++ goldendict-1.5.0~git20150923/hotkeywrapper.hh 2015-09-23 08:26:24.000000000 +0000 @@ -13,7 +13,7 @@ #endif -#ifdef Q_OS_MACX +#ifdef Q_OS_MAC #define __SECURITYHI__ #include #endif @@ -32,7 +32,7 @@ quint32 modifier; int handle; int id; -#ifdef Q_OS_MACX +#ifdef Q_OS_MAC EventHotKeyRef hkRef, hkRef2; #endif }; @@ -69,7 +69,7 @@ void waitKey2(); -#ifndef Q_OS_MACX +#ifndef Q_OS_MAC private slots: bool checkState( quint32 vk, quint32 mod ); @@ -89,7 +89,7 @@ virtual bool winEvent ( MSG * message, long * result ); HWND hwnd; -#elif defined(Q_OS_MACX) +#elif defined(Q_OS_MAC) public: void activated( int hkId ); @@ -208,6 +208,11 @@ #ifdef Q_OS_WIN32 virtual bool winEventFilter ( MSG * message, long * result ); + QWidget * mainWindow; +public: + void setMainWindow( QWidget * widget ) + { mainWindow = widget; } +protected: #endif QList hotkeyWrappers; diff -Nru goldendict-1.5.0~git20131003/htmlescape.cc goldendict-1.5.0~git20150923/htmlescape.cc --- goldendict-1.5.0~git20131003/htmlescape.cc 2013-08-16 09:45:56.000000000 +0000 +++ goldendict-1.5.0~git20150923/htmlescape.cc 2015-09-23 08:26:24.000000000 +0000 @@ -3,6 +3,7 @@ #include #include +#include #include "htmlescape.hh" namespace Html { @@ -136,17 +137,26 @@ return result; } -QString unescape( QString const & str ) +QString unescape( QString const & str, bool saveFormat ) { // Does it contain HTML? If it does, we need to strip it if ( str.contains( '<' ) || str.contains( '&' ) ) - return QTextDocumentFragment::fromHtml( str ).toPlainText(); + { + QString tmp = str; + if( !saveFormat ) + { + tmp.replace( QRegExp( "<(?:\\s*(?:div|p(?![alr])|br|li(?![ns])|td|blockquote|/ol))[^>]{0,}>", + Qt::CaseInsensitive, QRegExp::RegExp2 ), " " ); + tmp.remove( QRegExp( "<[^>]*>", Qt::CaseSensitive, QRegExp::RegExp2 ) ); + } + return QTextDocumentFragment::fromHtml( tmp.trimmed() ).toPlainText(); + } return str; } -string unescapeUtf8( const string &str ) +string unescapeUtf8( const string &str, bool saveFormat ) { - return string( unescape( QString::fromUtf8( str.c_str(), str.size() ) ).toUtf8().data() ); + return string( unescape( QString::fromUtf8( str.c_str(), str.size() ) ).toUtf8().data(), saveFormat ); } } diff -Nru goldendict-1.5.0~git20131003/htmlescape.hh goldendict-1.5.0~git20150923/htmlescape.hh --- goldendict-1.5.0~git20131003/htmlescape.hh 2013-08-16 09:45:56.000000000 +0000 +++ goldendict-1.5.0~git20150923/htmlescape.hh 2015-09-23 08:26:24.000000000 +0000 @@ -23,8 +23,8 @@ string escapeForJavaScript( string const & ); // Replace html entities -QString unescape( QString const & str ); -string unescapeUtf8( string const & str ); +QString unescape( QString const & str, bool saveFormat = false ); +string unescapeUtf8( string const & str, bool saveFormat = false ); } diff -Nru goldendict-1.5.0~git20131003/hunspell.cc goldendict-1.5.0~git20150923/hunspell.cc --- goldendict-1.5.0~git20131003/hunspell.cc 2013-10-02 20:42:04.000000000 +0000 +++ goldendict-1.5.0~git20150923/hunspell.cc 2015-09-23 08:26:24.000000000 +0000 @@ -17,7 +17,7 @@ #include #include #include -#include "dprintf.hh" +#include "gddebug.hh" #include "fsencoding.hh" #include @@ -34,6 +34,13 @@ string name; Hunspell hunspell; +#ifdef Q_OS_WIN32 + static string Utf8ToLocal8Bit( string const & name ) + { + return string( QString::fromUtf8( name.c_str() ).toLocal8Bit().data() ); + } +#endif + public: /// files[ 0 ] should be .aff file, files[ 1 ] should be .dic file. @@ -41,7 +48,11 @@ vector< string > const & files ): Dictionary::Class( id, files ), name( name_ ), +#ifdef Q_OS_WIN32 + hunspell( Utf8ToLocal8Bit( files[ 0 ] ).c_str(), Utf8ToLocal8Bit( files[ 1 ] ).c_str() ) +#else hunspell( files[ 0 ].c_str(), files[ 1 ].c_str() ) +#endif { } @@ -72,6 +83,8 @@ virtual bool isLocalDictionary() { return true; } + virtual vector< wstring > getAlternateWritings( const wstring & word ) throw(); + protected: virtual void loadIcon() throw(); @@ -99,6 +112,16 @@ /// Iconv::Ex wstring decodeFromHunspell( Hunspell &, char const * ); +/// Generates suggestions via hunspell +QVector< wstring > suggest( wstring & word, Mutex & hunspellMutex, + Hunspell & hunspell ); + +/// Generates suggestions for compound expression +void getSuggestionsForExpression( wstring const & expression, + vector< wstring > & suggestions, + Mutex & hunspellMutex, + Hunspell & hunspell ); + /// Returns true if the string contains whitespace, false otherwise bool containsWhitespace( wstring const & str ) { @@ -131,6 +154,18 @@ dictionaryIconLoaded = true; } +vector< wstring > HunspellDictionary::getAlternateWritings( wstring const & word ) throw() +{ + vector< wstring > results; + + if( containsWhitespace( word ) ) + { + getSuggestionsForExpression( word, results, getHunspellMutex(), hunspell ); + } + + return results; +} + /// HunspellDictionary::getArticle() class HunspellArticleRequest; @@ -281,11 +316,11 @@ } catch( Iconv::Ex & e ) { - qWarning( "Hunspell: charset convertion error, no processing's done: %s\n", e.what() ); + gdWarning( "Hunspell: charset convertion error, no processing's done: %s\n", e.what() ); } catch( std::exception & e ) { - qWarning( "Hunspell: error: %s\n", e.what() ); + gdWarning( "Hunspell: error: %s\n", e.what() ); } if ( suggestions ) @@ -366,11 +401,6 @@ isCancelled.ref(); hasExited.acquire(); } - -private: - - /// Generates suggestions via hunspell - QVector< wstring > suggest( wstring & word ); }; void HunspellHeadwordsRequestRunnable::run() @@ -398,58 +428,18 @@ if ( containsWhitespace( trimmedWord ) ) { - // Analyze each word separately and use the first suggestion, if any. - // This is useful for compound expressions where one of the words is - // in different form, e.g. "dozing off" -> "doze off". - // In this mode, we only provide a single suggestion at most. - - wstring result; - - wstring word; - - for( wchar const * c = trimmedWord.c_str(); ; ++c ) - { - if ( !*c || Folding::isPunct( *c ) || Folding::isWhitespace( * c ) ) - { - if ( word.size() ) - { - QVector< wstring > suggestions = suggest( word ); - - if ( suggestions.size() ) - result += suggestions[ 0 ]; - else - result += word; + vector< wstring > results; - word.clear(); - } - if ( *c ) - result.push_back( *c ); - else - break; - } - else - word.push_back( *c ); - } + getSuggestionsForExpression( trimmedWord, results, hunspellMutex, hunspell ); - if ( word.size() ) - { - QVector< wstring > suggestions = suggest( trimmedWord ); + Mutex::Lock _( dataMutex ); + for( unsigned i = 0; i < results.size(); i++ ) + matches.push_back( results[ i ] ); - if ( suggestions.size() ) - result += suggestions[ 0 ]; - else - result += word; - } - - if ( result != trimmedWord ) - { - Mutex::Lock _( dataMutex ); - matches.push_back( result ); - } } else { - QVector< wstring > suggestions = suggest( trimmedWord ); + QVector< wstring > suggestions = suggest( trimmedWord, hunspellMutex, hunspell ); if ( !suggestions.empty() ) { @@ -463,7 +453,7 @@ finish(); } -QVector< wstring > HunspellHeadwordsRequest::suggest( wstring & word ) +QVector< wstring > suggest( wstring & word, Mutex & hunspellMutex, Hunspell & hunspell ) { QVector< wstring > result; @@ -491,7 +481,7 @@ { QString suggestion = gd::toQString( decodeFromHunspell( hunspell, suggestions[ x ] ) ); - DPRINTF( ">>>Sugg: %s\n", suggestion.toLocal8Bit().data() ); + GD_DPRINTF( ">>>Sugg: %s\n", suggestion.toLocal8Bit().data() ); if ( cutStem.indexIn( suggestion ) != -1 ) { @@ -499,7 +489,9 @@ if ( Folding::applySimpleCaseOnly( alt ) != lowercasedWord ) // No point in providing same word { +#ifdef QT_DEBUG qDebug() << ">>>>>Alt:" << gd::toQString( alt ); +#endif result.append( alt ); } } @@ -508,7 +500,7 @@ } catch( Iconv::Ex & e ) { - qWarning( "Hunspell: charset convertion error, no processing's done: %s\n", e.what() ); + gdWarning( "Hunspell: charset convertion error, no processing's done: %s\n", e.what() ); } if ( suggestions ) @@ -630,7 +622,7 @@ } catch( Iconv::Ex & e ) { - qWarning( "Hunspell: charset convertion error, no processing's done: %s\n", e.what() ); + gdWarning( "Hunspell: charset convertion error, no processing's done: %s\n", e.what() ); } finish(); @@ -643,6 +635,102 @@ return new HunspellPrefixMatchRequest( word, getHunspellMutex(), hunspell ); } +void getSuggestionsForExpression( wstring const & expression, + vector & suggestions, + Mutex & hunspellMutex, + Hunspell & hunspell ) +{ + // Analyze each word separately and use the first two suggestions, if any. + // This is useful for compound expressions where some words is + // in different form, e.g. "dozing off" -> "doze off". + + wstring trimmedWord = Folding::trimWhitespaceOrPunct( expression ); + wstring word, punct; + QVector< wstring > words; + + suggestions.clear(); + + // Parse string to separate words + + for( wchar const * c = trimmedWord.c_str(); ; ++c ) + { + if ( !*c || Folding::isPunct( *c ) || Folding::isWhitespace( * c ) ) + { + if ( word.size() ) + { + words.push_back( word ); + word.clear(); + } + if ( *c ) + punct.push_back( *c ); + } + else + { + if( punct.size() ) + { + words.push_back( punct ); + punct.clear(); + } + if( *c ) + word.push_back( *c ); + } + if( !*c ) + break; + } + + if( words.size() > 21 ) + { + // Too many words - no suggestions + return; + } + + // Combine result strings from suggestions + + QVector< wstring > results; + + for( int i = 0; i < words.size(); i++ ) + { + word = words.at( i ); + if( Folding::isPunct( word[ 0 ] ) || Folding::isWhitespace( word[ 0 ] ) ) + { + for( int j = 0; j < results.size(); j++ ) + results[ j ].append( word ); + } + else + { + QVector< wstring > sugg = suggest( word, hunspellMutex, hunspell ); + int suggNum = sugg.size() + 1; + if( suggNum > 3 ) + suggNum = 3; + int resNum = results.size(); + wstring resultStr; + + if( resNum == 0 ) + { + for( int k = 0; k < suggNum; k++ ) + results.push_back( k == 0 ? word : sugg.at( k - 1 ) ); + } + else + { + for( int j = 0; j < resNum; j++ ) + { + resultStr = results.at( j ); + for( int k = 0; k < suggNum; k++ ) + { + if( k == 0) + results[ j ].append( word ); + else + results.push_back( resultStr + sugg.at( k - 1 ) ); + } + } + } + } + } + + for( int i = 0; i < results.size(); i++ ) + if( results.at( i ) != trimmedWord ) + suggestions.push_back( results.at( i ) ); +} string encodeToHunspell( Hunspell & hunspell, wstring const & str ) { Binary files /tmp/tfsuf_fVoJ/goldendict-1.5.0~git20131003/icons/home.png and /tmp/nAvqxsPo0O/goldendict-1.5.0~git20150923/icons/home.png differ Binary files /tmp/tfsuf_fVoJ/goldendict-1.5.0~git20131003/icons/icon32_epwing.png and /tmp/nAvqxsPo0O/goldendict-1.5.0~git20150923/icons/icon32_epwing.png differ Binary files /tmp/tfsuf_fVoJ/goldendict-1.5.0~git20131003/icons/icon32_slob.png and /tmp/nAvqxsPo0O/goldendict-1.5.0~git20150923/icons/icon32_slob.png differ diff -Nru goldendict-1.5.0~git20131003/indexedzip.cc goldendict-1.5.0~git20150923/indexedzip.cc --- goldendict-1.5.0~git20131003/indexedzip.cc 2013-10-02 20:42:04.000000000 +0000 +++ goldendict-1.5.0~git20150923/indexedzip.cc 2015-09-23 08:26:24.000000000 +0000 @@ -4,9 +4,10 @@ #include "indexedzip.hh" #include "zipfile.hh" #include -#include "dprintf.hh" +#include "gddebug.hh" #include "utf8.hh" #include "iconv.hh" +#include "wstring_qt.hh" #include @@ -59,7 +60,7 @@ if ( !ZipFile::readLocalHeader( zip, header ) ) { - DPRINTF( "Failed to load header\n" ); + GD_DPRINTF( "Failed to load header\n" ); return false; } @@ -68,13 +69,13 @@ switch( header.compressionMethod ) { case ZipFile::Uncompressed: - DPRINTF( "Uncompressed\n" ); + GD_DPRINTF( "Uncompressed\n" ); data.resize( header.uncompressedSize ); return (size_t) zip.read( &data.front(), data.size() ) == data.size(); case ZipFile::Deflated: { - DPRINTF( "Deflated\n" ); + GD_DPRINTF( "Deflated\n" ); // Now do the deflation @@ -102,7 +103,7 @@ if ( inflate( &stream, Z_FINISH ) != Z_STREAM_END ) { - DPRINTF( "Not zstream end!" ); + GD_DPRINTF( "Not zstream end!" ); data.clear(); @@ -122,7 +123,7 @@ } } -bool IndexedZip::indexFile( BtreeIndexing::IndexedWords &zipFileNames ) +bool IndexedZip::indexFile( BtreeIndexing::IndexedWords &zipFileNames, quint32 * filesCount ) { if ( !zipIsOpen ) return false; @@ -131,8 +132,15 @@ // File seems to be a valid zip file + + QTextCodec * localeCodec = QTextCodec::codecForLocale(); + ZipFile::CentralDirEntry entry; + bool alreadyCounted; + if( filesCount ) + *filesCount = 0; + while( ZipFile::readNextEntry( zip, entry ) ) { if ( entry.compressionMethod == ZipFile::Unsupported ) @@ -161,16 +169,20 @@ break; } + alreadyCounted = false; + if ( !hasNonAscii ) { // Add entry as is zipFileNames.addSingleWord( Utf8::decode( entry.fileName.data() ), entry.localHeaderOffset ); + if( filesCount ) + *filesCount += 1; } else { - // Try assuming different encodings. Those are UTF8 and two + // Try assuming different encodings. Those are UTF8, system locale and two // Russian ones (Windows and Windows OEM). Unfortunately, zip // files do not say which encoding they utilize. @@ -181,38 +193,86 @@ zipFileNames.addSingleWord( decoded, entry.localHeaderOffset ); + if( filesCount != 0 && !alreadyCounted ) + { + *filesCount += 1; + alreadyCounted = true; + } } catch( Utf8::exCantDecode ) { // Failed to decode } - // CP866 - try + if( !entry.fileNameInUTF8 ) { - wstring decoded = Iconv::toWstring( "CP866", entry.fileName.constData(), - entry.fileName.size() ); + wstring nameInSystemLocale; - zipFileNames.addSingleWord( decoded, - entry.localHeaderOffset ); - } - catch( Iconv::Ex ) - { + // System locale + if( localeCodec ) + { + QString name = localeCodec->toUnicode( entry.fileName.constData(), + entry.fileName.size() ); + nameInSystemLocale = gd::toWString( name ); + if( !nameInSystemLocale.empty() ) + { + zipFileNames.addSingleWord( nameInSystemLocale, + entry.localHeaderOffset ); + + if( filesCount != 0 && !alreadyCounted ) + { + *filesCount += 1; + alreadyCounted = true; + } + } + } + + + // CP866 + try + { + wstring decoded = Iconv::toWstring( "CP866", entry.fileName.constData(), + entry.fileName.size() ); + + if( nameInSystemLocale.compare( decoded ) != 0 ) + { + zipFileNames.addSingleWord( decoded, + entry.localHeaderOffset ); + + if( filesCount != 0 && !alreadyCounted ) + { + *filesCount += 1; + alreadyCounted = true; + } + } + } + catch( Iconv::Ex ) + { + // Failed to decode + } + + // CP1251 + try + { + wstring decoded = Iconv::toWstring( "CP1251", entry.fileName.constData(), + entry.fileName.size() ); + + if( nameInSystemLocale.compare( decoded ) != 0 ) + { + zipFileNames.addSingleWord( decoded, + entry.localHeaderOffset ); + + if( filesCount != 0 && !alreadyCounted ) + { + *filesCount += 1; + alreadyCounted = true; + } + } + } + catch( Iconv::Ex ) + { // Failed to decode - } - - // CP1251 - try - { - wstring decoded = Iconv::toWstring( "CP1251", entry.fileName.constData(), - entry.fileName.size() ); - - zipFileNames.addSingleWord( decoded, - entry.localHeaderOffset ); - } - catch( Iconv::Ex ) - { - // Failed to decode + } } } } diff -Nru goldendict-1.5.0~git20131003/indexedzip.hh goldendict-1.5.0~git20150923/indexedzip.hh --- goldendict-1.5.0~git20131003/indexedzip.hh 2012-10-01 07:15:20.000000000 +0000 +++ goldendict-1.5.0~git20150923/indexedzip.hh 2015-09-23 08:26:24.000000000 +0000 @@ -39,7 +39,7 @@ bool loadFile( uint32_t offset, std::vector< char > & ); /// Index compressed files in zip file - bool indexFile( BtreeIndexing::IndexedWords &zipFileNames ); + bool indexFile( BtreeIndexing::IndexedWords &zipFileNames, quint32 * filesCount = 0 ); }; #endif diff -Nru goldendict-1.5.0~git20131003/keyboardstate.cc goldendict-1.5.0~git20150923/keyboardstate.cc --- goldendict-1.5.0~git20131003/keyboardstate.cc 2013-08-16 09:41:47.000000000 +0000 +++ goldendict-1.5.0~git20150923/keyboardstate.cc 2015-09-23 08:26:24.000000000 +0000 @@ -10,7 +10,7 @@ #include #include #include -#elif defined Q_OS_MACX +#elif defined Q_OS_MAC #define __SECURITYHI__ #include #endif @@ -32,7 +32,7 @@ ( mask & LeftShift && !( GetAsyncKeyState( VK_LSHIFT ) & 0x8000 ) ) || ( mask & RightShift && !( GetAsyncKeyState( VK_RSHIFT ) & 0x8000 ) ) ); - #elif defined Q_OS_MACX + #elif defined Q_OS_MAC UInt32 keys = GetCurrentKeyModifiers(); return !( ( mask & Alt && !( keys & ( 1 << optionKeyBit ) ) ) || diff -Nru goldendict-1.5.0~git20131003/lionsupport.h goldendict-1.5.0~git20150923/lionsupport.h --- goldendict-1.5.0~git20131003/lionsupport.h 2012-10-01 07:15:20.000000000 +0000 +++ goldendict-1.5.0~git20150923/lionsupport.h 2015-09-23 08:26:24.000000000 +0000 @@ -15,6 +15,9 @@ * Adds fullscreen button to window for Lion. */ static void addFullscreen(MainWindow *window); + + //Check for retina display + static bool isRetinaDisplay(); }; #endif // LIONSUPPORT_H diff -Nru goldendict-1.5.0~git20131003/lionsupport.mm goldendict-1.5.0~git20150923/lionsupport.mm --- goldendict-1.5.0~git20131003/lionsupport.mm 2012-10-01 07:15:20.000000000 +0000 +++ goldendict-1.5.0~git20150923/lionsupport.mm 2015-09-23 08:26:24.000000000 +0000 @@ -1,3 +1,5 @@ +#include +#include #include "lionsupport.h" bool LionSupport::isLion() @@ -20,3 +22,13 @@ #warning No fullscreen support will be included in this build #endif } + +bool LionSupport::isRetinaDisplay() +{ +#if defined(MAC_OS_X_VERSION_10_7) && MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_7 + return( [ [ NSScreen mainScreen ] respondsToSelector:@selector( backingScaleFactor ) ] + && [ [ NSScreen mainScreen ] backingScaleFactor ] > 1.5 ); +#else + return false; +#endif +} diff -Nru goldendict-1.5.0~git20131003/loaddictionaries.cc goldendict-1.5.0~git20150923/loaddictionaries.cc --- goldendict-1.5.0~git20131003/loaddictionaries.cc 2013-10-02 20:42:04.000000000 +0000 +++ goldendict-1.5.0~git20150923/loaddictionaries.cc 2015-09-23 08:26:24.000000000 +0000 @@ -20,7 +20,7 @@ #include "forvo.hh" #include "programs.hh" #include "voiceengines.hh" -#include "dprintf.hh" +#include "gddebug.hh" #include "fsencoding.hh" #include "xdxf.hh" #include "sdict.hh" @@ -28,6 +28,12 @@ #include "zipsounds.hh" #include "mdx.hh" #include "zim.hh" +#include "dictserver.hh" +#include "slob.hh" + +#ifndef NO_EPWING_SUPPORT +#include "epwing.hh" +#endif #include #include @@ -53,7 +59,10 @@ << "*.xdxf.dz" << "*.dct" << "*.aar" << "*.zips" << "*.mdx" #ifdef MAKE_ZIM_SUPPORT - << "*.zim" << "*.zimaa" + << "*.zim" << "*.zimaa" << "*.slob" +#endif +#ifndef NO_EPWING_SUPPORT + << "*catalogs" #endif ; } @@ -199,6 +208,22 @@ dictionaries.insert( dictionaries.end(), zimDictionaries.begin(), zimDictionaries.end() ); } + { + vector< sptr< Dictionary::Class > > slobDictionaries = + Slob::makeDictionaries( allFiles, FsEncoding::encode( Config::getIndexDir() ), *this ); + + dictionaries.insert( dictionaries.end(), slobDictionaries.begin(), + slobDictionaries.end() ); + } +#endif +#ifndef NO_EPWING_SUPPORT + { + vector< sptr< Dictionary::Class > > epwingDictionaries = + Epwing::makeDictionaries( allFiles, FsEncoding::encode( Config::getIndexDir() ), *this ); + + dictionaries.insert( dictionaries.end(), epwingDictionaries.begin(), + epwingDictionaries.end() ); + } #endif } @@ -318,14 +343,35 @@ dictionaries.insert( dictionaries.end(), dicts.begin(), dicts.end() ); } - DPRINTF( "Load done\n" ); + { + vector< sptr< Dictionary::Class > > dicts = + DictServer::makeDictionaries( cfg.dictServers ); + + dictionaries.insert( dictionaries.end(), dicts.begin(), dicts.end() ); + } + + GD_DPRINTF( "Load done\n" ); // Remove any stale index files set< string > ids; + std::pair< std::set< string >::iterator, bool > ret; + + QTextCodec::setCodecForCStrings( QTextCodec::codecForName( "UTF8" ) ); for( unsigned x = dictionaries.size(); x--; ) - ids.insert( dictionaries[ x ]->getId() ); + { + ret = ids.insert( dictionaries[ x ]->getId() ); + if( !ret.second ) + { + gdWarning( "Duplicate dictionary ID found: ID=%s, name=\"%s\", path=\"%s\"", + dictionaries[ x ]->getId().c_str(), + dictionaries[ x ]->getName().c_str(), + dictionaries[ x ]->getDictionaryFilenames().empty() ? + "" : dictionaries[ x ]->getDictionaryFilenames()[ 0 ].c_str() + ); + } + } QDir indexDir( Config::getIndexDir() ); @@ -334,8 +380,13 @@ for( QStringList::const_iterator i = allIdxFiles.constBegin(); i != allIdxFiles.constEnd(); ++i ) { - if ( ids.find( FsEncoding::encode( *i ) ) == ids.end() && - i->size() == 32 ) + if ( ids.find( FsEncoding::encode( *i ) ) == ids.end() + && i->size() == 32 ) + indexDir.remove( *i ); + else + if ( i->endsWith( "_FTS" ) + && i->size() == 36 + && ids.find( FsEncoding::encode( i->left( 32 ) ) ) == ids.end() ) indexDir.remove( *i ); } diff -Nru goldendict-1.5.0~git20131003/locale/ar_SA.ts goldendict-1.5.0~git20150923/locale/ar_SA.ts --- goldendict-1.5.0~git20131003/locale/ar_SA.ts 2013-10-02 20:42:04.000000000 +0000 +++ goldendict-1.5.0~git20150923/locale/ar_SA.ts 2015-09-23 08:26:24.000000000 +0000 @@ -1,6 +1,6 @@ - + About @@ -11,137 +11,133 @@ GoldenDict dictionary lookup program, version - برنامج القاموس الذهبي للبحث في القواميس, الاصدار + برنامج القاموس الذهبي للبحث في القواميس، الإصدار (c) 2008-2013 Konstantin Isakov (ikm@goldendict.org) - (c) 2008-2013 Konstantin Isakov (ikm@goldendict.org) - - - - Credits: - المساهمون: - - - #.# - #.# + (c) 2008-2013 قسطنطين ايزاكوف (ikm@goldendict.org) Licensed under GNU GPLv3 or later - مرخص وفق GNU GPLv3 أو أحدث + مرخص وفق الإصدار الثّالث من رُخصة غنّو أو أحدث + + + + Credits: + إشادات: [Unknown] - [مجهول] + [غير معروف] - + Based on Qt %1 (%2, %3 bit) - + مبني على كيوتي %1 (%2، %3 بت) ArticleMaker - + Expand article - + وسّع المقالة - + Collapse article - + اطوِ المقالة - + No translation for <b>%1</b> was found in group <b>%2</b>. - لم يجد ترجمة لـ <b>%1</b> في المجموعة <b>%2</b>. + تعذّر إيجاد ترجمة لـ <b>%1</b> في المجموعة <b>%2</b>. - + No translation was found in group <b>%1</b>. - لم يُعثر على ترجمة في مجموعة <b>%1</b>. + تعذّر إيجاد ترجمة في مجموعة <b>%1</b>. - + Welcome! - مرحبا! + مرحبًا بك! - + <h3 align="center">Welcome to <b>GoldenDict</b>!</h3><p>To start working with the program, first visit <b>Edit|Dictionaries</b> to add some directory paths where to search for the dictionary files, set up various Wikipedia sites or other sources, adjust dictionary order or create dictionary groups.<p>And then you're ready to look up your words! You can do that in this window by using a pane to the left, or you can <a href="Working with popup">look up words from other active applications</a>. <p>To customize program, check out the available preferences at <b>Edit|Preferences</b>. All settings there have tooltips, be sure to read them if you are in doubt about anything.<p>Should you need further help, have any questions, suggestions or just wonder what the others think, you are welcome at the program's <a href="http://goldendict.org/forum/">forum</a>.<p>Check program's <a href="http://goldendict.org/">website</a> for the updates. <p>(c) 2008-2013 Konstantin Isakov. Licensed under GPLv3 or later. - ت<h3 align="center">مرحبا في <b>القاموس الذهبي</b>!<p>لتبدأ العمل مع البرنامج، اذهب إلى <b>تحرير|قواميس</b> لاضافة بعض مسارات القواميس لأبحث فيها، اعدّ قواميس ويكيبيديا متنوعة أو مصادر أخرى، غير ترتيب القواميس أو أنشئ مجموعة للقواميس.<p>وعندها انت جاهز للبحث عن كلمات! يمكنك عمل ذلك من هذه النافذة باستخدام اللوح الأيمن، أو يمكنك <a href="Working with popup"> البحث عن كلمات أثناء عملك على برامج أخرى </a>. <p> لتخصيص برنامج، تحقق من التفضيلات عند <b>تحرير|تفضيلات </b>. كل الاعدادات هناك لها تلمحيات، تأكد من قرائتها إن كنت في شك من أي شيء.<p>ان احتجت لمزيد من المساعدة، أو عندك أي سؤال، اقتراح أو تريد أن تعرف ماذا يقول الآخرون، فأنت مرحب بك في في <a href="http://goldendict.org/forum/">منتدى</a> البرنامج. <p>تحقق من <a href="http://goldendict.org/">موقع</a> البرنامج لأجل التحديثات. <p>(c) 2008-2013 Konstantin Isakov. مرخص تحت GPLv3 أو أحدث. + <h3 dir="RTL" align="center">مرحبًا بك في <b>القاموس الذهبي</b>!</h3><p dir="RTL">لبدأ العمل مع البرنامج، زُر أولًا <b>حرّر|قواميس</b> لإضافة بعض مسارات القواميس حيث يُبحث فيها عن ملفات القواميس، إعداد مواقع ويكيبيديا شتّى أو مصادر أخرى، ضبط ترتيب القواميس أو إنشاء مجموعات قواميس.<p dir="RTL">ثمَّ ستكون جاهزًا للبحث عن الكلمات! يمكنك فعل ذلك في الناقذة باستخدام اللوحة على اليمين، أو يمكنك <a href="Working with popup">البحث عن الكلمات من تطبيقات نشطة أخرى</a>. <p dir="RTL">لتخصيص البرنامج، اكتشف التفضيلات المتوفّرة في <b>حرّر|تفضيلات</b>. كل الإعدادات هناك تملك تلميحات، تأكّد من قرائتها إن كنت تشكّ في أي شيء.<p dir="RTL">إن احتجت إلى مزيدٍ من المعلومات، لديك بعض الأسئلة، اقتراحات أو تتسائل فيما يفكّر الغير، نرحّب بك دائمًا في <a href="http://goldendict.org/forum/">منتدى</a> البرنامج.<p dir="RTL">تحقّق من <a href="http://goldendict.org/">موقع وِب</a> البرنامج للتحديثات.<p dir="RTL">حقوق النشر 2008-2013 كونستانتين إيساكوف. مرخّص وفق رخصة جنو العمومية الإصدار 3 أو أحدث. - + Working with popup العمل مع المنبثقات - + <h3 align="center">Working with the popup</h3>To look up words from other active applications, you would need to first activate the <i>"Scan popup functionality"</i> in <b>Preferences</b>, and then enable it at any time either by triggering the 'Popup' icon above, or by clicking the tray icon down below with your right mouse button and choosing so in the menu you've popped. - <h3 align="center">العمل مع المنبثقات</h3>لنظر كلمة من برنامج نشط آخر, عليك أولا تفعيل <i>"خاصية منبثقة المسح"</i> في <b>التفضيلات</b>, ثم تفعيلها في أي وقت إما بضغط أيقونة ‘المنبثقة‘ فوق, أو بالنقر على أيقونة الزاوية بزر الفأرة الأيمن واختيار ذلك من القائمة التي أظهرتها. + <h3 dir="RTL" align="center">العمل مع المنبثقة</h3><p dir="RTL">للبحث عن الكلمات في تطبيقات نشطة أخرى، عليك أولًا تفعيل <i>"وظيفة منبثقة الاستكشاف"</i> في <b>تفضيلات</b>، ثمّ مكّنها في أي وقت بإطلاق أيقونة "منبثقة" بالأعلى، أو بنقر أيقونة صينية النظام بزر الفأرة الأيمن واختيارها في القائمة التي ظهرت. - + Then just stop the cursor over the word you want to look up in another application, and a window would pop up which would describe it to you. - ثم اوقف المؤشر على الكلمة التي تريد نظرها في البرنامج الآخر, و ستنبثق نافذة تصفها لك. + <p dir="RTL">ثمَّ أوقف فقط المؤشر على الكلمة التي تريد البحث عنها في التطبيق الآخر، وستنبثق نافذة تصِف لكَ الكلمة. - + Then just select any word you want to look up in another application by your mouse (double-click it or swipe it with mouse with the button pressed), and a window would pop up which would describe the word to you. - ثم اختر أية كلمة لنظرها في البرنامج الآخر بالفأرة (نقرتين عليها او حددها بالفأرة و الزر مضغوط), و ستظهر لك نافذة تصفها لك. + <p dir="RTL">ثمَّ حدّد فقط أي كلمة تريد البحث عنها في التطبيق الآخر بالفأرة (انقر مزدوجًا أو مرّرها بالفأرة أثناء ضغط الزر)، وستنبثق نافذة تصِف لكَ الكلمة. - + (untitled) - (بلا عنوان) + (غير معنون) - + (picture) - + (صورة) ArticleRequest - + Expand article - + وسّع المقالة - + From من - + Collapse article - + اطوِ المقالة - + Query error: %1 - أخطاء الطلب: %1 + خطأ استعلام: %1 - + Close words: - كلمات قريبة: + الكلمات القريبة: - + Compound expressions: - تعبيرات مركبة: + التعابير المركّبة: - + Individual words: - كلمات مفردة: + الكلمات مفردةً: @@ -149,236 +145,227 @@ Form - صيغة + نموذج - + about:blank - about:blank + حول:فارغ - - x - x + + Find: + اعثر على: - - Find: - ابحث: + + x + س - + + &Previous ال&سابق - + + &Next - ال&لاحق + ال&تالي - + Ctrl+G Ctrl+G - - &Case Sensitive - &حساس للحالة + + Highlight &all + أبرز ال&كل - - Highlight &all - + + &Case Sensitive + ح&سّاس للحالة - + Select Current Article - + حدّد المقالة الحالية - + Copy as text - + انسخ كنص - + Inspect - + افحص - + Resource - + المورد - + Audio - + الصوت - + TTS Voice - + صوت قراءة النّصوص - + Picture - + الصورة - - Definition from dictionary "%1": %2 - + + Video + المرئيات - - Definition: %1 - + + Video: %1 + المقطع المرئي: %1 - GoldenDict - القاموس الذهبي + + Definition from dictionary "%1": %2 + التّعريف من القاموس "%1": %2 - - + + Definition: %1 + تعريف: %1 + + + + The referenced resource doesn't exist. - المرجع المشار إليه غير موجود. + المورد المشار إليه غير موجود. - + The referenced audio program doesn't exist. - + برنامج الصوت المشار إليه غير موجود. - + + ERROR: %1 - - - - - Save sound - - - - - Sound files (*.wav *.ogg *.mp3 *.mp4 *.aac *.flac *.mid *.wv *.ape);;All files (*.*) - + خطأ: %1 - - Save image - - - - - Image files (*.bmp *.jpg *.png *.tif);;All files (*.*) - - - - + &Open Link - ا&فتح الرابط + ا&فتح الوصلة - - Video - + + Open Link in New &Tab + افتح الوصلة في &لسان جديد - - Video: %1 - + + Open Link in &External Browser + افتح الوصلة في متصفّح &خارجي - - Open Link in New &Tab - افتح الرابط في لسا&ن جديد + + Save &image... + احفظ ال&صّورة... - - Open Link in &External Browser - افتح الرابط في &متصفح خارجي + + Save s&ound... + احفظ الصّو&ت... - + &Look up "%1" - ا&نظر "%1" + اب&حث عن "%1" - + Look up "%1" in &New Tab - انظر "%1" في &لسان جديد + ابحث عن "%1" في لسان &جديد - + Send "%1" to input line - + أرسل "%1" إلى سطر الإدخال - - + + &Add "%1" to history - + أ&ضف "%1" إلى التأريخ - + Look up "%1" in %2 - انظر "%1" في %2 + ابحث عن "%1" في %2 - + Look up "%1" in %2 in &New Tab - انظر "%1"في %2 في لسان &جديد + ابحث عن "%1" في %2 في لسان &جديد - - WARNING: FFmpeg Audio Player: %1 - + + Save sound + احفظ الصوت + + + + Sound files (*.wav *.ogg *.mp3 *.mp4 *.aac *.flac *.mid *.wv *.ape);;All files (*.*) + ملفات صوت (*.wav *.ogg *.mp3 *.mp4 *.aac *.flac *.mid *.wv *.ape);;كل الملفات (*.*) - Playing a non-WAV file - تشغيل ملف غير WAV + + Save image + احفظ الصّورة - To enable playback of files different than WAV, please go to Edit|Preferences, choose the Audio tab and select "Play via DirectShow" there. - لتمكين تشغيل ملفات غير WAV، اذهب إلى تحرير|تفضيلات، اختر لسان الصوت وانتق "شغل عبر DirectShow" من هناك. + + Image files (*.bmp *.jpg *.png *.tif);;All files (*.*) + ملفات صورة (*.bmp *.jpg *.png *.tif);;كل الملفات (*.*) - + Failed to run a player to play sound file: %1 - فشل بدء مشغل لتشغيل ملف الصوت: %1 + فشل فتح مشغّل لملف الصّوت: %1 - + Failed to create temporary file. - فشل إنشاء ملف مؤقت. + فشل في إنشاء ملف مؤقت. - + Failed to auto-open resource file, try opening manually: %1. - تعذر فتح ملف المصدر آليا, حاول فتحه يدويا: %1. - - - - The referenced resource failed to download. - فشل تنزيل المرجع المشار إليه. + فشل في فتح ملف المورد تلقائيًّا، حاول فتحه يدويًّا: %1. - - Save &image... - + + WARNING: %1 + تحذير: %1 - - Save s&ound... - + + The referenced resource failed to download. + فشل تنزيل المورد المشار إليه. - - WARNING: %1 - تحذير: %1 + + WARNING: FFmpeg Audio Player: %1 + تحذير: مشغّل FFmpeg الصوتي: %1 @@ -386,26 +373,49 @@ Belarusian transliteration from latin to cyrillic (classic orthography) - + النّقل الحرفي البيلاروسي من اللاتينية إلى السيريلية (قواعد الإملاء التّقليدية) Belarusian transliteration from latin to cyrillic (school orthography) - + النّقل الحرفي البيلاروسي من اللاتينية إلى السيريلية (قواعد الإملاء المدرسية) Belarusian transliteration (smoothes out the difference between classic and school orthography in cyrillic) + النّقل الحرفي البيلاروسي (ينعّم الفوارق بين قواعد الإملاء التّقليدية والمدرسية في السيريلية) + + + + Dialog + + + Proxy authentication required + + + You need to supply a Username and a Password to access via proxy + + + + + Username: + + + + + Password: + كلمة المرور: + DictGroupWidget Form - صيغة + نموذج @@ -415,42 +425,42 @@ Shortcut: - الاختصار: + الاختصار: None - لاشيء + لا شيء From file... - من ملف... + من ملف... Choose a file to use as group icon - اختر ملفا ليستخدم كرمز للمجموعة + اختر ملفًا لاستخدامه كرمز للمجموعة Images - صور + الصور All files - كل الملفات + كل الملفات Error - خطأ + خطأ Can't read the specified image file. - تعذر قراءة ملف الصورة المحدد. + تعذّر قراءة ملف الصورة المحدّد. @@ -461,92 +471,215 @@ Dictionaries: - + القواميس: Confirmation - التأكد + التّأكيد Are you sure you want to generate a set of groups based on language pairs? - أمتأكد من رغبتك بتوليد مجموعات حسب أزواج اللغة؟ + هل أنت متأكد من توليد مجموعة مجموعات مبنية على زوجي اللّغة؟ Unassigned - + غير مُعيّن Combine groups by source language to "%1->" - + ادمج المجموعات باللغة المصدر إلى "%1->" Combine groups by target language to "->%1" - + ادمج المجموعات باللغة الهدف إلى "->%1" Make two-side translate group "%1-%2-%1" - + أنشئ مجموعة ترجمة من جهتين "%1-%2-%1" Combine groups with "%1" + ادمج المجموعات بـ "%1" + + + + DictHeadwords + + + Search mode + + + + + This element determines how filter string will be interpreted + + + + + If checked on the symbols case will be take in account when filtering + + + + + Match case + + + + + Exports headwords to file + + + + + Export + + + + + Help + + + + + OK + + + + + Press this button to apply filter to headwords list + + + + + Apply + + + + + If checked any filter changes will we immediately applied to headwords list + + + + + Auto apply + + + + + Filter: + + + + + Filter string (fixed string, wildcards or regular expression) + + + + + Text + + + + + Wildcards + + + + + RegExp + + + Unique headwords total: %1, filtered: %2 + + + + + Save headwords to file + + + + + Text files (*.txt);;All files (*.*) + ملفات نص (*.txt);;كل الملفات (*.*) + + + + Export headwords... + + + + + Cancel + ألغِ + DictInfo Total articles: - مجموع المقالات: + مجموع المقالات: Translates from: - ترجم من: + ترجم من: Total words: - مجموع الكلمات: + مجموع الكلمات: Translates to: - ترجم إلى: + ترجم إلى: Open folder - + افتح المجلد Edit dictionary - + حرّر القاموس Files comprising this dictionary: - الملفات المشتملة على هذا القاموس: + الملفات التي تتضمن القاموس: Description: + الوصف: + + + + Show all unique dictionary headwords + + + + + Headwords Edit the dictionary via command: %1 - + حرّر القاموس بالأمر: %1 @@ -554,44 +687,113 @@ %1 entries - %1 مدخل + %1 من المدخلات - DictionaryBar + DictServer - Dictionary Bar - شريط القاموس + + Url: + + + Databases: + + + + + Search strategies: + + + + + Server databases + + + + + DictServersModel + + + Enabled + + + + + Name + الاسم + + + + Address + العنوان + + + + Databases + + + + + Strategies + + + + + Icon + + + + + Comma-delimited list of databases +(empty string or "*" matches all databases) + + + + + Comma-delimited list of search strategies +(empty string mean "prefix" strategy) + + + + + DictionaryBar + &Dictionary Bar - + شريط ال&قواميس Extended menu with all dictionaries... - + قائمة موسّعة بكل القواميس... Edit this group - حرر هذه المجموعة + حرّر هذه المجموعة - + Dictionary info + معلومات القاموس + + + + Dictionary headwords - + Open dictionary folder - + افتح مجلد القاموس - + Edit dictionary - + حرّر القاموس @@ -602,41 +804,41 @@ قواميس - + &Sources - &مصادر + م&صادر - - + + &Dictionaries &قواميس - - + + &Groups م&جموعات - + Sources changed - تغيرت المصادر + تغيّرت المصادر - + Some sources were changed. Would you like to accept the changes? - بعض المصادر تغيرت. أتقبل التغييرات؟ + بعض المصادر تغيّرت. أتقبل التّغييرات؟ - + Accept - أقبل + اقبل - + Cancel - ألغ + ألغِ @@ -644,6 +846,92 @@ the viewer program name is empty + اسم برنامج العارض فارغ + + + + FTS::FtsIndexing + + + None + + + + + FTS::FullTextSearchDialog + + + Full-text search + + + + + Whole words + + + + + Plain text + + + + + Wildcards + + + + + RegExp + + + + + Max distance between words (%1-%2): + + + + + Max articles per dictionary (%1-%2): + + + + + + + Articles found: + + + + + Now indexing: + + + + + CJK symbols in search string are not compatible with search modes "Whole words" and "Plain text" + + + + + The search line must contains at least one word containing + + + + + or more symbols + + + + + No dictionaries for full-text search + + + + + FTS::Indexing + + + None @@ -652,37 +940,96 @@ XML parse error: %1 at %2,%3 - خطأ عبارة XML: %1 في %2,%3 + خطأ تحليل XML: %1 عند %2،%3 + + + + Added %1 + أُضيف %1 + + + + by + بواسطة + + + + Male + ذكر + + + + Female + أنثى + + + + from + من + + + + Go to Edit|Dictionaries|Sources|Forvo and apply for our own API key to make this error disappear. + اذهب إلى حرّر|قواميس|فورڤو واطلب منّا مفتاح API لإخفاء هذا الخطأ. + + + + FullTextSearchDialog + + + + Search + + + + + Match case + + + + + Mode: + + + + + Articles found: + + + + + Available dictionaries in group: + - - Added %1 - اُضيف %1 + + Wait for indexing: + - - by - من + + Total: + - - Male - ذكر + + Indexed: + - - Female - انثى + + Now indexing: None + - - from - من + + Cancel + ألغِ - - Go to Edit|Dictionaries|Sources|Forvo and apply for our own API key to make this error disappear. - اذهب إلى تحرير|قواميس|مصادر|فروفو وطبّق لمفتحاح API الخاص بنا لإذهاب هذا الخطأ. + + Help + @@ -690,7 +1037,7 @@ German Transliteration - الترجمة الصوتية الألمانية + النسخ الألماني الحرفي @@ -698,7 +1045,7 @@ Greek Transliteration - الترجمة الصوتية اليونانية + النسخ اليوناني الحرفي @@ -714,12 +1061,12 @@ Form - صيغة + نموذج Look in - انظر في + ابحث في @@ -732,7 +1079,7 @@ Add selected dictionaries to group (Ins) - أضف القواميس المحددة للمجموعة (Ins) + أضف القواميس المحدّدة إلى المجموعة (Ins) @@ -747,7 +1094,7 @@ Remove selected dictionaries from group (Del) - أزل القواميس المحددة من المجموعة (Del) + أزل القواميس المحدّدة من المجموعة (Del) @@ -767,7 +1114,7 @@ Tab 2 - Tab 2 + لسان 2 @@ -782,22 +1129,22 @@ Create language-based groups - أنشئ مجموعات بحسب اللغة + أنشئ مجموعات مبنية على اللغات Auto groups - مجموعات تلقائية + مجموعات تلقائية Rename current dictionary group - غير تسمية مجموعة القواميس الحالية + أعد تسمية مجموعة القواميس الحالية Re&name group - &غير تسمية المجموعة + أ&عد تسمية المجموعة @@ -816,49 +1163,107 @@ - + Remove all groups أزل كل المجموعات Drag&drop dictionaries to and from the groups, move them inside the groups, reorder the groups using your mouse. - اسحب و أ&فلت القواميس إلى ومن المجموعات, انقلهم داخل المجموعات, أعد ترتيب المجموعة باستخدام الفأرة. + اسحب وأ&فلت القواميس من وإلى المجموعات، انقلها داخل المجموعات، أعد ترتيب المجموعات باستخدام الفأرة. + + + + Group tabs + + + + + Open groups list + - + Add group أضف مجموعة - + Give a name for the new group: - أعط المجموعة الجديدة اسما: + ضع اسمًا للمجموعة الجديدة: - + Rename group - غير اسم المجموعة + أعد تسمية المجموعة - + Give a new name for the group: - أعط المجموعة الجديدة اسما: + ضع اسمًا جديدًا للمجموعة: - + Remove group أزل المجموعة - + Are you sure you want to remove the group <b>%1</b>? - أمتأكد من رغبتك بازالة المجموعة <b>%1</b>؟ + هل أنت متأكد من إزالة المجموعة <b>%1</b>؟ - + Are you sure you want to remove all the groups? - أمتأكد من رغبتك بازالة كل المجموعات؟ + هل أنت متأكد من إزالة كل المجموعات؟ + + + + Help::HelpWindow + + + GoldenDict help + + + + + Home + + + + + Back + ارجع + + + + Forward + تقدّم + + + + Zoom In + قرّب + + + + Zoom Out + بعّد + + + + Normal Size + الحجم الطّبيعي + + + + Content + + + + + Index + @@ -866,51 +1271,51 @@ &Delete Selected - + ا&حذف المحدّد Copy Selected - + انسخ المحدّد History: - + التأريخ: %1/%2 - + %1/%2 History size: %1 entries out of maximum %2 - + حجم التأريخ: %1 من المدخلات من أصل %2 Hunspell - + Spelling suggestions: - اقتراحات التهجئة: + اقتراحات الإملاء: - + %1 Morphology - %1 صرف + الصَرْف %1 HunspellDictsModel - + Enabled - مفعل + مُمكّن - + Name الاسم @@ -920,23 +1325,23 @@ GoldenDict - Initializing - بدء - القاموس الذهبي + القاموس الذهبي - يهيّئ Please wait while indexing dictionary - انتظر بينما تفهرس القواميس + فضلًا انتظر بينما تُفهرَس القواميس Dictionary Name - اسم القاموس + اسم القامويس Please wait... - رجاء انتظر... + فضلًا انتظر... @@ -944,1013 +1349,1013 @@ Afar - + العفرية Abkhazian - + الأبخازية Avestan - + الأفستية Afrikaans - + الإفريقية Akan - + الأكانية Amharic - + الأمهرية Aragonese - + الأراغونية Arabic - عربي + العربية Assamese - + الأسامية Avaric - + الأفارية Aymara - + الأيمارية Azerbaijani - + الأذرية Bashkir - + الباشكيرية Belarusian - + البلاروسية Bulgarian - + البلغارية Bihari - + البيهارية Bislama - + البيسلامية Bambara - + البامبارية Bengali - + البنغالية Tibetan - + التبتية Breton - + البريتونية Bosnian - + البوسنية Catalan - + الكتالانية Chechen - + الشيشانية Chamorro - + التشامورو Corsican - + الكورسيكية Cree - + الكري Czech - + التشيكية Church Slavic - + الكنيسة السلافية Chuvash - + التشوفاشية Welsh - + الويلزية Danish - + الدنماركية German - + الألمانية Divehi - + الدِّيْفِيْهيّة Dzongkha - + الزونخاية Ewe - + اليو Greek - + اليونانية English - انكليزي + الإنجليزية Esperanto - + الاسبرانتو Spanish - + الإسبانية Estonian - + الأستونية Basque - + الباسكية Persian - فارسي + الفارسية Fulah - + الفولانية Finnish - + الفنلندية Fijian - + الفيجية Faroese - + الفاروية French - + الفرنسية Western Frisian - + الفريزيان Irish - + الأيرلندية Scottish Gaelic - + الغيلية الأسكتلندية Galician - + الجاليكية Guarani - + الغوارانية Gujarati - + الغوجاراتية Manx - + المنكية Hausa - + الهوساوية Hebrew - + العبرية Hindi - + الهندية Hiri Motu - + الحيري موتو Croatian - + الكرواتية Haitian - + الهايتية Hungarian - + المجرية Armenian - + الأرمينية Herero - + الهيريرو Interlingua - + الوسيطة Indonesian - + الأندونيسية Interlingue - + الإنترلينجوا Igbo - + الإيبو Sichuan Yi - + سيتشوان يي Inupiaq - + الاينبياك Ido - + الآيدوية Icelandic - + الأيسلاندية Italian - + الإيطالية Inuktitut - + الإنكتيتوتية Japanese - + اليابانية Javanese - + الجاوية Georgian - + الجورجية Kongo - + الكونغو Kikuyu - + الكيكويو Kwanyama - + الكوانيامية Kazakh - + الكازاخية Kalaallisut - + الجرينلاندية Khmer - + الخميرية Kannada - + الكانادية Korean - + الكورية Kanuri - + الكانورية Kashmiri - + الكشميرية Kurdish - + الكردية Komi - + الكومية Cornish - + الكورنية Kirghiz - + القيرقيزية Latin - + اللاتينية Luxembourgish - + اللوكسمبرجية Ganda - + الغاندا Limburgish - + الليمبرجيشية Lingala - + اللينغالية Lao - + اللاوية Lithuanian - + اللتوانية Luba-Katanga - + لوبا-كاتانغا Latvian - + اللاتفية Malagasy - + المالاجاشية Marshallese - + المارشالية Maori - + الماورية Macedonian - + المقدونية Malayalam - + المالايالامية Mongolian - + المنغولية Marathi - + المهاراتية Malay - + المالاوية Maltese - + المالطية Burmese - + البورمية Nauru - + الناورو Norwegian Bokmal - + بوكمال النرويجية North Ndebele - + شمال نديبيلي Nepali - + النيبالية Ndonga - + الإندونجية Dutch - + الهولندية Norwegian Nynorsk - + النينورسك النرويجية Norwegian - + النرويجية South Ndebele - + جنوب نديبيلي Navajo - + النافاهو Chichewa - + الشيشيوا Occitan - + الأوكيتانية Ojibwa - + الأوجيبوا Oromo - + الأورومية Oriya - + الأوريا Ossetian - + الأوسيتية Panjabi - + البنجابية Pali - + البالية Polish - + البولندية Pashto - + البشتونية Portuguese - + البرتغالية Quechua - + الكويتشوا Raeto-Romance - + ريتو-الرومانسية Kirundi - + الكيروندية Romanian - + الرومانية Russian - + الروسية Kinyarwanda - + الكينيارواندية Sanskrit - + السنسكريتية Sardinian - + السردينية Sindhi - + السندية Northern Sami - + شمال سامي Sango - + السانغو Serbo-Croatian - + الصربية الكرواتية Sinhala - + السنهالية Slovak - + السلوفاكية Slovenian - + السلوفينية Samoan - + الساموية Shona - + الشونا Somali - + الصومالية Albanian - + الألبانية Serbian - + الصربية Swati - + السواتية Southern Sotho - + جنوب السوتو Sundanese - + السوندانية Swedish - + السويدية Swahili - + السواحلية Tamil - + التاميلية Telugu - + التيلجو Tajik - + الطاجيكية Thai - + التايلاندية Tigrinya - + التغرينية Turkmen - + التركمانية Tagalog - + التاجالوجية Tswana - + التسوانية Tonga - + التونغا Turkish - + التركية Tsonga - + التسونجا Tatar - + التتارية Twi - + التوي Tahitian - + التاهيتية Uighur - ايغور + الإيغورية Ukrainian - + الأوكرانية Urdu - اوردو + الأُردية Uzbek - + الأوزبكية Venda - + الفيندا Vietnamese - + الفيتنامية Volapuk - + فولابوك Walloon - + الولونية Wolof - + الوولوف Xhosa - + زوسا Yiddish - + اليديشية Yoruba - + اليوروبية Zhuang - + التشوانغية Chinese - + الصينية Zulu - + الزولو Lojban - + اللوجبانية Traditional Chinese - + الصينية التقليدية Simplified Chinese - + الصينية المبسطة Other - + أخرى Other Simplified Chinese dialects - + لهجات الصينية المبسطة الأخرى Other Traditional Chinese dialects - + لهجات الصينية التقليدية الأخرى Other Eastern-European languages - + لغات شرق أوروبا الأخرى Other Western-European languages - + لغات غرب أوروبا الأخرى Other Russian languages - + اللغات الروسية الأخرى Other Japanese languages - + اللغات اليابانية الأخرى Other Baltic languages - + اللغات البلطيقية الأخرى Other Greek languages - + اللغات اليونانية الأخرى Other Korean dialects - + اللهجات الكورية الأخرى Other Turkish dialects - + اللهجات التركية الأخرى Other Thai dialects - + اللهجات التايلاندية الأخرى Tamazight - + الأمازيغية LoadDictionaries - + Error loading dictionaries خطأ في تحميل القواميس @@ -1958,633 +2363,638 @@ Main - + Error in configuration file. Continue with default settings? - + خطأ في ملف الإعداد. أأتابع بالإعدادات الافتراضية؟ MainWindow - GoldenDict - القاموس الذهبي - - - + Welcome! - مرحبا! + مرحبًا بك! - + &File &ملف - + &Edit - &حرر + &حرّر - + &Help - &مساعدة + م&ساعدة - + &View &عرض - + &Zoom - &كبّر + ت&قريب - + H&istory - &تاريخ + &تأريخ - Search Pane - شريط البحث - - - - &Dictionaries... - &قواميس... + + Search + - - F3 - F3 + + &Search Pane + لوحة ال&بحث - &Groups... - م&جموعات... + + &Results Navigation Pane + لوحة التنقّل بين النتائ&ج - - &Search Pane - + + &History Pane + لوحة التأري&خ - - &Results Navigation Pane - + + &Dictionaries... + &قواميس... - - &History Pane - + + F3 + F3 - + &Preferences... ت&فضيلات... - + F4 F4 - + &Homepage &صفحة البداية - + &About - ح&ول + &حول - + About GoldenDict حول القاموس الذهبي - + + GoldenDict reference + + + + F1 F1 - - + + &Quit ا&خرج - + Quit from application - اخرج من البرنامج + اخرج من التطبيق - + Ctrl+Q - Ctrl+خ + Ctrl+Q - + &Forum - &منتدى + المن&تدى - + &Close To Tray - ا&نزل لزاوية النظام + أ&غلق إلى صينية النظام - + Minimizes the window to tray - تصغير النافذة إلى الزاوية + يصغّر النافذة إلى صينية النظام - + Ctrl+F4 Ctrl+F4 - + &Save Article - ا&حفظ المقال + ا&حفظ المقالة - + Save Article - حفظ المقال + احفظ المقالة - + F2 F2 - + &Print ا&طبع - + Ctrl+P - Ctrl+ط + Ctrl+P - + Page Set&up - ا&عداد الصفحة + إ&عداد الصفحة - + Print Pre&view - + معاي&نة الطباعة - + &Rescan Files - + أعد إ&كتشاف الملفات - - &New Tab - + + Ctrl+F5 + Ctrl+F5 - - &Always on Top - + + &Clear + ا&محُ - - Always on Top - + + &New Tab + لسان &جديد - - Ctrl+O - + + Ctrl+T + Ctrl+T - - - - Menu Button - + + &Configuration Folder + مجلد الإ&عداد - Print Preview - معاينة الطباعة + + + &Show + أ&ظهر - Rescan Files - اعد فحص الملفات + + Ctrl+H + Ctrl+H - - Ctrl+F5 - Ctrl+F5 + + &Export + &صدّر - - &Clear - &مسح + + &Import + ا&ستورد - - New Tab - + + &Always on Top + &دائمًا في الأعلى - - Ctrl+T - + + Always on Top + دائمًا في الأعلى - - &Configuration Folder - + + Ctrl+O + Ctrl+O - - - &Show - + + + + Menu Button + زر قائمة - - Ctrl+H + + Search in page - - &Export + + Ctrl+F - - &Import + + Full-text search - Show Names in Dictionary Bar - اعرض الاسماء في شريط القواميس + + Ctrl+Shift+F + - - &Menubar - + + Show Names in Dictionary &Bar + أظهر الأسماء في &شريط القواميس - - - Look up in: - انظر في: + + Show Small Icons in &Toolbars + أظهر رموز صغيرة في شريط الأد&وات - - Found in Dictionaries: - + + &Menubar + شريط ال&قوائم - Navigation - التنقل + + &Navigation + التن&قّل - + Back ارجع - + Forward - تقدم + تقدّم - + Scan Popup - انبثاق النتائج + منبثقة الاستكشاف - + Pronounce Word (Alt+S) انطق الكلمة (Alt+S) - + Zoom In - تكبير + قرّب - + Zoom Out - تصغير + بعّد - + Normal Size - حجم طبيعي + الحجم الطّبيعي + + + + + Look up in: + ابحث في: + + + + Found in Dictionaries: + اعثر في القواميس: - + Words Zoom In - تكبير الكلمات + قرّب الكلمات - + Words Zoom Out - تصغير الكلمات + يعّد الكلمات - + Words Normal Size - الحجم الطبيعي للكلمات + حجم الكلمات العادي - + Show &Main Window - اعرض النافذة ال&رئيسية + أظهر النافذة ال&رئيسية + + + + Opened tabs + الألسنة المفتوحة - + Close current tab - أغلق اللسان الحالي + أغلق اللسان الحالي - + Close all tabs - أغلق كل الألسنة + أغلق كل الألسنة - + Close all tabs except current - أغلق كل الألسنة عدا الحالي + أغلق كل الألسنة ما عدا هذا - + Loading... - تحميل... + يحمّل... - - %1 dictionaries, %2 articles, %3 words - %1 قواميس, %2 مقالات, %3 كلمات - - - - Look up: - انظر: + + New Tab + لسان جديد - - All - الكل + + + Accessibility API is not enabled + أداة الإتاحة غير ممكّنة - - Opened tabs - الألسنة المفتوحة + + String to search in dictionaries. The wildcards '*', '?' and sets of symbols '[...]' are allowed. +To find '*', '?', '[', ']' symbols use '\*', '\?', '\[', '\]' respectively + - - Show Names in Dictionary &Bar - + + %1 dictionaries, %2 articles, %3 words + %1 من القواميس، %2 من المقالات، %3 من الكلمات - - Show Small Icons in &Toolbars - + + Look up: + ابحث عن: - - &Navigation - + + All + الكل - + Open Tabs List - + قائمة الألسنة المفتوحة - + (untitled) - (بلا عنوان) + (غير معنون) - + %1 - %2 - - - - WARNING: %1 - تحذير: %1 + %1 - %2 - + Failed to initialize hotkeys monitoring mechanism.<br>Make sure your XServer has RECORD extension turned on. - فشل بدء آلية مراقبة المفاتيح السريعة.<br>تأكد من ان خادم الرسوميات مفعّل للاحقة RECORD. + فشل تهيئة تقنية مراقبة المفاتيح الساخنة.<br>تأكد من أن امتداد RECORD في XServer ممكّن. - + New Release Available - اصدار جديد متوفر + إصدار جديد متوفّر - + Version <b>%1</b> of GoldenDict is now available for download.<br>Click <b>Download</b> to get to the download page. - الاصدار <b>%1</b> من القاموس الذهبي متوفر للتنزيل.<br>انقر <b>نزّل</b> للوصول لصفحة التنزيل. + الإصدار <b>%1</b> من القاموس الذهبي متوفّر الآن للتنزيل.<br>انقر <b>نزّل</b> للوصول إلى صفحة التنزيل. - + Download نزّل - + Skip This Release - تجاهل هذا الاصدار - - - - - Accessibility API is not enabled - + تخطّ هذا الإصدار - + You have chosen to hide a menubar. Use %1 to show it back. - + اخترت إخفاء شريط القوائم. استخدم %1 لإظهاره مرة أخرى. - + Ctrl+M - + Ctrl+M - + Page Setup - اعداد الصفحة + إعداد الصفحة - + No printer is available. Please install one first. - لا يوجد طابعة. ركب واحدة أولا. + لا تتوفر طابعة. فضلًا ثبّت واحدة أولًا. - + Print Article - اطبع المقال + اطبع المقالة - + Article, Complete (*.html) - + مقالة، بالكامل (*.html) - + Article, HTML Only (*.html) - + مقالة، HTML فقط (*.html) - + Save Article As - احفظ المقال كـ - - - Html files (*.html *.htm) - ملفات Html ‏(*.html *.htm) + احفظ المقالة كـ - + Error خطأ - + Can't save article: %1 - تعذر حفظ المقال: %1 + تعذّر حفظ المقالة: %1 - + Saving article... - + يحفظ المقالة... - + The main window is set to be always on top. - + عُيّنت النافذة الرئيسية في الأعلى دائمًا. - + &Hide - + أ&خفِ - + Export history to file - + صدّر التأريخ إلى ملف - - + + Text files (*.txt);;All files (*.*) - + ملفات نص (*.txt);;كل الملفات (*.*) - + History export complete - + اكتمل تصدير التأريخ - + Export error: - + خطأ استيراد: - + Import history from file - + استورد التأريخ من ملف - + Import error: invalid data in file - + خطأ استيراد: بيانات غير صالحة في الملف - + History import complete - + اكتمل استيراد التأريخ - + Import error: - + خطأ استيراد: - + Dictionary info + معلومات القاموس + + + + Dictionary headwords - + Open dictionary folder - + افتح مجلد القاموس - + Edit dictionary - + حرّر القاموس Mdx::MdxArticleRequest - + Dictionary file was tampered or corrupted - + عُبث في ملف القاموس أو أُتلف - + Failed loading article from %1, reason: %2 - + فشل تحميل المقالة من %1، السبب: %2 MediaWiki::MediaWikiArticleRequest - + XML parse error: %1 at %2,%3 - خطأ عبارة XML: %1 في %2,%3 + خطأ تحليل XML: %1 عند %2،%3 MediaWiki::MediaWikiWordSearchRequest - + XML parse error: %1 at %2,%3 - خطأ عبارة XML: %1 في %2,%3 + خطأ تحليل XML: %1 عند %2،%3 MediaWikisModel - + Enabled - مفعل + ممكّن - + Name الاسم - + Address العنوان - + Icon - + الرّمز @@ -2592,93 +3002,99 @@ Form - صيغة + النموذج - - Dictionary order: - ترتيب القواميس: + ... + ... - - - - - ... - ... + + Dictionary order: + ترتيب القواميس: - + Inactive (disabled) dictionaries: - القواميس غير العاملة (معطلة): + القواميس غير النشطة (المعطّلة): - + Dictionary information - معلومات القاموس + معلومات القاموس - + Name: الاسم: - + Total articles: مجموع المقالات: - + Total words: مجموع الكلمات: - + Translates from: - ترجم من: + الترجمات من: - + Translates to: - ترجم إلى: + الترجمات إلى: - + Description: - + الوصف: - + Files comprising this dictionary: - الملفات المشتملة على هذا القاموس: + الملفات التي تتضمن القاموس: - + Adjust the order by dragging and dropping items in it. Drop dictionaries to the inactive group to disable their use. - غير الترتيب بسحب وافلات العناصر. اسحب القواميس إلى المجموعة غير الفعالة لتعطيل استخدامها. + اضبط الترتيب بسحب العناصر إفلاتها في القائمة. أفلت القواميس في المجموعة غير النشطة لتعطيل استخدامها. - + Sort by name - + افرز بالاسم - + Sort by languages + افرز باللغة + + + + Dictionary headwords + + + + + Dictionaries active: %1, inactive: %2 PathsModel - + Path المسار - + Recursive - تداخل + التكرارية @@ -2686,110 +3102,143 @@ Preferences - التفضيلات + تفضيلات &Interface - الوا&جهة - - - - Tabbed browsing - التصفح بالألسنة - - - - Normally, opening a new tab switches to it immediately. -With this on however, new tabs will be opened without -switching to them. - الأصل، فتح لسان جديد ينتقل له تلقائيا. -عند تشغيل هذه, الألسنة الجديدة ستفتح -دون الانتقال لها. - - - - Open new tabs in background - افتح الألسنة الجديدة في الخلفية - - - - With this on, new tabs are opened just after the -current, active one. Otherwise they are added to -be the last ones. - عند تشغيل هذه, الألسنة الجديدة تفتح -مباشرة بعد, اللسان النشط. دونها -تضاف بعد آخر لسان. + ال&واجهة - - Open new tabs after the current one - افتح الألسنة الجديدة بعد اللسان الحالي + + Startup + البدء - - Select this option if you don't want to see the main tab bar when only a single tab is opened. - + + Automatically starts GoldenDict after operation system bootup. + يبدأ القاموس الذهبي مباشرة بعد إقلاع النّظام . - - Hide single tab - + + Start with system + ابدأ مع النظام - - Ctrl-Tab navigates tabs in MRU order - + + Add-on style: + نمط الملحقة: When enabled, an icon appears in the sytem tray area which can be used to open main window and perform other tasks. - عند تفعيلها, ستظهر أيقونة في زاوية النظام يمكن استخدامها -لفتح النافذة الرئيسية و تأدية مهام أخرى. + عند تمكينه، سيظهر رمز في صينية النظام حيث يمكن استخدامها +لفتح النافذة الرئيسية وإجراء مهامَ أخرى. Enable system tray icon - فعل أيقونة زاوية النظام + مكّن رمز صينية النظام With this on, the application starts directly to system tray without showing its main window. - بتشغيل هذه, البرنامج سينتقل البرنامج مباشرة إلى زاوية النظام دون عرض -النافذة الرئيسية. + بهذه، يبدأ التطبيق تلقائيًّا في صينية النظام دون +أن تظهر النافذة الرئيسية. Start to system tray - ابدأ في زاوية النظام + ابدأ إلى صينية النظام With this on, an attempt to close main window would hide it instead of closing the application. - بتشغيل هذه, اغلاق النافذة الرئيسية سيخفيها بدلا من إغلاق البرنامج. + بهذه، محاولة إغلاق النافذة الرئيسية يخفي التطبيق بدلًا +من إنهائه. + + + + Close to system tray + أغلق إلى صينية النظام + + + + Double-click translates the word clicked + النقر المزدوج يترجم الكلمة المحدّدة + + + + Normally, pressing ESC key moves focus to the translation line. +With this on however, it will hide the main window. + عادةً، ضغط ESC ينقل التركيز إلى سطر الترجمة. +بهذه، على أي حال، ستُخفي النافذة الرئيسية. + + + + ESC key hides main window + مفتاح ESC يخفي النافذة الرئيسية + + + + Turn this option on if you want to select words by single mouse click + مكّن هذا الخيار إن أردت تحديد الكلمة بنقرة فأرة واحدة + + + + Select word by single click + حدّد الكلمة بنقرة مفردة + + + + Tabbed browsing + التصفّح المبوّب + + + + Normally, opening a new tab switches to it immediately. +With this on however, new tabs will be opened without +switching to them. + عادةً، عند فتح لسان، يُتبدَّل إليه تلقائيًّا. +بهذه، على أي حال، الألسنة الجديدة ستُفتح دون +التبديل إليها. + + + + Open new tabs in background + افتح الألسنة الجديدة في الخلفية + + + + With this on, new tabs are opened just after the +current, active one. Otherwise they are added to +be the last ones. + بهذه، الألسنة ستُفتح فقط بعد +الحاليّة، النشطة. وإلّا ستُضاف +إلى الألسنة الأخيرة. - - Close to system tray - اغلق إلى زاوية النظام + + Open new tabs after the current one + افتح الألسنة الجديدة بعد الحاليّة - - Startup - تشغيل تلقائي + + Select this option if you don't want to see the main tab bar when only a single tab is opened. + اختر هذا الخيار إن لم تكن تريد رؤية شريط الألسنة الرئيسي عندما يكون لسان واحد مفتوح. - - Automatically starts GoldenDict after operation system bootup. - ابدأ القاموس الذهبي مباشرة بعد اقلاع النظام. + + Hide single tab + أخفِ لسانًا واحدًا - - Start with system - ابدأ مع النظام + + Ctrl-Tab navigates tabs in MRU order + Ctrl-Tab يتنقّل بين الألسنة بترتيب MRU @@ -2802,250 +3251,228 @@ نمط العرض: - - Double-click translates the word clicked - النقر المزدوج يترجم الكلمة المنقورة - - - - Normally, pressing ESC key moves focus to the translation line. -With this on however, it will hide the main window. - - - - - ESC key hides main window - - - - - Turn this option on if you want to select words by single mouse click - - - - - Select word by single click - - - - - Add-on style: + + Help language - + Adjust this value to avoid huge context menus. - + اضبط هذه القيمة لتجنّب قوائم المحتوى الضخمة. - + Context menu dictionaries limit: - + حد القواميس في قائمة السياق: - + &Scan Popup - م&نبثقة البحث + منبثقة الا&ستكشاف - + When enabled, a translation popup window would be shown each time you point your mouse on any word on the screen (Windows) or select any word with mouse (Linux). When enabled, you can switch it on and off from main window or tray icon. - عند تفعيلها, نافذة منبثقة بالترجمة ستظهر كل مرة تضع مؤشر الفأرة على -أية كلمة على الشاشة (وندز) أو حدد أية كلمة بالفأرة (لينكس). عند التفعيل -يمكنك تشغيلها و اطفائها من النافذة الرئيسية أو زاوية النظام. + إن مكّن، نافذة ترجمة منبثقة ستظهر كل مرة +تضع المؤشر على أي كلمة على الشاشة (ويندوز) +أو تحدّد أي كلمة بالفأرة (لينكس). إن مكّن، تستطيع +تشغيله أو تعطيله من النافذة الرئيسية أو صينية النظام. - + Enable scan popup functionality - مكّن خاصية منبثقة البحث + مكّن وظيفة منبثقة الاستكشاف - + Chooses whether the scan popup mode is on by default or not. If checked, the program would always start with the scan popup active. - اختر إذا ماكانت منبثقة البحث مشغلة افتراضيا أم لا. إن حددت, البرنامج سيبدأ -دائما مع خاصية المنبثقة منشطة. + يحدّد إن كان وضع منبثقة الاستكشاف ممكّن افتراضيًّا أو لا. إن عُلِّم، +سيبدأ البرنامج دائمًا ومنبثقة الاستكشاف نشطة. - + Start with scan popup turned on - ابدأ مع منبثقة البحث تعمل + ابدأ و منبثقة الاستكشاف تعمل - + With this enabled, the popup would only show up if all chosen keys are in the pressed state when the word selection changes. - عند تمكين هذا, المنبثقة ستظهر فقط عند استمرار ضغط كل المفاتيح المختارة -عند تغيّر تحديد الكلمة. + إن كان هذا ممكّنًا، النافذة المنبثقة ستظهر فقط إن كانت كل +المفاتيح مضغوطة عندما يتغيّر تحديد الكلمة. - + Only show popup when all selected keys are kept pressed: - اظهر المنبثقة عند كون كل المفاتيح المحددة مضغوطة فقط: + أظهر المنبثقة فقط عند إبقاء الضغط على المفاتيح هذه كلها: - + Left Ctrl only Ctrl اليساري فقط - + Left Ctrl Ctrl اليساري - + Right Shift only - Shift اليسار فقط + Shift اليميني فقط - + Right Shift - Shift اليمين + Shift اليميني - + Alt key مفتاح Alt - + Alt Alt - + Ctrl key مفتاح Ctrl - + Ctrl Ctrl - + Left Alt only - Alt اليسار فقط + Alt اليساري فقط - + Left Alt - Alt اليسار + Alt اليساري - + Shift key مفتاح Shift - + Shift Shift - + Right Alt only - Alt اليمين فقط + Alt اليميني فقط - + Right Alt - Alt اليمين + Alt اليميني - + Right Ctrl only - Ctrl اليمين فقط + Ctrl اليميني فقط - + Right Ctrl - Ctrl اليمين + Ctrl اليميني - + Left Shift only - Shift اليسار فقط + Shift اليساري فقط - + Left Shift - Shift اليسار + Shift اليساري - + Windows key or Meta key - مفتاح وندز أو مفتاح ميتا + مفتاح الشّعار - + Win/Meta - Win/Meta + ويندوز/ميتا - + Normally, in order to activate a popup you have to maintain the chosen keys pressed while you select a word. With this enabled, the chosen keys may also be pressed shortly after the selection is done. - الأصل, لتفعيل المنبثقة عليك ابقاء المفاتيح المختارة -مضغوطة عند اختيارك لكلمة. عند تمكين هذا, المفاتيح -يمكن ان تضغط أيضا بعد تحديد الكلمة. + عادةً، لتفعيل المنبثقة عليك إبقاء +الضغط على المفاتيح المختارة وأنت +تحدّد الكلمة. عند تمكين هذا، المفاتيح +المختارة يمكن ضغطها بوقت أقل بعد +الانتهاء من التحديد. - + Keys may also be pressed afterwards, within - يمكن ان تضغط المفاتيح لاحقا, في + يمكن أيضًا ضغط المفاتيح فيما بعد خلال - + To avoid false positives, the keys are only monitored after the selection's done for a limited amount of seconds, which is specified here. - لتجنب اللبس, ستراقب المفاتيح بعد انتهاء التحديد لفترة -محددة من الثوان, المحددة هنا. + لتجنّب الأخطاء، تُراقب المفاتيح أيضًا +بعد الاختيار القيمة لوقت محدّد من +الثواني، والذي تستطيع تحديده هنا. - + secs - ثانية + ث - + Send translated word to main window instead of to show it in popup window - + أرسل الكلمة المترجمة إلى النافذة الرئيسية بدلًا من إظهارها في نافذة منبثقة - + Send translated word to main window - + أرسل الكلمة المترجمة إلى النافذة الرئيسية - + Hotkeys المفاتيح السريعة - + Use the following hotkey to show or hide the main window: - استخدم هذه المفاتيح السريعة لعرض أو اخفاء النافذة الرئيسية: + استخدم المفتاح السّريع التالي لإظهار أو إخفاء النافذة الرئيسية: - + Use the following hotkey to translate a word from clipboard: - استخدم هذه المفاتيح السريعة لترجمة كلمة من الحافظة: + استخدم المفاتيح السّريع التالي لترجمة كلمة من الحافظة: - + The hotkeys are global and work from any program and within any context as long as GoldenDict is running in background. - المفاتيح السريعة عامة و تعمل من أي برنامج أو اي سياق طالما ان القاموس الذهبي يعمل في الخلفية. + المفاتيح السريعة تعمل في أي مكان من الحاسوب خلال أي محتوى طالما القاموس الذهبي يعمل في الخلفية. - + <!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; } @@ -3055,367 +3482,390 @@ <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'DejaVu Sans'; font-size:9pt; font-weight:400; font-style:normal;"> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" color:#ff0000;">ملاحظة: يبدو انك تعمل على اصدار من خادوم X.Org XServerاللاحقة RECORD معطوبة فيه. لن تعمل المفاتيح السريعة في القاموس الذهبي على الأغلب. ينبغي اصلاح هذا في الخادوم نفسه. رجاء اطلع على الآتي </span><a href="https://bugs.freedesktop.org/show_bug.cgi?id=20500"><span style=" text-decoration: underline; color:#0000ff;">مدخلة علة</span></a><span style=" color:#ff0000;"> واترك تعليقا هناك إن شئت.</span></p></body></html> +<p dir="RTL" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" color:#ff0000;">ملاحظة: يبدو أنك تعمل على إصدار X.Org XServer لديه ملحقة RECORD معطّلة. المفاتيح السريعة في القاموس الذهبي قد لا تعمل. يمكن إصلاح هذا في الخدم نفسه. فضلًا ارجع إلى </span><a href="https://bugs.freedesktop.org/show_bug.cgi?id=20500"><span style=" text-decoration: underline; color:#0000ff;">العلة هذه</span></a><span style=" color:#ff0000;"> واترك تعليقًا هناك إن أحببت.</span></p></body></html> - + &Audio ال&صوت - + Pronunciation - اللفظ + النطق - + Auto-pronounce words in main window - انطق بالكلمات آليا في النافذة الرئيسية + انطق تلقائيًّا الكلمات في النافذة الرئيسية - + Auto-pronounce words in scan popup - انطق بالكلمات آليا في منبثقة البحث + انطق تلقائيًّا الكلمات في منبثقة الاستكشاف - + Playback - التشغيل + التشغيل - + Play audio files via FFmpeg(libav) and libao - + شغّل ملفات الصوت بـ FFmpeg(libav) و libao - + Use internal player - - - - - Select this option to automatic collapse big articles - - - - - Collapse articles more than - - - - - Articles longer than this size will be collapsed - - - - - symbols - - - - Use Windows native playback API. Limited to .wav files only, -but works very well. - استخدم API الاصلية لمشغلات وندز. محصور بملفات .wav فقط، -لكنه يعمل جيدا. - - - Play via Windows native API - شغل عبر API الموطنة في وندز - - - Play audio via Phonon framework. May be somewhat unstable, -but should support most audio file formats. - شغل الصوت عبر إطار فونون. قد يكون غير مستقر نوعا ما، -لكنه يدعم أغلب هيئات ملفات الصوت. - - - Play via Phonon - شغل عبر Phonon + استخدم المشغّل الداخلي - + Use any external program to play audio files - استخدم أيّة برنامج خارجي لتشغيل ملفات الصوت + استخدم أي برنامج خارجي لتشغيل ملفات الصوت - + Use external program: - استخدم برنامجا خارجيا: + استخدم برنامجًا خارجيًا: - + &Network - ال&شبكة + ال&شّبكة - + Enable if you wish to use a proxy server for all program's network requests. - مكن استخدام خادوم بروكسي لكل طلبات -البرنامج الشبكية. + مكّنه إن وددت استخدام مُلقّم +لجميع طلبات البرنامج في الشبكة. - + Use proxy server - استخدم خادوم بروكسي + استخدم مُلقّمًا - + + System proxy + + + + + Custom proxy + + + + + Custom settings + + + + Type: - النوع: + النّوع: - + Host: المضيف: - + Port: المنفذ: - + User: المستخدم: - + Password: كلمة المرور: - + Enabling this would make GoldenDict block most advertisements by disallowing content (images, frames) not originating from the site you are browsing. If some site breaks because of this, try disabling this. - تمكين هذا سيجعل القاموس الذهبي يحجب أغلب الاعلانات -بمنع المحتوى (صور, اطارات) من خارج الموقع الذي تتصفحه. -ان كانت بعض المواقع تتشوه بسبب ذلك, جرب تعطيله. + تمكين هذا يجعل القاموس الذهبي يمنع أغلب الإعلانات +بعدم السماح بالمحتوى (صور، إطارات) غير المُنشأ من الموقع +الذي تتصفّحه. إن انهارت بعض المواقع بسبب هذا، حاول تعطيله. - + Disallow loading content from other sites (hides most advertisements) - لا تسمح بتحميل المحتوى من المواقع الاخرى (يخفي معظم الاعلانات) + امنع تحميل المحتوى من مواقع أخرى (يخفي أغلب الإعلانات) - + Enabling this would allow to listen to sound pronunciations from online dictionaries that rely on Flash or other web plugins. Plugin must be installed for this option to work. - + تمكين هذا سيسمح بالاستماع إلى نطق الصوت +من القواميس الموجودة على الإنترنت التي تعتمد +مشغّل فلاش أو إضافات وِب. يجب تثبيت الإضافة +ليعمل هذا الخيار. - + Enable web plugins - + مكّن إضافات الوِب - + Some sites detect GoldenDict via HTTP headers and block the requests. Enable this option to workaround the problem. - + بعض المواقع تكتشف القاموس الذهبي من خلال ترويسات HTTP وتمنع الطلبات. +مكّن هذا الخيار للالتفاف حول المشكلة. - + Do not identify GoldenDict in HTTP headers - + لا تعرّف القاموس الذهبي في ترويسات HTTP - + When this is enabled, the program periodically checks if a new, updated version of GoldenDict is available for download. If it is so, the program informs the user about it and prompts to open a download page. - عند تمكين هذا, سيتحقق البرنامج من التحديثات -المتوفرة للتحميل من القاموس الذهبي. إن وجدت، -سيعلم البرنامج المستخدم و يطلب اذنه لفتح صفحة -التنزيل. + عند تمكين هذا، يلتمس البرنامج +كل فترة إن كان هناك تحديث جديد +للبرنامج متوفّر للتنزيل. إن كان كذلك، +سيُعلمك البرنامج عنه ويطلب فتح صفحة التنزيل. - + Check for new program releases periodically - تحقق من الاصدارات الحديثة غِبّا + التمس عن إصدار جديد للبرنامج كل فترة - - Ad&vanced + + Full-text search - - ScanPopup extra technologies + + Allow full-text search for: + + + + + Don't search in dictionaries containing more than + + + + + articles (0 - unlimited) - + + Ad&vanced + مت&قدّم + + + + ScanPopup extra technologies + تقنيات منبثقة الاستكشاف الإضافية + + + Try to use IAccessibleEx technology to retrieve word under cursor. This technology works only with some programs that support it (for example Internet Explorer 9). It is not needed to select this option if you don't use such programs. - + حاول أن تستخدم تقنية IAccessibleEx لاسترجاع الكلمة الواقعة تحت المؤشر. +تعمل هذه التقنية فقط مع بعض البرمجيات التي تدعمها. +(على سبيل المثال انترنت اكسبلورر 9) +لا حاجة لانتقاء هذا الخيار إذا كنت لا تستخدم مثل هذه البرمجيات. - + Use &IAccessibleEx - + استخدم &IAccessibleEx - + Try to use UI Automation technology to retrieve word under cursor. This technology works only with some programs that support it. It is not needed to select this option if you don't use such programs. - + حاول أن تستخدم تقنية أتمتة واجهة المُستخدم لاسترجاع الكلمة الواقعة تحت المؤشر. +تعمل هذه التقنية فقط مع بعض البرمجيات التي تدعمها. +لا حاجة لانتقاء هذا الخيار إذا كنت لا تستخدم مثل هذه البرمجيات. - + Use &UIAutomation - + استخدم أ&تمتة واجهة المستخدم - + Try to use special GoldenDict message to retrieve word under cursor. This technology works only with some programs that support it. It is not needed to select this option if you don't use such programs. - + حاول استخدام رسالة القاموس الذهبي لاسترجاع الكلمة تحت المؤشر. +هذه التقنية تعمل فقط مع بعض البرامج وتدعمها. +ليس مهمًّا تحديد هذا الخيار إن لم تكن تستخدم هكذا برنامج. - + Use &GoldenDict message - + استخدم رسالة القاموس ال&ذهبي - + History - + التأريخ - + Turn this option on to store history of the translated words - + مكّن هذا الخيار لتخزين تأريخ الكلمات المترجمة - + Store &history - + خزّن ال&تأريخ - + Specify the maximum number of entries to keep in history. - + حدّد عدد المدخلات الأقصى لإبقائها في التأريخ. - + Maximum history size: - + حجم التأريخ الأقصى: - + History saving interval. If set to 0 history will be saved only during exit. - + فترة حفظ التأريخ. إن عُيِّنت إلى 0، سيُحفظ التأريخ أثناء إنهاء التطبيق فقط. - + Save every - + احفظ كلّ - + minutes - + دقيقة - + Articles - + المقالات - + Turn this option on to always expand optional parts of articles - + مكّن هذا الخيار لتوسيع الأجزاء الاختيارية من المقالات دائمًا - + Expand optional &parts - + وسّع الأ&قسام الاختيارية + + + + Select this option to automatic collapse big articles + حدّد هذا الخيار لطي المقالات الكبيرة تلقائيًّا + + + + Collapse articles more than + اطو المقالات الأكبر من الـ + + + + Articles longer than this size will be collapsed + المقالات الأكبر من هذا الحجم ستطوى + + + + symbols + رمز - + System default - افتراضيات النظام + افتراضي النظام - + + Default - الافتراضيات + الافتراضي - + Modern - + عصري - + Lingvo - لينغفو + لنغفو - + Babylon - + بابيلون - + Lingoes - + لِنْغوز - + Lingoes-Blue - + لِنْغوز-بلو - Play via DirectShow - اعرض خلال DirectShow - - - + Changing Language - تغيير اللغة + يغيّر اللغة - + Restart the program to apply the language change. - اعد تشغيل البرنامج لتطبيق تغيير اللغة. + أعد تشغيل البرنامج لتطبيق تغيير اللغة. ProgramTypeEditor - + Audio - + صوت - + Plain Text - + نص مجرّد - + Html - + Html - + Prefix Match - + طابِق السابقة - + Unknown - + غير معروف @@ -3423,143 +3873,145 @@ No program name was given. - + لم يُعطَ اسم للبرنامج. The program has crashed. - + انهار البرنامج. The program has returned exit code %1. - + أرجعَ البرنامج شِفرة الخروج %1. ProgramsModel - + Enabled - مفعل + ممكّن - + Type - + النوع - + Name - الاسم + الاسم - + Command Line - + سطر الأوامر - + Icon - + الرّمز QObject - + + Article loading error - + خطأ في تحميل المقالة - + + Article decoding error - + خطأ في فك ترميز المقالة avformat_alloc_context() failed. - + فشل avformat_alloc_context(). av_malloc() failed. - + فشل av_malloc(). avio_alloc_context() failed. - + فشل avio_alloc_context(). avformat_open_input() failed: %1. - + فشل avformat_open_input(): %1. avformat_find_stream_info() failed: %1. - + فشل avformat_find_stream_info(): %1. Could not find audio stream. - + تعذّر العثور على دفق الصوت. Codec [id: %1] not found. - + لم يُعثر على المرماز [المعرّف: %1]. avcodec_open2() failed: %1. - + فشلavcodec_open2(): %1. Cannot find usable audio output device. - + تعذّر العثور على جهاز خرج صوت قابل للاستخدام. Unsupported sample format. - + صيغة النموذج غير مدعومة. ao_open_live() failed: - + فشل ao_open_live(): No driver. - + لا تعريف. This driver is not a live output device. - + هذا التعريف ليس جهاز خرج حيّ. A valid option key has an invalid value. - + مفتاح خيار صالح يملك قيمة غير صالحة. Cannot open the device: %1, channels: %2, rate: %3, bits: %4. - + تعذّر فتح الجهاز: %1، القنوات: %2، المعدّل: %3، البتات: %4. Unknown error. - + خطأ غير معروف. avcodec_alloc_frame() failed. - + فشل avcodec_alloc_frame(). @@ -3567,49 +4019,49 @@ Dictionary search/filter (Ctrl+F) - + رشّح/ابحث في القاموس (Ctrl+F) Quick Search - + بحث سريع Clear Search - + امحُ البحث ResourceToSaveHandler - - + + ERROR: %1 - + خطأ: %1 - + Resource saving error: - + خطأ في حفظ المورد: - + The referenced resource failed to download. - فشل تنزيل المرجع المشار إليه. + فشل تنزيل المورد المشار إليه. Romaji - + Hepburn Romaji for Hiragana - هيبورن روماجي لالهيراجانا + رومانجي هِپ‌بيرن للهيراجانا - + Hepburn Romaji for Katakana - هيبورن روماجي لكاتاكانا + رومانجي هِپ‌بيرن للكاتاكانا @@ -3617,7 +4069,7 @@ Russian Transliteration - الترجمة الصوتية الروسية + النسخ الروسي الحرفي @@ -3625,98 +4077,82 @@ Dialog - مربع حوار - - - word - كلمة + الحوار - List Matches (Alt+M) - اسرد المقابلات (Alt+M) + + Back + ارجع - - - - - + + + + + ... ... - - Back - ارجع - - - + Forward - تقدم - - - Alt+M - Alt+M + تقدّم - + Pronounce Word (Alt+S) انطق الكلمة (Alt+S) - + Alt+S Alt+S - + Send word to main window (Alt+W) - + أرسل الكلمة إلى النافذة الرئيسية (Alt+W) - + Alt+W - + Alt+W - + Shows or hides the dictionary bar - أظهر أو أخف شريط القاموس + يُظهر أو يخفي شريط القاموس - + Use this to pin down the window so it would stay on screen, could be resized or managed in other ways. - استخدم هذا لتعليق النافذة وابقاءها على الشاشة، -يمكن تغيير حجمها أو ادارتها بطرق أخرى. - - - GoldenDict - القاموس الذهبي + استخدم هذا لتثبيت النافذة فتبقى على الشاشة، +يمكن تغيير حجمها أو إدارتها بطرق عدّة. - - + + %1 - %2 - + %1 - %2 SoundDirsModel - + Path المسار - + Name الاسم - + Icon - + الرّمز @@ -3724,19 +4160,20 @@ Files - ملفات + الملفات Paths to search for the dictionary files: - مسار البحث عن ملفات القواميس + المسارات للبحث فيها عن ملفات القواميس: - + + &Add... أ&ضف... @@ -3745,34 +4182,35 @@ - + + &Remove - ا&مسح + أ&زل Re&scan now - ا&بحث مجددا + أعد الا&كتشاف الآن Sound Dirs - مجلدات الصوت + أدلة الصوت Make dictionaries from bunches of audiofiles by adding paths here: - اعمل قواميسا من مجموعة من الملفات الصوتية بإضافة المسار هنا: + اعمل قواميس من مجموعات من ملفات الصوت بإضافة المسارات هنا: Morphology - الصرف + الصَرْف Path to a directory with Hunspell/Myspell dictionaries: - مسار قواميس Hunspell/Myspell: + المسار إلى دليل بقواميس Hunspell/Myspell: @@ -3782,7 +4220,7 @@ Available morphology dictionaries: - القواميس الصرفية المتوفرة: + قواميس الصَرْف المتوفّرة: @@ -3792,12 +4230,13 @@ spelling suggestions for mistyped words. Add appropriate dictionaries to the bottoms of the appropriate groups to use them. - كل قاموس صرفي يظهر + كل قاموس صَرْف يظهر كقاموس مساعد منفصل -ليقدم كلمات جذعية للبحث -و اقتراحات هجائية للكلمات الخطأ -أضف القواميس الملائمة لأسفل -المجموعة المناسبة لاستخدامهم. +حيث يقدّم جذر الكلمة للبحث +واقتراحات الإملاء للكلمات +الخاطئة. أضف القواميس +المناسبة إلى أسفل المجموعات +المناسبة لاستخدامها. @@ -3807,256 +4246,247 @@ Wikipedia (MediaWiki) sites: - مواقع (ميديا ويكي) لويكيبيديا: + مواقع ويكيبيديا (ميدياويكي): Websites - مواقع + مواقع الوِب Any websites. A string %GDWORD% will be replaced with the query word: - اية مواقع مع العبارة %GDWORD% ستستبدل بكلمة الطلب: + أي مواقع للوِب. السلسلة %GDWORD% ستُستبدل بكلمة الاستعلام: - Alternatively, use %GD1251% for CP1251, %GDISO1% for ISO 8859-1. - كبيديل استخدم %GD1251% for CP1251, %GDISO1% for ISO 8859-1. + + Alternatively, use %GD1251% for CP1251, %GDISO1%...%GDISO16% for ISO 8859-1...ISO 8859-16 respectively, +%GDBIG5% for Big-5, %GDBIG5HKSCS% for Big5-HKSCS, %GDGBK% for GBK and GB18030, %GDSHIFTJIS% for Shift-JIS. + إضافةً إلى ذلك، استخدم %GD1251% لـ CP1251، و %GDISO1% لـ ISO 8859-1، و %GDISO16% لـ ISO 8859-16، و +%GDBIG5% لـ Big-5، و %GDBIG5HKSCS% لـ Big5-HKSCS، و %GDGBK% لـ GBK و GB18030، و %GDSHIFTJIS% لـ Shift-JIS. - Programs + DICT servers + + + + + DICT servers: - + + Programs + البرامج + + + + Any external programs. A string %GDWORD% will be replaced with the query word. If such string is not presented, the word will be fed into standard input. + أي برامج خارجية، السلسلة %GDWORD% ستُستبدل بكلمة الاستعلام. إن لم تُقدَّم هكذا سلسلة، ستُغذّى الكلمة إلى الإدخال القياسي. + + + Forvo - فروفو + فورڤو - + Live pronunciations from <a href="http://www.forvo.com/">forvo.com</a>. The site allows people to record and share word pronunciations. You can listen to them from GoldenDict. - تهجئة حية من <a href="http://www.forvo.com/">forvo.com</a>. هذا الموقع يسمح للناس بتسجيل ومشاركة لفظ الكلمات. يمكنك الاستماع لها داخل GoldenDict. + نطق حيّ من <a href="http://www.forvo.com/">forvo.com</a>. هذا الموقع يسمح للناس بتسجيل ومشاركة نطق الكلمة. يمكنك الإستماع إليها من القاموس الذهبي. - + Enable pronunciations from Forvo - فعّل الترجمة من فروفو + مكّن النطق من فورڤو - + API Key: - مفتاح API: + مفتاح API: - + Use of Forvo currently requires an API key. Leave this field blank to use the default key, which may become unavailable in the future, or register on the site to get your own key. - استخدام فروفو حاليا يتطلب مفتاح API. اترك الحقل هذا -فارغا لاستخدام المفتاح الافتراضي، الذي قد يتعطل -في المستقبل، أو سجل عبر الموقع لتحصل على مفتاحك الخاص. + استخدام فورڤو حاليًّا يتطلّب مفتاح API. اترك هذا الحقل +فارغًا إن أردت استخدام الافتراضي، والذي قد لا يتوفّر في +المستقبل، أو سجّل في موقعنا للحصول على مفتاحك الخاص. - + Get your own key <a href="http://api.forvo.com/key/">here</a>, or leave blank to use the default one. - - - - <!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:'DejaVu Sans'; font-size:9pt; font-weight:400; font-style:normal;"> -<table style="-qt-table-type: root; margin-top:4px; margin-bottom:4px; margin-left:4px; margin-right:4px;"> -<tr> -<td style="border: none;"> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Get your own key <a href="http://api.forvo.com/key/"><span style=" text-decoration: underline; color:#0057ae;">here</span></a>, or leave blank to use the default one.</p></td></tr></table></body></html> - <!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:'DejaVu Sans'; font-size:9pt; font-weight:400; font-style:normal;"> -<table style="-qt-table-type: root; margin-top:4px; margin-bottom:4px; margin-left:4px; margin-right:4px;"> -<tr> -<td style="border: none;"> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">احصل على مفتاحك الخاص <a href="http://api.forvo.com/key/"><span style=" text-decoration: underline; color:#0057ae;">here</span></a>, or leave blank to use the default one.</p></td></tr></table></body></html> - - - - Alternatively, use %GD1251% for CP1251, %GDISO1%...%GDISO16% for ISO 8859-1...ISO 8859-16 respectively, -%GDBIG5% for Big-5, %GDBIG5HKSCS% for Big5-HKSCS, %GDGBK% for GBK and GB18030, %GDSHIFTJIS% for Shift-JIS. - - - - - Any external programs. A string %GDWORD% will be replaced with the query word. If such string is not presented, the word will be fed into standard input. - + احصل على مفتاحك الخاص من <a href="http://api.forvo.com/key/">هنا</a>، أو اتركه فارغًا لاستخدام الافتراضي. - + Language codes (comma-separated): - رموز اللغات (مفصولة بالفاصلة): + ترميزات اللغة (مقسّمة بفواصل): - + List of language codes you would like to have. Example: "en, ru". - قائمة برموز اللغات التي ترغب بها. مثال: "en, ru". + قائمة ترميزات اللغة التي تريد امتلاكها. مثال: "en, ru". - + Full list of language codes is available <a href="http://www.forvo.com/languages-codes/">here</a>. - قائمة كاملة برموز اللغات <a href="http://www.forvo.com/languages-codes/">هنا</a>. + القائمة الكاملة من ترميزات اللغة متوفّرة <a href="http://www.forvo.com/languages-codes/">هنا</a>. - + Transliteration - الترجمة الصوتية + النسخ الحرفي - + Russian transliteration - الترجمة الصوتية الروسية + النسخ الروسي الحرفي - + Greek transliteration - الترجمة الصوتية اليونانية + النسخ اليوناني الحرفي - + German transliteration - الترجمة الصوتية الألمانية + النسخ الألماني الحرفي - + Belarusian transliteration - + النسخ البلاروسي الحرفي - + Enables to use the Latin alphabet to write the Japanese language - يمكنك من استخدام الأبجدية اللاتينية لكتابة اللغة اليابانية + يمكّن استخدام الأبجدية اللاتينية لكتابة اللغة اليابانية - + Japanese Romaji - اليابانية روماجي + روماجي اليابانية - + Systems: الأنظمة: - + The most widely used method of transcription of Japanese, based on English phonology - الاسلوب الأكثر شيوعا لل transcription اليابانية, -يعتمد على الصوتية الانكليزية + الطريقة الأكثر استخدامًا لنسخ اليابانية، +مبنية على الفونولوجيا الإنجليزية - + Hepburn - هيبورن + هِپ‌بيرن - + The most regular system, having a one-to-one relation to the kana writing systems. Standardized as ISO 3602 Not implemented yet in GoldenDict. - الاسلوب الاكثر اعتيادا, بعلاقة واحد مقابل واحد لأنظمة كتابة الكانا -مقياس قياسي ISO 3602 + النظام الأكثر اعتيادية، لهُ علاقة واحد إلى واحد لأنظمة +كتابة الكانا، موحّدة كـ ISO 3602 -غير مطبق بعد في القاموس الذهبي. +لم يُنفَّذ حتى الآن في القاموس الذهبي. - + Nihon-shiki - نيهون-سيكي + نيهون-شيكي - + Based on Nihon-shiki system, but modified for modern standard Japanese. Standardized as ISO 3602 Not implemented yet in GoldenDict. - يعتمد على نظام نيهون-سيكي, لكنه معدل للمواصفات القياسية اليابانية الحديثة -مقياس قياسي ISO 3602 + مبني على نيهون-شيكي، لكن مُعدَّل لليابانية العصرية القياسية. +موحّدة كـ ISO 3602 -غير مضمن بعد في القاموس الذهبي. +لم يُنفَّذ حتى الآن في القاموس الذهبي. - + Kunrei-shiki - كنري-سيكي + كنريه-شيكي - + Syllabaries: - سيليباري: + الكتابة المقطعية: - + Hiragana Japanese syllabary - هيراغانا سلبري اليابانية + الكتابة اليابانية الهيراجانا المقطعية - + Hiragana الهيراجانا - + Katakana Japanese syllabary - كاتاكانا سلبري اليابانية + الكتابة اليابانية الكاتاكانا المقطعية - + Katakana - الكتكانا + الكاتاكانا - + Text to Speech - + قراءة النّصوص - + (not available in portable version) - (غير متوفر في النسخة المتنقلة) + (ليس متوفّرًا في الإصدار المحمول) - - - + + + Choose a directory - اختر قاموسا + اختر قاموسًا - - - - - + + + + + + Confirm removal - أكد الحذف + تأكيد الإزالة - - + + Remove directory <b>%1</b> from the list? - اأزيل القاموس <b>%1</b> من القائمة؟ + أأزيل القاموس <b>%1</b> من القائمة؟ - - + + + Remove site <b>%1</b> from the list? - اأزيل القاموس <b>%1</b> من القائمة؟ + أأزيل الموقع <b>%1</b> من القائمة؟ - + Remove program <b>%1</b> from the list? - + أأزيل البرنامج <b>%1</b> من القائمة؟ @@ -4064,7 +4494,7 @@ None - لاشيء + لاشيء @@ -4072,77 +4502,77 @@ Selected voice engines: - + محركات الصوت المحدّدة: &Add - + أ&ضف &Remove - ا&مسح + أ&زل Preferences - التفضيلات + تفضيلات Volume: - + الحجم: Rate: - + المعدّل: Preview - + معاينة Available voice engines: - + محركات الصوت المتوفّرة: Text to be previewed: - + النص لمعاينته: Type text to be previewed here. - + اطبع نصًّا هنا لعرضه. &Preview - + &عاين No TTS voice available - + لم يُعثر على صوت TTS Cannot find available TTS voice.<br>Please make sure that at least one TTS engine installed on your computer already. - + تعذّر العثور على صوت TTS.<br>فضلًا تأكد من وجود محرك TTS بالإصدار الأخير مثبّت على حاسوبك. Confirm removal - أكد الحذف + تأكيد الإزالة Remove voice engine <b>%1</b> from the list? - + أأزيل محرك الصوت <b>%1</b> من القائمة؟ @@ -4150,12 +4580,12 @@ Type a word or phrase to search dictionaries - + اطبع كلمة أو عبارة للبحث في القواميس Drop-down - + القائمة المنسدلة @@ -4163,53 +4593,53 @@ Enabled - مفعل + ممكّن Name - الاسم + الاسم Id - + المعرّف Icon - + الأيقونة WebSitesModel - + Enabled - مفعل + ممكّن - + Name الاسم - + Address العنوان - + Icon - + الرّمز WordFinder - + Failed to query some dictionaries. - فشل طلب بعض القواميس. + فشل الاستعلام عن بعض القواميس. @@ -4217,7 +4647,7 @@ WARNING: %1 - تحذير: %1 + تحذير: %1 diff -Nru goldendict-1.5.0~git20131003/locale/ay_WI.ts goldendict-1.5.0~git20150923/locale/ay_WI.ts --- goldendict-1.5.0~git20131003/locale/ay_WI.ts 2013-08-16 09:45:56.000000000 +0000 +++ goldendict-1.5.0~git20150923/locale/ay_WI.ts 2015-09-23 08:26:24.000000000 +0000 @@ -342,6 +342,25 @@ + Dialog + + Proxy authentication required + + + + You need to supply a Username and a Password to access via proxy + + + + Username: + + + + Password: + Mantawi: + + + DictGroupWidget Form @@ -420,6 +439,97 @@ + DictHeadwords + + Search mode + + + + This element determines how filter string will be interpreted + + + + If checked on the symbols case will be take in account when filtering + + + + Match case + + + + Exports headwords to file + + + + Export + + + + OK + + + + Press this button to apply filter to headwords list + + + + Apply + + + + If checked any filter changes will we immediately applied to headwords list + + + + Auto apply + + + + Filter: + + + + Filter string (fixed string, wildcards or regular expression) + + + + Text + + + + Wildcards + + + + RegExp + + + + Unique headwords total: %1, filtered: %2 + + + + Save headwords to file + + + + Text files (*.txt);;All files (*.*) + + + + Export headwords... + + + + Cancel + Jan saña + + + Help + + + + DictInfo Total articles: @@ -458,6 +568,14 @@ %1 + + Show all unique dictionary headwords + + + + Headwords + + DictListModel @@ -467,6 +585,62 @@ + DictServer + + Url: + + + + Databases: + + + + Search strategies: + + + + Server databases + + + + + DictServersModel + + Enabled + + + + Name + Suti + + + Address + + + + Databases + + + + Icon + + + + Comma-delimited list of databases +(empty string or "*" matches all databases) + + + + Strategies + + + + Comma-delimited list of search strategies +(empty string mean "prefix" strategy) + + + + DictionaryBar Dictionary Bar @@ -496,6 +670,10 @@ Extended menu with all dictionaries... + + Dictionary headwords + + EditDictionaries @@ -540,6 +718,75 @@ + FTS::FtsIndexing + + None + Ni maya + + + + FTS::FullTextSearchDialog + + Full-text search + + + + Whole words + + + + Plain text + + + + Wildcards + + + + RegExp + + + + Max distance between words (%1-%2): + + + + Max articles per dictionary (%1-%2): + + + + Articles found: + + + + Now indexing: + + + + The search line must contains at least one word containing + + + + or more symbols + + + + No dictionaries for full-text search + + + + CJK symbols in search string are not compatible with search modes "Whole words" and "Plain text" + + + + + FTS::Indexing + + None + Ni maya + + + Forvo::ForvoArticleRequest XML parse error: %1 at %2,%3 @@ -571,6 +818,53 @@ + FullTextSearchDialog + + Search + + + + Match case + + + + Mode: + + + + Articles found: + + + + Available dictionaries in group: + + + + Wait for indexing: + + + + Total: + + + + Indexed: + + + + Now indexing: None + + + + Cancel + Jan saña + + + Help + + + + GermanTranslit German Transliteration @@ -716,6 +1010,53 @@ Drag&drop dictionaries to and from the groups, move them inside the groups, reorder the groups using your mouse. "Aru pirwa tamanakar uskuñataki uchaku apnakam" uru pirwanaka tamarunakaru, ukhamaraki tamanak lantiñatakiwa, achakumpi katatayampi." + + Group tabs + + + + Open groups list + + + + + Help::HelpWindow + + GoldenDict help + + + + Home + + + + Back + Qhipa + + + Forward + Arkiri + + + Zoom In + Jach'antaña + + + Zoom Out + Jisk'antaña + + + Normal Size + Tamaño normal + + + Content + + + + Index + + HistoryPaneWidget @@ -2828,6 +3169,39 @@ Open dictionary folder + + Dictionary headwords + + + + String to search in dictionaries. The wildcards '*', '?' and sets of symbols '[...]' are allowed. +To find '*', '?', '[', ']' symbols use '\*', '\?', '\[', '\]' respectively + + + + Search + + + + Search in page + + + + Ctrl+F + + + + Full-text search + + + + Ctrl+Shift+F + + + + GoldenDict reference + + Mdx::MdxArticleRequest @@ -2885,7 +3259,7 @@ ... - ... + ... Inactive (disabled) dictionaries: @@ -2935,6 +3309,14 @@ Sort by languages + + Dictionary headwords + + + + Dictionaries active: %1, inactive: %2 + + PathsModel @@ -3541,6 +3923,38 @@ Articles longer than this size will be collapsed + + System proxy + + + + Custom proxy + + + + Custom settings + + + + Full-text search + + + + Allow full-text search for: + + + + Don't search in dictionaries containing more than + + + + articles (0 - unlimited) + + + + Help language + + ProgramTypeEditor @@ -4106,6 +4520,14 @@ Any external programs. A string %GDWORD% will be replaced with the query word. If such string is not presented, the word will be fed into standard input. + + DICT servers + + + + DICT servers: + + StylesComboBox diff -Nru goldendict-1.5.0~git20131003/locale/be_BY@latin.ts goldendict-1.5.0~git20150923/locale/be_BY@latin.ts --- goldendict-1.5.0~git20131003/locale/be_BY@latin.ts 2013-10-02 20:42:04.000000000 +0000 +++ goldendict-1.5.0~git20150923/locale/be_BY@latin.ts 2015-09-23 08:26:24.000000000 +0000 @@ -34,7 +34,7 @@ [Niaviedamaja] - + Based on Qt %1 (%2, %3 bit) Na padstavie Qt %1 (%2, %3 bity) @@ -42,62 +42,62 @@ ArticleMaker - + Expand article Razharnuć artykuł - + Collapse article Zharnuć artykuł - + No translation for <b>%1</b> was found in group <b>%2</b>. GoldenDict nie znajšoŭ pierakładu dla <b>%1</b> u grupie <b>%2</b>. - + No translation was found in group <b>%1</b>. GoldenDict nie znajšoŭ pierakładu ŭ grupie <b>%1</b>. - + Welcome! Vitajem! - + <h3 align="center">Welcome to <b>GoldenDict</b>!</h3><p>To start working with the program, first visit <b>Edit|Dictionaries</b> to add some directory paths where to search for the dictionary files, set up various Wikipedia sites or other sources, adjust dictionary order or create dictionary groups.<p>And then you're ready to look up your words! You can do that in this window by using a pane to the left, or you can <a href="Working with popup">look up words from other active applications</a>. <p>To customize program, check out the available preferences at <b>Edit|Preferences</b>. All settings there have tooltips, be sure to read them if you are in doubt about anything.<p>Should you need further help, have any questions, suggestions or just wonder what the others think, you are welcome at the program's <a href="http://goldendict.org/forum/">forum</a>.<p>Check program's <a href="http://goldendict.org/">website</a> for the updates. <p>(c) 2008-2013 Konstantin Isakov. Licensed under GPLv3 or later. <h3 align="center">Vitajem u <b>GoldenDict</b>!</h3><p>Pierš za ŭsio naviedaj <b>Źmieny|Słoŭniki</b>, kab paznačyć šlachi da słoŭnikavych fajłaŭ, ź jakich budzie stanavicca biblijateka słoŭnikaŭ, dadaj roznyja sajty Vikipedyi j inšyja krynicy, vyznačy paradak słoŭnikaŭ dy stvary słoŭnikavyja grupy.<p>Pa naładžvańni pragrama budzie hatovaja da prahladu słoŭnikavych artykułaŭ. Toje možna rabić u hetym aknie (upišy šukanaje słova ŭ radok šukańnia) ci ŭ vonkavych pragramach z dapamohaju <a href="Karystańnie słoŭnikam u vonkavych pragramach">vypłyŭnych voknaŭ</a>. <p>Kab dapasavać da siabie pragramu, skarystaj dastupnyja nałady ŭ <b>Źmienach|Naładach</b>. Usie źmieščanyja tam nałady majuć padkazki. Čytaj ich dla peŭnaści ŭ zroblenych źmienach.<p>Kali ŭźnikli pytańni, prapanovy, ci prosta zachaciełasia znać mierkavańni ludziej, to zaprašajem na naš <a href="http://goldendict.org/forum/">forum</a>.<p>Novyja versii pragramy zaŭsiody možna znajści na našym <a href="http://goldendict.org/">sajcie</a>.<p>(c) 2008-2013 Kanstancin Isakaŭ. Licenzija GPLv3 ci paźniejšaja. - + Working with popup Karystańnie słoŭnikam u vonkavych pragramach - + <h3 align="center">Working with the popup</h3>To look up words from other active applications, you would need to first activate the <i>"Scan popup functionality"</i> in <b>Preferences</b>, and then enable it at any time either by triggering the 'Popup' icon above, or by clicking the tray icon down below with your right mouse button and choosing so in the menu you've popped. <h3 align="center">Karystańnie słoŭnikam u vonkavych pragramach</h3>Kab šukać słovy ŭ słoŭniku z-pad inšych pragramaŭ, treba padłučyć <i>mechanizm vypłyŭnych voknaŭ</i> u <b>Naładach</b>, i zacisnuć knopku „Vypłyŭnyja vokny“ ŭ hałoŭnym aknie, ci ŭłučyć adpaviedny punkt kantekstnaha meniu značka ŭ systemnym łotku. - + Then just stop the cursor over the word you want to look up in another application, and a window would pop up which would describe it to you. Zatym u kožnaj pragramie prosta spyni kursor myšy nad słovam, i praz chvilu źjavicca vypłyŭnoje akno z adpaviednym artykułam. - + Then just select any word you want to look up in another application by your mouse (double-click it or swipe it with mouse with the button pressed), and a window would pop up which would describe the word to you. Zatym u kožnaj pragramie prosta abiary słova myššu (dvojčy pstrykni ci praviadzi pa słovie kursoram myšy z zacisnutaj levaj knopkaj), i praz chvilu źjavicca vypłyŭnoje akno z adpaviednym artykułam. - + (untitled) (nienazvanaja) - + (picture) (vidarys) @@ -105,37 +105,37 @@ ArticleRequest - + Expand article Razharnuć artykuł - + From Z - + Collapse article Zharnuć artykuł - + Query error: %1 Pamyłka zapytu: %1 - + Close words: Padobnyja słovy: - + Compound expressions: Słovazłučeńni: - + Individual words: Słovy paasobku: @@ -148,219 +148,222 @@ Chorma - + about:blank about:blank - + Find: Šukać: - + x x - + + &Previous &Papiaredni - + + &Next &Nastupny - + Ctrl+G Ctrl+G - + Highlight &all Paznačyć &usie - + &Case Sensitive &Roźnić registar - + Select Current Article Vybrać dziejny artykuł - + Copy as text Skapijavać jak tekst - + Inspect Inspektar - + Resource Resurs - + Audio Aŭdyjo - + TTS Voice Syntezatar hołasu - + Picture Vidarys - + Video Videa - + Video: %1 Videa: %1 - + Definition from dictionary "%1": %2 Aznačeńnie z słoŭnika „%1“: %2 - + Definition: %1 Aznačeńnie: %1 - - + + The referenced resource doesn't exist. Zapytanaha resursu nie isnuje. - + The referenced audio program doesn't exist. Paznačanaj pragramy nie isnuje. - + + ERROR: %1 PAMYŁKA: %1 - + Save sound Zachavańnie huku - + Sound files (*.wav *.ogg *.mp3 *.mp4 *.aac *.flac *.mid *.wv *.ape);;All files (*.*) Hukavyja fajły (*.wav *.ogg *.mp3 *.mp4 *.aac *.flac *.mid *.wv *.ape);;Usie fajły (*.*) - + Save image Zachavańnie vyjavy - + Image files (*.bmp *.jpg *.png *.tif);;All files (*.*) Fajły vyjavaŭ (*.bmp *.jpg *.png *.tif);;Usie fajły (*.*) - + &Open Link &Adčynić spasyłku - + Open Link in New &Tab Ačynić spasyłku ŭ novaj &układcy - + Open Link in &External Browser Adčynić spasyłku ŭ &vonkavym ahladalniku - + Save &image... Zachavać &vyjavu... - + Save s&ound... Zachavać &huk... - + &Look up "%1" &Šukać „%1“ - + Look up "%1" in &New Tab Šukać „%1“ u &novaj układcy - + Send "%1" to input line Źmiaścić „%1“ u ŭvodnym radku - - + + &Add "%1" to history &Dadać „%1“ da historyi - + Look up "%1" in %2 Šukać „%1“ u grupie %2 - + Look up "%1" in %2 in &New Tab Šukać „%1“ u grupie %2 u novaj u&kładcy - + WARNING: FFmpeg Audio Player: %1 PAPIAREDŽAŃNIE: Prajhravalnik FFMpeg: %1 - + WARNING: %1 UVAHA: %1 - + Failed to run a player to play sound file: %1 Nia zdoleŭ zapuścić prajhravalnika hukavaha fajła: %1 - + Failed to create temporary file. Nia zdoleŭ stvaryć časovaha fajła. - + Failed to auto-open resource file, try opening manually: %1. Nia zdoleŭ aŭtamatyčna adčynić resursavaha fajła. Pasprabuj adčynić ručna %1. - + The referenced resource failed to download. Nia zdoleŭ zładavać paznačanaha resursu. @@ -386,6 +389,29 @@ + Dialog + + + Proxy authentication required + + + + + You need to supply a Username and a Password to access via proxy + + + + + Username: + + + + + Password: + Parol: + + + DictGroupWidget @@ -486,6 +512,119 @@ + DictHeadwords + + + Search mode + + + + + This element determines how filter string will be interpreted + + + + + If checked on the symbols case will be take in account when filtering + + + + + Match case + + + + + Exports headwords to file + + + + + Export + + + + + Help + + + + + OK + + + + + Press this button to apply filter to headwords list + + + + + Apply + + + + + If checked any filter changes will we immediately applied to headwords list + + + + + Auto apply + + + + + Filter: + + + + + Filter string (fixed string, wildcards or regular expression) + + + + + Text + + + + + Wildcards + + + + + RegExp + + + + + Unique headwords total: %1, filtered: %2 + + + + + Save headwords to file + + + + + Text files (*.txt);;All files (*.*) + Tekstavyja fajły (*.txt);;Usie fajły (*.*) + + + + Export headwords... + + + + + Cancel + Skasavać + + + DictInfo @@ -528,6 +667,16 @@ Apisańnie: + + Show all unique dictionary headwords + + + + + Headwords + + + Edit the dictionary via command: %1 @@ -543,6 +692,74 @@ + DictServer + + + Url: + + + + + Databases: + + + + + Search strategies: + + + + + Server databases + + + + + DictServersModel + + + Enabled + + + + + Name + Nazva + + + + Address + Adras + + + + Databases + + + + + Strategies + + + + + Icon + Značak + + + + Comma-delimited list of databases +(empty string or "*" matches all databases) + + + + + Comma-delimited list of search strategies +(empty string mean "prefix" strategy) + + + + DictionaryBar @@ -560,17 +777,22 @@ Redagavać hetuju grupu - + Dictionary info Infarmacyja pra słoŭnik - + + Dictionary headwords + + + + Open dictionary folder Adčynić słoŭnikavy katalog - + Edit dictionary Redagavać słoŭnik @@ -583,39 +805,39 @@ Słoŭniki - + &Sources &Krynicy - - + + &Dictionaries &Słoŭniki - - + + &Groups G&rupy - + Sources changed Krynicy źmianilisia - + Some sources were changed. Would you like to accept the changes? Kolki krynic źmianiłasia. Ci ŭžyć źmieny? - + Accept Užyć - + Cancel Skasavać @@ -629,6 +851,92 @@ + FTS::FtsIndexing + + + None + Niama + + + + FTS::FullTextSearchDialog + + + Full-text search + + + + + Whole words + + + + + Plain text + + + + + Wildcards + + + + + RegExp + + + + + Max distance between words (%1-%2): + + + + + Max articles per dictionary (%1-%2): + + + + + + + Articles found: + + + + + Now indexing: + + + + + CJK symbols in search string are not compatible with search modes "Whole words" and "Plain text" + + + + + The search line must contains at least one word containing + + + + + or more symbols + + + + + No dictionaries for full-text search + + + + + FTS::Indexing + + + None + Niama + + + Forvo::ForvoArticleRequest @@ -667,6 +975,65 @@ + FullTextSearchDialog + + + + Search + + + + + Match case + + + + + Mode: + + + + + Articles found: + + + + + Available dictionaries in group: + + + + + Wait for indexing: + + + + + Total: + + + + + Indexed: + + + + + Now indexing: None + + + + + Cancel + Skasavać + + + + Help + + + + GermanTranslit @@ -797,7 +1164,7 @@ - + Remove all groups Vydalić usie grupy @@ -807,42 +1174,100 @@ Pieraciahvaj słoŭniki ŭ/z grupy. Raźmiarkoŭvaj ich u grupie z dapamohaju myšy. - + + Group tabs + + + + + Open groups list + + + + Add group Dadać grupu - + Give a name for the new group: Zadaj nazvu novaj grupy: - + Rename group Pieranazvańnie grupy - + Give a new name for the group: Zadaj novuju nazvu grupy: - + Remove group Vydaleńnie grupy - + Are you sure you want to remove the group <b>%1</b>? Sapraŭdy žadaješ vydalić grupu <b>%1</b>? - + Are you sure you want to remove all the groups? Sapraŭdy žadaješ vydalić usie grupy? + Help::HelpWindow + + + GoldenDict help + + + + + Home + + + + + Back + Nazad + + + + Forward + Napierad + + + + Zoom In + Pavialičyć + + + + Zoom Out + Pamienšyć + + + + Normal Size + Zvyčajny pamier + + + + Content + + + + + Index + + + + HistoryPaneWidget @@ -873,12 +1298,12 @@ Hunspell - + Spelling suggestions: Artagrafičnyja padkazki: - + %1 Morphology Marfalogija %1 @@ -886,12 +1311,12 @@ HunspellDictsModel - + Enabled Ułučana - + Name Nazva @@ -1931,7 +2356,7 @@ LoadDictionaries - + Error loading dictionaries Pamyłka pry ładavańni słoŭnikaŭ @@ -1939,7 +2364,7 @@ Main - + Error in configuration file. Continue with default settings? Abmyłka ŭ fajle kanfiguracyi. Praciahnuć z standartnymi naładami? @@ -1948,534 +2373,575 @@ MainWindow - + Welcome! Vitajem! - + &File &Fajł - + &Edit Ź&mieny - + &Help &Dapamoha - + &View &Vyhlad - + &Zoom &Sumier - + H&istory &Historyja - + + Search + + + + &Search Pane Panel &šukańnia - + &Results Navigation Pane Panel &navigacyi ŭ vynikach - + &History Pane Panel &historyi - + &Dictionaries... &Słoŭniki... - + F3 F3 - + &Preferences... &Nałady... - + F4 F4 - + &Homepage &Chatniaja bačyna - + &About &Infarmacyja - + About GoldenDict Infarmacyja pra GoldenDict - + + GoldenDict reference + + + + F1 F1 - - + + &Quit &Vyjści - + Quit from application Vyjści z pragramy - + Ctrl+Q Ctrl+Q - + &Forum &Forum - + &Close To Tray Źvinuć u &łotak - + Minimizes the window to tray Źvinuć akno ŭ łotak - + Ctrl+F4 Ctrl+F4 - + &Save Article &Zachavać artykuł - + Save Article Zachavać artykuł - + F2 F2 - + &Print Na&drukavać - + Ctrl+P Ctrl+P - + Page Set&up Nałady &bačyny - + Print Pre&view Pieradpr&ahlad druku - + &Rescan Files Piera&skanavać fajły - + Ctrl+F5 Ctrl+F5 - + &Clear &Ačyścić - + &New Tab &Novaja ŭkładka - + Ctrl+T Ctrl+T - + &Configuration Folder Tečka &kanfiguracyi - - + + &Show &Pakazać - + Ctrl+H Ctrl+H - + &Export Z&ekspartavać - + &Import Z&ympartavać - + &Always on Top Zaŭsiody na &viersie - + Always on Top Zaŭsiody na viersie - + Ctrl+O Ctrl+O - - - + + + Menu Button Knopka meniu - + + Search in page + + + + + Ctrl+F + + + + + Full-text search + + + + + Ctrl+Shift+F + + + + Show Names in Dictionary &Bar Pakazvać &nazvy ŭ słoŭnikavaj palicy - + Show Small Icons in &Toolbars Pakazvać małyja znački ŭ palicy &pryładaŭ - + &Menubar Palica &meniu - + &Navigation &Navigacyja - + Back Nazad - + Forward Napierad - + Scan Popup Ułučyć pracu ŭ vonkavych pragramach - + Pronounce Word (Alt+S) Vymavić słova (Alt+S) - + Zoom In Pavialičyć - + Zoom Out Pamienšyć - + Normal Size Zvyčajny pamier - - + + Look up in: Šukać u: - + Found in Dictionaries: Znojdziena ŭ nastupnych słoŭnikach: - + Words Zoom In Pavialičyć radok šukańnia - + Words Zoom Out Pamienšyć radok šukańnia - + Words Normal Size Zvyčajny pamier radka šukańnia - + Show &Main Window Pakazać &hałoŭnaje akno - + Opened tabs Adčynienyja ŭkładki - + Close current tab Začynić dziejnuju ŭkładku - + Close all tabs Začynić usie ŭkładki - + Close all tabs except current Začynić usie ŭkładki aproč dziejnaj - + Loading... Ładavańnie... - + New Tab Novaja ŭkładka - + %1 dictionaries, %2 articles, %3 words %1 słoŭnikaŭ, %2 artykułaŭ, %3 słovaŭ - + Look up: Šukać: - + All Usie - + Open Tabs List Adčynić śpis układak - + (untitled) (biaz nazvy) - + %1 - %2 %1 - %2 - + Failed to initialize hotkeys monitoring mechanism.<br>Make sure your XServer has RECORD extension turned on. Pamyłka inicyjalizacyi cikavańnia klavišnych skarotaŭ.<br>Pierakanajsia, što XServer maje ŭłučanaje pašyreńnie RECORD. - + New Release Available Dastuny novy vypusk - + Version <b>%1</b> of GoldenDict is now available for download.<br>Click <b>Download</b> to get to the download page. GoldenDict versii <b>%1</b> dastupny dla załadavańnia.<br>Pstrykni pa <b>Zładavać</b>, kab pierajści na bačynu ściahvańnia. - + Download Zładavać - + Skip This Release Praminuć hety vypusk - - + + Accessibility API is not enabled Accessibility API nia ŭłučany - + + String to search in dictionaries. The wildcards '*', '?' and sets of symbols '[...]' are allowed. +To find '*', '?', '[', ']' symbols use '\*', '\?', '\[', '\]' respectively + + + + You have chosen to hide a menubar. Use %1 to show it back. Palica meniu jość schavanaja. Skarystaj %1, kab pavaracić nazad. - + Ctrl+M Ctrl+M - + Page Setup Nałady bačyny - + No printer is available. Please install one first. Niama dasiažnych drukarak. Spačatku ŭstaluj choć adnu. - + Print Article Nadrukavać artykuł - + Article, Complete (*.html) Artykuł całkom (*.html) - + Article, HTML Only (*.html) Artykuł, tolki HTML (*.html) - + Save Article As Zachavać artykuł jak - + Error Pamyłka - + Can't save article: %1 Niamožna zachavać artykuł: %1 - + Saving article... Zachoŭvańnie artykuła... - + The main window is set to be always on top. Hałoŭnaje akno ciapier zaŭsiody znachodzicca vyšej inšych. - + &Hide S&chavać - + Export history to file Ekspartavańnie historyi ŭ fajł - - + + Text files (*.txt);;All files (*.*) Tekstavyja fajły (*.txt);;Usie fajły (*.*) - + History export complete Ekspartavańnie historyi končyłasia - + Export error: Pamyłka ekspartu: - + Import history from file Impartavańnie historyi z fajła - + Import error: invalid data in file Pamyłka impartavańnia: chibnyja źviestki ŭ fajle - + History import complete Impartavańnie historyi končyłasia - + Import error: Pamyłka impartavańnia: - + Dictionary info Infarmacyja pra słoŭnik - + + Dictionary headwords + + + + Open dictionary folder Adčynić słoŭnikavy katalog - + Edit dictionary Redagavać słoŭnik @@ -2483,12 +2949,12 @@ Mdx::MdxArticleRequest - + Dictionary file was tampered or corrupted Słoŭnikavy fajł skažony ci paškodžany - + Failed loading article from %1, reason: %2 Abmyłka ładavańnia artykuła z %1, z pryčyny: %2 @@ -2496,7 +2962,7 @@ MediaWiki::MediaWikiArticleRequest - + XML parse error: %1 at %2,%3 Pamyłka razboru fajła XML: %1 — radok %2, słupok %3 @@ -2504,7 +2970,7 @@ MediaWiki::MediaWikiWordSearchRequest - + XML parse error: %1 at %2,%3 Pamyłka razboru fajła XML: %1 — radok %2, słupok %3 @@ -2512,22 +2978,22 @@ MediaWikisModel - + Enabled Ułučany - + Name Nazva - + Address Adras - + Icon Značak @@ -2540,88 +3006,94 @@ Chorma - + Dictionary order: Paradak słoŭnikaŭ: - - - - ... - ... + ... - + Inactive (disabled) dictionaries: Nieŭžyvanyja (vyłučanyja) słoŭniki: - + Dictionary information Infarmacyja pra słoŭnik - + Name: Nazva: - + Total articles: Usiaho artykułaŭ: - + Total words: Usiaho słovaŭ: - + Translates from: Kryničnaja mova: - + Translates to: Metavaja mova: - + Description: Apisańnie: - + Files comprising this dictionary: Fajły, jakija składajuć słoŭnik: - + Adjust the order by dragging and dropping items in it. Drop dictionaries to the inactive group to disable their use. Uparadkuj słoŭniki, raźmierkavaŭšy ich myššu. Kab nie ŭžyvać słoŭnika, pieraciahni jaho ŭ grupu vyłučanych słoŭnikaŭ. - + Sort by name Sartavać pavodle nazvy - + Sort by languages Sartavać pavodle movy + + + Dictionary headwords + + + + + Dictionaries active: %1, inactive: %2 + + PathsModel - + Path Šlach - + Recursive Rekursiŭna @@ -2779,22 +3251,27 @@ Dadatkovy styl: - + + Help language + + + + Adjust this value to avoid huge context menus. Nastaŭ hetaje značeńnie, kab unikać vialikich meniušak. - + Context menu dictionaries limit: Hranica kolkaści słoŭnikaŭ u vypadnym meniu: - + &Scan Popup &Karystańnie zvonku - + When enabled, a translation popup window would be shown each time you point your mouse on any word on the screen (Windows) or select any word with mouse (Linux). When enabled, you can switch it on and @@ -2805,134 +3282,134 @@ akna ŭ hałoŭnym aknie ci ŭ systemnym łotku. - + Enable scan popup functionality Ułučyć mechanizm vypłyŭnych voknaŭ - + Chooses whether the scan popup mode is on by default or not. If checked, the program would always start with the scan popup active. Vyznačaje ci ŭłučać vonkavyja vypłyŭnyja vokny pry startavańni pragramy. - + Start with scan popup turned on Startavać razam z ułučanymi vypłyŭnymi voknami - + With this enabled, the popup would only show up if all chosen keys are in the pressed state when the word selection changes. Pakazvać vypłyŭnoje akno tolki tady, kali karystalnik zaciśnie ŭsie paznačanyja klavišy. - + Only show popup when all selected keys are kept pressed: Pakazvać vypłyŭnoje akno tolki pry nastupnych zacisnutych klavišach: - + Left Ctrl only Tolki levy Ctrl - + Left Ctrl Levy Ctrl - + Right Shift only Tolki pravy Shift - + Right Shift Pravy Shift - + Alt key Klaviš Alt - + Alt Alt - + Ctrl key Klaviš Ctrl - + Ctrl Ctrl - + Left Alt only Tolki levy Alt - + Left Alt Levy Alt - + Shift key Klaviš Shift - + Shift Shift - + Right Alt only Tolki pravy Alt - + Right Alt Pravy Alt - + Right Ctrl only Tolki pravy Ctrl - + Right Ctrl Pravy Ctrl - + Left Shift only Tolki levy Shift - + Left Shift Levy Shift - + Windows key or Meta key Windows-klaviš ci Meta-klaviš - + Win/Meta Win/Meta - + Normally, in order to activate a popup you have to maintain the chosen keys pressed while you select a word. With this enabled, the chosen keys may also @@ -2943,12 +3420,12 @@ i praz peŭny čas. - + Keys may also be pressed afterwards, within Klavišy možna nacisnuć i praz - + To avoid false positives, the keys are only monitored after the selection's done for a limited amount of seconds, which is specified here. @@ -2956,42 +3433,42 @@ abmiežavanuju kolkaść sekundaŭ, jakaja j zadajecca tut. - + secs s - + Send translated word to main window instead of to show it in popup window Słać pierakładanaje słova ŭ hałoŭnaje akno zamiest vyklikańnia vypłyŭnoha - + Send translated word to main window Słać pierakładanaje słova ŭ hałoŭnaje akno - + Hotkeys Klavišnyja skaroty - + Use the following hotkey to show or hide the main window: Vykarystoŭvać nastupny skarot dla vyklikańnia hałoŭnaha akna: - + Use the following hotkey to translate a word from clipboard: Vykarystoŭvać nastupny skarot dla pierakładu słova z kišeni: - + The hotkeys are global and work from any program and within any context as long as GoldenDict is running in background. Klavišnyja skaroty jość glabalnymi i dziejničajuć u kožnaj pragramie ŭ kožnym kantekście, pakul pracuje GoldenDict. - + <!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; } @@ -3004,94 +3481,109 @@ <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" color:#ff0000;">Zaŭvaha: Padobna na toje, što dziejny vypusk X.Org XServer maje niepracazdolnaje pašyreńnie RECORD. Klavišnyja skaroty GoldenDict mahčyma rabić nia budutь. Heta treba vypraŭlać na baku serveru. Padrabiaznaja infarmacyja </span><a href="https://bugs.freedesktop.org/show_bug.cgi?id=20500"><span style=" text-decoration: underline; color:#0000ff;">tut</span></a><span style=" color:#ff0000;">. Pry žadańni tam možna pakinuć svoj kamentar.</span></p></body></html> - + &Audio &Aŭdyjo - + Pronunciation Vymaŭleńnie - + Auto-pronounce words in main window Aŭtamatyčna vymaŭlać słovy ŭ hałoŭnym aknie - + Auto-pronounce words in scan popup Aŭtamatyčna vymaŭlać słovy ŭ vypłyŭnym aknie - + Playback Prajhravańnie - + Play audio files via FFmpeg(libav) and libao Prajhravać huki praz FFmpeg(libav) i libao - + Use internal player Karystać ubudavany prajhravalnik - + Use any external program to play audio files Skarystać vonkavuju pragramu dla prajhravańnia aŭdyjo fajłaŭ - + Use external program: Prajhravać praz vonkavuju pragramu: - + &Network &Sietka - + Enable if you wish to use a proxy server for all program's network requests. Ułučyć, kab vykarystoŭvać proksi server dla ŭsich sietkavych zapytaŭ pragramy. - + Use proxy server Skarystać proksi-server - + + System proxy + + + + + Custom proxy + + + + + Custom settings + + + + Type: Typ: - + Host: Host: - + Port: Port: - + User: Karystalnik: - + Password: Parol: - + Enabling this would make GoldenDict block most advertisements by disallowing content (images, frames) not originating from the site you are browsing. If some site breaks because of this, try disabling this. @@ -3100,12 +3592,12 @@ Kali niejkija sajty złamajucca, pasprabuj adłučyć hetuju opcyju. - + Disallow loading content from other sites (hides most advertisements) Abmiežavać załadoŭvanaje źmieściva ź inšych sajtaŭ (chavaje bolšaść reklamy) - + Enabling this would allow to listen to sound pronunciations from online dictionaries that rely on Flash or other web plugins. Plugin must be installed for this option to work. @@ -3114,24 +3606,24 @@ Ubudovy musiać być ustalavanymi. - + Enable web plugins Ułučyć sieciŭnyja ŭbudovy - + Some sites detect GoldenDict via HTTP headers and block the requests. Enable this option to workaround the problem. Niekatoryja sajty paznajuć GoldenDict praz HTTP-zahałoŭki i blakujuć zapyty. Ułučy opcyju, kab abminuć prablemu. - + Do not identify GoldenDict in HTTP headers Nie paznačać GoldenDict u HTTP-zapytach - + When this is enabled, the program periodically checks if a new, updated version of GoldenDict is available for download. If it is so, the program @@ -3143,22 +3635,42 @@ j prapanuje naviedać bačynu zładavańnia. - + Check for new program releases periodically Praviarać najaŭnaść novych vypuskaŭ pragramy - + + Full-text search + + + + + Allow full-text search for: + + + + + Don't search in dictionaries containing more than + + + + + articles (0 - unlimited) + + + + Ad&vanced &Dadatkova - + ScanPopup extra technologies Dadatkovyja mechanizmy skanavańnia słovaŭ dla vypłyŭnych voknaŭ - + Try to use IAccessibleEx technology to retrieve word under cursor. This technology works only with some programs that support it (for example Internet Explorer 9). @@ -3169,12 +3681,12 @@ Nia treba ŭłučać hetaje opcyi, kali nie karystaješsia takimi pragramami. - + Use &IAccessibleEx Skarystać &IAccessibleEx - + Try to use UI Automation technology to retrieve word under cursor. This technology works only with some programs that support it. It is not needed to select this option if you don't use such programs. @@ -3183,12 +3695,12 @@ Nia treba ŭłučać hetaje opcyi, kali nie karystaješsia takimi pragramami. - + Use &UIAutomation Skarystać &UIAutomation - + Try to use special GoldenDict message to retrieve word under cursor. This technology works only with some programs that support it. It is not needed to select this option if you don't use such programs. @@ -3197,127 +3709,128 @@ Nia treba ŭłučać hetaje opcyi, kali nie karystaješsia takimi pragramami. - + Use &GoldenDict message Skarystać zapyty &GoldenDict - + History Historyja - + Turn this option on to store history of the translated words Ułučy hetuju opcyju, kab zachoŭvać historyju pierakładanych słovaŭ - + Store &history Zachoŭvać &historyju - + Specify the maximum number of entries to keep in history. Paznačaje maksymalnuju kolkaść zapisaŭ u historyi. - + Maximum history size: Pamier historyi: - + History saving interval. If set to 0 history will be saved only during exit. Intervał zachavańnia historyi. Kali 0, historyja budzie zachoŭvacca tolki pierad vychadam. - + Save every Zachoŭvać praz - + minutes chv - + Articles Artykuły - + Turn this option on to always expand optional parts of articles Ułučy hetuju opcyju, kab zaŭsiody razhortvać dadatkovyja raździeły artykułaŭ - + Expand optional &parts Razhortvać dadatkovyja &raździeły - + Select this option to automatic collapse big articles Ułučy opcyju, kab aŭtamatyčna zhartać vialikija artykuły - + Collapse articles more than Zhartać artykuły, jakija majuć bolš za - + Articles longer than this size will be collapsed Artykuły bolšyja za heta značeńnie buduć zhartacca - + symbols znakaŭ - + System default Systemnaja - + + Default Standartny - + Modern Sučasny - + Lingvo Lingvo - + Babylon Babylon - + Lingoes Lingoes - + Lingoes-Blue Lingoes-Blue - + Changing Language Źmiena movy - + Restart the program to apply the language change. Pierastartuj pragramu, kab užyć novuju movu. @@ -3325,27 +3838,27 @@ ProgramTypeEditor - + Audio Aŭdyjo - + Plain Text Zvyčajny tekst - + Html Html - + Prefix Match Pavodle prefiksu - + Unknown Niaviedama @@ -3371,27 +3884,27 @@ ProgramsModel - + Enabled Ułučana - + Type Typ - + Name Nazva - + Command Line Zahadny radok - + Icon Značak @@ -3399,12 +3912,14 @@ QObject - + + Article loading error Pamyłka ładavańnia artykuła - + + Article decoding error Pamyłka raskadoŭvańnia artykuła @@ -3515,18 +4030,18 @@ ResourceToSaveHandler - - + + ERROR: %1 ABMYŁA: %1 - + Resource saving error: Pamyłka zachavańnia resursu: - + The referenced resource failed to download. Nia vyjšła zładavać paznačanaha resursu. @@ -3534,12 +4049,12 @@ Romaji - + Hepburn Romaji for Hiragana Systema łacinizacyi Hepbiorna dla Chiragany - + Hepburn Romaji for Katakana Systema łacinizacyi Hepbiorna dla Katakany @@ -3560,59 +4075,59 @@ Dyjalog - + Back Nazad - - - - - + + + + + ... ... - + Forward Napierad - + Pronounce Word (Alt+S) Vymavić słova (Alt+S) - + Alt+S Alt+S - + Send word to main window (Alt+W) Dasłać słova u hałoŭnaje akno (Alt+W) - + Alt+W Alt+W - + Shows or hides the dictionary bar Pakazać abo schavać słoŭnikavuju palicu - + Use this to pin down the window so it would stay on screen, could be resized or managed in other ways. Skarystaj špilku, kab zamacavać akno na ekranie, źmianiać jahony pamier, dy kiravać im kožnym zručnym sposabam. - - + + %1 - %2 %1 - %2 @@ -3620,17 +4135,17 @@ SoundDirsModel - + Path Šlach - + Name Nazva - + Icon Značak @@ -3652,7 +4167,8 @@ - + + &Add... &Dadać... @@ -3661,7 +4177,8 @@ - + + &Remove &Prybrać @@ -3737,39 +4254,39 @@ Roznyja sajty. %GDWORD% zamienicca na zapytanaje słova: - + Programs Pragramy - + Forvo Forvo - + Live pronunciations from <a href="http://www.forvo.com/">forvo.com</a>. The site allows people to record and share word pronunciations. You can listen to them from GoldenDict. Žyvoje vymaŭleńnie z <a href="http://www.forvo.com/">forvo.com</a>. Hety sajt dazvalaje ludziam zapisvać i dzialicca vymaŭleńniem słovaŭ. Ich možna prasłuchać pry dapamozie GoldenDict. - + Enable pronunciations from Forvo Ułučyć vymaŭleńnie z Forvo - + API Key: Kluč API: - + Use of Forvo currently requires an API key. Leave this field blank to use the default key, which may become unavailable in the future, or register on the site to get your own key. Karystańnie sajtam Forvo patrabuje kluč API. Pakiń pole pustym, kab karystacca standartnym klučom, jaki paźniej moža stać niedastupnym, ci zaregistrujsia na sajcie i atrymaj ułasny kluč. - + Get your own key <a href="http://api.forvo.com/key/">here</a>, or leave blank to use the default one. Atrymaj svoj ułasny kluč <a href="http://api.forvo.com/key/">tut</a>, ci pakiń pole pustym dla standartnaha značeńnia. @@ -3781,79 +4298,89 @@ dla Big-5, %GDBIG5HKSCS% dla Big5-HKSCS, %GDGBK% dla GBK i GB18030, %GDSHIFTJIS% dla Shift-JIS. + + DICT servers + + + + DICT servers: + + + + Any external programs. A string %GDWORD% will be replaced with the query word. If such string is not presented, the word will be fed into standard input. Roznyja vonkavyja pragramy. %GDWORD% zamienicca na zapytanaje słova. Kali takoha słova niama, to jaho nakirujuć u standartny ŭvod. - + Language codes (comma-separated): Moŭnyja kody (praz kosku): - + List of language codes you would like to have. Example: "en, ru". Pieralik vybranych moŭnyk kodaŭ. Prykładam: „en, uk, pl“. - + Full list of language codes is available <a href="http://www.forvo.com/languages-codes/">here</a>. Poŭny śpis dastupnych moŭnych kodaŭ <a href="http://www.forvo.com/languages-codes/">tut</a>. - + Transliteration Tranśliteracyja - + Russian transliteration Rasiejskaja tranśliteracyja - + Greek transliteration Hreckaja tranśliteracyja - + German transliteration Niamieckaja tranśliteracyja - + Belarusian transliteration Biełaruskaja tranśliteracyja - + Enables to use the Latin alphabet to write the Japanese language Ułučaje łacinski alfabet dla japonskaje movy - + Japanese Romaji Japonski ramadzi - + Systems: Systemy: - + The most widely used method of transcription of Japanese, based on English phonology Najbolš užyvany metad transkrypcyi japonskaje movy na padstavie angielskaje fanalogii - + Hepburn Hepbiorn - + The most regular system, having a one-to-one relation to the kana writing systems. Standardized as ISO 3602 @@ -3864,12 +4391,12 @@ U GoldenDict jašče nie padtrymlivajecca. - + Nihon-shiki Nichon-siki - + Based on Nihon-shiki system, but modified for modern standard Japanese. Standardized as ISO 3602 @@ -3880,75 +4407,77 @@ U GoldenDict jašče nie padtrymlivajecca. - + Kunrei-shiki Kunrej-siki - + Syllabaries: Składovyja abecedy: - + Hiragana Japanese syllabary Składovaja abeceda Chiragana - + Hiragana Chiragana - + Katakana Japanese syllabary Składovaja abeceda Kitakana - + Katakana Katakana - + Text to Speech Syntez movy - + (not available in portable version) (nie dastupna ŭ pieranosnaj versii) - - - + + + Choose a directory Vybar katalogu - - - - - + + + + + + Confirm removal Paćvierdžańnie vydaleńnia - - + + Remove directory <b>%1</b> from the list? Prybrać katalog <b>%1</b> sa śpisu? - - + + + Remove site <b>%1</b> from the list? Prybrać sajt <b>%1</b> sa śpisu? - + Remove program <b>%1</b> from the list? Prybrać pragramu <b>%1</b> sa śpisu? @@ -4078,22 +4607,22 @@ WebSitesModel - + Enabled Ułučany - + Name Nazva - + Address Adras - + Icon Značak @@ -4101,7 +4630,7 @@ WordFinder - + Failed to query some dictionaries. Pamyłka zapytu ŭ niejkich słoŭnikach. diff -Nru goldendict-1.5.0~git20131003/locale/be_BY.ts goldendict-1.5.0~git20150923/locale/be_BY.ts --- goldendict-1.5.0~git20131003/locale/be_BY.ts 2013-10-02 20:42:04.000000000 +0000 +++ goldendict-1.5.0~git20150923/locale/be_BY.ts 2015-09-23 08:26:24.000000000 +0000 @@ -34,7 +34,7 @@ [Няведамая] - + Based on Qt %1 (%2, %3 bit) На падставе Qt %1 (%2, %3 біты) @@ -42,62 +42,62 @@ ArticleMaker - + Expand article Разгарнуць артыкул - + Collapse article Згарнуць артыкул - + No translation for <b>%1</b> was found in group <b>%2</b>. GoldenDict не знайшоў перакладу для <b>%1</b> у ґрупе <b>%2</b>. - + No translation was found in group <b>%1</b>. GoldenDict не знайшоў перакладу ў ґрупе <b>%1</b>. - + Welcome! Вітаем! - + <h3 align="center">Welcome to <b>GoldenDict</b>!</h3><p>To start working with the program, first visit <b>Edit|Dictionaries</b> to add some directory paths where to search for the dictionary files, set up various Wikipedia sites or other sources, adjust dictionary order or create dictionary groups.<p>And then you're ready to look up your words! You can do that in this window by using a pane to the left, or you can <a href="Working with popup">look up words from other active applications</a>. <p>To customize program, check out the available preferences at <b>Edit|Preferences</b>. All settings there have tooltips, be sure to read them if you are in doubt about anything.<p>Should you need further help, have any questions, suggestions or just wonder what the others think, you are welcome at the program's <a href="http://goldendict.org/forum/">forum</a>.<p>Check program's <a href="http://goldendict.org/">website</a> for the updates. <p>(c) 2008-2013 Konstantin Isakov. Licensed under GPLv3 or later. <h3 align="center">Вітаем у <b>GoldenDict</b>!</h3><p>Перш за ўсё наведай <b>Зьмены|Слоўнікі</b>, каб пазначыць шляхі да слоўнікавых файлаў, зь якіх будзе станавіцца бібліятэка слоўнікаў, дадай розныя сайты Вікіпэдыі й іншыя крыніцы, вызначы парадак слоўнікаў ды ствары слоўнікавыя ґрупы.<p>Па наладжваньні праґрама будзе гатовая да прагляду слоўнікавых артыкулаў. Тое можна рабіць у гэтым акне (упішы шуканае слова ў радок шуканьня) ці ў вонкавых праґрамах з дапамогаю <a href="Карыстаньне слоўнікам у вонкавых праґрамах">выплыўных вокнаў</a>. <p>Каб дапасаваць да сябе праґраму, скарыстай даступныя налады ў <b>Зьменах|Наладах</b>. Усе зьмешчаныя там налады маюць падказкі. Чытай іх для пэўнасьці ў зробленых зьменах.<p>Калі ўзьніклі пытаньні, прапановы, ці проста захацелася знаць меркаваньні людзей, то запрашаем на наш <a href="http://goldendict.org/forum/">форум</a>.<p>Новыя вэрсіі праґрамы заўсёды можна знайсьці на нашым <a href="http://goldendict.org/">сайце</a>.<p>(c) 2008-2013 Канстанцін Ісакаў. Ліцэнзія GPLv3 ці пазьнейшая. - + Working with popup Карыстаньне слоўнікам у вонкавых праґрамах - + <h3 align="center">Working with the popup</h3>To look up words from other active applications, you would need to first activate the <i>"Scan popup functionality"</i> in <b>Preferences</b>, and then enable it at any time either by triggering the 'Popup' icon above, or by clicking the tray icon down below with your right mouse button and choosing so in the menu you've popped. <h3 align="center">Карыстаньне слоўнікам у вонкавых праґрамах</h3>Каб шукаць словы ў слоўніку з-пад іншых праґрамаў, трэба падлучыць <i>мэханізм выплыўных вокнаў</i> у <b>Наладах</b>, і заціснуць кнопку „Выплыўныя вокны“ ў галоўным акне, ці ўлучыць адпаведны пункт кантэкстнага мэню значка ў сыстэмным лотку. - + Then just stop the cursor over the word you want to look up in another application, and a window would pop up which would describe it to you. Затым у кожнай праґраме проста спыні курсор мышы над словам, і праз хвілю зьявіцца выплыўное акно з адпаведным артыкулам. - + Then just select any word you want to look up in another application by your mouse (double-click it or swipe it with mouse with the button pressed), and a window would pop up which would describe the word to you. Затым у кожнай праґраме проста абяры слова мышшу (двойчы пстрыкні ці правядзі па слове курсорам мышы з заціснутай левай кнопкай), і праз хвілю зьявіцца выплыўное акно з адпаведным артыкулам. - + (untitled) (неназваная) - + (picture) (відарыс) @@ -105,37 +105,37 @@ ArticleRequest - + Expand article Разгарнуць артыкул - + From З - + Collapse article Згарнуць артыкул - + Query error: %1 Памылка запыту: %1 - + Close words: Падобныя словы: - + Compound expressions: Словазлучэньні: - + Individual words: Словы паасобку: @@ -148,219 +148,222 @@ Хорма - + about:blank about:blank - + Find: Шукаць: - + x x - + + &Previous &Папярэдні - + + &Next &Наступны - + Ctrl+G Ctrl+G - + Highlight &all Пазначыць &усе - + &Case Sensitive &Розьніць рэґістар - + Select Current Article Выбраць дзейны артыкул - + Copy as text Скапіяваць як тэкст - + Inspect Інспэктар - + Resource Рэсурс - + Audio Аўдыё - + TTS Voice Сынтэзатар голасу - + Picture Відарыс - + Video Відэа - + Video: %1 Відэа: %1 - + Definition from dictionary "%1": %2 Азначэньне з слоўніка „%1“: %2 - + Definition: %1 Азначэньне: %1 - - + + The referenced resource doesn't exist. Запытанага рэсурсу не існуе. - + The referenced audio program doesn't exist. Пазначанай праґрамы не існуе. - + + ERROR: %1 ПАМЫЛКА: %1 - + Save sound Захаваньне гуку - + Sound files (*.wav *.ogg *.mp3 *.mp4 *.aac *.flac *.mid *.wv *.ape);;All files (*.*) Гукавыя файлы (*.wav *.ogg *.mp3 *.mp4 *.aac *.flac *.mid *.wv *.ape);;Усе файлы (*.*) - + Save image Захаваньне выявы - + Image files (*.bmp *.jpg *.png *.tif);;All files (*.*) Файлы выяваў (*.bmp *.jpg *.png *.tif);;Усе файлы (*.*) - + &Open Link &Адчыніць спасылку - + Open Link in New &Tab Ачыніць спасылку ў новай &укладцы - + Open Link in &External Browser Адчыніць спасылку ў &вонкавым аглядальніку - + Save &image... Захаваць &выяву... - + Save s&ound... Захаваць &гук... - + &Look up "%1" &Шукаць „%1“ - + Look up "%1" in &New Tab Шукаць „%1“ у &новай укладцы - + Send "%1" to input line Зьмясьціць „%1“ у ўводным радку - - + + &Add "%1" to history &Дадаць „%1“ да гісторыі - + Look up "%1" in %2 Шукаць „%1“ у ґрупе %2 - + Look up "%1" in %2 in &New Tab Шукаць „%1“ у ґрупе %2 у новай у&кладцы - + WARNING: FFmpeg Audio Player: %1 ПАПЯРЭДЖАНЬНЕ: Прайгравальнік FFMpeg: %1 - + WARNING: %1 УВАГА: %1 - + Failed to run a player to play sound file: %1 Ня здолеў запусьціць прайгравальніка гукавага файла: %1 - + Failed to create temporary file. Ня здолеў стварыць часовага файла. - + Failed to auto-open resource file, try opening manually: %1. Ня здолеў аўтаматычна адчыніць рэсурсавага файла. Паспрабуй адчыніць ручна %1. - + The referenced resource failed to download. Ня здолеў зладаваць пазначанага рэсурсу. @@ -386,6 +389,29 @@ + Dialog + + + Proxy authentication required + + + + + You need to supply a Username and a Password to access via proxy + + + + + Username: + + + + + Password: + Пароль: + + + DictGroupWidget @@ -486,6 +512,119 @@ + DictHeadwords + + + Search mode + + + + + This element determines how filter string will be interpreted + + + + + If checked on the symbols case will be take in account when filtering + + + + + Match case + + + + + Exports headwords to file + + + + + Export + + + + + Help + + + + + OK + + + + + Press this button to apply filter to headwords list + + + + + Apply + + + + + If checked any filter changes will we immediately applied to headwords list + + + + + Auto apply + + + + + Filter: + + + + + Filter string (fixed string, wildcards or regular expression) + + + + + Text + + + + + Wildcards + + + + + RegExp + + + + + Unique headwords total: %1, filtered: %2 + + + + + Save headwords to file + + + + + Text files (*.txt);;All files (*.*) + Тэкставыя файлы (*.txt);;Усе файлы (*.*) + + + + Export headwords... + + + + + Cancel + Скасаваць + + + DictInfo @@ -528,6 +667,16 @@ Апісаньне: + + Show all unique dictionary headwords + + + + + Headwords + + + Edit the dictionary via command: %1 @@ -543,6 +692,74 @@ + DictServer + + + Url: + + + + + Databases: + + + + + Search strategies: + + + + + Server databases + + + + + DictServersModel + + + Enabled + + + + + Name + Назва + + + + Address + Адрас + + + + Databases + + + + + Strategies + + + + + Icon + Значак + + + + Comma-delimited list of databases +(empty string or "*" matches all databases) + + + + + Comma-delimited list of search strategies +(empty string mean "prefix" strategy) + + + + DictionaryBar @@ -560,17 +777,22 @@ Рэдаґаваць гэтую ґрупу - + Dictionary info Інфармацыя пра слоўнік - + + Dictionary headwords + + + + Open dictionary folder Адчыніць слоўнікавы каталёґ - + Edit dictionary Рэдаґаваць слоўнік @@ -583,39 +805,39 @@ Слоўнікі - + &Sources &Крыніцы - - + + &Dictionaries &Слоўнікі - - + + &Groups Ґ&рупы - + Sources changed Крыніцы зьмяніліся - + Some sources were changed. Would you like to accept the changes? Колькі крыніц зьмянілася. Ці ўжыць зьмены? - + Accept Ужыць - + Cancel Скасаваць @@ -629,6 +851,92 @@ + FTS::FtsIndexing + + + None + Няма + + + + FTS::FullTextSearchDialog + + + Full-text search + + + + + Whole words + + + + + Plain text + + + + + Wildcards + + + + + RegExp + + + + + Max distance between words (%1-%2): + + + + + Max articles per dictionary (%1-%2): + + + + + + + Articles found: + + + + + Now indexing: + + + + + CJK symbols in search string are not compatible with search modes "Whole words" and "Plain text" + + + + + The search line must contains at least one word containing + + + + + or more symbols + + + + + No dictionaries for full-text search + + + + + FTS::Indexing + + + None + Няма + + + Forvo::ForvoArticleRequest @@ -667,6 +975,65 @@ + FullTextSearchDialog + + + + Search + + + + + Match case + + + + + Mode: + + + + + Articles found: + + + + + Available dictionaries in group: + + + + + Wait for indexing: + + + + + Total: + + + + + Indexed: + + + + + Now indexing: None + + + + + Cancel + Скасаваць + + + + Help + + + + GermanTranslit @@ -797,7 +1164,7 @@ - + Remove all groups Выдаліць усе ґрупы @@ -807,42 +1174,100 @@ Перацягвай слоўнікі ў/з ґрупы. Разьмяркоўвай іх у ґрупе з дапамогаю мышы. - + + Group tabs + + + + + Open groups list + + + + Add group Дадаць ґрупу - + Give a name for the new group: Задай назву новай ґрупы: - + Rename group Пераназваньне ґрупы - + Give a new name for the group: Задай новую назву ґрупы: - + Remove group Выдаленьне ґрупы - + Are you sure you want to remove the group <b>%1</b>? Сапраўды жадаеш выдаліць ґрупу <b>%1</b>? - + Are you sure you want to remove all the groups? Сапраўды жадаеш выдаліць усе ґрупы? + Help::HelpWindow + + + GoldenDict help + + + + + Home + + + + + Back + Назад + + + + Forward + Наперад + + + + Zoom In + Павялічыць + + + + Zoom Out + Паменшыць + + + + Normal Size + Звычайны памер + + + + Content + + + + + Index + + + + HistoryPaneWidget @@ -873,12 +1298,12 @@ Hunspell - + Spelling suggestions: Артаґрафічныя падказкі: - + %1 Morphology Марфалёґія %1 @@ -886,12 +1311,12 @@ HunspellDictsModel - + Enabled Улучана - + Name Назва @@ -1931,7 +2356,7 @@ LoadDictionaries - + Error loading dictionaries Памылка пры ладаваньні слоўнікаў @@ -1939,7 +2364,7 @@ Main - + Error in configuration file. Continue with default settings? Абмылка ў файле канфіґурацыі. Працягнуць з стандартнымі наладамі? @@ -1948,534 +2373,575 @@ MainWindow - + Welcome! Вітаем! - + &File &Файл - + &Edit Зь&мены - + &Help &Дапамога - + &View &Выгляд - + &Zoom &Сумер - + H&istory &Гісторыя - + + Search + + + + &Search Pane Панэль &шуканьня - + &Results Navigation Pane Панэль &навіґацыі ў выніках - + &History Pane Панэль &гісторыі - + &Dictionaries... &Слоўнікі... - + F3 F3 - + &Preferences... &Налады... - + F4 F4 - + &Homepage &Хатняя бачына - + &About &Інфармацыя - + About GoldenDict Інфармацыя пра GoldenDict - + + GoldenDict reference + + + + F1 F1 - - + + &Quit &Выйсьці - + Quit from application Выйсьці з праґрамы - + Ctrl+Q Ctrl+Q - + &Forum &Форум - + &Close To Tray Зьвінуць у &лотак - + Minimizes the window to tray Зьвінуць акно ў лотак - + Ctrl+F4 Ctrl+F4 - + &Save Article &Захаваць артыкул - + Save Article Захаваць артыкул - + F2 F2 - + &Print На&друкаваць - + Ctrl+P Ctrl+P - + Page Set&up Налады &бачыны - + Print Pre&view Перадпр&агляд друку - + &Rescan Files Пера&сканаваць файлы - + Ctrl+F5 Ctrl+F5 - + &Clear &Ачысьціць - + &New Tab &Новая ўкладка - + Ctrl+T Ctrl+T - + &Configuration Folder Тэчка &канфіґурацыі - - + + &Show &Паказаць - + Ctrl+H Ctrl+H - + &Export З&экспартаваць - + &Import З&ымпартаваць - + &Always on Top Заўсёды на &версе - + Always on Top Заўсёды на версе - + Ctrl+O Ctrl+O - - - + + + Menu Button Кнопка мэню - + + Search in page + + + + + Ctrl+F + + + + + Full-text search + + + + + Ctrl+Shift+F + + + + Show Names in Dictionary &Bar Паказваць &назвы ў слоўнікавай паліцы - + Show Small Icons in &Toolbars Паказваць малыя значкі ў паліцы &прыладаў - + &Menubar Паліца &мэню - + &Navigation &Навіґацыя - + Back Назад - + Forward Наперад - + Scan Popup Улучыць працу ў вонкавых праґрамах - + Pronounce Word (Alt+S) Вымавіць слова (Alt+S) - + Zoom In Павялічыць - + Zoom Out Паменшыць - + Normal Size Звычайны памер - - + + Look up in: Шукаць у: - + Found in Dictionaries: Знойдзена ў наступных слоўніках: - + Words Zoom In Павялічыць радок шуканьня - + Words Zoom Out Паменшыць радок шуканьня - + Words Normal Size Звычайны памер радка шуканьня - + Show &Main Window Паказаць &галоўнае акно - + Opened tabs Адчыненыя ўкладкі - + Close current tab Зачыніць дзейную ўкладку - + Close all tabs Зачыніць усе ўкладкі - + Close all tabs except current Зачыніць усе ўкладкі апроч дзейнай - + Loading... Ладаваньне... - + New Tab Новая ўкладка - + %1 dictionaries, %2 articles, %3 words %1 слоўнікаў, %2 артыкулаў, %3 словаў - + Look up: Шукаць: - + All Усе - + Open Tabs List Адчыніць сьпіс укладак - + (untitled) (бяз назвы) - + %1 - %2 %1 - %2 - + Failed to initialize hotkeys monitoring mechanism.<br>Make sure your XServer has RECORD extension turned on. Памылка ініцыялізацыі цікаваньня клявішных скаротаў.<br>Пераканайся, што XServer мае ўлучанае пашырэньне RECORD. - + New Release Available Дастуны новы выпуск - + Version <b>%1</b> of GoldenDict is now available for download.<br>Click <b>Download</b> to get to the download page. GoldenDict вэрсіі <b>%1</b> даступны для заладаваньня.<br>Пстрыкні па <b>Зладаваць</b>, каб перайсьці на бачыну сьцягваньня. - + Download Зладаваць - + Skip This Release Прамінуць гэты выпуск - - + + Accessibility API is not enabled Accessibility API ня ўлучаны - + + String to search in dictionaries. The wildcards '*', '?' and sets of symbols '[...]' are allowed. +To find '*', '?', '[', ']' symbols use '\*', '\?', '\[', '\]' respectively + + + + You have chosen to hide a menubar. Use %1 to show it back. Паліца мэню ёсьць схаваная. Скарыстай %1, каб павараціць назад. - + Ctrl+M Ctrl+M - + Page Setup Налады бачыны - + No printer is available. Please install one first. Няма дасяжных друкарак. Спачатку ўсталюй хоць адну. - + Print Article Надрукаваць артыкул - + Article, Complete (*.html) Артыкул цалком (*.html) - + Article, HTML Only (*.html) Артыкул, толькі HTML (*.html) - + Save Article As Захаваць артыкул як - + Error Памылка - + Can't save article: %1 Няможна захаваць артыкул: %1 - + Saving article... Захоўваньне артыкула... - + The main window is set to be always on top. Галоўнае акно цяпер заўсёды знаходзіцца вышэй іншых. - + &Hide С&хаваць - + Export history to file Экспартаваньне гісторыі ў файл - - + + Text files (*.txt);;All files (*.*) Тэкставыя файлы (*.txt);;Усе файлы (*.*) - + History export complete Экспартаваньне гісторыі кончылася - + Export error: Памылка экспарту: - + Import history from file Імпартаваньне гісторыі з файла - + Import error: invalid data in file Памылка імпартаваньня: хібныя зьвесткі ў файле - + History import complete Імпартаваньне гісторыі кончылася - + Import error: Памылка імпартаваньня: - + Dictionary info Інфармацыя пра слоўнік - + + Dictionary headwords + + + + Open dictionary folder Адчыніць слоўнікавы каталёґ - + Edit dictionary Рэдаґаваць слоўнік @@ -2483,12 +2949,12 @@ Mdx::MdxArticleRequest - + Dictionary file was tampered or corrupted Слоўнікавы файл скажоны ці пашкоджаны - + Failed loading article from %1, reason: %2 Абмылка ладаваньня артыкула з %1, з прычыны: %2 @@ -2496,7 +2962,7 @@ MediaWiki::MediaWikiArticleRequest - + XML parse error: %1 at %2,%3 Памылка разбору файла XML: %1 — радок %2, слупок %3 @@ -2504,7 +2970,7 @@ MediaWiki::MediaWikiWordSearchRequest - + XML parse error: %1 at %2,%3 Памылка разбору файла XML: %1 — радок %2, слупок %3 @@ -2512,22 +2978,22 @@ MediaWikisModel - + Enabled Улучаны - + Name Назва - + Address Адрас - + Icon Значак @@ -2540,88 +3006,94 @@ Хорма - + Dictionary order: Парадак слоўнікаў: - - - - ... - ... + ... - + Inactive (disabled) dictionaries: Неўжываныя (вылучаныя) слоўнікі: - + Dictionary information Інфармацыя пра слоўнік - + Name: Назва: - + Total articles: Усяго артыкулаў: - + Total words: Усяго словаў: - + Translates from: Крынічная мова: - + Translates to: Мэтавая мова: - + Description: Апісаньне: - + Files comprising this dictionary: Файлы, якія складаюць слоўнік: - + Adjust the order by dragging and dropping items in it. Drop dictionaries to the inactive group to disable their use. Упарадкуй слоўнікі, разьмеркаваўшы іх мышшу. Каб не ўжываць слоўніка, перацягні яго ў ґрупу вылучаных слоўнікаў. - + Sort by name Сартаваць паводле назвы - + Sort by languages Сартаваць паводле мовы + + + Dictionary headwords + + + + + Dictionaries active: %1, inactive: %2 + + PathsModel - + Path Шлях - + Recursive Рэкурсіўна @@ -2779,22 +3251,27 @@ Дадатковы стыль: - + + Help language + + + + Adjust this value to avoid huge context menus. Настаў гэтае значэньне, каб унікаць вялікіх мэнюшак. - + Context menu dictionaries limit: Граніца колькасьці слоўнікаў у выпадным мэню: - + &Scan Popup &Карыстаньне звонку - + When enabled, a translation popup window would be shown each time you point your mouse on any word on the screen (Windows) or select any word with mouse (Linux). When enabled, you can switch it on and @@ -2805,134 +3282,134 @@ акна ў галоўным акне ці ў сыстэмным лотку. - + Enable scan popup functionality Улучыць мэханізм выплыўных вокнаў - + Chooses whether the scan popup mode is on by default or not. If checked, the program would always start with the scan popup active. Вызначае ці ўлучаць вонкавыя выплыўныя вокны пры стартаваньні праґрамы. - + Start with scan popup turned on Стартаваць разам з улучанымі выплыўнымі вокнамі - + With this enabled, the popup would only show up if all chosen keys are in the pressed state when the word selection changes. Паказваць выплыўное акно толькі тады, калі карыстальнік зацісьне ўсе пазначаныя клявішы. - + Only show popup when all selected keys are kept pressed: Паказваць выплыўное акно толькі пры наступных заціснутых клявішах: - + Left Ctrl only Толькі левы Ctrl - + Left Ctrl Левы Ctrl - + Right Shift only Толькі правы Shift - + Right Shift Правы Shift - + Alt key Клявіш Alt - + Alt Alt - + Ctrl key Клявіш Ctrl - + Ctrl Ctrl - + Left Alt only Толькі левы Alt - + Left Alt Левы Alt - + Shift key Клявіш Shift - + Shift Shift - + Right Alt only Толькі правы Alt - + Right Alt Правы Alt - + Right Ctrl only Толькі правы Ctrl - + Right Ctrl Правы Ctrl - + Left Shift only Толькі левы Shift - + Left Shift Левы Shift - + Windows key or Meta key Windows-клявіш ці Meta-клявіш - + Win/Meta Win/Meta - + Normally, in order to activate a popup you have to maintain the chosen keys pressed while you select a word. With this enabled, the chosen keys may also @@ -2943,12 +3420,12 @@ і праз пэўны час. - + Keys may also be pressed afterwards, within Клявішы можна націснуць і праз - + To avoid false positives, the keys are only monitored after the selection's done for a limited amount of seconds, which is specified here. @@ -2956,42 +3433,42 @@ абмежаваную колькасьць сэкундаў, якая й задаецца тут. - + secs с - + Send translated word to main window instead of to show it in popup window Слаць перакладанае слова ў галоўнае акно замест выкліканьня выплыўнога - + Send translated word to main window Слаць перакладанае слова ў галоўнае акно - + Hotkeys Клявішныя скароты - + Use the following hotkey to show or hide the main window: Выкарыстоўваць наступны скарот для выкліканьня галоўнага акна: - + Use the following hotkey to translate a word from clipboard: Выкарыстоўваць наступны скарот для перакладу слова з кішэні: - + The hotkeys are global and work from any program and within any context as long as GoldenDict is running in background. Клявішныя скароты ёсьць ґлябальнымі і дзейнічаюць у кожнай праґраме ў кожным кантэксьце, пакуль працуе GoldenDict. - + <!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; } @@ -3004,94 +3481,109 @@ <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" color:#ff0000;">Заўвага: Падобна на тое, што дзейны выпуск X.Org XServer мае непрацаздольнае пашырэньне RECORD. Клявішныя скароты GoldenDict магчыма рабіць ня будуть. Гэта трэба выпраўляць на баку сэрвэру. Падрабязная інфармацыя </span><a href="https://bugs.freedesktop.org/show_bug.cgi?id=20500"><span style=" text-decoration: underline; color:#0000ff;">тут</span></a><span style=" color:#ff0000;">. Пры жаданьні там можна пакінуць свой камэнтар.</span></p></body></html> - + &Audio &Аўдыё - + Pronunciation Вымаўленьне - + Auto-pronounce words in main window Аўтаматычна вымаўляць словы ў галоўным акне - + Auto-pronounce words in scan popup Аўтаматычна вымаўляць словы ў выплыўным акне - + Playback Прайграваньне - + Play audio files via FFmpeg(libav) and libao Прайграваць гукі праз FFmpeg(libav) і libao - + Use internal player Карыстаць убудаваны прайгравальнік - + Use any external program to play audio files Скарыстаць вонкавую праґраму для прайграваньня аўдыё файлаў - + Use external program: Прайграваць праз вонкавую праґраму: - + &Network &Сетка - + Enable if you wish to use a proxy server for all program's network requests. Улучыць, каб выкарыстоўваць проксі сэрвэр для ўсіх сеткавых запытаў праґрамы. - + Use proxy server Скарыстаць проксі-сэрвэр - + + System proxy + + + + + Custom proxy + + + + + Custom settings + + + + Type: Тып: - + Host: Гост: - + Port: Порт: - + User: Карыстальнік: - + Password: Пароль: - + Enabling this would make GoldenDict block most advertisements by disallowing content (images, frames) not originating from the site you are browsing. If some site breaks because of this, try disabling this. @@ -3100,12 +3592,12 @@ Калі нейкія сайты зламаюцца, паспрабуй адлучыць гэтую опцыю. - + Disallow loading content from other sites (hides most advertisements) Абмежаваць заладоўванае зьмесьціва зь іншых сайтаў (хавае большасьць рэклямы) - + Enabling this would allow to listen to sound pronunciations from online dictionaries that rely on Flash or other web plugins. Plugin must be installed for this option to work. @@ -3114,24 +3606,24 @@ Убудовы мусяць быць усталяванымі. - + Enable web plugins Улучыць сеціўныя ўбудовы - + Some sites detect GoldenDict via HTTP headers and block the requests. Enable this option to workaround the problem. Некаторыя сайты пазнаюць GoldenDict праз HTTP-загалоўкі і блякуюць запыты. Улучы опцыю, каб абмінуць праблему. - + Do not identify GoldenDict in HTTP headers Не пазначаць GoldenDict у HTTP-запытах - + When this is enabled, the program periodically checks if a new, updated version of GoldenDict is available for download. If it is so, the program @@ -3143,22 +3635,42 @@ й прапануе наведаць бачыну зладаваньня. - + Check for new program releases periodically Правяраць наяўнасьць новых выпускаў праґрамы - + + Full-text search + + + + + Allow full-text search for: + + + + + Don't search in dictionaries containing more than + + + + + articles (0 - unlimited) + + + + Ad&vanced &Дадаткова - + ScanPopup extra technologies Дадатковыя мэханізмы сканаваньня словаў для выплыўных вокнаў - + Try to use IAccessibleEx technology to retrieve word under cursor. This technology works only with some programs that support it (for example Internet Explorer 9). @@ -3169,12 +3681,12 @@ Ня трэба ўлучаць гэтае опцыі, калі не карыстаешся такімі праґрамамі. - + Use &IAccessibleEx Скарыстаць &IAccessibleEx - + Try to use UI Automation technology to retrieve word under cursor. This technology works only with some programs that support it. It is not needed to select this option if you don't use such programs. @@ -3183,12 +3695,12 @@ Ня трэба ўлучаць гэтае опцыі, калі не карыстаешся такімі праґрамамі. - + Use &UIAutomation Скарыстаць &UIAutomation - + Try to use special GoldenDict message to retrieve word under cursor. This technology works only with some programs that support it. It is not needed to select this option if you don't use such programs. @@ -3197,127 +3709,128 @@ Ня трэба ўлучаць гэтае опцыі, калі не карыстаешся такімі праґрамамі. - + Use &GoldenDict message Скарыстаць запыты &GoldenDict - + History Гісторыя - + Turn this option on to store history of the translated words Улучы гэтую опцыю, каб захоўваць гісторыю перакладаных словаў - + Store &history Захоўваць &гісторыю - + Specify the maximum number of entries to keep in history. Пазначае максымальную колькасьць запісаў у гісторыі. - + Maximum history size: Памер гісторыі: - + History saving interval. If set to 0 history will be saved only during exit. Інтэрвал захаваньня гісторыі. Калі 0, гісторыя будзе захоўвацца толькі перад выхадам. - + Save every Захоўваць праз - + minutes хв - + Articles Артыкулы - + Turn this option on to always expand optional parts of articles Улучы гэтую опцыю, каб заўсёды разгортваць дадатковыя разьдзелы артыкулаў - + Expand optional &parts Разгортваць дадатковыя &разьдзелы - + Select this option to automatic collapse big articles Улучы опцыю, каб аўтаматычна згартаць вялікія артыкулы - + Collapse articles more than Згартаць артыкулы, якія маюць больш за - + Articles longer than this size will be collapsed Артыкулы большыя за гэта значэньне будуць згартацца - + symbols знакаў - + System default Сыстэмная - + + Default Стандартны - + Modern Сучасны - + Lingvo Lingvo - + Babylon Babylon - + Lingoes Lingoes - + Lingoes-Blue Lingoes-Blue - + Changing Language Зьмена мовы - + Restart the program to apply the language change. Перастартуй праґраму, каб ужыць новую мову. @@ -3325,27 +3838,27 @@ ProgramTypeEditor - + Audio Аўдыё - + Plain Text Звычайны тэкст - + Html Html - + Prefix Match Паводле прэфіксу - + Unknown Няведама @@ -3371,27 +3884,27 @@ ProgramsModel - + Enabled Улучана - + Type Тып - + Name Назва - + Command Line Загадны радок - + Icon Значак @@ -3399,12 +3912,14 @@ QObject - + + Article loading error Памылка ладаваньня артыкула - + + Article decoding error Памылка раскадоўваньня артыкула @@ -3515,18 +4030,18 @@ ResourceToSaveHandler - - + + ERROR: %1 АБМЫЛА: %1 - + Resource saving error: Памылка захаваньня рэсурсу: - + The referenced resource failed to download. Ня выйшла зладаваць пазначанага рэсурсу. @@ -3534,12 +4049,12 @@ Romaji - + Hepburn Romaji for Hiragana Сыстэма лацінізацыі Гэпбёрна для Хіраґаны - + Hepburn Romaji for Katakana Сыстэма лацінізацыі Гэпбёрна для Катаканы @@ -3560,59 +4075,59 @@ Дыялёґ - + Back Назад - - - - - + + + + + ... ... - + Forward Наперад - + Pronounce Word (Alt+S) Вымавіць слова (Alt+S) - + Alt+S Alt+S - + Send word to main window (Alt+W) Даслаць слова у галоўнае акно (Alt+W) - + Alt+W Alt+W - + Shows or hides the dictionary bar Паказаць або схаваць слоўнікавую паліцу - + Use this to pin down the window so it would stay on screen, could be resized or managed in other ways. Скарыстай шпільку, каб замацаваць акно на экране, зьмяняць ягоны памер, ды кіраваць ім кожным зручным спосабам. - - + + %1 - %2 %1 - %2 @@ -3620,17 +4135,17 @@ SoundDirsModel - + Path Шлях - + Name Назва - + Icon Значак @@ -3652,7 +4167,8 @@ - + + &Add... &Дадаць... @@ -3661,7 +4177,8 @@ - + + &Remove &Прыбраць @@ -3737,39 +4254,39 @@ Розныя сайты. %GDWORD% заменіцца на запытанае слова: - + Programs Праґрамы - + Forvo Forvo - + Live pronunciations from <a href="http://www.forvo.com/">forvo.com</a>. The site allows people to record and share word pronunciations. You can listen to them from GoldenDict. Жывое вымаўленьне з <a href="http://www.forvo.com/">forvo.com</a>. Гэты сайт дазваляе людзям запісваць і дзяліцца вымаўленьнем словаў. Іх можна праслухаць пры дапамозе GoldenDict. - + Enable pronunciations from Forvo Улучыць вымаўленьне з Forvo - + API Key: Ключ API: - + Use of Forvo currently requires an API key. Leave this field blank to use the default key, which may become unavailable in the future, or register on the site to get your own key. Карыстаньне сайтам Forvo патрабуе ключ API. Пакінь поле пустым, каб карыстацца стандартным ключом, які пазьней можа стаць недаступным, ці зарэґіструйся на сайце і атрымай уласны ключ. - + Get your own key <a href="http://api.forvo.com/key/">here</a>, or leave blank to use the default one. Атрымай свой уласны ключ <a href="http://api.forvo.com/key/">тут</a>, ці пакінь поле пустым для стандартнага значэньня. @@ -3781,79 +4298,89 @@ для Big-5, %GDBIG5HKSCS% для Big5-HKSCS, %GDGBK% для GBK і GB18030, %GDSHIFTJIS% для Shift-JIS. + + DICT servers + + + + DICT servers: + + + + Any external programs. A string %GDWORD% will be replaced with the query word. If such string is not presented, the word will be fed into standard input. Розныя вонкавыя праґрамы. %GDWORD% заменіцца на запытанае слова. Калі такога слова няма, то яго накіруюць у стандартны ўвод. - + Language codes (comma-separated): Моўныя коды (праз коску): - + List of language codes you would like to have. Example: "en, ru". Пералік выбраных моўнык кодаў. Прыкладам: „en, uk, pl“. - + Full list of language codes is available <a href="http://www.forvo.com/languages-codes/">here</a>. Поўны сьпіс даступных моўных кодаў <a href="http://www.forvo.com/languages-codes/">тут</a>. - + Transliteration Трансьлітэрацыя - + Russian transliteration Расейская трансьлітэрацыя - + Greek transliteration Грэцкая трансьлітэрацыя - + German transliteration Нямецкая трансьлітэрацыя - + Belarusian transliteration Беларуская трансьлітэрацыя - + Enables to use the Latin alphabet to write the Japanese language Улучае лацінскі альфабэт для японскае мовы - + Japanese Romaji Японскі рамадзі - + Systems: Сыстэмы: - + The most widely used method of transcription of Japanese, based on English phonology Найбольш ужываны мэтад транскрыпцыі японскае мовы на падставе анґельскае фаналёґіі - + Hepburn Гэпбёрн - + The most regular system, having a one-to-one relation to the kana writing systems. Standardized as ISO 3602 @@ -3864,12 +4391,12 @@ У GoldenDict яшчэ не падтрымліваецца. - + Nihon-shiki Ніхон-сікі - + Based on Nihon-shiki system, but modified for modern standard Japanese. Standardized as ISO 3602 @@ -3880,75 +4407,77 @@ У GoldenDict яшчэ не падтрымліваецца. - + Kunrei-shiki Кунрэй-сікі - + Syllabaries: Складовыя абэцэды: - + Hiragana Japanese syllabary Складовая абэцэда Хіраґана - + Hiragana Хіраґана - + Katakana Japanese syllabary Складовая абэцэда Кітакана - + Katakana Катакана - + Text to Speech Сынтэз мовы - + (not available in portable version) (не даступна ў пераноснай вэрсіі) - - - + + + Choose a directory Выбар каталёґу - - - - - + + + + + + Confirm removal Пацьверджаньне выдаленьня - - + + Remove directory <b>%1</b> from the list? Прыбраць каталёґ <b>%1</b> са сьпісу? - - + + + Remove site <b>%1</b> from the list? Прыбраць сайт <b>%1</b> са сьпісу? - + Remove program <b>%1</b> from the list? Прыбраць праґраму <b>%1</b> са сьпісу? @@ -4078,22 +4607,22 @@ WebSitesModel - + Enabled Улучаны - + Name Назва - + Address Адрас - + Icon Значак @@ -4101,7 +4630,7 @@ WordFinder - + Failed to query some dictionaries. Памылка запыту ў нейкіх слоўніках. diff -Nru goldendict-1.5.0~git20131003/locale/bg_BG.ts goldendict-1.5.0~git20150923/locale/bg_BG.ts --- goldendict-1.5.0~git20131003/locale/bg_BG.ts 2013-08-16 09:45:56.000000000 +0000 +++ goldendict-1.5.0~git20150923/locale/bg_BG.ts 2015-09-23 08:26:24.000000000 +0000 @@ -326,6 +326,25 @@ + Dialog + + Proxy authentication required + + + + You need to supply a Username and a Password to access via proxy + + + + Username: + + + + Password: + Парола: + + + DictGroupWidget Form @@ -404,6 +423,97 @@ + DictHeadwords + + Search mode + + + + This element determines how filter string will be interpreted + + + + If checked on the symbols case will be take in account when filtering + + + + Match case + + + + Exports headwords to file + + + + Export + + + + OK + + + + Press this button to apply filter to headwords list + + + + Apply + + + + If checked any filter changes will we immediately applied to headwords list + + + + Auto apply + + + + Filter: + + + + Filter string (fixed string, wildcards or regular expression) + + + + Text + + + + Wildcards + + + + RegExp + + + + Unique headwords total: %1, filtered: %2 + + + + Save headwords to file + + + + Text files (*.txt);;All files (*.*) + + + + Export headwords... + + + + Cancel + Отхвърляне + + + Help + + + + DictInfo Total articles: @@ -442,6 +552,14 @@ %1 + + Show all unique dictionary headwords + + + + Headwords + + DictListModel @@ -451,6 +569,62 @@ + DictServer + + Url: + + + + Databases: + + + + Search strategies: + + + + Server databases + + + + + DictServersModel + + Enabled + Включено + + + Name + Име + + + Address + Адрес + + + Databases + + + + Icon + + + + Comma-delimited list of databases +(empty string or "*" matches all databases) + + + + Strategies + + + + Comma-delimited list of search strategies +(empty string mean "prefix" strategy) + + + + DictionaryBar Dictionary Bar @@ -480,6 +654,10 @@ Extended menu with all dictionaries... + + Dictionary headwords + + EditDictionaries @@ -524,6 +702,75 @@ + FTS::FtsIndexing + + None + Без + + + + FTS::FullTextSearchDialog + + Full-text search + + + + Whole words + + + + Plain text + + + + Wildcards + + + + RegExp + + + + Max distance between words (%1-%2): + + + + Max articles per dictionary (%1-%2): + + + + Articles found: + + + + Now indexing: + + + + The search line must contains at least one word containing + + + + or more symbols + + + + No dictionaries for full-text search + + + + CJK symbols in search string are not compatible with search modes "Whole words" and "Plain text" + + + + + FTS::Indexing + + None + Без + + + Forvo::ForvoArticleRequest XML parse error: %1 at %2,%3 @@ -555,6 +802,53 @@ + FullTextSearchDialog + + Search + + + + Match case + + + + Mode: + + + + Articles found: + + + + Available dictionaries in group: + + + + Wait for indexing: + + + + Total: + + + + Indexed: + + + + Now indexing: None + + + + Cancel + Отхвърляне + + + Help + + + + GermanTranslit German Transliteration @@ -696,6 +990,53 @@ Auto groups Автоматични групи + + Group tabs + + + + Open groups list + + + + + Help::HelpWindow + + GoldenDict help + + + + Home + + + + Back + Назад + + + Forward + Напред + + + Zoom In + Увеличаване + + + Zoom Out + Намаляване + + + Normal Size + Нормален размер + + + Content + + + + Index + + HistoryPaneWidget @@ -2048,6 +2389,39 @@ Open dictionary folder + + Dictionary headwords + + + + String to search in dictionaries. The wildcards '*', '?' and sets of symbols '[...]' are allowed. +To find '*', '?', '[', ']' symbols use '\*', '\?', '\[', '\]' respectively + + + + Search + + + + Search in page + + + + Ctrl+F + + + + Full-text search + + + + Ctrl+Shift+F + + + + GoldenDict reference + + Mdx::MdxArticleRequest @@ -2105,7 +2479,7 @@ ... - ... + ... Inactive (disabled) dictionaries: @@ -2155,6 +2529,14 @@ Sort by languages + + Dictionary headwords + + + + Dictionaries active: %1, inactive: %2 + + PathsModel @@ -2761,6 +3143,38 @@ Articles longer than this size will be collapsed + + System proxy + + + + Custom proxy + + + + Custom settings + + + + Full-text search + + + + Allow full-text search for: + + + + Don't search in dictionaries containing more than + + + + articles (0 - unlimited) + + + + Help language + + ProgramTypeEditor @@ -3296,6 +3710,14 @@ Any external programs. A string %GDWORD% will be replaced with the query word. If such string is not presented, the word will be fed into standard input. + + DICT servers + + + + DICT servers: + + StylesComboBox diff -Nru goldendict-1.5.0~git20131003/locale/cs_CZ.ts goldendict-1.5.0~git20150923/locale/cs_CZ.ts --- goldendict-1.5.0~git20131003/locale/cs_CZ.ts 2013-10-02 20:42:04.000000000 +0000 +++ goldendict-1.5.0~git20150923/locale/cs_CZ.ts 2015-09-23 08:26:24.000000000 +0000 @@ -342,6 +342,25 @@ + Dialog + + Proxy authentication required + + + + You need to supply a Username and a Password to access via proxy + + + + Username: + + + + Password: + Heslo: + + + DictGroupWidget Form @@ -420,6 +439,97 @@ + DictHeadwords + + Search mode + + + + This element determines how filter string will be interpreted + + + + If checked on the symbols case will be take in account when filtering + + + + Match case + + + + Exports headwords to file + + + + Export + + + + OK + + + + Press this button to apply filter to headwords list + + + + Apply + + + + If checked any filter changes will we immediately applied to headwords list + + + + Auto apply + + + + Filter: + + + + Filter string (fixed string, wildcards or regular expression) + + + + Text + + + + Wildcards + + + + RegExp + + + + Unique headwords total: %1, filtered: %2 + + + + Save headwords to file + + + + Text files (*.txt);;All files (*.*) + Textové soubory (*.txt);;Všechny soubory (*.*) + + + Export headwords... + + + + Cancel + Zrušit + + + Help + + + + DictInfo Total articles: @@ -459,6 +569,14 @@ Upravit slovník příkazem: %1 + + Show all unique dictionary headwords + + + + Headwords + + DictListModel @@ -468,6 +586,62 @@ + DictServer + + Url: + + + + Databases: + + + + Search strategies: + + + + Server databases + + + + + DictServersModel + + Enabled + Povoleno + + + Name + + + + Address + Adresa + + + Databases + + + + Icon + Ikona + + + Comma-delimited list of databases +(empty string or "*" matches all databases) + + + + Strategies + + + + Comma-delimited list of search strategies +(empty string mean "prefix" strategy) + + + + DictionaryBar Dictionary Bar @@ -497,6 +671,10 @@ Extended menu with all dictionaries... Rozšířit nabídku se všemi slovníky... + + Dictionary headwords + + EditDictionaries @@ -541,6 +719,75 @@ + FTS::FtsIndexing + + None + Žádná + + + + FTS::FullTextSearchDialog + + Full-text search + + + + Whole words + + + + Plain text + + + + Wildcards + + + + RegExp + + + + Max distance between words (%1-%2): + + + + Max articles per dictionary (%1-%2): + + + + Articles found: + + + + Now indexing: + + + + The search line must contains at least one word containing + + + + or more symbols + + + + No dictionaries for full-text search + + + + CJK symbols in search string are not compatible with search modes "Whole words" and "Plain text" + + + + + FTS::Indexing + + None + Žádná + + + Forvo::ForvoArticleRequest XML parse error: %1 at %2,%3 @@ -572,6 +819,53 @@ + FullTextSearchDialog + + Search + + + + Match case + + + + Mode: + + + + Articles found: + + + + Available dictionaries in group: + + + + Wait for indexing: + + + + Total: + + + + Indexed: + + + + Now indexing: None + + + + Cancel + Zrušit + + + Help + + + + GermanTranslit German Transliteration @@ -717,6 +1011,53 @@ Auto groups Automatické skupiny + + Group tabs + + + + Open groups list + + + + + Help::HelpWindow + + GoldenDict help + + + + Home + + + + Back + Zpět + + + Forward + Vpřed + + + Zoom In + Přiblížit + + + Zoom Out + Oddálit + + + Normal Size + Normální velikost + + + Content + + + + Index + + HistoryPaneWidget @@ -2825,6 +3166,39 @@ Open dictionary folder Otevřít složku slovníků + + Dictionary headwords + + + + String to search in dictionaries. The wildcards '*', '?' and sets of symbols '[...]' are allowed. +To find '*', '?', '[', ']' symbols use '\*', '\?', '\[', '\]' respectively + + + + Search + + + + Search in page + + + + Ctrl+F + + + + Full-text search + + + + Ctrl+Shift+F + + + + GoldenDict reference + + Mdx::MdxArticleRequest @@ -2882,7 +3256,7 @@ ... - ... + ... Inactive (disabled) dictionaries: @@ -2933,6 +3307,14 @@ Sort by languages Seřadit podle jazyků + + Dictionary headwords + + + + Dictionaries active: %1, inactive: %2 + + PathsModel @@ -3577,6 +3959,38 @@ Articles longer than this size will be collapsed Články delší než tato velikost budou sbaleny + + System proxy + + + + Custom proxy + + + + Custom settings + + + + Full-text search + + + + Allow full-text search for: + + + + Don't search in dictionaries containing more than + + + + articles (0 - unlimited) + + + + Help language + + ProgramTypeEditor @@ -4140,6 +4554,14 @@ Any external programs. A string %GDWORD% will be replaced with the query word. If such string is not presented, the word will be fed into standard input. Všechny externí programy. Řetězec %GDWORD% bude nahrazen hledaným slovem. Pokud takový řetězec nebude předán, slovo bude posláno na standardní vstup. + + DICT servers + + + + DICT servers: + + StylesComboBox diff -Nru goldendict-1.5.0~git20131003/locale/de_DE.ts goldendict-1.5.0~git20150923/locale/de_DE.ts --- goldendict-1.5.0~git20131003/locale/de_DE.ts 2013-10-02 20:42:04.000000000 +0000 +++ goldendict-1.5.0~git20150923/locale/de_DE.ts 2015-09-23 08:26:24.000000000 +0000 @@ -34,7 +34,7 @@ [Unbekannt] - + Based on Qt %1 (%2, %3 bit) Basiert auf Qt %1 (%2, %3 bit) @@ -42,32 +42,32 @@ ArticleMaker - + Expand article Artikel aufklappen - + Collapse article Artikel einklappen - + No translation for <b>%1</b> was found in group <b>%2</b>. In <b>%2</b> wurde kein Eintrag für <b>%1</b> gefunden. - + No translation was found in group <b>%1</b>. Kein Eintrag in Gruppe <b>%1</b> gefunden. - + Welcome! Willkommen! - + <h3 align="center">Welcome to <b>GoldenDict</b>!</h3><p>To start working with the program, first visit <b>Edit|Dictionaries</b> to add some directory paths where to search for the dictionary files, set up various Wikipedia sites or other sources, adjust dictionary order or create dictionary groups.<p>And then you're ready to look up your words! You can do that in this window by using a pane to the left, or you can <a href="Working with popup">look up words from other active applications</a>. <p>To customize program, check out the available preferences at <b>Edit|Preferences</b>. All settings there have tooltips, be sure to read them if you are in doubt about anything.<p>Should you need further help, have any questions, suggestions or just wonder what the others think, you are welcome at the program's <a href="http://goldendict.org/forum/">forum</a>.<p>Check program's <a href="http://goldendict.org/">website</a> for the updates. <p>(c) 2008-2013 Konstantin Isakov. Licensed under GPLv3 or later. <h3 align="center">Willkommen bei <b>GoldenDict</b>!</h3><p>Damit Sie mit dem Programm beginnen können, besuchen Sie zunächst <b>Bearbeiten » Wörterbücher</b>, um Pfade zu gespeicherten Wörterbüchern hinzuzufügen, Wikipedia oder andere Seiten einzurichten, oder um die Wörterbücher zu ordnen bzw. um Sie in Gruppen zu unterteilen.</p> <p>Dann sind Sie bereit, um das erste Wort nachzuschlagen! Dies können Sie im Fenster auf der linken Seite, oder <a href="Mit Popups arbeiten">mittels der Popup-Funktion in anderen Applikationen.</a></p> @@ -75,32 +75,32 @@ <p>Sollten Sie trotzdem noch Hilfe brauchen, oder wenn Sie sonstige Fragen und Verbesserungsvorschlage haben, oder wenn Sie nur wissen wollen, was andere denken, dann finden Sie uns im <a href="hhttp://goldendict.org/forum/">Forum</a>. <p>Programmupdates sind auf der <a href="http://goldendict.org/">Website</a> zu finden.<p>(c) 2008-2013 Konstantin Isakov. Lizensiert unter der GPLv3 oder neuer. - + Working with popup Mit Popups arbeiten - + <h3 align="center">Working with the popup</h3>To look up words from other active applications, you would need to first activate the <i>"Scan popup functionality"</i> in <b>Preferences</b>, and then enable it at any time either by triggering the 'Popup' icon above, or by clicking the tray icon down below with your right mouse button and choosing so in the menu you've popped. <h3 align="center">Mit Popups arbeiten</h3>Um Wörter von anderen aktiven Applikationen nachzuschlagen, muss zunächst die <i>"Scan Popup Funktionalität"</i> in den <b>Einstellungen</b> aktiviert, und dann freigeschalten werden. Dies kann zu jeder Zeit über das 'Popup'-Symbol in der Werkzeugleiste, oder mittels Kontextmenü des Icons in der Symbolleiste geschehen. - + Then just stop the cursor over the word you want to look up in another application, and a window would pop up which would describe it to you. Dann einfach mit der Mauszeiger über das Wort in der Applikation fahren, welches nachgeschlagen werden soll, und ein Fenster wird sichtbar wo es erklärt wird. - + Then just select any word you want to look up in another application by your mouse (double-click it or swipe it with mouse with the button pressed), and a window would pop up which would describe the word to you. Dann einfach ein Wort mit der Maus (Doppelklicken oder bei gedrückten Tasten darüberfahren) markieren, welches nachgeschlagen werden soll. Dann öffnet sich ein Popup, welches das Wort beschreibt. - + (untitled) (unbenannt) - + (picture) (Bild) @@ -108,37 +108,37 @@ ArticleRequest - + Expand article Artikel aufklappen - + From Von - + Collapse article Artikel einklappen - + Query error: %1 Abfragefehler: %1 - + Close words: Ähnliche Wörter: - + Compound expressions: Zusammengesetzte Treffer: - + Individual words: Einzelne Wörter: @@ -146,47 +146,47 @@ ArticleView - + Select Current Article Aktuellen Artikel auswählen - + Copy as text Als Text kopieren - + Inspect Betrachten - + Resource Ressource - + Audio Audio - + TTS Voice TTS Stimme - + Picture Bild - + Definition from dictionary "%1": %2 Definition vom Wörterbuch "%1": %2 - + Definition: %1 Definition: %1 @@ -195,99 +195,100 @@ GoldenDict - - + + The referenced resource doesn't exist. Die angegebene Ressource existiert nicht. - + The referenced audio program doesn't exist. Die angegebene Audioprogramm existiert nicht. - + + ERROR: %1 FEHLER: %1 - + Save sound Klang speichern - + Sound files (*.wav *.ogg *.mp3 *.mp4 *.aac *.flac *.mid *.wv *.ape);;All files (*.*) Audiodateien (*.wav *.ogg *.mp3 *.mp4 *.aac *.flac *.mid *.wv *.ape);;Alle Dateien (*.*) - + Save image Bild speichern - + Image files (*.bmp *.jpg *.png *.tif);;All files (*.*) Bilder (*.bmp *.jpg *.png *.tif);;Alle Dateien (*.*) - + &Open Link &Link öffnen - + Video Video - + Video: %1 Video: %1 - + Open Link in New &Tab Link in neuem Rei&ter öffnen - + Open Link in &External Browser Link in &externen Browser öffnen - + &Look up "%1" &Schlage "%1" nach - + Look up "%1" in &New Tab Schlage "%1" in &neuem Reiter nach - + Send "%1" to input line Sende "%1" an die Eingabezeile - - + + &Add "%1" to history Füge "%1" zum Verlauf &hinzu - + Look up "%1" in %2 Schlage "%1" in %2 nach - + Look up "%1" in %2 in &New Tab Schlage "%1" in %2 in &neuem Reiter nach - + WARNING: FFmpeg Audio Player: %1 WARNUNG: FFmpeg Audio Player: %1 @@ -300,37 +301,37 @@ Um das Abspielen von Dateien anders als WAV zu akivieren, müssen Sie in Bearbeiten » Einstellungen, im Reiter Audio die Option "Mit DirectShow abspielen" auswählen. - + Failed to run a player to play sound file: %1 Konnte folgende Audiodatei nicht mit dem Player abspielen: %1 - + Failed to create temporary file. Konnte keine temporäre Datei anlegen. - + Failed to auto-open resource file, try opening manually: %1. Konnte die Ressource nicht automatisch öffnen; versuchen Sie es manuell: %1. - + The referenced resource failed to download. Die angegebene Ressource konnte nicht heruntergeladen werden. - + Save &image... Bild &speichern... - + Save s&ound... &Klang speichern... - + WARNING: %1 WARNUNG: %1 @@ -340,42 +341,44 @@ Formular - + about:blank about:blank - + x x - + Find: Suche: - + + &Previous &Vorheriger - + + &Next &Nächster - + Ctrl+G Strg+G - + &Case Sensitive &Groß und Kleinschreibung beachten - + Highlight &all &Alles hervorheben @@ -400,6 +403,29 @@ + Dialog + + + Proxy authentication required + + + + + You need to supply a Username and a Password to access via proxy + + + + + Username: + + + + + Password: + Passwort: + + + DictGroupWidget @@ -500,6 +526,119 @@ + DictHeadwords + + + Search mode + + + + + This element determines how filter string will be interpreted + + + + + If checked on the symbols case will be take in account when filtering + + + + + Match case + + + + + Exports headwords to file + + + + + Export + + + + + Help + + + + + OK + + + + + Press this button to apply filter to headwords list + + + + + Apply + + + + + If checked any filter changes will we immediately applied to headwords list + + + + + Auto apply + + + + + Filter: + + + + + Filter string (fixed string, wildcards or regular expression) + + + + + Text + + + + + Wildcards + + + + + RegExp + + + + + Unique headwords total: %1, filtered: %2 + + + + + Save headwords to file + + + + + Text files (*.txt);;All files (*.*) + Textdateien(*.txt);;All Dateien(*.*) + + + + Export headwords... + + + + + Cancel + Abbrechen + + + DictInfo @@ -542,6 +681,16 @@ Beschreibung: + + Show all unique dictionary headwords + + + + + Headwords + + + Edit the dictionary via command: %1 @@ -558,6 +707,74 @@ + DictServer + + + Url: + + + + + Databases: + + + + + Search strategies: + + + + + Server databases + + + + + DictServersModel + + + Enabled + + + + + Name + Name + + + + Address + Adresse + + + + Databases + + + + + Strategies + + + + + Icon + Icon + + + + Comma-delimited list of databases +(empty string or "*" matches all databases) + + + + + Comma-delimited list of search strategies +(empty string mean "prefix" strategy) + + + + DictionaryBar Dictionary Bar @@ -579,17 +796,22 @@ Diese Gruppe bearbeiten - + Dictionary info Wörterbuchinfo - + + Dictionary headwords + + + + Open dictionary folder Wörterbuch-Ordner öffnen - + Edit dictionary Wörterbuch bearbeiten @@ -597,39 +819,39 @@ EditDictionaries - + &Sources &Quellen - - + + &Dictionaries &Wörterbücher - - + + &Groups &Gruppen - + Sources changed Quellen geändert - + Some sources were changed. Would you like to accept the changes? Einige Quellen haben sich geändert. Möchten Sie die Änderungen akzeptieren? - + Accept Übernehmen - + Cancel Abbrechen @@ -648,6 +870,92 @@ + FTS::FtsIndexing + + + None + + + + + FTS::FullTextSearchDialog + + + Full-text search + + + + + Whole words + + + + + Plain text + + + + + Wildcards + + + + + RegExp + + + + + Max distance between words (%1-%2): + + + + + Max articles per dictionary (%1-%2): + + + + + + + Articles found: + + + + + Now indexing: + + + + + CJK symbols in search string are not compatible with search modes "Whole words" and "Plain text" + + + + + The search line must contains at least one word containing + + + + + or more symbols + + + + + No dictionaries for full-text search + + + + + FTS::Indexing + + + None + + + + Forvo::ForvoArticleRequest @@ -686,6 +994,65 @@ + FullTextSearchDialog + + + + Search + + + + + Match case + + + + + Mode: + + + + + Articles found: + + + + + Available dictionaries in group: + + + + + Wait for indexing: + + + + + Total: + + + + + Indexed: + + + + + Now indexing: None + + + + + Cancel + Abbrechen + + + + Help + + + + GermanTranslit @@ -725,43 +1092,53 @@ Groups - + + Group tabs + + + + + Open groups list + + + + Add group Gruppe hinzufügen - + Give a name for the new group: Geben Sie den Namen der neuen Gruppe ein: - + Rename group Gruppe umbenennen - + Give a new name for the group: Geben Sie den neuen Namen der Gruppe ein: - + Remove group Gruppe entfernen - + Are you sure you want to remove the group <b>%1</b>? Möchten Sie wirklich die Gruppe <b>%1</b> entfernen? - + Remove all groups Alle Gruppen entfernen - + Are you sure you want to remove all the groups? Wollen Sie wirklich alle Gruppen entfernen? @@ -862,6 +1239,54 @@ + Help::HelpWindow + + + GoldenDict help + + + + + Home + + + + + Back + Zurück + + + + Forward + + + + + Zoom In + Vergrößern + + + + Zoom Out + Verkleinern + + + + Normal Size + Normale Größe + + + + Content + + + + + Index + + + + HistoryPaneWidget @@ -892,12 +1317,12 @@ Hunspell - + Spelling suggestions: Rechtschreibvorschläge: - + %1 Morphology %1 Morphologie @@ -905,12 +1330,12 @@ HunspellDictsModel - + Enabled Aktiv - + Name Name @@ -1950,7 +2375,7 @@ LoadDictionaries - + Error loading dictionaries Fehler beim Laden der Wörterbücher @@ -1958,7 +2383,7 @@ Main - + Error in configuration file. Continue with default settings? Fehler in der Konfigurationsdatei. Mit Standardeinstellungen fortfahren? @@ -1970,18 +2395,18 @@ Zeige Namen in Wörterbuchleiste - + &Menubar &Menüleiste - - + + Look up in: Suche in: - + Found in Dictionaries: In Wörterbüchern gefunden: @@ -1990,226 +2415,237 @@ Navigation - + Back Zurück - + Forward Vorwärts - + Scan Popup Scan Popup - + Pronounce Word (Alt+S) Wort aussprechen (Alt+S) - + Zoom In Vergrößern - + Zoom Out Verkleinern - + Normal Size Normale Größe - + Words Zoom In Suchwörter vergrößern - + Words Zoom Out Suchwörter verkleinern - + Words Normal Size Suchwörter in normaler Größe - + Show &Main Window Im &Hauptfenster zeigen - + Close current tab Aktuellen Reiter schließen - + Close all tabs Alle Reiter schließen - + Close all tabs except current Alle anderen Reiter schließen - - + + Accessibility API is not enabled Barrierefreiheit-API ist nicht aktiviert - + Article, Complete (*.html) Artikel, komplett (*.html) - + Article, HTML Only (*.html) Artikel, nur HTML (*.html) - + Saving article... Artikel wird gespeichert... - + The main window is set to be always on top. Das Hauptfenster ist eingestellt als immer im Vordergrund. - + &Hide &Verbergen - + Export history to file Verlauf in eine Datei exportieren - - + + Text files (*.txt);;All files (*.*) Textdateien(*.txt);;All Dateien(*.*) - + History export complete Export des Verlaufes abgeschlossen - + Export error: Exportfehler: - + Import history from file Verlauf von Datei importieren - + Import error: invalid data in file Importfehler: ungültige Daten in Datei - + History import complete Import des Verlaufes abgeschlossen - + Import error: Importfehler: - + Dictionary info Wörterbuchinfo - + + Dictionary headwords + + + + Open dictionary folder Wörterbuch-Ordner öffnen - + Edit dictionary Wörterbuch bearbeiten - - + + &Quit B&eenden - + Loading... Lade... - + Welcome! Willkommen! - + %1 dictionaries, %2 articles, %3 words %1 Wörterbücher, %2 Artikel, %3 Wörter - + Look up: Nachschlagen: - + All Alle - + Opened tabs Offene Reiter - + Show Names in Dictionary &Bar Namen in &Wörterbuchleiste anzeigen - + Show Small Icons in &Toolbars Kleine Icons in der &Toolbar anzeigen - + &Navigation &Navigation - + + String to search in dictionaries. The wildcards '*', '?' and sets of symbols '[...]' are allowed. +To find '*', '?', '[', ']' symbols use '\*', '\?', '\[', '\]' respectively + + + + Open Tabs List Liste der Reiter öffnen - + (untitled) (unbenannt) - + %1 - %2 %1 - %2 @@ -2222,57 +2658,57 @@ GoldenDict - + Failed to initialize hotkeys monitoring mechanism.<br>Make sure your XServer has RECORD extension turned on. Der Mechanismus für die Tastenkürzel konnte nicht initialisiert werden.<br>Vergewissern Sie sich, dass der XServer die RECORD Erweiterung aktiviert hat. - + New Release Available Neue Version verfügbar - + Version <b>%1</b> of GoldenDict is now available for download.<br>Click <b>Download</b> to get to the download page. Version <b>%1</b> von GoldenDict ist nun zum Herunterladen verfügbar.<br>Klicken Sie auf <b>Herunterladen</b>, um zur Seite fürs Herunterladen zu gelangen. - + Download Herunterladen - + Skip This Release Diese Version überspringen - + You have chosen to hide a menubar. Use %1 to show it back. Es wurde eingestellt die Menüleiste zu verstecken. Mit %1 kann sie wieder angezeigt werden. - + Ctrl+M Strg+M - + Page Setup Seite einrichten - + No printer is available. Please install one first. Es ist kein Drucker vorhanden. Bitte zuerst einen installieren. - + Print Article Drucke Artikel - + Save Article As Artikel speichern als @@ -2281,42 +2717,42 @@ Html Dateien (*.html *.htm) - + Error Fehler - + Can't save article: %1 Kann Artikel nicht speichern: %1 - + &File &Datei - + &Edit &Bearbeiten - + &Help &Hilfe - + &View &Ansicht - + &Zoom &Zoom - + H&istory &Verlauf @@ -2325,12 +2761,12 @@ Suchformular - + &Dictionaries... &Wörterbücher... - + F3 F3 @@ -2339,148 +2775,178 @@ &Gruppen... - + + Search + + + + &Search Pane &Suchformular - + &Results Navigation Pane &Ergebnisliste - + &History Pane &Verlaufsformular - + &Preferences... &Einstellungen... - + F4 F4 - + &Homepage &Webseite - + &About &Über - + About GoldenDict Über GoldenDict - + + GoldenDict reference + + + + F1 F1 - + Quit from application Applikation beenden - + Ctrl+Q Strg+Q - + &Forum &Forum - + &Close To Tray In die &Symbolleiste schließen - + Minimizes the window to tray In the Symbolleiste minimieren - + Ctrl+F4 Strg+F4 - + &Save Article Artikel &speichern - + Save Article Artikel speichern - + F2 F2 - + &Print &Drucken - + Ctrl+P Strg+P - + Page Set&up &Seite einrichten - + Print Pre&view Druck&vorschau - + &Rescan Files Dateien neu ein&lesen - + &New Tab Neuer Rei&ter - + &Always on Top &Immer im Vordergrund - + Always on Top Immer im Vordergrund - + Ctrl+O Strg+O - - - + + + Menu Button Menüschaltfläche + + Search in page + + + + + Ctrl+F + + + + + Full-text search + + + + + Ctrl+Shift+F + + + Print Preview Druckvorschau @@ -2489,48 +2955,48 @@ Dateien neu einlesen - + Ctrl+F5 Strg+F5 - + &Clear &Zurücksetzen - + New Tab Neuer Reiter - + Ctrl+T Strg+T - + &Configuration Folder &Konfigurationsordner - - + + &Show &Anzeigen - + Ctrl+H Strg+H - + &Export &Exportieren - + &Import &Importieren @@ -2538,12 +3004,12 @@ Mdx::MdxArticleRequest - + Dictionary file was tampered or corrupted Die Wörterbuchdatei war manipuliert oder korrupt - + Failed loading article from %1, reason: %2 Konnte den Artikel von %1 nicht laden, Grund: %2 @@ -2551,7 +3017,7 @@ MediaWiki::MediaWikiArticleRequest - + XML parse error: %1 at %2,%3 Fehler beim XML-parsen: %1 bei %2,%3 @@ -2559,7 +3025,7 @@ MediaWiki::MediaWikiWordSearchRequest - + XML parse error: %1 at %2,%3 Fehler beim XML-parsen: %1 bei %2,%3 @@ -2567,22 +3033,22 @@ MediaWikisModel - + Enabled Aktiv - + Name Name - + Address Adresse - + Icon Icon @@ -2595,88 +3061,94 @@ Formular - + Dictionary order: Reihenfolge der Wörterbücher: - - - - ... - ... + ... - + Inactive (disabled) dictionaries: Inaktive (deaktivierte) Wörterbücher: - + Dictionary information Informationen über das Wörterbuch - + Name: Name: - + Total articles: Artikel insgesamt: - + Total words: Wörter insgesamt: - + Translates from: Übersetzt von: - + Translates to: Übersetzt nach: - + Description: Beschreibung: - + Files comprising this dictionary: Wörterbuch zusammengesetzt aus diesen Dateien: - + Adjust the order by dragging and dropping items in it. Drop dictionaries to the inactive group to disable their use. Verändern Sie die Reihenfolge mit Drag und Drop. Lassen sie ein Wörterbuch mittels Drag und Drop in der inaktiven Gruppe fallen, um es zu deaktivieren. - + Sort by name Sortieren nach Name - + Sort by languages Sortieren nach Sprachen + + + Dictionary headwords + + + + + Dictionaries active: %1, inactive: %2 + + PathsModel - + Path Pfad - + Recursive Rekursiv @@ -2684,37 +3156,38 @@ Preferences - + System default Systemvorgabe - + + Default Standard - + Modern Modern - + Lingvo Lingvo - + Babylon Babylon - + Lingoes Lingoes - + Lingoes-Blue Lingoes-Blau @@ -2723,12 +3196,12 @@ Mit DirectShow abspielen - + Changing Language Sprache ändern - + Restart the program to apply the language change. Starten Sie das Programm neu, um den Sprachwechsel abzuschließen. @@ -2829,12 +3302,12 @@ Darstellung: - + &Scan Popup &Scan Popup - + When enabled, a translation popup window would be shown each time you point your mouse on any word on the screen (Windows) or select any word with mouse (Linux). When enabled, you can switch it on and @@ -2845,7 +3318,7 @@ und in der Symbolleiste an- und abgeschaltet werden. - + Enable scan popup functionality Aktiviert die Scan Popup Funktionalität @@ -2902,140 +3375,145 @@ Add-on style: - + + Help language + + + + Adjust this value to avoid huge context menus. Mit der Anpassung dieses Wertes können rießige Kontextmenüs vermieden werden. - + Context menu dictionaries limit: Wörterbuchlimit im Kontextmenü: - + Chooses whether the scan popup mode is on by default or not. If checked, the program would always start with the scan popup active. Gibt an, ob der Scan Popup Modus standardmäßig aktiviert ist oder nicht. Falls aktiviert, wird das Programm immer mit aktiviertem Modus gestartet. - + Start with scan popup turned on Mit aktiviertem Scan Popup starten - + With this enabled, the popup would only show up if all chosen keys are in the pressed state when the word selection changes. Fallt aktiviert, wird das Scan Popup bei Änderung der Wortauswahl nur angezeigt, wenn alle ausgewählten Tasten gedrückt sind. - + Only show popup when all selected keys are kept pressed: Nur Popup anzeigen, wenn alle ausgewählten Tasten gedrückt werden: - + Left Ctrl only Nur Strg links - + Left Ctrl Strg links - + Right Shift only Nur Umschalttaste rechts - + Right Shift Umschalttaste rechts - + Alt key Alt-Taste - + Alt Alt - + Ctrl key Strg-Taste - + Ctrl Strg - + Left Alt only Nur Alt links - + Left Alt Alt links - + Shift key Umschalttaste - + Shift Umschalttaste - + Right Alt only Nur Alt rechts - + Right Alt Alt rechts - + Right Ctrl only Nur Strg rechts - + Right Ctrl Strg rechts - + Left Shift only Nur Umschalttaste links - + Left Shift Umschalttaste links - + Windows key or Meta key Windows/Meta-Taste - + Win/Meta Win/Meta - + Normally, in order to activate a popup you have to maintain the chosen keys pressed while you select a word. With this enabled, the chosen keys may also @@ -3046,37 +3524,72 @@ Tasten auch kurz nach der Markierung gedrückt werden. - + Send translated word to main window instead of to show it in popup window Übersetzte Wörter ans Hauptfenster senden, anstatt sie im Popup-Fenster anzuzeigen - + Send translated word to main window Übersetzte Wörter ans Hauptfenster senden - + Playback Abspielen - + + System proxy + + + + + Custom proxy + + + + + Custom settings + + + + + Full-text search + + + + + Allow full-text search for: + + + + + Don't search in dictionaries containing more than + + + + + articles (0 - unlimited) + + + + Select this option to automatic collapse big articles Wählen Sie diese Option, falls Sie automatisch große Artikel einklappen möchten - + Collapse articles more than Artikel einklappen mit mehr als - + Articles longer than this size will be collapsed Artikel länger als diese Größe werden eingeklappt - + symbols Symbolen @@ -3101,27 +3614,27 @@ Mit Phonon abspielen - + Use any external program to play audio files Ein externes Program zum Abspielen der Audiodaten benutzen - + Use external program: Externes Programm benutzen: - + Ad&vanced &Erweitert - + ScanPopup extra technologies ScanPopup-Extra-Technologie - + Try to use IAccessibleEx technology to retrieve word under cursor. This technology works only with some programs that support it (for example Internet Explorer 9). @@ -3132,12 +3645,12 @@ Sollte solche Programme nicht verwendet werden, wird diese Option nicht gebraucht. - + Use &IAccessibleEx &IAccessibleEx verwenden - + Try to use UI Automation technology to retrieve word under cursor. This technology works only with some programs that support it. It is not needed to select this option if you don't use such programs. @@ -3146,12 +3659,12 @@ Sollte solche Programme nicht verwendet werden, wird diese Option nicht gebraucht. - + Use &UIAutomation &UIAutomation verwenden - + Try to use special GoldenDict message to retrieve word under cursor. This technology works only with some programs that support it. It is not needed to select this option if you don't use such programs. @@ -3160,72 +3673,72 @@ Sollte solche Programme nicht verwendet werden, wird diese Option nicht gebraucht. - + Use &GoldenDict message &GoldenDict Mitteilung verwenden - + History Verlauf - + Turn this option on to store history of the translated words Aktivieren Sie diese Option, um den Verlauf der übersetzten Wörter zu speichern. - + Store &history &Verlauf speichern - + Specify the maximum number of entries to keep in history. Geben Sie die maximale Anzahl von Einträgen im Verlauf an. - + Maximum history size: Maximale Verlaufgröße: - + History saving interval. If set to 0 history will be saved only during exit. Intervall zum speichern des Verlaufs. Falls 0, wird der Verlauf beim Programmende gespeichert. - + Save every Speichern alle - + minutes Minuten - + Articles Artikel - + Turn this option on to always expand optional parts of articles Aktivieren Sie diese Option, um optionale Abschnitte von Artikeln immer zu erweitern. - + Expand optional &parts Optionale &Abschnitte erweitern - + Keys may also be pressed afterwards, within Die Tasten können auch im nachhinein innerhalb von - + To avoid false positives, the keys are only monitored after the selection's done for a limited amount of seconds, which is specified here. @@ -3234,32 +3747,32 @@ Sekunden überwacht, wie hier angegeben. - + secs Sekunde(n) gedrückt werden - + Hotkeys Tastenkürzel - + Use the following hotkey to show or hide the main window: Das folgende Tastenkürzel benutzen, um das Hauptfenster zu zeigen oder zu verbergen: - + Use the following hotkey to translate a word from clipboard: Das folgende Tastenkürzel benutzen, um ein Wort von der Zwischenablage zu übersetzen: - + The hotkeys are global and work from any program and within any context as long as GoldenDict is running in background. Die Tastenkürzel sind global und funktionieren in jedem Programm und Kontext, sofern GoldenDict im Hintergrund läuft. - + <!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; } @@ -3272,78 +3785,78 @@ <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" color:#ff0000;">Achtung: Es scheicht, dass sie eine X.Org-XServer-Version benutzen, welche die RECORD-Erweiterung nicht richtig funktioniert. Deshalb werden Tastenkürzel höchstwahrscheinlich nicht funktionieren. Dies muss am Server selbst korrigiert werden. Dies bezieht sich auf folgenden </span><a href="https://bugs.freedesktop.org/show_bug.cgi?id=20500"><span style=" text-decoration: underline; color:#0000ff;">Fehlereintrag</span></a><span style=" color:#ff0000;">, welchen Sie, falls gewünscht, kommentieren können.</span></p></body></html> - + &Audio &Audio - + Pronunciation Aussprache - + Auto-pronounce words in main window Wörter im Hauptfenster automatisch aussprechen - + Auto-pronounce words in scan popup Wörter im Scan Popup automatisch aussprechen - + Play audio files via FFmpeg(libav) and libao Audiodateien mit FFmpeg(libav) und libao abspielen - + Use internal player Internen Abspieler verwenden - + &Network &Netzwerk - + Enable if you wish to use a proxy server for all program's network requests. Aktivieren, falls ein Proxy-Server für alle Netzverbindungen des Programms verwendet werden soll. - + Use proxy server Proxyserver verwenden - + Type: Typ: - + Host: Host: - + Port: Port: - + User: Benutzer: - + Password: Passwort: - + Enabling this would make GoldenDict block most advertisements by disallowing content (images, frames) not originating from the site you are browsing. If some site breaks because of this, try disabling this. @@ -3352,12 +3865,12 @@ nicht mehr funktionieren, kann das Deaktivieren dieser Option helfen. - + Disallow loading content from other sites (hides most advertisements) Inhalte nicht von fremden Seiten laden (unterbindet meist Werbung) - + Enabling this would allow to listen to sound pronunciations from online dictionaries that rely on Flash or other web plugins. Plugin must be installed for this option to work. @@ -3366,24 +3879,24 @@ Ein Plugin muss für diese Option installiert sein. - + Enable web plugins Webplugins aktivieren - + Some sites detect GoldenDict via HTTP headers and block the requests. Enable this option to workaround the problem. Einige Seiten erkennen GoldenDict mittels HTTP-Kopfzeilen und blockieren die Anfrage. Diese Option kann dieses Problem beheben. - + Do not identify GoldenDict in HTTP headers GoldenDict nicht in HTTP-Kopfzeilen identifizieren - + When this is enabled, the program periodically checks if a new, updated version of GoldenDict is available for download. If it is so, the program @@ -3395,7 +3908,7 @@ Download-Seite. - + Check for new program releases periodically Periodisch auf neue Programmversionen prüfen @@ -3403,27 +3916,27 @@ ProgramTypeEditor - + Audio Audio - + Plain Text Klartext - + Html Html - + Prefix Match Präfixtreffer - + Unknown Unbekannt @@ -3449,27 +3962,27 @@ ProgramsModel - + Enabled Aktiviert - + Type Typ - + Name Name - + Command Line Kommandozeile - + Icon Icon @@ -3477,12 +3990,14 @@ QObject - + + Article loading error Fehler beim Laden des Artikels - + + Article decoding error Fehler beim Dekodieren des Artikels @@ -3593,18 +4108,18 @@ ResourceToSaveHandler - - + + ERROR: %1 FEHLER: %1 - + Resource saving error: Fehler beim speichern der Ressource: - + The referenced resource failed to download. Die Ressource konnte nicht heruntergeladen werden. @@ -3612,12 +4127,12 @@ Romaji - + Hepburn Romaji for Hiragana Hepburn Romaji für Hiragana - + Hepburn Romaji for Katakana Hepburn Romaji für Katakana @@ -3646,21 +4161,21 @@ Treffer anzeigen (Alt+M) - - - - - + + + + + ... ... - + Back Zurück - + Forward Weiter @@ -3669,32 +4184,32 @@ Alt+M - + Pronounce Word (Alt+S) Wort aussprechen (Alt+S) - + Alt+S Alt+S - + Send word to main window (Alt+W) Wort an das Hauptfenster senden (Alt+W) - + Alt+W Alt+W - + Shows or hides the dictionary bar Zeigt oder versteckt die Wörterbuchleiste - + Use this to pin down the window so it would stay on screen, could be resized or managed in other ways. Hiermit kann das Fenster fixiert werden, damit es am Bildschirm bleibt, @@ -3705,8 +4220,8 @@ GoldenDict - - + + %1 - %2 %1 - %2 @@ -3714,17 +4229,17 @@ SoundDirsModel - + Path Pfad - + Name Name - + Icon Icon @@ -3732,45 +4247,47 @@ Sources - + Text to Speech Sprachausgabe - + (not available in portable version) (nicht in der portablen Version) - - - + + + Choose a directory Verzeichnis auswählen - - - - - + + + + + + Confirm removal Löschung bestätigen - - + + Remove directory <b>%1</b> from the list? Soll das Verzeichnis <b>%1</b> von der Liste entfernt werden? - - + + + Remove site <b>%1</b> from the list? Soll die Seite <b>%1</b> von der Liste entfernt werden? - + Remove program <b>%1</b> from the list? Soll das Programm <b>%1</b> von der Liste entfernt werden? @@ -3789,7 +4306,8 @@ - + + &Add... &Hinzufügen... @@ -3798,7 +4316,8 @@ - + + &Remove &Entfernen @@ -3878,32 +4397,32 @@ Alternativ kann %GD1251% für CP1251 und %GDISO1% für ISO 8859-1 benutzt werden. - + Programs Programme - + Forvo Forvo - + Live pronunciations from <a href="http://www.forvo.com/">forvo.com</a>. The site allows people to record and share word pronunciations. You can listen to them from GoldenDict. Aussprachen live von <a href="http://www.forvo.com/">forvo.com</a>. Diese Seite erlaubt es Menschen Aussprachen von Wörter aufzunehmen und zu teilen. Diese können in GoldenDict angehört werden. - + Enable pronunciations from Forvo Aussprachen von Forvo aktivieren - + API Key: API Schlüssel: - + Use of Forvo currently requires an API key. Leave this field blank to use the default key, which may become unavailable in the future, or register on the site to get your own key. @@ -3912,7 +4431,7 @@ wird. Sie können sich auch auf der Seite registrieren, um ihren eigenen Schlüssel zu erhalten. - + Get your own key <a href="http://api.forvo.com/key/">here</a>, or leave blank to use the default one. Holen Sie sich <a href="http://api.forvo.com/key/">hier</a> den eigenen Schlüssel, oder lassen Sie das Feld leer um den Standardschlüssel zu verwenden. @@ -3942,79 +4461,89 @@ %GDBIG5% für Big-5, %GDBIG5HKSCS% für Big5-HKSCS, %GDGBK% für GBK und GB18030, %GDSHIFTJIS% für Shift-JIS. + + DICT servers + + + + DICT servers: + + + + Any external programs. A string %GDWORD% will be replaced with the query word. If such string is not presented, the word will be fed into standard input. Irgendwelche externe Programme. Der String %GDWORD% wird mit dem Suchwort ersetzt. Falls eine solche Zeichenkette nicht vorhanden ist, wird das Wort an die Standardeingabe geschickt. - + Language codes (comma-separated): Sprachkodes (mit Beistrich getrennt): - + List of language codes you would like to have. Example: "en, ru". Die Liste der Sprachkodes, welche Sie benutzen möchten. Zum Beispiel "de, en". - + Full list of language codes is available <a href="http://www.forvo.com/languages-codes/">here</a>. Die vollständige Liste der Sprachkodes ist <a href="http://www.forvo.com/languages-codes/">hier</a>. - + Transliteration Transliteration - + Russian transliteration Russische Transliteration - + Greek transliteration Griechische Transliteration - + German transliteration Deutsche Transliteration - + Belarusian transliteration Weißrussische Transliteration - + Enables to use the Latin alphabet to write the Japanese language Aktiviert das Verwenden des Lateinischen Alphabetes zum Schreiben der Japanischen Sprache - + Japanese Romaji Japanisch Rōmaji - + Systems: Systeme: - + The most widely used method of transcription of Japanese, based on English phonology Die weitverbreiteste Methode zur Transkription vom Japanischen, basierend auf der Englischen Aussprache - + Hepburn Hepburn - + The most regular system, having a one-to-one relation to the kana writing systems. Standardized as ISO 3602 @@ -4025,12 +4554,12 @@ Noch nicht in GoldenDict implementiert. - + Nihon-shiki Nippon - + Based on Nihon-shiki system, but modified for modern standard Japanese. Standardized as ISO 3602 @@ -4041,32 +4570,32 @@ Noch nicht in GoldenDict implementiert. - + Kunrei-shiki Kunrei-shiki - + Syllabaries: Silbenschriften: - + Hiragana Japanese syllabary Japanische Hiragana Silbenschrift - + Hiragana Hiragana - + Katakana Japanese syllabary Japanische Katakana Silbenschrift - + Katakana Katakana @@ -4196,22 +4725,22 @@ WebSitesModel - + Enabled Aktiv - + Name Name - + Address Adresse - + Icon Icon @@ -4219,7 +4748,7 @@ WordFinder - + Failed to query some dictionaries. Einige Wörterbücher konnten nicht befragt werden. diff -Nru goldendict-1.5.0~git20131003/locale/el_GR.ts goldendict-1.5.0~git20150923/locale/el_GR.ts --- goldendict-1.5.0~git20131003/locale/el_GR.ts 2013-10-02 20:42:04.000000000 +0000 +++ goldendict-1.5.0~git20150923/locale/el_GR.ts 2015-09-23 08:26:24.000000000 +0000 @@ -45,70 +45,70 @@ [Άγνωστο] - + Based on Qt %1 (%2, %3 bit) - + Βασίζεται στην Qt %1 (%2, %3 bit) ArticleMaker - + Expand article - + Εμφάνιση άρθρου - + Collapse article - + Απόκρυψη άρθρου - + No translation for <b>%1</b> was found in group <b>%2</b>. Δε βρέθηκε μετάφραση του <b>%1</b> στην ομάδα <b>%2</b>. - + No translation was found in group <b>%1</b>. Δε βρέθηκαν μεταφράσεις στην ομάδα <b>%1</b>. - + Welcome! Καλώς ήλθατε! - + <h3 align="center">Welcome to <b>GoldenDict</b>!</h3><p>To start working with the program, first visit <b>Edit|Dictionaries</b> to add some directory paths where to search for the dictionary files, set up various Wikipedia sites or other sources, adjust dictionary order or create dictionary groups.<p>And then you're ready to look up your words! You can do that in this window by using a pane to the left, or you can <a href="Working with popup">look up words from other active applications</a>. <p>To customize program, check out the available preferences at <b>Edit|Preferences</b>. All settings there have tooltips, be sure to read them if you are in doubt about anything.<p>Should you need further help, have any questions, suggestions or just wonder what the others think, you are welcome at the program's <a href="http://goldendict.org/forum/">forum</a>.<p>Check program's <a href="http://goldendict.org/">website</a> for the updates. <p>(c) 2008-2013 Konstantin Isakov. Licensed under GPLv3 or later. <h3 align="center">Καλώς ήλθατε στο <b>GoldenDict</b>!</h3><p>Για να ξεκινήσετε, επιλέξτε <b>Επεξεργασία|Λεξικά</b>. Από εδώ μπορείτε να προσθέσετε φακέλους που περιέχουν λεξικά, να ενεργοποιήσετε την αναζήτηση στη Βικιπαίδεια ή άλλες πηγές, να αλλάξετε τη σειρά των λεξικών ή να δημιουργήσετε ομάδες λεξικών.<p>Μετά θα είστε έτοιμοι να ξεκινήσετε την αναζήτηση! Μπορείτε να αναζητάτε λέξεις από την αριστερή στήλη αυτού του παραθύρου, ή από <a href="Χρήση αναδυόμενου παραθύρου">οποιαδήποτε άλλη ανοιχτή εφαρμογή</a>.<p>Για να προσαρμόσετε το πρόγραμμα στις απαιτήσεις σας, δείτε τις διαθέσιμες ρυθμίσεις στο μενού <b>Επεξεργασία|Προτιμήσεις</b>. Όλες οι προτιμήσεις διαθέτουν χρήσιμες συμβουλές οθόνης, που μπορείτε να διαβάσετε τοποθετώντας το ποντίκι σας πάνω στην αντίστοιχη προτίμηση.<p>Για περαιτέρω βοήθεια, ερωτήματα, υποδείξεις, ή απλά για να διαβάσετε τις γνώμες άλλων χρηστών, μπορείτε να εγγραφείτε στο <a href="http://goldendict.org/forum/">φόρουμ</a> του προγράμματος. <p>Ενημερώσεις μπορείτε να βρείτε στον <a href="http://goldendict.org/">ιστότοπο</a> του προγράμματος.<p>(c) 2008-2013 Konstantin Isakov. Διανέμεται υπό τους όρους της GNU GPLv3 ή νεότερης έκδοσής της. - + Working with popup Χρήση αναδυόμενου παραθύρου - + <h3 align="center">Working with the popup</h3>To look up words from other active applications, you would need to first activate the <i>"Scan popup functionality"</i> in <b>Preferences</b>, and then enable it at any time either by triggering the 'Popup' icon above, or by clicking the tray icon down below with your right mouse button and choosing so in the menu you've popped. <h3 align="center">Χρήση αναδυόμενου παραθύρου</h3> Για να μπορείτε να αναζητάτε λέξεις που συναντήσατε σε άλλες ενεργές εφαρμογές, πρέπει πρώτα να ενεργοποιήσετε τη <i>"Λειτουργία αναδυόμενου παραθύρου"</i> από τις <b>Προτιμήσεις</b>. Μετά, θα μπορείτε να την ενεργοποιείτε όποτε θέλετε, είτε πατώντας το εικονίδιο "Αναδυόμενο παράθυρο" της εργαλειοθήκης, είτε κάνοντας δεξί κλικ στο εικονίδιο της περιοχής ειδοποιήσεων και επιλέγοντας την από το μενού. - + Then just stop the cursor over the word you want to look up in another application, and a window would pop up which would describe it to you. Στη συνέχεια, θα μπορείτε να τοποθετείτε το δρομέα πάνω στις λέξεις που σας ενδιαφέρουν για να εμφανίζετε ένα παράθυρο με την επεξήγησή τους. - + Then just select any word you want to look up in another application by your mouse (double-click it or swipe it with mouse with the button pressed), and a window would pop up which would describe the word to you. Στη συνέχεια, απλά επιλέξτε με το ποντίκι μια λέξη σε άλλη εφαρμογή (π.χ. με δεξί κλικ πάνω στη λέξη), και θα εμφανιστεί ένα παράθυρο με την επεξήγησή της. - + (untitled) (ανώνυμο) - + (picture) (εικόνα) @@ -116,37 +116,37 @@ ArticleRequest - + Expand article - + Εμφάνιση άρθρου - + From Από - + Collapse article - + Απόκρυψη άρθρου - + Query error: %1 Σφάλμα αναζήτησης: %1 - + Close words: Παρόμοια λήμματα: - + Compound expressions: Σύνθετες εκφράσεις: - + Individual words: Μεμονωμένες λέξεις: @@ -154,57 +154,57 @@ ArticleView - + Select Current Article Επιλογή τρέχοντος άρθρου - + Copy as text - + Αντιγραφή ως κείμενο - + Inspect - + Επιθεωρητής - + Resource Πόρος - + Audio Ήχος - + TTS Voice - + Φωνή TTS - + Picture Εικόνα - + Video - + Βίντεο - + Video: %1 - + Βίντεο: %1 - + Definition from dictionary "%1": %2 Ορισμός στο λεξικό "%1": %2 - + Definition: %1 Ορισμός: %1 @@ -213,38 +213,39 @@ GoldenDict - - + + The referenced resource doesn't exist. Δεν υπάρχει ο ζητούμενος πόρος. - + The referenced audio program doesn't exist. Δεν υπάρχει το ζητούμενο πρόγραμμα ήχου. - + + ERROR: %1 ΣΦΑΛΜΑ: %1 - + Save sound Αποθήκευση ήχου - + Sound files (*.wav *.ogg *.mp3 *.mp4 *.aac *.flac *.mid *.wv *.ape);;All files (*.*) Αρχείο ήχου (*.wav *.ogg *.mp3 *.mp4 *.aac *.flac *.mid *.wv *.ape);;Όλα τα αρχεία (*.*) - + Save image Αποθήκευση εικόνας - + Image files (*.bmp *.jpg *.png *.tif);;All files (*.*) Αρχείο εικόνας (*.bmp *.jpg *.png *.tif);;Όλα τα αρχεία (*.*) @@ -253,55 +254,55 @@ Σφάλμα αποθήκευσης: - + &Open Link Άνοι&γμα συνδέσμου - + Open Link in New &Tab Άνοιγμα συνδέσμου σε νέα &καρτέλα - + Open Link in &External Browser Άνοιγμα συνδέσμου σε &εξωτερικό περιηγητή - + &Look up "%1" Ανα&ζήτηση του "%1" - + Look up "%1" in &New Tab Αναζήτηση του "%1" σε &νέα καρτέλα - + Send "%1" to input line Αποστολή του "%1" στη γραμμή εισόδου - - + + &Add "%1" to history &Προσθήκη του "%1" στο ιστορικό - + Look up "%1" in %2 Αναζήτηση του "%1" στο %2 - + Look up "%1" in %2 in &New Tab Αναζήτηση του "%1" στο %2 σε &νέα καρτέλα - + WARNING: FFmpeg Audio Player: %1 - + ΠΡΟΣΟΧΗ: Αναπαραγωγή ήχου FFmpeg: %1 Playing a non-WAV file @@ -320,37 +321,37 @@ Η βιβλιοθήκη Bass δεν μπορεί να αναπαράγει αυτόν τον ήχο. - + Failed to run a player to play sound file: %1 Δεν ήταν δυνατή η αναπαραγωγή του αρχείου ήχου: %1 - + Failed to create temporary file. Απέτυχε η δημιουργία προσωρινού αρχείου. - + Failed to auto-open resource file, try opening manually: %1. Απέτυχε το αυτόματο άνοιγμα του αρχείου· δοκιμάστε να το ανοίξετε χειροκίνητα: %1. - + The referenced resource failed to download. Απέτυχε η λήψη του ζητούμενου πόρου. - + Save &image... Αποθήκευση &Εικόνας... - + Save s&ound... Αποθήκευση ή&χου... - + WARNING: %1 ΠΡΟΣΟΧΗ: %1 @@ -360,42 +361,44 @@ Μορφή - + about:blank about:blank - + x x - + Find: Εύρεση: - + + &Previous &Προηγούμενο - + + &Next &Επόμενο - + Ctrl+G Ctrl+G - + &Case Sensitive &Διάκριση πεζών/κεφαλαίων - + Highlight &all Επι&σήμανση Όλων @@ -423,6 +426,29 @@ + Dialog + + + Proxy authentication required + + + + + You need to supply a Username and a Password to access via proxy + + + + + Username: + + + + + Password: + Κωδικός: + + + DictGroupWidget @@ -523,6 +549,119 @@ + DictHeadwords + + + Search mode + + + + + This element determines how filter string will be interpreted + + + + + If checked on the symbols case will be take in account when filtering + + + + + Match case + + + + + Exports headwords to file + + + + + Export + + + + + Help + + + + + OK + + + + + Press this button to apply filter to headwords list + + + + + Apply + + + + + If checked any filter changes will we immediately applied to headwords list + + + + + Auto apply + + + + + Filter: + + + + + Filter string (fixed string, wildcards or regular expression) + + + + + Text + + + + + Wildcards + + + + + RegExp + + + + + Unique headwords total: %1, filtered: %2 + + + + + Save headwords to file + + + + + Text files (*.txt);;All files (*.*) + Αρχεία κειμένου (*.txt);;Όλα τα αρχεία (*.*) + + + + Export headwords... + + + + + Cancel + Ακύρωση + + + DictInfo @@ -547,12 +686,12 @@ Open folder - + Άνοιγμα φακέλου Edit dictionary - Επεξεργασία λεξικού + Επεξεργασία λεξικού @@ -565,10 +704,20 @@ Περιγραφή: + + Show all unique dictionary headwords + + + + + Headwords + + + Edit the dictionary via command: %1 - + Επεξεργασία του λεξικού με χρήση της εντολής: %1 @@ -580,6 +729,74 @@ + DictServer + + + Url: + + + + + Databases: + + + + + Search strategies: + + + + + Server databases + + + + + DictServersModel + + + Enabled + + + + + Name + Όνομα + + + + Address + Διεύθυνση + + + + Databases + + + + + Strategies + + + + + Icon + Εικονίδιο + + + + Comma-delimited list of databases +(empty string or "*" matches all databases) + + + + + Comma-delimited list of search strategies +(empty string mean "prefix" strategy) + + + + DictionaryBar Dictionary Bar @@ -593,7 +810,7 @@ Extended menu with all dictionaries... - + Πλήρες μενού με όλα τα λεξικά... @@ -601,17 +818,22 @@ Επεξεργασία αυτής της ομάδας - + Dictionary info Πληροφορίες λεξικού - - Open dictionary folder + + Dictionary headwords - + + Open dictionary folder + Άνοιγμα φακέλου λεξικού + + + Edit dictionary Επεξεργασία λεξικού @@ -619,39 +841,39 @@ EditDictionaries - + &Sources &Πηγές - - + + &Dictionaries &Λεξικά - - + + &Groups &Ομάδες - + Sources changed Οι πηγές άλλαξαν - + Some sources were changed. Would you like to accept the changes? Ορισμένες πηγές άλλαξαν. Αποδέχεστε τις αλλαγές; - + Accept Αποδοχή - + Cancel Ακύρωση @@ -670,6 +892,92 @@ + FTS::FtsIndexing + + + None + Κανένα + + + + FTS::FullTextSearchDialog + + + Full-text search + + + + + Whole words + + + + + Plain text + + + + + Wildcards + + + + + RegExp + + + + + Max distance between words (%1-%2): + + + + + Max articles per dictionary (%1-%2): + + + + + + + Articles found: + + + + + Now indexing: + + + + + CJK symbols in search string are not compatible with search modes "Whole words" and "Plain text" + + + + + The search line must contains at least one word containing + + + + + or more symbols + + + + + No dictionaries for full-text search + + + + + FTS::Indexing + + + None + Κανένα + + + Forvo::ForvoArticleRequest @@ -708,6 +1016,65 @@ + FullTextSearchDialog + + + + Search + + + + + Match case + + + + + Mode: + + + + + Articles found: + + + + + Available dictionaries in group: + + + + + Wait for indexing: + + + + + Total: + + + + + Indexed: + + + + + Now indexing: None + + + + + Cancel + Ακύρωση + + + + Help + + + + GermanTranslit @@ -747,43 +1114,53 @@ Groups - + + Group tabs + + + + + Open groups list + + + + Add group Προσθήκη ομάδας - + Give a name for the new group: Εισάγετε το όνομα της νέας ομάδας: - + Rename group Μετονομασία ομάδας - + Give a new name for the group: Εισάγετε το νέο όνομα της ομάδας: - + Remove group Αφαίρεση ομάδας - + Are you sure you want to remove the group <b>%1</b>? Σίγουρα θέλετε να αφαιρέσετε την ομάδα <b>%1</b>; - + Remove all groups Αφαίρεση όλων των ομάδων - + Are you sure you want to remove all the groups? Σίγουρα θέλετε να αφαιρέσετε όλες τις ομάδες; @@ -884,6 +1261,54 @@ + Help::HelpWindow + + + GoldenDict help + + + + + Home + + + + + Back + Πίσω + + + + Forward + Μπροστά + + + + Zoom In + Μεγέθυνση + + + + Zoom Out + Σμίκρυνση + + + + Normal Size + Κανονικό μέγεθος + + + + Content + + + + + Index + + + + HistoryPaneWidget @@ -914,12 +1339,12 @@ Hunspell - + Spelling suggestions: Προτάσεις ορθογραφίας: - + %1 Morphology Μορφολογία για %1 @@ -927,12 +1352,12 @@ HunspellDictsModel - + Enabled Ενεργή - + Name Όνομα @@ -1891,7 +2316,7 @@ Lojban - + Lojban @@ -1972,7 +2397,7 @@ LoadDictionaries - + Error loading dictionaries Σφάλμα κατά τη φόρτωση των λεξικών @@ -1980,9 +2405,9 @@ Main - + Error in configuration file. Continue with default settings? - + Σφάλμα στο αρχείο ρυθμίσεων. Συνέχεια με χρήση των προεπιλεγμένων ρυθμίσεων; @@ -1992,18 +2417,18 @@ Εμφάνιση ονομάτων στη γραμμή λεξικών - + &Menubar Γραμμή &μενού - - + + Look up in: Αναζήτηση σε: - + Found in Dictionaries: Λεξικά: @@ -2012,226 +2437,237 @@ Πλοήγηση - + Back Πίσω - + Forward Μπροστά - + Scan Popup Αναδυόμενο παράθυρο - + Pronounce Word (Alt+S) Εκφώνηση λήμματος (Alt+S) - + Zoom In Μεγέθυνση - + Zoom Out Σμίκρυνση - + Normal Size Κανονικό μέγεθος - + Words Zoom In Μεγέθυνση λημμάτων - + Words Zoom Out Σμίκρυνση λημμάτων - + Words Normal Size Κανονικό μέγεθος λημμάτων - + Show &Main Window Εμφάνιση &κύριου παραθύρου - + Close current tab Κλείσιμο τρέχουσας καρτέλας - + Close all tabs Κλείσιμο όλων των καρτελών - + Close all tabs except current Κλείσιμο όλων των άλλων καρτελών - - + + Accessibility API is not enabled - + Δεν είναι ενεργοποιημένο το API προσβασιμότητας - + Article, Complete (*.html) - + Άρθρο, πλήρες (*.html) - + Article, HTML Only (*.html) - + Άρθρο, μόνο HTML (*.html) - + Saving article... - + Αποθήκευση άρθρου... - + The main window is set to be always on top. Το κύριο παράθυρο βρίσκεται πάντα στο προσκήνιο. - + &Hide &Απόκρυψη - + Export history to file Εξαγωγή ιστορικού σε αρχείο - - + + Text files (*.txt);;All files (*.*) Αρχεία κειμένου (*.txt);;Όλα τα αρχεία (*.*) - + History export complete Ολοκληρώθηκε η εξαγωγή του ιστορικού - + Export error: Σφάλμα εξαγωγής: - + Import history from file Εισαγωγή ιστορικού από αρχείο - + Import error: invalid data in file Σφάλμα εισαγωγής: μη έγκυρα δεδομένα - + History import complete Ολοκληρώθηκε η εισαγωγή του ιστορικού - + Import error: Σφάλμα εισαγωγής: - + Dictionary info Πληροφορίες λεξικού - - Open dictionary folder + + Dictionary headwords - + + Open dictionary folder + Άνοιγμα φακέλου λεξικού + + + Edit dictionary Επεξεργασία λεξικού - - + + &Quit Έ&ξοδος - + Loading... Φόρτωση... - + Welcome! Καλώς ήλθατε! - + %1 dictionaries, %2 articles, %3 words %1 λεξικά, %2 άρθρα, %3 λήμματα - + Look up: Αναζήτηση: - + All Όλα - + Opened tabs Ανοιχτές καρτέλες - + Show Names in Dictionary &Bar Εμφάνιση &ονομάτων λεξικών - + Show Small Icons in &Toolbars Μι&κρά εικονίδια - + &Navigation Γραμμή &αναζήτησης - + + String to search in dictionaries. The wildcards '*', '?' and sets of symbols '[...]' are allowed. +To find '*', '?', '[', ']' symbols use '\*', '\?', '\[', '\]' respectively + + + + Open Tabs List Λίστα ανοιχτών καρτελών - + (untitled) (ανώνυμο) - + %1 - %2 %1 - %2 @@ -2244,57 +2680,57 @@ GoldenDict - + Failed to initialize hotkeys monitoring mechanism.<br>Make sure your XServer has RECORD extension turned on. Απέτυχε η φόρτωση του μηχανισμού παρακολούθησης πλήκτρων συντομεύσεων.<br>Βεβαιωθείτε ότι η επέκταση RECORD του XServer είναι ενεργοποιημένη. - + New Release Available Νέα έκδοση διαθέσιμη - + Version <b>%1</b> of GoldenDict is now available for download.<br>Click <b>Download</b> to get to the download page. Η έκδοση <b>%1</b> του GoldenDict είναι διαθέσιμη.<br>Κάντε κλικ στο <b>Λήψη</b> για να επισκεφτείτε την ιστοσελίδα λήψης. - + Download Λήψη - + Skip This Release Παράβλεψη αυτής της έκδοσης - + You have chosen to hide a menubar. Use %1 to show it back. Επιλέξατε απόκρυψη μιας γραμμής εργαλείων. Πατήστε %1 για να την επαναφέρετε. - + Ctrl+M Ctrl+M - + Page Setup Διάταξη σελίδας - + No printer is available. Please install one first. Δε βρέθηκε εκτυπωτής. Παρακαλώ εγκαταστήστε έναν εκτυπωτή. - + Print Article Εκτύπωση αποτελέσματος - + Save Article As Αποθήκευση αποτελέσματος ως @@ -2303,42 +2739,42 @@ Αρχείο html (*.html *.htm) - + Error Σφάλμα - + Can't save article: %1 Αδύνατη η αποθήκευση του άρθρου: %1 - + &File &Αρχείο - + &Edit &Επεξεργασία - + &Help &Βοήθεια - + &View &Προβολή - + &Zoom Με&γέθυνση - + H&istory &Ιστορικό @@ -2347,12 +2783,12 @@ Στήλη αναζήτησης - + &Dictionaries... &Λεξικά... - + F3 F3 @@ -2361,148 +2797,178 @@ &Ομάδες... - + + Search + + + + &Search Pane Στήλη ανα&ζήτησης - + &Results Navigation Pane Στήλη περιήγησης αποτελε&σμάτων - + &History Pane Στήλη &ιστορικού - + &Preferences... &Προτιμήσεις... - + F4 F4 - + &Homepage &Ιστοσελίδα - + &About &Περί - + About GoldenDict Περί GoldenDict - + + GoldenDict reference + + + + F1 F1 - + Quit from application Έξοδος εφαρμογής - + Ctrl+Q Ctrl+Q - + &Forum &Φόρουμ - + &Close To Tray &Ελαχιστοποίηση στην περιοχή ειδοποιήσεων - + Minimizes the window to tray Ελαχιστοποιεί το παράθυρο ως εικονίδιο στην περιοχή ειδοποιήσεων - + Ctrl+F4 Ctrl+F4 - + &Save Article &Αποθήκευση άρθρου - + Save Article Αποθήκευση άρθρου - + F2 F2 - + &Print Εκ&τύπωση - + Ctrl+P Ctrl+P - + Page Set&up &Διάταξη σελίδας - + Print Pre&view &Προεπισκόπηση εκτύπωσης - + &Rescan Files Νέα &σάρωση αρχείων - + &New Tab &Νέα καρτέλα - + &Always on Top Πάντα στο &προσκήνιο - + Always on Top Πάντα στο προσκήνιο - + Ctrl+O Ctrl+O - - - + + + Menu Button Κουμπί μενού + + Search in page + + + + + Ctrl+F + + + + + Full-text search + + + + + Ctrl+Shift+F + + + Print Preview Προεπισκόπηση εκτύπωσης @@ -2511,48 +2977,48 @@ Νέα σάρωση αρχείων - + Ctrl+F5 Ctrl+F5 - + &Clear Εκκα&θάριση - + New Tab Νέα καρτέλα - + Ctrl+T Ctrl+T - + &Configuration Folder Φάκελος &ρυθμίσεων - - + + &Show Εμ&φάνιση - + Ctrl+H Ctrl+H - + &Export Ε&ξαγωγή - + &Import &Εισαγωγή @@ -2560,20 +3026,20 @@ Mdx::MdxArticleRequest - + Dictionary file was tampered or corrupted - + Το αρχείο λεξικού είναι αλλοιωμένο ή κατεστραμμένο - + Failed loading article from %1, reason: %2 - + Απέτυχε η φόρτωση του άρθρου από το %1. Αιτία: %2 MediaWiki::MediaWikiArticleRequest - + XML parse error: %1 at %2,%3 Σφάλμα ανάλυσης XML: %1 στο %2,%3 @@ -2581,7 +3047,7 @@ MediaWiki::MediaWikiWordSearchRequest - + XML parse error: %1 at %2,%3 Σφάλμα ανάλυσης XML: %1 στο %2,%3 @@ -2589,22 +3055,22 @@ MediaWikisModel - + Enabled Ενεργή - + Name Όνομα - + Address Διεύθυνση - + Icon Εικονίδιο @@ -2617,88 +3083,94 @@ Μορφή - + Dictionary order: Λίστα λεξικών: - - - - ... - ... + ... - + Inactive (disabled) dictionaries: Ανενεργά (απενεργοποιημένα) λεξικά: - + Dictionary information Πληροφορίες λεξικού - + Name: Όνομα: - + Total articles: Σύνολο άρθρων: - + Total words: Σύνολο λημμάτων: - + Translates from: Μεταφράζει από: - + Translates to: Μεταφράζει σε: - + Description: Περιγραφή: - + Files comprising this dictionary: Αρχεία λεξικού: - + Adjust the order by dragging and dropping items in it. Drop dictionaries to the inactive group to disable their use. Μπορείτε να αλλάξετε τη σειρά εμφάνισης των λεξικών, σέρνοντάς τα με το ποντίκι. Σύρετε λεξικά στην ομάδα των ανενεργών για να τα απενεργοποιήσετε. - + Sort by name Ταξινόμηση κατά όνομα - + Sort by languages Ταξινόμηση κατά γλώσσα + + + Dictionary headwords + + + + + Dictionaries active: %1, inactive: %2 + + PathsModel - + Path Διαδρομή - + Recursive Υποφάκελοι @@ -2706,7 +3178,7 @@ Preferences - + System default Συστήματος @@ -2719,46 +3191,47 @@ Ρωσικά - + + Default Κλασική - + Modern - + Μοντέρνα - + Lingvo Lingvo - + Babylon Babylon - + Lingoes - + Lingoes - + Lingoes-Blue - + Lingoes-Blue Play via DirectShow Αναπαραγωγή μέσω DirectShow - + Changing Language Αλλαγή γλώσσας - + Restart the program to apply the language change. Απαιτείται επανεκκίνηση του προγράμματος για να εφαρμοστεί η αλλαγή γλώσσας. @@ -2880,12 +3353,12 @@ Μορφή εμφάνισης: - + &Scan Popup Ανα&δυόμενο παράθυρο - + When enabled, a translation popup window would be shown each time you point your mouse on any word on the screen (Windows) or select any word with mouse (Linux). When enabled, you can switch it on and @@ -2897,7 +3370,7 @@ παράθυρο ή από το εικονίδιο της περιοχής ειδοποιήσεων. - + Enable scan popup functionality Ενεργοποίηση λειτουργίας αναδυόμενου παραθύρου @@ -2946,17 +3419,22 @@ Στιλ πρόσθετων: - - Adjust this value to avoid huge context menus. + + Help language - + + Adjust this value to avoid huge context menus. + Προσαρμόστε αυτήν την τιμή για να μειώσετε το μέγεθος του μενού περιεχομένου. + + + Context menu dictionaries limit: - + Αριθμός λεξικών μενού περιεχομένου: - + Chooses whether the scan popup mode is on by default or not. If checked, the program would always start with the scan popup active. Καθορίζει αν θα είναι προεπιλεγμένη η λειτουργία αναδυόμενου παραθύρου. @@ -2964,124 +3442,124 @@ παράθυρο ενεργοποιημένο. - + Start with scan popup turned on Εκκίνηση με το αναδυόμενο παράθυρο ενεργοποιημένο - + With this enabled, the popup would only show up if all chosen keys are in the pressed state when the word selection changes. Αν ενεργοποιηθεί, το αναδυόμενο παράθυρο θα εμφανίζεται μόνο αν είναι πατημένα όλα τα παρακάτω πλήκτρα όταν γίνεται η επιλογή της λέξης. - + Only show popup when all selected keys are kept pressed: Αναδυόμενο παράθυρο μόνο αν είναι πατημένα όλα τα επιλεγμένα πλήκτρα: - + Left Ctrl only Μόνο το αριστερό Ctrl - + Left Ctrl Aριστερό Ctrl - + Right Shift only Μόνο το δεξί Shift - + Right Shift Δεξί Shift - + Alt key Πλήκτρο Alt - + Alt Alt - + Ctrl key Πλήκτρο Ctrl - + Ctrl Ctrl - + Left Alt only Μόνο το αριστερό Alt - + Left Alt Αριστερό Alt - + Shift key Πλήκτρο Shift - + Shift Shift - + Right Alt only Μόνο το δεξί Alt - + Right Alt Δεξί Alt - + Right Ctrl only Μόνο το δεξί Ctrl - + Right Ctrl Δεξί Ctrl - + Left Shift only Μόνο το αριστερό Shift - + Left Shift Αριστερό Shift - + Windows key or Meta key Πλήκτρο Windows ή Meta (Μενού) - + Win/Meta Win/Meta - + Normally, in order to activate a popup you have to maintain the chosen keys pressed while you select a word. With this enabled, the chosen keys may also @@ -3092,51 +3570,86 @@ να πατάτε τα πλήκτρα αμέσως μετά την επιλογή της λέξης. - + Send translated word to main window instead of to show it in popup window Εμφάνιση της μετάφρασης στο κύριο παράθυρο αντί για το αναδυόμενο - + Send translated word to main window Εμφάνιση μετάφρασης στο κύριο παράθυρο - + Playback Αναπαραγωγή - + Play audio files via FFmpeg(libav) and libao - + Αναπαραγωγή αρχείων ήχου μέσω FFmpeg(libav) και libao - + Use internal player + Χρήση εσωτερικού προγράμματος + + + + System proxy - - Select this option to automatic collapse big articles + + Custom proxy - - Collapse articles more than + + Custom settings - - Articles longer than this size will be collapsed + + Full-text search - - symbols + + Allow full-text search for: + + + + + Don't search in dictionaries containing more than + + + + + articles (0 - unlimited) + + Select this option to automatic collapse big articles + Αν σημειώσετε αυτήν την επιλογή, τα μεγάλα άρθρα θα αποκρύπτονται αυτόματα + + + + Collapse articles more than + Απόκρυψη άρθρων με περισσότερα από + + + + Articles longer than this size will be collapsed + Αποκρύψη των άρθρων που υπερβαίνουν αυτό το μέγεθος + + + + symbols + σύμβολα + + Use Windows native playback API. Limited to .wav files only, but works very well. Χρήση μόνο του εγγενούς API των Windows. @@ -3167,38 +3680,39 @@ Αναπαραγωγή μέσω βιβλιοθήκης Bass - + Use any external program to play audio files Χρήση οποιουδήποτε εξωτερικού προγράμματος για την αναπαραγωγή αρχείων ήχου - + Use external program: Χρήση εξωτερικού προγράμματος: - + Some sites detect GoldenDict via HTTP headers and block the requests. Enable this option to workaround the problem. - + Ορισμένες ιστοσελίδες εντοπίζουν το GoldenDict μέσω των κεφαλίδων HTTP και μπλοκάρουν τα αιτήματά του. +Ενεργοποιήστε αυτή την επιλογή για να παρακάμψετε το πρόβλημα. - + Do not identify GoldenDict in HTTP headers - + Μη ταυτοποίηση του GoldenDict στις κεφαλίδες HTTP - + Ad&vanced Για &προχωρημένους - + ScanPopup extra technologies Προχωρημένες τεχνολογίες αναδυόμενου παραθύρου - + Try to use IAccessibleEx technology to retrieve word under cursor. This technology works only with some programs that support it (for example Internet Explorer 9). @@ -3209,12 +3723,12 @@ αυτά τα προγράμματα, δεν χρειάζεται να ενεργοποιήσετε την επιλογή. - + Use &IAccessibleEx &Χρήση IAccessibleEx - + Try to use UI Automation technology to retrieve word under cursor. This technology works only with some programs that support it. It is not needed to select this option if you don't use such programs. @@ -3224,12 +3738,12 @@ δεν χρειάζεται να ενεργοποιήσετε την επιλογή. - + Use &UIAutomation Χ&ρήση UIAutomation - + Try to use special GoldenDict message to retrieve word under cursor. This technology works only with some programs that support it. It is not needed to select this option if you don't use such programs. @@ -3239,63 +3753,63 @@ δεν χρειάζεται να ενεργοποιήσετε την επιλογή. - + Use &GoldenDict message Χρήση &μηνυμάτων Goldendict - + History Ιστορικό - + Turn this option on to store history of the translated words Αν ενεργοποιηθεί, θα αποθηκεύεται το ιστορικό των μεταφρασμένων λέξεων - + Store &history Αποθήκευση &ιστορικού - + Specify the maximum number of entries to keep in history. Ορίστε το μέγιστο αριθμό λημμάτων που θα αποθηκεύονται στο ιστορικό. - + Maximum history size: Μέγιστο μέγεθος ιστορικού: - + History saving interval. If set to 0 history will be saved only during exit. Συχνότητα αποθήκευσης ιστορικού. Αν χρησιμοποιήσετε 0, το ιστορικό θα αποθηκεύεται μόνο κατά την έξοδο. - + Save every Αποθήκευση κάθε - + minutes λεπτά - + Articles Άρθρα - + Turn this option on to always expand optional parts of articles Αν ενεργοποιηθεί, θα εμφανίζονται πάντα τα προαιρετικά τμήματα των άρθρων - + Expand optional &parts Εμφάνιση &προαιρετικών τμημάτων @@ -3310,12 +3824,12 @@ να πατάτε τα πλήκτρα αμέσως μετά την επιλογή της λέξης. - + Keys may also be pressed afterwards, within Εκ των υστέρων πάτημα πλήκτρων, εντός - + To avoid false positives, the keys are only monitored after the selection's done for a limited amount of seconds, which is specified here. @@ -3324,32 +3838,32 @@ μετά την επιλογή της λέξης. - + secs δευτ. - + Hotkeys Συντομεύσεις - + Use the following hotkey to show or hide the main window: Συντόμευση για εμφάνιση/απόκρυψη κύριου παραθύρου: - + Use the following hotkey to translate a word from clipboard: Συντόμευση για αναζήτηση λέξης που βρίσκεται στο πρόχειρο: - + The hotkeys are global and work from any program and within any context as long as GoldenDict is running in background. Οι συντομεύσεις λειτουργούν παντού και από οποιαδήποτε εφαρμογή, αρκεί να εκτελείται το GoldenDict. - + <!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; } @@ -3362,22 +3876,22 @@ <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" color:#ff0000;">Σημείωση: Μάλλον χρησιμοποιείτε έκδοση του X.Org XServer στην οποία δε λειτουργεί η επέκταση RECORD. Κατά πάσα πιθανότητα, οι συντομεύσεις του GoldenDict δε θα λειτουργήσουν. Το σφάλμα θα πρέπει να διορθωθεί σε επίπεδο X.Org XServer. Παρακαλώ, ανατρέξτε σε αυτήν την </span><a href="https://bugs.freedesktop.org/show_bug.cgi?id=20500"><span style=" text-decoration: underline; color:#0000ff;">αναφορά σφάλματος</span></a><span style=" color:#ff0000;"> και προσθέστε σχόλιο, αν το επιθυμείτε.</span></p></body></html> - + &Audio Ή&χος - + Pronunciation Προφορά - + Auto-pronounce words in main window Αυτόματη εκφώνηση λημμάτων στο κύριο παράθυρο - + Auto-pronounce words in scan popup Αυτόματη εκφώνηση λημμάτων στο αναδυόμενο παράθυρο @@ -3386,49 +3900,49 @@ Πρόγραμμα αναπαραγωγής αρχείων ήχου: - + &Network &Δίκτυο - + Enable if you wish to use a proxy server for all program's network requests. Επιλέξτε το αν θέλετε να χρησιμοποιείτε διαμεσολαβητή για όλες τις ανάγκες της εφαρμογής. - + Use proxy server Χρήση διαμεσολαβητή - + Type: Τύπος: - + Host: Διεύθυνση: - + Port: Θύρα: - + User: Χρήστης: - + Password: Κωδικός: - + Enabling this would make GoldenDict block most advertisements by disallowing content (images, frames) not originating from the site you are browsing. If some site breaks because of this, try disabling this. @@ -3438,12 +3952,12 @@ προβλήματα με κάποιους ιστοτόπους, δοκιμάστε να το αποεπιλέξετε. - + Disallow loading content from other sites (hides most advertisements) Φραγή περιεχομένου από άλλους ιστοτόπους (εξαφανίζει τις περισσότερες διαφημίσεις) - + Enabling this would allow to listen to sound pronunciations from online dictionaries that rely on Flash or other web plugins. Plugin must be installed for this option to work. @@ -3452,12 +3966,12 @@ το κατάλληλο πρόσθετο για να χρησιμοποιήσετε αυτή την επιλογή. - + Enable web plugins Ενεργοποίηση διαδικτυακών προσθέτων - + When this is enabled, the program periodically checks if a new, updated version of GoldenDict is available for download. If it is so, the program @@ -3469,7 +3983,7 @@ χρήστη και θα παραπέμπει στην ιστοσελίδα λήψης. - + Check for new program releases periodically Περιοδικός έλεγχος για νέες εκδόσεις/ενημερώσεις @@ -3477,27 +3991,27 @@ ProgramTypeEditor - + Audio Ήχος - + Plain Text Απλό κείμενο - + Html Html - + Prefix Match Ανάλογα με την επέκταση - + Unknown Άγνωστο @@ -3523,27 +4037,27 @@ ProgramsModel - + Enabled Ενεργό - + Type Τύπος - + Name Όνομα - + Command Line Γραμμή εντολών - + Icon Εικονίδιο @@ -3551,99 +4065,101 @@ QObject - + + Article loading error - + Σφάλμα φόρτωσης άρθρου - + + Article decoding error - + Σφάλμα αποκωδικοποίησης άρθρου avformat_alloc_context() failed. - + Απέτυχε το avformat_alloc_context(). av_malloc() failed. - + Απέτυχε το av_malloc(). avio_alloc_context() failed. - + Απέτυχε το avio_alloc_context(). avformat_open_input() failed: %1. - + Απέτυχε το avformat_open_input(): %1. avformat_find_stream_info() failed: %1. - + Απέτυχε το avformat_find_stream_info(): %1. Could not find audio stream. - + Δε βρέθηκε η ροή ήχου. Codec [id: %1] not found. - + Δε βρέθηκε ο codec [id: %1]. avcodec_open2() failed: %1. - + Απέτυχε το avcodec_open2(): %1. Cannot find usable audio output device. - + Δε βρέθηκε λειτουργική συσκευή εξόδου ήχου. Unsupported sample format. - + Μη υποστηριζόμενη μορφή. ao_open_live() failed: - + Απέτυχε το ao_open_live(): No driver. - + Δε βρέθηκε ο οδηγός. This driver is not a live output device. - + Αυτός ο οδηγός δεν είναι συσκευή ζωντανής εξόδου ήχου. A valid option key has an invalid value. - + Μία έγκυρη επιλογή δεν διαθέτει έγκυρη τιμή. Cannot open the device: %1, channels: %2, rate: %3, bits: %4. - + Δεν είναι δυνατή η ενεργοποίηση της συσκευής: %1, κανάλια: %2, ταχύτητα: %3, bit: %4. Unknown error. - + Άγνωστο σφάλμα. avcodec_alloc_frame() failed. - + Απέτυχε το avcodec_alloc_frame(). @@ -3667,31 +4183,31 @@ ResourceToSaveHandler - - + + ERROR: %1 - ΣΦΑΛΜΑ: %1 + ΣΦΑΛΜΑ: %1 - + Resource saving error: - Σφάλμα αποθήκευσης: + Σφάλμα αποθήκευσης: - + The referenced resource failed to download. - Απέτυχε η λήψη του ζητούμενου πόρου. + Απέτυχε η λήψη του ζητούμενου πόρου. Romaji - + Hepburn Romaji for Hiragana Hepburn Romaji για Hiragana - + Hepburn Romaji for Katakana Hepburn Romaji για Katakana @@ -3720,21 +4236,21 @@ Εμφάνιση αποτελεσμάτων (Alt+M) - - - - - + + + + + ... ... - + Back Πίσω - + Forward Μπροστά @@ -3743,32 +4259,32 @@ Alt+M - + Pronounce Word (Alt+S) Εκφώνηση λήμματος (Alt+S) - + Alt+S Alt+S - + Send word to main window (Alt+W) Εμφάνιση στο κύριο παράθυρο (Alt+W) - + Alt+W Alt+W - + Shows or hides the dictionary bar Εμφάνιση ή απόκρυψη της γραμμής λεξικών - + Use this to pin down the window so it would stay on screen, could be resized or managed in other ways. Χρησιμοποιήστε το για να μετατρέψετε το αναδυόμενο σε κανονικό παράθυρο, που δεν εξαφανίζεται από την οθόνη και μπορεί π.χ. να αλλάξει μέγεθος. @@ -3778,8 +4294,8 @@ GoldenDict - - + + %1 - %2 @@ -3787,17 +4303,17 @@ SoundDirsModel - + Path Διαδρομή - + Name Όνομα - + Icon Εικονίδιο @@ -3805,45 +4321,47 @@ Sources - + Text to Speech - + Εκφώνηση κειμένου - + (not available in portable version) (μη διαθέσιμο στη φορητή έκδοση) - - - + + + Choose a directory Επιλογή φακέλου - - - - - + + + + + + Confirm removal Επιβεβαίωση αφαίρεσης - - + + Remove directory <b>%1</b> from the list? Να αφαιρεθεί ο φάκελος <b>%1</b> από τη λίστα; - - + + + Remove site <b>%1</b> from the list? Να αφαιρεθεί η ιστοσελίδα <b>%1</b> από τη λίστα; - + Remove program <b>%1</b> from the list? Να αφαιρεθεί το πρόγραμμα <b>%1</b> από τη λίστα; @@ -3862,7 +4380,8 @@ - + + &Add... Προσ&θήκη... @@ -3871,7 +4390,8 @@ - + + &Remove Α&φαίρεση @@ -3898,7 +4418,7 @@ Path to a directory with Hunspell/Myspell dictionaries: - Διαδρομή φακέλου με λεξικά Hunspell/Myspell: + Φάκελος με λεξικά Hunspell/Myspell: @@ -3908,7 +4428,7 @@ Available morphology dictionaries: - Διαθέσιμα λεξικά μορφολογίας: + Διαθέσιμες μορφολογίες: @@ -3919,10 +4439,10 @@ Add appropriate dictionaries to the bottoms of the appropriate groups to use them. Τα λεξικά μορφολογίας εμφανίζονται ως -ξεχωριστά βοηθητικά λεξικά και παρέχουν +ξεχωριστά βοηθητικά λεξικά και περιέχουν ρίζες λέξεων και προτάσεις ορθογραφίας. -Προσθέστε λεξικά μορφολογίας στο τέλος -μιας ομάδας για να τα χρησιμοποιήσετε. +Μπορείτε να προσθέτετε τα κατάλληλα λεξικά +μορφολογίας στο τέλος κάθε ομάδας λεξικών. @@ -3949,7 +4469,7 @@ Εναλλακτικά, χρησιμοποιήστε %GD1253% για κωδικοποίηση CP1253, %GDISO7% για ISO 8859-7. - + Programs Προγράμματα @@ -3958,27 +4478,27 @@ Προσθέστε οποιοδήποτε εξωτερικό πρόγραμμα. Οι χαρακτήρες %GDWORD% αντικαθίστανται από τη ζητούμενη λέξη. Η λέξη στέλνεται και στη συνήθη είσοδο. - + Forvo Forvo - + Live pronunciations from <a href="http://www.forvo.com/">forvo.com</a>. The site allows people to record and share word pronunciations. You can listen to them from GoldenDict. Ζωντανή προφορά από το <a href="http://www.forvo.com/">forvo.com</a>. Ο ιστότοπος σας επιτρέπει να ηχογραφείτε και να μοιράζεστε προφορές λέξεων. Μπορείτε να ακούτε τις προφορές του Forvo στο GoldenDict. - + Enable pronunciations from Forvo Ενεργοποίηση προφορών από το Forvo - + API Key: Κλειδί API: - + Use of Forvo currently requires an API key. Leave this field blank to use the default key, which may become unavailable in the future, or register on the site to get your own key. @@ -4006,37 +4526,37 @@ <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Αποκτήστε το προσωπικό σας κλειδί από <a href="http://api.forvo.com/key/"><span style=" text-decoration: underline; color:#0057ae;">εδώ</span></a>, ή αφήστε κενό για να χρησιμοποιήσετε το προεπιλεγμένο.</p></td></tr></table></body></html> - + Language codes (comma-separated): Κωδικοί γλωσσών (χωρισμένοι με κόμματα): - + List of language codes you would like to have. Example: "en, ru". Λίστα με τους κωδικούς γλωσσών που επιθυμείτε να χρησιμοποιήσετε. Π.χ.: "en, el". - + Full list of language codes is available <a href="http://www.forvo.com/languages-codes/">here</a>. Ο πλήρης κατάλογος των κωδικών γλωσσών είναι διαθέσιμος <a href="http://www.forvo.com/languages-codes/">εδώ</a>. - + Transliteration Μεταγραφή - + Russian transliteration Ρωσικά - + German transliteration Γερμανικά - + Greek transliteration Ελληνικά @@ -4044,52 +4564,63 @@ Alternatively, use %GD1251% for CP1251, %GDISO1%...%GDISO16% for ISO 8859-1...ISO 8859-16 respectively, %GDBIG5% for Big-5, %GDBIG5HKSCS% for Big5-HKSCS, %GDGBK% for GBK and GB18030, %GDSHIFTJIS% for Shift-JIS. + Εναλλακτικά, χρησιμοποιήστε %GD1253% για κωδικοποίηση CP1253, %GDISO1%...%GDISO16% για ISO 8859-1...ISO 8859-16 αντιστοίχως, +%GDBIG5% για Big-5, %GDBIG5HKSCS% για Big5-HKSCS, %GDGBK% για GBK και GB18030, %GDSHIFTJIS% για Shift-JIS. + + + + DICT servers - Any external programs. A string %GDWORD% will be replaced with the query word. If such string is not presented, the word will be fed into standard input. + DICT servers: - + + Any external programs. A string %GDWORD% will be replaced with the query word. If such string is not presented, the word will be fed into standard input. + Προσθέστε οποιοδήποτε εξωτερικό πρόγραμμα. Οι χαρακτήρες %GDWORD% αντικαθίστανται από τη ζητούμενη λέξη. Αν το %GDWORD% λείπει, η λέξη θα σταλεί στη συνήθη είσοδο. + + + Get your own key <a href="http://api.forvo.com/key/">here</a>, or leave blank to use the default one. - + Αποκτήστε το προσωπικό σας κλειδί από <a href="http://api.forvo.com/key/">εδώ</a>, ή αφήστε κενό για να χρησιμοποιήσετε το προεπιλεγμένο. - + Belarusian transliteration Λευκορωσικά - + Enables to use the Latin alphabet to write the Japanese language Επιτρέπει τη χρήση του Λατινικού αλφαβήτου για τη μεταγραφή Ιαπωνικών - + Japanese Romaji Ιαπωνικά Romaji - + Systems: Μέθοδοι: - + The most widely used method of transcription of Japanese, based on English phonology Η πιο διαδεδομένη μέθοδος μεταγραφής Ιαπωνικών, βασισμένη στην αγγλική φωνολογία - + Hepburn Hepburn - + The most regular system, having a one-to-one relation to the kana writing systems. Standardized as ISO 3602 @@ -4100,12 +4631,12 @@ Δεν υποστηρίζεται ακόμη από το GoldenDict. - + Nihon-shiki Nihon-shiki - + Based on Nihon-shiki system, but modified for modern standard Japanese. Standardized as ISO 3602 @@ -4116,32 +4647,32 @@ Δεν υποστηρίζεται ακόμη από το GoldenDict. - + Kunrei-shiki Kunrei-shiki - + Syllabaries: Χαρακτήρες: - + Hiragana Japanese syllabary Ιαπωνικοί χαρακτήρες Hiragana - + Hiragana Hiragana - + Katakana Japanese syllabary Ιαπωνικοί χαρακτήρες Katakana - + Katakana Katakana @@ -4159,77 +4690,77 @@ Selected voice engines: - + Επιλεγμένες μηχανές εκφώνησης: &Add - + Προσ&θήκη &Remove - Α&φαίρεση + Α&φαίρεση Preferences - Προτιμήσεις + Προτιμήσεις Volume: - + Ένταση: Rate: - + Ταχύτητα: Preview - + Προεπισκόπηση Available voice engines: - + Διαθέσιμες μηχανές εκφώνησης: Text to be previewed: - + Κείμενο προεπισκόπησης: Type text to be previewed here. - + Εδώ προσθέτετε το κείμενο που θα εκφωνηθεί στην προεπισκόπηση. &Preview - + &Προεπισκόπηση No TTS voice available - + Δεν υπάρχει διαθέσιμη φωνή TTS Cannot find available TTS voice.<br>Please make sure that at least one TTS engine installed on your computer already. - + Δε βρέθηκαν διαθέσιμες φωνές TTS.<br>Βεβαιωθείτε ότι έχετε εγκαταστήσει μία τουλάχιστον μηχανή TTS. Confirm removal - Επιβεβαίωση αφαίρεσης + Επιβεβαίωση αφαίρεσης Remove voice engine <b>%1</b> from the list? - + Να αφαιρεθεί η μηχανή εκφώνησης <b>%1</b> από τη λίστα; @@ -4250,43 +4781,43 @@ Enabled - + Ενεργή Name - Όνομα + Όνομα Id - + Id Icon - Εικονίδιο + Εικονίδιο WebSitesModel - + Enabled Ενεργή - + Name Όνομα - + Address Διεύθυνση - + Icon Εικονίδιο @@ -4294,7 +4825,7 @@ WordFinder - + Failed to query some dictionaries. Απέτυχε η αναζήτηση σε ορισμένα λεξικά. diff -Nru goldendict-1.5.0~git20131003/locale/es_AR.ts goldendict-1.5.0~git20150923/locale/es_AR.ts --- goldendict-1.5.0~git20131003/locale/es_AR.ts 2013-10-02 20:42:04.000000000 +0000 +++ goldendict-1.5.0~git20150923/locale/es_AR.ts 2015-09-23 08:26:24.000000000 +0000 @@ -49,7 +49,7 @@ [Desconocido] - + Based on Qt %1 (%2, %3 bit) Basado en Qt %1 (%2, %3 bit) @@ -57,62 +57,62 @@ ArticleMaker - + Expand article Expandir artículo - + Collapse article Plegar artículo - + No translation for <b>%1</b> was found in group <b>%2</b>. No se ha encontrado ninguna palabra para <b>%1</b> en el grupo <b>%2</b>. - + No translation was found in group <b>%1</b>. No se ha encontrado ninguna palabra en el grupo <b>%1</b>. - + Welcome! ¡Bienvenido! - + <h3 align="center">Welcome to <b>GoldenDict</b>!</h3><p>To start working with the program, first visit <b>Edit|Dictionaries</b> to add some directory paths where to search for the dictionary files, set up various Wikipedia sites or other sources, adjust dictionary order or create dictionary groups.<p>And then you're ready to look up your words! You can do that in this window by using a pane to the left, or you can <a href="Working with popup">look up words from other active applications</a>. <p>To customize program, check out the available preferences at <b>Edit|Preferences</b>. All settings there have tooltips, be sure to read them if you are in doubt about anything.<p>Should you need further help, have any questions, suggestions or just wonder what the others think, you are welcome at the program's <a href="http://goldendict.org/forum/">forum</a>.<p>Check program's <a href="http://goldendict.org/">website</a> for the updates. <p>(c) 2008-2013 Konstantin Isakov. Licensed under GPLv3 or later. <h3 align="center">¡Bienvenido a <b>GoldenDict</b>!</h3><p>Para comenzar a utilizar el programa, primero ingrese al menú <b>Editar|Diccionarios</b> para agregar los directorios donde ubicar los diccionarios locales, configurar varios sitios de Wikipedia y definir otras fuentes de traducción online. Podrá también agrupar los diccionarios y ajustar el orden en el que aparecen los resultados de búsqueda.<p> ¡Y ahora, está listo para buscar las palabras que usted desee! La manera tradicional de utilizar un diccionario es introducir el término en el campo de búsqueda ubicado en el panel izquierdo de esta misma ventana. No obstante, a diferencia de la mayoría de los diccionarios electrónicos, no necesita ingresar la palabra específica (lo cual requiere un conocimiento básico de gramática de la lengua a ser traducida). Con GoldenDict, usted puede escribir la forma flexionada de una palabra determinada, que el programa es capaz de reconocer sus raíces, y así efectuar su corrección morfológica. Otra característica fundamental de GoldenDict es que el campo de búsqueda no es la única forma de efectuar búsquedas de palabras: también se puede traducir palabras mientras se encuentra en otros programas por medio del uso de la función de ventana emergente del GoldenDict. Consulte <a href="Trabajar con la función de ventana emergente">como buscar palabras desde otros programas</a> para saber como funciona este método de búsqueda.<p>Para personalizar el programa, ingrese al menú <b>Editar|Preferencias</b>. Cada opción tiene su propia ayuda que aparece cuando el cursor del mouse está posicionado encima de la misma por unos segundos.<p>Si necesita más ayuda, tiene dudas, sugerencias o cualquier otro pedido, su participación en el <a href="http://goldendict.org/forum/">foro</a> del programa es bienvenida.<p>Consulte el <a href="http://goldendict.org/">sitio web</a> del programa para ver si existen nuevas actualizaciones del mismo.<p>(c) 2008-2013 Konstantin Isakov. Licencia de GNU GPLv3 o posterior. - + Working with popup Trabajar con la función de ventana emergente - + <h3 align="center">Working with the popup</h3>To look up words from other active applications, you would need to first activate the <i>"Scan popup functionality"</i> in <b>Preferences</b>, and then enable it at any time either by triggering the 'Popup' icon above, or by clicking the tray icon down below with your right mouse button and choosing so in the menu you've popped. <h3 align="center">Trabajar con la función de ventana emergente</h3>Para realizar búsquedas de palabras mientras se encuentra en otro programa, primeramente es preciso activar la función de ventana emergente siguiendo los siguientes pasos en la ventana principal del GoldenDict:<p><OL><LI>Ingrese en el menú <b>Editar|Preferencias</b>;<LI>Haga click en la pestaña <i>Ventana emergente de lectura</i>;<LI>Marque la casilla de selección <i>Activar función de ventana emergente de lectura</i>;<LI>Luego presione en <em>Aceptar</em> para guardar la configuración.</OL><p>Con esta opción activada, puede marcar o desmarcar la exhibición de ventana emergente cuando así lo desee. Para ésto, existen dos formas:<UL><LI>En la ventana principal, haga click en el botón <em>ventana emergente de lectura</em>, cuya imagen se asemeja a una varita;<LI>En el ícono del programa que aparece en la bandeja del sistema, haga click con el botón derecho del mouse y marque la opción <em>ventana emergente de lectura</em>.</UL><p> - + Then just stop the cursor over the word you want to look up in another application, and a window would pop up which would describe it to you. Una vez que esta opción sea activada, para cualquier palabra, frase o texto situado debajo del cursor del mouse, se mostrará una ventana emergente, exhibiendo inmediatamente los resultados de búsqueda. - + Then just select any word you want to look up in another application by your mouse (double-click it or swipe it with mouse with the button pressed), and a window would pop up which would describe the word to you. Una vez que esta opción sea activada, para cualquier palabra, frase o texto selecciónelo con el mouse o haga doble click sobre el mismo y se mostrará una ventana emergente, exhibiendo inmediatamente los resultados de búsqueda. - + (untitled) (sin título) - + (picture) (imagen) @@ -120,7 +120,7 @@ ArticleRequest - + From Resultados de @@ -129,32 +129,32 @@ From %1 - + Expand article Expandir artículo - + Collapse article Plegar artículo - + Query error: %1 Error de consulta: %1 - + Close words: Palabras aproximadas: - + Compound expressions: Expresiones compuestas: - + Individual words: Palabras individuales: @@ -162,57 +162,57 @@ ArticleView - + Select Current Article Seleccionar artículo actual - + Copy as text Copiar como texto - + Inspect Inspeccionar - + Resource Recurso - + Audio Audio - + TTS Voice Texto a Voz - + Picture Imagen - + Video Video - + Video: %1 Video: %1 - + Definition from dictionary "%1": %2 Definición de diccionario "%1": %2 - + Definition: %1 Definición: %1 @@ -221,38 +221,39 @@ GoldenDict - - + + The referenced resource doesn't exist. El recurso referenciado no existe. - + The referenced audio program doesn't exist. El programa de audio referenciado no existe. - + + ERROR: %1 ERROR: %1 - + Save sound Guardar audio - + Sound files (*.wav *.ogg *.mp3 *.mp4 *.aac *.flac *.mid *.wv *.ape);;All files (*.*) Archivos de audio (*.wav *.ogg *.mp3 *.mp4 *.aac *.flac *.mid *.wv *.ape);;Todos los archivos (*.*) - + Save image Guardar imagen - + Image files (*.bmp *.jpg *.png *.tif);;All files (*.*) Archivos de imagen (*.bmp *.jpg *.png *.tif);;Todos los archivos (*.*) @@ -261,22 +262,22 @@ Error al guardar recurso: - + &Open Link Abrir &vínculo - + Open Link in New &Tab Abrir vínculo en nueva &pestaña - + Open Link in &External Browser Abrir vínculo en Navegador &Web externo - + WARNING: FFmpeg Audio Player: %1 ATENCIÓN: Reproductor de audio FFmpeg: %1 @@ -289,33 +290,33 @@ Guardar &audio - + &Look up "%1" &Buscar "%1" - + Look up "%1" in &New Tab Buscar "%1" en una &nueva pestaña - + Send "%1" to input line Enviar "%1" a búsqueda - - + + &Add "%1" to history &Agregar "%1" a historial - + Look up "%1" in %2 Buscar "%1" en %2 - + Look up "%1" in %2 in &New Tab Buscar "%1" en %2 en una nueva p&estaña @@ -336,37 +337,37 @@ La biblioteca Bass no puede reproducir este audio. - + Failed to run a player to play sound file: %1 No fue posible ejecutar un programa reproductor de audio: %1 - + Failed to create temporary file. No fue posible crear archivo temporal. - + Failed to auto-open resource file, try opening manually: %1. No fue posible abrir el archivo automáticamente, Intente abrirlo manualmente: %1. - + The referenced resource failed to download. No fue posible descargar el recurso referenciado. - + Save &image... Guardar &imagen... - + Save s&ound... Guardar &audio... - + WARNING: %1 ATENCIÓN: %1 @@ -376,42 +377,44 @@ Formulario - + about:blank sobre:blanco - + x x - + Find: Buscar: - + + &Previous A&nterior - + + &Next &Siguiente - + Ctrl+G Ctrl+G - + &Case Sensitive &Coincidencia de mayúsculas/minúsculas - + Highlight &all &Resaltar todo @@ -436,6 +439,29 @@ + Dialog + + + Proxy authentication required + + + + + You need to supply a Username and a Password to access via proxy + + + + + Username: + + + + + Password: + Contraseña: + + + DictGroupWidget @@ -536,6 +562,119 @@ + DictHeadwords + + + Search mode + + + + + This element determines how filter string will be interpreted + + + + + If checked on the symbols case will be take in account when filtering + + + + + Match case + + + + + Exports headwords to file + + + + + Export + + + + + Help + + + + + OK + + + + + Press this button to apply filter to headwords list + + + + + Apply + + + + + If checked any filter changes will we immediately applied to headwords list + + + + + Auto apply + + + + + Filter: + + + + + Filter string (fixed string, wildcards or regular expression) + + + + + Text + + + + + Wildcards + + + + + RegExp + + + + + Unique headwords total: %1, filtered: %2 + + + + + Save headwords to file + + + + + Text files (*.txt);;All files (*.*) + Documentos de texto (*.txt);;Todos los archivos (*.*) + + + + Export headwords... + + + + + Cancel + Cancelar + + + DictInfo @@ -578,6 +717,16 @@ Descripción: + + Show all unique dictionary headwords + + + + + Headwords + + + Edit the dictionary via command: %1 @@ -594,6 +743,74 @@ + DictServer + + + Url: + + + + + Databases: + + + + + Search strategies: + + + + + Server databases + + + + + DictServersModel + + + Enabled + Activado + + + + Name + Nombre + + + + Address + Dirección + + + + Databases + + + + + Strategies + + + + + Icon + Ícono + + + + Comma-delimited list of databases +(empty string or "*" matches all databases) + + + + + Comma-delimited list of search strategies +(empty string mean "prefix" strategy) + + + + DictionaryBar Dictionary Bar @@ -615,17 +832,22 @@ Editar este grupo - + Dictionary info Información del diccionario - + + Dictionary headwords + + + + Open dictionary folder Abrir carpeta del diccionario - + Edit dictionary Editar diccionario @@ -633,39 +855,39 @@ EditDictionaries - + &Sources &Fuentes - - + + &Dictionaries &Diccionarios - - + + &Groups &Grupos - + Sources changed Fuentes modificadas - + Some sources were changed. Would you like to accept the changes? Algunas fuentes fueron modificadas. Desea aceptar las modificaciones? - + Accept Aceptar - + Cancel Cancelar @@ -684,6 +906,92 @@ + FTS::FtsIndexing + + + None + Ninguno + + + + FTS::FullTextSearchDialog + + + Full-text search + + + + + Whole words + + + + + Plain text + + + + + Wildcards + + + + + RegExp + + + + + Max distance between words (%1-%2): + + + + + Max articles per dictionary (%1-%2): + + + + + + + Articles found: + + + + + Now indexing: + + + + + CJK symbols in search string are not compatible with search modes "Whole words" and "Plain text" + + + + + The search line must contains at least one word containing + + + + + or more symbols + + + + + No dictionaries for full-text search + + + + + FTS::Indexing + + + None + Ninguno + + + Forvo::ForvoArticleRequest @@ -722,6 +1030,65 @@ + FullTextSearchDialog + + + + Search + + + + + Match case + + + + + Mode: + + + + + Articles found: + + + + + Available dictionaries in group: + + + + + Wait for indexing: + + + + + Total: + + + + + Indexed: + + + + + Now indexing: None + + + + + Cancel + Cancelar + + + + Help + + + + GermanTranslit @@ -761,43 +1128,53 @@ Groups - + + Group tabs + + + + + Open groups list + + + + Add group Agregar grupo - + Give a name for the new group: Ingrese un nombre para el nuevo grupo: - + Rename group Renombrar grupo - + Give a new name for the group: Ingrese un nuevo nombre para el grupo: - + Remove group Eliminar grupo - + Are you sure you want to remove the group <b>%1</b>? ¿Está seguro que desea eliminar el grupo <b>%1</b>? - + Remove all groups Eliminar todos - + Are you sure you want to remove all the groups? ¿Está seguro que desea eliminar todos los grupos? @@ -903,6 +1280,54 @@ + Help::HelpWindow + + + GoldenDict help + + + + + Home + + + + + Back + Atrás + + + + Forward + Adelante + + + + Zoom In + Acercar + + + + Zoom Out + Alejar + + + + Normal Size + Tamaño normal + + + + Content + + + + + Index + + + + HistoryPaneWidget @@ -933,7 +1358,7 @@ Hunspell - + Spelling suggestions: Sugerencias ortográficas: @@ -1678,7 +2103,7 @@ Zulu - + %1 Morphology Morfología de %1 @@ -1686,12 +2111,12 @@ HunspellDictsModel - + Enabled Activado - + Name Nombre @@ -2731,7 +3156,7 @@ LoadDictionaries - + Error loading dictionaries Error al cargar diccionarios @@ -2739,7 +3164,7 @@ Main - + Error in configuration file. Continue with default settings? Error en archivo de configuración. ¿Desea continuar con los valores por defecto? @@ -2751,17 +3176,17 @@ Barra de navegación - + Back Atrás - + Forward Adelante - + Scan Popup Ventana emergente de lectura @@ -2770,23 +3195,23 @@ Pronounce word - + Show &Main Window &Mostrar ventana principal - - + + &Quit &Salir - + Loading... Cargando... - + Skip This Release Saltarse esta versión @@ -2795,32 +3220,32 @@ [Unknown] - + Page Setup Configurar página - + No printer is available. Please install one first. Impresora no disponible. Por favor instale una primero. - + Print Article Imprimir artículo - + Article, Complete (*.html) Artículo, Completo (*.html) - + Article, HTML Only (*.html) Artículo, sólo HTML (*.html) - + Save Article As Guardar artículo como @@ -2829,12 +3254,12 @@ Archivos HTML (*.html *.htm) - + Error Error - + Can't save article: %1 No es posible guardar el artículo: %1 @@ -2843,33 +3268,33 @@ Error loading dictionaries - + %1 dictionaries, %2 articles, %3 words %1 diccionarios, %2 artículos, %3 palabras - + Failed to initialize hotkeys monitoring mechanism.<br>Make sure your XServer has RECORD extension turned on. No fue posible inicializar el mecanismo de monitoreo de las teclas de acceso rápido. Verifique que su XServer posea la extensión RECORD activada. - + New Release Available Nueva versión disponible - + Version <b>%1</b> of GoldenDict is now available for download.<br>Click <b>Download</b> to get to the download page. La versión <b>%1</b> de GoldenDict está disponible ahora para descargar.<br>Haga click en <b>Descargar</b> para ir a la página web de descarga. - + Download Descargar - - + + Look up in: Buscar en: @@ -2882,108 +3307,114 @@ Mostrar íconos pequeños en las barras - + &Menubar Barra de &menú - + Found in Dictionaries: Resultados en diccionarios: - + Pronounce Word (Alt+S) Pronunciar palabra (Alt+S) - + Show Names in Dictionary &Bar Mostrar n&ombres en la barra de diccionarios - + Show Small Icons in &Toolbars Mostrar íconos &pequeños en las barras - + &Navigation Barra de &navegación - + Zoom In Acercar - + Zoom Out Alejar - + Normal Size Tamaño normal - + Words Zoom In Aumentar tamaño palabras - + Words Zoom Out Reducir tamaño palabras - + Words Normal Size Tamaño normal de palabras - + Close current tab Cerrar pestaña actual - + Close all tabs Cerrar todas las pestañas - + Close all tabs except current Cerrar todas las pestañas excepto la actual - + Look up: Buscar: - + All Todos - - + + Accessibility API is not enabled La función de accesibilidad no esta activada - + + String to search in dictionaries. The wildcards '*', '?' and sets of symbols '[...]' are allowed. +To find '*', '?', '[', ']' symbols use '\*', '\?', '\[', '\]' respectively + + + + Saving article... Guardando artículo... - + The main window is set to be always on top. La ventana principal del programa se ha configurado para aparecer siempre visible. - + Import history from file Importar historial desde archivo @@ -2992,52 +3423,57 @@ Importado desde archivo: - + Import error: invalid data in file Error de importación: datos inválidos en el archivo - + History import complete Importación de historial finalizada - + Import error: Error de importación: - + Dictionary info Información del diccionario - + + Dictionary headwords + + + + Open dictionary folder Abrir carpeta del diccionario - + Edit dictionary Editar diccionario - + Opened tabs Pestañas abiertas - + Open Tabs List Abrir lista de pestañas - + (untitled) (sin título) - + %1 - %2 %1 - %2 @@ -3046,17 +3482,17 @@ ATENCIÓN: %1 - + You have chosen to hide a menubar. Use %1 to show it back. Ha elegido ocultar la barra de menú. Utilice %1 para mostrarla nuevamente. - + Ctrl+M Ctrl+M - + &Hide &Ocultar @@ -3065,23 +3501,23 @@ Modo vista historial - + Export history to file Exportar historial a archivo - - + + Text files (*.txt);;All files (*.*) Documentos de texto (*.txt);;Todos los archivos (*.*) - + History export complete Exportación de historial finalizada - + Export error: Error de exportación: @@ -3099,22 +3535,22 @@ - + Welcome! ¡Bienvenido! - + &File &Archivo - + &Edit &Editar - + &Help A&yuda @@ -3127,7 +3563,7 @@ &Diccionarios... F3 - + &Preferences... &Preferencias... @@ -3136,7 +3572,7 @@ &Sources... - + F2 F2 @@ -3145,163 +3581,193 @@ &Grupos... - + &View &Ver - + &Zoom &Zoom - + H&istory &Historial - + &Dictionaries... &Diccionarios... - + F3 F3 - + &Search Pane Cuadro de &búsqueda - + + Search + + + + &Results Navigation Pane Cuadro de navegación de &resultados - + &History Pane Cuadro de &historial - + F4 F4 - + &Homepage &Sitio web - + &About &Acerca de GoldenDict - + About GoldenDict Acerca de GoldenDict - + + GoldenDict reference + + + + F1 F1 - + Quit from application Salir del programa - + Ctrl+Q Ctrl+Q - + &Forum &Foro - + &Close To Tray &Cerrar a bandeja - + Minimizes the window to tray Minimiza la ventana a la bandeja - + Ctrl+F4 Ctrl+F4 - + &Save Article &Guardar artículo - + Save Article Guardar artículo - + &Print &Imprimir - + Ctrl+P Ctrl+P - + Page Set&up Configurar &página - + Print Pre&view &Vista preliminar - + &Rescan Files &Reescanear archivos - + &New Tab &Nueva pestaña - + &Always on Top Siempre &visible - + Always on Top Siempre visible - + Ctrl+O Ctrl+O - - - + + + Menu Button Menú principal + + Search in page + + + + + Ctrl+F + + + + + Full-text search + + + + + Ctrl+Shift+F + + + Print Preview Vista preliminar @@ -3310,48 +3776,48 @@ Reescanear archivos - + Ctrl+F5 Ctrl+F5 - + &Clear &Limpiar - + New Tab Nueva pestaña - + Ctrl+T Ctrl+T - + &Configuration Folder Carpeta de &configuración - - + + &Show &Mostrar - + Ctrl+H Ctrl+H - + &Export &Exportar - + &Import &Importar @@ -3367,12 +3833,12 @@ Mdx::MdxArticleRequest - + Dictionary file was tampered or corrupted El archivo del diccionario ha sido manipulado o corrompido - + Failed loading article from %1, reason: %2 Error al cargar artículo de %1, motivo: %2 @@ -3380,7 +3846,7 @@ MediaWiki::MediaWikiArticleRequest - + XML parse error: %1 at %2,%3 Error de parsing XML: %1 en %2,%3 @@ -3388,7 +3854,7 @@ MediaWiki::MediaWikiWordSearchRequest - + XML parse error: %1 at %2,%3 Error de parsing XML: %1 en %2,%3 @@ -3396,22 +3862,22 @@ MediaWikisModel - + Enabled Activado - + Name Nombre - + Address Dirección - + Icon Ícono @@ -3424,88 +3890,94 @@ Formulario - + Dictionary order: Orden de diccionarios: - - - - ... - ... + ... - + Inactive (disabled) dictionaries: Diccionarios inactivos (desactivados): - + Dictionary information Información del diccionario - + Name: Nombre: - + Total articles: Total de artículos: - + Total words: Total de palabras: - + Translates from: Traduce de: - + Translates to: Traduce a: - + Description: Descripción: - + Files comprising this dictionary: Archivos que componen este diccionario: - + Adjust the order by dragging and dropping items in it. Drop dictionaries to the inactive group to disable their use. Ajuste el orden de los diccionarios arrastrando y soltando los mismos en donde desee ubicarlos.Arrastre diccionarios al grupo de inactivos para desactivarlos. - + Sort by name Ordenar por nombre - + Sort by languages Ordenar por idiomas + + + Dictionary headwords + + + + + Dictionaries active: %1, inactive: %2 + + PathsModel - + Path Ruta de directorio - + Recursive Búsqueda recursiva @@ -3661,24 +4133,29 @@ Estilo complementario: - + + Help language + + + + Adjust this value to avoid huge context menus. Ajuste este valor para evitar menús contextuales enormes. - + Context menu dictionaries limit: Límite de diccionarios en menú contextual: - + Chooses whether the scan popup mode is on by default or not. If checked, the program would always start with the scan popup active. Elige si la ventana emergente de lectura se activará por defecto o no. Si estuviera tildada, el programa siempre se iniciará con la ventana emergente de lectura activa. - + Normally, in order to activate a popup you have to maintain the chosen keys pressed while you select a word. With this enabled, the chosen keys may also @@ -3689,27 +4166,27 @@ también podrán presionarse luego de que la selección fuera realizada. - + Hotkeys Teclas de acceso rápido - + Use the following hotkey to show or hide the main window: Utilizar la siguiente tecla de acceso rápido para mostrar/ocultar la ventana principal: - + Use the following hotkey to translate a word from clipboard: Utilizar la siguiente tecla de acceso rápido para traducir una palabra del portapeles: - + The hotkeys are global and work from any program and within any context as long as GoldenDict is running in background. Las teclas de acceso rápido son globales y funcionan desde cualquier programa y dentro de cualquier contexto, siempre y cuando el GoldenDict esté siendo ejecutado en segundo plano. - + &Scan Popup &Ventana emergente de lectura @@ -3719,7 +4196,7 @@ Iniciar automáticamente el GoldenDict al terminar de iniciarse el sistema. - + When enabled, a translation popup window would be shown each time you point your mouse on any word on the screen (Windows) or select any word with mouse (Linux). When enabled, you can switch it on and @@ -3732,133 +4209,133 @@ Scan popup functionality - + Enable scan popup functionality Activar función de ventana emergente de lectura - + Start with scan popup turned on Iniciar con la ventana emergente de lectura activada - + With this enabled, the popup would only show up if all chosen keys are in the pressed state when the word selection changes. Con esta opción activada, la ventana emergente aparecerá sólo si todas las teclas seleccionadas estuvieran siendo presionadas cuando la selección de la palabra cambia. - + Only show popup when all selected keys are kept pressed: Mostrar la ventana emergente sólo cuando se presionan todas las teclas seleccionadas abajo: - + Left Ctrl only Sólo Ctrl izquierdo - + Left Ctrl Ctrl izquierdo - + Right Shift only Sólo Shift derecho - + Right Shift Shift derecho - + Alt key Tecla Alt - + Alt Alt - + Ctrl key Tecla Ctrl - + Ctrl Ctrl - + Left Alt only Sólo Alt izquierdo - + Left Alt Alt izquierdo - + Shift key Tecla Shift - + Shift Shift - + Right Alt only Sólo Alt derecho - + Right Alt Alt derecho - + Right Ctrl only Sólo Ctrl derecho - + Right Ctrl Ctrl derecho - + Left Shift only Sólo Shift izquierdo - + Left Shift Shift izquierdo - + Windows key or Meta key Tecla Windows o tecla Meta - + Win/Meta Win/Meta - + Keys may also be pressed afterwards, within Las teclas pueden también presionarse posteriormente, dentro de los - + To avoid false positives, the keys are only monitored after the selection's done for a limited amount of seconds, which is specified here. @@ -3866,22 +4343,22 @@ después de realizada la seleción dentro del límite de tiempo especificado aquí. - + secs segundos - + Send translated word to main window instead of to show it in popup window Enviar palabra traducida a la ventana principal en lugar de mostrarla en la ventana emergente de lectura - + Send translated word to main window Enviar palabra traducida a la ventana principal - + <!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; } @@ -3895,57 +4372,92 @@ </body></html> - + &Audio &Audio - + Pronunciation Pronunciación - + Auto-pronounce words in main window Auto-pronunciar palabras en la ventana principal - + Auto-pronounce words in scan popup Auto-pronunciar palabras en la ventana emergente de lectura - + Playback Reproducción - + Play audio files via FFmpeg(libav) and libao Reproducir archivos de audio vía FFmpeg(libav) y libao - + Use internal player Utilizar reproductor de audio interno - + + System proxy + + + + + Custom proxy + + + + + Custom settings + + + + + Full-text search + + + + + Allow full-text search for: + + + + + Don't search in dictionaries containing more than + + + + + articles (0 - unlimited) + + + + Select this option to automatic collapse big articles Seleccionar esta opción para automáticamente plegar artículos grandes - + Collapse articles more than Plegar artículos con más de - + Articles longer than this size will be collapsed Los artículos que superen este tamaño aparecerán automáticamente plegados - + symbols símbolos @@ -3978,38 +4490,38 @@ Reproducir vía biblioteca Bass - + Use any external program to play audio files Utilice un programa externo para reproducir archivos de audio - + Use external program: Utilizar un programa externo: - + Some sites detect GoldenDict via HTTP headers and block the requests. Enable this option to workaround the problem. Algunos sitios web detectan GoldenDict vía encabezados HTTP y de esta manera lo bloquean. Active esta opción para eludir este problema. - + Do not identify GoldenDict in HTTP headers No identificar GoldenDict en encabezados HTTP - + Ad&vanced A&vanzado - + ScanPopup extra technologies Opciones avanzadas de ventana emergente de lectura - + Try to use IAccessibleEx technology to retrieve word under cursor. This technology works only with some programs that support it (for example Internet Explorer 9). @@ -4019,12 +4531,12 @@ No necesita seleccionar esta opción si no utiliza tales programas. - + Use &IAccessibleEx Utilizar &IAccessibleEx - + Try to use UI Automation technology to retrieve word under cursor. This technology works only with some programs that support it. It is not needed to select this option if you don't use such programs. @@ -4033,12 +4545,12 @@ No necesita seleccionar esta opción si no utiliza tales programas. - + Use &UIAutomation Utilizar &UIAutomation - + Try to use special GoldenDict message to retrieve word under cursor. This technology works only with some programs that support it. It is not needed to select this option if you don't use such programs. @@ -4047,62 +4559,62 @@ No necesita seleccionar esta opción si no utiliza tales programas. - + Use &GoldenDict message Utilizar &GoldenDict message - + History Historial - + Turn this option on to store history of the translated words Activar esta opción para guardar el historial de las palabras traducidas - + Store &history Guardar &historial - + Specify the maximum number of entries to keep in history. Indicar el máximo número de entradas para el historial. - + Maximum history size: Tamaño máximo del historial: - + History saving interval. If set to 0 history will be saved only during exit. Intervalo para grabar historial. Si se configura en 0, el historial sólo se grabará al cerrar el programa. - + Save every Guardar cada - + minutes minutos - + Articles Artículos - + Turn this option on to always expand optional parts of articles Activar esta opción para expandir siempre las partes opcionales de artículos - + Expand optional &parts Expandir &partes opcionales @@ -4111,49 +4623,49 @@ Program to play audio files: - + &Network &Red - + Enable if you wish to use a proxy server for all program's network requests. Active esta opción para utilizar un servidor proxy para todos los accesos a la red del programa. - + Use proxy server Utilizar servidor proxy - + Type: Tipo: - + Host: Servidor: - + Port: Puerto: - + User: Usuario: - + Password: Contraseña: - + Enabling this would make GoldenDict block most advertisements by disallowing content (images, frames) not originating from the site you are browsing. If some site breaks because of this, try disabling this. @@ -4162,12 +4674,12 @@ que está accediendo. Si algunos sitios web dejan de funcionar, intente desactivar esta opción. - + Disallow loading content from other sites (hides most advertisements) No permitir la carga de contenido de otros sitios web (oculta la mayoría de los anuncios de publicidad) - + Enabling this would allow to listen to sound pronunciations from online dictionaries that rely on Flash or other web plugins. Plugin must be installed for this option to work. @@ -4176,12 +4688,12 @@ El plugin debe estar instalado en el sistema para que esta opción funcione. - + Enable web plugins Activar plugins web - + When this is enabled, the program periodically checks if a new, updated version of GoldenDict is available for download. If it is so, the program @@ -4193,12 +4705,12 @@ página web de descarga utilizando el navegador de internet. - + Check for new program releases periodically Verificar periódicamente si hay nuevas versiones del programa - + System default Por defecto @@ -4211,32 +4723,33 @@ Russian - + + Default Por defecto - + Modern Modern - + Lingvo Lingvo - + Babylon Babylon - + Lingoes Lingoes - + Lingoes-Blue Lingoes-Blu @@ -4245,12 +4758,12 @@ Reproducir vía DirectShow - + Changing Language Modificar idioma - + Restart the program to apply the language change. Reinicie el programa para aplicar el cambio de idioma. @@ -4258,27 +4771,27 @@ ProgramTypeEditor - + Audio Audio - + Plain Text Texto simple - + Html Html - + Prefix Match Coincidencia prefijo - + Unknown Desconocido @@ -4304,27 +4817,27 @@ ProgramsModel - + Enabled Activado - + Type Tipo - + Name Nombre - + Command Line Línea de comando - + Icon Ícono @@ -4332,12 +4845,14 @@ QObject - + + Article loading error Error al cargar artículo - + + Article decoding error Error al decodificar artículo @@ -4448,18 +4963,18 @@ ResourceToSaveHandler - - + + ERROR: %1 ERROR: %1 - + Resource saving error: Error al guardar recurso: - + The referenced resource failed to download. No fue posible descargar el recurso referenciado. @@ -4467,12 +4982,12 @@ Romaji - + Hepburn Romaji for Hiragana Hepburn Romaji para Hiragana - + Hepburn Romaji for Katakana Hepburn Romaji para Katakana @@ -4505,12 +5020,12 @@ palabra - + Back Atrás - + Forward Adelante @@ -4523,32 +5038,32 @@ Alt+M - + Pronounce Word (Alt+S) Pronunciar palabra (Alt+S) - + Alt+S Alt+S - + Send word to main window (Alt+W) Enviar palabra a la ventana principal (Alt+W) - + Alt+W Alt+W - + Shows or hides the dictionary bar Muestra u oculta la barra de diccionarios - + Use this to pin down the window so it would stay on screen, could be resized or managed in other ways. Utilice esta opción para fijar la ventana de modo que @@ -4560,11 +5075,11 @@ List matches - - - - - + + + + + ... ... @@ -4577,8 +5092,8 @@ GoldenDict - - + + %1 - %2 %1 - %2 @@ -4586,17 +5101,17 @@ SoundDirsModel - + Path Ruta de directorio - + Name Nombre - + Icon Ícono @@ -4604,45 +5119,47 @@ Sources - + Text to Speech Texto a Voz - + (not available in portable version) (no disponible en versión portátil) - - - + + + Choose a directory Elija un directorio - - - - - + + + + + + Confirm removal Confirmar eliminación - - + + Remove directory <b>%1</b> from the list? ¿Eliminar el directorio <b>%1</b> de la lista? - - + + + Remove site <b>%1</b> from the list? ¿Eliminar el sitio <b>%1</b> de la lista? - + Remove program <b>%1</b> from the list? ¿Eliminar el programa <b>%1</b> de la lista? @@ -4665,7 +5182,8 @@ - + + &Add... &Agregar... @@ -4674,7 +5192,8 @@ - + + &Remove &Eliminar @@ -4742,7 +5261,7 @@ Como alternativa, puede utilizar %GD1251% para codificación CP1251 y %GDISO1% para codificación ISO-8859-1. - + Programs Programas @@ -4751,27 +5270,27 @@ Ingrese todos los programas externos que quiera. La ocurrencia %GDWORD% se reemplazará por el término de búsqueda especificado. La misma también será enviada a la entrada estándar. - + Forvo Forvo - + Live pronunciations from <a href="http://www.forvo.com/">forvo.com</a>. The site allows people to record and share word pronunciations. You can listen to them from GoldenDict. Pronunciación de palabras de <a href="http://www.forvo.com/">forvo.com</a>. Este sitio web permite grabar y compartir la pronunciación de palabras. Es posible escucharlas en GoldenDict. - + Enable pronunciations from Forvo Activar la función para escuchar la pronunciación del sitio Forvo - + API Key: Clave API: - + Use of Forvo currently requires an API key. Leave this field blank to use the default key, which may become unavailable in the future, or register on the site to get your own key. @@ -4781,7 +5300,7 @@ obtener su propia clave. - + Get your own key <a href="http://api.forvo.com/key/">here</a>, or leave blank to use the default one. Obtenga su propia clave <a href="http://api.forvo.com/key/">aquí</a>, o deje este campo en blanco para utilizar la clave por defecto. @@ -4811,79 +5330,89 @@ respectivamente, %GDBIG5% para Big-5, %GDBIG5HKSCS% para Big5-HKSCS, %GDGBK% para GBK y GB18030, %GDSHIFTJIS% para Shift-JIS. + + DICT servers + + + + DICT servers: + + + + Any external programs. A string %GDWORD% will be replaced with the query word. If such string is not presented, the word will be fed into standard input. Ingrese todos los programas externos que quiera. La ocurrencia %GDWORD% se reemplazará por el término de búsqueda especificado. Si la ocurrencia no esta presente, el término será enviado a la entrada estándar. - + Language codes (comma-separated): Códigos de idiomas (separados por coma): - + List of language codes you would like to have. Example: "en, ru". Lista de códigos de idioma que a Ud. le gustaría tener. Por ejemplo: "en, ru". - + Full list of language codes is available <a href="http://www.forvo.com/languages-codes/">here</a>. Una lista completa de códigos de idioma está disponible <a href="http://www.forvo.com/languages-codes/">aquí</a>. - + Transliteration Transliteración - + Russian transliteration Transliteración de ruso - + Greek transliteration Transliteración de griego - + German transliteration Transliteración de alemán - + Belarusian transliteration Transliteración de bielorruso - + Enables to use the Latin alphabet to write the Japanese language Permite utilizar el alfabeto latino para escribir el idioma japonés - + Japanese Romaji Japonés romanizado - + Systems: Sistemas: - + The most widely used method of transcription of Japanese, based on English phonology El método de transcripción del japonés más utilizado, basado en la fonología inglesa - + Hepburn Romanización Hepburn - + The most regular system, having a one-to-one relation to the kana writing systems. Standardized as ISO 3602 @@ -4894,12 +5423,12 @@ Todavía no está implementado en GoldenDict. - + Nihon-shiki Nihon-shiki - + Based on Nihon-shiki system, but modified for modern standard Japanese. Standardized as ISO 3602 @@ -4910,32 +5439,32 @@ Todavía no está implementado en GoldenDict. - + Kunrei-shiki Kunrei-shiki - + Syllabaries: Silabarios: - + Hiragana Japanese syllabary Silabario japonés Hiragana - + Hiragana Hiragana - + Katakana Japanese syllabary Silabario japonés Katakana - + Katakana Katakana @@ -5083,22 +5612,22 @@ WebSitesModel - + Enabled Activado - + Name Nombre - + Address Dirección - + Icon Ícono @@ -5106,7 +5635,7 @@ WordFinder - + Failed to query some dictionaries. No fue posible consultar algunos diccionarios. diff -Nru goldendict-1.5.0~git20131003/locale/es_BO.ts goldendict-1.5.0~git20150923/locale/es_BO.ts --- goldendict-1.5.0~git20131003/locale/es_BO.ts 2013-10-02 20:42:04.000000000 +0000 +++ goldendict-1.5.0~git20150923/locale/es_BO.ts 2015-09-23 08:26:24.000000000 +0000 @@ -49,7 +49,7 @@ [Desconocido] - + Based on Qt %1 (%2, %3 bit) @@ -57,62 +57,62 @@ ArticleMaker - + Expand article - + Collapse article - + No translation for <b>%1</b> was found in group <b>%2</b>. No traducción de <b>%1</b> fue encontrado en grupo <b>%2</b>. - + No translation was found in group <b>%1</b>. No traducción fue encontrado en grupo <b>%1</b>. - + Welcome! ¡Bienvenido! - + <h3 align="center">Welcome to <b>GoldenDict</b>!</h3><p>To start working with the program, first visit <b>Edit|Dictionaries</b> to add some directory paths where to search for the dictionary files, set up various Wikipedia sites or other sources, adjust dictionary order or create dictionary groups.<p>And then you're ready to look up your words! You can do that in this window by using a pane to the left, or you can <a href="Working with popup">look up words from other active applications</a>. <p>To customize program, check out the available preferences at <b>Edit|Preferences</b>. All settings there have tooltips, be sure to read them if you are in doubt about anything.<p>Should you need further help, have any questions, suggestions or just wonder what the others think, you are welcome at the program's <a href="http://goldendict.org/forum/">forum</a>.<p>Check program's <a href="http://goldendict.org/">website</a> for the updates. <p>(c) 2008-2013 Konstantin Isakov. Licensed under GPLv3 or later. <h3 align="center">¡Bienvenido a <b>GoldenDict</b>!</h3><p>Para empezar utilizando el programa, primero vaya al menú <b>Editar|Diccionarios</b> para añadir algunas rutas de directorios para buscar archivos de diccionarios, establecer sitios de Wikipedia o otros fuentes, ajustar el orden de diccionarios o crear grupos de diccionarios. <p>¡Entonces, Ud. puede empezar buscando palabras! Puede buscar en esta ventana utilizando el panel a la izquierda, o puede <a href="Working with popup">buscar palabras desde otras aplicaciones activas</a>. <p>Para personalizar este programa, vaya a <b>Editar&gt;Preferencias</b>. Todas las opciones allí tienen concejos emergentes. Léalos si Ud. tiene dudas acerca de las opciones. <p>Si Ud. necesita más ayuda, tiene preguntas, sugerencias o quiere saber las opiniones de otros, Ud está bienvenido al <a href="http://goldendict.org/forum/">foro</a> de GoldenDict. <p>Visite el <a href="http://goldendict.org/">sitio web</a> para conseguir actualizaciones del programa. <p>(c) 2008-2013 Konstantin Isakov. Licenciado bajo los términos de la GPLv3 o después. - + Working with popup Utilizando la ventana emergente - + <h3 align="center">Working with the popup</h3>To look up words from other active applications, you would need to first activate the <i>"Scan popup functionality"</i> in <b>Preferences</b>, and then enable it at any time either by triggering the 'Popup' icon above, or by clicking the tray icon down below with your right mouse button and choosing so in the menu you've popped. <h3 align="center">Cómo Utilizar la ventana emergente</h3>Para buscar palabras desde otras aplicaciones activas, primero hay que habilitar la opción <i>"Escaneo en una ventana emergente"</i> en <b>Editar|Preferencias</b>. Luego puede utilizarla en cualquier momento, activando el icono arriba de la 'Ventana Emergente'. Alternativamente, haga clic a derecha abajo en la bandeja del sistema y seleccione la opción <b>Escanear con Ventana Emergente</b> en el menú. - + Then just stop the cursor over the word you want to look up in another application, and a window would pop up which would describe it to you. Luego detenga el cursor sobre la palabra que Ud. quiere buscar en otra aplicación y una ventana emergente aparecerá para hacer la consulta. - + Then just select any word you want to look up in another application by your mouse (double-click it or swipe it with mouse with the button pressed), and a window would pop up which would describe the word to you. Luego, seleccione una palabra deseada con su ratón para buscarla desde otra aplicación. Para seleccionar una palabra haga doble clic o arrastra sobre la palabra mientras oprimiendo el botón del ratón, y una ventana emergente aparecerá con la definición de la palabra. - + (untitled) (sin título) - + (picture) @@ -120,7 +120,7 @@ ArticleRequest - + From De @@ -129,32 +129,32 @@ From %1 - + Expand article - + Collapse article - + Query error: %1 Error de búsqueda: %1 - + Close words: Cerrar palabras: - + Compound expressions: Expresiones compuestas: - + Individual words: Palabras individuales: @@ -162,47 +162,47 @@ ArticleView - + Select Current Article - + Copy as text - + Inspect - + Resource - + Audio - + TTS Voice - + Picture - + Definition from dictionary "%1": %2 - + Definition: %1 @@ -211,99 +211,100 @@ GoldenDict - - + + The referenced resource doesn't exist. El recurso referido no existe. - + The referenced audio program doesn't exist. - + + ERROR: %1 - + Save sound - + Sound files (*.wav *.ogg *.mp3 *.mp4 *.aac *.flac *.mid *.wv *.ape);;All files (*.*) - + Save image - + Image files (*.bmp *.jpg *.png *.tif);;All files (*.*) - + &Open Link &Abrir enlace - + Video - + Video: %1 - + Open Link in New &Tab Abrir enlace en una nueva &pestaña - + Open Link in &External Browser Abrir enlace en un &navegador web externo - + &Look up "%1" &Buscar "%1" - + Look up "%1" in &New Tab Buscar "%1" en una &nueva pestaña - + Send "%1" to input line - - + + &Add "%1" to history - + Look up "%1" in %2 Buscar "%1" en %2 - + Look up "%1" in %2 in &New Tab Buscar "%1" en %2 en una &nueva pestaña - + WARNING: FFmpeg Audio Player: %1 @@ -316,37 +317,37 @@ Para activar reproducción de archivos no WAV, por favor vaya a Editar|Preferencias, escoja la pestaña Audio y seleccione "Reproducir con DirectShow". - + Failed to run a player to play sound file: %1 Fallo ejecutando un reproductor para reproducir el archivo de audio: %1 - + Failed to create temporary file. Fallo creando archivo temporal. - + Failed to auto-open resource file, try opening manually: %1. Fallo abriendo automáticamente el archivo de recursos. Intente abrirlo manualmente: %1. - + The referenced resource failed to download. El recurso ha fallado de descargar. - + Save &image... - + Save s&ound... - + WARNING: %1 ADVERTENCIA: %1 @@ -356,42 +357,44 @@ Formulario - + about:blank Acerca de: espacio en blanco - + x x - + Find: Buscar: - + + &Previous &Anterior - + + &Next &Siguiente - + Ctrl+G Ctrl+G - + &Case Sensitive &MAYÚSCULAS/minúsculas - + Highlight &all @@ -416,6 +419,29 @@ + Dialog + + + Proxy authentication required + + + + + You need to supply a Username and a Password to access via proxy + + + + + Username: + + + + + Password: + Contraseña: + + + DictGroupWidget @@ -516,6 +542,119 @@ + DictHeadwords + + + Search mode + + + + + This element determines how filter string will be interpreted + + + + + If checked on the symbols case will be take in account when filtering + + + + + Match case + + + + + Exports headwords to file + + + + + Export + + + + + Help + + + + + OK + + + + + Press this button to apply filter to headwords list + + + + + Apply + + + + + If checked any filter changes will we immediately applied to headwords list + + + + + Auto apply + + + + + Filter: + + + + + Filter string (fixed string, wildcards or regular expression) + + + + + Text + + + + + Wildcards + + + + + RegExp + + + + + Unique headwords total: %1, filtered: %2 + + + + + Save headwords to file + + + + + Text files (*.txt);;All files (*.*) + + + + + Export headwords... + + + + + Cancel + Cancelar + + + DictInfo @@ -558,6 +697,16 @@ + + Show all unique dictionary headwords + + + + + Headwords + + + Edit the dictionary via command: %1 @@ -573,6 +722,74 @@ + DictServer + + + Url: + + + + + Databases: + + + + + Search strategies: + + + + + Server databases + + + + + DictServersModel + + + Enabled + Habilitado + + + + Name + Nombre + + + + Address + Dirección + + + + Databases + + + + + Strategies + + + + + Icon + + + + + Comma-delimited list of databases +(empty string or "*" matches all databases) + + + + + Comma-delimited list of search strategies +(empty string mean "prefix" strategy) + + + + DictionaryBar Dictionary Bar @@ -594,17 +811,22 @@ Modificar este grupo - + Dictionary info - + + Dictionary headwords + + + + Open dictionary folder - + Edit dictionary @@ -612,39 +834,39 @@ EditDictionaries - + &Sources &Fuentes - - + + &Dictionaries &Diccionarios - - + + &Groups &Grupos - + Sources changed Fuentes modificados - + Some sources were changed. Would you like to accept the changes? Algunos fuentes fueron cambiados. ¿Quieres aceptar los cambios? - + Accept Aceptar - + Cancel Cancelar @@ -663,6 +885,92 @@ + FTS::FtsIndexing + + + None + Ningún + + + + FTS::FullTextSearchDialog + + + Full-text search + + + + + Whole words + + + + + Plain text + + + + + Wildcards + + + + + RegExp + + + + + Max distance between words (%1-%2): + + + + + Max articles per dictionary (%1-%2): + + + + + + + Articles found: + + + + + Now indexing: + + + + + CJK symbols in search string are not compatible with search modes "Whole words" and "Plain text" + + + + + The search line must contains at least one word containing + + + + + or more symbols + + + + + No dictionaries for full-text search + + + + + FTS::Indexing + + + None + Ningún + + + Forvo::ForvoArticleRequest @@ -701,6 +1009,65 @@ + FullTextSearchDialog + + + + Search + + + + + Match case + + + + + Mode: + + + + + Articles found: + + + + + Available dictionaries in group: + + + + + Wait for indexing: + + + + + Total: + + + + + Indexed: + + + + + Now indexing: None + + + + + Cancel + Cancelar + + + + Help + + + + GermanTranslit @@ -740,43 +1107,53 @@ Groups - + + Group tabs + + + + + Open groups list + + + + Add group Añadir grupo - + Give a name for the new group: Asignar un nombre al grupo nuevo: - + Rename group Renombrar grupo - + Give a new name for the group: Asignar un nombre nuevo al grupo: - + Remove group Eliminar grupo - + Are you sure you want to remove the group <b>%1</b>? ¿Está seguro que quiera eliminar el grupo <b>%1</b>? - + Remove all groups Eliminar todos los grupos - + Are you sure you want to remove all the groups? ¿Está seguro que quiera eliminar todos los grupos? @@ -881,6 +1258,54 @@ + Help::HelpWindow + + + GoldenDict help + + + + + Home + + + + + Back + Anterior + + + + Forward + Siguiente + + + + Zoom In + Agrandar + + + + Zoom Out + Achicar + + + + Normal Size + Tamaño normal + + + + Content + + + + + Index + + + + HistoryPaneWidget @@ -911,7 +1336,7 @@ Hunspell - + Spelling suggestions: Sugerencias ortográficas: @@ -1656,7 +2081,7 @@ Zulu - + %1 Morphology Morfología %1 @@ -1664,12 +2089,12 @@ HunspellDictsModel - + Enabled Habilitado - + Name Nombre @@ -2709,7 +3134,7 @@ LoadDictionaries - + Error loading dictionaries Error cargando los diccionarios @@ -2717,7 +3142,7 @@ Main - + Error in configuration file. Continue with default settings? @@ -2729,17 +3154,17 @@ Navegación - + Back Anterior - + Forward Siguiente - + Scan Popup Escanear en ventana &emergente @@ -2748,23 +3173,23 @@ Pronounce word - + Show &Main Window Mostrar Ventana &Principal - - + + &Quit &Salir - + Loading... Cargando... - + Skip This Release Saltar esta versión @@ -2773,22 +3198,22 @@ [Sconosciuto] - + Page Setup Configuración de página - + No printer is available. Please install one first. No hay una impresora disponible. Por favor instale una. - + Print Article Imprimir articulo - + Save Article As Guardar articulo como @@ -2797,12 +3222,12 @@ Archivos HTML (*.html *.htm) - + Error Error - + Can't save article: %1 No puede guardar articulo: %1 @@ -2811,33 +3236,33 @@ Error loading dictionaries - + %1 dictionaries, %2 articles, %3 words %1 diccionarios, %2 artículos, %3 palabras - + Failed to initialize hotkeys monitoring mechanism.<br>Make sure your XServer has RECORD extension turned on. Fallo de inicializar monitoreo de teclas de acceso rápido.<br>Asegúrese que su XServer tiene activada la extensión RECORD. - + New Release Available Una nueva versión está disponible - + Version <b>%1</b> of GoldenDict is now available for download.<br>Click <b>Download</b> to get to the download page. Ahora versión <b>%1</b> de GoldenDict está disponible para descargar.<br>Haga clic en <b>Descargar</b> para ir a página de descargas. - + Download Descargar - - + + Look up in: Buscar en: @@ -2846,168 +3271,179 @@ Mostrar Nombres en la barra de diccionarios - + &Menubar - + Found in Dictionaries: - + Pronounce Word (Alt+S) Pronunciar la Palabra (Alt+S) - + Show Names in Dictionary &Bar - + Show Small Icons in &Toolbars - + &Navigation - + Zoom In Agrandar - + Zoom Out Achicar - + Normal Size Tamaño normal - + Words Zoom In Agrandar Palabras - + Words Zoom Out Achicar Palabras - + Words Normal Size Tamaño Normal de Palabras - + Close current tab Cerrar la pestaña actual - + Close all tabs Cerrar todas las pestañas - + Close all tabs except current Cerrar todas las pestañas excepto la actual - + Look up: Buscar en: - + All Todo - - + + Accessibility API is not enabled - + + String to search in dictionaries. The wildcards '*', '?' and sets of symbols '[...]' are allowed. +To find '*', '?', '[', ']' symbols use '\*', '\?', '\[', '\]' respectively + + + + Article, Complete (*.html) - + Article, HTML Only (*.html) - + Saving article... - + The main window is set to be always on top. - + Import history from file - + Import error: invalid data in file - + History import complete - + Import error: - + Dictionary info - + + Dictionary headwords + + + + Open dictionary folder - + Edit dictionary - + Opened tabs Pestañas abiertas - + Open Tabs List - + (untitled) (sin titulo) - + %1 - %2 @@ -3016,38 +3452,38 @@ ADVERTENCIA: %1 - + You have chosen to hide a menubar. Use %1 to show it back. - + Ctrl+M - + &Hide - + Export history to file - - + + Text files (*.txt);;All files (*.*) - + History export complete - + Export error: @@ -3065,27 +3501,27 @@ - + Welcome! ¡Bienvenido! - + &File &Archivo - + &Edit &Editar - + &Help &Ayuda - + &Preferences... &Preferencias... @@ -3094,7 +3530,7 @@ &Sources... - + F2 F2 @@ -3103,163 +3539,193 @@ &Grupos... - + &View &Ver - + &Zoom &Zoom - + H&istory &Historial - + &Dictionaries... &Diccionarios... - + F3 F3 - + &Search Pane - + + Search + + + + &Results Navigation Pane - + &History Pane - + F4 F4 - + &Homepage &Página de inicio - + &About &Acerca de - + About GoldenDict Acerca de GoldenDict - + + GoldenDict reference + + + + F1 F1 - + Quit from application Salir de la aplicación - + Ctrl+Q Ctrl+Q - + &Forum &Foro - + &Close To Tray &Cerrar a la bandeja del sistema - + Minimizes the window to tray Minimiza el programa a la bandeja del sistema - + Ctrl+F4 Ctrl+F4 - + &Save Article &Guardar Artículo - + Save Article Guardar Artículo - + &Print &Imprimir - + Ctrl+P Ctrl+P - + Page Set&up Configuración de &Pagina - + Print Pre&view - + &Rescan Files - + &New Tab - + &Always on Top - + Always on Top - + Ctrl+O - - - + + + Menu Button + + Search in page + + + + + Ctrl+F + + + + + Full-text search + + + + + Ctrl+Shift+F + + + Print Preview Vista previa de impresión @@ -3268,48 +3734,48 @@ Reescanear Archivos - + Ctrl+F5 Ctrl+F5 - + &Clear &Despejar - + New Tab - + Ctrl+T - + &Configuration Folder - - + + &Show - + Ctrl+H - + &Export - + &Import @@ -3325,12 +3791,12 @@ Mdx::MdxArticleRequest - + Dictionary file was tampered or corrupted - + Failed loading article from %1, reason: %2 @@ -3338,7 +3804,7 @@ MediaWiki::MediaWikiArticleRequest - + XML parse error: %1 at %2,%3 Error leyendo XML: %1 en %2,%3 @@ -3346,7 +3812,7 @@ MediaWiki::MediaWikiWordSearchRequest - + XML parse error: %1 at %2,%3 Error leyendo XML: %1 en %2,%3 @@ -3354,22 +3820,22 @@ MediaWikisModel - + Enabled Habilitado - + Name Nombre - + Address Dirección - + Icon @@ -3382,88 +3848,94 @@ Formulario - + Dictionary order: Orden de diccionarios: - - - - ... - ... + ... - + Inactive (disabled) dictionaries: Diccionarios deshabilitados: - + Dictionary information Información del diccionario - + Name: Nombre: - + Total articles: Artículos en total: - + Total words: Palabras en total: - + Translates from: Traduce de: - + Translates to: Traduce a: - + Description: - + Files comprising this dictionary: Este diccionario consiste de los archivos: - + Adjust the order by dragging and dropping items in it. Drop dictionaries to the inactive group to disable their use. Ajuste el orden, arrastrando y soltando los diccionarios con el ratón. Mueva diccionarios al grupo deshabilitado para desactivar su uso - + Sort by name - + Sort by languages + + + Dictionary headwords + + + + + Dictionaries active: %1, inactive: %2 + + PathsModel - + Path Ruta - + Recursive Recursivo @@ -3613,24 +4085,29 @@ - + + Help language + + + + Adjust this value to avoid huge context menus. - + Context menu dictionaries limit: - + Chooses whether the scan popup mode is on by default or not. If checked, the program would always start with the scan popup active. Selecciona si el modo de escaneo está activado por defecto o no. Si está marcado, el programa siempre iniciará con el modo de escaneo habilitado. - + Normally, in order to activate a popup you have to maintain the chosen keys pressed while you select a word. With this enabled, the chosen keys may also @@ -3642,27 +4119,27 @@ despues la seleccion esté hecha. - + Hotkeys Teclas de acceso rápido - + Use the following hotkey to show or hide the main window: Usar la siguiente combinación de teclas para mostrar u ocultar la ventana principal: - + Use the following hotkey to translate a word from clipboard: Usar la tecla siguiente para traducir una palabra en la porta-papeles: - + The hotkeys are global and work from any program and within any context as long as GoldenDict is running in background. Las teclas de acceso rápido están globales y funcionan desde cualquier programa o contexto mientras que GoldenDict estén ejecutando en el fondo. - + &Scan Popup &Escanear con ventana emergente @@ -3672,7 +4149,7 @@ GoldenDict inicia automáticamente cuando el sistema arranca. - + When enabled, a translation popup window would be shown each time you point your mouse on any word on the screen (Windows) or select any word with mouse (Linux). When enabled, you can switch it on and @@ -3688,156 +4165,156 @@ Scan popup functionality - + Enable scan popup functionality Habilitar escaneo en una ventana emergente - + Start with scan popup turned on Habilitar escaneo en una ventana emergente cuando inicia - + With this enabled, the popup would only show up if all chosen keys are in the pressed state when the word selection changes. Con esto habilitado, la ventana emergente sólo aparece si todas las teclas seleccionadas estén oprimidas cuando la selección de la palabra cambie. - + Only show popup when all selected keys are kept pressed: Sólo muestra la ventana emergente cuando todas estas teclas seleccionadas sigan oprimidas: - + Left Ctrl only Solo CTRL de izquierda - + Left Ctrl CTRL de izquierda - + Right Shift only Sola MAYÚSCULA de derecha - + Right Shift MAYÚSCULA de derecha - + Alt key Tecla ALT - + Alt ALT - + Ctrl key Tecla CTRL - + Ctrl CTRL - + Left Alt only Sola ALT de izquierda - + Left Alt ALT de izquierda - + Shift key Tecla MAYÚSCULA - + Shift MAYÚSCULA - + Right Alt only Sola ALT de derecho - + Right Alt ALT de derecho - + Right Ctrl only Solo CTRL de derecho - + Right Ctrl CTRL de derecho - + Left Shift only Sola MAYÚSCULA de izquierda - + Left Shift MAYÚSCULA de izquierda - + Windows key or Meta key Tecla de Windows o Meta - + Win/Meta Windows o Meta - + Keys may also be pressed afterwards, within Teclas pueden ser oprimidas después, adentro - + To avoid false positives, the keys are only monitored after the selection's done for a limited amount of seconds, which is specified here. Para evitar positivos falsos, las teclas sólo son monitoreadas después de la terminación de la selección adentro un tiempo limitado, que está especificado aquí. - + secs segundos - + Send translated word to main window instead of to show it in popup window - + Send translated word to main window - + <!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; } @@ -3850,57 +4327,92 @@ <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" color:#ff0000;">Nota: Aparece que la extensión RECORD está rota en tu instalación de X.Org XServer. Las teclas de acceso rápido de GoldenDict probablemente no funcionan. Este problema puede ser arreglado en el servidor mismo. Por favor consulte al </span><a href="https://bugs.freedesktop.org/show_bug.cgi?id=20500"><span style=" text-decoration: underline; color:#0000ff;">reportaje de bug</span></a><span style=" color:#ff0000;"> y se puede entregar comentarios allí.</span></p></body></html> - + &Audio &Audio - + Pronunciation Pronunciación - + Auto-pronounce words in main window Pronuncia palabras automáticamente en la ventana principal - + Auto-pronounce words in scan popup Pronunciar palabras automáticamente a escanear con la ventana emergente - + Playback Reproducción - + Play audio files via FFmpeg(libav) and libao - + Use internal player - + + System proxy + + + + + Custom proxy + + + + + Custom settings + + + + + Full-text search + + + + + Allow full-text search for: + + + + + Don't search in dictionaries containing more than + + + + + articles (0 - unlimited) + + + + Select this option to automatic collapse big articles - + Collapse articles more than - + Articles longer than this size will be collapsed - + symbols @@ -3925,38 +4437,38 @@ Reproducir con Phonon - + Use any external program to play audio files Usar cualquier programa para reproducir archivos de audio - + Use external program: Usar el programa externo: - + Some sites detect GoldenDict via HTTP headers and block the requests. Enable this option to workaround the problem. - + Do not identify GoldenDict in HTTP headers - + Ad&vanced - + ScanPopup extra technologies - + Try to use IAccessibleEx technology to retrieve word under cursor. This technology works only with some programs that support it (for example Internet Explorer 9). @@ -3964,86 +4476,86 @@ - + Use &IAccessibleEx - + Try to use UI Automation technology to retrieve word under cursor. This technology works only with some programs that support it. It is not needed to select this option if you don't use such programs. - + Use &UIAutomation - + Try to use special GoldenDict message to retrieve word under cursor. This technology works only with some programs that support it. It is not needed to select this option if you don't use such programs. - + Use &GoldenDict message - + History - + Turn this option on to store history of the translated words - + Store &history - + Specify the maximum number of entries to keep in history. - + Maximum history size: - + History saving interval. If set to 0 history will be saved only during exit. - + Save every - + minutes - + Articles - + Turn this option on to always expand optional parts of articles - + Expand optional &parts @@ -4052,73 +4564,73 @@ Program to play audio files: - + &Network &Red - + Enable if you wish to use a proxy server for all program's network requests. Habilite está opción si Ud. quiere utilizar un servidor proxy por todas las solicitudes de red del programa. - + Use proxy server Utilizar servidor proxy - + Type: Tipo: - + Host: Host: - + Port: Puerto: - + User: Usuario: - + Password: Contraseña: - + Enabling this would make GoldenDict block most advertisements by disallowing content (images, frames) not originating from the site you are browsing. If some site breaks because of this, try disabling this. Habilitando esta opción bloqueará la mayoría de propagando comercial, porque no permite contenido (imágenes y marcos) que no vienen directamente del sitio utilizado. Si causa problemas con algunos sitios, deshabilite esta opción. - + Disallow loading content from other sites (hides most advertisements) No permite la carga de contenido de otros sitios (oculta la mayoría de propaganda) - + Enabling this would allow to listen to sound pronunciations from online dictionaries that rely on Flash or other web plugins. Plugin must be installed for this option to work. - + Enable web plugins - + When this is enabled, the program periodically checks if a new, updated version of GoldenDict is available for download. If it is so, the program @@ -4131,12 +4643,12 @@ la página web para descargarla. - + Check for new program releases periodically Verificar periódicamente si haya una nueva versión del programa - + System default Por defecto del sistema @@ -4149,32 +4661,33 @@ Russian - + + Default Por defecto - + Modern - + Lingvo Lingvo - + Babylon - + Lingoes - + Lingoes-Blue @@ -4183,12 +4696,12 @@ Reproducir con DirectShow - + Changing Language Cambiando la lengua - + Restart the program to apply the language change. Reinicie el programa para utilizar la lengua nueva del programa. @@ -4196,27 +4709,27 @@ ProgramTypeEditor - + Audio - + Plain Text - + Html - + Prefix Match - + Unknown @@ -4242,27 +4755,27 @@ ProgramsModel - + Enabled Habilitado - + Type - + Name Nombre - + Command Line - + Icon @@ -4270,12 +4783,14 @@ QObject - + + Article loading error - + + Article decoding error @@ -4386,18 +4901,18 @@ ResourceToSaveHandler - - + + ERROR: %1 - + Resource saving error: - + The referenced resource failed to download. El recurso ha fallado de descargar. @@ -4405,12 +4920,12 @@ Romaji - + Hepburn Romaji for Hiragana Romanización hepburn de Hiragana - + Hepburn Romaji for Katakana Romanización hepburn de Katakana @@ -4443,12 +4958,12 @@ palabra - + Back Anterior - + Forward Siguiente @@ -4461,32 +4976,32 @@ Alt+M - + Pronounce Word (Alt+S) Pronunciar la palabra (Alt+S) - + Alt+S Alt+S - + Send word to main window (Alt+W) - + Alt+W - + Shows or hides the dictionary bar Muestra u oculta la barra de diccionario - + Use this to pin down the window so it would stay on screen, could be resized or managed in other ways. Utilice esto para fijar la ventana en la pantalla, redimensionarla o gerenciarla en otra manera. @@ -4496,11 +5011,11 @@ List matches - - - - - + + + + + ... ... @@ -4513,8 +5028,8 @@ GoldenDict - - + + %1 - %2 @@ -4522,17 +5037,17 @@ SoundDirsModel - + Path Ruta - + Name Nombre - + Icon @@ -4540,45 +5055,47 @@ Sources - + Text to Speech - + (not available in portable version) (no disponible en versión portátil) - - - + + + Choose a directory Escoger un directorio - - - - - + + + + + + Confirm removal Confirma la eliminación - - + + Remove directory <b>%1</b> from the list? ¿Elimina el directorio <b>%1</b> de la lista? - - + + + Remove site <b>%1</b> from the list? ¿Eliminar el sitio <b>%1</b> de la lista? - + Remove program <b>%1</b> from the list? @@ -4601,7 +5118,8 @@ - + + &Add... &Añadir... @@ -4610,7 +5128,8 @@ - + + &Remove &Eliminar @@ -4679,32 +5198,32 @@ Alternativamente, use %GD1251% en lugar de CP1251, %GDISO1% en lugar de ISO 8859-1. - + Programs - + Forvo Forvo - + Live pronunciations from <a href="http://www.forvo.com/">forvo.com</a>. The site allows people to record and share word pronunciations. You can listen to them from GoldenDict. Pronuncia directamente de <a href="http://www.forvo.com/">forvo.com</a>. Este sito permite que la gente grabe y comparta pronunciaciones de palabras que pueden ser escuchadas desde GoldenDict. - + Enable pronunciations from Forvo Habilitar la pronuncia da Forvo - + API Key: Clave API: - + Use of Forvo currently requires an API key. Leave this field blank to use the default key, which may become unavailable in the future, or register on the site to get your own key. @@ -4714,7 +5233,7 @@ propia clave personalizada. - + Get your own key <a href="http://api.forvo.com/key/">here</a>, or leave blank to use the default one. @@ -4743,79 +5262,89 @@ + + DICT servers + + + + DICT servers: + + + + Any external programs. A string %GDWORD% will be replaced with the query word. If such string is not presented, the word will be fed into standard input. - + Language codes (comma-separated): Códigos de lengua (separados por comas): - + List of language codes you would like to have. Example: "en, ru". Lista de códigos de lenguas que Ud. quiere utilizar. Por Ejemplo: "en, ru, es". - + Full list of language codes is available <a href="http://www.forvo.com/languages-codes/">here</a>. Una lista completa de los códigos de lenguas está disponible <a href="http://www.forvo.com/languages-codes/">aquí</a>. - + Transliteration Transliteración - + Russian transliteration Transliteración rusa - + Greek transliteration Transliteración griega - + German transliteration Transliteración alemana - + Belarusian transliteration - + Enables to use the Latin alphabet to write the Japanese language Habilita el alfabeto romano para escribir la lengua japonesa - + Japanese Romaji Japonés romanizado - + Systems: Sistemas: - + The most widely used method of transcription of Japanese, based on English phonology El sistema más utilizado para transcribir japonés, basado en la fonología inglesa - + Hepburn Hepburn - + The most regular system, having a one-to-one relation to the kana writing systems. Standardized as ISO 3602 @@ -4826,12 +5355,12 @@ Todavia no implementado en GoldenDict. - + Nihon-shiki Nihon-shiki - + Based on Nihon-shiki system, but modified for modern standard Japanese. Standardized as ISO 3602 @@ -4842,32 +5371,32 @@ Todavía no implementado en GoldenDict. - + Kunrei-shiki Kunrei-shiki - + Syllabaries: Silabario: - + Hiragana Japanese syllabary Silabario de Japonés Hiragana - + Hiragana Hiragana - + Katakana Japanese syllabary Silabario de Japonés Katakana - + Katakana Katakana @@ -5011,22 +5540,22 @@ WebSitesModel - + Enabled Habilitado - + Name Nombre - + Address Dirección - + Icon @@ -5034,7 +5563,7 @@ WordFinder - + Failed to query some dictionaries. Fallo buscando en algunos diccionarios. diff -Nru goldendict-1.5.0~git20131003/locale/es_ES.ts goldendict-1.5.0~git20150923/locale/es_ES.ts --- goldendict-1.5.0~git20131003/locale/es_ES.ts 2013-10-02 20:42:04.000000000 +0000 +++ goldendict-1.5.0~git20150923/locale/es_ES.ts 2015-09-23 08:26:24.000000000 +0000 @@ -34,7 +34,7 @@ [Desconocido] - + Based on Qt %1 (%2, %3 bit) Basado en Qt %1 (%2, %3 bits) @@ -42,62 +42,62 @@ ArticleMaker - + Expand article Desplegar artículo - + Collapse article Plegar artículo - + No translation for <b>%1</b> was found in group <b>%2</b>. No se ha encontrado ninguna traducción para <b>%1</b> en el grupo <b>%2</b>. - + No translation was found in group <b>%1</b>. No se ha encontrado ninguna traducción en el grupo <b>%1</b>. - + Welcome! ¡Bienvenido! - + <h3 align="center">Welcome to <b>GoldenDict</b>!</h3><p>To start working with the program, first visit <b>Edit|Dictionaries</b> to add some directory paths where to search for the dictionary files, set up various Wikipedia sites or other sources, adjust dictionary order or create dictionary groups.<p>And then you're ready to look up your words! You can do that in this window by using a pane to the left, or you can <a href="Working with popup">look up words from other active applications</a>. <p>To customize program, check out the available preferences at <b>Edit|Preferences</b>. All settings there have tooltips, be sure to read them if you are in doubt about anything.<p>Should you need further help, have any questions, suggestions or just wonder what the others think, you are welcome at the program's <a href="http://goldendict.org/forum/">forum</a>.<p>Check program's <a href="http://goldendict.org/">website</a> for the updates. <p>(c) 2008-2013 Konstantin Isakov. Licensed under GPLv3 or later. <h3 align="center">¡Bienvenido a <b>GoldenDict</b>!</h3><p>Para empezar a trabajar con este programa, vaya primero a <b>Editar|Diccionarios</b> para especificar los directorios para los ficheros de diccionarios, configurar varios sitios de Wikipedia o de otras fuentes, definir el orden de búsqueda en los diccionarios o crear grupos de diccionarios.<p>Y con eso, ¡ya está listo para buscar! Puede hacerlo en esta ventana en el panel a la izquierda o puede <a href="Utilización de la ventana emergente">buscar palabras desde otros programas</a>. <p>Para personalizar el programa, eche un vistazo a las opciones disponibles en <b>Editar|Preferencias</b>. Cada opción tiene su propia descripción, léalas si tiene cualquier duda.<p>Si necesita más ayuda, tiene cualquier duda o sugerencia, o simplemente le interesa la opinión de los demás, es bienvenido al <a href="http://goldendict.berlios.de/forum/">foro</a> del programa.<p>Consulte el <a href="http://goldendict.org/">sitio web</a> del programa para estar al corriente de las actualizaciones.<p>© 2008-2013 Konstantin Isakov. Licencia GNU GPLv3 o posterior. - + Working with popup Utilización de la ventana emergente - + <h3 align="center">Working with the popup</h3>To look up words from other active applications, you would need to first activate the <i>"Scan popup functionality"</i> in <b>Preferences</b>, and then enable it at any time either by triggering the 'Popup' icon above, or by clicking the tray icon down below with your right mouse button and choosing so in the menu you've popped. <h3 align="center">Utilización de la ventana emergente</h3>Para buscar palabras desde otras aplicaciones, tiene que activar antes la <i>"función de ventana emergente de búsqueda"</i> en <b>Preferencias</b>, y entonces activar la ventana en cualquier momento con el icono 'Ventana emergente' mostrado arriba, o pulsando el icono de la bandeja mostrado abajo con el botón derecho del ratón y eligiendo la opción en el menú que aparece. - + Then just stop the cursor over the word you want to look up in another application, and a window would pop up which would describe it to you. Entonces puede situar el cursor sobre la palabra que quiere buscar en otra aplicación, y aparecerá una ventana mostrando los resultados de la búsqueda. - + Then just select any word you want to look up in another application by your mouse (double-click it or swipe it with mouse with the button pressed), and a window would pop up which would describe the word to you. Entonces puede seleccionar cualquier palabra que quiera buscar en otra aplicación con el ratón (haga doble clic o selecciónela con el ratón mientras mantiene pulsado el botón derecho), y aparecerá una ventana que mostrará los resultados de la búsqueda.. - + (untitled) (sin título) - + (picture) (imagen) @@ -105,37 +105,37 @@ ArticleRequest - + Expand article Desplegar artículo - + From De - + Collapse article Plegar artículo - + Query error: %1 Error de consulta: %1 - + Close words: Palabras parecidas: - + Compound expressions: Expresiones compuestas: - + Individual words: Palabras sueltas: @@ -143,47 +143,47 @@ ArticleView - + Select Current Article Seleccionar artículo actual - + Copy as text Copiar como texto - + Inspect Inspeccionar - + Resource Recurso - + Audio Audio - + TTS Voice Voz de síntesis (TTS) - + Picture Foto - + Definition from dictionary "%1": %2 Definición de diccionario "%1": %2 - + Definition: %1 Definición: %1 @@ -192,99 +192,100 @@ GoldenDict - - + + The referenced resource doesn't exist. El recurso indicado no existe. - + The referenced audio program doesn't exist. El reproductor de audio indicado no existe. - + + ERROR: %1 ERROR: %1 - + Save sound Guardar sonido - + Sound files (*.wav *.ogg *.mp3 *.mp4 *.aac *.flac *.mid *.wv *.ape);;All files (*.*) Ficheros de sonido (*.wav *.ogg *.mp3 *.mp4 *.aac *.flac *.mid *.wv *.ape);;Todos los ficheros (*.*) - + Save image Guardar imagen - + Image files (*.bmp *.jpg *.png *.tif);;All files (*.*) Ficheros de imagen (*.bmp *.jpg *.png *.tif);;Todos los ficheros (*.*) - + &Open Link &Abrir Enlace - + Video Vídeo - + Video: %1 Vídeo: %1 - + Open Link in New &Tab Abrir Enlace en Nueva &Pestaña - + Open Link in &External Browser Abrir Enlace en Navegador Web &Externo - + &Look up "%1" &Buscar "%1" - + Look up "%1" in &New Tab Buscar "%1" en &Nueva Pestaña - + Send "%1" to input line Enviar "%1" a la línea de entrada - - + + &Add "%1" to history Aña&dir "%1" al historial - + Look up "%1" in %2 Buscar "%1" en "%2" - + Look up "%1" in %2 in &New Tab Buscar "%1" en "%2" en Nue&va Pestaña - + WARNING: FFmpeg Audio Player: %1 AVISO: Reproductor de Audio FFmpeg: %1 @@ -297,37 +298,37 @@ Para habilitar la reproducción de ficheros en formatos distintos de WAV, vaya a Editar|Preferencias, y en la pestaña Audio seleccione "Reproducir con DirectShow". - + Failed to run a player to play sound file: %1 No se ha podido ejecutar un reproductor para reproducir el fichero de audio: %1 - + Failed to create temporary file. No se ha podido crear un fichero temporal. - + Failed to auto-open resource file, try opening manually: %1. No se ha podido abrir automáticamente el fichero de recursos, intente abrirlo manualmente: %1. - + The referenced resource failed to download. No se ha podido descargar el fichero de recursos indicado. - + Save &image... Guardar &imagen... - + Save s&ound... Guardar s&onido... - + WARNING: %1 ATENCIÓN: %1 @@ -337,42 +338,44 @@ Formulario - + about:blank about:blank - + x x - + Find: Buscar: - + + &Previous A&nterior - + + &Next &Siguiente - + Ctrl+G Ctrl+G - + &Case Sensitive &Diferenciar entre mayúsculas y minúsculas - + Highlight &all &Resaltar todo @@ -398,6 +401,29 @@ + Dialog + + + Proxy authentication required + + + + + You need to supply a Username and a Password to access via proxy + + + + + Username: + + + + + Password: + Contraseña: + + + DictGroupWidget @@ -498,6 +524,119 @@ + DictHeadwords + + + Search mode + + + + + This element determines how filter string will be interpreted + + + + + If checked on the symbols case will be take in account when filtering + + + + + Match case + + + + + Exports headwords to file + + + + + Export + + + + + Help + + + + + OK + + + + + Press this button to apply filter to headwords list + + + + + Apply + + + + + If checked any filter changes will we immediately applied to headwords list + + + + + Auto apply + + + + + Filter: + + + + + Filter string (fixed string, wildcards or regular expression) + + + + + Text + + + + + Wildcards + + + + + RegExp + + + + + Unique headwords total: %1, filtered: %2 + + + + + Save headwords to file + + + + + Text files (*.txt);;All files (*.*) + Ficheros de texto (*.txt);;Todos los ficheros (*.*) + + + + Export headwords... + + + + + Cancel + Cancelar + + + DictInfo @@ -540,6 +679,16 @@ Descripción: + + Show all unique dictionary headwords + + + + + Headwords + + + Edit the dictionary via command: %1 @@ -556,6 +705,74 @@ + DictServer + + + Url: + + + + + Databases: + + + + + Search strategies: + + + + + Server databases + + + + + DictServersModel + + + Enabled + Activado + + + + Name + Nombre + + + + Address + Dirección + + + + Databases + + + + + Strategies + + + + + Icon + Icono + + + + Comma-delimited list of databases +(empty string or "*" matches all databases) + + + + + Comma-delimited list of search strategies +(empty string mean "prefix" strategy) + + + + DictionaryBar Dictionary Bar @@ -577,17 +794,22 @@ Editar este grupo - + Dictionary info Información del diccionario - + + Dictionary headwords + + + + Open dictionary folder Abrir directorio de diccionario - + Edit dictionary Editar diccionario @@ -595,39 +817,39 @@ EditDictionaries - + &Sources &Fuentes - - + + &Dictionaries &Diccionarios - - + + &Groups &Grupos - + Sources changed Fuentes modificadas - + Some sources were changed. Would you like to accept the changes? Se han modificado algunas fuentes. ¿Quiere aceptar las modificaciones? - + Accept Aceptar - + Cancel Cancelar @@ -646,6 +868,92 @@ + FTS::FtsIndexing + + + None + Ninguno + + + + FTS::FullTextSearchDialog + + + Full-text search + + + + + Whole words + + + + + Plain text + + + + + Wildcards + + + + + RegExp + + + + + Max distance between words (%1-%2): + + + + + Max articles per dictionary (%1-%2): + + + + + + + Articles found: + + + + + Now indexing: + + + + + CJK symbols in search string are not compatible with search modes "Whole words" and "Plain text" + + + + + The search line must contains at least one word containing + + + + + or more symbols + + + + + No dictionaries for full-text search + + + + + FTS::Indexing + + + None + Ninguno + + + Forvo::ForvoArticleRequest @@ -684,6 +992,65 @@ + FullTextSearchDialog + + + + Search + + + + + Match case + + + + + Mode: + + + + + Articles found: + + + + + Available dictionaries in group: + + + + + Wait for indexing: + + + + + Total: + + + + + Indexed: + + + + + Now indexing: None + + + + + Cancel + Cancelar + + + + Help + + + + GermanTranslit @@ -723,43 +1090,53 @@ Groups - + + Group tabs + + + + + Open groups list + + + + Add group Añadir grupo - + Give a name for the new group: Introduzca un nombre para el nuevo grupo: - + Rename group Renombrar grupo - + Give a new name for the group: Introduzca un nuevo nombre para el grupo: - + Remove group Eliminar grupo - + Are you sure you want to remove the group <b>%1</b>? ¿Esta seguro de que quiere eliminar el grupo <b>%1</b>? - + Remove all groups Eliminar todos los grupos - + Are you sure you want to remove all the groups? ¿Esta seguro que quiere eliminar todos los grupos? @@ -860,6 +1237,54 @@ + Help::HelpWindow + + + GoldenDict help + + + + + Home + + + + + Back + Atrás + + + + Forward + Adelante + + + + Zoom In + Acercar + + + + Zoom Out + Alejar + + + + Normal Size + Tamaño normal + + + + Content + + + + + Index + + + + HistoryPaneWidget @@ -890,12 +1315,12 @@ Hunspell - + Spelling suggestions: Sugerencias ortográficas: - + %1 Morphology Morfología del %1 @@ -903,12 +1328,12 @@ HunspellDictsModel - + Enabled Activado - + Name Nombre @@ -1948,7 +2373,7 @@ LoadDictionaries - + Error loading dictionaries Error al cargar diccionarios @@ -1956,7 +2381,7 @@ Main - + Error in configuration file. Continue with default settings? Error en el fichero de configuración. ¿Continuar con la configuración por defecto? @@ -1968,78 +2393,78 @@ Navegación - + Back Atrás - + Forward Adelante - + Scan Popup Ventana emergente de búsqueda - + Show &Main Window &Mostrar Ventana Principal - - + + &Quit &Salir - + Loading... Cargando... - + Skip This Release Saltarse esta versión - + You have chosen to hide a menubar. Use %1 to show it back. Ha elegido ocultar una barra de menú. Utilice %1 para volver a mostrarla. - + Ctrl+M Ctrl+M - + Page Setup Configuración de Página - + No printer is available. Please install one first. No hay ninguna impresora disponible. Por favor instale una primero. - + Print Article Imprimir Artículo - + Article, Complete (*.html) Artículo, Completo (*.html) - + Article, HTML Only (*.html) Artículo, sólo HTML (*.html) - + Save Article As Guardar Artículo Como @@ -2048,43 +2473,43 @@ Ficheros Html (*.html *.htm) - + Error Error - + Can't save article: %1 No se puede guardar el artículo: %1 - + %1 dictionaries, %2 articles, %3 words %1 diccionarios, %2 artículos, %3 palabras - + Failed to initialize hotkeys monitoring mechanism.<br>Make sure your XServer has RECORD extension turned on. Se se ha podido iniciar la monitorización de teclas de acceso rápido.<br>Asegúrese de que su servidor X tiene activada la extensión RECORD. - + New Release Available Nueva Versión Disponible - + Version <b>%1</b> of GoldenDict is now available for download.<br>Click <b>Download</b> to get to the download page. La versión <b>%1</b> de GoldenDict está disponible para su descarga.<br>Pulse en <b>Descargar</b> para ir a la página de descarga. - + Download Descargar - - + + Look up in: Buscar en: @@ -2097,158 +2522,169 @@ Mostrar Iconos Pequeños en las Barras de Herramientas - + &Menubar Barra de &menús - + Found in Dictionaries: Encontrado en los Diccionarios: - + Pronounce Word (Alt+S) Pronunciar palabra (Alt+S) - + Show Names in Dictionary &Bar Mostrar N&ombres en Barra de Diccionarios - + Show Small Icons in &Toolbars Mostrar &Iconos Pequeños en Barras de Herramientas - + &Navigation &Navegación - + Zoom In Acercar - + Zoom Out Alejar - + Normal Size Tamaño normal - + Words Zoom In Aumentar tamaño de palabras - + Words Zoom Out Reducir tamaño de palabras - + Words Normal Size Tamaño normal de palabras - + Close current tab Cerrrar la pestaña actual - + Close all tabs Cerrar todas las pestañas - + Close all tabs except current Cerrar todas las pestañas excepto la actual - + Look up: Buscar: - + All Todo - - + + Accessibility API is not enabled La API de accesibilidad no está activada - + + String to search in dictionaries. The wildcards '*', '?' and sets of symbols '[...]' are allowed. +To find '*', '?', '[', ']' symbols use '\*', '\?', '\[', '\]' respectively + + + + Saving article... Guardando articulo... - + The main window is set to be always on top. La ventana principal está configurada para estar siempre en primer plano. - + Import history from file Importar historial de fichero - + Import error: invalid data in file Error de importación: datos incorrectos en el fichero - + History import complete Importación del historial completa - + Import error: Import error: - + Dictionary info Información de diccionarios - + + Dictionary headwords + + + + Open dictionary folder Abrir directorio de diccionarios - + Edit dictionary Editar diccionario - + Opened tabs Pestañas abiertas - + Open Tabs List Abrir lista de pestañas - + (untitled) (sin título) - + %1 - %2 %1 - %2 @@ -2257,28 +2693,28 @@ AVISO: %1 - + &Hide &Ocultar - + Export history to file Exportar historial a fichero - - + + Text files (*.txt);;All files (*.*) Ficheros de texto (*.txt);;Todos los ficheros (*.*) - + History export complete Exportación del historial completa - + Export error: Error de exportación: @@ -2288,37 +2724,42 @@ - + Welcome! ¡Bienvenido! - + &File &Fichero - + &Edit &Editar - + &Help &Ayuda - + + Search + + + + &Search Pane Panel de &búsqueda - + &Results Navigation Pane Panel de &resultados de navegación - + &History Pane Panel de &historial @@ -2327,27 +2768,27 @@ &Diccionarios... F3 - + &Preferences... &Preferencias... - + F2 F2 - + &View &Ver - + &Zoom &Ampliación - + H&istory &Historial @@ -2356,133 +2797,158 @@ Panel de navegación de resultados - + &Dictionaries... &Diccionarios... - + F3 F3 - + F4 F4 - + &Homepage &Sitio web - + &About &Acerca de - + About GoldenDict Acerca de Goldendict - + + GoldenDict reference + + + + F1 F1 - + Quit from application Salir del programa - + Ctrl+Q Ctrl+Q - + &Forum &Foro - + &Close To Tray &Сerrar en la Bandeja del Sistema - + Minimizes the window to tray Minimiza la ventana en la bandeja del sistema - + Ctrl+F4 Ctrl+F4 - + &Save Article &Guardar artículo - + Save Article Guardar artículo - + &Print &Imprimir - + Ctrl+P Ctrl+P - + Page Set&up Config&uración de Página - + Print Pre&view Vista Pre&via - + &Rescan Files Ree&scanear ahora - + &New Tab &Nueva Pestaña - + &Always on Top &Siempre en primer plano - + Always on Top Siempre en primer plano - + Ctrl+O Ctrl+O - - - + + + Menu Button Botón de Menú + + Search in page + + + + + Ctrl+F + + + + + Full-text search + + + + + Ctrl+Shift+F + + + Print Preview Vista preliminar @@ -2491,48 +2957,48 @@ Reescanear ficheros - + Ctrl+F5 Ctrl+F5 - + &Clear &Borrar - + New Tab Nueva Pestaña - + Ctrl+T Ctrl+T - + &Configuration Folder &Carpeta de configuración - - + + &Show Mo&strar - + Ctrl+H Ctrl+H - + &Export &Exportar - + &Import &Importar @@ -2544,12 +3010,12 @@ Mdx::MdxArticleRequest - + Dictionary file was tampered or corrupted Fichero de diccionario alterado o corrupto - + Failed loading article from %1, reason: %2 Fallo al cargar artículo de %1, motivo: %2 @@ -2557,7 +3023,7 @@ MediaWiki::MediaWikiArticleRequest - + XML parse error: %1 at %2,%3 Error de sintaxis XML: %1 en %2,%3 @@ -2565,7 +3031,7 @@ MediaWiki::MediaWikiWordSearchRequest - + XML parse error: %1 at %2,%3 Error de sintaxis XML: %1 en %2,%3 @@ -2573,22 +3039,22 @@ MediaWikisModel - + Enabled Activado - + Name Nombre - + Address Dirección - + Icon Icono @@ -2601,88 +3067,94 @@ Formulario - + Dictionary order: Orden de los diccionarios: - - - - ... - ... + ... - + Inactive (disabled) dictionaries: Diccionarios no activos (deshabilitados): - + Dictionary information Información de diccionarios - + Name: Nombre: - + Total articles: Número de artículos: - + Total words: Número de palabras: - + Translates from: Idioma origen: - + Translates to: Idioma destino: - + Description: Descripción: - + Files comprising this dictionary: Ficheros que componen este diccionario: - + Adjust the order by dragging and dropping items in it. Drop dictionaries to the inactive group to disable their use. Ajuste el orden arrastrando y soltando diccionarios. Arrastre diccionarios al grupo de no activos para deshabilitar su uso. - + Sort by name Ordenar por nombre - + Sort by languages Ordenar por lenguas + + + Dictionary headwords + + + + + Dictionaries active: %1, inactive: %2 + + PathsModel - + Path Ruta - + Recursive Recursiva @@ -2792,14 +3264,14 @@ Al hacer doble clic sobre una palabra ésta se traduce - + Chooses whether the scan popup mode is on by default or not. If checked, the program would always start with the scan popup active. Elige si la ventana emergente de búsqueda está habilitada por defecto o no. Si se marca, el programa empezará siempre con la ventana emergente de búsqueda activada. - + Normally, in order to activate a popup you have to maintain the chosen keys pressed while you select a word. With this enabled, the chosen keys may also @@ -2810,27 +3282,27 @@ pulsarse un poco después de realizar la selección. - + Hotkeys Teclas de acceso rápido - + Use the following hotkey to show or hide the main window: Use la siguiente tecla de acceso rápido para mostrar u ocultar la ventana principal: - + Use the following hotkey to translate a word from clipboard: Use la siguiente tecla de acceso rápido para traducir una palabra desde el portapapeles: - + The hotkeys are global and work from any program and within any context as long as GoldenDict is running in background. Las teclas de acceso rápido son globales y funcionan desde cualquier programa y en cualquier situación, siempre que GoldenDict se esté ejecutando en segundo plano. - + &Scan Popup &Ventana emergente de búsqueda @@ -2882,17 +3354,22 @@ Estilo suplementario add-on): - + + Help language + + + + Adjust this value to avoid huge context menus. Ajuste este valor para evitar menús contextuales demasiado grandes. - + Context menu dictionaries limit: Límite de diccionarios para el menú contextual: - + When enabled, a translation popup window would be shown each time you point your mouse on any word on the screen (Windows) or select any word with mouse (Linux). When enabled, you can switch it on and @@ -2904,134 +3381,134 @@ o desde el icono de la bandeja. - + Enable scan popup functionality Activa la funcionalidad de ventana emergente de búsqueda - + Start with scan popup turned on Empezar con la ventana emergente de búsqueda activada - + With this enabled, the popup would only show up if all chosen keys are in the pressed state when the word selection changes. Al activar esta opción, la ventana emergente aparecerá si se pulsan todas las teclas elegidas cuando cambia la palabra seleccionada. - + Only show popup when all selected keys are kept pressed: Mostrar la ventana emergente sólo si todas las teclas seleccionadas se mantienen pulsadas: - + Left Ctrl only Sólo Ctrl izquierda - + Left Ctrl Ctrl Izquierda - + Right Shift only Sólo Mayúsculas derecha - + Right Shift Mayúsculas derecha - + Alt key Tecla Alt - + Alt Alt - + Ctrl key Tecla Ctrl - + Ctrl Ctrl - + Left Alt only Sólo Alt izquierda - + Left Alt Alt izquierda - + Shift key Tecla mayúsculas - + Shift Mayúsculas - + Right Alt only Sólo Alt derecha - + Right Alt Alt derecha - + Right Ctrl only Sólo Ctrl derecha - + Right Ctrl Ctrl derecha - + Left Shift only Sólo Shift izquierda - + Left Shift Shift izquierda - + Windows key or Meta key Tecla Windows o tecla Meta - + Win/Meta Win/Meta - + Keys may also be pressed afterwards, within También se pueden pulsar las teclas despues, dentro de - + To avoid false positives, the keys are only monitored after the selection's done for a limited amount of seconds, which is specified here. @@ -3040,54 +3517,89 @@ de segundos, que se especifica aquí. - + secs segundos - + Send translated word to main window instead of to show it in popup window Enviar palabra traducida a la ventana principal en lugar de mostrarla en la ventana emergente - + Send translated word to main window Enviar palabra traducida a la ventana principal - + Play audio files via FFmpeg(libav) and libao Reproducir ficheros de audio con FFmpeg(libav) y libao - + Use internal player Utilizar reproductor interno - + + System proxy + + + + + Custom proxy + + + + + Custom settings + + + + Some sites detect GoldenDict via HTTP headers and block the requests. Enable this option to workaround the problem. Algunos sitios web detectan GoldenDict mediante las cabeceras HTTP y bloquean las peticiones. Active esta opción para evitar el problema. - + Do not identify GoldenDict in HTTP headers Impedir la identificación de GoldenDict a partir de las cabeceras HTTP - + + Full-text search + + + + + Allow full-text search for: + + + + + Don't search in dictionaries containing more than + + + + + articles (0 - unlimited) + + + + Ad&vanced A&vanzado - + ScanPopup extra technologies Opciones avanzadas de ventana emergente de búsqueda - + Try to use IAccessibleEx technology to retrieve word under cursor. This technology works only with some programs that support it (for example Internet Explorer 9). @@ -3098,12 +3610,12 @@ No hace falta seleccionar esta opción si no utiliza estos programas. - + Use &IAccessibleEx Utilizar &IAccessibleEx - + Try to use UI Automation technology to retrieve word under cursor. This technology works only with some programs that support it. It is not needed to select this option if you don't use such programs. @@ -3112,12 +3624,12 @@ No hace falta seleccionar esta opción si no utiliza estos programas. - + Use &UIAutomation Utilizar &UIAutomation - + Try to use special GoldenDict message to retrieve word under cursor. This technology works only with some programs that support it. It is not needed to select this option if you don't use such programs. @@ -3126,87 +3638,87 @@ No necesita seleccionar esta opción si no utiliza tales programas. - + Use &GoldenDict message Utilizar &GoldenDict message - + History Historial - + Turn this option on to store history of the translated words Activar esta opción para almacenar el historial de palabras traducidas - + Store &history Almacenar &historial - + Specify the maximum number of entries to keep in history. Especificar el máximo número de entradas a guardar en el historial. - + Maximum history size: Tamaño máximo del historial: - + History saving interval. If set to 0 history will be saved only during exit. Intervalo de tiempo para guardar el historial. Si se pone a 0, el historial se guardará sólo al terminar. - + Save every Guardar cada - + minutes minutos - + Articles Artículos - + Turn this option on to always expand optional parts of articles Activar esta opción para desplegar siempre las partes opcionales de los artículos - + Expand optional &parts Desplegar &partes opcionales - + Select this option to automatic collapse big articles Seleccionar esta opción para mostrar plegados los artículos muy grandes - + Collapse articles more than Mostrar plegados los artículos con más de - + Articles longer than this size will be collapsed Los artículos con una longitud mayor que esta se mostrarán plegados - + symbols símbolos - + <!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; } @@ -3219,27 +3731,27 @@ <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" color:#ff0000;">Nota: parece que está utilizando una versión del servidor X de X.Org para la que no funciona la extensión RECORD. Las teclas de acceso rápido en GoldenDict seguramente no funcionarán. Esto debe arreglarse en el propio servidor. Por favor, diríjase al siguiente </span><a href="https://bugs.freedesktop.org/show_bug.cgi?id=20500"><span style=" text-decoration: underline; color:#0000ff;">informe de error</span></a><span style=" color:#ff0000;"> y deje un comentario si así lo desea.</span></p></body></html> - + &Audio &Аudio - + Pronunciation Pronunciación - + Auto-pronounce words in main window Pronunciar palabras automáticamente en la ventana principal - + Auto-pronounce words in scan popup Pronunciar palabras automáticamente en la ventana emergente de búsqueda - + Playback Reproducción @@ -3264,59 +3776,59 @@ Reproducir con Phonon - + Use any external program to play audio files Utilizar cualquier programa externo para reproducir ficheros de audio - + Use external program: Utilizar un programa externo: - + &Network &Red - + Enable if you wish to use a proxy server for all program's network requests. Activar si desea utilizar un servidor proxy para todos los accesos a la red del programa. - + Use proxy server Utilizar un servidor proxy - + Type: Tipo: - + Host: Host: - + Port: Puerto: - + User: Usuario: - + Password: Contraseña: - + Enabling this would make GoldenDict block most advertisements by disallowing content (images, frames) not originating from the site you are browsing. If some site breaks because of this, try disabling this. @@ -3325,12 +3837,12 @@ que está accediendo. Si algunos sitios web dejan de funcionar, intente desactivar esta opción. - + Disallow loading content from other sites (hides most advertisements) No permitir la descarga de contenido desde otros sitios (oculta la mayoría de los anuncios) - + Enabling this would allow to listen to sound pronunciations from online dictionaries that rely on Flash or other web plugins. Plugin must be installed for this option to work. @@ -3339,12 +3851,12 @@ El plugin debe estar instalado para que funcione esta opción. - + Enable web plugins Activar plugins para la web - + When this is enabled, the program periodically checks if a new, updated version of GoldenDict is available for download. If it is so, the program @@ -3356,42 +3868,43 @@ para su descarga. - + Check for new program releases periodically Comprobar periódicamente la existencia de nuevas versiones del programa - + System default Idioma por defecto del sistema - + + Default Por defecto - + Modern Moderno - + Lingvo Lingvo - + Babylon Babylon - + Lingoes Lingoes - + Lingoes-Blue Lingoes-Blue @@ -3400,12 +3913,12 @@ Reproducir con DirectShow - + Changing Language Cambiando Idioma - + Restart the program to apply the language change. Vuelva a ejecutar el programa para hacer efectivo el cambio de idioma. @@ -3413,27 +3926,27 @@ ProgramTypeEditor - + Audio Audio - + Plain Text Texto simple - + Html Html - + Prefix Match Coincidencia con prefijo - + Unknown Desconocido @@ -3459,27 +3972,27 @@ ProgramsModel - + Enabled Activado - + Type Tipo - + Name Nombre - + Command Line Línea de comandos - + Icon Icono @@ -3487,12 +4000,14 @@ QObject - + + Article loading error Error al cargar artículo - + + Article decoding error Error al decodificar artículo @@ -3603,18 +4118,18 @@ ResourceToSaveHandler - - + + ERROR: %1 ERROR: %1 - + Resource saving error: Error al guardar recurso: - + The referenced resource failed to download. No se ha podido descargar recurso referenciado. @@ -3622,12 +4137,12 @@ Romaji - + Hepburn Romaji for Hiragana Hepburn Romaji para Hiragana - + Hepburn Romaji for Katakana Hepburn Romaji para Katakana @@ -3652,12 +4167,12 @@ palabra - + Back Atrás - + Forward Adelante @@ -3670,43 +4185,43 @@ Alt+M - + Pronounce Word (Alt+S) Pronunciar palabra (Alt+S) - + Alt+S Alt+S - + Send word to main window (Alt+W) Enviar palabra a la ventana principal (Alt+W) - + Alt+W Alt+W - + Shows or hides the dictionary bar Muestra u oculta la barra de diccionarios - + Use this to pin down the window so it would stay on screen, could be resized or managed in other ways. Utilice esta opción para fijar la ventana de manera que permanezca inmóvil en la pantalla, se pueda redimensionar o se pueda manipular de otras maneras. - - - - - + + + + + ... ... @@ -3715,8 +4230,8 @@ GoldenDict - - + + %1 - %2 %1 - %2 @@ -3724,17 +4239,17 @@ SoundDirsModel - + Path Ruta - + Name Nombre - + Icon Icono @@ -3742,45 +4257,47 @@ Sources - + Text to Speech Síntesis de Voz - + (not available in portable version) (no disponible en la versión portátil) - - - + + + Choose a directory Elija un directorio - - - - - + + + + + + Confirm removal Confirmar la eliminación - - + + Remove directory <b>%1</b> from the list? Eliminar el directorio <b>%1</b> de la lista? - - + + + Remove site <b>%1</b> from the list? Eliminar el sitio <b>%1</b> de la lista? - + Remove program <b>%1</b> from the list? Eliminar el programa <b>%1</b> de la lista? @@ -3799,7 +4316,8 @@ - + + &Add... Añad&ir... @@ -3808,7 +4326,8 @@ - + + &Remove &Eliminar @@ -3877,7 +4396,7 @@ También puede utilizar %GD1251% para CP1251, %GDISO1% para ISO 8859-1. - + Programs Programas @@ -3886,27 +4405,27 @@ Cualquier programa externo. La cadena %GDWORD% se reemplazará por la palabra buscada. La palabra se enviará también a la entrada estándar. - + Forvo Forvo - + Live pronunciations from <a href="http://www.forvo.com/">forvo.com</a>. The site allows people to record and share word pronunciations. You can listen to them from GoldenDict. Pronunciación de palabras de <a href="http://www.forvo.com/">forvo.com</a>. Este sitio permite a la gente grabar y compartir pronunciaciones de palabras. Puede escucharlas desde GoldenDict. - + Enable pronunciations from Forvo Activar pronunciaciones desde Forvo - + API Key: clave de la API: - + Use of Forvo currently requires an API key. Leave this field blank to use the default key, which may become unavailable in the future, or register on the site to get your own key. @@ -3915,7 +4434,7 @@ o regístrese en el sitio para obtener su propia clave. - + Get your own key <a href="http://api.forvo.com/key/">here</a>, or leave blank to use the default one. Obtenga su propia clave <a href="http://api.forvo.com/key/">aquí</a>, or déjela en blanco para usar la clave por defecto. @@ -3945,79 +4464,89 @@ %GDBIG5% para Big-5, %GDBIG5HKSCS% para Big5-HKSCS, %GDGBK% para GBK y GB18030, y %GDSHIFTJIS% para Shift-JIS. + + DICT servers + + + + DICT servers: + + + + Any external programs. A string %GDWORD% will be replaced with the query word. If such string is not presented, the word will be fed into standard input. Se puede especificar cualquier programa externo. Se sustituirá el texto %GDWORD% por la palabra a buscar. Si este texto no está presente, se enviará la palabra a la entrada estándar. - + Language codes (comma-separated): Códigos de idioma (separados por comas): - + List of language codes you would like to have. Example: "en, ru". Lista de códigos de lenguaje que desea. Ejemplo: "en, ru". - + Full list of language codes is available <a href="http://www.forvo.com/languages-codes/">here</a>. La lista completa de códigos de lenguaje está disponible <a href="http://www.forvo.com/languages-codes/">aquí</a>. - + Transliteration Transliteración - + Russian transliteration Transliteración del ruso - + Greek transliteration Transliteración del griego - + German transliteration Transliteración del alemán - + Belarusian transliteration Transliteración del bielorruso - + Enables to use the Latin alphabet to write the Japanese language Permite utilizar el alfabeto latino para escribir en el idioma japonés - + Japanese Romaji Romaji Japonés - + Systems: Sistemas: - + The most widely used method of transcription of Japanese, based on English phonology El método más utilizado para la transcripción del japonés, basado en la fonología del inglés - + Hepburn Hepburn - + The most regular system, having a one-to-one relation to the kana writing systems. Standardized as ISO 3602 @@ -4028,12 +4557,12 @@ Todavía no implementado en GoldenDict. - + Nihon-shiki Nihon-shiki - + Based on Nihon-shiki system, but modified for modern standard Japanese. Standardized as ISO 3602 @@ -4044,32 +4573,32 @@ Todavía no implementado en GoldenDict. - + Kunrei-shiki Kunrei-shiki - + Syllabaries: Silabarios: - + Hiragana Japanese syllabary Silabario japonés Hiragana - + Hiragana Hiragana - + Katakana Japanese syllabary Silabario japonés Katakana - + Katakana Katakana @@ -4209,22 +4738,22 @@ WebSitesModel - + Enabled Activado - + Name Nombre - + Address Dirección - + Icon Icono @@ -4232,7 +4761,7 @@ WordFinder - + Failed to query some dictionaries. No se ha podido consultar algunos diccionarios. diff -Nru goldendict-1.5.0~git20131003/locale/fa_IR.ts goldendict-1.5.0~git20150923/locale/fa_IR.ts --- goldendict-1.5.0~git20131003/locale/fa_IR.ts 1970-01-01 00:00:00.000000000 +0000 +++ goldendict-1.5.0~git20150923/locale/fa_IR.ts 2015-09-23 08:26:24.000000000 +0000 @@ -0,0 +1,4650 @@ + + + + + About + + + About + درباره + + + + GoldenDict dictionary lookup program, version + برنامه جست‌وجوگر واژه‌نامه گلدن‌دیکت، نسخه + + + + (c) 2008-2013 Konstantin Isakov (ikm@goldendict.org) + © ۲۰۰۸-۲۰۱۳ کنستانتین ایساکوف (ikm@goldendict.org) + + + + Licensed under GNU GPLv3 or later + تحت مجوز گنو GPLv3 یا بالاتر + + + + Credits: + دست اندرکاران: + + + + [Unknown] + [ناشناخته] + + + + Based on Qt %1 (%2, %3 bit) + برپایه‌ی کیوتی %1 (%2، %3 بیت) + + + + ArticleMaker + + + Expand article + گستراندن بند + + + + Collapse article + جمع‌کردن بند + + + + No translation for <b>%1</b> was found in group <b>%2</b>. + هیچ ترجمه‌ای برای <b>%1</b> در گروه <b>%2</b> یافت نشد. + + + + No translation was found in group <b>%1</b>. + هیچ ترجمه‌ای در گروه <b>%1</b> یافت نشد. + + + + Welcome! + خوش آمدید! + + + + <h3 align="center">Welcome to <b>GoldenDict</b>!</h3><p>To start working with the program, first visit <b>Edit|Dictionaries</b> to add some directory paths where to search for the dictionary files, set up various Wikipedia sites or other sources, adjust dictionary order or create dictionary groups.<p>And then you're ready to look up your words! You can do that in this window by using a pane to the left, or you can <a href="Working with popup">look up words from other active applications</a>. <p>To customize program, check out the available preferences at <b>Edit|Preferences</b>. All settings there have tooltips, be sure to read them if you are in doubt about anything.<p>Should you need further help, have any questions, suggestions or just wonder what the others think, you are welcome at the program's <a href="http://goldendict.org/forum/">forum</a>.<p>Check program's <a href="http://goldendict.org/">website</a> for the updates. <p>(c) 2008-2013 Konstantin Isakov. Licensed under GPLv3 or later. + <h3 dir="RTL" align="center">به گلدن‌دیکت <b>خوش آمدید</b>!</h3><p dir="RTL">برای آغاز به کار با برنامه، نخست<b> ویرایش|واژه‌نامه‌ها</b> را ببینید. برای افزودن مسیرهای شاخه برای یافتن پرونده‌های واژه‌نامه، راه‌اندازی پایگاه‌های گوناگون ویکی‌پدیا یا دیگر منابع، ترتیب واژه‌نامه را تنظیم کنید یا گروه‌های واژه‌نامه بسازید<p dir="RTL">اکنون شما آماده‌اید تا واژه‌هایتان را بیابید! شما می‌توانید در قاب سمت چپ در این پنجره یا <a href="Working with popup">واژه‌هایتان را از دیگر پنجره‌های فعال بیابید</a>. <p dir="RTL">برای شخصی‌سازی برنامه، ترجیحات موجود در <b>ویرایش|ترجیحات</b> را بررسی کنید. همه تنظیمات راهنمای ابزار دارند، اگر از چیزی مطمئن نیستید آن‌ها را بخوانید.<p dir="RTL">اگر به راهنمایی بیش‌تری نیاز دارید یا به نظرهای دیگران علاقه‌مند هستید، بفرمایید به <a href="http://goldendict.org/forum/">انجمن برنامه</a>.<p dir="RTL"> برای به‌روزرسانی‌ها <a href="http://goldendict.org/">وب‌سایت برنامه</a> را بررسی کنید.<p dir="RTL">© ۲۰۰۸-۲۰۱۳ کنستانتین ایساکوف. تحت لیسانس GPLv3 یا بالاتر. + + + + Working with popup + کار با پنجره واشو + + + + <h3 align="center">Working with the popup</h3>To look up words from other active applications, you would need to first activate the <i>"Scan popup functionality"</i> in <b>Preferences</b>, and then enable it at any time either by triggering the 'Popup' icon above, or by clicking the tray icon down below with your right mouse button and choosing so in the menu you've popped. + <h3 dir="RTL" align="center">کار کردن با واشو</h3><p dir="RTL">برای یافتن واژه‌ها از دیگر پنجره‌های فعال، شما نخست باید به‌کار اندازید <i>«قابلیت پویش واشو»</i> در <b>ترجیحات</b>، و سپس آن را در هر زمان با کلیک نماد بالای «واشو»، یا کلیک نماد سینی سیستم با کلیک راست موش و برگزیدن در منویی که بالا آمده است به‌کار اندازید. + + + + Then just stop the cursor over the word you want to look up in another application, and a window would pop up which would describe it to you. + <p dir="RTL">سپس تنها نشان‌گر را روی واژه در برنامه دیگری که می‌خواهید بیابید نگه‌دارید، و یک پنجره واشو واژه را برای شما شرح می‌دهد. + + + + Then just select any word you want to look up in another application by your mouse (double-click it or swipe it with mouse with the button pressed), and a window would pop up which would describe the word to you. + <p dir="RTL">سپس تنها هر واژه در برنامه دیگری را که می‌خواهید بیابید با موش برگزینید (دوبار کلیک یا جاروب کردن با موش با کلید فشرده شده)، و یک پنجره واشو واژه را برای شما شرح می‌دهد. + + + + (untitled) + (بی‌عنوان) + + + + (picture) + (عکس) + + + + ArticleRequest + + + Expand article + گستراندن بند + + + + From + از + + + + Collapse article + جمع‌کردن بند + + + + Query error: %1 + خطای جست‌وجو: %1 + + + + Close words: + واژه‌های نزدیک: + + + + Compound expressions: + عبارت‌های ترکیبی: + + + + Individual words: + واژه‌های جداگانه: + + + + ArticleView + + + Form + فرم + + + + about:blank + درباره:تهی + + + + Find: + یافتن: + + + + x + x + + + + + &Previous + پ&یشین + + + + + &Next + &پسین + + + + Ctrl+G + Ctrl+G + + + + Highlight &all + پررنگ گردن &همه + + + + &Case Sensitive + &حساس به کوچکی و بزرگی + + + + Select Current Article + برگزیدن بند جاری + + + + Copy as text + رونوشت مانند متن + + + + Inspect + بازرسی کردن + + + + Resource + منبع + + + + Audio + شنیداری + + + + TTS Voice + گفتار TTS + + + + Picture + عکس + + + + Video + ویدیو + + + + Video: %1 + ویدیوی: %1 + + + + Definition from dictionary "%1": %2 + تعریف از واژه‌نامه "%1": %2 + + + + Definition: %1 + تعریف: %1 + + + + + The referenced resource doesn't exist. + منبع ارجاع شده وجود ندارد. + + + + The referenced audio program doesn't exist. + برنامه شنیداری ارجاع شده وجود ندارد. + + + + + ERROR: %1 + خطای: %1 + + + + &Open Link + &باز کردن پیوند + + + + Open Link in New &Tab + باز کردن پیوند در &زیانه تازه + + + + Open Link in &External Browser + باز کردن پیوند در &مرورگر بیرونی + + + + Save &image... + ذخیره &تصویر... + + + + Save s&ound... + ذخیره آ&وا... + + + + &Look up "%1" + &یافتن "%1" + + + + Look up "%1" in &New Tab + یافتن "%1" در &زبانه تازه + + + + Send "%1" to input line + فرستادن "%1" به خط ورودی + + + + + &Add "%1" to history + &افزودن "%1" به پیشینه + + + + Look up "%1" in %2 + یافتن "%1" در %2 + + + + Look up "%1" in %2 in &New Tab + یافتن "%1" در %2 در &زبانه تازه + + + + Save sound + ذخیره کردن آوا + + + + Sound files (*.wav *.ogg *.mp3 *.mp4 *.aac *.flac *.mid *.wv *.ape);;All files (*.*) + پرونده‌های آوا (*.wav *.ogg *.mp3 *.mp4 *.aac *.flac *.mid *.wv *.ape);;همه پرونده‌ها (*.*) + + + + Save image + ذخیره کردن تصویر + + + + Image files (*.bmp *.jpg *.png *.tif);;All files (*.*) + پرونده‌های تصویر (*.bmp *.jpg *.png *.tif);;همه پرونده‌ها (*.*) + + + + Failed to run a player to play sound file: %1 + خطا در اجرای یک پخش‌کننده برای پخش پرونده آوا: %1 + + + + Failed to create temporary file. + ساخت پرونده موقت شکست خورد. + + + + Failed to auto-open resource file, try opening manually: %1. + باز کردن خودکار پرونده منبع شکست خورد، تلاش کنید به‌صورت دستی بازکنید: %1. + + + + WARNING: %1 + هشدار: %1 + + + + The referenced resource failed to download. + بارگیری منبع ارجاع شده شکست خورد. + + + + WARNING: FFmpeg Audio Player: %1 + هشدار: پخش‌کننده شنیداری FFmpeg : %1 + + + + BelarusianTranslit + + + Belarusian transliteration from latin to cyrillic (classic orthography) + نویسه‌گردانی بلاروسی از لاتین به سیریلیک (درست‌نویسی سنتی) + + + + Belarusian transliteration from latin to cyrillic (school orthography) + نویسه‌گردانی بلاروسی از لاتین به سیریلیک (درست‌نویسی آموزشی) + + + + Belarusian transliteration (smoothes out the difference +between classic and school orthography in cyrillic) + نویسه‌گردانی بلاروسی (ملایم کردن تفاوت بین +درست‌نویسی سنتی و آموزشی در سیریلیک) + + + + Dialog + + + Proxy authentication required + + + + + You need to supply a Username and a Password to access via proxy + + + + + Username: + + + + + Password: + گذرواژه: + + + + DictGroupWidget + + + Form + فرم + + + + Group icon: + نشانه گروه: + + + + Shortcut: + میان‌بر: + + + + None + هیج کدام + + + + From file... + از پرونده... + + + + Choose a file to use as group icon + یک پرونده را برای نشانه گروه برگزینید + + + + Images + تصویرها + + + + All files + همه پرونده‌ها + + + + Error + خطا + + + + Can't read the specified image file. + پرونده تصویری مشخص شده را نمی‌تواند بخواند. + + + + DictGroupsWidget + + + + + + Dictionaries: + واژه‌نامه‌ها: + + + + Confirmation + تایید + + + + Are you sure you want to generate a set of groups based on language pairs? + آیا شما از درخواست ایجاد یک مجموعه از گروه‌ها برپایه جفت‌های زبان اطمینان دارید؟ + + + + Unassigned + واگذار نشده + + + + Combine groups by source language to "%1->" + گروه‌ها را با زبان منبع ترکیب کنید به "%1->" + + + + Combine groups by target language to "->%1" + گروه‌ها را با زبان هدف ترکیب کنید به "%1->" + + + + Make two-side translate group "%1-%2-%1" + گروه ترجمه دوطرفه بسازید "%1-%2-%1" + + + + + Combine groups with "%1" + گروه‌ها را ترکیب کنید با "%1" + + + + DictHeadwords + + + Search mode + شیوه جست‌وجو + + + + This element determines how filter string will be interpreted + این رکن تعیین می‌کند که رشته پالایه چگونه تفسیر شود + + + + If checked on the symbols case will be take in account when filtering + اگر به‌کار افتاده باشد برای نمادها در هنگام پالایش پذیرفته می‌شود + + + + Match case + همتا بودن مورد + + + + Exports headwords to file + صادر کردن سرواژه‌ها به پرونده + + + + Export + صادر کردن + + + + Help + + + + + OK + خوب + + + + Press this button to apply filter to headwords list + برای اعمال پالایه لیست سرواژه‌ها این کلید را فشار دهید + + + + Apply + اعمال کردن + + + + If checked any filter changes will we immediately applied to headwords list + اگر به‌کار افتاده باشد هر تغییر پالایه بی‌درنگ بر روی لیست سرواژه‌ها اعمال می‌گردد + + + + Auto apply + اعمال خودکار + + + + Filter: + پالایه: + + + + Filter string (fixed string, wildcards or regular expression) + رشته پالایه (رشته ثابت، نویسه‌های عام یا عبارت منظم) + + + + Text + متن + + + + Wildcards + نویسه‌های عام + + + + RegExp + RegExp + + + + Unique headwords total: %1, filtered: %2 + جمع سرواژه‌های یکتا: %1، پالایش شده: %2 + + + + Save headwords to file + ذخیره سرواژه‌ها در پرونده + + + + Text files (*.txt);;All files (*.*) + پرونده‌های متنی (*.txt);;همه پرونده‌ها (*.*) + + + + Export headwords... + صادر کردن سرواژه‌ها... + + + + Cancel + لغو + + + + DictInfo + + + Total articles: + مجموع بندها: + + + + Translates from: + ترجمه از: + + + + Total words: + مجموع واژه‌ها: + + + + Translates to: + ترجمه به: + + + + Open folder + بازکردن پوشه + + + + Edit dictionary + ویرایش واژه‌نامه + + + + Files comprising this dictionary: + پرونده‌های دربرگیرنده این واژه‌نامه: + + + + Description: + شرح: + + + + Show all unique dictionary headwords + همه سرواژه‌های واژه‌نامه یکتا را نشان بده + + + + Headwords + سرواژه‌ها + + + + Edit the dictionary via command: +%1 + ویرایش واژه‌نامه با دستور: %1 + + + + DictListModel + + + %1 entries + %1 ورودی + + + + DictServer + + + Url: + + + + + Databases: + + + + + Search strategies: + + + + + Server databases + + + + + DictServersModel + + + Enabled + به‌کار افتاده + + + + Name + نام + + + + Address + آدرس + + + + Databases + + + + + Strategies + + + + + Icon + نشانه + + + + Comma-delimited list of databases +(empty string or "*" matches all databases) + + + + + Comma-delimited list of search strategies +(empty string mean "prefix" strategy) + + + + + DictionaryBar + + + &Dictionary Bar + نوار &واژه‌نامه + + + + Extended menu with all dictionaries... + منوی گسترش یافته با همه واژه‌نامه‌ها... + + + + Edit this group + ویرایش این گروه + + + + Dictionary info + اطلاعات واژه‌نامه + + + + Dictionary headwords + سرواژه‌های واژه‌نامه + + + + Open dictionary folder + بازکردن پوشه واژه‌نامه + + + + Edit dictionary + ویرایش واژه‌نامه + + + + EditDictionaries + + + Dictionaries + واژه‌نامه‌ها + + + + &Sources + &منابع + + + + + &Dictionaries + &واژه‌نامه‌ها + + + + + &Groups + &گروه‌ها + + + + Sources changed + منابع تغییر کردند + + + + Some sources were changed. Would you like to accept the changes? + برخی منابع تغییر کرده‌اند. شما می‌خواهید تغییرات را بپذیرید؟ + + + + Accept + پذیرش + + + + Cancel + لغو + + + + ExternalViewer + + + the viewer program name is empty + نام برنامه نمایش‌گر تهی است + + + + FTS::FtsIndexing + + + None + + + + + FTS::FullTextSearchDialog + + + Full-text search + + + + + Whole words + + + + + Plain text + + + + + Wildcards + نویسه‌های عام + + + + RegExp + RegExp + + + + Max distance between words (%1-%2): + + + + + Max articles per dictionary (%1-%2): + + + + + + + Articles found: + + + + + Now indexing: + + + + + CJK symbols in search string are not compatible with search modes "Whole words" and "Plain text" + + + + + The search line must contains at least one word containing + + + + + or more symbols + + + + + No dictionaries for full-text search + + + + + FTS::Indexing + + + None + + + + + Forvo::ForvoArticleRequest + + + XML parse error: %1 at %2,%3 + خطای تجزیه XML: %1 در %2،%3 + + + + Added %1 + افزوده شد %1 + + + + by + به‌وسیله + + + + Male + مرد + + + + Female + زن + + + + from + از + + + + Go to Edit|Dictionaries|Sources|Forvo and apply for our own API key to make this error disappear. + به ویرایش|واژه‌نامه‌ها|منابع|فوروُ بروید و کلید API مربوط به ما را بپذیرید تا این خطا ناپدید شود. + + + + FullTextSearchDialog + + + + Search + + + + + Match case + همتا بودن مورد + + + + Mode: + + + + + Articles found: + + + + + Available dictionaries in group: + + + + + Wait for indexing: + + + + + Total: + + + + + Indexed: + + + + + Now indexing: None + + + + + Cancel + لغو + + + + Help + + + + + GermanTranslit + + + German Transliteration + نویسه‌گردانی آلمانی + + + + GreekTranslit + + + Greek Transliteration + نویسه‌گردانی یونانی + + + + GroupComboBox + + + Choose a Group (Alt+G) + یک گروه برگزینید (Alt+G) + + + + GroupSelectorWidget + + + Form + فرم + + + + Look in + جست‌وجو در + + + + Groups + + + Dictionaries available: + واژه‌نامه‌های در دست‌رس: + + + + Add selected dictionaries to group (Ins) + افزودن واژه‌نامه‌های برگزیده شده به گروه (درج) + + + + > + > + + + + Ins + درج + + + + Remove selected dictionaries from group (Del) + حذف واژه‌نامه‌های برگزیده شده از گروه (حذف) + + + + < + < + + + + Del + حذف + + + + Groups: + گروه‌ها: + + + + Tab 2 + زبانه ۲ + + + + Create new dictionary group + ساخت گروه واژه‌نامه تازه + + + + &Add group + &افزودن گروه + + + + Create language-based groups + ساخت گروه‌های زبان-پایه + + + + Auto groups + گروه‌های خودکار + + + + Rename current dictionary group + تغییرنام گروه واژه‌نامه جاری + + + + Re&name group + &تغییرنام گروه + + + + Remove current dictionary group + حذف گروه واژه‌نامه جاری + + + + &Remove group + &حذف گروه + + + + Remove all dictionary groups + حذف همه گروه‌های واژه‌نامه + + + + + Remove all groups + حذف همه گروه‌ها + + + + Drag&drop dictionaries to and from the groups, move them inside the groups, reorder the groups using your mouse. + کشیدن و &رهاکردن واژه‌نامه‌ها به و از گروه‌ها، جابه‌جایی آن‌ها درون گروه‌ها، مرتب‌سازی دوباره گروه‌ها به‌وسیله موش. + + + + Group tabs + زبانه‌های گروه + + + + Open groups list + لیست گروه‌ها را باز کن + + + + Add group + افزودن گروه + + + + Give a name for the new group: + یک نام برای گروه تازه بدهید: + + + + Rename group + تغییرنام گروه + + + + Give a new name for the group: + یک نام تازه برای گروه بدهید: + + + + Remove group + حذف گروه + + + + Are you sure you want to remove the group <b>%1</b>? + آیا شما از حذف گروه <b>%1</b> اطمینان دارید؟ + + + + Are you sure you want to remove all the groups? + آیا شما از حذف همه گروه‌ها اطمینان دارید؟ + + + + Help::HelpWindow + + + GoldenDict help + + + + + Home + + + + + Back + پس + + + + Forward + پیش + + + + Zoom In + بزرگ‌نمایی به درون + + + + Zoom Out + بزرگ‌نمایی به بیرون + + + + Normal Size + اندازه عادی + + + + Content + + + + + Index + + + + + HistoryPaneWidget + + + &Delete Selected + &حذف برگزیده‌ها + + + + Copy Selected + رونوشت برگزیده‌ها + + + + History: + پیشینه: + + + + %1/%2 + %1/%2 + + + + History size: %1 entries out of maximum %2 + اندازه پیشینه: %1 ورودی فراتر از بیشینه %2 + + + + Hunspell + + + Spelling suggestions: + پیش‌نهادهای درست‌نویسی: + + + + %1 Morphology + %1 ریخت‌شناسی + + + + HunspellDictsModel + + + Enabled + به‌کار افتاده + + + + Name + نام + + + + Initializing + + + GoldenDict - Initializing + گلدن‌دیکت - برپاسازی + + + + + Please wait while indexing dictionary + لطفا تا فهرست‌سازی واژه‌نامه صبر کنید + + + + Dictionary Name + نام واژه‌نامه + + + + Please wait... + لطفا منتظر بمانید... + + + + Language + + + Afar + عفری + + + + Abkhazian + آبخازی + + + + Avestan + اوستایی + + + + Afrikaans + آفریقایی + + + + Akan + آکانی + + + + Amharic + آمهاری + + + + Aragonese + اراگونی + + + + Arabic + عربی + + + + Assamese + اسامی + + + + Avaric + آواری + + + + Aymara + آیماری + + + + Azerbaijani + آذری + + + + Bashkir + باشکیری + + + + Belarusian + بلاروسی + + + + Bulgarian + بلغاری + + + + Bihari + بیهاری + + + + Bislama + بیسلامی + + + + Bambara + بامباری + + + + Bengali + بنگالی + + + + Tibetan + تبتی + + + + Breton + بریتونی + + + + Bosnian + بوسنی + + + + Catalan + کاتالانی + + + + Chechen + چچنی + + + + Chamorro + چامورو + + + + Corsican + کورسیکی + + + + Cree + کری + + + + Czech + چکی + + + + Church Slavic + کلیسا اسلاوی + + + + Chuvash + چوواشی + + + + Welsh + ولزی + + + + Danish + دانمارکی + + + + German + آلمانی + + + + Divehi + دایوهایی + + + + Dzongkha + زونخایی + + + + Ewe + ایوی + + + + Greek + یونانی + + + + English + انگلیسی + + + + Esperanto + اسپرانتور + + + + Spanish + اسپانیایی + + + + Estonian + استونیایی + + + + Basque + باسکی + + + + Persian + فارسی + + + + Fulah + فولاهی + + + + Finnish + فنلاندی + + + + Fijian + فیجی + + + + Faroese + فارویی + + + + French + فرانسوی + + + + Western Frisian + فریزلندی غربی + + + + Irish + ایرلندی + + + + Scottish Gaelic + اسکاتلندی بومی + + + + Galician + گالیشی + + + + Guarani + گورانی + + + + Gujarati + گوجراتی + + + + Manx + مانکسی + + + + Hausa + هوساوی + + + + Hebrew + عبری + + + + Hindi + هندی + + + + Hiri Motu + هیری موتو + + + + Croatian + کرواتی + + + + Haitian + هایتی + + + + Hungarian + مجارستانی + + + + Armenian + ارمنی + + + + Herero + هریرو + + + + Interlingua + اینترلینگوا + + + + Indonesian + اندونزیایی + + + + Interlingue + اینترلینگو + + + + Igbo + ایگبویی + + + + Sichuan Yi + سیچوانی یی + + + + Inupiaq + اینوپیاک + + + + Ido + ایدو + + + + Icelandic + آیسلندی + + + + Italian + ایتالیایی + + + + Inuktitut + اینوکتیتوتی + + + + Japanese + ژاپنی + + + + Javanese + جاوایی + + + + Georgian + گرجستانی + + + + Kongo + کنگو + + + + Kikuyu + کیکویو + + + + Kwanyama + کاوانیامی + + + + Kazakh + قزاقی + + + + Kalaallisut + گرینلندی + + + + Khmer + خمیری + + + + Kannada + کانادایی + + + + Korean + کره‌ای + + + + Kanuri + کانیوری + + + + Kashmiri + کشمیری + + + + Kurdish + کردی + + + + Komi + کومی + + + + Cornish + کرنیش + + + + Kirghiz + قرقیزی + + + + Latin + لاتینی + + + + Luxembourgish + لوگزامبورگی + + + + Ganda + گاندا + + + + Limburgish + لیمبورگی + + + + Lingala + لینگالی + + + + Lao + لائوسی + + + + Lithuanian + لیتوانی + + + + Luba-Katanga + لوبا کاتانگا + + + + Latvian + لاتویانی + + + + Malagasy + مالاگاسی + + + + Marshallese + مارشالی + + + + Maori + مائوری + + + + Macedonian + مقدونی + + + + Malayalam + مالایایی + + + + Mongolian + مغولستانی + + + + Marathi + مهاراتی + + + + Malay + مالایا + + + + Maltese + مالتی + + + + Burmese + برمه‌ای + + + + Nauru + نائورو + + + + Norwegian Bokmal + بوکمال نروژی + + + + North Ndebele + ندیبیلی شمال + + + + Nepali + نپالی + + + + Ndonga + اندونگا + + + + Dutch + هلندی + + + + Norwegian Nynorsk + نینورسک نروژی + + + + Norwegian + نروژی + + + + South Ndebele + ندیبیلی جنوب + + + + Navajo + ناواهو + + + + Chichewa + چیچوا + + + + Occitan + اکیتانی + + + + Ojibwa + اجیبوا + + + + Oromo + اورومی + + + + Oriya + اوریا + + + + Ossetian + قفقازی + + + + Panjabi + پنجابی + + + + Pali + پالی + + + + Polish + لهستانی + + + + Pashto + پشتو + + + + Portuguese + پرتغالی + + + + Quechua + کچوا + + + + Raeto-Romance + ریتو-رومنس + + + + Kirundi + کیروندی + + + + Romanian + رومانی + + + + Russian + روسی + + + + Kinyarwanda + کینیارواندی + + + + Sanskrit + سانسکریتی + + + + Sardinian + ساردینی + + + + Sindhi + سندی + + + + Northern Sami + سامی شمال + + + + Sango + سانگو + + + + Serbo-Croatian + صربستانی- کرواتی + + + + Sinhala + سنهالی + + + + Slovak + اسلواکی + + + + Slovenian + اسلونی + + + + Samoan + ساموی + + + + Shona + شونا + + + + Somali + سومالی + + + + Albanian + آلبانی + + + + Serbian + صربستانی + + + + Swati + سواتی + + + + Southern Sotho + سوتو جنوب + + + + Sundanese + سوندانی + + + + Swedish + سوئدی + + + + Swahili + سواحیلی + + + + Tamil + تامیلی + + + + Telugu + تیلگو + + + + Tajik + تاجیک + + + + Thai + تایلندی + + + + Tigrinya + تگرینی + + + + Turkmen + ترکمن + + + + Tagalog + تاگالوگی + + + + Tswana + تسوانی + + + + Tonga + تونگا + + + + Turkish + ترکی + + + + Tsonga + تسونگا + + + + Tatar + تاتاری + + + + Twi + توی + + + + Tahitian + تاهیتی + + + + Uighur + اویغوری + + + + Ukrainian + اوکراینی + + + + Urdu + اردو + + + + Uzbek + ازبکی + + + + Venda + ویندا + + + + Vietnamese + ویتنامی + + + + Volapuk + ولاپوک + + + + Walloon + والونی + + + + Wolof + ولوف + + + + Xhosa + زوسا + + + + Yiddish + یدیشی + + + + Yoruba + یوروبی + + + + Zhuang + ژوانکی + + + + Chinese + چینی + + + + Zulu + زولو + + + + Lojban + لوجبانی + + + + Traditional Chinese + چینی سنتی + + + + Simplified Chinese + چینی ساده + + + + Other + سایر + + + + Other Simplified Chinese dialects + چینی سایر گویش‌های ساده + + + + Other Traditional Chinese dialects + چینی سایر گویش‌های سنتی + + + + Other Eastern-European languages + سایر زبان‌های اروپای شرقی + + + + Other Western-European languages + سایر زبان‌های اروپای غربی + + + + Other Russian languages + روسی سایر زبان‌ها + + + + Other Japanese languages + ژاپنی سایر زبان‌ها + + + + Other Baltic languages + بالتیک سایر زبان‌ها + + + + Other Greek languages + یونانی سایر زبان‌ها + + + + Other Korean dialects + کره‌ای سایر گویش‌ها + + + + Other Turkish dialects + ترکی سایر گویش‌ها + + + + Other Thai dialects + تایلندی سایر گویش‌ها + + + + Tamazight + آمازیغی + + + + LoadDictionaries + + + Error loading dictionaries + خطا در بارگیری واژه‌نامه‌ها + + + + Main + + + Error in configuration file. Continue with default settings? + خطا در پرونده پیکربندی. با تنظیمات پیش‌فرض ادامه می‌دهید؟ + + + + MainWindow + + + + Welcome! + خوش آمدید! + + + + &File + &پرونده + + + + &Edit + &ویرایش + + + + &Help + &راهنما + + + + &View + &نما + + + + &Zoom + &بزرگ‌نمایی + + + + H&istory + پی&شینه + + + + Search + + + + + &Search Pane + قاب &جست‌وجو + + + + &Results Navigation Pane + قاب &ناوبری نتایج + + + + &History Pane + قاب &پیشینه + + + + &Dictionaries... + &واژه‌نامه‌ها... + + + + F3 + F3 + + + + &Preferences... + &ترجیحات... + + + + F4 + F4 + + + + &Homepage + &برگه آغازین + + + + &About + &درباره + + + + About GoldenDict + درباره گلدن‌دیکت + + + + GoldenDict reference + + + + + F1 + F1 + + + + + &Quit + &ترک کردن + + + + Quit from application + ترک کردن برنامه + + + + Ctrl+Q + Ctrl+Q + + + + &Forum + &انجمن + + + + &Close To Tray + بستن به &سینی + + + + Minimizes the window to tray + کمینه کردن پنجره به سینی + + + + Ctrl+F4 + Ctrl+F4 + + + + &Save Article + &ذخیره بند + + + + Save Article + ذخیره بند + + + + F2 + F2 + + + + &Print + &چاپ + + + + Ctrl+P + Ctrl+P + + + + Page Set&up + &برپایی برگه + + + + Print Pre&view + &پیش‌نمایش چاپ + + + + &Rescan Files + پویش &دوباره پرونده‌ها + + + + Ctrl+F5 + Ctrl+F5 + + + + &Clear + &پاک کردن + + + + &New Tab + &زبانه تازه + + + + Ctrl+T + Ctrl+T + + + + &Configuration Folder + &پوشه پیکربندی + + + + + &Show + &نمایش + + + + Ctrl+H + Ctrl+H + + + + &Export + &صادر کردن + + + + &Import + &وارد کردن + + + + &Always on Top + &همیشه در بالا + + + + Always on Top + همیشه در بالا + + + + Ctrl+O + Ctrl+O + + + + + + Menu Button + کلید منو + + + + Search in page + + + + + Ctrl+F + + + + + Full-text search + + + + + Ctrl+Shift+F + + + + + Show Names in Dictionary &Bar + نمایش نا&م‌ها در نوار واژه‌نامه + + + + Show Small Icons in &Toolbars + نمایش نشانه‌های &کوچک در نوار ابزار + + + + &Menubar + نوار &منو + + + + &Navigation + نا&وبری + + + + Back + پس + + + + Forward + پیش + + + + Scan Popup + پویش واشو + + + + Pronounce Word (Alt+S) + بیان واژه (Alt+S) + + + + Zoom In + بزرگ‌نمایی به درون + + + + Zoom Out + بزرگ‌نمایی به بیرون + + + + Normal Size + اندازه عادی + + + + + Look up in: + یافتن در: + + + + Found in Dictionaries: + در این واژه‌نامه‌ها یافت شد: + + + + Words Zoom In + بزرگ‌نمایی به درون واژه‌ها + + + + Words Zoom Out + بزرگ‌نمایی به بیرون واژه‌ها + + + + Words Normal Size + اندازه عادی واژه‌ها + + + + Show &Main Window + &نمایش پنجره اصلی + + + + Opened tabs + زبانه‌های باز شده + + + + Close current tab + بستن زبانه جاری + + + + Close all tabs + بستن همه زبانه‌ها + + + + Close all tabs except current + بستن همه زبانه‌ها مگر زبانه جاری + + + + Loading... + بارگیری... + + + + New Tab + زبانه تازه + + + + + Accessibility API is not enabled + API دست‌رسی به‌کار نیفتاده است + + + + String to search in dictionaries. The wildcards '*', '?' and sets of symbols '[...]' are allowed. +To find '*', '?', '[', ']' symbols use '\*', '\?', '\[', '\]' respectively + رشته‌ای که باید در واژه‌نامه‌ها جست‌وجو شود. نویسه‌های عام '*'، '?' و گروه‌هایی از نمادهای '[...]' مجاز هستند. +برای یافتن نمادهای '*'، '?'، '['، ']' به ترتیب '\*'، '\?'، '\['، '\]' را به‌کار ببرید + + + + %1 dictionaries, %2 articles, %3 words + %1 واژه‌نامه، %2 بند، %3 واژه + + + + Look up: + یافتن: + + + + All + همه + + + + Open Tabs List + باز کردن لیست زبانه‌ها + + + + (untitled) + (بی‌عنوان) + + + + %1 - %2 + %1 - %2 + + + + Failed to initialize hotkeys monitoring mechanism.<br>Make sure your XServer has RECORD extension turned on. + برپاسازی سازوکار بازبینی کلیدهای میان‌بر شکست خورد.<br>مطمئن شوید که افزونه RECORD مربوط به XServer روشن شده است. + + + + New Release Available + نسخه تازه موجود است + + + + Version <b>%1</b> of GoldenDict is now available for download.<br>Click <b>Download</b> to get to the download page. + نسخه <b>%1</b> گلدن‌دیکت برای بارگیری آماده است <br> برای به‌دست آوردن برگه بارگیری <b>بارگیری</b> را کلیک کنید. + + + + Download + بارگیری + + + + Skip This Release + پرش از این نسخه + + + + You have chosen to hide a menubar. Use %1 to show it back. + شما پنهان کردن نوار منو را برگزیده‌اید. %1 را به‌کار ببرید تا دوباره نمایش داده شود. + + + + Ctrl+M + Ctrl+M + + + + Page Setup + برپایی برگه + + + + No printer is available. Please install one first. + چاپ‌گری موجود نیست. لطفاً نخست یکی نصب کنید. + + + + Print Article + چاپ بند + + + + Article, Complete (*.html) + بند، کامل (*.html) + + + + Article, HTML Only (*.html) + بند HTML تنها (*.html) + + + + Save Article As + ذخیره بند به‌عنوان + + + + Error + خطا + + + + Can't save article: %1 + نمی‌تواند بند: %1 را ذخیره کند + + + + Saving article... + درحال ذخیره بند... + + + + The main window is set to be always on top. + پنجره اصلی تنظیم می‌شود تا همیشه در بالا باشد. + + + + &Hide + پنهان&سازی + + + + Export history to file + صادر کردن پیشینه به پرونده + + + + + Text files (*.txt);;All files (*.*) + پرونده‌های متنی (*.txt);;همه پرونده‌ها (*.*) + + + + History export complete + صادر کردن پیشینه کامل شد + + + + Export error: + خطا در صادر کردن: + + + + Import history from file + وارد کردن پیشینه از پرونده + + + + Import error: invalid data in file + خطا در وارد کردن: داده نامعتبر در پرونده + + + + History import complete + وارد کردن پیشینه کامل شد + + + + Import error: + خطا در وارد کردن: + + + + Dictionary info + اطلاعات واژه‌نامه + + + + Dictionary headwords + سرواژه‌های واژه‌نامه + + + + Open dictionary folder + باز کردن پوشه واژه‌نامه + + + + Edit dictionary + ویرایش واژه‌نامه + + + + Mdx::MdxArticleRequest + + + Dictionary file was tampered or corrupted + پرونده واژه‌نامه دست‌کاری یا خراب شده است + + + + Failed loading article from %1, reason: %2 + بارگیری بند از %1 شکست خورد، دلیل: %2 + + + + MediaWiki::MediaWikiArticleRequest + + + XML parse error: %1 at %2,%3 + خطای تجزیه XML: %1 در %2،%3 + + + + MediaWiki::MediaWikiWordSearchRequest + + + XML parse error: %1 at %2,%3 + خطای تجزیه XML: %1 در %2،%3 + + + + MediaWikisModel + + + Enabled + به‌کار افتاده + + + + Name + نام + + + + Address + آدرس + + + + Icon + نشانه + + + + OrderAndProps + + + Form + فرم + + + ... + ... + + + + Dictionary order: + ترتیب واژه‌نامه‌ها: + + + + Inactive (disabled) dictionaries: + واژه‌نامه‌های غیرفعال (از کار افتاده): + + + + Dictionary information + اطلاعات واژه‌نامه + + + + Name: + نام: + + + + Total articles: + جمع بندها: + + + + Total words: + جمع واژه‌ها: + + + + Translates from: + ترجمه از: + + + + Translates to: + ترجمه به: + + + + Description: + شرح: + + + + Files comprising this dictionary: + پرونده‌های دربرگیرنده این واژه‌نامه: + + + + Adjust the order by dragging and dropping items in it. Drop dictionaries to the inactive group to disable their use. + با کشیدن و رها کردن آیتم‌ها ترتیب آن‌ها را تنظیم کنید. برای از کار انداختن واژه‌نامه‌ها آن‌ها را در گروه غیرفعال بیندازید. + + + + Sort by name + مرتب کردن با نام + + + + Sort by languages + مرتب کردن با زبان + + + + Dictionary headwords + سرواژه‌های واژه‌نامه + + + + Dictionaries active: %1, inactive: %2 + + + + + PathsModel + + + Path + مسیر + + + + Recursive + بازگشتی + + + + Preferences + + + Preferences + ترجیحات + + + + &Interface + &رابط + + + + Startup + آغازگر + + + + Automatically starts GoldenDict after operation system bootup. + پس از بالا آمدن سیستم‌عامل گلدن‌دیکت به‌طور خودکار اجرا شود. + + + + Start with system + آغاز هم‌راه با سیستم + + + + Add-on style: + سبک افزونه: + + + + When enabled, an icon appears in the sytem tray area which can be used +to open main window and perform other tasks. + هنگامی‌که به‌کار افتاده، یک نشانه در سینی سیستم نمایش داده می‌شود +که می‌تواند برای باز کردن پنجره اصلی و انجام دیگر کارها به‌کار برده شود. + + + + Enable system tray icon + به‌کار انداختن نشانه سینی سیستم + + + + With this on, the application starts directly to system tray without showing +its main window. + با به‌کار انداختن این، برنامه هنگام آغاز بدون +نمایش پنجره اصلی به سینی سیستم می‌رود. + + + + Start to system tray + آغاز برنامه در سینی سیستم + + + + With this on, an attempt to close main window would hide it instead of closing +the application. + با به‌کار انداختن این،هر تلاشی برای بستن پنجره +اصلی به جای بستن برنامه آن‌را پنهان می‌کند. + + + + Close to system tray + بستن به سینی سیستم + + + + Double-click translates the word clicked + دوبار کلیک واژه کلیک شده را ترجمه کند + + + + Normally, pressing ESC key moves focus to the translation line. +With this on however, it will hide the main window. + در حالت عادی، فشردن کلید ESC تمرکز را به خط ترجمه انتقال +می‌دهد. با به‌کار انداختن این، باعث پنهان شدن پنجره اصلی می‌شود. + + + + ESC key hides main window + کلید ESC پنجره اصلی را پنهان کند + + + + Turn this option on if you want to select words by single mouse click + اگر می‌خواهید واژه‌ها را با تک کلیک موش برگزینید این گزینه را به‌کار اندازید + + + + Select word by single click + برگزیدن واژه با تک کلیک + + + + Tabbed browsing + مرور زبانه‌ای + + + + Normally, opening a new tab switches to it immediately. +With this on however, new tabs will be opened without +switching to them. + در حالت عادی، با باز کردن یک زبانه‌ی تازه فوری به آن می‌روید. +با فعال بودن این، زیانه‌ی تازه باز می‌شود ولی به آن نمی‌روید. + + + + Open new tabs in background + باز کردن زبانه‌های تازه در پس‌زمینه + + + + With this on, new tabs are opened just after the +current, active one. Otherwise they are added to +be the last ones. + با فعال کردن ابن، زبانه‌های تازه پس از +زبانه فعلی فعال باز می‌شوند، وگرنه +به‌عنوان آخرین زیانه افزوده می‌شوند. + + + + Open new tabs after the current one + باز کردن زبانه تازه پس از زبانه جاری + + + + Select this option if you don't want to see the main tab bar when only a single tab is opened. + اگر نمی‌خواهید نوار زبانه اصلی را هنگامی‌که تنها یک زبانه باز شده دارید ببینید این را برگزینید. + + + + Hide single tab + پنهان کردن تک زبانه + + + + Ctrl-Tab navigates tabs in MRU order + با مهار+Tab بین زبانه‌ها به ترتیب MRU جابه‌جا شوید + + + + Interface language: + زبان رابط کاربری: + + + + Display style: + سبک نمایش: + + + + Help language + + + + + Adjust this value to avoid huge context menus. + برای دوری از فهرست زمینه خیلی بزرگ این مقدار را تنظیم کنید. + + + + Context menu dictionaries limit: + شمار واژه‌نامه‌های فهرست زمینه: + + + + &Scan Popup + پویش &واشو + + + + When enabled, a translation popup window would be shown each time +you point your mouse on any word on the screen (Windows) or select +any word with mouse (Linux). When enabled, you can switch it on and +off from main window or tray icon. + وقتی به‌کار افتاده، یک پنجره ترجمه واشو زمانی‌که شما با موش روی +واژه‌ای روی نمایش‌گر اشاره کنید (ویندوز) یا واژه‌ای را با موش +برگزینید (لینوکس) نمایش داده می‌شود. زمانی‌که به‌کار افتاده است، شما +می‌توانید آن‌را از پنجره اصلی یا نشانه سینی سیستم خاموش یا روشن کنید. + + + + Enable scan popup functionality + به‌کار انداختن قابلیت پویش واشو + + + + Chooses whether the scan popup mode is on by default or not. If checked, +the program would always start with the scan popup active. + برگزینید که آیا حالت پویش واشو به‌طور پیش‌فرض روشن باشد یا نه. اگر +به‌کار افتاده باشد، برنامه همیشه با فعال بودن پویش واشو آغاز می‌شود. + + + + Start with scan popup turned on + آغاز با روشن بودن پویش واشو + + + + With this enabled, the popup would only show up if all chosen keys are +in the pressed state when the word selection changes. + با به‌کار انداختن این، واشو تنها زمانی نمایش داده می‌شود که +هنگام تغییر گزینش واژه همه کلیدهای برگزیده فشار داده شوند. + + + + Only show popup when all selected keys are kept pressed: + تنها زمانی که همه کلیدهای انتخاب شده فشار داده شده‌اند واشو را نمایش بده: + + + + Left Ctrl only + تنها مهار چپ + + + + Left Ctrl + مهار چپ + + + + Right Shift only + تنها تبدیل چپ + + + + Right Shift + تبدیل راست + + + + Alt key + کلید دگرساز + + + + Alt + دگرساز + + + + Ctrl key + کلید مهار + + + + Ctrl + مهار + + + + Left Alt only + تنها دگرساز چپ + + + + Left Alt + دگرساز چپ + + + + Shift key + کلید تبدیل + + + + Shift + تبدیل + + + + Right Alt only + تنها دگرساز راست + + + + Right Alt + دگرساز راست + + + + Right Ctrl only + تنها مهار راست + + + + Right Ctrl + مهار راست + + + + Left Shift only + تنها تبدیل چپ + + + + Left Shift + تبدیل چپ + + + + Windows key or Meta key + کلید ویندوز یا کلید متا + + + + Win/Meta + ویندوز/متا + + + + Normally, in order to activate a popup you have to +maintain the chosen keys pressed while you select +a word. With this enabled, the chosen keys may also +be pressed shortly after the selection is done. + به‌طور عادی، به منظور فعال کردن واشو شما باید هنگامی‌که یک واژه +را برگزیده‌اید کلیدهای برگزیده شده را فشار داده شده نگه دارید. +با به‌کار انداختن این، کلیدهای برگزیده، هم‌چنین می‌توانند +با فاصه کوتاهی پس از انجام گزینش واژه فشار داده شوند. + + + + Keys may also be pressed afterwards, within + هم‌چنین کلیدها ممکن است فشار داده شوند پس از آن، در مدت + + + + To avoid false positives, the keys are only monitored +after the selection's done for a limited amount of +seconds, which is specified here. + برای پیش‌گیری از رخ‌داد اشتباه، کلیدها پس از +اتمام گزینش تنها برای چند ثانیه محدود که +در این‌جا مشخص شده است بازبینی می‌شوند. + + + + secs + ثانیه + + + + Send translated word to main window instead of to show it in popup window + واژه ترجمه شده را به‌جای نمایش در پنجره واشو به پنجره اصلی بفرست + + + + Send translated word to main window + واژه ترجمه شده را به پنجره اصلی بفرست + + + + Hotkeys + کلیدهای میان‌برها + + + + Use the following hotkey to show or hide the main window: + برای نمایش یا پنهان کردن پنجره اصلی میان‌برهای زیر را به‌کار ببر: + + + + Use the following hotkey to translate a word from clipboard: + برای ترجمه یک واژه از حافظه میان‌برهای زیر را به‌کار ببر: + + + + The hotkeys are global and work from any program and within any context as long as GoldenDict is running in background. + کلیدهای میان‌بر سراسری هستند و تا زمانی که گلدن‌دیکت در پس‌زمینه در حال اجراست در هر برنامه و هر متنی کار می‌کنند. + + + + <!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:'DejaVu Sans'; font-size:9pt; font-weight:400; font-style:normal;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" color:#ff0000;">Note: You appear to be running an X.Org XServer release which has the RECORD extension broken. Hotkeys in GoldenDict will probably not work. This must be fixed in the server itself. Please refer to the following </span><a href="https://bugs.freedesktop.org/show_bug.cgi?id=20500"><span style=" text-decoration: underline; color:#0000ff;">bug entry</span></a><span style=" color:#ff0000;"> and leave a comment there if you like.</span></p></body></html> + <!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:'DejaVu Sans'; font-size:9pt; font-weight:400; font-style:normal;"> +<p dir="RTL" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" color:#ff0000;">توجه: به نظر می‌رسد شما نسخه‌ای از X.Org XServer که افزونه RECORD آن خراب شده است را در حال اجرا دارید. کلیدهای میان‌بر در گلدن‌دیکت به‌خوبی کار نخواهند کرد. این بایستی در خود server درست شود. لطفاً مراجعه کنید به </span><a href="https://bugs.freedesktop.org/show_bug.cgi?id=20500"><span style=" text-decoration: underline; color:#0000ff;">ثبت باگ</span></a><span style=" color:#ff0000;"> و اگر دوست دارید یک یادداشت آن‌جا بگذارید.</span></p></body></html> + + + + &Audio + &شنیداری + + + + Pronunciation + بیان کردن + + + + Auto-pronounce words in main window + بیان خودکار واژه‌ها در پنجره اصلی + + + + Auto-pronounce words in scan popup + بیان خودکار واژه‌ها در پویش واشو + + + + Playback + بازپخش + + + + Play audio files via FFmpeg(libav) and libao + پخش پرونده‌های شنیداری با FFmpeg(libav) و libao + + + + Use internal player + به‌کار بردن پخش‌کننده درونی + + + + Use any external program to play audio files + به‌کار بردن هر برنامه بیرونی برای پخش پرونده‌های شنیداری + + + + Use external program: + به‌کار بردن برنامه بیرونی: + + + + &Network + ش&بکه + + + + Enable if you wish to use a proxy server +for all program's network requests. + اگر می‌خواهید کارگزار پروکسی را برای همه درخواست‌های +شبکه برنامه به‌کار ببرید این را به‌کار اندازید. + + + + Use proxy server + به‌کار بردن کارگزار پروکسی + + + + System proxy + + + + + Custom proxy + + + + + Custom settings + + + + + Type: + نوع: + + + + Host: + میزبان: + + + + Port: + درگاه: + + + + User: + کاربر: + + + + Password: + گذرواژه: + + + + Enabling this would make GoldenDict block most advertisements +by disallowing content (images, frames) not originating from the site +you are browsing. If some site breaks because of this, try disabling this. + با به‌کار انداختن این گلدن‌دیکت بیش‌تر آگهی‌ها را با اجازه ندادن +به محتوای (تصویرها، قاب‌ها) که از پایگاه مروری شما نیست می‌بندد. +اگر برخی پایگاه‌ها به خاطر این خراب شدند، این را از کار بیندازید. + + + + Disallow loading content from other sites (hides most advertisements) + بارگیری محتوا از دیگر پایگاه‌ها را می‌بندد (بیش‌تر آگهی‌ها را پنهان می‌کند) + + + + Enabling this would allow to listen to sound pronunciations from +online dictionaries that rely on Flash or other web plugins. +Plugin must be installed for this option to work. + با به‌کار انداختن این می‌توانید به بیان آواها از شاخه‌های +برخط که بر روی فلش یا دیگر افزونه‌های وب تکیه کرده‌اند +گوش کنید. برای کار کردن این گزینه افزونه باید نصب شده باشد. + + + + Enable web plugins + به‌کار انداختن افزونه‌های وب + + + + Some sites detect GoldenDict via HTTP headers and block the requests. +Enable this option to workaround the problem. + برخی پایگاه‌ها گلدن‌دیگت را از سرآیند HTTP می‌شناسند و درخواست‌ها +را می‌بندند. این گزینه را به‌کار اندازید تا مشکل از بین برود. + + + + Do not identify GoldenDict in HTTP headers + گلدن‌دیکت را در سرآیند HTTP نمایان نکن + + + + When this is enabled, the program periodically +checks if a new, updated version of GoldenDict +is available for download. If it is so, the program +informs the user about it and prompts to open a +download page. + وقتی به‌کار افتاده است، برنامه به‌طور دوره‌ای برای +نسخه‌های تازه گلدن‌دیکت برای بارگیری بررسی می‌کند. +اگر در دست‌رس بود برنامه کاربر را آگاه می‌کند +و پیام می‌دهد تا یک برگه بارگیری باز کند. + + + + Check for new program releases periodically + بررسی دوره‌ای برای نسخه‌های تازه برنامه + + + + Full-text search + + + + + Allow full-text search for: + + + + + Don't search in dictionaries containing more than + + + + + articles (0 - unlimited) + + + + + Ad&vanced + &پیش‌رفته + + + + ScanPopup extra technologies + فن‌آوری‌های فراتر پویش واشو + + + + Try to use IAccessibleEx technology to retrieve word under cursor. +This technology works only with some programs that support it + (for example Internet Explorer 9). +It is not needed to select this option if you don't use such programs. + تلاش می‌کند تا برای به‌دست آوردن واژه زیر نشان‌گر موش فن‌آوری IAccessibleEx را به‌کار ببرد. +این فن‌آوری تنها با برخی برنامه‌ها که از آن پشتیبانی می‌کنند کار می‌کند (همانند IE9). +اگر شما از این‌چنین برنامه‌هایی استفاده نمی‌کنید نیازی به برگزیدن این گزینه ندارید. + + + + Use &IAccessibleEx + به‌کار بردن &IAccessibleEx + + + + Try to use UI Automation technology to retrieve word under cursor. +This technology works only with some programs that support it. +It is not needed to select this option if you don't use such programs. + تلاش می‌کند تا برای به‌دست آوردن واژه زیر نشان‌گر موش فن‌آوری UIAutomation را به‌کار ببرد. +این فن‌آوری تنها با برخی برنامه‌ها که از آن پشتیبانی می‌کنند کار می‌کند. +اگر شما از این‌چنین برنامه‌هایی استفاده نمی‌کنید نیازی به برگزیدن این گزینه ندارید. + + + + Use &UIAutomation + به‌کار بردن &UIAutomation + + + + Try to use special GoldenDict message to retrieve word under cursor. +This technology works only with some programs that support it. +It is not needed to select this option if you don't use such programs. + تلاش می‌کند تا برای به‌دست آوردن واژه زیر نشان‌گر موش پیام‌ ویژه گلدن‌دیکت را به‌کار ببرد. +این فن‌آوری تنها با برخی برنامه‌ها که از آن پشتیبانی می‌کنند کار می‌کند. +اگر شما از این‌چنین برنامه‌هایی استفاده نمی‌کنید نیازی به برگزیدن این گزینه ندارید. + + + + Use &GoldenDict message + به‌کار بردن پیام &گلدن‌دیکت + + + + History + پیشینه + + + + Turn this option on to store history of the translated words + برای نگه‌داری پیشینه واژه‌های ترجمه شده این گزینه را روشن کنید + + + + Store &history + نگه‌داری &پیشینه + + + + Specify the maximum number of entries to keep in history. + بیشینه شمار ورودی برای نگه‌داری در پیشینه را تعیین می‌کند. + + + + Maximum history size: + بیشینه اندازه پیشینه: + + + + History saving interval. If set to 0 history will be saved only during exit. + وقفه ذخیره پیشینه. اگر ۰ قرار داده شود پیشینه تنها هنگام ترک برنامه ذخیره خواهد شد. + + + + Save every + ذخیره کن هر + + + + minutes + دقیقه + + + + Articles + بندها + + + + Turn this option on to always expand optional parts of articles + برای گستراندن همیشگی بخش‌های اختیاری بندها این گزینه را روشن کنید + + + + Expand optional &parts + &بخش‌های اختیاری را بگستران + + + + Select this option to automatic collapse big articles + برای جمع کردن خودکار بندهای بزرگ این گزینه را برگزینید + + + + Collapse articles more than + بندهای بیش از این را جمع کن + + + + Articles longer than this size will be collapsed + بندهای کشیده‌تر از این اندازه جمع می‌شوند + + + + symbols + نماد + + + + System default + پیش‌فرض سیستم + + + + + Default + پیش‌فرض + + + + Modern + نوین + + + + Lingvo + لینگوُ + + + + Babylon + بابیلون + + + + Lingoes + لینگوز + + + + Lingoes-Blue + لینگوز-آبی + + + + Changing Language + تغییر دادن زبان + + + + Restart the program to apply the language change. + برای به‌کار برده شدن تغییر زبان برنامه را دوباره راه‌اندازی کنید. + + + + ProgramTypeEditor + + + Audio + شنیداری + + + + Plain Text + متن ساده + + + + Html + Html + + + + Prefix Match + همتا بودن پیش‌وند + + + + Unknown + ناشناخته + + + + Programs::RunInstance + + + No program name was given. + نام برنامه‌ای داده نشده است. + + + + The program has crashed. + برنامه خراب شده است. + + + + The program has returned exit code %1. + برنامه این کد خروج را برگردانده است %1. + + + + ProgramsModel + + + Enabled + به‌کار افتاده + + + + Type + نوع + + + + Name + نام + + + + Command Line + خط فرمان + + + + Icon + نشانه + + + + QObject + + + + Article loading error + خطا در بارگیری بند + + + + + Article decoding error + خطا در رمزگشایی بند + + + + avformat_alloc_context() failed. + avformat_alloc_context() شکست خورد. + + + + av_malloc() failed. + av_malloc() شکست خورد. + + + + avio_alloc_context() failed. + avio_alloc_context() شکست خورد. + + + + avformat_open_input() failed: %1. + avformat_open_input() شکست خورد: %1. + + + + avformat_find_stream_info() failed: %1. + avformat_find_stream_info() شکست خورد.: %1. + + + + Could not find audio stream. + نمی‌تواند جریان شنیداری را بیابد. + + + + Codec [id: %1] not found. + کدک [شناسه: %1] یافت نشد. + + + + avcodec_open2() failed: %1. + avcodec_open2() شکست خورد: %1. + + + + Cannot find usable audio output device. + نمی‌تواند دستگاه خروجی شنیداری به‌کار بردنی بیابد. + + + + Unsupported sample format. + قالب نمونه‌برداری پشتیبانی نشده. + + + + ao_open_live() failed: + ao_open_live() شکست خورد: + + + + No driver. + راه‌اندازی نیست. + + + + This driver is not a live output device. + این راه‌انداز یک دستگاه خروجی زنده نیست. + + + + A valid option key has an invalid value. + یک کلید گزینه معتبر مقدار نامعتبر دارد. + + + + Cannot open the device: %1, channels: %2, rate: %3, bits: %4. + نمی‌تواند دستگاه: %1 را بازکند، کانال: %2، نرخ: %3، بیت: %4. + + + + Unknown error. + خطای ناشناخته. + + + + avcodec_alloc_frame() failed. + avcodec_alloc_frame() شکست خورد. + + + + QuickFilterLine + + + Dictionary search/filter (Ctrl+F) + جست‌وجو/پالایه واژه‌نامه (Ctrl+F) + + + + Quick Search + جست‌وجوی تند + + + + Clear Search + پاک کردن جست‌وجو + + + + ResourceToSaveHandler + + + + ERROR: %1 + خطای: %1 + + + + Resource saving error: + خطا در ذخیره منبع: + + + + The referenced resource failed to download. + بارگیری منبع ارجاع شده شکست خورد. + + + + Romaji + + + Hepburn Romaji for Hiragana + روماجی هپ‌برن برای هیراگانا + + + + Hepburn Romaji for Katakana + روماجی هپ‌برن برای کاتاکانا + + + + RussianTranslit + + + Russian Transliteration + نویسه‌گردانی روسی + + + + ScanPopup + + + Dialog + دیالوگ + + + + Back + پس + + + + + + + + ... + ... + + + + Forward + پیش + + + + Pronounce Word (Alt+S) + بیان واژه (Alt+S) + + + + Alt+S + Alt+S + + + + Send word to main window (Alt+W) + فرستادن واژه به پنجره اصلی (Alt+W) + + + + Alt+W + Alt+W + + + + Shows or hides the dictionary bar + نمایش یا پنهان کردن نوار واژه‌نامه + + + + Use this to pin down the window so it would stay on screen, +could be resized or managed in other ways. + این سنجاق را فشار دهید تا پنجره روی صفحه بماند، +می‌توان تغییر اندازه داد یا طور دیگری مدیریت کرد. + + + + + %1 - %2 + %1 - %2 + + + + SoundDirsModel + + + Path + مسیر + + + + Name + نام + + + + Icon + نشانه + + + + Sources + + + Files + پرونده‌ها + + + + Paths to search for the dictionary files: + مسیرهای جست‌وجوی پرونده‌های واژه‌نامه: + + + + + + + + + &Add... + &افزودن... + + + + + + + + + &Remove + &حذف کردن + + + + Re&scan now + اکنون &پویش دوباره کن + + + + Sound Dirs + شاخه‌های آوا + + + + Make dictionaries from bunches of audiofiles by adding paths here: + ساخت واژه‌نامه‌ها از دسته‌های پرونده‌های شنیداری با افزودن مسیرها در این‌جا: + + + + Morphology + ریخت‌شناسی + + + + Path to a directory with Hunspell/Myspell dictionaries: + مسیر شاخه با واژه‌نامه‌های Hunspell/Myspell: + + + + &Change... + &تغییر دادن... + + + + Available morphology dictionaries: + واژه‌نامه‌های ریخت‌شناسی موجود: + + + + Each morphology dictionary appears as a +separate auxiliary dictionary which +provides stem words for searches and +spelling suggestions for mistyped words. +Add appropriate dictionaries to the bottoms +of the appropriate groups to use them. + هر واژه‌نامه ریخت‌شناسی همانند واژه‌نامه +کمکی جداگانه پدیدار می‌شود که ریشه +واژه‌ها را برای جست‌وجو و پیش‌نهادهای +درست‌نویسی برای واژه‌های نادرست آماده می‌کند. +واژه‌نامه‌های مناسب را به انتهای گروه‌های +مناسب برای به‌کار بردن آن‌ها می‌افزاید. + + + + Wikipedia + ویکی‌پدیا + + + + Wikipedia (MediaWiki) sites: + پایگاه‌های ویکی‌پدیا (ویکی‌مدیا): + + + + Websites + پایگاه‌های وب + + + + Any websites. A string %GDWORD% will be replaced with the query word: + هر پایگاه وبی. یک رشته %GDWORD% با واژه درخواستی جای‌گزین می‌شود: + + + + Alternatively, use %GD1251% for CP1251, %GDISO1%...%GDISO16% for ISO 8859-1...ISO 8859-16 respectively, +%GDBIG5% for Big-5, %GDBIG5HKSCS% for Big5-HKSCS, %GDGBK% for GBK and GB18030, %GDSHIFTJIS% for Shift-JIS. + به‌نوبت، به‌کار می‌برد %GD1251% برای CP1251،و %GDISO1%...%GDISO16% برای ISO 8859-1...ISO 8859-16 را به‌ترتیب برای، +%GDBIG5% برای Big-5، و %GDBIG5HKSCS% برای Big5-HKSCS، و %GDGBK% برای GBK و GB18030، و %GDSHIFTJIS% برای Shift-JIS. + + + + DICT servers + + + + + DICT servers: + + + + + Programs + برنامه‌ها + + + + Any external programs. A string %GDWORD% will be replaced with the query word. If such string is not presented, the word will be fed into standard input. + هر برنامه بیرونی. یک رشته %GDWORD% با واژه درخواستی جای‌گزین می‌شود. اگر چنین رشته‌ای آماده نبود، واژه به ورودی استاندارد فرستاده می‌شود. + + + + Forvo + فوروُ + + + + Live pronunciations from <a href="http://www.forvo.com/">forvo.com</a>. The site allows people to record and share word pronunciations. You can listen to them from GoldenDict. + بیان زنده از <a href="http://www.forvo.com/">forvo.com</a>. این پایگاه به مردم اجازه ضبط و اشتراک بیان‌ها را می‌دهد. شما از گلدن‌دیکت می‌توانید به آن‌ها گوش کنید. + + + + Enable pronunciations from Forvo + به‌کار انداختن بیان کردن با فوروُ + + + + API Key: + کلید API: + + + + Use of Forvo currently requires an API key. Leave this field +blank to use the default key, which may become unavailable +in the future, or register on the site to get your own key. + به‌کار بردن فوروُ هم‌اکنون به یک کلید API نیاز دارد. برای به‌کار بردن +کلید پیش‌فرض بگذارید این فیلد تهی باشد، چرا که ممکن است در آینده +در دست‌رس نباشد، یا در پایگاه نام‌نویسی کنید تا کلید خودتان را به‌دست آورید. + + + + Get your own key <a href="http://api.forvo.com/key/">here</a>, or leave blank to use the default one. + کلید خودتان را <a href="http://api.forvo.com/key/">از این‌جا</a> به‌دست آورید، یا برای به‌کار بردن کلید پیش‌فرض بگذارید تهی باشد. + + + + Language codes (comma-separated): + کدهای زبان (جدا شده با کاما): + + + + List of language codes you would like to have. Example: "en, ru". + لیست کدهای زبان که می‌خواهید داشته باشید. همانند: "en, ru". + + + + Full list of language codes is available <a href="http://www.forvo.com/languages-codes/">here</a>. + لیست همه کدهای زبان <a href="http://www.forvo.com/languages-codes/">این‌جا</a> در دست‌رس است. + + + + Transliteration + نویسه‌گردانی + + + + Russian transliteration + نویسه‌گردانی روسی + + + + Greek transliteration + نویسه‌گردانی یونانی + + + + German transliteration + نویسه‌گردانی آلمانی + + + + Belarusian transliteration + نویسه‌گردانی بلاروسی + + + + Enables to use the Latin alphabet to write the Japanese language + برای به‌کار بردن الفبای لاتین برای نوشتن زبان ژاپنی به‌کار اندازید + + + + Japanese Romaji + روماجی ژاپنی + + + + Systems: + سامانه‌ها: + + + + The most widely used method of transcription of Japanese, +based on English phonology + پر کاربردترین روش آوانویسی ژاپنی، +بر پایه واج‌شناسی انگلیسی + + + + Hepburn + هپ‌برن + + + + The most regular system, having a one-to-one relation to the +kana writing systems. Standardized as ISO 3602 + +Not implemented yet in GoldenDict. + منظم‌ترین سامانه، یک رابطه یک-به-یک با سامانه‌های +نوشتاری کانا. استاندارد شده در ISO 3602 + +هنوز در گلدن‌دیکت پیاده‌سازی نشده است. + + + + Nihon-shiki + نیهون-شیکی + + + + Based on Nihon-shiki system, but modified for modern standard Japanese. +Standardized as ISO 3602 + +Not implemented yet in GoldenDict. + برپایه سامانه نیهون-شیکی، ولی برای استاندارد نوین ژاپنی پیراسته شده است. +استاندارد شده در ISO 3602 + +هنوز در گلدن‌دیکت پیاده‌سازی نشده است. + + + + Kunrei-shiki + کنری-شیکی + + + + Syllabaries: + هجابندی‌ها: + + + + Hiragana Japanese syllabary + هجابندی هیراگانای ژاپنی + + + + Hiragana + هیراگانا + + + + Katakana Japanese syllabary + هجابندی کاتاکانای ژاپنی + + + + Katakana + کاتاکانا + + + + Text to Speech + متن به گفتار + + + + (not available in portable version) + (در نسخه قابل حمل در دست‌رس نیست) + + + + + + Choose a directory + یک شاخه برگزینید + + + + + + + + + Confirm removal + تایید حذف کردن + + + + + Remove directory <b>%1</b> from the list? + شاخه <b>%1</b> را از لیست حذف کند؟ + + + + + + Remove site <b>%1</b> from the list? + پایگاه <b>%1</b> را از لیست حذف کند؟ + + + + Remove program <b>%1</b> from the list? + برنامه <b>%1</b> را از لیست حذف کند؟ + + + + StylesComboBox + + + None + هیچ کدام + + + + TextToSpeechSource + + + Selected voice engines: + موتورهای گفتار برگزیده: + + + + &Add + &افزودن + + + + &Remove + &حذف + + + + Preferences + ترجیحات + + + + Volume: + حجم: + + + + Rate: + نرخ: + + + + Preview + پیش‌نمایش + + + + Available voice engines: + موتورهای گفتار موجود: + + + + Text to be previewed: + متن پیش‌نمایش: + + + + Type text to be previewed here. + متن را تایپ کنید تا این‌جا پیش‌نمایش شود. + + + + &Preview + &پیش‌نمایش + + + + No TTS voice available + گفتار TTS در دست‌رس نیست + + + + Cannot find available TTS voice.<br>Please make sure that at least one TTS engine installed on your computer already. + نمی‌تواند گفتار TTS در دست‌رسی بیابد. <br> مطمئن شوید که دست‌کم یک موتور TTS روی رایانه شما نصب شده است. + + + + Confirm removal + تایید حذف + + + + Remove voice engine <b>%1</b> from the list? + حذف موتور گفتار <b>%1</b> از لیست؟ + + + + TranslateBox + + + Type a word or phrase to search dictionaries + یک واژه یا عبارت برای جست‌وجو در واژه‌نامه‌ها تایپ کنید + + + + Drop-down + پایین رفتن + + + + VoiceEnginesModel + + + Enabled + به‌کار افتاده + + + + Name + نام + + + + Id + شناسه + + + + Icon + نشانه + + + + WebSitesModel + + + Enabled + به‌کار افتاده + + + + Name + نام + + + + Address + آدرس + + + + Icon + نشانه + + + + WordFinder + + + Failed to query some dictionaries. + پرس و جوی برخی واژه‌نامه‌ها شکست خورد. + + + + WordList + + + WARNING: %1 + هشدار: %1 + + + diff -Nru goldendict-1.5.0~git20131003/locale/fr_FR.ts goldendict-1.5.0~git20150923/locale/fr_FR.ts --- goldendict-1.5.0~git20131003/locale/fr_FR.ts 2013-10-02 20:42:04.000000000 +0000 +++ goldendict-1.5.0~git20150923/locale/fr_FR.ts 2015-09-23 08:26:24.000000000 +0000 @@ -38,7 +38,7 @@ [Inconnu] - + Based on Qt %1 (%2, %3 bit) Basé sur Qt %1 (%2, %3 bit) @@ -46,17 +46,17 @@ ArticleMaker - + No translation for <b>%1</b> was found in group <b>%2</b>. Aucune traduction pour <b>%1</b> n'a été trouvée dans le groupe <b>%2</b>. - + No translation was found in group <b>%1</b>. Aucune traduction trouvée dans le groupe <b>%1</b>. - + Welcome! Bienvenue ! @@ -65,17 +65,17 @@ <h3 align="center">Bienvenue dans <b>GoldenDict</b> !</h3><p>Pour commencer à utiliser le logiciel, visitez d'abord <b>Édition|Dictionnaires</b> pour ajouter des emplacements où trouver les fichiers de dictionnaires, configurer divers sites Wikipédia ou d'autres sources, ajuster l'ordre des dictionnaires ou créer des groupes de dictionnaires.<p>Vous êtes paré pour lancer de nouvelles recherches ! Vous pouvez faire cela en utilisant le panneau à gauche de cette fenêtre, ou vous pouvez <a href="Working with popup">chercher les mots d'autres applications actives</a>. <p>Pour personnaliser le logiciel, vérifiez les options disponibles dans <b>Édition|Préférences</b>. Tous les paramètres y disposent d'une aide, lisez-les bien en cas de doute !<p>Si vous avez besoin d'aide, avez des questions, des suggestions ou désirez vous enquérir de l'avis d'autrui, vous serez les bienvenus sur le's <a href="http://goldendict.org/forum/">forum</a>.<p>Visitez le 's <a href="http://goldendict.org/">site</a> du logiciel pour les mises à jour. <p>(c) 2008-2012 Konstantin Isakov. Sous licence GPLv3 ou plus récente. - + Expand article Agrandir l'article - + Collapse article Diminuer l'article - + <h3 align="center">Welcome to <b>GoldenDict</b>!</h3><p>To start working with the program, first visit <b>Edit|Dictionaries</b> to add some directory paths where to search for the dictionary files, set up various Wikipedia sites or other sources, adjust dictionary order or create dictionary groups.<p>And then you're ready to look up your words! You can do that in this window by using a pane to the left, or you can <a href="Working with popup">look up words from other active applications</a>. <p>To customize program, check out the available preferences at <b>Edit|Preferences</b>. All settings there have tooltips, be sure to read them if you are in doubt about anything.<p>Should you need further help, have any questions, suggestions or just wonder what the others think, you are welcome at the program's <a href="http://goldendict.org/forum/">forum</a>.<p>Check program's <a href="http://goldendict.org/">website</a> for the updates. <p>(c) 2008-2013 Konstantin Isakov. Licensed under GPLv3 or later. <h3 align="center">Bienvenue dans <b>GoldenDict</b> !</h3> <p>Pour commencer à utiliser GoldenDict, visitez d'abord <b>Édition|Dictionnaires</b> pour ajouter des emplacements où trouver les fichiers de dictionnaires, configurer des sites Wikipédia ou d'autres sources, ajuster l'ordre des dictionnaires ou créer des groupes de dictionnaires.<p>Vous êtes paré pour lancer de nouvelles recherches ! Vous pouvez faire cela en utilisant le panneau à gauche de cette fenêtre, ou vous pouvez <a href="Working with popup">chercher les mots à partir d'autres applications actives</a>. @@ -85,32 +85,32 @@ <p>(c) 2008-2013 Konstantin Isakov. Sous licence GPLv3 ou ultérieure. - + Working with popup Utilisation avec pop-up - + <h3 align="center">Working with the popup</h3>To look up words from other active applications, you would need to first activate the <i>"Scan popup functionality"</i> in <b>Preferences</b>, and then enable it at any time either by triggering the 'Popup' icon above, or by clicking the tray icon down below with your right mouse button and choosing so in the menu you've popped. <h3 align="center">Utilisation avec fenêtre de scan</h3>Pour rechercher des mots à partir d'autres applications actives, vous devez d'abord activer la fonctionnalité <i>"Fonction de scan avec fenêtre pop-up"</i> dans les <b>Préférences</b>, et ensuite l'activer à tout moment en cliquant sur l'icône 'Fenêtre de scan', ou par clic droit sur l'icône de la barre des tâches, puis sélection de la fonctionnalité dans le menu déroulant. - + Then just stop the cursor over the word you want to look up in another application, and a window would pop up which would describe it to you. Ensuite, positionnez le curseur au-dessus du mot que vous souhaitez rechercher dans l'application, et une fenêtre le décrivant apparaîtra. - + Then just select any word you want to look up in another application by your mouse (double-click it or swipe it with mouse with the button pressed), and a window would pop up which would describe the word to you. Ensuite, sélectionnez avec la souris (ou double-cliquez) le mot que vous souhaitez rechercher dans l'application, et une fenêtre le décrivant apparaîtra. - + (untitled) (sans titre) - + (picture) (image) @@ -118,37 +118,37 @@ ArticleRequest - + Expand article Agrandir l'article - + From De - + Collapse article Diminuer l'article - + Query error: %1 Erreur dans la requête : %1 - + Close words: Mots se rapprochant : - + Compound expressions: Expressions composées : - + Individual words: Mots seuls : @@ -161,97 +161,99 @@ Formulaire - + about:blank about:blank - + x x - + Find: Trouver : - + + &Previous &Précédent - + + &Next &Suivant - + Ctrl+G Ctrl+G - + &Case Sensitive Sensible à la &casse - + Highlight &all &Tout surligner - + Select Current Article Sélectionner l'article courant - + Copy as text Copier le texte - + Inspect Inspecter - + Resource Ressource - + Audio Audio - + TTS Voice Synthèse vocale TTS - + Picture Image - + Video Vidéo - + Video: %1 Vidéo : %1 - + Definition from dictionary "%1": %2 Définition à partir du dictionnaire "%1" : %2 - + Definition: %1 Définition : %1 @@ -260,38 +262,39 @@ GoldenDict - - + + The referenced resource doesn't exist. La ressource référencée n'existe pas. - + The referenced audio program doesn't exist. Le programme référencé n'existe pas. - + + ERROR: %1 ERREUR : %1 - + Save sound Enregistrer le fichier audio - + Sound files (*.wav *.ogg *.mp3 *.mp4 *.aac *.flac *.mid *.wv *.ape);;All files (*.*) Fichiers audio (*.wav *.ogg *.mp3 *.mp4 *.aac *.flac *.mid *.wv *.ape);;All files (*.*) - + Save image Enregistrer l'image - + Image files (*.bmp *.jpg *.png *.tif);;All files (*.*) Fichiers image (*.bmp *.jpg *.png *.tif);;Tous les fichiers (*.*) @@ -300,63 +303,63 @@ Erreur lors de l'enregistrement de la ressource : - + &Open Link &Ouvrir un lien - + Open Link in New &Tab Ouvrir un lien dans un nouvel on&glet - + Open Link in &External Browser Ouvrir un lien dans un navigateur &externe - + Save &image... Enregistrer l'&image... - + Save s&ound... Enregistrer le fichier audi&o... - + &Look up "%1" Re&chercher "%1" - + Look up "%1" in &New Tab Rechercher "%1" dans un &nouvel onglet - + Send "%1" to input line Envoyer "%1" dans la zone de saisie - - + + &Add "%1" to history &Ajouter "%1" à l'historique - + Look up "%1" in %2 Rechercher "%1" dans %2 - + Look up "%1" in %2 in &New Tab Rechercher "%1" dans "%2" dans un &nouvel onglet - + WARNING: FFmpeg Audio Player: %1 ATTENTION : lecteur audio FFmpeg : %1 @@ -369,7 +372,7 @@ Pour activer la lecture de fichiers de type autre que WAV, allez dans Édition|Préférences, choisissez l'onglet Audio et sélectionnez "Lire avec DirectShow". - + WARNING: %1 ATTENTION : %1 @@ -382,22 +385,22 @@ La bibliothèque Bass ne peut lire ce son. - + Failed to run a player to play sound file: %1 Échec de lancement d'un lecteur pour lire le fichier audio %1 - + Failed to create temporary file. Échec de création d'un fichier temporaire. - + Failed to auto-open resource file, try opening manually: %1. Échec lors de l'ouverture automatique du fichier de ressources, essayez d'ouvrir manuellement : %1. - + The referenced resource failed to download. La ressource référencée n'a pas pu être téléchargée. @@ -422,6 +425,29 @@ + Dialog + + + Proxy authentication required + Authentification requise pour le proxy + + + + You need to supply a Username and a Password to access via proxy + Un nom d'utilisateur et un mot de passe sont requis pour utiliser un proxy + + + + Username: + Utilisateur : + + + + Password: + Mot de passe : + + + DictGroupWidget @@ -522,6 +548,119 @@ + DictHeadwords + + + Search mode + Mode de recherche + + + + This element determines how filter string will be interpreted + Détermine la façon dont le filtre sera interprété + + + + If checked on the symbols case will be take in account when filtering + La casse des caractères sera considérée lors du filtrage + + + + Match case + Respecter la casse + + + + Exports headwords to file + Enregistre les vedettes dans un fichier + + + + Export + Exporter + + + + Help + Aide + + + + OK + Appliquer + + + + Press this button to apply filter to headwords list + Applique le filtre à la liste de vedettes + + + + Apply + Appliquer + + + + If checked any filter changes will we immediately applied to headwords list + Tous les changements de filtre seront automatiquement appliqués à la liste de vedettes + + + + Auto apply + Appliquer automatiquement + + + + Filter: + Filtre : + + + + Filter string (fixed string, wildcards or regular expression) + Filtre (chaîne de caractères, opérateurs de cardinalité ou expression régulière) + + + + Text + Texte + + + + Wildcards + Opérateurs de cardinalité + + + + RegExp + Expression régulière + + + + Unique headwords total: %1, filtered: %2 + Total de vedettes uniques : %1, %2 filtrées + + + + Save headwords to file + Enregistrer les vedettes dans un fichier + + + + Text files (*.txt);;All files (*.*) + Fichiers texte (*.txt);;Tous les fichiers (*.*) + + + + Export headwords... + Exporter les vedettes ... + + + + Cancel + Annuler + + + DictInfo @@ -564,6 +703,16 @@ Description : + + Show all unique dictionary headwords + Montrer toutes les vedettes uniques du dictionnaire + + + + Headwords + Vedettes + + Edit the dictionary via command: %1 @@ -580,6 +729,76 @@ + DictServer + + + Url: + Adresse : + + + + Databases: + Bases de données : + + + + Search strategies: + Stratégies de recherche : + + + + Server databases + Bases de données serveur + + + + DictServersModel + + + Enabled + Activé + + + + Name + Nom + + + + Address + Adresse + + + + Databases + Bases de données + + + + Strategies + Stratégies + + + + Icon + Icône + + + + Comma-delimited list of databases +(empty string or "*" matches all databases) + Liste de bases de données, séparées par des virgules +(une chaîne vide ou "*" sélectionne toutes les bases) + + + + Comma-delimited list of search strategies +(empty string mean "prefix" strategy) + Liste de stratégies, séparées par des virgules +(une chaîne vide impliquera une stratégie par "préfixe") + + + DictionaryBar Dictionary Bar @@ -601,17 +820,22 @@ Éditer ce groupe - + Dictionary info Informations sur le dictionnaire - + + Dictionary headwords + Vedettes du dictionnaire + + + Open dictionary folder Ouvrir le dossier des dictionnaires - + Edit dictionary Éditer le dictionnaire @@ -624,39 +848,39 @@ Dictionnaires - + &Sources &Sources - - + + &Dictionaries &Dictionnaires - - + + &Groups &Groupes - + Sources changed Sources modifiées - + Some sources were changed. Would you like to accept the changes? Certaines sources ont été modifiées. Acceptez-vous ces changements ? - + Accept Accepter - + Cancel Annuler @@ -670,6 +894,93 @@ + FTS::FtsIndexing + + + None + Aucun + + + + FTS::FullTextSearchDialog + + + Full-text search + Recherche en texte intégral + + + + Whole words + Mots entiers + + + + Plain text + Texte intégral + + + + Wildcards + Opérateurs de cardinalité + + + + RegExp + Expression régulière + + + + Max distance between words (%1-%2): + Distance max entre les mots (%1-%2) : + + + + Max articles per dictionary (%1-%2): + Articles max par dictionnaire (%1-%2) : + + + + + + Articles found: + Articles trouvés : + + + + Now indexing: + En cours d'indexation : + + + + CJK symbols in search string are not compatible with search modes "Whole words" and "Plain text" + Les symboles CJK dans la chaîne de recherche ne sont pas compatibles avec les modes "Mots entiers" et "Texte intégral" + + + + The search line must contains at least one word containing + the source sentence is a bit weird... + La ligne de recherche doit contenir au moins un mot de + + + + or more symbols + symboles ou plus + + + + No dictionaries for full-text search + Pas de dictionnaires pour la recherche en texte intégral + + + + FTS::Indexing + + + None + Aucun + + + Forvo::ForvoArticleRequest @@ -708,6 +1019,65 @@ + FullTextSearchDialog + + + + Search + Recherche + + + + Match case + Respecter la casse + + + + Mode: + Mode : + + + + Articles found: + Articles trouvés : + + + + Available dictionaries in group: + Dictionnaires disponibles dans le groupe : + + + + Wait for indexing: + Indexation en cours : + + + + Total: + Total : + + + + Indexed: + Indexés : + + + + Now indexing: None + En cours d'indexation : Aucun + + + + Cancel + Annuler + + + + Help + Aide + + + GermanTranslit @@ -838,7 +1208,7 @@ - + Remove all groups Retirer tous les groupes @@ -849,42 +1219,100 @@ Glissez-déposez les dictionnaires entre les groupes, déplacez-les à l'intérieur des groupes, réorganisez les groupes en utilisant votre souris. - + + Group tabs + Grouper les onglets + + + + Open groups list + Ouvrir la liste de groupes + + + Add group Ajouter groupe - + Give a name for the new group: Nommer le nouveau groupe : - + Rename group Renommer le groupe - + Give a new name for the group: Renommer le groupe : - + Remove group Retirer le groupe - + Are you sure you want to remove the group <b>%1</b>? Êtes-vous sûr de vouloir enlever le groupe <b>%1</b> ? - + Are you sure you want to remove all the groups? Êtes-vous sûr de vouloir enlever tous les groupes ? + Help::HelpWindow + + + GoldenDict help + Aide de GoldenDict + + + + Home + Accueil + + + + Back + Précédent + + + + Forward + Suivant + + + + Zoom In + Zoomer + + + + Zoom Out + Dézoomer + + + + Normal Size + Taille normale + + + + Content + Contenu + + + + Index + Index + + + HistoryPaneWidget @@ -915,12 +1343,12 @@ Hunspell - + Spelling suggestions: Orthographes suggérées : - + %1 Morphology %1 Morphologie @@ -928,12 +1356,12 @@ HunspellDictsModel - + Enabled Activé - + Name Nom @@ -1973,7 +2401,7 @@ LoadDictionaries - + Error loading dictionaries Erreur lors du chargement des dictionnaires @@ -1981,7 +2409,7 @@ Main - + Error in configuration file. Continue with default settings? Erreur dans le fichier de configuration. Continuer avec les paramètres par défaut ? @@ -1994,37 +2422,37 @@ - + Welcome! Bienvenue ! - + &File &Fichier - + &Edit Éditio&n - + &Help &Aide - + &View &Vue - + &Zoom &Zoom - + H&istory &Historique @@ -2037,12 +2465,12 @@ Résultats - + &Search Pane Re&chercher - + &Results Navigation Pane &Résultats de la recherche @@ -2051,154 +2479,184 @@ &Dictionnaires... F3 - + + Search + Recherche + + + &History Pane &Historique - + &Dictionaries... &Dictionnaires... - + F3 F3 - + &Preferences... &Préférences... - + F4 f4 - + &Homepage &Accueil - + &About &À propos - + About GoldenDict À propos de GoldenDict - + + GoldenDict reference + Référence de GoldenDict + + + F1 F1 - - + + &Quit &Quitter - + Quit from application Quitter à partir de l'application - + Ctrl+Q Ctrl+Q - + &Forum &Forum - + &Close To Tray &Fermer - + Minimizes the window to tray Réduit la fenêtre dans la barre des tâches - + Ctrl+F4 Ctrl+F4 - + &Save Article &Sauver l'article - + Save Article Sauver l'article - + F2 F2 - + &Print Im&primer - + Ctrl+P Ctrl+P - + Page Set&up Paramètres d'&impression - + Print Pre&view &Aperçu avant impression - + &Rescan Files &Rescanner les fichiers - + &New Tab &Nouvel onglet - + &Always on Top Toujours au-&dessus - + Always on Top Toujours au-dessus - + Ctrl+O Ctrl+O - - - + + + Menu Button Bouton du menu + + Search in page + Rechercher dans la page + + + + Ctrl+F + Ctrl+F + + + + Full-text search + Recherche en texte intégral + + + + Ctrl+Shift+F + Ctrl+Shift+F + + Print Preview Aperçu avant impression @@ -2207,48 +2665,48 @@ Rescanner les fichiers - + Ctrl+F5 Ctrl+F5 - + &Clear E&ffacer - + New Tab Nouvel onglet - + Ctrl+T Ctrl+T - + &Configuration Folder Dossier de &configuration - - + + &Show Affi&cher - + Ctrl+H Ctrl+H - + &Export &Exporter - + &Import &Importer @@ -2261,7 +2719,7 @@ Afficher des petites icônes dans les barres d'outils - + &Menubar Barre du &menu @@ -2270,138 +2728,138 @@ Navigation - + Show Names in Dictionary &Bar Afficher les noms dans la &barre de dictionnaire - + Show Small Icons in &Toolbars Afficher de petites icônes dans les barres d'ou&tils - + &Navigation &Navigation - + Back Précédent - + Forward Suivant - + Scan Popup Fenêtre de scan - + Pronounce Word (Alt+S) Prononcer le mot (Alt+S) - + Zoom In Zoomer - + Zoom Out Dézoomer - + Normal Size Taille normale - - + + Look up in: Chercher dans : - + Found in Dictionaries: Trouvé dans les dictionnaires : - + Words Zoom In Zoomer - + Words Zoom Out Dézoomer - + Words Normal Size Taille normale - + Show &Main Window Afficher la fenêtre &principale - + Opened tabs Onglets ouverts - + Close current tab Fermer l'onglet courant - + Close all tabs Fermer tous les onglets - + Close all tabs except current Fermer tous les onglets sauf l'onglet courant - + Loading... Chargement... - + %1 dictionaries, %2 articles, %3 words %1 dictionnaires, %2 articles, %3 mots - + Look up: Chercher : - + All Tout - + Open Tabs List Liste des onglets ouverts - + (untitled) (sans titre) - + %1 - %2 %1 - %2 @@ -2410,73 +2868,80 @@ ATTENTION : %1 - + Failed to initialize hotkeys monitoring mechanism.<br>Make sure your XServer has RECORD extension turned on. Échec lors de l'initialisation du mécanisme d'écoute des raccourcis.<br>Vérifiez que l'extension ENREGISTREMENT du serveur X est activée. - + New Release Available Nouvelle version disponible - + Version <b>%1</b> of GoldenDict is now available for download.<br>Click <b>Download</b> to get to the download page. La version <b>%1</b> de GoldenDict est disponible au téléchargement.<br>Cliquez sur <b>Télécharger</b> pour accéder à la page de téléchargement. - + Download Téléchargement - + Skip This Release Ignorer la version - - + + Accessibility API is not enabled L'API d'accessibilité n'est pas activée - + + String to search in dictionaries. The wildcards '*', '?' and sets of symbols '[...]' are allowed. +To find '*', '?', '[', ']' symbols use '\*', '\?', '\[', '\]' respectively + Chaîne à rechercher dans les dictionnaires. Les opérateurs de cardinalité '*', '?' et les groupes de symboles '[...]' sont autorisés. +Pour rechercher les symboles '*', '?', '[', ']', utiliser respectivement '\*', '\?', '\[', '\]' + + + You have chosen to hide a menubar. Use %1 to show it back. Vous avez choisi de masquer une barre de menus. Utilisez %1 pour l'afficher à nouveau. - + Ctrl+M Ctrl+M - + Page Setup Paramètres d'impression - + No printer is available. Please install one first. Aucune imprimante n'est disponible. Veuillez en installer une afin de continuer. - + Print Article Imprimer l'article - + Article, Complete (*.html) Article, Complet (*.html) - + Article, HTML Only (*.html) Article, HTML uniquement (*.html) - + Save Article As Enregister l'article sous @@ -2485,27 +2950,27 @@ Fichiers HTML (*.html *.htm) - + Error Erreur - + Can't save article: %1 Impossible d'enregistrer l'article : %1 - + Saving article... Sauvegarde de l'article... - + The main window is set to be always on top. La fenêtre pricipale est configurée pour être toujours au premier plan. - + &Hide &Masquer @@ -2514,28 +2979,28 @@ Mode d'affichage de l'historique - + Export history to file Exporter l'historique dans un fichier - - + + Text files (*.txt);;All files (*.*) Fichiers texte (*.txt);;Tous les fichiers (*.*) - + History export complete Export de l'historique terminé - + Export error: Erreur d'export : - + Import history from file Importer l'historique à partir d'un fichier @@ -2544,32 +3009,37 @@ Importé à partir du fichier : - + Import error: invalid data in file Erreur d'import : données invalides dans le fichier - + History import complete Import d'historique terminé - + Import error: Erreur d'import : - + Dictionary info Informations sur le dictionnaire - + + Dictionary headwords + Vedettes du dictionnaire + + + Open dictionary folder Ouvrir le dossier des dictionnaires - + Edit dictionary Éditer le dictionnaire @@ -2577,12 +3047,12 @@ Mdx::MdxArticleRequest - + Dictionary file was tampered or corrupted Le fichier de dictionnaire a été modifié ou corrompu - + Failed loading article from %1, reason: %2 Échec du chargement de l'article à partir de %1, cause : %2 @@ -2590,7 +3060,7 @@ MediaWiki::MediaWikiArticleRequest - + XML parse error: %1 at %2,%3 Erreur de lecture XML : %1 à la position %2,%3 @@ -2598,7 +3068,7 @@ MediaWiki::MediaWikiWordSearchRequest - + XML parse error: %1 at %2,%3 Erreur de lecture XML : %1 à la position %2,%3 @@ -2606,22 +3076,22 @@ MediaWikisModel - + Enabled Activé - + Name Nom - + Address Adresse - + Icon Icône @@ -2634,88 +3104,94 @@ Formulaire - + Dictionary order: Ordre des dictionnaires : - - - - ... - ... + ... - + Inactive (disabled) dictionaries: Dictionnaires inactifs : - + Dictionary information Informations sur le dictionnaire - + Name: Nom : - + Total articles: Articles : - + Total words: Mots : - + Translates from: Traduit de : - + Translates to: Traduit vers : - + Description: Description : - + Files comprising this dictionary: Fichiers incluant ce dictionnaire : - + Adjust the order by dragging and dropping items in it. Drop dictionaries to the inactive group to disable their use. Définissez l'ordre des éléments en les déplaçant (glisser-déposer). Déposez les dictionnaires dans le groupe 'inactif' pour désactiver leur utilisation. - + Sort by name Trier par nom - + Sort by languages Trier par langue + + + Dictionary headwords + Vedettes du dictionnaire + + + + Dictionaries active: %1, inactive: %2 + Dictionnaires actifs : %1, inactifs : %2 + PathsModel - + Path Chemin - + Recursive Récursif @@ -2873,22 +3349,27 @@ Style d'add-on : - + + Help language + Langue de l'aide + + + Adjust this value to avoid huge context menus. Ajustez cette valeur pour éviter de surcharger les menus contextuels. - + Context menu dictionaries limit: Limite de dictionnaires dans les menus contextuels : - + &Scan Popup Fenêtre de &scan - + When enabled, a translation popup window would be shown each time you point your mouse on any word on the screen (Windows) or select any word with mouse (Linux). When enabled, you can switch it on and @@ -2899,135 +3380,135 @@ Lorsque cette option est active, il est possible d'activer/désactiver la fenêtre de scan à partir de la fenêtre principale ou de l'icône de la barre des tâches. - + Enable scan popup functionality Activer le scan par fenêtre pop-up - + Chooses whether the scan popup mode is on by default or not. If checked, the program would always start with the scan popup active. Définit si la fonctionnalité de scan par fenêtre pop-up est activée par défaut ou non. Si cette option est active, GoldenDict démarrera toujours avec la fenêtre de scan activée. - + Start with scan popup turned on Démarrer avec la fenêtre de scan activée - + With this enabled, the popup would only show up if all chosen keys are in the pressed state when the word selection changes. La pop-up n'apparâit que si toutes les touches sélectionnées sont enfoncées lorsque la sélection de mot change. - + Only show popup when all selected keys are kept pressed: Ne montrer la pop-up que lorsque les touches sélectionnées sont maintenues enfoncées : - + Left Ctrl only Ctrl gauche uniquement - + Left Ctrl Ctrl gauche - + Right Shift only Maj droite uniquement - + Right Shift Maj droite - + Alt key Touche Alt - + Alt Alt - + Ctrl key Touche Ctrl - + Ctrl Ctrl - + Left Alt only Alt gauche uniquement - + Left Alt Alt gauche - + Shift key Touche Maj - + Shift Maj - + Right Alt only Alt droite uniquement - + Right Alt Alt droite - + Right Ctrl only Ctrl droite uniquement - + Right Ctrl Ctrl droite - + Left Shift only Maj gauche uniquement - + Left Shift Maj gauche - + Windows key or Meta key Touche Windows ou Meta - + Win/Meta Win/Meta - + Normally, in order to activate a popup you have to maintain the chosen keys pressed while you select a word. With this enabled, the chosen keys may also @@ -3037,12 +3518,12 @@ touches après avoir effectué la sélection. - + Keys may also be pressed afterwards, within Les touches peuvent être pressées dans un délai de - + To avoid false positives, the keys are only monitored after the selection's done for a limited amount of seconds, which is specified here. @@ -3051,42 +3532,42 @@ de temps limité, ici spécifié en secondes. - + secs secondes - + Send translated word to main window instead of to show it in popup window Envoyer la traduction du mot vers la fenêtre principale de GoldenDict au lieu de la montrer dans une pop-up - + Send translated word to main window Envoyer la traduction du mot vers la fenêtre principale - + Hotkeys Raccourcis - + Use the following hotkey to show or hide the main window: Utiliser ce raccourci pour afficher ou cacher la fenêtre principale : - + Use the following hotkey to translate a word from clipboard: Utiliser ce raccourci pour traduire un mot à partir du presse-papiers : - + The hotkeys are global and work from any program and within any context as long as GoldenDict is running in background. Les raccourcis sont globaux et utilisables à partir de n'importe quel programme, quel que soit le contexte, tant que GoldenDict est actif en arrière-plan. - + <!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; } @@ -3099,57 +3580,93 @@ <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" color:#ff0000;">Note : Il semble que vous utilisez une version de Xorg XServer dont la fonction RECORD est défaillante. Les raccourcis peuvent ne pas fonctionner dans GoldenDict. Cela doit être corrigé dans le serveur. Veuillez vous référer au </span><a href="https://bugs.freedesktop.org/show_bug.cgi?id=20500"><span style=" text-decoration: underline; color:#0000ff;">report de bug</span></a><span style=" color:#ff0000;"> et laissez un commentaire si vous le souhaitez.</span></p></body></html> - + &Audio &Audio - + Pronunciation Prononciation - + Auto-pronounce words in main window Prononciation automatique dans la fenêtre principale - + Auto-pronounce words in scan popup Prononciation automatique dans la fenêtre de scan - + Playback Lecture - + Play audio files via FFmpeg(libav) and libao Lire les fichiers audio via FFmpeg (libav) et libao - + Use internal player Utiliser le lecteur interne - + + System proxy + Proxy du système + + + + Custom proxy + Proxy personnalisé + + + + Custom settings + Paramètres personnalisés + + + + Full-text search + Recherche en texte intégral + + + + Allow full-text search for: + Autoriser la recherche en texte intégral pour : + + + + Don't search in dictionaries containing more than + typo in source sentence? *containing* more than + Ne pas rechercher dans les dictionnaires contenant plus de + + + + articles (0 - unlimited) + article(s) (0 - pas de limite) + + + Select this option to automatic collapse big articles Sélectionnez cette option pour réduire automatiquement les longs articles - + Collapse articles more than Réduire les articles de plus de - + Articles longer than this size will be collapsed Les articles dépassant cette longueur seront réduits - + symbols symboles @@ -3184,59 +3701,59 @@ Lire avec la bibliothèque Bass - + Use any external program to play audio files Utiliser un programme externe pour lire les fichiers audio - + Use external program: Utiliser un programme externe : - + &Network &Réseau - + Enable if you wish to use a proxy server for all program's network requests. Activez cette option pour utiliser un serveur proxy pour toutes les requêtes passant par le réseau. - + Use proxy server Utiliser un proxy - + Type: Type : - + Host: Hôte : - + Port: Port : - + User: Utilisateur : - + Password: Mot de passe : - + Enabling this would make GoldenDict block most advertisements by disallowing content (images, frames) not originating from the site you are browsing. If some site breaks because of this, try disabling this. @@ -3245,12 +3762,12 @@ que du contenu est manquant, essayez de désactiver cette option. - + Disallow loading content from other sites (hides most advertisements) Empêcher le chargement de contenu en provenance d'autres sites (cache la plupart des publicités) - + Enabling this would allow to listen to sound pronunciations from online dictionaries that rely on Flash or other web plugins. Plugin must be installed for this option to work. @@ -3259,24 +3776,24 @@ Le greffon approprié doit être installé pour que cette option fonctionne. - + Enable web plugins Activer les greffons web - + Some sites detect GoldenDict via HTTP headers and block the requests. Enable this option to workaround the problem. Certains sites détectent GoldenDict à travers les en-tête HTTP et bloquent les requêtes. Activer cette option permet de contourner ce problème. - + Do not identify GoldenDict in HTTP headers Ne pas s'identifier en tant que GoldenDict dans les en-têtes HTTP - + When this is enabled, the program periodically checks if a new, updated version of GoldenDict is available for download. If it is so, the program @@ -3288,22 +3805,22 @@ téléchargement. - + Check for new program releases periodically Vérifier régulièrement les mises à jour - + Ad&vanced A&vancé - + ScanPopup extra technologies Fenêtre de scan - + Try to use IAccessibleEx technology to retrieve word under cursor. This technology works only with some programs that support it (for example Internet Explorer 9). @@ -3314,12 +3831,12 @@ Il n'est pas nécessaire d'activer cette option si vous n'utilisez pas de tels programmes. - + Use &IAccessibleEx Utiliser &IAccessibleEx - + Try to use UI Automation technology to retrieve word under cursor. This technology works only with some programs that support it. It is not needed to select this option if you don't use such programs. @@ -3327,12 +3844,12 @@ Cette fonction marche uniquement avec les programmes qui la supportent. - + Use &UIAutomation Utiliser l'a&utomatisation de l'interface - + Try to use special GoldenDict message to retrieve word under cursor. This technology works only with some programs that support it. It is not needed to select this option if you don't use such programs. @@ -3341,97 +3858,98 @@ Ne fonctionne qu'avec les programmes qui le supportent. - + Use &GoldenDict message Utiliser les messages de &GoldenDict - + History Historique - + Turn this option on to store history of the translated words Conserver l'historique des mots traduits - + Store &history Conserver l'&historique - + Specify the maximum number of entries to keep in history. Nombre maximal d'entrées à conserver dans l'historique. - + Maximum history size: Taille maximale de l'historique : - + History saving interval. If set to 0 history will be saved only during exit. Intervalle de sauvegarde de l'historique. Si cette valeur vaut 0, l'historique sera sauvegardé uniquement lors de la sortie du programme. - + Save every Sauver toutes les - + minutes minutes - + Articles Articles - + Turn this option on to always expand optional parts of articles Toujours afficher les parties optionnelles des articles - + Expand optional &parts Afficher les &parties optionnelles - + System default Défaut (système) - + + Default Défaut - + Modern Moderne - + Lingvo Lingvo - + Babylon Babylon - + Lingoes Lingoes - + Lingoes-Blue Lingoes-Bleu @@ -3440,12 +3958,12 @@ Jouer via DirectShow - + Changing Language Changement de langue - + Restart the program to apply the language change. Redémarrez le programme pour appliquer le changement de langue. @@ -3453,27 +3971,27 @@ ProgramTypeEditor - + Audio Audio - + Plain Text Texte - + Html Html - + Prefix Match Préfixe - + Unknown Inconnu @@ -3499,27 +4017,27 @@ ProgramsModel - + Enabled Activé - + Type Type - + Name Nom - + Command Line Ligne de commande - + Icon Icône @@ -3527,12 +4045,14 @@ QObject - + + Article loading error Erreur de chargement de l'article - + + Article decoding error Erreur de décodage de l'article @@ -3643,19 +4163,19 @@ ResourceToSaveHandler - - + + ERROR: %1 ERREUR : %1 - + Resource saving error: Erreur lors de l'enregistrement de la ressource : - + The referenced resource failed to download. La ressource référencée n'a pas pu être téléchargée. @@ -3663,12 +4183,12 @@ Romaji - + Hepburn Romaji for Hiragana Rōmaji Hepburn pour l'Hiragana - + Hepburn Romaji for Katakana Rōmaji Hepburn pour le Katakana @@ -3693,21 +4213,21 @@ mot - + Back Précédent - - - - - + + + + + ... ... - + Forward Suivant @@ -3720,32 +4240,32 @@ Alt+M - + Pronounce Word (Alt+S) Prononcer le mot (Alt+S) - + Alt+S Alt+S - + Send word to main window (Alt+W) Envoyer le mot vers la fenêtre principale (Alt+W) - + Alt+W Alt+W - + Shows or hides the dictionary bar Affiche ou masque la barre de dictionnaire - + Use this to pin down the window so it would stay on screen, could be resized or managed in other ways. Utiliser pour épingler la fenêtre de manière à ce qu'elle reste à l'écran, puisse être redimensionnée ou gérée par d'autres moyens. @@ -3755,8 +4275,8 @@ GoldenDict - - + + %1 - %2 %1 - %2 @@ -3764,17 +4284,17 @@ SoundDirsModel - + Path Chemin - + Name Nom - + Icon Icône @@ -3796,7 +4316,8 @@ - + + &Add... &Ajouter... @@ -3805,7 +4326,8 @@ - + + &Remove &Retirer @@ -3882,7 +4404,7 @@ Alternativement, utilisez %GD1251% pour le CP1251, %GDISO1% pour l'ISO 8859-1. - + Programs Programmes @@ -3891,34 +4413,34 @@ N'importe quel programme externe. Une chaîne %GDWORD% sera remplacée par le mot recherché. Le mot sera aussi utilisé dans l'entrée standard. - + Forvo Forvo - + Live pronunciations from <a href="http://www.forvo.com/">forvo.com</a>. The site allows people to record and share word pronunciations. You can listen to them from GoldenDict. Prononciations par <a href="http://www.forvo.com/">forvo.com</a>. Le site permet aux utilisateurs d'enregistrer et partager des prononciations de mots. Vous pouvez les écouter à partir de GoldenDict. - + Enable pronunciations from Forvo Activer les prononciations à partir de Forvo - + API Key: Clé API : - + Use of Forvo currently requires an API key. Leave this field blank to use the default key, which may become unavailable in the future, or register on the site to get your own key. L'utilisation de Forvo requiert une clé API. Laissez ce champ vide pour utiliser la clé par défaut, qui est susceptible de ne plus être disponible à l'avenir, ou inscrivez-vous sur le site pour obtenir votre propre clé. - + Get your own key <a href="http://api.forvo.com/key/">here</a>, or leave blank to use the default one. Obtenez une nouvelle clé <a href="http://api.forvo.com/key/">ici</a>, ou laissez le champ vide pour utiliser la clé par défaut. @@ -3948,79 +4470,89 @@ %GDBIG5% pour Big-5, %GDBIG5HKSCS% pour Big5-HKSCS, %GDGBK% pour GBK et GB18030, %GDSHIFTJIS% pour Shift-JIS. + + DICT servers + Serveurs DICT + + + DICT servers: + Serveurs DICT : + + + Any external programs. A string %GDWORD% will be replaced with the query word. If such string is not presented, the word will be fed into standard input. N'importe quel programme externe. Une chaîne %GDWORD% sera remplacée par le mot recherché. Si aucune chaîne n'est détectée, le mot sera soumis sur l'entrée standard. - + Language codes (comma-separated): Codes des langues (séparés par des virgules) : - + List of language codes you would like to have. Example: "en, ru". Liste des codes de langues dont vous souhaitez disposer. Par exemple : "fr, en". - + Full list of language codes is available <a href="http://www.forvo.com/languages-codes/">here</a>. La liste complète des codes de langues est disponible <a href="http://www.forvo.com/languages-codes/">ici</a>. - + Transliteration Tanslitération - + Russian transliteration Translitération russe - + Greek transliteration Translitération grecque - + German transliteration Translitération allemande - + Belarusian transliteration Translitération biélorusse - + Enables to use the Latin alphabet to write the Japanese language Activer l'utilisation de l'alphabet latin pour écrire le japonais - + Japanese Romaji Japonais (Rōmaji) - + Systems: Systèmes : - + The most widely used method of transcription of Japanese, based on English phonology La méthode la plus largement utilisée pour transcrire le japonais, basée sur la phonologie anglaise - + Hepburn Hepburn - + The most regular system, having a one-to-one relation to the kana writing systems. Standardized as ISO 3602 @@ -4031,12 +4563,12 @@ Pas encore implémenté dans GoldenDict. - + Nihon-shiki Nihon-shiki - + Based on Nihon-shiki system, but modified for modern standard Japanese. Standardized as ISO 3602 @@ -4047,75 +4579,77 @@ Pas encore implémenté dans GoldenDict. - + Kunrei-shiki Kunrei-shiki - + Syllabaries: Syllabaires : - + Hiragana Japanese syllabary Syllabaire japonais (Hiragana) - + Hiragana Hiragana - + Katakana Japanese syllabary Syllabaire japonais (Katakana) - + Katakana Katakana - + Text to Speech Synthèse vocale TTS - + (not available in portable version) (non disponible dans la version portable) - - - + + + Choose a directory Sélectionner un répertoire - - - - - + + + + + + Confirm removal Confirmer la suppression - - + + Remove directory <b>%1</b> from the list? Retirer le dossier <b>%1</b> de la liste ? - - + + + Remove site <b>%1</b> from the list? Retirer le site <b>%1</b> de la liste ? - + Remove program <b>%1</b> from the list? Retirer le programme <b>%1</b> de la liste ? @@ -4245,22 +4779,22 @@ WebSitesModel - + Enabled Activé - + Name Nom - + Address Adresse - + Icon Icône @@ -4268,7 +4802,7 @@ WordFinder - + Failed to query some dictionaries. Échec d'interrogation de certains dictionnaires. diff -Nru goldendict-1.5.0~git20131003/locale/it_IT.ts goldendict-1.5.0~git20150923/locale/it_IT.ts --- goldendict-1.5.0~git20131003/locale/it_IT.ts 2013-10-02 20:42:04.000000000 +0000 +++ goldendict-1.5.0~git20150923/locale/it_IT.ts 2015-09-23 08:26:24.000000000 +0000 @@ -34,7 +34,7 @@ [Sconosciuto] - + Based on Qt %1 (%2, %3 bit) Basato su Qt %1 (%2, %3 bit) @@ -42,62 +42,62 @@ ArticleMaker - + Expand article Espandi traduzione - + Collapse article Compatta traduzione - + No translation for <b>%1</b> was found in group <b>%2</b>. Per <b>%1</b> non è stata trovata alcuna traduzione nel gruppo <b>%2</b>. - + No translation was found in group <b>%1</b>. Non è stata trovata alcuna traduzione nel gruppo <b>%1</b>. - + Welcome! Benvenuto! - + <h3 align="center">Welcome to <b>GoldenDict</b>!</h3><p>To start working with the program, first visit <b>Edit|Dictionaries</b> to add some directory paths where to search for the dictionary files, set up various Wikipedia sites or other sources, adjust dictionary order or create dictionary groups.<p>And then you're ready to look up your words! You can do that in this window by using a pane to the left, or you can <a href="Working with popup">look up words from other active applications</a>. <p>To customize program, check out the available preferences at <b>Edit|Preferences</b>. All settings there have tooltips, be sure to read them if you are in doubt about anything.<p>Should you need further help, have any questions, suggestions or just wonder what the others think, you are welcome at the program's <a href="http://goldendict.org/forum/">forum</a>.<p>Check program's <a href="http://goldendict.org/">website</a> for the updates. <p>(c) 2008-2013 Konstantin Isakov. Licensed under GPLv3 or later. <h3 align="center">Benvenuto in <b>GoldenDict</b>!</h3><p>Prima di iniziare ad usare il programma, apri il menu <b><i>Modifica|Dizionari</b></i> in modo da inserire il percorso della cartella che contiene i dizionari, impostare gli indirizzi di Wikipedia e delle altre risorse internet di traduzione, stabilire, raggruppare o modificare l'ordine di visualizzazione dei dizionari.<p><p><b>Personalizzazioni</b><br>Personalizza il programma, regolando le impostazioni di puntamento previste dal menu <b><i>Modifica|Impostazioni</b></i>.<p><b>Uso del programma</b><br>Un modo tradizionale per usare un dizionario consiste nel digitare il termine da ricercare nella casellina di ricerca (in alto a sinistra in questa stessa finestra).<p><b>Scansiona e traduci le parole puntate</b><br>Altra caratteristica fondamentale di 'GoldenDict' è che non serve neppure digitare la parola da cercare nella casellina di ricerca: basta puntarla col mouse in qualunque applicazione essa si trovi. Clicca <a href="Scansione e traduzione delle parole puntate">scansiona e traduci le parole puntate</a> per scoprire come usarla.<p>In alternativa alla traduzione automatica della parola puntata, è sempre e comunque possibile, <u>selezionarne</u> la parola e <u>premendo</u> la combinazione di tasti <b><i>CTRL+C+C</b></i> vederne comparire la traduzione desiderata.<p><p>Se hai bisogno di ulteriore aiuto, hai domande o suggerimenti o per qualsiasi altra richiesta, il tuo intervento nel <a href="http://goldendict.org/forum/">forum</a> del programma è benvenuto. <p>Controlla nel <a href="http://goldendict.org/">sito web</a> se ci sono nuovi aggiornamenti del programma. <p>(c) 2008-2013 Konstantin Isakov. Licenza GPLv3 o superiori. - + Working with popup Scansione e traduzione delle parole puntate - + <h3 align="center">Working with the popup</h3>To look up words from other active applications, you would need to first activate the <i>"Scan popup functionality"</i> in <b>Preferences</b>, and then enable it at any time either by triggering the 'Popup' icon above, or by clicking the tray icon down below with your right mouse button and choosing so in the menu you've popped. <h3 align="center">Scansione e traduzione delle parole puntate</h3>Per tradurre le parole puntate nelle applicazioni attive, è necessario attivarne la funzione nel modo seguente. Dalla finestra principale, apri il menu <b>Modifica|Impostazioni</b>, quindi la scheda <b><i>"Puntamento"</b></i>. <p>In questa finestra spunta la casella "Abilita l'attività di scansione e traduzione delle parole puntate", imposta a piacimento la scansione e traduzione delle parole puntate e conferma il tutto premendo "OK".<p>Indipendentemente dalle opzioni scelte, potrai attivare o disattivare in qualsiasi momento la scansione di ricerca tipica di questa modalità, cliccando il tasto destro del mouse sull'iconcina del programma che appare nella barra di notifica di Windows. Nel menu che compare puoi cliccare l'iconcina <b><i>Scansiona e traduci le parole puntate sì/no</b></i>, sia per attivarla che per disattivarla. - + Then just stop the cursor over the word you want to look up in another application, and a window would pop up which would describe it to you. Appoggia il puntatore del mouse sulla parola sconosciuta e comparirà una finestra con la traduzione (o spiegazione) richiesta. - + Then just select any word you want to look up in another application by your mouse (double-click it or swipe it with mouse with the button pressed), and a window would pop up which would describe the word to you. Seleziona una qualsiasi parola sconosciuta, (doppiocliccala o selezionala con il mouse premuto) e comparirà una finestra con la traduzione (o spiegazione) richiesta. - + (untitled) (senza titolo) - + (picture) (immagine) @@ -105,37 +105,37 @@ ArticleRequest - + Expand article Espandi traduzione - + From Da - + Collapse article Compatta traduzione - + Query error: %1 Errore d'interrogazione: %1 - + Close words: Chiudi parole: - + Compound expressions: Espressioni composte: - + Individual words: Parole individuali: @@ -143,47 +143,47 @@ ArticleView - + Select Current Article Seleziona traduzione corrente - + Copy as text Copia come testo - + Inspect Ispeziona - + Resource Risorsa - + Audio Audio - + TTS Voice Voce sintetizzata (TTS) - + Picture Immagine - + Definition from dictionary "%1": %2 Definizione dal dizionario "%1": %2 - + Definition: %1 Definizione: %1 @@ -192,99 +192,100 @@ GoldenDict - - + + The referenced resource doesn't exist. La risorsa di riferimento non esiste. - + The referenced audio program doesn't exist. Il programma audio di riferimento non esiste. - + + ERROR: %1 Errore: %1 - + Save sound Salva suono - + Sound files (*.wav *.ogg *.mp3 *.mp4 *.aac *.flac *.mid *.wv *.ape);;All files (*.*) File sonori (*.wav *.ogg *.mp3 *.mp4 *.aac *.flac *.mid *.wv *.ape);;Tutti i file (*.*) - + Save image Salva immagine - + Image files (*.bmp *.jpg *.png *.tif);;All files (*.*) File d'immagine (*.bmp *.jpg *.png *.tif);;Tutti i file (*.*) - + &Open Link &Apri collegamento - + Video Video - + Video: %1 Video: %1 - + Open Link in New &Tab Apri collegamento in una nuova &scheda - + Open Link in &External Browser Apri collegamento in un programma di &navigazione web esterno - + &Look up "%1" &Cerca «%1» - + Look up "%1" in &New Tab Cerca "%1" in una &nuova scheda - + Send "%1" to input line Invia "%1" alla linea di comando - - + + &Add "%1" to history &Aggiungi "%1" alla cronologia - + Look up "%1" in %2 Cerca "%1" in %2 - + Look up "%1" in %2 in &New Tab Cerca "%1" in %2 in una &nuova scheda - + WARNING: FFmpeg Audio Player: %1 ATTENZIONE: Lettore audio FFmpeg: %1 @@ -305,37 +306,37 @@ La libreria Bass non è in grado di riprodurre questo suono. - + Failed to run a player to play sound file: %1 L'esecuzione del file sonoro è fallita: %1 - + Failed to create temporary file. La creazione del file temporaneo è fallita. - + Failed to auto-open resource file, try opening manually: %1. L'apertura automatica del file di risorsa è fallita. Provare ad aprire il file manualmente: %1. - + The referenced resource failed to download. Lo scaricamento della risorsa di riferimento è fallita. - + Save &image... Salva &immagine... - + Save s&ound... Salva s&uono... - + WARNING: %1 ATTENZIONE: %1 @@ -345,42 +346,44 @@ Modulo - + about:blank scheda:vuota - + x x - + Find: Cerca: - + + &Previous &Precedente - + + &Next &Successivo - + Ctrl+G Ctrl+G - + &Case Sensitive &MAIUSCOLE/minuscole - + Highlight &all Evidenzia &ogni risultato @@ -406,6 +409,29 @@ + Dialog + + + Proxy authentication required + + + + + You need to supply a Username and a Password to access via proxy + + + + + Username: + + + + + Password: + Password: + + + DictGroupWidget @@ -506,6 +532,119 @@ + DictHeadwords + + + Search mode + + + + + This element determines how filter string will be interpreted + + + + + If checked on the symbols case will be take in account when filtering + + + + + Match case + + + + + Exports headwords to file + + + + + Export + + + + + Help + + + + + OK + + + + + Press this button to apply filter to headwords list + + + + + Apply + + + + + If checked any filter changes will we immediately applied to headwords list + + + + + Auto apply + + + + + Filter: + + + + + Filter string (fixed string, wildcards or regular expression) + + + + + Text + + + + + Wildcards + + + + + RegExp + + + + + Unique headwords total: %1, filtered: %2 + + + + + Save headwords to file + + + + + Text files (*.txt);;All files (*.*) + File di testo (*.txt);;Tutti i file (*.*) + + + + Export headwords... + + + + + Cancel + Annulla + + + DictInfo @@ -548,6 +687,16 @@ Descrizione: + + Show all unique dictionary headwords + + + + + Headwords + + + Edit the dictionary via command: %1 @@ -564,6 +713,74 @@ + DictServer + + + Url: + + + + + Databases: + + + + + Search strategies: + + + + + Server databases + + + + + DictServersModel + + + Enabled + Abilitato + + + + Name + Nome + + + + Address + Indirizzo + + + + Databases + + + + + Strategies + + + + + Icon + Icona + + + + Comma-delimited list of databases +(empty string or "*" matches all databases) + + + + + Comma-delimited list of search strategies +(empty string mean "prefix" strategy) + + + + DictionaryBar Dictionary Bar @@ -585,17 +802,22 @@ Modifica questo gruppo - + Dictionary info Info sul dizionario - + + Dictionary headwords + + + + Open dictionary folder Apri cartella dizionario - + Edit dictionary Modifica dizionario @@ -603,39 +825,39 @@ EditDictionaries - + &Sources &Risorse - - + + &Dictionaries &Dizionari - - + + &Groups &Gruppi - + Sources changed Risorse modificate - + Some sources were changed. Would you like to accept the changes? Alcune risorse sono state modificate. Accettare le modifiche? - + Accept Accetto - + Cancel Annulla @@ -654,6 +876,92 @@ + FTS::FtsIndexing + + + None + Nessuno + + + + FTS::FullTextSearchDialog + + + Full-text search + + + + + Whole words + + + + + Plain text + + + + + Wildcards + + + + + RegExp + + + + + Max distance between words (%1-%2): + + + + + Max articles per dictionary (%1-%2): + + + + + + + Articles found: + + + + + Now indexing: + + + + + CJK symbols in search string are not compatible with search modes "Whole words" and "Plain text" + + + + + The search line must contains at least one word containing + + + + + or more symbols + + + + + No dictionaries for full-text search + + + + + FTS::Indexing + + + None + Nessuno + + + Forvo::ForvoArticleRequest @@ -692,6 +1000,65 @@ + FullTextSearchDialog + + + + Search + + + + + Match case + + + + + Mode: + + + + + Articles found: + + + + + Available dictionaries in group: + + + + + Wait for indexing: + + + + + Total: + + + + + Indexed: + + + + + Now indexing: None + + + + + Cancel + Annulla + + + + Help + + + + GermanTranslit @@ -731,43 +1098,53 @@ Groups - + + Group tabs + + + + + Open groups list + + + + Add group Aggiungi gruppo - + Give a name for the new group: Assegna un nome al nuovo gruppo: - + Rename group Rinomina gruppo - + Give a new name for the group: Assegna un nuovo nome al gruppo: - + Remove group Rimuovi gruppo - + Are you sure you want to remove the group <b>%1</b>? Sei sicuro di volere rimuovere il gruppo <b>%1</b>? - + Remove all groups Rimuovi ogni gruppo - + Are you sure you want to remove all the groups? Sei sicuro di volere rimuovere ogni gruppo? @@ -868,6 +1245,54 @@ + Help::HelpWindow + + + GoldenDict help + + + + + Home + + + + + Back + Traduzione precedente + + + + Forward + Traduzione successiva + + + + Zoom In + Ingrandisci + + + + Zoom Out + Riduci + + + + Normal Size + Ripristina zoom + + + + Content + + + + + Index + + + + HistoryPaneWidget @@ -898,12 +1323,12 @@ Hunspell - + Spelling suggestions: Suggerimenti ortografici: - + %1 Morphology Morfologia %1 @@ -911,12 +1336,12 @@ HunspellDictsModel - + Enabled Abilitato - + Name Nome @@ -1956,7 +2381,7 @@ LoadDictionaries - + Error loading dictionaries Errore di caricamento dei dizionari @@ -1964,7 +2389,7 @@ Main - + Error in configuration file. Continue with default settings? Errore nel file di configurazione. Continuare con le impostazioni preimpostate? @@ -1976,78 +2401,84 @@ Barra degli strumenti - + Back Traduzione precedente - + Forward Traduzione successiva - + Scan Popup Scansiona e traduci le parole puntate sì/no - + Show &Main Window Mostra finestra &principale - - + + &Quit &Esci - + Loading... Caricamento... - + + String to search in dictionaries. The wildcards '*', '?' and sets of symbols '[...]' are allowed. +To find '*', '?', '[', ']' symbols use '\*', '\?', '\[', '\]' respectively + + + + Skip This Release Tralascia questa versione - + You have chosen to hide a menubar. Use %1 to show it back. Hai scelto di nascondere la barra dei menu. Utilizza %1 per mostrarla nuovamente. - + Ctrl+M Ctrl+M - + Page Setup Imposta pagina - + No printer is available. Please install one first. Non è disponibile alcuna stampante. Per proseguire installarne una. - + Print Article Stampa traduzione - + Article, Complete (*.html) Traduzione come pagina completa (*.html) - + Article, HTML Only (*.html) Traduzione come pagina solo HTML (*.html) - + Save Article As Salva traduzione come @@ -2056,54 +2487,54 @@ File HTML (*.html *.htm) - + Error Errore - + Can't save article: %1 Impossibile salvare la traduzione: %1 - + Saving article... Salvataggio traduzioni... - + The main window is set to be always on top. La finestra principale è impostata per essere mostrata sempre in primo piano. - + %1 dictionaries, %2 articles, %3 words %1 dizionari, %2 voci, %3 parole - + Failed to initialize hotkeys monitoring mechanism.<br>Make sure your XServer has RECORD extension turned on. L'inizializzazione del meccanismo di monitoraggio dei tasti scorciatoia è fallito.<br>Assicurarsi che nel proprio XServer c'è l'estensione RECORD attiva. - + New Release Available E' disponibile una nuova versione - + Version <b>%1</b> of GoldenDict is now available for download.<br>Click <b>Download</b> to get to the download page. E' disponibile la nuova versione <b>%1</b> di GoldenDict.<br> Clicca <b>Scarica</b> per accedere alla pagina di scaricamento. - + Download Scarica - - + + Look up in: Cerca in: @@ -2116,98 +2547,98 @@ Mostra icone piccole nelle barre - + &Menubar Barra dei &menu - + Found in Dictionaries: Trovato nei dizionari: - + Pronounce Word (Alt+S) Ascolta la pronuncia (Alt+S) - + Show Names in Dictionary &Bar Mostra i n&omi dei dizionari nella barra - + Show Small Icons in &Toolbars Mostra icone &piccole nelle barre - + &Navigation Barra degli &strumenti - + Zoom In Ingrandisci - + Zoom Out Riduci - + Normal Size Ripristina zoom - + Words Zoom In Ingrandisci parole da cercare - + Words Zoom Out Riduci parole da cercare - + Words Normal Size Ripristina zoom delle parole da cercare - + Close current tab Chiudi scheda corrente - + Close all tabs Chiudi ogni scheda - + Close all tabs except current Chiudi ogni scheda eccetto la corrente - + Look up: Cerca: - + All Tutto - - + + Accessibility API is not enabled L'accessibilità alle API non è abilitita - + Import history from file Importa cronologia da file @@ -2216,52 +2647,57 @@ Importata dal file: - + Import error: invalid data in file Errore d'importazione: i dati nel file sono invalidi - + History import complete Importazione della cronologia completata - + Import error: Errore d'importazione: - + Dictionary info Info sul dizionario - + + Dictionary headwords + + + + Open dictionary folder - + Edit dictionary Modifica dizionario - + Opened tabs Schede aperte - + Open Tabs List Apri l'elenco delle schede - + (untitled) (senza titolo) - + %1 - %2 %1 - %2 @@ -2270,7 +2706,7 @@ ATTENZIONE: %1 - + &Hide &Nascondi @@ -2279,23 +2715,23 @@ Modalità visualizza cronologia - + Export history to file Esporta cronologia come file - - + + Text files (*.txt);;All files (*.*) File di testo (*.txt);;Tutti i file (*.*) - + History export complete Esportazione cronologia completata - + Export error: Errore di esportazione: @@ -2305,37 +2741,42 @@ - + Welcome! Benvenuto! - + &File &File - + &Edit M&odifica - + &Help G&uida - + + Search + + + + &Search Pane Pannello di &ricerca - + &Results Navigation Pane Pannello dei risultati di &ricerca - + &History Pane Pannello della &cronologica @@ -2344,27 +2785,27 @@ &Dizionari... F3 - + &Preferences... &Impostazioni... - + F2 F2 - + &View &Visualizza - + &Zoom &Zoom - + H&istory &Cronologia @@ -2373,133 +2814,158 @@ Pannello dei risultati di ricerca - + &Dictionaries... &Dizionari... - + F3 F3 - + F4 F4 - + &Homepage &Visita il sito web - + &About &Info - + About GoldenDict Info... - + + GoldenDict reference + + + + F1 F1 - + Quit from application Esce dal programma - + Ctrl+Q Ctrl+Q - + &Forum &Forum - + &Close To Tray &Iconizza nella barra di notifica - + Minimizes the window to tray Iconizza il programma nella barra di notifica - + Ctrl+F4 Ctrl+F4 - + &Save Article &Salva traduzione - + Save Article Salva la traduzione corrente - + &Print &Stampa - + Ctrl+P Ctrl+P - + Page Set&up Imposta &pagina - + Print Pre&view &Anteprima di stampa - + &Rescan Files &Rianalizza file - + &New Tab &Nuova scheda - + &Always on Top Mostra sempre in primo piano - + Always on Top Mostra sempre in primo piano - + Ctrl+O Ctrl+O - - - + + + Menu Button Pulsante menu + + Search in page + + + + + Ctrl+F + + + + + Full-text search + + + + + Ctrl+Shift+F + + + Print Preview Anteprima di stampa @@ -2508,48 +2974,48 @@ Rianalizza file - + Ctrl+F5 Ctrl+F5 - + &Clear &Elimina - + New Tab Nuova scheda - + Ctrl+T Ctrl+T - + &Configuration Folder &Cartella di configurazione - - + + &Show &Mostra - + Ctrl+H Ctrl+H - + &Export &Esporta - + &Import &Importa @@ -2561,12 +3027,12 @@ Mdx::MdxArticleRequest - + Dictionary file was tampered or corrupted Il file del dizionario risulta alterato o corrotto - + Failed loading article from %1, reason: %2 Impossibile caricare la traduzione da %1, per il motivo seguente: %2 @@ -2574,7 +3040,7 @@ MediaWiki::MediaWikiArticleRequest - + XML parse error: %1 at %2,%3 Errore di analisi XML: %1 al %2,%3 @@ -2582,7 +3048,7 @@ MediaWiki::MediaWikiWordSearchRequest - + XML parse error: %1 at %2,%3 Errore di analisi XML: %1 al %2,%3 @@ -2590,22 +3056,22 @@ MediaWikisModel - + Enabled Abilitato - + Name Nome - + Address Indirizzo - + Icon Icona @@ -2618,88 +3084,94 @@ Modulo - + Dictionary order: Ordine dei dizionari: - - - - ... - ... + ... - + Inactive (disabled) dictionaries: Dizionari inattivi (disabilitati): - + Dictionary information Informazioni sul dizionario - + Name: Nome: - + Total articles: Totale voci: - + Total words: Parole totali: - + Translates from: Traduzione da: - + Translates to: Traduzione in: - + Description: Descrizione: - + Files comprising this dictionary: File relativi a questo dizionario: - + Adjust the order by dragging and dropping items in it. Drop dictionaries to the inactive group to disable their use. Modifica l'ordine trascinando col mouse i nomi dei vari dizionari. Sposta quelli non utilizzati nel gruppo dei dizionari inattivi, per bloccarne la consultazione. - + Sort by name Ordina per nome - + Sort by languages Ordina per lingua + + + Dictionary headwords + + + + + Dictionaries active: %1, inactive: %2 + + PathsModel - + Path Percorso - + Recursive Ricorsivo @@ -2809,14 +3281,14 @@ il doppio clic del mouse, traduce la parola cliccata - + Chooses whether the scan popup mode is on by default or not. If checked, the program would always start with the scan popup active. Spuntando questa casella, si attiva sin dall'inizio l'attività di scansione e traduzione delle parole puntate. Al contrario se si deseleziona questa casella, scansione e traduzione vengono disabilitate. - + Normally, in order to activate a popup you have to maintain the chosen keys pressed while you select a word. With this enabled, the chosen keys may also @@ -2830,27 +3302,27 @@ Questa funzione consente di premere tali tasti anche qualche secondo più tardi. - + Hotkeys Tasti scorciatoia - + Use the following hotkey to show or hide the main window: utilizza la seguente combinazione di tasti per visualizzare o nascondere la finestra principale: - + Use the following hotkey to translate a word from clipboard: utilizza la seguente combinazione di tasti per tradurre una parola memorizzata negli Appunti di Windows: - + The hotkeys are global and work from any program and within any context as long as GoldenDict is running in background. Queste combinazioni di tasti sono globali e questo significa che funzionano in qualsiasi programma e contesto a condizione che il programma sia attivo in sottofondo. - + &Scan Popup &Puntamento @@ -2901,17 +3373,22 @@ Stile dei moduli aggiuntivi (add-on): - + + Help language + + + + Adjust this value to avoid huge context menus. Modificare questo valore in modo da evitare menu contestuali troppo estesi. - + Context menu dictionaries limit: Limite sul numero di dizionari per il menu contestuale: - + When enabled, a translation popup window would be shown each time you point your mouse on any word on the screen (Windows) or select any word with mouse (Linux). When enabled, you can switch it on and @@ -2923,134 +3400,134 @@ si premono i tasti prescelti. - + Enable scan popup functionality Abilita l'attività di scansione e traduzione delle parole puntate - + Start with scan popup turned on abilita l'attività di scansione e traduzione delle parole puntate fin dall'avvio del programma - + With this enabled, the popup would only show up if all chosen keys are in the pressed state when the word selection changes. Spuntando questa casella, si attiva l'attività di scansione e traduzione delle parole puntate quando i tasti scelti vengono effettivamente premuti. - + Only show popup when all selected keys are kept pressed: abilita l'attività di scansione e traduzione delle parole puntate solo se tutti i tasti selezionati sono premuti: - + Left Ctrl only Solo tasto Ctrl sinistro - + Left Ctrl Ctrl sinistro - + Right Shift only Solo tasto MAIUSCOLE destro - + Right Shift MAIUSCOLE destro - + Alt key Tasto Alt - + Alt Alt - + Ctrl key Tasto Ctrl - + Ctrl Ctrl - + Left Alt only Solo tasto Alt sinistro - + Left Alt Alt sinistro - + Shift key Tasto MAIUSCOLE - + Shift MAIUSCOLE - + Right Alt only Solo tasto Alt destro - + Right Alt Alt destro - + Right Ctrl only Solo tasto Ctrl destro - + Right Ctrl Ctrl destro - + Left Shift only Solo tasto MAIUSCOLE sinistro - + Left Shift MAIUSCOLE sinistro - + Windows key or Meta key Tasto di Windows o Meta - + Win/Meta Windows o Meta - + Keys may also be pressed afterwards, within i tasti possono essere premuti nell'arco di tempo di - + To avoid false positives, the keys are only monitored after the selection's done for a limited amount of seconds, which is specified here. @@ -3059,47 +3536,82 @@ entro il limite di secondi qui specificato. - + secs secondi - + Send translated word to main window instead of to show it in popup window Mostra le traduzioni nella finestra principale del programma invece che nella classica finestra a comparsa - + Send translated word to main window mostra le traduzioni nella finestra principale del programma - + Play audio files via FFmpeg(libav) and libao Riproduce l'audio utilizzando le librerie FFmpeg(libav) e libao - + Use internal player Utilizza lettore interno - + + System proxy + + + + + Custom proxy + + + + + Custom settings + + + + + Full-text search + + + + + Allow full-text search for: + + + + + Don't search in dictionaries containing more than + + + + + articles (0 - unlimited) + + + + Select this option to automatic collapse big articles Spuntando questa casella vengono automaticamente compattate le traduzioni troppo estese - + Collapse articles more than compatta le traduzioni più estese di - + Articles longer than this size will be collapsed Le traduzioni più estese di queste dimensioni verranno compattate - + symbols caratteri @@ -3114,17 +3626,17 @@ Riproduci utilizzando le librerie Bass - + Ad&vanced &Avanzate - + ScanPopup extra technologies Tecnologie di scansione delle parole puntate da tradurre - + Try to use IAccessibleEx technology to retrieve word under cursor. This technology works only with some programs that support it (for example Internet Explorer 9). @@ -3135,12 +3647,12 @@ Non è necessario attivare questa opzione se non si usano tali programmi. - + Use &IAccessibleEx utilizza &IAccessibleEx - + Try to use UI Automation technology to retrieve word under cursor. This technology works only with some programs that support it. It is not needed to select this option if you don't use such programs. @@ -3149,12 +3661,12 @@ Non è necessario attivare questa opzione se non si usano tali programmi. - + Use &UIAutomation utilizza &UIAutomation - + Try to use special GoldenDict message to retrieve word under cursor. This technology works only with some programs that support it. It is not needed to select this option if you don't use such programs. @@ -3163,67 +3675,67 @@ Non è necessario attivare questa opzione se non si usano tali programmi. - + Use &GoldenDict message utilizza messaggistica di &GoldenDict - + History Cronologia - + Turn this option on to store history of the translated words Spuntando questa casella, viene memorizzata la cronologia delle parole tradotte - + Store &history memorizza la &cronologia - + Specify the maximum number of entries to keep in history. Specificare il numero massimo di inserimenti da mantenere nella cronologia. - + Maximum history size: Dimensione massima della cronologia: - + History saving interval. If set to 0 history will be saved only during exit. Intervallo di salvattaggio della cronologia. Impostando il valore 0 la cronologia verrà salvata soltanto alla chiusura del programma. - + Save every Salva ogni - + minutes minuti - + Articles Traduzioni - + Turn this option on to always expand optional parts of articles Spuntando questa casella, vengono espansi i contesti opzionali delle voci tradotte - + Expand optional &parts espandi i &contesti opzionali delle voci tradotte - + <!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; } @@ -3236,27 +3748,27 @@ <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" color:#ff0000;">Nota: Sembra che tu stia eseguendo una versione di X.Org XServer che ha l'estensione di registrazione RECORD danneggiata. I tasti scorciatoia di GoldenDict probabilmente non funzioneranno. Questo problema va' risolto nel server stesso. Consulta la documentazione seguente </span><a href="https://bugs.freedesktop.org/show_bug.cgi?id=20500"><span style=" text-decoration: underline; color:#0000ff;">sugli errori </span></a><span style=" color:#ff0000;"> e se lo ritieni opportuno lascia un messaggio.</span></p></body></html> - + &Audio &Pronuncia - + Pronunciation Pronuncia - + Auto-pronounce words in main window pronuncia automaticamente le parole dalla finestra principale - + Auto-pronounce words in scan popup pronuncia automaticamente le parole puntate - + Playback Riproduzione @@ -3281,59 +3793,59 @@ Riproduci con Phonon - + Use any external program to play audio files Usa un qualsiasi programma esterno per riprodurre i file audio - + Use external program: Usa un programma esterno: - + &Network &Rete - + Enable if you wish to use a proxy server for all program's network requests. Abilitare questa casella per utilizzare un server proxy per ogni programma della rete che lo richieda. - + Use proxy server Utilizza server proxy - + Type: Tipo: - + Host: Host: - + Port: Porta: - + User: Utente: - + Password: Password: - + Enabling this would make GoldenDict block most advertisements by disallowing content (images, frames) not originating from the site you are browsing. If some site breaks because of this, try disabling this. @@ -3342,12 +3854,12 @@ Se alcuni siti dovessero bloccarsi, provare a disabilitare questa casella. - + Disallow loading content from other sites (hides most advertisements) non permettere il caricamento dei contenuti da altri siti (nasconde la maggioranza dei messaggi pubblicitari) - + Enabling this would allow to listen to sound pronunciations from online dictionaries that rely on Flash or other web plugins. Plugin must be installed for this option to work. @@ -3356,24 +3868,24 @@ Affinché questa opzione possa funzionare, è necessario che i plugin richiesti siano installati. - + Enable web plugins abilita i plugin web - + Some sites detect GoldenDict via HTTP headers and block the requests. Enable this option to workaround the problem. Alcuni siti web rilevano GoldenDict via intestazione HTTP e ne bloccano le richieste. Spuntare questa casella per raggirare il problema. - + Do not identify GoldenDict in HTTP headers non consentire che GoldenDict venga identificato nelle intestazioni HTTP - + When this is enabled, the program periodically checks if a new, updated version of GoldenDict is available for download. If it is so, the program @@ -3384,42 +3896,43 @@ e si collega al sito del programma. - + Check for new program releases periodically controlla periodicamente la presenza di aggiornamenti e novità - + System default Preimpostata nel sistema - + + Default Preimpostato - + Modern Moderna - + Lingvo Lingvo - + Babylon Babylon - + Lingoes Lingoes - + Lingoes-Blue Lingoes-Blue @@ -3428,12 +3941,12 @@ Riproduci utilizzando le DirectShow - + Changing Language Modifica della lingua - + Restart the program to apply the language change. La modifica della lingua avrà effetto al riavvio del programma. @@ -3441,27 +3954,27 @@ ProgramTypeEditor - + Audio Audio - + Plain Text Testo semplice - + Html HTML - + Prefix Match Compita prefisso - + Unknown Sconosciuto @@ -3487,27 +4000,27 @@ ProgramsModel - + Enabled Abilitato - + Type Tipo - + Name Nome - + Command Line Linea di comando - + Icon Icona @@ -3515,12 +4028,14 @@ QObject - + + Article loading error Errore di caricamento della traduzione - + + Article decoding error Errore di decodifica del file di traduzione @@ -3631,18 +4146,18 @@ ResourceToSaveHandler - - + + ERROR: %1 Errore: %1 - + Resource saving error: Errore di salvataggio risorsa: - + The referenced resource failed to download. Lo scaricamento della risorsa di riferimento è fallita. @@ -3650,12 +4165,12 @@ Romaji - + Hepburn Romaji for Hiragana Romanizzazione hepburn per Hiragana - + Hepburn Romaji for Katakana Romanizzazione hepburn per Katakana @@ -3680,12 +4195,12 @@ parola - + Back Traduzione precedente - + Forward Traduzione successiva @@ -3698,43 +4213,43 @@ Alt+M - + Pronounce Word (Alt+S) Ascolta la pronuncia (Alt+S) - + Alt+S Alt+S - + Send word to main window (Alt+W) Mostra la traduzione nella finestra principale del programma (Alt+W) - + Alt+W Alt+W - + Shows or hides the dictionary bar Mostra o nasconde la barra dei dizionari - + Use this to pin down the window so it would stay on screen, could be resized or managed in other ways. Fissa sullo schermo la finestra dei risultati tradotti, in modo che possa essere ridimensionata o gestita liberamente. - - - - - + + + + + ... ... @@ -3743,8 +4258,8 @@ GoldenDict - - + + %1 - %2 %1 - %2 @@ -3752,17 +4267,17 @@ SoundDirsModel - + Path Percorso - + Name Nome - + Icon Icona @@ -3770,45 +4285,47 @@ Sources - + Text to Speech Testo a sintesi vocale (Text to Speech) - + (not available in portable version) (funzione non disponibile nella versione portatile) - - - + + + Choose a directory Scegli una cartella - - - - - + + + + + + Confirm removal Conferma eliminazione - - + + Remove directory <b>%1</b> from the list? Rimuovere la cartella <b>%1</b> dall'elenco? - - + + + Remove site <b>%1</b> from the list? Rimuovere il sito <b>%1</b> dall'elenco? - + Remove program <b>%1</b> from the list? Rimuovere il programma <b>%1</b> dall'elenco? @@ -3827,7 +4344,8 @@ - + + &Add... &Aggiungi... @@ -3836,7 +4354,8 @@ - + + &Remove &Elimina @@ -3905,7 +4424,7 @@ In alternativa usare %GD1251% al posto di CP1251 e/o %GDISO1% invece di ISO 8859-1. - + Programs Programmi @@ -3914,27 +4433,27 @@ Qualsiasi programma esterno. La stringa %GDWORD% verrà sostituita con la parola ricercata. La parola verrà inoltre riportata nella casella d'immissione come se fosse stata digitata. - + Forvo Forvo - + Live pronunciations from <a href="http://www.forvo.com/">forvo.com</a>. The site allows people to record and share word pronunciations. You can listen to them from GoldenDict. Pronuncia direttamente da <a href="http://www.forvo.com/">forvo.com</a>. Questo sito permette alle persone di registrare e condividere la pronuncia delle parole ed è possibile ascoltarle direttamente da GoldenDict. - + Enable pronunciations from Forvo Abilita la pronuncia da Forvo - + API Key: Chiave API: - + Use of Forvo currently requires an API key. Leave this field blank to use the default key, which may become unavailable in the future, or register on the site to get your own key. @@ -3943,7 +4462,7 @@ In alternativa è possibile registrarsi al sito ed ottenere una chiave personale. - + Get your own key <a href="http://api.forvo.com/key/">here</a>, or leave blank to use the default one. Ottieni <a href="http://api.forvo.com/key/">qui</a> la tua chiave personale oppure lascia il campo vuoto per utilizzare quella preimpostata. @@ -3973,79 +4492,89 @@ %GDBIG5% per Big-5, %GDBIG5HKSCS% per Big5-HKSCS, %GDGBK% per GBK e GB18030, %GDSHIFTJIS% per Shift-JIS. + + DICT servers + + + + DICT servers: + + + + Any external programs. A string %GDWORD% will be replaced with the query word. If such string is not presented, the word will be fed into standard input. Per qualsiasi programma esterno. La stringa %GDWORD% va' posta in fondo alla linea di comando ed essa verrà sostituita dalla parola che si desidera tradurre. Se però nella riga di comando non fosse presente alcuna stringa, la parola da tradurre verrebbe passata all'applicazione esterna come un inserimento standard. - + Language codes (comma-separated): Codici della lingua (separarli con una virgola e uno spazio): - + List of language codes you would like to have. Example: "en, ru". Elenco dei codici delle lingue desiderate. Ad esempio: "en, ru, it". - + Full list of language codes is available <a href="http://www.forvo.com/languages-codes/">here</a>. L'elenco completo dei codici delle lingue è disponibile <a href="http://www.forvo.com/languages-codes/">qui</a>. - + Transliteration Traslitterazione - + Russian transliteration russo traslitterato - + Greek transliteration greco traslitterato - + German transliteration tedesco traslitterato - + Belarusian transliteration traslitterazione bielorusso - + Enables to use the Latin alphabet to write the Japanese language Attiva la romanizzazione del giapponese - + Japanese Romaji giapponese romanizzato (convertito in caratteri latini) - + Systems: Sistemi: - + The most widely used method of transcription of Japanese, based on English phonology Diffuso sistema di romanizzazione del giapponese, basato sui fonemi inglesi - + Hepburn romanizzazione hepburn - + The most regular system, having a one-to-one relation to the kana writing systems. Standardized as ISO 3602 @@ -4056,12 +4585,12 @@ Non ancora implementato. - + Nihon-shiki Nihon-shiki - + Based on Nihon-shiki system, but modified for modern standard Japanese. Standardized as ISO 3602 @@ -4072,32 +4601,32 @@ Non ancora implementato. - + Kunrei-shiki Kunrei-shiki - + Syllabaries: Sillabari: - + Hiragana Japanese syllabary Sillabario giapponese Hiragana - + Hiragana Hiragana - + Katakana Japanese syllabary Sillabario giapponese Katakana - + Katakana Katakana @@ -4242,22 +4771,22 @@ WebSitesModel - + Enabled Abilitato - + Name Nome - + Address Indirizzo - + Icon Icona @@ -4265,7 +4794,7 @@ WordFinder - + Failed to query some dictionaries. Impossibile consultare alcuni dizionari. diff -Nru goldendict-1.5.0~git20131003/locale/ja_JP.ts goldendict-1.5.0~git20150923/locale/ja_JP.ts --- goldendict-1.5.0~git20131003/locale/ja_JP.ts 2013-10-02 20:42:04.000000000 +0000 +++ goldendict-1.5.0~git20150923/locale/ja_JP.ts 2015-09-23 08:26:24.000000000 +0000 @@ -34,7 +34,7 @@ [不明] - + Based on Qt %1 (%2, %3 bit) @@ -42,62 +42,62 @@ ArticleMaker - + Expand article - + Collapse article - + No translation for <b>%1</b> was found in group <b>%2</b>. グループ <b>%2</b> に <b>%1</b> の翻訳が見つかりません。 - + No translation was found in group <b>%1</b>. グループ <b>%1</b> に翻訳が見つかりません。 - + Welcome! ようこそ! - + <h3 align="center">Welcome to <b>GoldenDict</b>!</h3><p>To start working with the program, first visit <b>Edit|Dictionaries</b> to add some directory paths where to search for the dictionary files, set up various Wikipedia sites or other sources, adjust dictionary order or create dictionary groups.<p>And then you're ready to look up your words! You can do that in this window by using a pane to the left, or you can <a href="Working with popup">look up words from other active applications</a>. <p>To customize program, check out the available preferences at <b>Edit|Preferences</b>. All settings there have tooltips, be sure to read them if you are in doubt about anything.<p>Should you need further help, have any questions, suggestions or just wonder what the others think, you are welcome at the program's <a href="http://goldendict.org/forum/">forum</a>.<p>Check program's <a href="http://goldendict.org/">website</a> for the updates. <p>(c) 2008-2013 Konstantin Isakov. Licensed under GPLv3 or later. <h3 align="center"><b>GoldenDict</b> へようこそ!</h3><p>このプログラムでの作業を開始するには、まず <b>[編集|辞書]</b> を開いて辞書ファイルを検索するディレクトリのパスを追加したり、さまざまな Wikipedia のサイトやその他のソースを設定したり、辞書の順序を調整したり辞書グループを作成したりします。<p>次にはもう単語を検索する準備ができています! このウィンドウの左のペインを使用するか、<a href="Working with popup">他のアクティブなアプリケーションから単語を検索します</a>。<p>プログラムをカスタマイズするには、<b>[編集|環境設定]</b> で利用可能なオプションをチェックしてください。そこにある設定にはすべてツールチップがあります、何か疑問に思った場合はそれらを読むようにしてください。<p>さらなるヘルプを必要とする場合、質問、提案やその他気になることがある場合は、プログラムの<a href="http://goldendict.org/forum/">フォーラム</a>で歓迎されます。<p>更新はプログラムの<a href="http://goldendict.org/">Web サイト</a>をチェックしてください。<p>(c) 2008-2013 Konstantin Isakov. GPLv3 以降の下でライセンスされています。 - + Working with popup ポップアップ作業 - + <h3 align="center">Working with the popup</h3>To look up words from other active applications, you would need to first activate the <i>"Scan popup functionality"</i> in <b>Preferences</b>, and then enable it at any time either by triggering the 'Popup' icon above, or by clicking the tray icon down below with your right mouse button and choosing so in the menu you've popped. <h3 align="center">ポップアップ作業</h3>他のアクティブなアプリケーションから単語を検索するには、まず <b>[環境設定]</b> で <i>"スキャン ポップアップ機能"</i> を有効にする必要があり、次からは上の 'ポップアップ アイコンを切り替えるか、または右マウス ボタンで下のトレイ アイコンをクリックしてポップしているメニューで選択することによっていつでも有効にできます。 - + Then just stop the cursor over the word you want to look up in another application, and a window would pop up which would describe it to you. 次に他のアプリケーションで検索したい単語の上でカーソルを止めると、説明のウィンドウがポップアップします。 - + Then just select any word you want to look up in another application by your mouse (double-click it or swipe it with mouse with the button pressed), and a window would pop up which would describe the word to you. 次に他のアプリケーションで検索したい単語をマウスで選択 (ダブルクリックまたは長押し) すると、単語を説明するウィンドウがポップアップします。 - + (untitled) (無題) - + (picture) @@ -105,37 +105,37 @@ ArticleRequest - + Expand article - + From From - + Collapse article - + Query error: %1 クエリ エラー: %1 - + Close words: 類似語: - + Compound expressions: 複合表現: - + Individual words: 単語ごと: @@ -143,47 +143,47 @@ ArticleView - + Select Current Article - + Copy as text - + Inspect - + Resource - + Audio - + TTS Voice - + Picture - + Definition from dictionary "%1": %2 - + Definition: %1 @@ -192,99 +192,100 @@ GoldenDict - - + + The referenced resource doesn't exist. 参照されたりソースが存在しません。 - + The referenced audio program doesn't exist. - + + ERROR: %1 - + Save sound - + Sound files (*.wav *.ogg *.mp3 *.mp4 *.aac *.flac *.mid *.wv *.ape);;All files (*.*) - + Save image - + Image files (*.bmp *.jpg *.png *.tif);;All files (*.*) - + &Open Link リンクを開く(&O) - + Video - + Video: %1 - + Open Link in New &Tab 新しいタブでリンクを開く(&T) - + Open Link in &External Browser 外部ブラウザーでリンクを開く(&E) - + &Look up "%1" "%1" を検索(&L) - + Look up "%1" in &New Tab 新しいタブで "%1" を検索(&N) - + Send "%1" to input line - - + + &Add "%1" to history - + Look up "%1" in %2 %2 から "%1" を検索 - + Look up "%1" in %2 in &New Tab 新しいタブで %2 から "%1" を検索(&N) - + WARNING: FFmpeg Audio Player: %1 @@ -297,37 +298,37 @@ WAV 以外のファイルの再生を有効にするには、[オーディオ] タブの "DirectShow を通じて再生する" を選択します。 - + Failed to run a player to play sound file: %1 サウンド ファイルを再生するプレーヤーの実行に失敗しました: %1 - + Failed to create temporary file. 一時ファイルの作成に失敗しました。 - + Failed to auto-open resource file, try opening manually: %1. リソース ファイルの自動オープンに失敗しました、手動で開いています: %1。 - + The referenced resource failed to download. 参照されたリソースのダウンロードに失敗しました。 - + Save &image... - + Save s&ound... - + WARNING: %1 警告: %1 @@ -337,42 +338,44 @@ フォーム - + about:blank about:blank - + x x - + Find: 検索: - + + &Previous 前へ(&P0 - + + &Next 次へ(&P) - + Ctrl+G Ctrl+G - + &Case Sensitive 大文字と小文字を区別する(&C) - + Highlight &all @@ -397,6 +400,29 @@ + Dialog + + + Proxy authentication required + + + + + You need to supply a Username and a Password to access via proxy + + + + + Username: + + + + + Password: + パスワード: + + + DictGroupWidget @@ -497,6 +523,119 @@ + DictHeadwords + + + Search mode + + + + + This element determines how filter string will be interpreted + + + + + If checked on the symbols case will be take in account when filtering + + + + + Match case + + + + + Exports headwords to file + + + + + Export + + + + + Help + + + + + OK + + + + + Press this button to apply filter to headwords list + + + + + Apply + + + + + If checked any filter changes will we immediately applied to headwords list + + + + + Auto apply + + + + + Filter: + + + + + Filter string (fixed string, wildcards or regular expression) + + + + + Text + + + + + Wildcards + + + + + RegExp + + + + + Unique headwords total: %1, filtered: %2 + + + + + Save headwords to file + + + + + Text files (*.txt);;All files (*.*) + + + + + Export headwords... + + + + + Cancel + キャンセル + + + DictInfo @@ -539,6 +678,16 @@ + + Show all unique dictionary headwords + + + + + Headwords + + + Edit the dictionary via command: %1 @@ -554,6 +703,74 @@ + DictServer + + + Url: + + + + + Databases: + + + + + Search strategies: + + + + + Server databases + + + + + DictServersModel + + + Enabled + 有効 + + + + Name + 名前 + + + + Address + アドレス + + + + Databases + + + + + Strategies + + + + + Icon + + + + + Comma-delimited list of databases +(empty string or "*" matches all databases) + + + + + Comma-delimited list of search strategies +(empty string mean "prefix" strategy) + + + + DictionaryBar Dictionary Bar @@ -575,17 +792,22 @@ このグループを編集 - + Dictionary info - + + Dictionary headwords + + + + Open dictionary folder - + Edit dictionary @@ -593,39 +815,39 @@ EditDictionaries - + &Sources ソース(&S) - - + + &Dictionaries 辞書(&D) - - + + &Groups グループ(&G) - + Sources changed ソースが変更されました - + Some sources were changed. Would you like to accept the changes? いくつかのソースが変更されました。変更を承認しますか? - + Accept 承認 - + Cancel キャンセル @@ -644,6 +866,92 @@ + FTS::FtsIndexing + + + None + なし + + + + FTS::FullTextSearchDialog + + + Full-text search + + + + + Whole words + + + + + Plain text + + + + + Wildcards + + + + + RegExp + + + + + Max distance between words (%1-%2): + + + + + Max articles per dictionary (%1-%2): + + + + + + + Articles found: + + + + + Now indexing: + + + + + CJK symbols in search string are not compatible with search modes "Whole words" and "Plain text" + + + + + The search line must contains at least one word containing + + + + + or more symbols + + + + + No dictionaries for full-text search + + + + + FTS::Indexing + + + None + なし + + + Forvo::ForvoArticleRequest @@ -682,6 +990,65 @@ + FullTextSearchDialog + + + + Search + + + + + Match case + + + + + Mode: + + + + + Articles found: + + + + + Available dictionaries in group: + + + + + Wait for indexing: + + + + + Total: + + + + + Indexed: + + + + + Now indexing: None + + + + + Cancel + キャンセル + + + + Help + + + + GermanTranslit @@ -721,43 +1088,53 @@ Groups - + + Group tabs + + + + + Open groups list + + + + Add group グループの追加 - + Give a name for the new group: 新しいグループの名前: - + Rename group グループ名の変更 - + Give a new name for the group: グループの新しい名前: - + Remove group グループの削除 - + Are you sure you want to remove the group <b>%1</b>? グループ <b>%1</b> を削除してもよろしいですか? - + Remove all groups すべてのグループを削除 - + Are you sure you want to remove all the groups? すべてのグループを削除してもよろしいですか? @@ -858,6 +1235,54 @@ + Help::HelpWindow + + + GoldenDict help + + + + + Home + + + + + Back + 戻る + + + + Forward + 進む + + + + Zoom In + 拡大 + + + + Zoom Out + 縮小 + + + + Normal Size + 通常のサイズ + + + + Content + + + + + Index + + + + HistoryPaneWidget @@ -888,12 +1313,12 @@ Hunspell - + Spelling suggestions: もしかして: - + %1 Morphology %1 形態 @@ -901,12 +1326,12 @@ HunspellDictsModel - + Enabled 有効 - + Name 名前 @@ -1946,7 +2371,7 @@ LoadDictionaries - + Error loading dictionaries 辞書の読み込みエラー @@ -1954,7 +2379,7 @@ Main - + Error in configuration file. Continue with default settings? @@ -1966,78 +2391,78 @@ 操作 - + Back 戻る - + Forward 進む - + Scan Popup スキャン ポップアップ - + Show &Main Window メイン ウィンドウの表示(&M) - - + + &Quit 終了(&Q) - + Loading... 読み込んでいます... - + Skip This Release このリリースをスキップ - + You have chosen to hide a menubar. Use %1 to show it back. - + Ctrl+M - + Page Setup ページ設定 - + No printer is available. Please install one first. 利用可能なプリンターがありません。まずインストールしてください。 - + Print Article 記事の印刷 - + Article, Complete (*.html) - + Article, HTML Only (*.html) - + Save Article As 名前を付けて記事を保存 @@ -2046,43 +2471,43 @@ HTML ファイル (*.html *.htm) - + Error エラー - + Can't save article: %1 記事を保存できません: %1 - + %1 dictionaries, %2 articles, %3 words %1 個の辞書、%2 個の記事、 %3 個の単語 - + Failed to initialize hotkeys monitoring mechanism.<br>Make sure your XServer has RECORD extension turned on. ホットキー監視機構の初期化に失敗しました。<br>XServer の RECORD 拡張がオンになっていることを確認してください。 - + New Release Available 新しいリリースが利用可能です - + Version <b>%1</b> of GoldenDict is now available for download.<br>Click <b>Download</b> to get to the download page. GoldenDict のバージョン <b>%1</b> のダウンロードが利用可能です。<br>ダウンロード ページへ移動するには<b>ダウンロード</b>をクリックします。 - + Download ダウンロード - - + + Look up in: 検索する場所: @@ -2091,158 +2516,169 @@ 辞書バーに名前を表示する - + &Menubar - + Found in Dictionaries: - + Pronounce Word (Alt+S) 単語の発音 (Alt+S) - + Show Names in Dictionary &Bar - + Show Small Icons in &Toolbars - + &Navigation - + Zoom In 拡大 - + Zoom Out 縮小 - + Normal Size 通常のサイズ - + Words Zoom In 単語の拡大 - + Words Zoom Out 単語の縮小 - + Words Normal Size 通常の単語のサイズ - + Close current tab 現在のタブを閉じる - + Close all tabs すべてのタブを閉じる - + Close all tabs except current 現在以外のすべてのタブを閉じる - + Look up: 検索: - + All すべて - - + + Accessibility API is not enabled - + + String to search in dictionaries. The wildcards '*', '?' and sets of symbols '[...]' are allowed. +To find '*', '?', '[', ']' symbols use '\*', '\?', '\[', '\]' respectively + + + + Saving article... - + The main window is set to be always on top. - + Import history from file - + Import error: invalid data in file - + History import complete - + Import error: - + Dictionary info - + + Dictionary headwords + + + + Open dictionary folder - + Edit dictionary - + Opened tabs 開いているタブ - + Open Tabs List - + (untitled) (無題) - + %1 - %2 @@ -2251,28 +2687,28 @@ 警告: %1 - + &Hide - + Export history to file - - + + Text files (*.txt);;All files (*.*) - + History export complete - + Export error: @@ -2282,32 +2718,32 @@ - + Welcome! ようこそ! - + &File ファイル(&F) - + &Edit 編集(&E) - + &Help ヘルプ(&H) - + &Preferences... 環境設定(&P)... - + F2 F2 @@ -2316,163 +2752,193 @@ グループ(&G)... - + &View 表示(&V) - + &Zoom ズーム&Z) - + H&istory 履歴(&I) - + &Dictionaries... 辞書(&D)... - + F3 F3 - + &Search Pane - + + Search + + + + &Results Navigation Pane - + &History Pane - + F4 F4 - + &Homepage ホーム ページ(&H) - + &About バージョン情報(&A) - + About GoldenDict GoldenDict のバージョン情報 - + + GoldenDict reference + + + + F1 F1 - + Quit from application アプリケーションを終了します - + Ctrl+Q Ctrl+Q - + &Forum フォーラム(&F) - + &Close To Tray トレイへ閉じる(&C) - + Minimizes the window to tray トレイへウィンドウを最小化します - + Ctrl+F4 Ctrl+F4 - + &Save Article 記事の保存(&S) - + Save Article 記事の保存 - + &Print 印刷(&P) - + Ctrl+P Ctrl+P - + Page Set&up ページ設定(&U) - + Print Pre&view - + &Rescan Files - + &New Tab - + &Always on Top - + Always on Top - + Ctrl+O - - - + + + Menu Button + + Search in page + + + + + Ctrl+F + + + + + Full-text search + + + + + Ctrl+Shift+F + + + Print Preview 印刷プレビュー @@ -2481,48 +2947,48 @@ ファイルの再スキャン - + Ctrl+F5 Ctrl+F5 - + &Clear クリア(&C) - + New Tab - + Ctrl+T - + &Configuration Folder - - + + &Show - + Ctrl+H - + &Export - + &Import @@ -2534,12 +3000,12 @@ Mdx::MdxArticleRequest - + Dictionary file was tampered or corrupted - + Failed loading article from %1, reason: %2 @@ -2547,7 +3013,7 @@ MediaWiki::MediaWikiArticleRequest - + XML parse error: %1 at %2,%3 XML 分析エラー: %1 at %2,%3 @@ -2555,7 +3021,7 @@ MediaWiki::MediaWikiWordSearchRequest - + XML parse error: %1 at %2,%3 XML 分析エラー: %1 at %2,%3 @@ -2563,22 +3029,22 @@ MediaWikisModel - + Enabled 有効 - + Name 名前 - + Address アドレス - + Icon @@ -2591,88 +3057,94 @@ フォーム - + Dictionary order: 辞書の順序: - - - - ... - ... + ... - + Inactive (disabled) dictionaries: 非アクティブ (無効) な辞書: - + Dictionary information 辞書の情報 - + Name: 名前: - + Total articles: 辞書の合計: - + Total words: 単語の合計: - + Translates from: 翻訳元: - + Translates to: 翻訳先: - + Description: - + Files comprising this dictionary: この辞書を含むファイル: - + Adjust the order by dragging and dropping items in it. Drop dictionaries to the inactive group to disable their use. アイテムをドラッグ アンド ドロップして順序を調整します。使用を無効にするには非アクティブなグループへ辞書をドロップします。 - + Sort by name - + Sort by languages + + + Dictionary headwords + + + + + Dictionaries active: %1, inactive: %2 + + PathsModel - + Path パス - + Recursive 再帰 @@ -2784,14 +3256,14 @@ ダブルクリックでクリックされた単語を翻訳する - + Chooses whether the scan popup mode is on by default or not. If checked, the program would always start with the scan popup active. スキャン ポップアップ モードを既定でオンにするかを選択します。チェックされている場合、 プログラムは常にスキャン ポップアップがアクティブで起動します。 - + Normally, in order to activate a popup you have to maintain the chosen keys pressed while you select a word. With this enabled, the chosen keys may also @@ -2802,27 +3274,27 @@ 選択が完了した直後にも押すことができます。 - + Hotkeys ホットキー - + Use the following hotkey to show or hide the main window: メイン ウィンドウを表示または非表示にするのに次のホットキーを使用します: - + Use the following hotkey to translate a word from clipboard: クリップボードからの単語を翻訳するのに次のホットキーを使用します: - + The hotkeys are global and work from any program and within any context as long as GoldenDict is running in background. ホットキーはグローバルであり、GoldenDict が背景で起動中であればすべてのプログラムで脈絡なく実行します。 - + &Scan Popup スキャン ポップアップ(&S) @@ -2873,17 +3345,22 @@ - + + Help language + + + + Adjust this value to avoid huge context menus. - + Context menu dictionaries limit: - + When enabled, a translation popup window would be shown each time you point your mouse on any word on the screen (Windows) or select any word with mouse (Linux). When enabled, you can switch it on and @@ -2894,134 +3371,134 @@ またはトレイ アイコンからオンとオフを切り替えることができます。 - + Enable scan popup functionality スキャン ポップアップ機能を有効にする - + Start with scan popup turned on スキャン ポップアップをオンにして起動する - + With this enabled, the popup would only show up if all chosen keys are in the pressed state when the word selection changes. これが有効だと、ポップアップは単語の選択範囲が変更したときに すべての選択されたキーが押されている状態でのみ表示されます。 - + Only show popup when all selected keys are kept pressed: すべての選択されたキーが押されているときのみポップアップを表示する: - + Left Ctrl only 左 Ctrl のみ - + Left Ctrl 左 Ctrl - + Right Shift only 右 Shift のみ - + Right Shift 右 Shift - + Alt key Alt キー - + Alt Alt - + Ctrl key Ctrl キー - + Ctrl Ctrl - + Left Alt only 左 Alt のみ - + Left Alt 左 Al - + Shift key Shift キー - + Shift Shift - + Right Alt only 右 Alt のみ - + Right Alt 右 Alt - + Right Ctrl only 右 Ctrl のみ - + Right Ctrl 右 Ctrl - + Left Shift only 左 Shift のみ - + Left Shift 左 Shift - + Windows key or Meta key Windows キーまたは Meta キー - + Win/Meta Win/Meta - + Keys may also be pressed afterwards, within キーはその後 - + To avoid false positives, the keys are only monitored after the selection's done for a limited amount of seconds, which is specified here. @@ -3030,22 +3507,22 @@ 後にのみ監視されます。 - + secs 秒まで押せる - + Send translated word to main window instead of to show it in popup window - + Send translated word to main window - + <!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; } @@ -3058,57 +3535,92 @@ <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" color:#ff0000;">注意: RECORD 拡張が破損した X.Org XServer リリースを実行しているようです。GoldenDict のホットキーが動作しない可能性があります。これはサーバー自体で修正される必要があります。次の</span><a href="https://bugs.freedesktop.org/show_bug.cgi?id=20500"><span style=" text-decoration: underline; color:#0000ff;">バグ エントリ</span></a>を参照して<span style=" color:#ff0000;">できればそこにコメントを残してください。</span></p></body></html> - + &Audio オーディオ(&A) - + Pronunciation 発音 - + Auto-pronounce words in main window メイン ウィンドウで単語を自動的に発音する - + Auto-pronounce words in scan popup スキャン ポップアップで単語を自動的に発音する - + Playback 再生 - + Play audio files via FFmpeg(libav) and libao - + Use internal player - + + System proxy + + + + + Custom proxy + + + + + Custom settings + + + + + Full-text search + + + + + Allow full-text search for: + + + + + Don't search in dictionaries containing more than + + + + + articles (0 - unlimited) + + + + Select this option to automatic collapse big articles - + Collapse articles more than - + Articles longer than this size will be collapsed - + symbols @@ -3133,59 +3645,59 @@ Phonon を通じて再生する - + Use any external program to play audio files オーディオ ファイルの再生に外部プログラムを使用します - + Use external program: 外部プログラムを使用する: - + &Network ネットワーク(&N) - + Enable if you wish to use a proxy server for all program's network requests. すべてのプログラムのネットワーク要求にプロキシ サーバーを使用したい場合は有効にします。 - + Use proxy server プロキシ サーバーを使用する - + Type: 種類: - + Host: ホスト: - + Port: ポート: - + User: ユーザー: - + Password: パスワード: - + Enabling this would make GoldenDict block most advertisements by disallowing content (images, frames) not originating from the site you are browsing. If some site breaks because of this, try disabling this. @@ -3194,35 +3706,35 @@ ブロックします。特定のサイトが破損する場合は、これを無効にしてみてください。 - + Disallow loading content from other sites (hides most advertisements) 他のサイトからのコンテンツの読み込みを無効にする (ほとんどの広告を非表示にします) - + Enabling this would allow to listen to sound pronunciations from online dictionaries that rely on Flash or other web plugins. Plugin must be installed for this option to work. - + Enable web plugins - + Some sites detect GoldenDict via HTTP headers and block the requests. Enable this option to workaround the problem. - + Do not identify GoldenDict in HTTP headers - + When this is enabled, the program periodically checks if a new, updated version of GoldenDict is available for download. If it is so, the program @@ -3234,22 +3746,22 @@ ダウンロード ページを開くか確認します。 - + Check for new program releases periodically 定期的に新しいプログラム リリースをチェックする - + Ad&vanced - + ScanPopup extra technologies - + Try to use IAccessibleEx technology to retrieve word under cursor. This technology works only with some programs that support it (for example Internet Explorer 9). @@ -3257,121 +3769,122 @@ - + Use &IAccessibleEx - + Try to use UI Automation technology to retrieve word under cursor. This technology works only with some programs that support it. It is not needed to select this option if you don't use such programs. - + Use &UIAutomation - + Try to use special GoldenDict message to retrieve word under cursor. This technology works only with some programs that support it. It is not needed to select this option if you don't use such programs. - + Use &GoldenDict message - + History - + Turn this option on to store history of the translated words - + Store &history - + Specify the maximum number of entries to keep in history. - + Maximum history size: - + History saving interval. If set to 0 history will be saved only during exit. - + Save every - + minutes - + Articles - + Turn this option on to always expand optional parts of articles - + Expand optional &parts - + System default システム既定 - + + Default 既定 - + Modern - + Lingvo Lingvo - + Babylon - + Lingoes - + Lingoes-Blue @@ -3380,12 +3893,12 @@ DirectShow を通じて再生する - + Changing Language 言語の変更 - + Restart the program to apply the language change. 言語の変更を適用するにはプログラムを再起動します。 @@ -3393,27 +3906,27 @@ ProgramTypeEditor - + Audio - + Plain Text - + Html - + Prefix Match - + Unknown @@ -3439,27 +3952,27 @@ ProgramsModel - + Enabled 有効 - + Type - + Name 名前 - + Command Line - + Icon @@ -3467,12 +3980,14 @@ QObject - + + Article loading error - + + Article decoding error @@ -3583,18 +4098,18 @@ ResourceToSaveHandler - - + + ERROR: %1 - + Resource saving error: - + The referenced resource failed to download. 参照されたリソースのダウンロードに失敗しました。 @@ -3602,12 +4117,12 @@ Romaji - + Hepburn Romaji for Hiragana ヘボン式ローマ字のひらがな - + Hepburn Romaji for Katakana ヘボン式ローマ字のカタカナ @@ -3632,12 +4147,12 @@ 単語 - + Back 戻る - + Forward 進む @@ -3650,43 +4165,43 @@ Alt+M - + Pronounce Word (Alt+S) 単語の発音 (Alt+S) - + Alt+S Alt+S - + Send word to main window (Alt+W) - + Alt+W - + Shows or hides the dictionary bar 辞書バーの表示または非表示を切り替えます - + Use this to pin down the window so it would stay on screen, could be resized or managed in other ways. ウィンドウを画面に固定してサイズの変更ができる ようにするにはこのピンを使用します。 - - - - - + + + + + ... ... @@ -3695,8 +4210,8 @@ GoldenDict - - + + %1 - %2 @@ -3704,17 +4219,17 @@ SoundDirsModel - + Path パス - + Name 名前 - + Icon @@ -3722,45 +4237,47 @@ Sources - + Text to Speech - + (not available in portable version) (ポータブル バージョンでは利用できません) - - - + + + Choose a directory ディレクトリを選択します - - - - - + + + + + + Confirm removal 削除の確認 - - + + Remove directory <b>%1</b> from the list? 一覧からディレクトリ <b>%1</b> を削除しますか? - - + + + Remove site <b>%1</b> from the list? 一覧からサイト <b>%1</b> を削除しますか? - + Remove program <b>%1</b> from the list? @@ -3779,7 +4296,8 @@ - + + &Add... 追加(&A)... @@ -3788,7 +4306,8 @@ - + + &Remove 削除(&R) @@ -3852,32 +4371,32 @@ また、CP1251 には %GD1251%、ISO 8859-1 には %GDISO1% を使用します。 - + Programs - + Forvo Forvo - + Live pronunciations from <a href="http://www.forvo.com/">forvo.com</a>. The site allows people to record and share word pronunciations. You can listen to them from GoldenDict. <a href="http://www.forvo.com/">Forvo.com</a> からの生の発音です。このサイトで人々は単語の発音を録音および共有します。GoldenDict からそれらを聴くことができます。 - + Enable pronunciations from Forvo Forvo からの発音を有効にする - + API Key: API キー: - + Use of Forvo currently requires an API key. Leave this field blank to use the default key, which may become unavailable in the future, or register on the site to get your own key. @@ -3886,7 +4405,7 @@ またはサイトで登録して自分のキーを取得します。 - + Get your own key <a href="http://api.forvo.com/key/">here</a>, or leave blank to use the default one. @@ -3915,78 +4434,88 @@ + + DICT servers + + + + DICT servers: + + + + Any external programs. A string %GDWORD% will be replaced with the query word. If such string is not presented, the word will be fed into standard input. - + Language codes (comma-separated): 言語コード (コンマ区切り): - + List of language codes you would like to have. Example: "en, ru". 使用したい言語コードの一覧です。例: "en, ja"。 - + Full list of language codes is available <a href="http://www.forvo.com/languages-codes/">here</a>. 言語コードの完全な一覧は<a href="http://www.forvo.com/languages-codes/">こちら</a>です。 - + Transliteration 音訳 - + Russian transliteration ロシア語音訳 - + Greek transliteration ギリシャ語音訳 - + German transliteration ドイツ語音訳 - + Belarusian transliteration - + Enables to use the Latin alphabet to write the Japanese language 日本語の記述のラテン文字の使用を有効にします - + Japanese Romaji 日本語ローマ字 - + Systems: システム: - + The most widely used method of transcription of Japanese, based on English phonology 英語の音韻に基づいた、最も広く使われている日本語の音写法です - + Hepburn ヘボン式 - + The most regular system, having a one-to-one relation to the kana writing systems. Standardized as ISO 3602 @@ -3997,12 +4526,12 @@ GoldenDict にはまだ実装されていません。 - + Nihon-shiki 日本式 - + Based on Nihon-shiki system, but modified for modern standard Japanese. Standardized as ISO 3602 @@ -4013,32 +4542,32 @@ GoldenDict にはまだ実装されていません。 - + Kunrei-shiki 訓令式 - + Syllabaries: 仮名: - + Hiragana Japanese syllabary ひらがな - + Hiragana ひらがな - + Katakana Japanese syllabary カタカナ - + Katakana カタカナ @@ -4178,22 +4707,22 @@ WebSitesModel - + Enabled 有効 - + Name 名前 - + Address アドレス - + Icon @@ -4201,7 +4730,7 @@ WordFinder - + Failed to query some dictionaries. いくつかの辞書のクエリに失敗しました。 diff -Nru goldendict-1.5.0~git20131003/locale/ko_KR.ts goldendict-1.5.0~git20150923/locale/ko_KR.ts --- goldendict-1.5.0~git20131003/locale/ko_KR.ts 2013-10-02 20:42:04.000000000 +0000 +++ goldendict-1.5.0~git20150923/locale/ko_KR.ts 2015-09-23 08:26:24.000000000 +0000 @@ -34,7 +34,7 @@ [모름] - + Based on Qt %1 (%2, %3 bit) Based on Qt %1 (%2, %3 bit) @@ -42,62 +42,62 @@ ArticleMaker - + Expand article 사전 펼치기 - + Collapse article 사전 감추기 - + No translation for <b>%1</b> was found in group <b>%2</b>. <b>%2</b>그룹에서 <b>%1</b>에 대한 번역을 찾을 수 없습니다. - + No translation was found in group <b>%1</b>. <b>%1</b>그룹에서 번역을 찾을 수 없습니다. - + Welcome! 환영합니다! - + <h3 align="center">Welcome to <b>GoldenDict</b>!</h3><p>To start working with the program, first visit <b>Edit|Dictionaries</b> to add some directory paths where to search for the dictionary files, set up various Wikipedia sites or other sources, adjust dictionary order or create dictionary groups.<p>And then you're ready to look up your words! You can do that in this window by using a pane to the left, or you can <a href="Working with popup">look up words from other active applications</a>. <p>To customize program, check out the available preferences at <b>Edit|Preferences</b>. All settings there have tooltips, be sure to read them if you are in doubt about anything.<p>Should you need further help, have any questions, suggestions or just wonder what the others think, you are welcome at the program's <a href="http://goldendict.org/forum/">forum</a>.<p>Check program's <a href="http://goldendict.org/">website</a> for the updates. <p>(c) 2008-2013 Konstantin Isakov. Licensed under GPLv3 or later. <h3 align="center"><b>GoldenDict</b>사용을 환영합니다!</h3><p>프로그램 사용을 위해서 먼저 <b>편집|사전</b> 에서 사용할 사전의 경로, Wikipedia와 다른 온라인 검색사이트 등록를 등록하고 사전의 표시순서와 그룹을 지정하십시오. <p>그러면 사용을 위한 준비가 끝났습니다! 지금 창의 왼쪽에서 검색어를 입력하거나 실행중인 <a href="팝업창 사용">다른 프로그램에서 단어검색</a>을 할 수 있습니다. <p>프로그램을 자신에 맞게 설정하려면 <b>편집|설정</b>메뉴를 사용하십시오. 모든 설정항목은 말풍선 도움말이 있으니 기능을 잘 모르는 경우 꼭 확인하시기 바랍니다. <p>더 많은 도움이 필요하거나 질문, 제안사항이 있는 경우 또는 다른 사용자들의 생각이 궁금하면 프로그램의 <a href="http://goldendict.org/forum/">포럼</a>을 방문하십시오.<p>프로그램 업데이트는 <a href="http://goldendict.org/">웹사이트</a>를 방문하십시오.<p>(c) 2008-2013 Konstantin Isakov. Licensed under GPLv3 or later. - + Working with popup 팝업창 사용 - + <h3 align="center">Working with the popup</h3>To look up words from other active applications, you would need to first activate the <i>"Scan popup functionality"</i> in <b>Preferences</b>, and then enable it at any time either by triggering the 'Popup' icon above, or by clicking the tray icon down below with your right mouse button and choosing so in the menu you've popped. <h3 align="center">팝업창 사용</h3><p style="text-indent:1em">실행중인 프로그램에서 단어를 검색하려면 먼저 <b>설정</b>에서 <b>스캔팝업기능</b>을 활성화해야 합니다. 다음 아무때나 위의 팝업아이콘을 누르거나 혹은 작업표시줄의 아이콘을 우클릭한 뒤 선택하면 활성화할 수 있습니다. - + Then just stop the cursor over the word you want to look up in another application, and a window would pop up which would describe it to you. 이제 실행중인 다른 프로그램에서 검색할 단어 위에 커서를 옮기면 팝업창으로 사전이 나타납니다. - + Then just select any word you want to look up in another application by your mouse (double-click it or swipe it with mouse with the button pressed), and a window would pop up which would describe the word to you. 이제 다른 프로그램에서 검색할 단어를 선택하면(더블클릭 또는 마우스로 선택) 팝업창으로 사전이 나타납니다. - + (untitled) (제목없음) - + (picture) (그림) @@ -105,37 +105,37 @@ ArticleRequest - + Expand article 사전 펼치기 - + From From - + Collapse article 사전 감추기 - + Query error: %1 검색오류: %1 - + Close words: 인접 어휘: - + Compound expressions: 복합 어구: - + Individual words: 개별 어휘: @@ -143,93 +143,94 @@ ArticleView - + Select Current Article 현재 항목 선택 - + Copy as text 텍스트로 복사 - + Inspect 요소검사 - + Resource 리소스 - + Audio 오디오 - + TTS Voice TTS 음성 - + Picture 그림 - + Video 비디오 - + Video: %1 비디오: %1 - + Definition from dictionary "%1": %2 사전의 정의 "%1": %2 - + Definition: %1 정의: %1 - - + + The referenced resource doesn't exist. 참조할 리소스가 존재하지 않습니다. - + The referenced audio program doesn't exist. 참조할 오디오 프로그램이 존재하지 않습니다. - + + ERROR: %1 오류: %1 - + Save sound 사운드 저장 - + Sound files (*.wav *.ogg *.mp3 *.mp4 *.aac *.flac *.mid *.wv *.ape);;All files (*.*) 사운드 파일 (*.wav *.ogg *.mp3 *.mp4 *.aac *.flac *.mid *.wv *.ape);;모든 파일 (*.*) - + Save image 이미지 저장 - + Image files (*.bmp *.jpg *.png *.tif);;All files (*.*) 이미지 파일 (*.bmp *.jpg *.png *.tif);;모든 파일 (*.*) @@ -238,53 +239,53 @@ 리소스 저장 오류: - + &Open Link 링크 열기(&O) - + Open Link in New &Tab 새 탭에서 링크 열기(&T) - + Open Link in &External Browser 외부 브라우저에서 링크 열기(&E) - + &Look up "%1" "%1" 검색(&L) - + Look up "%1" in &New Tab 새 탭에서 "%1" 검색(&N) - + Send "%1" to input line "%1"을 입력줄로 보냄 - - + + &Add "%1" to history 검색기록에 "%1" 추가(&A) - + Look up "%1" in %2 %2에서 "%1" 검색 - + Look up "%1" in %2 in &New Tab 새 탭을 열고 %2에서 "%1" 검색(&N) - + WARNING: FFmpeg Audio Player: %1 경고: FFmpeg 오디오 플레이어: %1 @@ -305,37 +306,37 @@ Bass library가 이 사운드를 재생할 수 없습니다. - + Failed to run a player to play sound file: %1 사운드를 재생할 플레이어를 실행할 수 없습니다: %1 - + Failed to create temporary file. 임시파일을 만들 수 없습니다. - + Failed to auto-open resource file, try opening manually: %1. 리소스파일을 여는데 실패했습니다. 수동으로 열어 보십시오: %1. - + The referenced resource failed to download. 참조할 리소스를 다운로드하지 못했습니다. - + Save &image... 이미지 저장(&i)... - + Save s&ound... 사운드 저장(&o)... - + WARNING: %1 경고: %1 @@ -345,44 +346,46 @@ 형태 - + about:blank about:blank - + x x - + Find: 찾기: - + + &Previous 이전(&P) - + + &Next 다음(&N) - + Ctrl+G Ctrl+G - + &Case Sensitive 대소문자 구분(&C) - + Highlight &all - 전체 강조표시(&a) + 검색어 강조(&a) @@ -406,6 +409,29 @@ + Dialog + + + Proxy authentication required + 프록시 인증이 필요함 + + + + You need to supply a Username and a Password to access via proxy + 프록시를 통해 접근하기 위해서는 사용자명과 암호를 입력해야 합니다 + + + + Username: + 사용자 이름: + + + + Password: + 암호: + + + DictGroupWidget @@ -506,6 +532,119 @@ + DictHeadwords + + + Search mode + 검색 모드 + + + + This element determines how filter string will be interpreted + 이 요소는 필터가 어떻게 해석될 것인지 결정합니다 + + + + If checked on the symbols case will be take in account when filtering + 체크하면 필터링시에 대소문자가 고려될 것입니다 + + + + Match case + 대소문자 구분 + + + + Exports headwords to file + 표제어들을 파일로 저장합니다 + + + + Export + 내보내기 + + + + Help + 도움말 + + + + OK + OK + + + + Press this button to apply filter to headwords list + 표제어목록에 필터를 적용하려면 이 버튼을 누르시오 + + + + Apply + 적용 + + + + If checked any filter changes will we immediately applied to headwords list + 체크하면 필터 변경이 즉시 표제어목록에 적용될 것입니다 + + + + Auto apply + 자동 적용 + + + + Filter: + 필터: + + + + Filter string (fixed string, wildcards or regular expression) + 필터 (고정문자열, 와일드카드 또는 정규식) + + + + Text + 텍스트 + + + + Wildcards + 와일드카드 + + + + RegExp + 정규식 + + + + Unique headwords total: %1, filtered: %2 + 전체 표제어 수: %1, 필터링 후: %2 + + + + Save headwords to file + 표제어들을 파일로 저장합니다 + + + + Text files (*.txt);;All files (*.*) + 텍스트파일(*.txt);;모든 파일(*.*) + + + + Export headwords... + 표제어 내보내기... + + + + Cancel + 취소 + + + DictInfo @@ -548,6 +687,16 @@ 설명: + + Show all unique dictionary headwords + 사전의 모든 표제어들을 표시합니다 + + + + Headwords + 표제어 + + Edit the dictionary via command: %1 @@ -564,6 +713,76 @@ + DictServer + + + Url: + Url: + + + + Databases: + 데이터베이스: + + + + Search strategies: + 검색 조건: + + + + Server databases + + + + + DictServersModel + + + Enabled + 활성 + + + + Name + 이름 + + + + Address + 주소 + + + + Databases + 데이터베이스 + + + + Strategies + 조건 + + + + Icon + 아이콘 + + + + Comma-delimited list of databases +(empty string or "*" matches all databases) + 콤마로 구분된 데이터베이스 목록 +(공백 또는 "*" 는 데이터베이스 전체) + + + + Comma-delimited list of search strategies +(empty string mean "prefix" strategy) + 콤마로 구분된 검색조건 목록 +(공백은 "prefix" 조건) + + + DictionaryBar @@ -581,17 +800,22 @@ 그룹 편집 - + Dictionary info 사전 정보 - + + Dictionary headwords + 사전 표제어 + + + Open dictionary folder 사전 폴더 열기 - + Edit dictionary 사전 편집 @@ -599,39 +823,39 @@ EditDictionaries - + &Sources 사전소스(&S) - - + + &Dictionaries 사전(&D) - - + + &Groups 그룹(&G) - + Sources changed 소스가 변경되었습니다 - + Some sources were changed. Would you like to accept the changes? 일부 소스가 변경되었습니다. 변경을 수락하시겠습니까? - + Accept 수락 - + Cancel 취소 @@ -650,6 +874,92 @@ + FTS::FtsIndexing + + + None + 없음 + + + + FTS::FullTextSearchDialog + + + Full-text search + 전문검색 + + + + Whole words + 단어 단위로 찾기 + + + + Plain text + 텍스트 + + + + Wildcards + 와일드카드 + + + + RegExp + 정규식 + + + + Max distance between words (%1-%2): + 단어사이의 최대 거리 (%1-%2): + + + + Max articles per dictionary (%1-%2): + 사전당 최대 항목 (%1-%2): + + + + + + Articles found: + 검색된 항목: + + + + Now indexing: + 목록작성중: + + + + CJK symbols in search string are not compatible with search modes "Whole words" and "Plain text" + 검색어에 있는 CJK 기호들이 "단어 단위로 찾기" "텍스트" 검색모드에 사용될 수 없습니다. + + + + The search line must contains at least one word containing + 검색 줄은 적어도 한 개 단어를 포함해야 합니다 + + + + or more symbols + 자 이상 + + + + No dictionaries for full-text search + 전문검색을 위한 사전이 없음 + + + + FTS::Indexing + + + None + 없음 + + + Forvo::ForvoArticleRequest @@ -688,6 +998,65 @@ + FullTextSearchDialog + + + + Search + 검색 + + + + Match case + 대소문자 구분 + + + + Mode: + 모드: + + + + Articles found: + 검색된 항목: + + + + Available dictionaries in group: + 그룹에서 이용가능한 사전: + + + + Wait for indexing: + 목록작성을 위해 대기중: + + + + Total: + 전체: + + + + Indexed: + 목록작성완료: + + + + Now indexing: None + 목록작성중: 없음 + + + + Cancel + 취소 + + + + Help + 도움말 + + + GermanTranslit @@ -727,43 +1096,53 @@ Groups - + + Group tabs + 그룹 탭 + + + + Open groups list + 그룹 목록을 엽니다 + + + Add group 그룹 추가 - + Give a name for the new group: 새 그룹의 이름을 지정합니다: - + Rename group 그룹 이름 변경 - + Give a new name for the group: 새로운 그룹 이름을 지정합니다: - + Remove group 그룹 삭제 - + Are you sure you want to remove the group <b>%1</b>? <b>%1</b>그룹을 삭제하시겠습니까? - + Remove all groups 모든 그룹 삭제 - + Are you sure you want to remove all the groups? 모든 그룹을 삭제하시겠습니까? @@ -864,6 +1243,54 @@ + Help::HelpWindow + + + GoldenDict help + 골든딕 도움말 + + + + Home + + + + + Back + 뒤로 + + + + Forward + 앞으로 + + + + Zoom In + 확대 + + + + Zoom Out + 축소 + + + + Normal Size + 보통 + + + + Content + 내용 + + + + Index + 목록 + + + HistoryPaneWidget @@ -894,12 +1321,12 @@ Hunspell - + Spelling suggestions: 철자법 제안: - + %1 Morphology %1 철자법사전 @@ -907,12 +1334,12 @@ HunspellDictsModel - + Enabled 활성 - + Name 이름 @@ -1952,7 +2379,7 @@ LoadDictionaries - + Error loading dictionaries 사전 호출 실패 @@ -1960,7 +2387,7 @@ Main - + Error in configuration file. Continue with default settings? 설정파일 오류. 기본설정으로 계속하시겠습니까? @@ -1968,68 +2395,68 @@ MainWindow - + Back 뒤로 - + Forward 앞으로 - + Scan Popup 스캔팝업 - + Show &Main Window 메인창 보이기(&M) - - + + &Quit 종료(&Q) - + Loading... 불러오는 중... - + Skip This Release 이 버전을 무시합니다 - + You have chosen to hide a menubar. Use %1 to show it back. 메뉴 모음 숨기기를 선택하셨습니다. 다시 보이게 하려면 %1을 사용하십시오. - + Ctrl+M Ctrl+M - + Page Setup 페이지 설정 - + No printer is available. Please install one first. 프린터가 없습니다. 먼저 프린터를 설치하십시오. - + Print Article 항목 인쇄 - + Save Article As 다른 이름으로 항목 저장 @@ -2038,469 +2465,511 @@ Html 파일(*.html *.htm) - + Error 오류 - + Can't save article: %1 항목을 저장할 수 없습니다: %1 - + %1 dictionaries, %2 articles, %3 words 사전수: %1,항목수: %2,어휘수: %3 - + Failed to initialize hotkeys monitoring mechanism.<br>Make sure your XServer has RECORD extension turned on. 단축키 감시메커니즘을 시작할 수없습니다..<br>XServer에서 RECORD extension이 활성화 되어 있는지 확인하십시오. - + New Release Available 새 버전이 있습니다 - + Version <b>%1</b> of GoldenDict is now available for download.<br>Click <b>Download</b> to get to the download page. 골든딕 <b>%1</b>버전을 다운로드할 수 있습니다.<br><b>다운로드</b>를 누르면 다운로드 페이지로 연결됩니다. - + Download 다운로드 - - + + Look up in: 검색그룹: - + &Menubar 메뉴 모음(&M) - + Found in Dictionaries: - 사전 검색 결과: + 검색된 사전: - + Pronounce Word (Alt+S) 발음 듣기(Alt+S) - + Show Names in Dictionary &Bar 사전모음에 이름 보이기(&B) - + Show Small Icons in &Toolbars 도구모음에 작은 아이콘(&T) - + &Navigation 탐색 도구모음(&N) - + Zoom In 확대 - + Zoom Out 축소 - + Normal Size 보통 - + Words Zoom In 검색어 확대 - + Words Zoom Out 검색어 축소 - + Words Normal Size 검색어 보통 - + Close current tab 현재 탭 닫기 - + Close all tabs 모든 탭 닫기 - + Close all tabs except current 다른 탭 닫기 - + Look up: 검색: - + All All - - + + Accessibility API is not enabled Accessibility API가 활성화 되지 않았습니다 - + The main window is set to be always on top. 메인창이 항상 위에 보이도록 설정합니다. - + Import history from file 검색기록을 파일에서 불러옵니다 - + Import error: invalid data in file 불러오기 오류: 파일의 데이타가 유효하지 않습니다 - + History import complete 검색기록 불러오기를 완료했습니다 - + Import error: 불러오기 오류: - + Dictionary info 사전 정보 - + + Dictionary headwords + 사전 표제어 + + + Open dictionary folder 사전 폴더 열기 - + Edit dictionary - Редактировать словарь + 사전 편집 - + Opened tabs 열린 탭 - + + String to search in dictionaries. The wildcards '*', '?' and sets of symbols '[...]' are allowed. +To find '*', '?', '[', ']' symbols use '\*', '\?', '\[', '\]' respectively + 사전에서 찾을 문자열. 와일드카드 '*', '?' 괄호문자 '[...]'가 허용됩니다. +'*', '?', '[', ']' 기호를 찾으려면 각각 '\*', '\?', '\[', '\]'를 사용하십시오 + + + Open Tabs List 탭 목록을 엽니다 - + (untitled) (제목없음) - + %1 - %2 %1 - %2 - + Article, Complete (*.html) 항목, 전부 (*.html) - + Article, HTML Only (*.html) 항목, HTML 만 (*.html) - + Saving article... 항목 저장... - + &Hide 숨기기(&H) - + Export history to file 검색기록을 파일로 저장합니다 - - + + Text files (*.txt);;All files (*.*) 텍스트파일(*.txt);;모든 파일(*.*) - + History export complete 검색기록 저장을 완료했습니다 - + Export error: 저장 오류: - + Welcome! 환영합니다! - + &File 파일(&F) - + &Edit 편집(&E) - + &Help 도움말(&H) - + &Search Pane 검색창(&S) - + &Results Navigation Pane 검색결과 탐색창(&R) - + &Preferences... 설정...(&P) - + F2 F2 - + &View 보기(&V) - + &Zoom 글자크기(&Z) - + H&istory 검색기록(&I) - + + Search + 검색 + + + &History Pane 검색기록창(&H) - + &Dictionaries... 사전...(&D) - + F3 F3 - + F4 F4 - + &Homepage 홈페이지(&H) - + &About 정보(&A) - + About GoldenDict 골든딕 정보 - + + GoldenDict reference + 골든딕 도움말 + + + F1 F1 - + Quit from application 프로그램 종료 - + Ctrl+Q Ctrl+Q - + &Forum 포럼(&F) - + &Close To Tray 트레이로 닫기(&C) - + Minimizes the window to tray 창을 트레이로 최소화합니다 - + Ctrl+F4 Ctrl+F4 - + &Save Article 검색항목 저장(&S) - + Save Article 검색항목을 저장합니다 - + &Print 인쇄(&P) - + Ctrl+P Ctrl+P - + Page Set&up 페이지 설정(&U) - + Print Pre&view 인쇄 미리보기(&V) - + &Rescan Files 파일 다시 읽기(&R) - + &New Tab 새 탭(&N) - + &Always on Top 항상 위에(&A) - + Always on Top 항상 위에 - + Ctrl+O Ctrl+O - - - + + + Menu Button 메뉴 단추 - + + Search in page + 페이지 내 검색 + + + + Ctrl+F + Ctrl+F + + + + Full-text search + 전문검색 + + + + Ctrl+Shift+F + Ctrl+Shift+F + + + Ctrl+F5 Ctrl+F5 - + &Clear 기록 비우기(&C) - + New Tab 새 탭 - + Ctrl+T Ctrl+T - + &Configuration Folder 설정폴더 열기(&C) - - + + &Show 보이기(&S) - + Ctrl+H Ctrl+H - + &Export 내보내기(&E) - + &Import 불러오기(&I) @@ -2508,12 +2977,12 @@ Mdx::MdxArticleRequest - + Dictionary file was tampered or corrupted 사전파일이 훼손되었습니다 - + Failed loading article from %1, reason: %2 %1에서 항목을 표시하지 못함, 이유: %2 @@ -2521,7 +2990,7 @@ MediaWiki::MediaWikiArticleRequest - + XML parse error: %1 at %2,%3 XML 문법오류: %2행 %3열에서 %1 @@ -2529,7 +2998,7 @@ MediaWiki::MediaWikiWordSearchRequest - + XML parse error: %1 at %2,%3 XML 문법오류: %2행 %3열에서 %1 @@ -2537,22 +3006,22 @@ MediaWikisModel - + Enabled 활성 - + Name 이름 - + Address 주소 - + Icon 아이콘 @@ -2565,88 +3034,94 @@ Form - + Dictionary order: 사전 순서: - - - - ... - ... + ... - + Inactive (disabled) dictionaries: 비활성(사용중지) 사전: - + Dictionary information 사전 정보 - + Name: 이름: - + Total articles: 총항목: - + Total words: 총어휘: - + Translates from: 검색언어: - + Translates to: 번역언어: - + Description: 설명: - + Files comprising this dictionary: 사전의 구성파일: - + Adjust the order by dragging and dropping items in it. Drop dictionaries to the inactive group to disable their use. 마우스끌기로 순서를 조정하십시오. 사전을 사용하지 않으려면 비활성 그룹으로 옮기십시오. - + Sort by name 이름순 정렬 - + Sort by languages 언어순 정렬 + + + Dictionary headwords + 사전 표제어 + + + + Dictionaries active: %1, inactive: %2 + 사용중: %1, 사용중지: %2 + PathsModel - + Path 경로 - + Recursive 하위 폴더 검색 @@ -2756,14 +3231,14 @@ 더블클릭으로 단어 검색 - + Chooses whether the scan popup mode is on by default or not. If checked, the program would always start with the scan popup active. 기본값으로 스캔팝업모드를 켤 것인지 설정합니다. 이 항목을 선택하면, 프로그램이 시작할 때 항상 스캔팝업기능이 활성화됩니다. - + Normally, in order to activate a popup you have to maintain the chosen keys pressed while you select a word. With this enabled, the chosen keys may also @@ -2777,27 +3252,27 @@ 단어를 선택한 직후에 눌러도 동일한 기능을 합니다. - + Hotkeys 단축키 - + Use the following hotkey to show or hide the main window: 메인창 보이기/감추기를 위해 다음 단축키를 사용합니다: - + Use the following hotkey to translate a word from clipboard: 단어를 클립보드에 복사하여 검색할 때 다음 단축키를 사용합니다: - + The hotkeys are global and work from any program and within any context as long as GoldenDict is running in background. 단축키는 전역(Global) 키이므로 골든딕이 배경에서 실행중이면 모든 프로그램, 상황에서 작동합니다. - + &Scan Popup 스캔팝업(&S) @@ -2849,17 +3324,22 @@ Add-on 스타일: - + + Help language + 도움말 언어 + + + Adjust this value to avoid huge context menus. 컨텍스트메뉴가 너무 커지지 않게 이 값을 조정합니다. - + Context menu dictionaries limit: 컨텍스트메뉴 사전 한도: - + When enabled, a translation popup window would be shown each time you point your mouse on any word on the screen (Windows) or select any word with mouse (Linux). When enabled, you can switch it on and @@ -2869,134 +3349,134 @@ 메인창이나 트레이 아이콘에서 기능을 시작/중지할 수 있습니다. - + Enable scan popup functionality 스캔팝업 기능을 활성화합니다 - + Start with scan popup turned on 프로그램 시작시 스캔팝업 활성화 - + With this enabled, the popup would only show up if all chosen keys are in the pressed state when the word selection changes. 이 항목을 선택하면 마우스가 다른 단어 위로 이동할 때 설정된 모든 키가 눌려진 상태에서만 팝업이 나타납니다. - + Only show popup when all selected keys are kept pressed: 선택한 모든 키가 눌러진 상태일 때만 팝업창을 보입니다: - + Left Ctrl only 왼쪽 Ctrl 키만 - + Left Ctrl 왼쪽 Ctrl - + Right Shift only 오른쪽 Shift 키만 - + Right Shift 오른쪽 Shift - + Alt key Alt 키 - + Alt Alt - + Ctrl key Ctrl 키 - + Ctrl Ctrl - + Left Alt only 왼쪽 Alt 키만 - + Left Alt 왼쪽 Alt - + Shift key Shift 키 - + Shift Shift - + Right Alt only 오른쪽 Alt 키만 - + Right Alt 오른쪽 Alt - + Right Ctrl only 오른쪽 Ctrl 키만 - + Right Ctrl 오른쪽 Ctrl - + Left Shift only 왼쪽 Shift 키만 - + Left Shift 왼쪽 Shift - + Windows key or Meta key 윈도우 단축키 또는 메타 키 - + Win/Meta Win/Meta - + Keys may also be pressed afterwards, within 키를 나중에 입력하는 것을 허용합니다: 이내 - + To avoid false positives, the keys are only monitored after the selection's done for a limited amount of seconds, which is specified here. @@ -3004,47 +3484,82 @@ 다음에 지정된 시간 동안에만 감시됩니다. - + secs 초 이내 - + Send translated word to main window instead of to show it in popup window 검색내용을 팝업창에 표시하지 않고 메인창으로 보냅니다 - + Send translated word to main window 검색내용을 메인창에 표시 - + Play audio files via FFmpeg(libav) and libao 오디오 파일 재생시 FFmpeg(libav)와 libao 사용 - + Use internal player 내장 플레이어 사용 - + + System proxy + 시스템 Proxy + + + + Custom proxy + 사용자 Proxy + + + + Custom settings + 사용자 설정 + + + + Full-text search + 전문검색 + + + + Allow full-text search for: + 전문검색을 허용: + + + + Don't search in dictionaries containing more than + 항목수가 다음을 초과시 검색하지 않음 : + + + + articles (0 - unlimited) + 항목 (0 - 무제한) + + + Select this option to automatic collapse big articles 이 옵션을 선택하면 표시내용이 많은 항목을 자동으로 접히게 하여 숨깁니다 - + Collapse articles more than 자동으로 숨길 항목의 크기: - + Articles longer than this size will be collapsed 항목의 크기가 이 값을 초과 하면 내용을 접어 표시합니다 - + symbols 자 이상 @@ -3059,17 +3574,17 @@ Bass library를 통해 재생 - + Ad&vanced 고급(&V) - + ScanPopup extra technologies 스캔팝업 추가기능 - + Try to use IAccessibleEx technology to retrieve word under cursor. This technology works only with some programs that support it (for example Internet Explorer 9). @@ -3080,12 +3595,12 @@ 그런 프로그램을 사용하지 않는다면 이 옵션을 선택할 필요가 없습니다. - + Use &IAccessibleEx IAccessibleEx 사용(&I) - + Try to use UI Automation technology to retrieve word under cursor. This technology works only with some programs that support it. It is not needed to select this option if you don't use such programs. @@ -3094,12 +3609,12 @@ 그런 프로그램을 사용하지 않는다면 이 옵션을 선택할 필요가 없습니다. - + Use &UIAutomation UIAutomation 사용(&U) - + Try to use special GoldenDict message to retrieve word under cursor. This technology works only with some programs that support it. It is not needed to select this option if you don't use such programs. @@ -3108,67 +3623,67 @@ 그런 프로그램을 사용하지 않는다면 이 옵션을 선택할 필요가 없습니다. - + Use &GoldenDict message GoldenDict message 사용(&G) - + History 검색기록 - + Turn this option on to store history of the translated words 이 항목을 선택하면 사전의 검색기록을 저장합니다 - + Store &history 기록 저장(&H) - + Specify the maximum number of entries to keep in history. 검색기록에 저장할 최대 항목수를 지정하십시오. - + Maximum history size: 검색기록 최대크기: - + History saving interval. If set to 0 history will be saved only during exit. 검색기록을 자동으로 저장하는 간격. 0으로 지정하면 종료시에만 저장됩니다. - + Save every 저장 간격: - + minutes 분 마다 - + Articles 검색내용 - + Turn this option on to always expand optional parts of articles 이 항목을 선택하면 사전의 옵션항목을 항상 확장하여 보여줍니다 - + Expand optional &parts 옵셕항목 확장(&P) - + <!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; } @@ -3181,27 +3696,27 @@ <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" color:#ff0000;">Note: RECORD extension이 작동하지 않는 X.Org XServer를 구동하고 있는 것 같습니다. 골든딕의 단축키가 아마 작동하지 않을 것입니다. 다음의 </span><a href="https://bugs.freedesktop.org/show_bug.cgi?id=20500"><span style=" text-decoration: underline; color:#0000ff;">버그 항목</span></a>을 참고하고 <span style=" color:#ff0000;" 원한다면 댓글을 남겨 주십시오.</span></p></body></html> - + &Audio 음성(&А) - + Pronunciation 발음 - + Auto-pronounce words in main window 메인창에서 발음 자동 재생 - + Auto-pronounce words in scan popup 스캔팝업창에서 발음 자동 재생 - + Playback 재생 @@ -3226,59 +3741,59 @@ Phonon을 통해 재생 - + Use any external program to play audio files 외부 프로그램을 통하여 음성을 재생합니다 - + Use external program: 외부 프로그램 사용: - + &Network 네트워크(&N) - + Enable if you wish to use a proxy server for all program's network requests. 프로그램의 모든 네트워크 요청에 대해 proxy 서버를 사용하기 원하면 이 항목을 선택하십시오. - + Use proxy server Proxy 서버 사용 - + Type: 종류: - + Host: 호스트: - + Port: 포트: - + User: 사용자: - + Password: 암호: - + Enabling this would make GoldenDict block most advertisements by disallowing content (images, frames) not originating from the site you are browsing. If some site breaks because of this, try disabling this. @@ -3287,12 +3802,12 @@ 보인다면 이 항목을 해제해 보십시오. - + Disallow loading content from other sites (hides most advertisements) - 사이트 외부 자료 허용 안함(대부분의 광고 차단) + 사이트 외부 자료 허용 안함(대부분의 광고를 차단함) - + Enabling this would allow to listen to sound pronunciations from online dictionaries that rely on Flash or other web plugins. Plugin must be installed for this option to work. @@ -3301,24 +3816,24 @@ 플러그인이 작동하기 위해서는 미리 설치되어 있어야 합니다. - + Enable web plugins 웹 플러그인 허용 - + Some sites detect GoldenDict via HTTP headers and block the requests. Enable this option to workaround the problem. 일부 사이트는 HTTP 헤더를 통해서 GoldenDict을 탐지하여 요청을 블록합니다. 이런 문제를 우회하려면 옵션을 선택하십시오. - + Do not identify GoldenDict in HTTP headers HTTP 헤더에 GoldenDict을 표시하지 않음 - + When this is enabled, the program periodically checks if a new, updated version of GoldenDict is available for download. If it is so, the program @@ -3329,42 +3844,43 @@ 안내합니다. - + Check for new program releases periodically 정기적으로 업데이트 검사 - + System default 시스템 기본값 - + + Default 기본값 - + Modern Modern - + Lingvo Lingvo - + Babylon Babylon - + Lingoes Lingoes - + Lingoes-Blue Lingoes-Blue @@ -3373,12 +3889,12 @@ DirectShow를 통해 재생 - + Changing Language 언어 변경 - + Restart the program to apply the language change. 언어변경을 적용하려면 프로그램을 다시 시작하십시오. @@ -3386,27 +3902,27 @@ ProgramTypeEditor - + Audio 오디오 - + Plain Text 텍스트 - + Html Html - + Prefix Match 접두사 검색 - + Unknown 모름 @@ -3432,27 +3948,27 @@ ProgramsModel - + Enabled 활성 - + Type 종류 - + Name 이름 - + Command Line 명령행 - + Icon 아이콘 @@ -3460,12 +3976,14 @@ QObject - + + Article loading error 사전항목 로딩 오류 - + + Article decoding error 사전항목 디코딩 오류 @@ -3576,18 +4094,18 @@ ResourceToSaveHandler - - + + ERROR: %1 오류: %1 - + Resource saving error: 리소스 저장 오류: - + The referenced resource failed to download. 참조할 리소스를 다운로드하지 못했습니다. @@ -3595,12 +4113,12 @@ Romaji - + Hepburn Romaji for Hiragana 히가라나의 햅번식 로마자 표기법 - + Hepburn Romaji for Katakana 가타가나 햅번식 로마자 표기법 @@ -3621,59 +4139,59 @@ - + Back 뒤로 - + Forward 앞으로 - + Pronounce Word (Alt+S) 발음 듣기(Alt+S) - + Alt+S Alt+S - + Send word to main window (Alt+W) 단어를 메인창으로 보냅니다(Alt+W) - + Alt+W Alt+W - + Shows or hides the dictionary bar 사전도구상자를 보이거나 숨깁니다 - + Use this to pin down the window so it would stay on screen, could be resized or managed in other ways. 핀 아이콘을 선택하면 창을 항상 화면 맨 위에 표시하고, 팝업창 크기, 사전모음의 위치 등을 조절할 수 있습니다. - - - - - + + + + + ... ... - - + + %1 - %2 %1 - %2 @@ -3681,17 +4199,17 @@ SoundDirsModel - + Path 경로 - + Name 이름 - + Icon 아이콘 @@ -3699,45 +4217,47 @@ Sources - + Text to Speech 음성 합성 - + (not available in portable version) (포터블 버전에서는 설정할 수 없습니다) - - - + + + Choose a directory 폴더 선택 - - - - - + + + + + + Confirm removal 삭제 확인 - - + + Remove directory <b>%1</b> from the list? <b>%1</b>폴더를 목록에서 삭제하시겠습니까? - - + + + Remove site <b>%1</b> from the list? <b>%1</b>사이트를 목록에서 삭제하시겠습니까? - + Remove program <b>%1</b> from the list? 프로그램 <b>%1</b>을 목록에서 삭제하시겠습니까? @@ -3756,7 +4276,8 @@ - + + &Add... 추가...(&A) @@ -3765,7 +4286,8 @@ - + + &Remove 제거(&R) @@ -3835,7 +4357,7 @@ 또 다른 방법으로 CP1251코드에는 %GD1251%, ISO 8859-1코드에는 %GDISO1%를 대신 쓸 수 있습니다. - + Programs 프로그램 @@ -3844,12 +4366,12 @@ 외부 프로그램. 문자열 %GDWORD%는 검색어로 대체되어 표준 입력으로 전달됩니다. - + Forvo Forvo - + Live pronunciations from <a href="http://www.forvo.com/">forvo.com</a>. The site allows people to record and share word pronunciations. You can listen to them from GoldenDict. <a href="http://www.forvo.com/">forvo.com</a>에서 라이브 음성 듣기. 이 사이트에서는 누구나 자기 목소리로 세계 각 언어의 단어들을 녹음하고 공유할 수 있는 기능을 제공하고 있으며. 그것들을 골든딕에서 연결하여 들을 수 있습니다. @@ -3857,17 +4379,17 @@ - + Enable pronunciations from Forvo Forvo에서 발음 듣기 사용 - + API Key: API 키: - + Use of Forvo currently requires an API key. Leave this field blank to use the default key, which may become unavailable in the future, or register on the site to get your own key. @@ -3876,7 +4398,7 @@ 개인키를 얻으려면 사이트에 등록하십시오. - + Get your own key <a href="http://api.forvo.com/key/">here</a>, or leave blank to use the default one. 별도의 개인키를 <a href="http://api.forvo.com/key/">여기</a>서 얻거나, 비워두고 기본키를 사용하십시오. @@ -3907,79 +4429,89 @@ GBK와 GB18030 → %GDGBK%, Shift-JIS → %GDSHIFTJIS% + + DICT servers + DICT 서버 + + + DICT servers: + DICT 서버: + + + Any external programs. A string %GDWORD% will be replaced with the query word. If such string is not presented, the word will be fed into standard input. 외부 프로그램. 문자열 %GDWORD%는 검색어로 대체됩니다. 그런 문자열이 제시되지 않으면 단어는 표준 입력으로 전달됩니다. - + Language codes (comma-separated): 언어코드 (콤마로 구분): - + List of language codes you would like to have. Example: "en, ru". 사용할 언어코드 목록. 예: "en, ru". - + Full list of language codes is available <a href="http://www.forvo.com/languages-codes/">here</a>. 언어코드의 전체목록은 <a href="http://www.forvo.com/languages-codes/">여기</a>서 얻을 수 있습니다. - + Transliteration 문자변환 - + Russian transliteration 러시아어 문자변환 - + Greek transliteration 그리스어 문자변환 - + German transliteration 독일어 문자변환 - + Belarusian transliteration 벨라루스어 문자변환 - + Enables to use the Latin alphabet to write the Japanese language 알파벳으로 일본어를 입력할 수 있게 합니다 - + Japanese Romaji 일본어 로마자 입력 - + Systems: 로마자 표기법: - + The most widely used method of transcription of Japanese, based on English phonology 가장 널리 사용되는 일본어 로마자 표기방법으로서, 영어 음성학을 기초로 하고 있습니다 - + Hepburn 헵번식 - + The most regular system, having a one-to-one relation to the kana writing systems. Standardized as ISO 3602 @@ -3990,12 +4522,12 @@ 골든딕에는 아직 도입되어 있지 않습니다. - + Nihon-shiki 일본식 - + Based on Nihon-shiki system, but modified for modern standard Japanese. Standardized as ISO 3602 @@ -4006,32 +4538,32 @@ 골든딕에는 아직 도입되어 있지 않습니다. - + Kunrei-shiki 훈령식 - + Syllabaries: 문자표: - + Hiragana Japanese syllabary 히라가나 일본어 문자표 - + Hiragana 히라가나 - + Katakana Japanese syllabary 가타가나 일본어 문자표 - + Katakana 가타가나 @@ -4171,22 +4703,22 @@ WebSitesModel - + Enabled 활성 - + Name 이름 - + Address 주소 - + Icon 아이콘 @@ -4194,7 +4726,7 @@ WordFinder - + Failed to query some dictionaries. 일부 사전의 검색에 실패했습니다. diff -Nru goldendict-1.5.0~git20131003/locale/lt_LT.ts goldendict-1.5.0~git20150923/locale/lt_LT.ts --- goldendict-1.5.0~git20131003/locale/lt_LT.ts 2013-10-02 20:42:04.000000000 +0000 +++ goldendict-1.5.0~git20150923/locale/lt_LT.ts 2015-09-23 08:26:24.000000000 +0000 @@ -2,13 +2,6 @@ - - - XML parse error: %1 at %2,%3 - Ошибка обработки XML: %1 на строке %2, столбце %3 - - - About @@ -49,7 +42,7 @@ [Nežinoma] - + Based on Qt %1 (%2, %3 bit) Naudoja Qt %1 (%2, %3 bitų) @@ -57,62 +50,62 @@ ArticleMaker - + Expand article Išplėsti - + Collapse article Suskleisti - + No translation for <b>%1</b> was found in group <b>%2</b>. <b>%1</b> vertimas nerastas grupėje <b>%2</b>. - + No translation was found in group <b>%1</b>. Gupėje <b>%1</b> vertimų nerasta. - + Welcome! Jus sveikina GoldenDict! - + <h3 align="center">Welcome to <b>GoldenDict</b>!</h3><p>To start working with the program, first visit <b>Edit|Dictionaries</b> to add some directory paths where to search for the dictionary files, set up various Wikipedia sites or other sources, adjust dictionary order or create dictionary groups.<p>And then you're ready to look up your words! You can do that in this window by using a pane to the left, or you can <a href="Working with popup">look up words from other active applications</a>. <p>To customize program, check out the available preferences at <b>Edit|Preferences</b>. All settings there have tooltips, be sure to read them if you are in doubt about anything.<p>Should you need further help, have any questions, suggestions or just wonder what the others think, you are welcome at the program's <a href="http://goldendict.org/forum/">forum</a>.<p>Check program's <a href="http://goldendict.org/">website</a> for the updates. <p>(c) 2008-2013 Konstantin Isakov. Licensed under GPLv3 or later. <h3 align="center">Jus sveikina <b>GoldenDict</b>!</h3><p>Dirbti žodynu pradėkite spausdami <b>Taisa > Žodynai</b> – nurodysite kelius, kur ieškoti žodynų failų, nurodysite įvairias Vikipedijos svetaines ar kitus šaltinius, pasirinksite žodynų tvarką arba kursite žodynų grupes.<p>Po to jau galėsite ieškoti žodžių! Versti žodžius galite tiek GoldenDict programos pagrindiniame lange, tiek <a href="Iškylantys langai">kitose veikiančiose programose</a>. <p>Programą galite derinti per meniu <b>Taisa > Nuostatos</b>. Visos nuostatos turi paaiškinimus - jie pravers, jei abejosite, ar nežinosite.<p>Jei reikia daugiau pagalbos, turite klausimų, pasiūlymų ar tiesiog norite sužinoti kitų nuomonę, apsilankykite programos <a href="http://goldendict.org/forum/">diskusijų puslapyje</a>.<p>Programos atnaujinimų ieškokite <a href="http://goldendict.org/">GoldenDict svetainėje</a>. <p>(c) 2008-2013 Konstantin Isakov. GPLv3 arba vėlesnė licencija. - + Working with popup Iškylantys langai - + <h3 align="center">Working with the popup</h3>To look up words from other active applications, you would need to first activate the <i>"Scan popup functionality"</i> in <b>Preferences</b>, and then enable it at any time either by triggering the 'Popup' icon above, or by clicking the tray icon down below with your right mouse button and choosing so in the menu you've popped. <h3 align="center">Iškylantys langai</h3>Norėdami žodžių ieškoti kitose veikiančiose programose, pirmiausia turite <b>Nuostatose</b> įgalinti <i>„iškylančius langus“</i>, o po to bet kada spragtelėti „iškylančių langų“ ženkliuką viršuje arba spustelėti sistemos dėklo ženkliuką dešiniu pelės klavišu ir pasirinkti atitinkamą meniu įrašą. - + Then just stop the cursor over the word you want to look up in another application, and a window would pop up which would describe it to you. Tuomet kokioje nors programoje užveskite žymeklį ties norimu ieškoti žodžiu – netrukus pasirodys iškylantis langas su pasirinkto žodžio apibūdinimu. - + Then just select any word you want to look up in another application by your mouse (double-click it or swipe it with mouse with the button pressed), and a window would pop up which would describe the word to you. Tuomet kokioje nors programoje tiesiog pele pažymėkite bet kokį norimą žodį (dukart jį spragtelėkite arba braukite jį nuspaudę pelės klavišą) – netrukus pasirodys iškylantis langas su pasirinkto žodžio apibūdinimu. - + (untitled) (bevardis) - + (picture) (paveikslėlis) @@ -120,37 +113,37 @@ ArticleRequest - + Expand article Išplėsti - + From - + Collapse article Suskleisti - + Query error: %1 Užklausos klaida: %1 - + Close words: Panašūs žodžiai: - + Compound expressions: Žodžių junginiai: - + Individual words: Pavieniai žodžiai: @@ -158,47 +151,47 @@ ArticleView - + Select Current Article Dabartinio straipsnio pasirinkimas - + Copy as text Kopijuoti kaip tekstą - + Inspect Tyrinėti - + Resource Šaltinis - + Audio Garsas - + TTS Voice TTS balsas - + Picture Paveikslėlis - + Definition from dictionary "%1": %2 „%1“ žodyne esantis apibrėžimas: %2 - + Definition: %1 Apibrėžimas: %1 @@ -207,99 +200,100 @@ GoldenDict - - + + The referenced resource doesn't exist. Nurodyto šaltinio nėra. - + The referenced audio program doesn't exist. Nėra nurodytos garso programos. - + + ERROR: %1 Klaida: %1 - + Save sound Įrašyti garsą - + Sound files (*.wav *.ogg *.mp3 *.mp4 *.aac *.flac *.mid *.wv *.ape);;All files (*.*) Garsai (*.wav *.ogg *.mp3 *.mp4 *.aac *.flac *.mid *.wv *.ape);;Visos rinkmenos (*.*) - + Save image Įrašyti paveikslą - + Image files (*.bmp *.jpg *.png *.tif);;All files (*.*) Paveikslai (*.bmp *.jpg *.png *.tif);;Visi failai (*.*) - + &Open Link &Atverti nuorodą - + Video Vaizdo klipas - + Video: %1 Vaizdo klipas: %1 - + Open Link in New &Tab Atverti nuorodą naujoje &kortelėje - + Open Link in &External Browser Atv&erti nuorodą naršyklėje - + &Look up "%1" &Ieškoti „%1“ - + Look up "%1" in &New Tab Ieškoti „%1“ &naujoje kortelėje - + Send "%1" to input line „%1“ siųsti į įvedimo eilutę - - + + &Add "%1" to history žodį „%1“ į&traukti į žurnalą - + Look up "%1" in %2 Ieškoti „%1“ grupėje %2 - + Look up "%1" in %2 in &New Tab Ieškoti „%1“ grupėje %2 &naujoje kortelėje - + WARNING: FFmpeg Audio Player: %1 Įspėjimas: FFmpeg garso grutuvė: %1 @@ -320,37 +314,37 @@ „Bass“ biblioteka negali groti šio garso. - + Failed to run a player to play sound file: %1 Nepavyko paleisti grotuvo garso failui atkurti: %1 - + Failed to create temporary file. Nepavyko sukurti laikinojo failo. - + Failed to auto-open resource file, try opening manually: %1. Nepavyko automatiškai atverti šaltinio failo, mėginkite rankiniu būdu: %1. - + The referenced resource failed to download. Nepavyko parsiųsti nurodytų šaltinių. - + Save &image... Įrašti pa&veikslą... - + Save s&ound... Įrašyti g&arsą... - + WARNING: %1 ĮSPĖJIMAS: %1 @@ -360,42 +354,44 @@ Forma - + about:blank tuščias - + x x - + Find: Ieškoti: - + + &Previous &Ankstesnis - + + &Next &Tolesnis - + Ctrl+G Vald+G - + &Case Sensitive &Skirti raidžių dydį - + Highlight &all &Viską pažymėti @@ -420,6 +416,29 @@ + Dialog + + + Proxy authentication required + Reikia prisijungti per įgaliotąjį serverį + + + + You need to supply a Username and a Password to access via proxy + Norėdami naudotis įgaliotuoju serveriu, įveskite naudotojo vardą ir slaptažodį + + + + Username: + Naudotojo vardas: + + + + Password: + Slaptažodis: + + + DictGroupWidget @@ -520,6 +539,119 @@ + DictHeadwords + + + Search mode + Paieškos veiksena + + + + This element determines how filter string will be interpreted + Šis elementas nurodo, kaip bus interpretuojama atrankos užklausa + + + + If checked on the symbols case will be take in account when filtering + Jei pažymėta, atrenkant bus atsižvelgiama į raidžių lygį + + + + Match case + Skirti raidžių registrą + + + + Exports headwords to file + Antraštinius žodžius eksportuoti į failą + + + + Export + Eksportuoti + + + + Help + + + + + OK + Gerai + + + + Press this button to apply filter to headwords list + Norėdami atrinkti antraštinius žodžius pagal atrankos filtrą, paspauskite šį mygtuką + + + + Apply + Pritaikyti + + + + If checked any filter changes will we immediately applied to headwords list + Jei pažymėta, pakeitus atrankos tekstą iš karto atrinkti antraštinius žodžius + + + + Auto apply + Atrinkti rašant + + + + Filter: + Atranka: + + + + Filter string (fixed string, wildcards or regular expression) + Tekstas, pagal kurį norite atrinkti antraštinius žodžius (tikslus tekstas, pakaitos simboliai, reguliarusis reiškinys) + + + + Text + Tekstas + + + + Wildcards + Pakaitos simboliai + + + + RegExp + Reguliarusis reiškinys + + + + Unique headwords total: %1, filtered: %2 + Iš viso nesikartojančių antraštinių žodžių: %1; atrinkta: %2 + + + + Save headwords to file + Antraštinių žodžių įrašymas į failą + + + + Text files (*.txt);;All files (*.*) + Tekstiniai failai (*.txt);;Visi failai (*.*) + + + + Export headwords... + Antraštinių žodžių eksportavimas... + + + + Cancel + Atšaukti + + + DictInfo @@ -562,6 +694,16 @@ Aprašas: + + Show all unique dictionary headwords + Rodyti visus nesikartojančius žodyno antraštinius žodžius + + + + Headwords + Antraštiniai žodžiai + + Edit the dictionary via command: %1 @@ -578,6 +720,76 @@ + DictServer + + + Url: + Url: + + + + Databases: + Duombazės: + + + + Search strategies: + Paieškos strategijos: + + + + Server databases + + + + + DictServersModel + + + Enabled + Įgalinta + + + + Name + Vardas + + + + Address + Adresas + + + + Databases + Duombazės + + + + Strategies + Strategijos + + + + Icon + Ženkliukas + + + + Comma-delimited list of databases +(empty string or "*" matches all databases) + Duombazes atskirkite kableliais +(tuščias įrašas ir * atitinka visas duomenų bazes) + + + + Comma-delimited list of search strategies +(empty string mean "prefix" strategy) + Paieškos strategijas atskirkite kableliais +(tuščias įrašas atitinka priešdėlio („prefix“) strategiją) + + + DictionaryBar Dictionary Bar @@ -599,17 +811,22 @@ Keisti šią grupę - + Dictionary info Informacija apie žodyną - + + Dictionary headwords + Žodyno antraštiniai žodžiai + + + Open dictionary folder Atverti žodyno aplanką - + Edit dictionary Keisti žodyną @@ -617,39 +834,39 @@ EditDictionaries - + &Sources &Šaltiniai - - + + &Dictionaries &Žodynai - - + + &Groups &Grupės - + Sources changed Šaltiniai pasikeitė - + Some sources were changed. Would you like to accept the changes? Kai kurie šaltiniai pasikeitė. Priimti pakeitimus? - + Accept Priimti - + Cancel Atšaukti @@ -668,6 +885,92 @@ + FTS::FtsIndexing + + + None + Nieko + + + + FTS::FullTextSearchDialog + + + Full-text search + Visatekstė paieška + + + + Whole words + Ištisi žodžiai + + + + Plain text + Grynasis tekstas + + + + Wildcards + Pakaitos simboliai + + + + RegExp + Reguliar. reiškinys + + + + Max distance between words (%1-%2): + Didžiausias atstumas tarp žodžių (%1-%2): + + + + Max articles per dictionary (%1-%2): + Straipsnelių riba vienam žodynui (%1-%2): + + + + + + Articles found: + Surasta straipsnelių: + + + + Now indexing: + Darbar indeksuojama: + + + + CJK symbols in search string are not compatible with search modes "Whole words" and "Plain text" + Kinų, japonų ir korėjiečių rašto ženklų paieška nėra suderinama su paieškos veiksenomis „Ištisi žodžiai“ ir „Grynasis tekstas“ + + + + The search line must contains at least one word containing + Paieškos užklausoje įveskite bent vieną žodį, kurį sudarytų bent + + + + or more symbols + simboliai(-ių,-is) + + + + No dictionaries for full-text search + Nėra žodynų, palaikančių paiešką jų straipsnelių turinyje + + + + FTS::Indexing + + + None + Nieko + + + Forvo::ForvoArticleRequest @@ -706,6 +1009,69 @@ + FullTextSearchDialog + + + + Search + Paieška + + + + Match case + Skirti raidžių registrą + + + + Mode: + Veiksena: + + + + Articles found: + Surasta straipsneliuose: + + + + Available dictionaries in group: + Prieinamos žodynų grupės: + + + + Wait for indexing: + Indeksavimo eilėje: + + + + Help + + + + Non-indexable: + Neindeksuojami: + + + + Total: + Iš viso: + + + + Indexed: + Suindeksuoti: + + + + Now indexing: None + Dabar indeksuojama: nieko + + + + Cancel + Atšaukti + + + GermanTranslit @@ -745,43 +1111,53 @@ Groups - + + Group tabs + Grupės kortelės + + + + Open groups list + Atverti grupių sąrašą + + + Add group Pridėti grupę - + Give a name for the new group: Pavadinkite naująją grupę: - + Rename group Pervadinti grupę - + Give a new name for the group: Naujas grupės pavadinimas: - + Remove group Pašalinti grupę - + Are you sure you want to remove the group <b>%1</b>? Tikrai norite pašalinti <b>%1</b> grupę? - + Remove all groups Pašalinti visas grupes - + Are you sure you want to remove all the groups? Tikrai norite pašalinti visas grupes? @@ -882,6 +1258,54 @@ + Help::HelpWindow + + + GoldenDict help + + + + + Home + + + + + Back + Atgal + + + + Forward + Pirmyn + + + + Zoom In + Padidinti + + + + Zoom Out + Sumažinti + + + + Normal Size + Įprastas dydis + + + + Content + + + + + Index + + + + HistoryPaneWidget @@ -912,12 +1336,12 @@ Hunspell - + Spelling suggestions: Rašybos spėjimas: - + %1 Morphology %1 (morfologija) @@ -925,12 +1349,12 @@ HunspellDictsModel - + Enabled Įgalinta - + Name Pavadinimas @@ -1970,7 +2394,7 @@ LoadDictionaries - + Error loading dictionaries Žodynų įkelti nepavyko @@ -1978,7 +2402,7 @@ Main - + Error in configuration file. Continue with default settings? Klaida konfgūracijoje. Tęsti naudojant numatytąsias nuostatas? @@ -1990,78 +2414,85 @@ Navigacija - + Back Atgal - + Forward Pirmyn - + Scan Popup Iškylantis langas - + Show &Main Window Rodyti &pagrindinį langą - - + + &Quit &Baigti - + Loading... Įkeliama... - + + String to search in dictionaries. The wildcards '*', '?' and sets of symbols '[...]' are allowed. +To find '*', '?', '[', ']' symbols use '\*', '\?', '\[', '\]' respectively + Žodynuose ieškomas tekstas. Galite naudoti pakaitos simbolius „*“, „?“ ir simbolių rinkinį „[...]“. +Norėdami rasti „*“, „?“, „[“, „]“ simbolius, atitinkamai įveskite „\*“, „\?“, „\[“, „\]“ + + + Skip This Release Praleisti šią versiją - + You have chosen to hide a menubar. Use %1 to show it back. Jūs paslepiate meniu juostą. Norėdami ją vėl matyti, spauskite %1. - + Ctrl+M Vald+M - + Page Setup Puslapio parinktys - + No printer is available. Please install one first. Nera jokio spausdintuvo. Įdiekite kokį nors. - + Print Article Spausdinti straipsnį - + Article, Complete (*.html) Visas straipsnis (*.html) - + Article, HTML Only (*.html) Straipsnis, tik HTML (*.html) - + Save Article As Įrašyti straipsnį kaip @@ -2070,44 +2501,44 @@ Html rikmenos (*.html *.htm) - + Error Klaida - + Can't save article: %1 Nepavyksta įrašyti straipsnio: %1 - + %1 dictionaries, %2 articles, %3 words Žodynų: %1, straipsnių: %2, žodžių: %3 - + Failed to initialize hotkeys monitoring mechanism.<br>Make sure your XServer has RECORD extension turned on. Nepavyko paruošti sparčiųjų klavišų stebėjimo mechanizmo<br>Įsitikinkite, kad XServer turi įjungtą RECORD plėtinį. - + New Release Available Yra nauja versija - + Version <b>%1</b> of GoldenDict is now available for download.<br>Click <b>Download</b> to get to the download page. Galite parsisųstiGoldenDict <b>%1</b> versiją.<br> Norėdami atverti parsisiuntimo puslapį, spauskite <b>Parsisiųsti</b>. - + Download Parsisiųsti - - + + Look up in: Ieškoti grupėje: @@ -2120,108 +2551,108 @@ Įrankių juostoje rodyti mažus ženkliukus - + &Menubar &Meniu juosta - + Found in Dictionaries: Rasta žodynuose: - + Pronounce Word (Alt+S) Ištarti žodį (Alt+S) - + Show Names in Dictionary &Bar &Pavadinimai žodynų juostoje - + Show Small Icons in &Toolbars Įran&kių juostoje maži ženkliukai - + &Navigation Pagri&ndiniai mygtukai - + Zoom In Padidinti - + Zoom Out Sumažinti - + Normal Size Įprastas dydis - + Words Zoom In Padidinti žodžius - + Words Zoom Out Sumažinti žodžius - + Words Normal Size Įprastas žodžių dydis - + Close current tab Užverti veikiamąją kortelę - + Close all tabs Užverti visas korteles - + Close all tabs except current Užverti visas korteles, iškyrus veikiamąją - + Look up: Ieškoti: - + All Visi - - + + Accessibility API is not enabled API prieinamumui nėra įgalinta - + Saving article... Įrašomas straipsnis... - + The main window is set to be always on top. Pagrindinis langas visada rodomas virš kitų programų langų. - + Import history from file Įkelti žurnalą iš failo @@ -2230,52 +2661,57 @@ Įkelti iš failo: - + Import error: invalid data in file Klaida įkeliant: failo duomenys netinkami - + History import complete Įkėlimas į žurnalą baigtas - + Import error: Klaida įkeliant: - + Dictionary info Informacija apie žodyną - + + Dictionary headwords + Žodyno antraštiniai žodžiai + + + Open dictionary folder Atverti žodyno aplanką - + Edit dictionary Keisti žodyną - + Opened tabs Atvertos kortelės - + Open Tabs List Atverti kortelių sąrašą - + (untitled) (nepavadinta) - + %1 - %2 %1 - %2 @@ -2284,7 +2720,7 @@ Įspėjimas: %1 - + &Hide &Slėpti @@ -2293,23 +2729,23 @@ Žurnalo rodymas - + Export history to file Žurnalą įrašyti į failą - - + + Text files (*.txt);;All files (*.*) Tekstiniai failai (*.txt);;Visi failai (*.*) - + History export complete Žurnalas įrašytas - + Export error: Eksporto klaida: @@ -2319,22 +2755,22 @@ - + Welcome! Jus sveikina GoldenDict! - + &File &Failas - + &Edit &Taisa - + &Help &Pagalba @@ -2347,12 +2783,12 @@ Žo&dynai... F3 - + &Preferences... &Nuostatos... - + F2 F2 @@ -2361,163 +2797,193 @@ &Grupės... - + &View Ro&dymas - + &Zoom M&astelis - + H&istory Ž&urnalas - + &Dictionaries... Žo&dynai... - + F3 F3 - + &Search Pane &Paieškos polangis - + + Search + Paieška + + + &Results Navigation Pane Ž&odynų polangis - + &History Pane &Žurnalo polangis - + F4 F4 - + &Homepage &Svetainė - + &About &Apie - + About GoldenDict Apie GoldenDict - + + GoldenDict reference + + + + F1 F1 - + Quit from application Užverti programą - + Ctrl+Q Vald+Q - + &Forum &Diskusijos internete - + &Close To Tray Nuleisti &langą - + Minimizes the window to tray Nuleisti į sistemos dėklą - + Ctrl+F4 Vald+F4 - + &Save Article Į&rašyti straipsnį - + Save Article Įrašyti straipsnį - + &Print &Spausdinti - + Ctrl+P Vald+P - + Page Set&up &Puslapio parinktys - + Print Pre&view Spaudinio p&eržiūra - + &Rescan Files Perž&velgti failus - + &New Tab &Nauja kortelė - + &Always on Top &Visada viršuje - + Always on Top Visada viršuje - + Ctrl+O Vald+O - - - + + + Menu Button Meniu mygtukas + + Search in page + Ieškoti puslapyje + + + + Ctrl+F + Vald+F + + + + Full-text search + Visatekstė paieška + + + + Ctrl+Shift+F + Vald+Lyg2+F + + Print Preview Spaudinio peržiūra @@ -2526,48 +2992,48 @@ Peržvelgti failus - + Ctrl+F5 Vald+F5 - + &Clear Iš&valyti - + New Tab Nauja kortelė - + Ctrl+T Vald+T - + &Configuration Folder &Nuostatų aplankas - - + + &Show Ro&dyti - + Ctrl+H Vald+H - + &Export Į&rašyti - + &Import Į&kelti @@ -2579,12 +3045,12 @@ Mdx::MdxArticleRequest - + Dictionary file was tampered or corrupted Žodyno failas sugadintas - + Failed loading article from %1, reason: %2 Nepavyko įkelti straipsnio iš %1 dėl to, kad %2 @@ -2592,7 +3058,7 @@ MediaWiki::MediaWikiArticleRequest - + XML parse error: %1 at %2,%3 XML nagrinėjimo klaida: %1 ties %2,%3 @@ -2600,7 +3066,7 @@ MediaWiki::MediaWikiWordSearchRequest - + XML parse error: %1 at %2,%3 XML nagrinėjimo klaida: %1 ties %2,%3 @@ -2608,22 +3074,22 @@ MediaWikisModel - + Enabled Įgalinta - + Name Pavadinimas - + Address Adresas - + Icon Ženkliukas @@ -2636,88 +3102,94 @@ Forma - + Dictionary order: Žodynų tvarka: - - - - ... - ... + ... - + Inactive (disabled) dictionaries: Nenaudojami (uždrausti) žodynai: - + Dictionary information Žodyno informacija - + Name: Pavadinimas: - + Total articles: Iš viso straipsnių: - + Total words: Iš viso žodžių: - + Translates from: Verčia iš: - + Translates to: Verčia į: - + Description: Aprašas: - + Files comprising this dictionary: Žodyną sudarantys failai: - + Adjust the order by dragging and dropping items in it. Drop dictionaries to the inactive group to disable their use. Žodynų tvarką pakeisite tiesiog juos tempdami. Norėdami uždrausti žodyną, tiesiog nutempkite jį į neaktyviųjų grupę. - + Sort by name Rikiuoti pagal pavadinimą - + Sort by languages Rikiuoti pagal kalbą + + + Dictionary headwords + Žodyno antraštiniai žodžiai + + + + Dictionaries active: %1, inactive: %2 + + PathsModel - + Path Kelias - + Recursive Rekursinis @@ -2875,24 +3347,29 @@ Papildomas stilius: - + + Help language + + + + Adjust this value to avoid huge context menus. Šią reikšmę keiskite tam, kad išvengtumėte didelių kontekstinių meniu. - + Context menu dictionaries limit: Žodynų kiekio riba kontekstiniame meniu: - + Chooses whether the scan popup mode is on by default or not. If checked, the program would always start with the scan popup active. Nurodykite, ar ši iškylančių langų funkcija yra numatytoji. Jei pažymėta, iškylančių langų funkcija bus įjungta vos paleistoje programoje. - + Normally, in order to activate a popup you have to maintain the chosen keys pressed while you select a word. With this enabled, the chosen keys may also @@ -2903,27 +3380,27 @@ praėjus trupučiui laiko po to, kai baigėte žymėti. - + Hotkeys Spartieji klavišai - + Use the following hotkey to show or hide the main window: Nuspaudus spartųjį klavišą parodyti ar paslėpti pagrindinį langą: - + Use the following hotkey to translate a word from clipboard: Nuspaudus spartųjį klavišą išversti iškarpinės turinį: - + The hotkeys are global and work from any program and within any context as long as GoldenDict is running in background. Spartieji klavišai yra bendri sitemai ir veikia dirbant bet kuria programa, bet kokioje aplinkoje, kol fone paleistas GoldenDict žodynas. - + &Scan Popup &Iškylantis langas @@ -2933,7 +3410,7 @@ GoldenDict paleisti kartu su naudotojo darbalaukiu sistemos paleidimo metu. - + When enabled, a translation popup window would be shown each time you point your mouse on any word on the screen (Windows) or select any word with mouse (Linux). When enabled, you can switch it on and @@ -2944,7 +3421,7 @@ pagrindiniame lange arba nuspaudę ženkliuką sistemos dėkle. - + Enable scan popup functionality Įgalinti iškylančius langus @@ -2954,159 +3431,194 @@ Nurodykite, ar iškylančių langų funkcija bus įjungta vos paleistoje programoje. - + Start with scan popup turned on Paleisti su įjungta iškylančių langų funkcija - + With this enabled, the popup would only show up if all chosen keys are in the pressed state when the word selection changes. Jei įgalinta, langas su vertimu iškils tik nuspaudus visus nurodytus klavišus po to, kai pasikeis pažymėtas žodis. - + Only show popup when all selected keys are kept pressed: Iškylantis langas pasirodys tik nuspaudus visus šiuos klavišus: - + Left Ctrl only Tik kairysis Vald - + Left Ctrl Kairysis Vald - + Right Shift only Tik dešinysis Lyg2 - + Right Shift Dešinysis Lyg2 - + Alt key Alt klavišas - + Alt Alt - + Ctrl key Vald klavišas - + Ctrl Vald - + Left Alt only Tik kairysis Alt - + Left Alt Kairysis Alt - + Shift key Lyg2 klavišas - + Shift Lyg2 - + Right Alt only Tik dešinysis Alt - + Right Alt Dešinysis Alt - + Right Ctrl only Tik dešinysis Vald - + Right Ctrl Dešin. Vald - + Left Shift only Tik kairysis Lyg2 - + Left Shift Kairysis Lyg2 - + Windows key or Meta key Windows arba Meta klavišas - + Win/Meta Win arba Meta - + Send translated word to main window instead of to show it in popup window Žodžio vertimas pagrindiniame lange, o ne iškylančiame lange - + Send translated word to main window Perduoti į pagrindinį langą - + Playback Grojimas - + Play audio files via FFmpeg(libav) and libao Garsus leisti per FFmpeg(libav) ir libao - + Use internal player Naudoti vidinę grotuvę - + + System proxy + Sistemos įgaliotasis serveris + + + + Custom proxy + Savitas įgaliotasis serveris + + + + Custom settings + Savitos nuostatos + + + + Full-text search + Visatekstė paieška + + + + Allow full-text search for: + Leisti ieškoti šių žodynų straipsneliuose: + + + + Don't search in dictionaries containing more than + Neieškoti, jei žodyne yra virš + + + + articles (0 - unlimited) + straipsnelių(-io) (0 = neriboti) + + + Select this option to automatic collapse big articles Automatiškai suskleisti didelius straipsnius - + Collapse articles more than Suskleisti straipsnis didesnius nei - + Articles longer than this size will be collapsed Suskleisti straipsnis, kurių dydis viršija @@ -3115,7 +3627,7 @@ Suskleisti straipsnis, kurių dydis viršija - + symbols simboliai @@ -3150,39 +3662,39 @@ Garsą leisti per „Bass“ biblioteką - + Use any external program to play audio files Naudoti bet kokią išorinę programą garso failų grojimui - + Use external program: Naudoti išorinę programą: - + Some sites detect GoldenDict via HTTP headers and block the requests. Enable this option to workaround the problem. Kai kurios svetainės aptinka GoldenDict pagal HTTP antraštę ir dėl to blokuoja užklausas. Ši parinktis leidžia apeiti problemą. - + Do not identify GoldenDict in HTTP headers HTTP antraštėse neidentifikuoti GoldenDict - + Ad&vanced Su&dėtingesni - + ScanPopup extra technologies Ypatingos iškylančių langų technologijos - + Try to use IAccessibleEx technology to retrieve word under cursor. This technology works only with some programs that support it (for example Internet Explorer 9). @@ -3193,12 +3705,12 @@ Nereikia šios parinkties rinktis, jei tokių programų nenaudojate. - + Use &IAccessibleEx Naudoti „&IAccessibleEx“ - + Try to use UI Automation technology to retrieve word under cursor. This technology works only with some programs that support it. It is not needed to select this option if you don't use such programs. @@ -3207,12 +3719,12 @@ Nereikia šios parinkties rinktis, jei tokių programų nenaudojate. - + Use &UIAutomation Naudoti „&UIAutomation“ - + Try to use special GoldenDict message to retrieve word under cursor. This technology works only with some programs that support it. It is not needed to select this option if you don't use such programs. @@ -3221,62 +3733,62 @@ Nereikia šios parinkties rinktis, jei tokių programų nenaudojate. - + Use &GoldenDict message Naudoti „&GoldenDict message“ - + History Žurnalas - + Turn this option on to store history of the translated words Įgalinkite, jei norite įsiminti verčiamus žodžius - + Store &history Įsi&minti verstus žodžius - + Specify the maximum number of entries to keep in history. Nurodykite didžiausią leistiną žurnalo įrašų kiekį. - + Maximum history size: Žurnalo įrašų didžiausias kiekis: - + History saving interval. If set to 0 history will be saved only during exit. Žurnalo įrašymo dažnumas. 0 reiškia įrašymą tik užveriant programą. - + Save every Įrašyti kas - + minutes min - + Articles Straipsneliai - + Turn this option on to always expand optional parts of articles Įgalinkite, jei norite visada matyti visas straipsnelio dalis - + Expand optional &parts Išplėsti papildomas &dalis @@ -3290,12 +3802,12 @@ praėjus trupučiui laiko po to, kai baigėte žymėti. - + Keys may also be pressed afterwards, within Klavišai gali būti paspausti per - + To avoid false positives, the keys are only monitored after the selection's done for a limited amount of seconds, which is specified here. @@ -3304,12 +3816,12 @@ baigimo žymėti. Laiką nurodykie čia. - + secs s - + <!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; } @@ -3322,22 +3834,22 @@ <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" color:#ff0000;">Pastaba: regis naudojate X.Org XServerio versiją, kurios RECORD plėtinys yra sugadintas. Spartieji klavišai GoldenDict programai greičiausiai neveiks. Tai pirmiausia turėų būti ištaisyta pačiame Xserveryje. Žiūrėkite pranešimą apie </span><a href="https://bugs.freedesktop.org/show_bug.cgi?id=20500"><span style=" text-decoration: underline; color:#0000ff;">ydą</span></a><span style=" color:#ff0000;"> bei, jei norite, palikite savo komentarą .</span></p></body></html> - + &Audio &Garsas - + Pronunciation Tarimas - + Auto-pronounce words in main window Automatiškai ištarti pagrindinio lango žodžius - + Auto-pronounce words in scan popup Automatiškai ištarti iškylančio lango žodžius @@ -3346,61 +3858,61 @@ Garso rinkmenas groti su programa: - + &Network &Tinklas - + Enable if you wish to use a proxy server for all program's network requests. Įgalinkite, jei norite programos visoms tinklo užklausoms naudoti įgaliotąjį serverį. - + Use proxy server Naudoti įgaliotąjį serverį - + Type: Tipas: - + Host: Serveris: - + Port: Prievadas: - + User: Naudotojo vardas: - + Password: Slaptažodis: - + Enabling this would make GoldenDict block most advertisements by disallowing content (images, frames) not originating from the site you are browsing. If some site breaks because of this, try disabling this. Įgalinus šią parinktį, GoldenDict blokuos didžiąją dalį reklamos, neleisdama turinio (paveikslėlių, kadrų) esančio iš kito šaltinio, nei jūsų naršomas puslapis. Jei kuri svetainė neveiks su šia parinktimi, ją išjunkite. - + Disallow loading content from other sites (hides most advertisements) Neleisti įkelti turinio iš kitų svetainių (dažniausiai reklamos) - + Enabling this would allow to listen to sound pronunciations from online dictionaries that rely on Flash or other web plugins. Plugin must be installed for this option to work. @@ -3409,12 +3921,12 @@ saityno papildinį. Norint, kad parinktis veiktų, turi būti įdiegtas papildinys. - + Enable web plugins Įgalinti saityno papildinius - + When this is enabled, the program periodically checks if a new, updated version of GoldenDict is available for download. If it is so, the program @@ -3427,12 +3939,12 @@ - + Check for new program releases periodically Periodiškai tikrinti, ar yra naujų programos versijų - + System default Sistemoje numatyta @@ -3445,32 +3957,33 @@ Rusų - + + Default Numatytasis - + Modern Šiuolaikinis - + Lingvo Lingvo - + Babylon Babylon - + Lingoes Lingoes - + Lingoes-Blue Lingoes mėlynas @@ -3479,12 +3992,12 @@ Groti per DirectShow - + Changing Language Kalbos keitimas - + Restart the program to apply the language change. Naująją kalbą programa naudos po to, kai ją atversite iš naujo. @@ -3492,27 +4005,27 @@ ProgramTypeEditor - + Audio Garsas - + Plain Text Paprastas tekstas - + Html Html - + Prefix Match Priešdėlio atitikimas - + Unknown Nežinoma @@ -3538,27 +4051,27 @@ ProgramsModel - + Enabled Įgalinta - + Type Tipas - + Name Pavadinimas - + Command Line Komandinė eilutė - + Icon Ženkliukas @@ -3566,12 +4079,14 @@ QObject - + + Article loading error Straipsnio įkėlimo klaida - + + Article decoding error Straipsnio dekodavimo klaida @@ -3682,18 +4197,18 @@ ResourceToSaveHandler - - + + ERROR: %1 Klaida: %1 - + Resource saving error: Šaltinių įrašymo klaida: - + The referenced resource failed to download. Nepavyko parsiųsti nurodytų šaltinių. @@ -3701,12 +4216,12 @@ Romaji - + Hepburn Romaji for Hiragana Hepburn Romaji (Hiragana) - + Hepburn Romaji for Katakana Hepburn Romaji (Katakana) @@ -3731,12 +4246,12 @@ žodis - + Back Atgal - + Forward Pirmyn @@ -3749,43 +4264,43 @@ Alt+M - + Pronounce Word (Alt+S) Ištarti žodį (Alt+S) - + Alt+S Alt+S - + Send word to main window (Alt+W) Perduoti į pagrindinį langą (Alt+W) - + Alt+W Alt+W - + Shows or hides the dictionary bar Parodo arba paslepia žodynų juostelę - + Use this to pin down the window so it would stay on screen, could be resized or managed in other ways. Naudokite, jei norite pritvirtinti šį langą. Tuomet jis nepradigs patrukus pelę, galėsite keisti lango dydį ar atlikti kitus įprastus langų tvarkymo veiksmus. - - - - - + + + + + ... ... @@ -3794,8 +4309,8 @@ GoldenDict - - + + %1 - %2 %1 - %2 @@ -3803,17 +4318,17 @@ SoundDirsModel - + Path Kelias - + Name Pavadinimas - + Icon Ženkliukas @@ -3821,45 +4336,47 @@ Sources - + Text to Speech Balso sintezavimas - + (not available in portable version) (neprieinama perkeliamoje versijoje) - - - + + + Choose a directory Pasirinkite aplanką - - - - - + + + + + + Confirm removal Šalinimo patvirtinimas - - + + Remove directory <b>%1</b> from the list? Aplanką <b>%1</b> pašalinti iš sąrašo? - - + + + Remove site <b>%1</b> from the list? Svetainę <b>%1</b> pašalinti iš sąrašo? - + Remove program <b>%1</b> from the list? Programą <b>%1</b> pašalinti iš sąrašo? @@ -3878,7 +4395,8 @@ - + + &Add... Pri&dėti... @@ -3887,7 +4405,8 @@ - + + &Remove &Pašalinti @@ -3955,7 +4474,7 @@ Taip pat galite naudoti %GD1251% (CP1251koduotei) arba %GDISO1% (ISO 8859-1 koduotei). - + Programs Programos @@ -3964,27 +4483,27 @@ Bet kokia išorinė programa. Norėdami perduoti užklausos žodį, rašykite %GDWORD%. Žodis taip pat perduodamas į standartinę įvedimą. - + Forvo Forvo - + Live pronunciations from <a href="http://www.forvo.com/">forvo.com</a>. The site allows people to record and share word pronunciations. You can listen to them from GoldenDict. Gyvų žmonių tarimas iš <a href="http://www.forvo.com/">forvo.com</a>. Šioje svetainėje asmenims siūloma įrašyti žodžių tarimą ir pasidalinti juo. GoldenDict leidžia pasinaudoti šiais ištekliais. - + Enable pronunciations from Forvo Įgalinti tarimą pagal Forvo - + API Key: API raktas - + Use of Forvo currently requires an API key. Leave this field blank to use the default key, which may become unavailable in the future, or register on the site to get your own key. @@ -3993,7 +4512,7 @@ Deja, ateityje numatytasis raktas gali nebegalioti, tad siūlome užsiregistruoti ir įrašyti nuosavą raktą. - + Get your own key <a href="http://api.forvo.com/key/">here</a>, or leave blank to use the default one. Savo asmeninį raktą gausite <a href="http://api.forvo.com/key/">čia</a>. Norėdami naudoti numatytąjį, palikite laukelį tuščią. @@ -4023,79 +4542,89 @@ %GDBIG5% – Big-5, %GDBIG5HKSCS% – Big5-HKSCS, %GDGBK% – GBK ir GB18030, %GDSHIFTJIS% – Shift-JIS. + + DICT servers + DICT serveriai + + + DICT servers: + DICT serveriai: + + + Any external programs. A string %GDWORD% will be replaced with the query word. If such string is not presented, the word will be fed into standard input. Bet kokia išoriinė programa. „%GDWORD%“ eilutė (be kabučių) bus pakeista į užklausos žodį. Jei šios eilutės nebus, žodis bus perduotas į standartinį įvedimą. - + Language codes (comma-separated): Kalbų kodai (atskirti kableliais): - + List of language codes you would like to have. Example: "en, ru". Norimų kalbų kodai. Pavyzdžiui: „en, ru, lt“. - + Full list of language codes is available <a href="http://www.forvo.com/languages-codes/">here</a>. Visas kalbų kodų sąrašas pateiktas <a href="http://www.forvo.com/languages-codes/">čia</a>. - + Transliteration Transliteracija - + Russian transliteration Transliteracija (rusų) - + Greek transliteration Transliteracija (graikų) - + German transliteration Transliteracija (vokiečių) - + Belarusian transliteration Transliteracija (baltarusių) - + Enables to use the Latin alphabet to write the Japanese language Įgalinti rašymą japonų kalba naudojant lotynišką abėcėlę - + Japanese Romaji Romaji (japonų) - + Systems: Sistemos: - + The most widely used method of transcription of Japanese, based on English phonology Dažniausiai naudojamas būdas japonų kalbai transkribuoti anglų kalbos fonologijos pagrindu - + Hepburn Hepburn - + The most regular system, having a one-to-one relation to the kana writing systems. Standardized as ISO 3602 @@ -4106,12 +4635,12 @@ Dar neįtraukta į GoldenDict. - + Nihon-shiki Nihon-shiki - + Based on Nihon-shiki system, but modified for modern standard Japanese. Standardized as ISO 3602 @@ -4122,32 +4651,32 @@ Dar įtraukta į GoldenDict. - + Kunrei-shiki Kunrei-shiki - + Syllabaries: Skiemenų abėcėlė: - + Hiragana Japanese syllabary Japonų skiemenenų abėcėlė Hiragana - + Hiragana Hiragana - + Katakana Japanese syllabary Japonų skiemenenų abėcėlė Katakana - + Katakana Katakana @@ -4292,22 +4821,22 @@ WebSitesModel - + Enabled Įgalinta - + Name Pavadinimas - + Address Adresas - + Icon Ženkliukas @@ -4315,7 +4844,7 @@ WordFinder - + Failed to query some dictionaries. Kai kurių žodynų nepavyko užklausti. diff -Nru goldendict-1.5.0~git20131003/locale/mk_MK.ts goldendict-1.5.0~git20150923/locale/mk_MK.ts --- goldendict-1.5.0~git20131003/locale/mk_MK.ts 1970-01-01 00:00:00.000000000 +0000 +++ goldendict-1.5.0~git20150923/locale/mk_MK.ts 2015-09-23 08:26:24.000000000 +0000 @@ -0,0 +1,4785 @@ + + + + + About + + + About + За програмот + + + + GoldenDict dictionary lookup program, version + Речник GoldenDict, издание + + + + (c) 2008-2013 Konstantin Isakov (ikm@goldendict.org) + © Константин Исаков (ikm@goldendict.org), 2008-2011 {2008-2013 ?} + + + + Credits: + Заслуги: + + + + Licensed under GNU GPLv3 or later + Лиценца: GNU GPLv3 или понова + + + + [Unknown] + [Непознато] + + + + Based on Qt %1 (%2, %3 bit) + На база на Qt %1 (%2, %3 бита) + + + + ArticleMaker + + + Expand article + Откриј ја статијата + + + + Collapse article + Соберија статијата + + + + No translation for <b>%1</b> was found in group <b>%2</b>. + Нема превод <b>%1</b> пронајден во групата <b>%2</b>. + + + + No translation was found in group <b>%1</b>. + Нема превод пронајден во групата <b>%1</b> + + + + Welcome! + Добро дојдовте! + + + + <h3 align="center">Welcome to <b>GoldenDict</b>!</h3><p>To start working with the program, first visit <b>Edit|Dictionaries</b> to add some directory paths where to search for the dictionary files, set up various Wikipedia sites or other sources, adjust dictionary order or create dictionary groups.<p>And then you're ready to look up your words! You can do that in this window by using a pane to the left, or you can <a href="Working with popup">look up words from other active applications</a>. <p>To customize program, check out the available preferences at <b>Edit|Preferences</b>. All settings there have tooltips, be sure to read them if you are in doubt about anything.<p>Should you need further help, have any questions, suggestions or just wonder what the others think, you are welcome at the program's <a href="http://goldendict.org/forum/">forum</a>.<p>Check program's <a href="http://goldendict.org/">website</a> for the updates. <p>(c) 2008-2013 Konstantin Isakov. Licensed under GPLv3 or later. + <h3 align="center">Добро дојдовте во <b>GoldenDict</b>!</h3><p>Ако за прв пат го стартирате овој програм, одредете ја патеката до речникот во <b>Уреди|Речник</b>. Тука можете да наведете разни сајтови на Википедија или други извори на податоци, наместите го редоследот на речниците или направете речник.<p>по тоа, можете да почнете да барате зборови. Зборовите можат да се најдат во левото окно на прозорецот. Кога работите во други апликации, можете да барате зборови, користејќи <a href="Работа со скокачки прозорец">скокачкиот прозор</a>. <p>во изборникот <b>Уреди|Поставки</b>.Можете да ја наместите апликацијата по свој вкус. Сите параметри се наговестувања кои се прикажуваат кога преминувате преку нив. Обратете внимание на нив, кога имате проблеми со конфигурацијата.<p>Ако ви е потребна помош,било какви прашања, барања, итн, погледајте<a href="http://goldendict.org/forum/"> Форум на програмот</a>.<p>Ажурирање софтвер достапно на <a href="http://goldendict.org/">веб сајту</a>.<p>© Константин Исаков (ikm@goldendict.org), 2008-2011. Лиценца: GNU GPLv3 или понова. + + + + Working with popup + Работа со скан попап + + + + <h3 align="center">Working with the popup</h3>To look up words from other active applications, you would need to first activate the <i>"Scan popup functionality"</i> in <b>Preferences</b>, and then enable it at any time either by triggering the 'Popup' icon above, or by clicking the tray icon down below with your right mouse button and choosing so in the menu you've popped. + <h3 align="center">Скокачки прозорец</h3>За да пројдете зборови од друга апликација, потребно е да вклучите <i>«Овозможи скокачки прозор»</i> у <b>Поставке</b> и након тога омогућити искачуће дугме «Прегледај» у главном прозору или у пливајућем изборнику на икони у системској палети. + + + + Then just stop the cursor over the word you want to look up in another application, and a window would pop up which would describe it to you. + Користећи сајт Forvo захтева кључ API. Оставите +ово поље празно, да бисте користили подразумевани кључ, који +не може да ради у будућности, или се пријавите на +сајт, да бисте добили свој кључ. + + + + Then just select any word you want to look up in another application by your mouse (double-click it or swipe it with mouse with the button pressed), and a window would pop up which would describe the word to you. + Користите интерфејс IAccessibleEx да тражи речи под курсором. +Ова технологија ради само са програмима који га подржавају +(например Internet Explorer 9). +Ако не користите такве програме не треба да укључи ову опцију. + + + + (untitled) + (без име) + + + + (picture) + (слика) + + + + ArticleRequest + + + Expand article + &Меморирај ја оваа статија + + + + From + Од: + + + + Collapse article + Соберија ја статијата + + + + Query error: %1 + грешка во Прашање : %1 + + + + Close words: + Затвори зборови: + + + + Compound expressions: + Сложени изрази: + + + + Individual words: + Поединечни зборови: + + + + ArticleView + + + Resource + Извори на промени + + + + Audio + Аудио + + + + Definition: %1 + Дефиниција: %1 + + + GoldenDict + GoldenDict + + + + Select Current Article + Одберете тековна статија + + + + Copy as text + Копирај како текст + + + + Inspect + Прегледај + + + + TTS Voice + TTS глас + + + + Picture + Слика + + + + Video + Видео + + + + Video: %1 + Видео: %1 + + + + Definition from dictionary "%1": %2 + Дефиниција од речник "%1": %2 + + + + + The referenced resource doesn't exist. + Бараниот ресурс не е пронајден. + + + + The referenced audio program doesn't exist. + Бараниот аудио програм не е пронајден. + + + + + ERROR: %1 + ГРЕШКА: %1 + + + + &Open Link + &Отвори врска(линк) + + + + Open Link in New &Tab + Отворете ја оваа врска во нова &картичка + + + + Open Link in &External Browser + Отвори ја врската во надворешен &прегледувач + + + + Save &image... + Сочувај &слику... + + + + Save s&ound... + Сочувај з&вук... + + + + &Look up "%1" + &Побарај "%1" + + + + Look up "%1" in &New Tab + Побарај «%1» во &нова картичка + + + + Send "%1" to input line + Испрати "%1" во ред за внос + + + + + &Add "%1" to history + &Додади "%1" во историја + + + + Look up "%1" in %2 + Побарај «%1» во %2 + + + + Look up "%1" in %2 in &New Tab + Побарај «%1» во %2 во &нова картичка + + + + Save sound + Сочувај звук + + + + Sound files (*.wav *.ogg *.mp3 *.mp4 *.aac *.flac *.mid *.wv *.ape);;All files (*.*) + Звучни датотеки (*.wav *.ogg *.mp3 *.mp4 *.aac *.flac *.mid *.wv *.ape);;Сите датотеки (*.*) + + + + Save image + Сочувај слика + + + + Image files (*.bmp *.jpg *.png *.tif);;All files (*.*) + Слики датотеки (*.bmp *.jpg *.png *.tif);;Сите датотеке (*.*) + + + + WARNING: FFmpeg Audio Player: %1 + ВНИМАНИЕ: FFmpeg Audio Player: %1 + + + Playing a non-WAV file + Репродукуј не WAV датотеку + + + To enable playback of files different than WAV, please go to Edit|Preferences, choose the Audio tab and select "Play via DirectShow" there. + Да бисте омогућили могућност да репродукујете датотеке типа, различитих од WAV, посетите Уреди|Поставке, изаберите картицу Аудио, а затим изаберите "излаз звука преко DirectShow". + + + + Failed to run a player to play sound file: %1 + Не е можно да се пушти аудио датотека: %1 + + + + Failed to create temporary file. + Неуспешно креирање привремена датотека. + + + + Failed to auto-open resource file, try opening manually: %1. + Грешка при отворање датотека ресурс , пробајте рачно да отворите: %1. + + + + The referenced resource failed to download. + Не е можно вчитување на поврзани ресурси. + + + + WARNING: %1 + ПРЕДУПРЕДУВАЊЕ: %1 + + + + Form + Form + + + + about:blank + about:blank + + + + x + x + + + + Find: + Побарај: + + + + + &Previous + &Претходен + + + + + &Next + &Следен + + + + Ctrl+G + Ctrl+G + + + + &Case Sensitive + &Мали и големи букви + + + + Highlight &all + Нагласи &се + + + + BelarusianTranslit + + + Belarusian transliteration from latin to cyrillic (classic orthography) + Белоруска транслитерација од латиница на кирилица (класичен правопис) + + + + Belarusian transliteration from latin to cyrillic (school orthography) + Белоруска транслитерација са латинице на ћирилицу (школски правопис) + + + + Belarusian transliteration (smoothes out the difference +between classic and school orthography in cyrillic) + Белоруска транслитерација (изједначава разлике +између класичних и школског правописа на ћирилици) + + + + Dialog + + + Proxy authentication required + + + + + You need to supply a Username and a Password to access via proxy + + + + + Username: + + + + + Password: + Лозинка: + + + + DictGroupWidget + + + Form + Form + + + + Group icon: + Икона на група: + + + + Shortcut: + Брз пристап: + + + + None + Ништо + + + + From file... + Од датотека... + + + + Choose a file to use as group icon + Одберете датотека за користење како икона на група + + + + Images + Слики + + + + All files + Сите датотеки + + + + Error + Грешка + + + + Can't read the specified image file. + Не може да се чита одабраната слика + + + + DictGroupsWidget + + + + + + Dictionaries: + Речници: + + + + Confirmation + Потврда + + + + Are you sure you want to generate a set of groups based on language pairs? + Да ли сте сигурни дека сакате да креирате сет на групи на основа на јазични парови? + + + + Unassigned + Недоделено + + + + Combine groups by source language to "%1->" + Комбинирајте групи од изворниот јазик во "%1->" + + + + Combine groups by target language to "->%1" + Комбинирајте групи од целниот јазик во "->%1" + + + + Make two-side translate group "%1-%2-%1" + Направете двострана група за преведување "%1-%2-%1" + + + + + Combine groups with "%1" + Комбинирајте група со "%1" + + + + DictHeadwords + + + Search mode + + + + + This element determines how filter string will be interpreted + + + + + If checked on the symbols case will be take in account when filtering + + + + + Match case + + + + + Exports headwords to file + + + + + Export + + + + + Help + + + + + OK + + + + + Press this button to apply filter to headwords list + + + + + Apply + + + + + If checked any filter changes will we immediately applied to headwords list + + + + + Auto apply + + + + + Filter: + + + + + Filter string (fixed string, wildcards or regular expression) + + + + + Text + + + + + Wildcards + + + + + RegExp + + + + + Unique headwords total: %1, filtered: %2 + + + + + Save headwords to file + + + + + Text files (*.txt);;All files (*.*) + Текстуални датотеки (*.txt);;Сите датотеки (*.*) + + + + Export headwords... + + + + + Cancel + Откажи + + + + DictInfo + + + Total articles: + Вкупно статии: + + + + Translates from: + Изворен јазик: + + + + Total words: + Вкупно зборови: + + + + Translates to: + Преведи на: + + + + Open folder + Отвори папка + + + + Edit dictionary + Уреди речник + + + + Files comprising this dictionary: + Датотеки кои го сочинуваат речникот: + + + + Description: + Опис: + + + + Show all unique dictionary headwords + + + + + Headwords + + + + + Edit the dictionary via command: +%1 + Уредиго речникот преку команда: +%1 + + + + DictListModel + + + %1 entries + %1 влезови + + + + DictServer + + + Url: + + + + + Databases: + + + + + Search strategies: + + + + + Server databases + + + + + DictServersModel + + + Enabled + + + + + Name + + + + + Address + + + + + Databases + + + + + Strategies + + + + + Icon + Икона + + + + Comma-delimited list of databases +(empty string or "*" matches all databases) + + + + + Comma-delimited list of search strategies +(empty string mean "prefix" strategy) + + + + + DictionaryBar + + Dictionary Bar + Картица речника + + + + &Dictionary Bar + &Лента на речникот + + + + Extended menu with all dictionaries... + Проширено мени со сите речници... + + + + Edit this group + Уреди ја оваа група + + + + Dictionary info + Податоци за речникот + + + + Dictionary headwords + + + + + Open dictionary folder + Отвори папка на речникот + + + + Edit dictionary + Уреди речник + + + + EditDictionaries + + + &Sources + &Извори + + + + + &Dictionaries + &Речници + + + + + &Groups + &Групи + + + + Sources changed + Извори сменети + + + + Some sources were changed. Would you like to accept the changes? + Некои извори се изменети. Прифаќаш измени? + + + + Accept + Прифати + + + + Cancel + Откажи + + + + Dictionaries + Речници + + + + ExternalViewer + + + the viewer program name is empty + Надворешен прикажувач - непознат + + + + FTS::FtsIndexing + + + None + + + + + FTS::FullTextSearchDialog + + + Full-text search + + + + + Whole words + + + + + Plain text + + + + + Wildcards + + + + + RegExp + + + + + Max distance between words (%1-%2): + + + + + Max articles per dictionary (%1-%2): + + + + + + + Articles found: + + + + + Now indexing: + + + + + CJK symbols in search string are not compatible with search modes "Whole words" and "Plain text" + + + + + The search line must contains at least one word containing + + + + + or more symbols + + + + + No dictionaries for full-text search + + + + + FTS::Indexing + + + None + + + + + Forvo::ForvoArticleRequest + + + XML parse error: %1 at %2,%3 + Анализа грешке XML: %1 на линији %2, колона %3 + + + + Added %1 + Додато %1 + + + + by + из + + + + Male + Човек + + + + Female + Жена + + + + from + из + + + + Go to Edit|Dictionaries|Sources|Forvo and apply for our own API key to make this error disappear. + Иди на Уреди|Речници|Извори|Forvo и примени на ваш кључ API, да бисте решили овај проблем. + + + + FullTextSearchDialog + + + + Search + + + + + Match case + + + + + Mode: + + + + + Articles found: + + + + + Available dictionaries in group: + + + + + Wait for indexing: + + + + + Total: + + + + + Indexed: + + + + + Now indexing: None + + + + + Cancel + Откажи + + + + Help + + + + + GermanTranslit + + + German Transliteration + Транскрипција (Германски) + + + + GreekTranslit + + + Greek Transliteration + Транскрипција (Грчки) + + + + GroupComboBox + + + Choose a Group (Alt+G) + Одберете група (Alt+G) + + + + GroupSelectorWidget + + + Form + Форма + + + + Look in + Побарај + + + + Groups + + + Group tabs + + + + + Open groups list + + + + + Add group + Додади група + + + + Give a name for the new group: + Внеси име на нова група: + + + + Rename group + Промени име на група + + + + Give a new name for the group: + Внесете ново име на група: + + + + Remove group + Отстрани група + + + + Are you sure you want to remove the group <b>%1</b>? + Сигурно сакате да отстраните група <b>%1</b>? + + + + + Remove all groups + Отрстраните ги сите групи + + + + Are you sure you want to remove all the groups? + Сигурни сте да се отстранат сите групи? + + + + Dictionaries available: + Достапни речници: + + + + Add selected dictionaries to group (Ins) + Додај го одбраните речници во група (Ins) + + + + > + > + + + + Ins + Ins + + + + Remove selected dictionaries from group (Del) + Отстраните ги одбраните речници од група (Del) + + + + < + < + + + + Del + Del + + + + Groups: + Групи: + + + + Tab 2 + Tab 2 + + + + Create new dictionary group + Направи нова групу + + + + &Add group + &Додади група + + + + Create language-based groups + Направи групи на основа на јазични парови + + + + Auto groups + Ауто групи + + + + Rename current dictionary group + Преименувај ја тековната група на речникот + + + + Re&name group + &Преименувај група + + + + Remove current dictionary group + Отстрани тековна група речници + + + + &Remove group + &Отстраните група + + + + Remove all dictionary groups + Отстраните го сите групи речници + + + + Drag&drop dictionaries to and from the groups, move them inside the groups, reorder the groups using your mouse. + Повлечи па Спушти од/во групите , премести ги внатре во групите, промените го редоследот на групите, со помош на глушецот. + + + + Help::HelpWindow + + + GoldenDict help + + + + + Home + + + + + Back + Назад + + + + Forward + Напред + + + + Zoom In + Зумирај + + + + Zoom Out + Одзумирај + + + + Normal Size + Вообичаена големина + + + + Content + + + + + Index + + + + + HistoryPaneWidget + + + &Delete Selected + Избриши го одбраното + + + + Copy Selected + Копирај ги одбраните + + + + History: + Историја: + + + + %1/%2 + %1/%2 + + + + History size: %1 entries out of maximum %2 + Големина на историјата: %1 внос од максимални %2 + + + + Hunspell + + + Spelling suggestions: + Предлози за правопис: + + + + %1 Morphology + %1 (морфологија) + + + + HunspellDictsModel + + + Enabled + Вклучено + + + + Name + Име + + + + Initializing + + + Please wait... + Почекајте... + + + + + Please wait while indexing dictionary + Почекајте додека речникот се индексира + + + + GoldenDict - Initializing + Стартувај го GoldenDict + + + + Dictionary Name + Име на речникот + + + + Language + + + Afar + Афарски + + + + Abkhazian + Абхазија + + + + Avestan + Авестан + + + + Afrikaans + Афрички + + + + Akan + Акански + + + + Amharic + Амхарски + + + + Aragonese + Арагонски + + + + Arabic + Арапски + + + + Assamese + Асамски + + + + Avaric + Аварски + + + + Aymara + Аимаран + + + + Azerbaijani + Азербејџански + + + + Bashkir + Башкирски + + + + Belarusian + Белоруски + + + + Bulgarian + Бугарски + + + + Bihari + Бихарски + + + + Bislama + Бислама + + + + Bambara + Бамана + + + + Bengali + Бенгалски + + + + Tibetan + Тибетански + + + + Breton + Бретонски + + + + Bosnian + Босански + + + + Catalan + Каталонски + + + + Chechen + Чеченски + + + + Chamorro + Чаморо + + + + Corsican + Корсикански + + + + Cree + Кри + + + + Czech + Чешки + + + + Church Slavic + Црквено-словенски + + + + Chuvash + Чувашски + + + + Welsh + Велшки + + + + Danish + Дански + + + + German + Германски + + + + Divehi + Малдиви + + + + Dzongkha + Џонга (Бутан) + + + + Ewe + Еве + + + + Greek + Грчки + + + + English + Англиски + + + + Esperanto + Есперанто + + + + Spanish + Шпански + + + + Estonian + Естонски + + + + Basque + Баскијски + + + + Persian + Персијски + + + + Fulah + Фула + + + + Finnish + Фински + + + + Fijian + Фиџи + + + + Faroese + Фарски + + + + French + Француски + + + + Western Frisian + Фризииски + + + + Irish + Галски (Ирска) + + + + Scottish Gaelic + Галски (Шкотска) + + + + Galician + Галицијски + + + + Guarani + Гварани + + + + Gujarati + Гуџарати + + + + Manx + Манкс + + + + Hausa + Хауса + + + + Hebrew + Јеврејски + + + + Hindi + Хинди + + + + Hiri Motu + Хири-моту + + + + Croatian + Хрватски + + + + Haitian + Хаићански + + + + Hungarian + Мађарски + + + + Armenian + Јерменски + + + + Herero + Ереро + + + + Interlingua + Интерлингва + + + + Indonesian + Индонезијски + + + + Interlingue + Интерлингве + + + + Igbo + Ибо + + + + Sichuan Yi + Сечуан И + + + + Inupiaq + Инупиак + + + + Ido + Идо + + + + Icelandic + Исландски + + + + Italian + Италијански + + + + Inuktitut + Инуктитут + + + + Japanese + Јапански + + + + Javanese + Јаванац + + + + Georgian + Грузијски + + + + Kongo + Конго + + + + Kikuyu + Кикују + + + + Kwanyama + Кваниама + + + + Kazakh + Казак + + + + Kalaallisut + Калаалисут + + + + Khmer + Кмерски + + + + Kannada + Канада + + + + Korean + Корејски + + + + Kanuri + Канури + + + + Kashmiri + Кашмирски + + + + Kurdish + Курдски + + + + Komi + Коми + + + + Cornish + Корнвалски + + + + Kirghiz + Киргизски + + + + Latin + Латински + + + + Luxembourgish + Луксембургшки + + + + Ganda + Ганда + + + + Limburgish + Лимбурзхски + + + + Lingala + Лингала + + + + Lao + Лао + + + + Lithuanian + Литвански + + + + Luba-Katanga + Луба-Катанга + + + + Latvian + Летонски + + + + Malagasy + Мадагаскарац + + + + Marshallese + Маршалски + + + + Maori + Маори + + + + Macedonian + Македонски + + + + Malayalam + Малаиалам + + + + Mongolian + Монголски + + + + Marathi + Марати + + + + Malay + Малајски + + + + Maltese + Малтешки + + + + Burmese + Бурмански + + + + Nauru + Науру + + + + Norwegian Bokmal + Норвешки букмол + + + + North Ndebele + Сев. Ндебеле + + + + Nepali + Непалски + + + + Ndonga + Ндонга + + + + Dutch + Холандски + + + + Norwegian Nynorsk + Норвешки (нинорск) + + + + Norwegian + Норвешки + + + + South Ndebele + Јуж. Ндебеле + + + + Navajo + Навахо + + + + Chichewa + Чичева + + + + Occitan + Французски (диалект Occitan) + + + + Ojibwa + Оджибва + + + + Oromo + Оромо + + + + Oriya + Орија + + + + Ossetian + Осетински + + + + Panjabi + Панџаби + + + + Pali + Пали + + + + Polish + Пољски + + + + Pashto + Пуштунски + + + + Portuguese + Португалски + + + + Quechua + Кечуа + + + + Raeto-Romance + Романшски + + + + Kirundi + Кирунди + + + + Romanian + Румынски + + + + Russian + Руски + + + + Kinyarwanda + Кињаруанда + + + + Sanskrit + Санскрит + + + + Sardinian + Сардинијски + + + + Sindhi + Синдхи + + + + Northern Sami + Северна Сами + + + + Sango + Санго + + + + Serbo-Croatian + Српско-Хрватски + + + + Sinhala + Синхала + + + + Slovak + Словачки + + + + Slovenian + Словеначки + + + + Samoan + Самоа + + + + Shona + Схона + + + + Somali + Сомалиски + + + + Albanian + Албански + + + + Serbian + Српски + + + + Swati + Свати + + + + Southern Sotho + Јуж. Сото + + + + Sundanese + Судански + + + + Swedish + Шведски + + + + Swahili + Суахили + + + + Tamil + Тамилски + + + + Telugu + Телугу + + + + Tajik + Таџикски + + + + Thai + Тајландски + + + + Tigrinya + Тигриња + + + + Turkmen + Туркменски + + + + Tagalog + Тагалог + + + + Tswana + Тсвана + + + + Tonga + Тонга + + + + Turkish + Турски + + + + Tsonga + Тсонга + + + + Tatar + Татарски + + + + Twi + Тви + + + + Tahitian + Тахитиан + + + + Uighur + Ујгурски + + + + Ukrainian + Украјински + + + + Urdu + Урду + + + + Uzbek + Узбекски + + + + Venda + Венда + + + + Vietnamese + Вијетнамски + + + + Volapuk + Волапук + + + + Walloon + Валонски + + + + Wolof + Волоф + + + + Xhosa + Кхоса + + + + Yiddish + Јидиш + + + + Yoruba + Јоруба + + + + Zhuang + Чжуанг + + + + Chinese + Кинески + + + + Zulu + Зулу + + + + Lojban + Lojban + + + + Traditional Chinese + Традиционални кинески + + + + Simplified Chinese + Поједностављени кинески + + + + Other + Остали + + + + Other Simplified Chinese dialects + Остали поједностављеном кинеском дијалекти + + + + Other Traditional Chinese dialects + Остали традиционални кинески дијалекти + + + + Other Eastern-European languages + Остали источно-европски језици + + + + Other Western-European languages + Остали западно-европски језици + + + + Other Russian languages + Остали руски језици + + + + Other Japanese languages + Остали јапански језици + + + + Other Baltic languages + Остали балтички језици + + + + Other Greek languages + Остали грчки језици + + + + Other Korean dialects + Остали корејски дијалекти + + + + Other Turkish dialects + Остали турски дијалекти + + + + Other Thai dialects + Остали тајландски дијалекти + + + + Tamazight + Tamazight + + + + LoadDictionaries + + + Error loading dictionaries + Грешка при вчитување на статијата + + + + Main + + + Error in configuration file. Continue with default settings? + Грешка во поставката на датотеката. Да продолжиме со претпоставени нагодувања? + + + + MainWindow + + Navigation + Навигација + + + + Back + Назад + + + + Forward + Напред + + + + Scan Popup + Скан Попап + + + + Show &Main Window + Прикажи &главен прозорец + + + + + &Quit + И&злез + + + + Loading... + Вчитување... + + + + Skip This Release + Прескокни ја оваа верзија + + + + You have chosen to hide a menubar. Use %1 to show it back. + Го сокривте главното мени. За да го вратите, користете %1. + + + + Ctrl+M + Ctrl+M + + + + Page Setup + Дотерување/Нагодување на страна + + + + No printer is available. Please install one first. + Нема достапен печатач. Ве молиме, прво инсталирајте го. + + + + Print Article + Печати статија + + + + Article, Complete (*.html) + Статија, целосна (*.html) + + + + Article, HTML Only (*.html) + Статија, само HTML (*.html) + + + + Save Article As + Сочувај ја оваа статија како + + + Html files (*.html *.htm) + Датотека Html (*.html *.htm) + + + + Error + Грешка + + + + Can't save article: %1 + Не е возможно да се сочува статијата: %1 + + + + %1 dictionaries, %2 articles, %3 words + Речник: %1, статии: %2, зборови: %3 + + + + Failed to initialize hotkeys monitoring mechanism.<br>Make sure your XServer has RECORD extension turned on. + Неуспешна иницијализација на механизмот за надгледување на кратенките(на таст.).<br>Проверете дали вашиот XServer подржува RECORD EXtension. + + + + New Release Available + Достапна е нова верзија + + + + Version <b>%1</b> of GoldenDict is now available for download.<br>Click <b>Download</b> to get to the download page. + Издание <b>%1</b> на програмот GoldenDict е достапно за преземање.<br> +Притисни <b>Преземи</b>, за премин на страна за преземање. + + + + Download + Преземање + + + + + Look up in: + Побарај во: + + + Show Names in Dictionary Bar + Прикажи име у картици речника + + + Show Small Icons in Toolbars + Прикажи мале иконе на траци са алаткама + + + + &Menubar + + + + + Found in Dictionaries: + Најдено во речниците: + + + + Pronounce Word (Alt+S) + Изговори збор (Alt+S) + + + + Show Names in Dictionary &Bar + Прикажи називи во картичките &Лентата на речникот + + + + Show Small Icons in &Toolbars + Прикажи мала икона во &алатникот + + + + &Navigation + &Навигација + + + + Zoom In + Зумирај + + + + Zoom Out + Одзумирај + + + + Normal Size + Вообичаена големина + + + + Words Zoom In + Зборови Зумирај + + + + Words Zoom Out + Зборови Одзумирај + + + + Words Normal Size + Вообичаена големина на букви + + + + Close current tab + Затвори ја тековната картичка + + + + Close all tabs + Затвори ги сите картички + + + + Close all tabs except current + Затворите ги сите картички освен тековната + + + + + Accessibility API is not enabled + Достапност API не е овозможен + + + + String to search in dictionaries. The wildcards '*', '?' and sets of symbols '[...]' are allowed. +To find '*', '?', '[', ']' symbols use '\*', '\?', '\[', '\]' respectively + + + + + Look up: + Побарај: + + + + All + Се + + + + Saving article... + Меморирање статија... + + + + The main window is set to be always on top. + Главнен прозорев е поставен секогаш да е најгоре. + + + + &Hide + &Сокри + + + + Export history to file + Извоз на историја во датотека + + + + + Text files (*.txt);;All files (*.*) + Текстуални датотеки (*.txt);;Сите датотеки (*.*) + + + + History export complete + Извоз на историјата е завршен + + + + Export error: + Извоз грешка: + + + + Import history from file + Увоз на историја од датотека + + + + Import error: invalid data in file + Увоз грешка: неважечки податоци во датотека + + + + History import complete + Увоз на историјата е завршен + + + + Import error: + Грешка при увоз: + + + + Dictionary info + Податоци за речникот + + + + Dictionary headwords + + + + + Open dictionary folder + Отвори папка на речник + + + + Edit dictionary + Уреди речник + + + + Opened tabs + Отворени картички + + + + Open Tabs List + Отвори листа на картички + + + + (untitled) + (неименуван) + + + + %1 - %2 + %1 - %2 + + + WARNING: %1 + Пажња: %1 + + + GoldenDict + GoldenDict + + + + + Welcome! + Добро дојдовте! + + + + &File + &Датотека + + + + &Edit + &Уреди + + + + &Help + &Помош + + + &Dictionaries... F3 + &Речници... F3 + + + + &Preferences... + &Поставки... + + + + F2 + F2 + + + + &View + &Приказ + + + + &Zoom + &Зголеми + + + + H&istory + &Историја + + + Results Navigation Pane + Окно навигације за резуктате + + + + Search + + + + + &Search Pane + &Пребарај окно + + + + &Results Navigation Pane + &Резултати окно за навигација + + + + &History Pane + &Окно историја + + + + &Dictionaries... + &Речници... + + + + F3 + F3 + + + + F4 + F4 + + + + &Homepage + &Почетна страна + + + + &About + &За програмот + + + + About GoldenDict + За GoldenDict + + + + GoldenDict reference + + + + + F1 + F1 + + + + Quit from application + Затвори апликација + + + + Ctrl+Q + Ctrl+Q + + + + &Forum + &Форум + + + + &Close To Tray + &Затвори во палета(треј) + + + + Minimizes the window to tray + Смали прозорец во палета + + + + Ctrl+F4 + Ctrl+F4 + + + + &Save Article + &Сочувај статија + + + + Save Article + Сочувајте статија + + + + &Print + &Печати + + + + Ctrl+P + Ctrl+P + + + + Page Set&up + П&оставки на страна + + + + Print Pre&view + Преглед пред п&ечатење + + + + &Rescan Files + &Повторно сканирај датотеки + + + + &New Tab + &Нова картичка(таб) + + + + + &Show + &Прикажи + + + + Ctrl+H + Ctrl+H + + + + &Export + &Извоз + + + + &Import + &Увоз + + + + &Always on Top + &Секога најгоре + + + + Always on Top + Секогаш најгоре + + + + Ctrl+O + Ctrl+O + + + + + + Menu Button + Копче на менито + + + + Search in page + + + + + Ctrl+F + + + + + Full-text search + + + + + Ctrl+Shift+F + + + + Print Preview + Преглед пре штампања + + + Rescan Files + Поново прегледа датотеке + + + + Ctrl+F5 + Ctrl+F5 + + + + &Clear + О&чисти + + + + New Tab + Нова картичка + + + + Ctrl+T + Ctrl+T + + + + &Configuration Folder + Папка за нагодувања + + + Search Pane + Окно претраге + + + + Mdx::MdxArticleRequest + + + Dictionary file was tampered or corrupted + Речник датотека је покварен или оштећен + + + + Failed loading article from %1, reason: %2 + Неуспешно учитавање чланка из %1, разлог: %2 + + + + MediaWiki::MediaWikiArticleRequest + + + XML parse error: %1 at %2,%3 + Анализа грешке XML: %1 у %2, колони %3 + + + + MediaWiki::MediaWikiWordSearchRequest + + + XML parse error: %1 at %2,%3 + Анализа грешке XML: %1 у %2, колони %3 + + + + MediaWikisModel + + + Enabled + Укључено + + + + Name + Назив + + + + Address + Адреса + + + + Icon + Икона + + + + OrderAndProps + + + Form + збор + + + + Dictionary order: + Редослед речника: + + + ... + ... + + + + Inactive (disabled) dictionaries: + Неактиван (онемогућени) речници: + + + + Dictionary information + Информације о речнику + + + + Name: + Назив: + + + + Total articles: + Укупно чланака: + + + + Total words: + Укупно речи: + + + + Translates from: + Изворни језик: + + + + Translates to: + Циљни језик: + + + + Description: + Опис: + + + + Files comprising this dictionary: + Датотеке које чине речник: + + + + Adjust the order by dragging and dropping items in it. Drop dictionaries to the inactive group to disable their use. + Промена редоследа речника, превлачењем миша. Да бисте онемогућили речник превуците га на дно неактивне групе. + + + + Sort by name + Разврстај по имену + + + + Sort by languages + Разврстај по језицима + + + + Dictionary headwords + + + + + Dictionaries active: %1, inactive: %2 + + + + + PathsModel + + + Path + Патека + + + + Recursive + Рекурзивно + + + + Preferences + + + Preferences + Поставки + + + + &Interface + &Интерфејс + + + + Tabbed browsing + Прегледување со помош на картички + + + + Normally, opening a new tab switches to it immediately. +With this on however, new tabs will be opened without +switching to them. + Обично када отворате нова картичка, преминете на неа +веднаш. Меѓутоа, кога оваа опција е овозможена, новата картичка ќе се +отвори, без нивно преминување. + + + + Open new tabs in background + Отворање нова картичка во позадина + + + + With this on, new tabs are opened just after the +current, active one. Otherwise they are added to +be the last ones. + Ако оваа опција е омоможена, новата картичка ќе биде +отворена веднаш по тековната, во спротивно +се додава на крај. + + + + Open new tabs after the current one + Отворање нова картичка по тековната + + + + When enabled, an icon appears in the sytem tray area which can be used +to open main window and perform other tasks. + Кога е овозможено, икона се појавува во сист.палета која можеда се користи, +да се отвори главен прозорец и да се извршат други задачи. + + + + Enable system tray icon + Прикажи икона во системската палета + + + + With this on, the application starts directly to system tray without showing +its main window. + Када е омозможена оваа опцију, апликацијата ќе работи во систем. палета +без приказ на главниот прозорец. + + + + Start to system tray + Стартувај во системската палета + + + + With this on, an attempt to close main window would hide it instead of closing +the application. + Кога оваа опција е вклучена, обид за затварање на главниот прозорец само ќе го скрие +во системската палета. + + + + Close to system tray + Затвори во системска палета + + + + Startup + Стартување + + + + Start with system + Стартувај со системот + + + + Interface language: + Јазик на интерфејсот: + + + + Display style: + Стил на Приказ: + + + + Double-click translates the word clicked + Преведи го одбраниот збор со двоен клик + + + + Chooses whether the scan popup mode is on by default or not. If checked, +the program would always start with the scan popup active. + Вклучи или не вклучи попап прозорец кога програмот стартува. + + + + Normally, in order to activate a popup you have to +maintain the chosen keys pressed while you select +a word. With this enabled, the chosen keys may also +be pressed shortly after the selection is done. + Можда је боље овако: +Обично искакање прозора активира се само ако су изабрани +тастери притиснути док бирате реч. Ако је ова опција укључена, +одабрани тастери могу да се притисну и текст је истакнут. + Во нормална состојба, за да активирате 'попап' +прозорец, мора да го држите одбраниот тастер во процесот +на истакнувањето на зборот. Међутоа, ако го користите овој режим, тастерот +може да се притисне одредено време после +тоа, како зборот би се издвоил. + + + + Hotkeys + Макро команди + + + + Use the following hotkey to show or hide the main window: + Користете следен макро за прикажување/криење на главниот прозорец: + + + + Use the following hotkey to translate a word from clipboard: + Користете следно макро за преведување зборови од остава: + + + + The hotkeys are global and work from any program and within any context as long as GoldenDict is running in background. + Макро Командите се глобални и работат за секој програм и сите контексти, се додека GoldenDict работи во позадина. + + + + &Scan Popup + &Скан попап + + + + Select this option if you don't want to see the main tab bar when only a single tab is opened. + Овозможите ја оваа опција ако не сакате да гледате лента со картички +а само една картичка е отворена. + + + + Hide single tab + Сокри сингл(една) картичка + + + + Automatically starts GoldenDict after operation system bootup. + Автоматски стартувај го GoldenDict при стартување на оперативниот систем. + + + + Add-on style: + Додаток на стилот: + + + + Normally, pressing ESC key moves focus to the translation line. +With this on however, it will hide the main window. + Во нормален режим на работа, копчето ESC го поместува фокусот на линијта на преводот. +Ако ја овозможите оваа опција, таа ќе го сокрие главниот прозорец. + + + + ESC key hides main window + Сокриј го главниот прозорец со прит. ESC + + + + Turn this option on if you want to select words by single mouse click + Вклучете ја оваа можност ако сакате да одбирете зборови со еден клик на глушецот + + + + Select word by single click + Одберете збор со еден клик + + + + Ctrl-Tab navigates tabs in MRU order + Ctrl-Tab навигација на картичка во MRU редослед + + + + Help language + + + + + Adjust this value to avoid huge context menus. + Дотерајте ја оваа вредност за да одбегнете огромни контекстни менија + + + + Context menu dictionaries limit: + Ограничи контекст мени на речници: + + + + When enabled, a translation popup window would be shown each time +you point your mouse on any word on the screen (Windows) or select +any word with mouse (Linux). When enabled, you can switch it on and +off from main window or tray icon. + Кога е овозможено, попап прозорец на преводот ће се прикаже секогаш +кога покажувате со глушецот на било кој збор на екранот(во Windows) или одберете +било кој збор со глушецот (во Linux). Кога е овозможено, можете да го вклучите и +исклучите од главниот прозорец или иконичката. + + + + Enable scan popup functionality + Овозможи попап функционалност + + + + Start with scan popup turned on + Овозможи попап прозорец при стартување + + + + With this enabled, the popup would only show up if all chosen keys are +in the pressed state when the word selection changes. + Ос ова овозможено, попап би се појавил само ако сите избрани тастери се +во притисната сосојба, кога избраните зборови не менуваат. + + + + Only show popup when all selected keys are kept pressed: + Само покажи попап кога сите одабрани тастери непрекинато се притиснати: + + + + Left Ctrl only + Само лев Ctrl + + + + Left Ctrl + Лев Ctrl + + + + Right Shift only + Само десен Shift + + + + Right Shift + Десен Shift + + + + Alt key + Тастер Alt + + + + Alt + Alt + + + + Ctrl key + Тастер Ctrl + + + + Ctrl + Ctrl + + + + Left Alt only + Само лев Alt + + + + Left Alt + Лев Alt + + + + Shift key + Тастер Shift + + + + Shift + Shift + + + + Right Alt only + Само десен Alt + + + + Right Alt + Десен Alt + + + + Right Ctrl only + Само десен Ctrl + + + + Right Ctrl + Десен Ctrl + + + + Left Shift only + Само лев Shift + + + + Left Shift + Лев Shift + + + + Windows key or Meta key + Тастер Windows или Meta + + + + Win/Meta + Win или Meta + + + + Keys may also be pressed afterwards, within + Копчињата исто така можат да бидат накнадно притиснати, во рамки на + + + + To avoid false positives, the keys are only monitored +after the selection's done for a limited amount of +seconds, which is specified here. + За да се избегнат лажни резултати, копчињата се следат +по селекцијата направена во ограничен број +секунди, кој овде е определен. + + + + secs + секунди + + + + Send translated word to main window instead of to show it in popup window + Пратете го преведениот збор во главниот прозорец наместо да се прикаже во попап прозорецот + + + + Send translated word to main window + Испратите го преведениот збор во главниот прозорец + + + + Play audio files via FFmpeg(libav) and libao + Пушти звучни датотеке преку FFmpeg(libav) и libao + + + + Use internal player + Користи вграден пуштач + + + + System proxy + + + + + Custom proxy + + + + + Custom settings + + + + + Some sites detect GoldenDict via HTTP headers and block the requests. +Enable this option to workaround the problem. + Неки сајтови откривају GoldenDict преко HTTP заглавља и блок захтева. +Омогућите ову могућност да бисте решили тај проблем. + + + + Do not identify GoldenDict in HTTP headers + Немојте да го идентификувате GoldenDict у HTTP заглавја + + + + Full-text search + + + + + Allow full-text search for: + + + + + Don't search in dictionaries containing more than + + + + + articles (0 - unlimited) + + + + + Ad&vanced + Напредно + + + + ScanPopup extra technologies + Додатни методи за одредување на зборот под курсорот + + + + Try to use IAccessibleEx technology to retrieve word under cursor. +This technology works only with some programs that support it + (for example Internet Explorer 9). +It is not needed to select this option if you don't use such programs. + Користите интерфејс IAccessibleEx да тражи речи под курсором. +Ова технологија ради само са програмима који га подржавају +(например Internet Explorer 9). +Ако не користите такве програме не треба да укључи ову опцију. + + + + Use &IAccessibleEx + Користи &IAccessibleEx + + + + Try to use UI Automation technology to retrieve word under cursor. +This technology works only with some programs that support it. +It is not needed to select this option if you don't use such programs. + Користи технологија UI Automation за барање зборови под курсорот. +Оваа технологи работи само со програми кои го подржјуваат. +Ако не користите такви програми не треба да ја вклучувате оваа опција. + + + + Use &UIAutomation + Користи &UIAutomation + + + + Try to use special GoldenDict message to retrieve word under cursor. +This technology works only with some programs that support it. +It is not needed to select this option if you don't use such programs. + Користи специјални GoldenDict пораки за пребарување зборови под покажувачот. +Оваа технологија работи само со програмите, кои ја подржуваат. +Ако не користите такви програми не треба да ја вклучите оваа опциј. + + + + Use &GoldenDict message + Користи барање &GoldenDict + + + + History + Историјат + + + + Turn this option on to store history of the translated words + Вклучете ја оваа могжност за чување историја на преведените зборови + + + + Store &history + Склад на &историјата + + + + Specify the maximum number of entries to keep in history. + Одреди најголем број ставки кои ќе се чуваат во историјата + + + + Maximum history size: + Максимална големина на историјата: + + + + History saving interval. If set to 0 history will be saved only during exit. + Период на чување на историјата. Ако се постави на 0 историјата ќесе чува само додека не излеземе. + + + + Save every + Меморирај на секои + + + + minutes + минути + + + + Articles + Статии + + + + Turn this option on to always expand optional parts of articles + Вклуч. ја оваа можност за секогаш да ги рашири незадолж. делови на стат. + + + + Expand optional &parts + Можност за ширење на &деловите + + + + Select this option to automatic collapse big articles + Одберете ја оваа можност за авт. да се собираат големите статии + + + + Collapse articles more than + Вруши статии поголеми од + + + + Articles longer than this size will be collapsed + Статии подолги од оваа величина ќе бидат срушени + + + + symbols + симболи + + + + <!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:'DejaVu Sans'; font-size:9pt; font-weight:400; font-style:normal;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" color:#ff0000;">Note: You appear to be running an X.Org XServer release which has the RECORD extension broken. Hotkeys in GoldenDict will probably not work. This must be fixed in the server itself. Please refer to the following </span><a href="https://bugs.freedesktop.org/show_bug.cgi?id=20500"><span style=" text-decoration: underline; color:#0000ff;">bug entry</span></a><span style=" color:#ff0000;"> and leave a comment there if you like.</span></p></body></html> + <!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:'DejaVu Sans'; font-size:9pt; font-weight:400; font-style:normal;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" color:#ff0000;">Напомена: Чини се да користите верзију X.Org XServer, у којој не постоји подршка за проширење RECORD. Вероватно пречице GoldenDict не раде. Овај проблем би требало да буде исправљен на страни XServer. За више информација погледајте </span><a href="https://bugs.freedesktop.org/show_bug.cgi?id=20500"><span style=" text-decoration: underline; color:#0000ff;">bug entry</span></a><span style=" color:#ff0000;"> а ако желите, поставите своје коментаре.</span></p></body></html> + + + + &Audio + &Аудио + + + + Pronunciation + Изговор + + + + Auto-pronounce words in main window + Автоматски изговари зборови во главниот прозорец + + + + Auto-pronounce words in scan popup + Автоматски изговори зборови во скокачки прозорец + + + + Playback + Репродукција + + + Use Windows native playback API. Limited to .wav files only, +but works very well. + Коришћење интерних фондова Windows за репродукцију. Подржава +само датотеке типа .wav, али репродукција увек ради добро. + + + Play via Windows native API + Репродукуј унутрашњим ресурсима Windows-а + + + Play audio via Phonon framework. May be somewhat unstable, +but should support most audio file formats. + Репродукуј кроз систем Phonon. Понекад ради нестабилно, +али подржава већину аудио формате. + + + Play via Phonon + Репродукуј преко Phonon + + + + Use any external program to play audio files + Користи некоја надворешна апликација за репродукција на аудио датотеки + + + + Use external program: + Користи надворешен програм: + + + + &Network + &Мрежа + + + + Enable if you wish to use a proxy server +for all program's network requests. + Омозможи ако користите прокси сервер +за сите мрежни побарувања на програмот. + + + + Use proxy server + Користи прокси-сервер + + + + Type: + Тип: + + + + Host: + Сервер: + + + + Port: + Порт: + + + + User: + Корисничко име: + + + + Password: + Лозинка: + + + + Enabling this would make GoldenDict block most advertisements +by disallowing content (images, frames) not originating from the site +you are browsing. If some site breaks because of this, try disabling this. + Оваа опција овозможува GoldenDictда ги блокира повеќето +реклами со оневозможување на одредени садржини (слики, рамки, и т.н.), +кои не произлегуваат од ориг. сајт. Ако некои сајтови се рушат +поради оваа функција, обидете се да ја оневозможите оваа опција. + + + + Disallow loading content from other sites (hides most advertisements) + Оневозможи вчитување садржини од други сајтови (отстранува поголем дел од огласите) + + + + Enabling this would allow to listen to sound pronunciations from +online dictionaries that rely on Flash or other web plugins. +Plugin must be installed for this option to work. + Оваа опција ви омозможува слушање изговор од надвор. +сајтови, кои се потпираат на Flash или други додатоци. +За ова да функционира, додатоците треба да се инсталираат. + + + + Enable web plugins + Омозможи веб додатаци + + + + When this is enabled, the program periodically +checks if a new, updated version of GoldenDict +is available for download. If it is so, the program +informs the user about it and prompts to open a +download page. + Ако е оваа опција е омозможена, програмот, од време на +време ќе провери за најнова верзија +GoldenDict. Ако се појави нова верзија, програмот +ќе извести за тоа и понуди да го преземе +од сајтот. + + + + Check for new program releases periodically + Провери нова верзија + + + + System default + Систем - подразбирано + + + + + Default + Подразбирано + + + + Modern + Модерен + + + + Lingvo + Lingvo + + + + Babylon + Babylon + + + + Lingoes + Lingoes + + + + Lingoes-Blue + Lingoes-Blue + + + Play via DirectShow + Репродукуј преко DirectShow + + + + Changing Language + Промена на јазик + + + + Restart the program to apply the language change. + Поново покрените програм за промену језика. + + + + ProgramTypeEditor + + + Audio + Аудио + + + + Plain Text + Текст + + + + Html + Html + + + + Prefix Match + По префикси + + + + Unknown + Непознато + + + + Programs::RunInstance + + + No program name was given. + Програм није наведен. + + + + The program has crashed. + Програм је завршио са грешком + + + + The program has returned exit code %1. + Програм је вратио излазни код %1. + + + + ProgramsModel + + + Enabled + Вклучено + + + + Type + Тип + + + + Name + Назив + + + + Command Line + Командна линија + + + + Icon + Икона + + + + QObject + + + + Article loading error + Грешка при вчитување статија + + + + + Article decoding error + Грешка декодирања чланка + + + + avformat_alloc_context() failed. + avformat_alloc_context() није успело. + + + + av_malloc() failed. + av_malloc() није успело. + + + + avio_alloc_context() failed. + avio_alloc_context() није успело. + + + + avformat_open_input() failed: %1. + avformat_open_input() није успело: %1. + + + + avformat_find_stream_info() failed: %1. + avformat_find_stream_info() није успело: %1. + + + + Could not find audio stream. + Није могуће пронаћи аудио ток. + + + + Codec [id: %1] not found. + Кодек [id: %1] није пронађен. + + + + avcodec_open2() failed: %1. + avcodec_open2() није успело: %1. + + + + Cannot find usable audio output device. + Не можете да пронађете употребљив уређај за звучни излаз. + + + + Unsupported sample format. + Неподржан је пробни формат. + + + + ao_open_live() failed: + ao_open_live() није успело: + + + + No driver. + Нема управљача. + + + + This driver is not a live output device. + Овај управљач нема активан излазни уређај. + + + + A valid option key has an invalid value. + Важећи избор тастера има неважећу вредност. + + + + Cannot open the device: %1, channels: %2, rate: %3, bits: %4. + Не могу да отворим уређај: %1, канали: %2, мера: %3, бита: %4. + + + + Unknown error. + Непозната грешка. + + + + avcodec_alloc_frame() failed. + avcodec_alloc_frame() није успело. + + + + QuickFilterLine + + + Dictionary search/filter (Ctrl+F) + Речник - претрага/филтер (Ctrl+F) + + + + Quick Search + Брза претрага + + + + Clear Search + Очисти претрагу + + + + ResourceToSaveHandler + + + + ERROR: %1 + ГРЕШКА: %1 + + + + Resource saving error: + Грешка чувања ресурса: + + + + The referenced resource failed to download. + Није могуће учитати повезане ресурсе. + + + + Romaji + + + Hepburn Romaji for Hiragana + Хепберн Ромаји (Хирагана) + + + + Hepburn Romaji for Katakana + Хепберн Ромаји (Катакана) + + + + RussianTranslit + + + Russian Transliteration + Транслитерација (Руски) + + + + ScanPopup + + + Dialog + Дијалог + + + word + реч + + + List Matches (Alt+M) + Списак подударности (Alt+M) + + + Alt+M + Alt+M + + + + Back + Назад + + + + Forward + Напред + + + + Pronounce Word (Alt+S) + Изговори збор (Alt+S) + + + + Alt+S + Alt+S + + + + Send word to main window (Alt+W) + Испрати збор во главен прозорец (Alt+W) + + + + Alt+W + Alt+W + + + + Shows or hides the dictionary bar + Прикажување или скривање лента на речници + + + + Use this to pin down the window so it would stay on screen, +could be resized or managed in other ways. + Кликните за да го усидрите прозорецот на екранот, промените големината +или било која друга особина. + + + + + + + + ... + ... + + + + + %1 - %2 + %1 - %2 + + + + SoundDirsModel + + + Path + Патека + + + + Name + Назив + + + + Icon + Икона + + + + Sources + + + Text to Speech + Текст во говор + + + + (not available in portable version) + (не е достапно во преносна верзија) + + + + + + Choose a directory + Одбери папка + + + + + + + + + Confirm removal + Потврди отстранување + + + + + Remove directory <b>%1</b> from the list? + Отстрани папка <b>%1</b> од список? + + + + + + Remove site <b>%1</b> from the list? + Отстрани веб локација <b>%1</b> од список? + + + + Remove program <b>%1</b> from the list? + Отстрани програм <b>%1</b> ид список? + + + + Files + Датотеки + + + + Paths to search for the dictionary files: + Патека за пребарување датотеки на речникот: + + + + + + + + + &Add... + &Додади... + + + + + + + + + &Remove + &Отстрани + + + + Re&scan now + Пов&торно прегледај + + + + Sound Dirs + Папка со звуци + + + + Make dictionaries from bunches of audiofiles by adding paths here: + Направи речници од куп звучни датотеи со додавање на патека овде: + + + + Morphology + Морфологија + + + + Path to a directory with Hunspell/Myspell dictionaries: + Патека до речник со Hunspell/Myspell речници: + + + + &Change... + &Промени... + + + + Available morphology dictionaries: + Достапни морфолошки речници: + + + + Each morphology dictionary appears as a +separate auxiliary dictionary which +provides stem words for searches and +spelling suggestions for mistyped words. +Add appropriate dictionaries to the bottoms +of the appropriate groups to use them. + Секој морфолошки речник +е посебен помошен речник кој +обезбедува матични зборови за пребар. и +дава предлози за правопис +за грешни зборови. +За користење на речникот +додадите соодветни речници +на крајот на одредени групи. + + + + Websites + Веб-сајтови + + + + Any websites. A string %GDWORD% will be replaced with the query word: + Било кој веб-сајт. Низот %GDWORD% ќе биде заменет со зборот од прашалникот: + + + Alternatively, use %GD1251% for CP1251, %GDISO1% for ISO 8859-1. + Такође је могуће користити %GD1251% за кодирање CP1251, %GDISO1% за ISO 8859-1. + + + + Programs + Програми + + + Any external programs. A string %GDWORD% will be replaced with the query word. The word will also be fed into standard input. + Сваки екстерни програм. Низ %GDWORD% ће бити замењена траженом речју. Иста реч ће бити послата у стандардни улазни ток. + + + + Forvo + Forvo + + + + Live pronunciations from <a href="http://www.forvo.com/">forvo.com</a>. The site allows people to record and share word pronunciations. You can listen to them from GoldenDict. + Уживо изговор са сајта <a href="http://www.forvo.com/">forvo.com</a>. Овај сајт омогућава корисницима да снимају и деле изговорене речи. Можете да их слушам из GoldenDict. + + + + Enable pronunciations from Forvo + Укључи изговор из Forvo + + + + API Key: + Кључ API: + + + + Use of Forvo currently requires an API key. Leave this field +blank to use the default key, which may become unavailable +in the future, or register on the site to get your own key. + Користећи сајт Forvo захтева кључ API. Оставите +ово поље празно, да бисте користили подразумевани кључ, који +не може да ради у будућности, или се пријавите на +сајт, да бисте добили свој кључ. + + + <!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:'DejaVu Sans'; font-size:9pt; font-weight:400; font-style:normal;"> +<table style="-qt-table-type: root; margin-top:4px; margin-bottom:4px; margin-left:4px; margin-right:4px;"> +<tr> +<td style="border: none;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Get your own key <a href="http://api.forvo.com/key/"><span style=" text-decoration: underline; color:#0057ae;">here</span></a>, or leave blank to use the default one.</p></td></tr></table></body></html> + Узмите ваш кључ <a href="http://api.forvo.com/key/">овде</a>, или оставите празно да бисте користили подразумевани кључ. + + + + Alternatively, use %GD1251% for CP1251, %GDISO1%...%GDISO16% for ISO 8859-1...ISO 8859-16 respectively, +%GDBIG5% for Big-5, %GDBIG5HKSCS% for Big5-HKSCS, %GDGBK% for GBK and GB18030, %GDSHIFTJIS% for Shift-JIS. + Алтернативно, користите %GD1251% за CP1251, %GDISO1%...%GDISO16% за ISO 8859-1...ISO 8859-16 односно, +%GDBIG5% за Big-5, %GDBIG5HKSCS% за Big5-HKSCS, %GDGBK% за GBK и GB18030, %GDSHIFTJIS% за Shift-JIS. + + + + DICT servers + + + + + DICT servers: + + + + + Any external programs. A string %GDWORD% will be replaced with the query word. If such string is not presented, the word will be fed into standard input. + Неки спољни програми. Низ %GDWORD% биће замењен речју упита. Ако такав низ није представљен, реч ће се учитати у стандардни улаз. + + + + Get your own key <a href="http://api.forvo.com/key/">here</a>, or leave blank to use the default one. + Снабдете се со свој клуч <a href="http://api.forvo.com/key/">here</a>, или оставете празно за да користите подразбиран. + + + + Language codes (comma-separated): + Листа на јазични кодова (разделени со запирки): + + + + List of language codes you would like to have. Example: "en, ru". + Листа на кодови за јазици кои сакате да ги користите. Пример: "en, ru". + + + + Full list of language codes is available <a href="http://www.forvo.com/languages-codes/">here</a>. + Комплетен список на језичните кодови е достапен <a href="http://www.forvo.com/languages-codes/">овде</a>. + + + + Transliteration + Транслитерација + + + + Russian transliteration + Транслитерација (Руски) + + + + Greek transliteration + Транслитерација (Грчки) + + + + German transliteration + Транслитерација (Немачки) + + + + Belarusian transliteration + Белоруска транслитерација + + + + Enables to use the Latin alphabet to write the Japanese language + Омозможува користење латиница за пишување јапонски + + + + Japanese Romaji + Ромаји (Јапонски) + + + + Systems: + Системи: + + + + The most widely used method of transcription of Japanese, +based on English phonology + Најпопуларен метод за транскрипција на Јапонски е, +заснован на англиска фонологија + + + + Hepburn + Хепберн + + + + The most regular system, having a one-to-one relation to the +kana writing systems. Standardized as ISO 3602 + +Not implemented yet in GoldenDict. + Систем, пренос приказа знакова кана је најтачније. +Стандардизовани у ISO 3602. + +В GoldenDict пока не реализована. + + + + Nihon-shiki + Nihon-shiki + + + + Based on Nihon-shiki system, but modified for modern standard Japanese. +Standardized as ISO 3602 + +Not implemented yet in GoldenDict. + На основу система Nihon-shiki, али модификован за модерне стандарде +савременог јапанског. Стандардизован у ISO 3602. + +В GoldenDict пока не реализована. + + + + Kunrei-shiki + Kunrei-shiki + + + + Syllabaries: + Слоговна азбука: + + + + Hiragana Japanese syllabary + Слоговна азбука "Хирагана" + + + + Hiragana + Хирагана + + + + Katakana Japanese syllabary + Слоговна азбука "Катакана" + + + + Katakana + Катакана + + + + Wikipedia + Написан на руском, извор: ru.wikipedia.org + Википедија + + + + Wikipedia (MediaWiki) sites: + Веб-сајт Википедија (MediaWiki): + + + + StylesComboBox + + + None + Ништа + + + + TextToSpeechSource + + + Selected voice engines: + Изабраи погон на гласот: + + + + &Add + &Додај + + + + &Remove + &Уклони + + + + Preferences + Поставке + + + + Volume: + Величина: + + + + Rate: + Мера: + + + + Preview + Преглед + + + + Available voice engines: + Доступни гласовни погони: + + + + Text to be previewed: + Текст се може погледати: + + + + Type text to be previewed here. + Укуцајте текст да буде прегледан овде. + + + + &Preview + &Преглед + + + + No TTS voice available + Нема доступног TTS гласа + + + + Cannot find available TTS voice.<br>Please make sure that at least one TTS engine installed on your computer already. + Не можете да пронађете доступне TTS гласове.<br>Уверите се да је најмање један TTS погон већ инсталиран на рачунару. + + + + Confirm removal + Потврди уклањање + + + + Remove voice engine <b>%1</b> from the list? + Уклоните гласовну погон <b>%1</b> са списка? + + + + TranslateBox + + + Type a word or phrase to search dictionaries + Напишете збор или фраза за пребарување на речникот + + + + Drop-down + Паѓачки + + + + VoiceEnginesModel + + + Enabled + Вклучено + + + + Name + Ништо + + + + Id + Id + + + + Icon + Икона + + + + WebSitesModel + + + Enabled + Вклучено + + + + Name + Назив + + + + Address + Додадено %1 + + + + Icon + Икона + + + + WordFinder + + + Failed to query some dictionaries. + Прикажи име во картичката на речникот + + + + WordList + + + WARNING: %1 + ПРЕДУПРЕДУВАЊЕ: %1 + + + diff -Nru goldendict-1.5.0~git20131003/locale/nl_NL.ts goldendict-1.5.0~git20150923/locale/nl_NL.ts --- goldendict-1.5.0~git20131003/locale/nl_NL.ts 2013-10-02 20:42:04.000000000 +0000 +++ goldendict-1.5.0~git20150923/locale/nl_NL.ts 2015-09-23 08:26:24.000000000 +0000 @@ -34,7 +34,7 @@ [Onbekend] - + Based on Qt %1 (%2, %3 bit) Gebaseerd op Qt %1 (%2, %3 bit) @@ -42,32 +42,32 @@ ArticleMaker - + Expand article Artikel uitvouwen - + Collapse article Artikel samenvouwen - + No translation for <b>%1</b> was found in group <b>%2</b>. Geen vertaling voor <b>%2</b> gevonden in de groep <b>%1</b>. - + No translation was found in group <b>%1</b>. Geen vertaling gevonden in de groep <b>%1</b>. - + Welcome! Welkom! - + <h3 align="center">Welcome to <b>GoldenDict</b>!</h3><p>To start working with the program, first visit <b>Edit|Dictionaries</b> to add some directory paths where to search for the dictionary files, set up various Wikipedia sites or other sources, adjust dictionary order or create dictionary groups.<p>And then you're ready to look up your words! You can do that in this window by using a pane to the left, or you can <a href="Working with popup">look up words from other active applications</a>. <p>To customize program, check out the available preferences at <b>Edit|Preferences</b>. All settings there have tooltips, be sure to read them if you are in doubt about anything.<p>Should you need further help, have any questions, suggestions or just wonder what the others think, you are welcome at the program's <a href="http://goldendict.org/forum/">forum</a>.<p>Check program's <a href="http://goldendict.org/">website</a> for the updates. <p>(c) 2008-2013 Konstantin Isakov. Licensed under GPLv3 or later. <h3 align="center">Welkom bij <b>GoldenDict</b>!</h3><p>Om met het programma te kunnen werken kiest u eerst <b>Bewerken > Woordenboeken</b>. U kunt vervolgens enkele mappen toevoegen waarin naar woordenboekbestanden wordt gezocht, Wikipedia sites of andere bronnen opgeven, of de woordenboekvolgorde aanpassen en woordenboekgroepen aanmaken.</p> <p>Hierna bent u klaar om woorden op te zoeken met behulp van het deelvenster aan de linkerkant. Bovendien kunt u <a href="Met popups werken">woorden opzoeken vanuit andere programma's</a>. </p> @@ -75,32 +75,32 @@ <p>Hebt u meer hulp nodig, wilt u iets vragen, hebt u suggesties of bent u benieuwd naar de mening van andere gebruikers, bezoek dan het <a href="http://goldendict.org/forum/">forum</a>. Programma updates kunt u vinden op de <a href="http://goldendict.org/">website</a>.<p>(c) 2008-2013 Konstantin Isakov. Gebruiksrecht verleend onder GPLv3 of nieuwer. - + Working with popup Met popups werken - + <h3 align="center">Working with the popup</h3>To look up words from other active applications, you would need to first activate the <i>"Scan popup functionality"</i> in <b>Preferences</b>, and then enable it at any time either by triggering the 'Popup' icon above, or by clicking the tray icon down below with your right mouse button and choosing so in the menu you've popped. <h3 align="center">Met popups werken</h3>Om woorden op te zoeken vanuit andere actieve programma's moet u eerst de <i>'Scan Popup modus'</i> inschakelen onder <b>Instellingen</b>. Daarna kunt u deze functionaliteit op elk moment activeren door middel van het popup pictogram in de werkbalk hierboven of door rechts te klikken op het systeemvakpictogram en in het menu de betreffende optie te kiezen. - + Then just stop the cursor over the word you want to look up in another application, and a window would pop up which would describe it to you. Als u vervolgens in een ander programma met de muisaanwijzer stopt boven een woord dat u wilt opzoeken, dan verschijnt er een venster met een beschrijving van het betreffende woord. - + Then just select any word you want to look up in another application by your mouse (double-click it or swipe it with mouse with the button pressed), and a window would pop up which would describe the word to you. Daarna kunt elk woord dat u wilt opzoeken in een ander programma met de muis selecteren (dubbelklikken of slepend selecteren), waarna een venster verschijnt met de beschrijving van het betreffende woord. - + (untitled) (naamloos) - + (picture) (afbeelding) @@ -108,37 +108,37 @@ ArticleRequest - + Expand article Artikel uitvouwen - + From Uit - + Collapse article Artikel samenvouwen - + Query error: %1 Fout in zoekopdracht: %1 - + Close words: Soortgelijke woorden: - + Compound expressions: Samengestelde treffers: - + Individual words: Individuele woorden: @@ -146,57 +146,57 @@ ArticleView - + Select Current Article Huidig artikel selecteren - + Copy as text Kopiëren als tekst - + Inspect Inspecteren - + Resource Bron - + Audio Geluid - + TTS Voice TTS Stem - + Picture Afbeelding - + Video Video - + Video: %1 Video: %1 - + Definition from dictionary "%1": %2 Definitie uit woordenboek "%1": %2 - + Definition: %1 Definitie: %1 @@ -205,38 +205,39 @@ GoldenDict - - + + The referenced resource doesn't exist. De bron waarnaar wordt verwezen bestaat niet. - + The referenced audio program doesn't exist. Dit programma voor afspelen van geluiden bestaat niet. - + + ERROR: %1 FOUT: %1 - + Save sound Geluid opslaan - + Sound files (*.wav *.ogg *.mp3 *.mp4 *.aac *.flac *.mid *.wv *.ape);;All files (*.*) Geluidsbestanden (*.wav *.ogg *.mp3 *.mp4 *.aac *.flac *.mid *.wv *.ape);;Alle bestanden (*.*) - + Save image Afbeelding opslaan - + Image files (*.bmp *.jpg *.png *.tif);;All files (*.*) Afbeeldingsbestanden (*.bmp *.jpg *.png *.tif);;Alle bestanden (*.*) @@ -245,53 +246,53 @@ Fout bij opslaan bron: - + &Open Link Koppeling &openen - + Open Link in New &Tab Koppeling openen in nieuw&tabblad - + Open Link in &External Browser Koppeling openen in &externe browser - + &Look up "%1" &Zoeken naar "%1" - + Look up "%1" in &New Tab Zoeken naar "%1" in een &nieuw tabblad - + Send "%1" to input line Verzend "%1" naar zoekveld - - + + &Add "%1" to history Voeg "%1" &toe aan geschiedenis - + Look up "%1" in %2 Zoeken naar "%1" in %2 - + Look up "%1" in %2 in &New Tab Zoeken naar "%1" in %2 in een &nieuw tabblad - + WARNING: FFmpeg Audio Player: %1 WAARSCHUWING:FFmpeg audiospeler: %1 @@ -312,37 +313,37 @@ Bass bibliotheek kan dit geluid niet afspelen. - + Failed to run a player to play sound file: %1 Kan geen mediaspeler starten om het geluidsbestand af te spelen: %1 - + Failed to create temporary file. Tijdelijk bestand kan niet worden aangemaakt. - + Failed to auto-open resource file, try opening manually: %1. Kan bronbestand niet automatisch openen, probeer het handmatig te openen: %1. - + The referenced resource failed to download. Kan de bron waarnaar wordt verwezen niet downloaden. - + Save &image... &Afbeelding opslaan... - + Save s&ound... &Geluid opslaan... - + WARNING: %1 WAARSCHUWING: %1 @@ -352,42 +353,44 @@ Formulier - + about:blank about:blank - + x x - + Find: Zoeken: - + + &Previous &Vorige - + + &Next &Volgende - + Ctrl+G Ctrl+G - + &Case Sensitive &Hoofdlettergevoelig - + Highlight &all Alles &markeren @@ -413,6 +416,29 @@ + Dialog + + + Proxy authentication required + + + + + You need to supply a Username and a Password to access via proxy + + + + + Username: + + + + + Password: + Wachtwoord: + + + DictGroupWidget @@ -513,6 +539,119 @@ + DictHeadwords + + + Search mode + + + + + This element determines how filter string will be interpreted + + + + + If checked on the symbols case will be take in account when filtering + + + + + Match case + + + + + Exports headwords to file + + + + + Export + + + + + Help + + + + + OK + + + + + Press this button to apply filter to headwords list + + + + + Apply + + + + + If checked any filter changes will we immediately applied to headwords list + + + + + Auto apply + + + + + Filter: + + + + + Filter string (fixed string, wildcards or regular expression) + + + + + Text + + + + + Wildcards + + + + + RegExp + + + + + Unique headwords total: %1, filtered: %2 + + + + + Save headwords to file + + + + + Text files (*.txt);;All files (*.*) + Tekst bestanden (*.txt);;Alle bestanden (*.*) + + + + Export headwords... + + + + + Cancel + Annuleren + + + DictInfo @@ -555,6 +694,16 @@ Beschrijving: + + Show all unique dictionary headwords + + + + + Headwords + + + Edit the dictionary via command: %1 @@ -571,6 +720,74 @@ + DictServer + + + Url: + + + + + Databases: + + + + + Search strategies: + + + + + Server databases + + + + + DictServersModel + + + Enabled + Ingeschakeld + + + + Name + Naam + + + + Address + Adres + + + + Databases + + + + + Strategies + + + + + Icon + Pictogram + + + + Comma-delimited list of databases +(empty string or "*" matches all databases) + + + + + Comma-delimited list of search strategies +(empty string mean "prefix" strategy) + + + + DictionaryBar Dictionary Bar @@ -592,17 +809,22 @@ Deze groep bewerken - + Dictionary info Woordenboek informatie - + + Dictionary headwords + + + + Open dictionary folder Woordenboekmap openen - + Edit dictionary Woordenboek bewerken @@ -610,39 +832,39 @@ EditDictionaries - + &Sources &Bronnen - - + + &Dictionaries &Woordenboeken - - + + &Groups &Groepen - + Sources changed Bronnen gewijzigd - + Some sources were changed. Would you like to accept the changes? Enkele bronnen zijn gewijzigd. Wilt u de wijzigingen accepteren? - + Accept Accepteren - + Cancel Annuleren @@ -661,6 +883,92 @@ + FTS::FtsIndexing + + + None + Geen + + + + FTS::FullTextSearchDialog + + + Full-text search + + + + + Whole words + + + + + Plain text + + + + + Wildcards + + + + + RegExp + + + + + Max distance between words (%1-%2): + + + + + Max articles per dictionary (%1-%2): + + + + + + + Articles found: + + + + + Now indexing: + + + + + CJK symbols in search string are not compatible with search modes "Whole words" and "Plain text" + + + + + The search line must contains at least one word containing + + + + + or more symbols + + + + + No dictionaries for full-text search + + + + + FTS::Indexing + + + None + Geen + + + Forvo::ForvoArticleRequest @@ -699,6 +1007,65 @@ + FullTextSearchDialog + + + + Search + + + + + Match case + + + + + Mode: + + + + + Articles found: + + + + + Available dictionaries in group: + + + + + Wait for indexing: + + + + + Total: + + + + + Indexed: + + + + + Now indexing: None + + + + + Cancel + Annuleren + + + + Help + + + + GermanTranslit @@ -738,43 +1105,53 @@ Groups - + + Group tabs + + + + + Open groups list + + + + Add group Groep toevoegen - + Give a name for the new group: Voer een naam in voor de nieuwe groep: - + Rename group Groep hernoemen - + Give a new name for the group: Nieuwe naam voor de groep: - + Remove group Groep verwijderen - + Are you sure you want to remove the group <b>%1</b>? Weet u zeker dat u de groep <b>%1</b> wilt verwijderen? - + Remove all groups Alle groepen verwijderen - + Are you sure you want to remove all the groups? Weet u zeker dat u alle groepen wilt verwijderen? @@ -875,6 +1252,54 @@ + Help::HelpWindow + + + GoldenDict help + + + + + Home + + + + + Back + Terug + + + + Forward + Vooruit + + + + Zoom In + Vergroten + + + + Zoom Out + Verkleinen + + + + Normal Size + Normale grootte + + + + Content + + + + + Index + + + + HistoryPaneWidget @@ -905,12 +1330,12 @@ Hunspell - + Spelling suggestions: Spellingsuggesties: - + %1 Morphology Morfologie %1 @@ -918,12 +1343,12 @@ HunspellDictsModel - + Enabled Ingeschakeld - + Name Naam @@ -1963,7 +2388,7 @@ LoadDictionaries - + Error loading dictionaries Fout bij laden woordenboeken @@ -1971,7 +2396,7 @@ Main - + Error in configuration file. Continue with default settings? Fout in configuratiebestand. Doorgaan met standaardinstellingen? @@ -1983,18 +2408,18 @@ Zeige Namen in Wörterbuchleiste - + &Menubar &Menubalk - - + + Look up in: Opzoeken in: - + Found in Dictionaries: Gevonden in woordenboeken: @@ -2003,226 +2428,237 @@ Navigation - + Back Terug - + Forward Vooruit - + Scan Popup Scan Popup - + Pronounce Word (Alt+S) Woord uitspreken (Alt+S) - + Zoom In Vergroten - + Zoom Out Verkleinen - + Normal Size Normale grootte - + Words Zoom In Zoekwoorden vergroten - + Words Zoom Out Zoekwoorden verkleinen - + Words Normal Size Zoekwoorden normale grootte - + Show &Main Window &Hoofdvenster weergeven - + Close current tab Huidig tabblad sluiten - + Close all tabs Alle tabbladen sluiten - + Close all tabs except current Alle andere tabbladen sluiten - - + + Accessibility API is not enabled Toegankelijkheid API is niet ingeschakeld - + Article, Complete (*.html) Artikel, compleet (*.html) - + Article, HTML Only (*.html) Artikel, alleen HTML (*.html) - + Saving article... Artikel opslaan... - + The main window is set to be always on top. Het hoofdvenster wordt nu altijd op de voorgrond weergegeven. - + &Hide &Verbergen - + Export history to file Geschiedenis opslaan als bestand - - + + Text files (*.txt);;All files (*.*) Tekst bestanden (*.txt);;Alle bestanden (*.*) - + History export complete Geschiedenis exporteren voltooid - + Export error: Fout bij exporteren: - + Import history from file Geschiedenis importeren uit bestand - + Import error: invalid data in file Fout bij importeren: bestand bevat onjuiste gegevens - + History import complete Geschiedenis importeren voltooid - + Import error: Fout bij importeren: - + Dictionary info Woordenboekinformatie - + + Dictionary headwords + + + + Open dictionary folder Woordenboekmap openen - + Edit dictionary Woordenboek bewerken - - + + &Quit &Afsluiten - + Loading... Laden... - + Welcome! Welkom! - + %1 dictionaries, %2 articles, %3 words %1 Woordenboeken, %2 Artikelen, %3 Woorden - + Look up: Opzoeken: - + All Alle groepen - + Opened tabs Geopende tabbladen - + Show Names in Dictionary &Bar Woordenboekwerkbalk met &tekst - + Show Small Icons in &Toolbars Werkbalken met &kleine pictogrammen - + &Navigation &Navigatiewerkbalk - + + String to search in dictionaries. The wildcards '*', '?' and sets of symbols '[...]' are allowed. +To find '*', '?', '[', ']' symbols use '\*', '\?', '\[', '\]' respectively + + + + Open Tabs List Tabbladlijst openen - + (untitled) (naamloos) - + %1 - %2 %1 - %2 @@ -2235,57 +2671,57 @@ GoldenDict - + Failed to initialize hotkeys monitoring mechanism.<br>Make sure your XServer has RECORD extension turned on. Bewakingsmechanisme voor sneltoetsen kan niet worden geïnitialiseerd.<br>Zorg ervoor dat de RECORD-extensie van uw XServer is ingeschakeld. - + New Release Available Nieuwe versie beschikbaar - + Version <b>%1</b> of GoldenDict is now available for download.<br>Click <b>Download</b> to get to the download page. Versie <b>%1</b> van GoldenDict kan nu gedownload worden.<br>Klik op <b>downloaden</b> om naar de downloadpagina te gaan. - + Download Downloaden - + Skip This Release Deze versie overslaan - + You have chosen to hide a menubar. Use %1 to show it back. U hebt ervoor gekozen om de menubalk te verbergen. Druk op %1 om deze weer zichtbaar te maken. - + Ctrl+M Ctrl+M - + Page Setup Pagina-instelling - + No printer is available. Please install one first. Geen printer beschikbaar. U moet er eerst één installeren. - + Print Article Artikel afdrukken - + Save Article As Artikel opslaan als @@ -2294,42 +2730,42 @@ Html bestanden (*.html *.htm) - + Error Fout - + Can't save article: %1 Kan artikel niet opslaan: %1 - + &File &Bestand - + &Edit Be&werken - + &Help &Help - + &View Beel&d - + &Zoom Z&oomen - + H&istory &Geschiedenis @@ -2338,12 +2774,12 @@ Suchformular - + &Dictionaries... Woorden&boeken... - + F3 F3 @@ -2352,148 +2788,178 @@ &Gruppen... - + + Search + + + + &Search Pane &Zoekvenster - + &Results Navigation Pane Navigatievenster zoek&resultaten - + &History Pane &Geschiedenisvenster - + &Preferences... &Instellingen... - + F4 F4 - + &Homepage &Website - + &About &Over - + About GoldenDict Over GoldenDict - + + GoldenDict reference + + + + F1 F1 - + Quit from application Programma afsluiten - + Ctrl+Q Ctrl+Q - + &Forum &Forum - + &Close To Tray &Sluiten naar systeemvak - + Minimizes the window to tray Minimaliseren naar systeemvak - + Ctrl+F4 Ctrl+F4 - + &Save Article Artikel &opslaan - + Save Article Artikel opslaan - + F2 F2 - + &Print Af&drukken - + Ctrl+P Ctrl+P - + Page Set&up &Pagina-instelling - + Print Pre&view Afdruk&voorbeeld - + &Rescan Files Bestanden opnieuw &inlezen - + &New Tab &Nieuw tabblad - + &Always on Top &Altijd op de voorgrond - + Always on Top Altijd op de voorgrond - + Ctrl+O Ctrl+O - - - + + + Menu Button Menuknop + + Search in page + + + + + Ctrl+F + + + + + Full-text search + + + + + Ctrl+Shift+F + + + Print Preview Druckvorschau @@ -2502,48 +2968,48 @@ Dateien neu einlesen - + Ctrl+F5 Ctrl+F5 - + &Clear &Wissen - + New Tab Nieuw tabblad - + Ctrl+T Ctrl+T - + &Configuration Folder &Configuratiemap - - + + &Show &Weergeven - + Ctrl+H Ctrl+H - + &Export &Exporteren - + &Import &Importeren @@ -2551,12 +3017,12 @@ Mdx::MdxArticleRequest - + Dictionary file was tampered or corrupted Woordenboekbestand is gemanipuleerd of beschadigd - + Failed loading article from %1, reason: %2 Kan artikel niet laden van %1, reden: %2 @@ -2564,7 +3030,7 @@ MediaWiki::MediaWikiArticleRequest - + XML parse error: %1 at %2,%3 XML parseerfout: %1 op %2,%3 @@ -2572,7 +3038,7 @@ MediaWiki::MediaWikiWordSearchRequest - + XML parse error: %1 at %2,%3 XML parseerfout: %1 op %2,%3 @@ -2580,22 +3046,22 @@ MediaWikisModel - + Enabled Ingeschakeld - + Name Naam - + Address Adres - + Icon Pictogram @@ -2608,88 +3074,94 @@ Formulier - + Dictionary order: Woordenboekvolgorde: - - - - ... - ... + ... - + Inactive (disabled) dictionaries: Inactieve (uitgeschakelde) woordenboeken: - + Dictionary information Informatie over dit woordenboek - + Name: Naam: - + Total articles: Totaal aantal artikelen: - + Total words: Totaal aantal woorden: - + Translates from: Vertaalt van: - + Translates to: Vertaalt naar: - + Description: Beschrijving: - + Files comprising this dictionary: Woordenboek bestaat uit de volgende bestanden: - + Adjust the order by dragging and dropping items in it. Drop dictionaries to the inactive group to disable their use. Verander de volgorde door items te slepen en verplaats woordenboeken naar de inactieve groep om ze uit te schakelen. - + Sort by name Sorteren op naam - + Sort by languages Sorteren op taal + + + Dictionary headwords + + + + + Dictionaries active: %1, inactive: %2 + + PathsModel - + Path Pad - + Recursive Recursief @@ -2697,37 +3169,38 @@ Preferences - + System default Systeemstandaard - + + Default Standaard - + Modern Modern - + Lingvo Lingvo - + Babylon Babylon - + Lingoes Lingoes - + Lingoes-Blue Lingoes-Blauw @@ -2736,12 +3209,12 @@ Afspelen met DirectShow - + Changing Language Toepassingstaal wijzigen - + Restart the program to apply the language change. Start het programma opnieuw om de toepassingstaal te wijzigen. @@ -2843,12 +3316,12 @@ Weergavestijl: - + &Scan Popup &Scan Popup - + When enabled, a translation popup window would be shown each time you point your mouse on any word on the screen (Windows) or select any word with mouse (Linux). When enabled, you can switch it on and @@ -2858,7 +3331,7 @@ U kunt dit in- of uitschakelen in het hoofdvenster of via het systeemvakpictogram. - + Enable scan popup functionality De Scan Popup modus inschakelen @@ -2916,141 +3389,146 @@ Add-on stijl: - + + Help language + + + + Adjust this value to avoid huge context menus. Pas deze waarde aan om zeer lange contextmenu's te voorkomen. - + Context menu dictionaries limit: Woordenboeken in contextmenu beperken tot: - + Chooses whether the scan popup mode is on by default or not. If checked, the program would always start with the scan popup active. Hier kunt u aangeven of de Scan Popup modus standaard in- of uitgeschakeld is. Het programma start met de Scan Popup modus ingeschakeld als dit geselecteerd is. - + Start with scan popup turned on Starten met Scan Popup ingeschakeld - + With this enabled, the popup would only show up if all chosen keys are in the pressed state when the word selection changes. Als dit ingeschakeld is wordt de popup alleen weergegeven als alle opgegeven toetsen zijn ingedrukt wanneer de woordselectie verandert. - + Only show popup when all selected keys are kept pressed: Alleen een popup weergeven als alle geselecteerde toetsen ingedrukt worden: - + Left Ctrl only Alleen Ctrl-links - + Left Ctrl Ctrl-links - + Right Shift only Alleen Shift-rechts - + Right Shift Shift-rechts - + Alt key Alt-toets - + Alt Alt - + Ctrl key Ctrl-toets - + Ctrl Ctrl - + Left Alt only Alleen Alt-links - + Left Alt Alt-links - + Shift key Shift-toets - + Shift Shift - + Right Alt only Alleen Alt-rechts - + Right Alt Alt-rechts - + Right Ctrl only Alleen Ctrl-rechts - + Right Ctrl Ctrl-rechts - + Left Shift only Alleen Shift-links - + Left Shift Shift-links - + Windows key or Meta key Windowstoets of Metatoets - + Win/Meta Win/Meta - + Normally, in order to activate a popup you have to maintain the chosen keys pressed while you select a word. With this enabled, the chosen keys may also @@ -3060,37 +3538,72 @@ kunnen de toetsen ook kort erna ingedrukt worden. - + Send translated word to main window instead of to show it in popup window Vertaald woord niet in popup weergeven maar naar hoofdvenster verzenden - + Send translated word to main window Vertaald woord naar hoofdvenster verzenden - + Playback Afspelen - + + System proxy + + + + + Custom proxy + + + + + Custom settings + + + + + Full-text search + + + + + Allow full-text search for: + + + + + Don't search in dictionaries containing more than + + + + + articles (0 - unlimited) + + + + Select this option to automatic collapse big articles Selecteer deze optie om lange artikelen automatisch samen te vouwen - + Collapse articles more than Artikelen samenvouwen met meer dan - + Articles longer than this size will be collapsed Langere artikelen automatisch samenvouwen - + symbols tekens @@ -3125,27 +3638,27 @@ Afspelen met Bass-audio bibliotheek - + Use any external program to play audio files Een extern programma gebruiken voor het afspelen van geluidsbestanden - + Use external program: Extern programma gebruiken: - + Ad&vanced Gea&vanceerd - + ScanPopup extra technologies Scan Popup-extra technologie - + Try to use IAccessibleEx technology to retrieve word under cursor. This technology works only with some programs that support it (for example Internet Explorer 9). @@ -3156,12 +3669,12 @@ programma's niet gebruikt, dan hoeft u dit niet te selecteren. - + Use &IAccessibleEx &IAccessibleEx gebruiken - + Try to use UI Automation technology to retrieve word under cursor. This technology works only with some programs that support it. It is not needed to select this option if you don't use such programs. @@ -3171,12 +3684,12 @@ u dit niet te selecteren. - + Use &UIAutomation &UIAutomation gebruiken - + Try to use special GoldenDict message to retrieve word under cursor. This technology works only with some programs that support it. It is not needed to select this option if you don't use such programs. @@ -3186,72 +3699,72 @@ u dit niet te selecteren. - + Use &GoldenDict message &GoldenDict methode gebruiken - + History Geschiedenis - + Turn this option on to store history of the translated words Schakel deze optie in om de geschiedenis van vertaalde woorden op te slaan - + Store &history &Geschiedenis opslaan - + Specify the maximum number of entries to keep in history. Geef het maximum aantal items op dat bewaard wordt als geschiedenis. - + Maximum history size: Maximale grootte geschiedenis: - + History saving interval. If set to 0 history will be saved only during exit. Opslag-interval voor geschiedenis (instellen op 0 om alleen op te slaan bij afsluiten). - + Save every Elke - + minutes minuten opslaan - + Articles Artikelen - + Turn this option on to always expand optional parts of articles Schakel deze optie in om optionele onderdelen van artikelen altijd uit te vouwen - + Expand optional &parts Optionele onderdelen &uitvouwen - + Keys may also be pressed afterwards, within Toetsen ook achteraf in te drukken binnen - + To avoid false positives, the keys are only monitored after the selection's done for a limited amount of seconds, which is specified here. @@ -3260,32 +3773,32 @@ een beperkt aantal hier op te geven seconden bewaakt. - + secs seconden - + Hotkeys Sneltoetsen - + Use the following hotkey to show or hide the main window: De volgende sneltoets gebruiken om het hoofdvenster te tonen of te verbergen: - + Use the following hotkey to translate a word from clipboard: De volgende sneltoets gebruiken om woorden van het klembord te vertalen: - + The hotkeys are global and work from any program and within any context as long as GoldenDict is running in background. De sneltoetsen werken systeembreed en vanuit elk programma zolang GoldenDict op de achtergrond actief is. - + <!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; } @@ -3298,78 +3811,78 @@ <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" color:#ff0000;">Opmerking: Waarschijnlijk gebruikt u een X.Org XServer versie, waarvan de RECORD-extensie niet functioneert. Daarom zullen sneltoetsen in Goldendict waarschijnlijk niet goed werken. Dit moet op de server zelf aangepast worden. U kunt naar het volgende verwijzen </span><a href="https://bugs.freedesktop.org/show_bug.cgi?id=20500"><span style=" text-decoration: underline; color:#0000ff;">foutvermelding</span></a><span style=" color:#ff0000;"> en daar een reactie achter laten.</span></p></body></html> - + &Audio &Geluid - + Pronunciation Uitspraak - + Auto-pronounce words in main window Woorden in hoofdvenster automatisch uitspreken - + Auto-pronounce words in scan popup Woorden in Scan Popup automatisch uitspreken - + Play audio files via FFmpeg(libav) and libao Audiobestanden afspelen via FFmpeg(libav) en libao - + Use internal player Interne speler gebruiken - + &Network &Netwerk - + Enable if you wish to use a proxy server for all program's network requests. Schakel dit in om een proxyserver te gebruiken voor alle netwerkaanvragen. - + Use proxy server Proxyserver gebruiken - + Type: Type: - + Host: Host: - + Port: Poort: - + User: Gebruiker: - + Password: Wachtwoord: - + Enabling this would make GoldenDict block most advertisements by disallowing content (images, frames) not originating from the site you are browsing. If some site breaks because of this, try disabling this. @@ -3378,12 +3891,12 @@ onjuist functioneert moet u dit mogelijk uitschakelen. - + Disallow loading content from other sites (hides most advertisements) Inhoud van andere sites blokkeren (verbergt de meeste reclame) - + Enabling this would allow to listen to sound pronunciations from online dictionaries that rely on Flash or other web plugins. Plugin must be installed for this option to work. @@ -3393,24 +3906,24 @@ kunnen gebruiken. - + Enable web plugins Web-invoegtoepassingen inschakelen - + Some sites detect GoldenDict via HTTP headers and block the requests. Enable this option to workaround the problem. Sommige websites detecteren GoldenDict met behulp van HTTP-headers en blokkeren de aanvragen. Selecteer deze optie om dit te voorkomen. - + Do not identify GoldenDict in HTTP headers GoldenDict niet identificeren in HTTP-headers - + When this is enabled, the program periodically checks if a new, updated version of GoldenDict is available for download. If it is so, the program @@ -3421,7 +3934,7 @@ gevraagd een downloadpagina te openen. - + Check for new program releases periodically Periodiek controleren op nieuwe versies @@ -3429,27 +3942,27 @@ ProgramTypeEditor - + Audio Geluid - + Plain Text Tekst zonder opmaak - + Html Html - + Prefix Match Overeenkomst op voorvoegsel - + Unknown Onbekend @@ -3475,27 +3988,27 @@ ProgramsModel - + Enabled Ingeschakeld - + Type Type - + Name Naam - + Command Line Opdrachtregel - + Icon Pictogram @@ -3503,12 +4016,14 @@ QObject - + + Article loading error Fout bij laden artikel - + + Article decoding error Fout bij decoderen artikel @@ -3619,18 +4134,18 @@ ResourceToSaveHandler - - + + ERROR: %1 FOUT: %1 - + Resource saving error: Fout bij opslaan bron: - + The referenced resource failed to download. Kan de bron waarnaar wordt verwezen niet downloaden. @@ -3638,12 +4153,12 @@ Romaji - + Hepburn Romaji for Hiragana Hepburn Romaji voor Hiragana - + Hepburn Romaji for Katakana Hepburn Romaji voor Katakana @@ -3672,21 +4187,21 @@ Treffer anzeigen (Alt+M) - - - - - + + + + + ... ... - + Back Terug - + Forward Vooruit @@ -3695,32 +4210,32 @@ Alt+M - + Pronounce Word (Alt+S) Woord uitspreken (Alt+S) - + Alt+S Alt+S - + Send word to main window (Alt+W) Woord naar hoofdvenster verzenden (Alt+W) - + Alt+W Alt+W - + Shows or hides the dictionary bar Woordenboekwerkbalk weergeven of verbergen - + Use this to pin down the window so it would stay on screen, could be resized or managed in other ways. Hiermee vergrendelt u het venster zodat het zichtbaar blijft @@ -3731,8 +4246,8 @@ GoldenDict - - + + %1 - %2 %1 - %2 @@ -3740,17 +4255,17 @@ SoundDirsModel - + Path Pad - + Name Naam - + Icon Pictogram @@ -3758,45 +4273,47 @@ Sources - + Text to Speech Tekst naar spraak - + (not available in portable version) (niet beschikbaar in de draagbare versie) - - - + + + Choose a directory Kies een map - - - - - + + + + + + Confirm removal Verwijderen bevestigen - - + + Remove directory <b>%1</b> from the list? De map <b>%1</b> uit de lijst verwijderen? - - + + + Remove site <b>%1</b> from the list? De site <b>%1</b> uit de lijst verwijderen? - + Remove program <b>%1</b> from the list? Het programma <b>%1</b> uit de lijst verwijderen? @@ -3815,7 +4332,8 @@ - + + &Add... &Toevoegen... @@ -3824,7 +4342,8 @@ - + + &Remove &Verwijderen @@ -3903,7 +4422,7 @@ Alternativ kann %GD1251% für CP1251 und %GDISO1% für ISO 8859-1 benutzt werden. - + Programs Programma's @@ -3913,27 +4432,27 @@ Het zoekwoord wordt ook als standaardinvoer doorgegeven. - + Forvo Forvo - + Live pronunciations from <a href="http://www.forvo.com/">forvo.com</a>. The site allows people to record and share word pronunciations. You can listen to them from GoldenDict. Live uitspraak van <a href="http://www.forvo.com/">forvo.com</a>. Deze site maakt het mogelijk om uitspraak van woorden op te nemen en te delen. U kunt er via GoldenDict naar luisteren. - + Enable pronunciations from Forvo Uitspraken van Forvo inschakelen - + API Key: API-sleutel: - + Use of Forvo currently requires an API key. Leave this field blank to use the default key, which may become unavailable in the future, or register on the site to get your own key. @@ -3943,7 +4462,7 @@ de site een eigen sleutel aan. - + Get your own key <a href="http://api.forvo.com/key/">here</a>, or leave blank to use the default one. Uw eigen sleutel verkrijgt u <a href="http://api.forvo.com/key/">hier</a>, of laat het veld leeg om de standaardsleutel te gebruiken. @@ -3973,80 +4492,90 @@ %GDBIG5% voor Big-5, %GDBIG5HKSCS% voor Big5-HKSCS, %GDGBK% voor GBK en GB18030, %GDSHIFTJIS% voor Shift-JIS. + + DICT servers + + + + DICT servers: + + + + Any external programs. A string %GDWORD% will be replaced with the query word. If such string is not presented, the word will be fed into standard input. Alle externe programma's. De tekenreeks %GDWORD% wordt automatisch vervangen door het zoekwoord. Als de tekenreeks niet aanwezig is, dan wordt het zoekwoord als standaardinvoer doorgegeven. - + Language codes (comma-separated): Taalcodes (komma-gescheiden): - + List of language codes you would like to have. Example: "en, ru". Een lijst met taalcodes die u kunt gebruiken (voorbeeld: "en, ru"). - + Full list of language codes is available <a href="http://www.forvo.com/languages-codes/">here</a>. De volledige lijst met taalcodes is <a href="http://www.forvo.com/languages-codes/">hier</a> beschikbaar. - + Transliteration Transliteratie - + Russian transliteration Russische transliteratie - + Greek transliteration Griekse transliteratie - + German transliteration Duitse transliteratie - + Belarusian transliteration Wit-Russische transliteratie - + Enables to use the Latin alphabet to write the Japanese language Het gebruik van het Latijnse alfabet inschakelen om de Japanse taal te schrijven - + Japanese Romaji Japans Romaji - + Systems: Systemen: - + The most widely used method of transcription of Japanese, based on English phonology De meest gebruikte methode voor transcriptie van Japans, gebaseerd op Engelse klankleer - + Hepburn Hepburn - + The most regular system, having a one-to-one relation to the kana writing systems. Standardized as ISO 3602 @@ -4057,12 +4586,12 @@ Nog niet geïmplementeerd in GoldenDict. - + Nihon-shiki Nihon-shiki - + Based on Nihon-shiki system, but modified for modern standard Japanese. Standardized as ISO 3602 @@ -4073,32 +4602,32 @@ Nog niet geïmplementeerd in GoldenDict. - + Kunrei-shiki Kunrei-shiki - + Syllabaries: Lettergrepenschrift: - + Hiragana Japanese syllabary Hiragana Japans syllabisch schrift - + Hiragana Hiragana - + Katakana Japanese syllabary Katakana Japans syllabisch schrift - + Katakana Katakana @@ -4228,22 +4757,22 @@ WebSitesModel - + Enabled Ingeschakeld - + Name Naam - + Address Adres - + Icon Pictogram @@ -4251,7 +4780,7 @@ WordFinder - + Failed to query some dictionaries. Enkele woordenboeken konden niet doorzocht worden. diff -Nru goldendict-1.5.0~git20131003/locale/pl_PL.ts goldendict-1.5.0~git20150923/locale/pl_PL.ts --- goldendict-1.5.0~git20131003/locale/pl_PL.ts 2013-10-02 20:42:04.000000000 +0000 +++ goldendict-1.5.0~git20150923/locale/pl_PL.ts 2015-09-23 08:26:24.000000000 +0000 @@ -35,7 +35,7 @@ [Nieznane] - + Based on Qt %1 (%2, %3 bit) Oparte na bibliotece Qt %1 (%2, %3-bitowa) @@ -43,62 +43,62 @@ ArticleMaker - + Expand article Rozwiń artykuł - + Collapse article Zwiń artykuł - + No translation for <b>%1</b> was found in group <b>%2</b>. Nie znaleziono tłumaczenia słowa <b>%1</b> w grupie <b>%2</b>. - + No translation was found in group <b>%1</b>. Nie znaleziono tłumaczenia w grupie <b>%1</b>. - + Welcome! Witamy! - + <h3 align="center">Welcome to <b>GoldenDict</b>!</h3><p>To start working with the program, first visit <b>Edit|Dictionaries</b> to add some directory paths where to search for the dictionary files, set up various Wikipedia sites or other sources, adjust dictionary order or create dictionary groups.<p>And then you're ready to look up your words! You can do that in this window by using a pane to the left, or you can <a href="Working with popup">look up words from other active applications</a>. <p>To customize program, check out the available preferences at <b>Edit|Preferences</b>. All settings there have tooltips, be sure to read them if you are in doubt about anything.<p>Should you need further help, have any questions, suggestions or just wonder what the others think, you are welcome at the program's <a href="http://goldendict.org/forum/">forum</a>.<p>Check program's <a href="http://goldendict.org/">website</a> for the updates. <p>(c) 2008-2013 Konstantin Isakov. Licensed under GPLv3 or later. <h3 align="center">Witamy w programie <b>GoldenDict</b>!</h3><p>Aby rozpocząć pracę z programem, wybierz opcję <b>Edycja|Słowniki</b> i dodaj ścieżki, w których wyszukiwane będą pliki słowników, skonfiguruj serwisy Wikipedii lub inne źródła, dostosuj słowniki oraz utwórz ich grupy.</p>Po wykonaniu tych czynności program będzie gotowy do wyszukiwania słów! Można to robić w tym oknie za pomocą panelu znajdującego się po lewej stronie lub <a href="Praca z okienkiem wyskakującym">podczas pracy z innymi aplikacjami</a>.</p><p>W celu dostosowania programu wybierz opcję <b>Edycja|Preferencje</b> i sprawdź dostępne preferencje. Do wszystkich preferencji wyświetlane są podpowiedzi. W razie wątpliwości należy je dokładnie przeczytać.</p><p>Jeśli potrzebujesz dodatkowej pomocy, masz pytania lub sugestie albo po prostu chcesz wiedzieć, co myślą inni, skorzystaj z naszego <a href="http://goldendict.org/forum/">forum</a>. <p>Aktualizacje programu są dostępne <a href="http://goldendict.org/">w naszej witrynie sieci Web</a>.<p>(c) 2008-2013 Konstantin Isakov. Licencja GPLv3 lub nowsza. - + Working with popup Praca z okienkiem wyskakującym - + <h3 align="center">Working with the popup</h3>To look up words from other active applications, you would need to first activate the <i>"Scan popup functionality"</i> in <b>Preferences</b>, and then enable it at any time either by triggering the 'Popup' icon above, or by clicking the tray icon down below with your right mouse button and choosing so in the menu you've popped. <h3 align="center">Praca z okienkiem wyskakującym</h3>Aby móc wyszukiwać słowa z innych działających aplikacji, aktywuj najpierw funkcję <i>„skanowania automatycznego”</i> w opcji <b>Preferencje</b> i w dowolnym momencie włącz ją, przełączając znajdującą się powyżej ikonę skanowania automatycznego lub klikając prawym przyciskiem myszy ikonę na pasku zadań i wybierając odpowiednią opcję z wyświetlonego menu. - + Then just stop the cursor over the word you want to look up in another application, and a window would pop up which would describe it to you. Następnie zatrzymaj kursor w innej aplikacji nad słowem, które chcesz wyszukać. Spowoduje to wyświetlenie okienka wyskakującego zawierającego wyjaśnienie tego słowa. - + Then just select any word you want to look up in another application by your mouse (double-click it or swipe it with mouse with the button pressed), and a window would pop up which would describe the word to you. Następnie zaznacz w innej aplikacji dowolne słowo za pomocą myszy (kliknij je dwukrotnie lub zaznacz wskaźnikiem myszy przy wciśniętym lewym przycisku). Spowoduje to wyświetlenie okienka wyskakującego zawierającego wyjaśnienie tego słowa. - + (untitled) (bez tytułu) - + (picture) (obraz) @@ -106,37 +106,37 @@ ArticleRequest - + Expand article Rozwiń artykuł - + From Źródło: - + Collapse article Zwiń artykuł - + Query error: %1 Błąd zapytania: %1 - + Close words: Podobne słowa: - + Compound expressions: Wyrażenia złożone: - + Individual words: Pojedyncze słowa: @@ -144,57 +144,57 @@ ArticleView - + Select Current Article Wybierz aktualny artykuł - + Copy as text Kopiuj jako tekst - + Inspect Zbadaj - + Resource Zasób - + Audio Dźwięk - + TTS Voice Głos TTS - + Picture Obraz - + Video Wideo - + Video: %1 Wideo: %1 - + Definition from dictionary "%1": %2 Definicja ze słownika „%1”: %2 - + Definition: %1 Definicja: %1 @@ -203,38 +203,39 @@ GoldenDict - - + + The referenced resource doesn't exist. Wskazywany zasób nie istnieje. - + The referenced audio program doesn't exist. Wskazywany program obsługi audio nie istnieje. - + + ERROR: %1 BŁĄD: %1 - + Save sound Zapisz dźwięk - + Sound files (*.wav *.ogg *.mp3 *.mp4 *.aac *.flac *.mid *.wv *.ape);;All files (*.*) Pliki dźwiękowe (*.wav *.ogg *.mp3 *.mp4 *.aac *.flac *.mid *.wv *.ape);;Wszystkie pliki (*.*) - + Save image Zapisz obraz - + Image files (*.bmp *.jpg *.png *.tif);;All files (*.*) Pliki obrazów (*.bmp *.jpg *.png *.tif);;Wszystkie pliki (*.*) @@ -243,53 +244,53 @@ Błąd zapisu zasobu: - + &Open Link &Otwórz łącze - + Open Link in New &Tab O&twórz łącze w nowej karcie - + Open Link in &External Browser Otwórz łącze w z&ewnętrznej przeglądarce - + &Look up "%1" &Wyszukaj „%1” - + Look up "%1" in &New Tab Wyszukaj „%1” w &nowej karcie - + Send "%1" to input line Wyślij „%1” do wiersza wejściowego - - + + &Add "%1" to history Dod&aj „%1” do historii - + Look up "%1" in %2 Wyszukaj „%1” w grupie %2 - + Look up "%1" in %2 in &New Tab Wyszukaj „%1” w grupie %2 w &nowej karcie - + WARNING: FFmpeg Audio Player: %1 OSTRZEŻENIE: Odtwarzacz audio FFmpeg: %1 @@ -310,37 +311,37 @@ Biblioteka BASS nie może odtworzyć tego dźwięku. - + Failed to run a player to play sound file: %1 Nie powiodło się uruchomienie odtwarzacza w celu odtworzenia pliku dźwiękowego: %1 - + Failed to create temporary file. Nie powiodło się utworzenie pliku tymczasowego. - + Failed to auto-open resource file, try opening manually: %1. Nie powiodło się automatyczne otwarcie pliku zasobu. Spróbuj otworzyć ręcznie: %1. - + The referenced resource failed to download. Nie powiodło się pobranie wskazywanego zasobu. - + Save &image... Zap&isz obraz... - + Save s&ound... Zapisz &dźwięk... - + WARNING: %1 OSTRZEŻENIE: %1 @@ -350,42 +351,44 @@ Formularz - + about:blank about:blank - + x x - + Find: Znajdź: - + + &Previous &Poprzednie - + + &Next &Następne - + Ctrl+G Ctrl+G - + &Case Sensitive Z rozróżnianiem wielkoś&ci liter - + Highlight &all Podświetl &wszystko @@ -411,6 +414,29 @@ + Dialog + + + Proxy authentication required + Wymagane uwierzytelnienie serwera proxy + + + + You need to supply a Username and a Password to access via proxy + Aby uzyskać dostęp za pośrednictwem serwera proxy, należy podać nazwę użytkownika i hasło + + + + Username: + Nazwa użytkownika: + + + + Password: + Hasło: + + + DictGroupWidget @@ -511,6 +537,119 @@ + DictHeadwords + + + Search mode + Tryb wyszukiwania + + + + This element determines how filter string will be interpreted + Ta opcja decyduje o sposobie interpretacji ciągu znaków filtru + + + + If checked on the symbols case will be take in account when filtering + Zaznaczenie tej opcji powoduje, że podczas filtrowania uwzględniana jest wielkość liter + + + + Match case + Zgodna wielkość liter + + + + Exports headwords to file + Eksportuje hasła do pliku + + + + Export + Eksportuj + + + + Help + Pomoc + + + + OK + OK + + + + Press this button to apply filter to headwords list + Kliknij ten przycisk, aby zastosować filtr do listy haseł + + + + Apply + Zastosuj + + + + If checked any filter changes will we immediately applied to headwords list + Zaznaczenie tej opcji powoduje, że zmiany filtru są od razu stosowane do listy haseł + + + + Auto apply + Stosuj automatycznie + + + + Filter: + Filtr: + + + + Filter string (fixed string, wildcards or regular expression) + Ciąg znaków filtru (ustalony ciąg znaków, symbole wieloznaczne lub wyrażenie regularne) + + + + Text + Tekst + + + + Wildcards + Symbole wieloznaczne + + + + RegExp + Wyrażenie regularne + + + + Unique headwords total: %1, filtered: %2 + Unikalne hasła łącznie: %1, przefiltrowane: %2 + + + + Save headwords to file + Zapisz hasła do pliku + + + + Text files (*.txt);;All files (*.*) + Pliki tekstowe (*.txt);;Wszystkie pliki (*.*) + + + + Export headwords... + Eksportuj hasła... + + + + Cancel + Anuluj + + + DictInfo @@ -553,6 +692,16 @@ Opis: + + Show all unique dictionary headwords + Pokaż wszystkie unikalne hasła słownika + + + + Headwords + Hasła + + Edit the dictionary via command: %1 @@ -569,6 +718,76 @@ + DictServer + + + Url: + Adres URL: + + + + Databases: + Bazy danych: + + + + Search strategies: + Strategie wyszukiwania: + + + + Server databases + + + + + DictServersModel + + + Enabled + Włączone + + + + Name + Nazwa + + + + Address + Adres + + + + Databases + Bazy danych + + + + Strategies + Strategie + + + + Icon + Ikona + + + + Comma-delimited list of databases +(empty string or "*" matches all databases) + Rozdzielona przecinkami lista baz danych +(pusty ciąg znaków lub „*” oznacza wszystkie bazy danych) + + + + Comma-delimited list of search strategies +(empty string mean "prefix" strategy) + Rozdzielona przecinkami lista strategii wyszukiwania +(pusty ciąg znaków oznacza strategię „prefiks”) + + + DictionaryBar Dictionary Bar @@ -590,17 +809,22 @@ Edytuj tę grupę - + Dictionary info Informacje o słowniku - + + Dictionary headwords + Hasła słownika + + + Open dictionary folder Otwórz folder słownika - + Edit dictionary Edytuj słownik @@ -608,39 +832,39 @@ EditDictionaries - + &Sources Ź&ródła - - + + &Dictionaries &Słowniki - - + + &Groups &Grupy - + Sources changed Źródła uległy zmianie - + Some sources were changed. Would you like to accept the changes? Niektóre źródła uległy zmianie. Czy zaakceptować zmiany? - + Accept Akceptuj - + Cancel Anuluj @@ -659,6 +883,92 @@ + FTS::FtsIndexing + + + None + Brak + + + + FTS::FullTextSearchDialog + + + Full-text search + Wyszukiwanie pełnotekstowe + + + + Whole words + Całe słowa + + + + Plain text + Zwykły tekst + + + + Wildcards + Symbole wieloznaczne + + + + RegExp + Wyrażenie regularne + + + + Max distance between words (%1-%2): + Maks. odstęp między słowami (%1–%2): + + + + Max articles per dictionary (%1-%2): + Maks. liczba art. w słowniku (%1–%2): + + + + + + Articles found: + Znalezione artykuły: + + + + Now indexing: + Trwa indeksowanie: + + + + CJK symbols in search string are not compatible with search modes "Whole words" and "Plain text" + Symbole CJK w ciągu znaków wyszukiwania nie są obsługiwane w trybach wyszukiwania „Całe słowa” i „Zwykły tekst” + + + + The search line must contains at least one word containing + Wiersz wyszukiwania musi zawierać przynajmniej jedno słowo zawierające + + + + or more symbols + lub więcej symboli + + + + No dictionaries for full-text search + Brak słowników do wyszukiwania pełnotekstowego + + + + FTS::Indexing + + + None + Brak + + + Forvo::ForvoArticleRequest @@ -697,6 +1007,65 @@ + FullTextSearchDialog + + + + Search + Szukaj + + + + Match case + Zgodna wielkość liter + + + + Mode: + Tryb: + + + + Articles found: + Znalezione artykuły: + + + + Available dictionaries in group: + Dostępne słowniki w grupie: + + + + Wait for indexing: + Oczekują na indeksowanie: + + + + Total: + Łącznie: + + + + Indexed: + Zaindeksowane: + + + + Now indexing: None + Trwa indeksowanie: Brak + + + + Cancel + Anuluj + + + + Help + Pomoc + + + GermanTranslit @@ -736,43 +1105,53 @@ Groups - + + Group tabs + Karty grup + + + + Open groups list + Otwórz listę grup + + + Add group Dodaj grupę - + Give a name for the new group: Nadaj nazwę nowej grupie: - + Rename group Zmień nazwę grupy - + Give a new name for the group: Nadaj nową nazwę grupie: - + Remove group Usuń grupę - + Are you sure you want to remove the group <b>%1</b>? Czy na pewno usunąć grupę <b>%1</b>? - + Remove all groups Usuń wszystkie grupy - + Are you sure you want to remove all the groups? Czy na pewno usunąć wszystkie grupy? @@ -873,6 +1252,54 @@ + Help::HelpWindow + + + GoldenDict help + Pomoc do programu GoldenDict + + + + Home + Strona główna + + + + Back + Wstecz + + + + Forward + Dalej + + + + Zoom In + Zwiększ + + + + Zoom Out + Zmniejsz + + + + Normal Size + Normalna wielkość + + + + Content + Spis treści + + + + Index + Indeks + + + HistoryPaneWidget @@ -903,12 +1330,12 @@ Hunspell - + Spelling suggestions: Propozycje: - + %1 Morphology %1 - morfologia @@ -916,12 +1343,12 @@ HunspellDictsModel - + Enabled Włączone - + Name Nazwa @@ -1961,7 +2388,7 @@ LoadDictionaries - + Error loading dictionaries Błąd podczas ładowania słowników @@ -1969,7 +2396,7 @@ Main - + Error in configuration file. Continue with default settings? Błąd w pliku konfiguracyjnym. Czy kontynuować z ustawieniami domyślnymi? @@ -1985,18 +2412,18 @@ Wyświetlaj małe ikony na paskach narzędzi - + &Menubar Pasek &menu - - + + Look up in: Wyszukaj w: - + Found in Dictionaries: Znaleziono w słownikach: @@ -2005,226 +2432,238 @@ Nawigacja - + Back Wstecz - + Forward Dalej - + Scan Popup Skanowanie automatyczne - + Pronounce Word (Alt+S) Wymowa słowa (Alt+S) - + Zoom In Zwiększ - + Zoom Out Zmniejsz - + Normal Size Normalna wielkość - + Words Zoom In Zwiększ słowa - + Words Zoom Out Zmniejsz słowa - + Words Normal Size Normalna wielkość słów - + Show &Main Window Wyświetl okno &główne - + Close current tab Zamknij bieżącą kartę - + Close all tabs Zamknij wszystkie karty - + Close all tabs except current Zamknij wszystkie karty z wyjątkiem bieżącej - - + + Accessibility API is not enabled Nie włączono funkcji API dostępności - + Article, Complete (*.html) Artykuł, pełny (*.html) - + Article, HTML Only (*.html) Artykuł, tylko HTML (*.html) - + Saving article... Zapisywanie artykułu... - + The main window is set to be always on top. Okno główne będzie zawsze na wierzchu. - + &Hide &Ukryj - + Export history to file Eksportowanie historii do pliku - - + + Text files (*.txt);;All files (*.*) Pliki tekstowe (*.txt);;Wszystkie pliki (*.*) - + History export complete Eksport historii został zakończony - + Export error: Błąd eksportu: - + Import history from file Importowanie historii z pliku - + Import error: invalid data in file Błąd importu: nieprawidłowe dane w pliku - + History import complete Import historii został zakończony - + Import error: >Błąd importu: - + Dictionary info Informacje o słowniku - + + Dictionary headwords + Hasła słownika + + + Open dictionary folder Otwórz folder słownika - + Edit dictionary Edytuj słownik - - + + &Quit &Zakończ - + Loading... Ładowanie... - + Welcome! Witamy! - + %1 dictionaries, %2 articles, %3 words Słowniki: %1, artykuły: %2, słowa: %3 - + Look up: Wyszukaj: - + All Wszystko - + Opened tabs Otwarte karty - + Show Names in Dictionary &Bar Pokaż nazwy w pas&ku słowników - + Show Small Icons in &Toolbars Pokaż małe &ikony w paskach narzędzi - + &Navigation &Nawigacja - + + String to search in dictionaries. The wildcards '*', '?' and sets of symbols '[...]' are allowed. +To find '*', '?', '[', ']' symbols use '\*', '\?', '\[', '\]' respectively + Ciągi znaków do wyszukiwania w słownikach. Dozwolone są symbole wieloznaczne „*”, „?” i zbiory symboli „[...]”. +Aby odnaleźć symbole „*”, „?”, „[” i „]”, należy użyć odpowiednio ciągów „\*”, „\?”, „\[” i „\]” + + + Open Tabs List Lista otwartych kart - + (untitled) (bez tytułu) - + %1 - %2 %1 - %2 @@ -2237,57 +2676,57 @@ GoldenDict - + Failed to initialize hotkeys monitoring mechanism.<br>Make sure your XServer has RECORD extension turned on. Nie powiodło się zainicjowanie mechanizmu monitorowania klawiszy skrótu.<br>Upewnij się, że włączono rozszerzenie RECORD serwera XServer. - + New Release Available Dostępna jest nowa wersja - + Version <b>%1</b> of GoldenDict is now available for download.<br>Click <b>Download</b> to get to the download page. Wersja <b>%1</b> programu GoldenDict jest dostępna do pobrania.<br>Kliknij przycisk <b>Pobierz</b>, aby przejść do strony pobierania. - + Download Pobierz - + Skip This Release Pomiń tę wersję - + You have chosen to hide a menubar. Use %1 to show it back. Wybrano opcję ukrycia paska menu. Użyj %1, aby ponownie wyświetlić. - + Ctrl+M Ctrl+M - + Page Setup Ustawienia strony - + No printer is available. Please install one first. Drukarka jest niedostępna. Trzeba ją najpierw zainstalować. - + Print Article Drukuj artykuł - + Save Article As Zapisz artykuł jako @@ -2296,42 +2735,42 @@ Pliki html (*.html *.htm) - + Error Błąd - + Can't save article: %1 Nie można zapisać artykułu: %1 - + &File &Plik - + &Edit &Edycja - + &Help Po&moc - + &View &Widok - + &Zoom Po&większenie - + H&istory &Historia @@ -2340,12 +2779,12 @@ Okienko wyszukiwania - + &Dictionaries... &Słowniki... - + F3 F3 @@ -2358,17 +2797,17 @@ Okienko nawigacji po wynikach - + &Search Pane Okienko wy&szukiwania - + &Results Navigation Pane &Okienko nawigacji po wynikach - + &History Pane Okienko &historii @@ -2377,133 +2816,163 @@ &Słowniki... F3 - + + Search + Wy&szukiwanie + + + &Preferences... &Preferencje... - + F4 F4 - + &Homepage &Strona główna - + &About &Informacje - + About GoldenDict Informacje o programie GoldenDict - + + GoldenDict reference + Pomoc do programu GoldenDict + + + F1 F1 - + Quit from application Zakończ aplikację - + Ctrl+Q Ctrl+Q - + &Forum &Forum - + &Close To Tray Z&amknij do paska zadań - + Minimizes the window to tray Minimalizuje okno do paska zadań - + Ctrl+F4 Ctrl+F4 - + &Save Article Zapi&sz artykuł - + Save Article Zapisz artykuł - + F2 F2 - + &Print &Drukuj - + Ctrl+P Ctrl+P - + Page Set&up &Ustawienia strony - + Print Pre&view &Podgląd wydruku - + &Rescan Files &Wczytaj pliki ponownie - + &New Tab &Nowa karta - + &Always on Top &Zawsze na wierzchu - + Always on Top Zawsze na wierzchu - + Ctrl+O Ctrl+O - - - + + + Menu Button Przycisk menu + + Search in page + Szukaj na stronie + + + + Ctrl+F + Ctrl+F + + + + Full-text search + Wyszukiwanie pełnotekstowe + + + + Ctrl+Shift+F + Ctrl+Shift+F + + Print Preview Podgląd wydruku @@ -2512,48 +2981,48 @@ Wczytaj pliki ponownie - + Ctrl+F5 Ctrl+F5 - + &Clear Wy&czyść - + New Tab Nowa karta - + Ctrl+T Ctrl+T - + &Configuration Folder Folder &konfiguracji - - + + &Show &Pokaż - + Ctrl+H Ctrl+H - + &Export &Eksportuj - + &Import &Importuj @@ -2561,12 +3030,12 @@ Mdx::MdxArticleRequest - + Dictionary file was tampered or corrupted Plik słownika został zmodyfikowany lub uszkodzony - + Failed loading article from %1, reason: %2 Nie można załadować artykułu ze źródła %1, przyczyna: %2 @@ -2574,7 +3043,7 @@ MediaWiki::MediaWikiArticleRequest - + XML parse error: %1 at %2,%3 Błąd podczas analizy pliku XML: %1 w %2,%3 @@ -2582,7 +3051,7 @@ MediaWiki::MediaWikiWordSearchRequest - + XML parse error: %1 at %2,%3 Błąd podczas analizy pliku XML: %1 w %2,%3 @@ -2590,22 +3059,22 @@ MediaWikisModel - + Enabled Włączone - + Name Nazwa - + Address Adres - + Icon Ikona @@ -2618,88 +3087,94 @@ Formularz - + Dictionary order: Kolejność słowników: - - - - ... - ... + ... - + Inactive (disabled) dictionaries: Słowniki nieaktywne (wyłączone): - + Dictionary information Informacje o słowniku - + Name: Nazwa: - + Total articles: Łączna liczba artykułów: - + Total words: Łączna liczba słów: - + Translates from: Tłumaczenia z: - + Translates to: Tłumaczenia na: - + Description: Opis: - + Files comprising this dictionary: Pliki składające się na ten słownik: - + Adjust the order by dragging and dropping items in it. Drop dictionaries to the inactive group to disable their use. Dostosuj kolejność, przeciągając i upuszczając elementy. Upuszczenie słownika w grupie nieaktywnych powoduje jego wyłączenie. - + Sort by name Sortuj wg nazwy - + Sort by languages Sortuj wg języków + + + Dictionary headwords + Hasła słownika + + + + Dictionaries active: %1, inactive: %2 + Słowniki aktywne: %1, nieaktywne: %2 + PathsModel - + Path Ścieżka - + Recursive Uwzględniaj podkatalogi @@ -2707,37 +3182,38 @@ Preferences - + System default Domyślny systemu - + + Default Domyślny - + Modern Nowoczesny - + Lingvo Lingvo - + Babylon Babylon - + Lingoes Lingoes - + Lingoes-Blue Lingoes niebieski @@ -2746,12 +3222,12 @@ Odtwarzaj w DirectShow - + Changing Language Zmiana języka - + Restart the program to apply the language change. Uruchom ponownie program, aby zastosować zmianę języka. @@ -2853,12 +3329,12 @@ Styl wyświetlania: - + &Scan Popup &Skanowanie automatyczne - + When enabled, a translation popup window would be shown each time you point your mouse on any word on the screen (Windows) or select any word with mouse (Linux). When enabled, you can switch it on and @@ -2869,7 +3345,7 @@ głównego lub z paska zadań. - + Enable scan popup functionality Włącz funkcję skanowania automatycznego @@ -2926,141 +3402,146 @@ Styl dodatku: - + + Help language + Język pomocy + + + Adjust this value to avoid huge context menus. Dostosuj tę wartość, aby uniknąć zbyt dużych menu kontekstowych. - + Context menu dictionaries limit: Limit słowników w menu kontekstowym: - + Chooses whether the scan popup mode is on by default or not. If checked, the program would always start with the scan popup active. Wskazuje, czy tryb skanowania automatycznego jest domyślnie włączony, czy nie. Zaznaczenie tej opcji powoduje, że program uruchamia się z włączonym skanowaniem automatycznym. - + Start with scan popup turned on Uruchamiaj z włączoną funkcją skanowania automatycznego - + With this enabled, the popup would only show up if all chosen keys are in the pressed state when the word selection changes. Włączenie tej opcji powoduje, że okienko wyskakujące jest wyświetlane tylko wtedy, kiedy zaznaczenie słowa ulega zmianie przy naciśniętych wszystkich wybranych klawiszach. - + Only show popup when all selected keys are kept pressed: Wyświetlaj okienko wyskakujące tylko po naciśnięciu wszystkich wybranych klawiszy: - + Left Ctrl only Tylko lewy Ctrl - + Left Ctrl Lewy Ctrl - + Right Shift only Tylko prawy Shift - + Right Shift Prawy Shift - + Alt key Klawisz Alt - + Alt Alt - + Ctrl key Klawisz Ctrl - + Ctrl Ctrl - + Left Alt only Tylko lewy Alt - + Left Alt Lewy Alt - + Shift key Klawisz Shift - + Shift Shift - + Right Alt only Tylko prawy Alt - + Right Alt Prawy Alt - + Right Ctrl only Tylko prawy Ctrl - + Right Ctrl Prawy Ctrl - + Left Shift only Tylko lewy Shift - + Left Shift Lewy Shift - + Windows key or Meta key Klawisz Windows/Meta - + Win/Meta Win/Meta - + Normally, in order to activate a popup you have to maintain the chosen keys pressed while you select a word. With this enabled, the chosen keys may also @@ -3070,37 +3551,72 @@ że wybrane klawisze można nacisnąć krótko po zaznaczeniu słowa. - + Send translated word to main window instead of to show it in popup window Wyślij przetłumaczone słowo do okna głównego, a nie wyświetlaj w okienku wyskakującym - + Send translated word to main window Wyślij przetłumaczone słowo do okna głównego - + Playback Odtwarzanie - + + System proxy + Systemowy serwer proxy + + + + Custom proxy + Niestandardowy serwer proxy + + + + Custom settings + Ustawienia niestandardowe + + + + Full-text search + Wyszukiwanie pełnotekstowe + + + + Allow full-text search for: + Zezwalaj na wyszukiwanie pełnotekstowe w źródłach: + + + + Don't search in dictionaries containing more than + Nie wyszukuj w słownikach, w których liczba artykułów przekracza + + + + articles (0 - unlimited) + (0 — bez ograniczenia) + + + Select this option to automatic collapse big articles Zaznacz tę opcję, aby automatycznie zwijać duże artykuły - + Collapse articles more than Zwijaj artykuły większe niż - + Articles longer than this size will be collapsed Artykuły o długości przekraczającej tę wartość będą zwijane - + symbols symboli @@ -3133,27 +3649,27 @@ Odtwarzaj za pomocą biblioteki BASS - + Use any external program to play audio files Używaj zewnętrznego programu do odtwarzania plików dźwiękowych - + Use external program: Używaj programu zewnętrznego: - + Ad&vanced &Zaawansowane - + ScanPopup extra technologies Dodatkowe technologie skanowania automatycznego - + Try to use IAccessibleEx technology to retrieve word under cursor. This technology works only with some programs that support it (for example Internet Explorer 9). @@ -3164,12 +3680,12 @@ Nie ma potrzeby włączania tej opcji, gdy takie programy nie są używane. - + Use &IAccessibleEx Używaj &IAccessibleEx - + Try to use UI Automation technology to retrieve word under cursor. This technology works only with some programs that support it. It is not needed to select this option if you don't use such programs. @@ -3178,12 +3694,12 @@ Nie ma potrzeby włączania tej opcji, gdy takie programy nie są używane. - + Use &UIAutomation Używaj &UIAutomation - + Try to use special GoldenDict message to retrieve word under cursor. This technology works only with some programs that support it. It is not needed to select this option if you don't use such programs. @@ -3192,72 +3708,72 @@ Nie ma potrzeby włączania tej opcji, gdy takie programy nie są używane. - + Use &GoldenDict message Używaj komunikatu programu &GoldenDict - + History Historia - + Turn this option on to store history of the translated words Włącz tę opcję, aby zapisywać historię tłumaczonych słów - + Store &history Zapisuj &historię - + Specify the maximum number of entries to keep in history. Określ maksymalną liczbę słów przechowywanych w historii - + Maximum history size: Maksymalna wielkość historii: - + History saving interval. If set to 0 history will be saved only during exit. Interwał zapisywania historii. Wartość zero oznacza, że historia jest zapisywana tylko przy wychodzeniu z programu. - + Save every Zapisuj co - + minutes min - + Articles Artykuły - + Turn this option on to always expand optional parts of articles Włącz tę opcję, aby zawsze rozwijać opcjonalne części artykułów - + Expand optional &parts Rozwijaj części o&pcjonalne - + Keys may also be pressed afterwards, within Klawisze można nacisnąć nie więcej niż - + To avoid false positives, the keys are only monitored after the selection's done for a limited amount of seconds, which is specified here. @@ -3265,32 +3781,32 @@ tylko przez podaną tutaj liczbę sekund po zaznaczeniu słowa. - + secs sek. później - + Hotkeys &Klawisze skrótu - + Use the following hotkey to show or hide the main window: Używaj tego klawisza skrótu do wyświetlenia lub ukrycia okna głównego: - + Use the following hotkey to translate a word from clipboard: Używaj tego klawisza skrótu do przetłumaczenia słowa znajdującego się w schowku: - + The hotkeys are global and work from any program and within any context as long as GoldenDict is running in background. Te klawisze skrótu są globalne i działają w każdym kontekście każdego programu, o ile tylko program GoldenDict działa w tle. - + <!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; } @@ -3303,79 +3819,79 @@ <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" color:#ff0000;">Uwaga: prawdopodobnie w tym systemie działa wersja serwera XServer X.Org z uszkodzonym rozszerzeniem RECORD. Klawisze skrótu w programie GoldenDict prawdopodobnie nie będą funkcjonować. Należy to naprawić w samym serwerze. Zapoznaj się z następującym </span><a href="https://bugs.freedesktop.org/show_bug.cgi?id=20500"><span style=" text-decoration: underline; color:#0000ff;">opisem błędu</span></a><span style=" color:#ff0000;"> i jeśli chcesz, dopisz swój komentarz.</span></p></body></html> - + &Audio &Dźwięk - + Pronunciation Wymowa - + Auto-pronounce words in main window Automatycznie wymawiaj słowa znajdujące się w oknie głównym - + Auto-pronounce words in scan popup Automatycznie wymawiaj słowa znajdujące się w okienku wyskakującym - + Play audio files via FFmpeg(libav) and libao Odtwarzaj pliki audio za pomocą FFmpeg(libav) i libao - + Use internal player Używaj odtwarzacza wewnętrznego - + &Network Si&eć - + Enable if you wish to use a proxy server for all program's network requests. Włącz, aby używać serwera proxy we wszystkich żądaniach sieciowych programu. - + Use proxy server Używaj serwera proxy - + Type: Typ: - + Host: Host: - + Port: Port: - + User: Użytkownik: - + Password: Hasło: - + Enabling this would make GoldenDict block most advertisements by disallowing content (images, frames) not originating from the site you are browsing. If some site breaks because of this, try disabling this. @@ -3385,12 +3901,12 @@ niedziałania niektórych witryn. - + Disallow loading content from other sites (hides most advertisements) Nie zezwalaj na wyświetlanie treści pochodzących z innych witryn (ukrywa większość reklam) - + Enabling this would allow to listen to sound pronunciations from online dictionaries that rely on Flash or other web plugins. Plugin must be installed for this option to work. @@ -3399,24 +3915,24 @@ Działanie tej opcji wymaga zainstalowania odpowiedniej wtyczki. - + Enable web plugins Włącz wtyczki internetowe - + Some sites detect GoldenDict via HTTP headers and block the requests. Enable this option to workaround the problem. Niektóre witryny wykrywają program GoldenDict za pomocą nagłówków HTTP i blokują żądania. Włącz tę opcję, aby obejść ten problem. - + Do not identify GoldenDict in HTTP headers Nie identyfikuj programu GoldenDict w nagłówkach HTTP - + When this is enabled, the program periodically checks if a new, updated version of GoldenDict is available for download. If it is so, the program @@ -3429,7 +3945,7 @@ otwarcia strony pobierania. - + Check for new program releases periodically Sprawdzaj okresowo dostępność nowej wersji programu @@ -3437,27 +3953,27 @@ ProgramTypeEditor - + Audio Dźwięk - + Plain Text Zwykły tekst - + Html Html - + Prefix Match Zgodność przedrostków - + Unknown Nieznane @@ -3483,27 +3999,27 @@ ProgramsModel - + Enabled Włączone - + Type Typ - + Name Nazwa - + Command Line Wiersz komend - + Icon Ikona @@ -3511,12 +4027,14 @@ QObject - + + Article loading error Błąd ładowania artykułu - + + Article decoding error Błąd dekodowania artykułu @@ -3627,18 +4145,18 @@ ResourceToSaveHandler - - + + ERROR: %1 BŁĄD: %1 - + Resource saving error: Błąd zapisu zasobu: - + The referenced resource failed to download. Nie powiodło się pobranie wskazywanego zasobu. @@ -3646,12 +4164,12 @@ Romaji - + Hepburn Romaji for Hiragana Hepburn Romaji dla Hiragana - + Hepburn Romaji for Katakana Hepburn Romaji dla Katakana @@ -3680,21 +4198,21 @@ Pokaż znalezione (Alt+M) - - - - - + + + + + ... ... - + Back Wstecz - + Forward Dalej @@ -3703,32 +4221,32 @@ Alt+M - + Pronounce Word (Alt+S) Wymowa słowa (Alt+S) - + Alt+S Alt+S - + Send word to main window (Alt+W) Wyślij słowo do okna głównego (Alt+W) - + Alt+W Alt+W - + Shows or hides the dictionary bar Wyświetla lub ukrywa pasek słowników - + Use this to pin down the window so it would stay on screen, could be resized or managed in other ways. Opcja ta umożliwia przypięcie okna na stałe do ekranu. Dzięki @@ -3739,8 +4257,8 @@ GoldenDict - - + + %1 - %2 %1– %2 @@ -3748,17 +4266,17 @@ SoundDirsModel - + Path Ścieżka - + Name Nazwa - + Icon Ikona @@ -3766,45 +4284,47 @@ Sources - + Text to Speech Tekst na mowę - + (not available in portable version) (niedostępne w wersji przenośnej) - - - + + + Choose a directory Wybierz katalog - - - - - + + + + + + Confirm removal Potwierdzenie usunięcia - - + + Remove directory <b>%1</b> from the list? Czy usunąć katalog <b>%1</b> z listy? - - + + + Remove site <b>%1</b> from the list? Czy usunąć witrynę <b>%1</b> z listy? - + Remove program <b>%1</b> from the list? Czy usunąć program <b>%1</b> z listy? @@ -3823,7 +4343,8 @@ - + + &Add... &Dodaj... @@ -3832,7 +4353,8 @@ - + + &Remove &Usuń @@ -3912,7 +4434,7 @@ Można też użyć ciągu znaków %GD1251% dla słów w stronie kodowej CP1251 lub ciągu znaków %GDISO1% dla słów w stronie kodowej ISO 8859-1. - + Programs Programy @@ -3921,27 +4443,27 @@ Wszystkie programy zewnętrzne. Ciąg znaków %GDWORD% zostaje zastąpiony wyszukiwanym słowem. To słowo zostaje także umieszczone w standardowym wejściu. - + Forvo Forvo - + Live pronunciations from <a href="http://www.forvo.com/">forvo.com</a>. The site allows people to record and share word pronunciations. You can listen to them from GoldenDict. Rzeczywista wymowa z witryny <a href="http://www.forvo.com/">forvo.com</a>. Witryna ta umożliwia rejestrowanie i udostępnianie wzorów wymowy słów. Można z nich korzystać w programie GoldenDict. - + Enable pronunciations from Forvo Włącz dostęp do wymowy w witrynie Forvo - + API Key: Klucz API: - + Use of Forvo currently requires an API key. Leave this field blank to use the default key, which may become unavailable in the future, or register on the site to get your own key. @@ -3950,7 +4472,7 @@ dostępny, lub zarejestruj się w tej witrynie, aby uzyskać własny klucz API. - + Get your own key <a href="http://api.forvo.com/key/">here</a>, or leave blank to use the default one. Uzyskaj własny klucz <a href="http://api.forvo.com/key/">tutaj</a> lub pozostaw puste pole, aby użyć klucza domyślnego. @@ -3980,79 +4502,89 @@ %GDBIG5% dla Big-5, %GDBIG5HKSCS% dla Big5-HKSCS, %GDGBK% dla GBK i GB18030, %GDSHIFTJIS% dla Shift-JIS. + + DICT servers + Serwery DICT + + + DICT servers: + Serwery DICT: + + + Any external programs. A string %GDWORD% will be replaced with the query word. If such string is not presented, the word will be fed into standard input. Dowolne programy zewnętrzne. Ciąg znaków %GDWORD% zostanie zastąpiony wyszukiwanym słowem. Przy braku tego ciągu znaków, słowo zostanie przesłane do standardowego wejścia. - + Language codes (comma-separated): Kody języków (rozdzielone przecinkami): - + List of language codes you would like to have. Example: "en, ru". Lista wybranych kodów języków. Na przykład: „en, ru, pl”. - + Full list of language codes is available <a href="http://www.forvo.com/languages-codes/">here</a>. Pełna lista kodów języków jest dostępna <a href="http://www.forvo.com/languages-codes/">tutaj</a>. - + Transliteration Transliteracja - + Russian transliteration Transliteracja rosyjska - + Greek transliteration Transliteracja grecka - + German transliteration Transliteracja niemiecka - + Belarusian transliteration Transliteracja białoruska - + Enables to use the Latin alphabet to write the Japanese language Umożliwia pisanie w języku japońskim za pomocą alfabetu łacińskiego - + Japanese Romaji Japońskie Rōmaji - + Systems: Systemy: - + The most widely used method of transcription of Japanese, based on English phonology Najczęściej używana metoda transkrypcji języka japońskiego oparta na wymowie angielskiej - + Hepburn Hepburn - + The most regular system, having a one-to-one relation to the kana writing systems. Standardized as ISO 3602 @@ -4063,12 +4595,12 @@ Systemu tego nie zaimplementowano jeszcze w programie GoldenDict. - + Nihon-shiki Nihon-shiki - + Based on Nihon-shiki system, but modified for modern standard Japanese. Standardized as ISO 3602 @@ -4080,32 +4612,32 @@ Systemu tego nie zaimplementowano jeszcze w programie GoldenDict. - + Kunrei-shiki Kunrei-shiki - + Syllabaries: Zapisy sylabiczne: - + Hiragana Japanese syllabary Japoński zapis sylabiczny Hiragana - + Hiragana Hiragana - + Katakana Japanese syllabary Japoński zapis sylabiczny Katakana - + Katakana Katakana @@ -4235,22 +4767,22 @@ WebSitesModel - + Enabled Włączone - + Name Nazwa - + Address Adres - + Icon Ikona @@ -4258,7 +4790,7 @@ WordFinder - + Failed to query some dictionaries. Nie powiodło się przeszukanie niektórych słowników. diff -Nru goldendict-1.5.0~git20131003/locale/pt_BR.ts goldendict-1.5.0~git20150923/locale/pt_BR.ts --- goldendict-1.5.0~git20131003/locale/pt_BR.ts 2013-10-02 20:42:04.000000000 +0000 +++ goldendict-1.5.0~git20150923/locale/pt_BR.ts 2015-09-23 08:26:24.000000000 +0000 @@ -34,7 +34,7 @@ [Desconhecido] - + Based on Qt %1 (%2, %3 bit) Baseado no Qt %1 (%2, %3 bit) @@ -42,63 +42,63 @@ ArticleMaker - + Expand article Expandir artigo - + Collapse article Recolher artigo - + No translation for <b>%1</b> was found in group <b>%2</b>. Não achei nenhuma definição ou tradução da palavra/expressão <b>%1</b> no grupo <b>%2</b>. - + No translation was found in group <b>%1</b>. Não achei a palavra no grupo <b>%1</b>. - + Welcome! Bem-vindo! - + <h3 align="center">Welcome to <b>GoldenDict</b>!</h3><p>To start working with the program, first visit <b>Edit|Dictionaries</b> to add some directory paths where to search for the dictionary files, set up various Wikipedia sites or other sources, adjust dictionary order or create dictionary groups.<p>And then you're ready to look up your words! You can do that in this window by using a pane to the left, or you can <a href="Working with popup">look up words from other active applications</a>. <p>To customize program, check out the available preferences at <b>Edit|Preferences</b>. All settings there have tooltips, be sure to read them if you are in doubt about anything.<p>Should you need further help, have any questions, suggestions or just wonder what the others think, you are welcome at the program's <a href="http://goldendict.org/forum/">forum</a>.<p>Check program's <a href="http://goldendict.org/">website</a> for the updates. <p>(c) 2008-2013 Konstantin Isakov. Licensed under GPLv3 or later. <h3 align="center">Bem vindo ao <b>GoldenDict</b>!</h3><p>Para começar a trabalhar com o programa, primeiro visite <b>Editar|Dicionários</b> para adicionar alguns caminhos de diretório, onde procuram os arquivos de dicionários, configurar vários sites da Wikipedia ou outras fontes, ajustar a ordem de dicionário ou criar grupos de dicionários.<p>E então você estará pronto para visualizar suas palavras! Você pode fazer isso nesta janela usando o painel à esquerda, ou você pode <a href="Trabalhando com pop-up">procurar palavras a partir de outras aplicações ativas</a>. <p>Para personalizar o programa, confira as preferências disponíveis no <b>Editar|Preferências</b>. Todas as configurações tem dicas, não deixe de lê-las, se você estiver em dúvida sobre qualquer coisa.<p>Se você precisar de mais ajuda, têm qualquer dúvida, sugestões ou apenas saber o que os outros pensam, você é bem-vindo ao programa de <a href="http://goldendict.org/forum/">forum</a>.<p>Confira o programa do <a href="http://goldendict.org/">website</a> para atualizações. <p>(c) 2008-2013 Konstantin Isakov. Licenciado sob GPLv3 ou posterior. - + Working with popup Trabalhando com janelas de definições/tradução semiautomáticas - + <h3 align="center">Working with the popup</h3>To look up words from other active applications, you would need to first activate the <i>"Scan popup functionality"</i> in <b>Preferences</b>, and then enable it at any time either by triggering the 'Popup' icon above, or by clicking the tray icon down below with your right mouse button and choosing so in the menu you've popped. <h3 align="center">Trabalhando com janelas de definições/tradução semiautomáticas</h3>Para fazer consultas/tradução de palavras da janela de outros aplicativos abertos, primeiramente é necessário habilitar a função de janelas secundárias seguindo estes passos a partir da janela principal:<p><OL><LI>Clique em <b>Editar|Configurar</b>; <LI>Clique na guia <b><i>"Janela de Definições Semiautomáticas"</b></i>;<LI>Marque a opção <i>"Ativar funcionalidades de janelas secundárias de definições semiautomáticas"</i>;<LI>Em seguida, clique em "OK" para salvar as configurações.</OL><p>Com esta opção ativada, você pode marcar ou desmarcar a exibição das janelas secundárias quando quiser. Para fazê-lo, há duas formas:<UL><LI>Na janela principal, clique no botão de <b>Definições Semiautomáticas</b>, cujo botão assemelha-se a uma varinha;<LI>No ícone do programa exibido na Área de Notificação (perto do relógio), clique com o botão direito do mouse e marque a opção <b><i>Definições Semiautomáticas</b></i>.</UL><p>Uma vez habilitada esta função, qualquer palavra ou expressão selecionada terá suas definições exibidas (se a palavra/expressão da consulta existir em algum dos dicionários especificados na configuração) imediatamente nos resultados da consulta. - + Then just stop the cursor over the word you want to look up in another application, and a window would pop up which would describe it to you. Basta pairar o ponteiro do mouse sobre a palavra/expressão exibida em uma janela qualquer e que desejar consultar que será exibida uma janela com as definições/tradução. - + Then just select any word you want to look up in another application by your mouse (double-click it or swipe it with mouse with the button pressed), and a window would pop up which would describe the word to you. Com isso, você pode consultar ou traduzir palavra/expressão da janela de qualquer programa que seja selecionável ou em que se possa clicar duplamente. Alás, um clique duplo do mouse, por exemplo, seleciona uma palavra, ao passo que um clique triplo, uma frase inteira. - + (untitled) (sem título) - + (picture) (imagem) @@ -106,37 +106,37 @@ ArticleRequest - + Expand article Expandir artigo - + From Resultados de - + Collapse article Recolher artigo - + Query error: %1 Erro de Consulta: %1 - + Close words: Palavras semelhantes: - + Compound expressions: Termos compostos: - + Individual words: Palavras independentes: @@ -149,219 +149,222 @@ Formulário - + about:blank sobre:branco - + x x - + Find: Localizar: - + + &Previous A&nterior - + + &Next &Próxima - + Ctrl+G Ctrl+G - + &Case Sensitive &Diferenciar maiúsculas/minúsculas - + Highlight &all Destacar &tudo - + Resource Fonte de Dados - + Audio Áudio - + TTS Voice Voz TTS - + Picture Imagem - + Video Vídeo - + Video: %1 Vídeo: %1 - + Definition from dictionary "%1": %2 Definição do dicionário "%1": %2 - + Definition: %1 Definição: %1 - - + + The referenced resource doesn't exist. A fonte de dados procurada não existe. - + The referenced audio program doesn't exist. O programa de áudio especificado não existe. - + + ERROR: %1 Erro: %1 - + Save sound Salvar som - + Sound files (*.wav *.ogg *.mp3 *.mp4 *.aac *.flac *.mid *.wv *.ape);;All files (*.*) Arquivos de som (*.wav *.ogg *.mp3 *.mp4 *.aac *.flac *.mid *.wv *.ape);;Todos os arquivos (*.*) - + Save image Salvar imagem - + Image files (*.bmp *.jpg *.png *.tif);;All files (*.*) Arquivos de imagem (*.bmp *.jpg *.png *.tif);;Todos os arquivos (*.*) - + &Open Link Abrir Ligação (&O) - + Open Link in New &Tab Abrir Ligação em Nova Guia (&G) - + Open Link in &External Browser Abrir Ligação em &Navegador da Web Externo - + Save &image... Salvar &imagem... - + Save s&ound... Salvar S&om... - + &Look up "%1" &Procurar "%1" - + Look up "%1" in &New Tab Exibir resultado de "%1" em &nova guia - + Send "%1" to input line Enviar "%1" para o campo - - + + &Add "%1" to history &Adicionar "%1" ao histórico - + Look up "%1" in %2 Procurar «%1» em %2 - + Look up "%1" in %2 in &New Tab Exibir o resultado da consulta de "%1" no %2 em &nova aba - + WARNING: FFmpeg Audio Player: %1 AVISO: Player de Áudio FFmpeg: %1 - + Failed to run a player to play sound file: %1 Não foi possível executar o reprodutor de áudio: %1 - + Failed to create temporary file. Não foi possível criar o arquivo temporário. - + Failed to auto-open resource file, try opening manually: %1. Não foi possível abrir a fonte de dados automaticamente. Tente abri-la manualmente: %1. - + WARNING: %1 ATENÇÃO: %1 - + Select Current Article Selecionar o Artigo Atual - + Copy as text Copiar como texto - + Inspect Inspecionar - + The referenced resource failed to download. Não foi possível efetuar o download do arquivo de fontes de dados. @@ -387,6 +390,29 @@ + Dialog + + + Proxy authentication required + + + + + You need to supply a Username and a Password to access via proxy + + + + + Username: + + + + + Password: + Senha: + + + DictGroupWidget @@ -487,6 +513,119 @@ + DictHeadwords + + + Search mode + + + + + This element determines how filter string will be interpreted + + + + + If checked on the symbols case will be take in account when filtering + + + + + Match case + + + + + Exports headwords to file + + + + + Export + + + + + Help + + + + + OK + + + + + Press this button to apply filter to headwords list + + + + + Apply + + + + + If checked any filter changes will we immediately applied to headwords list + + + + + Auto apply + + + + + Filter: + + + + + Filter string (fixed string, wildcards or regular expression) + + + + + Text + + + + + Wildcards + + + + + RegExp + + + + + Unique headwords total: %1, filtered: %2 + + + + + Save headwords to file + + + + + Text files (*.txt);;All files (*.*) + Arquivos de texto (*.txt);;Todos os arquivos (*.*) + + + + Export headwords... + + + + + Cancel + Cancelar + + + DictInfo @@ -529,6 +668,16 @@ Descrição: + + Show all unique dictionary headwords + + + + + Headwords + + + Edit the dictionary via command: %1 @@ -545,6 +694,74 @@ + DictServer + + + Url: + + + + + Databases: + + + + + Search strategies: + + + + + Server databases + + + + + DictServersModel + + + Enabled + + + + + Name + Nome + + + + Address + Endereço + + + + Databases + + + + + Strategies + + + + + Icon + Ícone + + + + Comma-delimited list of databases +(empty string or "*" matches all databases) + + + + + Comma-delimited list of search strategies +(empty string mean "prefix" strategy) + + + + DictionaryBar @@ -562,17 +779,22 @@ Editar este grupo - + Dictionary info Informs. do Dicionário - + + Dictionary headwords + + + + Open dictionary folder Abrir pasta de dicionário - + Edit dictionary Editar dicionário @@ -585,39 +807,39 @@ Dicionários - + &Sources &Fontes - - + + &Dictionaries &Dicionários - - + + &Groups &Grupos - + Sources changed Fontes modificadas - + Some sources were changed. Would you like to accept the changes? Algumas fontes de dados foram modificadas. Devo aceitar as modificações? - + Accept Aceitar - + Cancel Cancelar @@ -631,6 +853,92 @@ + FTS::FtsIndexing + + + None + Nenhum + + + + FTS::FullTextSearchDialog + + + Full-text search + + + + + Whole words + + + + + Plain text + + + + + Wildcards + + + + + RegExp + + + + + Max distance between words (%1-%2): + + + + + Max articles per dictionary (%1-%2): + + + + + + + Articles found: + + + + + Now indexing: + + + + + CJK symbols in search string are not compatible with search modes "Whole words" and "Plain text" + + + + + The search line must contains at least one word containing + + + + + or more symbols + + + + + No dictionaries for full-text search + + + + + FTS::Indexing + + + None + Nenhum + + + Forvo::ForvoArticleRequest @@ -669,6 +977,65 @@ + FullTextSearchDialog + + + + Search + + + + + Match case + + + + + Mode: + + + + + Articles found: + + + + + Available dictionaries in group: + + + + + Wait for indexing: + + + + + Total: + + + + + Indexed: + + + + + Now indexing: None + + + + + Cancel + Cancelar + + + + Help + + + + GermanTranslit @@ -799,7 +1166,7 @@ - + Remove all groups Re&mover todos @@ -809,42 +1176,100 @@ Arraste e solte os &dicionários nos grupos, organize-os e reordene-os com o ponteiro do mouse. - + + Group tabs + + + + + Open groups list + + + + Add group Adicionar grupo - + Give a name for the new group: Digite o nome do grupo que deseja criar: - + Rename group Renomear grupo - + Give a new name for the group: Digite o novo nome do grupo: - + Remove group Remover grupo - + Are you sure you want to remove the group <b>%1</b>? Tem certeza de que quer remover o grupo <b>%1</b>? - + Are you sure you want to remove all the groups? Tem certeza de que quer remover todos os grupos? + Help::HelpWindow + + + GoldenDict help + + + + + Home + + + + + Back + + + + + Forward + + + + + Zoom In + Aumentar as letras das definições + + + + Zoom Out + Diminuir as letras das definições + + + + Normal Size + Restaurar as letras das definições + + + + Content + + + + + Index + + + + HistoryPaneWidget @@ -875,12 +1300,12 @@ Hunspell - + Spelling suggestions: Sugestões ortográficas: - + %1 Morphology Ortografia de %1 @@ -888,12 +1313,12 @@ HunspellDictsModel - + Enabled Habilitado - + Name Nome @@ -1933,7 +2358,7 @@ LoadDictionaries - + Error loading dictionaries Erro ao carregar dicionários @@ -1941,7 +2366,7 @@ Main - + Error in configuration file. Continue with default settings? Erro no arquivo de configuração. Continuar com as configurações padrão? @@ -1950,534 +2375,575 @@ MainWindow - + Welcome! Bem-vindo! - + &File &Arquivo - + &Edit &Editar - + &Help Aj&uda - + &View Exi&bir - + &Zoom &Zoom - + H&istory His&tórico - + + Search + + + + &Search Pane &Painel de Pesquisa - + &Results Navigation Pane &Painel de Navegação Resultados - + &History Pane & Painel Histórico - + &Dictionaries... &Dicionários... - + F3 F3 - + &Preferences... &Configurar... - + F4 F4 - + &Homepage &Site do programa - + &About S&obre - + About GoldenDict Sobre o GoldenDict - + + GoldenDict reference + + + + F1 F1 - - + + &Quit &Fechar o GoldenDict - + Quit from application Fechar o programa - + Ctrl+Q Ctrl+Q - + &Forum &Fórum - + &Close To Tray &Pôr na Área de Notificação - + Minimizes the window to tray Minimiza a janela como ícone na Área de Notificação - + Ctrl+F4 Ctrl+F4 - + &Save Article &Salvar verbete - + Save Article Salva o verbete atual - + F2 F2 - + &Print &Imprimir - + Ctrl+P Ctrl+P - + Page Set&up &Configurar Impressão - + Print Pre&view Pré-&visualizar Impressão - + &Rescan Files &Re-escanear Arquivos - + &New Tab &Nova Aba - + &Always on Top &Sempre no Topo - + Always on Top Sempre no Topo - + Ctrl+O Ctrl+O - - - + + + Menu Button Botão Menu - + + Search in page + + + + + Ctrl+F + + + + + Full-text search + + + + + Ctrl+Shift+F + + + + Ctrl+F5 Ctrl+F5 - + &Clear &Limpar - + New Tab Nova guia - + Ctrl+T Ctrl+T - + &Configuration Folder Pasta de &configuração - - + + &Show E&xibir - + Ctrl+H Ctrl+H - + &Export &Exportar - + &Import &Importar - + &Menubar Barra de &Menus - - + + Look up in: Procurar em: - + Found in Dictionaries: Achado nos dicionários: - + Back Anterior - + Forward Seguinte - + Scan Popup Definição Semiautomática - + Pronounce Word (Alt+S) Pronuncia a palavra da consulta atual (Alt+S) - + Zoom In Aumentar as letras das definições - + Zoom Out Diminuir as letras das definições - + Normal Size Restaurar as letras das definições - + Words Zoom In Aumentar as letras dos verbetes - + Words Zoom Out Diminuir as letras dos verbetes - + Words Normal Size Restaurar as letras dos verbetes - + Show &Main Window &Mostrar a janela principal - + Close current tab Fechar a guia atual - + Close all tabs Fechar todas as guias - + Close all tabs except current Fechar todas as guias com exceção da atual - + Loading... Carregando... - + + String to search in dictionaries. The wildcards '*', '?' and sets of symbols '[...]' are allowed. +To find '*', '?', '[', ']' symbols use '\*', '\?', '\[', '\]' respectively + + + + %1 dictionaries, %2 articles, %3 words %1 dicionário, %2 verbetes, %3 palavras - + Look up: Procurar: - + All Todos os Dicionários - + Opened tabs Guias abertas - + Show Names in Dictionary &Bar Mostrar Nomes na &Barra de Dicionário - + Show Small Icons in &Toolbars Exibir Ícones Pequenos na &Barra de Tarefas - + &Navigation &Navegação - + Open Tabs List Abrir a lista de guias - + (untitled) (sem título) - + %1 - %2 %1 - %2 - + Failed to initialize hotkeys monitoring mechanism.<br>Make sure your XServer has RECORD extension turned on. Não foi possível acionar o mecanismo de monitoramento por atalho.<br>Veja se seu XServer está com a extensão RECORD ativada. - + New Release Available Nova Versão Disponível - + Version <b>%1</b> of GoldenDict is now available for download.<br>Click <b>Download</b> to get to the download page. A versão <b>%1</b> do GoldenDict está disponível para download. - + Download Baixar - + Skip This Release Ignorar esta versão - - + + Accessibility API is not enabled Acessibilidade a API não está habilitada - + You have chosen to hide a menubar. Use %1 to show it back. Você optou por ocultar a barra de menus. Use %1 para exibi-la de novo. - + Ctrl+M Ctrl+M - + Page Setup Configuração de Página - + No printer is available. Please install one first. Não achei nenhuma impressora. Favor instalar uma. - + Print Article Imprimir Verbete - + Article, Complete (*.html) Artigo, Completo (*.html) - + Article, HTML Only (*.html) Artigo, Apenas HTML (*.html) - + Save Article As Salvar Verbete como - + Error Erro! - + Can't save article: %1 Não foi possível salvar o verbete: %1 - + Saving article... Salvando artigo... - + The main window is set to be always on top. A janela principal está definida para estar sempre no topo. - + &Hide &Ocultar - + Export history to file Exportar o histórico - - + + Text files (*.txt);;All files (*.*) Arquivos de texto (*.txt);;Todos os arquivos (*.*) - + History export complete Feita a exportação do histórico - + Export error: Erro de exportação: - + Import history from file Importar histórico de arquivo - + Import error: invalid data in file Erro ao tentar importar: dados inválidos no arquivo. - + History import complete Feita a importação do histórico. - + Import error: Erro de importação: - + Dictionary info Inform. do Dicionário - + + Dictionary headwords + + + + Open dictionary folder Abrir pasta de dicionário - + Edit dictionary Editar dicionário @@ -2485,12 +2951,12 @@ Mdx::MdxArticleRequest - + Dictionary file was tampered or corrupted Arquivo dicionário foi adulterado ou corrompido - + Failed loading article from %1, reason: %2 Falha ao carregar artigo de %1, motivo: %2 @@ -2498,7 +2964,7 @@ MediaWiki::MediaWikiArticleRequest - + XML parse error: %1 at %2,%3 Erro de análise sintática de XML: %1 em %2,%3 @@ -2506,7 +2972,7 @@ MediaWiki::MediaWikiWordSearchRequest - + XML parse error: %1 at %2,%3 Erro de análise sintática de XML: %1 em %2,%3 @@ -2514,22 +2980,22 @@ MediaWikisModel - + Enabled Habilitado - + Name Nome - + Address Endereço - + Icon Ícone @@ -2542,89 +3008,95 @@ Formulário - + Dictionary order: Ordem dos dicionários: - - - - ... - ... + ... - + Inactive (disabled) dictionaries: Dicionários desativados: - + Dictionary information Informações sobre dicionários - + Name: Nome: - + Total articles: Total de verbetes: - + Total words: Total de palavras: - + Translates from: Traduz do: - + Translates to: Para o: - + Description: Descrição: - + Files comprising this dictionary: Arquivos deste dicionário: - + Adjust the order by dragging and dropping items in it. Drop dictionaries to the inactive group to disable their use. Para ordenar os dicionários, arraste-os como desejar. Se quiser desativar dicionários, arraste-os para o grupo de desativados. - + Sort by name Organizar por nome - + Sort by languages Organizar por idiomas + + + Dictionary headwords + + + + + Dictionaries active: %1, inactive: %2 + + PathsModel - + Path Caminho - + Recursive Buscar em subpastas @@ -2790,22 +3262,27 @@ Tipo de add-on: - + + Help language + + + + Adjust this value to avoid huge context menus. Ajustar este valor para evitar menus de contexto enormes. - + Context menu dictionaries limit: Limite de dicionários no menu de contexto: - + &Scan Popup &Janela de Definições/Tradução Semiautomáticas - + When enabled, a translation popup window would be shown each time you point your mouse on any word on the screen (Windows) or select any word with mouse (Linux). When enabled, you can switch it on and @@ -2817,135 +3294,135 @@ programa na Área de Notificação. - + Enable scan popup functionality Habilitar funcionalidades de janela de definições/tradução semiautomáticas - + Chooses whether the scan popup mode is on by default or not. If checked, the program would always start with the scan popup active. Permite especificar se a janela secundária de definições/tradução semiautomáticas deve ficar ativa por padrão. Se habilitada esta opção, o programa será sempre executado com a janela secundária ativada. - + Start with scan popup turned on Executar o GoldenDict com a janela de definições/tradução semiautomáticas habilitada - + With this enabled, the popup would only show up if all chosen keys are in the pressed state when the word selection changes. Se habilitada esta opção, a janela de definições/tradução só aparecerá se todas as teclas do atalho estiverem premidas quando a seleção de palavra mudar. - + Only show popup when all selected keys are kept pressed: Só exibir a janela de definições/tradução semiautomática se o usuário premer as teclas escolhidas abaixo: - + Left Ctrl only Ctrl esquerda apenas - + Left Ctrl Ctrl esquerda - + Right Shift only Shift direita apenas - + Right Shift Shift direita - + Alt key Tecla Alt - + Alt Alt - + Ctrl key Tecla Ctrl - + Ctrl Ctrl - + Left Alt only Alt esquerda apenas - + Left Alt Alt esquerda - + Shift key Tecla Shift - + Shift Shift - + Right Alt only Alt direita apenas - + Right Alt Alt direita - + Right Ctrl only Ctrl direita apenas - + Right Ctrl Ctrl direita - + Left Shift only Shift esquerda apenas - + Left Shift Shift esquerda - + Windows key or Meta key Tecla Windows ou Tecla Meta - + Win/Meta Windows/Meta - + Normally, in order to activate a popup you have to maintain the chosen keys pressed while you select a word. With this enabled, the chosen keys may also @@ -2955,12 +3432,12 @@ teclas de atalho podem ser premidas também pouco depois da seleção da palavra/expressão. - + Keys may also be pressed afterwards, within Permitir que as teclas sejam premidas depois também, após... - + To avoid false positives, the keys are only monitored after the selection's done for a limited amount of seconds, which is specified here. @@ -2969,44 +3446,44 @@ dentro do limite de tempo especificado aqui. - + secs segundos - + Send translated word to main window instead of to show it in popup window Envia a palavra traduzida/consultada para a janela principal, em vez de exibi-la numa janela secundária (popup). - + Send translated word to main window Enviar a palavra traduzida/consultada para a janela principal - + Hotkeys Atalhos de Teclado - + Use the following hotkey to show or hide the main window: Usar o seguinte atalho de teclado para mostrar/ocultar a janela principal: - + Use the following hotkey to translate a word from clipboard: Usar o seguinte atalho de teclado para consultar nos dicionários ou traduzir texto da Área de Transferência: - + The hotkeys are global and work from any program and within any context as long as GoldenDict is running in background. Os atalhos de teclado são globais e funcionam a partir de qualquer programa, em qualquer situação ou contexto, desde que o GoldenDict esteja em execução. - + <!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; } @@ -3019,114 +3496,149 @@ <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" color:#ff0000;">Nota: Parece que você está executando uma versão do X.Org XServer com a extensão RECORD quebrada. Os atalhos de teclado talvez não funcionem no GoldenDict. Isso deve ser consertado no próprio servidor. Veja a documentação no site: </span><a href="https://bugs.freedesktop.org/show_bug.cgi?id=20500"><span style=" text-decoration: underline; color:#0000ff;">sugli errori </span></a><span style=" color:#ff0000;"> e deixe um comentário lá, se quiser.</span></p></body></html> - + &Audio &Áudio - + Pronunciation Pronúncia - + Auto-pronounce words in main window Pronunciar palavras na janela principal automaticamente - + Auto-pronounce words in scan popup Pronunciar automaticamente palavras da janela de definições/tradução semiautomáticas - + Playback Reprodução - + Play audio files via FFmpeg(libav) and libao Reproduzir arquivos de áudio via FFmpeg(libav) e libao - + Use internal player Usar player interno - + + System proxy + + + + + Custom proxy + + + + + Custom settings + + + + + Full-text search + + + + + Allow full-text search for: + + + + + Don't search in dictionaries containing more than + + + + + articles (0 - unlimited) + + + + Select this option to automatic collapse big articles Selecione essa opção para automaticamente recolher grandes artigos - + Collapse articles more than Recolher artigos mais de - + Articles longer than this size will be collapsed Artigos mais longos que esse tamanho vai ser recolhido - + symbols símbolos - + Use any external program to play audio files Usa um aplicativo externo para reproduzir arquivos de áudio - + Use external program: Usar programa externo: - + &Network &Rede - + Enable if you wish to use a proxy server for all program's network requests. Habilite esta opção para usar um servidor proxy para todos os acessos à rede pelo programa. - + Use proxy server Usar servidor proxy - + Type: Tipo: - + Host: Servidor: - + Port: Porta: - + User: Usuário: - + Password: Senha: - + Enabling this would make GoldenDict block most advertisements by disallowing content (images, frames) not originating from the site you are browsing. If some site breaks because of this, try disabling this. @@ -3136,12 +3648,12 @@ para ver se o problema é solucionado. - + Disallow loading content from other sites (hides most advertisements) Não permitir o carregamento de conteúdo de outros sites (oculta a maioria das propagandas) - + Enabling this would allow to listen to sound pronunciations from online dictionaries that rely on Flash or other web plugins. Plugin must be installed for this option to work. @@ -3150,24 +3662,24 @@ O plugin precisa estar instalado em seu sistema para isto funcionar. - + Enable web plugins Habilitar plugins da web - + Some sites detect GoldenDict via HTTP headers and block the requests. Enable this option to workaround the problem. Alguns sites detectam GoldenDick via cabeçalhos HTTP e bloqueiam as solicitações. Ative essa opção para solucionar o problema. - + Do not identify GoldenDict in HTTP headers Não identificar GoldenDict nos cabeçalhos HTTP - + When this is enabled, the program periodically checks if a new, updated version of GoldenDict is available for download. If it is so, the program @@ -3178,22 +3690,22 @@ e pergunta se ele deseja visitar a página de download. - + Check for new program releases periodically Procurar atualizações do programa periodicamente - + Ad&vanced A&vançada - + ScanPopup extra technologies Tecnologias exibição de definições/tradução semiautomáticas extras - + Try to use IAccessibleEx technology to retrieve word under cursor. This technology works only with some programs that support it (for example Internet Explorer 9). @@ -3204,12 +3716,12 @@ Não é necessário habilitar esta opção se você não usa programas desse tipo. - + Use &IAccessibleEx Usar &IAccessibleEx - + Try to use UI Automation technology to retrieve word under cursor. This technology works only with some programs that support it. It is not needed to select this option if you don't use such programs. @@ -3218,12 +3730,12 @@ Não é necessário habilitar esta opção se você não usa esses tipos de programa. - + Use &UIAutomation Usar &UIAutomation - + Try to use special GoldenDict message to retrieve word under cursor. This technology works only with some programs that support it. It is not needed to select this option if you don't use such programs. @@ -3232,107 +3744,108 @@ Não é necessário habilitar esta opção se você não usa esses tipos de programas. - + Use &GoldenDict message Usar o comando especial de consulta do &GoldenDict - + History Histórico - + Turn this option on to store history of the translated words Habilite esta opção se quiser gravar o histórico das palavras traduzidas/pesquisadas. - + Store &history Gravar o &histórico - + Specify the maximum number of entries to keep in history. Especifique o número máximo de entradas para manter no histórico. - + Maximum history size: Tamanho máximo do histórico: - + History saving interval. If set to 0 history will be saved only during exit. Intervalo ao salvar o histórico. Se definido histórico como 0, será salvo apenas durante a saída. - + Save every Salvar tudo - + minutes minutos - + Articles Artigos - + Turn this option on to always expand optional parts of articles Habilite esta opção se quise expandir sempre partes opcionais de artigos. - + Expand optional &parts E&xpandir partes opcionais - + System default Padrão do sistema - + + Default Padrão - + Modern Moderno - + Lingvo Lingvo - + Babylon Babylon - + Lingoes Lingoes - + Lingoes-Blue Lingoes-Blue - + Changing Language Modificando Idioma - + Restart the program to apply the language change. Reinicie o programa para aplicar a mudança de idioma. @@ -3340,27 +3853,27 @@ ProgramTypeEditor - + Audio Áudio - + Plain Text Texto simples - + Html Html - + Prefix Match Correspondência de prefixo - + Unknown Desconhecido @@ -3386,27 +3899,27 @@ ProgramsModel - + Enabled Habilitada - + Type Tipo - + Name Nome - + Command Line Linha de comando - + Icon Ícone @@ -3414,12 +3927,14 @@ QObject - + + Article loading error Erro ao carregar Artigo - + + Article decoding error Erro ao decodificar Artigo @@ -3530,18 +4045,18 @@ ResourceToSaveHandler - - + + ERROR: %1 Erro: %1 - + Resource saving error: Erro ao salvar recurso: - + The referenced resource failed to download. O recurso referenciado não conseguiu baixar. @@ -3549,12 +4064,12 @@ Romaji - + Hepburn Romaji for Hiragana Hepburn Romaji para Hiragana - + Hepburn Romaji for Katakana Hepburn Romaji para Katakana @@ -3575,59 +4090,59 @@ Painel - - - - - + + + + + ... ... - + Back Voltar - + Forward Para Frente - + Pronounce Word (Alt+S) Pronunciar a palavra da consulta atual (Alt+S) - + Alt+S Alt+S - + Send word to main window (Alt+W) Enviar palavra para a janela principal (Alt+W) - + Alt+W Alt+W - + Shows or hides the dictionary bar Mostra ou oculta a barra de dicionários - + Use this to pin down the window so it would stay on screen, could be resized or managed in other ways. Use esta opção para fixar a janela do GoldenDict na frente das outras janelas, redimensioná-la ou geri-la à vontade. - - + + %1 - %2 %1 - %2 @@ -3635,17 +4150,17 @@ SoundDirsModel - + Path Caminho - + Name Nome - + Icon Ícone @@ -3667,7 +4182,8 @@ - + + &Add... &Adicionar... @@ -3676,7 +4192,8 @@ - + + &Remove &Remover @@ -3753,32 +4270,32 @@ Especifique qualquer site que desejar. O demarcador %GDWORD% será substituído pela palavra da consulta do usuário: - + Programs Programas - + Forvo Forvo - + Live pronunciations from <a href="http://www.forvo.com/">forvo.com</a>. The site allows people to record and share word pronunciations. You can listen to them from GoldenDict. Pronunciar palavras diretamente de <a href="http://www.forvo.com/">forvo.com</a>. Este site permite gravar e compartilhar pronúncias de palavras. É possível ouvi-las no GoldenDict. - + Enable pronunciations from Forvo Habilitar pronúncias do Forvo - + API Key: Chave API: - + Use of Forvo currently requires an API key. Leave this field blank to use the default key, which may become unavailable in the future, or register on the site to get your own key. @@ -3788,7 +4305,7 @@ obter sua própria chave. - + Get your own key <a href="http://api.forvo.com/key/">here</a>, or leave blank to use the default one. Obter sua própria chave <a href="http://api.forvo.com/key/">aqui</a>, ou deixe em branco para usar o padrão. @@ -3800,80 +4317,90 @@ %GDBIG5% por Big-5, %GDBIG5HKSCS% por Big5-HKSCS, %GDGBK% por GBK e GB18030, %GDSHIFTJIS% por Shift-JIS. + + DICT servers + + + + DICT servers: + + + + Any external programs. A string %GDWORD% will be replaced with the query word. If such string is not presented, the word will be fed into standard input. Todos os programas externos. Um texto %GDWORD% vai ser substituído com a palavra consultada. Se nenhum texto não é apresentado, a palavra vai ser alimentada com a entrada padrão. - + Language codes (comma-separated): Códigos de idioma (separar por vírgula): - + List of language codes you would like to have. Example: "en, ru". Lista de códigos de idioma que você gostaria de ter. Por exemplo: "en, ru, pt_BR". - + Full list of language codes is available <a href="http://www.forvo.com/languages-codes/">here</a>. A lista completa de códigos de idioma está disponível <a href="http://www.forvo.com/languages-codes/">aqui</a>. - + Transliteration Transliteração - + Russian transliteration Transliteração do Russo - + Greek transliteration Transliteração do Grego - + German transliteration Transliteração do Alemão - + Belarusian transliteration Bielorrusso transliteração - + Enables to use the Latin alphabet to write the Japanese language Habilita a romanização do japonês (palavras japonesas escritas em Latim) - + Japanese Romaji Japonês Romanizado (ideogramas convertidos para caracteres latinos) - + Systems: Sistemas: - + The most widely used method of transcription of Japanese, based on English phonology O método de transcrição japonesa mais amplamente usado, baseado na fonologia inglesa - + Hepburn Romanização hepburn - + The most regular system, having a one-to-one relation to the kana writing systems. Standardized as ISO 3602 @@ -3885,12 +4412,12 @@ Ainda não implementado no GoldenDict. - + Nihon-shiki Nihon-shiki - + Based on Nihon-shiki system, but modified for modern standard Japanese. Standardized as ISO 3602 @@ -3901,75 +4428,77 @@ Ainda não implementado no GoldenDict. - + Kunrei-shiki Kunrei-shiki - + Syllabaries: Silabários: - + Hiragana Japanese syllabary Silabário japonês Hiragana - + Hiragana Hiragana - + Katakana Japanese syllabary Silabário japonês Katakana - + Katakana Katakana - + Text to Speech Texto para Fala - + (not available in portable version) (indisponível na versão portátil) - - - + + + Choose a directory Escolha uma pasta - - - - - + + + + + + Confirm removal Confirmar remoção - - + + Remove directory <b>%1</b> from the list? Quer mesmo remover a pasta <b>%1</b> da lista? - - + + + Remove site <b>%1</b> from the list? Quer mesmo remover o site <b>%1</b> da lista? - + Remove program <b>%1</b> from the list? Quer mesmo remover o programa <b>%1</b> da lista? @@ -4099,22 +4628,22 @@ WebSitesModel - + Enabled Habilitado - + Name Nome - + Address Endereço - + Icon Ícone @@ -4122,7 +4651,7 @@ WordFinder - + Failed to query some dictionaries. Não foi possível consultar alguns dicionários. diff -Nru goldendict-1.5.0~git20131003/locale/qu_WI.ts goldendict-1.5.0~git20150923/locale/qu_WI.ts --- goldendict-1.5.0~git20131003/locale/qu_WI.ts 2013-10-02 20:42:04.000000000 +0000 +++ goldendict-1.5.0~git20150923/locale/qu_WI.ts 2015-09-23 08:26:24.000000000 +0000 @@ -49,7 +49,7 @@ [mana yachasqachu] - + Based on Qt %1 (%2, %3 bit) @@ -57,62 +57,62 @@ ArticleMaker - + Expand article - + Collapse article - + No translation for <b>%1</b> was found in group <b>%2</b>. Mana <b>%2</b> juñupi <b>%1</b> simita tarinchu. - + No translation was found in group <b>%1</b>. Mana <b>%1</b> juñupi simita tarinchu. - + Welcome! Qallarinapaq - + <h3 align="center">Welcome to <b>GoldenDict</b>!</h3><p>To start working with the program, first visit <b>Edit|Dictionaries</b> to add some directory paths where to search for the dictionary files, set up various Wikipedia sites or other sources, adjust dictionary order or create dictionary groups.<p>And then you're ready to look up your words! You can do that in this window by using a pane to the left, or you can <a href="Working with popup">look up words from other active applications</a>. <p>To customize program, check out the available preferences at <b>Edit|Preferences</b>. All settings there have tooltips, be sure to read them if you are in doubt about anything.<p>Should you need further help, have any questions, suggestions or just wonder what the others think, you are welcome at the program's <a href="http://goldendict.org/forum/">forum</a>.<p>Check program's <a href="http://goldendict.org/">website</a> for the updates. <p>(c) 2008-2013 Konstantin Isakov. Licensed under GPLv3 or later. <h3 align="center">¡Bienvenido a <b>GoldenDict</b>!</h3><p>Qallarinapaq, <b>Allinchay > Simi-pirwakuna</b> riy. Jaqaypi simi-pirwakunata mask'anapaq ñankunata yapay. Chaymanta, simi-pirwakunata ñiqichayta atinki. Juñukunaman simi-pirwakunata yapayta atinkitaq. <p>Chaymantari, simikunapi simikunata atinki. Mask'anapaq tawak'uchupi simita qillqapay. Wak programakunapi simikunata mask'anapaq, <a href="Working with popup">Juch'uy qhawanapi mask'ayta</a> qhaway. <p>Kay programata kamachinapaq <b>Allinchay &gt; Aqllanakuna</b> menuman riy. Achkhata yachanapaq qqllanakunaqpa willaynkukunata nawichayta atinki. <p>Aswan yanapata munaspaqa, <a href="http://goldendict.org/forum/">GoldenDictpa foronpi</a> tapuyta atinki. Kay programata kunanchanapaq <p><a href="http://goldendict.org/">web raphiman</a> riy. <p>(c) 2008-2013 Konstantin Isakov. GoldenDictqa GPL kamachiyyuq, versión 3 qhipamantataq. - + Working with popup Juch'uy qhawanapi mask'anapaq - + <h3 align="center">Working with the popup</h3>To look up words from other active applications, you would need to first activate the <i>"Scan popup functionality"</i> in <b>Preferences</b>, and then enable it at any time either by triggering the 'Popup' icon above, or by clicking the tray icon down below with your right mouse button and choosing so in the menu you've popped. <h3 align="center">Cómo Utilizar la ventana emergente</h3>Para buscar palabras desde otras aplicaciones activas, primero hay que habilitar la opción <i>"Escaneo en una ventana emergente"</i> en <b>Editar|Preferencias</b>. Luego puede utilizarla en cualquier momento, activando el icono arriba de la 'Ventana Emergente'. Alternativamente, haga clic a derecha abajo en la bandeja del sistema y seleccione la opción <b>Escanear con Ventana Emergente</b> en el menú. - + Then just stop the cursor over the word you want to look up in another application, and a window would pop up which would describe it to you. Luego detenga el cursor sobre la palabra que Ud. quiere buscar en otra aplicación y una ventana emergente aparecerá para hacer la consulta. - + Then just select any word you want to look up in another application by your mouse (double-click it or swipe it with mouse with the button pressed), and a window would pop up which would describe the word to you. Luego, seleccione una palabra deseada con su ratón para buscarla desde otra aplicación. Para seleccionar una palabra haga doble clic o arrastra sobre la palabra mientras oprimiendo el botón del ratón, y una ventana emergente aparecerá con la definición de la palabra. - + (untitled) (mana sutiyuq) - + (picture) @@ -120,7 +120,7 @@ ArticleRequest - + From @@ -129,32 +129,32 @@ From %1 - + Expand article - + Collapse article - + Query error: %1 Pantay mask'aspa: %1 - + Close words: Simikunata wisq'ay: - + Compound expressions: Expresiones compuestas: - + Individual words: Palabras individuales: @@ -162,47 +162,47 @@ ArticleView - + Select Current Article - + Copy as text - + Inspect - + Resource - + Audio - + TTS Voice - + Picture - + Definition from dictionary "%1": %2 - + Definition: %1 @@ -211,99 +211,100 @@ GoldenDict - - + + The referenced resource doesn't exist. El recurso referido no existe. - + The referenced audio program doesn't exist. - + + ERROR: %1 - + Save sound - + Sound files (*.wav *.ogg *.mp3 *.mp4 *.aac *.flac *.mid *.wv *.ape);;All files (*.*) - + Save image - + Image files (*.bmp *.jpg *.png *.tif);;All files (*.*) - + &Open Link &T'inkisqata kichay - + Video - + Video: %1 - + Open Link in New &Tab Musuq pestañapi t'inkisqata kichay - + Open Link in &External Browser Abrir enlace en un &navegador web externo - + &Look up "%1" "%1"ta &mask'ay - + Look up "%1" in &New Tab &Musuq pestañapi "%1"ta mask'ay - + Send "%1" to input line - - + + &Add "%1" to history - + Look up "%1" in %2 %2pi "%1"ta mask'ay - + Look up "%1" in %2 in &New Tab &Musuq pestañapi %2pi "%1"ta mask'ay - + WARNING: FFmpeg Audio Player: %1 @@ -316,37 +317,37 @@ Para activar reproducción de archivos no WAV, por favor vaya a Editar|Preferencias, escoja la pestaña Audio y seleccione "Reproducir con DirectShow". - + Failed to run a player to play sound file: %1 Fallo ejecutando un reproductor para reproducir el archivo de audio: %1 - + Failed to create temporary file. Temporal archiwuta yurichispa pantay. - + Failed to auto-open resource file, try opening manually: %1. Fallo abriendo automáticamente el archivo de recursos. Intente abrirlo manualmente: %1. - + The referenced resource failed to download. El recurso ha fallado de descargar. - + Save &image... - + Save s&ound... - + WARNING: %1 WILLAY: %1 @@ -356,42 +357,44 @@ Forma - + about:blank willay:chusaq - + x x - + Find: Mask'ay: - + + &Previous &Ñawpa - + + &Next &Qhipa - + Ctrl+G Ctrl+G - + &Case Sensitive &JATUNKUNA/juch'uykuna - + Highlight &all @@ -416,6 +419,29 @@ + Dialog + + + Proxy authentication required + + + + + You need to supply a Username and a Password to access via proxy + + + + + Username: + + + + + Password: + Pakasqa simi: + + + DictGroupWidget @@ -516,6 +542,119 @@ + DictHeadwords + + + Search mode + + + + + This element determines how filter string will be interpreted + + + + + If checked on the symbols case will be take in account when filtering + + + + + Match case + + + + + Exports headwords to file + + + + + Export + + + + + Help + + + + + OK + + + + + Press this button to apply filter to headwords list + + + + + Apply + + + + + If checked any filter changes will we immediately applied to headwords list + + + + + Auto apply + + + + + Filter: + + + + + Filter string (fixed string, wildcards or regular expression) + + + + + Text + + + + + Wildcards + + + + + RegExp + + + + + Unique headwords total: %1, filtered: %2 + + + + + Save headwords to file + + + + + Text files (*.txt);;All files (*.*) + + + + + Export headwords... + + + + + Cancel + Chinkachiy + + + DictInfo @@ -558,6 +697,16 @@ + + Show all unique dictionary headwords + + + + + Headwords + + + Edit the dictionary via command: %1 @@ -573,6 +722,74 @@ + DictServer + + + Url: + + + + + Databases: + + + + + Search strategies: + + + + + Server databases + + + + + DictServersModel + + + Enabled + Llank'achkanña + + + + Name + Suti + + + + Address + Maypi + + + + Databases + + + + + Strategies + + + + + Icon + + + + + Comma-delimited list of databases +(empty string or "*" matches all databases) + + + + + Comma-delimited list of search strategies +(empty string mean "prefix" strategy) + + + + DictionaryBar Dictionary Bar @@ -594,17 +811,22 @@ Kay juñuta allinchay - + Dictionary info - + + Dictionary headwords + + + + Open dictionary folder - + Edit dictionary @@ -612,39 +834,39 @@ EditDictionaries - + &Sources &Pukyukuna - - + + &Dictionaries &Simi-pirwakuna - - + + &Groups &Juñukuna - + Sources changed Fuentes modificados - + Some sources were changed. Would you like to accept the changes? Algunos fuentes fueron cambiados. ¿Quieres aceptar los cambios? - + Accept Chaskiy - + Cancel Chinkachiy @@ -663,6 +885,92 @@ + FTS::FtsIndexing + + + None + Ni ima + + + + FTS::FullTextSearchDialog + + + Full-text search + + + + + Whole words + + + + + Plain text + + + + + Wildcards + + + + + RegExp + + + + + Max distance between words (%1-%2): + + + + + Max articles per dictionary (%1-%2): + + + + + + + Articles found: + + + + + Now indexing: + + + + + CJK symbols in search string are not compatible with search modes "Whole words" and "Plain text" + + + + + The search line must contains at least one word containing + + + + + or more symbols + + + + + No dictionaries for full-text search + + + + + FTS::Indexing + + + None + Ni ima + + + Forvo::ForvoArticleRequest @@ -701,6 +1009,65 @@ + FullTextSearchDialog + + + + Search + + + + + Match case + + + + + Mode: + + + + + Articles found: + + + + + Available dictionaries in group: + + + + + Wait for indexing: + + + + + Total: + + + + + Indexed: + + + + + Now indexing: None + + + + + Cancel + Chinkachiy + + + + Help + + + + GermanTranslit @@ -740,43 +1107,53 @@ Groups - + + Group tabs + + + + + Open groups list + + + + Add group J&uñuta yapay - + Give a name for the new group: Musuq juñuman churay kay sutita: - + Rename group Waq sutita churay - + Give a new name for the group: Churay musuq sutita kay juñuman: - + Remove group Juñuta chinkachiy - + Are you sure you want to remove the group <b>%1</b>? <b>%1</b> juñuta chinkachiyta munankichu? - + Remove all groups &Tukuy juñukunata chinkachiy - + Are you sure you want to remove all the groups? Tukuy juñukunata chinkachiyta munankichu? @@ -881,6 +1258,54 @@ + Help::HelpWindow + + + GoldenDict help + + + + + Home + + + + + Back + Ñawpaq + + + + Forward + Qhipa + + + + Zoom In + Jatunyachiy + + + + Zoom Out + Juch'uyyachiy + + + + Normal Size + Mana aqllasqa chhikan + + + + Content + + + + + Index + + + + HistoryPaneWidget @@ -911,7 +1336,7 @@ Hunspell - + Spelling suggestions: Qillqata allinchanapaq: @@ -1656,7 +2081,7 @@ Zulu - + %1 Morphology Morfología %1 @@ -1664,12 +2089,12 @@ HunspellDictsModel - + Enabled Llank'achkanña - + Name Suti @@ -2709,7 +3134,7 @@ LoadDictionaries - + Error loading dictionaries Simi-pirwakunata jap'ikuspa pantay @@ -2717,7 +3142,7 @@ Main - + Error in configuration file. Continue with default settings? @@ -2729,17 +3154,17 @@ Wamp'unapaq chumpi - + Back Ñawpaq - + Forward Qhipa - + Scan Popup Juch'uy qhawanapi mask'ay @@ -2748,23 +3173,23 @@ Pronounce word - + Show &Main Window Qhapaq qhawanata &rikhuchiy - - + + &Quit &Lluqsiy - + Loading... Jap'ikuchkan... - + Skip This Release Saltar esta versión @@ -2773,22 +3198,22 @@ [Sconosciuto] - + Page Setup Raphita kamachina - + No printer is available. Please install one first. Mana impresora nisqaqa kanchu. Por favor instale una impresora. - + Print Article Raphipi articulota ñit'iy - + Save Article As Jinata articulota jallch'ay @@ -2797,12 +3222,12 @@ Archiwukuna HTML (*.html *.htm) - + Error Pantay - + Can't save article: %1 "%1" articulota mana jallch'ayta atinchu @@ -2811,33 +3236,33 @@ Error loading dictionaries - + %1 dictionaries, %2 articles, %3 words %1 simi-pirwakuna, %2 articulokuna, %3 simikuna - + Failed to initialize hotkeys monitoring mechanism.<br>Make sure your XServer has RECORD extension turned on. Fallo de inicializar monitoreo de teclas de acceso rápido.<br>Asegúrese que su XServer tiene activada la extensión RECORD. - + New Release Available Una nueva versión está disponible - + Version <b>%1</b> of GoldenDict is now available for download.<br>Click <b>Download</b> to get to the download page. Ahora versión <b>%1</b> de GoldenDict está disponible para descargar.<br>Haga clic en <b>Descargar</b> para ir a página de descargas. - + Download Urayachiy - - + + Look up in: Mask'ay: @@ -2846,168 +3271,179 @@ Simi-pirwaqpa chumpinpi sutikunata rikhurichiy - + &Menubar - + Found in Dictionaries: - + Pronounce Word (Alt+S) Simita parlachiy (Alt+S) - + Show Names in Dictionary &Bar - + Show Small Icons in &Toolbars - + &Navigation - + Zoom In Jatunyachiy - + Zoom Out Juch'uyyachiy - + Normal Size Mana aqllasqa chhikan - + Words Zoom In Simikunata jatunyachiy - + Words Zoom Out Simikunata juch'uyyachiy - + Words Normal Size Mana aqllasqa chhikanpa simikunan - + Close current tab Kunan pestañata wisq'ay - + Close all tabs Tukuy pestañakunata wisq'ay - + Close all tabs except current Tukuy pestañakunata wisq'ay, mana kunan pestañachu - + Look up: Mask'ay: - + All Tukuy - - + + Accessibility API is not enabled - + + String to search in dictionaries. The wildcards '*', '?' and sets of symbols '[...]' are allowed. +To find '*', '?', '[', ']' symbols use '\*', '\?', '\[', '\]' respectively + + + + Article, Complete (*.html) - + Article, HTML Only (*.html) - + Saving article... - + The main window is set to be always on top. - + Import history from file - + Import error: invalid data in file - + History import complete - + Import error: - + Dictionary info - + + Dictionary headwords + + + + Open dictionary folder - + Edit dictionary - + Opened tabs Kichasqa Pestañas - + Open Tabs List - + (untitled) (Mana sutiyuq) - + %1 - %2 @@ -3016,38 +3452,38 @@ WILLAY: %1 - + You have chosen to hide a menubar. Use %1 to show it back. - + Ctrl+M - + &Hide - + Export history to file - - + + Text files (*.txt);;All files (*.*) - + History export complete - + Export error: @@ -3065,27 +3501,27 @@ - + Welcome! ¡Bienvenido! - + &File &Archiwu - + &Edit &Allinchay - + &Help &Yanapa - + &Preferences... &Aqllanakuna... @@ -3094,7 +3530,7 @@ &Sources... - + F2 F2 @@ -3103,163 +3539,193 @@ &Juñukuna... - + &View &Qhaway - + &Zoom &Jatunyachiy/Juch'uyachiy - + H&istory &Yuyaynin - + &Dictionaries... &Simi-pirwakuna... - + F3 F3 - + &Search Pane - + + Search + + + + &Results Navigation Pane - + &History Pane - + F4 F4 - + &Homepage &GoldenDictpa raphin - + &About &GoldenDictmanta willaway - + About GoldenDict GoldenDictmanta willaway - + + GoldenDict reference + + + + F1 F1 - + Quit from application Programa nisqamanta lluqsiy - + Ctrl+Q Ctrl+Q - + &Forum &Foro (Rimanakusun) - + &Close To Tray &Sistema nisqaqpa chumpinman wisq'ay - + Minimizes the window to tray Sistema nisqaqpa chumpinman programata juch'uyyachin - + Ctrl+F4 Ctrl+F4 - + &Save Article &Articulo nisqata jallch'ay - + Save Article Articulo nisqata jallch'ay - + &Print &Raphipi ñit'iy - + Ctrl+P Ctrl+P - + Page Set&up Raphita kamachina - + Print Pre&view - + &Rescan Files - + &New Tab - + &Always on Top - + Always on Top - + Ctrl+O - - - + + + Menu Button + + Search in page + + + + + Ctrl+F + + + + + Full-text search + + + + + Ctrl+Shift+F + + + Print Preview Raphipi ñit'inapaq qhawanaraq @@ -3268,48 +3734,48 @@ Hukmanta archiwukunata ñawichay - + Ctrl+F5 Ctrl+F5 - + &Clear &Pichay - + New Tab - + Ctrl+T - + &Configuration Folder - - + + &Show - + Ctrl+H - + &Export - + &Import @@ -3325,12 +3791,12 @@ Mdx::MdxArticleRequest - + Dictionary file was tampered or corrupted - + Failed loading article from %1, reason: %2 @@ -3338,7 +3804,7 @@ MediaWiki::MediaWikiArticleRequest - + XML parse error: %1 at %2,%3 XMLta ñawichaspa pantay: %1 "%2,%3"pi @@ -3346,7 +3812,7 @@ MediaWiki::MediaWikiWordSearchRequest - + XML parse error: %1 at %2,%3 XMLta ñawichaspa pantay: %1 "%2,%3"pi @@ -3354,22 +3820,22 @@ MediaWikisModel - + Enabled Llank'achkanña - + Name Suti - + Address Maypi - + Icon @@ -3382,88 +3848,94 @@ Forma - + Dictionary order: Siqipi simi-pirwakunata ñiqichanapaq: - - - - ... - ... + ... - + Inactive (disabled) dictionaries: Mana jap'isqa simi-pirwakuna: - + Dictionary information Simi-pirwamanta willay - + Name: Suti: - + Total articles: Jayk'a articulokuna: - + Total words: Jayk'a simikuna: - + Translates from: Simimanta: - + Translates to: Simiman: - + Description: - + Files comprising this dictionary: Kay simi-pirwaqa chay archiwukunayoq: - + Adjust the order by dragging and dropping items in it. Drop dictionaries to the inactive group to disable their use. Ajuste el orden, arrastrando y soltando los diccionarios con el ratón. Mueva diccionarios al grupo deshabilitado para desactivar su uso - + Sort by name - + Sort by languages + + + Dictionary headwords + + + + + Dictionaries active: %1, inactive: %2 + + PathsModel - + Path Ñan - + Recursive Recursivo @@ -3614,24 +4086,29 @@ - + + Help language + + + + Adjust this value to avoid huge context menus. - + Context menu dictionaries limit: - + Chooses whether the scan popup mode is on by default or not. If checked, the program would always start with the scan popup active. Selecciona si el modo de escaneo está activado por defecto o no. Si está marcado, el programa siempre iniciará con el modo de escaneo habilitado. - + Normally, in order to activate a popup you have to maintain the chosen keys pressed while you select a word. With this enabled, the chosen keys may also @@ -3643,27 +4120,27 @@ despues la seleccion esté hecha. - + Hotkeys Teclakuna - + Use the following hotkey to show or hide the main window: Usar la siguiente combinación de teclas para mostrar u ocultar la ventana principal: - + Use the following hotkey to translate a word from clipboard: Usar la tecla siguiente para traducir una palabra en la porta-papeles: - + The hotkeys are global and work from any program and within any context as long as GoldenDict is running in background. Las teclas de acceso rápido están globales y funcionan desde cualquier programa o contexto mientras que GoldenDict estén ejecutando en el fondo. - + &Scan Popup &Juch'uy qhawanapi mask'ay @@ -3673,7 +4150,7 @@ Sistema nisqaqa qallariqtinkama, GoldenDictqa qallarinpis. - + When enabled, a translation popup window would be shown each time you point your mouse on any word on the screen (Windows) or select any word with mouse (Linux). When enabled, you can switch it on and @@ -3689,156 +4166,156 @@ Scan popup functionality - + Enable scan popup functionality Juch'uy qhawanapi mask'ay - + Start with scan popup turned on Programaqa qallariqtin juch'uy qhawanapi maskay - + With this enabled, the popup would only show up if all chosen keys are in the pressed state when the word selection changes. Con esto habilitado, la ventana emergente sólo aparece si todas las teclas seleccionadas estén oprimidas cuando la selección de la palabra cambie. - + Only show popup when all selected keys are kept pressed: Tukuy kay teclakunata ñit'inaykikama, juch'uy qhawanata rikhurichinqa: - + Left Ctrl only Sapalla lluq'i CTRL - + Left Ctrl Lluq'i CTRL - + Right Shift only Sapalla paña MAYÚSCULA - + Right Shift Paña MAYÚSCULA - + Alt key Tecla ALT - + Alt ALT - + Ctrl key Tecla CTRL - + Ctrl CTRL - + Left Alt only Sapalla lluq'i ALT - + Left Alt Lluq'i ALT - + Shift key Tecla MAYÚSCULA - + Shift MAYÚSCULA - + Right Alt only Sapalla paña ALT - + Right Alt Paña ALT - + Right Ctrl only Sapalla paña CTRL - + Right Ctrl Paña CTRL - + Left Shift only Sola MAYÚSCULA de izquierda - + Left Shift Lluq'i MAYÚSCULA - + Windows key or Meta key Tecla de WINDOWS o META - + Win/Meta WINDOWSchu METAchu - + Keys may also be pressed afterwards, within Teclasta ñit'iyta atinki - + To avoid false positives, the keys are only monitored after the selection's done for a limited amount of seconds, which is specified here. Para evitar positivos falsos, las teclas sólo son monitoreadas después de la terminación de la selección adentro un tiempo limitado, que está especificado aquí. - + secs qhipa segundokuna - + Send translated word to main window instead of to show it in popup window - + Send translated word to main window - + <!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; } @@ -3851,57 +4328,92 @@ <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" color:#ff0000;">Nota: Aparece que la extensión RECORD está rota en tu instalación de X.Org XServer. Las teclas de acceso rápido de GoldenDict probablemente no funcionan. Este problema puede ser arreglado en el servidor mismo. Por favor consulte al </span><a href="https://bugs.freedesktop.org/show_bug.cgi?id=20500"><span style=" text-decoration: underline; color:#0000ff;">reportaje de bug</span></a><span style=" color:#ff0000;"> y se puede entregar comentarios allí.</span></p></body></html> - + &Audio &Chanra - + Pronunciation Parlachina - + Auto-pronounce words in main window Qhapaq qhawanapi kunanpacha simikunata parlachiy - + Auto-pronounce words in scan popup Juch'uy qhawanapi kunanpacha simikunata parlachiy - + Playback Takichina - + Play audio files via FFmpeg(libav) and libao - + Use internal player - + + System proxy + + + + + Custom proxy + + + + + Custom settings + + + + + Full-text search + + + + + Allow full-text search for: + + + + + Don't search in dictionaries containing more than + + + + + articles (0 - unlimited) + + + + Select this option to automatic collapse big articles - + Collapse articles more than - + Articles longer than this size will be collapsed - + symbols @@ -3926,38 +4438,38 @@ Phonon nisqawan takichiy - + Use any external program to play audio files Usar cualquier programa para reproducir archivos de audio - + Use external program: Takichiy jawa programawan: - + Some sites detect GoldenDict via HTTP headers and block the requests. Enable this option to workaround the problem. - + Do not identify GoldenDict in HTTP headers - + Ad&vanced - + ScanPopup extra technologies - + Try to use IAccessibleEx technology to retrieve word under cursor. This technology works only with some programs that support it (for example Internet Explorer 9). @@ -3965,86 +4477,86 @@ - + Use &IAccessibleEx - + Try to use UI Automation technology to retrieve word under cursor. This technology works only with some programs that support it. It is not needed to select this option if you don't use such programs. - + Use &UIAutomation - + Try to use special GoldenDict message to retrieve word under cursor. This technology works only with some programs that support it. It is not needed to select this option if you don't use such programs. - + Use &GoldenDict message - + History - + Turn this option on to store history of the translated words - + Store &history - + Specify the maximum number of entries to keep in history. - + Maximum history size: - + History saving interval. If set to 0 history will be saved only during exit. - + Save every - + minutes - + Articles - + Turn this option on to always expand optional parts of articles - + Expand optional &parts @@ -4053,73 +4565,73 @@ Program to play audio files: - + &Network &Llika - + Enable if you wish to use a proxy server for all program's network requests. Habilite está opción si Ud. quiere utilizar un servidor proxy por todas las solicitudes de red del programa. - + Use proxy server Servidor proxy nisqawan t'inkichiy - + Type: Tipo: - + Host: Host: - + Port: Punku: - + User: jap'iq masi: - + Password: Pakasqa simi: - + Enabling this would make GoldenDict block most advertisements by disallowing content (images, frames) not originating from the site you are browsing. If some site breaks because of this, try disabling this. Habilitando esta opción bloqueará la mayoría de propagando comercial, porque no permite contenido (imágenes y marcos) que no vienen directamente del sitio utilizado. Si causa problemas con algunos sitios, deshabilite esta opción. - + Disallow loading content from other sites (hides most advertisements) No permite la carga de contenido de otros sitios (oculta la mayoría de propaganda) - + Enabling this would allow to listen to sound pronunciations from online dictionaries that rely on Flash or other web plugins. Plugin must be installed for this option to work. - + Enable web plugins - + When this is enabled, the program periodically checks if a new, updated version of GoldenDict is available for download. If it is so, the program @@ -4132,12 +4644,12 @@ la página web para descargarla. - + Check for new program releases periodically Verificar periódicamente si haya una nueva versión del programa - + System default Sistema nisqaqpa simin @@ -4150,32 +4662,33 @@ Russian - + + Default Mana aqllasqa - + Modern - + Lingvo Lingvo - + Babylon - + Lingoes - + Lingoes-Blue @@ -4184,12 +4697,12 @@ DirectShow nisqawan takichiy - + Changing Language Simita t'ikrachkan - + Restart the program to apply the language change. Musuq simita jap'ikunanpaq hukmanta programata qallarichiy. @@ -4197,27 +4710,27 @@ ProgramTypeEditor - + Audio - + Plain Text - + Html - + Prefix Match - + Unknown @@ -4243,27 +4756,27 @@ ProgramsModel - + Enabled Llank'achkanña - + Type - + Name Suti - + Command Line - + Icon @@ -4271,12 +4784,14 @@ QObject - + + Article loading error - + + Article decoding error @@ -4387,18 +4902,18 @@ ResourceToSaveHandler - - + + ERROR: %1 - + Resource saving error: - + The referenced resource failed to download. El recurso ha fallado de descargar. @@ -4406,12 +4921,12 @@ Romaji - + Hepburn Romaji for Hiragana Romanización hepburn de Hiragana - + Hepburn Romaji for Katakana Romanización hepburn de Katakana @@ -4444,12 +4959,12 @@ simi - + Back Ñawpaq - + Forward Qhipa @@ -4462,32 +4977,32 @@ Alt+M - + Pronounce Word (Alt+S) Simita parlachiy (Alt+S) - + Alt+S Alt+S - + Send word to main window (Alt+W) - + Alt+W - + Shows or hides the dictionary bar Simi-pirwakunawan chumpita rikhurichin chaymanta pakachintaq - + Use this to pin down the window so it would stay on screen, could be resized or managed in other ways. Utilice esto para fijar la ventana en la pantalla, redimensionarla o gerenciarla en otra manera. @@ -4497,11 +5012,11 @@ List matches - - - - - + + + + + ... ... @@ -4514,8 +5029,8 @@ GoldenDict - - + + %1 - %2 @@ -4523,17 +5038,17 @@ SoundDirsModel - + Path Ñan - + Name Suti - + Icon @@ -4541,45 +5056,47 @@ Sources - + Text to Speech - + (not available in portable version) (no disponible en versión portátil) - - - + + + Choose a directory Directorio nisqata aqllay - - - - - + + + + + + Confirm removal Chinkachiyta munankichu? - - + + Remove directory <b>%1</b> from the list? ¿<b>%1</b> directorio chinkachiyta munankichu? - - + + + Remove site <b>%1</b> from the list? ¿<b>%1</b> raphita chinkachiyta munankichu? - + Remove program <b>%1</b> from the list? @@ -4602,7 +5119,8 @@ - + + &Add... &Yapay... @@ -4611,7 +5129,8 @@ - + + &Remove &Chinkachiy @@ -4680,32 +5199,32 @@ ("CP1251"wan "%GD1251%"ta rantinqa. "ISO 8859-1"wan "%GDISO1%"ta rantinqa) - + Programs - + Forvo Forvo - + Live pronunciations from <a href="http://www.forvo.com/">forvo.com</a>. The site allows people to record and share word pronunciations. You can listen to them from GoldenDict. Pronuncia directamente de <a href="http://www.forvo.com/">forvo.com</a>. Este sito permite que la gente grabe y comparta pronunciaciones de palabras que pueden ser escuchadas desde GoldenDict. - + Enable pronunciations from Forvo Forvo nisqawan parlachiy - + API Key: API nisqaqpa chimpun: - + Use of Forvo currently requires an API key. Leave this field blank to use the default key, which may become unavailable in the future, or register on the site to get your own key. @@ -4715,7 +5234,7 @@ propia clave personalizada. - + Get your own key <a href="http://api.forvo.com/key/">here</a>, or leave blank to use the default one. @@ -4744,79 +5263,89 @@ + + DICT servers + + + + DICT servers: + + + + Any external programs. A string %GDWORD% will be replaced with the query word. If such string is not presented, the word will be fed into standard input. - + Language codes (comma-separated): Simikunaqpa chimpunku (coma nisqakunawan t'aqasqa): - + List of language codes you would like to have. Example: "en, ru". Simi munaykinkiLista de códigos de lenguas que Ud. quiere utilizar. Por Ejemplo: "en, ru, es". - + Full list of language codes is available <a href="http://www.forvo.com/languages-codes/">here</a>. Una lista completa de los códigos de lenguas está disponible <a href="http://www.forvo.com/languages-codes/">aquí</a>. - + Transliteration Waq qillqaman t'ikray - + Russian transliteration Ruso qillqaman t'ikray - + Greek transliteration Griego qillqaman t'ikray - + German transliteration Aleman qillqaman t'ikray - + Belarusian transliteration - + Enables to use the Latin alphabet to write the Japanese language Habilita el alfabeto romano para escribir la lengua japonesa - + Japanese Romaji Romano qillqapi japonés simita t'ikray - + Systems: Sistemas: - + The most widely used method of transcription of Japanese, based on English phonology El sistema más utilizado para transcribir japonés, basado en la fonología inglesa - + Hepburn Hepburn - + The most regular system, having a one-to-one relation to the kana writing systems. Standardized as ISO 3602 @@ -4827,12 +5356,12 @@ Todavia no implementado en GoldenDict. - + Nihon-shiki Nihon-shiki - + Based on Nihon-shiki system, but modified for modern standard Japanese. Standardized as ISO 3602 @@ -4843,32 +5372,32 @@ Todavía no implementado en GoldenDict. - + Kunrei-shiki Kunrei-shiki - + Syllabaries: Silabario: - + Hiragana Japanese syllabary Silabario de Japonés Hiragana - + Hiragana Hiragana - + Katakana Japanese syllabary Silabario de Japonés Katakana - + Katakana Katakana @@ -5012,22 +5541,22 @@ WebSitesModel - + Enabled Llank'achkanña - + Name Suti - + Address Maypi - + Icon @@ -5035,7 +5564,7 @@ WordFinder - + Failed to query some dictionaries. Simi-pirwakunapi mask'aspa pantay diff -Nru goldendict-1.5.0~git20131003/locale/ru_RU.ts goldendict-1.5.0~git20150923/locale/ru_RU.ts --- goldendict-1.5.0~git20131003/locale/ru_RU.ts 2013-10-02 20:42:04.000000000 +0000 +++ goldendict-1.5.0~git20150923/locale/ru_RU.ts 2015-09-23 08:26:24.000000000 +0000 @@ -34,7 +34,7 @@ [Неизвестно] - + Based on Qt %1 (%2, %3 bit) На базе Qt %1 (%2, %3 бит) @@ -42,62 +42,62 @@ ArticleMaker - + Expand article Развернуть статью - + Collapse article Свернуть статью - + No translation for <b>%1</b> was found in group <b>%2</b>. В группе <b>%2</b> не найдено перевода для <b>%1</b>. - + No translation was found in group <b>%1</b>. В группе <b>%1</b> перевод не найден. - + Welcome! Добро пожаловать! - + <h3 align="center">Welcome to <b>GoldenDict</b>!</h3><p>To start working with the program, first visit <b>Edit|Dictionaries</b> to add some directory paths where to search for the dictionary files, set up various Wikipedia sites or other sources, adjust dictionary order or create dictionary groups.<p>And then you're ready to look up your words! You can do that in this window by using a pane to the left, or you can <a href="Working with popup">look up words from other active applications</a>. <p>To customize program, check out the available preferences at <b>Edit|Preferences</b>. All settings there have tooltips, be sure to read them if you are in doubt about anything.<p>Should you need further help, have any questions, suggestions or just wonder what the others think, you are welcome at the program's <a href="http://goldendict.org/forum/">forum</a>.<p>Check program's <a href="http://goldendict.org/">website</a> for the updates. <p>(c) 2008-2013 Konstantin Isakov. Licensed under GPLv3 or later. <h3 align="center">Добро пожаловать в <b>GoldenDict</b>!</h3><p>Если вы запустили программу в первый раз, укажите пути к словарям в <b>Правка|Словари</b>. Там же Вы можете указать различные сайты Википедии или другие источники данных, настроить порядок просмотра словарей или создать словарные группы.<p>После этого Вы можете приступать к поиску слов. Слова можно искать в левой области данного окна. При работе в других приложениях можно искать слова, используя <a href="Работа с всплывающим окном">всплывающее окно</a>. <p>В меню <b>Правка|Параметры</b> Вы можете настроить приложение по своему вкусу. Все параметры имеют подсказки, показываемые при наведении курсора на них. Обращайте, пожалуйста, на них внимание, когда у Вас возникают затруднения с настройкой.<p>Если Вам требуется дополнительная помощь, возникли какие-то вопросы, пожелания и т.п., обращайтесь на <a href="http://goldendict.org/forum/">форум программы</a>.<p>Обновления программы доступны на её <a href="http://goldendict.org/">вебсайте</a>.<p>© Константин Исаков (ikm@goldendict.org), 2008-2013. Лицензия: GNU GPLv3 или более поздняя версия. - + Working with popup Работа с всплывающим окном - + <h3 align="center">Working with the popup</h3>To look up words from other active applications, you would need to first activate the <i>"Scan popup functionality"</i> in <b>Preferences</b>, and then enable it at any time either by triggering the 'Popup' icon above, or by clicking the tray icon down below with your right mouse button and choosing so in the menu you've popped. <h3 align="center">Всплывающее окно</h3>Для поиска слов из других приложений, вам нужно включить <i>«Разрешить всплывающее окно»</i> в <b>Параметрах</b> и после этого включить всплывающее окно кнопкой «Сканировать» в основном окне или в контекстном меню значка в системном лотке. - + Then just stop the cursor over the word you want to look up in another application, and a window would pop up which would describe it to you. Теперь подведите курсор мыши к какому-либо слову в приложении, и появится всплывающее окно с переводом или значением этого слова. - + Then just select any word you want to look up in another application by your mouse (double-click it or swipe it with mouse with the button pressed), and a window would pop up which would describe the word to you. Теперь выделите какое-либо слово в приложении (двойным щелчком, или же проводя по ним курсором мыши при зажатой левой кнопке), и появится всплывающее окно с переводом или значением этого слова. - + (untitled) (без имени) - + (picture) (картинка) @@ -105,37 +105,37 @@ ArticleRequest - + Expand article Развернуть статью - + From Из словаря - + Collapse article Свернуть статью - + Query error: %1 Ошибка поиска: %1 - + Close words: Близкие слова: - + Compound expressions: Составные выражения: - + Individual words: Отдельные слова: @@ -143,179 +143,180 @@ ArticleView - + Select Current Article Выделить текущую статью - + Copy as text Копировать как текст - + Inspect Инспектор - + Resource Ресурс - + Audio Аудио - + TTS Voice Синтезатор голоса - + Picture Картинка - + Video Видео - + Video: %1 Видео: %1 - + Definition from dictionary "%1": %2 Определение из словаря «%1»: %2 - + Definition: %1 Определение: %1 - - + + The referenced resource doesn't exist. Запрошенный ресурс не найден. - + The referenced audio program doesn't exist. Указанная аудио-программа не найдена. - + + ERROR: %1 ОШИБКА: %1 - + Save sound Сохранить звук - + Sound files (*.wav *.ogg *.mp3 *.mp4 *.aac *.flac *.mid *.wv *.ape);;All files (*.*) Звуковые файлы (*.wav *.ogg *.mp3 *.mp4 *.aac *.flac *.mid *.wv *.ape);;Все файлы (*.*) - + Save image Сохранить изображение - + Image files (*.bmp *.jpg *.png *.tif);;All files (*.*) Файлы изображений (*.bmp *.jpg *.png *.tif);;Все файлы (*.*) - + &Open Link &Открыть ссылку - + Open Link in New &Tab Открыть ссылку в новой &вкладке - + Open Link in &External Browser Открыть ссылку во внешнем &браузере - + &Look up "%1" &Поиск «%1» - + Look up "%1" in &New Tab Поиск «%1» в &новой вкладке - + Send "%1" to input line Поместить «%1» в строку ввода - - + + &Add "%1" to history Добавить «%1» в журнал - + Look up "%1" in %2 Поиск «%1» в %2 - + Look up "%1" in %2 in &New Tab Поиск «%1» в %2 в &новой вкладке - + WARNING: FFmpeg Audio Player: %1 ПРЕДУПРЕЖДЕНИЕ: Плейер FFMpeg: %1 - + Failed to run a player to play sound file: %1 Невозможно запустить проигрыватель звукового файла: %1 - + Failed to create temporary file. Ошибка создания временного файла. - + Failed to auto-open resource file, try opening manually: %1. Ошибка открытия файла ресурса, попробуйте открыть вручную: %1. - + The referenced resource failed to download. Невозможно загрузить указанный ресурс. - + Save &image... Сохранить &изображение... - + Save s&ound... Сохранить &звук... - + WARNING: %1 ВНИМАНИЕ: %1 @@ -325,42 +326,44 @@ Form - + about:blank about:blank - + x x - + Find: Искать: - + + &Previous &Предыдущее - + + &Next &Следующее - + Ctrl+G Ctrl+G - + &Case Sensitive Учитывать &регистр - + Highlight &all Пометить &все @@ -386,6 +389,29 @@ + Dialog + + + Proxy authentication required + Прокси-сервер требует авторизацию + + + + You need to supply a Username and a Password to access via proxy + Для доступа к прокси-серверу необходимо ввести имя и пароль + + + + Username: + Имя: + + + + Password: + Пароль: + + + DictGroupWidget @@ -486,6 +512,121 @@ + DictHeadwords + + + Search mode + Режим поиска + + + + This element determines how filter string will be interpreted + Этот элемент определяет, как будет интерпретироваться строка фильтра + + + + If checked on the symbols case will be take in account when filtering + Если этот флажок установлен, фильтрация будет +осуществляться с учётом регистра символов + + + + Match case + Учитывать регистр + + + + Exports headwords to file + Экспортировать заголовки в файл + + + + Export + Экспорт + + + + Help + Справка + + + + OK + OK + + + + Press this button to apply filter to headwords list + Нажмите эту кнопку чтобы применить фильтр к списку заголовков + + + + Apply + Применить + + + + If checked any filter changes will we immediately applied to headwords list + Если этот флажок установлен, любые изменения фильтра +будут применяться к списку заголовков немедленно + + + + Auto apply + Автоприменение + + + + Filter: + Фильтр: + + + + Filter string (fixed string, wildcards or regular expression) + Строка фильтра (простой текст, шаблон или регулярное выражение) + + + + Text + Текст + + + + Wildcards + Шаблон + + + + RegExp + Рег. выражение + + + + Unique headwords total: %1, filtered: %2 + Неповторяющихся заголовков всего: %1, отфильтрованых: %2 + + + + Save headwords to file + Сохранить заголовки в файл + + + + Text files (*.txt);;All files (*.*) + Текстовые файлы (*.txt);;Все файлы (*.*) + + + + Export headwords... + Экспортируются заголовки... + + + + Cancel + Отмена + + + DictInfo @@ -528,6 +669,16 @@ Описание: + + Show all unique dictionary headwords + Показать все неповторяющиеся заголовки словаря + + + + Headwords + Заголовки + + Edit the dictionary via command: %1 @@ -543,6 +694,76 @@ + DictServer + + + Url: + Адрес: + + + + Databases: + Базы данных: + + + + Search strategies: + Стратегии поиска: + + + + Server databases + Базы данных сервера + + + + DictServersModel + + + Enabled + Включено + + + + Name + Название + + + + Address + Адрес + + + + Databases + Базы + + + + Strategies + Стратегии + + + + Icon + Значок + + + + Comma-delimited list of databases +(empty string or "*" matches all databases) + Список баз, разделённый запятыми +(пустая строка или "*" соответствует всем базам сервера) + + + + Comma-delimited list of search strategies +(empty string mean "prefix" strategy) + Список стратегий поиска, разделённый запятыми +(пустая строка означает стратегию "prefix") + + + DictionaryBar @@ -560,17 +781,22 @@ Изменить эту группу - + Dictionary info Информация о словаре - + + Dictionary headwords + Заголовки словаря + + + Open dictionary folder Открыть папку словаря - + Edit dictionary Редактировать словарь @@ -578,39 +804,39 @@ EditDictionaries - + &Sources &Источники - - + + &Dictionaries &Словари - - + + &Groups &Группы - + Sources changed Источники изменены - + Some sources were changed. Would you like to accept the changes? Источники были изменены. Принять внесенные изменения? - + Accept Принять - + Cancel Отмена @@ -629,6 +855,92 @@ + FTS::FtsIndexing + + + None + Нет + + + + FTS::FullTextSearchDialog + + + Full-text search + Полнотекстовый поиск + + + + Whole words + Слова точно + + + + Plain text + Простой текст + + + + Wildcards + Шаблоны + + + + RegExp + Рег. выр. + + + + Max distance between words (%1-%2): + Промежуточных слов, не более (%1-%2): + + + + Max articles per dictionary (%1-%2): + Статей на словарь, не более (%1-%2): + + + + + + Articles found: + Статей найдено: + + + + Now indexing: + Индексируется: + + + + CJK symbols in search string are not compatible with search modes "Whole words" and "Plain text" + Символы CJK в строке поиска несовместимы с режимами поиска "Слова точно" и "Простой текст" + + + + The search line must contains at least one word containing + Строка поиска должна включать как минимум одно слово из + + + + or more symbols + или более символов + + + + No dictionaries for full-text search + Нет словарей для полнотекстового поиска + + + + FTS::Indexing + + + None + Нет + + + Forvo::ForvoArticleRequest @@ -667,6 +979,65 @@ + FullTextSearchDialog + + + + Search + Искать + + + + Match case + Учитывать регистр + + + + Mode: + Режим: + + + + Articles found: + Статей найдено: + + + + Available dictionaries in group: + Доступных словарей в группе: + + + + Wait for indexing: + Ожидают индексации: + + + + Total: + Всего: + + + + Indexed: + Проиндексированных: + + + + Now indexing: None + Индексируется: Нет + + + + Cancel + Отмена + + + + Help + Справка + + + GermanTranslit @@ -706,43 +1077,53 @@ Groups - + + Group tabs + Группы + + + + Open groups list + Открыть список групп + + + Add group Добавить группу - + Give a name for the new group: Введите название новой группы: - + Rename group Переименовать группу - + Give a new name for the group: Введите новое название группы: - + Remove group Удалить группу - + Are you sure you want to remove the group <b>%1</b>? Удалить группу <b>%1</b>? - + Remove all groups Удалить все - + Are you sure you want to remove all the groups? Удалить все группы? @@ -843,6 +1224,54 @@ + Help::HelpWindow + + + GoldenDict help + Справка GoldenDict + + + + Home + Домой + + + + Back + Назад + + + + Forward + Вперёд + + + + Zoom In + Увеличить + + + + Zoom Out + Уменьшить + + + + Normal Size + Обычный размер + + + + Content + Содержание + + + + Index + Индекс + + + HistoryPaneWidget @@ -873,12 +1302,12 @@ Hunspell - + Spelling suggestions: Варианты написания: - + %1 Morphology %1 (морфология) @@ -886,12 +1315,12 @@ HunspellDictsModel - + Enabled Включено - + Name Название @@ -1931,7 +2360,7 @@ LoadDictionaries - + Error loading dictionaries Ошибка при загрузке словарей @@ -1939,7 +2368,7 @@ Main - + Error in configuration file. Continue with default settings? Ошибка в файле конфигурации. Продолжить с настройками по умолчанию? @@ -1947,536 +2376,578 @@ MainWindow - + Back Назад - + Forward Вперёд - + Scan Popup Сканировать - + Show &Main Window Показать &основное окно - - + + &Quit В&ыход - + Loading... Загрузка... - + Skip This Release Пропустить данную версию - + You have chosen to hide a menubar. Use %1 to show it back. Вы скрыли главное меню. Чтобы вернуть его, используйте %1. - + Ctrl+M Ctrl+M - + Page Setup Параметры страницы - + No printer is available. Please install one first. В системе не установлено ни одного принтера. - + Print Article Печать статьи - + Save Article As Сохранить статью как - + Error Ошибка - + Can't save article: %1 Невозможно сохранить статью: %1 - + %1 dictionaries, %2 articles, %3 words Словарей: %1, статей: %2, слов: %3 - + Failed to initialize hotkeys monitoring mechanism.<br>Make sure your XServer has RECORD extension turned on. Ошибка инициализации механизма отслеживания горячих клавиш.<br>Убедитесь, что ваш XServer поддерживает расширение RECORD. - + New Release Available Доступна новая версия - + Version <b>%1</b> of GoldenDict is now available for download.<br>Click <b>Download</b> to get to the download page. Версия <b>%1</b> программы GoldenDict доступа для загрузки.<br> Нажмите <b>Загрузить</b>, чтобы перейти на страницу загрузки. - + Download Загрузить - - + + Look up in: Поиск в: - + &Menubar &Главное меню - + Found in Dictionaries: Найдено в словарях: - + Pronounce Word (Alt+S) Произнести слово (Alt+S) - + Show Names in Dictionary &Bar По&казывать названия в панели словарей - + Show Small Icons in &Toolbars &Маленькие значки в панели инструментов - + &Navigation &Навигация - + Zoom In Увеличить - + Zoom Out Уменьшить - + Normal Size Обычный размер - + Words Zoom In Увеличить список слов - + Words Zoom Out Уменьшить список слов - + Words Normal Size Обычный размер для списка слов - + Close current tab Закрыть текущую вкладку - + Close all tabs Закрыть все вкладки - + Close all tabs except current Закрыть все вкладки, кроме текущей - + Look up: Искать: - + All Все - - + + Accessibility API is not enabled Интерфейс Accessibility не включён - + The main window is set to be always on top. Главное окно всегда поверх других окон. - + Import history from file Импорт журнала из файла - + Import error: invalid data in file Ошибка импорта: некорректные данные в файле - + History import complete Импорт журнала завершён - + Import error: Ошибка импорта: - + Dictionary info Информация о словаре - + + Dictionary headwords + Заголовки словаря + + + Open dictionary folder Открыть папку словаря - + Edit dictionary Редактировать словарь - + Opened tabs Открытые вкладки - + + String to search in dictionaries. The wildcards '*', '?' and sets of symbols '[...]' are allowed. +To find '*', '?', '[', ']' symbols use '\*', '\?', '\[', '\]' respectively + Строка для поиска в словарях. Можно использовать шаблоны '*', '?' и диапазоны символов '[...]'. +Чтобы найти сами символы '*', '?', '[', ']', используйте '\*', '\?', '\[', '\]' соответственно. + + + Open Tabs List Открыть список вкладок - + (untitled) (без имени) - + %1 - %2 %1 - %2 - + Article, Complete (*.html) Статья полностью (*.html) - + Article, HTML Only (*.html) Статья, только HTML (*.html) - + Saving article... Сохранение статьи... - + &Hide &Спрятать - + Export history to file Экспорт журнала в файл - - + + Text files (*.txt);;All files (*.*) Текстовые файлы (*.txt);;Все файлы (*.*) - + History export complete Экспорт журнала завершён - + Export error: Ошибка при экспорте: - + Welcome! Добро пожаловать! - + &File &Файл - + &Edit &Правка - + &Help &Справка - + &Search Pane Панель по&иска - + &Results Navigation Pane Панель на&вигации по переводу - + &Preferences... &Параметры... - + F2 F2 - + &View &Вид - + &Zoom &Масштаб - + H&istory &Журнал - + + Search + Поиск + + + &History Pane Панель журнала - + &Dictionaries... &Словари... - + F3 F3 - + F4 F4 - + &Homepage &Веб-сайт - + &About &О программе - + About GoldenDict О программе GoldenDict - + + GoldenDict reference + Справка GoldenDict + + + F1 F1 - + Quit from application Выйти из приложения - + Ctrl+Q Ctrl+Q - + &Forum &Форум - + &Close To Tray &Свернуть в лоток - + Minimizes the window to tray Свёртывает окно в лоток - + Ctrl+F4 Ctrl+F4 - + &Save Article &Сохранить статью - + Save Article Сохранить статью - + &Print &Печатать - + Ctrl+P Ctrl+P - + Page Set&up П&араметры страницы - + Print Pre&view Пр&едварительный просмотр - + &Rescan Files Пе&ресканировать файлы - + &New Tab &Новая вкладка - + &Always on Top П&оверх других окон - + Always on Top Поверх других окон - + Ctrl+O Ctrl+O - - - + + + Menu Button Кнопка меню - + + Search in page + Поиск на странице + + + + Ctrl+F + Ctrl+F + + + + Full-text search + Полнотекстовый поиск + + + + Ctrl+Shift+F + Ctrl+Shift+F + + + Ctrl+F5 Ctrl+F5 - + &Clear О&чистить - + New Tab Новая вкладка - + Ctrl+T Ctrl+T - + &Configuration Folder &Папка конфигурации - - + + &Show &Показать - + Ctrl+H Ctrl+H - + &Export &Экспортировать - + &Import &Импортировать @@ -2484,12 +2955,12 @@ Mdx::MdxArticleRequest - + Dictionary file was tampered or corrupted Файл словаря искажён или повреждён - + Failed loading article from %1, reason: %2 Ошибка загрузки статьи из %1, причина: %2 @@ -2497,7 +2968,7 @@ MediaWiki::MediaWikiArticleRequest - + XML parse error: %1 at %2,%3 Ошибка разбора XML: %1 на строке %2, столбце %3 @@ -2505,7 +2976,7 @@ MediaWiki::MediaWikiWordSearchRequest - + XML parse error: %1 at %2,%3 Ошибка разбора XML: %1 на строке %2, столбце %3 @@ -2513,22 +2984,22 @@ MediaWikisModel - + Enabled Включено - + Name Название - + Address Адрес - + Icon Значок @@ -2541,88 +3012,90 @@ Form - + Dictionary order: Порядок словарей: - - - - - ... - ... - - - + Inactive (disabled) dictionaries: Неактивные (отключенные) словари: - + Dictionary information Информация о словаре - + Name: Название: - + Total articles: Количество статей: - + Total words: Количество слов: - + Translates from: Исходный язык: - + Translates to: Целевой язык: - + Description: Описание: - + Files comprising this dictionary: Файлы, из которых состоит словарь: - + Adjust the order by dragging and dropping items in it. Drop dictionaries to the inactive group to disable their use. Изменяйте порядок словарей, перетаскивая словари мышкой. Для отключения словаря перетащите его в неактивную группу снизу. - + Sort by name Сортировать по имени - + Sort by languages Сортировать по языкам + + + Dictionary headwords + Заголовки словаря + + + + Dictionaries active: %1, inactive: %2 + Словарей активных: %1, неактивных: %2 + PathsModel - + Path Путь - + Recursive Рекурсивно @@ -2735,13 +3208,13 @@ Переводить выбранное слово по двойному щелчку - + Chooses whether the scan popup mode is on by default or not. If checked, the program would always start with the scan popup active. Включать или нет режим всплывающего окна при запуске программы. - + Normally, in order to activate a popup you have to maintain the chosen keys pressed while you select a word. With this enabled, the chosen keys may also @@ -2757,27 +3230,27 @@ того, как слово было выделено. - + Hotkeys Горячие клавиши - + Use the following hotkey to show or hide the main window: Использовать следующую комбинацию для показа/скрытия основного окна: - + Use the following hotkey to translate a word from clipboard: Использовать следующую комбинацию для перевода слова из буфера обмена: - + The hotkeys are global and work from any program and within any context as long as GoldenDict is running in background. Горячие клавиши являются глобальными и работают из любой программы и в любом состоянии, до тех пор пока GoldenDict работает в фоне. - + &Scan Popup &Всплывающее окно @@ -2830,17 +3303,22 @@ Дополнительный стиль: - + + Help language + Язык справки + + + Adjust this value to avoid huge context menus. Устанавливайте эту величину, чтобы избежать слишком больших контекстных меню - + Context menu dictionaries limit: Предел количества словарей в контекстном меню: - + When enabled, a translation popup window would be shown each time you point your mouse on any word on the screen (Windows) or select any word with mouse (Linux). When enabled, you can switch it on and @@ -2851,134 +3329,134 @@ включить или отключить в основном окне и в контекстом меню значка в системном лотке. - + Enable scan popup functionality Разрешить всплывающее окно - + Start with scan popup turned on Включить режим всплывающего окна при запуске - + With this enabled, the popup would only show up if all chosen keys are in the pressed state when the word selection changes. Показывать всплывающее окно, только если все выбранные клавиши находятся в зажатом состоянии в момент выделения слова. - + Only show popup when all selected keys are kept pressed: Показывать всплывающее окно только при зажатых клавишах: - + Left Ctrl only При зажатии левой клавиши Ctrl - + Left Ctrl Левый Ctrl - + Right Shift only При зажатии правой клавиши Shift - + Right Shift Правый Shift - + Alt key При зажатии любой клавиши Alt - + Alt Alt - + Ctrl key При зажатии любой клавиши Ctrl - + Ctrl Ctrl - + Left Alt only При зажатии левой клавиши Alt - + Left Alt Левый Alt - + Shift key При зажатии любой клавиши Shift - + Shift Shift - + Right Alt only При зажатии правой клавиши Alt - + Right Alt Правый Alt - + Right Ctrl only При зажатии правой клавиши Ctrl - + Right Ctrl Правый Ctrl - + Left Shift only При зажатии левой клавиши Shift - + Left Shift Левый Shift - + Windows key or Meta key При зажатии клавиши Windows или Meta - + Win/Meta Win или Meta - + Keys may also be pressed afterwards, within Задержка проверки модификаторов - + To avoid false positives, the keys are only monitored after the selection's done for a limited amount of seconds, which is specified here. @@ -2987,54 +3465,89 @@ промежутка времени, который и задается здесь. - + secs секунд(ы) - + Send translated word to main window instead of to show it in popup window Отправлять переводимое слово в главное окно программы вместо перевода его во всплывающем окне - + Send translated word to main window Отправлять переводимое слово в главное окно - + Play audio files via FFmpeg(libav) and libao Воспроизведение звуков через FFmpeg(libav) и libao - + Use internal player Использовать встроенный движок - + + System proxy + Использовать системные настройки + + + + Custom proxy + Использовать свои настройки + + + + Custom settings + Свои настройки + + + Some sites detect GoldenDict via HTTP headers and block the requests. Enable this option to workaround the problem. Некоторые сайты опознают GoldenDict по заголовкам HTTP и блокируют запросы. Включите эту опцию, чтобы обойти проблему. - + Do not identify GoldenDict in HTTP headers Не указывать GoldenDict в заголовках HTTP - + + Full-text search + Полнотекстовый поиск + + + + Allow full-text search for: + Разрешить полнотекстовый поиск для: + + + + Don't search in dictionaries containing more than + Не искать в словарях, содержащих более чем + + + + articles (0 - unlimited) + статей (0 - неограниченно) + + + Ad&vanced Дополнительно - + ScanPopup extra technologies Дополнительные методы определения слова под курсором - + Try to use IAccessibleEx technology to retrieve word under cursor. This technology works only with some programs that support it (for example Internet Explorer 9). @@ -3045,12 +3558,12 @@ Если вы не пользуетесь такими программами, включать эту опцию не нужно. - + Use &IAccessibleEx Использовать &IAccessibleEx - + Try to use UI Automation technology to retrieve word under cursor. This technology works only with some programs that support it. It is not needed to select this option if you don't use such programs. @@ -3059,12 +3572,12 @@ Если вы не пользуетесь такими программами, включать эту опцию не нужно. - + Use &UIAutomation Использовать &UIAutomation - + Try to use special GoldenDict message to retrieve word under cursor. This technology works only with some programs that support it. It is not needed to select this option if you don't use such programs. @@ -3073,88 +3586,88 @@ Если вы не пользуетесь такими программами, включать эту опцию не нужно. - + Use &GoldenDict message Использовать запрос &GoldenDict - + History Журнал - + Turn this option on to store history of the translated words Включите эту опцию, чтобы вести журнал переведённых слов - + Store &history Вести журнал - + Specify the maximum number of entries to keep in history. Определяет максимальное количество записей в журнале - + Maximum history size: Максимальный размер журнала: - + History saving interval. If set to 0 history will be saved only during exit. Интервал сохранения журнала. Если он установлен в 0, журнал будет сохраняться только при выходе из программы. - + Save every Сохранять каждые - + minutes минут - + Articles Статьи - + Turn this option on to always expand optional parts of articles Включите эту опцию, если хотите всегда раскрывать дополнительные области статей - + Expand optional &parts Раскрывать дополнительные области - + Select this option to automatic collapse big articles Включите эту опцию чтобы автоматически сворачивать большие статьи - + Collapse articles more than Сворачивать статьи более чем - + Articles longer than this size will be collapsed Статьи размером более этой величины будут свёрнуты - + symbols символов - + <!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; } @@ -3167,84 +3680,84 @@ <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" color:#ff0000;">Замечание: Кажется, Вы используете версию X.Org XServer, в которой отсутствует поддержка расширения RECORD. Вероятно, горячие клавиши в GoldenDict не заработают. Эта проблема должна быть исправлена на стороне XServer. Более подробную информацию смотрите на </span><a href="https://bugs.freedesktop.org/show_bug.cgi?id=20500"><span style=" text-decoration: underline; color:#0000ff;">bug entry</span></a><span style=" color:#ff0000;"> и, если хотите, оставляйте там свои пожелания.</span></p></body></html> - + &Audio &Аудио - + Pronunciation Произношение - + Auto-pronounce words in main window Автоматически произносить слова в главном окне - + Auto-pronounce words in scan popup Автоматически произносить слова во всплывающем окне - + Playback Воспроизведение - + Use any external program to play audio files Использовать любую внешнюю программу для проигрывания аудио-файлов - + Use external program: Воспроизведение через внешнее приложение: - + &Network &Сеть - + Enable if you wish to use a proxy server for all program's network requests. Включите, если хотите использовать прокси-сервер для всех сетевых запросов программы. - + Use proxy server Использовать прокси-сервер - + Type: Тип: - + Host: Сервер: - + Port: Порт: - + User: Имя пользователя: - + Password: Пароль: - + Enabling this would make GoldenDict block most advertisements by disallowing content (images, frames) not originating from the site you are browsing. If some site breaks because of this, try disabling this. @@ -3254,12 +3767,12 @@ из-за этого функционировать, попробуйте запретить эту опцию. - + Disallow loading content from other sites (hides most advertisements) Запретить загрузку информации с других сайтов (убирает большую часть рекламы) - + Enabling this would allow to listen to sound pronunciations from online dictionaries that rely on Flash or other web plugins. Plugin must be installed for this option to work. @@ -3268,12 +3781,12 @@ Чтобы это работало, плагины должны быть установлены. - + Enable web plugins Разрешить веб-плагины - + When this is enabled, the program periodically checks if a new, updated version of GoldenDict is available for download. If it is so, the program @@ -3286,52 +3799,53 @@ страницу загрузки. - + Check for new program releases periodically Проверять наличие новой версии - + System default По умолчанию - + + Default По умолчанию - + Modern Modern - + Lingvo Lingvo - + Babylon Babylon - + Lingoes Lingoes - + Lingoes-Blue Lingoes-Blue - + Changing Language Смена языка - + Restart the program to apply the language change. Перезапустите программу, чтобы изменение языка вошло в силу. @@ -3339,27 +3853,27 @@ ProgramTypeEditor - + Audio Аудио - + Plain Text Текст - + Html Html - + Prefix Match По префиксу - + Unknown Неизвестно @@ -3385,27 +3899,27 @@ ProgramsModel - + Enabled Включено - + Type Тип - + Name Имя программы - + Command Line Командная строка - + Icon Значок @@ -3413,12 +3927,14 @@ QObject - + + Article loading error Ошибка загрузки статьи - + + Article decoding error Ошибка декодирования статьи @@ -3529,18 +4045,18 @@ ResourceToSaveHandler - - + + ERROR: %1 ОШИБКА: %1 - + Resource saving error: Ошибка записи данных: - + The referenced resource failed to download. Невозможно загрузить указанный ресурс. @@ -3548,12 +4064,12 @@ Romaji - + Hepburn Romaji for Hiragana Система Хэпбёрна (Хирагана) - + Hepburn Romaji for Katakana Система Хэпбёрна (Катакана) @@ -3574,59 +4090,59 @@ Диалог - + Back Назад - + Forward Вперёд - + Pronounce Word (Alt+S) Произнести слово (Alt+S) - + Alt+S Alt+S - + Send word to main window (Alt+W) Отправить слово в главное окно (Alt+W) - + Alt+W Alt+W - + Shows or hides the dictionary bar Показать или спрятать словарную панель - + Use this to pin down the window so it would stay on screen, could be resized or managed in other ways. Нажмите, чтобы закрепить окно на экране, изменить его размер или какие-либо другие свойства. - - - - - + + + + + ... ... - - + + %1 - %2 %1 - %2 @@ -3634,17 +4150,17 @@ SoundDirsModel - + Path Путь - + Name Название - + Icon Значок @@ -3652,45 +4168,47 @@ Sources - + Text to Speech Синтез речи - + (not available in portable version) (не реализовано в переносимой версии) - - - + + + Choose a directory Выбор пути - - - - - + + + + + + Confirm removal Подтверждение удаления - - + + Remove directory <b>%1</b> from the list? Удалить путь <b>%1</b> из списка? - - + + + Remove site <b>%1</b> from the list? Удалить веб-сайт <b>%1</b> из списка? - + Remove program <b>%1</b> from the list? Удалить программу <b>%1</b> из списка? @@ -3709,7 +4227,8 @@ - + + &Add... &Добавить... @@ -3718,7 +4237,8 @@ - + + &Remove &Удалить @@ -3794,36 +4314,46 @@ + DICT servers + Серверы DICT + + + + DICT servers: + Серверы DICT: + + + Programs Программы - + Any external programs. A string %GDWORD% will be replaced with the query word. If such string is not presented, the word will be fed into standard input. Любые внешние программы. Строка %GDWORD% будет заменена на запрашиваемое слово. Если такой строки нет, слово будет отправлено в стандартный входной поток. - + Forvo Forvo - + Live pronunciations from <a href="http://www.forvo.com/">forvo.com</a>. The site allows people to record and share word pronunciations. You can listen to them from GoldenDict. Живое произношение с сайта <a href="http://www.forvo.com/">forvo.com</a>. Сайт позволяет людям записывать и обмениваться произношениями слов. Вы можете прослушивать их из GoldenDict. - + Enable pronunciations from Forvo Включить произношения с Forvo - + API Key: Ключ API: - + Use of Forvo currently requires an API key. Leave this field blank to use the default key, which may become unavailable in the future, or register on the site to get your own key. @@ -3833,79 +4363,79 @@ сайте, чтобы получить свой собственный ключ. - + Get your own key <a href="http://api.forvo.com/key/">here</a>, or leave blank to use the default one. Получите ваш ключ <a href="http://api.forvo.com/key/">здесь</a>, или оставьте пустым для использования ключа по умолчанию. - + Language codes (comma-separated): Список языковых кодов (через запятую): - + List of language codes you would like to have. Example: "en, ru". Список кодов для языков, которые вы хотели бы использовать. Пример: "en, ru". - + Full list of language codes is available <a href="http://www.forvo.com/languages-codes/">here</a>. Полный список языковых кодов доступен <a href="http://www.forvo.com/languages-codes/">здесь</a>. - + Transliteration Транслитерация - + Russian transliteration Транслитерация (Русский) - + Greek transliteration Транслитерация (Греческий) - + German transliteration Транслитерация (Немецкий) - + Belarusian transliteration Транслитерация (Белорусский) - + Enables to use the Latin alphabet to write the Japanese language Позволяет использовать латинский алфавит для ввода на Японском - + Japanese Romaji Ромадзи (Японский) - + Systems: Системы: - + The most widely used method of transcription of Japanese, based on English phonology Наиболее популярный метод транскрибирования Японского, основанный на Английской фонологии - + Hepburn Хэпбёрн - + The most regular system, having a one-to-one relation to the kana writing systems. Standardized as ISO 3602 @@ -3916,12 +4446,12 @@ В GoldenDict пока не реализована. - + Nihon-shiki Nihon-shiki - + Based on Nihon-shiki system, but modified for modern standard Japanese. Standardized as ISO 3602 @@ -3932,32 +4462,32 @@ В GoldenDict пока не реализована. - + Kunrei-shiki Kunrei-shiki - + Syllabaries: Слоговые азбуки: - + Hiragana Japanese syllabary Слоговая азбука "Хирагана" - + Hiragana Хирагана - + Katakana Japanese syllabary Слоговая азбука "Катакана" - + Katakana Катакана @@ -4064,7 +4594,7 @@ Type a word or phrase to search dictionaries - Введите слово или словосочестание для поиска в словарях + Введите слово или словосочетание для поиска в словарях @@ -4098,22 +4628,22 @@ WebSitesModel - + Enabled Включено - + Name Название - + Address Адрес - + Icon Значок @@ -4121,7 +4651,7 @@ WordFinder - + Failed to query some dictionaries. Ошибка поиска в некоторых словарях. diff -Nru goldendict-1.5.0~git20131003/locale/sk_SK.ts goldendict-1.5.0~git20150923/locale/sk_SK.ts --- goldendict-1.5.0~git20131003/locale/sk_SK.ts 2013-10-02 20:42:04.000000000 +0000 +++ goldendict-1.5.0~git20150923/locale/sk_SK.ts 2015-09-23 08:26:24.000000000 +0000 @@ -34,7 +34,7 @@ [Neznámy] - + Based on Qt %1 (%2, %3 bit) Založené na Qt %1 (%2, %3 bit) @@ -42,62 +42,62 @@ ArticleMaker - + Expand article Rozbaliť článok - + Collapse article Skrátiť článok - + No translation for <b>%1</b> was found in group <b>%2</b>. V skupine <b>%2</b> nebol nájdený preklad pre <b>%1</b>. - + No translation was found in group <b>%1</b>. V skupine <b>%1</b> nebol nájdený preklad. - + Welcome! Vitajte! - + <h3 align="center">Welcome to <b>GoldenDict</b>!</h3><p>To start working with the program, first visit <b>Edit|Dictionaries</b> to add some directory paths where to search for the dictionary files, set up various Wikipedia sites or other sources, adjust dictionary order or create dictionary groups.<p>And then you're ready to look up your words! You can do that in this window by using a pane to the left, or you can <a href="Working with popup">look up words from other active applications</a>. <p>To customize program, check out the available preferences at <b>Edit|Preferences</b>. All settings there have tooltips, be sure to read them if you are in doubt about anything.<p>Should you need further help, have any questions, suggestions or just wonder what the others think, you are welcome at the program's <a href="http://goldendict.org/forum/">forum</a>.<p>Check program's <a href="http://goldendict.org/">website</a> for the updates. <p>(c) 2008-2013 Konstantin Isakov. Licensed under GPLv3 or later. - <h3 align="center">Vitajte v programe<b>GoldenDict</b>!</h3><p>Prácu v programe začnite v <b>Upraviť|Slovníky</b>, kde môžete pridať cesty k priečinkom v ktorých budú vyhľadané slovníky, nastaviť rôzne stránky Wikipedie a iné zdroje, upraviť poradenie poradenie slovníkov alebo vytvoriť slovníkové skupiny.</p><p>Potom budete môcť začať vyhľadať slová! Môžete tak robiť v tomto okne s použitím panela vľavo, alebo môžete <a href="Working with popup">vyhľadávať slová z iných aktívnych aplikácií</a>.</p><p>Úpravu vlastností programu môžete urobiť <b>Upraviť|Nastavenia…</b>. Všetky nastavenia majú popisy, ktoré vám pomôžu, pokiaľ si nebudete niečim istý.</p><p>Pokiaľ budete potrebovať ďalšiu pomoc, máte nejaké návrhy, alebo len chcete vedieť, čo si myslia iný, tak ste vítaní na <a href="http://goldendict.org/forum/">diskusnom fóre</a>.</p><p>Aktualizácie hľadajte na <a href="http://goldendict.org/">stránkach GoldenDict</a>.</p><p>(c) 2008-2013 Konstantin Isakov. Licencované pod GPLv3 alebo novšou. + <h3 align="center">Vitajte v programe <b>GoldenDict</b>!</h3><p>Prácu v programe začnite v <b>Upraviť|Slovníky</b>, kde môžete pridať cesty k priečinkom v ktorých budú vyhľadané slovníky, nastaviť rôzne stránky Wikipedie a iné zdroje, upraviť poradenie poradenie slovníkov alebo vytvoriť slovníkové skupiny.</p><p>Potom budete môcť začať vyhľadať slová! Môžete tak robiť v tomto okne s použitím panela vľavo, alebo môžete <a href="Working with popup">vyhľadávať slová z iných aktívnych aplikácií</a>.</p><p>Úpravu vlastností programu môžete urobiť <b>Upraviť|Nastavenia…</b>. Všetky nastavenia majú popisy, ktoré vám pomôžu, pokiaľ si nebudete niečim istý.</p><p>Pokiaľ budete potrebovať ďalšiu pomoc, máte nejaké návrhy, alebo len chcete vedieť, čo si myslia iný, tak ste vítaní na <a href="http://goldendict.org/forum/">diskusnom fóre</a>.</p><p>Aktualizácie hľadajte na <a href="http://goldendict.org/">stránkach GoldenDict</a>.</p><p>(c) 2008-2013 Konstantin Isakov. Licencované pod GPLv3 alebo novšou. - + Working with popup Práca s vyskakovacím oknom - + <h3 align="center">Working with the popup</h3>To look up words from other active applications, you would need to first activate the <i>"Scan popup functionality"</i> in <b>Preferences</b>, and then enable it at any time either by triggering the 'Popup' icon above, or by clicking the tray icon down below with your right mouse button and choosing so in the menu you've popped. <h3 align="center">Práca s vyskakovacím oknom</h3>Aby ste mohli vyhľadávať slová z iných aplikácií, potrebujete si najskôr aktivovať <i>„Vyskakovacie okno“</i> v položke <b>Nastavenia</b> a potom ju kedykoľvek povoľte kliknutím na 'Vyskakovaciu' ikonu, alebo kliknutím na ikonu v systémovom panely cez pravé tlačidlo myši a následným výberom z ponuky. - + Then just stop the cursor over the word you want to look up in another application, and a window would pop up which would describe it to you. Potom sa len nastavte kurzor nad slovom v inej aplikácií, ktoré chcete vyhľadať, a vyskočí okno, ktoré vám ho popíše. - + Then just select any word you want to look up in another application by your mouse (double-click it or swipe it with mouse with the button pressed), and a window would pop up which would describe the word to you. Potom len vyberte akékoľvek slovo v inej aplikácií, ktoré chcete vyhľadať (dvojklikom alebo označením pomocou ťahania myšou) a vyskočí okno, ktoré vám to slovo popíše. - + (untitled) (Bez názvu) - + (picture) (obrázok) @@ -105,37 +105,37 @@ ArticleRequest - + Expand article Rozbaliť článok - + From Z - + Collapse article Skrátiť článok - + Query error: %1 Chyba požiadavky: %1 - + Close words: Blízke slová: - + Compound expressions: Zložené výrazy: - + Individual words: Jednotlivé slová: @@ -148,82 +148,84 @@ Formulár - + about:blank about: blank - + x x - + Find: Hľadať: - + + &Previous &Predchádzajúci - + + &Next Ď&alší - + Ctrl+G Ctrl+G - + &Case Sensitive &Citlivý na veľkosť písmen - + Highlight &all Zvýr&azniť všetko - + Resource Zdroj - + Audio Audio - + TTS Voice TTS Hlas - + Picture Obrázok - + Video Video - + Video: %1 Video: %1 - + Definition from dictionary "%1": %2 Definícia zo slovníka "%1": %2 - + Definition: %1 Definícia: %1 @@ -232,38 +234,39 @@ GoldenDict - - + + The referenced resource doesn't exist. Referencovaný zdroj neexistuje. - + The referenced audio program doesn't exist. Odkazovaný audio program neexistuje. - + + ERROR: %1 CHYBA: %1 - + Save sound Uložiť zvuk - + Sound files (*.wav *.ogg *.mp3 *.mp4 *.aac *.flac *.mid *.wv *.ape);;All files (*.*) Zvukové súbory (*.wav *.ogg *.mp3 *.mp4 *.aac *.flac *.mid *.wv *.ape);;Všetky súbory (*.*) - + Save image Uložiť obrázok - + Image files (*.bmp *.jpg *.png *.tif);;All files (*.*) Uložiť obrázky (*.bmp *.jpg *.png *.tif);;Všetky súbory (*.*) @@ -272,63 +275,63 @@ Chyba ukladania zdroja: - + &Open Link &Otvoriť odkaz - + Open Link in New &Tab Otvoriť odkaz v nove kar&te - + Open Link in &External Browser Otvoriť odkaz v &externom prehliadači - + Save &image... Uložiť &obrázok… - + Save s&ound... Uložiť &zvuk… - + &Look up "%1" &Hľadať "%1" - + Look up "%1" in &New Tab Hľadať "%1" v &novej karte - + Send "%1" to input line Odoslať "%1" do vstupného riadku - - + + &Add "%1" to history Prid&ať "%1" do histórie - + Look up "%1" in %2 Hľadať "%1" v %2 - + Look up "%1" in %2 in &New Tab Hľadať "%1" v %2 v &novej karte - + WARNING: FFmpeg Audio Player: %1 VAROVANIE: FFmpeg Audio Player: %1 @@ -349,42 +352,42 @@ Knižnica Bass nevie prehrať tento zvuk. - + Failed to run a player to play sound file: %1 Nepodarilo sa spustiť prehrávač pre prehrávanie zvukových súborov: %1 - + Failed to create temporary file. Nepodarilo sa vytvoriť dočasný súbor. - + Failed to auto-open resource file, try opening manually: %1. Nepodarilo sa automaticky otvoriť súbor so zdrojmi. Pokúste sa ho otvoriť ručne: %1. - + WARNING: %1 VAROVANIE: %1 - + Select Current Article Označiť aktuálny článok - + Copy as text Kopírovať ako text - + Inspect Kontrolovať - + The referenced resource failed to download. Referencovaný zdroj sa nepodarilo stiahnuť. @@ -410,6 +413,29 @@ + Dialog + + + Proxy authentication required + + + + + You need to supply a Username and a Password to access via proxy + + + + + Username: + + + + + Password: + Heslo: + + + DictGroupWidget @@ -510,6 +536,119 @@ + DictHeadwords + + + Search mode + + + + + This element determines how filter string will be interpreted + + + + + If checked on the symbols case will be take in account when filtering + + + + + Match case + + + + + Exports headwords to file + + + + + Export + + + + + Help + + + + + OK + + + + + Press this button to apply filter to headwords list + + + + + Apply + + + + + If checked any filter changes will we immediately applied to headwords list + + + + + Auto apply + + + + + Filter: + + + + + Filter string (fixed string, wildcards or regular expression) + + + + + Text + + + + + Wildcards + + + + + RegExp + + + + + Unique headwords total: %1, filtered: %2 + + + + + Save headwords to file + + + + + Text files (*.txt);;All files (*.*) + Textové súbory (*.txt);;Všetky súbory (*.*) + + + + Export headwords... + + + + + Cancel + Zrušiť + + + DictInfo @@ -552,6 +691,16 @@ Popis: + + Show all unique dictionary headwords + + + + + Headwords + + + Edit the dictionary via command: %1 @@ -568,6 +717,74 @@ + DictServer + + + Url: + + + + + Databases: + + + + + Search strategies: + + + + + Server databases + + + + + DictServersModel + + + Enabled + Povolené + + + + Name + + + + + Address + Adresa + + + + Databases + + + + + Strategies + + + + + Icon + Ikona + + + + Comma-delimited list of databases +(empty string or "*" matches all databases) + + + + + Comma-delimited list of search strategies +(empty string mean "prefix" strategy) + + + + DictionaryBar Dictionary Bar @@ -589,17 +806,22 @@ Upraviť túto skupinu - + Dictionary info Info o slovníku - + + Dictionary headwords + + + + Open dictionary folder Otvoriť slovníkový priečinok - + Edit dictionary Upraviť slovník @@ -612,39 +834,39 @@ Slovníky - + &Sources &Zdroje - - + + &Dictionaries S&lovníky - - + + &Groups S&kupiny - + Sources changed Zdroje sa zmenili - + Some sources were changed. Would you like to accept the changes? Niektoré zdroje boli zmenené. Chcete akceptovať zmeny? - + Accept Prijať - + Cancel Zrušiť @@ -658,6 +880,92 @@ + FTS::FtsIndexing + + + None + Žiadny + + + + FTS::FullTextSearchDialog + + + Full-text search + + + + + Whole words + + + + + Plain text + + + + + Wildcards + + + + + RegExp + + + + + Max distance between words (%1-%2): + + + + + Max articles per dictionary (%1-%2): + + + + + + + Articles found: + + + + + Now indexing: + + + + + CJK symbols in search string are not compatible with search modes "Whole words" and "Plain text" + + + + + The search line must contains at least one word containing + + + + + or more symbols + + + + + No dictionaries for full-text search + + + + + FTS::Indexing + + + None + Žiadny + + + Forvo::ForvoArticleRequest @@ -696,6 +1004,65 @@ + FullTextSearchDialog + + + + Search + + + + + Match case + + + + + Mode: + + + + + Articles found: + + + + + Available dictionaries in group: + + + + + Wait for indexing: + + + + + Total: + + + + + Indexed: + + + + + Now indexing: None + + + + + Cancel + Zrušiť + + + + Help + + + + GermanTranslit @@ -826,7 +1193,7 @@ - + Remove all groups Odstrániť všetky skupiny @@ -836,42 +1203,100 @@ Chyťte a pretiahnite slovníky do a zo skupín, posuňte ich dovnútra skupiny a meňte ich poradenie pomocou myši. - + + Group tabs + + + + + Open groups list + + + + Add group Pridať skupinu - + Give a name for the new group: Zadajte názov novej skupiny: - + Rename group Premenovať skupinu - + Give a new name for the group: Zadajte nový názov skupine: - + Remove group Odstrániť skupinu - + Are you sure you want to remove the group <b>%1</b>? Ste si istí, že chcete odstrániť skupinu <b>%1</b>? - + Are you sure you want to remove all the groups? Ste si istí, že chcete odstrániť všetky skupiny? + Help::HelpWindow + + + GoldenDict help + + + + + Home + + + + + Back + Späť + + + + Forward + Vpred + + + + Zoom In + Priblížiť + + + + Zoom Out + Oddialiť + + + + Normal Size + Normálna veľkosť + + + + Content + + + + + Index + + + + HistoryPaneWidget @@ -902,12 +1327,12 @@ Hunspell - + Spelling suggestions: Návrhy k preklepom: - + %1 Morphology %1 morfológia @@ -915,12 +1340,12 @@ HunspellDictsModel - + Enabled Povolené - + Name Meno @@ -1960,7 +2385,7 @@ LoadDictionaries - + Error loading dictionaries Chyba pri načítavaní slovníkov @@ -1968,7 +2393,7 @@ Main - + Error in configuration file. Continue with default settings? Chyba v konfiguračnom súbore. Pokračovať so štandardnými nastaveniami? @@ -1981,37 +2406,37 @@ - + Welcome! Vitajte! - + &File &Súbor - + &Edit &Upraviť - + &Help &Pomocník - + &View &Zobrazenie - + &Zoom &Zväčšenie - + H&istory H&istória @@ -2024,17 +2449,17 @@ Výsledky navigačného panela - + &Search Pane Vy&hľadávací panel - + &Results Navigation Pane &Panel výsledkov - + &History Pane Panel &histórie @@ -2043,149 +2468,179 @@ &Slovníky… F3 - + + Search + + + + &Dictionaries... &Slovníky... - + F3 F3 - + &Preferences... &Nastavenia... - + F4 F4 - + &Homepage &Domovská stránka - + &About &O programe - + About GoldenDict O GoldenDict - + + GoldenDict reference + + + + F1 F1 - - + + &Quit &Koniec - + Quit from application Odísť z aplikácie - + Ctrl+Q Ctrl+Q - + &Forum &Fórum - + &Close To Tray &Minimalizovať do lišty - + Minimizes the window to tray Minimalizuje okno do lišty okien - + Ctrl+F4 Ctrl+F4 - + &Save Article &Uložiť článok - + Save Article Uložiť článok - + F2 F2 - + &Print &Tlač - + Ctrl+P Ctrl+P - + Page Set&up Nastavenie s&trany - + Print Pre&view Náhľad pred &tlačou - + &Rescan Files &Znovu vyhľadať súbory - + &New Tab &Nová karta - + &Always on Top &Vždy na vrchu - + Always on Top Vždy na vrchu - + Ctrl+O Ctrl+O - - - + + + Menu Button Tlačidlo Menu + + Search in page + + + + + Ctrl+F + + + + + Full-text search + + + + + Ctrl+Shift+F + + + Print Preview Náhľad pred tlačou @@ -2194,48 +2649,48 @@ Znovu vyhľadať súbory - + Ctrl+F5 Ctrl+F5 - + &Clear &Vymazať - + New Tab Nová karta - + Ctrl+T Ctrl+T - + &Configuration Folder &Konfiguračný priečinok - - + + &Show &Zobraziť - + Ctrl+H Ctrl+H - + &Export &Exportovať - + &Import &Importovať @@ -2248,18 +2703,18 @@ Zobraziť malé ikony v paneloch - + &Menubar &Panel s ponukou - - + + Look up in: Hľadať v: - + Found in Dictionaries: Nájdené v slovníkoch: @@ -2268,127 +2723,127 @@ Navigácia - + Back Späť - + Forward Vpred - + Scan Popup Vyskakovanie okno - + Pronounce Word (Alt+S) Vysloviť slovo (Alt + S) - + Zoom In Priblížiť - + Zoom Out Oddialiť - + Normal Size Normálna veľkosť - + Words Zoom In Zväčšiť slová - + Words Zoom Out Zmenšiť slová - + Words Normal Size Bežná veľkosť slov - + Show &Main Window Zobraziť &hlavné okno - + Close current tab Zatvoriť aktuálnu kartu - + Close all tabs Zatvoriť všetky karty - + Close all tabs except current Zatvoriť všetky karty okrem aktuálnej - + Loading... Načítavanie ... - + %1 dictionaries, %2 articles, %3 words Slovníky: %1, články: %2, slová: %3 - + Look up: Hľadať: - + All Všetko - + Opened tabs Otvorené karty - + Show Names in Dictionary &Bar Zobraziť názvy v &panely slovníka - + Show Small Icons in &Toolbars Zobraziť malé ikony v panely nás&trojov - + &Navigation &Navigácia - + Open Tabs List Otvorí zoznam kariet - + (untitled) (Bez názvu) - + %1 - %2 %1 - %2 @@ -2397,74 +2852,80 @@ VAROVANIE: %1 - + Failed to initialize hotkeys monitoring mechanism.<br>Make sure your XServer has RECORD extension turned on. Nepodarilo sa inicializovať monitorovací mechanizmus klávesových skratiek.<br> Uistite sa, že X server má zapnuté rozšírenie RECORD. - + New Release Available Je dostupná nová verzia - + Version <b>%1</b> of GoldenDict is now available for download.<br>Click <b>Download</b> to get to the download page. GoldenDict verzia <b>%1</b> je dostupná na stiahnutie. <br>Kliknutím na <b>Stiahnuť</b> sa dostane na stránku, kde je možné program stiahnuť. - + Download Stiahnuť - + Skip This Release Preskočiť toto vydanie - - + + Accessibility API is not enabled API Dostupnosti nie je povolené - + + String to search in dictionaries. The wildcards '*', '?' and sets of symbols '[...]' are allowed. +To find '*', '?', '[', ']' symbols use '\*', '\?', '\[', '\]' respectively + + + + You have chosen to hide a menubar. Use %1 to show it back. Vybrali ste si skrytie panelu s ponukou. Použite %1 ak ho chcete znova zobraziť. - + Ctrl+M Ctrl+M - + Page Setup Nastavenie strany - + No printer is available. Please install one first. Žiadna tlačiareň nie je k dispozícii. Prosím, nainštalujte aspoň jednu. - + Print Article Vytlačiť článok - + Article, Complete (*.html) Článok, Kompletný (*.html) - + Article, HTML Only (*.html) Článok, iba HTML (*.html) - + Save Article As Uložiť článok ako @@ -2473,83 +2934,88 @@ Html súbory (*.html *.htm) - + Error Chyba - + Can't save article: %1 Nie je možné uložiť článok: %1 - + Saving article... Ukladanie článku… - + The main window is set to be always on top. Hlavné okno je nastavené, aby bolo vždy na vrchu. - + &Hide S&kryť - + Export history to file Exportovať históriu do súboru - - + + Text files (*.txt);;All files (*.*) Textové súbory (*.txt);;Všetky súbory (*.*) - + History export complete Export histórie ukončený - + Export error: Chyba exportu: - + Import history from file Import histórie zo súboru - + Import error: invalid data in file Chyba importu: neplatné dáta v súbore - + History import complete Import histórie je ukončený - + Import error: Chyba importu: - + Dictionary info Info o slovníku - + + Dictionary headwords + + + + Open dictionary folder Otvoriť slovníkový priečinok - + Edit dictionary Upraviť slovník @@ -2557,12 +3023,12 @@ Mdx::MdxArticleRequest - + Dictionary file was tampered or corrupted Slovníkový súbor bol poškodený alebo sfalšovaný - + Failed loading article from %1, reason: %2 Nepodarilo sa načítať článok z %1; dôvod: %2 @@ -2570,7 +3036,7 @@ MediaWiki::MediaWikiArticleRequest - + XML parse error: %1 at %2,%3 Chyba spracovania XML: %1 v %2,%3 @@ -2578,7 +3044,7 @@ MediaWiki::MediaWikiWordSearchRequest - + XML parse error: %1 at %2,%3 Chyba spracovania XML: %1 v %2,%3 @@ -2586,22 +3052,22 @@ MediaWikisModel - + Enabled Povolené - + Name Meno - + Address Adresa - + Icon Ikona @@ -2614,88 +3080,94 @@ Formulár - + Dictionary order: Poradie slovníkov: - - - - ... - + - + Inactive (disabled) dictionaries: Neaktívne (nepovolené) slovníky: - + Dictionary information Informácie o slovníku - + Name: Meno: - + Total articles: Počet článkov: - + Total words: Počet slov: - + Translates from: Prekladá z: - + Translates to: Prekladá do: - + Description: Popis: - + Files comprising this dictionary: Súbory obsiahnuté v slovníku: - + Adjust the order by dragging and dropping items in it. Drop dictionaries to the inactive group to disable their use. Upravte poradie uchopením a presunutím položky na požadované miesto. Presuňte slovníky do neaktívnej skupiny pre zakázanie ich použitia. - + Sort by name Zoradiť podľa názvu - + Sort by languages Zoradiť podľa jazyka + + + Dictionary headwords + + + + + Dictionaries active: %1, inactive: %2 + + PathsModel - + Path Cesta - + Recursive Rekurzívne @@ -2849,22 +3321,27 @@ Štýl rozšírenia: - + + Help language + + + + Adjust this value to avoid huge context menus. Upravte túto hodnotu pre zabránenie veľkej kontextovej ponuky. - + Context menu dictionaries limit: Limit slovníkov pre kontextovú ponuku: - + &Scan Popup Vy&skakovacie okno - + When enabled, a translation popup window would be shown each time you point your mouse on any word on the screen (Windows) or select any word with mouse (Linux). When enabled, you can switch it on and @@ -2873,135 +3350,135 @@ keď sa postavíte s myšou nad slovo (Windows) alebo ho označíte (Linux). Ak je povolené, môžete ho zapnúť a vypnúť z hlavného okna alebo ikony v systémovej oblasti. - + Enable scan popup functionality Povoliť vyskakovacie okno - + Chooses whether the scan popup mode is on by default or not. If checked, the program would always start with the scan popup active. Určuje, či vyskakovacie okno je automaticky povolené, alebo zakázané. Pokiaľ je zaškrtnuté, program sa bude spúšťať s automaticky aktivovaným vyskakovacím oknom. - + Start with scan popup turned on Spustiť s povoleným vyskakovacím oknom - + With this enabled, the popup would only show up if all chosen keys are in the pressed state when the word selection changes. Pokiaľ toto povolíte, vyskakovacie okno sa zobrazí iba v prípade, keď budú stlačené zvolené klávesy počas výberu slova. - + Only show popup when all selected keys are kept pressed: Zobraziť vyskakovacie okno iba pokiaľ sú stlačené vybrané klávesy: - + Left Ctrl only Left Ctrl only - + Left Ctrl Left Ctrl - + Right Shift only Iba pravý Shift - + Right Shift Pravý Shift - + Alt key Kláves Alt - + Alt Alt - + Ctrl key Kláves Ctrl - + Ctrl Ctrl - + Left Alt only Iba ľavý Alt - + Left Alt Ľavý Alt - + Shift key Kláves Shift - + Shift Shift - + Right Alt only Iba pravý Alt - + Right Alt Pravý Alt - + Right Ctrl only Iba pravý Ctrl - + Right Ctrl Pravý Ctrl - + Left Shift only Iba ľavý Shift - + Left Shift Ľavý Shift - + Windows key or Meta key Klávesa Windows alebo Meta - + Win/Meta Win/Meta - + Normally, in order to activate a popup you have to maintain the chosen keys pressed while you select a word. With this enabled, the chosen keys may also @@ -3012,54 +3489,54 @@ až po označení slova. - + Keys may also be pressed afterwards, within Klávesy môžu byť stlačené postupne po - + To avoid false positives, the keys are only monitored after the selection's done for a limited amount of seconds, which is specified here. Aby ste sa vyhli neúmyselnému spusteniu, klávesy sú monitorované iba niekoľko sekúnd (tu môžete nastaviť ich počet), potom čo označíte text. - + secs sek - + Send translated word to main window instead of to show it in popup window Odoslať preložené slovo do hlavného okna namiesto jeho zobrazenia vo vyskakovacom okne - + Send translated word to main window Odoslať preložené slovo do hlavného okna - + Hotkeys Klávesové skratky - + Use the following hotkey to show or hide the main window: Použite nasledujúcu klávesovú skratku pre zobrazenie alebo skrytie hlavného okna: - + Use the following hotkey to translate a word from clipboard: Použite nasledujúcu klávesovú skratku pre preklad slova zo schránky: - + The hotkeys are global and work from any program and within any context as long as GoldenDict is running in background. Klávesové skratky sú globálne a fungujú z akéhokoľvek programu a akomkoľvek kontexte pokiaľ GoldenDict beží na pozadí. - + <!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; } @@ -3072,57 +3549,92 @@ <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" color:#ff0000;">Poznámka: Zdá sa, že používate X.Org XServer verziu, ktorá má poškodené rozšírenie RECORD. Klávesové skratky v Goldendict preto nebudú pravdepodobne fungovať. Toto musí byť najskôr vyriešené v samotnom XServeri. Prosím pozrite sa na následujúce </span><a href="https://bugs.freedesktop.org/show_bug.cgi?id=20500"><span style=" text-decoration: underline; color:#0000ff;">chybové hlásenie</span></a><span style=" color:#ff0000;"> a keď chcete, tak tam dajte svoj komentár.</span></p></body></html> - + &Audio &Audio - + Pronunciation Výslovnosť - + Auto-pronounce words in main window Automaticky vysloviť slová v hlavnom okne - + Auto-pronounce words in scan popup Automaticky vysloviť slová vo vyskakovacom okne - + Playback Prehrávanie - + Play audio files via FFmpeg(libav) and libao Prehra audio súbory cez FFmpeg(libav) a libao - + Use internal player Použiť interný prehrávač - + + System proxy + + + + + Custom proxy + + + + + Custom settings + + + + + Full-text search + + + + + Allow full-text search for: + + + + + Don't search in dictionaries containing more than + + + + + articles (0 - unlimited) + + + + Select this option to automatic collapse big articles Vyberte túto ponuku pre automatické skrátenie dlhých článkov - + Collapse articles more than Skrátiť články väčšie než - + Articles longer than this size will be collapsed Články dlhšie než je táto veľkosť budú skrátené - + symbols symboly @@ -3155,71 +3667,71 @@ Prehrať cez Bass knižnicu - + Use any external program to play audio files Použiť pre prehrávanie audio súborov externý program - + Use external program: Použiť externý program: - + &Network &Sieť - + Enable if you wish to use a proxy server for all program's network requests. Povoliť pokiaľ chcete použiť proxy server pre všetky sieťové požiadavky programu. - + Use proxy server Použiť proxy server - + Type: Typ: - + Host: Hostiteľ: - + Port: Port: - + User: Používateľ: - + Password: Heslo: - + Enabling this would make GoldenDict block most advertisements by disallowing content (images, frames) not originating from the site you are browsing. If some site breaks because of this, try disabling this. Toto umožní GoldenDictu blokovať väčšinu reklám nepovolením obsahu (obrázky, rámce), ktoré pochádzajú z inej stránky, než je tá, ktorú prezeráte. Pokiaľ sa kvôli tomuto niektoré stránky pokazia, skúste túto voľbu zakázať. - + Disallow loading content from other sites (hides most advertisements) Zakázať načítanie obsahu z iných webov (skryje väčšinu reklám) - + Enabling this would allow to listen to sound pronunciations from online dictionaries that rely on Flash or other web plugins. Plugin must be installed for this option to work. @@ -3227,24 +3739,24 @@ Zásuvný modul musí byť nainštalovaný, aby táto voľba fungovala. - + Enable web plugins Povoliť web zásuvné moduly - + Some sites detect GoldenDict via HTTP headers and block the requests. Enable this option to workaround the problem. Niektoré stránky odhalia GoldenDict cez HTTP hlavičky a blokujú jeho požiadavky. Povoľte toto nastavenie na obídenie problému. - + Do not identify GoldenDict in HTTP headers Neidentifikovať GoldenDict v HTTP hlavičke - + When this is enabled, the program periodically checks if a new, updated version of GoldenDict is available for download. If it is so, the program @@ -3257,22 +3769,22 @@ na stiahnutie. - + Check for new program releases periodically Pravidelne kontrolovať dostupnosť nových verzií - + Ad&vanced &Pokročilé - + ScanPopup extra technologies Extra technológie pre vyskakovacie okno - + Try to use IAccessibleEx technology to retrieve word under cursor. This technology works only with some programs that support it (for example Internet Explorer 9). @@ -3283,12 +3795,12 @@ Nie je potrebné použiť túto voľbu, ak nepoužívate takéto programy. - + Use &IAccessibleEx Použiť &IAccessibleEx - + Try to use UI Automation technology to retrieve word under cursor. This technology works only with some programs that support it. It is not needed to select this option if you don't use such programs. @@ -3297,12 +3809,12 @@ Nie je potrebné použiť túto voľbu, ak nepoužívate takéto programy. - + Use &UIAutomation Použiť &UIAutomation - + Try to use special GoldenDict message to retrieve word under cursor. This technology works only with some programs that support it. It is not needed to select this option if you don't use such programs. @@ -3311,97 +3823,98 @@ Nie je potrebné použiť túto voľbu, ak nepoužívate takéto programy. - + Use &GoldenDict message Použiť &GoldenDict správu - + History História - + Turn this option on to store history of the translated words Zapnite túto voľbu pre uchovanie histórie preložených slov - + Store &history Uchovať &históriu - + Specify the maximum number of entries to keep in history. Nastaví maximálny počet položiek pre uchovanie v histórií. - + Maximum history size: Maximálna veľkosť histórie: - + History saving interval. If set to 0 history will be saved only during exit. Interval ukladania histórie. Ak je nastavený na 0, história sa bude ukladať pri ukončení. - + Save every Uložiť každých - + minutes minút - + Articles Články - + Turn this option on to always expand optional parts of articles Zapnite túto voľbu, aby sa vždy vždy rozbalili voliteľné časti článkov - + Expand optional &parts Rozbaliť voliteľné &časti - + System default Systémové nastavenie - + + Default Štandardné - + Modern Moderné - + Lingvo Lingvo - + Babylon Babylon - + Lingoes Lingoes - + Lingoes-Blue Lingoes-Blue @@ -3410,12 +3923,12 @@ Hrať cez DirectShow - + Changing Language Zmena jazyka - + Restart the program to apply the language change. Reštartovať program pre aplikovanie zmeny jazyka. @@ -3423,27 +3936,27 @@ ProgramTypeEditor - + Audio Audio - + Plain Text Obyčajný text - + Html Html - + Prefix Match Zhoda predpony - + Unknown Neznámy @@ -3469,27 +3982,27 @@ ProgramsModel - + Enabled Povolené - + Type Typ - + Name Meno - + Command Line Príkazový riadok - + Icon Ikona @@ -3497,12 +4010,14 @@ QObject - + + Article loading error Chyba načítania článku - + + Article decoding error Chyba dekódovania článku @@ -3613,18 +4128,18 @@ ResourceToSaveHandler - - + + ERROR: %1 CHYBA: %1 - + Resource saving error: Chyba ukladania zdroja: - + The referenced resource failed to download. Referencovaný zdroj sa nepodarilo stiahnuť. @@ -3632,12 +4147,12 @@ Romaji - + Hepburn Romaji for Hiragana Hepburn Romaji pre Hiragana - + Hepburn Romaji for Katakana Hepburn Romaji pre Katakana @@ -3666,21 +4181,21 @@ Zoznam zhôd (Alt + M) - - - - - + + + + + ... - + Back Späť - + Forward Vpred @@ -3689,32 +4204,32 @@ Alt+M - + Pronounce Word (Alt+S) Vysloviť slovo (Alt + S) - + Alt+S Alt+S - + Send word to main window (Alt+W) Poslať slovo do hlavného okna (Alt+W) - + Alt+W Alt+W - + Shows or hides the dictionary bar Zobrazí alebo skryje panel slovníkov - + Use this to pin down the window so it would stay on screen, could be resized or managed in other ways. Pomocou tohto môžete prišpendliť okno, tak že zostane na obrazovke, @@ -3725,8 +4240,8 @@ GoldenDict - - + + %1 - %2 %1 - %2 @@ -3734,17 +4249,17 @@ SoundDirsModel - + Path Cesta - + Name Meno - + Icon Ikona @@ -3766,7 +4281,8 @@ - + + &Add... &Pridať ... @@ -3775,7 +4291,8 @@ - + + &Remove Odst&rániť @@ -3852,7 +4369,7 @@ Prípadne môžete použiť %GD1251% pre CP1251, %GDISO1% pre ISO 8859-1. - + Programs Programy @@ -3861,27 +4378,27 @@ Akýkoľvek externý program. Reťazec %GDWORD% bude nahradený so slovom z požiadavky. Slovo bude tiež prevedené do štandardného vstupu. - + Forvo Forvo - + Live pronunciations from <a href="http://www.forvo.com/">forvo.com</a>. The site allows people to record and share word pronunciations. You can listen to them from GoldenDict. Živá výslovnosť z <a href="http://www.forvo.com/">forvo.com</a>. Stánky umožňujú ľuďom nahrávať a zdieľa výslovnosť slov. V GoldenDicte si ich môžete vypočuť. - + Enable pronunciations from Forvo Povoliť výslovnosť z Forvo - + API Key: API kľúč: - + Use of Forvo currently requires an API key. Leave this field blank to use the default key, which may become unavailable in the future, or register on the site to get your own key. @@ -3890,7 +4407,7 @@ alebo sa na stránkach zaregistrujte a získajte vlastný kľúč. - + Get your own key <a href="http://api.forvo.com/key/">here</a>, or leave blank to use the default one. Získajte svoj vlastný kľuč <a href="http://api.forvo.com/key/">tu</a>, alebo ponechajte prázdne pre použitie štandardného kľúča. @@ -3920,79 +4437,89 @@ %GDBIG5% pre Big-5, %GDBIG5HKSCS% pre Big5-HKSCS, %GDGBK% pre GBK a GB18030, %GDSHIFTJIS% pre Shift-JIS. + + DICT servers + + + + DICT servers: + + + + Any external programs. A string %GDWORD% will be replaced with the query word. If such string is not presented, the word will be fed into standard input. Akýkoľvek externý program. Reťazec %GDWORD% bude nahradený so slovom požiadavky. Ak taký reťazec nebude nájdený, slovo bude vložené do štandardného vstupu. - + Language codes (comma-separated): Jazykové kódy (oddelené čiarkou): - + List of language codes you would like to have. Example: "en, ru". Zoznam kódov jazykov, ktoré by ste chceli mať. Príklad: "en, sk". - + Full list of language codes is available <a href="http://www.forvo.com/languages-codes/">here</a>. Úplný zoznam jazykových kódov je k dispozícii <a href="http://www.forvo.com/languages-codes/">tu</a>. - + Transliteration Prepis - + Russian transliteration Ruský prepis - + Greek transliteration Grécky prepis - + German transliteration Nemecký prepis - + Belarusian transliteration Bieloruský prepis - + Enables to use the Latin alphabet to write the Japanese language Umožňuje využívať latinku v japončine - + Japanese Romaji Japonské Romaji - + Systems: Systémy: - + The most widely used method of transcription of Japanese, based on English phonology Najrozšírenejší spôsob japonskej transkripcie, založený na anglickej fonológií - + Hepburn Hepburn - + The most regular system, having a one-to-one relation to the kana writing systems. Standardized as ISO 3602 @@ -4003,12 +4530,12 @@ Zatiaľ nie je implementovaný v GoldenDict. - + Nihon-shiki Nihon-shiki - + Based on Nihon-shiki system, but modified for modern standard Japanese. Standardized as ISO 3602 @@ -4019,75 +4546,77 @@ Zatiaľ nie je implementovaný v GoldenDict. - + Kunrei-shiki Kunrei-shiki - + Syllabaries: Šlabikáre: - + Hiragana Japanese syllabary Japonský šlabikár Hiragana - + Hiragana Hiragana - + Katakana Japanese syllabary Japonský šlabikár Katakana - + Katakana Katakana - + Text to Speech Text na reč - + (not available in portable version) (Nie je k dispozícii v prenosnej verzií) - - - + + + Choose a directory Vyberte si priečinok - - - - - + + + + + + Confirm removal Potvrdiť odstránenie - - + + Remove directory <b>%1</b> from the list? Odstrániť priečinok <b>%1</b> zo zoznamu? - - + + + Remove site <b>%1</b> from the list? Odstrániť stránku <b>%1</b> zo zoznamu? - + Remove program <b>%1</b> from the list? Odobrať program <b>%1</b> zo zoznamu? @@ -4217,22 +4746,22 @@ WebSitesModel - + Enabled Povolené - + Name Meno - + Address Adresa - + Icon Ikona @@ -4240,7 +4769,7 @@ WordFinder - + Failed to query some dictionaries. Nepodarilo sa dať požiadavku niektorým slovníkom. diff -Nru goldendict-1.5.0~git20131003/locale/sq_AL.ts goldendict-1.5.0~git20150923/locale/sq_AL.ts --- goldendict-1.5.0~git20131003/locale/sq_AL.ts 2013-10-02 20:42:04.000000000 +0000 +++ goldendict-1.5.0~git20150923/locale/sq_AL.ts 2015-09-23 08:26:24.000000000 +0000 @@ -34,7 +34,7 @@ [E panjohur] - + Based on Qt %1 (%2, %3 bit) Bazuar në Qt %1 (%2, %3 bit) @@ -42,62 +42,62 @@ ArticleMaker - + Expand article Zgjeroj artikullin - + Collapse article Mbledh artikullin - + No translation for <b>%1</b> was found in group <b>%2</b>. Nuk gjen përkthimin për <b>%1</b> te grupi <b>%2</b>. - + No translation was found in group <b>%1</b>. Nuk gjen përkthimin te grupi <b>%1</b>. - + Welcome! Mirë se erdhët! - + <h3 align="center">Welcome to <b>GoldenDict</b>!</h3><p>To start working with the program, first visit <b>Edit|Dictionaries</b> to add some directory paths where to search for the dictionary files, set up various Wikipedia sites or other sources, adjust dictionary order or create dictionary groups.<p>And then you're ready to look up your words! You can do that in this window by using a pane to the left, or you can <a href="Working with popup">look up words from other active applications</a>. <p>To customize program, check out the available preferences at <b>Edit|Preferences</b>. All settings there have tooltips, be sure to read them if you are in doubt about anything.<p>Should you need further help, have any questions, suggestions or just wonder what the others think, you are welcome at the program's <a href="http://goldendict.org/forum/">forum</a>.<p>Check program's <a href="http://goldendict.org/">website</a> for the updates. <p>(c) 2008-2013 Konstantin Isakov. Licensed under GPLv3 or later. <h3 align="center">Mirë se erdhët te <b>GoldenDict</b>!</h3><p>Për të përdorur programin, së pari vizitoni <b>Editoj|Fjalorët</b> dhe përcaktoni vendndodhjen e direktorisë ku janë skedat e fjalorit, sistemoni faqet për Wikipedia-n ose burimet e tjera, radhitni fjalorët e krijoni grupe me ta.<p>Pastaj jeni gati të studioni fjalët! Kryeni këtë duke përdorur panelin në të majtë, ose duke <a href="Working with popup">parë nga aplikacionet e tjera aktive</a>. <p>Për të porositur programin, kontrolloni parametrat e mundshëm te <b>Editoj|Preferencat</b>. Parametrat kanë këshilla ndihmëse: sigurohuni që t'i lexoni nëse keni dyshime për diçka.<p>Nëse kërkoni ndihmë, keni pyetje, sugjerime ose doni të dini se ç'mendojnë të tjerët për programin, jeni të mirëpritur te <a href="http://goldendict.org/forum/">forumi</a>.<p>Kontrolloni edhe <a href="http://goldendict.org/">faqen në internet</a> për t'u azhurnuar. <p>(c) 2008-2013 Konstantin Isakov. Licencuar sipas GPLv3 a më i vonë. - + Working with popup Working with popup - + <h3 align="center">Working with the popup</h3>To look up words from other active applications, you would need to first activate the <i>"Scan popup functionality"</i> in <b>Preferences</b>, and then enable it at any time either by triggering the 'Popup' icon above, or by clicking the tray icon down below with your right mouse button and choosing so in the menu you've popped. <h3 align="center">Skanimi i jashtëm</h3>Për të parë fjalët nga aplikacionet aktive, së pari aktivizoni <i>"funksionin Skanimi i jashtëm"</i> te <b>Preferencat</b>. Më tej e aktivizoni kurdoherë duke ndezur ikonën e 'Skanimit', ose duke klikuar me të djathtën ikonën te shiriti i sistemit. - + Then just stop the cursor over the word you want to look up in another application, and a window would pop up which would describe it to you. Thjesht ndaleni kursorin te fjala që doni të shikoni nga aplikacioni tjetër, dhe do ju shfaqet një dritare me fjalën e treguar. - + Then just select any word you want to look up in another application by your mouse (double-click it or swipe it with mouse with the button pressed), and a window would pop up which would describe the word to you. Thjesht seleksiononi me maus fjalën që doni të shikoni nga aplikacioni tjetër (klikojeni dy herë ose visheni me butonin e shtypur të miut), dhe do ju shfaqet një dritare me fjalën e treguar. - + (untitled) (pa titull) - + (picture) (figurë) @@ -105,37 +105,37 @@ ArticleRequest - + Expand article Zgjeroj artikullin - + From Nga - + Collapse article Mbledh artikullin - + Query error: %1 Gabimi i kërkimit: %1 - + Close words: Fjalët e përafërta: - + Compound expressions: Shprehjet e përbëra: - + Individual words: Fjalët e ndara: @@ -143,179 +143,180 @@ ArticleView - + Select Current Article Seleksionoj këtë artikullin - + Copy as text Kopjoj tekstin - + Inspect Inspektoj - + Resource Resursi - + Audio Audio - + TTS Voice TTS Voice - + Picture Figura - + Definition from dictionary "%1": %2 Përkufizimi nga fjalori "%1": %2 - + Definition: %1 Përkufizimi: %1 - - + + The referenced resource doesn't exist. Nuk ekziston resursi i referuar. - + The referenced audio program doesn't exist. Programi audio i referuar nuk ekziston. - + + ERROR: %1 GABIM: %1 - + Save sound Ruaj tingullin - + Sound files (*.wav *.ogg *.mp3 *.mp4 *.aac *.flac *.mid *.wv *.ape);;All files (*.*) Skeda zanore (*.wav *.ogg *.mp3 *.mp4 *.aac *.flac *.mid *.wv *.ape);;Të gjitha skedat (*.*) - + Save image Ruaj imazhin - + Image files (*.bmp *.jpg *.png *.tif);;All files (*.*) Skeda imazhe (*.bmp *.jpg *.png *.tif);;Të gjitha skedat (*.*) - + &Open Link &Hap lidhësin - + Video Video - + Video: %1 Video: %1 - + Open Link in New &Tab Hap lidhësin në fushën e &re - + Open Link in &External Browser Hap lidhësin në &shfletuesin e jashtëm - + &Look up "%1" &Shikoj "%1" - + Look up "%1" in &New Tab Shikoj "%1" në fushën e &re - + Send "%1" to input line Dërgoj "%1"te radha e inputit - - + + &Add "%1" to history &Shtoj "%1" te historiku - + Look up "%1" in %2 Shikoj "%1" në %2 - + Look up "%1" in %2 in &New Tab Shikoj "%1" në %2 në fushën e &re - + WARNING: FFmpeg Audio Player: %1 KUJDEs: FFmpeg Audio Player: %1 - + Failed to run a player to play sound file: %1 Dështoi ekzekutimi i lexuesit për skedën zanore: %1 - + Failed to create temporary file. Dështoi krijimi i skedës kohëshkurtër. - + Failed to auto-open resource file, try opening manually: %1. Dështoi vetëhapja e skedës burimore, provojeni vetë: %1. - + The referenced resource failed to download. Dështoi shkarkimi i resursit të referuar. - + Save &image... Ruaj &imazhin... - + Save s&ound... Ruaj t&ingullin... - + WARNING: %1 KUJDES: %1 @@ -325,42 +326,44 @@ Form - + about:blank about:blank - + x x - + Find: Gjej: - + + &Previous &Kaluar - + + &Next &Tjetër - + Ctrl+G Ctrl+G - + &Case Sensitive Krahasoj &shkrimin - + Highlight &all Theksoj &të gjitha @@ -385,6 +388,29 @@ + Dialog + + + Proxy authentication required + + + + + You need to supply a Username and a Password to access via proxy + + + + + Username: + + + + + Password: + Fjalëkalimi: + + + DictGroupWidget @@ -485,6 +511,119 @@ + DictHeadwords + + + Search mode + + + + + This element determines how filter string will be interpreted + + + + + If checked on the symbols case will be take in account when filtering + + + + + Match case + + + + + Exports headwords to file + + + + + Export + + + + + Help + + + + + OK + + + + + Press this button to apply filter to headwords list + + + + + Apply + + + + + If checked any filter changes will we immediately applied to headwords list + + + + + Auto apply + + + + + Filter: + + + + + Filter string (fixed string, wildcards or regular expression) + + + + + Text + + + + + Wildcards + + + + + RegExp + + + + + Unique headwords total: %1, filtered: %2 + + + + + Save headwords to file + + + + + Text files (*.txt);;All files (*.*) + Skeda tekst (*.txt);;Të gjitha skedat (*.*) + + + + Export headwords... + + + + + Cancel + Anuloj + + + DictInfo @@ -527,6 +666,16 @@ Përshkrimi: + + Show all unique dictionary headwords + + + + + Headwords + + + Edit the dictionary via command: %1 @@ -543,6 +692,74 @@ + DictServer + + + Url: + + + + + Databases: + + + + + Search strategies: + + + + + Server databases + + + + + DictServersModel + + + Enabled + Aktiv + + + + Name + Emri + + + + Address + + + + + Databases + + + + + Strategies + + + + + Icon + Ikona + + + + Comma-delimited list of databases +(empty string or "*" matches all databases) + + + + + Comma-delimited list of search strategies +(empty string mean "prefix" strategy) + + + + DictionaryBar @@ -560,17 +777,22 @@ Editoj grupin - + Dictionary info Info për fjalorin - + + Dictionary headwords + + + + Open dictionary folder Hap dosjen e fjalorit - + Edit dictionary Editoj fjalorin @@ -578,39 +800,39 @@ EditDictionaries - + &Sources &Burimet - - + + &Dictionaries &Fjalorët - - + + &Groups &Grupet - + Sources changed Burimet e ndryshuara - + Some sources were changed. Would you like to accept the changes? Disa burime u ndryshuan. Do i pranoni ndryshimet? - + Accept Pranoj - + Cancel Anuloj @@ -629,6 +851,92 @@ + FTS::FtsIndexing + + + None + Asnjë + + + + FTS::FullTextSearchDialog + + + Full-text search + + + + + Whole words + + + + + Plain text + + + + + Wildcards + + + + + RegExp + + + + + Max distance between words (%1-%2): + + + + + Max articles per dictionary (%1-%2): + + + + + + + Articles found: + + + + + Now indexing: + + + + + CJK symbols in search string are not compatible with search modes "Whole words" and "Plain text" + + + + + The search line must contains at least one word containing + + + + + or more symbols + + + + + No dictionaries for full-text search + + + + + FTS::Indexing + + + None + Asnjë + + + Forvo::ForvoArticleRequest @@ -667,6 +975,65 @@ + FullTextSearchDialog + + + + Search + + + + + Match case + + + + + Mode: + + + + + Articles found: + + + + + Available dictionaries in group: + + + + + Wait for indexing: + + + + + Total: + + + + + Indexed: + + + + + Now indexing: None + + + + + Cancel + Anuloj + + + + Help + + + + GermanTranslit @@ -706,43 +1073,53 @@ Groups - + + Group tabs + + + + + Open groups list + + + + Add group Shtoj grupin - + Give a name for the new group: Vini emrin e grupit të ri: - + Rename group Riemërtoj grupin - + Give a new name for the group: Vini emrin e ri të grupit: - + Remove group Heq grupin - + Are you sure you want to remove the group <b>%1</b>? Jeni i sigurt për heqjen e grupit <b>%1</b>? - + Remove all groups Heq tërë grupet - + Are you sure you want to remove all the groups? Jeni i sigurt për heqjen e të gjitha grupeve? @@ -843,6 +1220,54 @@ + Help::HelpWindow + + + GoldenDict help + + + + + Home + + + + + Back + Pas + + + + Forward + Para + + + + Zoom In + Zmadhoj + + + + Zoom Out + Zvogëloj + + + + Normal Size + Përmasat normale + + + + Content + + + + + Index + + + + HistoryPaneWidget @@ -873,12 +1298,12 @@ Hunspell - + Spelling suggestions: Sugjerimet e rrokjezimit: - + %1 Morphology %1 Morfologjia @@ -886,12 +1311,12 @@ HunspellDictsModel - + Enabled Aktiv - + Name Emri @@ -1931,7 +2356,7 @@ LoadDictionaries - + Error loading dictionaries Gabim në ngarkimin e fjalorëve @@ -1939,7 +2364,7 @@ Main - + Error in configuration file. Continue with default settings? Gabim në skedën e konfiguracionit.Do vijoni me parametrat standardë? @@ -1947,535 +2372,576 @@ MainWindow - + Back Pas - + Forward Para - + Scan Popup Skanimi i jashtëm - + Show &Main Window Shfaq dritaren &kryesore - - + + &Quit &Dal - + Loading... Hap... - + + String to search in dictionaries. The wildcards '*', '?' and sets of symbols '[...]' are allowed. +To find '*', '?', '[', ']' symbols use '\*', '\?', '\[', '\]' respectively + + + + Skip This Release Kaloj këtë versionin - + You have chosen to hide a menubar. Use %1 to show it back. Zgjodhët të fshehni menynë.Përdorni %1 për ta rishfaqur. - + Ctrl+M Ctrl+M - + Page Setup Sistemimi i faqes - + No printer is available. Please install one first. Nuk ka asnjë printer. Lutemi e instaloni më parë. - + Print Article Printoj artikullin - + Article, Complete (*.html) Artikull, i plotë (*.html) - + Article, HTML Only (*.html) Artikull, vetëm HTML (*.html) - + Save Article As Ruaj artikullin si - + Error Gabim - + Can't save article: %1 Nuk ruan artikullin: %1 - + %1 dictionaries, %2 articles, %3 words %1 fjalorë, %2 artikuj, %3 fjalë - + Failed to initialize hotkeys monitoring mechanism.<br>Make sure your XServer has RECORD extension turned on. Dështoi nisja e mekanizmit monitorues të tasteve kryesore.<br>Sigurohuni që XServer e ka të ndezur zgjatimin RECORD. - + New Release Available Ka dalë version i ri - + Version <b>%1</b> of GoldenDict is now available for download.<br>Click <b>Download</b> to get to the download page. Versioni <b>%1</b> për GoldenDict është gati për t'u shkarkuar.<br>Klikoni <b>Shkarkoj</b>, që të hapni faqen e shkarkimit. - + Download Shkarkoj - - + + Look up in: Shikoj në: - + &Menubar Brezi i &menysë - + Found in Dictionaries: Gjetjet në fjalorë: - + Pronounce Word (Alt+S) Shqiptoj fjalën (Alt+S) - + Show Names in Dictionary &Bar Tregoj emrat e &fjalorëve - + Show Small Icons in &Toolbars Tregoj ikonat e &vogla - + &Navigation &Lundrimi - + Zoom In Zmadhoj - + Zoom Out Zvogëloj - + Normal Size Përmasat normale - + Words Zoom In Zmadhoj fjalët - + Words Zoom Out Zvogëloj fjalët - + Words Normal Size Fjalët në përmasat normale - + Close current tab Mbyll fushën - + Close all tabs Mbyll të gjitha fushat - + Close all tabs except current Mbyll të gjitha fushat veç kësaj - + Look up: Shikoj: - + All Të gjithë - - + + Accessibility API is not enabled Accessibility API është joaktiv - + Saving article... Ruan artikullin... - + The main window is set to be always on top. Dritarja kryesore qëndron gjithmonë në krye. - + Import history from file Importoj historikun nga skeda - + Import error: invalid data in file Gabim importi: skedë me të dhëna të pasakta - + History import complete Përfundoi importi i historikut - + Import error: Gabim importi: - + Dictionary info Info për fjalorin - + + Dictionary headwords + + + + Open dictionary folder Hap dosjen e fjalorit - + Edit dictionary Editoj fjalorin - + Opened tabs Fushat e hapura - + Open Tabs List Hap listën e fushave - + (untitled) (pa titull) - + %1 - %2 %1 - %2 - + &Hide &Fsheh - + Export history to file Eksportoj historikun në skedë - - + + Text files (*.txt);;All files (*.*) Skeda tekst (*.txt);;Të gjitha skedat (*.*) - + History export complete Përfundoi eksporti i historikut - + Export error: Gabim eksporti: - + Welcome! Mirë se erdhët! - + &File &Skedar - + &Edit &Editoj - + &Help &Ndihmë - + &Preferences... &Preferencat... - + F2 F2 - + &View &Pamje - + &Zoom &Zmadhimi - + H&istory H&istorik - + &Dictionaries... &Fjalorët... - + F3 F3 - + &Search Pane Paneli i &kërkimit - + + Search + + + + &Results Navigation Pane Paneli i &rezultateve - + &History Pane Paneli i &historikut - + F4 F4 - + &Homepage &Faqja zyrtare - + &About &Për - + About GoldenDict Për GoldenDict - + + GoldenDict reference + + + + F1 F1 - + Quit from application Mbyll aplikacionin - + Ctrl+Q Ctrl+Q - + &Forum &Forumi - + &Close To Tray &Mbyll në shirit - + Minimizes the window to tray Minimizon dritaren në shiritin e sistemit - + Ctrl+F4 Ctrl+F4 - + &Save Article &Ruaj artikullin - + Save Article Ruaj artikullin - + &Print &Printoj - + Ctrl+P Ctrl+P - + Page Set&up Sistem&oj faqen - + Print Pre&view Parashikoj &shtypjen - + &Rescan Files &Riskanoj skedat - + &New Tab &Fushë e re - + &Always on Top &Gjithmonë në krye - + Always on Top Gjithmonë në krye - + Ctrl+O Ctrl+O - - - + + + Menu Button Butoni i menysë - + + Search in page + + + + + Ctrl+F + + + + + Full-text search + + + + + Ctrl+Shift+F + + + + Ctrl+F5 Ctrl+F5 - + &Clear &Pastroj - + New Tab Fushë e re - + Ctrl+T Ctrl+T - + &Configuration Folder Dosja e &konfiguracionit - - + + &Show &Shfaq - + Ctrl+H Ctrl+H - + &Export &Eksportoj - + &Import &Importoj @@ -2483,12 +2949,12 @@ Mdx::MdxArticleRequest - + Dictionary file was tampered or corrupted Skeda e fjalorit u manipulua ose u dëmtua - + Failed loading article from %1, reason: %2 Dështoi hapja e artikullit nga %1, arsyeja: %2 @@ -2496,7 +2962,7 @@ MediaWiki::MediaWikiArticleRequest - + XML parse error: %1 at %2,%3 Gabim në analizimin e XML: %1 në %2,%3 @@ -2504,7 +2970,7 @@ MediaWiki::MediaWikiWordSearchRequest - + XML parse error: %1 at %2,%3 Gabim në analizimin e XML: %1 në %2,%3 @@ -2512,22 +2978,22 @@ MediaWikisModel - + Enabled Aktiv - + Name Emri - + Address Аdresa - + Icon Ikona @@ -2540,88 +3006,94 @@ Form - + Dictionary order: Radha e fjalorëve: - - - - ... - ... + ... - + Inactive (disabled) dictionaries: Fjalorët joaktivë (e çaktivizuar): - + Dictionary information Informacion për fjalorin - + Name: Emri: - + Total articles: Artikujt totalë: - + Total words: Totali i fjalëve: - + Translates from: Përkthen nga: - + Translates to: Përkthen në: - + Description: Përshkrimi: - + Files comprising this dictionary: Skedat që përbëjnë fjalorin: - + Adjust the order by dragging and dropping items in it. Drop dictionaries to the inactive group to disable their use. Ndreqeni radhën duke kapur e lëshuar elementet. Kalojini fjalorët te grupi joaktiv për t'i çaktivizuar. - + Sort by name Radhit sipas emrit - + Sort by languages Radhit sipas gjuhëve + + + Dictionary headwords + + + + + Dictionaries active: %1, inactive: %2 + + PathsModel - + Path Shtegu - + Recursive Brendësia @@ -2729,14 +3201,14 @@ Përkthej fjalën me dy klikime - + Chooses whether the scan popup mode is on by default or not. If checked, the program would always start with the scan popup active. Zgjedh nëse mënyra standarde e skanimit të jashtëm është ndezur apo jo. Kur e zgjedh, programi nis gjithmonë me skanimin e jashtëm aktiv. - + Normally, in order to activate a popup you have to maintain the chosen keys pressed while you select a word. With this enabled, the chosen keys may also @@ -2746,27 +3218,27 @@ tastet e zgjedhura mund të shtypen shkurt pas përzgjedhjes. - + Hotkeys Tastet kryesore - + Use the following hotkey to show or hide the main window: Përdor një tast për të shfaqur a fshehur dritaren kryesore: - + Use the following hotkey to translate a word from clipboard: Përdor një tast për të përkthyer fjalën në kujtesën e kompjuterit: - + The hotkeys are global and work from any program and within any context as long as GoldenDict is running in background. Tastet kryesore punojnë përgjithësisht në çdo program, për aq kohë sa GoldenDict vepron në sfond. - + &Scan Popup &Skanimi i jashtëm @@ -2817,17 +3289,22 @@ Stili i shtesave: - + + Help language + + + + Adjust this value to avoid huge context menus. Ndreq vlerën për të shmangur menytë e gjata të kontekstit. - + Context menu dictionaries limit: Limiti i fjalorëve në meny: - + When enabled, a translation popup window would be shown each time you point your mouse on any word on the screen (Windows) or select any word with mouse (Linux). When enabled, you can switch it on and @@ -2838,134 +3315,134 @@ ose nga shiriti i sistemit. - + Enable scan popup functionality Aktivizoj skanimin e jashtëm - + Start with scan popup turned on Nis me skanuesin e ndezur - + With this enabled, the popup would only show up if all chosen keys are in the pressed state when the word selection changes. Kur e aktivizon, skanimi do funksionojë vetëm kur tërë tastet e përzgjedhura janë në gjendjen e shtypur. - + Only show popup when all selected keys are kept pressed: Shfaq skanuesin vetëm kur shtyp tastet e përzgjedhura: - + Left Ctrl only Vetëm Ctrl majtas - + Left Ctrl Ctrl majtas - + Right Shift only Vetëm Shift djathtas - + Right Shift Shift djathtas - + Alt key Tasti Alt - + Alt Alt - + Ctrl key Tasti Ctrl - + Ctrl Ctrl - + Left Alt only Vetëm Alt majtas - + Left Alt Alt majtas - + Shift key Tasti Shift - + Shift Shift - + Right Alt only Vetëm Alt djathtas - + Right Alt Alt djathtas - + Right Ctrl only Vetëm Ctrl djathtas - + Right Ctrl Ctrl djathtas - + Left Shift only Vetëm Shift majtas - + Left Shift Shift majtas - + Windows key or Meta key Tasti Windows ose Meta - + Win/Meta Win/Meta - + Keys may also be pressed afterwards, within Tastet mund të shtypen edhe më pas, brenda - + To avoid false positives, the keys are only monitored after the selection's done for a limited amount of seconds, which is specified here. @@ -2974,22 +3451,22 @@ e përcaktuar këtu. - + secs sek - + Send translated word to main window instead of to show it in popup window Dërgon fjalën e përkthyer te dritarja kryesore, jo te dritarja kërcyese - + Send translated word to main window Dërgoj fjalën e përkthyer te dritarja kryesore - + <!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; } @@ -3002,114 +3479,149 @@ <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" color:#ff0000;">Shënim: Duket sikur po punoni me një version të X.Org XServer që e ka të prishur zgjatimin RECORD. Ka mundësi që tastet kryesore në GoldenDict të mos funksionojnë. Kjo duhet ndrequr te vetë serveri. Ju lutem, raportojeni </span><a href="https://bugs.freedesktop.org/show_bug.cgi?id=20500"><span style=" text-decoration: underline; color:#0000ff;">këtë të metë</span></a><span style=" color:#ff0000;"> dhe lini një koment nëse doni.</span></p></body></html> - + &Audio &Audio - + Pronunciation Shqiptimi - + Auto-pronounce words in main window Autoshqiptoj fjalët në dritaren kryesore - + Auto-pronounce words in scan popup Autoshqiptoj fjalët e skanuara - + Playback Riprodhimi - + Play audio files via FFmpeg(libav) and libao Riprodhon skedat zanore me FFmpeg(libav) dhe libao - + Use internal player Përdor lexuesin e brendshëm - + + System proxy + + + + + Custom proxy + + + + + Custom settings + + + + + Full-text search + + + + + Allow full-text search for: + + + + + Don't search in dictionaries containing more than + + + + + articles (0 - unlimited) + + + + Select this option to automatic collapse big articles Kur e ndez, artikujt e mëdhenj do të mblidhen automatikisht. - + Collapse articles more than Mbledh artikujt me më shumë se - + Articles longer than this size will be collapsed Artikujt mbi këtë përmasë do të mblidhen - + symbols simbole - + Use any external program to play audio files Riprodhon skedat zanore me një program tjetër - + Use external program: Përdor programin e jashtëm: - + &Network &Rrjeti - + Enable if you wish to use a proxy server for all program's network requests. Aktivizojeni kur dëshironi të përdorni një server proxy për tërë kërkesat e programit për internet. - + Use proxy server Përdor server proxy - + Type: Lloji: - + Host: Hosti: - + Port: Porti: - + User: Përdoruesi: - + Password: Fjalëkalimi: - + Enabling this would make GoldenDict block most advertisements by disallowing content (images, frames) not originating from the site you are browsing. If some site breaks because of this, try disabling this. @@ -3118,12 +3630,12 @@ faqe shfaq probleme prej kësaj, çaktivizojeni. - + Disallow loading content from other sites (hides most advertisements) Mohoj përmbajtjen nga faqet e tjera (fsheh shumicën e reklamave) - + Enabling this would allow to listen to sound pronunciations from online dictionaries that rely on Flash or other web plugins. Plugin must be installed for this option to work. @@ -3132,24 +3644,24 @@ Spina duhet instaluar që të funksionojë. - + Enable web plugins Aktivizoj spinat e internetit - + Some sites detect GoldenDict via HTTP headers and block the requests. Enable this option to workaround the problem. Disa faqe e njohin GoldenDict me anë të kokëve HTTP, dhe i bllokojnë kërkesat. Ky opsion e anashkalon problemin. - + Do not identify GoldenDict in HTTP headers Nuk identifikoj GoldenDict në kokët HTTP - + When this is enabled, the program periodically checks if a new, updated version of GoldenDict is available for download. If it is so, the program @@ -3160,22 +3672,22 @@ kërkon ta shkarkojë. - + Check for new program releases periodically Verifikoj periodikisht versionet e reja të programit - + Ad&vanced Av&ancuar - + ScanPopup extra technologies Teknologji shtesë për Skanimin e jashtëm - + Try to use IAccessibleEx technology to retrieve word under cursor. This technology works only with some programs that support it (for example Internet Explorer 9). @@ -3186,12 +3698,12 @@ Nuk keni pse ta aktivizoni nëse nuk i përdorni këto programe. - + Use &IAccessibleEx Përdor &IAccessibleEx - + Try to use UI Automation technology to retrieve word under cursor. This technology works only with some programs that support it. It is not needed to select this option if you don't use such programs. @@ -3200,12 +3712,12 @@ Nuk keni pse ta aktivizoni nëse nuk i përdorni këto programe. - + Use &UIAutomation Përdor &UIAutomation - + Try to use special GoldenDict message to retrieve word under cursor. This technology works only with some programs that support it. It is not needed to select this option if you don't use such programs. @@ -3214,107 +3726,108 @@ Nuk keni pse ta aktivizoni nëse nuk i përdorni këto programe. - + Use &GoldenDict message Përdor mesazhet e &GoldenDict - + History Historiku - + Turn this option on to store history of the translated words Kur e ndez, depozitohet historiku i fjalëve të përkthyera. - + Store &history Depozitoj &historikun - + Specify the maximum number of entries to keep in history. Specifikoni numrin maksimal të njësive që ruhen në historik. - + Maximum history size: Masa maksimale e historikut: - + History saving interval. If set to 0 history will be saved only during exit. Intervali i ruajtjes së historikut. Kur vendoset 0, historiku ruhet vetëm gjatë mbylljes së programit. - + Save every Ruaj çdo - + minutes minuta - + Articles Artikujt - + Turn this option on to always expand optional parts of articles Kur e ndez, pjesët fakultative të artikujve zgjerohen gjithmonë. - + Expand optional &parts Zgjeroj &pjesët fakultative - + System default Standardi i sistemit - + + Default Standard - + Modern Modern - + Lingvo Lingvo - + Babylon Babylon - + Lingoes Lingoes - + Lingoes-Blue Lingoes Blu - + Changing Language Ndryshimi i Gjuhës - + Restart the program to apply the language change. Riniseni programin për të zbatuar ndryshimin e gjuhës. @@ -3322,27 +3835,27 @@ ProgramTypeEditor - + Audio Audio - + Plain Text Tekst i thjeshtë - + Html Html - + Prefix Match Krahasoj parashtesën - + Unknown E panjohur @@ -3368,27 +3881,27 @@ ProgramsModel - + Enabled Aktiv - + Type Lloji - + Name Emri - + Command Line Vija e komandës - + Icon Ikona @@ -3396,12 +3909,14 @@ QObject - + + Article loading error Gabim në hapjen e artikullit - + + Article decoding error Gabim në deshifrimin e artikullit @@ -3512,18 +4027,18 @@ ResourceToSaveHandler - - + + ERROR: %1 GABIM: %1 - + Resource saving error: Gabim në ruajtjen e resursit: - + The referenced resource failed to download. Dështoi shkarkimi i resursit të referuar. @@ -3531,12 +4046,12 @@ Romaji - + Hepburn Romaji for Hiragana Hepburn Romaji për Hiragana - + Hepburn Romaji for Katakana Hepburn Romaji për Katakana @@ -3557,59 +4072,59 @@ Dialog - + Back Pas - + Forward Para - + Pronounce Word (Alt+S) Shqiptoj Fjalën (Alt+S) - + Alt+S Alt+S - + Send word to main window (Alt+W) Dërgoj fjalën te dritarja kryesore (Alt+W) - + Alt+W Alt+W - + Shows or hides the dictionary bar Shfaq ose fsheh brezin e fjalorit - + Use this to pin down the window so it would stay on screen, could be resized or managed in other ways. Këtë e përdor për të piketuar dritaren që të qëndrojë mbi ekran, që të marrë një përmasë të re ose për mënyrat e tjera. - - - - - + + + + + ... ... - - + + %1 - %2 %1 - %2 @@ -3617,17 +4132,17 @@ SoundDirsModel - + Path Shtegu - + Name Emri - + Icon Ikona @@ -3635,45 +4150,47 @@ Sources - + Text to Speech Tekst në tinguj - + (not available in portable version) (nuk mundësohet në versionin portabël) - - - + + + Choose a directory Zgjedh direktorinë - - - - - + + + + + + Confirm removal Miratoj heqjen - - + + Remove directory <b>%1</b> from the list? Do e hiqni direktorinë <b>%1</b> nga lista? - - + + + Remove site <b>%1</b> from the list? Do e hiqni faqen <b>%1</b> nga lista? - + Remove program <b>%1</b> from the list? Do e hiqni programin <b>%1</b> nga lista? @@ -3692,7 +4209,8 @@ - + + &Add... &Shtoj... @@ -3701,7 +4219,8 @@ - + + &Remove &Heq @@ -3765,32 +4284,32 @@ Çdo faqe në internet. Radha %GDWORD% do zëvendësohet me fjalën e kërkuar: - + Programs Programet - + Forvo Forvo - + Live pronunciations from <a href="http://www.forvo.com/">forvo.com</a>. The site allows people to record and share word pronunciations. You can listen to them from GoldenDict. Shqiptimet direkte nga <a href="http://www.forvo.com/">forvo.com</a>. Kjo faqe lejon individët të regjistrojnë shqiptimet e fjalëve dhe t'i ndajnë ato me të tjerët. Mund të dëgjohen në GoldenDict. - + Enable pronunciations from Forvo Aktivizoj shqiptimet nga Forvo - + API Key: Кodi API: - + Use of Forvo currently requires an API key. Leave this field blank to use the default key, which may become unavailable in the future, or register on the site to get your own key. @@ -3798,7 +4317,7 @@ që mund të mos lejohet në të ardhmen, ose regjistrohuni te faqja për të marrë kodin tuaj. - + Get your own key <a href="http://api.forvo.com/key/">here</a>, or leave blank to use the default one. Merrni kodin tuaj <a href="http://api.forvo.com/key/">këtu</a>, ose lëreni bosh për të përdorur standardin. @@ -3810,79 +4329,89 @@ %GDBIG5% për Big-5, %GDBIG5HKSCS% për Big5-HKSCS, %GDGBK% për GBK and GB18030, %GDSHIFTJIS% për Shift-JIS. + + DICT servers + + + + DICT servers: + + + + Any external programs. A string %GDWORD% will be replaced with the query word. If such string is not presented, the word will be fed into standard input. Çdo program i jashtëm. Vargu %GDWORD% do zëvendësohet me fjalën e kërkuar. Kur vargu nuk shkruhet, fjala jepet si input standard. - + Language codes (comma-separated): Kodet e gjuhëve (të ndara me presje): - + List of language codes you would like to have. Example: "en, ru". Lista e kodeve të gjuhëve që doni të keni. Shembull: "en, ru". - + Full list of language codes is available <a href="http://www.forvo.com/languages-codes/">here</a>. Lista e plotë e kodeve të gjuhëve jepet <a href="http://www.forvo.com/languages-codes/">këtu</a>. - + Transliteration Përkthimi - + Russian transliteration Përkthimi Rusisht - + Greek transliteration Përkthimi Greqisht - + German transliteration Përkthimi Gjermanisht - + Belarusian transliteration Përkthimi bjellorusisht - + Enables to use the Latin alphabet to write the Japanese language Lejon përdorimin e alfabetit latin për të shkruar japonishten - + Japanese Romaji Japonishtja Romaji - + Systems: Sistemi: - + The most widely used method of transcription of Japanese, based on English phonology Metoda më e përhapur e tejshkrimit të japonishtes, e bazuar në fonologjinë japoneze - + Hepburn Hepburn - + The most regular system, having a one-to-one relation to the kana writing systems. Standardized as ISO 3602 @@ -3893,12 +4422,12 @@ Akoma i pafutur në GoldenDict. - + Nihon-shiki Nihon-shiki - + Based on Nihon-shiki system, but modified for modern standard Japanese. Standardized as ISO 3602 @@ -3909,32 +4438,32 @@ Akoma i pafutur në GoldenDict. - + Kunrei-shiki Kunrei-shiki - + Syllabaries: Rrokjezimi: - + Hiragana Japanese syllabary Rrokjezimi i Japonishtes Hiragana - + Hiragana Hiragana - + Katakana Japanese syllabary Rrokjezimi i Japonishtes Katakana - + Katakana Katakana @@ -4074,22 +4603,22 @@ WebSitesModel - + Enabled Aktiv - + Name Emri - + Address Adresa - + Icon Ikona @@ -4097,7 +4626,7 @@ WordFinder - + Failed to query some dictionaries. Dështoi kërkimi në disa fjalorë. diff -Nru goldendict-1.5.0~git20131003/locale/sr_SR.ts goldendict-1.5.0~git20150923/locale/sr_SR.ts --- goldendict-1.5.0~git20131003/locale/sr_SR.ts 2013-10-02 20:42:04.000000000 +0000 +++ goldendict-1.5.0~git20150923/locale/sr_SR.ts 2015-09-23 08:26:24.000000000 +0000 @@ -38,7 +38,7 @@ [Непознато] - + Based on Qt %1 (%2, %3 bit) На основу Qt %1 (%2, %3 бита) @@ -46,17 +46,17 @@ ArticleMaker - + No translation for <b>%1</b> was found in group <b>%2</b>. Нема превода <b>%2</b> пронађеног у групи <b>%1</b>. - + No translation was found in group <b>%1</b>. У групи <b>%1</b> превод није пронађен. - + Welcome! Добро дошли! @@ -65,47 +65,47 @@ <h3 align="center">Добро дошли у <b>GoldenDict</b>!</h3><p>Ако покренете програм по први пут, одредите путању до речника у <b>Уреди|Речник</b>. Ту можете да наведете разне сајтове Википедије или другe изворe података, подесите редослед у коме су речници или направите речник.<p>Након тога, можете да почнете да тражите речи. Речи се могу наћи у левом окну прозора. Када радите у другим апликацијама, можете да тражите речи, користећи <a href="Рад са искачућим прозором">искачући прозор</a>. <p>У изборнику <b>Уреди|Поставке</b>.Можете да подесите апликацију по свом укусу. Сви параметри су наговештаји који се приказују када пређете преко њих. Обратите пажњу на њих, када имате проблема са конфигурацијом.<p>Ако вам је потребна помоћ,било каква питања, захтеве, итд, погледајте<a href="http://goldendict.org/forum/"> Форум програма</a>.<p>Ажурирање софтвера доступно на <a href="http://goldendict.org/">веб сајту</a>.<p>© Константин Исаков (ikm@goldendict.org), 2008-2011. Лиценца: GNU GPLv3 или новија. - + Expand article Прошири чланак - + Collapse article Скупи чланак - + <h3 align="center">Welcome to <b>GoldenDict</b>!</h3><p>To start working with the program, first visit <b>Edit|Dictionaries</b> to add some directory paths where to search for the dictionary files, set up various Wikipedia sites or other sources, adjust dictionary order or create dictionary groups.<p>And then you're ready to look up your words! You can do that in this window by using a pane to the left, or you can <a href="Working with popup">look up words from other active applications</a>. <p>To customize program, check out the available preferences at <b>Edit|Preferences</b>. All settings there have tooltips, be sure to read them if you are in doubt about anything.<p>Should you need further help, have any questions, suggestions or just wonder what the others think, you are welcome at the program's <a href="http://goldendict.org/forum/">forum</a>.<p>Check program's <a href="http://goldendict.org/">website</a> for the updates. <p>(c) 2008-2013 Konstantin Isakov. Licensed under GPLv3 or later. <h3 align="center">Добро дошли у <b>GoldenDict</b>!</h3><p>Ако покренете програм по први пут, одредите путању до речника у <b>Уреди|Речник</b>. Ту можете да наведете разне сајтове Википедије или другe изворe података, подесите редослед у коме су речници или направите речник.<p>Након тога, можете да почнете да тражите речи. Речи се могу наћи у левом окну прозора. Када радите у другим апликацијама, можете да тражите речи, користећи <a href="Рад са искачућим прозором">искачући прозор</a>. <p>У изборнику <b>Уреди|Поставке</b>.Можете да подесите апликацију по свом укусу. Сви параметри су наговештаји који се приказују када пређете преко њих. Обратите пажњу на њих, када имате проблема са конфигурацијом.<p>Ако вам је потребна помоћ,било каква питања, захтеве, итд, погледајте<a href="http://goldendict.org/forum/"> Форум програма</a>.<p>Ажурирање софтвера доступно на <a href="http://goldendict.org/">веб сајту</a>.<p>© Константин Исаков (ikm@goldendict.org), 2008-2011. Лиценца: GNU GPLv3 или новија. {3 ?} {3>?} {2008-2013 ?} {3 ?} - + Working with popup Рад са искачућим прозором - + <h3 align="center">Working with the popup</h3>To look up words from other active applications, you would need to first activate the <i>"Scan popup functionality"</i> in <b>Preferences</b>, and then enable it at any time either by triggering the 'Popup' icon above, or by clicking the tray icon down below with your right mouse button and choosing so in the menu you've popped. <h3 align="center">Искачући прозор</h3>Да бисте пронашли речи из друге апликације, потребно је да укључите <i>«Омогући искачући прозор»</i> у <b>Поставке</b> и након тога омогућити искачуће дугме «Прегледај» у главном прозору или у пливајућем изборнику на икони у системској палети. - + Then just stop the cursor over the word you want to look up in another application, and a window would pop up which would describe it to you. Сада померите курсор на било коју реч и појавиће се искачући прозор са преводом или описом речи. - + Then just select any word you want to look up in another application by your mouse (double-click it or swipe it with mouse with the button pressed), and a window would pop up which would describe the word to you. Сада изаберите реч у додатку (Дупли клик, или држећи миша преко њих док држите леви тастер), и искаче прозор са преводом или описом речи. - + (untitled) (без имена) - + (picture) (слика) @@ -113,37 +113,37 @@ ArticleRequest - + Expand article Прошири чланак - + From Из: - + Collapse article Скупи чланак - + Query error: %1 Упит грешке: %1 - + Close words: Затвори речи: - + Compound expressions: Сложени изрази: - + Individual words: Поједине речи: @@ -151,17 +151,17 @@ ArticleView - + Resource Ресурс - + Audio Аудио - + Definition: %1 Одређење: %1 @@ -170,139 +170,140 @@ GoldenDict - + Select Current Article Изаберите тренутни чланак - + Copy as text Умножи као текст - + Inspect Прегледај - + TTS Voice TTS глас - + Picture Слика - + Video Видео - + Video: %1 Видео: %1 - + Definition from dictionary "%1": %2 Дефиниција из речника "%1": %2 - - + + The referenced resource doesn't exist. Тражени ресурс није пронађен. - + The referenced audio program doesn't exist. Одређени аудио програм није пронађен. - + + ERROR: %1 ГРЕШКА: %1 - + &Open Link &Отворите ову везу - + Open Link in New &Tab Отворите ову везу у новој &картици - + Open Link in &External Browser Отворите ову везу у спољнем &прегледачу - + Save &image... Сачувај &слику... - + Save s&ound... Сачувај з&вук... - + &Look up "%1" &Претражи "%1" - + Look up "%1" in &New Tab Претражи «%1» у &новој картици - + Send "%1" to input line Пошаљи "%1" на ред за унос - - + + &Add "%1" to history &Додај "%1" у историју - + Look up "%1" in %2 Претражи «%1» у %2 - + Look up "%1" in %2 in &New Tab Претражи «%1» у %2 в &новој картици - + Save sound Сачувај звук - + Sound files (*.wav *.ogg *.mp3 *.mp4 *.aac *.flac *.mid *.wv *.ape);;All files (*.*) Звучне датотеке (*.wav *.ogg *.mp3 *.mp4 *.aac *.flac *.mid *.wv *.ape);;Све датотеке (*.*) - + Save image Сачувај слику - + Image files (*.bmp *.jpg *.png *.tif);;All files (*.*) Сликовне датотеке (*.bmp *.jpg *.png *.tif);;Све датотеке (*.*) - + WARNING: FFmpeg Audio Player: %1 УПОЗОРЕЊЕ: FFmpeg Audio Player: %1 @@ -315,27 +316,27 @@ Да бисте омогућили могућност да репродукујете датотеке типа, различитих од WAV, посетите Уреди|Поставке, изаберите картицу Аудио, а затим изаберите "излаз звука преко DirectShow". - + Failed to run a player to play sound file: %1 Није могуће пустити аудио датотеку: %1 - + Failed to create temporary file. Није успело да створи привремену датотеку. - + Failed to auto-open resource file, try opening manually: %1. Грешка при отварању ресурс датотеке, покушајте ручно да отворите: %1. - + The referenced resource failed to download. Није могуће учитати повезане ресурсе. - + WARNING: %1 ОПРЕЗ: %1 @@ -345,42 +346,44 @@ Form - + about:blank about:blank - + x x - + Find: Претражи: - + + &Previous &Претходно - + + &Next &Следеће - + Ctrl+G Ctrl+G - + &Case Sensitive &Мала и велика слова - + Highlight &all Истакни &све @@ -406,6 +409,29 @@ + Dialog + + + Proxy authentication required + + + + + You need to supply a Username and a Password to access via proxy + + + + + Username: + + + + + Password: + Лозинка: + + + DictGroupWidget @@ -506,6 +532,119 @@ + DictHeadwords + + + Search mode + + + + + This element determines how filter string will be interpreted + + + + + If checked on the symbols case will be take in account when filtering + + + + + Match case + + + + + Exports headwords to file + + + + + Export + + + + + Help + + + + + OK + + + + + Press this button to apply filter to headwords list + + + + + Apply + + + + + If checked any filter changes will we immediately applied to headwords list + + + + + Auto apply + + + + + Filter: + + + + + Filter string (fixed string, wildcards or regular expression) + + + + + Text + + + + + Wildcards + + + + + RegExp + + + + + Unique headwords total: %1, filtered: %2 + + + + + Save headwords to file + + + + + Text files (*.txt);;All files (*.*) + Текстуалне датотеке (*.txt);;Све датотеке (*.*) + + + + Export headwords... + + + + + Cancel + Откажи + + + DictInfo @@ -548,6 +687,16 @@ Опис: + + Show all unique dictionary headwords + + + + + Headwords + + + Edit the dictionary via command: %1 @@ -564,6 +713,74 @@ + DictServer + + + Url: + + + + + Databases: + + + + + Search strategies: + + + + + Server databases + + + + + DictServersModel + + + Enabled + Укључено + + + + Name + Назив + + + + Address + Адреса + + + + Databases + + + + + Strategies + + + + + Icon + Икона + + + + Comma-delimited list of databases +(empty string or "*" matches all databases) + + + + + Comma-delimited list of search strategies +(empty string mean "prefix" strategy) + + + + DictionaryBar Dictionary Bar @@ -585,17 +802,22 @@ Уреди ову групу - + Dictionary info Подаци о речнику - + + Dictionary headwords + + + + Open dictionary folder Отвори фасциклу речника - + Edit dictionary Уреди речник @@ -603,39 +825,39 @@ EditDictionaries - + &Sources &Извори - - + + &Dictionaries &Речници - - + + &Groups &Групе - + Sources changed Извори промена - + Some sources were changed. Would you like to accept the changes? Неки извори су промењени. Прихвати измене? - + Accept Прихвати - + Cancel Откажи @@ -654,6 +876,92 @@ + FTS::FtsIndexing + + + None + Ништа + + + + FTS::FullTextSearchDialog + + + Full-text search + + + + + Whole words + + + + + Plain text + + + + + Wildcards + + + + + RegExp + + + + + Max distance between words (%1-%2): + + + + + Max articles per dictionary (%1-%2): + + + + + + + Articles found: + + + + + Now indexing: + + + + + CJK symbols in search string are not compatible with search modes "Whole words" and "Plain text" + + + + + The search line must contains at least one word containing + + + + + or more symbols + + + + + No dictionaries for full-text search + + + + + FTS::Indexing + + + None + Ништа + + + Forvo::ForvoArticleRequest @@ -692,6 +1000,65 @@ + FullTextSearchDialog + + + + Search + + + + + Match case + + + + + Mode: + + + + + Articles found: + + + + + Available dictionaries in group: + + + + + Wait for indexing: + + + + + Total: + + + + + Indexed: + + + + + Now indexing: None + + + + + Cancel + Откажи + + + + Help + + + + GermanTranslit @@ -731,43 +1098,53 @@ Groups - + + Group tabs + + + + + Open groups list + + + + Add group Додај групу - + Give a name for the new group: Унесите име нове групе: - + Rename group Преименуј групу - + Give a new name for the group: Унесите ново име групе: - + Remove group Уклоните групу - + Are you sure you want to remove the group <b>%1</b>? Желите да уклоните групу <b>%1</b>? - + Remove all groups Уклоните све групе - + Are you sure you want to remove all the groups? Уклоните све групе? @@ -868,6 +1245,54 @@ + Help::HelpWindow + + + GoldenDict help + + + + + Home + + + + + Back + Назад + + + + Forward + Напред + + + + Zoom In + Увећај + + + + Zoom Out + Умањи + + + + Normal Size + Уобичајена величина + + + + Content + + + + + Index + + + + HistoryPaneWidget @@ -898,12 +1323,12 @@ Hunspell - + Spelling suggestions: Предлога за правопис: - + %1 Morphology %1 (морфологија) @@ -911,12 +1336,12 @@ HunspellDictsModel - + Enabled Укључено - + Name Назив @@ -1956,7 +2381,7 @@ LoadDictionaries - + Error loading dictionaries Грешка при учитавању @@ -1964,7 +2389,7 @@ Main - + Error in configuration file. Continue with default settings? Грешка у поставци датотеке. Наставити са подразумеваним подешавањима? @@ -1976,78 +2401,84 @@ Навигација - + Back Назад - + Forward Напред - + Scan Popup Прегледај - + Show &Main Window Прикажи &главни прозор - - + + &Quit И&злаз - + Loading... Учитавање... - + + String to search in dictionaries. The wildcards '*', '?' and sets of symbols '[...]' are allowed. +To find '*', '?', '[', ']' symbols use '\*', '\?', '\[', '\]' respectively + + + + Skip This Release Прескочи ову верзију - + You have chosen to hide a menubar. Use %1 to show it back. Сакрили сте главни мени. Да га вратите, користите %1. - + Ctrl+M Ctrl+M - + Page Setup Подешавање странице - + No printer is available. Please install one first. Нема доступног тампач. Молимо вас, инсталирајте прво. - + Print Article Штампај чланак - + Article, Complete (*.html) Чланак, целовит (*.html) - + Article, HTML Only (*.html) Чланак, само HTML (*.html) - + Save Article As Сачувајте овај чланак као @@ -2056,44 +2487,44 @@ Датотека Html (*.html *.htm) - + Error Грешка - + Can't save article: %1 Није могуће сачувати чланак: %1 - + %1 dictionaries, %2 articles, %3 words Речник: %1, чланци: %2, речи: %3 - + Failed to initialize hotkeys monitoring mechanism.<br>Make sure your XServer has RECORD extension turned on. Није успело да покрене механизам надгледања пречица.<br>Проверите да ли ваш XServer подржава проширење RECORD. - + New Release Available Доступна је нова верзија - + Version <b>%1</b> of GoldenDict is now available for download.<br>Click <b>Download</b> to get to the download page. Издање <b>%1</b> програма GoldenDict доступно је за преузимање.<br> Притисни <b>Преузми</b>, да оде на страницу за преузимање. - + Download Преузми - - + + Look up in: Претражи у: @@ -2106,184 +2537,189 @@ Прикажи мале иконе на траци са алаткама - + &Menubar Главни мени - + Found in Dictionaries: Пронађено у речницима: - + Pronounce Word (Alt+S) Изговори реч (Alt+S) - + Show Names in Dictionary &Bar Прикажи називе у картици &речника - + Show Small Icons in &Toolbars Прикажи малу икону у &алатној траци - + &Navigation &Навигација - + Zoom In Увећај - + Zoom Out Умањи - + Normal Size Уобичајена величина - + Words Zoom In Увећај листу речи - + Words Zoom Out Умањи листу речи - + Words Normal Size Уобичајена величина слова - + Close current tab Затвори тренутну картицу - + Close all tabs Затворите све картице - + Close all tabs except current Затворите све картице осим тренутне - - + + Accessibility API is not enabled Приступачност API није омогућено - + Look up: Претражи: - + All Све - + Saving article... Чување чланка... - + The main window is set to be always on top. Главни прозор је подешен да увек буде на врху. - + &Hide &Сакривен - + Export history to file Извоз историе у датотеку - - + + Text files (*.txt);;All files (*.*) Текстуалне датотеке (*.txt);;Све датотеке (*.*) - + History export complete Извоз историје је завршен - + Export error: Извоз грешке: - + Import history from file Увоз историје из датотеке - + Import error: invalid data in file Увоз грешке: неважећи подаци у датотеци - + History import complete Увоз историје је завршен - + Import error: Грешка при увозу: - + Dictionary info Подаци о речнику - + + Dictionary headwords + + + + Open dictionary folder Отвори фасциклу речника - + Edit dictionary Уреди речник - + Opened tabs Отворених картица - + Open Tabs List Отвори листу картица - + (untitled) (неименован) - + %1 - %2 %1 - %2 @@ -2297,22 +2733,22 @@ - + Welcome! Добро дошли! - + &File &Датотека - + &Edit &Уреди - + &Help &Пимоћ @@ -2321,27 +2757,27 @@ &Речници... F3 - + &Preferences... &Поставке... - + F2 F2 - + &View &Приказ - + &Zoom &Увећај - + H&istory &Историјат @@ -2350,169 +2786,199 @@ Окно навигације за резуктате - + + Search + + + + &Search Pane &Претражи окно - + &Results Navigation Pane &Резултати окна за навигацију - + &History Pane &Окно историје - + &Dictionaries... &Речници... - + F3 F3 - + F4 F4 - + &Homepage &Почетна страница - + &About &О програму - + About GoldenDict О GoldenDict - + + GoldenDict reference + + + + F1 F1 - + Quit from application Затворите апликацију - + Ctrl+Q Ctrl+Q - + &Forum &Форум - + &Close To Tray &Умањи у палету - + Minimizes the window to tray Умањи прозор у палету - + Ctrl+F4 Ctrl+F4 - + &Save Article &Сачувајте овај чланак - + Save Article Сачувајте овај чланак - + &Print &Штампај - + Ctrl+P Ctrl+P - + Page Set&up П&оставке странице - + Print Pre&view Преглед пре шта&мпања - + &Rescan Files &Поново прегледа датотеке - + &New Tab &Нова картица - - + + &Show &Прикажи - + Ctrl+H Ctrl+H - + &Export &Извоз - + &Import &Увоз - + &Always on Top &Увек на врху - + Always on Top Увек на врху - + Ctrl+O Ctrl+O - - - + + + Menu Button Дугме изборника + + Search in page + + + + + Ctrl+F + + + + + Full-text search + + + + + Ctrl+Shift+F + + + Print Preview Преглед пре штампања @@ -2521,27 +2987,27 @@ Поново прегледа датотеке - + Ctrl+F5 Ctrl+F5 - + &Clear О&чисти - + New Tab Нова картица - + Ctrl+T Ctrl+T - + &Configuration Folder Фастикла подешавања @@ -2553,12 +3019,12 @@ Mdx::MdxArticleRequest - + Dictionary file was tampered or corrupted Речник датотека је покварен или оштећен - + Failed loading article from %1, reason: %2 Неуспешно учитавање чланка из %1, разлог: %2 @@ -2566,7 +3032,7 @@ MediaWiki::MediaWikiArticleRequest - + XML parse error: %1 at %2,%3 Анализа грешке XML: %1 у %2, колони %3 @@ -2574,7 +3040,7 @@ MediaWiki::MediaWikiWordSearchRequest - + XML parse error: %1 at %2,%3 Анализа грешке XML: %1 у %2, колони %3 @@ -2582,22 +3048,22 @@ MediaWikisModel - + Enabled Укључено - + Name Назив - + Address Адреса - + Icon Икона @@ -2610,88 +3076,94 @@ Form - + Dictionary order: Редослед речника: - - - - ... - ... + ... - + Inactive (disabled) dictionaries: Неактиван (онемогућени) речници: - + Dictionary information Информације о речнику - + Name: Назив: - + Total articles: Укупно чланака: - + Total words: Укупно речи: - + Translates from: Изворни језик: - + Translates to: Циљни језик: - + Description: Опис: - + Files comprising this dictionary: Датотеке које чине речник: - + Adjust the order by dragging and dropping items in it. Drop dictionaries to the inactive group to disable their use. Промена редоследа речника, превлачењем миша. Да бисте онемогућили речник превуците га на дно неактивне групе. - + Sort by name Разврстај по имену - + Sort by languages Разврстај по језицима + + + Dictionary headwords + + + + + Dictionaries active: %1, inactive: %2 + + PathsModel - + Path Путања - + Recursive Рекурзивно @@ -2803,13 +3275,13 @@ Преведи изабрану реч дуплим кликом - + Chooses whether the scan popup mode is on by default or not. If checked, the program would always start with the scan popup active. Укључите или не укључити искачући прозор када програм почиње. - + Normally, in order to activate a popup you have to maintain the chosen keys pressed while you select a word. With this enabled, the chosen keys may also @@ -2825,27 +3297,27 @@ тога, како би се реч издвојила. - + Hotkeys Пречице - + Use the following hotkey to show or hide the main window: Користите следећу пречицу за приказивање/сакривање главног прозора: - + Use the following hotkey to translate a word from clipboard: Користите следећу пречицу за превођење речи из оставе: - + The hotkeys are global and work from any program and within any context as long as GoldenDict is running in background. Пречице су глобалне и раде за сваки програм и све контексте, све док GoldenDict ради у позадини. - + &Scan Popup &Искачући прозор @@ -2898,17 +3370,22 @@ Ctrl-Tab навигација картица у MRU редоследу - + + Help language + + + + Adjust this value to avoid huge context menus. Подесите ову вредност да бисте избегли огромне падајуће изборнике - + Context menu dictionaries limit: Ограничи падајући изборник речника: - + When enabled, a translation popup window would be shown each time you point your mouse on any word on the screen (Windows) or select any word with mouse (Linux). When enabled, you can switch it on and @@ -2919,134 +3396,134 @@ искључите из главног прозора или иконице. - + Enable scan popup functionality Омогући искачући прозор - + Start with scan popup turned on Омогући искачући прозор при покретању - + With this enabled, the popup would only show up if all chosen keys are in the pressed state when the word selection changes. Овим је омогућено, искакање би се појавило ако су сви тастери изабрани у притиснутом стању, када се избор речи промени. - + Only show popup when all selected keys are kept pressed: Само покажи искакање када сви одабрани тастери су непрестано притиснути: - + Left Ctrl only Само леви Ctrl - + Left Ctrl Леви Ctrl - + Right Shift only Само десни Shift - + Right Shift Десни Shift - + Alt key Тастер Alt - + Alt Alt - + Ctrl key Тастер Ctrl - + Ctrl Ctrl - + Left Alt only Само леви Alt - + Left Alt Леви Alt - + Shift key Тастер Shift - + Shift Shift - + Right Alt only Само десни Alt - + Right Alt Десни Alt - + Right Ctrl only Само десни Ctrl - + Right Ctrl Десни Ctrl - + Left Shift only Само леви Shift - + Left Shift Леви Shift - + Windows key or Meta key Тастер Windows или Meta - + Win/Meta Win или Meta - + Keys may also be pressed afterwards, within Тастери могу бити накнадно притиснути, у оквиру - + To avoid false positives, the keys are only monitored after the selection's done for a limited amount of seconds, which is specified here. @@ -3055,54 +3532,89 @@ временског периода, који је овде одређен. - + secs секунд - + Send translated word to main window instead of to show it in popup window Пошаљите преведену реч на главни прозор уместо да га прикаже у искачућем прозору - + Send translated word to main window Пошаљите преведену реч у главни прозор - + Play audio files via FFmpeg(libav) and libao Пусти звучне датотеке преко FFmpeg(libav) и libao - + Use internal player Користи уграђени пуштач - + + System proxy + + + + + Custom proxy + + + + + Custom settings + + + + Some sites detect GoldenDict via HTTP headers and block the requests. Enable this option to workaround the problem. Неки сајтови откривају GoldenDict преко HTTP заглавља и блок захтева. Омогућите ову могућност да бисте решили тај проблем. - + Do not identify GoldenDict in HTTP headers Немојте да идентификујете GoldenDict у HTTP заглављима - + + Full-text search + + + + + Allow full-text search for: + + + + + Don't search in dictionaries containing more than + + + + + articles (0 - unlimited) + + + + Ad&vanced Напредно - + ScanPopup extra technologies Додатне методе за одређивање речи под курсором - + Try to use IAccessibleEx technology to retrieve word under cursor. This technology works only with some programs that support it (for example Internet Explorer 9). @@ -3113,12 +3625,12 @@ Ако не користите такве програме не треба да укључи ову опцију. - + Use &IAccessibleEx Користи &IAccessibleEx - + Try to use UI Automation technology to retrieve word under cursor. This technology works only with some programs that support it. It is not needed to select this option if you don't use such programs. @@ -3127,12 +3639,12 @@ Ако не користите такве програме не треба да укључи ову опцију. - + Use &UIAutomation Користи &UIAutomation - + Try to use special GoldenDict message to retrieve word under cursor. This technology works only with some programs that support it. It is not needed to select this option if you don't use such programs. @@ -3141,87 +3653,87 @@ Ако не користите такве програме да укључи ову опцију не треба. - + Use &GoldenDict message Користи захтев &GoldenDict - + History Историјат - + Turn this option on to store history of the translated words Укључите ову могућност за чување историје преведених речи - + Store &history Складиште &историје - + Specify the maximum number of entries to keep in history. Одредите највећи број ставки задржат у историји - + Maximum history size: Максимална величина историје: - + History saving interval. If set to 0 history will be saved only during exit. Раздобље чувања историје. Ако се подеси на 0 у историји ће бити сачувана само током излаза. - + Save every Сачувај сваких - + minutes минута - + Articles Чланци - + Turn this option on to always expand optional parts of articles Укључите ову могућност да увек прошири необавезне делове чланака - + Expand optional &parts Могућност проширења &делова - + Select this option to automatic collapse big articles Изаберите ову могућност да бисте аутоматски урушити велике чланке - + Collapse articles more than Уруши чланке опширније од - + Articles longer than this size will be collapsed Чланци дужи него ове величине ће бити срушени - + symbols симболи - + <!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; } @@ -3234,27 +3746,27 @@ <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" color:#ff0000;">Напомена: Чини се да користите верзију X.Org XServer, у којој не постоји подршка за проширење RECORD. Вероватно пречице GoldenDict не раде. Овај проблем би требало да буде исправљен на страни XServer. За више информација погледајте </span><a href="https://bugs.freedesktop.org/show_bug.cgi?id=20500"><span style=" text-decoration: underline; color:#0000ff;">bug entry</span></a><span style=" color:#ff0000;"> а ако желите, поставите своје коментаре.</span></p></body></html> - + &Audio &Аудио - + Pronunciation Изговор - + Auto-pronounce words in main window Аутоматски изговари речи у главном прозору - + Auto-pronounce words in scan popup Аутоматски изговорити речи у искачућем прозору - + Playback Репродукција @@ -3279,59 +3791,59 @@ Репродукуј преко Phonon - + Use any external program to play audio files Користите неку спољну апликацију за репродукцију аудио датотека - + Use external program: Користи спољни програм: - + &Network &Мрежа - + Enable if you wish to use a proxy server for all program's network requests. Омогући ако користите прокси сервер за све мрежне захтеве програма. - + Use proxy server Користи прокси-сервер - + Type: Тип: - + Host: Сервер: - + Port: Порт: - + User: Корисничко име: - + Password: Лозинка: - + Enabling this would make GoldenDict block most advertisements by disallowing content (images, frames) not originating from the site you are browsing. If some site breaks because of this, try disabling this. @@ -3341,12 +3853,12 @@ због ове функције, покушајте да онемогућите ову опцију. - + Disallow loading content from other sites (hides most advertisements) Онемогући учитавање садржаја са других сајтова (уклања већи део оглашавања) - + Enabling this would allow to listen to sound pronunciations from online dictionaries that rely on Flash or other web plugins. Plugin must be installed for this option to work. @@ -3355,12 +3867,12 @@ Да би ово функционисало, додатке треба инсталирати. - + Enable web plugins Омогући додатаке сајтовима - + When this is enabled, the program periodically checks if a new, updated version of GoldenDict is available for download. If it is so, the program @@ -3373,42 +3885,43 @@ са сајта. - + Check for new program releases periodically Проверите нову верзију - + System default Систем - подразумевано - + + Default Подразумевано - + Modern Модеран - + Lingvo Lingvo - + Babylon Babylon - + Lingoes Lingoes - + Lingoes-Blue Lingoes-Blue @@ -3417,12 +3930,12 @@ Репродукуј преко DirectShow - + Changing Language Промена језика - + Restart the program to apply the language change. Поново покрените програм за промену језика. @@ -3430,27 +3943,27 @@ ProgramTypeEditor - + Audio Аудио - + Plain Text Текст - + Html Html - + Prefix Match По префиксима - + Unknown Непознато @@ -3476,27 +3989,27 @@ ProgramsModel - + Enabled Укључено - + Type Тип - + Name Назив - + Command Line Командна линија - + Icon Икона @@ -3504,12 +4017,14 @@ QObject - + + Article loading error Грешка при учитавању чланка - + + Article decoding error Грешка декодирања чланка @@ -3620,18 +4135,18 @@ ResourceToSaveHandler - - + + ERROR: %1 ГРЕШКА: %1 - + Resource saving error: Грешка чувања ресурса: - + The referenced resource failed to download. Није могуће учитати повезане ресурсе. @@ -3639,12 +4154,12 @@ Romaji - + Hepburn Romaji for Hiragana Хепберн Ромаји (Хирагана) - + Hepburn Romaji for Katakana Хепберн Ромаји (Катакана) @@ -3677,59 +4192,59 @@ Alt+M - + Back Назад - + Forward Напред - + Pronounce Word (Alt+S) Изговори реч (Alt+S) - + Alt+S Alt+S - + Send word to main window (Alt+W) Пошаљите реч у главни прозор (Alt+W) - + Alt+W Alt+W - + Shows or hides the dictionary bar Приказивање или скривање траке речника - + Use this to pin down the window so it would stay on screen, could be resized or managed in other ways. Кликните да усидрите прозор на екрану, промените величину или било које друге особине. - - - - - + + + + + ... ... - - + + %1 - %2 %1 - %2 @@ -3737,17 +4252,17 @@ SoundDirsModel - + Path Путања - + Name Назив - + Icon Икона @@ -3755,45 +4270,47 @@ Sources - + Text to Speech Текст у говор - + (not available in portable version) (није доступан у преносној верзији) - - - + + + Choose a directory Изабери фасциклу - - - - - + + + + + + Confirm removal Потврди уклањање - - + + Remove directory <b>%1</b> from the list? Уклони фасциклу <b>%1</b> из списка? - - + + + Remove site <b>%1</b> from the list? Уклони сајт <b>%1</b> из списка? - + Remove program <b>%1</b> from the list? Уклони програм <b>%1</b> из списка? @@ -3812,7 +4329,8 @@ - + + &Add... &Додај... @@ -3821,7 +4339,8 @@ - + + &Remove &Уклони @@ -3892,7 +4411,7 @@ Такође је могуће користити %GD1251% за кодирање CP1251, %GDISO1% за ISO 8859-1. - + Programs Програми @@ -3901,27 +4420,27 @@ Сваки екстерни програм. Низ %GDWORD% ће бити замењена траженом речју. Иста реч ће бити послата у стандардни улазни ток. - + Forvo Forvo - + Live pronunciations from <a href="http://www.forvo.com/">forvo.com</a>. The site allows people to record and share word pronunciations. You can listen to them from GoldenDict. Уживо изговор са сајта <a href="http://www.forvo.com/">forvo.com</a>. Овај сајт омогућава корисницима да снимају и деле изговорене речи. Можете да их слушам из GoldenDict. - + Enable pronunciations from Forvo Укључи изговор из Forvo - + API Key: Кључ API: - + Use of Forvo currently requires an API key. Leave this field blank to use the default key, which may become unavailable in the future, or register on the site to get your own key. @@ -3949,84 +4468,94 @@ %GDBIG5% за Big-5, %GDBIG5HKSCS% за Big5-HKSCS, %GDGBK% за GBK и GB18030, %GDSHIFTJIS% за Shift-JIS. + + DICT servers + + + + DICT servers: + + + + Any external programs. A string %GDWORD% will be replaced with the query word. If such string is not presented, the word will be fed into standard input. Неки спољни програми. Низ %GDWORD% биће замењен речју упита. Ако такав низ није представљен, реч ће се учитати у стандардни улаз. - + Get your own key <a href="http://api.forvo.com/key/">here</a>, or leave blank to use the default one. Набавите свој кључ <a href="http://api.forvo.com/key/">here</a>, или оставите празно да бисте користили подразумевани. - + Language codes (comma-separated): Листа језичких кодова (раздвојене зарезима): - + List of language codes you would like to have. Example: "en, ru". Листа кодова за језике које желите да користите. Пример: "en, ru". - + Full list of language codes is available <a href="http://www.forvo.com/languages-codes/">here</a>. Комплетан списак језичких кодова је доступан <a href="http://www.forvo.com/languages-codes/">овде</a>. - + Transliteration Транслитерација - + Russian transliteration Транслитерација (Руски) - + Greek transliteration Транслитерација (Грчки) - + German transliteration Транслитерација (Немачки) - + Belarusian transliteration Белоруска транслитерација - + Enables to use the Latin alphabet to write the Japanese language Омогућава коришћење латинице за писање јапанског - + Japanese Romaji Ромаји (Јапански) - + Systems: Системи: - + The most widely used method of transcription of Japanese, based on English phonology Најпопуларнији метод преписивања Јапанског је, заснован на енглеској фонологији - + Hepburn Хепберн - + The most regular system, having a one-to-one relation to the kana writing systems. Standardized as ISO 3602 @@ -4037,12 +4566,12 @@ В GoldenDict пока не реализована. - + Nihon-shiki Nihon-shiki - + Based on Nihon-shiki system, but modified for modern standard Japanese. Standardized as ISO 3602 @@ -4053,32 +4582,32 @@ В GoldenDict пока не реализована. - + Kunrei-shiki Kunrei-shiki - + Syllabaries: Слоговна азбука: - + Hiragana Japanese syllabary Слоговна азбука "Хирагана" - + Hiragana Хирагана - + Katakana Japanese syllabary Слоговна азбука "Катакана" - + Katakana Катакана @@ -4219,22 +4748,22 @@ WebSitesModel - + Enabled Укључено - + Name Назив - + Address Адреса - + Icon Икона @@ -4242,7 +4771,7 @@ WordFinder - + Failed to query some dictionaries. Претрага није успео у неким речницима. diff -Nru goldendict-1.5.0~git20131003/locale/sv_SE.ts goldendict-1.5.0~git20150923/locale/sv_SE.ts --- goldendict-1.5.0~git20131003/locale/sv_SE.ts 2013-10-02 20:42:04.000000000 +0000 +++ goldendict-1.5.0~git20150923/locale/sv_SE.ts 2015-09-23 08:26:24.000000000 +0000 @@ -34,7 +34,7 @@ [Okänd] - + Based on Qt %1 (%2, %3 bit) Baserat på Qt %1 (%2, %3 bitar) @@ -42,62 +42,62 @@ ArticleMaker - + No translation for <b>%1</b> was found in group <b>%2</b>. Ingen översättning för <b>%1</b> hittades i gruppen <b>%2</b>. - + No translation was found in group <b>%1</b>. Ingen översättning hittades i gruppen <b>%1</b>. - + Welcome! Välkommen! - + Expand article Visa artikel - + Collapse article Dölj artikel - + <h3 align="center">Welcome to <b>GoldenDict</b>!</h3><p>To start working with the program, first visit <b>Edit|Dictionaries</b> to add some directory paths where to search for the dictionary files, set up various Wikipedia sites or other sources, adjust dictionary order or create dictionary groups.<p>And then you're ready to look up your words! You can do that in this window by using a pane to the left, or you can <a href="Working with popup">look up words from other active applications</a>. <p>To customize program, check out the available preferences at <b>Edit|Preferences</b>. All settings there have tooltips, be sure to read them if you are in doubt about anything.<p>Should you need further help, have any questions, suggestions or just wonder what the others think, you are welcome at the program's <a href="http://goldendict.org/forum/">forum</a>.<p>Check program's <a href="http://goldendict.org/">website</a> for the updates. <p>(c) 2008-2013 Konstantin Isakov. Licensed under GPLv3 or later. <h3 align="center">Välkommen till <b>GoldenDict</b>!</h3><p>För att komma igång med programmet måste du först gå till <b>Redigera|Ordlistor</b> för att lägga till mappsökvägar där programmet skall söka efter dina ordlistefiler. Där kan du även konfigurera olika Wikipedia-webbplatser eller andra källor, ändra ordning på ordlistor och skapa ordlistegrupper.<p>När det är avklarat kan du börja slå upp ord! Du kan göra detta i det här fönstret genom att använda sökpanelen till vänster, eller genom att <a href="Arbeta med popuprutor">slå upp ord inifrån andra öppna program</a>. <p>Vill du anpassa programmet hittar du alla tillgängliga inställningsalternativ i <b>Redigera|Inställningar</b>. Alla inställningar där har verktygstips, läs dem om det är något du undrar över.<p>Om du behöver ytterligare hjälp, behöver ställa en fråga, har förslag eller bara undrar vad andra tycker, så är du välkommen till programmets <a href="http://goldendict.org/forum/">forum</a>.<p>Gå till programmets <a href="http://goldendict.org/">webbplats</a> för att hitta uppdateringar. <p>(c) 2008-2013 Konstantin Isakov. Licensierat under GNU GPLv3 eller senare. - + Working with popup Arbeta med popuprutor - + <h3 align="center">Working with the popup</h3>To look up words from other active applications, you would need to first activate the <i>"Scan popup functionality"</i> in <b>Preferences</b>, and then enable it at any time either by triggering the 'Popup' icon above, or by clicking the tray icon down below with your right mouse button and choosing so in the menu you've popped. <h3 align="center">Arbeta med popuprutor</h3>För att slå upp ord inifrån andra öppna program, så måste du först aktivera alternativet <i>"Använd sökning med popupruta"</i> i <b>Inställningar</b>. Därefter kan du slå på/stänga av funktionen vid behov genom att antingen klicka på popuprutefunktionens ikon här ovan eller genom att högerklicka på ikonen i meddelandefältet och välja alternativet i menyn som visas. - + Then just stop the cursor over the word you want to look up in another application, and a window would pop up which would describe it to you. Håll sedan muspekaren över det ord som du vill slå upp i det andra programmet, så visas en popupruta med sökresultat från de ordlistor du använder. - + Then just select any word you want to look up in another application by your mouse (double-click it or swipe it with mouse with the button pressed), and a window would pop up which would describe the word to you. Använd sedan musen för att markera det ord som du vill slå upp i det andra programmet (dubbelklicka eller klicka och dra med musknappen nedtryckt), så visas en popupruta med sökresultat från de ordlistor du använder. - + (untitled) (namnlös) - + (picture) (bild) @@ -105,37 +105,37 @@ ArticleRequest - + Expand article Visa artikel - + From Från - + Collapse article Dölj artikel - + Query error: %1 Frågefel: %1 - + Close words: Närliggande ord: - + Compound expressions: Sammansättningar: - + Individual words: Enskilda ord: @@ -148,219 +148,222 @@ Formulär - + about:blank about:blank - + x x - + Find: Sök: - + + &Previous &Föregående - + + &Next &Nästa - + Ctrl+G Ctrl+G - + &Case Sensitive &Skiftlägeskänslig - + Highlight &all Färgmarkera &alla - + Select Current Article Markera aktuell artikel - + Copy as text Kopiera som oformaterad text - + Inspect Granska källkod - + Resource Resurs - + Audio Ljud - + TTS Voice Text till tal-modul - + Picture Bild - + Video Video - + Video: %1 Video: %1 - + Definition from dictionary "%1": %2 Definition ur ordlistan "%1": %2 - + Definition: %1 Definition: %1 - - + + The referenced resource doesn't exist. Den refererade resursen finns inte. - + The referenced audio program doesn't exist. Det refererade ljudprogrammet finns inte. - + + ERROR: %1 FEL: %1 - + Save sound Spara ljud - + Sound files (*.wav *.ogg *.mp3 *.mp4 *.aac *.flac *.mid *.wv *.ape);;All files (*.*) Ljudfiler (*.wav *.ogg *.mp3 *.mp4 *.aac *.flac *.mid *.wv *.ape);;Alla filer (*.*) - + Save image Spara bild - + Image files (*.bmp *.jpg *.png *.tif);;All files (*.*) Bildfiler (*.bmp *.jpg *.png *.tif);;Alla filer (*.*) - + &Open Link Öppna &länk - + Open Link in New &Tab Öppna länk i ny &flik - + Open Link in &External Browser Öppna länk i extern &webbläsare - + Save &image... Spara &bild … - + Save s&ound... Spara l&jud … - + &Look up "%1" &Slå upp "%1" - + Look up "%1" in &New Tab Slå upp "%1" i &ny flik - + Send "%1" to input line Skicka "%1" till sökfältet - - + + &Add "%1" to history &Lägg till "%1" i historiken - + Look up "%1" in %2 Slå upp "%1" i %2 - + Look up "%1" in %2 in &New Tab Slå upp "%1" i %2 i &ny flik - + WARNING: FFmpeg Audio Player: %1 VARNING: Ljudspelare för FFmpeg: %1 - + WARNING: %1 VARNING: %1 - + Failed to run a player to play sound file: %1 Det gick inte att köra en spelare när en ljudfil skulle spelas upp: %1 - + Failed to create temporary file. Det gick inte att skapa en tillfällig fil. - + Failed to auto-open resource file, try opening manually: %1. Det gick inte att automatiskt öppna en resursfil. Försök att öppna den manuellt: %1. - + The referenced resource failed to download. Det gick inte att hämta den refererade resursen. @@ -386,6 +389,29 @@ + Dialog + + + Proxy authentication required + + + + + You need to supply a Username and a Password to access via proxy + + + + + Username: + + + + + Password: + Lösenord: + + + DictGroupWidget @@ -486,6 +512,119 @@ + DictHeadwords + + + Search mode + + + + + This element determines how filter string will be interpreted + + + + + If checked on the symbols case will be take in account when filtering + + + + + Match case + + + + + Exports headwords to file + + + + + Export + + + + + Help + + + + + OK + + + + + Press this button to apply filter to headwords list + + + + + Apply + + + + + If checked any filter changes will we immediately applied to headwords list + + + + + Auto apply + + + + + Filter: + + + + + Filter string (fixed string, wildcards or regular expression) + + + + + Text + + + + + Wildcards + + + + + RegExp + + + + + Unique headwords total: %1, filtered: %2 + + + + + Save headwords to file + + + + + Text files (*.txt);;All files (*.*) + Textfiler (*.txt);;Alla filer (*.*) + + + + Export headwords... + + + + + Cancel + Avbryt + + + DictInfo @@ -528,6 +667,16 @@ Beskrivning: + + Show all unique dictionary headwords + + + + + Headwords + + + Edit the dictionary via command: %1 @@ -544,6 +693,74 @@ + DictServer + + + Url: + + + + + Databases: + + + + + Search strategies: + + + + + Server databases + + + + + DictServersModel + + + Enabled + Aktiverad + + + + Name + Namn + + + + Address + Adress + + + + Databases + + + + + Strategies + + + + + Icon + Ikon + + + + Comma-delimited list of databases +(empty string or "*" matches all databases) + + + + + Comma-delimited list of search strategies +(empty string mean "prefix" strategy) + + + + DictionaryBar @@ -561,17 +778,22 @@ Redigera denna grupp - + Dictionary info Ordlisteinformation - + + Dictionary headwords + + + + Open dictionary folder Öppna ordlistans lagringsmapp - + Edit dictionary Redigera ordlista @@ -584,39 +806,39 @@ Ordlistor - + &Sources &Källor - - + + &Dictionaries &Ordlistor - - + + &Groups &Grupper - + Sources changed Källor har ändrats - + Some sources were changed. Would you like to accept the changes? Några källor har ändrats. Godkänner du ändringarna? - + Accept Godkänn - + Cancel Avbryt @@ -630,6 +852,92 @@ + FTS::FtsIndexing + + + None + Ingen + + + + FTS::FullTextSearchDialog + + + Full-text search + + + + + Whole words + + + + + Plain text + + + + + Wildcards + + + + + RegExp + + + + + Max distance between words (%1-%2): + + + + + Max articles per dictionary (%1-%2): + + + + + + + Articles found: + + + + + Now indexing: + + + + + CJK symbols in search string are not compatible with search modes "Whole words" and "Plain text" + + + + + The search line must contains at least one word containing + + + + + or more symbols + + + + + No dictionaries for full-text search + + + + + FTS::Indexing + + + None + Ingen + + + Forvo::ForvoArticleRequest @@ -668,6 +976,65 @@ + FullTextSearchDialog + + + + Search + + + + + Match case + + + + + Mode: + + + + + Articles found: + + + + + Available dictionaries in group: + + + + + Wait for indexing: + + + + + Total: + + + + + Indexed: + + + + + Now indexing: None + + + + + Cancel + Avbryt + + + + Help + + + + GermanTranslit @@ -798,7 +1165,7 @@ - + Remove all groups Ta bort alla grupper @@ -809,42 +1176,100 @@ Använd musen för att dra och släppa ordlistor till och från grupperna, ändra ordlistornas ordning inom grupperna samt ändra gruppernas inbördes ordning. - + + Group tabs + + + + + Open groups list + + + + Add group Lägg till grupp - + Give a name for the new group: Ange ett namn på den nya gruppen: - + Rename group Byt namn på grupp - + Give a new name for the group: Ange ett nytt namn på gruppen: - + Remove group Ta bort grupp - + Are you sure you want to remove the group <b>%1</b>? Är du säker på att du vill ta bort gruppen <b>%1</b>? - + Are you sure you want to remove all the groups? Är du säker på att du vill ta bort alla grupper? + Help::HelpWindow + + + GoldenDict help + + + + + Home + + + + + Back + Bakåt + + + + Forward + Framåt + + + + Zoom In + Zooma in + + + + Zoom Out + Zooma ut + + + + Normal Size + Normal storlek + + + + Content + + + + + Index + + + + HistoryPaneWidget @@ -875,12 +1300,12 @@ Hunspell - + Spelling suggestions: Stavningsförslag: - + %1 Morphology Morfologi för %1 @@ -888,12 +1313,12 @@ HunspellDictsModel - + Enabled Aktiverad - + Name Namn @@ -1933,7 +2358,7 @@ LoadDictionaries - + Error loading dictionaries Fel vid inläsning av ordlistorna @@ -1941,7 +2366,7 @@ Main - + Error in configuration file. Continue with default settings? Fel i konfigurationsfilen. Vill du använda standardinställningarna istället? @@ -1950,534 +2375,575 @@ MainWindow - + Welcome! Välkommen! - + &File &Arkiv - + &Edit &Redigera - + &Help &Hjälp - + &View &Visa - + &Zoom &Zooma - + H&istory &Historik - + + Search + + + + &Search Pane &Sökpanel - + &Results Navigation Pane &Resultatpanel - + &History Pane &Historikpanel - + &Dictionaries... &Ordlistor … - + F3 F3 - + &Preferences... &Inställningar … - + F4 F4 - + &Homepage &Webbplats - + &About &Om - + About GoldenDict Om GoldenDict - + + GoldenDict reference + + + + F1 F1 - - + + &Quit &Avsluta - + Quit from application Avslutar programmet - + Ctrl+Q Ctrl+Q - + &Forum &Forum - + &Close To Tray &Stäng till meddelandefältet - + Minimizes the window to tray Minimerar programfönstret till meddelandefältet - + Ctrl+F4 Ctrl+F4 - + &Save Article &Spara artikel - + Save Article Spara artikel - + F2 F2 - + &Print Skriv &ut - + Ctrl+P Ctrl+P - + Page Set&up Utskrifts&format - + Print Pre&view Förhands&granska - + &Rescan Files Sök igenom filer &igen - + &New Tab &Ny flik - + &Always on Top &Alltid överst - + Always on Top Alltid överst - + Ctrl+O Ctrl+O - - - + + + Menu Button Menyknapp - + + Search in page + + + + + Ctrl+F + + + + + Full-text search + + + + + Ctrl+Shift+F + + + + Ctrl+F5 Ctrl+F5 - + &Clear &Rensa - + New Tab Ny flik - + Ctrl+T Ctrl+T - + &Configuration Folder &Konfigurationsfilmapp - - + + &Show &Visa - + Ctrl+H Ctrl+H - + &Export &Exportera - + &Import &Importera - + &Menubar &Menyrad - + Show Names in Dictionary &Bar Visa namn i ordliste&fältet - + Show Small Icons in &Toolbars Visa små ikoner i &verktygsfält - + &Navigation &Navigeringsfältet - + Back Bakåt - + Forward Framåt - + Scan Popup Sökpopupruta - + Pronounce Word (Alt+S) Läs upp ord (Alt+S) - + Zoom In Zooma in - + Zoom Out Zooma ut - + Normal Size Normal storlek - - + + Look up in: Slå upp i: - + Found in Dictionaries: Träffar hittades i följande ordlistor: - + Words Zoom In Zooma in ord - + Words Zoom Out Zooma ut ord - + Words Normal Size Normal storlek på ord - + Show &Main Window Visa &huvudfönstret - + Opened tabs Öppnade flikar - + Close current tab Stäng aktuell flik - + Close all tabs Stäng alla flikar - + Close all tabs except current Stäng alla flikar utom aktuell flik - + Loading... Läser in … - + %1 dictionaries, %2 articles, %3 words %1 ordlistor, %2 artiklar, %3 ord - + Look up: Slå upp: - + All Alla - + Open Tabs List Öppna lista över flikar - + (untitled) (namnlös) - + %1 - %2 %1 - %2 - + Failed to initialize hotkeys monitoring mechanism.<br>Make sure your XServer has RECORD extension turned on. Det gick inte att initiera övervakningsmekanismen för kortkommandon.<br>Säkerställ att tillägget RECORD för din XServer är aktiverat. - + New Release Available Ny version tillgänglig - + Version <b>%1</b> of GoldenDict is now available for download.<br>Click <b>Download</b> to get to the download page. Version <b>%1</b> av GoldenDict finns nu tillgänglig för hämtning.<br>Klicka på <b>Hämta</b> för att gå till hämtningssidan. - + Download Hämta - + Skip This Release Hoppa över denna version - - + + Accessibility API is not enabled API för hjälpmedel har inte aktiverats - + + String to search in dictionaries. The wildcards '*', '?' and sets of symbols '[...]' are allowed. +To find '*', '?', '[', ']' symbols use '\*', '\?', '\[', '\]' respectively + + + + You have chosen to hide a menubar. Use %1 to show it back. Du har valt att dölja en menyrad. Använd %1 för att visa den igen. - + Ctrl+M Ctrl+M - + Page Setup Utskriftsformat - + No printer is available. Please install one first. Inga tillgängliga skrivare. Du måste installera eller ansluta dig till en. - + Print Article Skriv ut artikel - + Article, Complete (*.html) Artikel, fullständig (*.html) - + Article, HTML Only (*.html) Artikel, endast HTML (*.html) - + Save Article As Spara artikel som - + Error Fel - + Can't save article: %1 Det gick inte att spara artikeln: %1 - + Saving article... Sparar artikel … - + The main window is set to be always on top. Huvudfönstret har ställts in att alltid ligga överst. - + &Hide &Dölj - + Export history to file Exportera historik till fil - - + + Text files (*.txt);;All files (*.*) Textfiler (*.txt);;Alla filer (*.*) - + History export complete Historiken har exporterats - + Export error: Fel vid export: - + Import history from file Importera historik från fil - + Import error: invalid data in file Fel vid import: felaktiga data i fil - + History import complete Historiken har importerats - + Import error: Fel vid import: - + Dictionary info Information om ordlista - + + Dictionary headwords + + + + Open dictionary folder Öppna ordlistans mapp - + Edit dictionary Redigera ordlista @@ -2485,12 +2951,12 @@ Mdx::MdxArticleRequest - + Dictionary file was tampered or corrupted Ordlistefilen har manipulerats eller är skadad - + Failed loading article from %1, reason: %2 Det gick inte att läsa in en artikel från %1, orsak: %2 @@ -2498,7 +2964,7 @@ MediaWiki::MediaWikiArticleRequest - + XML parse error: %1 at %2,%3 XML-tolkningsfel: %1 på %2, %3 @@ -2506,7 +2972,7 @@ MediaWiki::MediaWikiWordSearchRequest - + XML parse error: %1 at %2,%3 XML-tolkningsfel: %1 på %2, %3 @@ -2514,22 +2980,22 @@ MediaWikisModel - + Enabled Aktiverad - + Name Namn - + Address Adress - + Icon Ikon @@ -2542,88 +3008,94 @@ Formulär - + Dictionary order: Ordlisteordning: - - - - ... - + - + Inactive (disabled) dictionaries: Inaktiverade ordlistor: - + Dictionary information Information om ordlista - + Name: Namn: - + Total articles: Antal artiklar: - + Total words: Antal ord: - + Translates from: Källspråk: - + Translates to: Målspråk: - + Description: Beskrivning: - + Files comprising this dictionary: Filer som omfattas av ordlistan: - + Adjust the order by dragging and dropping items in it. Drop dictionaries to the inactive group to disable their use. Ändra ordningen genom att dra och släppa objekten i listan. Släpp ordlistor i gruppen "Inaktiverade ordlistor" för att inaktivera dem. - + Sort by name Sortera efter namn - + Sort by languages Sortera efter språk + + + Dictionary headwords + + + + + Dictionaries active: %1, inactive: %2 + + PathsModel - + Path Sökväg - + Recursive Rekursiv @@ -2782,22 +3254,27 @@ Tilläggsformat: - + + Help language + + + + Adjust this value to avoid huge context menus. Justera detta värde för att undvika alltför stora snabbmenyer. - + Context menu dictionaries limit: Högsta antal ordlistor i snabbmenyer: - + &Scan Popup &Sökpopupruta - + When enabled, a translation popup window would be shown each time you point your mouse on any word on the screen (Windows) or select any word with mouse (Linux). When enabled, you can switch it on and @@ -2808,136 +3285,136 @@ och stängas av från huvudfönstret eller ikonen i meddelandefältet. - + Enable scan popup functionality Aktivera sökpopuprutefunktionen - + Chooses whether the scan popup mode is on by default or not. If checked, the program would always start with the scan popup active. Avgör om sökpopuprutelägets standardinställning är PÅ eller AV. Om kryss- rutan är markerad startar programmet alltid med sökpopuprutan påslagen. - + Start with scan popup turned on Starta med sökpopuprutan påslagen - + With this enabled, the popup would only show up if all chosen keys are in the pressed state when the word selection changes. När alternativet är aktiverat visas sökpopuprutan endast om alla de angivna tangenterna är nedtryckta när ordet markeras. - + Only show popup when all selected keys are kept pressed: Visa endast sökpopuprutan när följande tangenter hålls nedtryckta: - + Left Ctrl only Endast vänster Ctrl-tangent - + Left Ctrl Vänster Ctrl - + Right Shift only Endast höger Skift-tangent - + Right Shift Höger Skift - + Alt key Alt-tangenten - + Alt Alt - + Ctrl key Ctrl-tangenten - + Ctrl Ctrl - + Left Alt only Endast vänster Alt-tangent - + Left Alt Vänster Alt - + Shift key Skift-tangenten - + Shift Skift - + Right Alt only Endast höger Alt-tangent - + Right Alt Höger Alt - + Right Ctrl only Endast höger Ctrl-tangent - + Right Ctrl Höger Ctrl - + Left Shift only Endast vänster Skift-tangent - + Left Shift Vänster Skift - + Windows key or Meta key Windows- eller Meta-tangenten - + Win/Meta Win/Meta - + Normally, in order to activate a popup you have to maintain the chosen keys pressed while you select a word. With this enabled, the chosen keys may also @@ -2949,12 +3426,12 @@ markerats. - + Keys may also be pressed afterwards, within Tillåt att tangenter trycks ned efter markering, inom - + To avoid false positives, the keys are only monitored after the selection's done for a limited amount of seconds, which is specified here. @@ -2963,42 +3440,42 @@ efter slutförd markering. Här anges den tidsperioden. - + secs s - + Send translated word to main window instead of to show it in popup window Skicka översatta ord till huvudfönstret istället för att visa dem i popuprutan. - + Send translated word to main window Skicka översatta ord till huvudfönstret - + Hotkeys Kortkommandon - + Use the following hotkey to show or hide the main window: Använd följande kortkommando för att visa eller dölja huvudfönstret: - + Use the following hotkey to translate a word from clipboard: Använd följande kortkommando för att översätta ett ord från Urklipp: - + The hotkeys are global and work from any program and within any context as long as GoldenDict is running in background. Kortkommandona är globala och fungerar inifrån alla program och i alla sammanhang, förutsatt att GoldenDict körs i bakgrunden. - + <!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; } @@ -3011,77 +3488,112 @@ <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" color:#ff0000;">Obs: Det verkar som att du kör en XServer-version (från X.Org) vars tillägg <b>Record</b> är skadat. Kortkommandon kommer antagligen inte att fungera i GoldenDict. Problemet måste åtgärdas i själva servern. Gå till följande </span><a href="https://bugs.freedesktop.org/show_bug.cgi?id=20500"><span style=" text-decoration: underline; color:#0000ff;">buggrapport</span></a><span style=" color:#ff0000;"> och lämna en kommentar där om du så önskar.</span></p></body></html> - + &Audio L&jud - + Pronunciation Text till tal - + Auto-pronounce words in main window Läs automatiskt upp ord i huvudfönstret - + Auto-pronounce words in scan popup Läs automatiskt upp ord i popuprutan - + Playback Uppspelning - + Play audio files via FFmpeg(libav) and libao Spela upp ljudfiler via FFmpeg(libav) och libao. - + Use internal player Använd intern spelare - + + System proxy + + + + + Custom proxy + + + + + Custom settings + + + + + Full-text search + + + + + Allow full-text search for: + + + + + Don't search in dictionaries containing more than + + + + + articles (0 - unlimited) + + + + Select this option to automatic collapse big articles Välj detta alternativ för att automatiskt dölja stora artiklar. - + Collapse articles more than Dölj artiklar längre än - + Articles longer than this size will be collapsed Artiklar som är längre än följande antal tecken kommer att komprimeras. - + symbols tecken - + Use any external program to play audio files Använd ett externt program för att spela upp ljudfiler. - + Use external program: Använd externt program: - + &Network &Nätverk - + Enable if you wish to use a proxy server for all program's network requests. Aktivera detta alternativ om du vill använda @@ -3089,37 +3601,37 @@ förfrågningar. - + Use proxy server Använd proxyserver - + Type: Typ: - + Host: Värd: - + Port: Port: - + User: Användare: - + Password: Lösenord: - + Enabling this would make GoldenDict block most advertisements by disallowing content (images, frames) not originating from the site you are browsing. If some site breaks because of this, try disabling this. @@ -3129,12 +3641,12 @@ webbplats slutar fungera p.g.a. det här, testa att inaktivera alternativet. - + Disallow loading content from other sites (hides most advertisements) Blockera inläsning av innehåll från andra webbplatser (döljer merparten av annonserna) - + Enabling this would allow to listen to sound pronunciations from online dictionaries that rely on Flash or other web plugins. Plugin must be installed for this option to work. @@ -3144,12 +3656,12 @@ detta alternativ skall fungera. - + Enable web plugins Aktivera webbinsticksmoduler - + Some sites detect GoldenDict via HTTP headers and block the requests. Enable this option to workaround the problem. Vissa webbplatser identifierar GoldenDict m.h.a. HTTP-huvuden och @@ -3157,12 +3669,12 @@ det problemet. - + Do not identify GoldenDict in HTTP headers Identifiera inte GoldenDict i HTTP-huvuden - + When this is enabled, the program periodically checks if a new, updated version of GoldenDict is available for download. If it is so, the program @@ -3175,22 +3687,22 @@ saken och ber denna att öppna en hämtningssida. - + Check for new program releases periodically Sök med jämna mellanrum efter nya programversioner - + Ad&vanced A&vancerat - + ScanPopup extra technologies Ytterligare teknologier för sökpopuprutan - + Try to use IAccessibleEx technology to retrieve word under cursor. This technology works only with some programs that support it (for example Internet Explorer 9). @@ -3201,12 +3713,12 @@ sådana program, så behöver du inte aktivera det här alternativet. - + Use &IAccessibleEx Använd &IAccessibleEx - + Try to use UI Automation technology to retrieve word under cursor. This technology works only with some programs that support it. It is not needed to select this option if you don't use such programs. @@ -3216,12 +3728,12 @@ du inte aktivera det här alternativet. - + Use &UIAutomation Använd &UIAutomation - + Try to use special GoldenDict message to retrieve word under cursor. This technology works only with some programs that support it. It is not needed to select this option if you don't use such programs. @@ -3231,107 +3743,108 @@ du inte aktivera det här alternativet. - + Use &GoldenDict message Använd &GoldenDict-meddelande - + History Historik - + Turn this option on to store history of the translated words Aktivera detta alternativ för att lagra en historik över översatta ord. - + Store &history Lagra &historik - + Specify the maximum number of entries to keep in history. Ange det maximala antalet poster som får behållas i historiken. - + Maximum history size: Största historikstorlek: - + History saving interval. If set to 0 history will be saved only during exit. Sparintervall för historiken. Ange till 0 för att endast spara historiken vid programavslut. - + Save every Spara var - + minutes minut - + Articles Artiklar - + Turn this option on to always expand optional parts of articles Aktivera detta alternativ för att alltid visa valfria delar av artiklar. - + Expand optional &parts Visa valfria &delar - + System default Systemstandard - + + Default Standard - + Modern Modernt - + Lingvo Lingvo - + Babylon Babylon - + Lingoes Lingoes - + Lingoes-Blue Lingoes (blå) - + Changing Language Språkbyte - + Restart the program to apply the language change. Starta om programmet för att verkställa bytet av språk. @@ -3339,27 +3852,27 @@ ProgramTypeEditor - + Audio Ljud - + Plain Text Oformaterad text - + Html HTML - + Prefix Match Prefixmatchning - + Unknown Okänd @@ -3385,27 +3898,27 @@ ProgramsModel - + Enabled Aktiverad - + Type Typ - + Name Namn - + Command Line Kommandorad - + Icon Ikon @@ -3413,12 +3926,14 @@ QObject - + + Article loading error Artikelinläsningsfel - + + Article decoding error Artikelavkodningsfel @@ -3529,18 +4044,18 @@ ResourceToSaveHandler - - + + ERROR: %1 FEL: %1 - + Resource saving error: Fel när resurs skulle sparas: - + The referenced resource failed to download. Det gick inte att hämta den refererade resursen. @@ -3548,12 +4063,12 @@ Romaji - + Hepburn Romaji for Hiragana Romanisering för hiragana enl. Hepburn-systemet - + Hepburn Romaji for Katakana Romanisering för katakana enl. Hepburn-systemet @@ -3574,59 +4089,59 @@ Dialog - + Back Bakåt - - - - - + + + + + ... - + Forward Framåt - + Pronounce Word (Alt+S) Läs upp ord (Alt+S) - + Alt+S Alt+S - + Send word to main window (Alt+W) Skicka ord till huvudfönstret (Alt+W) - + Alt+W Alt+W - + Shows or hides the dictionary bar Visar/döljer ordlistefältet - + Use this to pin down the window so it would stay on screen, could be resized or managed in other ways. Klicka här för att nåla fast rutan så att den stannar kvar på skärmen. Rutan kan storleksändras och hanteras på andra sätt. - - + + %1 - %2 %1 - %2 @@ -3634,17 +4149,17 @@ SoundDirsModel - + Path Sökväg - + Name Namn - + Icon Ikon @@ -3666,7 +4181,8 @@ - + + &Add... &Lägg till … @@ -3675,7 +4191,8 @@ - + + &Remove Ta &bort @@ -3750,32 +4267,32 @@ Ange de webbplatser du vill använda. Strängen %GDWORD% ersätts av sökordet vid sökning: - + Programs Program - + Forvo Forvo - + Live pronunciations from <a href="http://www.forvo.com/">forvo.com</a>. The site allows people to record and share word pronunciations. You can listen to them from GoldenDict. Uppläsning av ord från <a href="http://www.forvo.com/">forvo.com</a>, en webbplats som låter människor spela in och dela uttal av ord. Du kan lyssna på inspelningarna inifrån GoldenDict. - + Enable pronunciations from Forvo Aktivera orduppläsningar från Forvo - + API Key: API-nyckel: - + Use of Forvo currently requires an API key. Leave this field blank to use the default key, which may become unavailable in the future, or register on the site to get your own key. @@ -3785,7 +4302,7 @@ dig på webbplatsen för att få din egen nyckel. - + Get your own key <a href="http://api.forvo.com/key/">here</a>, or leave blank to use the default one. Skaffa en egen nyckel <a href="http://api.forvo.com/key/">här</a> eller lämna fältet tomt för att använda standardnyckeln. @@ -3797,79 +4314,89 @@ %GDBIG5% för Big5, %GDBIG5HKSCS% för Big5-HKSCS, %GDGBK% för GBK och GB18030, samt %GDSHIFTJIS% för Shift JIS. + + DICT servers + + + + DICT servers: + + + + Any external programs. A string %GDWORD% will be replaced with the query word. If such string is not presented, the word will be fed into standard input. Ange de program du vill använda. Strängen %GDWORD% ersätts av sökordet. Om strängen inte finns kommer sökordet att matas in som standardindata. - + Language codes (comma-separated): Språkkoder: - + List of language codes you would like to have. Example: "en, ru". Lista över språkkoder för de som du vill ha tillgång till. Exempel: "en, fr, sv". - + Full list of language codes is available <a href="http://www.forvo.com/languages-codes/">here</a>. Avgränsa språkkoderna med kommatecken. En fullständig lista över språkkoder finns tillgänglig <a href="http://www.forvo.com/languages-codes/">här</a>. - + Transliteration Translitterering - + Russian transliteration Translitterering av ryska - + Greek transliteration Translitterering av grekiska - + German transliteration Translitterering av tyska - + Belarusian transliteration Translitterering av vitryska - + Enables to use the Latin alphabet to write the Japanese language Låter dig använda det latinska alfabetet för att skriva på japanska - + Japanese Romaji Romanisering av japanska - + Systems: System: - + The most widely used method of transcription of Japanese, based on English phonology Den mest utbredda metoden för transkribering av japanska, baserad på engelsk fonologi. - + Hepburn Hepburn - + The most regular system, having a one-to-one relation to the kana writing systems. Standardized as ISO 3602 @@ -3880,12 +4407,12 @@ Har ännu inte implementerats i GoldenDict. - + Nihon-shiki Nihon-shiki - + Based on Nihon-shiki system, but modified for modern standard Japanese. Standardized as ISO 3602 @@ -3896,75 +4423,77 @@ Har ännu inte implementerats i GoldenDict. - + Kunrei-shiki Kunrei-shiki - + Syllabaries: Stavelseskrifter: - + Hiragana Japanese syllabary Den japanska stavelseskriften hiragana. - + Hiragana Hiragana - + Katakana Japanese syllabary Den japanska stavelseskriften katakana. - + Katakana Katakana - + Text to Speech Text till tal - + (not available in portable version) (inte tillgängligt i den portabla versionen) - - - + + + Choose a directory Välj en mapp - - - - - + + + + + + Confirm removal Bekräfta borttagning - - + + Remove directory <b>%1</b> from the list? Vill du ta bort mappen <b>%1</b> ur listan? - - + + + Remove site <b>%1</b> from the list? Vill du ta bort webbplatsen <b>%1</b> ur listan? - + Remove program <b>%1</b> from the list? Vill du ta bort programmet <b>%1</b> ur listan? @@ -4094,22 +4623,22 @@ WebSitesModel - + Enabled Aktiverad - + Name Namn - + Address Adress - + Icon Ikon @@ -4117,7 +4646,7 @@ WordFinder - + Failed to query some dictionaries. Det gick inte att fråga några av ordlistorna. diff -Nru goldendict-1.5.0~git20131003/locale/tg_TJ.ts goldendict-1.5.0~git20150923/locale/tg_TJ.ts --- goldendict-1.5.0~git20131003/locale/tg_TJ.ts 2013-10-02 20:42:04.000000000 +0000 +++ goldendict-1.5.0~git20150923/locale/tg_TJ.ts 2015-09-23 08:26:24.000000000 +0000 @@ -34,7 +34,7 @@ [Номаълум] - + Based on Qt %1 (%2, %3 bit) Дар Qt %1 (%2, %3 бит) асос меёбад @@ -42,62 +42,62 @@ ArticleMaker - + Expand article Баркушодани мақола - + Collapse article Печондани мақола - + No translation for <b>%1</b> was found in group <b>%2</b>. Ягон тарҷума барои <b>%1</b> дар гурӯҳи <b>%2</b> ёфт нашудааст. - + No translation was found in group <b>%1</b>. Ягон тарҷума дар гурӯҳи <b>%1</b> ёфт нашудааст. - + Welcome! Хуш омадед! - + <h3 align="center">Welcome to <b>GoldenDict</b>!</h3><p>To start working with the program, first visit <b>Edit|Dictionaries</b> to add some directory paths where to search for the dictionary files, set up various Wikipedia sites or other sources, adjust dictionary order or create dictionary groups.<p>And then you're ready to look up your words! You can do that in this window by using a pane to the left, or you can <a href="Working with popup">look up words from other active applications</a>. <p>To customize program, check out the available preferences at <b>Edit|Preferences</b>. All settings there have tooltips, be sure to read them if you are in doubt about anything.<p>Should you need further help, have any questions, suggestions or just wonder what the others think, you are welcome at the program's <a href="http://goldendict.org/forum/">forum</a>.<p>Check program's <a href="http://goldendict.org/">website</a> for the updates. <p>(c) 2008-2013 Konstantin Isakov. Licensed under GPLv3 or later. <h3 align="center">Хуш омадед ба луғати <b>GoldenDict</b>!</h3><p>Барои оғози кор бо луғат, пеш аз ҳама ба <b>Танзимот|Луғатҳо</b> гузаред ва файлҳои луғатҳои лозимиро илова кунед, сайтҳои Wikipedia ё сайтҳои дигарро насб кунед, тартиби луғатҳоро таъин кунед ё гурӯҳҳои луғатро эҷод кунед.<p>Баъд аз ин шумо метавонед калимаҳоро тарҷума кунед! Шумо метавонед калимаҳоро бо истифодаи лавҳаи чапи ин равзана тарҷума кунед, ё шумо метавонед <a href="Тарҷума бо равзанаи пайдошаванда">калимаҳоро дар барномаҳои дигар тарҷума кунед</a>. <p>Барои насб кардани танзимоти шахсӣ, хусусиятҳои дастрасиро дар <b>Танзимот|Хусусиятҳо</b> истифода баред. Ҳамаи танзимоти ин барнома дорои маслиҳат мебошанд. Агар ягон мушкилӣ дошта бошед, мутмаин шавед, ки он маслиҳатҳоро хонед.<p>Барои маълумоти муфассал, гирифтани кӯмак, ҷавобу саволҳо, маслиҳатҳо ё ҳалли масъалаҳои дигар, шумо метавонед <a href="http://goldendict.org/forum/">форуми луғатро</a> истифода баред.<p>Барои гирифтани навсозиҳои барнома <a href="http://goldendict.org/">вебсайти луғатро</a> истифода баред. <p>(c) 2008-2013 Константин Исаков. Иҷозатномаи GPLv3 ё навтар. - + Working with popup Тарҷума бо равзанаи пайдошаванда - + <h3 align="center">Working with the popup</h3>To look up words from other active applications, you would need to first activate the <i>"Scan popup functionality"</i> in <b>Preferences</b>, and then enable it at any time either by triggering the 'Popup' icon above, or by clicking the tray icon down below with your right mouse button and choosing so in the menu you've popped. <h3 align="center">Тарҷума бо равзанаи пайдошаванда</h3>Барои тарҷума кардани калимаҳо дар барномаҳои дигар, пеш аз ҳама шумо бояд <i>"Хусусияти тарҷумаи пайдошавандаро"</i> дар <b>Хусусиятҳо</b> фаъол кунед. Дар оянда шумо метавонед ин хусусиятро ба воситаи зеркунии тугмаи "Тарҷумаи пайдошаванда" фаъол кунед, ё шумо метавонед ин хусусиятро бо зеркунии нишонаи панел аз менюи пайдошуда фаъол кунед. - + Then just stop the cursor over the word you want to look up in another application, and a window would pop up which would describe it to you. Баъд аз фаъол кардани хусусияти тарҷумаи пайдошаванда курсори мушро ба болои калимаи дилхоҳ ҷойгир кунед, ва равзана бо тарҷумаҳо бояд барои шумо пайдо шавад. - + Then just select any word you want to look up in another application by your mouse (double-click it or swipe it with mouse with the button pressed), and a window would pop up which would describe the word to you. Баъд аз фаъол кардани хусусияти тарҷумаи пайдошаванда, калимаи дилхоҳро дар барномаи дигар бо нишондиҳандаи муш интихоб кунед (ба калимаи дилхоҳ дубора зер кунед) ва равзана бо тарҷумаҳо бояд барои шумо пайдо шавад. - + (untitled) (беном) - + (picture) (тасвир) @@ -105,37 +105,37 @@ ArticleRequest - + Expand article Баркушодани мақола - + From Аз - + Collapse article Печондани мақола - + Query error: %1 Хатои дархост: %1 - + Close words: Калимаҳои наздик: - + Compound expressions: Ифодаҳои алоқадор: - + Individual words: Калимаҳои шахсӣ: @@ -148,82 +148,84 @@ Шакл - + about:blank - + x x - + Find: Ҷустуҷӯ: - + + &Previous &Пешина - + + &Next &Навбатӣ - + Ctrl+G Ctrl+G - + &Case Sensitive &Аломатҳои хурду калон - + Highlight &all Ҳамаашро ҷу&до кунед - + Resource Манбаъ - + Audio Аудио - + TTS Voice Овози TTS (Матн ба талаффуз) - + Picture Тасвир - + Video Видео - + Video: %1 Видео: %1 - + Definition from dictionary "%1": %2 Таъриф аз луғати "%1": %2 - + Definition: %1 Маъно: %1 @@ -232,38 +234,39 @@ Луғати GoldenDict - - + + The referenced resource doesn't exist. Манбаъи ишорашуда вуҷуд надорад. - + The referenced audio program doesn't exist. Барномаи аудиоии ишорашуда вуҷуд надорад. - + + ERROR: %1 ХАТОГӢ: %1 - + Save sound Захира кардани садо - + Sound files (*.wav *.ogg *.mp3 *.mp4 *.aac *.flac *.mid *.wv *.ape);;All files (*.*) Файлҳои садоӣ (*.wav *.ogg *.mp3 *.mp4 *.aac *.flac *.mid *.wv *.ape);;Ҳамаи файлҳо (*.*) - + Save image Захира кардани тасвир - + Image files (*.bmp *.jpg *.png *.tif);;All files (*.*) Файлҳои тасвирӣ (*.bmp *.jpg *.png *.tif);;Ҳамаи файлҳо (*.*) @@ -272,63 +275,63 @@ Хатои захиракунии манбаъ: - + &Open Link &Пайвандро кушодан - + Open Link in New &Tab Пайвандро дар &варақаи нав кушодан - + Open Link in &External Browser Пайвандро дар &браузер кушодан - + Save &image... Захира &кардани тасвир... - + Save s&ound... Захира &кардани садо... - + &Look up "%1" "%1"-ро &дарёфт кардан - + Look up "%1" in &New Tab "%1"-ро дар варақаи &нав дарёфт кардан - + Send "%1" to input line Фиристодани "%1" ба хати ворида - - + + &Add "%1" to history &Илова кардани "%1" ба таърих - + Look up "%1" in %2 "%1"-ро дар %2 дарёфт кардан - + Look up "%1" in %2 in &New Tab "%1"-ро дар %2 дар варақаи &нав дарёфт кардан - + WARNING: FFmpeg Audio Player: %1 ОГОҲӢ: Плеери аудиоии FFmpeg: %1 @@ -349,42 +352,42 @@ Китобхои басс ин садоро пахш карда наметавонад. - + Failed to run a player to play sound file: %1 Барои иҷрои файли аудиоӣ кушоиши плеер қатъ карда шуд: %1 - + Failed to create temporary file. Эҷодкунии файли муваққатӣ қатъ карда шуд. - + Failed to auto-open resource file, try opening manually: %1. Кушоиши файл ба таври худкор қатъ карда шуд, кӯшиш кунед, ки онро ба таври дастӣ кушоед: %1. - + WARNING: %1 ОГОҲӢ: %1 - + Select Current Article Интихоб кардани мақолаи ҷорӣ - + Copy as text Нусха бардоштан ҳамчун матн - + Inspect Тафтиш кардан - + The referenced resource failed to download. Боргирии манбаъи ишорашуда қатъ карда шуд. @@ -410,6 +413,29 @@ + Dialog + + + Proxy authentication required + Санҷиши ҳаққонияти прокси лозим аст + + + + You need to supply a Username and a Password to access via proxy + Барои пайдо кардани дастрасӣ тавассути прокси, шумо бояд номи корбар ва паролро ваорид кунед + + + + Username: + Номи корбар: + + + + Password: + Парол: + + + DictGroupWidget @@ -510,6 +536,119 @@ + DictHeadwords + + + Search mode + Ҳолати ҷустуҷӯ + + + + This element determines how filter string will be interpreted + Ин унсур муайян мекунад, ки чӣ тавр фитри сатр иҷро мешавад + + + + If checked on the symbols case will be take in account when filtering + Агар интихоб кунед, мавриди аломатҳо ҳангоми филтркунӣ ба ҳисоб гирифта мешавад + + + + Match case + Мавриди мутобиқат + + + + Exports headwords to file + Калимаҳои аввалинро ба файл содир мекунад + + + + Export + Содир кардан + + + + Help + + + + + OK + OK + + + + Press this button to apply filter to headwords list + Барои татбиқ кардани филтр ба рӯйхати калимаҳои аввалин, ин тугмаро зер кунед + + + + Apply + Татбиқ кардан + + + + If checked any filter changes will we immediately applied to headwords list + Агар интихоб кунед, тағйироти филтр ба рӯйхати калимаҳои аввалин дарҳол татбиқ карда мешавад + + + + Auto apply + Табиқи худкор + + + + Filter: + Филтр: + + + + Filter string (fixed string, wildcards or regular expression) + Филтркунии сатрҳо (сатрҳои устувор, ифодаҳои оддӣ ва аломатҳои махсус) + + + + Text + Матн + + + + Wildcards + Аломатҳои махсус + + + + RegExp + Ифодаи оддӣ + + + + Unique headwords total: %1, filtered: %2 + Ҳамагӣ калимаҳои аввалини беҳамто: %1, филтршуда: %2 + + + + Save headwords to file + Захира кардани калимаҳои аввалин ба файл + + + + Text files (*.txt);;All files (*.*) + Файлҳои матнӣ (*.txt);;Ҳамаи файлҳо (*.*) + + + + Export headwords... + Содир кардани калимаҳои аввлин... + + + + Cancel + Бекор кардан + + + DictInfo @@ -552,6 +691,16 @@ Тавсиф: + + Show all unique dictionary headwords + Намоиш додани ҳамаи калимаҳои аввалини беҳамтои луғат + + + + Headwords + Калимаҳои аввалин + + Edit the dictionary via command: %1 @@ -568,6 +717,74 @@ + DictServer + + + Url: + + + + + Databases: + + + + + Search strategies: + + + + + Server databases + + + + + DictServersModel + + + Enabled + Фаъолшуда + + + + Name + Ном + + + + Address + Суроға + + + + Databases + + + + + Strategies + + + + + Icon + + + + + Comma-delimited list of databases +(empty string or "*" matches all databases) + + + + + Comma-delimited list of search strategies +(empty string mean "prefix" strategy) + + + + DictionaryBar Dictionary Bar @@ -589,17 +806,22 @@ Гурӯҳи зеринро таҳрир кардан - + Dictionary info Иттилооти луғат - + + Dictionary headwords + Калимаҳои аввалини луғат + + + Open dictionary folder Кушодани ҷузвдони луғат - + Edit dictionary Таҳрир кардани луғат @@ -612,39 +834,39 @@ Луғатҳо - + &Sources &Сарчашмаҳо - - + + &Dictionaries &Луғатҳо - - + + &Groups &Гурӯҳҳо - + Sources changed Сарчашмаҳо тағйир дода шудаанд - + Some sources were changed. Would you like to accept the changes? Баъзе сарчашмаҳо тағйир дода шудаанд. Шумо мехоҳед ин тағйиротро қабул кунед? - + Accept Қабул кардан - + Cancel Бекор кардан @@ -658,6 +880,92 @@ + FTS::FtsIndexing + + + None + Ҳеҷ + + + + FTS::FullTextSearchDialog + + + Full-text search + Ҷустуҷӯ дар тамоми матн + + + + Whole words + Калимаҳои пурра + + + + Plain text + Матни оддӣ + + + + Wildcards + Аломатҳои махсус + + + + RegExp + Ифодаи оддӣ + + + + Max distance between words (%1-%2): + Масофаи ҳадди аксар байни калимаҳо (%1-%2): + + + + Max articles per dictionary (%1-%2): + Ҳадди аксари ифодаҳо дар ҳар як луғат (%1-%2): + + + + + + Articles found: + Мақолаҳои ёфтшуда: + + + + Now indexing: + Мураттабсозӣ: + + + + CJK symbols in search string are not compatible with search modes "Whole words" and "Plain text" + + + + + The search line must contains at least one word containing + Хати ҷустуҷӯ бояд ақаллан як калимаро бо + + + + or more symbols + ё якчанд аломатро дар бар гирад + + + + No dictionaries for full-text search + Ягон луғат барои ҷустуҷӯи матни пурра вуҷуд надорад + + + + FTS::Indexing + + + None + Ҳеҷ + + + Forvo::ForvoArticleRequest @@ -696,6 +1004,69 @@ + FullTextSearchDialog + + + + Search + Ҷустуҷӯ + + + + Match case + Мавриди мутобиқат + + + + Mode: + Ҳолат: + + + + Articles found: + Мақолаҳои ёфтшуда: + + + + Available dictionaries in group: + Луғатҳои дастрас дар гурӯҳ: + + + + Wait for indexing: + Дар ҳоли интизори мураттабсозӣ: + + + + Help + + + + Non-indexable: + Ғайри мураттаб: + + + + Total: + Ҳамагӣ: + + + + Indexed: + Мураттабшуда: + + + + Now indexing: None + Мураттабсозӣ: Ҳеҷ + + + + Cancel + Бекор кардан + + + GermanTranslit @@ -826,7 +1197,7 @@ - + Remove all groups Ҳамаи гурӯҳҳоро тоза кардан @@ -836,42 +1207,100 @@ Луғатҳоро аз гурӯҳҳо ва ба гурӯҳҳо кашида монед, онҳоро дар дохили гурӯҳҳо таҳвил диҳед ва тартиби гурӯҳҳоро тав&ассути муш иваз кунед. - + + Group tabs + Гурӯҳбандии варақаҳо + + + + Open groups list + Кушодани рӯйхати гурӯҳҳо + + + Add group Гурӯҳро илова кардан - + Give a name for the new group: Ба гурӯҳи нав ном гузоштан: - + Rename group Номи гурӯҳро иваз кардан - + Give a new name for the group: Ба гурӯҳ номи нав гузоштан: - + Remove group Гурӯҳро тоза кардан - + Are you sure you want to remove the group <b>%1</b>? Шумо мутмаин ҳастед, ки мехоҳед гурӯҳи <b>%1</b>-ро тоза кунед? - + Are you sure you want to remove all the groups? Шумо мутмаин ҳастед, ки мехоҳед ҳамаи гурӯҳҳоро тоза кунед? + Help::HelpWindow + + + GoldenDict help + + + + + Home + + + + + Back + Ба қафо + + + + Forward + Ба пеш + + + + Zoom In + Бузург кардан + + + + Zoom Out + Хурд кардан + + + + Normal Size + Андозаи муқаррарӣ + + + + Content + + + + + Index + + + + HistoryPaneWidget @@ -902,12 +1331,12 @@ Hunspell - + Spelling suggestions: Пешниҳоди санҷиши калима: - + %1 Morphology Морфологияи %1 @@ -915,12 +1344,12 @@ HunspellDictsModel - + Enabled Фаъолшуда - + Name Ном @@ -1960,7 +2389,7 @@ LoadDictionaries - + Error loading dictionaries Ҳангоми боркунии луғатҳо хатогӣ ба вуҷуд омад @@ -1968,7 +2397,7 @@ Main - + Error in configuration file. Continue with default settings? Хатогӣ дар файли танзимӣ. Бо танзимоти пешфарз давом медиҳед? @@ -1981,37 +2410,37 @@ - + Welcome! Хуш омадед! - + &File &Файл - + &Edit &Танзимот - + &Help &Кӯмак - + &View &Намоиш - + &Zoom &Танзими андозаи шрифт - + H&istory &Таърих @@ -2024,17 +2453,17 @@ Лавҳаи натиҷаҳои ҷустуҷӯ - + &Search Pane &Лавҳаи ҷустуҷӯ - + &Results Navigation Pane &Лавҳаи натиҷаҳои ҷустуҷӯ - + &History Pane &Лавҳаи таърих @@ -2043,149 +2472,179 @@ &Луғатҳо... F3 - + + Search + Ҷустуҷӯ + + + &Dictionaries... &Луғатҳо... - + F3 F3 - + &Preferences... &Хусусиятҳо... - + F4 F4 - + &Homepage &Вебсайти луғат - + &About &Дар бораи барнома - + About GoldenDict Дар бораи GoldenDict - + + GoldenDict reference + + + + F1 F1 - - + + &Quit &Баромад - + Quit from application Аз барнома баромадан - + Ctrl+Q Ctrl+Q - + &Forum &Форуми луғат - + &Close To Tray &Ба панҷараки огоҳиҳо печондан - + Minimizes the window to tray Равзанаро ба панҷараки огоҳиҳо мепечонад - + Ctrl+F4 Ctrl+F4 - + &Save Article &Мақоларо захира кардан - + Save Article Мақоларо захира кардан - + F2 F2 - + &Print &Чоп кардан - + Ctrl+P Ctrl+P - + Page Set&up &Танзими саҳифа - + Print Pre&view &Пешнамоиши чоп - + &Rescan Files &Файлҳоро аз нав коркард кардан - + &New Tab &Варақаи нав - + &Always on Top Ҳамеша дар &боло - + Always on Top Ҳамеша дар боло - + Ctrl+O Ctrl+O - - - + + + Menu Button Тугмаи меню + + Search in page + Ҷустуҷӯ дар саҳифа + + + + Ctrl+F + Ctrl+F + + + + Full-text search + Ҷустуҷӯ дар матни пурра + + + + Ctrl+Shift+F + Ctrl+Shift+F + + Print Preview Пешнамоиши чоп @@ -2194,48 +2653,48 @@ Файлҳоро аз нав коркард кардан - + Ctrl+F5 Ctrl+F5 - + &Clear &Пок кардан - + New Tab Варақаи нав - + Ctrl+T Ctrl+T - + &Configuration Folder &Ҷузвдони танзимот - - + + &Show &Намоиш додан - + Ctrl+H Ctrl+H - + &Export &Содир кардан - + &Import &Ворид кардан @@ -2248,18 +2707,18 @@ Дар наворҳои абзорҳо нишонаҳои хурдро намоиш додан - + &Menubar &Лавҳаи меню - - + + Look up in: Тарҷума дар: - + Found in Dictionaries: Натиҷа дар луғатҳои зерин дарёфт шуд: @@ -2268,127 +2727,127 @@ Лавҳаи идоракунӣ - + Show Names in Dictionary &Bar Номҳоро дар &лавҳаи луғат намоиш додан - + Show Small Icons in &Toolbars - + &Navigation &Лавҳаи идоракунӣ - + Back Ба қафо - + Forward Ба пеш - + Scan Popup Тарҷумаи пайдошаванда - + Pronounce Word (Alt+S) Калимаро талаффуз кардан (Alt+S) - + Zoom In Бузург кардан - + Zoom Out Хурд кардан - + Normal Size Андозаи муқаррарӣ - + Words Zoom In Калимаҳоро бузург кардан - + Words Zoom Out Калимаҳоро хурд кардан - + Words Normal Size Андозаи муқаррарӣ - + Show &Main Window &Равзанаи асосиро намоиш додан - + Opened tabs Варақаҳои кушодашуда - + Close current tab Варақаи ҷориро пӯшидан - + Close all tabs Ҳамаи варақаҳоро пӯшидан - + Close all tabs except current Ҳамаи варақаҳоро ба ғайр аз ҷорӣ пӯшидан - + Loading... Бор шуда истодааст... - + %1 dictionaries, %2 articles, %3 words %1 луғат, %2 мақола, %3 калима - + Look up: Тарҷума кардан: - + All Умумӣ - + Open Tabs List Рӯйхати варақаҳоро кушодан - + (untitled) (беном) - + %1 - %2 %1 - %2 @@ -2397,73 +2856,80 @@ ОГОҲӢ: %1 - + Failed to initialize hotkeys monitoring mechanism.<br>Make sure your XServer has RECORD extension turned on. Омодасозии механизми назорати тугмаҳои зеркор қатъ карда шуд.<br>Мутмаин шавед, ки имконоти RECORD дар XServer фаъол аст. - + New Release Available Версияи барномаи нав дастрас аст - + Version <b>%1</b> of GoldenDict is now available for download.<br>Click <b>Download</b> to get to the download page. Версияи навтарини луғати GoldenDict <b>%1</b> барои боргирӣ дастрас аст.<br>Барои кушодани саҳифаи боргирии барнома, тугмаи <b>Боргириро</b> зер кунед. - + Download Боргирӣ кунед - + Skip This Release Ин версияро нодида гузарондан - - + + Accessibility API is not enabled Қобилияти API фаъол нашудааст - + + String to search in dictionaries. The wildcards '*', '?' and sets of symbols '[...]' are allowed. +To find '*', '?', '[', ']' symbols use '\*', '\?', '\[', '\]' respectively + Сатрҳое, ки дар луғатҳо ҷустуҷӯ карда мешаванд. Аломатҳои махсус '*', '?' ма маҷмӯи аломатҳои '[...]' иҷозат дода намешаванд. +Барои ёфтани аломатҳои '*', '?', '[', ']', аз '\*', '\?', '\[', '\]' истифода баред + + + You have chosen to hide a menubar. Use %1 to show it back. Шумо пинҳон кардани лавҳаи менюро интихоб кардед. Барои аз нав намоиш додани лавҳаи меню, %1-ро истифода баред. - + Ctrl+M Ctrl+M - + Page Setup Танзими саҳифа - + No printer is available. Please install one first. Ягон принтер дастрас нест. Пеш аз ҳама шумо бояд принтерро танзим кунед. - + Print Article Мақоларо чоп кардан - + Article, Complete (*.html) Мақола, Пурра (*.html) - + Article, HTML Only (*.html) Мақола, танҳо HTML (*.html) - + Save Article As Мақоларо захира кардан ҳамчун @@ -2472,27 +2938,27 @@ Файлҳои html (*.html *.htm) - + Error Хато - + Can't save article: %1 Мақола захира нашуд: %1 - + Saving article... Захиракунии мақола... - + The main window is set to be always on top. Равзанаи асосӣ ҳамеша дар боло ҷойгир мешавад. - + &Hide &Пинҳон кардан @@ -2501,28 +2967,28 @@ Ҳолати намоиши таърих - + Export history to file Таърихро ба файл содир кардан - - + + Text files (*.txt);;All files (*.*) Файлҳои матнӣ (*.txt);;Ҳамаи файлҳо (*.*) - + History export complete Содиркунии таърих ба анҷом расид - + Export error: Хатои содиркунӣ: - + Import history from file Ворид кардани таърих аз файл @@ -2531,32 +2997,37 @@ Воридшуда аз файл: - + Import error: invalid data in file Хатои воридот: маълумоти беэътибор дар файл - + History import complete Воридоти таърих ба анҷом расид - + Import error: Хатои воридот: - + Dictionary info Иттилооти луғат - + + Dictionary headwords + Калимаҳои аввалини луғат + + + Open dictionary folder Кушодани ҷузвдони луғат - + Edit dictionary Таҳрир кардани луғат @@ -2564,12 +3035,12 @@ Mdx::MdxArticleRequest - + Dictionary file was tampered or corrupted Файли луғат тағйир ёфт ё вайрон шуд - + Failed loading article from %1, reason: %2 Боркунии мақола аз %1 қатъ шуд; сабаб: %2 @@ -2577,7 +3048,7 @@ MediaWiki::MediaWikiArticleRequest - + XML parse error: %1 at %2,%3 Хатои таҳлили XML: %1 дар %2,%3 @@ -2585,7 +3056,7 @@ MediaWiki::MediaWikiWordSearchRequest - + XML parse error: %1 at %2,%3 Хатои таҳлили XML: %1 дар %2,%3 @@ -2593,22 +3064,22 @@ MediaWikisModel - + Enabled Фаъолшуда - + Name Ном - + Address Суроға - + Icon Аломат @@ -2621,89 +3092,95 @@ Шакл - + Dictionary order: Тартиби луғатҳо: - - - - ... - ... + ... - + Inactive (disabled) dictionaries: Луғатҳои ғайрифаъол (хомӯшшуда): - + Dictionary information Маълумоти луғат - + Name: Ном: - + Total articles: Ҳамагӣ мақолаҳо: - + Total words: Ҳамагӣ калимаҳо: - + Translates from: Тарҷума аз забони: - + Translates to: Тарҷума ба забони: - + Description: Тавсиф: - + Files comprising this dictionary: Файлҳои луғат: - + Adjust the order by dragging and dropping items in it. Drop dictionaries to the inactive group to disable their use. Ба воситаи ҷойгузин кардани объектҳо тартибро танзим намоед. Барои хомӯш кардани луғатҳо, онҳоро ба гурӯҳи ғайрифаъол интиқол диҳед. Adjust the order by dragging and dropping items in it. Drop dictionaries to the inactive group to disable their use. - + Sort by name Мураттабсозӣ аз рӯи ном - + Sort by languages Мураттабсозӣ аз рӯи забон + + + Dictionary headwords + Калимаҳои аввалини луғат + + + + Dictionaries active: %1, inactive: %2 + + PathsModel - + Path Масир - + Recursive Фаъол/ғайрифаъол кардани луғат @@ -2862,22 +3339,27 @@ Сабки иловагӣ: - + + Help language + + + + Adjust this value to avoid huge context menus. Танзим кардани ин қимат барои рад кардани менюҳои марбути бузург. - + Context menu dictionaries limit: Ҳудуди луғатҳои менюи марбуд: - + &Scan Popup &Тарҷумаи пайдошаванда - + When enabled, a translation popup window would be shown each time you point your mouse on any word on the screen (Windows) or select any word with mouse (Linux). When enabled, you can switch it on and @@ -2888,136 +3370,136 @@ ё панели система хомӯш кунед ё аз нав фаъол созед. - + Enable scan popup functionality Хусусияти тарҷумаи пайдошавандаро фаъол кардан - + Chooses whether the scan popup mode is on by default or not. If checked, the program would always start with the scan popup active. Барои фаъол ё хомӯш кардани тарҷумаи пайдошаванда, имконоти зеринро истифода баред. Агар ин имконотро интихоб мекунед, тарҷумаи пайдошаванда ба худкор фаъол мешавад. - + Start with scan popup turned on Барномаро бо хусусияти тарҷумаи пайдошаванда оғоз кардан - + With this enabled, the popup would only show up if all chosen keys are in the pressed state when the word selection changes. Бо имконоти фаъолшудаи зерин, тарҷумаи пайдошаванда намоиш дода мешавад, агар ҳангоми интихоби калима ҳамаи тугмаҳои интихобшуда зер карда шаванд. - + Only show popup when all selected keys are kept pressed: Тарҷумаи пайдошаваандаро танҳо ҳангоми зеркунии тугмаҳои интихобшуда намоиш додан: - + Left Ctrl only Танҳо Ctrl-и чап - + Left Ctrl Ctrl-и чап - + Right Shift only Танҳо Shift-и рост - + Right Shift Shift-и рост - + Alt key Тугмаи Alt - + Alt Alt - + Ctrl key Тугмаи Ctrl - + Ctrl Ctrl - + Left Alt only Танҳо Alt-и чап - + Left Alt Alt-и чап - + Shift key Тугмаи Shift - + Shift Shift - + Right Alt only Танҳо Alt-и рост - + Right Alt Alt-и рост - + Right Ctrl only Танҳо Ctrl-и рост - + Right Ctrl Ctrl-и рост - + Left Shift only Танҳо Shift-и чап - + Left Shift Shift-и чап - + Windows key or Meta key Тугмаи Windows ё Meta - + Win/Meta Win/Meta - + Normally, in order to activate a popup you have to maintain the chosen keys pressed while you select a word. With this enabled, the chosen keys may also @@ -3028,12 +3510,12 @@ тугмаҳои интихобшударо баъд аз интихобкунии калима зер кунед. - + Keys may also be pressed afterwards, within Зеркунии тугмаҳои интихобшуда баъд аз - + To avoid false positives, the keys are only monitored after the selection's done for a limited amount of seconds, which is specified here. @@ -3046,42 +3528,42 @@ аз муддати таъйиншуда зер мекунед, тарҷума пайдо намешавад. - + secs сония - + Send translated word to main window instead of to show it in popup window Калимаи тарҷумашударо ба ҷои равзанаи пайдошаванда дар равзанаи асосӣ нишон диҳед - + Send translated word to main window Калимаи тарҷумашударо дар равзанаи нишон диҳед - + Hotkeys Тугмаҳои тезкор - + Use the following hotkey to show or hide the main window: Барои пинҳон ва намоиш додани равзанаи асосӣ тугмаҳои зеринро истифода баред: - + Use the following hotkey to translate a word from clipboard: Барои тарҷума кардани калимаҳо аз ҳофизаи система тугмаҳои зеринро истифода баред: - + The hotkeys are global and work from any program and within any context as long as GoldenDict is running in background. Тугмаҳои интихобшудаи тезкор ҳамаҷониба мебошанд, вале танҳо ҳангоми фаъол будани луғати GoldenDict бо ягон барнома ё матн кор мекунанд. - + <!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; } @@ -3094,52 +3576,87 @@ <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" color:#ff0000;">Дар хотир доред, ки: Шумо версияи барномаи X.Org XServer-ро истифода мебаред, ки дорои RECORD-и вайроншуда мебошад. Эҳтимол, тугмаҳои тезкор дар GoldenDict кор намекунанд. Ин мушкилӣ бояд дар худи сервер ҳал карда шавад. Гузоришро барои </span><a href="https://bugs.freedesktop.org/show_bug.cgi?id=20500"><span style=" text-decoration: underline; color:#0000ff;">ворид кардани маълумоти хато дар ин ҷо</span></a><span style=" color:#ff0000;"> пайдо кунед ва агар хоҳиш доред маслиҳати худро дар он ҷо пешниҳод кунед.</span></p></body></html> - + &Audio &Аудио - + Pronunciation Талаффуз - + Auto-pronounce words in main window Талаффузи худкори калимаҳо дар равзанаи асосӣ - + Auto-pronounce words in scan popup Талаффузи худкори калимаҳо дар тарҷумаи пайдошаванда - + Playback Иҷрои аудио - + Play audio files via FFmpeg(libav) and libao Пахш кардани файлҳои аудиоӣ тавассути FFmpeg(libav) ва libao - + Use internal player Истифодаи плеери дарунӣ - + + System proxy + Прокси система + + + + Custom proxy + Прокси фармоишӣ + + + + Custom settings + Танзимоти прокси + + + + Full-text search + Ҷустуҷӯи матни пурра + + + + Allow full-text search for: + Иҷозати матни пурра барои ҷустуҷӯ: + + + + Don't search in dictionaries containing more than + Ҷустуҷӯ накардан дар луғатҳо бо зиёда аз + + + + articles (0 - unlimited) + мақолаҳо (0 - номаҳдуд) + + + Select this option to automatic collapse big articles Интихоб кардани ин имконот барои печондани мақолаҳои калон ба таври худкор - + Collapse articles more than Печондани мақолаҳо зиёда аз - + Articles longer than this size will be collapsed Мақалаҳои зиёда аз ин андоза мухтасар мешаванд @@ -3148,7 +3665,7 @@ Мақолаҳое, ки зиёда аз ин андоза мебошанд, печонида мешаванд - + symbols аломат @@ -3183,59 +3700,59 @@ Ба воситаи Китобхонаи басс иҷро кунед - + Use any external program to play audio files Ягон барномаи беруниро барои иҷрои файлҳои аудиоӣ истифода баред - + Use external program: Ба воситаи барномаи дигар иҷро кунед: - + &Network &Шабака - + Enable if you wish to use a proxy server for all program's network requests. Агар шумо мехоҳед сервери proxy-ро барои ҳамаи дархостҳои шабака истифода баред шумо бояд ин имконотиро фаъол кунед. - + Use proxy server Сервери proxy-ро истифода баред - + Type: Намуд: - + Host: Мизбон: - + Port: Порт: - + User: Корбар: - + Password: Парол: - + Enabling this would make GoldenDict block most advertisements by disallowing content (images, frames) not originating from the site you are browsing. If some site breaks because of this, try disabling this. @@ -3245,12 +3762,12 @@ имконпазир нест, кӯшиш кунед, ки ин имконотро ғайрифаъол созед. - + Disallow loading content from other sites (hides most advertisements) Намоиши мӯҳтавои тиҷориро аз вебсайтҳои дигар қатъ кунед (рекламаро пинҳон мекунад) - + Enabling this would allow to listen to sound pronunciations from online dictionaries that rely on Flash or other web plugins. Plugin must be installed for this option to work. @@ -3259,24 +3776,24 @@ гӯш кунед. Барои ин имконот шумо бояд плагини мувофиқро сабт кунед. - + Enable web plugins Ҷузъи иловагии вебро фаъол кардан - + Some sites detect GoldenDict via HTTP headers and block the requests. Enable this option to workaround the problem. Баъзе вебсайтҳо барномаи GoldenDict-ро тавассути сарварақҳои HTTP муайян мекунанд ва дархостҳои барномаро манъ мекунанд. Барои ҳал кардани ин мушкилӣ, ин имконотро фаъол кунед. - + Do not identify GoldenDict in HTTP headers Пешгирии муайянкунии барномаи GoldenDict-ро дар сарварақҳои HTTP - + When this is enabled, the program periodically checks if a new, updated version of GoldenDict is available for download. If it is so, the program @@ -3288,22 +3805,22 @@ шуморо огоҳ мекунад ва кушодани сайти луғатро пешниҳод мекунад. - + Check for new program releases periodically Мавҷуд будани версияи навро такроран тафтиш кунед - + Ad&vanced &Иловагӣ - + ScanPopup extra technologies Технологияҳои тарҷумаи пайдошавандаи иловагӣ - + Try to use IAccessibleEx technology to retrieve word under cursor. This technology works only with some programs that support it (for example Internet Explorer 9). @@ -3313,12 +3830,12 @@ Агар шумо чунин барномаҳо истифода намебаред, имконоти зеринро истифода набаред. - + Use &IAccessibleEx &IAccessibleEx-ро истифода баред - + Try to use UI Automation technology to retrieve word under cursor. This technology works only with some programs that support it. It is not needed to select this option if you don't use such programs. @@ -3327,12 +3844,12 @@ Агар шумо чунин барномаҳо истифода намебаред, имконоти зеринро истифода набаред. - + Use &UIAutomation &UIAutomation-ро истифода баред - + Try to use special GoldenDict message to retrieve word under cursor. This technology works only with some programs that support it. It is not needed to select this option if you don't use such programs. @@ -3341,97 +3858,98 @@ Агар шумо чунин барномаҳо истифода намебаред, имконоти зеринро истифода набаред. - + Use &GoldenDict message &Дархости GoldenDict-ро истифода баред - + History Таърих - + Turn this option on to store history of the translated words Барои захира кардани таърихи калимаҳои тарҷумашуда ин имконотро фаъол созед - + Store &history Захира кардани &таърих - + Specify the maximum number of entries to keep in history. Муайян кардани ҳаҷми иттилооти захирашуда дар таърих. - + Maximum history size: Андозаи калонтарини таърих: - + History saving interval. If set to 0 history will be saved only during exit. Фосилаи вақти захиракунии таърих. Агар ба 0 танзим кунед, таърих танҳо дар хуруҷ захира мешавад. - + Save every Захира кардан баъд аз - + minutes дақиқа - + Articles Мақолаҳо - + Turn this option on to always expand optional parts of articles Барои густариш додани қисмҳои интихобии мақолаҳо ин имконотро фаъол созед - + Expand optional &parts Густариш додани &қисмҳои интихобӣ - + System default Системаи пешфарз - + + Default Пешфарз - + Modern Ҳозира - + Lingvo Луғати Lingvo - + Babylon Луғати Babylon - + Lingoes Lingoes - + Lingoes-Blue Lingoes-Blue @@ -3440,12 +3958,12 @@ Ба воситаи DirectShow иҷро кунед - + Changing Language Забонро иваз кунед - + Restart the program to apply the language change. Барои татбиқ кардани забони интихобшуда барномаро аз нав оғоз кунед. @@ -3453,27 +3971,27 @@ ProgramTypeEditor - + Audio Аудио - + Plain Text Матни оддӣ - + Html Html - + Prefix Match Аз рӯи префикс - + Unknown Номаълум @@ -3499,27 +4017,27 @@ ProgramsModel - + Enabled Фаъолшуда - + Type Намуд - + Name Ном - + Command Line Сатри иҷрои фармон - + Icon Аломат @@ -3527,12 +4045,14 @@ QObject - + + Article loading error Хатогии боркунии мақола - + + Article decoding error Хатогии рамзкушоии мақола @@ -3643,18 +4163,18 @@ ResourceToSaveHandler - - + + ERROR: %1 ХАТОГӢ: %1 - + Resource saving error: Хатои захиракунии манбаъ: - + The referenced resource failed to download. Боргирии манбаъи ишорашуда қатъ карда шуд. @@ -3662,12 +4182,12 @@ Romaji - + Hepburn Romaji for Hiragana Системаи Хэпбёрни Ромаҷӣ барои Хирагана - + Hepburn Romaji for Katakana Системаи Хэпбёрни Ромаҷӣ барои Катакана @@ -3696,21 +4216,21 @@ Рӯйхати мувофиқатҳо (Alt+M) - - - - - + + + + + ... ... - + Back Ба қафо - + Forward Ба пеш @@ -3719,32 +4239,32 @@ Alt+M - + Pronounce Word (Alt+S) Калимаро талаффуз кардан (Alt+S) - + Alt+S Alt+S - + Send word to main window (Alt+W) Калимаро ба равзанаи асосӣ гузоштан (Alt+W) - + Alt+W Alt+W - + Shows or hides the dictionary bar Лавҳаи луғатро пинҳон ё нишон медиҳад - + Use this to pin down the window so it would stay on screen, could be resized or managed in other ways. Барои мустаҳкам кардан равзана дар экран, иваз кардани ҳаҷм, @@ -3755,8 +4275,8 @@ Луғати GoldenDict - - + + %1 - %2 %1 - %2 @@ -3764,17 +4284,17 @@ SoundDirsModel - + Path Масир - + Name Ном - + Icon Аломат @@ -3796,7 +4316,8 @@ - + + &Add... &Илова кардан... @@ -3805,7 +4326,8 @@ - + + &Remove &Тоза кардан @@ -3884,7 +4406,7 @@ Шумо ҳамчунин метавонед сатри %GD1251%-ро барои рамзгузории CP1251 ва сатри %GDISO1%-ро барои рамзгузории ISO 8859-1 истифода баред. - + Programs Барномаҳо @@ -3893,27 +4415,27 @@ Тамоми барномаҳои берунӣ. Сатри %GDWORD% бо калимаи дархостшуда ҷойгузин карда мешавад. Худи калима низ ба сатри вуруди калимаҳо дохил карда мешавад. - + Forvo Forvo - + Live pronunciations from <a href="http://www.forvo.com/">forvo.com</a>. The site allows people to record and share word pronunciations. You can listen to them from GoldenDict. Талаффузи фаврӣ аз <a href="http://www.forvo.com/">forvo.com</a>. Вебсайти зерин ба одамон иҷозат медиҳад, ки онҳо тавонанд талаффузи калимаҳоро сабт ва бо дигарон мубодила намоянд. Шумо метавонед калимаҳои сабтшударо аз луғати GoldenDict гӯш кунед. - + Enable pronunciations from Forvo Талаффузро аз Forvo фаъол кардан - + API Key: Калиди API: - + Use of Forvo currently requires an API key. Leave this field blank to use the default key, which may become unavailable in the future, or register on the site to get your own key. @@ -3922,7 +4444,7 @@ оянда дастнорас шавад, ё ки барои дархости калиди шахсӣ дар сайт қайд шавед. - + Get your own key <a href="http://api.forvo.com/key/">here</a>, or leave blank to use the default one. Калиди шахсии худро аз <a href="http://api.forvo.com/key/">ин ҷо</a> гиред, ё барои истифодаи калиди пешфарз ин амалро нодида гузаронед. @@ -3952,79 +4474,89 @@ %GDBIG5% барои Big-5, %GDBIG5HKSCS% барои Big5-HKSCS, %GDGBK% барои GBK ва GB18030, %GDSHIFTJIS% барои Shift-JIS. + + DICT servers + + + + DICT servers: + + + + Any external programs. A string %GDWORD% will be replaced with the query word. If such string is not presented, the word will be fed into standard input. Ягон барномаи берунӣ. Сатри %GDWORD% бо калимаи дархостшуда ҷойгузин мешавад. Агар чунин сатр вуҷуд надошта бошад, калима ба вуруди стандартӣ равона мешавад. - + Language codes (comma-separated): Рамзҳои забон (бо вергул ҷудо мешаванд): - + List of language codes you would like to have. Example: "en, ru". Рӯйхати рамзҳои забоне, ки шумо мехоҳед дар бар гиред. Масалан: "en, tg". - + Full list of language codes is available <a href="http://www.forvo.com/languages-codes/">here</a>. Рӯйхати рамзҳои забонҳои пур дар <a href="http://www.forvo.com/languages-codes/">ин ҷо</a> дастрас аст. - + Transliteration Транслитератсия - + Russian transliteration Транслитератсияи русӣ - + Greek transliteration Транслитератсияи юнонӣ - + German transliteration Транслитератсияи олмонӣ - + Belarusian transliteration Транслитератсияи белорусӣ - + Enables to use the Latin alphabet to write the Japanese language Истифодаи алифбои лотиниро барои навиштан бо забони ҷопонӣ фаъол мекунад - + Japanese Romaji Ромаҷии ҷопонӣ - + Systems: Системаҳо: - + The most widely used method of transcription of Japanese, based on English phonology Машҳуртарин тарзи транскрипткунонии калимаҳои Ҷопонӣ дар асоси фонологияи Англисӣ иҷро мешавад - + Hepburn Хэпбёрн - + The most regular system, having a one-to-one relation to the kana writing systems. Standardized as ISO 3602 @@ -4035,12 +4567,12 @@ Системаи дар боло зикршуда ҳоло дар луғати GoldenDict вуҷуд надорад. - + Nihon-shiki Ниҳон-шикӣ - + Based on Nihon-shiki system, but modified for modern standard Japanese. Standardized as ISO 3602 @@ -4051,75 +4583,77 @@ Системаи дар боло зикршуда ҳоло дар луғати GoldenDict вуҷуд надорад. - + Kunrei-shiki Канрей-шикӣ - + Syllabaries: Алифбои ҳиҷо: - + Hiragana Japanese syllabary Алифбои ҳиҷои Хираганаи ҷопонӣ - + Hiragana Хирагана - + Katakana Japanese syllabary Алифбои ҳиҷои Катаканаи ҷопонӣ - + Katakana Катакана - + Text to Speech Матн ба талаффуз - + (not available in portable version) (дар версияи кӯчондашаванда дастрас нест) - - - + + + Choose a directory Ҷузвдонро интихоб кунед - - - - - + + + + + + Confirm removal Тозакуниро тасдиқ кунед - - + + Remove directory <b>%1</b> from the list? Ҷузвдони <b>%1</b>-ро аз рӯйхат тоза мекунед? - - + + + Remove site <b>%1</b> from the list? Вебсайти <b>%1</b>-ро аз рӯйхат тоза мекунед? - + Remove program <b>%1</b> from the list? Барномаи <b>%1</b>-ро аз рӯйхат тоза мекунед? @@ -4249,22 +4783,22 @@ WebSitesModel - + Enabled Фаъолшуда - + Name Ном - + Address Суроға - + Icon Аломат @@ -4272,7 +4806,7 @@ WordFinder - + Failed to query some dictionaries. Дархости баъзе луғатҳо қатъ карда шуд. diff -Nru goldendict-1.5.0~git20131003/locale/tk_TM.ts goldendict-1.5.0~git20150923/locale/tk_TM.ts --- goldendict-1.5.0~git20131003/locale/tk_TM.ts 2013-10-02 20:42:04.000000000 +0000 +++ goldendict-1.5.0~git20150923/locale/tk_TM.ts 2015-09-23 08:26:24.000000000 +0000 @@ -38,7 +38,7 @@ [Näbelli] - + Based on Qt %1 (%2, %3 bit) Esaslanýar Qt %1 (%2, %3 bit) @@ -46,17 +46,17 @@ ArticleMaker - + No translation for <b>%1</b> was found in group <b>%2</b>. <b>%1</b> üçin <b>%2</b> toparynda hiç terjime tapylmady. - + No translation was found in group <b>%1</b>. <b>%1</b> toparda hiç terjime tapylmady.. - + Welcome! Hoş geldiňiz! @@ -65,47 +65,47 @@ <h3 align="center">Hoş geldiňiz! <b>GoldenDict</b>!</h3><p>Programany ulanyp başlamak üçin, ilki bilent <b>Redaktrile|Dictionaries menýusyna baryň</b> we şol ýerden sözlük faýllaryň ýerleşýän bukjalaryny görkeziň, Wikipedia ýa-da başga çeşmeleri saýlaň, sözlükleriň görkeziş tertibini sazlaň ýa-da sözlükleriň toparyny dörediň.<p>Şondan soň sözleriň terjimesini gözlemäge başlap bolýar! Ony şu penjiräniň sag tarapynda ýerleşýän meýdançadan edip bolýar ýa-da <a href="Ýüzüne çykýan penjire (popup) bilen işlemek">göni başga programmalaryň içinden hem edip bolýar</a>. <p>Programmany sazlamak üçin, serediň <b>Redaktirle|Saýlamalar menýusyna</b>. Şol ýerde ýerleşen ähli sazlamalaryň gysga düşündirişi bar, bir zat düşünmeseňiz olary okamagy unutmaň.<p>Eger goşmaça soragyňyz bar bolsa,maslahat gerek bolsa, pikiriňizi paýlaşmak isleseňiz ýa-da beýleki ulanyjylaryň pikirlerini bilmek isleseňiz <a href="http://goldendict.org/forum/">foruma giriň</a>.<p>Programmanyň <a href="http://goldendict.org/">websaýtyndan</a> täzelikleri bilip bilersiňiz. <p>(c) 2008-2011 Konstantin Isakow. GPLv3 ýa-da soňky çykan lisenziýasy boýunça. - + Expand article Makalany giňelt - + Collapse article Makalany kiçelt - + <h3 align="center">Welcome to <b>GoldenDict</b>!</h3><p>To start working with the program, first visit <b>Edit|Dictionaries</b> to add some directory paths where to search for the dictionary files, set up various Wikipedia sites or other sources, adjust dictionary order or create dictionary groups.<p>And then you're ready to look up your words! You can do that in this window by using a pane to the left, or you can <a href="Working with popup">look up words from other active applications</a>. <p>To customize program, check out the available preferences at <b>Edit|Preferences</b>. All settings there have tooltips, be sure to read them if you are in doubt about anything.<p>Should you need further help, have any questions, suggestions or just wonder what the others think, you are welcome at the program's <a href="http://goldendict.org/forum/">forum</a>.<p>Check program's <a href="http://goldendict.org/">website</a> for the updates. <p>(c) 2008-2013 Konstantin Isakov. Licensed under GPLv3 or later. <h3 align="center">Hoş geldiňiz! <b>GoldenDict</b></h3><p>Programany ulanyp başlamak üçin, ilki bilen <b>Redaktrile|Dictionaries menýusyna baryň</b> we şol ýerden sözlük faýllaryň ýerleşýän bukjalaryny görkeziň, Wikipedia ýa-da başga çeşmeleri saýlaň, sözlükleriň görkeziş tertibini goýuň ýa-da sözlükleriň toparyny dörediň.<p>Şondan soň sözleriň terjimesini gözlemäge başlap bolýar! Ony şu penjiräniň sag tarapynda ýerleşýän meýdançasyndan edip bolýar ýa-da <a href="Ýüzüne çykýan penjire (popup) bilen işlemek">göni başga programmalaryň içinden hem edip bolýar</a>. <p>Programmany sazlamak üçin, serediň <b>Redaktirle|Saýlamalar menýusyna</b>. Şol ýerde ýerleşen ähli sazlamalaryň gysga düşündirişi bar, bir zat düşünmeseňiz olary okamagy unutmaň.<p>Eger goşmaça soragyňyz bar bolsa,maslahat gerek bolsa, pikiriňizi paýlaşmak isleseňiz ýa-da beýleki ulanyjylaryň pikirlerini bilmek isleseňiz <a href="http://goldendict.org/forum/">foruma giriň</a>.<p>Programmanyň <a href="http://goldendict.org/">websaýtyndan</a> täzelikleri bilip bilersiňiz. <p>(c) 2008-2013 Konstantin Isakow. GPLv3 ýa-da soňky çykan lisenziýasy boýunça. - + Working with popup Ýüzüne çykýan penjire (popup) bilen işlemek - + <h3 align="center">Working with the popup</h3>To look up words from other active applications, you would need to first activate the <i>"Scan popup functionality"</i> in <b>Preferences</b>, and then enable it at any time either by triggering the 'Popup' icon above, or by clicking the tray icon down below with your right mouse button and choosing so in the menu you've popped. <h3 align="center">Ýüze çykýan penjireler ( popup) bilen işlemegiň düzgünleri</h3>Başga programmalaryň içinden sözleri terjime etmek üçin, şuny açmak gerek: <i>"Skan popup"</i> in <b>Saýlamalar menýusynyň içinde ýerleşýär</b>, soň ony Popup nyşany açyp ýa-da aşakdaky panelden myşkanyň sag düwmesine basyp işe göýbermek bolýar. - + Then just stop the cursor over the word you want to look up in another application, and a window would pop up which would describe it to you. Ondan soň, başga programmanyň içinde kursory gyzyklanýan sözüň üstüne getiriň - ýüze çykan penjirede onuň düşündirilişi görkeziler. - + Then just select any word you want to look up in another application by your mouse (double-click it or swipe it with mouse with the button pressed), and a window would pop up which would describe the word to you. Ondan soň, başga programmanyň içinde gyzyklanýan sözüňiziň üstüne myşka bilen iki gezek basyň ýa-da bellik ediň,soň- ýüze çykan penjirede onuň düşündirilişi görkeziler. - + (untitled) (atsyz) - + (picture) (surat) @@ -113,37 +113,37 @@ ArticleRequest - + Expand article Makalany giňelt - + From Sözlük - + Collapse article Makalany kiçelt - + Query error: %1 Sorag ýalňyşlygy: %1 - + Close words: Ýakyn sözler: - + Compound expressions: Goşma aňlatmalar: - + Individual words: Aýry sözler: @@ -156,57 +156,59 @@ Forma - + about:blank barada: boş - + x x - + Find: Tap: - + + &Previous &Yza - + + &Next &Indiki - + Ctrl+G Ctrl+G - + &Case Sensitive &Uly-kiçi harplara duýgurlyk - + Highlight &all Belle&hemmesini - + Resource Çeşme - + Audio Audio - + Definition: %1 Kesgitleme: %1 @@ -215,139 +217,140 @@ GoldenDict - + Select Current Article Şu makalany saýla - + Copy as text Tekst görnüşinde kopiýa et - + Inspect Gözden geçir - + TTS Voice TTS sesi - + Picture Surat - + Video Wideo - + Video: %1 Wideo: %1 - + Definition from dictionary "%1": %2 Adalga şu sözlükden alyndy - "%1": %2 - - + + The referenced resource doesn't exist. Salgylanan çeşme ýok. - + The referenced audio program doesn't exist. Salgylanan audio programa ýok. - + + ERROR: %1 ÝALŇYŞLYK: %1 - + &Open Link &Linki aç - + Open Link in New &Tab Linki täze aç &Tab-dan - + Open Link in &External Browser Linki &Daşky Brauzerden aç - + Save &image... Surady &ýatda sakla - ... - + Save s&ound... Ýatda sakla s&esi - ... - + &Look up "%1" &Tap "%1" - + Look up "%1" in &New Tab Tap "%1" in &New Tab - + Send "%1" to input line Iber "%1" girizme setire - - + + &Add "%1" to history &Goş "%1" geçmişe - + Look up "%1" in %2 Tap "%1" in %2 - + Look up "%1" in %2 in &New Tab Tap "%1" in %2 in &New Tab - + Save sound Ýatda sakla sesini - + Sound files (*.wav *.ogg *.mp3 *.mp4 *.aac *.flac *.mid *.wv *.ape);;All files (*.*) Ses faýllary (*.wav *.ogg *.mp3 *.mp4 *.aac *.flac *.mid *.wv *.ape);;Ähli faýllar (*.*) - + Save image Surady ýatda sakla - + Image files (*.bmp *.jpg *.png *.tif);;All files (*.*) Surat faýllary (*.bmp *.jpg *.png *.tif);;All files (*.*) - + WARNING: FFmpeg Audio Player: %1 DUÝDURYŞ: FFmpeg Audio Player: %1 @@ -360,27 +363,27 @@ WAV-dan daşaryfaýllaryň oýnadylmagy üçin, Redaktirle|Saýlamalar baryň, Audio wkladkasyny saýlaň we şol ýerden DirectShow arkaly oýnatmagy saýlaň. - + Failed to run a player to play sound file: %1 Şu ses faýly açmak üçin gerek bolan pleýeri işledip bolmady: %1 - + Failed to create temporary file. Wagtlaýyn faýly döredip bolmady. - + Failed to auto-open resource file, try opening manually: %1. Çeşme faýly awtomat açyp bolmady, özbaşdak açmaga synanşyň: %1. - + WARNING: %1 ÄGÄ BOLUŇ %1 - + The referenced resource failed to download. Salgylanýan çeşmäni ýükläp almak bolmady. @@ -405,6 +408,29 @@ + Dialog + + + Proxy authentication required + + + + + You need to supply a Username and a Password to access via proxy + + + + + Username: + + + + + Password: + Parol: + + + DictGroupWidget @@ -505,6 +531,119 @@ + DictHeadwords + + + Search mode + + + + + This element determines how filter string will be interpreted + + + + + If checked on the symbols case will be take in account when filtering + + + + + Match case + + + + + Exports headwords to file + + + + + Export + + + + + Help + + + + + OK + + + + + Press this button to apply filter to headwords list + + + + + Apply + + + + + If checked any filter changes will we immediately applied to headwords list + + + + + Auto apply + + + + + Filter: + + + + + Filter string (fixed string, wildcards or regular expression) + + + + + Text + + + + + Wildcards + + + + + RegExp + + + + + Unique headwords total: %1, filtered: %2 + + + + + Save headwords to file + + + + + Text files (*.txt);;All files (*.*) + Tekst faýllary (*.txt);;Ähli faýllar (*.*) + + + + Export headwords... + + + + + Cancel + Yza Gaýtar + + + DictInfo @@ -547,6 +686,16 @@ Häsiýetnama: + + Show all unique dictionary headwords + + + + + Headwords + + + Edit the dictionary via command: %1 @@ -563,6 +712,74 @@ + DictServer + + + Url: + + + + + Databases: + + + + + Search strategies: + + + + + Server databases + + + + + DictServersModel + + + Enabled + Işledilen + + + + Name + Ady + + + + Address + Adres + + + + Databases + + + + + Strategies + + + + + Icon + Nyşan + + + + Comma-delimited list of databases +(empty string or "*" matches all databases) + + + + + Comma-delimited list of search strategies +(empty string mean "prefix" strategy) + + + + DictionaryBar Dictionary Bar @@ -584,17 +801,22 @@ Şu topary üýtget - + Dictionary info Sözlük barada maglumat - + + Dictionary headwords + + + + Open dictionary folder Sözlügiň bukjasyny aç - + Edit dictionary Sözlügi üýtget @@ -607,39 +829,39 @@ Sözlükler - + &Sources &Çeşmeler - - + + &Dictionaries &Sözlükler - - + + &Groups &Toparlar - + Sources changed Çeşmeler üýtgedildi - + Some sources were changed. Would you like to accept the changes? Käbir çeşmeler üýtgedildi. Üýtgeşmeleri kabul etmek isleýäňmi? - + Accept Kabul et - + Cancel Yza Gaýtar @@ -653,6 +875,92 @@ + FTS::FtsIndexing + + + None + Hiç birisi + + + + FTS::FullTextSearchDialog + + + Full-text search + + + + + Whole words + + + + + Plain text + + + + + Wildcards + + + + + RegExp + + + + + Max distance between words (%1-%2): + + + + + Max articles per dictionary (%1-%2): + + + + + + + Articles found: + + + + + Now indexing: + + + + + CJK symbols in search string are not compatible with search modes "Whole words" and "Plain text" + + + + + The search line must contains at least one word containing + + + + + or more symbols + + + + + No dictionaries for full-text search + + + + + FTS::Indexing + + + None + Hiç birisi + + + Forvo::ForvoArticleRequest @@ -691,6 +999,65 @@ + FullTextSearchDialog + + + + Search + + + + + Match case + + + + + Mode: + + + + + Articles found: + + + + + Available dictionaries in group: + + + + + Wait for indexing: + + + + + Total: + + + + + Indexed: + + + + + Now indexing: None + + + + + Cancel + Yza Gaýtar + + + + Help + + + + GermanTranslit @@ -821,7 +1188,7 @@ - + Remove all groups Ähli toparlary aýyr @@ -831,42 +1198,100 @@ Süýre&taşla sözlükleri toparyň içine ýa-da daşyna, myşkanyň kömegi bilen toparyň içinde ýerlerini ýa-da tertibini üýtget. - + + Group tabs + + + + + Open groups list + + + + Add group Topary goş - + Give a name for the new group: Täze topara at ber: - + Rename group Toparyň adyny üýtget - + Give a new name for the group: Topara täze adyny ber: - + Remove group Topary aýyr - + Are you sure you want to remove the group <b>%1</b>? <b>%1</b>? topary çyndan hem aýyrmak isleýäňmi? - + Are you sure you want to remove all the groups? Siz çyndanam ähli toparlary aýyrmak isleýärsiňizmi? + Help::HelpWindow + + + GoldenDict help + + + + + Home + + + + + Back + Yza gaýt + + + + Forward + + + + + Zoom In + Ulalt + + + + Zoom Out + Kiçelt + + + + Normal Size + Normal ululygy + + + + Content + + + + + Index + + + + HistoryPaneWidget @@ -897,12 +1322,12 @@ Hunspell - + Spelling suggestions: Dürs ýazuw kadalary hödürlemek: - + %1 Morphology %1 Morfologiýa @@ -910,12 +1335,12 @@ HunspellDictsModel - + Enabled Işledilen - + Name Ady @@ -1955,7 +2380,7 @@ LoadDictionaries - + Error loading dictionaries Sözlük ýüklenende ýalňyşlyk çykdy @@ -1963,7 +2388,7 @@ Main - + Error in configuration file. Continue with default settings? Konfigurasiýa faýlynda ýalňyşlyk bar. Başlangyç sazlamalar bilen dowam etjekmi? @@ -1976,37 +2401,37 @@ - + Welcome! Hoş geldiňiz! - + &File &Faýl - + &Edit &Redaktirle - + &Help &Kömek - + &View &Görnüş - + &Zoom &Ulalt - + H&istory &Geçmiş @@ -2023,185 +2448,215 @@ &Sözlükler... F3 - + + Search + + + + &Search Pane &Gözleg tagtasy - + &Results Navigation Pane &Nawigasiýa tagtasyndan netijeler - + &History Pane &Geçmiş tagtasy - + &Dictionaries... &Sözlükler... - + F3 F3 - + &Preferences... &Saýlamalar... - + F4 F4 - + &Homepage &Baş sahypa - + &About &Maglumat - + About GoldenDict GoldenDict barada - + + GoldenDict reference + + + + F1 F1 - - + + &Quit &Çyk - + Quit from application Programadan çyk - + Ctrl+Q Ctrl+Q - + &Forum &Forum - + &Close To Tray &Panel içine buk - + Minimizes the window to tray Penjireleri paneliň içinde gizlemek - + Ctrl+F4 Ctrl+F4 - + &Save Article &Makalany ýatda sakla - + Save Article Ýatda sakla - + F2 F2 - + &Print &Çap et - + Ctrl+P Ctrl+P - + Page Set&up Sahypany &sazla - + Print Pre&view Çap edilen &görnüşi - + &Rescan Files &Faýllary täzeden gözden geçirmek - + &New Tab &Täze wkladka - - + + &Show &Görkez - + Ctrl+H Ctrl+H - + &Export &Eksport - + &Import &Import - + &Always on Top &Mydama ýokarda - + Always on Top Mydama ýokarda - + Ctrl+O Ctrl+O - - - + + + Menu Button Menýu düwmesi + + Search in page + + + + + Ctrl+F + + + + + Full-text search + + + + + Ctrl+Shift+F + + + Print Preview Çap edilen görnüşi @@ -2210,27 +2665,27 @@ Faýllary täzeden skanerlemek - + Ctrl+F5 Ctrl+F5 - + &Clear &Arassala - + New Tab Täze wkladka - + Ctrl+T Ctrl+T - + &Configuration Folder &Konfigurasiýa bukjasy @@ -2243,18 +2698,18 @@ Gurallar zolagynda nyşanlary kiçi et - + &Menubar &Menýu zolagy - - + + Look up in: Tap şu ýerde: - + Found in Dictionaries: Sözlüklerden tapylan: @@ -2263,204 +2718,215 @@ Nawigasiýa - + Back Yza gaýt - + Forward Ugrukdyr - + Scan Popup Skan popup - + Pronounce Word (Alt+S) Sözi eşitdirmek (Alt+S) - + Zoom In Ulalt - + Zoom Out Kiçelt - + Normal Size Normal ululygy - + Words Zoom In Sözleri ulalt - + Words Zoom Out Sözleri kiçelt - + Words Normal Size Sözleriň normal ululygy - + Show &Main Window Görkez &Esasy penjiräni - + Close current tab Şu wagtky wkladkany ýap - + Close all tabs Ähli açyk wkladkalary ýap - + Close all tabs except current Şu wagtky açylandan daşary ähli başga wkladkalary ýap - + Loading... Ýüklenip alynýar... - - + + Accessibility API is not enabled API elýeterli edilmedik - + %1 dictionaries, %2 articles, %3 words %1 sözlükler, %2 makalalar, %3 sözler - + Look up: Tap: - + All Ählisi - + Saving article... Makala ýatda saklanýar... - + The main window is set to be always on top. Baş penjire mydama ýokarda durar ýaly edilen. - + &Hide &Gizle - + Export history to file Geçmişi faýl görnüşinde eksport et - - + + Text files (*.txt);;All files (*.*) Tekst faýllary (*.txt);;Ähli faýllar (*.*) - + History export complete Geşmiş eksport edildi - + Export error: Eksport ýalnyşlygy: - + Import history from file Faýldan geçmişi import et - + Import error: invalid data in file Import ýalňyşlygy: faýlda nädogry maglumatlar bar - + History import complete Geçmiş import edildi - + Import error: Import ýalňyşlygy: - + Dictionary info Sözlük barada maglumat - + + Dictionary headwords + + + + Open dictionary folder Sözlügiň bukjasyny aç - + Edit dictionary Sözlügi üýtget - + Opened tabs Açyk wkladkalar - + Show Names in Dictionary &Bar Sözlük &tagtasynda atlary görkez - + Show Small Icons in &Toolbars Kiçi nyşanlary görkez &gurallar-tagtasynda - + &Navigation &Nawigasiýa - + + String to search in dictionaries. The wildcards '*', '?' and sets of symbols '[...]' are allowed. +To find '*', '?', '[', ']' symbols use '\*', '\?', '\[', '\]' respectively + + + + Open Tabs List Açyk wkladkalaryň sanawy - + (untitled) (atsyz) - + %1 - %2 %1 - %2 @@ -2469,67 +2935,67 @@ ÄGÄ BOLUŇ %1 - + Failed to initialize hotkeys monitoring mechanism.<br>Make sure your XServer has RECORD extension turned on. Failed to initialize hotkeys monitoring mechanism.<br>Make sure your XServer has RECORD extension turned on. - + New Release Available Täze neşir elýeterli - + Version <b>%1</b> of GoldenDict is now available for download.<br>Click <b>Download</b> to get to the download page. Version <b>%1</b> of GoldenDict is now available for download.<br>Click <b>Download</b> to get to the download page. - + Download Ýükläp almak - + Skip This Release Şu neşiri böküp geç - + You have chosen to hide a menubar. Use %1 to show it back. Siz menýu zolagyny gizlemägi saýladyňyz. %1 ulanyp ýenede çykaryp görkez. - + Ctrl+M Ctrl+M - + Page Setup Sahypany sazlamak - + No printer is available. Please install one first. Printer ýok. Ilki bilen gurna ony. - + Print Article Makalany çap et - + Article, Complete (*.html) Makala, taýýar (*.html) - + Article, HTML Only (*.html) Makala, HTML diňe (*.html) - + Save Article As Makalany şular ýaly ýatda sakla @@ -2538,12 +3004,12 @@ Html faýllar (*.html *.htm) - + Error Ýalňyş - + Can't save article: %1 Makalany ýatda saklap bolmady %1 @@ -2551,12 +3017,12 @@ Mdx::MdxArticleRequest - + Dictionary file was tampered or corrupted Sözlük faýly bozuldy ýa-da zaýa boldy - + Failed loading article from %1, reason: %2 %1-den/dan makalany ýükläp bolmady, sebäbi: %2 @@ -2564,7 +3030,7 @@ MediaWiki::MediaWikiArticleRequest - + XML parse error: %1 at %2,%3 XML analizinde ýalňyşlyk: %1 at %2,%3 @@ -2572,7 +3038,7 @@ MediaWiki::MediaWikiWordSearchRequest - + XML parse error: %1 at %2,%3 XML analizinde ýalňyşlyk: %1 at %2,%3 @@ -2580,22 +3046,22 @@ MediaWikisModel - + Enabled Işledilen - + Name Ady - + Address Adres - + Icon Nyşan @@ -2608,88 +3074,94 @@ Forma - + Dictionary order: Sözlügiň tertibi: - - - - ... - ... + ... - + Inactive (disabled) dictionaries: Işjeň däl (öçürilen) sözlükler: - + Dictionary information Sözlük barada maglumat - + Name: Ady: - + Total articles: Jemi makala sany: - + Total words: Jemi söz sany: - + Translates from: Terjime edýär şu dilden: - + Translates to: Terjime edýär şu dile: - + Description: Häsiýetnama: - + Files comprising this dictionary: Şu sözlügiň düzümine girýän faýlllar: - + Adjust the order by dragging and dropping items in it. Drop dictionaries to the inactive group to disable their use. Içine zatlary süýräp we taşlap tertibini üýtgedip bolýar. Sözlükleri öçürmek üçin, olary aktiw däl toparyna taşlamaly. - + Sort by name Ady boýunça sortla - + Sort by languages Dili boýunça sorla + + + Dictionary headwords + + + + + Dictionaries active: %1, inactive: %2 + + PathsModel - + Path Ýol - + Recursive Rekursiw @@ -2848,22 +3320,27 @@ Ctrl-Tab arkaly wkladkalary MRU tertipde nawigasiýa edilýär - + + Help language + + + + Adjust this value to avoid huge context menus. Şu bahany sazlap juda uly kontekst menýularyň öňüni almak mümkin. - + Context menu dictionaries limit: Kontekst menýu sözlükleriň çägi: - + &Scan Popup &Skan popup - + When enabled, a translation popup window would be shown each time you point your mouse on any word on the screen (Windows) or select any word with mouse (Linux). When enabled, you can switch it on and @@ -2874,136 +3351,136 @@ off from main window or tray icon. - + Enable scan popup functionality Skan ýüze çykarmagyna rugsat ber - + Chooses whether the scan popup mode is on by default or not. If checked, the program would always start with the scan popup active. Chooses whether the scan popup mode is on by default or not. If checked, the program would always start with the scan popup active. - + Start with scan popup turned on Skan ýüze çykarmany işledip başlat - + With this enabled, the popup would only show up if all chosen keys are in the pressed state when the word selection changes. With this enabled, the popup would only show up if all chosen keys are in the pressed state when the word selection changes. - + Only show popup when all selected keys are kept pressed: Ýüze çykarmagy (popup) görkez diňe ähli saýlanan düwmler basylyp saklananda: - + Left Ctrl only Çep Ctrl diňe - + Left Ctrl Çep Ctrl - + Right Shift only Sag Shift diňe - + Right Shift Sag Shift - + Alt key Alt düwmesi - + Alt Alt - + Ctrl key Ctrl düwmesi - + Ctrl Ctrl - + Left Alt only Çep Alt diňe - + Left Alt Çep Alt - + Shift key Shift düwmesi - + Shift Shift - + Right Alt only Sag Alt diňe - + Right Alt Sag Alt - + Right Ctrl only Sag Alt diňe - + Right Ctrl Sag Alt - + Left Shift only Çep Shift diňe - + Left Shift Çep Shift - + Windows key or Meta key Windows düwme ýa-da Meta düwme - + Win/Meta Win/Meta - + Normally, in order to activate a popup you have to maintain the chosen keys pressed while you select a word. With this enabled, the chosen keys may also @@ -3014,12 +3491,12 @@ be pressed shortly after the selection is done. - + Keys may also be pressed afterwards, within Düwmeleri soň hem basmak bolýar, şu çäklerde - + To avoid false positives, the keys are only monitored after the selection's done for a limited amount of seconds, which is specified here. @@ -3028,42 +3505,42 @@ seconds, which is specified here. - + secs sekunt - + Send translated word to main window instead of to show it in popup window Terjime edilen sözleri ýüze çykýan penjireden görkezmän olary baş penjirä iber - + Send translated word to main window Terjime edilen sözleri baş penjirä iber - + Hotkeys Gyzgyn düwmeler - + Use the following hotkey to show or hide the main window: Baş penjiräni görkezmek ýa-da gizlemek üçin şeýle düwmeleri ulan: - + Use the following hotkey to translate a word from clipboard: Buferde saklanan sözi terjime etmek üçin şeýle düwmeleri ulan: - + The hotkeys are global and work from any program and within any context as long as GoldenDict is running in background. Bu gyzgyn düwmeler globaldyr we GoldenDict açyk duran wagty islendik başga programmada hem ýerlerde işleýärler. - + <!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; } @@ -3076,112 +3553,147 @@ <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" color:#ff0000;">Note: You appear to be running an X.Org XServer release which has the RECORD extension broken. Hotkeys in GoldenDict will probably not work. This must be fixed in the server itself. Please refer to the following </span><a href="https://bugs.freedesktop.org/show_bug.cgi?id=20500"><span style=" text-decoration: underline; color:#0000ff;">bug entry</span></a><span style=" color:#ff0000;"> and leave a comment there if you like.</span></p></body></html> - + &Audio &Audio - + Pronunciation Aýdyş - + Auto-pronounce words in main window Baş penjirede sözleriň awto-aýdylyşy - + Auto-pronounce words in scan popup Skan popup-dan sözleriň awto-aýdylyşy - + Playback Oýnatmak - + Play audio files via FFmpeg(libav) and libao Audio faýllary FFmpeg(libav) we libao arkaly oýnat - + Use internal player Içerki pleýeri ulan - + + System proxy + + + + + Custom proxy + + + + + Custom settings + + + + + Full-text search + + + + + Allow full-text search for: + + + + + Don't search in dictionaries containing more than + + + + + articles (0 - unlimited) + + + + History Geçmiş - + Turn this option on to store history of the translated words Şuny aç eger-de geçmişde terjime edilen sözleri ýatda saklajak bolsaň - + Store &history Saklanma &geçmiş - + Specify the maximum number of entries to keep in history. Geçmişde iň köp saklanjak girizmeleriň sany. - + Maximum history size: Geçmişiň maksimum sany: - + History saving interval. If set to 0 history will be saved only during exit. Geçmişi ýatda saklanmagyň döwri. Eger 0 goýulsa, geçmiş diňe çykan wagty ýatda saklanar. - + Save every Ýatda sakla her - + minutes minut - + Articles makalalar - + Turn this option on to always expand optional parts of articles Makalalaryň goşmaça ýerlerini giňeldip görkezmek üçin şuny saýlaň - + Expand optional &parts Goşmaça &ýerlerini giňeldip görkez - + Select this option to automatic collapse big articles Uly makalalaryň awtomat kiçi edilip görkezilmegi üçin şuny saýlaň - + Collapse articles more than Makalalary kiçelt şundan köp - - + Articles longer than this size will be collapsed Şundan uly bolan makalalar kiçi edilip görkeziljek - + symbols nyşanlar @@ -3206,59 +3718,59 @@ Phonon arkaly oýnatmak - + Use any external program to play audio files Audio faýllary oýnatmak üçin islendik özge programmany ulan - + Use external program: Daşky programmany ulan: - + &Network &Baglanyşyk ulgamy - + Enable if you wish to use a proxy server for all program's network requests. Enable if you wish to use a proxy server for all program's network requests. - + Use proxy server Proksi serweri ulan - + Type: Tip: - + Host: Öy eyesi: - + Port: Port: - + User: Ulanyjy: - + Password: Parol: - + Enabling this would make GoldenDict block most advertisements by disallowing content (images, frames) not originating from the site you are browsing. If some site breaks because of this, try disabling this. @@ -3267,12 +3779,12 @@ you are browsing. If some site breaks because of this, try disabling this. - + Disallow loading content from other sites (hides most advertisements) Özge saýtlardan zat ýüklemegi gadagan et (köp sanly reklama/mahabt gizlemgegini üpjün edýär) - + Enabling this would allow to listen to sound pronunciations from online dictionaries that rely on Flash or other web plugins. Plugin must be installed for this option to work. @@ -3281,24 +3793,24 @@ Plugin must be installed for this option to work. - + Enable web plugins Web plugin-leri işlet - + Some sites detect GoldenDict via HTTP headers and block the requests. Enable this option to workaround the problem. Käbir websaýtlar GoldenDict programmany HTTP ady arkaly görýärler we olara ýüz tutmaga rugsat berenoklar. Şeýle meseläni çözmek üçin, şuny işlediň. - + Do not identify GoldenDict in HTTP headers GoldenDict HTTP ady arkaly görkezme - + When this is enabled, the program periodically checks if a new, updated version of GoldenDict is available for download. If it is so, the program @@ -3311,22 +3823,22 @@ download page. - + Check for new program releases periodically Programmanyň täze neşirlerini wagtal-wagtal barlap dur - + Ad&vanced Has &çylşyrymly - + ScanPopup extra technologies SkanPopup goşmaça tehnologiýalary - + Try to use IAccessibleEx technology to retrieve word under cursor. This technology works only with some programs that support it (for example Internet Explorer 9). @@ -3337,12 +3849,12 @@ It is not needed to select this option if you don't use such programs. - + Use &IAccessibleEx Ulan &IAccessibleEx - + Try to use UI Automation technology to retrieve word under cursor. This technology works only with some programs that support it. It is not needed to select this option if you don't use such programs. @@ -3351,12 +3863,12 @@ It is not needed to select this option if you don't use such programs. - + Use &UIAutomation Ulan &UIAutomation - + Try to use special GoldenDict message to retrieve word under cursor. This technology works only with some programs that support it. It is not needed to select this option if you don't use such programs. @@ -3365,42 +3877,43 @@ It is not needed to select this option if you don't use such programs. - + Use &GoldenDict message Ulan &GoldenDict habarlary - + System default Sistemanyň başlangyç bahalary - + + Default Ilkibaşky ýagdaýy - + Modern Häzirki zaman - + Lingvo Lingvo - + Babylon Babylon - + Lingoes Lingoes - + Lingoes-Blue Lingoes-Blue @@ -3409,12 +3922,12 @@ DirectShow arkaly oýnatmak - + Changing Language Dili çalşmak - + Restart the program to apply the language change. Diliň çalşmagyny işe girizmek üçin programmany täzeden işlet. @@ -3422,27 +3935,27 @@ ProgramTypeEditor - + Audio Audio - + Plain Text Düz tekst - + Html Html - + Prefix Match Prefiks gabat getirme - + Unknown Näbelli @@ -3468,27 +3981,27 @@ ProgramsModel - + Enabled Işledilen - + Type Tip - + Name Ady - + Command Line Komanda setiri - + Icon Nyşan @@ -3496,12 +4009,14 @@ QObject - + + Article loading error Makala ýüklenende ýalňyşlyk ýüze çykdy - + + Article decoding error Makala dekodirlenen wagty ýalňyşlyk ýüze çykdy @@ -3612,18 +4127,18 @@ ResourceToSaveHandler - - + + ERROR: %1 ÝALŇYŞLYK: %1 - + Resource saving error: Çeşmäni ýatda saklamagyň ýalňyşlygy: - + The referenced resource failed to download. Salgylanýan çeşmäni ýükläp almak bolmady. @@ -3631,12 +4146,12 @@ Romaji - + Hepburn Romaji for Hiragana Hiragana üçin Hepburn Romaji - + Hepburn Romaji for Katakana Katakana üçin Hepburn Romaji @@ -3665,11 +4180,11 @@ Gabat gelýänleriň sanawy (Alt+M) - - - - - + + + + + ... ... @@ -3678,50 +4193,50 @@ Alt+M - + Back Yza gaýt - + Forward Öňe geç - + Pronounce Word (Alt+S) Sözi eşitdirmek (Alt+S) - + Alt+S Alt+S - + Send word to main window (Alt+W) Sözi baş penjirä iber (Alt+W) - + Alt+W Alt+W - + Shows or hides the dictionary bar Sözlük zolagy görkezýär ýa-da gizleýär - + Use this to pin down the window so it would stay on screen, could be resized or managed in other ways. Use this to pin down the window so it would stay on screen, could be resized or managed in other ways. - - + + %1 - %2 %1 - %2 @@ -3729,17 +4244,17 @@ SoundDirsModel - + Path Ýol - + Name Ady - + Icon Nyşan @@ -3761,7 +4276,8 @@ - + + &Add... &Goşmak... @@ -3770,7 +4286,8 @@ - + + &Remove &Aýyr @@ -3847,7 +4364,7 @@ Ýogsam, ulan %GD1251% (CP1251 üçin), %GDISO1% (ISO 8859-1 üçin). - + Programs Programmalar @@ -3856,27 +4373,27 @@ Any external programs. A string %GDWORD% will be replaced with the query word. The word will also be fed into standard input. - + Forvo Forvo - + Live pronunciations from <a href="http://www.forvo.com/">forvo.com</a>. The site allows people to record and share word pronunciations. You can listen to them from GoldenDict. Janly aýdylyşy şu ýerden alynýar - <a href="http://www.forvo.com/">forvo.com</a>. Bu websaýt adamlar üçin sözleriň aýdyşyny ýazga geçirmäge we paýlaşmaga mümkinçilik berýär. Olary GoldenDict arkaly diňläp bolýar. - + Enable pronunciations from Forvo Forvo-dan aýdyşyny aç - + API Key: API açary: - + Use of Forvo currently requires an API key. Leave this field blank to use the default key, which may become unavailable in the future, or register on the site to get your own key. @@ -3908,83 +4425,93 @@ %GDBIG5% - Big-5 üçin, %GDBIG5HKSCS% - Big5-HKSCS üçin, %GDGBK% - GBK and GB18030 üçin, %GDSHIFTJIS% - Shift-JIS üçin. + + DICT servers + + + + DICT servers: + + + + Any external programs. A string %GDWORD% will be replaced with the query word. If such string is not presented, the word will be fed into standard input. Islendik daşky programma. Setir %GDWORD% gözlenýän sözi bilen çalşyryljak. Eger şeýle setir berilmese, şol söz standart girizmä geçiriler. - + Get your own key <a href="http://api.forvo.com/key/">here</a>, or leave blank to use the default one. Öz açaryňy <a href="http://api.forvo.com/key/">şu ýerden al</a>, ýa-da, başdaky açary ulanmak üçin, boş goý. - + Language codes (comma-separated): Dil kodlary (otur bilen bölünen): - + List of language codes you would like to have. Example: "en, ru". Almak isleýän dil kodlarynyň sanawy: Mysal: "en, ru". - + Full list of language codes is available <a href="http://www.forvo.com/languages-codes/">here</a>. Dil kodlarynyň doly sanawy bar <a href="http://www.forvo.com/languages-codes/">here</a>. - + Transliteration Transliterasiýa - + Russian transliteration Rus transliterasiýa - + Greek transliteration Grek transliterasiýa - + German transliteration Nemes transliterasiýa - + Belarusian transliteration Belarus transliterasiýa - + Enables to use the Latin alphabet to write the Japanese language Ýapon dilinde ýazan mahalynda latin harplary ulanmaga rugsat berýär - + Japanese Romaji Ýapon romaji - + Systems: Sistemalar: - + The most widely used method of transcription of Japanese, based on English phonology Ýapon diliniň iňlis fonologiýasynda iň köp ulanylýan transkripsiýa usuly. - + Hepburn Hepburn - + The most regular system, having a one-to-one relation to the kana writing systems. Standardized as ISO 3602 @@ -3994,12 +4521,12 @@ Entek GoldenDict-de edilmedik. - + Nihon-shiki Nihon-shiki - + Based on Nihon-shiki system, but modified for modern standard Japanese. Standardized as ISO 3602 @@ -4010,75 +4537,77 @@ Entek GoldenDict-de edilmedik. - + Kunrei-shiki Kunrei-shiki - + Syllabaries: Bogunlaryň elipbiýi: - + Hiragana Japanese syllabary Hiragana ýapon bogunlaryň elipbiýi - + Hiragana Hiragana - + Katakana Japanese syllabary Katakana ýapon bogunlaryň elipbiýi - + Katakana Katakana - + Text to Speech Teksti gürläp aýtdyrmak - + (not available in portable version) (ykjam/portable wersiýada elýeterli däl) - - - + + + Choose a directory Bukjany saýla - - - - - + + + + + + Confirm removal Aýyrmagy tassykla - - + + Remove directory <b>%1</b> from the list? <b>%1</b> bukjasyny sanawdan aýyrmalymy? - - + + + Remove site <b>%1</b> from the list? <b>%1</b> saýty sanawdan aýyrmalymy? - + Remove program <b>%1</b> from the list? <b>%1</b> programmany sanawdan aýyrmalymy? @@ -4208,22 +4737,22 @@ WebSitesModel - + Enabled Işledilen - + Name Ady - + Address Adres - + Icon Nyşan @@ -4231,7 +4760,7 @@ WordFinder - + Failed to query some dictionaries. Käbir sözlükleri tapyp bolmady. diff -Nru goldendict-1.5.0~git20131003/locale/tr_TR.ts goldendict-1.5.0~git20150923/locale/tr_TR.ts --- goldendict-1.5.0~git20131003/locale/tr_TR.ts 2013-08-16 09:45:56.000000000 +0000 +++ goldendict-1.5.0~git20150923/locale/tr_TR.ts 2015-09-23 08:26:24.000000000 +0000 @@ -337,6 +337,25 @@ + Dialog + + Proxy authentication required + + + + You need to supply a Username and a Password to access via proxy + + + + Username: + + + + Password: + Parola: + + + DictGroupWidget Form @@ -415,6 +434,97 @@ + DictHeadwords + + Search mode + + + + This element determines how filter string will be interpreted + + + + If checked on the symbols case will be take in account when filtering + + + + Match case + + + + Exports headwords to file + + + + Export + + + + OK + + + + Press this button to apply filter to headwords list + + + + Apply + + + + If checked any filter changes will we immediately applied to headwords list + + + + Auto apply + + + + Filter: + + + + Filter string (fixed string, wildcards or regular expression) + + + + Text + + + + Wildcards + + + + RegExp + + + + Unique headwords total: %1, filtered: %2 + + + + Save headwords to file + + + + Text files (*.txt);;All files (*.*) + Metin Dosyaları (*.txt);;Tüm Dosyalar (*.*) + + + Export headwords... + + + + Cancel + İptal + + + Help + + + + DictInfo Total articles: @@ -453,6 +563,14 @@ %1 + + Show all unique dictionary headwords + + + + Headwords + + DictListModel @@ -462,6 +580,62 @@ + DictServer + + Url: + + + + Databases: + + + + Search strategies: + + + + Server databases + + + + + DictServersModel + + Enabled + Etkin + + + Name + İsim + + + Address + Adres + + + Databases + + + + Icon + + + + Comma-delimited list of databases +(empty string or "*" matches all databases) + + + + Strategies + + + + Comma-delimited list of search strategies +(empty string mean "prefix" strategy) + + + + DictionaryBar Edit this group @@ -491,6 +665,10 @@ Extended menu with all dictionaries... + + Dictionary headwords + + EditDictionaries @@ -535,6 +713,75 @@ + FTS::FtsIndexing + + None + Yok + + + + FTS::FullTextSearchDialog + + Full-text search + + + + Whole words + + + + Plain text + + + + Wildcards + + + + RegExp + + + + Max distance between words (%1-%2): + + + + Max articles per dictionary (%1-%2): + + + + Articles found: + + + + Now indexing: + + + + The search line must contains at least one word containing + + + + or more symbols + + + + No dictionaries for full-text search + + + + CJK symbols in search string are not compatible with search modes "Whole words" and "Plain text" + + + + + FTS::Indexing + + None + Yok + + + Forvo::ForvoArticleRequest by @@ -566,6 +813,53 @@ + FullTextSearchDialog + + Search + + + + Match case + + + + Mode: + + + + Articles found: + + + + Available dictionaries in group: + + + + Wait for indexing: + + + + Total: + + + + Indexed: + + + + Now indexing: None + + + + Cancel + İptal + + + Help + + + + GermanTranslit German Transliteration @@ -707,6 +1001,53 @@ Remove all dictionary groups Tüm sözlük gruplarını kaldır + + Group tabs + + + + Open groups list + + + + + Help::HelpWindow + + GoldenDict help + + + + Home + + + + Back + Önceki + + + Forward + Sonraki + + + Zoom In + Yaklaş + + + Zoom Out + Uzaklaş + + + Normal Size + Normal Boyut + + + Content + + + + Index + + HistoryPaneWidget @@ -2063,6 +2404,39 @@ Open dictionary folder + + Dictionary headwords + + + + String to search in dictionaries. The wildcards '*', '?' and sets of symbols '[...]' are allowed. +To find '*', '?', '[', ']' symbols use '\*', '\?', '\[', '\]' respectively + + + + Search + + + + Search in page + + + + Ctrl+F + + + + Full-text search + + + + Ctrl+Shift+F + + + + GoldenDict reference + + Mdx::MdxArticleRequest @@ -2112,7 +2486,7 @@ OrderAndProps ... - ... + ... Form @@ -2170,6 +2544,14 @@ Sort by languages + + Dictionary headwords + + + + Dictionaries active: %1, inactive: %2 + + PathsModel @@ -2782,6 +3164,38 @@ Articles longer than this size will be collapsed + + System proxy + + + + Custom proxy + + + + Custom settings + + + + Full-text search + + + + Allow full-text search for: + + + + Don't search in dictionaries containing more than + + + + articles (0 - unlimited) + + + + Help language + + ProgramTypeEditor @@ -3325,6 +3739,14 @@ Any external programs. A string %GDWORD% will be replaced with the query word. If such string is not presented, the word will be fed into standard input. + + DICT servers + + + + DICT servers: + + StylesComboBox diff -Nru goldendict-1.5.0~git20131003/locale/uk_UA.ts goldendict-1.5.0~git20150923/locale/uk_UA.ts --- goldendict-1.5.0~git20131003/locale/uk_UA.ts 2013-10-02 20:42:04.000000000 +0000 +++ goldendict-1.5.0~git20150923/locale/uk_UA.ts 2015-09-23 08:26:24.000000000 +0000 @@ -39,7 +39,7 @@ [Невідомий] - + Based on Qt %1 (%2, %3 bit) Основано наQt %1 (%2, %3 біт) @@ -47,62 +47,62 @@ ArticleMaker - + Expand article Розкрити статтю - + Collapse article Згорнути статтю - + No translation for <b>%1</b> was found in group <b>%2</b>. Нема перекладу для <b>%1</b> в групі <b>%2</b>. - + No translation was found in group <b>%1</b>. Нема перекладу в групі <b>%1</b>. - + Welcome! Ласкаво просимо! - + <h3 align="center">Welcome to <b>GoldenDict</b>!</h3><p>To start working with the program, first visit <b>Edit|Dictionaries</b> to add some directory paths where to search for the dictionary files, set up various Wikipedia sites or other sources, adjust dictionary order or create dictionary groups.<p>And then you're ready to look up your words! You can do that in this window by using a pane to the left, or you can <a href="Working with popup">look up words from other active applications</a>. <p>To customize program, check out the available preferences at <b>Edit|Preferences</b>. All settings there have tooltips, be sure to read them if you are in doubt about anything.<p>Should you need further help, have any questions, suggestions or just wonder what the others think, you are welcome at the program's <a href="http://goldendict.org/forum/">forum</a>.<p>Check program's <a href="http://goldendict.org/">website</a> for the updates. <p>(c) 2008-2013 Konstantin Isakov. Licensed under GPLv3 or later. <h3 align="center">Ласкаво просимо до <b>GoldenDict</b>!</h3><p>Щоб розпочати роботу з програмою, спочатку відвідайте <b>Зміни|Словники</b>, та додайте деякі шляхи до словників, де їх можна знайти, вкажіть варіанти сайтів Wikipedia або інших джерел, встановити порядок словників або згрупувати словники.<p>І тоді ви зможете шукати самі слова! Ви можете це здійснити в цьому вікні, використовуючи панель зліва, або можете через <a href="Контекстні вікна">шукати слова з інших запущених програм</a>. <p>Щоб налаштувати програму, перевірте доступність налаштувань в <b>Зміни|Налаштування</b>. Всі параметри мають підказки, переконайтесь, що прочитали їх, якщо в чомусь не впевнені.<p>Якщо потрібна допомога, маєте якісь запитання, поради або просто бажаєте поділитись враженнями, ми будемо раді кожному на <a href="http://goldendict.org/forum/">форумі</a> програми.<p>Відвідайте <a href="http://goldendict.org/">сайт</a> програми щодо оновлень. <p>© 2008–2013 Konstantin Isakov. Ліцензовано за GPLv3 або пізнішої версії. - + Working with popup Контекстні вікна - + <h3 align="center">Working with the popup</h3>To look up words from other active applications, you would need to first activate the <i>"Scan popup functionality"</i> in <b>Preferences</b>, and then enable it at any time either by triggering the 'Popup' icon above, or by clicking the tray icon down below with your right mouse button and choosing so in the menu you've popped. <h3 align="center">Контекстні вікна</h3>Для пошуку слів з інших запущених програм вам потрібно ввімкнути <i>«Контекстні вікна»</i> в меню <b>Налаштування</b> і потім може увімкнути його в будь-який момент натиснувши піктограму «Контекстне вікно» вище, або натиснувши піктограму в лотку нижче правим клацом мишки і вибравши його в контекстному меню. - + Then just stop the cursor over the word you want to look up in another application, and a window would pop up which would describe it to you. Потім наведіть курсор миші на слово, котре ви бажаєте перекласти, у сторонній програмі, тоді появиться контекстне вікно з потрібним описом слова. - + Then just select any word you want to look up in another application by your mouse (double-click it or swipe it with mouse with the button pressed), and a window would pop up which would describe the word to you. Тепер виберіть будь-яке слово,котре ви бажаєте перекласти, у сторонній програмі за допомогою мишки (подвійний клац або підвівши курсор при затиснутій лівій кнопці), тоді появиться контекстне вікно з потрібним описом слова. - + (untitled) (без назви) - + (picture) (зображення) @@ -110,37 +110,37 @@ ArticleRequest - + Expand article Розкрити статтю - + From Зі словника - + Collapse article Згорнути статтю - + Query error: %1 Помилка запиту: %1 - + Close words: Близькі за значенням: - + Compound expressions: Словосполучення: - + Individual words: Окремі слова: @@ -153,87 +153,89 @@ Форма - + about:blank about:blank - + x x - + Find: Знайти: - + + &Previous &Попереднє - + + &Next &Наступне - + Ctrl+G Ctrl+G - + &Case Sensitive &З урахуванням регістру - + Highlight &all Виділити &все - + Select Current Article Вибрати поточний об'єкт - + Copy as text Скопіювати як текст - + Inspect Дослідити - + Resource Ресурс - + Audio Аудіо - + TTS Voice Голос TTS - + Picture Зображення - + Definition from dictionary "%1": %2 Визначення зі словника "%1": %2 - + Definition: %1 Визначення: %1 @@ -242,99 +244,100 @@ GoldenDict - - + + The referenced resource doesn't exist. Вказаного ресурсу не існує. - + The referenced audio program doesn't exist. Вказана аудіо програма не існує. - + + ERROR: %1 Помилка:%1 - + Save sound Зберегти звук - + Sound files (*.wav *.ogg *.mp3 *.mp4 *.aac *.flac *.mid *.wv *.ape);;All files (*.*) Звукові файли(*.wav *.ogg *.mp3 *.mp4 *.aac *.flac *.mid *.wv *.ape);;Усі файли (*.*) - + Save image Зберегти малюнок - + Image files (*.bmp *.jpg *.png *.tif);;All files (*.*) Графічні файли (*.bmp *.jpg *.png *.tif);;Усі файли (*.*) - + &Open Link &Відкрити посилання - + Video Відеозапис - + Video: %1 Відеозапис: %1 - + Open Link in New &Tab Відкрити посилання в новій в&кладці - + Open Link in &External Browser Відкрити посилання у &зовнішньому переглядачі - + &Look up "%1" &Пошук «%1» - + Look up "%1" in &New Tab Пошук «%1» в &новій вкладці - + Send "%1" to input line Послати "%1" до стрічки введення - - + + &Add "%1" to history &Додати "%1" до історії - + Look up "%1" in %2 Пошук «%1» в %2 - + Look up "%1" in %2 in &New Tab Пошук «%1»в %2 в &новій вкладці - + WARNING: FFmpeg Audio Player: %1 Попередження: звуковий програвач FFmpeg: %1 @@ -355,37 +358,37 @@ Басова бібліотека не взмозі відтворити цей звук. - + Failed to run a player to play sound file: %1 Не вдалось запустити програвач для відтворення звукового файла: %1 - + Failed to create temporary file. Не вдалось створити тимчасовий файл. - + Failed to auto-open resource file, try opening manually: %1. Не вдалось відкрити файл ресурсу, спробуйте відкрити вручну: %1. - + The referenced resource failed to download. Не вдалось звантажити вказаний ресурс. - + Save &image... Зберегти &зображення… - + Save s&ound... Зберегти з&вук - + WARNING: %1 УВАГА: %1s @@ -411,6 +414,29 @@ + Dialog + + + Proxy authentication required + + + + + You need to supply a Username and a Password to access via proxy + + + + + Username: + + + + + Password: + Пароль: + + + DictGroupWidget @@ -511,6 +537,119 @@ + DictHeadwords + + + Search mode + + + + + This element determines how filter string will be interpreted + + + + + If checked on the symbols case will be take in account when filtering + + + + + Match case + + + + + Exports headwords to file + + + + + Export + + + + + Help + + + + + OK + + + + + Press this button to apply filter to headwords list + + + + + Apply + + + + + If checked any filter changes will we immediately applied to headwords list + + + + + Auto apply + + + + + Filter: + + + + + Filter string (fixed string, wildcards or regular expression) + + + + + Text + + + + + Wildcards + + + + + RegExp + + + + + Unique headwords total: %1, filtered: %2 + + + + + Save headwords to file + + + + + Text files (*.txt);;All files (*.*) + Текстові файли (*.txt);;Всі файли (*.*) + + + + Export headwords... + + + + + Cancel + Скасувати + + + DictInfo @@ -553,6 +692,16 @@ Опис: + + Show all unique dictionary headwords + + + + + Headwords + + + Edit the dictionary via command: %1 @@ -569,6 +718,74 @@ + DictServer + + + Url: + + + + + Databases: + + + + + Search strategies: + + + + + Server databases + + + + + DictServersModel + + + Enabled + Увімкнено + + + + Name + Назва + + + + Address + Адреса + + + + Databases + + + + + Strategies + + + + + Icon + + + + + Comma-delimited list of databases +(empty string or "*" matches all databases) + + + + + Comma-delimited list of search strategies +(empty string mean "prefix" strategy) + + + + DictionaryBar Dictionary Bar @@ -590,17 +807,22 @@ Редагувати цю групу - + Dictionary info Інфа словника - + + Dictionary headwords + + + + Open dictionary folder Відкрити словникову теку - + Edit dictionary Редагувати словник @@ -613,39 +835,39 @@ Словники - + &Sources &Джерела - - + + &Dictionaries &Словники - - + + &Groups &Групи - + Sources changed Джерела змінено - + Some sources were changed. Would you like to accept the changes? Деякі джерела змінено. Бажаєте прийняти ці зміни? - + Accept Прийняти - + Cancel Скасувати @@ -659,6 +881,92 @@ + FTS::FtsIndexing + + + None + + + + + FTS::FullTextSearchDialog + + + Full-text search + + + + + Whole words + + + + + Plain text + + + + + Wildcards + + + + + RegExp + + + + + Max distance between words (%1-%2): + + + + + Max articles per dictionary (%1-%2): + + + + + + + Articles found: + + + + + Now indexing: + + + + + CJK symbols in search string are not compatible with search modes "Whole words" and "Plain text" + + + + + The search line must contains at least one word containing + + + + + or more symbols + + + + + No dictionaries for full-text search + + + + + FTS::Indexing + + + None + + + + Forvo::ForvoArticleRequest @@ -697,6 +1005,65 @@ + FullTextSearchDialog + + + + Search + + + + + Match case + + + + + Mode: + + + + + Articles found: + + + + + Available dictionaries in group: + + + + + Wait for indexing: + + + + + Total: + + + + + Indexed: + + + + + Now indexing: None + + + + + Cancel + Скасувати + + + + Help + + + + GermanTranslit @@ -827,7 +1194,7 @@ - + Remove all groups Вилучити всі групи @@ -837,42 +1204,100 @@ Перено&сьте словники з/в групи, переміщайте їх усередині групи, впорядковуйте використовуючи мишку. - + + Group tabs + + + + + Open groups list + + + + Add group Додати групу - + Give a name for the new group: Надайте назву новій групі: - + Rename group Перейменуйте групу - + Give a new name for the group: Надайте нову назву групі: - + Remove group Вилучити групу - + Are you sure you want to remove the group <b>%1</b>? Бажаєте вилучити групу <b>%1</b>? - + Are you sure you want to remove all the groups? Бажаєте вилучити всі групи? + Help::HelpWindow + + + GoldenDict help + + + + + Home + + + + + Back + Назад + + + + Forward + Вперед + + + + Zoom In + Зблизити + + + + Zoom Out + Віддалити + + + + Normal Size + Нормальний розмір + + + + Content + + + + + Index + + + + HistoryPaneWidget @@ -903,12 +1328,12 @@ Hunspell - + Spelling suggestions: Орфографічні підказки: - + %1 Morphology Морфологія %1 @@ -916,12 +1341,12 @@ HunspellDictsModel - + Enabled Увімкнено - + Name Назва @@ -1962,7 +2387,7 @@ LoadDictionaries - + Error loading dictionaries Помилка завантаження словників @@ -1970,7 +2395,7 @@ Main - + Error in configuration file. Continue with default settings? Помилка в файлі налаштувань. Продовжити з типовими параметрами? @@ -1983,37 +2408,37 @@ - + Welcome! Ласкаво просимо! - + &File &Файл - + &Edit З&міни - + &Help &Довідка - + &View П&ерегляд - + &Zoom &Масштаб - + H&istory &Журнал @@ -2022,12 +2447,12 @@ Панель пошуку - + &Dictionaries... &Словники… - + F3 F3 @@ -2036,154 +2461,184 @@ &Групи… - + + Search + + + + &Search Pane &Лоток пошуку - + &Results Navigation Pane &Лоток результатів - + &History Pane &Лоток історії - + &Preferences... &Налаштування… - + F4 F4 - + &Homepage &Сторінка проекту - + &About П&ро програму - + About GoldenDict Про GoldenDict - + + GoldenDict reference + + + + F1 F1 - - + + &Quit &Вихід - + Quit from application Вийти з програми - + Ctrl+Q Ctrl+Q - + &Forum &Форум - + &Close To Tray &Сховати в лоток - + Minimizes the window to tray Сховати вікно в лоток - + Ctrl+F4 Ctrl+F4 - + &Save Article &Зберегти статтю - + Save Article Зберегти статтю - + F2 F2 - + &Print &Надрукувати - + Ctrl+P Ctrl+P - + Page Set&up &Параметри сторінки - + Print Pre&view Попередній перегляд дру&ку - + &Rescan Files &Повт. просканувати файли - + &New Tab &Нова вкладка - + &Always on Top &Завжди зверху - + Always on Top Завжди зверху - + Ctrl+O Ctrl+O - - - + + + Menu Button Кнопка меню + + Search in page + + + + + Ctrl+F + + + + + Full-text search + + + + + Ctrl+Shift+F + + + Print Preview Перегляд друку @@ -2192,48 +2647,48 @@ Переглянути файли - + Ctrl+F5 Ctrl+F5 - + &Clear &Очистити - + New Tab Нова вкладка - + Ctrl+T Ctrl+T - + &Configuration Folder &Тека конфігурації - - + + &Show &Показати - + Ctrl+H Ctrl+H - + &Export &Експортувати - + &Import &Імпортувати @@ -2242,18 +2697,18 @@ Показувати назви в панелі словника - + &Menubar &Лоток меню - - + + Look up in: Пошук в: - + Found in Dictionaries: Знайдено у словниках: @@ -2262,127 +2717,127 @@ Навігація - + Back Назад - + Forward Вперед - + Scan Popup Переглянути - + Pronounce Word (Alt+S) Вимовити слово (Alt+S) - + Zoom In Зблизити - + Zoom Out Віддалити - + Normal Size Нормальний розмір - + Words Zoom In Зблизити слова - + Words Zoom Out Віддалити слова - + Words Normal Size Звичайний розмір слів - + Show &Main Window Показати &головне вікно - + Close current tab Закрити поточну вкладку - + Close all tabs Закрити всі вкладки - + Close all tabs except current Закрити всі вкладки заодно з поточною - + Loading... Завантаження… - + %1 dictionaries, %2 articles, %3 words %1 словників, %2 статей, %3 слів - + Look up: Шукати: - + All Усьому - + Opened tabs Відкриті вкладки - + Show Names in Dictionary &Bar Відображувати назви у &Рядку словника - + Show Small Icons in &Toolbars Показувати малі налички у &тулбарі - + &Navigation &Навігація - + Open Tabs List Відчинити список вкладок - + (untitled) (без назви) - + %1 - %2 %1 - %2 @@ -2391,73 +2846,79 @@ Попередження: %1 - + Failed to initialize hotkeys monitoring mechanism.<br>Make sure your XServer has RECORD extension turned on. Не вдалось запустити механізм стеження за гарячими клавішами.<br>Переконайтесь, що ваш XServer має розширення RECORD увімкнутим. - + New Release Available Доступний новий випуск - + Version <b>%1</b> of GoldenDict is now available for download.<br>Click <b>Download</b> to get to the download page. Версія <b>%1</b> GoldenDict доступна до звантаження.<br>Натисніть <b>Звантажити</b>, щоб перейти до сторінки звантаження. - + Download Звантажити - + Skip This Release Пропустити цей випуск - - + + Accessibility API is not enabled API доступності не ввімкнено - + + String to search in dictionaries. The wildcards '*', '?' and sets of symbols '[...]' are allowed. +To find '*', '?', '[', ']' symbols use '\*', '\?', '\[', '\]' respectively + + + + You have chosen to hide a menubar. Use %1 to show it back. Ви вирішили сховати лоток меню. Викор. %1 аби показувати його знову. - + Ctrl+M Ctrl+M - + Page Setup Параметри сторінки - + No printer is available. Please install one first. Не знайдено жодного принтера. Будь ласка, спершу встановіть хоч якийсь. - + Print Article Надрукувати статтю - + Article, Complete (*.html) Стаття, Повна (*.html) - + Article, HTML Only (*.html) Стаття, тільки HTML (*.html) - + Save Article As Зберегти статтю як @@ -2466,83 +2927,88 @@ Файли HTML (*.html *.htm) - + Error Помилка - + Can't save article: %1 Неможливо зберегти статтю: %1 - + Saving article... Збередення статті… - + The main window is set to be always on top. Головне меню налаштовано аби завжди бути зверху. - + &Hide &Сховати - + Export history to file Експортувати файл історії - - + + Text files (*.txt);;All files (*.*) Текстові файли (*.txt);;Всі файли (*.*) - + History export complete Експорти історії завершено - + Export error: Помилка експортування: - + Import history from file Імпортувати історію з файлу - + Import error: invalid data in file Помилка імпорту: недійсна дата у файлі - + History import complete Імпорти історії завершено - + Import error: Помилка імпортування: - + Dictionary info Інфа про словник - + + Dictionary headwords + + + + Open dictionary folder Відкрити словникову теку - + Edit dictionary Редагувати словник @@ -2550,12 +3016,12 @@ Mdx::MdxArticleRequest - + Dictionary file was tampered or corrupted Словниковий файл пошкоджено - + Failed loading article from %1, reason: %2 Не вдалося завантажити статтю з%1, причина: %2 @@ -2563,7 +3029,7 @@ MediaWiki::MediaWikiArticleRequest - + XML parse error: %1 at %2,%3 Помилка аналізу XML: %1 в %2,%3 @@ -2571,7 +3037,7 @@ MediaWiki::MediaWikiWordSearchRequest - + XML parse error: %1 at %2,%3 Помилка аналізу XML: %1 в %2,%3 @@ -2579,22 +3045,22 @@ MediaWikisModel - + Enabled Увімкнено - + Name Назва - + Address Адреса - + Icon Наличка @@ -2607,88 +3073,94 @@ Форма - + Dictionary order: Порядок словників: - - - - ... - + - + Inactive (disabled) dictionaries: Вимкнені словники: - + Dictionary information Інформація про словник - + Name: Назва: - + Total articles: Статей загалом: - + Total words: Слів загалом: - + Translates from: Переклад з: - + Translates to: Переклад на: - + Description: Опис: - + Files comprising this dictionary: Файли, які охоплює словник: - + Adjust the order by dragging and dropping items in it. Drop dictionaries to the inactive group to disable their use. Впорядковуйте словники, переміщуючи пункти словників. Вимикайте словники, переносячи їх у відповідну групу. - + Sort by name Сортувати за іменем - + Sort by languages Сортувати за мовою + + + Dictionary headwords + + + + + Dictionaries active: %1, inactive: %2 + + PathsModel - + Path Шлях - + Recursive Рекурсивно @@ -2846,22 +3318,27 @@ Стиль додатку: - + + Help language + + + + Adjust this value to avoid huge context menus. Скоригуйте це значення, щоб уникнути величезних контекстних меню. - + Context menu dictionaries limit: Обмеження контекстного меню для словників: - + &Scan Popup &Контекстне вікно - + When enabled, a translation popup window would be shown each time you point your mouse on any word on the screen (Windows) or select any word with mouse (Linux). When enabled, you can switch it on and @@ -2872,136 +3349,136 @@ вимкнути/ввімкнути це з головного меню або піктограми лотку. - + Enable scan popup functionality Увімкнути контекстні вікна - + Chooses whether the scan popup mode is on by default or not. If checked, the program would always start with the scan popup active. Визначає, чи типово ввімкнуті контекстні вікна, чи ні. Якщо це відмічено, програма завжди запускатиметься з контекстними меню. - + Start with scan popup turned on Увімкнути контекстні меню при запуску - + With this enabled, the popup would only show up if all chosen keys are in the pressed state when the word selection changes. Коли це ввімкнено, контекстні вікна будуть появлятись лише при затисненні всіх вибраних клавіш з виділеним словом. - + Only show popup when all selected keys are kept pressed: Показувати контекстні вікна лише, коли затиснено всі ці вибрані клавіші: - + Left Ctrl only Лише лівий Ctrl - + Left Ctrl Лівий Ctrl - + Right Shift only Лише правий Shift - + Right Shift Правий Shift - + Alt key Будь-який Alt - + Alt Alt - + Ctrl key Будь-яка Ctrl - + Ctrl Ctrl - + Left Alt only Лише лівий Alt - + Left Alt Лівий Alt - + Shift key Будь-який Shift - + Shift Shift - + Right Alt only Лише правий Alt - + Right Alt Правий Alt - + Right Ctrl only Лише правий Ctrl - + Right Ctrl Правий Ctrl - + Left Shift only Лише лівий Shift - + Left Shift Лівий Shift - + Windows key or Meta key Будь-яка Windows або Meta - + Win/Meta Win/Meta - + Normally, in order to activate a popup you have to maintain the chosen keys pressed while you select a word. With this enabled, the chosen keys may also @@ -3012,12 +3489,12 @@ клавіші можуть бути затиснуті й опісля виділення. - + Keys may also be pressed afterwards, within Клавіші можна натиснути згодом - + To avoid false positives, the keys are only monitored after the selection's done for a limited amount of seconds, which is specified here. @@ -3026,42 +3503,42 @@ Значення в секундах вказується тут. - + secs секунд - + Send translated word to main window instead of to show it in popup window Послилати перекладене слово до головного вікна, замість того аби показувати його у виринаючому вікні - + Send translated word to main window Послилати перекладене слово до головного вікна - + Hotkeys Гарячі клавіші - + Use the following hotkey to show or hide the main window: Щоб показувати і ховати головне вікно, використовується така комбінація клавіш: - + Use the following hotkey to translate a word from clipboard: Щоб перекладати слово з кишені, використовується така комбінація клавіш: - + The hotkeys are global and work from any program and within any context as long as GoldenDict is running in background. Гарячі клавіші — загальні та працюють з будь-якої програми і з будь-яким текстом, поки GoldenDict працює фоново. - + <!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; } @@ -3074,57 +3551,92 @@ <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" color:#ff0000;">Майте на увазі: ви використовуєте випуск X.Org XServer, який не підтримує розширення RECORD. Гарячі клавіші в GoldenDict, імовірно, не працюватимуть. Це має бути виправлено сервером. Будь ласка, зверніться за </span><a href="https://bugs.freedesktop.org/show_bug.cgi?id=20500"><span style=" text-decoration: underline; color:#0000ff;">інформацію про ваду</span></a><span style=" color:#ff0000;"> та залиште коментарі, якщо бажаєте.</span></p></body></html> - + &Audio &Аудіо - + Pronunciation Вимова - + Auto-pronounce words in main window Автоматично вимовляти слово в головному меню - + Auto-pronounce words in scan popup Автоматично вимовляти слова в контекстному меню - + Playback Відтворення - + Play audio files via FFmpeg(libav) and libao Програвати аудіофайли через FFmpeg(libav) та libao - + Use internal player Використовувати внутрішній програвач - + + System proxy + + + + + Custom proxy + + + + + Custom settings + + + + + Full-text search + + + + + Allow full-text search for: + + + + + Don't search in dictionaries containing more than + + + + + articles (0 - unlimited) + + + + Select this option to automatic collapse big articles Виберіть це, щоб автоматично згортати великі статті - + Collapse articles more than Згортати статті з понад - + Articles longer than this size will be collapsed Статті довші за цей розмір буде згорнуто - + symbols символів @@ -3159,59 +3671,59 @@ Програти за допомогою Бас бібліотеки - + Use any external program to play audio files Використовувати якусь сторонню програму для відтворення звукових файлів - + Use external program: Використовувати сторонню програму: - + &Network &Мережа - + Enable if you wish to use a proxy server for all program's network requests. Увімкніть, якщо ви бажаєте використовувати проксі-сервер для всіх мережевих запитів. - + Use proxy server Використати проксі-сервер - + Type: Тип: - + Host: Вузол: - + Port: Порт: - + User: Користувач: - + Password: Пароль: - + Enabling this would make GoldenDict block most advertisements by disallowing content (images, frames) not originating from the site you are browsing. If some site breaks because of this, try disabling this. @@ -3220,12 +3732,12 @@ Якщо деякі сайти не працюють, вимкніть це. - + Disallow loading content from other sites (hides most advertisements) Заборонити завантажувати вміст з інших сайтів (ховає більшість реклами) - + Enabling this would allow to listen to sound pronunciations from online dictionaries that rely on Flash or other web plugins. Plugin must be installed for this option to work. @@ -3234,24 +3746,24 @@ Плагін мусить бути інстальованим аби ця опція працювала. - + Enable web plugins Увімкнути веб плагіни - + Some sites detect GoldenDict via HTTP headers and block the requests. Enable this option to workaround the problem. Деякі сайти виявлять GoldenDict через загловок HTTP і блокують запити. Щоб обійти цю проблему, ввімкніть цей параметр. - + Do not identify GoldenDict in HTTP headers Не отожнювати GoldenDict в заголовках HTTP - + When this is enabled, the program periodically checks if a new, updated version of GoldenDict is available for download. If it is so, the program @@ -3264,22 +3776,22 @@ відкрити сторінку звантаження. - + Check for new program releases periodically Періодично перевіряти на випуски нової версії - + Ad&vanced До&даткові - + ScanPopup extra technologies Нові технології ScanPopup - + Try to use IAccessibleEx technology to retrieve word under cursor. This technology works only with some programs that support it (for example Internet Explorer 9). @@ -3290,12 +3802,12 @@ Ви не мусите обирати цю опцію, якщо ви не користуєтесь такими програмами. - + Use &IAccessibleEx Використовувати &IAccessibleEx - + Try to use UI Automation technology to retrieve word under cursor. This technology works only with some programs that support it. It is not needed to select this option if you don't use such programs. @@ -3304,12 +3816,12 @@ Ви не мусите обирати цю опцію, якщо ви не користуєтесь такими програмами. - + Use &UIAutomation Використовувати &UIAutomation - + Try to use special GoldenDict message to retrieve word under cursor. This technology works only with some programs that support it. It is not needed to select this option if you don't use such programs. @@ -3318,97 +3830,98 @@ Ви не мусите обирати цю опцію, якщо ви не користуєтесь такими програмами. - + Use &GoldenDict message Використовувати &GoldenDict повідомлення - + History Історія - + Turn this option on to store history of the translated words Увімкніть цю опцію аби зберігати історію перекладених слів - + Store &history Зберегти &Історію - + Specify the maximum number of entries to keep in history. Зазначте максимальну кількість статей, що зберігають в історії. - + Maximum history size: Максимальний розмір історії: - + History saving interval. If set to 0 history will be saved only during exit. Проміжок збереження історії. Якщо вказати 0, то історія зберігатиметься тільки після виходу з програми. - + Save every Зберігати кожні - + minutes хвилин - + Articles Статей - + Turn this option on to always expand optional parts of articles Увімкніть цю опцію аби завжди додаткові частини статтей - + Expand optional &parts Показувати додаткові &частини - + System default Системна - + + Default Типово - + Modern Modern - + Lingvo Lingvo - + Babylon Babylon - + Lingoes Lingoes - + Lingoes-Blue Lingoes-Blue @@ -3417,12 +3930,12 @@ Програвати через DirectShow - + Changing Language Зміна мови - + Restart the program to apply the language change. Перезапустіть програму, щоб змінити мову. @@ -3430,27 +3943,27 @@ ProgramTypeEditor - + Audio Аудіо - + Plain Text Звичайний текст - + Html Html - + Prefix Match Співпадання префіксу - + Unknown Невідомий @@ -3476,27 +3989,27 @@ ProgramsModel - + Enabled Увімкнено - + Type Тип - + Name Назва - + Command Line Командний рядок - + Icon Наличка @@ -3504,12 +4017,14 @@ QObject - + + Article loading error Помилка завантаження статті - + + Article decoding error Помилка розкодування статті @@ -3620,18 +4135,18 @@ ResourceToSaveHandler - - + + ERROR: %1 Помилка: %1 - + Resource saving error: Помилка зберігання ресурсів: - + The referenced resource failed to download. Не вдалось звантажити поданий ресурс. @@ -3639,12 +4154,12 @@ Romaji - + Hepburn Romaji for Hiragana Система романізації Хепбьорна для хіраґани - + Hepburn Romaji for Katakana Система романізації Хепбьорна для катакани @@ -3673,21 +4188,21 @@ Перелік збігів (Alt+M) - - - - - + + + + + ... - + Back Назад - + Forward Вперед @@ -3696,32 +4211,32 @@ Alt+M - + Pronounce Word (Alt+S) Вимовити слово (Alt+S) - + Alt+S Alt+S - + Send word to main window (Alt+W) Послати слово до основного вікна (Alt+W) - + Alt+W Alt+W - + Shows or hides the dictionary bar Показує або ховає панель словника - + Use this to pin down the window so it would stay on screen, could be resized or managed in other ways. Використайте шпильку, щоб вікно залишалось на екрані, @@ -3732,8 +4247,8 @@ GoldenDict - - + + %1 - %2 %1 - %2 @@ -3741,17 +4256,17 @@ SoundDirsModel - + Path Шлях - + Name Назва - + Icon Піктограма @@ -3773,7 +4288,8 @@ - + + &Add... &Додати… @@ -3782,7 +4298,8 @@ - + + &Remove &Вилучити @@ -3860,7 +4377,7 @@ Також використовуйте %GD1251% для CP1251 та %GDISO1% для ISO 8859-1. - + Programs Програми @@ -3869,34 +4386,34 @@ Будь які зовнішні програми. %GWORD% рядок буде замінено запитуваним словом. Слово також буде поміщено до стандартного уведення. - + Forvo Forvo - + Live pronunciations from <a href="http://www.forvo.com/">forvo.com</a>. The site allows people to record and share word pronunciations. You can listen to them from GoldenDict. Жива вимова від <a href="http://www.forvo.com/">forvo.com</a>. Цей сайт дозволяє людям записувати і ділитись вимовою слів. Ви можете прослухати їх за допомогою GoldenDict. - + Enable pronunciations from Forvo Увімкнути вимову з Forvo - + API Key: Ключ API: - + Use of Forvo currently requires an API key. Leave this field blank to use the default key, which may become unavailable in the future, or register on the site to get your own key. Використання Forvo зараз вимагає ключ API. Залиште це поле порожнім, щоб використовувати типовий ключ, який може стати недоступний з часом, або зареєструйтесь на сайті, щоб одержати власний ключ. - + Get your own key <a href="http://api.forvo.com/key/">here</a>, or leave blank to use the default one. Дістаньте власний ключ <a href="http://api.forvo.com/key/">тут</a>, або залиште поле порожнім, щоб скористатись типовим. @@ -3926,79 +4443,89 @@ %GDBIG5% для Big-5, %GDBIG5HKSCS% для Big5-HKSCS, %GDGBK% для GBK та GB18030, %GDSHIFTJIS% для Shift-JIS. + + DICT servers + + + + DICT servers: + + + + Any external programs. A string %GDWORD% will be replaced with the query word. If such string is not presented, the word will be fed into standard input. Будь-яка стороння програма. Рядок %GDWORD% буде замінено на запитуване слово. Якщо такого рядка немає, слово буде підбиратись зі стандартного джерела. - + Language codes (comma-separated): Коди мов (виділяючи комою): - + List of language codes you would like to have. Example: "en, ru". Перелік кодів мов, які б ви воліли мати. Наприклад: "en, uk". - + Full list of language codes is available <a href="http://www.forvo.com/languages-codes/">here</a>. Повний перелік кодів мов <a href="http://www.forvo.com/languages-codes/">тут</a>. - + Transliteration Транслітерація - + Russian transliteration Російська транслітерація - + Greek transliteration Грецька транслітерація - + German transliteration Німецька транслітерація - + Belarusian transliteration Білоруська транслітерація - + Enables to use the Latin alphabet to write the Japanese language Вмикає латинську абетку для японського письма - + Japanese Romaji Японська романдзі - + Systems: Системи: - + The most widely used method of transcription of Japanese, based on English phonology Найпоширеніший спосіб транскрибування японської, яка ґрунтується на англійській фонології - + Hepburn Хепбьорн - + The most regular system, having a one-to-one relation to the kana writing systems. Standardized as ISO 3602 @@ -4009,12 +4536,12 @@ Поки що не підтримується в GoldenDict. - + Nihon-shiki Ніхон-сікі - + Based on Nihon-shiki system, but modified for modern standard Japanese. Standardized as ISO 3602 @@ -4025,75 +4552,77 @@ Ще не реалізовано в GoldenDict. - + Kunrei-shiki Кунрей-сікі - + Syllabaries: Складові азбуки: - + Hiragana Japanese syllabary Складова азбука японської хіраґани - + Hiragana Хіраґана - + Katakana Japanese syllabary Складова азбука японської катакани - + Katakana Катакана - + Text to Speech Текст для вимови - + (not available in portable version) (не доступно в портативній версії) - - - + + + Choose a directory Вибрати теку - - - - - + + + + + + Confirm removal Підтвердження вилучення - - + + Remove directory <b>%1</b> from the list? Вилучити теку <b>%1</b> з переліку? - - + + + Remove site <b>%1</b> from the list? Вилучити сайт <b>%1</b> з переліку? - + Remove program <b>%1</b> from the list? Вилучити програму <b>%1</b> зі списку? @@ -4223,22 +4752,22 @@ WebSitesModel - + Enabled Увімкнено - + Name Назва - + Address Адреса - + Icon Наличка @@ -4246,7 +4775,7 @@ WordFinder - + Failed to query some dictionaries. Не вдалось здійснити пошук по деяких словниках. diff -Nru goldendict-1.5.0~git20131003/locale/vi_VN.ts goldendict-1.5.0~git20150923/locale/vi_VN.ts --- goldendict-1.5.0~git20131003/locale/vi_VN.ts 2013-08-16 09:45:56.000000000 +0000 +++ goldendict-1.5.0~git20150923/locale/vi_VN.ts 2015-09-23 08:26:24.000000000 +0000 @@ -9,7 +9,7 @@ GoldenDict dictionary lookup program, version - Từ điển Vàng chương trình tra từ điển, phiên bản + Chương trình tra từ điển Từ điển Vàng, phiên bản #.# @@ -21,7 +21,7 @@ Credits: - + Công trạng: [Unknown] @@ -29,11 +29,11 @@ (c) 2008-2013 Konstantin Isakov (ikm@goldendict.org) - + Bản quyền 2008-2013 Konstantin Isakov (ikm@goldendict.org) Based on Qt %1 (%2, %3 bit) - + Dựa trên Qt %1 (%2, %3 bit) @@ -56,7 +56,7 @@ <h3 align="center">Working with the popup</h3>To look up words from other active applications, you would need to first activate the <i>"Scan popup functionality"</i> in <b>Preferences</b>, and then enable it at any time either by triggering the 'Popup' icon above, or by clicking the tray icon down below with your right mouse button and choosing so in the menu you've popped. - <h3 align="center">Làm việc với popup</h3>Để tra từ trong các ứng dụng đang hoạt động khác, trước tiên bạn cần kích hoạt <i>"Chức năng popup quét"</i> trong <b>Tùy thích</b>, sau đó bật lên bất cứ lúc nào bằng cách nhấn biểu tượng 'Popup' , hay kích chuột phải vào biểu tượng trên khay hệ thống và chọn trong thực đơn hiện lên. + <h3 align="center">Làm việc với popup</h3>Để tra từ trong các ứng dụng đang hoạt động khác, bạn cần kích hoạt <i>"Chức năng quét popup"</i> trong <b>Tùy thích</b>, sau đó bật lên bất cứ lúc nào bằng cách nhấn biểu tượng 'Popup' , hay kích chuột phải vào biểu tượng trên khay hệ thống và chọn trong trình đơn hiện lên. Then just stop the cursor over the word you want to look up in another application, and a window would pop up which would describe it to you. @@ -64,7 +64,7 @@ Then just select any word you want to look up in another application by your mouse (double-click it or swipe it with mouse with the button pressed), and a window would pop up which would describe the word to you. - Sau đó chỉ cần chọn từ bạn muốn tra trong ứng dụng khác bởi con chuột (nhấp đúp chuột lên từ hay bôi đen nó bằng cách nhấn giữ chuột), và một cửa sổ sẽ bật ra để dịch nghĩa cho bạn. + Sau đó chỉ cần dùng chuột chọn từ bạn muốn tra trong ứng dụng khác (nhấp đúp chuột lên từ hay nhấn giữ chuột bôi đen), và một cửa sổ sẽ bật ra để dịch nghĩa cho bạn. (untitled) @@ -72,19 +72,19 @@ <h3 align="center">Welcome to <b>GoldenDict</b>!</h3><p>To start working with the program, first visit <b>Edit|Dictionaries</b> to add some directory paths where to search for the dictionary files, set up various Wikipedia sites or other sources, adjust dictionary order or create dictionary groups.<p>And then you're ready to look up your words! You can do that in this window by using a pane to the left, or you can <a href="Working with popup">look up words from other active applications</a>. <p>To customize program, check out the available preferences at <b>Edit|Preferences</b>. All settings there have tooltips, be sure to read them if you are in doubt about anything.<p>Should you need further help, have any questions, suggestions or just wonder what the others think, you are welcome at the program's <a href="http://goldendict.org/forum/">forum</a>.<p>Check program's <a href="http://goldendict.org/">website</a> for the updates. <p>(c) 2008-2013 Konstantin Isakov. Licensed under GPLv3 or later. - <h3 align="center">Chào mừng đến với <b>GoldenDict</b>!</h3><p>Để bắt đầu làm việc với chương trình, trước tiên hãy ghé thăm <b>Biên tập|Từ điển</b> sau đó thêm một vài đường dẫn chứa từ điển để tìm kiếm các tập tin từ điển, cài đặt thêm các trang Wikipedia hay các nguồn khác, sắp xếp từ điển hay tạo các nhóm từ điển.<p>Và cuối cùng bạn đã sẵn sàng để tra từ rồi đấy! Bạn có thể tra trong cửa sổ này bằng cách sử dụng ô ở bên trái, hoặc bạn có thể <a href="Working with popup">tra từ trong các ứng dụng khác</a>. <p>Để tùy chỉnh chương trình, hãy thử các tùy chọn khác nhau ở <b>Biên tập|Tùy thích</b>. Tất cả các cài đặt đều có các mẹo hiện lên, hãy đọc chúng nếu bạn đang phân vân về một chức năng nào đó.<p>Nếu như bạn cần thêm giúp đỡ, có một vài câu hỏi, gợi ý hay chỉ là thắc mắc xem những người khác đang nghĩ gì, bạn đều được chào mừng đến với <a href="http://goldendict.berlios.de/forum/">forum</a> của chương trình.<p>Hãy kiểm tra <a href="http://goldendict.berlios.de/">website</a> của chương trình để cập nhật nếu muốn. <p>(c) 2008-2013 Konstantin Isakov. Cấp phép theo GPLv3 hoặc mới hơn. + <h3 align="center">Chào mừng đến với <b>Từ điển Vàng</b>!</h3><p>Để bắt đầu làm việc với chương trình, hãy mở <b>Biên tập|Từ điển</b> để thêm đường dẫn chứa các tệp từ điển, thiết lập các trang Wikipedia và các nguồn khác, sắp xếp hay tạo các nhóm từ điển.<p>Bạn đã sẵn sàng tra nghĩa của từ rồi đấy! Bạn có thể tra trong cửa sổ này bằng cách sử dụng ô bên trái, hoặc bạn có thể <a href="Working with popup">tra từ trong các ứng dụng khác</a>. <p>Để tùy chỉnh chương trình, hãy thử các tùy chọn khác nhau trong <b>Biên tập|Tùy thích</b>. Tất cả các cài đặt đều có các mẹo hiện lên, hãy đọc chúng nếu bạn đang phân vân về một chức năng nào đó.<p>Nếu như bạn cần thêm giúp đỡ, có một vài câu hỏi, gợi ý hay chỉ là thắc mắc xem những người khác đang nghĩ gì, bạn đều được chào mừng đến với <a href="http://goldendict.org/forum/">diễn đàn</a> của chương trình.<p>Hãy kiểm tra <a href="http://goldendict.org/">trang chủ</a> của chương trình để cập nhật nếu muốn. <p>(c) 2008-2013 Konstantin Isakov. Cấp phép theo GPLv3 hoặc mới hơn. (picture) - + (hình ảnh) Expand article - + Mở rộng bài viết Collapse article - + Thu gọn bài viết @@ -111,11 +111,11 @@ Expand article - + Mở rộng bài viết Collapse article - + Thu gọn bài viết @@ -126,11 +126,11 @@ about:blank - + about:blank x - + x Find: @@ -146,7 +146,7 @@ Ctrl+G - + Ctrl+G &Case Sensitive @@ -158,11 +158,11 @@ The referenced resource doesn't exist. - Nguồn đã tham chiếu không tồn tại. + Nguồn tham chiếu không tồn tại. &Open Link - Mở &liên kết + Mở &Liên kết Open Link in New &Tab @@ -170,7 +170,7 @@ Open Link in &External Browser - Mở liên kết trong &Trình duyệt ngoài + Mở liên kết trong &Trình duyệt &Look up "%1" @@ -190,139 +190,158 @@ Failed to run a player to play sound file: %1 - Chạy một trình chơi nhạc để chơi tập tin âm thanh: %1 thất bại + Lỗi chạy trình chơi nhạc khi chơi tệp âm thanh: %1 Failed to create temporary file. - Tạo tập tin tạm thất bại. + Lỗi tạo tệp tạm. Failed to auto-open resource file, try opening manually: %1. - Tự động mở tập tin nguồn thất bại, thử mở thủ công: %1. + Lỗi tự động mở tệp nguồn, thử mở thủ công: %1. The referenced resource failed to download. - Tải xuống nguồn được tham chiếu thất bại. + Nguồn tham chiếu lỗi tải xuống. Playing a non-WAV file - Chơi một tập tin không phải WAV + Chơi một tệp không phải WAV To enable playback of files different than WAV, please go to Edit|Preferences, choose the Audio tab and select "Play via DirectShow" there. - Để bật khả năng chơi các tập tin không phải WAV, hãy vào Biên tập|Tùy thích, mở thẻ Âm thanh và chọn "Chơi qua DirectShow" ở đó. + Để bật khả năng chơi các tệp không phải WAV, hãy vào Biên tập|Tùy thích, mở thẻ Âm thanh và chọn "Chơi qua DirectShow" ở đó. Highlight &all - + Tô &sáng từ cần tìm Resource - + Nguồn Audio - + Âm thanh Definition: %1 - + Định nghĩa: %1 The referenced audio program doesn't exist. - + Chương trình âm thanh tham chiếu không có. WARNING: %1 - CẢNH BÁO: %1 + CẢNH BÁO: %1 &Add "%1" to history - + &Thêm "%1" vào lược sử Definition from dictionary "%1": %2 - + Định nghĩa trong từ điển "%1": %2 Send "%1" to input line - + Gửi "%1" đến dòng đầu vào Picture - + Hình ảnh Select Current Article - + Chọn bài viết hiện tại ERROR: %1 - + LỖI: %1 Save sound - + Lưu âm thanh Sound files (*.wav *.ogg *.mp3 *.mp4 *.aac *.flac *.mid *.wv *.ape);;All files (*.*) - + Các tệp âm thanh (*.wav *.ogg *.mp3 *.mp4 *.aac *.flac *.mid *.wv *.ape);;Tất cả tệp (*.*) Save image - + Lưu hình ảnh Image files (*.bmp *.jpg *.png *.tif);;All files (*.*) - + Các tệp hình ảnh (*.bmp *.jpg *.png *.tif);;Tất cả tệp (*.*) Save &image... - + Lưu &hình ảnh... Save s&ound... - + Lưu â&m thanh... TTS Voice - + Giọng nói TTS WARNING: FFmpeg Audio Player: %1 - + CẢNH BÁO: Trình chơi âm thanh FFmpeg: %1 Copy as text - + Chỉ sao chữ Inspect - + Inspect Video - + Video Video: %1 - + Video: %1 BelarusianTranslit Belarusian transliteration from latin to cyrillic (classic orthography) - + Chuyển tự sang chữ Belarus từ ký tự Latin sang ký tự Kirin (kiểu chính tả cổ điển) Belarusian transliteration from latin to cyrillic (school orthography) - + Chuyển tự sang chữ Belarus từ ký tự Latin sang ký tự Kirin (kiểu chính tả chính thức) Belarusian transliteration (smoothes out the difference between classic and school orthography in cyrillic) - + Chuyển tự sang chữ Belarus (pha trộn giữa kiểu chính tả cổ điển và chính thức trong ký tự Kirin) + + + + Dialog + + Proxy authentication required + Yêu cầu xác thực proxy + + + You need to supply a Username and a Password to access via proxy + Cung cấp Tài khoản và Mật khẩu truy cập proxy + + + Username: + Tài khoản: + + + Password: + Mật khẩu: @@ -345,11 +364,11 @@ From file... - Từ tập tin... + Từ tệp... Choose a file to use as group icon - Chọn tập tin để sử dụng làm biểu tượng nhóm + Chọn tệp để sử dụng làm biểu tượng nhóm Images @@ -357,7 +376,7 @@ All files - Tất cả tập tin + Tất cả tệp Error @@ -365,7 +384,7 @@ Can't read the specified image file. - Không thể đọc tập tin ảnh được chỉ định. + Không thể đọc tệp ảnh được chỉ định. @@ -376,71 +395,172 @@ Are you sure you want to generate a set of groups based on language pairs? - Bạn có chắc chắn muốn tạo một bộ các nhóm dựa trên các cặp ngôn ngữ? + Bạn có muốn tạo một bộ các nhóm dựa trên các cặp ngôn ngữ? Dictionaries: - + Từ điển: Combine groups by source language to "%1->" - + Kết hợp nhóm theo ngôn ngữ nguồn "%1->" Combine groups by target language to "->%1" - + Kết hợp nhóm theo ngôn ngữ đích "->%1" Make two-side translate group "%1-%2-%1" - + Tạo nhóm dịch song ngữ "%1-%2-%1" Combine groups with "%1" - + Kết hợp nhóm với "%1" Unassigned - + Không xác định + + + + DictHeadwords + + Search mode + Kiểu tìm kiếm + + + This element determines how filter string will be interpreted + Xác định cách thức chuỗi bộ lọc sẽ được thể hiện + + + If checked on the symbols case will be take in account when filtering + Phân biệt hoa thường khi lọc + + + Match case + Khớp hoa thường + + + Exports headwords to file + Trích xuất danh sách từ ra tệp + + + Export + Trích xuất + + + OK + OK + + + Press this button to apply filter to headwords list + Áp dụng kiểu lọc danh sách từ + + + Apply + Áp dụng + + + If checked any filter changes will we immediately applied to headwords list + Bộ lọc sẽ được áp dụng ngay vào danh sách từ + + + Auto apply + Tự động áp dụng + + + Filter: + Bộ lọc: + + + Filter string (fixed string, wildcards or regular expression) + wildcard hoặc regular expression + Chuỗi bộ lọc (chuỗi cố định, ký tự đại diện hoặc biểu thức chính quy) + + + Text + Chữ + + + Wildcards + Wildcard + + + RegExp + RegExp + + + Unique headwords total: %1, filtered: %2 + Tổng danh sách từ: %1, đã lọc: %2 + + + Save headwords to file + Lưu danh sách từ vào tệp + + + Text files (*.txt);;All files (*.*) + Các tệp văn bản (*.txt);;Tất cả tệp (*.*) + + + Export headwords... + Trích xuất danh sách từ... + + + Cancel + Hủy bỏ + + + Help + Trợ giúp DictInfo Total articles: - Tổng số bài viết: + Tổng số bài viết: Translates from: - Dịch từ: + Dịch từ: Total words: - Tổng số từ: + Tổng số từ: Translates to: - Dịch sang: + Dịch sang: Files comprising this dictionary: - Tập tin chứa từ điển này: + Tệp chứa từ điển này: Description: - + Mô tả: Open folder - + Mở thư mục Edit dictionary - + Chỉnh sửa từ điển Edit the dictionary via command: %1 - + Chỉnh sửa từ điển với lệnh: +%1 + + + Show all unique dictionary headwords + Hiện tất cả danh sách từ của từ điển + + + Headwords + Danh sách từ @@ -451,6 +571,65 @@ + DictServer + + Url: + Địa chỉ: + + + Databases: + Cơ sở dữ liệu: + + + Search strategies: + Cách tìm kiếm: + + + Server databases + Máy chủ cơ sở dữ liệu + + + + DictServersModel + + Enabled + Bật + + + Name + Tên + + + Address + Địa chỉ + + + Databases + Cơ sở dữ liệu + + + Icon + Biểu tượng + + + Comma-delimited list of databases +(empty string or "*" matches all databases) + Ngăn cách cơ sở dữ liệu bằng dấu phẩy +(để trống hoặc "*" khớp mọi cơ sở dữ liệu) + + + Strategies + Cách thức + + + Comma-delimited list of search strategies +(empty string mean "prefix" strategy) + prefix + Ngăn cách các cách thức tìm kiếm bằng dấu phẩy +(để trống nghĩa là tìm theo "tiền tố") + + + DictionaryBar Dictionary Bar @@ -462,23 +641,27 @@ Dictionary info - + Thông tin từ điển Edit dictionary - + Sửa đổi từ điển &Dictionary Bar - + Thanh Từ đ&iển Open dictionary folder - + Mở thư mục từ điển Extended menu with all dictionaries... - + Mở trình đơn với tất cả từ điển... + + + Dictionary headwords + Danh sách từ của từ điển @@ -520,14 +703,83 @@ ExternalViewer the viewer program name is empty - + tên chương xem đang trống + + + + FTS::FtsIndexing + + None + Không + + + + FTS::FullTextSearchDialog + + Full-text search + Tìm toàn văn + + + Whole words + Toàn bộ từ + + + Plain text + Văn bản thuần + + + Wildcards + Ký tự đại diện + + + RegExp + RegExp + + + Max distance between words (%1-%2): + Khoảng cách tối đa giữa các từ (%1-%2): + + + Max articles per dictionary (%1-%2): + Số bài viết tối đa trên một từ điển (%1-%2): + + + Articles found: + Số bài viết tìm thấy: + + + Now indexing: + Đang chỉ mục: + + + The search line must contains at least one word containing + Dòng tìm kiếm phải chứa tối thiểu một từ có nhiều hơn + + + or more symbols + ký tự + + + No dictionaries for full-text search + Không có từ điển để tìm toàn văn + + + CJK symbols in search string are not compatible with search modes "Whole words" and "Plain text" + Ký tự CJK trong chuỗi tìm không tương thích với kiểu tìm "Toàn từ" và "Văn bản thuần" + + + + FTS::Indexing + + None + Không Forvo::ForvoArticleRequest XML parse error: %1 at %2,%3 - Lỗi phân tích XML: %1 ở %2,%3 + Lỗi phân tích XML: %1 tại %2,%3 Added %1 @@ -551,7 +803,54 @@ Go to Edit|Dictionaries|Sources|Forvo and apply for our own API key to make this error disappear. - Hãy vào Biên tập|Từ điển|Nguồn|Forvo và nhập khóa API của riêng bạn để tắt lỗi này đi. + Hãy vào Biên tập|Từ điển|Nguồn|Forvo và nhập khóa API riêng để tắt lỗi này. + + + + FullTextSearchDialog + + Search + Tìm + + + Match case + Khớp hoa thường + + + Mode: + Kiểu: + + + Articles found: + Số bài viết tìm thấy: + + + Available dictionaries in group: + Từ điển có trong nhóm: + + + Wait for indexing: + Chờ chỉ mục: + + + Total: + Tổng: + + + Indexed: + Đã chỉ mục: + + + Now indexing: None + Đang chỉ mục: Không + + + Cancel + Hủy bỏ + + + Help + Trợ giúp @@ -590,11 +889,11 @@ Groups Dictionaries available: - Các từ điển có sẵn: + Các từ điển đã có: Add selected dictionaries to group (Ins) - Thêm những từ điển đã chọn vào nhóm (Chèn) + Thêm những từ điển đã chọn vào nhóm (Ins) > @@ -602,11 +901,11 @@ Ins - Chèn + Ins Remove selected dictionaries from group (Del) - Xóa những từ điển đã chọn ra khỏi nhóm (Xóa) + Xóa những từ điển đã chọn ra khỏi nhóm (Del) < @@ -614,11 +913,11 @@ Del - Xóa + Del Groups: - Các nhóm: + Nhóm: Tab 2 @@ -658,7 +957,7 @@ Drag&drop dictionaries to and from the groups, move them inside the groups, reorder the groups using your mouse. - Kéo &Thả các từ điển tới và từ các nhóm, di chuyển chúng vào trong các nhóm, sắp sếp lại các nhóm sử dụng con chuột của bạn. + Sử dụng chuột kéo & thả các từ điển vào nhóm, khỏi nhóm và sắp sếp thứ tự trong nhóm. Add group @@ -682,11 +981,11 @@ Are you sure you want to remove the group <b>%1</b>? - Bạn có chắc chắn muốn xóa nhóm <b>%1</b>? + Bạn có muốn xóa nhóm <b>%1</b>? Are you sure you want to remove all the groups? - Bạn có chắc chắn muốn xóa hết các nhóm? + Bạn có muốn xóa hết các nhóm? Create language-based groups @@ -694,30 +993,77 @@ Auto groups - Các nhóm tự động + Tự động nhóm + + + Group tabs + Thẻ nhóm + + + Open groups list + Mở danh sách nhóm + + + + Help::HelpWindow + + GoldenDict help + Trợ giúp Từ điển Vàng + + + Home + Trang chủ + + + Back + Trở lại + + + Forward + Tiếp tục + + + Zoom In + Phóng to + + + Zoom Out + Thu nhỏ + + + Normal Size + Kích thước bình thường + + + Content + Nội dung + + + Index + Chỉ mục HistoryPaneWidget &Delete Selected - + &Xoá Copy Selected - + Sao chép History: - + Lược sử: %1/%2 - + %1/%2 History size: %1 entries out of maximum %2 - + Số lược sử: %1 mục trên tối đa %2 @@ -728,7 +1074,7 @@ %1 Morphology - %1 Hình thái học + Hình thái học %1 @@ -1465,7 +1811,7 @@ Vietnamese - + Tiếng Việt Volapuk @@ -1505,81 +1851,81 @@ Traditional Chinese - + Simplified Chinese - + Other - + Khác Other Simplified Chinese dialects - + Other Traditional Chinese dialects - + Other Eastern-European languages - + Other Western-European languages - + Other Russian languages - + Other Japanese languages - + Other Baltic languages - + Other Greek languages - + Other Korean dialects - + Other Turkish dialects - + Other Thai dialects - + Tamazight - + Lojban - + LoadDictionaries Error loading dictionaries - Lỗi khi tải từ điển + Lỗi nạp từ điển Main Error in configuration file. Continue with default settings? - + Tệp cấu hình lỗi. Tiếp tục với thiết lập mặc định? @@ -1594,7 +1940,7 @@ &File - &Tập tin + &Tệp &Edit @@ -1614,7 +1960,7 @@ H&istory - &Lịch sử + &Lược sử Search Pane @@ -1626,7 +1972,7 @@ F3 - F3 + F3 &Groups... @@ -1666,11 +2012,11 @@ Ctrl+Q - + Ctrl+Q &Forum - + &Diễn đàn &Close To Tray @@ -1678,11 +2024,11 @@ Minimizes the window to tray - Ẩn cửa sổ xuống khay hệ thống + Thu gọn cửa sổ xuống khay hệ thống Ctrl+F4 - + Ctrl+F4 &Save Article @@ -1690,11 +2036,11 @@ Save Article - Lưu bài viết + Lưu Bài viết F2 - + F2 &Print @@ -1702,11 +2048,11 @@ Ctrl+P - + Ctrl+P Page Set&up - &Cài đặt Trang + &Thiết lập Trang Print Preview @@ -1714,11 +2060,11 @@ Rescan Files - Quét lại các tập tin + Quét lại các tệp Ctrl+F5 - + Ctrl+F5 &Clear @@ -1746,11 +2092,11 @@ Scan Popup - Popup Quét + Quét Popup Pronounce Word (Alt+S) - Phát âm từ (Alt+S) + Phát âm (Alt+S) Zoom In @@ -1762,19 +2108,19 @@ Normal Size - Kích thước bình thường + Cỡ bình thường Words Zoom In - Phóng to từ + Phóng to Từ Words Zoom Out - Thu nhỏ từ + Thu nhỏ Từ Words Normal Size - Kích thước bình thường của từ + Cỡ Từ bình thường Show &Main Window @@ -1806,7 +2152,7 @@ Failed to initialize hotkeys monitoring mechanism.<br>Make sure your XServer has RECORD extension turned on. - Khởi chạy cơ chế quản lý phím nóng thất bại. <br>Hãy chắc rằng XServer của bạn đã bật phần mở rộng RECORD. + Lỗi khởi chạy cơ chế quản lý phím tắt. <br>Hãy kiểm tra XServer đã bật phần mở rộng RECORD. New Release Available @@ -1830,7 +2176,7 @@ Page Setup - Cài đặt trang + Thiết lập Trang No printer is available. Please install one first. @@ -1838,15 +2184,15 @@ Print Article - In bài viết + In Bài viết Save Article As - Lưu bài viết như + Lưu Bài viết như Html files (*.html *.htm) - Tập tin Html (*.html *.htm) + Tệp Html (*.html *.htm) Error @@ -1854,7 +2200,7 @@ Can't save article: %1 - Không thể lưu bài viết: %1 + Không thể lưu Bài viết: %1 Close current tab @@ -1866,7 +2212,7 @@ Close all tabs except current - Đóng hết thẻ trừ thẻ hiện tại + Đóng tất cả thẻ trừ thẻ hiện tại Opened tabs @@ -1874,186 +2220,220 @@ New Tab - + Thẻ mới Ctrl+T - + Ctrl+T &Configuration Folder - + Thư mục &cấu hình &Menubar - + Thanh Trì&nh đơn Found in Dictionaries: - + Từ điển tìm thấy: Open Tabs List - + Mở danh sách Thẻ %1 - %2 - + %1 - %2 You have chosen to hide a menubar. Use %1 to show it back. - + Bạn đã chọn ẩn thanh trình đơn. Dùng %1 để hiển thị lại. Ctrl+M - + Ctrl+M &Show - + &Hiện &Export - + &Xuất &Hide - + Ẩ&n Export history to file - + Xuất lược sử sang tệp Text files (*.txt);;All files (*.*) - + Tệp văn bản (*.txt);;Tất cả tệp (*.*) History export complete - + Hoàn tất xuất lược sử Export error: - + Lỗi trích xuất: Ctrl+H - + Ctrl+H &Import - + Nhậ&p Import history from file - + Nhập lược sử từ tệp Import error: invalid data in file - + Lỗi nhập: dữ liệu tệp không đúng History import complete - + Hoàn tất nhập lược sử Import error: - + Lỗi nhập: Dictionary info - + Thông tin từ điển Edit dictionary - + Chỉnh sửa từ điển &Search Pane - + Ô Tìm &kiếm &Results Navigation Pane - + Ô Điều hướng Kết &quả Print Pre&view - + X&em trước khi In &Rescan Files - + Q&uét lại các tệp &New Tab - + Thẻ &mới &Always on Top - + &Luôn hiện Always on Top - + Luôn hiện Ctrl+O - + Ctrl+O Menu Button - + Nút Trình đơn Show Names in Dictionary &Bar - + Hiện tên từ điển trên Thanh &Từ điển Show Small Icons in &Toolbars - + Hiện &biểu tượng nhỏ trên Thanh công cụ &Navigation - + Điều hướn&g The main window is set to be always on top. - + Cửa sổ chính luôn hiện trên các trình khác. &History Pane - + Thanh Lược &sử Accessibility API is not enabled - + API Khả năng truy cập không được bật Article, Complete (*.html) - + Bài viết, Toàn bộ (*.html) Article, HTML Only (*.html) - + Bài viết, chỉ HTML (*.html) Saving article... - + Lưu bài viết... Open dictionary folder - + Mở thư mục từ điển + + + Dictionary headwords + Danh sách từ của từ điển + + + String to search in dictionaries. The wildcards '*', '?' and sets of symbols '[...]' are allowed. +To find '*', '?', '[', ']' symbols use '\*', '\?', '\[', '\]' respectively + Chuỗi tìm trong từ điển. Ký tự đại diện '*', '?' và bộ ký tự '[...] được sử dụng. +Để tìm '*', '?', '[', ']' dùng tách riêng '\*', '\?', '\[', '\]' + + + Search + Tìm kiếm + + + Search in page + Tìm trong trang + + + Ctrl+F + Ctrl+F + + + Full-text search + Tìm toàn văn + + + Ctrl+Shift+F + Ctrl+Shift+F + + + GoldenDict reference + Trợ giúp Từ điển Vàng Mdx::MdxArticleRequest Dictionary file was tampered or corrupted - + Tệp từ điển đã bị xáo trộn hoặc hỏng Failed loading article from %1, reason: %2 - + Lỗi nạp bài viết từ %1, nguyên nhân: %2 @@ -2086,7 +2466,7 @@ Icon - + Biểu tượng @@ -2100,12 +2480,8 @@ Sắp xếp Từ điển: - ... - - - Inactive (disabled) dictionaries: - Các từ điển không hoạt động (đã tắt): + Các từ điển không hoạt động (đã vô hiệu hoá): Dictionary information @@ -2133,23 +2509,31 @@ Files comprising this dictionary: - Tập tin chứa từ điển này: + Tệp chứa từ điển này: Adjust the order by dragging and dropping items in it. Drop dictionaries to the inactive group to disable their use. - Tùy chỉnh thứ tự bằng cách kéo và thả các mục trong nó. Thả các từ điển vào nhóm không hoạt động để tắt chúng. + Điều chỉnh thứ tự bằng cách kéo và thả các từ điển để di chuyển vị trí. Thả vào ô không hoạt động để vô hiệu hoá từ điển. Description: - + Mô tả: Sort by name - + Sắp xếp theo tên Sort by languages - + Sắp xếp theo ngôn ngữ + + + Dictionary headwords + Danh sách từ của từ điển + + + Dictionaries active: %1, inactive: %2 + Từ điển hoạt động:%1, không hoạt động: %2 @@ -2181,7 +2565,7 @@ Normally, opening a new tab switches to it immediately. With this on however, new tabs will be opened without switching to them. - Thông thường, bạn sẽ chuyển sang thẻ mới ngay khi nó + Mặc định, bạn sẽ chuyển sang thẻ mới ngay khi nó được mở. Với tùy chọn này, các thẻ mới sẽ được mở mà không cần chuyển ngay sang chúng. @@ -2204,7 +2588,7 @@ When enabled, an icon appears in the sytem tray area which can be used to open main window and perform other tasks. - Khi bật, một biểu tượng sẽ hiện trên khay hệ thống dùng để mở cửa sổ chính + Biểu tượng Từ điển Vàng sẽ hiện trên khay hệ thống dùng để mở cửa sổ chính và thực hiện một số tác vụ khác. @@ -2214,8 +2598,7 @@ With this on, the application starts directly to system tray without showing its main window. - Nếu bật tùy chọn này, ứng dụng sẽ khởi động thẳng xuống khay hệ thống -mà không hiện cửa sổ chính. + Khi khởi chạy, ứng dụng sẽ thu gọn xuống khay hệ thống mà không hiện cửa sổ chính. Start to system tray @@ -2224,11 +2607,11 @@ With this on, an attempt to close main window would hide it instead of closing the application. - Nếu bật tùy chọn này, khi tắt cửa sổ chính thì ứng dụng sẽ ẩn thay cho đóng hoàn toàn. + Ứng dụng sẽ thu gọn xuống khay hệ thống khi đóng cửa sổ chính. Close to system tray - Tắt xuống khay hệ thống + Đóng xuống khay hệ thống Startup @@ -2256,7 +2639,7 @@ &Scan Popup - Popup &Quét + &Quét Popup When enabled, a translation popup window would be shown each time @@ -2270,31 +2653,30 @@ Enable scan popup functionality - Kích hoạt chức năng popup quét + Kích hoạt chức năng quét popup Chooses whether the scan popup mode is on by default or not. If checked, the program would always start with the scan popup active. - Lựa chọn chế độ popup quét được bật theo mặc định hoặc không. Nếu được chọn, -chương trình sẽ luôn luôn khởi động với popup quét được bật. + Chọn bật chế độ quét popup mặc định. Nếu chọn, chương trình sẽ khởi động +với tính năng quét popup được bật. Start with scan popup turned on - Khởi động với popup quét được bật + Khởi động với quét popup được bật With this enabled, the popup would only show up if all chosen keys are in the pressed state when the word selection changes. - Với tùy chọn này được bật, popup sẽ chỉ hiện ra khi tất cả các phím đã -chọn ở trạng thái nhấn khi sự lựa chọn từ thay đổi. + Khi chọn từ cần tra nghĩa, nhấn phím tắt đã chọn để hiện popup. Only show popup when all selected keys are kept pressed: - Chỉ hiện popup khi tất cả các phím đã chọn được nhấn giữ: + Chỉ hiện popup khi nhấn giữ phím tắt: Left Ctrl only - Chỉ Ctrl trái + Phím Ctrl trái Left Ctrl @@ -2302,7 +2684,7 @@ Right Shift only - Chỉ Shift phải + Phím Shift phải Right Shift @@ -2326,7 +2708,7 @@ Left Alt only - Chỉ Alt trái + Phím Alt trái Left Alt @@ -2342,7 +2724,7 @@ Right Alt only - Chỉ Alt phải + Phím Alt phải Right Alt @@ -2350,7 +2732,7 @@ Right Ctrl only - Chỉ Ctrl phải + Phím Ctrl phải Right Ctrl @@ -2358,7 +2740,7 @@ Left Shift only - Chỉ Shift trái + Phím Shift trái Left Shift @@ -2370,29 +2752,28 @@ Win/Meta - + Win/Meta Normally, in order to activate a popup you have to maintain the chosen keys pressed while you select a word. With this enabled, the chosen keys may also be pressed shortly after the selection is done. - Thông thường, để kích hoạt một popup bạn phải nhấn -giữ phím được chọn khi bạn chọn từ. Nếu bật tùy chọn -này, những phím được chọn cũng có thể được nhấn trong -khoảng thời gian ngắn sau khi lựa chọn xong để bật popup. + Mặc định, để bật popup bạn phải nhấn giữ phím tắt +khi bạn chọn từ cần tra. Tùy chọn này xác định thời +gian phím tắt được nhấn sau khi chọn từ để bật popup. Keys may also be pressed afterwards, within - Các phím cũng có thể được ấn sau, trong khoảng + Phím tắt có thể được nhấn sau khi chọn từ To avoid false positives, the keys are only monitored after the selection's done for a limited amount of seconds, which is specified here. - Để tránh xác định nhầm, chương trình chỉ bắt phím -sau khi lựa chọn xong trong khoảng giới hạn một vài -giây được xác định ở đây. + Để tránh xác định nhầm, phím tắt chỉ được giám sát +sau khi chọn từ hoàn tất trong vài giây giới hạn được +xác định ở đây. secs @@ -2400,19 +2781,19 @@ Hotkeys - Phím nóng + Phím tắt Use the following hotkey to show or hide the main window: - Sử dụng phím nóng sau đây để hiện hay ẩn cửa sổ chính: + Sử dụng phím tắt sau đây để ẩn hiện cửa sổ chính: Use the following hotkey to translate a word from clipboard: - Sử dụng phím nóng sau đây để dịch từ clipboard: + Sử dụng phím tắt sau đây để dịch từ clipboard: The hotkeys are global and work from any program and within any context as long as GoldenDict is running in background. - Phím nóng hoạt động trên toàn bộ hệ thống và làm việc trên bất kỳ chương trình nào hay bên trong bất kỳ phạm vi nào miễn là khi Từ điển Vàng đang chạy nền. + Phím tắt hoạt động toàn cục từ bất kỳ chương trình nào hay trong ngữ cảnh nào khi Từ điển Vàng đang chạy nền. <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> @@ -2424,7 +2805,7 @@ <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'DejaVu Sans'; font-size:9pt; font-weight:400; font-style:normal;"> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" color:#ff0000;">Chú ý: Có vẻ như bạn đang chạy một phiên bản X.Org X.Server có phần mở rộng RECORD bị lỗi. Phím nóng trong Từ điển Vàng có thể không hoạt động được. Điều này phải được sửa bên trong server. Hãy ghé thăm </span><a href="https://bugs.freedesktop.org/show_bug.cgi?id=20500"><span style=" text-decoration: underline; color:#0000ff;">mục bug</span></a><span style=" color:#ff0000;"> và để lại một phản hồi nếu bạn muốn.</span></p></body></html> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" color:#ff0000;">Chú ý: Có vẻ như bạn đang chạy một phiên bản X.Org X.Server có phần mở rộng RECORD bị lỗi. phím tắt trong Từ điển Vàng có thể không hoạt động được. Điều này phải được sửa bên trong server. Hãy ghé thăm </span><a href="https://bugs.freedesktop.org/show_bug.cgi?id=20500"><span style=" text-decoration: underline; color:#0000ff;">mục bug</span></a><span style=" color:#ff0000;"> và để lại một phản hồi nếu bạn muốn.</span></p></body></html> &Audio @@ -2436,11 +2817,11 @@ Auto-pronounce words in main window - Tự động phát âm từ trong cửa sổ chính + Tự động phát âm trong cửa sổ chính Auto-pronounce words in scan popup - Tự động phát âm từ trong popup quét + Tự động phát âm trong quét popup Playback @@ -2492,13 +2873,13 @@ Enabling this would make GoldenDict block most advertisements by disallowing content (images, frames) not originating from the site you are browsing. If some site breaks because of this, try disabling this. - Bật tùy chọn này sẽ khiến Từ điển Vàng chặn hầu hết các quảng cáo -bằng cách không cho phép nội dung (ảnh, khung) không bắt nguồn từ trang -bạn đang xem. Nếu một vài trang bị lỗi bởi tùy chọn này, hãy thử tắt đi. + Với tùy chọn này, Từ điển Vàng sẽ chặn các quảng cáo bằng cách + không cho phép nội dung (ảnh, khung) không bắt nguồn từ trang +đang xem. Nếu một vài trang bị lỗi bởi tùy chọn này, hãy thử tắt đi. Disallow loading content from other sites (hides most advertisements) - Không cho phép tải nội dung từ các trang khác (tắt hầu hết các quảng cáo) + Không cho phép tải nội dung từ các trang khác (tắt các quảng cáo) When this is enabled, the program periodically @@ -2506,10 +2887,8 @@ is available for download. If it is so, the program informs the user about it and prompts to open a download page. - Khi bật tùy chọn này, chương trình sẽ kiểm tra định kỳ -các phiên bản mới cập nhật đã sẵn sàng để tải về hay -chưa. Nếu có, chương trình sẽ báo cho người dùng biết -và gợi ý mở trang tải về. + Chương trình sẽ kiểm tra định kỳ phiên bản cập nhật mới. + Nếu có, chương trình sẽ thông báo và gợi ý mở trang tải về. Check for new program releases periodically @@ -2542,7 +2921,7 @@ Use Windows native playback API. Limited to .wav files only, but works very well. - Sử dụng API phát lại của Windows. Giới hạn chỉ cho các tập tin .wav, + Sử dụng API phát lại của Windows. Giới hạn chỉ cho các tệp .wav, nhưng hoạt động rất tốt. @@ -2557,379 +2936,421 @@ Use any external program to play audio files - Sử dụng bất cứ chương trình ngoài nào để phát tập tin âm thanh + Sử dụng bất cứ chương trình ngoài nào để phát tệp âm thanh Select this option if you don't want to see the main tab bar when only a single tab is opened. - + Ẩn thẻ trên thanh thẻ chính nếu chỉ duy nhất một thẻ được mở. Hide single tab - + Ẩn thẻ đơn nhất Normally, pressing ESC key moves focus to the translation line. With this on however, it will hide the main window. - + Mặc định, nhấn phím ESC dùng để chuyển vào ô tìm kiếm. +Tuỳ chọn này sẽ ẩn cửa sổ chính khi nhấn phím ESC. ESC key hides main window - + Nhấn phím ESC để ẩn cửa sổ chính Send translated word to main window instead of to show it in popup window - + Hiện từ đã dịch trên cửa sổ chính thay vì cửa sổ popup Send translated word to main window - + Hiện từ đã dịch trên cửa sổ chính Enabling this would allow to listen to sound pronunciations from online dictionaries that rely on Flash or other web plugins. Plugin must be installed for this option to work. - + Cho phép nghe phát âm từ các từ điển trực tuyến dựa trên Flash +hay các bổ trợ web khác. Phần bổ trợ phải được cài đặt. Enable web plugins - + Bật bổ trợ web Ad&vanced - + &Nâng cao ScanPopup extra technologies - + Kỹ thuật Quét Popup bổ sung Try to use IAccessibleEx technology to retrieve word under cursor. This technology works only with some programs that support it (for example Internet Explorer 9). It is not needed to select this option if you don't use such programs. - + Dùng kỹ thuật IAccessibleEx để đọc từ dưới con trỏ. +Kỹ thuật này chỉ làm việc với một vài chương trình hỗ trợ +(VD: Internet Explorer 9). +Không cần bật chức năng này nếu bạn không cần dùng. Use &IAccessibleEx - + Dùng &IAccessibleEx Try to use UI Automation technology to retrieve word under cursor. This technology works only with some programs that support it. It is not needed to select this option if you don't use such programs. - + Dùng kỹ thuật UI Automation để đọc từ dưới con trỏ. +Kỹ thuật này chỉ làm việc với một vài chương trình hỗ trợ. +Không cần bật chức năng này nếu bạn không cần dùng. Use &UIAutomation - + Dùng &UIAutomation Try to use special GoldenDict message to retrieve word under cursor. This technology works only with some programs that support it. It is not needed to select this option if you don't use such programs. - + Dùng thông điệp Từ điển Vàng đặc biệt để đọc từ dưới con trỏ. +Kỹ thuật này chỉ làm việc với một vài chương trình hỗ trợ. +Không cần bật chức năng này nếu bạn không cần dùng. Use &GoldenDict message - + Dùng thông điệp Từ điển &Vàng Ctrl-Tab navigates tabs in MRU order - + Ctrl-Tab điều hướng các thẻ theo trình tự MRU Babylon - + Babylon History - + Lược sử Turn this option on to store history of the translated words - + Lưu lược sử các từ đã tra Store &history - + Lưu &Lược sử Articles - + Bài viết Turn this option on to always expand optional parts of articles - + Luôn mở rộng phần tuỳ chọn của bài viết Expand optional &parts - + Mở rộng phần tuỳ &chọn Turn this option on if you want to select words by single mouse click - + Chọn từ bằng cách nhấp chuột đơn Select word by single click - + Chọn từ với nhấp chuột đơn Add-on style: - + Kiểu bổ sung: Specify the maximum number of entries to keep in history. - + Xác định tối đa số mục lưu trong lược sử. Maximum history size: - + Số lược sử tối đa: History saving interval. If set to 0 history will be saved only during exit. - + Tần suất lưu lược sử. Nếu đặt giá trị 0, lược sử sẽ được lưu khi thoát chương trình. Save every - + Lưu mỗi minutes - + phút Modern - + Modern Lingoes - + Lingoes Lingoes-Blue - + Lingoes-Blue Play audio files via FFmpeg(libav) and libao - + Phát các tệp âm thanh thông qua FFmpeg(libav) và libao Use internal player - + Dùng trình phát âm thanh tích hợp Some sites detect GoldenDict via HTTP headers and block the requests. Enable this option to workaround the problem. - + Một vài trang mạng nhận ra Từ điển Vàng thông qua phần đầu giao thức HTTP +và chặn truy vấn. Bật tính năng này để không chèn định danh vào truy vấn HTTP. Do not identify GoldenDict in HTTP headers - + Không định danh Từ điển Vàng trong phần đầu giao thức HTTP Select this option to automatic collapse big articles - + Tự động thu gọn các bài viết dài Collapse articles more than - + Thu gọn bài viết dài hơn symbols - + ký tự Adjust this value to avoid huge context menus. - + Điều chỉnh giá trị này để tránh các trình đơn ngữ cảnh dài. Context menu dictionaries limit: - + Trình đơn ngữ cảnh các từ điển giới hạn: Articles longer than this size will be collapsed - + Bài viết dài hơn cỡ này sẽ được thu gọn + + + System proxy + Proxy của hệ thống + + + Custom proxy + Proxy tuỳ chỉnh + + + Custom settings + Thiết lập tuỳ chỉnh + + + Full-text search + Tìm toàn văn + + + Allow full-text search for: + Các dạng cho phép tìm toàn văn: + + + Don't search in dictionaries containing more than + Không tìm trong từ điển chứa nhiều hơn + + + articles (0 - unlimited) + bài viết (0 - không giới hạn) + + + Help language + Ngôn ngữ trợ giúp ProgramTypeEditor Audio - + Âm thanh Plain Text - + Văn bản thuần Html - + Html Prefix Match - + Khớp Tiền tố Unknown - + Không biết Programs::RunInstance No program name was given. - + Không tên chương trình nào được gán. The program has crashed. - + Chương trình đã bị hỏng. The program has returned exit code %1. - + Chương trình trả về mã thoát %1. ProgramsModel Enabled - Bật + Bật Type - + Loại Name - Tên + Tên Command Line - + Dòng lệnh Icon - + Biểu tượng QObject Article loading error - + Lỗi nạp bài viết Article decoding error - + Lỗi giải mã bài viết avformat_alloc_context() failed. - + avformat_alloc_context() đã lỗi. av_malloc() failed. - + av_malloc() đã lỗi. avio_alloc_context() failed. - + avio_alloc_context() đã lỗi. avformat_open_input() failed: %1. - + avformat_open_input() đã lỗi: %1. avformat_find_stream_info() failed: %1. - + avformat_find_stream_info() đã lỗi: %1. Could not find audio stream. - + Không thể tìm luồng âm thanh. Codec [id: %1] not found. - + Bộ giải nén [id: %1] không tìm thấy. avcodec_open2() failed: %1. - + avcodec_open2() đã lỗi: %1. Cannot find usable audio output device. - + Không tìm thấy thiết bị xuất âm thanh. Unsupported sample format. - + Định dạng mẫu không hỗ trợ. ao_open_live() failed: - + ao_open_live() đã lỗi: No driver. - + Không có bộ điều khiển. This driver is not a live output device. - + Bộ điều khiển này không phải là thiết bị xuất trực tiếp. A valid option key has an invalid value. - + Khoá tuỳ chọn đúng có một giá trị không xác định. Cannot open the device: %1, channels: %2, rate: %3, bits: %4. - + Không thể mở thiết bị: %1, kênh: %2, rate: %3, bits: %4. Unknown error. - + Lỗi không biết. avcodec_alloc_frame() failed. - + avcodec_alloc_frame() đã lỗi. QuickFilterLine Dictionary search/filter (Ctrl+F) - + Tìm/lọc từ điển (Ctrl+F) Quick Search - + Tìm Nhanh Clear Search - + Xoá ô Tìm kiếm ResourceToSaveHandler ERROR: %1 - + LỖI: %1 Resource saving error: - + Nguồn lưu lỗi: The referenced resource failed to download. - Tải xuống nguồn được tham chiếu thất bại. + Nguồn tham chiếu lỗi tải xuống. Romaji Hepburn Romaji for Hiragana - Hepburn Romaj cho Hiragana + Hệ Latinh hoá Hepburn của bảng chữ Hiragana Hepburn Romaji for Katakana - Hepburn Romaji cho Katakana + Hệ Latinh hoá Hepburn của bảng chữ Katakana @@ -2963,7 +3384,7 @@ Pronounce Word (Alt+S) - Phát âm từ (Alt+S) + Phát âm (Alt+S) Alt+S @@ -2971,29 +3392,29 @@ Shows or hides the dictionary bar - Hiện hay ẩn thanh từ điển + Ẩn/Hiện thanh Từ điển Use this to pin down the window so it would stay on screen, could be resized or managed in other ways. - Sử dụng để đính cửa sổ lại làm nó sẽ giữ trên màn hình, có thể -thay đổi kích thước hay quản lý theo cách khác tùy bạn. + Đính cửa sổ trên màn hình, có thể thay đổi kích thước hay +quản lý theo nhiều cách khác. Send word to main window (Alt+W) - + Hiện từ đã tra trên cửa sổ chính (Atl+W) Alt+W - + Atl+W Back - Trở lại + Trở lại Forward - Tiếp tục + Tiếp tục GoldenDict @@ -3001,7 +3422,7 @@ %1 - %2 - + %1 - %2 @@ -3016,18 +3437,18 @@ Icon - + Biểu tượng Sources Files - Tập tin + Tệp Paths to search for the dictionary files: - Đường dẫn để tìm kiếm tập tin từ điển: + Đường dẫn chứa tệp từ điển: &Add... @@ -3039,7 +3460,7 @@ Re&scan now - &Quét lại bây giờ + &Quét lại Sound Dirs @@ -3047,7 +3468,7 @@ Make dictionaries from bunches of audiofiles by adding paths here: - Làm từ điển từ hàng tá các tập tin âm thanh bằng cách thêm đường dẫn ở đây: + Thêm đường dẫn chứa các tệp âm thanh để tạo từ điển âm thanh: Morphology @@ -3055,7 +3476,7 @@ Path to a directory with Hunspell/Myspell dictionaries: - Đường dẫn đến thư mục chứa từ điển Hunspell/Myspell: + Đường dẫn đến thư mục chứa từ điển Hunspell/Myspell: &Change... @@ -3092,7 +3513,7 @@ Any websites. A string %GDWORD% will be replaced with the query word: - Bất kỳ trang nào. Một chuỗi %GDWORD% sẽ được thay thế bởi từ truy vấn: + Có thể dùng bất kỳ trang nào. Chuỗi %GDWORD% sẽ được thay thế bởi từ truy vấn: Alternatively, use %GD1251% for CP1251, %GDISO1% for ISO 8859-1. @@ -3118,7 +3539,7 @@ Use of Forvo currently requires an API key. Leave this field blank to use the default key, which may become unavailable in the future, or register on the site to get your own key. - Sử dụng Forvo hiện tại cần khóa API. Để trống ô này để sử + Sử dụng Forvo yêu cầu một khóa API. Để trống ô này để sử dụng khóa mặc định mà có thể không còn hiệu lực trong tương lai, đăng ký trên trang chủ để lấy khóa của chính bạn. @@ -3174,7 +3595,7 @@ Japanese Romaji - Phiên âm (Romaji) tiếng Nhật + Phiên âm Latinh tiếng Nhật Systems: @@ -3195,7 +3616,7 @@ kana writing systems. Standardized as ISO 3602 Not implemented yet in GoldenDict. - Hệ thống thông thường nhất, có mối quan hệ một-đổi-một tới hệ viết kana. Tiêu chuẩn ISO 3602 + Hệ thống thông dụng nhất, có mối quan hệ tương ứng tới hệ viết kana. Tiêu chuẩn ISO 3602 Chưa được bổ sung trong Từ điển Vàng. @@ -3259,132 +3680,141 @@ Programs - + Chương trình Remove program <b>%1</b> from the list? - + Xoá chương trình <b>%1</b> khỏi danh sách? Belarusian transliteration - + Chuyển tự sang tiếng Belarus Get your own key <a href="http://api.forvo.com/key/">here</a>, or leave blank to use the default one. - + Lấy khoá của bạn <a href="http://api.forvo.com/key/">tại đây</a> hoặc để trống để dùng mặc định. Alternatively, use %GD1251% for CP1251, %GDISO1%...%GDISO16% for ISO 8859-1...ISO 8859-16 respectively, %GDBIG5% for Big-5, %GDBIG5HKSCS% for Big5-HKSCS, %GDGBK% for GBK and GB18030, %GDSHIFTJIS% for Shift-JIS. - + Lựa chọn dùng %GD1251% for CP1251, %GDISO1%...%GDISO16% với ISO 8859-1...ISO 8859-16 tương ứng, +%GDBIG5% với Big-5, %GDBIG5HKSCS% với Big5-HKSCS, %GDGBK% với GBK và GB18030, %GDSHIFTJIS% với Shift-JIS. Text to Speech - + Text to Speech Any external programs. A string %GDWORD% will be replaced with the query word. If such string is not presented, the word will be fed into standard input. - + Dùng mọi chương trình ngoài. Chuỗi %GDWORD% thay từ truy vấn. Nếu chuỗi không có, từ sẽ được đưa vào đầu vào tiêu chuẩn. + + + DICT servers + Máy chủ DICT + + + DICT servers: + Máy chủ DICT: StylesComboBox None - Không + Không TextToSpeechSource Selected voice engines: - + Thêm vào phương tiện giọng nói đã chọn: &Add - + &Thêm &Remove - Xóa &bỏ + Xóa &bỏ Preview - + Xem trước Available voice engines: - + Các phương tiện giọng nói có thể: Text to be previewed: - + Xem trước văn bản: Type text to be previewed here. - + Nhập văn bản ở đây. &Preview - + &Xem trước No TTS voice available - + Không có giọng nói TTS Confirm removal - Xác nhận xóa bỏ + Xác nhận xóa bỏ Remove voice engine <b>%1</b> from the list? - + Xoá phương tiện giọng nói <b>%1</b> khỏi danh sách? Cannot find available TTS voice.<br>Please make sure that at least one TTS engine installed on your computer already. - + Không tìm thấy giọng nói TTS. <br>Hãy kiểm tra tối thiểu một phương tiện TTS được cài đặt. Preferences - Tùy thích + Tùy thích Volume: - + Âm lượng: Rate: - + Tốc độ: TranslateBox Type a word or phrase to search dictionaries - + Nhập một từ hoặc cụm từ để tra từ điển Drop-down - + Nút xổ VoiceEnginesModel Enabled - Bật + Bật Name - Tên + Tên Id - + Id Icon - + Biểu tượng @@ -3403,21 +3833,21 @@ Icon - + Biểu tượng WordFinder Failed to query some dictionaries. - Truy vấn một vài từ điển thất bại. + Lỗi truy vấn một vài từ điểni. WordList WARNING: %1 - CẢNH BÁO: %1 + CẢNH BÁO: %1 diff -Nru goldendict-1.5.0~git20131003/locale/zh_CN.ts goldendict-1.5.0~git20150923/locale/zh_CN.ts --- goldendict-1.5.0~git20131003/locale/zh_CN.ts 2013-10-02 20:42:04.000000000 +0000 +++ goldendict-1.5.0~git20150923/locale/zh_CN.ts 2015-09-23 08:26:24.000000000 +0000 @@ -29,7 +29,7 @@ [未知] - + Based on Qt %1 (%2, %3 bit) 基于 Qt %1 (%2, %3 位) @@ -42,62 +42,62 @@ ArticleMaker - + Then just stop the cursor over the word you want to look up in another application, and a window would pop up which would describe it to you. 然后只要将鼠标指针停留在你想要进行抓词查询的单词上,程序就会在弹出式窗口中显示释义。 - + <h3 align="center">Working with the popup</h3>To look up words from other active applications, you would need to first activate the <i>"Scan popup functionality"</i> in <b>Preferences</b>, and then enable it at any time either by triggering the 'Popup' icon above, or by clicking the tray icon down below with your right mouse button and choosing so in the menu you've popped. <h3 align="center">使用屏幕取词功能</h3><p style="text-indent:2em">如要从其它程序中直接进行抓词查询,需要首先在<b>首选项</b>中启用“屏幕取词功能”,然后点击上面的“弹出菜单”图标,或者右键点击系统托盘图标后从弹出菜单中选定“屏幕取词”以激活此功能。 - + Expand article 展开文章 - + Collapse article 收起文章 - + No translation for <b>%1</b> was found in group <b>%2</b>. 在 <b>%2</b> 群组中找不到 <b>%1</b> 的可用翻译。 - + Working with popup 使用屏幕取词功能 - + (untitled) (未命名) - + Welcome! 欢迎使用! - + Then just select any word you want to look up in another application by your mouse (double-click it or swipe it with mouse with the button pressed), and a window would pop up which would describe the word to you. 然后只要用鼠标指针选定你要进行抓词查询的词(双击单词或者用鼠标拖拉选定),程序就会在弹出式窗口中显示释义。 - + No translation was found in group <b>%1</b>. 在 <b>%1</b> 群组中找不到可用的翻译。 - + <h3 align="center">Welcome to <b>GoldenDict</b>!</h3><p>To start working with the program, first visit <b>Edit|Dictionaries</b> to add some directory paths where to search for the dictionary files, set up various Wikipedia sites or other sources, adjust dictionary order or create dictionary groups.<p>And then you're ready to look up your words! You can do that in this window by using a pane to the left, or you can <a href="Working with popup">look up words from other active applications</a>. <p>To customize program, check out the available preferences at <b>Edit|Preferences</b>. All settings there have tooltips, be sure to read them if you are in doubt about anything.<p>Should you need further help, have any questions, suggestions or just wonder what the others think, you are welcome at the program's <a href="http://goldendict.org/forum/">forum</a>.<p>Check program's <a href="http://goldendict.org/">website</a> for the updates. <p>(c) 2008-2013 Konstantin Isakov. Licensed under GPLv3 or later. <h3 align="center">欢迎使用 <b>GoldenDict</b> 词典程序!</h3><p style="text-indent:2em">使用时请首先打开<b>编辑 | 词典</b>菜单以添加并扫描含有词典文件的目录,添加维基百科网站查询或其它资源,调整词典排序或创建新的词典群组。<p style="text-indent:2em">这些设置都完成以后,就可以开始使用了。你可以使用左侧的查询面板,或者<a href="使用屏幕取词功能">直接从其它程序中抓词查询</a>。<p style="text-indent:2em">如需要改变设置,可以在<b>编辑 | 首选项</b>菜单中查看一下可用的系统设置。所有的设置都有鼠标指针提示信息,如果有不明之处,请仔细阅读提示信息。<p style="text-indent:2em">如果你需要更多帮助,有任何疑问、建议,或者仅仅想了解其他人的想法,欢迎访问此程序的<a href="http://goldendict.org/forum/">官方论坛</a>。<p style="text-indent:2em">访问此程序的<a href="http://goldendict.org/">官方网站</a>以获取更新。<p style="text-indent:2em">(c) 2008-2013 Konstantin Isakov. 授权基于 GPLv3 或更高版本。 - + (picture) (图片) @@ -105,37 +105,37 @@ ArticleRequest - + Expand article 展开文章 - + From 来自 - + Collapse article 收起文章 - + Query error: %1 查询错误:%1 - + Close words: 相近词条: - + Compound expressions: 复合短语: - + Individual words: 单个词汇: @@ -143,7 +143,7 @@ ArticleView - + x x @@ -153,52 +153,54 @@ 表单 - + Failed to run a player to play sound file: %1 没有可用的播放器,无法打开音频文件:%1 - + + &Next 后一个(&N) - + Find: 查找: - + The referenced resource failed to download. 所引用的资源下载失败。 - + Failed to create temporary file. 创建临时文件失败。 - + Ctrl+G Ctrl+G - + &Look up "%1" 查找 "%1"(&L) - + about:blank about:blank - + + &Previous 前一个(&P) - + Look up "%1" in &New Tab 在新标签页中查找 "%1"(&N) @@ -207,58 +209,58 @@ GoldenDict - - + + The referenced resource doesn't exist. 所引用的资源不存在。 - + &Open Link 打开链接(&O) - + &Case Sensitive 区分大小写(&C) - + Failed to auto-open resource file, try opening manually: %1. 自动打开资源文件时失败,请尝试手动打开:%1. - + Look up "%1" in %2 在 %2 中查找 "%1" - + Select Current Article 选择当前文章 - + Copy as text 复制为文本 - + Inspect 审查元素 - + Look up "%1" in %2 in &New Tab 在 %2 中查找 "%1" 并使用新标签页(&N) - + Open Link in New &Tab 在新标签页中打开链接(&T) - + Open Link in &External Browser 在外部浏览器中打开链接(&E) @@ -271,78 +273,79 @@ 要播放非 WAV 文件,请进入 编辑|首选项,选取音频选项卡,选择“通过 DirectShow 播放”。 - + Highlight &all 高亮所有结果(&a) - + Resource 资源 - + Audio 音频 - + TTS Voice TTS 音频 - + Picture 图片 - + Video 视频: %1 视频 - + Video: %1 - + Definition from dictionary "%1": %2 定义:"%1": %2 - + Definition: %1 定义:%1 - + The referenced audio program doesn't exist. 引用的音频播放程序不存在。 - + + ERROR: %1 错误: %1 - + Save sound 保存音频文件 - + Sound files (*.wav *.ogg *.mp3 *.mp4 *.aac *.flac *.mid *.wv *.ape);;All files (*.*) 音频文件 (*.wav *.ogg *.mp3 *.mp4 *.aac *.flac *.mid *.wv *.ape);;所有文件 (*.*) - + Save image 保存图片 - + Image files (*.bmp *.jpg *.png *.tif);;All files (*.*) 图片文件 (*.bmp *.jpg *.png *.tif);;所有文件 (*.*) @@ -351,33 +354,33 @@ 资源保存失败: - + Save &image... 保存图片(&I)... - + Save s&ound... 保存音频文件(&O)... - + Send "%1" to input line 将 "%1" 发送到输入框 - - + + &Add "%1" to history 将 "%1" 添加到历史(&A) - + WARNING: %1 警告: %1 - + WARNING: FFmpeg Audio Player: %1 警告: 内置播放器:%1 @@ -402,6 +405,29 @@ + Dialog + + + Proxy authentication required + 代理服务器要求身份验证 + + + + You need to supply a Username and a Password to access via proxy + 您需要提供代理服务器的用户名和密码 + + + + Username: + 用户名: + + + + Password: + 密码: + + + DictGroupWidget @@ -502,6 +528,119 @@ + DictHeadwords + + + Search mode + 搜索模式 + + + + This element determines how filter string will be interpreted + 在这里可以选择过滤器字符串的执行方式 + + + + If checked on the symbols case will be take in account when filtering + 若勾选则大小写不同的词条均计入总数 + + + + Match case + 区分大小写 + + + + Exports headwords to file + 将词条导出至文件 + + + + Export + 导出 + + + + Help + + + + + OK + 确定 + + + + Press this button to apply filter to headwords list + 点击此按钮启用词条列表过滤器 + + + + Apply + 过滤 + + + + If checked any filter changes will we immediately applied to headwords list + 若勾选则词条列表过滤器的修改即时生效 + + + + Auto apply + 自动过滤 + + + + Filter: + 过滤器: + + + + Filter string (fixed string, wildcards or regular expression) + 过滤器字符串(可以是固定的字符串、通配符或者正则表达式) + + + + Text + 纯文本 + + + + Wildcards + 通配符 + + + + RegExp + 正则表达式 + + + + Unique headwords total: %1, filtered: %2 + 总共有%1个不同的词条,已过滤%2个 + + + + Save headwords to file + 保存词条至文件 + + + + Text files (*.txt);;All files (*.*) + 文本文件 (*.txt);;所有文件 (*.*) + + + + Export headwords... + 导出词条... + + + + Cancel + 取消 + + + DictInfo @@ -544,6 +683,16 @@ 描述: + + Show all unique dictionary headwords + 显示所有不同的词条 + + + + Headwords + 词条 + + Edit the dictionary via command: %1 @@ -559,6 +708,74 @@ + DictServer + + + Url: + + + + + Databases: + + + + + Search strategies: + + + + + Server databases + + + + + DictServersModel + + + Enabled + 已启用 + + + + Name + 名称 + + + + Address + 地址 + + + + Databases + + + + + Strategies + + + + + Icon + 图标 + + + + Comma-delimited list of databases +(empty string or "*" matches all databases) + + + + + Comma-delimited list of search strategies +(empty string mean "prefix" strategy) + + + + DictionaryBar Dictionary Bar @@ -575,17 +792,22 @@ 编辑此群组 - + Dictionary info 词典信息 - + + Dictionary headwords + 词典词条 + + + Open dictionary folder 打开词典文件夹 - + Edit dictionary 编辑词典信息 @@ -598,8 +820,8 @@ EditDictionaries - - + + &Dictionaries 词典(&D) @@ -609,33 +831,33 @@ 词典 - + Accept 接受 - + Cancel 取消 - + Sources changed 词典文件所在目录已变更 - + &Sources 词典来源(&S) - - + + &Groups 群组(&G) - + Some sources were changed. Would you like to accept the changes? 某些词典文件的所在目录已变更,是否接受变更? @@ -649,6 +871,92 @@ + FTS::FtsIndexing + + + None + + + + + FTS::FullTextSearchDialog + + + Full-text search + 全文搜索 + + + + Whole words + 全字匹配 + + + + Plain text + 纯文本 + + + + Wildcards + 通配符 + + + + RegExp + 正则表达式 + + + + Max distance between words (%1-%2): + 最大词间距 (%1-%2): + + + + Max articles per dictionary (%1-%2): + 每个词典最大词条数 (%1-%2): + + + + + + Articles found: + 搜索到的词条: + + + + Now indexing: + 正在索引: + + + + CJK symbols in search string are not compatible with search modes "Whole words" and "Plain text" + 不能使用“全字匹配”模式或者“纯文本”模式搜索包含CJK字符的字符串 + + + + The search line must contains at least one word containing + 搜索关键词至少包含 + + + + or more symbols + 个或更多字符 + + + + No dictionaries for full-text search + 没有可供全文搜索的词典 + + + + FTS::Indexing + + + None + + + + Forvo::ForvoArticleRequest @@ -687,6 +995,69 @@ + FullTextSearchDialog + + + + Search + 搜索 + + + + Match case + 区分大小写 + + + + Mode: + 模式: + + + + Articles found: + 搜索到的词条: + + + + Available dictionaries in group: + 群组中的可用词典: + + + + Wait for indexing: + 等候索引: + + + + Help + + + + Non-indexable: + 不可索引: + + + + Total: + 总计: + + + + Indexed: + 已索引: + + + + Now indexing: None + 正在索引:无 + + + + Cancel + 取消 + + + GermanTranslit @@ -751,27 +1122,37 @@ 标签页 2 - + Are you sure you want to remove all the groups? 确定移除全部群组吗? - + Are you sure you want to remove the group <b>%1</b>? 确定要移除<b>%1</b>群组吗? - + + Group tabs + 群组标签页 + + + + Open groups list + 打开群组列表 + + + Remove group 移除群组 - + Rename group 重命名群组 - + Give a new name for the group: 为群组起一个新名字: @@ -786,7 +1167,7 @@ 添加群组(&A) - + Add group 添加群组 @@ -811,13 +1192,13 @@ 移除词典群组 - + Give a name for the new group: 为新群组命名: - + Remove all groups 移除全部群组 @@ -863,6 +1244,54 @@ + Help::HelpWindow + + + GoldenDict help + + + + + Home + + + + + Back + 回退 + + + + Forward + 前进 + + + + Zoom In + 放大 + + + + Zoom Out + 缩小 + + + + Normal Size + 正常大小 + + + + Content + + + + + Index + + + + HistoryPaneWidget @@ -893,12 +1322,12 @@ Hunspell - + Spelling suggestions: 拼写建议: - + %1 Morphology %1 构词法 @@ -906,12 +1335,12 @@ HunspellDictsModel - + Name 名称 - + Enabled 已启用 @@ -1951,7 +2380,7 @@ LoadDictionaries - + Error loading dictionaries 读取词典出错 @@ -1959,7 +2388,7 @@ Main - + Error in configuration file. Continue with default settings? 配置文件错误,使用默认配置并继续? @@ -1967,32 +2396,32 @@ MainWindow - + F1 F1 - + F2 F2 - + F3 F3 - + F4 F4 - + All 全部 - + Back 回退 @@ -2001,103 +2430,108 @@ 打印预览 - + %1 dictionaries, %2 articles, %3 words 词典数:%1,文章数:%2,词条数:%3 - + &Edit 编辑(&E) - + &File 文件(&F) - + &Help 帮助(&H) - - + + Search + 搜索 + + + + &Quit 退出(&Q) - + Error 错误 - + Scan Popup 屏幕取词 - + Quit from application 退出程序 - + &Close To Tray 关闭至系统托盘(&C) - + Can't save article: %1 无法保存文章:%1 - + Zoom In 放大 - + &Dictionaries... 词典(&D)... - + &About 关于(&A) - + &Forum 论坛(&F) - + &Print 打印(&P) - + &Save Article 保存文章(&S) - + Save Article As 文章另存为 - + Ctrl+P Ctrl+P - + Ctrl+Q Ctrl+Q - + Minimizes the window to tray 最小化窗口至系统托盘 @@ -2106,27 +2540,27 @@ 重新扫描文件 - + Page Set&up 页面设置(&U) - + &Homepage 主页(&H) - + New Release Available 有新版本可用 - + Look up: 查找: - + Zoom Out 缩小 @@ -2135,43 +2569,43 @@ 群组...(&G) - + Show &Main Window 显示主窗口(&M) - + About GoldenDict 关于 GoldenDict - + Download 下载 - + Page Setup 页面设置 - - + + Look up in: 查找于: - + Normal Size 正常大小 - + Failed to initialize hotkeys monitoring mechanism.<br>Make sure your XServer has RECORD extension turned on. 初始化热键监视机制失败。<br>请确保你的 XServer 已启用 RECORD 扩展。 - + Version <b>%1</b> of GoldenDict is now available for download.<br>Click <b>Download</b> to get to the download page. 有新版 GoldenDict 可用,版本为 <b>%1</b>。<br> 点击<b>下载</b>,打开下载页面。 @@ -2181,12 +2615,12 @@ 查询面板 - + Ctrl+F4 Ctrl+F4 - + Ctrl+F5 Ctrl+F5 @@ -2195,17 +2629,17 @@ GoldenDict - + Loading... 加载中…… - + (untitled) (未命名) - + &Preferences... 首选项(&P)... @@ -2215,27 +2649,27 @@ - + Welcome! 欢迎使用! - + Pronounce Word (Alt+S) 朗读词条(Alt+S) - + Save Article 保存文章 - + Skip This Release 忽略此次升级 - + Forward 前进 @@ -2244,12 +2678,12 @@ 警告: %1 - + Print Article 打印文章 - + No printer is available. Please install one first. 找不到可用的打印机,请先安装一个打印机。 @@ -2258,7 +2692,7 @@ 导航栏 - + &View 查看(&V) @@ -2267,52 +2701,52 @@ 在词典栏中显示词典名称 - + H&istory 历史(&I) - + &Clear 清除(&C) - + &Zoom 缩放(&Z) - + Words Zoom In 单词列表 - 放大 - + Words Zoom Out 单词列表 - 缩小 - + Words Normal Size 单词列表 - 正常大小 - + Close current tab 关闭当前标签页 - + Close all tabs 关闭所有标签页 - + Close all tabs except current 关闭其它标签页 - + Opened tabs 已打开的标签页 @@ -2325,17 +2759,17 @@ 词典...(&D) F3 - + New Tab 新建标签页 - + Ctrl+T Ctrl+T - + &Configuration Folder 配置文件夹(&C) @@ -2344,48 +2778,54 @@ 在工具栏上显示小图标 - + &Menubar 菜单栏(&M) - + Found in Dictionaries: 在以下词典中找到: - + + String to search in dictionaries. The wildcards '*', '?' and sets of symbols '[...]' are allowed. +To find '*', '?', '[', ']' symbols use '\*', '\?', '\[', '\]' respectively + + + + Open Tabs List 打开标签页列表 - + %1 - %2 %1 - %2 - + You have chosen to hide a menubar. Use %1 to show it back. 你选择了隐藏菜单栏,使用 %1 再次显示。 - + Ctrl+M Ctrl+M - - + + &Show 显示(&S) - + &Export 导出(&E) - + &Hide 隐藏(&H) @@ -2394,161 +2834,191 @@ 历史记录查看模式 - + Export history to file 导出历史记录到文件 - - + + Text files (*.txt);;All files (*.*) 文本文件 (*.txt);;所有文件 (*.*) - + History export complete 历史记录导出完成 - + Export error: 导出错误: - + Ctrl+H Ctrl+H - + &Import 导入(&I) - + Import history from file 导入历史文件 - + Import error: invalid data in file 导入失败:无效数据 - + History import complete 历史导入成功 - + Import error: 导入错误: - + Dictionary info 词典信息 - + + Dictionary headwords + 词典词条 + + + Open dictionary folder 打开词典文件夹 - + Edit dictionary 编辑词典信息 - + &Search Pane 查询面板(&S) - + &Results Navigation Pane 查询结果导航面板(&R) - + Print Pre&view 打印预览(&V) - + &Rescan Files 重新扫描文件(&R) - + &New Tab 新建标签页(&N) - + &Always on Top 总在最前(&A) - + Always on Top 总在最前 - + Ctrl+O Ctrl+O - - - + + + Menu Button 菜单按钮 - + + Search in page + 页内搜索 + + + + Ctrl+F + Ctrl+F + + + + Full-text search + 全文搜索 + + + + Ctrl+Shift+F + Ctrl+Shift+F + + + + GoldenDict reference + + + + Show Names in Dictionary &Bar 在词典栏中显示词典名称(&B) - + Show Small Icons in &Toolbars 在工具栏上显示小图标(&T) - + &Navigation 导航栏(&N) - + Article, Complete (*.html) 文章, 完整 (*.html) - + Article, HTML Only (*.html) 文章, 仅 HTML (*.html) - + Saving article... 文章保存中…… - + The main window is set to be always on top. 主窗口已设置为总在最前。 - + &History Pane 历史面板(&H) - - + + Accessibility API is not enabled 无障碍API未启用 @@ -2556,12 +3026,12 @@ Mdx::MdxArticleRequest - + Dictionary file was tampered or corrupted 词典文件被修改或已损坏 - + Failed loading article from %1, reason: %2 从 %1 加载文章失败:%2 @@ -2569,7 +3039,7 @@ MediaWiki::MediaWikiArticleRequest - + XML parse error: %1 at %2,%3 XML 解析失败:%1 于 %2, %3 @@ -2577,7 +3047,7 @@ MediaWiki::MediaWikiWordSearchRequest - + XML parse error: %1 at %2,%3 XML 解析失败:%1 于 %2, %3 @@ -2585,22 +3055,22 @@ MediaWikisModel - + Name 名称 - + Address 地址 - + Enabled 已启用 - + Icon 图标 @@ -2608,12 +3078,8 @@ OrderAndProps - - - - ... - ... + ... @@ -2621,80 +3087,90 @@ 表单 - + Inactive (disabled) dictionaries: 未启用(已禁用)的词典: - + Name: 名称: - + Total articles: 文章总数: - + Translates from: 词条语言: - + Translates to: 释义语言: - + Total words: 词条总数: - + Adjust the order by dragging and dropping items in it. Drop dictionaries to the inactive group to disable their use. 可以通过拖拽改变项目的排序。将词典放入未启用的群组以禁用。 - + Dictionary order: 词典排序: - + Files comprising this dictionary: 此词典包含的文件: - + Dictionary information 词典信息 - + Description: 描述: - + Sort by name 按名称排序 - + Sort by languages 按语言排序 + + + Dictionary headwords + 词典词条 + + + + Dictionaries active: %1, inactive: %2 + + PathsModel - + Path 路径 - + Recursive 递归搜索 @@ -2702,7 +3178,7 @@ Preferences - + Alt Alt @@ -2712,22 +3188,22 @@ 启动至系统托盘 - + Left Shift only 仅限左 Shift - + Ctrl Ctrl - + secs - + Win/Meta Win/Meta @@ -2737,32 +3213,32 @@ 启用系统托盘图标 - + Host: 主机: - + Port: 端口: - + Shift Shift - + Type: 类型: - + User: 用户名: - + &Scan Popup 屏幕取词(&S) @@ -2775,27 +3251,27 @@ 启用此选项将会在打开新标签页时不自动选定。 - + Use proxy server 使用代理服务器 - + Use the following hotkey to translate a word from clipboard: 使用下列热键翻译剪贴板中的单词: - + Windows key or Meta key Windows 键或 Meta 键 - + Only show popup when all selected keys are kept pressed: 仅在按住下列特定的按键时屏幕取词才会启动: - + Auto-pronounce words in main window 自动朗读主窗口中的词条 @@ -2805,7 +3281,7 @@ 随系统启动 - + Left Alt only 仅限左 Alt @@ -2815,7 +3291,7 @@ 标签页浏览 - + Right Shift only 仅限右 Shift @@ -2827,12 +3303,12 @@ 而不是退出程序。 - + &Audio 音频(&A) - + Enable if you wish to use a proxy server for all program's network requests. 如果你希望通过代理服务器执行程序的网络查 @@ -2844,7 +3320,7 @@ 界面语言: - + Left Ctrl only 仅限左 Ctrl @@ -2854,32 +3330,32 @@ 在后台打开新标签页 - + &Network 网络(&N) - + Right Ctrl only 仅限右 Ctrl - + Lingvo Lingvo - + Right Shift 右 Shift - + Left Shift 左 Shift - + With this enabled, the popup would only show up if all chosen keys are in the pressed state when the word selection changes. 启用后,屏幕取词窗口只有在按住特定按键时才会弹出。 @@ -2890,12 +3366,12 @@ 显示风格: - + Auto-pronounce words in scan popup 自动朗读屏幕取词弹出窗口中的词条 - + Enable scan popup functionality 启用屏幕取词功能 @@ -2905,17 +3381,17 @@ 在当前页之后打开新标签页 - + Restart the program to apply the language change. 变更界面语言需要重新启动程序才能生效。 - + Alt key Alt 键 - + When enabled, a translation popup window would be shown each time you point your mouse on any word on the screen (Windows) or select any word with mouse (Linux). When enabled, you can switch it on and @@ -2926,7 +3402,7 @@ 托盘菜单中选择是否激活屏幕取词功能。 - + Check for new program releases periodically 定期检查可用版本 @@ -2944,7 +3420,7 @@ 关闭至系统托盘 - + System default 系统默认 @@ -2955,7 +3431,7 @@ 启用此选项,将会启用系统托盘图标。 - + When this is enabled, the program periodically checks if a new, updated version of GoldenDict is available for download. If it is so, the program @@ -2971,12 +3447,13 @@ 开机自动启动 - + Password: 密码: - + + Default 默认 @@ -2986,7 +3463,7 @@ 界面(&I) - + To avoid false positives, the keys are only monitored after the selection's done for a limited amount of seconds, which is specified here. @@ -2994,27 +3471,27 @@ 被监视。热键监视的秒数可以在这里设置。 - + Changing Language 变更界面语言 - + Ctrl key Ctr l键 - + Use the following hotkey to show or hide the main window: 使用下列热键显示或隐藏主窗口: - + Left Alt 左 Alt - + Right Alt only 仅限右 Alt @@ -3024,37 +3501,37 @@ 首选项 - + Keys may also be pressed afterwards, within 按键取词容许的延迟时间: - + Left Ctrl 左 Ctrl - + Right Alt 右 Alt - + The hotkeys are global and work from any program and within any context as long as GoldenDict is running in background. 热键均为全局键,只要 GoldenDict 在后台运行,热键就可以在任何程序中使用。 - + Right Ctrl 右 Ctrl - + Hotkeys 热键 - + Start with scan popup turned on 启动程序时同时启动屏幕取词 @@ -3065,7 +3542,7 @@ 启用此选项,程序启动时将直接最小化至系统托盘。 - + Shift key Shift 键 @@ -3075,13 +3552,13 @@ 开机自动启动 GoldenDict. - + Chooses whether the scan popup mode is on by default or not. If checked, the program would always start with the scan popup active. 选择是否默认启用屏幕取词模式。如果选中,程序启动时将会自动激活屏幕取词功能。 - + Normally, in order to activate a popup you have to maintain the chosen keys pressed while you select a word. With this enabled, the chosen keys may also @@ -3091,7 +3568,7 @@ 的一小段时间内按下键即可。 - + <!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; } @@ -3104,7 +3581,7 @@ <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:2em;"><span style=" color:#ff0000;">注意: 你正在运行的 X.Org XServer 版本 RECORD 扩展功能不能正常工作。GoldenDict 中的热键可能因此而失效。问题的解决依赖于 xserver 自身的恢复。请参照如下链接: </span><a href="https://bugs.freedesktop.org/show_bug.cgi?id=20500"><span style=" text-decoration: underline; color:#0000ff;">bug 记录</span></a><span style=" color:#ff0000;"> 并留下评论。</span></p></body></html> - + Enabling this would make GoldenDict block most advertisements by disallowing content (images, frames) not originating from the site you are browsing. If some site breaks because of this, try disabling this. @@ -3113,17 +3590,17 @@ 用此选项。 - + Disallow loading content from other sites (hides most advertisements) 禁止载入来自其它站点的内容(封杀广告) - + Pronunciation 朗读 - + Playback 播放 @@ -3132,7 +3609,7 @@ 通过 Phonon 播放 - + Use external program: 使用外部程序播放: @@ -3160,7 +3637,7 @@ 通过 Phonon 框架播放音频。有时不太稳定,但支持大多数音频文件格式。 - + Use any external program to play audio files 使用外部程序播放音频文件 @@ -3176,7 +3653,7 @@ ESC 键隐藏主窗口 - + Enabling this would allow to listen to sound pronunciations from online dictionaries that rely on Flash or other web plugins. Plugin must be installed for this option to work. @@ -3184,7 +3661,7 @@ 安装相应插件才能使此选项正常工作。 - + Enable web plugins 启用 web 插件 @@ -3199,58 +3676,98 @@ 隐藏单标签页 - + + Help language + + + + Adjust this value to avoid huge context menus. 避免右键菜单出现过多词典条目。 - + Context menu dictionaries limit: 右键菜单词典数目限制: - + Send translated word to main window instead of to show it in popup window 将翻译词条发送至主窗口,而非在取词窗口中显示 - + Send translated word to main window 发送翻译词条到主窗口 - + Play audio files via FFmpeg(libav) and libao 使用 FFmpeg(libav) 及 libao 播放音频文件 - + Use internal player 使用内置播放器 - + + System proxy + 系统代理 + + + + Custom proxy + 自定义代理 + + + + Custom settings + 自定义设置 + + + Some sites detect GoldenDict via HTTP headers and block the requests. Enable this option to workaround the problem. 部分网站屏蔽了使用 GoldenDict 浏览器标识(UA)的请求,启用此选项以绕过该问题。 - + Do not identify GoldenDict in HTTP headers 不使用 GoldenDict 浏览器标识(UA) - + + Full-text search + 全文搜索 + + + + Allow full-text search for: + 允许对以下格式词典进行全文搜索: + + + + Don't search in dictionaries containing more than + 不要在词条数多于 + + + + articles (0 - unlimited) + 个 (0 - 无限制) 的词典中进行搜索 + + + Ad&vanced 高级(&v) - + ScanPopup extra technologies 附加取词技术 - + Try to use IAccessibleEx technology to retrieve word under cursor. This technology works only with some programs that support it (for example Internet Explorer 9). @@ -3260,12 +3777,12 @@ 如果你不使用此类程序,则不需要启用此选项。 - + Use &IAccessibleEx 使用 &IAccessibleEx - + Try to use UI Automation technology to retrieve word under cursor. This technology works only with some programs that support it. It is not needed to select this option if you don't use such programs. @@ -3274,12 +3791,12 @@ 如果你不使用此类程序,则不需要启用此选项。 - + Use &UIAutomation 使用 &UIAutomation - + Try to use special GoldenDict message to retrieve word under cursor. This technology works only with some programs that support it. It is not needed to select this option if you don't use such programs. @@ -3288,32 +3805,32 @@ 如果你不使用此类程序,则不需要启用此选项。 - + Use &GoldenDict message 使用 &GoldenDict message - + Turn this option on to always expand optional parts of articles 开启此选项以自动展开文章的可选部分 - + Expand optional &parts 展开可选部分(&P) - + Select this option to automatic collapse big articles 开启此选项以自动收起过长的文章 - + Collapse articles more than 收起大于 - + Articles longer than this size will be collapsed 大于此大小的文章将被收起 @@ -3322,7 +3839,7 @@ 大于此大小的文章将被收起 - + symbols 字符的文章 @@ -3332,27 +3849,27 @@ 用 Ctrl-tab 浏览标签页时,以“最近使用”为序 - + Babylon Babylon - + History 历史 - + Turn this option on to store history of the translated words 开启此选项已保存查询历史 - + Store &history 保存历史(&H) - + Articles 文章 @@ -3381,42 +3898,42 @@ 附加样式: - + Specify the maximum number of entries to keep in history. 指定历史最大条数。 - + Maximum history size: 最大历史条数: - + History saving interval. If set to 0 history will be saved only during exit. 历史保存周期。若为 0 则只在程序退出时保存。 - + Save every 保存周期: - + minutes 分钟 - + Modern 现代 - + Lingoes 灵格斯 - + Lingoes-Blue 灵格斯-蓝色调 @@ -3424,27 +3941,27 @@ ProgramTypeEditor - + Audio 音频 - + Plain Text 纯文本 - + Html Html - + Prefix Match 匹配前缀 - + Unknown 未知 @@ -3470,27 +3987,27 @@ ProgramsModel - + Enabled 已启用 - + Type 类型 - + Name 名称 - + Command Line 命令行 - + Icon 图标 @@ -3498,12 +4015,14 @@ QObject - + + Article loading error 文章加载错误 - + + Article decoding error 文章解码错误 @@ -3614,18 +4133,18 @@ ResourceToSaveHandler - - + + ERROR: %1 错误: %1 - + Resource saving error: 资源保存失败: - + The referenced resource failed to download. 所引用的资源下载失败。 @@ -3633,12 +4152,12 @@ Romaji - + Hepburn Romaji for Katakana 黑本式罗马字(片假名) - + Hepburn Romaji for Hiragana 黑本式罗马字(平假名) @@ -3654,11 +4173,11 @@ ScanPopup - - - - - + + + + + ... ... @@ -3671,7 +4190,7 @@ Alt+M - + Alt+S Alt+S @@ -3685,38 +4204,38 @@ 列出符合条件的词条(Alt+M) - + Pronounce Word (Alt+S) 朗读词条(Alt+S) - + Shows or hides the dictionary bar 显示或隐藏词典栏 - + Use this to pin down the window so it would stay on screen, could be resized or managed in other ways. 使用此按钮可以固定窗口,以便它能停留在屏幕上进行改变大小等相关窗口管理操作。 - + Send word to main window (Alt+W) 将词条发送到主窗口 (Alt+W) - + Alt+W Alt+W - + Back 回退 - + Forward 前进 @@ -3725,8 +4244,8 @@ GoldenDict - - + + %1 - %2 %1 - %2 @@ -3734,17 +4253,17 @@ SoundDirsModel - + Name 名称 - + Path 路径 - + Icon 图标 @@ -3757,17 +4276,17 @@ 文件 - + Hiragana 平假名 - + Systems: 方案: - + Nihon-shiki 日本式 @@ -3776,8 +4295,9 @@ 作为替代选项,使用 %GD1251% 代替 CP1251,%GDISO1% 代替 ISO 8859-1. - - + + + Remove site <b>%1</b> from the list? 确定要将<b>%1</b>网站从列表中移除吗? @@ -3787,7 +4307,7 @@ 维基百科 - + Katakana Japanese syllabary 日语的片假名 @@ -3797,18 +4317,18 @@ 如果要批量添加音频文件,请把路径添加在这里: - - + + Remove directory <b>%1</b> from the list? 确定要将<b>%1</b>目录从列表中移除吗? - + Japanese Romaji 日文罗马字 - + Based on Nihon-shiki system, but modified for modern standard Japanese. Standardized as ISO 3602 @@ -3829,23 +4349,23 @@ 音频文件目录 - + The most widely used method of transcription of Japanese, based on English phonology 以英文语音学为基础建立的,最常用的日文转写方案 - + Hiragana Japanese syllabary 日语的平假名 - + Transliteration 转写 - + The most regular system, having a one-to-one relation to the kana writing systems. Standardized as ISO 3602 @@ -3856,7 +4376,7 @@ GoldenDict 尚不支持此方案。 - + Russian transliteration 俄文转写 @@ -3871,7 +4391,7 @@ 变更...(&C) - + Katakana 片假名 @@ -3886,7 +4406,7 @@ 重新扫描(&S) - + German transliteration 德文转写 @@ -3900,14 +4420,15 @@ - + + &Add... 添加(&A)... - - - + + + Choose a directory 选择目录 @@ -3916,7 +4437,8 @@ - + + &Remove 移除(&R) @@ -3931,16 +4453,17 @@ 词典文件所在目录: - - - - - + + + + + + Confirm removal 确认移除 - + Syllabaries: 音节: @@ -3950,7 +4473,7 @@ 可用的构词法规则库: - + Enables to use the Latin alphabet to write the Japanese language 启用日文罗马字转写 @@ -3968,42 +4491,52 @@ 最下面。 - + Hepburn 黑本式 - + Kunrei-shiki 训令式 - + Forvo Forvo + + DICT servers + 词典服务器 + + + DICT servers: + 词典服务器: + + + Any external programs. A string %GDWORD% will be replaced with the query word. If such string is not presented, the word will be fed into standard input. 任意外部程序。字符串 %GDWORD% 会被所查词条替换。若 %GDWORD% 不存在,该词条会写入标准输入。 - + Live pronunciations from <a href="http://www.forvo.com/">forvo.com</a>. The site allows people to record and share word pronunciations. You can listen to them from GoldenDict. 从 <a href="http://www.forvo.com/">forvo.com</a> 获取即时发音。这个网站使得人们可以记录并分享单词发音。你可以从 GoldenDict 中听这些发音。 - + Enable pronunciations from Forvo 启用来自 Forvo 的发音功能 - + API Key: API 密钥: - + Use of Forvo currently requires an API key. Leave this field blank to use the default key, which may become unavailable in the future, or register on the site to get your own key. @@ -4029,32 +4562,32 @@ <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:2em;">从<a href="http://api.forvo.com/key/"><span style=" text-decoration: underline; color:#0057ae;">这里</span></a>获取属于你的 key, 或者保持空白以使用默认 key.</p></td></tr></table></body></html> - + Language codes (comma-separated): 语言代码(用逗号分隔): - + List of language codes you would like to have. Example: "en, ru". 你所需要的语言代码列表。例如:"en, ru". - + Full list of language codes is available <a href="http://www.forvo.com/languages-codes/">here</a>. 语言代码的完整列表可以从<a href="http://www.forvo.com/languages-codes/">这里</a>获取。 - + Greek transliteration 希腊文转写 - + (not available in portable version) (便携版中不可用) - + Programs 程序 @@ -4063,17 +4596,17 @@ 任意外部程序均可。字符串 %GDWORD% 会被所查词条替换,词条会写入标准输入。 - + Remove program <b>%1</b> from the list? 从列表中删除程序 <b>%1</b>? - + Belarusian transliteration 白俄罗斯语转写 - + Get your own key <a href="http://api.forvo.com/key/">here</a>, or leave blank to use the default one. 从<a href="http://api.forvo.com/key/">这里</a>获取自己的API Key,或留空以使用默认API Key。 @@ -4085,7 +4618,7 @@ %GDBIG5% 对应 Big-5, %GDBIG5HKSCS% 对应 Big5-HKSCS, %GDGBK% 对应 GBK 及 GB18030, %GDSHIFTJIS% 对应 Shift-JIS. - + Text to Speech 语音合成 @@ -4215,22 +4748,22 @@ WebSitesModel - + Name 名称 - + Address 地址 - + Enabled 已启用 - + Icon 图标 @@ -4238,7 +4771,7 @@ WordFinder - + Failed to query some dictionaries. 在某些词典中进行查询时失败。 diff -Nru goldendict-1.5.0~git20131003/locale/zh_TW.ts goldendict-1.5.0~git20150923/locale/zh_TW.ts --- goldendict-1.5.0~git20131003/locale/zh_TW.ts 2013-08-16 09:45:56.000000000 +0000 +++ goldendict-1.5.0~git20150923/locale/zh_TW.ts 2015-09-23 08:26:24.000000000 +0000 @@ -9,7 +9,7 @@ GoldenDict dictionary lookup program, version - GoldenDict 電子詞典程式,版本 + GoldenDict 查字典程式,版本 Licensed under GNU GPLv3 or later @@ -25,22 +25,22 @@ (c) 2008-2013 Konstantin Isakov (ikm@goldendict.org) - (c) 2008-2013 Konstantin Isakov (ikm@goldendict.org) + (c) 2008-2013 Konstantin Isakov (ikm@goldendict.org) Based on Qt %1 (%2, %3 bit) - + 基於 QT %1(%2, %3 bit) ArticleMaker Then just stop the cursor over the word you want to look up in another application, and a window would pop up which would describe it to you. - 然後只要將滑鼠指標停留在你想要進行抓詞查詢的單字上,程式就會在蹦現式視窗中顯示釋義。 + 然後只要將滑鼠游標停留在你想要進行查詢的單字上,程式就會在彈出式視窗中顯示釋義。 <h3 align="center">Working with the popup</h3>To look up words from other active applications, you would need to first activate the <i>"Scan popup functionality"</i> in <b>Preferences</b>, and then enable it at any time either by triggering the 'Popup' icon above, or by clicking the tray icon down below with your right mouse button and choosing so in the menu you've popped. - <h3 align="center">使用螢幕取詞功能</h3><p style="text-indent:2em">如要從其它程式中直接進行抓詞查詢,請先在<b>選項</b>中啟用「螢幕取詞功能」,接著按上面的「彈出功能表」圖示,或是右鍵按系統匣圖示後從彈出功能表中選定「螢幕取詞」以啟動此功能。 + <h3 align="center">使用螢幕取詞功能</h3><p style="text-indent:2em">如要從其它程式中直接抓詞查詢,請先在<b>偏好設定</b>中啟用「螢幕取詞功能」,接著按一下主視窗的「螢幕取詞」圖示,或在系統匣圖示上按右鍵,從選單中選定「螢幕取詞」以啟動此功能。 No translation for <b>%1</b> was found in group <b>%2</b>. @@ -60,7 +60,7 @@ Then just select any word you want to look up in another application by your mouse (double-click it or swipe it with mouse with the button pressed), and a window would pop up which would describe the word to you. - 然後只要用滑鼠指標選定你要進行抓詞查詢的詞(按兩下單字或是用滑鼠拖拉選定),程式就會在蹦現式視窗中顯示釋義。 + 然後只要用滑鼠游標選定你要進行抓詞查詢的詞(按兩下單字或是用滑鼠拖拉選定),程式就會在彈出式視窗中顯示釋義。 No translation was found in group <b>%1</b>. @@ -68,19 +68,19 @@ <h3 align="center">Welcome to <b>GoldenDict</b>!</h3><p>To start working with the program, first visit <b>Edit|Dictionaries</b> to add some directory paths where to search for the dictionary files, set up various Wikipedia sites or other sources, adjust dictionary order or create dictionary groups.<p>And then you're ready to look up your words! You can do that in this window by using a pane to the left, or you can <a href="Working with popup">look up words from other active applications</a>. <p>To customize program, check out the available preferences at <b>Edit|Preferences</b>. All settings there have tooltips, be sure to read them if you are in doubt about anything.<p>Should you need further help, have any questions, suggestions or just wonder what the others think, you are welcome at the program's <a href="http://goldendict.org/forum/">forum</a>.<p>Check program's <a href="http://goldendict.org/">website</a> for the updates. <p>(c) 2008-2013 Konstantin Isakov. Licensed under GPLv3 or later. - <h3 align="center">歡迎使用 <b>GoldenDict</b> 詞典程式!</h3><p style="text-indent:2em">使用時請首先開啟<b>編輯 | 詞典</b>功能表以新增並掃描含有詞典檔案的資料夾,然後新增維基百科網站查詢或其它資源,再調整詞典排序或建立新的詞典群組。<p style="text-indent:2em">這些設定都完成以後,就可以開始使用了。你可以使用左側的查詢面板,或是<a href="使用螢幕取詞功能">直接從其它程式中抓詞查詢</a>。<p style="text-indent:2em">如需要改變設定,可以在<b>編輯 | 選項</b>功能表中檢視一下可用的系統設定。所有的設定都有滑鼠指標提示資訊,如果有不明之處,請仔細閱讀提示資訊。<p style="text-indent:2em">如果你需要更多說明,有任何疑問、建議,或是僅僅想了解其他人的想法,歡迎拜訪此程式的<a href="http://goldendict.org/forum/">官方論壇</a>。<p style="text-indent:2em">如需要取得程式更新的訊息,歡迎拜訪此程式的<a href="http://goldendict.org/">官方網站</a>。<p style="text-indent:2em">(c) 2008-2013 Konstantin Isakov. 授權基於 GPLv3 或更高版本。 + <h3 align="center">歡迎使用 <b>GoldenDict</b> 查字典程式!</h3><p style="text-indent:2em">使用時請首先開啟<b>編輯 | 字典</b>功能表以新增並掃描含有字典檔案的資料夾,然後新增維基百科網站查詢或其它資源,再調整字典排序或建立新的字典群組。<p style="text-indent:2em">這些設定都完成以後,就可以開始使用了。你可以使用左側的查詢面板,或是<a href="使用螢幕取詞功能">直接從其它程式中抓詞查詢</a>。<p style="text-indent:2em">如需自訂本程式,可以在<b>編輯 | 偏好設定</b>功能表中檢視可用的設定。所有的設定都有滑鼠游標提示資訊,如果有不明之處,請看一下提示。<p style="text-indent:2em">如果你需要更多說明、有任何疑問、建議,或是想了解其他人的想法,歡迎拜訪此程式的<a href="http://goldendict.org/forum/">官方論壇</a>。<p style="text-indent:2em">如需要取得程式更新,歡迎拜訪此程式的<a href="http://goldendict.org/">官方網站</a>。<p style="text-indent:2em">(c) 2008-2013 Konstantin Isakov. 授權基於 GPLv3 或更高版本。 (picture) - + (圖片) Expand article - + 展開條目 Collapse article - + 收縮條目 @@ -107,11 +107,11 @@ Expand article - + 展開條目 Collapse article - + 收縮條目 @@ -162,7 +162,7 @@ Look up "%1" in &New Tab - 在新標籤頁中尋找 "%1"(&N) + 在新分頁中尋找 "%1"(&N) GoldenDict @@ -190,11 +190,11 @@ Look up "%1" in %2 in &New Tab - 在 %2 中尋找 "%1" 並使用新標籤頁(&N) + 在 %2 中尋找 "%1" 並使用新分頁(&N) Open Link in New &Tab - 在新標籤頁中開啟連結(&T) + 在新分頁中開啟連結(&T) Open Link in &External Browser @@ -206,119 +206,138 @@ To enable playback of files different than WAV, please go to Edit|Preferences, choose the Audio tab and select "Play via DirectShow" there. - 要播放非 WAV 檔案,請進入 編輯|選項,選取音訊標籤,選擇「透過 DirectShow 播放」。 + 要播放非 WAV 檔案,請進入 編輯|偏好設定,選取音訊標籤,選擇「透過 DirectShow 播放」。 Highlight &all - + 全部醒目提示(&a) Resource - + 資源 Audio - + 音訊 Definition: %1 - + 定義: %1 The referenced audio program doesn't exist. - + 引用的音訊程式不存在。 WARNING: %1 - 警告: %1 + 警告: %1 &Add "%1" to history - + 將 "%1" 新增至歷史紀錄(&A) Definition from dictionary "%1": %2 - + 字典 "%1" 的定義: %2 Send "%1" to input line - + 把 "%1" 傳送到輸入列 Picture - + 圖片 Select Current Article - + 選擇目前條目 ERROR: %1 - + 錯誤:%1 Save sound - + 儲存發音 Sound files (*.wav *.ogg *.mp3 *.mp4 *.aac *.flac *.mid *.wv *.ape);;All files (*.*) - + 發音檔(*.wav *.ogg *.mp3 *.mp4 *.aac *.flac *.mid *.wv *.ape);;所有檔案 (*.*) Save image - + 儲存圖片 Image files (*.bmp *.jpg *.png *.tif);;All files (*.*) - + 圖片檔(*.bmp *.jpg *.png *.tif);;所有檔案 (*.*) Save &image... - + 儲存圖片...(&i) Save s&ound... - + 儲存發音...(&o) TTS Voice - + 文字轉語音聲音 WARNING: FFmpeg Audio Player: %1 - + 警告: FFmpeg 音訊撥放程式: %1 Copy as text - + 以純文字複製 Inspect - + 檢查原始碼 Video - + 影像 Video: %1 - + 影像: %1 BelarusianTranslit Belarusian transliteration from latin to cyrillic (classic orthography) - + 白俄羅斯語轉寫──拉丁文至斯拉夫字母(傳統正字法) Belarusian transliteration from latin to cyrillic (school orthography) - + 白俄羅斯語轉寫──拉丁文至斯拉夫字母(學院正字法) Belarusian transliteration (smoothes out the difference between classic and school orthography in cyrillic) - + 白俄羅斯語轉寫(消弭傳統正字法和學院正字法之間的差異) + + + + Dialog + + Proxy authentication required + 必須提供代理伺服器的驗證 + + + You need to supply a Username and a Password to access via proxy + 如果你要透過代理伺服器來存取,需要提供用戶名和密碼 + + + Username: + 用戶名: + + + Password: + 密碼: @@ -376,26 +395,117 @@ Dictionaries: - + 字典: Combine groups by source language to "%1->" - + 依來源語言合併分組至 "%1->" Combine groups by target language to "->%1" - + 依目標語言合併分組至 "->%1" Make two-side translate group "%1-%2-%1" - + 製作雙向翻譯組 "%1-%2-%1" Combine groups with "%1" - + 與 "%1" 合併分組 Unassigned + 未指定 + + + + DictHeadwords + + Search mode + 搜尋模式 + + + This element determines how filter string will be interpreted + 此部份決定如何解釋欲篩選的字串 + + + If checked on the symbols case will be take in account when filtering + 勾選後,大小寫就會視為不同 + + + Match case + 符合大小寫 + + + Exports headwords to file + 將標題字匯出至檔案 + + + Export + 匯出 + + + OK + OK + + + Press this button to apply filter to headwords list + 按下此按鈕,將篩選器套用至標題字列表 + + + Apply + 套用 + + + If checked any filter changes will we immediately applied to headwords list + 假如勾選的話,如果篩選器有任何變動,都會立即套用至標題字列表 + + + Auto apply + 自動套用 + + + Filter: + 篩選器: + + + Filter string (fixed string, wildcards or regular expression) + 篩選字串(固定字串、萬用字元或正規表達式) + + + Text + 文字 + + + Wildcards + 萬用字元 + + + RegExp + 正規表達式 + + + Unique headwords total: %1, filtered: %2 + 獨特標題字總數: %1,已篩選: %2 + + + Save headwords to file + 將標題字儲存成檔案 + + + Text files (*.txt);;All files (*.*) + 文字檔 (*.txt);;所有檔案 (*.*) + + + Export headwords... + 匯出標題字... + + + Cancel + 取消 + + + Help @@ -403,40 +513,49 @@ DictInfo Total articles: - 文章總數: + 條目總數: Translates from: - 詞條語言: + 翻譯自: Total words: - 詞條總數: + 總字數: Translates to: - 釋義語言: + 翻譯至: Files comprising this dictionary: - 此詞典包含的檔案: + 此字典包含的檔案: Description: - + 描述: Open folder - + 打開資料夾 Edit dictionary - + 編輯字典 Edit the dictionary via command: %1 - + 以指令編輯字典: +%1 + + + Show all unique dictionary headwords + 顯示所有獨特的字典標題字 + + + Headwords + 標題字 @@ -447,10 +566,68 @@ + DictServer + + Url: + Url: + + + Databases: + 資料庫: + + + Search strategies: + 搜尋策略: + + + Server databases + + + + + DictServersModel + + Enabled + 已啟用 + + + Name + 名稱 + + + Address + 位址 + + + Databases + 資料庫 + + + Icon + 圖示 + + + Comma-delimited list of databases +(empty string or "*" matches all databases) + 資料庫的逗號分隔列表 +(空字串或"*"複合所有的資料庫) + + + Strategies + 策略 + + + Comma-delimited list of search strategies +(empty string mean "prefix" strategy) + 搜尋策略的的逗號分隔列表 +(空字串代表 "prefix" 策略) + + + DictionaryBar Dictionary Bar - 詞典欄 + 字典欄 Edit this group @@ -458,34 +635,38 @@ Dictionary info - + 字典資訊 Edit dictionary - + 編輯字典 &Dictionary Bar - + 字典欄(&D) Open dictionary folder - + 打開字典資料夾 Extended menu with all dictionaries... - + 展開所有字典的選單... + + + Dictionary headwords + 字典標頭 EditDictionaries &Dictionaries - 詞典(&D) + 字典(&D) Dictionaries - 詞典 + 字典 Accept @@ -497,11 +678,11 @@ Sources changed - 詞典檔案所在資料夾已變更 + 字典檔案所在資料夾已變更 &Sources - 詞典來源(&S) + 字典來源(&S) &Groups @@ -509,14 +690,83 @@ Some sources were changed. Would you like to accept the changes? - 某些詞典檔案的所在資料夾已變更,是否接受變更? + 某些字典檔案的所在資料夾已變更,是否接受變更? ExternalViewer the viewer program name is empty - + 檢視程式的名稱是空白的 + + + + FTS::FtsIndexing + + None + + + + + FTS::FullTextSearchDialog + + Full-text search + 全文搜尋 + + + Whole words + 全字(Whoe words) + + + Plain text + 純文字 + + + Wildcards + 萬用字元 + + + RegExp + 正規表達式 + + + Max distance between words (%1-%2): + 文字間最大距離 (%1-%2) + + + Max articles per dictionary (%1-%2): + 每個字典的條目上限(%1-%2): + + + Articles found: + 找到的條目: + + + Now indexing: + 索引中: + + + The search line must contains at least one word containing + 搜尋列至少必須包括 + + + or more symbols + 或更多文字 + + + No dictionaries for full-text search + 沒有字典可用於全文搜尋 + + + CJK symbols in search string are not compatible with search modes "Whole words" and "Plain text" + 搜尋的字串中,如果有中日韓(CJK)字母,就無法相容"全字(Whole words)" 和 "純文字"的搜尋模式 + + + + FTS::Indexing + + None + @@ -547,7 +797,54 @@ Go to Edit|Dictionaries|Sources|Forvo and apply for our own API key to make this error disappear. - 進入 編輯|詞典|詞典來源|Forvo, 申請自己的 API-key 來消除此錯誤。 + 進入 編輯|字典|字典來源|Forvo, 申請自己的 API-key 來消除此錯誤。 + + + + FullTextSearchDialog + + Search + 搜尋 + + + Match case + 符合大小寫 + + + Mode: + 模式: + + + Articles found: + 找到條目: + + + Available dictionaries in group: + 群組中可用的字典: + + + Wait for indexing: + 等候索引: + + + Total: + 總共: + + + Indexed: + 已索引: + + + Now indexing: None + 正在索引:無 + + + Cancel + 取消 + + + Help + @@ -602,7 +899,7 @@ Tab 2 - 標籤頁 2 + 分頁 2 Are you sure you want to remove all the groups? @@ -626,7 +923,7 @@ Dictionaries available: - 可用詞典: + 可用字典: &Add group @@ -638,19 +935,19 @@ Create new dictionary group - 建立新的詞典群組 + 建立新的字典群組 Drag&drop dictionaries to and from the groups, move them inside the groups, reorder the groups using your mouse. - 可以用滑鼠拖曳詞典以改變其群組設定或排序。(&D) + 可以用滑鼠拖曳字典以改變其群組設定或排序(&D)。 Rename current dictionary group - 重新命名當前詞典群組 + 重新命名當前字典群組 Remove current dictionary group - 移除詞典群組 + 移除字典群組 Give a name for the new group: @@ -662,11 +959,11 @@ Remove selected dictionaries from group (Del) - 將所選詞典從群組中移除(Del) + 將所選字典從群組中移除(Del) Add selected dictionaries to group (Ins) - 將所選詞典新增進群組(Ins) + 將所選字典新增進群組(Ins) &Remove group @@ -682,7 +979,7 @@ Remove all dictionary groups - 移除全部詞典群組 + 移除全部字典群組 Create language-based groups @@ -692,28 +989,75 @@ Auto groups 自動分組 + + Group tabs + 群組分頁 + + + Open groups list + 打開字典群組列表 + + + + Help::HelpWindow + + GoldenDict help + + + + Home + + + + Back + + + + Forward + + + + Zoom In + 放大 + + + Zoom Out + 縮小 + + + Normal Size + 正常大小 + + + Content + + + + Index + + HistoryPaneWidget &Delete Selected - + 刪除選擇的部分(&D) Copy Selected - + 複製選擇的部分 History: - + 歷史紀錄: %1/%2 - + %1/%2 History size: %1 entries out of maximum %2 - + 歷史紀錄的大小: %1 個條目,最多 %2 個 @@ -742,7 +1086,7 @@ Initializing Dictionary Name - 詞典名稱 + 字典名稱 GoldenDict - Initializing @@ -750,7 +1094,7 @@ Please wait while indexing dictionary - 正在索引詞典,請稍候 + 正在索引字典,請稍候 Please wait... @@ -1341,7 +1685,7 @@ Chinese - 漢語 + 中文 Chuvash @@ -1501,81 +1845,81 @@ Traditional Chinese - + 繁體中文 Simplified Chinese - + 簡體中文 Other - + 其他 Other Simplified Chinese dialects - + 其他簡體中文方言 Other Traditional Chinese dialects - + 其他繁體中文方言 Other Eastern-European languages - + 其他東歐語言 Other Western-European languages - + 其他西歐語言 Other Russian languages - + 其他俄羅斯文 Other Japanese languages - + 其他日文 Other Baltic languages - + 其他波羅的海語言 Other Greek languages - + 其他希臘文 Other Korean dialects - + 其他韓文方言 Other Turkish dialects - + 其他土耳其方言 Other Thai dialects - + 其他泰文方言 Tamazight - + 塔馬齊格特語 Lojban - + 邏輯語 LoadDictionaries Error loading dictionaries - 讀取詞典出錯 + 讀取字典時出錯 Main Error in configuration file. Continue with default settings? - + 設定檔有問題,要使用預設的設定嗎? @@ -1590,7 +1934,7 @@ F3 - F3 + F3 F4 @@ -1610,7 +1954,7 @@ %1 dictionaries, %2 articles, %3 words - 詞典數:%1,文章數:%2,詞條數:%3 + 字典數:%1,條目數:%2,單字數:%3 &Edit @@ -1646,7 +1990,7 @@ Can't save article: %1 - 無法儲存文章:%1 + 無法儲存條目:%1 Zoom In @@ -1654,7 +1998,7 @@ &Dictionaries... - 詞典...(&D) + 字典...(&D) &About @@ -1670,11 +2014,11 @@ &Save Article - 儲存文章(&S) + 儲存條目(&S) Save Article As - 文章另存新檔 + 條目另存新檔 Ctrl+P @@ -1767,7 +2111,9 @@ Loading... - 載入中…… + 載入中 + + (untitled) @@ -1775,7 +2121,7 @@ &Preferences... - 選項...(&P) + 偏好設定...(&P) Html files (*.html *.htm) @@ -1791,7 +2137,7 @@ Save Article - 儲存文章 + 儲存條目 Skip This Release @@ -1807,7 +2153,7 @@ Print Article - 列印文章 + 列印條目 No printer is available. Please install one first. @@ -1823,7 +2169,7 @@ Show Names in Dictionary Bar - 在詞典欄中顯示詞典名稱 + 在字典欄中顯示字典名稱 H&istory @@ -1851,190 +2197,224 @@ Close current tab - 關閉當前標籤頁 + 關閉當前分頁 Close all tabs - 關閉所有標籤頁 + 關閉所有分頁 Close all tabs except current - 關閉其它標籤頁 + 關閉其它分頁 Opened tabs - 已開啟的標籤頁 + 已開啟的分頁 New Tab - + 新分頁 Ctrl+T - + Ctrl+T &Configuration Folder - + 設定檔資料夾(&C) &Menubar - + 選單列(&M) Found in Dictionaries: - + 在下列字典中找到: Open Tabs List - + 打開分頁列表 %1 - %2 - + %1 - %2 You have chosen to hide a menubar. Use %1 to show it back. - + 您已隱藏選單列,可使用 %1 來顯示選單列。 Ctrl+M - + Ctrl+M &Show - + 顯示(&S) &Export - + 匯出(&E) &Hide - + 隱藏(&H) Export history to file - + 匯出歷史紀錄 Text files (*.txt);;All files (*.*) - + 文字檔 (*.txt);;所有檔案 (*.*) History export complete - + 成功匯出歷史紀錄 Export error: - + 匯出失敗: Ctrl+H - + Ctrl+H &Import - + 匯入(&I) Import history from file - + 匯入歷史紀錄 Import error: invalid data in file - + 匯入失敗: 檔案中無效的日期 History import complete - + 成功匯入歷史紀錄 Import error: - + 匯入失敗: Dictionary info - + 字典資訊 Edit dictionary - + 編輯字典 &Search Pane - + 搜尋列(&S) &Results Navigation Pane - + 結果導覽列(&R) Print Pre&view - + 預覽列印(&v) &Rescan Files - + 重新掃描檔案(&R) &New Tab - + 新分頁(&N) &Always on Top - + 最上層顯示(&A) Always on Top - + 最上層顯示 Ctrl+O - + Ctrl+O Menu Button - + 選單按鈕 Show Names in Dictionary &Bar - + 在字典列中顯示字典名稱(&B) Show Small Icons in &Toolbars - + 在工具列中顯示小圖示(&T) &Navigation - + 導覽(&N) The main window is set to be always on top. - + 主視窗設定為最上層顯示。 &History Pane - + 歷史紀錄(&H) Accessibility API is not enabled - + 未啟用協助存取 API Article, Complete (*.html) - + 條目,完整 (*.html) Article, HTML Only (*.html) - + 條目,僅HTML部分 (*.html) Saving article... - + 儲存條目... Open dictionary folder + 打開字典資料夾 + + + Dictionary headwords + 字典標頭 + + + String to search in dictionaries. The wildcards '*', '?' and sets of symbols '[...]' are allowed. +To find '*', '?', '[', ']' symbols use '\*', '\?', '\[', '\]' respectively + 欲搜尋的字串。可使用萬用字元 '*','?' 和字元集合'[...]'。 +若想尋找'*'、'?'、'['、']'等符號,請分別使用 '*'、'?'、'['、']' + + + Search + 搜尋 + + + Search in page + 在頁面中尋找 + + + Ctrl+F + Ctrl+F + + + Full-text search + 全文搜尋 + + + Ctrl+Shift+F + Ctrl+Shift+F + + + GoldenDict reference @@ -2042,11 +2422,11 @@ Mdx::MdxArticleRequest Dictionary file was tampered or corrupted - + 字典檔案已遭竄改或已損壞 Failed loading article from %1, reason: %2 - + 從 %1 讀取條目時失敗,原因是: %2 @@ -2079,14 +2459,14 @@ Icon - + 圖示 OrderAndProps ... - ... + ... Form @@ -2094,7 +2474,7 @@ Inactive (disabled) dictionaries: - 未啟用(已禁用)的詞典: + 未啟用(已禁用)的字典: Name: @@ -2102,7 +2482,7 @@ Total articles: - 文章總數: + 條目總數: Translates from: @@ -2118,30 +2498,38 @@ Adjust the order by dragging and dropping items in it. Drop dictionaries to the inactive group to disable their use. - 可以透過拖曳改變項目的排序。將詞典放入未啟用的群組以禁用。 + 可以透過拖曳改變項目的排序。將字典放入未啟用的群組以禁用。 Dictionary order: - 詞典排序: + 字典排序: Files comprising this dictionary: - 此詞典包含的檔案: + 此字典包含的檔案: Dictionary information - 詞典資訊 + 字典資訊 Description: - + 描述 Sort by name - + 依名稱排序 Sort by languages + 依語言排序 + + + Dictionary headwords + 字典標頭 + + + Dictionaries active: %1, inactive: %2 @@ -2214,8 +2602,8 @@ Normally, opening a new tab switches to it immediately. With this on however, new tabs will be opened without switching to them. - 在正常情況下,開啟一個新標籤頁將會自動將其選定。 -啟用此選項將會在開啟新標籤頁時不自動選定。 + 在正常情況下,會自動跳到開啟的新分頁。 +啟用此選項後,不會自動跳至開啟的新分頁。 Use proxy server @@ -2235,7 +2623,7 @@ Auto-pronounce words in main window - 自動朗讀主視窗中的詞條 + 自動朗讀主視窗中的單字 Start with system @@ -2247,7 +2635,7 @@ Tabbed browsing - 標籤頁瀏覽 + 分頁瀏覽 Right Shift only @@ -2279,7 +2667,7 @@ Open new tabs in background - 在後台開啟新標籤頁 + 在背景開啟新分頁 &Network @@ -2312,7 +2700,7 @@ Auto-pronounce words in scan popup - 自動朗讀螢幕取詞彈出視窗中的詞條 + 自動朗讀螢幕取詞彈出視窗中的單字 Enable scan popup functionality @@ -2320,7 +2708,7 @@ Open new tabs after the current one - 在當前頁之後開啟新標籤頁 + 在當前頁之後開啟新分頁 Restart the program to apply the language change. @@ -2335,8 +2723,8 @@ you point your mouse on any word on the screen (Windows) or select any word with mouse (Linux). When enabled, you can switch it on and off from main window or tray icon. - 啟用後,用滑鼠指標指向一個單字(Windows下),或是 -選定一個單字(Linux下)的時候,都會出現一個蹦現式 + 啟用後,用滑鼠游標指向一個單字(Windows下),或是 +選定一個單字(Linux下)的時候,都會出現一個彈出式 視窗來顯示釋義。啟用此功能後,可以從主視窗或系統 匣功能表中選擇是否啟動螢幕取詞功能。 @@ -2348,8 +2736,8 @@ With this on, new tabs are opened just after the current, active one. Otherwise they are added to be the last ones. - 開啟此選項,新標籤頁將會在當前頁面後開啟;不 -開啟此選項,新標籤頁將會自動新增到末尾。 + 開啟此選項,新分頁將會在當前頁面後開啟;不 +開啟此選項,新分頁將會自動新增到末尾。 Close to system tray @@ -2419,7 +2807,7 @@ Preferences - 選項 + 偏好設定 Keys may also be pressed afterwards, within @@ -2435,7 +2823,7 @@ The hotkeys are global and work from any program and within any context as long as GoldenDict is running in background. - 熱鍵均為全域鍵,只要 GoldenDict 在後台執行,熱鍵就可以在任何程式中使用。 + 熱鍵均為全域鍵,只要 GoldenDict 在背景執行,熱鍵就可以在任何程式中使用。 Right Ctrl @@ -2492,8 +2880,8 @@ Enabling this would make GoldenDict block most advertisements by disallowing content (images, frames) not originating from the site you are browsing. If some site breaks because of this, try disabling this. - 啟用此選項後,GoldenDict 將會禁止載入你所瀏覽的站台中來自其它站台的 -內容(圖片、框架)以便封殺廣告。如果某些網點因此而出現錯誤,可以試著禁 + 啟用此選項後,GoldenDict 將會阻擋你所瀏覽的站台中來自其它站台的 +內容(圖片、框架)以便封殺廣告。如果某些網站因此而出現錯誤,可以試著禁 用此選項。 @@ -2544,193 +2932,233 @@ Select this option if you don't want to see the main tab bar when only a single tab is opened. - + 啟用此選項會使主視窗在只有一個分頁時隱藏分頁列。 Hide single tab - + 隱藏單一分頁 Normally, pressing ESC key moves focus to the translation line. With this on however, it will hide the main window. - + 一般而言,按下 ESC 鍵會將游標移至翻譯列。啟用此選項後,按下 ESC 鍵會隱藏主視窗。 ESC key hides main window - + 使用 ESC 鍵隱藏主視窗 Send translated word to main window instead of to show it in popup window - + 將翻譯的文字傳送至主視窗,而非顯示在彈出式視窗中 Send translated word to main window - + 將翻譯傳送至主視窗 Enabling this would allow to listen to sound pronunciations from online dictionaries that rely on Flash or other web plugins. Plugin must be installed for this option to work. - + 啟用此選項後才能聆聽需要 Flash 或其他網路擴充程式才能撥放的線上字典的發音。 +需先安裝擴充程式,本選項才能順利運作。 Enable web plugins - + 啟用網路擴充程式 Ad&vanced - + 進階設定(&v) ScanPopup extra technologies - + 額外的螢幕取詞技術 Try to use IAccessibleEx technology to retrieve word under cursor. This technology works only with some programs that support it (for example Internet Explorer 9). It is not needed to select this option if you don't use such programs. - + 嘗試使用 IAccessibleEx 技術來取得滑鼠游標下的單字。 +本技術僅適用支援該技術的程式(如 Internet Explorer 9 )。 +若您不使用這類程式的話,就不須勾選此選項。 Use &IAccessibleEx - + 啟用 &IAccessibleEx Try to use UI Automation technology to retrieve word under cursor. This technology works only with some programs that support it. It is not needed to select this option if you don't use such programs. - + 嘗試使用 UI Automation 技術來取得滑鼠游標下的單字。 +本技術僅適用支援該技術的程式。 +若您不使用這類程式的話,就不須勾選此選項。 Use &UIAutomation - + 啟用 &UIAutomation Try to use special GoldenDict message to retrieve word under cursor. This technology works only with some programs that support it. It is not needed to select this option if you don't use such programs. - + 嘗試使用特別的 GoldenDict 訊息來取得滑鼠游標下的單字。 +本技術僅適用支援該技術的程式。 +若您不使用這類程式的話,就不須勾選此選項。 Use &GoldenDict message - + 啟用 &GoldenDict 訊息 Ctrl-Tab navigates tabs in MRU order - + Ctrl-Tab 依照 MRU 順序瀏覽分頁 Babylon - + Babylon History - + 歷史紀錄 Turn this option on to store history of the translated words - + 啟用此選項以儲存查詢單字的歷史紀錄 Store &history - + 儲存歷史紀錄(&h) Articles - + 條目 Turn this option on to always expand optional parts of articles - + 啟用此選項以後會打開條目額外的部分 Expand optional &parts - + 展開額外的部分(&p) Turn this option on if you want to select words by single mouse click - + 啟用此選項後只要按一下滑鼠左鍵就可選擇單字 Select word by single click - + 按一下就選字 Add-on style: - + 擴充風格: Specify the maximum number of entries to keep in history. - + 設定歷史紀錄的最大條目數量。 Maximum history size: - + 歷史紀錄最大為: History saving interval. If set to 0 history will be saved only during exit. - + 多久一次儲存歷史紀錄。如果設定為 0 就代表只在離開時儲存。 Save every - + minutes - + 分鐘儲存一次 Modern - + 現代 Lingoes - + Lingoes Lingoes-Blue - + Lingoes-Blue Play audio files via FFmpeg(libav) and libao - + 使用 FFmpeg(libav) 和 libao 播放音訊檔案。 Use internal player - + 使用內部播放器 Some sites detect GoldenDict via HTTP headers and block the requests. Enable this option to workaround the problem. - + 有些網站會偵測 GoldenDict 的HTTP 標頭檔,所以阻擋其請求。 +啟用此選項能應付此問題。 Do not identify GoldenDict in HTTP headers - + 在 HTTP 標頭檔中不要顯示 GoldenDict Select this option to automatic collapse big articles - + 啟用此選項能自動收縮較長的條目 Collapse articles more than - + 收縮超過 symbols - + 個符號的條目 Adjust this value to avoid huge context menus. - + 調整此數值來避免超長的字典選單。 Context menu dictionaries limit: - + 內文選單的字典上限: Articles longer than this size will be collapsed + 超過此大小的條目將被收縮 + + + System proxy + 系統的代理伺服器 + + + Custom proxy + 自訂代理伺服器 + + + Custom settings + 自訂設定 + + + Full-text search + 全文搜尋 + + + Allow full-text search for: + 允許下列的全文搜尋: + + + Don't search in dictionaries containing more than + 不要在超過 + + + articles (0 - unlimited) + 條項目的字典中尋找(0 - 不限) + + + Help language @@ -2738,170 +3166,170 @@ ProgramTypeEditor Audio - + 音訊 Plain Text - + 純文字 Html - + Html Prefix Match - + 前綴符合 Unknown - + 未知 Programs::RunInstance No program name was given. - + 未提供程式名稱。 The program has crashed. - + 該程式已當掉。 The program has returned exit code %1. - + 該程式 returned exit code %1。 ProgramsModel Enabled - 已啟用 + 已啟用 Type - + 類型 Name - 名稱 + 名稱 Command Line - + 命令列 Icon - + 圖示 QObject Article loading error - + 條目讀取失敗 Article decoding error - + 條目解碼失敗 avformat_alloc_context() failed. - + avformat_alloc_context() failed. av_malloc() failed. - + av_malloc() failed. avio_alloc_context() failed. - + avio_alloc_context() failed. avformat_open_input() failed: %1. - + avformat_open_input() failed: %1. avformat_find_stream_info() failed: %1. - + avformat_find_stream_info() failed: %1. Could not find audio stream. - + 找不到音訊串流。 Codec [id: %1] not found. - + 找不到 Codec [id: %1] avcodec_open2() failed: %1. - + avcodec_open2() failed: %1. Cannot find usable audio output device. - + 找不到可用的音訊輸出裝置。 Unsupported sample format. - + 不支援的樣本格式。 ao_open_live() failed: - + ao_open_live() failed: No driver. - + 沒有驅動程式。 This driver is not a live output device. - + 本驅動程式不是有效的輸出裝置。 A valid option key has an invalid value. - + A valid option key has an invalid value. Cannot open the device: %1, channels: %2, rate: %3, bits: %4. - + 無法開啟裝置: %1, 頻道: %2, rate: %3, bits: %4. Unknown error. - + 未知的錯誤。 avcodec_alloc_frame() failed. - + avcodec_alloc_frame() failed. QuickFilterLine Dictionary search/filter (Ctrl+F) - + 字典搜尋/篩選(Ctrl+F) Quick Search - + 快速搜尋 Clear Search - + 清除搜尋 ResourceToSaveHandler ERROR: %1 - + 錯誤: %1 Resource saving error: - + 資源儲存錯誤: The referenced resource failed to download. - 所引用的資源下載失敗。 + 所引用的資源下載失敗。 @@ -2950,11 +3378,11 @@ Pronounce Word (Alt+S) - 朗讀詞條(Alt+S) + 單字發音(Alt+S) Shows or hides the dictionary bar - 顯示或隱藏詞典欄 + 顯示或隱藏字典欄 Use this to pin down the window so it would stay on screen, @@ -2963,19 +3391,19 @@ Send word to main window (Alt+W) - + 將單字傳送到主視窗 (Alt+W) Alt+W - + Alt+W Back - 回退 + 上一頁 Forward - 前進 + 下一頁 GoldenDict @@ -2983,7 +3411,7 @@ %1 - %2 - + %1 - %2 @@ -2998,7 +3426,7 @@ Icon - + 圖示 @@ -3138,7 +3566,7 @@ Paths to search for the dictionary files: - 詞典檔案所在資料夾: + 字典檔案所在資料夾: Confirm removal @@ -3164,7 +3592,7 @@ Add appropriate dictionaries to the bottoms of the appropriate groups to use them. 每個構詞法規則庫都會顯示為獨立的協助 -詞典。拼字檢查和拼字建議需要使用這些 +字典。拼字檢查和拼字建議需要使用這些 構詞法規則庫,請將其新增至相應群組的 最下面。 @@ -3239,132 +3667,141 @@ Programs - + 程式 Remove program <b>%1</b> from the list? - + 將程式<b>%1</b> 從清單移除? Belarusian transliteration - + 白俄羅斯文轉寫 Get your own key <a href="http://api.forvo.com/key/">here</a>, or leave blank to use the default one. - + 在<a href="http://api.forvo.com/key/">此</a>取得個人金鑰,或是留白以使用預設值。 Alternatively, use %GD1251% for CP1251, %GDISO1%...%GDISO16% for ISO 8859-1...ISO 8859-16 respectively, %GDBIG5% for Big-5, %GDBIG5HKSCS% for Big5-HKSCS, %GDGBK% for GBK and GB18030, %GDSHIFTJIS% for Shift-JIS. - + 此外,CP1251也可使用 %GD1251%, ISO 8859-1...ISO 8859-16 分別可使用 %GDISO1%...%GDISO16% +Big-5 使用%GDBIG5%,Big5-HKSCS 使用 %GDBIG5HKSCS% ,GBK 和 GB18030 使用 %GDGBK%,Shift-JIS 使用 %GDSHIFTJIS%。 Text to Speech - + 文字轉語音 Any external programs. A string %GDWORD% will be replaced with the query word. If such string is not presented, the word will be fed into standard input. - + 可使用任何外部程式。字串 %GDWORD% 代表查詢的單字。若未輸入該字串(即:只輸入程式名而未輸入 %GDWORD%),則會用查詢的單字當作程式的標準輸入。 + + + DICT servers + Dict 伺服器 + + + DICT servers: + DICT 伺服器 StylesComboBox None - + TextToSpeechSource Selected voice engines: - + 選擇音訊引擎: &Add - + 新增(&A) &Remove - 移除(&R) + 移除(&R) Preview - + 預覽 Available voice engines: - + 可用的音訊引擎: Text to be previewed: - + 預覽的文字: Type text to be previewed here. - + 請在此輸入預覽的文字。 &Preview - + 預覽(&P) No TTS voice available - + 沒有可用的文字轉語音聲音 Confirm removal - 確認移除 + 確認移除 Remove voice engine <b>%1</b> from the list? - + 確定要將<b>%1</b>音訊引擎從清單中移除嗎? Cannot find available TTS voice.<br>Please make sure that at least one TTS engine installed on your computer already. - + 找不到可用的文字轉語音聲音。<br>請檢查您的電腦是否已經安裝文字轉語音引擎。 Preferences - 選項 + 偏好設定 Volume: - + 音量: Rate: - + 速度: TranslateBox Type a word or phrase to search dictionaries - + 輸入單字或片語來查字典 Drop-down - + 下拉 VoiceEnginesModel Enabled - 已啟用 + 已啟用 Name - 名稱 + 名稱 Id - + Id Icon - + 圖示 @@ -3383,21 +3820,21 @@ Icon - + 圖示 WordFinder Failed to query some dictionaries. - 在某些詞典中進行查詢時失敗。 + 在某些字典中進行查詢時失敗。 WordList WARNING: %1 - 警告: %1 + 警告: %1 diff -Nru goldendict-1.5.0~git20131003/lsa.cc goldendict-1.5.0~git20150923/lsa.cc --- goldendict-1.5.0~git20131003/lsa.cc 2013-10-02 20:42:04.000000000 +0000 +++ goldendict-1.5.0~git20150923/lsa.cc 2015-09-23 08:26:24.000000000 +0000 @@ -9,7 +9,7 @@ #include "btreeidx.hh" #include "fsencoding.hh" #include "audiolink.hh" -#include "dprintf.hh" +#include "gddebug.hh" #include #include @@ -24,6 +24,7 @@ #include #include #include +#include namespace Lsa { @@ -316,10 +317,10 @@ /// This wraps around file operations struct ShiftedVorbis { - FILE * f; + QFile & f; size_t shift; - ShiftedVorbis( FILE * f_, size_t shift_ ): f( f_ ), shift( shift_ ) + ShiftedVorbis( QFile & f_, size_t shift_ ): f( f_ ), shift( shift_ ) {} static size_t read( void * ptr, size_t size, size_t nmemb, void * datasource ); @@ -334,7 +335,7 @@ { ShiftedVorbis * sv = ( ShiftedVorbis * ) datasource; - return fread( ptr, size, nmemb, sv->f ); + return sv->f.read( reinterpret_cast( ptr ), size * nmemb ); } int ShiftedVorbis::seek( void * datasource, ogg_int64_t offset, int whence ) @@ -344,13 +345,19 @@ if ( whence == SEEK_SET ) offset += sv->shift; - return fseek( sv->f, offset, whence ); + if( whence == SEEK_CUR ) + offset += sv->f.pos(); + + if( whence == SEEK_END ) + offset += sv->f.size(); + + return sv->f.seek( offset ); } long ShiftedVorbis::tell( void * datasource ) { ShiftedVorbis * sv = ( ShiftedVorbis * ) datasource; - long result = ftell( sv->f ); + long result = sv->f.pos(); if ( result != -1 ) result -= sv->shift; @@ -470,7 +477,7 @@ if ( result > left ) { - FDPRINTF( stderr, "Warning: Vorbis decode returned more data than requested.\n" ); + GD_FDPRINTF( stderr, "Warning: Vorbis decode returned more data than requested.\n" ); result = left; } @@ -548,7 +555,7 @@ { // Building the index - qDebug( "Lsa: Building the index for dictionary: %s\n", i->c_str() ); + gdDebug( "Lsa: Building the index for dictionary: %s\n", i->c_str() ); initializing.indexingDictionary( FsEncoding::basename( *i ) ); @@ -568,7 +575,7 @@ /// XXX handle big-endian machines here! uint32_t entriesCount = f.read< uint32_t >(); - DPRINTF( "%s: %u entries\n", i->c_str(), entriesCount ); + GD_DPRINTF( "%s: %u entries\n", i->c_str(), entriesCount ); idxHeader.soundsCount = entriesCount; @@ -584,7 +591,7 @@ // Remove the extension, no need for that in the index e.name = stripExtension( e.name ); - DPRINTF( "Read filename %s (%u at %u)<\n", e.name.c_str(), e.samplesLength, e.samplesOffset ); + GD_DPRINTF( "Read filename %s (%u at %u)<\n", e.name.c_str(), e.samplesLength, e.samplesOffset ); // Insert new entry into an index @@ -625,7 +632,7 @@ } catch( std::exception & e ) { - qWarning( "Lingvo's LSA reading failed: %s, error: %s\n", + gdWarning( "Lingvo's LSA reading failed: %s, error: %s\n", i->c_str(), e.what() ); } } diff -Nru goldendict-1.5.0~git20131003/maclibs/include/eb/appendix.h goldendict-1.5.0~git20150923/maclibs/include/eb/appendix.h --- goldendict-1.5.0~git20131003/maclibs/include/eb/appendix.h 1970-01-01 00:00:00.000000000 +0000 +++ goldendict-1.5.0~git20150923/maclibs/include/eb/appendix.h 2015-09-23 08:26:24.000000000 +0000 @@ -0,0 +1,100 @@ +/* -*- C -*- + * Copyright (c) 1997-2006 Motoyuki Kasahara + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the project nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE PROJECT AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE PROJECT OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#ifndef EB_APPENDIX_H +#define EB_APPENDIX_H + +#ifdef __cplusplus +extern "C" { +#endif + +#ifdef EB_BUILD_LIBRARY +#include "eb.h" +#else +#include +#endif + +/* + * Function declarations. + */ +/* appendix.c */ +void eb_initialize_appendix(EB_Appendix *appendix); +void eb_finalize_appendix(EB_Appendix *appendix); +EB_Error_Code eb_bind_appendix(EB_Appendix *appendix, const char *path); +int eb_is_appendix_bound(EB_Appendix *appendix); +EB_Error_Code eb_appendix_path(EB_Appendix *appendix, char *path); + +/* appsub.c */ +EB_Error_Code eb_load_all_appendix_subbooks(EB_Appendix *appendix); +EB_Error_Code eb_appendix_subbook_list(EB_Appendix *appendix, + EB_Subbook_Code *subbook_list, int *subbook_count); +EB_Error_Code eb_appendix_subbook(EB_Appendix *appendix, + EB_Subbook_Code *subbook_code); +EB_Error_Code eb_appendix_subbook_directory(EB_Appendix *appendix, + char *directory); +EB_Error_Code eb_appendix_subbook_directory2(EB_Appendix *appendix, + EB_Subbook_Code subbook_code, char *directory); +EB_Error_Code eb_set_appendix_subbook(EB_Appendix *appendix, + EB_Subbook_Code subbook_code); +void eb_unset_appendix_subbook(EB_Appendix *appendix); + +/* narwalt.c */ +int eb_have_narrow_alt(EB_Appendix *appendix); +EB_Error_Code eb_narrow_alt_start(EB_Appendix *appendix, int *start); +EB_Error_Code eb_narrow_alt_end(EB_Appendix *appendix, int *end); +EB_Error_Code eb_narrow_alt_character_text(EB_Appendix *appendix, + int character_number, char *text); +EB_Error_Code eb_forward_narrow_alt_character(EB_Appendix *appendix, + int n, int *character_number); +EB_Error_Code eb_backward_narrow_alt_character(EB_Appendix *appendix, + int n, int *character_number); + +/* stopcode.c */ +int eb_have_stop_code(EB_Appendix *appendix); +EB_Error_Code eb_stop_code(EB_Appendix *appendix, int *); + +/* widealt.c */ +int eb_have_wide_alt(EB_Appendix *appendix); +EB_Error_Code eb_wide_alt_start(EB_Appendix *appendix, int *start); +EB_Error_Code eb_wide_alt_end(EB_Appendix *appendix, int *end); +EB_Error_Code eb_wide_alt_character_text(EB_Appendix *appendix, + int character_number, char *text); +EB_Error_Code eb_forward_wide_alt_character(EB_Appendix *appendix, int n, + int *character_number); +EB_Error_Code eb_backward_wide_alt_character(EB_Appendix *appendix, int n, + int *character_number); + +/* for backward compatibility */ +#define eb_suspend_appendix eb_unset_appendix_subbook +#define eb_initialize_all_appendix_subbooks eb_load_all_appendix_subbooks + +#ifdef __cplusplus +} +#endif + +#endif /* not EB_APPENDIX_H */ diff -Nru goldendict-1.5.0~git20131003/maclibs/include/eb/binary.h goldendict-1.5.0~git20150923/maclibs/include/eb/binary.h --- goldendict-1.5.0~git20131003/maclibs/include/eb/binary.h 1970-01-01 00:00:00.000000000 +0000 +++ goldendict-1.5.0~git20150923/maclibs/include/eb/binary.h 2015-09-23 08:26:24.000000000 +0000 @@ -0,0 +1,73 @@ +/* -*- C -*- + * Copyright (c) 2001-2006 Motoyuki Kasahara + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the project nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE PROJECT AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE PROJECT OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#ifndef EB_BINARY_H +#define EB_BINARY_H + +#ifdef __cplusplus +extern "C" { +#endif + +#include + +#ifdef EB_BUILD_LIBRARY +#include "defs.h" +#else +#include +#endif + +/* + * Function declarations. + */ +/* binary.c */ +EB_Error_Code eb_set_binary_mono_graphic(EB_Book *book, + const EB_Position *position, int width, int height); +EB_Error_Code eb_set_binary_gray_graphic(EB_Book *book, + const EB_Position *position, int width, int height); +EB_Error_Code eb_set_binary_wave(EB_Book *book, + const EB_Position *start_position, const EB_Position *end_position); +EB_Error_Code eb_set_binary_color_graphic(EB_Book *book, + const EB_Position *position); +EB_Error_Code eb_set_binary_mpeg(EB_Book *book, const unsigned int *argv); +EB_Error_Code eb_read_binary(EB_Book *book, size_t binary_max_length, + char *binary, ssize_t *binary_length); +void eb_unset_binary(EB_Book *book); + +/* filename.c */ +EB_Error_Code eb_compose_movie_file_name(const unsigned int *argv, + char *composed_file_name); +EB_Error_Code eb_compose_movie_path_name(EB_Book *book, + const unsigned int *argv, char *composed_path_name); +EB_Error_Code eb_decompose_movie_file_name(unsigned int *argv, + const char *composed_file_name); + +#ifdef __cplusplus +} +#endif + +#endif /* not EB_BINARY_H */ diff -Nru goldendict-1.5.0~git20131003/maclibs/include/eb/booklist.h goldendict-1.5.0~git20150923/maclibs/include/eb/booklist.h --- goldendict-1.5.0~git20131003/maclibs/include/eb/booklist.h 1970-01-01 00:00:00.000000000 +0000 +++ goldendict-1.5.0~git20150923/maclibs/include/eb/booklist.h 2015-09-23 08:26:24.000000000 +0000 @@ -0,0 +1,60 @@ +/* -*- C -*- + * Copyright (c) 1997-2006 Motoyuki Kasahara + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the project nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE PROJECT AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE PROJECT OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#ifndef EB_BOOKLIST_H +#define EB_BOOKLIST_H + +#ifdef __cplusplus +extern "C" { +#endif + +#ifdef EB_BUILD_LIBRARY +#include "eb.h" +#else +#include +#endif + +/* + * Function declarations. + */ +/* booklist.c */ +void eb_initialize_booklist(EB_BookList *booklist); +void eb_finalize_booklist(EB_BookList *booklist); +EB_Error_Code eb_bind_booklist(EB_BookList *booklist, const char *path); +EB_Error_Code eb_booklist_book_count(EB_BookList *booklist, int *book_count); +EB_Error_Code eb_booklist_book_name(EB_BookList *booklist, int book_index, + char **book_name); +EB_Error_Code eb_booklist_book_title(EB_BookList *booklist, int book_index, + char **book_title); + + +#ifdef __cplusplus +} +#endif + +#endif /* not EB_BOOKLIST_H */ diff -Nru goldendict-1.5.0~git20131003/maclibs/include/eb/defs.h goldendict-1.5.0~git20150923/maclibs/include/eb/defs.h --- goldendict-1.5.0~git20131003/maclibs/include/eb/defs.h 1970-01-01 00:00:00.000000000 +0000 +++ goldendict-1.5.0~git20150923/maclibs/include/eb/defs.h 2015-09-23 08:26:24.000000000 +0000 @@ -0,0 +1,1040 @@ +/* -*- C -*- + * Copyright (c) 1997-2006 Motoyuki Kasahara + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the project nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE PROJECT AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE PROJECT OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#ifndef EB_DEFS_H +#define EB_DEFS_H + +#ifdef __cplusplus +extern "C" { +#endif + +#include +#include + +#ifdef EB_BUILD_LIBRARY +#include "sysdefs.h" +#include "zio.h" +#else +#include +#include +#endif + +#ifdef EB_ENABLE_PTHREAD +#include +#endif + +/* + * Disc code + */ +#define EB_DISC_EB 0 +#define EB_DISC_EPWING 1 +#define EB_DISC_INVALID -1 + +/* + * Character codes. + */ +#define EB_CHARCODE_ISO8859_1 1 +#define EB_CHARCODE_JISX0208 2 +#define EB_CHARCODE_JISX0208_GB2312 3 +#define EB_CHARCODE_INVALID -1 + +/* + * Special book ID for cache to represent "no cache data for any book". + */ +#define EB_BOOK_NONE -1 + +/* + * Special disc code, subbook code, multi search ID, and multi search + * entry ID, for representing error state. + */ +#define EB_SUBBOOK_INVALID -1 +#define EB_MULTI_INVALID -1 + +/* + * Size of a page (The term `page' means `block' in JIS X 4081). + */ +#define EB_SIZE_PAGE 2048 + +/* + * Maximum length of a word to be searched. + */ +#define EB_MAX_WORD_LENGTH 255 + +/* + * Maximum length of an EB* book title. + */ +#define EB_MAX_EB_TITLE_LENGTH 30 + +/* + * Maximum length of an EPWING book title. + */ +#define EB_MAX_EPWING_TITLE_LENGTH 80 + +/* + * Maximum length of a book title. + */ +#define EB_MAX_TITLE_LENGTH 80 + +/* + * Maximum length of a word to be searched. + */ +#if defined(PATH_MAX) +#define EB_MAX_PATH_LENGTH PATH_MAX +#elif defined(MAXPATHLEN) +#define EB_MAX_PATH_LENGTH MAXPATHLEN +#else +#define EB_MAX_PATH_LENGTH 1024 +#endif + +/* + * Maximum length of a directory name. + */ +#define EB_MAX_DIRECTORY_NAME_LENGTH 8 + +/* + * Maximum length of a file name under a certain directory. + * prefix(8 chars) + '.' + suffix(3 chars) + ';' + digit(1 char) + */ +#define EB_MAX_FILE_NAME_LENGTH 14 + +/* + * Maximum length of a label for multi-search entry. + */ +#define EB_MAX_MULTI_LABEL_LENGTH 30 + +/* + * Maximum length of alternation text string for a private character. + */ +#define EB_MAX_ALTERNATION_TEXT_LENGTH 31 + +/* + * Maximum length of title for multi search. + */ +#define EB_MAX_MULTI_TITLE_LENGTH 32 + +/* + * Maximum number of font heights in a subbok. + */ +#define EB_MAX_FONTS 4 + +/* + * Maximum number of subbooks in a book. + */ +#define EB_MAX_SUBBOOKS 50 + +/* + * Maximum number of multi-search types in a subbook. + */ +#define EB_MAX_MULTI_SEARCHES 10 + +/* + * Maximum number of entries in a multi-search. + */ +#define EB_MAX_MULTI_ENTRIES 5 + +/* + * Maximum number of entries in a keyword search. + */ +#define EB_MAX_KEYWORDS EB_MAX_MULTI_ENTRIES + +/* + * Maximum number of entries in a cross search. + */ +#define EB_MAX_CROSS_ENTRIES EB_MAX_MULTI_ENTRIES + +/* + * Maximum number of characters for alternation cache. + */ +#define EB_MAX_ALTERNATION_CACHE 16 + +/* + * The number of text hooks. + */ +#define EB_NUMBER_OF_HOOKS 54 + +/* + * The number of search contexts required by a book. + */ +#define EB_NUMBER_OF_SEARCH_CONTEXTS EB_MAX_MULTI_ENTRIES + +/* + * Types for various codes. + */ +typedef int EB_Error_Code; +typedef int EB_Book_Code; +typedef int EB_Disc_Code; +typedef int EB_Case_Code; +typedef int EB_Suffix_Code; +typedef int EB_Character_Code; +typedef int EB_Font_Code; +typedef int EB_Word_Code; +typedef int EB_Subbook_Code; +typedef int EB_Index_Style_Code; +typedef int EB_Search_Code; +typedef int EB_Text_Code; +typedef int EB_Text_Status_Code; +typedef int EB_Multi_Search_Code; +typedef int EB_Hook_Code; +typedef int EB_Binary_Code; + +/* + * Typedef for Structures. + */ +#ifdef EB_ENABLE_PTHREAD +typedef struct EB_Lock_Struct EB_Lock; +#endif +typedef struct EB_Position_Struct EB_Position; +typedef struct EB_Alternation_Cache_Struct EB_Alternation_Cache; +typedef struct EB_Appendix_Subbook_Struct EB_Appendix_Subbook; +typedef struct EB_Appendix_Struct EB_Appendix; +typedef struct EB_Font_Struct EB_Font; +typedef struct EB_Search_Struct EB_Search; +typedef struct EB_Multi_Search_Struct EB_Multi_Search; +typedef struct EB_Subbook_Struct EB_Subbook; +typedef struct EB_Text_Context_Struct EB_Text_Context; +typedef struct EB_Binary_Context_Struct EB_Binary_Context; +typedef struct EB_Search_Context_Struct EB_Search_Context; +typedef struct EB_Book_Struct EB_Book; +typedef struct EB_Hit_Struct EB_Hit; +typedef struct EB_Hook_Struct EB_Hook; +typedef struct EB_Hookset_Struct EB_Hookset; +typedef struct EB_BookList_Entry EB_BookList_Entry; +typedef struct EB_BookList EB_BookList; + +/* + * Pthreads lock. + */ +#ifdef EB_ENABLE_PTHREAD +struct EB_Lock_Struct { + /* + * Lock count. (For emulating recursive lock). + */ + int lock_count; + + /* + * Mutex for `lock_count'. + */ + pthread_mutex_t lock_count_mutex; + + /* + * Mutex for struct entity. + */ + pthread_mutex_t entity_mutex; +}; +#endif /* EB_ENABLE_PTHREAD */ + +/* + * A pair of page and offset. + */ +struct EB_Position_Struct { + /* + * Page. (1, 2, 3 ...) + */ + int page; + + /* + * Offset in `page'. (0 ... 2047) + */ + int offset; +}; + +/* + * Chace of aternation text. + */ +struct EB_Alternation_Cache_Struct { + /* + * Character number. + */ + int character_number; + + /* + * Alternation string for `char_no'. + */ + char text[EB_MAX_ALTERNATION_TEXT_LENGTH + 1]; +}; + +/* + * An appendix for a subbook. + */ +struct EB_Appendix_Subbook_Struct { + + /* + * Initialization flag. + */ + int initialized; + + /* + * Subbook ID. + */ + EB_Subbook_Code code; + + /* + * Directory name. + */ + char directory_name[EB_MAX_DIRECTORY_NAME_LENGTH + 1]; + + /* + * Sub-directory name. (EPWING only) + */ + char data_directory_name[EB_MAX_DIRECTORY_NAME_LENGTH + 1]; + + /* + * File name. + */ + char file_name[EB_MAX_FILE_NAME_LENGTH + 1]; + + /* + * Character code of the book. + */ + EB_Character_Code character_code; + + /* + * Start character number of the narrow/wide font. + */ + int narrow_start; + int wide_start; + + /* + * End character number of the narrow/wide font. + */ + int narrow_end; + int wide_end; + + /* + * Start page number of the narrow/wide font. + */ + int narrow_page; + int wide_page; + + /* + * Stop code (first and second characters). + */ + int stop_code0; + int stop_code1; + + /* + * Compression Information for appendix file. + */ + Zio zio; +}; + +/* + * Additional resources for a book. + */ +struct EB_Appendix_Struct { + /* + * Book ID. + */ + EB_Book_Code code; + + /* + * Path of the book. + */ + char *path; + + /* + * The length of the path. + */ + size_t path_length; + + /* + * Disc type. EB (EB/EBG/EBXA/EBXA-C/S-EBXA) or EPWING. + */ + EB_Disc_Code disc_code; + + /* + * The number of subbooks the book has. + */ + int subbook_count; + + /* + * Subbook list. + */ + EB_Appendix_Subbook *subbooks; + + /* + * Current subbook. + */ + EB_Appendix_Subbook *subbook_current; + + /* + * ebnet socket file. + */ +#ifdef EB_ENABLE_EBNET + int ebnet_file; +#endif + + /* + * Lock. + */ +#ifdef EB_ENABLE_PTHREAD + EB_Lock lock; +#endif + + /* + * Cache table for alternation text. + */ + EB_Alternation_Cache narrow_cache[EB_MAX_ALTERNATION_CACHE]; + EB_Alternation_Cache wide_cache[EB_MAX_ALTERNATION_CACHE]; +}; + +/* + * A font in a subbook. + */ +struct EB_Font_Struct { + /* + * Font Code. + * This font is not available, if the code is EB_FONT_INVALID. + */ + EB_Font_Code font_code; + + /* + * Whether the object has been initialized. + */ + int initialized; + + /* + * Character numbers of the start and end of the font. + */ + int start; + int end; + + /* + * Page number of the start page of the font data. + * Used in EB* only. (In EPWING, it is alyways 1). + */ + int page; + + /* + * File name of the font. (EPWING only) + */ + char file_name[EB_MAX_FILE_NAME_LENGTH + 1]; + + /* + * Font data cache. + */ + char *glyphs; + + /* + * Compression Information. + */ + Zio zio; +}; + +/* + * Search methods in a subbook. + */ +struct EB_Search_Struct { + /* + * Index ID. + */ + int index_id; + + /* + * Page number of the start page of an index. + * This search method is not available, if `start_page' is 0, + */ + int start_page; + int end_page; + + /* + * Page number of the start page of candidates. + * (for multi search entry) + */ + int candidates_page; + + /* + * Index style flags. + */ + EB_Index_Style_Code katakana; + EB_Index_Style_Code lower; + EB_Index_Style_Code mark; + EB_Index_Style_Code long_vowel; + EB_Index_Style_Code double_consonant; + EB_Index_Style_Code contracted_sound; + EB_Index_Style_Code voiced_consonant; + EB_Index_Style_Code small_vowel; + EB_Index_Style_Code p_sound; + EB_Index_Style_Code space; + + /* + * Label. (for an entry in multi search) + */ + char label[EB_MAX_MULTI_LABEL_LENGTH + 1]; +}; + +/* + * A multi-search entry in a subbook. + */ +struct EB_Multi_Search_Struct { + /* + * Search method information. + */ + EB_Search search; + + /* + * Search title. (EPWING only) + */ + char title[EB_MAX_MULTI_TITLE_LENGTH + 1]; + + /* + * The number of entries the multi search has. + */ + int entry_count; + + /* + * List of Word entry information. + */ + EB_Search entries[EB_MAX_MULTI_ENTRIES]; +}; + +/* + * A subbook in a book. + */ +struct EB_Subbook_Struct { + /* + * Whether the object has been initialized. + */ + int initialized; + + /* + * Index page. + */ + int index_page; + + /* + * Subbook ID. + * This subbook is not available, if the code is EB_SUBBOOK_INVALID. + */ + EB_Subbook_Code code; + + /* + * File descriptor and compression information for text file. + */ + Zio text_zio; + + /* + * File descriptor and compression information for graphic file. + */ + Zio graphic_zio; + + /* + * File descriptor and compression information for sound file. + */ + Zio sound_zio; + + /* + * File descriptor and compression information for movie file. + */ + Zio movie_zio; + + /* + * Title of the subbook. + */ + char title[EB_MAX_TITLE_LENGTH + 1]; + + /* + * Subbook directory name. + */ + char directory_name[EB_MAX_DIRECTORY_NAME_LENGTH + 1]; + + /* + * Sub-directory names. (EPWING only) + */ + char data_directory_name[EB_MAX_DIRECTORY_NAME_LENGTH + 1]; + char gaiji_directory_name[EB_MAX_DIRECTORY_NAME_LENGTH + 1]; + char movie_directory_name[EB_MAX_DIRECTORY_NAME_LENGTH + 1]; + + /* + * File names. + */ + char text_file_name[EB_MAX_FILE_NAME_LENGTH + 1]; + char graphic_file_name[EB_MAX_FILE_NAME_LENGTH + 1]; + char sound_file_name[EB_MAX_FILE_NAME_LENGTH + 1]; + + /* + * Compression hints of Text, graphic and sound files. + * (temporary need, EPWING only). + */ + Zio_Code text_hint_zio_code; + Zio_Code graphic_hint_zio_code; + Zio_Code sound_hint_zio_code; + + /* + * Page number where search method titles are stored. + * (temporary need, EPWING only). + */ + int search_title_page; + + /* + * The top page of search methods. + */ + EB_Search word_alphabet; + EB_Search word_asis; + EB_Search word_kana; + EB_Search endword_alphabet; + EB_Search endword_asis; + EB_Search endword_kana; + EB_Search keyword; + EB_Search menu; + EB_Search image_menu; + EB_Search cross; + EB_Search copyright; + EB_Search text; + EB_Search sound; + + /* + * The number of multi-search methods the subbook has. + */ + int multi_count; + + /* + * The top page of multi search methods. + */ + EB_Multi_Search multis[EB_MAX_MULTI_SEARCHES]; + + /* + * Font list. + */ + EB_Font narrow_fonts[EB_MAX_FONTS]; + EB_Font wide_fonts[EB_MAX_FONTS]; + + /* + * Current narrow and wide fonts. + */ + EB_Font *narrow_current; + EB_Font *wide_current; +}; + +/* + * Length of cache buffer in a binary context. + * It must be greater than 38, size of GIF preamble. + * It must be greater than 44, size of WAVE sound header. + * It must be greater than 118, size of BMP header + info + 16 rgbquads. + */ +#define EB_SIZE_BINARY_CACHE_BUFFER 128 + +/* + * Context parameters for binary data. + */ +struct EB_Binary_Context_Struct { + /* + * Binary type ID. + * The context is not active, if this code is EB_BINARY_INVALID. + */ + EB_Binary_Code code; + + /* + * Compress information. + */ + Zio *zio; + + /* + * Location of the the binary data, relative to the start of the file. + */ + off_t location; + + /* + * Data size. + * Size zero means that the binary has no size information. + */ + size_t size; + + /* + * The current offset of binary data. + */ + size_t offset; + + /* + * Cache buffer. + */ + char cache_buffer[EB_SIZE_BINARY_CACHE_BUFFER]; + + /* + * Length of cached data. + */ + size_t cache_length; + + /* + * Current offset of cached data. + */ + size_t cache_offset; + + /* + * Width of Image. (monochrome graphic only) + */ + int width; +}; + +/* + * Context parameters for text reading. + */ +struct EB_Text_Context_Struct { + /* + * Current text content type. + * The context is not active, if this code is EB_TEXT_INVALID. + */ + EB_Text_Code code; + + /* + * Current offset pointer of the START or HONMON file. + */ + off_t location; + + /* + * The current point of a buffer on which text is written. + */ + char *out; + + /* + * Length of `out'. + */ + size_t out_rest_length; + + /* + * Unprocessed string that a hook function writes on text. + */ + char *unprocessed; + + /* + * Size of `unprocessed'. + */ + size_t unprocessed_size; + + /* + * Length of the current output text phrase. + */ + size_t out_step; + + /* + * Narrow character region flag. + */ + int narrow_flag; + + /* + * Whether a printable character has been appeared in the current + * text content. + */ + int printable_count; + + /* + * EOF flag of the current subbook. + */ + int file_end_flag; + + /* + * Status of the current text processing. + */ + EB_Text_Status_Code text_status; + + /* + * Skip until `skipcode' appears. + */ + int skip_code; + + /* + * Stop-code automatically set by EB Library. + */ + int auto_stop_code; + + /* + * The current candidate word for multi search. + */ + char candidate[EB_MAX_WORD_LENGTH + 1]; + + /* + * Whether the current text point is in the candidate word or not. + */ + int is_candidate; + + /* + * Whether the current text point is in EBXA-C gaiji area. + */ + int ebxac_gaiji_flag; +}; + +/* + * Context parameters for word search. + */ +struct EB_Search_Context_Struct { + /* + * Current search method type. + * The context is not active, if this code is EB_SEARCH_NONE. + */ + EB_Search_Code code; + + /* + * Function which compares word to search and pattern in an index page. + */ + int (*compare_pre)(const char *word, const char *pattern, + size_t length); + int (*compare_single)(const char *word, const char *pattern, + size_t length); + int (*compare_group)(const char *word, const char *pattern, + size_t length); + + /* + * Result of comparison by `compare'. + */ + int comparison_result; + + /* + * Word to search. + */ + char word[EB_MAX_WORD_LENGTH + 1]; + + /* + * Canonicalized word to search. + */ + char canonicalized_word[EB_MAX_WORD_LENGTH + 1]; + + /* + * Page which is searched currently. + */ + int page; + + /* + * Offset which is searched currently in the page. + */ + int offset; + + /* + * Page ID of the current page. + */ + int page_id; + + /* + * How many entries in the current page. + */ + int entry_count; + + /* + * Entry index pointer. + */ + int entry_index; + + /* + * Length of the current entry. + */ + int entry_length; + + /* + * Arrangement style of entries in the current page (fixed or variable). + */ + int entry_arrangement; + + /* + * In a group entry or not. + */ + int in_group_entry; + + /* + * Current heading position (for keyword search). + */ + EB_Position keyword_heading; +}; + +/* + * A book. + */ +struct EB_Book_Struct { + /* + * Book ID. + */ + EB_Book_Code code; + + /* + * Disc type. EB* or EPWING. + */ + EB_Disc_Code disc_code; + + /* + * Character code of the book. + */ + EB_Character_Code character_code; + + /* + * Path of the book. + */ + char *path; + + /* + * The length of the path. + */ + size_t path_length; + + /* + * The number of subbooks the book has. + */ + int subbook_count; + + /* + * Subbook list. + */ + EB_Subbook *subbooks; + + /* + * Current subbook. + */ + EB_Subbook *subbook_current; + + /* + * Context parameters for text reading. + */ + EB_Text_Context text_context; + + /* + * Context parameters for binary reading. + */ + EB_Binary_Context binary_context; + + /* + * Context parameters for text reading. + */ + EB_Search_Context search_contexts[EB_NUMBER_OF_SEARCH_CONTEXTS]; + + /* + * ebnet socket file. + */ +#ifdef EB_ENABLE_EBNET + int ebnet_file; +#endif + + /* + * Lock. + */ +#ifdef EB_ENABLE_PTHREAD + EB_Lock lock; +#endif +}; + +/* + * In a word search, heading and text locations of a matched entry + * are stored. + */ +struct EB_Hit_Struct { + /* + * Heading position. + */ + EB_Position heading; + + /* + * Text position. + */ + EB_Position text; +}; + +/* + * A text hook. + */ +struct EB_Hook_Struct { + /* + * Hook code. + */ + EB_Hook_Code code; + + /* + * Hook function for the hook code `code'. + */ + EB_Error_Code (*function)(EB_Book *book, EB_Appendix *appendix, + void *container, EB_Hook_Code hook_code, int argc, + const unsigned int *argv); +}; + +/* + * A set of text hooks. + */ +struct EB_Hookset_Struct { + /* + * List of hooks. + */ + EB_Hook hooks[EB_NUMBER_OF_HOOKS]; + + /* + * Lock. + */ +#ifdef EB_ENABLE_PTHREAD + EB_Lock lock; +#endif +}; + +/* + * An entry of book list. + */ +struct EB_BookList_Entry { + /* + * name. + */ + char *name; + + /* + * Title. + */ + char *title; +}; + +/* + * Book list. + */ +struct EB_BookList { + /* + * Book List ID. + */ + EB_Book_Code code; + + /* + * The number of book entries this list has. + */ + int entry_count; + + /* + * The maximum number of book entries that `entries' can memory. + */ + int max_entry_count; + + /* + * Book entries. + */ + EB_BookList_Entry *entries; + + /* + * Lock. + */ +#ifdef EB_ENABLE_PTHREAD + EB_Lock lock; +#endif +}; + +/* for backward compatibility */ +#define EB_Multi_Entry_Code int + +#ifdef __cplusplus +} +#endif + +#endif /* not EB_DEFS_H */ diff -Nru goldendict-1.5.0~git20131003/maclibs/include/eb/eb.h goldendict-1.5.0~git20150923/maclibs/include/eb/eb.h --- goldendict-1.5.0~git20131003/maclibs/include/eb/eb.h 1970-01-01 00:00:00.000000000 +0000 +++ goldendict-1.5.0~git20150923/maclibs/include/eb/eb.h 2015-09-23 08:26:24.000000000 +0000 @@ -0,0 +1,155 @@ +/* -*- C -*- + * Copyright (c) 1997-2006 Motoyuki Kasahara + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the project nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE PROJECT AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE PROJECT OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#ifndef EB_EB_H +#define EB_EB_H + +#ifdef __cplusplus +extern "C" { +#endif + +#ifdef EB_BUILD_LIBRARY +#include "defs.h" +#else +#include +#endif + +#include + +/* + * Function declarations. + */ +/* book.c */ +void eb_initialize_book(EB_Book *book); +EB_Error_Code eb_bind(EB_Book *book, const char *path); +void eb_finalize_book(EB_Book *book); +int eb_is_bound(EB_Book *book); +EB_Error_Code eb_path(EB_Book *book, char *path); +EB_Error_Code eb_disc_type(EB_Book *book, EB_Disc_Code *disc_code); +EB_Error_Code eb_character_code(EB_Book *book, + EB_Character_Code *character_code); + +/* copyright.h */ +int eb_have_copyright(EB_Book *book); +EB_Error_Code eb_copyright(EB_Book *book, EB_Position *position); +EB_Error_Code eb_search_cross(EB_Book *book, + const char * const input_words[]); + +/* cross.c */ +int eb_have_cross_search(EB_Book *book); + +/* eb.c */ +EB_Error_Code eb_initialize_library(void); +void eb_finalize_library(void); + +/* endword.c */ +int eb_have_endword_search(EB_Book *book); +EB_Error_Code eb_search_endword(EB_Book *book, const char *input_word); + +/* exactword.c */ +int eb_have_exactword_search(EB_Book *book); +EB_Error_Code eb_search_exactword(EB_Book *book, const char *input_word); + +/* graphic.c */ +int eb_have_graphic_search(EB_Book *book); + +/* keyword.c */ +int eb_have_keyword_search(EB_Book *book); +EB_Error_Code eb_search_keyword(EB_Book *book, + const char * const input_words[]); + +/* lock.c */ +int eb_pthread_enabled(void); + +/* log.c */ +void eb_set_log_function(void (*function)(const char *message, va_list ap)); +void eb_enable_log(void); +void eb_disable_log(void); +void eb_log(const char *message, ...); +void eb_log_stderr(const char *message, va_list ap); + +/* menu.c */ +int eb_have_menu(EB_Book *book); +EB_Error_Code eb_menu(EB_Book *book, EB_Position *position); +int eb_have_image_menu(EB_Book *book); +EB_Error_Code eb_image_menu(EB_Book *book, EB_Position *position); + +/* multi.c */ +int eb_have_multi_search(EB_Book *book); +EB_Error_Code eb_multi_title(EB_Book *book, EB_Multi_Search_Code multi_id, + char *title); +EB_Error_Code eb_multi_search_list(EB_Book *book, + EB_Multi_Search_Code *search_list, int *search_count); +EB_Error_Code eb_multi_entry_count(EB_Book *book, + EB_Multi_Search_Code multi_id, int *entry_count); +EB_Error_Code eb_multi_entry_list(EB_Book *book, + EB_Multi_Search_Code multi_id, int *entry_list, int *entry_count); +EB_Error_Code eb_multi_entry_label(EB_Book *book, + EB_Multi_Search_Code multi_id, int entry_index, char *label); +int eb_multi_entry_have_candidates(EB_Book *book, + EB_Multi_Search_Code multi_id, int entry_index); +EB_Error_Code eb_multi_entry_candidates(EB_Book *book, + EB_Multi_Search_Code multi_id, int entry_index, EB_Position *position); +EB_Error_Code eb_search_multi(EB_Book *book, EB_Multi_Search_Code multi_id, + const char * const input_words[]); + +/* text.c */ +int eb_have_text(EB_Book *book); +EB_Error_Code eb_text(EB_Book *book, EB_Position *position); + +/* search.c */ +EB_Error_Code eb_hit_list(EB_Book *book, int max_hit_count, EB_Hit *hit_list, + int *hit_count); + +/* subbook.c */ +EB_Error_Code eb_load_all_subbooks(EB_Book *book); +EB_Error_Code eb_subbook_list(EB_Book *book, EB_Subbook_Code *subbook_list, + int *subbook_count); +EB_Error_Code eb_subbook(EB_Book *book, EB_Subbook_Code *subbook_code); +EB_Error_Code eb_subbook_title(EB_Book *book, char *title); +EB_Error_Code eb_subbook_title2(EB_Book *book, EB_Subbook_Code subbook_code, + char *title); +EB_Error_Code eb_subbook_directory(EB_Book *book, char *directory); +EB_Error_Code eb_subbook_directory2(EB_Book *book, + EB_Subbook_Code subbook_code, char *directory); +EB_Error_Code eb_set_subbook(EB_Book *book, EB_Subbook_Code subbook_code); +void eb_unset_subbook(EB_Book *book); + +/* word.c */ +int eb_have_word_search(EB_Book *book); +EB_Error_Code eb_search_word(EB_Book *book, const char *input_word); + +/* for backward compatibility */ +#define eb_suspend eb_unset_subbook +#define eb_initialize_all_subbooks eb_load_all_subbooks + +#ifdef __cplusplus +} +#endif + +#endif /* not EB_EB_H */ diff -Nru goldendict-1.5.0~git20131003/maclibs/include/eb/error.h goldendict-1.5.0~git20150923/maclibs/include/eb/error.h --- goldendict-1.5.0~git20131003/maclibs/include/eb/error.h 1970-01-01 00:00:00.000000000 +0000 +++ goldendict-1.5.0~git20150923/maclibs/include/eb/error.h 2015-09-23 08:26:24.000000000 +0000 @@ -0,0 +1,150 @@ +/* -*- C -*- + * Copyright (c) 1997-2006 Motoyuki Kasahara + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the project nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE PROJECT AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE PROJECT OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#ifndef EB_ERROR_H +#define EB_ERROR_H + +#ifdef __cplusplus +extern "C" { +#endif + +#ifdef EB_BUILD_LIBRARY +#include "defs.h" +#else +#include +#endif + +/* + * Error codes. + */ +#define EB_SUCCESS 0 +#define EB_ERR_MEMORY_EXHAUSTED 1 +#define EB_ERR_EMPTY_FILE_NAME 2 +#define EB_ERR_TOO_LONG_FILE_NAME 3 +#define EB_ERR_BAD_FILE_NAME 4 + +#define EB_ERR_BAD_DIR_NAME 5 +#define EB_ERR_TOO_LONG_WORD 6 +#define EB_ERR_BAD_WORD 7 +#define EB_ERR_EMPTY_WORD 8 +#define EB_ERR_FAIL_GETCWD 9 + +#define EB_ERR_FAIL_OPEN_CAT 10 +#define EB_ERR_FAIL_OPEN_CATAPP 11 +#define EB_ERR_FAIL_OPEN_TEXT 12 +#define EB_ERR_FAIL_OPEN_FONT 13 +#define EB_ERR_FAIL_OPEN_APP 14 + +#define EB_ERR_FAIL_OPEN_BINARY 15 +#define EB_ERR_FAIL_READ_CAT 16 +#define EB_ERR_FAIL_READ_CATAPP 17 +#define EB_ERR_FAIL_READ_TEXT 18 +#define EB_ERR_FAIL_READ_FONT 19 + +#define EB_ERR_FAIL_READ_APP 20 +#define EB_ERR_FAIL_READ_BINARY 21 +#define EB_ERR_FAIL_SEEK_CAT 22 +#define EB_ERR_FAIL_SEEK_CATAPP 23 +#define EB_ERR_FAIL_SEEK_TEXT 24 + +#define EB_ERR_FAIL_SEEK_FONT 25 +#define EB_ERR_FAIL_SEEK_APP 26 +#define EB_ERR_FAIL_SEEK_BINARY 27 +#define EB_ERR_UNEXP_CAT 28 +#define EB_ERR_UNEXP_CATAPP 29 + +#define EB_ERR_UNEXP_TEXT 30 +#define EB_ERR_UNEXP_FONT 31 +#define EB_ERR_UNEXP_APP 32 +#define EB_ERR_UNEXP_BINARY 33 +#define EB_ERR_UNBOUND_BOOK 34 + +#define EB_ERR_UNBOUND_APP 35 +#define EB_ERR_NO_SUB 36 +#define EB_ERR_NO_APPSUB 37 +#define EB_ERR_NO_FONT 38 +#define EB_ERR_NO_TEXT 39 + +#define EB_ERR_NO_STOPCODE 40 +#define EB_ERR_NO_ALT 41 +#define EB_ERR_NO_CUR_SUB 42 +#define EB_ERR_NO_CUR_APPSUB 43 +#define EB_ERR_NO_CUR_FONT 44 + +#define EB_ERR_NO_CUR_BINARY 45 +#define EB_ERR_NO_SUCH_SUB 46 +#define EB_ERR_NO_SUCH_APPSUB 47 +#define EB_ERR_NO_SUCH_FONT 48 +#define EB_ERR_NO_SUCH_CHAR_BMP 49 + +#define EB_ERR_NO_SUCH_CHAR_TEXT 50 +#define EB_ERR_NO_SUCH_SEARCH 51 +#define EB_ERR_NO_SUCH_HOOK 52 +#define EB_ERR_NO_SUCH_BINARY 53 +#define EB_ERR_DIFF_CONTENT 54 + +#define EB_ERR_NO_PREV_SEARCH 55 +#define EB_ERR_NO_SUCH_MULTI_ID 56 +#define EB_ERR_NO_SUCH_ENTRY_ID 57 +#define EB_ERR_TOO_MANY_WORDS 58 +#define EB_ERR_NO_WORD 59 + +#define EB_ERR_NO_CANDIDATES 60 +#define EB_ERR_END_OF_CONTENT 61 +#define EB_ERR_NO_PREV_SEEK 62 +#define EB_ERR_EBNET_UNSUPPORTED 63 +#define EB_ERR_EBNET_FAIL_CONNECT 64 + +#define EB_ERR_EBNET_SERVER_BUSY 65 +#define EB_ERR_EBNET_NO_PERMISSION 66 +#define EB_ERR_UNBOUND_BOOKLIST 67 +#define EB_ERR_NO_SUCH_BOOK 68 + + +/* + * The number of error codes. + */ +#define EB_NUMBER_OF_ERRORS 69 + +/* + * The maximum length of an error message. + */ +#define EB_MAX_ERROR_MESSAGE_LENGTH 127 + +/* + * Function declarations. + */ +/* error.c */ +const char *eb_error_string(EB_Error_Code error_code); +const char *eb_error_message(EB_Error_Code error_code); + +#ifdef __cplusplus +} +#endif + +#endif /* not EB_ERROR_H */ diff -Nru goldendict-1.5.0~git20131003/maclibs/include/eb/font.h goldendict-1.5.0~git20150923/maclibs/include/eb/font.h --- goldendict-1.5.0~git20131003/maclibs/include/eb/font.h 1970-01-01 00:00:00.000000000 +0000 +++ goldendict-1.5.0~git20150923/maclibs/include/eb/font.h 2015-09-23 08:26:24.000000000 +0000 @@ -0,0 +1,200 @@ +/* -*- C -*- + * Copyright (c) 1997-2006 Motoyuki Kasahara + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the project nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE PROJECT AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE PROJECT OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#ifndef EB_FONT_H +#define EB_FONT_H + +#ifdef __cplusplus +extern "C" { +#endif + +#include + +#ifdef EB_BUILD_LIBRARY +#include "defs.h" +#else +#include +#endif + +/* + * Font types. + */ +#define EB_FONT_16 0 +#define EB_FONT_24 1 +#define EB_FONT_30 2 +#define EB_FONT_48 3 +#define EB_FONT_INVALID -1 + +/* + * Font sizes. + */ +#define EB_SIZE_NARROW_FONT_16 16 +#define EB_SIZE_WIDE_FONT_16 32 +#define EB_SIZE_NARROW_FONT_24 48 +#define EB_SIZE_WIDE_FONT_24 72 +#define EB_SIZE_NARROW_FONT_30 60 +#define EB_SIZE_WIDE_FONT_30 120 +#define EB_SIZE_NARROW_FONT_48 144 +#define EB_SIZE_WIDE_FONT_48 288 + +/* + * Font width. + */ +#define EB_WIDTH_NARROW_FONT_16 8 +#define EB_WIDTH_WIDE_FONT_16 16 +#define EB_WIDTH_NARROW_FONT_24 16 +#define EB_WIDTH_WIDE_FONT_24 24 +#define EB_WIDTH_NARROW_FONT_30 16 +#define EB_WIDTH_WIDE_FONT_30 32 +#define EB_WIDTH_NARROW_FONT_48 24 +#define EB_WIDTH_WIDE_FONT_48 48 + +/* + * Font height. + */ +#define EB_HEIGHT_FONT_16 16 +#define EB_HEIGHT_FONT_24 24 +#define EB_HEIGHT_FONT_30 30 +#define EB_HEIGHT_FONT_48 48 + +/* + * Bitmap image sizes. + */ +#define EB_SIZE_NARROW_FONT_16_XBM 184 +#define EB_SIZE_WIDE_FONT_16_XBM 284 +#define EB_SIZE_NARROW_FONT_16_XPM 266 +#define EB_SIZE_WIDE_FONT_16_XPM 395 +#define EB_SIZE_NARROW_FONT_16_GIF 186 +#define EB_SIZE_WIDE_FONT_16_GIF 314 +#define EB_SIZE_NARROW_FONT_16_BMP 126 +#define EB_SIZE_WIDE_FONT_16_BMP 126 +#define EB_SIZE_NARROW_FONT_16_PNG 131 +#define EB_SIZE_WIDE_FONT_16_PNG 147 + +#define EB_SIZE_NARROW_FONT_24_XBM 383 +#define EB_SIZE_WIDE_FONT_24_XBM 533 +#define EB_SIZE_NARROW_FONT_24_XPM 555 +#define EB_SIZE_WIDE_FONT_24_XPM 747 +#define EB_SIZE_NARROW_FONT_24_GIF 450 +#define EB_SIZE_WIDE_FONT_24_GIF 642 +#define EB_SIZE_NARROW_FONT_24_BMP 158 +#define EB_SIZE_WIDE_FONT_24_BMP 158 +#define EB_SIZE_NARROW_FONT_24_PNG 171 +#define EB_SIZE_WIDE_FONT_24_PNG 195 + +#define EB_SIZE_NARROW_FONT_30_XBM 458 +#define EB_SIZE_WIDE_FONT_30_XBM 833 +#define EB_SIZE_NARROW_FONT_30_XPM 675 +#define EB_SIZE_WIDE_FONT_30_XPM 1155 +#define EB_SIZE_NARROW_FONT_30_GIF 552 +#define EB_SIZE_WIDE_FONT_30_GIF 1032 +#define EB_SIZE_NARROW_FONT_30_BMP 182 +#define EB_SIZE_WIDE_FONT_30_BMP 182 +#define EB_SIZE_NARROW_FONT_30_PNG 189 +#define EB_SIZE_WIDE_FONT_30_PNG 249 + +#define EB_SIZE_NARROW_FONT_48_XBM 983 +#define EB_SIZE_WIDE_FONT_48_XBM 1883 +#define EB_SIZE_NARROW_FONT_48_XPM 1419 +#define EB_SIZE_WIDE_FONT_48_XPM 2571 +#define EB_SIZE_NARROW_FONT_48_GIF 1242 +#define EB_SIZE_WIDE_FONT_48_GIF 2394 +#define EB_SIZE_NARROW_FONT_48_BMP 254 +#define EB_SIZE_WIDE_FONT_48_BMP 446 +#define EB_SIZE_NARROW_FONT_48_PNG 291 +#define EB_SIZE_WIDE_FONT_48_PNG 435 + +#define EB_SIZE_FONT_IMAGE EB_SIZE_WIDE_FONT_48_XPM + +/* + * Function declarations. + */ +/* bitmap.c */ +EB_Error_Code eb_narrow_font_xbm_size(EB_Font_Code font_code, size_t *size); +EB_Error_Code eb_narrow_font_xpm_size(EB_Font_Code font_code, size_t *size); +EB_Error_Code eb_narrow_font_gif_size(EB_Font_Code font_code, size_t *size); +EB_Error_Code eb_narrow_font_bmp_size(EB_Font_Code font_code, size_t *size); +EB_Error_Code eb_narrow_font_png_size(EB_Font_Code font_code, size_t *size); +EB_Error_Code eb_wide_font_xbm_size(EB_Font_Code font_code, size_t *size); +EB_Error_Code eb_wide_font_xpm_size(EB_Font_Code font_code, size_t *size); +EB_Error_Code eb_wide_font_gif_size(EB_Font_Code font_code, size_t *size); +EB_Error_Code eb_wide_font_bmp_size(EB_Font_Code font_code, size_t *size); +EB_Error_Code eb_wide_font_png_size(EB_Font_Code font_code, size_t *size); +EB_Error_Code eb_bitmap_to_xbm(const char *bitmap, int width, int height, + char *xbm, size_t *xbm_length); +EB_Error_Code eb_bitmap_to_xpm(const char *bitmap, int width, int height, + char *xpm, size_t *xpm_length); +EB_Error_Code eb_bitmap_to_gif(const char *bitmap, int width, int height, + char *gif, size_t *gif_length); +EB_Error_Code eb_bitmap_to_bmp(const char *bitmap, int width, int height, + char *bmp, size_t *bmp_length); +EB_Error_Code eb_bitmap_to_png(const char *bitmap, int width, int height, + char *png, size_t *png_length); + +/* font.c */ +EB_Error_Code eb_font(EB_Book *book, EB_Font_Code *font_code); +EB_Error_Code eb_set_font(EB_Book *book, EB_Font_Code font_code); +void eb_unset_font(EB_Book *book); +EB_Error_Code eb_font_list(EB_Book *book, EB_Font_Code *font_list, + int *font_count); +int eb_have_font(EB_Book *book, EB_Font_Code font_code); +EB_Error_Code eb_font_height(EB_Book *book, int *height); +EB_Error_Code eb_font_height2(EB_Font_Code font_code, int *height); + +/* narwfont.c */ +int eb_have_narrow_font(EB_Book *book); +EB_Error_Code eb_narrow_font_width(EB_Book *book, int *width); +EB_Error_Code eb_narrow_font_width2(EB_Font_Code font_code, int *width); +EB_Error_Code eb_narrow_font_size(EB_Book *book, size_t *size); +EB_Error_Code eb_narrow_font_size2(EB_Font_Code font_code, size_t *size); +EB_Error_Code eb_narrow_font_start(EB_Book *book, int *start); +EB_Error_Code eb_narrow_font_end(EB_Book *book, int *end); +EB_Error_Code eb_narrow_font_character_bitmap(EB_Book *book, int, char *); +EB_Error_Code eb_forward_narrow_font_character(EB_Book *book, int, int *); +EB_Error_Code eb_backward_narrow_font_character(EB_Book *book, int, int *); + +/* widefont.c */ +int eb_have_wide_font(EB_Book *book); +EB_Error_Code eb_wide_font_width(EB_Book *book, int *width); +EB_Error_Code eb_wide_font_width2(EB_Font_Code font_code, int *width); +EB_Error_Code eb_wide_font_size(EB_Book *book, size_t *size); +EB_Error_Code eb_wide_font_size2(EB_Font_Code font_code, size_t *size); +EB_Error_Code eb_wide_font_start(EB_Book *book, int *start); +EB_Error_Code eb_wide_font_end(EB_Book *book, int *end); +EB_Error_Code eb_wide_font_character_bitmap(EB_Book *book, + int character_number, char *bitmap); +EB_Error_Code eb_forward_wide_font_character(EB_Book *book, int n, + int *character_number); +EB_Error_Code eb_backward_wide_font_character(EB_Book *book, int n, + int *character_number); + +#ifdef __cplusplus +} +#endif + +#endif /* not EB_FONT_H */ diff -Nru goldendict-1.5.0~git20131003/maclibs/include/eb/sysdefs.h goldendict-1.5.0~git20150923/maclibs/include/eb/sysdefs.h --- goldendict-1.5.0~git20131003/maclibs/include/eb/sysdefs.h 1970-01-01 00:00:00.000000000 +0000 +++ goldendict-1.5.0~git20150923/maclibs/include/eb/sysdefs.h 2015-09-23 08:26:24.000000000 +0000 @@ -0,0 +1,4 @@ +/* automatically generated by Makefile. */ +#define EB_VERSION_STRING "4.4.3" +#define EB_VERSION_MAJOR 4 +#define EB_VERSION_MINOR 4 diff -Nru goldendict-1.5.0~git20131003/maclibs/include/eb/text.h goldendict-1.5.0~git20150923/maclibs/include/eb/text.h --- goldendict-1.5.0~git20131003/maclibs/include/eb/text.h 1970-01-01 00:00:00.000000000 +0000 +++ goldendict-1.5.0~git20150923/maclibs/include/eb/text.h 2015-09-23 08:26:24.000000000 +0000 @@ -0,0 +1,166 @@ +/* -*- C -*- + * Copyright (c) 1997-2006 Motoyuki Kasahara + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the project nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE PROJECT AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE PROJECT OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#ifndef EB_TEXT_H +#define EB_TEXT_H + +#ifdef __cplusplus +extern "C" { +#endif + +#include + +#ifdef EB_BUILD_LIBRARY +#include "defs.h" +#else +#include +#endif + +/* + * Hook codes. + * (When you add or remove a hook, update EB_NUMER_OF_HOOKS in defs.h.) + */ +#define EB_HOOK_NULL -1 +#define EB_HOOK_INITIALIZE 0 +#define EB_HOOK_BEGIN_NARROW 1 +#define EB_HOOK_END_NARROW 2 +#define EB_HOOK_BEGIN_SUBSCRIPT 3 +#define EB_HOOK_END_SUBSCRIPT 4 + +#define EB_HOOK_SET_INDENT 5 +#define EB_HOOK_NEWLINE 6 +#define EB_HOOK_BEGIN_SUPERSCRIPT 7 +#define EB_HOOK_END_SUPERSCRIPT 8 +#define EB_HOOK_BEGIN_NO_NEWLINE 9 + +#define EB_HOOK_END_NO_NEWLINE 10 +#define EB_HOOK_BEGIN_EMPHASIS 11 +#define EB_HOOK_END_EMPHASIS 12 +#define EB_HOOK_BEGIN_CANDIDATE 13 +#define EB_HOOK_END_CANDIDATE_GROUP 14 + +#define EB_HOOK_END_CANDIDATE_LEAF 15 +#define EB_HOOK_BEGIN_REFERENCE 16 +#define EB_HOOK_END_REFERENCE 17 +#define EB_HOOK_BEGIN_KEYWORD 18 +#define EB_HOOK_END_KEYWORD 19 + +#define EB_HOOK_NARROW_FONT 20 +#define EB_HOOK_WIDE_FONT 21 +#define EB_HOOK_ISO8859_1 22 +#define EB_HOOK_NARROW_JISX0208 23 +#define EB_HOOK_WIDE_JISX0208 24 + +#define EB_HOOK_GB2312 25 +#define EB_HOOK_BEGIN_MONO_GRAPHIC 26 +#define EB_HOOK_END_MONO_GRAPHIC 27 +#define EB_HOOK_BEGIN_GRAY_GRAPHIC 28 +#define EB_HOOK_END_GRAY_GRAPHIC 29 + +#define EB_HOOK_BEGIN_COLOR_BMP 30 +#define EB_HOOK_BEGIN_COLOR_JPEG 31 +#define EB_HOOK_BEGIN_IN_COLOR_BMP 32 +#define EB_HOOK_BEGIN_IN_COLOR_JPEG 33 +#define EB_HOOK_END_COLOR_GRAPHIC 34 + +#define EB_HOOK_END_IN_COLOR_GRAPHIC 35 +#define EB_HOOK_BEGIN_WAVE 36 +#define EB_HOOK_END_WAVE 37 +#define EB_HOOK_BEGIN_MPEG 38 +#define EB_HOOK_END_MPEG 39 + +#define EB_HOOK_BEGIN_GRAPHIC_REFERENCE 40 +#define EB_HOOK_END_GRAPHIC_REFERENCE 41 +#define EB_HOOK_GRAPHIC_REFERENCE 42 +#define EB_HOOK_BEGIN_DECORATION 43 +#define EB_HOOK_END_DECORATION 44 + +#define EB_HOOK_BEGIN_IMAGE_PAGE 45 +#define EB_HOOK_END_IMAGE_PAGE 46 +#define EB_HOOK_BEGIN_CLICKABLE_AREA 47 +#define EB_HOOK_END_CLICKABLE_AREA 48 + +#define EB_HOOK_BEGIN_UNICODE 49 +#define EB_HOOK_END_UNICODE 50 +#define EB_HOOK_BEGIN_EBXAC_GAIJI 51 +#define EB_HOOK_END_EBXAC_GAIJI 52 +#define EB_HOOK_EBXAC_GAIJI 53 + +/* + * Function declarations. + */ +/* hook.c */ +void eb_initialize_hookset(EB_Hookset *hookset); +void eb_finalize_hookset(EB_Hookset *hookset); +EB_Error_Code eb_set_hook(EB_Hookset *hookset, const EB_Hook *hook); +EB_Error_Code eb_set_hooks(EB_Hookset *hookset, const EB_Hook *hook); +EB_Error_Code eb_hook_euc_to_ascii(EB_Book *book, EB_Appendix *appendix, + void *container, EB_Hook_Code hook_code, int argc, + const unsigned int *argv); +EB_Error_Code eb_hook_stop_code(EB_Book *book, EB_Appendix *appendix, + void *container, EB_Hook_Code hook_code, int argc, + const unsigned int *argv); +EB_Error_Code eb_hook_narrow_character_text(EB_Book *book, + EB_Appendix *appendix, void *container, EB_Hook_Code hook_code, int argc, + const unsigned int *argv); +EB_Error_Code eb_hook_wide_character_text(EB_Book *book, + EB_Appendix *appendix, void *container, EB_Hook_Code hook_code, int argc, + const unsigned int *argv); +EB_Error_Code eb_hook_newline(EB_Book *book, EB_Appendix *appendix, + void *container, EB_Hook_Code hook_code, int argc, + const unsigned int *argv); +EB_Error_Code eb_hook_empty(EB_Book *book, EB_Appendix *appendix, + void *container, EB_Hook_Code hook_code, int argc, + const unsigned int *argv); + +/* readtext.c */ +EB_Error_Code eb_seek_text(EB_Book *book, const EB_Position *position); +EB_Error_Code eb_tell_text(EB_Book *book, EB_Position *position); +EB_Error_Code eb_read_text(EB_Book *book, EB_Appendix *appendix, + EB_Hookset *hookset, void *container, size_t text_max_length, char *text, + ssize_t *text_length); +EB_Error_Code eb_read_heading(EB_Book *book, EB_Appendix *appendix, + EB_Hookset *hookset, void *container, size_t text_max_length, char *text, + ssize_t *text_length); +EB_Error_Code eb_read_rawtext(EB_Book *book, size_t text_max_length, + char *text, ssize_t *text_length); +int eb_is_text_stopped(EB_Book *book); +EB_Error_Code eb_write_text_byte1(EB_Book *book, int byte1); +EB_Error_Code eb_write_text_byte2(EB_Book *book, int byte1, int byte2); +EB_Error_Code eb_write_text_string(EB_Book *book, const char *string); +EB_Error_Code eb_write_text(EB_Book *book, const char * stream, + size_t stream_length); +const char *eb_current_candidate(EB_Book *book); +EB_Error_Code eb_forward_text(EB_Book *book, EB_Appendix *appendix); +EB_Error_Code eb_backward_text(EB_Book *book, EB_Appendix *appendix); + +#ifdef __cplusplus +} +#endif + +#endif /* not EB_TEXT_H */ diff -Nru goldendict-1.5.0~git20131003/maclibs/include/eb/zio.h goldendict-1.5.0~git20150923/maclibs/include/eb/zio.h --- goldendict-1.5.0~git20131003/maclibs/include/eb/zio.h 1970-01-01 00:00:00.000000000 +0000 +++ goldendict-1.5.0~git20150923/maclibs/include/eb/zio.h 2015-09-23 08:26:24.000000000 +0000 @@ -0,0 +1,237 @@ +/* -*- C -*- + * Copyright (c) 2001-2006 Motoyuki Kasahara + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the project nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE PROJECT AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE PROJECT OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#ifndef ZIO_H +#define ZIO_H + +#ifdef __cplusplus +extern "C" { +#endif + +#include +#include + +/* + * Header size of the ebzip compression file. + */ +#define ZIO_SIZE_EBZIP_HEADER 22 + +/* + * Margin size for ebzip compression buffer. + * (Since compressed data is larger than original in the worst case, + * we must add margin to a compression buffer.) + */ +#define ZIO_SIZE_EBZIP_MARGIN 1024 + +/* + * Maximum ebzio compression level. + */ +#define ZIO_MAX_EBZIP_LEVEL 5 + +/* + * Huffman node types. + */ +#define ZIO_HUFFMAN_NODE_INTERMEDIATE 0 +#define ZIO_HUFFMAN_NODE_EOF 1 +#define ZIO_HUFFMAN_NODE_LEAF8 2 +#define ZIO_HUFFMAN_NODE_LEAF16 3 +#define ZIO_HUFFMAN_NODE_LEAF32 4 + +/* + * Compression type codes. + */ +#define ZIO_PLAIN 0 +#define ZIO_EBZIP1 1 +#define ZIO_EPWING 2 +#define ZIO_EPWING6 3 +#define ZIO_SEBXA 4 +#define ZIO_INVALID -1 +#define ZIO_REOPEN -2 + +/* + * Compression type. + */ +typedef int Zio_Code; + +/* + * A node of static Huffman tree. + */ +typedef struct Zio_Huffman_Node_Struct Zio_Huffman_Node; + +struct Zio_Huffman_Node_Struct { + /* + * node type (ITNERMEDIATE, LEAF8, LEAF16, LEAF32 or EOF). + */ + int type; + + /* + * Value of a leaf node. + */ + unsigned int value; + + /* + * Frequency of a node. + */ + int frequency; + + /* + * Left child. + */ + Zio_Huffman_Node *left; + + /* + * Right child. + */ + Zio_Huffman_Node *right; +}; + +/* + * Compression information of a book. + */ +typedef struct Zio_Struct Zio; + +struct Zio_Struct { + /* + * ID. + */ + int id; + + /* + * Zio type. (PLAIN, EBZIP, EPWING, EPWING6 or SEBXA) + */ + Zio_Code code; + + /* + * File descriptor. + */ + int file; + + /* + * Current location. + */ + off_t location; + + /* + * Size of an uncompressed file. + */ + off_t file_size; + + /* + * Slice size of an EBZIP compressed file. + */ + size_t slice_size; + + /* + * Compression level. (EBZIP compression only) + */ + int zip_level; + + /* + * Length of an index. (EBZIP compression only) + */ + int index_width; + + /* + * Adler-32 check sum of an uncompressed file. (EBZIP compression only) + */ + unsigned int crc; + + /* + * mtime of an uncompressed file. (EBZIP compression only) + */ + time_t mtime; + + /* + * Location of an index table. (EPWING and S-EBXA compression only) + */ + off_t index_location; + + /* + * Length of an index table. (EPWING and S-EBXA compression only) + */ + size_t index_length; + + /* + * Location of a frequency table. (EPWING compression only) + */ + off_t frequencies_location; + + /* + * Length of a frequency table. (EPWING compression only) + */ + size_t frequencies_length; + + /* + * Huffman tree nodes. (EPWING compression only) + */ + Zio_Huffman_Node *huffman_nodes; + + /* + * Root node of a Huffman tree. (EPWING compression only) + */ + Zio_Huffman_Node *huffman_root; + + /* + * Region of compressed pages. (S-EBXA compression only) + */ + off_t zio_start_location; + off_t zio_end_location; + + /* + * Add this value to offset written in index. (S-EBXA compression only) + */ + off_t index_base; + + /* + * ebnet mode flag. + */ + int is_ebnet; +}; + +/* + * Function declarations. + */ +/* zio.c */ +int zio_initialize_library(void); +void zio_finalize_library(void); +void zio_initialize(Zio *zio); +void zio_finalize(Zio *zio); +int zio_set_sebxa_mode(Zio *zio, off_t index_location, off_t index_base, + off_t zio_start_location, off_t zio_end_location); +int zio_open(Zio *zio, const char *file_name, Zio_Code zio_code); +void zio_close(Zio *zio); +int zio_file(Zio *zio); +Zio_Code zio_mode(Zio *zio); +off_t zio_lseek(Zio *zio, off_t offset, int whence); +ssize_t zio_read(Zio *zio, char *buffer, size_t length); + +#ifdef __cplusplus +} +#endif + +#endif /* not ZIO_H */ diff -Nru goldendict-1.5.0~git20131003/maclibs/include/tiff/tiffconf.h goldendict-1.5.0~git20150923/maclibs/include/tiff/tiffconf.h --- goldendict-1.5.0~git20131003/maclibs/include/tiff/tiffconf.h 1970-01-01 00:00:00.000000000 +0000 +++ goldendict-1.5.0~git20150923/maclibs/include/tiff/tiffconf.h 2015-09-23 08:26:24.000000000 +0000 @@ -0,0 +1,128 @@ +/* libtiff/tiffconf.h. Generated from tiffconf.h.in by configure. */ +/* + Configuration defines for installed libtiff. + This file maintained for backward compatibility. Do not use definitions + from this file in your programs. +*/ + +#ifndef _TIFFCONF_ +#define _TIFFCONF_ + +/* Signed 16-bit type */ +#define TIFF_INT16_T signed short + +/* Signed 32-bit type */ +#define TIFF_INT32_T signed int + +/* Signed 64-bit type */ +#define TIFF_INT64_T signed long + +/* Signed 8-bit type */ +#define TIFF_INT8_T signed char + +/* Unsigned 16-bit type */ +#define TIFF_UINT16_T unsigned short + +/* Unsigned 32-bit type */ +#define TIFF_UINT32_T unsigned int + +/* Unsigned 64-bit type */ +#define TIFF_UINT64_T unsigned long + +/* Unsigned 8-bit type */ +#define TIFF_UINT8_T unsigned char + +/* Signed size type */ +#define TIFF_SSIZE_T signed long + +/* Pointer difference type */ +#define TIFF_PTRDIFF_T ptrdiff_t + +/* Define to 1 if the system has the type `int16'. */ +/* #undef HAVE_INT16 */ + +/* Define to 1 if the system has the type `int32'. */ +/* #undef HAVE_INT32 */ + +/* Define to 1 if the system has the type `int8'. */ +/* #undef HAVE_INT8 */ + +/* Compatibility stuff. */ + +/* Define as 0 or 1 according to the floating point format suported by the + machine */ +#define HAVE_IEEEFP 1 + +/* Set the native cpu bit order (FILLORDER_LSB2MSB or FILLORDER_MSB2LSB) */ +#define HOST_FILLORDER FILLORDER_LSB2MSB + +/* Native cpu byte order: 1 if big-endian (Motorola) or 0 if little-endian + (Intel) */ +#define HOST_BIGENDIAN 0 + +/* Support CCITT Group 3 & 4 algorithms */ +#define CCITT_SUPPORT 1 + +/* Support JPEG compression (requires IJG JPEG library) */ +/* #undef JPEG_SUPPORT */ + +/* Support JBIG compression (requires JBIG-KIT library) */ +/* #undef JBIG_SUPPORT */ + +/* Support LogLuv high dynamic range encoding */ +#define LOGLUV_SUPPORT 1 + +/* Support LZW algorithm */ +#define LZW_SUPPORT 1 + +/* Support NeXT 2-bit RLE algorithm */ +#define NEXT_SUPPORT 1 + +/* Support Old JPEG compresson (read contrib/ojpeg/README first! Compilation + fails with unpatched IJG JPEG library) */ +/* #undef OJPEG_SUPPORT */ + +/* Support Macintosh PackBits algorithm */ +#define PACKBITS_SUPPORT 1 + +/* Support Pixar log-format algorithm (requires Zlib) */ +#define PIXARLOG_SUPPORT 1 + +/* Support ThunderScan 4-bit RLE algorithm */ +#define THUNDER_SUPPORT 1 + +/* Support Deflate compression */ +#define ZIP_SUPPORT 1 + +/* Support strip chopping (whether or not to convert single-strip uncompressed + images to mutiple strips of ~8Kb to reduce memory usage) */ +#define STRIPCHOP_DEFAULT TIFF_STRIPCHOP + +/* Enable SubIFD tag (330) support */ +#define SUBIFD_SUPPORT 1 + +/* Treat extra sample as alpha (default enabled). The RGBA interface will + treat a fourth sample with no EXTRASAMPLE_ value as being ASSOCALPHA. Many + packages produce RGBA files but don't mark the alpha properly. */ +#define DEFAULT_EXTRASAMPLE_AS_ALPHA 1 + +/* Pick up YCbCr subsampling info from the JPEG data stream to support files + lacking the tag (default enabled). */ +#define CHECK_JPEG_YCBCR_SUBSAMPLING 1 + +/* Support MS MDI magic number files as TIFF */ +#define MDI_SUPPORT 1 + +/* + * Feature support definitions. + * XXX: These macros are obsoleted. Don't use them in your apps! + * Macros stays here for backward compatibility and should be always defined. + */ +#define COLORIMETRY_SUPPORT +#define YCBCR_SUPPORT +#define CMYK_SUPPORT +#define ICC_SUPPORT +#define PHOTOSHOP_SUPPORT +#define IPTC_SUPPORT + +#endif /* _TIFFCONF_ */ diff -Nru goldendict-1.5.0~git20131003/maclibs/include/tiff/tiff.h goldendict-1.5.0~git20150923/maclibs/include/tiff/tiff.h --- goldendict-1.5.0~git20131003/maclibs/include/tiff/tiff.h 1970-01-01 00:00:00.000000000 +0000 +++ goldendict-1.5.0~git20150923/maclibs/include/tiff/tiff.h 2015-09-23 08:26:24.000000000 +0000 @@ -0,0 +1,678 @@ +/* $Id: tiff.h,v 1.68 2012-08-19 16:56:35 bfriesen Exp $ */ + +/* + * Copyright (c) 1988-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. + * + * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND, + * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY + * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. + * + * IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR + * ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND, + * OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, + * WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF + * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE + * OF THIS SOFTWARE. + */ + +#ifndef _TIFF_ +#define _TIFF_ + +#include "tiffconf.h" + +/* + * Tag Image File Format (TIFF) + * + * Based on Rev 6.0 from: + * Developer's Desk + * Aldus Corporation + * 411 First Ave. South + * Suite 200 + * Seattle, WA 98104 + * 206-622-5500 + * + * (http://partners.adobe.com/asn/developer/PDFS/TN/TIFF6.pdf) + * + * For BigTIFF design notes see the following links + * http://www.remotesensing.org/libtiff/bigtiffdesign.html + * http://www.awaresystems.be/imaging/tiff/bigtiff.html + */ + +#define TIFF_VERSION_CLASSIC 42 +#define TIFF_VERSION_BIG 43 + +#define TIFF_BIGENDIAN 0x4d4d +#define TIFF_LITTLEENDIAN 0x4949 +#define MDI_LITTLEENDIAN 0x5045 +#define MDI_BIGENDIAN 0x4550 + +/* + * Intrinsic data types required by the file format: + * + * 8-bit quantities int8/uint8 + * 16-bit quantities int16/uint16 + * 32-bit quantities int32/uint32 + * 64-bit quantities int64/uint64 + * strings unsigned char* + */ + +typedef TIFF_INT8_T int8; +typedef TIFF_UINT8_T uint8; + +typedef TIFF_INT16_T int16; +typedef TIFF_UINT16_T uint16; + +typedef TIFF_INT32_T int32; +typedef TIFF_UINT32_T uint32; + +typedef TIFF_INT64_T int64; +typedef TIFF_UINT64_T uint64; + +/* + * Some types as promoted in a variable argument list + * We use uint16_vap rather then directly using int, because this way + * we document the type we actually want to pass through, conceptually, + * rather then confusing the issue by merely stating the type it gets + * promoted to + */ + +typedef int uint16_vap; + +/* + * TIFF header. + */ +typedef struct { + uint16 tiff_magic; /* magic number (defines byte order) */ + uint16 tiff_version; /* TIFF version number */ +} TIFFHeaderCommon; +typedef struct { + uint16 tiff_magic; /* magic number (defines byte order) */ + uint16 tiff_version; /* TIFF version number */ + uint32 tiff_diroff; /* byte offset to first directory */ +} TIFFHeaderClassic; +typedef struct { + uint16 tiff_magic; /* magic number (defines byte order) */ + uint16 tiff_version; /* TIFF version number */ + uint16 tiff_offsetsize; /* size of offsets, should be 8 */ + uint16 tiff_unused; /* unused word, should be 0 */ + uint64 tiff_diroff; /* byte offset to first directory */ +} TIFFHeaderBig; + + +/* + * NB: In the comments below, + * - items marked with a + are obsoleted by revision 5.0, + * - items marked with a ! are introduced in revision 6.0. + * - items marked with a % are introduced post revision 6.0. + * - items marked with a $ are obsoleted by revision 6.0. + * - items marked with a & are introduced by Adobe DNG specification. + */ + +/* + * Tag data type information. + * + * Note: RATIONALs are the ratio of two 32-bit integer values. + */ +typedef enum { + TIFF_NOTYPE = 0, /* placeholder */ + TIFF_BYTE = 1, /* 8-bit unsigned integer */ + TIFF_ASCII = 2, /* 8-bit bytes w/ last byte null */ + TIFF_SHORT = 3, /* 16-bit unsigned integer */ + TIFF_LONG = 4, /* 32-bit unsigned integer */ + TIFF_RATIONAL = 5, /* 64-bit unsigned fraction */ + TIFF_SBYTE = 6, /* !8-bit signed integer */ + TIFF_UNDEFINED = 7, /* !8-bit untyped data */ + TIFF_SSHORT = 8, /* !16-bit signed integer */ + TIFF_SLONG = 9, /* !32-bit signed integer */ + TIFF_SRATIONAL = 10, /* !64-bit signed fraction */ + TIFF_FLOAT = 11, /* !32-bit IEEE floating point */ + TIFF_DOUBLE = 12, /* !64-bit IEEE floating point */ + TIFF_IFD = 13, /* %32-bit unsigned integer (offset) */ + TIFF_LONG8 = 16, /* BigTIFF 64-bit unsigned integer */ + TIFF_SLONG8 = 17, /* BigTIFF 64-bit signed integer */ + TIFF_IFD8 = 18 /* BigTIFF 64-bit unsigned integer (offset) */ +} TIFFDataType; + +/* + * TIFF Tag Definitions. + */ +#define TIFFTAG_SUBFILETYPE 254 /* subfile data descriptor */ +#define FILETYPE_REDUCEDIMAGE 0x1 /* reduced resolution version */ +#define FILETYPE_PAGE 0x2 /* one page of many */ +#define FILETYPE_MASK 0x4 /* transparency mask */ +#define TIFFTAG_OSUBFILETYPE 255 /* +kind of data in subfile */ +#define OFILETYPE_IMAGE 1 /* full resolution image data */ +#define OFILETYPE_REDUCEDIMAGE 2 /* reduced size image data */ +#define OFILETYPE_PAGE 3 /* one page of many */ +#define TIFFTAG_IMAGEWIDTH 256 /* image width in pixels */ +#define TIFFTAG_IMAGELENGTH 257 /* image height in pixels */ +#define TIFFTAG_BITSPERSAMPLE 258 /* bits per channel (sample) */ +#define TIFFTAG_COMPRESSION 259 /* data compression technique */ +#define COMPRESSION_NONE 1 /* dump mode */ +#define COMPRESSION_CCITTRLE 2 /* CCITT modified Huffman RLE */ +#define COMPRESSION_CCITTFAX3 3 /* CCITT Group 3 fax encoding */ +#define COMPRESSION_CCITT_T4 3 /* CCITT T.4 (TIFF 6 name) */ +#define COMPRESSION_CCITTFAX4 4 /* CCITT Group 4 fax encoding */ +#define COMPRESSION_CCITT_T6 4 /* CCITT T.6 (TIFF 6 name) */ +#define COMPRESSION_LZW 5 /* Lempel-Ziv & Welch */ +#define COMPRESSION_OJPEG 6 /* !6.0 JPEG */ +#define COMPRESSION_JPEG 7 /* %JPEG DCT compression */ +#define COMPRESSION_T85 9 /* !TIFF/FX T.85 JBIG compression */ +#define COMPRESSION_T43 10 /* !TIFF/FX T.43 colour by layered JBIG compression */ +#define COMPRESSION_NEXT 32766 /* NeXT 2-bit RLE */ +#define COMPRESSION_CCITTRLEW 32771 /* #1 w/ word alignment */ +#define COMPRESSION_PACKBITS 32773 /* Macintosh RLE */ +#define COMPRESSION_THUNDERSCAN 32809 /* ThunderScan RLE */ +/* codes 32895-32898 are reserved for ANSI IT8 TIFF/IT */ +#define COMPRESSION_DCS 32947 /* Kodak DCS encoding */ +#define COMPRESSION_JBIG 34661 /* ISO JBIG */ +#define COMPRESSION_SGILOG 34676 /* SGI Log Luminance RLE */ +#define COMPRESSION_SGILOG24 34677 /* SGI Log 24-bit packed */ +#define COMPRESSION_JP2000 34712 /* Leadtools JPEG2000 */ +#define COMPRESSION_LZMA 34925 /* LZMA2 */ +#define TIFFTAG_PHOTOMETRIC 262 /* photometric interpretation */ +#define PHOTOMETRIC_MINISWHITE 0 /* min value is white */ +#define PHOTOMETRIC_MINISBLACK 1 /* min value is black */ +#define PHOTOMETRIC_RGB 2 /* RGB color model */ +#define PHOTOMETRIC_PALETTE 3 /* color map indexed */ +#define PHOTOMETRIC_MASK 4 /* $holdout mask */ +#define PHOTOMETRIC_SEPARATED 5 /* !color separations */ +#define PHOTOMETRIC_YCBCR 6 /* !CCIR 601 */ +#define PHOTOMETRIC_CIELAB 8 /* !1976 CIE L*a*b* */ +#define PHOTOMETRIC_ICCLAB 9 /* ICC L*a*b* [Adobe TIFF Technote 4] */ +#define PHOTOMETRIC_ITULAB 10 /* ITU L*a*b* */ +#define PHOTOMETRIC_LOGL 32844 /* CIE Log2(L) */ +#define PHOTOMETRIC_LOGLUV 32845 /* CIE Log2(L) (u',v') */ +#define TIFFTAG_THRESHHOLDING 263 /* +thresholding used on data */ +#define THRESHHOLD_BILEVEL 1 /* b&w art scan */ +#define THRESHHOLD_HALFTONE 2 /* or dithered scan */ +#define THRESHHOLD_ERRORDIFFUSE 3 /* usually floyd-steinberg */ +#define TIFFTAG_CELLWIDTH 264 /* +dithering matrix width */ +#define TIFFTAG_CELLLENGTH 265 /* +dithering matrix height */ +#define TIFFTAG_FILLORDER 266 /* data order within a byte */ +#define FILLORDER_MSB2LSB 1 /* most significant -> least */ +#define FILLORDER_LSB2MSB 2 /* least significant -> most */ +#define TIFFTAG_DOCUMENTNAME 269 /* name of doc. image is from */ +#define TIFFTAG_IMAGEDESCRIPTION 270 /* info about image */ +#define TIFFTAG_MAKE 271 /* scanner manufacturer name */ +#define TIFFTAG_MODEL 272 /* scanner model name/number */ +#define TIFFTAG_STRIPOFFSETS 273 /* offsets to data strips */ +#define TIFFTAG_ORIENTATION 274 /* +image orientation */ +#define ORIENTATION_TOPLEFT 1 /* row 0 top, col 0 lhs */ +#define ORIENTATION_TOPRIGHT 2 /* row 0 top, col 0 rhs */ +#define ORIENTATION_BOTRIGHT 3 /* row 0 bottom, col 0 rhs */ +#define ORIENTATION_BOTLEFT 4 /* row 0 bottom, col 0 lhs */ +#define ORIENTATION_LEFTTOP 5 /* row 0 lhs, col 0 top */ +#define ORIENTATION_RIGHTTOP 6 /* row 0 rhs, col 0 top */ +#define ORIENTATION_RIGHTBOT 7 /* row 0 rhs, col 0 bottom */ +#define ORIENTATION_LEFTBOT 8 /* row 0 lhs, col 0 bottom */ +#define TIFFTAG_SAMPLESPERPIXEL 277 /* samples per pixel */ +#define TIFFTAG_ROWSPERSTRIP 278 /* rows per strip of data */ +#define TIFFTAG_STRIPBYTECOUNTS 279 /* bytes counts for strips */ +#define TIFFTAG_MINSAMPLEVALUE 280 /* +minimum sample value */ +#define TIFFTAG_MAXSAMPLEVALUE 281 /* +maximum sample value */ +#define TIFFTAG_XRESOLUTION 282 /* pixels/resolution in x */ +#define TIFFTAG_YRESOLUTION 283 /* pixels/resolution in y */ +#define TIFFTAG_PLANARCONFIG 284 /* storage organization */ +#define PLANARCONFIG_CONTIG 1 /* single image plane */ +#define PLANARCONFIG_SEPARATE 2 /* separate planes of data */ +#define TIFFTAG_PAGENAME 285 /* page name image is from */ +#define TIFFTAG_XPOSITION 286 /* x page offset of image lhs */ +#define TIFFTAG_YPOSITION 287 /* y page offset of image lhs */ +#define TIFFTAG_FREEOFFSETS 288 /* +byte offset to free block */ +#define TIFFTAG_FREEBYTECOUNTS 289 /* +sizes of free blocks */ +#define TIFFTAG_GRAYRESPONSEUNIT 290 /* $gray scale curve accuracy */ +#define GRAYRESPONSEUNIT_10S 1 /* tenths of a unit */ +#define GRAYRESPONSEUNIT_100S 2 /* hundredths of a unit */ +#define GRAYRESPONSEUNIT_1000S 3 /* thousandths of a unit */ +#define GRAYRESPONSEUNIT_10000S 4 /* ten-thousandths of a unit */ +#define GRAYRESPONSEUNIT_100000S 5 /* hundred-thousandths */ +#define TIFFTAG_GRAYRESPONSECURVE 291 /* $gray scale response curve */ +#define TIFFTAG_GROUP3OPTIONS 292 /* 32 flag bits */ +#define TIFFTAG_T4OPTIONS 292 /* TIFF 6.0 proper name alias */ +#define GROUP3OPT_2DENCODING 0x1 /* 2-dimensional coding */ +#define GROUP3OPT_UNCOMPRESSED 0x2 /* data not compressed */ +#define GROUP3OPT_FILLBITS 0x4 /* fill to byte boundary */ +#define TIFFTAG_GROUP4OPTIONS 293 /* 32 flag bits */ +#define TIFFTAG_T6OPTIONS 293 /* TIFF 6.0 proper name */ +#define GROUP4OPT_UNCOMPRESSED 0x2 /* data not compressed */ +#define TIFFTAG_RESOLUTIONUNIT 296 /* units of resolutions */ +#define RESUNIT_NONE 1 /* no meaningful units */ +#define RESUNIT_INCH 2 /* english */ +#define RESUNIT_CENTIMETER 3 /* metric */ +#define TIFFTAG_PAGENUMBER 297 /* page numbers of multi-page */ +#define TIFFTAG_COLORRESPONSEUNIT 300 /* $color curve accuracy */ +#define COLORRESPONSEUNIT_10S 1 /* tenths of a unit */ +#define COLORRESPONSEUNIT_100S 2 /* hundredths of a unit */ +#define COLORRESPONSEUNIT_1000S 3 /* thousandths of a unit */ +#define COLORRESPONSEUNIT_10000S 4 /* ten-thousandths of a unit */ +#define COLORRESPONSEUNIT_100000S 5 /* hundred-thousandths */ +#define TIFFTAG_TRANSFERFUNCTION 301 /* !colorimetry info */ +#define TIFFTAG_SOFTWARE 305 /* name & release */ +#define TIFFTAG_DATETIME 306 /* creation date and time */ +#define TIFFTAG_ARTIST 315 /* creator of image */ +#define TIFFTAG_HOSTCOMPUTER 316 /* machine where created */ +#define TIFFTAG_PREDICTOR 317 /* prediction scheme w/ LZW */ +#define PREDICTOR_NONE 1 /* no prediction scheme used */ +#define PREDICTOR_HORIZONTAL 2 /* horizontal differencing */ +#define PREDICTOR_FLOATINGPOINT 3 /* floating point predictor */ +#define TIFFTAG_WHITEPOINT 318 /* image white point */ +#define TIFFTAG_PRIMARYCHROMATICITIES 319 /* !primary chromaticities */ +#define TIFFTAG_COLORMAP 320 /* RGB map for pallette image */ +#define TIFFTAG_HALFTONEHINTS 321 /* !highlight+shadow info */ +#define TIFFTAG_TILEWIDTH 322 /* !tile width in pixels */ +#define TIFFTAG_TILELENGTH 323 /* !tile height in pixels */ +#define TIFFTAG_TILEOFFSETS 324 /* !offsets to data tiles */ +#define TIFFTAG_TILEBYTECOUNTS 325 /* !byte counts for tiles */ +#define TIFFTAG_BADFAXLINES 326 /* lines w/ wrong pixel count */ +#define TIFFTAG_CLEANFAXDATA 327 /* regenerated line info */ +#define CLEANFAXDATA_CLEAN 0 /* no errors detected */ +#define CLEANFAXDATA_REGENERATED 1 /* receiver regenerated lines */ +#define CLEANFAXDATA_UNCLEAN 2 /* uncorrected errors exist */ +#define TIFFTAG_CONSECUTIVEBADFAXLINES 328 /* max consecutive bad lines */ +#define TIFFTAG_SUBIFD 330 /* subimage descriptors */ +#define TIFFTAG_INKSET 332 /* !inks in separated image */ +#define INKSET_CMYK 1 /* !cyan-magenta-yellow-black color */ +#define INKSET_MULTIINK 2 /* !multi-ink or hi-fi color */ +#define TIFFTAG_INKNAMES 333 /* !ascii names of inks */ +#define TIFFTAG_NUMBEROFINKS 334 /* !number of inks */ +#define TIFFTAG_DOTRANGE 336 /* !0% and 100% dot codes */ +#define TIFFTAG_TARGETPRINTER 337 /* !separation target */ +#define TIFFTAG_EXTRASAMPLES 338 /* !info about extra samples */ +#define EXTRASAMPLE_UNSPECIFIED 0 /* !unspecified data */ +#define EXTRASAMPLE_ASSOCALPHA 1 /* !associated alpha data */ +#define EXTRASAMPLE_UNASSALPHA 2 /* !unassociated alpha data */ +#define TIFFTAG_SAMPLEFORMAT 339 /* !data sample format */ +#define SAMPLEFORMAT_UINT 1 /* !unsigned integer data */ +#define SAMPLEFORMAT_INT 2 /* !signed integer data */ +#define SAMPLEFORMAT_IEEEFP 3 /* !IEEE floating point data */ +#define SAMPLEFORMAT_VOID 4 /* !untyped data */ +#define SAMPLEFORMAT_COMPLEXINT 5 /* !complex signed int */ +#define SAMPLEFORMAT_COMPLEXIEEEFP 6 /* !complex ieee floating */ +#define TIFFTAG_SMINSAMPLEVALUE 340 /* !variable MinSampleValue */ +#define TIFFTAG_SMAXSAMPLEVALUE 341 /* !variable MaxSampleValue */ +#define TIFFTAG_CLIPPATH 343 /* %ClipPath + [Adobe TIFF technote 2] */ +#define TIFFTAG_XCLIPPATHUNITS 344 /* %XClipPathUnits + [Adobe TIFF technote 2] */ +#define TIFFTAG_YCLIPPATHUNITS 345 /* %YClipPathUnits + [Adobe TIFF technote 2] */ +#define TIFFTAG_INDEXED 346 /* %Indexed + [Adobe TIFF Technote 3] */ +#define TIFFTAG_JPEGTABLES 347 /* %JPEG table stream */ +#define TIFFTAG_OPIPROXY 351 /* %OPI Proxy [Adobe TIFF technote] */ +/* Tags 400-435 are from the TIFF/FX spec */ +#define TIFFTAG_GLOBALPARAMETERSIFD 400 /* ! */ +#define TIFFTAG_PROFILETYPE 401 /* ! */ +#define PROFILETYPE_UNSPECIFIED 0 /* ! */ +#define PROFILETYPE_G3_FAX 1 /* ! */ +#define TIFFTAG_FAXPROFILE 402 /* ! */ +#define FAXPROFILE_S 1 /* !TIFF/FX FAX profile S */ +#define FAXPROFILE_F 2 /* !TIFF/FX FAX profile F */ +#define FAXPROFILE_J 3 /* !TIFF/FX FAX profile J */ +#define FAXPROFILE_C 4 /* !TIFF/FX FAX profile C */ +#define FAXPROFILE_L 5 /* !TIFF/FX FAX profile L */ +#define FAXPROFILE_M 6 /* !TIFF/FX FAX profile LM */ +#define TIFFTAG_CODINGMETHODS 403 /* !TIFF/FX coding methods */ +#define CODINGMETHODS_T4_1D (1 << 1) /* !T.4 1D */ +#define CODINGMETHODS_T4_2D (1 << 2) /* !T.4 2D */ +#define CODINGMETHODS_T6 (1 << 3) /* !T.6 */ +#define CODINGMETHODS_T85 (1 << 4) /* !T.85 JBIG */ +#define CODINGMETHODS_T42 (1 << 5) /* !T.42 JPEG */ +#define CODINGMETHODS_T43 (1 << 6) /* !T.43 colour by layered JBIG */ +#define TIFFTAG_VERSIONYEAR 404 /* !TIFF/FX version year */ +#define TIFFTAG_MODENUMBER 405 /* !TIFF/FX mode number */ +#define TIFFTAG_DECODE 433 /* !TIFF/FX decode */ +#define TIFFTAG_IMAGEBASECOLOR 434 /* !TIFF/FX image base colour */ +#define TIFFTAG_T82OPTIONS 435 /* !TIFF/FX T.82 options */ +/* + * Tags 512-521 are obsoleted by Technical Note #2 which specifies a + * revised JPEG-in-TIFF scheme. + */ +#define TIFFTAG_JPEGPROC 512 /* !JPEG processing algorithm */ +#define JPEGPROC_BASELINE 1 /* !baseline sequential */ +#define JPEGPROC_LOSSLESS 14 /* !Huffman coded lossless */ +#define TIFFTAG_JPEGIFOFFSET 513 /* !pointer to SOI marker */ +#define TIFFTAG_JPEGIFBYTECOUNT 514 /* !JFIF stream length */ +#define TIFFTAG_JPEGRESTARTINTERVAL 515 /* !restart interval length */ +#define TIFFTAG_JPEGLOSSLESSPREDICTORS 517 /* !lossless proc predictor */ +#define TIFFTAG_JPEGPOINTTRANSFORM 518 /* !lossless point transform */ +#define TIFFTAG_JPEGQTABLES 519 /* !Q matrice offsets */ +#define TIFFTAG_JPEGDCTABLES 520 /* !DCT table offsets */ +#define TIFFTAG_JPEGACTABLES 521 /* !AC coefficient offsets */ +#define TIFFTAG_YCBCRCOEFFICIENTS 529 /* !RGB -> YCbCr transform */ +#define TIFFTAG_YCBCRSUBSAMPLING 530 /* !YCbCr subsampling factors */ +#define TIFFTAG_YCBCRPOSITIONING 531 /* !subsample positioning */ +#define YCBCRPOSITION_CENTERED 1 /* !as in PostScript Level 2 */ +#define YCBCRPOSITION_COSITED 2 /* !as in CCIR 601-1 */ +#define TIFFTAG_REFERENCEBLACKWHITE 532 /* !colorimetry info */ +#define TIFFTAG_STRIPROWCOUNTS 559 /* !TIFF/FX strip row counts */ +#define TIFFTAG_XMLPACKET 700 /* %XML packet + [Adobe XMP Specification, + January 2004 */ +#define TIFFTAG_OPIIMAGEID 32781 /* %OPI ImageID + [Adobe TIFF technote] */ +/* tags 32952-32956 are private tags registered to Island Graphics */ +#define TIFFTAG_REFPTS 32953 /* image reference points */ +#define TIFFTAG_REGIONTACKPOINT 32954 /* region-xform tack point */ +#define TIFFTAG_REGIONWARPCORNERS 32955 /* warp quadrilateral */ +#define TIFFTAG_REGIONAFFINE 32956 /* affine transformation mat */ +/* tags 32995-32999 are private tags registered to SGI */ +#define TIFFTAG_MATTEING 32995 /* $use ExtraSamples */ +#define TIFFTAG_DATATYPE 32996 /* $use SampleFormat */ +#define TIFFTAG_IMAGEDEPTH 32997 /* z depth of image */ +#define TIFFTAG_TILEDEPTH 32998 /* z depth/data tile */ +/* tags 33300-33309 are private tags registered to Pixar */ +/* + * TIFFTAG_PIXAR_IMAGEFULLWIDTH and TIFFTAG_PIXAR_IMAGEFULLLENGTH + * are set when an image has been cropped out of a larger image. + * They reflect the size of the original uncropped image. + * The TIFFTAG_XPOSITION and TIFFTAG_YPOSITION can be used + * to determine the position of the smaller image in the larger one. + */ +#define TIFFTAG_PIXAR_IMAGEFULLWIDTH 33300 /* full image size in x */ +#define TIFFTAG_PIXAR_IMAGEFULLLENGTH 33301 /* full image size in y */ + /* Tags 33302-33306 are used to identify special image modes and data + * used by Pixar's texture formats. + */ +#define TIFFTAG_PIXAR_TEXTUREFORMAT 33302 /* texture map format */ +#define TIFFTAG_PIXAR_WRAPMODES 33303 /* s & t wrap modes */ +#define TIFFTAG_PIXAR_FOVCOT 33304 /* cotan(fov) for env. maps */ +#define TIFFTAG_PIXAR_MATRIX_WORLDTOSCREEN 33305 +#define TIFFTAG_PIXAR_MATRIX_WORLDTOCAMERA 33306 +/* tag 33405 is a private tag registered to Eastman Kodak */ +#define TIFFTAG_WRITERSERIALNUMBER 33405 /* device serial number */ +/* tag 33432 is listed in the 6.0 spec w/ unknown ownership */ +#define TIFFTAG_COPYRIGHT 33432 /* copyright string */ +/* IPTC TAG from RichTIFF specifications */ +#define TIFFTAG_RICHTIFFIPTC 33723 +/* 34016-34029 are reserved for ANSI IT8 TIFF/IT */ +#define TIFFTAG_STONITS 37439 /* Sample value to Nits */ +/* tag 34929 is a private tag registered to FedEx */ +#define TIFFTAG_FEDEX_EDR 34929 /* unknown use */ +#define TIFFTAG_INTEROPERABILITYIFD 40965 /* Pointer to Interoperability private directory */ +/* Adobe Digital Negative (DNG) format tags */ +#define TIFFTAG_DNGVERSION 50706 /* &DNG version number */ +#define TIFFTAG_DNGBACKWARDVERSION 50707 /* &DNG compatibility version */ +#define TIFFTAG_UNIQUECAMERAMODEL 50708 /* &name for the camera model */ +#define TIFFTAG_LOCALIZEDCAMERAMODEL 50709 /* &localized camera model + name */ +#define TIFFTAG_CFAPLANECOLOR 50710 /* &CFAPattern->LinearRaw space + mapping */ +#define TIFFTAG_CFALAYOUT 50711 /* &spatial layout of the CFA */ +#define TIFFTAG_LINEARIZATIONTABLE 50712 /* &lookup table description */ +#define TIFFTAG_BLACKLEVELREPEATDIM 50713 /* &repeat pattern size for + the BlackLevel tag */ +#define TIFFTAG_BLACKLEVEL 50714 /* &zero light encoding level */ +#define TIFFTAG_BLACKLEVELDELTAH 50715 /* &zero light encoding level + differences (columns) */ +#define TIFFTAG_BLACKLEVELDELTAV 50716 /* &zero light encoding level + differences (rows) */ +#define TIFFTAG_WHITELEVEL 50717 /* &fully saturated encoding + level */ +#define TIFFTAG_DEFAULTSCALE 50718 /* &default scale factors */ +#define TIFFTAG_DEFAULTCROPORIGIN 50719 /* &origin of the final image + area */ +#define TIFFTAG_DEFAULTCROPSIZE 50720 /* &size of the final image + area */ +#define TIFFTAG_COLORMATRIX1 50721 /* &XYZ->reference color space + transformation matrix 1 */ +#define TIFFTAG_COLORMATRIX2 50722 /* &XYZ->reference color space + transformation matrix 2 */ +#define TIFFTAG_CAMERACALIBRATION1 50723 /* &calibration matrix 1 */ +#define TIFFTAG_CAMERACALIBRATION2 50724 /* &calibration matrix 2 */ +#define TIFFTAG_REDUCTIONMATRIX1 50725 /* &dimensionality reduction + matrix 1 */ +#define TIFFTAG_REDUCTIONMATRIX2 50726 /* &dimensionality reduction + matrix 2 */ +#define TIFFTAG_ANALOGBALANCE 50727 /* &gain applied the stored raw + values*/ +#define TIFFTAG_ASSHOTNEUTRAL 50728 /* &selected white balance in + linear reference space */ +#define TIFFTAG_ASSHOTWHITEXY 50729 /* &selected white balance in + x-y chromaticity + coordinates */ +#define TIFFTAG_BASELINEEXPOSURE 50730 /* &how much to move the zero + point */ +#define TIFFTAG_BASELINENOISE 50731 /* &relative noise level */ +#define TIFFTAG_BASELINESHARPNESS 50732 /* &relative amount of + sharpening */ +#define TIFFTAG_BAYERGREENSPLIT 50733 /* &how closely the values of + the green pixels in the + blue/green rows track the + values of the green pixels + in the red/green rows */ +#define TIFFTAG_LINEARRESPONSELIMIT 50734 /* &non-linear encoding range */ +#define TIFFTAG_CAMERASERIALNUMBER 50735 /* &camera's serial number */ +#define TIFFTAG_LENSINFO 50736 /* info about the lens */ +#define TIFFTAG_CHROMABLURRADIUS 50737 /* &chroma blur radius */ +#define TIFFTAG_ANTIALIASSTRENGTH 50738 /* &relative strength of the + camera's anti-alias filter */ +#define TIFFTAG_SHADOWSCALE 50739 /* &used by Adobe Camera Raw */ +#define TIFFTAG_DNGPRIVATEDATA 50740 /* &manufacturer's private data */ +#define TIFFTAG_MAKERNOTESAFETY 50741 /* &whether the EXIF MakerNote + tag is safe to preserve + along with the rest of the + EXIF data */ +#define TIFFTAG_CALIBRATIONILLUMINANT1 50778 /* &illuminant 1 */ +#define TIFFTAG_CALIBRATIONILLUMINANT2 50779 /* &illuminant 2 */ +#define TIFFTAG_BESTQUALITYSCALE 50780 /* &best quality multiplier */ +#define TIFFTAG_RAWDATAUNIQUEID 50781 /* &unique identifier for + the raw image data */ +#define TIFFTAG_ORIGINALRAWFILENAME 50827 /* &file name of the original + raw file */ +#define TIFFTAG_ORIGINALRAWFILEDATA 50828 /* &contents of the original + raw file */ +#define TIFFTAG_ACTIVEAREA 50829 /* &active (non-masked) pixels + of the sensor */ +#define TIFFTAG_MASKEDAREAS 50830 /* &list of coordinates + of fully masked pixels */ +#define TIFFTAG_ASSHOTICCPROFILE 50831 /* &these two tags used to */ +#define TIFFTAG_ASSHOTPREPROFILEMATRIX 50832 /* map cameras's color space + into ICC profile space */ +#define TIFFTAG_CURRENTICCPROFILE 50833 /* & */ +#define TIFFTAG_CURRENTPREPROFILEMATRIX 50834 /* & */ +/* tag 65535 is an undefined tag used by Eastman Kodak */ +#define TIFFTAG_DCSHUESHIFTVALUES 65535 /* hue shift correction data */ + +/* + * The following are ``pseudo tags'' that can be used to control + * codec-specific functionality. These tags are not written to file. + * Note that these values start at 0xffff+1 so that they'll never + * collide with Aldus-assigned tags. + * + * If you want your private pseudo tags ``registered'' (i.e. added to + * this file), please post a bug report via the tracking system at + * http://www.remotesensing.org/libtiff/bugs.html with the appropriate + * C definitions to add. + */ +#define TIFFTAG_FAXMODE 65536 /* Group 3/4 format control */ +#define FAXMODE_CLASSIC 0x0000 /* default, include RTC */ +#define FAXMODE_NORTC 0x0001 /* no RTC at end of data */ +#define FAXMODE_NOEOL 0x0002 /* no EOL code at end of row */ +#define FAXMODE_BYTEALIGN 0x0004 /* byte align row */ +#define FAXMODE_WORDALIGN 0x0008 /* word align row */ +#define FAXMODE_CLASSF FAXMODE_NORTC /* TIFF Class F */ +#define TIFFTAG_JPEGQUALITY 65537 /* Compression quality level */ +/* Note: quality level is on the IJG 0-100 scale. Default value is 75 */ +#define TIFFTAG_JPEGCOLORMODE 65538 /* Auto RGB<=>YCbCr convert? */ +#define JPEGCOLORMODE_RAW 0x0000 /* no conversion (default) */ +#define JPEGCOLORMODE_RGB 0x0001 /* do auto conversion */ +#define TIFFTAG_JPEGTABLESMODE 65539 /* What to put in JPEGTables */ +#define JPEGTABLESMODE_QUANT 0x0001 /* include quantization tbls */ +#define JPEGTABLESMODE_HUFF 0x0002 /* include Huffman tbls */ +/* Note: default is JPEGTABLESMODE_QUANT | JPEGTABLESMODE_HUFF */ +#define TIFFTAG_FAXFILLFUNC 65540 /* G3/G4 fill function */ +#define TIFFTAG_PIXARLOGDATAFMT 65549 /* PixarLogCodec I/O data sz */ +#define PIXARLOGDATAFMT_8BIT 0 /* regular u_char samples */ +#define PIXARLOGDATAFMT_8BITABGR 1 /* ABGR-order u_chars */ +#define PIXARLOGDATAFMT_11BITLOG 2 /* 11-bit log-encoded (raw) */ +#define PIXARLOGDATAFMT_12BITPICIO 3 /* as per PICIO (1.0==2048) */ +#define PIXARLOGDATAFMT_16BIT 4 /* signed short samples */ +#define PIXARLOGDATAFMT_FLOAT 5 /* IEEE float samples */ +/* 65550-65556 are allocated to Oceana Matrix */ +#define TIFFTAG_DCSIMAGERTYPE 65550 /* imager model & filter */ +#define DCSIMAGERMODEL_M3 0 /* M3 chip (1280 x 1024) */ +#define DCSIMAGERMODEL_M5 1 /* M5 chip (1536 x 1024) */ +#define DCSIMAGERMODEL_M6 2 /* M6 chip (3072 x 2048) */ +#define DCSIMAGERFILTER_IR 0 /* infrared filter */ +#define DCSIMAGERFILTER_MONO 1 /* monochrome filter */ +#define DCSIMAGERFILTER_CFA 2 /* color filter array */ +#define DCSIMAGERFILTER_OTHER 3 /* other filter */ +#define TIFFTAG_DCSINTERPMODE 65551 /* interpolation mode */ +#define DCSINTERPMODE_NORMAL 0x0 /* whole image, default */ +#define DCSINTERPMODE_PREVIEW 0x1 /* preview of image (384x256) */ +#define TIFFTAG_DCSBALANCEARRAY 65552 /* color balance values */ +#define TIFFTAG_DCSCORRECTMATRIX 65553 /* color correction values */ +#define TIFFTAG_DCSGAMMA 65554 /* gamma value */ +#define TIFFTAG_DCSTOESHOULDERPTS 65555 /* toe & shoulder points */ +#define TIFFTAG_DCSCALIBRATIONFD 65556 /* calibration file desc */ +/* Note: quality level is on the ZLIB 1-9 scale. Default value is -1 */ +#define TIFFTAG_ZIPQUALITY 65557 /* compression quality level */ +#define TIFFTAG_PIXARLOGQUALITY 65558 /* PixarLog uses same scale */ +/* 65559 is allocated to Oceana Matrix */ +#define TIFFTAG_DCSCLIPRECTANGLE 65559 /* area of image to acquire */ +#define TIFFTAG_SGILOGDATAFMT 65560 /* SGILog user data format */ +#define SGILOGDATAFMT_FLOAT 0 /* IEEE float samples */ +#define SGILOGDATAFMT_16BIT 1 /* 16-bit samples */ +#define SGILOGDATAFMT_RAW 2 /* uninterpreted data */ +#define SGILOGDATAFMT_8BIT 3 /* 8-bit RGB monitor values */ +#define TIFFTAG_SGILOGENCODE 65561 /* SGILog data encoding control*/ +#define SGILOGENCODE_NODITHER 0 /* do not dither encoded values*/ +#define SGILOGENCODE_RANDITHER 1 /* randomly dither encd values */ +#define TIFFTAG_LZMAPRESET 65562 /* LZMA2 preset (compression level) */ +#define TIFFTAG_PERSAMPLE 65563 /* interface for per sample tags */ +#define PERSAMPLE_MERGED 0 /* present as a single value */ +#define PERSAMPLE_MULTI 1 /* present as multiple values */ + +/* + * EXIF tags + */ +#define EXIFTAG_EXPOSURETIME 33434 /* Exposure time */ +#define EXIFTAG_FNUMBER 33437 /* F number */ +#define EXIFTAG_EXPOSUREPROGRAM 34850 /* Exposure program */ +#define EXIFTAG_SPECTRALSENSITIVITY 34852 /* Spectral sensitivity */ +#define EXIFTAG_ISOSPEEDRATINGS 34855 /* ISO speed rating */ +#define EXIFTAG_OECF 34856 /* Optoelectric conversion + factor */ +#define EXIFTAG_EXIFVERSION 36864 /* Exif version */ +#define EXIFTAG_DATETIMEORIGINAL 36867 /* Date and time of original + data generation */ +#define EXIFTAG_DATETIMEDIGITIZED 36868 /* Date and time of digital + data generation */ +#define EXIFTAG_COMPONENTSCONFIGURATION 37121 /* Meaning of each component */ +#define EXIFTAG_COMPRESSEDBITSPERPIXEL 37122 /* Image compression mode */ +#define EXIFTAG_SHUTTERSPEEDVALUE 37377 /* Shutter speed */ +#define EXIFTAG_APERTUREVALUE 37378 /* Aperture */ +#define EXIFTAG_BRIGHTNESSVALUE 37379 /* Brightness */ +#define EXIFTAG_EXPOSUREBIASVALUE 37380 /* Exposure bias */ +#define EXIFTAG_MAXAPERTUREVALUE 37381 /* Maximum lens aperture */ +#define EXIFTAG_SUBJECTDISTANCE 37382 /* Subject distance */ +#define EXIFTAG_METERINGMODE 37383 /* Metering mode */ +#define EXIFTAG_LIGHTSOURCE 37384 /* Light source */ +#define EXIFTAG_FLASH 37385 /* Flash */ +#define EXIFTAG_FOCALLENGTH 37386 /* Lens focal length */ +#define EXIFTAG_SUBJECTAREA 37396 /* Subject area */ +#define EXIFTAG_MAKERNOTE 37500 /* Manufacturer notes */ +#define EXIFTAG_USERCOMMENT 37510 /* User comments */ +#define EXIFTAG_SUBSECTIME 37520 /* DateTime subseconds */ +#define EXIFTAG_SUBSECTIMEORIGINAL 37521 /* DateTimeOriginal subseconds */ +#define EXIFTAG_SUBSECTIMEDIGITIZED 37522 /* DateTimeDigitized subseconds */ +#define EXIFTAG_FLASHPIXVERSION 40960 /* Supported Flashpix version */ +#define EXIFTAG_COLORSPACE 40961 /* Color space information */ +#define EXIFTAG_PIXELXDIMENSION 40962 /* Valid image width */ +#define EXIFTAG_PIXELYDIMENSION 40963 /* Valid image height */ +#define EXIFTAG_RELATEDSOUNDFILE 40964 /* Related audio file */ +#define EXIFTAG_FLASHENERGY 41483 /* Flash energy */ +#define EXIFTAG_SPATIALFREQUENCYRESPONSE 41484 /* Spatial frequency response */ +#define EXIFTAG_FOCALPLANEXRESOLUTION 41486 /* Focal plane X resolution */ +#define EXIFTAG_FOCALPLANEYRESOLUTION 41487 /* Focal plane Y resolution */ +#define EXIFTAG_FOCALPLANERESOLUTIONUNIT 41488 /* Focal plane resolution unit */ +#define EXIFTAG_SUBJECTLOCATION 41492 /* Subject location */ +#define EXIFTAG_EXPOSUREINDEX 41493 /* Exposure index */ +#define EXIFTAG_SENSINGMETHOD 41495 /* Sensing method */ +#define EXIFTAG_FILESOURCE 41728 /* File source */ +#define EXIFTAG_SCENETYPE 41729 /* Scene type */ +#define EXIFTAG_CFAPATTERN 41730 /* CFA pattern */ +#define EXIFTAG_CUSTOMRENDERED 41985 /* Custom image processing */ +#define EXIFTAG_EXPOSUREMODE 41986 /* Exposure mode */ +#define EXIFTAG_WHITEBALANCE 41987 /* White balance */ +#define EXIFTAG_DIGITALZOOMRATIO 41988 /* Digital zoom ratio */ +#define EXIFTAG_FOCALLENGTHIN35MMFILM 41989 /* Focal length in 35 mm film */ +#define EXIFTAG_SCENECAPTURETYPE 41990 /* Scene capture type */ +#define EXIFTAG_GAINCONTROL 41991 /* Gain control */ +#define EXIFTAG_CONTRAST 41992 /* Contrast */ +#define EXIFTAG_SATURATION 41993 /* Saturation */ +#define EXIFTAG_SHARPNESS 41994 /* Sharpness */ +#define EXIFTAG_DEVICESETTINGDESCRIPTION 41995 /* Device settings description */ +#define EXIFTAG_SUBJECTDISTANCERANGE 41996 /* Subject distance range */ +#define EXIFTAG_GAINCONTROL 41991 /* Gain control */ +#define EXIFTAG_GAINCONTROL 41991 /* Gain control */ +#define EXIFTAG_IMAGEUNIQUEID 42016 /* Unique image ID */ + +#endif /* _TIFF_ */ + +/* vim: set ts=8 sts=8 sw=8 noet: */ +/* + * Local Variables: + * mode: c + * c-basic-offset: 8 + * fill-column: 78 + * End: + */ diff -Nru goldendict-1.5.0~git20131003/maclibs/include/tiff/tiffio.h goldendict-1.5.0~git20150923/maclibs/include/tiff/tiffio.h --- goldendict-1.5.0~git20131003/maclibs/include/tiff/tiffio.h 1970-01-01 00:00:00.000000000 +0000 +++ goldendict-1.5.0~git20150923/maclibs/include/tiff/tiffio.h 2015-09-23 08:26:24.000000000 +0000 @@ -0,0 +1,557 @@ +/* $Id: tiffio.h,v 1.91 2012-07-29 15:45:29 tgl Exp $ */ + +/* + * Copyright (c) 1988-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. + * + * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND, + * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY + * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. + * + * IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR + * ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND, + * OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, + * WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF + * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE + * OF THIS SOFTWARE. + */ + +#ifndef _TIFFIO_ +#define _TIFFIO_ + +/* + * TIFF I/O Library Definitions. + */ +#include "tiff.h" +#include "tiffvers.h" + +/* + * TIFF is defined as an incomplete type to hide the + * library's internal data structures from clients. + */ +typedef struct tiff TIFF; + +/* + * The following typedefs define the intrinsic size of + * data types used in the *exported* interfaces. These + * definitions depend on the proper definition of types + * in tiff.h. Note also that the varargs interface used + * to pass tag types and values uses the types defined in + * tiff.h directly. + * + * NB: ttag_t is unsigned int and not unsigned short because + * ANSI C requires that the type before the ellipsis be a + * promoted type (i.e. one of int, unsigned int, pointer, + * or double) and because we defined pseudo-tags that are + * outside the range of legal Aldus-assigned tags. + * NB: tsize_t is int32 and not uint32 because some functions + * return -1. + * NB: toff_t is not off_t for many reasons; TIFFs max out at + * 32-bit file offsets, and BigTIFF maxes out at 64-bit + * offsets being the most important, and to ensure use of + * a consistently unsigned type across architectures. + * Prior to libtiff 4.0, this was an unsigned 32 bit type. + */ +/* + * this is the machine addressing size type, only it's signed, so make it + * int32 on 32bit machines, int64 on 64bit machines + */ +typedef TIFF_SSIZE_T tmsize_t; +typedef uint64 toff_t; /* file offset */ +/* the following are deprecated and should be replaced by their defining + counterparts */ +typedef uint32 ttag_t; /* directory tag */ +typedef uint16 tdir_t; /* directory index */ +typedef uint16 tsample_t; /* sample number */ +typedef uint32 tstrile_t; /* strip or tile number */ +typedef tstrile_t tstrip_t; /* strip number */ +typedef tstrile_t ttile_t; /* tile number */ +typedef tmsize_t tsize_t; /* i/o size in bytes */ +typedef void* tdata_t; /* image data ref */ + +#if !defined(__WIN32__) && (defined(_WIN32) || defined(WIN32)) +#define __WIN32__ +#endif + +/* + * On windows you should define USE_WIN32_FILEIO if you are using tif_win32.c + * or AVOID_WIN32_FILEIO if you are using something else (like tif_unix.c). + * + * By default tif_unix.c is assumed. + */ + +#if defined(_WINDOWS) || defined(__WIN32__) || defined(_Windows) +# if !defined(__CYGWIN) && !defined(AVOID_WIN32_FILEIO) && !defined(USE_WIN32_FILEIO) +# define AVOID_WIN32_FILEIO +# endif +#endif + +#if defined(USE_WIN32_FILEIO) +# define VC_EXTRALEAN +# include +# ifdef __WIN32__ +DECLARE_HANDLE(thandle_t); /* Win32 file handle */ +# else +typedef HFILE thandle_t; /* client data handle */ +# endif /* __WIN32__ */ +#else +typedef void* thandle_t; /* client data handle */ +#endif /* USE_WIN32_FILEIO */ + +/* + * Flags to pass to TIFFPrintDirectory to control + * printing of data structures that are potentially + * very large. Bit-or these flags to enable printing + * multiple items. + */ +#define TIFFPRINT_NONE 0x0 /* no extra info */ +#define TIFFPRINT_STRIPS 0x1 /* strips/tiles info */ +#define TIFFPRINT_CURVES 0x2 /* color/gray response curves */ +#define TIFFPRINT_COLORMAP 0x4 /* colormap */ +#define TIFFPRINT_JPEGQTABLES 0x100 /* JPEG Q matrices */ +#define TIFFPRINT_JPEGACTABLES 0x200 /* JPEG AC tables */ +#define TIFFPRINT_JPEGDCTABLES 0x200 /* JPEG DC tables */ + +/* + * Colour conversion stuff + */ + +/* reference white */ +#define D65_X0 (95.0470F) +#define D65_Y0 (100.0F) +#define D65_Z0 (108.8827F) + +#define D50_X0 (96.4250F) +#define D50_Y0 (100.0F) +#define D50_Z0 (82.4680F) + +/* Structure for holding information about a display device. */ + +typedef unsigned char TIFFRGBValue; /* 8-bit samples */ + +typedef struct { + float d_mat[3][3]; /* XYZ -> luminance matrix */ + float d_YCR; /* Light o/p for reference white */ + float d_YCG; + float d_YCB; + uint32 d_Vrwr; /* Pixel values for ref. white */ + uint32 d_Vrwg; + uint32 d_Vrwb; + float d_Y0R; /* Residual light for black pixel */ + float d_Y0G; + float d_Y0B; + float d_gammaR; /* Gamma values for the three guns */ + float d_gammaG; + float d_gammaB; +} TIFFDisplay; + +typedef struct { /* YCbCr->RGB support */ + TIFFRGBValue* clamptab; /* range clamping table */ + int* Cr_r_tab; + int* Cb_b_tab; + int32* Cr_g_tab; + int32* Cb_g_tab; + int32* Y_tab; +} TIFFYCbCrToRGB; + +typedef struct { /* CIE Lab 1976->RGB support */ + int range; /* Size of conversion table */ +#define CIELABTORGB_TABLE_RANGE 1500 + float rstep, gstep, bstep; + float X0, Y0, Z0; /* Reference white point */ + TIFFDisplay display; + float Yr2r[CIELABTORGB_TABLE_RANGE + 1]; /* Conversion of Yr to r */ + float Yg2g[CIELABTORGB_TABLE_RANGE + 1]; /* Conversion of Yg to g */ + float Yb2b[CIELABTORGB_TABLE_RANGE + 1]; /* Conversion of Yb to b */ +} TIFFCIELabToRGB; + +/* + * RGBA-style image support. + */ +typedef struct _TIFFRGBAImage TIFFRGBAImage; +/* + * The image reading and conversion routines invoke + * ``put routines'' to copy/image/whatever tiles of + * raw image data. A default set of routines are + * provided to convert/copy raw image data to 8-bit + * packed ABGR format rasters. Applications can supply + * alternate routines that unpack the data into a + * different format or, for example, unpack the data + * and draw the unpacked raster on the display. + */ +typedef void (*tileContigRoutine) + (TIFFRGBAImage*, uint32*, uint32, uint32, uint32, uint32, int32, int32, + unsigned char*); +typedef void (*tileSeparateRoutine) + (TIFFRGBAImage*, uint32*, uint32, uint32, uint32, uint32, int32, int32, + unsigned char*, unsigned char*, unsigned char*, unsigned char*); +/* + * RGBA-reader state. + */ +struct _TIFFRGBAImage { + TIFF* tif; /* image handle */ + int stoponerr; /* stop on read error */ + int isContig; /* data is packed/separate */ + int alpha; /* type of alpha data present */ + uint32 width; /* image width */ + uint32 height; /* image height */ + uint16 bitspersample; /* image bits/sample */ + uint16 samplesperpixel; /* image samples/pixel */ + uint16 orientation; /* image orientation */ + uint16 req_orientation; /* requested orientation */ + uint16 photometric; /* image photometric interp */ + uint16* redcmap; /* colormap pallete */ + uint16* greencmap; + uint16* bluecmap; + /* get image data routine */ + int (*get)(TIFFRGBAImage*, uint32*, uint32, uint32); + /* put decoded strip/tile */ + union { + void (*any)(TIFFRGBAImage*); + tileContigRoutine contig; + tileSeparateRoutine separate; + } put; + TIFFRGBValue* Map; /* sample mapping array */ + uint32** BWmap; /* black&white map */ + uint32** PALmap; /* palette image map */ + TIFFYCbCrToRGB* ycbcr; /* YCbCr conversion state */ + TIFFCIELabToRGB* cielab; /* CIE L*a*b conversion state */ + + uint8* UaToAa; /* Unassociated alpha to associated alpha convertion LUT */ + uint8* Bitdepth16To8; /* LUT for conversion from 16bit to 8bit values */ + + int row_offset; + int col_offset; +}; + +/* + * Macros for extracting components from the + * packed ABGR form returned by TIFFReadRGBAImage. + */ +#define TIFFGetR(abgr) ((abgr) & 0xff) +#define TIFFGetG(abgr) (((abgr) >> 8) & 0xff) +#define TIFFGetB(abgr) (((abgr) >> 16) & 0xff) +#define TIFFGetA(abgr) (((abgr) >> 24) & 0xff) + +/* + * A CODEC is a software package that implements decoding, + * encoding, or decoding+encoding of a compression algorithm. + * The library provides a collection of builtin codecs. + * More codecs may be registered through calls to the library + * and/or the builtin implementations may be overridden. + */ +typedef int (*TIFFInitMethod)(TIFF*, int); +typedef struct { + char* name; + uint16 scheme; + TIFFInitMethod init; +} TIFFCodec; + +#include +#include + +/* share internal LogLuv conversion routines? */ +#ifndef LOGLUV_PUBLIC +#define LOGLUV_PUBLIC 1 +#endif + +#if !defined(__GNUC__) && !defined(__attribute__) +# define __attribute__(x) /*nothing*/ +#endif + +#if defined(c_plusplus) || defined(__cplusplus) +extern "C" { +#endif +typedef void (*TIFFErrorHandler)(const char*, const char*, va_list); +typedef void (*TIFFErrorHandlerExt)(thandle_t, const char*, const char*, va_list); +typedef tmsize_t (*TIFFReadWriteProc)(thandle_t, void*, tmsize_t); +typedef toff_t (*TIFFSeekProc)(thandle_t, toff_t, int); +typedef int (*TIFFCloseProc)(thandle_t); +typedef toff_t (*TIFFSizeProc)(thandle_t); +typedef int (*TIFFMapFileProc)(thandle_t, void** base, toff_t* size); +typedef void (*TIFFUnmapFileProc)(thandle_t, void* base, toff_t size); +typedef void (*TIFFExtendProc)(TIFF*); + +extern const char* TIFFGetVersion(void); + +extern const TIFFCodec* TIFFFindCODEC(uint16); +extern TIFFCodec* TIFFRegisterCODEC(uint16, const char*, TIFFInitMethod); +extern void TIFFUnRegisterCODEC(TIFFCodec*); +extern int TIFFIsCODECConfigured(uint16); +extern TIFFCodec* TIFFGetConfiguredCODECs(void); + +/* + * Auxiliary functions. + */ + +extern void* _TIFFmalloc(tmsize_t s); +extern void* _TIFFrealloc(void* p, tmsize_t s); +extern void _TIFFmemset(void* p, int v, tmsize_t c); +extern void _TIFFmemcpy(void* d, const void* s, tmsize_t c); +extern int _TIFFmemcmp(const void* p1, const void* p2, tmsize_t c); +extern void _TIFFfree(void* p); + +/* +** Stuff, related to tag handling and creating custom tags. +*/ +extern int TIFFGetTagListCount( TIFF * ); +extern uint32 TIFFGetTagListEntry( TIFF *, int tag_index ); + +#define TIFF_ANY TIFF_NOTYPE /* for field descriptor searching */ +#define TIFF_VARIABLE -1 /* marker for variable length tags */ +#define TIFF_SPP -2 /* marker for SamplesPerPixel tags */ +#define TIFF_VARIABLE2 -3 /* marker for uint32 var-length tags */ + +#define FIELD_CUSTOM 65 + +typedef struct _TIFFField TIFFField; +typedef struct _TIFFFieldArray TIFFFieldArray; + +extern const TIFFField* TIFFFindField(TIFF *, uint32, TIFFDataType); +extern const TIFFField* TIFFFieldWithTag(TIFF*, uint32); +extern const TIFFField* TIFFFieldWithName(TIFF*, const char *); + +extern uint32 TIFFFieldTag(const TIFFField*); +extern const char* TIFFFieldName(const TIFFField*); +extern TIFFDataType TIFFFieldDataType(const TIFFField*); +extern int TIFFFieldPassCount(const TIFFField*); +extern int TIFFFieldReadCount(const TIFFField*); +extern int TIFFFieldWriteCount(const TIFFField*); + +typedef int (*TIFFVSetMethod)(TIFF*, uint32, va_list); +typedef int (*TIFFVGetMethod)(TIFF*, uint32, va_list); +typedef void (*TIFFPrintMethod)(TIFF*, FILE*, long); + +typedef struct { + TIFFVSetMethod vsetfield; /* tag set routine */ + TIFFVGetMethod vgetfield; /* tag get routine */ + TIFFPrintMethod printdir; /* directory print routine */ +} TIFFTagMethods; + +extern TIFFTagMethods *TIFFAccessTagMethods(TIFF *); +extern void *TIFFGetClientInfo(TIFF *, const char *); +extern void TIFFSetClientInfo(TIFF *, void *, const char *); + +extern void TIFFCleanup(TIFF* tif); +extern void TIFFClose(TIFF* tif); +extern int TIFFFlush(TIFF* tif); +extern int TIFFFlushData(TIFF* tif); +extern int TIFFGetField(TIFF* tif, uint32 tag, ...); +extern int TIFFVGetField(TIFF* tif, uint32 tag, va_list ap); +extern int TIFFGetFieldDefaulted(TIFF* tif, uint32 tag, ...); +extern int TIFFVGetFieldDefaulted(TIFF* tif, uint32 tag, va_list ap); +extern int TIFFReadDirectory(TIFF* tif); +extern int TIFFReadCustomDirectory(TIFF* tif, toff_t diroff, const TIFFFieldArray* infoarray); +extern int TIFFReadEXIFDirectory(TIFF* tif, toff_t diroff); +extern uint64 TIFFScanlineSize64(TIFF* tif); +extern tmsize_t TIFFScanlineSize(TIFF* tif); +extern uint64 TIFFRasterScanlineSize64(TIFF* tif); +extern tmsize_t TIFFRasterScanlineSize(TIFF* tif); +extern uint64 TIFFStripSize64(TIFF* tif); +extern tmsize_t TIFFStripSize(TIFF* tif); +extern uint64 TIFFRawStripSize64(TIFF* tif, uint32 strip); +extern tmsize_t TIFFRawStripSize(TIFF* tif, uint32 strip); +extern uint64 TIFFVStripSize64(TIFF* tif, uint32 nrows); +extern tmsize_t TIFFVStripSize(TIFF* tif, uint32 nrows); +extern uint64 TIFFTileRowSize64(TIFF* tif); +extern tmsize_t TIFFTileRowSize(TIFF* tif); +extern uint64 TIFFTileSize64(TIFF* tif); +extern tmsize_t TIFFTileSize(TIFF* tif); +extern uint64 TIFFVTileSize64(TIFF* tif, uint32 nrows); +extern tmsize_t TIFFVTileSize(TIFF* tif, uint32 nrows); +extern uint32 TIFFDefaultStripSize(TIFF* tif, uint32 request); +extern void TIFFDefaultTileSize(TIFF*, uint32*, uint32*); +extern int TIFFFileno(TIFF*); +extern int TIFFSetFileno(TIFF*, int); +extern thandle_t TIFFClientdata(TIFF*); +extern thandle_t TIFFSetClientdata(TIFF*, thandle_t); +extern int TIFFGetMode(TIFF*); +extern int TIFFSetMode(TIFF*, int); +extern int TIFFIsTiled(TIFF*); +extern int TIFFIsByteSwapped(TIFF*); +extern int TIFFIsUpSampled(TIFF*); +extern int TIFFIsMSB2LSB(TIFF*); +extern int TIFFIsBigEndian(TIFF*); +extern TIFFReadWriteProc TIFFGetReadProc(TIFF*); +extern TIFFReadWriteProc TIFFGetWriteProc(TIFF*); +extern TIFFSeekProc TIFFGetSeekProc(TIFF*); +extern TIFFCloseProc TIFFGetCloseProc(TIFF*); +extern TIFFSizeProc TIFFGetSizeProc(TIFF*); +extern TIFFMapFileProc TIFFGetMapFileProc(TIFF*); +extern TIFFUnmapFileProc TIFFGetUnmapFileProc(TIFF*); +extern uint32 TIFFCurrentRow(TIFF*); +extern uint16 TIFFCurrentDirectory(TIFF*); +extern uint16 TIFFNumberOfDirectories(TIFF*); +extern uint64 TIFFCurrentDirOffset(TIFF*); +extern uint32 TIFFCurrentStrip(TIFF*); +extern uint32 TIFFCurrentTile(TIFF* tif); +extern int TIFFReadBufferSetup(TIFF* tif, void* bp, tmsize_t size); +extern int TIFFWriteBufferSetup(TIFF* tif, void* bp, tmsize_t size); +extern int TIFFSetupStrips(TIFF *); +extern int TIFFWriteCheck(TIFF*, int, const char *); +extern void TIFFFreeDirectory(TIFF*); +extern int TIFFCreateDirectory(TIFF*); +extern int TIFFCreateCustomDirectory(TIFF*,const TIFFFieldArray*); +extern int TIFFCreateEXIFDirectory(TIFF*); +extern int TIFFLastDirectory(TIFF*); +extern int TIFFSetDirectory(TIFF*, uint16); +extern int TIFFSetSubDirectory(TIFF*, uint64); +extern int TIFFUnlinkDirectory(TIFF*, uint16); +extern int TIFFSetField(TIFF*, uint32, ...); +extern int TIFFVSetField(TIFF*, uint32, va_list); +extern int TIFFUnsetField(TIFF*, uint32); +extern int TIFFWriteDirectory(TIFF *); +extern int TIFFWriteCustomDirectory(TIFF *, uint64 *); +extern int TIFFCheckpointDirectory(TIFF *); +extern int TIFFRewriteDirectory(TIFF *); + +#if defined(c_plusplus) || defined(__cplusplus) +extern void TIFFPrintDirectory(TIFF*, FILE*, long = 0); +extern int TIFFReadScanline(TIFF* tif, void* buf, uint32 row, uint16 sample = 0); +extern int TIFFWriteScanline(TIFF* tif, void* buf, uint32 row, uint16 sample = 0); +extern int TIFFReadRGBAImage(TIFF*, uint32, uint32, uint32*, int = 0); +extern int TIFFReadRGBAImageOriented(TIFF*, uint32, uint32, uint32*, + int = ORIENTATION_BOTLEFT, int = 0); +#else +extern void TIFFPrintDirectory(TIFF*, FILE*, long); +extern int TIFFReadScanline(TIFF* tif, void* buf, uint32 row, uint16 sample); +extern int TIFFWriteScanline(TIFF* tif, void* buf, uint32 row, uint16 sample); +extern int TIFFReadRGBAImage(TIFF*, uint32, uint32, uint32*, int); +extern int TIFFReadRGBAImageOriented(TIFF*, uint32, uint32, uint32*, int, int); +#endif + +extern int TIFFReadRGBAStrip(TIFF*, uint32, uint32 * ); +extern int TIFFReadRGBATile(TIFF*, uint32, uint32, uint32 * ); +extern int TIFFRGBAImageOK(TIFF*, char [1024]); +extern int TIFFRGBAImageBegin(TIFFRGBAImage*, TIFF*, int, char [1024]); +extern int TIFFRGBAImageGet(TIFFRGBAImage*, uint32*, uint32, uint32); +extern void TIFFRGBAImageEnd(TIFFRGBAImage*); +extern TIFF* TIFFOpen(const char*, const char*); +# ifdef __WIN32__ +extern TIFF* TIFFOpenW(const wchar_t*, const char*); +# endif /* __WIN32__ */ +extern TIFF* TIFFFdOpen(int, const char*, const char*); +extern TIFF* TIFFClientOpen(const char*, const char*, + thandle_t, + TIFFReadWriteProc, TIFFReadWriteProc, + TIFFSeekProc, TIFFCloseProc, + TIFFSizeProc, + TIFFMapFileProc, TIFFUnmapFileProc); +extern const char* TIFFFileName(TIFF*); +extern const char* TIFFSetFileName(TIFF*, const char *); +extern void TIFFError(const char*, const char*, ...) __attribute__((__format__ (__printf__,2,3))); +extern void TIFFErrorExt(thandle_t, const char*, const char*, ...) __attribute__((__format__ (__printf__,3,4))); +extern void TIFFWarning(const char*, const char*, ...) __attribute__((__format__ (__printf__,2,3))); +extern void TIFFWarningExt(thandle_t, const char*, const char*, ...) __attribute__((__format__ (__printf__,3,4))); +extern TIFFErrorHandler TIFFSetErrorHandler(TIFFErrorHandler); +extern TIFFErrorHandlerExt TIFFSetErrorHandlerExt(TIFFErrorHandlerExt); +extern TIFFErrorHandler TIFFSetWarningHandler(TIFFErrorHandler); +extern TIFFErrorHandlerExt TIFFSetWarningHandlerExt(TIFFErrorHandlerExt); +extern TIFFExtendProc TIFFSetTagExtender(TIFFExtendProc); +extern uint32 TIFFComputeTile(TIFF* tif, uint32 x, uint32 y, uint32 z, uint16 s); +extern int TIFFCheckTile(TIFF* tif, uint32 x, uint32 y, uint32 z, uint16 s); +extern uint32 TIFFNumberOfTiles(TIFF*); +extern tmsize_t TIFFReadTile(TIFF* tif, void* buf, uint32 x, uint32 y, uint32 z, uint16 s); +extern tmsize_t TIFFWriteTile(TIFF* tif, void* buf, uint32 x, uint32 y, uint32 z, uint16 s); +extern uint32 TIFFComputeStrip(TIFF*, uint32, uint16); +extern uint32 TIFFNumberOfStrips(TIFF*); +extern tmsize_t TIFFReadEncodedStrip(TIFF* tif, uint32 strip, void* buf, tmsize_t size); +extern tmsize_t TIFFReadRawStrip(TIFF* tif, uint32 strip, void* buf, tmsize_t size); +extern tmsize_t TIFFReadEncodedTile(TIFF* tif, uint32 tile, void* buf, tmsize_t size); +extern tmsize_t TIFFReadRawTile(TIFF* tif, uint32 tile, void* buf, tmsize_t size); +extern tmsize_t TIFFWriteEncodedStrip(TIFF* tif, uint32 strip, void* data, tmsize_t cc); +extern tmsize_t TIFFWriteRawStrip(TIFF* tif, uint32 strip, void* data, tmsize_t cc); +extern tmsize_t TIFFWriteEncodedTile(TIFF* tif, uint32 tile, void* data, tmsize_t cc); +extern tmsize_t TIFFWriteRawTile(TIFF* tif, uint32 tile, void* data, tmsize_t cc); +extern int TIFFDataWidth(TIFFDataType); /* table of tag datatype widths */ +extern void TIFFSetWriteOffset(TIFF* tif, toff_t off); +extern void TIFFSwabShort(uint16*); +extern void TIFFSwabLong(uint32*); +extern void TIFFSwabLong8(uint64*); +extern void TIFFSwabFloat(float*); +extern void TIFFSwabDouble(double*); +extern void TIFFSwabArrayOfShort(uint16* wp, tmsize_t n); +extern void TIFFSwabArrayOfTriples(uint8* tp, tmsize_t n); +extern void TIFFSwabArrayOfLong(uint32* lp, tmsize_t n); +extern void TIFFSwabArrayOfLong8(uint64* lp, tmsize_t n); +extern void TIFFSwabArrayOfFloat(float* fp, tmsize_t n); +extern void TIFFSwabArrayOfDouble(double* dp, tmsize_t n); +extern void TIFFReverseBits(uint8* cp, tmsize_t n); +extern const unsigned char* TIFFGetBitRevTable(int); + +#ifdef LOGLUV_PUBLIC +#define U_NEU 0.210526316 +#define V_NEU 0.473684211 +#define UVSCALE 410. +extern double LogL16toY(int); +extern double LogL10toY(int); +extern void XYZtoRGB24(float*, uint8*); +extern int uv_decode(double*, double*, int); +extern void LogLuv24toXYZ(uint32, float*); +extern void LogLuv32toXYZ(uint32, float*); +#if defined(c_plusplus) || defined(__cplusplus) +extern int LogL16fromY(double, int = SGILOGENCODE_NODITHER); +extern int LogL10fromY(double, int = SGILOGENCODE_NODITHER); +extern int uv_encode(double, double, int = SGILOGENCODE_NODITHER); +extern uint32 LogLuv24fromXYZ(float*, int = SGILOGENCODE_NODITHER); +extern uint32 LogLuv32fromXYZ(float*, int = SGILOGENCODE_NODITHER); +#else +extern int LogL16fromY(double, int); +extern int LogL10fromY(double, int); +extern int uv_encode(double, double, int); +extern uint32 LogLuv24fromXYZ(float*, int); +extern uint32 LogLuv32fromXYZ(float*, int); +#endif +#endif /* LOGLUV_PUBLIC */ + +extern int TIFFCIELabToRGBInit(TIFFCIELabToRGB*, const TIFFDisplay *, float*); +extern void TIFFCIELabToXYZ(TIFFCIELabToRGB *, uint32, int32, int32, + float *, float *, float *); +extern void TIFFXYZToRGB(TIFFCIELabToRGB *, float, float, float, + uint32 *, uint32 *, uint32 *); + +extern int TIFFYCbCrToRGBInit(TIFFYCbCrToRGB*, float*, float*); +extern void TIFFYCbCrtoRGB(TIFFYCbCrToRGB *, uint32, int32, int32, + uint32 *, uint32 *, uint32 *); + +/**************************************************************************** + * O B S O L E T E D I N T E R F A C E S + * + * Don't use this stuff in your applications, it may be removed in the future + * libtiff versions. + ****************************************************************************/ +typedef struct { + ttag_t field_tag; /* field's tag */ + short field_readcount; /* read count/TIFF_VARIABLE/TIFF_SPP */ + short field_writecount; /* write count/TIFF_VARIABLE */ + TIFFDataType field_type; /* type of associated data */ + unsigned short field_bit; /* bit in fieldsset bit vector */ + unsigned char field_oktochange; /* if true, can change while writing */ + unsigned char field_passcount; /* if true, pass dir count on set */ + char *field_name; /* ASCII name */ +} TIFFFieldInfo; + +extern int TIFFMergeFieldInfo(TIFF*, const TIFFFieldInfo[], uint32); + +#if defined(c_plusplus) || defined(__cplusplus) +} +#endif + +#endif /* _TIFFIO_ */ + +/* vim: set ts=8 sts=8 sw=8 noet: */ +/* + * Local Variables: + * mode: c + * c-basic-offset: 8 + * fill-column: 78 + * End: + */ diff -Nru goldendict-1.5.0~git20131003/maclibs/include/tiff/tiffvers.h goldendict-1.5.0~git20150923/maclibs/include/tiff/tiffvers.h --- goldendict-1.5.0~git20131003/maclibs/include/tiff/tiffvers.h 1970-01-01 00:00:00.000000000 +0000 +++ goldendict-1.5.0~git20150923/maclibs/include/tiff/tiffvers.h 2015-09-23 08:26:24.000000000 +0000 @@ -0,0 +1,9 @@ +#define TIFFLIB_VERSION_STR "LIBTIFF, Version 4.0.3\nCopyright (c) 1988-1996 Sam Leffler\nCopyright (c) 1991-1996 Silicon Graphics, Inc." +/* + * This define can be used in code that requires + * compilation-related definitions specific to a + * version or versions of the library. Runtime + * version checking should be done based on the + * string returned by TIFFGetVersion. + */ +#define TIFFLIB_VERSION 20120922 Binary files /tmp/tfsuf_fVoJ/goldendict-1.5.0~git20131003/maclibs/lib/libeb.dylib and /tmp/nAvqxsPo0O/goldendict-1.5.0~git20150923/maclibs/lib/libeb.dylib differ Binary files /tmp/tfsuf_fVoJ/goldendict-1.5.0~git20131003/maclibs/lib/liblzma.a and /tmp/nAvqxsPo0O/goldendict-1.5.0~git20150923/maclibs/lib/liblzma.a differ Binary files /tmp/tfsuf_fVoJ/goldendict-1.5.0~git20131003/maclibs/lib/libtiff.dylib and /tmp/nAvqxsPo0O/goldendict-1.5.0~git20150923/maclibs/lib/libtiff.dylib differ diff -Nru goldendict-1.5.0~git20131003/macmouseover.hh goldendict-1.5.0~git20150923/macmouseover.hh --- goldendict-1.5.0~git20131003/macmouseover.hh 2013-08-16 09:41:47.000000000 +0000 +++ goldendict-1.5.0~git20150923/macmouseover.hh 2015-09-23 08:26:24.000000000 +0000 @@ -31,6 +31,8 @@ /// Called from event loop callback void mouseMoved(); + + static bool isAXAPIEnabled(); signals: diff -Nru goldendict-1.5.0~git20131003/macmouseover.mm goldendict-1.5.0~git20150923/macmouseover.mm --- goldendict-1.5.0~git20131003/macmouseover.mm 2013-08-16 09:41:47.000000000 +0000 +++ goldendict-1.5.0~git20150923/macmouseover.mm 2015-09-23 08:26:24.000000000 +0000 @@ -3,6 +3,7 @@ #include #include #include +#include const int mouseOverInterval = 300; @@ -91,7 +92,7 @@ void MacMouseOver::enableMouseOver() { mouseTimer.stop(); - if( !AXAPIEnabled() ) + if( !isAXAPIEnabled() ) return; if( !tapRef ) tapRef = CGEventTapCreate( kCGAnnotatedSessionEventTap, kCGHeadInsertEventTap, @@ -121,7 +122,7 @@ return; if( !pPref ) return; - if( pPref->enableScanPopupModifiers && checkModifiersPressed( pPref->scanPopupModifiers ) ) + if( !pPref->enableScanPopupModifiers || checkModifiersPressed( pPref->scanPopupModifiers ) ) handlePosition(); } @@ -318,3 +319,11 @@ emit instance().hovered( word, false ); } + +bool MacMouseOver::isAXAPIEnabled() +{ + if( NSFoundationVersionNumber >= 1000 ) // MacOS 10.9+ + return AXIsProcessTrusted(); + + return AXAPIEnabled(); +} diff -Nru goldendict-1.5.0~git20131003/main.cc goldendict-1.5.0~git20150923/main.cc --- goldendict-1.5.0~git20131003/main.cc 2013-10-02 20:42:04.000000000 +0000 +++ goldendict-1.5.0~git20150923/main.cc 2015-09-23 08:26:24.000000000 +0000 @@ -31,7 +31,11 @@ #include #include -QFile logFile; +#include "gddebug.hh" + +#ifdef Q_OS_MAC +#include "lionsupport.h" +#endif void gdMessageHandler( QtMsgType type, const char *msg ) { @@ -83,7 +87,12 @@ { #ifdef Q_OS_MAC setenv("LANG", "en_US.UTF-8", 1); - setenv("QT_GRAPHICSSYSTEM", "raster", 1); + + // Check for retina display + if( LionSupport::isRetinaDisplay() ) + QApplication::setGraphicsSystem( "native" ); + else + QApplication::setGraphicsSystem( "raster" ); #endif // The following clause fixes a race in the MinGW runtime where throwing @@ -222,11 +231,15 @@ logFile.remove(); logFile.open( QFile::ReadWrite ); + // Write UTF-8 BOM + QByteArray line; + line.append( 0xEF ).append( 0xBB ).append( 0xBF ); + logFile.write( line ); + // Install message handler qInstallMsgHandler( gdMessageHandler ); } - if ( Config::isPortableVersion() ) { // For portable version, hardcode some settings @@ -284,8 +297,5 @@ app.removeDataCommiter( m ); - if( logFile.isOpen() ) - logFile.close(); - return r; } diff -Nru goldendict-1.5.0~git20131003/maintabwidget.cc goldendict-1.5.0~git20150923/maintabwidget.cc --- goldendict-1.5.0~git20131003/maintabwidget.cc 2013-08-16 09:45:56.000000000 +0000 +++ goldendict-1.5.0~git20150923/maintabwidget.cc 2015-09-23 08:26:24.000000000 +0000 @@ -55,7 +55,9 @@ if( ev->type() == QEvent::MouseButtonDblClick ) { QMouseEvent * mev = static_cast< QMouseEvent *>( ev ); - if( tabBar()->tabAt( mev->pos() ) == -1 ) + if( mev->y() >= tabBar()->rect().y() + && mev->y() <= tabBar()->rect().y() + tabBar()->rect().height() + && tabBar()->tabAt( mev->pos() ) == -1 ) { emit doubleClicked(); return true; diff -Nru goldendict-1.5.0~git20131003/mainwindow.cc goldendict-1.5.0~git20150923/mainwindow.cc --- goldendict-1.5.0~git20131003/mainwindow.cc 2013-10-02 20:42:04.000000000 +0000 +++ goldendict-1.5.0~git20150923/mainwindow.cc 2015-09-23 08:26:24.000000000 +0000 @@ -1,12 +1,18 @@ /* This file is (c) 2008-2012 Konstantin Isakov * Part of GoldenDict. Licensed under GPLv3 or later, see the LICENSE file */ +#ifndef NO_EPWING_SUPPORT +#include "epwing_book.hh" +#endif + #include "mainwindow.hh" #include "editdictionaries.hh" #include "loaddictionaries.hh" #include "preferences.hh" #include "about.hh" #include "mruqmenu.hh" +#include "gestures.hh" +#include "dictheadwords.hh" #include #include #include @@ -17,7 +23,7 @@ #include #include #include -#include "dprintf.hh" +#include "gddebug.hh" #include #include #include "dictinfo.hh" @@ -28,9 +34,12 @@ #include #include #include +#include +#include "ui_authentication.h" #ifdef Q_OS_MAC #include "lionsupport.h" +#include "macmouseover.hh" #endif #ifdef Q_OS_WIN32 @@ -38,6 +47,10 @@ #include "mouseover_win32/GDDataTranfer.h" #include "wstring.hh" #include "wstring_qt.hh" + +#define gdStoreNormalGeometryEvent ( ( QEvent::Type )( QEvent::User + 1 ) ) +#define gdApplyNormalGeometryEvent ( ( QEvent::Type )( QEvent::User + 2 ) ) + #endif #ifdef Q_WS_X11 @@ -45,6 +58,8 @@ #include #endif +#define MIN_THREAD_COUNT 4 + using std::set; using std::wstring; using std::map; @@ -80,6 +95,8 @@ useSmallIconsInToolbarsAction( tr( "Show Small Icons in &Toolbars" ), this ), toggleMenuBarAction( tr( "&Menubar" ), this ), switchExpandModeAction( this ), + focusHeadwordsDlgAction( this ), + focusArticleViewAction( this ), trayIconMenu( this ), addTab( this ), cfg( cfg_ ), @@ -96,20 +113,36 @@ wordListSelChanged( false ) , wasMaximized( false ) , blockUpdateWindowTitle( false ) +, headwordsDlg( 0 ) +, ftsIndexing( dictionaries ) +, ftsDlg( 0 ) +, helpWindow( 0 ) #ifdef Q_OS_WIN32 , gdAskMessage( 0xFFFFFFFF ) #endif { + if( QThreadPool::globalInstance()->maxThreadCount() < MIN_THREAD_COUNT ) + QThreadPool::globalInstance()->setMaxThreadCount( MIN_THREAD_COUNT ); + #ifndef QT_NO_OPENSSL QThreadPool::globalInstance()->start( new InitSSLRunnable ); #endif +#ifndef NO_EPWING_SUPPORT + Epwing::initialize(); +#endif + applyQtStyleSheet( cfg.preferences.displayStyle, cfg.preferences.addonStyle ); ui.setupUi( this ); articleMaker.setCollapseParameters( cfg.preferences.collapseBigArticles, cfg.preferences.articleSizeLimit ); +#if QT_VERSION >= QT_VERSION_CHECK(4, 6, 0) + // Set own gesture recognizers + Gestures::registerRecognizers(); +#endif + // use our own, cutsom statusbar setStatusBar(0); mainStatusBar = new MainStatusBar( this ); @@ -207,8 +240,11 @@ buttonMenu->addSeparator(); buttonMenu->addMenu( ui.menuFile ); buttonMenu->addMenu( ui.menuView ); + buttonMenu->addMenu( ui.menuSearch ); buttonMenu->addMenu( ui.menu_Help ); + ui.fullTextSearchAction->setEnabled( cfg.preferences.fts.enabled ); + menuButton = new QToolButton( navToolbar ); menuButton->setPopupMode( QToolButton::InstantPopup ); menuButton->setMenu( buttonMenu ); @@ -311,31 +347,21 @@ connect( trayIconMenu.addAction( tr( "&Quit" ) ), SIGNAL( triggered() ), qApp, SLOT( quit() ) ); - escAction.setShortcutContext( Qt::WidgetWithChildrenShortcut ); + addGlobalAction( &escAction, SLOT( handleEsc() ) ); escAction.setShortcut( QKeySequence( "Esc" ) ); - connect( &escAction, SIGNAL( triggered() ), - this, SLOT( handleEsc() ) ); - focusTranslateLineAction.setShortcutContext( Qt::WidgetWithChildrenShortcut ); + addGlobalAction( &focusTranslateLineAction, SLOT( focusTranslateLine() ) ); focusTranslateLineAction.setShortcuts( QList< QKeySequence >() << QKeySequence( "Alt+D" ) << QKeySequence( "Ctrl+L" ) ); - connect( &focusTranslateLineAction, SIGNAL( triggered() ), - this, SLOT( focusTranslateLine() ) ); + addGlobalAction( &focusHeadwordsDlgAction, SLOT( focusHeadwordsDialog() ) ); + focusHeadwordsDlgAction.setShortcut( QKeySequence( "Ctrl+D" ) ); + + addGlobalAction( &focusArticleViewAction, SLOT( focusArticleView() ) ); + focusArticleViewAction.setShortcut( QKeySequence( "Ctrl+N" ) ); - ui.centralWidget->addAction( &escAction ); - ui.dictsPane->addAction( &escAction ); - ui.searchPaneWidget->addAction( &escAction ); - ui.historyPane->addAction( &escAction ); - groupList->addAction( &escAction ); - translateBox->addAction( &escAction ); - - ui.centralWidget->addAction( &focusTranslateLineAction ); - ui.dictsPane->addAction( &focusTranslateLineAction ); - ui.searchPaneWidget->addAction( &focusTranslateLineAction ); - ui.historyPane->addAction( &focusTranslateLineAction ); - groupList->addAction( &focusTranslateLineAction ); + addGlobalAction( ui.fullTextSearchAction, SLOT( showFullTextSearchDialog() ) ); addTabAction.setShortcutContext( Qt::WidgetWithChildrenShortcut ); addTabAction.setShortcut( QKeySequence( "Ctrl+T" ) ); @@ -494,6 +520,9 @@ connect( &dictionaryBar, SIGNAL( showDictionaryInfo( QString const & ) ), this, SLOT( showDictionaryInfo( QString const & ) ) ); + connect( &dictionaryBar, SIGNAL( showDictionaryHeadwords( QString const & ) ), + this, SLOT( showDictionaryHeadwords( QString const & ) ) ); + connect( &dictionaryBar, SIGNAL( openDictionaryFolder( QString const & ) ), this, SLOT( openDictionaryFolder( QString const & ) ) ); @@ -582,6 +611,8 @@ this, SLOT( openConfigFolder() ) ); connect( ui.about, SIGNAL( triggered() ), this, SLOT( showAbout() ) ); + connect( ui.showReference, SIGNAL( triggered() ), + this, SLOT( showGDHelp() ) ); connect( groupListInDock, SIGNAL( currentIndexChanged( QString const & ) ), this, SLOT( currentGroupChanged( QString const & ) ) ); @@ -644,13 +675,16 @@ ui.historyList->installEventFilter( this ); #ifdef Q_OS_WIN - QRect baseGeometry; + if( cfg.normalMainWindowGeometry.width() <= 0 ) + { + QRect r = QApplication::desktop()->availableGeometry(); + cfg.normalMainWindowGeometry.setRect( r.width() / 4, r.height() / 4, r.width() / 2, r.height() / 2 ); + } if( cfg.maximizedMainWindowGeometry.width() > 0 ) { + setGeometry( cfg.maximizedMainWindowGeometry ); if ( cfg.mainWindowGeometry.size() ) restoreGeometry( cfg.mainWindowGeometry ); - baseGeometry = geometry(); - setGeometry( cfg.maximizedMainWindowGeometry ); if ( cfg.mainWindowState.size() ) restoreState( cfg.mainWindowState, 1 ); setWindowState( windowState() | Qt::WindowMaximized ); @@ -670,6 +704,12 @@ applyProxySettings(); applyWebSettings(); + connect( &dictNetMgr, SIGNAL( proxyAuthenticationRequired( QNetworkProxy, QAuthenticator * ) ), + this, SLOT( proxyAuthentication( QNetworkProxy, QAuthenticator * ) ) ); + + connect( &articleNetMgr, SIGNAL( proxyAuthenticationRequired( QNetworkProxy, QAuthenticator * ) ), + this, SLOT( proxyAuthentication( QNetworkProxy, QAuthenticator * ) ) ); + makeDictionaries(); // After we have dictionaries and groups, we can populate history @@ -732,15 +772,6 @@ { show(); focusTranslateLine(); -#ifdef Q_OS_WIN - if( baseGeometry.width() > 0 ) - { - hide(); - setGeometry( baseGeometry ); - showMaximized(); - activateWindow(); - } -#endif } connect( &newReleaseCheckTimer, SIGNAL( timeout() ), @@ -758,8 +789,8 @@ updateStatusLine(); -#ifdef Q_OS_MACX - if( cfg.preferences.startWithScanPopupOn && !AXAPIEnabled() ) +#ifdef Q_OS_MAC + if( cfg.preferences.startWithScanPopupOn && !MacMouseOver::isAXAPIEnabled() ) mainStatusBar->showMessage( tr( "Accessibility API is not enabled" ), 10000, QPixmap( ":/icons/error.png" ) ); #endif @@ -773,7 +804,20 @@ #endif #ifdef Q_OS_WIN32 gdAskMessage = RegisterWindowMessage( GD_MESSAGE_NAME ); + ( static_cast< QHotkeyApplication * >( qApp ) )->setMainWindow( this ); #endif + +#if QT_VERSION >= QT_VERSION_CHECK(4, 6, 0) + ui.centralWidget->grabGesture( Gestures::GDPinchGestureType ); + ui.centralWidget->grabGesture( Gestures::GDSwipeGestureType ); +#endif + + if( layoutDirection() == Qt::RightToLeft ) + { + // Adjust button icons for Right-To-Left layout + navBack->setIcon( QIcon( ":/icons/next.png" ) ); + navForward->setIcon( QIcon( ":/icons/previous.png" ) ); + } } void MainWindow::ctrlTabPressed() @@ -824,6 +868,8 @@ translateBoxToolBarAction->setVisible( true ); } + translateLine->setToolTip( tr( "String to search in dictionaries. The wildcards '*', '?' and sets of symbols '[...]' are allowed.\nTo find '*', '?', '[', ']' symbols use '\\*', '\\?', '\\[', '\\]' respectively" ) ); + // reset the flag when switching UI modes wordListSelChanged = false; @@ -867,9 +913,25 @@ { #ifdef Q_OS_WIN if( isMaximized() ) + { cfg.maximizedMainWindowGeometry = geometry(); + } else + { cfg.maximizedMainWindowGeometry = QRect(); + if( !isMinimized() ) + cfg.normalMainWindowGeometry = geometry(); + } +#endif + + closeHeadwordsDialog(); + + ftsIndexing.stopIndexing(); + +#if QT_VERSION >= QT_VERSION_CHECK(4, 6, 0) + ui.centralWidget->ungrabGesture( Gestures::GDPinchGestureType ); + ui.centralWidget->ungrabGesture( Gestures::GDSwipeGestureType ); + Gestures::unregisterRecognizers(); #endif // Close all tabs -- they should be destroyed before network managers @@ -883,9 +945,32 @@ delete w; } +#ifndef NO_EPWING_SUPPORT + Epwing::finalize(); +#endif + commitData(); +} - history.save(); +void MainWindow::addGlobalAction( QAction * action, const char * slot ) +{ + action->setShortcutContext( Qt::WidgetWithChildrenShortcut ); + connect( action, SIGNAL( triggered() ), this, slot ); + + ui.centralWidget->addAction( action ); + ui.dictsPane->addAction( action ); + ui.searchPaneWidget->addAction( action ); + ui.historyPane->addAction( action ); + groupList->addAction( action ); + translateBox->addAction( action ); +} + +void MainWindow::addGlobalActionsToDialog( QDialog * dialog ) +{ + dialog->addAction( &focusTranslateLineAction ); + dialog->addAction( &focusHeadwordsDlgAction ); + dialog->addAction( &focusArticleViewAction ); + dialog->addAction( ui.fullTextSearchAction ); } void MainWindow::commitData( QSessionManager & ) @@ -908,7 +993,16 @@ scanPopup.reset(); // Save any changes in last chosen groups etc - Config::save( cfg ); + try + { + Config::save( cfg ); + } + catch( std::exception & e ) + { + gdWarning( "Configuration saving failed, error: %s\n", e.what() ); + } + + history.save(); } } @@ -1032,6 +1126,18 @@ void MainWindow::applyProxySettings() { + if( cfg.preferences.proxyServer.enabled && cfg.preferences.proxyServer.useSystemProxy ) + { + QList proxies = QNetworkProxyFactory::systemProxyForQuery(); + if( !cfg.preferences.proxyServer.systemProxyUser.isEmpty() ) + { + proxies.first().setUser( cfg.preferences.proxyServer.systemProxyUser ); + proxies.first().setPassword( cfg.preferences.proxyServer.systemProxyPassword ); + } + QNetworkProxy::setApplicationProxy( proxies.first() ); + return; + } + QNetworkProxy::ProxyType type = QNetworkProxy::NoProxy; if ( cfg.preferences.proxyServer.enabled ) @@ -1085,8 +1191,17 @@ dictionariesUnmuted.clear(); + ftsIndexing.stopIndexing(); + ftsIndexing.clearDictionaries(); + loadDictionaries( this, isVisible(), cfg, dictionaries, dictNetMgr, false ); + for( unsigned x = 0; x < dictionaries.size(); x++ ) + dictionaries[ x ]->setFTSParameters( cfg.preferences.fts ); + + ftsIndexing.setDictionaries( dictionaries ); + ftsIndexing.doIndexing(); + updateStatusLine(); updateGroupList(); makeScanPopup(); @@ -1352,6 +1467,7 @@ { ArticleView * view = new ArticleView( this, articleNetMgr, dictionaries, groupInstances, false, cfg, + *ui.searchInPageAction, dictionaryBar.toggleViewAction(), groupList ); @@ -1373,8 +1489,8 @@ connect( view, SIGNAL( typingEvent( QString const & ) ), this, SLOT( typingEvent( QString const & ) ) ); - connect( view, SIGNAL( activeArticleChanged( const QString & ) ), - this, SLOT( activeArticleChanged( const QString & ) ) ); + connect( view, SIGNAL( activeArticleChanged( ArticleView const *, const QString & ) ), + this, SLOT( activeArticleChanged( ArticleView const *, const QString & ) ) ); connect( view, SIGNAL( statusBarMessage( QString const &, int, QPixmap const & ) ), this, SLOT( showStatusBarMessage( QString const &, int, QPixmap const & ) ) ); @@ -1398,6 +1514,10 @@ connect( view, SIGNAL( storeResourceSavePath( QString const & ) ), this, SLOT( storeResourceSavePath( QString const & ) ) ); + connect( view, SIGNAL( zoomIn()), this, SLOT( zoomin() ) ); + + connect( view, SIGNAL( zoomOut()), this, SLOT( zoomout() ) ); + view->setSelectionBySingleClick( cfg.preferences.selectWordBySingleClick ); int index = cfg.preferences.newTabsOpenAfterCurrentOne ? @@ -1503,7 +1623,7 @@ void MainWindow::backClicked() { - DPRINTF( "Back\n" ); + GD_DPRINTF( "Back\n" ); ArticleView *view = getCurrentArticleView(); @@ -1512,7 +1632,7 @@ void MainWindow::forwardClicked() { - DPRINTF( "Forward\n" ); + GD_DPRINTF( "Forward\n" ); ArticleView *view = getCurrentArticleView(); @@ -1561,6 +1681,9 @@ void MainWindow::pageLoaded( ArticleView * view ) { + if( view != getCurrentArticleView() ) + return; // It was background action + updateBackForwardButtons(); updatePronounceAvailability(); @@ -1701,10 +1824,17 @@ { hotkeyWrapper.reset(); // No hotkeys while we're editing dictionaries scanPopup.reset(); // No scan popup either. No one should use dictionaries. + closeHeadwordsDialog(); + closeFullTextSearchDialog(); + + ftsIndexing.stopIndexing(); + ftsIndexing.clearDictionaries(); wordFinder.clear(); dictionariesUnmuted.clear(); + hideGDHelp(); + { // Limit existence of newCfg Config::Class newCfg = cfg; @@ -1713,6 +1843,9 @@ connect( &dicts, SIGNAL( showDictionaryInfo( QString const & ) ), this, SLOT( showDictionaryInfo( QString const & ) ) ); + connect( &dicts, SIGNAL( showDictionaryHeadwords( QString const & ) ), + this, SLOT( showDictionaryHeadwords( QString const & ) ) ); + if ( editDictionaryGroup != Instances::Group::NoGroupId ) dicts.editGroup( editDictionaryGroup ); @@ -1749,6 +1882,12 @@ makeScanPopup(); installHotKeys(); + + for( unsigned x = 0; x < dictionaries.size(); x++ ) + dictionaries[ x ]->setFTSParameters( cfg.preferences.fts ); + + ftsIndexing.setDictionaries( dictionaries ); + ftsIndexing.doIndexing(); } void MainWindow::editCurrentGroup() @@ -1760,8 +1899,15 @@ { hotkeyWrapper.reset(); // So we could use the keys it hooks scanPopup.reset(); // No scan popup either. No one should use dictionaries. + closeHeadwordsDialog(); + closeFullTextSearchDialog(); + + ftsIndexing.stopIndexing(); + ftsIndexing.clearDictionaries(); - Preferences preferences( this, cfg.preferences ); + Preferences preferences( this, cfg ); + + hideGDHelp(); preferences.show(); @@ -1771,10 +1917,24 @@ // These parameters are not set in dialog p.zoomFactor = cfg.preferences.zoomFactor; + p.helpZoomFactor = cfg.preferences.helpZoomFactor; p.wordsZoomLevel = cfg.preferences.wordsZoomLevel; p.hideMenubar = cfg.preferences.hideMenubar; p.searchInDock = cfg.preferences.searchInDock; p.alwaysOnTop = cfg.preferences.alwaysOnTop; +#ifndef Q_WS_X11 + p.trackClipboardChanges = cfg.preferences.trackClipboardChanges; +#endif + p.proxyServer.systemProxyUser = cfg.preferences.proxyServer.systemProxyUser; + p.proxyServer.systemProxyPassword = cfg.preferences.proxyServer.systemProxyPassword; + + p.fts.dialogGeometry = cfg.preferences.fts.dialogGeometry; + p.fts.matchCase = cfg.preferences.fts.matchCase; + p.fts.maxArticlesPerDictionary = cfg.preferences.fts.maxArticlesPerDictionary; + p.fts.maxDistanceBetweenWords = cfg.preferences.fts.maxDistanceBetweenWords; + p.fts.searchMode = cfg.preferences.fts.searchMode; + p.fts.useMaxArticlesPerDictionary = cfg.preferences.fts.useMaxArticlesPerDictionary; + p.fts.useMaxDistanceBetweenWords = cfg.preferences.fts.useMaxDistanceBetweenWords; bool needReload = false; @@ -1800,6 +1960,10 @@ needReload = false; } + // See if we need to change help language + if( cfg.preferences.helpLanguage != p.helpLanguage ) + closeGDHelp(); + for( int x = 0; x < ui.tabWidget->count(); ++x ) { ArticleView & view = @@ -1838,11 +2002,19 @@ history.setMaxSize( cfg.preferences.maxStringsInHistory ); ui.historyPaneWidget->updateHistoryCounts(); + for( unsigned x = 0; x < dictionaries.size(); x++ ) + dictionaries[ x ]->setFTSParameters( cfg.preferences.fts ); + + ui.fullTextSearchAction->setEnabled( cfg.preferences.fts.enabled ); + Config::save( cfg ); } makeScanPopup(); installHotKeys(); + + ftsIndexing.setDictionaries( dictionaries ); + ftsIndexing.doIndexing(); } void MainWindow::currentGroupChanged( QString const & ) @@ -1876,6 +2048,9 @@ translateInputFinished( false ); updateCurrentGroupProperty(); + + if( ftsDlg ) + ftsDlg->setCurrentGroup( cfg.lastMainGroupId ); } void MainWindow::updateCurrentGroupProperty() @@ -1937,9 +2112,9 @@ wordFinder.prefixMatch( req, getActiveDicts() ); } -void MainWindow::translateInputFinished( bool checkModifiers ) +void MainWindow::translateInputFinished( bool checkModifiers, QString const & dictID ) { - QString word = translateLine->text(); + QString word = Folding::unescapeWildcardSymbols( translateLine->text() ); if ( word.size() ) { @@ -1947,7 +2122,7 @@ if ( checkModifiers && ( mods & (Qt::ControlModifier | Qt::ShiftModifier) ) ) addNewTab(); - showTranslationFor( word ); + showTranslationFor( word, 0, dictID ); if ( cfg.preferences.searchInDock ) { @@ -2022,12 +2197,32 @@ bool MainWindow::eventFilter( QObject * obj, QEvent * ev ) { - if ( ev->type() == QEvent::ShortcutOverride ) { +#ifdef Q_OS_WIN + if( obj == this && ev->type() == gdStoreNormalGeometryEvent ) + { + if( !isMaximized() && !isMinimized() && !isFullScreen() ) + cfg.normalMainWindowGeometry = normalGeometry(); + ev->accept(); + return true; + } + + if( obj == this && ev->type() == gdApplyNormalGeometryEvent ) + { + if( !isMaximized() && !isMinimized() && !isFullScreen() ) + setGeometry( cfg.normalMainWindowGeometry ); + ev->accept(); + return true; + } +#endif + if ( ev->type() == QEvent::ShortcutOverride + || ev->type() == QEvent::KeyPress ) + { // Handle Ctrl+H to show the History Pane. QKeyEvent * ke = static_cast( ev ); if ( ke->key() == Qt::Key_H && ke->modifiers() == Qt::ControlModifier ) { - on_showHideHistory_triggered(); + if( ev->type() == QEvent::KeyPress ) + on_showHideHistory_triggered(); ev->accept(); return true; } @@ -2044,6 +2239,13 @@ // when the main window is moved or resized, hide the word list suggestions if ( obj == this && ( ev->type() == QEvent::Move || ev->type() == QEvent::Resize ) ) { +#ifdef Q_OS_WIN + if( !isMaximized() && !isMinimized() && !isFullScreen() && gdAskMessage != 0xFFFFFFFF ) + { + QEvent *ev = new QEvent( gdStoreNormalGeometryEvent ); + qApp->postEvent( this, ev ); + } +#endif if ( !cfg.preferences.searchInDock ) { translateBox->setPopupEnabled( false ); @@ -2055,6 +2257,14 @@ { QWindowStateChangeEvent *stev = static_cast< QWindowStateChangeEvent *>( ev ); wasMaximized = ( stev->oldState() == Qt::WindowMaximized && isMinimized() ); + +#ifdef Q_OS_WIN + if( stev->oldState() == Qt::WindowMaximized && !isMinimized() && cfg.normalMainWindowGeometry.width() > 0 ) + { + QEvent *ev = new QEvent( gdApplyNormalGeometryEvent ); + qApp->postEvent( this, ev ); + } +#endif } if ( ev->type() == QEvent::MouseButtonPress ) { @@ -2267,8 +2477,11 @@ showDefinition( word, group, fromArticle, contexts ); } -void MainWindow::activeArticleChanged( QString const & id ) +void MainWindow::activeArticleChanged( ArticleView const * view, QString const & id ) { + if( view != getCurrentArticleView() ) + return; // It was background action + // select the row with the corresponding id for (int i = 0; i < ui.dictsList->count(); ++i) { QListWidgetItem * w = ui.dictsList->item( i ); @@ -2323,9 +2536,9 @@ history.enableAdd( false ); if ( cfg.preferences.searchInDock ) - translateLine->setText( word ); + translateLine->setText( Folding::escapeWildcardSymbols( word ) ); else - translateBox->setText( word, false ); + translateBox->setText( Folding::escapeWildcardSymbols( word ), false ); showTranslationFor( word ); @@ -2333,7 +2546,8 @@ } void MainWindow::showTranslationFor( QString const & inWord, - unsigned inGroup ) + unsigned inGroup, + QString const & dictID ) { ArticleView *view = getCurrentArticleView(); @@ -2343,7 +2557,7 @@ ( groupInstances.empty() ? 0 : groupInstances[ groupList->currentIndex() ].id ); - view->showDefinition( inWord, group ); + view->showDefinition( inWord, group, dictID ); updatePronounceAvailability(); updateFoundInDictsList(); @@ -2443,6 +2657,27 @@ //ui.tabWidget->setTabText( ui.tabWidget->indexOf(ui.tab), inWord.trimmed() ); } +void MainWindow::showTranslationFor( QString const & inWord, + QStringList const & dictIDs, + QRegExp const & searchRegExp ) +{ + ArticleView *view = getCurrentArticleView(); + + navPronounce->setEnabled( false ); + + view->showDefinition( inWord, dictIDs, searchRegExp, + groupInstances[ groupList->currentIndex() ].id ); + + updatePronounceAvailability(); + updateFoundInDictsList(); + + // Add to history + + addWordToHistory( inWord ); + + updateBackForwardButtons(); +} + #ifdef Q_WS_X11 void MainWindow::toggleMainWindow( bool onlyShow, bool byIconClick ) #else @@ -2484,10 +2719,25 @@ hide(); else showMinimized(); + + if( headwordsDlg ) + headwordsDlg->hide(); + + if( ftsDlg ) + ftsDlg->hide(); + + if( helpWindow ) + helpWindow->hide(); } if ( shown ) { + if( headwordsDlg ) + headwordsDlg->show(); + + if( ftsDlg ) + ftsDlg->show(); + focusTranslateLine(); #ifdef Q_WS_X11 Window wh = 0; @@ -2654,7 +2904,7 @@ // Failed -- reschedule to check in two hours newReleaseCheckTimer.start( 2 * 60 * 60 * 1000 ); - DPRINTF( "Failed to check program version, retry in two hours\n" ); + GD_DPRINTF( "Failed to check program version, retry in two hours\n" ); } else { @@ -2665,8 +2915,8 @@ Config::save( cfg ); - DPRINTF( "Program version's check successful, current version is %ls\n", - latestVersion.toStdWString().c_str() ); + GD_DPRINTF( "Program version's check successful, current version is %ls\n", + latestVersion.toStdWString().c_str() ); } if ( success && latestVersion > PROGRAM_VERSION && latestVersion != cfg.skippedRelease ) @@ -2730,8 +2980,8 @@ if ( on ) { scanPopup->enableScanning(); -#ifdef Q_OS_MACX - if( !AXAPIEnabled() ) +#ifdef Q_OS_MAC + if( !MacMouseOver::isAXAPIEnabled() ) mainStatusBar->showMessage( tr( "Accessibility API is not enabled" ), 10000, QPixmap( ":/icons/error.png" ) ); #endif @@ -2981,7 +3231,13 @@ { ArticleView *view = getCurrentArticleView(); - QString fileName = view->getTitle() + ".html"; + QString fileName = view->getTitle().simplified(); + + // Replace reserved filename characters + QRegExp rxName( "[/\\\\\\?\\*:\\|<>]" ); + fileName.replace( rxName, "_" ); + + fileName += ".html"; QString savePath; if ( cfg.articleSavePath.isEmpty() ) @@ -3023,6 +3279,19 @@ QFileInfo fi( fileName ); cfg.articleSavePath = QDir::toNativeSeparators( fi.absoluteDir().absolutePath() ); + // Convert internal links + + QRegExp rx3( "href=\"(bword:|gdlookup://localhost/)([^\"]+)\"" ); + int pos = 0; + while ( ( pos = rx3.indexIn( html, pos ) ) != -1 ) + { + QString name = QUrl::fromPercentEncoding( rx3.cap( 2 ).simplified().toLatin1() ); + name.replace( rxName, "_" ); + name = QString( "href=\"" ) + QUrl::toPercentEncoding( name ) + ".html\""; + html.replace( pos, rx3.cap().length(), name ); + pos += name.length(); + } + if ( complete ) { QString folder = fi.absoluteDir().absolutePath() + "/" + fi.baseName() + "_files"; @@ -3072,6 +3341,11 @@ { hotkeyWrapper.reset(); // No hotkeys while we're editing dictionaries scanPopup.reset(); // No scan popup either. No one should use dictionaries. + closeHeadwordsDialog(); + closeFullTextSearchDialog(); + + ftsIndexing.stopIndexing(); + ftsIndexing.clearDictionaries(); groupInstances.clear(); // Release all the dictionaries they hold dictionaries.clear(); @@ -3080,6 +3354,12 @@ loadDictionaries( this, true, cfg, dictionaries, dictNetMgr ); + for( unsigned x = 0; x < dictionaries.size(); x++ ) + dictionaries[ x ]->setFTSParameters( cfg.preferences.fts ); + + ftsIndexing.setDictionaries( dictionaries ); + ftsIndexing.doIndexing(); + updateGroupList(); makeScanPopup(); @@ -3253,8 +3533,15 @@ void MainWindow::wordReceived( const QString & word) { toggleMainWindow( true ); - translateLine->setText( word ); - translateInputFinished(); + translateLine->setText( Folding::escapeWildcardSymbols( word ) ); + translateInputFinished( false ); +} + +void MainWindow::headwordReceived( const QString & word, const QString & ID ) +{ + toggleMainWindow( true ); + translateLine->setText( Folding::escapeWildcardSymbols( word ) ); + translateInputFinished( false, QString( "gdfrom-" )+ ID ); } void MainWindow::updateHistoryMenu() @@ -3472,6 +3759,14 @@ void MainWindow::showDictionaryInfo( const QString & id ) { + QWidget * owner = 0; + + if( sender()->objectName().compare( "EditDictionaries" ) == 0 ) + owner = qobject_cast< QWidget * >( sender() ); + + if( owner == 0 ) + owner = this; + for( unsigned x = 0; x < dictionaries.size(); x++ ) { if( dictionaries[ x ]->getId() == id.toUtf8().data() ) @@ -3488,12 +3783,90 @@ { editDictionary( dictionaries[x].get() ); } + else if( result == DictInfo::SHOW_HEADWORDS ) + { + showDictionaryHeadwords( owner, dictionaries[x].get() ); + } break; } } } +void MainWindow::showDictionaryHeadwords( const QString & id ) +{ + QWidget * owner = 0; + + if( sender()->objectName().compare( "EditDictionaries" ) == 0 ) + owner = qobject_cast< QWidget * >( sender() ); + + if( owner == 0 ) + owner = this; + + for( unsigned x = 0; x < dictionaries.size(); x++ ) + { + if( dictionaries[ x ]->getId() == id.toUtf8().data() ) + { + showDictionaryHeadwords( owner, dictionaries[ x ].get() ); + break; + } + } +} + +void MainWindow::showDictionaryHeadwords( QWidget * owner, Dictionary::Class * dict ) +{ + if( owner && owner != this ) + { + DictHeadwords headwords( owner, cfg, dict ); + headwords.exec(); + return; + } + + if( headwordsDlg == 0 ) + { + headwordsDlg = new DictHeadwords( this, cfg, dict ); + addGlobalActionsToDialog( headwordsDlg ); + connect( headwordsDlg, SIGNAL( headwordSelected( QString, QString ) ), + this, SLOT( headwordReceived( QString, QString ) ) ); + connect( headwordsDlg, SIGNAL( closeDialog() ), + this, SLOT( closeHeadwordsDialog() ) ); + } + else + headwordsDlg->setup( dict ); + + headwordsDlg->show(); +} + +void MainWindow::closeHeadwordsDialog() +{ + if( headwordsDlg ) + { + delete headwordsDlg; + headwordsDlg = NULL; + } +} + +void MainWindow::focusHeadwordsDialog() +{ + if( headwordsDlg ) + { + headwordsDlg->activateWindow(); + if ( ftsDlg ) + ftsDlg->lower(); + } +} + +void MainWindow::focusArticleView() +{ + ArticleView * view = getCurrentArticleView(); + if ( view ) + { + if ( !isActiveWindow() ) + activateWindow(); + view->focus(); + } +} + void MainWindow::editDictionary( Dictionary::Class * dict ) { QString dictFilename = dict->getMainFilename(); @@ -3595,6 +3968,10 @@ QMenu menu( ui.dictsList ); QAction * infoAction = menu.addAction( tr( "Dictionary info" ) ); + QAction * headwordsAction = NULL; + if( pDict->getWordCount() > 0 ) + headwordsAction = menu.addAction( tr( "Dictionary headwords" ) ); + QAction * openDictFolderAction = menu.addAction( tr( "Open dictionary folder" ) ); QAction * editAction = NULL; @@ -3614,6 +3991,15 @@ scanPopup.get()->blockSignals( false ); } else + if( result && result == headwordsAction ) + { + if ( scanPopup ) + scanPopup.get()->blockSignals( true ); + showDictionaryHeadwords( this, pDict ); + if ( scanPopup ) + scanPopup.get()->blockSignals( false ); + } + else if( result && result == openDictFolderAction ) { openDictionaryFolder( id ); @@ -3638,13 +4024,163 @@ cfg.resourceSavePath = newPath; } +void MainWindow::proxyAuthentication( const QNetworkProxy &, + QAuthenticator * authenticator ) +{ + QNetworkProxy proxy = QNetworkProxy::applicationProxy(); + + QString * userStr, * passwordStr; + if( cfg.preferences.proxyServer.useSystemProxy ) + { + userStr = &cfg.preferences.proxyServer.systemProxyUser; + passwordStr = &cfg.preferences.proxyServer.systemProxyPassword; + } + else + { + userStr = &cfg.preferences.proxyServer.user; + passwordStr = &cfg.preferences.proxyServer.password; + } + + if( proxy.user().isEmpty() && !userStr->isEmpty() ) + { + authenticator->setUser( *userStr ); + authenticator->setPassword( *passwordStr ); + + proxy.setUser( *userStr ); + proxy.setPassword( *passwordStr ); + QNetworkProxy::setApplicationProxy( proxy ); + } + else + { + QDialog dlg; + Ui::Dialog ui; + ui.setupUi( &dlg ); + dlg.adjustSize(); + + ui.userEdit->setText( *userStr ); + ui.passwordEdit->setText( *passwordStr ); + + if ( dlg.exec() == QDialog::Accepted ) + { + *userStr = ui.userEdit->text(); + *passwordStr = ui.passwordEdit->text(); + + authenticator->setUser( *userStr ); + authenticator->setPassword( *passwordStr ); + + proxy.setUser( *userStr ); + proxy.setPassword( *passwordStr ); + QNetworkProxy::setApplicationProxy( proxy ); + } + } +} + +void MainWindow::showFullTextSearchDialog() +{ + if( !ftsDlg ) + { + ftsDlg = new FTS::FullTextSearchDialog( this, cfg, dictionaries, groupInstances, ftsIndexing ); + addGlobalActionsToDialog( ftsDlg ); + + connect( ftsDlg, SIGNAL( showTranslationFor( QString, QStringList, QRegExp ) ), + this, SLOT( showTranslationFor( QString, QStringList, QRegExp ) ) ); + connect( ftsDlg, SIGNAL( closeDialog() ), + this, SLOT( closeFullTextSearchDialog() ), Qt::QueuedConnection ); + connect( &configEvents, SIGNAL( mutedDictionariesChanged() ), + ftsDlg, SLOT( updateDictionaries() ) ); + + unsigned group = groupInstances.empty() ? 0 + : groupInstances[ groupList->currentIndex() ].id; + ftsDlg->setCurrentGroup( group ); + } + + if( !ftsDlg ->isVisible() ) + ftsDlg->show(); + else + { + ftsDlg->activateWindow(); + if ( headwordsDlg ) + headwordsDlg->lower(); + } +} + +void MainWindow::closeFullTextSearchDialog() +{ + if( ftsDlg ) + { + ftsDlg->stopSearch(); + delete ftsDlg; + ftsDlg = 0; + } +} + +void MainWindow::showGDHelp() +{ + if( !helpWindow ) + { + helpWindow = new Help::HelpWindow( this, cfg ); + + if( helpWindow->getHelpEngine() ) + { + connect( helpWindow, SIGNAL( needClose() ), this, SLOT( hideGDHelp() ) ); + helpWindow->showHelpFor( "Content" ); + helpWindow->show(); + } + else + { + delete helpWindow; + helpWindow = 0; + } + } + else + { + helpWindow->show(); + helpWindow->activateWindow(); + } +} + +void MainWindow::hideGDHelp() +{ + if( helpWindow ) + helpWindow->hide(); +} + +void MainWindow::showGDHelpForID( QString const & id ) +{ + if( !helpWindow ) + showGDHelp(); + + if( helpWindow ) + { + helpWindow->showHelpFor( id ); + if( !helpWindow->isVisible() ) + { + helpWindow->show(); + helpWindow->activateWindow(); + } + } +} + +void MainWindow::closeGDHelp() +{ + if( helpWindow ) + { + delete helpWindow; + helpWindow = 0; + } +} + #ifdef Q_OS_WIN32 -bool MainWindow::winEvent( MSG * message, long * result ) +bool MainWindow::handleGDMessage( MSG * message, long * result ) { if( message->message != gdAskMessage ) return false; *result = 0; + + if( !isGoldenDictWindow( message->hwnd ) ) + return true; + ArticleView * view = getCurrentArticleView(); if( !view ) return true; @@ -3654,12 +4190,6 @@ QString str = view->wordAtPoint( lpdata->Pt.x, lpdata->Pt.y ); memset( lpdata->cwData, 0, lpdata->dwMaxLength * sizeof( WCHAR ) ); - if( str.isRightToLeft() ) - { - gd::wstring wstr = gd::toWString( str ); - wstr.assign( wstr.rbegin(), wstr.rend() ); - str = gd::toQString( wstr ); - } str.truncate( lpdata->dwMaxLength - 1 ); str.toWCharArray( lpdata->cwData ); @@ -3669,7 +4199,7 @@ bool MainWindow::isGoldenDictWindow( HWND hwnd ) { - return hwnd == (HWND)winId(); + return hwnd == winId() || hwnd == ui.centralWidget->winId(); } #endif diff -Nru goldendict-1.5.0~git20131003/mainwindow.hh goldendict-1.5.0~git20150923/mainwindow.hh --- goldendict-1.5.0~git20131003/mainwindow.hh 2013-08-16 09:45:56.000000000 +0000 +++ goldendict-1.5.0~git20150923/mainwindow.hh 2015-09-23 08:26:24.000000000 +0000 @@ -27,6 +27,9 @@ #include "mruqmenu.hh" #include "translatebox.hh" #include "wordlist.hh" +#include "dictheadwords.hh" +#include "fulltextsearch.hh" +#include "helpwindow.hh" #ifdef Q_WS_X11 #include @@ -66,14 +69,20 @@ virtual void commitData( QSessionManager & ); + void showGDHelpForID( QString const & id ); + void closeGDHelp(); + public slots: void messageFromAnotherInstanceReceived( QString const & ); void showStatusBarMessage ( QString const &, int, QPixmap const & ); void wordReceived( QString const & ); + void headwordReceived( QString const &, QString const & ); void setExpandMode( bool expand ); private: + void addGlobalAction( QAction * action, const char * slot ); + void addGlobalActionsToDialog( QDialog * dialog ); void commitData(); bool commitDataCompleted; @@ -105,7 +114,8 @@ QAction escAction, focusTranslateLineAction, addTabAction, closeCurrentTabAction, closeAllTabAction, closeRestTabAction, switchToNextTabAction, switchToPrevTabAction, - showDictBarNamesAction, useSmallIconsInToolbarsAction, toggleMenuBarAction, switchExpandModeAction; + showDictBarNamesAction, useSmallIconsInToolbarsAction, toggleMenuBarAction, + switchExpandModeAction, focusHeadwordsDlgAction, focusArticleViewAction; QToolBar * navToolbar; MainStatusBar * mainStatusBar; QAction * navBack, * navForward, * navPronounce, * enableScanPopup; @@ -157,6 +167,14 @@ QPrinter & getPrinter(); // Creates a printer if it's not there and returns it + DictHeadwords * headwordsDlg; + + FTS::FtsIndexing ftsIndexing; + + FTS::FullTextSearchDialog * ftsDlg; + + Help::HelpWindow * helpWindow; + /// Applies the qt's stylesheet, given the style's name. void applyQtStyleSheet( QString const & displayStyle, QString const & addonStyle ); @@ -219,6 +237,8 @@ void fillWordListFromHistory(); + void showDictionaryHeadwords( QWidget * owner, Dictionary::Class * dict ); + private slots: void hotKeyActivated( int ); @@ -243,6 +263,8 @@ void showDictionaryInfo( QString const & id ); + void showDictionaryHeadwords( QString const & id ); + void openDictionaryFolder( QString const & id ); void editDictionary ( Dictionary::Class * dict ); @@ -308,7 +330,7 @@ void currentGroupChanged( QString const & ); void translateInputChanged( QString const & ); - void translateInputFinished( bool checkModifiers = true ); + void translateInputFinished( bool checkModifiers = true, QString const & dictID = QString() ); /// Closes any opened search in the article view, and focuses the translateLine/close main window to tray. void handleEsc(); @@ -339,11 +361,15 @@ ArticleView::Contexts const & contexts ); void typingEvent( QString const & ); - void activeArticleChanged( QString const & id ); + void activeArticleChanged( ArticleView const *, QString const & id ); void mutedDictionariesChanged(); - void showTranslationFor( QString const &, unsigned inGroup = 0 ); + void showTranslationFor( QString const &, unsigned inGroup = 0, + QString const & dictID = QString() ); + + void showTranslationFor( QString const &, QStringList const & dictIDs, + QRegExp const & searchRegExp ); void showHistoryItem( QString const & ); @@ -398,6 +424,20 @@ void storeResourceSavePath( QString const & ); + void closeHeadwordsDialog(); + + void focusHeadwordsDialog(); + + void focusArticleView(); + + void proxyAuthentication( const QNetworkProxy & proxy, QAuthenticator * authenticator ); + + void showFullTextSearchDialog(); + void closeFullTextSearchDialog(); + + void showGDHelp(); + void hideGDHelp(); + signals: /// Set optional parts expand mode for all tabs void setExpandOptionalParts( bool expand ); @@ -409,7 +449,8 @@ /// For receiving message from scan libraries protected: unsigned gdAskMessage; - bool winEvent( MSG * message, long * result ); +public: + bool handleGDMessage( MSG * message, long * result ); private slots: /// Return true while scanning GoldenDict window diff -Nru goldendict-1.5.0~git20131003/mainwindow.ui goldendict-1.5.0~git20150923/mainwindow.ui --- goldendict-1.5.0~git20131003/mainwindow.ui 2013-08-16 09:41:47.000000000 +0000 +++ goldendict-1.5.0~git20150923/mainwindow.ui 2015-09-23 08:26:24.000000000 +0000 @@ -46,7 +46,16 @@ Welcome! - + + 0 + + + 0 + + + 0 + + 0 @@ -61,7 +70,7 @@ 0 0 653 - 21 + 18 @@ -92,6 +101,8 @@ &Help + + @@ -120,9 +131,17 @@ + + + Search + + + + + @@ -355,9 +374,6 @@ About GoldenDict - - F1 - QAction::AboutRole @@ -545,6 +561,39 @@ Menu Button + + + Search in page + + + Ctrl+F + + + QAction::TextHeuristicRole + + + + + Full-text search + + + Ctrl+Shift+F + + + Qt::WidgetWithChildrenShortcut + + + QAction::TextHeuristicRole + + + + + GoldenDict reference + + + F1 + + diff -Nru goldendict-1.5.0~git20131003/mdx.cc goldendict-1.5.0~git20150923/mdx.cc --- goldendict-1.5.0~git20131003/mdx.cc 2013-10-02 20:42:04.000000000 +0000 +++ goldendict-1.5.0~git20150923/mdx.cc 2015-09-23 08:26:24.000000000 +0000 @@ -9,13 +9,15 @@ #include "wstring.hh" #include "wstring_qt.hh" #include "chunkedstorage.hh" -#include "dprintf.hh" +#include "gddebug.hh" #include "langcoder.hh" #include "fsencoding.hh" #include "audiolink.hh" #include "ex.hh" #include "mdictparser.hh" #include "filetype.hh" +#include "ftshelpers.hh" +#include "htmlescape.hh" #include #include @@ -102,6 +104,7 @@ class IndexedMdd: public BtreeIndexing::BtreeIndex { Mutex & idxMutex; + Mutex fileMutex; ChunkedStorage::Reader & chunks; QFile mddFile; bool isFileOpen; @@ -241,6 +244,23 @@ virtual sptr< Dictionary::DataRequest > getResource( string const & name ) throw( std::exception ); virtual QString const & getDescription(); + virtual sptr< Dictionary::DataRequest > getSearchResults( QString const & searchString, + int searchMode, bool matchCase, + int distanceBetweenWords, + int maxResults ); + virtual void getArticleText( uint32_t articleAddress, QString & headword, QString & text ); + + virtual void makeFTSIndex(QAtomicInt & isCancelled, bool firstIteration ); + + virtual void setFTSParameters( Config::FullTextSearch const & fts ) + { + if( ensureInitDone().size() ) + return; + + can_FTS = fts.enabled + && !fts.disabledTypes.contains( "MDICT", Qt::CaseInsensitive ) + && ( fts.maxDictionarySize == 0 || getArticleCount() <= fts.maxDictionarySize ); + } protected: virtual void loadIcon() throw(); @@ -251,7 +271,7 @@ void doDeferredInit(); /// Loads an article with the given offset, filling the given strings. - void loadArticle( uint32_t offset, string & articleText ); + void loadArticle( uint32_t offset, string & articleText, bool noFilter = false ); /// Process resource links (images, audios, etc) QString & filterResource( QString const & articleId, QString & article ); @@ -285,6 +305,16 @@ dictFile.setFileName( QString::fromUtf8( dictionaryFiles[ 0 ].c_str() ) ); dictFile.open( QIODevice::ReadOnly ); + + // Full-text search parameters + + can_FTS = true; + + ftsIdxName = indexFile + "_FTS"; + + if( !Dictionary::needToRebuildIndex( dictionaryFiles, ftsIdxName ) + && !FtsHelpers::ftsIndexIsOldOrBad( ftsIdxName, this ) ) + FTS_index_completed.ref(); } MdxDictionary::~MdxDictionary() @@ -428,6 +458,60 @@ } } +void MdxDictionary::makeFTSIndex( QAtomicInt & isCancelled, bool firstIteration ) +{ + if( !( Dictionary::needToRebuildIndex( getDictionaryFilenames(), ftsIdxName ) + || FtsHelpers::ftsIndexIsOldOrBad( ftsIdxName, this ) ) ) + FTS_index_completed.ref(); + + if( haveFTSIndex() ) + return; + + if( ensureInitDone().size() ) + return; + + if( firstIteration && getArticleCount() > FTS::MaxDictionarySizeForFastSearch ) + return; + + gdDebug( "MDict: Building the full-text index for dictionary: %s\n", + getName().c_str() ); + + try + { + FtsHelpers::makeFTSIndex( this, isCancelled ); + FTS_index_completed.ref(); + } + catch( std::exception &ex ) + { + gdWarning( "MDict: Failed building full-text search index for \"%s\", reason: %s\n", getName().c_str(), ex.what() ); + QFile::remove( FsEncoding::decode( ftsIdxName.c_str() ) ); + } +} + +void MdxDictionary::getArticleText( uint32_t articleAddress, QString & headword, QString & text ) +{ + try + { + headword.clear(); + string articleText; + + loadArticle( articleAddress, articleText, true ); + text = Html::unescape( QString::fromUtf8( articleText.data(), articleText.size() ) ); + } + catch( std::exception &ex ) + { + gdWarning( "MDict: Failed retrieving article from \"%s\", reason: %s\n", getName().c_str(), ex.what() ); + } +} + +sptr< Dictionary::DataRequest > MdxDictionary::getSearchResults( QString const & searchString, + int searchMode, bool matchCase, + int distanceBetweenWords, + int maxResults ) +{ + return new FtsHelpers::FTSResultsRequest( *this, searchString,searchMode, matchCase, distanceBetweenWords, maxResults ); +} + /// MdxDictionary::getArticle class MdxArticleRequest; @@ -791,6 +875,7 @@ } else { + Mutex::Lock _( idxMutex ); vector< char > chunk; char * dictDescription = chunks.getBlock( idxHeader.descriptionAddress, chunk ); string str( dictDescription ); @@ -820,7 +905,7 @@ dictionaryIconLoaded = true; } -void MdxDictionary::loadArticle( uint32_t offset, string & articleText ) +void MdxDictionary::loadArticle( uint32_t offset, string & articleText, bool noFilter ) { vector< char > chunk; Mutex::Lock _( idxMutex ); @@ -848,7 +933,8 @@ recordInfo.recordSize ); article = MdictParser::substituteStylesheet( article, styleSheets ); - article = filterResource( articleId, article ); + if( !noFilter ) + article = filterResource( articleId, article ); articleText = string( article.toUtf8().constData() ); } @@ -879,6 +965,13 @@ .replace( QRegExp( "(<\\s*link\\s+[^>]*\\bhref\\b\\s*=\\s*)(?!['\"]+)(?!bres:|data:)(?:file://)?([^\\s>]+)", Qt::CaseInsensitive, QRegExp::RegExp2 ), "\\1\"bres://" + id + "/\\\"" ) + // javascripts + .replace( QRegExp( "(<\\s*script\\s+[^>]*\\bsrc\\b\\s*=\\s*[\"']+)(?:file://)?[\\x00-\\x30\\x7f]*([^\"']*)", + Qt::CaseInsensitive, QRegExp::RegExp2 ), + "\\1bres://" + id + "/\\2" ) + .replace( QRegExp( "(<\\s*script\\s+[^>]*\\bsrc\\b\\s*=\\s*)(?!['\"]+)(?!bres:|data:)(?:file://)?([^\\s>]+)", + Qt::CaseInsensitive, QRegExp::RegExp2 ), + "\\1\"bres://" + id + "/\\\"" ) // images .replace( QRegExp( "(<\\s*img\\s+[^>]*\\bsrc\\b\\s*=\\s*[\"']+)(?:file://)?[\\x00-\\x1f\\x7f]*([^\"']*)", Qt::CaseInsensitive, QRegExp::RegExp2 ), @@ -1010,7 +1103,7 @@ { // Building the index - qDebug( "MDict: Building the index for dictionary: %s\n", i->c_str() ); + gdDebug( "MDict: Building the index for dictionary: %s\n", i->c_str() ); MdictParser parser; list< sptr< MdictParser > > mddParsers; @@ -1029,7 +1122,7 @@ sptr< MdictParser > mddParser = new MdictParser(); if ( !mddParser->open( mddIter->c_str() ) ) { - qWarning( "Warning: Broken mdd (resource) file: %s\n", mddIter->c_str() ); + gdWarning( "Warning: Broken mdd (resource) file: %s\n", mddIter->c_str() ); continue; } mddParsers.push_back( mddParser ); @@ -1105,7 +1198,7 @@ // Finish with the chunks idxHeader.chunksOffset = chunks.finish(); - DPRINTF( "Writing index...\n" ); + GD_DPRINTF( "Writing index...\n" ); // Good. Now build the index IndexInfo idxInfo = BtreeIndexing::buildIndex( indexedWords, idx ); diff -Nru goldendict-1.5.0~git20131003/mediawiki.cc goldendict-1.5.0~git20150923/mediawiki.cc --- goldendict-1.5.0~git20131003/mediawiki.cc 2013-10-02 20:42:04.000000000 +0000 +++ goldendict-1.5.0~git20150923/mediawiki.cc 2015-09-23 08:26:24.000000000 +0000 @@ -8,7 +8,7 @@ #include #include #include -#include "dprintf.hh" +#include "gddebug.hh" #include "audiolink.hh" #include "langcoder.hh" @@ -121,7 +121,7 @@ QNetworkAccessManager & mgr ): livedLongEnough( false ), isCancelling( false ) { - DPRINTF( "request begin\n" ); + GD_DPRINTF( "request begin\n" ); QUrl reqUrl( url + "/api.php?action=query&list=allpages&aplimit=40&format=xml" ); reqUrl.addQueryItem( "apfrom", gd::toQString( str ) ); @@ -131,6 +131,13 @@ connect( netReply.get(), SIGNAL( finished() ), this, SLOT( downloadFinished() ) ); +#ifndef QT_NO_OPENSSL + + connect( netReply.get(), SIGNAL( sslErrors( QList< QSslError > ) ), + netReply.get(), SLOT( ignoreSslErrors() ) ); + +#endif + // We start a timer to postpone early destruction, so a rapid type won't make // unnecessary network load startTimer( 200 ); @@ -147,7 +154,7 @@ MediaWikiWordSearchRequest::~MediaWikiWordSearchRequest() { - DPRINTF( "request end\n" ); + GD_DPRINTF( "request end\n" ); } void MediaWikiWordSearchRequest::cancel() @@ -164,7 +171,7 @@ } else { - DPRINTF("not long enough\n" ); + GD_DPRINTF("not long enough\n" ); } } @@ -199,7 +206,7 @@ matches.push_back( gd::toWString( nl.item( x ).toElement().attribute( "title" ) ) ); } } - DPRINTF( "done.\n" ); + GD_DPRINTF( "done.\n" ); } else setErrorString( netReply->errorString() ); @@ -254,7 +261,7 @@ void MediaWikiArticleRequest::addQuery( QNetworkAccessManager & mgr, wstring const & str ) { - qDebug() << "MediaWiki: requesting article" << gd::toQString( str ); + gdDebug( "MediaWiki: requesting article %s\n", gd::toQString( str ).toUtf8().data() ); QUrl reqUrl( url + "/api.php?action=parse&prop=text|revid&format=xml&redirects" ); @@ -262,12 +269,19 @@ sptr< QNetworkReply > netReply = mgr.get( QNetworkRequest( reqUrl ) ); +#ifndef QT_NO_OPENSSL + + connect( netReply.get(), SIGNAL( sslErrors( QList< QSslError > ) ), + netReply.get(), SLOT( ignoreSslErrors() ) ); + +#endif + netReplies.push_back( std::make_pair( netReply, false ) ); } void MediaWikiArticleRequest::requestFinished( QNetworkReply * r ) { - DPRINTF( "Finished.\n" ); + GD_DPRINTF( "Finished.\n" ); if ( isFinished() ) // Was cancelled return; @@ -321,7 +335,36 @@ if ( !textNode.isNull() ) { QString articleString = textNode.toElement().text(); - + + // Replace all ":" in links, remove '#' part in links to other articles + int pos = 0; + QRegExp regLinks( "= 0 ) + { + // External link + pos += regLinks.cap().size(); + continue; + } + + if( link.indexOf( ':' ) >= 0 ) + link.replace( ':', "%3A" ); + + int n = link.indexOf( '#', 1 ); + if( n > 0 ) + link.truncate( n ); + + QString newLink = QString( "
", Qt::CaseInsensitive, QRegExp::RegExp2 ); + reg1.setMinimal( true ); + QRegExp reg2( "= 0 ) + { + QString tag = reg1.cap(); + if( reg2.indexIn( tag ) >= 0 ) + { + QString ref = reg2.cap( 1 ); + QString audio_url = "\"Play\"/"; + articleString.replace( pos, tag.length(), audio_url ); + } + pos += 1; + } + else + break; + } + // audio url articleString.replace( QRegExp( "dictPtr->getId() )+ "dictPtr->getId() ) + "]*(upload\\.wikimedia\\.org/wikipedia/commons/[^\"'&]*\\.ogg)[^>]*>\\s*<[^<]*"), - QString::fromStdString(addAudioLink("\"http://\\1\"",this->dictPtr->getId())+ - "\"Play\"")); + articleString.replace( QRegExp( "]*(upload\\.wikimedia\\.org/wikipedia/commons/[^\"'&]*\\.ogg)[^>]*>\\s*<[^<]*"), + QString::fromStdString(addAudioLink( string( "\"" ) + wikiUrl.scheme().toStdString() + "://\\1\"", this->dictPtr->getId() ) + + "\"Play\"" ) ); // In those strings, change any underscores to spaces for( ; ; ) { @@ -356,7 +424,7 @@ } //fix file: url - articleString.replace( QRegExp("errorString() ); diff -Nru goldendict-1.5.0~git20131003/mouseover.cc goldendict-1.5.0~git20150923/mouseover.cc --- goldendict-1.5.0~git20131003/mouseover.cc 2013-10-02 20:42:04.000000000 +0000 +++ goldendict-1.5.0~git20150923/mouseover.cc 2015-09-23 08:26:24.000000000 +0000 @@ -242,7 +242,7 @@ { if( ( res & GD_FLAG_METHOD_UI_AUTOMATION ) == 0 ) return 0; - POINT pt = Global_Data->CurMod.Pt; + POINT pt = Global_Data->LastPt; WCHAR *pwstr = gdGetWordAtPointByAutomation( pt ); if( pwstr == NULL ) return 0; wordSeq = QString::fromWCharArray( pwstr ); @@ -342,15 +342,18 @@ // See if we have an RTL char. Reverse the whole string if we do. - for( int x = 0; x < word.size(); ++x ) + if( lparam == 0 ) { - QChar::Direction d = word[ x ].direction(); - - if ( d == QChar::DirR || d == QChar::DirAL || - d == QChar::DirRLE || d == QChar::DirRLO ) + for( int x = 0; x < word.size(); ++x ) { - std::reverse( word.begin(), word.end() ); - break; + QChar::Direction d = word[ x ].direction(); + + if ( d == QChar::DirR || d == QChar::DirAL || + d == QChar::DirRLE || d == QChar::DirRLO ) + { + std::reverse( word.begin(), word.end() ); + break; + } } } diff -Nru goldendict-1.5.0~git20131003/mouseover_win32/GetWord.c goldendict-1.5.0~git20150923/mouseover_win32/GetWord.c --- goldendict-1.5.0~git20131003/mouseover_win32/GetWord.c 2012-10-01 07:15:21.000000000 +0000 +++ goldendict-1.5.0~git20150923/mouseover_win32/GetWord.c 2015-09-23 08:26:24.000000000 +0000 @@ -80,14 +80,19 @@ int BeginPos; } TConsoleParams; -static int GetWordFromConsolePack(TConsoleParams *params) +static int GetWordFromConsolePack(TConsoleParams *params, BOOL *pInvalidConsole) { int WordLen=0; + *pInvalidConsole = TRUE; + HANDLE hStdOut = GetStdHandle(STD_OUTPUT_HANDLE); - if (hStdOut != INVALID_HANDLE_VALUE) { + if (hStdOut != INVALID_HANDLE_VALUE && hStdOut != 0) { CONSOLE_SCREEN_BUFFER_INFO csbi; if (GetConsoleScreenBufferInfo(hStdOut, &csbi)) { + + *pInvalidConsole = FALSE; + COORD CurPos; CurPos.X = csbi.srWindow.Left + (SHORT)(params->Pt.x * (csbi.srWindow.Right - csbi.srWindow.Left + 1) / params->ClientRect.right); CurPos.Y = csbi.srWindow.Top + (SHORT)(params->Pt.y * (csbi.srWindow.Bottom - csbi.srWindow.Top + 1) / params->ClientRect.bottom); @@ -129,6 +134,7 @@ DWORD pid; DWORD WordSize; char *Result; + BOOL invalidConsole; *BeginPos=0; if((TP = malloc(sizeof(TConsoleParams))) == NULL) @@ -145,7 +151,7 @@ if (pid != GetCurrentProcessId()) { if(Is_XP_And_Later()) { if(AttachConsole(pid)) { - WordSize = GetWordFromConsolePack(TP); + WordSize = GetWordFromConsolePack(TP, &invalidConsole); FreeConsole(); } else { WordSize = 0; @@ -154,7 +160,25 @@ WordSize = 0; } } else { - WordSize = GetWordFromConsolePack(TP); + WordSize = GetWordFromConsolePack(TP, &invalidConsole); + if( invalidConsole ) { + /* + Under Win 8.1 GetWindowThreadProcessId return current "conhost" process ID + instead of target window process ID. + We try to attach console to parent process. + */ + + if(Is_XP_And_Later()) { + if(AttachConsole( (DWORD)-1 )) { + WordSize = GetWordFromConsolePack(TP, &invalidConsole); + FreeConsole(); + } else { + WordSize = 0; + } + } else { + WordSize = 0; + } + } } if (WordSize > 0 && WordSize <= 255) { diff -Nru goldendict-1.5.0~git20131003/mouseover_win32/TextOutHook.c goldendict-1.5.0~git20150923/mouseover_win32/TextOutHook.c --- goldendict-1.5.0~git20131003/mouseover_win32/TextOutHook.c 2012-10-01 07:15:21.000000000 +0000 +++ goldendict-1.5.0~git20150923/mouseover_win32/TextOutHook.c 2015-09-23 08:26:24.000000000 +0000 @@ -571,7 +571,7 @@ } } -DLLIMPORT void __gdGetWord (TCurrentMode *P) +DLLIMPORT DWORD __gdGetWord (TCurrentMode *P) { TCHAR wClassName[64]; TKnownWndClass WndClass; @@ -588,6 +588,10 @@ } else { P->WordLen = 0; } + if(WndClass == kwcConsole || WndClass == kwcConEmu) + return 1; + + return 0; } diff -Nru goldendict-1.5.0~git20131003/mouseover_win32/TextOutSpy.c goldendict-1.5.0~git20150923/mouseover_win32/TextOutSpy.c --- goldendict-1.5.0~git20131003/mouseover_win32/TextOutSpy.c 2012-10-01 07:15:21.000000000 +0000 +++ goldendict-1.5.0~git20150923/mouseover_win32/TextOutSpy.c 2015-09-23 08:26:24.000000000 +0000 @@ -13,12 +13,12 @@ HANDLE hSynhroMutex = 0; HINSTANCE hGetWordLib = 0; UINT_PTR TimerID = 0; -typedef void (*GetWordProc_t)(TCurrentMode *); +typedef DWORD (*GetWordProc_t)(TCurrentMode *); GetWordProc_t GetWordProc = NULL; GDDataStruct gds; UINT uGdAskMessage; WCHAR Buffer[256]; -DWORD ourProcessID; +DWORD ourProcessID, gdProcessID, winProcessID; static HWND GetWindowFromPoint(POINT pt) { @@ -83,18 +83,23 @@ GlobalData32->CurMod.BeginPos = 0; lstrcpyn( GlobalData32->CurMod.MatchedWord, GlobalData->CurMod.MatchedWord, sizeof( GlobalData32->CurMod.MatchedWord ) ); #endif - SendMessageTimeout(GlobalData->ServerWND, WM_MY_SHOW_TRANSLATION, 0, 0, SMTO_ABORTIFHUNG, MOUSEOVER_INTERVAL, &SendMsgAnswer); + SendMessageTimeout(GlobalData->ServerWND, WM_MY_SHOW_TRANSLATION, 0, 1, SMTO_ABORTIFHUNG, MOUSEOVER_INTERVAL, &SendMsgAnswer); } } return; } } + // Don't use other methods for GD own windows + if( winProcessID == gdProcessID ) + return; + if( ( flags & GD_FLAG_METHOD_STANDARD ) != 0 && GetWordProc != 0 ) { GlobalData->CurMod.WND = GlobalData->LastWND; GlobalData->CurMod.Pt = GlobalData->LastPt; - GetWordProc(&(GlobalData->CurMod)); + LPARAM lparam = GetWordProc(&(GlobalData->CurMod)); + // lparam == 0 - need to reverse RTL text, else don't reverse if (GlobalData->CurMod.WordLen > 0) { if( IsWindow( GlobalData->ServerWND ) ) { @@ -104,7 +109,7 @@ GlobalData32->CurMod.BeginPos = GlobalData->CurMod.BeginPos; lstrcpyn( GlobalData32->CurMod.MatchedWord, GlobalData->CurMod.MatchedWord, sizeof( GlobalData32->CurMod.MatchedWord ) ); #endif - SendMessageTimeout(GlobalData->ServerWND, WM_MY_SHOW_TRANSLATION, 0, 0, SMTO_ABORTIFHUNG, MOUSEOVER_INTERVAL, &SendMsgAnswer); + SendMessageTimeout(GlobalData->ServerWND, WM_MY_SHOW_TRANSLATION, 0, lparam, SMTO_ABORTIFHUNG, MOUSEOVER_INTERVAL, &SendMsgAnswer); } return; } @@ -120,14 +125,20 @@ GlobalData32->CurMod.BeginPos = GlobalData->CurMod.BeginPos; lstrcpyn( GlobalData32->CurMod.MatchedWord, GlobalData->CurMod.MatchedWord, sizeof( GlobalData32->CurMod.MatchedWord ) ); #endif - SendMessageTimeout(GlobalData->ServerWND, WM_MY_SHOW_TRANSLATION, 0, 0, SMTO_ABORTIFHUNG, MOUSEOVER_INTERVAL, &SendMsgAnswer); + SendMessageTimeout(GlobalData->ServerWND, WM_MY_SHOW_TRANSLATION, 0, 1, SMTO_ABORTIFHUNG, MOUSEOVER_INTERVAL, &SendMsgAnswer); } return; } } if( ( flags & GD_FLAG_METHOD_UI_AUTOMATION ) != 0 && IsWindow( GlobalData->ServerWND ) ) { - PostMessage( GlobalData->ServerWND, WM_MY_SHOW_TRANSLATION, 0, 0 ); +#ifdef __WIN64 + GlobalData32->CurMod.MatchedWord[0] = 0; + GlobalData32->CurMod.WordLen = 0; + GlobalData32->CurMod.BeginPos = 0; + GlobalData32->LastPt = GlobalData->LastPt; +#endif + PostMessage( GlobalData->ServerWND, WM_MY_SHOW_TRANSLATION, 0, 1 ); } } @@ -144,7 +155,7 @@ while( 1 ) { POINT curPt; HWND targetWnd; - DWORD winProcessID = 0; + winProcessID = 0; if( !GetCursorPos( &curPt ) ) break; @@ -309,6 +320,7 @@ return FALSE; } ourProcessID = GetCurrentProcessId(); + GetWindowThreadProcessId( GlobalData->ServerWND, &gdProcessID ); if(hSynhroMutex==0) { hSynhroMutex = CreateMutex(NULL, FALSE, "GoldenDictTextOutSpyMutex"); if(hSynhroMutex==0) { diff -Nru goldendict-1.5.0~git20131003/nsis/GoldenDict.nsi goldendict-1.5.0~git20150923/nsis/GoldenDict.nsi --- goldendict-1.5.0~git20131003/nsis/GoldenDict.nsi 2013-10-02 20:42:04.000000000 +0000 +++ goldendict-1.5.0~git20150923/nsis/GoldenDict.nsi 2015-09-23 08:26:24.000000000 +0000 @@ -1,7 +1,7 @@ !include "MUI2.nsh" Name "GoldenDict" - OutFile "GoldenDict-1.0.5-Install.exe" + OutFile "GoldenDict-1.5.0-Install.exe" InstallDir "$PROGRAMFILES\GoldenDict" diff -Nru goldendict-1.5.0~git20131003/orderandprops.cc goldendict-1.5.0~git20150923/orderandprops.cc --- goldendict-1.5.0~git20131003/orderandprops.cc 2013-08-16 09:41:47.000000000 +0000 +++ goldendict-1.5.0~git20150923/orderandprops.cc 2015-09-23 08:26:24.000000000 +0000 @@ -89,13 +89,6 @@ { ui.setupUi( this ); - // For now we don't support arrows, so remove them until we get to that - delete ui.moveActiveUp; - delete ui.moveActiveDown; - - delete ui.moveToActive; - delete ui.moveToInactive; - Instances::Group order( dictionaryOrder, allDictionaries ); Instances::Group inactive( inactiveDictionaries, allDictionaries ); @@ -125,6 +118,13 @@ connect (ui.searchLine, SIGNAL( filterChanged( QString const & ) ), this, SLOT( filterChanged( QString const &) ) ); + + connect( ui.dictionaryOrder->getModel(), SIGNAL( contentChanged() ), + this, SLOT( showDictNumbers() ) ); + connect( ui.inactiveDictionaries->getModel(), SIGNAL( contentChanged() ), + this, SLOT( showDictNumbers() ) ); + + showDictNumbers(); } Config::Group OrderAndProps::getCurrentDictionaryOrder() const @@ -191,6 +191,8 @@ ui.dictionaryDescription->clear(); ui.dictionaryDescription->setVisible( false ); ui.dictionaryDescriptionLabel->setVisible( false ); + ui.infoVerticalSpacer->changeSize( 20, 5, QSizePolicy::Minimum, QSizePolicy::Expanding ); + ui.infoVerticalLayout->invalidate(); } void OrderAndProps::describeDictionary( DictListWidget * lst, QModelIndex const & idx ) @@ -233,12 +235,15 @@ ui.dictionaryDescription->setPlainText( descText ); ui.dictionaryDescription->setVisible( true ); ui.dictionaryDescriptionLabel->setVisible( true ); + ui.infoVerticalSpacer->changeSize( 0, 0, QSizePolicy::Minimum, QSizePolicy::Minimum ); } else { ui.dictionaryDescription->setVisible( false ); ui.dictionaryDescriptionLabel->setVisible( false ); + ui.infoVerticalSpacer->changeSize( 20, 5, QSizePolicy::Minimum, QSizePolicy::Expanding ); } + ui.infoVerticalLayout->invalidate(); } } @@ -250,6 +255,18 @@ QAction * sortLangAction = new QAction( tr( "Sort by languages" ), &menu ); menu.addAction( sortLangAction ); + QAction * showHeadwordsAction = NULL; + + QModelIndex idx = ui.searchLine->mapToSource( ui.dictionaryOrder->indexAt( pos ) ); + sptr< Dictionary::Class > dict; + if( idx.isValid() && (unsigned)idx.row() < ui.dictionaryOrder->getCurrentDictionaries().size() ) + dict = ui.dictionaryOrder->getCurrentDictionaries()[ idx.row() ]; + if ( dict && dict->getWordCount() > 0 ) + { + showHeadwordsAction = new QAction( tr( "Dictionary headwords" ), &menu ); + menu.addAction( showHeadwordsAction ); + } + QAction * result = menu.exec( ui.dictionaryOrder->mapToGlobal( pos ) ); if( result == sortNameAction || result == sortLangAction ) @@ -261,4 +278,16 @@ sort( sortedDicts.begin(), sortedDicts.end(), dictLessThan ); ui.dictionaryOrder->populate( sortedDicts ); } + + if( result && result == showHeadwordsAction ) + { + emit showDictionaryHeadwords( QString::fromUtf8( dict->getId().c_str() ) ); + } +} + +void OrderAndProps::showDictNumbers() +{ + ui.dictionariesNumber->setText( tr( "Dictionaries active: %1, inactive: %2" ) + .arg( QString::number( ui.dictionaryOrder->getModel()->rowCount( QModelIndex() ) ) ) + .arg( QString::number( ui.inactiveDictionaries->getModel()->rowCount( QModelIndex() ) ) ) ); } diff -Nru goldendict-1.5.0~git20131003/orderandprops.hh goldendict-1.5.0~git20150923/orderandprops.hh --- goldendict-1.5.0~git20131003/orderandprops.hh 2013-08-16 09:41:47.000000000 +0000 +++ goldendict-1.5.0~git20150923/orderandprops.hh 2015-09-23 08:26:24.000000000 +0000 @@ -29,6 +29,7 @@ void filterChanged( QString const & filterText ); void dictListFocused(); void inactiveDictListFocused(); + void showDictNumbers(); private: @@ -36,6 +37,9 @@ void disableDictionaryDescription(); void describeDictionary( DictListWidget *, QModelIndex const & ); + +signals: + void showDictionaryHeadwords( QString const & dictId ); }; #endif diff -Nru goldendict-1.5.0~git20131003/orderandprops.ui goldendict-1.5.0~git20150923/orderandprops.ui --- goldendict-1.5.0~git20131003/orderandprops.ui 2013-08-16 09:41:47.000000000 +0000 +++ goldendict-1.5.0~git20150923/orderandprops.ui 2015-09-23 08:26:24.000000000 +0000 @@ -23,51 +23,12 @@ - - - Qt::Horizontal - - - - 40 - 20 - - - - - - + - ... - - - Qt::UpArrow + - - - - ... - - - Qt::DownArrow - - - - - - - Qt::Horizontal - - - - 40 - 20 - - - - @@ -81,54 +42,7 @@ - - - - - Qt::Vertical - - - - 20 - 40 - - - - - - - - ... - - - Qt::UpArrow - - - - - - - ... - - - Qt::DownArrow - - - - - - - Qt::Vertical - - - - 20 - 40 - - - - - + @@ -152,7 +66,7 @@ Dictionary information - + @@ -170,6 +84,9 @@ Qt::PlainText + + Qt::LinksAccessibleByMouse|Qt::TextSelectableByMouse + @@ -297,7 +214,7 @@ - + Qt::Vertical @@ -428,10 +345,6 @@ dictionaryOrder - moveActiveUp - moveActiveDown - moveToActive - moveToInactive inactiveDictionaries dictionaryDescription dictionaryFileList diff -Nru goldendict-1.5.0~git20131003/preferences.cc goldendict-1.5.0~git20150923/preferences.cc --- goldendict-1.5.0~git20131003/preferences.cc 2013-08-16 09:45:56.000000000 +0000 +++ goldendict-1.5.0~git20150923/preferences.cc 2015-09-23 08:26:24.000000000 +0000 @@ -4,11 +4,16 @@ #include "langcoder.hh" #include #include "broken_xrecord.hh" +#include "mainwindow.hh" -Preferences::Preferences( QWidget * parent, Config::Preferences const & p ): +Preferences::Preferences( QWidget * parent, Config::Class & cfg_ ): QDialog( parent ), prevInterfaceLanguage( 0 ) +, helpWindow( 0 ) +, cfg( cfg_ ) +, helpAction( this ) { + Config::Preferences const & p = cfg_.preferences; ui.setupUi( this ); connect( ui.enableScanPopup, SIGNAL( toggled( bool ) ), @@ -37,6 +42,17 @@ connect( ui.rightShift, SIGNAL( clicked( bool ) ), this, SLOT( sideShiftClicked( bool ) ) ); + connect( ui.buttonBox, SIGNAL( helpRequested() ), + this, SLOT( helpRequested() ) ); + + helpAction.setShortcut( QKeySequence( "F1" ) ); + helpAction.setShortcutContext( Qt::WidgetWithChildrenShortcut ); + + connect( &helpAction, SIGNAL( triggered() ), + this, SLOT( helpRequested() ) ); + + addAction( &helpAction ); + // Load values into form ui.interfaceLanguage->addItem( tr( "System default" ), QString() ); @@ -77,6 +93,49 @@ break; } + // Fill help languages combobox + + ui.helpLanguage->addItem( tr( "Default" ), QString() ); + + // See which helps do we have + + QStringList availHelps = QDir( Config::getHelpDir() ).entryList( QStringList( "*.qch" ), + QDir::Files ); + + QMap< QString, QPair< QIcon, QString > > sortedHelps; + + for( QStringList::iterator i = availHelps.begin(); i != availHelps.end(); ++i ) + { + QString loc = i->mid( 7, i->length() - 11 ); + QString lang = loc.mid( 0, 2 ); + QString reg; + if(loc.length() >= 5 ) + reg = loc.mid( 3, 2 ).toLower(); + else + { + if( lang.compare( "en", Qt::CaseInsensitive ) == 0 ) + reg = "US"; + else + reg = lang.toUpper(); + } + + sortedHelps.insertMulti( + Language::localizedNameForId( LangCoder::code2toInt( lang.toLatin1().data() ) ), + QPair< QIcon, QString >( + QIcon( QString( ":/flags/%1.png" ).arg( reg.toLower() ) ), lang + "_" + reg ) ); + } + + for( QMap< QString, QPair< QIcon, QString > >::iterator i = sortedHelps.begin(); + i != sortedHelps.end(); ++i ) + ui.helpLanguage->addItem( i.value().first, i.key(), i.value().second ); + + for( int x = 0; x < ui.helpLanguage->count(); ++x ) + if ( ui.helpLanguage->itemData( x ).toString() == p.helpLanguage ) + { + ui.helpLanguage->setCurrentIndex( x ); + break; + } + ui.displayStyle->addItem( QIcon( ":/icons/programicon_old.png" ), tr( "Default" ), QString() ); ui.displayStyle->addItem( QIcon( ":/icons/programicon.png" ), tr( "Modern" ), QString( "modern" ) ); ui.displayStyle->addItem( QIcon( ":/icons/icon32_dsl.png" ), tr( "Lingvo" ), QString( "lingvo" ) ); @@ -151,6 +210,11 @@ ui.rightCtrl->hide(); ui.leftShift->hide(); ui.rightShift->hide(); +#ifdef Q_OS_MAC + ui.altKey->setText( "Opt" ); + ui.winKey->setText( "Ctrl" ); + ui.ctrlKey->setText( "Cmd" ); +#endif #endif //Platform-specific options @@ -195,6 +259,23 @@ ui.proxyUser->setText( p.proxyServer.user ); ui.proxyPassword->setText( p.proxyServer.password ); + if( p.proxyServer.useSystemProxy ) + { + ui.systemProxy->setChecked( true ); + ui.customSettingsGroup->setEnabled( false ); + } + else + { + ui.customProxy->setChecked( true ); + ui.customSettingsGroup->setEnabled( p.proxyServer.enabled ); + } + + connect( ui.customProxy, SIGNAL( toggled( bool ) ), + this, SLOT( customProxyToggled( bool ) ) ); + + connect( ui.useProxyServer, SIGNAL( toggled( bool ) ), + this, SLOT( customProxyToggled( bool ) ) ); + ui.checkForNewReleases->setChecked( p.checkForNewReleases ); ui.disallowContentFromOtherSites->setChecked( p.disallowContentFromOtherSites ); ui.enableWebPlugins->setChecked( p.enableWebPlugins ); @@ -203,6 +284,29 @@ // Add-on styles ui.addonStylesLabel->setVisible( ui.addonStyles->count() > 1 ); ui.addonStyles->setCurrentStyle( p.addonStyle ); + + // Full-text search parameters + ui.ftsGroupBox->setChecked( p.fts.enabled ); + + ui.allowAard->setChecked( !p.fts.disabledTypes.contains( "AARD", Qt::CaseInsensitive ) ); + ui.allowBGL->setChecked( !p.fts.disabledTypes.contains( "BGL", Qt::CaseInsensitive ) ); + ui.allowDictD->setChecked( !p.fts.disabledTypes.contains( "DICTD", Qt::CaseInsensitive ) ); + ui.allowDSL->setChecked( !p.fts.disabledTypes.contains( "DSL", Qt::CaseInsensitive ) ); + ui.allowMDict->setChecked( !p.fts.disabledTypes.contains( "MDICT", Qt::CaseInsensitive ) ); + ui.allowSDict->setChecked( !p.fts.disabledTypes.contains( "SDICT", Qt::CaseInsensitive ) ); + ui.allowSlob->setChecked( !p.fts.disabledTypes.contains( "SLOB", Qt::CaseInsensitive ) ); + ui.allowStardict->setChecked( !p.fts.disabledTypes.contains( "STARDICT", Qt::CaseInsensitive ) ); + ui.allowXDXF->setChecked( !p.fts.disabledTypes.contains( "XDXF", Qt::CaseInsensitive ) ); + ui.allowZim->setChecked( !p.fts.disabledTypes.contains( "ZIM", Qt::CaseInsensitive ) ); + ui.allowEpwing->setChecked( !p.fts.disabledTypes.contains( "EPWING", Qt::CaseInsensitive ) ); +#ifndef MAKE_ZIM_SUPPORT + ui.allowZim->hide(); + ui.allowSlob->hide(); +#endif +#ifdef NO_EPWING_SUPPORT + ui.allowEpwing->hide(); +#endif + ui.maxDictionarySize->setValue( p.fts.maxDictionarySize ); } Config::Preferences Preferences::getPreferences() @@ -213,6 +317,10 @@ ui.interfaceLanguage->itemData( ui.interfaceLanguage->currentIndex() ).toString(); + p.helpLanguage = + ui.helpLanguage->itemData( + ui.helpLanguage->currentIndex() ).toString(); + p.displayStyle = ui.displayStyle->itemData( ui.displayStyle->currentIndex() ).toString(); @@ -273,6 +381,7 @@ p.audioPlaybackProgram = ui.audioPlaybackProgram->text(); p.proxyServer.enabled = ui.useProxyServer->isChecked(); + p.proxyServer.useSystemProxy = ui.systemProxy->isChecked(); p.proxyServer.type = ( Config::ProxyServer::Type ) ui.proxyType->currentIndex(); @@ -289,6 +398,86 @@ p.addonStyle = ui.addonStyles->getCurrentStyle(); + p.fts.enabled = ui.ftsGroupBox->isChecked(); + p.fts.maxDictionarySize = ui.maxDictionarySize->value(); + + if( !ui.allowAard->isChecked() ) + { + if( !p.fts.disabledTypes.isEmpty() ) + p.fts.disabledTypes += ','; + p.fts.disabledTypes += "AARD"; + } + + if( !ui.allowBGL->isChecked() ) + { + if( !p.fts.disabledTypes.isEmpty() ) + p.fts.disabledTypes += ','; + p.fts.disabledTypes += "BGL"; + } + + if( !ui.allowDictD->isChecked() ) + { + if( !p.fts.disabledTypes.isEmpty() ) + p.fts.disabledTypes += ','; + p.fts.disabledTypes += "DICTD"; + } + + if( !ui.allowDSL->isChecked() ) + { + if( !p.fts.disabledTypes.isEmpty() ) + p.fts.disabledTypes += ','; + p.fts.disabledTypes += "DSL"; + } + + if( !ui.allowMDict->isChecked() ) + { + if( !p.fts.disabledTypes.isEmpty() ) + p.fts.disabledTypes += ','; + p.fts.disabledTypes += "MDICT"; + } + + if( !ui.allowSDict->isChecked() ) + { + if( !p.fts.disabledTypes.isEmpty() ) + p.fts.disabledTypes += ','; + p.fts.disabledTypes += "SDICT"; + } + + if( !ui.allowSlob->isChecked() ) + { + if( !p.fts.disabledTypes.isEmpty() ) + p.fts.disabledTypes += ','; + p.fts.disabledTypes += "SLOB"; + } + + if( !ui.allowStardict->isChecked() ) + { + if( !p.fts.disabledTypes.isEmpty() ) + p.fts.disabledTypes += ','; + p.fts.disabledTypes += "STARDICT"; + } + + if( !ui.allowXDXF->isChecked() ) + { + if( !p.fts.disabledTypes.isEmpty() ) + p.fts.disabledTypes += ','; + p.fts.disabledTypes += "XDXF"; + } + + if( !ui.allowZim->isChecked() ) + { + if( !p.fts.disabledTypes.isEmpty() ) + p.fts.disabledTypes += ','; + p.fts.disabledTypes += "ZIM"; + } + + if( !ui.allowEpwing->isChecked() ) + { + if( !p.fts.disabledTypes.isEmpty() ) + p.fts.disabledTypes += ','; + p.fts.disabledTypes += "EPWING"; + } + return p; } @@ -369,3 +558,43 @@ ui.audioPlaybackProgram->setEnabled( enabled ); } +void Preferences::customProxyToggled( bool ) +{ + ui.customSettingsGroup->setEnabled( ui.customProxy->isChecked() + && ui.useProxyServer->isChecked() ); +} + +void Preferences::helpRequested() +{ + if( !helpWindow ) + { + MainWindow * mainWindow = qobject_cast< MainWindow * >( parentWidget() ); + if( mainWindow ) + mainWindow->closeGDHelp(); + + helpWindow = new Help::HelpWindow( this, cfg ); + + if( helpWindow ) + { + helpWindow->setWindowFlags( Qt::Window ); + + connect( helpWindow, SIGNAL( needClose() ), + this, SLOT( closeHelp() ) ); + helpWindow->showHelpFor( "Preferences" ); + helpWindow->show(); + } + } + else + { + if( !helpWindow->isVisible() ) + helpWindow->show(); + + helpWindow->activateWindow(); + } +} + +void Preferences::closeHelp() +{ + if( helpWindow ) + helpWindow->hide(); +} diff -Nru goldendict-1.5.0~git20131003/preferences.hh goldendict-1.5.0~git20150923/preferences.hh --- goldendict-1.5.0~git20131003/preferences.hh 2012-10-01 07:15:21.000000000 +0000 +++ goldendict-1.5.0~git20150923/preferences.hh 2015-09-23 08:26:24.000000000 +0000 @@ -3,6 +3,7 @@ #include #include "config.hh" +#include "helpwindow.hh" #include "ui_preferences.h" /// Preferences dialog -- allows changing various program options. @@ -12,9 +13,15 @@ int prevInterfaceLanguage; + Help::HelpWindow * helpWindow; + Config::Class & cfg; + QAction helpAction; + public: - Preferences( QWidget * parent, Config::Preferences const & ); + Preferences( QWidget * parent, Config::Class & cfg_ ); + ~Preferences() + { if( helpWindow ) delete helpWindow; } Config::Preferences getPreferences(); @@ -41,6 +48,11 @@ void on_buttonBox_accepted(); void on_useExternalPlayer_toggled( bool enabled ); + + void customProxyToggled( bool ); + + void helpRequested(); + void closeHelp(); }; #endif diff -Nru goldendict-1.5.0~git20131003/preferences.ui goldendict-1.5.0~git20150923/preferences.ui --- goldendict-1.5.0~git20131003/preferences.ui 2013-10-02 20:48:35.000000000 +0000 +++ goldendict-1.5.0~git20150923/preferences.ui 2015-09-23 09:22:38.000000000 +0000 @@ -6,7 +6,7 @@ 0 0 - 572 + 634 403 @@ -270,6 +270,29 @@ + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + Help language + + + + + + + Qt::Horizontal @@ -422,7 +445,16 @@ 0 - + + 0 + + + 0 + + + 0 + + 0 @@ -556,7 +588,16 @@ 0 - + + 0 + + + 0 + + + 0 + + 0 @@ -940,73 +981,96 @@ - - - - - Type: - - - - - - - - - - Host: - - - - - - - - - - Port: - - - - - - - 65535 - - - 8080 - - - - + + + System proxy + + - - - - - User: - - - - - - - - - - Password: - - - - - - - QLineEdit::Password - - - - + + + Custom proxy + + + + + + + Custom settings + + + + + + + + Type: + + + + + + + + + + Host: + + + + + + + + + + Port: + + + + + + + 65535 + + + 8080 + + + + + + + + + + + User: + + + + + + + + + + Password: + + + + + + + QLineEdit::Password + + + + + + + @@ -1107,6 +1171,176 @@ + + + + :/icons/system-search.png:/icons/system-search.png + + + Full-text search + + + + + + Qt::Vertical + + + + 20 + 40 + + + + + + + + Allow full-text search for: + + + true + + + true + + + + + + Aard + + + + + + + BGL + + + + + + + DictD + + + + + + + DSL + + + + + + + MDict + + + + + + + SDict + + + + + + + Slob + + + + + + + Stardict + + + + + + + XDXF + + + + + + + Zim + + + + + + + + + Don't search in dictionaries containing more than + + + + + + + 10000000 + + + 10000 + + + + + + + articles (0 - unlimited) + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + + + Epwing + + + + + + + + + + Qt::Vertical + + + + 20 + 40 + + + + + + Ad&vanced @@ -1362,7 +1596,7 @@ Qt::Horizontal - QDialogButtonBox::Cancel|QDialogButtonBox::Ok + QDialogButtonBox::Cancel|QDialogButtonBox::Help|QDialogButtonBox::Ok diff -Nru goldendict-1.5.0~git20131003/README.md goldendict-1.5.0~git20150923/README.md --- goldendict-1.5.0~git20131003/README.md 2013-10-02 20:42:04.000000000 +0000 +++ goldendict-1.5.0~git20150923/README.md 2015-09-23 08:26:24.000000000 +0000 @@ -9,7 +9,8 @@ ### External Deps * Make, GCC, Git -* Qt framework. Minumal required version is 4.5. But Qt 4.7 or 4.8 is recommended. +* Qt framework. Minimum required version is 4.6 for Windows, 4.5 for all other platforms. But Qt 4.7 or 4.8 is recommended. +* If you want to use Qt 5.x then use branch qt4x5 * Qt Creator IDE is recommended for development * Various libraries on Linux (png, zlib, etc) * On Mac and Windows all the libraries are already included in the repository @@ -19,7 +20,7 @@ sudo apt-get install git pkg-config build-essential qt4-qmake \ libvorbis-dev zlib1g-dev libhunspell-dev x11proto-record-dev \ libqt4-dev libqtwebkit-dev libxtst-dev liblzo2-dev libbz2-dev \ - libao-dev libavutil-dev libavformat-dev + libao-dev libavutil-dev libavformat-dev libtiff5-dev libeb16-dev ## How to build @@ -34,6 +35,31 @@ In case when qmake-qt4 does not exist, try using `qmake` but make sure it is indeed from the Qt 4 installation. Alternatively, you might want to load `goldendict.pro` file from within Qt Creator, especially on Windows. +### Building with Zim dictionaries support + +To add Zim and Slob formats support you need at first install lzma-dev package: + + sudo apt-get liblzma-dev + +Then pass `"CONFIG+=zim_support"` to `qmake` + + qmake "CONFIG+=zim_support" + +### Building without extra tiff handler + +If you have problem building with libtiff5-dev package, you can pass +`"CONFIG+=no_extra_tiff_handler"` to `qmake` in order to disable extra tiff support +(without such extra support some b/w tiff images will not be displayed): + + qmake "CONFIG+=no_extra_tiff_handler" + +### Building without Epwing format support + +If you have problem building with libeb-dev package, you can pass +`"CONFIG+=no_epwing_support"` to `qmake` in order to disable Epwing format support + + qmake "CONFIG+=no_epwing_support" + ### Building without internal audio player If you have problem building with FFmpeg/libao (for example, Ubuntu older than 12.04), you can pass @@ -41,6 +67,11 @@ qmake "DISABLE_INTERNAL_PLAYER=1" +NB: All additional settings for `qmake` that you need must be combined in one `qmake` launch, for example: + + qmake "CONFIG+=zim_support" "CONFIG+=no_extra_tiff_handler" "DISABLE_INTERNAL_PLAYER=1" + + Then, invoke `make clean` before `make` because the setting change: make clean && make diff -Nru goldendict-1.5.0~git20131003/redist/goldendict.desktop goldendict-1.5.0~git20150923/redist/goldendict.desktop --- goldendict-1.5.0~git20131003/redist/goldendict.desktop 2013-08-16 09:45:56.000000000 +0000 +++ goldendict-1.5.0~git20150923/redist/goldendict.desktop 2015-09-23 08:26:24.000000000 +0000 @@ -6,5 +6,5 @@ GenericName=Multiformat Dictionary Comment=GoldenDict Encoding=UTF-8 -Icon=/usr/share/pixmaps/goldendict.png +Icon=goldendict Exec=goldendict diff -Nru goldendict-1.5.0~git20131003/resources.qrc goldendict-1.5.0~git20150923/resources.qrc --- goldendict-1.5.0~git20131003/resources.qrc 2013-10-02 20:42:04.000000000 +0000 +++ goldendict-1.5.0~git20150923/resources.qrc 2015-09-23 08:26:24.000000000 +0000 @@ -10,6 +10,7 @@ icons/addtab.png icons/next.png icons/previous.png + icons/home.png icons/reload.png icons/programicon.png icons/programicon_scan.png @@ -76,5 +77,7 @@ icons/playsound_color.png icons/playsound_full.png icons/icon32_zim.png + icons/icon32_epwing.png + icons/icon32_slob.png diff -Nru goldendict-1.5.0~git20131003/romaji.cc goldendict-1.5.0~git20150923/romaji.cc --- goldendict-1.5.0~git20131003/romaji.cc 2012-10-01 07:15:21.000000000 +0000 +++ goldendict-1.5.0~git20150923/romaji.cc 2015-09-23 08:26:24.000000000 +0000 @@ -81,7 +81,8 @@ ins( "tsa", "ツァ" ); ins( "tse", "ツェ" ); ins( "tso", "ツォ" ); ins( "fa", "ファ" ); ins( "fi", "フィ" ); ins( "fe", "フェ" ); ins( "fo", "フォ" ); ins( "fyu", "フュ" ); - + // Long vowel mark + ins( "-", "ー" ); // Double consonants ins( "kka", "ッカ" ); ins( "kki", "ッキ" ); ins( "kku", "ック" ); ins( "kke", "ッケ" ); ins( "kko", "ッコ" ); ins( "kkya", "ッキャ" ); ins( "kkyu", "ッキュ" ); ins( "kkyo", "ッキョ" ); diff -Nru goldendict-1.5.0~git20131003/scanpopup.cc goldendict-1.5.0~git20150923/scanpopup.cc --- goldendict-1.5.0~git20131003/scanpopup.cc 2013-08-16 09:41:47.000000000 +0000 +++ goldendict-1.5.0~git20150923/scanpopup.cc 2015-09-23 08:26:24.000000000 +0000 @@ -11,9 +11,10 @@ #include #include #include -#include "dprintf.hh" +#include "gddebug.hh" +#include "gestures.hh" -#ifdef Q_OS_MACX +#ifdef Q_OS_MAC #include "macmouseover.hh" #define MouseOver MacMouseOver #else @@ -26,7 +27,7 @@ /// in their behavior on those platforms. static Qt::WindowFlags popupWindowFlags = -#ifdef Q_WS_WIN +#if defined (Q_OS_WIN) || defined (Q_OS_MAC) Qt::Tool | Qt::FramelessWindowHint | Qt::WindowStaysOnTopHint #else Qt::Popup @@ -48,6 +49,7 @@ escapeAction( this ), switchExpandModeAction( this ), focusTranslateLineAction( this ), + openSearchAction( this ), wordFinder( this ), dictionaryBar( this, configEvents, cfg.editDictionaryCommandLine, cfg.preferences.maxDictionaryRefsInContextMenu ), mouseEnteredOnce( false ), @@ -56,12 +58,22 @@ { ui.setupUi( this ); + openSearchAction.setShortcut( QKeySequence( "Ctrl+F" ) ); + + if( layoutDirection() == Qt::RightToLeft ) + { + // Adjust button icons for Right-To-Left layout + ui.goBackButton->setIcon( QIcon( ":/icons/next.png" ) ); + ui.goForwardButton->setIcon( QIcon( ":/icons/previous.png" ) ); + } + mainStatusBar = new MainStatusBar( this ); ui.queryError->hide(); definition = new ArticleView( ui.outerFrame, articleNetMgr, allDictionaries, groups, true, cfg, + openSearchAction, dictionaryBar.toggleViewAction() ); @@ -213,6 +225,10 @@ #ifdef Q_WS_X11 connect( QApplication::clipboard(), SIGNAL( changed( QClipboard::Mode ) ), this, SLOT( clipboardChanged( QClipboard::Mode ) ) ); +#else + if( cfg.preferences.trackClipboardChanges ) + connect( QApplication::clipboard(), SIGNAL( changed( QClipboard::Mode ) ), + this, SLOT( clipboardChanged( QClipboard::Mode ) ) ); #endif connect( &MouseOver::instance(), SIGNAL( hovered( QString const &, bool ) ), @@ -251,6 +267,10 @@ ui.goBackButton->setEnabled( false ); ui.goForwardButton->setEnabled( false ); +#if QT_VERSION >= QT_VERSION_CHECK(4, 6, 0) + grabGesture( Gestures::GDPinchGestureType ); + grabGesture( Gestures::GDSwipeGestureType ); +#endif } ScanPopup::~ScanPopup() @@ -261,6 +281,11 @@ cfg.pinPopupWindow = ui.pinButton->isChecked(); disableScanning(); + +#if QT_VERSION >= QT_VERSION_CHECK(4, 6, 0) + ungrabGesture( Gestures::GDPinchGestureType ); + ungrabGesture( Gestures::GDSwipeGestureType ); +#endif } void ScanPopup::enableScanning() @@ -303,7 +328,7 @@ void ScanPopup::translateWordFromClipboard(QClipboard::Mode m) { - DPRINTF( "translating from clipboard or selection\n" ); + GD_DPRINTF( "translating from clipboard or selection\n" ); QString subtype = "plain"; @@ -339,7 +364,7 @@ if ( !isScanningEnabled ) return; - DPRINTF( "clipboard changed\n" ); + GD_DPRINTF( "clipboard changed\n" ); QString subtype = "plain"; @@ -404,10 +429,6 @@ definition->setSelectionBySingleClick( cfg.preferences.selectWordBySingleClick ); - /// Too large strings make window expand which is probably not what user - /// wants - ui.translateBox->setText( inputWord, false ); - if ( !isVisible() ) { // Need to show the window @@ -479,6 +500,10 @@ if ( ui.pinButton->isChecked() ) setWindowTitle( tr( "%1 - %2" ).arg( elideInputWord(), "GoldenDict" ) ); + /// Too large strings make window expand which is probably not what user + /// wants + ui.translateBox->setText( inputWord, false ); + showTranslationFor( inputWord ); } @@ -976,6 +1001,9 @@ void ScanPopup::mutedDictionariesChanged() { + // Update suggestion list + translateInputChanged( ui.translateBox->translateLine()->text() ); + if ( dictionaryBar.toggleViewAction()->isChecked() ) definition->updateMutedContents(); } diff -Nru goldendict-1.5.0~git20131003/scanpopup.hh goldendict-1.5.0~git20150923/scanpopup.hh --- goldendict-1.5.0~git20131003/scanpopup.hh 2013-08-16 09:41:47.000000000 +0000 +++ goldendict-1.5.0~git20150923/scanpopup.hh 2015-09-23 08:26:24.000000000 +0000 @@ -107,6 +107,7 @@ Ui::ScanPopup ui; ArticleView * definition; QAction escapeAction, switchExpandModeAction, focusTranslateLineAction; + QAction openSearchAction; QString pendingInputWord, inputWord; WordFinder wordFinder; Config::Events configEvents; diff -Nru goldendict-1.5.0~git20131003/scanpopup.ui goldendict-1.5.0~git20150923/scanpopup.ui --- goldendict-1.5.0~git20131003/scanpopup.ui 2013-08-16 09:41:47.000000000 +0000 +++ goldendict-1.5.0~git20150923/scanpopup.ui 2015-09-23 08:26:24.000000000 +0000 @@ -14,6 +14,12 @@ Dialog + + + 280 + 100 + + 0 @@ -173,7 +179,7 @@ - 40 + 0 20 diff -Nru goldendict-1.5.0~git20131003/sdict.cc goldendict-1.5.0~git20150923/sdict.cc --- goldendict-1.5.0~git20131003/sdict.cc 2013-10-02 20:42:04.000000000 +0000 +++ goldendict-1.5.0~git20150923/sdict.cc 2015-09-23 08:26:24.000000000 +0000 @@ -7,10 +7,12 @@ #include "utf8.hh" #include "chunkedstorage.hh" #include "langcoder.hh" -#include "dprintf.hh" +#include "gddebug.hh" #include "fsencoding.hh" #include "decompress.hh" #include "htmlescape.hh" +#include "ftshelpers.hh" +#include "wstring_qt.hh" #include #include @@ -122,7 +124,7 @@ class SdictDictionary: public BtreeIndexing::BtreeDictionary { - Mutex idxMutex; + Mutex idxMutex, sdictMutex; File::Class idx; IdxHeader idxHeader; ChunkedStorage::Reader chunks; @@ -159,6 +161,22 @@ wstring const & ) throw( std::exception ); + virtual QString const & getDescription(); + + virtual sptr< Dictionary::DataRequest > getSearchResults( QString const & searchString, + int searchMode, bool matchCase, + int distanceBetweenWords, + int maxResults ); + virtual void getArticleText( uint32_t articleAddress, QString & headword, QString & text ); + + virtual void makeFTSIndex(QAtomicInt & isCancelled, bool firstIteration ); + + virtual void setFTSParameters( Config::FullTextSearch const & fts ) + { + can_FTS = fts.enabled + && !fts.disabledTypes.contains( "SDICT", Qt::CaseInsensitive ) + && ( fts.maxDictionarySize == 0 || getArticleCount() <= fts.maxDictionarySize ); + } protected: void loadIcon() throw(); @@ -194,6 +212,16 @@ openIndex( IndexInfo( idxHeader.indexBtreeMaxElements, idxHeader.indexRootOffset ), idx, idxMutex ); + + // Full-text search parameters + + can_FTS = true; + + ftsIdxName = indexFile + "_FTS"; + + if( !Dictionary::needToRebuildIndex( dictionaryFiles, ftsIdxName ) + && !FtsHelpers::ftsIndexIsOldOrBad( ftsIdxName, this ) ) + FTS_index_completed.ref(); } SdictDictionary::~SdictDictionary() @@ -330,10 +358,13 @@ vector< char > articleBody; - df.seek( articleOffset ); - df.read( &articleSize, sizeof(articleSize) ); - articleBody.resize( articleSize ); - df.read( &articleBody.front(), articleSize ); + { + Mutex::Lock _( sdictMutex ); + df.seek( articleOffset ); + df.read( &articleSize, sizeof(articleSize) ); + articleBody.resize( articleSize ); + df.read( &articleBody.front(), articleSize ); + } if ( articleBody.empty() ) throw exCantReadFile( getDictionaryFilenames()[ 0 ] ); @@ -356,6 +387,69 @@ articleText.append( "
" ); } +void SdictDictionary::makeFTSIndex( QAtomicInt & isCancelled, bool firstIteration ) +{ + if( !( Dictionary::needToRebuildIndex( getDictionaryFilenames(), ftsIdxName ) + || FtsHelpers::ftsIndexIsOldOrBad( ftsIdxName, this ) ) ) + FTS_index_completed.ref(); + + if( haveFTSIndex() ) + return; + + if( ensureInitDone().size() ) + return; + + if( firstIteration && getArticleCount() > FTS::MaxDictionarySizeForFastSearch ) + return; + + gdDebug( "SDict: Building the full-text index for dictionary: %s\n", + getName().c_str() ); + + try + { + FtsHelpers::makeFTSIndex( this, isCancelled ); + FTS_index_completed.ref(); + } + catch( std::exception &ex ) + { + gdWarning( "SDict: Failed building full-text search index for \"%s\", reason: %s\n", getName().c_str(), ex.what() ); + QFile::remove( FsEncoding::decode( ftsIdxName.c_str() ) ); + } +} + +void SdictDictionary::getArticleText( uint32_t articleAddress, QString & headword, QString & text ) +{ + try + { + string articleStr; + headword.clear(); + text.clear(); + + loadArticle( articleAddress, articleStr ); + + try + { + wstring wstr = Utf8::decode( articleStr ); + text = Html::unescape( gd::toQString( wstr ) ); + } + catch( std::exception & ) + { + } + } + catch( std::exception &ex ) + { + gdWarning( "SDict: Failed retrieving article from \"%s\", reason: %s\n", getName().c_str(), ex.what() ); + } +} + +sptr< Dictionary::DataRequest > SdictDictionary::getSearchResults( QString const & searchString, + int searchMode, bool matchCase, + int distanceBetweenWords, + int maxResults ) +{ + return new FtsHelpers::FTSResultsRequest( *this, searchString,searchMode, matchCase, distanceBetweenWords, maxResults ); +} + /// SdictDictionary::getArticle() class SdictArticleRequest; @@ -489,7 +583,7 @@ } catch( std::exception &ex ) { - qWarning( "SDict: Failed loading article from \"%s\", reason: %s\n", dict.getName().c_str(), ex.what() ); + gdWarning( "SDict: Failed loading article from \"%s\", reason: %s\n", dict.getName().c_str(), ex.what() ); } } @@ -543,6 +637,71 @@ return new SdictArticleRequest( word, alts, *this ); } +QString const& SdictDictionary::getDescription() +{ + if( !dictionaryDescription.isEmpty() ) + return dictionaryDescription; + + dictionaryDescription = QString::fromLatin1( "Title: " ) + + QString::fromUtf8( getName().c_str() ); + + try + { + Mutex::Lock _( sdictMutex ); + + DCT_header dictHeader; + + df.seek( 0 ); + if( df.readRecords( &dictHeader, sizeof(dictHeader), 1 ) != 1 ) + throw exCantReadFile( getDictionaryFilenames()[ 0 ] ); + + int compression = dictHeader.compression & 0x0F; + + vector< char > data; + uint32_t size; + string str; + + df.seek( dictHeader.copyrightOffset ); + df.read( &size, sizeof( size ) ); + data.resize( size ); + df.read( &data.front(), size ); + + if( compression == 1 ) + str = decompressZlib( data.data(), size ); + else if( compression == 2 ) + str = decompressBzip2( data.data(), size ); + else + str = string( data.data(), size ); + + dictionaryDescription += QString::fromLatin1( "\n\nCopyright: " ) + + QString::fromUtf8( str.c_str(), str.size() ); + + df.seek( dictHeader.versionOffset ); + df.read( &size, sizeof( size ) ); + data.resize( size ); + df.read( &data.front(), size ); + + if( compression == 1 ) + str = decompressZlib( data.data(), size ); + else if( compression == 2 ) + str = decompressBzip2( data.data(), size ); + else + str = string( data.data(), size ); + + dictionaryDescription += QString::fromLatin1( "\n\nVersion: " ) + + QString::fromUtf8( str.c_str(), str.size() ); + } + catch( std::exception &ex ) + { + gdWarning( "SDict: Failed description reading for \"%s\", reason: %s\n", getName().c_str(), ex.what() ); + } + + if( dictionaryDescription.isEmpty() ) + dictionaryDescription = "NONE"; + + return dictionaryDescription; +} + } // anonymous namespace vector< sptr< Dictionary::Class > > makeDictionaries( @@ -575,7 +734,7 @@ { try { - qDebug( "SDict: Building the index for dictionary: %s\n", i->c_str() ); + gdDebug( "SDict: Building the index for dictionary: %s\n", i->c_str() ); File::Class df( *i, "rb" ); @@ -584,7 +743,7 @@ df.read( &dictHeader, sizeof(dictHeader) ); if( strncmp( dictHeader.signature, "sdct", 4 ) ) { - qWarning( "File \"%s\" is not valid SDictionary file", i->c_str() ); + gdWarning( "File \"%s\" is not valid SDictionary file", i->c_str() ); continue; } int compression = dictHeader.compression & 0x0F; @@ -681,8 +840,8 @@ } catch( std::exception & e ) { - qWarning( "Sdictionary dictionary indexing failed: %s, error: %s\n", - i->c_str(), e.what() ); + gdWarning( "Sdictionary dictionary indexing failed: %s, error: %s\n", + i->c_str(), e.what() ); continue; } catch( ... ) @@ -691,9 +850,17 @@ continue; } } // if need to rebuild - dictionaries.push_back( new SdictDictionary( dictId, - indexFile, - dictFiles ) ); + try + { + dictionaries.push_back( new SdictDictionary( dictId, + indexFile, + dictFiles ) ); + } + catch( std::exception & e ) + { + gdWarning( "Sdictionary dictionary initializing failed: %s, error: %s\n", + i->c_str(), e.what() ); + } } return dictionaries; } diff -Nru goldendict-1.5.0~git20131003/slob.cc goldendict-1.5.0~git20150923/slob.cc --- goldendict-1.5.0~git20131003/slob.cc 1970-01-01 00:00:00.000000000 +0000 +++ goldendict-1.5.0~git20150923/slob.cc 2015-09-23 08:26:24.000000000 +0000 @@ -0,0 +1,1560 @@ +/* This file is (c) 2015 Abs62 + * Part of GoldenDict. Licensed under GPLv3 or later, see the LICENSE file */ + +#ifdef MAKE_ZIM_SUPPORT + +#include "slob.hh" +#include "btreeidx.hh" +#include "fsencoding.hh" +#include "folding.hh" +#include "gddebug.hh" +#include "utf8.hh" +#include "decompress.hh" +#include "langcoder.hh" +#include "wstring.hh" +#include "wstring_qt.hh" +#include "ftshelpers.hh" +#include "htmlescape.hh" +#include "filetype.hh" +#include "tiff.hh" + +#ifdef _MSC_VER +#include +#endif + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include + +namespace Slob { + +using std::string; +using std::map; +using std::vector; +using std::multimap; +using std::pair; +using std::set; +using gd::wstring; + +using BtreeIndexing::WordArticleLink; +using BtreeIndexing::IndexedWords; +using BtreeIndexing::IndexInfo; + +DEF_EX_STR( exNotSlobFile, "Not an Slob file", Dictionary::Ex ) +DEF_EX_STR( exCantReadFile, "Can't read file", Dictionary::Ex ) +DEF_EX_STR( exCantDecodeFile, "Can't decode file", Dictionary::Ex ) +DEF_EX_STR( exNoCodecFound, "No text codec found", Dictionary::Ex ) +DEF_EX( exUserAbort, "User abort", Dictionary::Ex ) +DEF_EX( exNoResource, "No resource found", Dictionary::Ex ) + +#pragma pack( push, 1 ) + +enum +{ + Signature = 0x58424C53, // SLBX on little-endian, XBLS on big-endian + CurrentFormatVersion = 1 + BtreeIndexing::FormatVersion + Folding::Version +}; + +struct IdxHeader +{ + quint32 signature; // First comes the signature, SLBX + quint32 formatVersion; // File format version (CurrentFormatVersion) + quint32 indexBtreeMaxElements; // Two fields from IndexInfo + quint32 indexRootOffset; + quint32 resourceIndexBtreeMaxElements; // Two fields from IndexInfo + quint32 resourceIndexRootOffset; + quint32 wordCount; + quint32 articleCount; + quint32 langFrom; // Source language + quint32 langTo; // Target language +} +#ifndef _MSC_VER +__attribute__((packed)) +#endif +; + +#pragma pack( pop ) + +const char SLOB_MAGIC[ 8 ] = { 0x21, 0x2d, 0x31, 0x53, 0x4c, 0x4f, 0x42, 0x1f }; + +struct RefEntry +{ + QString key; + quint32 binIndex; + quint16 itemIndex; + QString fragment; +}; + +bool indexIsOldOrBad( string const & indexFile ) +{ + File::Class idx( indexFile, "rb" ); + + IdxHeader header; + + return idx.readRecords( &header, sizeof( header ), 1 ) != 1 || + header.signature != Signature || + header.formatVersion != CurrentFormatVersion; +} + + +class SlobFile +{ + enum Compressions + { UNKNOWN = 0, ZLIB, BZ2, LZMA2 }; + + QFile file; + QString fileName, dictionaryName; + Compressions compression; + QString encoding; + unsigned char uuid[ 16 ]; + QTextCodec *codec; + QMap< QString, QString > tags; + QVector< QString > contentTypes; + quint32 blobCount; + quint64 storeOffset, fileSize, refsOffset; + quint32 refsCount, itemsCount; + quint64 itemsOffset, itemsDataOffset; + quint32 currentItem; + quint32 contentTypesCount; + string currentItemData; + + QString readTinyText(); + QString readText(); + QString readLargeText(); + QString readString( unsigned lenght ); + +public: + SlobFile() : + compression( UNKNOWN ) + , codec( 0 ) + , blobCount( 0 ) + , storeOffset( 0 ) + , fileSize( 0 ) + , refsOffset( 0 ) + , refsCount( 0 ) + , itemsCount( 0 ) + , itemsOffset( 0 ) + , itemsDataOffset( 0 ) + , currentItem( 0xFFFFFFFF ) + , contentTypesCount( 0 ) + {} + + ~SlobFile(); + + Compressions getCompression() const + { return compression; } + + QString const & getEncoding() const + { return encoding; } + + QString const & getDictionaryName() const + { return dictionaryName; } + + quint32 blobsCount() const + { return blobCount; } + + quint64 dataOffset() const + { return storeOffset; } + + quint32 getRefsCount() const + { return refsCount; } + + quint32 getContentTypesCount() const + { return contentTypesCount; } + + QTextCodec * getCodec() const + { return codec; } + + QString getContentType( quint8 content_id ) const + { return content_id < contentTypes.size() ? contentTypes[ content_id ] : QString(); } + + QMap< QString, QString > const & getTags() const + { return tags; } + + void open( const QString & name ); + + void getRefEntry( quint32 ref_nom, RefEntry & entry ); + + quint8 getItem( RefEntry const & entry, string * data ); +}; + +SlobFile::~SlobFile() +{ + file.close(); +} + +QString SlobFile::readString( unsigned length ) +{ + QByteArray data = file.read( length ); + QString str; + + if( codec != 0 && !data.isEmpty() ) + str = codec->toUnicode( data ); + else + str = QString( data ); + + char term = 0; + int n = str.indexOf( term ); + if( n > 0 ) + str.resize( n ); + + return str; +} + +QString SlobFile::readTinyText() +{ + unsigned char len; + if( !file.getChar( ( char * )&len ) ) + { + QString error = fileName + ": " + file.errorString(); + throw exCantReadFile( string( error.toUtf8().data() ) ); + } + return readString( len ); +} + +QString SlobFile::readText() +{ + quint16 len; + if( file.read( ( char * )&len, sizeof( len ) ) != sizeof( len ) ) + { + QString error = fileName + ": " + file.errorString(); + throw exCantReadFile( string( error.toUtf8().data() ) ); + } + return readString( qFromBigEndian( len ) ); +} + +QString SlobFile::readLargeText() +{ + quint32 len; + if( file.read( ( char * )&len, sizeof( len ) ) != sizeof( len ) ) + { + QString error = fileName + ": " + file.errorString(); + throw exCantReadFile( string( error.toUtf8().data() ) ); + } + return readString( qFromBigEndian( len ) ); +} + +void SlobFile::open( const QString & name ) +{ +QString error( name + ": " ); + + if( file.isOpen() ) + file.close(); + + fileName = name; + + file.setFileName( name ); + + { + QFileInfo fi( name ); + dictionaryName = fi.fileName(); + } + + for( ; ; ) + { + + if( !file.open( QFile::ReadOnly ) ) + break; + + char magic[ 8 ]; + if( file.read( magic, sizeof( magic ) ) != sizeof( magic ) ) + break; + + if( memcmp( magic, SLOB_MAGIC, sizeof( magic ) ) != 0 ) + throw exNotSlobFile( string( name.toUtf8().data() ) ); + + if( file.read( ( char * )uuid, sizeof( uuid ) ) != sizeof( uuid ) ) + break; + + // Read encoding + + encoding = readTinyText(); + + codec = QTextCodec::codecForName( encoding.toLatin1() ); + if( codec == 0 ) + { + error = QString( "for encoding \"") + encoding + "\""; + throw exNoCodecFound( string( error.toUtf8().data() ) ); + } + + // Read compression type + + QString compr = readTinyText(); + + if( compr.compare( "zlib", Qt::CaseInsensitive ) == 0 ) + compression = ZLIB; + else + if( compr.compare( "bz2", Qt::CaseInsensitive ) == 0 ) + compression = BZ2; + else + if( compr.compare( "lzma2", Qt::CaseInsensitive ) == 0 ) + compression = LZMA2; + + // Read tags + + unsigned char count; + if( !file.getChar( ( char * )&count ) ) + break; + + for( unsigned i = 0; i < count; i++ ) + { + QString key = readTinyText(); + QString value = readTinyText(); + tags[ key ] = value; + + if( key.compare( "label", Qt::CaseInsensitive ) == 0 + || key.compare( "name", Qt::CaseInsensitive ) == 0) + dictionaryName = value; + } + + // Read content types + + if( !file.getChar( ( char * )&count ) ) + break; + + for( unsigned i = 0; i < count; i++ ) + { + QString type = readText(); + contentTypes.append( type ); + } + contentTypesCount = count; + + // Read data parameters + + quint32 cnt; + if( file.read( ( char * )&cnt, sizeof( cnt ) ) != sizeof( cnt ) ) + break; + blobCount = qFromBigEndian( cnt ); + + quint64 tmp; + if( file.read( ( char * )&tmp, sizeof( tmp ) ) != sizeof( tmp ) ) + break; + storeOffset = qFromBigEndian( tmp ); + + if( file.read( ( char * )&tmp, sizeof( tmp ) ) != sizeof( tmp ) ) + break; + fileSize = qFromBigEndian( tmp ); + + if( file.read( ( char * )&cnt, sizeof( cnt ) ) != sizeof( cnt ) ) + break; + refsCount = qFromBigEndian( cnt ); + + refsOffset = file.pos(); + + if( !file.seek( storeOffset ) ) + break; + + if( file.read( ( char * )&cnt, sizeof( cnt ) ) != sizeof( cnt ) ) + break; + itemsCount = qFromBigEndian( cnt ); + + itemsOffset = storeOffset + sizeof( itemsCount ); + itemsDataOffset = itemsOffset + itemsCount * sizeof( quint64 ); + + return; + } + error += file.errorString(); + throw exCantReadFile( string( error.toUtf8().data() ) ); +} + +void SlobFile::getRefEntry( quint32 ref_nom, RefEntry & entry ) +{ + quint64 pos = refsOffset + ref_nom * sizeof( quint64 ); + quint64 offset, tmp; + + for( ; ; ) + { + if( !file.seek( pos ) || file.read( ( char * )&tmp, sizeof( tmp ) ) != sizeof( tmp ) ) + break; + offset = qFromBigEndian( tmp ) + refsOffset + refsCount * sizeof( quint64 ); + + if( !file.seek( offset ) ) + break; + + entry.key = readText(); + + quint32 index; + if( file.read( ( char * )&index, sizeof( index ) ) != sizeof( index ) ) + break; + entry.itemIndex = qFromBigEndian( index ); + + quint16 binIndex; + if( file.read( ( char * )&binIndex, sizeof( binIndex ) ) != sizeof( binIndex ) ) + break; + entry.binIndex = qFromBigEndian( binIndex ); + + entry.fragment = readTinyText(); + + return; + } + QString error = fileName + ": " + file.errorString(); + throw exCantReadFile( string( error.toUtf8().data() ) ); +} + +quint8 SlobFile::getItem( RefEntry const & entry, string * data ) +{ + quint64 pos = itemsOffset + entry.itemIndex * sizeof( quint64 ); + quint64 offset, tmp; + + for( ; ; ) + { + // Read item data types + + if( !file.seek( pos ) || file.read( ( char * )&tmp, sizeof( tmp ) ) != sizeof( tmp ) ) + break; + + offset = qFromBigEndian( tmp ) + itemsDataOffset; + + if( !file.seek( offset ) ) + break; + + quint32 bins, bins_be; + if( file.read( ( char * )&bins_be, sizeof( bins_be ) ) != sizeof( bins_be ) ) + break; + bins = qFromBigEndian( bins_be ); + + if( entry.binIndex >= bins ) + return 0xFF; + + QVector< quint8 > ids; + ids.resize( bins ); + if( file.read( ( char * )ids.data(), bins ) != bins ) + break; + + quint8 id = ids[ entry.binIndex ]; + + if( id >= (unsigned)contentTypes.size() ) + return 0xFF; + + if( data != 0 ) + { + // Read item data + if( currentItem != entry.itemIndex ) + { + currentItemData.clear(); + quint32 length, length_be; + if( file.read( ( char * )&length_be, sizeof( length_be ) ) != sizeof( length_be ) ) + break; + length = qFromBigEndian( length_be ); + + QByteArray compressedData = file.read( length ); + + if( compression == ZLIB ) + currentItemData = decompressZlib( compressedData.data(), length ); + else + if( compression == ZLIB ) + currentItemData = decompressBzip2( compressedData.data(), length ); + else + currentItemData = decompressLzma2( compressedData.data(), length, true ); + + if( currentItemData.empty() ) + { + currentItem = 0xFFFFFFFF; + return 0xFF; + } + currentItem = entry.itemIndex; + } + + // Find bin data inside item + + const char * ptr = currentItemData.c_str(); + quint32 pos = entry.binIndex * sizeof( quint32 ); + + if( pos >= currentItemData.length() - sizeof( quint32 ) ) + return 0xFF; + + quint32 offset, offset_be; + memcpy( &offset_be, ptr + pos, sizeof( offset_be ) ); + offset = qFromBigEndian( offset_be ); + + pos = bins * sizeof( quint32 ) + offset; + + if( pos >= currentItemData.length() - sizeof( quint32 ) ) + return 0xFF; + + quint32 length, len_be; + memcpy( &len_be, ptr + pos, sizeof( len_be ) ); + length = qFromBigEndian( len_be ); + + *data = currentItemData.substr( pos + sizeof( len_be ), length ); + } + + return ids[ entry.binIndex ]; + } + QString error = fileName + ": " + file.errorString(); + throw exCantReadFile( string( error.toUtf8().data() ) ); +} + +// SlobDictionary + +class SlobDictionary: public BtreeIndexing::BtreeDictionary +{ + Mutex idxMutex; + Mutex slobMutex, idxResourceMutex; + File::Class idx; + BtreeIndex resourceIndex; + IdxHeader idxHeader; + string dictionaryName; + SlobFile sf; + QString texCgiPath, texCachePath; + + public: + + SlobDictionary( string const & id, string const & indexFile, + vector< string > const & dictionaryFiles ); + + ~SlobDictionary(); + + virtual string getName() throw() + { return dictionaryName; } + + virtual map< Dictionary::Property, string > getProperties() throw() + { return map< Dictionary::Property, string >(); } + + virtual unsigned long getArticleCount() throw() + { return idxHeader.articleCount; } + + virtual unsigned long getWordCount() throw() + { return idxHeader.wordCount; } + + inline virtual quint32 getLangFrom() const + { return idxHeader.langFrom; } + + inline virtual quint32 getLangTo() const + { return idxHeader.langTo; } + + virtual sptr< Dictionary::DataRequest > getArticle( wstring const &, + vector< wstring > const & alts, + wstring const & ) + throw( std::exception ); + + virtual sptr< Dictionary::DataRequest > getResource( string const & name ) + throw( std::exception ); + + virtual QString const& getDescription(); + + /// Loads the resource. + void loadResource( std::string &resourceName, string & data ); + + virtual sptr< Dictionary::DataRequest > getSearchResults( QString const & searchString, + int searchMode, bool matchCase, + int distanceBetweenWords, + int maxResults ); + virtual void getArticleText( uint32_t articleAddress, QString & headword, QString & text ); + + virtual void makeFTSIndex(QAtomicInt & isCancelled, bool firstIteration ); + + virtual void setFTSParameters( Config::FullTextSearch const & fts ) + { + can_FTS = fts.enabled + && !fts.disabledTypes.contains( "SLOB", Qt::CaseInsensitive ) + && ( fts.maxDictionarySize == 0 || getArticleCount() <= fts.maxDictionarySize ); + } + + virtual uint32_t getFtsIndexVersion() + { return 1; } + +protected: + + virtual void loadIcon() throw(); + +private: + + /// Loads the article. + void loadArticle( quint32 address, + string & articleText ); + + quint32 readArticle( quint32 address, + string & articleText, + RefEntry & entry ); + + string convert( string const & in_data, RefEntry const & entry ); + + void removeDirectory( QString const & directory ); + + friend class SlobArticleRequest; + friend class SlobResourceRequest; +}; + +SlobDictionary::SlobDictionary( string const & id, + string const & indexFile, + vector< string > const & dictionaryFiles ): + BtreeDictionary( id, dictionaryFiles ), + idx( indexFile, "rb" ), + idxHeader( idx.read< IdxHeader >() ) +{ + // Open data file + + try + { + sf.open( FsEncoding::decode( dictionaryFiles[ 0 ].c_str() ) ); + } + catch( std::exception & e ) + { + gdWarning( "Slob dictionary initializing failed: %s, error: %s\n", + dictionaryFiles[ 0 ].c_str(), e.what() ); + } + + // Initialize the indexes + + openIndex( IndexInfo( idxHeader.indexBtreeMaxElements, + idxHeader.indexRootOffset ), + idx, idxMutex ); + + resourceIndex.openIndex( IndexInfo( idxHeader.resourceIndexBtreeMaxElements, + idxHeader.resourceIndexRootOffset ), + idx, idxResourceMutex ); + + // Read dictionary name + + dictionaryName = string( sf.getDictionaryName().toUtf8().constData() ); + if( dictionaryName.empty() ) + { + QString name = QDir::fromNativeSeparators( FsEncoding::decode( dictionaryFiles[ 0 ].c_str() ) ); + int n = name.lastIndexOf( '/' ); + dictionaryName = string( name.mid( n + 1 ).toUtf8().constData() ); + } + + // Full-text search parameters + + can_FTS = true; + + ftsIdxName = indexFile + "_FTS"; + + if( !Dictionary::needToRebuildIndex( dictionaryFiles, ftsIdxName ) + && !FtsHelpers::ftsIndexIsOldOrBad( ftsIdxName, this ) ) + FTS_index_completed.ref(); + + texCgiPath = Config::getProgramDataDir() + "/mimetex.cgi"; + if( QFileInfo( texCgiPath ).exists() ) + { + QString dirName = QString::fromStdString( getId() ); + QDir( QDir::tempPath() ).mkdir( dirName ); + texCachePath = QDir::tempPath() + "/" + dirName; + } + else + texCgiPath.clear(); +} + +SlobDictionary::~SlobDictionary() +{ + if( !texCachePath.isEmpty() ) + removeDirectory( texCachePath ); +} + +void SlobDictionary::removeDirectory( QString const & directory ) +{ + QDir dir( directory ); + Q_FOREACH( QFileInfo info, dir.entryInfoList( QDir::NoDotAndDotDot + | QDir::AllDirs + | QDir::Files, + QDir::DirsFirst)) + { + if( info.isDir() ) + removeDirectory( info.absoluteFilePath() ); + else + QFile::remove( info.absoluteFilePath() ); + } + + dir.rmdir( directory ); +} + +void SlobDictionary::loadIcon() throw() +{ + if ( dictionaryIconLoaded ) + return; + + QString fileName = + QDir::fromNativeSeparators( FsEncoding::decode( getDictionaryFilenames()[ 0 ].c_str() ) ); + + // Remove the extension + fileName.chop( 4 ); + + if( !loadIconFromFile( fileName ) ) + { + // Load failed -- use default icons + dictionaryNativeIcon = dictionaryIcon = QIcon(":/icons/icon32_slob.png"); + } + + dictionaryIconLoaded = true; +} + +QString const& SlobDictionary::getDescription() +{ + if( !dictionaryDescription.isEmpty() ) + return dictionaryDescription; + + QMap< QString, QString > const & tags = sf.getTags(); + + QMap< QString, QString >::const_iterator it; + for( it = tags.begin(); it != tags.end(); ++it ) + { + if( it != tags.begin() ) + dictionaryDescription += "\n\n"; + + dictionaryDescription += it.key() + ": " +it.value(); + } + + return dictionaryDescription; +} + +void SlobDictionary::loadArticle( quint32 address, + string & articleText ) +{ + articleText.clear(); + + RefEntry entry; + + readArticle( address, articleText, entry ); + + if( !articleText.empty() ) + { + articleText = convert( articleText, entry ); + } + else + articleText = string( QObject::tr( "Article decoding error" ).toUtf8().constData() ); + + // See Issue #271: A mechanism to clean-up invalid HTML cards. + string cleaner = """""""""""" + """""""""""" + "" + "" + ""; + + string prefix( "
"; +} + +string SlobDictionary::convert( const string & in, RefEntry const & entry ) +{ + QString text = QString::fromUtf8( in.c_str() ); + + // pattern of img and script + text.replace( QRegExp( "<\\s*(img|script)\\s*([^>]*)src=\"(|/)([^\"]*)\"" ), + QString( "<\\1 \\2src=\"bres://%1/\\4\"").arg( getId().c_str() ) ); + + // pattern + text.replace( QRegExp( "<\\s*link\\s*([^>]*)href=\"" ), + QString( ", excluding any known protocols such as http://, mailto:, #(comment) + // these links will be translated into local definitions + QRegExp rxLink( "<\\s*a\\s+([^>]*)href=\"(?!(\\w+://|#|mailto:|tel:))(/|)([^\"]*)\"\\s*(title=\"[^\"]*\")?[^>]*>", + Qt::CaseSensitive, + QRegExp::RegExp2 ); + int pos = 0; + while( (pos = rxLink.indexIn( text, pos )) >= 0 ) + { + QStringList list = rxLink.capturedTexts(); + QString tag = list[3]; + if ( !list[4].isEmpty() ) + tag = list[4].split("\"")[1]; + + tag.remove( QRegExp(".*/") ). + remove( QRegExp( "\\.(s|)htm(l|)$", Qt::CaseInsensitive ) ). + replace( "_", "%20" ). + prepend( "" ); + + text.replace( pos, list[0].length(), tag ); + pos += tag.length() + 1; + } + + // Handle TeX formulas via mimetex.cgi + + if( !texCgiPath.isEmpty() ) + { + QRegExp texImage( "<\\s*img\\s*class=\"([^\"]+)\"\\s*alt=\"([^\"]+)\"[^>]*>", + Qt::CaseSensitive, + QRegExp::RegExp2 ); + pos = 0; + unsigned texCount = 0; + QString imgName; + + QRegExp regFrac = QRegExp( "\\\\[dt]frac" ); + + while( (pos = texImage.indexIn( text, pos )) >= 0 ) + { + QStringList list = texImage.capturedTexts(); + + if( list[ 1 ].compare( "tex" ) == 0 + || list[ 1 ].endsWith( " tex" ) ) + { + QString name; + name.sprintf( "%04X%04X%04X.gif", entry.itemIndex, entry.binIndex, texCount ); + imgName = texCachePath + "/" + name; + + if( !QFileInfo( imgName ).exists() ) + { + QString tex = list[ 2 ]; + tex.replace( regFrac, "\\frac" ); + + QString command = texCgiPath + " -e " + imgName + + " \"" + tex + "\""; + QProcess::execute( command ); + } + + QString tag = QString( "\"""; + + text.replace( pos, list[0].length(), tag ); + pos += tag.length() + 1; + + texCount += 1; + } + else + pos += list[ 0 ].length(); + } + } + + // Fix outstanding elements + text += "
"; + + return text.toUtf8().data(); +} + +void SlobDictionary::loadResource( std::string & resourceName, string & data ) +{ + vector< WordArticleLink > link; + string resData; + RefEntry entry; + + link = resourceIndex.findArticles( Utf8::decode( resourceName ) ); + + if( link.empty() ) + return; + + readArticle( link[ 0 ].articleOffset, data, entry ); +} + +quint32 SlobDictionary::readArticle( quint32 articleNumber, std::string & result, + RefEntry & entry ) +{ + string data; + quint8 contentId; + + { + Mutex::Lock _( slobMutex ); + if( entry.key.isEmpty() ) + sf.getRefEntry( articleNumber, entry ); + contentId = sf.getItem( entry, &data ); + } + + if( contentId == 0xFF ) + return 0xFFFFFFFF; + + QString contentType = sf.getContentType( contentId ); + + if( contentType.contains( "text/html", Qt::CaseInsensitive ) + || contentType.contains( "text/plain", Qt::CaseInsensitive ) + || contentType.contains( "/css", Qt::CaseInsensitive ) + || contentType.contains( "/javascript", Qt::CaseInsensitive ) + || contentType.contains( "/json", Qt::CaseInsensitive )) + { + QTextCodec *codec = sf.getCodec(); + QString content = codec->toUnicode( data.c_str(), data.size() ); + result = string( content.toUtf8().data() ); + } + else + result = data; + + return contentId; +} + +void SlobDictionary::makeFTSIndex( QAtomicInt & isCancelled, bool firstIteration ) +{ + if( !( Dictionary::needToRebuildIndex( getDictionaryFilenames(), ftsIdxName ) + || FtsHelpers::ftsIndexIsOldOrBad( ftsIdxName, this ) ) ) + FTS_index_completed.ref(); + + if( haveFTSIndex() ) + return; + + if( ensureInitDone().size() ) + return; + + if( firstIteration && getArticleCount() > FTS::MaxDictionarySizeForFastSearch ) + return; + + gdDebug( "Slob: Building the full-text index for dictionary: %s\n", + getName().c_str() ); + + try + { + Mutex::Lock _( getFtsMutex() ); + + File::Class ftsIdx( ftsIndexName(), "wb" ); + + FtsHelpers::FtsIdxHeader ftsIdxHeader; + memset( &ftsIdxHeader, 0, sizeof( ftsIdxHeader ) ); + + // We write a dummy header first. At the end of the process the header + // will be rewritten with the right values. + + ftsIdx.write( ftsIdxHeader ); + + ChunkedStorage::Writer chunks( ftsIdx ); + + BtreeIndexing::IndexedWords indexedWords; + + QSet< uint32_t > setOfOffsets; + + findArticleLinks( 0, &setOfOffsets, 0, &isCancelled ); + + if( isCancelled ) + throw exUserAbort(); + + QVector< uint32_t > offsets; + offsets.resize( setOfOffsets.size() ); + uint32_t * ptr = &offsets.front(); + + for( QSet< uint32_t >::ConstIterator it = setOfOffsets.constBegin(); + it != setOfOffsets.constEnd(); ++it ) + { + *ptr = *it; + ptr++; + } + + // Free memory + setOfOffsets.clear(); + + if( isCancelled ) + throw exUserAbort(); + + qSort( offsets ); + + if( isCancelled ) + throw exUserAbort(); + + QMap< QString, QVector< uint32_t > > ftsWords; + + set< quint64 > indexedArticles; + RefEntry entry; + string articleText; + quint32 htmlType = 0xFFFFFFFF; + + for( unsigned i = 0; i < sf.getContentTypesCount(); i++ ) + { + if( sf.getContentType( i ).startsWith( "text/html", Qt::CaseInsensitive ) ) + { + htmlType = i; + break; + } + } + + // index articles for full-text search + for( int i = 0; i < offsets.size(); i++ ) + { + if( isCancelled ) + throw exUserAbort(); + + QString articleStr; + quint32 articleNom = offsets.at( i ); + + sf.getRefEntry( articleNom, entry ); + + quint64 articleID = ( ( (quint64)entry.itemIndex ) << 32 ) | entry.binIndex; + + set< quint64 >::iterator it = indexedArticles.find( articleID ); + if( it != indexedArticles.end() ) + continue; + + indexedArticles.insert( articleID ); + + quint32 type = readArticle( 0, articleText, entry ); + + articleStr = QString::fromUtf8( articleText.c_str(), articleText.length() ); + + if( type == htmlType ) + articleStr = Html::unescape( articleStr ); + + FtsHelpers::parseArticleForFts( articleNom, articleStr, ftsWords ); + } + + // Free memory + offsets.clear(); + + QMap< QString, QVector< uint32_t > >::iterator it = ftsWords.begin(); + while( it != ftsWords.end() ) + { + if( isCancelled ) + throw exUserAbort(); + + uint32_t offset = chunks.startNewBlock(); + uint32_t size = it.value().size(); + + chunks.addToBlock( &size, sizeof(uint32_t) ); + chunks.addToBlock( it.value().data(), size * sizeof(uint32_t) ); + + indexedWords.addSingleWord( gd::toWString( it.key() ), offset ); + + it = ftsWords.erase( it ); + } + + // Free memory + ftsWords.clear(); + + if( isCancelled ) + throw exUserAbort(); + + ftsIdxHeader.chunksOffset = chunks.finish(); + ftsIdxHeader.wordCount = indexedWords.size(); + + if( isCancelled ) + throw exUserAbort(); + + BtreeIndexing::IndexInfo ftsIdxInfo = BtreeIndexing::buildIndex( indexedWords, ftsIdx ); + + // Free memory + indexedWords.clear(); + + ftsIdxHeader.indexBtreeMaxElements = ftsIdxInfo.btreeMaxElements; + ftsIdxHeader.indexRootOffset = ftsIdxInfo.rootOffset; + + ftsIdxHeader.signature = FtsHelpers::FtsSignature; + ftsIdxHeader.formatVersion = FtsHelpers::CurrentFtsFormatVersion + getFtsIndexVersion(); + + ftsIdx.rewind(); + ftsIdx.writeRecords( &ftsIdxHeader, sizeof(ftsIdxHeader), 1 ); + + FTS_index_completed.ref(); + } + catch( std::exception &ex ) + { + gdWarning( "Slob: Failed building full-text search index for \"%s\", reason: %s\n", getName().c_str(), ex.what() ); + QFile::remove( FsEncoding::decode( ftsIdxName.c_str() ) ); + } +} + +void SlobDictionary::getArticleText( uint32_t articleAddress, QString & headword, QString & text ) +{ + try + { + RefEntry entry; + string articleText; + + quint32 htmlType = 0xFFFFFFFF; + + for( unsigned i = 0; i < sf.getContentTypesCount(); i++ ) + { + if( sf.getContentType( i ).startsWith( "text/html", Qt::CaseInsensitive ) ) + { + htmlType = i; + break; + } + } + + quint32 type = readArticle( articleAddress, articleText, entry ); + headword = entry.key; + + text = QString::fromUtf8( articleText.data(), articleText.size() ); + + if( type == htmlType ) + text = Html::unescape( text ); + } + catch( std::exception &ex ) + { + gdWarning( "Slob: Failed retrieving article from \"%s\", reason: %s\n", getName().c_str(), ex.what() ); + } +} + + +sptr< Dictionary::DataRequest > SlobDictionary::getSearchResults( QString const & searchString, + int searchMode, bool matchCase, + int distanceBetweenWords, + int maxResults ) +{ + return new FtsHelpers::FTSResultsRequest( *this, searchString, searchMode, matchCase, distanceBetweenWords, maxResults ); +} + + +/// SlobDictionary::getArticle() + +class SlobArticleRequest; + +class SlobArticleRequestRunnable: public QRunnable +{ + SlobArticleRequest & r; + QSemaphore & hasExited; + +public: + + SlobArticleRequestRunnable( SlobArticleRequest & r_, + QSemaphore & hasExited_ ): r( r_ ), + hasExited( hasExited_ ) + {} + + ~SlobArticleRequestRunnable() + { + hasExited.release(); + } + + virtual void run(); +}; + +class SlobArticleRequest: public Dictionary::DataRequest +{ + friend class SlobArticleRequestRunnable; + + wstring word; + vector< wstring > alts; + SlobDictionary & dict; + + QAtomicInt isCancelled; + QSemaphore hasExited; + +public: + + SlobArticleRequest( wstring const & word_, + vector< wstring > const & alts_, + SlobDictionary & dict_ ): + word( word_ ), alts( alts_ ), dict( dict_ ) + { + QThreadPool::globalInstance()->start( + new SlobArticleRequestRunnable( *this, hasExited ) ); + } + + void run(); // Run from another thread by DslArticleRequestRunnable + + virtual void cancel() + { + isCancelled.ref(); + } + + ~SlobArticleRequest() + { + isCancelled.ref(); + hasExited.acquire(); + } +}; + +void SlobArticleRequestRunnable::run() +{ + r.run(); +} + +void SlobArticleRequest::run() +{ + if ( isCancelled ) + { + finish(); + return; + } + + vector< WordArticleLink > chain = dict.findArticles( word ); + + for( unsigned x = 0; x < alts.size(); ++x ) + { + /// Make an additional query for each alt + + vector< WordArticleLink > altChain = dict.findArticles( alts[ x ] ); + + chain.insert( chain.end(), altChain.begin(), altChain.end() ); + } + + multimap< wstring, pair< string, string > > mainArticles, alternateArticles; + + set< quint32 > articlesIncluded; // Some synonims make it that the articles + // appear several times. We combat this + // by only allowing them to appear once. + + wstring wordCaseFolded = Folding::applySimpleCaseOnly( word ); + + for( unsigned x = 0; x < chain.size(); ++x ) + { + if ( isCancelled ) + { + finish(); + return; + } + + if ( articlesIncluded.find( chain[ x ].articleOffset ) != articlesIncluded.end() ) + continue; // We already have this article in the body. + + // Now grab that article + + string headword, articleText; + + headword = chain[ x ].word; + try + { + dict.loadArticle( chain[ x ].articleOffset, articleText ); + } + catch(...) + { + } + + // Ok. Now, does it go to main articles, or to alternate ones? We list + // main ones first, and alternates after. + + // We do the case-folded comparison here. + + wstring headwordStripped = + Folding::applySimpleCaseOnly( Utf8::decode( headword ) ); + + multimap< wstring, pair< string, string > > & mapToUse = + ( wordCaseFolded == headwordStripped ) ? + mainArticles : alternateArticles; + + mapToUse.insert( pair< wstring, pair< string, string > >( + Folding::applySimpleCaseOnly( Utf8::decode( headword ) ), + pair< string, string >( headword, articleText ) ) ); + + articlesIncluded.insert( chain[ x ].articleOffset ); + } + + if ( mainArticles.empty() && alternateArticles.empty() ) + { + // No such word + finish(); + return; + } + + string result; + + multimap< wstring, pair< string, string > >::const_iterator i; + + for( i = mainArticles.begin(); i != mainArticles.end(); ++i ) + { + result += "

"; + result += i->second.first; + result += "

"; + result += i->second.second; + } + + for( i = alternateArticles.begin(); i != alternateArticles.end(); ++i ) + { + result += "

"; + result += i->second.first; + result += "

"; + result += i->second.second; + } + + Mutex::Lock _( dataMutex ); + + data.resize( result.size() ); + + memcpy( &data.front(), result.data(), result.size() ); + + hasAnyData = true; + + finish(); +} + +sptr< Dictionary::DataRequest > SlobDictionary::getArticle( wstring const & word, + vector< wstring > const & alts, + wstring const & ) + throw( std::exception ) +{ + return new SlobArticleRequest( word, alts, *this ); +} + +//// SlobDictionary::getResource() + +class SlobResourceRequest; + +class SlobResourceRequestRunnable: public QRunnable +{ + SlobResourceRequest & r; + QSemaphore & hasExited; + +public: + + SlobResourceRequestRunnable( SlobResourceRequest & r_, + QSemaphore & hasExited_ ): r( r_ ), + hasExited( hasExited_ ) + {} + + ~SlobResourceRequestRunnable() + { + hasExited.release(); + } + + virtual void run(); +}; + +class SlobResourceRequest: public Dictionary::DataRequest +{ + friend class SlobResourceRequestRunnable; + + SlobDictionary & dict; + + string resourceName; + + QAtomicInt isCancelled; + QSemaphore hasExited; + +public: + + SlobResourceRequest( SlobDictionary & dict_, + string const & resourceName_ ): + dict( dict_ ), + resourceName( resourceName_ ) + { + QThreadPool::globalInstance()->start( + new SlobResourceRequestRunnable( *this, hasExited ) ); + } + + void run(); // Run from another thread by ZimResourceRequestRunnable + + virtual void cancel() + { + isCancelled.ref(); + } + + ~SlobResourceRequest() + { + isCancelled.ref(); + hasExited.acquire(); + } +}; + +void SlobResourceRequestRunnable::run() +{ + r.run(); +} + +void SlobResourceRequest::run() +{ + // Some runnables linger enough that they are cancelled before they start + if ( isCancelled ) + { + finish(); + return; + } + + try + { + string resource; + dict.loadResource( resourceName, resource ); + if( resource.empty() ) + throw exNoResource(); + + if( Filetype::isNameOfCSS( resourceName ) ) + { + QString css = QString::fromUtf8( resource.data(), resource.size() ); + dict.isolateCSS( css, ".slobdict" ); + QByteArray bytes = css.toUtf8(); + data.resize( bytes.size() ); + memcpy( &data.front(), bytes.constData(), bytes.size() ); + } + else + if ( Filetype::isNameOfTiff( resourceName ) ) + { + // Convert it + + dataMutex.lock(); + + QImage img = QImage::fromData( reinterpret_cast< const uchar * >( resource.data() ), resource.size() ); + +#ifdef MAKE_EXTRA_TIFF_HANDLER + if( img.isNull() ) + GdTiff::tiffToQImage( &data.front(), data.size(), img ); +#endif + + dataMutex.unlock(); + + if ( !img.isNull() ) + { + // Managed to load -- now store it back as BMP + + QByteArray ba; + QBuffer buffer( &ba ); + buffer.open( QIODevice::WriteOnly ); + img.save( &buffer, "BMP" ); + + Mutex::Lock _( dataMutex ); + + data.resize( buffer.size() ); + + memcpy( &data.front(), buffer.data(), data.size() ); + } + } + else + { + Mutex::Lock _( dataMutex ); + data.resize( resource.size() ); + memcpy( &data.front(), resource.data(), data.size() ); + } + + hasAnyData = true; + } + catch( std::exception &ex ) + { + gdWarning( "SLOB: Failed loading resource \"%s\" from \"%s\", reason: %s\n", + resourceName.c_str(), dict.getName().c_str(), ex.what() ); + // Resource not loaded -- we don't set the hasAnyData flag then + } + + finish(); +} + +sptr< Dictionary::DataRequest > SlobDictionary::getResource( string const & name ) + throw( std::exception ) +{ + return new SlobResourceRequest( *this, name ); +} + + +vector< sptr< Dictionary::Class > > makeDictionaries( + vector< string > const & fileNames, + string const & indicesDir, + Dictionary::Initializing & initializing ) + throw( std::exception ) +{ + vector< sptr< Dictionary::Class > > dictionaries; + + for( vector< string >::const_iterator i = fileNames.begin(); i != fileNames.end(); + ++i ) + { + // Skip files with the extensions different to .slob to speed up the + // scanning + + QString firstName = QDir::fromNativeSeparators( FsEncoding::decode( i->c_str() ) ); + if( !firstName.endsWith( ".slob") ) + continue; + + // Got the file -- check if we need to rebuid the index + + vector< string > dictFiles( 1, *i ); + + string dictId = Dictionary::makeDictionaryId( dictFiles ); + + string indexFile = indicesDir + dictId; + + try + { + if ( Dictionary::needToRebuildIndex( dictFiles, indexFile ) || + indexIsOldOrBad( indexFile ) ) + { + SlobFile sf; + + gdDebug( "Slob: Building the index for dictionary: %s\n", i->c_str() ); + + sf.open( firstName ); + + initializing.indexingDictionary( sf.getDictionaryName().toUtf8().constData() ); + + File::Class idx( indexFile, "wb" ); + IdxHeader idxHeader; + memset( &idxHeader, 0, sizeof( idxHeader ) ); + + // We write a dummy header first. At the end of the process the header + // will be rewritten with the right values. + + idx.write( idxHeader ); + + RefEntry refEntry; + quint32 entries = sf.getRefsCount(); + + IndexedWords indexedWords, indexedResources; + + set< quint64 > articlesPos; + quint32 articleCount = 0, wordCount = 0; + + for( quint32 i = 0; i < entries; i++ ) + { + sf.getRefEntry( i, refEntry ); + + quint8 type = sf.getItem( refEntry, 0 ); + + QString contentType = sf.getContentType( type ); + + if( contentType.startsWith( "text/html", Qt::CaseInsensitive ) + || contentType.startsWith( "text/plain", Qt::CaseInsensitive ) ) + { + //Article + indexedWords.addWord( gd::toWString( refEntry.key ), i ); + + wordCount += 1; + + quint64 pos = ( ( (quint64)refEntry.itemIndex ) << 32 ) + refEntry.binIndex; + if( articlesPos.find( pos ) == articlesPos.end() ) + { + articleCount += 1; + articlesPos.insert( pos ); + } + } + else + { + indexedResources.addSingleWord( gd::toWString( refEntry.key ), i ); + } + } + + // Build index + + { + IndexInfo idxInfo = BtreeIndexing::buildIndex( indexedWords, idx ); + + idxHeader.indexBtreeMaxElements = idxInfo.btreeMaxElements; + idxHeader.indexRootOffset = idxInfo.rootOffset; + + indexedWords.clear(); // Release memory -- no need for this data + } + + { + IndexInfo idxInfo = BtreeIndexing::buildIndex( indexedResources, idx ); + + idxHeader.resourceIndexBtreeMaxElements = idxInfo.btreeMaxElements; + idxHeader.resourceIndexRootOffset = idxInfo.rootOffset; + + indexedResources.clear(); // Release memory -- no need for this data + } + + idxHeader.signature = Signature; + idxHeader.formatVersion = CurrentFormatVersion; + + idxHeader.articleCount = articleCount; + idxHeader.wordCount = wordCount; + + QPair langs = + LangCoder::findIdsForFilename( QString::fromStdString( dictFiles[ 0 ] ) ); + + idxHeader.langFrom = langs.first; + idxHeader.langTo = langs.second; + + idx.rewind(); + + idx.write( &idxHeader, sizeof( idxHeader ) ); + + } + dictionaries.push_back( new SlobDictionary( dictId, + indexFile, + dictFiles ) ); + } + catch( std::exception & e ) + { + gdWarning( "Slob dictionary initializing failed: %s, error: %s\n", + i->c_str(), e.what() ); + continue; + } + catch( ... ) + { + qWarning( "Slob dictionary initializing failed\n" ); + continue; + } + } + return dictionaries; +} + +} // namespace Slob + +#endif diff -Nru goldendict-1.5.0~git20131003/slob.hh goldendict-1.5.0~git20150923/slob.hh --- goldendict-1.5.0~git20131003/slob.hh 1970-01-01 00:00:00.000000000 +0000 +++ goldendict-1.5.0~git20150923/slob.hh 2015-09-23 08:26:24.000000000 +0000 @@ -0,0 +1,24 @@ +#ifndef __SLOB_HH_INCLUDED__ +#define __SLOB_HH_INCLUDED__ + +#ifdef MAKE_ZIM_SUPPORT + +#include "dictionary.hh" + +/// Support for the Slob dictionaries. +namespace Slob { + +using std::vector; +using std::string; + +vector< sptr< Dictionary::Class > > makeDictionaries( + vector< string > const & fileNames, + string const & indicesDir, + Dictionary::Initializing & ) + throw( std::exception ); + +} + +#endif + +#endif // __SLOB_HH_INCLUDED__ diff -Nru goldendict-1.5.0~git20131003/sounddir.cc goldendict-1.5.0~git20150923/sounddir.cc --- goldendict-1.5.0~git20131003/sounddir.cc 2013-10-02 20:42:04.000000000 +0000 +++ goldendict-1.5.0~git20150923/sounddir.cc 2015-09-23 08:26:24.000000000 +0000 @@ -177,9 +177,39 @@ multimap< wstring, uint32_t >::const_iterator i; + string displayedName; + vector< char > chunk; + char * nameBlock; + result += ""; for( i = mainArticles.begin(); i != mainArticles.end(); ++i ) { + if( mainArticles.size() + alternateArticles.size() <= 1 ) + displayedName = chain[ i->second ].word; + else + { + try + { + Mutex::Lock _( idxMutex ); + nameBlock = chunks.getBlock( chain[ i->second ].articleOffset, chunk ); + + if ( nameBlock >= &chunk.front() + chunk.size() ) + { + // chunks reader thinks it's okay since zero-sized records can exist, + // but we don't allow that. + throw ChunkedStorage::exAddressOutOfRange(); + } + + chunk.back() = 0; // It must end with 0 anyway, but just in case + displayedName = string( nameBlock ); + } + catch( ChunkedStorage::exAddressOutOfRange & ) + { + // Bad address + continue; + } + } + result += ""; QUrl url; @@ -192,12 +222,38 @@ result += addAudioLink( ref, getId() ); result += ""; - result += ""; + result += ""; result += ""; } for( i = alternateArticles.begin(); i != alternateArticles.end(); ++i ) { + if( mainArticles.size() + alternateArticles.size() <= 1 ) + displayedName = chain[ i->second ].word; + else + { + try + { + Mutex::Lock _( idxMutex ); + nameBlock = chunks.getBlock( chain[ i->second ].articleOffset, chunk ); + + if ( nameBlock >= &chunk.front() + chunk.size() ) + { + // chunks reader thinks it's okay since zero-sized records can exist, + // but we don't allow that. + throw ChunkedStorage::exAddressOutOfRange(); + } + + chunk.back() = 0; // It must end with 0 anyway, but just in case + displayedName = string( nameBlock ); + } + catch( ChunkedStorage::exAddressOutOfRange & ) + { + // Bad address + continue; + } + } + result += ""; QUrl url; @@ -210,7 +266,7 @@ result += addAudioLink( ref, getId() ); result += ""; - result += ""; + result += ""; result += ""; } @@ -358,7 +414,7 @@ continue; // No such dir, no dictionary then vector< string > dictFiles( 1, - QDir::toNativeSeparators( dir.canonicalPath() ).toLocal8Bit().data() ); + FsEncoding::encode( QDir::toNativeSeparators( dir.canonicalPath() ) ) ); dictFiles.push_back( "SoundDir" ); // A mixin diff -Nru goldendict-1.5.0~git20131003/sources.cc goldendict-1.5.0~git20150923/sources.cc --- goldendict-1.5.0~git20131003/sources.cc 2013-08-16 09:41:47.000000000 +0000 +++ goldendict-1.5.0~git20150923/sources.cc 2015-09-23 08:26:24.000000000 +0000 @@ -5,18 +5,19 @@ #include #include #include -#include "dprintf.hh" +#include "gddebug.hh" Sources::Sources( QWidget * parent, Config::Class const & cfg): QWidget( parent ), -#if defined( Q_OS_WIN32 ) || defined( Q_OS_MACX ) +#if defined( Q_OS_WIN32 ) || defined( Q_OS_MAC ) textToSpeechSource( NULL ), #endif itemDelegate( new QItemDelegate( this ) ), itemEditorFactory( new QItemEditorFactory() ), mediawikisModel( this, cfg.mediawikis ), webSitesModel( this, cfg.webSites ), + dictServersModel( this, cfg.dictServers ), programsModel( this, cfg.programs ), pathsModel( this, cfg.paths ), soundDirsModel( this, cfg.soundDirs ), @@ -51,6 +52,15 @@ ui.webSites->resizeColumnToContents( 2 ); ui.webSites->resizeColumnToContents( 3 ); + ui.dictServers->setTabKeyNavigation( true ); + ui.dictServers->setModel( &dictServersModel ); + ui.dictServers->resizeColumnToContents( 0 ); + ui.dictServers->resizeColumnToContents( 1 ); + ui.dictServers->resizeColumnToContents( 2 ); + ui.dictServers->resizeColumnToContents( 3 ); + ui.dictServers->resizeColumnToContents( 4 ); + ui.dictServers->resizeColumnToContents( 5 ); + ui.programs->setTabKeyNavigation( true ); ui.programs->setModel( &programsModel ); ui.programs->resizeColumnToContents( 0 ); @@ -95,9 +105,9 @@ ui.forvoLanguageCodes->setText( forvo.languageCodes ); // Text to speech -#if defined( Q_OS_WIN32 ) || defined( Q_OS_MACX ) +#if defined( Q_OS_WIN32 ) || defined( Q_OS_MAC ) textToSpeechSource = new TextToSpeechSource( this, cfg.voiceEngines ); - ui.tabWidget->addTab( textToSpeechSource, tr( "Text to Speech" ) ); + ui.tabWidget->addTab( textToSpeechSource, QIcon(":/icons/playsound_color.png"), tr( "Text to Speech" ) ); #endif if ( Config::isPortableVersion() ) @@ -262,6 +272,30 @@ webSitesModel.removeSite( current.row() ); } +void Sources::on_addDictServer_clicked() +{ + dictServersModel.addNewServer(); + + QModelIndex result = + dictServersModel.index( dictServersModel.rowCount( QModelIndex() ) - 1, + 1, QModelIndex() ); + + ui.dictServers->scrollTo( result ); + ui.dictServers->edit( result ); +} + +void Sources::on_removeDictServer_clicked() +{ + QModelIndex current = ui.dictServers->currentIndex(); + + if ( current.isValid() && + QMessageBox::question( this, tr( "Confirm removal" ), + tr( "Remove site %1 from the list?" ).arg( dictServersModel.getCurrentDictServers()[ current.row() ].name ), + QMessageBox::Ok, + QMessageBox::Cancel ) == QMessageBox::Ok ) + dictServersModel.removeServer( current.row() ); +} + void Sources::on_addProgram_clicked() { programsModel.addNewProgram(); @@ -288,7 +322,7 @@ Config::VoiceEngines Sources::getVoiceEngines() const { -#if defined( Q_OS_WIN32 ) || defined( Q_OS_MACX ) +#if defined( Q_OS_WIN32 ) || defined( Q_OS_MAC ) if ( !textToSpeechSource ) return Config::VoiceEngines(); return textToSpeechSource->getVoiceEnginesModel().getCurrentVoiceEngines(); @@ -649,6 +683,181 @@ return false; } +////////// DictServersModel + +DictServersModel::DictServersModel( QWidget * parent, + Config::DictServers const & dictServers_ ): + QAbstractItemModel( parent ), dictServers( dictServers_ ) +{ +} +void DictServersModel::removeServer( int index ) +{ + beginRemoveRows( QModelIndex(), index, index ); + dictServers.erase( dictServers.begin() + index ); + endRemoveRows(); +} + +void DictServersModel::addNewServer() +{ + Config::DictServer d; + + d.enabled = false; + + d.id = Dictionary::generateRandomDictionaryId(); + + d.url = "dict://"; + + beginInsertRows( QModelIndex(), dictServers.size(), dictServers.size() ); + dictServers.push_back( d ); + endInsertRows(); +} + +QModelIndex DictServersModel::index( int row, int column, QModelIndex const & /*parent*/ ) const +{ + return createIndex( row, column, 0 ); +} + +QModelIndex DictServersModel::parent( QModelIndex const & /*parent*/ ) const +{ + return QModelIndex(); +} + +Qt::ItemFlags DictServersModel::flags( QModelIndex const & index ) const +{ + Qt::ItemFlags result = QAbstractItemModel::flags( index ); + + if ( index.isValid() ) + { + if ( !index.column() ) + result |= Qt::ItemIsUserCheckable; + else + result |= Qt::ItemIsEditable; + } + + return result; +} + +int DictServersModel::rowCount( QModelIndex const & parent ) const +{ + if ( parent.isValid() ) + return 0; + else + return dictServers.size(); +} + +int DictServersModel::columnCount( QModelIndex const & parent ) const +{ + if ( parent.isValid() ) + return 0; + else + return 6; +} + +QVariant DictServersModel::headerData( int section, Qt::Orientation /*orientation*/, int role ) const +{ + if ( role == Qt::DisplayRole ) + switch( section ) + { + case 0: + return tr( "Enabled" ); + case 1: + return tr( "Name" ); + case 2: + return tr( "Address" ); + case 3: + return tr( "Databases" ); + case 4: + return tr( "Strategies" ); + case 5: + return tr( "Icon" ); + default: + return QVariant(); + } + + return QVariant(); +} + +QVariant DictServersModel::data( QModelIndex const & index, int role ) const +{ + if ( index.row() >= dictServers.size() ) + return QVariant(); + + if ( role == Qt::DisplayRole || role == Qt::EditRole ) + { + switch( index.column() ) + { + case 1: + return dictServers[ index.row() ].name; + case 2: + return dictServers[ index.row() ].url; + case 3: + return dictServers[ index.row() ].databases; + case 4: + return dictServers[ index.row() ].strategies; + case 5: + return dictServers[ index.row() ].iconFilename; + default: + return QVariant(); + } + } + + if( role == Qt::ToolTipRole && index.column() == 3 ) + return tr( "Comma-delimited list of databases\n(empty string or \"*\" matches all databases)" ); + + if( role == Qt::ToolTipRole && index.column() == 4 ) + return tr( "Comma-delimited list of search strategies\n(empty string mean \"prefix\" strategy)" ); + + if ( role == Qt::CheckStateRole && !index.column() ) + return dictServers[ index.row() ].enabled ? Qt::Checked : Qt::Unchecked; + + return QVariant(); +} + +bool DictServersModel::setData( QModelIndex const & index, const QVariant & value, + int role ) +{ + if ( index.row() >= dictServers.size() ) + return false; + + if ( role == Qt::CheckStateRole && !index.column() ) + { + // XXX it seems to be always passing Int( 2 ) as a value, so we just toggle + dictServers[ index.row() ].enabled = !dictServers[ index.row() ].enabled; + + dataChanged( index, index ); + return true; + } + + if ( role == Qt::DisplayRole || role == Qt::EditRole ) + switch( index.column() ) + { + case 1: + dictServers[ index.row() ].name = value.toString(); + dataChanged( index, index ); + return true; + case 2: + dictServers[ index.row() ].url = value.toString(); + dataChanged( index, index ); + return true; + case 3: + dictServers[ index.row() ].databases = value.toString(); + dataChanged( index, index ); + return true; + case 4: + dictServers[ index.row() ].strategies = value.toString(); + dataChanged( index, index ); + return true; + case 5: + dictServers[ index.row() ].iconFilename = value.toString(); + dataChanged( index, index ); + return true; + default: + return false; + } + + return false; +} + ////////// ProgramsModel @@ -1194,4 +1403,3 @@ { emit rescan(); } - diff -Nru goldendict-1.5.0~git20131003/sources.hh goldendict-1.5.0~git20150923/sources.hh --- goldendict-1.5.0~git20131003/sources.hh 2013-08-16 09:41:47.000000000 +0000 +++ goldendict-1.5.0~git20150923/sources.hh 2015-09-23 08:26:24.000000000 +0000 @@ -12,7 +12,7 @@ #include #include -#if defined( Q_OS_WIN32 ) || defined( Q_OS_MACX ) +#if defined( Q_OS_WIN32 ) || defined( Q_OS_MAC ) #include "texttospeechsource.hh" #endif @@ -76,6 +76,36 @@ Config::WebSites webSites; }; +/// A model to be projected into the dictServers view, according to Qt's MVC model +class DictServersModel: public QAbstractItemModel +{ + Q_OBJECT + +public: + + DictServersModel( QWidget * parent, Config::DictServers const & ); + + void removeServer( int index ); + void addNewServer(); + + /// Returns the sites the model currently has listed + Config::DictServers const & getCurrentDictServers() const + { return dictServers; } + + QModelIndex index( int row, int column, QModelIndex const & parent ) const; + QModelIndex parent( QModelIndex const & parent ) const; + Qt::ItemFlags flags( QModelIndex const & index ) const; + int rowCount( QModelIndex const & parent ) const; + int columnCount( QModelIndex const & parent ) const; + QVariant headerData( int section, Qt::Orientation orientation, int role ) const; + QVariant data( QModelIndex const & index, int role ) const; + bool setData( QModelIndex const & index, const QVariant & value, int role ); + +private: + + Config::DictServers dictServers; +}; + /// A model to be projected into the programs view, according to Qt's MVC model class ProgramsModel: public QAbstractItemModel { @@ -232,6 +262,9 @@ Config::WebSites const & getWebSites() const { return webSitesModel.getCurrentWebSites(); } + Config::DictServers const & getDictServers() const + { return dictServersModel.getCurrentDictServers(); } + Config::Programs const & getPrograms() const { return programsModel.getCurrentPrograms(); } @@ -251,7 +284,7 @@ private: Ui::Sources ui; -#if defined( Q_OS_WIN32 ) || defined( Q_OS_MACX ) +#if defined( Q_OS_WIN32 ) || defined( Q_OS_MAC ) TextToSpeechSource *textToSpeechSource; #endif @@ -260,6 +293,7 @@ MediaWikisModel mediawikisModel; WebSitesModel webSitesModel; + DictServersModel dictServersModel; ProgramsModel programsModel; PathsModel pathsModel; SoundDirsModel soundDirsModel; @@ -285,6 +319,9 @@ void on_addWebSite_clicked(); void on_removeWebSite_clicked(); + void on_removeDictServer_clicked(); + void on_addDictServer_clicked(); + void on_addProgram_clicked(); void on_removeProgram_clicked(); diff -Nru goldendict-1.5.0~git20131003/sources.ui goldendict-1.5.0~git20150923/sources.ui --- goldendict-1.5.0~git20131003/sources.ui 2013-08-16 09:41:47.000000000 +0000 +++ goldendict-1.5.0~git20150923/sources.ui 2015-09-23 08:26:24.000000000 +0000 @@ -6,7 +6,7 @@ 0 0 - 690 + 811 336 @@ -338,6 +338,62 @@ + + + + :/icons/network.png:/icons/network.png + + + DICT servers + + + + + + DICT servers: + + + + + + + + + + + + + + &Add... + + + + + + + &Remove + + + + + + + Qt::Vertical + + + + 20 + 40 + + + + + + + + + + diff -Nru goldendict-1.5.0~git20131003/speechhlp.cc goldendict-1.5.0~git20150923/speechhlp.cc --- goldendict-1.5.0~git20131003/speechhlp.cc 2013-08-16 09:41:47.000000000 +0000 +++ goldendict-1.5.0~git20150923/speechhlp.cc 2015-09-23 08:26:24.000000000 +0000 @@ -81,7 +81,7 @@ void speechEnumerateAvailableEngines(EnumerateCallback callback, void *userData) { HRESULT hr; - IEnumSpObjectTokens * enumSpTokens; + IEnumSpObjectTokens * enumSpTokens = NULL; ULONG count = 0; bool next = true; hr = CoInitializeEx(NULL, COINIT_APARTMENTTHREADED); diff -Nru goldendict-1.5.0~git20131003/sphelper.hh goldendict-1.5.0~git20150923/sphelper.hh --- goldendict-1.5.0~git20131003/sphelper.hh 2013-08-16 09:41:47.000000000 +0000 +++ goldendict-1.5.0~git20150923/sphelper.hh 2015-09-23 08:26:24.000000000 +0000 @@ -20,7 +20,7 @@ #ifdef _SAPI_VER #undef _SAPI_VER #endif -#define _SAPI_VER 0503 +#define _SAPI_VER 0x053 inline void SpHexFromUlong(WCHAR * psz, ULONG ul) { @@ -110,6 +110,12 @@ WCHAR szLangId[10]; HRESULT hr = S_OK; + if (ppszDescription == NULL) + { + return E_POINTER; + } + *ppszDescription = NULL; + #if _SAPI_VER >= 0x053 WCHAR* pRegKeyPath = 0; WCHAR* pszTemp = 0; @@ -120,12 +126,6 @@ OSVERSIONINFO ver; ver.dwOSVersionInfoSize = sizeof( ver ); - if (ppszDescription == NULL) - { - return E_POINTER; - } - *ppszDescription = NULL; - if( ( ::GetVersionEx( &ver ) == TRUE ) && ( ver.dwMajorVersion >= 6 ) ) { // If we reach this code we are running under Windows Vista diff -Nru goldendict-1.5.0~git20131003/stardict.cc goldendict-1.5.0~git20150923/stardict.cc --- goldendict-1.5.0~git20131003/stardict.cc 2013-10-02 20:42:04.000000000 +0000 +++ goldendict-1.5.0~git20150923/stardict.cc 2015-09-23 08:26:24.000000000 +0000 @@ -10,10 +10,13 @@ #include "xdxf2html.hh" #include "htmlescape.hh" #include "langcoder.hh" -#include "dprintf.hh" +#include "gddebug.hh" #include "fsencoding.hh" #include "filetype.hh" #include "indexedzip.hh" +#include "tiff.hh" +#include "ftshelpers.hh" +#include "wstring_qt.hh" #include #include @@ -35,6 +38,8 @@ #include #include #include +#include +#include #include "ufile.hh" @@ -65,6 +70,7 @@ DEF_EX_STR( exCantReadFile, "Can't read file", Dictionary::Ex ) DEF_EX_STR( exWordIsTooLarge, "Enountered a word that is too large:", Dictionary::Ex ) DEF_EX_STR( exSuddenEndOfFile, "Sudden end of file", Dictionary::Ex ) +DEF_EX_STR( exDictzipError, "DICTZIP error", Dictionary::Ex ) DEF_EX_STR( exIncorrectOffset, "Incorrect offset encountered in file", Dictionary::Ex ) @@ -173,6 +179,20 @@ virtual QString getMainFilename(); + virtual sptr< Dictionary::DataRequest > getSearchResults( QString const & searchString, + int searchMode, bool matchCase, + int distanceBetweenWords, + int maxResults ); + virtual void getArticleText( uint32_t articleAddress, QString & headword, QString & text ); + + virtual void makeFTSIndex(QAtomicInt & isCancelled, bool firstIteration ); + + virtual void setFTSParameters( Config::FullTextSearch const & fts ) + { + can_FTS = fts.enabled + && !fts.disabledTypes.contains( "STARDICT", Qt::CaseInsensitive ) + && ( fts.maxDictionarySize == 0 || getArticleCount() <= fts.maxDictionarySize ); + } protected: void loadIcon() throw(); @@ -194,6 +214,8 @@ string handleResource( char type, char const * resource, size_t size ); + void pangoToHtml( QString & text ); + friend class StardictResourceRequest; friend class StardictArticleRequest; friend class StardictHeadwordsRequest; @@ -211,10 +233,12 @@ { // Open the .dict file - dz = dict_data_open( dictionaryFiles[ 2 ].c_str(), 0 ); + DZ_ERRORS error; + dz = dict_data_open( dictionaryFiles[ 2 ].c_str(), &error, 0 ); if ( !dz ) - throw exCantReadFile( dictionaryFiles[ 2 ] ); + throw exDictzipError( string( dz_error_str( error ) ) + + "(" + dictionaryFiles[ 2 ] + ")" ); // Initialize the index @@ -238,6 +262,16 @@ if ( zipName.endsWith( ".zip", Qt::CaseInsensitive ) ) // Sanity check resourceZip.openZipFile( zipName ); } + + // Full-text search parameters + + can_FTS = true; + + ftsIdxName = indexFile + "_FTS"; + + if( !Dictionary::needToRebuildIndex( dictionaryFiles, ftsIdxName ) + && !FtsHelpers::ftsIndexIsOldOrBad( ftsIdxName, this ) ) + FTS_index_completed.ref(); } StardictDictionary::~StardictDictionary() @@ -297,10 +331,11 @@ /// 'type', contained in a block pointed to by 'resource', 'size' bytes long. string StardictDictionary::handleResource( char type, char const * resource, size_t size ) { + QString text; switch( type ) { case 'x': // Xdxf content - return Xdxf2Html::convert( string( resource, size ), Xdxf2Html::STARDICT, NULL, this ); + return Xdxf2Html::convert( string( resource, size ), Xdxf2Html::STARDICT, NULL, this, &resourceZip ); case 'h': // Html content { string articleText = "
" + string( resource, size ) + "
"; @@ -322,7 +357,9 @@ isToLanguageRTL() ) + ""; case 'g': // Pango markup. - return "
" + string( resource, size ) + "
"; + text = QString::fromUtf8( resource, size ); + pangoToHtml( text ); + return "
" + string( text.toUtf8().data() ) + "
"; case 't': // Transcription return "
" + Html::escape( string( resource, size ) ) + "
"; case 'y': // Chinese YinBiao or Japanese KANA. Examples are needed. For now, @@ -352,6 +389,303 @@ return string( "Unknown blob entry type " ) + string( 1, type ) + "
"; } +void StardictDictionary::pangoToHtml( QString & text ) +{ +/* + * Partially support for Pango Markup Language + * Attributes "fallback", "lang", "gravity", "gravity_hint" just ignored + */ + + QRegExp spanRegex( "]*)>", Qt::CaseInsensitive ); + QRegExp styleRegex( "(\\w+)=\"([^\"]*)\"" ); + + text.replace( "\n", "
" ); + + int pos = 0; + do + { + pos = spanRegex.indexIn( text, pos ); + if( pos >= 0 ) + { + QString styles = spanRegex.cap( 1 ); + QString newSpan( "= 0 ) + { + if( style.compare( "font_desc", Qt::CaseInsensitive ) == 0 + || style.compare( "font", Qt::CaseInsensitive ) == 0 ) + { + // Parse font description + + QStringList list = styleRegex.cap( 2 ).split( " ", QString::SkipEmptyParts ); + int n; + QString sizeStr, stylesStr, familiesStr; + for( n = list.size() - 1; n >= 0; n-- ) + { + QString str = list.at( n ); + + // font size + if( str[ 0 ].isNumber() ) + { + sizeStr = QString( "font-size:" ) + str + ";"; + continue; + } + + // font style + if( str.compare( "normal", Qt::CaseInsensitive ) == 0 + || str.compare( "oblique", Qt::CaseInsensitive ) == 0 + || str.compare( "italic", Qt::CaseInsensitive ) == 0 ) + { + if( !stylesStr.contains( "font-style:" ) ) + stylesStr += QString( "font-style:" ) + str + ";"; + continue; + } + + // font variant + if( str.compare( "smallcaps", Qt::CaseInsensitive ) == 0 ) + { + stylesStr += QString( "font-variant:small-caps" ) ; + continue; + } + + // font weight + if( str.compare( "ultralight", Qt::CaseInsensitive ) == 0 ) + { + stylesStr += QString( "font-weight:100;" ); + continue; + } + if( str.compare( "light", Qt::CaseInsensitive ) == 0 ) + { + stylesStr += QString( "font-weight:200;" ); + continue; + } + if( str.compare( "bold", Qt::CaseInsensitive ) == 0 ) + { + stylesStr += QString( "font-weight:bold;" ); + continue; + } + if( str.compare( "ultrabold", Qt::CaseInsensitive ) == 0 ) + { + stylesStr += QString( "font-weight:800;" ); + continue; + } + if( str.compare( "heavy", Qt::CaseInsensitive ) == 0 ) + { + stylesStr += QString( "font-weight:900" ); + continue; + } + + // font stretch + if( str.compare( "ultracondensed", Qt::CaseInsensitive ) == 0 ) + { + stylesStr += QString( "font-stretch:ultra-condensed;" ); + continue; + } + if( str.compare( "extracondensed", Qt::CaseInsensitive ) == 0 ) + { + stylesStr += QString( "font-stretch:extra-condensed;" ); + continue; + } + if( str.compare( "semicondensed", Qt::CaseInsensitive ) == 0 ) + { + stylesStr += QString( "font-stretch:semi-condensed;" ); + continue; + } + if( str.compare( "semiexpanded", Qt::CaseInsensitive ) == 0 ) + { + stylesStr += QString( "font-stretch:semi-expanded;" ); + continue; + } + if( str.compare( "extraexpanded", Qt::CaseInsensitive ) == 0 ) + { + stylesStr += QString( "font-stretch:extra-expanded;" ); + continue; + } + if( str.compare( "ultraexpanded", Qt::CaseInsensitive ) == 0 ) + { + stylesStr += QString( "font-stretch:ultra-expanded;" ); + continue; + } + if( str.compare( "condensed", Qt::CaseInsensitive ) == 0 + || str.compare( "expanded", Qt::CaseInsensitive ) == 0 ) + { + stylesStr += QString( "font-stretch:" ) + str + ";"; + continue; + } + + // gravity + if( str.compare( "south", Qt::CaseInsensitive ) == 0 + || str.compare( "east", Qt::CaseInsensitive ) == 0 + || str.compare( "north", Qt::CaseInsensitive ) == 0 + || str.compare( "west", Qt::CaseInsensitive ) == 0 + || str.compare( "auto", Qt::CaseInsensitive ) == 0 ) + { + continue; + } + break; + } + + // last words is families list + if( n >= 0 ) + { + familiesStr = QString( "font-family:" ); + for( int i = 0; i <= n; i++ ) + { + if( i > 0 && !familiesStr.endsWith( ',' ) ) + familiesStr += ","; + familiesStr += list.at( i ); + } + familiesStr += ";"; + } + + newSpan += familiesStr + stylesStr + sizeStr; + } + else if( style.compare( "font_family", Qt::CaseInsensitive ) == 0 + || style.compare( "face", Qt::CaseInsensitive ) == 0 ) + newSpan += QString( "font-family:" ) + styleRegex.cap( 2 ) + ";"; + else if( style.compare( "font_size", Qt::CaseInsensitive ) == 0 + || style.compare( "size", Qt::CaseInsensitive ) == 0 ) + { + if( styleRegex.cap( 2 )[ 0 ].isLetter() + || styleRegex.cap( 2 ).endsWith( "px", Qt::CaseInsensitive ) + || styleRegex.cap( 2 ).endsWith( "pt", Qt::CaseInsensitive ) + || styleRegex.cap( 2 ).endsWith( "em", Qt::CaseInsensitive ) + || styleRegex.cap( 2 ).endsWith( "%" ) ) + newSpan += QString( "font-size:" ) + styleRegex.cap( 2 ) +";"; + else + { + int size = styleRegex.cap( 2 ).toInt(); + if( size ) + newSpan += QString( "font-size:%1pt;" ).arg( size / 1024.0, 0, 'f', 3 ); + } + } + else if( style.compare( "font_style", Qt::CaseInsensitive ) == 0 + || style.compare( "style", Qt::CaseInsensitive ) == 0) + newSpan += QString( "font-style:" ) + styleRegex.cap( 2 ) + ";"; + else if( style.compare( "weight", Qt::CaseInsensitive ) == 0 + || style.compare( "weight", Qt::CaseInsensitive ) == 0) + { + QString str = styleRegex.cap( 2 ); + if( str.compare( "ultralight", Qt::CaseInsensitive ) == 0 ) + newSpan += QString( "font-weight:100;" ); + else if( str.compare( "light", Qt::CaseInsensitive ) == 0 ) + newSpan += QString( "font-weight:200;" ); + else if( str.compare( "ultrabold", Qt::CaseInsensitive ) == 0 ) + newSpan += QString( "font-weight:800;" ); + else if( str.compare( "heavy", Qt::CaseInsensitive ) == 0 ) + newSpan += QString( "font-weight:900" ); + else + newSpan += QString( "font-weight:" ) + str + ";"; + } + else if( style.compare( "font_variant", Qt::CaseInsensitive ) == 0 + || style.compare( "variant", Qt::CaseInsensitive ) == 0 ) + { + if( styleRegex.cap( 2 ).compare( "smallcaps", Qt::CaseInsensitive ) == 0 ) + newSpan += QString( "font-variant:small-caps" ); + else + newSpan += QString( "font-variant:" ) + styleRegex.cap( 2 ) + ";"; + } + else if( style.compare( "font_stretch", Qt::CaseInsensitive ) == 0 + || style.compare( "stretch", Qt::CaseInsensitive ) == 0 ) + { + QString str = styleRegex.cap( 2 ); + if( str.compare( "ultracondensed", Qt::CaseInsensitive ) == 0 ) + newSpan += QString( "font-stretch:ultra-condensed;" ); + else if( str.compare( "extracondensed", Qt::CaseInsensitive ) == 0 ) + newSpan += QString( "font-stretch:extra-condensed;" ); + else if( str.compare( "semicondensed", Qt::CaseInsensitive ) == 0 ) + newSpan += QString( "font-stretch:semi-condensed;" ); + else if( str.compare( "semiexpanded", Qt::CaseInsensitive ) == 0 ) + newSpan += QString( "font-stretch:semi-expanded;" ); + else if( str.compare( "extraexpanded", Qt::CaseInsensitive ) == 0 ) + newSpan += QString( "font-stretch:extra-expanded;" ); + else if( str.compare( "ultraexpanded", Qt::CaseInsensitive ) == 0 ) + newSpan += QString( "font-stretch:ultra-expanded;" ); + else + newSpan += QString( "font-stretch:" ) + str + ";"; + } + else if( style.compare( "foreground", Qt::CaseInsensitive ) == 0 + || style.compare( "fgcolor", Qt::CaseInsensitive ) == 0 + || style.compare( "color", Qt::CaseInsensitive ) == 0 ) + newSpan += QString( "color:" ) + styleRegex.cap( 2 ) + ";"; + else if( style.compare( "background", Qt::CaseInsensitive ) == 0 + || style.compare( "bgcolor", Qt::CaseInsensitive ) == 0 ) + newSpan += QString( "background-color:" ) + styleRegex.cap( 2 ) + ";"; + else if( style.compare( "underline_color", Qt::CaseInsensitive ) == 0 + || style.compare( "strikethrough_color", Qt::CaseInsensitive ) == 0 ) + newSpan += QString( "text-decoration-color:" ) + styleRegex.cap( 2 ) + ";"; + else if( style.compare( "underline", Qt::CaseInsensitive ) == 0 ) + { + if( styleRegex.cap( 2 ).compare( "none", Qt::CaseInsensitive ) ) + newSpan += QString( "text-decoration-line:none;" ); + else + { + newSpan += QString( "text-decoration-line:underline; " ); + if( styleRegex.cap( 2 ).compare( "low", Qt::CaseInsensitive ) ) + newSpan += QString( "text-decoration-style:dotted;" ); + else if( styleRegex.cap( 2 ).compare( "single", Qt::CaseInsensitive ) ) + newSpan += QString( "text-decoration-style:solid;" ); + else if( styleRegex.cap( 2 ).compare( "error", Qt::CaseInsensitive ) ) + newSpan += QString( "text-decoration-style:wavy;" ); + else + newSpan += QString( "text-decoration-style:" ) + styleRegex.cap( 2 ) + ";"; + } + } + else if( style.compare( "strikethrough", Qt::CaseInsensitive ) == 0 ) + { + if( styleRegex.cap( 2 ).compare( "true", Qt::CaseInsensitive ) ) + newSpan += QString( "text-decoration-line:line-through;" ); + else + newSpan += QString( "text-decoration-line:none;" ); + } + else if( style.compare( "rise", Qt::CaseInsensitive ) == 0 ) + { + if( styleRegex.cap( 2 ).endsWith( "px", Qt::CaseInsensitive ) + || styleRegex.cap( 2 ).endsWith( "pt", Qt::CaseInsensitive ) + || styleRegex.cap( 2 ).endsWith( "em", Qt::CaseInsensitive ) + || styleRegex.cap( 2 ).endsWith( "%" ) ) + newSpan += QString( "vertical-align:" ) + styleRegex.cap( 2 ) +";"; + else + { + int riseValue = styleRegex.cap( 2 ).toInt(); + if( riseValue ) + newSpan += QString( "vertical-align:%1pt;" ).arg( riseValue / 1024.0, 0, 'f', 3 ); + } + } + else if( style.compare( "letter_spacing", Qt::CaseInsensitive ) == 0 ) + { + if( styleRegex.cap( 2 ).endsWith( "px", Qt::CaseInsensitive ) + || styleRegex.cap( 2 ).endsWith( "pt", Qt::CaseInsensitive ) + || styleRegex.cap( 2 ).endsWith( "em", Qt::CaseInsensitive ) + || styleRegex.cap( 2 ).endsWith( "%" ) ) + newSpan += QString( "letter-spacing:" ) + styleRegex.cap( 2 ) +";"; + else + { + int spacing = styleRegex.cap( 2 ).toInt(); + if( spacing ) + newSpan += QString( "letter-spacing:%1pt;" ).arg( spacing / 1024.0, 0, 'f', 3 ); + } + } + + stylePos += styleRegex.matchedLength(); + } + } + while( stylePos >= 0 ); + + newSpan += "\">"; + text.replace( pos, spanRegex.matchedLength(), newSpan ); + pos += newSpan.size(); + } + } + while( pos >= 0 ); + + text.replace( " ", "  " ); +} + void StardictDictionary::loadArticle( uint32_t address, string & headword, string & articleText ) @@ -396,7 +730,7 @@ else if ( !size ) { - qWarning( "Stardict: short entry for the word %s encountered in \"%s\".\n", headword.c_str(), getName().c_str() ); + gdWarning( "Stardict: short entry for the word %s encountered in \"%s\".\n", headword.c_str(), getName().c_str() ); break; } @@ -410,7 +744,7 @@ if ( size < entrySize ) { - qWarning( "Stardict: malformed entry for the word %s encountered in \"%s\".\n", headword.c_str(), getName().c_str() ); + gdWarning( "Stardict: malformed entry for the word %s encountered in \"%s\".\n", headword.c_str(), getName().c_str() ); break; } @@ -431,7 +765,7 @@ { if ( size < sizeof( uint32_t ) ) { - qWarning( "Stardict: malformed entry for the word %s encountered in \"%s\".\n", headword.c_str(), getName().c_str() ); + gdWarning( "Stardict: malformed entry for the word %s encountered in \"%s\".\n", headword.c_str(), getName().c_str() ); break; } @@ -445,7 +779,7 @@ if ( size < entrySize ) { - qWarning( "Stardict: malformed entry for the word %s encountered in \"%s\".\n", headword.c_str(), getName().c_str() ); + gdWarning( "Stardict: malformed entry for the word %s encountered in \"%s\".\n", headword.c_str(), getName().c_str() ); break; } @@ -456,8 +790,8 @@ } else { - qWarning( "Stardict: non-alpha entry type 0x%x for the word %s encountered in \"%s\".\n", - type, headword.c_str(), getName().c_str() ); + gdWarning( "Stardict: non-alpha entry type 0x%x for the word %s encountered in \"%s\".\n", + type, headword.c_str(), getName().c_str() ); break; } } @@ -474,7 +808,7 @@ if ( size < len + 2 ) { - qWarning( "Stardict: malformed entry for the word %s encountered in \"%s\".\n", headword.c_str(), getName().c_str() ); + gdWarning( "Stardict: malformed entry for the word %s encountered in \"%s\".\n", headword.c_str(), getName().c_str() ); break; } @@ -489,7 +823,7 @@ // An entry which havs its size before contents if ( size < sizeof( uint32_t ) + 1 ) { - qWarning( "Stardict: malformed entry for the word %s encountered in \"%s\".\n", headword.c_str(), getName().c_str() ); + gdWarning( "Stardict: malformed entry for the word %s encountered in \"%s\".\n", headword.c_str(), getName().c_str() ); break; } @@ -501,7 +835,7 @@ if ( size < sizeof( uint32_t ) + 1 + entrySize ) { - qWarning( "Stardict: malformed entry for the word %s encountered in \"%s\".\n", headword.c_str(), getName().c_str() ); + gdWarning( "Stardict: malformed entry for the word %s encountered in \"%s\".\n", headword.c_str(), getName().c_str() ); break; } @@ -512,8 +846,8 @@ } else { - qWarning( "Stardict: non-alpha entry type 0x%x for the word %s encountered in \"%s\".\n", - (unsigned)*ptr, headword.c_str(), getName().c_str() ); + gdWarning( "Stardict: non-alpha entry type 0x%x for the word %s encountered in \"%s\".\n", + (unsigned)*ptr, headword.c_str(), getName().c_str() ); break; } } @@ -531,7 +865,10 @@ Ifo ifo( ifoFile ); if( !ifo.copyright.empty() ) - dictionaryDescription += "Copyright: " + QString::fromUtf8( ifo.copyright.c_str() ) + "\n\n"; + dictionaryDescription += "Copyright: " + + QString::fromUtf8( ifo.copyright.c_str() ) + .replace( "
", "\n", Qt::CaseInsensitive ) + + "\n\n"; if( !ifo.author.empty() ) dictionaryDescription += "Author: " + QString::fromUtf8( ifo.author.c_str() ) + "\n\n"; @@ -543,7 +880,8 @@ { QString desc = QString::fromUtf8( ifo.description.c_str() ); desc.replace( "\t", "
" ); - desc.replace( "\\n", "
" ); + desc.replace( "\\n", "\n" ); + desc.replace( "
", "\n", Qt::CaseInsensitive ); dictionaryDescription += Html::unescape( desc ); } @@ -558,6 +896,63 @@ return FsEncoding::decode( getDictionaryFilenames()[ 0 ].c_str() ); } +void StardictDictionary::makeFTSIndex( QAtomicInt & isCancelled, bool firstIteration ) +{ + if( !( Dictionary::needToRebuildIndex( getDictionaryFilenames(), ftsIdxName ) + || FtsHelpers::ftsIndexIsOldOrBad( ftsIdxName, this ) ) ) + FTS_index_completed.ref(); + + if( haveFTSIndex() ) + return; + + if( ensureInitDone().size() ) + return; + + if( firstIteration && getArticleCount() > FTS::MaxDictionarySizeForFastSearch ) + return; + + gdDebug( "Stardict: Building the full-text index for dictionary: %s\n", + getName().c_str() ); + + try + { + FtsHelpers::makeFTSIndex( this, isCancelled ); + FTS_index_completed.ref(); + } + catch( std::exception &ex ) + { + gdWarning( "Stardict: Failed building full-text search index for \"%s\", reason: %s\n", getName().c_str(), ex.what() ); + QFile::remove( FsEncoding::decode( ftsIdxName.c_str() ) ); + } +} + +void StardictDictionary::getArticleText( uint32_t articleAddress, QString & headword, QString & text ) +{ + try + { + string headwordStr, articleStr; + loadArticle( articleAddress, headwordStr, articleStr ); + + headword = QString::fromUtf8( headwordStr.data(), headwordStr.size() ); + + wstring wstr = Utf8::decode( articleStr ); + + text = Html::unescape( gd::toQString( wstr ) ); + } + catch( std::exception &ex ) + { + gdWarning( "Stardict: Failed retrieving article from \"%s\", reason: %s\n", getName().c_str(), ex.what() ); + } +} + +sptr< Dictionary::DataRequest > StardictDictionary::getSearchResults( QString const & searchString, + int searchMode, bool matchCase, + int distanceBetweenWords, + int maxResults ) +{ + return new FtsHelpers::FTSResultsRequest( *this, searchString,searchMode, matchCase, distanceBetweenWords, maxResults ); +} + /// StardictDictionary::findHeadwordsForSynonym() class StardictHeadwordsRequest; @@ -1049,7 +1444,7 @@ FsEncoding::separator() + FsEncoding::encode( resourceName ); - DPRINTF( "n is %s\n", n.c_str() ); + GD_DPRINTF( "n is %s\n", n.c_str() ); try { @@ -1083,6 +1478,11 @@ QImage img = QImage::fromData( (unsigned char *) &data.front(), data.size() ); +#ifdef MAKE_EXTRA_TIFF_HANDLER + if( img.isNull() ) + GdTiff::tiffToQImage( &data.front(), data.size(), img ); +#endif + dataMutex.unlock(); if ( !img.isNull() ) @@ -1117,7 +1517,7 @@ } catch( std::exception &ex ) { - qWarning( "Stardict: Failed loading resource \"%s\" for \"%s\", reason: %s\n", + gdWarning( "Stardict: Failed loading resource \"%s\" for \"%s\", reason: %s\n", resourceName.c_str(), dict.getName().c_str(), ex.what() ); // Resource not loaded -- we don't set the hasAnyData flag then } @@ -1218,7 +1618,7 @@ sizeof( uint32_t ) * 2 ) > &image.back() ) { - FDPRINTF( stderr, "Warning: sudden end of file %s\n", fileName.c_str() ); + GD_FDPRINTF( stderr, "Warning: sudden end of file %s\n", fileName.c_str() ); break; } @@ -1300,7 +1700,7 @@ indexedWords.addWord( Utf8::decode( word ), offset ); } - DPRINTF( "%u entires made\n", (unsigned) indexedWords.size() ); + GD_DPRINTF( "%u entires made\n", (unsigned) indexedWords.size() ); } @@ -1356,7 +1756,7 @@ Ifo ifo( ifoFile ); - qDebug( "Stardict: Building the index for dictionary: %s\n", ifo.bookname.c_str() ); + gdDebug( "Stardict: Building the index for dictionary: %s\n", ifo.bookname.c_str() ); if ( ifo.idxoffsetbits == 64 ) throw ex64BitsNotSupported(); @@ -1368,21 +1768,21 @@ { if ( ifo.synwordcount ) { - DPRINTF( "Warning: dictionary has synwordcount specified, but no " - "corresponding .syn file was found\n" ); + GD_DPRINTF( "Warning: dictionary has synwordcount specified, but no " + "corresponding .syn file was found\n" ); ifo.synwordcount = 0; // Pretend it wasn't there } } else if ( !ifo.synwordcount ) { - DPRINTF( "Warning: ignoring .syn file %s, since there's no synwordcount in .ifo specified\n", - synFileName.c_str() ); + GD_DPRINTF( "Warning: ignoring .syn file %s, since there's no synwordcount in .ifo specified\n", + synFileName.c_str() ); } - DPRINTF( "bookname = %s\n", ifo.bookname.c_str() ); - DPRINTF( "wordcount = %u\n", ifo.wordcount ); + GD_DPRINTF( "bookname = %s\n", ifo.bookname.c_str() ); + GD_DPRINTF( "wordcount = %u\n", ifo.wordcount ); initializing.indexingDictionary( ifo.bookname ); @@ -1459,7 +1859,7 @@ if ( zipFileName.size() ) { - DPRINTF( "Indexing zip file\n" ); + GD_DPRINTF( "Indexing zip file\n" ); idxHeader.hasZipFile = 1; @@ -1502,8 +1902,8 @@ } catch( std::exception & e ) { - FDPRINTF( stderr, "Stardict's dictionary reading failed: %s, error: %s\n", - i->c_str(), e.what() ); + gdWarning( "Stardict dictionary initializing failed: %s, error: %s\n", + i->c_str(), e.what() ); } } diff -Nru goldendict-1.5.0~git20131003/tiff.cc goldendict-1.5.0~git20150923/tiff.cc --- goldendict-1.5.0~git20131003/tiff.cc 1970-01-01 00:00:00.000000000 +0000 +++ goldendict-1.5.0~git20150923/tiff.cc 2015-09-23 08:26:24.000000000 +0000 @@ -0,0 +1,144 @@ +/* This file is (c) 2014 Abs62 + * Part of GoldenDict. Licensed under GPLv3 or later, see the LICENSE file */ + +#ifdef MAKE_EXTRA_TIFF_HANDLER + +#include "tiff.hh" + +#if defined (Q_OS_MAC) || defined (Q_OS_WIN) +#include "tiff/tiff.h" +#include "tiff/tiffio.h" +#else +#include "tiff.h" +#include "tiffio.h" +#endif + +#include + +namespace GdTiff +{ + +tsize_t tiffReadProc( thandle_t fd, tdata_t buf, tsize_t size ) +{ + return static_cast< QIODevice * >( fd )->read( static_cast< char * >( buf ), size ); +} + +tsize_t tiffWriteProc( thandle_t fd, tdata_t buf, tsize_t size ) +{ +Q_UNUSED( fd ) +Q_UNUSED( buf ) +Q_UNUSED( size ) + return 0; +} + +toff_t tiffSeekProc( thandle_t fd, toff_t off, int whence ) +{ + QIODevice * device = static_cast< QIODevice * >( fd ); + switch (whence) { + case SEEK_SET: + device->seek( off ); + break; + case SEEK_CUR: + device->seek( device->pos() + off ); + break; + case SEEK_END: + device->seek( device->size() + off ); + break; + } + + return device->pos(); +} + +int tiffCloseProc( thandle_t fd ) +{ +Q_UNUSED( fd ) + return 0; +} + +toff_t tiffSizeProc( thandle_t fd ) +{ + return static_cast< QIODevice * >( fd )->size(); +} + +int tiffMapProc( thandle_t fd, tdata_t * pbase, toff_t * psize ) +{ +Q_UNUSED( fd ) +Q_UNUSED( pbase ) +Q_UNUSED( psize ) + return 0; +} + +void tiffUnmapProc( thandle_t fd, tdata_t base, toff_t size ) +{ +Q_UNUSED( fd ) +Q_UNUSED( base ) +Q_UNUSED( size ) +} + + +bool tiffToQImage( const char * data, int size, QImage & image ) +{ + QByteArray arr = QByteArray::fromRawData( data, size ); + QBuffer buf; + buf.setData( arr ); + buf.open( QIODevice::ReadOnly ); + + TIFF *const tiff = TIFFClientOpen( "foo", + "r", + &buf, + tiffReadProc, + tiffWriteProc, + tiffSeekProc, + tiffCloseProc, + tiffSizeProc, + tiffMapProc, + tiffUnmapProc ); + if( !tiff ) + return false; + + uint32 width, height; + if( !TIFFGetField( tiff, TIFFTAG_IMAGEWIDTH, &width ) + || !TIFFGetField( tiff, TIFFTAG_IMAGELENGTH, &height ) ) + { + TIFFClose( tiff ); + return false; + } + + uint16 bitPerSample; + if( !TIFFGetField( tiff, TIFFTAG_BITSPERSAMPLE, &bitPerSample ) ) + bitPerSample = 1; + + uint16 samplesPerPixel; // they may be e.g. grayscale with 2 samples per pixel + if( !TIFFGetField( tiff, TIFFTAG_SAMPLESPERPIXEL, &samplesPerPixel ) ) + samplesPerPixel = 1; + + if( bitPerSample == 1 && samplesPerPixel == 1 ) + { + QImage tiffImage( width, height, QImage::Format_Mono ); + + QVector colortable( 2 ); + colortable[0] = 0xffffffff; + colortable[1] = 0xff000000; + tiffImage.setColorTable( colortable ); + + for ( uint32 y = 0; y < height; ++y ) + { + if( TIFFReadScanline( tiff, tiffImage.scanLine( y ), y, 0 ) < 0 ) + { + TIFFClose( tiff ); + return false; + } + } + + image = tiffImage; + TIFFClose( tiff ); + return true; + } + + TIFFClose( tiff ); + return false; +} + +} // namespace + +#endif diff -Nru goldendict-1.5.0~git20131003/tiff.hh goldendict-1.5.0~git20150923/tiff.hh --- goldendict-1.5.0~git20131003/tiff.hh 1970-01-01 00:00:00.000000000 +0000 +++ goldendict-1.5.0~git20150923/tiff.hh 2015-09-23 08:26:24.000000000 +0000 @@ -0,0 +1,20 @@ +#ifndef __TIFF_HH_INCLUDED__ +#define __TIFF_HH_INCLUDED__ + +#ifdef MAKE_EXTRA_TIFF_HANDLER + +#include + +namespace GdTiff +{ + +// QImage don't handle TIFF files if TIFFTAG_PHOTOMETRIC is not set +// We will handle such 1-bit b/w images with default photometric + +bool tiffToQImage( const char * data, int size, QImage & image ); + +} + +#endif + +#endif // TIFF_HH diff -Nru goldendict-1.5.0~git20131003/transliteration.cc goldendict-1.5.0~git20150923/transliteration.cc --- goldendict-1.5.0~git20131003/transliteration.cc 2013-08-16 09:41:47.000000000 +0000 +++ goldendict-1.5.0~git20150923/transliteration.cc 2015-09-23 08:26:24.000000000 +0000 @@ -4,7 +4,7 @@ #include "transliteration.hh" #include "utf8.hh" #include "folding.hh" -#include "dprintf.hh" +#include "gddebug.hh" namespace Transliteration { @@ -122,7 +122,7 @@ vector< wstring > alts = getAlternateWritings( str ); - DPRINTF( "alts = %u\n", (unsigned) alts.size() ); + GD_DPRINTF( "alts = %u\n", (unsigned) alts.size() ); for( unsigned x = 0; x < alts.size(); ++x ) result->getMatches().push_back( alts[ x ] ); diff -Nru goldendict-1.5.0~git20131003/webmultimediadownload.cc goldendict-1.5.0~git20150923/webmultimediadownload.cc --- goldendict-1.5.0~git20131003/webmultimediadownload.cc 2013-08-16 09:41:47.000000000 +0000 +++ goldendict-1.5.0~git20150923/webmultimediadownload.cc 2015-09-23 08:26:24.000000000 +0000 @@ -49,7 +49,7 @@ { // Note: we check for forvo sound links explicitly, as they don't have extensions - return url.scheme() == "http" && ( + return ( url.scheme() == "http" || url.scheme() == "https" ) && ( Filetype::isNameOfSound( url.path().toUtf8().data() ) || url.host() == "apifree.forvo.com" ); } diff -Nru goldendict-1.5.0~git20131003/winlibs/include/eb/appendix.h goldendict-1.5.0~git20150923/winlibs/include/eb/appendix.h --- goldendict-1.5.0~git20131003/winlibs/include/eb/appendix.h 1970-01-01 00:00:00.000000000 +0000 +++ goldendict-1.5.0~git20150923/winlibs/include/eb/appendix.h 2015-09-23 08:26:24.000000000 +0000 @@ -0,0 +1,100 @@ +/* -*- C -*- + * Copyright (c) 1997-2006 Motoyuki Kasahara + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the project nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE PROJECT AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE PROJECT OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#ifndef EB_APPENDIX_H +#define EB_APPENDIX_H + +#ifdef __cplusplus +extern "C" { +#endif + +#ifdef EB_BUILD_LIBRARY +#include "eb.h" +#else +#include +#endif + +/* + * Function declarations. + */ +/* appendix.c */ +void eb_initialize_appendix(EB_Appendix *appendix); +void eb_finalize_appendix(EB_Appendix *appendix); +EB_Error_Code eb_bind_appendix(EB_Appendix *appendix, const char *path); +int eb_is_appendix_bound(EB_Appendix *appendix); +EB_Error_Code eb_appendix_path(EB_Appendix *appendix, char *path); + +/* appsub.c */ +EB_Error_Code eb_load_all_appendix_subbooks(EB_Appendix *appendix); +EB_Error_Code eb_appendix_subbook_list(EB_Appendix *appendix, + EB_Subbook_Code *subbook_list, int *subbook_count); +EB_Error_Code eb_appendix_subbook(EB_Appendix *appendix, + EB_Subbook_Code *subbook_code); +EB_Error_Code eb_appendix_subbook_directory(EB_Appendix *appendix, + char *directory); +EB_Error_Code eb_appendix_subbook_directory2(EB_Appendix *appendix, + EB_Subbook_Code subbook_code, char *directory); +EB_Error_Code eb_set_appendix_subbook(EB_Appendix *appendix, + EB_Subbook_Code subbook_code); +void eb_unset_appendix_subbook(EB_Appendix *appendix); + +/* narwalt.c */ +int eb_have_narrow_alt(EB_Appendix *appendix); +EB_Error_Code eb_narrow_alt_start(EB_Appendix *appendix, int *start); +EB_Error_Code eb_narrow_alt_end(EB_Appendix *appendix, int *end); +EB_Error_Code eb_narrow_alt_character_text(EB_Appendix *appendix, + int character_number, char *text); +EB_Error_Code eb_forward_narrow_alt_character(EB_Appendix *appendix, + int n, int *character_number); +EB_Error_Code eb_backward_narrow_alt_character(EB_Appendix *appendix, + int n, int *character_number); + +/* stopcode.c */ +int eb_have_stop_code(EB_Appendix *appendix); +EB_Error_Code eb_stop_code(EB_Appendix *appendix, int *); + +/* widealt.c */ +int eb_have_wide_alt(EB_Appendix *appendix); +EB_Error_Code eb_wide_alt_start(EB_Appendix *appendix, int *start); +EB_Error_Code eb_wide_alt_end(EB_Appendix *appendix, int *end); +EB_Error_Code eb_wide_alt_character_text(EB_Appendix *appendix, + int character_number, char *text); +EB_Error_Code eb_forward_wide_alt_character(EB_Appendix *appendix, int n, + int *character_number); +EB_Error_Code eb_backward_wide_alt_character(EB_Appendix *appendix, int n, + int *character_number); + +/* for backward compatibility */ +#define eb_suspend_appendix eb_unset_appendix_subbook +#define eb_initialize_all_appendix_subbooks eb_load_all_appendix_subbooks + +#ifdef __cplusplus +} +#endif + +#endif /* not EB_APPENDIX_H */ diff -Nru goldendict-1.5.0~git20131003/winlibs/include/eb/binary.h goldendict-1.5.0~git20150923/winlibs/include/eb/binary.h --- goldendict-1.5.0~git20131003/winlibs/include/eb/binary.h 1970-01-01 00:00:00.000000000 +0000 +++ goldendict-1.5.0~git20150923/winlibs/include/eb/binary.h 2015-09-23 08:26:24.000000000 +0000 @@ -0,0 +1,73 @@ +/* -*- C -*- + * Copyright (c) 2001-2006 Motoyuki Kasahara + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the project nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE PROJECT AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE PROJECT OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#ifndef EB_BINARY_H +#define EB_BINARY_H + +#ifdef __cplusplus +extern "C" { +#endif + +#include + +#ifdef EB_BUILD_LIBRARY +#include "defs.h" +#else +#include +#endif + +/* + * Function declarations. + */ +/* binary.c */ +EB_Error_Code eb_set_binary_mono_graphic(EB_Book *book, + const EB_Position *position, int width, int height); +EB_Error_Code eb_set_binary_gray_graphic(EB_Book *book, + const EB_Position *position, int width, int height); +EB_Error_Code eb_set_binary_wave(EB_Book *book, + const EB_Position *start_position, const EB_Position *end_position); +EB_Error_Code eb_set_binary_color_graphic(EB_Book *book, + const EB_Position *position); +EB_Error_Code eb_set_binary_mpeg(EB_Book *book, const unsigned int *argv); +EB_Error_Code eb_read_binary(EB_Book *book, size_t binary_max_length, + char *binary, ssize_t *binary_length); +void eb_unset_binary(EB_Book *book); + +/* filename.c */ +EB_Error_Code eb_compose_movie_file_name(const unsigned int *argv, + char *composed_file_name); +EB_Error_Code eb_compose_movie_path_name(EB_Book *book, + const unsigned int *argv, char *composed_path_name); +EB_Error_Code eb_decompose_movie_file_name(unsigned int *argv, + const char *composed_file_name); + +#ifdef __cplusplus +} +#endif + +#endif /* not EB_BINARY_H */ diff -Nru goldendict-1.5.0~git20131003/winlibs/include/eb/booklist.h goldendict-1.5.0~git20150923/winlibs/include/eb/booklist.h --- goldendict-1.5.0~git20131003/winlibs/include/eb/booklist.h 1970-01-01 00:00:00.000000000 +0000 +++ goldendict-1.5.0~git20150923/winlibs/include/eb/booklist.h 2015-09-23 08:26:24.000000000 +0000 @@ -0,0 +1,60 @@ +/* -*- C -*- + * Copyright (c) 1997-2006 Motoyuki Kasahara + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the project nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE PROJECT AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE PROJECT OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#ifndef EB_BOOKLIST_H +#define EB_BOOKLIST_H + +#ifdef __cplusplus +extern "C" { +#endif + +#ifdef EB_BUILD_LIBRARY +#include "eb.h" +#else +#include +#endif + +/* + * Function declarations. + */ +/* booklist.c */ +void eb_initialize_booklist(EB_BookList *booklist); +void eb_finalize_booklist(EB_BookList *booklist); +EB_Error_Code eb_bind_booklist(EB_BookList *booklist, const char *path); +EB_Error_Code eb_booklist_book_count(EB_BookList *booklist, int *book_count); +EB_Error_Code eb_booklist_book_name(EB_BookList *booklist, int book_index, + char **book_name); +EB_Error_Code eb_booklist_book_title(EB_BookList *booklist, int book_index, + char **book_title); + + +#ifdef __cplusplus +} +#endif + +#endif /* not EB_BOOKLIST_H */ diff -Nru goldendict-1.5.0~git20131003/winlibs/include/eb/defs.h goldendict-1.5.0~git20150923/winlibs/include/eb/defs.h --- goldendict-1.5.0~git20131003/winlibs/include/eb/defs.h 1970-01-01 00:00:00.000000000 +0000 +++ goldendict-1.5.0~git20150923/winlibs/include/eb/defs.h 2015-09-23 08:26:24.000000000 +0000 @@ -0,0 +1,1040 @@ +/* -*- C -*- + * Copyright (c) 1997-2006 Motoyuki Kasahara + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the project nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE PROJECT AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE PROJECT OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#ifndef EB_DEFS_H +#define EB_DEFS_H + +#ifdef __cplusplus +extern "C" { +#endif + +#include +#include + +#ifdef EB_BUILD_LIBRARY +#include "sysdefs.h" +#include "zio.h" +#else +#include +#include +#endif + +#ifdef EB_ENABLE_PTHREAD +#include +#endif + +/* + * Disc code + */ +#define EB_DISC_EB 0 +#define EB_DISC_EPWING 1 +#define EB_DISC_INVALID -1 + +/* + * Character codes. + */ +#define EB_CHARCODE_ISO8859_1 1 +#define EB_CHARCODE_JISX0208 2 +#define EB_CHARCODE_JISX0208_GB2312 3 +#define EB_CHARCODE_INVALID -1 + +/* + * Special book ID for cache to represent "no cache data for any book". + */ +#define EB_BOOK_NONE -1 + +/* + * Special disc code, subbook code, multi search ID, and multi search + * entry ID, for representing error state. + */ +#define EB_SUBBOOK_INVALID -1 +#define EB_MULTI_INVALID -1 + +/* + * Size of a page (The term `page' means `block' in JIS X 4081). + */ +#define EB_SIZE_PAGE 2048 + +/* + * Maximum length of a word to be searched. + */ +#define EB_MAX_WORD_LENGTH 255 + +/* + * Maximum length of an EB* book title. + */ +#define EB_MAX_EB_TITLE_LENGTH 30 + +/* + * Maximum length of an EPWING book title. + */ +#define EB_MAX_EPWING_TITLE_LENGTH 80 + +/* + * Maximum length of a book title. + */ +#define EB_MAX_TITLE_LENGTH 80 + +/* + * Maximum length of a word to be searched. + */ +#if defined(PATH_MAX) +#define EB_MAX_PATH_LENGTH PATH_MAX +#elif defined(MAXPATHLEN) +#define EB_MAX_PATH_LENGTH MAXPATHLEN +#else +#define EB_MAX_PATH_LENGTH 1024 +#endif + +/* + * Maximum length of a directory name. + */ +#define EB_MAX_DIRECTORY_NAME_LENGTH 8 + +/* + * Maximum length of a file name under a certain directory. + * prefix(8 chars) + '.' + suffix(3 chars) + ';' + digit(1 char) + */ +#define EB_MAX_FILE_NAME_LENGTH 14 + +/* + * Maximum length of a label for multi-search entry. + */ +#define EB_MAX_MULTI_LABEL_LENGTH 30 + +/* + * Maximum length of alternation text string for a private character. + */ +#define EB_MAX_ALTERNATION_TEXT_LENGTH 31 + +/* + * Maximum length of title for multi search. + */ +#define EB_MAX_MULTI_TITLE_LENGTH 32 + +/* + * Maximum number of font heights in a subbok. + */ +#define EB_MAX_FONTS 4 + +/* + * Maximum number of subbooks in a book. + */ +#define EB_MAX_SUBBOOKS 50 + +/* + * Maximum number of multi-search types in a subbook. + */ +#define EB_MAX_MULTI_SEARCHES 10 + +/* + * Maximum number of entries in a multi-search. + */ +#define EB_MAX_MULTI_ENTRIES 5 + +/* + * Maximum number of entries in a keyword search. + */ +#define EB_MAX_KEYWORDS EB_MAX_MULTI_ENTRIES + +/* + * Maximum number of entries in a cross search. + */ +#define EB_MAX_CROSS_ENTRIES EB_MAX_MULTI_ENTRIES + +/* + * Maximum number of characters for alternation cache. + */ +#define EB_MAX_ALTERNATION_CACHE 16 + +/* + * The number of text hooks. + */ +#define EB_NUMBER_OF_HOOKS 54 + +/* + * The number of search contexts required by a book. + */ +#define EB_NUMBER_OF_SEARCH_CONTEXTS EB_MAX_MULTI_ENTRIES + +/* + * Types for various codes. + */ +typedef int EB_Error_Code; +typedef int EB_Book_Code; +typedef int EB_Disc_Code; +typedef int EB_Case_Code; +typedef int EB_Suffix_Code; +typedef int EB_Character_Code; +typedef int EB_Font_Code; +typedef int EB_Word_Code; +typedef int EB_Subbook_Code; +typedef int EB_Index_Style_Code; +typedef int EB_Search_Code; +typedef int EB_Text_Code; +typedef int EB_Text_Status_Code; +typedef int EB_Multi_Search_Code; +typedef int EB_Hook_Code; +typedef int EB_Binary_Code; + +/* + * Typedef for Structures. + */ +#ifdef EB_ENABLE_PTHREAD +typedef struct EB_Lock_Struct EB_Lock; +#endif +typedef struct EB_Position_Struct EB_Position; +typedef struct EB_Alternation_Cache_Struct EB_Alternation_Cache; +typedef struct EB_Appendix_Subbook_Struct EB_Appendix_Subbook; +typedef struct EB_Appendix_Struct EB_Appendix; +typedef struct EB_Font_Struct EB_Font; +typedef struct EB_Search_Struct EB_Search; +typedef struct EB_Multi_Search_Struct EB_Multi_Search; +typedef struct EB_Subbook_Struct EB_Subbook; +typedef struct EB_Text_Context_Struct EB_Text_Context; +typedef struct EB_Binary_Context_Struct EB_Binary_Context; +typedef struct EB_Search_Context_Struct EB_Search_Context; +typedef struct EB_Book_Struct EB_Book; +typedef struct EB_Hit_Struct EB_Hit; +typedef struct EB_Hook_Struct EB_Hook; +typedef struct EB_Hookset_Struct EB_Hookset; +typedef struct EB_BookList_Entry EB_BookList_Entry; +typedef struct EB_BookList EB_BookList; + +/* + * Pthreads lock. + */ +#ifdef EB_ENABLE_PTHREAD +struct EB_Lock_Struct { + /* + * Lock count. (For emulating recursive lock). + */ + int lock_count; + + /* + * Mutex for `lock_count'. + */ + pthread_mutex_t lock_count_mutex; + + /* + * Mutex for struct entity. + */ + pthread_mutex_t entity_mutex; +}; +#endif /* EB_ENABLE_PTHREAD */ + +/* + * A pair of page and offset. + */ +struct EB_Position_Struct { + /* + * Page. (1, 2, 3 ...) + */ + int page; + + /* + * Offset in `page'. (0 ... 2047) + */ + int offset; +}; + +/* + * Chace of aternation text. + */ +struct EB_Alternation_Cache_Struct { + /* + * Character number. + */ + int character_number; + + /* + * Alternation string for `char_no'. + */ + char text[EB_MAX_ALTERNATION_TEXT_LENGTH + 1]; +}; + +/* + * An appendix for a subbook. + */ +struct EB_Appendix_Subbook_Struct { + + /* + * Initialization flag. + */ + int initialized; + + /* + * Subbook ID. + */ + EB_Subbook_Code code; + + /* + * Directory name. + */ + char directory_name[EB_MAX_DIRECTORY_NAME_LENGTH + 1]; + + /* + * Sub-directory name. (EPWING only) + */ + char data_directory_name[EB_MAX_DIRECTORY_NAME_LENGTH + 1]; + + /* + * File name. + */ + char file_name[EB_MAX_FILE_NAME_LENGTH + 1]; + + /* + * Character code of the book. + */ + EB_Character_Code character_code; + + /* + * Start character number of the narrow/wide font. + */ + int narrow_start; + int wide_start; + + /* + * End character number of the narrow/wide font. + */ + int narrow_end; + int wide_end; + + /* + * Start page number of the narrow/wide font. + */ + int narrow_page; + int wide_page; + + /* + * Stop code (first and second characters). + */ + int stop_code0; + int stop_code1; + + /* + * Compression Information for appendix file. + */ + Zio zio; +}; + +/* + * Additional resources for a book. + */ +struct EB_Appendix_Struct { + /* + * Book ID. + */ + EB_Book_Code code; + + /* + * Path of the book. + */ + char *path; + + /* + * The length of the path. + */ + size_t path_length; + + /* + * Disc type. EB (EB/EBG/EBXA/EBXA-C/S-EBXA) or EPWING. + */ + EB_Disc_Code disc_code; + + /* + * The number of subbooks the book has. + */ + int subbook_count; + + /* + * Subbook list. + */ + EB_Appendix_Subbook *subbooks; + + /* + * Current subbook. + */ + EB_Appendix_Subbook *subbook_current; + + /* + * ebnet socket file. + */ +#ifdef EB_ENABLE_EBNET + int ebnet_file; +#endif + + /* + * Lock. + */ +#ifdef EB_ENABLE_PTHREAD + EB_Lock lock; +#endif + + /* + * Cache table for alternation text. + */ + EB_Alternation_Cache narrow_cache[EB_MAX_ALTERNATION_CACHE]; + EB_Alternation_Cache wide_cache[EB_MAX_ALTERNATION_CACHE]; +}; + +/* + * A font in a subbook. + */ +struct EB_Font_Struct { + /* + * Font Code. + * This font is not available, if the code is EB_FONT_INVALID. + */ + EB_Font_Code font_code; + + /* + * Whether the object has been initialized. + */ + int initialized; + + /* + * Character numbers of the start and end of the font. + */ + int start; + int end; + + /* + * Page number of the start page of the font data. + * Used in EB* only. (In EPWING, it is alyways 1). + */ + int page; + + /* + * File name of the font. (EPWING only) + */ + char file_name[EB_MAX_FILE_NAME_LENGTH + 1]; + + /* + * Font data cache. + */ + char *glyphs; + + /* + * Compression Information. + */ + Zio zio; +}; + +/* + * Search methods in a subbook. + */ +struct EB_Search_Struct { + /* + * Index ID. + */ + int index_id; + + /* + * Page number of the start page of an index. + * This search method is not available, if `start_page' is 0, + */ + int start_page; + int end_page; + + /* + * Page number of the start page of candidates. + * (for multi search entry) + */ + int candidates_page; + + /* + * Index style flags. + */ + EB_Index_Style_Code katakana; + EB_Index_Style_Code lower; + EB_Index_Style_Code mark; + EB_Index_Style_Code long_vowel; + EB_Index_Style_Code double_consonant; + EB_Index_Style_Code contracted_sound; + EB_Index_Style_Code voiced_consonant; + EB_Index_Style_Code small_vowel; + EB_Index_Style_Code p_sound; + EB_Index_Style_Code space; + + /* + * Label. (for an entry in multi search) + */ + char label[EB_MAX_MULTI_LABEL_LENGTH + 1]; +}; + +/* + * A multi-search entry in a subbook. + */ +struct EB_Multi_Search_Struct { + /* + * Search method information. + */ + EB_Search search; + + /* + * Search title. (EPWING only) + */ + char title[EB_MAX_MULTI_TITLE_LENGTH + 1]; + + /* + * The number of entries the multi search has. + */ + int entry_count; + + /* + * List of Word entry information. + */ + EB_Search entries[EB_MAX_MULTI_ENTRIES]; +}; + +/* + * A subbook in a book. + */ +struct EB_Subbook_Struct { + /* + * Whether the object has been initialized. + */ + int initialized; + + /* + * Index page. + */ + int index_page; + + /* + * Subbook ID. + * This subbook is not available, if the code is EB_SUBBOOK_INVALID. + */ + EB_Subbook_Code code; + + /* + * File descriptor and compression information for text file. + */ + Zio text_zio; + + /* + * File descriptor and compression information for graphic file. + */ + Zio graphic_zio; + + /* + * File descriptor and compression information for sound file. + */ + Zio sound_zio; + + /* + * File descriptor and compression information for movie file. + */ + Zio movie_zio; + + /* + * Title of the subbook. + */ + char title[EB_MAX_TITLE_LENGTH + 1]; + + /* + * Subbook directory name. + */ + char directory_name[EB_MAX_DIRECTORY_NAME_LENGTH + 1]; + + /* + * Sub-directory names. (EPWING only) + */ + char data_directory_name[EB_MAX_DIRECTORY_NAME_LENGTH + 1]; + char gaiji_directory_name[EB_MAX_DIRECTORY_NAME_LENGTH + 1]; + char movie_directory_name[EB_MAX_DIRECTORY_NAME_LENGTH + 1]; + + /* + * File names. + */ + char text_file_name[EB_MAX_FILE_NAME_LENGTH + 1]; + char graphic_file_name[EB_MAX_FILE_NAME_LENGTH + 1]; + char sound_file_name[EB_MAX_FILE_NAME_LENGTH + 1]; + + /* + * Compression hints of Text, graphic and sound files. + * (temporary need, EPWING only). + */ + Zio_Code text_hint_zio_code; + Zio_Code graphic_hint_zio_code; + Zio_Code sound_hint_zio_code; + + /* + * Page number where search method titles are stored. + * (temporary need, EPWING only). + */ + int search_title_page; + + /* + * The top page of search methods. + */ + EB_Search word_alphabet; + EB_Search word_asis; + EB_Search word_kana; + EB_Search endword_alphabet; + EB_Search endword_asis; + EB_Search endword_kana; + EB_Search keyword; + EB_Search menu; + EB_Search image_menu; + EB_Search cross; + EB_Search copyright; + EB_Search text; + EB_Search sound; + + /* + * The number of multi-search methods the subbook has. + */ + int multi_count; + + /* + * The top page of multi search methods. + */ + EB_Multi_Search multis[EB_MAX_MULTI_SEARCHES]; + + /* + * Font list. + */ + EB_Font narrow_fonts[EB_MAX_FONTS]; + EB_Font wide_fonts[EB_MAX_FONTS]; + + /* + * Current narrow and wide fonts. + */ + EB_Font *narrow_current; + EB_Font *wide_current; +}; + +/* + * Length of cache buffer in a binary context. + * It must be greater than 38, size of GIF preamble. + * It must be greater than 44, size of WAVE sound header. + * It must be greater than 118, size of BMP header + info + 16 rgbquads. + */ +#define EB_SIZE_BINARY_CACHE_BUFFER 128 + +/* + * Context parameters for binary data. + */ +struct EB_Binary_Context_Struct { + /* + * Binary type ID. + * The context is not active, if this code is EB_BINARY_INVALID. + */ + EB_Binary_Code code; + + /* + * Compress information. + */ + Zio *zio; + + /* + * Location of the the binary data, relative to the start of the file. + */ + off_t location; + + /* + * Data size. + * Size zero means that the binary has no size information. + */ + size_t size; + + /* + * The current offset of binary data. + */ + size_t offset; + + /* + * Cache buffer. + */ + char cache_buffer[EB_SIZE_BINARY_CACHE_BUFFER]; + + /* + * Length of cached data. + */ + size_t cache_length; + + /* + * Current offset of cached data. + */ + size_t cache_offset; + + /* + * Width of Image. (monochrome graphic only) + */ + int width; +}; + +/* + * Context parameters for text reading. + */ +struct EB_Text_Context_Struct { + /* + * Current text content type. + * The context is not active, if this code is EB_TEXT_INVALID. + */ + EB_Text_Code code; + + /* + * Current offset pointer of the START or HONMON file. + */ + off_t location; + + /* + * The current point of a buffer on which text is written. + */ + char *out; + + /* + * Length of `out'. + */ + size_t out_rest_length; + + /* + * Unprocessed string that a hook function writes on text. + */ + char *unprocessed; + + /* + * Size of `unprocessed'. + */ + size_t unprocessed_size; + + /* + * Length of the current output text phrase. + */ + size_t out_step; + + /* + * Narrow character region flag. + */ + int narrow_flag; + + /* + * Whether a printable character has been appeared in the current + * text content. + */ + int printable_count; + + /* + * EOF flag of the current subbook. + */ + int file_end_flag; + + /* + * Status of the current text processing. + */ + EB_Text_Status_Code text_status; + + /* + * Skip until `skipcode' appears. + */ + int skip_code; + + /* + * Stop-code automatically set by EB Library. + */ + int auto_stop_code; + + /* + * The current candidate word for multi search. + */ + char candidate[EB_MAX_WORD_LENGTH + 1]; + + /* + * Whether the current text point is in the candidate word or not. + */ + int is_candidate; + + /* + * Whether the current text point is in EBXA-C gaiji area. + */ + int ebxac_gaiji_flag; +}; + +/* + * Context parameters for word search. + */ +struct EB_Search_Context_Struct { + /* + * Current search method type. + * The context is not active, if this code is EB_SEARCH_NONE. + */ + EB_Search_Code code; + + /* + * Function which compares word to search and pattern in an index page. + */ + int (*compare_pre)(const char *word, const char *pattern, + size_t length); + int (*compare_single)(const char *word, const char *pattern, + size_t length); + int (*compare_group)(const char *word, const char *pattern, + size_t length); + + /* + * Result of comparison by `compare'. + */ + int comparison_result; + + /* + * Word to search. + */ + char word[EB_MAX_WORD_LENGTH + 1]; + + /* + * Canonicalized word to search. + */ + char canonicalized_word[EB_MAX_WORD_LENGTH + 1]; + + /* + * Page which is searched currently. + */ + int page; + + /* + * Offset which is searched currently in the page. + */ + int offset; + + /* + * Page ID of the current page. + */ + int page_id; + + /* + * How many entries in the current page. + */ + int entry_count; + + /* + * Entry index pointer. + */ + int entry_index; + + /* + * Length of the current entry. + */ + int entry_length; + + /* + * Arrangement style of entries in the current page (fixed or variable). + */ + int entry_arrangement; + + /* + * In a group entry or not. + */ + int in_group_entry; + + /* + * Current heading position (for keyword search). + */ + EB_Position keyword_heading; +}; + +/* + * A book. + */ +struct EB_Book_Struct { + /* + * Book ID. + */ + EB_Book_Code code; + + /* + * Disc type. EB* or EPWING. + */ + EB_Disc_Code disc_code; + + /* + * Character code of the book. + */ + EB_Character_Code character_code; + + /* + * Path of the book. + */ + char *path; + + /* + * The length of the path. + */ + size_t path_length; + + /* + * The number of subbooks the book has. + */ + int subbook_count; + + /* + * Subbook list. + */ + EB_Subbook *subbooks; + + /* + * Current subbook. + */ + EB_Subbook *subbook_current; + + /* + * Context parameters for text reading. + */ + EB_Text_Context text_context; + + /* + * Context parameters for binary reading. + */ + EB_Binary_Context binary_context; + + /* + * Context parameters for text reading. + */ + EB_Search_Context search_contexts[EB_NUMBER_OF_SEARCH_CONTEXTS]; + + /* + * ebnet socket file. + */ +#ifdef EB_ENABLE_EBNET + int ebnet_file; +#endif + + /* + * Lock. + */ +#ifdef EB_ENABLE_PTHREAD + EB_Lock lock; +#endif +}; + +/* + * In a word search, heading and text locations of a matched entry + * are stored. + */ +struct EB_Hit_Struct { + /* + * Heading position. + */ + EB_Position heading; + + /* + * Text position. + */ + EB_Position text; +}; + +/* + * A text hook. + */ +struct EB_Hook_Struct { + /* + * Hook code. + */ + EB_Hook_Code code; + + /* + * Hook function for the hook code `code'. + */ + EB_Error_Code (*function)(EB_Book *book, EB_Appendix *appendix, + void *container, EB_Hook_Code hook_code, int argc, + const unsigned int *argv); +}; + +/* + * A set of text hooks. + */ +struct EB_Hookset_Struct { + /* + * List of hooks. + */ + EB_Hook hooks[EB_NUMBER_OF_HOOKS]; + + /* + * Lock. + */ +#ifdef EB_ENABLE_PTHREAD + EB_Lock lock; +#endif +}; + +/* + * An entry of book list. + */ +struct EB_BookList_Entry { + /* + * name. + */ + char *name; + + /* + * Title. + */ + char *title; +}; + +/* + * Book list. + */ +struct EB_BookList { + /* + * Book List ID. + */ + EB_Book_Code code; + + /* + * The number of book entries this list has. + */ + int entry_count; + + /* + * The maximum number of book entries that `entries' can memory. + */ + int max_entry_count; + + /* + * Book entries. + */ + EB_BookList_Entry *entries; + + /* + * Lock. + */ +#ifdef EB_ENABLE_PTHREAD + EB_Lock lock; +#endif +}; + +/* for backward compatibility */ +#define EB_Multi_Entry_Code int + +#ifdef __cplusplus +} +#endif + +#endif /* not EB_DEFS_H */ diff -Nru goldendict-1.5.0~git20131003/winlibs/include/eb/eb.h goldendict-1.5.0~git20150923/winlibs/include/eb/eb.h --- goldendict-1.5.0~git20131003/winlibs/include/eb/eb.h 1970-01-01 00:00:00.000000000 +0000 +++ goldendict-1.5.0~git20150923/winlibs/include/eb/eb.h 2015-09-23 08:26:24.000000000 +0000 @@ -0,0 +1,155 @@ +/* -*- C -*- + * Copyright (c) 1997-2006 Motoyuki Kasahara + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the project nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE PROJECT AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE PROJECT OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#ifndef EB_EB_H +#define EB_EB_H + +#ifdef __cplusplus +extern "C" { +#endif + +#ifdef EB_BUILD_LIBRARY +#include "defs.h" +#else +#include +#endif + +#include + +/* + * Function declarations. + */ +/* book.c */ +void eb_initialize_book(EB_Book *book); +EB_Error_Code eb_bind(EB_Book *book, const char *path); +void eb_finalize_book(EB_Book *book); +int eb_is_bound(EB_Book *book); +EB_Error_Code eb_path(EB_Book *book, char *path); +EB_Error_Code eb_disc_type(EB_Book *book, EB_Disc_Code *disc_code); +EB_Error_Code eb_character_code(EB_Book *book, + EB_Character_Code *character_code); + +/* copyright.h */ +int eb_have_copyright(EB_Book *book); +EB_Error_Code eb_copyright(EB_Book *book, EB_Position *position); +EB_Error_Code eb_search_cross(EB_Book *book, + const char * const input_words[]); + +/* cross.c */ +int eb_have_cross_search(EB_Book *book); + +/* eb.c */ +EB_Error_Code eb_initialize_library(void); +void eb_finalize_library(void); + +/* endword.c */ +int eb_have_endword_search(EB_Book *book); +EB_Error_Code eb_search_endword(EB_Book *book, const char *input_word); + +/* exactword.c */ +int eb_have_exactword_search(EB_Book *book); +EB_Error_Code eb_search_exactword(EB_Book *book, const char *input_word); + +/* graphic.c */ +int eb_have_graphic_search(EB_Book *book); + +/* keyword.c */ +int eb_have_keyword_search(EB_Book *book); +EB_Error_Code eb_search_keyword(EB_Book *book, + const char * const input_words[]); + +/* lock.c */ +int eb_pthread_enabled(void); + +/* log.c */ +void eb_set_log_function(void (*function)(const char *message, va_list ap)); +void eb_enable_log(void); +void eb_disable_log(void); +void eb_log(const char *message, ...); +void eb_log_stderr(const char *message, va_list ap); + +/* menu.c */ +int eb_have_menu(EB_Book *book); +EB_Error_Code eb_menu(EB_Book *book, EB_Position *position); +int eb_have_image_menu(EB_Book *book); +EB_Error_Code eb_image_menu(EB_Book *book, EB_Position *position); + +/* multi.c */ +int eb_have_multi_search(EB_Book *book); +EB_Error_Code eb_multi_title(EB_Book *book, EB_Multi_Search_Code multi_id, + char *title); +EB_Error_Code eb_multi_search_list(EB_Book *book, + EB_Multi_Search_Code *search_list, int *search_count); +EB_Error_Code eb_multi_entry_count(EB_Book *book, + EB_Multi_Search_Code multi_id, int *entry_count); +EB_Error_Code eb_multi_entry_list(EB_Book *book, + EB_Multi_Search_Code multi_id, int *entry_list, int *entry_count); +EB_Error_Code eb_multi_entry_label(EB_Book *book, + EB_Multi_Search_Code multi_id, int entry_index, char *label); +int eb_multi_entry_have_candidates(EB_Book *book, + EB_Multi_Search_Code multi_id, int entry_index); +EB_Error_Code eb_multi_entry_candidates(EB_Book *book, + EB_Multi_Search_Code multi_id, int entry_index, EB_Position *position); +EB_Error_Code eb_search_multi(EB_Book *book, EB_Multi_Search_Code multi_id, + const char * const input_words[]); + +/* text.c */ +int eb_have_text(EB_Book *book); +EB_Error_Code eb_text(EB_Book *book, EB_Position *position); + +/* search.c */ +EB_Error_Code eb_hit_list(EB_Book *book, int max_hit_count, EB_Hit *hit_list, + int *hit_count); + +/* subbook.c */ +EB_Error_Code eb_load_all_subbooks(EB_Book *book); +EB_Error_Code eb_subbook_list(EB_Book *book, EB_Subbook_Code *subbook_list, + int *subbook_count); +EB_Error_Code eb_subbook(EB_Book *book, EB_Subbook_Code *subbook_code); +EB_Error_Code eb_subbook_title(EB_Book *book, char *title); +EB_Error_Code eb_subbook_title2(EB_Book *book, EB_Subbook_Code subbook_code, + char *title); +EB_Error_Code eb_subbook_directory(EB_Book *book, char *directory); +EB_Error_Code eb_subbook_directory2(EB_Book *book, + EB_Subbook_Code subbook_code, char *directory); +EB_Error_Code eb_set_subbook(EB_Book *book, EB_Subbook_Code subbook_code); +void eb_unset_subbook(EB_Book *book); + +/* word.c */ +int eb_have_word_search(EB_Book *book); +EB_Error_Code eb_search_word(EB_Book *book, const char *input_word); + +/* for backward compatibility */ +#define eb_suspend eb_unset_subbook +#define eb_initialize_all_subbooks eb_load_all_subbooks + +#ifdef __cplusplus +} +#endif + +#endif /* not EB_EB_H */ diff -Nru goldendict-1.5.0~git20131003/winlibs/include/eb/error.h goldendict-1.5.0~git20150923/winlibs/include/eb/error.h --- goldendict-1.5.0~git20131003/winlibs/include/eb/error.h 1970-01-01 00:00:00.000000000 +0000 +++ goldendict-1.5.0~git20150923/winlibs/include/eb/error.h 2015-09-23 08:26:24.000000000 +0000 @@ -0,0 +1,150 @@ +/* -*- C -*- + * Copyright (c) 1997-2006 Motoyuki Kasahara + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the project nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE PROJECT AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE PROJECT OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#ifndef EB_ERROR_H +#define EB_ERROR_H + +#ifdef __cplusplus +extern "C" { +#endif + +#ifdef EB_BUILD_LIBRARY +#include "defs.h" +#else +#include +#endif + +/* + * Error codes. + */ +#define EB_SUCCESS 0 +#define EB_ERR_MEMORY_EXHAUSTED 1 +#define EB_ERR_EMPTY_FILE_NAME 2 +#define EB_ERR_TOO_LONG_FILE_NAME 3 +#define EB_ERR_BAD_FILE_NAME 4 + +#define EB_ERR_BAD_DIR_NAME 5 +#define EB_ERR_TOO_LONG_WORD 6 +#define EB_ERR_BAD_WORD 7 +#define EB_ERR_EMPTY_WORD 8 +#define EB_ERR_FAIL_GETCWD 9 + +#define EB_ERR_FAIL_OPEN_CAT 10 +#define EB_ERR_FAIL_OPEN_CATAPP 11 +#define EB_ERR_FAIL_OPEN_TEXT 12 +#define EB_ERR_FAIL_OPEN_FONT 13 +#define EB_ERR_FAIL_OPEN_APP 14 + +#define EB_ERR_FAIL_OPEN_BINARY 15 +#define EB_ERR_FAIL_READ_CAT 16 +#define EB_ERR_FAIL_READ_CATAPP 17 +#define EB_ERR_FAIL_READ_TEXT 18 +#define EB_ERR_FAIL_READ_FONT 19 + +#define EB_ERR_FAIL_READ_APP 20 +#define EB_ERR_FAIL_READ_BINARY 21 +#define EB_ERR_FAIL_SEEK_CAT 22 +#define EB_ERR_FAIL_SEEK_CATAPP 23 +#define EB_ERR_FAIL_SEEK_TEXT 24 + +#define EB_ERR_FAIL_SEEK_FONT 25 +#define EB_ERR_FAIL_SEEK_APP 26 +#define EB_ERR_FAIL_SEEK_BINARY 27 +#define EB_ERR_UNEXP_CAT 28 +#define EB_ERR_UNEXP_CATAPP 29 + +#define EB_ERR_UNEXP_TEXT 30 +#define EB_ERR_UNEXP_FONT 31 +#define EB_ERR_UNEXP_APP 32 +#define EB_ERR_UNEXP_BINARY 33 +#define EB_ERR_UNBOUND_BOOK 34 + +#define EB_ERR_UNBOUND_APP 35 +#define EB_ERR_NO_SUB 36 +#define EB_ERR_NO_APPSUB 37 +#define EB_ERR_NO_FONT 38 +#define EB_ERR_NO_TEXT 39 + +#define EB_ERR_NO_STOPCODE 40 +#define EB_ERR_NO_ALT 41 +#define EB_ERR_NO_CUR_SUB 42 +#define EB_ERR_NO_CUR_APPSUB 43 +#define EB_ERR_NO_CUR_FONT 44 + +#define EB_ERR_NO_CUR_BINARY 45 +#define EB_ERR_NO_SUCH_SUB 46 +#define EB_ERR_NO_SUCH_APPSUB 47 +#define EB_ERR_NO_SUCH_FONT 48 +#define EB_ERR_NO_SUCH_CHAR_BMP 49 + +#define EB_ERR_NO_SUCH_CHAR_TEXT 50 +#define EB_ERR_NO_SUCH_SEARCH 51 +#define EB_ERR_NO_SUCH_HOOK 52 +#define EB_ERR_NO_SUCH_BINARY 53 +#define EB_ERR_DIFF_CONTENT 54 + +#define EB_ERR_NO_PREV_SEARCH 55 +#define EB_ERR_NO_SUCH_MULTI_ID 56 +#define EB_ERR_NO_SUCH_ENTRY_ID 57 +#define EB_ERR_TOO_MANY_WORDS 58 +#define EB_ERR_NO_WORD 59 + +#define EB_ERR_NO_CANDIDATES 60 +#define EB_ERR_END_OF_CONTENT 61 +#define EB_ERR_NO_PREV_SEEK 62 +#define EB_ERR_EBNET_UNSUPPORTED 63 +#define EB_ERR_EBNET_FAIL_CONNECT 64 + +#define EB_ERR_EBNET_SERVER_BUSY 65 +#define EB_ERR_EBNET_NO_PERMISSION 66 +#define EB_ERR_UNBOUND_BOOKLIST 67 +#define EB_ERR_NO_SUCH_BOOK 68 + + +/* + * The number of error codes. + */ +#define EB_NUMBER_OF_ERRORS 69 + +/* + * The maximum length of an error message. + */ +#define EB_MAX_ERROR_MESSAGE_LENGTH 127 + +/* + * Function declarations. + */ +/* error.c */ +const char *eb_error_string(EB_Error_Code error_code); +const char *eb_error_message(EB_Error_Code error_code); + +#ifdef __cplusplus +} +#endif + +#endif /* not EB_ERROR_H */ diff -Nru goldendict-1.5.0~git20131003/winlibs/include/eb/font.h goldendict-1.5.0~git20150923/winlibs/include/eb/font.h --- goldendict-1.5.0~git20131003/winlibs/include/eb/font.h 1970-01-01 00:00:00.000000000 +0000 +++ goldendict-1.5.0~git20150923/winlibs/include/eb/font.h 2015-09-23 08:26:24.000000000 +0000 @@ -0,0 +1,200 @@ +/* -*- C -*- + * Copyright (c) 1997-2006 Motoyuki Kasahara + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the project nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE PROJECT AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE PROJECT OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#ifndef EB_FONT_H +#define EB_FONT_H + +#ifdef __cplusplus +extern "C" { +#endif + +#include + +#ifdef EB_BUILD_LIBRARY +#include "defs.h" +#else +#include +#endif + +/* + * Font types. + */ +#define EB_FONT_16 0 +#define EB_FONT_24 1 +#define EB_FONT_30 2 +#define EB_FONT_48 3 +#define EB_FONT_INVALID -1 + +/* + * Font sizes. + */ +#define EB_SIZE_NARROW_FONT_16 16 +#define EB_SIZE_WIDE_FONT_16 32 +#define EB_SIZE_NARROW_FONT_24 48 +#define EB_SIZE_WIDE_FONT_24 72 +#define EB_SIZE_NARROW_FONT_30 60 +#define EB_SIZE_WIDE_FONT_30 120 +#define EB_SIZE_NARROW_FONT_48 144 +#define EB_SIZE_WIDE_FONT_48 288 + +/* + * Font width. + */ +#define EB_WIDTH_NARROW_FONT_16 8 +#define EB_WIDTH_WIDE_FONT_16 16 +#define EB_WIDTH_NARROW_FONT_24 16 +#define EB_WIDTH_WIDE_FONT_24 24 +#define EB_WIDTH_NARROW_FONT_30 16 +#define EB_WIDTH_WIDE_FONT_30 32 +#define EB_WIDTH_NARROW_FONT_48 24 +#define EB_WIDTH_WIDE_FONT_48 48 + +/* + * Font height. + */ +#define EB_HEIGHT_FONT_16 16 +#define EB_HEIGHT_FONT_24 24 +#define EB_HEIGHT_FONT_30 30 +#define EB_HEIGHT_FONT_48 48 + +/* + * Bitmap image sizes. + */ +#define EB_SIZE_NARROW_FONT_16_XBM 184 +#define EB_SIZE_WIDE_FONT_16_XBM 284 +#define EB_SIZE_NARROW_FONT_16_XPM 266 +#define EB_SIZE_WIDE_FONT_16_XPM 395 +#define EB_SIZE_NARROW_FONT_16_GIF 186 +#define EB_SIZE_WIDE_FONT_16_GIF 314 +#define EB_SIZE_NARROW_FONT_16_BMP 126 +#define EB_SIZE_WIDE_FONT_16_BMP 126 +#define EB_SIZE_NARROW_FONT_16_PNG 131 +#define EB_SIZE_WIDE_FONT_16_PNG 147 + +#define EB_SIZE_NARROW_FONT_24_XBM 383 +#define EB_SIZE_WIDE_FONT_24_XBM 533 +#define EB_SIZE_NARROW_FONT_24_XPM 555 +#define EB_SIZE_WIDE_FONT_24_XPM 747 +#define EB_SIZE_NARROW_FONT_24_GIF 450 +#define EB_SIZE_WIDE_FONT_24_GIF 642 +#define EB_SIZE_NARROW_FONT_24_BMP 158 +#define EB_SIZE_WIDE_FONT_24_BMP 158 +#define EB_SIZE_NARROW_FONT_24_PNG 171 +#define EB_SIZE_WIDE_FONT_24_PNG 195 + +#define EB_SIZE_NARROW_FONT_30_XBM 458 +#define EB_SIZE_WIDE_FONT_30_XBM 833 +#define EB_SIZE_NARROW_FONT_30_XPM 675 +#define EB_SIZE_WIDE_FONT_30_XPM 1155 +#define EB_SIZE_NARROW_FONT_30_GIF 552 +#define EB_SIZE_WIDE_FONT_30_GIF 1032 +#define EB_SIZE_NARROW_FONT_30_BMP 182 +#define EB_SIZE_WIDE_FONT_30_BMP 182 +#define EB_SIZE_NARROW_FONT_30_PNG 189 +#define EB_SIZE_WIDE_FONT_30_PNG 249 + +#define EB_SIZE_NARROW_FONT_48_XBM 983 +#define EB_SIZE_WIDE_FONT_48_XBM 1883 +#define EB_SIZE_NARROW_FONT_48_XPM 1419 +#define EB_SIZE_WIDE_FONT_48_XPM 2571 +#define EB_SIZE_NARROW_FONT_48_GIF 1242 +#define EB_SIZE_WIDE_FONT_48_GIF 2394 +#define EB_SIZE_NARROW_FONT_48_BMP 254 +#define EB_SIZE_WIDE_FONT_48_BMP 446 +#define EB_SIZE_NARROW_FONT_48_PNG 291 +#define EB_SIZE_WIDE_FONT_48_PNG 435 + +#define EB_SIZE_FONT_IMAGE EB_SIZE_WIDE_FONT_48_XPM + +/* + * Function declarations. + */ +/* bitmap.c */ +EB_Error_Code eb_narrow_font_xbm_size(EB_Font_Code font_code, size_t *size); +EB_Error_Code eb_narrow_font_xpm_size(EB_Font_Code font_code, size_t *size); +EB_Error_Code eb_narrow_font_gif_size(EB_Font_Code font_code, size_t *size); +EB_Error_Code eb_narrow_font_bmp_size(EB_Font_Code font_code, size_t *size); +EB_Error_Code eb_narrow_font_png_size(EB_Font_Code font_code, size_t *size); +EB_Error_Code eb_wide_font_xbm_size(EB_Font_Code font_code, size_t *size); +EB_Error_Code eb_wide_font_xpm_size(EB_Font_Code font_code, size_t *size); +EB_Error_Code eb_wide_font_gif_size(EB_Font_Code font_code, size_t *size); +EB_Error_Code eb_wide_font_bmp_size(EB_Font_Code font_code, size_t *size); +EB_Error_Code eb_wide_font_png_size(EB_Font_Code font_code, size_t *size); +EB_Error_Code eb_bitmap_to_xbm(const char *bitmap, int width, int height, + char *xbm, size_t *xbm_length); +EB_Error_Code eb_bitmap_to_xpm(const char *bitmap, int width, int height, + char *xpm, size_t *xpm_length); +EB_Error_Code eb_bitmap_to_gif(const char *bitmap, int width, int height, + char *gif, size_t *gif_length); +EB_Error_Code eb_bitmap_to_bmp(const char *bitmap, int width, int height, + char *bmp, size_t *bmp_length); +EB_Error_Code eb_bitmap_to_png(const char *bitmap, int width, int height, + char *png, size_t *png_length); + +/* font.c */ +EB_Error_Code eb_font(EB_Book *book, EB_Font_Code *font_code); +EB_Error_Code eb_set_font(EB_Book *book, EB_Font_Code font_code); +void eb_unset_font(EB_Book *book); +EB_Error_Code eb_font_list(EB_Book *book, EB_Font_Code *font_list, + int *font_count); +int eb_have_font(EB_Book *book, EB_Font_Code font_code); +EB_Error_Code eb_font_height(EB_Book *book, int *height); +EB_Error_Code eb_font_height2(EB_Font_Code font_code, int *height); + +/* narwfont.c */ +int eb_have_narrow_font(EB_Book *book); +EB_Error_Code eb_narrow_font_width(EB_Book *book, int *width); +EB_Error_Code eb_narrow_font_width2(EB_Font_Code font_code, int *width); +EB_Error_Code eb_narrow_font_size(EB_Book *book, size_t *size); +EB_Error_Code eb_narrow_font_size2(EB_Font_Code font_code, size_t *size); +EB_Error_Code eb_narrow_font_start(EB_Book *book, int *start); +EB_Error_Code eb_narrow_font_end(EB_Book *book, int *end); +EB_Error_Code eb_narrow_font_character_bitmap(EB_Book *book, int, char *); +EB_Error_Code eb_forward_narrow_font_character(EB_Book *book, int, int *); +EB_Error_Code eb_backward_narrow_font_character(EB_Book *book, int, int *); + +/* widefont.c */ +int eb_have_wide_font(EB_Book *book); +EB_Error_Code eb_wide_font_width(EB_Book *book, int *width); +EB_Error_Code eb_wide_font_width2(EB_Font_Code font_code, int *width); +EB_Error_Code eb_wide_font_size(EB_Book *book, size_t *size); +EB_Error_Code eb_wide_font_size2(EB_Font_Code font_code, size_t *size); +EB_Error_Code eb_wide_font_start(EB_Book *book, int *start); +EB_Error_Code eb_wide_font_end(EB_Book *book, int *end); +EB_Error_Code eb_wide_font_character_bitmap(EB_Book *book, + int character_number, char *bitmap); +EB_Error_Code eb_forward_wide_font_character(EB_Book *book, int n, + int *character_number); +EB_Error_Code eb_backward_wide_font_character(EB_Book *book, int n, + int *character_number); + +#ifdef __cplusplus +} +#endif + +#endif /* not EB_FONT_H */ diff -Nru goldendict-1.5.0~git20131003/winlibs/include/eb/sysdefs.h goldendict-1.5.0~git20150923/winlibs/include/eb/sysdefs.h --- goldendict-1.5.0~git20131003/winlibs/include/eb/sysdefs.h 1970-01-01 00:00:00.000000000 +0000 +++ goldendict-1.5.0~git20150923/winlibs/include/eb/sysdefs.h 2015-09-23 08:26:24.000000000 +0000 @@ -0,0 +1,4 @@ +/* automatically generated by Makefile. */ +#define EB_VERSION_STRING "4.4.3" +#define EB_VERSION_MAJOR 4 +#define EB_VERSION_MINOR 4 diff -Nru goldendict-1.5.0~git20131003/winlibs/include/eb/text.h goldendict-1.5.0~git20150923/winlibs/include/eb/text.h --- goldendict-1.5.0~git20131003/winlibs/include/eb/text.h 1970-01-01 00:00:00.000000000 +0000 +++ goldendict-1.5.0~git20150923/winlibs/include/eb/text.h 2015-09-23 08:26:24.000000000 +0000 @@ -0,0 +1,166 @@ +/* -*- C -*- + * Copyright (c) 1997-2006 Motoyuki Kasahara + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the project nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE PROJECT AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE PROJECT OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#ifndef EB_TEXT_H +#define EB_TEXT_H + +#ifdef __cplusplus +extern "C" { +#endif + +#include + +#ifdef EB_BUILD_LIBRARY +#include "defs.h" +#else +#include +#endif + +/* + * Hook codes. + * (When you add or remove a hook, update EB_NUMER_OF_HOOKS in defs.h.) + */ +#define EB_HOOK_NULL -1 +#define EB_HOOK_INITIALIZE 0 +#define EB_HOOK_BEGIN_NARROW 1 +#define EB_HOOK_END_NARROW 2 +#define EB_HOOK_BEGIN_SUBSCRIPT 3 +#define EB_HOOK_END_SUBSCRIPT 4 + +#define EB_HOOK_SET_INDENT 5 +#define EB_HOOK_NEWLINE 6 +#define EB_HOOK_BEGIN_SUPERSCRIPT 7 +#define EB_HOOK_END_SUPERSCRIPT 8 +#define EB_HOOK_BEGIN_NO_NEWLINE 9 + +#define EB_HOOK_END_NO_NEWLINE 10 +#define EB_HOOK_BEGIN_EMPHASIS 11 +#define EB_HOOK_END_EMPHASIS 12 +#define EB_HOOK_BEGIN_CANDIDATE 13 +#define EB_HOOK_END_CANDIDATE_GROUP 14 + +#define EB_HOOK_END_CANDIDATE_LEAF 15 +#define EB_HOOK_BEGIN_REFERENCE 16 +#define EB_HOOK_END_REFERENCE 17 +#define EB_HOOK_BEGIN_KEYWORD 18 +#define EB_HOOK_END_KEYWORD 19 + +#define EB_HOOK_NARROW_FONT 20 +#define EB_HOOK_WIDE_FONT 21 +#define EB_HOOK_ISO8859_1 22 +#define EB_HOOK_NARROW_JISX0208 23 +#define EB_HOOK_WIDE_JISX0208 24 + +#define EB_HOOK_GB2312 25 +#define EB_HOOK_BEGIN_MONO_GRAPHIC 26 +#define EB_HOOK_END_MONO_GRAPHIC 27 +#define EB_HOOK_BEGIN_GRAY_GRAPHIC 28 +#define EB_HOOK_END_GRAY_GRAPHIC 29 + +#define EB_HOOK_BEGIN_COLOR_BMP 30 +#define EB_HOOK_BEGIN_COLOR_JPEG 31 +#define EB_HOOK_BEGIN_IN_COLOR_BMP 32 +#define EB_HOOK_BEGIN_IN_COLOR_JPEG 33 +#define EB_HOOK_END_COLOR_GRAPHIC 34 + +#define EB_HOOK_END_IN_COLOR_GRAPHIC 35 +#define EB_HOOK_BEGIN_WAVE 36 +#define EB_HOOK_END_WAVE 37 +#define EB_HOOK_BEGIN_MPEG 38 +#define EB_HOOK_END_MPEG 39 + +#define EB_HOOK_BEGIN_GRAPHIC_REFERENCE 40 +#define EB_HOOK_END_GRAPHIC_REFERENCE 41 +#define EB_HOOK_GRAPHIC_REFERENCE 42 +#define EB_HOOK_BEGIN_DECORATION 43 +#define EB_HOOK_END_DECORATION 44 + +#define EB_HOOK_BEGIN_IMAGE_PAGE 45 +#define EB_HOOK_END_IMAGE_PAGE 46 +#define EB_HOOK_BEGIN_CLICKABLE_AREA 47 +#define EB_HOOK_END_CLICKABLE_AREA 48 + +#define EB_HOOK_BEGIN_UNICODE 49 +#define EB_HOOK_END_UNICODE 50 +#define EB_HOOK_BEGIN_EBXAC_GAIJI 51 +#define EB_HOOK_END_EBXAC_GAIJI 52 +#define EB_HOOK_EBXAC_GAIJI 53 + +/* + * Function declarations. + */ +/* hook.c */ +void eb_initialize_hookset(EB_Hookset *hookset); +void eb_finalize_hookset(EB_Hookset *hookset); +EB_Error_Code eb_set_hook(EB_Hookset *hookset, const EB_Hook *hook); +EB_Error_Code eb_set_hooks(EB_Hookset *hookset, const EB_Hook *hook); +EB_Error_Code eb_hook_euc_to_ascii(EB_Book *book, EB_Appendix *appendix, + void *container, EB_Hook_Code hook_code, int argc, + const unsigned int *argv); +EB_Error_Code eb_hook_stop_code(EB_Book *book, EB_Appendix *appendix, + void *container, EB_Hook_Code hook_code, int argc, + const unsigned int *argv); +EB_Error_Code eb_hook_narrow_character_text(EB_Book *book, + EB_Appendix *appendix, void *container, EB_Hook_Code hook_code, int argc, + const unsigned int *argv); +EB_Error_Code eb_hook_wide_character_text(EB_Book *book, + EB_Appendix *appendix, void *container, EB_Hook_Code hook_code, int argc, + const unsigned int *argv); +EB_Error_Code eb_hook_newline(EB_Book *book, EB_Appendix *appendix, + void *container, EB_Hook_Code hook_code, int argc, + const unsigned int *argv); +EB_Error_Code eb_hook_empty(EB_Book *book, EB_Appendix *appendix, + void *container, EB_Hook_Code hook_code, int argc, + const unsigned int *argv); + +/* readtext.c */ +EB_Error_Code eb_seek_text(EB_Book *book, const EB_Position *position); +EB_Error_Code eb_tell_text(EB_Book *book, EB_Position *position); +EB_Error_Code eb_read_text(EB_Book *book, EB_Appendix *appendix, + EB_Hookset *hookset, void *container, size_t text_max_length, char *text, + ssize_t *text_length); +EB_Error_Code eb_read_heading(EB_Book *book, EB_Appendix *appendix, + EB_Hookset *hookset, void *container, size_t text_max_length, char *text, + ssize_t *text_length); +EB_Error_Code eb_read_rawtext(EB_Book *book, size_t text_max_length, + char *text, ssize_t *text_length); +int eb_is_text_stopped(EB_Book *book); +EB_Error_Code eb_write_text_byte1(EB_Book *book, int byte1); +EB_Error_Code eb_write_text_byte2(EB_Book *book, int byte1, int byte2); +EB_Error_Code eb_write_text_string(EB_Book *book, const char *string); +EB_Error_Code eb_write_text(EB_Book *book, const char * stream, + size_t stream_length); +const char *eb_current_candidate(EB_Book *book); +EB_Error_Code eb_forward_text(EB_Book *book, EB_Appendix *appendix); +EB_Error_Code eb_backward_text(EB_Book *book, EB_Appendix *appendix); + +#ifdef __cplusplus +} +#endif + +#endif /* not EB_TEXT_H */ diff -Nru goldendict-1.5.0~git20131003/winlibs/include/eb/zio.h goldendict-1.5.0~git20150923/winlibs/include/eb/zio.h --- goldendict-1.5.0~git20131003/winlibs/include/eb/zio.h 1970-01-01 00:00:00.000000000 +0000 +++ goldendict-1.5.0~git20150923/winlibs/include/eb/zio.h 2015-09-23 08:26:24.000000000 +0000 @@ -0,0 +1,237 @@ +/* -*- C -*- + * Copyright (c) 2001-2006 Motoyuki Kasahara + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the project nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE PROJECT AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE PROJECT OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#ifndef ZIO_H +#define ZIO_H + +#ifdef __cplusplus +extern "C" { +#endif + +#include +#include + +/* + * Header size of the ebzip compression file. + */ +#define ZIO_SIZE_EBZIP_HEADER 22 + +/* + * Margin size for ebzip compression buffer. + * (Since compressed data is larger than original in the worst case, + * we must add margin to a compression buffer.) + */ +#define ZIO_SIZE_EBZIP_MARGIN 1024 + +/* + * Maximum ebzio compression level. + */ +#define ZIO_MAX_EBZIP_LEVEL 5 + +/* + * Huffman node types. + */ +#define ZIO_HUFFMAN_NODE_INTERMEDIATE 0 +#define ZIO_HUFFMAN_NODE_EOF 1 +#define ZIO_HUFFMAN_NODE_LEAF8 2 +#define ZIO_HUFFMAN_NODE_LEAF16 3 +#define ZIO_HUFFMAN_NODE_LEAF32 4 + +/* + * Compression type codes. + */ +#define ZIO_PLAIN 0 +#define ZIO_EBZIP1 1 +#define ZIO_EPWING 2 +#define ZIO_EPWING6 3 +#define ZIO_SEBXA 4 +#define ZIO_INVALID -1 +#define ZIO_REOPEN -2 + +/* + * Compression type. + */ +typedef int Zio_Code; + +/* + * A node of static Huffman tree. + */ +typedef struct Zio_Huffman_Node_Struct Zio_Huffman_Node; + +struct Zio_Huffman_Node_Struct { + /* + * node type (ITNERMEDIATE, LEAF8, LEAF16, LEAF32 or EOF). + */ + int type; + + /* + * Value of a leaf node. + */ + unsigned int value; + + /* + * Frequency of a node. + */ + int frequency; + + /* + * Left child. + */ + Zio_Huffman_Node *left; + + /* + * Right child. + */ + Zio_Huffman_Node *right; +}; + +/* + * Compression information of a book. + */ +typedef struct Zio_Struct Zio; + +struct Zio_Struct { + /* + * ID. + */ + int id; + + /* + * Zio type. (PLAIN, EBZIP, EPWING, EPWING6 or SEBXA) + */ + Zio_Code code; + + /* + * File descriptor. + */ + int file; + + /* + * Current location. + */ + off_t location; + + /* + * Size of an uncompressed file. + */ + off_t file_size; + + /* + * Slice size of an EBZIP compressed file. + */ + size_t slice_size; + + /* + * Compression level. (EBZIP compression only) + */ + int zip_level; + + /* + * Length of an index. (EBZIP compression only) + */ + int index_width; + + /* + * Adler-32 check sum of an uncompressed file. (EBZIP compression only) + */ + unsigned int crc; + + /* + * mtime of an uncompressed file. (EBZIP compression only) + */ + time_t mtime; + + /* + * Location of an index table. (EPWING and S-EBXA compression only) + */ + off_t index_location; + + /* + * Length of an index table. (EPWING and S-EBXA compression only) + */ + size_t index_length; + + /* + * Location of a frequency table. (EPWING compression only) + */ + off_t frequencies_location; + + /* + * Length of a frequency table. (EPWING compression only) + */ + size_t frequencies_length; + + /* + * Huffman tree nodes. (EPWING compression only) + */ + Zio_Huffman_Node *huffman_nodes; + + /* + * Root node of a Huffman tree. (EPWING compression only) + */ + Zio_Huffman_Node *huffman_root; + + /* + * Region of compressed pages. (S-EBXA compression only) + */ + off_t zio_start_location; + off_t zio_end_location; + + /* + * Add this value to offset written in index. (S-EBXA compression only) + */ + off_t index_base; + + /* + * ebnet mode flag. + */ + int is_ebnet; +}; + +/* + * Function declarations. + */ +/* zio.c */ +int zio_initialize_library(void); +void zio_finalize_library(void); +void zio_initialize(Zio *zio); +void zio_finalize(Zio *zio); +int zio_set_sebxa_mode(Zio *zio, off_t index_location, off_t index_base, + off_t zio_start_location, off_t zio_end_location); +int zio_open(Zio *zio, const char *file_name, Zio_Code zio_code); +void zio_close(Zio *zio); +int zio_file(Zio *zio); +Zio_Code zio_mode(Zio *zio); +off_t zio_lseek(Zio *zio, off_t offset, int whence); +ssize_t zio_read(Zio *zio, char *buffer, size_t length); + +#ifdef __cplusplus +} +#endif + +#endif /* not ZIO_H */ diff -Nru goldendict-1.5.0~git20131003/winlibs/include/tiff/tiffconf.h goldendict-1.5.0~git20150923/winlibs/include/tiff/tiffconf.h --- goldendict-1.5.0~git20131003/winlibs/include/tiff/tiffconf.h 1970-01-01 00:00:00.000000000 +0000 +++ goldendict-1.5.0~git20150923/winlibs/include/tiff/tiffconf.h 2015-09-23 08:26:24.000000000 +0000 @@ -0,0 +1,128 @@ +/* libtiff/tiffconf.h. Generated from tiffconf.h.in by configure. */ +/* + Configuration defines for installed libtiff. + This file maintained for backward compatibility. Do not use definitions + from this file in your programs. +*/ + +#ifndef _TIFFCONF_ +#define _TIFFCONF_ + +/* Signed 16-bit type */ +#define TIFF_INT16_T signed short + +/* Signed 32-bit type */ +#define TIFF_INT32_T signed int + +/* Signed 64-bit type */ +#define TIFF_INT64_T signed long long + +/* Signed 8-bit type */ +#define TIFF_INT8_T signed char + +/* Unsigned 16-bit type */ +#define TIFF_UINT16_T unsigned short + +/* Unsigned 32-bit type */ +#define TIFF_UINT32_T unsigned int + +/* Unsigned 64-bit type */ +#define TIFF_UINT64_T unsigned long long + +/* Unsigned 8-bit type */ +#define TIFF_UINT8_T unsigned char + +/* Signed size type */ +#define TIFF_SSIZE_T signed long + +/* Pointer difference type */ +#define TIFF_PTRDIFF_T ptrdiff_t + +/* Define to 1 if the system has the type `int16'. */ +/* #undef HAVE_INT16 */ + +/* Define to 1 if the system has the type `int32'. */ +/* #undef HAVE_INT32 */ + +/* Define to 1 if the system has the type `int8'. */ +/* #undef HAVE_INT8 */ + +/* Compatibility stuff. */ + +/* Define as 0 or 1 according to the floating point format suported by the + machine */ +#define HAVE_IEEEFP 1 + +/* Set the native cpu bit order (FILLORDER_LSB2MSB or FILLORDER_MSB2LSB) */ +#define HOST_FILLORDER FILLORDER_LSB2MSB + +/* Native cpu byte order: 1 if big-endian (Motorola) or 0 if little-endian + (Intel) */ +#define HOST_BIGENDIAN 0 + +/* Support CCITT Group 3 & 4 algorithms */ +#define CCITT_SUPPORT 1 + +/* Support JPEG compression (requires IJG JPEG library) */ +/* #undef JPEG_SUPPORT */ + +/* Support JBIG compression (requires JBIG-KIT library) */ +/* #undef JBIG_SUPPORT */ + +/* Support LogLuv high dynamic range encoding */ +#define LOGLUV_SUPPORT 1 + +/* Support LZW algorithm */ +#define LZW_SUPPORT 1 + +/* Support NeXT 2-bit RLE algorithm */ +#define NEXT_SUPPORT 1 + +/* Support Old JPEG compresson (read contrib/ojpeg/README first! Compilation + fails with unpatched IJG JPEG library) */ +/* #undef OJPEG_SUPPORT */ + +/* Support Macintosh PackBits algorithm */ +#define PACKBITS_SUPPORT 1 + +/* Support Pixar log-format algorithm (requires Zlib) */ +#define PIXARLOG_SUPPORT 1 + +/* Support ThunderScan 4-bit RLE algorithm */ +#define THUNDER_SUPPORT 1 + +/* Support Deflate compression */ +#define ZIP_SUPPORT 1 + +/* Support strip chopping (whether or not to convert single-strip uncompressed + images to mutiple strips of ~8Kb to reduce memory usage) */ +#define STRIPCHOP_DEFAULT TIFF_STRIPCHOP + +/* Enable SubIFD tag (330) support */ +#define SUBIFD_SUPPORT 1 + +/* Treat extra sample as alpha (default enabled). The RGBA interface will + treat a fourth sample with no EXTRASAMPLE_ value as being ASSOCALPHA. Many + packages produce RGBA files but don't mark the alpha properly. */ +#define DEFAULT_EXTRASAMPLE_AS_ALPHA 1 + +/* Pick up YCbCr subsampling info from the JPEG data stream to support files + lacking the tag (default enabled). */ +#define CHECK_JPEG_YCBCR_SUBSAMPLING 1 + +/* Support MS MDI magic number files as TIFF */ +#define MDI_SUPPORT 1 + +/* + * Feature support definitions. + * XXX: These macros are obsoleted. Don't use them in your apps! + * Macros stays here for backward compatibility and should be always defined. + */ +#define COLORIMETRY_SUPPORT +#define YCBCR_SUPPORT +#define CMYK_SUPPORT +#define ICC_SUPPORT +#define PHOTOSHOP_SUPPORT +#define IPTC_SUPPORT + +#endif /* _TIFFCONF_ */ diff -Nru goldendict-1.5.0~git20131003/winlibs/include/tiff/tiff.h goldendict-1.5.0~git20150923/winlibs/include/tiff/tiff.h --- goldendict-1.5.0~git20131003/winlibs/include/tiff/tiff.h 1970-01-01 00:00:00.000000000 +0000 +++ goldendict-1.5.0~git20150923/winlibs/include/tiff/tiff.h 2015-09-23 08:26:24.000000000 +0000 @@ -0,0 +1,678 @@ +/* $Id: tiff.h,v 1.68 2012-08-19 16:56:35 bfriesen Exp $ */ + +/* + * Copyright (c) 1988-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. + * + * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND, + * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY + * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. + * + * IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR + * ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND, + * OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, + * WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF + * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE + * OF THIS SOFTWARE. + */ + +#ifndef _TIFF_ +#define _TIFF_ + +#include "tiffconf.h" + +/* + * Tag Image File Format (TIFF) + * + * Based on Rev 6.0 from: + * Developer's Desk + * Aldus Corporation + * 411 First Ave. South + * Suite 200 + * Seattle, WA 98104 + * 206-622-5500 + * + * (http://partners.adobe.com/asn/developer/PDFS/TN/TIFF6.pdf) + * + * For BigTIFF design notes see the following links + * http://www.remotesensing.org/libtiff/bigtiffdesign.html + * http://www.awaresystems.be/imaging/tiff/bigtiff.html + */ + +#define TIFF_VERSION_CLASSIC 42 +#define TIFF_VERSION_BIG 43 + +#define TIFF_BIGENDIAN 0x4d4d +#define TIFF_LITTLEENDIAN 0x4949 +#define MDI_LITTLEENDIAN 0x5045 +#define MDI_BIGENDIAN 0x4550 + +/* + * Intrinsic data types required by the file format: + * + * 8-bit quantities int8/uint8 + * 16-bit quantities int16/uint16 + * 32-bit quantities int32/uint32 + * 64-bit quantities int64/uint64 + * strings unsigned char* + */ + +typedef TIFF_INT8_T int8; +typedef TIFF_UINT8_T uint8; + +typedef TIFF_INT16_T int16; +typedef TIFF_UINT16_T uint16; + +typedef TIFF_INT32_T int32; +typedef TIFF_UINT32_T uint32; + +typedef TIFF_INT64_T int64; +typedef TIFF_UINT64_T uint64; + +/* + * Some types as promoted in a variable argument list + * We use uint16_vap rather then directly using int, because this way + * we document the type we actually want to pass through, conceptually, + * rather then confusing the issue by merely stating the type it gets + * promoted to + */ + +typedef int uint16_vap; + +/* + * TIFF header. + */ +typedef struct { + uint16 tiff_magic; /* magic number (defines byte order) */ + uint16 tiff_version; /* TIFF version number */ +} TIFFHeaderCommon; +typedef struct { + uint16 tiff_magic; /* magic number (defines byte order) */ + uint16 tiff_version; /* TIFF version number */ + uint32 tiff_diroff; /* byte offset to first directory */ +} TIFFHeaderClassic; +typedef struct { + uint16 tiff_magic; /* magic number (defines byte order) */ + uint16 tiff_version; /* TIFF version number */ + uint16 tiff_offsetsize; /* size of offsets, should be 8 */ + uint16 tiff_unused; /* unused word, should be 0 */ + uint64 tiff_diroff; /* byte offset to first directory */ +} TIFFHeaderBig; + + +/* + * NB: In the comments below, + * - items marked with a + are obsoleted by revision 5.0, + * - items marked with a ! are introduced in revision 6.0. + * - items marked with a % are introduced post revision 6.0. + * - items marked with a $ are obsoleted by revision 6.0. + * - items marked with a & are introduced by Adobe DNG specification. + */ + +/* + * Tag data type information. + * + * Note: RATIONALs are the ratio of two 32-bit integer values. + */ +typedef enum { + TIFF_NOTYPE = 0, /* placeholder */ + TIFF_BYTE = 1, /* 8-bit unsigned integer */ + TIFF_ASCII = 2, /* 8-bit bytes w/ last byte null */ + TIFF_SHORT = 3, /* 16-bit unsigned integer */ + TIFF_LONG = 4, /* 32-bit unsigned integer */ + TIFF_RATIONAL = 5, /* 64-bit unsigned fraction */ + TIFF_SBYTE = 6, /* !8-bit signed integer */ + TIFF_UNDEFINED = 7, /* !8-bit untyped data */ + TIFF_SSHORT = 8, /* !16-bit signed integer */ + TIFF_SLONG = 9, /* !32-bit signed integer */ + TIFF_SRATIONAL = 10, /* !64-bit signed fraction */ + TIFF_FLOAT = 11, /* !32-bit IEEE floating point */ + TIFF_DOUBLE = 12, /* !64-bit IEEE floating point */ + TIFF_IFD = 13, /* %32-bit unsigned integer (offset) */ + TIFF_LONG8 = 16, /* BigTIFF 64-bit unsigned integer */ + TIFF_SLONG8 = 17, /* BigTIFF 64-bit signed integer */ + TIFF_IFD8 = 18 /* BigTIFF 64-bit unsigned integer (offset) */ +} TIFFDataType; + +/* + * TIFF Tag Definitions. + */ +#define TIFFTAG_SUBFILETYPE 254 /* subfile data descriptor */ +#define FILETYPE_REDUCEDIMAGE 0x1 /* reduced resolution version */ +#define FILETYPE_PAGE 0x2 /* one page of many */ +#define FILETYPE_MASK 0x4 /* transparency mask */ +#define TIFFTAG_OSUBFILETYPE 255 /* +kind of data in subfile */ +#define OFILETYPE_IMAGE 1 /* full resolution image data */ +#define OFILETYPE_REDUCEDIMAGE 2 /* reduced size image data */ +#define OFILETYPE_PAGE 3 /* one page of many */ +#define TIFFTAG_IMAGEWIDTH 256 /* image width in pixels */ +#define TIFFTAG_IMAGELENGTH 257 /* image height in pixels */ +#define TIFFTAG_BITSPERSAMPLE 258 /* bits per channel (sample) */ +#define TIFFTAG_COMPRESSION 259 /* data compression technique */ +#define COMPRESSION_NONE 1 /* dump mode */ +#define COMPRESSION_CCITTRLE 2 /* CCITT modified Huffman RLE */ +#define COMPRESSION_CCITTFAX3 3 /* CCITT Group 3 fax encoding */ +#define COMPRESSION_CCITT_T4 3 /* CCITT T.4 (TIFF 6 name) */ +#define COMPRESSION_CCITTFAX4 4 /* CCITT Group 4 fax encoding */ +#define COMPRESSION_CCITT_T6 4 /* CCITT T.6 (TIFF 6 name) */ +#define COMPRESSION_LZW 5 /* Lempel-Ziv & Welch */ +#define COMPRESSION_OJPEG 6 /* !6.0 JPEG */ +#define COMPRESSION_JPEG 7 /* %JPEG DCT compression */ +#define COMPRESSION_T85 9 /* !TIFF/FX T.85 JBIG compression */ +#define COMPRESSION_T43 10 /* !TIFF/FX T.43 colour by layered JBIG compression */ +#define COMPRESSION_NEXT 32766 /* NeXT 2-bit RLE */ +#define COMPRESSION_CCITTRLEW 32771 /* #1 w/ word alignment */ +#define COMPRESSION_PACKBITS 32773 /* Macintosh RLE */ +#define COMPRESSION_THUNDERSCAN 32809 /* ThunderScan RLE */ +/* codes 32895-32898 are reserved for ANSI IT8 TIFF/IT */ +#define COMPRESSION_DCS 32947 /* Kodak DCS encoding */ +#define COMPRESSION_JBIG 34661 /* ISO JBIG */ +#define COMPRESSION_SGILOG 34676 /* SGI Log Luminance RLE */ +#define COMPRESSION_SGILOG24 34677 /* SGI Log 24-bit packed */ +#define COMPRESSION_JP2000 34712 /* Leadtools JPEG2000 */ +#define COMPRESSION_LZMA 34925 /* LZMA2 */ +#define TIFFTAG_PHOTOMETRIC 262 /* photometric interpretation */ +#define PHOTOMETRIC_MINISWHITE 0 /* min value is white */ +#define PHOTOMETRIC_MINISBLACK 1 /* min value is black */ +#define PHOTOMETRIC_RGB 2 /* RGB color model */ +#define PHOTOMETRIC_PALETTE 3 /* color map indexed */ +#define PHOTOMETRIC_MASK 4 /* $holdout mask */ +#define PHOTOMETRIC_SEPARATED 5 /* !color separations */ +#define PHOTOMETRIC_YCBCR 6 /* !CCIR 601 */ +#define PHOTOMETRIC_CIELAB 8 /* !1976 CIE L*a*b* */ +#define PHOTOMETRIC_ICCLAB 9 /* ICC L*a*b* [Adobe TIFF Technote 4] */ +#define PHOTOMETRIC_ITULAB 10 /* ITU L*a*b* */ +#define PHOTOMETRIC_LOGL 32844 /* CIE Log2(L) */ +#define PHOTOMETRIC_LOGLUV 32845 /* CIE Log2(L) (u',v') */ +#define TIFFTAG_THRESHHOLDING 263 /* +thresholding used on data */ +#define THRESHHOLD_BILEVEL 1 /* b&w art scan */ +#define THRESHHOLD_HALFTONE 2 /* or dithered scan */ +#define THRESHHOLD_ERRORDIFFUSE 3 /* usually floyd-steinberg */ +#define TIFFTAG_CELLWIDTH 264 /* +dithering matrix width */ +#define TIFFTAG_CELLLENGTH 265 /* +dithering matrix height */ +#define TIFFTAG_FILLORDER 266 /* data order within a byte */ +#define FILLORDER_MSB2LSB 1 /* most significant -> least */ +#define FILLORDER_LSB2MSB 2 /* least significant -> most */ +#define TIFFTAG_DOCUMENTNAME 269 /* name of doc. image is from */ +#define TIFFTAG_IMAGEDESCRIPTION 270 /* info about image */ +#define TIFFTAG_MAKE 271 /* scanner manufacturer name */ +#define TIFFTAG_MODEL 272 /* scanner model name/number */ +#define TIFFTAG_STRIPOFFSETS 273 /* offsets to data strips */ +#define TIFFTAG_ORIENTATION 274 /* +image orientation */ +#define ORIENTATION_TOPLEFT 1 /* row 0 top, col 0 lhs */ +#define ORIENTATION_TOPRIGHT 2 /* row 0 top, col 0 rhs */ +#define ORIENTATION_BOTRIGHT 3 /* row 0 bottom, col 0 rhs */ +#define ORIENTATION_BOTLEFT 4 /* row 0 bottom, col 0 lhs */ +#define ORIENTATION_LEFTTOP 5 /* row 0 lhs, col 0 top */ +#define ORIENTATION_RIGHTTOP 6 /* row 0 rhs, col 0 top */ +#define ORIENTATION_RIGHTBOT 7 /* row 0 rhs, col 0 bottom */ +#define ORIENTATION_LEFTBOT 8 /* row 0 lhs, col 0 bottom */ +#define TIFFTAG_SAMPLESPERPIXEL 277 /* samples per pixel */ +#define TIFFTAG_ROWSPERSTRIP 278 /* rows per strip of data */ +#define TIFFTAG_STRIPBYTECOUNTS 279 /* bytes counts for strips */ +#define TIFFTAG_MINSAMPLEVALUE 280 /* +minimum sample value */ +#define TIFFTAG_MAXSAMPLEVALUE 281 /* +maximum sample value */ +#define TIFFTAG_XRESOLUTION 282 /* pixels/resolution in x */ +#define TIFFTAG_YRESOLUTION 283 /* pixels/resolution in y */ +#define TIFFTAG_PLANARCONFIG 284 /* storage organization */ +#define PLANARCONFIG_CONTIG 1 /* single image plane */ +#define PLANARCONFIG_SEPARATE 2 /* separate planes of data */ +#define TIFFTAG_PAGENAME 285 /* page name image is from */ +#define TIFFTAG_XPOSITION 286 /* x page offset of image lhs */ +#define TIFFTAG_YPOSITION 287 /* y page offset of image lhs */ +#define TIFFTAG_FREEOFFSETS 288 /* +byte offset to free block */ +#define TIFFTAG_FREEBYTECOUNTS 289 /* +sizes of free blocks */ +#define TIFFTAG_GRAYRESPONSEUNIT 290 /* $gray scale curve accuracy */ +#define GRAYRESPONSEUNIT_10S 1 /* tenths of a unit */ +#define GRAYRESPONSEUNIT_100S 2 /* hundredths of a unit */ +#define GRAYRESPONSEUNIT_1000S 3 /* thousandths of a unit */ +#define GRAYRESPONSEUNIT_10000S 4 /* ten-thousandths of a unit */ +#define GRAYRESPONSEUNIT_100000S 5 /* hundred-thousandths */ +#define TIFFTAG_GRAYRESPONSECURVE 291 /* $gray scale response curve */ +#define TIFFTAG_GROUP3OPTIONS 292 /* 32 flag bits */ +#define TIFFTAG_T4OPTIONS 292 /* TIFF 6.0 proper name alias */ +#define GROUP3OPT_2DENCODING 0x1 /* 2-dimensional coding */ +#define GROUP3OPT_UNCOMPRESSED 0x2 /* data not compressed */ +#define GROUP3OPT_FILLBITS 0x4 /* fill to byte boundary */ +#define TIFFTAG_GROUP4OPTIONS 293 /* 32 flag bits */ +#define TIFFTAG_T6OPTIONS 293 /* TIFF 6.0 proper name */ +#define GROUP4OPT_UNCOMPRESSED 0x2 /* data not compressed */ +#define TIFFTAG_RESOLUTIONUNIT 296 /* units of resolutions */ +#define RESUNIT_NONE 1 /* no meaningful units */ +#define RESUNIT_INCH 2 /* english */ +#define RESUNIT_CENTIMETER 3 /* metric */ +#define TIFFTAG_PAGENUMBER 297 /* page numbers of multi-page */ +#define TIFFTAG_COLORRESPONSEUNIT 300 /* $color curve accuracy */ +#define COLORRESPONSEUNIT_10S 1 /* tenths of a unit */ +#define COLORRESPONSEUNIT_100S 2 /* hundredths of a unit */ +#define COLORRESPONSEUNIT_1000S 3 /* thousandths of a unit */ +#define COLORRESPONSEUNIT_10000S 4 /* ten-thousandths of a unit */ +#define COLORRESPONSEUNIT_100000S 5 /* hundred-thousandths */ +#define TIFFTAG_TRANSFERFUNCTION 301 /* !colorimetry info */ +#define TIFFTAG_SOFTWARE 305 /* name & release */ +#define TIFFTAG_DATETIME 306 /* creation date and time */ +#define TIFFTAG_ARTIST 315 /* creator of image */ +#define TIFFTAG_HOSTCOMPUTER 316 /* machine where created */ +#define TIFFTAG_PREDICTOR 317 /* prediction scheme w/ LZW */ +#define PREDICTOR_NONE 1 /* no prediction scheme used */ +#define PREDICTOR_HORIZONTAL 2 /* horizontal differencing */ +#define PREDICTOR_FLOATINGPOINT 3 /* floating point predictor */ +#define TIFFTAG_WHITEPOINT 318 /* image white point */ +#define TIFFTAG_PRIMARYCHROMATICITIES 319 /* !primary chromaticities */ +#define TIFFTAG_COLORMAP 320 /* RGB map for pallette image */ +#define TIFFTAG_HALFTONEHINTS 321 /* !highlight+shadow info */ +#define TIFFTAG_TILEWIDTH 322 /* !tile width in pixels */ +#define TIFFTAG_TILELENGTH 323 /* !tile height in pixels */ +#define TIFFTAG_TILEOFFSETS 324 /* !offsets to data tiles */ +#define TIFFTAG_TILEBYTECOUNTS 325 /* !byte counts for tiles */ +#define TIFFTAG_BADFAXLINES 326 /* lines w/ wrong pixel count */ +#define TIFFTAG_CLEANFAXDATA 327 /* regenerated line info */ +#define CLEANFAXDATA_CLEAN 0 /* no errors detected */ +#define CLEANFAXDATA_REGENERATED 1 /* receiver regenerated lines */ +#define CLEANFAXDATA_UNCLEAN 2 /* uncorrected errors exist */ +#define TIFFTAG_CONSECUTIVEBADFAXLINES 328 /* max consecutive bad lines */ +#define TIFFTAG_SUBIFD 330 /* subimage descriptors */ +#define TIFFTAG_INKSET 332 /* !inks in separated image */ +#define INKSET_CMYK 1 /* !cyan-magenta-yellow-black color */ +#define INKSET_MULTIINK 2 /* !multi-ink or hi-fi color */ +#define TIFFTAG_INKNAMES 333 /* !ascii names of inks */ +#define TIFFTAG_NUMBEROFINKS 334 /* !number of inks */ +#define TIFFTAG_DOTRANGE 336 /* !0% and 100% dot codes */ +#define TIFFTAG_TARGETPRINTER 337 /* !separation target */ +#define TIFFTAG_EXTRASAMPLES 338 /* !info about extra samples */ +#define EXTRASAMPLE_UNSPECIFIED 0 /* !unspecified data */ +#define EXTRASAMPLE_ASSOCALPHA 1 /* !associated alpha data */ +#define EXTRASAMPLE_UNASSALPHA 2 /* !unassociated alpha data */ +#define TIFFTAG_SAMPLEFORMAT 339 /* !data sample format */ +#define SAMPLEFORMAT_UINT 1 /* !unsigned integer data */ +#define SAMPLEFORMAT_INT 2 /* !signed integer data */ +#define SAMPLEFORMAT_IEEEFP 3 /* !IEEE floating point data */ +#define SAMPLEFORMAT_VOID 4 /* !untyped data */ +#define SAMPLEFORMAT_COMPLEXINT 5 /* !complex signed int */ +#define SAMPLEFORMAT_COMPLEXIEEEFP 6 /* !complex ieee floating */ +#define TIFFTAG_SMINSAMPLEVALUE 340 /* !variable MinSampleValue */ +#define TIFFTAG_SMAXSAMPLEVALUE 341 /* !variable MaxSampleValue */ +#define TIFFTAG_CLIPPATH 343 /* %ClipPath + [Adobe TIFF technote 2] */ +#define TIFFTAG_XCLIPPATHUNITS 344 /* %XClipPathUnits + [Adobe TIFF technote 2] */ +#define TIFFTAG_YCLIPPATHUNITS 345 /* %YClipPathUnits + [Adobe TIFF technote 2] */ +#define TIFFTAG_INDEXED 346 /* %Indexed + [Adobe TIFF Technote 3] */ +#define TIFFTAG_JPEGTABLES 347 /* %JPEG table stream */ +#define TIFFTAG_OPIPROXY 351 /* %OPI Proxy [Adobe TIFF technote] */ +/* Tags 400-435 are from the TIFF/FX spec */ +#define TIFFTAG_GLOBALPARAMETERSIFD 400 /* ! */ +#define TIFFTAG_PROFILETYPE 401 /* ! */ +#define PROFILETYPE_UNSPECIFIED 0 /* ! */ +#define PROFILETYPE_G3_FAX 1 /* ! */ +#define TIFFTAG_FAXPROFILE 402 /* ! */ +#define FAXPROFILE_S 1 /* !TIFF/FX FAX profile S */ +#define FAXPROFILE_F 2 /* !TIFF/FX FAX profile F */ +#define FAXPROFILE_J 3 /* !TIFF/FX FAX profile J */ +#define FAXPROFILE_C 4 /* !TIFF/FX FAX profile C */ +#define FAXPROFILE_L 5 /* !TIFF/FX FAX profile L */ +#define FAXPROFILE_M 6 /* !TIFF/FX FAX profile LM */ +#define TIFFTAG_CODINGMETHODS 403 /* !TIFF/FX coding methods */ +#define CODINGMETHODS_T4_1D (1 << 1) /* !T.4 1D */ +#define CODINGMETHODS_T4_2D (1 << 2) /* !T.4 2D */ +#define CODINGMETHODS_T6 (1 << 3) /* !T.6 */ +#define CODINGMETHODS_T85 (1 << 4) /* !T.85 JBIG */ +#define CODINGMETHODS_T42 (1 << 5) /* !T.42 JPEG */ +#define CODINGMETHODS_T43 (1 << 6) /* !T.43 colour by layered JBIG */ +#define TIFFTAG_VERSIONYEAR 404 /* !TIFF/FX version year */ +#define TIFFTAG_MODENUMBER 405 /* !TIFF/FX mode number */ +#define TIFFTAG_DECODE 433 /* !TIFF/FX decode */ +#define TIFFTAG_IMAGEBASECOLOR 434 /* !TIFF/FX image base colour */ +#define TIFFTAG_T82OPTIONS 435 /* !TIFF/FX T.82 options */ +/* + * Tags 512-521 are obsoleted by Technical Note #2 which specifies a + * revised JPEG-in-TIFF scheme. + */ +#define TIFFTAG_JPEGPROC 512 /* !JPEG processing algorithm */ +#define JPEGPROC_BASELINE 1 /* !baseline sequential */ +#define JPEGPROC_LOSSLESS 14 /* !Huffman coded lossless */ +#define TIFFTAG_JPEGIFOFFSET 513 /* !pointer to SOI marker */ +#define TIFFTAG_JPEGIFBYTECOUNT 514 /* !JFIF stream length */ +#define TIFFTAG_JPEGRESTARTINTERVAL 515 /* !restart interval length */ +#define TIFFTAG_JPEGLOSSLESSPREDICTORS 517 /* !lossless proc predictor */ +#define TIFFTAG_JPEGPOINTTRANSFORM 518 /* !lossless point transform */ +#define TIFFTAG_JPEGQTABLES 519 /* !Q matrice offsets */ +#define TIFFTAG_JPEGDCTABLES 520 /* !DCT table offsets */ +#define TIFFTAG_JPEGACTABLES 521 /* !AC coefficient offsets */ +#define TIFFTAG_YCBCRCOEFFICIENTS 529 /* !RGB -> YCbCr transform */ +#define TIFFTAG_YCBCRSUBSAMPLING 530 /* !YCbCr subsampling factors */ +#define TIFFTAG_YCBCRPOSITIONING 531 /* !subsample positioning */ +#define YCBCRPOSITION_CENTERED 1 /* !as in PostScript Level 2 */ +#define YCBCRPOSITION_COSITED 2 /* !as in CCIR 601-1 */ +#define TIFFTAG_REFERENCEBLACKWHITE 532 /* !colorimetry info */ +#define TIFFTAG_STRIPROWCOUNTS 559 /* !TIFF/FX strip row counts */ +#define TIFFTAG_XMLPACKET 700 /* %XML packet + [Adobe XMP Specification, + January 2004 */ +#define TIFFTAG_OPIIMAGEID 32781 /* %OPI ImageID + [Adobe TIFF technote] */ +/* tags 32952-32956 are private tags registered to Island Graphics */ +#define TIFFTAG_REFPTS 32953 /* image reference points */ +#define TIFFTAG_REGIONTACKPOINT 32954 /* region-xform tack point */ +#define TIFFTAG_REGIONWARPCORNERS 32955 /* warp quadrilateral */ +#define TIFFTAG_REGIONAFFINE 32956 /* affine transformation mat */ +/* tags 32995-32999 are private tags registered to SGI */ +#define TIFFTAG_MATTEING 32995 /* $use ExtraSamples */ +#define TIFFTAG_DATATYPE 32996 /* $use SampleFormat */ +#define TIFFTAG_IMAGEDEPTH 32997 /* z depth of image */ +#define TIFFTAG_TILEDEPTH 32998 /* z depth/data tile */ +/* tags 33300-33309 are private tags registered to Pixar */ +/* + * TIFFTAG_PIXAR_IMAGEFULLWIDTH and TIFFTAG_PIXAR_IMAGEFULLLENGTH + * are set when an image has been cropped out of a larger image. + * They reflect the size of the original uncropped image. + * The TIFFTAG_XPOSITION and TIFFTAG_YPOSITION can be used + * to determine the position of the smaller image in the larger one. + */ +#define TIFFTAG_PIXAR_IMAGEFULLWIDTH 33300 /* full image size in x */ +#define TIFFTAG_PIXAR_IMAGEFULLLENGTH 33301 /* full image size in y */ + /* Tags 33302-33306 are used to identify special image modes and data + * used by Pixar's texture formats. + */ +#define TIFFTAG_PIXAR_TEXTUREFORMAT 33302 /* texture map format */ +#define TIFFTAG_PIXAR_WRAPMODES 33303 /* s & t wrap modes */ +#define TIFFTAG_PIXAR_FOVCOT 33304 /* cotan(fov) for env. maps */ +#define TIFFTAG_PIXAR_MATRIX_WORLDTOSCREEN 33305 +#define TIFFTAG_PIXAR_MATRIX_WORLDTOCAMERA 33306 +/* tag 33405 is a private tag registered to Eastman Kodak */ +#define TIFFTAG_WRITERSERIALNUMBER 33405 /* device serial number */ +/* tag 33432 is listed in the 6.0 spec w/ unknown ownership */ +#define TIFFTAG_COPYRIGHT 33432 /* copyright string */ +/* IPTC TAG from RichTIFF specifications */ +#define TIFFTAG_RICHTIFFIPTC 33723 +/* 34016-34029 are reserved for ANSI IT8 TIFF/IT */ +#define TIFFTAG_STONITS 37439 /* Sample value to Nits */ +/* tag 34929 is a private tag registered to FedEx */ +#define TIFFTAG_FEDEX_EDR 34929 /* unknown use */ +#define TIFFTAG_INTEROPERABILITYIFD 40965 /* Pointer to Interoperability private directory */ +/* Adobe Digital Negative (DNG) format tags */ +#define TIFFTAG_DNGVERSION 50706 /* &DNG version number */ +#define TIFFTAG_DNGBACKWARDVERSION 50707 /* &DNG compatibility version */ +#define TIFFTAG_UNIQUECAMERAMODEL 50708 /* &name for the camera model */ +#define TIFFTAG_LOCALIZEDCAMERAMODEL 50709 /* &localized camera model + name */ +#define TIFFTAG_CFAPLANECOLOR 50710 /* &CFAPattern->LinearRaw space + mapping */ +#define TIFFTAG_CFALAYOUT 50711 /* &spatial layout of the CFA */ +#define TIFFTAG_LINEARIZATIONTABLE 50712 /* &lookup table description */ +#define TIFFTAG_BLACKLEVELREPEATDIM 50713 /* &repeat pattern size for + the BlackLevel tag */ +#define TIFFTAG_BLACKLEVEL 50714 /* &zero light encoding level */ +#define TIFFTAG_BLACKLEVELDELTAH 50715 /* &zero light encoding level + differences (columns) */ +#define TIFFTAG_BLACKLEVELDELTAV 50716 /* &zero light encoding level + differences (rows) */ +#define TIFFTAG_WHITELEVEL 50717 /* &fully saturated encoding + level */ +#define TIFFTAG_DEFAULTSCALE 50718 /* &default scale factors */ +#define TIFFTAG_DEFAULTCROPORIGIN 50719 /* &origin of the final image + area */ +#define TIFFTAG_DEFAULTCROPSIZE 50720 /* &size of the final image + area */ +#define TIFFTAG_COLORMATRIX1 50721 /* &XYZ->reference color space + transformation matrix 1 */ +#define TIFFTAG_COLORMATRIX2 50722 /* &XYZ->reference color space + transformation matrix 2 */ +#define TIFFTAG_CAMERACALIBRATION1 50723 /* &calibration matrix 1 */ +#define TIFFTAG_CAMERACALIBRATION2 50724 /* &calibration matrix 2 */ +#define TIFFTAG_REDUCTIONMATRIX1 50725 /* &dimensionality reduction + matrix 1 */ +#define TIFFTAG_REDUCTIONMATRIX2 50726 /* &dimensionality reduction + matrix 2 */ +#define TIFFTAG_ANALOGBALANCE 50727 /* &gain applied the stored raw + values*/ +#define TIFFTAG_ASSHOTNEUTRAL 50728 /* &selected white balance in + linear reference space */ +#define TIFFTAG_ASSHOTWHITEXY 50729 /* &selected white balance in + x-y chromaticity + coordinates */ +#define TIFFTAG_BASELINEEXPOSURE 50730 /* &how much to move the zero + point */ +#define TIFFTAG_BASELINENOISE 50731 /* &relative noise level */ +#define TIFFTAG_BASELINESHARPNESS 50732 /* &relative amount of + sharpening */ +#define TIFFTAG_BAYERGREENSPLIT 50733 /* &how closely the values of + the green pixels in the + blue/green rows track the + values of the green pixels + in the red/green rows */ +#define TIFFTAG_LINEARRESPONSELIMIT 50734 /* &non-linear encoding range */ +#define TIFFTAG_CAMERASERIALNUMBER 50735 /* &camera's serial number */ +#define TIFFTAG_LENSINFO 50736 /* info about the lens */ +#define TIFFTAG_CHROMABLURRADIUS 50737 /* &chroma blur radius */ +#define TIFFTAG_ANTIALIASSTRENGTH 50738 /* &relative strength of the + camera's anti-alias filter */ +#define TIFFTAG_SHADOWSCALE 50739 /* &used by Adobe Camera Raw */ +#define TIFFTAG_DNGPRIVATEDATA 50740 /* &manufacturer's private data */ +#define TIFFTAG_MAKERNOTESAFETY 50741 /* &whether the EXIF MakerNote + tag is safe to preserve + along with the rest of the + EXIF data */ +#define TIFFTAG_CALIBRATIONILLUMINANT1 50778 /* &illuminant 1 */ +#define TIFFTAG_CALIBRATIONILLUMINANT2 50779 /* &illuminant 2 */ +#define TIFFTAG_BESTQUALITYSCALE 50780 /* &best quality multiplier */ +#define TIFFTAG_RAWDATAUNIQUEID 50781 /* &unique identifier for + the raw image data */ +#define TIFFTAG_ORIGINALRAWFILENAME 50827 /* &file name of the original + raw file */ +#define TIFFTAG_ORIGINALRAWFILEDATA 50828 /* &contents of the original + raw file */ +#define TIFFTAG_ACTIVEAREA 50829 /* &active (non-masked) pixels + of the sensor */ +#define TIFFTAG_MASKEDAREAS 50830 /* &list of coordinates + of fully masked pixels */ +#define TIFFTAG_ASSHOTICCPROFILE 50831 /* &these two tags used to */ +#define TIFFTAG_ASSHOTPREPROFILEMATRIX 50832 /* map cameras's color space + into ICC profile space */ +#define TIFFTAG_CURRENTICCPROFILE 50833 /* & */ +#define TIFFTAG_CURRENTPREPROFILEMATRIX 50834 /* & */ +/* tag 65535 is an undefined tag used by Eastman Kodak */ +#define TIFFTAG_DCSHUESHIFTVALUES 65535 /* hue shift correction data */ + +/* + * The following are ``pseudo tags'' that can be used to control + * codec-specific functionality. These tags are not written to file. + * Note that these values start at 0xffff+1 so that they'll never + * collide with Aldus-assigned tags. + * + * If you want your private pseudo tags ``registered'' (i.e. added to + * this file), please post a bug report via the tracking system at + * http://www.remotesensing.org/libtiff/bugs.html with the appropriate + * C definitions to add. + */ +#define TIFFTAG_FAXMODE 65536 /* Group 3/4 format control */ +#define FAXMODE_CLASSIC 0x0000 /* default, include RTC */ +#define FAXMODE_NORTC 0x0001 /* no RTC at end of data */ +#define FAXMODE_NOEOL 0x0002 /* no EOL code at end of row */ +#define FAXMODE_BYTEALIGN 0x0004 /* byte align row */ +#define FAXMODE_WORDALIGN 0x0008 /* word align row */ +#define FAXMODE_CLASSF FAXMODE_NORTC /* TIFF Class F */ +#define TIFFTAG_JPEGQUALITY 65537 /* Compression quality level */ +/* Note: quality level is on the IJG 0-100 scale. Default value is 75 */ +#define TIFFTAG_JPEGCOLORMODE 65538 /* Auto RGB<=>YCbCr convert? */ +#define JPEGCOLORMODE_RAW 0x0000 /* no conversion (default) */ +#define JPEGCOLORMODE_RGB 0x0001 /* do auto conversion */ +#define TIFFTAG_JPEGTABLESMODE 65539 /* What to put in JPEGTables */ +#define JPEGTABLESMODE_QUANT 0x0001 /* include quantization tbls */ +#define JPEGTABLESMODE_HUFF 0x0002 /* include Huffman tbls */ +/* Note: default is JPEGTABLESMODE_QUANT | JPEGTABLESMODE_HUFF */ +#define TIFFTAG_FAXFILLFUNC 65540 /* G3/G4 fill function */ +#define TIFFTAG_PIXARLOGDATAFMT 65549 /* PixarLogCodec I/O data sz */ +#define PIXARLOGDATAFMT_8BIT 0 /* regular u_char samples */ +#define PIXARLOGDATAFMT_8BITABGR 1 /* ABGR-order u_chars */ +#define PIXARLOGDATAFMT_11BITLOG 2 /* 11-bit log-encoded (raw) */ +#define PIXARLOGDATAFMT_12BITPICIO 3 /* as per PICIO (1.0==2048) */ +#define PIXARLOGDATAFMT_16BIT 4 /* signed short samples */ +#define PIXARLOGDATAFMT_FLOAT 5 /* IEEE float samples */ +/* 65550-65556 are allocated to Oceana Matrix */ +#define TIFFTAG_DCSIMAGERTYPE 65550 /* imager model & filter */ +#define DCSIMAGERMODEL_M3 0 /* M3 chip (1280 x 1024) */ +#define DCSIMAGERMODEL_M5 1 /* M5 chip (1536 x 1024) */ +#define DCSIMAGERMODEL_M6 2 /* M6 chip (3072 x 2048) */ +#define DCSIMAGERFILTER_IR 0 /* infrared filter */ +#define DCSIMAGERFILTER_MONO 1 /* monochrome filter */ +#define DCSIMAGERFILTER_CFA 2 /* color filter array */ +#define DCSIMAGERFILTER_OTHER 3 /* other filter */ +#define TIFFTAG_DCSINTERPMODE 65551 /* interpolation mode */ +#define DCSINTERPMODE_NORMAL 0x0 /* whole image, default */ +#define DCSINTERPMODE_PREVIEW 0x1 /* preview of image (384x256) */ +#define TIFFTAG_DCSBALANCEARRAY 65552 /* color balance values */ +#define TIFFTAG_DCSCORRECTMATRIX 65553 /* color correction values */ +#define TIFFTAG_DCSGAMMA 65554 /* gamma value */ +#define TIFFTAG_DCSTOESHOULDERPTS 65555 /* toe & shoulder points */ +#define TIFFTAG_DCSCALIBRATIONFD 65556 /* calibration file desc */ +/* Note: quality level is on the ZLIB 1-9 scale. Default value is -1 */ +#define TIFFTAG_ZIPQUALITY 65557 /* compression quality level */ +#define TIFFTAG_PIXARLOGQUALITY 65558 /* PixarLog uses same scale */ +/* 65559 is allocated to Oceana Matrix */ +#define TIFFTAG_DCSCLIPRECTANGLE 65559 /* area of image to acquire */ +#define TIFFTAG_SGILOGDATAFMT 65560 /* SGILog user data format */ +#define SGILOGDATAFMT_FLOAT 0 /* IEEE float samples */ +#define SGILOGDATAFMT_16BIT 1 /* 16-bit samples */ +#define SGILOGDATAFMT_RAW 2 /* uninterpreted data */ +#define SGILOGDATAFMT_8BIT 3 /* 8-bit RGB monitor values */ +#define TIFFTAG_SGILOGENCODE 65561 /* SGILog data encoding control*/ +#define SGILOGENCODE_NODITHER 0 /* do not dither encoded values*/ +#define SGILOGENCODE_RANDITHER 1 /* randomly dither encd values */ +#define TIFFTAG_LZMAPRESET 65562 /* LZMA2 preset (compression level) */ +#define TIFFTAG_PERSAMPLE 65563 /* interface for per sample tags */ +#define PERSAMPLE_MERGED 0 /* present as a single value */ +#define PERSAMPLE_MULTI 1 /* present as multiple values */ + +/* + * EXIF tags + */ +#define EXIFTAG_EXPOSURETIME 33434 /* Exposure time */ +#define EXIFTAG_FNUMBER 33437 /* F number */ +#define EXIFTAG_EXPOSUREPROGRAM 34850 /* Exposure program */ +#define EXIFTAG_SPECTRALSENSITIVITY 34852 /* Spectral sensitivity */ +#define EXIFTAG_ISOSPEEDRATINGS 34855 /* ISO speed rating */ +#define EXIFTAG_OECF 34856 /* Optoelectric conversion + factor */ +#define EXIFTAG_EXIFVERSION 36864 /* Exif version */ +#define EXIFTAG_DATETIMEORIGINAL 36867 /* Date and time of original + data generation */ +#define EXIFTAG_DATETIMEDIGITIZED 36868 /* Date and time of digital + data generation */ +#define EXIFTAG_COMPONENTSCONFIGURATION 37121 /* Meaning of each component */ +#define EXIFTAG_COMPRESSEDBITSPERPIXEL 37122 /* Image compression mode */ +#define EXIFTAG_SHUTTERSPEEDVALUE 37377 /* Shutter speed */ +#define EXIFTAG_APERTUREVALUE 37378 /* Aperture */ +#define EXIFTAG_BRIGHTNESSVALUE 37379 /* Brightness */ +#define EXIFTAG_EXPOSUREBIASVALUE 37380 /* Exposure bias */ +#define EXIFTAG_MAXAPERTUREVALUE 37381 /* Maximum lens aperture */ +#define EXIFTAG_SUBJECTDISTANCE 37382 /* Subject distance */ +#define EXIFTAG_METERINGMODE 37383 /* Metering mode */ +#define EXIFTAG_LIGHTSOURCE 37384 /* Light source */ +#define EXIFTAG_FLASH 37385 /* Flash */ +#define EXIFTAG_FOCALLENGTH 37386 /* Lens focal length */ +#define EXIFTAG_SUBJECTAREA 37396 /* Subject area */ +#define EXIFTAG_MAKERNOTE 37500 /* Manufacturer notes */ +#define EXIFTAG_USERCOMMENT 37510 /* User comments */ +#define EXIFTAG_SUBSECTIME 37520 /* DateTime subseconds */ +#define EXIFTAG_SUBSECTIMEORIGINAL 37521 /* DateTimeOriginal subseconds */ +#define EXIFTAG_SUBSECTIMEDIGITIZED 37522 /* DateTimeDigitized subseconds */ +#define EXIFTAG_FLASHPIXVERSION 40960 /* Supported Flashpix version */ +#define EXIFTAG_COLORSPACE 40961 /* Color space information */ +#define EXIFTAG_PIXELXDIMENSION 40962 /* Valid image width */ +#define EXIFTAG_PIXELYDIMENSION 40963 /* Valid image height */ +#define EXIFTAG_RELATEDSOUNDFILE 40964 /* Related audio file */ +#define EXIFTAG_FLASHENERGY 41483 /* Flash energy */ +#define EXIFTAG_SPATIALFREQUENCYRESPONSE 41484 /* Spatial frequency response */ +#define EXIFTAG_FOCALPLANEXRESOLUTION 41486 /* Focal plane X resolution */ +#define EXIFTAG_FOCALPLANEYRESOLUTION 41487 /* Focal plane Y resolution */ +#define EXIFTAG_FOCALPLANERESOLUTIONUNIT 41488 /* Focal plane resolution unit */ +#define EXIFTAG_SUBJECTLOCATION 41492 /* Subject location */ +#define EXIFTAG_EXPOSUREINDEX 41493 /* Exposure index */ +#define EXIFTAG_SENSINGMETHOD 41495 /* Sensing method */ +#define EXIFTAG_FILESOURCE 41728 /* File source */ +#define EXIFTAG_SCENETYPE 41729 /* Scene type */ +#define EXIFTAG_CFAPATTERN 41730 /* CFA pattern */ +#define EXIFTAG_CUSTOMRENDERED 41985 /* Custom image processing */ +#define EXIFTAG_EXPOSUREMODE 41986 /* Exposure mode */ +#define EXIFTAG_WHITEBALANCE 41987 /* White balance */ +#define EXIFTAG_DIGITALZOOMRATIO 41988 /* Digital zoom ratio */ +#define EXIFTAG_FOCALLENGTHIN35MMFILM 41989 /* Focal length in 35 mm film */ +#define EXIFTAG_SCENECAPTURETYPE 41990 /* Scene capture type */ +#define EXIFTAG_GAINCONTROL 41991 /* Gain control */ +#define EXIFTAG_CONTRAST 41992 /* Contrast */ +#define EXIFTAG_SATURATION 41993 /* Saturation */ +#define EXIFTAG_SHARPNESS 41994 /* Sharpness */ +#define EXIFTAG_DEVICESETTINGDESCRIPTION 41995 /* Device settings description */ +#define EXIFTAG_SUBJECTDISTANCERANGE 41996 /* Subject distance range */ +#define EXIFTAG_GAINCONTROL 41991 /* Gain control */ +#define EXIFTAG_GAINCONTROL 41991 /* Gain control */ +#define EXIFTAG_IMAGEUNIQUEID 42016 /* Unique image ID */ + +#endif /* _TIFF_ */ + +/* vim: set ts=8 sts=8 sw=8 noet: */ +/* + * Local Variables: + * mode: c + * c-basic-offset: 8 + * fill-column: 78 + * End: + */ diff -Nru goldendict-1.5.0~git20131003/winlibs/include/tiff/tiffio.h goldendict-1.5.0~git20150923/winlibs/include/tiff/tiffio.h --- goldendict-1.5.0~git20131003/winlibs/include/tiff/tiffio.h 1970-01-01 00:00:00.000000000 +0000 +++ goldendict-1.5.0~git20150923/winlibs/include/tiff/tiffio.h 2015-09-23 08:26:24.000000000 +0000 @@ -0,0 +1,557 @@ +/* $Id: tiffio.h,v 1.91 2012-07-29 15:45:29 tgl Exp $ */ + +/* + * Copyright (c) 1988-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. + * + * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND, + * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY + * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. + * + * IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR + * ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND, + * OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, + * WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF + * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE + * OF THIS SOFTWARE. + */ + +#ifndef _TIFFIO_ +#define _TIFFIO_ + +/* + * TIFF I/O Library Definitions. + */ +#include "tiff.h" +#include "tiffvers.h" + +/* + * TIFF is defined as an incomplete type to hide the + * library's internal data structures from clients. + */ +typedef struct tiff TIFF; + +/* + * The following typedefs define the intrinsic size of + * data types used in the *exported* interfaces. These + * definitions depend on the proper definition of types + * in tiff.h. Note also that the varargs interface used + * to pass tag types and values uses the types defined in + * tiff.h directly. + * + * NB: ttag_t is unsigned int and not unsigned short because + * ANSI C requires that the type before the ellipsis be a + * promoted type (i.e. one of int, unsigned int, pointer, + * or double) and because we defined pseudo-tags that are + * outside the range of legal Aldus-assigned tags. + * NB: tsize_t is int32 and not uint32 because some functions + * return -1. + * NB: toff_t is not off_t for many reasons; TIFFs max out at + * 32-bit file offsets, and BigTIFF maxes out at 64-bit + * offsets being the most important, and to ensure use of + * a consistently unsigned type across architectures. + * Prior to libtiff 4.0, this was an unsigned 32 bit type. + */ +/* + * this is the machine addressing size type, only it's signed, so make it + * int32 on 32bit machines, int64 on 64bit machines + */ +typedef TIFF_SSIZE_T tmsize_t; +typedef uint64 toff_t; /* file offset */ +/* the following are deprecated and should be replaced by their defining + counterparts */ +typedef uint32 ttag_t; /* directory tag */ +typedef uint16 tdir_t; /* directory index */ +typedef uint16 tsample_t; /* sample number */ +typedef uint32 tstrile_t; /* strip or tile number */ +typedef tstrile_t tstrip_t; /* strip number */ +typedef tstrile_t ttile_t; /* tile number */ +typedef tmsize_t tsize_t; /* i/o size in bytes */ +typedef void* tdata_t; /* image data ref */ + +#if !defined(__WIN32__) && (defined(_WIN32) || defined(WIN32)) +#define __WIN32__ +#endif + +/* + * On windows you should define USE_WIN32_FILEIO if you are using tif_win32.c + * or AVOID_WIN32_FILEIO if you are using something else (like tif_unix.c). + * + * By default tif_unix.c is assumed. + */ + +#if defined(_WINDOWS) || defined(__WIN32__) || defined(_Windows) +# if !defined(__CYGWIN) && !defined(AVOID_WIN32_FILEIO) && !defined(USE_WIN32_FILEIO) +# define AVOID_WIN32_FILEIO +# endif +#endif + +#if defined(USE_WIN32_FILEIO) +# define VC_EXTRALEAN +# include +# ifdef __WIN32__ +DECLARE_HANDLE(thandle_t); /* Win32 file handle */ +# else +typedef HFILE thandle_t; /* client data handle */ +# endif /* __WIN32__ */ +#else +typedef void* thandle_t; /* client data handle */ +#endif /* USE_WIN32_FILEIO */ + +/* + * Flags to pass to TIFFPrintDirectory to control + * printing of data structures that are potentially + * very large. Bit-or these flags to enable printing + * multiple items. + */ +#define TIFFPRINT_NONE 0x0 /* no extra info */ +#define TIFFPRINT_STRIPS 0x1 /* strips/tiles info */ +#define TIFFPRINT_CURVES 0x2 /* color/gray response curves */ +#define TIFFPRINT_COLORMAP 0x4 /* colormap */ +#define TIFFPRINT_JPEGQTABLES 0x100 /* JPEG Q matrices */ +#define TIFFPRINT_JPEGACTABLES 0x200 /* JPEG AC tables */ +#define TIFFPRINT_JPEGDCTABLES 0x200 /* JPEG DC tables */ + +/* + * Colour conversion stuff + */ + +/* reference white */ +#define D65_X0 (95.0470F) +#define D65_Y0 (100.0F) +#define D65_Z0 (108.8827F) + +#define D50_X0 (96.4250F) +#define D50_Y0 (100.0F) +#define D50_Z0 (82.4680F) + +/* Structure for holding information about a display device. */ + +typedef unsigned char TIFFRGBValue; /* 8-bit samples */ + +typedef struct { + float d_mat[3][3]; /* XYZ -> luminance matrix */ + float d_YCR; /* Light o/p for reference white */ + float d_YCG; + float d_YCB; + uint32 d_Vrwr; /* Pixel values for ref. white */ + uint32 d_Vrwg; + uint32 d_Vrwb; + float d_Y0R; /* Residual light for black pixel */ + float d_Y0G; + float d_Y0B; + float d_gammaR; /* Gamma values for the three guns */ + float d_gammaG; + float d_gammaB; +} TIFFDisplay; + +typedef struct { /* YCbCr->RGB support */ + TIFFRGBValue* clamptab; /* range clamping table */ + int* Cr_r_tab; + int* Cb_b_tab; + int32* Cr_g_tab; + int32* Cb_g_tab; + int32* Y_tab; +} TIFFYCbCrToRGB; + +typedef struct { /* CIE Lab 1976->RGB support */ + int range; /* Size of conversion table */ +#define CIELABTORGB_TABLE_RANGE 1500 + float rstep, gstep, bstep; + float X0, Y0, Z0; /* Reference white point */ + TIFFDisplay display; + float Yr2r[CIELABTORGB_TABLE_RANGE + 1]; /* Conversion of Yr to r */ + float Yg2g[CIELABTORGB_TABLE_RANGE + 1]; /* Conversion of Yg to g */ + float Yb2b[CIELABTORGB_TABLE_RANGE + 1]; /* Conversion of Yb to b */ +} TIFFCIELabToRGB; + +/* + * RGBA-style image support. + */ +typedef struct _TIFFRGBAImage TIFFRGBAImage; +/* + * The image reading and conversion routines invoke + * ``put routines'' to copy/image/whatever tiles of + * raw image data. A default set of routines are + * provided to convert/copy raw image data to 8-bit + * packed ABGR format rasters. Applications can supply + * alternate routines that unpack the data into a + * different format or, for example, unpack the data + * and draw the unpacked raster on the display. + */ +typedef void (*tileContigRoutine) + (TIFFRGBAImage*, uint32*, uint32, uint32, uint32, uint32, int32, int32, + unsigned char*); +typedef void (*tileSeparateRoutine) + (TIFFRGBAImage*, uint32*, uint32, uint32, uint32, uint32, int32, int32, + unsigned char*, unsigned char*, unsigned char*, unsigned char*); +/* + * RGBA-reader state. + */ +struct _TIFFRGBAImage { + TIFF* tif; /* image handle */ + int stoponerr; /* stop on read error */ + int isContig; /* data is packed/separate */ + int alpha; /* type of alpha data present */ + uint32 width; /* image width */ + uint32 height; /* image height */ + uint16 bitspersample; /* image bits/sample */ + uint16 samplesperpixel; /* image samples/pixel */ + uint16 orientation; /* image orientation */ + uint16 req_orientation; /* requested orientation */ + uint16 photometric; /* image photometric interp */ + uint16* redcmap; /* colormap pallete */ + uint16* greencmap; + uint16* bluecmap; + /* get image data routine */ + int (*get)(TIFFRGBAImage*, uint32*, uint32, uint32); + /* put decoded strip/tile */ + union { + void (*any)(TIFFRGBAImage*); + tileContigRoutine contig; + tileSeparateRoutine separate; + } put; + TIFFRGBValue* Map; /* sample mapping array */ + uint32** BWmap; /* black&white map */ + uint32** PALmap; /* palette image map */ + TIFFYCbCrToRGB* ycbcr; /* YCbCr conversion state */ + TIFFCIELabToRGB* cielab; /* CIE L*a*b conversion state */ + + uint8* UaToAa; /* Unassociated alpha to associated alpha convertion LUT */ + uint8* Bitdepth16To8; /* LUT for conversion from 16bit to 8bit values */ + + int row_offset; + int col_offset; +}; + +/* + * Macros for extracting components from the + * packed ABGR form returned by TIFFReadRGBAImage. + */ +#define TIFFGetR(abgr) ((abgr) & 0xff) +#define TIFFGetG(abgr) (((abgr) >> 8) & 0xff) +#define TIFFGetB(abgr) (((abgr) >> 16) & 0xff) +#define TIFFGetA(abgr) (((abgr) >> 24) & 0xff) + +/* + * A CODEC is a software package that implements decoding, + * encoding, or decoding+encoding of a compression algorithm. + * The library provides a collection of builtin codecs. + * More codecs may be registered through calls to the library + * and/or the builtin implementations may be overridden. + */ +typedef int (*TIFFInitMethod)(TIFF*, int); +typedef struct { + char* name; + uint16 scheme; + TIFFInitMethod init; +} TIFFCodec; + +#include +#include + +/* share internal LogLuv conversion routines? */ +#ifndef LOGLUV_PUBLIC +#define LOGLUV_PUBLIC 1 +#endif + +#if !defined(__GNUC__) && !defined(__attribute__) +# define __attribute__(x) /*nothing*/ +#endif + +#if defined(c_plusplus) || defined(__cplusplus) +extern "C" { +#endif +typedef void (*TIFFErrorHandler)(const char*, const char*, va_list); +typedef void (*TIFFErrorHandlerExt)(thandle_t, const char*, const char*, va_list); +typedef tmsize_t (*TIFFReadWriteProc)(thandle_t, void*, tmsize_t); +typedef toff_t (*TIFFSeekProc)(thandle_t, toff_t, int); +typedef int (*TIFFCloseProc)(thandle_t); +typedef toff_t (*TIFFSizeProc)(thandle_t); +typedef int (*TIFFMapFileProc)(thandle_t, void** base, toff_t* size); +typedef void (*TIFFUnmapFileProc)(thandle_t, void* base, toff_t size); +typedef void (*TIFFExtendProc)(TIFF*); + +extern const char* TIFFGetVersion(void); + +extern const TIFFCodec* TIFFFindCODEC(uint16); +extern TIFFCodec* TIFFRegisterCODEC(uint16, const char*, TIFFInitMethod); +extern void TIFFUnRegisterCODEC(TIFFCodec*); +extern int TIFFIsCODECConfigured(uint16); +extern TIFFCodec* TIFFGetConfiguredCODECs(void); + +/* + * Auxiliary functions. + */ + +extern void* _TIFFmalloc(tmsize_t s); +extern void* _TIFFrealloc(void* p, tmsize_t s); +extern void _TIFFmemset(void* p, int v, tmsize_t c); +extern void _TIFFmemcpy(void* d, const void* s, tmsize_t c); +extern int _TIFFmemcmp(const void* p1, const void* p2, tmsize_t c); +extern void _TIFFfree(void* p); + +/* +** Stuff, related to tag handling and creating custom tags. +*/ +extern int TIFFGetTagListCount( TIFF * ); +extern uint32 TIFFGetTagListEntry( TIFF *, int tag_index ); + +#define TIFF_ANY TIFF_NOTYPE /* for field descriptor searching */ +#define TIFF_VARIABLE -1 /* marker for variable length tags */ +#define TIFF_SPP -2 /* marker for SamplesPerPixel tags */ +#define TIFF_VARIABLE2 -3 /* marker for uint32 var-length tags */ + +#define FIELD_CUSTOM 65 + +typedef struct _TIFFField TIFFField; +typedef struct _TIFFFieldArray TIFFFieldArray; + +extern const TIFFField* TIFFFindField(TIFF *, uint32, TIFFDataType); +extern const TIFFField* TIFFFieldWithTag(TIFF*, uint32); +extern const TIFFField* TIFFFieldWithName(TIFF*, const char *); + +extern uint32 TIFFFieldTag(const TIFFField*); +extern const char* TIFFFieldName(const TIFFField*); +extern TIFFDataType TIFFFieldDataType(const TIFFField*); +extern int TIFFFieldPassCount(const TIFFField*); +extern int TIFFFieldReadCount(const TIFFField*); +extern int TIFFFieldWriteCount(const TIFFField*); + +typedef int (*TIFFVSetMethod)(TIFF*, uint32, va_list); +typedef int (*TIFFVGetMethod)(TIFF*, uint32, va_list); +typedef void (*TIFFPrintMethod)(TIFF*, FILE*, long); + +typedef struct { + TIFFVSetMethod vsetfield; /* tag set routine */ + TIFFVGetMethod vgetfield; /* tag get routine */ + TIFFPrintMethod printdir; /* directory print routine */ +} TIFFTagMethods; + +extern TIFFTagMethods *TIFFAccessTagMethods(TIFF *); +extern void *TIFFGetClientInfo(TIFF *, const char *); +extern void TIFFSetClientInfo(TIFF *, void *, const char *); + +extern void TIFFCleanup(TIFF* tif); +extern void TIFFClose(TIFF* tif); +extern int TIFFFlush(TIFF* tif); +extern int TIFFFlushData(TIFF* tif); +extern int TIFFGetField(TIFF* tif, uint32 tag, ...); +extern int TIFFVGetField(TIFF* tif, uint32 tag, va_list ap); +extern int TIFFGetFieldDefaulted(TIFF* tif, uint32 tag, ...); +extern int TIFFVGetFieldDefaulted(TIFF* tif, uint32 tag, va_list ap); +extern int TIFFReadDirectory(TIFF* tif); +extern int TIFFReadCustomDirectory(TIFF* tif, toff_t diroff, const TIFFFieldArray* infoarray); +extern int TIFFReadEXIFDirectory(TIFF* tif, toff_t diroff); +extern uint64 TIFFScanlineSize64(TIFF* tif); +extern tmsize_t TIFFScanlineSize(TIFF* tif); +extern uint64 TIFFRasterScanlineSize64(TIFF* tif); +extern tmsize_t TIFFRasterScanlineSize(TIFF* tif); +extern uint64 TIFFStripSize64(TIFF* tif); +extern tmsize_t TIFFStripSize(TIFF* tif); +extern uint64 TIFFRawStripSize64(TIFF* tif, uint32 strip); +extern tmsize_t TIFFRawStripSize(TIFF* tif, uint32 strip); +extern uint64 TIFFVStripSize64(TIFF* tif, uint32 nrows); +extern tmsize_t TIFFVStripSize(TIFF* tif, uint32 nrows); +extern uint64 TIFFTileRowSize64(TIFF* tif); +extern tmsize_t TIFFTileRowSize(TIFF* tif); +extern uint64 TIFFTileSize64(TIFF* tif); +extern tmsize_t TIFFTileSize(TIFF* tif); +extern uint64 TIFFVTileSize64(TIFF* tif, uint32 nrows); +extern tmsize_t TIFFVTileSize(TIFF* tif, uint32 nrows); +extern uint32 TIFFDefaultStripSize(TIFF* tif, uint32 request); +extern void TIFFDefaultTileSize(TIFF*, uint32*, uint32*); +extern int TIFFFileno(TIFF*); +extern int TIFFSetFileno(TIFF*, int); +extern thandle_t TIFFClientdata(TIFF*); +extern thandle_t TIFFSetClientdata(TIFF*, thandle_t); +extern int TIFFGetMode(TIFF*); +extern int TIFFSetMode(TIFF*, int); +extern int TIFFIsTiled(TIFF*); +extern int TIFFIsByteSwapped(TIFF*); +extern int TIFFIsUpSampled(TIFF*); +extern int TIFFIsMSB2LSB(TIFF*); +extern int TIFFIsBigEndian(TIFF*); +extern TIFFReadWriteProc TIFFGetReadProc(TIFF*); +extern TIFFReadWriteProc TIFFGetWriteProc(TIFF*); +extern TIFFSeekProc TIFFGetSeekProc(TIFF*); +extern TIFFCloseProc TIFFGetCloseProc(TIFF*); +extern TIFFSizeProc TIFFGetSizeProc(TIFF*); +extern TIFFMapFileProc TIFFGetMapFileProc(TIFF*); +extern TIFFUnmapFileProc TIFFGetUnmapFileProc(TIFF*); +extern uint32 TIFFCurrentRow(TIFF*); +extern uint16 TIFFCurrentDirectory(TIFF*); +extern uint16 TIFFNumberOfDirectories(TIFF*); +extern uint64 TIFFCurrentDirOffset(TIFF*); +extern uint32 TIFFCurrentStrip(TIFF*); +extern uint32 TIFFCurrentTile(TIFF* tif); +extern int TIFFReadBufferSetup(TIFF* tif, void* bp, tmsize_t size); +extern int TIFFWriteBufferSetup(TIFF* tif, void* bp, tmsize_t size); +extern int TIFFSetupStrips(TIFF *); +extern int TIFFWriteCheck(TIFF*, int, const char *); +extern void TIFFFreeDirectory(TIFF*); +extern int TIFFCreateDirectory(TIFF*); +extern int TIFFCreateCustomDirectory(TIFF*,const TIFFFieldArray*); +extern int TIFFCreateEXIFDirectory(TIFF*); +extern int TIFFLastDirectory(TIFF*); +extern int TIFFSetDirectory(TIFF*, uint16); +extern int TIFFSetSubDirectory(TIFF*, uint64); +extern int TIFFUnlinkDirectory(TIFF*, uint16); +extern int TIFFSetField(TIFF*, uint32, ...); +extern int TIFFVSetField(TIFF*, uint32, va_list); +extern int TIFFUnsetField(TIFF*, uint32); +extern int TIFFWriteDirectory(TIFF *); +extern int TIFFWriteCustomDirectory(TIFF *, uint64 *); +extern int TIFFCheckpointDirectory(TIFF *); +extern int TIFFRewriteDirectory(TIFF *); + +#if defined(c_plusplus) || defined(__cplusplus) +extern void TIFFPrintDirectory(TIFF*, FILE*, long = 0); +extern int TIFFReadScanline(TIFF* tif, void* buf, uint32 row, uint16 sample = 0); +extern int TIFFWriteScanline(TIFF* tif, void* buf, uint32 row, uint16 sample = 0); +extern int TIFFReadRGBAImage(TIFF*, uint32, uint32, uint32*, int = 0); +extern int TIFFReadRGBAImageOriented(TIFF*, uint32, uint32, uint32*, + int = ORIENTATION_BOTLEFT, int = 0); +#else +extern void TIFFPrintDirectory(TIFF*, FILE*, long); +extern int TIFFReadScanline(TIFF* tif, void* buf, uint32 row, uint16 sample); +extern int TIFFWriteScanline(TIFF* tif, void* buf, uint32 row, uint16 sample); +extern int TIFFReadRGBAImage(TIFF*, uint32, uint32, uint32*, int); +extern int TIFFReadRGBAImageOriented(TIFF*, uint32, uint32, uint32*, int, int); +#endif + +extern int TIFFReadRGBAStrip(TIFF*, uint32, uint32 * ); +extern int TIFFReadRGBATile(TIFF*, uint32, uint32, uint32 * ); +extern int TIFFRGBAImageOK(TIFF*, char [1024]); +extern int TIFFRGBAImageBegin(TIFFRGBAImage*, TIFF*, int, char [1024]); +extern int TIFFRGBAImageGet(TIFFRGBAImage*, uint32*, uint32, uint32); +extern void TIFFRGBAImageEnd(TIFFRGBAImage*); +extern TIFF* TIFFOpen(const char*, const char*); +# ifdef __WIN32__ +extern TIFF* TIFFOpenW(const wchar_t*, const char*); +# endif /* __WIN32__ */ +extern TIFF* TIFFFdOpen(int, const char*, const char*); +extern TIFF* TIFFClientOpen(const char*, const char*, + thandle_t, + TIFFReadWriteProc, TIFFReadWriteProc, + TIFFSeekProc, TIFFCloseProc, + TIFFSizeProc, + TIFFMapFileProc, TIFFUnmapFileProc); +extern const char* TIFFFileName(TIFF*); +extern const char* TIFFSetFileName(TIFF*, const char *); +extern void TIFFError(const char*, const char*, ...) __attribute__((__format__ (__printf__,2,3))); +extern void TIFFErrorExt(thandle_t, const char*, const char*, ...) __attribute__((__format__ (__printf__,3,4))); +extern void TIFFWarning(const char*, const char*, ...) __attribute__((__format__ (__printf__,2,3))); +extern void TIFFWarningExt(thandle_t, const char*, const char*, ...) __attribute__((__format__ (__printf__,3,4))); +extern TIFFErrorHandler TIFFSetErrorHandler(TIFFErrorHandler); +extern TIFFErrorHandlerExt TIFFSetErrorHandlerExt(TIFFErrorHandlerExt); +extern TIFFErrorHandler TIFFSetWarningHandler(TIFFErrorHandler); +extern TIFFErrorHandlerExt TIFFSetWarningHandlerExt(TIFFErrorHandlerExt); +extern TIFFExtendProc TIFFSetTagExtender(TIFFExtendProc); +extern uint32 TIFFComputeTile(TIFF* tif, uint32 x, uint32 y, uint32 z, uint16 s); +extern int TIFFCheckTile(TIFF* tif, uint32 x, uint32 y, uint32 z, uint16 s); +extern uint32 TIFFNumberOfTiles(TIFF*); +extern tmsize_t TIFFReadTile(TIFF* tif, void* buf, uint32 x, uint32 y, uint32 z, uint16 s); +extern tmsize_t TIFFWriteTile(TIFF* tif, void* buf, uint32 x, uint32 y, uint32 z, uint16 s); +extern uint32 TIFFComputeStrip(TIFF*, uint32, uint16); +extern uint32 TIFFNumberOfStrips(TIFF*); +extern tmsize_t TIFFReadEncodedStrip(TIFF* tif, uint32 strip, void* buf, tmsize_t size); +extern tmsize_t TIFFReadRawStrip(TIFF* tif, uint32 strip, void* buf, tmsize_t size); +extern tmsize_t TIFFReadEncodedTile(TIFF* tif, uint32 tile, void* buf, tmsize_t size); +extern tmsize_t TIFFReadRawTile(TIFF* tif, uint32 tile, void* buf, tmsize_t size); +extern tmsize_t TIFFWriteEncodedStrip(TIFF* tif, uint32 strip, void* data, tmsize_t cc); +extern tmsize_t TIFFWriteRawStrip(TIFF* tif, uint32 strip, void* data, tmsize_t cc); +extern tmsize_t TIFFWriteEncodedTile(TIFF* tif, uint32 tile, void* data, tmsize_t cc); +extern tmsize_t TIFFWriteRawTile(TIFF* tif, uint32 tile, void* data, tmsize_t cc); +extern int TIFFDataWidth(TIFFDataType); /* table of tag datatype widths */ +extern void TIFFSetWriteOffset(TIFF* tif, toff_t off); +extern void TIFFSwabShort(uint16*); +extern void TIFFSwabLong(uint32*); +extern void TIFFSwabLong8(uint64*); +extern void TIFFSwabFloat(float*); +extern void TIFFSwabDouble(double*); +extern void TIFFSwabArrayOfShort(uint16* wp, tmsize_t n); +extern void TIFFSwabArrayOfTriples(uint8* tp, tmsize_t n); +extern void TIFFSwabArrayOfLong(uint32* lp, tmsize_t n); +extern void TIFFSwabArrayOfLong8(uint64* lp, tmsize_t n); +extern void TIFFSwabArrayOfFloat(float* fp, tmsize_t n); +extern void TIFFSwabArrayOfDouble(double* dp, tmsize_t n); +extern void TIFFReverseBits(uint8* cp, tmsize_t n); +extern const unsigned char* TIFFGetBitRevTable(int); + +#ifdef LOGLUV_PUBLIC +#define U_NEU 0.210526316 +#define V_NEU 0.473684211 +#define UVSCALE 410. +extern double LogL16toY(int); +extern double LogL10toY(int); +extern void XYZtoRGB24(float*, uint8*); +extern int uv_decode(double*, double*, int); +extern void LogLuv24toXYZ(uint32, float*); +extern void LogLuv32toXYZ(uint32, float*); +#if defined(c_plusplus) || defined(__cplusplus) +extern int LogL16fromY(double, int = SGILOGENCODE_NODITHER); +extern int LogL10fromY(double, int = SGILOGENCODE_NODITHER); +extern int uv_encode(double, double, int = SGILOGENCODE_NODITHER); +extern uint32 LogLuv24fromXYZ(float*, int = SGILOGENCODE_NODITHER); +extern uint32 LogLuv32fromXYZ(float*, int = SGILOGENCODE_NODITHER); +#else +extern int LogL16fromY(double, int); +extern int LogL10fromY(double, int); +extern int uv_encode(double, double, int); +extern uint32 LogLuv24fromXYZ(float*, int); +extern uint32 LogLuv32fromXYZ(float*, int); +#endif +#endif /* LOGLUV_PUBLIC */ + +extern int TIFFCIELabToRGBInit(TIFFCIELabToRGB*, const TIFFDisplay *, float*); +extern void TIFFCIELabToXYZ(TIFFCIELabToRGB *, uint32, int32, int32, + float *, float *, float *); +extern void TIFFXYZToRGB(TIFFCIELabToRGB *, float, float, float, + uint32 *, uint32 *, uint32 *); + +extern int TIFFYCbCrToRGBInit(TIFFYCbCrToRGB*, float*, float*); +extern void TIFFYCbCrtoRGB(TIFFYCbCrToRGB *, uint32, int32, int32, + uint32 *, uint32 *, uint32 *); + +/**************************************************************************** + * O B S O L E T E D I N T E R F A C E S + * + * Don't use this stuff in your applications, it may be removed in the future + * libtiff versions. + ****************************************************************************/ +typedef struct { + ttag_t field_tag; /* field's tag */ + short field_readcount; /* read count/TIFF_VARIABLE/TIFF_SPP */ + short field_writecount; /* write count/TIFF_VARIABLE */ + TIFFDataType field_type; /* type of associated data */ + unsigned short field_bit; /* bit in fieldsset bit vector */ + unsigned char field_oktochange; /* if true, can change while writing */ + unsigned char field_passcount; /* if true, pass dir count on set */ + char *field_name; /* ASCII name */ +} TIFFFieldInfo; + +extern int TIFFMergeFieldInfo(TIFF*, const TIFFFieldInfo[], uint32); + +#if defined(c_plusplus) || defined(__cplusplus) +} +#endif + +#endif /* _TIFFIO_ */ + +/* vim: set ts=8 sts=8 sw=8 noet: */ +/* + * Local Variables: + * mode: c + * c-basic-offset: 8 + * fill-column: 78 + * End: + */ diff -Nru goldendict-1.5.0~git20131003/winlibs/include/tiff/tiffvers.h goldendict-1.5.0~git20150923/winlibs/include/tiff/tiffvers.h --- goldendict-1.5.0~git20131003/winlibs/include/tiff/tiffvers.h 1970-01-01 00:00:00.000000000 +0000 +++ goldendict-1.5.0~git20150923/winlibs/include/tiff/tiffvers.h 2015-09-23 08:26:24.000000000 +0000 @@ -0,0 +1,9 @@ +#define TIFFLIB_VERSION_STR "LIBTIFF, Version 4.0.3\nCopyright (c) 1988-1996 Sam Leffler\nCopyright (c) 1991-1996 Silicon Graphics, Inc." +/* + * This define can be used in code that requires + * compilation-related definitions specific to a + * version or versions of the library. Runtime + * version checking should be done based on the + * string returned by TIFFGetVersion. + */ +#define TIFFLIB_VERSION 20120922 Binary files /tmp/tfsuf_fVoJ/goldendict-1.5.0~git20131003/winlibs/lib/avcodec-gd-54.dll and /tmp/nAvqxsPo0O/goldendict-1.5.0~git20150923/winlibs/lib/avcodec-gd-54.dll differ Binary files /tmp/tfsuf_fVoJ/goldendict-1.5.0~git20131003/winlibs/lib/avformat-gd-54.dll and /tmp/nAvqxsPo0O/goldendict-1.5.0~git20150923/winlibs/lib/avformat-gd-54.dll differ Binary files /tmp/tfsuf_fVoJ/goldendict-1.5.0~git20131003/winlibs/lib/avutil-gd-52.dll and /tmp/nAvqxsPo0O/goldendict-1.5.0~git20150923/winlibs/lib/avutil-gd-52.dll differ Binary files /tmp/tfsuf_fVoJ/goldendict-1.5.0~git20131003/winlibs/lib/libao-4.dll and /tmp/nAvqxsPo0O/goldendict-1.5.0~git20150923/winlibs/lib/libao-4.dll differ Binary files /tmp/tfsuf_fVoJ/goldendict-1.5.0~git20131003/winlibs/lib/libao.dll.a and /tmp/nAvqxsPo0O/goldendict-1.5.0~git20150923/winlibs/lib/libao.dll.a differ Binary files /tmp/tfsuf_fVoJ/goldendict-1.5.0~git20131003/winlibs/lib/libavcodec-gd.dll.a and /tmp/nAvqxsPo0O/goldendict-1.5.0~git20150923/winlibs/lib/libavcodec-gd.dll.a differ Binary files /tmp/tfsuf_fVoJ/goldendict-1.5.0~git20131003/winlibs/lib/libavformat-gd.dll.a and /tmp/nAvqxsPo0O/goldendict-1.5.0~git20150923/winlibs/lib/libavformat-gd.dll.a differ Binary files /tmp/tfsuf_fVoJ/goldendict-1.5.0~git20131003/winlibs/lib/libavutil-gd.dll.a and /tmp/nAvqxsPo0O/goldendict-1.5.0~git20150923/winlibs/lib/libavutil-gd.dll.a differ Binary files /tmp/tfsuf_fVoJ/goldendict-1.5.0~git20131003/winlibs/lib/libbz2.a and /tmp/nAvqxsPo0O/goldendict-1.5.0~git20150923/winlibs/lib/libbz2.a differ Binary files /tmp/tfsuf_fVoJ/goldendict-1.5.0~git20131003/winlibs/lib/libeb-16.dll and /tmp/nAvqxsPo0O/goldendict-1.5.0~git20150923/winlibs/lib/libeb-16.dll differ Binary files /tmp/tfsuf_fVoJ/goldendict-1.5.0~git20131003/winlibs/lib/libgcc_s_dw2-1.dll and /tmp/nAvqxsPo0O/goldendict-1.5.0~git20150923/winlibs/lib/libgcc_s_dw2-1.dll differ Binary files /tmp/tfsuf_fVoJ/goldendict-1.5.0~git20131003/winlibs/lib/libiconv-2.dll and /tmp/nAvqxsPo0O/goldendict-1.5.0~git20150923/winlibs/lib/libiconv-2.dll differ Binary files /tmp/tfsuf_fVoJ/goldendict-1.5.0~git20131003/winlibs/lib/libiconv.dll.a and /tmp/nAvqxsPo0O/goldendict-1.5.0~git20150923/winlibs/lib/libiconv.dll.a differ Binary files /tmp/tfsuf_fVoJ/goldendict-1.5.0~git20131003/winlibs/lib/liblzma.a and /tmp/nAvqxsPo0O/goldendict-1.5.0~git20150923/winlibs/lib/liblzma.a differ Binary files /tmp/tfsuf_fVoJ/goldendict-1.5.0~git20131003/winlibs/lib/liblzo2.a and /tmp/nAvqxsPo0O/goldendict-1.5.0~git20150923/winlibs/lib/liblzo2.a differ Binary files /tmp/tfsuf_fVoJ/goldendict-1.5.0~git20131003/winlibs/lib/libogg.a and /tmp/nAvqxsPo0O/goldendict-1.5.0~git20150923/winlibs/lib/libogg.a differ Binary files /tmp/tfsuf_fVoJ/goldendict-1.5.0~git20131003/winlibs/lib/libtiff-5.dll and /tmp/nAvqxsPo0O/goldendict-1.5.0~git20150923/winlibs/lib/libtiff-5.dll differ Binary files /tmp/tfsuf_fVoJ/goldendict-1.5.0~git20131003/winlibs/lib/libvorbis.a and /tmp/nAvqxsPo0O/goldendict-1.5.0~git20150923/winlibs/lib/libvorbis.a differ Binary files /tmp/tfsuf_fVoJ/goldendict-1.5.0~git20131003/winlibs/lib/libvorbisfile.a and /tmp/nAvqxsPo0O/goldendict-1.5.0~git20150923/winlibs/lib/libvorbisfile.a differ Binary files /tmp/tfsuf_fVoJ/goldendict-1.5.0~git20131003/winlibs/lib/libz.dll.a and /tmp/nAvqxsPo0O/goldendict-1.5.0~git20150923/winlibs/lib/libz.dll.a differ Binary files /tmp/tfsuf_fVoJ/goldendict-1.5.0~git20131003/winlibs/lib/zlib1.dll and /tmp/nAvqxsPo0O/goldendict-1.5.0~git20150923/winlibs/lib/zlib1.dll differ diff -Nru goldendict-1.5.0~git20131003/wordbyauto.cc goldendict-1.5.0~git20150923/wordbyauto.cc --- goldendict-1.5.0~git20131003/wordbyauto.cc 2013-08-16 09:45:56.000000000 +0000 +++ goldendict-1.5.0~git20150923/wordbyauto.cc 2015-09-23 08:26:24.000000000 +0000 @@ -4,7 +4,7 @@ #include "uiauto.hh" #include -#include "dprintf.hh" +#include "gddebug.hh" class GDAutomationClient { public: @@ -49,14 +49,14 @@ RECT r = { 0, 0, 0, 0 }; bool bGoUp; - DPRINTF("\nEntering getWordAtPoint\n"); + GD_DPRINTF("\nEntering getWordAtPoint\n"); if( pGDAutomation == NULL ) return false; buffer[0] = 0; pElement = NULL; hr = pGDAutomation->ElementFromPoint( pt, &pElement ); - DPRINTF("ElementFromPoint return hr=%08lX, ptr=%p\n", hr, pElement); + GD_DPRINTF("ElementFromPoint return hr=%08lX, ptr=%p\n", hr, pElement); if( hr != S_OK || pElement == NULL ) return false; diff -Nru goldendict-1.5.0~git20131003/wordfinder.cc goldendict-1.5.0~git20150923/wordfinder.cc --- goldendict-1.5.0~git20131003/wordfinder.cc 2013-10-02 20:42:04.000000000 +0000 +++ goldendict-1.5.0~git20150923/wordfinder.cc 2015-09-23 08:26:24.000000000 +0000 @@ -6,7 +6,7 @@ #include "wstring_qt.hh" #include #include -#include "dprintf.hh" +#include "gddebug.hh" using std::vector; using std::list; @@ -86,6 +86,31 @@ startSearch(); } +void WordFinder::expressionMatch( QString const & str, + std::vector< sptr< Dictionary::Class > > const & dicts, + unsigned long maxResults, + Dictionary::Features features ) +{ + cancel(); + + searchQueued = true; + searchType = ExpressionMatch; + inputWord = str; + inputDicts = &dicts; + requestedMaxResults = maxResults; + requestedFeatures = features; + + resultsArray.clear(); + resultsIndex.clear(); + searchResults.clear(); + + if ( queuedRequests.empty() ) + { + // No requests are queued, no need to wait for them to finish. + startSearch(); + } +} + void WordFinder::startSearch() { if ( !searchQueued ) @@ -127,7 +152,7 @@ try { sptr< Dictionary::WordSearchRequest > sr = - ( searchType == PrefixMatch ) ? + ( searchType == PrefixMatch || searchType == ExpressionMatch ) ? (*inputDicts)[ x ]->prefixMatch( allWordWritings[ y ], requestedMaxResults ) : (*inputDicts)[ x ]->stemmedMatch( allWordWritings[ y ], stemmedMinLength, stemmedMaxSuffixVariation, requestedMaxResults ); @@ -138,9 +163,8 @@ } catch( std::exception & e ) { - qWarning() << "Word \"" << inputWord << "\" search error (" << e.what() << ") in \"" - << QString::fromUtf8( (*inputDicts)[ x ]->getName().c_str() ) - << "\""; + gdWarning( "Word \"%s\" search error (%s) in \"%s\"\n", + inputWord.toUtf8().data(), e.what(), (*inputDicts)[ x ]->getName().c_str() ); } } } @@ -274,6 +298,8 @@ if ( updateResultsTimer.isActive() ) updateResultsTimer.stop(); // Can happen when we were done before it'd expire + wstring original = Folding::applySimpleCaseOnly( allWordWritings[ 0 ] ); + for( list< sptr< Dictionary::WordSearchRequest > >::iterator i = finishedRequests.begin(); i != finishedRequests.end(); ) { @@ -283,6 +309,30 @@ int weight = (**i)[ x ].weight; wstring lowerCased = Folding::applySimpleCaseOnly( match ); + if( searchType == ExpressionMatch ) + { + unsigned ws; + + for( ws = 0; ws < allWordWritings.size(); ws++ ) + { + if( ws == 0 ) + { + // Check for prefix match with original expression + if( lowerCased.compare( 0, original.size(), original ) == 0 ) + break; + } + else + if( lowerCased == Folding::applySimpleCaseOnly( allWordWritings[ ws ] ) ) + break; + } + + if( ws >= allWordWritings.size() ) + { + // No exact matches found + continue; + } + weight = ws; + } pair< ResultsIndex::iterator, bool > insertResult = resultsIndex.insert( pair< wstring, ResultsArray::iterator >( lowerCased, resultsArray.end() ) ); @@ -401,6 +451,7 @@ resultsArray.sort( SortByRank() ); } else + if( searchType == StemmedMatch ) { // Handling stemmed matches diff -Nru goldendict-1.5.0~git20131003/wordfinder.hh goldendict-1.5.0~git20150923/wordfinder.hh --- goldendict-1.5.0~git20131003/wordfinder.hh 2012-10-01 07:15:21.000000000 +0000 +++ goldendict-1.5.0~git20150923/wordfinder.hh 2015-09-23 08:26:24.000000000 +0000 @@ -41,7 +41,8 @@ enum SearchType { PrefixMatch, - StemmedMatch + StemmedMatch, + ExpressionMatch } searchType; unsigned long requestedMaxResults; Dictionary::Features requestedFeatures; @@ -94,6 +95,13 @@ unsigned long maxResults = 30, Dictionary::Features = Dictionary::NoFeatures ); + /// Do the expression-match search in the given list of dictionaries. + /// Function find exact matches for one of spelling suggestions. + void expressionMatch( QString const &, + std::vector< sptr< Dictionary::Class > > const &, + unsigned long maxResults = 40, + Dictionary::Features = Dictionary::NoFeatures ); + /// Returns the vector containing search results from the last operation. /// If it didn't finish yet, the result is not final and may be changing /// over time. diff -Nru goldendict-1.5.0~git20131003/wordlist.cc goldendict-1.5.0~git20150923/wordlist.cc --- goldendict-1.5.0~git20131003/wordlist.cc 2013-10-02 20:42:04.000000000 +0000 +++ goldendict-1.5.0~git20150923/wordlist.cc 2015-09-23 08:26:24.000000000 +0000 @@ -137,3 +137,20 @@ } } + +void WordList::resizeEvent( QResizeEvent * ev ) +{ + // In some rare cases Qt start send QResizeEvent recursively + // up to full stack depletion (tested on Qt 4.8.5, 4.8.6). + // We use this trick to break such suicidal process. + + for( int x = 0; x < resizedSizes.size(); x++ ) + if( resizedSizes.at( x ) == ev->size() ) + return; + + resizedSizes.push_back( ev->size() ); + + QListWidget::resizeEvent( ev ); + + resizedSizes.pop_back(); +} diff -Nru goldendict-1.5.0~git20131003/wordlist.hh goldendict-1.5.0~git20150923/wordlist.hh --- goldendict-1.5.0~git20131003/wordlist.hh 2013-08-16 09:45:56.000000000 +0000 +++ goldendict-1.5.0~git20150923/wordlist.hh 2015-09-23 08:26:24.000000000 +0000 @@ -19,6 +19,9 @@ virtual void setTranslateLine(QLineEdit * line) { translateLine = line; } +protected: + virtual void resizeEvent( QResizeEvent * ev ); + signals: void statusBarMessage(QString const & message, int timeout = 0, QPixmap const & pixmap = QPixmap()); void contentChanged(); @@ -36,6 +39,8 @@ WordFinder * wordFinder; QLineEdit * translateLine; WordListItemDelegate listItemDelegate; + + QVector< QSize > resizedSizes; }; #endif // WORDLIST_HH diff -Nru goldendict-1.5.0~git20131003/xdxf2html.cc goldendict-1.5.0~git20150923/xdxf2html.cc --- goldendict-1.5.0~git20131003/xdxf2html.cc 2013-10-02 20:42:04.000000000 +0000 +++ goldendict-1.5.0~git20150923/xdxf2html.cc 2015-09-23 08:26:24.000000000 +0000 @@ -3,7 +3,7 @@ #include "xdxf2html.hh" #include -#include "dprintf.hh" +#include "gddebug.hh" #include "utf8.hh" #include "wstring_qt.hh" #include "folding.hh" @@ -57,7 +57,8 @@ } string convert( string const & in, DICT_TYPE type, map < string, string > const * pAbrv, - Dictionary::Class *dictPtr, bool isLogicalFormat, unsigned revisionNumber ) + Dictionary::Class *dictPtr, IndexedZip * resourceZip, + bool isLogicalFormat, unsigned revisionNumber, QString * headword ) { // DPRINTF( "Source>>>>>>>>>>: %s\n\n\n", in.c_str() ); @@ -124,7 +125,7 @@ if( !dd.setContent( QByteArray( in_data.c_str() ), false, &errorStr, &errorLine, &errorColumn ) ) { qWarning( "Xdxf2html error, xml parse failed: %s at %d,%d\n", errorStr.toLocal8Bit().constData(), errorLine, errorColumn ); - qWarning( "The input was: %s\n", in.c_str() ); + gdWarning( "The input was: %s\n", in.c_str() ); return in; } @@ -154,6 +155,9 @@ nodes = dd.elementsByTagName( "k" ); // Key + if( headword ) + headword->clear(); + while( nodes.size() ) { QDomElement el = nodes.at( 0 ).toElement(); @@ -165,6 +169,9 @@ } else { + if( headword && headword->isEmpty() ) + *headword = el.text(); + el.setTagName( "div" ); el.setAttribute( "class", "xdxf_headwords" ); if( dictPtr->isFromLanguageRTL() != dictPtr->isToLanguageRTL() ) @@ -303,8 +310,12 @@ { QDomElement el = nodes.at( 0 ).toElement(); + QString ref = el.attribute( "href" ); + if( ref.isEmpty() ) + ref = el.text(); + + el.setAttribute( "href", ref ); el.setTagName( "a" ); - el.setAttribute( "href", el.text() ); } // Abbreviations @@ -499,15 +510,40 @@ } else if( Filetype::isNameOfSound( filename ) ) { - QUrl url; - url.setScheme( "gdau" ); - url.setHost( QString::fromUtf8( dictPtr->getId().c_str() ) ); - url.setPath( QString::fromUtf8( filename.c_str() ) ); - QDomElement el_script = dd.createElement( "script" ); QDomNode parent = el.parentNode(); if( !parent.isNull() ) { + bool search = false; + if( type == STARDICT ) + { + string n = FsEncoding::dirname( dictPtr->getDictionaryFilenames()[ 0 ] ) + + FsEncoding::separator() + string( "res" ) + FsEncoding::separator() + + FsEncoding::encode( filename ); + search = !File::exists( n ) && + ( !resourceZip || + !resourceZip->isOpen() || + !resourceZip->hasFile( Utf8::decode( filename ) ) ); + } + else + { + string n = dictPtr->getDictionaryFilenames()[ 0 ] + ".files" + + FsEncoding::separator() + + FsEncoding::encode( filename ); + search = !File::exists( n ) && !File::exists( FsEncoding::dirname( dictPtr->getDictionaryFilenames()[ 0 ] ) + + FsEncoding::separator() + + FsEncoding::encode( filename ) ) && + ( !resourceZip || + !resourceZip->isOpen() || + !resourceZip->hasFile( Utf8::decode( filename ) ) ); + } + + + QUrl url; + url.setScheme( "gdau" ); + url.setHost( QString::fromUtf8( search ? "search" : dictPtr->getId().c_str() ) ); + url.setPath( QString::fromUtf8( filename.c_str() ) ); + el_script.setAttribute( "type", "text/javascript" ); parent.replaceChild( el_script, el ); diff -Nru goldendict-1.5.0~git20131003/xdxf2html.hh goldendict-1.5.0~git20150923/xdxf2html.hh --- goldendict-1.5.0~git20131003/xdxf2html.hh 2013-08-16 09:41:47.000000000 +0000 +++ goldendict-1.5.0~git20150923/xdxf2html.hh 2015-09-23 08:26:24.000000000 +0000 @@ -7,6 +7,7 @@ #include #include #include "dictionary.hh" +#include "indexedzip.hh" /// Xdxf is an xml file format. Since we display html, we'd like to be able /// to convert articles with such a markup to an html. @@ -19,8 +20,9 @@ /// Converts the given xdxf markup to an html one. This is currently used /// for Stardict's 'x' records. -string convert( string const &, DICT_TYPE type = STARDICT, map < string, string > const * pAbrv = NULL, - Dictionary::Class *dictPtr = NULL, bool isLogicalFormat = false, unsigned revisionNumber = 0 ); +string convert( string const &, DICT_TYPE type, map < string, string > const * pAbrv, + Dictionary::Class *dictPtr, IndexedZip * resourceZip, bool isLogicalFormat = false, + unsigned revisionNumber = 0, QString * headword = 0 ); } diff -Nru goldendict-1.5.0~git20131003/xdxf.cc goldendict-1.5.0~git20150923/xdxf.cc --- goldendict-1.5.0~git20131003/xdxf.cc 2013-10-02 20:42:04.000000000 +0000 +++ goldendict-1.5.0~git20150923/xdxf.cc 2015-09-23 08:26:24.000000000 +0000 @@ -16,7 +16,7 @@ #include #include #include -#include "dprintf.hh" +#include "gddebug.hh" #include "wstring_qt.hh" #include "xdxf2html.hh" #include "ufile.hh" @@ -24,6 +24,8 @@ #include "langcoder.hh" #include "indexedzip.hh" #include "filetype.hh" +#include "tiff.hh" +#include "ftshelpers.hh" #ifdef _MSC_VER #include @@ -36,6 +38,7 @@ #include #include #include +#include #include #include @@ -61,6 +64,7 @@ DEF_EX_STR( exCantReadFile, "Can't read file", Dictionary::Ex ) DEF_EX_STR( exNotXdxfFile, "The file is not an XDXF file:", Dictionary::Ex ) DEF_EX( exCorruptedIndex, "The index file is corrupted", Dictionary::Ex ) +DEF_EX_STR( exDictzipError, "DICTZIP error", Dictionary::Ex ) enum { @@ -169,6 +173,21 @@ virtual QString getMainFilename(); + virtual sptr< Dictionary::DataRequest > getSearchResults( QString const & searchString, + int searchMode, bool matchCase, + int distanceBetweenWords, + int maxResults ); + virtual void getArticleText( uint32_t articleAddress, QString & headword, QString & text ); + + virtual void makeFTSIndex(QAtomicInt & isCancelled, bool firstIteration ); + + virtual void setFTSParameters( Config::FullTextSearch const & fts ) + { + can_FTS = fts.enabled + && !fts.disabledTypes.contains( "XDXF", Qt::CaseInsensitive ) + && ( fts.maxDictionarySize == 0 || getArticleCount() <= fts.maxDictionarySize ); + } + protected: void loadIcon() throw(); @@ -177,7 +196,7 @@ // Loads the article, storing its headword and formatting article's data into an html. void loadArticle( uint32_t address, - string & articleText ); + string & articleText, QString * headword = 0 ); friend class XdxfArticleRequest; friend class XdxfResourceRequest; @@ -204,10 +223,12 @@ // Open the file - dz = dict_data_open( dictionaryFiles[ 0 ].c_str(), 0 ); + DZ_ERRORS error; + dz = dict_data_open( dictionaryFiles[ 0 ].c_str(), &error, 0 ); if ( !dz ) - throw exCantReadFile( dictionaryFiles[ 0 ] ); + throw exDictzipError( string( dz_error_str( error ) ) + + "(" + dictionaryFiles[ 0 ] + ")" ); // Read the abrv, if any @@ -263,6 +284,16 @@ openIndex( IndexInfo( idxHeader.indexBtreeMaxElements, idxHeader.indexRootOffset ), idx, idxMutex ); + + // Full-text search parameters + + can_FTS = true; + + ftsIdxName = indexFile + "_FTS"; + + if( !Dictionary::needToRebuildIndex( dictionaryFiles, ftsIdxName ) + && !FtsHelpers::ftsIndexIsOldOrBad( ftsIdxName, this ) ) + FTS_index_completed.ref(); } XdxfDictionary::~XdxfDictionary() @@ -321,7 +352,7 @@ Mutex::Lock _( idxMutex ); descr = chunks->getBlock( idxHeader.descriptionAddress, chunk ); } - dictionaryDescription = QString::fromUtf8( descr ); + dictionaryDescription = QString::fromUtf8( descr, idxHeader.descriptionSize ); } catch(...) { @@ -335,6 +366,61 @@ return FsEncoding::decode( getDictionaryFilenames()[ 0 ].c_str() ); } +void XdxfDictionary::makeFTSIndex( QAtomicInt & isCancelled, bool firstIteration ) +{ + if( !( Dictionary::needToRebuildIndex( getDictionaryFilenames(), ftsIdxName ) + || FtsHelpers::ftsIndexIsOldOrBad( ftsIdxName, this ) ) ) + FTS_index_completed.ref(); + + if( haveFTSIndex() ) + return; + + if( ensureInitDone().size() ) + return; + + if( firstIteration && getArticleCount() > FTS::MaxDictionarySizeForFastSearch ) + return; + + gdDebug( "Xdxf: Building the full-text index for dictionary: %s\n", + getName().c_str() ); + + try + { + FtsHelpers::makeFTSIndex( this, isCancelled ); + FTS_index_completed.ref(); + } + catch( std::exception &ex ) + { + gdWarning( "Xdxf: Failed building full-text search index for \"%s\", reason: %s\n", getName().c_str(), ex.what() ); + QFile::remove( FsEncoding::decode( ftsIdxName.c_str() ) ); + } +} + +void XdxfDictionary::getArticleText( uint32_t articleAddress, QString & headword, QString & text ) +{ + try + { + string articleStr; + loadArticle( articleAddress, articleStr, &headword ); + + wstring wstr = Utf8::decode( articleStr ); + + text = Html::unescape( gd::toQString( wstr ) ); + } + catch( std::exception &ex ) + { + gdWarning( "Xdxf: Failed retrieving article from \"%s\", reason: %s\n", getName().c_str(), ex.what() ); + } +} + +sptr< Dictionary::DataRequest > XdxfDictionary::getSearchResults( QString const & searchString, + int searchMode, bool matchCase, + int distanceBetweenWords, + int maxResults ) +{ + return new FtsHelpers::FTSResultsRequest( *this, searchString,searchMode, matchCase, distanceBetweenWords, maxResults ); +} + /// XdxfDictionary::getArticle() class XdxfArticleRequest; @@ -468,7 +554,7 @@ } catch( std::exception &ex ) { - qWarning( "XDXF: Failed loading article from \"%s\", reason: %s\n", dict.getName().c_str(), ex.what() ); + gdWarning( "XDXF: Failed loading article from \"%s\", reason: %s\n", dict.getName().c_str(), ex.what() ); } } @@ -526,7 +612,8 @@ } void XdxfDictionary::loadArticle( uint32_t address, - string & articleText ) + string & articleText, + QString * headword ) { // Read the properties @@ -572,7 +659,7 @@ } articleText = Xdxf2Html::convert( string( articleBody ), Xdxf2Html::XDXF, idxHeader.hasAbrv ? &abrv : NULL, this, - fType == Logical, idxHeader.revisionNumber ); + &resourceZip, fType == Logical, idxHeader.revisionNumber, headword ); free( articleBody ); } @@ -608,7 +695,7 @@ virtual qint64 readData( char * data, qint64 maxSize ); - virtual bool atEnd(); + virtual bool atEnd() const; virtual qint64 writeData ( const char * /*data*/, qint64 /*maxSize*/ ) { return -1; } @@ -620,8 +707,8 @@ if ( !gz ) throw exCantReadFile( fileName ); - dz = dict_data_open( fileName, 0 ); - + DZ_ERRORS error; + dz = dict_data_open( fileName, &error, 0 ); } GzippedFile::~GzippedFile() @@ -631,7 +718,7 @@ dict_data_close( dz ); } -bool GzippedFile::atEnd() +bool GzippedFile::atEnd() const { return gzeof( gz ); } @@ -810,6 +897,9 @@ chunks.addToBlock( &offs, sizeof( offs ) ); chunks.addToBlock( &size, sizeof( size ) ); + // Add also first header - it's needed for full-text search + chunks.addToBlock( words.begin()->toUtf8().data(), words.begin()->toUtf8().length() + 1 ); + // DPRINTF( "%x: %s\n", articleOffset, words.begin()->toUtf8().data() ); // Add words to index @@ -919,7 +1009,7 @@ FsEncoding::separator() + FsEncoding::encode( resourceName ); - DPRINTF( "n is %s\n", n.c_str() ); + GD_DPRINTF( "n is %s\n", n.c_str() ); try { @@ -968,6 +1058,11 @@ QImage img = QImage::fromData( (unsigned char *) &data.front(), data.size() ); +#ifdef MAKE_EXTRA_TIFF_HANDLER + if( img.isNull() ) + GdTiff::tiffToQImage( &data.front(), data.size(), img ); +#endif + dataMutex.unlock(); if ( !img.isNull() ) @@ -993,8 +1088,8 @@ } catch( std::exception &ex ) { - qWarning( "XDXF: Failed loading resource \"%s\" for \"%s\", reason: %s\n", - resourceName.c_str(), dict.getName().c_str(), ex.what() ); + gdWarning( "XDXF: Failed loading resource \"%s\" for \"%s\", reason: %s\n", + resourceName.c_str(), dict.getName().c_str(), ex.what() ); // Resource not loaded -- we don't set the hasAnyData flag then } @@ -1054,7 +1149,7 @@ { // Building the index - qDebug( "Xdxf: Building the index for dictionary: %s\n", i->c_str() ); + gdDebug( "Xdxf: Building the index for dictionary: %s\n", i->c_str() ); //initializing.indexingDictionary( nameFromFileName( dictFiles[ 0 ] ) ); @@ -1114,7 +1209,10 @@ idxHeader.langTo = LangCoder::findIdForLanguageCode3( str.c_str() ); bool isLogical = ( stream.attributes().value( "format" ) == "logical" ); - idxHeader.revisionNumber = stream.attributes().value( "revision" ).toString().toUInt(); + + QRegExp regNum( "\\d+" ); + regNum.indexIn( stream.attributes().value( "revision" ).toString() ); + idxHeader.revisionNumber = regNum.cap().toUInt(); idxHeader.articleFormat = isLogical ? Logical : Visual; @@ -1149,7 +1247,7 @@ } else { - DPRINTF( "Warning: duplicate full_name in %s\n", dictFiles[ 0 ].c_str() ); + GD_DPRINTF( "Warning: duplicate full_name in %s\n", dictFiles[ 0 ].c_str() ); } } else @@ -1171,7 +1269,7 @@ } else { - DPRINTF( "Warning: duplicate description in %s\n", dictFiles[ 0 ].c_str() ); + GD_DPRINTF( "Warning: duplicate description in %s\n", dictFiles[ 0 ].c_str() ); } } else @@ -1282,7 +1380,7 @@ if ( zipFileName.size() ) { - DPRINTF( "Indexing zip file\n" ); + GD_DPRINTF( "Indexing zip file\n" ); idxHeader.hasZipFile = 1; @@ -1334,9 +1432,9 @@ if ( stream.hasError() ) { - qWarning( "Warning: %s had a parse error %ls at line %lu, and therefore was indexed only up to the point of error.", - dictFiles[ 0 ].c_str(), stream.errorString().toStdWString().c_str(), - (unsigned long) stream.lineNumber() ); + gdWarning( "Warning: %s had a parse error %s at line %lu, and therefore was indexed only up to the point of error.", + dictFiles[ 0 ].c_str(), stream.errorString().toUtf8().data(), + (unsigned long) stream.lineNumber() ); } } @@ -1346,8 +1444,8 @@ } catch( std::exception & e ) { - qWarning( "Xdxf dictionary reading failed: %s, error: %s\n", - i->c_str(), e.what() ); + gdWarning( "Xdxf dictionary initializing failed: %s, error: %s\n", + i->c_str(), e.what() ); } } diff -Nru goldendict-1.5.0~git20131003/zim.cc goldendict-1.5.0~git20150923/zim.cc --- goldendict-1.5.0~git20131003/zim.cc 2013-10-02 20:42:04.000000000 +0000 +++ goldendict-1.5.0~git20150923/zim.cc 2015-09-23 08:26:24.000000000 +0000 @@ -7,13 +7,16 @@ #include "btreeidx.hh" #include "fsencoding.hh" #include "folding.hh" -#include "dprintf.hh" +#include "gddebug.hh" #include "utf8.hh" #include "decompress.hh" #include "langcoder.hh" #include "wstring_qt.hh" #include "filetype.hh" #include "file.hh" +#include "tiff.hh" +#include "ftshelpers.hh" +#include "htmlescape.hh" #ifdef _MSC_VER #include @@ -50,6 +53,8 @@ DEF_EX_STR( exNotZimFile, "Not an Zim file", Dictionary::Ex ) DEF_EX_STR( exCantReadFile, "Can't read file", Dictionary::Ex ) +DEF_EX( exUserAbort, "User abort", Dictionary::Ex ) + //namespace { @@ -313,9 +318,11 @@ header.formatVersion != CurrentFormatVersion; } -quint32 readArticle( ZimFile & file, ZIM_header & header, uint32_t articleNumber, string & result, +quint32 readArticle( ZimFile & file, ZIM_header & header, quint32 articleNumber, string & result, set< quint32 > * loadedArticles = NULL ) { + result.clear(); + while( 1 ) { if( articleNumber >= header.articleCount ) @@ -404,7 +411,6 @@ memcpy( offsets, decompressedData.data() + artEntry.blobNumber * 4, sizeof(offsets) ); quint32 size = offsets[ 1 ] - offsets[ 0 ]; - result.clear(); result.append( decompressedData, offsets[ 0 ], size ); return articleNumber; @@ -416,6 +422,8 @@ class ZimDictionary: public BtreeIndexing::BtreeDictionary { + enum LINKS_TYPE { UNKNOWN, SLASH, NO_SLASH }; + Mutex idxMutex; Mutex zimMutex, idxResourceMutex; File::Class idx; @@ -424,6 +432,8 @@ string dictionaryName; ZimFile df; ZIM_header zimHeader; + set< quint32 > articlesIndexedForFTS; + LINKS_TYPE linksType; public: @@ -463,6 +473,24 @@ /// Loads the resource. void loadResource( std::string &resourceName, string & data ); + virtual sptr< Dictionary::DataRequest > getSearchResults( QString const & searchString, + int searchMode, bool matchCase, + int distanceBetweenWords, + int maxResults ); + virtual void getArticleText( uint32_t articleAddress, QString & headword, QString & text ); + + quint32 getArticleText( uint32_t articleAddress, QString & headword, QString & text, + set< quint32 > * loadedArticles ); + + virtual void makeFTSIndex(QAtomicInt & isCancelled, bool firstIteration ); + + virtual void setFTSParameters( Config::FullTextSearch const & fts ) + { + can_FTS = fts.enabled + && !fts.disabledTypes.contains( "ZIM", Qt::CaseInsensitive ) + && ( fts.maxDictionarySize == 0 || getArticleCount() <= fts.maxDictionarySize ); + } + protected: virtual void loadIcon() throw(); @@ -472,7 +500,8 @@ /// Loads the article. quint32 loadArticle( quint32 address, string & articleText, - set< quint32 > * loadedArticles ); + set< quint32 > * loadedArticles, + bool rawText = false ); string convert( string const & in_data ); friend class ZimArticleRequest; @@ -485,7 +514,8 @@ BtreeDictionary( id, dictionaryFiles ), idx( indexFile, "rb" ), idxHeader( idx.read< IdxHeader >() ), - df( FsEncoding::decode( dictionaryFiles[ 0 ].c_str() ) ) + df( FsEncoding::decode( dictionaryFiles[ 0 ].c_str() ) ), + linksType( UNKNOWN ) { // Open data file @@ -515,6 +545,16 @@ { readArticle( df, zimHeader, idxHeader.namePtr, dictionaryName ); } + + // Full-text search parameters + + can_FTS = true; + + ftsIdxName = indexFile + "_FTS"; + + if( !Dictionary::needToRebuildIndex( dictionaryFiles, ftsIdxName ) + && !FtsHelpers::ftsIndexIsOldOrBad( ftsIdxName, this ) ) + FTS_index_completed.ref(); } ZimDictionary::~ZimDictionary() @@ -544,14 +584,16 @@ quint32 ZimDictionary::loadArticle( quint32 address, string & articleText, - set< quint32 > * loadedArticles ) + set< quint32 > * loadedArticles, + bool rawText ) { quint32 ret; { Mutex::Lock _( zimMutex ); ret = readArticle( df, zimHeader, address, articleText, loadedArticles ); } - articleText = convert( articleText ); + if( !rawText ) + articleText = convert( articleText ); return ret; } @@ -559,20 +601,116 @@ { QString text = QString::fromUtf8( in.c_str() ); - text.replace( QRegExp( "<\\s*body\\s*([^>]*)background:([^;\"]*)" ), - QString( "]*)(background(|-color)):([^;\"]*(|;))" ), + QString( "]*)src=(\"|)(\\.\\.|)/" ), + QString( "<\\1 \\2src=\\3bres://%1/").arg( getId().c_str() ) ); - text.replace( QRegExp( "<\\s*(img|script)\\s*([^>]*)src=\"/" ), - QString( "<\\1 \\2src=\"bres://%1/").arg( getId().c_str() ) ); + // Fix links without '"' + text.replace( QRegExp( "href=(\\.\\.|)/([^\\s>]+)" ), QString( "href=\"\\1/\\2\"" ) ); - text.replace( QRegExp( "<\\s*link\\s*([^>]*)href=\"/" ), + // pattern + text.replace( QRegExp( "<\\s*link\\s*([^>]*)href=\"(\\.\\.|)/" ), QString( "]*)href=\"/[^\"]*\"\\s*title=\"([^\"]*)\"" ), - QString( " series links + // excluding those keywords that have ":" in it + QString urlWiki = "\"http(s|)://en\\.(wiki(pedia|books|news|quote|source|voyage|versity)|wiktionary)\\.(org|com)/wiki/([^:\"]*)\""; + text.replace( QRegExp( "<\\s*a\\s+(class=\"external\"\\s+|)href=" + urlWiki ), + QString( ", excluding any known protocols such as http://, mailto:, #(comment) + // these links will be translated into local definitions + QRegExp rxLink( "<\\s*a\\s+([^>]*)href=\"(?!(\\w+://|#|mailto:|tel:))(/|)([^\"]*)\"\\s*(title=\"[^\"]*\")?[^>]*>", + Qt::CaseSensitive, + QRegExp::RegExp2 ); + int pos = 0; + while( (pos = rxLink.indexIn( text, pos )) >= 0 ) + { + QStringList list = rxLink.capturedTexts(); + QString tag = list[3]; // a url, ex: Precambrian_Chaotian.html + if ( !list[4].isEmpty() ) // a title, ex: title="Precambrian/Chaotian" + tag = list[4].split("\"")[1]; + + + // Check type of links inside articles + if( linksType == UNKNOWN && tag.indexOf( '/' ) >= 0 ) + { + QString word = QUrl::fromPercentEncoding( tag.toLatin1() ); + word.remove( QRegExp( "\\.(s|)htm(l|)$", Qt::CaseInsensitive ) ). + replace( "_", " " ); + + vector< WordArticleLink > links; + links = findArticles( gd::toWString( word ) ); + + if( !links.empty() ) + { + linksType = SLASH; + } + else + { + word.remove( QRegExp(".*/") ); + links = findArticles( gd::toWString( word ) ); + if( !links.empty() ) + { + linksType = NO_SLASH; + links.clear(); + } + } + } + + if( linksType == SLASH || linksType == UNKNOWN ) + { + tag.remove( QRegExp( "\\.(s|)htm(l|)$", Qt::CaseInsensitive ) ). + replace( "_", "%20" ). + prepend( "" ); + } + else + { + tag.remove( QRegExp(".*/") ). + remove( QRegExp( "\\.(s|)htm(l|)$", Qt::CaseInsensitive ) ). + replace( "_", "%20" ). + prepend( "" ); + } + + text.replace( pos, list[0].length(), tag ); + pos += tag.length() + 1; + } - text.replace( QRegExp( "<\\s*a\\s*([^>]*)href=\"/A/([^\"]*)\"" ), - QString( " were changed to somewhere + // proper style: N
e
o
p
t
e
r
a
+ QRegExp rxBR( "(]*>)\\s*((\\w\\s*<br(\\\\|/|)>\\s*)+\\w)\\s*", + Qt::CaseSensitive, + QRegExp::RegExp2 ); + pos = 0; + while( (pos = rxBR.indexIn( text, pos )) >= 0 ) + { + QStringList list = rxBR.capturedTexts(); + QString tag = list[2]; + tag.replace( QRegExp( "<br( |)(\\\\|/|)>", Qt::CaseInsensitive ) , "
" ). + prepend( list[1] ). + append( "" ); + + text.replace( pos, list[0].length(), tag ); + pos += tag.length() + 1; + } + + // // output all links in the page - only for analysis + // QRegExp rxPrintAllLinks( "<\\s*a\\s+[^>]*href=\"[^\"]*\"[^>]*>", + // Qt::CaseSensitive, + // QRegExp::RegExp2 ); + // pos = 0; + // while( (pos = rxPrintAllLinks.indexIn( text, pos )) >= 0 ) + // { + // QStringList list = rxPrintAllLinks.capturedTexts(); + // qDebug() << "\n--Alllinks--" << list[0]; + // pos += list[0].length() + 1; + // } // Fix outstanding elements text += "
"; @@ -613,6 +751,192 @@ return dictionaryDescription; } +void ZimDictionary::makeFTSIndex( QAtomicInt & isCancelled, bool firstIteration ) +{ + if( !( Dictionary::needToRebuildIndex( getDictionaryFilenames(), ftsIdxName ) + || FtsHelpers::ftsIndexIsOldOrBad( ftsIdxName, this ) ) ) + FTS_index_completed.ref(); + + if( haveFTSIndex() ) + return; + + if( ensureInitDone().size() ) + return; + + if( firstIteration ) + return; + + gdDebug( "Zim: Building the full-text index for dictionary: %s\n", + getName().c_str() ); + + try + { + Mutex::Lock _( getFtsMutex() ); + + File::Class ftsIdx( ftsIndexName(), "wb" ); + + FtsHelpers::FtsIdxHeader ftsIdxHeader; + memset( &ftsIdxHeader, 0, sizeof( ftsIdxHeader ) ); + + // We write a dummy header first. At the end of the process the header + // will be rewritten with the right values. + + ftsIdx.write( ftsIdxHeader ); + + ChunkedStorage::Writer chunks( ftsIdx ); + + BtreeIndexing::IndexedWords indexedWords; + + QSet< uint32_t > setOfOffsets; + + findArticleLinks( 0, &setOfOffsets, 0, &isCancelled ); + + if( isCancelled ) + throw exUserAbort(); + + QVector< uint32_t > offsets; + offsets.resize( setOfOffsets.size() ); + uint32_t * ptr = &offsets.front(); + + for( QSet< uint32_t >::ConstIterator it = setOfOffsets.constBegin(); + it != setOfOffsets.constEnd(); ++it ) + { + *ptr = *it; + ptr++; + } + + // Free memory + setOfOffsets.clear(); + + if( isCancelled ) + throw exUserAbort(); + + qSort( offsets ); + + if( isCancelled ) + throw exUserAbort(); + + QMap< QString, QVector< uint32_t > > ftsWords; + + set< quint32 > indexedArticles; + quint32 articleNumber; + + // index articles for full-text search + for( int i = 0; i < offsets.size(); i++ ) + { + if( isCancelled ) + throw exUserAbort(); + + QString headword, articleStr; + + articleNumber = getArticleText( offsets.at( i ), headword, articleStr, + &indexedArticles ); + if( articleNumber == 0xFFFFFFFF ) + continue; + + indexedArticles.insert( articleNumber ); + + FtsHelpers::parseArticleForFts( offsets.at( i ), articleStr, ftsWords ); + } + + // Free memory + offsets.clear(); + + QMap< QString, QVector< uint32_t > >::iterator it = ftsWords.begin(); + while( it != ftsWords.end() ) + { + if( isCancelled ) + throw exUserAbort(); + + uint32_t offset = chunks.startNewBlock(); + uint32_t size = it.value().size(); + + chunks.addToBlock( &size, sizeof(uint32_t) ); + chunks.addToBlock( it.value().data(), size * sizeof(uint32_t) ); + + indexedWords.addSingleWord( gd::toWString( it.key() ), offset ); + + it = ftsWords.erase( it ); + } + + // Free memory + ftsWords.clear(); + + if( isCancelled ) + throw exUserAbort(); + + ftsIdxHeader.chunksOffset = chunks.finish(); + ftsIdxHeader.wordCount = indexedWords.size(); + + if( isCancelled ) + throw exUserAbort(); + + BtreeIndexing::IndexInfo ftsIdxInfo = BtreeIndexing::buildIndex( indexedWords, ftsIdx ); + + // Free memory + indexedWords.clear(); + + ftsIdxHeader.indexBtreeMaxElements = ftsIdxInfo.btreeMaxElements; + ftsIdxHeader.indexRootOffset = ftsIdxInfo.rootOffset; + + ftsIdxHeader.signature = FtsHelpers::FtsSignature; + ftsIdxHeader.formatVersion = FtsHelpers::CurrentFtsFormatVersion + getFtsIndexVersion(); + + ftsIdx.rewind(); + ftsIdx.writeRecords( &ftsIdxHeader, sizeof(ftsIdxHeader), 1 ); + + FTS_index_completed.ref(); + } + catch( std::exception &ex ) + { + gdWarning( "Zim: Failed building full-text search index for \"%s\", reason: %s\n", getName().c_str(), ex.what() ); + QFile::remove( FsEncoding::decode( ftsIdxName.c_str() ) ); + } +} + +void ZimDictionary::getArticleText( uint32_t articleAddress, QString & headword, QString & text ) +{ + try + { + headword.clear(); + string articleText; + + loadArticle( articleAddress, articleText, 0, true ); + text = Html::unescape( QString::fromUtf8( articleText.data(), articleText.size() ) ); + } + catch( std::exception &ex ) + { + gdWarning( "Zim: Failed retrieving article from \"%s\", reason: %s\n", getName().c_str(), ex.what() ); + } +} + +quint32 ZimDictionary::getArticleText( uint32_t articleAddress, QString & headword, QString & text, + set< quint32 > * loadedArticles ) +{ + quint32 articleNumber = 0xFFFFFFFF; + try + { + headword.clear(); + string articleText; + + articleNumber = loadArticle( articleAddress, articleText, loadedArticles, true ); + text = Html::unescape( QString::fromUtf8( articleText.data(), articleText.size() ) ); + } + catch( std::exception &ex ) + { + gdWarning( "Zim: Failed retrieving article from \"%s\", reason: %s\n", getName().c_str(), ex.what() ); + } + return articleNumber; +} + +sptr< Dictionary::DataRequest > ZimDictionary::getSearchResults( QString const & searchString, + int searchMode, bool matchCase, + int distanceBetweenWords, + int maxResults ) +{ + return new FtsHelpers::FTSResultsRequest( *this, searchString,searchMode, matchCase, distanceBetweenWords, maxResults ); +} + /// ZimDictionary::getArticle() class ZimArticleRequest; @@ -909,6 +1233,11 @@ QImage img = QImage::fromData( reinterpret_cast< const uchar * >( resource.data() ), resource.size() ); +#ifdef MAKE_EXTRA_TIFF_HANDLER + if( img.isNull() ) + GdTiff::tiffToQImage( &data.front(), data.size(), img ); +#endif + dataMutex.unlock(); if ( !img.isNull() ) @@ -938,8 +1267,8 @@ } catch( std::exception &ex ) { - qWarning( "ZIM: Failed loading resource \"%s\" from \"%s\", reason: %s\n", - resourceName.c_str(), dict.getName().c_str(), ex.what() ); + gdWarning( "ZIM: Failed loading resource \"%s\" from \"%s\", reason: %s\n", + resourceName.c_str(), dict.getName().c_str(), ex.what() ); // Resource not loaded -- we don't set the hasAnyData flag then } @@ -988,7 +1317,7 @@ if ( Dictionary::needToRebuildIndex( dictFiles, indexFile ) || indexIsOldOrBad( indexFile ) ) { - qDebug( "Zim: Building the index for dictionary: %s\n", i->c_str() ); + gdDebug( "Zim: Building the index for dictionary: %s\n", i->c_str() ); ZIM_header zh; @@ -1159,21 +1488,22 @@ idx.write( &idxHeader, sizeof( idxHeader ) ); } + + dictionaries.push_back( new ZimDictionary( dictId, + indexFile, + dictFiles ) ); } catch( std::exception & e ) { - qWarning( "Zim dictionary indexing failed: %s, error: %s\n", - i->c_str(), e.what() ); + gdWarning( "Zim dictionary initializing failed: %s, error: %s\n", + i->c_str(), e.what() ); continue; } catch( ... ) { - qWarning( "Zim dictionary indexing failed\n" ); + qWarning( "Zim dictionary initializing failed\n" ); continue; } - dictionaries.push_back( new ZimDictionary( dictId, - indexFile, - dictFiles ) ); } return dictionaries; } diff -Nru goldendict-1.5.0~git20131003/zipfile.cc goldendict-1.5.0~git20150923/zipfile.cc --- goldendict-1.5.0~git20131003/zipfile.cc 2013-08-16 09:45:56.000000000 +0000 +++ goldendict-1.5.0~git20150923/zipfile.cc 2015-09-23 08:26:24.000000000 +0000 @@ -151,6 +151,7 @@ entry.compressedSize = qFromLittleEndian( record.compressedSize ); entry.uncompressedSize = qFromLittleEndian( record.uncompressedSize ); entry.compressionMethod = getCompressionMethod( record.compressionMethod ); + entry.fileNameInUTF8 = ( qFromLittleEndian( record.gpBits ) & 0x800 ) != 0; return true; } diff -Nru goldendict-1.5.0~git20131003/zipfile.hh goldendict-1.5.0~git20150923/zipfile.hh --- goldendict-1.5.0~git20131003/zipfile.hh 2012-10-01 07:15:21.000000000 +0000 +++ goldendict-1.5.0~git20150923/zipfile.hh 2015-09-23 08:26:24.000000000 +0000 @@ -24,6 +24,7 @@ quint32 localHeaderOffset, compressedSize, uncompressedSize; CompressionMethod compressionMethod; + bool fileNameInUTF8; }; /// Represents contents of the local file header -- that what CentralDirEntry:: diff -Nru goldendict-1.5.0~git20131003/zipsounds.cc goldendict-1.5.0~git20150923/zipsounds.cc --- goldendict-1.5.0~git20131003/zipsounds.cc 2013-10-02 20:42:04.000000000 +0000 +++ goldendict-1.5.0~git20150923/zipsounds.cc 2015-09-23 08:26:24.000000000 +0000 @@ -10,6 +10,9 @@ #include "audiolink.hh" #include "indexedzip.hh" #include "filetype.hh" +#include "gddebug.hh" +#include "chunkedstorage.hh" +#include "htmlescape.hh" #include #include @@ -41,7 +44,7 @@ enum { Signature = 0x5350495a, // ZIPS on little-endian, SPIZ on big-endian - CurrentFormatVersion = 1 + BtreeIndexing::FormatVersion + CurrentFormatVersion = 5 + BtreeIndexing::FormatVersion }; struct IdxHeader @@ -51,6 +54,7 @@ uint32_t soundsCount; // Total number of sounds, for informative purposes only uint32_t indexBtreeMaxElements; // Two fields from IndexInfo uint32_t indexRootOffset; + uint32_t chunksOffset; // The offset to chunks' storage } #ifndef _MSC_VER __attribute__((packed)) @@ -85,6 +89,14 @@ wstring::size_type pos = name.rfind( L'.' ); if ( pos != wstring::npos ) name.erase( pos ); + + // Strip spaces at the end of name + string::size_type n = name.length(); + while( n && name.at( n - 1 ) == L' ' ) + n--; + + if( n != name.length() ) + name.erase( n ); } return name; } @@ -94,6 +106,7 @@ Mutex idxMutex; File::Class idx; IdxHeader idxHeader; + sptr< ChunkedStorage::Reader > chunks; IndexedZip zipsFile; public: @@ -132,6 +145,8 @@ idx( indexFile, "rb" ), idxHeader( idx.read< IdxHeader >() ) { + chunks = new ChunkedStorage::Reader( idx, idxHeader.chunksOffset ); + // Initialize the index openIndex( IndexInfo( idxHeader.indexBtreeMaxElements, @@ -174,7 +189,7 @@ chain.insert( chain.end(), altChain.begin(), altChain.end() ); } - multimap< wstring, string > mainArticles, alternateArticles; + multimap< wstring, uint32_t > mainArticles, alternateArticles; set< uint32_t > articlesIncluded; // Some synonims make it that the articles // appear several times. We combat this @@ -195,12 +210,12 @@ wstring headwordStripped = Folding::applySimpleCaseOnly( Utf8::decode( chain[ x ].word ) ); - multimap< wstring, string > & mapToUse = + multimap< wstring, uint32_t > & mapToUse = ( wordCaseFolded == headwordStripped ) ? mainArticles : alternateArticles; - mapToUse.insert( std::pair< wstring, string >( - Folding::applySimpleCaseOnly( Utf8::decode( chain[ x ].word ) ), chain[ x ].word ) ); + mapToUse.insert( std::pair< wstring, uint32_t >( + Folding::applySimpleCaseOnly( Utf8::decode( chain[ x ].word ) ), chain[ x ].articleOffset ) ); articlesIncluded.insert( chain[ x ].articleOffset ); } @@ -210,42 +225,102 @@ string result; - multimap< wstring, string >::const_iterator i; + multimap< wstring, uint32_t >::const_iterator i; result += "
\"Play\"/" + Html::escape( chain[ i->second ].word ) + "" + Html::escape( displayedName ) + "
\"Play\"/" + Html::escape( chain[ i->second ].word ) + "" + Html::escape( displayedName ) + "
"; + + vector< char > chunk; + char * nameBlock; + for( i = mainArticles.begin(); i != mainArticles.end(); ++i ) { + try + { + Mutex::Lock _( idxMutex ); + nameBlock = chunks->getBlock( i->second, chunk ); + + if ( nameBlock >= &chunk.front() + chunk.size() ) + { + // chunks reader thinks it's okay since zero-sized records can exist, + // but we don't allow that. + throw ChunkedStorage::exAddressOutOfRange(); + } + } + catch( ChunkedStorage::exAddressOutOfRange & ) + { + // Bad address + continue; + } + + uint16_t sz; + memcpy( &sz, nameBlock, sizeof( uint16_t ) ); + nameBlock += sizeof( uint16_t ); + + string name( nameBlock, sz ); + nameBlock += sz; + + string displayedName = mainArticles.size() + alternateArticles.size() > 1 ? + name : Utf8::encode( stripExtension( name ) ); + result += ""; QUrl url; url.setScheme( "gdau" ); url.setHost( QString::fromUtf8( getId().c_str() ) ); - url.setPath( QString::fromUtf8( i->second.c_str() ) ); + url.setPath( QString::fromUtf8( name.c_str() ) ); string ref = string( "\"" ) + url.toEncoded().data() + "\""; result += addAudioLink( ref, getId() ); result += ""; - result += ""; + result += ""; result += ""; } for( i = alternateArticles.begin(); i != alternateArticles.end(); ++i ) { + try + { + Mutex::Lock _( idxMutex ); + nameBlock = chunks->getBlock( i->second, chunk ); + + if ( nameBlock >= &chunk.front() + chunk.size() ) + { + // chunks reader thinks it's okay since zero-sized records can exist, + // but we don't allow that. + throw ChunkedStorage::exAddressOutOfRange(); + } + } + catch( ChunkedStorage::exAddressOutOfRange & ) + { + // Bad address + continue; + } + + uint16_t sz; + memcpy( &sz, nameBlock, sizeof( uint16_t ) ); + nameBlock += sizeof( uint16_t ); + + string name( nameBlock, sz ); + nameBlock += sz; + + string displayedName = mainArticles.size() + alternateArticles.size() > 1 ? + name : Utf8::encode( stripExtension( name ) ); + result += ""; QUrl url; url.setScheme( "gdau" ); url.setHost( QString::fromUtf8( getId().c_str() ) ); - url.setPath( QString::fromUtf8( i->second.c_str() ) ); + url.setPath( QString::fromUtf8( name.c_str() ) ); string ref = string( "\"" ) + url.toEncoded().data() + "\""; result += addAudioLink( ref, getId() ); result += ""; - result += ""; + result += ""; result += ""; } @@ -273,10 +348,31 @@ if ( chain.empty() ) return new Dictionary::DataRequestInstant( false ); // No such resource + // Find sound + + uint32_t dataOffset = 0; + for( int x = chain.size() - 1; x >= 0 ; x-- ) + { + vector< char > chunk; + char * nameBlock = chunks->getBlock( chain[ x ].articleOffset, chunk ); + + uint16_t sz; + memcpy( &sz, nameBlock, sizeof( uint16_t ) ); + nameBlock += sizeof( uint16_t ); + + string fileName( nameBlock, sz ); + nameBlock += sz; + + memcpy( &dataOffset, nameBlock, sizeof( uint32_t ) ); + + if( name.compare( fileName ) == 0 ) + break; + } + sptr< Dictionary::DataRequestInstant > dr = new Dictionary::DataRequestInstant( true ); - if ( zipsFile.loadFile( chain[ 0 ].articleOffset, dr->getData() ) ) + if ( zipsFile.loadFile( dataOffset, dr->getData() ) ) return dr; return new Dictionary::DataRequestInstant( false ); @@ -329,7 +425,7 @@ if ( Dictionary::needToRebuildIndex( dictFiles, indexFile ) || indexIsOldOrBad( indexFile ) ) { - qDebug( "Zips: Building the index for dictionary: %s\n", i->c_str() ); + gdDebug( "Zips: Building the index for dictionary: %s\n", i->c_str() ); File::Class idx( indexFile, "wb" ); IdxHeader idxHeader; @@ -342,26 +438,41 @@ idx.write( idxHeader ); IndexedWords names, zipFileNames; + ChunkedStorage::Writer chunks( idx ); + quint32 namesCount; + IndexedZip zipFile; if( zipFile.openZipFile( QDir::fromNativeSeparators( FsEncoding::decode( i->c_str() ) ) ) ) - zipFile.indexFile( zipFileNames ); + zipFile.indexFile( zipFileNames, &namesCount ); if( !zipFileNames.empty() ) { - // Remove extension for sound files (like in sound dirs) - for( IndexedWords::iterator i = zipFileNames.begin(); i != zipFileNames.end(); ++i ) { vector< WordArticleLink > links = i->second; for( unsigned x = 0; x < links.size(); x++ ) { + // Save original name + + uint32_t offset = chunks.startNewBlock(); + uint16_t sz = links[ x ].word.size(); + chunks.addToBlock( &sz, sizeof(uint16_t) ); + chunks.addToBlock( links[ x ].word.c_str(), sz ); + chunks.addToBlock( &links[ x ].articleOffset, sizeof( uint32_t ) ); + + // Remove extension for sound files (like in sound dirs) + wstring word = stripExtension( links[ x ].word ); if( !word.empty() ) - names.addSingleWord( word, links[ x ].articleOffset ); + names.addSingleWord( word, offset ); } } + // Finish with the chunks + + idxHeader.chunksOffset = chunks.finish(); + // Build the resulting zip file index IndexInfo idxInfo = BtreeIndexing::buildIndex( names, idx ); @@ -374,7 +485,7 @@ idxHeader.signature = Signature; idxHeader.formatVersion = CurrentFormatVersion; - idxHeader.soundsCount = names.size(); + idxHeader.soundsCount = namesCount; idx.rewind(); @@ -395,8 +506,8 @@ } catch( std::exception & e ) { - qWarning( "Zipped sounds pack reading failed: %s, error: %s\n", - i->c_str(), e.what() ); + gdWarning( "Zipped sounds pack reading failed: %s, error: %s\n", + i->c_str(), e.what() ); } }
\"Play\"/" + i->second + "" + Html::escape( displayedName ) + "
\"Play\"/" + i->second + "" + Html::escape( displayedName ) + "