From 5dfff8aaa4caabc28b36bbba624f9d4a0e477486 Mon Sep 17 00:00:00 2001 From: Jan Holthuis Date: Tue, 4 May 2021 13:01:30 +0200 Subject: Translations: Print warning if translations failed to load --- src/util/translations.h | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/src/util/translations.h b/src/util/translations.h index a5a7e64f0e..867ce2e3d8 100644 --- a/src/util/translations.h +++ b/src/util/translations.h @@ -65,13 +65,15 @@ class Translations { QTranslator* mixxxTranslator = new QTranslator(pApp); bool mixxxLoaded = loadTranslations(systemLocale, userLocale, "mixxx", "_", translationsFolder, mixxxTranslator); - qDebug() << "Loading translations for locale" - << (userLocale.size() > 0 ? userLocale : systemLocale.name()) - << "from translations folder" << translationsFolder << ":" - << (mixxxLoaded ? "success" : "fail"); if (mixxxLoaded) { + qDebug() << "Loaded translations for locale" + << (userLocale.size() > 0 ? userLocale : systemLocale.name()) + << "from" << translationsFolder; pApp->installTranslator(mixxxTranslator); } else { + qWarning() << "Failed to load translations for locale" + << (userLocale.size() > 0 ? userLocale : systemLocale.name()) + << "from" << translationsFolder; delete mixxxTranslator; } } -- cgit v1.2.3 From a25c38846d6fc95ec431faffd151c0b8b4d98996 Mon Sep 17 00:00:00 2001 From: Jan Holthuis Date: Tue, 4 May 2021 14:32:29 +0200 Subject: Translations: Improve locale override logic --- src/util/translations.h | 125 +++++++++++++++++++++++++----------------------- 1 file changed, 65 insertions(+), 60 deletions(-) diff --git a/src/util/translations.h b/src/util/translations.h index 867ce2e3d8..1c164ba32e 100644 --- a/src/util/translations.h +++ b/src/util/translations.h @@ -13,93 +13,98 @@ namespace mixxx { class Translations { public: static void initializeTranslations(UserSettingsPointer pConfig, - QCoreApplication* pApp, - const QString& forcedLocale) { - QString resourcePath = pConfig->getResourcePath(); - QString translationsFolder = resourcePath + "translations/"; + QCoreApplication* pApp, + const QString& cmdlineLocaleString) { + QString translationsPath = pConfig->getResourcePath() + "translations/"; - // Load Qt base translations - QString userLocale = forcedLocale; - QLocale systemLocale = QLocale::system(); + // Set the default locale, if specified via command line or config + // file. If neither is the case, the default locale will be the + // system's locale. + { + QString customLocaleString = QString(); + if (!cmdlineLocaleString.isEmpty()) { + customLocaleString = cmdlineLocaleString; + } else { + const QString configLocale = pConfig->getValueString( + ConfigKey("[Config]", "Locale")); + if (!configLocale.isEmpty()) { + customLocaleString = configLocale; + } + } - // Attempt to load user locale from config - if (userLocale.isEmpty()) { - userLocale = pConfig->getValueString(ConfigKey("[Config]", "Locale")); + if (!customLocaleString.isEmpty()) { + const QLocale customLocale = QLocale(customLocaleString); + // If the customLocaleString is not a valid locale, Qt will + // automatically use the "C" locale instead. In that case, + // let's print a warning. + if (customLocaleString.compare( + QStringLiteral("C"), Qt::CaseInsensitive) != 0 && + customLocale.language() == QLocale::C) { + qWarning() << "Custom locale not found, using 'C' locale " + "(check your configuration to avoid this " + "warning)."; + } + QLocale::setDefault(customLocale); + } } - if (userLocale.isEmpty()) { - QLocale::setDefault(QLocale(systemLocale)); - } else { - QLocale::setDefault(QLocale(userLocale)); + QLocale locale = QLocale(); + + // Do not try to load translations if we're using 'C' locale. + if (locale.language() == QLocale::C) { + qDebug() << "Skipping loading of translations because the 'C' locale is used."; + return; } - // source language - if (userLocale == "en_US") { + // Don't bother loading a translation if the first ui-langauge is + // English because the interface is already in English. This fixes + // the case where the user's install of Qt doesn't have an explicit + // English translation file and the fact that we don't ship a + // mixxx_en.qm. + if (locale.language() == QLocale::English && + (locale.country() == QLocale::UnitedStates || + locale.country() == QLocale::AnyCountry)) { + qDebug() << "Skipping loading of translations because the locale is 'en' or 'en_US'."; return; } // Load Qt translations for this locale from the system translation // path. This is the lowest precedence QTranslator. - QTranslator* qtTranslator = new QTranslator(pApp); - if (loadTranslations(systemLocale, userLocale, "qt", "_", - QLibraryInfo::location(QLibraryInfo::TranslationsPath), - qtTranslator)) { - pApp->installTranslator(qtTranslator); + QTranslator* pQtTranslator = new QTranslator(pApp); + if (pQtTranslator->load(locale, + "qt", + "_", + QLibraryInfo::location(QLibraryInfo::TranslationsPath))) { + pApp->installTranslator(pQtTranslator); } else { - delete qtTranslator; + delete pQtTranslator; } // Load Qt translations for this locale from the Mixxx translations // folder. - QTranslator* mixxxQtTranslator = new QTranslator(pApp); - if (loadTranslations(systemLocale, userLocale, "qt", "_", - translationsFolder, - mixxxQtTranslator)) { - pApp->installTranslator(mixxxQtTranslator); + QTranslator* pMixxxQtTranslator = new QTranslator(pApp); + if (pMixxxQtTranslator->load(locale, "qt", "_", translationsPath)) { + pApp->installTranslator(pMixxxQtTranslator); } else { - delete mixxxQtTranslator; + delete pMixxxQtTranslator; } // Load Mixxx specific translations for this locale from the Mixxx // translations folder. - QTranslator* mixxxTranslator = new QTranslator(pApp); - bool mixxxLoaded = loadTranslations(systemLocale, userLocale, "mixxx", "_", - translationsFolder, mixxxTranslator); + QTranslator* pMixxxTranslator = new QTranslator(pApp); + bool mixxxLoaded = pMixxxTranslator->load(locale, "mixxx", "_", translationsPath); if (mixxxLoaded) { qDebug() << "Loaded translations for locale" - << (userLocale.size() > 0 ? userLocale : systemLocale.name()) - << "from" << translationsFolder; - pApp->installTranslator(mixxxTranslator); + << locale.name() + << "from" << translationsPath; + pApp->installTranslator(pMixxxTranslator); } else { qWarning() << "Failed to load translations for locale" - << (userLocale.size() > 0 ? userLocale : systemLocale.name()) - << "from" << translationsFolder; - delete mixxxTranslator; + << locale.name() + << "from" << translationsPath; + delete pMixxxTranslator; } } - - private: - static bool loadTranslations(const QLocale& systemLocale, - const QString& userLocale, - const QString& translation, - const QString& prefix, - const QString& translationPath, - QTranslator* pTranslator) { - if (userLocale.size() == 0) { - QStringList uiLanguages = systemLocale.uiLanguages(); - if (uiLanguages.size() > 0 && uiLanguages.first() == "en") { - // Don't bother loading a translation if the first ui-langauge is - // English because the interface is already in English. This fixes - // the case where the user's install of Qt doesn't have an explicit - // English // TODO: ranslation file and the fact that we don't ship a - // mixxx_en.qm. - return false; - } - return pTranslator->load(systemLocale, translation, prefix, translationPath); - } - return pTranslator->load(translation + prefix + userLocale, translationPath); - } - Translations() = delete; }; -- cgit v1.2.3 From fe359050ff9f08aee68d76329eecc8b680c1185a Mon Sep 17 00:00:00 2001 From: Jan Holthuis Date: Tue, 4 May 2021 15:08:55 +0200 Subject: Translations: Use helper method for unified error handling --- src/util/translations.h | 56 +++++++++++++++++++++++++------------------------ 1 file changed, 29 insertions(+), 27 deletions(-) diff --git a/src/util/translations.h b/src/util/translations.h index 1c164ba32e..83752d2445 100644 --- a/src/util/translations.h +++ b/src/util/translations.h @@ -15,7 +15,8 @@ class Translations { static void initializeTranslations(UserSettingsPointer pConfig, QCoreApplication* pApp, const QString& cmdlineLocaleString) { - QString translationsPath = pConfig->getResourcePath() + "translations/"; + const QString translationsPath = + pConfig->getResourcePath() + QStringLiteral("translations/"); // Set the default locale, if specified via command line or config // file. If neither is the case, the default locale will be the @@ -70,42 +71,43 @@ class Translations { // Load Qt translations for this locale from the system translation // path. This is the lowest precedence QTranslator. - QTranslator* pQtTranslator = new QTranslator(pApp); - if (pQtTranslator->load(locale, - "qt", - "_", - QLibraryInfo::location(QLibraryInfo::TranslationsPath))) { - pApp->installTranslator(pQtTranslator); - } else { - delete pQtTranslator; - } + installTranslations(pApp, + locale, + QStringLiteral("qt"), + QLibraryInfo::location(QLibraryInfo::TranslationsPath)); // Load Qt translations for this locale from the Mixxx translations // folder. - QTranslator* pMixxxQtTranslator = new QTranslator(pApp); - if (pMixxxQtTranslator->load(locale, "qt", "_", translationsPath)) { - pApp->installTranslator(pMixxxQtTranslator); - } else { - delete pMixxxQtTranslator; - } + installTranslations(pApp, locale, QStringLiteral("qt"), translationsPath); // Load Mixxx specific translations for this locale from the Mixxx // translations folder. - QTranslator* pMixxxTranslator = new QTranslator(pApp); - bool mixxxLoaded = pMixxxTranslator->load(locale, "mixxx", "_", translationsPath); - if (mixxxLoaded) { - qDebug() << "Loaded translations for locale" - << locale.name() - << "from" << translationsPath; - pApp->installTranslator(pMixxxTranslator); - } else { - qWarning() << "Failed to load translations for locale" + installTranslations(pApp, locale, QStringLiteral("mixxx"), translationsPath); + } + Translations() = delete; + + private: + static bool installTranslations(QCoreApplication* pApp, + const QLocale& locale, + const QString& translation, + const QString& translationsPath) { + QTranslator* pTranslator = new QTranslator(pApp); + const bool success = pTranslator->load( + locale, translation, QStringLiteral("_"), translationsPath); + if (!success) { + qWarning() << "Failed to load" << translation << "translations for locale" << locale.name() << "from" << translationsPath; - delete pMixxxTranslator; + delete pTranslator; + return false; } + + qDebug() << "Loaded" << translation << "translations for locale" + << locale.name() + << "from" << translationsPath; + pApp->installTranslator(pTranslator); + return true; } - Translations() = delete; }; } // namespace mixxx -- cgit v1.2.3 From 8c45a70fa405bac7db17d646049cbc3e4a8dcc7d Mon Sep 17 00:00:00 2001 From: Jan Holthuis Date: Tue, 4 May 2021 19:09:51 +0200 Subject: Translations: Simplify code (remove scope and redundant default constrs) --- src/util/translations.h | 49 +++++++++++++++++++++++++------------------------ 1 file changed, 25 insertions(+), 24 deletions(-) diff --git a/src/util/translations.h b/src/util/translations.h index 83752d2445..21010abe01 100644 --- a/src/util/translations.h +++ b/src/util/translations.h @@ -21,35 +21,36 @@ class Translations { // Set the default locale, if specified via command line or config // file. If neither is the case, the default locale will be the // system's locale. - { - QString customLocaleString = QString(); - if (!cmdlineLocaleString.isEmpty()) { - customLocaleString = cmdlineLocaleString; - } else { - const QString configLocale = pConfig->getValueString( - ConfigKey("[Config]", "Locale")); - if (!configLocale.isEmpty()) { - customLocaleString = configLocale; - } + QString customLocaleString; + if (!cmdlineLocaleString.isEmpty()) { + customLocaleString = cmdlineLocaleString; + } else { + const QString configLocale = pConfig->getValueString( + ConfigKey("[Config]", "Locale")); + if (!configLocale.isEmpty()) { + customLocaleString = configLocale; } + } - if (!customLocaleString.isEmpty()) { - const QLocale customLocale = QLocale(customLocaleString); - // If the customLocaleString is not a valid locale, Qt will - // automatically use the "C" locale instead. In that case, - // let's print a warning. - if (customLocaleString.compare( - QStringLiteral("C"), Qt::CaseInsensitive) != 0 && - customLocale.language() == QLocale::C) { - qWarning() << "Custom locale not found, using 'C' locale " - "(check your configuration to avoid this " - "warning)."; - } - QLocale::setDefault(customLocale); + if (!customLocaleString.isEmpty()) { + const QLocale customLocale = QLocale(customLocaleString); + // If the customLocaleString is not a valid locale, Qt will + // automatically use the "C" locale instead. In that case, + // let's print a warning. + if (customLocaleString.compare( + QStringLiteral("C"), Qt::CaseInsensitive) != 0 && + customLocale.language() == QLocale::C) { + qWarning() << "Custom locale not found, using 'C' locale " + "(check your configuration to avoid this " + "warning)."; } + QLocale::setDefault(customLocale); } - QLocale locale = QLocale(); + // Constructs a QLocale object initialized with the default locale. If + // no default locale was set using setDefault(), this locale will be + // the same as the one returned by system(). + QLocale locale; // Do not try to load translations if we're using 'C' locale. if (locale.language() == QLocale::C) { -- cgit v1.2.3 From 2babe832487a9f0b7a173d9659f71af898800d7e Mon Sep 17 00:00:00 2001 From: Jan Holthuis Date: Tue, 4 May 2021 19:12:56 +0200 Subject: Translations: Use default value when reading from config --- src/util/translations.h | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/src/util/translations.h b/src/util/translations.h index 21010abe01..4b3f6f6a72 100644 --- a/src/util/translations.h +++ b/src/util/translations.h @@ -25,11 +25,8 @@ class Translations { if (!cmdlineLocaleString.isEmpty()) { customLocaleString = cmdlineLocaleString; } else { - const QString configLocale = pConfig->getValueString( - ConfigKey("[Config]", "Locale")); - if (!configLocale.isEmpty()) { - customLocaleString = configLocale; - } + customLocaleString = pConfig->getValue( + ConfigKey("[Config]", "Locale"), QString()); } if (!customLocaleString.isEmpty()) { -- cgit v1.2.3 From e847f58f5a268b104206a271ab709ae5ff7981c1 Mon Sep 17 00:00:00 2001 From: Jan Holthuis Date: Thu, 6 May 2021 16:05:58 +0200 Subject: Translations: Use Debug instead of Warning loglevel for mixxx qt strings --- src/util/translations.h | 19 ++++++++++++------- 1 file changed, 12 insertions(+), 7 deletions(-) diff --git a/src/util/translations.h b/src/util/translations.h index 4b3f6f6a72..832244d12b 100644 --- a/src/util/translations.h +++ b/src/util/translations.h @@ -72,15 +72,18 @@ class Translations { installTranslations(pApp, locale, QStringLiteral("qt"), - QLibraryInfo::location(QLibraryInfo::TranslationsPath)); + QLibraryInfo::location(QLibraryInfo::TranslationsPath), + true); // Load Qt translations for this locale from the Mixxx translations // folder. - installTranslations(pApp, locale, QStringLiteral("qt"), translationsPath); + // Depending on the OS, this might not be necessary, so we don't warn + // on failure here. + installTranslations(pApp, locale, QStringLiteral("qt"), translationsPath, false); // Load Mixxx specific translations for this locale from the Mixxx // translations folder. - installTranslations(pApp, locale, QStringLiteral("mixxx"), translationsPath); + installTranslations(pApp, locale, QStringLiteral("mixxx"), translationsPath, true); } Translations() = delete; @@ -88,14 +91,16 @@ class Translations { static bool installTranslations(QCoreApplication* pApp, const QLocale& locale, const QString& translation, - const QString& translationsPath) { + const QString& translationsPath, + bool warnOnFailure) { QTranslator* pTranslator = new QTranslator(pApp); const bool success = pTranslator->load( locale, translation, QStringLiteral("_"), translationsPath); if (!success) { - qWarning() << "Failed to load" << translation << "translations for locale" - << locale.name() - << "from" << translationsPath; + ((warnOnFailure) ? qWarning() : qDebug()) + << "Failed to load" << translation << "translations for locale" + << locale.name() + << "from" << translationsPath; delete pTranslator; return false; } -- cgit v1.2.3 From 300f91630d5817c8c66ebba4d6295488be80bdd3 Mon Sep 17 00:00:00 2001 From: Jan Holthuis Date: Fri, 7 May 2021 21:03:37 +0200 Subject: res/translations: Delete outdates/unused "ceb" translations See https://github.com/mixxxdj/mixxx/pull/3826#issuecomment-834334745. --- res/translations/mixxx_ceb.qm | 1 - res/translations/mixxx_ceb.ts | 5912 ----------------------------------------- 2 files changed, 5913 deletions(-) delete mode 100644 res/translations/mixxx_ceb.qm delete mode 100644 res/translations/mixxx_ceb.ts diff --git a/res/translations/mixxx_ceb.qm b/res/translations/mixxx_ceb.qm deleted file mode 100644 index be651eede2..0000000000 --- a/res/translations/mixxx_ceb.qm +++ /dev/null @@ -1 +0,0 @@ -<¸dÊÍ!¿`¡½Ý \ No newline at end of file diff --git a/res/translations/mixxx_ceb.ts b/res/translations/mixxx_ceb.ts deleted file mode 100644 index cb6d3098e0..0000000000 --- a/res/translations/mixxx_ceb.ts +++ /dev/null @@ -1,5912 +0,0 @@ - - - - - AutoDJFeature - - Auto DJ - - - - - - BaseExternalLibraryFeature - - Add to Auto DJ Queue (bottom) - - - - - Add to Auto DJ Queue (top) - - - - - Import Playlist - - - - - Playlist Creation Failed - - - - - An unknown error occurred while creating playlist: - - - - - - BasePlaylistFeature - - New Playlist - - - - - Add to Auto DJ Queue (bottom) - - - - - Add to Auto DJ Queue (top) - - - - - Remove - - - - - Rename - - - - - Lock - - - - - Import Playlist - - - - - Duplicate Playlist - - - - - Export Playlist - - - - - Rename Playlist - - - - - New playlist name: - - - - - Renaming Playlist Failed - - - - - A playlist by that name already exists. - - - - - A playlist cannot have a blank name. - - - - - Playlist name: - - - - - _copy - - - - - Playlist Creation Failed - - - - - An unknown error occurred while creating playlist: - - - - - Playlist Files (*.m3u *.m3u8 *.pls *.csv) - - - - - M3U Playlist (*.m3u);;M3U8 Playlist (*.m3u8);;PLS Playlist (*.pls);;Text CSV (*.csv);;Readable Text (*.txt) - - - - - - BaseSqlTableModel - - Played - - - - - Artist - - - - - Title - - - - - Album - - - - - Genre - - - - - Composer - - - - - Year - - - - - Type - - - - - Location - - - - - Comment - - - - - Duration - - - - - Rating - - - - - Bitrate - - - - - BPM - - - - - Track # - - - - - Date Added - - - - - # - - - - - Timestamp - - - - - Key - - - - - BPM Lock - - - - - Preview - - - - - - BaseTrackPlayer - - Couldn't load track. - - - - - - BrowseFeature - - Add to Quick Links - - - - - Remove from Quick Links - - - - - Quick Links - - - - - Devices - - - - - Removable Devices - - - - - Browse lets you navigate, view, and load tracks from folders on your hard disk and external devices. - - - - - Browse - - - - - - BrowseTableModel - - Filename - - - - - Artist - - - - - Title - - - - - Album - - - - - Track # - - - - - Year - - - - - Genre - - - - - Composer - - - - - Comment - - - - - Duration - - - - - BPM - - - - - Key - - - - - Type - - - - - Bitrate - - - - - Location - - - - - Mixxx Library - - - - - Could not load the following file because it is in use by Mixxx or another application. - - - - - Warning: This will permanently delete the following files: - - - - - Are you sure you want to delete these files from your computer? - - - - - Could not delete the following file because it is in use by Mixxx or another application: - - - - - Could not update file metadata. - - - - - - BulkController - - USB Controller - - - - - - ControllerEngine - - Uncaught exception at line %1 in file %2: %3 - - - - - Uncaught exception at line %1 in passed code: %2 - - - - - Controller script error - - - - - A control you just used is not working properly. - - - - - <html>(The script code needs to be fixed.)<br>For now, you can:<ul><li>Ignore this error for this session but you may experience erratic behavior</li><li>Try to recover by resetting your controller</li></ul></html> - - - - - - ControllerMappingDlg - - Dialog - - - - - Input - - - - - The below box is under construction and will remain empty in this version of Mixxx. - - - - - Controls - - - - - Add - - - - - Remove - - - - - Learning Wizard - - - - - Clear all - - - - - Output - - - - - Outputs - - - - - Clear All - - - - - - CrateFeature - - New Crate - - - - - Remove - - - - - Rename - - - - - Lock - - - - - _copy - - - - - Import Playlist - - - - - Crates - - - - - Import Crate - - - - - Export Crate - - - - - Duplicate Crate - - - - - Unlock - - - - - Crate name: - - - - - An unknown error occurred while creating crate: - - - - - Rename Crate - - - - - New crate name: - - - - - Renaming Crate Failed - - - - - Playlist Files (*.m3u *.m3u8 *.pls *.csv) - - - - - M3U Playlist (*.m3u);;M3U8 Playlist (*.m3u8);;PLS Playlist (*.pls);;Text CSV (*.csv);;Readable Text (*.txt) - - - - - Crates are a great way to help organize the music you want to DJ with. - - - - - Make a crate for your next gig, for your favorite electrohouse tracks, or for your most requested songs. - - - - - Crates let you organize your music however you'd like! - - - - - Create new crate - - - - - A crate cannot have a blank name. - - - - - Creating Crate Failed - - - - - A crate by that name already exists. - - - - - - DlgAboutDlg - - About Mixxx - - - - - <a href="http://mixxx.org/">Official Website</a> - - - - - - DlgAutoDJ - - Auto-DJ - - - - - One deck must be stopped to enable Auto-DJ mode. - - - - - Disable Auto DJ - - - - - Shuffle the content of the Auto DJ playlist. - - - - - Shuffle - - - - - Skip the next track in the Auto DJ playlist. - - - - - Skip Track - - - - - Trigger the transition to the next track. - - - - - Fade Now - - - - - Determines the duration of the transition. - - - - - Seconds - - - - - sec. - - - - - Turn Auto DJ on or off. - - - - - Enable Auto DJ - - - - - Manage - - - - - - DlgBeatsDlg - - Beat Detection Settings - - - - - When beat detection is enabled, Mixxx detects the beats per minute and beats of your tracks, -automatically shows a beat-grid for them, and allows you to synchronize tracks using their beat information. - - - - - Enable BPM and Beat Detection - - - - - Choose Analyser - - - - - Beat Analyser: - - - - - Choose between different algorithms to detect beats. - - - - - Analyser Settings - - - - - Enable fast beat detection. -If activated Mixxx only analyzes the first minute of a track for beat information. -This can speed up beat detection on slower computers but may result in lower quality beatgrids. - - - - - Converts beats detected by the analyser into a fixed-tempo beatgrid. -Use this setting if your tracks have a constant tempo (e.g. most electronic music). -Often results in higher quality beatgrids, but will not do well on tracks that have tempo shifts. - - - - - Attempts to correct the phase (first beat) of fixed-tempo beatgrids -by analyzing the beats to discard outliers. - - - - - e.g. from 3rd-party programs or Mixxx versions before 1.11. -(Not checked: Analyse only, if no beats exist.) - - - - - Re-analyse beats when settings change or beat detection data is outdated - - - - - Enable Fast Analysis (For slow computers, may be less accurate) - - - - - Assume constant tempo (Recommended) - - - - - Enable Offset Correction (Recommended) - - - - - BPM Range - - - - - Min: - - - - - Max: - - - - - Reset to Defaults - - - - - - DlgBpmSchemeDlg - - BPM Scheme - - - - - Scheme Name: - - - - - BPM Range - - - - - Max - - - - - Min - - - - - Analyze Entire Track - - - - - - DlgControllerLearning - - Controller Learning Wizard - - - - - Click any control in the Mixxx interface or choose one from the list. Then move a control on your controller to map it. Repeat this as many times as you wish. When you are finished mapping controls, click Done. - - - - - Done - - - - - To map another control click a button or choose from the list. - - - - - Choose Control - - - - - Deck %1 - - - - - Sampler %1 - - - - - Reset to default - - - - - Mixer - - - - - Crossfader - - - - - Master volume - - - - - Master balance - - - - - Headphone volume - - - - - Headphone mix (pre/main) - - - - - Transport - - - - - Strip-search through track - - - - - Play button - - - - - Volume fader - - - - - Fast rewind button - - - - - Fast forward button - - - - - Jump to start of track - - - - - Jump to end of track - - - - - Play reverse button - - - - - Gain knob - - - - - Headphone listen button - - - - - Toggle repeat mode - - - - - Eject track - - - - - Mix orientation (e.g. left, right, center) - - - - - BPM and Sync - - - - - BPM tap button - - - - - Adjust beatgrid - - - - - Toggle quantize mode - - - - - Beat sync (tempo and phase) - - - - - Beat sync (tempo only) - - - - - Beat sync (phase only) - - - - - Pitch and Rate - - - - - Toggle keylock mode - - - - - Pitch control slider - - - - - Adjust rate up (fine) - - - - - Adjust rate down (fine) - - - - - Pitch-bend rate up (fine) - - - - - Adjust rate up (coarse) - - - - - Adjust rate down (coarse) - - - - - Pitch-bend rate up (coarse) - - - - - Pitch-bend rate down (coarse) - - - - - Pitch-bend rate down (fine) - - - - - Equalizers - - - - - High EQ knob - - - - - Mid EQ knob - - - - - Low EQ knob - - - - - High EQ kill - - - - - Mid EQ kill - - - - - Low EQ kill - - - - - Vinyl Control - - - - - Toggle vinyl-control (ON/OFF) - - - - - Toggle vinyl-control cueing mode (OFF/ONE/HOT) - - - - - Toggle vinyl-control mode (ABS/REL/CONST) - - - - - Cue button - - - - - Set cue point - - - - - Go to cue point and stop - - - - - Set or jump to hotcue %1 - - - - - Clear hotcue %1 - - - - - Jump to hotcue %1 - - - - - Jump to hotcue %1 and stop - - - - - Looping - - - - - Loop In button - - - - - Loop Out button - - - - - Reloop / Exit button - - - - - Halve the current loop's length - - - - - Double the current loop's length - - - - - Toggle slip mode - - - - - Preview Deck %1 - - - - - Single deck mode - Toggle vinyl control to next deck - - - - - Cues - - - - - Hotcues - - - - - Hotcue %1 - - - - - Loop Exit button - - - - - Beat-Looping - - - - - Create %1-beat loop - - - - - Create temporary %1-beat loop roll - - - - - 1/32th - - - - - 1/16th - - - - - 1/8th - - - - - 1/4th - - - - - Library - - - - - Expand/collapse the selected view (library, playlist..) - - - - - Switch to the next view (library, playlist..) - - - - - Switch to the previous view (library, playlist..) - - - - - Scroll to next track in library/playlist - - - - - Scroll to previous track in library/playlist - - - - - Load selected track into first stopped deck -