Merge pull request #36 from admsasha/master

- better handling of fonts
- dynamic localization of widgets
- fix the way tutorhtml is read
- fix translate warning messages
This commit is contained in:
Capitaine Fab 2019-03-01 09:15:59 +01:00 committed by GitHub
commit fbae727a3b
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
18 changed files with 1195 additions and 121 deletions

View File

@ -30,6 +30,11 @@ PROJECT( pianobooster )
# enable warnings
add_compile_options(-Wall)
if(USE_FONT)
add_compile_options("-DUSE_FONT=\"${USE_FONT}\"")
endif()
FIND_PACKAGE( OpenGL REQUIRED )
include(FindPkgConfig)
@ -210,6 +215,14 @@ INSTALL( FILES ../README.md DESTINATION share/games/pianobooster/doc/ )
INSTALL ( FILES images/pianobooster.png DESTINATION share/pixmaps )
if(USE_FONT)
INSTALL ( FILES ${USE_FONT} DESTINATION share/games/pianobooster/fonts)
endif()
if(NOT USE_SYSTEM_FONT)
INSTALL ( FILES fonts/DejaVuSans.ttf DESTINATION share/games/pianobooster/fonts)
endif()
#INSTALL( FILES "${CMAKE_CURRENT_BINARY_DIR}/translations/*.qm DESTINATION share/pianobooster/translations/ )

View File

@ -81,10 +81,10 @@ void CDraw::drawStaveExtentsion(CSymbol symbol, float x, int noteWidth, bool pl
void CDraw::renderText(float x, float y, const char* s)
{
double w = font.Advance(s);
double h = font.Descender();
double w = font->Advance(s);
double h = font->Descender();
glRasterPos2f(x - w/2, y - h);
font.Render(s);
font->Render(s);
}
void CDraw::drawNoteName(int midiNote, float x, float y, int type)

View File

@ -37,9 +37,10 @@
#endif
#include <FTGL/ftgl.h>
#include <QObject>
#include <QFile>
#include <QApplication>
#define HORIZONTAL_SPACING_FACTOR (0.75) // defines the speed of the scrolling
#define FONT_TTF "/usr/share/fonts/truetype/dejavu/DejaVuSans.ttf"
#define FONT_SIZE 16
#include "StavePosition.h"
@ -67,13 +68,39 @@ class CDraw : public QObject
{
public:
CDraw(CSettings* settings)
:font(FONT_TTF)
:font(nullptr)
{
QStringList listPathFonts;
#if defined(USE_FONT)
listPathFonts.push_back(USE_FONT);
#endif
listPathFonts.push_back("/usr/share/games/pianobooster/fonts/DejaVuSans.ttf");
listPathFonts.push_back(QApplication::applicationDirPath() + "/fonts/DejaVuSans.ttf");
listPathFonts.push_back("/usr/share/fonts/truetype/dejavu/DejaVuSans.ttf");
listPathFonts.push_back("/usr/share/fonts/dejavu/DejaVuSans.ttf");
listPathFonts.push_back("/usr/share/fonts/TTF/dejavu/DejaVuSans.ttf");
for (int i=0;i<listPathFonts.size();i++){
QFile file(listPathFonts.at(i));
if (file.exists()){
font = new FTGLPixmapFont(listPathFonts.at(i).toStdString().c_str());
break;
}
}
if (font==nullptr){
ppLogError("Font DejaVuSans.ttf was not found !");
exit(0);
}
m_settings = settings;
m_displayHand = PB_PART_both;
m_forceCompileRedraw = 1;
m_scrollProperties = &m_scrollPropertiesHorizontal;
font.FaceSize(FONT_SIZE, FONT_SIZE);
font->FaceSize(FONT_SIZE, FONT_SIZE);
}
~CDraw(){
if (font!=nullptr) delete font;
}
void scrollVertex(float x, float y)
@ -121,7 +148,7 @@ private:
CScrollProperties *m_scrollProperties;
CScrollProperties m_scrollPropertiesHorizontal;
CScrollProperties m_scrollPropertiesVertical;
FTGLPixmapFont font;
FTGLPixmapFont *font;
};
#endif //__DRAW_H__

View File

@ -25,6 +25,9 @@
*/
#include <QtWidgets>
#include <QJsonObject>
#include <QJsonDocument>
#include <QJsonValue>
#include "GuiPreferencesDialog.h"
#include "GlView.h"
@ -45,6 +48,85 @@ GuiPreferencesDialog::GuiPreferencesDialog(QWidget *parent)
videoOptimiseCombo->addItem(tr("None"));
}
void GuiPreferencesDialog::initLanguageCombo(){
QString localeDirectory =
#ifdef Q_OS_WIN32
QApplication::applicationDirPath() + "/translations/";
#endif
#ifdef Q_OS_LINUX
QApplication::applicationDirPath() + "/../share/games/" + QSTR_APPNAME + "/translations/";
#endif
#ifdef Q_OS_DARWIN
QApplication::applicationDirPath() + "/../Resources/translations/";
#endif
// read langs.json
QJsonObject rootLangs;
QFile file;
file.setFileName(localeDirectory+"/langs.json");
if (!file.open(QIODevice::ReadOnly | QIODevice::Text)){
ppLogError("Error while opening langs.json");
return;
}else{
QByteArray val = file.readAll();
file.close();
QJsonDocument document = QJsonDocument::fromJson(val);
if (document.isEmpty()){
ppLogError("langs.json is not valid");
return;
}else{
rootLangs = document.object();
}
}
// loading languages
languageCombo->clear();
languageCombo->addItem("English","en");
QDir dirLang(localeDirectory);
dirLang.setFilter(QDir::Files | QDir::Hidden | QDir::NoDotAndDotDot);
QFileInfoList listLang = dirLang.entryInfoList();
for (int i = 0; i < listLang.size(); ++i) {
QFileInfo fileInfo = listLang.at(i);
QRegExp rx("(pianobooster_)(.*)(.qm)");
if (rx.indexIn(fileInfo.fileName())!=-1){
QString lang_code = rx.cap(2);
if (lang_code=="blank") continue;
QString lang_code_loc = lang_code;
if (lang_code_loc.indexOf("_")==-1) lang_code_loc+="_"+lang_code_loc.toUpper();
QString languageName = "";
if (rootLangs.value(lang_code).toObject().value("nativeName").isString()){
languageName = rootLangs.value(lang_code).toObject().value("nativeName").toString();
}
if (languageName.isEmpty()){
QLocale loc(lang_code_loc);
languageName = loc.nativeLanguageName();
if (languageName.isEmpty()){
languageName=QLocale::languageToString(loc.language());
}
}
languageName[0]=languageName[0].toUpper();
if (languageName.isEmpty() or languageName=="C"){
languageName=lang_code;
}
languageCombo->addItem(languageName,lang_code);
if (m_settings->value("General/lang",QLocale::system().bcp47Name()).toString()==lang_code){
languageCombo->setCurrentIndex(languageCombo->count()-1);
}
}
}
}
void GuiPreferencesDialog::init(CSong* song, CSettings* settings, CGLView * glView)
{
@ -62,6 +144,8 @@ void GuiPreferencesDialog::init(CSong* song, CSettings* settings, CGLView * glVi
courtesyAccidentalsCheck->setChecked(m_settings->displayCourtesyAccidentals());
showTutorPagesCheck->setChecked(m_settings->isTutorPagesEnabled());
followStopPointCombo->setCurrentIndex(m_song->cfg_stopPointMode);
initLanguageCombo();
}
void GuiPreferencesDialog::accept()
@ -77,5 +161,7 @@ void GuiPreferencesDialog::accept()
m_settings->setValue("Score/StopPointMode", m_song->cfg_stopPointMode );
m_song->refreshScroll();
m_settings->setValue("General/lang",languageCombo->currentData().toString());
this->QDialog::accept();
}

View File

@ -53,6 +53,8 @@ private slots:
void accept();
private:
void initLanguageCombo();
CSettings* m_settings;
CSong* m_song;
CGLView *m_glView;

View File

@ -7,7 +7,7 @@
<x>0</x>
<y>0</y>
<width>339</width>
<height>331</height>
<height>368</height>
</rect>
</property>
<property name="sizePolicy">
@ -165,6 +165,29 @@
</layout>
</widget>
</item>
<item>
<widget class="QGroupBox" name="groupBox_4">
<property name="title">
<string>Language</string>
</property>
<layout class="QVBoxLayout" name="verticalLayout_5">
<item>
<layout class="QGridLayout" name="gridLayout_3">
<item row="0" column="0">
<widget class="QLabel" name="label_3">
<property name="text">
<string>Language:</string>
</property>
</widget>
</item>
<item row="0" column="1">
<widget class="QComboBox" name="languageCombo"/>
</item>
</layout>
</item>
</layout>
</widget>
</item>
<item>
<widget class="QDialogButtonBox" name="buttonBox">
<property name="orientation">

View File

@ -204,6 +204,55 @@ void GuiSidePanel::setCurrentHand(QString hand)
bothHandsRadio->setChecked(true);
}
void GuiSidePanel::updateTranslate(){
// save original
if (listWidgetsRetranslateUi.size()==0){
QList<QWidget*> l2 = this->findChildren<QWidget *>();
for (auto &w:l2){
QMap<QString,QString> m;
m["toolTip"]=w->toolTip();
m["whatsThis"]=w->whatsThis();
m["windowTitle"]=w->windowTitle();
m["statusTip"]=w->statusTip();
listWidgetsRetranslateUi[w]=m;
}
QList<QAction*> l = this->findChildren<QAction *>();
for (auto &w:l){
QMap<QString,QString> m;
m["toolTip"]=w->toolTip();
m["whatsThis"]=w->whatsThis();
m["statusTip"]=w->statusTip();
m["text"]=w->text();
listActionsRetranslateUi[w]=m;
}
}
// retranslate UI
QList<QWidget*> l2 = this->findChildren<QWidget *>();
for (auto &w:l2){
if (!w->toolTip().isEmpty()) w->setToolTip(tr(listWidgetsRetranslateUi[w]["toolTip"].toStdString().c_str()));
if (!w->whatsThis().isEmpty()) w->setWhatsThis(tr(listWidgetsRetranslateUi[w]["whatsThis"].toStdString().c_str()));
if (!w->windowTitle().isEmpty()) w->setWindowTitle(tr(listWidgetsRetranslateUi[w]["windowTitle"].toStdString().c_str()));
if (!w->statusTip().isEmpty()) w->setStatusTip(tr(listWidgetsRetranslateUi[w]["statusTip"].toStdString().c_str()));
}
QList<QAction*> l = this->findChildren<QAction *>();
for (auto &w:l){
if (!w->toolTip().isEmpty()) w->setToolTip(tr(listActionsRetranslateUi[w]["toolTip"].toStdString().c_str()));
if (!w->whatsThis().isEmpty()) w->setWhatsThis(tr(listActionsRetranslateUi[w]["whatsThis"].toStdString().c_str()));
if (!w->statusTip().isEmpty()) w->setStatusTip(tr(listActionsRetranslateUi[w]["statusTip"].toStdString().c_str()));
if (!w->text().isEmpty()) w->setText(tr(listActionsRetranslateUi[w]["text"].toStdString().c_str()));
}
rhythmTappingCombo->setItemText(0,tr("Drums"));
rhythmTappingCombo->setItemText(1,tr("Melody"));
retranslateUi(this);
}
void GuiSidePanel::on_rhythmTappingCombo_activated (int index)
{

View File

@ -58,6 +58,8 @@ public:
void setSongIndex(int index){songCombo->setCurrentIndex(index);}
void setCurrentHand(QString hand);
void updateTranslate();
void setActiveHand(whichPart_t hand)
{
if (hand == PB_PART_right) rightHandRadio->setChecked(true);
@ -172,6 +174,9 @@ private slots:
private:
void autoSetMuteYourPart();
QMap<QWidget*,QMap<QString,QString>> listWidgetsRetranslateUi;
QMap<QAction*,QMap<QString,QString>> listActionsRetranslateUi;
CSong* m_song;
CScore* m_score;
CTrackList* m_trackList;

View File

@ -176,6 +176,36 @@ void GuiTopBar::setPlayButtonState(bool checked, bool atTheEnd)
}
}
void GuiTopBar::updateTranslate(){
// save original
if (listWidgetsRetranslateUi.size()==0){
QList<QWidget*> l2 = this->findChildren<QWidget *>();
for (auto &w:l2){
QMap<QString,QString> m;
m["toolTip"]=w->toolTip();
m["whatsThis"]=w->whatsThis();
m["windowTitle"]=w->windowTitle();
m["statusTip"]=w->statusTip();
listWidgetsRetranslateUi[w]=m;
}
}
// retranslate UI
QList<QWidget*> l2 = this->findChildren<QWidget *>();
for (auto &w:l2){
if (!w->toolTip().isEmpty()) w->setToolTip(tr(listWidgetsRetranslateUi[w]["toolTip"].toStdString().c_str()));
if (!w->whatsThis().isEmpty()) w->setWhatsThis(tr(listWidgetsRetranslateUi[w]["whatsThis"].toStdString().c_str()));
if (!w->windowTitle().isEmpty()) w->setWindowTitle(tr(listWidgetsRetranslateUi[w]["windowTitle"].toStdString().c_str()));
if (!w->statusTip().isEmpty()) w->setStatusTip(tr(listWidgetsRetranslateUi[w]["statusTip"].toStdString().c_str()));
}
majorCombo->setItemText(0,tr("Major"));
majorCombo->setItemText(1,tr("Minor"));
majorCombo->setSizeAdjustPolicy(QComboBox::AdjustToContentsOnFirstShow);
retranslateUi(this);
}
void GuiTopBar::on_playButton_clicked(bool clicked)
{

View File

@ -53,6 +53,8 @@ public:
void setSpeed(int value){ speedSpin->setValue(value); }
int getSpeed(){return speedSpin->value();}
void updateTranslate();
public slots:
void on_playFromStartButton_clicked(bool clicked);
void on_playButton_clicked(bool clicked);
@ -80,6 +82,9 @@ private:
CSong* m_song;
CSettings* m_settings;
QMap<QWidget*,QMap<QString,QString>> listWidgetsRetranslateUi;
QMap<QAction*,QMap<QString,QString>> listActionsRetranslateUi;
bool m_atTheEndOfTheSong;
};

View File

@ -31,32 +31,6 @@ int main(int argc, char *argv[])
QApplication app(argc, argv);
QString locale = QLocale::system().name();
printf("locale = %s\n", qPrintable(locale));
QString localeDirectory =
#ifdef Q_OS_WIN32
QApplication::applicationDirPath() + "/translations/";
#endif
#ifdef Q_OS_LINUX
QApplication::applicationDirPath() + "/../share/games/" + QSTR_APPNAME + "/translations/";
#endif
#ifdef Q_OS_DARWIN
QApplication::applicationDirPath() + "/../Resources/translations/";
#endif
QTranslator translator;
if (!translator.load(QSTR_APPNAME + QString("_") + locale , localeDirectory))
if (!translator.load(QSTR_APPNAME + QString("_") + locale, QApplication::applicationDirPath() + "/translations/"))
translator.load(QSTR_APPNAME + QString("_") + locale, QApplication::applicationDirPath());
app.installTranslator(&translator);
QTranslator qtTranslator;
qtTranslator.load("qt_" + QLocale::system().name(), QLibraryInfo::location(QLibraryInfo::TranslationsPath));
app.installTranslator(&qtTranslator);
if (!QGLFormat::hasOpenGL()) {
QMessageBox::information(0, QMessageBox::tr("OpenGL support"),
QMessageBox::tr("This system does not support OpenGL which is needed to run Piano Booster."));

View File

@ -155,6 +155,7 @@ QtWindow::QtWindow()
m_song->openMidiPort(CMidiDevice::MIDI_INPUT, midiInputName);
m_song->openMidiPort(CMidiDevice::MIDI_OUTPUT,m_settings->value("midi/output").toString());
}
void QtWindow::init()
@ -166,6 +167,7 @@ void QtWindow::init()
createMenus();
readSettings();
refreshTranslate();
show();
}
@ -727,11 +729,96 @@ void QtWindow::loadTutorHtml(const QString & name)
}
else
{
m_tutorWindow->setSource(QUrl("file:///" + name));
QFile file(name);
if (!file.open(QIODevice::ReadOnly | QIODevice::Text)) return;
QTextStream out(&file);
out.setCodec("UTF-8");
m_tutorWindow->setHtml(out.readAll());
m_tutorWindow->setFixedHeight(104);
m_tutorWindow->show();
file.close();
}
}
void QtWindow::refreshTranslate(){
QString localeDirectory =
#ifdef Q_OS_WIN32
QApplication::applicationDirPath() + "/translations/";
#endif
#ifdef Q_OS_LINUX
QApplication::applicationDirPath() + "/../share/games/" + QSTR_APPNAME + "/translations/";
#endif
#ifdef Q_OS_DARWIN
QApplication::applicationDirPath() + "/../Resources/translations/";
#endif
QString locale = m_settings->value("General/lang",QLocale::system().bcp47Name()).toString();
qApp->removeTranslator(&translator);
qApp->removeTranslator(&qtTranslator);
// save original
if (listWidgetsRetranslateUi.size()==0){
QList<QWidget*> l2 = this->findChildren<QWidget *>();
for (auto &w:l2){
QMap<QString,QString> m;
m["toolTip"]=w->toolTip();
m["whatsThis"]=w->whatsThis();
m["windowTitle"]=w->windowTitle();
m["statusTip"]=w->statusTip();
listWidgetsRetranslateUi[w]=m;
}
QList<QAction*> l = this->findChildren<QAction *>();
for (auto &w:l){
QMap<QString,QString> m;
m["toolTip"]=w->toolTip();
m["whatsThis"]=w->whatsThis();
m["statusTip"]=w->statusTip();
m["text"]=w->text();
listActionsRetranslateUi[w]=m;
}
}
// set translator for app
if (!translator.load(QSTR_APPNAME + QString("_") + locale , localeDirectory))
if (!translator.load(QSTR_APPNAME + QString("_") + locale, QApplication::applicationDirPath() + "/translations/"))
translator.load(QSTR_APPNAME + QString("_") + locale, QApplication::applicationDirPath());
qApp->installTranslator(&translator);
// set translator for default widget's text (for example: QMessageBox's buttons)
#ifdef __WIN32
qtTranslator.load("qt_"+locale,localeDirectory);
#else
qtTranslator.load("qt_"+locale,QLibraryInfo::location(QLibraryInfo::TranslationsPath));
#endif
qApp->installTranslator(&qtTranslator);
// retranslate UI
QList<QWidget*> l2 = this->findChildren<QWidget *>();
for (auto &w:l2){
if (!w->toolTip().isEmpty()) w->setToolTip(tr(listWidgetsRetranslateUi[w]["toolTip"].toStdString().c_str()));
if (!w->whatsThis().isEmpty()) w->setWhatsThis(tr(listWidgetsRetranslateUi[w]["whatsThis"].toStdString().c_str()));
if (!w->windowTitle().isEmpty()) w->setWindowTitle(tr(listWidgetsRetranslateUi[w]["windowTitle"].toStdString().c_str()));
if (!w->statusTip().isEmpty()) w->setStatusTip(tr(listWidgetsRetranslateUi[w]["statusTip"].toStdString().c_str()));
}
QList<QAction*> l = this->findChildren<QAction *>();
for (auto &w:l){
if (!w->toolTip().isEmpty()) w->setToolTip(tr(listActionsRetranslateUi[w]["toolTip"].toStdString().c_str()));
if (!w->whatsThis().isEmpty()) w->setWhatsThis(tr(listActionsRetranslateUi[w]["whatsThis"].toStdString().c_str()));
if (!w->statusTip().isEmpty()) w->setStatusTip(tr(listActionsRetranslateUi[w]["statusTip"].toStdString().c_str()));
if (!w->text().isEmpty()) w->setText(tr(listActionsRetranslateUi[w]["text"].toStdString().c_str()));
}
m_sidePanel->updateTranslate();
m_topBar->updateTranslate();
m_settings->updateWarningMessages();
m_settings->updateTutorPage();
}

View File

@ -89,6 +89,8 @@ private slots:
GuiPreferencesDialog preferencesDialog(this);
preferencesDialog.init(m_song, m_settings, m_glWidget);
preferencesDialog.exec();
refreshTranslate();
}
void showSongDetailsDialog()
@ -169,6 +171,8 @@ private:
void addShortcutAction(const QString & key, const char * method);
void updateRecentFileActions();
QString strippedName(const QString &fullFileName);
void refreshTranslate();
void displayUsage();
void createActions();
@ -182,6 +186,11 @@ private:
GuiTopBar *m_topBar;
QTextBrowser *m_tutorWindow;
QTranslator translator;
QTranslator qtTranslator;
QMap<QWidget*,QMap<QString,QString>> listWidgetsRetranslateUi;
QMap<QAction*,QMap<QString,QString>> listActionsRetranslateUi;
CGLView *m_glWidget;
QAction *m_openAct;

View File

@ -266,7 +266,7 @@ void CSettings::updateTutorPage()
QString fileBase = fileInfo.absolutePath() + "/InfoPages/" + fileInfo.completeBaseName() + "_";
QString locale = QLocale::system().name();
QString locale = value("General/lang",QLocale::system().bcp47Name()).toString();
if (m_tutorPagesEnabled)
{

BIN
src/fonts/DejaVuSans.ttf Normal file

Binary file not shown.

View File

@ -10,17 +10,25 @@ SET( TRANSLATIONS_FILES
pianobooster_ru.ts
)
if(INSTALL_ALL_LANGS)
file (GLOB TRANSLATIONS_FILES "*.ts")
endif()
get_filename_component(full_path_blank_ts ${CMAKE_CURRENT_SOURCE_DIR}/pianobooster_blank.ts ABSOLUTE)
list(REMOVE_ITEM TRANSLATIONS_FILES ${full_path_blank_ts})
FIND_PACKAGE(Qt5 REQUIRED COMPONENTS LinguistTools)
QT5_ADD_TRANSLATION(QM_FILES ${TRANSLATIONS_FILES})
ADD_CUSTOM_TARGET(translations ALL DEPENDS ${QM_FILES})
IF (UNIX AND NOT APPLE)
INSTALL( FILES ${QM_FILES}
DESTINATION share/games/pianobooster/translations )
INSTALL( FILES ${QM_FILES} DESTINATION share/games/pianobooster/translations )
INSTALL( FILES langs.json DESTINATION share/games/pianobooster/translations )
ENDIF (UNIX AND NOT APPLE)
IF (WIN32)
INSTALL( FILES ${QM_FILES}
DESTINATION . )
INSTALL( FILES ${QM_FILES} DESTINATION . )
INSTALL( FILES langs.json DESTINATION . )
ENDIF (WIN32)

742
translations/langs.json Normal file
View File

@ -0,0 +1,742 @@
{
"aa": {
"name": "Afar",
"nativeName": "afaraf"
},
"ab": {
"name": "Abkhaz",
"nativeName": "аҧсуа"
},
"ae": {
"name": "Avestan",
"nativeName": "avesta"
},
"af": {
"name": "Afrikaans",
"nativeName": "afrikaans"
},
"ak": {
"name": "Akan",
"nativeName": "akan"
},
"am": {
"name": "Amharic",
"nativeName": "አማርኛ"
},
"an": {
"name": "Aragonese",
"nativeName": "aragonés"
},
"ar": {
"name": "Arabic",
"nativeName": "العربية"
},
"as": {
"name": "Assamese",
"nativeName": "অসমীয়া"
},
"av": {
"name": "Avaric",
"nativeName": "авар"
},
"ay": {
"name": "Aymara",
"nativeName": "aymar"
},
"az": {
"name": "Azerbaijani",
"nativeName": "azərbaycanca"
},
"ba": {
"name": "Bashkir",
"nativeName": "башҡорт"
},
"be": {
"name": "Belarusian",
"nativeName": "беларуская"
},
"bg": {
"name": "Bulgarian",
"nativeName": "български"
},
"bh": {
"name": "Bihari",
"nativeName": "भोजपुरी"
},
"bi": {
"name": "Bislama",
"nativeName": "bislama"
},
"bm": {
"name": "Bambara",
"nativeName": "bamanankan"
},
"bn": {
"name": "Bengali",
"nativeName": "বাংলা"
},
"bo": {
"name": "Tibetan Standard, Tibetan, Central",
"nativeName": "བོད་ཡིག"
},
"br": {
"name": "Breton",
"nativeName": "brezhoneg"
},
"bs": {
"name": "Bosnian",
"nativeName": "bosanski"
},
"ca": {
"name": "Catalan; Valencian",
"nativeName": "català"
},
"ce": {
"name": "Chechen",
"nativeName": "нохчийн"
},
"ch": {
"name": "Chamorro",
"nativeName": "chamoru"
},
"co": {
"name": "Corsican",
"nativeName": "corsu"
},
"cr": {
"name": "Cree",
"nativeName": "ᓀᐦᐃᔭᐍᐏᐣ"
},
"cs": {
"name": "Czech",
"nativeName": "čeština"
},
"cu": {
"name": "Old Church Slavonic, Church Slavic, Church Slavonic, Old Bulgarian, Old Slavonic",
"nativeName": "словѣньскъ"
},
"cv": {
"name": "Chuvash",
"nativeName": "чӑвашла"
},
"cy": {
"name": "Welsh",
"nativeName": "cymraeg"
},
"da": {
"name": "Danish",
"nativeName": "dansk"
},
"de": {
"name": "German",
"nativeName": "deutsch"
},
"dv": {
"name": "Divehi; Dhivehi; Maldivian",
"nativeName": "ދިވެހި"
},
"dz": {
"name": "Dzongkha",
"nativeName": "རྫོང་ཁ"
},
"ee": {
"name": "Ewe",
"nativeName": "eʋegbe"
},
"el": {
"name": "Greek, Modern",
"nativeName": "ελληνικά"
},
"en": {
"name": "English",
"nativeName": "english"
},
"eo": {
"name": "Esperanto",
"nativeName": "esperanto"
},
"es": {
"name": "Spanish; Castilian",
"nativeName": "español"
},
"et": {
"name": "Estonian",
"nativeName": "eesti"
},
"eu": {
"name": "Basque",
"nativeName": "euskara"
},
"fa": {
"name": "Persian",
"nativeName": "فارسی"
},
"ff": {
"name": "Fula; Fulah; Pulaar; Pular",
"nativeName": "pulaar"
},
"fi": {
"name": "Finnish",
"nativeName": "suomi"
},
"fj": {
"name": "Fijian",
"nativeName": "वोस वाकविता"
},
"fo": {
"name": "Faroese",
"nativeName": "føroyskt"
},
"fr": {
"name": "French",
"nativeName": "français"
},
"fy": {
"name": "Western Frisian",
"nativeName": "frysk"
},
"ga": {
"name": "Irish",
"nativeName": "gaeilge"
},
"gd": {
"name": "Scottish Gaelic; Gaelic",
"nativeName": "gàidhlig"
},
"gl": {
"name": "Galician",
"nativeName": "galego"
},
"gn": {
"name": "Guaraní",
"nativeName": "avañe'ẽ"
},
"gu": {
"name": "Gujarati",
"nativeName": "ગુજરાતી"
},
"gv": {
"name": "Manx",
"nativeName": "gaelg"
},
"ha": {
"name": "Hausa",
"nativeName": "هَوُسَ"
},
"he": {
"name": "Hebrew (modern)",
"nativeName": "עברית"
},
"hi": {
"name": "Hindi",
"nativeName": "हिन्दी"
},
"ho": {
"name": "Hiri Motu",
"nativeName": "Hiri Motu"
},
"hr": {
"name": "Croatian",
"nativeName": "hrvatski"
},
"ht": {
"name": "Haitian; Haitian Creole",
"nativeName": "kreyòl ayisyen"
},
"hu": {
"name": "Hungarian",
"nativeName": "magyar"
},
"hy": {
"name": "Armenian",
"nativeName": "Հայերեն"
},
"hz": {
"name": "Herero",
"nativeName": "otjiherero"
},
"ia": {
"name": "Interlingua",
"nativeName": "interlingua"
},
"id": {
"name": "Indonesian",
"nativeName": "bahasa Indonesia"
},
"ie": {
"name": "Interlingue",
"nativeName": "interlingue"
},
"ig": {
"name": "Igbo",
"nativeName": "igbo"
},
"ii": {
"name": "Nuosu",
"nativeName": "ꆈꌠꉙ"
},
"ik": {
"name": "Inupiaq",
"nativeName": "iñupiaq"
},
"io": {
"name": "Ido",
"nativeName": "ido"
},
"is": {
"name": "Icelandic",
"nativeName": "íslenska"
},
"it": {
"name": "Italian",
"nativeName": "italiano"
},
"iu": {
"name": "Inuktitut",
"nativeName": "ᐃᓄᒃᑎᑐᑦ"
},
"ja": {
"name": "Japanese",
"nativeName": "日本語"
},
"jv": {
"name": "Javanese",
"nativeName": "ꦧꦱꦗꦮ"
},
"ka": {
"name": "Georgian",
"nativeName": "ქართული"
},
"kg": {
"name": "Kongo",
"nativeName": "kikongo"
},
"ki": {
"name": "Kikuyu, Gikuyu",
"nativeName": "gĩkũyũ"
},
"kj": {
"name": "Kwanyama, Kuanyama",
"nativeName": "kuanyama"
},
"kk": {
"name": "Kazakh",
"nativeName": "қазақша"
},
"kl": {
"name": "Kalaallisut, Greenlandic",
"nativeName": "kalaallisut"
},
"km": {
"name": "Khmer",
"nativeName": "ភាសាខ្មែរ"
},
"kn": {
"name": "Kannada",
"nativeName": "ಕನ್ನಡ"
},
"ko": {
"name": "Korean",
"nativeName": "한국어"
},
"kr": {
"name": "Kanuri",
"nativeName": "kanuri"
},
"ks": {
"name": "Kashmiri",
"nativeName": "कॉशुर"
},
"ku": {
"name": "Kurdish",
"nativeName": "kurdî"
},
"kv": {
"name": "Komi",
"nativeName": "коми"
},
"kw": {
"name": "Cornish",
"nativeName": "kernowek"
},
"ky": {
"name": "Kirghiz, Kyrgyz",
"nativeName": "кыргызча"
},
"la": {
"name": "Latin",
"nativeName": "latine"
},
"lb": {
"name": "Luxembourgish, Letzeburgesch",
"nativeName": "lëtzebuergesch"
},
"lg": {
"name": "Luganda",
"nativeName": "luganda"
},
"li": {
"name": "Limburgish, Limburgan, Limburger",
"nativeName": "lèmburgs"
},
"ln": {
"name": "Lingala",
"nativeName": "lingála"
},
"lo": {
"name": "Lao",
"nativeName": "ພາສາລາວ"
},
"lt": {
"name": "Lithuanian",
"nativeName": "lietuvių"
},
"lu": {
"name": "Luba-Katanga",
"nativeName": "kiluba"
},
"lv": {
"name": "Latvian",
"nativeName": "latviešu"
},
"mg": {
"name": "Malagasy",
"nativeName": "malagasy"
},
"mh": {
"name": "Marshallese",
"nativeName": "ebon"
},
"mi": {
"name": "Māori",
"nativeName": "māori"
},
"mk": {
"name": "Macedonian",
"nativeName": "македонски"
},
"ml": {
"name": "Malayalam",
"nativeName": "മലയാളം"
},
"mn": {
"name": "Mongolian",
"nativeName": "монгол"
},
"mr": {
"name": "Marathi (Marāṭhī)",
"nativeName": "मराठी"
},
"ms": {
"name": "Malay",
"nativeName": "bahasa Melayu"
},
"mt": {
"name": "Maltese",
"nativeName": "malti"
},
"my": {
"name": "Burmese",
"nativeName": "ဗမာစာ"
},
"na": {
"name": "Nauru",
"nativeName": "ekakairũ naoero"
},
"nb": {
"name": "Norwegian Bokmål",
"nativeName": "bokmål"
},
"nd": {
"name": "North Ndebele",
"nativeName": "isiNdebele saseNyakatho"
},
"ne": {
"name": "Nepali",
"nativeName": "नेपाली"
},
"ng": {
"name": "Ndonga",
"nativeName": "owambo"
},
"nl": {
"name": "Dutch",
"nativeName": "nederlands"
},
"nn": {
"name": "Norwegian Nynorsk",
"nativeName": "nynorsk"
},
"no": {
"name": "Norwegian",
"nativeName": "norsk"
},
"nr": {
"name": "South Ndebele",
"nativeName": "isiNdebele seSewula"
},
"nv": {
"name": "Navajo, Navaho",
"nativeName": "dinékʼehǰí"
},
"ny": {
"name": "Chichewa; Chewa; Nyanja",
"nativeName": "chiсheŵa"
},
"oc": {
"name": "Occitan",
"nativeName": "occitan"
},
"oj": {
"name": "Ojibwe, Ojibwa",
"nativeName": "ᐊᓂᔑᓈᐯᒧᐎᓐ"
},
"om": {
"name": "Oromo",
"nativeName": "oromoo"
},
"or": {
"name": "Oriya",
"nativeName": "ଓଡ଼ିଆ"
},
"os": {
"name": "Ossetian, Ossetic",
"nativeName": "иронау"
},
"pa": {
"name": "Panjabi; Punjabi",
"nativeName": "ਪੰਜਾਬੀ"
},
"pi": {
"name": "Pāli",
"nativeName": "पाऴि"
},
"pl": {
"name": "Polish",
"nativeName": "polski"
},
"ps": {
"name": "Pashto, Pushto",
"nativeName": "پښتو"
},
"pt": {
"name": "Portuguese",
"nativeName": "português"
},
"qu": {
"name": "Runa Simi, Kichwa",
"nativeName": "quechua"
},
"rm": {
"name": "Romansh",
"nativeName": "rumantsch"
},
"rn": {
"name": "Kirundi; Rundi",
"nativeName": "ikirundi"
},
"ro": {
"name": "Romanian, Moldavian, Moldovan",
"nativeName": "română"
},
"ru": {
"name": "Russian",
"nativeName": "русский"
},
"rw": {
"name": "Kinyarwanda",
"nativeName": "kinyarwanda"
},
"sa": {
"name": "Sanskrit (Saṁskṛta)",
"nativeName": "संस्कृतम्"
},
"sc": {
"name": "Sardinian",
"nativeName": "sardu"
},
"sd": {
"name": "Sindhi",
"nativeName": "سنڌي"
},
"se": {
"name": "Northern Sami",
"nativeName": "davvisámegiella"
},
"sg": {
"name": "Sango",
"nativeName": "sängö"
},
"sh": {
"name": "Serbo-Croatian",
"nativeName": "српскохрватски"
},
"si": {
"name": "Sinhala, Sinhalese",
"nativeName": "සිංහල"
},
"sk": {
"name": "Slovak",
"nativeName": "slovenčina"
},
"sl": {
"name": "Slovene",
"nativeName": "slovenščina"
},
"sm": {
"name": "Samoan",
"nativeName": "gagana Sāmoa"
},
"sn": {
"name": "Shona",
"nativeName": "chiShona"
},
"so": {
"name": "Somali",
"nativeName": "soomaaliga"
},
"sq": {
"name": "Albanian",
"nativeName": "shqip"
},
"sr": {
"name": "Serbian",
"nativeName": "српски"
},
"ss": {
"name": "Swati",
"nativeName": "siSwati"
},
"st": {
"name": "Southern Sotho",
"nativeName": "sesotho"
},
"su": {
"name": "Sundanese",
"nativeName": "basa Sunda"
},
"sv": {
"name": "Swedish",
"nativeName": "svenska"
},
"sw": {
"name": "Swahili",
"nativeName": "kiswahili"
},
"ta": {
"name": "Tamil",
"nativeName": "தமிழ்"
},
"te": {
"name": "Telugu",
"nativeName": "తెలుగు"
},
"tg": {
"name": "Tajik",
"nativeName": "тоҷикӣ"
},
"th": {
"name": "Thai",
"nativeName": "ไทย"
},
"ti": {
"name": "Tigrinya",
"nativeName": "ትግርኛ"
},
"tk": {
"name": "Turkmen",
"nativeName": "türkmençe"
},
"tl": {
"name": "Tagalog",
"nativeName": "tagálog"
},
"tn": {
"name": "Tswana",
"nativeName": "setswana"
},
"to": {
"name": "Tonga (Tonga Islands)",
"nativeName": "faka Tonga"
},
"tr": {
"name": "Turkish",
"nativeName": "türkçe"
},
"ts": {
"name": "Tsonga",
"nativeName": "xitsonga"
},
"tt": {
"name": "Tatar",
"nativeName": "татарча"
},
"tw": {
"name": "Twi",
"nativeName": "twi"
},
"ty": {
"name": "Tahitian",
"nativeName": "reo Tahiti"
},
"ug": {
"name": "Uighur; Uyghur",
"nativeName": "ئۇيغۇرچە"
},
"uk": {
"name": "Ukrainian",
"nativeName": "українська"
},
"ur": {
"name": "Urdu",
"nativeName": "اردو"
},
"uz": {
"name": "Uzbek",
"nativeName": "ўзбекча"
},
"ve": {
"name": "Venda",
"nativeName": "tshivenḓa"
},
"vi": {
"name": "Vietnamese",
"nativeName": "tiếng Việt"
},
"vo": {
"name": "Volapük",
"nativeName": "volapük"
},
"wa": {
"name": "Walloon",
"nativeName": "walon"
},
"wo": {
"name": "Wolof",
"nativeName": "wolof"
},
"xh": {
"name": "Xhosa",
"nativeName": "isiXhosa"
},
"yi": {
"name": "Yiddish",
"nativeName": "ייִדיש"
},
"yo": {
"name": "Yoruba",
"nativeName": "yorùbá"
},
"za": {
"name": "Zhuang, Chuang",
"nativeName": "sawcuengh"
},
"zh": {
"name": "Chinese",
"nativeName": "中文"
},
"zu": {
"name": "Zulu",
"nativeName": "isiZulu"
}
}

View File

@ -1107,37 +1107,47 @@
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/GuiPreferencesDialog.cpp" line="39"/>
<source>Preferences</source>
<location filename="../src/GuiPreferencesDialog.ui" line="171"/>
<source>Language</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/GuiPreferencesDialog.cpp" line="40"/>
<source>Automatic (Recommended)</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/GuiPreferencesDialog.cpp" line="41"/>
<source>On the Beat</source>
<location filename="../src/GuiPreferencesDialog.ui" line="179"/>
<source>Language:</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/GuiPreferencesDialog.cpp" line="42"/>
<source>After the Beat</source>
<source>Preferences</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/GuiPreferencesDialog.cpp" line="43"/>
<source>Full (Recommended)</source>
<source>Automatic (Recommended)</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/GuiPreferencesDialog.cpp" line="44"/>
<source>Medium</source>
<source>On the Beat</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/GuiPreferencesDialog.cpp" line="45"/>
<source>After the Beat</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/GuiPreferencesDialog.cpp" line="46"/>
<source>Full (Recommended)</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/GuiPreferencesDialog.cpp" line="47"/>
<source>Medium</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/GuiPreferencesDialog.cpp" line="48"/>
<source>None</source>
<translation type="unfinished"></translation>
</message>
@ -1236,11 +1246,13 @@
</message>
<message>
<location filename="../src/GuiSidePanel.cpp" line="57"/>
<location filename="../src/GuiSidePanel.cpp" line="250"/>
<source>Drums</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/GuiSidePanel.cpp" line="58"/>
<location filename="../src/GuiSidePanel.cpp" line="251"/>
<source>Melody</source>
<translation type="unfinished"></translation>
</message>
@ -1365,11 +1377,13 @@
</message>
<message>
<location filename="../src/GuiTopBar.cpp" line="55"/>
<location filename="../src/GuiTopBar.cpp" line="202"/>
<source>Major</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/GuiTopBar.cpp" line="56"/>
<location filename="../src/GuiTopBar.cpp" line="203"/>
<source>Minor</source>
<translation type="unfinished"></translation>
</message>
@ -1505,12 +1519,12 @@
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/QtMain.cpp" line="61"/>
<location filename="../src/QtMain.cpp" line="35"/>
<source>OpenGL support</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/QtMain.cpp" line="62"/>
<location filename="../src/QtMain.cpp" line="36"/>
<source>This system does not support OpenGL which is needed to run Piano Booster.</source>
<translation type="unfinished"></translation>
</message>
@ -1546,317 +1560,317 @@
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/QtWindow.cpp" line="232"/>
<location filename="../src/QtWindow.cpp" line="240"/>
<location filename="../src/QtWindow.cpp" line="264"/>
<location filename="../src/QtWindow.cpp" line="234"/>
<location filename="../src/QtWindow.cpp" line="242"/>
<location filename="../src/QtWindow.cpp" line="266"/>
<source>PianoBooster Midi File Error</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/QtWindow.cpp" line="233"/>
<location filename="../src/QtWindow.cpp" line="235"/>
<source>Cannot Open&quot;</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/QtWindow.cpp" line="241"/>
<location filename="../src/QtWindow.cpp" line="243"/>
<source>Not a Midi File &quot;</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/QtWindow.cpp" line="265"/>
<location filename="../src/QtWindow.cpp" line="267"/>
<source>Not a valid MIDI file &quot;</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/QtWindow.cpp" line="341"/>
<location filename="../src/QtWindow.cpp" line="343"/>
<source>&amp;Open...</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/QtWindow.cpp" line="342"/>
<location filename="../src/QtWindow.cpp" line="344"/>
<source>Ctrl+O</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/QtWindow.cpp" line="343"/>
<location filename="../src/QtWindow.cpp" line="345"/>
<source>Open an existing file</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/QtWindow.cpp" line="346"/>
<location filename="../src/QtWindow.cpp" line="348"/>
<source>E&amp;xit</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/QtWindow.cpp" line="347"/>
<location filename="../src/QtWindow.cpp" line="349"/>
<source>Ctrl+Q</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/QtWindow.cpp" line="348"/>
<location filename="../src/QtWindow.cpp" line="350"/>
<source>Exit the application</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/QtWindow.cpp" line="351"/>
<location filename="../src/QtWindow.cpp" line="353"/>
<source>&amp;About</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/QtWindow.cpp" line="352"/>
<location filename="../src/QtWindow.cpp" line="354"/>
<source>Show the application&apos;s About box</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/QtWindow.cpp" line="355"/>
<location filename="../src/QtWindow.cpp" line="357"/>
<source>&amp;PC Shortcut Keys</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/QtWindow.cpp" line="356"/>
<location filename="../src/QtWindow.cpp" line="358"/>
<source>The PC Keyboard shortcut keys</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/QtWindow.cpp" line="359"/>
<location filename="../src/QtWindow.cpp" line="361"/>
<source>&amp;Midi Setup ...</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/QtWindow.cpp" line="360"/>
<location filename="../src/QtWindow.cpp" line="386"/>
<location filename="../src/QtWindow.cpp" line="362"/>
<location filename="../src/QtWindow.cpp" line="388"/>
<source>Ctrl+S</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/QtWindow.cpp" line="361"/>
<location filename="../src/QtWindow.cpp" line="363"/>
<source>Setup the Midi input an output</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/QtWindow.cpp" line="364"/>
<location filename="../src/QtWindow.cpp" line="366"/>
<source>Piano &amp;Keyboard Setting ...</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/QtWindow.cpp" line="365"/>
<location filename="../src/QtWindow.cpp" line="367"/>
<source>Ctrl+K</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/QtWindow.cpp" line="366"/>
<location filename="../src/QtWindow.cpp" line="368"/>
<source>Change the piano keyboard settings</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/QtWindow.cpp" line="369"/>
<location filename="../src/QtWindow.cpp" line="371"/>
<source>&amp;Fullscreen</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/QtWindow.cpp" line="370"/>
<location filename="../src/QtWindow.cpp" line="372"/>
<source>F11</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/QtWindow.cpp" line="374"/>
<location filename="../src/QtWindow.cpp" line="376"/>
<source>&amp;Show the Side Panel</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/QtWindow.cpp" line="375"/>
<location filename="../src/QtWindow.cpp" line="377"/>
<source>F12</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/QtWindow.cpp" line="381"/>
<location filename="../src/QtWindow.cpp" line="383"/>
<source>&amp;Preferences ...</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/QtWindow.cpp" line="382"/>
<location filename="../src/QtWindow.cpp" line="384"/>
<source>Ctrl+P</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/QtWindow.cpp" line="385"/>
<location filename="../src/QtWindow.cpp" line="387"/>
<source>&amp;Song Details ...</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/QtWindow.cpp" line="390"/>
<location filename="../src/QtWindow.cpp" line="392"/>
<source>Shift+F1</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/QtWindow.cpp" line="395"/>
<location filename="../src/QtWindow.cpp" line="397"/>
<source>Alt+F1</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/QtWindow.cpp" line="424"/>
<location filename="../src/QtWindow.cpp" line="426"/>
<source>&amp;File</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/QtWindow.cpp" line="433"/>
<location filename="../src/QtWindow.cpp" line="436"/>
<source>&amp;View</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/QtWindow.cpp" line="437"/>
<location filename="../src/QtWindow.cpp" line="441"/>
<source>&amp;Song</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/QtWindow.cpp" line="440"/>
<location filename="../src/QtWindow.cpp" line="445"/>
<source>Set&amp;up</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/QtWindow.cpp" line="445"/>
<location filename="../src/QtWindow.cpp" line="448"/>
<location filename="../src/QtWindow.cpp" line="451"/>
<location filename="../src/QtWindow.cpp" line="455"/>
<source>&amp;Help</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/QtWindow.cpp" line="452"/>
<location filename="../src/QtWindow.cpp" line="459"/>
<source>&amp;Website</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/QtWindow.cpp" line="475"/>
<location filename="../src/QtWindow.cpp" line="482"/>
<source>&amp;%1 %2</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/QtWindow.cpp" line="524"/>
<location filename="../src/QtWindow.cpp" line="531"/>
<source>Piano Booster Help</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/QtWindow.cpp" line="526"/>
<location filename="../src/QtWindow.cpp" line="533"/>
<source>&lt;h3&gt;Getting Started&lt;/h3&gt;&lt;p&gt;You need a &lt;b&gt;MIDI Piano Keyboard &lt;/b&gt; and a &lt;b&gt;MIDI interface&lt;/b&gt; for the PC. If you don&apos;t have a MIDI keyboard you can still try out PianoBooster using the PC keyboard, &apos;X&apos; is middle C.&lt;/p&gt;&lt;p&gt;To hear the music you will need a &lt;b&gt;General Midi sound synthesizer&lt;/b&gt;. The &quot;Microsoft GS Wavetable software synthesizer&quot; that comes with Windows can be used but it introduces an unacceptable delay (latency). In Linux you can use &lt;a href=&quot;www.fluidsynth.org&quot;&gt;FluidSynth&lt;/a&gt; or &lt;a href=&quot;http://timidity.sourceforge.net/&quot;&gt;Timidity&lt;/a&gt;&lt;/p&gt;&lt;p&gt;PianoBooster does not come with any &lt;b&gt;MIDI Files&lt;/b&gt; and so you will need to get them from the net. See the &lt;a href=&quot;http://pianobooster.sourceforge.net/faq.html&quot; &gt;&lt;b&gt;PianoBooster FAQ&lt;/b&gt;&lt;/a&gt; for where to get MIDI files. PianoBooster works best with MIDI files that have separate left and right piano parts using MIDI channels 3 and 4.&lt;h3&gt;Setting Up&lt;/h3&gt;&lt;p&gt;First use the &lt;i&gt;Setup/Midi Setup&lt;/i&gt; menu and in the dialog box select the MIDI input and MIDI output interfaces that match your hardware. Next use &lt;i&gt;File/Open&lt;/i&gt; to open the MIDI file &quot;.mid&quot; or a karaoke &quot;.kar&quot; file. Now select whether you want to just &lt;i&gt;listen&lt;/i&gt; to the music or &lt;i&gt;play along&lt;/i&gt; on the piano keyboard by setting the &lt;i&gt;skill&lt;/i&gt; level on the side panel. Finally when you are ready click the &lt;i&gt;play icon&lt;/i&gt; (or press the &lt;i&gt;space bar&lt;/i&gt;) to roll the music.&lt;h3&gt;Hints on Playing the Piano&lt;/h3&gt;&lt;p&gt;For hints on how to play the piano see: &lt;a href=&quot;http://pianobooster.sourceforge.net/pianohints.html&quot; &gt;&lt;b&gt;Piano Hints&lt;/b&gt;&lt;/a&gt;&lt;/p&gt;&lt;h3&gt;More Information&lt;/h3&gt;&lt;p&gt;For more help please visit the PianoBooster &lt;a href=&quot;http://pianobooster.sourceforge.net/&quot; &gt;&lt;b&gt;website&lt;/b&gt;&lt;/a&gt;, the PianoBooster &lt;a href=&quot;http://pianobooster.sourceforge.net/faq.html&quot; &gt;&lt;b&gt;FAQ&lt;/b&gt;&lt;/a&gt; and the &lt;a href=&quot;http://n2.nabble.com/Piano-Booster-Users-f1591936.html&quot; &gt;&lt;b&gt;user forum&lt;/b&gt;&lt;/a&gt;. </source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/QtWindow.cpp" line="575"/>
<location filename="../src/QtWindow.cpp" line="582"/>
<source>About Piano Booster</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/QtWindow.cpp" line="577"/>
<location filename="../src/QtWindow.cpp" line="584"/>
<source>&lt;b&gt;PianoBooster - Version %1&lt;/b&gt; &lt;br&gt;&lt;br&gt;</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/QtWindow.cpp" line="578"/>
<location filename="../src/QtWindow.cpp" line="585"/>
<source>&lt;b&gt;Boost&lt;/b&gt; your &lt;b&gt;Piano&lt;/b&gt; playing skills!&lt;br&gt;&lt;br&gt;</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/QtWindow.cpp" line="579"/>
<location filename="../src/QtWindow.cpp" line="586"/>
<source>&lt;a href=&quot;http://pianobooster.sourceforge.net/&quot; &gt;&lt;b&gt;http://pianobooster.sourceforge.net&lt;/b&gt;&lt;/a&gt;&lt;br&gt;&lt;br&gt;</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/QtWindow.cpp" line="580"/>
<location filename="../src/QtWindow.cpp" line="587"/>
<source>Copyright(c) L. J. Barman, 2008-2009; All rights reserved.&lt;br&gt;&lt;br&gt;</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/QtWindow.cpp" line="581"/>
<location filename="../src/QtWindow.cpp" line="588"/>
<source>Copyright(c) Olivier Humbert, 2018 pour la traduction en français (for the French translation).&lt;br&gt;&lt;br&gt;</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/QtWindow.cpp" line="582"/>
<location filename="../src/QtWindow.cpp" line="589"/>
<source>This program is made available under the terms of the GNU General Public License version 3 as published by the Free Software Foundation.&lt;br&gt;&lt;br&gt;</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/QtWindow.cpp" line="586"/>
<location filename="../src/QtWindow.cpp" line="593"/>
<source>This program also contains RtMIDI: realtime MIDI i/o C++ classes&lt;br&gt;Copyright(c) 2003-2007 Gary P. Scavone</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/QtWindow.cpp" line="607"/>
<location filename="../src/QtWindow.cpp" line="614"/>
<source>PC Keyboard Short Cuts</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/QtWindow.cpp" line="609"/>
<location filename="../src/QtWindow.cpp" line="616"/>
<source>&lt;h2&gt;&lt;center&gt;Keyboard short cuts&lt;/center&gt;&lt;/h2&gt;&lt;p&gt;The following PC keyboard short cuts have been defined.&lt;/p&gt;&lt;center&gt;&lt;table border=&apos;1&apos; cellspacing=&apos;0&apos; cellpadding=&apos;4&apos; &gt;</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/QtWindow.cpp" line="615"/>
<location filename="../src/QtWindow.cpp" line="622"/>
<source>&lt;tr&gt;&lt;th&gt;Action&lt;/th&gt;&lt;th&gt;Key&lt;/th&gt;&lt;/tr&gt;</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/QtWindow.cpp" line="621"/>
<location filename="../src/QtWindow.cpp" line="628"/>
<source>Choose the right hand</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/QtWindow.cpp" line="622"/>
<location filename="../src/QtWindow.cpp" line="629"/>
<source>Choose both hands</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/QtWindow.cpp" line="623"/>
<location filename="../src/QtWindow.cpp" line="630"/>
<source>Choose the left Hand</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/QtWindow.cpp" line="624"/>
<location filename="../src/QtWindow.cpp" line="631"/>
<source>Play from start toggle</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/QtWindow.cpp" line="625"/>
<location filename="../src/QtWindow.cpp" line="632"/>
<source>Play Pause Toggle</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/QtWindow.cpp" line="626"/>
<location filename="../src/QtWindow.cpp" line="627"/>
<location filename="../src/QtWindow.cpp" line="633"/>
<location filename="../src/QtWindow.cpp" line="634"/>
<source>Increase the speed by 5%</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/QtWindow.cpp" line="628"/>
<location filename="../src/QtWindow.cpp" line="635"/>
<source>Change to the Next Song</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/QtWindow.cpp" line="629"/>
<location filename="../src/QtWindow.cpp" line="636"/>
<source>Change to the Previous Song</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/QtWindow.cpp" line="630"/>
<location filename="../src/QtWindow.cpp" line="637"/>
<source>Change to the Next Book</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/QtWindow.cpp" line="631"/>
<location filename="../src/QtWindow.cpp" line="638"/>
<source>Change to the Previous Book</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/QtWindow.cpp" line="633"/>
<location filename="../src/QtWindow.cpp" line="640"/>
<source>&lt;tr&gt;&lt;td&gt;Fake Piano keys&lt;/td&gt;&lt;td&gt;X is middle C&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt; &lt;/center&gt;&lt;br&gt;</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/QtWindow.cpp" line="654"/>
<location filename="../src/QtWindow.cpp" line="661"/>
<source>Open Midi File</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/QtWindow.cpp" line="655"/>
<location filename="../src/QtWindow.cpp" line="662"/>
<source>Midi Files</source>
<translation type="unfinished"></translation>
</message>