opt: add the language variant option for wikipedia dictionaries (#1374)

* opt: add the language variant option for wikipedia dictionaries

* fix:default value for 'lang_' parameter

* [autofix.ci] apply automated fixes

* fix: Should have been 'https' for the wikipedia queries.

---------

Co-authored-by: autofix-ci[bot] <114827586+autofix-ci[bot]@users.noreply.github.com>
This commit is contained in:
Xu Jiyong 2024-01-26 07:56:17 +08:00 committed by GitHub
parent 4304fc9aef
commit 853130ddb7
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
5 changed files with 70 additions and 8 deletions

View file

@ -2755,6 +2755,10 @@ To find &apos;*&apos;, &apos;?&apos;, &apos;[&apos;, &apos;]&apos; symbols use &
<source>Icon</source> <source>Icon</source>
<translation></translation> <translation></translation>
</message> </message>
<message>
<source>Language Variant</source>
<translation></translation>
</message>
</context> </context>
<context> <context>
<name>MultimediaAudioPlayer</name> <name>MultimediaAudioPlayer</name>

View file

@ -354,6 +354,30 @@ MediaWikis makeDefaultMediaWikis( bool enable )
MediaWiki( "f3b4ec8531e52ddf5b10d21e4577a7a2", "Greek Wikipedia", "https://el.wikipedia.org/w", false, "" ) ); MediaWiki( "f3b4ec8531e52ddf5b10d21e4577a7a2", "Greek Wikipedia", "https://el.wikipedia.org/w", false, "" ) );
mw.push_back( mw.push_back(
MediaWiki( "5d45232075d06e002dea72fe3e137da1", "Greek Wiktionary", "https://el.wiktionary.org/w", false, "" ) ); MediaWiki( "5d45232075d06e002dea72fe3e137da1", "Greek Wiktionary", "https://el.wiktionary.org/w", false, "" ) );
mw.push_back( MediaWiki( "c015d60c4949ad75b5b7069c2ff6dc2c",
"traditional Chinese Wikipedia",
"https://zh.wikipedia.org/w",
false,
"",
"zh-hant" ) );
mw.push_back( MediaWiki( "d50828ad6e115bc9d3421b6821543108",
"traditional Chinese Wiktionary",
"https://zh.wiktionary.org/w",
false,
"",
"zh-hant" ) );
mw.push_back( MediaWiki( "438b17b48cbda1a22d317fea37ec3110",
"Simplified Chinese Wikipedia",
"https://zh.wikipedia.org/w",
false,
"",
"zh-hans" ) );
mw.push_back( MediaWiki( "b68b9fb71b5a8c766cc7a5ea8237fc6b",
"Simplified Chinese Wiktionary",
"https://zh.wiktionary.org/w",
false,
"",
"zh-hans" ) );
return mw; return mw;
} }
@ -760,6 +784,7 @@ Class load()
w.url = mw.attribute( "url" ); w.url = mw.attribute( "url" );
w.enabled = ( mw.attribute( "enabled" ) == "1" ); w.enabled = ( mw.attribute( "enabled" ) == "1" );
w.icon = mw.attribute( "icon" ); w.icon = mw.attribute( "icon" );
w.lang = mw.attribute( "lang" );
c.mediawikis.push_back( w ); c.mediawikis.push_back( w );
} }
@ -1527,6 +1552,10 @@ void save( Class const & c )
QDomAttr icon = dd.createAttribute( "icon" ); QDomAttr icon = dd.createAttribute( "icon" );
icon.setValue( mediawiki.icon ); icon.setValue( mediawiki.icon );
mw.setAttributeNode( icon ); mw.setAttributeNode( icon );
QDomAttr lang = dd.createAttribute( "lang" );
lang.setValue( mediawiki.lang );
mw.setAttributeNode( lang );
} }
} }

View file

@ -455,24 +455,32 @@ struct MediaWiki
QString id, name, url; QString id, name, url;
bool enabled; bool enabled;
QString icon; QString icon;
QString lang;
MediaWiki(): MediaWiki():
enabled( false ) enabled( false )
{ {
} }
MediaWiki( QString const & id_, QString const & name_, QString const & url_, bool enabled_, QString const & icon_ ): MediaWiki( QString const & id_,
QString const & name_,
QString const & url_,
bool enabled_,
QString const & icon_,
QString const & lang_ = "" ):
id( id_ ), id( id_ ),
name( name_ ), name( name_ ),
url( url_ ), url( url_ ),
enabled( enabled_ ), enabled( enabled_ ),
icon( icon_ ) icon( icon_ ),
lang( lang_ )
{ {
} }
bool operator==( MediaWiki const & other ) const bool operator==( MediaWiki const & other ) const
{ {
return id == other.id && name == other.name && url == other.url && enabled == other.enabled && icon == other.icon; return id == other.id && name == other.name && url == other.url && enabled == other.enabled && icon == other.icon
&& lang == other.lang;
} }
}; };

View file

@ -26,7 +26,7 @@ namespace {
class MediaWikiDictionary: public Dictionary::Class class MediaWikiDictionary: public Dictionary::Class
{ {
string name; string name;
QString url, icon; QString url, icon, lang;
QNetworkAccessManager & netMgr; QNetworkAccessManager & netMgr;
quint32 langId; quint32 langId;
@ -36,11 +36,13 @@ public:
string const & name_, string const & name_,
QString const & url_, QString const & url_,
QString const & icon_, QString const & icon_,
QString const & lang_,
QNetworkAccessManager & netMgr_ ): QNetworkAccessManager & netMgr_ ):
Dictionary::Class( id, vector< string >() ), Dictionary::Class( id, vector< string >() ),
name( name_ ), name( name_ ),
url( url_ ), url( url_ ),
icon( icon_ ), icon( icon_ ),
lang( lang_ ),
netMgr( netMgr_ ), netMgr( netMgr_ ),
langId( 0 ) langId( 0 )
{ {
@ -132,7 +134,7 @@ class MediaWikiWordSearchRequest: public MediaWikiWordSearchRequestSlots
public: public:
MediaWikiWordSearchRequest( wstring const &, QString const & url, QNetworkAccessManager & mgr ); MediaWikiWordSearchRequest( wstring const &, QString const & url, QString const & lang, QNetworkAccessManager & mgr );
~MediaWikiWordSearchRequest(); ~MediaWikiWordSearchRequest();
@ -145,6 +147,7 @@ private:
MediaWikiWordSearchRequest::MediaWikiWordSearchRequest( wstring const & str, MediaWikiWordSearchRequest::MediaWikiWordSearchRequest( wstring const & str,
QString const & url, QString const & url,
QString const & lang,
QNetworkAccessManager & mgr ): QNetworkAccessManager & mgr ):
isCancelling( false ) isCancelling( false )
{ {
@ -154,6 +157,7 @@ MediaWikiWordSearchRequest::MediaWikiWordSearchRequest( wstring const & str,
GlobalBroadcaster::instance()->addWhitelist( reqUrl.host() ); GlobalBroadcaster::instance()->addWhitelist( reqUrl.host() );
Utils::Url::addQueryItem( reqUrl, "apprefix", QString::fromStdU32String( str ).replace( '+', "%2B" ) ); Utils::Url::addQueryItem( reqUrl, "apprefix", QString::fromStdU32String( str ).replace( '+', "%2B" ) );
Utils::Url::addQueryItem( reqUrl, "lang", lang );
QNetworkRequest req( reqUrl ); QNetworkRequest req( reqUrl );
//millseconds. //millseconds.
@ -376,12 +380,14 @@ class MediaWikiArticleRequest: public MediaWikiDataRequestSlots
typedef std::list< std::pair< QNetworkReply *, bool > > NetReplies; typedef std::list< std::pair< QNetworkReply *, bool > > NetReplies;
NetReplies netReplies; NetReplies netReplies;
QString url; QString url;
QString lang;
public: public:
MediaWikiArticleRequest( wstring const & word, MediaWikiArticleRequest( wstring const & word,
vector< wstring > const & alts, vector< wstring > const & alts,
QString const & url, QString const & url,
QString const & lang,
QNetworkAccessManager & mgr, QNetworkAccessManager & mgr,
Class * dictPtr_ ); Class * dictPtr_ );
@ -425,9 +431,11 @@ void MediaWikiArticleRequest::cancel()
MediaWikiArticleRequest::MediaWikiArticleRequest( wstring const & str, MediaWikiArticleRequest::MediaWikiArticleRequest( wstring const & str,
vector< wstring > const & alts, vector< wstring > const & alts,
QString const & url_, QString const & url_,
QString const & lang_,
QNetworkAccessManager & mgr, QNetworkAccessManager & mgr,
Class * dictPtr_ ): Class * dictPtr_ ):
url( url_ ), url( url_ ),
lang( lang_ ),
dictPtr( dictPtr_ ) dictPtr( dictPtr_ )
{ {
connect( &mgr, connect( &mgr,
@ -449,6 +457,7 @@ void MediaWikiArticleRequest::addQuery( QNetworkAccessManager & mgr, wstring con
QUrl reqUrl( url + "/api.php?action=parse&prop=text|revid|sections&format=xml&redirects" ); QUrl reqUrl( url + "/api.php?action=parse&prop=text|revid|sections&format=xml&redirects" );
Utils::Url::addQueryItem( reqUrl, "page", QString::fromStdU32String( str ).replace( '+', "%2B" ) ); Utils::Url::addQueryItem( reqUrl, "page", QString::fromStdU32String( str ).replace( '+', "%2B" ) );
Utils::Url::addQueryItem( reqUrl, "variant", lang );
QNetworkRequest req( reqUrl ); QNetworkRequest req( reqUrl );
//millseconds. //millseconds.
req.setTransferTimeout( 3000 ); req.setTransferTimeout( 3000 );
@ -690,7 +699,7 @@ sptr< WordSearchRequest > MediaWikiDictionary::prefixMatch( wstring const & word
return std::make_shared< WordSearchRequestInstant >(); return std::make_shared< WordSearchRequestInstant >();
} }
else else
return std::make_shared< MediaWikiWordSearchRequest >( word, url, netMgr ); return std::make_shared< MediaWikiWordSearchRequest >( word, url, lang, netMgr );
} }
sptr< DataRequest > sptr< DataRequest >
@ -703,7 +712,7 @@ MediaWikiDictionary::getArticle( wstring const & word, vector< wstring > const &
return std::make_shared< DataRequestInstant >( false ); return std::make_shared< DataRequestInstant >( false );
} }
else else
return std::make_shared< MediaWikiArticleRequest >( word, alts, url, netMgr, this ); return std::make_shared< MediaWikiArticleRequest >( word, alts, url, lang, netMgr, this );
} }
} // namespace } // namespace
@ -720,6 +729,7 @@ makeDictionaries( Dictionary::Initializing &, Config::MediaWikis const & wikis,
wiki.name.toUtf8().data(), wiki.name.toUtf8().data(),
wiki.url, wiki.url,
wiki.icon, wiki.icon,
wiki.lang,
mgr ) ); mgr ) );
} }

View file

@ -49,6 +49,7 @@ Sources::Sources( QWidget * parent, Config::Class const & cfg ):
ui.mediaWikis->resizeColumnToContents( 1 ); ui.mediaWikis->resizeColumnToContents( 1 );
ui.mediaWikis->resizeColumnToContents( 2 ); ui.mediaWikis->resizeColumnToContents( 2 );
ui.mediaWikis->resizeColumnToContents( 3 ); ui.mediaWikis->resizeColumnToContents( 3 );
ui.mediaWikis->resizeColumnToContents( 4 );
ui.webSites->setTabKeyNavigation( true ); ui.webSites->setTabKeyNavigation( true );
ui.webSites->setModel( &webSitesModel ); ui.webSites->setModel( &webSitesModel );
@ -429,6 +430,8 @@ void MediaWikisModel::addNewWiki()
w.url = "http://"; w.url = "http://";
w.lang = "";
beginInsertRows( QModelIndex(), mediawikis.size(), mediawikis.size() ); beginInsertRows( QModelIndex(), mediawikis.size(), mediawikis.size() );
mediawikis.push_back( w ); mediawikis.push_back( w );
endInsertRows(); endInsertRows();
@ -471,7 +474,7 @@ int MediaWikisModel::columnCount( QModelIndex const & parent ) const
if ( parent.isValid() ) if ( parent.isValid() )
return 0; return 0;
else else
return 4; return 5;
} }
QVariant MediaWikisModel::headerData( int section, Qt::Orientation /*orientation*/, int role ) const QVariant MediaWikisModel::headerData( int section, Qt::Orientation /*orientation*/, int role ) const
@ -486,6 +489,8 @@ QVariant MediaWikisModel::headerData( int section, Qt::Orientation /*orientation
return tr( "Address" ); return tr( "Address" );
case 3: case 3:
return tr( "Icon" ); return tr( "Icon" );
case 4:
return tr( "Language Variant" );
default: default:
return QVariant(); return QVariant();
} }
@ -506,6 +511,8 @@ QVariant MediaWikisModel::data( QModelIndex const & index, int role ) const
return mediawikis[ index.row() ].url; return mediawikis[ index.row() ].url;
case 3: case 3:
return mediawikis[ index.row() ].icon; return mediawikis[ index.row() ].icon;
case 4:
return mediawikis[ index.row() ].lang;
default: default:
return QVariant(); return QVariant();
} }
@ -547,6 +554,10 @@ bool MediaWikisModel::setData( QModelIndex const & index, const QVariant & value
mediawikis[ index.row() ].icon = value.toString(); mediawikis[ index.row() ].icon = value.toString();
dataChanged( index, index ); dataChanged( index, index );
return true; return true;
case 4:
mediawikis[ index.row() ].lang = value.toString();
dataChanged( index, index );
return true;
default: default:
return false; return false;
} }