diff --git "a/stuff/config/loc/\344\270\255\346\226\207/tnztools.qm" "b/stuff/config/loc/\344\270\255\346\226\207/tnztools.qm" index 4c8cdc1..22ee07d 100644 Binary files "a/stuff/config/loc/\344\270\255\346\226\207/tnztools.qm" and "b/stuff/config/loc/\344\270\255\346\226\207/tnztools.qm" differ diff --git "a/stuff/config/loc/\344\270\255\346\226\207/toonz.qm" "b/stuff/config/loc/\344\270\255\346\226\207/toonz.qm" index 7835f24..a38f05a 100644 Binary files "a/stuff/config/loc/\344\270\255\346\226\207/toonz.qm" and "b/stuff/config/loc/\344\270\255\346\226\207/toonz.qm" differ diff --git "a/stuff/config/loc/\344\270\255\346\226\207/toonzlib.qm" "b/stuff/config/loc/\344\270\255\346\226\207/toonzlib.qm" index 5547a3d..37b983c 100644 Binary files "a/stuff/config/loc/\344\270\255\346\226\207/toonzlib.qm" and "b/stuff/config/loc/\344\270\255\346\226\207/toonzlib.qm" differ diff --git "a/stuff/config/loc/\344\270\255\346\226\207/toonzqt.qm" "b/stuff/config/loc/\344\270\255\346\226\207/toonzqt.qm" index 3a20485..f286a53 100644 Binary files "a/stuff/config/loc/\344\270\255\346\226\207/toonzqt.qm" and "b/stuff/config/loc/\344\270\255\346\226\207/toonzqt.qm" differ diff --git a/toonz/sources/common/tapptools/tenv.cpp b/toonz/sources/common/tapptools/tenv.cpp index e4c008e..9151016 100644 --- a/toonz/sources/common/tapptools/tenv.cpp +++ b/toonz/sources/common/tapptools/tenv.cpp @@ -171,6 +171,9 @@ public: } TFilePath getEnvFile() { return m_envFile; } + TFilePath getTemplateEnvFile() { + return m_envFile.getParentDir() + TFilePath("template.env"); + } void setApplicationFullName(std::string applicationFullName) { m_applicationFullName = applicationFullName; @@ -326,8 +329,11 @@ void VariableSet::load() { #endif TFilePath fp = EnvGlobals::instance()->getEnvFile(); if (fp == TFilePath()) return; + // if the personal env is not found, then try to find the template + if (!TFileStatus(fp).doesExist()) + fp = EnvGlobals::instance()->getTemplateEnvFile(); Tifstream is(fp); - if (!is) return; + if (!is.isOpen()) return; char buffer[1024]; while (is.getline(buffer, sizeof(buffer))) { char *s = buffer; diff --git a/toonz/sources/include/toonz/txshlevelcolumn.h b/toonz/sources/include/toonz/txshlevelcolumn.h index a351505..e519264 100644 --- a/toonz/sources/include/toonz/txshlevelcolumn.h +++ b/toonz/sources/include/toonz/txshlevelcolumn.h @@ -85,6 +85,9 @@ Return \b TFx. */ TFx *getFx() const override; + // Used in TCellData::getNumbers + bool setNumbers(int row, int rowCount, const TXshCell cells[]); + private: // not implemented TXshLevelColumn(const TXshLevelColumn &); diff --git a/toonz/sources/include/toonzqt/menubarcommand.h b/toonz/sources/include/toonzqt/menubarcommand.h index b1b677b..eb30a07 100644 --- a/toonz/sources/include/toonzqt/menubarcommand.h +++ b/toonz/sources/include/toonzqt/menubarcommand.h @@ -173,6 +173,9 @@ public: const QString &offText); std::string getIdFromAction(QAction *action); + + // load user defined shortcuts + void loadShortcuts(); }; //----------------------------------------------------------------------------- diff --git a/toonz/sources/include/toonzqt/selectioncommandids.h b/toonz/sources/include/toonzqt/selectioncommandids.h index 99ebe5e..50fa74b 100644 --- a/toonz/sources/include/toonzqt/selectioncommandids.h +++ b/toonz/sources/include/toonzqt/selectioncommandids.h @@ -36,5 +36,6 @@ #define MI_Collapse "MI_Collapse" #define MI_ExplodeChild "MI_ExplodeChild" #define MI_ToggleEditInPlace "MI_ToggleEditInPlace" +#define MI_PasteNumbers "MI_PasteNumbers" #endif diff --git a/toonz/sources/toonz/celldata.cpp b/toonz/sources/toonz/celldata.cpp index 2bef123..709f2fd 100644 --- a/toonz/sources/toonz/celldata.cpp +++ b/toonz/sources/toonz/celldata.cpp @@ -10,6 +10,7 @@ #include "toonz/txshzeraryfxlevel.h" #include "toonz/tcolumnfx.h" #include "toonz/fxdag.h" +#include "toonz/txshlevelcolumn.h" //----------------------------------------------------------------------------- @@ -99,6 +100,42 @@ bool TCellData::getCells(TXsheet *xsh, int r0, int c0, int &r1, int &c1, } //----------------------------------------------------------------------------- +// Paste only cell numbers. +// As a special behavior, enable to copy one column and paste into +// multiple columns. + +bool TCellData::getNumbers(TXsheet *xsh, int r0, int c0, int &r1, + int &c1) const { + r1 = r0 + m_rowCount - 1; + bool oneToMulti = m_colCount == 1 && c0 < c1; + if (!oneToMulti) c1 = c0 + m_colCount - 1; + + bool cellSet = false; + + for (int c = c0; c <= c1; c++) { + TXshColumn *column = xsh->getColumn(c); + if (!column || column->isEmpty()) continue; + TXshLevelColumn *levelColumn = column->getLevelColumn(); + if (!levelColumn) continue; + + std::vector cells = m_cells; + + int sourceColIndex = (oneToMulti) ? 0 : c - c0; + int sourceCellIndex = sourceColIndex * m_rowCount; + + if (!canChange(column, sourceColIndex)) continue; + + bool isSet = levelColumn->setNumbers(r0, m_rowCount, + &cells[sourceColIndex * m_rowCount]); + + cellSet = cellSet || isSet; + } + xsh->updateFrameCount(); + + return cellSet; +} + +//----------------------------------------------------------------------------- /*-- c0 を起点に、TCellDataの選択範囲のカラム幅分、 全てのカラムがcanChangeかどうか調べる。 --*/ diff --git a/toonz/sources/toonz/celldata.h b/toonz/sources/toonz/celldata.h index 0556a0e..e091e7f 100644 --- a/toonz/sources/toonz/celldata.h +++ b/toonz/sources/toonz/celldata.h @@ -47,6 +47,11 @@ If skipEmptyCells == false do not skip setting empty cells in data*/ bool insert = true, bool doZeraryClone = true, bool skipEmptyCells = true) const; + // Paste only cell numbers. + // As a special behavior, enable to copy one column and paste into + // multiple columns. + bool getNumbers(TXsheet *xsh, int r0, int c0, int &r1, int &c1) const; + //! Return true if cell in TCellData can be set in \b xsh xsheet. bool canChange(TXsheet *xsh, int c0) const; diff --git a/toonz/sources/toonz/cellselection.cpp b/toonz/sources/toonz/cellselection.cpp index b5c440c..0a8b4b4 100644 --- a/toonz/sources/toonz/cellselection.cpp +++ b/toonz/sources/toonz/cellselection.cpp @@ -1033,6 +1033,118 @@ public: int getHistoryType() override { return HistoryType::Xsheet; } }; +//============================================================================= + +bool pasteNumbersWithoutUndo(int &r0, int &c0, int &r1, int &c1) { + TXsheet *xsh = TApp::instance()->getCurrentXsheet()->getXsheet(); + QClipboard *clipboard = QApplication::clipboard(); + const QMimeData *mimeData = clipboard->mimeData(); + const TCellData *cellData = dynamic_cast(mimeData); + + if (!cellData) return false; + + if (r0 < 0 || c0 < 0) return false; + + bool ret = cellData->getNumbers(xsh, r0, c0, r1, c1); + if (!ret) return false; + + // Se la selezione corrente e' TCellSelection selezione le celle copiate + TCellSelection *cellSelection = dynamic_cast( + TApp::instance()->getCurrentSelection()->getSelection()); + if (cellSelection) cellSelection->selectCells(r0, c0, r1, c1); + return true; +} + +//============================================================================= + +class OverwritePasteNumbersUndo final : public TUndo { + TCellSelection *m_oldSelection; + TCellSelection *m_newSelection; + QMimeData *m_data; + QMimeData *m_beforeData; + +public: + OverwritePasteNumbersUndo(int r0, int c0, int r1, int c1, int oldR0, + int oldC0, int oldR1, int oldC1, + TCellData *beforeData) { + QClipboard *clipboard = QApplication::clipboard(); + // keep the pasted data + TCellData *data = new TCellData(); + TXsheet *xsh = TApp::instance()->getCurrentXsheet()->getXsheet(); + data->setCells(xsh, r0, c0, r1, c1); + m_data = data->clone(); + m_newSelection = new TCellSelection(); + m_newSelection->selectCells(r0, c0, r1, c1); + m_oldSelection = new TCellSelection(); + m_oldSelection->selectCells(oldR0, oldC0, oldR1, oldC1); + // keep the cells before pasting + m_beforeData = beforeData->clone(); + } + + ~OverwritePasteNumbersUndo() { + delete m_newSelection; + delete m_oldSelection; + delete m_data; + delete m_beforeData; + } + + void undo() const override { + int r0, c0, r1, c1; + m_newSelection->getSelectedCells(r0, c0, r1, c1); + + int oldR0, oldC0, oldR1, oldC1; + m_oldSelection->getSelectedCells(oldR0, oldC0, oldR1, oldC1); + + QClipboard *clipboard = QApplication::clipboard(); + int c0BeforeCut = c0; + int c1BeforeCut = c1; + cutCellsWithoutUndo(r0, c0, r1, c1); + + TXsheet *xsh = TApp::instance()->getCurrentXsheet()->getXsheet(); + + // keep the clipboard content + QMimeData *mimeData = cloneData(clipboard->mimeData()); + + // execute pasting + clipboard->setMimeData(cloneData(m_beforeData), QClipboard::Clipboard); + pasteCellsWithoutUndo(r0, c0, r1, c1, true, false, false); + + // restore clipboard + clipboard->setMimeData(mimeData, QClipboard::Clipboard); + + // revert old cell selection + TCellSelection *cellSelection = dynamic_cast( + TApp::instance()->getCurrentSelection()->getSelection()); + if (cellSelection && oldR0 != -1 && oldC0 != -1) + cellSelection->selectCells(oldR0, oldC0, oldR1, oldC1); + + TApp::instance()->getCurrentXsheet()->notifyXsheetChanged(); + } + + void redo() const override { + int r0, c0, r1, c1; + m_newSelection->getSelectedCells(r0, c0, c1, r1); + QClipboard *clipboard = QApplication::clipboard(); + + // keep the clipboard content + QMimeData *mimeData = cloneData(clipboard->mimeData()); + + clipboard->setMimeData(cloneData(m_data), QClipboard::Clipboard); + // Cut delle celle che sono in newSelection + pasteCellsWithoutUndo(r0, c0, c1, r1, false, false); + + // restore clipboard + clipboard->setMimeData(mimeData, QClipboard::Clipboard); + + TApp::instance()->getCurrentXsheet()->notifyXsheetChanged(); + } + + int getSize() const override { return sizeof(*this); } + + QString getHistoryString() override { return QObject::tr("Paste Numbers"); } + int getHistoryType() override { return HistoryType::Xsheet; } +}; + //----------------------------------------------------------------------------- // if at least one of the cell in the range, return false bool checkIfCellsHaveTheSameContent(const int &r0, const int &c0, const int &r1, @@ -1206,6 +1318,8 @@ void TCellSelection::enableCommands() { enableCommand(this, MI_Reframe4, &TCellSelection::reframe4Cells); enableCommand(this, MI_ReframeWithEmptyInbetweens, &TCellSelection::reframeWithEmptyInbetweens); + + enableCommand(this, MI_PasteNumbers, &TCellSelection::overwritePasteNumbers); } //----------------------------------------------------------------------------- // Used in RenameCellField::eventFilter() @@ -1223,7 +1337,7 @@ bool TCellSelection::isEnabledCommand( MI_PasteInto, MI_Cut, MI_Clear, MI_Insert, MI_Reframe1, MI_Reframe2, MI_Reframe3, MI_Reframe4, MI_ReframeWithEmptyInbetweens, - MI_Undo, MI_Redo}; + MI_Undo, MI_Redo, MI_PasteNumbers}; return commands.contains(commandId); } @@ -2074,6 +2188,75 @@ void TCellSelection::overWritePasteCells() { } //----------------------------------------------------------------------------- +// special paste command - overwrite paste cell numbers only + +void TCellSelection::overwritePasteNumbers() { + int r0, c0, r1, c1; + getSelectedCells(r0, c0, r1, c1); + + QClipboard *clipboard = QApplication::clipboard(); + const QMimeData *mimeData = clipboard->mimeData(); + + TXsheet *xsh = TApp::instance()->getCurrentXsheet()->getXsheet(); + if (const TCellData *cellData = dynamic_cast(mimeData)) { + if (isEmpty()) return; + + if (cellData->getCellCount() == 0) { + DVGui::error(QObject::tr("No data to paste.")); + return; + } + + int oldR0 = r0; + int oldC0 = c0; + int oldR1 = r1; + int oldC1 = c1; + + // Check if the copied cells are the same type as the target columns + if (!cellData->canChange(xsh, c0)) { + DVGui::error( + QObject::tr("It is not possible to paste the cells: " + "Some column is locked or column type is not match.")); + return; + } + + // Check Circular References + int i; + for (i = 0; i < cellData->getCellCount(); i++) { + if (!xsh->checkCircularReferences(cellData->getCell(i))) continue; + DVGui::error( + QObject::tr("It is not possible to paste the cells: there is a " + "circular reference.")); + return; + } + + // store celldata for undo + r1 = r0 + cellData->getRowCount() - 1; + if (cellData->getColCount() != 1 || c0 == c1) + c1 = c0 + cellData->getColCount() - 1; + TCellData *beforeData = new TCellData(); + beforeData->setCells(xsh, r0, c0, r1, c1); + + bool isPaste = pasteNumbersWithoutUndo(r0, c0, r1, c1); + + if (!isPaste) { + delete beforeData; + return; + } + + // r0,c0,r1,c1 : pasted region oldR0,oldC0,oldR1,oldC1 : selected area + // before pasting + TUndoManager::manager()->add(new OverwritePasteNumbersUndo( + r0, c0, r1, c1, oldR0, oldC0, oldR1, oldC1, beforeData)); + TApp::instance()->getCurrentScene()->setDirtyFlag(true); + + delete beforeData; + } else + DVGui::error(QObject::tr("Cannot paste data \n Nothing to paste")); + + TApp::instance()->getCurrentXsheet()->notifyXsheetChanged(); +} + +//----------------------------------------------------------------------------- // called from RenameCellField::RenameCell void TCellSelection::renameCells(TXshCell &cell) { diff --git a/toonz/sources/toonz/cellselection.h b/toonz/sources/toonz/cellselection.h index 10bffb1..1e26cfa 100644 --- a/toonz/sources/toonz/cellselection.h +++ b/toonz/sources/toonz/cellselection.h @@ -50,6 +50,8 @@ public: /*- セルの上書きペースト -*/ void overWritePasteCells(); + // paste cell numbers only + void overwritePasteNumbers(); //! \note: puo' anche essere r0>r1 o c0>c1 void selectCells(int r0, int c0, int r1, int c1); diff --git a/toonz/sources/toonz/main.cpp b/toonz/sources/toonz/main.cpp index a73a30b..bc28d1b 100644 --- a/toonz/sources/toonz/main.cpp +++ b/toonz/sources/toonz/main.cpp @@ -522,8 +522,8 @@ int main(int argc, char *argv[]) { loadShaderInterfaces(ToonzFolder::getLibraryFolder() + TFilePath("shaders")); - splash.showMessage(offsetStr + "Initializing OpenToonz ...", - Qt::AlignCenter, Qt::white); + splash.showMessage(offsetStr + "Initializing OpenToonz ...", Qt::AlignCenter, + Qt::white); a.processEvents(); TTool::setApplication(TApp::instance()); diff --git a/toonz/sources/toonz/mainwindow.cpp b/toonz/sources/toonz/mainwindow.cpp index a14fa28..b10db67 100644 --- a/toonz/sources/toonz/mainwindow.cpp +++ b/toonz/sources/toonz/mainwindow.cpp @@ -380,6 +380,8 @@ MainWindow::MainWindow(const QString &argumentLayoutFileName, QWidget *parent, m_toolsActionGroup->setExclusive(true); m_currentRoomsChoice = Preferences::instance()->getCurrentRoomChoice(); defineActions(); + // user defined shortcuts will be loaded here + CommandManager::instance()->loadShortcuts(); TApp::instance()->getCurrentScene()->setDirtyFlag(false); // La menuBar altro non è che una toolbar @@ -1869,6 +1871,7 @@ void MainWindow::defineActions() { ""); createRightClickMenuAction(MI_SetKeyframes, tr("&Set Key"), "Z"); + createRightClickMenuAction(MI_PasteNumbers, tr("&Paste Numbers"), ""); createToggle(MI_ViewCamera, tr("&Camera Box"), "", ViewCameraToggleAction ? 1 : 0, MenuViewCommandType); @@ -2357,9 +2360,9 @@ RecentFiles::~RecentFiles() {} void RecentFiles::addFilePath(QString path, FileType fileType) { QList files = - (fileType == Scene) ? m_recentScenes : (fileType == Level) - ? m_recentLevels - : m_recentFlipbookImages; + (fileType == Scene) + ? m_recentScenes + : (fileType == Level) ? m_recentLevels : m_recentFlipbookImages; int i; for (i = 0; i < files.size(); i++) if (files.at(i) == path) files.removeAt(i); @@ -2484,9 +2487,9 @@ void RecentFiles::saveRecentFiles() { QList RecentFiles::getFilesNameList(FileType fileType) { QList files = - (fileType == Scene) ? m_recentScenes : (fileType == Level) - ? m_recentLevels - : m_recentFlipbookImages; + (fileType == Scene) + ? m_recentScenes + : (fileType == Level) ? m_recentLevels : m_recentFlipbookImages; QList names; int i; for (i = 0; i < files.size(); i++) { @@ -2513,9 +2516,9 @@ void RecentFiles::refreshRecentFilesMenu(FileType fileType) { menu->setEnabled(false); else { CommandId clearActionId = - (fileType == Scene) ? MI_ClearRecentScene : (fileType == Level) - ? MI_ClearRecentLevel - : MI_ClearRecentImage; + (fileType == Scene) + ? MI_ClearRecentScene + : (fileType == Level) ? MI_ClearRecentLevel : MI_ClearRecentImage; menu->setActions(names); menu->addSeparator(); QAction *clearAction = CommandManager::instance()->getAction(clearActionId); diff --git a/toonz/sources/toonz/penciltestpopup.cpp b/toonz/sources/toonz/penciltestpopup.cpp index ceb0c9e..ee4180b 100644 --- a/toonz/sources/toonz/penciltestpopup.cpp +++ b/toonz/sources/toonz/penciltestpopup.cpp @@ -1777,7 +1777,10 @@ void PencilTestPopup::onImageCaptured(int id, const QImage& image) { m_cameraViewfinder->setPreviousImage(procImg); if (Preferences::instance()->isShowFrameNumberWithLettersEnabled()) { int f = m_frameNumberEdit->getValue(); - m_frameNumberEdit->setValue(((int)(f / 10) + 1) * 10); + if (f % 10 == 0) // next number + m_frameNumberEdit->setValue(((int)(f / 10) + 1) * 10); + else // next alphabet + m_frameNumberEdit->setValue(f + 1); } else m_frameNumberEdit->setValue(m_frameNumberEdit->getValue() + 1); diff --git a/toonz/sources/toonz/xshcellviewer.cpp b/toonz/sources/toonz/xshcellviewer.cpp index 152e2e7..18091ac 100644 --- a/toonz/sources/toonz/xshcellviewer.cpp +++ b/toonz/sources/toonz/xshcellviewer.cpp @@ -2685,7 +2685,14 @@ void CellArea::createCellMenu(QMenu &menu, bool isCellSelected) { menu.addAction(cmdManager->getAction(MI_Cut)); menu.addAction(cmdManager->getAction(MI_Copy)); menu.addAction(cmdManager->getAction(MI_Paste)); - menu.addAction(cmdManager->getAction(MI_PasteInto)); + + QMenu *pasteSpecialMenu = new QMenu(tr("Paste Special"), this); + { + pasteSpecialMenu->addAction(cmdManager->getAction(MI_PasteInto)); + pasteSpecialMenu->addAction(cmdManager->getAction(MI_PasteNumbers)); + } + menu.addMenu(pasteSpecialMenu); + menu.addAction(cmdManager->getAction(MI_Clear)); menu.addAction(cmdManager->getAction(MI_Insert)); menu.addSeparator(); diff --git a/toonz/sources/toonzlib/txshlevelcolumn.cpp b/toonz/sources/toonzlib/txshlevelcolumn.cpp index a6aeec2..47c012d 100644 --- a/toonz/sources/toonzlib/txshlevelcolumn.cpp +++ b/toonz/sources/toonzlib/txshlevelcolumn.cpp @@ -209,5 +209,103 @@ void TXshLevelColumn::saveData(TOStream &os) { } //----------------------------------------------------------------------------- +// Used in TCellData::getNumbers +bool TXshLevelColumn::setNumbers(int row, int rowCount, + const TXshCell cells[]) { + if (m_cells.empty()) return false; + // Check availability. + // - if source cells are all empty, do nothing + // - also, if source or target cells contain NO_FRAME, do nothing + bool isSrcAllEmpty = true; + for (int i = 0; i < rowCount; i++) { + // checking target cells + int currentTgtIndex = row + i - m_first; + if (currentTgtIndex < m_cells.size()) { + TXshCell tgtCell = m_cells[currentTgtIndex]; + if (!tgtCell.isEmpty() && tgtCell.m_frameId == TFrameId::NO_FRAME) + return false; + } + // checking source cells + TXshCell srcCell = cells[i]; + if (!srcCell.isEmpty()) { + if (srcCell.m_frameId == TFrameId::NO_FRAME) return false; + isSrcAllEmpty = false; + } + } + if (isSrcAllEmpty) return false; + + // Find a level to input. + // If the first target cell is empty, search the upper cells, and lower cells + // and use a level of firsty-found ocupied neighbor cell. + TXshLevelP currentLevel; + int tmpIndex = std::min(row - m_first, (int)m_cells.size() - 1); + // search upper cells + while (tmpIndex >= 0) { + TXshCell tmpCell = m_cells[tmpIndex]; + if (!tmpCell.isEmpty() && tmpCell.m_frameId != TFrameId::NO_FRAME) { + currentLevel = tmpCell.m_level; + break; + } + tmpIndex--; + } + // if not found any level in upper cells, then search the lower cells + if (!currentLevel) { + tmpIndex = std::max(row - m_first, 0); + while (tmpIndex < (int)m_cells.size()) { + TXshCell tmpCell = m_cells[tmpIndex]; + if (!tmpCell.isEmpty() && tmpCell.m_frameId != TFrameId::NO_FRAME) { + currentLevel = tmpCell.m_level; + break; + } + tmpIndex++; + } + // in the case any level for input could not be found + if (!currentLevel) return false; + } + + // Resize the cell container + int ra = row; + int rb = row + rowCount - 1; + int c_rb = m_first + m_cells.size() - 1; + if (row > c_rb) { + int newCellCount = row - m_first + rowCount; + m_cells.resize(newCellCount); + } else if (row < m_first) { + int delta = m_first - row; + m_cells.insert(m_cells.begin(), delta, TXshCell()); + m_first = row; + } + if (rb > c_rb) { + for (int i = 0; i < rb - c_rb; ++i) m_cells.push_back(TXshCell()); + } + + // Paste numbers. + for (int i = 0; i < rowCount; i++) { + int dstIndex = row - m_first + i; + TXshCell dstCell = m_cells[dstIndex]; + TXshCell srcCell = cells[i]; + if (srcCell.isEmpty()) { + m_cells[dstIndex] = TXshCell(); + } else { + if (!dstCell.isEmpty()) currentLevel = dstCell.m_level; + m_cells[dstIndex] = TXshCell(currentLevel, srcCell.m_frameId); + } + } + + // Update the cell container. + while (!m_cells.empty() && m_cells.back().isEmpty()) { + m_cells.pop_back(); + } + while (!m_cells.empty() && m_cells.front().isEmpty()) { + m_cells.erase(m_cells.begin()); + m_first++; + } + if (m_cells.empty()) { + m_first = 0; + } + return true; +} + +//----------------------------------------------------------------------------- PERSIST_IDENTIFIER(TXshLevelColumn, "levelColumn") diff --git a/toonz/sources/toonzqt/menubarcommand.cpp b/toonz/sources/toonzqt/menubarcommand.cpp index 723cfda..2ab4af3 100644 --- a/toonz/sources/toonzqt/menubarcommand.cpp +++ b/toonz/sources/toonzqt/menubarcommand.cpp @@ -5,6 +5,7 @@ #include "toonzqt/dvdialog.h" #include "toonzqt/gutil.h" #include "toonz/toonzfolders.h" +#include "tsystem.h" #include #include #include @@ -130,36 +131,12 @@ void CommandManager::define(CommandId id, CommandType type, m_qactionTable[qaction] = node; qaction->setShortcutContext(Qt::ApplicationShortcut); - - TFilePath fp = ToonzFolder::getModuleFile("shortcuts.ini"); - QSettings settings(toQString(fp), QSettings::IniFormat); - settings.beginGroup("shortcuts"); + // user defined shortcuts will be loaded afterwards in loadShortcuts() QString defaultShortcutQString = QString::fromStdString(defaultShortcutString); - /*- - Some shortcuts may just removed from the default settings. - So you need to distinguish between "shortcut is not defined by user" - and "shortcut is removed (i.e. defined as "") by user". - -*/ - QString shortcutString = settings.value(id, "undefined").toString(); - settings.endGroup(); - - if (shortcutString != "" && shortcutString != "undefined") { - // User-defined shortcuts. It may have been assigned as a shortcut by - // default to some other command - QAction *other = getActionFromShortcut(shortcutString.toStdString()); - if (other) other->setShortcut(QKeySequence()); - } else if (defaultShortcutQString != "" && shortcutString == "undefined") { - // Shortcut key set by default. Check if the key already been assigned to - // another action - QAction *other = - getActionFromShortcut(defaultShortcutQString.toStdString()); - if (!other) shortcutString = defaultShortcutQString; - } - - if (shortcutString != "" && shortcutString != "undefined") { - qaction->setShortcut(QKeySequence(shortcutString)); - m_shortcutTable[shortcutString.toStdString()] = node; + if (!defaultShortcutQString.isEmpty()) { + qaction->setShortcut(QKeySequence(defaultShortcutQString)); + m_shortcutTable[defaultShortcutString] = node; } if (type == ToolCommandType) updateToolTip(qaction); @@ -407,6 +384,44 @@ std::string CommandManager::getIdFromAction(QAction *action) { return ""; } +//--------------------------------------------------------- +// load user defined shortcuts + +void CommandManager::loadShortcuts() { + TFilePath fp = ToonzFolder::getMyModuleDir() + TFilePath("shortcuts.ini"); + if (!TFileStatus(fp).doesExist()) { + // if user shortcut file does not exist, then try to load from template + TFilePath tmplFp = + ToonzFolder::getTemplateModuleDir() + TFilePath("shortcuts.ini"); + if (TFileStatus(tmplFp).doesExist()) TSystem::copyFile(fp, tmplFp); + // if neither settings exist, do nothing and return + else + return; + } + + QSettings settings(toQString(fp), QSettings::IniFormat); + settings.beginGroup("shortcuts"); + QStringList ids = settings.allKeys(); + for (int i = 0; i < ids.size(); i++) { + std::string id = ids.at(i).toStdString(); + QString shortcut = settings.value(ids.at(i), "").toString(); + QAction *action = getAction(&id[0], false); + if (action) { + QString oldShortcut = action->shortcut().toString(); + if (oldShortcut == shortcut) continue; + if (!oldShortcut.isEmpty()) + m_shortcutTable.erase(oldShortcut.toStdString()); + if (!shortcut.isEmpty()) { + QAction *other = getActionFromShortcut(shortcut.toStdString()); + if (other) other->setShortcut(QKeySequence()); + m_shortcutTable[shortcut.toStdString()] = getNode(&id[0]); + } + action->setShortcut(QKeySequence(shortcut)); + } + } + settings.endGroup(); +} + /* //--------------------------------------------------------- diff --git a/toonz/sources/toonzqt/paletteviewergui.cpp b/toonz/sources/toonzqt/paletteviewergui.cpp index b2e01cf..b3f01c4 100644 --- a/toonz/sources/toonzqt/paletteviewergui.cpp +++ b/toonz/sources/toonzqt/paletteviewergui.cpp @@ -844,7 +844,9 @@ void PageViewer::paintEvent(QPaintEvent *e) { p.drawChord(ssRect, 0, -180 * 16); tmpFont.setPointSize(6); p.setFont(tmpFont); - p.drawText(ssRect.adjusted(0, 10, 0, 0), Qt::AlignCenter, + // make sure the text is visible with any font + static int rectTopAdjust = 19 - QFontMetrics(tmpFont).overlinePos(); + p.drawText(ssRect.adjusted(0, rectTopAdjust, 0, 0), Qt::AlignCenter, QString().setNum(shortcut)); } diff --git a/toonz/sources/translations/chinese/tnztools.ts b/toonz/sources/translations/chinese/tnztools.ts index 8af0f21..689d47a 100644 --- a/toonz/sources/translations/chinese/tnztools.ts +++ b/toonz/sources/translations/chinese/tnztools.ts @@ -1,6 +1,6 @@ - + ArrowToolOptionsBox @@ -142,6 +142,14 @@ Smooth: 平滑: + + Range: + 范围: + + + Snap + 吸附 + BrushToolOptionsBox @@ -846,11 +854,11 @@ Do you want to proceed? Deform Raster - 变形栅格图 + 变形光栅图 Transform Raster - 变换栅格图 + 变换光栅图 Set Save Box : (X%1,Y%2,W%3,H%4)->(X%5,Y%6,W%7,H%8) diff --git a/toonz/sources/translations/chinese/toonz.ts b/toonz/sources/translations/chinese/toonz.ts index 5a8d102..fd87abc 100644 --- a/toonz/sources/translations/chinese/toonz.ts +++ b/toonz/sources/translations/chinese/toonz.ts @@ -1,6 +1,6 @@ - + AddFilmstripFramesPopup @@ -141,6 +141,91 @@ Please select a different device or check the microphone. 麦克风不可用: 请选择不同的设备或者检查您的麦克风。 + + The microphone is not available: +Please select a different device or check the microphone. + 麦克风不可用: +请选择其他设备或者检查该麦克风。 + + + + AutoInputCellNumberPopup + + Auto Input Cell Number + 自动输入帧格编号 + + + Overwrite + 覆盖 + + + Insert + 插入 + + + Cancel + 取消 + + + Setting this value 0 will automatically +pick up all frames in the selected level. + 设置此值为0将自动选上 +所选中层级里的所有帧。 + + + From frame + 起始帧 + + + + from frame + + + + with + 加入 + + + frames increment + 增加的帧 + + + To frame + 结束帧 + + + + to frame + + + + inserting + 插入 + + + empty cell intervals + 空帧格的间隔 + + + cell steps + 帧格步长 + + + Repeat + 重复 + + + times + 次数 + + + No available cells or columns are selected. + 无有效帧格或者列被选中。 + + + Selected level has no frames between From and To. + 选中的层级在起始和终点之间没有帧。 + AutocenterPopup @@ -277,7 +362,7 @@ Stop it or wait for its completion before removing it. No raster frames selected - 未选择栅格帧 + 未选择光栅帧 Binarizing images @@ -638,7 +723,8 @@ when running the cleanup process. File "%1" already exists. What do you want to do? - 文件“%1”已经存在。您要怎么做? + 文件“%1”已经存在。 +您要怎么做? Cleanup all selected drawings overwriting those previously cleaned up.* @@ -806,6 +892,22 @@ What do you want to do? Field Guide 规格板 + + Bottom + + + + Top + + + + Left + + + + Right + + CleanupTab @@ -1244,6 +1346,26 @@ contain the dpi information, then the current camera dpi will be used. Dpi: DPI: + + When activated, styles of the default palette +($TOONZSTUDIOPALETTE\cleanup_default.tpl) will +be appended to the palette after conversion in +order to save the effort of creating styles +before color designing. + 当启用时,默认调色板的样式 +($TOONZSTUDIOPALETTE\cleanup_default.tpl) +将在转换后被打包到调色板中, +以便在开始颜色设计前保存样式调整效果。 + + + Specify the policy for setting DPI of converted tlv. +If you select the "Image DPI" option and the source image does not +contain the dpi information, then the current camera dpi will be used. + + 指定转换 TLV 的 DPI 设置策略。 +如果选择了“图像 DPI” 而源图像 +没包含 DPI 信息,则采用当前摄影机的 DPI。 + DVGui::ProgressDialog @@ -1954,6 +2076,13 @@ contain the dpi information, then the current camera dpi will be used. + FileViewerPopup + + Viewer + 查看器 + + + Filmstrip Level: @@ -2736,6 +2865,13 @@ Do you want to create it? + LoadScriptPopup + + Load script + 加载脚本 + + + LoadSettingsPopup Load Cleanup Settings @@ -3425,7 +3561,7 @@ Do you want to create it? &Visualize Vector As Raster - 以栅格显示矢量(&V) + 以光栅显示矢量(&V) &Histogram @@ -4249,7 +4385,7 @@ Do you want to create it? &Raster Bounding Box - 栅格边界框(&R) + 光栅边界框(&R) Link Flipbooks @@ -4625,19 +4761,19 @@ Do you want to create it? &New Toonz Raster Level - 新 Toonz 栅格层级(&N) + 新 Toonz 光栅层级(&N) New Toonz Raster Level - 新 Toonz 栅格层级 + 新 Toonz 光栅层级 &New Raster Level - 新栅格层级(&N) + 新光栅层级(&N) New Raster Level - 新栅格层级 + 新光栅层级 Alpha Channel @@ -4647,6 +4783,14 @@ Do you want to create it? &Command Bar 命令条(&C) + + Reframe with Empty Inbetweens... + 添加空中间画重排帧... + + + Auto Input Cell Number... + 自动输入帧格编号... + MatchlinesDialog @@ -4846,7 +4990,7 @@ What do you want to do? Rasterization DPI: - 栅格化 DPI: + 光栅化 DPI: Mesh Margin (pixels): @@ -5485,7 +5629,7 @@ Do you want to overwrite it? The selected image is not in a raster level. - 选中的图像不在栅格层级。 + 选中的图像不在光栅层级。 The selected image size does not match the current camera settings. @@ -5594,6 +5738,29 @@ WARNING : Image size mismatch. The size of level with the same path is %1 x %2.< WARNING : Image size mismatch. The saved image size is %1 x %2. 警告: 图像大小不匹配。保存的图像大小是 %1 x %2。 + + Color + 彩色 + + + Grayscale + 灰度 + + + Black & White + 黑白 + + + WARNING : Level name conflicts. There already is a level %1 in the scene with the path + %2. + 警告: 层级名字冲突。在下面路径的场景中已经有名为 %1 的层级 + %2。 + + + WARNING : Level path conflicts. There already is a level with the path %1 + in the scene with the name %2. + 警告: 层级路径冲突。在名为 %2 的场景中,已经有个层级位于路径 %1 上。 + PencilTestSaveInFolderPopup @@ -5635,11 +5802,11 @@ WARNING : Image size mismatch. The saved image size is %1 x %2. Episode + Sequence + Scene - 片段 + 序列 + 场景 + 片段 + 序列 + 场景 Project + Episode + Sequence + Scene - 项目 + 片段 + 序列 + 场景 + 项目 + 片段 + 序列 + 场景 Save In: @@ -5793,7 +5960,7 @@ WARNING : Image size mismatch. The saved image size is %1 x %2. Minimize Raster Memory Fragmentation* - 最小化栅格内存碎片* + 最小化光栅内存碎片* Save Automatically Every Minutes @@ -6033,11 +6200,11 @@ WARNING : Image size mismatch. The saved image size is %1 x %2. Toonz Raster Level - Toonz 栅格层级 + Toonz 光栅层级 Raster Level - 栅格层级 + 光栅层级 Autocreation: @@ -6113,7 +6280,7 @@ WARNING : Image size mismatch. The saved image size is %1 x %2. Minimize Raster Memory Fragmentation * - 最小化栅格内存碎片* + 最小化光栅内存碎片* Replace Level after SaveLevelAs command @@ -6137,7 +6304,7 @@ WARNING : Image size mismatch. The saved image size is %1 x %2. Show Raster Images Darken Blended in Camstand View - 在摄影机位视图中用“变暗”混合来显示栅格图像 + 在摄影机位视图中用“变暗”混合来显示光栅图像 Show "ABC" Appendix to the Frame Number in Xsheet Cell @@ -6269,7 +6436,7 @@ WARNING : Image size mismatch. The saved image size is %1 x %2. Palette Type on Loading Raster Image as Color Model - 将栅格图像加载为色彩模型的调色板类型 + 将光栅图像加载为色彩模型的调色板类型 Mouse Cursor @@ -6498,7 +6665,7 @@ Is it OK to release these shortcuts? Palette Type on Loading Raster Image as Color Model: - 加载栅格图像时把调色板类型当作颜色模型: + 加载光栅图像时把调色板类型当作颜色模型: Vector Snapping: @@ -6512,6 +6679,34 @@ Is it OK to release these shortcuts? Enable OpenToonz Commands' Shortcut Keys While Renaming Cell 重命名帧格时启用 OpenToonz 命令快捷键 + + Font *: + 字体 *: + + + Font Weight *: + 字体粗细 *: + + + Life is too short for Comic Sans + + + + Good luck. You're on your own from here. + + + + Arrow Markers + 箭头标记 + + + Animated Guide + 动态指引 + + + Vector Guided Style: + 矢量绘制指引样式: + PreferencesPopup::FormatProperties @@ -7380,7 +7575,7 @@ Some levels have not been loaded because their version is not supported Match lines can be deleted from Toonz raster levels only - 适配线只能在 Toonz 栅格层级中删除 + 适配线只能在 Toonz 光栅层级中删除 Partially Edited @@ -7448,7 +7643,7 @@ Some levels have not been loaded because their version is not supported Match lines can be applied to Toonz raster levels only. - 适配线仅能应用到 Toonz 栅格层级。 + 适配线仅能应用到 Toonz 光栅层级。 The style index you specified is not available in the palette of the destination level. @@ -7472,7 +7667,7 @@ Some levels have not been loaded because their version is not supported Only raster levels can be merged to a raster level. - 只有栅格层级能被合并到栅格层级。 + 只有光栅层级能被合并到光栅层级。 Only vector levels can be merged to a vector level. @@ -7480,7 +7675,7 @@ Some levels have not been loaded because their version is not supported It is possible to merge only Toonz vector levels or standard raster levels. - 只能合并 Toonz 矢量层级或标准栅格层级。 + 只能合并 Toonz 矢量层级或标准光栅层级。 It is not possible to display the file %1: no player associated with its format @@ -7990,7 +8185,7 @@ Are you sure to Paste (Raster) - 粘贴(栅格) + 粘贴(光栅) Overwrite Paste Cells @@ -8048,7 +8243,7 @@ Are you sure to Merge Raster Levels - 合并栅格层级 + 合并光栅层级 Delete Matchline : Level %1 @@ -8133,7 +8328,8 @@ Are you sure to %1: the current scene has been modified. What would you like to do? - %1: 当前场景已经被修改。您要怎么做? + %1: 当前场景已经被修改。 +您要怎么做? Save All @@ -8158,7 +8354,8 @@ What would you like to do? What would you like to do? - 您要怎么做? + +您要怎么做? Save Changes @@ -8227,6 +8424,75 @@ Are you sure? Command Bar 命令条 + + Stage Schematic + 舞台示意图 + + + Fx Schematic + 特效示意图 + + + Auto Input Cell Numbers : %1 + 自动输入帧格编号: %1 + + + Insert + 插入 + + + Cannot paste data + Nothing to paste + 不能粘贴数据 +无内容可粘贴 + + + Reframe to %1's with %2 blanks + 用 %2 空白重排帧到 %1's + + + File not found + 文件没找到 + + + Don't Save + 不保存 + + + + ReframePopup + + Reframe with Empty Inbetweens + 添加空的中间画重排帧 + + + OK + 确定 + + + Cancel + 取消 + + + steps + 步长 + + + with + 加入 + + + empty inbetweens + 张空的中间画 + + + ( + + + + blank cells will be inserted.) + 张空白帧格将被插入。) + RenameAsToonzPopup @@ -9489,6 +9755,26 @@ Please commit or revert changes first. Select Column 选择列 + + Vector Guided Drawing + 矢量引导绘图 + + + Off + 关闭 + + + Closest Drawing + 最靠近的笔画 + + + Farthest Drawing + 最远端的笔画 + + + All Drawings + 全部笔画 + SceneViewerPanel @@ -10003,6 +10289,78 @@ Possibly the preset file has been corrupted The height must be greater than zero. 高度必须大于零。 + + '%1' doesn't seem to be a well formed camera preset. +Possibly the preset file has been corrupted + '%1' 不是格式完好的摄影机预设, +可能该预设文件已经被损坏了。 + + + + StudioPaletteTreeViewer + + This folder is not empty. Delete anyway? + 文件夹不是空的,还要删除马? + + + New Palette + 新建调色板 + + + New Folder + 新建文件夹 + + + New Cleanup Palette + 新建清稿调色板 + + + Delete Folder + 删除文件夹 + + + Load into Current Cleaunp Palette + 加载到当前清稿调色板中 + + + Replace with Current Cleaunp Palette + 用当前清稿调色板替换 + + + Load into Current Palette + 加载到当前调色板中 + + + Merge to Current Palette + 合并到当前调色板上 + + + Replace with Current Palette + 用当前调色板替换 + + + Delete Palette + 删除调色板 + + + Search for Palettes + 搜索调色板 + + + + StudioPaletteViewer + + &New Folder + 新建文件夹(&N) + + + &New Palette + 新建调色板(&N) + + + &Delete + 删除(&D) + SubSheetBar @@ -10471,7 +10829,7 @@ Click the arrow button to create a new sub-xsheet Raster Levels - 栅格层级 + 光栅层级 Toggle Swatch Preview @@ -10894,11 +11252,11 @@ Please refer to the user guide for details. New Toonz Raster Level - 新Toonz栅格层级 + 新Toonz光栅层级 New Raster Level - 新栅格层级 + 新光栅层级 diff --git a/toonz/sources/translations/chinese/toonzlib.ts b/toonz/sources/translations/chinese/toonzlib.ts index 2da868c..98feb12 100644 --- a/toonz/sources/translations/chinese/toonzlib.ts +++ b/toonz/sources/translations/chinese/toonzlib.ts @@ -1,6 +1,176 @@ - + + + CenterlineVectorizer + + Can't vectorize a %1 level + 无法矢量化层级 %1 + + + Can't vectorize a level with no frames + 无法矢量化没有帧的层级 + + + Can't vectorize a %1 image + 无法矢量化图像 %1 + + + Bad argument (%1): should be an Image or a Level + 不正确的参数(%1): 应该是图像或者层级 + + + + FilePath + + "%1" + "%1" + + + can't concatenate an absolute path : %1 + 无法连接绝对路径: %1 + + + %1 is not a directory + %1 不是目录 + + + can't read directory %1 + 无法读取目录 %1 + + + + Image + + File %1 doesn't exist + 文件 %1 不存在 + + + Loaded first frame of %1 + %1 的第一帧已经加载 + + + Unexpected error while reading image + 读取图像时发生了意想不到的错误 + + + Unrecognized file type : + 未识别的文件类型: + + + Can't save a %1 image to this file type : %2 + 无法将图像 %1 保存为该文件类型: %2 + + + Unexpected error while writing image + 写入图像时发生了意想不到的错误 + + + + ImageBuilder + + Bad argument (%1): should be 'Raster' or ToonzRaster' + 不正确的参数(%1): 应当是“光栅”或者“Toonz 光栅” + + + ImageBuilder(%1 image) + 图像生成器(%1 图像) + + + %1 : %2 + %1 : %2 + + + Bad argument (%1): should be a Transformation + 不正确的参数(%1): 应当是几何变换 + + + + Level + + %1 frames + %1 帧 + + + Bad argument (%1). It should be FilePath or string + 不正确的参数(%1): 应当是文件路径或者字符串 + + + Exception loading level (%1) + 加载层级时的异常(%1) + + + File %1 doesn't exist + 文件 %1 不存在 + + + File %1 is unsupported + 文件 %1 是不支持的 + + + Exception reading %1 + 读取 %1 时的异常 + + + Can't save an empty level + 无法保存空层级 + + + Unrecognized file type : + 未识别的文件类型: + + + Can't save a %1 level to this file type : %2 + 不能保存层级 %1 为此文件类型:%2 + + + Exception writing %1 + 写入 %1 时的异常 + + + frame index (%1) must be a number + 帧索引(%1)必须是个数字 + + + frame index (%1) is out of range (0-%2) + 帧索引(%1)超出范围(0-%2) + + + second argument (%1) is not an image + 第二个参数(%1)不是图像 + + + can not insert a %1 image into a level + 无法插入图像 %1 到层级中 + + + can not insert a %1 image to a %2 level + 无法插入图像 %1 到层级 %2 中 + + + + OutlineVectorizer + + Can't vectorize a %1 level + 无法矢量化层级 %1 + + + Can't vectorize a level with no frames + 无法矢量化没有帧的层级 + + + Can't vectorize a %1 image + 无法矢量化图像 %1 + + + Bad argument (%1): should be an Image or a Level + 不正确的参数(%1): 应该是图像或者层级 + + + Invalid color : + 无效的颜色: + + Preferences @@ -380,6 +550,92 @@ DarkMagenta 暗红 + + Brightness + 亮度 + + + Contrast + 对比度 + + + ColorThres + 彩色阀值 + + + WhiteThres + 白色阀值 + + + HRange + + + + Line Width + 线条宽度 + + + + Rasterizer + + Expected a vector image: %1 + 预期的矢量图像: %1 + + + Expected a vector level: %1 + 预期的矢量层级: %1 + + + Argument must be a vector level or image : + 参数必须是矢量层级或图像: + + + %1 has no palette + %1 没有调色板 + + + + Scene + + File %1 doesn't exist + 文件 %1 不存在 + + + Exception reading %1 + 读取 %1 时的异常 + + + Exception writing %1 + 写入 %1 时的异常 + + + Bad level type (%1): must be Vector,Raster or ToonzRaster + 不正确的层级类型(%1): 必须是矢量、光栅或者 Toonz 光栅 + + + Can't add the level: name(%1) is already used + 无法添加层级: 名称(%1)已被使用 + + + Can't load this kind of file as a level : %1 + 无法加载此类文件作为层级: %1 + + + Could not load level %1 + 无法加载层级 %1 + + + Level is not included in the scene : %1 + 层级未包含在此场景: %1 + + + %1 : Expected a Level instance or a level name + %1: 预期的层级矢量或者层级名 + + + Level '%1' is not included in the scene + 层级 '%1' 没有在这个场景中 + TScriptBinding::CenterlineVectorizer @@ -450,7 +706,7 @@ TScriptBinding::ImageBuilder Bad argument (%1): should be 'Raster' or ToonzRaster' - 不正确的参数(%1): 应当是“栅格”或者“Toonz 栅格” + 不正确的参数(%1): 应当是“光栅”或者“Toonz 光栅” ImageBuilder(%1 image) @@ -586,7 +842,7 @@ Bad level type (%1): must be Vector,Raster or ToonzRaster - 不正确的层级类型(%1): 必须是矢量、栅格或者 Toonz 栅格 + 不正确的层级类型(%1): 必须是矢量、光栅或者 Toonz 光栅 Can't add the level: name(%1) is already used @@ -629,7 +885,7 @@ Bad argument (%1): should be a raster Level or a raster Image - 不正确的参数(%1): 应当是栅格层级或者栅格图像 + 不正确的参数(%1): 应当是光栅层级或者光栅图像 @@ -659,4 +915,50 @@ 几何变换(%1, %2, %3; %4, %5, %6) + + ToonzRasterConverter + + Can't convert a %1 level + 无法转换层级 %1 + + + Can't convert a level with no frames + 无法转换没有帧的层级 + + + Can't convert a %1 image + 无法转换图像 %1 + + + Bad argument (%1): should be a raster Level or a raster Image + 不正确的参数(%1): 应当是光栅层级或者光栅图像 + + + + Transform + + Identity + 标识 + + + Translation(%1,%2) + 移动(%1,%2) + + + Rotation(%1) + 旋转(%1) + + + Scale(%1%) + 缩放(%1%) + + + Scale(%1%, %2%) + 缩放(%1%, %2%) + + + Transform(%1, %2, %3; %4, %5, %6) + 几何变换(%1, %2, %3; %4, %5, %6) + + diff --git a/toonz/sources/translations/chinese/toonzqt.ts b/toonz/sources/translations/chinese/toonzqt.ts index 7fa84d2..6e5e96a 100644 --- a/toonz/sources/translations/chinese/toonzqt.ts +++ b/toonz/sources/translations/chinese/toonzqt.ts @@ -1,6 +1,6 @@ - + AddFxContextMenu @@ -165,6 +165,12 @@ Possibly the preset file has been corrupted “%1”不像是正确格式的摄影机预设。 预设文件可能已经损坏了 + + '%1' doesn't seem a well formed camera preset. +Possibly the preset file has been corrupted + %1' 不是格式完好的摄影机预设。 +可能预设文件已经被损坏了 + ChannelHisto @@ -231,6 +237,45 @@ Possibly the preset file has been corrupted Resulting Level Info 结果层级信息 + + N/S + 上下 + + + E/W + 左右 + + + + ColorChannelControl + + R + + + + G + + + + B + + + + A + + + + H + + + + S + + + + V + + ColumnPainter @@ -855,6 +900,18 @@ Possibly the preset file has been corrupted ???? ???? + + From + 起点 + + + To + 终点 + + + Step + 步长 + FunctionSelection @@ -1260,6 +1317,14 @@ Select FX nodes and related links before copying or cutting the selection you wa New Page 新建页 + + - No Styles - + - 无样式 - + + + Name Editor + 名字编辑器 + PaletteViewer @@ -1448,6 +1513,25 @@ Select FX nodes and related links before copying or cutting the selection you wa + PlainColorPage + + Wheel + 色轮 + + + HSV + HSV + + + Alpha + Alpha + + + RGB + RGB + + + PointParamField Y: @@ -1464,6 +1548,10 @@ Select FX nodes and related links before copying or cutting the selection you wa Toonz OpenToonz + + OpenToonz + OpenToonz + QObject @@ -1917,7 +2005,7 @@ Are you sure? Deletion of Lines and Areas from raster-based levels is not undoable. Are you sure? - 从栅格格式的层级删除线和区域,该操作将无法撤销。 + 从光栅层级删除线和区域,该操作将无法撤销。 您确定吗? @@ -1954,6 +2042,10 @@ Are you sure? Toonz Toonz + + OpenToonz + OpenToonz + SchematicViewer @@ -2010,6 +2102,13 @@ Are you sure? + SettingsPage + + Reset to default + 重新初始化 + + + SimilarShapeSegmentPage Reference Curve: @@ -2210,7 +2309,7 @@ Are you sure? Vector Brush - 矢量画笔 + 矢量笔刷 Settings @@ -2226,6 +2325,32 @@ Apply MyPaint Brush MyPaint 笔刷 + + Auto +Apply + 自动 +应用 + + + - Style not Selected - + - 无样式被选中 - + + + [CLEANUP] + [清稿] + + + [STUDIO] + [工作室] + + + [LEVEL] + [层级] + + + - Style is Not Valid - + - 无效的样式 - + StyleEditorGUI::PlainColorPage @@ -2317,6 +2442,10 @@ Apply &Reset Center 重置中心点(&R) + + Table + 动画台 + ToneCurveField