diff --git a/src/mumble/CustomElements.cpp b/src/mumble/CustomElements.cpp index 2fe2474f62..11b9e65a44 100644 --- a/src/mumble/CustomElements.cpp +++ b/src/mumble/CustomElements.cpp @@ -18,24 +18,186 @@ #include #include #include +#include +#include +#include #include LogTextBrowser::LogTextBrowser(QWidget *p) : QTextBrowser(p) { } -int LogTextBrowser::getLogScroll() { +void LogTextBrowser::update() { + document()->documentLayout()->update(QRect(getScrollX(), getScrollY(), width(), height())); +} + +int LogTextBrowser::getScrollX() { + return horizontalScrollBar()->value(); +} + +int LogTextBrowser::getScrollY() { return verticalScrollBar()->value(); } -void LogTextBrowser::setLogScroll(int scroll_pos) { +void LogTextBrowser::setScrollX(int scroll_pos) { + horizontalScrollBar()->setValue(scroll_pos); +} + +void LogTextBrowser::setScrollY(int scroll_pos) { verticalScrollBar()->setValue(scroll_pos); } +void LogTextBrowser::changeScrollX(int change) { + QScrollBar *scrollBar = horizontalScrollBar(); + scrollBar->setValue(scrollBar->value() + change); +} + +void LogTextBrowser::changeScrollY(int change) { + QScrollBar *scrollBar = verticalScrollBar(); + scrollBar->setValue(scrollBar->value() + change); +} + +void LogTextBrowser::scrollItemIntoView(QRect rect) { + QRect logRect(getScrollX(), getScrollY(), width(), height()); + int rectXWithWidth = rect.x() + rect.width(); + int logRectXWithWidth = logRect.x() + logRect.width(); + int rectYWithHeight = rect.y() + rect.height(); + int logRectYWithHeight = logRect.y() + logRect.height(); + + bool isItemToTheRight = rectXWithWidth > logRectXWithWidth; + bool isItemToTheLeft = rect.x() < logRect.x(); + bool isItemBelow = rectYWithHeight > logRectYWithHeight; + bool isItemAbove = rect.y() < logRect.y(); + bool isItemAtAllInView = rect.x() < logRectXWithWidth && rectXWithWidth > logRect.x() + && rect.y() < logRectYWithHeight && rectYWithHeight > logRect.y(); + + int offset = 20; + bool isWithinWidth = rect.width() <= logRect.width() - offset; + bool isWithinHeight = rect.height() <= logRect.height() - offset; + // Scroll to the item if it fits the log window and is at all out of view. Otherwise only + // scroll to the item if it is entirely out of view. Both ways scroll just far enough, with the set offset as + // margin, to show the item at the bottom or top of the log window if the previous position was above or below the + // item respectively. If the item does not fit the log window then scroll as far as the start or end of the item is + // still in view if the previous position was entirely above or below the item respectively. The same principles + // apply horizontally, where below is to the right and above is to the left: + if ((isWithinWidth && (isItemToTheRight || isItemToTheLeft)) || !isItemAtAllInView) { + setScrollX((isWithinWidth && isItemToTheRight) || (!isWithinWidth && isItemToTheLeft) + ? rectXWithWidth - logRect.width() + offset + : rect.x() - offset); + } + if ((isWithinHeight && (isItemBelow || isItemAbove)) || !isItemAtAllInView) { + setScrollY((isWithinHeight && isItemBelow) || (!isWithinHeight && isItemAbove) + ? rectYWithHeight - logRect.height() + offset + : rect.y() - offset); + } + if (getScrollX() == logRect.x() && getScrollY() == logRect.y()) { + update(); + } +} + bool LogTextBrowser::isScrolledToBottom() { const QScrollBar *scrollBar = verticalScrollBar(); return scrollBar->value() == scrollBar->maximum(); } +void LogTextBrowser::mousePressEvent(QMouseEvent *qme) { + QPoint mouseDocPos = qme->pos(); + Qt::MouseButton mouseButton = qme->button(); + QAbstractTextDocumentLayout *docLayout = document()->documentLayout(); + // Set the vertical axis of the position to include the scrollable area above it: + mouseDocPos.setY(mouseDocPos.y() + getScrollY()); + + AnimationTextObject::mousePress(docLayout, mouseDocPos, mouseButton); +} + +void LogTextBrowser::keyPressEvent(QKeyEvent *qke) { + Qt::Key key = static_cast< Qt::Key >(qke->key()); + Qt::KeyboardModifiers modifiers = QApplication::keyboardModifiers(); + int logWindowHeight = height(); + int logInternalHeight = verticalScrollBar()->maximum(); + + int lastItemIndex = lastCustomInteractiveItemIndex; + int itemFocusIndex = customInteractiveItemFocusIndex; + int scrollStep = 15; + if (modifiers.testFlag(Qt::ControlModifier)) { + switch (key) { + case Qt::Key_A: + return selectAll(); + case Qt::Key_C: + return copy(); + case Qt::Key_0: + return queuedNumericInput.push_back('0'); + case Qt::Key_1: + return queuedNumericInput.push_back('1'); + case Qt::Key_2: + return queuedNumericInput.push_back('2'); + case Qt::Key_3: + return queuedNumericInput.push_back('3'); + case Qt::Key_4: + return queuedNumericInput.push_back('4'); + case Qt::Key_5: + return queuedNumericInput.push_back('5'); + case Qt::Key_6: + return queuedNumericInput.push_back('6'); + case Qt::Key_7: + return queuedNumericInput.push_back('7'); + case Qt::Key_8: + return queuedNumericInput.push_back('8'); + case Qt::Key_9: + return queuedNumericInput.push_back('9'); + default: + break; + } + } + switch (key) { + case Qt::Key_Down: + return changeScrollY(scrollStep); + case Qt::Key_Up: + return changeScrollY(-scrollStep); + case Qt::Key_Right: + return changeScrollX(15); + case Qt::Key_Left: + return changeScrollX(-15); + case Qt::Key_PageDown: + return changeScrollY(logWindowHeight); + case Qt::Key_PageUp: + return changeScrollY(-logWindowHeight); + case Qt::Key_Home: + return setScrollY(0); + case Qt::Key_End: + return setScrollY(logInternalHeight); + case Qt::Key_Return: + case Qt::Key_Enter: + customInteractiveItemFocusIndex += itemFocusIndex == lastItemIndex ? -lastItemIndex : 1; + break; + case Qt::Key_Backspace: + customInteractiveItemFocusIndex += itemFocusIndex < 1 ? lastItemIndex + (itemFocusIndex == -1 ? 1 : 0) : -1; + break; + case Qt::Key_Escape: + customInteractiveItemFocusIndex = -1; + return update(); + default: + break; + } + bool isItemSelectionChanged = customInteractiveItemFocusIndex != itemFocusIndex; + + AnimationTextObject::keyPress(this, isItemSelectionChanged, key); +} + +void LogTextBrowser::keyReleaseEvent(QKeyEvent *qke) { + Qt::Key key = static_cast< Qt::Key >(qke->key()); + if (queuedNumericInput.length() > 0 && key == Qt::Key_Control) { + int lastItemIndex = lastCustomInteractiveItemIndex; + int itemFocusIndex = queuedNumericInput.toInt(); + bool isItemFocusIndexTooHigh = itemFocusIndex > lastItemIndex; + + customInteractiveItemFocusIndex = isItemFocusIndexTooHigh ? -1 : itemFocusIndex; + queuedNumericInput.clear(); + if (isItemFocusIndexTooHigh) { + return update(); + } + AnimationTextObject::keyPress(this, true, key); + } +} void ChatbarTextEdit::focusInEvent(QFocusEvent *qfe) { inFocus(true); @@ -201,7 +363,7 @@ bool ChatbarTextEdit::sendImagesFromMimeData(const QMimeData *source) { if (image.isNull()) continue; - if (emitPastedImage(image)) { + if (emitPastedImage(image, path)) { ++count; } else { Global::get().l->log(Log::Information, tr("Unable to send image %1: too large.").arg(path)); @@ -217,7 +379,20 @@ bool ChatbarTextEdit::sendImagesFromMimeData(const QMimeData *source) { return false; } -bool ChatbarTextEdit::emitPastedImage(QImage image) { +bool ChatbarTextEdit::emitPastedImage(QImage image, QString filePath) { + if (filePath.endsWith(".gif")) { + QFile file(filePath); + if (file.open(QIODevice::ReadOnly)) { + QByteArray animationBa(file.readAll()); + file.close(); + QString base64ImageData = qvariant_cast< QString >(animationBa.toBase64()); + emit pastedImage("
"); + } else { + Global::get().l->log(Log::Information, tr("Unable to read animated image file: %1").arg(filePath)); + } + return true; + } + QString processedImage = Log::imageToImg(image, static_cast< int >(Global::get().uiImageLength)); if (processedImage.length() > 0) { QString imgHtml = QLatin1String("
") + processedImage; @@ -227,6 +402,761 @@ bool ChatbarTextEdit::emitPastedImage(QImage image) { return false; } + +bool AnimationTextObject::areVideoControlsOn = false; + +QString AnimationTextObject::loopModeToString(LoopMode mode) { + switch (mode) { + case Unchanged: + return "Unchanged"; + case Loop: + return "Loop"; + case NoLoop: + return "No loop"; + default: + return "Undefined"; + } +} + +void AnimationTextObject::updateVideoControls(QObject *propertyHolder) { + QRect rect = propertyHolder->property("posAndSize").toRect(); + int videoControlsHeight = videoBarHeight + underVideoBarHeight; + int videoControlsY = rect.y() + rect.height() - videoControlsHeight; + QRect videoControlsRect(rect.x(), videoControlsY, rect.width(), videoControlsHeight); + + emit Global::get().mw->qteLog->document()->documentLayout()->update(videoControlsRect); +} + +void AnimationTextObject::setFrame(QMovie *animation, int frameIndex) { + int lastFrameIndex = animation->property("lastFrameIndex").toInt(); + bool isFrameIndexTooLow = frameIndex < 0; + bool isFrameIndexTooHigh = frameIndex > lastFrameIndex; + if (isFrameIndexTooLow || isFrameIndexTooHigh) { + frameIndex = isFrameIndexTooLow ? 0 : lastFrameIndex; + } + if (animation->cacheMode() == QMovie::CacheAll) { + animation->jumpToFrame(frameIndex); + return; + } + + bool wasRunning = animation->state() == QMovie::Running; + if (!wasRunning) { + animation->setPaused(false); + } + bool isStartTried = false; + // Can only load the target frame by traversing + // in sequential order when the frames are not cached: + while (animation->currentFrameNumber() != frameIndex) { + if (!animation->jumpToNextFrame()) { + // Continue traversing animations that either are stopped or do stop after one or more iterations: + if (animation->state() == QMovie::NotRunning && !isStartTried) { + animation->start(); + isStartTried = true; + continue; + } + break; + } + } + if (!wasRunning) { + animation->setPaused(true); + } +} + +void AnimationTextObject::setFrameByProportion(QMovie *animation, double proportion) { + int msPassedAtProportion = (int) round(proportion * getTotalTime(animation)); + setFrameByTime(animation, msPassedAtProportion); +} + +void AnimationTextObject::setFrameByTime(QMovie *animation, int milliseconds) { + int totalMs = getTotalTime(animation); + bool isTimeAfterEnd = milliseconds > totalMs; + bool isTimeBeforeStart = milliseconds < 0; + if (isTimeAfterEnd || isTimeBeforeStart) { + milliseconds = isTimeAfterEnd ? totalMs : 0; + } + QList< QVariant > frameDelays = animation->property("frameDelays").toList(); + qsizetype frameDelayAmount = frameDelays.length(); + int msUntilCurrentFrame = 0; + + int frameIndex = 0; + for (int i = 0; i < frameDelayAmount; ++i) { + int delay = frameDelays[i].toInt(); + msUntilCurrentFrame += delay; + if (milliseconds <= msUntilCurrentFrame) { + bool isNextFrame = i + 1 < frameDelayAmount; + int currentFrameDifference = msUntilCurrentFrame - milliseconds; + int previousFrameDifference = currentFrameDifference - delay; + int nextFrameDifference = + isNextFrame ? msUntilCurrentFrame + frameDelays[i + 1].toInt() - milliseconds : -1; + + bool isPreviousFrameCloser = abs(previousFrameDifference) < currentFrameDifference; + bool isNextFrameCloser = isNextFrame ? abs(nextFrameDifference) < currentFrameDifference : false; + // The first delay has passed by the second frame and so on, + // hence the index is greater by 1 for the frame of the full delay: + frameIndex = i + 1 + (isPreviousFrameCloser ? -1 : isNextFrameCloser ? 1 : 0); + break; + } + } + setFrame(animation, frameIndex); +} + +void AnimationTextObject::togglePause(QMovie *animation) { + int lastFrameIndex = animation->property("lastFrameIndex").toInt(); + QMovie::MovieState state = animation->state(); + bool wasStoppedOrNeverStarted = state == QMovie::NotRunning; + if (animation->speed() < 0) { + int frameIndex = animation->currentFrameNumber(); + int frameIndexToSwitchTo = wasStoppedOrNeverStarted && frameIndex == 0 ? lastFrameIndex : frameIndex; + if (wasStoppedOrNeverStarted) { + animation->start(); + animation->setPaused(true); + setFrame(animation, frameIndexToSwitchTo); + } + bool wasPlayingInReverse = animation->property("isPlayingInReverse").toBool(); + animation->setProperty("isPlayingInReverse", !wasPlayingInReverse); + if (wasPlayingInReverse) { + emit animation->stateChanged(state); + } else { + emit animation->frameChanged(frameIndexToSwitchTo); + } + } else if (wasStoppedOrNeverStarted) { + animation->start(); + // Ensure the animation starts on the first attempt to do so: + animation->setPaused(false); + } else { + animation->setPaused(state != QMovie::Paused); + } +} + +void AnimationTextObject::toggleCache(QMovie *animation) { + int lastFrameIndex = animation->property("lastFrameIndex").toInt(); + bool wasCached = animation->cacheMode() == QMovie::CacheAll; + QMovie::CacheMode cacheModeToSet = wasCached ? QMovie::CacheNone : QMovie::CacheAll; + QMovie::MovieState state = animation->state(); + bool wasPaused = state == QMovie::Paused; + bool wasRunning = state == QMovie::Running; + + int previousFrame = animation->currentFrameNumber(); + // Turning caching on or off requires reloading the animation, which is done via `setDevice`, + // otherwise it will not play properly or dispose of the cache when it is not to be used: + animation->stop(); + QIODevice *device = animation->device(); + // Prepare the animation to be loaded when starting for the first time: + device->reset(); + animation->setDevice(device); + animation->setCacheMode(cacheModeToSet); + animation->start(); + + // Restore the state of the animation playback to what it was before reloading it + // but ensure it can be resumed when caching is off by pausing it if it is not at the start or end: + setFrame(animation, previousFrame); + if (wasPaused || (!wasRunning && previousFrame != 0 && previousFrame != lastFrameIndex)) { + animation->setPaused(true); + } else if (!wasRunning) { + animation->stop(); + } + updateVideoControls(animation); +} + +void AnimationTextObject::stopPlayback(QMovie *animation) { + animation->stop(); + animation->setProperty("isPlayingInReverse", false); +} + +void AnimationTextObject::resetPlayback(QMovie *animation) { + // Show the first frame that the animation would continue from if started again + // without caching anyway, indicating that the animation was stopped instead of paused: + setFrame(animation, 0); + stopPlayback(animation); +} + +void AnimationTextObject::setSpeed(QMovie *animation, int percentage) { + // Pausing the animation should only be done via the play state to avoid confusion: + if (percentage == 0) { + return; + } + animation->setSpeed(percentage); + updateVideoControls(animation); + // `QMovie` does not itself support reverse playback but this can be and is implemented using it: + bool wasPlayingInReverse = animation->property("isPlayingInReverse").toBool(); + bool wasRunning = animation->state() == QMovie::Running || wasPlayingInReverse; + if (percentage < 0) { + if (wasPlayingInReverse) { + return; + } + animation->setPaused(true); + animation->setProperty("isPlayingInReverse", wasRunning); + if (wasRunning) { + // Trigger the signal `frameChanged` where the handler also supports reverse playback: + emit animation->frameChanged(animation->currentFrameNumber()); + } + } else if (wasPlayingInReverse) { + animation->setProperty("isPlayingInReverse", false); + animation->setPaused(!wasRunning); + } +} + +void AnimationTextObject::changeLoopMode(QMovie *animation, int steps) { + LoopMode loopMode = qvariant_cast< LoopMode >(animation->property("LoopMode")); + int loopModeChangedTo = loopMode + steps; + int loopModeResult = + loopModeChangedTo > NoLoop ? 0 : loopModeChangedTo < 0 ? static_cast< int >(NoLoop) : loopModeChangedTo; + animation->setProperty("LoopMode", static_cast< LoopMode >(loopModeResult)); + updateVideoControls(animation); +} + +void AnimationTextObject::changeFrame(QMovie *animation, int amount) { + int lastFrameIndex = animation->property("lastFrameIndex").toInt(); + int frameIndex = animation->currentFrameNumber() + amount; + int amountOfTimesGreater = (int) abs(floor(frameIndex / (double) lastFrameIndex)); + + int lastFrameIndexScaledToInput = lastFrameIndex * amountOfTimesGreater; + int frameIndexWrappedBackward = lastFrameIndexScaledToInput + 1 + frameIndex; + int frameIndexWrappedForward = frameIndex - 1 - lastFrameIndexScaledToInput; + setFrame(animation, frameIndex < 0 ? frameIndexWrappedBackward + : frameIndex > lastFrameIndex ? frameIndexWrappedForward : frameIndex); +} + +void AnimationTextObject::changeFrameByTime(QMovie *animation, int milliseconds) { + setFrameByTime(animation, getCurrentTime(animation, animation->currentFrameNumber()) + milliseconds); +} + +void AnimationTextObject::changeSpeed(QMovie *animation, int percentageStep) { + int speed = animation->speed(); + int nextPercentage = speed + percentageStep; + setSpeed(animation, speed + percentageStep * (nextPercentage != 0 ? 1 : 2)); +} + +int AnimationTextObject::getTotalTime(QObject *propertyHolder) { + return propertyHolder->property("totalMs").toInt(); +} + +int AnimationTextObject::getCurrentTime(QObject *propertyHolder, int frameIndex) { + int lastFrameIndex = propertyHolder->property("lastFrameIndex").toInt(); + QList< QVariant > frameDelays = propertyHolder->property("frameDelays").toList(); + int msUntilCurrentFrame = 0; + // Determine the time until the current frame or the time until the end of the last frame + // if on the last frame, so as to show a clear time for the start and end: + for (int i = 0; i < (frameIndex == lastFrameIndex ? frameDelays.length() : frameIndex); ++i) { + msUntilCurrentFrame += frameDelays[i].toInt(); + } + return msUntilCurrentFrame; +} + +bool AnimationTextObject::isInBoundsOnAxis(QPoint pos, bool yInsteadOfX, int start, int length) { + int posOnAxis = yInsteadOfX ? pos.y() : pos.x(); + return posOnAxis >= start && posOnAxis <= start + length; +} + +bool AnimationTextObject::isInBounds(QPoint pos, QRect bounds) { + return isInBoundsOnAxis(pos, false, bounds.x(), bounds.width()) + && isInBoundsOnAxis(pos, true, bounds.y(), bounds.height()); +} + +int AnimationTextObject::getOffset(int offset, int start, int length) { + return start + offset + (offset < 0 ? length : 0); +} + +void AnimationTextObject::drawVideoControls(QPainter *painter, QObject *propertyHolder, QPixmap frame, bool wasPaused, + bool wasCached, int frameIndex, int speedPercentage) { + QRect rect = propertyHolder->property("posAndSize").toRect(); + int videoControlsHeight = videoBarHeight + underVideoBarHeight; + QSize viewSizeMin(rect.width(), rect.height() - videoControlsHeight); + auto getOffsetX = [rect](int offset) { return rect.x() + offset + (offset < 0 ? rect.width() : 0); }; + int cacheX = getOffsetX(cacheOffsetX); + int loopModeX = getOffsetX(loopModeOffsetX); + int frameTraversalX = getOffsetX(frameTraversalOffsetX); + int speedX = getOffsetX(speedOffsetX); + + int videoBarX = rect.x(); + int videoBarY = rect.y() + rect.height() - videoControlsHeight; + int underVideoBarY = videoBarY + videoBarHeight; + int underVideoBarWithMarginY = underVideoBarY + 14; + + auto convertUnit = [](int integer, int exponent, int decimalAmount = 0) -> double { + bool noDecimals = decimalAmount == 0; + int exponentForDecimalAmount = exponent < 0 ? exponent + decimalAmount : exponent - decimalAmount; + + double product = integer * pow(10, exponentForDecimalAmount); + return noDecimals ? product : round(product) / (double) pow(10, decimalAmount); + }; + auto padDecimals = [](QString numberStr, int decimalAmount) -> QString { + qsizetype decimalMarkIndex = numberStr.lastIndexOf('.'); + bool isDecimal = decimalMarkIndex != -1 && decimalMarkIndex < numberStr.length() - 1; + qsizetype currentDecimalAmount = isDecimal ? numberStr.sliced(decimalMarkIndex + 1).length() : 0; + qsizetype decimalFillerAmount = decimalAmount - currentDecimalAmount; + + QString decimalFillers = QString('0').repeated(decimalFillerAmount); + return decimalFillerAmount > 0 ? numberStr.append((!isDecimal ? "." : "") + decimalFillers) : numberStr; + }; + auto padNumber = [](QString numberStr, int digitAmount) -> QString { + qsizetype numberLength = numberStr.length(); + qsizetype decimalMarkIndex = numberStr.lastIndexOf('.'); + qsizetype decimalsIncludingMarkLength = decimalMarkIndex != -1 ? numberLength - decimalMarkIndex : 0; + return numberStr.rightJustified(digitAmount + decimalsIncludingMarkLength, '0'); + }; + auto formatTime = [padDecimals, padNumber](double seconds, double totalSeconds = 0) -> QString { + auto getTimeNumbers = [](double seconds) -> QList< double > { + auto floorDivision = [](double dividend, double divisor = 60) { return (int) floor(dividend / divisor); }; + int minutes = floorDivision(seconds); + int hours = floorDivision(minutes); + int remainingMinutes = std::max(minutes - hours * 60, 0); + double remainingSeconds = std::max< double >(seconds - minutes * 60, 0); + return QList< double >({ remainingSeconds, (double) remainingMinutes, (double) hours }); + }; + auto getDigitAmount = [](int number) -> int { + int digitAmount = 0; + do { + number /= 10; + ++digitAmount; + } while (number != 0); + return digitAmount; + }; + + QList< double > timeNumbers = getTimeNumbers(seconds); + QList< double > totalTimeNumbers = totalSeconds == 0 ? timeNumbers : getTimeNumbers(totalSeconds); + int timeNumberAmount = (int) timeNumbers.length(); + int decimalAmount = 1; + + int lastTimeNumberIndex = 0; + for (int i = timeNumberAmount - 1; i >= 0; --i) { + if (totalTimeNumbers[i] > 0) { + lastTimeNumberIndex = i; + break; + } + } + + QString timeStr; + for (int i = 0; i < timeNumberAmount; ++i) { + double number = timeNumbers[i]; + bool isSeconds = i == 0; + bool isLastNumber = i == lastTimeNumberIndex; + bool hasAnotherNumber = i < lastTimeNumberIndex; + if (number == 0 && !hasAnotherNumber && !isLastNumber) { + break; + } + QString numberStr = QString::number(number); + if (hasAnotherNumber || isLastNumber) { + int digitAmount = isLastNumber ? getDigitAmount((int) totalTimeNumbers[i]) : 2; + numberStr = padNumber(numberStr, digitAmount); + } + timeStr.prepend(isSeconds ? padDecimals(numberStr, decimalAmount) : numberStr.append(":")); + } + return timeStr; + }; + + QList< QVariant > frameDelays = propertyHolder->property("frameDelays").toList(); + int totalMs = getTotalTime(propertyHolder); + int msUntilCurrentFrame = getCurrentTime(propertyHolder, frameIndex); + // Convert to seconds rounded to one decimal: + double totalS = convertUnit(totalMs, -3, 1); + double currentS = convertUnit(msUntilCurrentFrame, -3, 1); + + painter->drawPixmap(QRect(rect.topLeft(), viewSizeMin), frame); + painter->fillRect(videoBarX, videoBarY, viewSizeMin.width(), videoControlsHeight, QBrush(QColor(50, 50, 50, 180))); + + double videoBarProgress = msUntilCurrentFrame / (double) totalMs; + QBrush videoBarBrush(QColor(0, 0, 200)); + painter->fillRect(videoBarX, videoBarY, viewSizeMin.width(), 4, QBrush(QColor(90, 90, 90, 180))); + painter->fillRect(videoBarX, videoBarY, (int) round(viewSizeMin.width() * videoBarProgress), 4, videoBarBrush); + + painter->setPen(QColor(149, 165, 166)); + QString speedStr = padDecimals(QString::number(convertUnit(speedPercentage, -2)), 2); + QPoint speedPos(speedX, underVideoBarWithMarginY); + painter->drawText(speedPos, speedStr); + // Draw the plus "+": + painter->drawLine(speedPos.x() - 9, speedPos.y() - 11, speedPos.x() - 9, speedPos.y() - 3); + painter->drawLine(speedPos.x() - 13, speedPos.y() - 7, speedPos.x() - 5, speedPos.y() - 7); + // Draw the minus "-": + painter->drawLine(speedPos.x() - 13, speedPos.y() + 2, speedPos.x() - 5, speedPos.y() + 2); + // Draw the circle "o": + painter->drawEllipse(speedPos.x() - 26, speedPos.y() - 6, 6, 6); + + QPoint frameTraversalPos(frameTraversalX, underVideoBarWithMarginY); + painter->drawText(frameTraversalPos, "< >"); + + LoopMode loopMode = qvariant_cast< LoopMode >(propertyHolder->property("LoopMode")); + QString loopModeStr = loopModeToString(loopMode); + QFont font = painter->font(); + qsizetype loopModeStrLength = loopModeStr.length(); + int loopModeStrOffset = loopModeStrLength > 7 ? 12 : loopModeStrLength > 4 ? 5 : 0; + double fontSizeSmall = 0.7; + font.setPointSize((int) round(font.pointSize() * fontSizeSmall)); + painter->setFont(font); + painter->drawText(QPointF(loopModeX, underVideoBarY + 8), "mode:"); + painter->drawText(QPointF(loopModeX - (double) loopModeStrOffset, underVideoBarY + 17), loopModeStr); + + QString cachedStr = QString::fromStdString(wasCached ? "on" : "off"); + painter->drawText(QPointF(cacheX, underVideoBarY + 8), "cache:"); + painter->drawText(QPointF(cacheX + 5, underVideoBarY + 17), cachedStr); + font.setPointSize((int) round(font.pointSize() / fontSizeSmall)); + painter->setFont(font); + + QString totalTimeStr = formatTime(totalS); + QString currentTimeStr = formatTime(currentS, totalS); + painter->drawText(QPoint(videoBarX + 20, underVideoBarWithMarginY), + tr("%1 / %2").arg(currentTimeStr).arg(totalTimeStr)); + + QPointF iconTopPos(videoBarX + 2, underVideoBarY + 2); + if (wasPaused) { + // Add a play-icon, which is a right-pointing triangle, like this "▶": + QPolygonF polygon( + { iconTopPos, QPointF(videoBarX + 15, underVideoBarY + 10), QPointF(videoBarX + 2, underVideoBarY + 18) }); + QPainterPath path; + path.addPolygon(polygon); + painter->fillPath(path, QBrush(Qt::white)); + } else { + // Add a pause-icon, which is two vertical rectangles next to each other, like this "||": + QSize pauseBarSize(4, 16); + QBrush brush(Qt::white); + painter->fillRect(QRect(iconTopPos.toPoint(), pauseBarSize), brush); + painter->fillRect(QRect(QPoint(videoBarX + 11, underVideoBarY + 2), pauseBarSize), brush); + } +} + +AnimationTextObject::VideoController AnimationTextObject::mousePressVideoControls(QObject *propertyHolder, + QPoint mouseDocPos) { + QRect rect = propertyHolder->property("posAndSize").toRect(); + int videoControlsHeight = videoBarHeight + underVideoBarHeight; + QSize viewSizeMin(rect.width(), rect.height() - videoControlsHeight); + auto getOffsetX = [rect](int offset) { return rect.x() + offset + (offset < 0 ? rect.width() : 0); }; + int cacheX = getOffsetX(cacheOffsetX); + int loopModeX = getOffsetX(loopModeOffsetX); + int frameTraversalX = getOffsetX(frameTraversalOffsetX); + int speedX = getOffsetX(speedOffsetX); + + auto isThisInBoundsOnAxis = [mouseDocPos](bool yInsteadOfX, int start, int length) { + return isInBoundsOnAxis(mouseDocPos, yInsteadOfX, start, length); + }; + auto isThisInBounds = [mouseDocPos](QRect bounds) { return isInBounds(mouseDocPos, bounds); }; + int videoControlsY = rect.y() + rect.height() - videoControlsHeight; + int underVideoBarY = videoControlsY + videoBarHeight; + + QRect viewRect(rect.topLeft(), viewSizeMin); + QRect playPauseRect(rect.x(), underVideoBarY, 15, underVideoBarHeight); + + QRect cacheRect(cacheX, underVideoBarY, 25, underVideoBarHeight); + QRect loopModeRect(loopModeX, underVideoBarY, 24, underVideoBarHeight); + + int frameTraversalWidth = 12; + QRect framePreviousRect(frameTraversalX, underVideoBarY, frameTraversalWidth, underVideoBarHeight); + QRect frameNextRect(frameTraversalX + frameTraversalWidth + 2, underVideoBarY, frameTraversalWidth, + underVideoBarHeight); + + int speedWidth = 9; + int speedMinusHeight = 9; + int speedPlusHeight = 11; + QRect speedResetRect(speedX - 28, underVideoBarY, speedWidth, underVideoBarHeight); + QRect speedMinusRect(speedX - 14, underVideoBarY + speedPlusHeight, speedWidth, speedMinusHeight); + QRect speedPlusRect(speedX - 14, underVideoBarY, speedWidth, speedPlusHeight); + + if (!isThisInBoundsOnAxis(false, viewRect.x(), viewRect.width())) + return None; + if (isThisInBoundsOnAxis(true, viewRect.y(), viewRect.height())) + return View; + if (isThisInBoundsOnAxis(true, videoControlsY, videoBarHeight)) + return VideoBar; + if (isThisInBounds(playPauseRect)) + return PlayPause; + if (isThisInBounds(cacheRect)) + return CacheSwitch; + if (isThisInBounds(loopModeRect)) + return LoopSwitch; + if (isThisInBounds(framePreviousRect)) + return PreviousFrame; + if (isThisInBounds(frameNextRect)) + return NextFrame; + if (isThisInBounds(speedResetRect)) + return ResetSpeed; + if (isThisInBounds(speedMinusRect)) + return DecreaseSpeed; + if (isThisInBounds(speedPlusRect)) + return IncreaseSpeed; + return None; +} + +void AnimationTextObject::mousePress(QAbstractTextDocumentLayout *docLayout, QPoint mouseDocPos, + Qt::MouseButton mouseButton) { + QTextFormat baseFmt = docLayout->formatAt(mouseDocPos); + if (!baseFmt.isCharFormat() || baseFmt.objectType() != Log::Animation) { + return; + } + QMovie *animation = qvariant_cast< QMovie * >(baseFmt.toCharFormat().property(1)); + QRect rect = animation->property("posAndSize").toRect(); + // Ensure the selection was within the text object's vertical space, + // such as if an inline image is not as tall as the content before it: + if (!isInBoundsOnAxis(mouseDocPos, true, rect.y(), rect.height())) { + return; + } + + auto setFrameByVideoBarSelection = [animation, mouseDocPos, rect]() { + double videoBarPercentage = (mouseDocPos.x() - rect.x()) / (double) rect.width(); + setFrameByProportion(animation, videoBarPercentage); + }; + bool isLeftMouseButtonPressed = mouseButton == Qt::LeftButton; + bool isMiddleMouseButtonPressed = mouseButton == Qt::MiddleButton; + if (areVideoControlsOn) { + VideoController videoController = mousePressVideoControls(animation, mouseDocPos); + if (isLeftMouseButtonPressed) { + switch (videoController) { + case VideoBar: + return setFrameByVideoBarSelection(); + case View: + case PlayPause: + return togglePause(animation); + case CacheSwitch: + return toggleCache(animation); + case LoopSwitch: + return changeLoopMode(animation, 1); + case PreviousFrame: + return changeFrame(animation, -1); + case NextFrame: + return changeFrame(animation, 1); + case ResetSpeed: + return setSpeed(animation, 100); + case DecreaseSpeed: + return changeSpeed(animation, -10); + case IncreaseSpeed: + return changeSpeed(animation, 10); + default: + return; + } + } else if (isMiddleMouseButtonPressed) { + switch (videoController) { + case View: + case PlayPause: + return resetPlayback(animation); + case LoopSwitch: + return changeLoopMode(animation, -1); + case PreviousFrame: + return changeFrame(animation, -5); + case NextFrame: + return changeFrame(animation, 5); + case DecreaseSpeed: + return changeSpeed(animation, -50); + case IncreaseSpeed: + return changeSpeed(animation, 50); + default: + return; + } + } + return; + } + if (isLeftMouseButtonPressed) { + togglePause(animation); + } else if (isMiddleMouseButtonPressed) { + resetPlayback(animation); + } + // Right mouse button shows the context menu for the text object, + // which is handled where the custom context menu for the log is. +} + +void AnimationTextObject::keyPress(LogTextBrowser *log, bool isItemSelectionChanged, Qt::Key key) { + bool isItemAtIndex = false; + int itemIndex = log->customInteractiveItemFocusIndex; + QMovie *animation = nullptr; + QList< QTextFormat > fmts = log->document()->allFormats(); + for (auto fmt : fmts) { + if (fmt.objectType() != Log::Animation) { + continue; + } + animation = qvariant_cast< QMovie * >(fmt.property(1)); + isItemAtIndex = itemIndex == animation->property("customInteractiveItemIndex").toInt(); + if (isItemAtIndex) { + break; + } + } + if (!isItemAtIndex) { + return; + } + + bool isKeyBoundToAction = true; + Qt::KeyboardModifiers modifiers = QApplication::keyboardModifiers(); + if (modifiers.testFlag(Qt::NoModifier) || modifiers.testFlag(Qt::KeypadModifier)) { + switch (key) { + case Qt::Key_Space: + case Qt::Key_K: + togglePause(animation); + break; + case Qt::Key_Q: + resetPlayback(animation); + break; + case Qt::Key_V: + areVideoControlsOn = !areVideoControlsOn; + break; + case Qt::Key_C: + toggleCache(animation); + break; + case Qt::Key_O: + changeLoopMode(animation, -1); + break; + case Qt::Key_L: + changeLoopMode(animation, 1); + break; + case Qt::Key_Comma: + changeFrame(animation, -1); + break; + case Qt::Key_Period: + changeFrame(animation, 1); + break; + case Qt::Key_N: + changeFrame(animation, -5); + break; + case Qt::Key_M: + changeFrame(animation, 5); + break; + case Qt::Key_H: + changeFrameByTime(animation, -1000); + break; + case Qt::Key_J: + changeFrameByTime(animation, 1000); + break; + case Qt::Key_F: + changeFrameByTime(animation, -5000); + break; + case Qt::Key_G: + changeFrameByTime(animation, 5000); + break; + case Qt::Key_S: + case Qt::Key_Minus: + changeSpeed(animation, -5); + break; + case Qt::Key_D: + case Qt::Key_Plus: + changeSpeed(animation, 5); + break; + case Qt::Key_W: + changeSpeed(animation, -25); + break; + case Qt::Key_E: + changeSpeed(animation, 25); + break; + case Qt::Key_R: + setSpeed(animation, 100); + break; + case Qt::Key_0: + setFrameByProportion(animation, 0); + break; + case Qt::Key_1: + setFrameByProportion(animation, 0.1); + break; + case Qt::Key_2: + setFrameByProportion(animation, 0.2); + break; + case Qt::Key_3: + setFrameByProportion(animation, 0.3); + break; + case Qt::Key_4: + setFrameByProportion(animation, 0.4); + break; + case Qt::Key_5: + setFrameByProportion(animation, 0.5); + break; + case Qt::Key_6: + setFrameByProportion(animation, 0.6); + break; + case Qt::Key_7: + setFrameByProportion(animation, 0.7); + break; + case Qt::Key_8: + setFrameByProportion(animation, 0.8); + break; + case Qt::Key_9: + setFrameByProportion(animation, 0.9); + break; + default: + isKeyBoundToAction = false; + break; + } + } else { + isKeyBoundToAction = false; + } + if (isKeyBoundToAction || isItemSelectionChanged) { + log->scrollItemIntoView(animation->property("posAndSize").toRect()); + } +} + +void AnimationTextObject::drawCenteredPlayIcon(QPainter *painter, QRect rect) { + int centerX = (int) round(rect.x() + rect.width() / (double) 2); + int centerY = (int) round(rect.y() + rect.height() / (double) 2); + // Add a play-icon, which is a right-pointing triangle, like this "▶": + QPolygonF polygon( + { QPointF(centerX - 8, centerY - 10), QPointF(centerX + 12, centerY), QPointF(centerX - 8, centerY + 10) }); + QPainterPath path; + QPen thinBlackPen(Qt::black, 0.25); + path.addPolygon(polygon); + painter->fillPath(path, QBrush(Qt::white)); + // Add outline contrast to the triangle: + painter->strokePath(path, thinBlackPen); + + auto drawCenteredCircle = [painter, centerX, centerY](int diameter) { + int radius = diameter / 2; + painter->drawEllipse(centerX - radius, centerY - radius, diameter, diameter); + }; + // Add a ring around the triangle: + painter->setPen(QPen(Qt::white, 2)); + drawCenteredCircle(40); + // Add outline contrast to the ring: + painter->setPen(thinBlackPen); + drawCenteredCircle(36); + drawCenteredCircle(44); +} + +void AnimationTextObject::updatePropertyRect(QObject *propertyHolder, QRect rect) { + QVariant propertyPosAndSize = propertyHolder->property("posAndSize"); + QRect propertyRect = propertyPosAndSize.isValid() ? propertyPosAndSize.toRect() : QRect(); + // Update the property for the position and size of the animation if it has not been set before, + // if its width changes when video controls are switched on or off, + // if its vertical position changes, such as if content above it has its height altered by text wrapping, + // or if its horizontal position changes, such as if the window resizes when the animation is centered + // and dependent on available blank space: + if (propertyRect.width() != rect.width() || propertyRect.y() != rect.y() || propertyRect.x() != rect.x()) { + propertyHolder->setProperty("posAndSize", QVariant(rect)); + } +} + +AnimationTextObject::AnimationTextObject() : QObject() { +} + +QSizeF AnimationTextObject::intrinsicSize(QTextDocument *, int, const QTextFormat &fmt) { + QMovie *animation = qvariant_cast< QMovie * >(fmt.property(1)); + QSize size = animation->currentPixmap().size(); + if (areVideoControlsOn) { + int videoControlsHeight = videoBarHeight + underVideoBarHeight; + int viewWidthMin = size.width() - videoControlsHeight; + size.setWidth(viewWidthMin); + } + return QSizeF(size); +} + +void AnimationTextObject::drawObject(QPainter *painter, const QRectF &rectF, QTextDocument *doc, int, + const QTextFormat &fmt) { + LogTextBrowser *log = qobject_cast< LogTextBrowser * >(doc->parent()); + QMovie *animation = qvariant_cast< QMovie * >(fmt.property(1)); + QRect rect = rectF.toRect(); + QPixmap frame = animation->currentPixmap(); + bool wasRunning = animation->state() == QMovie::Running || animation->property("isPlayingInReverse").toBool(); + updatePropertyRect(animation, rect); + + painter->setRenderHint(QPainter::Antialiasing); + if (log->customInteractiveItemFocusIndex == animation->property("customInteractiveItemIndex").toInt()) { + painter->setPen(QPen(QColor(50, 50, 200), 2)); + painter->drawRect(QRect(rect.x() - 1, rect.y() - 1, rect.width() + 2, rect.height() + 2)); + } + if (areVideoControlsOn) { + bool wasCached = animation->cacheMode() == QMovie::CacheAll; + int frameIndex = animation->currentFrameNumber(); + int speedPercentage = animation->speed(); + drawVideoControls(painter, animation, frame, !wasRunning, wasCached, frameIndex, speedPercentage); + return; + } + painter->drawPixmap(rect, frame); + if (!wasRunning) { + drawCenteredPlayIcon(painter, rect); + } +} + + bool ChatbarTextEdit::event(QEvent *evt) { if (evt->type() == QEvent::ShortcutOverride) { return false; diff --git a/src/mumble/CustomElements.h b/src/mumble/CustomElements.h index 2478d2afa5..2ad36f3c0d 100644 --- a/src/mumble/CustomElements.h +++ b/src/mumble/CustomElements.h @@ -7,20 +7,38 @@ #define MUMBLE_MUMBLE_CUSTOMELEMENTS_H_ #include +#include +#include #include #include #include +Q_DECLARE_METATYPE(QMovie *) + class LogTextBrowser : public QTextBrowser { private: Q_OBJECT Q_DISABLE_COPY(LogTextBrowser) +protected: + QString queuedNumericInput; + void mousePressEvent(QMouseEvent *) Q_DECL_OVERRIDE; + void keyPressEvent(QKeyEvent *) Q_DECL_OVERRIDE; + void keyReleaseEvent(QKeyEvent *) Q_DECL_OVERRIDE; + public: + int lastCustomInteractiveItemIndex = -1; + int customInteractiveItemFocusIndex = -1; LogTextBrowser(QWidget *p = nullptr); - int getLogScroll(); - void setLogScroll(int scroll_pos); + void update(); + int getScrollX(); + int getScrollY(); + void setScrollX(int scroll_pos); + void setScrollY(int scroll_pos); + void changeScrollX(int change); + void changeScrollY(int change); + void scrollItemIntoView(QRect rect); bool isScrolledToBottom(); }; @@ -51,7 +69,7 @@ class ChatbarTextEdit : public QTextEdit { void resizeEvent(QResizeEvent *e) Q_DECL_OVERRIDE; void insertFromMimeData(const QMimeData *source) Q_DECL_OVERRIDE; bool sendImagesFromMimeData(const QMimeData *source); - bool emitPastedImage(QImage image); + bool emitPastedImage(QImage image, QString filePath = ""); public: void setDefaultText(const QString &, bool = false); @@ -75,6 +93,71 @@ public slots: ChatbarTextEdit(QWidget *p = nullptr); }; +class AnimationTextObject : public QObject, public QTextObjectInterface { + Q_OBJECT + Q_INTERFACES(QTextObjectInterface) + +protected: + static const int videoBarHeight = 4; + static const int underVideoBarHeight = 20; + static const int cacheOffsetX = -170; + static const int loopModeOffsetX = -130; + static const int frameTraversalOffsetX = -90; + static const int speedOffsetX = -30; + QSizeF intrinsicSize(QTextDocument *doc, int posInDoc, const QTextFormat &fmt) Q_DECL_OVERRIDE; + void drawObject(QPainter *painter, const QRectF &rectF, QTextDocument *doc, int posInDoc, + const QTextFormat &fmt) Q_DECL_OVERRIDE; + +public: + static bool areVideoControlsOn; + AnimationTextObject(); + static void mousePress(QAbstractTextDocumentLayout *docLayout, QPoint mouseDocPos, Qt::MouseButton button); + static void keyPress(LogTextBrowser *log, bool isItemSelectionChanged, Qt::Key key); + + enum VideoController { + VideoBar, + View, + PlayPause, + CacheSwitch, + LoopSwitch, + PreviousFrame, + NextFrame, + ResetSpeed, + DecreaseSpeed, + IncreaseSpeed, + None + }; + enum LoopMode { Unchanged, Loop, NoLoop }; + static QString loopModeToString(LoopMode mode); + + static void updateVideoControls(QObject *propertyHolder); + static int getTotalTime(QObject *propertyHolder); + static int getCurrentTime(QObject *propertyHolder, int frameIndex); + static void setFrame(QMovie *animation, int frameIndex); + static void setFrameByTime(QMovie *animation, int milliseconds); + static void setFrameByProportion(QMovie *animation, double proportion); + static void togglePause(QMovie *animation); + static void toggleCache(QMovie *animation); + static void stopPlayback(QMovie *animation); + static void resetPlayback(QMovie *animation); + static void setSpeed(QMovie *animation, int percentage); + static void changeLoopMode(QMovie *animation, int steps); + static void changeFrame(QMovie *animation, int amount); + static void changeFrameByTime(QMovie *animation, int milliseconds); + static void changeSpeed(QMovie *animation, int percentageStep); + + static bool isInBoundsOnAxis(QPoint pos, bool yInsteadOfX, int start, int length); + static bool isInBounds(QPoint pos, QRect bounds); + static int getOffset(int offset, int start, int length); + static void setRectAndVideoControlPositioning(QObject *propertyHolder, QRect rect); + static VideoController mousePressVideoControls(QObject *propertyHolder, QPoint mouseDocPos); + static void drawVideoControls(QPainter *painter, QObject *propertyHolder, QPixmap frame, bool wasPaused, + bool wasCached, int frameIndex, int speedPercentage); + + static void updatePropertyRect(QObject *propertyHolder, QRect rect); + static void drawCenteredPlayIcon(QPainter *painter, QRect rect); +}; + class DockTitleBar : public QLabel { private: Q_OBJECT diff --git a/src/mumble/Log.cpp b/src/mumble/Log.cpp index eb01bddf26..219bfede33 100644 --- a/src/mumble/Log.cpp +++ b/src/mumble/Log.cpp @@ -415,6 +415,9 @@ QVector< LogMessage > Log::qvDeferredLogs; Log::Log(QObject *p) : QObject(p) { qRegisterMetaType< Log::MsgType >(); + QAbstractTextDocumentLayout *docLayout = Global::get().mw->qteLog->document()->documentLayout(); + docLayout->registerHandler(Animation, new AnimationTextObject()); + #ifndef USE_NO_TTS tts = new TextToSpeech(this); tts->setVolume(Global::get().s.iTTSVolume); @@ -634,6 +637,206 @@ QString Log::imageToImg(QImage img, int maxSize) { return QString(); } +bool Log::htmlWithAnimations(const QString &html, QTextCursor *tc) { + bool isAnyAnimation = false; + + qsizetype htmlEndIndex = html.length() - 1; + auto searchForAnimationHeader = + [html, htmlEndIndex](qsizetype previousImgEndIndex) -> std::tuple< bool, qsizetype, qsizetype > { + bool isCompatibleHeader; + qsizetype imgStartIndex = -1; + qsizetype base64StartIndex; + do { + imgStartIndex = html.indexOf(" 0 && htmlEndIndex > base64StartIndex + 2 ? qvariant_cast< QString >( + QByteArray::fromBase64(qvariant_cast< QByteArray >(html.sliced(base64StartIndex, 4)))) + : ""; + isCompatibleHeader = imageFirstThreeBytes == "GIF"; + } while (!isCompatibleHeader && imgStartIndex != -1); + return std::make_tuple(isCompatibleHeader, imgStartIndex, base64StartIndex); + }; + auto getIndexOfDoubleOrSingleQuote = [html](qsizetype startIndex) -> qsizetype { + qsizetype index = html.indexOf('\"', startIndex); + if (index == -1) { + index = html.indexOf('\'', startIndex); + } + return index; + }; + + // Track if there are more animations to insert after the current one: + bool isAnotherAnimation; + // Track the end of the previous animation and thereby where to move forward the start of the search to + // as well as what HTML precedes the currently processed animation but succeeds the previous animation: + qsizetype previousImgEndIndex = -1; + do { + qsizetype imgStartIndex; + qsizetype base64StartIndex; + std::tie(isAnotherAnimation, imgStartIndex, base64StartIndex) = searchForAnimationHeader(previousImgEndIndex); + qsizetype base64EndIndex = getIndexOfDoubleOrSingleQuote(base64StartIndex) - 1; + qsizetype imgEndIndex = html.indexOf('>', base64EndIndex); + bool isImgEndIndex = imgEndIndex != -1; + if (!isAnotherAnimation || base64EndIndex == -2 || !isImgEndIndex) { + previousImgEndIndex = isImgEndIndex ? imgEndIndex : -2; + continue; + } + qsizetype base64Size = base64EndIndex - base64StartIndex + 1; + QString animationBase64 = html.sliced(base64StartIndex, base64Size); + QByteArray animationBa = QByteArray::fromBase64(qvariant_cast< QByteArray >(animationBase64)); + + QMovie *animation = new QMovie(); + QBuffer *buffer = new QBuffer(animation); + buffer->setData(animationBa); + buffer->open(QIODevice::ReadOnly); + animation->setDevice(buffer); + if (!animation->isValid()) { + delete animation; + previousImgEndIndex = imgEndIndex; + continue; + } + animation->setProperty("LoopMode", QVariant::fromValue(AnimationTextObject::Unchanged)); + // Track when the animation is playing in reverse instead of using the in-built play-controls which do not + // support it: + animation->setProperty("isPlayingInReverse", false); + // Block further signals during sequential traversal until reaching the preceding frame: + animation->setProperty("isTraversingFrames", false); + // Load and start the animation but stop or pause it after this when it should not play by default: + animation->start(); + + int frameCount = animation->frameCount(); + int frameCountTest = 0; + int totalMs = 0; + QList< QVariant > frameDelays; + // Test how many frames there are by index in case the animation format does not support `frameCount`. + // Also determine the total play time used for the video controls by gathering the time from each frame. + // The current time is determined by a list of the time between frames since each delay until the next + // frame may vary: + while (animation->jumpToFrame(++frameCountTest)) { + int delay = animation->nextFrameDelay(); + frameDelays.append(QVariant(delay)); + totalMs += delay; + } + if (frameCount == 0) { + frameCount = frameCountTest; + } + int lastFrameIndex = frameCount - 1; + animation->setProperty("lastFrameIndex", QVariant(lastFrameIndex)); + animation->setProperty("totalMs", QVariant(totalMs)); + animation->setProperty("frameDelays", frameDelays); + animation->jumpToFrame(0); + animation->stop(); + + LogTextBrowser *log = Global::get().mw->qteLog; + QAbstractTextDocumentLayout *docLayout = log->document()->documentLayout(); + animation->setProperty("customInteractiveItemIndex", ++log->lastCustomInteractiveItemIndex); + + qsizetype frameDelayAmount = frameDelays.length(); + auto refresh = [animation, docLayout]() { + QRect rect = animation->property("posAndSize").toRect(); + emit docLayout->update(rect); + }; + auto getLoopMode = [animation]() { + return qvariant_cast< AnimationTextObject::LoopMode >(animation->property("LoopMode")); + }; + // Refresh the image on change: + connect(animation, &QMovie::updated, refresh); + // Refresh the image once more when the animation is paused or stopped: + connect(animation, &QMovie::stateChanged, [refresh](QMovie::MovieState currentState) { + if (currentState != QMovie::Running) { + refresh(); + } + }); + // Start the animation again when it finishes if the loop mode is `Loop`: + connect(animation, &QMovie::finished, [animation, getLoopMode]() { + if (getLoopMode() == AnimationTextObject::Loop) { + animation->start(); + } + }); + // Stop the animation at the end of the last frame if the loop mode is `NoLoop` and + // play the animation in reverse if the property for it is `true`: + connect( + animation, &QMovie::frameChanged, + [animation, getLoopMode, frameDelays, frameDelayAmount, lastFrameIndex](int frameIndex) { + auto getFrameDelay = [animation, frameDelays, frameDelayAmount](int targetFrameIndex) -> int { + double speed = abs(animation->speed() / (double) 100); + bool isIndexInBoundsForDelay = targetFrameIndex >= 0 && targetFrameIndex < frameDelayAmount; + return (int) round( + frameDelays[isIndexInBoundsForDelay ? targetFrameIndex : frameDelayAmount - 1].toInt() / speed); + }; + auto isAtFrameAndRunning = [animation](int targetFrameIndex) -> bool { + int currentFrameIndex = animation->currentFrameNumber(); + bool wasRunning = + animation->state() == QMovie::Running || animation->property("isPlayingInReverse").toBool(); + return currentFrameIndex == targetFrameIndex && wasRunning; + }; + auto isAtFrameAndRunningWithNoLoop = [getLoopMode, isAtFrameAndRunning](int targetFrameIndex) { + return isAtFrameAndRunning(targetFrameIndex) && getLoopMode() == AnimationTextObject::NoLoop; + }; + auto stopAtEndOfCurrentFrame = [animation, isAtFrameAndRunningWithNoLoop, getFrameDelay, frameIndex]() { + int delay = getFrameDelay(frameIndex); + QTimer::singleShot(delay, Qt::PreciseTimer, animation, + [animation, isAtFrameAndRunningWithNoLoop, frameIndex]() { + if (!isAtFrameAndRunningWithNoLoop(frameIndex)) { + return; + } + AnimationTextObject::setFrame(animation, frameIndex); + AnimationTextObject::stopPlayback(animation); + }); + }; + + if (animation->property("isPlayingInReverse").toBool()) { + if (animation->property("isTraversingFrames").toBool()) { + return; + } + if (isAtFrameAndRunningWithNoLoop(0)) { + stopAtEndOfCurrentFrame(); + return; + } + int precedingFrameIndex = frameIndex <= 0 ? lastFrameIndex : frameIndex - 1; + int precedingFrameDelay = getFrameDelay(precedingFrameIndex); + QTimer::singleShot(precedingFrameDelay, Qt::PreciseTimer, animation, + [animation, isAtFrameAndRunning, frameIndex, precedingFrameIndex]() { + if (!isAtFrameAndRunning(frameIndex)) { + return; + } + bool wasCached = animation->cacheMode() == QMovie::CacheAll; + if (!wasCached) { + animation->setProperty("isTraversingFrames", true); + } + AnimationTextObject::setFrame(animation, precedingFrameIndex); + if (!wasCached) { + animation->setProperty("isTraversingFrames", false); + emit animation->frameChanged(precedingFrameIndex); + } + }); + } else if (isAtFrameAndRunningWithNoLoop(lastFrameIndex)) { + stopAtEndOfCurrentFrame(); + } + }); + + QTextCharFormat fmt = Global::get().mw->qteLog->currentCharFormat(); + fmt.setObjectType(Animation); + fmt.setProperty(1, QVariant::fromValue(animation)); + + isAnotherAnimation = std::get< 0 >(searchForAnimationHeader(imgEndIndex)); + qsizetype htmlBeforeImgLength = imgStartIndex - 1 - previousImgEndIndex; + QString htmlBeforeImg = + imgStartIndex - 1 > previousImgEndIndex ? html.sliced(previousImgEndIndex + 1, htmlBeforeImgLength) : ""; + QString htmlAfterImg = !isAnotherAnimation && imgEndIndex < htmlEndIndex ? html.sliced(imgEndIndex + 1) : ""; + tc->insertHtml(htmlBeforeImg); + tc->insertText(QString(QChar::ObjectReplacementCharacter), fmt); + tc->insertHtml(htmlAfterImg); + + previousImgEndIndex = imgEndIndex; + isAnyAnimation = true; + } while (isAnotherAnimation); + return isAnyAnimation; +} + QString Log::validHtml(const QString &html, QTextCursor *tc) { LogDocument qtd; @@ -648,7 +851,11 @@ QString Log::validHtml(const QString &html, QTextCursor *tc) { // allowing our validation checks for things such as // data URL images to run. (void) qtd.documentLayout(); - qtd.setHtml(html); + // Parse and insert animated image files along with the rest of the HTML + // if a tag, a header and valid data for any is detected, otherwise log the HTML as usual: + if (!tc || !htmlWithAnimations(html, tc)) { + qtd.setHtml(html); + } QStringList qslAllowed = allowedSchemes(); for (QTextBlock qtb = qtd.begin(); qtb != qtd.end(); qtb = qtb.next()) { @@ -745,7 +952,7 @@ void Log::log(MsgType mt, const QString &console, const QString &terse, bool own qttf.setBottomMargin(msgMargin); LogTextBrowser *tlog = Global::get().mw->qteLog; - const int oldscrollvalue = tlog->getLogScroll(); + const int oldscrollvalue = tlog->getScrollY(); // Restore the previous scroll position after inserting a new message // if the message was not sent by the user AND the chat log is not // scrolled all the way down. @@ -804,7 +1011,7 @@ void Log::log(MsgType mt, const QString &console, const QString &terse, bool own tc.setBlockFormat(bf); if (restoreScroll) { - tlog->setLogScroll(oldscrollvalue); + tlog->setScrollY(oldscrollvalue); } } diff --git a/src/mumble/Log.h b/src/mumble/Log.h index eee10bd7f7..c1627d5bbd 100644 --- a/src/mumble/Log.h +++ b/src/mumble/Log.h @@ -118,6 +118,8 @@ class Log : public QObject { // versions. static const MsgType msgOrder[]; + enum TextObjectType { Animation = QTextFormat::UserObject }; + protected: /// Mutex for qvDeferredLogs static QMutex qmDeferredLogs; @@ -135,6 +137,7 @@ class Log : public QObject { static const QStringList allowedSchemes(); void postNotification(MsgType mt, const QString &plain); void postQtNotification(MsgType mt, const QString &plain); + static bool htmlWithAnimations(const QString &html, QTextCursor *tc); public: Log(QObject *p = nullptr); diff --git a/src/mumble/MainWindow.cpp b/src/mumble/MainWindow.cpp index 0b533d3e91..ec4bd35ee6 100644 --- a/src/mumble/MainWindow.cpp +++ b/src/mumble/MainWindow.cpp @@ -67,6 +67,7 @@ #endif #include +#include #include #include #include @@ -1064,38 +1065,80 @@ void MainWindow::on_qteLog_customContextMenuRequested(const QPoint &mpos) { cursor.movePosition(QTextCursor::NextCharacter); fmt = cursor.charFormat(); } - if (cursor.charFormat().isImageFormat()) { + bool isAnimation = fmt.objectType() == Log::Animation; + if (fmt.isImageFormat() || isAnimation) { menu->addSeparator(); menu->addAction(tr("Save Image As..."), this, SLOT(saveImageAs(void))); qtcSaveImageCursor = cursor; } + if (isAnimation) { + bool areVideoControlsOn = AnimationTextObject::areVideoControlsOn; + QString actionFirstWord = areVideoControlsOn ? "Hide" : "Show"; + menu->addAction(tr("%1 Video Controls").arg(actionFirstWord), this, SLOT(toggleVideoControls(void))); + } menu->addSeparator(); - menu->addAction(tr("Clear"), qteLog, SLOT(clear(void))); + menu->addAction(tr("Clear"), this, SLOT(clearDocument(void))); menu->exec(qteLog->mapToGlobal(mpos)); delete menu; } +void MainWindow::clearDocument() { + QList< QTextFormat > fmts = qteLog->document()->allFormats(); + for (auto fmt : fmts) { + if (fmt.objectType() == Log::Animation) { + QMovie *animation = qvariant_cast< QMovie * >(fmt.property(1)); + AnimationTextObject::stopPlayback(animation); + animation->deleteLater(); + } + } + qteLog->clear(); +} + +void MainWindow::toggleVideoControls() { + AnimationTextObject::areVideoControlsOn = !AnimationTextObject::areVideoControlsOn; +} + void MainWindow::saveImageAs() { - QDateTime now = QDateTime::currentDateTime(); - QString defaultFname = - QString::fromLatin1("Mumble-%1.jpg").arg(now.toString(QString::fromLatin1("yyyy-MM-dd-HHmmss"))); + QTextCharFormat fmt = qtcSaveImageCursor.charFormat(); + bool isAnimation = fmt.objectType() == Log::Animation; + QString fileExtension = isAnimation ? "gif" : "jpg"; + QDateTime now = QDateTime::currentDateTime(); + QString defaultFname = QString::fromLatin1("Mumble-%1.%2") + .arg(now.toString(QString::fromLatin1("yyyy-MM-dd-HHmmss"))) + .arg(fileExtension); QString fname = QFileDialog::getSaveFileName(this, tr("Save Image File"), getImagePath(defaultFname), - tr("Images (*.png *.jpg *.jpeg)")); + tr("Images (*.png *.jpg *.jpeg *.gif)")); if (fname.isNull()) { return; } - QString resName = qtcSaveImageCursor.charFormat().toImageFormat().name(); - QVariant res = qteLog->document()->resource(QTextDocument::ImageResource, resName); - QImage img = res.value< QImage >(); - bool ok = img.save(fname); - if (!ok) { - // In case fname did not contain a file extension, try saving with an - // explicit format. - ok = img.save(fname, "PNG"); + bool ok = false; + if (isAnimation) { + QMovie *animation = qvariant_cast< QMovie * >(fmt.property(1)); + QIODevice *device = animation->device(); + qint64 previousPos = device->pos(); + if (device->reset()) { + QByteArray fileData = device->readAll(); + QSaveFile saveFile(fname); + if (saveFile.open(QIODevice::WriteOnly)) { + saveFile.write(fileData); + ok = saveFile.commit(); + } + } + device->seek(previousPos); + } else { + QString resName = fmt.toImageFormat().name(); + QVariant res = qteLog->document()->resource(QTextDocument::ImageResource, resName); + QImage img = res.value< QImage >(); + ok = img.save(fname); + if (!ok) { + // In case fname did not contain a file extension, try saving with an + // explicit format. + ok = img.save(fname, "PNG"); + } } updateImagePath(fname); @@ -3913,8 +3956,8 @@ void MainWindow::context_triggered() { QPair< QByteArray, QImage > MainWindow::openImageFile() { QPair< QByteArray, QImage > retval; - QString fname = - QFileDialog::getOpenFileName(this, tr("Choose image file"), getImagePath(), tr("Images (*.png *.jpg *.jpeg)")); + QString fname = QFileDialog::getOpenFileName(this, tr("Choose image file"), getImagePath(), + tr("Images (*.png *.jpg *.jpeg *.gif)")); if (fname.isNull()) return retval; diff --git a/src/mumble/MainWindow.h b/src/mumble/MainWindow.h index 49df114721..7a65aacfde 100644 --- a/src/mumble/MainWindow.h +++ b/src/mumble/MainWindow.h @@ -372,6 +372,10 @@ public slots: void onResetAudio(); void showRaiseWindow(); void on_qaFilterToggle_triggered(); + /// Removes the content of the client's log and deletes the objects used by text objects. + void clearDocument(); + /// Alternates between showing and hiding video controls for animated images. + void toggleVideoControls(); /// Opens a save dialog for the image referenced by qtcSaveImageCursor. void saveImageAs(); /// Returns the path to the user's image directory, optionally with a diff --git a/src/mumble/mumble_ar.ts b/src/mumble/mumble_ar.ts index dd663f6352..d04ac0b74a 100644 --- a/src/mumble/mumble_ar.ts +++ b/src/mumble/mumble_ar.ts @@ -702,6 +702,13 @@ This value allows you to set the maximum number of users allowed in the channel. + + AnimationTextObject + + %1 / %2 + + + AudioInput @@ -2958,6 +2965,10 @@ Are you sure you wish to replace your certificate? This server does not allow sending images. + + Unable to read animated image file: %1 + + ClientUser @@ -5422,10 +5433,6 @@ Otherwise abort and check your certificate and username. Wrong server password for unregistered user account, please try again. - - Images (*.png *.jpg *.jpeg) - - C&onfigure @@ -7015,6 +7022,14 @@ Valid options are: This could be caused by one of the following scenarios:<ul><li>Your client and the server use different encryption standards. This could be because you are using a very old client or the server you are connecting to is very old. In the first case, you should update your client and in the second case you should contact the server administrator so that they can update their server.</li><li>Either your client or the server is using an old operating system that doesn't provide up-to-date encryption methods. In this case you should consider updating your OS or contacting the server admin so that they can update theirs.</li><li>The server you are connecting to isn't actually a Mumble server. Please ensure that the used server address really belongs to a Mumble server and not e.g. to a game server.</li><li>The port you are connecting to does not belong to a Mumble server but instead is bound to a completely unrelated process on the server-side. Please double-check you have used the correct port.</li></ul> + + %1 Video Controls + + + + Images (*.png *.jpg *.jpeg *.gif) + + Manual diff --git a/src/mumble/mumble_bg.ts b/src/mumble/mumble_bg.ts index aa69e7d019..05057ae1ea 100644 --- a/src/mumble/mumble_bg.ts +++ b/src/mumble/mumble_bg.ts @@ -703,6 +703,13 @@ This value allows you to set the maximum number of users allowed in the channel. + + AnimationTextObject + + %1 / %2 + + + AudioInput @@ -2955,6 +2962,10 @@ Are you sure you wish to replace your certificate? This server does not allow sending images. + + Unable to read animated image file: %1 + + ClientUser @@ -5419,10 +5430,6 @@ Otherwise abort and check your certificate and username. Wrong server password for unregistered user account, please try again. - - Images (*.png *.jpg *.jpeg) - Изображения (*.png *.jpg *.jpeg) - C&onfigure @@ -7012,6 +7019,14 @@ Valid options are: This could be caused by one of the following scenarios:<ul><li>Your client and the server use different encryption standards. This could be because you are using a very old client or the server you are connecting to is very old. In the first case, you should update your client and in the second case you should contact the server administrator so that they can update their server.</li><li>Either your client or the server is using an old operating system that doesn't provide up-to-date encryption methods. In this case you should consider updating your OS or contacting the server admin so that they can update theirs.</li><li>The server you are connecting to isn't actually a Mumble server. Please ensure that the used server address really belongs to a Mumble server and not e.g. to a game server.</li><li>The port you are connecting to does not belong to a Mumble server but instead is bound to a completely unrelated process on the server-side. Please double-check you have used the correct port.</li></ul> + + %1 Video Controls + + + + Images (*.png *.jpg *.jpeg *.gif) + + Manual diff --git a/src/mumble/mumble_br.ts b/src/mumble/mumble_br.ts index eedda2765c..cb7dd31c72 100644 --- a/src/mumble/mumble_br.ts +++ b/src/mumble/mumble_br.ts @@ -702,6 +702,13 @@ This value allows you to set the maximum number of users allowed in the channel. + + AnimationTextObject + + %1 / %2 + + + AudioInput @@ -2954,6 +2961,10 @@ Are you sure you wish to replace your certificate? This server does not allow sending images. + + Unable to read animated image file: %1 + + ClientUser @@ -5418,10 +5429,6 @@ Otherwise abort and check your certificate and username. Wrong server password for unregistered user account, please try again. - - Images (*.png *.jpg *.jpeg) - - C&onfigure @@ -7011,6 +7018,14 @@ Valid options are: This could be caused by one of the following scenarios:<ul><li>Your client and the server use different encryption standards. This could be because you are using a very old client or the server you are connecting to is very old. In the first case, you should update your client and in the second case you should contact the server administrator so that they can update their server.</li><li>Either your client or the server is using an old operating system that doesn't provide up-to-date encryption methods. In this case you should consider updating your OS or contacting the server admin so that they can update theirs.</li><li>The server you are connecting to isn't actually a Mumble server. Please ensure that the used server address really belongs to a Mumble server and not e.g. to a game server.</li><li>The port you are connecting to does not belong to a Mumble server but instead is bound to a completely unrelated process on the server-side. Please double-check you have used the correct port.</li></ul> + + %1 Video Controls + + + + Images (*.png *.jpg *.jpeg *.gif) + + Manual diff --git a/src/mumble/mumble_ca.ts b/src/mumble/mumble_ca.ts index 5e2ea16f38..b6e537801a 100644 --- a/src/mumble/mumble_ca.ts +++ b/src/mumble/mumble_ca.ts @@ -710,6 +710,13 @@ Aquest valor us permet establir el nombre màxim d'usuaris permesos al cana Trobareu la llista d'autors a <a href="https://github.com/mumble-voip/mumble/graphs/contributors">https://github.com/mumble-voip/mumble/graphs/contributors</a> + + AnimationTextObject + + %1 / %2 + + + AudioInput @@ -2995,6 +3002,10 @@ Esteu segur que vols substituir el vostre certificat? This server does not allow sending images. Aquest servidor no permet enviar imatges. + + Unable to read animated image file: %1 + + ClientUser @@ -5482,10 +5493,6 @@ Altrament avorta i comproveu el vostre certificat i nom d'usuari.Wrong server password for unregistered user account, please try again. Contrasenya de servidor incorrecte per a un compte d'usuari no registrat, si us plau proveu de nou. - - Images (*.png *.jpg *.jpeg) - Imatges (*.png *.jpg *.jpeg) - C&onfigure C&onfigura @@ -7165,6 +7172,14 @@ Les opcions vàlides són: This could be caused by one of the following scenarios:<ul><li>Your client and the server use different encryption standards. This could be because you are using a very old client or the server you are connecting to is very old. In the first case, you should update your client and in the second case you should contact the server administrator so that they can update their server.</li><li>Either your client or the server is using an old operating system that doesn't provide up-to-date encryption methods. In this case you should consider updating your OS or contacting the server admin so that they can update theirs.</li><li>The server you are connecting to isn't actually a Mumble server. Please ensure that the used server address really belongs to a Mumble server and not e.g. to a game server.</li><li>The port you are connecting to does not belong to a Mumble server but instead is bound to a completely unrelated process on the server-side. Please double-check you have used the correct port.</li></ul> La causa pot ser una de les següents:<ul><li>El vostre client i el servidor fan servir estàndards d'encriptació diferents. Potser el vostre client o el servidor són molt antics. En el primer cas, hauríeu d'actualitzar el vostre client i en el segon cas hauríeu de contactar l'administrador del servidor per que l'actualitzi.</li><li>O bé el vostre client o el servidor estan utilitzant un sistema operatiu antic que no proporciona mètodes d'encriptació actuals. En aquest cas hauríeu de considerar actualitzar el vostre sistema o contactar l'administrador del servidor per que actualitzi el seu.</li><li>El servidor al que esteu connectat a no és de fet un Mumble servidor. Si us plau assegureu-vos que l'adreça del servidor que utilitzeu correspon realment a un servidor Mumble, i no, per exemple, a un servidor de joc.</li><li>El port al que esteu connectat no pertany a un servidor Mumble servidor si no que està lligat a un procés sense cap relació amb el servidor lateral. Comproveu si us plau que utilitzeu el port correcte.</li></ul> + + %1 Video Controls + + + + Images (*.png *.jpg *.jpeg *.gif) + + Manual diff --git a/src/mumble/mumble_cs.ts b/src/mumble/mumble_cs.ts index db6bfe2153..b5f877976b 100644 --- a/src/mumble/mumble_cs.ts +++ b/src/mumble/mumble_cs.ts @@ -710,6 +710,13 @@ Tato hodnota Vám umožňuje nastavit maximální počet povolených uživatelů + + AnimationTextObject + + %1 / %2 + + + AudioInput @@ -2996,6 +3003,10 @@ Jste si jisti, že chcete certifikát nahradit? This server does not allow sending images. + + Unable to read animated image file: %1 + + ClientUser @@ -5475,10 +5486,6 @@ Jinak přerušte a zkontrolujte Váš certifikát a uživatelské jméno.Wrong server password for unregistered user account, please try again. Špatné heslo serveru pro účet neregistrovaného uživatele, prosím zkuste znovu. - - Images (*.png *.jpg *.jpeg) - Obrázky (*.png *.jpg *.jpeg) - C&onfigure &Nastavit @@ -7071,6 +7078,14 @@ Valid options are: This could be caused by one of the following scenarios:<ul><li>Your client and the server use different encryption standards. This could be because you are using a very old client or the server you are connecting to is very old. In the first case, you should update your client and in the second case you should contact the server administrator so that they can update their server.</li><li>Either your client or the server is using an old operating system that doesn't provide up-to-date encryption methods. In this case you should consider updating your OS or contacting the server admin so that they can update theirs.</li><li>The server you are connecting to isn't actually a Mumble server. Please ensure that the used server address really belongs to a Mumble server and not e.g. to a game server.</li><li>The port you are connecting to does not belong to a Mumble server but instead is bound to a completely unrelated process on the server-side. Please double-check you have used the correct port.</li></ul> + + %1 Video Controls + + + + Images (*.png *.jpg *.jpeg *.gif) + + Manual diff --git a/src/mumble/mumble_cy.ts b/src/mumble/mumble_cy.ts index 01b3ac558f..980ad2f3c1 100644 --- a/src/mumble/mumble_cy.ts +++ b/src/mumble/mumble_cy.ts @@ -703,6 +703,13 @@ This value allows you to set the maximum number of users allowed in the channel. + + AnimationTextObject + + %1 / %2 + + + AudioInput @@ -2958,6 +2965,10 @@ Are you sure you wish to replace your certificate? This server does not allow sending images. + + Unable to read animated image file: %1 + + ClientUser @@ -5422,10 +5433,6 @@ Otherwise abort and check your certificate and username. Wrong server password for unregistered user account, please try again. - - Images (*.png *.jpg *.jpeg) - - C&onfigure @@ -7015,6 +7022,14 @@ Valid options are: This could be caused by one of the following scenarios:<ul><li>Your client and the server use different encryption standards. This could be because you are using a very old client or the server you are connecting to is very old. In the first case, you should update your client and in the second case you should contact the server administrator so that they can update their server.</li><li>Either your client or the server is using an old operating system that doesn't provide up-to-date encryption methods. In this case you should consider updating your OS or contacting the server admin so that they can update theirs.</li><li>The server you are connecting to isn't actually a Mumble server. Please ensure that the used server address really belongs to a Mumble server and not e.g. to a game server.</li><li>The port you are connecting to does not belong to a Mumble server but instead is bound to a completely unrelated process on the server-side. Please double-check you have used the correct port.</li></ul> + + %1 Video Controls + + + + Images (*.png *.jpg *.jpeg *.gif) + + Manual diff --git a/src/mumble/mumble_da.ts b/src/mumble/mumble_da.ts index 70ef310e7f..16e65d8228 100644 --- a/src/mumble/mumble_da.ts +++ b/src/mumble/mumble_da.ts @@ -709,6 +709,13 @@ This value allows you to set the maximum number of users allowed in the channel. + + AnimationTextObject + + %1 / %2 + + + AudioInput @@ -2994,6 +3001,10 @@ Er du sikker på du vil erstatte dit certifikat? This server does not allow sending images. + + Unable to read animated image file: %1 + + ClientUser @@ -5471,10 +5482,6 @@ Otherwise abort and check your certificate and username. Wrong server password for unregistered user account, please try again. Forkert serveradgangskode for uregistreret brugerkonto, prøv venligst igen. - - Images (*.png *.jpg *.jpeg) - Billeder (*.png *.jpg *.jpeg) - C&onfigure K&onfigurér @@ -7067,6 +7074,14 @@ Valid options are: This could be caused by one of the following scenarios:<ul><li>Your client and the server use different encryption standards. This could be because you are using a very old client or the server you are connecting to is very old. In the first case, you should update your client and in the second case you should contact the server administrator so that they can update their server.</li><li>Either your client or the server is using an old operating system that doesn't provide up-to-date encryption methods. In this case you should consider updating your OS or contacting the server admin so that they can update theirs.</li><li>The server you are connecting to isn't actually a Mumble server. Please ensure that the used server address really belongs to a Mumble server and not e.g. to a game server.</li><li>The port you are connecting to does not belong to a Mumble server but instead is bound to a completely unrelated process on the server-side. Please double-check you have used the correct port.</li></ul> + + %1 Video Controls + + + + Images (*.png *.jpg *.jpeg *.gif) + + Manual diff --git a/src/mumble/mumble_de.ts b/src/mumble/mumble_de.ts index c56e7a9e3f..34ab811225 100644 --- a/src/mumble/mumble_de.ts +++ b/src/mumble/mumble_de.ts @@ -710,6 +710,13 @@ Dieser Wert erlaubt das Einstellen der maximal im Kanal erlaubten Benutzeranzahl Eine Auflistung aller Mitwirkenden ist unter <a href="https://github.com/mumble-voip/mumble/graphs/contributors">https://github.com/mumble-voip/mumble/graphs/contributors</a> zu finden + + AnimationTextObject + + %1 / %2 + + + AudioInput @@ -2995,6 +3002,10 @@ Sind Sie sicher, dass Sie Ihr Zertifikat ersetzen möchten? This server does not allow sending images. Dieser Server erlaubt das Senden von Bildern nicht. + + Unable to read animated image file: %1 + + ClientUser @@ -5482,10 +5493,6 @@ Falls nicht, brechen Sie ab und überprüfen Sie Ihr Zertifikat und Ihren Benutz Wrong server password for unregistered user account, please try again. Falsches Serverpasswort für unregistrierte Benutzer. Bitte versuchen Sie es noch einmal. - - Images (*.png *.jpg *.jpeg) - Bilder (*.png *.jpg *.jpeg) - C&onfigure K&onfiguration @@ -7158,6 +7165,14 @@ Gültige Optionen sind: This could be caused by one of the following scenarios:<ul><li>Your client and the server use different encryption standards. This could be because you are using a very old client or the server you are connecting to is very old. In the first case, you should update your client and in the second case you should contact the server administrator so that they can update their server.</li><li>Either your client or the server is using an old operating system that doesn't provide up-to-date encryption methods. In this case you should consider updating your OS or contacting the server admin so that they can update theirs.</li><li>The server you are connecting to isn't actually a Mumble server. Please ensure that the used server address really belongs to a Mumble server and not e.g. to a game server.</li><li>The port you are connecting to does not belong to a Mumble server but instead is bound to a completely unrelated process on the server-side. Please double-check you have used the correct port.</li></ul> + + %1 Video Controls + + + + Images (*.png *.jpg *.jpeg *.gif) + + Manual diff --git a/src/mumble/mumble_el.ts b/src/mumble/mumble_el.ts index 66ff9c8ac6..187604c59b 100644 --- a/src/mumble/mumble_el.ts +++ b/src/mumble/mumble_el.ts @@ -710,6 +710,13 @@ This value allows you to set the maximum number of users allowed in the channel. Για μια λίστα συγγραφέων, ανατρέξτε στο <a href="https://github.com/mumble-voip/mumble/graphs/contributors">https://github.com/mumble-voip/mumble/graphs/contributors</a> + + AnimationTextObject + + %1 / %2 + + + AudioInput @@ -2995,6 +3002,10 @@ Are you sure you wish to replace your certificate? This server does not allow sending images. Αυτός ο διακομιστής δεν επιτρέπει αποστολή εικόνων. + + Unable to read animated image file: %1 + + ClientUser @@ -5482,10 +5493,6 @@ Otherwise abort and check your certificate and username. Wrong server password for unregistered user account, please try again. Λάθος κωδικός πρόσβασης διακομιστή για μη εγγραμμένο λογαριασμό χρήστη, δοκιμάστε ξανά. - - Images (*.png *.jpg *.jpeg) - Εικόνες (*.png *.jpg *.jpeg) - C&onfigure Δ&ιαμόρφωση @@ -7165,6 +7172,14 @@ mumble://[<username>[:<password>]@]<host>[:<port>][/< This could be caused by one of the following scenarios:<ul><li>Your client and the server use different encryption standards. This could be because you are using a very old client or the server you are connecting to is very old. In the first case, you should update your client and in the second case you should contact the server administrator so that they can update their server.</li><li>Either your client or the server is using an old operating system that doesn't provide up-to-date encryption methods. In this case you should consider updating your OS or contacting the server admin so that they can update theirs.</li><li>The server you are connecting to isn't actually a Mumble server. Please ensure that the used server address really belongs to a Mumble server and not e.g. to a game server.</li><li>The port you are connecting to does not belong to a Mumble server but instead is bound to a completely unrelated process on the server-side. Please double-check you have used the correct port.</li></ul> + + %1 Video Controls + + + + Images (*.png *.jpg *.jpeg *.gif) + + Manual diff --git a/src/mumble/mumble_en.ts b/src/mumble/mumble_en.ts index c555e15c75..bba5d853a2 100644 --- a/src/mumble/mumble_en.ts +++ b/src/mumble/mumble_en.ts @@ -702,6 +702,13 @@ This value allows you to set the maximum number of users allowed in the channel. + + AnimationTextObject + + %1 / %2 + + + AudioInput @@ -2953,6 +2960,10 @@ Are you sure you wish to replace your certificate? This server does not allow sending images. + + Unable to read animated image file: %1 + + ClientUser @@ -5417,10 +5428,6 @@ Otherwise abort and check your certificate and username. Wrong server password for unregistered user account, please try again. - - Images (*.png *.jpg *.jpeg) - - C&onfigure @@ -7010,6 +7017,14 @@ Valid options are: This could be caused by one of the following scenarios:<ul><li>Your client and the server use different encryption standards. This could be because you are using a very old client or the server you are connecting to is very old. In the first case, you should update your client and in the second case you should contact the server administrator so that they can update their server.</li><li>Either your client or the server is using an old operating system that doesn't provide up-to-date encryption methods. In this case you should consider updating your OS or contacting the server admin so that they can update theirs.</li><li>The server you are connecting to isn't actually a Mumble server. Please ensure that the used server address really belongs to a Mumble server and not e.g. to a game server.</li><li>The port you are connecting to does not belong to a Mumble server but instead is bound to a completely unrelated process on the server-side. Please double-check you have used the correct port.</li></ul> + + %1 Video Controls + + + + Images (*.png *.jpg *.jpeg *.gif) + + Manual diff --git a/src/mumble/mumble_en_GB.ts b/src/mumble/mumble_en_GB.ts index e767f0cb12..c24c8fef16 100644 --- a/src/mumble/mumble_en_GB.ts +++ b/src/mumble/mumble_en_GB.ts @@ -710,6 +710,13 @@ This value allows you to set the maximum number of users allowed in the channel. For a list of authors, please see <a href="https://github.com/mumble-voip/mumble/graphs/contributors">https://github.com/mumble-voip/mumble/graphs/contributors</a> + + AnimationTextObject + + %1 / %2 + + + AudioInput @@ -1677,7 +1684,7 @@ This value allows you to set the maximum number of users allowed in the channel. milliseconds - + milliseconds meters @@ -2232,11 +2239,11 @@ Speak loudly as if you are annoyed or excited. Decrease the volume in the sound Audio output system - + Audio output system Audio output device - + Audio output device The Mumble positional audio system enables users to link the relative position of their voice to third party applications such as games. @@ -2252,7 +2259,7 @@ Speak loudly as if you are annoyed or excited. Decrease the volume in the sound Speech is dynamically amplified by at most this amount - + Speech is dynamically amplified by at most this amount Voice activity detection level @@ -2995,6 +3002,10 @@ Are you sure you wish to replace your certificate? This server does not allow sending images. This server does not allow sending images. + + Unable to read animated image file: %1 + + ClientUser @@ -4494,7 +4505,7 @@ This setting only applies to new messages; existing messages keep the previous t decibels - + decibels @@ -5471,10 +5482,6 @@ Otherwise abort and check your certificate and username. Wrong server password for unregistered user account, please try again. - - Images (*.png *.jpg *.jpeg) - - C&onfigure @@ -7064,6 +7071,14 @@ Valid options are: This could be caused by one of the following scenarios:<ul><li>Your client and the server use different encryption standards. This could be because you are using a very old client or the server you are connecting to is very old. In the first case, you should update your client and in the second case you should contact the server administrator so that they can update their server.</li><li>Either your client or the server is using an old operating system that doesn't provide up-to-date encryption methods. In this case you should consider updating your OS or contacting the server admin so that they can update theirs.</li><li>The server you are connecting to isn't actually a Mumble server. Please ensure that the used server address really belongs to a Mumble server and not e.g. to a game server.</li><li>The port you are connecting to does not belong to a Mumble server but instead is bound to a completely unrelated process on the server-side. Please double-check you have used the correct port.</li></ul> + + %1 Video Controls + + + + Images (*.png *.jpg *.jpeg *.gif) + + Manual diff --git a/src/mumble/mumble_eo.ts b/src/mumble/mumble_eo.ts index 1528944ce2..b62282cc86 100644 --- a/src/mumble/mumble_eo.ts +++ b/src/mumble/mumble_eo.ts @@ -710,6 +710,13 @@ This value allows you to set the maximum number of users allowed in the channel. + + AnimationTextObject + + %1 / %2 + + + AudioInput @@ -2962,6 +2969,10 @@ Are you sure you wish to replace your certificate? This server does not allow sending images. + + Unable to read animated image file: %1 + + ClientUser @@ -5429,10 +5440,6 @@ Otherwise abort and check your certificate and username. Wrong server password for unregistered user account, please try again. - - Images (*.png *.jpg *.jpeg) - Bildoj (*.png *.jpg *.jpeg) - C&onfigure Ag&ordi @@ -7023,6 +7030,14 @@ Valid options are: This could be caused by one of the following scenarios:<ul><li>Your client and the server use different encryption standards. This could be because you are using a very old client or the server you are connecting to is very old. In the first case, you should update your client and in the second case you should contact the server administrator so that they can update their server.</li><li>Either your client or the server is using an old operating system that doesn't provide up-to-date encryption methods. In this case you should consider updating your OS or contacting the server admin so that they can update theirs.</li><li>The server you are connecting to isn't actually a Mumble server. Please ensure that the used server address really belongs to a Mumble server and not e.g. to a game server.</li><li>The port you are connecting to does not belong to a Mumble server but instead is bound to a completely unrelated process on the server-side. Please double-check you have used the correct port.</li></ul> + + %1 Video Controls + + + + Images (*.png *.jpg *.jpeg *.gif) + + Manual diff --git a/src/mumble/mumble_es.ts b/src/mumble/mumble_es.ts index fe80d06fce..e608d1fbe8 100644 --- a/src/mumble/mumble_es.ts +++ b/src/mumble/mumble_es.ts @@ -710,6 +710,13 @@ Este valor permite fijar el número máximo de usuarios permitidos en el canal. Para consultar la lista de autores, véase <a href="https://github.com/mumble-voip/mumble/graphs/contributors">https://github.com/mumble-voip/mumble/graphs/contributors</a> + + AnimationTextObject + + %1 / %2 + + + AudioInput @@ -2995,6 +3002,10 @@ Are you sure you wish to replace your certificate? This server does not allow sending images. Este servidor no permite enviar imágenes. + + Unable to read animated image file: %1 + + ClientUser @@ -5483,10 +5494,6 @@ De lo contrario, aborte y compruebe su certificado y nombre de usuario.Wrong server password for unregistered user account, please try again. Contraseña del servidor incorrecta para cuenta de usuario no registrada, por favor, inténtelo de nuevo. - - Images (*.png *.jpg *.jpeg) - Imágenes (*.png *.jpg *.jpeg) - C&onfigure C&onfigurar @@ -7166,6 +7173,14 @@ Las opciones válidas son: This could be caused by one of the following scenarios:<ul><li>Your client and the server use different encryption standards. This could be because you are using a very old client or the server you are connecting to is very old. In the first case, you should update your client and in the second case you should contact the server administrator so that they can update their server.</li><li>Either your client or the server is using an old operating system that doesn't provide up-to-date encryption methods. In this case you should consider updating your OS or contacting the server admin so that they can update theirs.</li><li>The server you are connecting to isn't actually a Mumble server. Please ensure that the used server address really belongs to a Mumble server and not e.g. to a game server.</li><li>The port you are connecting to does not belong to a Mumble server but instead is bound to a completely unrelated process on the server-side. Please double-check you have used the correct port.</li></ul> Esto podría deberse a uno de los siguientes escenarios:<ul><li>El cliente y el servidor usan estándares de cifrado diferentes. Esto puede deberse a que está utilizando un cliente muy antiguo o el servidor al que se está conectando es muy antiguo. En el primer caso, debe actualizar su cliente y en el segundo caso debe ponerse en contacto con el administrador del servidor para que pueda actualizar su servidor.</li><li>El cliente o el servidor utilizan un sistema operativo antiguo que no proporciona métodos de cifrado actualizados. En este caso, debe considerar actualizar su sistema operativo o ponerse en contacto con el administrador del servidor para que pueda actualizar el suyo.</li><li>El servidor al que te estás conectando no es en realidad un servidor Mumble. Asegúrese de que la dirección del servidor utilizada pertenezca realmente a un servidor de Mumble y no, por ejemplo, a un servidor de juegos.</li><li>El puerto al que se está conectando no pertenece a un servidor Mumble, sino que está vinculado a un proceso completamente no relacionado en el lado del servidor. Por favor, compruebe dos veces que ha utilizado el puerto correcto. </li></ul> + + %1 Video Controls + + + + Images (*.png *.jpg *.jpeg *.gif) + + Manual diff --git a/src/mumble/mumble_et.ts b/src/mumble/mumble_et.ts index b080179def..d10a9c460e 100644 --- a/src/mumble/mumble_et.ts +++ b/src/mumble/mumble_et.ts @@ -703,6 +703,13 @@ This value allows you to set the maximum number of users allowed in the channel. + + AnimationTextObject + + %1 / %2 + + + AudioInput @@ -2955,6 +2962,10 @@ Are you sure you wish to replace your certificate? This server does not allow sending images. + + Unable to read animated image file: %1 + + ClientUser @@ -5419,10 +5430,6 @@ Otherwise abort and check your certificate and username. Wrong server password for unregistered user account, please try again. - - Images (*.png *.jpg *.jpeg) - - C&onfigure &Seadista @@ -7012,6 +7019,14 @@ Valid options are: This could be caused by one of the following scenarios:<ul><li>Your client and the server use different encryption standards. This could be because you are using a very old client or the server you are connecting to is very old. In the first case, you should update your client and in the second case you should contact the server administrator so that they can update their server.</li><li>Either your client or the server is using an old operating system that doesn't provide up-to-date encryption methods. In this case you should consider updating your OS or contacting the server admin so that they can update theirs.</li><li>The server you are connecting to isn't actually a Mumble server. Please ensure that the used server address really belongs to a Mumble server and not e.g. to a game server.</li><li>The port you are connecting to does not belong to a Mumble server but instead is bound to a completely unrelated process on the server-side. Please double-check you have used the correct port.</li></ul> + + %1 Video Controls + + + + Images (*.png *.jpg *.jpeg *.gif) + + Manual diff --git a/src/mumble/mumble_eu.ts b/src/mumble/mumble_eu.ts index 0e2c891155..08aa19b163 100644 --- a/src/mumble/mumble_eu.ts +++ b/src/mumble/mumble_eu.ts @@ -712,6 +712,13 @@ This value allows you to set the maximum number of users allowed in the channel. + + AnimationTextObject + + %1 / %2 + + + AudioInput @@ -2965,6 +2972,10 @@ adierazten du. This server does not allow sending images. + + Unable to read animated image file: %1 + + ClientUser @@ -5436,10 +5447,6 @@ Otherwise abort and check your certificate and username. Wrong server password for unregistered user account, please try again. Zerbitzariko pasahitz okerra erregistratu gabeko erabiltzaile konturako, mesedez saiatu berriz. - - Images (*.png *.jpg *.jpeg) - Irudiak (*.png *.jpg *.jpeg) - C&onfigure Ezarpenak @@ -7032,6 +7039,14 @@ Valid options are: This could be caused by one of the following scenarios:<ul><li>Your client and the server use different encryption standards. This could be because you are using a very old client or the server you are connecting to is very old. In the first case, you should update your client and in the second case you should contact the server administrator so that they can update their server.</li><li>Either your client or the server is using an old operating system that doesn't provide up-to-date encryption methods. In this case you should consider updating your OS or contacting the server admin so that they can update theirs.</li><li>The server you are connecting to isn't actually a Mumble server. Please ensure that the used server address really belongs to a Mumble server and not e.g. to a game server.</li><li>The port you are connecting to does not belong to a Mumble server but instead is bound to a completely unrelated process on the server-side. Please double-check you have used the correct port.</li></ul> + + %1 Video Controls + + + + Images (*.png *.jpg *.jpeg *.gif) + + Manual diff --git a/src/mumble/mumble_fa_IR.ts b/src/mumble/mumble_fa_IR.ts index 69b301bd88..d738069d7a 100644 --- a/src/mumble/mumble_fa_IR.ts +++ b/src/mumble/mumble_fa_IR.ts @@ -704,6 +704,13 @@ This value allows you to set the maximum number of users allowed in the channel. + + AnimationTextObject + + %1 / %2 + + + AudioInput @@ -2955,6 +2962,10 @@ Are you sure you wish to replace your certificate? This server does not allow sending images. + + Unable to read animated image file: %1 + + ClientUser @@ -5419,10 +5430,6 @@ Otherwise abort and check your certificate and username. Wrong server password for unregistered user account, please try again. - - Images (*.png *.jpg *.jpeg) - - C&onfigure @@ -7012,6 +7019,14 @@ Valid options are: This could be caused by one of the following scenarios:<ul><li>Your client and the server use different encryption standards. This could be because you are using a very old client or the server you are connecting to is very old. In the first case, you should update your client and in the second case you should contact the server administrator so that they can update their server.</li><li>Either your client or the server is using an old operating system that doesn't provide up-to-date encryption methods. In this case you should consider updating your OS or contacting the server admin so that they can update theirs.</li><li>The server you are connecting to isn't actually a Mumble server. Please ensure that the used server address really belongs to a Mumble server and not e.g. to a game server.</li><li>The port you are connecting to does not belong to a Mumble server but instead is bound to a completely unrelated process on the server-side. Please double-check you have used the correct port.</li></ul> + + %1 Video Controls + + + + Images (*.png *.jpg *.jpeg *.gif) + + Manual diff --git a/src/mumble/mumble_fi.ts b/src/mumble/mumble_fi.ts index f10a20b6ea..fdb9cbd6b2 100644 --- a/src/mumble/mumble_fi.ts +++ b/src/mumble/mumble_fi.ts @@ -710,6 +710,13 @@ Tämän numeron ollessa suurempi kuin nolla kanava sallii enintään numeron suu Katso tekijät osoitteesta <a href="https://github.com/mumble-voip/mumble/graphs/contributors">https://github.com/mumble-voip/mumble/graphs/contributors</a> + + AnimationTextObject + + %1 / %2 + + + AudioInput @@ -2995,6 +3002,10 @@ Haluatko varmasti korvata varmenteen? This server does not allow sending images. Tämä palvelin ei salli kuvien lähettämistä. + + Unable to read animated image file: %1 + + ClientUser @@ -5482,10 +5493,6 @@ Muutoin keskeytä ja tarkista varmenteesi sekä käyttäjänimesi. Wrong server password for unregistered user account, please try again. Väärä palvelin salasana rekisteröimättömällä käyttäjätilillä, ole hyvä ja yritä uudelleen. - - Images (*.png *.jpg *.jpeg) - Kuvat (*.png *.jpg *.jpeg) - C&onfigure K&onfiguroi @@ -7164,6 +7171,14 @@ Hyväksytyt valinnat ovat This could be caused by one of the following scenarios:<ul><li>Your client and the server use different encryption standards. This could be because you are using a very old client or the server you are connecting to is very old. In the first case, you should update your client and in the second case you should contact the server administrator so that they can update their server.</li><li>Either your client or the server is using an old operating system that doesn't provide up-to-date encryption methods. In this case you should consider updating your OS or contacting the server admin so that they can update theirs.</li><li>The server you are connecting to isn't actually a Mumble server. Please ensure that the used server address really belongs to a Mumble server and not e.g. to a game server.</li><li>The port you are connecting to does not belong to a Mumble server but instead is bound to a completely unrelated process on the server-side. Please double-check you have used the correct port.</li></ul> Tämä voi johtua jostakin seuraavista tilanteista:<ul><li>Asiakkaasi ja palvelin käyttävät erilaisia salausstandardeja. Tämä voi johtua siitä, että käytät erittäin vanhaa asiakasta tai palvelin, johon muodostat yhteyden, on hyvin vanha. Ensimmäisessä tapauksessa sinun tulee päivittää asiakasohjelmasi ja toisessa tapauksessa ottaa yhteyttä palvelimen järjestelmänvalvojaan, jotta hän voi päivittää palvelimensa.</li><li>Joko asiakkaasi tai palvelin käyttää vanhaa käyttöjärjestelmää, joka ei tarjoa ajan tasalla olevia salausmenetelmiä. Tässä tapauksessa sinun kannattaa harkita käyttöjärjestelmän päivittämistä tai ottaa yhteyttä palvelimen järjestelmänvalvojaan, jotta he voivat päivittää omansa.</li><li>Palvelin, johon muodostat yhteyden, ei ole itse asiassa Mumble-palvelin. Varmista, että käytetty palvelinosoite todella kuuluu Mumble-palvelimelle eikä esim. pelipalvelimelle.</li><li>Portti, johon muodostat yhteyden, ei kuulu Mumble-palvelimelle, vaan se on sidottu täysin asiaankuulumattomaan palvelinpuolen prosessiin. Tarkista, että olet käyttänyt oikeaa porttia.</li></ul> + + %1 Video Controls + + + + Images (*.png *.jpg *.jpeg *.gif) + + Manual diff --git a/src/mumble/mumble_fr.ts b/src/mumble/mumble_fr.ts index 9945d04907..d232e08c22 100644 --- a/src/mumble/mumble_fr.ts +++ b/src/mumble/mumble_fr.ts @@ -710,6 +710,13 @@ Cette valeur vous permet de définir un nombre maximum d'utilisateurs autor Pour une liste des auteurs, voyez <a href="https://github.com/mumble-voip/mumble/graphs/contributors">https://github.com/mumble-voip/mumble/graphs/contributors</a> + + AnimationTextObject + + %1 / %2 + + + AudioInput @@ -2995,6 +3002,10 @@ Are you sure you wish to replace your certificate? This server does not allow sending images. Ce serveur n'autorise pas l'envoi d'image. + + Unable to read animated image file: %1 + + ClientUser @@ -5482,10 +5493,6 @@ veuillez réessayer. Sinon annulez et vérifiez votre certificat et nom d'u Wrong server password for unregistered user account, please try again. Mauvais mot de passe de serveur pour un utilisateur non enregistré, veuillez essayer à nouveau. - - Images (*.png *.jpg *.jpeg) - Images (*.png *.jpg *.jpeg) - C&onfigure C&onfigurer @@ -7172,6 +7179,14 @@ Les options valides sont : This could be caused by one of the following scenarios:<ul><li>Your client and the server use different encryption standards. This could be because you are using a very old client or the server you are connecting to is very old. In the first case, you should update your client and in the second case you should contact the server administrator so that they can update their server.</li><li>Either your client or the server is using an old operating system that doesn't provide up-to-date encryption methods. In this case you should consider updating your OS or contacting the server admin so that they can update theirs.</li><li>The server you are connecting to isn't actually a Mumble server. Please ensure that the used server address really belongs to a Mumble server and not e.g. to a game server.</li><li>The port you are connecting to does not belong to a Mumble server but instead is bound to a completely unrelated process on the server-side. Please double-check you have used the correct port.</li></ul> + + %1 Video Controls + + + + Images (*.png *.jpg *.jpeg *.gif) + + Manual diff --git a/src/mumble/mumble_gl.ts b/src/mumble/mumble_gl.ts index 9be341c1ff..2f613e9b63 100644 --- a/src/mumble/mumble_gl.ts +++ b/src/mumble/mumble_gl.ts @@ -704,6 +704,13 @@ This value allows you to set the maximum number of users allowed in the channel. + + AnimationTextObject + + %1 / %2 + + + AudioInput @@ -2956,6 +2963,10 @@ Are you sure you wish to replace your certificate? This server does not allow sending images. + + Unable to read animated image file: %1 + + ClientUser @@ -5420,10 +5431,6 @@ Otherwise abort and check your certificate and username. Wrong server password for unregistered user account, please try again. - - Images (*.png *.jpg *.jpeg) - - C&onfigure @@ -7013,6 +7020,14 @@ Valid options are: This could be caused by one of the following scenarios:<ul><li>Your client and the server use different encryption standards. This could be because you are using a very old client or the server you are connecting to is very old. In the first case, you should update your client and in the second case you should contact the server administrator so that they can update their server.</li><li>Either your client or the server is using an old operating system that doesn't provide up-to-date encryption methods. In this case you should consider updating your OS or contacting the server admin so that they can update theirs.</li><li>The server you are connecting to isn't actually a Mumble server. Please ensure that the used server address really belongs to a Mumble server and not e.g. to a game server.</li><li>The port you are connecting to does not belong to a Mumble server but instead is bound to a completely unrelated process on the server-side. Please double-check you have used the correct port.</li></ul> + + %1 Video Controls + + + + Images (*.png *.jpg *.jpeg *.gif) + + Manual diff --git a/src/mumble/mumble_he.ts b/src/mumble/mumble_he.ts index 9b699aaf44..c479ad7c2c 100644 --- a/src/mumble/mumble_he.ts +++ b/src/mumble/mumble_he.ts @@ -711,6 +711,13 @@ This value allows you to set the maximum number of users allowed in the channel. + + AnimationTextObject + + %1 / %2 + + + AudioInput @@ -2992,6 +2999,10 @@ Are you sure you wish to replace your certificate? This server does not allow sending images. + + Unable to read animated image file: %1 + + ClientUser @@ -5468,10 +5479,6 @@ Otherwise abort and check your certificate and username. Wrong server password for unregistered user account, please try again. <p dir="RTL">הסיסמה שהזנתם אינה נכונה, אנא נסו שנית.</p> - - Images (*.png *.jpg *.jpeg) - תמונות (‎*.png *.jpg *.jpeg) - C&onfigure &תצורה @@ -7063,6 +7070,14 @@ Valid options are: This could be caused by one of the following scenarios:<ul><li>Your client and the server use different encryption standards. This could be because you are using a very old client or the server you are connecting to is very old. In the first case, you should update your client and in the second case you should contact the server administrator so that they can update their server.</li><li>Either your client or the server is using an old operating system that doesn't provide up-to-date encryption methods. In this case you should consider updating your OS or contacting the server admin so that they can update theirs.</li><li>The server you are connecting to isn't actually a Mumble server. Please ensure that the used server address really belongs to a Mumble server and not e.g. to a game server.</li><li>The port you are connecting to does not belong to a Mumble server but instead is bound to a completely unrelated process on the server-side. Please double-check you have used the correct port.</li></ul> + + %1 Video Controls + + + + Images (*.png *.jpg *.jpeg *.gif) + + Manual diff --git a/src/mumble/mumble_hi.ts b/src/mumble/mumble_hi.ts index 9581fb3a19..2fcca518a4 100644 --- a/src/mumble/mumble_hi.ts +++ b/src/mumble/mumble_hi.ts @@ -698,6 +698,13 @@ Contains the list of members inherited by the current channel. Uncheck <i> + + AnimationTextObject + + %1 / %2 + + + AudioInput @@ -2935,6 +2942,10 @@ Are you sure you wish to replace your certificate? This server does not allow sending images. + + Unable to read animated image file: %1 + + ClientUser @@ -5859,10 +5870,6 @@ Valid actions are: Save Image File - - Images (*.png *.jpg *.jpeg) - - Could not save image: %1 @@ -6974,6 +6981,14 @@ Valid options are: This could be caused by one of the following scenarios:<ul><li>Your client and the server use different encryption standards. This could be because you are using a very old client or the server you are connecting to is very old. In the first case, you should update your client and in the second case you should contact the server administrator so that they can update their server.</li><li>Either your client or the server is using an old operating system that doesn't provide up-to-date encryption methods. In this case you should consider updating your OS or contacting the server admin so that they can update theirs.</li><li>The server you are connecting to isn't actually a Mumble server. Please ensure that the used server address really belongs to a Mumble server and not e.g. to a game server.</li><li>The port you are connecting to does not belong to a Mumble server but instead is bound to a completely unrelated process on the server-side. Please double-check you have used the correct port.</li></ul> + + %1 Video Controls + + + + Images (*.png *.jpg *.jpeg *.gif) + + Manual diff --git a/src/mumble/mumble_hu.ts b/src/mumble/mumble_hu.ts index 1d6a7e3d8d..a7eeafb456 100644 --- a/src/mumble/mumble_hu.ts +++ b/src/mumble/mumble_hu.ts @@ -706,6 +706,13 @@ This value allows you to set the maximum number of users allowed in the channel. + + AnimationTextObject + + %1 / %2 + + + AudioInput @@ -2984,6 +2991,10 @@ Biztos abban, hogy le akarja cserélni a tanúsítványát? This server does not allow sending images. A kiszolgáló nem támogatja képfájlok küldését. + + Unable to read animated image file: %1 + + ClientUser @@ -5468,10 +5479,6 @@ Ha nem ön az, ellenőrizze a felhasználónevét és a tanúsítványt!Wrong server password for unregistered user account, please try again. A nem regisztrált felhasználói jelszó hibás, próbálja újra. - - Images (*.png *.jpg *.jpeg) - Képfájl (*.png *.jpg *.jpeg) - C&onfigure &Beállítások @@ -7063,6 +7070,14 @@ Valid options are: This could be caused by one of the following scenarios:<ul><li>Your client and the server use different encryption standards. This could be because you are using a very old client or the server you are connecting to is very old. In the first case, you should update your client and in the second case you should contact the server administrator so that they can update their server.</li><li>Either your client or the server is using an old operating system that doesn't provide up-to-date encryption methods. In this case you should consider updating your OS or contacting the server admin so that they can update theirs.</li><li>The server you are connecting to isn't actually a Mumble server. Please ensure that the used server address really belongs to a Mumble server and not e.g. to a game server.</li><li>The port you are connecting to does not belong to a Mumble server but instead is bound to a completely unrelated process on the server-side. Please double-check you have used the correct port.</li></ul> + + %1 Video Controls + + + + Images (*.png *.jpg *.jpeg *.gif) + + Manual diff --git a/src/mumble/mumble_it.ts b/src/mumble/mumble_it.ts index 8605e036eb..ef9a779b17 100644 --- a/src/mumble/mumble_it.ts +++ b/src/mumble/mumble_it.ts @@ -710,6 +710,13 @@ Questo valore ti permette di impostare il numero massimo di utenti consentiti ne Per la lista degli autori, per favore consulta <a href="https://github.com/mumble-voip/mumble/graphs/contributors">https://github.com/mumble-voip/mumble/graphs/contributors</a> + + AnimationTextObject + + %1 / %2 + + + AudioInput @@ -2995,6 +3002,10 @@ Sei sicuro di voler sostituire il tuo certificato? This server does not allow sending images. Il server non permette l'invio di immagini. + + Unable to read animated image file: %1 + + ClientUser @@ -5482,10 +5493,6 @@ Altrimenti annulla e controlla il tuo certificato ed il nome utente.Wrong server password for unregistered user account, please try again. Password errata per un account non registrato, prova di nuovo. - - Images (*.png *.jpg *.jpeg) - Immagini (*.png *.jpg *.jpeg) - C&onfigure &Impostazioni @@ -7105,6 +7112,14 @@ Valid options are: This could be caused by one of the following scenarios:<ul><li>Your client and the server use different encryption standards. This could be because you are using a very old client or the server you are connecting to is very old. In the first case, you should update your client and in the second case you should contact the server administrator so that they can update their server.</li><li>Either your client or the server is using an old operating system that doesn't provide up-to-date encryption methods. In this case you should consider updating your OS or contacting the server admin so that they can update theirs.</li><li>The server you are connecting to isn't actually a Mumble server. Please ensure that the used server address really belongs to a Mumble server and not e.g. to a game server.</li><li>The port you are connecting to does not belong to a Mumble server but instead is bound to a completely unrelated process on the server-side. Please double-check you have used the correct port.</li></ul> + + %1 Video Controls + + + + Images (*.png *.jpg *.jpeg *.gif) + + Manual diff --git a/src/mumble/mumble_ja.ts b/src/mumble/mumble_ja.ts index 8c9676def7..46b71ced2b 100644 --- a/src/mumble/mumble_ja.ts +++ b/src/mumble/mumble_ja.ts @@ -711,6 +711,13 @@ This value allows you to set the maximum number of users allowed in the channel. + + AnimationTextObject + + %1 / %2 + + + AudioInput @@ -2990,6 +2997,10 @@ Are you sure you wish to replace your certificate? This server does not allow sending images. + + Unable to read animated image file: %1 + + ClientUser @@ -5467,10 +5478,6 @@ Otherwise abort and check your certificate and username. Wrong server password for unregistered user account, please try again. 未登録ユーザのパスワードが違います。再度試してください。 - - Images (*.png *.jpg *.jpeg) - - C&onfigure 設定(&O) @@ -7061,6 +7068,14 @@ Valid options are: This could be caused by one of the following scenarios:<ul><li>Your client and the server use different encryption standards. This could be because you are using a very old client or the server you are connecting to is very old. In the first case, you should update your client and in the second case you should contact the server administrator so that they can update their server.</li><li>Either your client or the server is using an old operating system that doesn't provide up-to-date encryption methods. In this case you should consider updating your OS or contacting the server admin so that they can update theirs.</li><li>The server you are connecting to isn't actually a Mumble server. Please ensure that the used server address really belongs to a Mumble server and not e.g. to a game server.</li><li>The port you are connecting to does not belong to a Mumble server but instead is bound to a completely unrelated process on the server-side. Please double-check you have used the correct port.</li></ul> + + %1 Video Controls + + + + Images (*.png *.jpg *.jpeg *.gif) + + Manual diff --git a/src/mumble/mumble_ko.ts b/src/mumble/mumble_ko.ts index d8b92d7378..f06943297d 100644 --- a/src/mumble/mumble_ko.ts +++ b/src/mumble/mumble_ko.ts @@ -710,6 +710,13 @@ This value allows you to set the maximum number of users allowed in the channel. + + AnimationTextObject + + %1 / %2 + + + AudioInput @@ -2994,6 +3001,10 @@ Are you sure you wish to replace your certificate? This server does not allow sending images. 이 서버는 이미지 보내기를 허용하지 않습니다. + + Unable to read animated image file: %1 + + ClientUser @@ -5481,10 +5492,6 @@ Otherwise abort and check your certificate and username. Wrong server password for unregistered user account, please try again. 등록되지 않은 유저 계정의 서버 비밀번호가 잘못되었습니다. 다시 시도하세요. - - Images (*.png *.jpg *.jpeg) - 이미지 (*.png *.jpg *.jpeg) - C&onfigure 구성(&O) @@ -7104,6 +7111,14 @@ Valid options are: This could be caused by one of the following scenarios:<ul><li>Your client and the server use different encryption standards. This could be because you are using a very old client or the server you are connecting to is very old. In the first case, you should update your client and in the second case you should contact the server administrator so that they can update their server.</li><li>Either your client or the server is using an old operating system that doesn't provide up-to-date encryption methods. In this case you should consider updating your OS or contacting the server admin so that they can update theirs.</li><li>The server you are connecting to isn't actually a Mumble server. Please ensure that the used server address really belongs to a Mumble server and not e.g. to a game server.</li><li>The port you are connecting to does not belong to a Mumble server but instead is bound to a completely unrelated process on the server-side. Please double-check you have used the correct port.</li></ul> + + %1 Video Controls + + + + Images (*.png *.jpg *.jpeg *.gif) + + Manual diff --git a/src/mumble/mumble_lt.ts b/src/mumble/mumble_lt.ts index 373ca27471..2d72cdb0c3 100644 --- a/src/mumble/mumble_lt.ts +++ b/src/mumble/mumble_lt.ts @@ -706,6 +706,13 @@ This value allows you to set the maximum number of users allowed in the channel. + + AnimationTextObject + + %1 / %2 + + + AudioInput @@ -2986,6 +2993,10 @@ Ar tikrai norite pakeisti savo liudijimą? This server does not allow sending images. + + Unable to read animated image file: %1 + + ClientUser @@ -5451,10 +5462,6 @@ Otherwise abort and check your certificate and username. Wrong server password for unregistered user account, please try again. - - Images (*.png *.jpg *.jpeg) - Paveikslai (*.png *.jpg *.jpeg) - C&onfigure K&onfigūruoti @@ -7046,6 +7053,14 @@ Valid options are: This could be caused by one of the following scenarios:<ul><li>Your client and the server use different encryption standards. This could be because you are using a very old client or the server you are connecting to is very old. In the first case, you should update your client and in the second case you should contact the server administrator so that they can update their server.</li><li>Either your client or the server is using an old operating system that doesn't provide up-to-date encryption methods. In this case you should consider updating your OS or contacting the server admin so that they can update theirs.</li><li>The server you are connecting to isn't actually a Mumble server. Please ensure that the used server address really belongs to a Mumble server and not e.g. to a game server.</li><li>The port you are connecting to does not belong to a Mumble server but instead is bound to a completely unrelated process on the server-side. Please double-check you have used the correct port.</li></ul> + + %1 Video Controls + + + + Images (*.png *.jpg *.jpeg *.gif) + + Manual diff --git a/src/mumble/mumble_nl.ts b/src/mumble/mumble_nl.ts index 5504ab1d24..e30bf08fe2 100644 --- a/src/mumble/mumble_nl.ts +++ b/src/mumble/mumble_nl.ts @@ -710,6 +710,13 @@ Deze waarde laat je toe om een maximum aantal gebruikers in te stellen voor het Voor een lijst van auteurs, zie <a href="https://github.com/mumble-voip/mumble/graphs/contributors">https://github.com/mumble-voip/mumble/graphs/contributors</a> + + AnimationTextObject + + %1 / %2 + + + AudioInput @@ -2995,6 +3002,10 @@ Weet je zeker dat je jouw certificaat wilt vervangen? This server does not allow sending images. Deze server laat het versturen van afbeeldingen niet toe. + + Unable to read animated image file: %1 + + ClientUser @@ -5482,10 +5493,6 @@ Indien niet, gelieve te annuleren en beide opnieuw te controleren. Wrong server password for unregistered user account, please try again. Verkeerd server-wachtwoord voor ongeregistreerde account, gelieve opnieuw te proberen. - - Images (*.png *.jpg *.jpeg) - Afbeeldingen (*.png *.jpg *.jpeg) - C&onfigure C&onfigureer @@ -7105,6 +7112,14 @@ Valid options are: This could be caused by one of the following scenarios:<ul><li>Your client and the server use different encryption standards. This could be because you are using a very old client or the server you are connecting to is very old. In the first case, you should update your client and in the second case you should contact the server administrator so that they can update their server.</li><li>Either your client or the server is using an old operating system that doesn't provide up-to-date encryption methods. In this case you should consider updating your OS or contacting the server admin so that they can update theirs.</li><li>The server you are connecting to isn't actually a Mumble server. Please ensure that the used server address really belongs to a Mumble server and not e.g. to a game server.</li><li>The port you are connecting to does not belong to a Mumble server but instead is bound to a completely unrelated process on the server-side. Please double-check you have used the correct port.</li></ul> + + %1 Video Controls + + + + Images (*.png *.jpg *.jpeg *.gif) + + Manual diff --git a/src/mumble/mumble_no.ts b/src/mumble/mumble_no.ts index 9cac68c894..b946a9b26f 100644 --- a/src/mumble/mumble_no.ts +++ b/src/mumble/mumble_no.ts @@ -710,6 +710,13 @@ Denne verdien gjør at du setter maksimalt antall brukere tillatt i kanalen. Hvi En liste over utviklere er å finne i <a href="https://github.com/mumble-voip/mumble/graphs/contributors">https://github.com/mumble-voip/mumble/graphs/contributors</a> + + AnimationTextObject + + %1 / %2 + + + AudioInput @@ -3009,6 +3016,10 @@ Er du sikker på at du vil erstatte ditt sertifikat? This server does not allow sending images. Tjeneren tillater ikke bildeforsendelse. + + Unable to read animated image file: %1 + + ClientUser @@ -5497,10 +5508,6 @@ Ellers avbryt alt og sjekk ditt sertifikat og brukernavn. Wrong server password for unregistered user account, please try again. Feil tjenerpassord for uregistrert brukerkonto, prøv igjen. - - Images (*.png *.jpg *.jpeg) - Bilder (*.png *.jpg *.jpeg) - C&onfigure &Sett opp @@ -7120,6 +7127,14 @@ Valid options are: This could be caused by one of the following scenarios:<ul><li>Your client and the server use different encryption standards. This could be because you are using a very old client or the server you are connecting to is very old. In the first case, you should update your client and in the second case you should contact the server administrator so that they can update their server.</li><li>Either your client or the server is using an old operating system that doesn't provide up-to-date encryption methods. In this case you should consider updating your OS or contacting the server admin so that they can update theirs.</li><li>The server you are connecting to isn't actually a Mumble server. Please ensure that the used server address really belongs to a Mumble server and not e.g. to a game server.</li><li>The port you are connecting to does not belong to a Mumble server but instead is bound to a completely unrelated process on the server-side. Please double-check you have used the correct port.</li></ul> + + %1 Video Controls + + + + Images (*.png *.jpg *.jpeg *.gif) + + Manual diff --git a/src/mumble/mumble_oc.ts b/src/mumble/mumble_oc.ts index 92da3eb6a0..38c778d267 100644 --- a/src/mumble/mumble_oc.ts +++ b/src/mumble/mumble_oc.ts @@ -703,6 +703,13 @@ This value allows you to set the maximum number of users allowed in the channel. + + AnimationTextObject + + %1 / %2 + + + AudioInput @@ -2955,6 +2962,10 @@ Are you sure you wish to replace your certificate? This server does not allow sending images. + + Unable to read animated image file: %1 + + ClientUser @@ -5419,10 +5430,6 @@ Otherwise abort and check your certificate and username. Wrong server password for unregistered user account, please try again. - - Images (*.png *.jpg *.jpeg) - Imatges (*.png *.jpg *.jpeg) - C&onfigure C&onfigurar @@ -7012,6 +7019,14 @@ Valid options are: This could be caused by one of the following scenarios:<ul><li>Your client and the server use different encryption standards. This could be because you are using a very old client or the server you are connecting to is very old. In the first case, you should update your client and in the second case you should contact the server administrator so that they can update their server.</li><li>Either your client or the server is using an old operating system that doesn't provide up-to-date encryption methods. In this case you should consider updating your OS or contacting the server admin so that they can update theirs.</li><li>The server you are connecting to isn't actually a Mumble server. Please ensure that the used server address really belongs to a Mumble server and not e.g. to a game server.</li><li>The port you are connecting to does not belong to a Mumble server but instead is bound to a completely unrelated process on the server-side. Please double-check you have used the correct port.</li></ul> + + %1 Video Controls + + + + Images (*.png *.jpg *.jpeg *.gif) + + Manual diff --git a/src/mumble/mumble_pl.ts b/src/mumble/mumble_pl.ts index 3aca6e4192..cce4c43509 100644 --- a/src/mumble/mumble_pl.ts +++ b/src/mumble/mumble_pl.ts @@ -710,6 +710,13 @@ Określa maksymalną dozwoloną liczbę użytkowników na tym kanale. Jeżeli wa Lista autorów znajduje się na stronie <a href="https://github.com/mumble-voip/mumble/graphs/contributors">https://github.com/mumble-voip/mumble/graphs/contributors</a> + + AnimationTextObject + + %1 / %2 + + + AudioInput @@ -2996,6 +3003,10 @@ Czy na pewno chcesz zastąpić swój bieżący certyfikat? This server does not allow sending images. Ten serwer nie pozwala na wysyłanie obrazów. + + Unable to read animated image file: %1 + + ClientUser @@ -5483,10 +5494,6 @@ W przeciwnym razie proszę przerwać i sprawdzić swój certyfikat oraz nazwę u Wrong server password for unregistered user account, please try again. Podałeś złe hasło dla niezarejestrowanych użytkowników, spróbuj jeszcze raz. - - Images (*.png *.jpg *.jpeg) - Obrazy (*.png *.jpg *.jpeg) - C&onfigure &Opcje @@ -7166,6 +7173,14 @@ Prawidłowe opcje to: This could be caused by one of the following scenarios:<ul><li>Your client and the server use different encryption standards. This could be because you are using a very old client or the server you are connecting to is very old. In the first case, you should update your client and in the second case you should contact the server administrator so that they can update their server.</li><li>Either your client or the server is using an old operating system that doesn't provide up-to-date encryption methods. In this case you should consider updating your OS or contacting the server admin so that they can update theirs.</li><li>The server you are connecting to isn't actually a Mumble server. Please ensure that the used server address really belongs to a Mumble server and not e.g. to a game server.</li><li>The port you are connecting to does not belong to a Mumble server but instead is bound to a completely unrelated process on the server-side. Please double-check you have used the correct port.</li></ul> Może to być spowodowane jednym z następujących scenariuszy:<ul><li>Twój klient i serwer używają różnych standardów szyfrowania. Może to być spowodowane tym, że używasz bardzo starego klienta lub serwer, z którym się łączysz, jest bardzo stary. W pierwszym przypadku należy zaktualizować swojego klienta, a w drugim przypadku należy skontaktować się z administratorem serwera, aby mógł zaktualizować swój serwer.</li><li>Twój klient lub serwer używa starego systemu operacyjnego, który nie zapewnia aktualnych metod szyfrowania. W takim przypadku należy rozważyć aktualizację swojego systemu operacyjnego lub skontaktować się z administratorem serwera, aby mógł zaktualizować swój.</li><li>Serwer, z którym się łączysz, nie jest w rzeczywistości serwerem Mumble. Upewnij się, że używany adres serwera rzeczywiście należy do serwera Mumble, a nie np. do serwera gier.</li><li>Port, z którym się łączysz, nie należy do serwera Mumble, ale jest powiązany z zupełnie niezwiązanym procesem po stronie serwera. Sprawdź dokładnie, czy używasz prawidłowego portu.</li></ul> + + %1 Video Controls + + + + Images (*.png *.jpg *.jpeg *.gif) + + Manual diff --git a/src/mumble/mumble_pt_BR.ts b/src/mumble/mumble_pt_BR.ts index ba7d41dd63..0a98318c66 100644 --- a/src/mumble/mumble_pt_BR.ts +++ b/src/mumble/mumble_pt_BR.ts @@ -710,6 +710,13 @@ Este valor permite que você especifique o número máximo de usuários permitid Para uma lista de autores, veja <a href="https://github.com/mumble-voip/mumble/graphs/contributors">https://github.com/mumble-voip/mumble/graphs/contributors</a> + + AnimationTextObject + + %1 / %2 + + + AudioInput @@ -2995,6 +3002,10 @@ Você tem certeza de que quer substituir o seu certificado? This server does not allow sending images. Este servidor não permite o envio de imagens. + + Unable to read animated image file: %1 + + ClientUser @@ -5482,10 +5493,6 @@ Caso contrário, aborte e verifique seu certificado e nome de usuário.Wrong server password for unregistered user account, please try again. Senha de servidor incorreta para conta de usuário não registrada, por favor tente novamente. - - Images (*.png *.jpg *.jpeg) - Imagens (*.png *.jpg *.jpeg) - C&onfigure C&onfigurar @@ -7105,6 +7112,14 @@ Valid options are: This could be caused by one of the following scenarios:<ul><li>Your client and the server use different encryption standards. This could be because you are using a very old client or the server you are connecting to is very old. In the first case, you should update your client and in the second case you should contact the server administrator so that they can update their server.</li><li>Either your client or the server is using an old operating system that doesn't provide up-to-date encryption methods. In this case you should consider updating your OS or contacting the server admin so that they can update theirs.</li><li>The server you are connecting to isn't actually a Mumble server. Please ensure that the used server address really belongs to a Mumble server and not e.g. to a game server.</li><li>The port you are connecting to does not belong to a Mumble server but instead is bound to a completely unrelated process on the server-side. Please double-check you have used the correct port.</li></ul> + + %1 Video Controls + + + + Images (*.png *.jpg *.jpeg *.gif) + + Manual diff --git a/src/mumble/mumble_pt_PT.ts b/src/mumble/mumble_pt_PT.ts index 90c2e438f0..3c4b1379e9 100644 --- a/src/mumble/mumble_pt_PT.ts +++ b/src/mumble/mumble_pt_PT.ts @@ -710,6 +710,13 @@ Este valor permite definir o número máximo de utilizadores permitido no canal. Para uma lista de autores, veja <a href="https://github.com/mumble-voip/mumble/graphs/contributors">https://github.com/mumble-voip/mumble/graphs/contributors</a> + + AnimationTextObject + + %1 / %2 + + + AudioInput @@ -2995,6 +3002,10 @@ Tem certeza de que quer substituir o seu certificado? This server does not allow sending images. Este servidor não permite o envio de imagens. + + Unable to read animated image file: %1 + + ClientUser @@ -5483,10 +5494,6 @@ o seu certificado e nome de utilizador. Wrong server password for unregistered user account, please try again. Palavra-passe de servidor errada para conta de utilizador não registado, por favor tente novamente. - - Images (*.png *.jpg *.jpeg) - Imagens (*.png *.jpg *.jpeg) - C&onfigure C&onfigurar @@ -7106,6 +7113,14 @@ Valid options are: This could be caused by one of the following scenarios:<ul><li>Your client and the server use different encryption standards. This could be because you are using a very old client or the server you are connecting to is very old. In the first case, you should update your client and in the second case you should contact the server administrator so that they can update their server.</li><li>Either your client or the server is using an old operating system that doesn't provide up-to-date encryption methods. In this case you should consider updating your OS or contacting the server admin so that they can update theirs.</li><li>The server you are connecting to isn't actually a Mumble server. Please ensure that the used server address really belongs to a Mumble server and not e.g. to a game server.</li><li>The port you are connecting to does not belong to a Mumble server but instead is bound to a completely unrelated process on the server-side. Please double-check you have used the correct port.</li></ul> + + %1 Video Controls + + + + Images (*.png *.jpg *.jpeg *.gif) + + Manual diff --git a/src/mumble/mumble_ro.ts b/src/mumble/mumble_ro.ts index 59a8c1106d..0f20494da7 100644 --- a/src/mumble/mumble_ro.ts +++ b/src/mumble/mumble_ro.ts @@ -710,6 +710,13 @@ Această valoare vă permite să setați numărul maxim de utilizatori permis î Pentru o listă de autori, te rog să consulți <a href="https://github.com/mumble-voip/mumble/graphs/contributors">https://github.com/mumble-voip/mumble/graphs/contributors</a>. + + AnimationTextObject + + %1 / %2 + + + AudioInput @@ -2963,6 +2970,10 @@ Are you sure you wish to replace your certificate? This server does not allow sending images. + + Unable to read animated image file: %1 + + ClientUser @@ -5427,10 +5438,6 @@ Otherwise abort and check your certificate and username. Wrong server password for unregistered user account, please try again. - - Images (*.png *.jpg *.jpeg) - - C&onfigure @@ -7020,6 +7027,14 @@ Valid options are: This could be caused by one of the following scenarios:<ul><li>Your client and the server use different encryption standards. This could be because you are using a very old client or the server you are connecting to is very old. In the first case, you should update your client and in the second case you should contact the server administrator so that they can update their server.</li><li>Either your client or the server is using an old operating system that doesn't provide up-to-date encryption methods. In this case you should consider updating your OS or contacting the server admin so that they can update theirs.</li><li>The server you are connecting to isn't actually a Mumble server. Please ensure that the used server address really belongs to a Mumble server and not e.g. to a game server.</li><li>The port you are connecting to does not belong to a Mumble server but instead is bound to a completely unrelated process on the server-side. Please double-check you have used the correct port.</li></ul> + + %1 Video Controls + + + + Images (*.png *.jpg *.jpeg *.gif) + + Manual diff --git a/src/mumble/mumble_ru.ts b/src/mumble/mumble_ru.ts index c83121e507..bd566d33fc 100644 --- a/src/mumble/mumble_ru.ts +++ b/src/mumble/mumble_ru.ts @@ -710,6 +710,13 @@ This value allows you to set the maximum number of users allowed in the channel. Список авторов смотрите на сайте <a href="https://github.com/mumble-voip/mumble/graphs/contributors">https://github.com/mumble-voip/mumble/graphs/contributors</a> + + AnimationTextObject + + %1 / %2 + + + AudioInput @@ -2996,6 +3003,10 @@ Are you sure you wish to replace your certificate? This server does not allow sending images. Этот сервер не позволяет отправлять изображения. + + Unable to read animated image file: %1 + + ClientUser @@ -5483,10 +5494,6 @@ Otherwise abort and check your certificate and username. Wrong server password for unregistered user account, please try again. Неверный пароль для подключения к серверу. Попробуйте еще раз. - - Images (*.png *.jpg *.jpeg) - Изображения (*.png *.jpg *.jpeg) - C&onfigure Н&астройки @@ -7166,6 +7173,14 @@ mumble://[<имя пользователя>[:<пароль>]@]<х This could be caused by one of the following scenarios:<ul><li>Your client and the server use different encryption standards. This could be because you are using a very old client or the server you are connecting to is very old. In the first case, you should update your client and in the second case you should contact the server administrator so that they can update their server.</li><li>Either your client or the server is using an old operating system that doesn't provide up-to-date encryption methods. In this case you should consider updating your OS or contacting the server admin so that they can update theirs.</li><li>The server you are connecting to isn't actually a Mumble server. Please ensure that the used server address really belongs to a Mumble server and not e.g. to a game server.</li><li>The port you are connecting to does not belong to a Mumble server but instead is bound to a completely unrelated process on the server-side. Please double-check you have used the correct port.</li></ul> + + %1 Video Controls + + + + Images (*.png *.jpg *.jpeg *.gif) + + Manual diff --git a/src/mumble/mumble_si.ts b/src/mumble/mumble_si.ts index 285845226c..f8192c6c7b 100644 --- a/src/mumble/mumble_si.ts +++ b/src/mumble/mumble_si.ts @@ -698,6 +698,13 @@ Contains the list of members inherited by the current channel. Uncheck <i> + + AnimationTextObject + + %1 / %2 + + + AudioInput @@ -2935,6 +2942,10 @@ Are you sure you wish to replace your certificate? This server does not allow sending images. + + Unable to read animated image file: %1 + + ClientUser @@ -5777,10 +5788,6 @@ Valid actions are: Save Image File - - Images (*.png *.jpg *.jpeg) - - Could not save image: %1 @@ -6974,6 +6981,14 @@ Valid options are: This could be caused by one of the following scenarios:<ul><li>Your client and the server use different encryption standards. This could be because you are using a very old client or the server you are connecting to is very old. In the first case, you should update your client and in the second case you should contact the server administrator so that they can update their server.</li><li>Either your client or the server is using an old operating system that doesn't provide up-to-date encryption methods. In this case you should consider updating your OS or contacting the server admin so that they can update theirs.</li><li>The server you are connecting to isn't actually a Mumble server. Please ensure that the used server address really belongs to a Mumble server and not e.g. to a game server.</li><li>The port you are connecting to does not belong to a Mumble server but instead is bound to a completely unrelated process on the server-side. Please double-check you have used the correct port.</li></ul> + + %1 Video Controls + + + + Images (*.png *.jpg *.jpeg *.gif) + + Manual diff --git a/src/mumble/mumble_sk.ts b/src/mumble/mumble_sk.ts index 6ecf5f846f..01ede50f2f 100644 --- a/src/mumble/mumble_sk.ts +++ b/src/mumble/mumble_sk.ts @@ -701,6 +701,13 @@ Contains the list of members inherited by the current channel. Uncheck <i> + + AnimationTextObject + + %1 / %2 + + + AudioInput @@ -2939,6 +2946,10 @@ Are you sure you wish to replace your certificate? This server does not allow sending images. + + Unable to read animated image file: %1 + + ClientUser @@ -5837,10 +5848,6 @@ Valid actions are: Save Image File - - Images (*.png *.jpg *.jpeg) - - Could not save image: %1 @@ -6978,6 +6985,14 @@ Valid options are: This could be caused by one of the following scenarios:<ul><li>Your client and the server use different encryption standards. This could be because you are using a very old client or the server you are connecting to is very old. In the first case, you should update your client and in the second case you should contact the server administrator so that they can update their server.</li><li>Either your client or the server is using an old operating system that doesn't provide up-to-date encryption methods. In this case you should consider updating your OS or contacting the server admin so that they can update theirs.</li><li>The server you are connecting to isn't actually a Mumble server. Please ensure that the used server address really belongs to a Mumble server and not e.g. to a game server.</li><li>The port you are connecting to does not belong to a Mumble server but instead is bound to a completely unrelated process on the server-side. Please double-check you have used the correct port.</li></ul> + + %1 Video Controls + + + + Images (*.png *.jpg *.jpeg *.gif) + + Manual diff --git a/src/mumble/mumble_sq.ts b/src/mumble/mumble_sq.ts index 922dbbf7c0..faedb4af32 100644 --- a/src/mumble/mumble_sq.ts +++ b/src/mumble/mumble_sq.ts @@ -700,6 +700,13 @@ Contains the list of members inherited by the current channel. Uncheck <i> + + AnimationTextObject + + %1 / %2 + + + AudioInput @@ -2937,6 +2944,10 @@ Are you sure you wish to replace your certificate? This server does not allow sending images. + + Unable to read animated image file: %1 + + ClientUser @@ -5794,10 +5805,6 @@ Valid actions are: Save Image File - - Images (*.png *.jpg *.jpeg) - - Could not save image: %1 @@ -6976,6 +6983,14 @@ Valid options are: This could be caused by one of the following scenarios:<ul><li>Your client and the server use different encryption standards. This could be because you are using a very old client or the server you are connecting to is very old. In the first case, you should update your client and in the second case you should contact the server administrator so that they can update their server.</li><li>Either your client or the server is using an old operating system that doesn't provide up-to-date encryption methods. In this case you should consider updating your OS or contacting the server admin so that they can update theirs.</li><li>The server you are connecting to isn't actually a Mumble server. Please ensure that the used server address really belongs to a Mumble server and not e.g. to a game server.</li><li>The port you are connecting to does not belong to a Mumble server but instead is bound to a completely unrelated process on the server-side. Please double-check you have used the correct port.</li></ul> + + %1 Video Controls + + + + Images (*.png *.jpg *.jpeg *.gif) + + Manual diff --git a/src/mumble/mumble_sv.ts b/src/mumble/mumble_sv.ts index df38796720..6b6ae3d359 100644 --- a/src/mumble/mumble_sv.ts +++ b/src/mumble/mumble_sv.ts @@ -710,6 +710,13 @@ Det värdet tillåter dig att ställa in ett maximalt antal av användare som ä För en lista över författarna, vänligen besök <a href="https://github.com/mumble-voip/mumble/graphs/contributors">https://github.com/mumble-voip/mumble/graphs/contributors</a> + + AnimationTextObject + + %1 / %2 + + + AudioInput @@ -2995,6 +3002,10 @@ Are you sure you wish to replace your certificate? This server does not allow sending images. Denna server tillåter inte att bilder skickas. + + Unable to read animated image file: %1 + + ClientUser @@ -5482,10 +5493,6 @@ Om inte, avbryt och kontrollera ditt certifikat eller användarnamn.Wrong server password for unregistered user account, please try again. Felaktigt serverlösenord för oregistrerat användarkonto, försök igen. - - Images (*.png *.jpg *.jpeg) - Bilder (*.png *.jpg *.jpeg) - C&onfigure K&onfigurera @@ -7164,6 +7171,14 @@ Giltiga värden för options är: This could be caused by one of the following scenarios:<ul><li>Your client and the server use different encryption standards. This could be because you are using a very old client or the server you are connecting to is very old. In the first case, you should update your client and in the second case you should contact the server administrator so that they can update their server.</li><li>Either your client or the server is using an old operating system that doesn't provide up-to-date encryption methods. In this case you should consider updating your OS or contacting the server admin so that they can update theirs.</li><li>The server you are connecting to isn't actually a Mumble server. Please ensure that the used server address really belongs to a Mumble server and not e.g. to a game server.</li><li>The port you are connecting to does not belong to a Mumble server but instead is bound to a completely unrelated process on the server-side. Please double-check you have used the correct port.</li></ul> + + %1 Video Controls + + + + Images (*.png *.jpg *.jpeg *.gif) + + Manual diff --git a/src/mumble/mumble_te.ts b/src/mumble/mumble_te.ts index 6122bbb0ef..74015cc093 100644 --- a/src/mumble/mumble_te.ts +++ b/src/mumble/mumble_te.ts @@ -708,6 +708,13 @@ This value allows you to set the maximum number of users allowed in the channel. + + AnimationTextObject + + %1 / %2 + + + AudioInput @@ -2966,6 +2973,10 @@ Are you sure you wish to replace your certificate? This server does not allow sending images. + + Unable to read animated image file: %1 + + ClientUser @@ -5430,10 +5441,6 @@ Otherwise abort and check your certificate and username. Wrong server password for unregistered user account, please try again. - - Images (*.png *.jpg *.jpeg) - - C&onfigure @@ -7023,6 +7030,14 @@ Valid options are: This could be caused by one of the following scenarios:<ul><li>Your client and the server use different encryption standards. This could be because you are using a very old client or the server you are connecting to is very old. In the first case, you should update your client and in the second case you should contact the server administrator so that they can update their server.</li><li>Either your client or the server is using an old operating system that doesn't provide up-to-date encryption methods. In this case you should consider updating your OS or contacting the server admin so that they can update theirs.</li><li>The server you are connecting to isn't actually a Mumble server. Please ensure that the used server address really belongs to a Mumble server and not e.g. to a game server.</li><li>The port you are connecting to does not belong to a Mumble server but instead is bound to a completely unrelated process on the server-side. Please double-check you have used the correct port.</li></ul> + + %1 Video Controls + + + + Images (*.png *.jpg *.jpeg *.gif) + + Manual diff --git a/src/mumble/mumble_th.ts b/src/mumble/mumble_th.ts index c15f07b298..ec5726f4b3 100644 --- a/src/mumble/mumble_th.ts +++ b/src/mumble/mumble_th.ts @@ -702,6 +702,13 @@ This value allows you to set the maximum number of users allowed in the channel. + + AnimationTextObject + + %1 / %2 + + + AudioInput @@ -2953,6 +2960,10 @@ Are you sure you wish to replace your certificate? This server does not allow sending images. + + Unable to read animated image file: %1 + + ClientUser @@ -5417,10 +5428,6 @@ Otherwise abort and check your certificate and username. Wrong server password for unregistered user account, please try again. - - Images (*.png *.jpg *.jpeg) - - C&onfigure @@ -7010,6 +7017,14 @@ Valid options are: This could be caused by one of the following scenarios:<ul><li>Your client and the server use different encryption standards. This could be because you are using a very old client or the server you are connecting to is very old. In the first case, you should update your client and in the second case you should contact the server administrator so that they can update their server.</li><li>Either your client or the server is using an old operating system that doesn't provide up-to-date encryption methods. In this case you should consider updating your OS or contacting the server admin so that they can update theirs.</li><li>The server you are connecting to isn't actually a Mumble server. Please ensure that the used server address really belongs to a Mumble server and not e.g. to a game server.</li><li>The port you are connecting to does not belong to a Mumble server but instead is bound to a completely unrelated process on the server-side. Please double-check you have used the correct port.</li></ul> + + %1 Video Controls + + + + Images (*.png *.jpg *.jpeg *.gif) + + Manual diff --git a/src/mumble/mumble_tr.ts b/src/mumble/mumble_tr.ts index 1fea5d7254..a0a069f598 100644 --- a/src/mumble/mumble_tr.ts +++ b/src/mumble/mumble_tr.ts @@ -710,6 +710,13 @@ Bu değer kanalda izin verilen azami kullanıcı sayısını ayarlamanıza izin Yazarların listesi için lütfen <a href="https://github.com/mumble-voip/mumble/graphs/contributors">https://github.com/mumble-voip/mumble/graphs/contributors</a> adresine bakın + + AnimationTextObject + + %1 / %2 + + + AudioInput @@ -2994,6 +3001,10 @@ Sertifikanızı değiştirmek istediğinize emin misiniz? This server does not allow sending images. Bu sunucu görüntü göndermeye izin vermiyor. + + Unable to read animated image file: %1 + + ClientUser @@ -5481,10 +5492,6 @@ deneyiniz. Yoksa iptal edip parolanızı kontrol ediniz. Wrong server password for unregistered user account, please try again. Kaydedilmemiş kullanıcı oturumu için yanlış sunucu parolası, tekrar deneyiniz. - - Images (*.png *.jpg *.jpeg) - Resimler (*.png *.jpg *.jpeg) - C&onfigure &Yapılandır @@ -7166,6 +7173,14 @@ Geçerli seçenekler şunlardır: This could be caused by one of the following scenarios:<ul><li>Your client and the server use different encryption standards. This could be because you are using a very old client or the server you are connecting to is very old. In the first case, you should update your client and in the second case you should contact the server administrator so that they can update their server.</li><li>Either your client or the server is using an old operating system that doesn't provide up-to-date encryption methods. In this case you should consider updating your OS or contacting the server admin so that they can update theirs.</li><li>The server you are connecting to isn't actually a Mumble server. Please ensure that the used server address really belongs to a Mumble server and not e.g. to a game server.</li><li>The port you are connecting to does not belong to a Mumble server but instead is bound to a completely unrelated process on the server-side. Please double-check you have used the correct port.</li></ul> Bunun nedeni şu durumlardan biri olabilir:<ul><li>İstemciniz ve sunucunuz farklı şifreleme standartları kullanmaktadır. Bunun nedeni çok eski bir istemci kullanıyor olmanız veya bağlandığınız sunucunun çok eski olması olabilir. İlk durumda, istemcinizi güncellemelisiniz ve ikinci durumda sunucularını güncelleyebilmeleri için sunucu yöneticisiyle iletişime geçmelisiniz.</li><li>Ya istemciniz ya da sunucunuz güncel şifreleme yöntemleri sağlamayan eski bir işletim sistemi kullanıyordur. Bu durumda işletim sisteminizi güncellemeyi düşünmeli ya da sunucu yöneticisiyle iletişime geçerek kendi işletim sistemlerini güncellemelerini sağlamalısınız.</li><li>Bağlandığınız sunucu aslında bir Mumble sunucusu değil. Lütfen kullanılan sunucu adresinin gerçekten bir Mumble sunucusuna ait olduğundan ve örneğin bir oyun sunucusuna ait olmadığından emin olun.</li><li>Bağlandığınız bağlantı noktası bir Mumble sunucusuna ait değil, bunun yerine sunucu tarafında tamamen ilgisiz bir işleme bağlı. Lütfen doğru bağlantı noktasını kullandığınızı iki kez gözden geçirin.</li></ul> + + %1 Video Controls + + + + Images (*.png *.jpg *.jpeg *.gif) + + Manual diff --git a/src/mumble/mumble_uk.ts b/src/mumble/mumble_uk.ts index 100f4d22f8..45b80154b9 100644 --- a/src/mumble/mumble_uk.ts +++ b/src/mumble/mumble_uk.ts @@ -710,6 +710,13 @@ This value allows you to set the maximum number of users allowed in the channel. + + AnimationTextObject + + %1 / %2 + + + AudioInput @@ -2963,6 +2970,10 @@ Are you sure you wish to replace your certificate? This server does not allow sending images. + + Unable to read animated image file: %1 + + ClientUser @@ -5427,10 +5438,6 @@ Otherwise abort and check your certificate and username. Wrong server password for unregistered user account, please try again. - - Images (*.png *.jpg *.jpeg) - - C&onfigure @@ -7020,6 +7027,14 @@ Valid options are: This could be caused by one of the following scenarios:<ul><li>Your client and the server use different encryption standards. This could be because you are using a very old client or the server you are connecting to is very old. In the first case, you should update your client and in the second case you should contact the server administrator so that they can update their server.</li><li>Either your client or the server is using an old operating system that doesn't provide up-to-date encryption methods. In this case you should consider updating your OS or contacting the server admin so that they can update theirs.</li><li>The server you are connecting to isn't actually a Mumble server. Please ensure that the used server address really belongs to a Mumble server and not e.g. to a game server.</li><li>The port you are connecting to does not belong to a Mumble server but instead is bound to a completely unrelated process on the server-side. Please double-check you have used the correct port.</li></ul> + + %1 Video Controls + + + + Images (*.png *.jpg *.jpeg *.gif) + + Manual diff --git a/src/mumble/mumble_zh_CN.ts b/src/mumble/mumble_zh_CN.ts index 876ee134cc..3c5f9da79e 100644 --- a/src/mumble/mumble_zh_CN.ts +++ b/src/mumble/mumble_zh_CN.ts @@ -710,6 +710,13 @@ This value allows you to set the maximum number of users allowed in the channel. 作者列表,请见 <a href="https://github.com/mumble-voip/mumble/graphs/contributors">https://github.com/mumble-voip/mumble/graphs/contributors</a> + + AnimationTextObject + + %1 / %2 + + + AudioInput @@ -2994,6 +3001,10 @@ Are you sure you wish to replace your certificate? This server does not allow sending images. 当前服务器不允许发送图片。 + + Unable to read animated image file: %1 + + ClientUser @@ -5481,10 +5492,6 @@ Otherwise abort and check your certificate and username. Wrong server password for unregistered user account, please try again. 未注册用户输入的密码错误,请重试。 - - Images (*.png *.jpg *.jpeg) - 图片文件 (*.png *.jpg *.jpeg) - C&onfigure 配置(&O) @@ -7164,6 +7171,14 @@ mumble://[<用户名>[:<密码>]@]<主机名>[:<端口>] This could be caused by one of the following scenarios:<ul><li>Your client and the server use different encryption standards. This could be because you are using a very old client or the server you are connecting to is very old. In the first case, you should update your client and in the second case you should contact the server administrator so that they can update their server.</li><li>Either your client or the server is using an old operating system that doesn't provide up-to-date encryption methods. In this case you should consider updating your OS or contacting the server admin so that they can update theirs.</li><li>The server you are connecting to isn't actually a Mumble server. Please ensure that the used server address really belongs to a Mumble server and not e.g. to a game server.</li><li>The port you are connecting to does not belong to a Mumble server but instead is bound to a completely unrelated process on the server-side. Please double-check you have used the correct port.</li></ul> 这可能由下列情形之一导致:<ul><li>客户端和服务器使用不同的加密标准。这可能是因为客户端版本太旧或者要连接到的服务器版本太旧。如果是第一种情况,则应该更新客户端。如果是第二种情况,则应该联系服务器管理员更新服务器。</li><li>客户端或服务器使用的旧版操作系统未提供足够新的加密方法。在这种情况下,您应该考虑更新操作系统,或联系服务器管理员更新服务器的操作系统。</li><li>您正在连接的服务器不是 Mumble 服务器。请确保所用的服务器地址确实属于 Mumble 服务器而不是游戏服务器等。</li><li>您正在连接的端口不属于 Mumble 服务器,而是绑定到服务端一个完全无关的进程。请再次确认您使用的是正确的端口。</li></ul> + + %1 Video Controls + + + + Images (*.png *.jpg *.jpeg *.gif) + + Manual diff --git a/src/mumble/mumble_zh_HK.ts b/src/mumble/mumble_zh_HK.ts index f8a696aec0..94c019de1a 100644 --- a/src/mumble/mumble_zh_HK.ts +++ b/src/mumble/mumble_zh_HK.ts @@ -702,6 +702,13 @@ This value allows you to set the maximum number of users allowed in the channel. + + AnimationTextObject + + %1 / %2 + + + AudioInput @@ -2953,6 +2960,10 @@ Are you sure you wish to replace your certificate? This server does not allow sending images. + + Unable to read animated image file: %1 + + ClientUser @@ -5419,10 +5430,6 @@ Otherwise abort and check your certificate and username. Wrong server password for unregistered user account, please try again. 伺服器密碼錯誤,請重試。 - - Images (*.png *.jpg *.jpeg) - 圖片 (*.png *.jpg *.jpeg) - C&onfigure &設定 @@ -7015,6 +7022,14 @@ Valid options are: This could be caused by one of the following scenarios:<ul><li>Your client and the server use different encryption standards. This could be because you are using a very old client or the server you are connecting to is very old. In the first case, you should update your client and in the second case you should contact the server administrator so that they can update their server.</li><li>Either your client or the server is using an old operating system that doesn't provide up-to-date encryption methods. In this case you should consider updating your OS or contacting the server admin so that they can update theirs.</li><li>The server you are connecting to isn't actually a Mumble server. Please ensure that the used server address really belongs to a Mumble server and not e.g. to a game server.</li><li>The port you are connecting to does not belong to a Mumble server but instead is bound to a completely unrelated process on the server-side. Please double-check you have used the correct port.</li></ul> + + %1 Video Controls + + + + Images (*.png *.jpg *.jpeg *.gif) + + Manual diff --git a/src/mumble/mumble_zh_TW.ts b/src/mumble/mumble_zh_TW.ts index 2f7762df48..7689d65762 100644 --- a/src/mumble/mumble_zh_TW.ts +++ b/src/mumble/mumble_zh_TW.ts @@ -705,6 +705,13 @@ This value allows you to set the maximum number of users allowed in the channel. 如遇瞭解作者名單,請查看<a href="https://github.com/mumble-voip/mumble/graphs/contributors">https://github.com/mumble-voip/mumble/graphs/contributors</a> + + AnimationTextObject + + %1 / %2 + + + AudioInput @@ -2971,6 +2978,10 @@ Are you sure you wish to replace your certificate? This server does not allow sending images. + + Unable to read animated image file: %1 + + ClientUser @@ -5446,10 +5457,6 @@ Otherwise abort and check your certificate and username. Wrong server password for unregistered user account, please try again. 未註冊使用者的伺服器密碼錯誤,請重試。 - - Images (*.png *.jpg *.jpeg) - 圖片 (*.png *.jpg *.jpeg) - C&onfigure 設定(&C) @@ -7039,6 +7046,14 @@ Valid options are: This could be caused by one of the following scenarios:<ul><li>Your client and the server use different encryption standards. This could be because you are using a very old client or the server you are connecting to is very old. In the first case, you should update your client and in the second case you should contact the server administrator so that they can update their server.</li><li>Either your client or the server is using an old operating system that doesn't provide up-to-date encryption methods. In this case you should consider updating your OS or contacting the server admin so that they can update theirs.</li><li>The server you are connecting to isn't actually a Mumble server. Please ensure that the used server address really belongs to a Mumble server and not e.g. to a game server.</li><li>The port you are connecting to does not belong to a Mumble server but instead is bound to a completely unrelated process on the server-side. Please double-check you have used the correct port.</li></ul> + + %1 Video Controls + + + + Images (*.png *.jpg *.jpeg *.gif) + + Manual