diff --git a/kcms/kded/kcmkded.cpp b/kcms/kded/kcmkded.cpp index 8186e9a50..aa6f08b31 100644 --- a/kcms/kded/kcmkded.cpp +++ b/kcms/kded/kcmkded.cpp @@ -1,513 +1,505 @@ // vim: noexpandtab shiftwidth=4 tabstop=4 /* This file is part of the KDE project Copyright (C) 2002 Daniel Molkentin This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include "kcmkded.h" #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include K_PLUGIN_FACTORY(KDEDFactory, registerPlugin(); ) K_EXPORT_PLUGIN(KDEDFactory("kcmkded")) Q_LOGGING_CATEGORY(KCM_KDED, "kcm_kded") enum OnDemandColumns { OnDemandService = 0, OnDemandStatus = 1, OnDemandDescription = 2 }; enum StartupColumns { StartupUse = 0, StartupService = 1, StartupStatus = 2, StartupDescription = 3 }; static const int LibraryRole = Qt::UserRole + 1; KDEDConfig::KDEDConfig(QWidget* parent, const QVariantList &) : KCModule( parent ) { KAboutData *about = new KAboutData( I18N_NOOP( "kcmkded" ), i18n( "KDE Service Manager" ), QStringLiteral("1.0"), QString(), KAboutLicense::GPL, i18n( "(c) 2002 Daniel Molkentin" ) ); about->addAuthor(i18n("Daniel Molkentin"), QString(),QStringLiteral("molkentin@kde.org")); setAboutData( about ); setButtons(Apply|Default|Help); setQuickHelp( i18n("

Service Manager

This module allows you to have an overview of all plugins of the " "KDE Daemon, also referred to as KDE Services. Generally, there are two types of service:

" "
  • Services invoked at startup
  • Services called on demand
" "

The latter are only listed for convenience. The startup services can be started and stopped. " "In Administrator mode, you can also define whether services should be loaded at startup.

" "

Use this with care: some services are vital for Plasma; do not deactivate services if you" " do not know what you are doing.

")); RUNNING = i18n("Running")+' '; NOT_RUNNING = i18n("Not running")+' '; QVBoxLayout *lay = new QVBoxLayout( this ); lay->setMargin( 0 ); QGroupBox *gb = new QGroupBox( i18n("Load-on-Demand Services"), this ); gb->setWhatsThis( i18n("This is a list of available KDE services which will " "be started on demand. They are only listed for convenience, as you " "cannot manipulate these services.")); lay->addWidget( gb ); QVBoxLayout *gblay = new QVBoxLayout( gb ); _lvLoD = new QTreeWidget( gb ); QStringList cols; cols.append( i18n("Service") ); cols.append( i18n("Status") ); cols.append( i18n("Description") ); _lvLoD->setHeaderLabels( cols ); _lvLoD->setAllColumnsShowFocus(true); _lvLoD->setRootIsDecorated( false ); _lvLoD->setSortingEnabled(true); _lvLoD->sortByColumn(OnDemandService, Qt::AscendingOrder); _lvLoD->header()->setStretchLastSection(true); gblay->addWidget( _lvLoD ); gb = new QGroupBox( i18n("Startup Services"), this ); gb->setWhatsThis( i18n("This shows all KDE services that can be loaded " "on Plasma startup. Checked services will be invoked on next startup. " "Be careful with deactivation of unknown services.")); lay->addWidget( gb ); gblay = new QVBoxLayout( gb ); _lvStartup = new QTreeWidget( gb ); cols.clear(); cols.append( i18n("Use") ); cols.append( i18n("Service") ); cols.append( i18n("Status") ); cols.append( i18n("Description") ); _lvStartup->setHeaderLabels( cols ); _lvStartup->setAllColumnsShowFocus(true); _lvStartup->setRootIsDecorated( false ); _lvStartup->setSortingEnabled(true); _lvStartup->sortByColumn(StartupService, Qt::AscendingOrder); _lvStartup->header()->setStretchLastSection(true); gblay->addWidget( _lvStartup ); QDialogButtonBox *buttonBox = new QDialogButtonBox(Qt::Horizontal, gb); _pbStart = buttonBox->addButton( i18n("Start") , QDialogButtonBox::ActionRole ); _pbStop = buttonBox->addButton( i18n("Stop") , QDialogButtonBox::ActionRole ); gblay->addWidget( buttonBox ); _pbStart->setEnabled( false ); _pbStop->setEnabled( false ); connect(_pbStart, &QPushButton::clicked, this, &KDEDConfig::slotStartService); connect(_pbStop, &QPushButton::clicked, this, &KDEDConfig::slotStopService); connect(_lvLoD, &QTreeWidget::itemSelectionChanged, this, &KDEDConfig::slotLodItemSelected); connect(_lvStartup, &QTreeWidget::itemSelectionChanged, this, &KDEDConfig::slotStartupItemSelected); connect(_lvStartup, &QTreeWidget::itemChanged, this, &KDEDConfig::slotItemChecked); } QString setModuleGroup(const KPluginMetaData &module) { return QStringLiteral("Module-%1").arg(module.pluginId()); } bool KDEDConfig::autoloadEnabled(KConfig *config, const KPluginMetaData &module) { KConfigGroup cg(config, setModuleGroup(module)); return cg.readEntry("autoload", true); } void KDEDConfig::setAutoloadEnabled(KConfig *config, const KPluginMetaData &module, bool b) { KConfigGroup cg(config, setModuleGroup(module)); return cg.writeEntry("autoload", b); } // This code was copied from kded.cpp // TODO: move this KCM to the KDED framework and share the code? static QVector availableModules() { QVector plugins = KPluginLoader::findPlugins(QStringLiteral("kf5/kded")); QSet moduleIds; foreach (const KPluginMetaData &md, plugins) { moduleIds.insert(md.pluginId()); } // also search for old .desktop based kded modules KPluginInfo::List oldStylePlugins = KPluginInfo::fromServices(KServiceTypeTrader::self()->query(QStringLiteral("KDEDModule"))); foreach (const KPluginInfo &info, oldStylePlugins) { if (moduleIds.contains(info.pluginName())) { qCWarning(KCM_KDED).nospace() << "kded module " << info.pluginName() << " has already been found using " "JSON metadata, please don't install the now unneeded .desktop file (" << info.entryPath() << ")."; } else { qCDebug(KCM_KDED).nospace() << "kded module " << info.pluginName() << " still uses .desktop files (" << info.entryPath() << "). Please port it to JSON metadata."; plugins.append(info.toMetaData()); } } return plugins; } // this code was copied from kded.cpp static bool isModuleLoadedOnDemand(const KPluginMetaData &module) { bool loadOnDemand = true; // use toVariant() since it could be string or bool in the json and QJsonObject does not convert QVariant p = module.rawData().value(QStringLiteral("X-KDE-Kded-load-on-demand")).toVariant(); if (p.isValid() && p.canConvert() && (p.toBool() == false)) { loadOnDemand = false; } return loadOnDemand; } void KDEDConfig::load() { KConfig kdedrc(QStringLiteral("kded5rc"), KConfig::NoGlobals); _lvStartup->clear(); _lvLoD->clear(); QTreeWidgetItem* treeitem = 0L; const auto modules = availableModules(); for (const KPluginMetaData &mod : modules) { QString servicePath = mod.metaDataFileName(); // autoload defaults to false if it is not found const bool autoload = mod.rawData().value(QStringLiteral("X-KDE-Kded-autoload")).toVariant().toBool(); - const QString dbusModuleName = mod.value(QStringLiteral("X-KDE-DBus-ModuleName")); + // keep estimating dbusModuleName in sync with KDEDModule (kdbusaddons) and kded (kded) + // currently (KF5) the module name in the D-Bus object path is set by the pluginId + const QString dbusModuleName = mod.pluginId(); qCDebug(KCM_KDED) << "reading kded info from" << servicePath << "autoload =" << autoload << "dbus module name =" << dbusModuleName; // The logic has to be identical to Kded::initModules. // They interpret X-KDE-Kded-autoload as false if not specified // X-KDE-Kded-load-on-demand as true if not specified if (autoload) { treeitem = new QTreeWidgetItem(); treeitem->setCheckState(StartupUse, autoloadEnabled(&kdedrc, mod) ? Qt::Checked : Qt::Unchecked); treeitem->setText(StartupService, mod.name()); treeitem->setText(StartupDescription, mod.description()); treeitem->setText(StartupStatus, NOT_RUNNING); - if (!dbusModuleName.isEmpty()) { - treeitem->setData(StartupService, LibraryRole, dbusModuleName); - } else { - qCWarning(KCM_KDED) << "X-KDE-DBUS-ModuleName not set for module " << mod.name() << "from file" << mod.metaDataFileName(); - treeitem->setData(StartupService, LibraryRole, mod.fileName()); - } + treeitem->setData(StartupService, LibraryRole, dbusModuleName); _lvStartup->addTopLevelItem(treeitem); } else if (isModuleLoadedOnDemand(mod)) { treeitem = new QTreeWidgetItem(); treeitem->setText(OnDemandService, mod.name() ); treeitem->setText(OnDemandDescription, mod.description()); treeitem->setText(OnDemandStatus, NOT_RUNNING); - if (!dbusModuleName.isEmpty()) { - treeitem->setData(OnDemandService, LibraryRole, dbusModuleName); - } else { - qCWarning(KCM_KDED) << "X-KDE-DBUS-ModuleName not set for module " << mod.name() << "from file" << mod.metaDataFileName(); - treeitem->setData(OnDemandService, LibraryRole, mod.fileName()); - } + treeitem->setData(OnDemandService, LibraryRole, dbusModuleName); _lvLoD->addTopLevelItem(treeitem); } else { qCWarning(KCM_KDED) << "kcmkded: Module " << mod.name() << "from file" << mod.metaDataFileName() << " not loaded on demand or startup! Skipping."; } } _lvStartup->resizeColumnToContents(StartupUse); _lvStartup->resizeColumnToContents(StartupService); _lvStartup->resizeColumnToContents(StartupStatus); _lvLoD->resizeColumnToContents(OnDemandService); _lvLoD->resizeColumnToContents(OnDemandStatus); getServiceStatus(); emit changed(false); } void KDEDConfig::save() { KConfig kdedrc(QStringLiteral("kded5rc"), KConfig::NoGlobals); const auto modules = availableModules(); for (const KPluginMetaData &mod : modules) { qCDebug(KCM_KDED) << "saving settings for kded module" << mod.pluginId(); // autoload defaults to false if it is not found const bool autoload = mod.rawData().value(QStringLiteral("X-KDE-Kded-autoload")).toVariant().toBool(); if (autoload) { const QString libraryName = mod.pluginId(); int count = _lvStartup->topLevelItemCount(); for(int i = 0; i < count; ++i) { QTreeWidgetItem *treeitem = _lvStartup->topLevelItem(i); if ( treeitem->data(StartupService, LibraryRole ).toString() == libraryName) { // we found a match, now compare and see what changed setAutoloadEnabled(&kdedrc, mod, treeitem->checkState( StartupUse ) == Qt::Checked); break; } } } } kdedrc.sync(); emit changed(false); QDBusInterface kdedInterface(QStringLiteral("org.kde.kded5"), QStringLiteral("/kded"), QStringLiteral("org.kde.kded5")); kdedInterface.call(QStringLiteral("reconfigure")); QTimer::singleShot(0, this, &KDEDConfig::slotServiceRunningToggled); } void KDEDConfig::defaults() { int count = _lvStartup->topLevelItemCount(); for( int i = 0; i < count; ++i ) { _lvStartup->topLevelItem( i )->setCheckState( StartupUse, Qt::Checked ); } getServiceStatus(); emit changed(true); } void KDEDConfig::getServiceStatus() { QStringList modules; QDBusInterface kdedInterface( QStringLiteral("org.kde.kded5"), QStringLiteral("/kded"), QStringLiteral("org.kde.kded5") ); QDBusReply reply = kdedInterface.call( QStringLiteral("loadedModules") ); if ( reply.isValid() ) { modules = reply.value(); } else { _lvLoD->setEnabled( false ); _lvStartup->setEnabled( false ); KMessageBox::error(this, i18n("Unable to contact KDED.")); return; } qCDebug(KCM_KDED) << "Loaded kded modules:" << modules; // Initialize int count = _lvLoD->topLevelItemCount(); for( int i = 0; i < count; ++i ) _lvLoD->topLevelItem( i )->setText( OnDemandStatus, NOT_RUNNING ); count = _lvStartup->topLevelItemCount(); for( int i = 0; i < count; ++i ) _lvStartup->topLevelItem( i )->setText( StartupStatus, NOT_RUNNING ); // Fill foreach( const QString& module, modules ) { bool found = false; count = _lvLoD->topLevelItemCount(); for( int i = 0; i < count; ++i ) { QTreeWidgetItem *treeitem = _lvLoD->topLevelItem( i ); if ( treeitem->data( OnDemandService, LibraryRole ).toString() == module ) { treeitem->setText( OnDemandStatus, RUNNING ); found = true; break; } } count = _lvStartup->topLevelItemCount(); for( int i = 0; i < count; ++i ) { QTreeWidgetItem *treeitem = _lvStartup->topLevelItem( i ); if ( treeitem->data( StartupService, LibraryRole ).toString() == module ) { treeitem->setText( StartupStatus, RUNNING ); found = true; break; } } if (!found) { qCDebug(KCM_KDED) << "Could not relate module " << module; #ifndef NDEBUG qCDebug(KCM_KDED) << "Candidates were:"; count = _lvLoD->topLevelItemCount(); for( int i = 0; i < count; ++i ) { QTreeWidgetItem *treeitem = _lvLoD->topLevelItem( i ); qCDebug(KCM_KDED) << treeitem->data( OnDemandService, LibraryRole ).toString(); } count = _lvStartup->topLevelItemCount(); for( int i = 0; i < count; ++i ) { QTreeWidgetItem *treeitem = _lvStartup->topLevelItem( i ); qCDebug(KCM_KDED) << treeitem->data( StartupService, LibraryRole ).toString(); } #endif } } } void KDEDConfig::slotReload() { QString current; if ( !_lvStartup->selectedItems().isEmpty() ) current = _lvStartup->selectedItems().at(0)->data( StartupService, LibraryRole ).toString(); load(); if ( !current.isEmpty() ) { int count = _lvStartup->topLevelItemCount(); for( int i = 0; i < count; ++i ) { QTreeWidgetItem *treeitem = _lvStartup->topLevelItem( i ); if ( treeitem->data( StartupService, LibraryRole ).toString() == current ) { _lvStartup->setCurrentItem( treeitem, 0, QItemSelectionModel::ClearAndSelect ); break; } } } } void KDEDConfig::slotStartupItemSelected() { if ( _lvStartup->selectedItems().isEmpty() ) { // Disable the buttons _pbStart->setEnabled( false ); _pbStop->setEnabled( false ); return; } // Deselect a currently selected element in the "load on demand" treeview _lvLoD->setCurrentItem(NULL, 0, QItemSelectionModel::Clear); QTreeWidgetItem *item = _lvStartup->selectedItems().at(0); if ( item->text(StartupStatus) == RUNNING ) { _pbStart->setEnabled( false ); _pbStop->setEnabled( true ); } else if ( item->text(StartupStatus) == NOT_RUNNING ) { _pbStart->setEnabled( true ); _pbStop->setEnabled( false ); } else // Error handling, better do nothing { _pbStart->setEnabled( false ); _pbStop->setEnabled( false ); } getServiceStatus(); } void KDEDConfig::slotLodItemSelected() { if ( _lvLoD->selectedItems().isEmpty() ) return; // Deselect a currently selected element in the "load on startup" treeview _lvStartup->setCurrentItem(NULL, 0, QItemSelectionModel::Clear); } void KDEDConfig::slotServiceRunningToggled() { getServiceStatus(); slotStartupItemSelected(); } void KDEDConfig::slotStartService() { QString service = _lvStartup->selectedItems().at(0)->data( StartupService, LibraryRole ).toString(); QDBusInterface kdedInterface( QStringLiteral("org.kde.kded5"), QStringLiteral("/kded"),QStringLiteral("org.kde.kded5") ); QDBusReply reply = kdedInterface.call( QStringLiteral("loadModule"), service ); if ( reply.isValid() ) { if ( reply.value() ) slotServiceRunningToggled(); else KMessageBox::error(this, "" + i18n("Unable to start server %1.", service) + ""); } else { KMessageBox::error(this, "" + i18n("Unable to start service %1.

Error: %2", service, reply.error().message()) + "
" ); } } void KDEDConfig::slotStopService() { QString service = _lvStartup->selectedItems().at(0)->data( StartupService, LibraryRole ).toString(); qCDebug(KCM_KDED) << "Stopping: " << service; QDBusInterface kdedInterface( QStringLiteral("org.kde.kded5"), QStringLiteral("/kded"), QStringLiteral("org.kde.kded5") ); QDBusReply reply = kdedInterface.call( QStringLiteral("unloadModule"), service ); if ( reply.isValid() ) { if ( reply.value() ) slotServiceRunningToggled(); else KMessageBox::error(this, "" + i18n("Unable to stop service %1.", service) + ""); } else { KMessageBox::error(this, "" + i18n("Unable to stop service %1.

Error: %2", service, reply.error().message()) + "
" ); } } void KDEDConfig::slotItemChecked(QTreeWidgetItem*, int column) { // We only listen to changes the user did. if (column==StartupUse) { emit changed(true); } } #include "kcmkded.moc" diff --git a/kcms/keyboard/keyboard.desktop b/kcms/keyboard/keyboard.desktop index 7ab289d2d..303dc57e3 100644 --- a/kcms/keyboard/keyboard.desktop +++ b/kcms/keyboard/keyboard.desktop @@ -1,112 +1,111 @@ [Desktop Entry] Type=Service Icon=preferences-desktop-keyboard X-KDE-ServiceTypes=KDEDModule X-KDE-Library=keyboard -X-KDE-DBus-ModuleName=keyboard X-KDE-Kded-autoload=true X-KDE-Kded-load-on-demand=false X-KDE-Kded-phase=2 OnlyShowIn=KDE; Name=Keyboard Daemon Name[ar]=عفريت لوحة المفاتيح Name[bg]=Демон на клавиатурата Name[bn]=কীবোর্ড ডীমন Name[bs]=Demon tastature Name[ca]=Dimoni del teclat Name[ca@valencia]=Dimoni del teclat Name[cs]=Démon klávesnice Name[da]=Tastatur-dæmon Name[de]=Tastatur-Dienst Name[el]=Δαίμονας πληκτρολογίου Name[en_GB]=Keyboard Dæmon Name[es]=Demonio de teclado Name[et]=Klaviatuurideemon Name[eu]=Teklatuaren daimona Name[fi]=Näppäimistötaustaprosessi Name[fr]=Démon du clavier Name[ga]=Deamhan Méarchláir Name[gl]=Servizo do teclado Name[gu]=કીબોર્ડ ડિમન Name[he]=תהליך רקע של המקלדת Name[hi]=कुंजीपट डेमन Name[hr]=Tipkovnički servis Name[hu]=Billentyűzetszolgáltatás Name[ia]=Demone de claviero Name[id]=Jurik Keyboard Name[is]=Lyklaborðspúki Name[it]=Demone della tastiera Name[ja]=キーボードデーモン Name[kk]=Перенетақта қызметі Name[km]=ដេមិន​​ក្ដារចុច Name[kn]=ಕೀಲಿಮಣೆ ನೇಪಥಿಕ Name[ko]=키보드 데몬 Name[lt]=Klaviatūros tarnyba Name[lv]=Tastatūras dēmons Name[mr]=कळफलक डीमन Name[nb]=Tastatur-daemon Name[nds]=Tastatuur-Dämoon Name[nl]=Toetsenbord-daemon Name[nn]=Tastaturteneste Name[pa]=ਕੀ-ਬੋਰਡ ਡੈਮਨ Name[pl]=Usługa klawiatury Name[pt]=Servidor do Teclado Name[pt_BR]=Daemon de teclado Name[ro]=Demon de tastatură Name[ru]=Фоновая служба клавиатуры Name[si]=යතුරුපුවරු ඩීමනය Name[sk]=Démon klávesnice Name[sl]=Ozadnji program za tipkovnico Name[sr]=Демон тастатуре Name[sr@ijekavian]=Демон тастатуре Name[sr@ijekavianlatin]=Demon tastature Name[sr@latin]=Demon tastature Name[sv]=Tangentbordsdemon Name[th]=ดีมอนแป้นพิมพ์ Name[tr]=Klavye Servisi Name[ug]=ھەرپتاختا نازارەتچى Name[uk]=Фонова служба клавіатури Name[vi]=Trình nền bàn phím Name[wa]=Démon del taprece Name[x-test]=xxKeyboard Daemonxx Name[zh_CN]=键盘守护进程 Name[zh_TW]=鍵盤伺服程式 Comment=Enables switching keyboard layout through shortcuts or system tray Comment[ar]=يفعّل تبديل تخطيط لوحة المفاتيح عبر الاختصارات أو صينيّة النّظام Comment[ca]=Activa la commutació de la disposició del teclat mitjançant dreceres o la safata del sistema Comment[ca@valencia]=Activa la commutació de la disposició del teclat mitjançant dreceres o la safata del sistema Comment[da]=Aktiverer skift af tastaturlayout via genveje eller statusområdet Comment[de]=Ermöglicht das Umschalten der Tastaturbelegung über Tastenkürzel oder Systemabschnitt der Kontrollleiste Comment[el]=Ενεργοποιεί την εναλλαγή διάταξης πληκτρολογίου μέσω συντομεύσεων ή μέσω του πλαισίου συστήματος Comment[en_GB]=Enables switching keyboard layout through shortcuts or system tray Comment[es]=Activa el cambio del diseño de teclado usando accesos rápidos de teclado o la bandeja del sistema Comment[et]=Klaviatuuripaigutuste vahetamine kiirklahviga või süsteemisalves Comment[eu]=Teklatuaren diseinua laster-tekla bidez edo sistema-erretiluaren bidez aldatzea ahalbidetzen du Comment[fi]=Mahdollistaa näppäimistöasettelun vaihtamisen pikanäppäimellä tai ilmoitusalueelta Comment[fr]=Active le changement de disposition du clavier par le biais de raccourcis claviers ou de la boîte à miniatures Comment[gl]=Permite cambiar de disposición de teclado mediante atallos ou desde a área de notficación do sistema. Comment[hu]=Lehetővé teszi a billentyűzet-kiosztások közötti váltást gyorsbombbal vagy a paneltálcán Comment[id]=Aktifkan peralihan tataletak keyboard melalui pintasan atau system tray Comment[it]=Abilita il cambio di mappatura della tastiera tramite scorciatoie o dal vassoio di sistema Comment[ko]=단축키나 시스템 트레이로 키보드 레이아웃 전환 허용 Comment[nl]=Schakelt omschakelen van toetsenindeling in via sneltoetsen of systeemvak Comment[nn]=Byte av tasteoppsett via snøggtastar eller systemtrauet Comment[pa]=ਕੀਬੋਰਡ ਲੇਆਉਟ ਨੂੰ ਸ਼ਾਰਟਕੱਟ ਜਾਂ ਸਿਸਟਮ ਟਰੇ ਰਾਹੀਂ ਸਮਰੱਥ ਕਰਦਾ ਹੈ Comment[pl]=Włącza przełączanie układu klawiatury poprzez skróty lub tackę systemową Comment[pt]=Activa a mudança de disposição do teclado por combinações de teclas ou na bandeja do sistema Comment[pt_BR]=Ativa a mudança de layout do teclado por teclas de atalho ou na área de notificação Comment[ru]=Обеспечивает смену раскладок клавиатуры при помощи комбинаций клавиш и через системный лоток Comment[sk]=Povolí prepínanie rozloženia klávesnice cez skratky alebo systémovú lištu Comment[sl]=Omogoča preklapljanje med razporeditvami tipk s pomočjo bližnjic ali sistemske vrstice Comment[sr]=Мењање распореда тастатуре преко пречица или системске касете Comment[sr@ijekavian]=Мењање распореда тастатуре преко пречица или системске касете Comment[sr@ijekavianlatin]=Menjanje rasporeda tastature preko prečica ili sistemske kasete Comment[sr@latin]=Menjanje rasporeda tastature preko prečica ili sistemske kasete Comment[sv]=Gör det möjligt att byta tangentbordslayout via genvägar eller systembrickan Comment[tr]=Klavye yerleşimini kısayollar veya sistem çekmecesinden değiştirmeyi etkinleştirir Comment[uk]=Уможливлює перемикання розкладок клавіатури за допомогою натискання клавіш або віджета системного лотка Comment[x-test]=xxEnables switching keyboard layout through shortcuts or system trayxx Comment[zh_CN]=启用通过快捷键或者系统托盘切换键盘布局 Comment[zh_TW]=用快速鍵或系統匣切換鍵盤布局 diff --git a/kcms/touchpad/src/kded/kded_touchpad.desktop b/kcms/touchpad/src/kded/kded_touchpad.desktop index af5244bbc..9b7dcf29d 100644 --- a/kcms/touchpad/src/kded/kded_touchpad.desktop +++ b/kcms/touchpad/src/kded/kded_touchpad.desktop @@ -1,92 +1,91 @@ [Desktop Entry] Type=Service X-KDE-ServiceTypes=KDEDModule X-KDE-Library=kded_touchpad -X-KDE-DBus-ModuleName=touchpad X-KDE-PluginInfo-Name=touchpad X-KDE-Kded-autoload=true X-KDE-Kded-load-on-demand=true X-KDE-OnlyShowOnQtPlatforms=xcb Name=Touchpad Name[ar]=لوحة اللمس Name[ca]=Ratolí tàctil Name[ca@valencia]=Ratolí tàctil Name[cs]=Touchpad Name[da]=Touchpad Name[de]=Touchpad Name[el]=Επιφάνεια αφής Name[en_GB]=Touchpad Name[es]=Panel táctil Name[et]=Puutepadi Name[eu]=Ukimen-sagua Name[fi]=Kosketuslevy Name[fr]=Pavé tactile Name[gl]=Área táctil Name[he]=לוח מגע Name[hu]=Érintőtábla Name[id]=Touchpad Name[is]=Snertiplatti Name[it]=Touchpad Name[ja]=タッチパッド Name[ko]=터치패드 Name[lt]=Jutiklinis kilimėlis Name[nl]=Touchpad Name[nn]=Styreplate Name[pa]=ਟੱਚਪੈਡ Name[pl]=Gładzik Name[pt]=Rato por Toque Name[pt_BR]=Touchpad Name[ru]=Сенсорная панель Name[sk]=Touchpad Name[sl]=Sledilna ploščica Name[sr]=Додирник Name[sr@ijekavian]=Додирник Name[sr@ijekavianlatin]=Dodirnik Name[sr@latin]=Dodirnik Name[sv]=Tryckplatta Name[tr]=Dokunmatik yüzey Name[uk]=Сенсорна панель Name[x-test]=xxTouchpadxx Name[zh_CN]=触摸板 Name[zh_TW]=觸控板 Comment=Enables or disables touchpad Comment[ar]=يفعّل لوحة اللمس أو يعطّلها Comment[ca]=Activa o desactiva el ratolí tàctil Comment[ca@valencia]=Activa o desactiva el ratolí tàctil Comment[cs]=Povolí/zakáže touchpad Comment[da]=Aktiverer eller deaktiverer touchpad Comment[de]=Aktiviert oder deaktiviert das Touchpad Comment[el]=Ενεργοποιεί ή απενεργοποιεί την επιφάνεια αφής Comment[en_GB]=Enables or disables touchpad Comment[es]=Activa o desactiva el panel táctil Comment[et]=Puutepadja lubamine või keelamine Comment[eu]=ukimen-sagua (des)gaitzen du Comment[fi]=Ottaa kosketuslevyn käyttöön tai poistaa sen käytöstä Comment[fr]=Active ou désactive le pavé tactile Comment[gl]=Activa ou desactiva a área táctil Comment[he]=אפשר או בטל את לוח המגע Comment[hu]=Érintőtábla be/kikapcsolása Comment[id]=Aktifkan atau nonaktifkan touchpad Comment[it]=Abilita o disabilita il touchpad Comment[ja]=タッチパッドを有効化または無効化する Comment[ko]=터치패드 활성/비활성 Comment[lt]=Įjungia arba išjungia jutiklinį kilimėlį Comment[nl]=Schakelt het touchpad in of uit Comment[nn]=Slå på/av styreplate Comment[pa]=ਟੱਚਪੈਡ ਚਾਲੂ ਜਾਂ ਬੰਦ ਕਰੋ Comment[pl]=Włącza lub wyłącza gładzik Comment[pt]=Activa ou desactiva o rato por toque Comment[pt_BR]=Ativa ou desativa o touchpad Comment[ru]=Включает или выключает сенсорную панель Comment[sk]=Povolí alebo zakáže touchpad Comment[sl]=Omogoči ali onemogoči sledilno ploščico Comment[sr]=Активира или деактивира додирник Comment[sr@ijekavian]=Активира или деактивира додирник Comment[sr@ijekavianlatin]=Aktivira ili deaktivira dodirnik Comment[sr@latin]=Aktivira ili deaktivira dodirnik Comment[sv]=Aktiverar eller inaktiverar tryckplattan Comment[tr]=Dokunmatik yüzeyi etkinleştirir veya kapatır Comment[uk]=Вмикає або вимикає сенсорну панель Comment[x-test]=xxEnables or disables touchpadxx Comment[zh_CN]=启用或禁用触摸板 Comment[zh_TW]=開啟或關閉觸控板 diff --git a/solid-device-automounter/kded/device_automounter.desktop b/solid-device-automounter/kded/device_automounter.desktop index b35aad41b..7f91f9b86 100644 --- a/solid-device-automounter/kded/device_automounter.desktop +++ b/solid-device-automounter/kded/device_automounter.desktop @@ -1,88 +1,87 @@ [Desktop Entry] Type=Service X-KDE-ServiceTypes=KDEDModule X-KDE-Kded-autoload=true X-KDE-Kded-load-on-demand=false X-KDE-Kded-phase=1 X-KDE-Library=device_automounter -X-KDE-DBus-ModuleName=device_automounter Name=Removable Device Automounter Name[ar]=الضّامّ الآليّ للأجهزة القابلة للإزالة Name[ca]=Muntador automàtic de dispositius extraïbles Name[ca@valencia]=Muntador automàtic de dispositius extraïbles Name[cs]=Automatické připojování odpojitelných zařízení Name[da]=Automontering af flytbare enheder Name[de]=Automatisches Einhängen von Wechselmedien Name[el]=Αυτόματη προσάρτηση αφαιρούμενων συσκευών Name[en_GB]=Removable Device Automounter Name[es]=Montador automático de dispositivos extraíbles Name[et]=Eemaldatavate seadmete automaatne ühendaja Name[eu]=Gailu aldagarrien automuntatzailea Name[fi]=Irrotettavan laitteen automaattiasentaja Name[fr]=Monteur automatique de périphériques Name[gl]=Montador automático de dispositivos extraíbeis Name[he]=מציב התקנים ניידים Name[hu]=Automatikus csatolás Name[id]=Removable Device Automounter Name[it]=Montaggio automatico dei dispositivi rimovibili Name[ko]=이동식 장치 자동 마운터 Name[lt]=Keičiamųjų įrenginių automatinis prijungimas Name[nl]=Automatische aankoppelaar voor verwijderbare apparaten Name[nn]=Automontering av flyttbare einingar Name[pa]=ਹਟਾਉਣਯੋਗ ਜੰਤਰ ਆਟੋ-ਮਾਊਂਟਰ Name[pl]=Samoczynne podpinanie urządzeń wymiennych Name[pt]=Auto-Montagem de Dispositivos Removíveis Name[pt_BR]=Montagem automática de dispositivos removíveis Name[ru]=Подключение внешних носителей Name[sk]=Automatické pripájanie vymeniteľných zariadení Name[sl]=Samodejno priklapljanje odstranljivih naprav Name[sr]=Аутоматско монтирање уклоњивих уређаја Name[sr@ijekavian]=Аутоматско монтирање уклоњивих уређаја Name[sr@ijekavianlatin]=Automatsko montiranje uklonjivih uređaja Name[sr@latin]=Automatsko montiranje uklonjivih uređaja Name[sv]=Automatisk montering av flyttbara enheter Name[tr]=Çıkarılabilir Aygıt Otomatik Bağlayıcı Name[uk]=Автоматичне монтування портативних пристроїв Name[x-test]=xxRemovable Device Automounterxx Name[zh_CN]=移动设备自动挂载器 Name[zh_TW]=可移除裝置自動掛載器 Comment=Automatically mounts devices as needed Comment[ar]=يضمّ الأجهزة آليًّا عند الحاجة Comment[ca]=Munta automàticament els dispositius quan es necessita Comment[ca@valencia]=Munta automàticament els dispositius quan es necessita Comment[cs]=Automaticky připojí zařízení dle potřeby Comment[da]=Monterer automatisk enheder efter behov Comment[de]=Hängt Geräte bei Bedarf automatisch ein Comment[el]=Αυτόματη προσάρτηση συσκευών όταν χρειάζεται Comment[en_GB]=Automatically mounts devices as needed Comment[es]=Monta automáticamente dispositivos cuando es necesario Comment[et]=Seadmete automaatne ühendamine vajaduse korral Comment[eu]=Automatikoki muntatzen ditu gailuak behar bezala Comment[fi]=Liittää laitteet automaattisesti tarpeen mukaan Comment[fr]=Monte automatiquement les périphériques lorsque cela est nécessaire Comment[gl]=Monta automaticamente os dispositivos cando sexa preciso Comment[he]=הצב אוטומטית אם צריך Comment[hu]=Eszközök automatikus csatolása szükség szerint Comment[id]=Mount perangkat secara otomatis ketika diperlukan Comment[it]=Monta automaticamente i dispositivi quando server Comment[ko]=필요할 때 자동으로 장치를 마운트합니다 Comment[lt]=Prireikus automatiškai prijungia įrenginius Comment[nl]=Koppelt automatisch apparaten aan zoals nodig is Comment[nn]=Monter einingar automatisk når dei trengst Comment[pa]=ਜਦੋਂ ਲੋੜ ਹੋਵੇ ਤਾਂ ਜੰਤਰ ਆਟੋਮੈਟਿਕ ਮਾਊਂਟ ਕਰੋ Comment[pl]=Podpina urządzenia, gdy są potrzebne Comment[pt]=Monta automaticamente os dispositivos, se necessário Comment[pt_BR]=Monta automaticamente os dispositivos quando necessário Comment[ru]=Автоматически подключает внешние носители информации Comment[sk]=Automaticky pripojí zariadenia podľa potreby Comment[sl]=Samodejno po potrebi priklopi naprave Comment[sr]=Аутоматско монтирање уклоњивих уређаја по потреби Comment[sr@ijekavian]=Аутоматско монтирање уклоњивих уређаја по потреби Comment[sr@ijekavianlatin]=Automatsko montiranje uklonjivih uređaja po potrebi Comment[sr@latin]=Automatsko montiranje uklonjivih uređaja po potrebi Comment[sv]=Monterar automatiskt enheter efter behov Comment[tr]=Aygıtları gerektiğinde otomatik olarak bağlar Comment[uk]=Автоматичне монтування пристроїв за вимогою Comment[x-test]=xxAutomatically mounts devices as neededxx Comment[zh_CN]=按需自动挂载设备 Comment[zh_TW]=需要時自動掛載