From b0c60cbceda42fa4c450ecba3afd0592c0f5d2bc Mon Sep 17 00:00:00 2001 From: Damien Grauser Date: Mon, 30 Nov 2009 20:47:42 +0100 Subject: [PATCH] add language selector and French translations --- src/AllPlot.cpp | 8 +- src/ConfigDialog.cpp | 14 +- src/CpintPlot.cpp | 14 +- src/CriticalPowerWindow.cpp | 8 +- src/Pages.cpp | 27 +- src/Pages.h | 175 +-- src/Settings.h | 13 +- src/application.qrc | 1 + src/main.cpp | 20 +- src/translations/gc_fr.qm | Bin 0 -> 42178 bytes src/translations/gc_fr.ts | 2097 +++++++++++++++++++++++++++++++++++ 11 files changed, 2262 insertions(+), 115 deletions(-) create mode 100644 src/translations/gc_fr.qm create mode 100644 src/translations/gc_fr.ts diff --git a/src/AllPlot.cpp b/src/AllPlot.cpp index 2183da11b..7000d79c9 100644 --- a/src/AllPlot.cpp +++ b/src/AllPlot.cpp @@ -470,13 +470,13 @@ AllPlot::setYMax() setAxisLabelAlignment(yLeft2,Qt::AlignVCenter); } if (speedCurve->isVisible()) { - setAxisTitle(yRight, (useMetricUnits ? "KPH" : "MPH")); + setAxisTitle(yRight, (useMetricUnits ? tr("KPH") : tr("MPH"))); setAxisScale(yRight, 0.0, 1.05 * speedCurve->maxYValue()); setAxisLabelRotation(yRight,90); setAxisLabelAlignment(yRight,Qt::AlignVCenter); } if (altCurve->isVisible()) { - setAxisTitle(yRight2, useMetricUnits ? "Meters" : "Feet"); + setAxisTitle(yRight2, useMetricUnits ? tr("Meters") : tr("Feet")); double ymin = altCurve->minYValue(); double ymax = qMax(ymin + 100, 1.05 * altCurve->maxYValue()); setAxisScale(yRight2, ymin, ymax); @@ -495,9 +495,9 @@ void AllPlot::setXTitle() { if (bydist) - setAxisTitle(xBottom, "Distance "+QString(unit.toString() == "Metric"?"(km)":"(miles)")); + setAxisTitle(xBottom, tr("Distance ")+QString(unit.toString() == "Metric"?"(km)":"(miles)")); else - setAxisTitle(xBottom, "Time (minutes)"); + setAxisTitle(xBottom, tr("Time (minutes)")); } void diff --git a/src/ConfigDialog.cpp b/src/ConfigDialog.cpp index 6ccbe9ad9..1ed506ac0 100644 --- a/src/ConfigDialog.cpp +++ b/src/ConfigDialog.cpp @@ -147,8 +147,18 @@ void ConfigDialog::changePage(QListWidgetItem *current, QListWidgetItem *previou // ! new mode: change the CP associated with the present mode void ConfigDialog::save_Clicked() { - boost::shared_ptr settings = GetApplicationSettings(); - settings->setValue(GC_UNIT, configPage->unitCombo->currentText()); + boost::shared_ptr settings = GetApplicationSettings(); + + if (configPage->langCombo->currentIndex()==0) + settings->setValue(GC_LANG, "en"); + else if (configPage->langCombo->currentIndex()==1) + settings->setValue(GC_LANG, "fr"); + + if (configPage->unitCombo->currentIndex()==0) + settings->setValue(GC_UNIT, "Metric"); + else if (configPage->unitCombo->currentIndex()==1) + settings->setValue(GC_UNIT, "English"); + settings->setValue(GC_ALLRIDES_ASCENDING, configPage->allRidesAscending->checkState()); settings->setValue(GC_CRANKLENGTH, configPage->crankLengthCombo->currentText()); settings->setValue(GC_BIKESCOREDAYS, configPage->BSdaysEdit->text()); diff --git a/src/CpintPlot.cpp b/src/CpintPlot.cpp index 4f3d33340..1704fce25 100644 --- a/src/CpintPlot.cpp +++ b/src/CpintPlot.cpp @@ -49,8 +49,8 @@ CpintPlot::CpintPlot(QString p, const Zones *zones) : insertLegend(new QwtLegend(), QwtPlot::BottomLegend); setCanvasBackground(Qt::white); - setAxisTitle(yLeft, "Average Power (watts)"); - setAxisTitle(xBottom, "Interval Length"); + setAxisTitle(yLeft, tr("Average Power (watts)")); + setAxisTitle(xBottom, tr("Interval Length")); setAxisScaleDraw(xBottom, new LogTimeScaleDraw); setAxisScaleEngine(xBottom, new LogTimeScaleEngine); setAxisScale(xBottom, 1.0 / 60.0, 60); @@ -272,16 +272,16 @@ CpintPlot::setEnergyMode(bool value) { energyMode_ = value; if (energyMode_) { - setAxisTitle(yLeft, "Total work (kJ)"); + setAxisTitle(yLeft, tr("Total work (kJ)")); setAxisScaleEngine(xBottom, new QwtLinearScaleEngine); setAxisScaleDraw(xBottom, new QwtScaleDraw); - setAxisTitle(xBottom, "Interval Length (minutes)"); + setAxisTitle(xBottom, tr("Interval Length (minutes)")); } else { - setAxisTitle(yLeft, "Average Power (watts)"); + setAxisTitle(yLeft, tr("Average Power (watts)")); setAxisScaleEngine(xBottom, new LogTimeScaleEngine); setAxisScaleDraw(xBottom, new LogTimeScaleDraw); - setAxisTitle(xBottom, "Interval Length"); + setAxisTitle(xBottom, tr("Interval Length")); } delete CPCurve; CPCurve = NULL; @@ -546,7 +546,7 @@ CpintPlot::plot_allCurve(CpintPlot *thisPlot, } // no zones available: just plot the curve without zones else { - QwtPlotCurve *curve = new QwtPlotCurve("maximal power"); + QwtPlotCurve *curve = new QwtPlotCurve(tr("maximal power")); curve->setRenderHint(QwtPlotItem::RenderAntialiased); QPen pen(Qt::red); pen.setWidth(2.0); diff --git a/src/CriticalPowerWindow.cpp b/src/CriticalPowerWindow.cpp index 4dc38d0c0..8e400f671 100644 --- a/src/CriticalPowerWindow.cpp +++ b/src/CriticalPowerWindow.cpp @@ -75,8 +75,8 @@ CriticalPowerWindow::CriticalPowerWindow(const QDir &home, MainWindow *parent) : otherLayout->addWidget(cpintSetCPButton); otherLayout->addWidget(cComboSeason); QComboBox *yAxisCombo = new QComboBox(this); - yAxisCombo->addItem("Y Axis Shows Power"); - yAxisCombo->addItem("Y Axis Shows Energy"); + yAxisCombo->addItem(tr("Y Axis Shows Power")); + yAxisCombo->addItem(tr("Y Axis Shows Energy")); otherLayout->addWidget(yAxisCombo); bottomLayout->addLayout(otherLayout); @@ -223,7 +223,7 @@ CriticalPowerWindow::pickerMoved(const QPoint &pos) label = QString("%1 kJ (%2)").arg(watts * minutes * 60.0 / 1000.0, 0, 'f', 0); else label = QString("%1 watts (%2)").arg(watts); - label = label.arg(date.isValid() ? date.toString("MM/dd/yyyy") : "no date"); + label = label.arg(date.isValid() ? date.toString("MM/dd/yyyy") : tr("no date")); } else label = tr("no data"); @@ -245,7 +245,7 @@ void CriticalPowerWindow::addSeasons() seasons = handler.getSeasons(); Season season; - season.setName("All Seasons"); + season.setName(tr("All Seasons")); seasons.insert(0,season); foreach (Season season, seasons) diff --git a/src/Pages.cpp b/src/Pages.cpp index 0bd37a354..3337c948b 100644 --- a/src/Pages.cpp +++ b/src/Pages.cpp @@ -10,10 +10,13 @@ ConfigurationPage::~ConfigurationPage() { delete configGroup; + delete langLabel; + delete langCombo; delete unitLabel; delete unitCombo; delete allRidesAscending; delete warningLabel; + delete langLayout; delete unitLayout; delete warningLayout; delete configLayout; @@ -24,14 +27,29 @@ ConfigurationPage::ConfigurationPage() { configGroup = new QGroupBox(tr("Golden Cheetah Configuration")); + boost::shared_ptr settings = GetApplicationSettings(); + + langLabel = new QLabel(tr("Language:")); + + langCombo = new QComboBox(); + langCombo->addItem(tr("English")); + langCombo->addItem(tr("French")); + + QVariant lang = settings->value(GC_LANG); + + if(lang.toString() == "en") + langCombo->setCurrentIndex(0); + else if(lang.toString() == "fr") + langCombo->setCurrentIndex(1); + else // default : English + langCombo->setCurrentIndex(0); + unitLabel = new QLabel(tr("Unit of Measurement:")); unitCombo = new QComboBox(); unitCombo->addItem(tr("Metric")); unitCombo->addItem(tr("English")); - boost::shared_ptr settings = GetApplicationSettings(); - QVariant unit = settings->value(GC_UNIT); if(unit.toString() == "Metric") @@ -88,6 +106,10 @@ ConfigurationPage::ConfigurationPage() warningLabel = new QLabel(tr("Requires Restart To Take Effect")); + langLayout = new QHBoxLayout; + langLayout->addWidget(langLabel); + langLayout->addWidget(langCombo); + unitLayout = new QHBoxLayout; unitLayout->addWidget(unitLabel); unitLayout->addWidget(unitCombo); @@ -131,6 +153,7 @@ ConfigurationPage::ConfigurationPage() configLayout = new QVBoxLayout; + configLayout->addLayout(langLayout); configLayout->addLayout(unitLayout); configLayout->addWidget(allRidesAscending); configLayout->addLayout(crankLengthLayout); diff --git a/src/Pages.h b/src/Pages.h index 1167c3941..e1b1a0b85 100644 --- a/src/Pages.h +++ b/src/Pages.h @@ -27,30 +27,35 @@ class QVBoxLayout; class ConfigurationPage : public QWidget { + Q_OBJECT public: ~ConfigurationPage(); ConfigurationPage(); + QComboBox *langCombo; QComboBox *unitCombo; QComboBox *crankLengthCombo; QCheckBox *allRidesAscending; - QLineEdit *BSdaysEdit; - QComboBox *bsModeCombo; - + QLineEdit *BSdaysEdit; + QComboBox *bsModeCombo; + private: - QGroupBox *configGroup; - QLabel *unitLabel; - QLabel *warningLabel; - QHBoxLayout *unitLayout; - QHBoxLayout *warningLayout; - QVBoxLayout *configLayout; - QVBoxLayout *mainLayout; - QGridLayout *bsDaysLayout; - QHBoxLayout *bsModeLayout; + QGroupBox *configGroup; + QLabel *langLabel; + QLabel *unitLabel; + QLabel *warningLabel; + QHBoxLayout *langLayout; + QHBoxLayout *unitLayout; + QHBoxLayout *warningLayout; + QVBoxLayout *configLayout; + QVBoxLayout *mainLayout; + QGridLayout *bsDaysLayout; + QHBoxLayout *bsModeLayout; }; class CyclistPage : public QWidget { + Q_OBJECT public: ~CyclistPage(); CyclistPage(const Zones *_zones); @@ -70,118 +75,120 @@ class CyclistPage : public QWidget QLabel *txtEndDate; QLabel *lblStartDate; QLabel *lblEndDate; - QLabel *perfManLabel; - QLabel *perfManStartLabel; - QLabel *perfManSTSLabel; - QLabel *perfManLTSLabel; - QLineEdit *perfManStart; - QLineEdit *perfManSTSavg; - QLineEdit *perfManLTSavg; + QLabel *perfManLabel; + QLabel *perfManStartLabel; + QLabel *perfManSTSLabel; + QLabel *perfManLTSLabel; + QLineEdit *perfManStart; + QLineEdit *perfManSTSavg; + QLineEdit *perfManLTSavg; int getCurrentRange(); - bool isNewMode(); + bool isNewMode(); - inline void setCPFocus() { - txtThreshold->setFocus(); - } + inline void setCPFocus() { + txtThreshold->setFocus(); + } - inline QDate selectedDate() { - return calendar->selectedDate(); - } + inline QDate selectedDate() { + return calendar->selectedDate(); + } private: - QGroupBox *cyclistGroup; + QGroupBox *cyclistGroup; const Zones *zones; int currentRange; - QLabel *lblThreshold; + QLabel *lblThreshold; QLineEdit *txtThreshold; - QIntValidator *txtThresholdValidator; - QVBoxLayout *perfManLayout; - QHBoxLayout *perfManStartValLayout; - QHBoxLayout *perfManSTSavgLayout; - QHBoxLayout *perfManLTSavgLayout; - QHBoxLayout *powerLayout; - QHBoxLayout *rangeLayout; - QHBoxLayout *dateRangeLayout; - QHBoxLayout *zoneLayout; - QHBoxLayout *calendarLayout; - QVBoxLayout *cyclistLayout; - QVBoxLayout *mainLayout; - QIntValidator *perfManStartValidator; - QIntValidator *perfManSTSavgValidator; - QIntValidator *perfManLTSavgValidator; + QIntValidator *txtThresholdValidator; + QVBoxLayout *perfManLayout; + QHBoxLayout *perfManStartValLayout; + QHBoxLayout *perfManSTSavgLayout; + QHBoxLayout *perfManLTSavgLayout; + QHBoxLayout *powerLayout; + QHBoxLayout *rangeLayout; + QHBoxLayout *dateRangeLayout; + QHBoxLayout *zoneLayout; + QHBoxLayout *calendarLayout; + QVBoxLayout *cyclistLayout; + QVBoxLayout *mainLayout; + QIntValidator *perfManStartValidator; + QIntValidator *perfManSTSavgValidator; + QIntValidator *perfManLTSavgValidator; }; class deviceModel : public QAbstractTableModel { + Q_OBJECT - public: - deviceModel(QObject *parent=0); - QObject *parent; + public: + deviceModel(QObject *parent=0); + QObject *parent; - // sets up the headers - QVariant headerData(int section, Qt::Orientation orientation, int role) const; + // sets up the headers + QVariant headerData(int section, Qt::Orientation orientation, int role) const; - // how much data do we have? - int rowCount(const QModelIndex &parent) const; - int columnCount(const QModelIndex &parent) const; + // how much data do we have? + int rowCount(const QModelIndex &parent) const; + int columnCount(const QModelIndex &parent) const; - // manipulate the data - data() gets and setData() sets (set/get might be better?) - QVariant data(const QModelIndex &index, int role) const; - bool setData(const QModelIndex &index, const QVariant &value, int role); + // manipulate the data - data() gets and setData() sets (set/get might be better?) + QVariant data(const QModelIndex &index, int role) const; + bool setData(const QModelIndex &index, const QVariant &value, int role); - // insert/remove and update - void add(DeviceConfiguration &); // add a new DeviceConfiguration - void del(); // add a new DeviceConfiguration - bool insertRows(int position, int rows, const QModelIndex &index=QModelIndex()); - bool removeRows(int position, int rows, const QModelIndex &index=QModelIndex()); + // insert/remove and update + void add(DeviceConfiguration &); // add a new DeviceConfiguration + void del(); // add a new DeviceConfiguration + bool insertRows(int position, int rows, const QModelIndex &index=QModelIndex()); + bool removeRows(int position, int rows, const QModelIndex &index=QModelIndex()); - QList Configuration; // the actual data + QList Configuration; // the actual data }; class DevicePage : public QWidget { + Q_OBJECT public: ~DevicePage(); DevicePage(QWidget *parent = 0); void setConfigPane(); void pairClicked(DeviceConfiguration *, QProgressDialog *); - QList devices; + QList devices; - // GUI Elements - QGroupBox *deviceGroup; - QLabel *nameLabel; - QLineEdit *deviceName; + // GUI Elements + QGroupBox *deviceGroup; + QLabel *nameLabel; + QLineEdit *deviceName; - QLabel *typeLabel; - QComboBox *typeSelector; + QLabel *typeLabel; + QComboBox *typeSelector; - QLabel *specLabel; - QLabel *specHint; // hints at the format for a port spec - QLabel *profHint; // hints at the format for profile info - QLineEdit *deviceSpecifier; + QLabel *specLabel; + QLabel *specHint; // hints at the format for a port spec + QLabel *profHint; // hints at the format for profile info + QLineEdit *deviceSpecifier; - QLabel *profLabel; - QLineEdit *deviceProfile; + QLabel *profLabel; + QLineEdit *deviceProfile; - QCheckBox *isDefaultDownload; - QCheckBox *isDefaultRealtime; + QCheckBox *isDefaultDownload; + QCheckBox *isDefaultRealtime; - QTableView *deviceList; + QTableView *deviceList; - QPushButton *addButton; - QPushButton *delButton; - QPushButton *pairButton; + QPushButton *addButton; + QPushButton *delButton; + QPushButton *pairButton; - QGridLayout *leftLayout; - QVBoxLayout *rightLayout; + QGridLayout *leftLayout; + QVBoxLayout *rightLayout; - QGridLayout *inLayout; - QVBoxLayout *mainLayout; + QGridLayout *inLayout; + QVBoxLayout *mainLayout; - deviceModel *deviceListModel; + deviceModel *deviceListModel; }; diff --git a/src/Settings.h b/src/Settings.h index b983a0a59..f8de0493b 100644 --- a/src/Settings.h +++ b/src/Settings.h @@ -1,16 +1,16 @@ -/* +/* * Copyright (c) 2006 Sean C. Rhea (srhea@srhea.net) * * This program is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by the Free * Software Foundation; either version 2 of the License, or (at your option) * any later version. - * + * * This program is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for * more details. - * + * * You should have received a copy of the GNU General Public License along * with this program; if not, write to the Free Software Foundation, Inc., 51 * Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA @@ -18,7 +18,7 @@ #ifndef _GC_Settings_h #define _GC_Settings_h 1 - + #define GC_SETTINGS_CO "goldencheetah.org" #define GC_SETTINGS_APP "GoldenCheetah" #define GC_SETTINGS_LAST "mainwindow/lastOpened" @@ -31,6 +31,7 @@ #define GC_SETTINGS_CALENDAR_SIZES "mainwindow/calendarSizes" #define GC_DATETIME_FORMAT "ddd MMM dd, yyyy, hh:mm AP" #define GC_UNIT "unit" +#define GC_LANG "lang" #define GC_SETTINGS_LAST_IMPORT_PATH "mainwindow/lastImportPath" #define GC_ALLRIDES_ASCENDING "allRidesAscending" #define GC_CRANKLENGTH "crankLength" @@ -64,7 +65,7 @@ #include inline boost::shared_ptr GetApplicationSettings() -{ +{ boost::shared_ptr settings; QDir home = QDir(); //First check to see if the Library folder exists where the executable is (for USB sticks) @@ -72,7 +73,7 @@ inline boost::shared_ptr GetApplicationSettings() settings = boost::shared_ptr(new QSettings(GC_SETTINGS_CO, GC_SETTINGS_APP)); else settings = boost::shared_ptr(new QSettings(home.absolutePath()+"/gc", QSettings::IniFormat)); - + return settings; } diff --git a/src/application.qrc b/src/application.qrc index 668bfb43d..932720741 100644 --- a/src/application.qrc +++ b/src/application.qrc @@ -7,5 +7,6 @@ images/update.png images/gc.png images/config.png + translations/gc_fr.qm diff --git a/src/main.cpp b/src/main.cpp index b12ae3248..a4f9d2bf9 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -1,16 +1,16 @@ -/* +/* * Copyright (c) 2006 Sean C. Rhea (srhea@srhea.net) * * This program is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by the Free * Software Foundation; either version 2 of the License, or (at your option) * any later version. - * + * * This program is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for * more details. - * + * * You should have received a copy of the GNU General Public License along * with this program; if not, write to the Free Software Foundation, Inc., 51 * Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA @@ -23,16 +23,16 @@ #include "MainWindow.h" #include "Settings.h" -// BLECK - homedir passing via global becuase ridefile is pure virtual and +// BLECK - homedir passing via global becuase ridefile is pure virtual and // cannot pass with current definition -- Sean can advise!! extern QString WKO_HOMEDIR; MainWindow *mainwindow; -int +int main(int argc, char *argv[]) { QApplication app(argc, argv); - + //this is the path within the current directory where GC will look for //files to allow USB stick support QString localLibraryPath="Library/GoldenCheetah"; @@ -87,6 +87,14 @@ main(int argc, char *argv[]) } boost::shared_ptr settings; settings = GetApplicationSettings(); + + // Language setting + QVariant lang = settings->value(GC_LANG); + // Load specific translation + QTranslator gcTranslator; + gcTranslator.load(":translations/gc_" + lang.toString() + ".qm"); + app.installTranslator(&gcTranslator); + QVariant lastOpened = settings->value(GC_SETTINGS_LAST); QVariant unit = settings->value(GC_UNIT); double crankLength = settings->value(GC_CRANKLENGTH).toDouble(); diff --git a/src/translations/gc_fr.qm b/src/translations/gc_fr.qm new file mode 100644 index 0000000000000000000000000000000000000000..ffb7e645c4edf9afd92a757c472a9be928aa064f GIT binary patch literal 42178 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 xPM2d(F-O3`=0^kH>S-WFl%P + + + + + + line %1: read new range without reading any zones for previous one + ligne %1: lecture d'une nouvelle période sans avoir lu aucune période précédente + + + line %1: read zone without preceeding date range + ligne %1: lecture de zone sans zone période de date + + + attempt to set zone based on % of CP without setting CP in line number %1. + + tentative de définir une zone en fonction du % de CP sans valeur définie pour CP à la ligne %1. + + + + file ended without reading any zones for last range + Le fichier se termine sans zone pour la dernière période + + + Setting end date of range %1 to start date of range %2. + + Uilise la fin de la période %1 comme début pour la période %2. + + + + Extending final range %1 to infinite to include present date. + + Etent la dernière période %1 pour inclure la date actuelle. + + + + Range %1: matching top of zone %2 (%3) to bottom of zone %4 (%5). + + Période %1: corrige le haut de la zone %2 (%3) avec le bas de la zone %4 (%5). + + + + Range %1: setting top of zone %2 from %3 to MAX. + + Période %1: corrige le haut de la zone %2 de %3 au max. + + + + Critical Power: %1 + Puissance critique : %1 + + + + AllPlot + + + KPH + km/h + + + + MPH + m/h + + + + Meters + Mètres + + + + Feet + Pieds + + + + Distance + Distance + + + + Time (minutes) + Temps (minutes) + + + + AllPlotWindow + + + Power + shade + Puissance + zones + + + + Power - shade + Puissance - zones + + + + No Power + Sans puissance + + + + X Axis Shows Time + En fonction du temps + + + + X Axis Shows Distance + En fonction de la distance + + + + Smoothing (secs) + Lissage (secs) + + + + BestIntervalDialog + + + Interval length: + Longueur de l'intervalle + + + + How many to find: + Nombre à rechercher + + + + Results: + Résultats + + + + &Find Intervals + Chercher les intervalles + + + + &Done + OK + + + + Select Ride + Sélectionner une sortie + + + + No ride selected! + Pas de sortie sélectionnée + + + + Bad Interval Length + Mauvaise longueur d'intervalle + + + + Interval length must be greater than zero! + La longueur de l'intervalle doit être plus grande que zero ! + + + + ChooseCyclistDialog + + + &New... + &Nouveau + + + + &Open + &Ouvrir + + + + &Cancel + Annuler + + + + Create New Cyclist + Ajouter un nouveau cycliste + + + + Enter New Cyclist's Name + Entrez les nom du nouveau cycliste + + + + Fatal Error + Erreur fatale + + + + Can't create new directory + Impossible de créer le nouveau répertoire + + + + ConfigDialog + + + Close + Fermer + + + + Save + Sauver + + + + Config Dialog + Fenêtre de configuration + + + + Configuration + Configuration + + + + Cyclist Info + Cycliste + + + + Devices + Appareils + + + + Short Term Stress + Charge à court terme (STS) + + + + STS + STS + + + + Long Term Stress + Charge à long terme (LTS) + + + + LTS + LTS + + + + Stress Balance + Equilibre de charge SB + + + + SB + SB + + + + Invalid CP + Puissance critique invalide + + + + Are you sure you want to delete the zone range +from %1 to %2? +(%3 range will extend to this date range): + Etes-vous certain de vouloir supprimer la période du %1 au %2 ? (La période %3 sera étendue sur ces dates) + + + + Delete + Effacer + + + + ConfigurationPage + + + Golden Cheetah Configuration + Configuration de GoldenCheetah + + + + Unit of Measurement: + Unité de mesure + + + + Metric + Métrique + + + + + English + Impériales + + + + Language: + Langue : + + + + Français + + + + + Crank Length: + Longueur des manivelles + + + + Sort ride list ascending. + Trier les sorties dans l'ordre chronologique + + + + Requires Restart To Take Effect + Nécessite un redémarrage pour prendre effet + + + + BikeScore Estimate: use rides within last + Estimation du BikeScore: utiliser les derniers + + + + days + jours + + + + BikeScore estimate mode: + Mode d'estimation du Bike Score + + + + CpintPlot + + + + Average Power (watts) + Puissance moyenne (Watts) + + + + + Interval Length + Longueur de l'intervalle + + + + Total work (kJ) + Travail total (kJ) + + + + Interval Length (minutes) + Longueur de l'intervale (minutes) + + + + maximal power + Puissance max + + + + Computing critical power intervals. +This may take a while. + + Analyse de la puissance critique. +Ceci peut prendre un certain temps. + + + + Abort + Annuler + + + + Processing %1... + Traitement %1... + + + + Aggregating over all files. + Aggrégation des résultats + + + + CriticalPowerWindow + + + Interval Duration: + Durée de l'intervalle + + + + Today: + Aujourd'hui: + + + + + + + + + no data + Pas de donnée + + + + Best: + Meilleur: + + + + CP Curve: + Courbe CP: + + + + &Save CP value + &Sauver la valeur CP + + + + Y Axis Shows Power + L'axe Y montre la Puissance + + + + Y Axis Shows Energy + L'axe Y montre l'énergie + + + + Set CP value to extracted value + Mettre à jour la CP avec la valeur extraite + + + + No non-zero extracted value was identified: + + Aucune valeur n'a pu être identifiée + + + + Zones were unchanged. + Les zones n'ont pas été modifiées. + + + + no date + Pas de date + + + Failed to parse seasons.xml + Echec dans la lecture de seasons.xml + + + + All Seasons + Toutes les saisons + + + + CyclistPage + + + Cyclist Options + Options du cycliste + + + + Critical Power: + Puissance critique: + + + + Back + Retour + + + + Forward + Avancer + + + + Delete Range + Effacer la période + + + + New Range from Date + Nouvelle période depuis la date + + + + Performance Manager + Gestionnaire de performance + + + + Starting LTS + Valeur LTS initiale + + + + STS average (days) + STS moyen (par jour) + + + + LTS average (days) + LTS moyen (par jours) + + + + DBAccess + + + Cannot open database + Impossible d'ouvrir la base de données + + + + Unable to establish a database connection. +This example needs SQLite support. Please read the Qt SQL driver documentation for information how to build it. + +Click Cancel to exit. + Impossible d'établir la connection avec la base de données. +Cet exemple nécessite le support SQLite. Lisez SVP la documentation "QT SQL driver" pour plus d'informations sur son utilisation. + +Choisir Annuler pour sortir. + + + + DatePickerDialog + + + Import CSV file + Importer un fichier CSV + + + + File to import... + Fichier à importer... + + + + OK + OK + + + + Cancel + Annuler + + + + Import CSV + Importer CSV + + + + Comma Separated Values (*.csv) + CSV (séparateur point virgule) (*.cvs) + + + + DevicePage + + + Device Name + Nom de l'appareil + + + + Device Type + Type de l'appareil + + + + Device Port + Port de l'appareil + + + + Device Profile + Profile de l'appareil + + + + Add + Ajouter + + + + Delete + Supprimer + + + + Pair + Coupler + + + + Device Configuration + Configuration de l'appareil + + + + DownloadRideDialog + + + Instructions: + Instructions : + + + + &Download + Télécharger + + + + &Rescan + &Rechercher + + + + + &Cancel + Annuler + + + + Select port: + Sélectionner le port : + + + + Select device type: + Sélectionner le type d'appareil : + + + + No devices found. Make sure the device +unit is plugged into the computer, +then click "Rescan" to check again. + Aucun appareil trouvé. Assurez-vous + que l'appareil est connecté à votre +ordinateur, puis choisir "Rechercher" +pour vérifier une nouvelle fois. + + + + Download canceled + Téléchargement annulé + + + + Cancel clicked by user. + Annuler par l'utilisateur. + + + + Download failed + Echec du téléchargement + + + + Ride Already Downloaded + Sortie déjé téléchargée + + + + This ride appears to have already + Cette sortie semble avoir déjà été + + + + been downloaded. Do you want to + téléchargée. Voulez-vous + + + + overwrite the previous download? + écraser la précédente sortie ? + + + + &Overwrite + Ecraser + + + + + Error + Erreur + + + + Failed to remove existing file + Impossible de supprimer le fichier existant + + + + Failed to rename + Impossible de renommer + + + + to + en + + + + Success + Succès + + + + Download complete. + Téléchargement accompli. + + + + HistogramWindow + + + Bin width + Largeur de l'histogramme + + + + Watts(shaded) + Watts (Zones) + + + + Watts(unshaded) + Watts (Sans zone) + + + + Torque + Couple + + + + Heartrate + Fréquence cardiaque + + + + Speed + Vitesse + + + + Cadence + Cadence + + + + no data + pas de donnée + + + + MainWindow + + + Invalid Ride File Name + Nom de fichier invalide + + + + Invalid date/time in filename: +%1 +Skipping file... + Date/heure invalide dans le fichier: %1 +Fichier ignoré... + + + + Zones File Error + Erreur dans le fichier des zones + + + + Reading Zones File + Lecture du fichier des zones + + + + All Rides + Toutes les sorties + + + + Ride Summary + Résumé de la sortie + + + + Ride Plot + Tracé de la sortie + + + + Critical Power Plot + Tracé Puissance critique + + + + Histogram Analysis + Analyse par histogramme + + + + PF/PV Plot + Tracé PF/PV + + + + Notes + Notes + + + + Weekly Summary + Résumé hebdomadaire + + + + Performance Manager + Gestionnaire de performance + + + + Realtime + Temps réel + + + + &Cyclist + &Cycliste + + + + &New... + &Nouveau + + + + Ctrl+N + Ctrl+N + + + + &Open... + &Ouvrir + + + + + Ctrl+O + Ctrl+O + + + + &Quit + &Quitter + + + + Ctrl+Q + Ctrl+Q + + + + &Ride + Sortie + + + + &Download from device... + &Télécharder depuis l'appareil... + + + + Ctrl+D + Ctrl+T + + + + &Export to CSV... + &Exporter en CSV... + + + + Ctrl+E + Ctrl+E + + + + &Import from File... + &Importer un fichier... + + + + Ctrl+I + Ctrl+I + + + + Find &best intervals... + &Rechercher les meilleurs intervalles + + + + Ctrl+B + Ctrl+M + + + + Split &ride... + Diviser une sortie... + + + + D&elete ride... + &Effacer une sortie... + + + + &Manual ride entry... + Entrer &manuellement une sortie... + + + + Ctrl+M + Ctrl+M + + + + &Tools + Outils + + + + &Options... + Options + + + + Critical Power Calculator + Estimateur de puissance critique + + + + &Help + &Aide + + + + &About GoldenCheetah + A &Propos de GoldenCheetah + + + + + Can't rename %1 to %2 + Impossible de renommer %1 en %2 + + + + Select Ride + Sélectionner une sortie + + + + No ride selected! + Aucune sortie sélectionner + + + + Metric + Métriques + + + + English + Impériales + + + + Select Units + Sélectionner les unités + + + + Units: + Unités + + + + Export CSV + Exporter en CSV + + + + Comma-Separated Values (*.csv) + CSV (séparateur point-virgule) (*.csv) + + + + Split Ride + Division de la sortie + + + + The file %1 can't be opened for writing + Impossible de modifier le fichier %1 + + + + Import from File + Importer un fichier + + + + Computing bike score estimating factors. + + Calcul des facteurs pour l'estimation du BikeScore + + + + Abort + Annuler + + + + Processing %1... + Traitement %1... + + + + Read Error + Erreur de lecture + + + + Can't read notes file %1 + Impossible d'accéder au fichier de note %1 + + + + + Write Error + Erreur d'écriture + + + + Can't write notes file %1 + Impossible d'enregistrer le fichier de note %1 + + + + CP saved + CP sauvée + + + + Range from %1 to %2 +Rider CP set to %3 watts + Période du %1 au %2 +CP du cycliste fixée à %3 watts + + + + About GoldenCheetah + A propos de GoldenCheetah + + + + <center><h2>GoldenCheetah</h2><i>Cycling Power Analysis Software for Linux, Mac, and Windows</i><p><i>Build date: + <center><h2>GoldenCheetah</h2><i>Logiciel d'analyse de la puissance cycliste pour Linux, Mac et Windows</i><p><i>Build date: + + + + </i><p><i>Version: + + + + + </i><p>GoldenCheetah is licensed under the <a href="http://www.gnu.org/copyleft/gpl.html">GNU General Public License</a>.<p>Source code can be obtained from <a href="http://goldencheetah.org/">http://goldencheetah.org/</a>.</center> + </i><p>GoldenCheetah est licenciée sous <a href="http://www.gnu.org/copyleft/gpl.html">GNU General Public License</a>.<p>Le code source peut être optenu sur <a href="http://goldencheetah.org/">http://goldencheetah.org/</a>.</center> + + + + Are you sure you want to delete the ride: + Etes-vous certain de vouloir supprimer la sortie: + + + + Delete + Supprimer + + + + ManualRideDialog + + + Manually Enter Ride Data + Entrée manuelle d'une sortie + + + + Ride date: + Date de la sortie : + + + + ddd MMM d, yyyy h:mm AP + ddd MMM d, yyyy h:mm AP + + + + Ride length: + Longueur de la sortie + + + + hours + heures + + + + mins + min + + + + secs + sec + + + + Distance + Distance + + + + km + km + + + + miles + miles + + + + Average HR: + Fréquence moyenne : + + + + Estimate BikeScore by: + Estimation du BikeScore par : + + + + Time + Temps + + + + Distance + Distance + + + + BikeScore: + BikeScore : + + + + &OK + &OK + + + + + &Cancel + &Annuler + + + + Ride Already Downloaded + Sortie déjé téléchargée + + + + This ride appears to have already + Cette sortie semble avoir déjà été + + + + been downloaded. Do you want to + téléchargée. Voulez-vous + + + + download it again and overwrite + téléchargée. Voulez-vous + + + + the previous download? + écraser la précédente sortie ? + + + + &Overwrite + Ecraser + + + + + + Error + Erreur + + + + Failed to create temporary file + Impossible de créer le fichier temporaire + + + + Failed to remove existing file + Impossible de supprimer le fichier existant + + + + Failed to rename + Impossible de renommer + + + + to + en + + + + PerfPlot + + + Stress (BS/Day) + Charge (BS/Day) + + + + Time (days) + Temps (jours) + + + + Short Term Stress + Charge à court terme (STS) + + + + Long Term Stress + Charge à long terme (LTS) + + + + Stress Balance + Equilibre de charge (SB) + + + + PerformanceManagerWindow + + + Day: + Jour : + + + + no data + pas de donnée + + + + to + en + + + + PfPvPlot + + + Average Effective Pedal Force (N) + Force effective moyenne sur la pédale (N) + + + + Circumferential Pedal Velocity (m/s) + Vitesse circonferentielle de la pédale (m/s) + + + + PfPvWindow + + + Watts: + Watts + + + + RPM: + t/min + + + + Crank Length (m): + Longueur des manivelles (mm) : + + + + RealtimeWindow + + + + Start + Commencer + + + + + Pause + Pause + + + + Stop + Stopper + + + + WATTS + Watts + + + + BPM + Pulsations + + + + KPH + km/h + + + + RPM + t/min + + + + + Lap/Interval + Tour/Intervalle + + + + Load WATTS + Charge en Watts + + + + Distance (KM) + Distance (km) + + + + Avg WATTS + Puissance moyenne + + + + Avg BPM + Moyenne pulsations + + + + Avg KPH + Moyenne km/h + + + + Avg RPM + Moyenne t/min + + + + Avg Load WATTS + Charge moyenne Watts + + + + LAP TIME + Temps du circuit + + + + TIME + Temps + + + + Un-Pause + Pause + + + + No Devices Configured + Pas d'appareil configuré + + + + Open Workout File + Ouvrir un fichier d'exercice + + + + Workout Files (*.erg *.mrc *.crs) + Fichier d'erercices (*.erg *.mrc *.crs) + + + + RideImportWizard + + + Select Date... + Sélectionner une date... + + + + Today + Aujourd'hui + + + + Last Monday + Dernier lundi + + + + Last Tuesday + Dernier mardi + + + + Last Wednesday + Dernier mercredi + + + + Last Thursday + Dernier jeudi + + + + Last Friday + Dernier vendredi + + + + Last Saturday + Dernier samedi + + + + Last Sunday + Dernier dimanche + + + + Choose Date + Choisir la date + + + + Cancel + Annuler + + + + + + Abort + Interrompre + + + + Overwrite Existing Files + Ecraser les fichiers existants + + + + Import Ride Files + Importer les fichiers de sorties + + + + Filename + Nom du fichier + + + + Date + Date + + + + Time + Heure + + + + Duration + Durée + + + + Distance + Distance + + + + Import Status + Status de l'importation + + + + Step 1 of 4: Check file permissions + Etape 1 à 4 : Vérification des permissions + + + + Queued + A faire + + + + Error - Unknown file type + Erreur - type de fichier inconnu + + + + Error - Not a valid file + Erreur - Fichier invalide + + + + Step 2 of 4: Validating Files + Etape 2 sur 4 : Validation des fichiers + + + + + + + + + + Error + Erreur + + + + Parsing... + Analyse... + + + + Validated + Validé + + + + + + dd MMM yyyy + + + + + hh:mm:ss ap + + + + + 00:00:00 + + + + + 0 km + + + + + Error - + Erreur - + + + + + + + + + Step 3 of 4: Confirm Date and Time + Etape 3 sur 4 : Confirmation de la date et heure + + + + Save + Sauver + + + + + hh:mm:ss + + + + + Invalid Selection + Sélection invalide + + + + More than 24hrs of rides to fit into a day + Plus de 24h de sortie pour une seule journée + + + + + hh:mm:ss a + + + + + Step 4 of 4: Save to Library + Etape 4 sur 4 : Sauvegarde des sorties + + + + Saving... + Sauvegarde... + + + + Error - Source is Target + Erreur - La source est aussi la cible + + + + Overwriting file... + Remplace le fichier... + + + + / + + + + + .tmp + + + + + File Overwritten + Fichier remplacà + + + + + Error - overwrite failed + Erreur - Echec du remplacement + + + + Error - File exists + Erreur - Le fichier existe + + + + Saving file... + Sauvegarde du fichier... + + + + File Saved + Fichier sauvé + + + + Error - copy failed + Erreur - La copie a échouée + + + + Step 5 of 5: Calculating Critical Powers + Etape 5 sur 5 : Calcul des puissances maximales + + + + Calculating... + Calcul... + + + + Completed. + Accompli. + + + + Finish + Terminé. + + + + RideItem + + + <metrics> + <metric_group name="Totals"> + <metric name="workout_time" display_name="Workout time" + precision="0"/> + <metric name="time_riding" display_name="Time riding" + precision="0"/> + <metric name="total_distance" display_name="Distance" + precision="1"/> + <metric name="total_work" display_name="Work" + precision="0"/> + <metric name="elevation_gain" display_name="Elevation Gain" + precision="1"/> + </metric_group> + <metric_group name="Averages"> + <metric name="average_speed" display_name="Speed" + precision="1"/> + <metric name="average_power" display_name="Power" + precision="0"/> + <metric name="average_hr" display_name="Heart rate" + precision="0"/> + <metric name="average_cad" display_name="Cadence" + precision="0"/> + </metric_group> + <metric_group name="Metrics" note="BikeScore is a trademark of Dr. Philip Friere Skiba, PhysFarm Training Systems LLC"> + <metric name="skiba_xpower" display_name="xPower" + precision="0"/> + <metric name="skiba_relative_intensity" + display_name="Relative Intensity" precision="3"/> + <metric name="skiba_bike_score" display_name="BikeScore&#8482;" + precision="0"/> + <metric name="aerobic_decoupling" display_name="Aerobic Decoupling" + precision="2"/> + </metric_group> +</metrics> + + <metrics> + <metric_group name="Totaux"> + <metric name="workout_time" display_name="Durée de l'entraînement" + precision="0"/> + <metric name="time_riding" display_name="Temps en mouvement" + precision="0"/> + <metric name="total_distance" display_name="Distance" + precision="1"/> + <metric name="total_work" display_name="Travail" + precision="0"/> + <metric name="elevation_gain" display_name="Dénivelé" + precision="1"/> + </metric_group> + <metric_group name="Moyennes"> + <metric name="average_speed" display_name="Vitesse" + precision="1"/> + <metric name="average_power" display_name="Puissance" + precision="0"/> + <metric name="average_hr" display_name="Fréquence cardiaque" + precision="0"/> + <metric name="average_cad" display_name="Cadence" + precision="0"/> + </metric_group> + <metric_group name="Scores" note="BikeScore est une marque déposé par Dr. Philip Friere Skiba, PhysFarm Training Systems LLC"> + <metric name="skiba_xpower" display_name="xPower" + precision="0"/> + <metric name="skiba_relative_intensity" + display_name="Relative Intensity" precision="3"/> + <metric name="skiba_bike_score" display_name="BikeScore&#8482;" + precision="0"/> + <metric name="aerobic_decoupling" display_name="Découplage aérobique" + precision="2"/> + </metric_group> +</metrics> + + + + Totals + Totaux + + + + <p>Couldn't read file " + <p>Impossible de lire le fichier " + + + + </h2><h3>Device Type: + </h2><h3>Type d'appareil : + + + + SplitRideDialog + + + Split at the following positions: + Diviser à la position courante : + + + + &OK + + + + + &Cancel + &Annuler + + + + Interval %1 + Intervalle %1 + + + + Time Gap: + Pause : + + + + + Split Ride + Diviser la sortie + + + + The file %1 already exists and will not be overwritten + Le fichier %1 existe déjà et ne peut pas être écrasé + + + + The file %1 can't be opened for writing + Le fichier %1 ne peut pas être ouvert en écriture + + + + StressCalculator + + + Computing stress. + + Analyse de la charge. + + + + Abort + Interrompre + + + + Processing %1... + Annalyse %1... + + + + ToolsDialog + + + Critical Power Calculator + Estimateur de puissance critique + + + + Your best short effort (3-5 min): + Votre meilleur effort court (3-5 min) : + + + + Your best long effort (15-60 min): + Votre meilleur effort long (15-60 min) : + + + + Your critical power: + Votre puissance critique : + + + + Calculate CP + Estimer la CP + + + + Done + OK + + + + WeeklySummaryWindow + + + <center><h2>Week of %1 through %2</h2><h2>Summary</h2><p><table align="center" width="60%" border=0><tr><td>Total time riding:</td> <td align="right">%3:%4:%5</td></tr><tr><td>Total distance (%6):</td> <td align="right">%7</td></tr><tr><td>Total work (kJ):</td> <td align="right">%8</td></tr><tr><td>Daily Average work (kJ):</td> <td align="right">%9</td></tr> + <center><h2>Semaine du %1 au %2</h2><h2>Résumé</h2><p><table align="center" width="60%" border=0><tr><td>Temps total à rouler:</td> <td align="right">%3:%4:%5</td></tr><tr><td>Distance totale (%6):</td> <td align="right">%7</td></tr><tr><td>Travail total (kJ):</td> <td align="right">%8</td></tr><tr><td>Travail journalier moyen (kJ):</td> <td align="right">%9</td></tr> + + + + <tr><td>Total BikeScore:</td> <td align="right">%1</td></tr><tr><td>Net Relative Intensity:</td> <td align="right">%2</td></tr> + <tr><td>BikeScore total :</td> <td align="right">%1</td></tr><tr><td>Intensitité relative : </td> <td align="right">%2</td></tr> + + + + </table><h2>Power Zones</h2> + </table><h2>Zones de puissance</h2> + + + + Zones + + + line %1: read new range without reading any zones for previous one + ligne %1: lecture d'une nouvelle période sans avoir lu aucune période précédente + + + + line %1: read zone without preceeding date range + ligne %1: lecture de zone sans zone période de date + + + + + attempt to set zone based on % of CP without setting CP in line number %1. + + tentative de définir une zone en fonction du % de CP sans valeur définie pour CP à la ligne %1. + + + + + file ended without reading any zones for last range + Le fichier se termine sans zone pour la dernière période + + + + Setting end date of range %1 to start date of range %2. + + Uilise la fin de la période %1 comme début pour la période %2. + + + + + Extending final range %1 to infinite to include present date. + + Etent la dernière période %1 pour inclure la date actuelle. + + + + + Range %1: matching top of zone %2 (%3) to bottom of zone %4 (%5). + + Période %1: corrige le haut de la zone %2 (%3) avec le bas de la zone %4 (%5). + + + + + Range %1: setting top of zone %2 from %3 to MAX. + + Période %1: corrige le haut de la zone %2 de %3 au max. + + + + + Critical Power: %1 + Puissance critique : %1 + + + + Zone + Zone + + + + Description + Description + + + + Low + Min + + + + High + Max + + + + Time + Temps + + + Active Recovery + Récupération active + + + Endurance + Endurance + + + Tempo + Tempo + + + Threshold + Seuil + + + VO2Max + VO2Max + + + Anaerobic + Anaérobie + + + Neuromuscular + Neuromusculaire + + + + deviceModel + + + Device Name + Nom de l'appareil + + + + Device Type + Type de l'appareil + + + + Port Spec + Spécification du port + + + + Profile + Profile + + +