From 500ab7f706bdc8d4eb94db22ab60f882b2670dde Mon Sep 17 00:00:00 2001 From: Tannin Date: Mon, 16 Sep 2013 22:32:42 +0200 Subject: - bugfix: testing for missing masters at the wrong time seems to have caused crashes - bugfix: mod list is now written to a temporary file first. Only on success is the original file overwritten - bugfix: moving a mod priority to just above the overwrite could cause a crash or error message - bugfix: versions with a release candidate number weren't sorted correctly (woops) - bugfix: staging script didn't include archive.dll and dlls.manifest - installation time on overwrite no longer updates constantly --- src/pluginlist.cpp | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) (limited to 'src/pluginlist.cpp') diff --git a/src/pluginlist.cpp b/src/pluginlist.cpp index f73805fd..ea23fcdd 100644 --- a/src/pluginlist.cpp +++ b/src/pluginlist.cpp @@ -594,6 +594,8 @@ int PluginList::columnCount(const QModelIndex &) const void PluginList::testMasters() { +// emit layoutAboutToBeChanged(); + std::set enabledMasters; for (auto iter = m_ESPs.begin(); iter != m_ESPs.end(); ++iter) { if (iter->m_Enabled) { @@ -613,7 +615,8 @@ void PluginList::testMasters() } } - emit layoutChanged(); +#pragma message("emitting this seems to cause a crash!") +// emit layoutChanged(); } @@ -738,18 +741,18 @@ void PluginList::setPluginPriority(int row, int &newPriority) if (!m_ESPs[row].m_IsMaster) { // don't allow esps to be moved above esms while ((newPriorityTemp < static_cast(m_ESPsByPriority.size() - 1)) && - m_ESPs[m_ESPsByPriority[newPriorityTemp]].m_IsMaster) { + m_ESPs.at(m_ESPsByPriority.at(newPriorityTemp)).m_IsMaster) { ++newPriorityTemp; } } else { // don't allow esms to be moved below esps while ((newPriorityTemp > 0) && - !m_ESPs[m_ESPsByPriority[newPriorityTemp]].m_IsMaster) { + !m_ESPs.at(m_ESPsByPriority.at(newPriorityTemp)).m_IsMaster) { --newPriorityTemp; } // also don't allow "regular" esms to be moved above primary plugins while ((newPriorityTemp < static_cast(m_ESPsByPriority.size() - 1)) && - (m_ESPs[m_ESPsByPriority[newPriorityTemp]].m_ForceEnabled)) { + (m_ESPs.at(m_ESPsByPriority.at(newPriorityTemp)).m_ForceEnabled)) { ++newPriorityTemp; } } @@ -806,9 +809,9 @@ void PluginList::changePluginPriority(std::vector rows, int newPriority) } refreshLoadOrder(); - startSaveTime(); - emit layoutChanged(); + + startSaveTime(); } -- cgit v1.3.1 From dfca8be71b15bc13997110cc8777dd5a84a1fde7 Mon Sep 17 00:00:00 2001 From: Tannin Date: Sat, 21 Sep 2013 19:25:33 +0200 Subject: - esp reader now handles invalid files more gracefully - files moved will now also be treated as "deleted" in the old location so a newly created file with that same name is not created in overwrite - introduced a mechanism by which MO can recognize if it crashed before when attempting to load a plugin. That plugin can be blacklisted so it doesn't get loaded again - plugins can now programaticaly change their settings - plugins can now store data persistently without exposing that data as settings - requesting an unset-setting from a plugin is no longer treated as a bug - clarified warning message for when files are in overwrite directory - the proxyPython plugin will now discover if python initialization crashed MO on a previous session and give the user a chance to fix it or disable the plugin - bugfix: GetModuleFileName modified the buffer past the zero termination. While this doesn't violate the API documentation it is different from the regular windows implementation - bugfix: proxy plugins couldn't access the parent widget - bugfix: when moving a file from overwrite to a mod the in-memory file structure wasn't updated - bugfix: name input dialog for profiles allowed names that weren't valid directory names - bugfix: profile dialog wasn't able to delete profiles if the name started or ended in whitespaces - bugfix: The name-cells for plugin settings could be changed (without effect) - removed a few obsolete files from the repository --- src/activatemodsdialog.cpp | 5 -- src/activatemodsdialog.h | 1 - src/archivetree.cpp | 98 ------------------------ src/archivetree.h | 55 ------------- src/executableslist.cpp | 10 --- src/finddialog.cpp | 48 ------------ src/finddialog.h | 73 ------------------ src/main.cpp | 2 +- src/mainwindow.cpp | 94 ++++++++++++++++++++--- src/mainwindow.h | 6 ++ src/modlist.cpp | 8 ++ src/modlist.h | 8 ++ src/noeditdelegate.cpp | 10 +++ src/noeditdelegate.h | 12 +++ src/organizer.pro | 15 ++-- src/overwriteinfodialog.cpp | 1 - src/pluginlist.cpp | 8 +- src/profile.cpp | 1 + src/profileinputdialog.cpp | 55 ++++++------- src/profilesdialog.cpp | 47 ++++++++---- src/settings.cpp | 80 ++++++++++++++++++- src/settings.h | 47 +++++++++++- src/settingsdialog.cpp | 12 +++ src/settingsdialog.h | 2 + src/settingsdialog.ui | 182 ++++++++++++++++++++++++-------------------- src/shared/gameinfo.cpp | 20 ++--- src/shared/skyriminfo.cpp | 4 +- src/shared/skyriminfo.h | 2 +- src/version.rc | 4 +- 29 files changed, 457 insertions(+), 453 deletions(-) delete mode 100644 src/archivetree.cpp delete mode 100644 src/archivetree.h delete mode 100644 src/finddialog.cpp delete mode 100644 src/finddialog.h create mode 100644 src/noeditdelegate.cpp create mode 100644 src/noeditdelegate.h (limited to 'src/pluginlist.cpp') diff --git a/src/activatemodsdialog.cpp b/src/activatemodsdialog.cpp index cf798189..8d463fba 100644 --- a/src/activatemodsdialog.cpp +++ b/src/activatemodsdialog.cpp @@ -65,11 +65,6 @@ ActivateModsDialog::~ActivateModsDialog() } -void ActivateModsDialog::on_buttonBox_accepted() -{ -} - - std::set ActivateModsDialog::getModsToActivate() { std::set result; diff --git a/src/activatemodsdialog.h b/src/activatemodsdialog.h index db0bf7fa..845167aa 100644 --- a/src/activatemodsdialog.h +++ b/src/activatemodsdialog.h @@ -62,7 +62,6 @@ public: std::set getESPsToActivate(); private slots: - void on_buttonBox_accepted(); private: Ui::ActivateModsDialog *ui; diff --git a/src/archivetree.cpp b/src/archivetree.cpp deleted file mode 100644 index 0484b241..00000000 --- a/src/archivetree.cpp +++ /dev/null @@ -1,98 +0,0 @@ -/* -Copyright (C) 2012 Sebastian Herbord. All rights reserved. - -This file is part of Mod Organizer. - -Mod Organizer is free software: you can redistribute it and/or modify -it under the terms of the GNU General Public License as published by -the Free Software Foundation, either version 3 of the License, or -(at your option) any later version. - -Mod Organizer 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 Mod Organizer. If not, see . -*/ - -#include "archivetree.h" -#include - -ArchiveTree::ArchiveTree(QWidget *parent) : - QTreeWidget(parent) -{ -} - - -bool ArchiveTree::testMovePossible(QTreeWidgetItem *source, QTreeWidgetItem *target) -{ - if ((target == NULL) || - (source == NULL)) { - return false; - } - - if ((source == target) || - (source->parent() == target)) { - return false; - } - - return true; -} - -void ArchiveTree::dragEnterEvent(QDragEnterEvent *event) -{ - QTreeWidgetItem *source = this->currentItem(); - if ((source == NULL) || (source->parent() == NULL)) { - // can't change top level - event->ignore(); - return; - } else { - QTreeWidget::dragEnterEvent(event); - } - -} - -void ArchiveTree::dragMoveEvent(QDragMoveEvent *event) -{ - if (!testMovePossible(this->currentItem(), itemAt(event->pos()))) { - event->ignore(); - } else { - QTreeWidget::dragMoveEvent(event); - } -} - - -void ArchiveTree::dropEvent(QDropEvent *event) -{ - event->ignore(); - - QTreeWidgetItem *target = itemAt(event->pos()); - - QList sourceItems = this->selectedItems(); - for (QList::iterator iter = sourceItems.begin(); - iter != sourceItems.end(); ++iter) { - QTreeWidgetItem *source = *iter; - if ((source->parent() != NULL) && - testMovePossible(source, target)) { - source->parent()->removeChild(source); - if (target->data(0, Qt::UserRole).toInt() != 0) { - // target is a file - if (target->parent() == NULL) { - // this should really not happen, how should a - // file get to the top level? - return; - } - int index = target->parent()->indexOfChild(target); - target->parent()->insertChild(index, source); - emit changed(); - } else { - // target is a directory - target->insertChild(target->childCount(), source); - emit changed(); - } - } - } - -} diff --git a/src/archivetree.h b/src/archivetree.h deleted file mode 100644 index 775bf8b9..00000000 --- a/src/archivetree.h +++ /dev/null @@ -1,55 +0,0 @@ -/* -Copyright (C) 2012 Sebastian Herbord. All rights reserved. - -This file is part of Mod Organizer. - -Mod Organizer is free software: you can redistribute it and/or modify -it under the terms of the GNU General Public License as published by -the Free Software Foundation, either version 3 of the License, or -(at your option) any later version. - -Mod Organizer 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 Mod Organizer. If not, see . -*/ - -#ifndef ARCHIVETREE_H -#define ARCHIVETREE_H - -#include - -/** - * @brief QT tree widget used to display the content of an archive in the manual installation dialog - **/ -class ArchiveTree : public QTreeWidget -{ - - Q_OBJECT - -public: - - explicit ArchiveTree(QWidget *parent = 0); - -signals: - - void changed(); - -public slots: - -protected: - - virtual void dragEnterEvent(QDragEnterEvent *event); - virtual void dragMoveEvent(QDragMoveEvent *event); - virtual void dropEvent(QDropEvent *event); - -private: - - bool testMovePossible(QTreeWidgetItem *source, QTreeWidgetItem *target); - -}; - -#endif // ARCHIVETREE_H diff --git a/src/executableslist.cpp b/src/executableslist.cpp index 4e39c1a3..c486a4ca 100644 --- a/src/executableslist.cpp +++ b/src/executableslist.cpp @@ -172,16 +172,6 @@ void ExecutablesList::addExecutable(const QString &title, const QString &executa } } -/*void ExecutablesList::remove(const QString &executableName) -{ - for (std::vector::iterator iter = m_Executables.begin(); iter != m_Executables.end(); ++iter) { - if (iter->m_Custom && (iter->m_BinaryInfo.absoluteFilePath() == executableName)) { - m_Executables.erase(iter); - break; - } - } -}*/ - void ExecutablesList::remove(const QString &title) { diff --git a/src/finddialog.cpp b/src/finddialog.cpp deleted file mode 100644 index 58b70ade..00000000 --- a/src/finddialog.cpp +++ /dev/null @@ -1,48 +0,0 @@ -/* -Copyright (C) 2012 Sebastian Herbord. All rights reserved. - -This file is part of Mod Organizer. - -Mod Organizer is free software: you can redistribute it and/or modify -it under the terms of the GNU General Public License as published by -the Free Software Foundation, either version 3 of the License, or -(at your option) any later version. - -Mod Organizer 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 Mod Organizer. If not, see . -*/ - -#include "finddialog.h" -#include "ui_finddialog.h" - -FindDialog::FindDialog(QWidget *parent) : - QDialog(parent), - ui(new Ui::FindDialog) -{ - ui->setupUi(this); -} - -FindDialog::~FindDialog() -{ - delete ui; -} - -void FindDialog::on_nextBtn_clicked() -{ - emit findNext(); -} - -void FindDialog::on_patternEdit_textChanged(const QString &pattern) -{ - emit patternChanged(pattern); -} - -void FindDialog::on_closeBtn_clicked() -{ - this->close(); -} diff --git a/src/finddialog.h b/src/finddialog.h deleted file mode 100644 index 70493654..00000000 --- a/src/finddialog.h +++ /dev/null @@ -1,73 +0,0 @@ -/* -Copyright (C) 2012 Sebastian Herbord. All rights reserved. - -This file is part of Mod Organizer. - -Mod Organizer is free software: you can redistribute it and/or modify -it under the terms of the GNU General Public License as published by -the Free Software Foundation, either version 3 of the License, or -(at your option) any later version. - -Mod Organizer 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 Mod Organizer. If not, see . -*/ - -#ifndef FINDDIALOG_H -#define FINDDIALOG_H - -#include - -namespace Ui { - class FindDialog; -} - -/** - * @brief Find dialog used in the TextView dialog - **/ -class FindDialog : public QDialog -{ - - Q_OBJECT - -public: - - /** - * @brief constructor - * - * @param parent parent widget - **/ - explicit FindDialog(QWidget *parent = 0); - - ~FindDialog(); - -signals: - - /** - * @brief emitted when the user wants to jump to the next location matching the pattern - **/ - void findNext(); - - /** - * @brief emitted when the user changes the pattern to search for - * - * @param pattern the new search pattern - **/ - void patternChanged(const QString &pattern); - -private slots: - void on_nextBtn_clicked(); - - void on_patternEdit_textChanged(const QString &arg1); - - void on_closeBtn_clicked(); - -private: - Ui::FindDialog *ui; -}; - -#endif // FINDDIALOG_H diff --git a/src/main.cpp b/src/main.cpp index 1d40dfeb..5a694121 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -343,7 +343,7 @@ int main(int argc, char *argv[]) bool done = false; while (!done) { - if (!GameInfo::init(moPath, ToWString(gamePath))) { + if (!GameInfo::init(moPath, ToWString(QDir::toNativeSeparators(gamePath)))) { if (!gamePath.isEmpty()) { reportError(QObject::tr("No game identified in \"%1\". The directory is required to contain " "the game binary and its launcher.").arg(gamePath)); diff --git a/src/mainwindow.cpp b/src/mainwindow.cpp index 2c5e3707..ffec91a1 100644 --- a/src/mainwindow.cpp +++ b/src/mainwindow.cpp @@ -98,6 +98,7 @@ along with Mod Organizer. If not, see . #include #include #include +#include #ifdef TEST_MODELS @@ -233,6 +234,7 @@ MainWindow::MainWindow(const QString &exeName, QSettings &initSettings, QWidget connect(&m_ModList, SIGNAL(modlist_changed(QModelIndex, int)), this, SLOT(modlistChanged(QModelIndex, int))); connect(&m_ModList, SIGNAL(removeSelectedMods()), this, SLOT(removeMod_clicked())); connect(&m_ModList, SIGNAL(requestColumnSelect(QPoint)), this, SLOT(displayColumnSelection(QPoint))); + connect(&m_ModList, SIGNAL(fileMoved(QString, QString, QString)), this, SLOT(fileMoved(QString, QString, QString))); connect(ui->modList, SIGNAL(dropModeUpdate(bool)), &m_ModList, SLOT(dropModeUpdate(bool))); connect(m_ModListSortProxy, SIGNAL(filterActive(bool)), this, SLOT(modFilterActive(bool))); connect(ui->modFilterEdit, SIGNAL(textChanged(QString)), m_ModListSortProxy, SLOT(updateFilter(QString))); @@ -997,6 +999,7 @@ bool MainWindow::registerPlugin(QObject *plugin) { // proxy plugins IPluginProxy *proxy = qobject_cast(plugin); if (verifyPlugin(proxy)) { + proxy->setParentWidget(this); QStringList pluginNames = proxy->pluginList(QCoreApplication::applicationDirPath() + "/" + ToQString(AppConfig::pluginPath())); foreach (const QString &pluginName, pluginNames) { try { @@ -1040,11 +1043,38 @@ void MainWindow::loadPlugins() registerPlugin(plugin); } + QFile loadCheck(QCoreApplication::applicationDirPath() + "/plugin_loadcheck.tmp"); + if (loadCheck.exists() && loadCheck.open(QIODevice::ReadOnly)) { + // oh, there was a failed plugin load last time. Find out which plugin was loaded last + QString fileName; + while (!loadCheck.atEnd()) { + fileName = QString::fromUtf8(loadCheck.readLine().constData()).trimmed(); + } + if (QMessageBox::question(this, tr("Plugin error"), + tr("It appears the plugin \"%1\" failed to load last startup and caused MO to crash. Do you want to disable it?\n" + "(Please note: If this is the first time you see this message for this plugin you may want to give it another try. " + "The plugin may be able to recover from the problem)").arg(fileName), + QMessageBox::Yes | QMessageBox::No, QMessageBox::Yes) == QMessageBox::Yes) { + m_Settings.addBlacklistPlugin(fileName); + } + loadCheck.close(); + } + + loadCheck.open(QIODevice::WriteOnly); + QString pluginPath = QDir::fromNativeSeparators(ToQString(GameInfo::instance().getOrganizerDirectory())) + "/" + ToQString(AppConfig::pluginPath()); qDebug("looking for plugins in %s", QDir::toNativeSeparators(pluginPath).toUtf8().constData()); QDirIterator iter(pluginPath, QDir::Files | QDir::NoDotAndDotDot); + while (iter.hasNext()) { iter.next(); + if (m_Settings.pluginBlacklisted(iter.fileName())) { + qDebug("plugin \"%s\" blacklisted", qPrintable(iter.fileName())); + continue; + } + loadCheck.write(iter.fileName().toUtf8()); + loadCheck.write("\n"); + loadCheck.flush(); QString pluginName = iter.filePath(); if (QLibrary::isLibrary(pluginName)) { QPluginLoader pluginLoader(pluginName); @@ -1063,6 +1093,9 @@ void MainWindow::loadPlugins() } } + // remove the load check file on success + loadCheck.remove(); + m_DownloadManager.setSupportedExtensions(m_InstallationManager.getSupportedExtensions()); m_DiagnosisPlugins.push_back(this); @@ -1172,6 +1205,21 @@ QVariant MainWindow::pluginSetting(const QString &pluginName, const QString &key return m_Settings.pluginSetting(pluginName, key); } +void MainWindow::setPluginSetting(const QString &pluginName, const QString &key, const QVariant &value) +{ + m_Settings.setPluginSetting(pluginName, key, value); +} + +QVariant MainWindow::persistent(const QString &pluginName, const QString &key, const QVariant &def) const +{ + return m_Settings.pluginPersistent(pluginName, key, def); +} + +void MainWindow::setPersistent(const QString &pluginName, const QString &key, const QVariant &value, bool sync) +{ + m_Settings.setPluginPersistent(pluginName, key, value, sync); +} + QString MainWindow::pluginDataPath() const { QString pluginPath = QDir::fromNativeSeparators(ToQString(GameInfo::instance().getOrganizerDirectory())) + "/" + ToQString(AppConfig::pluginPath()); @@ -1273,11 +1321,9 @@ void MainWindow::spawnBinary(const QFileInfo &binary, const QString &arguments, this->setEnabled(true); refreshDirectoryStructure(); - refreshDataTree(); if (GameInfo::instance().getLoadOrderMechanism() == GameInfo::TYPE_FILETIME) { QFile::remove(m_CurrentProfile->getLoadOrderFileName()); } - refreshLists(); dialog->hide(); } } @@ -1622,11 +1668,15 @@ void MainWindow::refreshESPList() m_CurrentProfile->writeModlist(); // clear list - m_PluginList.refresh(m_CurrentProfile->getName(), - *m_DirectoryStructure, - m_CurrentProfile->getPluginsFileName(), - m_CurrentProfile->getLoadOrderFileName(), - m_CurrentProfile->getLockedOrderFileName()); + try { + m_PluginList.refresh(m_CurrentProfile->getName(), + *m_DirectoryStructure, + m_CurrentProfile->getPluginsFileName(), + m_CurrentProfile->getLoadOrderFileName(), + m_CurrentProfile->getLockedOrderFileName()); + } catch (const std::exception &e) { + reportError(tr("Failed to refresh list of esps: %s").arg(e.what())); + } } @@ -1926,7 +1976,6 @@ void MainWindow::on_btnRefreshData_clicked() { if (!m_DirectoryUpdate) { refreshDirectoryStructure(); - refreshDataTree(); } else { qDebug("directory update"); } @@ -2331,8 +2380,12 @@ void MainWindow::directory_refreshed() { DirectoryEntry *newStructure = m_DirectoryRefresher.getDirectoryStructure(); if (newStructure != NULL) { - delete m_DirectoryStructure; + DirectoryEntry *oldStructure = m_DirectoryStructure; m_DirectoryStructure = newStructure; + delete oldStructure; + + refreshDataTree(); + refreshLists(); } else { // TODO: don't know why this happens, this slot seems to get called twice with only one emit return; @@ -2541,6 +2594,29 @@ void MainWindow::modlistChanged(int) } +void MainWindow::fileMoved(const QString &filePath, const QString &oldOriginName, const QString &newOriginName) +{ + const FileEntry::Ptr filePtr = m_DirectoryStructure->findFile(ToWString(filePath)); + if (filePtr.get() != NULL) { + try { + FilesOrigin &oldOrigin = m_DirectoryStructure->getOriginByName(ToWString(oldOriginName)); + FilesOrigin &newOrigin = m_DirectoryStructure->getOriginByName(ToWString(newOriginName)); + + QString fullNewPath = ToQString(newOrigin.getPath()) + "\\" + filePath; + WIN32_FIND_DATAW findData; + ::FindFirstFileW(ToWString(fullNewPath).c_str(), &findData); + + filePtr->addOrigin(newOrigin.getID(), findData.ftCreationTime, L""); + filePtr->removeOrigin(oldOrigin.getID()); + } catch (const std::exception &e) { + reportError(tr("Failed to move \"%1\" from mod \"%2\" to \"%3\": %4").arg(filePath).arg(oldOriginName).arg(newOriginName).arg(e.what())); + } + } else { + reportError(tr("Failed to relocate \"%1\"").arg(filePath)); + } +} + + QTreeWidgetItem *MainWindow::addFilterItem(QTreeWidgetItem *root, const QString &name, int categoryID) { QTreeWidgetItem *item = new QTreeWidgetItem(QStringList(name)); diff --git a/src/mainwindow.h b/src/mainwindow.h index 152c0a27..54ae0e96 100644 --- a/src/mainwindow.h +++ b/src/mainwindow.h @@ -105,6 +105,9 @@ public: virtual bool removeMod(MOBase::IModInterface *mod); virtual void modDataChanged(MOBase::IModInterface *mod); virtual QVariant pluginSetting(const QString &pluginName, const QString &key) const; + virtual void setPluginSetting(const QString &pluginName, const QString &key, const QVariant &value); + virtual QVariant persistent(const QString &pluginName, const QString &key, const QVariant &def = QVariant()) const; + virtual void setPersistent(const QString &pluginName, const QString &key, const QVariant &value, bool sync = true); virtual QString pluginDataPath() const; virtual void installMod(const QString &fileName); virtual QString resolvePath(const QString &fileName) const; @@ -315,6 +318,8 @@ private: std::vector m_DiagnosisPlugins; std::vector m_UnloadedPlugins; + QFile m_PluginsCheck; + private slots: void showMessage(const QString &message); @@ -435,6 +440,7 @@ private slots: void updateStyle(const QString &style); void modlistChanged(const QModelIndex &index, int role); + void fileMoved(const QString &filePath, const QString &oldOriginName, const QString &newOriginName); void savePluginList(); diff --git a/src/modlist.cpp b/src/modlist.cpp index 5aa8fbb9..b5a7182e 100644 --- a/src/modlist.cpp +++ b/src/modlist.cpp @@ -477,6 +477,7 @@ Qt::ItemFlags ModList::flags(const QModelIndex &modelIndex) const return result; } + QStringList ModList::mimeTypes() const { QStringList result = QAbstractItemModel::mimeTypes(); @@ -544,6 +545,12 @@ bool ModList::dropURLs(const QMimeData *mimeData, int row, const QModelIndex &pa QDir modDirectory(modInfo->absolutePath()); QDir gameDirectory(QDir::fromNativeSeparators(ToQString(MOShared::GameInfo::instance().getOverwriteDir()))); + unsigned int overwriteIndex = ModInfo::findMod([](ModInfo::Ptr mod) -> bool { + std::vector flags = mod->getFlags(); + return std::find(flags.begin(), flags.end(), ModInfo::FLAG_OVERWRITE) != flags.end(); }); + + QString overwriteName = ModInfo::getByIndex(overwriteIndex)->name(); + foreach (const QUrl &url, mimeData->urls()) { QString relativePath = gameDirectory.relativeFilePath(url.toLocalFile()); if (relativePath.startsWith("..")) { @@ -552,6 +559,7 @@ bool ModList::dropURLs(const QMimeData *mimeData, int row, const QModelIndex &pa } source.append(url.toLocalFile()); target.append(modDirectory.absoluteFilePath(relativePath)); + emit fileMoved(relativePath, overwriteName, modInfo->name()); } if (source.count() != 0) { diff --git a/src/modlist.h b/src/modlist.h index 069de40b..7e76d677 100644 --- a/src/modlist.h +++ b/src/modlist.h @@ -182,6 +182,14 @@ signals: */ void removeSelectedMods(); + /** + * @brief fileMoved emitted when a file is moved from one mod to another + * @param relativePath relative path of the file moved + * @param oldOriginName name of the origin that previously contained the file + * @param newOriginName name of the origin that now contains the file + */ + void fileMoved(const QString &relativePath, const QString &oldOriginName, const QString &newOriginName); + protected: // event filter, handles event from the header and the tree view itself diff --git a/src/noeditdelegate.cpp b/src/noeditdelegate.cpp new file mode 100644 index 00000000..ab8a4880 --- /dev/null +++ b/src/noeditdelegate.cpp @@ -0,0 +1,10 @@ +#include "noeditdelegate.h" + +NoEditDelegate::NoEditDelegate(QObject *parent) + : QStyledItemDelegate(parent) +{ +} + +QWidget *NoEditDelegate::createEditor(QWidget*, const QStyleOptionViewItem&, const QModelIndex&) const { + return NULL; +} diff --git a/src/noeditdelegate.h b/src/noeditdelegate.h new file mode 100644 index 00000000..d0ba2f68 --- /dev/null +++ b/src/noeditdelegate.h @@ -0,0 +1,12 @@ +#ifndef NOEDITDELEGATE_H +#define NOEDITDELEGATE_H + +#include + +class NoEditDelegate: public QStyledItemDelegate { +public: + NoEditDelegate(QObject *parent = NULL); + virtual QWidget *createEditor(QWidget *parent, const QStyleOptionViewItem &option, const QModelIndex &index) const; +}; + +#endif // NOEDITDELEGATE_H diff --git a/src/organizer.pro b/src/organizer.pro index 339a50cd..e89b6e99 100644 --- a/src/organizer.pro +++ b/src/organizer.pro @@ -51,7 +51,6 @@ SOURCES += \ json.cpp \ installationmanager.cpp \ helper.cpp \ - finddialog.cpp \ filedialogmemory.cpp \ executableslist.cpp \ editexecutablesdialog.cpp \ @@ -66,7 +65,6 @@ SOURCES += \ categoriesdialog.cpp \ categories.cpp \ bbcode.cpp \ - archivetree.cpp \ activatemodsdialog.cpp \ moapplication.cpp \ profileinputdialog.cpp \ @@ -80,7 +78,8 @@ SOURCES += \ serverinfo.cpp \ ../esptk/record.cpp \ ../esptk/espfile.cpp \ - ../esptk/subrecord.cpp + ../esptk/subrecord.cpp \ + noeditdelegate.cpp HEADERS += \ transfersavesdialog.h \ @@ -119,7 +118,6 @@ HEADERS += \ json.h \ installationmanager.h \ helper.h \ - finddialog.h \ filedialogmemory.h \ executableslist.h \ editexecutablesdialog.h \ @@ -134,7 +132,6 @@ HEADERS += \ categoriesdialog.h \ categories.h \ bbcode.h \ - archivetree.h \ activatemodsdialog.h \ moapplication.h \ profileinputdialog.h \ @@ -148,7 +145,9 @@ HEADERS += \ serverinfo.h \ ../esptk/record.h \ ../esptk/espfile.h \ - ../esptk/subrecord.h + ../esptk/subrecord.h \ + ../esptk/espexceptions.h \ + noeditdelegate.h FORMS += \ transfersavesdialog.ui \ @@ -218,8 +217,8 @@ TRANSLATIONS = organizer_de.ts \ organizer_zh_CN.ts \ organizer_cs.ts \ organizer_tr.ts \ - organizer_ru.ts \ - organizer.en.ts +# organizer.en.ts \ + organizer_ru.ts !isEmpty(TRANSLATIONS) { isEmpty(QMAKE_LRELEASE) { diff --git a/src/overwriteinfodialog.cpp b/src/overwriteinfodialog.cpp index 11e7b552..e215146f 100644 --- a/src/overwriteinfodialog.cpp +++ b/src/overwriteinfodialog.cpp @@ -37,7 +37,6 @@ public: virtual int columnCount(const QModelIndex &parent) const { m_RegularColumnCount = QFileSystemModel::columnCount(parent); -// return m_RegularColumnCount + 1; return m_RegularColumnCount; } diff --git a/src/pluginlist.cpp b/src/pluginlist.cpp index ea23fcdd..6cb9bdf7 100644 --- a/src/pluginlist.cpp +++ b/src/pluginlist.cpp @@ -140,8 +140,12 @@ void PluginList::refresh(const QString &profileName, const DirectoryEntry &baseD std::find(primaryPlugins.begin(), primaryPlugins.end(), ToWString(filename.toLower())) != primaryPlugins.end(); bool archive = false; - FilesOrigin &origin = baseDirectory.getOriginByID(current->getOrigin(archive)); - m_ESPs.push_back(ESPInfo(filename, forceEnabled, current->getFileTime(), ToQString(origin.getName()), ToQString(current->getFullPath()))); + try { + FilesOrigin &origin = baseDirectory.getOriginByID(current->getOrigin(archive)); + m_ESPs.push_back(ESPInfo(filename, forceEnabled, current->getFileTime(), ToQString(origin.getName()), ToQString(current->getFullPath()))); + } catch (const std::exception &e) { + reportError(tr("failed to update esp info for file %1 (source id: %2), error: %3").arg(filename).arg(current->getOrigin(archive)).arg(e.what())); + } } } diff --git a/src/profile.cpp b/src/profile.cpp index 330bfa09..07f7010e 100644 --- a/src/profile.cpp +++ b/src/profile.cpp @@ -755,6 +755,7 @@ QString Profile::getIniFileName() const return m_Directory.absoluteFilePath(ToQString(primaryIniFile)); } + QString Profile::getPath() const { return QDir::cleanPath(m_Directory.absolutePath()); diff --git a/src/profileinputdialog.cpp b/src/profileinputdialog.cpp index 7402d4d5..af33dcdd 100644 --- a/src/profileinputdialog.cpp +++ b/src/profileinputdialog.cpp @@ -17,29 +17,32 @@ You should have received a copy of the GNU General Public License along with Mod Organizer. If not, see . */ -#include "profileinputdialog.h" -#include "ui_profileinputdialog.h" - -ProfileInputDialog::ProfileInputDialog(QWidget *parent) : - QDialog(parent), - ui(new Ui::ProfileInputDialog) -{ - ui->setupUi(this); -} - -ProfileInputDialog::~ProfileInputDialog() -{ - delete ui; -} - -QString ProfileInputDialog::getName() const -{ - return ui->nameEdit->text().trimmed(); -} - - -bool ProfileInputDialog::getPreferDefaultSettings() const -{ - return ui->defaultSettingsBox->checkState() == Qt::Checked; -} - +#include "profileinputdialog.h" +#include "ui_profileinputdialog.h" +#include + +ProfileInputDialog::ProfileInputDialog(QWidget *parent) : + QDialog(parent), + ui(new Ui::ProfileInputDialog) +{ + ui->setupUi(this); +} + +ProfileInputDialog::~ProfileInputDialog() +{ + delete ui; +} + +QString ProfileInputDialog::getName() const +{ + QString result = ui->nameEdit->text(); + MOBase::fixDirectoryName(result); + return result; +} + + +bool ProfileInputDialog::getPreferDefaultSettings() const +{ + return ui->defaultSettingsBox->checkState() == Qt::Checked; +} + diff --git a/src/profilesdialog.cpp b/src/profilesdialog.cpp index 9955ecd2..69872a24 100644 --- a/src/profilesdialog.cpp +++ b/src/profilesdialog.cpp @@ -150,36 +150,55 @@ void ProfilesDialog::on_copyProfileButton_clicked() { bool okClicked; QString name = QInputDialog::getText(this, tr("Name"), tr("Please enter a name for the new profile"), QLineEdit::Normal, QString(), &okClicked); - if (okClicked && (name.size() > 0)) { - QListWidget *profilesList = findChild("profilesList"); - - try { - const Profile::Ptr currentProfile = profilesList->currentItem()->data(Qt::UserRole).value(); - createProfile(name, *currentProfile); - } catch (const std::exception &e) { - reportError(tr("failed to copy profile: %1").arg(e.what())); + fixDirectoryName(name); + if (okClicked) { + if (name.size() > 0) { + QListWidget *profilesList = findChild("profilesList"); + + try { + const Profile::Ptr currentProfile = profilesList->currentItem()->data(Qt::UserRole).value(); + createProfile(name, *currentProfile); + } catch (const std::exception &e) { + reportError(tr("failed to copy profile: %1").arg(e.what())); + } + } else { + QMessageBox::warning(this, tr("Invalid name"), tr("Invalid profile name")); } } } void ProfilesDialog::on_removeProfileButton_clicked() { - QMessageBox confirmBox(QMessageBox::Question, tr("Confirm"), tr("Are you sure you want to remove this profile?"), + QMessageBox confirmBox(QMessageBox::Question, tr("Confirm"), tr("Are you sure you want to remove this profile (including local savegames if any)?"), QMessageBox::Yes | QMessageBox::No); if (confirmBox.exec() == QMessageBox::Yes) { QListWidget *profilesList = findChild("profilesList"); Profile::Ptr currentProfile = profilesList->currentItem()->data(Qt::UserRole).value(); - - // on destruction, the profile object would write the profile.ini file again, so - // we have to get rid of the it before deleting the directory - QString profilePath = currentProfile->getPath(); + QString profilePath; + if (currentProfile.get() == NULL) { + profilePath = QDir::fromNativeSeparators(ToQString(GameInfo::instance().getProfilesDir())) + "/" + profilesList->currentItem()->text(); + if (QMessageBox::question(this, tr("Profile broken"), + tr("This profile you're about to delete seems to be broken or the path is invalid. " + "I'm about to delete the following folder: \"%1\". Proceed?").arg(profilePath), QMessageBox::Yes | QMessageBox::No) == QMessageBox::No) { + return; + } + } else { + // on destruction, the profile object would write the profile.ini file again, so + // we have to get rid of the it before deleting the directory + profilePath = currentProfile->getPath(); + } QListWidgetItem* item = profilesList->takeItem(profilesList->currentRow()); if (item != NULL) { delete item; } - shellDelete(QStringList(profilePath)); + if (!shellDelete(QStringList(profilePath))) { + qWarning("Failed to shell-delete \"%s\" (errorcode %lu), trying regular delete", qPrintable(profilePath), ::GetLastError()); + if (!removeDir(profilePath)) { + qWarning("regular delete failed too"); + } + } } } diff --git a/src/settings.cpp b/src/settings.cpp index 39b6dba7..42a8d693 100644 --- a/src/settings.cpp +++ b/src/settings.cpp @@ -87,6 +87,19 @@ void Settings::clearPlugins() { m_Plugins.clear(); m_PluginSettings.clear(); + + m_PluginBlacklist.clear(); + int count = m_Settings.beginReadArray("pluginBlacklist"); + for (int i = 0; i < count; ++i) { + m_Settings.setArrayIndex(i); + m_PluginBlacklist.insert(m_Settings.value("name").toString()); + } + m_Settings.endArray(); +} + +bool Settings::pluginBlacklisted(const QString &fileName) const +{ + return m_PluginBlacklist.contains(fileName); } void Settings::registerPlugin(IPlugin *plugin) @@ -275,16 +288,47 @@ QVariant Settings::pluginSetting(const QString &pluginName, const QString &key) { auto iterPlugin = m_PluginSettings.find(pluginName); if (iterPlugin == m_PluginSettings.end()) { - throw MyException(tr("setting for invalid plugin \"%1\" requested").arg(key)); + return QVariant(); } auto iterSetting = iterPlugin->find(key); if (iterSetting == iterPlugin->end()) { - throw MyException(tr("invalid setting \"%1\" requested for plugin \"%2\"").arg(key).arg(pluginName)); + return QVariant(); } return *iterSetting; } +void Settings::setPluginSetting(const QString &pluginName, const QString &key, const QVariant &value) +{ + auto iterPlugin = m_PluginSettings.find(pluginName); + if (iterPlugin == m_PluginSettings.end()) { + throw MyException(tr("attempt to store setting for unknown plugin \"%1\"").arg(pluginName)); + } + + // store the new setting both in memory and in the ini + m_PluginSettings[pluginName][key] = value; + m_Settings.setValue("Plugins/" + pluginName + "/" + key, value); +} + +QVariant Settings::pluginPersistent(const QString &pluginName, const QString &key, const QVariant &def) const +{ + if (!m_PluginSettings.contains(pluginName)) { + return def; + } + return m_Settings.value("PluginPersistance/" + pluginName + "/" + key, def); +} + +void Settings::setPluginPersistent(const QString &pluginName, const QString &key, const QVariant &value, bool sync) +{ + if (!m_PluginSettings.contains(pluginName)) { + throw MyException(tr("attempt to store setting for unknown plugin \"%1\"").arg(pluginName)); + } + m_Settings.setValue("PluginPersistance/" + pluginName + "/" + key, value); + if (sync) { + m_Settings.sync(); + } +} + QString Settings::language() { QString result = m_Settings.value("Settings/language", "").toString(); @@ -330,6 +374,23 @@ void Settings::updateServers(const QList &servers) m_Settings.sync(); } +void Settings::addBlacklistPlugin(const QString &fileName) +{ + m_PluginBlacklist.insert(fileName); + writePluginBlacklist(); +} + +void Settings::writePluginBlacklist() +{ + m_Settings.beginWriteArray("pluginBlacklist"); + int idx = 0; + foreach (const QString &plugin, m_PluginBlacklist) { + m_Settings.setArrayIndex(idx++); + m_Settings.setValue("name", plugin); + } + + m_Settings.endArray(); +} void Settings::addLanguages(QComboBox *languageBox) { @@ -443,6 +504,7 @@ void Settings::query(QWidget *parent) // plugis page QListWidget *pluginsList = dialog.findChild("pluginsList"); + QListWidget *pluginBlacklistList = dialog.findChild("pluginBlacklist"); // workarounds page QCheckBox *forceEnableBox = dialog.findChild("forceEnableBox"); @@ -522,6 +584,7 @@ void Settings::query(QWidget *parent) nmmVersionEdit->setText(m_Settings.value("Settings/nmm_version", "0.33.1").toString()); logLevelBox->setCurrentIndex(logLevel()); + // display plugin settings foreach (IPlugin *plugin, m_Plugins) { QListWidgetItem *listItem = new QListWidgetItem(plugin->name(), pluginsList); listItem->setData(Qt::UserRole, QVariant::fromValue((void*)plugin)); @@ -529,6 +592,12 @@ void Settings::query(QWidget *parent) pluginsList->addItem(listItem); } + // display plugin blacklist + foreach (const QString &pluginName, m_PluginBlacklist) { + pluginBlacklistList->addItem(pluginName); + } + + // display server preferences m_Settings.beginGroup("Servers"); foreach (const QString &key, m_Settings.childKeys()) { QVariantMap val = m_Settings.value(key).toMap(); @@ -624,6 +693,13 @@ void Settings::query(QWidget *parent) } } + // store plugin blacklist + m_PluginBlacklist.clear(); + foreach (QListWidgetItem *item, pluginBlacklistList->findItems("*", Qt::MatchWildcard)) { + m_PluginBlacklist.insert(item->text()); + } + writePluginBlacklist(); + // store server preference m_Settings.beginGroup("Servers"); for (int i = 0; i < knownServersList->count(); ++i) { diff --git a/src/settings.h b/src/settings.h index bf17d162..51ee6b92 100644 --- a/src/settings.h +++ b/src/settings.h @@ -57,6 +57,7 @@ public: /** * @brief register plugin to be configurable * @param plugin the plugin to register + * @return true if the plugin may be registered, false if it is blacklisted */ void registerPlugin(MOBase::IPlugin *plugin); @@ -195,10 +196,37 @@ public: * @param pluginName name of the plugin * @param key name of the setting to retrieve * @return the requested value as a QVariant - * @throws an exception is thrown if this setting doesn't exist + * @note an invalid QVariant is returned if the the plugin/setting is not declared */ QVariant pluginSetting(const QString &pluginName, const QString &key) const; + /** + * @brief set a setting for one of the installed mods + * @param pluginName name of the plugin + * @param key name of the setting to change + * @param value the new value to set + * @throw an exception is thrown if pluginName is invalid + */ + void setPluginSetting(const QString &pluginName, const QString &key, const QVariant &value); + + /** + * @brief retrieve a persistent value for a plugin + * @param pluginName name of the plugin to store data for + * @param key id of the value to retrieve + * @param def default value to return if the value is not set + * @return the requested value + */ + QVariant pluginPersistent(const QString &pluginName, const QString &key, const QVariant &def) const; + + /** + * @brief set a persistent value for a plugin + * @param pluginName name of the plugin to store data for + * @param key id of the value to retrieve + * @param value value to set + * @throw an exception is thrown if pluginName is invalid + */ + void setPluginPersistent(const QString &pluginName, const QString &key, const QVariant &value, bool sync); + /** * @return short code of the configured language (corresponding to the translation files) */ @@ -210,6 +238,19 @@ public: */ void updateServers(const QList &servers); + /** + * @brief add a plugin that is to be blacklisted + * @param fileName name of the plugin to blacklist + */ + void addBlacklistPlugin(const QString &fileName); + + /** + * @brief test if a plugin is blacklisted and shouldn't be loaded + * @param fileName name of the plugin + * @return true if the file is blacklisted + */ + bool pluginBlacklisted(const QString &fileName) const; + private: QString obfuscate(const QString &password) const; @@ -219,6 +260,8 @@ private: void addStyles(QComboBox *styleBox); bool isNXMHandler(bool *modifyable); void setNXMHandlerActive(bool active, bool writable); + void readPluginBlacklist(); + void writePluginBlacklist(); private slots: @@ -241,6 +284,8 @@ private: QMap > m_PluginSettings; + QSet m_PluginBlacklist; + }; #endif // WORKAROUNDS_H diff --git a/src/settingsdialog.cpp b/src/settingsdialog.cpp index 9f268455..c8908ddb 100644 --- a/src/settingsdialog.cpp +++ b/src/settingsdialog.cpp @@ -21,10 +21,12 @@ along with Mod Organizer. If not, see . #include "ui_settingsdialog.h" #include "categoriesdialog.h" #include "helper.h" +#include "noeditdelegate.h" #include #include #include #include +#include #define WIN32_LEAN_AND_MEAN #include @@ -37,6 +39,9 @@ SettingsDialog::SettingsDialog(QWidget *parent) : TutorableDialog("SettingsDialog", parent), ui(new Ui::SettingsDialog) { ui->setupUi(this); + + QShortcut *delShortcut = new QShortcut(QKeySequence(Qt::Key_Delete), ui->pluginBlacklist); + connect(delShortcut, SIGNAL(activated()), this, SLOT(deleteBlacklistItem())); } SettingsDialog::~SettingsDialog() @@ -146,6 +151,8 @@ void SettingsDialog::on_pluginsList_currentItemChanged(QListWidgetItem *current, for (auto iter = settings.begin(); iter != settings.end(); ++iter) { QTreeWidgetItem *newItem = new QTreeWidgetItem(QStringList(iter.key())); QVariant value = *iter; + + ui->pluginSettingsList->setItemDelegateForColumn(0, new NoEditDelegate()); newItem->setData(1, Qt::DisplayRole, value); newItem->setData(1, Qt::EditRole, value); @@ -153,3 +160,8 @@ void SettingsDialog::on_pluginsList_currentItemChanged(QListWidgetItem *current, ui->pluginSettingsList->addTopLevelItem(newItem); } } + +void SettingsDialog::deleteBlacklistItem() +{ + ui->pluginBlacklist->takeItem(ui->pluginBlacklist->currentIndex().row()); +} diff --git a/src/settingsdialog.h b/src/settingsdialog.h index 3bfc1706..718574a0 100644 --- a/src/settingsdialog.h +++ b/src/settingsdialog.h @@ -73,6 +73,8 @@ private slots: void on_pluginsList_currentItemChanged(QListWidgetItem *current, QListWidgetItem *previous); + void deleteBlacklistItem(); + private: Ui::SettingsDialog *ui; }; diff --git a/src/settingsdialog.ui b/src/settingsdialog.ui index b63965f9..e7bd0fa3 100644 --- a/src/settingsdialog.ui +++ b/src/settingsdialog.ui @@ -406,102 +406,116 @@ p, li { white-space: pre-wrap; } Plugins - + - - - - 0 - 0 - - - - - - + - - - - - Author: - - - - - - - - - - - - - - Version: - - + + + + 0 + 0 + + + + + + + + + + + + Author: + + + + + + + + + + + + + + Version: + + + + + + + + + + + + + + Description: + + + + + + + + + + true + + + + - - - - + + + + 0 - - - - - - Description: + + false - - - - - - + + false - - true + + false + + false + + + 100 + + + + Key + + + + + Value + + - - - - 0 - - - false - - - false - - - false - - - false - - - 100 - - - - Key - - - - - Value - - - - + + + + Blacklisted Plugins (use <del> to remove): + + + + + + @@ -638,7 +652,7 @@ Please note that MO does identify itself as MO to the webserver, it's not lying tl;dr-version: If Nexus-features don't work, insert the current version number of NMM here and try again. - 009.009.009 + 009.009.009; Qt::AlignCenter diff --git a/src/shared/gameinfo.cpp b/src/shared/gameinfo.cpp index fd5072bf..6b53450d 100644 --- a/src/shared/gameinfo.cpp +++ b/src/shared/gameinfo.cpp @@ -62,36 +62,36 @@ void GameInfo::identifyMyGamesDirectory(const std::wstring &file) } -bool GameInfo::identifyGame(const std::wstring &omoDirectory, const std::wstring &searchPath) +bool GameInfo::identifyGame(const std::wstring &moDirectory, const std::wstring &searchPath) { if (OblivionInfo::identifyGame(searchPath)) { - s_Instance = new OblivionInfo(omoDirectory, searchPath); + s_Instance = new OblivionInfo(moDirectory, searchPath); } else if (Fallout3Info::identifyGame(searchPath)) { - s_Instance = new Fallout3Info(omoDirectory, searchPath); + s_Instance = new Fallout3Info(moDirectory, searchPath); } else if (FalloutNVInfo::identifyGame(searchPath)) { - s_Instance = new FalloutNVInfo(omoDirectory, searchPath); + s_Instance = new FalloutNVInfo(moDirectory, searchPath); } else if (SkyrimInfo::identifyGame(searchPath)) { - s_Instance = new SkyrimInfo(omoDirectory, searchPath); + s_Instance = new SkyrimInfo(moDirectory, searchPath); } return s_Instance != NULL; } -bool GameInfo::init(const std::wstring &omoDirectory, const std::wstring &gamePath) +bool GameInfo::init(const std::wstring &moDirectory, const std::wstring &gamePath) { if (s_Instance == NULL) { if (gamePath.length() == 0) { // search upward in the directory until a recognized game-binary is found - std::wstring searchPath(omoDirectory); - while (!identifyGame(omoDirectory, searchPath)) { + std::wstring searchPath(moDirectory); + while (!identifyGame(moDirectory, searchPath)) { size_t lastSep = searchPath.find_last_of(L"/\\"); if (lastSep == std::string::npos) { return false; } searchPath.erase(lastSep); } - } else if (!identifyGame(omoDirectory, gamePath)) { + } else if (!identifyGame(moDirectory, gamePath)) { return false; } } @@ -204,4 +204,4 @@ std::wstring GameInfo::getSpecialPath(LPCWSTR name) const return temp; } -} // namespace MOShared +} // namespace MOShared diff --git a/src/shared/skyriminfo.cpp b/src/shared/skyriminfo.cpp index 80cf4c80..8c6b79ef 100644 --- a/src/shared/skyriminfo.cpp +++ b/src/shared/skyriminfo.cpp @@ -33,8 +33,8 @@ along with Mod Organizer. If not, see . namespace MOShared { -SkyrimInfo::SkyrimInfo(const std::wstring &omoDirectory, const std::wstring &gameDirectory) - : GameInfo(omoDirectory, gameDirectory) +SkyrimInfo::SkyrimInfo(const std::wstring &moDirectory, const std::wstring &gameDirectory) + : GameInfo(moDirectory, gameDirectory) { identifyMyGamesDirectory(L"skyrim"); diff --git a/src/shared/skyriminfo.h b/src/shared/skyriminfo.h index 4760c38b..c5d31ff0 100644 --- a/src/shared/skyriminfo.h +++ b/src/shared/skyriminfo.h @@ -95,7 +95,7 @@ public: private: - SkyrimInfo(const std::wstring &omoDirectory, const std::wstring &gameDirectory); + SkyrimInfo(const std::wstring &moDirectory, const std::wstring &gameDirectory); static bool identifyGame(const std::wstring &searchPath); diff --git a/src/version.rc b/src/version.rc index 7e988897..16e006cf 100644 --- a/src/version.rc +++ b/src/version.rc @@ -1,7 +1,7 @@ #include "Winver.h" -#define VER_FILEVERSION 1,0,0,1 -#define VER_FILEVERSION_STR "1,0,0,1\0" +#define VER_FILEVERSION 1,0,2,0 +#define VER_FILEVERSION_STR "1,0,2,0\0" VS_VERSION_INFO VERSIONINFO FILEVERSION VER_FILEVERSION -- cgit v1.3.1 From 0a3169b808cf2b84ae7c77fd6cb0a7b0aa9a8df3 Mon Sep 17 00:00:00 2001 From: Tannin Date: Thu, 26 Sep 2013 19:10:44 +0200 Subject: - plugin tooltip now only lists the masters that aren't enabled (if any) --- src/pluginlist.cpp | 11 +++++------ src/pluginlist.h | 2 +- 2 files changed, 6 insertions(+), 7 deletions(-) (limited to 'src/pluginlist.cpp') diff --git a/src/pluginlist.cpp b/src/pluginlist.cpp index 6cb9bdf7..0ed0d7f9 100644 --- a/src/pluginlist.cpp +++ b/src/pluginlist.cpp @@ -608,12 +608,11 @@ void PluginList::testMasters() } for (auto iter = m_ESPs.begin(); iter != m_ESPs.end(); ++iter) { - iter->m_MasterUnset = false; + iter->m_MasterUnset.clear(); if (iter->m_Enabled) { for (auto master = iter->m_Masters.begin(); master != iter->m_Masters.end(); ++master) { if (enabledMasters.find(master->toLower()) == enabledMasters.end()) { - iter->m_MasterUnset = true; - break; + iter->m_MasterUnset.insert(*master); } } } @@ -648,7 +647,7 @@ QVariant PluginList::data(const QModelIndex &modelIndex, int role) const } break; } } else if ((role == Qt::DecorationRole) && (modelIndex.column() == 0)) { - if (m_ESPs[index].m_MasterUnset) { + if (m_ESPs[index].m_MasterUnset.size() > 0) { return QIcon(":/MO/gui/warning"); } else if (m_LockedOrder.find(m_ESPs[index].m_Name.toLower()) != m_LockedOrder.end()) { return QIcon(":/MO/gui/locked"); @@ -675,8 +674,8 @@ QVariant PluginList::data(const QModelIndex &modelIndex, int role) const return tr("This plugin can't be disabled (enforced by the game)"); } else { QString text = tr("Origin: %1").arg(m_ESPs[index].m_OriginName); - if (m_ESPs[index].m_MasterUnset) { - text += "\nDepends on the following masters: " + SetJoin(m_ESPs[index].m_Masters, ", "); + if (m_ESPs[index].m_MasterUnset.size() > 0) { + text += "\n" + tr("Missing Masters") + ": " + SetJoin(m_ESPs[index].m_MasterUnset, ", "); } return text; } diff --git a/src/pluginlist.h b/src/pluginlist.h index b1f1cc0e..3442a9f7 100644 --- a/src/pluginlist.h +++ b/src/pluginlist.h @@ -185,7 +185,7 @@ private: QString m_OriginName; bool m_IsMaster; std::set m_Masters; - mutable bool m_MasterUnset; + mutable std::set m_MasterUnset; }; friend bool ByName(const ESPInfo& LHS, const ESPInfo& RHS); -- cgit v1.3.1 From 47293827bbd92ce227e5188c10b66deb9f85d5bf Mon Sep 17 00:00:00 2001 From: Tannin Date: Sat, 28 Sep 2013 21:13:57 +0200 Subject: - download progress is now visible in task bar - esp-tooltip now lists all masters, highlighting the missing ones - python plugin will now report a problem if the path contains a semicolon - leak detection now (somewaht) works around the fact that we don't always get a stack trace - bugfix: mod meta-file is now reliably created if it was missing - bugfix: parser for nxm-links didn't handle numbers in the mod name - bugfix: small memory leak --- src/downloadmanager.cpp | 4 ++++ src/downloadmanager.h | 2 ++ src/mainwindow.cpp | 2 -- src/modinfo.cpp | 39 +++++++++++++++++---------------------- src/pluginlist.cpp | 7 ++++++- src/shared/directoryentry.cpp | 7 +++++-- src/shared/leaktrace.cpp | 37 ++++++++++++++++++++++++++++--------- src/shared/leaktrace.h | 4 ++-- src/version.rc | 4 ++-- 9 files changed, 66 insertions(+), 40 deletions(-) (limited to 'src/pluginlist.cpp') diff --git a/src/downloadmanager.cpp b/src/downloadmanager.cpp index c8f118f6..bbb34ccc 100644 --- a/src/downloadmanager.cpp +++ b/src/downloadmanager.cpp @@ -22,6 +22,7 @@ along with Mod Organizer. If not, see . #include "nxmurl.h" #include #include +#include #include "utility.h" #include "json.h" #include "selectiondialog.h" @@ -63,6 +64,7 @@ DownloadManager::DownloadInfo *DownloadManager::DownloadInfo::createNew(const Ne info->m_CurrentUrl = 0; info->m_Tries = AUTOMATIC_RETRIES; info->m_State = STATE_STARTED; + info->m_TaskProgressId = TaskProgressManager::instance().getId(); return info; } @@ -105,6 +107,7 @@ DownloadManager::DownloadInfo *DownloadManager::DownloadInfo::createFromMeta(con info->m_CurrentUrl = 0; info->m_Urls = metaFile.value("url", "").toString().split(";"); info->m_Tries = 0; + info->m_TaskProgressId = TaskProgressManager::instance().getId(); info->m_NexusInfo.m_Name = metaFile.value("name", 0).toString(); info->m_NexusInfo.m_ModName = metaFile.value("modName", "").toString(); info->m_NexusInfo.m_Version = metaFile.value("version", 0).toString(); @@ -805,6 +808,7 @@ void DownloadManager::downloadProgress(qint64 bytesReceived, qint64 bytesTotal) } int oldProgress = info->m_Progress; info->m_Progress = ((info->m_ResumePos + bytesReceived) * 100) / (info->m_ResumePos + bytesTotal); + TaskProgressManager::instance().updateProgress(info->m_TaskProgressId, bytesReceived, bytesTotal); if (oldProgress != info->m_Progress) { emit update(index); } diff --git a/src/downloadmanager.h b/src/downloadmanager.h index 92ba3143..0d49aa35 100644 --- a/src/downloadmanager.h +++ b/src/downloadmanager.h @@ -98,6 +98,8 @@ private: int m_Tries; bool m_ReQueried; + quint32 m_TaskProgressId; + NexusInfo m_NexusInfo; static DownloadInfo *createNew(const NexusInfo &nexusInfo, int modID, int fileID, const QStringList &URLs); diff --git a/src/mainwindow.cpp b/src/mainwindow.cpp index 601ec5c5..b722b388 100644 --- a/src/mainwindow.cpp +++ b/src/mainwindow.cpp @@ -149,7 +149,6 @@ MainWindow::MainWindow(const QString &exeName, QSettings &initSettings, QWidget m_GameInfo(new GameInfoImpl()) { ui->setupUi(this); - this->setWindowTitle(ToQString(GameInfo::instance().getGameName()).append(" Mod Organizer v").append(m_Updater.getVersion().canonicalString())); m_RefreshProgress = new QProgressBar(statusBar()); @@ -3194,7 +3193,6 @@ bool MainWindow::addCategories(QMenu *menu, int targetID) return childEnabled; } - void MainWindow::saveCategoriesFromMenu(QMenu *menu, int modRow) { ModInfo::Ptr modInfo = ModInfo::getByIndex(modRow); diff --git a/src/modinfo.cpp b/src/modinfo.cpp index 166c815b..7632a86e 100644 --- a/src/modinfo.cpp +++ b/src/modinfo.cpp @@ -350,8 +350,6 @@ ModInfoRegular::ModInfoRegular(const QDir &path, DirectoryEntry **directoryStruc ModInfoRegular::~ModInfoRegular() { try { - //TODO this may cause the meta-file and the directory to be - // re-created after a remove saveMeta(); } catch (const std::exception &e) { qCritical("failed to save meta information for \"%s\": %s", @@ -371,28 +369,25 @@ bool ModInfoRegular::isEmpty() const void ModInfoRegular::saveMeta() { - if (m_MetaInfoChanged) { - if (QFile::exists(absolutePath().append("/meta.ini"))) { - QSettings metaFile(absolutePath().append("/meta.ini"), QSettings::IniFormat); - if (metaFile.status() == QSettings::NoError) { - std::set temp = m_Categories; - temp.erase(m_PrimaryCategory); - metaFile.setValue("category", QString("%1").arg(m_PrimaryCategory) + "," + SetJoin(temp, ",")); - metaFile.setValue("newestVersion", m_NewestVersion.canonicalString()); - metaFile.setValue("version", m_Version.canonicalString()); - metaFile.setValue("modid", m_NexusID); - metaFile.setValue("notes", m_Notes); - metaFile.setValue("nexusDescription", m_NexusDescription); - metaFile.setValue("lastNexusQuery", m_LastNexusQuery.toString(Qt::ISODate)); - if (m_EndorsedState != ENDORSED_UNKNOWN) { - metaFile.setValue("endorsed", m_EndorsedState); - } - - } else { - reportError(tr("failed to write %1/meta.ini: %2").arg(absolutePath()).arg(metaFile.status())); + // only write meta data if the mod directory exists + if (m_MetaInfoChanged && QFile::exists(absolutePath())) { + QSettings metaFile(absolutePath().append("/meta.ini"), QSettings::IniFormat); + if (metaFile.status() == QSettings::NoError) { + std::set temp = m_Categories; + temp.erase(m_PrimaryCategory); + metaFile.setValue("category", QString("%1").arg(m_PrimaryCategory) + "," + SetJoin(temp, ",")); + metaFile.setValue("newestVersion", m_NewestVersion.canonicalString()); + metaFile.setValue("version", m_Version.canonicalString()); + metaFile.setValue("modid", m_NexusID); + metaFile.setValue("notes", m_Notes); + metaFile.setValue("nexusDescription", m_NexusDescription); + metaFile.setValue("lastNexusQuery", m_LastNexusQuery.toString(Qt::ISODate)); + if (m_EndorsedState != ENDORSED_UNKNOWN) { + metaFile.setValue("endorsed", m_EndorsedState); } + metaFile.sync(); // sync needs to be called to ensure the file is created } else { - qWarning("mod %s has no meta.ini at %s/meta.ini", m_Name.toUtf8().constData(), absolutePath().toUtf8().constData()); + reportError(tr("failed to write %1/meta.ini: %2").arg(absolutePath()).arg(metaFile.status())); } m_MetaInfoChanged = false; } diff --git a/src/pluginlist.cpp b/src/pluginlist.cpp index 0ed0d7f9..39cca6af 100644 --- a/src/pluginlist.cpp +++ b/src/pluginlist.cpp @@ -675,8 +675,13 @@ QVariant PluginList::data(const QModelIndex &modelIndex, int role) const } else { QString text = tr("Origin: %1").arg(m_ESPs[index].m_OriginName); if (m_ESPs[index].m_MasterUnset.size() > 0) { - text += "\n" + tr("Missing Masters") + ": " + SetJoin(m_ESPs[index].m_MasterUnset, ", "); + text += "
" + tr("Missing Masters") + ": " + SetJoin(m_ESPs[index].m_MasterUnset, ", ") + ""; } + std::set enabledMasters; + std::set_difference(m_ESPs[index].m_Masters.begin(), m_ESPs[index].m_Masters.end(), + m_ESPs[index].m_MasterUnset.begin(), m_ESPs[index].m_MasterUnset.end(), + std::inserter(enabledMasters, enabledMasters.end())); + text += "
" + tr("Enabled Masters") + ": " + SetJoin(enabledMasters, ", "); return text; } } else { diff --git a/src/shared/directoryentry.cpp b/src/shared/directoryentry.cpp index bd33fef6..8380181f 100644 --- a/src/shared/directoryentry.cpp +++ b/src/shared/directoryentry.cpp @@ -568,8 +568,9 @@ void DirectoryEntry::removeDirRecursive() for (auto iter = m_SubDirectories.begin(); iter != m_SubDirectories.end(); ++iter) { (*iter)->removeDirRecursive(); + delete *iter; } - m_SubDirectories.clear(); + m_SubDirectories.clear(); } void DirectoryEntry::removeDir(const std::wstring &path) @@ -578,8 +579,10 @@ void DirectoryEntry::removeDir(const std::wstring &path) if (pos == std::string::npos) { for (auto iter = m_SubDirectories.begin(); iter != m_SubDirectories.end(); ++iter) { if (_wcsicmp((*iter)->getName().c_str(), path.c_str()) == 0) { - (*iter)->removeDirRecursive(); + DirectoryEntry *entry = *iter; + entry->removeDirRecursive(); m_SubDirectories.erase(iter); + delete entry; break; } } diff --git a/src/shared/leaktrace.cpp b/src/shared/leaktrace.cpp index 0c618b68..83ed4fd0 100644 --- a/src/shared/leaktrace.cpp +++ b/src/shared/leaktrace.cpp @@ -3,6 +3,7 @@ #include #include #include +#include #include @@ -32,8 +33,18 @@ class StackData { friend bool operator==(const StackData &LHS, const StackData &RHS); friend bool operator<(const StackData &LHS, const StackData &RHS); public: - StackData() { + + StackData() + : m_FunctionName("Dummy"), m_CodeLine(0) + {} + StackData(const char *functionName, int line) { m_Count = ::CaptureStackBackTrace(FRAMES_TO_SKIP, FRAMES_TO_CAPTURE, m_Stack, &m_Hash); + m_FunctionName = functionName; + m_CodeLine = line; + if (m_Count == 0) { + // TODO in this case the hash doesn't seem to be set. This is of course not a good solution + m_Hash = reinterpret_cast(m_FunctionName) + m_CodeLine; + } } std::string toString() const { initDbgIfNecessary(); @@ -45,6 +56,8 @@ public: std::ostringstream stackStream; + stackStream << m_FunctionName << " [" << m_CodeLine << "]\n"; + for(unsigned int i = 0; i < m_Count; ++i) { DWORD64 displacement = 0; if (!::SymFromAddr(::GetCurrentProcess(), (DWORD64)m_Stack[i], &displacement, symbol)) { @@ -59,6 +72,8 @@ private: LPVOID m_Stack[FRAMES_TO_CAPTURE]; USHORT m_Count; ULONG m_Hash; + const char *m_FunctionName; + int m_CodeLine; }; bool operator==(const StackData &LHS, const StackData &RHS) { @@ -70,10 +85,9 @@ bool operator<(const StackData &LHS, const StackData &RHS) { } - static struct __TraceData { - void regTrace(void *pointer) { - m_Traces[reinterpret_cast(pointer)] = StackData(); + void regTrace(void *pointer, const char *functionName, int line) { + m_Traces[reinterpret_cast(pointer)] = StackData(functionName, line); } void deregTrace(void *pointer) { auto iter = m_Traces.find(reinterpret_cast(pointer)); @@ -83,14 +97,19 @@ static struct __TraceData { } ~__TraceData() { - std::map result; + std::map > result; for (auto iter = m_Traces.begin(); iter != m_Traces.end(); ++iter) { - result[iter->second] += 1; + result[iter->second].push_back(iter->first); } for (auto iter = result.begin(); iter != result.end(); ++iter) { printf("-----------------------------------\n" "%d objects not freed, allocated at:\n%s", - iter->second, iter->first.toString().c_str()); + iter->second.size(), iter->first.toString().c_str()); + printf("Addresses: "); + for (int i = 0; i < (std::min)(5, iter->second.size()); ++i) { + printf("%p, ", iter->second[i]); + } + printf("\n"); } } @@ -98,9 +117,9 @@ static struct __TraceData { } __trace; -void LeakTrace::TraceAlloc(void *ptr) +void LeakTrace::TraceAlloc(void *ptr, const char *functionName, int line) { - __trace.regTrace(ptr); + __trace.regTrace(ptr, functionName, line); } void LeakTrace::TraceDealloc(void *ptr) diff --git a/src/shared/leaktrace.h b/src/shared/leaktrace.h index 78764260..4985925e 100644 --- a/src/shared/leaktrace.h +++ b/src/shared/leaktrace.h @@ -4,14 +4,14 @@ namespace LeakTrace { -void TraceAlloc(void *ptr); +void TraceAlloc(void *ptr, const char *functionName, int line); void TraceDealloc(void *ptr); }; #ifdef TRACE_LEAKS -#define LEAK_TRACE LeakTrace::TraceAlloc(this) +#define LEAK_TRACE LeakTrace::TraceAlloc(this, __FUNCTION__, __LINE__) #define LEAK_UNTRACE LeakTrace::TraceDealloc(this) #else // TRACE_LEAKS diff --git a/src/version.rc b/src/version.rc index 16e006cf..16669011 100644 --- a/src/version.rc +++ b/src/version.rc @@ -1,7 +1,7 @@ #include "Winver.h" -#define VER_FILEVERSION 1,0,2,0 -#define VER_FILEVERSION_STR "1,0,2,0\0" +#define VER_FILEVERSION 1,0,4,0 +#define VER_FILEVERSION_STR "1,0,4,0\0" VS_VERSION_INFO VERSIONINFO FILEVERSION VER_FILEVERSION -- cgit v1.3.1 From cffd9eb4e21f0ddcddca68d8eb0f1c80c8ac6ae1 Mon Sep 17 00:00:00 2001 From: Tannin Date: Sat, 5 Oct 2013 14:20:48 +0200 Subject: - hook.dll now doesn't inject to certain applications (currently steam, chrome and firefox) - versioning system improved. Will now report "downgrades" for mods and support a different versioning system (requires manual switch) - updates can now be ignored until a new version is uploaded - new splash screen - bugfix: a few memory leaks (shouldn't account for much) - bugfix: result of GetModuleHandle wasn't zero-terminated in some cases --- src/categories.cpp | 7 ++++ src/categories.h | 4 ++ src/downloadmanager.cpp | 1 + src/installationmanager.cpp | 6 +-- src/main.cpp | 97 ++++++++++++++++++++++++-------------------- src/mainwindow.cpp | 87 +++++++++++++++++++++++++++------------ src/mainwindow.h | 4 ++ src/modinfo.cpp | 30 ++++++++++++-- src/modinfo.h | 49 ++++++++++++++++++++++ src/modinfodialog.cpp | 11 +---- src/modlist.cpp | 34 ++++++++++------ src/modlistsortproxy.cpp | 2 +- src/modlistview.cpp | 4 +- src/nexusinterface.cpp | 10 +++++ src/nexusinterface.h | 1 + src/nxmaccessmanager.cpp | 8 ++++ src/nxmaccessmanager.h | 2 + src/organizer.pro | 7 +++- src/pluginlist.cpp | 4 ++ src/pluginlist.h | 2 + src/profile.cpp | 3 +- src/selfupdater.cpp | 2 - src/shared/gameinfo.cpp | 7 ++++ src/shared/gameinfo.h | 4 +- src/shared/leaktrace.cpp | 1 + src/shared/shared.pro | 10 ++++- src/spawn.cpp | 4 +- src/spawn.h | 4 +- src/splash.png | Bin 103422 -> 260807 bytes 29 files changed, 296 insertions(+), 109 deletions(-) (limited to 'src/pluginlist.cpp') diff --git a/src/categories.cpp b/src/categories.cpp index 62ba3ca5..c084c238 100644 --- a/src/categories.cpp +++ b/src/categories.cpp @@ -43,6 +43,7 @@ QString CategoryFactory::categoriesFilePath() CategoryFactory::CategoryFactory() { + atexit(&cleanup); reset(); QFile categoryFile(categoriesFilePath()); @@ -124,6 +125,12 @@ void CategoryFactory::setParents() } } +void CategoryFactory::cleanup() +{ + delete s_Instance; + s_Instance = NULL; +} + void CategoryFactory::saveCategories() { diff --git a/src/categories.h b/src/categories.h index 75698149..31fccd6d 100644 --- a/src/categories.h +++ b/src/categories.h @@ -180,6 +180,8 @@ private: void setParents(); + static void cleanup(); + private: static CategoryFactory *s_Instance; @@ -188,6 +190,8 @@ private: std::map m_IDMap; std::map m_NexusMap; +private: + }; diff --git a/src/downloadmanager.cpp b/src/downloadmanager.cpp index bbb34ccc..b965d598 100644 --- a/src/downloadmanager.cpp +++ b/src/downloadmanager.cpp @@ -162,6 +162,7 @@ DownloadManager::~DownloadManager() for (QVector::iterator iter = m_ActiveDownloads.begin(); iter != m_ActiveDownloads.end(); ++iter) { delete *iter; } + m_ActiveDownloads.clear(); } diff --git a/src/installationmanager.cpp b/src/installationmanager.cpp index 378eb38a..87efecf1 100644 --- a/src/installationmanager.cpp +++ b/src/installationmanager.cpp @@ -46,6 +46,7 @@ along with Mod Organizer. If not, see . #include #include #include +#include using namespace MOBase; @@ -678,8 +679,7 @@ bool InstallationManager::install(const QString &fileName, GuessedValue this->m_CurrentArchive->close(); }); - DirectoryTree *filesTree = archiveOpen ? createFilesTree() : NULL; - + QScopedPointer filesTree(archiveOpen ? createFilesTree() : NULL); IPluginInstaller::EInstallResult installResult = IPluginInstaller::RESULT_NOTATTEMPTED; std::sort(m_Installers.begin(), m_Installers.end(), [] (IPluginInstaller *LHS, IPluginInstaller *RHS) { @@ -704,7 +704,7 @@ bool InstallationManager::install(const QString &fileName, GuessedValue (filesTree != NULL) && (installer->isArchiveSupported(*filesTree))) { installResult = installerSimple->install(modName, *filesTree, version, modID); if (installResult == IPluginInstaller::RESULT_SUCCESS) { - mapToArchive(filesTree); + mapToArchive(filesTree.data()); // the simple installer only prepares the installation, the rest works the same for all installers if (!doInstall(modName, modID, version, newestVersion, categoryID)) { installResult = IPluginInstaller::RESULT_FAILED; diff --git a/src/main.cpp b/src/main.cpp index 5a694121..c4431ac4 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -18,6 +18,11 @@ along with Mod Organizer. If not, see . */ +#ifdef LEAK_CHECK_WITH_VLD +#include +#include +#endif // LEAK_CHECK_WITH_VLD + #include #include #include @@ -430,61 +435,65 @@ int main(int argc, char *argv[]) application.setStyleFile(settings.value("Settings/style", "").toString()); - // set up main window and its data structures - MainWindow mainWindow(argv[0], settings); - QObject::connect(&mainWindow, SIGNAL(styleChanged(QString)), &application, SLOT(setStyleFile(QString))); - QObject::connect(&instance, SIGNAL(messageSent(QString)), &mainWindow, SLOT(externalMessage(QString))); + int res = 1; + { // scope to control lifetime of mainwindow + // set up main window and its data structures + MainWindow mainWindow(argv[0], settings); + QObject::connect(&mainWindow, SIGNAL(styleChanged(QString)), &application, SLOT(setStyleFile(QString))); + QObject::connect(&instance, SIGNAL(messageSent(QString)), &mainWindow, SLOT(externalMessage(QString))); - mainWindow.setExecutablesList(executablesList); - mainWindow.readSettings(); + mainWindow.setExecutablesList(executablesList); + mainWindow.readSettings(); - QString selectedProfileName = QString::fromUtf8(settings.value("selected_profile", "").toByteArray()); + QString selectedProfileName = QString::fromUtf8(settings.value("selected_profile", "").toByteArray()); - { // see if there is a profile on the command line - int profileIndex = arguments.indexOf("-p", 1); - if ((profileIndex != -1) && (profileIndex < arguments.size() - 1)) { - qDebug("profile overwritten on command line"); - selectedProfileName = arguments.at(profileIndex + 1); + { // see if there is a profile on the command line + int profileIndex = arguments.indexOf("-p", 1); + if ((profileIndex != -1) && (profileIndex < arguments.size() - 1)) { + qDebug("profile overwritten on command line"); + selectedProfileName = arguments.at(profileIndex + 1); + } + arguments.removeAt(profileIndex); + arguments.removeAt(profileIndex); + } + qDebug("configured profile: %s", qPrintable(selectedProfileName)); + + // if we have a command line parameter, it is either a nxm link or + // a binary to start + if ((arguments.size() > 1) && (!isNxmLink(arguments.at(1)))) { + QString exeName = arguments.at(1); + qDebug("starting %s from command line", qPrintable(exeName)); + arguments.removeFirst(); // remove application name (ModOrganizer.exe) + arguments.removeFirst(); // remove binary name + // pass the remaining parameters to the binary + mainWindow.spawnProgram(exeName, arguments.join(" "), selectedProfileName, QDir()); + return 0; } - arguments.removeAt(profileIndex); - arguments.removeAt(profileIndex); - } - qDebug("configured profile: %s", qPrintable(selectedProfileName)); - - // if we have a command line parameter, it is either a nxm link or - // a binary to start - if ((arguments.size() > 1) && (!isNxmLink(arguments.at(1)))) { - QString exeName = arguments.at(1); - qDebug("starting %s from command line", qPrintable(exeName)); - arguments.removeFirst(); // remove application name (ModOrganizer.exe) - arguments.removeFirst(); // remove binary name - // pass the remaining parameters to the binary - mainWindow.spawnProgram(exeName, arguments.join(" "), selectedProfileName, QDir()); - return 0; - } - mainWindow.createFirstProfile(); + mainWindow.createFirstProfile(); - if (selectedProfileName.length() != 0) { - if (!mainWindow.setCurrentProfile(selectedProfileName)) { + if (selectedProfileName.length() != 0) { + if (!mainWindow.setCurrentProfile(selectedProfileName)) { + mainWindow.setCurrentProfile(1); + qWarning("failed to set profile: %s", + selectedProfileName.toUtf8().constData()); + } + } else { mainWindow.setCurrentProfile(1); - qWarning("failed to set profile: %s", - selectedProfileName.toUtf8().constData()); } - } else { - mainWindow.setCurrentProfile(1); - } - qDebug("displaying main window"); - mainWindow.show(); + qDebug("displaying main window"); + mainWindow.show(); - if ((arguments.size() > 1) && - (isNxmLink(arguments.at(1)))) { - qDebug("starting download from command line: %s", qPrintable(arguments.at(1))); - mainWindow.externalMessage(arguments.at(1)); + if ((arguments.size() > 1) && + (isNxmLink(arguments.at(1)))) { + qDebug("starting download from command line: %s", qPrintable(arguments.at(1))); + mainWindow.externalMessage(arguments.at(1)); + } + splash.finish(&mainWindow); + res = application.exec(); } - splash.finish(&mainWindow); - return application.exec(); + return res; } catch (const std::exception &e) { reportError(e.what()); return 1; diff --git a/src/mainwindow.cpp b/src/mainwindow.cpp index 24772db1..1ea35d74 100644 --- a/src/mainwindow.cpp +++ b/src/mainwindow.cpp @@ -139,8 +139,8 @@ MainWindow::MainWindow(const QString &exeName, QSettings &initSettings, QWidget : QMainWindow(parent), ui(new Ui::MainWindow), m_Tutorial(this, "MainWindow"), m_ExeName(exeName), m_OldProfileIndex(-1), m_DirectoryStructure(new DirectoryEntry(L"data", NULL, 0)), - m_ModList(NexusInterface::instance()), m_ModListGroupingProxy(NULL), m_ModListSortProxy(NULL), - m_OldExecutableIndex(-1), m_GamePath(ToQString(GameInfo::instance().getGameDirectory())), + m_ModList(this), m_ModListGroupingProxy(NULL), m_ModListSortProxy(NULL), + m_PluginList(this), m_OldExecutableIndex(-1), m_GamePath(ToQString(GameInfo::instance().getGameDirectory())), m_DownloadManager(NexusInterface::instance(), this), m_InstallationManager(this), m_Translator(NULL), m_TranslatorQt(NULL), m_Updater(NexusInterface::instance(), this), m_CategoryFactory(CategoryFactory::instance()), @@ -149,7 +149,7 @@ MainWindow::MainWindow(const QString &exeName, QSettings &initSettings, QWidget m_GameInfo(new GameInfoImpl()) { ui->setupUi(this); - this->setWindowTitle(ToQString(GameInfo::instance().getGameName()).append(" Mod Organizer v").append(m_Updater.getVersion().canonicalString())); + this->setWindowTitle(ToQString(GameInfo::instance().getGameName()) + " Mod Organizer v" + m_Updater.getVersion().displayString()); m_RefreshProgress = new QProgressBar(statusBar()); m_RefreshProgress->setTextVisible(true); @@ -255,7 +255,7 @@ MainWindow::MainWindow(const QString &exeName, QSettings &initSettings, QWidget connect(&m_Updater, SIGNAL(updateAvailable()), this, SLOT(updateAvailable())); connect(&m_Updater, SIGNAL(motdAvailable(QString)), this, SLOT(motdReceived(QString))); - connect(ExitProxy::instance(), SIGNAL(exit()), this, SLOT(close())); +// connect(ExitProxy::instance(), SIGNAL(exit()), this, SLOT(close())); connect(NexusInterface::instance()->getAccessManager(), SIGNAL(loginSuccessful(bool)), this, SLOT(loginSuccessful(bool))); connect(NexusInterface::instance()->getAccessManager(), SIGNAL(loginFailed(QString)), this, SLOT(loginFailed(QString))); @@ -412,7 +412,7 @@ void MainWindow::actionToToolButton(QAction *&sourceAction) button->setToolButtonStyle(ui->toolBar->toolButtonStyle()); button->setToolTip(sourceAction->toolTip()); button->setShortcut(sourceAction->shortcut()); - QMenu *buttonMenu = new QMenu(sourceAction->text()); + QMenu *buttonMenu = new QMenu(sourceAction->text(), button); button->setMenu(buttonMenu); QAction *newAction = ui->toolBar->insertWidget(sourceAction, button); newAction->setObjectName(sourceAction->objectName()); @@ -1499,6 +1499,8 @@ void MainWindow::updateTo(QTreeWidgetItem *subTree, const std::wstring &director updateTo(directoryChild, temp.str(), **current, conflictsOnly); if (directoryChild->childCount() != 0) { subTree->addChild(directoryChild); + } else { + delete directoryChild; } } } @@ -3069,7 +3071,6 @@ void MainWindow::openExplorer_clicked() ::ShellExecuteW(NULL, L"explore", ToWString(modInfo->absolutePath()).c_str(), NULL, NULL, SW_SHOWNORMAL); } - void MainWindow::information_clicked() { try { @@ -3079,7 +3080,6 @@ void MainWindow::information_clicked() } } - void MainWindow::syncOverwrite() { ModInfo::Ptr modInfo = ModInfo::getByIndex(m_ContextRow); @@ -3091,7 +3091,6 @@ void MainWindow::syncOverwrite() } } - void MainWindow::createModFromOverwrite() { GuessedValue name; @@ -3125,14 +3124,12 @@ void MainWindow::createModFromOverwrite() refreshModList(); } - void MainWindow::cancelModListEditor() { ui->modList->setEnabled(false); ui->modList->setEnabled(true); } - void MainWindow::on_modList_doubleClicked(const QModelIndex &index) { if (!index.isValid()) { @@ -3155,7 +3152,6 @@ void MainWindow::on_modList_doubleClicked(const QModelIndex &index) } } - bool MainWindow::addCategories(QMenu *menu, int targetID) { ModInfo::Ptr modInfo = ModInfo::getByIndex(m_ContextRow); @@ -3210,7 +3206,6 @@ void MainWindow::saveCategoriesFromMenu(QMenu *menu, int modRow) } } - void MainWindow::saveCategories() { QMenu *menu = qobject_cast(sender()); @@ -3254,8 +3249,6 @@ void MainWindow::saveCategories() refreshFilters(); } - - void MainWindow::savePrimaryCategory() { QMenu *menu = qobject_cast(sender()); @@ -3280,7 +3273,6 @@ void MainWindow::savePrimaryCategory() } } - void MainWindow::checkModsForUpdates() { statusBar()->show(); @@ -3298,6 +3290,45 @@ void MainWindow::checkModsForUpdates() } } +void MainWindow::changeVersioningScheme() { + if (QMessageBox::question(this, tr("Continue?"), + tr("This will try to change the versioning scheme so that the newest version is interpreted as an update to " + "the installed version."), + QMessageBox::Yes | QMessageBox::Cancel) == QMessageBox::Yes) { + + ModInfo::Ptr info = ModInfo::getByIndex(m_ContextRow); + + bool success = false; + + static VersionInfo::VersionScheme schemes[] = { VersionInfo::SCHEME_REGULAR, VersionInfo::SCHEME_DECIMALMARK, VersionInfo::SCHEME_NUMBERSANDLETTERS }; + + for (int i = 0; i < sizeof(schemes) / sizeof(VersionInfo::VersionScheme) && !success; ++i) { + VersionInfo verOld(info->getVersion().canonicalString(), schemes[i]); + VersionInfo verNew(info->getNewestVersion().canonicalString(), schemes[i]); + if (verOld < verNew) { + info->setVersion(verOld); + info->setNewestVersion(verNew); + success = true; + } + } + if (!success) { + QMessageBox::information(this, tr("Sorry"), + tr("I don't know a versioning scheme where %1 is newer than %2.").arg(info->getNewestVersion().canonicalString()).arg(info->getVersion().canonicalString()), + QMessageBox::Ok); + } + } +} + +void MainWindow::ignoreUpdate() { + ModInfo::Ptr info = ModInfo::getByIndex(m_ContextRow); + info->ignoreUpdate(true); +} + +void MainWindow::unignoreUpdate() +{ + ModInfo::Ptr info = ModInfo::getByIndex(m_ContextRow); + info->ignoreUpdate(false); +} void MainWindow::addPrimaryCategoryCandidates(QMenu *primaryCategoryMenu, ModInfo::Ptr info) { @@ -3319,7 +3350,6 @@ void MainWindow::addPrimaryCategoryCandidates(QMenu *primaryCategoryMenu, ModInf } } - void MainWindow::addPrimaryCategoryCandidates() { QMenu *menu = qobject_cast(sender()); @@ -3333,7 +3363,6 @@ void MainWindow::addPrimaryCategoryCandidates() addPrimaryCategoryCandidates(menu, modInfo); } - void MainWindow::enableVisibleMods() { if (QMessageBox::question(NULL, tr("Confirm"), tr("Really enable all visible mods?"), @@ -3342,7 +3371,6 @@ void MainWindow::enableVisibleMods() } } - void MainWindow::disableVisibleMods() { if (QMessageBox::question(NULL, tr("Confirm"), tr("Really disable all visible mods?"), @@ -3351,7 +3379,6 @@ void MainWindow::disableVisibleMods() } } - void MainWindow::exportModListCSV() { SelectionDialog selection(tr("Choose what to export")); @@ -3406,7 +3433,6 @@ void MainWindow::exportModListCSV() } } - void addMenuAsPushButton(QMenu *menu, QMenu *subMenu) { QPushButton *pushBtn = new QPushButton(subMenu->title()); @@ -3416,13 +3442,13 @@ void addMenuAsPushButton(QMenu *menu, QMenu *subMenu) menu->addAction(action); } - void MainWindow::on_modList_customContextMenuRequested(const QPoint &pos) { try { QTreeView *modList = findChild("modList"); - m_ContextRow = mapToModel(&m_ModList, modList->indexAt(pos)).row(); + QModelIndex index = mapToModel(&m_ModList, modList->indexAt(pos)); + m_ContextRow = index.row(); QMenu menu; @@ -3461,6 +3487,17 @@ void MainWindow::on_modList_customContextMenuRequested(const QPoint &pos) connect(primaryCategoryMenu, SIGNAL(aboutToHide()), this, SLOT(savePrimaryCategory())); addMenuAsPushButton(&menu, primaryCategoryMenu); + menu.addSeparator(); + if (info->downgradeAvailable()) { + menu.addAction(tr("Change versioning scheme"), this, SLOT(changeVersioningScheme())); + } + if (info->updateIgnored()) { + menu.addAction(tr("Un-ignore update"), this, SLOT(unignoreUpdate())); + } else { + menu.addAction(tr("Ignore update"), this, SLOT(ignoreUpdate())); + } + menu.addSeparator(); + menu.addAction(tr("Rename Mod..."), this, SLOT(renameMod_clicked())); menu.addAction(tr("Remove Mod..."), this, SLOT(removeMod_clicked())); menu.addAction(tr("Reinstall Mod"), this, SLOT(reinstallMod_clicked())); @@ -4207,9 +4244,9 @@ void MainWindow::on_actionEndorseMO_triggered() void MainWindow::updateDownloadListDelegate() { if (ui->compactBox->isChecked()) { - ui->downloadView->setItemDelegate(new DownloadListWidgetCompactDelegate(&m_DownloadManager, ui->downloadView)); + ui->downloadView->setItemDelegate(new DownloadListWidgetCompactDelegate(&m_DownloadManager, ui->downloadView, ui->downloadView)); } else { - ui->downloadView->setItemDelegate(new DownloadListWidgetDelegate(&m_DownloadManager, ui->downloadView)); + ui->downloadView->setItemDelegate(new DownloadListWidgetDelegate(&m_DownloadManager, ui->downloadView, ui->downloadView)); } DownloadListSortProxy *sortProxy = new DownloadListSortProxy(&m_DownloadManager, ui->downloadView); @@ -4267,7 +4304,7 @@ void MainWindow::nxmUpdatesAvailable(const std::vector &modIDs, QVariant us } else { std::vector info = ModInfo::getByModID(result["id"].toInt()); for (auto iter = info.begin(); iter != info.end(); ++iter) { - (*iter)->setNewestVersion(VersionInfo(result["version"].toString())); + (*iter)->setNewestVersion(result["version"].toString()); (*iter)->setNexusDescription(result["description"].toString()); if (NexusInterface::instance()->getAccessManager()->loggedIn() && result.contains("voted_by_user")) { diff --git a/src/mainwindow.h b/src/mainwindow.h index 80dca172..dfec5f49 100644 --- a/src/mainwindow.h +++ b/src/mainwindow.h @@ -466,6 +466,10 @@ private slots: void removeFromToolbar(); void overwriteClosed(int); + void changeVersioningScheme(); + void ignoreUpdate(); + void unignoreUpdate(); + private slots: // ui slots // actions void on_actionAdd_Profile_triggered(); diff --git a/src/modinfo.cpp b/src/modinfo.cpp index 7632a86e..1479f7b4 100644 --- a/src/modinfo.cpp +++ b/src/modinfo.cpp @@ -303,10 +303,11 @@ ModInfoRegular::ModInfoRegular(const QDir &path, DirectoryEntry **directoryStruc QString metaFileName = path.absoluteFilePath("meta.ini"); QSettings metaFile(metaFileName, QSettings::IniFormat); - m_Notes = metaFile.value("notes", "").toString(); - m_NexusID = metaFile.value("modid", -1).toInt(); + m_Notes = metaFile.value("notes", "").toString(); + m_NexusID = metaFile.value("modid", -1).toInt(); m_Version.parse(metaFile.value("version", "").toString()); - m_NewestVersion = metaFile.value("newestVersion", "").toString(); + m_NewestVersion = metaFile.value("newestVersion", "").toString(); + m_IgnoredVersion = metaFile.value("ignoredVersion", "").toString(); m_InstallationFile = metaFile.value("installationFile", "").toString(); m_NexusDescription = metaFile.value("nexusDescription", "").toString(); m_LastNexusQuery = QDateTime::fromString(metaFile.value("lastNexusQuery", "").toString(), Qt::ISODate); @@ -377,6 +378,7 @@ void ModInfoRegular::saveMeta() temp.erase(m_PrimaryCategory); metaFile.setValue("category", QString("%1").arg(m_PrimaryCategory) + "," + SetJoin(temp, ",")); metaFile.setValue("newestVersion", m_NewestVersion.canonicalString()); + metaFile.setValue("ignoredVersion", m_IgnoredVersion.canonicalString()); metaFile.setValue("version", m_Version.canonicalString()); metaFile.setValue("modid", m_NexusID); metaFile.setValue("notes", m_Notes); @@ -396,10 +398,22 @@ void ModInfoRegular::saveMeta() bool ModInfoRegular::updateAvailable() const { + if (m_IgnoredVersion.isValid() && (m_IgnoredVersion == m_NewestVersion)) { + return false; + } return m_NewestVersion.isValid() && (m_Version < m_NewestVersion); } +bool ModInfoRegular::downgradeAvailable() const +{ + if (m_IgnoredVersion.isValid() && (m_IgnoredVersion == m_NewestVersion)) { + return false; + } + return m_NewestVersion.isValid() && (m_NewestVersion < m_Version); +} + + void ModInfoRegular::nxmDescriptionAvailable(int, QVariant, QVariant resultData) { QVariantMap result = resultData.toMap(); @@ -576,6 +590,16 @@ QString ModInfoRegular::absolutePath() const return m_Path; } +void ModInfoRegular::ignoreUpdate(bool ignore) +{ + if (ignore) { + m_IgnoredVersion = m_NewestVersion; + } else { + m_IgnoredVersion.clear(); + } + m_MetaInfoChanged = true; +} + std::vector ModInfoRegular::getFlags() const { diff --git a/src/modinfo.h b/src/modinfo.h index 7e217de7..3b83d207 100644 --- a/src/modinfo.h +++ b/src/modinfo.h @@ -192,6 +192,22 @@ public: **/ virtual bool updateAvailable() const = 0; + /** + * @return true if the update currently available is ignored + */ + virtual bool updateIgnored() const = 0; + + /** + * @brief test if the "newest" version of the mod is older than the installed version + * + * test if there is a newer version of the mod. This does NOT cause + * information to be retrieved from the nexus, it will only test version information already + * available locally. Use checkAllForUpdate() to update this version information + * + * @return true if the newest version is older than the installed one + **/ + virtual bool downgradeAvailable() const = 0; + /** * @brief request an update of nexus description for this mod. * @@ -309,6 +325,11 @@ public: **/ virtual MOBase::VersionInfo getNewestVersion() const = 0; + /** + * @brief ignore the newest version for updates + */ + virtual void ignoreUpdate(bool ignore) = 0; + /** * @brief getter for the nexus mod id * @@ -494,6 +515,22 @@ public: **/ bool updateAvailable() const; + /** + * @return true if the current update is being ignored + */ + virtual bool updateIgnored() const { return m_IgnoredVersion == m_NewestVersion; } + + /** + * @brief test if there is a newer version of the mod + * + * test if there is a newer version of the mod. This does NOT cause + * information to be retrieved from the nexus, it will only test version information already + * available locally. Use checkAllForUpdate() to update this version information + * + * @return true if there is a newer version + **/ + bool downgradeAvailable() const; + /** * @brief request an update of nexus description for this mod. * @@ -620,6 +657,11 @@ public: **/ MOBase::VersionInfo getNewestVersion() const { return m_NewestVersion; } + /** + * @brief ignore the newest version for updates + */ + void ignoreUpdate(bool ignore); + /** * @brief getter for the installation file * @@ -746,6 +788,7 @@ private: bool m_MetaInfoChanged; MOBase::VersionInfo m_NewestVersion; + MOBase::VersionInfo m_IgnoredVersion; EEndorsedState m_EndorsedState; @@ -767,10 +810,13 @@ class ModInfoBackup : public ModInfoRegular public: virtual bool updateAvailable() const { return false; } + virtual bool updateIgnored() const { return false; } + virtual bool downgradeAvailable() const { return false; } virtual bool updateNXMInfo() { return false; } virtual void setNexusID(int) {} virtual void endorse(bool) {} virtual int getFixedPriority() const { return -1; } + virtual void ignoreUpdate(bool) {} virtual bool canBeUpdated() const { return false; } virtual bool canBeEnabled() const { return false; } virtual std::vector getIniTweaks() const { return std::vector(); } @@ -798,12 +844,15 @@ class ModInfoOverwrite : public ModInfo public: virtual bool updateAvailable() const { return false; } + virtual bool updateIgnored() const { return false; } + virtual bool downgradeAvailable() const { return false; } virtual bool updateNXMInfo() { return false; } virtual void setCategory(int, bool) {} virtual bool setName(const QString&) { return false; } virtual void setNotes(const QString&) {} virtual void setNexusID(int) {} virtual void setNewestVersion(const MOBase::VersionInfo&) {} + virtual void ignoreUpdate(bool) {} virtual void setNexusDescription(const QString&) {} virtual void setIsEndorsed(bool) {} virtual void setNeverEndorse() {} diff --git a/src/modinfodialog.cpp b/src/modinfodialog.cpp index 75e7e499..b4ae57ea 100644 --- a/src/modinfodialog.cpp +++ b/src/modinfodialog.cpp @@ -76,7 +76,6 @@ ModInfoDialog::ModInfoDialog(ModInfo::Ptr modInfo, const DirectoryEntry *directo m_UTF8Codec = QTextCodec::codecForName("utf-8"); QListWidget *textFileList = findChild("textFileList"); - QListWidget *iniFileList = findChild("iniFileList"); QListWidget *iniTweaksList = findChild("iniTweaksList"); QListWidget *activeESPList = findChild("activeESPList"); QListWidget *inactiveESPList = findChild("inactiveESPList"); @@ -707,7 +706,7 @@ QString ModInfoDialog::getFileCategory(int categoryID) void ModInfoDialog::updateVersionColor() { // QPalette versionColor; - if (m_ModInfo->getVersion() < m_ModInfo->getNewestVersion()) { + if (m_ModInfo->getVersion() != m_ModInfo->getNewestVersion()) { ui->versionEdit->setStyleSheet("color: red"); // versionColor.setColor(QPalette::Text, Qt::red); ui->versionEdit->setToolTip(tr("Current Version: %1").arg(m_ModInfo->getNewestVersion().canonicalString())); @@ -758,13 +757,7 @@ void ModInfoDialog::modDetailsUpdated(bool success) ui->descriptionView->setHtml(tr("(description incomplete, please visit nexus)")); } - QString version = m_ModInfo->getNewestVersion().canonicalString(); - - if (!version.isEmpty()) { - m_ModInfo->setNewestVersion(version); - - updateVersionColor(); - } + updateVersionColor(); } } diff --git a/src/modlist.cpp b/src/modlist.cpp index b5a7182e..7367b2ae 100644 --- a/src/modlist.cpp +++ b/src/modlist.cpp @@ -143,13 +143,16 @@ QVariant ModList::data(const QModelIndex &modelIndex, int role) const } else if (column == COL_NAME) { return modInfo->name(); } else if (column == COL_VERSION) { - QString version = modInfo->getVersion().canonicalString(); - if (version.isEmpty() && modInfo->canBeUpdated()) { - version = "?"; - } else if (version[0] == 'd') { - version.remove(0, 1); + VersionInfo verInfo = modInfo->getVersion(); + if (role == Qt::EditRole) { + return verInfo.canonicalString(); + } else { + QString version = verInfo.displayString(); + if (version.isEmpty() && modInfo->canBeUpdated()) { + version = "?"; + } + return version; } - return version; } else if (column == COL_PRIORITY) { int priority = modInfo->getFixedPriority(); if (priority != INT_MIN) { @@ -241,17 +244,18 @@ QVariant ModList::data(const QModelIndex &modelIndex, int role) const result.setItalic(true); } } else if (column == COL_VERSION) { - if (modInfo->updateAvailable()) { + if (modInfo->updateAvailable() || modInfo->downgradeAvailable()) { result.setWeight(QFont::Bold); } } return result; } else if (role == Qt::DecorationRole) { if (column == COL_VERSION) { - if (modInfo->updateAvailable() && - modInfo->getNewestVersion().isValid()) { + if (modInfo->updateAvailable()) { return QIcon(":/MO/gui/update_available"); - } else if (modInfo->getVersion().isVersionDate()) { + } else if (modInfo->downgradeAvailable()) { + return QIcon(":/MO/gui/warning"); + } else if (modInfo->getVersion().scheme() == VersionInfo::SCHEME_DATE) { return QIcon(":/MO/gui/version_date"); } } @@ -264,7 +268,7 @@ QVariant ModList::data(const QModelIndex &modelIndex, int role) const } else if (column == COL_VERSION) { if (!modInfo->getNewestVersion().isValid()) { return QVariant(); - } else if (modInfo->updateAvailable()) { + } else if (modInfo->updateAvailable() || modInfo->downgradeAvailable()) { return QBrush(Qt::red); } else { return QBrush(Qt::darkGreen); @@ -291,7 +295,13 @@ QVariant ModList::data(const QModelIndex &modelIndex, int role) const return QString(); } } else if (column == COL_VERSION) { - return tr("installed version: %1, newest version: %2").arg(modInfo->getVersion().canonicalString()).arg(modInfo->getNewestVersion().canonicalString()); + QString text = tr("installed version: %1, newest version: %2").arg(modInfo->getVersion().displayString()).arg(modInfo->getNewestVersion().displayString()); + if (modInfo->downgradeAvailable()) { + text += "
" + tr("The newest version on Nexus seems to be older than the one you have installed. This could either mean the version you have has been withdrawn " + "(i.e. due to a bug) or the author uses a non-standard versioning scheme and that newest version is actually newer. " + "Either way you may want to \"upgrade\"."); + } + return text; } else if (column == COL_CATEGORY) { const std::set &categories = modInfo->getCategories(); std::wostringstream categoryString; diff --git a/src/modlistsortproxy.cpp b/src/modlistsortproxy.cpp index 53c03c6a..c7c3ab28 100644 --- a/src/modlistsortproxy.cpp +++ b/src/modlistsortproxy.cpp @@ -211,7 +211,7 @@ bool ModListSortProxy::filterMatches(ModInfo::Ptr info, bool enabled) const if (enabled) return false; } break; case CategoryFactory::CATEGORY_SPECIAL_UPDATEAVAILABLE: { - if (!info->updateAvailable()) return false; + if (!info->updateAvailable() && !info->downgradeAvailable()) return false; } break; case CategoryFactory::CATEGORY_SPECIAL_NOCATEGORY: { if (info->getCategories().size() > 0) return false; diff --git a/src/modlistview.cpp b/src/modlistview.cpp index 44228d5b..1a4f6266 100644 --- a/src/modlistview.cpp +++ b/src/modlistview.cpp @@ -4,7 +4,7 @@ #include -class ModListViewStyle: public QProxyStyle{ +class ModListViewStyle: public QProxyStyle { public: ModListViewStyle(QStyle *style, int indentation); @@ -37,7 +37,7 @@ void ModListViewStyle::drawPrimitive(PrimitiveElement element, const QStyleOptio ModListView::ModListView(QWidget *parent) : QTreeView(parent) { - setStyle(new ModListViewStyle(style(), indentation())); +// setStyle(new ModListViewStyle(style(), indentation())); } void ModListView::dragEnterEvent(QDragEnterEvent *event) diff --git a/src/nexusinterface.cpp b/src/nexusinterface.cpp index cd78ca4c..bee0bb44 100644 --- a/src/nexusinterface.cpp +++ b/src/nexusinterface.cpp @@ -68,6 +68,7 @@ void NexusBridge::nxmDescriptionAvailable(int modID, QVariant userData, QVariant std::set::iterator iter = m_RequestIDs.find(requestID); if (iter != m_RequestIDs.end()) { m_RequestIDs.erase(iter); + emit descriptionAvailable(modID, userData, resultData); } } @@ -142,6 +143,7 @@ QAtomicInt NexusInterface::NXMRequestInfo::s_NextID(0); NexusInterface::NexusInterface() : m_NMMVersion() { + atexit(&cleanup); m_AccessManager = new NXMAccessManager(this); m_DiskCache = new QNetworkDiskCache(this); @@ -149,6 +151,13 @@ NexusInterface::NexusInterface() } +void NexusInterface::cleanup() +{ + delete NexusInterface::s_Instance; + NexusInterface::s_Instance = NULL; +} + + NXMAccessManager *NexusInterface::getAccessManager() { return m_AccessManager; @@ -405,6 +414,7 @@ void NexusInterface::downloadRequestedNXM(const QString &url) emit requestNXMDownload(url); } +#include void NexusInterface::requestFinished(std::list::iterator iter) { diff --git a/src/nexusinterface.h b/src/nexusinterface.h index 0c304a71..0b53f9d0 100644 --- a/src/nexusinterface.h +++ b/src/nexusinterface.h @@ -294,6 +294,7 @@ private: NexusInterface(); void nextRequest(); void requestFinished(std::list::iterator iter); + static void cleanup(); private: diff --git a/src/nxmaccessmanager.cpp b/src/nxmaccessmanager.cpp index d83ffa61..a05b8a6c 100644 --- a/src/nxmaccessmanager.cpp +++ b/src/nxmaccessmanager.cpp @@ -44,6 +44,14 @@ NXMAccessManager::NXMAccessManager(QObject *parent) { } +NXMAccessManager::~NXMAccessManager() +{ + if (m_LoginReply != NULL) { + m_LoginReply->deleteLater(); + m_LoginReply = NULL; + } +} + QNetworkReply *NXMAccessManager::createRequest( QNetworkAccessManager::Operation operation, const QNetworkRequest &request, diff --git a/src/nxmaccessmanager.h b/src/nxmaccessmanager.h index b0c43978..1d8d36ab 100644 --- a/src/nxmaccessmanager.h +++ b/src/nxmaccessmanager.h @@ -37,6 +37,8 @@ public: explicit NXMAccessManager(QObject *parent); + ~NXMAccessManager(); + bool loggedIn() const; void login(const QString &username, const QString &password); diff --git a/src/organizer.pro b/src/organizer.pro index e89b6e99..a9353361 100644 --- a/src/organizer.pro +++ b/src/organizer.pro @@ -183,7 +183,6 @@ INCLUDEPATH += ../shared ../archive ../uibase ../bsatk ../esptk "$(BOOSTPATH)" LIBS += -L"$(BOOSTPATH)/stage/lib" - CONFIG(debug, debug|release) { OUTDIR = $$OUT_PWD/debug DSTDIR = $$PWD/../../outputd @@ -294,6 +293,12 @@ OTHER_FILES += \ INCLUDEPATH += "$(ZLIBPATH)" "$(ZLIBPATH)/build" "$(BOOSTPATH)" LIBS += -L"$(ZLIBPATH)/build" -lzlibstatic + +# leak detection with vld +#INCLUDEPATH += "E:/Visual Leak Detector/include" +#LIBS += -L"E:/Visual Leak Detector/lib/Win32" +#DEFINES += LEAK_CHECK_WITH_VLD + #SOURCES += modeltest.cpp #HEADERS += modeltest.h #DEFINES += TEST_MODELS diff --git a/src/pluginlist.cpp b/src/pluginlist.cpp index 39cca6af..e730d3f4 100644 --- a/src/pluginlist.cpp +++ b/src/pluginlist.cpp @@ -90,6 +90,10 @@ PluginList::PluginList(QObject *parent) } +PluginList::~PluginList() +{ +} + QString PluginList::getColumnName(int column) { diff --git a/src/pluginlist.h b/src/pluginlist.h index 3442a9f7..60c9be95 100644 --- a/src/pluginlist.h +++ b/src/pluginlist.h @@ -53,6 +53,8 @@ public: **/ PluginList(QObject *parent = NULL); + ~PluginList(); + /** * @brief does a complete refresh of the list * diff --git a/src/profile.cpp b/src/profile.cpp index 07f7010e..3da12d7d 100644 --- a/src/profile.cpp +++ b/src/profile.cpp @@ -185,7 +185,7 @@ void Profile::writeModlistNow(bool onlyOnTimer) const QString fileName = getModlistFileName(); if (QFile::exists(fileName)) { - shellDelete(QStringList(fileName)); + shellDelete(QStringList(fileName), false, QApplication::activeModalWidget()); } if (!file.copy(fileName)) { @@ -238,6 +238,7 @@ void Profile::createTweakedIniFile() if (error) { reportError(tr("failed to create tweaked ini: %1").arg(getCurrentErrorStringA().c_str())); } + qDebug("%s saved", qPrintable(QDir::toNativeSeparators(tweakedIni))); } diff --git a/src/selfupdater.cpp b/src/selfupdater.cpp index 421fbeab..bdace814 100644 --- a/src/selfupdater.cpp +++ b/src/selfupdater.cpp @@ -126,7 +126,6 @@ void SelfUpdater::startUpdate() void SelfUpdater::download(const QString &downloadLink, const QString &fileName) { - qDebug("download: %s", downloadLink.toUtf8().constData()); QNetworkAccessManager *accessManager = m_Interface->getAccessManager(); QUrl dlUrl(downloadLink); QNetworkRequest request(dlUrl); @@ -324,7 +323,6 @@ void SelfUpdater::nxmDescriptionAvailable(int, QVariant, QVariant resultData, in if (m_NewestVersion.isEmpty()) { QTimer::singleShot(5000, this, SLOT(testForUpdate())); } - VersionInfo currentVersion(m_MOVersion); VersionInfo newestVersion(m_NewestVersion); diff --git a/src/shared/gameinfo.cpp b/src/shared/gameinfo.cpp index 6b53450d..f74e52b4 100644 --- a/src/shared/gameinfo.cpp +++ b/src/shared/gameinfo.cpp @@ -40,6 +40,13 @@ GameInfo* GameInfo::s_Instance = NULL; GameInfo::GameInfo(const std::wstring &omoDirectory, const std::wstring &gameDirectory) : m_GameDirectory(gameDirectory), m_OrganizerDirectory(omoDirectory) { + atexit(&cleanup); +} + + +void GameInfo::cleanup() { + delete GameInfo::s_Instance; + GameInfo::s_Instance = NULL; } diff --git a/src/shared/gameinfo.h b/src/shared/gameinfo.h index 3e022ef4..14f52f05 100644 --- a/src/shared/gameinfo.h +++ b/src/shared/gameinfo.h @@ -176,9 +176,11 @@ private: static bool identifyGame(const std::wstring &omoDirectory, const std::wstring &searchPath); std::wstring getSpecialPath(LPCWSTR name) const; + static void cleanup(); + private: - static GameInfo* s_Instance; + static GameInfo *s_Instance; std::wstring m_MyGamesDirectory; diff --git a/src/shared/leaktrace.cpp b/src/shared/leaktrace.cpp index 83ed4fd0..c3721557 100644 --- a/src/shared/leaktrace.cpp +++ b/src/shared/leaktrace.cpp @@ -114,6 +114,7 @@ static struct __TraceData { } std::map m_Traces; + } __trace; diff --git a/src/shared/shared.pro b/src/shared/shared.pro index ab0bd8a0..992fd7f2 100644 --- a/src/shared/shared.pro +++ b/src/shared/shared.pro @@ -13,9 +13,17 @@ CONFIG += staticlib INCLUDEPATH += ../bsatk "$(BOOSTPATH)" + +# only for custom leak detection +#DEFINES += TRACE_LEAKS +#LIBS += -lDbgHelp + + CONFIG(debug, debug|release) { - LIBS += -L$$OUT_PWD/../bsatk/debug + LIBS += -L$$OUT_PWD/../bsatk/debug LIBS += -lDbgHelp + QMAKE_CXXFLAGS_DEBUG -= -Zi + QMAKE_CXXFLAGS += -Z7 } else { LIBS += -L$$OUT_PWD/../bsatk/release } diff --git a/src/spawn.cpp b/src/spawn.cpp index ab43b687..5639a78c 100644 --- a/src/spawn.cpp +++ b/src/spawn.cpp @@ -156,7 +156,7 @@ HANDLE startBinary(const QFileInfo &binary, const QString &arguments, const QStr return processHandle; } - +/* ExitProxy *ExitProxy::s_Instance = NULL; ExitProxy *ExitProxy::instance() @@ -170,4 +170,4 @@ ExitProxy *ExitProxy::instance() void ExitProxy::emitExit() { emit exit(); -} +}*/ diff --git a/src/spawn.h b/src/spawn.h index e0d1f958..48320fea 100644 --- a/src/spawn.h +++ b/src/spawn.h @@ -31,7 +31,7 @@ along with Mod Organizer. If not, see . * @brief a dirty little trick so we can issue a clean restart from startBinary * @note unused */ -class ExitProxy : public QObject { +/*class ExitProxy : public QObject { Q_OBJECT public: static ExitProxy *instance(); @@ -42,7 +42,7 @@ private: ExitProxy() {} private: static ExitProxy *s_Instance; -}; +};*/ /** diff --git a/src/splash.png b/src/splash.png index 45ace8f8..0137bf72 100644 Binary files a/src/splash.png and b/src/splash.png differ -- cgit v1.3.1 From 382226bb46541f07e62ce689cfeaf395aa673a44 Mon Sep 17 00:00:00 2001 From: Tannin Date: Fri, 11 Oct 2013 23:03:49 +0200 Subject: - added new plugin to test if fnis needs to be run - some functionality to the plugin interface to enable them to search for files&directories in the virtual FS (rudimentary atm) - functionality for plugins to react to application being started from MO - broken ESPs are no longer reported as popup windows but only in the log file - bugfix: plugins couldn't store persistent data if they had no user-editable settings --- src/main.cpp | 2 +- src/mainwindow.cpp | 87 +++++++++++++++++++++++++++++++++++++++++-- src/mainwindow.h | 10 ++++- src/organizer.pro | 4 +- src/pluginlist.cpp | 2 +- src/settings.cpp | 1 + src/shared/directoryentry.cpp | 6 +++ src/shared/directoryentry.h | 1 + 8 files changed, 103 insertions(+), 10 deletions(-) (limited to 'src/pluginlist.cpp') diff --git a/src/main.cpp b/src/main.cpp index c4431ac4..49c7b3c0 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -466,7 +466,7 @@ int main(int argc, char *argv[]) arguments.removeFirst(); // remove application name (ModOrganizer.exe) arguments.removeFirst(); // remove binary name // pass the remaining parameters to the binary - mainWindow.spawnProgram(exeName, arguments.join(" "), selectedProfileName, QDir()); + mainWindow.startApplication(exeName, arguments, QString(), selectedProfileName); return 0; } diff --git a/src/mainwindow.cpp b/src/mainwindow.cpp index 1ea35d74..1ee4b66e 100644 --- a/src/mainwindow.cpp +++ b/src/mainwindow.cpp @@ -1276,10 +1276,15 @@ HANDLE MainWindow::spawnBinaryDirect(const QFileInfo &binary, const QString &arg QCoreApplication::processEvents(); } - return startBinary(binary, arguments, profileName, m_Settings.logLevel(), currentDirectory, true); + if (m_AboutToRun(binary.absoluteFilePath())) { + return startBinary(binary, arguments, profileName, m_Settings.logLevel(), currentDirectory, true); + } else { + qDebug("start of \"%s\" canceled by plugin", qPrintable(binary.absoluteFilePath())); + return INVALID_HANDLE_VALUE; + } } - +/* void MainWindow::spawnProgram(const QString &fileName, const QString &argumentsArg, const QString &profileName, const QDir ¤tDirectory) { @@ -1299,7 +1304,7 @@ void MainWindow::spawnProgram(const QString &fileName, const QString &argumentsA } spawnBinaryDirect(binary, arguments, profileName, currentDirectory, steamAppID); } - +*/ void MainWindow::spawnBinary(const QFileInfo &binary, const QString &arguments, const QDir ¤tDirectory, bool closeAfterStart, const QString &steamAppID) { @@ -1895,7 +1900,6 @@ void MainWindow::activateProxy(bool activate) busyDialog.hide(); } - void MainWindow::readSettings() { QSettings settings(ToQString(GameInfo::instance().getIniFilename()), QSettings::IniFormat); @@ -2053,11 +2057,86 @@ QString MainWindow::resolvePath(const QString &fileName) const } } +QStringList MainWindow::listDirectories(const QString &directoryName) const +{ + QStringList result; + DirectoryEntry *dir = m_DirectoryStructure->findSubDirectoryRecursive(ToWString(directoryName)); + if (dir != NULL) { + std::vector::iterator current, end; + dir->getSubDirectories(current, end); + for (; current != end; ++current) { + result.append(ToQString((*current)->getName())); + } + } + return result; +} + +QStringList MainWindow::findFiles(const QString &path, const std::function &filter) const +{ + QStringList result; + DirectoryEntry *dir = m_DirectoryStructure->findSubDirectoryRecursive(ToWString(path)); + if (dir != NULL) { + std::vector files = dir->getFiles(); + foreach (FileEntry::Ptr file, files) { + if (filter(ToQString(file->getName()))) { + result.append(ToQString(file->getFullPath())); + } + } + } else { + qWarning("directory %s not found", qPrintable(path)); + } + return result; +} + IDownloadManager *MainWindow::downloadManager() { return &m_DownloadManager; } +HANDLE MainWindow::startApplication(const QString &executable, const QStringList &args, const QString &cwd, const QString &profile) +{ + QFileInfo binary; + QString arguments = args.join(" "); + QString currentDirectory = cwd; + QString profileName = (profile.length() > 0) ? profile : m_CurrentProfile->getName(); + QString steamAppID; + if (executable.contains('\\') || executable.contains('/')) { + // file path + binary = QFileInfo(executable); + if (binary.isRelative()) { + // relative path, should be relative to game directory + binary = QFileInfo(QDir::fromNativeSeparators(ToQString(GameInfo::instance().getGameDirectory())) + "/" + executable); + } + if (cwd.length() == 0) { + currentDirectory = binary.absolutePath(); + } + } else { + // only a file name, search executables list + try { + const Executable &exe = m_ExecutablesList.find(executable); + steamAppID = exe.m_SteamAppID; + if (arguments == "") { + arguments = exe.m_Arguments; + } + binary = exe.m_BinaryInfo; + if (cwd.length() == 0) { + currentDirectory = exe.m_WorkingDirectory; + } + } catch (const std::runtime_error&) { + qWarning("\"%s\" not set up as executable", executable.toUtf8().constData()); + return INVALID_HANDLE_VALUE; + } + } + + return spawnBinaryDirect(binary, arguments, profileName, currentDirectory, steamAppID); +} + +bool MainWindow::onAboutToRun(const boost::function &func) +{ + auto conn = m_AboutToRun.connect(func); + return conn.connected(); +} + std::vector MainWindow::activeProblems() const { std::vector problems; diff --git a/src/mainwindow.h b/src/mainwindow.h index dfec5f49..6992861b 100644 --- a/src/mainwindow.h +++ b/src/mainwindow.h @@ -89,8 +89,8 @@ public: void createFirstProfile(); - void spawnProgram(const QString &fileName, const QString &argumentsArg, - const QString &profileName, const QDir ¤tDirectory); +/* void spawnProgram(const QString &fileName, const QString &argumentsArg, + const QString &profileName, const QDir ¤tDirectory);*/ void loadPlugins(); @@ -111,7 +111,11 @@ public: virtual QString pluginDataPath() const; virtual void installMod(const QString &fileName); virtual QString resolvePath(const QString &fileName) const; + virtual QStringList listDirectories(const QString &directoryName) const; + virtual QStringList findFiles(const QString &path, const std::function &filter) const; virtual MOBase::IDownloadManager *downloadManager(); + virtual HANDLE startApplication(const QString &executable, const QStringList &args = QStringList(), const QString &cwd = "", const QString &profile = ""); + virtual bool onAboutToRun(const boost::function &func); virtual std::vector activeProblems() const; virtual QString shortDescription(unsigned int key) const; @@ -320,6 +324,8 @@ private: QFile m_PluginsCheck; + SignalAboutToRunApplication m_AboutToRun; + private slots: void showMessage(const QString &message); diff --git a/src/organizer.pro b/src/organizer.pro index a9353361..c817f2da 100644 --- a/src/organizer.pro +++ b/src/organizer.pro @@ -199,8 +199,8 @@ CONFIG(debug, debug|release) { QMAKE_LFLAGS += /DEBUG } -QMAKE_CXXFLAGS_WARN_ON -= -W3 -QMAKE_CXXFLAGS_WARN_ON += -W4 +#QMAKE_CXXFLAGS_WARN_ON -= -W3 +#QMAKE_CXXFLAGS_WARN_ON += -W4 QMAKE_CXXFLAGS += -wd4127 -wd4512 -wd4189 CONFIG += embed_manifest_exe diff --git a/src/pluginlist.cpp b/src/pluginlist.cpp index e730d3f4..55f8a39e 100644 --- a/src/pluginlist.cpp +++ b/src/pluginlist.cpp @@ -953,7 +953,7 @@ PluginList::ESPInfo::ESPInfo(const QString &name, bool enabled, FILETIME time, c m_Masters.insert(QString(iter->c_str())); } } catch (const std::exception &e) { - reportError(tr("failed to parse esp file %1: %2").arg(fullPath).arg(e.what())); + qCritical("failed to parse esp file %s: %s", qPrintable(fullPath), e.what()); m_IsMaster = false; } } diff --git a/src/settings.cpp b/src/settings.cpp index 42a8d693..4f301b0c 100644 --- a/src/settings.cpp +++ b/src/settings.cpp @@ -105,6 +105,7 @@ bool Settings::pluginBlacklisted(const QString &fileName) const void Settings::registerPlugin(IPlugin *plugin) { m_Plugins.push_back(plugin); + m_PluginSettings.insert(plugin->name(), QMap()); foreach (const PluginSetting &setting, plugin->settings()) { QVariant temp = m_Settings.value("Plugins/" + plugin->name() + "/" + setting.key, setting.defaultValue); if (!temp.convert(setting.defaultValue.type())) { diff --git a/src/shared/directoryentry.cpp b/src/shared/directoryentry.cpp index 8380181f..b3a12498 100644 --- a/src/shared/directoryentry.cpp +++ b/src/shared/directoryentry.cpp @@ -746,6 +746,12 @@ DirectoryEntry *DirectoryEntry::findSubDirectory(const std::wstring &name) const } +DirectoryEntry *DirectoryEntry::findSubDirectoryRecursive(const std::wstring &path) +{ + return getSubDirectoryRecursive(path, false, -1); +} + + const FileEntry::Ptr DirectoryEntry::findFile(const std::wstring &name) { auto iter = m_Files.find(name); diff --git a/src/shared/directoryentry.h b/src/shared/directoryentry.h index 498ebfe1..1ad9816c 100644 --- a/src/shared/directoryentry.h +++ b/src/shared/directoryentry.h @@ -227,6 +227,7 @@ public: } DirectoryEntry *findSubDirectory(const std::wstring &name) const; + DirectoryEntry *findSubDirectoryRecursive(const std::wstring &path); /** retrieve a file in this directory by name. * @param name name of the file -- cgit v1.3.1 From b47c89661e603336abd98d5ecd0a82f6743cab18 Mon Sep 17 00:00:00 2001 From: Tannin Date: Wed, 16 Oct 2013 23:04:03 +0200 Subject: - plugin (esp/esm) list is now exposed to plugins (read-only functionality right now) - integrated fomod installer now supports file dependencies - bugfix: integrated fomod installer crashed if the installer had no optiosn´´ns MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/mainwindow.cpp | 5 +++++ src/mainwindow.h | 23 +---------------------- src/pluginlist.cpp | 40 ++++++++++++++++++++++++++++++++++++++++ src/pluginlist.h | 9 ++++++++- 4 files changed, 54 insertions(+), 23 deletions(-) (limited to 'src/pluginlist.cpp') diff --git a/src/mainwindow.cpp b/src/mainwindow.cpp index b7a0fc2f..de6f20cf 100644 --- a/src/mainwindow.cpp +++ b/src/mainwindow.cpp @@ -2095,6 +2095,11 @@ IDownloadManager *MainWindow::downloadManager() return &m_DownloadManager; } +IPluginList *MainWindow::pluginList() +{ + return &m_PluginList; +} + HANDLE MainWindow::startApplication(const QString &executable, const QStringList &args, const QString &cwd, const QString &profile) { QFileInfo binary; diff --git a/src/mainwindow.h b/src/mainwindow.h index dc8d20c8..a96e5fcf 100644 --- a/src/mainwindow.h +++ b/src/mainwindow.h @@ -84,28 +84,6 @@ private: } }; -public: - - typedef boost::signals2::signal SignalAboutToRunApplication; - -public: - - struct SignalCombinerAnd - { - typedef bool result_type; - template - bool operator()(InputIterator first, InputIterator last) const - { - while (first != last) { - if (!(*first)) { - return false; - } - ++first; - } - return true; - } - }; - typedef boost::signals2::signal SignalAboutToRunApplication; public: @@ -158,6 +136,7 @@ public: virtual QStringList listDirectories(const QString &directoryName) const; virtual QStringList findFiles(const QString &path, const std::function &filter) const; virtual MOBase::IDownloadManager *downloadManager(); + virtual MOBase::IPluginList *pluginList(); virtual HANDLE startApplication(const QString &executable, const QStringList &args = QStringList(), const QString &cwd = "", const QString &profile = ""); virtual bool onAboutToRun(const std::function &func); diff --git a/src/pluginlist.cpp b/src/pluginlist.cpp index 55f8a39e..74aa6ff3 100644 --- a/src/pluginlist.cpp +++ b/src/pluginlist.cpp @@ -571,6 +571,46 @@ void PluginList::refreshLoadOrder() } } +IPluginList::PluginState PluginList::state(const QString &name) const +{ + auto iter = m_ESPsByName.find(name.toLower()); + if (iter == m_ESPsByName.end()) { + return IPluginList::STATE_MISSING; + } else { + return m_ESPs[iter->second].m_Enabled ? IPluginList::STATE_ACTIVE : IPluginList::STATE_INACTIVE; + } +} + +int PluginList::priority(const QString &name) const +{ + auto iter = m_ESPsByName.find(name.toLower()); + if (iter == m_ESPsByName.end()) { + return -1; + } else { + return m_ESPs[iter->second].m_Priority; + } +} + +int PluginList::loadOrder(const QString &name) const +{ + auto iter = m_ESPsByName.find(name.toLower()); + if (iter == m_ESPsByName.end()) { + return -1; + } else { + return m_ESPs[iter->second].m_LoadOrder; + } +} + +bool PluginList::isMaster(const QString &name) const +{ + auto iter = m_ESPsByName.find(name.toLower()); + if (iter == m_ESPsByName.end()) { + return false; + } else { + return m_ESPs[iter->second].m_IsMaster; + } +} + void PluginList::updateIndices() { diff --git a/src/pluginlist.h b/src/pluginlist.h index 60c9be95..2ad54d6d 100644 --- a/src/pluginlist.h +++ b/src/pluginlist.h @@ -25,12 +25,13 @@ along with Mod Organizer. If not, see . #include #include #include +#include /** * @brief model representing the plugins (.esp/.esm) in the current virtual data folder **/ -class PluginList : public QAbstractTableModel +class PluginList : public QAbstractTableModel, public MOBase::IPluginList { Q_OBJECT @@ -134,6 +135,12 @@ public: void refreshLoadOrder(); +public: + virtual PluginState state(const QString &name) const; + virtual int priority(const QString &name) const; + virtual int loadOrder(const QString &name) const; + virtual bool isMaster(const QString &name) const; + public: // implementation of the QAbstractTableModel interface virtual int rowCount(const QModelIndex &parent = QModelIndex()) const; -- cgit v1.3.1 From d1594798e6e78bb329e744a72e92d3f292f38a20 Mon Sep 17 00:00:00 2001 From: Tannin Date: Fri, 1 Nov 2013 14:59:25 +0100 Subject: - added a new diagnosis to detect potential problems in regards to esp vs. asset ordering (not fully functional yet) - new plugin interfaces to the mod list - plugins can now query the origin (mod) of a esp/esm - bugfix: potential access to profile before one was activated - bugfix: regression in previous (not-yet-released) commit prevented changes to bsa list from being saved --- src/mainwindow.cpp | 18 +++++++++++++--- src/mainwindow.h | 4 +++- src/modlist.cpp | 40 +++++++++++++++++++++++++++++++++++ src/modlist.h | 15 ++++++++++++- src/pluginlist.cpp | 9 ++++++++ src/pluginlist.h | 1 + src/problemsdialog.ui | 58 +++++++++++++++++++++++++-------------------------- 7 files changed, 110 insertions(+), 35 deletions(-) (limited to 'src/pluginlist.cpp') diff --git a/src/mainwindow.cpp b/src/mainwindow.cpp index 967a3842..774c99f5 100644 --- a/src/mainwindow.cpp +++ b/src/mainwindow.cpp @@ -246,7 +246,7 @@ MainWindow::MainWindow(const QString &exeName, QSettings &initSettings, QWidget connect(ui->espFilterEdit, SIGNAL(textChanged(QString)), this, SLOT(espFilterChanged(QString))); connect(&m_PluginList, SIGNAL(saveTimer()), this, SLOT(savePluginList())); - connect(ui->bsaList, SIGNAL(itemsMoved()), this, SLOT(on_bsaList_itemMoved())); + connect(ui->bsaList, SIGNAL(itemsMoved()), this, SLOT(bsaList_itemMoved())); connect(ui->bsaWarning, SIGNAL(linkActivated(QString)), this, SLOT(linkClicked(QString))); @@ -1673,7 +1673,7 @@ void MainWindow::refreshSaveList() void MainWindow::refreshLists() { - if (m_DirectoryStructure->isPopulated()) { + if ((m_CurrentProfile != NULL) && m_DirectoryStructure->isPopulated()) { refreshESPList(); refreshBSAList(); } // no point in refreshing lists if no files have been added to the directory tree @@ -2104,6 +2104,11 @@ IPluginList *MainWindow::pluginList() return &m_PluginList; } +IModList *MainWindow::modList() +{ + return &m_ModList; +} + HANDLE MainWindow::startApplication(const QString &executable, const QStringList &args, const QString &cwd, const QString &profile) { QFileInfo binary; @@ -4650,13 +4655,19 @@ void MainWindow::on_bsaList_customContextMenuRequested(const QPoint &pos) menu.exec(ui->bsaList->mapToGlobal(pos)); } -void MainWindow::on_bsaList_itemMoved() +void MainWindow::bsaList_itemMoved() { saveArchiveList(); m_CheckBSATimer.start(500); } +void MainWindow::on_bsaList_itemChanged(QTreeWidgetItem*, int) +{ + saveArchiveList(); + m_CheckBSATimer.start(500); +} + void MainWindow::on_actionProblems_triggered() { // QString problemDescription; @@ -4836,3 +4847,4 @@ void MainWindow::on_showHiddenBox_toggled(bool checked) { m_DownloadManager.setShowHidden(checked); } + diff --git a/src/mainwindow.h b/src/mainwindow.h index 93a6af80..cf97d4f9 100644 --- a/src/mainwindow.h +++ b/src/mainwindow.h @@ -137,6 +137,7 @@ public: virtual QStringList findFiles(const QString &path, const std::function &filter) const; virtual MOBase::IDownloadManager *downloadManager(); virtual MOBase::IPluginList *pluginList(); + virtual MOBase::IModList *modList(); virtual HANDLE startApplication(const QString &executable, const QStringList &args = QStringList(), const QString &cwd = "", const QString &profile = ""); virtual bool onAboutToRun(const std::function &func); @@ -510,7 +511,7 @@ private slots: // ui slots void on_actionEndorseMO_triggered(); void on_bsaList_customContextMenuRequested(const QPoint &pos); - void on_bsaList_itemMoved(); + void bsaList_itemMoved(); void on_btnRefreshData_clicked(); void on_categoriesList_customContextMenuRequested(const QPoint &pos); void on_compactBox_toggled(bool checked); @@ -531,6 +532,7 @@ private slots: // ui slots void on_categoriesList_itemSelectionChanged(); void on_linkButton_pressed(); void on_showHiddenBox_toggled(bool checked); + void on_bsaList_itemChanged(QTreeWidgetItem *item, int column); }; #endif // MAINWINDOW_H diff --git a/src/modlist.cpp b/src/modlist.cpp index 0fdcf6fa..541e1e6e 100644 --- a/src/modlist.cpp +++ b/src/modlist.cpp @@ -551,6 +551,46 @@ void ModList::changeModPriority(int sourceIndex, int newPriority) emit modorder_changed(); } +IModList::ModState ModList::state(const QString &name) const +{ + unsigned int modIndex = ModInfo::getIndex(name); + if (modIndex == UINT_MAX) { + return IModList::STATE_MISSING; + } else { + ModInfo::Ptr modInfo = ModInfo::getByIndex(modIndex); + if (modInfo->canBeEnabled()) { + return m_Profile->modEnabled(modIndex) ? IModList::STATE_ACTIVE : IModList::STATE_INACTIVE; + } else { + return IModList::STATE_NOTOPTIONAL; + } + } +} + +int ModList::priority(const QString &name) const +{ + unsigned int modIndex = ModInfo::getIndex(name); + if (modIndex == UINT_MAX) { + return -1; + } else { + return m_Profile->getModPriority(modIndex); + } +} + +bool ModList::setPriority(const QString &name, int newPriority) +{ + if ((newPriority < 0) || (newPriority >= static_cast(m_Profile->numRegularMods()))) { + return false; + } + + unsigned int modIndex = ModInfo::getIndex(name); + if (modIndex == UINT_MAX) { + return false; + } else { + m_Profile->setModPriority(modIndex, newPriority); + notifyChange(modIndex); + return true; + } +} bool ModList::dropURLs(const QMimeData *mimeData, int row, const QModelIndex &parent) { diff --git a/src/modlist.h b/src/modlist.h index 7e76d677..cdaa24ca 100644 --- a/src/modlist.h +++ b/src/modlist.h @@ -26,6 +26,8 @@ along with Mod Organizer. If not, see . #include "modinfo.h" #include "profile.h" +#include + #include #include #include @@ -41,7 +43,7 @@ along with Mod Organizer. If not, see . * This is used in a view in the main window of MO. It combines general information about * the mods from ModInfo with status information from the Profile **/ -class ModList : public QAbstractItemModel +class ModList : public QAbstractItemModel, public MOBase::IModList { Q_OBJECT @@ -92,6 +94,17 @@ public: void changeModPriority(int sourceIndex, int newPriority); +public: + + /// \copydoc MOBase::IModList::state + virtual ModState state(const QString &name) const; + + /// \copydoc MOBase::IModList::priority + virtual int priority(const QString &name) const; + + /// \copydoc MOBase::IModList::setPriority + virtual bool setPriority(const QString &name, int newPriority); + public: // implementation of virtual functions of QAbstractItemModel virtual int rowCount(const QModelIndex &parent = QModelIndex()) const; diff --git a/src/pluginlist.cpp b/src/pluginlist.cpp index 74aa6ff3..456d29ee 100644 --- a/src/pluginlist.cpp +++ b/src/pluginlist.cpp @@ -611,6 +611,15 @@ bool PluginList::isMaster(const QString &name) const } } +QString PluginList::origin(const QString &name) const +{ + auto iter = m_ESPsByName.find(name.toLower()); + if (iter == m_ESPsByName.end()) { + return false; + } else { + return m_ESPs[iter->second].m_OriginName; + } +} void PluginList::updateIndices() { diff --git a/src/pluginlist.h b/src/pluginlist.h index 2ad54d6d..4da7be4b 100644 --- a/src/pluginlist.h +++ b/src/pluginlist.h @@ -140,6 +140,7 @@ public: virtual int priority(const QString &name) const; virtual int loadOrder(const QString &name) const; virtual bool isMaster(const QString &name) const; + virtual QString origin(const QString &name) const; public: // implementation of the QAbstractTableModel interface diff --git a/src/problemsdialog.ui b/src/problemsdialog.ui index b194bf31..d3a0d959 100644 --- a/src/problemsdialog.ui +++ b/src/problemsdialog.ui @@ -49,54 +49,52 @@ <!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:'MS Shell Dlg 2'; font-size:7.8pt; font-weight:400; font-style:normal;"> +</style></head><body style=" font-family:'MS Shell Dlg 2'; font-size:8.25pt; font-weight:400; font-style:normal;"> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:8pt;"><br /></p></body></html>
- - - Qt::Horizontal - - - QDialogButtonBox::Cancel|QDialogButtonBox::Ok - - + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + Close + + + +
- buttonBox - accepted() + closeButton + clicked() ProblemsDialog accept() - 248 - 254 - - - 157 - 274 - - - - - buttonBox - rejected() - ProblemsDialog - reject() - - - 316 - 260 + 526 + 354 286 - 274 + 187 -- cgit v1.3.1 From f010c22a3b2ec31bc4ebc3f577ac4455c5de5dfb Mon Sep 17 00:00:00 2001 From: Tannin Date: Wed, 6 Nov 2013 18:35:27 +0100 Subject: - diagnosis plugins can now request to be re-evaluated - main application now contains means for plugins to react on some changes (to be extended) - plugins can now retrieve more information about a mod - user-agent sent to nexus now automatically contains the current MO version - included updated russian translation - problems dialog now refreshes itself after a fix was applied - fixed new esp/asset ordering diagnosis. May be fully functional now - bugfix: restoring locked load order could leave MO in an endless loop (not sure if this fix is correct yet) - bugfix: plugin list was not visually updated after some changes - bugfix: nmm importer threw away mod ordering --- src/downloadlistwidget.ui | 4 +- src/main.cpp | 2 +- src/mainwindow.cpp | 9 +- src/mainwindow.ui | 57 +- src/modinfo.cpp | 9 + src/modinfo.h | 1 + src/modinfodialog.ui | 33 +- src/modlist.cpp | 49 +- src/modlist.h | 21 +- src/nexusinterface.cpp | 15 +- src/nexusinterface.h | 1 + src/organizer_ru.qm | Bin 53312 -> 188628 bytes src/organizer_ru.ts | 3256 ++++++++++++++++++++--------------------- src/overwriteinfodialog.cpp | 4 +- src/overwriteinfodialog.h | 100 +- src/pluginlist.cpp | 28 +- src/pluginlist.h | 10 +- src/problemsdialog.cpp | 31 +- src/problemsdialog.h | 4 + src/settingsdialog.ui | 2 +- src/shared/directoryentry.cpp | 2 +- src/version.rc | 4 +- 22 files changed, 1838 insertions(+), 1804 deletions(-) (limited to 'src/pluginlist.cpp') diff --git a/src/downloadlistwidget.ui b/src/downloadlistwidget.ui index 01b2ee07..106ac922 100644 --- a/src/downloadlistwidget.ui +++ b/src/downloadlistwidget.ui @@ -7,7 +7,7 @@ 0 0 315 - 75 + 81 @@ -78,7 +78,7 @@ - 0 + 0 diff --git a/src/main.cpp b/src/main.cpp index 90cf9e0e..5053d21d 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -140,7 +140,7 @@ bool bootstrap() QObject::tr("The current user account doesn't have the required access rights to run " "Mod Organizer. The neccessary changes can be made automatically (the MO directory " "will be made writable for the current user account). You will be asked to run " - "\"helper.exe\" with administrative rights)."), + "\"helper.exe\" with administrative rights."), QMessageBox::Yes | QMessageBox::Cancel) == QMessageBox::Yes) { if (!Helper::init(GameInfo::instance().getOrganizerDirectory())) { return false; diff --git a/src/mainwindow.cpp b/src/mainwindow.cpp index 774c99f5..f726757c 100644 --- a/src/mainwindow.cpp +++ b/src/mainwindow.cpp @@ -487,6 +487,7 @@ void MainWindow::updateProblemsButton() ui->actionProblems->setIconText(tr("Problems")); ui->actionProblems->setToolTip(tr("There are potential problems with your setup")); } else { + ui->actionProblems->setEnabled(false); ui->actionProblems->setIconText(tr("No Problems")); ui->actionProblems->setToolTip(tr("Everything seems to be in order")); } @@ -983,6 +984,7 @@ bool MainWindow::registerPlugin(QObject *plugin) IPluginDiagnose *diagnose = qobject_cast(plugin); if (diagnose != NULL) { m_DiagnosisPlugins.push_back(diagnose); + diagnose->onInvalidated([&] () { this->updateProblemsButton(); }); } } { // tool plugins @@ -2178,7 +2180,7 @@ QString MainWindow::fullDescription(unsigned int key) const { switch (key) { case PROBLEM_PLUGINSNOTLOADED: { - QString result = tr("The following Plugins could not be loaded. The reason may be missing dependencies (i.e. python) or an outdated version:
    "); + QString result = tr("The following plugins could not be loaded. The reason may be missing dependencies (i.e. python) or an outdated version:") + "
      "; foreach (const QString &plugin, m_UnloadedPlugins) { result += "
    • " + plugin + "
    • "; } @@ -2985,8 +2987,9 @@ void MainWindow::unendorse_clicked() void MainWindow::overwriteClosed(int) { - QDialog *dialog = this->findChild("__overwriteDialog"); + OverwriteInfoDialog *dialog = this->findChild("__overwriteDialog"); if (dialog != NULL) { + m_ModList.modInfoChanged(dialog->modInfo()); dialog->deleteLater(); } } @@ -2994,6 +2997,7 @@ void MainWindow::overwriteClosed(int) void MainWindow::displayModInformation(ModInfo::Ptr modInfo, unsigned int index, int tab) { + m_ModList.modInfoAboutToChange(modInfo); std::vector flags = modInfo->getFlags(); if (std::find(flags.begin(), flags.end(), ModInfo::FLAG_OVERWRITE) != flags.end()) { QDialog *dialog = this->findChild("__overwriteDialog"); @@ -3019,6 +3023,7 @@ void MainWindow::displayModInformation(ModInfo::Ptr modInfo, unsigned int index, dialog.exec(); modInfo->saveMeta(); emit modInfoDisplayed(); + m_ModList.modInfoChanged(modInfo); } if (m_CurrentProfile->modEnabled(index)) { diff --git a/src/mainwindow.ui b/src/mainwindow.ui index 73ca868e..bc7dc212 100644 --- a/src/mainwindow.ui +++ b/src/mainwindow.ui @@ -31,7 +31,16 @@ 4 - + + 6 + + + 6 + + + 6 + + 6 @@ -577,7 +586,7 @@ p, li { white-space: pre-wrap; } QTabWidget::Rounded - 1 + 0 @@ -721,7 +730,16 @@ p, li { white-space: pre-wrap; } Archives - + + 6 + + + 6 + + + 6 + + 6 @@ -801,7 +819,16 @@ BSAs checked here are loaded in such a way that your installation order is obeye Data - + + 6 + + + 6 + + + 6 + + 6 @@ -871,7 +898,16 @@ BSAs checked here are loaded in such a way that your installation order is obeye Saves - + + 6 + + + 6 + + + 6 + + 6 @@ -900,7 +936,16 @@ p, li { white-space: pre-wrap; } Downloads - + + 2 + + + 2 + + + 2 + + 2 diff --git a/src/modinfo.cpp b/src/modinfo.cpp index faf8c95b..f436eba8 100644 --- a/src/modinfo.cpp +++ b/src/modinfo.cpp @@ -827,6 +827,15 @@ ModInfoOverwrite::ModInfoOverwrite() } +bool ModInfoOverwrite::isEmpty() const +{ + QDirIterator iter(absolutePath(), QDir::NoDotAndDotDot | QDir::Files | QDir::Dirs); + if (!iter.hasNext()) return true; + iter.next(); + if ((iter.fileName() == "meta.ini") && !iter.hasNext()) return true; + return false; +} + QString ModInfoOverwrite::absolutePath() const { return QDir::fromNativeSeparators(ToQString(GameInfo::instance().getOverwriteDir())); diff --git a/src/modinfo.h b/src/modinfo.h index 71c8de55..6de0275b 100644 --- a/src/modinfo.h +++ b/src/modinfo.h @@ -866,6 +866,7 @@ public: virtual void setNeverEndorse() {} virtual bool remove() { return false; } virtual void endorse(bool) {} + virtual bool isEmpty() const; virtual QString name() const { return "Overwrite"; } virtual QString notes() const { return ""; } virtual QDateTime creationTime() const { return m_StartupTime; } diff --git a/src/modinfodialog.ui b/src/modinfodialog.ui index 7e06745d..2fdbe5f3 100644 --- a/src/modinfodialog.ui +++ b/src/modinfodialog.ui @@ -209,7 +209,7 @@ 0 0 - 676 + 668 126 @@ -217,17 +217,22 @@ Images located in the mod. - <!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:'MS Shell Dlg 2'; font-size:8.25pt; 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=" font-size:8pt;">This lists all the images (.jpg and .png) in the mod directory, like screenshots and such. Click one to get a larger view.</span></p></body></html> + This lists all the images (.jpg and .png) in the mod directory, like screenshots and such. Click one to get a larger view. 0 - + + 0 + + + 0 + + + 0 + + 0 @@ -254,14 +259,10 @@ p, li { white-space: pre-wrap; } List of esps and esms that can not be loaded by the game. - <!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:'MS Shell Dlg 2'; font-size:8.25pt; 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=" font-size:8pt;">List of esps and esms contained in this plugin that currently can not be loaded by the game. They will not even appear in the esp-list in the main MO-window.</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt;">They usually contain optional functionality, see the readme.</span></p> -<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:8pt;"></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt;">Most mods do not have optional esps, so chances are good you are looking at an empty list.</span></p></body></html> + List of esps and esms contained in this plugin that currently can not be loaded by the game. They will not even appear in the esp-list in the main MO-window. +They usually contain optional functionality, see the readme. + +Most mods do not have optional esps, so chances are good you are looking at an empty list. @@ -659,7 +660,7 @@ p, li { white-space: pre-wrap; } <!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:'MS Shell Dlg 2'; font-size:8.25pt; font-weight:400; font-style:normal;"> +</style></head><body style=" font-family:'MS Shell Dlg 2'; font-size:7.8pt; font-weight:400; font-style:normal;"> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:8pt;"><br /></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:8pt;"><br /></p></body></html> diff --git a/src/modlist.cpp b/src/modlist.cpp index 541e1e6e..446946dc 100644 --- a/src/modlist.cpp +++ b/src/modlist.cpp @@ -551,19 +551,49 @@ void ModList::changeModPriority(int sourceIndex, int newPriority) emit modorder_changed(); } -IModList::ModState ModList::state(const QString &name) const +void ModList::modInfoAboutToChange(ModInfo::Ptr info) { - unsigned int modIndex = ModInfo::getIndex(name); - if (modIndex == UINT_MAX) { - return IModList::STATE_MISSING; + m_ChangeInfo.name = info->name(); + m_ChangeInfo.state = state(info->name()); +} + +void ModList::modInfoChanged(ModInfo::Ptr info) +{ + if (info->name() == m_ChangeInfo.name) { + IModList::ModStates newState = state(info->name()); + if (m_ChangeInfo.state != newState) { + m_ModStateChanged(info->name(), newState); + } } else { + qCritical("modInfoChanged not called after modInfoAboutToChange"); + } +} + +IModList::ModStates ModList::state(const QString &name) const +{ + ModStates result; + unsigned int modIndex = ModInfo::getIndex(name); + if (modIndex != UINT_MAX) { + result |= IModList::STATE_EXISTS; ModInfo::Ptr modInfo = ModInfo::getByIndex(modIndex); + if (modInfo->isEmpty()) { + result |= IModList::STATE_EMPTY; + } + if (modInfo->endorsedState() == ModInfo::ENDORSED_TRUE) { + result |= IModList::STATE_ENDORSED; + } + if (modInfo->isValid()) { + result |= IModList::STATE_VALID; + } if (modInfo->canBeEnabled()) { - return m_Profile->modEnabled(modIndex) ? IModList::STATE_ACTIVE : IModList::STATE_INACTIVE; + if (m_Profile->modEnabled(modIndex)) { + result |= IModList::STATE_ACTIVE; + } } else { - return IModList::STATE_NOTOPTIONAL; + result |= IModList::STATE_ESSENTIAL; } } + return result; } int ModList::priority(const QString &name) const @@ -592,6 +622,13 @@ bool ModList::setPriority(const QString &name, int newPriority) } } + +bool ModList::onModStateChanged(const std::function &func) +{ + auto conn = m_ModStateChanged.connect(func); + return conn.connected(); +} + bool ModList::dropURLs(const QMimeData *mimeData, int row, const QModelIndex &parent) { QStringList source; diff --git a/src/modlist.h b/src/modlist.h index cdaa24ca..8cab7f3e 100644 --- a/src/modlist.h +++ b/src/modlist.h @@ -32,7 +32,7 @@ along with Mod Organizer. If not, see . #include #include #include - +#include #include #include #include @@ -61,6 +61,8 @@ public: COL_LASTCOLUMN = COL_PRIORITY }; + typedef boost::signals2::signal SignalModStateChanged; + public: /** @@ -94,10 +96,13 @@ public: void changeModPriority(int sourceIndex, int newPriority); + void modInfoAboutToChange(ModInfo::Ptr info); + void modInfoChanged(ModInfo::Ptr info); + public: /// \copydoc MOBase::IModList::state - virtual ModState state(const QString &name) const; + virtual ModStates state(const QString &name) const; /// \copydoc MOBase::IModList::priority virtual int priority(const QString &name) const; @@ -105,6 +110,9 @@ public: /// \copydoc MOBase::IModList::setPriority virtual bool setPriority(const QString &name, int newPriority); + /// \copydoc MOBase::IModList::onModStateChanged + virtual bool onModStateChanged(const std::function &func); + public: // implementation of virtual functions of QAbstractItemModel virtual int rowCount(const QModelIndex &parent = QModelIndex()) const; @@ -245,6 +253,11 @@ private: unsigned int categoryOrder; }; + struct TModInfoChange { + QString name; + QFlags state; + }; + private: Profile *m_Profile; @@ -258,6 +271,10 @@ private: bool m_DropOnItems; + TModInfoChange m_ChangeInfo; + + SignalModStateChanged m_ModStateChanged; + }; #endif // MODLIST_H diff --git a/src/nexusinterface.cpp b/src/nexusinterface.cpp index 936ff400..6a4ae046 100644 --- a/src/nexusinterface.cpp +++ b/src/nexusinterface.cpp @@ -22,8 +22,10 @@ along with Mod Organizer. If not, see . #include "utility.h" #include "json.h" #include "selectiondialog.h" +#include #include #include +#include using QtJson::Json; @@ -148,6 +150,13 @@ NexusInterface::NexusInterface() m_DiskCache = new QNetworkDiskCache(this); connect(m_AccessManager, SIGNAL(requestNXMDownload(QString)), this, SLOT(downloadRequestedNXM(QString))); + + + VS_FIXEDFILEINFO version = GetFileVersion(ToWString(QApplication::applicationFilePath())); + + m_MOVersion = VersionInfo(version.dwFileVersionMS >> 16, + version.dwFileVersionMS & 0xFFFF, + version.dwFileVersionLS >> 16); } @@ -396,8 +405,10 @@ void NexusInterface::nextRequest() QNetworkRequest request(url); request.setHeader(QNetworkRequest::ContentTypeHeader, "application/xml"); -#pragma message("automatically insert the correct version number") - request.setRawHeader("User-Agent", QString("Mod Organizer v1.0.5 (compatible to Nexus Client v%1)").arg(m_NMMVersion).toUtf8()); + request.setRawHeader("User-Agent", + QString("Mod Organizer v%1 (compatible to Nexus Client v%2)") + .arg(m_MOVersion.displayString()) + .arg(m_NMMVersion).toUtf8()); info.m_Reply = m_AccessManager->get(request); diff --git a/src/nexusinterface.h b/src/nexusinterface.h index 0b53f9d0..03226d8e 100644 --- a/src/nexusinterface.h +++ b/src/nexusinterface.h @@ -307,6 +307,7 @@ private: std::list m_ActiveRequest; QQueue m_RequestQueue; + MOBase::VersionInfo m_MOVersion; QString m_NMMVersion; }; diff --git a/src/organizer_ru.qm b/src/organizer_ru.qm index 1bae65a6..5921c2dc 100644 Binary files a/src/organizer_ru.qm and b/src/organizer_ru.qm differ diff --git a/src/organizer_ru.ts b/src/organizer_ru.ts index 2204198c..9b7b8101 100644 --- a/src/organizer_ru.ts +++ b/src/organizer_ru.ts @@ -1,4 +1,3 @@ - @@ -11,26 +10,26 @@ This is a list of esps and esms that were active when the save game was created. - Это ÑпиÑок ESP и ESM, которые были активны во Ð²Ñ€ÐµÐ¼Ñ ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ Ñейва. + Это ÑпиÑок esp и esm, которые были активны во Ð²Ñ€ÐµÐ¼Ñ ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ ÑохранениÑ. - <!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"> + <!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:'MS Shell Dlg 2'; font-size:8.25pt; 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=" font-size:8pt;">This is a list of esps and esms that were active when the save game was created.</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt;">For each esp, the right column contains the mod (or mods) that can be enabled to make the missing esps/esms available.</span></p> -<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt;">If you hit Ok, all the mods selected in the right columns and all missing esps that have become available will be activated.</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"> +</style></head><body style=" font-family:'MS Shell Dlg 2'; font-size:8.25pt; 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=" font-size:8pt;">This is a list of esps and esms that were active when the save game was created.</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt;">For each esp, the right column contains the mod (or mods) that can be enabled to make the missing esps/esms available.</span></p> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt;">If you hit Ok, all the mods selected in the right columns and all missing esps that have become available will be activated.</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:'MS Shell Dlg 2'; font-size:8.25pt; 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=" font-size:8pt;">Это ÑпиÑок ESP и ESM, которые были активны, когда Ñейв был Ñоздан..</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt;">Ð”Ð»Ñ ÐºÐ°Ð¶Ð´Ð¾Ð³Ð¾ ESP, правый Ñтолбец Ñодержит мод (или моды), которые могут быть включены, чтобы неактивные ESP / ESM Ñтали активными.</span></p> -<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt;">ЕÑли вы нажмете ОК, вÑе моды, выбранные в правой колонке будут активированы..</span></p></body></html> +</style></head><body style=" font-family:'MS Shell Dlg 2'; font-size:8.25pt; 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=" font-size:8pt;">Это ÑпиÑок ESP и ESM, которые были активны, когда Ñейв был Ñоздан..</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt;">Ð”Ð»Ñ ÐºÐ°Ð¶Ð´Ð¾Ð³Ð¾ ESP, правый Ñтолбец Ñодержит мод (или моды), которые могут быть включены, чтобы неактивные ESP / ESM Ñтали активными.</span></p> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt;">ЕÑли вы нажмете ОК, вÑе моды, выбранные в правой колонке будут активированы..</span></p></body></html> @@ -45,7 +44,7 @@ p, li { white-space: pre-wrap; } not found - Ðе найдено + не найдено @@ -73,8 +72,9 @@ p, li { white-space: pre-wrap; } Components of this package. -If there is a component called "00 Core" it is usually required. Options are ordered by priority as set up by the author. - Компоненты Ñтого пакета.ЕÑли еÑть компонент который называетÑÑ "00 Core", значит так надо. Параметры отÑортированы по приоритетноÑти Ñозданной автором. +If there is a component called "00 Core" it is usually required. Options are ordered by priority as set up by the author. + Компоненты Ñтого пакета. +ЕÑли еÑть компонент, называемый "00 Core", то Ñто обычно необходимо. Опции упорÑдочены по приоритету, уÑтановленному автором. @@ -91,7 +91,7 @@ If there is a component called "00 Core" it is usually required. Optio Opens a Dialog that allows custom modifications. - Открывает диалоговое окно, которое позволÑет выбрать пользовательÑкие модификации. + Открывает диалог, позволÑющий выбрать пользовательÑкие модификации. @@ -101,7 +101,7 @@ If there is a component called "00 Core" it is usually required. Optio Ok - ОК + Ок @@ -129,7 +129,7 @@ If there is a component called "00 Core" it is usually required. Optio Internal ID for the category. The categories a mod belongs to are stored by this ID. It is recommended you use new IDs for categories you add instead of re-using existing ones. - Внутренний ID категории. Категории мода хранÑÑ‚ÑÑ Ð² иÑтории под Ñтим ID. Это рекомендуетÑÑ Ð¸Ñпользовать при Ñоздании новых ID Ð´Ð»Ñ ÐºÐ°Ñ‚ÐµÐ³Ð¾Ñ€Ð¸Ð¹, чтобы повторно иÑпользовать уже ÑущеÑтвующие. + Внутренний ID категории. Категории мода хранÑÑ‚ÑÑ Ð² иÑтории под Ñтим ID. РекомендуетÑÑ Ð¸Ñпользовать новые ID Ð´Ð»Ñ Ð´Ð¾Ð±Ð°Ð²Ð»Ñемых вами категорий, вмеÑто повторного иÑÐ¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ ÑущеÑтвующих. @@ -154,20 +154,20 @@ If there is a component called "00 Core" it is usually required. Optio - <!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"> + <!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:'MS Shell Dlg 2'; font-size:8.25pt; 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=" font-size:8pt;">You can match one or multiple nexus categories to a internal ID. Whenever you download a mod from a Nexus Page, Mod Organizer will try to resolve the category defined on the Nexus to one available in MO.</span></p> -<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:8pt;"></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt;">To find out a category id used by the nexus, visit the categories list of the nexus page and hover over the links there.</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"> +</style></head><body style=" font-family:'MS Shell Dlg 2'; font-size:8.25pt; 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=" font-size:8pt;">You can match one or multiple nexus categories to a internal ID. Whenever you download a mod from a Nexus Page, Mod Organizer will try to resolve the category defined on the Nexus to one available in MO.</span></p> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:8pt;"></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt;">To find out a category id used by the nexus, visit the categories list of the nexus page and hover over the links there.</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:'MS Shell Dlg 2'; font-size:8.25pt; 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=" font-size:8pt;">Ð’Ñ‹ можете задать ÑоответÑтвие Ñ Ð¾Ð´Ð½Ð¾Ð¹ или неÑкольким категориÑм Ñ Ð²Ð½ÑƒÑ‚Ñ€ÐµÐ½Ð½Ð¸Ð¼Ð¸ ID. Каждый раз, когда вы загружаете мод Ñо Ñтраницы Nexus, МО автоматичеÑки поÑтараетÑÑ Ð·Ð°Ð´Ð°Ñ‚ÑŒ ÑоответÑтвие, как на Nexus.</span></p> -<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:8pt;"></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt;">Чтобы узнать идентификатор категории иÑпользуемого ÑоответÑтвиÑ, поÑетите ÑпиÑок категорий на Ñтранице СвÑзь и наведите курÑор мыши на нужную ÑÑылку.</span></p></body></html> +</style></head><body style=" font-family:'MS Shell Dlg 2'; font-size:8.25pt; 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=" font-size:8pt;">Ð’Ñ‹ можете задать одну или неÑколько категорий Nexus внутреннему ID. Каждый раз, когда вы загружаете мод Ñо Ñтраницы Nexus, МО поÑтараетÑÑ Ð°Ð²Ñ‚Ð¾Ð¼Ð°Ñ‚Ð¸Ñ‡ÐµÑки задать моду категорию, приÑвоенную ему на Nexus.</span></p> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:8pt;"></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt;">Чтобы узнать ID категории, иÑпользуемой на Nexus, перейдите в ÑпиÑок категорий Nexus и наведите курÑор мыши на нужную ÑÑылку.</span></p></body></html> @@ -199,7 +199,7 @@ p, li { white-space: pre-wrap; } - This feature may not work unless you're logged in with Nexus + This feature may not work unless you're logged in with Nexus Эта Ñ„ÑƒÐ½ÐºÑ†Ð¸Ñ Ð¼Ð¾Ð¶ÐµÑ‚ не работать, еÑли вход выполнен Ñ Nexus @@ -225,14 +225,10 @@ p, li { white-space: pre-wrap; } DirectoryRefresher - - failed to read %1: %2 - Ðе удалоÑÑŒ прочитать %1: %2 - failed to read bsa: %1 - + не удалоÑÑŒ прочитать bsa: %1 @@ -245,73 +241,63 @@ p, li { white-space: pre-wrap; } Filetime - Ждите + Дата модификации Done - Готово + Выполнено - Information missing, please select "Query Info" from the context menu to re-retrieve. - Ð˜Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ Ð¾Ñ‚ÑутÑтвует, пожалуйÑта, выберите пункт "Ð¡Ð¿Ñ€Ð°Ð²Ð¾Ñ‡Ð½Ð°Ñ Ð¸Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ" из контекÑтного меню. + Information missing, please select "Query Info" from the context menu to re-retrieve. + Ð˜Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ Ð¾Ñ‚ÑутÑтвует, пожалуйÑта, выберите пункт "Ð¡Ð¿Ñ€Ð°Ð²Ð¾Ñ‡Ð½Ð°Ñ Ð¸Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ" из контекÑтного меню. DownloadListWidget - + Placeholder Заполнитель - - 0 - - - - - KB - - - - + + - Done - Double Click to install Готово - двойной щелчок Ð´Ð»Ñ ÑƒÑтановки. + - Paused - Double Click to resume - + Пауза - двойной клик Ð´Ð»Ñ Ð¿Ñ€Ð¾Ð´Ð¾Ð»Ð¶ÐµÐ½Ð¸Ñ + - Installed - Double Click to re-install УÑтановлено - двойной клик Ð´Ð»Ñ Ð¿ÐµÑ€ÐµÑƒÑтановки + - Uninstalled - Double Click to re-install - + Удалено - двойной клик Ð´Ð»Ñ Ð¿ÐµÑ€ÐµÑƒÑтановки DownloadListWidgetCompact - + Placeholder Заполнитель - + Done Готово @@ -319,120 +305,120 @@ p, li { white-space: pre-wrap; } DownloadListWidgetCompactDelegate - + + Paused + ПриоÑтановлено + + + + Fetching Info 1 + Извлечение информации 1 + + + + Fetching Info 2 + Извлечение информации 2 + + + Installed УÑтановлено - + Uninstalled - + Удалено - + Done Готово - - - - + + + + Are you sure? Ð’Ñ‹ уверены? - + This will remove all finished downloads from this list and from disk. Это удалит вÑе готовые загрузки из Ñтого ÑпиÑка и Ñ Ð´Ð¸Ñка. - + This will remove all installed downloads from this list and from disk. Это удалит вÑе уÑтановленные загрузки из Ñтого ÑпиÑка и Ñ Ð´Ð¸Ñка. - + This will permanently remove all finished downloads from this list (but NOT from disk). - + Это полноÑтью удалит вÑе завершенные загрузки из Ñтого ÑпиÑка (но ÐЕ Ñ Ð´Ð¸Ñка). - + This will permanently remove all installed downloads from this list (but NOT from disk). - + Это полноÑтью удалит вÑе уÑтановленные загрузки из Ñтого ÑпиÑка (но ÐЕ Ñ Ð´Ð¸Ñка). - + Install УÑтановка - + Query Info Ð¡Ð¿Ñ€Ð°Ð²Ð¾Ñ‡Ð½Ð°Ñ Ð¸Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ - + Delete - + Удалить - + Remove from View - - - - - Remove - Удаление + Скрыть от проÑмотра - + Cancel Отмена - - Paused - - - - - Fetching Info 1 - - - - - Fetching Info 2 - - - - + Pause Пауза - + + Remove + Удаление + + + Resume Возобновить - + Delete Installed... - + Удалить уÑтановленное... - + Delete All... - + Удалить вÑе... - + Remove Installed... Отменить уÑтановку - + Remove All... Удалить вÑе @@ -440,100 +426,100 @@ p, li { white-space: pre-wrap; } DownloadListWidgetDelegate - - - - + + Fetching Info 1 + Извлечение информации 1 + + + + Fetching Info 2 + Извлечение информации 2 + + + + + + Are you sure? Ð’Ñ‹ уверены? - + This will remove all finished downloads from this list and from disk. Это удалит вÑе готовые загрузки из Ñтого ÑпиÑка и Ñ Ð´Ð¸Ñка. - + This will remove all installed downloads from this list and from disk. Это удалит вÑе уÑтановленные загрузки из Ñтого лиÑта и Ñ Ð´Ð¸Ñка. - + This will remove all finished downloads from this list (but NOT from disk). - + Это удалит вÑе готовые загрузки из Ñтого ÑпиÑка (но ÐЕ Ñ Ð´Ð¸Ñка). - + This will remove all installed downloads from this list (but NOT from disk). - + Это удалит вÑе уÑтановленные загрузки из Ñтого ÑпиÑка (но ÐЕ Ñ Ð´Ð¸Ñка). - + Install УÑтановить - + Query Info Ð¡Ð¿Ñ€Ð°Ð²Ð¾Ñ‡Ð½Ð°Ñ Ð¸Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ - + Delete - + Удалить - + Remove from View - - - - - Remove - Удалить + Скрыть от проÑмотра - + Cancel Отмена - - Fetching Info 1 - - - - - Fetching Info 2 - + + Pause + Пауза - Pause - Пауза + Remove + Удалить - + Resume Возобновить - + Delete Installed... - + Удалить уÑтановленное... - + Delete All... - + Удалить вÑе... - + Remove Installed... Удалить уÑтановленные - + Remove All... Удалить вÑе @@ -541,109 +527,103 @@ p, li { white-space: pre-wrap; } DownloadManager - - failed to rename "%1" to "%2" - Ðе удалоÑÑŒ переименовать "%1" в "%2" + + failed to rename "%1" to "%2" + не удалоÑÑŒ переименовать "%1" в "%2" - + Download again? Скачать Ñнова - + A file with the same name has already been downloaded. Do you want to download it again? The new file will receive a different name. Файл Ñ Ñ‚Ð°ÐºÐ¸Ð¼ именем загружен. Ð’Ñ‹ хотите загрузить его Ñнова? У него будет другое имÑ. - + failed to download %1: could not open output file: %2 - Ошибка загрузки %1: не удалоÑÑŒ открыть входÑщий файл: %2 - - - - - - - - - - - - - + не удалоÑÑŒ загрузить %1: не удалоÑÑŒ открыть выходной файл: %2 + + + + + + + + + + + + invalid index - Ðеверный Ð¸Ð½Ð´ÐµÐºÑ + неверный Ð¸Ð½Ð´ÐµÐºÑ - + failed to delete %1 - Ðе удалоÑÑŒ удалить %1 + не удалоÑÑŒ удалить %1 - + failed to delete meta file for %1 - Ðе удалоÑÑŒ удалить мета файл %1 + не удалоÑÑŒ удалить мета-файл %1 - - - - - - + + + + + invalid index %1 - Ðеверный Ð¸Ð½Ð´ÐµÐºÑ %1 + неверный Ð¸Ð½Ð´ÐµÐºÑ %1 - + Please enter the nexus mod id - Выберите ID мода Ñ Nexus + ПожалуйÑта, введите ID мода на Nexus - + Mod ID: ID мода: - invalid alphabetical index %1 - ÐедейÑтвительный алфавитный указатель %1 - - - + Information updated Ð˜Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ Ð¾Ð±Ð½Ð¾Ð²Ð»ÐµÐ½Ð° - - + + No matching file found on Nexus! Maybe this file is no longer available or it was renamed? Ðет ÑоответÑтвующих модов на Nexus! Возможно фал был удален или переименован? - + No file on Nexus matches the selected file by name. Please manually choose the correct one. Ðет ÑоответÑтвующих фалов на Nexus. Выберите файл вручную. - + No download server available. Please try again later. Сервер недоÑтупен. Попробуйте позже. - + Failed to request file info from nexus: %1 Ðе удалоÑÑŒ получить информацию о файле: %1 - + Download failed: %1 (%2) Загрузка не удалаÑÑŒ: %1 (%2) - + failed to re-open %1 - Ðе удалоÑÑŒ открыть %1 + не удалоÑÑŒ повторно открыть %1 @@ -720,14 +700,16 @@ p, li { white-space: pre-wrap; } Allow the Steam AppID to be used for this executable to be changed. - Разрешить Steam AppID. Ð”Ð»Ñ Ð¸ÑÐ¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ Ð¸ÑполнÑемый файл будет изменен. + Разрешить изменение Steam AppID, иÑпользуемого Ð´Ð»Ñ Ñтого иÑполнÑемого файла. Allow the Steam AppID to be used for this executable to be changed. Every game/tool distributed through Steam has a unique ID. MO needs to know this ID to start those programs directly, otherwise the program is started by steam and then MO will not work. By default, MO will use the AppID for the game. Right now the only case I know of where this needs to be overwritten is for the Skyrim Creation Kit which has its own AppID. This overwrite is already preconfigured. - Разрешить Steam AppID, который будет иÑпользоватьÑÑ Ð´Ð»Ñ Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð¸ÑполнÑемого файла. ÐšÐ°Ð¶Ð´Ð°Ñ Ð¸Ð³Ñ€Ð°\инÑтрумент раcпроÑтранÑетÑÑ Ñ‡ÐµÑ€ÐµÐ· Steam и имеет уникальный ID. MO необходимо знать Ñтот ID, что бы активировать игру\инÑтрумент, иначе придетÑÑ Ð·Ð°Ð¿ÑƒÑкать через Steam. По умолчанию MO будет иÑпользовать AppID Ð´Ð»Ñ Ð¸Ð³Ñ€Ñ‹\инÑтрумента.Возможны проблемы Ñ ID Ñоздаваемыми в Skyrim Creation Kit. + Разрешить изменение Steam AppID, который будет иÑпользоватьÑÑ Ð´Ð»Ñ Ð¸ÑполнÑемого файла. +ÐšÐ°Ð¶Ð´Ð°Ñ Ð¸Ð³Ñ€Ð°/инÑтрумент раÑпроÑтранÑемые через Steam имеют Ñвой уникальный ID. MO необходимо знать Ñтот ID Ð´Ð»Ñ Ð¿Ñ€Ñмого запуÑка Ñтих программ, иначе они будут запущены через Steam и MO работать не будет. По умолчанию MO будет иÑпользовать AppID Ð´Ð»Ñ Ð¸Ð³Ñ€Ñ‹. +Ð’ данный момент единÑтвенный Ñлучай, где Ñто должно быть перезапиÑано Ñто Skyrim Creation Kit, который имеет Ñвой ÑобÑтвенный AppID. Эта замена уже предварительно Ñконфигурирована. @@ -744,7 +726,9 @@ Right now the only case I know of where this needs to be overwritten is for the Steam AppID to use for this executable that differs from the games AppID. Every game/tool distributed through Steam has a unique ID. MO needs to know this ID to start those programs directly, otherwise the program is started by steam and then MO will not work. By default, MO will use the AppID for the game (usually 72850). Right now the only case I know of where this needs to be overwritten is for the Skyrim Creation Kit which has its own AppID (usually 202480). This overwrite is already preconfigured. - Steam AppID, который будет иÑпользоватьÑÑ Ð´Ð»Ñ Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð¸ÑполнÑемого файла. ÐšÐ°Ð¶Ð´Ð°Ñ Ð¸Ð³Ñ€Ð°\инÑтрумент раcпроÑтранÑетÑÑ Ñ‡ÐµÑ€ÐµÐ· Steam и имеет уникальный ID. MO необходимо знать Ñтот ID, что бы активировать игру\инÑтрумент, иначе придетÑÑ Ð·Ð°Ð¿ÑƒÑкать через Steam. По умолчанию MO будет иÑпользовать AppID Ð´Ð»Ñ Ð¸Ð³Ñ€Ñ‹\инÑтрумента.Возможны проблемы Ñ ID Ñоздаваемыми в Skyrim Creation Kit. + Steam AppID, иÑпользуемый Ð´Ð»Ñ Ñтого иÑполнÑемого файла, отличающийÑÑ Ð¾Ñ‚ AppID других игр. +ÐšÐ°Ð¶Ð´Ð°Ñ Ð¸Ð³Ñ€Ð°/инÑтрумент раÑпроÑтранÑемые через Steam имеют Ñвой уникальный ID. MO необходимо знать Ñтот ID Ð´Ð»Ñ Ð¿Ñ€Ñмого запуÑка Ñтих программ, иначе они будут запущены через Steam и MO работать не будет. По умолчанию MO будет иÑпользовать AppID Ð´Ð»Ñ Ð¸Ð³Ñ€Ñ‹ (обычно 72850). +Ð’ данный момент единÑтвенный Ñлучай, где он должен быть перезапиÑан, Ñто Ð´Ð»Ñ Skyrim Creation Kit, который имеет Ñвой ÑобÑтвенный AppID (обычно 202480). Эта замена уже предварительно Ñконфигурирована. @@ -794,12 +778,12 @@ Right now the only case I know of where this needs to be overwritten is for the Java (32-bit) required - + ТребуетÑÑ Java (32-bit) MO requires 32-bit java to run this application. If you already have it installed, select javaw.exe from that installation as the binary. - + MO требует 32-bit java Ð´Ð»Ñ Ð·Ð°Ð¿ÑƒÑка Ñтого приложениÑ. ЕÑли он у Ð²Ð°Ñ ÑƒÐ¶Ðµ уÑтановлен, выберете javaw.exe Ð´Ð»Ñ Ñтой уÑтановки как иÑполнÑемый файл. @@ -813,8 +797,8 @@ Right now the only case I know of where this needs to be overwritten is for the - Really remove "%1" from executables? - ДейÑтвительно удалить "%1" иÑполнÑемых? + Really remove "%1" from executables? + ДейÑтвительно удалить "%1" иÑполнÑемых? @@ -843,7 +827,7 @@ Right now the only case I know of where this needs to be overwritten is for the Search term - ПоиÑк терминала + ПоиÑк термина @@ -893,8 +877,8 @@ Right now the only case I know of where this needs to be overwritten is for the - <a href="#">Link</a> - <a href="#">ÑÑылка</a> + <a href="#">Link</a> + <a href="#">СÑылка</a> @@ -916,58 +900,6 @@ Right now the only case I know of where this needs to be overwritten is for the Cancel Отмена - - ModuleConfig.xml missing - ModuleConfig.xml отÑутÑтвует - - - failed to parse info.xml: %1 (%2) (line %3, column %4) - не удалоÑÑŒ проанализировать info.xml: %1 (%2) (Ñтрока %3, Ñтолбец %4) - - - unsupported order type %1 - не поддерживаемый тип порÑдка %1 - - - unsupported group type %1 - не поддерживаемый тип группы %1 - - - This component is required - Этот компонент необходим - - - It is recommended you enable this component - РекомендуетÑÑ Ð²ÐºÐ»ÑŽÑ‡Ð¸Ñ‚ÑŒ Ñтот компонент - - - Optional component - Дополнительный компонент - - - This component is not usable in combination with other installed plugins - Этот компонент не может ÑочетатьÑÑ Ñ Ð´Ñ€ÑƒÐ³Ð¸Ð¼Ð¸ уÑтановленными плагинами. - - - You may be experiencing instability in combination with other installed plugins - Могут наблюдатьÑÑ Ð½ÐµÑтабильноÑть в Ñочетании Ñ Ð´Ñ€ÑƒÐ³Ð¸Ð¼Ð¸ уÑтановленными плагинами. - - - None - Ðи один - - - Select one or more of these options: - Выберите один или неÑколько из Ñледующих вариантов: - - - failed to parse ModuleConfig.xml: %1 - не удаетÑÑ Ð¿Ñ€Ð¾Ð°Ð½Ð°Ð»Ð¸Ð·Ð¸Ñ€Ð¾Ð²Ð°Ñ‚ÑŒ ModuleConfig.xml: %1 - - - Install - УÑтановить - InstallDialog @@ -993,7 +925,7 @@ Right now the only case I know of where this needs to be overwritten is for the - Pick a name for the mod. This is also used as a directory name, so please don't use characters that are illegal in file names. + Pick a name for the mod. This is also used as a directory name, so please don't use characters that are illegal in file names. Выбери Ð¸Ð¼Ñ Ð´Ð»Ñ Ð¼Ð¾Ð´Ð°. Это также иÑпользуетÑÑ Ð² качеÑтве имени каталога, поÑтому, пожалуйÑта, не иÑпользуйте Ñимволы, которые запрещены в именах файлов. @@ -1008,16 +940,16 @@ Right now the only case I know of where this needs to be overwritten is for the - <!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"> + <!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:'MS Shell Dlg 2'; font-size:8.25pt; 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=" font-size:8pt;">This displays the content of the archive. &lt;data&gt; represents the base directory which will map to the game's data directory. You can change the base directory via the right-click context menu and you can move around files via drag&amp;drop</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"> +</style></head><body style=" font-family:'MS Shell Dlg 2'; font-size:8.25pt; 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=" font-size:8pt;">This displays the content of the archive. &lt;data&gt; represents the base directory which will map to the game's data directory. You can change the base directory via the right-click context menu and you can move around files via drag&amp;drop</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:'MS Shell Dlg 2'; font-size:8.25pt; 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=" font-size:8pt;">Это показывает Ñодержимое архива. <data> предÑтавлÑет базовый каталог, в котором будут ÑопоÑтавлены Ñ Ð´Ð°Ð½Ð½Ñ‹Ð¼Ð¸ каталога игры. Ð’Ñ‹ можете изменить базовый каталог Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ правой кнопкой мыши через контекÑтное меню, и можете перемещатьÑÑ Ð¿Ð¾ файлам Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ drag&drop.</span></p></body></html> +</style></head><body style=" font-family:'MS Shell Dlg 2'; font-size:8.25pt; 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=" font-size:8pt;">Отображает Ñодержимое архива. &lt;data&gt; предÑтавлÑет базовый каталог, данные в котором будут ÑопоÑтавлены Ñ Ð´Ð°Ð½Ð½Ñ‹Ð¼Ð¸ каталога игры. Ð’Ñ‹ можете изменить базовый каталог нажатием правой кнопки мыши, через контекÑтное меню, а также можете перемещатьÑÑ Ð¿Ð¾ файлам Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ drag&amp;drop</span></p></body></html> @@ -1027,59 +959,20 @@ p, li { white-space: pre-wrap; } OK - + OK Cancel Отмена - - Looks good - ВыглÑдит хорошо - - - No problem detected - Проблем не обнаружено - - - No game data on top level - Ðет данных игры уровнем выше - - - There is no esp/esm file or asset directory (textures, meshes, interface, ...) on the top level. - СущеÑтвующий ESP / ESM файла или каталога не имеет текÑтуры textures, meshes, interface, ... уровнем выше. - - - Enter a directory name - Введите Ð¸Ð¼Ñ ÐºÐ°Ñ‚Ð°Ð»Ð¾Ð³Ð° - - - A directory with that name exists - Каталог Ñ Ñ‚Ð°ÐºÐ¸Ð¼ именем не ÑущеÑтвует - - - Set data directory - Ðабор данных каталога - - - Unset data directory - Отключенный каталог данных - - - Create directory... - Создать директорию... - - - &Open - &Открыть - InstallationManager - mo_archive.dll not loaded: "%1" - mo_archive.dll не загружен: "%1" + + archive.dll not loaded: "%1" + archive.dll не загружен: "%1" @@ -1092,158 +985,91 @@ p, li { white-space: pre-wrap; } Пароль - Directory exists - Каталог ÑущеÑтвует - - - This mod seems to be installed already. Do you want to add files from this archive (overwriting existing ones) or do you want to completely replace the existing files (old files are deleted)? - Этот мод, кажетÑÑ, уже уÑтановлен. Ð’Ñ‹ хотите перезапиÑать ÑущеÑтвующие или вы хотите полноÑтью заменить ÑущеÑтвующие файлы (Ñтарые файлы удалÑÑŽÑ‚ÑÑ)? - - - Add Files - Добавить файлы - - - Replace - Заменить - - - - - + + + Extracting files Извлечение файлов - Preparing installer - Подготовка к уÑтановке - - - Installation as fomod failed: %1 - УÑтановка в fomod не удалаÑÑŒ: %1 - - - failed to start %1 - Ðе удалоÑÑŒ начать %1 - - - Running external installer. -Note: This installer will not be aware of other installed mods! - ЗапуÑк внешней уÑтановки. -Внимание: Других запущенных программ уÑтановки не должно быть! - - - Force Close - Закрыть принудительно - - - Confirm - Подтвердить - - - installation failed (errorcode %1) - УÑтановка не удалаÑÑŒ (errorcode %1) - - - - File format "%1" not supported - Формат файла "%1" не поддерживаетÑÑ - - - failed to open archive "%1": %2 - Ðе удалоÑÑŒ открыть архив "%1": %2 - - - - archive.dll not loaded: "%1" - - - - + failed to create backup - + не удалоÑÑŒ Ñоздать резервную копию - + Mod Name - + Ð˜Ð¼Ñ Ð¼Ð¾Ð´Ð° - + Name Ð˜Ð¼Ñ - + Invalid name - + ÐедопуÑтимое Ð¸Ð¼Ñ - + The name you entered is invalid, please enter a different one. - - - - Installer missing - УÑтановщик отÑутÑтвует - - - This package contains a scripted installer. To use this installer you need the optional "NCC"-package and the .net runtime. Do you want to continue, treating this as a manual installer? - Этот пакет Ñодержит Ñценарии уÑтановки. Ð”Ð»Ñ Ð¸ÑÐ¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ Ñтой уÑтановки необходимо дополнительно «NCC» пакет и .net runtime. Ð’Ñ‹ хотите иÑпользовать Ñто в качеÑтве уÑтановки? + Введенное вами Ð¸Ð¼Ñ Ð½ÐµÐ´Ð¾Ð¿ÑƒÑтимо, пожалуйÑта введите другое. - Please install NCC - УÑтановите NCC + + File format "%1" not supported + Формат файла "%1" не поддерживаетÑÑ - + None of the available installer plugins were able to handle that archive - + Ðе один из доÑтупных плагинов-уÑтановщиков не Ñмог проÑмотреть Ñтот архив - + no error - Ошибки отÑутÑтвуют + ошибки отÑутÑтвуют - + 7z.dll not found 7z.dll не найден - - 7z.dll isn't valid + + 7z.dll isn't valid 7z.dll поврежден - + archive not found - Ðрхив не найден + архив не найден - + failed to open archive - Ошибка Ð¾Ñ‚ÐºÑ€Ñ‹Ñ‚Ð¸Ñ Ð°Ñ€Ñ…Ð¸Ð²Ð° + не удалоÑÑŒ открыть архив - + unsupported archive type - Ðе поддерживаемый тип архива + не поддерживаемый тип архива - + internal library error - ВнутреннÑÑ Ð¾ÑˆÐ¸Ð±ÐºÐ° библиотеки + внутреннÑÑ Ð¾ÑˆÐ¸Ð±ÐºÐ° библиотеки - + archive invalid - Ðрхив поврежден + архив поврежден - + unknown archive error - ÐеизвеÑÑ‚Ð½Ð°Ñ Ð¾ÑˆÐ¸Ð±ÐºÐ° архива + неизвеÑÑ‚Ð½Ð°Ñ Ð¾ÑˆÐ¸Ð±ÐºÐ° архива @@ -1255,8 +1081,8 @@ Note: This installer will not be aware of other installed mods! - This dialog should disappear automatically if the application/game is done. Click unlock if it didn't. - Это окно должно закрытьÑÑ Ð°Ð²Ñ‚Ð¾Ð¼Ð°Ñ‚Ð¸Ñ‡ÐµÑки еÑли игра запущена. Ðажмите кнопку "Разблокировать" еÑли Ñтого не произошло. + This dialog should disappear automatically if the application/game is done. Click unlock if it didn't. + Этот диалог должен закрытьÑÑ Ð°Ð²Ñ‚Ð¾Ð¼Ð°Ñ‚Ð¸Ñ‡ÐµÑки еÑли игра/приложение запущены. Ðажмите разблокировать, еÑли Ñтого не произошло. @@ -1274,7 +1100,7 @@ Note: This installer will not be aware of other installed mods! failed to write log to %1: %2 - Ðе удалоÑÑŒ произвеÑти запиÑÑŒ в журнал %1: %2 + не удалоÑÑŒ произвеÑти запиÑÑŒ в журнал %1: %2 @@ -1282,12 +1108,12 @@ Note: This installer will not be aware of other installed mods! an error occured: %1 - + произошла ошибка: %1 an error occured - + произошла ошибка @@ -1301,148 +1127,169 @@ Note: This installer will not be aware of other installed mods! Profile - + Профиль Pick a module collection - + Выберете набор модулей - <!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"> + <!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:'MS Shell Dlg 2'; font-size:8.25pt; 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=" font-size:8pt;">Create profiles here. Each profile contains its own list of active mods and esps. This way you can quickly switch between setups for different play throughs.</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt;">Please note that right now your esp load order is not kept seperate for different profiles.</span></p></body></html> - +</style></head><body style=" font-family:'MS Shell Dlg 2'; font-size:8.25pt; 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=" font-size:8pt;">Create profiles here. Each profile contains its own list of active mods and esps. This way you can quickly switch between setups for different play throughs.</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt;">Please note that right now your esp load order is not kept seperate for different profiles.</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:'MS Shell Dlg 2'; font-size:8.25pt; 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=" font-size:8pt;">Создать профили здеÑÑŒ. Каждый профиль включает Ñвой ÑобÑтвенный ÑпиÑок активных модов и esp. Таким образом, вы можете быÑтро переключатьÑÑ Ð¼ÐµÐ¶Ð´Ñƒ уÑтановками Ð´Ð»Ñ Ñ€Ð°Ð·Ð»Ð¸Ñ‡Ð½Ñ‹Ñ… прохождений игры.</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt;">Обратите внимание, что порÑдок загрузки esp одинаков Ð´Ð»Ñ Ð²Ñех профилей.</span></p></body></html> Refresh list - + Обновить ÑпиÑок Refresh list. This is usually not necessary unless you modified data outside the program. - + Обновить ÑпиÑок. Обычно в Ñтом нет необходимоÑти, пока вы не измените данные вне программы. List of available mods. - + СпиÑок доÑтупных модов. - This is a list of installed mods. Use the checkboxes to activate/deactivate mods and drag & drop mods to change their "installation" orders. - + This is a list of installed mods. Use the checkboxes to activate/deactivate mods and drag & drop mods to change their "installation" orders. + Это ÑпиÑок уÑтановленных модов. ИÑпользуйте флажки, Ð´Ð»Ñ Ð²ÐºÐ»ÑŽÑ‡ÐµÐ½Ð¸Ñ/Ð¾Ñ‚ÐºÐ»ÑŽÑ‡ÐµÐ½Ð¸Ñ Ð¼Ð¾Ð´Ð¾Ð² и перетаÑкивание модов, Ð´Ð»Ñ Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð¸Ñ… порÑдка уÑтановки. Filter - + Фильтр No groups - + Без группировки Nexus IDs - Nexus IDs + Nexus IDs - + Namefilter - + Фильтр по имени Pick a program to run. - + Выберете программу Ð´Ð»Ñ Ð·Ð°Ð¿ÑƒÑка. - <!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"> + <!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:'MS Shell Dlg 2'; font-size:8.25pt; 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=" font-size:8pt;">Choose the program to run. Once you start using ModOrganizer, you should always run your game and tools from here or through shortcuts created here, otherwise mods installed through MO will not be visible.</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt;">You can add new Tools to this list, but I can't promise tools I haven't tested will work.</span></p></body></html> - +</style></head><body style=" font-family:'MS Shell Dlg 2'; font-size:8.25pt; 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=" font-size:8pt;">Choose the program to run. Once you start using ModOrganizer, you should always run your game and tools from here or through shortcuts created here, otherwise mods installed through MO will not be visible.</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt;">You can add new Tools to this list, but I can't promise tools I haven't tested will work.</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:'MS Shell Dlg 2'; font-size:8.25pt; 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=" font-size:8pt;">Выберете программу Ð´Ð»Ñ Ð·Ð°Ð¿ÑƒÑка. Как только вы начинаете иÑпользовать ModOrganizer, вы вÑегда должны запуÑкать игры и инÑтрументы из него или через Ñозданные в нем Ñрлыки, в противном Ñлучае, уÑтановленные через MO моды отображатьÑÑ Ð½Ðµ будут.</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt;">Ð’Ñ‹ можете добавить новые инÑтрументы в Ñтот ÑпиÑок, но работоÑпоÑобноÑть их вÑех не гарантированна.</span></p></body></html> Run program - + ЗапуÑтить программу - <!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"> + <!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:'MS Shell Dlg 2'; font-size:8.25pt; 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=" font-size:8pt;">Run the selected program with ModOrganizer enabled.</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:'MS Shell Dlg 2'; font-size:8.25pt; 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=" font-size:8pt;">Run the selected program with ModOrganizer enabled.</span></p></body></html> - +</style></head><body style=" font-family:'MS Shell Dlg 2'; font-size:8.25pt; 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=" font-size:8pt;">ЗапуÑтить выбранную программу Ñ Ð¿Ð¾Ð´Ð´ÐµÑ€Ð¶ÐºÐ¾Ð¹ ModOrganizer.</span></p></body></html> Run - + ЗапуÑтить Create a shortcut in your start menu or on the desktop to the specified program - + Создать Ñрлык Ð´Ð»Ñ Ð²Ñ‹Ð±Ñ€Ð°Ð½Ð½Ð¾Ð¹ программы, в меню ПуÑк или на рабочем Ñтоле. - <!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"> + <!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:'MS Shell Dlg 2'; font-size:8.25pt; 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=" font-size:8pt;">This creates a start menu shortcut that directly starts the selected program with the MO active.</span></p></body></html> - +</style></head><body style=" font-family:'MS Shell Dlg 2'; font-size:8.25pt; 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=" font-size:8pt;">This creates a start menu shortcut that directly starts the selected program with the MO active.</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:'MS Shell Dlg 2'; font-size:8.25pt; 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=" font-size:8pt;">Создает Ñрлык в меню ПуÑк, который запуÑкает выбранную программу Ñ Ð°ÐºÑ‚Ð¸Ð²Ð½Ñ‹Ð¼ MO.</span></p></body></html> Shortcut - - - - Save - Сохранить + Ярлык List of available esp/esm files - + СпиÑок доÑтупных esp/esm файлов - <!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"> + <!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:'MS Shell Dlg 2'; font-size:8.25pt; 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=" font-size:8pt;">This list contains the esps and esms contained in the active mods. These require their own load order. Use drag&amp;drop to modify this load order. Please note that MO will only save the load order for mods that are active/checked.<br />There is a great tool named &quot;BOSS&quot; to automatically sort these files.</span></p></body></html> - +</style></head><body style=" font-family:'MS Shell Dlg 2'; font-size:8.25pt; 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=" font-size:8pt;">This list contains the esps and esms contained in the active mods. These require their own load order. Use drag&amp;drop to modify this load order. Please note that MO will only save the load order for mods that are active/checked.<br />There is a great tool named &quot;BOSS&quot; to automatically sort these files.</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:'MS Shell Dlg 2'; font-size:8.25pt; 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=" font-size:8pt;">Этот ÑпиÑок Ñодержит esp и esm файлы активных модов. Ð”Ð»Ñ Ð½Ð¸Ñ… требуетÑÑ Ð¾Ð¿Ñ€ÐµÐ´ÐµÐ»ÐµÐ½Ð½Ñ‹Ð¹ порÑдок загрузки. ИÑпользуйте перетаÑкивание Ð´Ð»Ñ Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð¿Ð¾Ñ€Ñдка загрузки. Обратите внимание, что MO Ñохранит порÑдок загрузки только Ð´Ð»Ñ Ð°ÐºÑ‚Ð¸Ð²Ð½Ñ‹Ð¼Ð¸/проверенных модов.<br />СущеÑтвует Ð·Ð°Ð¼ÐµÑ‡Ð°Ñ‚ÐµÐ»ÑŒÐ½Ð°Ñ ÑƒÑ‚Ð¸Ð»Ð¸Ñ‚Ð°, называющаÑÑÑ &quot;BOSS&quot; , ÐºÐ¾Ñ‚Ð¾Ñ€Ð°Ñ Ð°Ð²Ñ‚Ð¾Ð¼Ð°Ñ‚Ð¸Ñ‡ÐµÑки Ñортирует Ñти файлы.</span></p></body></html> List of available BS Archives. Archives not checked here are not managed by MO and ignore installation order. - + СпиÑок доÑтупных BSA. Они не отмечены здеÑÑŒ, не управлÑÑŽÑ‚ÑÑ Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ MO и игнорируют порÑдок уÑтановки. - BSA files are archives (comparable to .zip files) that contain data assets (meshes, textures, ...) to be used by the game. As such they "compete" with loose files in your data directory over which is loaded. + BSA files are archives (comparable to .zip files) that contain data assets (meshes, textures, ...) to be used by the game. As such they "compete" with loose files in your data directory over which is loaded. By default, BSAs that share their base name with an enabled ESP (i.e. plugin.esp and plugin.bsa) are automatically loaded and will have precedence over all loose files, the installation order you set up to the left is then ignored! BSAs checked here are loaded in such a way that your installation order is obeyed properly. - + BSA файлы - архивы (ÑопоÑтавимы Ñ Ñ„Ð°Ð¹Ð»Ð°Ð¼Ð¸ .zip) которые Ñодержат иÑпользуемые игрой данные (meshes, textures, ...). Как таковые они "конкурируют" Ñ Ð¾Ñ‚Ð´ÐµÐ»ÑŒÐ½Ñ‹Ð¼Ð¸ файлами в папке Data, поверх которых загружены. +По умолчанию, BSA, у которых Ð¸Ð¼Ñ Ñовпадает Ñ Ð¸Ð¼ÐµÐ½ÐµÐ¼ ESP (Ñ‚.е. plugin.esp и plugin.bsa) будут автоматичеÑки загружены и будут иметь приоритет над вÑеми отдельными файлами и уÑтановленный вами Ñлева порÑдок уÑтановки будет проигнорирован! + +BSA, отмеченные здеÑÑŒ, загружаютÑÑ Ñ‚Ð°Ðº, чтобы порÑдок уÑтановки ÑоблюдалÑÑ Ð´Ð¾Ð»Ð¶Ð½Ñ‹Ð¼ образом. @@ -1458,1030 +1305,1035 @@ BSAs checked here are loaded in such a way that your installation order is obeye - <html><head/><body><p>Marked Archives (<img src=":/MO/gui/resources/dialog-warning_16.png"/>) are still loaded on Skyrim but the <a href="http://forums.bethsoft.com/topic/1354395-update-bsas-and-you/"><span style=" text-decoration: underline; color:#0000ff;">regular file override</span></a> mechanism will apply: Loose files override BSAs, no matter the mod/plugin priority.</p></body></html> - + <html><head/><body><p>Marked Archives (<img src=":/MO/gui/resources/dialog-warning_16.png"/>) are still loaded on Skyrim but the <a href="http://forums.bethsoft.com/topic/1354395-update-bsas-and-you/"><span style=" text-decoration: underline; color:#0000ff;">regular file override</span></a> mechanism will apply: Loose files override BSAs, no matter the mod/plugin priority.</p></body></html> + <html><head/><body><p>Помеченые архивы (<img src=":/MO/gui/resources/dialog-warning_16.png"/>) вÑе еще загружаютÑÑ Ð² Skyrim, но <a href="http://forums.bethsoft.com/topic/1354395-update-bsas-and-you/"><span style=" text-decoration: underline; color:#0000ff;">применÑетÑÑ Ð¾Ð±Ñ‹Ñ‡Ð½Ñ‹Ð¹</span></a> механизм: Отдельные файлы перезапиÑывают BSAs, вне завиÑимоÑти от приоритета мода/плагина.</p></body></html> Data - + Данные refresh data-directory overview - + обновить обзор каталога Data Refresh the overview. This may take a moment. - + Обновление обзора. Это может занÑть некоторое времÑ. - - + + Refresh - + Обновить This is an overview of your data directory as visible to the game (and tools). - + Это обзор вашего каталога данных так, как он будет видим игре (и инÑтрументам). Filter the above list so that only conflicts are displayed. - + Отфильтровать вышеприведенный ÑпиÑок так, чтобы отображалиÑÑŒ только конфликты. Show only conflicts - + Показать только конфликты Saves - + Ð¡Ð¾Ñ…Ñ€Ð°Ð½ÐµÐ½Ð¸Ñ - <!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"> + <!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:'MS Shell Dlg 2'; font-size:8.25pt; 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=" font-size:8pt;">This is a list of all savegames for this game. Hover over a list entry to get detailed information about the save including a list of esps/esms that were used at the time this save was created but aren't active now.</span></p> -<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:8pt;"></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt;">If you click &quot;Fix Mods...&quot; in the context menu, MO will try to activate all mods and esps to fix those missing esps. It will not disable anything!</span></p></body></html> - +</style></head><body style=" font-family:'MS Shell Dlg 2'; font-size:8.25pt; 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=" font-size:8pt;">This is a list of all savegames for this game. Hover over a list entry to get detailed information about the save including a list of esps/esms that were used at the time this save was created but aren't active now.</span></p> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:8pt;"></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt;">If you click &quot;Fix Mods...&quot; in the context menu, MO will try to activate all mods and esps to fix those missing esps. It will not disable anything!</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:'MS Shell Dlg 2'; font-size:8.25pt; 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=" font-size:8pt;">СпиÑок вÑех Ñохранений игры. Ðаведите указатель мыши на Ñлемент ÑпиÑка, чтобы получить подробную информацию о Ñохранении, включающем ÑпиÑок esp/esm, которые иÑпользовалиÑÑŒ во Ð²Ñ€ÐµÐ¼Ñ ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ ÑохранениÑ, но не активны в наÑтоÑщее времÑ.</span></p> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:8pt;"></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt;">ЕÑли вы выберете в контекÑтном меню пункт &quot;ИÑправить моды...&quot;, MO попытаетÑÑ Ð¿Ð¾Ð´ÐºÐ»ÑŽÑ‡Ð¸Ñ‚ÑŒ вÑе моды и esp, чтобы иÑправить Ñти отÑутÑтвующие esp. Это ничего не отключит!</span></p></body></html> Downloads - + Загрузки This is a list of mods you downloaded from Nexus. Double click one to install it. - + СпиÑок модов, загруженных Ñ Nexus. Двойной клик Ð´Ð»Ñ ÑƒÑтановки. - + Compact - + Упаковать - + Tool Bar - + Панель инÑтрументов - + Install Mod - + УÑтановить мод - + Install &Mod - + УÑтановить &мод - + Install a new mod from an archive - + УÑтановить новый мод из архива - + Ctrl+M - + Ctrl+M - + Profiles - + Профили - + &Profiles - + &Профили - + Configure Profiles - + ÐаÑтройка профилей - + Ctrl+P - + Ctrl+P - + Executables - + Программы - + &Executables - + &Программы - + Configure the executables that can be started through Mod Organizer - + ÐаÑтройка программ, которые могут быть запущены через Mod Organizer - + Ctrl+E - + Ctrl+E + - Tools - + ИнÑтрументы - + &Tools - + &ИнÑтрументы - + Ctrl+I - + Ctrl+I - + Settings - + ÐаÑтройки - + &Settings - + &ÐаÑтройки - + Configure settings and workarounds - + ÐаÑтройка параметров и ÑпоÑобов обхода - + Ctrl+S - + Ctrl+S - + Nexus - + Nexus - + Search nexus network for more mods - + ПоиÑк дополнительных модов на Nexus - + Ctrl+N - + Ctrl+N - - + + Update - + Обновление - + Mod Organizer is up-to-date - + Mod Organizer обновлен - - + + No Problems - + Проблем не обнаружено - + This button will be highlighted if MO discovered potential problems in your setup and provide tips on how to fix them. !Work in progress! Right now this has very limited functionality - + Эта кнопка будет подÑвечена, еÑли MO обнарул возможные проблемы в вашей уÑтановке и имеютÑÑ Ñоветы по их иÑправлению. + +!Ð’ разработке! +ПрÑмо ÑÐµÐ¹Ñ‡Ð°Ñ Ñтот функционал Ñильно ограничен - - + + Help - + Справка - + Ctrl+H - + Ctrl+H - + Endorse MO - + Одобрить MO - - + + Endorse Mod Organizer - + Одобрить Mod Organizer - + Toolbar - + Панель инÑтрументов - + Desktop - + Рабочий Ñтол - + Start Menu - + Меню ПуÑк - + Problems - + Проблемы - + There are potential problems with your setup - + ЕÑть возможные проблемы Ñ Ð²Ð°ÑˆÐµÐ¹ уÑтановкой - + Everything seems to be in order - + КажетÑÑ Ð²ÑÑ‘ в порÑдке - + Help on UI - + Справка по интерфейÑу - + Documentation Wiki - + Wiki-Ð´Ð¾ÐºÑƒÐ¼ÐµÐ½Ñ‚Ð°Ñ†Ð¸Ñ - + Report Issue - + Сообщить о проблеме - + Tutorials - + Уроки - - failed to save load order: %1 - + + failed to save archives order, do you have write access to "%1"? + не удалоÑÑŒ Ñохранить порÑдок архивов, у Ð²Ð°Ñ Ð¸Ð¼ÐµÐµÑ‚ÑÑ Ð´Ð¾Ñтуп на запиÑÑŒ к "%1"? - - failed to save archives order, do you have write access to "%1"? - + + failed to save load order: %1 + не удалоÑÑŒ Ñохранить порÑдок загрузки: %1 - + Name Ð˜Ð¼Ñ - + Please enter a name for the new profile - + Введите Ð¸Ð¼Ñ Ð½Ð¾Ð²Ð¾Ð³Ð¾ Ð¿Ñ€Ð¾Ñ„Ð¸Ð»Ñ - + failed to create profile: %1 - + не удалоÑÑŒ Ñоздать профиль: %1 - + Show tutorial? - + Показать урок? - - You are starting Mod Organizer for the first time. Do you want to show a tutorial of its basic features? If you choose no you can always start the tutorial from the "Help"-menu. - + + You are starting Mod Organizer for the first time. Do you want to show a tutorial of its basic features? If you choose no you can always start the tutorial from the "Help"-menu. + Ð’Ñ‹ запуÑтили Mod Organizer впервые. Ð’Ñ‹ хотите проÑмотреть уроки по оÑновным возможноÑÑ‚Ñм? Ð’ Ñлучае отказа вы вÑегда можете открыть уроки из меню "Помощь". - + Downloads in progress - + Загрузки в процеÑÑе - + There are still downloads in progress, do you really want to quit? - + Загрузки вÑÑ‘ ещё в процеÑÑе, вы правда хотите выйти? - + failed to read savegame: %1 - + не удалоÑÑŒ прочеÑть Ñохранение: %1 + + + + Plugin "%1" failed: %2 + Плагин "%1" не удалоÑÑŒ: %2 - - Plugin "%1" failed: %2 - + + Plugin "%1" failed + Плагин "%1" не удалоÑÑŒ - - Failed to start "%1" - + + failed to init plugin %1: %2 + не удалоÑÑŒ инициализировать плагин %1: %2 + + + + Failed to start "%1" + Ðе удалоÑÑŒ запуÑтить "%1" - + Waiting - + Ожидание - - Please press OK once you're logged into steam. - + + Please press OK once you're logged into steam. + Ðажмите OK как только вы войдете в Steam. - - "%1" not found - + + "%1" not found + "%1" не найден - + Start Steam? - + ЗапуÑтить Steam? - + Steam is required to be running already to correctly start the game. Should MO try to start steam now? - + ТребуетÑÑ Ð·Ð°Ð¿ÑƒÑ‰ÐµÐ½Ð½Ñ‹Ð¹ Steam, Ð´Ð»Ñ ÐºÐ¾Ñ€Ñ€ÐµÐºÑ‚Ð½Ð¾Ð³Ð¾ запуÑка игры. Должен ли MO попытатьÑÑ Ð·Ð°Ð¿ÑƒÑтить Steam ÑейчаÑ? - + Also in: <br> - + Также в: <br> - + No conflict - + Конфликтов нет - + <Edit...> - + <Правка...> - + This bsa is enabled in the ini file so it may be required! - + Этот bsa подключен через ini, так что он может быть необходим! - + This archive will still be loaded since there is a plugin of the same name but its files will not follow installation order! - + Этот архив вÑе равно будет загружен, так как еÑть плагин Ñ Ð¾Ð´Ð½Ð¾Ð¸Ð¼ÐµÐ½Ð½Ñ‹Ð¼ названием, но его файлы не будут Ñледовать порÑдку уÑтановки! - + Activating Network Proxy - + Подключение Ñетевого прокÑи - - + + Installation successful - + УÑтановка завершена - - + + Configure Mod - + ÐаÑтройка мода - - + + This mod contains ini tweaks. Do you want to configure them now? - + Этот мод включает наÑтройки ini. Ð’Ñ‹ хотите наÑтроить их ÑейчаÑ? - - - mod "%1" not found - + + + mod "%1" not found + мод "%1" не найден - - + + Installation cancelled - + УÑтановка отменена - - + + The mod was not installed completely. - + Мод не был уÑтановлен полноÑтью. - + Some plugins could not be loaded - + Ðекоторые плагины не могут быть загружены - + The following Plugins could not be loaded. The reason may be missing dependencies (i.e. python) or an outdated version:<ul> - + Следующие плагины не могут быть загружены. Причина может быть в отÑутÑтвующих завиÑимоÑÑ‚ÑÑ… (таких как python) или в уÑтаревшей верÑии:<ul> - + Choose Mod - + Выберете мод - + Mod Archive - + Ðрхив мода - + Start Tutorial? - + Ðачать обучение? - - You're about to start a tutorial. For technical reasons it's not possible to end the tutorial early. Continue? - + + You're about to start a tutorial. For technical reasons it's not possible to end the tutorial early. Continue? + Ð’Ñ‹ ÑобираетеÑÑŒ открыть обучение. По техничеÑким причинам будет невозможно доÑрочно закончить обучение. Продолжить? - - + + Download started - + Загрузка начата - + failed to update mod list: %1 - + не удалоÑÑŒ обновить ÑпиÑок модов: %1 - + failed to spawn notepad.exe: %1 - + не удалоÑÑŒ вызвать notepad.exe: %1 - + failed to open %1 - + не удалоÑÑŒ открыть %1 - + failed to change origin name: %1 - - - - - Multiple esps activated, please check that they don't conflict. - + не удалоÑÑŒ изменить оригинальное имÑ: %1 - - - Create Mod... - - - - - This will move all files from overwrite into a new, regular mod. -Please enter a name: - - - - - A mod with this name already exists - - - - - <All> - - - - + <Checked> - - - - - Plugin "%1" failed - + <Подключен> - - failed to init plugin %1: %2 - - - - - - Description missing - - - - + <Unchecked> - + <Отключен> - + <Update> - + <Обновлен> - + <No category> - + <Без категории> - + <Conflicted> - + <Конфликтует> - + failed to rename mod: %1 - + не удалоÑÑŒ переименовать мод: %1 - + Overwrite? - + ПерезапиÑать? - - This will replace the existing mod "%1". Continue? - + + This will replace the existing mod "%1". Continue? + Это заменит ÑущеÑтвующий мод "%1". Продолжить? - - failed to remove mod "%1" - + + failed to remove mod "%1" + не удалоÑÑŒ удалить мод "%1" - - - - failed to rename "%1" to "%2" - Ðе удалоÑÑŒ переименовать "%1" в "%2" + + + + failed to rename "%1" to "%2" + не удалоÑÑŒ переименовать "%1" в "%2" - - - + + Multiple esps activated, please check that they don't conflict. + Подключено неÑколько esp, выберете из них не конфликтующие. + + + + + Confirm - Подтвердить + Подтверждение - + Remove the following mods?<br><ul>%1</ul> - + Удалить Ñледующие моды?<br><ul>%1</ul> - + failed to remove mod: %1 - + не удалоÑÑŒ удалить мод: %1 - - + + Failed - + Ðеудача - + Installation file no longer exists - + УÑтановочный файл больше не ÑущеÑтвует - - Mods installed with old versions of MO can't be reinstalled in this way. - + + Mods installed with old versions of MO can't be reinstalled in this way. + Моды, уÑтановленные Ñ Ð¸Ñпользованием Ñтарых верÑий MO не могут быть переÑтановленны таким образом. - - + + You need to be logged in with Nexus to endorse - + Ð’Ñ‹ должны быть авторизированы на Nexus, чтобы одобрÑть. - - + + Extract BSA - + Извлечь BSA - + This mod contains at least one BSA. Do you want to unpack it? -(This removes the BSA after completion. If you don't know about BSAs, just select no) - +(This removes the BSA after completion. If you don't know about BSAs, just select no) + Этот мод включает как минимум один BSA. Ð’Ñ‹ хотите раÑпаковать их? +(Это удалит BSA поÑле завершениÑ. ЕÑли вы не знаете ничего о BSAs, проÑто откажитеÑÑŒ) - - - + + + failed to read %1: %2 - Ðе удалоÑÑŒ прочитать %1: %2 + не удалоÑÑŒ прочеÑть %1: %2 - - + + This archive contains invalid hashes. Some files may be broken. - + Ðрхив Ñодержит неверные хеши. Ðекоторые файлы могут быть иÑпорчены. - + Nexus ID for this Mod is unknown - + Nexus ID Ð´Ð»Ñ Ñтого мода неизвеÑтен + + + + + Create Mod... + Создать мод... + + + + This will move all files from overwrite into a new, regular mod. +Please enter a name: + Это перемеÑтит вÑе файлы от перезапиÑи в новый, отдельный мод. +ПожалуйÑта, введите имÑ: + + + + A mod with this name already exists + Мод Ñ Ñ‚Ð°ÐºÐ¸Ð¼ именем уже ÑущеÑтвует - + Really enable all visible mods? - + ДейÑтвительно подключить вÑе видимые моды? - + Really disable all visible mods? - + ДейÑтвительно отключить вÑе видимые моды? - + Choose what to export - + Выберете, что ÑкÑпортировать - + Everything - + Ð’ÑÑ‘ - + All installed mods are included in the list - + Ð’Ñе уÑтановленные моды, включенные в ÑпиÑок - + Active Mods - + Ðктивные моды - + Only active (checked) mods from your current profile are included - + Включены вÑе активные (подключенные) моды вашего текущего Ð¿Ñ€Ð¾Ñ„Ð¸Ð»Ñ - + Visible - + Видимые - + All mods visible in the mod list are included - + Включены вÑе моды, видимые в ÑпиÑке модов - + export failed: %1 - + ÑкÑпорт не удалÑÑ: %1 - + Install Mod... - + УÑтановить мод... - + Enable all visible - + Включить вÑе видимые - + Disable all visible - + Отключить вÑе видимые - + Check all for update - + Проверить вÑе на Ð¾Ð±Ð½Ð¾Ð²Ð»ÐµÐ½Ð¸Ñ - + Export to csv... - + ЭкÑпорт в csv... - + Sync to Mods... - + Синхронизировать Ñ Ð¼Ð¾Ð´Ð°Ð¼Ð¸... - + Restore Backup - + ВоÑÑтановить из резервной копии - + Remove Backup... - + Удалить резервную копию... - + Set Category - + Задать категорию - + Primary Category - + ОÑÐ½Ð¾Ð²Ð½Ð°Ñ ÐºÐ°Ñ‚ÐµÐ³Ð¾Ñ€Ð¸Ñ - + Rename Mod... - + Переименовать мод... - + Remove Mod... - + Удалить мод... - + Reinstall Mod - + ПереуÑтановить мод - + Un-Endorse - + Отменить одобрение - - + + Endorse - + Одобрить - - Won't endorse - + + Won't endorse + Ðе одобрÑть - + Endorsement state unknown - + Ð¡Ñ‚Ð°Ñ‚ÑƒÑ Ð¾Ð´Ð¾Ð±Ñ€ÐµÐ½Ð¸Ñ Ð½ÐµÐ¸Ð·Ð²ÐµÑтен - + Ignore missing data - + Игнорировать отÑутÑтвующие данные - + Visit on Nexus - + Перейти на Nexus - + Open in explorer - + Открыть в проводнике - + Information... - + ИнформациÑ... - - + + Exception: - + ИÑключение: - - + + Unknown exception - + ÐеизвеÑтное иÑключение - + + <All> + <Ð’Ñе> + + + <Multiple> - + <ÐеÑколько> - + Fix Mods... - + ИÑправить моды... - - + + failed to remove %1 - + не удалоÑÑŒ удалить %1 - - + + failed to create %1 - + не удалоÑÑŒ Ñоздать %1 - - Can't change download directory while downloads are in progress! - + + Can't change download directory while downloads are in progress! + ÐÐµÐ»ÑŒÐ·Ñ Ð¸Ð·Ð¼ÐµÐ½Ð¸Ñ‚ÑŒ каталог Ð´Ð»Ñ Ð·Ð°Ð³Ñ€ÑƒÐ·Ð¾Ðº, когда загрузки ещё не завершены! - + Download failed - + Загрузка не удалаÑÑŒ - + failed to write to file %1 - + ошибка запиÑи в файл %1 - + %1 written - + %1 запиÑан - + Select binary - + Выбрать иÑполнÑемый файл - + Binary - Двоичный + ИÑполнÑемый файл - + Enter Name - + Введите Ð¸Ð¼Ñ - + Please enter a name for the executable - + Введите название Ð´Ð»Ñ Ð¿Ñ€Ð¾Ð³Ñ€Ð°Ð¼Ð¼Ñ‹ - + Not an executable - + Ðе ÑвлÑетÑÑ Ð¸ÑполнÑемым - + This is not a recognized executable. - + Это неверный иÑполнÑемый файл. - - + + Replace file? - + Заменить файл? - + There already is a hidden version of this file. Replace it? - + Уже ÑущеÑтвует ÑÐºÑ€Ñ‹Ñ‚Ð°Ñ Ð²ÐµÑ€ÑÐ¸Ñ Ñтого файла. Заменить? - - + + File operation failed - + ÐžÐ¿ÐµÑ€Ð°Ñ†Ð¸Ñ Ñ Ñ„Ð°Ð¹Ð»Ð¾Ð¼ не удалаÑÑŒ - - - Failed to remove "%1". Maybe you lack the required file permissions? - + + + Failed to remove "%1". Maybe you lack the required file permissions? + Ðе удалоÑÑŒ удалить "%1". Может быть, вам не хватает необходимых прав доÑтупа к файлу? - + There already is a visible version of this file. Replace it? - + Ð’Ð¸Ð´Ð¸Ð¼Ð°Ñ Ð²ÐµÑ€ÑÐ¸Ñ Ñтого файла уже ÑущеÑтвует. Заменить? - + Update available - + ДоÑтупно обновление - + Open/Execute - + Открыть/Выполнить - + Add as Executable - + Добавить как иÑполнÑемый - + Un-Hide - + Показать - + Hide - + Скрыть - + Write To File... - + ЗапиÑать в файл... - + Do you want to endorse Mod Organizer on %1 now? - + Ð’Ñ‹ хотите одобрить Mod Organizer на %1 ÑейчаÑ? - - Unlock load order - - - - - Lock load order - - - - + Request to Nexus failed: %1 - + Ð—Ð°Ð¿Ñ€Ð¾Ñ Ð½Ð° Nexus не удалÑÑ: %1 - - + + login successful - + уÑпешный вход - + login failed: %1. Trying to download anyway - + вход не удалÑÑ: %1. ПытаюÑÑŒ загрузить вÑÑ‘ равно - + login failed: %1 - + войти не удалоÑÑŒ: %1 - + login failed: %1. You need to log-in with Nexus to update MO. - + войти не удалоÑÑŒ: %1. Вам нужно войти на Nexus, чтобы обновить MO. - + Error - + Ошибка - + failed to extract %1 (errorcode %2) - + не удалоÑÑŒ извлечь %1 (код ошибки %2) - + Extract... - + РаÑпаковка... - + Edit Categories... - + Изменить категории... - + Enable all - + Включить вÑе - + Disable all - + Отключить вÑе + + + + Unlock load order + Разблокировать порÑдок загрузки + + + + Lock load order + Заблокировать порÑдок загрузки @@ -2492,10 +2344,6 @@ Please enter a name: Placeholder Заполнитель - - Please install NCC - УÑтановите NCC - ModInfo @@ -2503,11 +2351,7 @@ Please enter a name: invalid index %1 - Ðеверный Ð¸Ð½Ð´ÐµÐºÑ %1 - - - invalid mod id %1 - неверный ID мода %1 + неверный Ð¸Ð½Ð´ÐµÐºÑ %1 @@ -2515,7 +2359,7 @@ Please enter a name: This is the backup of a mod - + Это Ñ€ÐµÐ·ÐµÑ€Ð²Ð½Ð°Ñ ÐºÐ¾Ð¿Ð¸Ñ Ð¼Ð¾Ð´Ð° @@ -2538,7 +2382,7 @@ Please enter a name: A list of text-files in the mod directory like readmes. - СпиÑок текÑтовых файлов в каталоге мода, ознакомительных. + СпиÑок текÑтовых файлов в каталоге мода, таких как ридми. @@ -2554,7 +2398,7 @@ Please enter a name: This is a list of .ini files in the mod. - Это ÑпиÑок INI - фалов мода. + Это ÑпиÑок .ini-файлов мода. @@ -2583,16 +2427,16 @@ Please enter a name: - <!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"> + <!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:'MS Shell Dlg 2'; font-size:8.25pt; 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=" font-size:8pt;">This lists all the images (.jpg and .png) in the mod directory, like screenshots and such. Click one to get a larger view.</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"> +</style></head><body style=" font-family:'MS Shell Dlg 2'; font-size:8.25pt; 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=" font-size:8pt;">This lists all the images (.jpg and .png) in the mod directory, like screenshots and such. Click one to get a larger view.</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:'MS Shell Dlg 2'; font-size:8.25pt; 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=" font-size:8pt;">Это ÑпиÑок вÑех изображений (. JPG и. PNG) в каталоге мода, такие как Ñкриншоты и Ñ‚.п. Ðажмите на один из них, что бы увеличить.</span></p></body></html> +</style></head><body style=" font-family:'MS Shell Dlg 2'; font-size:8.25pt; 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=" font-size:8pt;">Это ÑпиÑок вÑех изображений (.jpg и .png) в каталоге мода, таких как Ñкриншоты и Ñ‚.п. Ðажмите на любое, Ð´Ð»Ñ ÑƒÐ²ÐµÐ»Ð¸Ñ‡ÐµÐ½Ð¸Ñ.</span></p></body></html> @@ -2603,26 +2447,26 @@ p, li { white-space: pre-wrap; } List of esps and esms that can not be loaded by the game. - СпиÑок ESP и ESM которые не могут быть включены в игру. + СпиÑок esp и esm, которые не могут быть загружены игрой. - <!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"> + <!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:'MS Shell Dlg 2'; font-size:8.25pt; 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=" font-size:8pt;">List of esps and esms contained in this plugin that currently can not be loaded by the game. They will not even appear in the esp-list in the main MO-window.</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt;">They usually contain optional functionality, see the readme.</span></p> -<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:8pt;"></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt;">Most mods do not have optional esps, so chances are good you are looking at an empty list.</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"> +</style></head><body style=" font-family:'MS Shell Dlg 2'; font-size:8.25pt; 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=" font-size:8pt;">List of esps and esms contained in this plugin that currently can not be loaded by the game. They will not even appear in the esp-list in the main MO-window.</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt;">They usually contain optional functionality, see the readme.</span></p> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:8pt;"></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt;">Most mods do not have optional esps, so chances are good you are looking at an empty list.</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:'MS Shell Dlg 2'; font-size:8.25pt; 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=" font-size:8pt;">СпиÑок ESP и ESM Ñодержащие в паллагине, которые не могут быть включены в игру. они так же не будут отображены в ÑпиÑке ESP и ESM мода.</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt;">Они обычно Ñодержат дополнительные функции. См. ReadME.</span></p> -<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:8pt;"></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt;">БольшинÑтво модов не имеют дополнительные ESP. ПоÑтому вы можете увидеть пуÑтой ÑпиÑок</span></p></body></html> +</style></head><body style=" font-family:'MS Shell Dlg 2'; font-size:8.25pt; 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=" font-size:8pt;">СпиÑок esp и esm, ÑодержащихÑÑ Ð² плагине, которые не могут быть загружены в игру. Они так же не будут отображены в ÑпиÑке esp, в главном окне MO.</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt;">Они обычно Ñодержат опциональный функционал, Ñмотрите документацию.</span></p> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:8pt;"></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt;">БольшинÑтво модов не Ñодержат дополнительных esp, поÑтому вы можете увидеть пуÑтой ÑпиÑок</span></p></body></html> @@ -2631,8 +2475,8 @@ p, li { white-space: pre-wrap; } - The selected esp (in the lower list) will be pushed into a subdirectory of the mod and will thus become "invisible" to the game. It can then no longer be activated. - Выбранный ESP (в нижнем ÑпиÑке) будет перемещены в подкаталог мода и, таким образом, Ñтанут "невидимыми" Ð´Ð»Ñ Ð¸Ð³Ñ€Ñ‹. Затем они больше не будут активированы. + The selected esp (in the lower list) will be pushed into a subdirectory of the mod and will thus become "invisible" to the game. It can then no longer be activated. + Выбранный ESP (в нижнем ÑпиÑке) будет перемещены в подкаталог мода и, таким образом, Ñтанут "невидимыми" Ð´Ð»Ñ Ð¸Ð³Ñ€Ñ‹. Затем они больше не будут активированы. @@ -2641,8 +2485,8 @@ p, li { white-space: pre-wrap; } - This moves a esp to the esp directory so it can be enabled in the main window. Please note that the ESP merely becomes "available", it will not necessarily be loaded! That is configured in the main window of omo. - Перемещает ESP в каталог Data. Он может быть включен в главном окне. Обратите внимание, что ESP проÑто ÑтановитÑÑ "доÑтупным", Ñто не обÑзательно будет включен! Это наÑтраиваетÑÑ Ð² главном окне OMO. + This moves a esp to the esp directory so it can be enabled in the main window. Please note that the ESP merely becomes "available", it will not necessarily be loaded! That is configured in the main window of omo. + Перемещает esp в каталог Ñ Ð´Ñ€ÑƒÐ³Ð¸Ð¼Ð¸ esp так, что он может быть подключен в главном окне. Обратите внимание, что ESP проÑто ÑтановитÑÑ "доÑтупным", но не будет загружен! Это наÑтраиваетÑÑ Ð² главном окне MO. @@ -2652,7 +2496,7 @@ p, li { white-space: pre-wrap; } These are the mod files that are in the (virtual) data directory of your game and will thus be selecteable in the esp list in the main window. - Это моды который находÑÑ‚ÑÑ Ð² каталоге игры (виртуальном). Они могут быть включены в главном окне. + Это файлы модов которые находÑÑ‚ÑÑ Ð² (виртуальном)каталоге данных вашей игры и могут быть выбираемыми в ÑпиÑке esp, в главном окне. @@ -2703,7 +2547,7 @@ p, li { white-space: pre-wrap; } Primary Category - + ОÑÐ½Ð¾Ð²Ð½Ð°Ñ ÐºÐ°Ñ‚ÐµÐ³Ð¾Ñ€Ð¸Ñ @@ -2722,29 +2566,29 @@ p, li { white-space: pre-wrap; } - <!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"> + <!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:'MS Shell Dlg 2'; font-size:8.25pt; 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=" font-size:8pt;">Mod ID for this mod on Nexus. This is filled in automatically if you downloaded and installed the mod from inside MO. Otherwise you can enter it manually. To find the correct id, find the mod on nexus. The URL will look like this: </span><a href=" http://www.skyrimnexus.com/downloads/file.php?id=1334"><span style=" font-size:8pt; text-decoration: underline; color:#0000ff;">http://skyrim.nexusmods.com/downloads/file.php?id=1334</span></a><a href="http://www.skyrimnexus.com/downloads/file.php?id=1334"><span style=" font-size:8pt; color:#000000;">. In this example, 1334 is the id you're looking for. Besides: The above is the link to Mod Organizer on the Nexus. Why not go there now and endorse?</span></a></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"> +</style></head><body style=" font-family:'MS Shell Dlg 2'; font-size:8.25pt; 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=" font-size:8pt;">Mod ID for this mod on Nexus. This is filled in automatically if you downloaded and installed the mod from inside MO. Otherwise you can enter it manually. To find the correct id, find the mod on nexus. The URL will look like this: </span><a href=" http://www.skyrimnexus.com/downloads/file.php?id=1334"><span style=" font-size:8pt; text-decoration: underline; color:#0000ff;">http://skyrim.nexusmods.com/downloads/file.php?id=1334</span></a><a href="http://www.skyrimnexus.com/downloads/file.php?id=1334"><span style=" font-size:8pt; color:#000000;">. In this example, 1334 is the id you're looking for. Besides: The above is the link to Mod Organizer on the Nexus. Why not go there now and endorse?</span></a></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:'MS Shell Dlg 2'; font-size:8.25pt; 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=" font-size:8pt;">ID Ñтого мода на Nexus. ЗаполнÑетÑÑ Ð°Ð²Ñ‚Ð¾Ð¼Ð°Ñ‚Ð¸Ñ‡ÐµÑки, еÑли Ñкачали и уÑтановили мод МО. Иначе вы можете ввеÑти его вручную. Чтобы найти правильный ID, нужно найти иÑточник. URL будет выглÑдеть Ñледующим образом: </span><a href=" http://www.skyrimnexus.com/downloads/file.php?id=1334"><span style=" font-size:8pt; text-decoration: underline; color:#0000ff;">http://skyrim.nexusmods.com/downloads/file.php?id=1334</span></a><a href="http://www.skyrimnexus.com/downloads/file.php?id=1334"><span style=" font-size:8pt; color:#000000;">. Ð’ Ñтом примере, вы ищите ID 1334. Кроме того: выше еÑть ÑÑылка на Mod Organizer на Nexus. Почему бы не пойти туда b yt ghjdthbnm?</span></a></p></body></html> +</style></head><body style=" font-family:'MS Shell Dlg 2'; font-size:8.25pt; 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=" font-size:8pt;">ID Ñтого мода на Nexus. ЗаполнÑетÑÑ Ð°Ð²Ñ‚Ð¾Ð¼Ð°Ñ‚Ð¸Ñ‡ÐµÑки, еÑли Ñкачали и уÑтановили мод из МО. Ð’ противном Ñлучае вы можете ввеÑти его вручную. Чтобы найти правильный ID, нужно найти мод на Nexus. URL будет выглÑдеть Ñледующим образом: </span><a href=" http://www.skyrimnexus.com/downloads/file.php?id=1334"><span style=" font-size:8pt; text-decoration: underline; color:#0000ff;">http://skyrim.nexusmods.com/downloads/file.php?id=1334</span></a><a href="http://www.skyrimnexus.com/downloads/file.php?id=1334"><span style=" font-size:8pt; color:#000000;">. Ð’ Ñтом примере, 1334 - ID, который вы ищете. Кроме того: Выше еÑть ÑÑылка на Mod Organizer на Nexus. Почему бы не перейти по ней и не одобрить?</span></a></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"> + <!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:'MS Shell Dlg 2'; font-size:8.25pt; 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=" font-size:8pt;">Installed Version of the Mod. The tooltip will contain the current version available on nexus. The installed version is only set if you installed the mod through MO.</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"> +</style></head><body style=" font-family:'MS Shell Dlg 2'; font-size:8.25pt; 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=" font-size:8pt;">Installed Version of the Mod. The tooltip will contain the current version available on nexus. The installed version is only set if you installed the mod through MO.</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:'MS Shell Dlg 2'; font-size:8.25pt; 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=" font-size:8pt;">УÑÑ‚Ð°Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ð°Ñ Ð²ÐµÑ€ÑÐ¸Ñ Ð¼Ð¾Ð´Ð°. Ð’ подÑказке будет ÑодержатьÑÑ Ñ‚ÐµÐºÑƒÑ‰Ð°Ñ Ð²ÐµÑ€ÑÐ¸Ñ ÑÑылка. УÑÑ‚Ð°Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ð°Ñ Ð²ÐµÑ€ÑÐ¸Ñ ÑƒÑтанавливаетÑÑ Ñ‚Ð¾Ð»ÑŒÐºÐ¾ еÑли вы уÑтановили мод через МО</span></p></body></html> +</style></head><body style=" font-family:'MS Shell Dlg 2'; font-size:8.25pt; 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=" font-size:8pt;">УÑÑ‚Ð°Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ð°Ñ Ð²ÐµÑ€ÑÐ¸Ñ Ð¼Ð¾Ð´Ð°. ПодÑказка будет Ñодержать текущую верÑию, доÑтупную на Nexus. УÑÑ‚Ð°Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ð°Ñ Ð²ÐµÑ€ÑÐ¸Ñ ÑƒÑтановитÑÑ Ñ‚Ð¾Ð»ÑŒÐºÐ¾ еÑли вы уÑтановили мод через МО.</span></p></body></html> @@ -2754,12 +2598,12 @@ p, li { white-space: pre-wrap; } Refresh - + Обновить информацию Refresh all information from Nexus. - + Обновить вÑÑŽ информацию Ñ Nexus @@ -2768,51 +2612,28 @@ p, li { white-space: pre-wrap; } - <!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"> + <!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:'MS Shell Dlg 2'; font-size:8.25pt; font-weight:400; font-style:normal;"> -<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:8pt;"><br /></p> -<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:8pt;"><br /></p></body></html> - - - - Files - Файлы - - - List of files currently uploaded on nexus. Double click to download. - СпиÑок файлов загружаемых Ñ Nexus. Двойной клик Ð´Ð»Ñ Ð·Ð°Ð³Ñ€ÑƒÐ·ÐºÐ¸ - - - Type - Тип - - - Name - Ð˜Ð¼Ñ - - - Size (kB) - Размер (KB) +</style></head><body style=" font-family:'MS Shell Dlg 2'; font-size:8.25pt; font-weight:400; font-style:normal;"> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:8pt;"><br /></p> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:8pt;"><br /></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:'MS Shell Dlg 2'; font-size:8.25pt; font-weight:400; font-style:normal;"> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:8pt;"><br /></p> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:8pt;"><br /></p></body></html> Endorse - + Одобрить Notes - - - - Endorsements are an important motivation for authors. Please don't forget to endorse mods you like. - Ðе забудте поблагодарить автора. - - - Have you endorsed this yet? - Поблагодарить? + ÐŸÑ€Ð¸Ð¼ÐµÑ‡Ð°Ð½Ð¸Ñ @@ -2826,23 +2647,28 @@ p, li { white-space: pre-wrap; } - <!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"> + <!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:'MS Shell Dlg 2'; font-size:8.25pt; 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=" font-size:8pt;">This is a modifiable directory view of the mod directory. You can move around files using drag &amp; drop and rename them (double click).</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt;">Changes happen immediately on disc, so do</span><span style=" font-size:8pt; font-weight:600;"> be careful</span><span style=" font-size:8pt;">.</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:'MS Shell Dlg 2'; font-size:8.25pt; 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=" font-size:8pt;">This is a modifiable directory view of the mod directory. You can move around files using drag &amp; drop and rename them (double click).</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt;">Changes happen immediately on disc, so do</span><span style=" font-size:8pt; font-weight:600;"> be careful</span><span style=" font-size:8pt;">.</span></p></body></html> - +</style></head><body style=" font-family:'MS Shell Dlg 2'; font-size:8.25pt; 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=" font-size:8pt;">Это обзор модифицируемого каталога папки мода. Ð’Ñ‹ можете перемещать файлы, иÑÐ¿Ð¾Ð»ÑŒÐ·ÑƒÑ Ð¿ÐµÑ€ÐµÑ‚Ð°Ñкивание и переименовывать их двойным кликом.</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt;">Ð˜Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð¿Ñ€Ð¾Ð¸ÑходÑÑ‚ непоÑредÑтвенно на диÑке, так что</span><span style=" font-size:8pt; font-weight:600;"> будьте оÑторожныl</span><span style=" font-size:8pt;">.</span></p></body></html> Previous - + Предыдущий Next - Вперед + Вперед @@ -2852,22 +2678,22 @@ p, li { white-space: pre-wrap; } &Delete - + &Удалить &Rename - + &Переименовать &Hide - + &Скрыть &Unhide - + &Показать @@ -2877,184 +2703,184 @@ p, li { white-space: pre-wrap; } &New Folder - + &ÐÐ¾Ð²Ð°Ñ Ð¿Ð°Ð¿ÐºÐ° Save changes? - + Сохранить изменениÑ? + + + + + Save changes to "%1"? + Сохранить Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð² "%1"? File Exists - + Файл уже ÑущеÑтвует A file with that name exists, please enter a new one - + Файл Ñ Ñ‚Ð°ÐºÐ¸Ð¼ именем уже ÑущеÑтвует, укажите другое failed to move file - + не удалоÑÑŒ перемеÑтить файл - failed to create directory "optional" - + failed to create directory "optional" + не удалоÑÑŒ Ñоздать папку "optional" Info requested, please wait - - - - - (description incomplete, please visit nexus) - - - - - Current Version: %1 - - - - - No update available - + Ð˜Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ Ð·Ð°Ð¿Ñ€Ð¾ÑˆÐµÐ½Ð°, пожалуйÑта, подождите Main - - - - - - Save changes to "%1"? - + Главное Update - + Обновление Optional - + Опционально Old - + Старые Misc - + Разное Unknown - + ÐеизвеÑтно - - <a href="%1">Visit on Nexus</a> - + + Current Version: %1 + Ð¢ÐµÐºÑƒÑ‰Ð°Ñ Ð²ÐµÑ€ÑиÑ: %1 - - - Confirm - Подтвердить + + No update available + Ðет доÑтупных обновлений + + + + (description incomplete, please visit nexus) + (опиÑание не завершено, Ñмотрите на nexus) + + + + <a href="%1">Visit on Nexus</a> + <a href="%1">Перейти на Nexus</a> Failed to delete %1 - + Ðе удалоÑÑŒ удалить %1 - Are sure you want to delete "%1"? - + + Confirm + Подтверждение + + + + Are sure you want to delete "%1"? + Ð’Ñ‹ уверены, что хотите удалить "%1"? Are sure you want to delete the selected files? - + Ð’Ñ‹ уверены, что хотите удалить выбранные файлы? New Folder - + ÐÐ¾Ð²Ð°Ñ Ð¿Ð°Ð¿ÐºÐ° - Failed to create "%1" - + Failed to create "%1" + Ðе удалоÑÑŒ Ñоздать "%1" Replace file? - + Заменить файл? There already is a hidden version of this file. Replace it? - + Ð¡ÐºÑ€Ñ‹Ñ‚Ð°Ñ Ð²ÐµÑ€ÑÐ¸Ñ Ñтого файла уже ÑущеÑтвует. Заменить? File operation failed - + Ðе удалаÑÑŒ Ð¾Ð¿ÐµÑ€Ð°Ñ†Ð¸Ñ Ñ Ñ„Ð°Ð¹Ð»Ð¾Ð¼ - Failed to remove "%1". Maybe you lack the required file permissions? - + Failed to remove "%1". Maybe you lack the required file permissions? + Ðе удалоÑÑŒ удалить "%1". Может быть, вам не хватает необходимых прав доÑтупа к файлу? failed to rename %1 to %2 - + не удалоÑÑŒ переименовать %1 в %2 There already is a visible version of this file. Replace it? - + Ð’Ð¸Ð´Ð¸Ð¼Ð°Ñ Ð²ÐµÑ€ÑÐ¸Ñ Ñтого файла уже ÑущеÑтвует. Заменить? Un-Hide - + Показать Hide - + Скрыть ModInfoOverwrite - - - Overwrite - - This pseudo mod contains files from the virtual data tree that got modified (i.e. by the construction kit) - + Этот пÑевдо-мод Ñодержит файлы из виртуального древа данных, которые были изменены (в Construction Kit и других программах) + + + + Overwrite + Замена @@ -3062,180 +2888,176 @@ p, li { white-space: pre-wrap; } failed to write %1/meta.ini: %2 - + не удалоÑÑŒ запиÑать %1/meta.ini: %2 %1 contains no esp/esm and no asset (textures, meshes, interface, ...) directory - + %1 не Ñодержит ни esp/esm, ни папок реÑурÑов (textures, meshes, interface, ...) Categories: <br> - + Категории: <br> ModList - - - Confirm - Подтвердить - Overwrite - + Замена This entry contains files that have been created inside the virtual data tree (i.e. by the construction kit) - + Эта запиÑÑŒ включает файлы, которые были Ñозданы внутри виртуального древа (Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ Construction Kit и др. программ) Backup - + Ð ÐµÐ·ÐµÑ€Ð²Ð½Ð°Ñ ÐºÐ¾Ð¿Ð¸Ñ No valid game data - + Ðеверные игровые данные Not endorsed yet - + Еще не одобрено Overwrites files - + ЗаменÑет файлы Overwritten files - + Замененные файлы Overwrites & Overwritten - + ЗаменÑет и заменÑетÑÑ Redundant - - - - - Category of the mod. - - - - - Id of the mod as used on Nexus. - - - - - Emblemes to highlight things that might require attention. - + Избыточные - - Categories: <br> - + + invalid + неверные installed version: %1, newest version: %2 - - - - Name - Ð˜Ð¼Ñ - - - - Version - ВерÑÐ¸Ñ - - - - Version of the mod (if available) - + уÑÑ‚Ð°Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ð°Ñ Ð²ÐµÑ€ÑиÑ: %1, Ð½Ð¾Ð²ÐµÐ¹ÑˆÐ°Ñ Ð²ÐµÑ€ÑиÑ: %2 - - Priority - - - - - invalid - + + Categories: <br> + Категории: <br> Invalid name - + ÐедопуÑтимое Ð¸Ð¼Ñ drag&drop failed: %1 - + перетаÑкивание не удалоÑÑŒ: %1 + + + + Confirm + Подтверждение + + + + Are you sure you want to remove "%1"? + Ð’Ñ‹ дейÑтвительно хотите удалить "%1"? Flags - + Флаги Mod Name - + Ð˜Ð¼Ñ Ð¼Ð¾Ð´Ð° + + + + Version + ВерÑÐ¸Ñ + + + + Priority + Приоритет Category - + ÐšÐ°Ñ‚ÐµÐ³Ð¾Ñ€Ð¸Ñ Nexus ID - + Nexus ID Installation - + УÑтановка unknown - + неизвеÑтный Name of your mods - + Ð˜Ð¼Ñ Ð²Ð°ÑˆÐ¸Ñ… модов + + + + Version of the mod (if available) + ВерÑÐ¸Ñ Ð¼Ð¾Ð´Ð° (еÑли доÑтупно) - Installation priority of your mod. The higher, the more "important" it is and thus overwrites files from mods with lower priority. - + Installation priority of your mod. The higher, the more "important" it is and thus overwrites files from mods with lower priority. + Приоритет уÑтановки Ð´Ð»Ñ Ð²Ð°ÑˆÐ¸Ñ… модов. Файлы модов Ñ Ð±Ð¾Ð»ÑŒÑˆÐ¸Ð¼ приоритетом перезапишут файлы модов Ñ Ð¼ÐµÐ½ÑŒÑˆÐ¸Ð¼ приоритетом. - - Time this mod was installed - + + Category of the mod. + ÐšÐ°Ñ‚ÐµÐ³Ð¾Ñ€Ð¸Ñ Ð¼Ð¾Ð´Ð°. - - Are you sure you want to remove "%1"? - + + Id of the mod as used on Nexus. + ID мода, иÑпользуемый на Nexus. + + + + Emblemes to highlight things that might require attention. + ВыделÑет подÑветкой вещи, которые могут потребовать вниманиÑ. + + + + Time this mod was installed + ВремÑ, когда мод был уÑтановлен. @@ -3243,12 +3065,12 @@ p, li { white-space: pre-wrap; } Message of the Day - + Сообщение Ð´Ð½Ñ OK - + OK @@ -3256,12 +3078,12 @@ p, li { white-space: pre-wrap; } Overwrites - + ЗаменÑет not implemented - + не реализовано @@ -3269,37 +3091,30 @@ p, li { white-space: pre-wrap; } timeout - + задержка Please check your password - - - - - NexusDialog - - Mod ID - ID мода + Проверьте ваш пароль NexusInterface - Failed to guess mod id for "%1", please pick the correct one - + Failed to guess mod id for "%1", please pick the correct one + Ðе удалоÑÑŒ опознать id мода "%1", пожалуйÑта, выберете правильный empty response - + пуÑтой ответ invalid response - + неверный ответ @@ -3307,22 +3122,22 @@ p, li { white-space: pre-wrap; } Overwrite - + Замена You can use drag&drop to move files and directories to regular mods. - + Ð’Ñ‹ можете иÑпользовать перетаÑкивание, Ð´Ð»Ñ Ð¿ÐµÑ€ÐµÐ¼ÐµÑ‰ÐµÐ½Ð¸Ñ Ð¿Ð°Ð¿Ð¾Ðº и файлов в раÑпакованные моды. &Delete - + &Удалить &Rename - + &Переименовать @@ -3332,130 +3147,114 @@ p, li { white-space: pre-wrap; } &New Folder - + &ÐÐ¾Ð²Ð°Ñ Ð¿Ð°Ð¿ÐºÐ° - Failed to delete "%1" - + Failed to delete "%1" + Ðе удалоÑÑŒ удалить "%1" Confirm - Подтвердить + Подтверждение - Are sure you want to delete "%1"? - + Are sure you want to delete "%1"? + Ð’Ñ‹ уверены, что хотите удалить "%1"? Are sure you want to delete the selected files? - + Ð’Ñ‹ дейÑтвительно хотите удалить выбранные файлы? New Folder - + ÐÐ¾Ð²Ð°Ñ Ð¿Ð°Ð¿ÐºÐ° - Failed to create "%1" - + Failed to create "%1" + Ðе удалоÑÑŒ Ñоздать "%1" PluginList - + + Name + Ð˜Ð¼Ñ + + + + Priority + Приоритет + + + Mod Index - + Ð˜Ð½Ð´ÐµÐºÑ Ð¼Ð¾Ð´Ð° - - + + unknown - + неизвеÑтно - + Name of your mods - + Имена ваших модов - - Load priority of your mod. The higher, the more "important" it is and thus overwrites data from plugins with lower priority. - + + Load priority of your mod. The higher, the more "important" it is and thus overwrites data from plugins with lower priority. + Приоритет загрузки ваших модов. Моды Ñ Ð±Ð¾Ð»ÑŒÑˆÐ¸Ð¼ приоритетом перезапишут данные модов Ñ Ð¼ÐµÐ½ÑŒÑˆÐ¸Ð¼ приоритетом. - + The modindex determins the formids of objects originating from this mods. - + Ð˜Ð½Ð´ÐµÐºÑ Ð¼Ð¾Ð´Ð° определÑющий id форм объектов, проиÑходÑщих из Ñтих модов. - + esp not found: %1 - + esp не найден: %1 - - - Confirm - Подтвердить - - - - Really enable all plugins? - - - - - Really disable all plugins? - - - - + The file containing locked plugin indices is broken - + Файл, Ñодержащий индекÑÑ‹ заблокированного плагина, не работает. - + failed to open output file: %1 - + не удалоÑÑŒ открыть выходной файл: %1 Some of your plugins have invalid names! These plugins can not be loaded by the game. Please see mo_interface.log for a list of affected plugins and rename them. - - - - - failed to restore load order for %1 - + Ðекоторые из ваших плагинов имеют неверные имена. Эти плагины не могут быть загружены игрой. Смотрите mo_interface.log Ð´Ð»Ñ Ð¿Ð¾Ð»ÑƒÑ‡ÐµÐ½Ð¸Ñ ÑпиÑка таких плагинов и переименуйте их. - This plugin can't be disabled (enforced by the game) - + This plugin can't be disabled (enforced by the game) + Этот плагин не может быть отключен (грузитÑÑ Ð¸Ð³Ñ€Ð¾Ð¹ принудительно) Origin: %1 - + ИÑточник: %1 - - Name - Ð˜Ð¼Ñ - - - - Priority - + + failed to restore load order for %1 + не удалоÑÑŒ воÑÑтановить порÑдок загрузки Ð´Ð»Ñ %1 @@ -3463,31 +3262,35 @@ p, li { white-space: pre-wrap; } Problems - + Проблемы - <!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"> + <!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:'MS Shell Dlg 2'; font-size:7.8pt; font-weight:400; font-style:normal;"> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:8pt;"><br /></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:'MS Shell Dlg 2'; font-size:7.8pt; font-weight:400; font-style:normal;"> -<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:8pt;"><br /></p></body></html> - +</style></head><body style=" font-family:'MS Shell Dlg 2'; font-size:7.8pt; font-weight:400; font-style:normal;"> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:8pt;"><br /></p></body></html> fix - + иÑправить Fix - + ИÑправить No guided fix - + Ðе управлÑемое иÑправление @@ -3495,27 +3298,27 @@ p, li { white-space: pre-wrap; } invalid profile name %1 - + неверное Ð¸Ð¼Ñ Ð¿Ñ€Ð¾Ñ„Ð¸Ð»Ñ %1 failed to create %1 - + не удалоÑÑŒ Ñоздать %1 - failed to open "%1" for writing - + failed to open "%1" for writing + не удалоÑÑŒ открыть "%1" Ð´Ð»Ñ Ð·Ð°Ð¿Ð¸Ñи failed to update tweaked ini file, wrong settings may be used: %1 - + не удалоÑÑŒ обновить наÑтроенный ini-файл, вероÑтно иÑпользуютÑÑ Ð¾ÑˆÐ¸Ð±Ð¾Ñ‡Ð½Ñ‹Ðµ наÑтройки: %1 failed to create tweaked ini: %1 - + не удалоÑÑŒ Ñоздать наÑтроенный ini: %1 @@ -3524,43 +3327,43 @@ p, li { white-space: pre-wrap; } invalid index %1 - Ðеверный Ð¸Ð½Ð´ÐµÐºÑ %1 + неверный Ð¸Ð½Ð´ÐµÐºÑ %1 - Overwrite directory couldn't be parsed - + Overwrite directory couldn't be parsed + Замена каталога не может быть обработана invalid priority %1 - + неверный приоритет %1 failed to parse ini file (%1) - + не удалоÑÑŒ обработать ini файл (%1) failed to parse ini file (%1): %2 - + не удалоÑÑŒ обработать ini файл (%1): %2 - failed to modify "%1" - + failed to modify "%1" + не удалоÑÑŒ изменить "%1" - + Delete savegames? - + Удалить ÑохранениÑ? - - Do you want to delete local savegames? (If you select "No", the save games will show up again if you re-enable local savegames) - + + Do you want to delete local savegames? (If you select "No", the save games will show up again if you re-enable local savegames) + Ð’Ñ‹ хотите удалить локальные ÑохранениÑ? (При отрицательном выборе ÑÐ¾Ñ…Ñ€Ð°Ð½ÐµÐ½Ð¸Ñ Ð¾Ñ‚Ð¾Ð±Ñ€Ð°Ð·ÑÑ‚ÑÑ Ñнова, еÑли повторно включить локальные ÑохранениÑ) @@ -3568,27 +3371,27 @@ p, li { white-space: pre-wrap; } Dialog - + Диалог Please enter a name for the new profile - + Введите Ð¸Ð¼Ñ Ð½Ð¾Ð²Ð¾Ð³Ð¾ Ð¿Ñ€Ð¾Ñ„Ð¸Ð»Ñ If checked, the new profile will use the default game settings. - + ЕÑли отмечено, новый профиль будет иÑпользовать наÑтройки игры по умолчанию. - If checked, the new profile will use the default game settings instead of the "global" settings. Global settings are the settings you configure when running the game launcher directly, without MO. - + If checked, the new profile will use the default game settings instead of the "global" settings. Global settings are the settings you configure when running the game launcher directly, without MO. + ЕÑли отмечено, новый профиль будет иÑпользовать наÑтройки игры по умолчанию, вмеÑто общих наÑтроек. Общие наÑтройки, Ñто наÑтройки, которые вы уÑтановили, когда запуÑтили лаунчер игры напрÑмую, без MO. Default Game Settings - + ÐаÑтройки игры по умолчанию @@ -3596,109 +3399,122 @@ p, li { white-space: pre-wrap; } Profiles - + Профили List of Profiles - + СпиÑок профилей - <!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"> + <!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:'MS Shell Dlg 2'; font-size:8.25pt; 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;">This is the list of profiles. Each Profile contains its own list and installation order of enabled mods (from a shared pool), a configuration of enabled esps/esms, a copy of the games ini-file and an optional savegame filter.</p> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Note</span> For technical reasons it's currently not possible to have seperate load-orders for esps. This means you can't load moda.esp before modb.esp in one profile and the other way around in another.</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:'MS Shell Dlg 2'; font-size:8.25pt; 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;">This is the list of profiles. Each Profile contains its own list and installation order of enabled mods (from a shared pool), a configuration of enabled esps/esms, a copy of the games ini-file and an optional savegame filter.</p> -<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Note</span> For technical reasons it's currently not possible to have seperate load-orders for esps. This means you can't load moda.esp before modb.esp in one profile and the other way around in another.</p></body></html> - +</style></head><body style=" font-family:'MS Shell Dlg 2'; font-size:8.25pt; 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;">Это ÑпиÑок профилей. Каждый профиль Ñодержит Ñвой ÑобÑтвенный ÑпиÑок и порÑдок уÑтановки подключенных модов (из общего пула), наÑтройки подключенных esps/esms, копии игровых ini-файлов и опциональный фильтр Ñохранений.</p> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Примечание</span> По техничеÑким причинам невозможно иметь отдельные порÑдки загрузки Ð´Ð»Ñ esp. Это означает, что вы не Ñможете загрузить moda.esp пере modb.esp в одном профиле и иным образом в другом профиле.</p></body></html> If checked, savegames are local to this profile and will not appear when starting with a different profile. - + ЕÑли отмечено, ÑÐ¾Ñ…Ñ€Ð°Ð½ÐµÐ½Ð¸Ñ Ð±ÑƒÐ´ÑƒÑ‚ локальными Ð´Ð»Ñ Ñтого Ð¿Ñ€Ð¾Ñ„Ð¸Ð»Ñ Ð¸ не будут отображены Ð´Ð»Ñ Ð´Ñ€ÑƒÐ³Ð¸Ñ… профилей. Local Savegames - + Локальные ÑÐ¾Ñ…Ñ€Ð°Ð½ÐµÐ½Ð¸Ñ This ensures data files from mods are actually used. You want to enable this unless you use a different tool for Archive Invalidation. - + Это гарантирует иÑпользование файлов данных из модов. Вам нужно включить Ñто, еÑли вы не иÑпользуете других инÑтрументов Ð´Ð»Ñ Ð¸Ð½Ð²Ð°Ð»Ð¸Ð´Ð°Ñ†Ð¸Ð¸. - <!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"> + <!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:'MS Shell Dlg 2'; font-size:8.25pt; 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=" font-size:8pt;">The games Oblivion, Fallout 3 and Fallout NV contain a bug which prevents texture and mesh replacers (that is: all modifications to meshes and textures already in game) from working.</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt;">The Mod Organizer uses a workaround called &quot;BSA redirection&quot; (google is your friend) to fix this issue reliably and without further work. Simply activate and forget.</span></p> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:8pt;"></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt;">With Skyrim this bug seems to be fixed to a degree but whether a mod becomes active still depends on file dates. Therefore, it still makes sense to activate this.</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:'MS Shell Dlg 2'; font-size:8.25pt; 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=" font-size:8pt;">The games Oblivion, Fallout 3 and Fallout NV contain a bug which prevents texture and mesh replacers (that is: all modifications to meshes and textures already in game) from working.</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt;">The Mod Organizer uses a workaround called &quot;BSA redirection&quot; (google is your friend) to fix this issue reliably and without further work. Simply activate and forget.</span></p> -<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:8pt;"></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt;">With Skyrim this bug seems to be fixed to a degree but whether a mod becomes active still depends on file dates. Therefore, it still makes sense to activate this.</span></p></body></html> - +</style></head><body style=" font-family:'MS Shell Dlg 2'; font-size:8.25pt; 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=" font-size:8pt;">Игры Oblivion, Fallout 3 и Fallout NV Ñодержат баг, который делает неработоÑпоÑобными текÑтуры и модели реплейÑеров (то еÑть: вÑе Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð¼Ð¾Ð´ÐµÐ»ÐµÐ¹ и текÑтур в игре).</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt;">Mod Organizer иÑпользует ÑпоÑоб обхода, называемый &quot;BSA redirection&quot; (google в помощь), чтобы решить Ñту проблему надежно и без дальнейшей возни. ПроÑто подключить и забыть.</span></p> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:8pt;"></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt;">Ð’ Скайрим, кажетÑÑ, Ñтот баг иÑправлен в извеÑтной Ñтепени, но будет ли мод активным, завиÑит по прежнему от даты модификации файлов. ПоÑтому вÑÑ‘ ещё еÑть ÑмыÑл включить Ñто.</span></p></body></html> Automatic Archive Invalidation - + ÐвтоматичеÑÐºÐ°Ñ Ð¸Ð½Ð²Ð°Ð»Ð¸Ð´Ð°Ð´Ñ†Ð¸Ñ Create a new profile from scratch - + Создать новый профиль Â«Ñ Ð½ÑƒÐ»Ñ» Create - + Создать Clone the selected profile - + Клонировать выбранный профиль This creates a new profile with the same settings and active mods as the selected one. - + Это ÑоздаÑÑ‚ новый профиль Ñ Ñ‚Ð°ÐºÐ¸Ð¼Ð¸ же наÑтройками и активными модами, как у выбранного. Copy - + Копировать Delete the selected Profile. This can not be un-done! - + Удалить выбранный профиль. Это Ð½ÐµÐ»ÑŒÐ·Ñ Ð±ÑƒÐ´ÐµÑ‚ отменить! Remove - + Удалить Rename - + Переименовать Transfer save games to the selected profile. - + Передать ÑÐ¾Ñ…Ñ€Ð°Ð½ÐµÐ½Ð¸Ñ Ð² выбранный профиль. Transfer Saves - + Передать ÑÐ¾Ñ…Ñ€Ð°Ð½ÐµÐ½Ð¸Ñ @@ -3707,14 +3523,14 @@ p, li { white-space: pre-wrap; } - Archive invalidation isn't required for this game. - + Archive invalidation isn't required for this game. + Ð˜Ð½Ð²Ð°Ð»Ð¸Ð´Ð°Ñ†Ð¸Ñ Ð½Ðµ требуетÑÑ Ð´Ð»Ñ Ñтой игры. failed to create profile: %1 - + не удалоÑÑŒ Ñоздать профиль: %1 @@ -3724,42 +3540,42 @@ p, li { white-space: pre-wrap; } Please enter a name for the new profile - + Введите Ð¸Ð¼Ñ Ð½Ð¾Ð²Ð¾Ð³Ð¾ Ð¿Ñ€Ð¾Ñ„Ð¸Ð»Ñ failed to copy profile: %1 - + не удалоÑÑŒ Ñкопировать профиль: %1 Confirm - Подтвердить + Подтверждение Are you sure you want to remove this profile? - + Ð’Ñ‹ дейÑтвительно хотите удалить Ñтот профиль? Rename Profile - + Переименовать профиль New Name - + Ðовое Ð¸Ð¼Ñ failed to change archive invalidation state: %1 - + не удалоÑÑŒ изменить режим инвалидации: %1 failed to determine if invalidation is active: %1 - + не удалоÑÑŒ определить активноÑть инвалидации: %1 @@ -3767,7 +3583,7 @@ p, li { white-space: pre-wrap; } Failed to save custom categories - + Ðе удалоÑÑŒ Ñохранить пользовательÑкие категории @@ -3775,301 +3591,311 @@ p, li { white-space: pre-wrap; } invalid index %1 - Ðеверный Ð¸Ð½Ð´ÐµÐºÑ %1 + неверный Ð¸Ð½Ð´ÐµÐºÑ %1 invalid category id %1 - + неверный id категории %1 + + + + invalid field name "%1" + неверное Ð¸Ð¼Ñ Ð¿Ð¾Ð»Ñ "%1" + + + + invalid type for "%1" (should be integer) + неверный тип Ð´Ð»Ñ "%1" (должно быть целое) + + + + invalid type for "%1" (should be string) + неверный тип Ð´Ð»Ñ "%1" (должна быть Ñтрока) + + + + invalid type for "%1" (should be float) + неверный тип Ð´Ð»Ñ "%1" (должно быть Ñ Ð¿Ð»Ð°Ð²Ð°ÑŽÑ‰ÐµÐ¹ запÑтой) + + + + no fields set up yet! + уÑтановленных полей ещё нет! + + + + field not set "%1" + поле не уÑтановлено "%1" + + + + invalid character in field "%1" + неверный Ñимвол в поле "%1" + + + + empty field name + пуÑтое Ð¸Ð¼Ñ Ð¿Ð¾Ð»Ñ + + + + invalid game type %1 + неверный тип игры %1 helper failed - + Ñбой помощника failed to determine account name - + не удалоÑÑŒ определить Ð¸Ð¼Ñ Ð°ÐºÐºÐ°ÑƒÐ½Ñ‚Ð° invalid 7-zip32.dll: %1 - + неверный 7-zip32.dll: %1 failed to open %1: %2 - + не удалоÑÑŒ открыть %1: %2 %1 not found - + %1 не найден Failed to delete %1 - + Ðе удалоÑÑŒ удалить %1 Failed to deactivate script extender loading - + Ðе удалоÑÑŒ отключить загрузку раÑÑˆÐ¸Ñ€Ð¸Ñ‚ÐµÐ»Ñ Ñкриптов Failed to remove %1: %2 - + Ðе удалоÑÑŒ удалить %1: %2 Failed to rename %1 to %2 - + Ðе удалоÑÑŒ переименовать %1 в %2 Failed to deactivate proxy-dll loading - + Ðе удалоÑÑŒ отключить загрузку proxy-dll Failed to copy %1 to %2 - + Ðе удалоÑÑŒ Ñкопировать %1 в %2 Failed to set up script extender loading - + Ðе удалоÑÑŒ уÑтановить загрузку раÑÑˆÐ¸Ñ€Ð¸Ñ‚ÐµÐ»Ñ Ñкриптов Failed to delete old proxy-dll %1 - + Ðе удалоÑÑŒ удалить Ñтарый proxy-dll %1 Failed to overwrite %1 - + Ðе удалоÑÑŒ заменить %1 Failed to set up proxy-dll loading - - - - - "%1" is missing - + Ðе удалоÑÑŒ уÑтановить загрузку proxy-dll Permissions required - + ТребуютÑÑ Ð¿Ñ€Ð°Ð²Ð° доÑтупа + + + + The current user account doesn't have the required access rights to run Mod Organizer. The neccessary changes can be made automatically (the MO directory will be made writable for the current user account). You will be asked to run "helper.exe" with administrative rights). + Текущий аккаунт Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ Ð½Ðµ имеет необходимых прав Ð´Ð»Ñ Ð·Ð°Ð¿ÑƒÑка Mod Organizer. Ðеобходимые Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð¼Ð¾Ð³ÑƒÑ‚ быть Ñделаны автоматичеÑки (каталог MO будет уÑтановлен запиÑываемым Ð´Ð»Ñ Ñ‚ÐµÐºÑƒÑ‰ÐµÐ³Ð¾ аккаунта пользователÑ). Вам будет предложено запуÑтить "helper.exe" Ñ Ð¿Ñ€Ð°Ð²Ð°Ð¼Ð¸ админиÑтратора. Woops - - - - - The current user account doesn't have the required access rights to run Mod Organizer. The neccessary changes can be made automatically (the MO directory will be made writable for the current user account). You will be asked to run "helper.exe" with administrative rights). - + Ð£Ð¿Ñ ModOrganizer has crashed! Should a diagnostic file be created? If you send me this file (%1) to sherb@gmx.net, the bug is a lot more likely to be fixed. Please include a short description of what you were doing when the crash happened - + Mod Organizer вышел из ÑтроÑ! Ðужно ли Ñоздать диагноÑтичеÑкий файл? ЕÑли вы вышлите файл (%1) по адреÑу sherb@gmx.net, ошибка Ñ Ð½Ð°Ð¼Ð½Ð¾Ð³Ð¾ большей вероÑтноÑтью будет иÑправлена. ПожалуйÑта, добавьте краткое опиÑание Ñвоих дейÑтвий, перед тем, как произошла ошибка ModOrganizer has crashed! Unfortunately I was not able to write a diagnostic file: %1 - + ModOrganizer вышел из ÑтроÑ! К Ñожалению не удалоÑÑŒ запиÑать диагноÑтичеÑкий файл: %1 - + Mod Organizer - + Mod Organizer An instance of Mod Organizer is already running - + Другой ÑкземплÑÑ€ Mod Organizer уже запущен - No game identified in "%1". The directory is required to contain the game binary and its launcher. - + No game identified in "%1". The directory is required to contain the game binary and its launcher. + Игра не обнаружена в "%1". ТребуетÑÑ, чтобы папка Ñодержала иÑполнÑемые файлы игры. Please select the game to manage - + Выберете игру Ð´Ð»Ñ ÑƒÐ¿Ñ€Ð°Ð²Ð»ÐµÐ½Ð¸Ñ - - Please use "Help" from the toolbar to get usage instructions to all elements - + + Please use "Help" from the toolbar to get usage instructions to all elements + ИÑпользуйте пункт "Справка" на панели инÑтрументов, чтобы получить инÑтрукции по иÑпользованию вÑех Ñлементов. - - + + <Manage...> - + <УправлÑть...> - + failed to parse profile %1: %2 - + не удалоÑÑŒ обработать профиль %1: %2 - + - failed to find "%1" - + failed to find "%1" + не удалоÑÑŒ найти "%1" + + + + encoding error, please report this as a bug and include the file mo_interface.log! + ошибка кодированиÑ, пожалуйÑта Ñообщите об Ñтом баге, включив файл mo_interface.log! failed to access %1 - + не удалоÑÑŒ получить доÑтуп к %1 failed to set file time %1 - + не удалоÑÑŒ изменить дату модификации Ð´Ð»Ñ %1 failed to create %1 - + не удалоÑÑŒ Ñоздать %1 + + + + "%1" is missing + "%1" отÑутÑтвует Before you can use ModOrganizer, you need to create at least one profile. ATTENTION: Run the game at least once before creating a profile! - + Перед тем, как иÑпользовать Mod Organizer, вам нужно Ñоздать Ñ…Ð¾Ñ‚Ñ Ð±Ñ‹ один профиль. Ð’ÐИМÐÐИЕ: Перед Ñозданием Ð¿Ñ€Ð¾Ñ„Ð¸Ð»Ñ Ð·Ð°Ð¿ÑƒÑтите игру Ñ…Ð¾Ñ‚Ñ Ð±Ñ‹ один раз! Error - + Ошибка wrong file format - + неверный формат файла failed to open %1 - + не удалоÑÑŒ открыть %1 - + Script Extender - + Script Extender - + Proxy DLL - + Proxy DLL - failed to spawn "%1" - + failed to spawn "%1" + не удалоÑÑŒ вызвать "%1" Elevation required - + ТребуетÑÑ Ð¿Ð¾Ð²Ñ‹ÑˆÐµÐ½Ð¸Ðµ прав This process requires elevation to run. This is a potential security risk so I highly advice you to investigate if -"%1" +"%1" can be installed to work without elevation. Start elevated anyway? (you will be asked if you want to allow ModOrganizer.exe to make changes to the system) - + Этот процеÑÑ Ñ‚Ñ€ÐµÐ±ÑƒÐµÑ‚ Ð¿Ð¾Ð²Ñ‹ÑˆÐµÐ½Ð¸Ñ Ð¿Ñ€Ð°Ð² на запуÑк. +Это потенциальный риÑк Ð´Ð»Ñ Ð±ÐµÐ·Ð¾Ð¿Ð°ÑноÑти, поÑтому наÑтоÑтельно рекомендуетÑÑ Ð¸Ð·ÑƒÑ‡Ð¸Ñ‚ÑŒ +"%1" + на возможноÑть уÑтановки без Ð¿Ð¾Ð²Ñ‹ÑˆÐµÐ½Ð¸Ñ Ð¿Ñ€Ð°Ð². + +ЗапуÑтить Ñ Ð¿Ð¾Ð²Ñ‹ÑˆÐµÐ½Ð½Ñ‹Ð¼Ð¸ правами в любом Ñлучае? (будет выведен Ð·Ð°Ð¿Ñ€Ð¾Ñ Ð¾ разрешении ModOrganizer.exe Ñделать Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð² ÑиÑтеме) - failed to spawn "%1": %2 - + failed to spawn "%1": %2 + не удалоÑÑŒ вызвать "%1": %2 - "%1" doesn't exist - + "%1" doesn't exist + "%1" не ÑущеÑтвует - failed to inject dll into "%1": %2 - + failed to inject dll into "%1": %2 + не удалоÑÑŒ подключить dll к "%1": %2 - failed to run "%1" - - - - - invalid field name "%1" - - - - - invalid type for "%1" (should be integer) - - - - - invalid type for "%1" (should be string) - - - - - invalid type for "%1" (should be float) - - - - - no fields set up yet! - - - - - field not set "%1" - - - - - invalid character in field "%1" - - - - - empty field name - - - - - invalid game type %1 - + failed to run "%1" + не удалоÑÑŒ запуÑтить "%1" @@ -4077,22 +3903,22 @@ Start elevated anyway? (you will be asked if you want to allow ModOrganizer.exe Mod Exists - + Мод ÑущеÑтвует This mod seems to be installed already. Do you want to add files from this archive (overwriting existing ones) or do you want to completely replace the existing files (old files are deleted)? Alternatively you can install this mod under a different name. - + КажетÑÑ, что Ñтот мод уже уÑтановлен. Ð’Ñ‹ хотите добавить файлы из архива (Ñ Ð¿ÐµÑ€ÐµÐ·Ð°Ð¿Ð¸Ñью уже ÑущеÑтвующих) или вам нужно полноÑтью заменить ÑущеÑтвующие файлы (Ñтарые будут удалены)? Как вариант, вы можете уÑтановить Ñтот мод под другим именем. Keep Backup - + ОÑтавить резервную копию Merge - + Объединить @@ -4102,7 +3928,7 @@ Start elevated anyway? (you will be asked if you want to allow ModOrganizer.exe Rename - + Переименовать @@ -4115,7 +3941,7 @@ Start elevated anyway? (you will be asked if you want to allow ModOrganizer.exe Remember selection - + Запомнить выбор @@ -4123,27 +3949,27 @@ Start elevated anyway? (you will be asked if you want to allow ModOrganizer.exe Save # - + Сохранение â„– Character - + ПерÑонаж Level - + Уровень Location - + МеÑтоположение Date - + Дата @@ -4151,7 +3977,7 @@ Start elevated anyway? (you will be asked if you want to allow ModOrganizer.exe Missing ESPs - + ОтÑутÑтвующие ESP @@ -4159,17 +3985,17 @@ Start elevated anyway? (you will be asked if you want to allow ModOrganizer.exe Dialog - + Диалог Copy To Clipboard - + Копировать в буфер обмена Save As... - + Сохранить как... @@ -4179,17 +4005,17 @@ Start elevated anyway? (you will be asked if you want to allow ModOrganizer.exe Save CSV - + Сохранить CSV Text Files - + ТекÑтовые файлы - failed to open "%1" for writing - + failed to open "%1" for writing + не удалоÑÑŒ открыть "%1" Ð´Ð»Ñ Ð·Ð°Ð¿Ð¸Ñи @@ -4197,7 +4023,7 @@ Start elevated anyway? (you will be asked if you want to allow ModOrganizer.exe Select - + Выбрать @@ -4214,8 +4040,8 @@ Start elevated anyway? (you will be asked if you want to allow ModOrganizer.exe SelfUpdater - archive.dll not loaded: "%1" - + archive.dll not loaded: "%1" + archive.dll не загружен: "%1" @@ -4223,95 +4049,95 @@ Start elevated anyway? (you will be asked if you want to allow ModOrganizer.exe Update - + Обновление An update is available (newest version: %1), do you want to install it? - + ДоÑтупно обновление (поÑледнÑÑ Ð²ÐµÑ€ÑиÑ: %1). Ð’Ñ‹ хотите уÑтановить его? Download in progress - + Загрузка в процеÑÑе Download failed: %1 - + Загрузка не удалаÑÑŒ: %1 Failed to install update: %1 - + Ðе удалоÑÑŒ уÑтановить обновление: %1 - failed to open archive "%1": %2 - Ðе удалоÑÑŒ открыть архив "%1": %2 + failed to open archive "%1": %2 + не удалоÑÑŒ открыть архив "%1": %2 failed to move outdated files: %1. Please update manually. - + не удалоÑÑŒ перемеÑтить уÑтаревшие файлы: %1. ПожалуйÑта, обновите вручную. Update installed, Mod Organizer will now be restarted. - + Обновление уÑтановлено, Mod Organizer будет перезапущен. Error - + Ошибка Failed to parse response. Please report this as a bug and include the file mo_interface.log. - + Ðе удалоÑÑŒ обработать запроÑ. ПожалуйÑта, Ñообщите об Ñтом баге, включив в Ñообщение файл mo_interface.log. No incremental update available for this version, the complete package needs to be downloaded (%1 kB) - + Ðет дополнительных обновлений Ð´Ð»Ñ Ñтой верÑии, необходимо загрузить полный пакет (%1 kB) no file for update found. Please update manually. - - - - - No download server available. Please try again later. - Сервер недоÑтупен. Попробуйте позже. + не найдено файла Ð´Ð»Ñ Ð¾Ð±Ð½Ð¾Ð²Ð»ÐµÐ½Ð¸Ñ. ПожалуйÑта, обновите вручную. Failed to retrieve update information: %1 - + Ðе удалоÑÑŒ получить ÑÐ²ÐµÐ´ÐµÐ½Ð¸Ñ Ð¾Ð± обновлении: %1 + + + + No download server available. Please try again later. + Ðет доÑтупных Ð´Ð»Ñ Ð·Ð°Ð³Ñ€ÑƒÐ·ÐºÐ¸ Ñерверов. ПожалуйÑта, попробуйте позже. Settings - - setting for invalid plugin "%1" requested - + + setting for invalid plugin "%1" requested + запрошена наÑтройка Ð´Ð»Ñ Ð½ÐµÐ´ÐµÐ¹Ñтвительного плагина "%1" - - invalid setting "%1" requested for plugin "%2" - + + invalid setting "%1" requested for plugin "%2" + Ð½ÐµÐ²ÐµÑ€Ð½Ð°Ñ Ð½Ð°Ñтройка "%1" запрошена Ð´Ð»Ñ Ð¿Ð»Ð°Ð³Ð¸Ð½Ð° "%2" - + Confirm - Подтвердить + Подтверждение - + Changing the mod directory affects all your profiles! Mods not present (or named differently) in the new location will be disabled in all profiles. There is no way to undo this unless you backed up your profiles manually. Proceed? - + Изменение каталога Ð´Ð»Ñ Ð¼Ð¾Ð´Ð¾Ð² отразитÑÑ Ð½Ð° вÑех ваших профилÑÑ…. ÐÐµÐ»ÑŒÐ·Ñ Ð±ÑƒÐ´ÐµÑ‚ отменить Ñто, еÑли только вы не Ñохранили резервные копии ваших профилей вручную. Продолжить? @@ -4319,169 +4145,178 @@ Start elevated anyway? (you will be asked if you want to allow ModOrganizer.exe Settings - + ÐаÑтройки General - + Общие Language - + Язык The display language - + ИÑпользуемый Ñзык - <!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"> + <!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:'MS Shell Dlg 2'; font-size:8.25pt; 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=" font-size:8pt;">The display language. This will only displaye languages for which you have a translation installed.</span></p></body></html> - +</style></head><body style=" font-family:'MS Shell Dlg 2'; font-size:8.25pt; 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=" font-size:8pt;">The display language. This will only displaye languages for which you have a translation installed.</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:'MS Shell Dlg 2'; font-size:8.25pt; 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=" font-size:8pt;">ИÑпользуемый Ñзык. Будут отображены Ñзыки, Ð»Ð¾ÐºÐ°Ð»Ð¸Ð·Ð°Ñ†Ð¸Ñ Ð½Ð° которые имеетÑÑ.</span></p></body></html> Style - + Стиль graphical style - + графичеÑкий Ñтиль graphical style of the MO user interface - + графичеÑкий Ñтиль пользовательÑкого интерфейÑа MO Log Level - + Уровень Ð¶ÑƒÑ€Ð½Ð°Ð»Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ - Decides the amount of data printed to "ModOrganizer.log" - + Decides the amount of data printed to "ModOrganizer.log" + ОпределÑет количеÑтво данных, выводимых в "ModOrganizer.log" - Decides the amount of data printed to "ModOrganizer.log". -"Debug" produces very useful information for finding problems. There is usually no noteworthy performance impact but the file may become rather large. If this is a problem you may prefer the "Info" level for regluar use. On the "Error" level the log file usually remains empty. - + Decides the amount of data printed to "ModOrganizer.log". +"Debug" produces very useful information for finding problems. There is usually no noteworthy performance impact but the file may become rather large. If this is a problem you may prefer the "Info" level for regluar use. On the "Error" level the log file usually remains empty. + ОпределÑет количеÑтво данных, выводимых в "ModOrganizer.log". +"Отладка" позволÑет получить очень полезную Ð´Ð»Ñ Ð¿Ð¾Ð¸Ñка проблем информацию. ВлиÑÐ½Ð¸Ñ Ð½Ð° производительноÑть не замечено, однако размер лога может быть довольно большим. ЕÑли Ñто проблема, то вы можете предпочеÑть Ð´Ð»Ñ Ð¾Ð±Ñ‹Ñ‡Ð½Ð¾Ð³Ð¾ иÑÐ¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ ÑƒÑ€Ð¾Ð²ÐµÐ½ÑŒ "ИнформациÑ". Ðа уровне "Ошибка" лог обычно оÑтаетÑÑ Ð¿ÑƒÑтым. Debug - + Отладка Info - + Ð˜Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ Error - + Ошибка Advanced - + Продвинутый Directory where downloads are stored. - + Каталог, в котором хранÑÑ‚ÑÑ Ð·Ð°Ð³Ñ€ÑƒÐ·ÐºÐ¸. Mod Directory - + Каталог модов Directory where mods are stored. - + Каталог, в котором хранÑÑ‚ÑÑ Ð¼Ð¾Ð´Ñ‹. - Directory where mods are stored. Please note that changing this will break all associations of profiles with mods that don't exist in the new location (with the same name). - + Directory where mods are stored. Please note that changing this will break all associations of profiles with mods that don't exist in the new location (with the same name). + Каталог, в котором хранÑÑ‚ÑÑ Ð¼Ð¾Ð´Ñ‹. Имейте ввиду, Ñти Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð½Ð°Ñ€ÑƒÑˆÐ°Ñ‚ вÑе аÑÑоциации профилей Ñ Ð½ÐµÑущеÑтвующими в новом раÑположении модами (Ñ Ñ‚ÐµÐ¼ же именем). Download Directory - + Каталог Ð´Ð»Ñ Ð·Ð°Ð³Ñ€ÑƒÐ·ÐºÐ¸ Cache Directory - + Каталог кÑша Reset stored information from dialogs. - + Ð¡Ð±Ñ€Ð¾Ñ Ñ…Ñ€Ð°Ð½Ð¸Ð¼Ð¾Ð¹ информации о диалогах. - This will make all dialogs show up again where you checked the "Remember selection"-box. - + This will make all dialogs show up again where you checked the "Remember selection"-box. + ЗаÑтавит Ñнова поÑвитьÑÑ Ð²Ñе диалоги, в которых вы ранее отмечали флажок "Запомнить выбор". Reset Dialogs - + СброÑить диалоги Modify the categories available to arrange your mods. - + Изменение категорий, доÑтупных Ð´Ð»Ñ ÑƒÐ¿Ð¾Ñ€ÑÐ´Ð¾Ñ‡Ð¸Ð²Ð°Ð½Ð¸Ñ Ð²Ð°ÑˆÐ¸Ñ… модов. Configure Mod Categories - + ÐаÑтроить категории модов Nexus - + Nexus Allows automatic log-in when the Nexus-Page for the game is clicked. - + ПозволÑет автоматичеÑки входить, кликнув на Nexus-Ñтраницу игры. - <!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"> + <!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:'MS Shell Dlg 2'; font-size:8.25pt; 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=" font-size:8pt;">Allows automatic log-in when the Nexus-Page for the game is clicked. Please note that the obfuscation with which the password is stored in modorganizer.ini is not very strong. If you're worried someone might steal your password, don't store it here.</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:'MS Shell Dlg 2'; font-size:8.25pt; 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=" font-size:8pt;">Allows automatic log-in when the Nexus-Page for the game is clicked. Please note that the obfuscation with which the password is stored in modorganizer.ini is not very strong. If you're worried someone might steal your password, don't store it here.</span></p></body></html> - +</style></head><body style=" font-family:'MS Shell Dlg 2'; font-size:8.25pt; 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=" font-size:8pt;">ПозволÑет автоматичеÑки входить, кликнув на Nexus-Ñтраницу игры. Обратите внимание, что шифрование Ñ ÐºÐ¾Ñ‚Ð¾Ñ€Ñ‹Ð¼ пароль хранитÑÑ Ð² файле modorganizer.ini не очень Ñильное. ЕÑли вы беÑпокоитеÑÑŒ, что кто-нибудь может украÑть ваш пароль, не храните его здеÑÑŒ.</span></p></body></html> If checked and if correct credentials are entered below, log-in to Nexus (for browsing and downloading) is automatic. - + ЕÑли отмечено и данные ниже введены правильно, входит на Nexus (Ð´Ð»Ñ Ð¿Ñ€Ð¾Ñмотра и загрузки) автоматичеÑки. Automatically Log-In to Nexus - + ÐвтоматичеÑкий вход на Nexus @@ -4493,220 +4328,244 @@ p, li { white-space: pre-wrap; } Password Пароль + + + Disable automatic internet features + Отключить автоматичеÑкие возможноÑти интернет + + + + Disable automatic internet features. This does not affect features that are explicitly invoked by the user (like checking mods for updates, endorsing, opening the web browser) + Отключает автоматичеÑкие возможноÑти интернет. Это не подейÑтвует на функции, которые Ñвно вызваны пользователем (проверка модов на обновлениÑ, одобрение, открытие в браузере) + + + + Offline Mode + Ðвтономный режим + + + + Use a proxy for network connections. + ИÑпользовать прокÑи Ð´Ð»Ñ ÑÐ¾ÐµÐ´Ð¸Ð½ÐµÐ½Ð¸Ñ Ñ Ñетью + + + + Use a proxy for network connections. This uses the system-wide settings which can be configured in Internet Explorer. Please note that MO will start up a few seconds slower on some systems when using a proxy. + ИÑпользовать прокÑи Ð´Ð»Ñ ÑÐ¾ÐµÐ´Ð¸Ð½ÐµÐ½Ð¸Ñ Ñ Ñетью. ИÑпользуютÑÑ ÑиÑтемные параметры, наÑтраиваемые в Internet Explorer. Обратите внимание, что MO запуÑтитÑÑ Ð½Ð° неÑколько Ñекунд медленнее на некоторых ÑиÑтемах, когда иÑпользуетÑÑ Ð¿Ñ€Ð¾ÐºÑи. + + + + Use HTTP Proxy (Uses System Settings) + ИÑпользовать HTTP Proxy (ИÑпользуютÑÑ ÑиÑтемные наÑтройки) + + + + Known Servers (Dynamically updated every download) + ИзвеÑтные Ñерверы (ДинамичеÑки обновлÑетÑÑ Ð¿Ñ€Ð¸ каждой загрузке) + + + + Preferred Servers (Drag & Drop) + Предпочитаемые Ñерверы (ИÑпользуйте перетаÑкивание) + Plugins - + Плагины Author: - + Ðвтор: Version: - + ВерÑиÑ: Description: - + ОпиÑание: Key - + Клавиша Value - + Значение Workarounds - + СпоÑобы обхода Steam App ID - + ID Ð¿Ñ€Ð¸Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ Steam The Steam AppID for your game - + ID в Steam Ð´Ð»Ñ Ð²Ð°ÑˆÐµÐ¹ игры - <!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"> + <!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:'MS Shell Dlg 2'; font-size:8.25pt; 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=" font-size:8pt;">The Steam App ID is required to directly start some games. For Skyrim, if this is not set or wrong, the &quot;Mod Organizer&quot; load mechanism may not work properly.</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt;">The preset for this is the App ID of the &quot;regular&quot; version so in most cases, you should be set.</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt;">If you think you have a different version (GotY or something), follow these steps to get to the id:</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt;">1. Navigate to the game library in steam</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt;">2. right-click on the game you need the id for and choose </span><span style=" font-size:8pt; font-weight:600;">Create desktop shortcut</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt;">3. right-click on the newly created shortcut on your desktop and select </span><span style=" font-size:8pt; font-weight:600;">Properties</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt;">4. in the URL-field you should see something like this: </span><span style=" font-size:8pt; font-style:italic;">steam://rungameid/22380</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt;">22380 is the id you're looking for.</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:'MS Shell Dlg 2'; font-size:8.25pt; 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=" font-size:8pt;">The Steam App ID is required to directly start some games. For Skyrim, if this is not set or wrong, the &quot;Mod Organizer&quot; load mechanism may not work properly.</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt;">The preset for this is the App ID of the &quot;regular&quot; version so in most cases, you should be set.</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt;">If you think you have a different version (GotY or something), follow these steps to get to the id:</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt;">1. Navigate to the game library in steam</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt;">2. right-click on the game you need the id for and choose </span><span style=" font-size:8pt; font-weight:600;">Create desktop shortcut</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt;">3. right-click on the newly created shortcut on your desktop and select </span><span style=" font-size:8pt; font-weight:600;">Properties</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt;">4. in the URL-field you should see something like this: </span><span style=" font-size:8pt; font-style:italic;">steam://rungameid/22380</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt;">22380 is the id you're looking for.</span></p></body></html> - +</style></head><body style=" font-family:'MS Shell Dlg 2'; font-size:8.25pt; 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=" font-size:8pt;">ID Ð¿Ñ€Ð¸Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ Ð² Steam необходим Ð´Ð»Ñ Ð¿Ñ€Ñмого запуÑка некоторых игр. Ð”Ð»Ñ Skyrim, еÑли он не уÑтановлен или неверен, механизм загрузки &quot;Mod Organizer&quot; может работать неправильно.</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt;">ПредуÑтановленный ID в большинÑтве Ñлучаев должен быть уÑтановлен.</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt;">ЕÑли вы думаете, что у Ð²Ð°Ñ Ð´Ñ€ÑƒÐ³Ð°Ñ Ð²ÐµÑ€ÑÐ¸Ñ (GotY или другое), Ñледуйте Ñледующей инÑтрукции по уÑтановке id:</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt;">1. Перейдите в библиотеку игр Steam.</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt;">2. Сделайте правый клик по игре, id которой нужен и выберете </span><span style=" font-size:8pt; font-weight:600;">Создать Ñрлык на рабочем Ñтоле</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt;">3. Сделайте правый клик на Ñозданном на рабочем Ñтоле Ñрлыке и выберете </span><span style=" font-size:8pt; font-weight:600;">СвойÑтва</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt;">4. в поле URL вы должны увидеть что-то вроде: </span><span style=" font-size:8pt; font-style:italic;">steam://rungameid/22380</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt;">22380 Ñто и еÑть id, который вам нужен.</span></p></body></html> Load Mechanism - + Механизм загрузки Select loading mechanism. See help for details. - + Выберете механизм загрузки. Смотрите Ñправку Ð´Ð»Ñ Ð¿Ð¾Ð´Ñ€Ð¾Ð±Ð½Ð¾Ñтей. + + + + Mod Organizer needs a dll to be injected into the game so all mods are visible to it. +There are several means to do this: +*Mod Organizer* (default) In this mode the Mod Organizer itself injects the dll. The disadvantage is that you always have to start the game through MO or a link created by it. +*Script Extender* In this mode, MO is installed as a Script Extender (obse, fose, nvse, skse) plugin. +*Proxy DLL* In this mode, MO replaces one of the game's dlls with one that loads MO (and the original dll of course). This will ONLY work with Steam games and it has only been tested with Skyrim. Please use this only if the other mechanisms don't work. + +If you use the Steam version of Oblivion the default will NOT work. In this case, please install obse and use "Script Extender" as the load mechanism. Also you can then not start Oblivion from MO. Instead, use MO only to set up your mods, then quit and start Oblivion through Steam. + Mod Organizer необходимо подключить dll к игре, чтобы вÑе моды были видны в ней. +ЕÑть неÑколько ÑпоÑобов Ñделать Ñто: +*Mod Organizer* (по умолчанию) Ð’ Ñтом режиме Mod Organizer Ñам подключает dll. ÐедоÑтатком Ñтого ÑвлÑетÑÑ Ñ‚Ð¾, что вам необходимо вÑегда начинать игру через MO или Ñозданный им Ñрлык. +*Script Extender* Ð’ Ñтом режиме, MO уÑтановлен как плагин Script Extender (obse, fose, nvse, skse). +*Proxy DLL* Ð’ Ñтом режиме MO заменÑет одну из игровых dll игры Ñвоей, ÐºÐ¾Ñ‚Ð¾Ñ€Ð°Ñ Ð·Ð°Ð³Ñ€ÑƒÐ¶Ð°ÐµÑ‚ MO и оригинальную игру. Это работает только Ñ Ð¸Ð³Ñ€Ð°Ð¼Ð¸ Steam и теÑтировалоÑÑŒ только на Skyrim. ИÑпользуйте Ñтот ÑпоÑоб только еÑли другие не работают. + +ЕÑли вы иÑпользуете Steam-верÑию Oblivion , ÑпоÑоб по умолчанию не работает. Ð’ Ñтом Ñлучае уÑтановите obse и иÑпользуйте "Script Extender" как механизм загрузки. Также поÑле Ñтого вы не Ñможете запуÑтить Oblivion из MO, вмеÑто Ñтого иÑпользуйте MO только Ð´Ð»Ñ Ð½Ð°Ñтройки модов и запуÑкайте игру через Steam. NMM Version - + ВерÑÐ¸Ñ NMM The Version of Nexus Mod Manager to impersonate. - + ВерÑÐ¸Ñ Nexus Mod Manager Ð´Ð»Ñ Ð¿Ñ€ÐµÐ´ÑтавлениÑ. Mod Organizer uses an API provided by the Nexus to provide features like checking for updates and downloading files. Unfortunately this API has not been made available officially to third party tools like MO so we have to impersonate the Nexus Mod Manager to be allowed in. -On top of this Nexus has used the client identification to lock out outdated versions of NMM to force users to update. This means that MO also needs to impersonate the new version of NMM even if MO doesn't need an update. Therefore you can configure the version to identify as here. -Please note that MO does identify itself as MO to the webserver, it's not lying about what it is. It is merely adding a "compatible" NMM version to the user agent. +On top of this Nexus has used the client identification to lock out outdated versions of NMM to force users to update. This means that MO also needs to impersonate the new version of NMM even if MO doesn't need an update. Therefore you can configure the version to identify as here. +Please note that MO does identify itself as MO to the webserver, it's not lying about what it is. It is merely adding a "compatible" NMM version to the user agent. -tl;dr-version: If Nexus-features don't work, insert the current version number of NMM here and try again. - - - - - These are workarounds for problems with Mod Organizer. Please make sure you read the help text before changing anything here. - +tl;dr-version: If Nexus-features don't work, insert the current version number of NMM here and try again. + Mod Organizer иÑпользует API Nexus , Ð´Ð»Ñ Ð¿Ñ€ÐµÐ´Ð¾ÑÑ‚Ð°Ð²Ð»ÐµÐ½Ð¸Ñ Ñ‚Ð°ÐºÐ¸Ñ… возможноÑтей, как проверка обновлений и загрузка файлов. К Ñожалению Ñтот API не был Ñделан официально доÑтупным прочим утилитам, вроде MO, так что нужно предÑтавлÑтьÑÑ ÐºÐ°Ðº Nexus Mod Manager, чтобы получить доÑтуп. +Помимо Ñтого Nexus иÑпользует идентификатор верÑий, чтобы блокировать уÑтаревшии верÑии NMM и принудительно заÑтавить пользователей обновитьÑÑ. Это значит, что MO также нужно предÑтавлÑтьÑÑ Ð¿Ð¾Ñледней верÑией NMM, даже еÑли MO не нуждаетÑÑ Ð² обновлении. ПоÑтому вы можете наÑтроить здеÑÑŒ также и верÑию Ð´Ð»Ñ Ð¸Ð´ÐµÐ½Ñ‚Ð¸Ñ„Ð¸ÐºÐ°Ñ†Ð¸Ð¸. +Обратите внимание, что MO идентифицирует ÑÐµÐ±Ñ Ð²ÐµÐ±Ñерверу как MO, он не подделывает данные о Ñебе. Он вÑего лишь добавлÑетÑÑ ÐºÐ°Ðº "ÑовмеÑтимаÑ" Ñ NMM верÑиÑ, в поле user agent. + +tl;dr-верÑиÑ: ЕÑли возможноÑти Nexus не работают, вÑтавьте здеÑÑŒ текущую верÑию NMM и повторите попытку. Enforces that inactive ESPs and ESMs are never loaded. - - - - - Disable automatic internet features - - - - - Disable automatic internet features. This does not affect features that are explicitly invoked by the user (like checking mods for updates, endorsing, opening the web browser) - - - - - Offline Mode - - - - - Use a proxy for network connections. - - - - - Use a proxy for network connections. This uses the system-wide settings which can be configured in Internet Explorer. Please note that MO will start up a few seconds slower on some systems when using a proxy. - - - - - Use HTTP Proxy (Uses System Settings) - - - - - Known Servers (Dynamically updated every download) - - - - - Preferred Servers (Drag & Drop) - - - - - Mod Organizer needs a dll to be injected into the game so all mods are visible to it. -There are several means to do this: -*Mod Organizer* (default) In this mode the Mod Organizer itself injects the dll. The disadvantage is that you always have to start the game through MO or a link created by it. -*Script Extender* In this mode, MO is installed as a Script Extender (obse, fose, nvse, skse) plugin. -*Proxy DLL* In this mode, MO replaces one of the game's dlls with one that loads MO (and the original dll of course). This will ONLY work with Steam games and it has only been tested with Skyrim. Please use this only if the other mechanisms don't work. - -If you use the Steam version of Oblivion the default will NOT work. In this case, please install obse and use "Script Extender" as the load mechanism. Also you can then not start Oblivion from MO. Instead, use MO only to set up your mods, then quit and start Oblivion through Steam. - + ОбеÑпечивает то, что неактивные ESP и ESM не будут загружены. - It seems that the Games occasionally load ESP or ESM files even if they haven't been activated as plugins. -I don't yet know what the circumstances are, but user reports imply it is in some cases unwanted. If this is checked, ESPs and ESMs not checked in the List are invisible to the game and can not be loaded. - + It seems that the Games occasionally load ESP or ESM files even if they haven't been activated as plugins. +I don't yet know what the circumstances are, but user reports imply it is in some cases unwanted. If this is checked, ESPs and ESMs not checked in the List are invisible to the game and can not be loaded. + КажетÑÑ, что иногда игры загружают ESP и ESM файлы, даже еÑли они не были не подключены как плагины +ОбÑтоÑтельÑтва Ñтого пока не извеÑтны, но отчеты пользователей подразумевают, что Ñто в Ñ€Ñде Ñлучаев нежелательно. ЕÑли Ñтот флажок отмечен, не отмеченные в ÑпиÑке ESP и ESM не будут видимы в ÑпиÑке и не будут загружены. Hide inactive ESPs/ESMs - + Скрыть неактивные ESPs/ESMs If checked, files (i.e. esps, esms and bsas) belonging to the core game can not be disabled in the UI. (default: on) - + ЕÑли отмечено, файлы (Ñ‚.е. esp, esm и bsa) принадлежащие оÑновной игре не Ñмогут быть отключены из интерфейÑа. (по умолчанию: вкл) If checked, files (i.e. esps, esms and bsas) belonging to the core game can not be disabled in the UI. (default: on) Uncheck this if you want to use Mod Organizer with total conversions (like Nehrim) but be aware that the game will crash if required files are not enabled. - + ЕÑли отмечено, файлы (Ñ‚.е. esp, esm и bsa) принадлежащие оÑновной игре не Ñмогут быть отключены из интерфейÑа. (по умолчанию: вкл) +Снимите флажок, еÑли вы ÑобираетеÑÑŒ иÑпользовать Mod Organizer Ñ Ñ‚Ð¾Ñ‚Ð°Ð»ÑŒÐ½Ñ‹Ð¼Ð¸ конверÑиÑми (как Nehrim) , но будьте оÑторожны, игра может вылететь, еÑли требуемые файлы будут отключены. Force-enable game files - + Принудительно подключить файлы игры For Skyrim, this can be used instead of Archive Invalidation. It should make AI redundant for all Profiles. For the other games this is not a sufficient replacement for AI! - + Ð”Ð»Ñ Ð¡ÐºÐ°Ð¹Ñ€Ð¸Ð¼ Ñто может быть иÑпользовано вмеÑто инвалидации. Это должно Ñделать AI избыточным Ð´Ð»Ñ Ð²Ñех профилей. +Ð”Ð»Ñ Ð´Ñ€ÑƒÐ³Ð¸Ñ… игр недоÑтаточно замены Ð´Ð»Ñ AI! Back-date BSAs - + Back-date BSAs + + + + These are workarounds for problems with Mod Organizer. Please make sure you read the help text before changing anything here. + Это ÑпоÑобы обхода проблем Ñ Mod Organizer. УбедитеÑÑŒ, что вы прочли Ñправку, перед тем, как делать какие-либо Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð·Ð´ÐµÑÑŒ. Select download directory - + Выберете каталог Ð´Ð»Ñ Ð·Ð°Ð³Ñ€ÑƒÐ·Ð¾Ðº Select mod directory - + Выберете каталог Ð´Ð»Ñ Ð¼Ð¾Ð´Ð¾Ð² Select cache directory - + Выберете каталог Ð´Ð»Ñ ÐºÐµÑˆÐ° Confirm? - + Подтвердить? - This will make all dialogs show up again where you checked the "Remember selection"-box. Continue? - + This will make all dialogs show up again where you checked the "Remember selection"-box. Continue? + Это позволить Ñнова отобразить вÑе диалоги, Ð´Ð»Ñ ÐºÐ¾Ñ‚Ð¾Ñ€Ñ‹Ñ… вы ранее выбрали флажок "Запомнить выбор". @@ -4714,7 +4573,7 @@ For the other games this is not a sufficient replacement for AI! Quick Install - + БыÑÑ‚Ñ€Ð°Ñ ÑƒÑтановка @@ -4725,17 +4584,17 @@ For the other games this is not a sufficient replacement for AI! Opens a Dialog that allows custom modifications. - Открывает диалоговое окно, которое позволÑет выбрать пользовательÑкие модификации. + Открывает диалог, позволÑющий выбрать пользовательÑкие модификации. Manual - + РуководÑтво OK - + OK @@ -4748,18 +4607,18 @@ For the other games this is not a sufficient replacement for AI! SHM error: %1 - + Ошибка SHM: %1 failed to connect to running instance: %1 - + не удалоÑÑŒ подключитьÑÑ Ðº запущенному ÑкземплÑру: %1 failed to receive data from secondary instance: %1 - + не удалоÑÑŒ получить данные из вторичного ÑкземплÑра: %1 @@ -4767,7 +4626,7 @@ For the other games this is not a sufficient replacement for AI! Sync Overwrite - + Ð¡Ð¸Ð½Ñ…Ñ€Ð¾Ð½Ð¸Ð·Ð°Ñ†Ð¸Ñ Ð·Ð°Ð¼ÐµÐ½Ñ‹ @@ -4777,22 +4636,22 @@ For the other games this is not a sufficient replacement for AI! Sync To - + Ð¡Ð¸Ð½Ñ…Ñ€Ð¾Ð½Ð¸Ð·Ð°Ñ†Ð¸Ñ Ñ - <don't sync> - + <don't sync> + <не Ñинхронизировать> failed to remove %1 - + не удалоÑÑŒ удалить %1 failed to move %1 to %2 - + не удалоÑÑŒ перемеÑтить %1 в %2 @@ -4800,17 +4659,17 @@ For the other games this is not a sufficient replacement for AI! Dialog - + Диалог Global Characters - + Общие Ñимволы This is a list of characters in the global location. - + Это ÑпиÑок перÑонажей в общем меÑтораÑположении. @@ -4822,7 +4681,14 @@ On Windows Vista/Windows 7: On Windows XP: C:\Documents and Settings[UserName]\My Documents\My Games\Skyrim\Saves - + СпиÑок перÑонажей в общем меÑтораÑположении. + +Ðа Windows Vista/Windows 7: +C:\Users\[UserName]\Documents\My Games\Skyrim\Saves + +Ðа Windows XP: +C:\Documents and Settings[UserName]\My Documents\My Games\Skyrim\Saves + @@ -4835,27 +4701,35 @@ On Windows XP: C:\Documents and Settings[UserName]\My Documents\My Games\Skyrim\Saves - + СпиÑок Ñохранений Ñ Ð²Ñ‹Ð±Ñ€Ð°Ð½Ð½Ñ‹Ð¼ перÑонажем в общем меÑтораÑположении. + +Ðа Windows Vista/Windows 7: +C:\Users\[UserName]\Documents\My Games\Skyrim\Saves + +Ðа Windows XP: +C:\Documents and Settings[UserName]\My Documents\My Games\Skyrim\Saves + + Move -> - + ПеремеÑтить -> Copy -> - + Скопировать -> <- Move - + <- ПеремеÑтить <- Copy - + <- Скопировать @@ -4865,17 +4739,17 @@ On Windows XP: Profile Characters - + ПерÑонажи Ð¿Ñ€Ð¾Ñ„Ð¸Ð»Ñ Overwrite - + ПерепиÑать - Overwrite the file "%1" - + Overwrite the file "%1" + ПерезапиÑать файл "%1" @@ -4883,23 +4757,23 @@ On Windows XP: Confirm - Подтвердить + Подтверждение - Copy all save games of character "%1" to the profile? - + Copy all save games of character "%1" to the profile? + Скопировать вÑе игры Ñ Ð¿ÐµÑ€Ñонажем "%1" в профиль? - Move all save games of character "%1" to the global location? Please be aware that this will mess up the running number of save games. - + Move all save games of character "%1" to the global location? Please be aware that this will mess up the running number of save games. + ПеремеÑтить вÑе ÑÐ¾Ñ…Ñ€Ð°Ð½ÐµÐ½Ð¸Ñ Ñ Ð¿ÐµÑ€Ñонажем "%1" в общее меÑтораÑположение? Имейте ввиду, что Ñто запутает текущую нумерацию Ñохранений. - Copy all save games of character "%1" to the global location? Please be aware that this will mess up the running number of save games. - + Copy all save games of character "%1" to the global location? Please be aware that this will mess up the running number of save games. + Скопировать вÑе ÑÐ¾Ñ…Ñ€Ð°Ð½ÐµÐ½Ð¸Ñ Ñ Ð¿ÐµÑ€Ñонажем "%1" в общее меÑтораÑположение? Имейте ввиду, что Ñто запутает текущую нумерацию Ñохранений. diff --git a/src/overwriteinfodialog.cpp b/src/overwriteinfodialog.cpp index e215146f..2ba81633 100644 --- a/src/overwriteinfodialog.cpp +++ b/src/overwriteinfodialog.cpp @@ -72,7 +72,8 @@ private: OverwriteInfoDialog::OverwriteInfoDialog(ModInfo::Ptr modInfo, QWidget *parent) : QDialog(parent), ui(new Ui::OverwriteInfoDialog), m_FileSystemModel(NULL), - m_DeleteAction(NULL), m_RenameAction(NULL), m_OpenAction(NULL) + m_DeleteAction(NULL), m_RenameAction(NULL), m_OpenAction(NULL), + m_ModInfo(modInfo) { ui->setupUi(this); @@ -101,7 +102,6 @@ OverwriteInfoDialog::~OverwriteInfoDialog() delete ui; } - bool OverwriteInfoDialog::recursiveDelete(const QModelIndex &index) { for (int childRow = 0; childRow < m_FileSystemModel->rowCount(index); ++childRow) { diff --git a/src/overwriteinfodialog.h b/src/overwriteinfodialog.h index a60e0571..34e86219 100644 --- a/src/overwriteinfodialog.h +++ b/src/overwriteinfodialog.h @@ -17,51 +17,55 @@ You should have received a copy of the GNU General Public License along with Mod Organizer. If not, see . */ -#ifndef OVERWRITEINFODIALOG_H -#define OVERWRITEINFODIALOG_H - -#include "modinfo.h" -#include -#include - -namespace Ui { -class OverwriteInfoDialog; -} - -class OverwriteInfoDialog : public QDialog -{ - Q_OBJECT - -public: - - explicit OverwriteInfoDialog(ModInfo::Ptr modInfo, QWidget *parent = 0); - ~OverwriteInfoDialog(); - -private: - - void openFile(const QModelIndex &index); - bool recursiveDelete(const QModelIndex &index); - void deleteFile(const QModelIndex &index); - -private slots: - - void deleteTriggered(); - void renameTriggered(); - void openTriggered(); - void createDirectoryTriggered(); - - void on_filesView_customContextMenuRequested(const QPoint &pos); - -private: - - Ui::OverwriteInfoDialog *ui; - QFileSystemModel *m_FileSystemModel; - QModelIndexList m_FileSelection; - QAction *m_DeleteAction; - QAction *m_RenameAction; - QAction *m_OpenAction; - QAction *m_NewFolderAction; - -}; - -#endif // OVERWRITEINFODIALOG_H +#ifndef OVERWRITEINFODIALOG_H +#define OVERWRITEINFODIALOG_H + +#include "modinfo.h" +#include +#include + +namespace Ui { +class OverwriteInfoDialog; +} + +class OverwriteInfoDialog : public QDialog +{ + Q_OBJECT + +public: + + explicit OverwriteInfoDialog(ModInfo::Ptr modInfo, QWidget *parent = 0); + ~OverwriteInfoDialog(); + + ModInfo::Ptr modInfo() const { return m_ModInfo; } + +private: + + void openFile(const QModelIndex &index); + bool recursiveDelete(const QModelIndex &index); + void deleteFile(const QModelIndex &index); + +private slots: + + void deleteTriggered(); + void renameTriggered(); + void openTriggered(); + void createDirectoryTriggered(); + + void on_filesView_customContextMenuRequested(const QPoint &pos); + +private: + + Ui::OverwriteInfoDialog *ui; + QFileSystemModel *m_FileSystemModel; + QModelIndexList m_FileSelection; + QAction *m_DeleteAction; + QAction *m_RenameAction; + QAction *m_OpenAction; + QAction *m_NewFolderAction; + + ModInfo::Ptr m_ModInfo; + +}; + +#endif // OVERWRITEINFODIALOG_H diff --git a/src/pluginlist.cpp b/src/pluginlist.cpp index 456d29ee..b0228849 100644 --- a/src/pluginlist.cpp +++ b/src/pluginlist.cpp @@ -199,10 +199,11 @@ void PluginList::refresh(const QString &profileName, const DirectoryEntry &baseD readLockedOrderFrom(lockedOrderFile); - refreshLoadOrder(); - emit layoutChanged(); + refreshLoadOrder(); emit dataChanged(this->index(0, 0), this->index(m_ESPs.size(), 1)); + + m_Refreshed(); } @@ -534,6 +535,7 @@ void PluginList::syncLoadOrder() void PluginList::refreshLoadOrder() { + emit layoutAboutToBeChanged(); syncLoadOrder(); // set priorities according to locked load order std::map lockedLoadOrder; @@ -550,9 +552,9 @@ void PluginList::refreshLoadOrder() // find the location to insert at while ((targetPrio < static_cast(m_ESPs.size() - 1)) && (m_ESPs[m_ESPsByPriority[targetPrio]].m_LoadOrder < iter->first)) { - if (QString::compare(m_ESPs[m_ESPsByPriority[targetPrio]].m_Name, iter->second) != 0) { +// if (QString::compare(m_ESPs[m_ESPsByPriority[targetPrio]].m_Name, iter->second) != 0) { ++targetPrio; - } +// } } if (static_cast(targetPrio) >= m_ESPs.size()) { @@ -569,6 +571,7 @@ void PluginList::refreshLoadOrder() } } } + emit layoutChanged(); } IPluginList::PluginState PluginList::state(const QString &name) const @@ -621,6 +624,12 @@ QString PluginList::origin(const QString &name) const } } +bool PluginList::onRefreshed(const std::function &callback) +{ + auto conn = m_Refreshed.connect(callback); + return conn.connected(); +} + void PluginList::updateIndices() { m_ESPsByName.clear(); @@ -743,10 +752,11 @@ QVariant PluginList::data(const QModelIndex &modelIndex, int role) const } -bool PluginList::setData(const QModelIndex &index, const QVariant &value, int role) +bool PluginList::setData(const QModelIndex &modIndex, const QVariant &value, int role) { if (role == Qt::CheckStateRole) { - m_ESPs[index.row()].m_Enabled = value.toInt() == Qt::Checked; + m_ESPs[modIndex.row()].m_Enabled = value.toInt() == Qt::Checked; + emit dataChanged(modIndex, modIndex); refreshLoadOrder(); startSaveTime(); @@ -829,14 +839,17 @@ void PluginList::setPluginPriority(int row, int &newPriority) for (int i = oldPriority + 1; i <= newPriorityTemp; ++i) { --m_ESPs.at(m_ESPsByPriority.at(i)).m_Priority; } + emit dataChanged(index(oldPriority + 1, 0), index(newPriorityTemp, columnCount())); } else { for (int i = newPriorityTemp; i < oldPriority; ++i) { ++m_ESPs.at(m_ESPsByPriority.at(i)).m_Priority; } + emit dataChanged(index(newPriorityTemp, 0), index(oldPriority - 1, columnCount())); ++newPriority; } m_ESPs.at(row).m_Priority = newPriorityTemp; + emit dataChanged(index(row, 0), index(row, columnCount())); } catch (const std::out_of_range&) { reportError(tr("failed to restore load order for %1").arg(m_ESPs[row].m_Name)); } @@ -868,9 +881,9 @@ void PluginList::changePluginPriority(std::vector rows, int newPriority) for (std::vector::const_iterator iter = rows.begin(); iter != rows.end(); ++iter) { setPluginPriority(*iter, newPriority); } - refreshLoadOrder(); emit layoutChanged(); + refreshLoadOrder(); startSaveTime(); } @@ -958,7 +971,6 @@ bool PluginList::eventFilter(QObject *obj, QEvent *event) int newPriority = m_ESPs[idx.row()].m_Priority + diff; if ((newPriority >= 0) && (newPriority < rowCount())) { setPluginPriority(idx.row(), newPriority); - emit dataChanged(this->index(idx.row(), 0), this->index(idx.row(), this->columnCount() - 1)); } } refreshLoadOrder(); diff --git a/src/pluginlist.h b/src/pluginlist.h index 4da7be4b..2af5a0df 100644 --- a/src/pluginlist.h +++ b/src/pluginlist.h @@ -20,12 +20,13 @@ along with Mod Organizer. If not, see . #ifndef PLUGINLIST_H #define PLUGINLIST_H +#include +#include #include #include #include +#include #include -#include -#include /** @@ -45,6 +46,8 @@ public: COL_LASTCOLUMN = COL_MODINDEX }; + typedef boost::signals2::signal SignalRefreshed; + public: /** @@ -141,6 +144,7 @@ public: virtual int loadOrder(const QString &name) const; virtual bool isMaster(const QString &name) const; virtual QString origin(const QString &name) const; + virtual bool onRefreshed(const std::function &callback); public: // implementation of the QAbstractTableModel interface @@ -240,6 +244,8 @@ private: mutable QTimer m_SaveTimer; + SignalRefreshed m_Refreshed; + }; #endif // PLUGINLIST_H diff --git a/src/problemsdialog.cpp b/src/problemsdialog.cpp index d5700381..edb34f39 100644 --- a/src/problemsdialog.cpp +++ b/src/problemsdialog.cpp @@ -10,11 +10,26 @@ using namespace MOBase; ProblemsDialog::ProblemsDialog(std::vector diagnosePlugins, QWidget *parent) - : QDialog(parent), ui(new Ui::ProblemsDialog) + : QDialog(parent), ui(new Ui::ProblemsDialog), m_DiagnosePlugins(diagnosePlugins) { ui->setupUi(this); - foreach (IPluginDiagnose *diagnose, diagnosePlugins) { + runDiagnosis(); + + connect(ui->problemsWidget, SIGNAL(itemSelectionChanged()), this, SLOT(selectionChanged())); + connect(ui->descriptionText, SIGNAL(anchorClicked(QUrl)), this, SLOT(urlClicked(QUrl))); +} + + +ProblemsDialog::~ProblemsDialog() +{ + delete ui; +} + +void ProblemsDialog::runDiagnosis() +{ + ui->problemsWidget->clear(); + foreach (IPluginDiagnose *diagnose, m_DiagnosePlugins) { std::vector activeProblems = diagnose->activeProblems(); foreach (unsigned int key, activeProblems) { QTreeWidgetItem *newItem = new QTreeWidgetItem(); @@ -26,7 +41,7 @@ ProblemsDialog::ProblemsDialog(std::vector diagnosePl ui->problemsWidget->addTopLevelItem(newItem); if (diagnose->hasGuidedFix(key)) { - newItem->setText(1, tr("fix")); + newItem->setText(1, tr("Fix")); QPushButton *fixButton = new QPushButton(tr("Fix")); connect(fixButton, SIGNAL(clicked()), this, SLOT(startFix())); ui->problemsWidget->setItemWidget(newItem, 1, fixButton); @@ -35,17 +50,8 @@ ProblemsDialog::ProblemsDialog(std::vector diagnosePl } } } - connect(ui->problemsWidget, SIGNAL(itemSelectionChanged()), this, SLOT(selectionChanged())); - connect(ui->descriptionText, SIGNAL(anchorClicked(QUrl)), this, SLOT(urlClicked(QUrl))); -} - - -ProblemsDialog::~ProblemsDialog() -{ - delete ui; } - bool ProblemsDialog::hasProblems() const { return ui->problemsWidget->topLevelItemCount() != 0; @@ -62,6 +68,7 @@ void ProblemsDialog::startFix() { IPluginDiagnose *plugin = reinterpret_cast(ui->problemsWidget->currentItem()->data(1, Qt::UserRole).value()); plugin->startGuidedFix(ui->problemsWidget->currentItem()->data(1, Qt::UserRole + 1).toUInt()); + runDiagnosis(); } void ProblemsDialog::urlClicked(const QUrl &url) diff --git a/src/problemsdialog.h b/src/problemsdialog.h index 050785f4..24a69cdf 100644 --- a/src/problemsdialog.h +++ b/src/problemsdialog.h @@ -21,6 +21,9 @@ public: ~ProblemsDialog(); bool hasProblems() const; +private: + + void runDiagnosis(); private slots: @@ -31,6 +34,7 @@ private slots: private: Ui::ProblemsDialog *ui; + std::vector m_DiagnosePlugins; }; #endif // PROBLEMSDIALOG_H diff --git a/src/settingsdialog.ui b/src/settingsdialog.ui index e7bd0fa3..39d49a39 100644 --- a/src/settingsdialog.ui +++ b/src/settingsdialog.ui @@ -652,7 +652,7 @@ Please note that MO does identify itself as MO to the webserver, it's not lying tl;dr-version: If Nexus-features don't work, insert the current version number of NMM here and try again. - 009.009.009; + 009.009.009 Qt::AlignCenter diff --git a/src/shared/directoryentry.cpp b/src/shared/directoryentry.cpp index dde8a69e..685e14a9 100644 --- a/src/shared/directoryentry.cpp +++ b/src/shared/directoryentry.cpp @@ -494,7 +494,7 @@ static bool SupportOptimizedFind() static bool DirCompareByName(const DirectoryEntry *lhs, const DirectoryEntry *rhs) { - return wcsicmp(lhs->getName().c_str(), rhs->getName().c_str()) < 0; + return _wcsicmp(lhs->getName().c_str(), rhs->getName().c_str()) < 0; } diff --git a/src/version.rc b/src/version.rc index 55de3798..ab144909 100644 --- a/src/version.rc +++ b/src/version.rc @@ -1,7 +1,7 @@ #include "Winver.h" -#define VER_FILEVERSION 1,0,7,0 -#define VER_FILEVERSION_STR "1,0,7,0\0" +#define VER_FILEVERSION 1,0,8,0 +#define VER_FILEVERSION_STR "1,0,8,0\0" VS_VERSION_INFO VERSIONINFO FILEVERSION VER_FILEVERSION -- cgit v1.3.1 From c6101e34e1e142a3442c3a4543ea22dabd31fa33 Mon Sep 17 00:00:00 2001 From: Tannin Date: Mon, 18 Nov 2013 20:17:14 +0100 Subject: - archive.dll now supports querying the crc value of files - esptk now determines if a esp is a dummy (without records) - hook.dll no longer creates a log file if noone wrote to it - nexus id and installtime columns are now hidden by default - modlist can now be refreshed without saving first (so plugins can replace the modlist.txt as a whole) - plugins can now query more details about virtualised files - added style options "plastique" and "cleanlooks" - "overwrite" is no longer listed with a creation time - a warning will now be displayed if the user has too many plugins active - a warning will now be displayed if mods with scripts have an installation order that doesn't match the corresponding esp load order - nmm importer now has select all/deselect all buttons - nmm importer no longer tries to unpack missing files from archives (won't work anyway) - initial support for importing from nmm 0.5 alpha - removed some broken warning suppresions - python runner now works with bundled python - extended qbs build system (still fails to build the main gui application) - implemented a nsis-based installer --- src/installationmanager.cpp | 2 -- src/main.cpp | 2 +- src/mainwindow.cpp | 50 ++++++++++++++++++++++++++++++++++++++++++--- src/mainwindow.h | 5 ++++- src/moapplication.cpp | 29 ++++++++++++++++++-------- src/moapplication.h | 2 ++ src/modinfodialog.ui | 33 ++++++++++-------------------- src/modlist.cpp | 7 ++++++- src/modlist.h | 4 ++++ src/organizer.qbs | 44 ++++++++++++++++++++++++++++----------- src/pluginlist.cpp | 21 +++++++++++++++++++ src/pluginlist.h | 7 +++++++ src/settings.cpp | 3 +++ src/shared/shared.qbs | 14 ++++++++----- 14 files changed, 167 insertions(+), 56 deletions(-) (limited to 'src/pluginlist.cpp') diff --git a/src/installationmanager.cpp b/src/installationmanager.cpp index 6b430eea..a8571ec9 100644 --- a/src/installationmanager.cpp +++ b/src/installationmanager.cpp @@ -506,7 +506,6 @@ bool InstallationManager::ensureValidModName(GuessedValue &name) const return true; } - bool InstallationManager::doInstall(GuessedValue &modName, int modID, const QString &version, const QString &newestVersion, int categoryID) { @@ -528,7 +527,6 @@ bool InstallationManager::doInstall(GuessedValue &modName, int modID, m_InstallationProgress.setValue(0); m_InstallationProgress.setWindowModality(Qt::WindowModal); m_InstallationProgress.show(); - if (!m_CurrentArchive->extract(ToWString(QDir::toNativeSeparators(targetDirectory)).c_str(), new MethodCallback(this, &InstallationManager::updateProgress), new MethodCallback(this, &InstallationManager::updateProgressFile), diff --git a/src/main.cpp b/src/main.cpp index 5053d21d..8b74ba83 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -60,7 +60,6 @@ along with Mod Organizer. If not, see . #include "selectiondialog.h" #include "moapplication.h" #include "tutorialmanager.h" -#include #include #include #include @@ -156,6 +155,7 @@ bool bootstrap() // verify the hook-dll exists QString dllName = qApp->applicationDirPath() + "/" + ToQString(AppConfig::hookDLLName()); + HMODULE dllMod = ::LoadLibraryW(ToWString(dllName).c_str()); if (dllMod == NULL) { throw windows_error("hook.dll is missing or invalid"); diff --git a/src/mainwindow.cpp b/src/mainwindow.cpp index f726757c..a8026b68 100644 --- a/src/mainwindow.cpp +++ b/src/mainwindow.cpp @@ -188,8 +188,13 @@ MainWindow::MainWindow(const QString &exeName, QSettings &initSettings, QWidget ui->modList->header()->installEventFilter(&m_ModList); if (initSettings.contains("mod_list_state")) { ui->modList->header()->restoreState(initSettings.value("mod_list_state").toByteArray()); + } else { + // hide these columns by default + ui->modList->header()->setSectionHidden(ModList::COL_MODID, true); + ui->modList->header()->setSectionHidden(ModList::COL_INSTALLTIME, true); } - ui->modList->header()->setSectionHidden(0, false); // prevent the name-column from being hidden + + ui->modList->header()->setSectionHidden(ModList::COL_NAME, false); // prevent the name-column from being hidden ui->modList->installEventFilter(&m_ModList); // set up plugin list @@ -1364,10 +1369,12 @@ void MainWindow::startExeAction() } -void MainWindow::refreshModList() +void MainWindow::refreshModList(bool saveChanges) { // don't lose changes! - m_CurrentProfile->writeModlistNow(true); + if (saveChanges) { + m_CurrentProfile->writeModlistNow(true); + } ModInfo::updateFromDisc(m_Settings.getModDirectory(), &m_DirectoryStructure); m_CurrentProfile->refreshModStatus(); @@ -2096,6 +2103,32 @@ QStringList MainWindow::findFiles(const QString &path, const std::function MainWindow::findFileInfos(const QString &path, const std::function &filter) const +{ + QList result; + DirectoryEntry *dir = m_DirectoryStructure->findSubDirectoryRecursive(ToWString(path)); + if (dir != NULL) { + std::vector files = dir->getFiles(); + foreach (FileEntry::Ptr file, files) { + FileInfo info; + info.filePath = ToQString(file->getFullPath()); + bool fromArchive = false; + info.origins.append(ToQString(m_DirectoryStructure->getOriginByID(file->getOrigin(fromArchive)).getName())); + info.archive = fromArchive ? ToQString(file->getArchive()) : ""; + foreach (int idx, file->getAlternatives()) { + info.origins.append(ToQString(m_DirectoryStructure->getOriginByID(idx).getName())); + } + + if (filter(info)) { + result.append(info); + } + } + } else { + qWarning("directory %s not found", qPrintable(path)); + } + return result; +} + IDownloadManager *MainWindow::downloadManager() { return &m_DownloadManager; @@ -2161,6 +2194,9 @@ std::vector MainWindow::activeProblems() const if (m_UnloadedPlugins.size() != 0) { problems.push_back(PROBLEM_PLUGINSNOTLOADED); } + if (m_PluginList.enabledCount() > 256) { + problems.push_back(PROBLEM_TOOMANYPLUGINS); + } return problems; } @@ -2170,6 +2206,9 @@ QString MainWindow::shortDescription(unsigned int key) const case PROBLEM_PLUGINSNOTLOADED: { return tr("Some plugins could not be loaded"); } break; + case PROBLEM_TOOMANYPLUGINS: { + return tr("Too many esps and esms enabled"); + } break; default: { return tr("Description missing"); } break; @@ -2187,6 +2226,10 @@ QString MainWindow::fullDescription(unsigned int key) const result += "
        "; return result; } break; + case PROBLEM_TOOMANYPLUGINS: { + return tr("The game doesn't allow more than 256 active plugins (including the official ones) to be loaded. You have to disable some unused plugins or " + "merge some plugins into one. You can find a guide here: http://wiki.step-project.com/Guide:Merging_Plugins"); + } break; default: { return tr("Description missing"); } break; @@ -3195,6 +3238,7 @@ void MainWindow::syncOverwrite() modInfo->testValid(); refreshDirectoryStructure(); } + } void MainWindow::createModFromOverwrite() diff --git a/src/mainwindow.h b/src/mainwindow.h index cf97d4f9..dfd2e571 100644 --- a/src/mainwindow.h +++ b/src/mainwindow.h @@ -98,7 +98,6 @@ public: void refreshBSAList(); void refreshDataTree(); void refreshSaveList(); - void refreshModList(); void setExecutablesList(const ExecutablesList &executablesList); @@ -135,11 +134,14 @@ public: virtual QString resolvePath(const QString &fileName) const; virtual QStringList listDirectories(const QString &directoryName) const; virtual QStringList findFiles(const QString &path, const std::function &filter) const; + virtual QList findFileInfos(const QString &path, const std::function &filter) const; + virtual MOBase::IDownloadManager *downloadManager(); virtual MOBase::IPluginList *pluginList(); virtual MOBase::IModList *modList(); virtual HANDLE startApplication(const QString &executable, const QStringList &args = QStringList(), const QString &cwd = "", const QString &profile = ""); virtual bool onAboutToRun(const std::function &func); + virtual void refreshModList(bool saveChanges = true); virtual std::vector activeProblems() const; virtual QString shortDescription(unsigned int key) const; @@ -274,6 +276,7 @@ private: private: static const unsigned int PROBLEM_PLUGINSNOTLOADED = 1; + static const unsigned int PROBLEM_TOOMANYPLUGINS = 2; private: diff --git a/src/moapplication.cpp b/src/moapplication.cpp index ba23808b..7e3104db 100644 --- a/src/moapplication.cpp +++ b/src/moapplication.cpp @@ -23,12 +23,15 @@ along with Mod Organizer. If not, see . #include #include #include +#include +#include MOApplication::MOApplication(int argc, char **argv) : QApplication(argc, argv) { connect(&m_StyleWatcher, SIGNAL(fileChanged(QString)), SLOT(updateStyle(QString))); + m_DefaultStyle = style()->objectName(); } @@ -42,11 +45,12 @@ bool MOApplication::setStyleFile(const QString &styleName) // set new stylesheet or clear it if (styleName.length() != 0) { QString styleSheetName = applicationDirPath() + "/" + MOBase::ToQString(AppConfig::stylesheetsPath()) + "/" + styleName; - if (!QFile::exists(styleSheetName)) { - return false; + if (QFile::exists(styleSheetName)) { + m_StyleWatcher.addPath(styleSheetName); + updateStyle(styleSheetName); + } else { + updateStyle(styleName); } - m_StyleWatcher.addPath(styleSheetName); - updateStyle(styleSheetName); } else { setStyleSheet(""); } @@ -74,11 +78,18 @@ bool MOApplication::notify(QObject *receiver, QEvent *event) void MOApplication::updateStyle(const QString &fileName) { - QFile file(fileName); - if (file.open(QFile::ReadOnly)) { - setStyleSheet(file.readAll()); + if (fileName == "Plastique") { + setStyle(new QPlastiqueStyle); + setStyleSheet(""); + } else if (fileName == "Cleanlooks") { + setStyle(new QCleanlooksStyle); + setStyleSheet(""); } else { - qDebug("no stylesheet"); + setStyle(m_DefaultStyle); + if (QFile::exists(fileName)) { + setStyleSheet(QString("file:///%1").arg(fileName)); + } else { + qWarning("invalid stylesheet: %s", qPrintable(fileName)); + } } - file.close(); } diff --git a/src/moapplication.h b/src/moapplication.h index dd7f5eab..645b9144 100644 --- a/src/moapplication.h +++ b/src/moapplication.h @@ -43,6 +43,8 @@ private slots: private: QFileSystemWatcher m_StyleWatcher; + QString m_DefaultStyle; + }; diff --git a/src/modinfodialog.ui b/src/modinfodialog.ui index 2fdbe5f3..d0039a95 100644 --- a/src/modinfodialog.ui +++ b/src/modinfodialog.ui @@ -209,7 +209,7 @@ 0 0 - 668 + 676 126 @@ -223,16 +223,7 @@ 0 - - 0 - - - 0 - - - 0 - - + 0 @@ -293,7 +284,7 @@ Most mods do not have optional esps, so chances are good you are looking at an e - + :/MO/gui/resources/go-up.png:/MO/gui/resources/go-up.png @@ -322,7 +313,7 @@ Most mods do not have optional esps, so chances are good you are looking at an e - + :/MO/gui/resources/go-down.png:/MO/gui/resources/go-down.png @@ -525,9 +516,9 @@ Most mods do not have optional esps, so chances are good you are looking at an e - + - + Primary Category @@ -542,7 +533,7 @@ Most mods do not have optional esps, so chances are good you are looking at an e - + :/MO/gui/resources/internet-web-browser.png:/MO/gui/resources/internet-web-browser.png @@ -634,7 +625,7 @@ p, li { white-space: pre-wrap; } - + :/MO/gui/refresh:/MO/gui/refresh @@ -660,7 +651,7 @@ p, li { white-space: pre-wrap; } <!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:'MS Shell Dlg 2'; font-size:7.8pt; font-weight:400; font-style:normal;"> +</style></head><body style=" font-family:'MS Shell Dlg 2'; font-size:8.25pt; font-weight:400; font-style:normal;"> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:8pt;"><br /></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:8pt;"><br /></p></body></html> @@ -696,7 +687,7 @@ p, li { white-space: pre-wrap; } Endorse - + :/MO/gui/icon_favorite:/MO/gui/icon_favorite @@ -791,8 +782,6 @@ p, li { white-space: pre-wrap; } - - - + diff --git a/src/modlist.cpp b/src/modlist.cpp index eac02372..b35d6ad2 100644 --- a/src/modlist.cpp +++ b/src/modlist.cpp @@ -186,7 +186,12 @@ QVariant ModList::data(const QModelIndex &modelIndex, int role) const return QVariant(); } } else if (column == COL_INSTALLTIME) { - return modInfo->creationTime(); + // display installation time for mods that can be updated + if (modInfo->canBeUpdated()) { + return modInfo->creationTime(); + } else { + return QVariant(); + } } else { return tr("invalid"); } diff --git a/src/modlist.h b/src/modlist.h index 8cab7f3e..cc5955d0 100644 --- a/src/modlist.h +++ b/src/modlist.h @@ -275,6 +275,10 @@ private: SignalModStateChanged m_ModStateChanged; + + // QAbstractItemModel interface + + // IModList interface }; #endif // MODLIST_H diff --git a/src/organizer.qbs b/src/organizer.qbs index fdfb914c..2b7f45fc 100644 --- a/src/organizer.qbs +++ b/src/organizer.qbs @@ -3,21 +3,41 @@ import qbs.base 1.0 Application { name: 'Organizer' - Depends { name: 'Qt.core' } - Depends { name: 'Qt.gui' } - Depends { name: 'Qt.network' } - Depends { name: 'Qt.declarative' } - Depends { name: 'UIBase' } + Depends { name: "Qt"; submodules: ["core", "gui", "network", "declarative"] } Depends { name: 'Shared' } + Depends { name: 'UIBase' } Depends { name: 'cpp' } - cpp.defines: [] - cpp.includePaths: [ '../shared', '../archive', '../uibase', qbs.getenv("BOOSTPATH") ] + cpp.defines: [ 'UNICODE', '_UNICODE' ] + cpp.libraryPaths: [ qbs.getenv('BOOSTPATH') + '/stage/lib' ] + cpp.includePaths: [ '../shared', '../archive', '../bsatk', '../esptk', '../uibase', qbs.getenv("BOOSTPATH") ] // '../bsatk', '../esptk', - files: [ - '*.cpp', - '*.h', - '*.ui' - ] + cpp.staticLibraries: [ 'shell32', 'user32', 'Version', 'shlwapi' ] + //LIBS += -lmo_shared -luibase -lshell32 -lole32 -luser32 -ladvapi32 -lgdi32 -lPsapi -lVersion -lbsatk -lshlwapi + + Group { + name: 'Headers' + files: [ '*.h' ] + } + + Group { + name: 'Sources' + files: [ '*.cpp' ] + } + + Group { + name: 'UI Files' + files: [ '*.ui' ] + } + + Group { + name: 'ESP Toolkit' + files: [ '../esptk/*.h', '../esptk/*.cpp' ] + } } + +// /nologo /c + + +// /Zi -GR -W3 diff --git a/src/pluginlist.cpp b/src/pluginlist.cpp index b0228849..8eeed76e 100644 --- a/src/pluginlist.cpp +++ b/src/pluginlist.cpp @@ -499,6 +499,17 @@ bool PluginList::saveLoadOrder(DirectoryEntry &directoryStructure) return true; } +int PluginList::enabledCount() const +{ + int enabled = 0; + foreach (auto info, m_ESPs) { + if (info.m_Enabled) { + ++enabled; + } + } + return enabled; +} + bool PluginList::isESPLocked(int index) const { return m_LockedOrder.find(m_ESPs.at(index).m_Name.toLower()) != m_LockedOrder.end(); @@ -713,6 +724,8 @@ QVariant PluginList::data(const QModelIndex &modelIndex, int role) const return QIcon(":/MO/gui/warning"); } else if (m_LockedOrder.find(m_ESPs[index].m_Name.toLower()) != m_LockedOrder.end()) { return QIcon(":/MO/gui/locked"); + } else if (m_ESPs[index].m_IsDummy && m_ESPs[index].m_Enabled) { + return QIcon(":/MO/gui/edit_clear"); } else { return QVariant(); } @@ -723,6 +736,8 @@ QVariant PluginList::data(const QModelIndex &modelIndex, int role) const if (m_ESPs[index].m_IsMaster) { result.setItalic(true); result.setWeight(QFont::Bold); + } else if (m_ESPs[index].m_IsDummy) { + result.setItalic(true); } return result; } else if (role == Qt::TextAlignmentRole) { @@ -744,6 +759,10 @@ QVariant PluginList::data(const QModelIndex &modelIndex, int role) const m_ESPs[index].m_MasterUnset.begin(), m_ESPs[index].m_MasterUnset.end(), std::inserter(enabledMasters, enabledMasters.end())); text += "
        " + tr("Enabled Masters") + ": " + SetJoin(enabledMasters, ", "); + if (m_ESPs[index].m_IsDummy) { + text += "
        This file is a dummy! It exists only so the bsa with the same name gets loaded. With MO you don't need this: " + "If you enable the archive with the same name in the \"Archive\" tab you can disable this plugin."; + } return text; } } else { @@ -1009,6 +1028,7 @@ PluginList::ESPInfo::ESPInfo(const QString &name, bool enabled, FILETIME time, c try { ESP::File file(ToWString(fullPath)); m_IsMaster = file.isMaster(); + m_IsDummy = file.isDummy(); std::set masters = file.masters(); for (auto iter = masters.begin(); iter != masters.end(); ++iter) { m_Masters.insert(QString(iter->c_str())); @@ -1016,5 +1036,6 @@ PluginList::ESPInfo::ESPInfo(const QString &name, bool enabled, FILETIME time, c } catch (const std::exception &e) { qCritical("failed to parse esp file %s: %s", qPrintable(fullPath), e.what()); m_IsMaster = false; + m_IsDummy = false; } } diff --git a/src/pluginlist.h b/src/pluginlist.h index 2af5a0df..2f1a3f5f 100644 --- a/src/pluginlist.h +++ b/src/pluginlist.h @@ -126,6 +126,12 @@ public: **/ bool saveLoadOrder(MOShared::DirectoryEntry &directoryStructure); + /** + * @return number of enabled plugins in the list + */ + int enabledCount() const; + + QString getName(int index) const { return m_ESPs.at(index).m_Name; } int getPriority(int index) const { return m_ESPs.at(index).m_Priority; } bool isESPLocked(int index) const; @@ -198,6 +204,7 @@ private: FILETIME m_Time; QString m_OriginName; bool m_IsMaster; + bool m_IsDummy; std::set m_Masters; mutable std::set m_MasterUnset; }; diff --git a/src/settings.cpp b/src/settings.cpp index 36a4f1f8..144049aa 100644 --- a/src/settings.cpp +++ b/src/settings.cpp @@ -422,6 +422,9 @@ void Settings::addLanguages(QComboBox *languageBox) void Settings::addStyles(QComboBox *styleBox) { styleBox->addItem("None", ""); + styleBox->addItem("Plastique", "Plastique"); + styleBox->addItem("Cleanlooks", "Cleanlooks"); + QDirIterator langIter(QCoreApplication::applicationDirPath() + "/" + ToQString(AppConfig::stylesheetsPath()), QStringList("*.qss"), QDir::Files); while (langIter.hasNext()) { langIter.next(); diff --git a/src/shared/shared.qbs b/src/shared/shared.qbs index 44b7539f..1fa471a0 100644 --- a/src/shared/shared.qbs +++ b/src/shared/shared.qbs @@ -1,16 +1,20 @@ import qbs.base 1.0 -Application { - name: 'Shared' +StaticLibrary { + name: { + print(qbs.getenv("BOOSTPATH") + "/stage/lib") + return 'Shared' + } Depends { name: 'cpp' } Depends { name: 'BSAToolkit' } cpp.defines: [] - cpp.libraryPaths: [ qbs.getenv("BOOSTPATH") ] - cpp.includePaths: [ 'bsatk', qbs.getenv("BOOSTPATH") ] + cpp.libraryPaths: [ qbs.getenv("BOOSTPATH") + "/stage/lib" ] + cpp.includePaths: [ '../bsatk', qbs.getenv("BOOSTPATH") ] files: [ '*.h', - '*.cpp' + '*.cpp', + '*.inc' ] } -- cgit v1.3.1 From 14ac234daf1680b0685f6bea3e74aa09dfcf38ef Mon Sep 17 00:00:00 2001 From: Tannin Date: Sat, 14 Dec 2013 13:23:13 +0100 Subject: - plugin list now highlights plugins with attached ini files - bugfix: opening nexus through the globe icon used the nmm.nexusmods.com url --- src/mainwindow.cpp | 2 +- src/pluginlist.cpp | 23 +++++++++++++++++------ src/pluginlist.h | 4 ++-- src/resources.qrc | 1 + src/resources/mail-attachment.png | Bin 0 -> 649 bytes src/shared/directoryentry.cpp | 4 ++-- src/shared/directoryentry.h | 9 ++++----- src/shared/util.cpp | 3 --- 8 files changed, 27 insertions(+), 19 deletions(-) create mode 100644 src/resources/mail-attachment.png (limited to 'src/pluginlist.cpp') diff --git a/src/mainwindow.cpp b/src/mainwindow.cpp index 17f2de09..3a543e0b 100644 --- a/src/mainwindow.cpp +++ b/src/mainwindow.cpp @@ -4031,7 +4031,7 @@ void MainWindow::on_actionNexus_triggered() ::ShellExecuteW(NULL, L"open", nxmPath.c_str(), (std::wstring(L"reg ") + GameInfo::instance().getGameShortName() + L" \"" + executable + L"\"").c_str(), NULL, SW_SHOWNORMAL); - ::ShellExecuteW(NULL, L"open", GameInfo::instance().getNexusPage().c_str(), NULL, NULL, SW_SHOWNORMAL); + ::ShellExecuteW(NULL, L"open", GameInfo::instance().getNexusPage(false).c_str(), NULL, NULL, SW_SHOWNORMAL); ui->tabWidget->setCurrentIndex(4); } diff --git a/src/pluginlist.cpp b/src/pluginlist.cpp index 8eeed76e..20d4d357 100644 --- a/src/pluginlist.cpp +++ b/src/pluginlist.cpp @@ -146,7 +146,11 @@ void PluginList::refresh(const QString &profileName, const DirectoryEntry &baseD bool archive = false; try { FilesOrigin &origin = baseDirectory.getOriginByID(current->getOrigin(archive)); - m_ESPs.push_back(ESPInfo(filename, forceEnabled, current->getFileTime(), ToQString(origin.getName()), ToQString(current->getFullPath()))); + + QString iniPath = QFileInfo(filename).baseName() + ".ini"; + bool hasIni = baseDirectory.findFile(ToWString(iniPath)).get() != NULL; + + m_ESPs.push_back(ESPInfo(filename, forceEnabled, current->getFileTime(), ToQString(origin.getName()), ToQString(current->getFullPath()), hasIni)); } catch (const std::exception &e) { reportError(tr("failed to update esp info for file %1 (source id: %2), error: %3").arg(filename).arg(current->getOrigin(archive)).arg(e.what())); } @@ -724,7 +728,9 @@ QVariant PluginList::data(const QModelIndex &modelIndex, int role) const return QIcon(":/MO/gui/warning"); } else if (m_LockedOrder.find(m_ESPs[index].m_Name.toLower()) != m_LockedOrder.end()) { return QIcon(":/MO/gui/locked"); - } else if (m_ESPs[index].m_IsDummy && m_ESPs[index].m_Enabled) { + } else if (m_ESPs[index].m_HasIni) { + return QIcon(":/MO/gui/attachment"); + } else if (m_ESPs[index].m_IsDummy && m_ESPs[index].m_Enabled && !m_ESPs[index].m_HasIni) { return QIcon(":/MO/gui/edit_clear"); } else { return QVariant(); @@ -759,7 +765,10 @@ QVariant PluginList::data(const QModelIndex &modelIndex, int role) const m_ESPs[index].m_MasterUnset.begin(), m_ESPs[index].m_MasterUnset.end(), std::inserter(enabledMasters, enabledMasters.end())); text += "
        " + tr("Enabled Masters") + ": " + SetJoin(enabledMasters, ", "); - if (m_ESPs[index].m_IsDummy) { + if (m_ESPs[index].m_HasIni) { + text += "
        There is an ini file connected to this esp. Its settings will be added to your game settings, overwriting " + "in case of conflicts."; + } else if (m_ESPs[index].m_IsDummy) { text += "
        This file is a dummy! It exists only so the bsa with the same name gets loaded. With MO you don't need this: " "If you enable the archive with the same name in the \"Archive\" tab you can disable this plugin."; } @@ -1021,9 +1030,11 @@ bool PluginList::eventFilter(QObject *obj, QEvent *event) } -PluginList::ESPInfo::ESPInfo(const QString &name, bool enabled, FILETIME time, const QString &originName, const QString &fullPath) - : m_Name(name), m_Enabled(enabled), m_ForceEnabled(enabled), m_Removed(false), m_Priority(0), - m_LoadOrder(-1), m_Time(time), m_OriginName(originName) +PluginList::ESPInfo::ESPInfo(const QString &name, bool enabled, FILETIME time, + const QString &originName, const QString &fullPath, + bool hasIni) + : m_Name(name), m_Enabled(enabled), m_ForceEnabled(enabled), m_Removed(false), + m_Priority(0), m_LoadOrder(-1), m_Time(time), m_OriginName(originName), m_HasIni(hasIni) { try { ESP::File file(ToWString(fullPath)); diff --git a/src/pluginlist.h b/src/pluginlist.h index 2f1a3f5f..64c914df 100644 --- a/src/pluginlist.h +++ b/src/pluginlist.h @@ -131,7 +131,6 @@ public: */ int enabledCount() const; - QString getName(int index) const { return m_ESPs.at(index).m_Name; } int getPriority(int index) const { return m_ESPs.at(index).m_Priority; } bool isESPLocked(int index) const; @@ -193,7 +192,7 @@ private: struct ESPInfo { - ESPInfo(const QString &name, bool enabled, FILETIME time, const QString &originName, const QString &fullPath); + ESPInfo(const QString &name, bool enabled, FILETIME time, const QString &originName, const QString &fullPath, bool hasIni); QString m_Name; QString m_FullPath; bool m_Enabled; @@ -205,6 +204,7 @@ private: QString m_OriginName; bool m_IsMaster; bool m_IsDummy; + bool m_HasIni; std::set m_Masters; mutable std::set m_MasterUnset; }; diff --git a/src/resources.qrc b/src/resources.qrc index 3f27e2cc..1582a3f2 100644 --- a/src/resources.qrc +++ b/src/resources.qrc @@ -51,5 +51,6 @@ resources/accessories-text-editor.png resources/x-office-calendar.png resources/dialog-warning_16.png + resources/mail-attachment.png diff --git a/src/resources/mail-attachment.png b/src/resources/mail-attachment.png new file mode 100644 index 00000000..529bb7f5 Binary files /dev/null and b/src/resources/mail-attachment.png differ diff --git a/src/shared/directoryentry.cpp b/src/shared/directoryentry.cpp index 685e14a9..a232ea19 100644 --- a/src/shared/directoryentry.cpp +++ b/src/shared/directoryentry.cpp @@ -759,7 +759,7 @@ DirectoryEntry *DirectoryEntry::findSubDirectoryRecursive(const std::wstring &pa } -const FileEntry::Ptr DirectoryEntry::findFile(const std::wstring &name) +const FileEntry::Ptr DirectoryEntry::findFile(const std::wstring &name) const { auto iter = m_Files.find(name); if (iter != m_Files.end()) { @@ -840,7 +840,7 @@ FileEntry::Ptr FileRegister::createFile(const std::wstring &name, DirectoryEntry } -FileEntry::Ptr FileRegister::getFile(FileEntry::Index index) +FileEntry::Ptr FileRegister::getFile(FileEntry::Index index) const { auto iter = m_Files.find(index); if (iter != m_Files.end()) { diff --git a/src/shared/directoryentry.h b/src/shared/directoryentry.h index 1ad9816c..22f00a74 100644 --- a/src/shared/directoryentry.h +++ b/src/shared/directoryentry.h @@ -168,7 +168,7 @@ public: bool indexValid(FileEntry::Index index) const; FileEntry::Ptr createFile(const std::wstring &name, DirectoryEntry *parent); - FileEntry::Ptr getFile(FileEntry::Index index); + FileEntry::Ptr getFile(FileEntry::Index index) const; void removeFile(FileEntry::Index index); void removeOrigin(FileEntry::Index index, int originID); @@ -233,11 +233,10 @@ public: * @param name name of the file * @return fileentry object for the file or NULL if no file matches */ - const FileEntry::Ptr findFile(const std::wstring &name); + const FileEntry::Ptr findFile(const std::wstring &name) const; - /** search through this directory and all subdirectories for a file by the specified name. - if directory is not NULL, the referenced variable will be set to true if the path refers to a directory. - the returned pointer is NULL in that case */ + /** search through this directory and all subdirectories for a file by the specified name (relative path). + if directory is not NULL, the referenced variable will be set to the path containing the file */ const FileEntry::Ptr searchFile(const std::wstring &path, const DirectoryEntry **directory) const; void insertFile(const std::wstring &filePath, FilesOrigin &origin, FILETIME fileTime); diff --git a/src/shared/util.cpp b/src/shared/util.cpp index 4378e03c..22657e6c 100644 --- a/src/shared/util.cpp +++ b/src/shared/util.cpp @@ -69,7 +69,6 @@ std::string ToString(const std::wstring &source, bool utf8) ::WideCharToMultiByte(CP_UTF8, 0, source.c_str(), -1, buffer, MAX_PATH, NULL, NULL); } else { ::WideCharToMultiByte(GetACP(), 0, source.c_str(), -1, buffer, MAX_PATH, NULL, NULL); -// wcstombs(buffer, source.c_str(), MAX_PATH); } return std::string(buffer); } @@ -80,9 +79,7 @@ std::wstring ToWString(const std::string &source, bool utf8) if (utf8) { ::MultiByteToWideChar(CP_UTF8, 0, source.c_str(), -1, buffer, MAX_PATH); } else { - // codepage encoding ::MultiByteToWideChar(GetACP(), 0, source.c_str(), -1, buffer, MAX_PATH); -// mbstowcs(buffer, source.c_str(), MAX_PATH); } return std::wstring(buffer); } -- cgit v1.3.1 From 6ed82866b07414e91dfe0c47ee5f580bfd4fe479 Mon Sep 17 00:00:00 2001 From: Tannin Date: Tue, 14 Jan 2014 21:16:36 +0100 Subject: - moved code for file previews to plugins --- .hgignore | 7 +++++ src/mainwindow.cpp | 6 ++++ src/organizer.pro | 9 +----- src/pluginlist.cpp | 5 +++- src/previewgenerator.cpp | 76 +++++++----------------------------------------- src/previewgenerator.h | 6 ++-- src/version.rc | 4 +-- 7 files changed, 34 insertions(+), 79 deletions(-) (limited to 'src/pluginlist.cpp') diff --git a/.hgignore b/.hgignore index a74e95aa..0e3fc185 100644 --- a/.hgignore +++ b/.hgignore @@ -13,3 +13,10 @@ source - Copy/* ModOrganizer-build-* pdbs/* source/NCC/BossDummy.x/* +*.ts +staging_prepare/* +staging_trans/* +tools/python_zip/* +Makefile +syntax: regexp +Makefile\.(Debug|Release) diff --git a/src/mainwindow.cpp b/src/mainwindow.cpp index 139db3f0..76bff3a0 100644 --- a/src/mainwindow.cpp +++ b/src/mainwindow.cpp @@ -1017,6 +1017,12 @@ bool MainWindow::registerPlugin(QObject *plugin, const QString &fileName) return true; } } + { // preview plugins + IPluginPreview *preview = qobject_cast(plugin); + if (verifyPlugin(preview)) { + m_PreviewGenerator.registerPlugin(preview); + } + } { // proxy plugins IPluginProxy *proxy = qobject_cast(plugin); if (verifyPlugin(proxy)) { diff --git a/src/organizer.pro b/src/organizer.pro index 25384e69..dd745edb 100644 --- a/src/organizer.pro +++ b/src/organizer.pro @@ -80,14 +80,7 @@ SOURCES += \ ../esptk/subrecord.cpp \ noeditdelegate.cpp \ previewgenerator.cpp \ - previewdialog.cpp \ - gl/gltexloaders.cpp \ - gl/dds/dds_api.cpp \ - gl/dds/Image.cpp \ - gl/dds/DirectDrawSurface.cpp \ - gl/dds/Stream.cpp \ - gl/dds/BlockDXT.cpp \ - gl/dds/ColorBlock.cpp + previewdialog.cpp HEADERS += \ diff --git a/src/pluginlist.cpp b/src/pluginlist.cpp index 20d4d357..a0045ab3 100644 --- a/src/pluginlist.cpp +++ b/src/pluginlist.cpp @@ -312,6 +312,7 @@ bool PluginList::readLoadOrder(const QString &fileName) void PluginList::readEnabledFrom(const QString &fileName) { +qDebug("read enabled from %s", qPrintable(fileName)); for (std::vector::iterator iter = m_ESPs.begin(); iter != m_ESPs.end(); ++iter) { if (!iter->m_ForceEnabled) { iter->m_Enabled = false; @@ -389,7 +390,7 @@ void PluginList::writePlugins(const QString &fileName, bool writeUnchecked) cons file.write(textCodec->fromUnicode("# This file was automatically generated by Mod Organizer.\r\n")); bool invalidFileNames = false; - + int writtenCount = 0; for (size_t i = 0; i < m_ESPs.size(); ++i) { int priority = m_ESPsByPriority[i]; if ((m_ESPs[priority].m_Enabled || writeUnchecked) && !m_ESPs[priority].m_Removed) { @@ -401,6 +402,7 @@ void PluginList::writePlugins(const QString &fileName, bool writeUnchecked) cons file.write(textCodec->fromUnicode(m_ESPs[priority].m_Name)); } file.write("\r\n"); + ++writtenCount; } } file.close(); @@ -783,6 +785,7 @@ QVariant PluginList::data(const QModelIndex &modelIndex, int role) const bool PluginList::setData(const QModelIndex &modIndex, const QVariant &value, int role) { if (role == Qt::CheckStateRole) { +qDebug("uncheck plugin"); m_ESPs[modIndex.row()].m_Enabled = value.toInt() == Qt::Checked; emit dataChanged(modIndex, modIndex); diff --git a/src/previewgenerator.cpp b/src/previewgenerator.cpp index 5b0a44d8..764d016d 100644 --- a/src/previewgenerator.cpp +++ b/src/previewgenerator.cpp @@ -22,90 +22,34 @@ along with Mod Organizer. If not, see . #include #include #include -#include #include #include PreviewGenerator::PreviewGenerator() { - // set up image reader to be used for all image types qt (the current installation) supports - auto imageReader = std::bind(&PreviewGenerator::genImagePreview, this, std::placeholders::_1); - - foreach (const QByteArray &fileType, QImageReader::supportedImageFormats()) { - m_PreviewGenerators[QString(fileType).toLower()] = imageReader; - } - - m_PreviewGenerators["txt"] - = std::bind(&PreviewGenerator::genTxtPreview, this, std::placeholders::_1); - - m_PreviewGenerators["dds"] - = std::bind(&PreviewGenerator::genDDSPreview, this, std::placeholders::_1); QDesktopWidget desk; m_MaxSize = desk.screenGeometry().size() * 0.8; } -bool PreviewGenerator::previewSupported(const QString &fileExtension) const +void PreviewGenerator::registerPlugin(MOBase::IPluginPreview *plugin) { - return m_PreviewGenerators.find(fileExtension.toLower()) != m_PreviewGenerators.end(); -} - -QWidget *PreviewGenerator::genPreview(const QString &fileName) const -{ - auto iter = m_PreviewGenerators.find(QFileInfo(fileName).completeSuffix().toLower()); - if (iter != m_PreviewGenerators.end()) { - return iter->second(fileName); - } else { - return nullptr; + foreach (const QString &extension, plugin->supportedExtensions()) { + m_PreviewPlugins.insert(std::make_pair(extension, plugin)); } } -QWidget *PreviewGenerator::genImagePreview(const QString &fileName) const -{ - QLabel *label = new QLabel(); - label->setPixmap(QPixmap(fileName)); - return label; -} - -QWidget *PreviewGenerator::genTxtPreview(const QString &fileName) const +bool PreviewGenerator::previewSupported(const QString &fileExtension) const { - QTextEdit *edit = new QTextEdit(); - edit->setText(MOBase::readFileText(fileName)); - edit->setReadOnly(true); - return edit; + return m_PreviewPlugins.find(fileExtension.toLower()) != m_PreviewPlugins.end(); } -QWidget *PreviewGenerator::genDDSPreview(const QString &fileName) const +QWidget *PreviewGenerator::genPreview(const QString &fileName) const { - QGLWidget glWidget; - glWidget.makeCurrent(); - - GLuint texture = glWidget.bindTexture(fileName); - if (!texture) - return nullptr; - - // Determine the size of the DDS image - GLint width, height; - glBindTexture(GL_TEXTURE_2D, texture); - glGetTexLevelParameteriv(GL_TEXTURE_2D, 0, GL_TEXTURE_WIDTH, &width); - glGetTexLevelParameteriv(GL_TEXTURE_2D, 0, GL_TEXTURE_HEIGHT, &height); - - if (width == 0 || height == 0) - return nullptr; - - QGLPixelBuffer pbuffer(QSize(width, height), glWidget.format(), &glWidget); - if (!pbuffer.makeCurrent()) + auto iter = m_PreviewPlugins.find(QFileInfo(fileName).completeSuffix().toLower()); + if (iter != m_PreviewPlugins.end()) { + return iter->second->genFilePreview(fileName, m_MaxSize); + } else { return nullptr; - - pbuffer.drawTexture(QRectF(-1, -1, 2, 2), texture); - - QLabel *label = new QLabel(); - QImage image = pbuffer.toImage(); - if ((image.size().width() > m_MaxSize.width()) || - (image.size().height() > m_MaxSize.height())) { - image = image.scaled(m_MaxSize, Qt::KeepAspectRatio); } - - label->setPixmap(QPixmap::fromImage(image)); - return label; } diff --git a/src/previewgenerator.h b/src/previewgenerator.h index 4648e27e..e872b06b 100644 --- a/src/previewgenerator.h +++ b/src/previewgenerator.h @@ -24,12 +24,15 @@ along with Mod Organizer. If not, see . #include #include #include +#include class PreviewGenerator { public: PreviewGenerator(); + void registerPlugin(MOBase::IPluginPreview *plugin); + bool previewSupported(const QString &fileExtension) const; QWidget *genPreview(const QString &fileName) const; @@ -38,11 +41,10 @@ private: QWidget *genImagePreview(const QString &fileName) const; QWidget *genTxtPreview(const QString &fileName) const; - QWidget *genDDSPreview(const QString &fileName) const; private: - std::map > m_PreviewGenerators; + std::map m_PreviewPlugins; QSize m_MaxSize; diff --git a/src/version.rc b/src/version.rc index 83c59d21..1beee814 100644 --- a/src/version.rc +++ b/src/version.rc @@ -1,7 +1,7 @@ #include "Winver.h" -#define VER_FILEVERSION 1,0,13,0 -#define VER_FILEVERSION_STR "1,0,13,0\0" +#define VER_FILEVERSION 1,1,0,0 +#define VER_FILEVERSION_STR "1,1,0,0\0" VS_VERSION_INFO VERSIONINFO FILEVERSION VER_FILEVERSION -- cgit v1.3.1 From e69210b3a78c4a6c63086d84e6bdb2c3b47d8944 Mon Sep 17 00:00:00 2001 From: Tannin Date: Sat, 18 Jan 2014 19:51:58 +0100 Subject: - when a download server returns a text file, it's assumed to be an error and the text displayed as an error - save games can now be deleted from inside MO - bugfix: removing the pending download entry failed if the download-url request failed - bugfix: download manager didn't stop automatically resuming failed downloads under certain circumstances - bugfix: uninstalled downloads were treated as not-finished when refreshing the download list - bugfix: updating the filesystem watcher on the saves directory didn't work correctly --- src/aboutdialog.cpp | 1 - src/downloadmanager.cpp | 33 ++++++++++++++++----------------- src/downloadmanager.h | 2 +- src/mainwindow.cpp | 23 ++++++++++++++++++++++- src/mainwindow.h | 3 ++- src/modinfo.cpp | 4 ++-- src/modinfo.h | 2 +- src/nexusinterface.cpp | 34 +++++++++++++++++----------------- src/nexusinterface.h | 8 ++++---- src/pluginlist.cpp | 1 - src/selfupdater.cpp | 2 +- src/selfupdater.h | 2 +- 12 files changed, 67 insertions(+), 48 deletions(-) (limited to 'src/pluginlist.cpp') diff --git a/src/aboutdialog.cpp b/src/aboutdialog.cpp index 94e4e54c..c7f95640 100644 --- a/src/aboutdialog.cpp +++ b/src/aboutdialog.cpp @@ -73,7 +73,6 @@ void AboutDialog::on_creditsList_currentItemChanged(QListWidgetItem *current, QL auto iter = m_LicenseFiles.find(current->data(Qt::UserRole).toInt()); if (iter != m_LicenseFiles.end()) { QString filePath = qApp->applicationDirPath() + "/license/" + iter->second; -qDebug("%s", qPrintable(filePath)); QString text = MOBase::readFileText(filePath); ui->licenseText->setText(text); } else { diff --git a/src/downloadmanager.cpp b/src/downloadmanager.cpp index dd320f70..31d8bcec 100644 --- a/src/downloadmanager.cpp +++ b/src/downloadmanager.cpp @@ -26,15 +26,16 @@ along with Mod Organizer. If not, see . #include "utility.h" #include "json.h" #include "selectiondialog.h" +#include #include #include #include #include #include -#include -#include #include #include +#include +#include using namespace MOBase; @@ -246,7 +247,7 @@ void DownloadManager::refreshList() // remove finished downloads for (QVector::iterator Iter = m_ActiveDownloads.begin(); Iter != m_ActiveDownloads.end();) { - if (((*Iter)->m_State == STATE_READY) || ((*Iter)->m_State == STATE_INSTALLED)) { + if (((*Iter)->m_State == STATE_READY) || ((*Iter)->m_State == STATE_INSTALLED) || ((*Iter)->m_State == STATE_UNINSTALLED)) { delete *Iter; Iter = m_ActiveDownloads.erase(Iter); } else { @@ -414,7 +415,7 @@ void DownloadManager::addNXMDownload(const QString &url) NXMUrl nxmInfo(url); QString managedGame = ToQString(MOShared::GameInfo::instance().getGameShortName()); - qDebug("add nxm download", qPrintable(url)); + qDebug("add nxm download: %s", qPrintable(url)); if (nxmInfo.game().compare(managedGame, Qt::CaseInsensitive) != 0) { qDebug("download requested for wrong game (game: %s, url: %s)", qPrintable(managedGame), qPrintable(nxmInfo.game())); QMessageBox::information(NULL, tr("Wrong Game"), tr("The download link is for a mod for \"%1\" but this instance of MO " @@ -1089,11 +1090,7 @@ void DownloadManager::nxmFileInfoAvailable(int modID, int fileID, QVariant userD info.m_FileName = result["uri"].toString(); info.m_FileTime = matchDate(result["date"].toString()); - if (userData.isValid()) { - m_RequestIDs.insert(m_NexusInterface->requestDownloadURL(modID, fileID, this, qVariantFromValue(info), userData.toString())); - } else { - m_RequestIDs.insert(m_NexusInterface->requestDownloadURL(modID, fileID, this, qVariantFromValue(info))); - } + m_RequestIDs.insert(m_NexusInterface->requestDownloadURL(modID, fileID, this, QVariant::fromValue(info))); } @@ -1176,8 +1173,6 @@ void DownloadManager::nxmDownloadURLsAvailable(int modID, int fileID, QVariant u m_RequestIDs.erase(idIter); } - qDebug("download urls received (modid %d, fileid %d)", modID, fileID); - NexusInfo info = userData.value(); QVariantList resultList = resultData.toList(); if (resultList.length() == 0) { @@ -1200,7 +1195,7 @@ void DownloadManager::nxmDownloadURLsAvailable(int modID, int fileID, QVariant u } -void DownloadManager::nxmRequestFailed(int modID, QVariant userData, int requestID, const QString &errorString) +void DownloadManager::nxmRequestFailed(int modID, int fileID, QVariant userData, int requestID, const QString &errorString) { std::set::iterator idIter = m_RequestIDs.find(requestID); if (idIter == m_RequestIDs.end()) { @@ -1225,7 +1220,7 @@ void DownloadManager::nxmRequestFailed(int modID, QVariant userData, int request } } - removePending(modID, userData.toInt()); + removePending(modID, fileID); emit showMessage(tr("Failed to request file info from nexus: %1").arg(errorString)); } @@ -1243,14 +1238,18 @@ void DownloadManager::downloadFinished() TaskProgressManager::instance().forgetMe(info->m_TaskProgressId); bool error = false; - if ((info->m_State != STATE_CANCELING) && (info->m_State != STATE_PAUSING)) { + bool textData = reply->header(QNetworkRequest::ContentTypeHeader).toString().startsWith("text", Qt::CaseInsensitive); if ((info->m_Output.size() == 0) || ((reply->error() != QNetworkReply::NoError) && (reply->error() != QNetworkReply::OperationCanceledError)) || - reply->header(QNetworkRequest::ContentTypeHeader).toString().startsWith("text", Qt::CaseInsensitive)) { + textData) { if (info->m_Tries == 0) { - emit showMessage(tr("Download failed: %1 (%2)").arg(reply->errorString()).arg(reply->error())); + if (textData && (reply->error() == QNetworkReply::NoError)) { + emit showMessage(tr("Download failed. Server reported: %1").arg(readFileText(info->m_Output.fileName()))); + } else { + emit showMessage(tr("Download failed: %1 (%2)").arg(reply->errorString()).arg(reply->error())); + } } error = true; setState(info, STATE_PAUSING); @@ -1310,7 +1309,7 @@ void DownloadManager::downloadFinished() if ((info->m_Tries > 0) && error) { --info->m_Tries; - resumeDownload(index); + resumeDownloadInt(index); } } else { qWarning("no download index %d", index); diff --git a/src/downloadmanager.h b/src/downloadmanager.h index 62396666..80b99ad2 100644 --- a/src/downloadmanager.h +++ b/src/downloadmanager.h @@ -412,7 +412,7 @@ public slots: void nxmDownloadURLsAvailable(int modID, int fileID, QVariant userData, QVariant resultData, int requestID); - void nxmRequestFailed(int modID, QVariant userData, int requestID, const QString &errorString); + void nxmRequestFailed(int modID, int fileID, QVariant userData, int requestID, const QString &errorString); private slots: diff --git a/src/mainwindow.cpp b/src/mainwindow.cpp index 14e27e76..582bc283 100644 --- a/src/mainwindow.cpp +++ b/src/mainwindow.cpp @@ -66,6 +66,7 @@ along with Mod Organizer. If not, see . #include #include #include +#include #include #include #include @@ -1737,6 +1738,9 @@ void MainWindow::refreshSaveList() savesDir.setPath(QDir::fromNativeSeparators(ToQString(GameInfo::instance().getDocumentsDir() + L"\\" + path))); } + if (m_SavesWatcher.directories().length() > 0) { + m_SavesWatcher.removePaths(m_SavesWatcher.directories()); + } m_SavesWatcher.addPath(savesDir.absolutePath()); QStringList filters; @@ -3868,6 +3872,22 @@ void MainWindow::on_categoriesList_itemSelectionChanged() } +void MainWindow::deleteSavegame_clicked() +{ + QListWidgetItem *selectedItem = ui->savegameList->item(m_SelectedSaveGame); + if (selectedItem == NULL) { + return; + } + + QString fileName = selectedItem->data(Qt::UserRole).toString(); + + if (QMessageBox::question(this, tr("Confirm"), tr("Really delete \"%1\"?").arg(selectedItem->text()), + QMessageBox::Yes | QMessageBox::No) == QMessageBox::Yes) { + shellDelete(QStringList() << fileName); + } +} + + void MainWindow::fixMods_clicked() { QListWidgetItem *selectedItem = ui->savegameList->item(m_SelectedSaveGame); @@ -3973,6 +3993,7 @@ void MainWindow::on_savegameList_customContextMenuRequested(const QPoint &pos) QMenu menu; menu.addAction(tr("Fix Mods..."), this, SLOT(fixMods_clicked())); + menu.addAction(tr("Delete"), this, SLOT(deleteSavegame_clicked())); menu.exec(ui->savegameList->mapToGlobal(pos)); } @@ -4721,7 +4742,7 @@ void MainWindow::nxmDownloadURLs(int, int, QVariant, QVariant resultData, int) } -void MainWindow::nxmRequestFailed(int modID, QVariant, int, const QString &errorString) +void MainWindow::nxmRequestFailed(int modID, int, QVariant, int, const QString &errorString) { if (modID == -1) { // must be the update-check that failed diff --git a/src/mainwindow.h b/src/mainwindow.h index e7b3f7e1..c01ce767 100644 --- a/src/mainwindow.h +++ b/src/mainwindow.h @@ -398,6 +398,7 @@ private slots: void openExplorer_clicked(); void information_clicked(); // savegame context menu + void deleteSavegame_clicked(); void fixMods_clicked(); // data-tree context menu void writeDataToFile(); @@ -464,7 +465,7 @@ private slots: void nxmUpdatesAvailable(const std::vector &modIDs, QVariant userData, QVariant resultData, int requestID); // void nxmEndorsementToggled(int, QVariant, QVariant resultData, int); void nxmDownloadURLs(int modID, int fileID, QVariant userData, QVariant resultData, int requestID); - void nxmRequestFailed(int modID, QVariant userData, int requestID, const QString &errorString); + void nxmRequestFailed(int modID, int fileID, QVariant userData, int requestID, const QString &errorString); void editCategories(); diff --git a/src/modinfo.cpp b/src/modinfo.cpp index 6569f897..85612b32 100644 --- a/src/modinfo.cpp +++ b/src/modinfo.cpp @@ -345,7 +345,7 @@ ModInfoRegular::ModInfoRegular(const QDir &path, DirectoryEntry **directoryStruc connect(&m_NexusBridge, SIGNAL(descriptionAvailable(int,QVariant,QVariant)), this, SLOT(nxmDescriptionAvailable(int,QVariant,QVariant))); connect(&m_NexusBridge, SIGNAL(endorsementToggled(int,QVariant,QVariant)), this, SLOT(nxmEndorsementToggled(int,QVariant,QVariant))); - connect(&m_NexusBridge, SIGNAL(requestFailed(int,QVariant,QString)), this, SLOT(nxmRequestFailed(int,QVariant,QString))); + connect(&m_NexusBridge, SIGNAL(requestFailed(int,int,QVariant,QString)), this, SLOT(nxmRequestFailed(int,int,QVariant,QString))); } @@ -439,7 +439,7 @@ void ModInfoRegular::nxmEndorsementToggled(int, QVariant, QVariant resultData) } -void ModInfoRegular::nxmRequestFailed(int, QVariant userData, const QString &errorMessage) +void ModInfoRegular::nxmRequestFailed(int, int, QVariant userData, const QString &errorMessage) { QString fullMessage = errorMessage; if (userData.canConvert() && (userData.toInt() == 1)) { diff --git a/src/modinfo.h b/src/modinfo.h index 677d8a82..83654c7e 100644 --- a/src/modinfo.h +++ b/src/modinfo.h @@ -762,7 +762,7 @@ private slots: void nxmDescriptionAvailable(int modID, QVariant userData, QVariant resultData); void nxmEndorsementToggled(int, QVariant userData, QVariant resultData); - void nxmRequestFailed(int modID, QVariant userData, const QString &errorMessage); + void nxmRequestFailed(int modID, int fileID, QVariant userData, const QString &errorMessage); private: diff --git a/src/nexusinterface.cpp b/src/nexusinterface.cpp index 6b87822a..64dd6272 100644 --- a/src/nexusinterface.cpp +++ b/src/nexusinterface.cpp @@ -128,12 +128,12 @@ void NexusBridge::nxmEndorsementToggled(int modID, QVariant userData, QVariant r } } -void NexusBridge::nxmRequestFailed(int modID, QVariant userData, int requestID, const QString &errorMessage) +void NexusBridge::nxmRequestFailed(int modID, int fileID, QVariant userData, int requestID, const QString &errorMessage) { std::set::iterator iter = m_RequestIDs.find(requestID); if (iter != m_RequestIDs.end()) { m_RequestIDs.erase(iter); - emit requestFailed(modID, userData, errorMessage); + emit requestFailed(modID, fileID, userData, errorMessage); } } @@ -257,8 +257,8 @@ int NexusInterface::requestDescription(int modID, QObject *receiver, QVariant us connect(this, SIGNAL(nxmDescriptionAvailable(int,QVariant,QVariant,int)), receiver, SLOT(nxmDescriptionAvailable(int,QVariant,QVariant,int)), Qt::UniqueConnection); - connect(this, SIGNAL(nxmRequestFailed(int,QVariant,int,QString)), - receiver, SLOT(nxmRequestFailed(int,QVariant,int,QString)), Qt::UniqueConnection); + connect(this, SIGNAL(nxmRequestFailed(int,int,QVariant,int,QString)), + receiver, SLOT(nxmRequestFailed(int,int,QVariant,int,QString)), Qt::UniqueConnection); nextRequest(); return requestInfo.m_ID; @@ -273,8 +273,8 @@ int NexusInterface::requestUpdates(const std::vector &modIDs, QObject *rece connect(this, SIGNAL(nxmUpdatesAvailable(std::vector,QVariant,QVariant,int)), receiver, SLOT(nxmUpdatesAvailable(std::vector,QVariant,QVariant,int)), Qt::UniqueConnection); - connect(this, SIGNAL(nxmRequestFailed(int,QVariant,int,QString)), - receiver, SLOT(nxmRequestFailed(int,QVariant,int,QString)), Qt::UniqueConnection); + connect(this, SIGNAL(nxmRequestFailed(int,int,QVariant,int,QString)), + receiver, SLOT(nxmRequestFailed(int,int,QVariant,int,QString)), Qt::UniqueConnection); nextRequest(); return requestInfo.m_ID; @@ -307,8 +307,8 @@ int NexusInterface::requestFiles(int modID, QObject *receiver, QVariant userData connect(this, SIGNAL(nxmFilesAvailable(int,QVariant,QVariant,int)), receiver, SLOT(nxmFilesAvailable(int,QVariant,QVariant,int)), Qt::UniqueConnection); - connect(this, SIGNAL(nxmRequestFailed(int,QVariant,int,QString)), - receiver, SLOT(nxmRequestFailed(int,QVariant,int,QString)), Qt::UniqueConnection); + connect(this, SIGNAL(nxmRequestFailed(int,int,QVariant,int,QString)), + receiver, SLOT(nxmRequestFailed(int,int,QVariant,int,QString)), Qt::UniqueConnection); // QTimer::singleShot(1000, this, SLOT(fakeFiles())); // static int fID = 42; @@ -327,8 +327,8 @@ int NexusInterface::requestFileInfo(int modID, int fileID, QObject *receiver, QV connect(this, SIGNAL(nxmFileInfoAvailable(int,int,QVariant,QVariant,int)), receiver, SLOT(nxmFileInfoAvailable(int,int,QVariant,QVariant,int)), Qt::UniqueConnection); - connect(this, SIGNAL(nxmRequestFailed(int,QVariant,int,QString)), - receiver, SLOT(nxmRequestFailed(int,QVariant,int,QString)), Qt::UniqueConnection); + connect(this, SIGNAL(nxmRequestFailed(int,int,QVariant,int,QString)), + receiver, SLOT(nxmRequestFailed(int,int,QVariant,int,QString)), Qt::UniqueConnection); nextRequest(); return requestInfo.m_ID; @@ -343,8 +343,8 @@ int NexusInterface::requestDownloadURL(int modID, int fileID, QObject *receiver, connect(this, SIGNAL(nxmDownloadURLsAvailable(int,int,QVariant,QVariant,int)), receiver, SLOT(nxmDownloadURLsAvailable(int,int,QVariant,QVariant,int)), Qt::UniqueConnection); - connect(this, SIGNAL(nxmRequestFailed(int,QVariant,int,QString)), - receiver, SLOT(nxmRequestFailed(int,QVariant,int,QString)), Qt::UniqueConnection); + connect(this, SIGNAL(nxmRequestFailed(int,int,QVariant,int,QString)), + receiver, SLOT(nxmRequestFailed(int,int,QVariant,int,QString)), Qt::UniqueConnection); nextRequest(); return requestInfo.m_ID; @@ -360,8 +360,8 @@ int NexusInterface::requestToggleEndorsement(int modID, bool endorse, QObject *r connect(this, SIGNAL(nxmEndorsementToggled(int,QVariant,QVariant,int)), receiver, SLOT(nxmEndorsementToggled(int,QVariant,QVariant,int)), Qt::UniqueConnection); - connect(this, SIGNAL(nxmRequestFailed(int,QVariant,int,QString)), - receiver, SLOT(nxmRequestFailed(int,QVariant,int,QString)), Qt::UniqueConnection); + connect(this, SIGNAL(nxmRequestFailed(int,int,QVariant,int,QString)), + receiver, SLOT(nxmRequestFailed(int,int,QVariant,int,QString)), Qt::UniqueConnection); nextRequest(); return requestInfo.m_ID; @@ -437,7 +437,7 @@ void NexusInterface::requestFinished(std::list::iterator iter) if (reply->error() != QNetworkReply::NoError) { qWarning("request failed: %s", reply->errorString().toUtf8().constData()); - emit nxmRequestFailed(iter->m_ModID, iter->m_UserData, iter->m_ID, reply->errorString()); + emit nxmRequestFailed(iter->m_ModID, iter->m_FileID, iter->m_UserData, iter->m_ID, reply->errorString()); } else { int statusCode = reply->attribute(QNetworkRequest::HttpStatusCodeAttribute).toInt(); if (statusCode == 301) { @@ -454,7 +454,7 @@ void NexusInterface::requestFinished(std::list::iterator iter) if (nexusError.length() == 0) { nexusError = tr("empty response"); } - emit nxmRequestFailed(iter->m_ModID, iter->m_UserData, iter->m_ID, nexusError); + emit nxmRequestFailed(iter->m_ModID, iter->m_FileID, iter->m_UserData, iter->m_ID, nexusError); } else { bool ok; QVariant result = QtJson::parse(data, ok); @@ -480,7 +480,7 @@ void NexusInterface::requestFinished(std::list::iterator iter) } break; } } else { - emit nxmRequestFailed(iter->m_ModID, iter->m_UserData, iter->m_ID, tr("invalid response")); + emit nxmRequestFailed(iter->m_ModID, iter->m_FileID, iter->m_UserData, iter->m_ID, tr("invalid response")); } } } diff --git a/src/nexusinterface.h b/src/nexusinterface.h index e7a01b0f..7b709e1c 100644 --- a/src/nexusinterface.h +++ b/src/nexusinterface.h @@ -105,7 +105,7 @@ public slots: void nxmFileInfoAvailable(int modID, int fileID, QVariant userData, QVariant resultData, int requestID); void nxmDownloadURLsAvailable(int modID, int fileID, QVariant userData, QVariant resultData, int requestID); void nxmEndorsementToggled(int modID, QVariant userData, QVariant resultData, int requestID); - void nxmRequestFailed(int modID, QVariant userData, int requestID, const QString &errorMessage); + void nxmRequestFailed(int modID, int fileID, QVariant userData, int requestID, const QString &errorMessage); private: @@ -240,7 +240,7 @@ signals: void nxmFileInfoAvailable(int modID, int fileID, QVariant userData, QVariant resultData, int requestID); void nxmDownloadURLsAvailable(int modID, int fileID, QVariant userData, QVariant resultData, int requestID); void nxmEndorsementToggled(int modID, QVariant userData, QVariant resultData, int requestID); - void nxmRequestFailed(int modID, QVariant userData, int requestID, const QString &errorString); + void nxmRequestFailed(int modID, int fileID, QVariant userData, int requestID, const QString &errorString); private slots: @@ -276,13 +276,13 @@ private: NXMRequestInfo(int modID, Type type, QVariant userData, const QString &url) : m_ModID(modID), m_FileID(0), m_Reply(NULL), m_Type(type), m_UserData(userData), - m_Timeout(NULL), m_Reroute(false), m_ID(s_NextID.fetchAndAddAcquire(1)), m_URL(url) {} + m_Timeout(NULL), m_Reroute(false), m_ID(s_NextID.fetchAndAddAcquire(1)), m_URL(url) {} NXMRequestInfo(std::vector modIDList, Type type, QVariant userData, const QString &url) : m_ModID(-1), m_ModIDList(modIDList), m_FileID(0), m_Reply(NULL), m_Type(type), m_UserData(userData), m_Timeout(NULL), m_Reroute(false), m_ID(s_NextID.fetchAndAddAcquire(1)), m_URL(url) {} NXMRequestInfo(int modID, int fileID, Type type, QVariant userData, const QString &url) : m_ModID(modID), m_FileID(fileID), m_Reply(NULL), m_Type(type), m_UserData(userData), - m_Timeout(NULL), m_Reroute(false), m_ID(s_NextID.fetchAndAddAcquire(1)), m_URL(url) {} + m_Timeout(NULL), m_Reroute(false), m_ID(s_NextID.fetchAndAddAcquire(1)), m_URL(url) {} private: static QAtomicInt s_NextID; diff --git a/src/pluginlist.cpp b/src/pluginlist.cpp index a0045ab3..85137390 100644 --- a/src/pluginlist.cpp +++ b/src/pluginlist.cpp @@ -312,7 +312,6 @@ bool PluginList::readLoadOrder(const QString &fileName) void PluginList::readEnabledFrom(const QString &fileName) { -qDebug("read enabled from %s", qPrintable(fileName)); for (std::vector::iterator iter = m_ESPs.begin(); iter != m_ESPs.end(); ++iter) { if (!iter->m_ForceEnabled) { iter->m_Enabled = false; diff --git a/src/selfupdater.cpp b/src/selfupdater.cpp index 2a9ca893..3a0db83f 100644 --- a/src/selfupdater.cpp +++ b/src/selfupdater.cpp @@ -428,7 +428,7 @@ void SelfUpdater::nxmFilesAvailable(int, QVariant userData, QVariant resultData, } -void SelfUpdater::nxmRequestFailed(int, QVariant, int requestID, const QString &errorMessage) +void SelfUpdater::nxmRequestFailed(int, int, QVariant, int requestID, const QString &errorMessage) { if (requestID == m_UpdateRequestID) { m_UpdateRequestID = -1; diff --git a/src/selfupdater.h b/src/selfupdater.h index 2c4c1ecd..14f7e90a 100644 --- a/src/selfupdater.h +++ b/src/selfupdater.h @@ -87,7 +87,7 @@ public slots: void nxmDescriptionAvailable(int modID, QVariant userData, QVariant resultData, int requestID); void nxmFilesAvailable(int modID, QVariant userData, QVariant resultData, int requestID); - void nxmRequestFailed(int modID, QVariant userData, int requestID, const QString &errorMessage); + void nxmRequestFailed(int modID, int fileID, QVariant userData, int requestID, const QString &errorMessage); void nxmDownloadURLsAvailable(int modID, int fileID, QVariant userData, QVariant resultData, int requestID); signals: -- cgit v1.3.1 From e597823337c858f2985c615ee5147f47567991ee Mon Sep 17 00:00:00 2001 From: Tannin Date: Thu, 23 Jan 2014 00:05:46 +0100 Subject: - boss integration - plugin list can now also display multiple flags for a file (like the mod list) - changed some compiler&linker settings to produce smaller binaries --- src/ModOrganizer.pro | 3 +- src/aboutdialog.cpp | 2 + src/icondelegate.cpp | 30 +-- src/icondelegate.h | 5 +- src/lockeddialog.cpp | 104 ++++++----- src/lockeddialog.h | 96 +++++----- src/logbuffer.cpp | 3 +- src/main.cpp | 5 +- src/mainwindow.cpp | 26 ++- src/mainwindow.h | 1 + src/mainwindow.ui | 82 +++++++-- src/modflagicondelegate.cpp | 50 +++++ src/modflagicondelegate.h | 18 ++ src/organizer.pro | 32 ++-- src/pdll.h | 402 +++++++++++++++++++++++++++++++++++++++++ src/pluginflagicondelegate.cpp | 24 +++ src/pluginflagicondelegate.h | 17 ++ src/pluginlist.cpp | 270 +++++++++++++++++++++++---- src/pluginlist.h | 95 +++++++++- src/pluginlistsortproxy.cpp | 5 - src/profile.cpp | 34 +--- src/resources.qrc | 2 +- src/safewritefile.cpp | 48 +++++ src/safewritefile.h | 51 ++++++ 24 files changed, 1179 insertions(+), 226 deletions(-) create mode 100644 src/modflagicondelegate.cpp create mode 100644 src/modflagicondelegate.h create mode 100644 src/pdll.h create mode 100644 src/pluginflagicondelegate.cpp create mode 100644 src/pluginflagicondelegate.h create mode 100644 src/safewritefile.cpp create mode 100644 src/safewritefile.h (limited to 'src/pluginlist.cpp') diff --git a/src/ModOrganizer.pro b/src/ModOrganizer.pro index dbf6ab6e..05b05855 100644 --- a/src/ModOrganizer.pro +++ b/src/ModOrganizer.pro @@ -13,11 +13,12 @@ SUBDIRS = bsatk \ nxmhandler \ BossDummy \ pythonRunner \ + boss_modified \ esptk plugins.depends = pythonRunner hookdll.depends = shared -organizer.depends = shared uibase plugins +organizer.depends = shared uibase plugins boss_modified CONFIG(debug, debug|release) { DESTDIR = outputd diff --git a/src/aboutdialog.cpp b/src/aboutdialog.cpp index c7f95640..a8f9b4db 100644 --- a/src/aboutdialog.cpp +++ b/src/aboutdialog.cpp @@ -44,6 +44,8 @@ AboutDialog::AboutDialog(const QString &version, QWidget *parent) addLicense("7-zip", LICENSE_LGPL3); addLicense("ZLib", LICENSE_ZLIB); addLicense("NIF File Format Library", LICENSE_BSD3); + addLicense("BOSS (modified)", LICENSE_GPL3); + addLicense("Alphanum Algorithm", LICENSE_ZLIB); ui->nameLabel->setText(QString("%1 %2").arg(ui->nameLabel->text()).arg(version)); #ifdef HGID diff --git a/src/icondelegate.cpp b/src/icondelegate.cpp index 2540e1d5..048b09f9 100644 --- a/src/icondelegate.cpp +++ b/src/icondelegate.cpp @@ -29,38 +29,17 @@ IconDelegate::IconDelegate(QObject *parent) } -QIcon IconDelegate::getFlagIcon(ModInfo::EFlag flag) const -{ - switch (flag) { - case ModInfo::FLAG_BACKUP: return QIcon(":/MO/gui/emblem_backup"); - case ModInfo::FLAG_INVALID: return QIcon(":/MO/gui/emblem_problem"); - case ModInfo::FLAG_NOTENDORSED: return QIcon(":/MO/gui/emblem_notendorsed"); - case ModInfo::FLAG_NOTES: return QIcon(":/MO/gui/emblem_notes"); - case ModInfo::FLAG_CONFLICT_OVERWRITE: return QIcon(":/MO/gui/emblem_conflict_overwrite"); - case ModInfo::FLAG_CONFLICT_OVERWRITTEN: return QIcon(":/MO/gui/emblem_conflict_overwritten"); - case ModInfo::FLAG_CONFLICT_MIXED: return QIcon(":/MO/gui/emblem_conflict_mixed"); - case ModInfo::FLAG_CONFLICT_REDUNDANT: return QIcon(":MO/gui/emblem_conflict_redundant"); - default: return QIcon(); - } -} - - void IconDelegate::paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const { QStyledItemDelegate::paint(painter, option, index); - QVariant modid = index.data(Qt::UserRole + 1); - if (!modid.isValid()) { - return; - } - ModInfo::Ptr info = ModInfo::getByIndex(modid.toInt()); - std::vector flags = info->getFlags(); + + QList icons = getIcons(index); int x = 4; painter->save(); painter->translate(option.rect.topLeft()); - for (auto iter = flags.begin(); iter != flags.end(); ++iter) { - QIcon temp = getFlagIcon(*iter); - painter->drawPixmap(x, 2, 16, 16, temp.pixmap(QSize(16, 16))); + for (auto iter = icons.begin(); iter != icons.end(); ++iter) { + painter->drawPixmap(x, 2, 16, 16, iter->pixmap(QSize(16, 16))); x += 20; } @@ -70,6 +49,7 @@ void IconDelegate::paint(QPainter *painter, const QStyleOptionViewItem &option, QSize IconDelegate::sizeHint(const QStyleOptionViewItem&, const QModelIndex &modelIndex) const { + int count = getNumIcons(modelIndex); unsigned int index = modelIndex.data(Qt::UserRole + 1).toInt(); if (index < ModInfo::getNumMods()) { ModInfo::Ptr info = ModInfo::getByIndex(index); diff --git a/src/icondelegate.h b/src/icondelegate.h index dd9f9dfc..cf292443 100644 --- a/src/icondelegate.h +++ b/src/icondelegate.h @@ -34,13 +34,16 @@ public: virtual void paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const; virtual QSize sizeHint(const QStyleOptionViewItem &option, const QModelIndex &index) const; + signals: public slots: private: - QIcon getFlagIcon(ModInfo::EFlag flag) const; + virtual QList getIcons(const QModelIndex &index) const = 0; + virtual size_t getNumIcons(const QModelIndex &index) const = 0; + private: diff --git a/src/lockeddialog.cpp b/src/lockeddialog.cpp index 4c19c615..065d9270 100644 --- a/src/lockeddialog.cpp +++ b/src/lockeddialog.cpp @@ -17,51 +17,59 @@ You should have received a copy of the GNU General Public License along with Mod Organizer. If not, see . */ -#include "lockeddialog.h" -#include "ui_lockeddialog.h" -#include - - -LockedDialog::LockedDialog(QWidget *parent) : - QDialog(parent), - ui(new Ui::LockedDialog), m_UnlockClicked(false) -{ - ui->setupUi(this); - - this->setWindowFlags(this->windowFlags() | Qt::ToolTip | Qt::FramelessWindowHint); - - if (parent != NULL) { - QPoint position = parent->mapToGlobal(QPoint(parent->width() / 2, parent->height() / 2)); - position.rx() -= this->width() / 2; - position.ry() -= this->height() / 2; - move(position); - } -} - -LockedDialog::~LockedDialog() -{ - delete ui; -} - - -void LockedDialog::setProcessName(const QString &name) -{ - ui->processLabel->setText(name); -} - - -void LockedDialog::resizeEvent(QResizeEvent *event) -{ - QWidget *par = parentWidget(); - if (par != NULL) { - QPoint position = par->mapToGlobal(QPoint(par->width() / 2, par->height() / 2)); - position.rx() -= event->size().width() / 2; - position.ry() -= event->size().height() / 2; - move(position); - } -} - -void LockedDialog::on_unlockButton_clicked() -{ - m_UnlockClicked = true; -} +#include "lockeddialog.h" +#include "ui_lockeddialog.h" +#include + + +LockedDialog::LockedDialog(QWidget *parent, const QString &text, bool unlockButton) + : QDialog(parent) + , ui(new Ui::LockedDialog) + , m_UnlockClicked(false) +{ + ui->setupUi(this); + + this->setWindowFlags(this->windowFlags() | Qt::ToolTip | Qt::FramelessWindowHint); + + if (parent != NULL) { + QPoint position = parent->mapToGlobal(QPoint(parent->width() / 2, parent->height() / 2)); + position.rx() -= this->width() / 2; + position.ry() -= this->height() / 2; + move(position); + } + + if (text.length() > 0) { + ui->label->setText(text); + } + if (!unlockButton) { + ui->unlockButton->hide(); + } +} + +LockedDialog::~LockedDialog() +{ + delete ui; +} + + +void LockedDialog::setProcessName(const QString &name) +{ + ui->processLabel->setText(name); +} + + +void LockedDialog::resizeEvent(QResizeEvent *event) +{ + QWidget *par = parentWidget(); + if (par != NULL) { + QPoint position = par->mapToGlobal(QPoint(par->width() / 2, par->height() / 2)); + position.rx() -= event->size().width() / 2; + position.ry() -= event->size().height() / 2; + move(position); + } +} + +void LockedDialog::on_unlockButton_clicked() +{ + m_UnlockClicked = true; +} diff --git a/src/lockeddialog.h b/src/lockeddialog.h index 5be398bc..0f3b29b0 100644 --- a/src/lockeddialog.h +++ b/src/lockeddialog.h @@ -17,51 +17,51 @@ You should have received a copy of the GNU General Public License along with Mod Organizer. If not, see . */ -#ifndef LOCKEDDIALOG_H -#define LOCKEDDIALOG_H - -#include - -namespace Ui { - class LockedDialog; -} - -/** - * a small borderless dialog displayed while the Mod Organizer UI is locked - * The dialog contains only a label and a button to force the UI to be unlocked - * - * The UI gets locked while running external applications since they may modify the - * data on which Mod Organizer works. After the UI is unlocked (manually or after the - * external application closed) MO will refresh all of its data sources - **/ -class LockedDialog : public QDialog -{ - Q_OBJECT - -public: - explicit LockedDialog(QWidget *parent = 0); - ~LockedDialog(); - - /** - * @brief see if the user clicked the unlock-button - * - * @return true if the user clicked the unlock button - **/ - bool unlockClicked() const { return m_UnlockClicked; } - - void setProcessName(const QString &name); - -protected: - - virtual void resizeEvent(QResizeEvent *event); - -private slots: - - void on_unlockButton_clicked(); - -private: - Ui::LockedDialog *ui; - bool m_UnlockClicked; -}; - -#endif // LOCKEDDIALOG_H +#ifndef LOCKEDDIALOG_H +#define LOCKEDDIALOG_H + +#include + +namespace Ui { + class LockedDialog; +} + +/** + * a small borderless dialog displayed while the Mod Organizer UI is locked + * The dialog contains only a label and a button to force the UI to be unlocked + * + * The UI gets locked while running external applications since they may modify the + * data on which Mod Organizer works. After the UI is unlocked (manually or after the + * external application closed) MO will refresh all of its data sources + **/ +class LockedDialog : public QDialog +{ + Q_OBJECT + +public: + explicit LockedDialog(QWidget *parent = 0, const QString &text = "", bool unlockButton = true); + ~LockedDialog(); + + /** + * @brief see if the user clicked the unlock-button + * + * @return true if the user clicked the unlock button + **/ + bool unlockClicked() const { return m_UnlockClicked; } + + void setProcessName(const QString &name); + +protected: + + virtual void resizeEvent(QResizeEvent *event); + +private slots: + + void on_unlockButton_clicked(); + +private: + Ui::LockedDialog *ui; + bool m_UnlockClicked; +}; + +#endif // LOCKEDDIALOG_H diff --git a/src/logbuffer.cpp b/src/logbuffer.cpp index 4f72e551..689d2b55 100644 --- a/src/logbuffer.cpp +++ b/src/logbuffer.cpp @@ -21,6 +21,7 @@ along with Mod Organizer. If not, see . #include "report.h" #include #include +#include #include QScopedPointer LogBuffer::s_Instance; @@ -124,8 +125,6 @@ char LogBuffer::msgTypeID(QtMsgType type) } } -#include - void LogBuffer::log(QtMsgType type, const char *message) { QMutexLocker guard(&s_Mutex); diff --git a/src/main.cpp b/src/main.cpp index 8b74ba83..05d68ec7 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -119,7 +119,8 @@ bool bootstrap() QDir::fromNativeSeparators(ToQString(gameInfo.getDownloadDir())), QDir::fromNativeSeparators(ToQString(gameInfo.getOverwriteDir())), QDir::fromNativeSeparators(ToQString(gameInfo.getLogDir())), - QDir::fromNativeSeparators(ToQString(gameInfo.getTutorialDir())) + QDir::fromNativeSeparators(ToQString(gameInfo.getTutorialDir())), + QDir::fromNativeSeparators(ToQString(gameInfo.getOrganizerDirectory()) + "/boss") }; static const int NUM_DIRECTORIES = sizeof(dirNames) / sizeof(QString); @@ -284,7 +285,7 @@ int main(int argc, char *argv[]) SetUnhandledExceptionFilter(MyUnhandledExceptionFilter); - LogBuffer::init(20, QtDebugMsg, application.applicationDirPath() + "/logs/mo_interface.log"); + LogBuffer::init(200, QtDebugMsg, application.applicationDirPath() + "/logs/mo_interface.log"); qDebug("Working directory: %s", qPrintable(QDir::toNativeSeparators(QDir::currentPath()))); qDebug("MO at: %s", qPrintable(QDir::toNativeSeparators(application.applicationDirPath()))); diff --git a/src/mainwindow.cpp b/src/mainwindow.cpp index 582bc283..0f98989c 100644 --- a/src/mainwindow.cpp +++ b/src/mainwindow.cpp @@ -48,7 +48,8 @@ along with Mod Organizer. If not, see . #include "filedialogmemory.h" #include "questionboxmemory.h" #include "tutorialmanager.h" -#include "icondelegate.h" +#include "modflagicondelegate.h" +#include "pluginflagicondelegate.h" #include "credentialsdialog.h" #include "selectiondialog.h" #include "csvbuilder.h" @@ -104,6 +105,7 @@ along with Mod Organizer. If not, see . #include #include #include +#include #ifdef TEST_MODELS @@ -186,7 +188,7 @@ MainWindow::MainWindow(const QString &exeName, QSettings &initSettings, QWidget ui->modList->setModel(m_ModListSortProxy); ui->modList->sortByColumn(ModList::COL_PRIORITY, Qt::AscendingOrder); - ui->modList->setItemDelegateForColumn(ModList::COL_FLAGS, new IconDelegate(ui->modList)); + ui->modList->setItemDelegateForColumn(ModList::COL_FLAGS, new ModFlagIconDelegate(ui->modList)); //ui->modList->setAcceptDrops(true); ui->modList->header()->installEventFilter(&m_ModList); if (initSettings.contains("mod_list_state")) { @@ -206,6 +208,7 @@ MainWindow::MainWindow(const QString &exeName, QSettings &initSettings, QWidget ui->espList->setModel(m_PluginListSortProxy); ui->espList->sortByColumn(PluginList::COL_PRIORITY, Qt::AscendingOrder); + ui->espList->setItemDelegateForColumn(PluginList::COL_FLAGS, new PluginFlagIconDelegate(ui->espList)); if (initSettings.contains("plugin_list_state")) { ui->espList->header()->restoreState(initSettings.value("plugin_list_state").toByteArray()); } @@ -1314,6 +1317,8 @@ HANDLE MainWindow::spawnBinaryDirect(const QFileInfo &binary, const QString &arg QCoreApplication::processEvents(); } + m_CurrentProfile->writeModlistNow(true); + // TODO: should also pass arguments if (m_AboutToRun(binary.absoluteFilePath())) { return startBinary(binary, arguments, profileName, m_Settings.logLevel(), currentDirectory, true); @@ -1778,7 +1783,7 @@ void MainWindow::refreshESPList() m_CurrentProfile->getLoadOrderFileName(), m_CurrentProfile->getLockedOrderFileName()); } catch (const std::exception &e) { - reportError(tr("Failed to refresh list of esps: %s").arg(e.what())); + reportError(tr("Failed to refresh list of esps: %1").arg(e.what())); } } @@ -5123,3 +5128,18 @@ void MainWindow::on_showHiddenBox_toggled(bool checked) m_DownloadManager.setShowHidden(checked); } +void MainWindow::on_bossButton_clicked() +{ + try { + LockedDialog dialog(this, tr("BOSS working"), false); + dialog.show(); + qApp->processEvents(); + m_PluginList.bossSort(); + + savePluginList(); + dialog.hide(); + } catch (const std::exception &e) { + reportError(tr("failed to run boss: %1").arg(e.what())); + ui->bossButton->setEnabled(false); + } +} diff --git a/src/mainwindow.h b/src/mainwindow.h index c01ce767..b247b924 100644 --- a/src/mainwindow.h +++ b/src/mainwindow.h @@ -564,6 +564,7 @@ private slots: // ui slots void on_linkButton_pressed(); void on_showHiddenBox_toggled(bool checked); void on_bsaList_itemChanged(QTreeWidgetItem *item, int column); + void on_bossButton_clicked(); }; #endif // MAINWINDOW_H diff --git a/src/mainwindow.ui b/src/mainwindow.ui index 5c89a7e0..f3bb425c 100644 --- a/src/mainwindow.ui +++ b/src/mainwindow.ui @@ -31,7 +31,16 @@ 4 - + + 6 + + + 6 + + + 6 + + 6 @@ -705,14 +714,25 @@ p, li { white-space: pre-wrap; } - - - - - - Namefilter - - + + + + + + + + Namefilter + + + + + + + Sort + + + + @@ -721,7 +741,16 @@ p, li { white-space: pre-wrap; } Archives - + + 6 + + + 6 + + + 6 + + 6 @@ -801,7 +830,16 @@ BSAs checked here are loaded in such a way that your installation order is obeye Data - + + 6 + + + 6 + + + 6 + + 6 @@ -871,7 +909,16 @@ BSAs checked here are loaded in such a way that your installation order is obeye Saves - + + 6 + + + 6 + + + 6 + + 6 @@ -900,7 +947,16 @@ p, li { white-space: pre-wrap; } Downloads - + + 2 + + + 2 + + + 2 + + 2 diff --git a/src/modflagicondelegate.cpp b/src/modflagicondelegate.cpp new file mode 100644 index 00000000..db69eb52 --- /dev/null +++ b/src/modflagicondelegate.cpp @@ -0,0 +1,50 @@ +#include "modflagicondelegate.h" +#include + + +ModFlagIconDelegate::ModFlagIconDelegate(QObject *parent) + : IconDelegate(parent) +{ +} + +QList ModFlagIconDelegate::getIcons(const QModelIndex &index) const +{ + QList result; + QVariant modid = index.data(Qt::UserRole + 1); + if (modid.isValid()) { + ModInfo::Ptr info = ModInfo::getByIndex(modid.toInt()); + std::vector flags = info->getFlags(); + + for (auto iter = flags.begin(); iter != flags.end(); ++iter) { + result.append(getFlagIcon(*iter)); + } + } + return result; +} + +QIcon ModFlagIconDelegate::getFlagIcon(ModInfo::EFlag flag) const +{ + switch (flag) { + case ModInfo::FLAG_BACKUP: return QIcon(":/MO/gui/emblem_backup"); + case ModInfo::FLAG_INVALID: return QIcon(":/MO/gui/emblem_problem"); + case ModInfo::FLAG_NOTENDORSED: return QIcon(":/MO/gui/emblem_notendorsed"); + case ModInfo::FLAG_NOTES: return QIcon(":/MO/gui/emblem_notes"); + case ModInfo::FLAG_CONFLICT_OVERWRITE: return QIcon(":/MO/gui/emblem_conflict_overwrite"); + case ModInfo::FLAG_CONFLICT_OVERWRITTEN: return QIcon(":/MO/gui/emblem_conflict_overwritten"); + case ModInfo::FLAG_CONFLICT_MIXED: return QIcon(":/MO/gui/emblem_conflict_mixed"); + case ModInfo::FLAG_CONFLICT_REDUNDANT: return QIcon(":MO/gui/emblem_conflict_redundant"); + default: return QIcon(); + } +} + +size_t ModFlagIconDelegate::getNumIcons(const QModelIndex &index) const +{ + unsigned int modIdx = index.data(Qt::UserRole + 1).toInt(); + if (modIdx < ModInfo::getNumMods()) { + ModInfo::Ptr info = ModInfo::getByIndex(modIdx); + return info->getFlags().size(); + } else { + return 0; + } +} + diff --git a/src/modflagicondelegate.h b/src/modflagicondelegate.h new file mode 100644 index 00000000..800e2741 --- /dev/null +++ b/src/modflagicondelegate.h @@ -0,0 +1,18 @@ +#ifndef MODFLAGICONDELEGATE_H +#define MODFLAGICONDELEGATE_H + +#include "icondelegate.h" + +class ModFlagIconDelegate : public IconDelegate +{ +public: + explicit ModFlagIconDelegate(QObject *parent = 0); +private: + virtual QList getIcons(const QModelIndex &index) const; + virtual size_t getNumIcons(const QModelIndex &index) const; + + QIcon getFlagIcon(ModInfo::EFlag flag) const; + +}; + +#endif // MODFLAGICONDELEGATE_H diff --git a/src/organizer.pro b/src/organizer.pro index fd72dea3..9a9d0da3 100644 --- a/src/organizer.pro +++ b/src/organizer.pro @@ -81,7 +81,10 @@ SOURCES += \ previewgenerator.cpp \ previewdialog.cpp \ aboutdialog.cpp \ - json.cpp + json.cpp \ + safewritefile.cpp \ + modflagicondelegate.cpp \ + pluginflagicondelegate.cpp HEADERS += \ @@ -152,7 +155,11 @@ HEADERS += \ previewgenerator.h \ previewdialog.h \ aboutdialog.h \ - json.h + json.h \ + safewritefile.h\ + pdll.h \ + modflagicondelegate.h \ + pluginflagicondelegate.h FORMS += \ transfersavesdialog.ui \ @@ -185,24 +192,28 @@ FORMS += \ previewdialog.ui \ aboutdialog.ui -INCLUDEPATH += ../shared ../archive ../uibase ../bsatk ../esptk "$(BOOSTPATH)" +INCLUDEPATH += ../shared ../archive ../uibase ../bsatk ../esptk ../boss_modified/boss-api "$(BOOSTPATH)" LIBS += -L"$(BOOSTPATH)/stage/lib" CONFIG(debug, debug|release) { OUTDIR = $$OUT_PWD/debug DSTDIR = $$PWD/../../outputd - LIBS += -L$$OUT_PWD/../shared/debug -L$$OUT_PWD/../bsatk/debug - LIBS += -L$$OUT_PWD/../uibase/debug - LIBS += -lDbgHelp + LIBS += -L$$OUT_PWD/../shared/debug + LIBS += -L$$OUT_PWD/../bsatk/debug + LIBS += -L$$OUT_PWD/../uibase/debug + LIBS += -L$$OUT_PWD/../boss_modified/debug + LIBS += -lDbgHelp } else { OUTDIR = $$OUT_PWD/release DSTDIR = $$PWD/../../output - LIBS += -L$$OUT_PWD/../shared/release -L$$OUT_PWD/../bsatk/release + LIBS += -L$$OUT_PWD/../shared/release + LIBS += -L$$OUT_PWD/../bsatk/release LIBS += -L$$OUT_PWD/../uibase/release - QMAKE_CXXFLAGS += /Zi + LIBS += -L$$OUT_PWD/../boss_modified/release + QMAKE_CXXFLAGS += /Zi /GL # QMAKE_CXXFLAGS -= -O2 - QMAKE_LFLAGS += /DEBUG + QMAKE_LFLAGS += /DEBUG /LTCG /OPT:REF /OPT:ICF } #QMAKE_CXXFLAGS_WARN_ON -= -W3 @@ -299,9 +310,6 @@ OTHER_FILES += \ tutorials/tutorial_window_installer.js \ tutorials/tutorials_installdialog.qml -INCLUDEPATH += "$(ZLIBPATH)" "$(ZLIBPATH)/build" "$(BOOSTPATH)" -LIBS += -L"$(ZLIBPATH)/build" -lzlibstatic - # leak detection with vld #INCLUDEPATH += "E:/Visual Leak Detector/include" diff --git a/src/pdll.h b/src/pdll.h new file mode 100644 index 00000000..6e1d06f3 --- /dev/null +++ b/src/pdll.h @@ -0,0 +1,402 @@ +//////////////////////////////////////////////////////////////////////////////////////////////////// +// Class: PDll // +// Authors: MicHael Galkovsky // +// Date: April 14, 1998 // +// Company: Pervasive Software // +// Purpose: Base class to wrap dynamic use of dll // +////////////////////////////////////////////////////////////////////////////////////////////// + +#if !defined (_PDLL_H_) +#define _PDLL_H_ + +#include +#include + +#include +#include +#include + + +#define FUNC_LOADED 3456 + +//function declarations according to the number of parameters +//define the type +//declare a variable of that type +//declare a member function by the same name as the dll function +//check for dll handle +//if this is the first call to the function then try to load it +//if not then if the function was loaded successfully make a call to it +//otherwise return a NULL cast to the return parameter. + +#define DECLARE_FUNCTION0(CallType, retVal, FuncName) \ + typedef retVal (CallType* TYPE_##FuncName)(); \ + TYPE_##FuncName m_##FuncName; \ + short m_is##FuncName; \ + retVal FuncName() \ + { \ + if (m_dllHandle) \ + { \ + if (FUNC_LOADED != m_is##FuncName) \ + {\ + m_##FuncName = NULL; \ + m_##FuncName = (TYPE_##FuncName)GetProcAddress(m_dllHandle, #FuncName); \ + m_is##FuncName = FUNC_LOADED;\ + }\ + if (NULL != m_##FuncName) \ + return m_##FuncName(); \ + else \ + return (retVal)NULL; \ + } \ + else \ + return (retVal)NULL; \ + } + +#define DECLARE_FUNCTION1(CallType,retVal, FuncName, Param1) \ + typedef retVal (CallType* TYPE_##FuncName)(Param1); \ + TYPE_##FuncName m_##FuncName; \ + short m_is##FuncName;\ + retVal FuncName(Param1 p1) \ + { \ + if (m_dllHandle) \ + { \ + if (FUNC_LOADED != m_is##FuncName) \ + {\ + m_##FuncName = NULL; \ + m_##FuncName = (TYPE_##FuncName)GetProcAddress(m_dllHandle, #FuncName); \ + m_is##FuncName = FUNC_LOADED;\ + }\ + if (NULL != m_##FuncName) \ + return m_##FuncName(p1); \ + else \ + return (retVal)NULL; \ + } \ + else \ + return (retVal)NULL; \ + } + +#define DECLARE_FUNCTION2(CallType,retVal, FuncName, Param1, Param2) \ + typedef retVal (CallType* TYPE_##FuncName)(Param1, Param2); \ + TYPE_##FuncName m_##FuncName; \ + short m_is##FuncName;\ + retVal FuncName (Param1 p1, Param2 p2) \ + {\ + if (m_dllHandle)\ + {\ + if (FUNC_LOADED != m_is##FuncName) \ + {\ + m_##FuncName = NULL; \ + m_##FuncName = (TYPE_##FuncName)GetProcAddress(m_dllHandle, #FuncName); \ + m_is##FuncName = FUNC_LOADED;\ + }\ + if (NULL != m_##FuncName) \ + return m_##FuncName(p1, p2); \ + else \ + return (retVal)NULL; \ + } \ + else\ + return (retVal)NULL; \ + } + +#define DECLARE_FUNCTION3(CallType,retVal, FuncName, Param1, Param2, Param3) \ + typedef retVal (CallType* TYPE_##FuncName)(Param1, Param2, Param3); \ + TYPE_##FuncName m_##FuncName; \ + short m_is##FuncName;\ + retVal FuncName (Param1 p1, Param2 p2, Param3 p3) \ + {\ + if (m_dllHandle)\ + {\ + if (FUNC_LOADED != m_is##FuncName) \ + {\ + m_##FuncName = NULL; \ + m_##FuncName = (TYPE_##FuncName)GetProcAddress(m_dllHandle, #FuncName); \ + m_is##FuncName = FUNC_LOADED; \ + }\ + if (NULL != m_##FuncName) \ + return m_##FuncName(p1, p2, p3);\ + else \ + return (retVal)NULL; \ + } \ + else\ + return (retVal)NULL; \ + } + +#define DECLARE_FUNCTION4(CallType,retVal, FuncName, Param1, Param2, Param3, Param4) \ + typedef retVal (CallType* TYPE_##FuncName)(Param1, Param2, Param3, Param4); \ + TYPE_##FuncName m_##FuncName; \ + short m_is##FuncName;\ + retVal FuncName (Param1 p1, Param2 p2, Param3 p3, Param4 p4) \ + {\ + if (m_dllHandle)\ + {\ + if (FUNC_LOADED != m_is##FuncName) \ + {\ + m_##FuncName = NULL; \ + m_##FuncName = (TYPE_##FuncName)GetProcAddress(m_dllHandle, #FuncName); \ + m_is##FuncName = FUNC_LOADED;\ + }\ + if (NULL != m_##FuncName) \ + return m_##FuncName(p1, p2, p3, p4);\ + else \ + return (retVal)NULL; \ + } \ + else\ + return (retVal)NULL; \ + } + +#define DECLARE_FUNCTION5(CallType,retVal, FuncName, Param1, Param2, Param3, Param4, Param5) \ + typedef retVal (CallType* TYPE_##FuncName)(Param1, Param2, Param3, Param4, Param5); \ + TYPE_##FuncName m_##FuncName; \ + short m_is##FuncName; \ + retVal FuncName (Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5) \ + {\ + if (m_dllHandle)\ + {\ + if (FUNC_LOADED != m_is##FuncName) \ + {\ + m_##FuncName = NULL; \ + m_##FuncName = (TYPE_##FuncName)GetProcAddress(m_dllHandle, #FuncName); \ + m_is##FuncName = FUNC_LOADED;\ + }\ + if (NULL != m_##FuncName) \ + return m_##FuncName(p1, p2, p3, p4, p5);\ + else \ + return (retVal)NULL; \ + } \ + else\ + return (retVal)NULL; \ + } + +#define DECLARE_FUNCTION6(CallType,retVal, FuncName, Param1, Param2, Param3, Param4, Param5, Param6) \ + typedef retVal (CallType* TYPE_##FuncName)(Param1, Param2, Param3, Param4, Param5, Param6); \ + TYPE_##FuncName m_##FuncName; \ + short m_is##FuncName;\ + retVal FuncName (Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6) \ + {\ + if (m_dllHandle)\ + {\ + if (FUNC_LOADED != m_is##FuncName) \ + {\ + m_##FuncName = NULL; \ + m_##FuncName = (TYPE_##FuncName)GetProcAddress(m_dllHandle, #FuncName); \ + m_is##FuncName = FUNC_LOADED;\ + }\ + if (NULL != m_##FuncName) \ + return m_##FuncName(p1, p2, p3, p4, p5, p6);\ + else \ + return (retVal)NULL; \ + } \ + else\ + return (retVal)NULL; \ + } + +#define DECLARE_FUNCTION7(CallType,retVal, FuncName, Param1, Param2, Param3, Param4, Param5, Param6, Param7) \ + typedef retVal (CallType* TYPE_##FuncName)(Param1, Param2, Param3, Param4, Param5, Param6, Param7); \ + TYPE_##FuncName m_##FuncName; \ + short m_is##FuncName;\ + retVal FuncName (Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7) \ + {\ + if (m_dllHandle)\ + {\ + if (FUNC_LOADED != m_is##FuncName) \ + {\ + m_##FuncName = NULL; \ + m_##FuncName = (TYPE_##FuncName)GetProcAddress(m_dllHandle, #FuncName); \ + m_is##FuncName = FUNC_LOADED;\ + }\ + if (NULL != m_##FuncName) \ + return m_##FuncName(p1, p2, p3, p4, p5, p6, p7);\ + else \ + return (retVal)NULL; \ + } \ + else\ + return (retVal)NULL; \ + } + +#define DECLARE_FUNCTION8(CallType,retVal, FuncName, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8) \ + typedef retVal (CallType* TYPE_##FuncName)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8); \ + TYPE_##FuncName m_##FuncName; \ + short m_is##FuncName;\ + retVal FuncName (Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8) \ + {\ + if (m_dllHandle)\ + {\ + if (FUNC_LOADED != m_is##FuncName) \ + {\ + m_##FuncName = NULL; \ + m_##FuncName = (TYPE_##FuncName)GetProcAddress(m_dllHandle, #FuncName); \ + m_is##FuncName = FUNC_LOADED;\ + }\ + if (NULL != m_##FuncName) \ + return m_##FuncName(p1, p2, p3, p4, p5, p6, p7, p8);\ + else \ + return (retVal)NULL; \ + }\ + else\ + return (retVal)NULL; \ + } + +#define DECLARE_FUNCTION9(CallType,retVal, FuncName, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9) \ + typedef retVal (CallType* TYPE_##FuncName)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9); \ + TYPE_##FuncName m_##FuncName; \ + short m_is##FuncName; \ + retVal FuncName (Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9) \ + {\ + if (m_dllHandle)\ + {\ + if (FUNC_NAME != m_is##FuncName) \ + {\ + m_##FuncName = NULL; \ + m_##FuncName = (TYPE_##FuncName)GetProcAddress(m_dllHandle, #FuncName); \ + m_is##FuncName = FUNC_LOADED;\ + }\ + if (NULL != m_##FuncName) \ + return m_##FuncName(p1, p2, p3, p4, p5, p6, p7, p8, p9);\ + else \ + return (retVal)NULL; \ + }\ + else\ + return (retVal)NULL; \ + } + +#define DECLARE_FUNCTION10(CallType,retVal, FuncName, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10) \ + typedef retVal (CallType* TYPE_##FuncName)FuncName(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10); \ + TYPE_##FuncName m_##FuncName; \ + short m_is##FuncName;\ + retVal FuncName (Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10) \ + {\ + if (m_dllHandle)\ + {\ + if (FUNC_LOADED != m_is##FuncName) \ + {\ + m_##FuncName = NULL; \ + m_##FuncName = (TYPE_##FuncName)GetProcAddress(m_dllHandle, #FuncName); \ + m_is##FuncName = FUNC_LOADED;\ + }\ + if (NULL != m_##FuncName) \ + return m_##FuncName(p1, p2, p3, p4, p5, p6, p7, p8, p9, p10);\ + else \ + return (retVal)NULL; \ + }\ + else \ + return (retVal)NULL;\ + } + +//declare constructors and LoadFunctions +#define DECLARE_CLASS(ClassName) \ + public: \ + ClassName (LPCTSTR name){LoadDll(name);} \ + ClassName () {PDLL();} + +class PDLL +{ +protected: + HINSTANCE m_dllHandle; +private: + LPTSTR m_dllName; + int m_refCount; + +public: + + PDLL() + { + m_dllHandle = NULL; + m_dllName = NULL; + m_refCount = 0; + } + + //A NULL here means the name has already been set + void LoadDll(LPCTSTR name, bool showMsg = true) + { + if (name) + SetDllName(name); + + //try to load + m_dllHandle = LoadLibrary(m_dllName); + + if (m_dllHandle == NULL && showMsg) + { + std::ostringstream message; + message << "failed to load dll: " << ::GetLastError(); + throw std::runtime_error(message.str().c_str()); + } + } + + bool SetDllName(LPCTSTR newName) + { + bool retVal = false; + + //we allow name resets only if the current DLL handle is invalid + //once they've hooked into a DLL, the name cannot be changed + if (!m_dllHandle) + { + if (m_dllName) + { + delete []m_dllName; + m_dllName = NULL; + } + + //They may be setting this null (e.g., uninitialize) + if (newName) + { + m_dllName = new TCHAR[_tcslen(newName) + 1]; + _tcscpy(m_dllName, newName); + } + retVal = true; + } + return retVal; + } + + virtual bool Initialize(short showMsg = 1) + { + + bool retVal = false; + + //Add one to our internal reference counter + m_refCount++; + + if (m_refCount == 1 && m_dllName) //if this is first time, load the DLL + { + //we are assuming the name is already set + LoadDll(NULL, showMsg); + retVal = (m_dllHandle != NULL); + } + return retVal; + } + + virtual void Uninitialize(void) + { + //If we're already completely unintialized, early exit + if (!m_refCount) + return; + //if this is the last time this instance has been unitialized, + //then do a full uninitialization + m_refCount--; + + if (m_refCount < 1) + { + if (m_dllHandle) + { + FreeLibrary(m_dllHandle); + m_dllHandle = NULL; + } + + SetDllName(NULL); //clear out the name & free memory + } + } + + virtual ~PDLL() + { + //force this to be a true uninitialize + m_refCount = 1; + Uninitialize(); + + //free name + if (m_dllName) + { + delete [] m_dllName; + m_dllName = NULL; + } + } + +}; +#endif diff --git a/src/pluginflagicondelegate.cpp b/src/pluginflagicondelegate.cpp new file mode 100644 index 00000000..6c0bb29e --- /dev/null +++ b/src/pluginflagicondelegate.cpp @@ -0,0 +1,24 @@ +#include "pluginflagicondelegate.h" +#include "pluginlist.h" +#include + + +PluginFlagIconDelegate::PluginFlagIconDelegate(QObject *parent) + : IconDelegate(parent) +{ +} + +QList PluginFlagIconDelegate::getIcons(const QModelIndex &index) const +{ + QList result; + foreach (const QVariant &var, index.data(Qt::UserRole + 1).toList()) { + result.append(var.value()); + } + return result; +} + +size_t PluginFlagIconDelegate::getNumIcons(const QModelIndex &index) const +{ + return index.data(Qt::UserRole + 1).toList().count(); +} + diff --git a/src/pluginflagicondelegate.h b/src/pluginflagicondelegate.h new file mode 100644 index 00000000..554e968b --- /dev/null +++ b/src/pluginflagicondelegate.h @@ -0,0 +1,17 @@ +#ifndef PLUGINFLAGICONDELEGATE_H +#define PLUGINFLAGICONDELEGATE_H + +#include "icondelegate.h" + +class PluginFlagIconDelegate : public IconDelegate +{ +public: + PluginFlagIconDelegate(QObject *parent = NULL); + + // IconDelegate interface +private: + virtual QList getIcons(const QModelIndex &index) const; + virtual size_t getNumIcons(const QModelIndex &index) const; +}; + +#endif // PLUGINFLAGICONDELEGATE_H diff --git a/src/pluginlist.cpp b/src/pluginlist.cpp index 85137390..c2e14182 100644 --- a/src/pluginlist.cpp +++ b/src/pluginlist.cpp @@ -20,8 +20,10 @@ along with Mod Organizer. If not, see . #include "pluginlist.h" #include "report.h" #include "inject.h" -#include #include "settings.h" +#include "safewritefile.h" +#include "scopeguard.h" +#include #include #include #include @@ -39,7 +41,6 @@ along with Mod Organizer. If not, see . #include #include -#include #include #include #include @@ -74,8 +75,10 @@ bool ByDate(const PluginList::ESPInfo& LHS, const PluginList::ESPInfo& RHS) { } PluginList::PluginList(QObject *parent) - : QAbstractTableModel(parent), - m_FontMetrics(QFont()), m_SaveTimer(this) + : QAbstractTableModel(parent) + , m_FontMetrics(QFont()) + , m_SaveTimer(this) + , m_BOSS(NULL) { m_SaveTimer.setSingleShot(true); connect(&m_SaveTimer, SIGNAL(timeout()), this, SIGNAL(saveTimer())); @@ -92,6 +95,12 @@ PluginList::PluginList(QObject *parent) PluginList::~PluginList() { + if (m_BOSS != NULL) { + m_BOSS->DestroyBossDb(m_BOSSDB); + m_BOSS->CleanUpAPI(); + delete m_BOSS; + m_BOSS = NULL; + } } @@ -101,6 +110,7 @@ QString PluginList::getColumnName(int column) case COL_NAME: return tr("Name"); case COL_PRIORITY: return tr("Priority"); case COL_MODINDEX: return tr("Mod Index"); + case COL_FLAGS: return tr("Flags"); default: return tr("unknown"); } } @@ -205,7 +215,7 @@ void PluginList::refresh(const QString &profileName, const DirectoryEntry &baseD emit layoutChanged(); refreshLoadOrder(); - emit dataChanged(this->index(0, 0), this->index(m_ESPs.size(), 1)); + emit dataChanged(this->index(0, 0), this->index(m_ESPs.size(), columnCount())); m_Refreshed(); } @@ -375,18 +385,16 @@ void PluginList::readLockedOrderFrom(const QString &fileName) } + void PluginList::writePlugins(const QString &fileName, bool writeUnchecked) const { - QFile file(fileName); - if (!file.open(QIODevice::WriteOnly)) { - throw MyException(tr("failed to open output file: %1").arg(fileName)); - } + SafeWriteFile file(fileName); QTextCodec *textCodec = writeUnchecked ? m_Utf8Codec : m_LocalCodec; - file.resize(0); + file->resize(0); - file.write(textCodec->fromUnicode("# This file was automatically generated by Mod Organizer.\r\n")); + file->write(textCodec->fromUnicode("# This file was automatically generated by Mod Organizer.\r\n")); bool invalidFileNames = false; int writtenCount = 0; @@ -398,36 +406,34 @@ void PluginList::writePlugins(const QString &fileName, bool writeUnchecked) cons invalidFileNames = true; qCritical("invalid plugin name %s", m_ESPs[priority].m_Name.toUtf8().constData()); } else { - file.write(textCodec->fromUnicode(m_ESPs[priority].m_Name)); + file->write(textCodec->fromUnicode(m_ESPs[priority].m_Name)); } - file.write("\r\n"); + file->write("\r\n"); ++writtenCount; } } - file.close(); if (invalidFileNames) { reportError(tr("Some of your plugins have invalid names! These plugins can not be loaded by the game. " "Please see mo_interface.log for a list of affected plugins and rename them.")); } + file.commit(); + qDebug("%s saved", QDir::toNativeSeparators(fileName).toUtf8().constData()); } void PluginList::writeLockedOrder(const QString &fileName) const { - QFile file(fileName); - if (!file.open(QIODevice::WriteOnly)) { - throw MyException(tr("failed to open output file: %1").arg(fileName)); - } + SafeWriteFile file(fileName); - file.resize(0); - file.write(QString("# This file was automatically generated by Mod Organizer.\r\n").toUtf8()); + file->resize(0); + file->write(QString("# This file was automatically generated by Mod Organizer.\r\n").toUtf8()); for (auto iter = m_LockedOrder.begin(); iter != m_LockedOrder.end(); ++iter) { - file.write(QString("%1|%2\r\n").arg(iter->first).arg(iter->second).toUtf8()); + file->write(QString("%1|%2\r\n").arg(iter->first).arg(iter->second).toUtf8()); } - file.close(); + file.commit(); } @@ -590,6 +596,175 @@ void PluginList::refreshLoadOrder() emit layoutChanged(); } + +class boss_exception : public std::runtime_error { +public: + boss_exception(const std::string &message) : std::runtime_error(message) {} +}; + +#define THROW_BOSS_ERROR(obj) \ + uint8_t *message; \ + obj->GetLastErrorDetails(&message); \ + throw boss_exception(std::string(reinterpret_cast(message))); + +#define U8(text) reinterpret_cast(text) + + +void outputBossLog(const QString &filename) +{ + QFile file(filename); + if (file.open(QIODevice::ReadOnly)) { + while (!file.atEnd()) { + QByteArray line = file.readLine().trimmed(); + if (line.length() < 1) + continue; + + int endFirstWord = line.indexOf(':'); + if (endFirstWord < 0) { + endFirstWord = 0; + } + QString firstWord = line.mid(0, endFirstWord); + if (firstWord == "DEBUG") { + qDebug("(boss) %s", line.mid(endFirstWord + 2).constData()); + } else { + qWarning("(boss) %s", line.mid(endFirstWord + 2).constData()); + } + } + } + file.resize(0); +} + + +void PluginList::initBoss() +{ + m_BOSS = new BossDLL(TEXT("dlls\\boss.dll")); + + if (!m_BOSS->IsCompatibleVersion(2,1,1)) { + throw MyException(tr("BOSS dll incompatible")); + } + uint8_t *versionString; + if (m_BOSS->GetVersionString(&versionString) != BossDLL::RESULT_OK) { + THROW_BOSS_ERROR(m_BOSS) + } + qDebug("using boss version %s", versionString); + + m_TempFile.open(); m_TempFile.close(); // yeah, stupid, but open is required to generate the name + m_BOSS->SetLoggerOutput(m_TempFile.fileName().toLocal8Bit().constData(), 4); + + if (m_BOSS->CreateBossDb(&m_BOSSDB, BossDLL::SKYRIM, NULL) != BossDLL::RESULT_OK) { + uint8_t *message; + m_BOSS->GetLastErrorDetails(&message); + std::string messageCopy(reinterpret_cast(message)); + delete m_BOSS; + m_BOSS = NULL; + throw boss_exception(messageCopy); + } + qApp->processEvents(); + + QString masterlistName = QDir::toNativeSeparators(qApp->applicationDirPath() + "/boss/masterlist.txt"); + + uint32_t res = m_BOSS->UpdateMasterlist(m_BOSSDB, U8(masterlistName.toUtf8().constData())); + qApp->processEvents(); + if (res == BossDLL::RESULT_OK) { + qDebug("boss masterlist updated"); + } else if (res == BossDLL::RESULT_NO_UPDATE_NECESSARY) { + qDebug("boss masterlist already up-to-date"); + } else { + THROW_BOSS_ERROR(m_BOSS) + } + if (m_BOSS->Load(m_BOSSDB, + U8(masterlistName.toUtf8().constData()), + U8(QDir::toNativeSeparators(qApp->applicationDirPath() + "/boss/userlist.txt").toUtf8().constData())) != BossDLL::RESULT_OK) { + THROW_BOSS_ERROR(m_BOSS) + } +} + +void PluginList::convertPluginListForBoss(boost::ptr_vector &inputPlugins, std::vector &activePlugins) +{ + foreach (int idx, m_ESPsByPriority) { + QString fileName = m_ESPs[idx].m_Name; + QByteArray name = fileName.toUtf8(); + + uint8_t *nameU8 = new uint8_t[name.length() + 1]; + memcpy(nameU8, name.constData(), name.length() + 1); + if (m_ESPs[idx].m_Enabled) { + activePlugins.push_back(nameU8); + } + inputPlugins.push_back(nameU8); + } + if (m_BOSS->SetActivePluginsDumb(m_BOSSDB, &activePlugins[0], activePlugins.size()) != BossDLL::RESULT_OK) { + THROW_BOSS_ERROR(m_BOSS) + } +} + +void PluginList::applyBOSSSorting(uint8_t **pluginList, size_t size, int &priority, bool recognized, const char *extension) +{ + for (size_t i= 0; i < size; ++i) { + QString name = QString::fromUtf8(reinterpret_cast(pluginList[i])).toLower(); + if (name.endsWith(extension)) { + auto iter = m_ESPsByName.find(name); + if (iter == m_ESPsByName.end()) { + throw MyException("boss returned invalid data"); + } + BossMessage *message; + size_t numMessages = 0; + m_BOSS->GetPluginMessages(m_BOSSDB, pluginList[i], &message, &numMessages); + m_ESPs[iter->second].m_BOSSMessages.clear(); + for (size_t im = 0; im < numMessages; ++im) { + m_ESPs[iter->second].m_BOSSMessages.append(QString::fromUtf8(reinterpret_cast(message[im].message))); + } + m_ESPs[iter->second].m_Priority = priority++; + m_ESPs[iter->second].m_BOSSUnrecognized = !recognized; + } + } +} + +void PluginList::bossSort() +{ + if (m_BOSS == NULL) { + // first run, check boss compatibility and update + initBoss(); + } + + // create a boss-compatible representation of our current mod list. + boost::ptr_vector inputPlugins; + std::vector activePlugins; + convertPluginListForBoss(inputPlugins, activePlugins); + + // sort mods in-memory + uint8_t **sortedPlugins; + uint8_t **unrecognizedPlugins; + size_t sizeSorted, sizeUnrecognized; + + if (m_BOSS->SortCustomMods(m_BOSSDB, + inputPlugins.c_array(), inputPlugins.size(), + &sortedPlugins, &sizeSorted, + &unrecognizedPlugins, &sizeUnrecognized) != BossDLL::RESULT_OK) { + THROW_BOSS_ERROR(m_BOSS) + } + + // output the log from boss to our own log to make it visible + outputBossLog(m_TempFile.fileName()); + + qDebug("%d sorted, %d unrecognized", sizeSorted, sizeUnrecognized); + + emit layoutAboutToBeChanged(); + + int priority = 0; + applyBOSSSorting(sortedPlugins, sizeSorted, priority, true, "esm"); + applyBOSSSorting(unrecognizedPlugins, sizeUnrecognized, priority, false, "esm"); + applyBOSSSorting(sortedPlugins, sizeSorted, priority, true, "esp"); + applyBOSSSorting(unrecognizedPlugins, sizeUnrecognized, priority, false, "esp"); + + // inform view of the changed data + updateIndices(); + emit layoutChanged(); + syncLoadOrder(); + + emit dataChanged(this->index(0, 0), this->index(m_ESPs.size(), columnCount())); + m_Refreshed(); +} + IPluginList::PluginState PluginList::state(const QString &name) const { auto iter = m_ESPsByName.find(name.toLower()); @@ -670,7 +845,7 @@ int PluginList::rowCount(const QModelIndex &parent) const int PluginList::columnCount(const QModelIndex &) const { - return 3; + return COL_LASTCOLUMN + 1; } @@ -724,18 +899,6 @@ QVariant PluginList::data(const QModelIndex &modelIndex, int role) const return QVariant(); } break; } - } else if ((role == Qt::DecorationRole) && (modelIndex.column() == 0)) { - if (m_ESPs[index].m_MasterUnset.size() > 0) { - return QIcon(":/MO/gui/warning"); - } else if (m_LockedOrder.find(m_ESPs[index].m_Name.toLower()) != m_LockedOrder.end()) { - return QIcon(":/MO/gui/locked"); - } else if (m_ESPs[index].m_HasIni) { - return QIcon(":/MO/gui/attachment"); - } else if (m_ESPs[index].m_IsDummy && m_ESPs[index].m_Enabled && !m_ESPs[index].m_HasIni) { - return QIcon(":/MO/gui/edit_clear"); - } else { - return QVariant(); - } } else if ((role == Qt::CheckStateRole) && (modelIndex.column() == 0)) { return m_ESPs[index].m_Enabled ? Qt::Checked : Qt::Unchecked; } else if (role == Qt::FontRole) { @@ -754,8 +917,15 @@ QVariant PluginList::data(const QModelIndex &modelIndex, int role) const return QVariant(Qt::AlignHCenter | Qt::AlignVCenter); } } else if (role == Qt::ToolTipRole) { + QString toolTip; + if (!m_ESPs[index].m_BOSSMessages.isEmpty()) { + toolTip += m_ESPs[index].m_BOSSMessages.join("
        ") + "

        "; + } + if (m_ESPs[index].m_BOSSUnrecognized) { + toolTip += "Not recognized by BOSS
        "; + } if (m_ESPs[index].m_ForceEnabled) { - return tr("This plugin can't be disabled (enforced by the game)"); + toolTip += tr("This plugin can't be disabled (enforced by the game)"); } else { QString text = tr("Origin: %1").arg(m_ESPs[index].m_OriginName); if (m_ESPs[index].m_MasterUnset.size() > 0) { @@ -773,8 +943,30 @@ QVariant PluginList::data(const QModelIndex &modelIndex, int role) const text += "
        This file is a dummy! It exists only so the bsa with the same name gets loaded. With MO you don't need this: " "If you enable the archive with the same name in the \"Archive\" tab you can disable this plugin."; } - return text; + toolTip += text; + } + return toolTip; + } else if (role == Qt::UserRole + 1) { + QVariantList result; + if (m_ESPs[index].m_MasterUnset.size() > 0) { + result.append(QIcon(":/MO/gui/warning")); + } + if (m_LockedOrder.find(m_ESPs[index].m_Name.toLower()) != m_LockedOrder.end()) { + result.append(QIcon(":/MO/gui/locked")); } + if (!m_ESPs[index].m_BOSSMessages.isEmpty()) { + result.append(QIcon(":/MO/gui/information")); + } + if (m_ESPs[index].m_BOSSUnrecognized) { + result.append(QIcon(":/MO/gui/help")); + } + if (m_ESPs[index].m_HasIni) { + result.append(QIcon(":/MO/gui/attachment")); + } + if (m_ESPs[index].m_IsDummy && m_ESPs[index].m_Enabled && !m_ESPs[index].m_HasIni) { + result.append(QIcon(":/MO/gui/edit_clear")); + } + return result; } else { return QVariant(); } @@ -784,7 +976,6 @@ QVariant PluginList::data(const QModelIndex &modelIndex, int role) const bool PluginList::setData(const QModelIndex &modIndex, const QVariant &value, int role) { if (role == Qt::CheckStateRole) { -qDebug("uncheck plugin"); m_ESPs[modIndex.row()].m_Enabled = value.toInt() == Qt::Checked; emit dataChanged(modIndex, modIndex); @@ -1036,7 +1227,8 @@ PluginList::ESPInfo::ESPInfo(const QString &name, bool enabled, FILETIME time, const QString &originName, const QString &fullPath, bool hasIni) : m_Name(name), m_Enabled(enabled), m_ForceEnabled(enabled), m_Removed(false), - m_Priority(0), m_LoadOrder(-1), m_Time(time), m_OriginName(originName), m_HasIni(hasIni) + m_Priority(0), m_LoadOrder(-1), m_Time(time), m_OriginName(originName), m_HasIni(hasIni), + m_BOSSUnrecognized(false) { try { ESP::File file(ToWString(fullPath)); diff --git a/src/pluginlist.h b/src/pluginlist.h index 64c914df..bb7428d0 100644 --- a/src/pluginlist.h +++ b/src/pluginlist.h @@ -25,8 +25,12 @@ along with Mod Organizer. If not, see . #include #include #include +#include #include +#include #include +#include +#include /** @@ -40,6 +44,7 @@ public: enum EColumn { COL_NAME, + COL_FLAGS, COL_PRIORITY, COL_MODINDEX, @@ -143,6 +148,8 @@ public: void refreshLoadOrder(); + void bossSort(); + public: virtual PluginState state(const QString &name) const; virtual int priority(const QString &name) const; @@ -162,6 +169,7 @@ public: // implementation of the QAbstractTableModel interface virtual Qt::DropActions supportedDropActions() const { return Qt::MoveAction; } virtual bool dropMimeData(const QMimeData *data, Qt::DropAction action, int row, int column, const QModelIndex &parent); + void applyBOSSSorting(uint8_t **pluginList, size_t size, int &priority, bool recognized, const char *extension); public slots: /** @@ -194,7 +202,6 @@ private: ESPInfo(const QString &name, bool enabled, FILETIME time, const QString &originName, const QString &fullPath, bool hasIni); QString m_Name; - QString m_FullPath; bool m_Enabled; bool m_ForceEnabled; bool m_Removed; @@ -207,12 +214,91 @@ private: bool m_HasIni; std::set m_Masters; mutable std::set m_MasterUnset; + QStringList m_BOSSMessages; + bool m_BOSSUnrecognized; }; friend bool ByName(const ESPInfo& LHS, const ESPInfo& RHS); friend bool ByDate(const ESPInfo& LHS, const ESPInfo& RHS); friend bool ByPriority(const ESPInfo& LHS, const ESPInfo& RHS); + + class BossDLL : public PDLL { + DECLARE_CLASS(BossDLL) + + DECLARE_FUNCTION3(__cdecl, uint32_t, CreateBossDb, boss_db*, const uint32_t, const uint8_t*) + DECLARE_FUNCTION1(__cdecl, void, DestroyBossDb, boss_db) + DECLARE_FUNCTION0(__cdecl, void, CleanUpAPI) + + DECLARE_FUNCTION7(__cdecl, uint32_t, SortCustomMods, boss_db, uint8_t**, size_t, uint8_t***, size_t*, uint8_t***, size_t*) + DECLARE_FUNCTION3(__cdecl, uint32_t, SetActivePluginsDumb, boss_db, uint8_t**, const size_t) + + DECLARE_FUNCTION3(__cdecl, uint32_t, GetActivePluginsDumb , boss_db, uint8_t***, size_t*) + + DECLARE_FUNCTION2(__cdecl, uint32_t, UpdateMasterlist, boss_db, const uint8_t*) + DECLARE_FUNCTION3(__cdecl, uint32_t, Load, boss_db, const uint8_t*, const uint8_t*) + + DECLARE_FUNCTION2(__cdecl, void, SetLoggerOutput, const char*, uint8_t) + DECLARE_FUNCTION1(__cdecl, uint32_t, GetLastErrorDetails, uint8_t**) + + DECLARE_FUNCTION1(__cdecl, uint32_t, GetVersionString, uint8_t**) + DECLARE_FUNCTION3(__cdecl, bool, IsCompatibleVersion, const uint32_t, const uint32_t, const uint32_t) + + DECLARE_FUNCTION4(__cdecl, uint32_t, GetPluginMessages, boss_db, const uint8_t*, BossMessage**, size_t*) + + enum ResultCode { + RESULT_OK = 0, + RESULT_NO_MASTER_FILE = 1, + RESULT_FILE_READ_FAIL = 2, + RESULT_FILE_WRITE_FAIL = 3, + RESULT_FILE_NOT_UTF8 = 4, + RESULT_FILE_NOT_FOUND = 5, + RESULT_FILE_PARSE_FAIL = 6, + RESULT_CONDITION_EVAL_FAIL = 7, + RESULT_REGEX_EVAL_FAIL = 8, + RESULT_NO_GAME_DETECTED = 9, + RESULT_ENCODING_CONVERSION_FAIL = 10, + RESULT_FIND_ONLINE_MASTERLIST_REVISION_FAIL = 11, + RESULT_FIND_ONLINE_MASTERLIST_DATE_FAIL = 12, + RESULT_READ_UPDATE_FILE_LIST_FAIL = 13, + RESULT_FILE_CRC_MISMATCH = 14, + RESULT_FS_FILE_MOD_TIME_READ_FAIL = 15, + RESULT_FS_FILE_MOD_TIME_WRITE_FAIL = 16, + RESULT_FS_FILE_RENAME_FAIL = 17, + RESULT_FS_FILE_DELETE_FAIL = 18, + RESULT_FS_CREATE_DIRECTORY_FAIL = 19, + RESULT_FS_ITER_DIRECTORY_FAIL = 20, + RESULT_CURL_INIT_FAIL = 21, + RESULT_CURL_SET_ERRBUFF_FAIL = 22, + RESULT_CURL_SET_OPTION_FAIL = 23, + RESULT_CURL_SET_PROXY_FAIL = 24, + RESULT_CURL_SET_PROXY_TYPE_FAIL = 25, + RESULT_CURL_SET_PROXY_AUTH_FAIL = 26, + RESULT_CURL_SET_PROXY_AUTH_TYPE_FAIL = 27, + RESULT_CURL_PERFORM_FAIL = 28, + RESULT_CURL_USER_CANCEL = 29, + RESULT_GUI_WINDOW_INIT_FAIL = 30, + RESULT_NO_UPDATE_NECESSARY = 31, + RESULT_LO_MISMATCH = 32, + RESULT_NO_MEM = 33, + RESULT_INVALID_ARGS = 34, + RESULT_NETWORK_FAIL = 35, + RESULT_NO_INTERNET_CONNECTION = 36, + RESULT_NO_TAG_MAP = 37, + RESULT_PLUGINS_FULL = 38, + RESULT_PLUGIN_BEFORE_MASTER = 39, + RESULT_INVALID_SYNTAX = 40 + }; + + enum GameIDs { + AUTODETECT = 0, + OBLIVION = 1, + SKYRIM = 3, + FALLOUT3 = 4, + FALLOUTNV = 5 + }; + }; + private: void syncLoadOrder(); @@ -230,6 +316,9 @@ private: void testMasters(); + void initBoss(); + void convertPluginListForBoss(boost::ptr_vector &inputPlugins, std::vector &activePlugins); + private: std::vector m_ESPs; @@ -253,6 +342,10 @@ private: SignalRefreshed m_Refreshed; + BossDLL *m_BOSS; + boss_db m_BOSSDB; + QTemporaryFile m_TempFile; + }; #endif // PLUGINLIST_H diff --git a/src/pluginlistsortproxy.cpp b/src/pluginlistsortproxy.cpp index 5bff24f5..8412fa27 100644 --- a/src/pluginlistsortproxy.cpp +++ b/src/pluginlistsortproxy.cpp @@ -125,11 +125,6 @@ bool PluginListSortProxy::lessThan(const QModelIndex &left, return plugins->getPriority(left.row()) < plugins->getPriority(right.row()); } break; default: { - static bool first = true; - if (first) { - qCritical("invalid sort column %d", left.column()); - first = false; - } return plugins->getPriority(left.row()) < plugins->getPriority(right.row()); } break; } diff --git a/src/profile.cpp b/src/profile.cpp index e075a4e6..c1f1025e 100644 --- a/src/profile.cpp +++ b/src/profile.cpp @@ -23,6 +23,7 @@ along with Mod Organizer. If not, see . #include "windows_error.h" #include "dummybsa.h" #include "modinfo.h" +#include "safewritefile.h" #include #include #include @@ -149,15 +150,10 @@ void Profile::writeModlistNow(bool onlyOnTimer) const #pragma message("right now, this is doing unnecessary saves. Need a flag that says that mod priority, enabled-state or name of a mod has changed") try { - QTemporaryFile file; - - if (!file.open()) { - reportError(tr("failed to open temporary file")); - return; - } + QString fileName = getModlistFileName(); + SafeWriteFile file(fileName); - file.resize(0); - file.write(QString("# This file was automatically generated by Mod Organizer.\r\n").toUtf8()); + file->write(QString("# This file was automatically generated by Mod Organizer.\r\n").toUtf8()); if (m_ModStatus.empty()) { return; } @@ -169,29 +165,17 @@ void Profile::writeModlistNow(bool onlyOnTimer) const ModInfo::Ptr modInfo = ModInfo::getByIndex(index); if (modInfo->getFixedPriority() == INT_MIN) { if (m_ModStatus[index].m_Enabled) { - file.write("+"); + file->write("+"); } else { - file.write("-"); + file->write("-"); } - file.write(modInfo->name().toUtf8()); - file.write("\r\n"); + file->write(modInfo->name().toUtf8()); + file->write("\r\n"); } } } - file.close(); - - - QString fileName = getModlistFileName(); - - if (QFile::exists(fileName)) { - shellDeleteQuiet(fileName); - } - - if (!file.copy(fileName)) { - reportError(tr("failed to open \"%1\" for writing").arg(fileName)); - return; - } + file.commit(); qDebug("%s saved", QDir::toNativeSeparators(fileName).toUtf8().constData()); } catch (const std::exception &e) { diff --git a/src/resources.qrc b/src/resources.qrc index 1582a3f2..73921f64 100644 --- a/src/resources.qrc +++ b/src/resources.qrc @@ -18,7 +18,7 @@ resources/contact-new.png resources/preferences-system.png resources/application-x-executable.png - resources/dialog-information.png + resources/dialog-information.png resources/emblem-readonly.png resources/go-next_16.png resources/go-previous_16.png diff --git a/src/safewritefile.cpp b/src/safewritefile.cpp new file mode 100644 index 00000000..6df8c2b8 --- /dev/null +++ b/src/safewritefile.cpp @@ -0,0 +1,48 @@ +/* +Copyright (C) 2014 Sebastian Herbord. All rights reserved. + +This file is part of Mod Organizer. + +Mod Organizer is free software: you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +Mod Organizer 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 Mod Organizer. If not, see . +*/ + + +#include "safewritefile.h" +#include + + +using namespace MOBase; + + +SafeWriteFile::SafeWriteFile(const QString &fileName) +: m_FileName(fileName) +{ + if (!m_TempFile.open()) { + throw MyException(QObject::tr("failed to open temporary file")); + } +} + + +QFile *SafeWriteFile::operator->() { + Q_ASSERT(m_TempFile.isOpen()); + return &m_TempFile; +} + + +void SafeWriteFile::commit() { + shellDeleteQuiet(m_FileName); + m_TempFile.rename(m_FileName); + m_TempFile.setAutoRemove(false); + m_TempFile.close(); +} diff --git a/src/safewritefile.h b/src/safewritefile.h new file mode 100644 index 00000000..56bd7744 --- /dev/null +++ b/src/safewritefile.h @@ -0,0 +1,51 @@ +/* +Copyright (C) 2014 Sebastian Herbord. All rights reserved. + +This file is part of Mod Organizer. + +Mod Organizer is free software: you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +Mod Organizer 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 Mod Organizer. If not, see . +*/ + + +#ifndef SAFEWRITEFILE_H +#define SAFEWRITEFILE_H + + +#include +#include +#include + +/** + * @brief a wrapper for QFile that ensures the file is only actually (over-)written if writing was successful + */ +class SafeWriteFile { +public: + SafeWriteFile(const QString &fileName); + + QFile *operator->(); + + void commit(); + +private: + QString m_FileName; + QTemporaryFile m_TempFile; +}; + + +#endif // SAFEWRITEFILE_H + + + + + -- cgit v1.3.1 From de984a4ef8b4720f73db5b80b018b358cbe12f8a Mon Sep 17 00:00:00 2001 From: Tannin Date: Thu, 23 Jan 2014 21:14:44 +0100 Subject: - information from boss no longer gets lost as soon as the plugin list gets refreshed - bugfix: modified boss dll missed one file on sorting --- src/lockeddialog.ui | 9 ++++++--- src/pluginlist.cpp | 43 +++++++++++++++++++++++++------------------ src/pluginlist.h | 5 +++++ 3 files changed, 36 insertions(+), 21 deletions(-) (limited to 'src/pluginlist.cpp') diff --git a/src/lockeddialog.ui b/src/lockeddialog.ui index 623e8da1..2175f8ac 100644 --- a/src/lockeddialog.ui +++ b/src/lockeddialog.ui @@ -6,14 +6,14 @@ 0 0 - 236 - 110 + 317 + 151
        Locked - + @@ -22,6 +22,9 @@ MO is locked while the executable is running. + + Qt::AlignCenter + true diff --git a/src/pluginlist.cpp b/src/pluginlist.cpp index c2e14182..e04b8bb0 100644 --- a/src/pluginlist.cpp +++ b/src/pluginlist.cpp @@ -699,7 +699,7 @@ void PluginList::convertPluginListForBoss(boost::ptr_vector &inputPlugi void PluginList::applyBOSSSorting(uint8_t **pluginList, size_t size, int &priority, bool recognized, const char *extension) { - for (size_t i= 0; i < size; ++i) { + for (size_t i = 0; i < size; ++i) { QString name = QString::fromUtf8(reinterpret_cast(pluginList[i])).toLower(); if (name.endsWith(extension)) { auto iter = m_ESPsByName.find(name); @@ -709,12 +709,13 @@ void PluginList::applyBOSSSorting(uint8_t **pluginList, size_t size, int &priori BossMessage *message; size_t numMessages = 0; m_BOSS->GetPluginMessages(m_BOSSDB, pluginList[i], &message, &numMessages); - m_ESPs[iter->second].m_BOSSMessages.clear(); + BossInfo newInfo; for (size_t im = 0; im < numMessages; ++im) { - m_ESPs[iter->second].m_BOSSMessages.append(QString::fromUtf8(reinterpret_cast(message[im].message))); + newInfo.m_BOSSMessages.append(QString::fromUtf8(reinterpret_cast(message[im].message))); } + newInfo.m_BOSSUnrecognized = !recognized; + m_BossInfo[name] = newInfo; m_ESPs[iter->second].m_Priority = priority++; - m_ESPs[iter->second].m_BOSSUnrecognized = !recognized; } } } @@ -735,7 +736,6 @@ void PluginList::bossSort() uint8_t **sortedPlugins; uint8_t **unrecognizedPlugins; size_t sizeSorted, sizeUnrecognized; - if (m_BOSS->SortCustomMods(m_BOSSDB, inputPlugins.c_array(), inputPlugins.size(), &sortedPlugins, &sizeSorted, @@ -917,12 +917,16 @@ QVariant PluginList::data(const QModelIndex &modelIndex, int role) const return QVariant(Qt::AlignHCenter | Qt::AlignVCenter); } } else if (role == Qt::ToolTipRole) { + QString name = m_ESPs[index].m_Name.toLower(); + auto bossInfoIter = m_BossInfo.find(name); QString toolTip; - if (!m_ESPs[index].m_BOSSMessages.isEmpty()) { - toolTip += m_ESPs[index].m_BOSSMessages.join("
        ") + "

        "; - } - if (m_ESPs[index].m_BOSSUnrecognized) { - toolTip += "Not recognized by BOSS
        "; + if (bossInfoIter != m_BossInfo.end()) { + if (!bossInfoIter->second.m_BOSSMessages.isEmpty()) { + toolTip += bossInfoIter->second.m_BOSSMessages.join("
        ") + "

        "; + } + if (bossInfoIter->second.m_BOSSUnrecognized) { + toolTip += "Not recognized by BOSS
        "; + } } if (m_ESPs[index].m_ForceEnabled) { toolTip += tr("This plugin can't be disabled (enforced by the game)"); @@ -948,17 +952,21 @@ QVariant PluginList::data(const QModelIndex &modelIndex, int role) const return toolTip; } else if (role == Qt::UserRole + 1) { QVariantList result; + QString nameLower = m_ESPs[index].m_Name.toLower(); if (m_ESPs[index].m_MasterUnset.size() > 0) { result.append(QIcon(":/MO/gui/warning")); } - if (m_LockedOrder.find(m_ESPs[index].m_Name.toLower()) != m_LockedOrder.end()) { + if (m_LockedOrder.find(nameLower) != m_LockedOrder.end()) { result.append(QIcon(":/MO/gui/locked")); } - if (!m_ESPs[index].m_BOSSMessages.isEmpty()) { - result.append(QIcon(":/MO/gui/information")); - } - if (m_ESPs[index].m_BOSSUnrecognized) { - result.append(QIcon(":/MO/gui/help")); + auto bossInfoIter = m_BossInfo.find(nameLower); + if (bossInfoIter != m_BossInfo.end()) { + if (!bossInfoIter->second.m_BOSSMessages.isEmpty()) { + result.append(QIcon(":/MO/gui/information")); + } + if (bossInfoIter->second.m_BOSSUnrecognized) { + result.append(QIcon(":/MO/gui/help")); + } } if (m_ESPs[index].m_HasIni) { result.append(QIcon(":/MO/gui/attachment")); @@ -1227,8 +1235,7 @@ PluginList::ESPInfo::ESPInfo(const QString &name, bool enabled, FILETIME time, const QString &originName, const QString &fullPath, bool hasIni) : m_Name(name), m_Enabled(enabled), m_ForceEnabled(enabled), m_Removed(false), - m_Priority(0), m_LoadOrder(-1), m_Time(time), m_OriginName(originName), m_HasIni(hasIni), - m_BOSSUnrecognized(false) + m_Priority(0), m_LoadOrder(-1), m_Time(time), m_OriginName(originName), m_HasIni(hasIni) { try { ESP::File file(ToWString(fullPath)); diff --git a/src/pluginlist.h b/src/pluginlist.h index bb7428d0..f8c69e11 100644 --- a/src/pluginlist.h +++ b/src/pluginlist.h @@ -214,6 +214,9 @@ private: bool m_HasIni; std::set m_Masters; mutable std::set m_MasterUnset; + }; + + struct BossInfo { QStringList m_BOSSMessages; bool m_BOSSUnrecognized; }; @@ -332,6 +335,8 @@ private: std::map m_ESPLoadOrder; std::map m_LockedOrder; + std::map m_BossInfo; // maps esp names to boss information + QString m_CurrentProfile; QFontMetrics m_FontMetrics; -- cgit v1.3.1 From 48704877ca1dc44b9215ec834e93f34fd953b2fb Mon Sep 17 00:00:00 2001 From: Tannin Date: Sun, 2 Feb 2014 00:09:03 +0100 Subject: - bugfix: upon moving files between mods, an attempt was made to access origins for both, even if one (or both) mods weren't active - bugfix: plugin-list should now deal with nested "layoutAboutToBeChanged" calls gracefully. May be the reason of a bug. --- src/mainwindow.cpp | 20 ++++++++++++-------- src/pluginlist.cpp | 17 +++++++++-------- src/pluginlist.h | 38 ++++++++++++++++++++++++++++++++++++-- 3 files changed, 57 insertions(+), 18 deletions(-) (limited to 'src/pluginlist.cpp') diff --git a/src/mainwindow.cpp b/src/mainwindow.cpp index cc7fbb09..88806cfd 100644 --- a/src/mainwindow.cpp +++ b/src/mainwindow.cpp @@ -2849,17 +2849,21 @@ void MainWindow::fileMoved(const QString &filePath, const QString &oldOriginName const FileEntry::Ptr filePtr = m_DirectoryStructure->findFile(ToWString(filePath)); if (filePtr.get() != NULL) { try { - FilesOrigin &oldOrigin = m_DirectoryStructure->getOriginByName(ToWString(oldOriginName)); - FilesOrigin &newOrigin = m_DirectoryStructure->getOriginByName(ToWString(newOriginName)); + if (m_DirectoryStructure->originExists(ToWString(newOriginName))) { + FilesOrigin &newOrigin = m_DirectoryStructure->getOriginByName(ToWString(newOriginName)); - QString fullNewPath = ToQString(newOrigin.getPath()) + "\\" + filePath; - WIN32_FIND_DATAW findData; - ::FindFirstFileW(ToWString(fullNewPath).c_str(), &findData); + QString fullNewPath = ToQString(newOrigin.getPath()) + "\\" + filePath; + WIN32_FIND_DATAW findData; + ::FindFirstFileW(ToWString(fullNewPath).c_str(), &findData); - filePtr->addOrigin(newOrigin.getID(), findData.ftCreationTime, L""); - filePtr->removeOrigin(oldOrigin.getID()); + filePtr->addOrigin(newOrigin.getID(), findData.ftCreationTime, L""); + } + if (m_DirectoryStructure->originExists(ToWString(oldOriginName))) { + FilesOrigin &oldOrigin = m_DirectoryStructure->getOriginByName(ToWString(oldOriginName)); + filePtr->removeOrigin(oldOrigin.getID()); + } } catch (const std::exception &e) { - reportError(tr("Failed to move \"%1\" from mod \"%2\" to \"%3\": %4").arg(filePath).arg(oldOriginName).arg(newOriginName).arg(e.what())); + reportError(tr("failed to move \"%1\" from mod \"%2\" to \"%3\": %4").arg(filePath).arg(oldOriginName).arg(newOriginName).arg(e.what())); } } else { // this is probably not an error, the specified path is likely a directory diff --git a/src/pluginlist.cpp b/src/pluginlist.cpp index e04b8bb0..f5e0f1eb 100644 --- a/src/pluginlist.cpp +++ b/src/pluginlist.cpp @@ -132,7 +132,8 @@ void PluginList::refresh(const QString &profileName, const DirectoryEntry &baseD const QString &pluginsFile, const QString &loadOrderFile, const QString &lockedOrderFile) { - emit layoutAboutToBeChanged(); + ChangeBracket layoutChange(this); + m_ESPsByName.clear(); m_ESPsByPriority.clear(); m_ESPs.clear(); @@ -213,7 +214,8 @@ void PluginList::refresh(const QString &profileName, const DirectoryEntry &baseD readLockedOrderFrom(lockedOrderFile); - emit layoutChanged(); + layoutChange.finish(); + refreshLoadOrder(); emit dataChanged(this->index(0, 0), this->index(m_ESPs.size(), columnCount())); @@ -557,7 +559,7 @@ void PluginList::syncLoadOrder() void PluginList::refreshLoadOrder() { - emit layoutAboutToBeChanged(); + ChangeBracket layoutChange(this); syncLoadOrder(); // set priorities according to locked load order std::map lockedLoadOrder; @@ -593,7 +595,6 @@ void PluginList::refreshLoadOrder() } } } - emit layoutChanged(); } @@ -748,7 +749,7 @@ void PluginList::bossSort() qDebug("%d sorted, %d unrecognized", sizeSorted, sizeUnrecognized); - emit layoutAboutToBeChanged(); + ChangeBracket layoutChange(this); int priority = 0; applyBOSSSorting(sortedPlugins, sizeSorted, priority, true, "esm"); @@ -758,7 +759,7 @@ void PluginList::bossSort() // inform view of the changed data updateIndices(); - emit layoutChanged(); + layoutChange.finish(); syncLoadOrder(); emit dataChanged(this->index(0, 0), this->index(m_ESPs.size(), columnCount())); @@ -1089,7 +1090,7 @@ void PluginList::setPluginPriority(int row, int &newPriority) void PluginList::changePluginPriority(std::vector rows, int newPriority) { - emit layoutAboutToBeChanged(); + ChangeBracket layoutChange(this); // sort rows to insert by their old priority (ascending) and insert them move them in that order const std::vector &esp = m_ESPs; std::sort(rows.begin(), rows.end(), @@ -1111,7 +1112,7 @@ void PluginList::changePluginPriority(std::vector rows, int newPriority) setPluginPriority(*iter, newPriority); } - emit layoutChanged(); + layoutChange.finish(); refreshLoadOrder(); startSaveTime(); diff --git a/src/pluginlist.h b/src/pluginlist.h index f8c69e11..95f90e09 100644 --- a/src/pluginlist.h +++ b/src/pluginlist.h @@ -33,13 +33,46 @@ along with Mod Organizer. If not, see . #include + +template +class ChangeBracket { +public: + ChangeBracket(C *model) + : m_Model(nullptr) + { + QVariant var = model->property("__aboutToChange"); + bool aboutToChange = var.isValid() && var.toBool(); + if (!aboutToChange) { + model->layoutAboutToBeChanged(); + model->setProperty("__aboutToChange", true); + m_Model = model; + } + } + ~ChangeBracket() { + finish(); + } + + void finish() { + if (m_Model != nullptr) { + m_Model->layoutChanged(); + m_Model->setProperty("__aboutToChange", false); + m_Model = nullptr; + } + } + +private: + C *m_Model; +}; + + + /** * @brief model representing the plugins (.esp/.esm) in the current virtual data folder **/ class PluginList : public QAbstractTableModel, public MOBase::IPluginList { Q_OBJECT - + friend class ChangeBracket; public: enum EColumn { @@ -225,7 +258,6 @@ private: friend bool ByDate(const ESPInfo& LHS, const ESPInfo& RHS); friend bool ByPriority(const ESPInfo& LHS, const ESPInfo& RHS); - class BossDLL : public PDLL { DECLARE_CLASS(BossDLL) @@ -353,4 +385,6 @@ private: }; + + #endif // PLUGINLIST_H -- cgit v1.3.1 From 7aadb476376db1d23ad333abb439639552bb6e19 Mon Sep 17 00:00:00 2001 From: Tannin Date: Fri, 7 Feb 2014 21:05:48 +0100 Subject: - archives.txt is now written using the "safe"-write mechanism - added the whole boss fork to the repository - bugfix: boss db is now always re-initialised because otherwise there might have been differing results between runs - bugfix: locked load order was ignored by integrated boss - bugfix: archive list wasn't written back on all changes that affected it - bugfix: CreateFile-hook didn't reroute files created with OPEN_ALWAYS to overwrite directory - bugfix: NtQueryDirectoryFile-hook didn't return the correct status code when searching for a file that doesn't exist --- src/mainwindow.cpp | 35 +- src/organizer_cs.ts | 1428 ++++++++++++++++++++++++++--------------------- src/organizer_de.ts | 1428 ++++++++++++++++++++++++++--------------------- src/organizer_es.ts | 1432 ++++++++++++++++++++++++++--------------------- src/organizer_fr.ts | 1426 ++++++++++++++++++++++++++--------------------- src/organizer_ru.ts | 1436 +++++++++++++++++++++++++++--------------------- src/organizer_tr.ts | 1432 ++++++++++++++++++++++++++--------------------- src/organizer_zh_CN.ts | 1428 ++++++++++++++++++++++++++--------------------- src/organizer_zh_TW.ts | 1428 ++++++++++++++++++++++++++--------------------- src/pluginlist.cpp | 136 +++-- src/pluginlist.h | 7 +- src/version.rc | 4 +- 12 files changed, 6512 insertions(+), 5108 deletions(-) (limited to 'src/pluginlist.cpp') diff --git a/src/mainwindow.cpp b/src/mainwindow.cpp index b6a744aa..d83d4d06 100644 --- a/src/mainwindow.cpp +++ b/src/mainwindow.cpp @@ -58,6 +58,7 @@ along with Mod Organizer. If not, see . #include "problemsdialog.h" #include "previewdialog.h" #include "aboutdialog.h" +#include "safewritefile.h" #include #include #include @@ -623,22 +624,18 @@ void MainWindow::createHelpWidget() void MainWindow::saveArchiveList() { if (m_ArchivesInit) { - QFile archiveFile(m_CurrentProfile->getArchivesFileName()); - if (archiveFile.open(QIODevice::WriteOnly | QIODevice::Truncate)) { - for (int i = 0; i < ui->bsaList->topLevelItemCount(); ++i) { - QTreeWidgetItem *tlItem = ui->bsaList->topLevelItem(i); - for (int j = 0; j < tlItem->childCount(); ++j) { - QTreeWidgetItem *item = tlItem->child(j); - if (item->checkState(0) == Qt::Checked) { - archiveFile.write(item->text(0).toUtf8().append("\r\n")); - } + SafeWriteFile archiveFile(m_CurrentProfile->getArchivesFileName()); + for (int i = 0; i < ui->bsaList->topLevelItemCount(); ++i) { + QTreeWidgetItem *tlItem = ui->bsaList->topLevelItem(i); + for (int j = 0; j < tlItem->childCount(); ++j) { + QTreeWidgetItem *item = tlItem->child(j); + if (item->checkState(0) == Qt::Checked) { + archiveFile->write(item->text(0).toUtf8().append("\r\n")); } } - } else { - reportError(tr("failed to save archives order, do you have write access " - "to \"%1\"?").arg(m_CurrentProfile->getArchivesFileName())); } - archiveFile.close(); + archiveFile.commit(); + qDebug("%s saved", qPrintable(QDir::toNativeSeparators(m_CurrentProfile->getArchivesFileName()))); } else { qWarning("archive list not initialised"); } @@ -701,18 +698,13 @@ bool MainWindow::saveCurrentLists() return false; } - // save plugin list try { savePluginList(); + saveArchiveList(); } catch (const std::exception &e) { reportError(tr("failed to save load order: %1").arg(e.what())); } - // save only if the file doesn't exist at all, changes made in the ui are saved immediately - if (!QFile::exists(m_CurrentProfile->getArchivesFileName())) { - saveArchiveList(); - } - return true; } @@ -2709,6 +2701,8 @@ void MainWindow::modorder_changed() m_DirectoryStructure->getOriginByName(ToWString(modInfo->name())).setPriority(priority); } } + refreshBSAList(); + saveArchiveList(); m_DirectoryStructure->getFileRegister()->sortOrigins(); } @@ -3003,8 +2997,9 @@ void MainWindow::modlistChanged(const QModelIndex &index, int role) MessageDialog::showMessage(tr("Multiple esps activated, please check that they don't conflict."), this); } m_PluginList.refreshLoadOrder(); - // immediately save plugin list + // immediately save affected lists savePluginList(); + saveArchiveList(); } } } diff --git a/src/organizer_cs.ts b/src/organizer_cs.ts index f78313bd..08f8d70e 100644 --- a/src/organizer_cs.ts +++ b/src/organizer_cs.ts @@ -1,6 +1,50 @@ + + AboutDialog + + + + About + + + + + Revision: + + + + + Used Software + + + + + Credits + + + + + Translators + + + + + Others + + + + + Close + + + + + No license + + + ActivateModsDialog @@ -239,25 +283,30 @@ p, li { white-space: pre-wrap; } DownloadList - + Name Jméno - + Filetime ÄŒas stáhnutí - + Done Hotovo - + Information missing, please select "Query Info" from the context menu to re-retrieve. Info chybí, oznaÄte "Získat Info" z kontextového menu pro pokus naÄtení z Nexusu. + + + pending download + + DownloadListWidget @@ -310,125 +359,135 @@ p, li { white-space: pre-wrap; } DownloadListWidgetCompactDelegate - + Installed Nainstalované - + Uninstalled - + Done Hotovo - - - - + + + + Are you sure? Jsi si jistý? - + This will remove all finished downloads from this list and from disk. Tímto vymažeÅ¡ vÅ¡echny dokonÄené stáhnutí se seznamu i z disku. - + This will remove all installed downloads from this list and from disk. Tímto vymažeÅ¡ jenom nainstalované stáhnutí se seznamu i z disku. - + This will permanently remove all finished downloads from this list (but NOT from disk). - + This will permanently remove all installed downloads from this list (but NOT from disk). - + Install Instaluj - + Query Info Získej Info - + Delete - + Un-Hide Odekrýt - + Remove from View - + Remove Odstranit - + Cancel ZruÅ¡it - + + < mod %1 file %2 > + + + + + Pending + + + + Paused - + Fetching Info 1 - + Fetching Info 2 - + Pause Pauza - + Resume PokraÄuj - + Delete Installed... - + Delete All... - + Remove Installed... Odstraň už nainstalované... - + Remove All... Odstraň vÅ¡echny... @@ -436,68 +495,78 @@ p, li { white-space: pre-wrap; } DownloadListWidgetDelegate - - - - + + + + Are you sure? Jsi si jistý? - + This will remove all finished downloads from this list and from disk. Tímto vymažeÅ¡ vÅ¡echny dokonÄené stáhnutí se seznamu i z disku. - + This will remove all installed downloads from this list and from disk. Tímto vymažeÅ¡ jenom nainstalované stáhnutí se seznamu i z disku. - + This will remove all finished downloads from this list (but NOT from disk). - + This will remove all installed downloads from this list (but NOT from disk). - + Install Instaluj - + Query Info Získej Info - + Delete - + Un-Hide Odekrýt - + Remove from View - + Remove OdstraniÅ¥ - + Cancel ZruÅ¡it + + + < mod %1 file %2 > + + + + + Pending + + Fetching Info 1 @@ -509,32 +578,32 @@ p, li { white-space: pre-wrap; } - + Pause Pauza - + Resume PokraÄuj - + Delete Installed... - + Delete All... - + Remove Installed... Odstranit už nainstalované... - + Remove All... Odstranit vÅ¡echny... @@ -547,75 +616,76 @@ p, li { white-space: pre-wrap; } NezdaÅ™ilo se pÅ™ejmenovat "%1" na "%2" - + Download again? Stáhnout znovu? - + A file with the same name has already been downloaded. Do you want to download it again? The new file will receive a different name. Soubor se stejným jménem už byl stáhnutý. Chcete ho stáhnout znovu? Nový soubor bude pojmenován jinak. - + failed to download %1: could not open output file: %2 Stahování zlyhalo %1: nemožno otevřít výslední soubor: %2 - + Wrong Game - + The download link is for a mod for "%1" but this instance of MO has been set up for "%2". - - - - - - - - - - - - - - + + + + + + + + + + + + + + + invalid index neplatný index - + failed to delete %1 odstránÄ›ní zlyhalo %1 - + failed to delete meta file for %1 odstránÄ›ní meta souboru zlyhalo pro %1 - - - - - - + + + + + + invalid index %1 neplatný index %1 - + Please enter the nexus mod id Prosím zadej Nexus mod ID - + Mod ID: Mod ID: @@ -624,38 +694,43 @@ p, li { white-space: pre-wrap; } neplatný alfabetický index %1 - + Information updated Info aktualizované - - + + No matching file found on Nexus! Maybe this file is no longer available or it was renamed? Žádný pÅ™islouchající soubor nenalezen na Nexusu! Možná už není k dispozici nebo byl pÅ™ejmenovaný? - + No file on Nexus matches the selected file by name. Please manually choose the correct one. Žádný soubor na Nexusu nezodpovedá pÅ™esnému jménu. Zvolte ruÄne ten správný. - + No download server available. Please try again later. - + Failed to request file info from nexus: %1 Zlyhalo získání info z Nexusu %1 - + + Download failed. Server reported: %1 + + + + Download failed: %1 (%2) Stahování zlyhalo: %1 (%2) - + failed to re-open %1 zlyhalo znovu-otevÅ™ení %1 @@ -765,7 +840,7 @@ Každá hra/aplikace distribuovaná skrz Steammá unikátní ID. MO potÅ™ebuje v - + If checked, MO will be closed once the specified executable is run. Pokud je zaÅ¡krtnuté, MO se ukonÄí hned po spuÅ¡tÄ›ní SpouÅ¡tÄ›Äe. @@ -782,7 +857,7 @@ Každá hra/aplikace distribuovaná skrz Steammá unikátní ID. MO potÅ™ebuje v - + Add PÅ™idat @@ -798,47 +873,64 @@ Každá hra/aplikace distribuovaná skrz Steammá unikátní ID. MO potÅ™ebuje v Odstranit - + + Close + + + + Select a binary Vyber binární soubor - + Executable (%1) SpuÅ¡tÄ›ní (%1) - + Java (32-bit) required - + MO requires 32-bit java to run this application. If you already have it installed, select javaw.exe from that installation as the binary. - + Select a directory Vyber Zložku - + Confirm Potvrdit - + Really remove "%1" from executables? Opravdu odstranit "%1" ze seznamu SpouÅ¡tÄ›ní? - + Modify Ulož - + + + Save Changes? + + + + + + You made changes to the current executable, do you want to save them? + + + + MO must be kept running or this application will not work correctly. MO musí bežet, aby tahle aplikace pracovala správnÄ›. @@ -1296,7 +1388,7 @@ Poznámka: Instalátor nerozpoznává už nainstalované mody! MO je uzamÄený pokud aplikace/hra běží. - + Unlock Odemkni @@ -1304,7 +1396,7 @@ Poznámka: Instalátor nerozpoznává už nainstalované mody! LogBuffer - + failed to write log to %1: %2 nezdaÅ™il se zápis do logu %1: %2 @@ -1325,23 +1417,23 @@ Poznámka: Instalátor nerozpoznává už nainstalované mody! MainWindow - - + + Categories Kategorie - + Profile Profil - + Pick a module collection Vyber kolekci modulů - + <!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; } @@ -1356,44 +1448,44 @@ p, li { white-space: pre-wrap; } <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt;">Prosím mÄ›jte na pamÄ›ti, že v souÄasnosti poradí esp se neukladá pro různé profily.</span></p></body></html> - + Refresh list ZnovunaÄíst seznam - + Refresh list. This is usually not necessary unless you modified data outside the program. Obnoví seznam. Tohle obvykle není zapotÅ™ebí, jedine že by jste mÄ›nili obsah dat mimo program MO. - + List of available mods. - + This is a list of installed mods. Use the checkboxes to activate/deactivate mods and drag & drop mods to change their "installation" orders. - + Filter Filter - + No groups - + Nexus IDs Nexus ID - - - + + + Namefilter @@ -1402,12 +1494,12 @@ p, li { white-space: pre-wrap; } Start - + Pick a program to run. Vyber program na spuÅ¡tÄ›ní. - + <!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; } @@ -1422,12 +1514,12 @@ p, li { white-space: pre-wrap; } <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt;">MůžeÅ¡ pÅ™idávat různé nástroje, ale neruÄím, že ty které jsem netestoval poběží správnÄ›.</span></p></body></html> - + Run program Spustit program - + <!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; } @@ -1440,17 +1532,17 @@ p, li { white-space: pre-wrap; } <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt;">Spusti vybraný program s nastavením ModOrganizeru.</span></p></body></html> - + Run Spustit - + Create a shortcut in your start menu or on the desktop to the specified program - + <!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; } @@ -1463,7 +1555,7 @@ p, li { white-space: pre-wrap; } <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt;">Tohle vytvoří odkaz v menu Start, který přímo bude spouÅ¡tÄ›t zvolený program pÅ™es MO.</span></p></body></html> - + Shortcut @@ -1488,12 +1580,12 @@ p, li { white-space: pre-wrap; } Uložit - + List of available esp/esm files Seznam dostupných esp/esm souborů - + <!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; } @@ -1510,12 +1602,12 @@ p, li { white-space: pre-wrap; } DÅ®LEŽITÉ: Můžete mÄ›nit poÅ™adí BSA souborů tady, ale soubory modů ako takých má vyšší prioritu a pÅ™epíše konflikty, které by vznikly zde! - + List of available BS Archives. Archives not checked here are not managed by MO and ignore installation order. Seznam BS archivů, které jsou k dispozici. Archivy, které jsou zde neni oznaÄeny nebudou naÄteny do hry. - + BSA files are archives (comparable to .zip files) that contain data assets (meshes, textures, ...) to be used by the game. As such they "compete" with loose files in your data directory over which is loaded. By default, BSAs that share their base name with an enabled ESP (i.e. plugin.esp and plugin.bsa) are automatically loaded and will have precedence over all loose files, the installation order you set up to the left is then ignored! @@ -1526,66 +1618,71 @@ By default, BSAs that share their base name with an enabled ESP (i.e. plugin.esp BSAs checked here are loaded in such a way that your installation order is obeyed properly. - - + + File Soubor - + <html><head/><body><p>Marked Archives (<img src=":/MO/gui/warning_16"/>) are still loaded on Skyrim but the <a href="http://forums.bethsoft.com/topic/1354395-update-bsas-and-you/"><span style=" text-decoration: underline; color:#0000ff;">regular file override</span></a> mechanism will apply: Loose files override BSAs, no matter the mod/plugin priority.</p></body></html> - + Mod Mod - + Data Data - + + Sort + + + + refresh data-directory overview znovunaÄti data - + Refresh the overview. This may take a moment. Obnov náhled. Tohle může chvíli trvat. - - - + + + Refresh ZnovunaÄíst - + This is an overview of your data directory as visible to the game (and tools). Tohle je náhled tvé data struktury, kterou naÄte hra (i nástroje). - - + + Filter the above list so that only conflicts are displayed. PÅ™efiltruje seznam nahoÅ™e tak, že budou zobrazeny pouze konflikty. - + Show only conflicts Ukaž jenom konflikty - + Saves Uložené pozice - + <!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; } @@ -1602,160 +1699,160 @@ p, li { white-space: pre-wrap; } <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt;">Pokud kliknete &quot;Fixni Mody...&quot; v kontext menu, MO se pokusí aktivovat vÅ¡echny mody a esp soubory, které byli v pozici používány. Nic se vÅ¡ak nevypne!</span></p></body></html> - + Downloads Stáhnuté - + This is a list of mods you downloaded from Nexus. Double click one to install it. Tohle je seznam modů, které jsi stánul z Nexusu. Dvojklik nainstaluje mod. - + Compact Kompaktní - + Show Hidden - + Tool Bar Panel nástrojú - + Install Mod Instaluj mod - + Install &Mod Instaluj &Mod - + Install a new mod from an archive Instaluj nový mod z archívu - + Ctrl+M Ctrl+M - + Profiles Profily - + &Profiles &Profily - + Configure Profiles Nastav profily - + Ctrl+P Ctrl+P - + Executables SpouÅ¡tÄ›ní - + &Executables &SpouÅ¡tÄ›ní - + Configure the executables that can be started through Mod Organizer Konfigurace spouÅ¡tÄ›ní, které lze použít pro naÄtení modů z MO - + Ctrl+E Ctrl+E - - + + Tools - + &Tools - + Ctrl+I Ctrl+I - + Settings Nastavení - + &Settings &Nastavení - + Configure settings and workarounds Konfigurace a nastavení programu a různých Å™eÅ¡ení - + Ctrl+S Ctrl+S - + Nexus Nexus - + Search nexus network for more mods Prohledat mody na nexusu - + Ctrl+N Ctrl+N - - + + Update - + Mod Organizer is up-to-date Verze Mod Organizer u je aktuální - - + + No Problems Žádné problémy - + This button will be highlighted if MO discovered potential problems in your setup and provide tips on how to fix them. !Work in progress! @@ -1766,54 +1863,54 @@ Right now this has very limited functionality V souÄasnosti má omezenou funkcionalitu - - + + Help Pomoc - + Ctrl+H - + Endorse MO - - + + Endorse Mod Organizer - + Toolbar - + Desktop - + Start Menu - + Problems Problémy - + There are potential problems with your setup Existují potenciální problémy s programem - + Everything seems to be in order VÅ¡echno se jeví v pořádku @@ -1830,22 +1927,22 @@ V souÄasnosti má omezenou funkcionalitu <li>dotNet není nainstalován nebo je neaktuální. Tohle vyžaduje NCC. NajdÄ›te ho zde: <a href="%1">%1</a></li> - + Help on UI Pomoc s programem - + Documentation Wiki Dokumentace wiki - + Report Issue Nahlásit chybu - + Tutorials @@ -1854,425 +1951,426 @@ V souÄasnosti má omezenou funkcionalitu poÅ™adí naÄtení se nezdaÅ™ilo uložit - + failed to save load order: %1 zlyhalo uložení poÅ™adí naÄtení: %1 - + failed to save archives order, do you have write access to "%1"? zlyhal zápis poÅ™adí archivů, máte administrátorsky povoleno zapisovat na "%1"? - + + About + + + + + About Qt + + + + Name Jméno - + Please enter a name for the new profile Prosím zadej jméno pro nový profil - + failed to create profile: %1 Zlyhalo vytvoÅ™ení profilu: %1 - + Show tutorial? - + You are starting Mod Organizer for the first time. Do you want to show a tutorial of its basic features? If you choose no you can always start the tutorial from the "Help"-menu. - + Downloads in progress Probíhá stahování - + There are still downloads in progress, do you really want to quit? Pořád probíhá stahování, urÄitÄ› chcete skonÄit (zruší stahování)? - + failed to read savegame: %1 nezdaÅ™ilo se naÄíst pozici: %1 - + Plugin "%1" failed: %2 - + Plugin error - + It appears the plugin "%1" failed to load last startup and caused MO to crash. Do you want to disable it? (Please note: If this is the first time you see this message for this plugin you may want to give it another try. The plugin may be able to recover from the problem) - + Failed to start "%1" Zlyhal start "%1" - + Waiting ÄŒekání - + Please press OK once you're logged into steam. Stiskni OK až budeÅ¡ pÅ™ihlášen do Steamu. - "%1" not found - "%1" nenalezeno + "%1" nenalezeno - + Start Steam? Spustit Steam? - + Steam is required to be running already to correctly start the game. Should MO try to start steam now? Steam by mÄ›l běžet aby se podaÅ™ilo spustit hru. Má se MO pokusit spustit steam teÄ? - + Also in: <br> Také v: <br> - + No conflict Žádné konflikty - + <Edit...> <Edit...> - - Failed to refresh list of esps: %s - - - - + This bsa is enabled in the ini file so it may be required! Tenhle BSA soubor je aktivován v ini souboru, tak zÅ™ejmÄ› je vyžadován! - + This archive will still be loaded since there is a plugin of the same name but its files will not follow installation order! Tento archív se stejnÄ› naÄte, protože existuje plugin se stejným jménem ale jeho soubory nebudou zodpovídat poÅ™adí nainstalování! - + Activating Network Proxy - - + + Installation successful Instalace úspěšná - - + + Configure Mod Konfigurace Modu - - + + This mod contains ini tweaks. Do you want to configure them now? Tenhle mod obsahuje ini úpravy. Chcete je nastavovat teÄ? - - + + mod "%1" not found mod "%1" nenalezen - - + + Installation cancelled Instalace zruÅ¡ena - - + + The mod was not installed completely. Tento mod se nenainstaloval úplne. - + Some plugins could not be loaded - + Too many esps and esms enabled - - + + Description missing - + The game doesn't allow more than 255 active plugins (including the official ones) to be loaded. You have to disable some unused plugins or merge some plugins into one. You can find a guide here: <a href="http://wiki.step-project.com/Guide:Merging_Plugins">http://wiki.step-project.com/Guide:Merging_Plugins</a> - + Choose Mod Vyber Mod - + Mod Archive Archív Modu - + Start Tutorial? - + You're about to start a tutorial. For technical reasons it's not possible to end the tutorial early. Continue? - - + + Download started Stahování zaÄalo - + failed to update mod list: %1 nezdaÅ™ilo se aktualizovat seznam modů: %1 - + failed to spawn notepad.exe: %1 zlyhalo otevÅ™ení notepad.exe: %1 - + failed to open %1 - + failed to change origin name: %1 NezdaÅ™ilo se zmÄ›nit původní jméno: %1 - + Multiple esps activated, please check that they don't conflict. - - + + Create Mod... - + A mod with this name already exists - + Continue? - + The versioning scheme decides which version is considered newer than another. This function will guess the versioning scheme under the assumption that the installed version is outdated. - + + Sorry - + I don't know a versioning scheme where %1 is newer than %2. - + <All> <VÅ¡echny> - + <Checked> <Aktivované> - + Plugin "%1" failed - + failed to init plugin %1: %2 - + The following plugins could not be loaded. The reason may be missing dependencies (i.e. python) or an outdated version: - - Failed to move "%1" from mod "%2" to "%3": %4 - - - - + <Unchecked> <Neaktivované> - + <Update> <Aktualizace> - + <No category> <Bez kategorie> - + <Conflicted> - + <Not Endorsed> - + failed to rename mod: %1 NezdaÅ™ilo se pÅ™ejmenovat mod: %1 - + Overwrite? - + This will replace the existing mod "%1". Continue? - + failed to remove mod "%1" - - - + + + failed to rename "%1" to "%2" NezdaÅ™ilo se pÅ™ejmenovat "%1" na "%2" - - - + + + + Confirm Potvrdit - + Remove the following mods?<br><ul>%1</ul> - + failed to remove mod: %1 NezdaÅ™ilo se odstranit mod: %1 - - + + Failed Zlyhání - + Installation file no longer exists InstalaÄní soubor již neexistuje - + Mods installed with old versions of MO can't be reinstalled in this way. Mody nainstalovány staršími verzemi MO nemůžou být pÅ™einstalovány tímto spůsobem. - - + + You need to be logged in with Nexus to endorse - - + + Extract BSA Extrakce BSA - + This mod contains at least one BSA. Do you want to unpack it? (This removes the BSA after completion. If you don't know about BSAs, just select no) Tento mod obsahuje alespoň jeden BSA soubor. Chcete rozpakovat i jeho obsah? (BSA se po úspěšném rozpakování odstrání. Pokud nevíte, co je BSA, zvolte možnost Ne) - - - + + + failed to read %1: %2 - - + + This archive contains invalid hashes. Some files may be broken. Tento archiv má neplatné identifikaÄní souÄty. Nekteré soubory mohou být poÅ¡kozeny. - + Nexus ID for this Mod is unknown Nexus ID pro tento Mod není známo @@ -2285,92 +2383,92 @@ This function will guess the versioning scheme under the assumption that the ins Zvol Prioritu - + Really enable all visible mods? Opravdu aktivovat vÅ¡echny zobrazené mody? - + Really disable all visible mods? Opravdu deaktivovat vÅ¡echny zobrazené mody? - + Choose what to export - + Everything - + All installed mods are included in the list - + Active Mods - + Only active (checked) mods from your current profile are included - + Visible - + All mods visible in the mod list are included - + export failed: %1 - + Install Mod... Instaluj Mod... - + Enable all visible Aktivuj vÅ¡echny v seznamu - + Disable all visible Deaktivuj vÅ¡echny v seznamu - + Check all for update Skontroluj vÅ¡echny pro aktualizaci - + Export to csv... - + Sync to Mods... Synchronizuj s Mody... - + Restore Backup - + Remove Backup... @@ -2379,312 +2477,362 @@ This function will guess the versioning scheme under the assumption that the ins OznaÄ Kategorii - + Primary Category - + Change versioning scheme - + Un-ignore update - + Ignore update - + Rename Mod... PÅ™ejmenuj Mod... - + Remove Mod... Odstranit Mod... - + Reinstall Mod PÅ™einstaluj Mod - + Un-Endorse - - + + Endorse - + Won't endorse - + Endorsement state unknown - + Ignore missing data - + Visit on Nexus NavÅ¡tiv na Nexusu - + Open in explorer OtevÅ™i v prohlížeÄi - + Information... Informace... - - + + Exception: Výnimky: - - + + Unknown exception Neznámá výnimka - + <Multiple> - + + Really delete "%1"? + + + + Fix Mods... Oprav Mody... - - + + Delete + + + + + failed to remove %1 - - + + failed to create %1 - + Can't change download directory while downloads are in progress! Není možné zmÄ›nit cíl pro stahování když probíhá stahování! - + Download failed Stahování zlyhalo - + failed to write to file %1 NezdaÅ™il se zápis do souboru %1 - + %1 written %1 zapsáno - + Select binary Vyber binární soubor - + Binary Soubor - + Enter Name Zadej jméno - + Please enter a name for the executable Prosím zadej jméno pro spouÅ¡tÄ›ní - + Not an executable Není spustitelný - + This is not a recognized executable. Tenhle soubor není rozpoznán jako spustitelný. - - + + Replace file? Nahradit soubor? - + There already is a hidden version of this file. Replace it? Už existuje skrytá verze tohto souboru. Nahradit? - - + + File operation failed Operace se souborem zlyhala - - + + Failed to remove "%1". Maybe you lack the required file permissions? NepodaÅ™ilo se odstranit "%1". Možná nejsou k dispozici požadována práva? - + There already is a visible version of this file. Replace it? Už existuje viditelná verze tohto souboru. Nahradit? - + + file not found: %1 + soubor nenalezen: %1 + + + + failed to generate preview for %1 + + + + + Sorry, can't preview anything. This function currently does not support extracting from bsas. + + + + Update available Aktualizace k dispozici - + Open/Execute Otevřít/Spustit - + Add as Executable PÅ™idat SpouÅ¡tení - + + Preview + + + + Un-Hide Odekrýt - + Hide Skrýt - + Write To File... Zápis do souboru... - + Do you want to endorse Mod Organizer on %1 now? - + Remove - + Unlock load order - + Lock load order - + + BOSS working + + + + + failed to run boss: %1 + + + + Request to Nexus failed: %1 - + + Executable "%1" not found + + + + + Failed to refresh list of esps: %1 + + + + This will move all files from overwrite into a new, regular mod. Please enter a name: - + Add/Remove Categories - + Replace Categories - - + + login successful - + login failed: %1. Trying to download anyway pÅ™ihlášení zlyhalo: %1. Pokouším se beztak stahovat - + login failed: %1 pÅ™ihlášení zlyhalo: %1 - + login failed: %1. You need to log-in with Nexus to update MO. pÅ™ihlášení zlyhalo: %1. Na aktualizaci MO je potÅ™ebné pÅ™ihlášení k Nexusu. - + Error Chyba - + failed to extract %1 (errorcode %2) zlyhala extrakce %1 (errorcode %2) - + Extract... Extrakce... - + Edit Categories... Editovat Kategorie... - + Enable all - + Disable all @@ -2731,58 +2879,58 @@ Please enter a name: Informace o modu - + Textfiles Textové soubory - + A list of text-files in the mod directory. Seznam textových souborů obsažených v modu. - + A list of text-files in the mod directory like readmes. Seznam textových souborů obsažených v modu, například readme. - - + + Save Uložit - + INI-Files INI soubory - + This is a list of .ini files in the mod. Tohle je seznam .ini souborů v modu. - + This is a list of .ini files in the mod. These are usually used to configure the behaviour of mods if there are configurable parameters. Tohle je seznam .ini souborů v modu. Dají se upravovat pro zmenu konfigurace a chování modu, pokud umožňuje takové parametry. - + Save changes to the file. Uložit zmÄ›ny do souboru. - + Save changes to the file. This overwrites the original. There is no automatic backup! Uložit zmÄ›ny do souboru.Tohle pÅ™epíše původní soubor. Nevytváří se žádná automatická záloha! - + Images Obrázky - + Images located in the mod. Obrázky obsažené v modu. @@ -2799,13 +2947,13 @@ p, li { white-space: pre-wrap; } <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt;">Tohle je seznam vÅ¡ech obrázků (.jpg a.png) obsažených v modu, jako naříklad screenshoty. Kliknutím na jeden ho zvÄ›tšíš.</span></p></body></html> - - + + Optional ESPs Volitelné ESP - + List of esps and esms that can not be loaded by the game. Seznam souborů .esp a .esm, které nebudou naÄteni do hry. @@ -2828,12 +2976,12 @@ p, li { white-space: pre-wrap; } <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt;">VÄ›tÅ¡ina modů nemá volitelné esp, tak s nejvyšší pravdÄ›podobností býva tenhle seznam prázdný.</span></p></body></html> - + This lists all the images (.jpg and .png) in the mod directory, like screenshots and such. Click one to get a larger view. - + List of esps and esms contained in this plugin that currently can not be loaded by the game. They will not even appear in the esp-list in the main MO-window. They usually contain optional functionality, see the readme. @@ -2841,103 +2989,103 @@ Most mods do not have optional esps, so chances are good you are looking at an e - + Make the selected mod in the lower list unavailable. Znepřístupni oznaÄený mod v seznamu dolů. - + The selected esp (in the lower list) will be pushed into a subdirectory of the mod and will thus become "invisible" to the game. It can then no longer be activated. OznaÄený soubor esp (v seznamu dolů) bude pÅ™emístÄ›n do podadresáře modu a tak se stane "neviditelným" pro hru. V takovem stavu se nedá aktivovat. - + Move a file to the data directory. PÅ™esuň soubor mezi Data. - + This moves a esp to the esp directory so it can be enabled in the main window. Please note that the ESP merely becomes "available", it will not necessarily be loaded! That is configured in the main window of omo. PÅ™esune soubor esp do adresáře, kde má být, aby mohl být aktivován. Prosím berte na vÄ›domí, že tato akce jenom soubor "zpÅ™istupní", nedÄ›lá ho automaticky aktivním. To se pak aktivuje v hlavním oknu mezi esp. - + ESPs in the data directory and thus visible to the game. ESP soubory mezi Data a tedy přístupné pro hru. - + These are the mod files that are in the (virtual) data directory of your game and will thus be selecteable in the esp list in the main window. Tady jsou soubory modu, které se nacházejí ve (virtuálním) data adresáři hry a proto je bude možné aktivovat v seznamu esp v hlavním oknÄ›. - + Available ESPs ESP k dispozici - + Conflicts Konflikty - + The following conflicted files are provided by this mod Konfliktní soubory, které budou pÅ™ebity tímhle modem - - + + File Soubor - + Overwritten Mods PÅ™epsané mody - + The following conflicted files are provided by other mods Konfliktní soubory, které další mody pÅ™ebijou - + Providing Mod Mod původu - + Non-Conflicted files Nekonfliktní soubory - + Categories Kategorie - + Primary Category - + Nexus Info Nexus Info - + Mod ID Mod ID - + Mod ID for this mod on Nexus. Mod ID tohodle modu na Nexusu. - + <!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; } @@ -2950,7 +3098,7 @@ p, li { white-space: pre-wrap; } <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt;">Mod ID pro tenhle mod na Nexusu. Vyplňuje se automaticky pokud ste soubor i stáhli i nainstalovali přímo skrz MO. Jinak ho můžete zadat ruÄne. Správne ID naleznete u modu na Nexusu. Adresa bude vypadat takhle: </span><a href=" http://www.skyrimnexus.com/downloads/file.php?id=1334"><span style=" font-size:8pt; text-decoration: underline; color:#0000ff;">http://skyrim.nexusmods.com/downloads/file.php?id=1334</span></a><a href="http://www.skyrimnexus.com/downloads/file.php?id=1334"><span style=" font-size:8pt; color:#000000;">. V takovem případe 1334 je Mod ID. Mimo jiné odkaz je přímo na Mod Organizer tak proÄ rovnou nejít zadat Endorse?</span></a></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; } @@ -2963,32 +3111,32 @@ p, li { white-space: pre-wrap; } <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt;">Nainstalovaná verze modu. Bublina ukáže Äíslo nejaktuálnÄ›jší verzi modu na Nexusu. Číslo verze se nastaví samo jenom pokud byl mod nainstalován skrz MO.</span></p></body></html> - + Version Verze - + Refresh ZnovunaÄíst - + Refresh all information from Nexus. - + Description Popis - + <!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:'MS Shell Dlg 2'; font-size:7.8pt; font-weight:400; font-style:normal;"> -<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /></p></body></html> +</style></head><body style=" font-family:'MS Shell Dlg 2'; font-size:8.25pt; font-weight:400; font-style:normal;"> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:8pt;"><br /></p></body></html> @@ -3008,7 +3156,7 @@ p, li { white-space: pre-wrap; } Druh - + Name Jméno @@ -3017,12 +3165,12 @@ p, li { white-space: pre-wrap; } Velikost (kB) - + Endorse - + Notes @@ -3035,17 +3183,17 @@ p, li { white-space: pre-wrap; } Už jste tenhle mod endorsovali? - + Filetree Struktura souborů - + A directory view of this mod Zložkový náhled na mod - + <!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; } @@ -3060,53 +3208,53 @@ p, li { white-space: pre-wrap; } <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt;">Zmeny se okamžite dejí pÅ™imo na disku, takže</span><span style=" font-size:8pt; font-weight:600;">buÄte opatrní</span><span style=" font-size:8pt;">.</span></p></body></html> - + Previous - + Next Další - + Close Zavřít - + &Delete &Smazat - + &Rename &PÅ™ejmenovat - + &Hide &Skrýt - + &Unhide &Odekrýt - + &Open &Otevřít - + &New Folder &Nová Složka - - + + Save changes? Uložit zmÄ›ny? @@ -3115,28 +3263,28 @@ p, li { white-space: pre-wrap; } Uložit zmÄ›ny v "%1"? - + File Exists Soubor existuje - + A file with that name exists, please enter a new one Soubor s rovnakým názvem existuje, prosím zadejte jiné jméno - + failed to move file zlyhalo pÅ™esunutí souboru - + failed to create directory "optional" zlyhalo vytvoÅ™ení zložky "optional" - - + + Info requested, please wait Info vyžádáno, prosím poÄkejte @@ -3146,53 +3294,53 @@ p, li { white-space: pre-wrap; } (popis chybí, prosím navÅ¡tivte nexus pro kompletní zobrazení) - + (description incomplete, please visit nexus) (popis chybí, prosím navÅ¡tivte nexus pro kompletní zobrazení) - + Current Version: %1 SouÄasná verze: %1 - + No update available Žádný update není k dispozici - + Main Hlavní - - + + Save changes to "%1"? - + Update Update - + Optional Volitelné - + Old Staré - + Misc Jiné - + Unknown Neznámé @@ -3201,13 +3349,13 @@ p, li { white-space: pre-wrap; } požadavka zlyhala: %1 - + <a href="%1">Visit on Nexus</a> <a href="%1">NavÅ¡tivte na Nexusu</a> - - + + Confirm Potvrdit @@ -3224,98 +3372,98 @@ p, li { white-space: pre-wrap; } Výnimka: %1 - + Failed to delete %1 Zlyhalo vymazání %1 - + Are sure you want to delete "%1"? Jsi si jistý, že chceÅ¡ vymazat "%1"? - + Are sure you want to delete the selected files? Jsi si jistý, že chceÅ¡ vymazat oznaÄené soubory? - - + + New Folder Nová zložka - + Failed to create "%1" Zlyhalo vytvoÅ™ení "%1" - - + + Replace file? Nahradit soubor? - + There already is a hidden version of this file. Replace it? Už existuje skrytá verze tohto souboru. Nahradit? - - + + File operation failed Operace se souborem zlyhala - - + + Failed to remove "%1". Maybe you lack the required file permissions? NepodaÅ™ilo se odstranit "%1". Možná nejsou k dispozici požadována práva? - - + + failed to rename %1 to %2 NezdaÅ™ilo se pÅ™ejmenovat %1 na %2 - + There already is a visible version of this file. Replace it? Už existuje viditelná verze tohto souboru. Nahradit? - + Un-Hide Odekrýt - + Hide Skrýt - + Please enter a name - - + + Error Chyba - + Invalid name. Must be a valid file name - + A tweak by that name exists - + Create Tweak @@ -3451,8 +3599,9 @@ p, li { white-space: pre-wrap; } - installed version: %1, newest version: %2 - nainstalovaná verze: %1, nejnovjší verze: %2 + installed version: "%1", newest version: "%2" + installed version: %1, newest version: %2 + nainstalovaná verze: %1, nejnovjší verze: %2 Name @@ -3653,17 +3802,17 @@ p, li { white-space: pre-wrap; } NexusInterface - + Failed to guess mod id for "%1", please pick the correct one - + empty response prázdná odozva - + invalid response neplatná odozva @@ -4662,85 +4811,93 @@ V souÄasnosti má omezenou funkcionalitu esp nenalezeno: %1 - + Mod Index - - + + Flags + + + + + unknown - + Name of your mods - + Load priority of your mod. The higher, the more "important" it is and thus overwrites data from plugins with lower priority. - + The modindex determins the formids of objects originating from this mods. - + failed to update esp info for file %1 (source id: %2), error: %3 - + esp not found: %1 - + Confirm Potvrdit - + Really enable all plugins? - + Really disable all plugins? - + The file containing locked plugin indices is broken - - failed to open output file: %1 - zlyhalo otevÅ™ení výstupního souboru: %1 + zlyhalo otevÅ™ení výstupního souboru: %1 - + Some of your plugins have invalid names! These plugins can not be loaded by the game. Please see mo_interface.log for a list of affected plugins and rename them. NÄ›které vaÅ¡e pluginy mají neplatné názvy! Tyhle pluginy nemůžou být naÄteny hrou. Prosím nahlédnÄ›te do souboru mo_interface.log pro kompletní seznam pluginů a pÅ™ejmenujte je. - + + BOSS dll incompatible + + + + Missing Masters - + Enabled Masters - + failed to restore load order for %1 @@ -4753,17 +4910,17 @@ V souÄasnosti má omezenou funkcionalitu max - + This plugin can't be disabled (enforced by the game) Tenhle plugin nemůže být deaktivován (vyžaduje to hra) - + Origin: %1 Původní mod: %1 - + Name Jméno @@ -4772,7 +4929,7 @@ V souÄasnosti má omezenou funkcionalitu Jména vaÅ¡ich modů - + Priority Priorita @@ -4789,6 +4946,19 @@ V souÄasnosti má omezenou funkcionalitu Tento index pÅ™iraÄuje ID vÄ›cem, kouzlům,... které pÅ™idáva mod. Ich id bude "xxyyyyyy" kde "xx" je index, kterým je "yyyyyy" determinováno podle samotného modu. + + PreviewDialog + + + Preview + + + + + Close + + + ProblemsDialog @@ -4834,82 +5004,72 @@ p, li { white-space: pre-wrap; } Zlyhalo uplatnÄ›ní zmÄ›n v ini - + invalid profile name %1 - + failed to create %1 - - failed to open temporary file - - - - - failed to open "%1" for writing - - - - + failed to write mod list: %1 - + failed to update tweaked ini file, wrong settings may be used: %1 - + failed to create tweaked ini: %1 - - - - - + + + + + invalid index %1 Neplatný index %1 - + Overwrite directory couldn't be parsed - + invalid priority %1 neplatná priorita %1 - + failed to parse ini file (%1) - + failed to parse ini file (%1): %2 zlyhalo rozebrání ini souboru (%1): %2 - - + + failed to modify "%1" - + Delete savegames? - + Do you want to delete local savegames? (If you select "No", the save games will show up again if you re-enable local savegames) @@ -5286,12 +5446,12 @@ p, li { white-space: pre-wrap; } Zlyhalo nastavení proxy-dll naÄítání - + "%1" is missing "%1" chybí - + Permissions required Chybí oprávnÄ›ní @@ -5300,8 +5460,8 @@ p, li { white-space: pre-wrap; } Uživatelský úÄet nemá dostateÄná oprávnÄ›ní pro spuÅ¡tÄ›ní Mod Organizeru. Nevyhnutné zmeny se můžou udÄ›lat automaticky (adresář MO se nastaví ako pÅ™episovatelný pro souÄasného uživatele). Budete požádáni spustit "mo_helper.exe" s administrátorskými právami). - - + + Woops Hups @@ -5310,66 +5470,66 @@ p, li { white-space: pre-wrap; } ModOrganizer havaroval! Má se vytvoÅ™it diagnostický soubor? Pokud mi tento soubor poÅ¡lete (sherb@gmx.net), bude omnoho vyšší Å¡ance, že chybu opravím. - + The current user account doesn't have the required access rights to run Mod Organizer. The neccessary changes can be made automatically (the MO directory will be made writable for the current user account). You will be asked to run "helper.exe" with administrative rights. - + ModOrganizer has crashed! Should a diagnostic file be created? If you send me this file (%1) to sherb@gmx.net, the bug is a lot more likely to be fixed. Please include a short description of what you were doing when the crash happened - + ModOrganizer has crashed! Unfortunately I was not able to write a diagnostic file: %1 ModOrganizer havaroval! NaneÅ¡tÄ›stí, nezdaÅ™ilo se ani vytvoÅ™it diagnostický soubor: %1 - - + + Mod Organizer Mod Organizer - + An instance of Mod Organizer is already running Jedna instance Mod Organizeru už běží - + No game identified in "%1". The directory is required to contain the game binary and its launcher. Žádná hra nebyla nalezena v "%1". Je potÅ™ebné, aby adresář obsahoval binár hry a spouÅ¡tÄ›Ä. - - + + Please select the game to manage Prosím vyberte hru, kterou chcete spravovat - + Please select the game edition you have (MO can't start the game correctly if this is set incorrectly!) - + Please use "Help" from the toolbar to get usage instructions to all elements Prosím použijte "Pomoc" z panelu nástrojú pro instrukce ke vÅ¡em elementům - - + + <Manage...> <Manage...> - + failed to parse profile %1: %2 NezdaÅ™ilo se rozebrat profil %1: %2 - - + + failed to find "%1" NepodaÅ™ilo sa najít "%1" @@ -5378,17 +5538,17 @@ p, li { white-space: pre-wrap; } Chyba kódování, prosím nahlaste tuto chybu a poskytnÄ›te záznamový soubor mo_interface.log! - + failed to access %1 zlyhal přístup k %1 - + failed to set file time %1 nepodaÅ™ilo se nastavit Äas souboru %1 - + failed to create %1 NepodaÅ™ilo se vytvoÅ™it %1 @@ -5424,12 +5584,12 @@ p, li { white-space: pre-wrap; } nepodaÅ™ilo se otevřít %1 - + Script Extender Skript Extender - + Proxy DLL Proxy DLL @@ -5454,22 +5614,22 @@ Start elevated anyway? (you will be asked if you want to allow ModOrganizer.exe - + failed to spawn "%1": %2 nepodaÅ™ilo se vytvoÅ™it "%1": %2 - + "%1" doesn't exist "%1" neexistuje - + failed to inject dll into "%1": %2 nepodaÅ™ilo se vsunout dll do "%1": %2 - + failed to run "%1" nepodaÅ™ilo se spustit "%1" @@ -5530,6 +5690,11 @@ Start elevated anyway? (you will be asked if you want to allow ModOrganizer.exe invalid game type %1 + + + failed to open temporary file + + QueryOverwriteDialog @@ -5764,18 +5929,18 @@ Start elevated anyway? (you will be asked if you want to allow ModOrganizer.exe Administrátorské práva jsou požadovány na tuhle zmÄ›nu. - - + + attempt to store setting for unknown plugin "%1" - + Confirm Potvrdit - + Changing the mod directory affects all your profiles! Mods not present (or named differently) in the new location will be disabled in all profiles. There is no way to undo this unless you backed up your profiles manually. Proceed? Zmena adresáře modu zmÄ›ní vÅ¡echny tvoje profily! Nenalezené mody (nebo pÅ™ejmenované) v nové lokaci budou deaktivovány ve vÅ¡ech profilech. Není možnosÅ¥ návratu pokud si nezazálohujete profily ruÄnÄ›. PokraÄovat? @@ -5948,52 +6113,57 @@ p, li { white-space: pre-wrap; } Konfigurovat Kategorie Modů - + Disable automatic internet features - + Disable automatic internet features. This does not affect features that are explicitly invoked by the user (like checking mods for updates, endorsing, opening the web browser) - + Offline Mode - + Use a proxy for network connections. - + Use a proxy for network connections. This uses the system-wide settings which can be configured in Internet Explorer. Please note that MO will start up a few seconds slower on some systems when using a proxy. - + Use HTTP Proxy (Uses System Settings) - - Known Servers (Dynamically updated every download) + + Associate with "Download with manager" links + + + + + Known Servers (updated on download) - + Preferred Servers (Drag & Drop) - + Blacklisted Plugins (use <del> to remove): - + Mod Organizer needs a dll to be injected into the game so all mods are visible to it. There are several means to do this: *Mod Organizer* (default) In this mode the Mod Organizer itself injects the dll. The disadvantage is that you always have to start the game through MO or a link created by it. @@ -6042,12 +6212,12 @@ p, li { white-space: pre-wrap; } Automaticky pÅ™ihlásit do Nexusu - + Username PÅ™ihlasovací jméno - + Password Heslo @@ -6064,52 +6234,52 @@ p, li { white-space: pre-wrap; } Preferuj externí prohlížeÄ - + Plugins - + Author: - + Version: - + Description: - + Key - + Value - + Workarounds ŘeÅ¡ení - + Steam App ID Steam App ID - + The Steam AppID for your game Steam AppID pro vaÅ¡i hru - + <!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; } @@ -6136,12 +6306,12 @@ p, li { white-space: pre-wrap; } <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt;">22380 je id, které hledáte.</span></p></body></html> - + Load Mechanism Mechanizmus spuÅ¡tÄ›ní - + Select loading mechanism. See help for details. Vyberte mechanizmus použit pro spuÅ¡tÄ›ní. Pro víc detailů Äti NápovÄ›du. @@ -6166,17 +6336,17 @@ p, li { white-space: pre-wrap; } <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt; font-weight:600;">Proxy DLL</span><span style=" font-size:8pt;"> V tomhle módu, MO nahradí jedno dll samotné hry takovým, které naÄte MO (a také původní obsah dll samozÅ™ejmÄ›). Tohle bude fungovat POUZE pro Steamové verze her a bylo testováno pouze u Skyrimu. VyhnÄ›te se téhle metóde pokud funguje jedna z pÅ™edchozích.</span></p></body></html> - + NMM Version - + The Version of Nexus Mod Manager to impersonate. - + Mod Organizer uses an API provided by the Nexus to provide features like checking for updates and downloading files. Unfortunately this API has not been made available officially to third party tools like MO so we have to impersonate the Nexus Mod Manager to be allowed in. On top of this Nexus has used the client identification to lock out outdated versions of NMM to force users to update. This means that MO also needs to impersonate the new version of NMM even if MO doesn't need an update. Therefore you can configure the version to identify as here. Please note that MO does identify itself as MO to the webserver, it's not lying about what it is. It is merely adding a "compatible" NMM version to the user agent. @@ -6185,53 +6355,53 @@ tl;dr-version: If Nexus-features don't work, insert the current version num - + Enforces that inactive ESPs and ESMs are never loaded. ZabezpeÄí, aby se neaktivní ESP a ESM vůbec nezobrazovali. - + It seems that the Games occasionally load ESP or ESM files even if they haven't been activated as plugins. I don't yet know what the circumstances are, but user reports imply it is in some cases unwanted. If this is checked, ESPs and ESMs not checked in the List are invisible to the game and can not be loaded. Zdá se, že hry obÄasnÄ› naÄtou ESP nebo ESM soubory i když nebyli oznaÄeny ako aktivní pluginy. Nevím za jakých podmínek se to stává, ale uživatelé říkaj, že v nÄ›kterých případech je to neželané. Pokud je tohle oznaÄeno, ESP a ESM soubory které v seznamu nejsou oznaÄeny, nemůžou být za žádných okolností naÄtené ve hÅ™e. - + Hide inactive ESPs/ESMs Skrýt neaktivní ESP/ESM - + If checked, files (i.e. esps, esms and bsas) belonging to the core game can not be disabled in the UI. (default: on) - + If checked, files (i.e. esps, esms and bsas) belonging to the core game can not be disabled in the UI. (default: on) Uncheck this if you want to use Mod Organizer with total conversions (like Nehrim) but be aware that the game will crash if required files are not enabled. - + Force-enable game files - - + + For Skyrim, this can be used instead of Archive Invalidation. It should make AI redundant for all Profiles. For the other games this is not a sufficient replacement for AI! Pro Skyrim, tohle je možné použít místo Invalidace Archívu. Pro vÅ¡echny profily bude IA nepotÅ™ebná. Pro ostatné hry tohle není dostateÄná náhrada Invalidace Archívu! - + Back-date BSAs Uprav dátumy BSA - + These are workarounds for problems with Mod Organizer. Please make sure you read the help text before changing anything here. @@ -6240,27 +6410,27 @@ Pro ostatné hry tohle není dostateÄná náhrada Invalidace Archívu! Tohle jsou různé náhradné Å™eÅ¡ení problému s používaním modů. Obvykle nejsou potÅ™ebné. Prosím urÄite si projdÄ›te NápovÄ›du pÅ™edtím než zde neco pomÄ›níte. - + Select download directory Vyber adresář pro stahování - + Select mod directory Vyber adresář pro mody - + Select cache directory Vyber adresář pro cache - + Confirm? Potvrdit? - + This will make all dialogs show up again where you checked the "Remember selection"-box. Continue? Znovu se budou zobrazovat vÅ¡echny výzvy, u kterých jste oznaÄili "Zapamatovat tuto odpovÄ›d provždy". PokraÄovat? diff --git a/src/organizer_de.ts b/src/organizer_de.ts index 3d227137..306ce0ef 100644 --- a/src/organizer_de.ts +++ b/src/organizer_de.ts @@ -1,6 +1,50 @@ + + AboutDialog + + + + About + + + + + Revision: + + + + + Used Software + + + + + Credits + + + + + Translators + + + + + Others + + + + + Close + Schliessen + + + + No license + + + ActivateModsDialog @@ -239,25 +283,30 @@ p, li { white-space: pre-wrap; } DownloadList - + Name Name - + Filetime Änderungsdatum - + Done Fertig - + Information missing, please select "Query Info" from the context menu to re-retrieve. Informationen unvollständig, bitte clicke im Kontextmenü "Info abfragen" um diese erneut abzurufen. + + + pending download + + DownloadListWidget @@ -310,125 +359,135 @@ p, li { white-space: pre-wrap; } DownloadListWidgetCompactDelegate - - - - + + + + Are you sure? Sind sie sicher? - + This will remove all finished downloads from this list and from disk. Entfernt alle abgeschlossenen Downloads aus der Liste und von der Festplatte. - + This will remove all installed downloads from this list and from disk. Entfernt alle installierten Downloads aus der Liste und von der Festplatte. - + Install Installieren - + Query Info Info abfragen - + Remove Entfernen - + Cancel Abbrechen - + + < mod %1 file %2 > + + + + + Pending + + + + Paused - + Fetching Info 1 - + Fetching Info 2 - + Installed - + Uninstalled - + Done Fertig - + This will permanently remove all finished downloads from this list (but NOT from disk). - + This will permanently remove all installed downloads from this list (but NOT from disk). - + Delete - + Un-Hide Sichtbar machen - + Remove from View - + Pause Pausieren - + Resume Fortsetzen - + Delete Installed... - + Delete All... - + Remove Installed... Installierte entfernen... - + Remove All... Alle löschen... @@ -436,68 +495,78 @@ p, li { white-space: pre-wrap; } DownloadListWidgetDelegate - - - - + + + + Are you sure? Sind sie sicher? - + This will remove all finished downloads from this list and from disk. Entfernt alle abgeschlossenen Downloads aus der Liste und von der Festplatte. - + This will remove all installed downloads from this list and from disk. Entfernt alle installierten Downloads aus der Liste und von der Festplatte. - + This will remove all finished downloads from this list (but NOT from disk). - + This will remove all installed downloads from this list (but NOT from disk). - + Install Installieren - + Query Info Info abfragen - + Delete - + Un-Hide Sichtbar machen - + Remove from View - + Remove Entfernen - + Cancel Abbrechen + + + < mod %1 file %2 > + + + + + Pending + + Fetching Info 1 @@ -509,32 +578,32 @@ p, li { white-space: pre-wrap; } - + Pause Pausieren - + Resume Fortsetzen - + Delete Installed... - + Delete All... - + Remove Installed... Installierte entfernen... - + Remove All... Alle löschen... @@ -542,12 +611,12 @@ p, li { white-space: pre-wrap; } DownloadManager - - - - - - + + + + + + invalid index %1 ungültiger index %1 @@ -556,30 +625,31 @@ p, li { white-space: pre-wrap; } Löschen der Datei ist fehlgeschlagen - + failed to delete %1 konnte %1 nicht löschen - + failed to delete meta file for %1 konnte meta-informationen für %1 nicht löschen - - - - - - - - - - - - - - + + + + + + + + + + + + + + + invalid index ungültiger Index @@ -589,32 +659,32 @@ p, li { white-space: pre-wrap; } - + Download again? - + A file with the same name has already been downloaded. Do you want to download it again? The new file will receive a different name. - + Wrong Game - + The download link is for a mod for "%1" but this instance of MO has been set up for "%2". - + Please enter the nexus mod id Bitte gib die Nexus Mod ID ein - + Mod ID: Mod ID: @@ -623,33 +693,38 @@ p, li { white-space: pre-wrap; } ungültiger alphabetischer index %1 - + Information updated Informationen aktualisiert - - + + No matching file found on Nexus! Maybe this file is no longer available or it was renamed? Keine passende Datei auf Nexus gefunden! Ist die Datei vielleicht nicht mehr verfügbar? - + No file on Nexus matches the selected file by name. Please manually choose the correct one. Keine Datei mit diesem Namen auf Nexus gefunden. Bitte wähle die passende händisch aus. - + No download server available. Please try again later. - + Failed to request file info from nexus: %1 Konnte Datei-Informationen nicht von Nexus abrufen: %1 - + + Download failed. Server reported: %1 + + + + Download failed: %1 (%2) Download fehlgeschlagen: %1 (%2) @@ -658,7 +733,7 @@ p, li { white-space: pre-wrap; } Abfrage von Dateiinformationen von Nexus fehlgeschlagen! - + failed to re-open %1 Öffnen von %1 fehlgeschlagen @@ -667,7 +742,7 @@ p, li { white-space: pre-wrap; } konnte Antwort von Nexus nicht interpretieren - + failed to download %1: could not open output file: %2 Download von %1 fehlgeschlagen: Konnte Ausgabedatei %2 nicht öffnen @@ -781,7 +856,7 @@ Momentan ist der einzige bekannte Fall in dem dies benötigt wird der Skyrim Cre - + If checked, MO will be closed once the specified executable is run. Wenn ausgewählt, wird MO geschlossen sobald das Programm gestartet wird. @@ -798,7 +873,7 @@ Momentan ist der einzige bekannte Fall in dem dies benötigt wird der Skyrim Cre - + Add Neu @@ -814,42 +889,59 @@ Momentan ist der einzige bekannte Fall in dem dies benötigt wird der Skyrim Cre Entfernen - + + Close + Schliessen + + + Select a binary Ausführbare Datei wählen - + Executable (%1) Ausführbare Datei (%1) - + Java (32-bit) required - + MO requires 32-bit java to run this application. If you already have it installed, select javaw.exe from that installation as the binary. - + Select a directory Wähle ein Verzeichnis - + Confirm Bestätigen - + Really remove "%1" from executables? Die ausführbare Datei "%1" löschen? - + + + Save Changes? + + + + + + You made changes to the current executable, do you want to save them? + + + + MO must be kept running or this application will not work correctly. MO muss aktiv bleiben sonst funktioniert diese Anwendung nicht korrekt. @@ -858,7 +950,7 @@ Momentan ist der einzige bekannte Fall in dem dies benötigt wird der Skyrim Cre Ausführbare Datei (*.exe, *.bat) - + Modify Ändern @@ -1303,7 +1395,7 @@ p, li { white-space: pre-wrap; } MO ist gesperrt während das Programm ausgeführt wird. - + Unlock Entsperren @@ -1311,7 +1403,7 @@ p, li { white-space: pre-wrap; } LogBuffer - + failed to write log to %1: %2 konnte Protokoll nicht nach %1 schreiben: %2 @@ -1332,23 +1424,23 @@ p, li { white-space: pre-wrap; } MainWindow - - + + Categories Kategorien - + Profile Profil - + Pick a module collection Wähle eine Modul-Kollektion - + <!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; } @@ -1363,44 +1455,44 @@ p, li { white-space: pre-wrap; } <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt;">Beachten Sie, dass derzeit die ESP Ladefolge nicht getrennt für verschiedene Profile gespeichert wird.</span></p></body></html> - + Refresh list Liste aktualisieren - + Refresh list. This is usually not necessary unless you modified data outside the program. Liste aktualisieren. Dies ist normalerweise nicht notwendig, es sei denn Sie haben Daten außerhalb von MO verändert. - + List of available mods. - + This is a list of installed mods. Use the checkboxes to activate/deactivate mods and drag & drop mods to change their "installation" orders. - + Filter Filter - + No groups - + Nexus IDs Nexus IDs - - - + + + Namefilter @@ -1409,12 +1501,12 @@ p, li { white-space: pre-wrap; } Ausführen - + Pick a program to run. Wähle das auszuführende Programm. - + <!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; } @@ -1429,12 +1521,12 @@ p, li { white-space: pre-wrap; } <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt;">Sie können weitere Programme dieser Liste hinzufügen, aber ich kann nicht garantieren, dass von mir nicht getestete Anwendungen vollständig funktionieren..</span></p></body></html> - + Run program Ausführen - + <!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; } @@ -1447,17 +1539,17 @@ p, li { white-space: pre-wrap; } <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt;">Das ausgewählte Programm durch Mod Organiser ausführen.</span></p></body></html> - + Run Starten - + Create a shortcut in your start menu or on the desktop to the specified program - + <!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; } @@ -1470,7 +1562,7 @@ p, li { white-space: pre-wrap; } <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt;">Erstellt einen Eintrag im Startmenü, der direkt das gewählte Programm durch Mod Organsier ausführt.</span></p></body></html> - + Shortcut @@ -1495,12 +1587,12 @@ p, li { white-space: pre-wrap; } Speichern - + List of available esp/esm files Liste der verfügbaren ESP / ESM Dateien - + <!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; } @@ -1517,12 +1609,12 @@ p, li { white-space: pre-wrap; } WICHTIG: Sie können die Ladereihenfolge der BSAs hier ändern aber die Installationsreihenfolge hat Vorrang vor der Reihenfolge hier! - + List of available BS Archives. Archives not checked here are not managed by MO and ignore installation order. Liste der BS Archive. Archive die hier nicht markiert sind werden nicht von MO verwaltet und beachten daher nicht die gewählte Installationsreihenfolge. - + BSA files are archives (comparable to .zip files) that contain data assets (meshes, textures, ...) to be used by the game. As such they "compete" with loose files in your data directory over which is loaded. By default, BSAs that share their base name with an enabled ESP (i.e. plugin.esp and plugin.bsa) are automatically loaded and will have precedence over all loose files, the installation order you set up to the left is then ignored! @@ -1530,66 +1622,71 @@ BSAs checked here are loaded in such a way that your installation order is obeye - - + + File Datei - + <html><head/><body><p>Marked Archives (<img src=":/MO/gui/warning_16"/>) are still loaded on Skyrim but the <a href="http://forums.bethsoft.com/topic/1354395-update-bsas-and-you/"><span style=" text-decoration: underline; color:#0000ff;">regular file override</span></a> mechanism will apply: Loose files override BSAs, no matter the mod/plugin priority.</p></body></html> - + Mod Mod - + Data Data - + + Sort + + + + refresh data-directory overview Data-Verzeichnis übersicht neu laden - + Refresh the overview. This may take a moment. Lädt die Übersicht neu. Dies kann einen Augenblick dauern. - - - + + + Refresh Neu laden - + This is an overview of your data directory as visible to the game (and tools). Dies ist eine Übersicht des "data"-verzeichnisses so wie es das Spiel zu sehen bekommt. - - + + Filter the above list so that only conflicts are displayed. Obere Liste filtern um nur Konflikte anzuzeigen. - + Show only conflicts Nur Konflikte anzeigen - + Saves Spielstände - + <!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; } @@ -1606,160 +1703,160 @@ p, li { white-space: pre-wrap; } <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt;">Wenn Sie im Kontextmenü auf &quot;Mods reparieren...&quot; klicken, wird Mod Organiser versuchen die entsprechenden Mods und ESPs zu aktivieren. Es werden dabei kein Eintrag deaktiviert!</span></p></body></html> - + Downloads Downloads - + This is a list of mods you downloaded from Nexus. Double click one to install it. Dies ist eine Liste der Mods die von Nexus heruntergeladen wurden. Doppelklicken Sie um zu installieren. - + Compact Kompakt - + Show Hidden - + Tool Bar Werkzeugleiste - + Install Mod Mod installieren - + Install &Mod &Mod installieren - + Install a new mod from an archive Installiert eine Mod aus einem Archiv - + Ctrl+M Ctrl+M - + Profiles Profile - + &Profiles &Profile - + Configure Profiles Profile konfigurieren - + Ctrl+P Ctrl+P - + Executables Programme - + &Executables Programm&e - + Configure the executables that can be started through Mod Organizer Konfigurieren der Programme die von Mod Organiser gestartet werden können - + Ctrl+E Ctrl+E - - + + Tools - + &Tools - + Ctrl+I Ctrl+I - + Settings Einstellungen - + &Settings Ein&stellungen - + Configure settings and workarounds Einstellungen und Workarounds verwalten - + Ctrl+S Ctrl+S - + Nexus Nexus - + Search nexus network for more mods Durchsuche die passende Seite des Nexus-Netzwerks nach weiteren Mods - + Ctrl+N Ctrl+N - - + + Update Aktualisierung - + Mod Organizer is up-to-date Mod Organizer ist auf dem neuesten Stand - - + + No Problems Keine Probleme - + This button will be highlighted if MO discovered potential problems in your setup and provide tips on how to fix them. !Work in progress! @@ -1768,54 +1865,54 @@ Right now this has very limited functionality Diese Funktion ist noch in arbeit und ist sehr eingeschränkt. - - + + Help Hilfe - + Ctrl+H Ctrl+H - + Endorse MO - - + + Endorse Mod Organizer - + Toolbar - + Desktop - + Start Menu - + Problems Probleme - + There are potential problems with your setup Es bestehen möglicherweise Probleme mit Ihrer Konfiguration - + Everything seems to be in order Alles in bester Ordnung @@ -1832,22 +1929,22 @@ Diese Funktion ist noch in arbeit und ist sehr eingeschränkt. <li>dotNet ist nicht installiert oder veraltet. Dies wird benötigt um NCC nutzen zu können. Laden Sie die korrekte Version von <a href="%1">%1</a> herunter</li> - + Help on UI Hilfe zur Oberfläche - + Documentation Wiki Wiki Dokumentation - + Report Issue Fehler melden - + Tutorials @@ -1856,425 +1953,426 @@ Diese Funktion ist noch in arbeit und ist sehr eingeschränkt. Ladereihenfolge konnte nicht gespeichert werden - + failed to save load order: %1 Reihenfolge konnt nicht gespeichert werden: %1 - + failed to save archives order, do you have write access to "%1"? - + + About + + + + + About Qt + + + + Name Name - + Please enter a name for the new profile Bitte geben Sie einen Namen für das neue Profil an - + failed to create profile: %1 Erstellen des Profils fehlgeschlagen: %1 - + Show tutorial? - + You are starting Mod Organizer for the first time. Do you want to show a tutorial of its basic features? If you choose no you can always start the tutorial from the "Help"-menu. - + Downloads in progress Download in Bearbeitung - + There are still downloads in progress, do you really want to quit? Es gibt noch unfertige Downloads, wollen Sie wirklich das Programm beenden? - + failed to read savegame: %1 Spielstand konnte nicht gelesen werden: %1 - + Plugin "%1" failed: %2 - + Plugin error - + It appears the plugin "%1" failed to load last startup and caused MO to crash. Do you want to disable it? (Please note: If this is the first time you see this message for this plugin you may want to give it another try. The plugin may be able to recover from the problem) - + Failed to start "%1" - + Waiting Warte - + Please press OK once you're logged into steam. Bitte drücken sie OK sobald sie bei Steam angemeldet sind. - "%1" not found - "%1" nicht gefunden + "%1" nicht gefunden - + Start Steam? - + Steam is required to be running already to correctly start the game. Should MO try to start steam now? Steam muss laufen um das Spiel korrekt zu starten. Soll MO versuchen Steam zu starten? - + Also in: <br> Auch in: <br> - + No conflict Keine Konflikte - + <Edit...> <Bearbeiten...> - - Failed to refresh list of esps: %s - - - - + This bsa is enabled in the ini file so it may be required! Dieses Archiv ist in der ini Konfiguration gelistet, daher ist es möglicherweise erforderlich! - + This archive will still be loaded since there is a plugin of the same name but its files will not follow installation order! Dieses Archiv wird vom Spiel geladen werden da ein Plugin mit dem selben Namen aktiv ist aber die enthaltenen Dateien werden sich nicht an Ihre Installations-Reihenfolge halten! - + Activating Network Proxy - - + + Installation successful Installation erfolgreich - - + + Configure Mod Mod konfigurieren - - + + This mod contains ini tweaks. Do you want to configure them now? Diese Mod enthält Anpassungen für die Ini datei. Wollen Sie diese nun konfigurieren? - - + + mod "%1" not found mod "%1" nicht gefunden - - + + Installation cancelled Installation abgebrochen - - + + The mod was not installed completely. Die mod wurde nicht erfolgreich installiert. - + Some plugins could not be loaded - + Too many esps and esms enabled - - + + Description missing - + The game doesn't allow more than 255 active plugins (including the official ones) to be loaded. You have to disable some unused plugins or merge some plugins into one. You can find a guide here: <a href="http://wiki.step-project.com/Guide:Merging_Plugins">http://wiki.step-project.com/Guide:Merging_Plugins</a> - + Choose Mod Mod wählen - + Mod Archive Mod Archiv - + Start Tutorial? - + You're about to start a tutorial. For technical reasons it's not possible to end the tutorial early. Continue? - - + + Download started Download gestartet - + failed to update mod list: %1 Aktualisieren der Modliste fehlgeschlagen: %1 - + failed to spawn notepad.exe: %1 notepad.exe konnte nicht aufgerufen werden: %1 - + failed to open %1 %1 konnte nicht geöffnet werden - + failed to change origin name: %1 konnte den Namen der Dateiquelle nicht ändern: %1 - + Multiple esps activated, please check that they don't conflict. - - + + Create Mod... - + A mod with this name already exists - + Continue? - + The versioning scheme decides which version is considered newer than another. This function will guess the versioning scheme under the assumption that the installed version is outdated. - + + Sorry - + I don't know a versioning scheme where %1 is newer than %2. - + <All> <Alle> - + <Checked> <Markierte> - + Plugin "%1" failed - + failed to init plugin %1: %2 - + The following plugins could not be loaded. The reason may be missing dependencies (i.e. python) or an outdated version: - - Failed to move "%1" from mod "%2" to "%3": %4 - - - - + <Unchecked> <Nicht markierte> - + <Update> <Update> - + <No category> <Ohne Kategorie> - + <Conflicted> - + <Not Endorsed> - + failed to rename mod: %1 konnte die Mod nicht umbenennen: %1 - + Overwrite? - + This will replace the existing mod "%1". Continue? - + failed to remove mod "%1" - - - + + + failed to rename "%1" to "%2" - - - + + + + Confirm Bestätigen - + Remove the following mods?<br><ul>%1</ul> - + failed to remove mod: %1 konnte die mod nicht entfernen: %1 - - + + Failed Fehlgeschlagen - + Installation file no longer exists Installationsdatei existiert nicht mehr - + Mods installed with old versions of MO can't be reinstalled in this way. Mods die mit alten Versionen von MO installiert wurden können nicht auf diese Weise neu-installiert werden. - - + + You need to be logged in with Nexus to endorse - - + + Extract BSA BSA extrahieren - + This mod contains at least one BSA. Do you want to unpack it? (This removes the BSA after completion. If you don't know about BSAs, just select no) Diese mod enthält mindestens eine BSA datei. Soll sie entpackt werden? (Das BSA wird danach gelöscht. Wenn Sie nicht wissen was BSAs sind wählen Sie am besten \"nein\") - - - + + + failed to read %1: %2 - - + + This archive contains invalid hashes. Some files may be broken. Dieses Archiv enthält ungültige Prüfsummen. Einige Dateien sind evtl. defekt. - + Nexus ID for this Mod is unknown Nexus ID für diese Mod unbekannt @@ -2287,92 +2385,92 @@ This function will guess the versioning scheme under the assumption that the ins Priorität wählen - + Really enable all visible mods? Alle angezeigten Mods aktivieren? - + Really disable all visible mods? Alle angezeigten Mods deaktivieren? - + Choose what to export - + Everything - + All installed mods are included in the list - + Active Mods - + Only active (checked) mods from your current profile are included - + Visible - + All mods visible in the mod list are included - + export failed: %1 - + Install Mod... Mod installieren... - + Enable all visible Alle sichtbaren aktvieren - + Disable all visible Alle sichtbaren deaktvieren - + Check all for update Alle auf Aktualisierungen überprüfen - + Export to csv... - + Sync to Mods... Mods synchronisieren... - + Restore Backup - + Remove Backup... @@ -2381,312 +2479,362 @@ This function will guess the versioning scheme under the assumption that the ins Kategorie festlegen - + Primary Category - + Change versioning scheme - + Un-ignore update - + Ignore update - + Rename Mod... Mod umbenennen... - + Remove Mod... Mod entfernen... - + Reinstall Mod Mod neu installieren - + Un-Endorse - - + + Endorse - + Won't endorse - + Endorsement state unknown - + Ignore missing data - + Visit on Nexus Auf Nexus besuchen - + Open in explorer In Explorer öffnen - + Information... Informationen... - - + + Exception: Ausnahme: - - + + Unknown exception Unbekannte Ausnahme - + <Multiple> - + + Really delete "%1"? + + + + Fix Mods... Mods reparieren... - - + + Delete + + + + + failed to remove %1 %1 konnte nicht entfernt werden - - + + failed to create %1 %1 konnte nicht erstellt werden - + Can't change download directory while downloads are in progress! Das download verzeichnis kann nicht geändert werden solange Downloads laufen! - + Download failed Download fehlgeschlagen - + failed to write to file %1 Speichern in Datei "%1" fehlgeschlagen - + %1 written "%1" gespeichert - + Select binary Binary wählen - + Binary Ausführbare Datei - + Enter Name Namen eingeben - + Please enter a name for the executable Bitte geben Sie einen Namen für die Anwendungsdatei ein - + Not an executable Datei ist nicht ausführbar - + This is not a recognized executable. - - + + Replace file? Datei ersetzen? - + There already is a hidden version of this file. Replace it? Es existiert bereits eine versteckte Variante von dieser Datei. Soll diese ersetzt werden? - - + + File operation failed Dateioperation fehlgeschlagen - - + + Failed to remove "%1". Maybe you lack the required file permissions? Konnte "%1" nicht löschen. Fehlen Ihnen evtl. die nötigen Berechtigungen? - + There already is a visible version of this file. Replace it? Es existiert bereits eine sichtbare Variante dieser Datei. Soll diese ersetzt werden? - + + file not found: %1 + Datei nicht gefunden: %1 + + + + failed to generate preview for %1 + + + + + Sorry, can't preview anything. This function currently does not support extracting from bsas. + + + + Update available Aktualisierung verfügbar - + Open/Execute Öffnen/Ausführen - + Add as Executable Als Anwendung hinzufügen - + + Preview + + + + Un-Hide Sichtbar machen - + Hide Verstecken - + Write To File... In Datei speichern... - + Do you want to endorse Mod Organizer on %1 now? - + Remove - + Unlock load order - + Lock load order - + + BOSS working + + + + + failed to run boss: %1 + + + + Request to Nexus failed: %1 - + + Executable "%1" not found + + + + + Failed to refresh list of esps: %1 + + + + This will move all files from overwrite into a new, regular mod. Please enter a name: - + Add/Remove Categories - + Replace Categories - - + + login successful - + login failed: %1. Trying to download anyway login fehlgeschlagen: %1. Der Download scheitert vermutlich - + login failed: %1 login fehlgeschlagen: %1 - + login failed: %1. You need to log-in with Nexus to update MO. - + Error Fehler - + failed to extract %1 (errorcode %2) konnte "%1" nicht extrahieren (fehlercode %2) - + Extract... Extrahieren... - + Edit Categories... - + Enable all - + Disable all @@ -2729,58 +2877,58 @@ Please enter a name: Mod Informationen - + Textfiles Textdateien - + A list of text-files in the mod directory. Liste mit Textdateien im Modverzeichnis. - + A list of text-files in the mod directory like readmes. Eine Liste mit Textdateien im Modverzeichnis, z.B. Readme. - + INI-Files INI Dateien - + This is a list of .ini files in the mod. Liste mit .ini Dateien im Mod. - + This is a list of .ini files in the mod. These are usually used to configure the behaviour of mods if there are configurable parameters. Eine Liste mit Textdateien im Modverzeichnis. Die Dateien werden üblicherweise dazu verwendet um das Verhalten und Parameter der mods zu konfigurieren. - + Save changes to the file. Änderungen an der Datei speichern. - + Save changes to the file. This overwrites the original. There is no automatic backup! Änderungen der Datei speichern. Dies überschreibt das Original - es gibt keine automatische Sicherung! - - + + Save Speichern - + Images Bilder - + Images located in the mod. Bilder im Modverzeichnis. @@ -2797,13 +2945,13 @@ p, li { white-space: pre-wrap; } <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt;">Listet alle Bilder (*.jpg, *.png) im Modverzeichnis auf, bspw. Screenshots. Klicken für eine größere Ansicht.</span></p></body></html> - - + + Optional ESPs Optionale ESPs - + List of esps and esms that can not be loaded by the game. Liste mit ESP und ESM Dateien die vom Spiel nicht geladen werden können. @@ -2826,12 +2974,12 @@ p, li { white-space: pre-wrap; } <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt;">Die meisten Mods haben keine optionalen ESPs, wahrscheinlich sehen Sie also eine leere Liste vor sich..</span></p></body></html> - + This lists all the images (.jpg and .png) in the mod directory, like screenshots and such. Click one to get a larger view. - + List of esps and esms contained in this plugin that currently can not be loaded by the game. They will not even appear in the esp-list in the main MO-window. They usually contain optional functionality, see the readme. @@ -2839,103 +2987,103 @@ Most mods do not have optional esps, so chances are good you are looking at an e - + Make the selected mod in the lower list unavailable. Den unten ausgewählten Mod als nicht verfügbar markieren. - + The selected esp (in the lower list) will be pushed into a subdirectory of the mod and will thus become "invisible" to the game. It can then no longer be activated. Die in der unteren Liste ausgewählte ESP wird in ein Unterverzeichnis des Mods verschoben und so für das Spiel unsichtbar. Sie kann nicht mehr im Spiel aktiviert werden. - + Move a file to the data directory. Datei in das Datenverzeichnis verschieben. - + This moves a esp to the esp directory so it can be enabled in the main window. Please note that the ESP merely becomes "available", it will not necessarily be loaded! That is configured in the main window of omo. Verschiebt ein ESP in das ESP Verzeichnis damit es im Hauptfenster aktiviert werden kann. Bitte beachten Sie, dass das ESP nur "verfügbar" wird, es wird nicht zwangsläufig geladen! Das Laden der ESP wird im Hauptfenster von MO eingestellt. - + ESPs in the data directory and thus visible to the game. ESPs im Datenverzeichnis und für das Spiel sichtbar. - + These are the mod files that are in the (virtual) data directory of your game and will thus be selecteable in the esp list in the main window. Dies Mod Dateien sind im (virtuellen) Datenverzeichnis des Spiels und somit in der ESP Liste des Hauptfenster auswählbar. - + Available ESPs Verfügbare ESPs - + Conflicts Konflikte - + The following conflicted files are provided by this mod Die folgenden konfliktbehafteten Dateien werden von dieser Mod bereitgestellt - - + + File Datei - + Overwritten Mods Überschriebene Mods - + The following conflicted files are provided by other mods Die folgenden konfliktbehafteten Dateien werden von anderen Mods bereitgestellt - + Providing Mod Bereitstellende Mod - + Non-Conflicted files Konfliktfreie Dateien - + Categories Kategorien - + Primary Category - + Nexus Info Nexus Info - + Mod ID Mod ID - + Mod ID for this mod on Nexus. ID dieser mod auf Nexus. - + <!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; } @@ -2953,7 +3101,7 @@ p, li { white-space: pre-wrap; } <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">ModID für den Mod auf Nexus. Um die korrekte Id zu finden, einfach den Mod auf Nexus aufrufen. Die URL sieht so aus:<a href=" http://www.skyrimnexus.com/downloads/file.php?id=1334"><span style=" text-decoration: underline; color:#0000ff;">http://www.skyrimnexus.com/downloads/file.php?id=1334</span></a><a href="http://www.skyrimnexus.com/downloads/file.php?id=1334"><span style=" color:#000000;">. In diesem Beispiel ist 1334 die gesuchte Id. Zufällig ist das genau der Link zu Mod Organiser im Nexus. Warum nicht einfach mal anklicken und ein Endorsement hinzufügen?</span></a></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; } @@ -2966,32 +3114,32 @@ p, li { white-space: pre-wrap; } <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt;">Installierte Version des Mods. Der Tooltip zeigt die auf Nexus verfügbare Version. Die installierte Versionsnummer kann nur angezeigt werden wenn der Mod durch MO installiert wurde.</span></p></body></html> - + Version Version - + Refresh Neu laden - + Refresh all information from Nexus. - + Description Beschreibung - + <!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:'MS Shell Dlg 2'; font-size:7.8pt; font-weight:400; font-style:normal;"> -<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /></p></body></html> +</style></head><body style=" font-family:'MS Shell Dlg 2'; font-size:8.25pt; font-weight:400; font-style:normal;"> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:8pt;"><br /></p></body></html> @@ -2999,12 +3147,12 @@ p, li { white-space: pre-wrap; } about:blank - + Endorse - + Notes @@ -3025,7 +3173,7 @@ p, li { white-space: pre-wrap; } Typ - + Name Name @@ -3046,17 +3194,17 @@ p, li { white-space: pre-wrap; } Schon ein "endorsement" vergeben? - + Filetree Verzeichnisbaum - + A directory view of this mod Verzeichnisansicht des Mods - + <!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; } @@ -3071,53 +3219,53 @@ p, li { white-space: pre-wrap; } <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt;">Veränderungen werden sofort auf der Platte ausgeführt, also</span><span style=" font-size:8pt; font-weight:600;"> vorsichtig sein!</span><span style=" font-size:8pt;">.</span></p></body></html> - + Previous - + Next Weiter - + Close Schliessen - + &Delete &Löschen - + &Rename &Umbenennen - + &Hide - + &Unhide - + &Open &Öffnen - + &New Folder &Neuer Ordner - - + + Save changes? Änderungen speichern? @@ -3126,28 +3274,28 @@ p, li { white-space: pre-wrap; } Änderungen an "%1" speichern? - + File Exists Datei existiert bereits - + A file with that name exists, please enter a new one Eine Datei mit diesem Namen existiert bereits, bitte wählen Sie einen anderen Namen - + failed to move file Verschieben der Datei fehlgeschlagen - + failed to create directory "optional" Erstellen des Verzeichnis "optional" fehlgeschlagen - - + + Info requested, please wait Information wird abgerufen, bitte warten @@ -3164,32 +3312,32 @@ p, li { white-space: pre-wrap; } (Beschreibung unvollständig. Bitte besuche die Nexus-Seite) - + Main Primär - + Update Aktualisierung - + Optional Optional - + Old Alt - + Misc Sonstiges - + Unknown Unbekannt @@ -3198,18 +3346,18 @@ p, li { white-space: pre-wrap; } Anfrage fehlgeschlagen - + (description incomplete, please visit nexus) - + <a href="%1">Visit on Nexus</a> <a href="%1">Auf Nexus öffnen</a> - - + + Confirm Bestätigen @@ -3222,114 +3370,114 @@ p, li { white-space: pre-wrap; } Download gestartet - + Failed to delete %1 "%1" konnte nicht gelöscht werden - + Are sure you want to delete "%1"? Sind Sie sicher, dass Sie "%1" löschen wollen? - + Are sure you want to delete the selected files? Sind Sie sicher, dass Sie die ausgewählten Dateien löschen wollen? - - + + New Folder Neuer Ordner - + Failed to create "%1" "%1" konnte nicht erstellt werden - - + + Replace file? Datei ersetzen? - + There already is a hidden version of this file. Replace it? Es existiert bereits eine versteckte Variante von dieser Datei. Soll diese ersetzt werden? - - + + File operation failed Dateioperation fehlgeschlagen - - + + Failed to remove "%1". Maybe you lack the required file permissions? Konnte "%1" nicht löschen. Fehlen Ihnen evtl. die nötigen Berechtigungen? - - + + failed to rename %1 to %2 konnte "%1" nicht in "%2" umbenennen - + There already is a visible version of this file. Replace it? Es existiert bereits eine sichtbare Variante dieser Datei. Soll diese ersetzt werden? - + Un-Hide Sichtbar machen - + Hide Verstecken - + Please enter a name - - + + Error Fehler - + Invalid name. Must be a valid file name - + A tweak by that name exists - + Create Tweak - + Current Version: %1 Aktuelle Version: %1 - - + + Save changes to "%1"? - + No update available Keine neue Version verfügbar @@ -3401,8 +3549,9 @@ p, li { white-space: pre-wrap; } - installed version: %1, newest version: %2 - installierte Version: %1, neueste Version: %2 + installed version: "%1", newest version: "%2" + installed version: %1, newest version: %2 + installierte Version: %1, neueste Version: %2 %1 contains no esp/esm and no asset (textures, meshes, interface, ...) directory @@ -3724,17 +3873,17 @@ p, li { white-space: pre-wrap; } NexusInterface - + Failed to guess mod id for "%1", please pick the correct one - + empty response leere Antwort - + invalid response ungültige Antwort @@ -4759,85 +4908,93 @@ Diese Funktion ist noch in arbeit und ist sehr eingeschränkt. PluginList - + Mod Index - - + + Flags + + + + + unknown - + Name of your mods - + Load priority of your mod. The higher, the more "important" it is and thus overwrites data from plugins with lower priority. - + The modindex determins the formids of objects originating from this mods. - + failed to update esp info for file %1 (source id: %2), error: %3 - + esp not found: %1 ESP nicht gefunden: %1 - + Confirm Bestätigen - + Really enable all plugins? - + Really disable all plugins? - + The file containing locked plugin indices is broken - - failed to open output file: %1 - konnte die Ausgabedatei nicht öffnen: %1 + konnte die Ausgabedatei nicht öffnen: %1 - + Some of your plugins have invalid names! These plugins can not be loaded by the game. Please see mo_interface.log for a list of affected plugins and rename them. Einige Ihrer Plugins haben ungültige Namen! Diese Plugins können nicht vom Spiel geladen werden. Die Datei mo_interface.log enthält eine Liste der betroffenen Plugins. Bitte benennen Sie diese um. - + + BOSS dll incompatible + + + + Missing Masters - + Enabled Masters - + failed to restore load order for %1 @@ -4850,17 +5007,17 @@ Diese Funktion ist noch in arbeit und ist sehr eingeschränkt. max - + This plugin can't be disabled (enforced by the game) Dieses Plugin kann nicht deaktiviert werden (vom Spiel benötigt) - + Origin: %1 Ursprung: %1 - + Name Name @@ -4869,7 +5026,7 @@ Diese Funktion ist noch in arbeit und ist sehr eingeschränkt. Namen Ihrer Mods - + Priority Priorität @@ -4888,6 +5045,19 @@ Diese Funktion ist noch in arbeit und ist sehr eingeschränkt. Dieser Index legt die ID von Gegenständen, Zaubersprüchen, etc. fest, die mit dem Mod eingeführt werden. Die ID wird "xxyyyyyy" sein, wobei "xx" dieser Index ist und "yyyyyy" vom Mod selbst bestimmt wird. + + PreviewDialog + + + Preview + + + + + Close + Schliessen + + ProblemsDialog @@ -4933,82 +5103,72 @@ p, li { white-space: pre-wrap; } konnte Ini Anpassungen nicht anwenden - + invalid profile name %1 - + failed to create %1 %1 konnte nicht erstellt werden - - failed to open temporary file - - - - - failed to open "%1" for writing - - - - + failed to write mod list: %1 - + failed to update tweaked ini file, wrong settings may be used: %1 - + failed to create tweaked ini: %1 - + Overwrite directory couldn't be parsed - + invalid priority %1 Ungültige Priorität %1 - + failed to parse ini file (%1) - + failed to parse ini file (%1): %2 Konnte ini-datei (%1) nicht auslesen: %2 - - + + failed to modify "%1" - + Delete savegames? - + Do you want to delete local savegames? (If you select "No", the save games will show up again if you re-enable local savegames) - - - - - + + + + + invalid index %1 ungültiger index %1 @@ -5385,7 +5545,7 @@ p, li { white-space: pre-wrap; } Ungültige 7-zip32.dll: %1 - + "%1" is missing "%1" fehlt @@ -5394,8 +5554,8 @@ p, li { white-space: pre-wrap; } "%1" konnte nicht erstellt werden, haben Sie die nötigen Schreibrechte für das Installations Verzeichnis? - - + + Please select the game to manage Bitte wählen Sie ein Spiel zum Verwalten aus @@ -5404,7 +5564,7 @@ p, li { white-space: pre-wrap; } Ungültiges Profil %1 - + Permissions required Berechtigungen erforderlich @@ -5413,8 +5573,8 @@ p, li { white-space: pre-wrap; } Der aktuelle Benutzeraccount hat die erforderlichen Berechtigungen nicht um Mod Organizer auszuführen. The notwendigen Änderungen können automatisch durchgeführt werden (der aktuelle Benutzeraccount erhält Schreibzugriff auf das ModOrganizer Verzeichnis). Sie werden aufgefordert werden "mo_helper.exe" mit erhöhten Privilegien auszuführen. - - + + Woops Oha @@ -5423,32 +5583,32 @@ p, li { white-space: pre-wrap; } ModOrganizer ist abgestürzt! Soll eine Diagnosedatei geschrieben werden? Wenn sie mir diese Datei per eMail (sherb@gmx.net) schicken kann dieser Fehler vermutlich eher behoben werden. - + The current user account doesn't have the required access rights to run Mod Organizer. The neccessary changes can be made automatically (the MO directory will be made writable for the current user account). You will be asked to run "helper.exe" with administrative rights. - + ModOrganizer has crashed! Should a diagnostic file be created? If you send me this file (%1) to sherb@gmx.net, the bug is a lot more likely to be fixed. Please include a short description of what you were doing when the crash happened - + ModOrganizer has crashed! Unfortunately I was not able to write a diagnostic file: %1 ModOrganizer ist abgestürzt! Leider konnte keine Diagnosedatei geschrieben werden: %1 - + An instance of Mod Organizer is already running Mod Organizer läuft bereits - + No game identified in "%1". The directory is required to contain the game binary and its launcher. Es wurde kein Spiel in "%1" gefunden. Das Verzeichnis muss das Anwendungsdatei des Spiels und des Launchers enthalten. - + Please select the game edition you have (MO can't start the game correctly if this is set incorrectly!) @@ -5457,7 +5617,7 @@ p, li { white-space: pre-wrap; } "%1" nicht gefunden - + Please use "Help" from the toolbar to get usage instructions to all elements Bitte verwenden Sie die "Hilfe" Funktion um Hinweise zu Nutzung aller Elemete zu bekommen @@ -5470,19 +5630,19 @@ p, li { white-space: pre-wrap; } Ungültige Priorität %1 - - + + failed to find "%1" Konnte "%1" nicht finden - - + + <Manage...> <Verwalten...> - + failed to parse profile %1: %2 Konnte Profil %1 nicht verarbeiten: %2 @@ -5491,17 +5651,17 @@ p, li { white-space: pre-wrap; } Kodierungsfehler! Bitte melden Sie dies als Bug und fügen Sie die Datei mo_interface.log bei! - + failed to access %1 Auf %1 konnte nicht zugegriffen werden - + failed to set file time %1 Konnte Dateizeit nicht setzen %1 - + failed to create %1 %1 konnte nicht erstellt werden @@ -5556,22 +5716,22 @@ Start elevated anyway? (you will be asked if you want to allow ModOrganizer.exe - + failed to spawn "%1": %2 "%1" konnte nicht erzeugt werden: %2 - + "%1" doesn't exist "%1" existiert nicht - + failed to inject dll into "%1": %2 Konnte dll nicht in "%1" einspeisen: %2 - + failed to run "%1" "%1" konnte nicht ausgeführt werden @@ -5657,18 +5817,18 @@ Start elevated anyway? (you will be asked if you want to allow ModOrganizer.exe Englisch - - + + Mod Organizer Mod Organizer - + Script Extender Script Extender - + Proxy DLL Proxy DLL @@ -5751,6 +5911,11 @@ Start elevated anyway? (you will be asked if you want to allow ModOrganizer.exe invalid game type %1 + + + failed to open temporary file + + QueryOverwriteDialog @@ -5986,18 +6151,18 @@ Start elevated anyway? (you will be asked if you want to allow ModOrganizer.exe Admistratorrechte sind erforderlich um dies zu ändern. - - + + attempt to store setting for unknown plugin "%1" - + Confirm Bestätigen - + Changing the mod directory affects all your profiles! Mods not present (or named differently) in the new location will be disabled in all profiles. There is no way to undo this unless you backed up your profiles manually. Proceed? @@ -6124,42 +6289,47 @@ p, li { white-space: pre-wrap; } Cache-Verzeichnis - + Disable automatic internet features - + Disable automatic internet features. This does not affect features that are explicitly invoked by the user (like checking mods for updates, endorsing, opening the web browser) - + Offline Mode - + Use a proxy for network connections. - + Use a proxy for network connections. This uses the system-wide settings which can be configured in Internet Explorer. Please note that MO will start up a few seconds slower on some systems when using a proxy. - + Use HTTP Proxy (Uses System Settings) - - Known Servers (Dynamically updated every download) + + Associate with "Download with manager" links + + + + + Known Servers (updated on download) - + Preferred Servers (Drag & Drop) @@ -6231,52 +6401,52 @@ p, li { white-space: pre-wrap; } Standardbrowser vorziehen - + Plugins - + Author: - + Version: - + Description: - + Key - + Value - + Blacklisted Plugins (use <del> to remove): - + Workarounds Workarounds - + Load Mechanism Lademechanismus - + Mod Organizer needs a dll to be injected into the game so all mods are visible to it. There are several means to do this: *Mod Organizer* (default) In this mode the Mod Organizer itself injects the dll. The disadvantage is that you always have to start the game through MO or a link created by it. @@ -6287,17 +6457,17 @@ If you use the Steam version of Oblivion the default will NOT work. In this case - + NMM Version - + The Version of Nexus Mod Manager to impersonate. - + Mod Organizer uses an API provided by the Nexus to provide features like checking for updates and downloading files. Unfortunately this API has not been made available officially to third party tools like MO so we have to impersonate the Nexus Mod Manager to be allowed in. On top of this Nexus has used the client identification to lock out outdated versions of NMM to force users to update. This means that MO also needs to impersonate the new version of NMM even if MO doesn't need an update. Therefore you can configure the version to identify as here. Please note that MO does identify itself as MO to the webserver, it's not lying about what it is. It is merely adding a "compatible" NMM version to the user agent. @@ -6306,53 +6476,53 @@ tl;dr-version: If Nexus-features don't work, insert the current version num - + Enforces that inactive ESPs and ESMs are never loaded. Stellt sicher, dass inaktive ESP und ESM Dateien nie geladen werden. - + It seems that the Games occasionally load ESP or ESM files even if they haven't been activated as plugins. I don't yet know what the circumstances are, but user reports imply it is in some cases unwanted. If this is checked, ESPs and ESMs not checked in the List are invisible to the game and can not be loaded. Manche Spiele scheinen gelegentlich ESP oder ESM Dateien zu laden auch wenn sie nicht als Plugins aktiviert wurden. Wenn der Haken aktiviert wurde, sind ESP und ESM Dateien die nicht ausgewählt wurden für das Spiel unsichtbar und können nicht geladen werden. - + Hide inactive ESPs/ESMs Inaktive ESP / ESM ausblenden - + If checked, files (i.e. esps, esms and bsas) belonging to the core game can not be disabled in the UI. (default: on) - + If checked, files (i.e. esps, esms and bsas) belonging to the core game can not be disabled in the UI. (default: on) Uncheck this if you want to use Mod Organizer with total conversions (like Nehrim) but be aware that the game will crash if required files are not enabled. - + Force-enable game files - - + + For Skyrim, this can be used instead of Archive Invalidation. It should make AI redundant for all Profiles. For the other games this is not a sufficient replacement for AI! Für Skyrim kann dies als Alternative zur Archiv Invalidierung verwendet werden. Damit erübrigt sich AI für alle Profile. Für die anderen Spiele ist dies KEIN hinreichender Ersatz für AI! - + Back-date BSAs BSAs zurückdatieren - + These are workarounds for problems with Mod Organizer. Please make sure you read the help text before changing anything here. @@ -6365,7 +6535,7 @@ Für die anderen Spiele ist dies KEIN hinreichender Ersatz für AI!Lade-Methode - + Select loading mechanism. See help for details. Lade-Mechanismus auswählen. Siehe Hilfe für mehr Details. @@ -6390,17 +6560,17 @@ p, li { white-space: pre-wrap; } <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt; font-weight:600;">Proxy DLL</span><span style=" font-size:8pt;"> In diesem Modus ersetzt MO eine der dll Dateien des Spiels mit einer eigenen Version, die MO lädt (und die originale dll natürlich). Dies funktioniert NUR mit Steam Versionen und wurde bisher nur mit Skyrim getestet. Bitte verwenden Sie diesen Modus nur, wenn keine der anderen Varianten funktioniert.</span></p></body></html> - + Steam App ID Steam AppID - + The Steam AppID for your game Die Steam AppID für Ihr Spiel - + <!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; } @@ -6469,37 +6639,37 @@ p, li { white-space: pre-wrap; } Automatisch in Nexus anmelden - + Username Nutzername - + Password Kennwort - + Select download directory Download-Verzeichnis wählen - + Select mod directory Mod-Verzeichnis wählen - + Select cache directory Cache-Verzeichnis wählen - + Confirm? - + This will make all dialogs show up again where you checked the "Remember selection"-box. Continue? diff --git a/src/organizer_es.ts b/src/organizer_es.ts index bb1543ce..0a19f56f 100644 --- a/src/organizer_es.ts +++ b/src/organizer_es.ts @@ -1,6 +1,50 @@ + + AboutDialog + + + + About + + + + + Revision: + + + + + Used Software + + + + + Credits + + + + + Translators + + + + + Others + + + + + Close + Cerrar + + + + No license + + + ActivateModsDialog @@ -232,25 +276,30 @@ p, li { white-space: pre-wrap; } DownloadList - + Name Nombre - + Filetime - + Done - + Information missing, please select "Query Info" from the context menu to re-retrieve. + + + pending download + + DownloadListWidget @@ -303,125 +352,135 @@ p, li { white-space: pre-wrap; } DownloadListWidgetCompactDelegate - - - - + + + + Are you sure? Estas seguro? - + This will remove all finished downloads from this list and from disk. Esto limpiara todas las descargas finalizadas del disco y la lista. - + This will remove all installed downloads from this list and from disk. - + Install Instalar - + Query Info - + Remove - + Cancel Cancelar - + + < mod %1 file %2 > + + + + + Pending + + + + Paused - + Fetching Info 1 - + Fetching Info 2 - + Installed - + Uninstalled - + Done - + This will permanently remove all finished downloads from this list (but NOT from disk). - + This will permanently remove all installed downloads from this list (but NOT from disk). - + Delete - + Un-Hide - + Remove from View - + Pause - + Resume - + Delete Installed... - + Delete All... - + Remove Installed... - + Remove All... Quitar todos... @@ -429,68 +488,78 @@ p, li { white-space: pre-wrap; } DownloadListWidgetDelegate - - - - + + + + Are you sure? Estas seguro? - + This will remove all finished downloads from this list and from disk. Esto limpiara todas las descargas finalizadas del disco y la lista. - + This will remove all installed downloads from this list and from disk. - + This will remove all finished downloads from this list (but NOT from disk). - + This will remove all installed downloads from this list (but NOT from disk). - + Install Instalar - + Query Info - + Delete - + Un-Hide - + Remove from View - + Remove Quitar - + Cancel Cancelar + + + < mod %1 file %2 > + + + + + Pending + + Fetching Info 1 @@ -502,32 +571,32 @@ p, li { white-space: pre-wrap; } - + Pause - + Resume - + Delete Installed... - + Delete All... - + Remove Installed... - + Remove All... Quitar todos... @@ -540,78 +609,83 @@ p, li { white-space: pre-wrap; } - + Download again? - + A file with the same name has already been downloaded. Do you want to download it again? The new file will receive a different name. - + failed to download %1: could not open output file: %2 error en la descarga %1: no se puede abrir el fichero de destino: %2 - + Wrong Game - + The download link is for a mod for "%1" but this instance of MO has been set up for "%2". - + failed to delete %1 - + failed to delete meta file for %1 - - - - - - + + + + + + invalid index %1 indice invalido %1 - + Information updated - - + + No matching file found on Nexus! Maybe this file is no longer available or it was renamed? - + No file on Nexus matches the selected file by name. Please manually choose the correct one. - + No download server available. Please try again later. - + Failed to request file info from nexus: %1 - + + Download failed. Server reported: %1 + + + + Download failed: %1 (%2) @@ -620,30 +694,31 @@ p, li { white-space: pre-wrap; } error borrando el fichero - - - - - - - - - - - - - - + + + + + + + + + + + + + + + invalid index indice invalido - + Please enter the nexus mod id - + Mod ID: @@ -652,7 +727,7 @@ p, li { white-space: pre-wrap; } Fallo la peticion de fichero de Nexus! - + failed to re-open %1 error reabriendo %1 @@ -764,7 +839,7 @@ Right now the only case I know of where this needs to be overwritten is for the - + If checked, MO will be closed once the specified executable is run. Si esta seleccionado, MO se cerrada automaticamente al ejecutar el fichero. @@ -781,7 +856,7 @@ Right now the only case I know of where this needs to be overwritten is for the - + Add Añadir @@ -797,42 +872,59 @@ Right now the only case I know of where this needs to be overwritten is for the Quitar - + + Close + Cerrar + + + Select a binary Selecciona el fichero - + Executable (%1) - + Java (32-bit) required - + MO requires 32-bit java to run this application. If you already have it installed, select javaw.exe from that installation as the binary. - + Select a directory - + Confirm Confirma - + Really remove "%1" from executables? - + + + Save Changes? + + + + + + You made changes to the current executable, do you want to save them? + + + + MO must be kept running or this application will not work correctly. @@ -841,7 +933,7 @@ Right now the only case I know of where this needs to be overwritten is for the Ejecutable (*.exe *.bat) - + Modify Modificar @@ -1203,7 +1295,7 @@ p, li { white-space: pre-wrap; } MO esta bloqueado mientras se ejecute el programa. - + Unlock Desbloqueado @@ -1211,7 +1303,7 @@ p, li { white-space: pre-wrap; } LogBuffer - + failed to write log to %1: %2 @@ -1232,23 +1324,23 @@ p, li { white-space: pre-wrap; } MainWindow - - + + Categories Categorias - + Profile Perfil - + Pick a module collection Selecciona un perfil para cargarlo - + <!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; } @@ -1259,44 +1351,44 @@ p, li { white-space: pre-wrap; } Por favor observa que las prioridades no son guardadas para cada perfil. - + Refresh list Recargar lista - + Refresh list. This is usually not necessary unless you modified data outside the program. Recargar lista. Esto es normalmente no necesario, a no ser que hayas modificado algo desde fuera del programa. - + List of available mods. - + This is a list of installed mods. Use the checkboxes to activate/deactivate mods and drag & drop mods to change their "installation" orders. - + Filter Filtro - + No groups - + Nexus IDs Nexus IDs - - - + + + Namefilter @@ -1305,12 +1397,12 @@ Por favor observa que las prioridades no son guardadas para cada perfil.Iniciar - + Pick a program to run. Selecciona el programa a iniciar. - + <!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; } @@ -1320,12 +1412,12 @@ p, li { white-space: pre-wrap; } - + Run program Iniciar el programa - + <!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; } @@ -1334,17 +1426,17 @@ p, li { white-space: pre-wrap; } Iniciar el programa seleccionado con ModOrganizer activado. - + Run Iniciar - + Create a shortcut in your start menu or on the desktop to the specified program - + <!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; } @@ -1353,7 +1445,7 @@ p, li { white-space: pre-wrap; } - + Shortcut @@ -1362,12 +1454,12 @@ p, li { white-space: pre-wrap; } Guardar la lista de prioridades de carga. - + List of available esp/esm files Listado de ficheros esp/esm disponibles - + <!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; } @@ -1376,12 +1468,12 @@ p, li { white-space: pre-wrap; } - + List of available BS Archives. Archives not checked here are not managed by MO and ignore installation order. - + BSA files are archives (comparable to .zip files) that contain data assets (meshes, textures, ...) to be used by the game. As such they "compete" with loose files in your data directory over which is loaded. By default, BSAs that share their base name with an enabled ESP (i.e. plugin.esp and plugin.bsa) are automatically loaded and will have precedence over all loose files, the installation order you set up to the left is then ignored! @@ -1389,66 +1481,71 @@ BSAs checked here are loaded in such a way that your installation order is obeye - - + + File Fichero - + <html><head/><body><p>Marked Archives (<img src=":/MO/gui/warning_16"/>) are still loaded on Skyrim but the <a href="http://forums.bethsoft.com/topic/1354395-update-bsas-and-you/"><span style=" text-decoration: underline; color:#0000ff;">regular file override</span></a> mechanism will apply: Loose files override BSAs, no matter the mod/plugin priority.</p></body></html> - + Mod Mod - + Data Datos - + + Sort + + + + refresh data-directory overview refresca la vista del directorio de datos - + Refresh the overview. This may take a moment. Refresca toda la vista. Esto puede tomar un tiempo. - - - + + + Refresh Recargar - + This is an overview of your data directory as visible to the game (and tools). Esta es una visión general del directorio de datos como visible para el juego (y herramientas). - - + + Filter the above list so that only conflicts are displayed. Filrar la lista superior por conflictos. - + Show only conflicts Monstrar solo los conflictos - + Saves Part. Guardadas - + <!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; } @@ -1459,160 +1556,160 @@ p, li { white-space: pre-wrap; } - + Downloads Descargas - + This is a list of mods you downloaded from Nexus. Double click one to install it. Esta es la lista de los mods que has descargado desde Nexus. Doble Click para instalar. - + Compact - + Show Hidden - + Tool Bar Tool Bar - + Install Mod Instalar Mod - + Install &Mod Instalar &Mod - + Install a new mod from an archive Instalar un nuevo Mod desde un archivo - + Ctrl+M Ctrl+M - + Profiles Perfiles - + &Profiles &Perfiles - + Configure Profiles Configurar los perfiles - + Ctrl+P Ctrl+P - + Executables Ejecutables - + &Executables &Ejecutables - + Configure the executables that can be started through Mod Organizer Configura el ejecutable que sera iniciado desde Mod Orgenizer - + Ctrl+E Ctrl+E - - + + Tools - + &Tools - + Ctrl+I Ctrl+I - + Settings Configuracion - + &Settings &Configuracion - + Configure settings and workarounds Configuraciones y modos - + Ctrl+S Ctrl+S - + Nexus Nexus - + Search nexus network for more mods Buscar en la red de Nexus mas Mods - + Ctrl+N Ctrl+N - - + + Update - + Mod Organizer is up-to-date Mod Organizer esta actualizado - - + + No Problems - + This button will be highlighted if MO discovered potential problems in your setup and provide tips on how to fix them. !Work in progress! @@ -1620,496 +1717,497 @@ Right now this has very limited functionality - - + + Help Ayuda - + Ctrl+H Ctrl+H - + Endorse MO - - + + Endorse Mod Organizer - + Toolbar - + Desktop - + Start Menu - + Problems - + There are potential problems with your setup - + Everything seems to be in order - + Help on UI - + Documentation Wiki - + Report Issue - + Tutorials - + failed to save load order: %1 Fallo guardando el orden de carga: %1 - + failed to save archives order, do you have write access to "%1"? - + + About + + + + + About Qt + + + + Name Nombre - + Please enter a name for the new profile Por favor introduzca un nombre para el nuevo perfil - + failed to create profile: %1 Fallo al crear el perfil: %1 - + Show tutorial? - + You are starting Mod Organizer for the first time. Do you want to show a tutorial of its basic features? If you choose no you can always start the tutorial from the "Help"-menu. - + Downloads in progress Descarga en progreso - + There are still downloads in progress, do you really want to quit? Aun hay descargas en progreso, estas seguro que quieres salir? - + failed to read savegame: %1 Fallo al leer la partida guardada: %1 - + Plugin "%1" failed: %2 - + Plugin error - + It appears the plugin "%1" failed to load last startup and caused MO to crash. Do you want to disable it? (Please note: If this is the first time you see this message for this plugin you may want to give it another try. The plugin may be able to recover from the problem) - + Failed to start "%1" - + Waiting - + Please press OK once you're logged into steam. - "%1" not found - "%1" no encontrado + "%1" no encontrado - + Start Steam? - + Steam is required to be running already to correctly start the game. Should MO try to start steam now? - + Also in: <br> - + No conflict Sin conflictos - + <Edit...> <Editar...> - - Failed to refresh list of esps: %s - - - - + This bsa is enabled in the ini file so it may be required! - + This archive will still be loaded since there is a plugin of the same name but its files will not follow installation order! - + Activating Network Proxy - - + + Installation successful Instalacion completada - - + + Configure Mod Configurar Mod - - + + This mod contains ini tweaks. Do you want to configure them now? Este mod contiene modificaciones del Ini. Quieres configurarlas ahora? - - + + mod "%1" not found - - + + Installation cancelled - - + + The mod was not installed completely. - + Some plugins could not be loaded - + Too many esps and esms enabled - - + + Description missing - + The game doesn't allow more than 255 active plugins (including the official ones) to be loaded. You have to disable some unused plugins or merge some plugins into one. You can find a guide here: <a href="http://wiki.step-project.com/Guide:Merging_Plugins">http://wiki.step-project.com/Guide:Merging_Plugins</a> - + Choose Mod Seleccione Mod - + Mod Archive Fichero Mod - + Start Tutorial? - + You're about to start a tutorial. For technical reasons it's not possible to end the tutorial early. Continue? - - + + Download started Descarga comenzada - + failed to update mod list: %1 Fallo al actualizar la lista de Mods: %1 - + failed to spawn notepad.exe: %1 Fallo al cargar el Bloc de notas: %1 - + failed to open %1 Fallo al abrir %1 - + failed to change origin name: %1 fallo al cambiar el nombre original del fichero %1 - + Multiple esps activated, please check that they don't conflict. - - + + Create Mod... - + A mod with this name already exists - + Continue? - + The versioning scheme decides which version is considered newer than another. This function will guess the versioning scheme under the assumption that the installed version is outdated. - + + Sorry - + I don't know a versioning scheme where %1 is newer than %2. - + <All> <Todos> - + <Checked> <Marcado> - + Plugin "%1" failed - + failed to init plugin %1: %2 - + The following plugins could not be loaded. The reason may be missing dependencies (i.e. python) or an outdated version: - - Failed to move "%1" from mod "%2" to "%3": %4 - - - - + <Unchecked> <Desmarcado> - + <Update> <Actualizacion> - + <No category> - + <Conflicted> - + <Not Endorsed> - + failed to rename mod: %1 fallo al cambiar el nombre al mod: %1 - + Overwrite? - + This will replace the existing mod "%1". Continue? - + failed to remove mod "%1" - - - + + + failed to rename "%1" to "%2" - - - + + + + Confirm Confirma - + Remove the following mods?<br><ul>%1</ul> - + failed to remove mod: %1 - - + + Failed - + Installation file no longer exists - + Mods installed with old versions of MO can't be reinstalled in this way. - - + + You need to be logged in with Nexus to endorse - - + + Extract BSA - + This mod contains at least one BSA. Do you want to unpack it? (This removes the BSA after completion. If you don't know about BSAs, just select no) - - - + + + failed to read %1: %2 - - + + This archive contains invalid hashes. Some files may be broken. - + Nexus ID for this Mod is unknown @@ -2122,92 +2220,92 @@ This function will guess the versioning scheme under the assumption that the ins Selecciona Prioridad - + Really enable all visible mods? - + Really disable all visible mods? - + Choose what to export - + Everything - + All installed mods are included in the list - + Active Mods - + Only active (checked) mods from your current profile are included - + Visible - + All mods visible in the mod list are included - + export failed: %1 - + Install Mod... Instalar Mod... - + Enable all visible Activar todos los visibles - + Disable all visible Desactivar todos los visibles - + Check all for update Buscar Actualizaciones - + Export to csv... - + Sync to Mods... - + Restore Backup - + Remove Backup... @@ -2216,312 +2314,362 @@ This function will guess the versioning scheme under the assumption that the ins Definir Categoria - + Primary Category - + Change versioning scheme - + Un-ignore update - + Ignore update - + Rename Mod... Cambiar nombre... - + Remove Mod... Quitar Mod... - + Reinstall Mod - + Un-Endorse - - + + Endorse - + Won't endorse - + Endorsement state unknown - + Ignore missing data - + Visit on Nexus - + Open in explorer - + Information... Informacion... - - + + Exception: - - + + Unknown exception - + <Multiple> - + + Really delete "%1"? + + + + Fix Mods... Activar Mods faltantes... - - + + Delete + + + + + failed to remove %1 Fallo eliminando %1 - - + + failed to create %1 - + Can't change download directory while downloads are in progress! - + Download failed - + failed to write to file %1 Fallo de escritura en el fichero %1 - + %1 written %1 escrito - + Select binary - + Binary Fichero - + Enter Name - + Please enter a name for the executable - + Not an executable - + This is not a recognized executable. - - + + Replace file? - + There already is a hidden version of this file. Replace it? - - + + File operation failed - - + + Failed to remove "%1". Maybe you lack the required file permissions? - + There already is a visible version of this file. Replace it? - + + file not found: %1 + fichero no encontrado: %1 + + + + failed to generate preview for %1 + + + + + Sorry, can't preview anything. This function currently does not support extracting from bsas. + + + + Update available Disponible actualización - + Open/Execute - + Add as Executable - + + Preview + + + + Un-Hide - + Hide - + Write To File... Escribir al fichero... - + Do you want to endorse Mod Organizer on %1 now? - + Remove - + Unlock load order - + Lock load order - + + BOSS working + + + + + failed to run boss: %1 + + + + Request to Nexus failed: %1 - + + Executable "%1" not found + + + + + Failed to refresh list of esps: %1 + + + + This will move all files from overwrite into a new, regular mod. Please enter a name: - + Add/Remove Categories - + Replace Categories - - + + login successful - + login failed: %1. Trying to download anyway - + login failed: %1 - + login failed: %1. You need to log-in with Nexus to update MO. - + Error Error - + failed to extract %1 (errorcode %2) - + Extract... - + Edit Categories... - + Enable all - + Disable all @@ -2564,58 +2712,58 @@ Please enter a name: Informacion del Mod - + Textfiles Fich. Texto - + A list of text-files in the mod directory. El listado de ficheros de texto en el directorio del mod. - + A list of text-files in the mod directory like readmes. El listado de ficheros de texto en el directorio del mod como ayudas e informacion. - + INI-Files Fich. INI - + This is a list of .ini files in the mod. Esta es la lista de ficheros INI que incluye el mod. - + This is a list of .ini files in the mod. These are usually used to configure the behaviour of mods if there are configurable parameters. Esta es la lista de ficheros INI que incluye el mod. Normalmente son usados para configurar algunos aspectos o parametros del mod. - + Save changes to the file. Grabar cambios al fichero. - + Save changes to the file. This overwrites the original. There is no automatic backup! Grabar cambios al fichero. Esto sobreescribe el original. No se realizan backups! - - + + Save Guardar - + Images Imagenes - + Images located in the mod. Imagenes incluidas en el mod. @@ -2628,13 +2776,13 @@ p, li { white-space: pre-wrap; } Esto muestra el listado de fotos (jpg y png) incluidas con el Mod, por ejemplo capturas de pantallas. Pulsa para verlas en grande. - - + + Optional ESPs ESPs Opcionales - + List of esps and esms that can not be loaded by the game. Listado de ESPs y ESMs que no se cargaran con el juego. @@ -2653,12 +2801,12 @@ Normalmente son ficheros extras o modificaciones, mira el fich. texto del mod pa Muchos mods no tienen ESPs extras, en estos casos veras una lista vacia. - + This lists all the images (.jpg and .png) in the mod directory, like screenshots and such. Click one to get a larger view. - + List of esps and esms contained in this plugin that currently can not be loaded by the game. They will not even appear in the esp-list in the main MO-window. They usually contain optional functionality, see the readme. @@ -2666,103 +2814,103 @@ Most mods do not have optional esps, so chances are good you are looking at an e - + Make the selected mod in the lower list unavailable. marca este fichero seleccionado en la lista de abajo no disponible. - + The selected esp (in the lower list) will be pushed into a subdirectory of the mod and will thus become "invisible" to the game. It can then no longer be activated. El esp seleccionado (en la lista de abajo) es el que sera colocado en el subdirectorio del mod y sera invisible para el juego. Este no podra ser activado. - + Move a file to the data directory. Error moviendo fichero al directorio de datos. - + This moves a esp to the esp directory so it can be enabled in the main window. Please note that the ESP merely becomes "available", it will not necessarily be loaded! That is configured in the main window of omo. Esto mueve un esp al directorio esp, por lo que se puede habilitar en la ventana principal. Tenga en cuenta que el ESP sólo se convierte en "disponible", no necesariamente se cargará! Está configurado en la ventana principal de omo. - + ESPs in the data directory and thus visible to the game. ESPs en el directorio de datos y visibles por el juego. - + These are the mod files that are in the (virtual) data directory of your game and will thus be selecteable in the esp list in the main window. Estos son los archivos mod que se encuentran en el directorio de datos (virtual) de su juego y así será selecteable en la lista de esp en la ventana principal. - + Available ESPs ESPs Disponibles - + Conflicts - + The following conflicted files are provided by this mod - - + + File Fichero - + Overwritten Mods - + The following conflicted files are provided by other mods - + Providing Mod - + Non-Conflicted files - + Categories Categorias - + Primary Category - + Nexus Info Inf. Nexus - + Mod ID ID del MOD - + Mod ID for this mod on Nexus. ID del Mod en Nexus. - + <!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; } @@ -2776,7 +2924,7 @@ p, li { white-space: pre-wrap; } - + <!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; } @@ -2785,41 +2933,41 @@ p, li { white-space: pre-wrap; } - + Version Version - + Refresh Recargar - + Refresh all information from Nexus. - + Description Descripcion - + <!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:'MS Shell Dlg 2'; font-size:7.8pt; font-weight:400; font-style:normal;"> -<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /></p></body></html> +</style></head><body style=" font-family:'MS Shell Dlg 2'; font-size:8.25pt; font-weight:400; font-style:normal;"> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:8pt;"><br /></p></body></html> - + Endorse - + Notes @@ -2840,7 +2988,7 @@ p, li { white-space: pre-wrap; } Tipo - + Name Nombre @@ -2862,17 +3010,17 @@ p, li { white-space: pre-wrap; } Tamaño - + Filetree Contenido - + A directory view of this mod Ficheros que contiene este mod - + <!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; } @@ -2882,43 +3030,43 @@ p, li { white-space: pre-wrap; } - + Previous - + Next - + Close Cerrar - + File Exists Existe el fichero - + A file with that name exists, please enter a new one Un fichero con ese nombre ya existe, por favor selecciona otro nombre - + failed to move file Error al mover el fichero - + failed to create directory "optional" Error al crear el directorio "optional" - - + + Info requested, please wait Informacion solicitada, por favor espere @@ -2935,159 +3083,159 @@ p, li { white-space: pre-wrap; } (descripcion incompleta, por favor visita nexus) - + &Delete &Delete - + &Rename &Rename - + &Open &Open - + &New Folder &New Folder - - + + Save changes? Grabar cambios? - + Current Version: %1 Version actual: %1 - + No update available Sin actualizacion - + Main Principal - + &Hide - + &Unhide - - + + Save changes to "%1"? - + Update Actualizacion - + Optional Opcional - + Old Antiguo - + Misc Misc - + Unknown Desconocido - + (description incomplete, please visit nexus) - - + + Replace file? - + There already is a hidden version of this file. Replace it? - - + + File operation failed - - + + Failed to remove "%1". Maybe you lack the required file permissions? - - + + failed to rename %1 to %2 - + There already is a visible version of this file. Replace it? - + Un-Hide - + Hide - + Please enter a name - - + + Error Error - + Invalid name. Must be a valid file name - + A tweak by that name exists - + Create Tweak @@ -3096,13 +3244,13 @@ p, li { white-space: pre-wrap; } peticion fallada - + <a href="%1">Visit on Nexus</a> - - + + Confirm Confirma @@ -3115,28 +3263,28 @@ p, li { white-space: pre-wrap; } Descarga comenzada - + Failed to delete %1 Error borrando %1 - + Are sure you want to delete "%1"? Estas seguro de querer borrar "%1"? - + Are sure you want to delete the selected files? Etas seguro de querer borrar los ficheros seleccionados? - - + + New Folder Nueva Carpeta - + Failed to create "%1" Fallo al crear "%1" @@ -3212,8 +3360,9 @@ p, li { white-space: pre-wrap; } - installed version: %1, newest version: %2 - version instalada: %1, nueva version: %2 + installed version: "%1", newest version: "%2" + installed version: %1, newest version: %2 + version instalada: %1, nueva version: %2 %1 contains no esp/esm and no asset (textures, meshes, interface, ...) directory @@ -3471,17 +3620,17 @@ p, li { white-space: pre-wrap; } NexusInterface - + Failed to guess mod id for "%1", please pick the correct one - + empty response - + invalid response @@ -4123,85 +4272,89 @@ Activar Mods faltantes en el menu contextual del raton intentara activar los mod PluginList - + Mod Index - - + + Flags + + + + + unknown - + Name of your mods - + Load priority of your mod. The higher, the more "important" it is and thus overwrites data from plugins with lower priority. - + The modindex determins the formids of objects originating from this mods. - + failed to update esp info for file %1 (source id: %2), error: %3 - + esp not found: %1 ESP no encontrado: %1 - + Confirm Confirma - + Really enable all plugins? - + Really disable all plugins? - + The file containing locked plugin indices is broken - - - failed to open output file: %1 + + Some of your plugins have invalid names! These plugins can not be loaded by the game. Please see mo_interface.log for a list of affected plugins and rename them. - - Some of your plugins have invalid names! These plugins can not be loaded by the game. Please see mo_interface.log for a list of affected plugins and rename them. + + BOSS dll incompatible - + Missing Masters - + Enabled Masters - + failed to restore load order for %1 @@ -4214,17 +4367,17 @@ Activar Mods faltantes en el menu contextual del raton intentara activar los mod max - + This plugin can't be disabled (enforced by the game) - + Origin: %1 - + Name Nombre @@ -4233,7 +4386,7 @@ Activar Mods faltantes en el menu contextual del raton intentara activar los mod Nombres de tus Mods - + Priority Prioridad @@ -4254,6 +4407,19 @@ Activar Mods faltantes en el menu contextual del raton intentara activar los mod Indice Mod + + PreviewDialog + + + Preview + + + + + Close + Cerrar + + ProblemsDialog @@ -4299,82 +4465,72 @@ p, li { white-space: pre-wrap; } fallo al aplicar las modificaciones al ini - + invalid profile name %1 - + failed to create %1 - - failed to open temporary file - - - - - failed to open "%1" for writing - - - - + failed to write mod list: %1 - + failed to update tweaked ini file, wrong settings may be used: %1 - + failed to create tweaked ini: %1 - + Overwrite directory couldn't be parsed - + invalid priority %1 prioridad invalida %1 - + failed to parse ini file (%1) - + failed to parse ini file (%1): %2 - - + + failed to modify "%1" - + Delete savegames? - + Do you want to delete local savegames? (If you select "No", the save games will show up again if you re-enable local savegames) - - - - - + + + + + invalid index %1 indice invalido %1 @@ -4759,12 +4915,12 @@ p, li { white-space: pre-wrap; } Fallo al configurar la carga por proxy-dll - + "%1" is missing "%1" no encontrado - + Permissions required Se requieren permisos @@ -4773,44 +4929,44 @@ p, li { white-space: pre-wrap; } La cuenta de usuario actual no tiene los derechos de acceso necesarios para ejecutar el Mod Organizer. Los cambios necesarios pueden hacerse automáticamente (el directorio de MO se harán escritura para la cuenta de usuario actual). Se le pedirá a ejecutar "mo_helper.exe" con derechos de administrador). - - + + Woops - + The current user account doesn't have the required access rights to run Mod Organizer. The neccessary changes can be made automatically (the MO directory will be made writable for the current user account). You will be asked to run "helper.exe" with administrative rights. - + ModOrganizer has crashed! Should a diagnostic file be created? If you send me this file (%1) to sherb@gmx.net, the bug is a lot more likely to be fixed. Please include a short description of what you were doing when the crash happened - + ModOrganizer has crashed! Unfortunately I was not able to write a diagnostic file: %1 - + An instance of Mod Organizer is already running Ya se está ejecutando una instancia de Mod Organizer - + No game identified in "%1". The directory is required to contain the game binary and its launcher. - - + + Please select the game to manage Por favor seleccione el juego - + Please select the game edition you have (MO can't start the game correctly if this is set incorrectly!) @@ -4823,7 +4979,7 @@ p, li { white-space: pre-wrap; } "%1" no encontrado - + Please use "Help" from the toolbar to get usage instructions to all elements Por favor utilice "Ayuda" en la barra superior para obtener informacion sobre todos los elementos @@ -4836,19 +4992,19 @@ p, li { white-space: pre-wrap; } prioridad invalida %1 - - + + failed to find "%1" fallo al encontrar %1 - - + + <Manage...> <Definir...> - + failed to parse profile %1: %2 no se pudo analizar el perfil % 1: %2 @@ -4861,17 +5017,17 @@ p, li { white-space: pre-wrap; } Esto tomara un momento - + failed to access %1 Fallo al acceder %1 - + failed to set file time %1 Fallo al definir la hora al fihcero %1 - + failed to create %1 Fallo al crear %1 @@ -4910,18 +5066,18 @@ p, li { white-space: pre-wrap; } Ingles - - + + Mod Organizer Mod Organizer - + Script Extender Script Extender - + Proxy DLL Proxy DLL @@ -4946,22 +5102,22 @@ Start elevated anyway? (you will be asked if you want to allow ModOrganizer.exe - + failed to spawn "%1": %2 Fallo al crear "%1": %2 - + "%1" doesn't exist "%1% no existe - + failed to inject dll into "%1": %2 Fallo al injectar la dll en "%1": %2 - + failed to run "%1" Fallo al abrir %1 @@ -5049,6 +5205,11 @@ Start elevated anyway? (you will be asked if you want to allow ModOrganizer.exe invalid game type %1 + + + failed to open temporary file + + QueryOverwriteDialog @@ -5280,18 +5441,18 @@ Start elevated anyway? (you will be asked if you want to allow ModOrganizer.exe Derechos administrativos necesarios para cambiar esto. - - + + attempt to store setting for unknown plugin "%1" - + Confirm Confirma - + Changing the mod directory affects all your profiles! Mods not present (or named differently) in the new location will be disabled in all profiles. There is no way to undo this unless you backed up your profiles manually. Proceed? @@ -5318,19 +5479,19 @@ Start elevated anyway? (you will be asked if you want to allow ModOrganizer.exe El idioma del programa. Esto solo mostrara los idiomas instalados. - + Enforces that inactive ESPs and ESMs are never loaded. Se asegura que no se cargan nunca los ESPs y ESMs inactivos. - + It seems that the Games occasionally load ESP or ESM files even if they haven't been activated as plugins. I don't yet know what the circumstances are, but user reports imply it is in some cases unwanted. If this is checked, ESPs and ESMs not checked in the List are invisible to the game and can not be loaded. Parece que los juegos ocasionalmente cargan archivos ESP o ESM, incluso si ellos todavía no se ha activado como plugins. No, pero sabe cuáles son las circunstancias, pero informes de usuario implican en algunos casos no deseados. Si esto se comprueba, ESPs ESMs no marcadas en la lista son invisibles para el juego y no se pueden cargar. - + Hide inactive ESPs/ESMs Ocultar ESPs/ESMs inactivos @@ -5348,72 +5509,77 @@ p, li { white-space: pre-wrap; } - + Disable automatic internet features - + Disable automatic internet features. This does not affect features that are explicitly invoked by the user (like checking mods for updates, endorsing, opening the web browser) - + Offline Mode - + Use a proxy for network connections. - + Use a proxy for network connections. This uses the system-wide settings which can be configured in Internet Explorer. Please note that MO will start up a few seconds slower on some systems when using a proxy. - + Use HTTP Proxy (Uses System Settings) - - Known Servers (Dynamically updated every download) - - - - + Preferred Servers (Drag & Drop) - + Workarounds Soluciones - + Load Mechanism Mecamismo de carga - + Select loading mechanism. See help for details. Selecciona la forma de cargar. Mira la ayuda para detalles. - + Steam App ID Steam App ID - + + Associate with "Download with manager" links + + + + + Known Servers (updated on download) + + + + The Steam AppID for your game El AppID de tu juego - + <!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; } @@ -5588,12 +5754,12 @@ p, li { white-space: pre-wrap; } Inicio automatico en Nexus - + Username Usuario - + Password Contraseña @@ -5602,42 +5768,42 @@ p, li { white-space: pre-wrap; } Manejar enlaces NXM - + Plugins - + Author: - + Version: - + Description: - + Key - + Value - + Blacklisted Plugins (use <del> to remove): - + Mod Organizer needs a dll to be injected into the game so all mods are visible to it. There are several means to do this: *Mod Organizer* (default) In this mode the Mod Organizer itself injects the dll. The disadvantage is that you always have to start the game through MO or a link created by it. @@ -5648,17 +5814,17 @@ If you use the Steam version of Oblivion the default will NOT work. In this case - + NMM Version - + The Version of Nexus Mod Manager to impersonate. - + Mod Organizer uses an API provided by the Nexus to provide features like checking for updates and downloading files. Unfortunately this API has not been made available officially to third party tools like MO so we have to impersonate the Nexus Mod Manager to be allowed in. On top of this Nexus has used the client identification to lock out outdated versions of NMM to force users to update. This means that MO also needs to impersonate the new version of NMM even if MO doesn't need an update. Therefore you can configure the version to identify as here. Please note that MO does identify itself as MO to the webserver, it's not lying about what it is. It is merely adding a "compatible" NMM version to the user agent. @@ -5667,36 +5833,36 @@ tl;dr-version: If Nexus-features don't work, insert the current version num - + If checked, files (i.e. esps, esms and bsas) belonging to the core game can not be disabled in the UI. (default: on) - + If checked, files (i.e. esps, esms and bsas) belonging to the core game can not be disabled in the UI. (default: on) Uncheck this if you want to use Mod Organizer with total conversions (like Nehrim) but be aware that the game will crash if required files are not enabled. - + Force-enable game files - - + + For Skyrim, this can be used instead of Archive Invalidation. It should make AI redundant for all Profiles. For the other games this is not a sufficient replacement for AI! Para Skyrim, puede utilizarse en lugar de invalidación de archivo. Debe despedir AI para todos los perfiles. Para los otros juegos no es un sustituto suficiente AI! - + Back-date BSAs Back-date BSAs - + These are workarounds for problems with Mod Organizer. Please make sure you read the help text before changing anything here. @@ -5705,27 +5871,27 @@ Para los otros juegos no es un sustituto suficiente AI! Estas son soluciones para problemas con Mod Organizer. Normalmente no son necesarios. Por favor, asegúrese de leer el texto de ayuda antes de cambiar cualquier cosa aquí. - + Select download directory - + Select mod directory - + Select cache directory - + Confirm? - + This will make all dialogs show up again where you checked the "Remember selection"-box. Continue? diff --git a/src/organizer_fr.ts b/src/organizer_fr.ts index 2ddc1097..c283cb71 100644 --- a/src/organizer_fr.ts +++ b/src/organizer_fr.ts @@ -1,6 +1,50 @@ + + AboutDialog + + + + About + + + + + Revision: + + + + + Used Software + + + + + Credits + + + + + Translators + + + + + Others + + + + + Close + Fermer + + + + No license + + + ActivateModsDialog @@ -240,25 +284,30 @@ p, li { white-space: pre-wrap; } DownloadList - + Name Nom - + Filetime Date du fichier - + Done Terminé - + Information missing, please select "Query Info" from the context menu to re-retrieve. Information manquante, veuillez sélectionner "Demander info" dans le menu contextuel pour récupérer. + + + pending download + + DownloadListWidget @@ -311,125 +360,135 @@ p, li { white-space: pre-wrap; } DownloadListWidgetCompactDelegate - - - - + + + + Are you sure? Êtes-vous certain? - + This will remove all finished downloads from this list and from disk. Ceci supprimera tous les téléchargements complétés de la liste et du disque. - + This will remove all installed downloads from this list and from disk. Ceci supprimera tous les téléchargements installés de cette liste et du disque. - + Install Installer - + Query Info Demander info - + Remove Supprimer - + Cancel Annuler - + + < mod %1 file %2 > + + + + + Pending + + + + Paused - + Fetching Info 1 - + Fetching Info 2 - + Installed - + Uninstalled - + Done Terminé - + This will permanently remove all finished downloads from this list (but NOT from disk). - + This will permanently remove all installed downloads from this list (but NOT from disk). - + Delete - + Un-Hide - + Remove from View - + Pause Interrompre - + Resume Reprendre - + Delete Installed... - + Delete All... - + Remove Installed... Supprimer installé... - + Remove All... Supprimer tout... @@ -437,68 +496,78 @@ p, li { white-space: pre-wrap; } DownloadListWidgetDelegate - - - - + + + + Are you sure? Êtes-vous certain? - + This will remove all finished downloads from this list and from disk. Ceci supprimera tous les téléchargements complétés de la liste et du disque. - + This will remove all installed downloads from this list and from disk. Ceci supprimera tous les téléchargements installés de la liste et du disque. - + This will remove all finished downloads from this list (but NOT from disk). - + This will remove all installed downloads from this list (but NOT from disk). - + Install Installer - + Query Info Demander info - + Delete - + Un-Hide - + Remove from View - + Remove Supprimer - + Cancel Annuler + + + < mod %1 file %2 > + + + + + Pending + + Fetching Info 1 @@ -510,32 +579,32 @@ p, li { white-space: pre-wrap; } - + Pause Interrompre - + Resume Reprendre - + Delete Installed... - + Delete All... - + Remove Installed... Supprimer installé... - + Remove All... Supprimer tout... @@ -548,78 +617,83 @@ p, li { white-space: pre-wrap; } - + Download again? - + A file with the same name has already been downloaded. Do you want to download it again? The new file will receive a different name. - + failed to download %1: could not open output file: %2 impossible de télécharger %1: impossible d'écrire le fichier %2 - + Wrong Game - + The download link is for a mod for "%1" but this instance of MO has been set up for "%2". - + failed to delete %1 impossible de supprimer %1 - + failed to delete meta file for %1 impossible de supprimer le méta fichier pour %1 - - - - - - + + + + + + invalid index %1 index invalide %1 - + Information updated Information mise à jour - - + + No matching file found on Nexus! Maybe this file is no longer available or it was renamed? Aucun fichier correspondant trouvé sur Nexus! Peut-être ce fichier n'est-il plus disponible ou a été renommé? - + No file on Nexus matches the selected file by name. Please manually choose the correct one. Aucun fichier sur Nexus ne correspond au nom du fichier sélectionné. Veuillez s'il-vous-plaît sélectionner le bon manuellement. - + No download server available. Please try again later. - + Failed to request file info from nexus: %1 Impossible de demander l'info du fichier sur Nexus: %1 - + + Download failed. Server reported: %1 + + + + Download failed: %1 (%2) Téléchargement échoué: %1 (%2) @@ -628,30 +702,31 @@ p, li { white-space: pre-wrap; } impossible de supprimer le fichier - - - - - - - - - - - - - - + + + + + + + + + + + + + + + invalid index index invalide - + Please enter the nexus mod id Veuillez entre l'ID Nexus du mod - + Mod ID: ID du mod: @@ -668,7 +743,7 @@ p, li { white-space: pre-wrap; } Téléchargement échoué - + failed to re-open %1 impossible d'ouvrir à nouveau %1 @@ -776,7 +851,7 @@ Right now the only case I know of where this needs to be overwritten is for the - + If checked, MO will be closed once the specified executable is run. Si cochée, MO sera fermé une fois que le programme sélectionné sera démarré. @@ -793,7 +868,7 @@ Right now the only case I know of where this needs to be overwritten is for the - + Add Ajouter @@ -809,42 +884,59 @@ Right now the only case I know of where this needs to be overwritten is for the Supprimer - + + Close + Fermer + + + Select a binary Choisir un programme - + Executable (%1) - + Java (32-bit) required - + MO requires 32-bit java to run this application. If you already have it installed, select javaw.exe from that installation as the binary. - + Select a directory - + Confirm Confirmer - + Really remove "%1" from executables? - + + + Save Changes? + + + + + + You made changes to the current executable, do you want to save them? + + + + MO must be kept running or this application will not work correctly. @@ -853,7 +945,7 @@ Right now the only case I know of where this needs to be overwritten is for the Programme (*.exe *.bat) - + Modify Modifier @@ -1206,7 +1298,7 @@ p, li { white-space: pre-wrap; } MO est vérouillé pendant que le programme s'exécute. - + Unlock Dévérouiller @@ -1214,7 +1306,7 @@ p, li { white-space: pre-wrap; } LogBuffer - + failed to write log to %1: %2 @@ -1235,23 +1327,23 @@ p, li { white-space: pre-wrap; } MainWindow - - + + Categories Catégories - + Profile Profil - + Pick a module collection Choisissez un profil - + <!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; } @@ -1266,44 +1358,44 @@ p, li { white-space: pre-wrap; } <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt;">Veuillez noter que pour l'instant, l'ordre de chargement des ESPs est commun à tous les profils.</span></p></body></html> - + Refresh list Actualiser la liste - + Refresh list. This is usually not necessary unless you modified data outside the program. Actualiser la liste. Normalement inutile à moins que vous n'ayez modifié des données à l'extérieur du programme. - + List of available mods. - + This is a list of installed mods. Use the checkboxes to activate/deactivate mods and drag & drop mods to change their "installation" orders. - + Filter Flitre - + No groups - + Nexus IDs IDs Nexus - - - + + + Namefilter @@ -1312,12 +1404,12 @@ p, li { white-space: pre-wrap; } Lancement - + Pick a program to run. Choisissez un programme à lancer. - + <!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; } @@ -1332,12 +1424,12 @@ p, li { white-space: pre-wrap; } <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt;">Vous pouvez ajouter d'autres outils à la liste, mais je ne peut garantir que les outils que je n'ai pas testé fonctionneront.</span></p></body></html> - + Run program Lancer le programme - + <!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; } @@ -1350,17 +1442,17 @@ p, li { white-space: pre-wrap; } <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt;">Exécuter le programme sélectionné avec ModOrganizer actif.</span></p></body></html> - + Run Lancer - + Create a shortcut in your start menu or on the desktop to the specified program - + <!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; } @@ -1373,7 +1465,7 @@ p, li { white-space: pre-wrap; } <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt;">Crée un raccourci dans le menu Démarrer qui lance directement le programme sélectionné avec MO actif.</span></p></body></html> - + Shortcut @@ -1398,12 +1490,12 @@ p, li { white-space: pre-wrap; } Enregistrer - + List of available esp/esm files Liste des fichiers ESP/ESM disponibles - + <!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; } @@ -1416,12 +1508,12 @@ p, li { white-space: pre-wrap; } <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt;">Cette liste contient tous les ESPs et ESMs contenus dans les mods actifs. Ceux-ci requièrent leur propre ordre de chargement. Utilisez le glisser-déposer pour modifier cet ordre. Veuillez noter que MO enregistre l'ordre de chargement seulement pour les mods actif/cochés.<br />Il y a un excellent outil nommé &quot;BOSS&quot; qui classe automatiquement ces fichiers.</span></p></body></html> - + List of available BS Archives. Archives not checked here are not managed by MO and ignore installation order. - + BSA files are archives (comparable to .zip files) that contain data assets (meshes, textures, ...) to be used by the game. As such they "compete" with loose files in your data directory over which is loaded. By default, BSAs that share their base name with an enabled ESP (i.e. plugin.esp and plugin.bsa) are automatically loaded and will have precedence over all loose files, the installation order you set up to the left is then ignored! @@ -1429,66 +1521,71 @@ BSAs checked here are loaded in such a way that your installation order is obeye - - + + File Fichier - + <html><head/><body><p>Marked Archives (<img src=":/MO/gui/warning_16"/>) are still loaded on Skyrim but the <a href="http://forums.bethsoft.com/topic/1354395-update-bsas-and-you/"><span style=" text-decoration: underline; color:#0000ff;">regular file override</span></a> mechanism will apply: Loose files override BSAs, no matter the mod/plugin priority.</p></body></html> - + Mod Mod - + Data DATA - + + Sort + + + + refresh data-directory overview Actualiser la vue d'ensemble du dossier DATA - + Refresh the overview. This may take a moment. Actualiser la vue d'ensemble. Ceci peut demander un moment. - - - + + + Refresh Actualiser - + This is an overview of your data directory as visible to the game (and tools). Ceci est une vue d'ensemble du dossier DATA tel qu'il apparaît pour le jeu (et les outils). - - + + Filter the above list so that only conflicts are displayed. Filtrer la liste ci-dessus pour afficher seulement les conflits. - + Show only conflicts Afficher seulement les conflits - + Saves Sauvegardes - + <!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; } @@ -1505,160 +1602,160 @@ p, li { white-space: pre-wrap; } <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt;">Si vous cliquez &quot;Réparer Mods...&quot; dans le menu contextuel, MO tentera d'activer tous les mods, ESPs et ESMs nécessaires pour résoudre le problème. Rien ne sera désactivé!</span></p></body></html> - + Downloads Téléchargements - + This is a list of mods you downloaded from Nexus. Double click one to install it. Ceci est une liste de mods que vous avez téléchargé de Nexus. Double-cliquez en un pour l'installer. - + Compact - + Show Hidden - + Tool Bar Barre d'outils - + Install Mod Installer mod - + Install &Mod Installer &mod - + Install a new mod from an archive Installer un nouveau mod à partir d'une archive - + Ctrl+M Ctrl+M - + Profiles Profils - + &Profiles &Profils - + Configure Profiles Configurer les profils - + Ctrl+P Ctrl+P - + Executables Programmes - + &Executables Programm&es - + Configure the executables that can be started through Mod Organizer Configure les programmes pouvant être lancés via Mod Organizer - + Ctrl+E Ctrl+E - - + + Tools - + &Tools - + Ctrl+I Ctrl+H - + Settings Réglages - + &Settings Réglage&s - + Configure settings and workarounds Configurer les réglages et solutions de rechange - + Ctrl+S Ctrl+S - + Nexus Nexus - + Search nexus network for more mods Effectuer une recherche sur Nexus pour plus de mods - + Ctrl+N Ctrl+N - - + + Update - + Mod Organizer is up-to-date Mod Organizer est à jour - - + + No Problems - + This button will be highlighted if MO discovered potential problems in your setup and provide tips on how to fix them. !Work in progress! @@ -1666,496 +1763,497 @@ Right now this has very limited functionality - - + + Help Aide - + Ctrl+H Ctrl+H - + Endorse MO - - + + Endorse Mod Organizer - + Toolbar - + Desktop - + Start Menu - + Problems - + There are potential problems with your setup - + Everything seems to be in order - + Help on UI - + Documentation Wiki - + Report Issue - + Tutorials - + failed to save load order: %1 impossible d'enregistrer l'ordre de chargement: %1 - + failed to save archives order, do you have write access to "%1"? - + + About + + + + + About Qt + + + + Name Nom - + Please enter a name for the new profile Veuillez inscrire un nom pour le nouveau profil - + failed to create profile: %1 impossible de créer le profil: %1 - + Show tutorial? - + You are starting Mod Organizer for the first time. Do you want to show a tutorial of its basic features? If you choose no you can always start the tutorial from the "Help"-menu. - + Downloads in progress Téléchargements en cours - + There are still downloads in progress, do you really want to quit? Il encore des téléchargements en cours, voulez-vous vraiment quitter? - + failed to read savegame: %1 impossible de lire la sauvegarde: %1 - + Plugin "%1" failed: %2 - + Plugin error - + It appears the plugin "%1" failed to load last startup and caused MO to crash. Do you want to disable it? (Please note: If this is the first time you see this message for this plugin you may want to give it another try. The plugin may be able to recover from the problem) - + Failed to start "%1" - + Waiting Attente - + Please press OK once you're logged into steam. Veuillez cliquer OK une fois connecté à steam. - "%1" not found - "%1" introuvable + "%1" introuvable - + Start Steam? - + Steam is required to be running already to correctly start the game. Should MO try to start steam now? - + Also in: <br> - + No conflict Aucun conflit - + <Edit...> <Modifier...> - - Failed to refresh list of esps: %s - - - - + This bsa is enabled in the ini file so it may be required! - + This archive will still be loaded since there is a plugin of the same name but its files will not follow installation order! - + Activating Network Proxy - - + + Installation successful Installation réussie - - + + Configure Mod Configurer mod - - + + This mod contains ini tweaks. Do you want to configure them now? Ce mod contient des ajustement pour les fichiers ini. Désirez-vous les configurer maintenant? - - + + mod "%1" not found - - + + Installation cancelled - - + + The mod was not installed completely. - + Some plugins could not be loaded - + Too many esps and esms enabled - - + + Description missing - + The game doesn't allow more than 255 active plugins (including the official ones) to be loaded. You have to disable some unused plugins or merge some plugins into one. You can find a guide here: <a href="http://wiki.step-project.com/Guide:Merging_Plugins">http://wiki.step-project.com/Guide:Merging_Plugins</a> - + Choose Mod Choisir mod - + Mod Archive Archive de mod - + Start Tutorial? - + You're about to start a tutorial. For technical reasons it's not possible to end the tutorial early. Continue? - - + + Download started Téléchargement commencé - + failed to update mod list: %1 impossible de mettre à jour la liste de mods: %1 - + failed to spawn notepad.exe: %1 impossible de lancer notepad.exe: %1 - + failed to open %1 impossible d'ouvrir %1 - + failed to change origin name: %1 impossible de changer le nom d'origine: %1 - + Multiple esps activated, please check that they don't conflict. - - + + Create Mod... - + A mod with this name already exists - + Continue? - + The versioning scheme decides which version is considered newer than another. This function will guess the versioning scheme under the assumption that the installed version is outdated. - + + Sorry - + I don't know a versioning scheme where %1 is newer than %2. - + <All> <Tous> - + <Checked> <Cochés> - + Plugin "%1" failed - + failed to init plugin %1: %2 - + The following plugins could not be loaded. The reason may be missing dependencies (i.e. python) or an outdated version: - - Failed to move "%1" from mod "%2" to "%3": %4 - - - - + <Unchecked> <Décochés> - + <Update> <Rafraichir> - + <No category> - + <Conflicted> - + <Not Endorsed> - + failed to rename mod: %1 impossible de renommer le mod: %1 - + Overwrite? - + This will replace the existing mod "%1". Continue? - + failed to remove mod "%1" - - - + + + failed to rename "%1" to "%2" - - - + + + + Confirm Confirmer - + Remove the following mods?<br><ul>%1</ul> - + failed to remove mod: %1 - - + + Failed - + Installation file no longer exists - + Mods installed with old versions of MO can't be reinstalled in this way. - - + + You need to be logged in with Nexus to endorse - - + + Extract BSA - + This mod contains at least one BSA. Do you want to unpack it? (This removes the BSA after completion. If you don't know about BSAs, just select no) - - - + + + failed to read %1: %2 Échec de lecture %1: %2 - - + + This archive contains invalid hashes. Some files may be broken. - + Nexus ID for this Mod is unknown @@ -2168,92 +2266,92 @@ This function will guess the versioning scheme under the assumption that the ins Choisir priorité - + Really enable all visible mods? - + Really disable all visible mods? - + Choose what to export - + Everything - + All installed mods are included in the list - + Active Mods - + Only active (checked) mods from your current profile are included - + Visible - + All mods visible in the mod list are included - + export failed: %1 - + Install Mod... Installer mod... - + Enable all visible Activer tous les mods visibles - + Disable all visible Désactiver tous les mods visibles - + Check all for update Vérifier toutes les mises à jour - + Export to csv... - + Sync to Mods... - + Restore Backup - + Remove Backup... @@ -2262,312 +2360,362 @@ This function will guess the versioning scheme under the assumption that the ins Assigner catégorie - + Primary Category - + Change versioning scheme - + Un-ignore update - + Ignore update - + Rename Mod... Renommer mod... - + Remove Mod... Supprimer mod... - + Reinstall Mod - + Un-Endorse - - + + Endorse - + Won't endorse - + Endorsement state unknown - + Ignore missing data - + Visit on Nexus - + Open in explorer - + Information... Information... - - + + Exception: - - + + Unknown exception - + <Multiple> - + + Really delete "%1"? + + + + Fix Mods... Réparer mods... - - + + Delete + + + + + failed to remove %1 Impossible de supprimer %1 - - + + failed to create %1 impossible de créer %1 - + Can't change download directory while downloads are in progress! - + Download failed - + failed to write to file %1 impossible d'écrire dans le fichier %1 - + %1 written %1 écrit - + Select binary - + Binary Programme - + Enter Name - + Please enter a name for the executable - + Not an executable - + This is not a recognized executable. - - + + Replace file? - + There already is a hidden version of this file. Replace it? - - + + File operation failed - - + + Failed to remove "%1". Maybe you lack the required file permissions? - + There already is a visible version of this file. Replace it? - + + file not found: %1 + fichier introuvable: %1 + + + + failed to generate preview for %1 + + + + + Sorry, can't preview anything. This function currently does not support extracting from bsas. + + + + Update available Mise à jour disponible - + Open/Execute - + Add as Executable - + + Preview + + + + Un-Hide - + Hide - + Write To File... Écriture du fichier... - + Do you want to endorse Mod Organizer on %1 now? - + Remove Supprimer - + Unlock load order - + Lock load order - + + BOSS working + + + + + failed to run boss: %1 + + + + Request to Nexus failed: %1 - + + Executable "%1" not found + + + + + Failed to refresh list of esps: %1 + + + + This will move all files from overwrite into a new, regular mod. Please enter a name: - + Add/Remove Categories - + Replace Categories - - + + login successful - + login failed: %1. Trying to download anyway - + login failed: %1 - + login failed: %1. You need to log-in with Nexus to update MO. - + Error Erreur - + failed to extract %1 (errorcode %2) - + Extract... - + Edit Categories... - + Enable all - + Disable all @@ -2610,58 +2758,58 @@ Please enter a name: Info sur le mod - + Textfiles Fichiers texte - + A list of text-files in the mod directory. Une liste des fichiers texte de ce mod. - + A list of text-files in the mod directory like readmes. Une liste des fichiers texte de ce mod, comme les lisez-moi. - + INI-Files Fichiers INI - + This is a list of .ini files in the mod. Ceci est une liste des fichiers .ini présents dans le mod. - + This is a list of .ini files in the mod. These are usually used to configure the behaviour of mods if there are configurable parameters. Ceci est une liste des fichiers .ini présents dans le mod. Ils sont généralement utilisés pour configurer le comportement du mod lorsqu'il y a des paramètres configurables. - + Save changes to the file. Enregistre les changements au fichier. - + Save changes to the file. This overwrites the original. There is no automatic backup! Enregistrer les changements au fichier. Ceci écrase l'original. Il n'y a pas de copie de sauvegarde automatique! - - + + Save Enregistrer - + Images Images - + Images located in the mod. Images présentes dans le mod. @@ -2678,13 +2826,13 @@ p, li { white-space: pre-wrap; } <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt;">Ceci est la liste de toutes les images (.jpg et .png) présentes dans le dossier du mod, telles captures d'écran et autres. Cliquez-en une pour une vue aggrandie.</span></p></body></html> - - + + Optional ESPs ESPs optionnels - + List of esps and esms that can not be loaded by the game. Liste des esps et esms ne pouvant pas être chargés par le jeu. @@ -2707,12 +2855,12 @@ p, li { white-space: pre-wrap; } <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt;">La plupart des mods ne contenant pas d'esps optionnels, il est très probable que cette liste soit vide.</span></p></body></html> - + This lists all the images (.jpg and .png) in the mod directory, like screenshots and such. Click one to get a larger view. - + List of esps and esms contained in this plugin that currently can not be loaded by the game. They will not even appear in the esp-list in the main MO-window. They usually contain optional functionality, see the readme. @@ -2720,103 +2868,103 @@ Most mods do not have optional esps, so chances are good you are looking at an e - + Make the selected mod in the lower list unavailable. Rendre le mod sélectionné dans la liste du bas non-disponible. - + The selected esp (in the lower list) will be pushed into a subdirectory of the mod and will thus become "invisible" to the game. It can then no longer be activated. L'ESP sélectionné (dans la liste inférieure) sera poussé dans un sous-dossier du mod et deviendra ainsi "invisible" pour le jeu. Il ne pourra alors plus être activé. - + Move a file to the data directory. Déplacer un fichier vers le dossier DATA. - + This moves a esp to the esp directory so it can be enabled in the main window. Please note that the ESP merely becomes "available", it will not necessarily be loaded! That is configured in the main window of omo. Ceci déplace un ESP vers le répertoire DATA afin qu'il puisse être activé dans la fenêtre principale. Veuillez noter que l'ESP devient simplement "disponible", il ne sera pas nécessairement chargé. Celà doit être configuré dans la fenêtre principale de MO. - + ESPs in the data directory and thus visible to the game. ESPs dans le dossier DATA et donc visibles par le jeu. - + These are the mod files that are in the (virtual) data directory of your game and will thus be selecteable in the esp list in the main window. Ce sont les mods qui se trouvent dans le répertoire DATA (virtuel) de votre jeu et qu'il sera donc possible de sélectionner dans la fenêtre principale. - + Available ESPs ESPs disponibles - + Conflicts - + The following conflicted files are provided by this mod - - + + File Fichier - + Overwritten Mods - + The following conflicted files are provided by other mods - + Providing Mod - + Non-Conflicted files - + Categories Catégories - + Primary Category - + Nexus Info Info de Nexus - + Mod ID ID du mod - + Mod ID for this mod on Nexus. ID de ce mod sur Nexus. - + <!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; } @@ -2834,7 +2982,7 @@ p, li { white-space: pre-wrap; } <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">ID de ce mod sur Nexus. Rempli automatiquement si vous téléchargez et installez un mod à partir de MO. Sinon, vous pouvez l'inscrire manuellement. Pour connaître le bon ID, trouvez le mod sur Nexus. L'URL ressemblera à ceci: <a href=" http://www.skyrimnexus.com/downloads/file.php?id=1334"><span style=" text-decoration: underline; color:#0000ff;">http://www.skyrimnexus.com/downloads/file.php?id=1334</span></a><a href="http://www.skyrimnexus.com/downloads/file.php?id=1334"><span style=" color:#000000;">. Dans cet example, 1334 est l'ID que vous cherchez. En passant: Ce lien est celui de Mod Organizer sur le Nexus. Pourquoi ne pas le visiter et lui donner votre aval?</span></a></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; } @@ -2847,32 +2995,32 @@ p, li { white-space: pre-wrap; } <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt;">Version du mod installée La bulle contient la version courrante disponible sur Nexus. La version installé n'est réglée que si vous installez le mod avec MO.</span></p></body></html> - + Version Version - + Refresh Actualiser - + Refresh all information from Nexus. - + Description Description - + <!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:'MS Shell Dlg 2'; font-size:7.8pt; font-weight:400; font-style:normal;"> -<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /></p></body></html> +</style></head><body style=" font-family:'MS Shell Dlg 2'; font-size:8.25pt; font-weight:400; font-style:normal;"> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:8pt;"><br /></p></body></html> @@ -2892,7 +3040,7 @@ p, li { white-space: pre-wrap; } Type - + Name Nom @@ -2901,12 +3049,12 @@ p, li { white-space: pre-wrap; } Taille (kB) - + Endorse - + Notes @@ -2919,17 +3067,17 @@ p, li { white-space: pre-wrap; } Avez-vous donné votre aval à ce mod? - + Filetree Arborescence - + A directory view of this mod Une vue du dossier de ce mod - + <!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; } @@ -2944,70 +3092,70 @@ p, li { white-space: pre-wrap; } <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt;">Les changements sont immédiatement appliqués sur le disque, alors</span><span style=" font-size:8pt; font-weight:600;"> soyez prudent</span><span style=" font-size:8pt;">.</span></p></body></html> - + Previous - + Next - + Close Fermer - + &Delete Again, english accelerator not applicable. French would use S&upprimer for this one. Supprimer - + &Rename &Renommer - + &Open &Ouvrir - + &New Folder &Nouveau dossier - - + + Save changes? Enregistrer les changements? - + File Exists Un fichier du même nom existe - + A file with that name exists, please enter a new one Un fichier ainsi nommé existe déjà, veuillez entrer un nouveau nom - + failed to move file impossible de déplacer le fchier - + failed to create directory "optional" Impossible de créer le dossier "optional" - - + + Info requested, please wait Info demandée, veuillez patienter @@ -3017,133 +3165,133 @@ p, li { white-space: pre-wrap; } (description incomplète, veuillez vérifier sur Nexus) - + Current Version: %1 Version courante: %1 - + No update available Aucune mise-à-jour disponible - + Main Principal - + &Hide - + &Unhide - - + + Save changes to "%1"? - + Update Mise-à-jour - + Optional Optionnel - + Old Ancien - + Misc Divers - + Unknown Inconnu - + (description incomplete, please visit nexus) - - + + Replace file? - + There already is a hidden version of this file. Replace it? - - + + File operation failed - - + + Failed to remove "%1". Maybe you lack the required file permissions? - - + + failed to rename %1 to %2 - + There already is a visible version of this file. Replace it? - + Un-Hide - + Hide - + Please enter a name - - + + Error Erreur - + Invalid name. Must be a valid file name - + A tweak by that name exists - + Create Tweak @@ -3152,13 +3300,13 @@ p, li { white-space: pre-wrap; } la requête à échouée - + <a href="%1">Visit on Nexus</a> <a href="%1">Visiter sur Nexus</a> - - + + Confirm Confirmer @@ -3171,28 +3319,28 @@ p, li { white-space: pre-wrap; } Téléchargement commencé - + Failed to delete %1 impossible d'effacer %1 - + Are sure you want to delete "%1"? Voulez-vous vraiment supprimer "%1"? - + Are sure you want to delete the selected files? Voulez-vous vraiment supprimer les fichiers sélectionnés? - - + + New Folder Nouveau dossier - + Failed to create "%1" Impossible de créer "%1" @@ -3239,8 +3387,9 @@ p, li { white-space: pre-wrap; } - installed version: %1, newest version: %2 - Version installée: %1, dernière version: %2 + installed version: "%1", newest version: "%2" + installed version: %1, newest version: %2 + Version installée: %1, dernière version: %2 %1 contains no esp/esm and no asset (textures, meshes, interface, ...) directory @@ -3511,17 +3660,17 @@ p, li { white-space: pre-wrap; } NexusInterface - + Failed to guess mod id for "%1", please pick the correct one - + empty response - + invalid response @@ -4242,85 +4391,89 @@ p, li { white-space: pre-wrap; } PluginList - + Mod Index - - + + Flags + + + + + unknown - + Name of your mods - + Load priority of your mod. The higher, the more "important" it is and thus overwrites data from plugins with lower priority. - + The modindex determins the formids of objects originating from this mods. - + failed to update esp info for file %1 (source id: %2), error: %3 - + esp not found: %1 ESP introuvable: %1 - + Confirm Confirmer - + Really enable all plugins? - + Really disable all plugins? - + The file containing locked plugin indices is broken - - - failed to open output file: %1 + + Some of your plugins have invalid names! These plugins can not be loaded by the game. Please see mo_interface.log for a list of affected plugins and rename them. - - Some of your plugins have invalid names! These plugins can not be loaded by the game. Please see mo_interface.log for a list of affected plugins and rename them. + + BOSS dll incompatible - + Missing Masters - + Enabled Masters - + failed to restore load order for %1 @@ -4333,17 +4486,17 @@ p, li { white-space: pre-wrap; } max - + This plugin can't be disabled (enforced by the game) - + Origin: %1 - + Name Nom @@ -4352,7 +4505,7 @@ p, li { white-space: pre-wrap; } Les noms de vos mods - + Priority Priorité @@ -4369,6 +4522,19 @@ p, li { white-space: pre-wrap; } Cet index détermine l'ID des items, sorts, ... introduits par le mod. Leur ID sera "xxyyyyyy", où "xx" est cet index et "yyyyyy" est déterminé par le mod lui-même. + + PreviewDialog + + + Preview + + + + + Close + Fermer + + ProblemsDialog @@ -4414,82 +4580,72 @@ p, li { white-space: pre-wrap; } impossible d'appliquer les ajustements aux fichiers ini - + invalid profile name %1 - + failed to create %1 impossible de créer %1 - - failed to open temporary file - - - - - failed to open "%1" for writing - - - - + failed to write mod list: %1 - + failed to update tweaked ini file, wrong settings may be used: %1 - + failed to create tweaked ini: %1 - + Overwrite directory couldn't be parsed - + invalid priority %1 priorité invalide %1 - + failed to parse ini file (%1) - + failed to parse ini file (%1): %2 - - + + failed to modify "%1" - + Delete savegames? - + Do you want to delete local savegames? (If you select "No", the save games will show up again if you re-enable local savegames) - - - - - + + + + + invalid index %1 index invalide %1 @@ -4866,12 +5022,12 @@ p, li { white-space: pre-wrap; } Impossible de mettre en place le chargement via DLL par procuration - + "%1" is missing "%1" manquant - + Permissions required Permissions requises @@ -4880,50 +5036,50 @@ p, li { white-space: pre-wrap; } Le compte d'usager actuel n'a pas les accès requis pour lancer Mod Organizer. Les changements nécessaires peuvent être effectués automatiquement (le dossier de MO sera rendu inscriptible pour le compte d'usager actuel). Vous devrez accepter que "mo_helper.exe" soit lancé avec les permissions administrateur. - - + + Woops - + The current user account doesn't have the required access rights to run Mod Organizer. The neccessary changes can be made automatically (the MO directory will be made writable for the current user account). You will be asked to run "helper.exe" with administrative rights. - + ModOrganizer has crashed! Should a diagnostic file be created? If you send me this file (%1) to sherb@gmx.net, the bug is a lot more likely to be fixed. Please include a short description of what you were doing when the crash happened - + ModOrganizer has crashed! Unfortunately I was not able to write a diagnostic file: %1 - - + + Mod Organizer Mod Organizer - + An instance of Mod Organizer is already running Une copie du Mod Organizer tourne déjà - + No game identified in "%1". The directory is required to contain the game binary and its launcher. - - + + Please select the game to manage Veuillez choisir le jeu à gérer - + Please select the game edition you have (MO can't start the game correctly if this is set incorrectly!) @@ -4932,39 +5088,39 @@ p, li { white-space: pre-wrap; } "%1" introuvable - + Please use "Help" from the toolbar to get usage instructions to all elements Veuillez utiliser l'aide dans la barre d'outil pour obtenir des instructions à propos de tous les éléments - - + + <Manage...> <Gérer...> - + failed to parse profile %1: %2 impossible d'analyser le profil %1: %2 - - + + failed to find "%1" impossible de trouver "%1" - + failed to access %1 impossible d'accéder à %1 - + failed to set file time %1 impossible de changer la date du fichier %1 - + failed to create %1 impossible de créer %1 @@ -5003,12 +5159,12 @@ p, li { white-space: pre-wrap; } Français - + Script Extender Extenseur de script - + Proxy DLL DLL par procuration @@ -5033,22 +5189,22 @@ Start elevated anyway? (you will be asked if you want to allow ModOrganizer.exe - + failed to spawn "%1": %2 impossible de lancer "%1": %2 - + "%1" doesn't exist "%1" inexistant - + failed to inject dll into "%1": %2 impossible d'injecter le DLL dans "%1": %2 - + failed to run "%1" impossible de lancer "%1" @@ -5107,6 +5263,11 @@ Start elevated anyway? (you will be asked if you want to allow ModOrganizer.exe invalid game type %1 + + + failed to open temporary file + + QueryOverwriteDialog @@ -5342,18 +5503,18 @@ Start elevated anyway? (you will be asked if you want to allow ModOrganizer.exe Les droits administrateur sont requis pour changer ceci. - - + + attempt to store setting for unknown plugin "%1" - + Confirm Confirmer - + Changing the mod directory affects all your profiles! Mods not present (or named differently) in the new location will be disabled in all profiles. There is no way to undo this unless you backed up your profiles manually. Proceed? @@ -5506,52 +5667,57 @@ p, li { white-space: pre-wrap; } Configurer les catégories de mod - + Disable automatic internet features - + Disable automatic internet features. This does not affect features that are explicitly invoked by the user (like checking mods for updates, endorsing, opening the web browser) - + Offline Mode - + Use a proxy for network connections. - + Use a proxy for network connections. This uses the system-wide settings which can be configured in Internet Explorer. Please note that MO will start up a few seconds slower on some systems when using a proxy. - + Use HTTP Proxy (Uses System Settings) - - Known Servers (Dynamically updated every download) + + Associate with "Download with manager" links + + + + + Known Servers (updated on download) - + Preferred Servers (Drag & Drop) - + Blacklisted Plugins (use <del> to remove): - + Mod Organizer needs a dll to be injected into the game so all mods are visible to it. There are several means to do this: *Mod Organizer* (default) In this mode the Mod Organizer itself injects the dll. The disadvantage is that you always have to start the game through MO or a link created by it. @@ -5596,12 +5762,12 @@ p, li { white-space: pre-wrap; } Connexion automatique à Nexus - + Username Nom d'usager - + Password Mot de passe @@ -5610,52 +5776,52 @@ p, li { white-space: pre-wrap; } Gérer les liens NXM - + Plugins - + Author: - + Version: - + Description: - + Key - + Value - + Workarounds Solutions alternatives - + Steam App ID ID d'application Steam - + The Steam AppID for your game L'AppID Steam de votre jeu - + <!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; } @@ -5682,12 +5848,12 @@ p, li { white-space: pre-wrap; } <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt;">22380 est l'App ID que vous cherchez.</span></p></body></html> - + Load Mechanism Chargement MO - + Select loading mechanism. See help for details. Choisir la méthode de chargement. Voir l'aide pour les détails. @@ -5712,17 +5878,17 @@ p, li { white-space: pre-wrap; } <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt; font-weight:600;">DLL par procuration</span><span style=" font-size:8pt;"> Dans ce mode, MO remplace l'un des DLL du jeu par une version qui charge MO (ainsi que le DLL orginal, bien sur). Ceci fonctionnera SEULEMENT avec les jeux STEAM et n'a été testé qu'avec Skyrim. N'utilisez cette méthode que si les autres ne fonctionnent pas.</span></p></body></html> - + NMM Version - + The Version of Nexus Mod Manager to impersonate. - + Mod Organizer uses an API provided by the Nexus to provide features like checking for updates and downloading files. Unfortunately this API has not been made available officially to third party tools like MO so we have to impersonate the Nexus Mod Manager to be allowed in. On top of this Nexus has used the client identification to lock out outdated versions of NMM to force users to update. This means that MO also needs to impersonate the new version of NMM even if MO doesn't need an update. Therefore you can configure the version to identify as here. Please note that MO does identify itself as MO to the webserver, it's not lying about what it is. It is merely adding a "compatible" NMM version to the user agent. @@ -5731,53 +5897,53 @@ tl;dr-version: If Nexus-features don't work, insert the current version num - + Enforces that inactive ESPs and ESMs are never loaded. Garantie que les ESPs et ESMs inactifs ne soient jamais chargés. - + It seems that the Games occasionally load ESP or ESM files even if they haven't been activated as plugins. I don't yet know what the circumstances are, but user reports imply it is in some cases unwanted. If this is checked, ESPs and ESMs not checked in the List are invisible to the game and can not be loaded. Il semble que les jeux chargent parfois des fichiers ESP ou ESM même s'ils ne sont pas activés. Je n'en connais pas encore les circonstances, mais les rapports des usagers impliquent que dans certains cas, ce comportement est indésirable. Si vous cochez ceci, les ESPs et ESMs qui ne sotn pas cochés seront invisible pour le jeu et ne pourront pas être chargés. - + Hide inactive ESPs/ESMs Cacher les ESPs et ESMs inactifs - + If checked, files (i.e. esps, esms and bsas) belonging to the core game can not be disabled in the UI. (default: on) - + If checked, files (i.e. esps, esms and bsas) belonging to the core game can not be disabled in the UI. (default: on) Uncheck this if you want to use Mod Organizer with total conversions (like Nehrim) but be aware that the game will crash if required files are not enabled. - + Force-enable game files - - + + For Skyrim, this can be used instead of Archive Invalidation. It should make AI redundant for all Profiles. For the other games this is not a sufficient replacement for AI! Pour Skyrim, ceci peut être utilisé au lieu de l'invalidation des archives. Ça devrait rendre l'invalidation redondante pour tous les profils. Pour les autres jeux, ceci ne suffit pas à remplacer l'invalidation des archives! - + Back-date BSAs Antidater les BSAs - + These are workarounds for problems with Mod Organizer. Please make sure you read the help text before changing anything here. @@ -5786,27 +5952,27 @@ Pour les autres jeux, ceci ne suffit pas à remplacer l'invalidation des ar Ici se trouvent des solutions alternatives à certains problèmes rencontrés avec Mod Organizer. Elles ne sont normalement pas nécessaires. Soyez sûr d'avoir lu le texte d'aide avant de modifier quoi que ce soit sur cette page. - + Select download directory - + Select mod directory - + Select cache directory - + Confirm? - + This will make all dialogs show up again where you checked the "Remember selection"-box. Continue? diff --git a/src/organizer_ru.ts b/src/organizer_ru.ts index b94688b0..2a75ce82 100644 --- a/src/organizer_ru.ts +++ b/src/organizer_ru.ts @@ -1,6 +1,50 @@ + + AboutDialog + + + + About + + + + + Revision: + + + + + Used Software + + + + + Credits + + + + + Translators + + + + + Others + + + + + Close + Закрыть + + + + No license + + + ActivateModsDialog @@ -235,25 +279,30 @@ p, li { white-space: pre-wrap; } DownloadList - + Name Ð˜Ð¼Ñ - + Filetime Дата модификации - + Done Выполнено - + Information missing, please select "Query Info" from the context menu to re-retrieve. Ð˜Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ Ð¾Ñ‚ÑутÑтвует, пожалуйÑта, выберите пункт "Ð¡Ð¿Ñ€Ð°Ð²Ð¾Ñ‡Ð½Ð°Ñ Ð¸Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ" из контекÑтного меню. + + + pending download + + DownloadListWidget @@ -306,131 +355,151 @@ p, li { white-space: pre-wrap; } DownloadListWidgetCompactDelegate - + + < mod %1 file %2 > + + + + + Pending + + + + Paused ПриоÑтановлено - + Fetching Info 1 Извлечение информации 1 - + Fetching Info 2 Извлечение информации 2 - + Installed УÑтановлено - + Uninstalled Удалено - + Done Готово - - - - + + + + Are you sure? Ð’Ñ‹ уверены? - + This will remove all finished downloads from this list and from disk. Это удалит вÑе готовые загрузки из Ñтого ÑпиÑка и Ñ Ð´Ð¸Ñка. - + This will remove all installed downloads from this list and from disk. Это удалит вÑе уÑтановленные загрузки из Ñтого ÑпиÑка и Ñ Ð´Ð¸Ñка. - + This will permanently remove all finished downloads from this list (but NOT from disk). Это полноÑтью удалит вÑе завершенные загрузки из Ñтого ÑпиÑка (но ÐЕ Ñ Ð´Ð¸Ñка). - + This will permanently remove all installed downloads from this list (but NOT from disk). Это полноÑтью удалит вÑе уÑтановленные загрузки из Ñтого ÑпиÑка (но ÐЕ Ñ Ð´Ð¸Ñка). - + Install УÑтановка - + Query Info Ð¡Ð¿Ñ€Ð°Ð²Ð¾Ñ‡Ð½Ð°Ñ Ð¸Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ - + Delete Удалить - + Un-Hide Показать - + Remove from View Скрыть от проÑмотра - + Cancel Отмена - + Pause Пауза - + Remove Удаление - + Resume Возобновить - + Delete Installed... Удалить уÑтановленное... - + Delete All... Удалить вÑе... - + Remove Installed... Отменить уÑтановку - + Remove All... Удалить вÑе DownloadListWidgetDelegate + + + < mod %1 file %2 > + + + + + Pending + + Fetching Info 1 @@ -442,95 +511,95 @@ p, li { white-space: pre-wrap; } Извлечение информации 2 - - - - + + + + Are you sure? Ð’Ñ‹ уверены? - + This will remove all finished downloads from this list and from disk. Это удалит вÑе готовые загрузки из Ñтого ÑпиÑка и Ñ Ð´Ð¸Ñка. - + This will remove all installed downloads from this list and from disk. Это удалит вÑе уÑтановленные загрузки из Ñтого лиÑта и Ñ Ð´Ð¸Ñка. - + This will remove all finished downloads from this list (but NOT from disk). Это удалит вÑе готовые загрузки из Ñтого ÑпиÑка (но ÐЕ Ñ Ð´Ð¸Ñка). - + This will remove all installed downloads from this list (but NOT from disk). Это удалит вÑе уÑтановленные загрузки из Ñтого ÑпиÑка (но ÐЕ Ñ Ð´Ð¸Ñка). - + Install УÑтановить - + Query Info Ð¡Ð¿Ñ€Ð°Ð²Ð¾Ñ‡Ð½Ð°Ñ Ð¸Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ - + Delete Удалить - + Un-Hide Показать - + Remove from View Скрыть от проÑмотра - + Cancel Отмена - + Pause Пауза - + Remove Удалить - + Resume Возобновить - + Delete Installed... Удалить уÑтановленное... - + Delete All... Удалить вÑе... - + Remove Installed... Удалить уÑтановленные - + Remove All... Удалить вÑе @@ -543,111 +612,117 @@ p, li { white-space: pre-wrap; } не удалоÑÑŒ переименовать "%1" в "%2" - + Download again? Скачать Ñнова - + A file with the same name has already been downloaded. Do you want to download it again? The new file will receive a different name. Файл Ñ Ñ‚Ð°ÐºÐ¸Ð¼ именем загружен. Ð’Ñ‹ хотите загрузить его Ñнова? У него будет другое имÑ. - + failed to download %1: could not open output file: %2 не удалоÑÑŒ загрузить %1: не удалоÑÑŒ открыть выходной файл: %2 - + Wrong Game - + The download link is for a mod for "%1" but this instance of MO has been set up for "%2". - - - - - - - - - - - - - - + + + + + + + + + + + + + + + invalid index неверный Ð¸Ð½Ð´ÐµÐºÑ - + failed to delete %1 не удалоÑÑŒ удалить %1 - + failed to delete meta file for %1 не удалоÑÑŒ удалить мета-файл %1 - - - - - - + + + + + + invalid index %1 неверный Ð¸Ð½Ð´ÐµÐºÑ %1 - + Please enter the nexus mod id ПожалуйÑта, введите ID мода на Nexus - + Mod ID: ID мода: - + Information updated Ð˜Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ Ð¾Ð±Ð½Ð¾Ð²Ð»ÐµÐ½Ð° - - + + No matching file found on Nexus! Maybe this file is no longer available or it was renamed? Ðет ÑоответÑтвующих модов на Nexus! Возможно фал был удален или переименован? - + No file on Nexus matches the selected file by name. Please manually choose the correct one. Ðет ÑоответÑтвующих фалов на Nexus. Выберите файл вручную. - + No download server available. Please try again later. Сервер недоÑтупен. Попробуйте позже. - + Failed to request file info from nexus: %1 Ðе удалоÑÑŒ получить информацию о файле: %1 - + + Download failed. Server reported: %1 + + + + Download failed: %1 (%2) Загрузка не удалаÑÑŒ: %1 (%2) - + failed to re-open %1 не удалоÑÑŒ повторно открыть %1 @@ -759,7 +834,7 @@ Right now the only case I know of where this needs to be overwritten is for the - + If checked, MO will be closed once the specified executable is run. ЕÑли активно, MO будет закрыт поÑле работы иÑполнÑемого файла. @@ -776,7 +851,7 @@ Right now the only case I know of where this needs to be overwritten is for the - + Add Добавить @@ -792,47 +867,64 @@ Right now the only case I know of where this needs to be overwritten is for the Удалить - + + Close + Закрыть + + + Select a binary Указать двоичный - + Executable (%1) ИÑполнÑемые (%1) - + Java (32-bit) required ТребуетÑÑ Java (32-bit) - + MO requires 32-bit java to run this application. If you already have it installed, select javaw.exe from that installation as the binary. MO требует 32-bit java Ð´Ð»Ñ Ð·Ð°Ð¿ÑƒÑка Ñтого приложениÑ. ЕÑли он у Ð²Ð°Ñ ÑƒÐ¶Ðµ уÑтановлен, выберете javaw.exe Ð´Ð»Ñ Ñтой уÑтановки как иÑполнÑемый файл. - + Select a directory Укажите директорию - + Confirm Подтвердить - + Really remove "%1" from executables? ДейÑтвительно удалить "%1" иÑполнÑемых? - + Modify Изменить - + + + Save Changes? + + + + + + You made changes to the current executable, do you want to save them? + + + + MO must be kept running or this application will not work correctly. MO должна быть запущена или приложение не Ñможет работать правильно @@ -1116,7 +1208,7 @@ p, li { white-space: pre-wrap; } MO заблокирован, Ñ‚.к иÑполнÑемый файл запущен. - + Unlock Разблокировать @@ -1124,7 +1216,7 @@ p, li { white-space: pre-wrap; } LogBuffer - + failed to write log to %1: %2 не удалоÑÑŒ произвеÑти запиÑÑŒ в журнал %1: %2 @@ -1145,23 +1237,23 @@ p, li { white-space: pre-wrap; } MainWindow - - + + Categories Категории - + Profile Профиль - + Pick a module collection Выберете набор модулей - + <!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; } @@ -1176,54 +1268,54 @@ p, li { white-space: pre-wrap; } <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt;">Обратите внимание, что порÑдок загрузки esp одинаков Ð´Ð»Ñ Ð²Ñех профилей.</span></p></body></html> - + Refresh list Обновить ÑпиÑок - + Refresh list. This is usually not necessary unless you modified data outside the program. Обновить ÑпиÑок. Обычно в Ñтом нет необходимоÑти, пока вы не измените данные вне программы. - + List of available mods. СпиÑок доÑтупных модов. - + This is a list of installed mods. Use the checkboxes to activate/deactivate mods and drag & drop mods to change their "installation" orders. Это ÑпиÑок уÑтановленных модов. ИÑпользуйте флажки, Ð´Ð»Ñ Ð²ÐºÐ»ÑŽÑ‡ÐµÐ½Ð¸Ñ/Ð¾Ñ‚ÐºÐ»ÑŽÑ‡ÐµÐ½Ð¸Ñ Ð¼Ð¾Ð´Ð¾Ð² и перетаÑкивание модов, Ð´Ð»Ñ Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð¸Ñ… порÑдка уÑтановки. - + Filter Фильтр - + No groups Без группировки - + Nexus IDs Nexus IDs - - - + + + Namefilter Фильтр по имени - + Pick a program to run. Выберете программу Ð´Ð»Ñ Ð·Ð°Ð¿ÑƒÑка. - + <!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; } @@ -1238,12 +1330,12 @@ p, li { white-space: pre-wrap; } <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt;">Ð’Ñ‹ можете добавить новые инÑтрументы в Ñтот ÑпиÑок, но работоÑпоÑобноÑть их вÑех не гарантированна.</span></p></body></html> - + Run program ЗапуÑтить программу - + <!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; } @@ -1256,17 +1348,17 @@ p, li { white-space: pre-wrap; } <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt;">ЗапуÑтить выбранную программу Ñ Ð¿Ð¾Ð´Ð´ÐµÑ€Ð¶ÐºÐ¾Ð¹ ModOrganizer.</span></p></body></html> - + Run ЗапуÑтить - + Create a shortcut in your start menu or on the desktop to the specified program Создать Ñрлык Ð´Ð»Ñ Ð²Ñ‹Ð±Ñ€Ð°Ð½Ð½Ð¾Ð¹ программы, в меню ПуÑк или на рабочем Ñтоле. - + <!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; } @@ -1279,17 +1371,17 @@ p, li { white-space: pre-wrap; } <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt;">Создает Ñрлык в меню ПуÑк, который запуÑкает выбранную программу Ñ Ð°ÐºÑ‚Ð¸Ð²Ð½Ñ‹Ð¼ MO.</span></p></body></html> - + Shortcut Ярлык - + List of available esp/esm files СпиÑок доÑтупных esp/esm файлов - + <!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; } @@ -1302,12 +1394,17 @@ p, li { white-space: pre-wrap; } <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt;">Этот ÑпиÑок Ñодержит esp и esm файлы активных модов. Ð”Ð»Ñ Ð½Ð¸Ñ… требуетÑÑ Ð¾Ð¿Ñ€ÐµÐ´ÐµÐ»ÐµÐ½Ð½Ñ‹Ð¹ порÑдок загрузки. ИÑпользуйте перетаÑкивание Ð´Ð»Ñ Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð¿Ð¾Ñ€Ñдка загрузки. Обратите внимание, что MO Ñохранит порÑдок загрузки только Ð´Ð»Ñ Ð°ÐºÑ‚Ð¸Ð²Ð½Ñ‹Ð¼Ð¸/проверенных модов.<br />СущеÑтвует Ð·Ð°Ð¼ÐµÑ‡Ð°Ñ‚ÐµÐ»ÑŒÐ½Ð°Ñ ÑƒÑ‚Ð¸Ð»Ð¸Ñ‚Ð°, называющаÑÑÑ &quot;BOSS&quot; , ÐºÐ¾Ñ‚Ð¾Ñ€Ð°Ñ Ð°Ð²Ñ‚Ð¾Ð¼Ð°Ñ‚Ð¸Ñ‡ÐµÑки Ñортирует Ñти файлы.</span></p></body></html> - + + Sort + + + + List of available BS Archives. Archives not checked here are not managed by MO and ignore installation order. СпиÑок доÑтупных BSA. Они не отмечены здеÑÑŒ, не управлÑÑŽÑ‚ÑÑ Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ MO и игнорируют порÑдок уÑтановки. - + BSA files are archives (comparable to .zip files) that contain data assets (meshes, textures, ...) to be used by the game. As such they "compete" with loose files in your data directory over which is loaded. By default, BSAs that share their base name with an enabled ESP (i.e. plugin.esp and plugin.bsa) are automatically loaded and will have precedence over all loose files, the installation order you set up to the left is then ignored! @@ -1318,18 +1415,18 @@ BSAs checked here are loaded in such a way that your installation order is obeye BSA, отмеченные здеÑÑŒ, загружаютÑÑ Ñ‚Ð°Ðº, чтобы порÑдок уÑтановки ÑоблюдалÑÑ Ð´Ð¾Ð»Ð¶Ð½Ñ‹Ð¼ образом. - - + + File Файл - + <html><head/><body><p>Marked Archives (<img src=":/MO/gui/warning_16"/>) are still loaded on Skyrim but the <a href="http://forums.bethsoft.com/topic/1354395-update-bsas-and-you/"><span style=" text-decoration: underline; color:#0000ff;">regular file override</span></a> mechanism will apply: Loose files override BSAs, no matter the mod/plugin priority.</p></body></html> - + Mod Мод @@ -1338,50 +1435,50 @@ BSA, отмеченные здеÑÑŒ, загружаютÑÑ Ñ‚Ð°Ðº, чтобы <html><head/><body><p>Помеченые архивы (<img src=":/MO/gui/resources/dialog-warning_16.png"/>) вÑе еще загружаютÑÑ Ð² Skyrim, но <a href="http://forums.bethsoft.com/topic/1354395-update-bsas-and-you/"><span style=" text-decoration: underline; color:#0000ff;">применÑетÑÑ Ð¾Ð±Ñ‹Ñ‡Ð½Ñ‹Ð¹</span></a> механизм: Отдельные файлы перезапиÑывают BSAs, вне завиÑимоÑти от приоритета мода/плагина.</p></body></html> - + Data Данные - + refresh data-directory overview обновить обзор каталога Data - + Refresh the overview. This may take a moment. Обновление обзора. Это может занÑть некоторое времÑ. - - - + + + Refresh Обновить - + This is an overview of your data directory as visible to the game (and tools). Это обзор вашего каталога данных так, как он будет видим игре (и инÑтрументам). - - + + Filter the above list so that only conflicts are displayed. Отфильтровать вышеприведенный ÑпиÑок так, чтобы отображалиÑÑŒ только конфликты. - + Show only conflicts Показать только конфликты - + Saves Ð¡Ð¾Ñ…Ñ€Ð°Ð½ÐµÐ½Ð¸Ñ - + <!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; } @@ -1398,160 +1495,160 @@ p, li { white-space: pre-wrap; } <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt;">ЕÑли вы выберете в контекÑтном меню пункт &quot;ИÑправить моды...&quot;, MO попытаетÑÑ Ð¿Ð¾Ð´ÐºÐ»ÑŽÑ‡Ð¸Ñ‚ÑŒ вÑе моды и esp, чтобы иÑправить Ñти отÑутÑтвующие esp. Это ничего не отключит!</span></p></body></html> - + Downloads Загрузки - + This is a list of mods you downloaded from Nexus. Double click one to install it. СпиÑок модов, загруженных Ñ Nexus. Двойной клик Ð´Ð»Ñ ÑƒÑтановки. - + Compact Упаковать - + Show Hidden - + Tool Bar Панель инÑтрументов - + Install Mod УÑтановить мод - + Install &Mod УÑтановить &мод - + Install a new mod from an archive УÑтановить новый мод из архива - + Ctrl+M Ctrl+M - + Profiles Профили - + &Profiles &Профили - + Configure Profiles ÐаÑтройка профилей - + Ctrl+P Ctrl+P - + Executables Программы - + &Executables &Программы - + Configure the executables that can be started through Mod Organizer ÐаÑтройка программ, которые могут быть запущены через Mod Organizer - + Ctrl+E Ctrl+E - - + + Tools ИнÑтрументы - + &Tools &ИнÑтрументы - + Ctrl+I Ctrl+I - + Settings ÐаÑтройки - + &Settings &ÐаÑтройки - + Configure settings and workarounds ÐаÑтройка параметров и ÑпоÑобов обхода - + Ctrl+S Ctrl+S - + Nexus Nexus - + Search nexus network for more mods ПоиÑк дополнительных модов на Nexus - + Ctrl+N Ctrl+N - - + + Update Обновление - + Mod Organizer is up-to-date Mod Organizer обновлен - - + + No Problems Проблем не обнаружено - + This button will be highlighted if MO discovered potential problems in your setup and provide tips on how to fix them. !Work in progress! @@ -1562,256 +1659,260 @@ Right now this has very limited functionality ПрÑмо ÑÐµÐ¹Ñ‡Ð°Ñ Ñтот функционал Ñильно ограничен - - + + Help Справка - + Ctrl+H Ctrl+H - + Endorse MO Одобрить MO - - + + Endorse Mod Organizer Одобрить Mod Organizer - + Toolbar Панель инÑтрументов - + Desktop Рабочий Ñтол - + Start Menu Меню ПуÑк - + Problems Проблемы - + There are potential problems with your setup ЕÑть возможные проблемы Ñ Ð²Ð°ÑˆÐµÐ¹ уÑтановкой - + Everything seems to be in order КажетÑÑ Ð²ÑÑ‘ в порÑдке - + Help on UI Справка по интерфейÑу - + Documentation Wiki Wiki-Ð´Ð¾ÐºÑƒÐ¼ÐµÐ½Ñ‚Ð°Ñ†Ð¸Ñ - + Report Issue Сообщить о проблеме - + Tutorials Уроки - + + About + + + + + About Qt + + + + failed to save archives order, do you have write access to "%1"? не удалоÑÑŒ Ñохранить порÑдок архивов, у Ð²Ð°Ñ Ð¸Ð¼ÐµÐµÑ‚ÑÑ Ð´Ð¾Ñтуп на запиÑÑŒ к "%1"? - + failed to save load order: %1 не удалоÑÑŒ Ñохранить порÑдок загрузки: %1 - + Name Ð˜Ð¼Ñ - + Please enter a name for the new profile Введите Ð¸Ð¼Ñ Ð½Ð¾Ð²Ð¾Ð³Ð¾ Ð¿Ñ€Ð¾Ñ„Ð¸Ð»Ñ - + failed to create profile: %1 не удалоÑÑŒ Ñоздать профиль: %1 - + Show tutorial? Показать урок? - + You are starting Mod Organizer for the first time. Do you want to show a tutorial of its basic features? If you choose no you can always start the tutorial from the "Help"-menu. Ð’Ñ‹ запуÑтили Mod Organizer впервые. Ð’Ñ‹ хотите проÑмотреть уроки по оÑновным возможноÑÑ‚Ñм? Ð’ Ñлучае отказа вы вÑегда можете открыть уроки из меню "Помощь". - + Downloads in progress Загрузки в процеÑÑе - + There are still downloads in progress, do you really want to quit? Загрузки вÑÑ‘ ещё в процеÑÑе, вы правда хотите выйти? - + failed to read savegame: %1 не удалоÑÑŒ прочеÑть Ñохранение: %1 - + Plugin "%1" failed: %2 Плагин "%1" не удалоÑÑŒ: %2 - + Plugin "%1" failed Плагин "%1" не удалоÑÑŒ - + failed to init plugin %1: %2 не удалоÑÑŒ инициализировать плагин %1: %2 - + Plugin error - + It appears the plugin "%1" failed to load last startup and caused MO to crash. Do you want to disable it? (Please note: If this is the first time you see this message for this plugin you may want to give it another try. The plugin may be able to recover from the problem) - + Failed to start "%1" Ðе удалоÑÑŒ запуÑтить "%1" - + Waiting Ожидание - + Please press OK once you're logged into steam. Ðажмите OK как только вы войдете в Steam. - "%1" not found - "%1" не найден + "%1" не найден - + Start Steam? ЗапуÑтить Steam? - + Steam is required to be running already to correctly start the game. Should MO try to start steam now? ТребуетÑÑ Ð·Ð°Ð¿ÑƒÑ‰ÐµÐ½Ð½Ñ‹Ð¹ Steam, Ð´Ð»Ñ ÐºÐ¾Ñ€Ñ€ÐµÐºÑ‚Ð½Ð¾Ð³Ð¾ запуÑка игры. Должен ли MO попытатьÑÑ Ð·Ð°Ð¿ÑƒÑтить Steam ÑейчаÑ? - + Also in: <br> Также в: <br> - + No conflict Конфликтов нет - + <Edit...> <Правка...> - - Failed to refresh list of esps: %s - - - - + This bsa is enabled in the ini file so it may be required! Этот bsa подключен через ini, так что он может быть необходим! - + This archive will still be loaded since there is a plugin of the same name but its files will not follow installation order! Этот архив вÑе равно будет загружен, так как еÑть плагин Ñ Ð¾Ð´Ð½Ð¾Ð¸Ð¼ÐµÐ½Ð½Ñ‹Ð¼ названием, но его файлы не будут Ñледовать порÑдку уÑтановки! - + Activating Network Proxy Подключение Ñетевого прокÑи - - + + Installation successful УÑтановка завершена - - + + Configure Mod ÐаÑтройка мода - - + + This mod contains ini tweaks. Do you want to configure them now? Этот мод включает наÑтройки ini. Ð’Ñ‹ хотите наÑтроить их ÑейчаÑ? - - + + mod "%1" not found мод "%1" не найден - - + + Installation cancelled УÑтановка отменена - - + + The mod was not installed completely. Мод не был уÑтановлен полноÑтью. - + Some plugins could not be loaded Ðекоторые плагины не могут быть загружены @@ -1820,207 +1921,203 @@ Right now this has very limited functionality Следующие плагины не могут быть загружены. Причина может быть в отÑутÑтвующих завиÑимоÑÑ‚ÑÑ… (таких как python) или в уÑтаревшей верÑии:<ul> - + Too many esps and esms enabled - - + + Description missing - + The following plugins could not be loaded. The reason may be missing dependencies (i.e. python) or an outdated version: - + Choose Mod Выберете мод - + Mod Archive Ðрхив мода - + Start Tutorial? Ðачать обучение? - + You're about to start a tutorial. For technical reasons it's not possible to end the tutorial early. Continue? Ð’Ñ‹ ÑобираетеÑÑŒ открыть обучение. По техничеÑким причинам будет невозможно доÑрочно закончить обучение. Продолжить? - - + + Download started Загрузка начата - + failed to update mod list: %1 не удалоÑÑŒ обновить ÑпиÑок модов: %1 - + failed to spawn notepad.exe: %1 не удалоÑÑŒ вызвать notepad.exe: %1 - + failed to open %1 не удалоÑÑŒ открыть %1 - + failed to change origin name: %1 не удалоÑÑŒ изменить оригинальное имÑ: %1 - - Failed to move "%1" from mod "%2" to "%3": %4 - - - - + <Checked> <Подключен> - + <Unchecked> <Отключен> - + <Update> <Обновлен> - + <No category> <Без категории> - + <Conflicted> <Конфликтует> - + <Not Endorsed> - + failed to rename mod: %1 не удалоÑÑŒ переименовать мод: %1 - + Overwrite? ПерезапиÑать? - + This will replace the existing mod "%1". Continue? Это заменит ÑущеÑтвующий мод "%1". Продолжить? - + failed to remove mod "%1" не удалоÑÑŒ удалить мод "%1" - - - + + + failed to rename "%1" to "%2" не удалоÑÑŒ переименовать "%1" в "%2" - + Multiple esps activated, please check that they don't conflict. Подключено неÑколько esp, выберете из них не конфликтующие. - - - + + + + Confirm Подтверждение - + Remove the following mods?<br><ul>%1</ul> Удалить Ñледующие моды?<br><ul>%1</ul> - + failed to remove mod: %1 не удалоÑÑŒ удалить мод: %1 - - + + Failed Ðеудача - + Installation file no longer exists УÑтановочный файл больше не ÑущеÑтвует - + Mods installed with old versions of MO can't be reinstalled in this way. Моды, уÑтановленные Ñ Ð¸Ñпользованием Ñтарых верÑий MO не могут быть переÑтановленны таким образом. - - + + You need to be logged in with Nexus to endorse Ð’Ñ‹ должны быть авторизированы на Nexus, чтобы одобрÑть. - - + + Extract BSA Извлечь BSA - + This mod contains at least one BSA. Do you want to unpack it? (This removes the BSA after completion. If you don't know about BSAs, just select no) Этот мод включает как минимум один BSA. Ð’Ñ‹ хотите раÑпаковать их? (Это удалит BSA поÑле завершениÑ. ЕÑли вы не знаете ничего о BSAs, проÑто откажитеÑÑŒ) - - - + + + failed to read %1: %2 не удалоÑÑŒ прочеÑть %1: %2 - - + + This archive contains invalid hashes. Some files may be broken. Ðрхив Ñодержит неверные хеши. Ðекоторые файлы могут быть иÑпорчены. - + Nexus ID for this Mod is unknown Nexus ID Ð´Ð»Ñ Ñтого мода неизвеÑтен - - + + Create Mod... Создать мод... @@ -2031,118 +2128,119 @@ Please enter a name: ПожалуйÑта, введите имÑ: - + A mod with this name already exists Мод Ñ Ñ‚Ð°ÐºÐ¸Ð¼ именем уже ÑущеÑтвует - + Continue? - + The versioning scheme decides which version is considered newer than another. This function will guess the versioning scheme under the assumption that the installed version is outdated. - + + Sorry - + I don't know a versioning scheme where %1 is newer than %2. - + Really enable all visible mods? ДейÑтвительно подключить вÑе видимые моды? - + Really disable all visible mods? ДейÑтвительно отключить вÑе видимые моды? - + Choose what to export Выберете, что ÑкÑпортировать - + Everything Ð’ÑÑ‘ - + All installed mods are included in the list Ð’Ñе уÑтановленные моды, включенные в ÑпиÑок - + Active Mods Ðктивные моды - + Only active (checked) mods from your current profile are included Включены вÑе активные (подключенные) моды вашего текущего Ð¿Ñ€Ð¾Ñ„Ð¸Ð»Ñ - + Visible Видимые - + All mods visible in the mod list are included Включены вÑе моды, видимые в ÑпиÑке модов - + export failed: %1 ÑкÑпорт не удалÑÑ: %1 - + Install Mod... УÑтановить мод... - + Enable all visible Включить вÑе видимые - + Disable all visible Отключить вÑе видимые - + Check all for update Проверить вÑе на Ð¾Ð±Ð½Ð¾Ð²Ð»ÐµÐ½Ð¸Ñ - + Export to csv... ЭкÑпорт в csv... - + Sync to Mods... Синхронизировать Ñ Ð¼Ð¾Ð´Ð°Ð¼Ð¸... - + Restore Backup ВоÑÑтановить из резервной копии - + Remove Backup... Удалить резервную копию... @@ -2151,325 +2249,375 @@ This function will guess the versioning scheme under the assumption that the ins Задать категорию - + + Executable "%1" not found + + + + + Failed to refresh list of esps: %1 + + + + The game doesn't allow more than 255 active plugins (including the official ones) to be loaded. You have to disable some unused plugins or merge some plugins into one. You can find a guide here: <a href="http://wiki.step-project.com/Guide:Merging_Plugins">http://wiki.step-project.com/Guide:Merging_Plugins</a> - + This will move all files from overwrite into a new, regular mod. Please enter a name: - + Add/Remove Categories - + Replace Categories - + Primary Category ОÑÐ½Ð¾Ð²Ð½Ð°Ñ ÐºÐ°Ñ‚ÐµÐ³Ð¾Ñ€Ð¸Ñ - + Change versioning scheme - + Un-ignore update - + Ignore update - + Rename Mod... Переименовать мод... - + Remove Mod... Удалить мод... - + Reinstall Mod ПереуÑтановить мод - + Un-Endorse Отменить одобрение - - + + Endorse Одобрить - + Won't endorse Ðе одобрÑть - + Endorsement state unknown Ð¡Ñ‚Ð°Ñ‚ÑƒÑ Ð¾Ð´Ð¾Ð±Ñ€ÐµÐ½Ð¸Ñ Ð½ÐµÐ¸Ð·Ð²ÐµÑтен - + Ignore missing data Игнорировать отÑутÑтвующие данные - + Visit on Nexus Перейти на Nexus - + Open in explorer Открыть в проводнике - + Information... ИнформациÑ... - - + + Exception: ИÑключение: - - + + Unknown exception ÐеизвеÑтное иÑключение - + <All> <Ð’Ñе> - + <Multiple> <ÐеÑколько> - + + Really delete "%1"? + + + + Fix Mods... ИÑправить моды... - - + + Delete + Удалить + + + + failed to remove %1 не удалоÑÑŒ удалить %1 - - + + failed to create %1 не удалоÑÑŒ Ñоздать %1 - + Can't change download directory while downloads are in progress! ÐÐµÐ»ÑŒÐ·Ñ Ð¸Ð·Ð¼ÐµÐ½Ð¸Ñ‚ÑŒ каталог Ð´Ð»Ñ Ð·Ð°Ð³Ñ€ÑƒÐ·Ð¾Ðº, когда загрузки ещё не завершены! - + Download failed Загрузка не удалаÑÑŒ - + failed to write to file %1 ошибка запиÑи в файл %1 - + %1 written %1 запиÑан - + Select binary Выбрать иÑполнÑемый файл - + Binary ИÑполнÑемый файл - + Enter Name Введите Ð¸Ð¼Ñ - + Please enter a name for the executable Введите название Ð´Ð»Ñ Ð¿Ñ€Ð¾Ð³Ñ€Ð°Ð¼Ð¼Ñ‹ - + Not an executable Ðе ÑвлÑетÑÑ Ð¸ÑполнÑемым - + This is not a recognized executable. Это неверный иÑполнÑемый файл. - - + + Replace file? Заменить файл? - + There already is a hidden version of this file. Replace it? Уже ÑущеÑтвует ÑÐºÑ€Ñ‹Ñ‚Ð°Ñ Ð²ÐµÑ€ÑÐ¸Ñ Ñтого файла. Заменить? - - + + File operation failed ÐžÐ¿ÐµÑ€Ð°Ñ†Ð¸Ñ Ñ Ñ„Ð°Ð¹Ð»Ð¾Ð¼ не удалаÑÑŒ - - + + Failed to remove "%1". Maybe you lack the required file permissions? Ðе удалоÑÑŒ удалить "%1". Может быть, вам не хватает необходимых прав доÑтупа к файлу? - + There already is a visible version of this file. Replace it? Ð’Ð¸Ð´Ð¸Ð¼Ð°Ñ Ð²ÐµÑ€ÑÐ¸Ñ Ñтого файла уже ÑущеÑтвует. Заменить? - + + file not found: %1 + + + + + failed to generate preview for %1 + + + + + Sorry, can't preview anything. This function currently does not support extracting from bsas. + + + + Update available ДоÑтупно обновление - + Open/Execute Открыть/Выполнить - + Add as Executable Добавить как иÑполнÑемый - + + Preview + + + + Un-Hide Показать - + Hide Скрыть - + Write To File... ЗапиÑать в файл... - + Do you want to endorse Mod Organizer on %1 now? Ð’Ñ‹ хотите одобрить Mod Organizer на %1 ÑейчаÑ? - + Request to Nexus failed: %1 Ð—Ð°Ð¿Ñ€Ð¾Ñ Ð½Ð° Nexus не удалÑÑ: %1 - - + + login successful уÑпешный вход - + login failed: %1. Trying to download anyway вход не удалÑÑ: %1. ПытаюÑÑŒ загрузить вÑÑ‘ равно - + login failed: %1 войти не удалоÑÑŒ: %1 - + login failed: %1. You need to log-in with Nexus to update MO. войти не удалоÑÑŒ: %1. Вам нужно войти на Nexus, чтобы обновить MO. - + Error Ошибка - + failed to extract %1 (errorcode %2) не удалоÑÑŒ извлечь %1 (код ошибки %2) - + Extract... РаÑпаковка... - + Edit Categories... Изменить категории... - + Remove - + Enable all Включить вÑе - + Disable all Отключить вÑе - + Unlock load order Разблокировать порÑдок загрузки - + Lock load order Заблокировать порÑдок загрузки + + + BOSS working + + + + + failed to run boss: %1 + + MessageDialog @@ -2505,58 +2653,58 @@ Please enter a name: Ð˜Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ Ð¾ моде - + Textfiles ТекÑтовые файлы - + A list of text-files in the mod directory. СпиÑок текÑтовых файлов в каталоге мода. - + A list of text-files in the mod directory like readmes. СпиÑок текÑтовых файлов в каталоге мода, таких как ридми. - - + + Save Сохранить - + INI-Files INI - файлы - + This is a list of .ini files in the mod. Это ÑпиÑок .ini-файлов мода. - + This is a list of .ini files in the mod. These are usually used to configure the behaviour of mods if there are configurable parameters. Это ÑпиÑок INI - файлов мода. Они иÑпользуютÑÑ Ð´Ð»Ñ ÐºÐ¾Ñ„Ð¸Ð³ÑƒÑ€Ð°Ñ†Ð¸Ð¸ Ð¿Ð¾Ð²ÐµÐ´ÐµÐ½Ð¸Ñ Ð¼Ð¾Ð´Ð¾Ð², еÑли Ñто возможно. - + Save changes to the file. Сохранить Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð² файле. - + Save changes to the file. This overwrites the original. There is no automatic backup! Сохранить Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð² файле. Это перезапишет ранее Ñозданный. Перед перезапиÑью файла Ñделайте копию. - + Images Изображение - + Images located in the mod. Ð˜Ð·Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸Ñ Ð¼Ð¾Ð´Ð°. @@ -2573,13 +2721,13 @@ p, li { white-space: pre-wrap; } <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt;">Это ÑпиÑок вÑех изображений (.jpg и .png) в каталоге мода, таких как Ñкриншоты и Ñ‚.п. Ðажмите на любое, Ð´Ð»Ñ ÑƒÐ²ÐµÐ»Ð¸Ñ‡ÐµÐ½Ð¸Ñ.</span></p></body></html> - - + + Optional ESPs Дополнительный ESP - + List of esps and esms that can not be loaded by the game. СпиÑок esp и esm, которые не могут быть загружены игрой. @@ -2602,12 +2750,12 @@ p, li { white-space: pre-wrap; } <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt;">БольшинÑтво модов не Ñодержат дополнительных esp, поÑтому вы можете увидеть пуÑтой ÑпиÑок</span></p></body></html> - + This lists all the images (.jpg and .png) in the mod directory, like screenshots and such. Click one to get a larger view. - + List of esps and esms contained in this plugin that currently can not be loaded by the game. They will not even appear in the esp-list in the main MO-window. They usually contain optional functionality, see the readme. @@ -2615,103 +2763,103 @@ Most mods do not have optional esps, so chances are good you are looking at an e - + Make the selected mod in the lower list unavailable. Сделать выбранный мод недоÑтупным. - + The selected esp (in the lower list) will be pushed into a subdirectory of the mod and will thus become "invisible" to the game. It can then no longer be activated. Выбранный ESP (в нижнем ÑпиÑке) будет перемещены в подкаталог мода и, таким образом, Ñтанут "невидимыми" Ð´Ð»Ñ Ð¸Ð³Ñ€Ñ‹. Затем они больше не будут активированы. - + Move a file to the data directory. ПеремеÑтить файл в каталог Data. - + This moves a esp to the esp directory so it can be enabled in the main window. Please note that the ESP merely becomes "available", it will not necessarily be loaded! That is configured in the main window of omo. Перемещает esp в каталог Ñ Ð´Ñ€ÑƒÐ³Ð¸Ð¼Ð¸ esp так, что он может быть подключен в главном окне. Обратите внимание, что ESP проÑто ÑтановитÑÑ "доÑтупным", но не будет загружен! Это наÑтраиваетÑÑ Ð² главном окне MO. - + ESPs in the data directory and thus visible to the game. ESP в каталоге Data и виден Ð´Ð»Ñ Ð¸Ð³Ñ€Ñ‹. - + These are the mod files that are in the (virtual) data directory of your game and will thus be selecteable in the esp list in the main window. Это файлы модов которые находÑÑ‚ÑÑ Ð² (виртуальном)каталоге данных вашей игры и могут быть выбираемыми в ÑпиÑке esp, в главном окне. - + Available ESPs ДоÑтупные ESP - + Conflicts Конфликты - + The following conflicted files are provided by this mod Данные конфликты вызваны Ñтим модом. - - + + File Файл - + Overwritten Mods Моды перезапиÑаны - + The following conflicted files are provided by other mods Конфликтные файлы других модов. - + Providing Mod ОбеÑпечение мода - + Non-Conflicted files Ðе конфликтные файлы - + Categories Категории - + Primary Category ОÑÐ½Ð¾Ð²Ð½Ð°Ñ ÐºÐ°Ñ‚ÐµÐ³Ð¾Ñ€Ð¸Ñ - + Nexus Info Ð˜Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ Nexus. - + Mod ID ID мода - + Mod ID for this mod on Nexus. ID мода на Nexus. - + <!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; } @@ -2724,7 +2872,7 @@ p, li { white-space: pre-wrap; } <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt;">ID Ñтого мода на Nexus. ЗаполнÑетÑÑ Ð°Ð²Ñ‚Ð¾Ð¼Ð°Ñ‚Ð¸Ñ‡ÐµÑки, еÑли Ñкачали и уÑтановили мод из МО. Ð’ противном Ñлучае вы можете ввеÑти его вручную. Чтобы найти правильный ID, нужно найти мод на Nexus. URL будет выглÑдеть Ñледующим образом: </span><a href=" http://www.skyrimnexus.com/downloads/file.php?id=1334"><span style=" font-size:8pt; text-decoration: underline; color:#0000ff;">http://skyrim.nexusmods.com/downloads/file.php?id=1334</span></a><a href="http://www.skyrimnexus.com/downloads/file.php?id=1334"><span style=" font-size:8pt; color:#000000;">. Ð’ Ñтом примере, 1334 - ID, который вы ищете. Кроме того: Выше еÑть ÑÑылка на Mod Organizer на Nexus. Почему бы не перейти по ней и не одобрить?</span></a></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; } @@ -2737,33 +2885,41 @@ p, li { white-space: pre-wrap; } <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt;">УÑÑ‚Ð°Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ð°Ñ Ð²ÐµÑ€ÑÐ¸Ñ Ð¼Ð¾Ð´Ð°. ПодÑказка будет Ñодержать текущую верÑию, доÑтупную на Nexus. УÑÑ‚Ð°Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ð°Ñ Ð²ÐµÑ€ÑÐ¸Ñ ÑƒÑтановитÑÑ Ñ‚Ð¾Ð»ÑŒÐºÐ¾ еÑли вы уÑтановили мод через МО.</span></p></body></html> - + Version ВерÑÐ¸Ñ - + Refresh Обновить информацию - + Refresh all information from Nexus. Обновить вÑÑŽ информацию Ñ Nexus - + Description ОпиÑание - + + <!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:'MS Shell Dlg 2'; font-size:8.25pt; font-weight:400; font-style:normal;"> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:8pt;"><br /></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:'MS Shell Dlg 2'; font-size:7.8pt; font-weight:400; font-style:normal;"> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /></p></body></html> - <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> + <!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:'MS Shell Dlg 2'; font-size:7.8pt; font-weight:400; font-style:normal;"> @@ -2784,27 +2940,27 @@ p, li { white-space: pre-wrap; } <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:8pt;"><br /></p></body></html> - + Endorse Одобрить - + Notes ÐŸÑ€Ð¸Ð¼ÐµÑ‡Ð°Ð½Ð¸Ñ - + Filetree Файловое древо - + A directory view of this mod Каталог Ñтого мода - + <!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; } @@ -2819,242 +2975,242 @@ p, li { white-space: pre-wrap; } <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt;">Ð˜Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð¿Ñ€Ð¾Ð¸ÑходÑÑ‚ непоÑредÑтвенно на диÑке, так что</span><span style=" font-size:8pt; font-weight:600;"> будьте оÑторожныl</span><span style=" font-size:8pt;">.</span></p></body></html> - + Previous Предыдущий - + Next Вперед - + Close Закрыть - + &Delete &Удалить - + &Rename &Переименовать - + &Hide &Скрыть - + &Unhide &Показать - + &Open &Открыть - + &New Folder &ÐÐ¾Ð²Ð°Ñ Ð¿Ð°Ð¿ÐºÐ° - - + + Save changes? Сохранить изменениÑ? - - + + Save changes to "%1"? Сохранить Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð² "%1"? - + File Exists Файл уже ÑущеÑтвует - + A file with that name exists, please enter a new one Файл Ñ Ñ‚Ð°ÐºÐ¸Ð¼ именем уже ÑущеÑтвует, укажите другое - + failed to move file не удалоÑÑŒ перемеÑтить файл - + failed to create directory "optional" не удалоÑÑŒ Ñоздать папку "optional" - - + + Info requested, please wait Ð˜Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ Ð·Ð°Ð¿Ñ€Ð¾ÑˆÐµÐ½Ð°, пожалуйÑта, подождите - + Main Главное - + Update Обновление - + Optional Опционально - + Old Старые - + Misc Разное - + Unknown ÐеизвеÑтно - + Current Version: %1 Ð¢ÐµÐºÑƒÑ‰Ð°Ñ Ð²ÐµÑ€ÑиÑ: %1 - + No update available Ðет доÑтупных обновлений - + (description incomplete, please visit nexus) (опиÑание не завершено, Ñмотрите на nexus) - + <a href="%1">Visit on Nexus</a> <a href="%1">Перейти на Nexus</a> - + Failed to delete %1 Ðе удалоÑÑŒ удалить %1 - - + + Confirm Подтверждение - + Are sure you want to delete "%1"? Ð’Ñ‹ уверены, что хотите удалить "%1"? - + Are sure you want to delete the selected files? Ð’Ñ‹ уверены, что хотите удалить выбранные файлы? - - + + New Folder ÐÐ¾Ð²Ð°Ñ Ð¿Ð°Ð¿ÐºÐ° - + Failed to create "%1" Ðе удалоÑÑŒ Ñоздать "%1" - - + + Replace file? Заменить файл? - + There already is a hidden version of this file. Replace it? Ð¡ÐºÑ€Ñ‹Ñ‚Ð°Ñ Ð²ÐµÑ€ÑÐ¸Ñ Ñтого файла уже ÑущеÑтвует. Заменить? - - + + File operation failed Ðе удалаÑÑŒ Ð¾Ð¿ÐµÑ€Ð°Ñ†Ð¸Ñ Ñ Ñ„Ð°Ð¹Ð»Ð¾Ð¼ - - + + Failed to remove "%1". Maybe you lack the required file permissions? Ðе удалоÑÑŒ удалить "%1". Может быть, вам не хватает необходимых прав доÑтупа к файлу? - - + + failed to rename %1 to %2 не удалоÑÑŒ переименовать %1 в %2 - + There already is a visible version of this file. Replace it? Ð’Ð¸Ð´Ð¸Ð¼Ð°Ñ Ð²ÐµÑ€ÑÐ¸Ñ Ñтого файла уже ÑущеÑтвует. Заменить? - + Un-Hide Показать - + Hide Скрыть - + Name Ð˜Ð¼Ñ - + Please enter a name - - + + Error Ошибка - + Invalid name. Must be a valid file name - + A tweak by that name exists - + Create Tweak @@ -3142,8 +3298,9 @@ p, li { white-space: pre-wrap; } - installed version: %1, newest version: %2 - уÑÑ‚Ð°Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ð°Ñ Ð²ÐµÑ€ÑиÑ: %1, Ð½Ð¾Ð²ÐµÐ¹ÑˆÐ°Ñ Ð²ÐµÑ€ÑиÑ: %2 + installed version: "%1", newest version: "%2" + installed version: %1, newest version: %2 + уÑÑ‚Ð°Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ð°Ñ Ð²ÐµÑ€ÑиÑ: %1, Ð½Ð¾Ð²ÐµÐ¹ÑˆÐ°Ñ Ð²ÐµÑ€ÑиÑ: %2 @@ -3299,17 +3456,17 @@ p, li { white-space: pre-wrap; } NexusInterface - + Failed to guess mod id for "%1", please pick the correct one Ðе удалоÑÑŒ опознать id мода "%1", пожалуйÑта, выберете правильный - + empty response пуÑтой ответ - + invalid response неверный ответ @@ -3382,109 +3539,130 @@ p, li { white-space: pre-wrap; } PluginList - + Name Ð˜Ð¼Ñ - + Priority Приоритет - + Mod Index Ð˜Ð½Ð´ÐµÐºÑ Ð¼Ð¾Ð´Ð° - - + + Flags + Флаги + + + + unknown неизвеÑтно - + Name of your mods Имена ваших модов - + Load priority of your mod. The higher, the more "important" it is and thus overwrites data from plugins with lower priority. Приоритет загрузки ваших модов. Моды Ñ Ð±Ð¾Ð»ÑŒÑˆÐ¸Ð¼ приоритетом перезапишут данные модов Ñ Ð¼ÐµÐ½ÑŒÑˆÐ¸Ð¼ приоритетом. - + The modindex determins the formids of objects originating from this mods. Ð˜Ð½Ð´ÐµÐºÑ Ð¼Ð¾Ð´Ð° определÑющий id форм объектов, проиÑходÑщих из Ñтих модов. - + failed to update esp info for file %1 (source id: %2), error: %3 - + esp not found: %1 esp не найден: %1 - + Confirm - + Really enable all plugins? - + Really disable all plugins? - + The file containing locked plugin indices is broken Файл, Ñодержащий индекÑÑ‹ заблокированного плагина, не работает. - - failed to open output file: %1 - не удалоÑÑŒ открыть выходной файл: %1 + не удалоÑÑŒ открыть выходной файл: %1 - + Some of your plugins have invalid names! These plugins can not be loaded by the game. Please see mo_interface.log for a list of affected plugins and rename them. Ðекоторые из ваших плагинов имеют неверные имена. Эти плагины не могут быть загружены игрой. Смотрите mo_interface.log Ð´Ð»Ñ Ð¿Ð¾Ð»ÑƒÑ‡ÐµÐ½Ð¸Ñ ÑпиÑка таких плагинов и переименуйте их. - + + BOSS dll incompatible + + + + This plugin can't be disabled (enforced by the game) Этот плагин не может быть отключен (грузитÑÑ Ð¸Ð³Ñ€Ð¾Ð¹ принудительно) - + Origin: %1 ИÑточник: %1 - + Missing Masters - + Enabled Masters - + failed to restore load order for %1 не удалоÑÑŒ воÑÑтановить порÑдок загрузки Ð´Ð»Ñ %1 + + PreviewDialog + + + Preview + + + + + Close + Закрыть + + ProblemsDialog @@ -3534,82 +3712,76 @@ p, li { white-space: pre-wrap; } Profile - + invalid profile name %1 неверное Ð¸Ð¼Ñ Ð¿Ñ€Ð¾Ñ„Ð¸Ð»Ñ %1 - + failed to create %1 не удалоÑÑŒ Ñоздать %1 - - failed to open temporary file - - - - failed to open "%1" for writing - не удалоÑÑŒ открыть "%1" Ð´Ð»Ñ Ð·Ð°Ð¿Ð¸Ñи + не удалоÑÑŒ открыть "%1" Ð´Ð»Ñ Ð·Ð°Ð¿Ð¸Ñи - + failed to write mod list: %1 - + failed to update tweaked ini file, wrong settings may be used: %1 не удалоÑÑŒ обновить наÑтроенный ini-файл, вероÑтно иÑпользуютÑÑ Ð¾ÑˆÐ¸Ð±Ð¾Ñ‡Ð½Ñ‹Ðµ наÑтройки: %1 - + failed to create tweaked ini: %1 не удалоÑÑŒ Ñоздать наÑтроенный ini: %1 - - - - - + + + + + invalid index %1 неверный Ð¸Ð½Ð´ÐµÐºÑ %1 - + Overwrite directory couldn't be parsed Замена каталога не может быть обработана - + invalid priority %1 неверный приоритет %1 - + failed to parse ini file (%1) не удалоÑÑŒ обработать ini файл (%1) - + failed to parse ini file (%1): %2 не удалоÑÑŒ обработать ini файл (%1): %2 - - + + failed to modify "%1" не удалоÑÑŒ изменить "%1" - + Delete savegames? Удалить ÑохранениÑ? - + Do you want to delete local savegames? (If you select "No", the save games will show up again if you re-enable local savegames) Ð’Ñ‹ хотите удалить локальные ÑохранениÑ? (При отрицательном выборе ÑÐ¾Ñ…Ñ€Ð°Ð½ÐµÐ½Ð¸Ñ Ð¾Ñ‚Ð¾Ð±Ñ€Ð°Ð·ÑÑ‚ÑÑ Ñнова, еÑли повторно включить локальные ÑохранениÑ) @@ -3997,7 +4169,7 @@ p, li { white-space: pre-wrap; } Ðе удалоÑÑŒ уÑтановить загрузку proxy-dll - + Permissions required ТребуютÑÑ Ð¿Ñ€Ð°Ð²Ð° доÑтупа @@ -4006,72 +4178,72 @@ p, li { white-space: pre-wrap; } Текущий аккаунт Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ Ð½Ðµ имеет необходимых прав Ð´Ð»Ñ Ð·Ð°Ð¿ÑƒÑка Mod Organizer. Ðеобходимые Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð¼Ð¾Ð³ÑƒÑ‚ быть Ñделаны автоматичеÑки (каталог MO будет уÑтановлен запиÑываемым Ð´Ð»Ñ Ñ‚ÐµÐºÑƒÑ‰ÐµÐ³Ð¾ аккаунта пользователÑ). Вам будет предложено запуÑтить "helper.exe" Ñ Ð¿Ñ€Ð°Ð²Ð°Ð¼Ð¸ админиÑтратора. - + The current user account doesn't have the required access rights to run Mod Organizer. The neccessary changes can be made automatically (the MO directory will be made writable for the current user account). You will be asked to run "helper.exe" with administrative rights. - - + + Woops Ð£Ð¿Ñ - + ModOrganizer has crashed! Should a diagnostic file be created? If you send me this file (%1) to sherb@gmx.net, the bug is a lot more likely to be fixed. Please include a short description of what you were doing when the crash happened Mod Organizer вышел из ÑтроÑ! Ðужно ли Ñоздать диагноÑтичеÑкий файл? ЕÑли вы вышлите файл (%1) по адреÑу sherb@gmx.net, ошибка Ñ Ð½Ð°Ð¼Ð½Ð¾Ð³Ð¾ большей вероÑтноÑтью будет иÑправлена. ПожалуйÑта, добавьте краткое опиÑание Ñвоих дейÑтвий, перед тем, как произошла ошибка - + ModOrganizer has crashed! Unfortunately I was not able to write a diagnostic file: %1 ModOrganizer вышел из ÑтроÑ! К Ñожалению не удалоÑÑŒ запиÑать диагноÑтичеÑкий файл: %1 - - + + Mod Organizer Mod Organizer - + An instance of Mod Organizer is already running Другой ÑкземплÑÑ€ Mod Organizer уже запущен - + No game identified in "%1". The directory is required to contain the game binary and its launcher. Игра не обнаружена в "%1". ТребуетÑÑ, чтобы папка Ñодержала иÑполнÑемые файлы игры. - - + + Please select the game to manage Выберете игру Ð´Ð»Ñ ÑƒÐ¿Ñ€Ð°Ð²Ð»ÐµÐ½Ð¸Ñ - + Please select the game edition you have (MO can't start the game correctly if this is set incorrectly!) - + Please use "Help" from the toolbar to get usage instructions to all elements ИÑпользуйте пункт "Справка" на панели инÑтрументов, чтобы получить инÑтрукции по иÑпользованию вÑех Ñлементов. - - + + <Manage...> <УправлÑть...> - + failed to parse profile %1: %2 не удалоÑÑŒ обработать профиль %1: %2 - - + + failed to find "%1" не удалоÑÑŒ найти "%1" @@ -4080,22 +4252,22 @@ p, li { white-space: pre-wrap; } ошибка кодированиÑ, пожалуйÑта Ñообщите об Ñтом баге, включив файл mo_interface.log! - + failed to access %1 не удалоÑÑŒ получить доÑтуп к %1 - + failed to set file time %1 не удалоÑÑŒ изменить дату модификации Ð´Ð»Ñ %1 - + failed to create %1 не удалоÑÑŒ Ñоздать %1 - + "%1" is missing "%1" отÑутÑтвует @@ -4123,12 +4295,12 @@ p, li { white-space: pre-wrap; } не удалоÑÑŒ открыть %1 - + Script Extender Script Extender - + Proxy DLL Proxy DLL @@ -4158,25 +4330,30 @@ Start elevated anyway? (you will be asked if you want to allow ModOrganizer.exe ЗапуÑтить Ñ Ð¿Ð¾Ð²Ñ‹ÑˆÐµÐ½Ð½Ñ‹Ð¼Ð¸ правами в любом Ñлучае? (будет выведен Ð·Ð°Ð¿Ñ€Ð¾Ñ Ð¾ разрешении ModOrganizer.exe Ñделать Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð² ÑиÑтеме) - + failed to spawn "%1": %2 не удалоÑÑŒ вызвать "%1": %2 - + "%1" doesn't exist "%1" не ÑущеÑтвует - + failed to inject dll into "%1": %2 не удалоÑÑŒ подключить dll к "%1": %2 - + failed to run "%1" не удалоÑÑŒ запуÑтить "%1" + + + failed to open temporary file + + QueryOverwriteDialog @@ -4407,18 +4584,18 @@ Start elevated anyway? (you will be asked if you want to allow ModOrganizer.exe Ð½ÐµÐ²ÐµÑ€Ð½Ð°Ñ Ð½Ð°Ñтройка "%1" запрошена Ð´Ð»Ñ Ð¿Ð»Ð°Ð³Ð¸Ð½Ð° "%2" - - + + attempt to store setting for unknown plugin "%1" - + Confirm Подтверждение - + Changing the mod directory affects all your profiles! Mods not present (or named differently) in the new location will be disabled in all profiles. There is no way to undo this unless you backed up your profiles manually. Proceed? Изменение каталога Ð´Ð»Ñ Ð¼Ð¾Ð´Ð¾Ð² отразитÑÑ Ð½Ð° вÑех ваших профилÑÑ…. ÐÐµÐ»ÑŒÐ·Ñ Ð±ÑƒÐ´ÐµÑ‚ отменить Ñто, еÑли только вы не Ñохранили резервные копии ваших профилей вручную. Продолжить? @@ -4602,107 +4779,116 @@ p, li { white-space: pre-wrap; } ÐвтоматичеÑкий вход на Nexus - + Username Ð˜Ð¼Ñ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ - + Password Пароль - + Disable automatic internet features Отключить автоматичеÑкие возможноÑти интернет - + Disable automatic internet features. This does not affect features that are explicitly invoked by the user (like checking mods for updates, endorsing, opening the web browser) Отключает автоматичеÑкие возможноÑти интернет. Это не подейÑтвует на функции, которые Ñвно вызваны пользователем (проверка модов на обновлениÑ, одобрение, открытие в браузере) - + Offline Mode Ðвтономный режим - + Use a proxy for network connections. ИÑпользовать прокÑи Ð´Ð»Ñ ÑÐ¾ÐµÐ´Ð¸Ð½ÐµÐ½Ð¸Ñ Ñ Ñетью - + Use a proxy for network connections. This uses the system-wide settings which can be configured in Internet Explorer. Please note that MO will start up a few seconds slower on some systems when using a proxy. ИÑпользовать прокÑи Ð´Ð»Ñ ÑÐ¾ÐµÐ´Ð¸Ð½ÐµÐ½Ð¸Ñ Ñ Ñетью. ИÑпользуютÑÑ ÑиÑтемные параметры, наÑтраиваемые в Internet Explorer. Обратите внимание, что MO запуÑтитÑÑ Ð½Ð° неÑколько Ñекунд медленнее на некоторых ÑиÑтемах, когда иÑпользуетÑÑ Ð¿Ñ€Ð¾ÐºÑи. - + Use HTTP Proxy (Uses System Settings) ИÑпользовать HTTP Proxy (ИÑпользуютÑÑ ÑиÑтемные наÑтройки) - + + Associate with "Download with manager" links + + + + + Known Servers (updated on download) + + + Known Servers (Dynamically updated every download) - ИзвеÑтные Ñерверы (ДинамичеÑки обновлÑетÑÑ Ð¿Ñ€Ð¸ каждой загрузке) + ИзвеÑтные Ñерверы (ДинамичеÑки обновлÑетÑÑ Ð¿Ñ€Ð¸ каждой загрузке) - + Preferred Servers (Drag & Drop) Предпочитаемые Ñерверы (ИÑпользуйте перетаÑкивание) - + Plugins Плагины - + Author: Ðвтор: - + Version: ВерÑиÑ: - + Description: ОпиÑание: - + Key Клавиша - + Value Значение - + Blacklisted Plugins (use <del> to remove): - + Workarounds СпоÑобы обхода - + Steam App ID ID Ð¿Ñ€Ð¸Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ Steam - + The Steam AppID for your game ID в Steam Ð´Ð»Ñ Ð²Ð°ÑˆÐµÐ¹ игры - + <!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; } @@ -4729,17 +4915,17 @@ p, li { white-space: pre-wrap; } <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt;">22380 Ñто и еÑть id, который вам нужен.</span></p></body></html> - + Load Mechanism Механизм загрузки - + Select loading mechanism. See help for details. Выберете механизм загрузки. Смотрите Ñправку Ð´Ð»Ñ Ð¿Ð¾Ð´Ñ€Ð¾Ð±Ð½Ð¾Ñтей. - + Mod Organizer needs a dll to be injected into the game so all mods are visible to it. There are several means to do this: *Mod Organizer* (default) In this mode the Mod Organizer itself injects the dll. The disadvantage is that you always have to start the game through MO or a link created by it. @@ -4756,17 +4942,17 @@ If you use the Steam version of Oblivion the default will NOT work. In this case ЕÑли вы иÑпользуете Steam-верÑию Oblivion , ÑпоÑоб по умолчанию не работает. Ð’ Ñтом Ñлучае уÑтановите obse и иÑпользуйте "Script Extender" как механизм загрузки. Также поÑле Ñтого вы не Ñможете запуÑтить Oblivion из MO, вмеÑто Ñтого иÑпользуйте MO только Ð´Ð»Ñ Ð½Ð°Ñтройки модов и запуÑкайте игру через Steam. - + NMM Version ВерÑÐ¸Ñ NMM - + The Version of Nexus Mod Manager to impersonate. ВерÑÐ¸Ñ Nexus Mod Manager Ð´Ð»Ñ Ð¿Ñ€ÐµÐ´ÑтавлениÑ. - + Mod Organizer uses an API provided by the Nexus to provide features like checking for updates and downloading files. Unfortunately this API has not been made available officially to third party tools like MO so we have to impersonate the Nexus Mod Manager to be allowed in. On top of this Nexus has used the client identification to lock out outdated versions of NMM to force users to update. This means that MO also needs to impersonate the new version of NMM even if MO doesn't need an update. Therefore you can configure the version to identify as here. Please note that MO does identify itself as MO to the webserver, it's not lying about what it is. It is merely adding a "compatible" NMM version to the user agent. @@ -4779,79 +4965,79 @@ tl;dr-version: If Nexus-features don't work, insert the current version num tl;dr-верÑиÑ: ЕÑли возможноÑти Nexus не работают, вÑтавьте здеÑÑŒ текущую верÑию NMM и повторите попытку. - + Enforces that inactive ESPs and ESMs are never loaded. ОбеÑпечивает то, что неактивные ESP и ESM не будут загружены. - + It seems that the Games occasionally load ESP or ESM files even if they haven't been activated as plugins. I don't yet know what the circumstances are, but user reports imply it is in some cases unwanted. If this is checked, ESPs and ESMs not checked in the List are invisible to the game and can not be loaded. КажетÑÑ, что иногда игры загружают ESP и ESM файлы, даже еÑли они не были не подключены как плагины ОбÑтоÑтельÑтва Ñтого пока не извеÑтны, но отчеты пользователей подразумевают, что Ñто в Ñ€Ñде Ñлучаев нежелательно. ЕÑли Ñтот флажок отмечен, не отмеченные в ÑпиÑке ESP и ESM не будут видимы в ÑпиÑке и не будут загружены. - + Hide inactive ESPs/ESMs Скрыть неактивные ESPs/ESMs - + If checked, files (i.e. esps, esms and bsas) belonging to the core game can not be disabled in the UI. (default: on) ЕÑли отмечено, файлы (Ñ‚.е. esp, esm и bsa) принадлежащие оÑновной игре не Ñмогут быть отключены из интерфейÑа. (по умолчанию: вкл) - + If checked, files (i.e. esps, esms and bsas) belonging to the core game can not be disabled in the UI. (default: on) Uncheck this if you want to use Mod Organizer with total conversions (like Nehrim) but be aware that the game will crash if required files are not enabled. ЕÑли отмечено, файлы (Ñ‚.е. esp, esm и bsa) принадлежащие оÑновной игре не Ñмогут быть отключены из интерфейÑа. (по умолчанию: вкл) Снимите флажок, еÑли вы ÑобираетеÑÑŒ иÑпользовать Mod Organizer Ñ Ñ‚Ð¾Ñ‚Ð°Ð»ÑŒÐ½Ñ‹Ð¼Ð¸ конверÑиÑми (как Nehrim) , но будьте оÑторожны, игра может вылететь, еÑли требуемые файлы будут отключены. - + Force-enable game files Принудительно подключить файлы игры - - + + For Skyrim, this can be used instead of Archive Invalidation. It should make AI redundant for all Profiles. For the other games this is not a sufficient replacement for AI! Ð”Ð»Ñ Ð¡ÐºÐ°Ð¹Ñ€Ð¸Ð¼ Ñто может быть иÑпользовано вмеÑто инвалидации. Это должно Ñделать AI избыточным Ð´Ð»Ñ Ð²Ñех профилей. Ð”Ð»Ñ Ð´Ñ€ÑƒÐ³Ð¸Ñ… игр недоÑтаточно замены Ð´Ð»Ñ AI! - + Back-date BSAs Back-date BSAs - + These are workarounds for problems with Mod Organizer. Please make sure you read the help text before changing anything here. Это ÑпоÑобы обхода проблем Ñ Mod Organizer. УбедитеÑÑŒ, что вы прочли Ñправку, перед тем, как делать какие-либо Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð·Ð´ÐµÑÑŒ. - + Select download directory Выберете каталог Ð´Ð»Ñ Ð·Ð°Ð³Ñ€ÑƒÐ·Ð¾Ðº - + Select mod directory Выберете каталог Ð´Ð»Ñ Ð¼Ð¾Ð´Ð¾Ð² - + Select cache directory Выберете каталог Ð´Ð»Ñ ÐºÐµÑˆÐ° - + Confirm? Подтвердить? - + This will make all dialogs show up again where you checked the "Remember selection"-box. Continue? Это позволить Ñнова отобразить вÑе диалоги, Ð´Ð»Ñ ÐºÐ¾Ñ‚Ð¾Ñ€Ñ‹Ñ… вы ранее выбрали флажок "Запомнить выбор". diff --git a/src/organizer_tr.ts b/src/organizer_tr.ts index 5d21e51e..58d30d00 100644 --- a/src/organizer_tr.ts +++ b/src/organizer_tr.ts @@ -1,6 +1,50 @@ + + AboutDialog + + + + About + + + + + Revision: + + + + + Used Software + + + + + Credits + + + + + Translators + + + + + Others + + + + + Close + Kapat + + + + No license + + + ActivateModsDialog @@ -240,26 +284,31 @@ p, li { white-space: pre-wrap; } DownloadList - + Name İsim - + Filetime Direct translation. What does this mean actually? Dosyazamanı - + Done Bitti - + Information missing, please select "Query Info" from the context menu to re-retrieve. Bilgi eksik, lütfen menüden "Bilgi sorgula" yı seçiniz + + + pending download + + DownloadListWidget @@ -312,125 +361,135 @@ p, li { white-space: pre-wrap; } DownloadListWidgetCompactDelegate - + Installed Yüklendi - + Uninstalled - + Done Bitti - - - - + + + + Are you sure? Emin misiniz? - + This will remove all finished downloads from this list and from disk. Bu, tüm bitmiÅŸ indirilenleri listeden ve diskten kaldıracaktır. - + This will remove all installed downloads from this list and from disk. Bu, tüm yüklenmiÅŸ indirilenleri listeden ve diskten kaldıracaktır. - + This will permanently remove all finished downloads from this list (but NOT from disk). - + This will permanently remove all installed downloads from this list (but NOT from disk). - + Install Yükle - + Query Info Sorgu Bilgisi - + Delete - + Un-Hide - + Remove from View - + Remove Kaldır - + Cancel İptal et - + + < mod %1 file %2 > + + + + + Pending + + + + Paused - + Fetching Info 1 - + Fetching Info 2 - + Pause Duraklat - + Resume Devam et - + Delete Installed... - + Delete All... - + Remove Installed... YüklenmiÅŸleri kaldır... - + Remove All... Hepsini kaldır... @@ -438,68 +497,78 @@ p, li { white-space: pre-wrap; } DownloadListWidgetDelegate - - - - + + + + Are you sure? Emin misiniz? - + This will remove all finished downloads from this list and from disk. Bu, tüm bitmiÅŸ indirilenleri listeden ve diskten kaldıracaktır. - + This will remove all installed downloads from this list and from disk. Bu, tüm bitmiÅŸ yüklenmiÅŸ listeden ve diskten kaldıracaktır. - + This will remove all finished downloads from this list (but NOT from disk). - + This will remove all installed downloads from this list (but NOT from disk). - + Install Yükle - + Query Info Bilgi sorgula - + Delete - + Un-Hide - + Remove from View - + Remove Kaldır - + Cancel İptal et + + + < mod %1 file %2 > + + + + + Pending + + Fetching Info 1 @@ -511,32 +580,32 @@ p, li { white-space: pre-wrap; } - + Pause Duraklat - + Resume Devam et - + Delete Installed... - + Delete All... - + Remove Installed... YüklenmiÅŸleri kaldır - + Remove All... Hepsini kaldır... @@ -549,75 +618,76 @@ p, li { white-space: pre-wrap; } "%1"yi "%2" olarak yeniden adlandırma baÅŸarılı olamadı. - + Download again? Tekrar indir? - + A file with the same name has already been downloaded. Do you want to download it again? The new file will receive a different name. Aynı dosya isminde bir dosya zaten indirilmiÅŸ. Tekrar indirmek istiyor musunuz? Yeni dosya farklı bir isim alacak. - + failed to download %1: could not open output file: %2 %1 indirilemedi : : çıkış dosyası %2 açılamadı - + Wrong Game - + The download link is for a mod for "%1" but this instance of MO has been set up for "%2". - - - - - - - - - - - - - - + + + + + + + + + + + + + + + invalid index geçersiz dizin - + failed to delete %1 %1 silinemedi - + failed to delete meta file for %1 %1'in meta dosyası silinemedi - - - - - - + + + + + + invalid index %1 geçeriz dizin %1 - + Please enter the nexus mod id Lütfen nexus mod kimliÄŸini girin - + Mod ID: Mod kimliÄŸi: @@ -626,38 +696,43 @@ p, li { white-space: pre-wrap; } geçersiz alfabetik dizin %1 - + Information updated bilgi güncellendi - - + + No matching file found on Nexus! Maybe this file is no longer available or it was renamed? Nexus'ta uyan bir dosya bulunamadı! Dosya artık mevcut olmayabilir yada yeniden adlandırılmış olabilir! - + No file on Nexus matches the selected file by name. Please manually choose the correct one. Nexus'ta seçili dosyaya isim olarak uyan dosya bulunamadı. Lütfen el ile doÄŸru olanı seçin. - + No download server available. Please try again later. - + Failed to request file info from nexus: %1 Nexus'tan dosya bilgisi istenilemedi: %1 - + + Download failed. Server reported: %1 + + + + Download failed: %1 (%2) İndirme baÅŸarızı: %1 (%2) - + failed to re-open %1 %1 tekrar açılamadı @@ -770,7 +845,7 @@ Steam tarafından dağıtılan her oyun/aracın kendine has bir kimliÄŸi vardır - + If checked, MO will be closed once the specified executable is run. EÄŸer seçiliyse, belirlenmiÅŸ yürütülebilir çalıştırıldığında MO kapatılacaktır. @@ -787,7 +862,7 @@ Steam tarafından dağıtılan her oyun/aracın kendine has bir kimliÄŸi vardır - + Add Ekle @@ -803,47 +878,64 @@ Steam tarafından dağıtılan her oyun/aracın kendine has bir kimliÄŸi vardır Kaldır - + + Close + Kapat + + + Select a binary Bir ikili deÄŸer seç - + Executable (%1) Yürütülebilir (%1) - + Java (32-bit) required - + MO requires 32-bit java to run this application. If you already have it installed, select javaw.exe from that installation as the binary. - + Select a directory Bir klasör seç - + Confirm Onayla - + Really remove "%1" from executables? "%1" gerçekten yürütülebilirlerden kaldırılsın mı? - + Modify DeÄŸiÅŸtir - + + + Save Changes? + + + + + + You made changes to the current executable, do you want to save them? + + + + MO must be kept running or this application will not work correctly. MO'nun çalışmaya devam etmesi gereklidir yoksa uygulama düzgün çalışmayacaktır @@ -1290,7 +1382,7 @@ Not: Bu yükleyici diÄŸer modlardan haberdar olmayacak! Yürütülebilir çalışırken MO kilitlidir. - + Unlock Kilit aç @@ -1298,7 +1390,7 @@ Not: Bu yükleyici diÄŸer modlardan haberdar olmayacak! LogBuffer - + failed to write log to %1: %2 %1: %2 ya kayıt yazılamadı @@ -1319,23 +1411,23 @@ Not: Bu yükleyici diÄŸer modlardan haberdar olmayacak! MainWindow - - + + Categories Kategoriler - + Profile - + Pick a module collection - + <!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; } @@ -1345,54 +1437,54 @@ p, li { white-space: pre-wrap; } - + Refresh list - + Refresh list. This is usually not necessary unless you modified data outside the program. - + List of available mods. - + This is a list of installed mods. Use the checkboxes to activate/deactivate mods and drag & drop mods to change their "installation" orders. - + Filter - + No groups - + Nexus IDs Nexus kimliÄŸi - - - + + + Namefilter - + Pick a program to run. - + <!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; } @@ -1402,12 +1494,12 @@ p, li { white-space: pre-wrap; } - + Run program - + <!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; } @@ -1416,17 +1508,17 @@ p, li { white-space: pre-wrap; } - + Run - + Create a shortcut in your start menu or on the desktop to the specified program - + <!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; } @@ -1435,7 +1527,7 @@ p, li { white-space: pre-wrap; } - + Shortcut @@ -1444,12 +1536,12 @@ p, li { white-space: pre-wrap; } Kaydet - + List of available esp/esm files - + <!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; } @@ -1458,12 +1550,12 @@ p, li { white-space: pre-wrap; } - + List of available BS Archives. Archives not checked here are not managed by MO and ignore installation order. - + BSA files are archives (comparable to .zip files) that contain data assets (meshes, textures, ...) to be used by the game. As such they "compete" with loose files in your data directory over which is loaded. By default, BSAs that share their base name with an enabled ESP (i.e. plugin.esp and plugin.bsa) are automatically loaded and will have precedence over all loose files, the installation order you set up to the left is then ignored! @@ -1471,66 +1563,71 @@ BSAs checked here are loaded in such a way that your installation order is obeye - - + + File - + <html><head/><body><p>Marked Archives (<img src=":/MO/gui/warning_16"/>) are still loaded on Skyrim but the <a href="http://forums.bethsoft.com/topic/1354395-update-bsas-and-you/"><span style=" text-decoration: underline; color:#0000ff;">regular file override</span></a> mechanism will apply: Loose files override BSAs, no matter the mod/plugin priority.</p></body></html> - + Mod Mod - + Data - + + Sort + + + + refresh data-directory overview - + Refresh the overview. This may take a moment. - - - + + + Refresh - + This is an overview of your data directory as visible to the game (and tools). - - + + Filter the above list so that only conflicts are displayed. - + Show only conflicts - + Saves - + <!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; } @@ -1541,160 +1638,160 @@ p, li { white-space: pre-wrap; } - + Downloads - + This is a list of mods you downloaded from Nexus. Double click one to install it. - + Compact - + Show Hidden - + Tool Bar - + Install Mod - + Install &Mod - + Install a new mod from an archive - + Ctrl+M - + Profiles - + &Profiles - + Configure Profiles - + Ctrl+P - + Executables - + &Executables - + Configure the executables that can be started through Mod Organizer - + Ctrl+E - - + + Tools - + &Tools - + Ctrl+I - + Settings - + &Settings - + Configure settings and workarounds - + Ctrl+S - + Nexus - + Search nexus network for more mods - + Ctrl+N - - + + Update - + Mod Organizer is up-to-date - - + + No Problems - + This button will be highlighted if MO discovered potential problems in your setup and provide tips on how to fix them. !Work in progress! @@ -1702,896 +1799,943 @@ Right now this has very limited functionality - - + + Help - + Ctrl+H - + Endorse MO - - + + Endorse Mod Organizer - + Toolbar - + Desktop - + Start Menu - + Problems - + There are potential problems with your setup - + Everything seems to be in order - + Help on UI - + Documentation Wiki - + Report Issue - + Tutorials - + failed to save load order: %1 - + failed to save archives order, do you have write access to "%1"? - + + About + + + + + About Qt + + + + Name İsim - + Please enter a name for the new profile - + failed to create profile: %1 - + Show tutorial? - + You are starting Mod Organizer for the first time. Do you want to show a tutorial of its basic features? If you choose no you can always start the tutorial from the "Help"-menu. - + Downloads in progress - + There are still downloads in progress, do you really want to quit? - + failed to read savegame: %1 - + Plugin "%1" failed: %2 - + Failed to start "%1" - + Waiting - + Please press OK once you're logged into steam. - - "%1" not found - - - - + Start Steam? - + Steam is required to be running already to correctly start the game. Should MO try to start steam now? - + Also in: <br> - + No conflict - + <Edit...> - + + Failed to refresh list of esps: %1 + + + + This bsa is enabled in the ini file so it may be required! - + This archive will still be loaded since there is a plugin of the same name but its files will not follow installation order! - + Activating Network Proxy - - + + Installation successful - - + + Configure Mod - - + + This mod contains ini tweaks. Do you want to configure them now? - - + + mod "%1" not found - - + + Installation cancelled - - + + The mod was not installed completely. - + Some plugins could not be loaded - + The game doesn't allow more than 255 active plugins (including the official ones) to be loaded. You have to disable some unused plugins or merge some plugins into one. You can find a guide here: <a href="http://wiki.step-project.com/Guide:Merging_Plugins">http://wiki.step-project.com/Guide:Merging_Plugins</a> - + Choose Mod - + Mod Archive - + Start Tutorial? - + You're about to start a tutorial. For technical reasons it's not possible to end the tutorial early. Continue? - - + + Download started - + failed to update mod list: %1 - + failed to spawn notepad.exe: %1 - + failed to open %1 - + failed to change origin name: %1 - + Multiple esps activated, please check that they don't conflict. - - + + Create Mod... - + A mod with this name already exists - + <All> - + <Checked> - + Plugin "%1" failed - + failed to init plugin %1: %2 - + Plugin error - + It appears the plugin "%1" failed to load last startup and caused MO to crash. Do you want to disable it? (Please note: If this is the first time you see this message for this plugin you may want to give it another try. The plugin may be able to recover from the problem) - - Failed to refresh list of esps: %s - - - - + Too many esps and esms enabled - - + + Description missing - + The following plugins could not be loaded. The reason may be missing dependencies (i.e. python) or an outdated version: - - Failed to move "%1" from mod "%2" to "%3": %4 - - - - + <Unchecked> - + <Update> - + <No category> - + <Conflicted> - + <Not Endorsed> - + failed to rename mod: %1 - + Overwrite? - + This will replace the existing mod "%1". Continue? - + failed to remove mod "%1" - - - + + + failed to rename "%1" to "%2" "%1"yi "%2" olarak yeniden adlandırma baÅŸarılı olamadı. - - - + + + + Confirm Onayla - + Remove the following mods?<br><ul>%1</ul> - + failed to remove mod: %1 - - + + Failed - + Installation file no longer exists - + Mods installed with old versions of MO can't be reinstalled in this way. - - + + You need to be logged in with Nexus to endorse - - + + Extract BSA - + This mod contains at least one BSA. Do you want to unpack it? (This removes the BSA after completion. If you don't know about BSAs, just select no) - - - + + + failed to read %1: %2 %1: %2 okunamadı - - + + This archive contains invalid hashes. Some files may be broken. - + Nexus ID for this Mod is unknown - + This will move all files from overwrite into a new, regular mod. Please enter a name: - + Continue? - + The versioning scheme decides which version is considered newer than another. This function will guess the versioning scheme under the assumption that the installed version is outdated. - + + Sorry - + I don't know a versioning scheme where %1 is newer than %2. - + Really enable all visible mods? - + Really disable all visible mods? - + Choose what to export - + Everything - + All installed mods are included in the list - + Active Mods - + Only active (checked) mods from your current profile are included - + Visible - + All mods visible in the mod list are included - + export failed: %1 - + Install Mod... - + Enable all visible - + Disable all visible - + Check all for update - + Export to csv... - + Sync to Mods... - + Restore Backup - + Remove Backup... - + Primary Category - + Change versioning scheme - + Un-ignore update - + Ignore update - + Rename Mod... - + Remove Mod... - + Reinstall Mod - + Un-Endorse - - + + Endorse - + Won't endorse - + Endorsement state unknown - + Ignore missing data - + Visit on Nexus - + Open in explorer - + Information... - - + + Exception: - - + + Unknown exception - + <Multiple> - + + Really delete "%1"? + + + + Fix Mods... - - + + Delete + + + + + failed to remove %1 - - + + failed to create %1 - + Can't change download directory while downloads are in progress! - + Download failed - + failed to write to file %1 - + %1 written - + Select binary - + Binary İkili deÄŸer - + Enter Name - + Please enter a name for the executable - + Not an executable - + This is not a recognized executable. - - + + Replace file? - + There already is a hidden version of this file. Replace it? - - + + File operation failed - - + + Failed to remove "%1". Maybe you lack the required file permissions? - + There already is a visible version of this file. Replace it? - + + file not found: %1 + + + + + failed to generate preview for %1 + + + + + Sorry, can't preview anything. This function currently does not support extracting from bsas. + + + + Update available - + Open/Execute - + Add as Executable - + + Preview + + + + Un-Hide - + Hide - + Write To File... - + Do you want to endorse Mod Organizer on %1 now? - + Remove - + Unlock load order - + Lock load order - + + BOSS working + + + + + failed to run boss: %1 + + + + Request to Nexus failed: %1 - + + Executable "%1" not found + + + + Add/Remove Categories - + Replace Categories - - + + login successful - + login failed: %1. Trying to download anyway - + login failed: %1 - + login failed: %1. You need to log-in with Nexus to update MO. - + Error - + failed to extract %1 (errorcode %2) - + Extract... - + Edit Categories... - + Enable all - + Disable all @@ -2638,58 +2782,58 @@ This function will guess the versioning scheme under the assumption that the ins Mod bilgisi - + Textfiles Yazı dosyaları - + A list of text-files in the mod directory. Mod klasöründeki yazı dosyalarının bir listesi - + A list of text-files in the mod directory like readmes. Mod klasöründeki benioku dosyaları gibi yazı dosyalarının bir listesi - - + + Save Kaydet - + INI-Files INI-Dosyaları - + This is a list of .ini files in the mod. Mod klasöründeki .ini dosyalarının bir listesi - + This is a list of .ini files in the mod. These are usually used to configure the behaviour of mods if there are configurable parameters. Moddaki .ini dosyalarının bir listesi. Bunlar genelde, ayarlabilir parametrelerin olduÄŸuÄŸu durumlarda modların davranışlarını ayarlamak için kullanılır. - + Save changes to the file. DeÄŸiÅŸiklikleri dosyaya kaydet. - + Save changes to the file. This overwrites the original. There is no automatic backup! DeÄŸiÅŸiklikleri dosyaya kaydet. Bu orijinal dosyanın üzerine yazar. Otomatik yedekleme yoktur! - + Images Resimler - + Images located in the mod. Modun içinde yer alan resimler @@ -2706,13 +2850,13 @@ p, li { white-space: pre-wrap; } <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt;">Bu mod klasöründe yer alan ekran resimleri ve benzeri resimlerin(.jpg ve.png) bir listesidir. Tıklayararak daha büyük görüntü alabilirsiniz</span></p></body></html> - - + + Optional ESPs İsteÄŸe baÄŸlı ESP'ler - + List of esps and esms that can not be loaded by the game. Oyun tarafından yüklenemeyen espler ve esmlerin bir listesi. @@ -2735,12 +2879,12 @@ p, li { white-space: pre-wrap; } <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt;">Pek çok mod isteÄŸe baÄŸlı esp'ler içermez, bu nedenle büyük ihtimalle boÅŸ bir listeye bakıyorsunuz.</span></p></body></html> - + This lists all the images (.jpg and .png) in the mod directory, like screenshots and such. Click one to get a larger view. - + List of esps and esms contained in this plugin that currently can not be loaded by the game. They will not even appear in the esp-list in the main MO-window. They usually contain optional functionality, see the readme. @@ -2748,103 +2892,103 @@ Most mods do not have optional esps, so chances are good you are looking at an e - + Make the selected mod in the lower list unavailable. AÅŸağıdaki listedeki seçili modu kullanılamaz yapar. - + The selected esp (in the lower list) will be pushed into a subdirectory of the mod and will thus become "invisible" to the game. It can then no longer be activated. Seçili esp (aÅŸağıdaki listede) modun bir alt klasörüne itilecek ve böylece oyuna "görünmez" olacaktır. Artık aktif hale getirilemez. - + Move a file to the data directory. Dosyayı veri klasörüne taşı. - + This moves a esp to the esp directory so it can be enabled in the main window. Please note that the ESP merely becomes "available", it will not necessarily be loaded! That is configured in the main window of omo. - + ESPs in the data directory and thus visible to the game. - + These are the mod files that are in the (virtual) data directory of your game and will thus be selecteable in the esp list in the main window. - + Available ESPs - + Conflicts - + The following conflicted files are provided by this mod - - + + File - + Overwritten Mods - + The following conflicted files are provided by other mods - + Providing Mod - + Non-Conflicted files - + Categories Kategoriler - + Primary Category - + Nexus Info - + Mod ID - + Mod ID for this mod on Nexus. - + <!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; } @@ -2853,7 +2997,7 @@ p, li { white-space: pre-wrap; } - + <!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; } @@ -2862,61 +3006,61 @@ p, li { white-space: pre-wrap; } - + Version Versiyon - + Refresh - + Refresh all information from Nexus. - + Description - + <!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:'MS Shell Dlg 2'; font-size:7.8pt; font-weight:400; font-style:normal;"> -<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /></p></body></html> +</style></head><body style=" font-family:'MS Shell Dlg 2'; font-size:8.25pt; font-weight:400; font-style:normal;"> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:8pt;"><br /></p></body></html> - + Name İsim - + Endorse - + Notes - + Filetree - + A directory view of this mod - + <!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; } @@ -2926,237 +3070,237 @@ p, li { white-space: pre-wrap; } - + Previous - + Next Sonraki - + Close Kapat - + &Delete - + &Rename - + &Hide - + &Unhide - + &Open &Aç - + &New Folder - - + + Save changes? - + File Exists - + A file with that name exists, please enter a new one - + failed to move file - + failed to create directory "optional" - - + + Info requested, please wait - + (description incomplete, please visit nexus) - + Please enter a name - - + + Error - + Invalid name. Must be a valid file name - + A tweak by that name exists - + Create Tweak - + Current Version: %1 - + No update available - + Main - - + + Save changes to "%1"? - + Update - + Optional - + Old - + Misc - + Unknown - + <a href="%1">Visit on Nexus</a> - - + + Confirm Onayla - + Failed to delete %1 - + Are sure you want to delete "%1"? - + Are sure you want to delete the selected files? - - + + New Folder - + Failed to create "%1" - - + + Replace file? - + There already is a hidden version of this file. Replace it? - - + + File operation failed - - + + Failed to remove "%1". Maybe you lack the required file permissions? - - + + failed to rename %1 to %2 - + There already is a visible version of this file. Replace it? - + Un-Hide - + Hide @@ -3256,7 +3400,8 @@ p, li { white-space: pre-wrap; } - installed version: %1, newest version: %2 + installed version: "%1", newest version: "%2" + installed version: %1, newest version: %2 @@ -3397,17 +3542,17 @@ p, li { white-space: pre-wrap; } NexusInterface - + Failed to guess mod id for "%1", please pick the correct one - + empty response - + invalid response @@ -3480,109 +3625,126 @@ p, li { white-space: pre-wrap; } PluginList - + Mod Index - - + + Flags + + + + + unknown - + Name of your mods - + Load priority of your mod. The higher, the more "important" it is and thus overwrites data from plugins with lower priority. - + The modindex determins the formids of objects originating from this mods. - + failed to update esp info for file %1 (source id: %2), error: %3 - + esp not found: %1 - + Confirm Onayla - + Really enable all plugins? - + Really disable all plugins? - + The file containing locked plugin indices is broken - - - failed to open output file: %1 + + Some of your plugins have invalid names! These plugins can not be loaded by the game. Please see mo_interface.log for a list of affected plugins and rename them. - - Some of your plugins have invalid names! These plugins can not be loaded by the game. Please see mo_interface.log for a list of affected plugins and rename them. + + BOSS dll incompatible - + Missing Masters - + Enabled Masters - + failed to restore load order for %1 - + This plugin can't be disabled (enforced by the game) - + Origin: %1 - + Name İsim - + Priority + + PreviewDialog + + + Preview + + + + + Close + Kapat + + ProblemsDialog @@ -3624,82 +3786,72 @@ p, li { white-space: pre-wrap; } Profile - + invalid profile name %1 - + failed to create %1 - - failed to open temporary file - - - - - failed to open "%1" for writing - - - - + failed to write mod list: %1 - + failed to update tweaked ini file, wrong settings may be used: %1 - + failed to create tweaked ini: %1 - - - - - + + + + + invalid index %1 - + Overwrite directory couldn't be parsed - + invalid priority %1 - + failed to parse ini file (%1) - + failed to parse ini file (%1): %2 - - + + failed to modify "%1" - + Delete savegames? - + Do you want to delete local savegames? (If you select "No", the save games will show up again if you re-enable local savegames) @@ -4025,97 +4177,97 @@ p, li { white-space: pre-wrap; } - + "%1" is missing - + Permissions required - + The current user account doesn't have the required access rights to run Mod Organizer. The neccessary changes can be made automatically (the MO directory will be made writable for the current user account). You will be asked to run "helper.exe" with administrative rights. - - + + Woops - + ModOrganizer has crashed! Should a diagnostic file be created? If you send me this file (%1) to sherb@gmx.net, the bug is a lot more likely to be fixed. Please include a short description of what you were doing when the crash happened - + ModOrganizer has crashed! Unfortunately I was not able to write a diagnostic file: %1 - - + + Mod Organizer - + An instance of Mod Organizer is already running - + No game identified in "%1". The directory is required to contain the game binary and its launcher. - - + + Please select the game to manage - + Please select the game edition you have (MO can't start the game correctly if this is set incorrectly!) - + Please use "Help" from the toolbar to get usage instructions to all elements - - + + <Manage...> - + failed to parse profile %1: %2 - - + + failed to find "%1" - + failed to access %1 - + failed to set file time %1 - + failed to create %1 @@ -4143,12 +4295,12 @@ p, li { white-space: pre-wrap; } - + Script Extender - + Proxy DLL @@ -4173,22 +4325,22 @@ Start elevated anyway? (you will be asked if you want to allow ModOrganizer.exe - + failed to spawn "%1": %2 - + "%1" doesn't exist - + failed to inject dll into "%1": %2 - + failed to run "%1" @@ -4237,6 +4389,11 @@ Start elevated anyway? (you will be asked if you want to allow ModOrganizer.exe invalid game type %1 + + + failed to open temporary file + + QueryOverwriteDialog @@ -4452,18 +4609,18 @@ Start elevated anyway? (you will be asked if you want to allow ModOrganizer.exe Settings - - + + attempt to store setting for unknown plugin "%1" - + Confirm Onayla - + Changing the mod directory affects all your profiles! Mods not present (or named differently) in the new location will be disabled in all profiles. There is no way to undo this unless you backed up your profiles manually. Proceed? @@ -4608,52 +4765,47 @@ p, li { white-space: pre-wrap; } - + Disable automatic internet features - + Disable automatic internet features. This does not affect features that are explicitly invoked by the user (like checking mods for updates, endorsing, opening the web browser) - + Offline Mode - + Use a proxy for network connections. - + Use a proxy for network connections. This uses the system-wide settings which can be configured in Internet Explorer. Please note that MO will start up a few seconds slower on some systems when using a proxy. - + Use HTTP Proxy (Uses System Settings) - - Known Servers (Dynamically updated every download) - - - - + Preferred Servers (Drag & Drop) - + Blacklisted Plugins (use <del> to remove): - + Mod Organizer needs a dll to be injected into the game so all mods are visible to it. There are several means to do this: *Mod Organizer* (default) In this mode the Mod Organizer itself injects the dll. The disadvantage is that you always have to start the game through MO or a link created by it. @@ -4694,62 +4846,72 @@ p, li { white-space: pre-wrap; } - + Username Kullanıcı adı - + Password Åžifre - + + Associate with "Download with manager" links + + + + + Known Servers (updated on download) + + + + Plugins - + Author: - + Version: - + Description: - + Key - + Value - + Workarounds - + Steam App ID - + The Steam AppID for your game - + <!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; } @@ -4765,27 +4927,27 @@ p, li { white-space: pre-wrap; } - + Load Mechanism - + Select loading mechanism. See help for details. - + NMM Version - + The Version of Nexus Mod Manager to impersonate. - + Mod Organizer uses an API provided by the Nexus to provide features like checking for updates and downloading files. Unfortunately this API has not been made available officially to third party tools like MO so we have to impersonate the Nexus Mod Manager to be allowed in. On top of this Nexus has used the client identification to lock out outdated versions of NMM to force users to update. This means that MO also needs to impersonate the new version of NMM even if MO doesn't need an update. Therefore you can configure the version to identify as here. Please note that MO does identify itself as MO to the webserver, it's not lying about what it is. It is merely adding a "compatible" NMM version to the user agent. @@ -4794,76 +4956,76 @@ tl;dr-version: If Nexus-features don't work, insert the current version num - + Enforces that inactive ESPs and ESMs are never loaded. - + It seems that the Games occasionally load ESP or ESM files even if they haven't been activated as plugins. I don't yet know what the circumstances are, but user reports imply it is in some cases unwanted. If this is checked, ESPs and ESMs not checked in the List are invisible to the game and can not be loaded. - + Hide inactive ESPs/ESMs - + If checked, files (i.e. esps, esms and bsas) belonging to the core game can not be disabled in the UI. (default: on) - + If checked, files (i.e. esps, esms and bsas) belonging to the core game can not be disabled in the UI. (default: on) Uncheck this if you want to use Mod Organizer with total conversions (like Nehrim) but be aware that the game will crash if required files are not enabled. - + Force-enable game files - - + + For Skyrim, this can be used instead of Archive Invalidation. It should make AI redundant for all Profiles. For the other games this is not a sufficient replacement for AI! - + Back-date BSAs - + These are workarounds for problems with Mod Organizer. Please make sure you read the help text before changing anything here. - + Select download directory - + Select mod directory - + Select cache directory - + Confirm? - + This will make all dialogs show up again where you checked the "Remember selection"-box. Continue? diff --git a/src/organizer_zh_CN.ts b/src/organizer_zh_CN.ts index e715f9d9..4e24267f 100644 --- a/src/organizer_zh_CN.ts +++ b/src/organizer_zh_CN.ts @@ -1,6 +1,50 @@ + + AboutDialog + + + + About + + + + + Revision: + + + + + Used Software + + + + + Credits + + + + + Translators + + + + + Others + + + + + Close + 关闭 + + + + No license + + + ActivateModsDialog @@ -240,25 +284,30 @@ p, li { white-space: pre-wrap; } DownloadList - + Name åç§° - + Filetime 文件时间 - + Done å®Œæˆ - + Information missing, please select "Query Info" from the context menu to re-retrieve. ä¿¡æ¯ä¸¢å¤±ï¼Œè¯·åœ¨å³é”®èœå•里选择“查询信æ¯â€æ¥é‡æ–°æ£€ç´¢ã€‚ + + + pending download + + DownloadListWidget @@ -311,125 +360,135 @@ p, li { white-space: pre-wrap; } DownloadListWidgetCompactDelegate - + Installed 已安装 - + Uninstalled - + Done å®Œæˆ - - - - + + + + Are you sure? 确定? - + This will remove all finished downloads from this list and from disk. 这将会从列表和ç£ç›˜ä¸­ç§»é™¤æ‰€æœ‰å·²å®Œæˆçš„下载。 - + This will remove all installed downloads from this list and from disk. 这将会从列表和ç£ç›˜ä¸­ç§»é™¤æ‰€æœ‰å·²å®‰è£…的下载项目。 - + This will permanently remove all finished downloads from this list (but NOT from disk). - + This will permanently remove all installed downloads from this list (but NOT from disk). - + Install 安装 - + Query Info æŸ¥è¯¢ä¿¡æ¯ - + Delete - + Un-Hide å–æ¶ˆéšè— - + Remove from View - + Remove 移除 - + Cancel å–æ¶ˆ - + + < mod %1 file %2 > + + + + + Pending + + + + Paused - + Fetching Info 1 - + Fetching Info 2 - + Pause æš‚åœ - + Resume ç»§ç»­ - + Delete Installed... - + Delete All... - + Remove Installed... 移除已安装的项目... - + Remove All... 移除所有... @@ -437,68 +496,78 @@ p, li { white-space: pre-wrap; } DownloadListWidgetDelegate - - - - + + + + Are you sure? 确定? - + This will remove all finished downloads from this list and from disk. 这将会从列表和ç£ç›˜ä¸­ç§»é™¤æ‰€æœ‰å·²å®Œæˆçš„下载。 - + This will remove all installed downloads from this list and from disk. 这将会从列表和ç£ç›˜ä¸­ç§»é™¤æ‰€æœ‰å·²å®‰è£…的下载项目。 - + This will remove all finished downloads from this list (but NOT from disk). - + This will remove all installed downloads from this list (but NOT from disk). - + Install 安装 - + Query Info æŸ¥è¯¢ä¿¡æ¯ - + Delete - + Un-Hide å–æ¶ˆéšè— - + Remove from View - + Remove 移除 - + Cancel å–æ¶ˆ + + + < mod %1 file %2 > + + + + + Pending + + Fetching Info 1 @@ -510,32 +579,32 @@ p, li { white-space: pre-wrap; } - + Pause æš‚åœ - + Resume ç»§ç»­ - + Delete Installed... - + Delete All... - + Remove Installed... 移除已安装的项目... - + Remove All... 移除所有... @@ -548,75 +617,76 @@ p, li { white-space: pre-wrap; } é‡å‘½å "%1 "为 "%2" 时出错 - + Download again? 釿–°ä¸‹è½½ï¼Ÿ - + A file with the same name has already been downloaded. Do you want to download it again? The new file will receive a different name. 已存在åŒå文件。您确定è¦é‡æ–°ä¸‹è½½ï¼Ÿæ–°æ–‡ä»¶å°†ä½¿ç”¨ä¸åŒçš„æ–‡ä»¶å。 - + failed to download %1: could not open output file: %2 下载 %1 失败: 无法打开输出文件: %2 - + Wrong Game - + The download link is for a mod for "%1" but this instance of MO has been set up for "%2". - - - - - - - - - - - - - - + + + + + + + + + + + + + + + invalid index 无效的索引 - + failed to delete %1 无法删除 %1 - + failed to delete meta file for %1 无法从 %1 中删除 mate 文件 - - - - - - + + + + + + invalid index %1 无效的索引 %1 - + Please enter the nexus mod id 请输入N网 Mod ID - + Mod ID: Mod ID: @@ -625,38 +695,43 @@ p, li { white-space: pre-wrap; } 无效的字顺索引 %1 - + Information updated ä¿¡æ¯å·²æ›´æ–° - - + + No matching file found on Nexus! Maybe this file is no longer available or it was renamed? 无法在N网上找到匹é…的文件ï¼ä¹Ÿè®¸è¿™ä¸ªæ–‡ä»¶å·²ç»ä¸å­˜åœ¨äº†æˆ–是它改å了? - + No file on Nexus matches the selected file by name. Please manually choose the correct one. 所选的文件无法在N网上找到å¯åŒ¹é…的项目,请手动选择正确的一个。 - + No download server available. Please try again later. 没有å¯ç”¨çš„下载æœåŠ¡å™¨ï¼Œè¯·ç¨åŽå†å°è¯•下载。 - + Failed to request file info from nexus: %1 无法从N网上请求文件信æ¯: %1 - + + Download failed. Server reported: %1 + + + + Download failed: %1 (%2) 下载失败: %1 (%2) - + failed to re-open %1 æ— æ³•é‡æ–°æ‰“å¼€ %1 @@ -768,7 +843,7 @@ Right now the only case I know of where this needs to be overwritten is for the - + If checked, MO will be closed once the specified executable is run. 如果选中,那么 MO 将在指定的程åºè¿è¡ŒåŽå…³é—­ã€‚ @@ -785,7 +860,7 @@ Right now the only case I know of where this needs to be overwritten is for the - + Add 添加 @@ -801,47 +876,64 @@ Right now the only case I know of where this needs to be overwritten is for the 移除 - + + Close + 关闭 + + + Select a binary é€‰æ‹©ä¸€ä¸ªå¯æ‰§è¡Œæ–‡ä»¶ - + Executable (%1) 坿‰§è¡Œç¨‹åº (%1) - + Java (32-bit) required - + MO requires 32-bit java to run this application. If you already have it installed, select javaw.exe from that installation as the binary. - + Select a directory 选择一个目录 - + Confirm 确认 - + Really remove "%1" from executables? 真的è¦ä»Žç¨‹åºåˆ—表中移除 "%1" å—? - + Modify 更改 - + + + Save Changes? + + + + + + You made changes to the current executable, do you want to save them? + + + + MO must be kept running or this application will not work correctly. MO å¿…é¡»æŒç»­è¿è¡Œï¼Œå¦åˆ™è¯¥ç¨‹åºå°†æ— æ³•正常工作。 @@ -1287,7 +1379,7 @@ Note: This installer will not be aware of other installed mods! 程åºè¿è¡Œæ—¶ MO 将被é”定。 - + Unlock è§£é” @@ -1295,7 +1387,7 @@ Note: This installer will not be aware of other installed mods! LogBuffer - + failed to write log to %1: %2 æ— æ³•ç”Ÿæˆæ—¥å¿—到 %1: %2 @@ -1316,23 +1408,23 @@ Note: This installer will not be aware of other installed mods! MainWindow - - + + Categories - + Profile é…置文件 - + Pick a module collection 选择一个é…置文件 - + <!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; } @@ -1347,44 +1439,44 @@ p, li { white-space: pre-wrap; } <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;">请注æ„: 当剿‚¨çš„é…置文件的 esp 加载顺åºå¹¶ä¸æ˜¯åˆ†å¼€ä¿å­˜çš„。</span></p></body></html> - + Refresh list 刷新列表 - + Refresh list. This is usually not necessary unless you modified data outside the program. åˆ·æ–°åˆ—è¡¨ï¼Œè¿™é€šå¸¸ä¸æ˜¯å¿…é¡»çš„ï¼Œé™¤éžæ‚¨åœ¨ç¨‹åºä¹‹å¤–修改了文件的数æ®ã€‚ - + List of available mods. - + This is a list of installed mods. Use the checkboxes to activate/deactivate mods and drag & drop mods to change their "installation" orders. - + Filter 过滤器 - + No groups - + Nexus IDs N网 ID - - - + + + Namefilter @@ -1393,12 +1485,12 @@ p, li { white-space: pre-wrap; } 开始 - + Pick a program to run. 选择è¦è¿è¡Œçš„程åºã€‚ - + <!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; } @@ -1413,12 +1505,12 @@ p, li { white-space: pre-wrap; } <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;">您å¯ä»¥æ·»åŠ æ–°çš„å·¥å…·åˆ°æ­¤åˆ—è¡¨ä¸­ï¼Œä½†æˆ‘ä¸èƒ½ä¿è¯ä¸€äº›æˆ‘没有测试过的工具能够正常工作。</span></p></body></html> - + Run program è¿è¡Œç¨‹åº - + <!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; } @@ -1431,17 +1523,17 @@ p, li { white-space: pre-wrap; } <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;">在 Mod Organizer å¯ç”¨çš„状æ€ä¸‹è¿è¡ŒæŒ‡å®šçš„程åºã€‚</span></p></body></html> - + Run è¿è¡Œ - + Create a shortcut in your start menu or on the desktop to the specified program - + <!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; } @@ -1454,7 +1546,7 @@ p, li { white-space: pre-wrap; } <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;">创建一个开始èœå•å¿«æ·æ–¹å¼ï¼Œä½¿æ‚¨å¯ä»¥ç›´æŽ¥åœ¨ MO 激活状æ€ä¸‹è¿è¡ŒæŒ‡å®šçš„程åºã€‚</span></p></body></html> - + Shortcut @@ -1479,12 +1571,12 @@ p, li { white-space: pre-wrap; } ä¿å­˜ - + List of available esp/esm files å¯ç”¨ esp 或 esm 文件的列表 - + <!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; } @@ -1501,12 +1593,12 @@ p, li { white-space: pre-wrap; } é‡è¦: 您å¯ä»¥åœ¨è¿™é‡Œæ›´æ”¹ BSA 的顺åºï¼Œä¸è¿‡ Mod 的安装顺åºä¼šä¼˜å…ˆäºŽè¿™é‡Œçš„è®¾ç½®ï¼ - + List of available BS Archives. Archives not checked here are not managed by MO and ignore installation order. å¯ç”¨ BSA 文件的列表。未勾选的项目ä¸ä¼šè¢« MO 管ç†å¹¶ä¸”会忽略安装顺åºã€‚ - + BSA files are archives (comparable to .zip files) that contain data assets (meshes, textures, ...) to be used by the game. As such they "compete" with loose files in your data directory over which is loaded. By default, BSAs that share their base name with an enabled ESP (i.e. plugin.esp and plugin.bsa) are automatically loaded and will have precedence over all loose files, the installation order you set up to the left is then ignored! @@ -1517,66 +1609,71 @@ BSAs checked here are loaded in such a way that your installation order is obeye 这里勾选的 BSA 将会ä¾ä»Žæ‚¨çš„安装顺åºï¼Œå¹¶ä¸”会自行调整加载顺åºã€‚ - - + + File 文件 - + <html><head/><body><p>Marked Archives (<img src=":/MO/gui/warning_16"/>) are still loaded on Skyrim but the <a href="http://forums.bethsoft.com/topic/1354395-update-bsas-and-you/"><span style=" text-decoration: underline; color:#0000ff;">regular file override</span></a> mechanism will apply: Loose files override BSAs, no matter the mod/plugin priority.</p></body></html> - + Mod Mod - + Data Data - + + Sort + + + + refresh data-directory overview 刷新 Data 目录总览 - + Refresh the overview. This may take a moment. 刷新总览,这å¯èƒ½éœ€è¦ä¸€äº›æ—¶é—´ã€‚ - - - + + + Refresh 刷新 - + This is an overview of your data directory as visible to the game (and tools). 这是在游æˆä¸­å¯è§çš„ Data 目录 (和工具) 的总览。 - - + + Filter the above list so that only conflicts are displayed. 过滤上é¢çš„列表,使您åªèƒ½çœ‹åˆ°æœ‰å†²çªçš„æ–‡ä»¶ã€‚ - + Show only conflicts åªæ˜¾ç¤ºå†²çª - + Saves 存档 - + <!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; } @@ -1593,160 +1690,160 @@ p, li { white-space: pre-wrap; } <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;">如果您在å³é”®èœå•ä¸­ç‚¹å‡»â€œä¿®å¤ Modâ€ï¼Œé‚£ä¹ˆ MO 便会å°è¯•激活所有 Mod å’Œ esp æ¥ä¿®å¤é‚£äº›ç¼ºå¤±çš„ esp,它并ä¸ä¼šç¦ç”¨ä»»ä½•东西ï¼</span></p></body></html> - + Downloads 下载 - + This is a list of mods you downloaded from Nexus. Double click one to install it. 这是当å‰å·²ä¸‹è½½çš„ Mod 的列表,åŒå‡»è¿›è¡Œå®‰è£…。 - + Compact 紧凑 - + Show Hidden - + Tool Bar å·¥å…·æ  - + Install Mod 安装 Mod - + Install &Mod 安装 &Mod - + Install a new mod from an archive 通过压缩包æ¥å®‰è£…一个新 Mod - + Ctrl+M Ctrl+M - + Profiles é…置文件 - + &Profiles &é…置文件 - + Configure Profiles 设置é…置文件 - + Ctrl+P Ctrl+P - + Executables 坿‰§è¡Œç¨‹åº - + &Executables &坿‰§è¡Œç¨‹åº - + Configure the executables that can be started through Mod Organizer é…ç½®å¯é€šè¿‡ MO æ¥å¯åŠ¨çš„ç¨‹åº - + Ctrl+E Ctrl+E - - + + Tools - + &Tools - + Ctrl+I Ctrl+I - + Settings 设置 - + &Settings &设置 - + Configure settings and workarounds é…置设定和解决方案 - + Ctrl+S Ctrl+S - + Nexus N网 - + Search nexus network for more mods æœç´¢Nç½‘ä»¥èŽ·å–æ›´å¤š Mod - + Ctrl+N Ctrl+N - - + + Update æ›´æ–° - + Mod Organizer is up-to-date Mod Organizer 现在是最新版本 - - + + No Problems 没有问题 - + This button will be highlighted if MO discovered potential problems in your setup and provide tips on how to fix them. !Work in progress! @@ -1757,54 +1854,54 @@ Right now this has very limited functionality 当剿­¤åŠŸèƒ½æ‰€èƒ½æä¾›çš„项目éžå¸¸æœ‰é™ - - + + Help 帮助 - + Ctrl+H - + Endorse MO - - + + Endorse Mod Organizer - + Toolbar - + Desktop - + Start Menu - + Problems 问题 - + There are potential problems with your setup 您的安装中存在潜在的问题 - + Everything seems to be in order ä¸€åˆ‡äº•ç„¶æœ‰åº @@ -1821,22 +1918,22 @@ Right now this has very limited functionality <li>.Net 未安装或版本过旧。想è¦è¿è¡Œ NCC 您必须先安装 .Net,您å¯ä»¥åœ¨ä»¥ä¸‹åœ°å€ä¸­èŽ·å–: <a href="%1">%1</a></li> - + Help on UI 界é¢å¸®åŠ© - + Documentation Wiki 说明文档 (维基) - + Report Issue 报告问题 - + Tutorials @@ -1845,425 +1942,426 @@ Right now this has very limited functionality 无法ä¿å­˜åŠ è½½é¡ºåº - + failed to save load order: %1 无法ä¿å­˜åŠ è½½é¡ºåº: %1 - + failed to save archives order, do you have write access to "%1"? 无法ä¿å­˜æ¡£æ¡ˆé¡ºåºï¼Œæ‚¨ç¡®å®šæ‚¨æœ‰æƒé™æ›´æ”¹ "%1"? - + + About + + + + + About Qt + + + + Name åç§° - + Please enter a name for the new profile - + failed to create profile: %1 无法创建é…置文件: %1 - + Show tutorial? - + You are starting Mod Organizer for the first time. Do you want to show a tutorial of its basic features? If you choose no you can always start the tutorial from the "Help"-menu. - + Downloads in progress 正在下载 - + There are still downloads in progress, do you really want to quit? 仿œ‰æ­£åœ¨è¿›è¡Œä¸­çš„下载,您确定è¦é€€å‡ºå—? - + failed to read savegame: %1 无法读å–存档: %1 - + Plugin "%1" failed: %2 - + Plugin error - + It appears the plugin "%1" failed to load last startup and caused MO to crash. Do you want to disable it? (Please note: If this is the first time you see this message for this plugin you may want to give it another try. The plugin may be able to recover from the problem) - + Failed to start "%1" 无法å¯åЍ "%1" - + Waiting ç¨ç­‰ - + Please press OK once you're logged into steam. 当您登录 Steam 时请点击确定。 - "%1" not found - "%1" 未找到 + "%1" 未找到 - + Start Steam? å¯åЍ Steam? - + Steam is required to be running already to correctly start the game. Should MO try to start steam now? æƒ³è¦æ­£ç¡®åœ°å¯åŠ¨éŠæˆ²ï¼ŒSteam 必须处于è¿è¡Œçжæ€ã€‚MO è¦ç«‹å³å¯åЍ Steam å—? - + Also in: <br> 也在: <br> - + No conflict æ²¡æœ‰å†²çª - + <Edit...> <编辑...> - - Failed to refresh list of esps: %s - - - - + This bsa is enabled in the ini file so it may be required! 该 BSA 已在 Ini 文件中å¯ç”¨ï¼Œå› æ­¤å®ƒå¯èƒ½æ˜¯å¿…需的。 - + This archive will still be loaded since there is a plugin of the same name but its files will not follow installation order! 此档案还是会被加载,因为存在åŒåæ’件。ä¸è¿‡å®ƒæ‰€åŒ…å«çš„的文件ä¸ä¼šéµå¾ªå®‰è£…顺åºï¼ - + Activating Network Proxy - - + + Installation successful 安装æˆåŠŸ - - + + Configure Mod é…ç½® Mod - - + + This mod contains ini tweaks. Do you want to configure them now? æ­¤ Mod ä¸­åŒ…å« Ini 设定文件,您想现在就对它们进行é…ç½®å—? - - + + mod "%1" not found Mod "%1" 未找到 - - + + Installation cancelled å®‰è£…å·²å–æ¶ˆ - - + + The mod was not installed completely. Mod 没有完全安装。 - + Some plugins could not be loaded - + Too many esps and esms enabled - - + + Description missing - + The game doesn't allow more than 255 active plugins (including the official ones) to be loaded. You have to disable some unused plugins or merge some plugins into one. You can find a guide here: <a href="http://wiki.step-project.com/Guide:Merging_Plugins">http://wiki.step-project.com/Guide:Merging_Plugins</a> - + Choose Mod 选择 Mod - + Mod Archive Mod 压缩包 - + Start Tutorial? - + You're about to start a tutorial. For technical reasons it's not possible to end the tutorial early. Continue? - - + + Download started 开始下载 - + failed to update mod list: %1 无法更新 Mod 列表: %1 - + failed to spawn notepad.exe: %1 æ— æ³•ç”Ÿæˆ notepad.exe: %1 - + failed to open %1 无法打开 %1 - + failed to change origin name: %1 无法更改原始文件å: %1 - + Multiple esps activated, please check that they don't conflict. - - + + Create Mod... - + A mod with this name already exists - + Continue? - + The versioning scheme decides which version is considered newer than another. This function will guess the versioning scheme under the assumption that the installed version is outdated. - + + Sorry - + I don't know a versioning scheme where %1 is newer than %2. - + <All> <全部> - + <Checked> <已勾选> - + Plugin "%1" failed - + failed to init plugin %1: %2 - + The following plugins could not be loaded. The reason may be missing dependencies (i.e. python) or an outdated version: - - Failed to move "%1" from mod "%2" to "%3": %4 - - - - + <Unchecked> <未勾选> - + <Update> <有更新> - + <No category> <无类别> - + <Conflicted> - + <Not Endorsed> - + failed to rename mod: %1 无法é‡å‘½å Mod: %1 - + Overwrite? - + This will replace the existing mod "%1". Continue? - + failed to remove mod "%1" - - - + + + failed to rename "%1" to "%2" - - - + + + + Confirm 确认 - + Remove the following mods?<br><ul>%1</ul> - + failed to remove mod: %1 无法移动 Mod: %1 - - + + Failed 失败 - + Installation file no longer exists 安装文件ä¸å¤å­˜åœ¨ - + Mods installed with old versions of MO can't be reinstalled in this way. 旧版 MO 安装的 Mod æ— æ³•ä½¿ç”¨æ­¤æ–¹æ³•é‡æ–°å®‰è£…。 - - + + You need to be logged in with Nexus to endorse - - + + Extract BSA 解压 BSA - + This mod contains at least one BSA. Do you want to unpack it? (This removes the BSA after completion. If you don't know about BSAs, just select no) æ­¤ Mod 中至少包å«ä¸€ä¸ª BSA。您确定è¦è§£åŽ‹å—? (解压完æˆåŽï¼ŒBSA 文件将会被删除。如果您ä¸äº†è§£ BSA çš„è¯ï¼Œè¯·é€‰æ‹©â€œå¦â€) - - - + + + failed to read %1: %2 æ— æ³•è¯»å– %1: %2 - - + + This archive contains invalid hashes. Some files may be broken. 压缩包 Hash 值错误。部分文件å¯èƒ½å·²ç»æŸå。 - + Nexus ID for this Mod is unknown æ­¤ Mod çš„N网 ID 未知 @@ -2276,92 +2374,92 @@ This function will guess the versioning scheme under the assumption that the ins 选择优先级 - + Really enable all visible mods? 确定è¦å¯ç”¨å…¨éƒ¨å¯è§çš„ Mod å—? - + Really disable all visible mods? 确定è¦ç¦ç”¨å…¨éƒ¨å¯è§çš„ Mod å—? - + Choose what to export - + Everything - + All installed mods are included in the list - + Active Mods - + Only active (checked) mods from your current profile are included - + Visible - + All mods visible in the mod list are included - + export failed: %1 - + Install Mod... 安装 Mod... - + Enable all visible å¯ç”¨æ‰€æœ‰å¯è§é¡¹ç›® - + Disable all visible ç¦ç”¨æ‰€æœ‰å¯è§é¡¹ç›® - + Check all for update 检查更新 - + Export to csv... - + Sync to Mods... åŒæ­¥åˆ° Mod... - + Restore Backup - + Remove Backup... @@ -2370,312 +2468,362 @@ This function will guess the versioning scheme under the assumption that the ins 设置类别 - + Primary Category - + Change versioning scheme - + Un-ignore update - + Ignore update - + Rename Mod... é‡å‘½å... - + Remove Mod... 移除 Mod... - + Reinstall Mod 釿–°å®‰è£… Mod - + Un-Endorse - - + + Endorse - + Won't endorse - + Endorsement state unknown - + Ignore missing data - + Visit on Nexus 在N网上æµè§ˆ - + Open in explorer 在资æºç®¡ç†å™¨ä¸­æ‰“å¼€ - + Information... ä¿¡æ¯... - - + + Exception: 例外: - - + + Unknown exception 未知的例外 - + <Multiple> - + + Really delete "%1"? + + + + Fix Mods... ä¿®å¤ Mod... - - + + Delete + + + + + failed to remove %1 无法删除 %1 - - + + failed to create %1 无法创建 %1 - + Can't change download directory while downloads are in progress! 下载文件时ä¸èƒ½ä¿®æ”¹ä¸‹è½½ç›®å½•ï¼ - + Download failed 下载失败 - + failed to write to file %1 无法写入文件 %1 - + %1 written 已写入 %1 - + Select binary é€‰æ‹©å¯æ‰§è¡Œæ–‡ä»¶ - + Binary - + Enter Name 输入åç§° - + Please enter a name for the executable 请为程åºè¾“入一个åç§° - + Not an executable 䏿˜¯å¯æ‰§è¡Œç¨‹åº - + This is not a recognized executable. æ— æ³•è¯†åˆ«çš„å¯æ‰§è¡Œæ–‡ä»¶ - - + + Replace file? æ›¿æ¢æ–‡ä»¶ï¼Ÿ - + There already is a hidden version of this file. Replace it? 已存在åŒå文件,但该文件被éšè—了。确定è¦è¦†ç›–å—? - - + + File operation failed 文件æ“作错误 - - + + Failed to remove "%1". Maybe you lack the required file permissions? - + There already is a visible version of this file. Replace it? - + + file not found: %1 + 文件未找到: %1 + + + + failed to generate preview for %1 + + + + + Sorry, can't preview anything. This function currently does not support extracting from bsas. + + + + Update available æ›´æ–°å¯ç”¨ - + Open/Execute 打开/执行 - + Add as Executable æ·»åŠ ä¸ºå¯æ‰§è¡Œæ–‡ä»¶ - + + Preview + + + + Un-Hide å–æ¶ˆéšè— - + Hide éšè— - + Write To File... 写入文件... - + Do you want to endorse Mod Organizer on %1 now? - + Remove 移除 - + Unlock load order - + Lock load order - + + BOSS working + + + + + failed to run boss: %1 + + + + Request to Nexus failed: %1 - + + Executable "%1" not found + + + + + Failed to refresh list of esps: %1 + + + + This will move all files from overwrite into a new, regular mod. Please enter a name: - + Add/Remove Categories - + Replace Categories - - + + login successful 登录æˆåŠŸ - + login failed: %1. Trying to download anyway 登录失败: %1,请å°è¯•使用别的方法下载 - + login failed: %1 无法登录: %1 - + login failed: %1. You need to log-in with Nexus to update MO. 登录失败: %1。您需è¦ç™»å½•到N网æ‰èƒ½æ›´æ–° MO - + Error 错误 - + failed to extract %1 (errorcode %2) 无法解压 %1 (é”™è¯¯ä»£ç  %2) - + Extract... 解压... - + Edit Categories... 编辑类别... - + Enable all 全部å¯ç”¨ - + Disable all 全部ç¦ç”¨ @@ -2722,58 +2870,58 @@ Please enter a name: Mod ä¿¡æ¯ - + Textfiles 文本文件 - + A list of text-files in the mod directory. Mod 目录里包å«çš„æ–‡æœ¬æ–‡ä»¶çš„列表。 - + A list of text-files in the mod directory like readmes. Mod 目录里包å«çš„æ–‡æœ¬æ–‡ä»¶ (类似于自述文件) 的列表 。 - - + + Save ä¿å­˜ - + INI-Files Ini 文件 - + This is a list of .ini files in the mod. Mod 目录里包å«çš„ Ini 文件的列表。 - + This is a list of .ini files in the mod. These are usually used to configure the behaviour of mods if there are configurable parameters. Mod 目录里包å«çš„ Ini 文件的列表,这些文件通常用æ¥é…ç½® Mod 的行为,如果有å¯è®¾ç½®çš„傿•°çš„è¯ã€‚ - + Save changes to the file. ä¿å­˜æ›´æ”¹åˆ°æ–‡ä»¶ä¸­ã€‚ - + Save changes to the file. This overwrites the original. There is no automatic backup! ä¿å­˜æ›´æ”¹åˆ°æ–‡ä»¶ä¸­ï¼Œè¿™å°†ä¼šè¦†ç›–åŽŸå§‹æ–‡ä»¶ï¼Œå¹¶ä¸”æ²¡æœ‰è‡ªåŠ¨å¤‡ä»½ï¼ - + Images 图片 - + Images located in the mod. ä½äºŽ Mod 中的图片。 @@ -2790,13 +2938,13 @@ p, li { white-space: pre-wrap; } <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;">这里列出了所有在 Mod 目录里的图片 (.jpg å’Œ .png),如截图等。点击其中的一个æ¥èŽ·å¾—è¾ƒå¤§çš„è§†å›¾ã€‚</span></p></body></html> - - + + Optional ESPs å¯é€‰ ESP - + List of esps and esms that can not be loaded by the game. 包å«äº†ä¸ä¼šè¢«æ¸¸æˆè½½å…¥çš„ esp å’Œ esm 的列表。 @@ -2820,12 +2968,12 @@ p, li { white-space: pre-wrap; } <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;">大部分 Mod 没有å¯é€‰ esp,因此您正在看的很有å¯èƒ½åªæ˜¯ä¸€ä¸ªç©ºåˆ—表。</span></p></body></html> - + This lists all the images (.jpg and .png) in the mod directory, like screenshots and such. Click one to get a larger view. - + List of esps and esms contained in this plugin that currently can not be loaded by the game. They will not even appear in the esp-list in the main MO-window. They usually contain optional functionality, see the readme. @@ -2833,103 +2981,103 @@ Most mods do not have optional esps, so chances are good you are looking at an e - + Make the selected mod in the lower list unavailable. 使下表中已选的 Mod å˜å¾—ä¸å¯ç”¨ã€‚ - + The selected esp (in the lower list) will be pushed into a subdirectory of the mod and will thus become "invisible" to the game. It can then no longer be activated. 已选的 esp (在下表中) 将会被放入 Mod çš„å­ç›®å½•里,在游æˆé‡Œå°†ä¼šå˜å¾—“ä¸å¯è§â€ï¼Œå¹¶ä¸”之åŽå°±ä¸èƒ½å†è¢«æ¿€æ´»äº†ã€‚ - + Move a file to the data directory. 移动一个文件到 Data 目录。 - + This moves a esp to the esp directory so it can be enabled in the main window. Please note that the ESP merely becomes "available", it will not necessarily be loaded! That is configured in the main window of omo. 移动一个 esp 文件到 esp 目录,这样它就å¯ä»¥åœ¨ä¸»çª—å£ä¸­å¯ç”¨äº†ã€‚请注æ„: ESP åªæ˜¯å˜å¾—“å¯ç”¨â€ï¼Œå®ƒå¹¶ä¸ä¸€å®šä¼šè¢«è½½å…¥ï¼æƒ³è¦è½½å…¥è¯·åœ¨ MO 的主窗å£ä¸­å‹¾é€‰ã€‚ - + ESPs in the data directory and thus visible to the game. ESP 在 Data 目录,因此它在游æˆé‡Œä¼šå˜å¾—å¯è§ã€‚ - + These are the mod files that are in the (virtual) data directory of your game and will thus be selecteable in the esp list in the main window. 这些 Mod 文件ä½äºŽæ‚¨æ¸¸æˆçš„ (虚拟) Data 目录里,因此它们在主窗å£çš„ esp 列表中会å˜å¾—å¯é€‰ã€‚ - + Available ESPs å¯ç”¨ ESP - + Conflicts å†²çª - + The following conflicted files are provided by this mod ä»¥ä¸‹å†²çªæ–‡ä»¶ç”±æ­¤ Mod æä¾› - - + + File 文件 - + Overwritten Mods 覆盖的 Mod - + The following conflicted files are provided by other mods ä»¥ä¸‹å†²çªæ–‡ä»¶ç”±å…¶å®ƒ Mod æä¾› - + Providing Mod æä¾›çš„ Mod - + Non-Conflicted files éžå†²çªæ–‡ä»¶ - + Categories 类别 - + Primary Category - + Nexus Info Nç½‘ä¿¡æ¯ - + Mod ID Mod ID - + Mod ID for this mod on Nexus. N网上此 Mod çš„ ID。 - + <!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; } @@ -2942,7 +3090,7 @@ p, li { white-space: pre-wrap; } <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">N网上此 Mod çš„ ID,如果您在 MO 中下载并安装了 Mod 它将被自动填写,å¦åˆ™æ‚¨éœ€è¦æ‰‹åŠ¨è¾“å…¥ã€‚è¦æ‰¾åˆ°æ­£ç¡®çš„ ID,在N网找到 Mod。比如,åƒè¿™æ ·çš„链接: <a href=" http://www.skyrimnexus.com/downloads/file.php?id=1334"><span style=" text-decoration: underline; color:#0000ff;">http://www.skyrimnexus.com/downloads/file.php?id=1334</span></a> 在上é¢çš„例å­ä¸­ï¼Œ1334å°±æ˜¯æ‚¨è¦æ‰¾çš„ ID。此外: 上é¢çš„就是 Mod Organizer 在N网的链接,为什么ä¸çŽ°åœ¨å°±åˆ°é‚£é‡ŒåŽ»èµžåŒæˆ‘呢?</span></a></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; } @@ -2955,32 +3103,32 @@ p, li { white-space: pre-wrap; } <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;">Mod 的已安装版本,鼠标æç¤ºå°†æ˜¾ç¤ºN网上的当å‰ç‰ˆæœ¬ï¼Œå·²å®‰è£…的版本å·åªæœ‰åœ¨æ‚¨é€šè¿‡ MO æ¥å®‰è£… Mod 的时候æ‰ä¼šè‡ªåŠ¨å¡«å†™ã€‚</span></p></body></html> - + Version 版本 - + Refresh 刷新 - + Refresh all information from Nexus. - + Description æè¿° - + <!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:'MS Shell Dlg 2'; font-size:7.8pt; font-weight:400; font-style:normal;"> -<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /></p></body></html> +</style></head><body style=" font-family:'MS Shell Dlg 2'; font-size:8.25pt; font-weight:400; font-style:normal;"> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:8pt;"><br /></p></body></html> @@ -3000,7 +3148,7 @@ p, li { white-space: pre-wrap; } 类型 - + Name åç§° @@ -3009,12 +3157,12 @@ p, li { white-space: pre-wrap; } å¤§å° (KB) - + Endorse - + Notes @@ -3027,17 +3175,17 @@ p, li { white-space: pre-wrap; } 您支æŒè¿‡è¿™ä¸ª Mod 了å—? - + Filetree 文件树 - + A directory view of this mod 这个 Mod 的目录视图 - + <!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; } @@ -3052,53 +3200,53 @@ p, li { white-space: pre-wrap; } <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;">所åšçš„æ›´æ”¹å°†ä¼šç«‹å³ä½œç”¨äºŽç£ç›˜ä¸Šçš„æ–‡ä»¶ï¼Œæ‰€ä»¥è¯·</span><span style=" font-size:9pt; font-weight:600;">谨慎æ“作</span><span style=" font-size:9pt;">。</span></p></body></html> - + Previous - + Next 下一步 - + Close 关闭 - + &Delete &删除 - + &Rename &é‡å‘½å - + &Hide &éšè— - + &Unhide &å–æ¶ˆéšè— - + &Open &打开 - + &New Folder &新建文件夹 - - + + Save changes? ä¿å­˜æ›´æ”¹å—? @@ -3107,79 +3255,79 @@ p, li { white-space: pre-wrap; } ä¿å­˜æ›´æ”¹åˆ° "%1"? - + File Exists 文件已存在 - + A file with that name exists, please enter a new one 文件å已存在,请输入其它åç§° - + failed to move file 无法移动文件 - + failed to create directory "optional" 无法创建 "optional" 目录 - - + + Info requested, please wait 请求信æ¯å·²å‘出,请ç¨åŽ - + (description incomplete, please visit nexus) (æè¿°ä¿¡æ¯ä¸å®Œæ•´ï¼Œè¯·è®¿é—®N网) - + Current Version: %1 当å‰ç‰ˆæœ¬: %1 - + No update available 没有å¯ç”¨çš„æ›´æ–° - + Main ä¸»è¦æ–‡ä»¶ - - + + Save changes to "%1"? - + Update æ›´æ–° - + Optional å¯é€‰æ–‡ä»¶ - + Old æ—§æ¡£ - + Misc æ‚项 - + Unknown 未知 @@ -3188,13 +3336,13 @@ p, li { white-space: pre-wrap; } 请求失败: %1 - + <a href="%1">Visit on Nexus</a> <a href="%1">访问N网</a> - - + + Confirm 确认 @@ -3211,98 +3359,98 @@ p, li { white-space: pre-wrap; } 例外: %1 - + Failed to delete %1 无法删除 %1 - + Are sure you want to delete "%1"? 确定è¦åˆ é™¤ "%1" å—? - + Are sure you want to delete the selected files? 确定è¦åˆ é™¤æ‰€é€‰çš„æ–‡ä»¶å—? - - + + New Folder 新建文件夹 - + Failed to create "%1" 无法创建 "%1" - - + + Replace file? æ›¿æ¢æ–‡ä»¶ï¼Ÿ - + There already is a hidden version of this file. Replace it? 已存在åŒå文件,但该文件被éšè—了。确定è¦è¦†ç›–å—? - - + + File operation failed 文件æ“作错误 - - + + Failed to remove "%1". Maybe you lack the required file permissions? 无法移除 "%1"。也许您需è¦è¶³å¤Ÿçš„æ–‡ä»¶æƒé™ï¼Ÿ - - + + failed to rename %1 to %2 无法é‡å‘½å %1 为 %2 - + There already is a visible version of this file. Replace it? 已存在åŒå文件。确定è¦è¦†ç›–å—? - + Un-Hide å–æ¶ˆéšè— - + Hide éšè— - + Please enter a name - - + + Error 错误 - + Invalid name. Must be a valid file name - + A tweak by that name exists - + Create Tweak @@ -3438,8 +3586,9 @@ p, li { white-space: pre-wrap; } - installed version: %1, newest version: %2 - 当å‰ç‰ˆæœ¬: %1,最新版本: %2 + installed version: "%1", newest version: "%2" + installed version: %1, newest version: %2 + 当å‰ç‰ˆæœ¬: %1,最新版本: %2 Name @@ -3640,17 +3789,17 @@ p, li { white-space: pre-wrap; } NexusInterface - + Failed to guess mod id for "%1", please pick the correct one - + empty response 未å“应 - + invalid response 无效的å“应 @@ -4616,85 +4765,93 @@ Right now this has very limited functionality ESP 文件没有找到: %1 - + Mod Index - - + + Flags + + + + + unknown - + Name of your mods - + Load priority of your mod. The higher, the more "important" it is and thus overwrites data from plugins with lower priority. - + The modindex determins the formids of objects originating from this mods. - + failed to update esp info for file %1 (source id: %2), error: %3 - + esp not found: %1 - + Confirm 确认 - + Really enable all plugins? - + Really disable all plugins? - + The file containing locked plugin indices is broken - - failed to open output file: %1 - 无法打开输出文件: %1 + 无法打开输出文件: %1 - + Some of your plugins have invalid names! These plugins can not be loaded by the game. Please see mo_interface.log for a list of affected plugins and rename them. 您的一些æ’ä»¶å称无效ï¼è¿™äº›æ’件无法被游æˆè½½å…¥ã€‚请查看 mo_interface.log æ¥ç¡®è®¤é‚£äº›å—å½±å“çš„æ’ä»¶å¹¶é‡å‘½å它们。 - + + BOSS dll incompatible + + + + Missing Masters - + Enabled Masters - + failed to restore load order for %1 @@ -4707,17 +4864,17 @@ Right now this has very limited functionality 最高值 - + This plugin can't be disabled (enforced by the game) 这个æ’ä»¶ä¸èƒ½è¢«ç¦ç”¨ (ç”±æ¸¸æˆæ‰§è¡Œ) - + Origin: %1 隶属于: %1 - + Name åç§° @@ -4726,7 +4883,7 @@ Right now this has very limited functionality Mod åç§° - + Priority 优先级 @@ -4743,6 +4900,19 @@ Right now this has very limited functionality 这些索引决定了那些通过 Mod 引入的物å“,法术等等的 ID。ID çš„ä¸€èˆ¬æ ¼å¼æ˜¯ "xxyyyyyy",其中 "xx" 就是这个的索引,而 "yyyyyy" 则是由 Mod 自己所决定的。 + + PreviewDialog + + + Preview + + + + + Close + 关闭 + + ProblemsDialog @@ -4788,82 +4958,72 @@ p, li { white-space: pre-wrap; } 无法应用 Ini 设定 - + invalid profile name %1 - + failed to create %1 无法创建 %1 - - failed to open temporary file - - - - - failed to open "%1" for writing - - - - + failed to write mod list: %1 - + failed to update tweaked ini file, wrong settings may be used: %1 - + failed to create tweaked ini: %1 - - - - - + + + + + invalid index %1 无效的索引 %1 - + Overwrite directory couldn't be parsed - + invalid priority %1 无效的优先级 %1 - + failed to parse ini file (%1) - + failed to parse ini file (%1): %2 æ— æ³•è§£æž Ini 文件 (%1): %2 - - + + failed to modify "%1" - + Delete savegames? - + Do you want to delete local savegames? (If you select "No", the save games will show up again if you re-enable local savegames) @@ -5240,12 +5400,12 @@ p, li { white-space: pre-wrap; } 无法设置代ç†DLL加载 - + "%1" is missing "%1" 缺失 - + Permissions required éœ€è¦æƒé™ @@ -5254,8 +5414,8 @@ p, li { white-space: pre-wrap; } 当å‰çš„ç”¨æˆ·å¸æˆ·æ²¡æœ‰è¿è¡Œ Mod Organizer 所需的访问æƒé™ï¼Œå¿…è¦çš„修改将会自动进行 (MO 的目录将会为当å‰ç”¨æˆ·å¸æˆ·è€Œå˜å¾—å¯å†™),您将被请求使用管ç†å‘˜æƒé™æ‰§è¡Œ "mo_helper.exe"。 - - + + Woops 糟糕 @@ -5264,66 +5424,66 @@ p, li { white-space: pre-wrap; } Mod Organizer 崩溃了ï¼è¦ç”Ÿæˆè¯Šæ–­æ–‡ä»¶å—?如果您å‘é€è¿™ä¸ªæ–‡ä»¶åˆ°æˆ‘的邮箱 (sherb@gmx.net) 里的è¯ï¼Œè¿™ä¸ª Bug 会很有å¯èƒ½è¢«ä¿®å¤ã€‚ - + The current user account doesn't have the required access rights to run Mod Organizer. The neccessary changes can be made automatically (the MO directory will be made writable for the current user account). You will be asked to run "helper.exe" with administrative rights. - + ModOrganizer has crashed! Should a diagnostic file be created? If you send me this file (%1) to sherb@gmx.net, the bug is a lot more likely to be fixed. Please include a short description of what you were doing when the crash happened - + ModOrganizer has crashed! Unfortunately I was not able to write a diagnostic file: %1 Mod Organizer 崩溃了ï¼é—憾的是,我无法生æˆè¯Šæ–­æ–‡ä»¶: %1 - - + + Mod Organizer Mod Organizer - + An instance of Mod Organizer is already running Mod Organizer 的一个实例正在è¿è¡Œ - + No game identified in "%1". The directory is required to contain the game binary and its launcher. "%1" 中未检测到游æˆã€‚请确ä¿è¯¥è·¯å¾„ä¸­åŒ…å«æ¸¸æˆæ‰§è¡Œç¨‹åºä»¥åŠå¯¹åº”çš„ Launcher 文件。 - - + + Please select the game to manage 请选择想è¦ç®¡ç†çš„æ¸¸æˆ - + Please select the game edition you have (MO can't start the game correctly if this is set incorrectly!) - + Please use "Help" from the toolbar to get usage instructions to all elements 请使用工具æ ä¸Šçš„â€œå¸®åŠ©â€æ¥èŽ·å¾—æ‰€æœ‰å…ƒç´ çš„ä½¿ç”¨è¯´æ˜Ž - - + + <Manage...> <管ç†...> - + failed to parse profile %1: %2 无法解æžé…置文件 %1: %2 - - + + failed to find "%1" 未能找到 "%1" @@ -5332,17 +5492,17 @@ p, li { white-space: pre-wrap; } ç¼–ç é”™è¯¯ï¼Œè¯·å‘作者汇报此 Bug 并且附上 mo_interface.log æ–‡ä»¶ï¼ - + failed to access %1 无法访问 %1 - + failed to set file time %1 无法设置文件时间 %1 - + failed to create %1 无法创建 %1 @@ -5378,12 +5538,12 @@ p, li { white-space: pre-wrap; } 无法打开 %1 - + Script Extender 脚本拓展 - + Proxy DLL 代ç†DLL @@ -5408,22 +5568,22 @@ Start elevated anyway? (you will be asked if you want to allow ModOrganizer.exe - + failed to spawn "%1": %2 æ— æ³•ç”Ÿæˆ "%1": %2 - + "%1" doesn't exist "%1" ä¸å­˜åœ¨ - + failed to inject dll into "%1": %2 无法注入 dll 到 "%1": %2 - + failed to run "%1" 无法è¿è¡Œ "%1" @@ -5484,6 +5644,11 @@ Start elevated anyway? (you will be asked if you want to allow ModOrganizer.exe invalid game type %1 + + + failed to open temporary file + + QueryOverwriteDialog @@ -5718,18 +5883,18 @@ Start elevated anyway? (you will be asked if you want to allow ModOrganizer.exe 需è¦ç®¡ç†å‘˜çš„æƒé™æ¥æ›´æ”¹è¿™ä¸ªã€‚ - - + + attempt to store setting for unknown plugin "%1" - + Confirm 确认 - + Changing the mod directory affects all your profiles! Mods not present (or named differently) in the new location will be disabled in all profiles. There is no way to undo this unless you backed up your profiles manually. Proceed? 修改 Mod ç›®å½•å°†ä¼šå½±å“æ‚¨çš„é…ç½®ï¼æ–°ç›®å½•中ä¸å­˜åœ¨ (或者åç§°ä¸åŒ) çš„ Mod 将在所有é…ç½®ä¸­è¢«ç¦æ­¢æŽ‰ã€‚æ­¤æ“作无法撤销,所以执行此æ“作å‰å»ºè®®å…ˆå¤‡ä»½ä¸‹è‡ªå·±çš„é…ç½®ã€‚ç«‹å³æ‰§è¡Œï¼Ÿ @@ -5878,52 +6043,57 @@ p, li { white-space: pre-wrap; } é…ç½® Mod 类别 - + Disable automatic internet features - + Disable automatic internet features. This does not affect features that are explicitly invoked by the user (like checking mods for updates, endorsing, opening the web browser) - + Offline Mode - + Use a proxy for network connections. - + Use a proxy for network connections. This uses the system-wide settings which can be configured in Internet Explorer. Please note that MO will start up a few seconds slower on some systems when using a proxy. - + Use HTTP Proxy (Uses System Settings) - - Known Servers (Dynamically updated every download) + + Associate with "Download with manager" links + + + + + Known Servers (updated on download) - + Preferred Servers (Drag & Drop) - + Blacklisted Plugins (use <del> to remove): - + Mod Organizer needs a dll to be injected into the game so all mods are visible to it. There are several means to do this: *Mod Organizer* (default) In this mode the Mod Organizer itself injects the dll. The disadvantage is that you always have to start the game through MO or a link created by it. @@ -5992,12 +6162,12 @@ p, li { white-space: pre-wrap; } 自动登录 - + Username è´¦å· - + Password å¯†ç  @@ -6014,52 +6184,52 @@ p, li { white-space: pre-wrap; } 首选外部æµè§ˆå™¨ - + Plugins - + Author: - + Version: - + Description: - + Key - + Value - + Workarounds 解决方案 - + Steam App ID Steam App ID - + The Steam AppID for your game 您游æˆçš„ Steam AppID - + <!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; } @@ -6086,12 +6256,12 @@ p, li { white-space: pre-wrap; } <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;">其中 22380 å°±æ˜¯æ‚¨è¦æ‰¾çš„ ID。</span></p></body></html> - + Load Mechanism 加载机制 - + Select loading mechanism. See help for details. 选择加载机制,使用帮助查看更多细节。 @@ -6116,17 +6286,17 @@ p, li { white-space: pre-wrap; } <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt; font-weight:600;">代ç†DLL</span><span style=" font-size:9pt;"> åœ¨è¿™ç§æ¨¡å¼ä¸‹ï¼ŒMO 将替æ¢ä¸€ä¸ªæ¸¸æˆçš„ dll æ¥åŠ è½½ MO (当然原æ¥çš„ dll),这仅适用于 Steam 版本的游æˆï¼Œå¹¶ä¸”åªåœ¨ Skyrim 上åšè¿‡æµ‹è¯•。请åªåœ¨å…¶å®ƒåŠ è½½æœºåˆ¶ä¸èƒ½å·¥ä½œçš„æƒ…况下æ‰ä½¿ç”¨å®ƒã€‚</span></p></body></html> - + NMM Version NMM 版本 - + The Version of Nexus Mod Manager to impersonate. æƒ³è¦æ¨¡æ‹Ÿçš„ NMM 版本å·ã€‚ - + Mod Organizer uses an API provided by the Nexus to provide features like checking for updates and downloading files. Unfortunately this API has not been made available officially to third party tools like MO so we have to impersonate the Nexus Mod Manager to be allowed in. On top of this Nexus has used the client identification to lock out outdated versions of NMM to force users to update. This means that MO also needs to impersonate the new version of NMM even if MO doesn't need an update. Therefore you can configure the version to identify as here. Please note that MO does identify itself as MO to the webserver, it's not lying about what it is. It is merely adding a "compatible" NMM version to the user agent. @@ -6139,7 +6309,7 @@ tl;dr-version: If Nexus-features don't work, insert the current version num å˜æ›´ç‰ˆæœ¬å·: 如果Nç½‘åŠŸèƒ½ä¸æ­£å¸¸äº†ï¼Œé‚£ä¹ˆè¯·åœ¨è¿™é‡Œè¾“å…¥ NMM 的当å‰ç‰ˆæœ¬å·å¹¶é‡è¯•一下。 - + These are workarounds for problems with Mod Organizer. Please make sure you read the help text before changing anything here. @@ -6152,48 +6322,48 @@ tl;dr-version: If Nexus-features don't work, insert the current version num 例如: 0.33.1 - + Enforces that inactive ESPs and ESMs are never loaded. 强制执行,未激活的 ESP å’Œ ESM å°†ä¸ä¼šè¢«åŠ è½½ã€‚ - + It seems that the Games occasionally load ESP or ESM files even if they haven't been activated as plugins. I don't yet know what the circumstances are, but user reports imply it is in some cases unwanted. If this is checked, ESPs and ESMs not checked in the List are invisible to the game and can not be loaded. 看æ¥ï¼Œæ¸¸æˆå¶å°”ä¼šåŠ è½½ä¸€äº›æ²¡æœ‰è¢«æ¿€æ´»æˆæ’ä»¶çš„ ESP 或 ESM 文件。 我还尚ä¸çŸ¥é“它在什么情况下会这样,但是有用户报告说它在æŸäº›æƒ…况下是很ä¸å¿…è¦çš„。如果这个选项被选中,那么在列表中没有被勾选的 ESP å’Œ ESM å°†ä¸ä¼šåœ¨æ¸¸æˆä¸­å‡ºçŽ°ï¼Œå¹¶ä¸”ä¹Ÿä¸ä¼šè¢«è½½å…¥ã€‚ - + Hide inactive ESPs/ESMs éšè—未激活的 ESP 或 ESM - + If checked, files (i.e. esps, esms and bsas) belonging to the core game can not be disabled in the UI. (default: on) - + If checked, files (i.e. esps, esms and bsas) belonging to the core game can not be disabled in the UI. (default: on) Uncheck this if you want to use Mod Organizer with total conversions (like Nehrim) but be aware that the game will crash if required files are not enabled. - + Force-enable game files - - + + For Skyrim, this can be used instead of Archive Invalidation. It should make AI redundant for all Profiles. For the other games this is not a sufficient replacement for AI! 对于天际,这个å¯ä»¥ç”¨æ¥å–代档案无效化,它将会使档案无效化对所有é…置都å˜å¾—多余。 但是对于其它游æˆï¼Œè¿™å¹¶ä¸æ˜¯ä¸€ä¸ªå¾ˆå¥½çš„æ›¿ä»£å“ï¼ - + Back-date BSAs é‡ç½® BSA 文件修改日期 @@ -6202,27 +6372,27 @@ For the other games this is not a sufficient replacement for AI! 这些是 Mod Organizer 的问题解决方案。它们通常是ä¸å¿…修改的,请确ä¿åœ¨æ‚¨å˜æ›´äº†è¿™é‡Œçš„任何东西之å‰å·²ç»è¯»è¿‡äº†å¸®åŠ©æ–‡æ¡£ã€‚ - + Select download directory 选择下载目录 - + Select mod directory 选择 Mod 目录 - + Select cache directory 选择缓存目录 - + Confirm? 确认? - + This will make all dialogs show up again where you checked the "Remember selection"-box. Continue? æ­¤æ“作将导致之å‰å‹¾é€‰çš„â€œè®°ä½æˆ‘的选项â€è¯¢é—®çª—å£å†æ¬¡å‡ºçŽ°ï¼Œç¡®å®šè¦é‡ç½®å¯¹è¯æ¡†ï¼Ÿ diff --git a/src/organizer_zh_TW.ts b/src/organizer_zh_TW.ts index 722f8d2c..1fc6b17b 100644 --- a/src/organizer_zh_TW.ts +++ b/src/organizer_zh_TW.ts @@ -1,6 +1,50 @@ + + AboutDialog + + + + About + + + + + Revision: + + + + + Used Software + + + + + Credits + + + + + Translators + + + + + Others + + + + + Close + 關閉 + + + + No license + + + ActivateModsDialog @@ -240,25 +284,30 @@ p, li { white-space: pre-wrap; } DownloadList - + Name å稱 - + Filetime 檔案時間 - + Done å®Œæˆ - + Information missing, please select "Query Info" from the context menu to re-retrieve. 訊æ¯ä¸Ÿå¤±ï¼Œè«‹åœ¨å³éµèœå–®è£¡é¸æ“‡â€œæŸ¥è©¢è¨Šæ¯â€ä¾†é‡æ–°æª¢ç´¢ã€‚ + + + pending download + + DownloadListWidget @@ -311,125 +360,135 @@ p, li { white-space: pre-wrap; } DownloadListWidgetCompactDelegate - + Installed å·²å®‰è£ - + Uninstalled - + Done å®Œæˆ - - - - + + + + Are you sure? 確定? - + This will remove all finished downloads from this list and from disk. 這將會從列表和ç£ç¢Ÿä¸­ç§»é™¤æ‰€æœ‰å·²å®Œæˆçš„下載。 - + This will remove all installed downloads from this list and from disk. 這將會從列表和ç£ç¢Ÿä¸­ç§»é™¤æ‰€æœ‰å·²å®‰è£çš„下載項目。 - + This will permanently remove all finished downloads from this list (but NOT from disk). - + This will permanently remove all installed downloads from this list (but NOT from disk). - + Install å®‰è£ - + Query Info æŸ¥è©¢è¨Šæ¯ - + Delete - + Un-Hide å–æ¶ˆéš±è— - + Remove from View - + Remove 移除 - + Cancel å–æ¶ˆ - + + < mod %1 file %2 > + + + + + Pending + + + + Paused - + Fetching Info 1 - + Fetching Info 2 - + Pause æš«åœ - + Resume 繼續 - + Delete Installed... - + Delete All... - + Remove Installed... 移除已安è£çš„é …ç›®... - + Remove All... 移除所有... @@ -437,68 +496,78 @@ p, li { white-space: pre-wrap; } DownloadListWidgetDelegate - - - - + + + + Are you sure? 確定? - + This will remove all finished downloads from this list and from disk. 這將會從列表和ç£ç¢Ÿä¸­ç§»é™¤æ‰€æœ‰å·²å®Œæˆçš„下載。 - + This will remove all installed downloads from this list and from disk. 這將會從列表和ç£ç¢Ÿä¸­ç§»é™¤æ‰€æœ‰å·²å®‰è£çš„下載項目。 - + This will remove all finished downloads from this list (but NOT from disk). - + This will remove all installed downloads from this list (but NOT from disk). - + Install å®‰è£ - + Query Info æŸ¥è©¢è¨Šæ¯ - + Delete - + Un-Hide å–æ¶ˆéš±è— - + Remove from View - + Remove 移除 - + Cancel å–æ¶ˆ + + + < mod %1 file %2 > + + + + + Pending + + Fetching Info 1 @@ -510,32 +579,32 @@ p, li { white-space: pre-wrap; } - + Pause æš«åœ - + Resume 繼續 - + Delete Installed... - + Delete All... - + Remove Installed... 移除已安è£çš„é …ç›®... - + Remove All... 移除所有... @@ -548,75 +617,76 @@ p, li { white-space: pre-wrap; } 釿–°å‘½å "%1 "為 "%2" 時出錯 - + Download again? 釿–°ä¸‹è¼‰ï¼Ÿ - + A file with the same name has already been downloaded. Do you want to download it again? The new file will receive a different name. 已存在åŒå檔案。您確定è¦é‡æ–°ä¸‹è¼‰ï¼Ÿæ–°æª”案將使用ä¸åŒçš„æª”案å。 - + failed to download %1: could not open output file: %2 下載 %1 失敗: 無法開啟輸出檔案: %2 - + Wrong Game - + The download link is for a mod for "%1" but this instance of MO has been set up for "%2". - - - - - - - - - - - - - - + + + + + + + + + + + + + + + invalid index 無效的索引 - + failed to delete %1 無法刪除 %1 - + failed to delete meta file for %1 無法從 %1 中刪除 mate 檔案 - - - - - - + + + + + + invalid index %1 無效的索引 %1 - + Please enter the nexus mod id 請輸入Nç¶² Mod ID - + Mod ID: Mod ID: @@ -625,38 +695,43 @@ p, li { white-space: pre-wrap; } 無效的字順索引 %1 - + Information updated 訊æ¯å·²æ›´æ–° - - + + No matching file found on Nexus! Maybe this file is no longer available or it was renamed? 無法在N網上找到匹é…的檔案ï¼ä¹Ÿè¨±é€™å€‹æª”案已經ä¸å­˜åœ¨äº†æˆ–是它改å了? - + No file on Nexus matches the selected file by name. Please manually choose the correct one. 所é¸çš„æª”案無法在N網上找到å¯åŒ¹é…çš„é …ç›®ï¼Œè«‹æ‰‹å‹•é¸æ“‡æ­£ç¢ºçš„一個。 - + No download server available. Please try again later. 沒有å¯ç”¨çš„下載伺æœå™¨ï¼Œè«‹ç¨å¾Œå†å˜—試下載。 - + Failed to request file info from nexus: %1 無法在N網上請求檔案訊æ¯: %1 - + + Download failed. Server reported: %1 + + + + Download failed: %1 (%2) 下載失敗: %1 (%2) - + failed to re-open %1 ç„¡æ³•é‡æ–°é–‹å•Ÿ %1 @@ -768,7 +843,7 @@ Right now the only case I know of where this needs to be overwritten is for the - + If checked, MO will be closed once the specified executable is run. 如果é¸ä¸­ï¼Œé‚£éº¼ MO 將在指定的程å¼é‹è¡Œå¾Œé—œé–‰ã€‚ @@ -785,7 +860,7 @@ Right now the only case I know of where this needs to be overwritten is for the - + Add 添加 @@ -801,47 +876,64 @@ Right now the only case I know of where this needs to be overwritten is for the 移除 - + + Close + 關閉 + + + Select a binary 鏿“‡ä¸€å€‹å¯åŸ·è¡Œæª”案 - + Executable (%1) å¯åŸ·è¡Œç¨‹å¼ (%1) - + Java (32-bit) required - + MO requires 32-bit java to run this application. If you already have it installed, select javaw.exe from that installation as the binary. - + Select a directory 鏿“‡ä¸€å€‹ç›®éŒ„ - + Confirm ç¢ºèª - + Really remove "%1" from executables? 真的è¦ä»Žç¨‹å¼åˆ—表中移除 "%1" å—? - + Modify 更改 - + + + Save Changes? + + + + + + You made changes to the current executable, do you want to save them? + + + + MO must be kept running or this application will not work correctly. MO å¿…é ˆæŒçºŒé‹è¡Œï¼Œå¦å‰‡è©²ç¨‹å¼å°‡ç„¡æ³•正常工作。 @@ -1287,7 +1379,7 @@ Note: This installer will not be aware of other installed mods! 程å¼é‹è¡Œæ™‚ MO 將被鎖定。 - + Unlock 解鎖 @@ -1295,7 +1387,7 @@ Note: This installer will not be aware of other installed mods! LogBuffer - + failed to write log to %1: %2 ç„¡æ³•ç”Ÿæˆæ—¥èªŒåˆ° %1: %2 @@ -1316,23 +1408,23 @@ Note: This installer will not be aware of other installed mods! MainWindow - - + + Categories - + Profile é…置檔案 - + Pick a module collection 鏿“‡ä¸€å€‹é…置檔案 - + <!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; } @@ -1347,44 +1439,44 @@ p, li { white-space: pre-wrap; } <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;">請注æ„: ç•¶å‰æ‚¨çš„é…置檔案的 esp 加載順åºä¸¦ä¸æ˜¯åˆ†é–‹å„²å­˜çš„。</span></p></body></html> - + Refresh list 釿–°æ•´ç†åˆ—表 - + Refresh list. This is usually not necessary unless you modified data outside the program. 釿–°æ•´ç†åˆ—è¡¨ï¼Œé€™é€šå¸¸ä¸æ˜¯å¿…é ˆçš„ï¼Œé™¤éžæ‚¨åœ¨ç¨‹å¼ä¹‹å¤–修改了檔案的數據。 - + List of available mods. - + This is a list of installed mods. Use the checkboxes to activate/deactivate mods and drag & drop mods to change their "installation" orders. - + Filter éŽæ¿¾å™¨ - + No groups - + Nexus IDs Nç¶² ID - - - + + + Namefilter @@ -1393,12 +1485,12 @@ p, li { white-space: pre-wrap; } é–‹å§‹ - + Pick a program to run. 鏿“‡è¦é‹è¡Œçš„程å¼ã€‚ - + <!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; } @@ -1413,12 +1505,12 @@ p, li { white-space: pre-wrap; } <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;">您å¯ä»¥æ·»åŠ æ–°çš„å·¥å…·åˆ°æ­¤åˆ—è¡¨ä¸­ï¼Œä½†æˆ‘ä¸èƒ½ä¿è­‰ä¸€äº›æˆ‘沒有測試éŽçš„工具能够正常工作。</span></p></body></html> - + Run program é‹è¡Œç¨‹å¼ - + <!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; } @@ -1431,17 +1523,17 @@ p, li { white-space: pre-wrap; } <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;">在 Mod Organizer 啟用的狀態下é‹è¡ŒæŒ‡å®šçš„程å¼ã€‚</span></p></body></html> - + Run é‹è¡Œ - + Create a shortcut in your start menu or on the desktop to the specified program - + <!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; } @@ -1454,7 +1546,7 @@ p, li { white-space: pre-wrap; } <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;">建立一個開始èœå–®æ·å¾‘,使您å¯ä»¥ç›´æŽ¥åœ¨ MO 激活狀態下é‹è¡ŒæŒ‡å®šçš„程å¼ã€‚</span></p></body></html> - + Shortcut @@ -1479,12 +1571,12 @@ p, li { white-space: pre-wrap; } 儲存 - + List of available esp/esm files å¯ç”¨ esp 或 esm 檔案的列表 - + <!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; } @@ -1501,12 +1593,12 @@ p, li { white-space: pre-wrap; } é‡è¦: 您å¯ä»¥åœ¨é€™è£¡æ›´æ”¹ BSA 的順åºï¼Œä¸éŽ Mod 的安è£é †åºæœƒå„ªå…ˆæ–¼é€™è£¡çš„è¨­å®šï¼ - + List of available BS Archives. Archives not checked here are not managed by MO and ignore installation order. å¯ç”¨ BSA 檔案的列表。未勾é¸çš„é …ç›®ä¸æœƒè¢« MO 管ç†ä¸¦ä¸”會忽略安è£é †åºã€‚ - + BSA files are archives (comparable to .zip files) that contain data assets (meshes, textures, ...) to be used by the game. As such they "compete" with loose files in your data directory over which is loaded. By default, BSAs that share their base name with an enabled ESP (i.e. plugin.esp and plugin.bsa) are automatically loaded and will have precedence over all loose files, the installation order you set up to the left is then ignored! @@ -1517,66 +1609,71 @@ BSAs checked here are loaded in such a way that your installation order is obeye 這裡勾é¸çš„ BSA 將會ä¾å¾žæ‚¨çš„安è£é †åºï¼Œä¸¦ä¸”會自行調整加載順åºã€‚ - - + + File 檔案 - + <html><head/><body><p>Marked Archives (<img src=":/MO/gui/warning_16"/>) are still loaded on Skyrim but the <a href="http://forums.bethsoft.com/topic/1354395-update-bsas-and-you/"><span style=" text-decoration: underline; color:#0000ff;">regular file override</span></a> mechanism will apply: Loose files override BSAs, no matter the mod/plugin priority.</p></body></html> - + Mod Mod - + Data Data - + + Sort + + + + refresh data-directory overview 釿–°æ•´ç† Data 目錄總覽 - + Refresh the overview. This may take a moment. 釿–°æ•´ç†ç¸½è¦½ï¼Œé€™å¯èƒ½éœ€è¦ä¸€äº›æ™‚間。 - - - + + + Refresh 釿–°æ•´ç† - + This is an overview of your data directory as visible to the game (and tools). é€™æ˜¯åœ¨éŠæˆ²ä¸­å¯è¦‹çš„ Data 目錄 (和工具) 的總覽。 - - + + Filter the above list so that only conflicts are displayed. éŽæ¿¾ä¸Šé¢çš„列表,使您åªèƒ½çœ‹åˆ°æœ‰è¡çªçš„æª”案。 - + Show only conflicts åªé¡¯ç¤ºè¡çª - + Saves 存檔 - + <!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; } @@ -1593,160 +1690,160 @@ p, li { white-space: pre-wrap; } <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;">如果您在å³éµèœå–®ä¸­é»žæ“Šâ€œä¿®å¾© Modâ€ï¼Œé‚£éº¼ MO 便會嘗試激活所有 Mod å’Œ esp 來修復那些缺失的 espï¼Œå®ƒä¸¦ä¸æœƒç¦ç”¨ä»»ä½•æ±è¥¿ï¼</span></p></body></html> - + Downloads 下載 - + This is a list of mods you downloaded from Nexus. Double click one to install it. 這是當å‰å·²ä¸‹è¼‰çš„ Mod 的列表,雙擊進行安è£ã€‚ - + Compact 緊湊 - + Show Hidden - + Tool Bar 工具欄 - + Install Mod å®‰è£ Mod - + Install &Mod å®‰è£ &Mod - + Install a new mod from an archive 通éŽå£“縮包來安è£ä¸€å€‹æ–° Mod - + Ctrl+M Ctrl+M - + Profiles é…置檔案 - + &Profiles &é…置檔案 - + Configure Profiles 設定é…置檔案 - + Ctrl+P Ctrl+P - + Executables å¯åŸ·è¡Œç¨‹å¼ - + &Executables &å¯åŸ·è¡Œç¨‹å¼ - + Configure the executables that can be started through Mod Organizer é…ç½®å¯é€šéŽ MO ä¾†å•Ÿå‹•çš„ç¨‹å¼ - + Ctrl+E Ctrl+E - - + + Tools - + &Tools - + Ctrl+I Ctrl+I - + Settings 設定 - + &Settings &設定 - + Configure settings and workarounds é…置設定和解決方案 - + Ctrl+S Ctrl+S - + Nexus Nç¶² - + Search nexus network for more mods æœå°‹N網以ç²å–更多 Mod - + Ctrl+N Ctrl+N - - + + Update æ›´æ–° - + Mod Organizer is up-to-date Mod Organizer ç¾åœ¨æ˜¯æœ€æ–°ç‰ˆæœ¬ - - + + No Problems 沒有å•題 - + This button will be highlighted if MO discovered potential problems in your setup and provide tips on how to fix them. !Work in progress! @@ -1757,54 +1854,54 @@ Right now this has very limited functionality ç•¶å‰æ­¤åŠŸèƒ½æ‰€èƒ½æä¾›çš„é …ç›®éžå¸¸æœ‰é™ - - + + Help 幫助 - + Ctrl+H - + Endorse MO - - + + Endorse Mod Organizer - + Toolbar - + Desktop - + Start Menu - + Problems å•題 - + There are potential problems with your setup 您的安è£ä¸­å­˜åœ¨æ½›åœ¨çš„å•題 - + Everything seems to be in order ä¸€åˆ‡äº•ç„¶æœ‰åº @@ -1821,22 +1918,22 @@ Right now this has very limited functionality <li>.Net æœªå®‰è£æˆ–版本éŽèˆŠã€‚想è¦é‹è¡Œ NCC æ‚¨å¿…é ˆå…ˆå®‰è£ .Net,您å¯ä»¥åœ¨ä»¥ä¸‹åœ°å€ä¸­ç²å–: <a href="%1">%1</a></li> - + Help on UI 介é¢å¹«åŠ© - + Documentation Wiki 說明文檔 (維基) - + Report Issue 報告å•題 - + Tutorials @@ -1845,425 +1942,426 @@ Right now this has very limited functionality ç„¡æ³•å„²å­˜åŠ è¼‰é †åº - + failed to save load order: %1 無法儲存加載順åº: %1 - + failed to save archives order, do you have write access to "%1"? 無法儲存檔案順åºï¼Œæ‚¨ç¢ºå®šæ‚¨æœ‰æ¬Šé™æ›´æ”¹ "%1"? - + + About + + + + + About Qt + + + + Name å稱 - + Please enter a name for the new profile - + failed to create profile: %1 無法建立é…置檔案: %1 - + Show tutorial? - + You are starting Mod Organizer for the first time. Do you want to show a tutorial of its basic features? If you choose no you can always start the tutorial from the "Help"-menu. - + Downloads in progress 正在下載 - + There are still downloads in progress, do you really want to quit? 仿œ‰æ­£åœ¨é€²è¡Œä¸­çš„下載,您確定è¦é€€å‡ºå—Žï¼Ÿ - + failed to read savegame: %1 無法讀å–存檔: %1 - + Plugin "%1" failed: %2 - + Plugin error - + It appears the plugin "%1" failed to load last startup and caused MO to crash. Do you want to disable it? (Please note: If this is the first time you see this message for this plugin you may want to give it another try. The plugin may be able to recover from the problem) - + Failed to start "%1" 無法啟動 "%1" - + Waiting ç¨ç­‰ - + Please press OK once you're logged into steam. 當您登入 Steam 時請點擊確定。 - "%1" not found - "%1" 未找到 + "%1" 未找到 - + Start Steam? 啟動 Steam? - + Steam is required to be running already to correctly start the game. Should MO try to start steam now? æƒ³è¦æ­£ç¢ºåœ°å•Ÿå‹•éŠæˆ²ï¼ŒSteam 必須處於é‹è¡Œç‹€æ…‹ï¼ŒMO è¦ç«‹å³å•Ÿå‹• Steam 嗎? - + Also in: <br> 也在: <br> - + No conflict 沒有è¡çª - + <Edit...> <編輯...> - - Failed to refresh list of esps: %s - - - - + This bsa is enabled in the ini file so it may be required! 該 BSA 已在 Ini 檔案中啟用,因此它å¯èƒ½æ˜¯å¿…需的。 - + This archive will still be loaded since there is a plugin of the same name but its files will not follow installation order! 此檔案還是會被加載,因為存在åŒåæ’件。ä¸éŽå®ƒæ‰€åŒ…å«çš„çš„æª”æ¡ˆä¸æœƒéµå¾ªå®‰è£é †åºï¼ - + Activating Network Proxy - - + + Installation successful å®‰è£æˆåŠŸ - - + + Configure Mod é…ç½® Mod - - + + This mod contains ini tweaks. Do you want to configure them now? æ­¤ Mod ä¸­åŒ…å« Ini 設定檔案,您想ç¾åœ¨å°±å°å®ƒå€‘進行é…置嗎? - - + + mod "%1" not found Mod "%1" 未找到 - - + + Installation cancelled 安è£å·²å–消 - - + + The mod was not installed completely. Mod 沒有完全安è£ã€‚ - + Some plugins could not be loaded - + Too many esps and esms enabled - - + + Description missing - + The game doesn't allow more than 255 active plugins (including the official ones) to be loaded. You have to disable some unused plugins or merge some plugins into one. You can find a guide here: <a href="http://wiki.step-project.com/Guide:Merging_Plugins">http://wiki.step-project.com/Guide:Merging_Plugins</a> - + Choose Mod 鏿“‡ Mod - + Mod Archive Mod 壓縮包 - + Start Tutorial? - + You're about to start a tutorial. For technical reasons it's not possible to end the tutorial early. Continue? - - + + Download started 開始下載 - + failed to update mod list: %1 無法更新 Mod 列表: %1 - + failed to spawn notepad.exe: %1 ç„¡æ³•ç”Ÿæˆ notepad.exe: %1 - + failed to open %1 無法開啟 %1 - + failed to change origin name: %1 無法更改原始檔案å: %1 - + Multiple esps activated, please check that they don't conflict. - - + + Create Mod... - + A mod with this name already exists - + Continue? - + The versioning scheme decides which version is considered newer than another. This function will guess the versioning scheme under the assumption that the installed version is outdated. - + + Sorry - + I don't know a versioning scheme where %1 is newer than %2. - + <All> <全部> - + <Checked> <已勾é¸> - + Plugin "%1" failed - + failed to init plugin %1: %2 - + The following plugins could not be loaded. The reason may be missing dependencies (i.e. python) or an outdated version: - - Failed to move "%1" from mod "%2" to "%3": %4 - - - - + <Unchecked> <未勾é¸> - + <Update> <有更新> - + <No category> <無類別> - + <Conflicted> - + <Not Endorsed> - + failed to rename mod: %1 ç„¡æ³•é‡æ–°å‘½å Mod: %1 - + Overwrite? - + This will replace the existing mod "%1". Continue? - + failed to remove mod "%1" - - - + + + failed to rename "%1" to "%2" - - - + + + + Confirm ç¢ºèª - + Remove the following mods?<br><ul>%1</ul> - + failed to remove mod: %1 無法移動 Mod: %1 - - + + Failed 失敗 - + Installation file no longer exists å®‰è£æª”案ä¸è¤‡å­˜åœ¨ - + Mods installed with old versions of MO can't be reinstalled in this way. 舊版 MO 安è£çš„ Mod ç„¡æ³•ä½¿ç”¨æ­¤æ–¹æ³•é‡æ–°å®‰è£ã€‚ - - + + You need to be logged in with Nexus to endorse - - + + Extract BSA 解壓 BSA - + This mod contains at least one BSA. Do you want to unpack it? (This removes the BSA after completion. If you don't know about BSAs, just select no) æ­¤ Mod 中至少包å«ä¸€å€‹ BSA。您確定è¦è§£å£“嗎? (解壓完æˆå¾Œï¼ŒBSA 檔案將會被刪除。如果您ä¸çž­è§£ BSA çš„è©±ï¼Œè«‹é¸æ“‡â€œå¦â€) - - - + + + failed to read %1: %2 ç„¡æ³•è®€å– %1: %2 - - + + This archive contains invalid hashes. Some files may be broken. 壓縮包 Hash 值錯誤。部分檔案å¯èƒ½å·²ç¶“æå£žã€‚ - + Nexus ID for this Mod is unknown æ­¤ Mod çš„Nç¶² ID 未知 @@ -2276,92 +2374,92 @@ This function will guess the versioning scheme under the assumption that the ins 鏿“‡å„ªå…ˆç´š - + Really enable all visible mods? 確定è¦å•Ÿç”¨å…¨éƒ¨å¯è¦‹çš„ Mod 嗎? - + Really disable all visible mods? 確定è¦ç¦ç”¨å…¨éƒ¨å¯è¦‹çš„ Mod 嗎? - + Choose what to export - + Everything - + All installed mods are included in the list - + Active Mods - + Only active (checked) mods from your current profile are included - + Visible - + All mods visible in the mod list are included - + export failed: %1 - + Install Mod... å®‰è£ Mod... - + Enable all visible 啟用所有å¯è¦‹é …ç›® - + Disable all visible ç¦ç”¨æ‰€æœ‰å¯è¦‹é …ç›® - + Check all for update 檢查更新 - + Export to csv... - + Sync to Mods... åŒæ­¥åˆ° Mod... - + Restore Backup - + Remove Backup... @@ -2370,312 +2468,362 @@ This function will guess the versioning scheme under the assumption that the ins 設定類別 - + Primary Category - + Change versioning scheme - + Un-ignore update - + Ignore update - + Rename Mod... 釿–°å‘½å... - + Remove Mod... 移除 Mod... - + Reinstall Mod 釿–°å®‰è£ Mod - + Un-Endorse - - + + Endorse - + Won't endorse - + Endorsement state unknown - + Ignore missing data - + Visit on Nexus 在N網上æµè¦½ - + Open in explorer 在檔案總管中開啟 - + Information... 訊æ¯... - - + + Exception: 例外: - - + + Unknown exception 未知的例外 - + <Multiple> - + + Really delete "%1"? + + + + Fix Mods... 修復 Mod... - - + + Delete + + + + + failed to remove %1 無法刪除 %1 - - + + failed to create %1 無法建立 %1 - + Can't change download directory while downloads are in progress! 下載檔案時ä¸èƒ½ä¿®æ”¹ä¸‹è¼‰ç›®éŒ„ï¼ - + Download failed 下載失敗 - + failed to write to file %1 無法寫入檔案 %1 - + %1 written 已寫入 %1 - + Select binary 鏿“‡å¯åŸ·è¡Œæª”案 - + Binary - + Enter Name 輸入å稱 - + Please enter a name for the executable 請為程å¼è¼¸å…¥ä¸€å€‹å稱 - + Not an executable 䏿˜¯å¯åŸ·è¡Œç¨‹å¼ - + This is not a recognized executable. 無法識別的å¯åŸ·è¡Œæª”案 - - + + Replace file? å–代檔案? - + There already is a hidden version of this file. Replace it? 已存在åŒå檔案,但該檔案被隱è—了。確定è¦è¦†è“‹å—Žï¼Ÿ - - + + File operation failed 檔案æ“作錯誤 - - + + Failed to remove "%1". Maybe you lack the required file permissions? - + There already is a visible version of this file. Replace it? - + + file not found: %1 + 檔案未找到: %1 + + + + failed to generate preview for %1 + + + + + Sorry, can't preview anything. This function currently does not support extracting from bsas. + + + + Update available æ›´æ–°å¯ç”¨ - + Open/Execute 開啟/執行 - + Add as Executable 添加為å¯åŸ·è¡Œæª”案 - + + Preview + + + + Un-Hide å–æ¶ˆéš±è— - + Hide éš±è— - + Write To File... 寫入檔案... - + Do you want to endorse Mod Organizer on %1 now? - + Remove 移除 - + Unlock load order - + Lock load order - + + BOSS working + + + + + failed to run boss: %1 + + + + Request to Nexus failed: %1 - + + Executable "%1" not found + + + + + Failed to refresh list of esps: %1 + + + + This will move all files from overwrite into a new, regular mod. Please enter a name: - + Add/Remove Categories - + Replace Categories - - + + login successful 登入æˆåŠŸ - + login failed: %1. Trying to download anyway 登入失敗: %1,請嘗試使用別的方法下載 - + login failed: %1 無法登入: %1 - + login failed: %1. You need to log-in with Nexus to update MO. 登入失敗: %1。您需è¦ç™»å…¥åˆ°Nç¶²æ‰èƒ½æ›´æ–° MO - + Error 錯誤 - + failed to extract %1 (errorcode %2) 無法解壓 %1 (錯誤代碼 %2) - + Extract... 解壓... - + Edit Categories... 編輯類別... - + Enable all 全部啟用 - + Disable all 全部ç¦ç”¨ @@ -2722,58 +2870,58 @@ Please enter a name: Mod è¨Šæ¯ - + Textfiles 文字文件 - + A list of text-files in the mod directory. Mod 目錄裡包å«çš„æ–‡å­—文件的列表。 - + A list of text-files in the mod directory like readmes. Mod 目錄裡包å«çš„æ–‡å­—文件 (類似於自述文檔) 的列表。 - - + + Save 儲存 - + INI-Files Ini 檔案 - + This is a list of .ini files in the mod. Mod 目錄裡包å«çš„ Ini 檔案的列表。 - + This is a list of .ini files in the mod. These are usually used to configure the behaviour of mods if there are configurable parameters. Mod 目錄裡包å«çš„ Ini 檔案的列表,這些檔案通常用來é…ç½® Mod 的行為,如果有å¯è¨­å®šçš„åƒæ•¸çš„話。 - + Save changes to the file. 儲存更改到檔案中。 - + Save changes to the file. This overwrites the original. There is no automatic backup! å„²å­˜æ›´æ”¹åˆ°æª”æ¡ˆä¸­ï¼Œé€™å°‡æœƒè¦†è“‹åŽŸå§‹æª”æ¡ˆï¼Œä¸¦ä¸”æ²’æœ‰è‡ªå‹•å‚™ä»½ï¼ - + Images 圖片 - + Images located in the mod. 使–¼ Mod 中的圖片。 @@ -2790,13 +2938,13 @@ p, li { white-space: pre-wrap; } <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;">這裡列出了所有在 Mod 目錄裡的圖片 (.jpg å’Œ .png),如截圖等。點擊其中的一個來ç²å¾—較大的視圖。</span></p></body></html> - - + + Optional ESPs å¯é¸ ESP - + List of esps and esms that can not be loaded by the game. 包å«äº†ä¸æœƒè¢«éŠæˆ²è¼‰å…¥çš„ esp å’Œ esm 的列表。 @@ -2820,12 +2968,12 @@ p, li { white-space: pre-wrap; } <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;">大部分 Mod 沒有å¯é¸ esp,因此您正在看的很有å¯èƒ½åªæ˜¯ä¸€å€‹ç©ºåˆ—表。</span></p></body></html> - + This lists all the images (.jpg and .png) in the mod directory, like screenshots and such. Click one to get a larger view. - + List of esps and esms contained in this plugin that currently can not be loaded by the game. They will not even appear in the esp-list in the main MO-window. They usually contain optional functionality, see the readme. @@ -2833,103 +2981,103 @@ Most mods do not have optional esps, so chances are good you are looking at an e - + Make the selected mod in the lower list unavailable. 使下表中已é¸çš„ Mod 變得ä¸å¯ç”¨ã€‚ - + The selected esp (in the lower list) will be pushed into a subdirectory of the mod and will thus become "invisible" to the game. It can then no longer be activated. å·²é¸çš„ esp (在下表中) 將會被放入 Mod çš„å­ç›®éŒ„è£¡ï¼Œåœ¨éŠæˆ²è£¡å°‡æœƒè®Šå¾—“ä¸å¯è¦‹â€ï¼Œä¸¦ä¸”之後就ä¸èƒ½å†è¢«æ¿€æ´»äº†ã€‚ - + Move a file to the data directory. 移動一個檔案到 Data 目錄。 - + This moves a esp to the esp directory so it can be enabled in the main window. Please note that the ESP merely becomes "available", it will not necessarily be loaded! That is configured in the main window of omo. 移動一個 esp 檔案到 esp 目錄,這樣它就å¯ä»¥åœ¨ä¸»çª—å£ä¸­å•Ÿç”¨äº†ã€‚請注æ„: ESP åªæ˜¯è®Šå¾—“å¯ç”¨â€ï¼Œå®ƒå¹¶ä¸ä¸€å®šæœƒè¢«è¼‰å…¥ï¼æƒ³è¦è½½å…¥è¯·åœ¨ MO 的主窗å£ä¸­å‹¾é¸ã€‚ - + ESPs in the data directory and thus visible to the game. ESP 在 Data 目錄,因此它在游戲裡會變得å¯è¦‹ã€‚ - + These are the mod files that are in the (virtual) data directory of your game and will thus be selecteable in the esp list in the main window. 這些 Mod æª”æ¡ˆä½æ–¼æ‚¨æ¸¸æˆ²çš„ (虛擬) Data 目錄裡,因此它們在主窗å£çš„ esp 列表中會變得å¯é¸ã€‚ - + Available ESPs å¯ç”¨ ESP - + Conflicts è¡çª - + The following conflicted files are provided by this mod 以下è¡çªæª”案由此 Mod æä¾› - - + + File 檔案 - + Overwritten Mods 覆蓋的 Mod - + The following conflicted files are provided by other mods 以下è¡çªæª”案由其它 Mod æä¾› - + Providing Mod æä¾›çš„ Mod - + Non-Conflicted files éžè¡çªæª”案 - + Categories 類別 - + Primary Category - + Nexus Info Nç¶²è¨Šæ¯ - + Mod ID Mod ID - + Mod ID for this mod on Nexus. N網上此 Mod çš„ ID。 - + <!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; } @@ -2942,7 +3090,7 @@ p, li { white-space: pre-wrap; } <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">N網上此 Mod çš„ ID,如果您在 MO 中下載並安è£äº† Mod 它將被自動填寫,å¦å‰‡æ‚¨éœ€è¦æ‰‹å‹•è¼¸å…¥ã€‚è¦æ‰¾åˆ°æ­£ç¢ºçš„ ID,在N網找到 Mod。比如,åƒé€™æ¨£çš„連çµ: <a href=" http://www.skyrimnexus.com/downloads/file.php?id=1334"><span style=" text-decoration: underline; color:#0000ff;">http://www.skyrimnexus.com/downloads/file.php?id=1334</span></a> 在上é¢çš„例å­ä¸­ï¼Œ1334å°±æ˜¯æ‚¨è¦æ‰¾çš„ ID。此外: 上é¢çš„就是 Mod Organizer 在N網的連çµï¼Œç‚ºä»€éº¼ä¸ç¾åœ¨å°±åˆ°é‚£è£¡åŽ»è´ŠåŒæˆ‘呢?</span></a></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; } @@ -2955,32 +3103,32 @@ p, li { white-space: pre-wrap; } <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;">Mod 的已安è£ç‰ˆæœ¬ï¼Œæ»‘é¼ æç¤ºå°‡é¡¯ç¤ºN網上的當å‰ç‰ˆæœ¬ï¼Œå·²å®‰è£çš„ç‰ˆæœ¬è™Ÿåªæœ‰åœ¨æ‚¨é€šéŽ MO ä¾†å®‰è£ Mod çš„æ™‚å€™æ‰æœƒè‡ªå‹•填寫。</span></p></body></html> - + Version 版本 - + Refresh 釿–°æ•´ç† - + Refresh all information from Nexus. - + Description æè¿° - + <!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:'MS Shell Dlg 2'; font-size:7.8pt; font-weight:400; font-style:normal;"> -<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /></p></body></html> +</style></head><body style=" font-family:'MS Shell Dlg 2'; font-size:8.25pt; font-weight:400; font-style:normal;"> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:8pt;"><br /></p></body></html> @@ -3000,7 +3148,7 @@ p, li { white-space: pre-wrap; } 類型 - + Name å稱 @@ -3009,12 +3157,12 @@ p, li { white-space: pre-wrap; } å¤§å° (KB) - + Endorse - + Notes @@ -3027,17 +3175,17 @@ p, li { white-space: pre-wrap; } 您支æŒéŽé€™å€‹ Mod 了嗎? - + Filetree 檔案樹 - + A directory view of this mod 這個 Mod 的目錄視圖 - + <!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; } @@ -3052,53 +3200,53 @@ p, li { white-space: pre-wrap; } <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;">所åšçš„æ›´æ”¹å°‡æœƒç«‹å³ä½œç”¨æ–¼ç£ç¢Ÿä¸Šçš„æª”案,所以請</span><span style=" font-size:9pt; font-weight:600;">謹慎æ“作</span><span style=" font-size:9pt;">。</span></p></body></html> - + Previous - + Next 下一步 - + Close 關閉 - + &Delete &刪除 - + &Rename &釿–°å‘½å - + &Hide &éš±è— - + &Unhide &å–æ¶ˆéš±è— - + &Open &開啟 - + &New Folder &新增資料夾 - - + + Save changes? 儲存更改嗎? @@ -3107,79 +3255,79 @@ p, li { white-space: pre-wrap; } 儲存更改到 "%1"? - + File Exists 檔案已存在 - + A file with that name exists, please enter a new one 檔案å已存在,請輸入其它å稱 - + failed to move file 無法移動檔案 - + failed to create directory "optional" 無法建立 "optional" 目錄 - - + + Info requested, please wait 請求訊æ¯å·²ç™¼å‡ºï¼Œè«‹ç¨å¾Œ - + (description incomplete, please visit nexus) (æè¿°è¨Šæ¯ä¸å®Œæ•´ï¼Œè«‹è¨ªå•Nç¶²) - + Current Version: %1 ç•¶å‰ç‰ˆæœ¬: %1 - + No update available 沒有å¯ç”¨çš„æ›´æ–° - + Main ä¸»è¦æª”案 - - + + Save changes to "%1"? - + Update æ›´æ–° - + Optional å¯é¸æª”案 - + Old 舊檔 - + Misc 雜項 - + Unknown 未知 @@ -3188,13 +3336,13 @@ p, li { white-space: pre-wrap; } 請求失敗: %1 - + <a href="%1">Visit on Nexus</a> <a href="%1">訪å•Nç¶²</a> - - + + Confirm ç¢ºèª @@ -3211,98 +3359,98 @@ p, li { white-space: pre-wrap; } 例外: %1 - + Failed to delete %1 無法刪除 %1 - + Are sure you want to delete "%1"? 確定è¦åˆªé™¤ "%1" 嗎? - + Are sure you want to delete the selected files? 確定è¦åˆªé™¤æ‰€é¸çš„æª”案嗎? - - + + New Folder 新增資料夾 - + Failed to create "%1" 無法建立 "%1" - - + + Replace file? å–代檔案? - + There already is a hidden version of this file. Replace it? 已存在åŒå檔案,但該檔案被隱è—了。確定è¦è¦†è“‹å—Žï¼Ÿ - - + + File operation failed 檔案æ“作錯誤 - - + + Failed to remove "%1". Maybe you lack the required file permissions? 無法移除 "%1"。也許您需è¦è¶³å¤ çš„æª”案權é™ï¼Ÿ - - + + failed to rename %1 to %2 ç„¡æ³•é‡æ–°å‘½å %1 為 %2 - + There already is a visible version of this file. Replace it? 已存在åŒå檔案。確定è¦è¦†è“‹å—Žï¼Ÿ - + Un-Hide å–æ¶ˆéš±è— - + Hide éš±è— - + Please enter a name - - + + Error 錯誤 - + Invalid name. Must be a valid file name - + A tweak by that name exists - + Create Tweak @@ -3438,8 +3586,9 @@ p, li { white-space: pre-wrap; } - installed version: %1, newest version: %2 - ç•¶å‰ç‰ˆæœ¬: %1,最新版本: %2 + installed version: "%1", newest version: "%2" + installed version: %1, newest version: %2 + ç•¶å‰ç‰ˆæœ¬: %1,最新版本: %2 Name @@ -3640,17 +3789,17 @@ p, li { white-space: pre-wrap; } NexusInterface - + Failed to guess mod id for "%1", please pick the correct one - + empty response 未回應 - + invalid response 無效的回應 @@ -4616,85 +4765,93 @@ Right now this has very limited functionality ESP 檔案沒有找到: %1 - + Mod Index - - + + Flags + + + + + unknown - + Name of your mods - + Load priority of your mod. The higher, the more "important" it is and thus overwrites data from plugins with lower priority. - + The modindex determins the formids of objects originating from this mods. - + failed to update esp info for file %1 (source id: %2), error: %3 - + esp not found: %1 - + Confirm ç¢ºèª - + Really enable all plugins? - + Really disable all plugins? - + The file containing locked plugin indices is broken - - failed to open output file: %1 - 無法開啟輸出檔案: %1 + 無法開啟輸出檔案: %1 - + Some of your plugins have invalid names! These plugins can not be loaded by the game. Please see mo_interface.log for a list of affected plugins and rename them. 您的一些æ’ä»¶å稱無效ï¼é€™äº›æ’ä»¶ç„¡æ³•è¢«éŠæˆ²è¼‰å…¥ã€‚請查看 mo_interface.log 來確èªé‚£äº›å—影響的æ’件䏦釿–°å‘½å它們。 - + + BOSS dll incompatible + + + + Missing Masters - + Enabled Masters - + failed to restore load order for %1 @@ -4707,17 +4864,17 @@ Right now this has very limited functionality 最高值 - + This plugin can't be disabled (enforced by the game) 這個æ’ä»¶ä¸èƒ½è¢«ç¦ç”¨ (ç”±éŠæˆ²åŸ·è¡Œ) - + Origin: %1 隸屬於: %1 - + Name å稱 @@ -4726,7 +4883,7 @@ Right now this has very limited functionality Mod å稱 - + Priority 優先級 @@ -4743,6 +4900,19 @@ Right now this has very limited functionality é€™äº›ç´¢å¼•æ±ºå®šäº†é‚£äº›é€šéŽ Mod 引入的物å“,法術等等的 ID。ID çš„ä¸€èˆ¬æ ¼å¼æ˜¯ "xxyyyyyy",其中 "xx" 就是這個的索引,而 "yyyyyy" 則是由 Mod 自己所决定的。 + + PreviewDialog + + + Preview + + + + + Close + 關閉 + + ProblemsDialog @@ -4788,82 +4958,72 @@ p, li { white-space: pre-wrap; } 無法套用 Ini 設定 - + invalid profile name %1 - + failed to create %1 無法建立 %1 - - failed to open temporary file - - - - - failed to open "%1" for writing - - - - + failed to write mod list: %1 - + failed to update tweaked ini file, wrong settings may be used: %1 - + failed to create tweaked ini: %1 - - - - - + + + + + invalid index %1 無效的索引 %1 - + Overwrite directory couldn't be parsed - + invalid priority %1 無效的優先級 %1 - + failed to parse ini file (%1) - + failed to parse ini file (%1): %2 ç„¡æ³•è§£æž Ini 檔案 (%1): %2 - - + + failed to modify "%1" - + Delete savegames? - + Do you want to delete local savegames? (If you select "No", the save games will show up again if you re-enable local savegames) @@ -5240,12 +5400,12 @@ p, li { white-space: pre-wrap; } 無法設定代ç†DLL加載 - + "%1" is missing "%1" 缺失 - + Permissions required éœ€è¦æ¬Šé™ @@ -5254,8 +5414,8 @@ p, li { white-space: pre-wrap; } ç•¶å‰çš„用戶帳戶沒有é‹è¡Œ Mod Organizer æ‰€éœ€çš„è¨ªå•æ¬Šé™ï¼Œå¿…è¦çš„修改將會自動進行 (MO 的目錄將會為當å‰ç”¨æˆ¶å¸³æˆ¶è€Œè®Šå¾—å¯å¯«),您將被請求使用管ç†å“¡æ¬Šé™åŸ·è¡Œ "mo_helper.exe"。 - - + + Woops 糟糕 @@ -5264,66 +5424,66 @@ p, li { white-space: pre-wrap; } Mod Organizer 崩潰了ï¼è¦ç”Ÿæˆè¨ºæ–·æª”案嗎?如果您發é€é€™å€‹æª”案到我的郵箱 (sherb@gmx.net) 裡的話,這個 Bug 會很有å¯èƒ½è¢«ä¿®å¾©ã€‚ - + The current user account doesn't have the required access rights to run Mod Organizer. The neccessary changes can be made automatically (the MO directory will be made writable for the current user account). You will be asked to run "helper.exe" with administrative rights. - + ModOrganizer has crashed! Should a diagnostic file be created? If you send me this file (%1) to sherb@gmx.net, the bug is a lot more likely to be fixed. Please include a short description of what you were doing when the crash happened - + ModOrganizer has crashed! Unfortunately I was not able to write a diagnostic file: %1 Mod Organizer 崩潰了ï¼éºæ†¾çš„æ˜¯ï¼Œæˆ‘無法生æˆè¨ºæ–·æª”案: %1 - - + + Mod Organizer Mod Organizer - + An instance of Mod Organizer is already running Mod Organizer 的一個實例正在é‹è¡Œ - + No game identified in "%1". The directory is required to contain the game binary and its launcher. "%1" ä¸­æœªæª¢æ¸¬åˆ°éŠæˆ²ã€‚請確ä¿è©²è·¯å¾‘中包å«éŠæˆ²åŸ·è¡Œç¨‹å¼ä»¥åŠå°æ‡‰çš„ Launcher 檔案。 - - + + Please select the game to manage è«‹é¸æ“‡æƒ³è¦ç®¡ç†çš„éŠæˆ² - + Please select the game edition you have (MO can't start the game correctly if this is set incorrectly!) - + Please use "Help" from the toolbar to get usage instructions to all elements 請使用工具列上的“幫助â€ä¾†ç²å¾—所有元素的使用說明 - - + + <Manage...> <管ç†...> - + failed to parse profile %1: %2 無法解æžé…置檔案 %1: %2 - - + + failed to find "%1" 未能找到 "%1" @@ -5332,17 +5492,17 @@ p, li { white-space: pre-wrap; } 編碼錯誤,請å‘作者彙報此 Bug 並且附上 mo_interface.log æª”æ¡ˆï¼ - + failed to access %1 ç„¡æ³•è¨ªå• %1 - + failed to set file time %1 無法設定檔案時間 %1 - + failed to create %1 無法建立 %1 @@ -5378,12 +5538,12 @@ p, li { white-space: pre-wrap; } 無法開啟 %1 - + Script Extender 腳本拓展 - + Proxy DLL 代ç†DLL @@ -5408,22 +5568,22 @@ Start elevated anyway? (you will be asked if you want to allow ModOrganizer.exe - + failed to spawn "%1": %2 ç„¡æ³•ç”Ÿæˆ "%1": %2 - + "%1" doesn't exist "%1" ä¸å­˜åœ¨ - + failed to inject dll into "%1": %2 無法注入 dll 到 "%1": %2 - + failed to run "%1" 無法é‹è¡Œ "%1" @@ -5484,6 +5644,11 @@ Start elevated anyway? (you will be asked if you want to allow ModOrganizer.exe invalid game type %1 + + + failed to open temporary file + + QueryOverwriteDialog @@ -5718,18 +5883,18 @@ Start elevated anyway? (you will be asked if you want to allow ModOrganizer.exe 需è¦ç®¡ç†å“¡çš„æ¬Šé™ä¾†æ›´æ”¹é€™å€‹ã€‚ - - + + attempt to store setting for unknown plugin "%1" - + Confirm ç¢ºèª - + Changing the mod directory affects all your profiles! Mods not present (or named differently) in the new location will be disabled in all profiles. There is no way to undo this unless you backed up your profiles manually. Proceed? 修改 Mod 目錄將會影響您的é…ç½®ï¼æ–°ç›®éŒ„中ä¸å­˜åœ¨ (或者å稱ä¸åŒ) çš„ Mod 將在所有é…ç½®ä¸­è¢«ç¦æ­¢æŽ‰ã€‚æ­¤æ“作無法撤銷,所以執行此æ“作å‰å»ºè­°å…ˆå‚™ä»½ä¸‹è‡ªå·±çš„é…置。立å³åŸ·è¡Œï¼Ÿ @@ -5878,52 +6043,57 @@ p, li { white-space: pre-wrap; } é…ç½® Mod 類別 - + Disable automatic internet features - + Disable automatic internet features. This does not affect features that are explicitly invoked by the user (like checking mods for updates, endorsing, opening the web browser) - + Offline Mode - + Use a proxy for network connections. - + Use a proxy for network connections. This uses the system-wide settings which can be configured in Internet Explorer. Please note that MO will start up a few seconds slower on some systems when using a proxy. - + Use HTTP Proxy (Uses System Settings) - - Known Servers (Dynamically updated every download) + + Associate with "Download with manager" links + + + + + Known Servers (updated on download) - + Preferred Servers (Drag & Drop) - + Blacklisted Plugins (use <del> to remove): - + Mod Organizer needs a dll to be injected into the game so all mods are visible to it. There are several means to do this: *Mod Organizer* (default) In this mode the Mod Organizer itself injects the dll. The disadvantage is that you always have to start the game through MO or a link created by it. @@ -5992,12 +6162,12 @@ p, li { white-space: pre-wrap; } 自動登入 - + Username 帳號 - + Password 密碼 @@ -6014,52 +6184,52 @@ p, li { white-space: pre-wrap; } 首é¸å¤–部æµè¦½å™¨ - + Plugins - + Author: - + Version: - + Description: - + Key - + Value - + Workarounds 解決方案 - + Steam App ID Steam App ID - + The Steam AppID for your game æ‚¨éŠæˆ²çš„ Steam AppID - + <!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; } @@ -6086,12 +6256,12 @@ p, li { white-space: pre-wrap; } <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;">其中 22380 å°±æ˜¯æ‚¨è¦æ‰¾çš„ ID。</span></p></body></html> - + Load Mechanism 加載機制 - + Select loading mechanism. See help for details. 鏿“‡åŠ è¼‰æ©Ÿåˆ¶ï¼Œä½¿ç”¨å¹«åŠ©æŸ¥çœ‹æ›´å¤šç´°ç¯€ã€‚ @@ -6116,17 +6286,17 @@ p, li { white-space: pre-wrap; } <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt; font-weight:600;">代ç†DLL</span><span style=" font-size:9pt;"> 在這種模å¼ä¸‹ï¼ŒMO 將替æ›ä¸€å€‹éŠæˆ²çš„ dll 來加載 MO (當然原來的 dll),這僅é©ç”¨äºŽ Steam ç‰ˆæœ¬çš„éŠæˆ²ï¼Œä¸¦ä¸”åªåœ¨ Skyrim 上åšéŽæ¸¬è©¦ã€‚è«‹åªåœ¨å…¶å®ƒåŠ è¼‰æ©Ÿåˆ¶ä¸èƒ½å·¥ä½œçš„æƒ…æ³ä¸‹æ‰ä½¿ç”¨å®ƒã€‚</span></p></body></html> - + NMM Version NMM 版本 - + The Version of Nexus Mod Manager to impersonate. æƒ³è¦æ¨¡æ“¬çš„ NMM 版本號。 - + Mod Organizer uses an API provided by the Nexus to provide features like checking for updates and downloading files. Unfortunately this API has not been made available officially to third party tools like MO so we have to impersonate the Nexus Mod Manager to be allowed in. On top of this Nexus has used the client identification to lock out outdated versions of NMM to force users to update. This means that MO also needs to impersonate the new version of NMM even if MO doesn't need an update. Therefore you can configure the version to identify as here. Please note that MO does identify itself as MO to the webserver, it's not lying about what it is. It is merely adding a "compatible" NMM version to the user agent. @@ -6139,7 +6309,7 @@ tl;dr-version: If Nexus-features don't work, insert the current version num 變更版本號: 如果Nç¶²åŠŸèƒ½ä¸æ­£å¸¸äº†ï¼Œé‚£éº¼è«‹åœ¨é€™è£¡è¼¸å…¥ NMM 的當å‰ç‰ˆæœ¬è™Ÿä¸¦é‡è©¦ä¸€ä¸‹ã€‚ - + These are workarounds for problems with Mod Organizer. Please make sure you read the help text before changing anything here. @@ -6152,48 +6322,48 @@ tl;dr-version: If Nexus-features don't work, insert the current version num 例如: 0.33.1 - + Enforces that inactive ESPs and ESMs are never loaded. 強制執行,未激活的 ESP å’Œ ESM 將䏿œƒè¢«åŠ è¼‰ã€‚ - + It seems that the Games occasionally load ESP or ESM files even if they haven't been activated as plugins. I don't yet know what the circumstances are, but user reports imply it is in some cases unwanted. If this is checked, ESPs and ESMs not checked in the List are invisible to the game and can not be loaded. çœ‹ä¾†ï¼ŒéŠæˆ²å¶çˆ¾æœƒåŠ è¼‰ä¸€äº›æ²’æœ‰è¢«æ¿€æ´»æˆæ’ä»¶çš„ ESP 或 ESM 檔案。 我還尚ä¸çŸ¥é“它在什麼情æ³ä¸‹æœƒé€™æ¨£ï¼Œä½†æ˜¯æœ‰ç”¨æˆ¶å ±å‘Šèªªå®ƒåœ¨æŸäº›æƒ…æ³ä¸‹æ˜¯å¾ˆä¸å¿…è¦çš„。如果這個é¸é …被é¸ä¸­ï¼Œé‚£éº¼åœ¨åˆ—表中沒有被勾é¸çš„ ESP å’Œ ESM 將䏿œƒåœ¨éŠæˆ²ä¸­å‡ºç¾ï¼Œä¸¦ä¸”ä¹Ÿä¸æœƒè¢«è¼‰å…¥ã€‚ - + Hide inactive ESPs/ESMs éš±è—æœªæ¿€æ´»çš„ ESP 或 ESM - + If checked, files (i.e. esps, esms and bsas) belonging to the core game can not be disabled in the UI. (default: on) - + If checked, files (i.e. esps, esms and bsas) belonging to the core game can not be disabled in the UI. (default: on) Uncheck this if you want to use Mod Organizer with total conversions (like Nehrim) but be aware that the game will crash if required files are not enabled. - + Force-enable game files - - + + For Skyrim, this can be used instead of Archive Invalidation. It should make AI redundant for all Profiles. For the other games this is not a sufficient replacement for AI! å°æ–¼å¤©éš›ï¼Œé€™å€‹å¯ä»¥ç”¨ä¾†å–ä»£æª”æ¡ˆç„¡æ•ˆåŒ–ï¼Œå®ƒå°‡æœƒä½¿æ¡£æ¡ˆæ— æ•ˆåŒ–å°æ‰€æœ‰é…置都變得多余。 ä½†æ˜¯å°æ–¼å…¶å®ƒéŠæˆ²ï¼Œé€™ä¸¦ä¸æ˜¯ä¸€å€‹å¾ˆå¥½çš„æ›¿ä»£å“ï¼ - + Back-date BSAs é‡ç½® BSA 檔案修改日期 @@ -6202,27 +6372,27 @@ For the other games this is not a sufficient replacement for AI! 這些是 Mod Organizer çš„å•題解決方案。它們通常是ä¸å¿…修改的,請確ä¿åœ¨æ‚¨è®Šæ›´äº†é€™è£¡çš„任何æ±è¥¿ä¹‹å‰å·²ç¶“讀éŽäº†å¹«åŠ©æ–‡æª”ã€‚ - + Select download directory 鏿“‡ä¸‹è¼‰ç›®éŒ„ - + Select mod directory 鏿“‡ Mod 目錄 - + Select cache directory 鏿“‡ç·©å­˜ç›®éŒ„ - + Confirm? 確èªï¼Ÿ - + This will make all dialogs show up again where you checked the "Remember selection"-box. Continue? æ­¤æ“作將導致之å‰å‹¾é¸çš„â€œè¨˜ä½æˆ‘çš„é¸é …â€è©¢å•è¦–çª—å†æ¬¡å‡ºç¾ï¼Œç¢ºå®šè¦é‡ç½®å°è©±æ–¹å¡Šï¼Ÿ diff --git a/src/pluginlist.cpp b/src/pluginlist.cpp index f5e0f1eb..ec063994 100644 --- a/src/pluginlist.cpp +++ b/src/pluginlist.cpp @@ -96,7 +96,6 @@ PluginList::PluginList(QObject *parent) PluginList::~PluginList() { if (m_BOSS != NULL) { - m_BOSS->DestroyBossDb(m_BOSSDB); m_BOSS->CleanUpAPI(); delete m_BOSS; m_BOSS = NULL; @@ -576,9 +575,7 @@ void PluginList::refreshLoadOrder() // find the location to insert at while ((targetPrio < static_cast(m_ESPs.size() - 1)) && (m_ESPs[m_ESPsByPriority[targetPrio]].m_LoadOrder < iter->first)) { -// if (QString::compare(m_ESPs[m_ESPsByPriority[targetPrio]].m_Name, iter->second) != 0) { - ++targetPrio; -// } + ++targetPrio; } if (static_cast(targetPrio) >= m_ESPs.size()) { @@ -636,23 +633,27 @@ void outputBossLog(const QString &filename) } -void PluginList::initBoss() +boss_db PluginList::initBoss() { - m_BOSS = new BossDLL(TEXT("dlls\\boss.dll")); + boss_db result; + bool firstRun = (m_BOSS == nullptr); + if (firstRun) { + m_BOSS = new BossDLL(TEXT("dlls\\boss.dll")); - if (!m_BOSS->IsCompatibleVersion(2,1,1)) { - throw MyException(tr("BOSS dll incompatible")); - } - uint8_t *versionString; - if (m_BOSS->GetVersionString(&versionString) != BossDLL::RESULT_OK) { - THROW_BOSS_ERROR(m_BOSS) - } - qDebug("using boss version %s", versionString); + if (!m_BOSS->IsCompatibleVersion(2,1,1)) { + throw MyException(tr("BOSS dll incompatible")); + } + uint8_t *versionString; + if (m_BOSS->GetVersionString(&versionString) != BossDLL::RESULT_OK) { + THROW_BOSS_ERROR(m_BOSS) + } + qDebug("using boss version %s", versionString); - m_TempFile.open(); m_TempFile.close(); // yeah, stupid, but open is required to generate the name - m_BOSS->SetLoggerOutput(m_TempFile.fileName().toLocal8Bit().constData(), 4); + m_TempFile.open(); m_TempFile.close(); // yeah, stupid, but open is required to generate the name + m_BOSS->SetLoggerOutput(m_TempFile.fileName().toLocal8Bit().constData(), 4); + } - if (m_BOSS->CreateBossDb(&m_BOSSDB, BossDLL::SKYRIM, NULL) != BossDLL::RESULT_OK) { + if (m_BOSS->CreateBossDb(&result, BossDLL::SKYRIM, NULL) != BossDLL::RESULT_OK) { uint8_t *message; m_BOSS->GetLastErrorDetails(&message); std::string messageCopy(reinterpret_cast(message)); @@ -664,23 +665,26 @@ void PluginList::initBoss() QString masterlistName = QDir::toNativeSeparators(qApp->applicationDirPath() + "/boss/masterlist.txt"); - uint32_t res = m_BOSS->UpdateMasterlist(m_BOSSDB, U8(masterlistName.toUtf8().constData())); - qApp->processEvents(); - if (res == BossDLL::RESULT_OK) { - qDebug("boss masterlist updated"); - } else if (res == BossDLL::RESULT_NO_UPDATE_NECESSARY) { - qDebug("boss masterlist already up-to-date"); - } else { - THROW_BOSS_ERROR(m_BOSS) + if (firstRun) { + uint32_t res = m_BOSS->UpdateMasterlist(result, U8(masterlistName.toUtf8().constData())); + qApp->processEvents(); + if (res == BossDLL::RESULT_OK) { + qDebug("boss masterlist updated"); + } else if (res == BossDLL::RESULT_NO_UPDATE_NECESSARY) { + qDebug("boss masterlist already up-to-date"); + } else { + THROW_BOSS_ERROR(m_BOSS) + } } - if (m_BOSS->Load(m_BOSSDB, + if (m_BOSS->Load(result, U8(masterlistName.toUtf8().constData()), U8(QDir::toNativeSeparators(qApp->applicationDirPath() + "/boss/userlist.txt").toUtf8().constData())) != BossDLL::RESULT_OK) { THROW_BOSS_ERROR(m_BOSS) } + return result; } -void PluginList::convertPluginListForBoss(boost::ptr_vector &inputPlugins, std::vector &activePlugins) +void PluginList::convertPluginListForBoss(boss_db db, boost::ptr_vector &inputPlugins, std::vector &activePlugins) { foreach (int idx, m_ESPsByPriority) { QString fileName = m_ESPs[idx].m_Name; @@ -693,51 +697,78 @@ void PluginList::convertPluginListForBoss(boost::ptr_vector &inputPlugi } inputPlugins.push_back(nameU8); } - if (m_BOSS->SetActivePluginsDumb(m_BOSSDB, &activePlugins[0], activePlugins.size()) != BossDLL::RESULT_OK) { + if (m_BOSS->SetActivePluginsDumb(db, &activePlugins[0], activePlugins.size()) != BossDLL::RESULT_OK) { THROW_BOSS_ERROR(m_BOSS) } } -void PluginList::applyBOSSSorting(uint8_t **pluginList, size_t size, int &priority, bool recognized, const char *extension) +void PluginList::applyBOSSSorting(boss_db db, std::map &lockedLoadOrder, uint8_t **pluginList, size_t size, + int &priority, int &loadOrder, bool recognized, const char *extension) { for (size_t i = 0; i < size; ++i) { QString name = QString::fromUtf8(reinterpret_cast(pluginList[i])).toLower(); if (name.endsWith(extension)) { auto iter = m_ESPsByName.find(name); if (iter == m_ESPsByName.end()) { - throw MyException("boss returned invalid data"); + // boss seems to report plugins from userlist as sorted that aren't even installed + continue; } + BossMessage *message; size_t numMessages = 0; - m_BOSS->GetPluginMessages(m_BOSSDB, pluginList[i], &message, &numMessages); + m_BOSS->GetPluginMessages(db, pluginList[i], &message, &numMessages); BossInfo newInfo; for (size_t im = 0; im < numMessages; ++im) { newInfo.m_BOSSMessages.append(QString::fromUtf8(reinterpret_cast(message[im].message))); } newInfo.m_BOSSUnrecognized = !recognized; m_BossInfo[name] = newInfo; + + // locked order plugins are not inserted by boss sorting ... + if (m_LockedOrder.find(name) != m_LockedOrder.end()) { + continue; + } + + // ... but by their enforced priority + while (lockedLoadOrder.find(loadOrder) != lockedLoadOrder.end()) { + auto lloIter = lockedLoadOrder.find(loadOrder); + auto nameIter = m_ESPsByName.find(lloIter->second); + if (nameIter != m_ESPsByName.end()) { + m_ESPs[nameIter->second].m_Priority = priority++; + if (m_ESPs[nameIter->second].m_Enabled) { + m_ESPs[nameIter->second].m_LoadOrder = loadOrder++; + } else { + m_ESPs[nameIter->second].m_LoadOrder = -1; + } + } + lockedLoadOrder.erase(lloIter); + } + m_ESPs[iter->second].m_Priority = priority++; + if (m_ESPs[iter->second].m_Enabled) { + m_ESPs[iter->second].m_LoadOrder = loadOrder++; + } else { + m_ESPs[iter->second].m_LoadOrder = -1; + } } } } void PluginList::bossSort() { - if (m_BOSS == NULL) { - // first run, check boss compatibility and update - initBoss(); - } + boss_db db = initBoss(); + ON_BLOCK_EXIT([&] { m_BOSS->DestroyBossDb(db); }); // create a boss-compatible representation of our current mod list. boost::ptr_vector inputPlugins; std::vector activePlugins; - convertPluginListForBoss(inputPlugins, activePlugins); + convertPluginListForBoss(db, inputPlugins, activePlugins); // sort mods in-memory uint8_t **sortedPlugins; uint8_t **unrecognizedPlugins; size_t sizeSorted, sizeUnrecognized; - if (m_BOSS->SortCustomMods(m_BOSSDB, + if (m_BOSS->SortCustomMods(db, inputPlugins.c_array(), inputPlugins.size(), &sortedPlugins, &sizeSorted, &unrecognizedPlugins, &sizeUnrecognized) != BossDLL::RESULT_OK) { @@ -751,17 +782,36 @@ void PluginList::bossSort() ChangeBracket layoutChange(this); + std::map lockedLoadOrder; + std::for_each(m_LockedOrder.begin(), m_LockedOrder.end(), + [&lockedLoadOrder] (const std::pair &ele) { lockedLoadOrder[ele.second] = ele.first; }); + int priority = 0; - applyBOSSSorting(sortedPlugins, sizeSorted, priority, true, "esm"); - applyBOSSSorting(unrecognizedPlugins, sizeUnrecognized, priority, false, "esm"); - applyBOSSSorting(sortedPlugins, sizeSorted, priority, true, "esp"); - applyBOSSSorting(unrecognizedPlugins, sizeUnrecognized, priority, false, "esp"); + int loadOrder = 0; + applyBOSSSorting(db, lockedLoadOrder, sortedPlugins, sizeSorted, priority, loadOrder, true, "esm"); + applyBOSSSorting(db, lockedLoadOrder, unrecognizedPlugins, sizeUnrecognized, priority, loadOrder, false, "esm"); + applyBOSSSorting(db, lockedLoadOrder, sortedPlugins, sizeSorted, priority, loadOrder, true, "esp"); + applyBOSSSorting(db, lockedLoadOrder, unrecognizedPlugins, sizeUnrecognized, priority, loadOrder, false, "esp"); + + // applyBOSSSorting removed entries from lockedLoadOrder when they were inserted so everything that's left is plugins + // locked to the end of the list. Now this inserts the rest in the ascending priority order. If the list is too short + // to place the plugins in their intended position then this guarantees plugins are kept in the correct relative order + // but it doesn't minimize the number of misplaced plugins. + for (auto iter = lockedLoadOrder.begin(); iter != lockedLoadOrder.end(); ++iter) { + auto nameIter = m_ESPsByName.find(iter->second); + if (nameIter != m_ESPsByName.end()) { + m_ESPs[nameIter->second].m_Priority = priority++; + if (m_ESPs[nameIter->second].m_Enabled) { + m_ESPs[nameIter->second].m_LoadOrder = loadOrder++; + } else { + m_ESPs[nameIter->second].m_LoadOrder = -1; + } + } + } // inform view of the changed data updateIndices(); layoutChange.finish(); - syncLoadOrder(); - emit dataChanged(this->index(0, 0), this->index(m_ESPs.size(), columnCount())); m_Refreshed(); } diff --git a/src/pluginlist.h b/src/pluginlist.h index 95f90e09..e45746f2 100644 --- a/src/pluginlist.h +++ b/src/pluginlist.h @@ -202,7 +202,7 @@ public: // implementation of the QAbstractTableModel interface virtual Qt::DropActions supportedDropActions() const { return Qt::MoveAction; } virtual bool dropMimeData(const QMimeData *data, Qt::DropAction action, int row, int column, const QModelIndex &parent); - void applyBOSSSorting(uint8_t **pluginList, size_t size, int &priority, bool recognized, const char *extension); + void applyBOSSSorting(boss_db db, std::map &lockedLoadOrder, uint8_t **pluginList, size_t size, int &priority, int &loadOrder, bool recognized, const char *extension); public slots: /** @@ -351,8 +351,8 @@ private: void testMasters(); - void initBoss(); - void convertPluginListForBoss(boost::ptr_vector &inputPlugins, std::vector &activePlugins); + boss_db initBoss(); + void convertPluginListForBoss(boss_db db, boost::ptr_vector &inputPlugins, std::vector &activePlugins); private: @@ -380,7 +380,6 @@ private: SignalRefreshed m_Refreshed; BossDLL *m_BOSS; - boss_db m_BOSSDB; QTemporaryFile m_TempFile; }; diff --git a/src/version.rc b/src/version.rc index 14b2781f..426e927e 100644 --- a/src/version.rc +++ b/src/version.rc @@ -1,7 +1,7 @@ #include "Winver.h" -#define VER_FILEVERSION 1,1,1,0 -#define VER_FILEVERSION_STR "1,1,1,0\0" +#define VER_FILEVERSION 1,1,2,0 +#define VER_FILEVERSION_STR "1,1,2,0\0" VS_VERSION_INFO VERSIONINFO FILEVERSION VER_FILEVERSION -- cgit v1.3.1 From c19c4820d87bdf350f0725712c0b5af908fa9580 Mon Sep 17 00:00:00 2001 From: Tannin Date: Tue, 18 Mar 2014 19:18:04 +0100 Subject: - force-enabled game esms no longer break keyboard-navigation in plugin list --- src/pluginflagicondelegate.cpp | 6 ++++-- src/pluginlist.cpp | 34 +++++++++++++++++++++++++++------- src/pluginlist.h | 4 +++- 3 files changed, 34 insertions(+), 10 deletions(-) (limited to 'src/pluginlist.cpp') diff --git a/src/pluginflagicondelegate.cpp b/src/pluginflagicondelegate.cpp index 6c0bb29e..761555d7 100644 --- a/src/pluginflagicondelegate.cpp +++ b/src/pluginflagicondelegate.cpp @@ -11,8 +11,10 @@ PluginFlagIconDelegate::PluginFlagIconDelegate(QObject *parent) QList PluginFlagIconDelegate::getIcons(const QModelIndex &index) const { QList result; - foreach (const QVariant &var, index.data(Qt::UserRole + 1).toList()) { - result.append(var.value()); + if (index.isValid()) { + foreach (const QVariant &var, index.data(Qt::UserRole + 1).toList()) { + result.append(var.value()); + } } return result; } diff --git a/src/pluginlist.cpp b/src/pluginlist.cpp index ec063994..289032bb 100644 --- a/src/pluginlist.cpp +++ b/src/pluginlist.cpp @@ -75,7 +75,7 @@ bool ByDate(const PluginList::ESPInfo& LHS, const PluginList::ESPInfo& RHS) { } PluginList::PluginList(QObject *parent) - : QAbstractTableModel(parent) + : QAbstractItemModel(parent) , m_FontMetrics(QFont()) , m_SaveTimer(this) , m_BOSS(NULL) @@ -951,7 +951,16 @@ QVariant PluginList::data(const QModelIndex &modelIndex, int role) const } break; } } else if ((role == Qt::CheckStateRole) && (modelIndex.column() == 0)) { - return m_ESPs[index].m_Enabled ? Qt::Checked : Qt::Unchecked; + if (m_ESPs[index].m_ForceEnabled) { + return QVariant(); + } else { + return m_ESPs[index].m_Enabled ? Qt::Checked : Qt::Unchecked; + } + } else if (role == Qt::ForegroundRole) { + if ((modelIndex.column() == COL_NAME) && + m_ESPs[index].m_ForceEnabled) { + return QBrush(Qt::gray); + } } else if (role == Qt::FontRole) { QFont result; if (m_ESPs[index].m_IsMaster) { @@ -1070,13 +1079,12 @@ QVariant PluginList::headerData(int section, Qt::Orientation orientation, Qt::ItemFlags PluginList::flags(const QModelIndex &modelIndex) const { int index = modelIndex.row(); - Qt::ItemFlags result = QAbstractTableModel::flags(modelIndex); + Qt::ItemFlags result = QAbstractItemModel::flags(modelIndex); if (modelIndex.isValid()) { - if ((m_ESPs[index].m_ForceEnabled)) { - result &= ~Qt::ItemIsEnabled; + if (!m_ESPs[index].m_ForceEnabled) { + result |= Qt::ItemIsUserCheckable | Qt::ItemIsDragEnabled; } - result |= Qt::ItemIsUserCheckable | Qt::ItemIsDragEnabled; } else { result |= Qt::ItemIsDropEnabled; } @@ -1216,6 +1224,19 @@ bool PluginList::dropMimeData(const QMimeData *mimeData, Qt::DropAction action, return false; } +QModelIndex PluginList::index(int row, int column, const QModelIndex&) const +{ + if ((row < 0) || (row >= rowCount()) || (column < 0) || (column >= columnCount())) { + return QModelIndex(); + } + return createIndex(row, column, row); +} + +QModelIndex PluginList::parent(const QModelIndex&) const +{ + return QModelIndex(); +} + bool PluginList::eventFilter(QObject *obj, QEvent *event) { @@ -1227,7 +1248,6 @@ bool PluginList::eventFilter(QObject *obj, QEvent *event) } QKeyEvent *keyEvent = static_cast(event); - // ctrl+up and ctrl+down -> increase or decrease priority of selected plugins if ((keyEvent->modifiers() == Qt::ControlModifier) && ((keyEvent->key() == Qt::Key_Up) || (keyEvent->key() == Qt::Key_Down))) { diff --git a/src/pluginlist.h b/src/pluginlist.h index e45746f2..8bf7e508 100644 --- a/src/pluginlist.h +++ b/src/pluginlist.h @@ -69,7 +69,7 @@ private: /** * @brief model representing the plugins (.esp/.esm) in the current virtual data folder **/ -class PluginList : public QAbstractTableModel, public MOBase::IPluginList +class PluginList : public QAbstractItemModel, public MOBase::IPluginList { Q_OBJECT friend class ChangeBracket; @@ -201,6 +201,8 @@ public: // implementation of the QAbstractTableModel interface virtual Qt::ItemFlags flags(const QModelIndex &index) const; virtual Qt::DropActions supportedDropActions() const { return Qt::MoveAction; } virtual bool dropMimeData(const QMimeData *data, Qt::DropAction action, int row, int column, const QModelIndex &parent); + virtual QModelIndex index(int row, int column, const QModelIndex &parent = QModelIndex()) const; + virtual QModelIndex parent(const QModelIndex &child) const; void applyBOSSSorting(boss_db db, std::map &lockedLoadOrder, uint8_t **pluginList, size_t size, int &priority, int &loadOrder, bool recognized, const char *extension); public slots: -- cgit v1.3.1 From 28301e7486423a2ca0b5434d1538d36b05f4ac86 Mon Sep 17 00:00:00 2001 From: Tannin Date: Wed, 26 Mar 2014 15:35:59 +0100 Subject: - improved NCC compatibility - crude support for multi-volume archives - updated imageformats plugins - nxmhandler now puts the exe to the top of the list when registering an MO instance, even if it is already in the list - bugfix: WritePrivateProfileString hook attempted to access lpKeyName even when it is null --- src/installationmanager.cpp | 17 ++++++++++++----- src/pluginlist.cpp | 3 +-- src/profile.cpp | 4 ++-- 3 files changed, 15 insertions(+), 9 deletions(-) (limited to 'src/pluginlist.cpp') diff --git a/src/installationmanager.cpp b/src/installationmanager.cpp index e6e660e6..7b8ed176 100644 --- a/src/installationmanager.cpp +++ b/src/installationmanager.cpp @@ -69,7 +69,7 @@ template T resolveFunction(QLibrary &lib, const char *name) InstallationManager::InstallationManager(QWidget *parent) : QObject(parent), m_ParentWidget(parent), - m_InstallationProgress(parent), m_SupportedExtensions(boost::assign::list_of("zip")("rar")("7z")("fomod")) + m_InstallationProgress(parent), m_SupportedExtensions(boost::assign::list_of("zip")("rar")("7z")("fomod")("001")) { QLibrary archiveLib("dlls\\archive.dll"); if (!archiveLib.load()) { @@ -659,7 +659,9 @@ bool InstallationManager::install(const QString &fileName, GuessedValue // open the archive and construct the directory tree the installers work on bool archiveOpen = m_CurrentArchive->open(ToWString(QDir::toNativeSeparators(fileName)).c_str(), new MethodCallback(this, &InstallationManager::queryPassword)); - + if (!archiveOpen) { + qDebug("integrated archiver can't open %s. errorcode %d", qPrintable(fileName), m_CurrentArchive->getLastError()); + } ON_BLOCK_EXIT(std::bind(&InstallationManager::postInstallCleanup, this)); QScopedPointer filesTree(archiveOpen ? createFilesTree() : NULL); @@ -676,8 +678,12 @@ bool InstallationManager::install(const QString &fileName, GuessedValue } // try only manual installers if that was requested - if ((installResult == IPluginInstaller::RESULT_MANUALREQUESTED) && !installer->isManualInstaller()) { - continue; + if (installResult == IPluginInstaller::RESULT_MANUALREQUESTED) { + if (!installer->isManualInstaller()) { + continue; + } + } else if (installResult != IPluginInstaller::RESULT_NOTATTEMPTED) { + break; } try { @@ -719,7 +725,8 @@ bool InstallationManager::install(const QString &fileName, GuessedValue case IPluginInstaller::RESULT_FAILED: { return false; } break; - case IPluginInstaller::RESULT_SUCCESS: { + case IPluginInstaller::RESULT_SUCCESS: + case IPluginInstaller::RESULT_SUCCESSCANCEL: { if (filesTree != NULL) { DirectoryTree::node_iterator iniTweakNode = filesTree->nodeFind(DirectoryTreeInformation("INI Tweaks")); hasIniTweaks = (iniTweakNode != filesTree->nodesEnd()) && diff --git a/src/pluginlist.cpp b/src/pluginlist.cpp index 289032bb..af6f42da 100644 --- a/src/pluginlist.cpp +++ b/src/pluginlist.cpp @@ -1035,9 +1035,8 @@ QVariant PluginList::data(const QModelIndex &modelIndex, int role) const result.append(QIcon(":/MO/gui/edit_clear")); } return result; - } else { - return QVariant(); } + return QVariant(); } diff --git a/src/profile.cpp b/src/profile.cpp index 41a867c5..42358b7d 100644 --- a/src/profile.cpp +++ b/src/profile.cpp @@ -93,7 +93,7 @@ Profile::Profile(const QDir& directory) GameInfo::instance().repairProfile(ToWString(m_Directory.absolutePath())); if (!QFile::exists(getIniFileName())) { - reportError(QObject::tr("\"%1\" is missing").arg(getIniFileName())); + reportError(QObject::tr("\"%1\" is missing or inaccessible").arg(getIniFileName())); } refreshModStatus(); } @@ -231,7 +231,7 @@ void Profile::refreshModStatus() { QFile file(getModlistFileName()); if (!file.exists()) { - throw MyException(QObject::tr("failed to find \"%1\"").arg(getModlistFileName())); + throw MyException(tr("\"%1\" is missing or inaccessible").arg(getModlistFileName())); } bool modStatusModified = false; -- cgit v1.3.1 From c017f4a0d50b67a44e276bd5ae8929ed3990c62c Mon Sep 17 00:00:00 2001 From: Tannin Date: Sat, 5 Apr 2014 15:14:37 +0200 Subject: - added buttons to backup and restore the modlist and pluginlist - replaced boss integration with loot --- src/ModOrganizer.pro | 3 +- src/main.cpp | 23 +--- src/mainwindow.cpp | 204 ++++++++++++++++++++++++++++++++- src/mainwindow.h | 16 ++- src/mainwindow.ui | 112 +++++++++++++++++-- src/modlist.cpp | 2 +- src/pluginlist.cpp | 224 +------------------------------------ src/pluginlist.h | 83 +------------- src/profile.h | 6 +- src/resources.qrc | 3 + src/resources/arrange-boxes.png | Bin 0 -> 1634 bytes src/resources/document-save_32.png | Bin 0 -> 1971 bytes src/resources/edit-undo.png | Bin 0 -> 1601 bytes src/selectiondialog.cpp | 123 ++++++++++---------- src/selectiondialog.h | 96 ++++++++-------- src/shared/gameinfo.cpp | 8 ++ src/shared/gameinfo.h | 1 + src/spawn.cpp | 29 ++++- src/spawn.h | 8 +- 19 files changed, 486 insertions(+), 455 deletions(-) create mode 100644 src/resources/arrange-boxes.png create mode 100644 src/resources/document-save_32.png create mode 100644 src/resources/edit-undo.png (limited to 'src/pluginlist.cpp') diff --git a/src/ModOrganizer.pro b/src/ModOrganizer.pro index 05b05855..62de3f66 100644 --- a/src/ModOrganizer.pro +++ b/src/ModOrganizer.pro @@ -14,7 +14,8 @@ SUBDIRS = bsatk \ BossDummy \ pythonRunner \ boss_modified \ - esptk + esptk \ + loot_cli plugins.depends = pythonRunner hookdll.depends = shared diff --git a/src/main.cpp b/src/main.cpp index ac903615..d1c5e263 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -80,24 +80,6 @@ using namespace MOBase; using namespace MOShared; -void removeOldLogfiles() -{ - QFileInfoList files = QDir(ToQString(GameInfo::instance().getLogDir())).entryInfoList(QStringList("ModOrganizer*.log"), - QDir::Files, QDir::Name); - - if (files.count() > 5) { - QStringList deleteFiles; - for (int i = 0; i < files.count() - 5; ++i) { - deleteFiles.append(files.at(i).absoluteFilePath()); - } - - if (!shellDelete(deleteFiles)) { - qWarning("failed to remove log files: %s", qPrintable(windowsErrorString(::GetLastError()))); - } - } -} - - // set up required folders (for a first install or after an update or to fix a broken installation) bool bootstrap() { @@ -111,7 +93,7 @@ bool bootstrap() } // cycle logfile - removeOldLogfiles(); + removeOldFiles(ToQString(GameInfo::instance().getLogDir()), "ModOrganizer*.log", 5, QDir::Name); // create organizer directories QString dirNames[] = { @@ -120,8 +102,7 @@ bool bootstrap() QDir::fromNativeSeparators(ToQString(gameInfo.getDownloadDir())), QDir::fromNativeSeparators(ToQString(gameInfo.getOverwriteDir())), QDir::fromNativeSeparators(ToQString(gameInfo.getLogDir())), - QDir::fromNativeSeparators(ToQString(gameInfo.getTutorialDir())), - QDir::fromNativeSeparators(ToQString(gameInfo.getOrganizerDirectory()) + "/boss") + QDir::fromNativeSeparators(ToQString(gameInfo.getTutorialDir())) }; static const int NUM_DIRECTORIES = sizeof(dirNames) / sizeof(QString); diff --git a/src/mainwindow.cpp b/src/mainwindow.cpp index bf5ea7f0..87360f3c 100644 --- a/src/mainwindow.cpp +++ b/src/mainwindow.cpp @@ -109,8 +109,10 @@ along with Mod Organizer. If not, see . #include #endif #include +#include #include #include +#include #ifdef TEST_MODELS @@ -2649,7 +2651,6 @@ void MainWindow::directory_refreshed() delete oldStructure; refreshDataTree(); - refreshLists(); } else { // TODO: don't know why this happens, this slot seems to get called twice with only one emit return; @@ -5155,20 +5156,213 @@ void MainWindow::on_showHiddenBox_toggled(bool checked) m_DownloadManager.setShowHidden(checked); } + +void MainWindow::createStdoutPipe(HANDLE *stdOutRead, HANDLE *stdOutWrite) +{ + SECURITY_ATTRIBUTES secAttributes; + secAttributes.nLength = sizeof(SECURITY_ATTRIBUTES); + secAttributes.bInheritHandle = TRUE; + secAttributes.lpSecurityDescriptor = NULL; + + if (!::CreatePipe(stdOutRead, stdOutWrite, &secAttributes, 0)) { + qCritical("failed to create stdout reroute"); + } + + if (!::SetHandleInformation(*stdOutRead, HANDLE_FLAG_INHERIT, 0)) { + qCritical("failed to correctly set up the stdout reroute"); + *stdOutWrite = *stdOutRead = INVALID_HANDLE_VALUE; + } +} + +std::string MainWindow::readFromPipe(HANDLE stdOutRead) +{ + static const int chunkSize = 128; + std::string result; + + char buffer[chunkSize + 1]; + buffer[chunkSize] = '\0'; + + DWORD read = 1; + while (read > 0) { + if (!::ReadFile(stdOutRead, buffer, chunkSize, &read, NULL)) { + break; + } + if (read > 0) { + result.append(buffer, read); + if (read < chunkSize) { + break; + } + } + } + return result; +} + void MainWindow::on_bossButton_clicked() { try { this->setEnabled(false); ON_BLOCK_EXIT([&] () { this->setEnabled(true); }); - LockedDialog dialog(this, tr("BOSS working"), false); + QProgressDialog dialog(this); + dialog.setLabelText(tr("LOOT working")); + dialog.setMaximum(0); dialog.show(); - qApp->processEvents(); - m_PluginList.bossSort(); - savePluginList(); + QStringList parameters; + parameters << "--game" << ToQString(GameInfo::instance().getGameName()) + << "--gamePath" << ToQString(GameInfo::instance().getGameDirectory()); + + HANDLE stdOutWrite = INVALID_HANDLE_VALUE; + HANDLE stdOutRead = INVALID_HANDLE_VALUE; + createStdoutPipe(&stdOutRead, &stdOutWrite); + + HANDLE loot = startBinary(QFileInfo(qApp->applicationDirPath() + "/lootcli.exe"), + parameters.join(" "), + m_CurrentProfile->getName(), + m_Settings.logLevel(), + qApp->applicationDirPath(), + true, + stdOutWrite); + + // we don't use the write end + ::CloseHandle(stdOutWrite); + + if (loot != INVALID_HANDLE_VALUE) { + while (::WaitForSingleObject(loot, 100) == WAIT_TIMEOUT) { + // keep processing events so the app doesn't appear dead + QCoreApplication::processEvents(); + if (dialog.wasCanceled()) { + ::TerminateProcess(loot, 1); + } + std::string lootOut = readFromPipe(stdOutRead); + std::vector lines; + boost::split(lines, lootOut, boost::is_any_of("\r\n")); + foreach (const std::string &line, lines) { + if (line.length() > 0) { + size_t progidx = line.find("[progress]"); + size_t reportidx = line.find("[report]"); + if (progidx != std::string::npos) { + dialog.setLabelText(line.substr(progidx + 11).c_str()); + } else if (reportidx != std::string::npos) { + qDebug("report at %s", line.substr(reportidx + 9).c_str()); + } else { + qDebug("%s", line.c_str()); + } + } + } + } + std::string remainder = readFromPipe(stdOutRead).c_str(); + if (remainder.length() > 0) { + qDebug("%s", remainder.c_str()); + } + + refreshESPList(); + + if (GameInfo::instance().getLoadOrderMechanism() == GameInfo::TYPE_FILETIME) { + QFile::remove(m_CurrentProfile->getLoadOrderFileName()); + } + } + dialog.hide(); } catch (const std::exception &e) { reportError(tr("failed to run boss: %1").arg(e.what())); ui->bossButton->setEnabled(false); } } + + +const char *MainWindow::PATTERN_BACKUP_GLOB = ".????_??_??_??_??_??"; +const char *MainWindow::PATTERN_BACKUP_REGEX = "\\.(\\d\\d\\d\\d_\\d\\d_\\d\\d_\\d\\d_\\d\\d_\\d\\d)"; +const char *MainWindow::PATTERN_BACKUP_DATE = "yyyy_MM_dd_hh_mm_ss"; + + +bool MainWindow::createBackup(const QString &filePath, const QDateTime &time) +{ + QString outPath = filePath + "." + time.toString(PATTERN_BACKUP_DATE); + if (shellCopy(QStringList(filePath), QStringList(outPath), this)) { + QFileInfo fileInfo(filePath); + removeOldFiles(fileInfo.absolutePath(), fileInfo.fileName() + PATTERN_BACKUP_GLOB, 3, QDir::Name); + return true; + } else { + return false; + } +} + +void MainWindow::on_saveButton_clicked() +{ + savePluginList(); + QDateTime now = QDateTime::currentDateTime(); + if (createBackup(m_CurrentProfile->getPluginsFileName(), now) + && createBackup(m_CurrentProfile->getLoadOrderFileName(), now) + && createBackup(m_CurrentProfile->getLockedOrderFileName(), now)) { + MessageDialog::showMessage(tr("Backup of load order created"), this); + } +} + +QString MainWindow::queryRestore(const QString &filePath) +{ + QFileInfo pluginFileInfo(filePath); + QString pattern = pluginFileInfo.fileName() + ".*"; + QFileInfoList files = pluginFileInfo.absoluteDir().entryInfoList(QStringList(pattern), QDir::Files, QDir::Name); + + SelectionDialog dialog(tr("Choose backup to restore"), this); + QRegExp exp(pluginFileInfo.fileName() + PATTERN_BACKUP_REGEX); + QRegExp exp2(pluginFileInfo.fileName() + "\\.(.*)"); + foreach(const QFileInfo &info, files) { + if (exp.exactMatch(info.fileName())) { + QDateTime time = QDateTime::fromString(exp.cap(1), PATTERN_BACKUP_DATE); + dialog.addChoice(time.toString(), "", exp.cap(1)); + } else if (exp2.exactMatch(info.fileName())) { + dialog.addChoice(exp2.cap(1), "", exp2.cap(1)); + } + } + + if (dialog.numChoices() == 0) { + QMessageBox::information(this, tr("No Backups"), tr("There are no backups to restore")); + return QString(); + } + + if (dialog.exec() == QDialog::Accepted) { + return dialog.getChoiceData().toString(); + } else { + return QString(); + } +} + +void MainWindow::on_restoreButton_clicked() +{ + QString pluginName = m_CurrentProfile->getPluginsFileName(); + QString choice = queryRestore(pluginName); + if (!choice.isEmpty()) { + QString loadOrderName = m_CurrentProfile->getLoadOrderFileName(); + QString lockedName = m_CurrentProfile->getLockedOrderFileName(); + if (!shellCopy(pluginName + "." + choice, pluginName, true, this) || + !shellCopy(loadOrderName + "." + choice, loadOrderName, true, this) || + !shellCopy(lockedName + "." + choice, lockedName, true, this)) { + QMessageBox::critical(this, tr("Restore failed"), + tr("Failed to restore the backup. Errorcode: %1").arg(windowsErrorString(::GetLastError()))); + } + refreshESPList(); + } +} + +void MainWindow::on_saveModsButton_clicked() +{ + m_CurrentProfile->writeModlistNow(true); + QDateTime now = QDateTime::currentDateTime(); + if (createBackup(m_CurrentProfile->getModlistFileName(), now)) { + MessageDialog::showMessage(tr("Backup of modlist created"), this); + } +} +void MainWindow::on_restoreModsButton_clicked() +{ + QString modlistName = m_CurrentProfile->getModlistFileName(); + QString choice = queryRestore(modlistName); + if (!choice.isEmpty()) { + if (!shellCopy(modlistName + "." + choice, modlistName, true, this)) { + QMessageBox::critical(this, tr("Restore failed"), + tr("Failed to restore the backup. Errorcode: %1").arg(windowsErrorString(::GetLastError()))); + } + refreshModList(false); + } +} + diff --git a/src/mainwindow.h b/src/mainwindow.h index 23923677..c5b4a8d3 100644 --- a/src/mainwindow.h +++ b/src/mainwindow.h @@ -154,6 +154,8 @@ public: void saveArchiveList(); + void createStdoutPipe(HANDLE *stdOutRead, HANDLE *stdOutWrite); + std::string readFromPipe(HANDLE stdOutRead); public slots: void displayColumnSelection(const QPoint &pos); @@ -207,8 +209,6 @@ private: bool nexusLogin(); - void saveCurrentESPList(); - bool testForSteam(); void startSteam(); @@ -290,11 +290,18 @@ private: void activateProxy(bool activate); void installTranslator(const QString &name); + bool createBackup(const QString &filePath, const QDateTime &time); + QString queryRestore(const QString &filePath); + private: static const unsigned int PROBLEM_PLUGINSNOTLOADED = 1; static const unsigned int PROBLEM_TOOMANYPLUGINS = 2; + static const char *PATTERN_BACKUP_GLOB; + static const char *PATTERN_BACKUP_REGEX; + static const char *PATTERN_BACKUP_DATE; + private: Ui::MainWindow *ui; @@ -574,6 +581,11 @@ private slots: // ui slots void on_showHiddenBox_toggled(bool checked); void on_bsaList_itemChanged(QTreeWidgetItem *item, int column); void on_bossButton_clicked(); + + void on_saveButton_clicked(); + void on_restoreButton_clicked(); + void on_restoreModsButton_clicked(); + void on_saveModsButton_clicked(); }; #endif // MAINWINDOW_H diff --git a/src/mainwindow.ui b/src/mainwindow.ui index 26cbbf83..dc91121c 100644 --- a/src/mainwindow.ui +++ b/src/mainwindow.ui @@ -115,7 +115,7 @@ 2
        - + @@ -170,6 +170,47 @@ p, li { white-space: pre-wrap; } + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + Restore Backup... + + + + + + + :/MO/gui/restore:/MO/gui/restore + + + + + + + Create Backup + + + + + + + :/MO/gui/backup:/MO/gui/backup + + + @@ -617,6 +658,68 @@ p, li { white-space: pre-wrap; } 0 + + + + + + Sort + + + + :/MO/gui/sort:/MO/gui/sort + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + Restore Backup... + + + + + + + :/MO/gui/restore:/MO/gui/restore + + + + 16 + 16 + + + + + + + + Create Backup + + + + + + + :/MO/gui/backup:/MO/gui/backup + + + + + @@ -725,13 +828,6 @@ p, li { white-space: pre-wrap; } - - - - Sort - - -
        diff --git a/src/modlist.cpp b/src/modlist.cpp index e2cb7cf0..836406e4 100644 --- a/src/modlist.cpp +++ b/src/modlist.cpp @@ -669,7 +669,7 @@ bool ModList::dropURLs(const QMimeData *mimeData, int row, const QModelIndex &pa } if (source.count() != 0) { - shellMove(source, target, NULL); + shellMove(source, target); } return true; diff --git a/src/pluginlist.cpp b/src/pluginlist.cpp index af6f42da..1f4ed9b1 100644 --- a/src/pluginlist.cpp +++ b/src/pluginlist.cpp @@ -78,7 +78,6 @@ PluginList::PluginList(QObject *parent) : QAbstractItemModel(parent) , m_FontMetrics(QFont()) , m_SaveTimer(this) - , m_BOSS(NULL) { m_SaveTimer.setSingleShot(true); connect(&m_SaveTimer, SIGNAL(timeout()), this, SIGNAL(saveTimer())); @@ -95,11 +94,6 @@ PluginList::PluginList(QObject *parent) PluginList::~PluginList() { - if (m_BOSS != NULL) { - m_BOSS->CleanUpAPI(); - delete m_BOSS; - m_BOSS = NULL; - } } @@ -595,225 +589,9 @@ void PluginList::refreshLoadOrder() } -class boss_exception : public std::runtime_error { -public: - boss_exception(const std::string &message) : std::runtime_error(message) {} -}; - -#define THROW_BOSS_ERROR(obj) \ - uint8_t *message; \ - obj->GetLastErrorDetails(&message); \ - throw boss_exception(std::string(reinterpret_cast(message))); - -#define U8(text) reinterpret_cast(text) - - -void outputBossLog(const QString &filename) -{ - QFile file(filename); - if (file.open(QIODevice::ReadOnly)) { - while (!file.atEnd()) { - QByteArray line = file.readLine().trimmed(); - if (line.length() < 1) - continue; - - int endFirstWord = line.indexOf(':'); - if (endFirstWord < 0) { - endFirstWord = 0; - } - QString firstWord = line.mid(0, endFirstWord); - if (firstWord == "DEBUG") { - qDebug("(boss) %s", line.mid(endFirstWord + 2).constData()); - } else { - qWarning("(boss) %s", line.mid(endFirstWord + 2).constData()); - } - } - } - file.resize(0); -} - - -boss_db PluginList::initBoss() -{ - boss_db result; - bool firstRun = (m_BOSS == nullptr); - if (firstRun) { - m_BOSS = new BossDLL(TEXT("dlls\\boss.dll")); - - if (!m_BOSS->IsCompatibleVersion(2,1,1)) { - throw MyException(tr("BOSS dll incompatible")); - } - uint8_t *versionString; - if (m_BOSS->GetVersionString(&versionString) != BossDLL::RESULT_OK) { - THROW_BOSS_ERROR(m_BOSS) - } - qDebug("using boss version %s", versionString); - - m_TempFile.open(); m_TempFile.close(); // yeah, stupid, but open is required to generate the name - m_BOSS->SetLoggerOutput(m_TempFile.fileName().toLocal8Bit().constData(), 4); - } - - if (m_BOSS->CreateBossDb(&result, BossDLL::SKYRIM, NULL) != BossDLL::RESULT_OK) { - uint8_t *message; - m_BOSS->GetLastErrorDetails(&message); - std::string messageCopy(reinterpret_cast(message)); - delete m_BOSS; - m_BOSS = NULL; - throw boss_exception(messageCopy); - } - qApp->processEvents(); - - QString masterlistName = QDir::toNativeSeparators(qApp->applicationDirPath() + "/boss/masterlist.txt"); - - if (firstRun) { - uint32_t res = m_BOSS->UpdateMasterlist(result, U8(masterlistName.toUtf8().constData())); - qApp->processEvents(); - if (res == BossDLL::RESULT_OK) { - qDebug("boss masterlist updated"); - } else if (res == BossDLL::RESULT_NO_UPDATE_NECESSARY) { - qDebug("boss masterlist already up-to-date"); - } else { - THROW_BOSS_ERROR(m_BOSS) - } - } - if (m_BOSS->Load(result, - U8(masterlistName.toUtf8().constData()), - U8(QDir::toNativeSeparators(qApp->applicationDirPath() + "/boss/userlist.txt").toUtf8().constData())) != BossDLL::RESULT_OK) { - THROW_BOSS_ERROR(m_BOSS) - } - return result; -} - -void PluginList::convertPluginListForBoss(boss_db db, boost::ptr_vector &inputPlugins, std::vector &activePlugins) -{ - foreach (int idx, m_ESPsByPriority) { - QString fileName = m_ESPs[idx].m_Name; - QByteArray name = fileName.toUtf8(); - - uint8_t *nameU8 = new uint8_t[name.length() + 1]; - memcpy(nameU8, name.constData(), name.length() + 1); - if (m_ESPs[idx].m_Enabled) { - activePlugins.push_back(nameU8); - } - inputPlugins.push_back(nameU8); - } - if (m_BOSS->SetActivePluginsDumb(db, &activePlugins[0], activePlugins.size()) != BossDLL::RESULT_OK) { - THROW_BOSS_ERROR(m_BOSS) - } -} - -void PluginList::applyBOSSSorting(boss_db db, std::map &lockedLoadOrder, uint8_t **pluginList, size_t size, - int &priority, int &loadOrder, bool recognized, const char *extension) -{ - for (size_t i = 0; i < size; ++i) { - QString name = QString::fromUtf8(reinterpret_cast(pluginList[i])).toLower(); - if (name.endsWith(extension)) { - auto iter = m_ESPsByName.find(name); - if (iter == m_ESPsByName.end()) { - // boss seems to report plugins from userlist as sorted that aren't even installed - continue; - } - - BossMessage *message; - size_t numMessages = 0; - m_BOSS->GetPluginMessages(db, pluginList[i], &message, &numMessages); - BossInfo newInfo; - for (size_t im = 0; im < numMessages; ++im) { - newInfo.m_BOSSMessages.append(QString::fromUtf8(reinterpret_cast(message[im].message))); - } - newInfo.m_BOSSUnrecognized = !recognized; - m_BossInfo[name] = newInfo; - - // locked order plugins are not inserted by boss sorting ... - if (m_LockedOrder.find(name) != m_LockedOrder.end()) { - continue; - } - - // ... but by their enforced priority - while (lockedLoadOrder.find(loadOrder) != lockedLoadOrder.end()) { - auto lloIter = lockedLoadOrder.find(loadOrder); - auto nameIter = m_ESPsByName.find(lloIter->second); - if (nameIter != m_ESPsByName.end()) { - m_ESPs[nameIter->second].m_Priority = priority++; - if (m_ESPs[nameIter->second].m_Enabled) { - m_ESPs[nameIter->second].m_LoadOrder = loadOrder++; - } else { - m_ESPs[nameIter->second].m_LoadOrder = -1; - } - } - lockedLoadOrder.erase(lloIter); - } - - m_ESPs[iter->second].m_Priority = priority++; - if (m_ESPs[iter->second].m_Enabled) { - m_ESPs[iter->second].m_LoadOrder = loadOrder++; - } else { - m_ESPs[iter->second].m_LoadOrder = -1; - } - } - } -} - -void PluginList::bossSort() +void PluginList::lootSort() { - boss_db db = initBoss(); - ON_BLOCK_EXIT([&] { m_BOSS->DestroyBossDb(db); }); - - // create a boss-compatible representation of our current mod list. - boost::ptr_vector inputPlugins; - std::vector activePlugins; - convertPluginListForBoss(db, inputPlugins, activePlugins); - - // sort mods in-memory - uint8_t **sortedPlugins; - uint8_t **unrecognizedPlugins; - size_t sizeSorted, sizeUnrecognized; - if (m_BOSS->SortCustomMods(db, - inputPlugins.c_array(), inputPlugins.size(), - &sortedPlugins, &sizeSorted, - &unrecognizedPlugins, &sizeUnrecognized) != BossDLL::RESULT_OK) { - THROW_BOSS_ERROR(m_BOSS) - } - - // output the log from boss to our own log to make it visible - outputBossLog(m_TempFile.fileName()); - - qDebug("%d sorted, %d unrecognized", sizeSorted, sizeUnrecognized); - ChangeBracket layoutChange(this); - - std::map lockedLoadOrder; - std::for_each(m_LockedOrder.begin(), m_LockedOrder.end(), - [&lockedLoadOrder] (const std::pair &ele) { lockedLoadOrder[ele.second] = ele.first; }); - - int priority = 0; - int loadOrder = 0; - applyBOSSSorting(db, lockedLoadOrder, sortedPlugins, sizeSorted, priority, loadOrder, true, "esm"); - applyBOSSSorting(db, lockedLoadOrder, unrecognizedPlugins, sizeUnrecognized, priority, loadOrder, false, "esm"); - applyBOSSSorting(db, lockedLoadOrder, sortedPlugins, sizeSorted, priority, loadOrder, true, "esp"); - applyBOSSSorting(db, lockedLoadOrder, unrecognizedPlugins, sizeUnrecognized, priority, loadOrder, false, "esp"); - - // applyBOSSSorting removed entries from lockedLoadOrder when they were inserted so everything that's left is plugins - // locked to the end of the list. Now this inserts the rest in the ascending priority order. If the list is too short - // to place the plugins in their intended position then this guarantees plugins are kept in the correct relative order - // but it doesn't minimize the number of misplaced plugins. - for (auto iter = lockedLoadOrder.begin(); iter != lockedLoadOrder.end(); ++iter) { - auto nameIter = m_ESPsByName.find(iter->second); - if (nameIter != m_ESPsByName.end()) { - m_ESPs[nameIter->second].m_Priority = priority++; - if (m_ESPs[nameIter->second].m_Enabled) { - m_ESPs[nameIter->second].m_LoadOrder = loadOrder++; - } else { - m_ESPs[nameIter->second].m_LoadOrder = -1; - } - } - } - - // inform view of the changed data - updateIndices(); - layoutChange.finish(); - emit dataChanged(this->index(0, 0), this->index(m_ESPs.size(), columnCount())); - m_Refreshed(); } IPluginList::PluginState PluginList::state(const QString &name) const diff --git a/src/pluginlist.h b/src/pluginlist.h index fff2a595..5e8557e2 100644 --- a/src/pluginlist.h +++ b/src/pluginlist.h @@ -181,7 +181,7 @@ public: void refreshLoadOrder(); - void bossSort(); + void lootSort(); public: virtual PluginState state(const QString &name) const; @@ -204,7 +204,6 @@ public: // implementation of the QAbstractTableModel interface virtual QModelIndex index(int row, int column, const QModelIndex &parent = QModelIndex()) const; virtual QModelIndex parent(const QModelIndex &child) const; - void applyBOSSSorting(boss_db db, std::map &lockedLoadOrder, uint8_t **pluginList, size_t size, int &priority, int &loadOrder, bool recognized, const char *extension); public slots: /** @@ -260,82 +259,6 @@ private: friend bool ByDate(const ESPInfo& LHS, const ESPInfo& RHS); friend bool ByPriority(const ESPInfo& LHS, const ESPInfo& RHS); - class BossDLL : public PDLL { - DECLARE_CLASS(BossDLL) - - DECLARE_FUNCTION3(__cdecl, uint32_t, CreateBossDb, boss_db*, const uint32_t, const uint8_t*) - DECLARE_FUNCTION1(__cdecl, void, DestroyBossDb, boss_db) - DECLARE_FUNCTION0(__cdecl, void, CleanUpAPI) - - DECLARE_FUNCTION7(__cdecl, uint32_t, SortCustomMods, boss_db, uint8_t**, size_t, uint8_t***, size_t*, uint8_t***, size_t*) - DECLARE_FUNCTION3(__cdecl, uint32_t, SetActivePluginsDumb, boss_db, uint8_t**, const size_t) - - DECLARE_FUNCTION3(__cdecl, uint32_t, GetActivePluginsDumb , boss_db, uint8_t***, size_t*) - - DECLARE_FUNCTION2(__cdecl, uint32_t, UpdateMasterlist, boss_db, const uint8_t*) - DECLARE_FUNCTION3(__cdecl, uint32_t, Load, boss_db, const uint8_t*, const uint8_t*) - - DECLARE_FUNCTION2(__cdecl, void, SetLoggerOutput, const char*, uint8_t) - DECLARE_FUNCTION1(__cdecl, uint32_t, GetLastErrorDetails, uint8_t**) - - DECLARE_FUNCTION1(__cdecl, uint32_t, GetVersionString, uint8_t**) - DECLARE_FUNCTION3(__cdecl, bool, IsCompatibleVersion, const uint32_t, const uint32_t, const uint32_t) - - DECLARE_FUNCTION4(__cdecl, uint32_t, GetPluginMessages, boss_db, const uint8_t*, BossMessage**, size_t*) - - enum ResultCode { - RESULT_OK = 0, - RESULT_NO_MASTER_FILE = 1, - RESULT_FILE_READ_FAIL = 2, - RESULT_FILE_WRITE_FAIL = 3, - RESULT_FILE_NOT_UTF8 = 4, - RESULT_FILE_NOT_FOUND = 5, - RESULT_FILE_PARSE_FAIL = 6, - RESULT_CONDITION_EVAL_FAIL = 7, - RESULT_REGEX_EVAL_FAIL = 8, - RESULT_NO_GAME_DETECTED = 9, - RESULT_ENCODING_CONVERSION_FAIL = 10, - RESULT_FIND_ONLINE_MASTERLIST_REVISION_FAIL = 11, - RESULT_FIND_ONLINE_MASTERLIST_DATE_FAIL = 12, - RESULT_READ_UPDATE_FILE_LIST_FAIL = 13, - RESULT_FILE_CRC_MISMATCH = 14, - RESULT_FS_FILE_MOD_TIME_READ_FAIL = 15, - RESULT_FS_FILE_MOD_TIME_WRITE_FAIL = 16, - RESULT_FS_FILE_RENAME_FAIL = 17, - RESULT_FS_FILE_DELETE_FAIL = 18, - RESULT_FS_CREATE_DIRECTORY_FAIL = 19, - RESULT_FS_ITER_DIRECTORY_FAIL = 20, - RESULT_CURL_INIT_FAIL = 21, - RESULT_CURL_SET_ERRBUFF_FAIL = 22, - RESULT_CURL_SET_OPTION_FAIL = 23, - RESULT_CURL_SET_PROXY_FAIL = 24, - RESULT_CURL_SET_PROXY_TYPE_FAIL = 25, - RESULT_CURL_SET_PROXY_AUTH_FAIL = 26, - RESULT_CURL_SET_PROXY_AUTH_TYPE_FAIL = 27, - RESULT_CURL_PERFORM_FAIL = 28, - RESULT_CURL_USER_CANCEL = 29, - RESULT_GUI_WINDOW_INIT_FAIL = 30, - RESULT_NO_UPDATE_NECESSARY = 31, - RESULT_LO_MISMATCH = 32, - RESULT_NO_MEM = 33, - RESULT_INVALID_ARGS = 34, - RESULT_NETWORK_FAIL = 35, - RESULT_NO_INTERNET_CONNECTION = 36, - RESULT_NO_TAG_MAP = 37, - RESULT_PLUGINS_FULL = 38, - RESULT_PLUGIN_BEFORE_MASTER = 39, - RESULT_INVALID_SYNTAX = 40 - }; - - enum GameIDs { - AUTODETECT = 0, - OBLIVION = 1, - SKYRIM = 3, - FALLOUT3 = 4, - FALLOUTNV = 5 - }; - }; - private: void syncLoadOrder(); @@ -353,9 +276,6 @@ private: void testMasters(); - boss_db initBoss(); - void convertPluginListForBoss(boss_db db, boost::ptr_vector &inputPlugins, std::vector &activePlugins); - private: std::vector m_ESPs; @@ -381,7 +301,6 @@ private: SignalRefreshed m_Refreshed; - BossDLL *m_BOSS; QTemporaryFile m_TempFile; }; diff --git a/src/profile.h b/src/profile.h index 4960671a..5aa77357 100644 --- a/src/profile.h +++ b/src/profile.h @@ -159,6 +159,11 @@ public: */ QString getLockedOrderFileName() const; + /** + * @return the path of the modlist file in this profile + */ + QString getModlistFileName() const; + /** * @return path of the archives file in this profile */ @@ -301,7 +306,6 @@ private: void updateIndices(); - QString getModlistFileName() const; void copyFilesTo(QString &target) const; std::vector splitDZString(const wchar_t *buffer) const; diff --git a/src/resources.qrc b/src/resources.qrc index 73921f64..bf53ea95 100644 --- a/src/resources.qrc +++ b/src/resources.qrc @@ -52,5 +52,8 @@ resources/x-office-calendar.png resources/dialog-warning_16.png resources/mail-attachment.png + resources/document-save_32.png + resources/edit-undo.png + resources/arrange-boxes.png diff --git a/src/resources/arrange-boxes.png b/src/resources/arrange-boxes.png new file mode 100644 index 00000000..b1ab67cf Binary files /dev/null and b/src/resources/arrange-boxes.png differ diff --git a/src/resources/document-save_32.png b/src/resources/document-save_32.png new file mode 100644 index 00000000..db5c52b7 Binary files /dev/null and b/src/resources/document-save_32.png differ diff --git a/src/resources/edit-undo.png b/src/resources/edit-undo.png new file mode 100644 index 00000000..61b2ce9a Binary files /dev/null and b/src/resources/edit-undo.png differ diff --git a/src/selectiondialog.cpp b/src/selectiondialog.cpp index dbc10791..902b4d9c 100644 --- a/src/selectiondialog.cpp +++ b/src/selectiondialog.cpp @@ -17,62 +17,67 @@ You should have received a copy of the GNU General Public License along with Mod Organizer. If not, see . */ -#include "selectiondialog.h" -#include "ui_selectiondialog.h" - -#include - -SelectionDialog::SelectionDialog(const QString &description, QWidget *parent) - : QDialog(parent), ui(new Ui::SelectionDialog), m_Choice(NULL), m_ValidateByData(false) -{ - ui->setupUi(this); - - ui->descriptionLabel->setText(description); -} - -SelectionDialog::~SelectionDialog() -{ - delete ui; -} - - -void SelectionDialog::addChoice(const QString &buttonText, const QString &description, const QVariant &data) -{ - QCommandLinkButton *button = new QCommandLinkButton(buttonText, description, ui->buttonBox); - button->setProperty("data", data); - ui->buttonBox->addButton(button, QDialogButtonBox::AcceptRole); - if (data.isValid()) m_ValidateByData = true; -} - - -QVariant SelectionDialog::getChoiceData() -{ - return m_Choice->property("data"); -} - - -QString SelectionDialog::getChoiceString() -{ - if ((m_Choice == NULL) || - (m_ValidateByData && !m_Choice->property("data").isValid())) { - return QString(); - } else { - return m_Choice->text(); - } -} - - -void SelectionDialog::on_buttonBox_clicked(QAbstractButton *button) -{ - m_Choice = button; - if (!m_ValidateByData || m_Choice->property("data").isValid()) { - this->accept(); - } else { - this->reject(); - } -} - -void SelectionDialog::on_cancelButton_clicked() -{ - this->reject(); -} +#include "selectiondialog.h" +#include "ui_selectiondialog.h" + +#include + +SelectionDialog::SelectionDialog(const QString &description, QWidget *parent) + : QDialog(parent), ui(new Ui::SelectionDialog), m_Choice(NULL), m_ValidateByData(false) +{ + ui->setupUi(this); + + ui->descriptionLabel->setText(description); +} + +SelectionDialog::~SelectionDialog() +{ + delete ui; +} + + +void SelectionDialog::addChoice(const QString &buttonText, const QString &description, const QVariant &data) +{ + QCommandLinkButton *button = new QCommandLinkButton(buttonText, description, ui->buttonBox); + button->setProperty("data", data); + ui->buttonBox->addButton(button, QDialogButtonBox::AcceptRole); + if (data.isValid()) m_ValidateByData = true; +} + +int SelectionDialog::numChoices() const +{ + return ui->buttonBox->findChildren(QString()).count(); +} + + +QVariant SelectionDialog::getChoiceData() +{ + return m_Choice->property("data"); +} + + +QString SelectionDialog::getChoiceString() +{ + if ((m_Choice == NULL) || + (m_ValidateByData && !m_Choice->property("data").isValid())) { + return QString(); + } else { + return m_Choice->text(); + } +} + + +void SelectionDialog::on_buttonBox_clicked(QAbstractButton *button) +{ + m_Choice = button; + if (!m_ValidateByData || m_Choice->property("data").isValid()) { + this->accept(); + } else { + this->reject(); + } +} + +void SelectionDialog::on_cancelButton_clicked() +{ + this->reject(); +} diff --git a/src/selectiondialog.h b/src/selectiondialog.h index a2844e97..fc04291e 100644 --- a/src/selectiondialog.h +++ b/src/selectiondialog.h @@ -17,50 +17,52 @@ You should have received a copy of the GNU General Public License along with Mod Organizer. If not, see . */ -#ifndef SELECTIONDIALOG_H -#define SELECTIONDIALOG_H - -#include -#include - -namespace Ui { -class SelectionDialog; -} - -class SelectionDialog : public QDialog -{ - Q_OBJECT - -public: - - explicit SelectionDialog(const QString &description, QWidget *parent = 0); - - ~SelectionDialog(); - - /** - * @brief add a choice to the dialog - * @param buttonText the text to be displayed on the button - * @param description the description that shows up under in small letters inside the button - * @param data data to be stored with the button. Please note that as soon as one choice has data associated with it (non-invalid QVariant) - * all buttons that contain no data will be treated as "cancel" buttons - */ - void addChoice(const QString &buttonText, const QString &description, const QVariant &data); - - QVariant getChoiceData(); - QString getChoiceString(); - -private slots: - - void on_buttonBox_clicked(QAbstractButton *button); - - void on_cancelButton_clicked(); - -private: - - Ui::SelectionDialog *ui; - QAbstractButton *m_Choice; - bool m_ValidateByData; - -}; - -#endif // SELECTIONDIALOG_H +#ifndef SELECTIONDIALOG_H +#define SELECTIONDIALOG_H + +#include +#include + +namespace Ui { +class SelectionDialog; +} + +class SelectionDialog : public QDialog +{ + Q_OBJECT + +public: + + explicit SelectionDialog(const QString &description, QWidget *parent = 0); + + ~SelectionDialog(); + + /** + * @brief add a choice to the dialog + * @param buttonText the text to be displayed on the button + * @param description the description that shows up under in small letters inside the button + * @param data data to be stored with the button. Please note that as soon as one choice has data associated with it (non-invalid QVariant) + * all buttons that contain no data will be treated as "cancel" buttons + */ + void addChoice(const QString &buttonText, const QString &description, const QVariant &data); + + int numChoices() const; + + QVariant getChoiceData(); + QString getChoiceString(); + +private slots: + + void on_buttonBox_clicked(QAbstractButton *button); + + void on_cancelButton_clicked(); + +private: + + Ui::SelectionDialog *ui; + QAbstractButton *m_Choice; + bool m_ValidateByData; + +}; + +#endif // SELECTIONDIALOG_H diff --git a/src/shared/gameinfo.cpp b/src/shared/gameinfo.cpp index 00bb42fd..b580a226 100644 --- a/src/shared/gameinfo.cpp +++ b/src/shared/gameinfo.cpp @@ -172,6 +172,14 @@ std::wstring GameInfo::getLogDir() const } +std::wstring GameInfo::getLootDir() const +{ + std::wostringstream temp; + temp << m_OrganizerDirectory << "\\loot"; + return temp.str(); +} + + std::wstring GameInfo::getTutorialDir() const { std::wostringstream temp; diff --git a/src/shared/gameinfo.h b/src/shared/gameinfo.h index 10775e6c..89c9402d 100644 --- a/src/shared/gameinfo.h +++ b/src/shared/gameinfo.h @@ -113,6 +113,7 @@ public: virtual std::wstring getCacheDir() const; virtual std::wstring getOverwriteDir() const; virtual std::wstring getLogDir() const; + virtual std::wstring getLootDir() const; virtual std::wstring getTutorialDir() const; virtual bool requiresBSAInvalidation() const { return true; } diff --git a/src/spawn.cpp b/src/spawn.cpp index b1c5e963..6adafba0 100644 --- a/src/spawn.cpp +++ b/src/spawn.cpp @@ -36,10 +36,23 @@ using namespace MOShared; static const int BUFSIZE = 4096; -bool spawn(LPCWSTR binary, LPCWSTR arguments, LPCWSTR currentDirectory, bool suspended, HANDLE& processHandle, HANDLE& threadHandle) +bool spawn(LPCWSTR binary, LPCWSTR arguments, LPCWSTR currentDirectory, bool suspended, + HANDLE stdOut, HANDLE stdErr, + HANDLE& processHandle, HANDLE& threadHandle) { + BOOL inheritHandles = FALSE; STARTUPINFO si; ::ZeroMemory(&si, sizeof(si)); + if (stdOut != INVALID_HANDLE_VALUE) { + si.hStdOutput = stdOut; + inheritHandles = TRUE; + si.dwFlags |= STARTF_USESTDHANDLES; + } + if (stdErr != INVALID_HANDLE_VALUE) { + si.hStdError = stdErr; + inheritHandles = TRUE; + si.dwFlags |= STARTF_USESTDHANDLES; + } si.cb = sizeof(si); int length = wcslen(binary) + wcslen(arguments) + 4; wchar_t *commandLine = NULL; @@ -74,7 +87,7 @@ bool spawn(LPCWSTR binary, LPCWSTR arguments, LPCWSTR currentDirectory, bool sus BOOL success = ::CreateProcess(NULL, commandLine, NULL, NULL, // no special process or thread attributes - FALSE, // don't inherit handle + inheritHandles, // inherit handles if we plan to use stdout or stderr reroute suspended ? CREATE_SUSPENDED : 0, // create suspended so I have time to inject the DLL NULL, // same environment as parent currentDirectory, // current directory @@ -95,14 +108,22 @@ bool spawn(LPCWSTR binary, LPCWSTR arguments, LPCWSTR currentDirectory, bool sus } -HANDLE startBinary(const QFileInfo &binary, const QString &arguments, const QString& profileName, int logLevel, const QDir ¤tDirectory, bool hooked) +HANDLE startBinary(const QFileInfo &binary, + const QString &arguments, + const QString& profileName, + int logLevel, + const QDir ¤tDirectory, + bool hooked, + HANDLE stdOut, + HANDLE stdErr) { HANDLE processHandle, threadHandle; std::wstring binaryName = ToWString(QDir::toNativeSeparators(binary.absoluteFilePath())); std::wstring currentDirectoryName = ToWString(QDir::toNativeSeparators(currentDirectory.absolutePath())); try { - if (!spawn(binaryName.c_str(), ToWString(arguments).c_str(), currentDirectoryName.c_str(), hooked, processHandle, threadHandle)) { + if (!spawn(binaryName.c_str(), ToWString(arguments).c_str(), currentDirectoryName.c_str(), hooked, + stdOut, stdErr, processHandle, threadHandle)) { reportError(QObject::tr("failed to spawn \"%1\"").arg(binary.fileName())); return INVALID_HANDLE_VALUE; } diff --git a/src/spawn.h b/src/spawn.h index 48320fea..3f037119 100644 --- a/src/spawn.h +++ b/src/spawn.h @@ -52,11 +52,17 @@ private: * @param arguments arguments to pass to the binary * @param profileName name of the active profile * @param currentDirectory the directory to use as the working directory to run in + * @param logLevel log level to be used by the hook library. Ignored if hooked is false * @param hooked if set, the binary is started with mo injected + * @param stdout if not equal to INVALID_HANDLE_VALUE, this is used as stdout for the process + * @param stderr if not equal to INVALID_HANDLE_VALUE, this is used as stderr for the process * @return the process handle * @todo is the profile name even used any more? * @todo is the hooked parameter used? **/ -HANDLE startBinary(const QFileInfo &binary, const QString &arguments, const QString &profileName, int logLevel, const QDir ¤tDirectory, bool hooked); +HANDLE startBinary(const QFileInfo &binary, const QString &arguments, const QString &profileName, int logLevel, + const QDir ¤tDirectory, bool hooked, + HANDLE stdOut = INVALID_HANDLE_VALUE, HANDLE stdErr = INVALID_HANDLE_VALUE); #endif // SPAWN_H + -- cgit v1.3.1