Client - application translation

This commit is contained in:
Sam 2019-09-16 12:51:44 +02:00
parent 77bc32d4a5
commit 131f315911
18 changed files with 219 additions and 111 deletions

View File

@ -11,6 +11,7 @@ export default function ActivityCardHeader(props) {
displayModal, displayModal,
segmentId, segmentId,
sport, sport,
t,
title, title,
user, user,
} = props } = props
@ -40,14 +41,14 @@ export default function ActivityCardHeader(props) {
<i <i
className="fa fa-chevron-left" className="fa fa-chevron-left"
aria-hidden="true" aria-hidden="true"
title={`See previous ${dataType}`} title={t(`activities:See previous ${dataType}`)}
/> />
</Link> </Link>
) : ( ) : (
<i <i
className="fa fa-chevron-left inactive-link" className="fa fa-chevron-left inactive-link"
aria-hidden="true" aria-hidden="true"
title={`No previous ${dataType}`} title={t(`activities:No previous ${dataType}`)}
/> />
)} )}
</div> </div>
@ -62,14 +63,14 @@ export default function ActivityCardHeader(props) {
<i <i
className="fa fa-edit custom-fa" className="fa fa-edit custom-fa"
aria-hidden="true" aria-hidden="true"
title="Edit activity" title={t('activities:Edit activity')}
/> />
</Link> </Link>
<i <i
className="fa fa-trash custom-fa" className="fa fa-trash custom-fa"
aria-hidden="true" aria-hidden="true"
onClick={() => displayModal(true)} onClick={() => displayModal(true)}
title="Delete activity" title={t('activities:Delete activity')}
/> />
</> </>
) : ( ) : (
@ -80,7 +81,7 @@ export default function ActivityCardHeader(props) {
> >
{title} {title}
</Link>{' '} </Link>{' '}
- segment {segmentId} - {t('activities:segment')} {segmentId}
</> </>
)} )}
<br /> <br />
@ -96,14 +97,14 @@ export default function ActivityCardHeader(props) {
<i <i
className="fa fa-chevron-right" className="fa fa-chevron-right"
aria-hidden="true" aria-hidden="true"
title={`See next ${dataType}`} title={t(`activities:See next ${dataType}`)}
/> />
</Link> </Link>
) : ( ) : (
<i <i
className="fa fa-chevron-right inactive-link" className="fa fa-chevron-right inactive-link"
aria-hidden="true" aria-hidden="true"
title={`No next ${dataType}`} title={t(`activities:No next ${dataType}`)}
/> />
)} )}
</div> </div>

View File

@ -79,7 +79,7 @@ class ActivityCharts extends React.Component {
} }
render() { render() {
const { chartData, updateCoordinates } = this.props const { chartData, t, updateCoordinates } = this.props
const { displayDistance } = this.state const { displayDistance } = this.state
const xInterval = chartData ? parseInt(chartData.length / 10, 10) : 0 const xInterval = chartData ? parseInt(chartData.length / 10, 10) : 0
let xDataKey, xScale let xDataKey, xScale
@ -102,7 +102,7 @@ class ActivityCharts extends React.Component {
checked={displayDistance} checked={displayDistance}
onChange={e => this.handleRadioChange(e)} onChange={e => this.handleRadioChange(e)}
/> />
distance {t('activities:distance')}
</label> </label>
<label className="radioLabel col-md-1"> <label className="radioLabel col-md-1">
<input <input
@ -111,7 +111,7 @@ class ActivityCharts extends React.Component {
checked={!displayDistance} checked={!displayDistance}
onChange={e => this.handleRadioChange(e)} onChange={e => this.handleRadioChange(e)}
/> />
duration {t('activities:duration')}
</label> </label>
</div> </div>
<div className="row chart-radio"> <div className="row chart-radio">
@ -123,7 +123,7 @@ class ActivityCharts extends React.Component {
checked={this.displayData('speed')} checked={this.displayData('speed')}
onChange={e => this.handleLegendChange(e)} onChange={e => this.handleLegendChange(e)}
/> />
speed {t('activities:speed')}
</label> </label>
<label className="radioLabel col-md-1"> <label className="radioLabel col-md-1">
<input <input
@ -132,7 +132,7 @@ class ActivityCharts extends React.Component {
checked={this.displayData('elevation')} checked={this.displayData('elevation')}
onChange={e => this.handleLegendChange(e)} onChange={e => this.handleLegendChange(e)}
/> />
elevation {t('activities:elevation')}
</label> </label>
<div className="col-md-5" /> <div className="col-md-5" />
</div> </div>
@ -147,7 +147,11 @@ class ActivityCharts extends React.Component {
<XAxis <XAxis
allowDecimals={false} allowDecimals={false}
dataKey={xDataKey} dataKey={xDataKey}
label={{ value: xDataKey, offset: 0, position: 'bottom' }} label={{
value: t(`activities:${xDataKey}`),
offset: 0,
position: 'bottom',
}}
scale={xScale} scale={xScale}
interval={xInterval} interval={xInterval}
tickFormatter={value => tickFormatter={value =>
@ -157,7 +161,7 @@ class ActivityCharts extends React.Component {
/> />
<YAxis <YAxis
label={{ label={{
value: 'speed (km/h)', value: `${t('activities:speed')} (km/h)`,
angle: -90, angle: -90,
position: 'left', position: 'left',
}} }}
@ -165,7 +169,7 @@ class ActivityCharts extends React.Component {
/> />
<YAxis <YAxis
label={{ label={{
value: 'altitude (m)', value: `${t('activities:elevation')} (m)`,
angle: -90, angle: -90,
position: 'right', position: 'right',
}} }}
@ -177,6 +181,7 @@ class ActivityCharts extends React.Component {
yAxisId="right" yAxisId="right"
type="linear" type="linear"
dataKey="elevation" dataKey="elevation"
name={t('activities:elevation')}
fill="#e5e5e5" fill="#e5e5e5"
stroke="#cccccc" stroke="#cccccc"
dot={false} dot={false}
@ -188,6 +193,7 @@ class ActivityCharts extends React.Component {
yAxisId="left" yAxisId="left"
type="linear" type="linear"
dataKey="speed" dataKey="speed"
name={t('activities:speed')}
stroke="#8884d8" stroke="#8884d8"
strokeWidth={2} strokeWidth={2}
dot={false} dot={false}
@ -197,19 +203,22 @@ class ActivityCharts extends React.Component {
<Tooltip <Tooltip
labelFormatter={value => labelFormatter={value =>
displayDistance displayDistance
? `distance: ${value} km` ? `${t('activities:distance')}: ${value} km`
: `duration: ${format(value, 'HH:mm:ss')}` : `${t('activities:duration')}: ${format(
value,
'HH:mm:ss'
)}`
} }
/> />
</ComposedChart> </ComposedChart>
</ResponsiveContainer> </ResponsiveContainer>
</div> </div>
<div className="chart-info"> <div className="chart-info">
data from gpx, without any cleaning {t('activities:data from gpx, without any cleaning')}
</div> </div>
</div> </div>
) : ( ) : (
'No data to display' t('activities:No data to display')
)} )}
</div> </div>
) )

View File

@ -3,13 +3,13 @@ import React from 'react'
import ActivityWeather from './ActivityWeather' import ActivityWeather from './ActivityWeather'
export default function ActivityDetails(props) { export default function ActivityDetails(props) {
const { activity } = props const { activity, t } = props
const withPauses = activity.pauses !== '0:00:00' && activity.pauses !== null const withPauses = activity.pauses !== '0:00:00' && activity.pauses !== null
return ( return (
<div className="activity-details"> <div className="activity-details">
<p> <p>
<i className="fa fa-clock-o custom-fa" aria-hidden="true" /> <i className="fa fa-clock-o custom-fa" aria-hidden="true" />
Duration: {activity.moving} {t('activities:Duration')}: {activity.moving}
{activity.records && {activity.records &&
activity.records.find(r => r.record_type === 'LD') && ( activity.records.find(r => r.record_type === 'LD') && (
<sup> <sup>
@ -18,14 +18,14 @@ export default function ActivityDetails(props) {
)} )}
{withPauses && ( {withPauses && (
<span> <span>
<br /> <br />({t('activities:pauses')}: {activity.pauses},{' '}
(pauses: {activity.pauses}, total duration: {activity.duration}) {t('activities:total duration')}: {activity.duration})
</span> </span>
)} )}
</p> </p>
<p> <p>
<i className="fa fa-road custom-fa" aria-hidden="true" /> <i className="fa fa-road custom-fa" aria-hidden="true" />
Distance: {activity.distance} km {t('activities:Distance')}: {activity.distance} km
{activity.records && {activity.records &&
activity.records.find(r => r.record_type === 'FD') && ( activity.records.find(r => r.record_type === 'FD') && (
<sup> <sup>
@ -35,7 +35,7 @@ export default function ActivityDetails(props) {
</p> </p>
<p> <p>
<i className="fa fa-tachometer custom-fa" aria-hidden="true" /> <i className="fa fa-tachometer custom-fa" aria-hidden="true" />
Average speed: {activity.ave_speed} km/h {t('activities:Average speed')}: {activity.ave_speed} km/h
{activity.records && {activity.records &&
activity.records.find(r => r.record_type === 'AS') && ( activity.records.find(r => r.record_type === 'AS') && (
<sup> <sup>
@ -43,7 +43,7 @@ export default function ActivityDetails(props) {
</sup> </sup>
)} )}
<br /> <br />
Max speed : {activity.max_speed} km/h {t('activities:Max. speed')}: {activity.max_speed} km/h
{activity.records && {activity.records &&
activity.records.find(r => r.record_type === 'MS') && ( activity.records.find(r => r.record_type === 'MS') && (
<sup> <sup>
@ -54,20 +54,20 @@ export default function ActivityDetails(props) {
{activity.min_alt && activity.max_alt && ( {activity.min_alt && activity.max_alt && (
<p> <p>
<i className="fi-mountains custom-fa" /> <i className="fi-mountains custom-fa" />
Min altitude: {activity.min_alt}m {t('activities:Min. altitude')}: {activity.min_alt}m
<br /> <br />
Max altitude: {activity.max_alt}m {t('activities:Max. altitude')}: {activity.max_alt}m
</p> </p>
)} )}
{activity.ascent && activity.descent && ( {activity.ascent && activity.descent && (
<p> <p>
<i className="fa fa-location-arrow custom-fa" /> <i className="fa fa-location-arrow custom-fa" />
Ascent: {activity.ascent}m {t('activities:Ascent')}: {activity.ascent}m
<br /> <br />
Descent: {activity.descent}m {t('activities:Descent')}: {activity.descent}m
</p> </p>
)} )}
<ActivityWeather activity={activity} /> <ActivityWeather activity={activity} t={t} />
</div> </div>
) )
} }

View File

@ -1,5 +1,8 @@
import React from 'react' import React from 'react'
export default function ActivityNoMap() { export default function ActivityNoMap(props) {
return <div className="activity-no-map text-center">No Map</div> const { t } = props
return (
<div className="activity-no-map text-center">{t('activities:No Map')}</div>
)
} }

View File

@ -1,14 +1,16 @@
import React from 'react' import React from 'react'
export default function ActivityNotes(props) { export default function ActivityNotes(props) {
const { notes } = props const { notes, t } = props
return ( return (
<div className="row"> <div className="row">
<div className="col"> <div className="col">
<div className="card activity-card"> <div className="card activity-card">
<div className="card-body"> <div className="card-body">
Notes Notes
<div className="activity-notes">{notes ? notes : 'No notes'}</div> <div className="activity-notes">
{notes ? notes : t('activities:No notes')}
</div>
</div> </div>
</div> </div>
</div> </div>

View File

@ -2,13 +2,13 @@ import React from 'react'
import { Link } from 'react-router-dom' import { Link } from 'react-router-dom'
export default function ActivitySegments(props) { export default function ActivitySegments(props) {
const { segments } = props const { segments, t } = props
return ( return (
<div className="row"> <div className="row">
<div className="col"> <div className="col">
<div className="card activity-card"> <div className="card activity-card">
<div className="card-body"> <div className="card-body">
Segments {t('activities:Segments')}
<div className="activity-segments"> <div className="activity-segments">
<ul> <ul>
{segments.map((segment, index) => ( {segments.map((segment, index) => (
@ -21,9 +21,10 @@ export default function ActivitySegments(props) {
to={`/activities/${segment.activity_id}/segment/${index + to={`/activities/${segment.activity_id}/segment/${index +
1}`} 1}`}
> >
segment {index + 1} {t('activities:segment')} {index + 1}
</Link>{' '} </Link>{' '}
({segment.distance} km, duration: {segment.duration}) ({t('activities:distance')}: {segment.distance} km,{' '}
{t('activities:duration')}: {segment.duration})
</li> </li>
))} ))}
</ul> </ul>

View File

@ -1,7 +1,7 @@
import React from 'react' import React from 'react'
export default function ActivityWeather(props) { export default function ActivityWeather(props) {
const { activity } = props const { activity, t } = props
return ( return (
<div className="container"> <div className="container">
{activity.weather_start && activity.weather_end && ( {activity.weather_start && activity.weather_end && (
@ -10,7 +10,7 @@ export default function ActivityWeather(props) {
<tr> <tr>
<th /> <th />
<th> <th>
Start {t('activities:Start')}
<br /> <br />
<img <img
className="weather-img" className="weather-img"
@ -20,7 +20,7 @@ export default function ActivityWeather(props) {
/> />
</th> </th>
<th> <th>
End {t('activities:End')}
<br /> <br />
<img <img
className="weather-img" className="weather-img"

View File

@ -1,5 +1,6 @@
import React from 'react' import React from 'react'
import { Helmet } from 'react-helmet' import { Helmet } from 'react-helmet'
import { withTranslation } from 'react-i18next'
import { connect } from 'react-redux' import { connect } from 'react-redux'
import ActivityCardHeader from './ActivityCardHeader' import ActivityCardHeader from './ActivityCardHeader'
@ -62,7 +63,14 @@ class ActivityDisplay extends React.Component {
} }
render() { render() {
const { activities, message, onDeleteActivity, sports, user } = this.props const {
activities,
message,
onDeleteActivity,
sports,
t,
user,
} = this.props
const { coordinates, displayModal } = this.state const { coordinates, displayModal } = this.state
const [activity] = activities const [activity] = activities
const title = activity ? activity.title : 'Activity' const title = activity ? activity.title : 'Activity'
@ -82,8 +90,10 @@ class ActivityDisplay extends React.Component {
<div className="container"> <div className="container">
{displayModal && ( {displayModal && (
<CustomModal <CustomModal
title="Confirmation" title={t('activities:Confirmation')}
text="Are you sure you want to delete this activity?" text={t(
'activities:Are you sure you want to delete this activity?'
)}
confirm={() => { confirm={() => {
onDeleteActivity(activity.id) onDeleteActivity(activity.id)
this.displayModal(false) this.displayModal(false)
@ -102,6 +112,7 @@ class ActivityDisplay extends React.Component {
dataType={dataType} dataType={dataType}
segmentId={segmentId} segmentId={segmentId}
sport={sport} sport={sport}
t={t}
title={title} title={title}
user={user} user={user}
displayModal={() => this.displayModal(true)} displayModal={() => this.displayModal(true)}
@ -118,7 +129,7 @@ class ActivityDisplay extends React.Component {
segmentId={segmentId} segmentId={segmentId}
/> />
) : ( ) : (
<ActivityNoMap /> <ActivityNoMap t={t} />
)} )}
</div> </div>
<div className="col"> <div className="col">
@ -128,6 +139,7 @@ class ActivityDisplay extends React.Component {
? activity ? activity
: activity.segments[segmentId - 1] : activity.segments[segmentId - 1]
} }
t={t}
/> />
</div> </div>
</div> </div>
@ -147,6 +159,7 @@ class ActivityDisplay extends React.Component {
activity={activity} activity={activity}
dataType={dataType} dataType={dataType}
segmentId={segmentId} segmentId={segmentId}
t={t}
updateCoordinates={e => updateCoordinates={e =>
this.updateCoordinates(e) this.updateCoordinates(e)
} }
@ -160,9 +173,9 @@ class ActivityDisplay extends React.Component {
)} )}
{dataType === 'activity' && ( {dataType === 'activity' && (
<> <>
<ActivityNotes notes={activity.notes} /> <ActivityNotes notes={activity.notes} t={t} />
{activity.segments.length > 1 && ( {activity.segments.length > 1 && (
<ActivitySegments segments={activity.segments} /> <ActivitySegments segments={activity.segments} t={t} />
)} )}
</> </>
)} )}
@ -175,19 +188,21 @@ class ActivityDisplay extends React.Component {
} }
} }
export default connect( export default withTranslation()(
state => ({ connect(
activities: state.activities.data, state => ({
message: state.message, activities: state.activities.data,
sports: state.sports.data, message: state.message,
user: state.user, sports: state.sports.data,
}), user: state.user,
dispatch => ({ }),
loadActivity: activityId => { dispatch => ({
dispatch(getOrUpdateData('getData', 'activities', { id: activityId })) loadActivity: activityId => {
}, dispatch(getOrUpdateData('getData', 'activities', { id: activityId }))
onDeleteActivity: activityId => { },
dispatch(deleteActivity(activityId)) onDeleteActivity: activityId => {
}, dispatch(deleteActivity(activityId))
}) },
)(ActivityDisplay) })
)(ActivityDisplay)
)

View File

@ -1,6 +1,8 @@
import React from 'react' import React from 'react'
import { useTranslation } from 'react-i18next'
export default function CustomModal(props) { export default function CustomModal(props) {
const { t } = useTranslation()
return ( return (
<div className="custom-modal-backdrop"> <div className="custom-modal-backdrop">
<div className="custom-modal"> <div className="custom-modal">
@ -11,7 +13,7 @@ export default function CustomModal(props) {
type="button" type="button"
className="close" className="close"
aria-label="Close" aria-label="Close"
onClick={() => props.close} onClick={() => props.close()}
> >
<span aria-hidden="true">&times;</span> <span aria-hidden="true">&times;</span>
</button> </button>
@ -25,14 +27,14 @@ export default function CustomModal(props) {
className="btn btn-primary" className="btn btn-primary"
onClick={() => props.confirm()} onClick={() => props.confirm()}
> >
Yes {t('common:Yes')}
</button> </button>
<button <button
type="button" type="button"
className="btn btn-secondary" className="btn btn-secondary"
onClick={() => props.close()} onClick={() => props.close()}
> >
No {t('common:No')}
</button> </button>
</div> </div>
</div> </div>

View File

@ -89,6 +89,7 @@ export default class StatsCharts extends React.PureComponent {
'' ''
) )
} }
name={t(`sports:${s.label}`)}
/> />
))} ))}
</BarChart> </BarChart>

View File

@ -6,7 +6,7 @@ import StaticMap from '../Common/StaticMap'
import { getDateWithTZ } from '../../utils' import { getDateWithTZ } from '../../utils'
export default function ActivityCard(props) { export default function ActivityCard(props) {
const { activity, sports, user } = props const { activity, sports, t, user } = props
return ( return (
<div className="card activity-card text-center"> <div className="card activity-card text-center">
@ -14,7 +14,7 @@ export default function ActivityCard(props) {
<Link to={`/activities/${activity.id}`}> <Link to={`/activities/${activity.id}`}>
{sports {sports
.filter(sport => sport.id === activity.sport_id) .filter(sport => sport.id === activity.sport_id)
.map(sport => sport.label)}{' '} .map(sport => t(`sports:${sport.label}`))}{' '}
-{' '} -{' '}
{format( {format(
getDateWithTZ(activity.activity_date, user.timezone), getDateWithTZ(activity.activity_date, user.timezone),
@ -31,8 +31,8 @@ export default function ActivityCard(props) {
)} )}
<div className="col"> <div className="col">
<p> <p>
<i className="fa fa-clock-o" aria-hidden="true" /> Duration:{' '} <i className="fa fa-clock-o" aria-hidden="true" />{' '}
{activity.moving} {t('activities:Duration')}: {activity.moving}
{activity.map ? ( {activity.map ? (
<span> <span>
<br /> <br />
@ -41,8 +41,8 @@ export default function ActivityCard(props) {
) : ( ) : (
' - ' ' - '
)} )}
<i className="fa fa-road" aria-hidden="true" /> Distance:{' '} <i className="fa fa-road" aria-hidden="true" />{' '}
{activity.distance} km {t('activities:Distance')}: {activity.distance} km
</p> </p>
</div> </div>
</div> </div>

View File

@ -1,12 +1,13 @@
import React from 'react' import React from 'react'
import { Link } from 'react-router-dom' import { Link } from 'react-router-dom'
import { formatRecord } from '../../utils/activities' import { formatRecord, translateSports } from '../../utils/activities'
export default function RecordsCard(props) { export default function RecordsCard(props) {
const { records, sports, t, user } = props const { records, sports, t, user } = props
const translatedSports = translateSports(sports, t)
const recordsBySport = records.reduce((sportList, record) => { const recordsBySport = records.reduce((sportList, record) => {
const sport = sports.find(s => s.id === record.sport_id) const sport = translatedSports.find(s => s.id === record.sport_id)
if (sportList[sport.label] === void 0) { if (sportList[sport.label] === void 0) {
sportList[sport.label] = { sportList[sport.label] = {
img: sport.img, img: sport.img,
@ -19,42 +20,44 @@ export default function RecordsCard(props) {
return ( return (
<div className="card activity-card"> <div className="card activity-card">
<div className="card-header">Personal records</div> <div className="card-header">{t('activities:Personal records')}</div>
<div className="card-body"> <div className="card-body">
{Object.keys(recordsBySport).length === 0 {Object.keys(recordsBySport).length === 0
? t('common:No records.') ? t('common:No records.')
: Object.keys(recordsBySport).map(sportLabel => ( : Object.keys(recordsBySport)
<table .sort()
className="table table-borderless table-sm record-table" .map(sportLabel => (
key={sportLabel} <table
> className="table table-borderless table-sm record-table"
<thead> key={sportLabel}
<tr> >
<th colSpan="3"> <thead>
<img <tr>
alt={`${sportLabel} logo`} <th colSpan="3">
className="record-logo" <img
src={recordsBySport[sportLabel].img} alt={`${sportLabel} logo`}
/> className="record-logo"
{sportLabel} src={recordsBySport[sportLabel].img}
</th> />
</tr> {sportLabel}
</thead> </th>
<tbody>
{recordsBySport[sportLabel].records.map(rec => (
<tr key={rec.id}>
<td>{rec.record_type}</td>
<td className="text-right">{rec.value}</td>
<td className="text-right">
<Link to={`/activities/${rec.activity_id}`}>
{rec.activity_date}
</Link>
</td>
</tr> </tr>
))} </thead>
</tbody> <tbody>
</table> {recordsBySport[sportLabel].records.map(rec => (
))} <tr key={rec.id}>
<td>{t(`activities:${rec.record_type}`)}</td>
<td className="text-right">{rec.value}</td>
<td className="text-right">
<Link to={`/activities/${rec.activity_id}`}>
{rec.activity_date}
</Link>
</td>
</tr>
))}
</tbody>
</table>
))}
</div> </div>
</div> </div>
) )

View File

@ -69,6 +69,7 @@ class DashBoard extends React.Component {
activity={activity} activity={activity}
key={activity.id} key={activity.id}
sports={sports} sports={sports}
t={t}
user={user} user={user}
/> />
)) ))

View File

@ -1,22 +1,55 @@
{ {
"Activity Date": "Activity Date", "Activity Date": "Activity Date",
"Add a workout": "Add a workout", "Add a workout": "Add a workout",
"Are you sure you want to delete this activity?": "Are you sure you want to delete this activity?",
"Ave. speed": "Ave. speed", "Ave. speed": "Ave. speed",
"Ascent": "Ascent",
"Average speed": "Average speed", "Average speed": "Average speed",
"Confirmation": "Confirmation",
"data from gpx, without any cleaning": "data from gpx, without any cleaning",
"Date": "Date", "Date": "Date",
"Delete activity": "Delete activity",
"Descent": "Descent",
"Distance": "Distance", "Distance": "Distance",
"distance": "distance",
"Duration": "Duration", "Duration": "Duration",
"duration": "duration",
"Edit a workout": "Edit a workout", "Edit a workout": "Edit a workout",
"Edit activity": "Edit activity",
"elevation": "elevation",
"End": "End",
"Farest distance": "Farest distance",
"Filter": "Filter", "Filter": "Filter",
"From": "From", "From": "From",
"gpxFile": "<strong>gpx</strong> file", "gpxFile": "<strong>gpx</strong> file",
"Longest duration": "Longest duration",
"Max. altitude" : "Max. altitude",
"Max. speed": "Max. speed", "Max. speed": "Max. speed",
"Min. altitude": "Min. altitude",
"no folder inside": "no folder inside", "no folder inside": "no folder inside",
"files max": "files max", "files max": "files max",
"max size": "max size", "max size": "max size",
"No data to display": "No data to display",
"No Map": "No Map",
"No next activity": "No next activity",
"No next segment": "No next segment",
"No notes": "No notes",
"No previous activity": "No previous activity",
"No previous segment": "No previous segment",
"Notes": "Notes", "Notes": "Notes",
"pauses": "pauses",
"Personal records": "Personal records",
"See next activity": "See next activity",
"See next segment": "See next segment",
"See previous activity": "See previous activity",
"See previous segment": "See previous segment",
"segment": "segment",
"Segments": "Segments",
"speed": "speed",
"Start": "Start",
"Title": "Title", "Title": "Title",
"To": "To", "To": "To",
"total duration": "total duration",
"with gpx file": "with gpx file", "with gpx file": "with gpx file",
"without gpx file": "without gpx file", "without gpx file": "without gpx file",
"zipFile": "or <strong> zip</strong> file containing <strong>gpx </strong> files" "zipFile": "or <strong> zip</strong> file containing <strong>gpx </strong> files"

View File

@ -6,6 +6,7 @@
"days": "days", "days": "days",
"Login": "Login", "Login": "Login",
"Logout": "Logout", "Logout": "Logout",
"No": "No",
"No records.": "No records.", "No records.": "No records.",
"No workouts.": "No workouts.", "No workouts.": "No workouts.",
"Register": "Register", "Register": "Register",
@ -19,5 +20,6 @@
"Workout": "Workout", "Workout": "Workout",
"Workouts": "Workouts", "Workouts": "Workouts",
"workout": "workout", "workout": "workout",
"workouts": "workouts" "workouts": "workouts",
"Yes": "Yes"
} }

View File

@ -1,22 +1,55 @@
{ {
"Activity Date": "Date de l'activité", "Activity Date": "Date de l'activité",
"Add a workout": "Ajouter une activité", "Add a workout": "Ajouter une activité",
"Are you sure you want to delete this activity?": "Etes-vous sûr de vouloir supprimer cette activité ?",
"Ave. speed": "Vitesse moyenne", "Ave. speed": "Vitesse moyenne",
"Ascent": "Dénivelé positif",
"Average speed": "Vitesse moyenne", "Average speed": "Vitesse moyenne",
"Confirmation": "Confirmation",
"data from gpx, without any cleaning": "données issues du fichier gpx, sans correction",
"Date": "Date", "Date": "Date",
"Delete activity": "Supprimer l'activité",
"Descent": "Dénivelé négatif",
"Distance": "Distance", "Distance": "Distance",
"distance": "distance",
"Duration": "Durée", "Duration": "Durée",
"duration": "durée",
"Edit a workout": "Editer une activité", "Edit a workout": "Editer une activité",
"Edit activity": "Editer une activity",
"elevation": "altitude",
"End": "Arrivée",
"Farest distance": "Distance la + longue",
"Filter": "Filtrer", "Filter": "Filtrer",
"From": "A partir de", "From": "A partir de",
"gpxFile": "fichier <strong>gpx</strong>", "gpxFile": "fichier <strong>gpx</strong>",
"Longest duration": "Durée la + longue",
"Max. altitude" : "Altitude max",
"Max. speed": "Vitesse max", "Max. speed": "Vitesse max",
"Min. altitude": "Altitude min",
"no folder inside": "pas de répertoire", "no folder inside": "pas de répertoire",
"files max": " fichiers max", "files max": " fichiers max",
"max size": "taille max", "max size": "taille max",
"No data to display": "Pas de données à afficher",
"No Map": "Pas de carte",
"No next activity": "Pas d'activité suivante",
"No next segment": "Pas de segment suivant",
"No notes": "Pas de notes",
"No previous activity": "Pas d'activité précédente",
"No previous segment": "Pas de segment précédent",
"Notes": "Notes", "Notes": "Notes",
"pauses": "pauses",
"Personal records": "Records personnels",
"See next activity": "Voir l'activité suivante",
"See next segment": "Voir le segment suivant",
"See previous activity": "Voir l'activité précédente",
"See previous segment": "Voir le segment précédent",
"segment": "segment",
"Segments": "Segments",
"Start": "Départ",
"speed": "vitesse",
"Title": "Titre", "Title": "Titre",
"To": "Jusqu'au", "To": "Jusqu'au",
"total duration": "durée totale",
"with gpx file": "avec un fichier gpx", "with gpx file": "avec un fichier gpx",
"without gpx file": "sans fichier gpx", "without gpx file": "sans fichier gpx",
"zipFile": "ou un fichier <strong> zip</strong> contenant des fichiers <strong>gpx</strong>" "zipFile": "ou un fichier <strong> zip</strong> contenant des fichiers <strong>gpx</strong>"

View File

@ -6,6 +6,7 @@
"days": "jours", "days": "jours",
"Login": "Se connecter", "Login": "Se connecter",
"Logout": "Se déconnecter", "Logout": "Se déconnecter",
"No": "Non",
"No records.": "Pas de records.", "No records.": "Pas de records.",
"No workouts.": "Pas d'activités.", "No workouts.": "Pas d'activités.",
"Register": "S'inscrire", "Register": "S'inscrire",
@ -19,5 +20,6 @@
"Workout": "Activité", "Workout": "Activité",
"Workouts": "Activités", "Workouts": "Activités",
"workout": "activité", "workout": "activité",
"workouts": "activités" "workouts": "activités",
"Yes": "Oui"
} }

View File

@ -14,10 +14,10 @@ export const activityColors = [
] ]
export const recordsLabels = [ export const recordsLabels = [
{ record_type: 'AS', label: 'Avg speed' }, { record_type: 'AS', label: 'Ave. speed' },
{ record_type: 'FD', label: 'Farest distance' }, { record_type: 'FD', label: 'Farest distance' },
{ record_type: 'LD', label: 'Longest duration' }, { record_type: 'LD', label: 'Longest duration' },
{ record_type: 'MS', label: 'Max speed' }, { record_type: 'MS', label: 'Max. speed' },
] ]
export const getGeoJson = gpxContent => { export const getGeoJson = gpxContent => {