Add support for nautical units

This commit is contained in:
bdbkun 2024-08-19 22:14:23 +00:00
parent 1a4ae96782
commit f39ae57b09
4 changed files with 58 additions and 8 deletions

View file

@ -333,6 +333,7 @@
<Menubar.RadioGroup bind:value={$distanceUnits}> <Menubar.RadioGroup bind:value={$distanceUnits}>
<Menubar.RadioItem value="metric">{$_('menu.metric')}</Menubar.RadioItem> <Menubar.RadioItem value="metric">{$_('menu.metric')}</Menubar.RadioItem>
<Menubar.RadioItem value="imperial">{$_('menu.imperial')}</Menubar.RadioItem> <Menubar.RadioItem value="imperial">{$_('menu.imperial')}</Menubar.RadioItem>
<Menubar.RadioItem value="nautical">{$_('menu.nautical')}</Menubar.RadioItem>
</Menubar.RadioGroup> </Menubar.RadioGroup>
</Menubar.SubContent> </Menubar.SubContent>
</Menubar.Sub> </Menubar.Sub>

View file

@ -80,7 +80,7 @@ export function dexieSettingStore<T>(key: string, initial: T, initialize: boolea
} }
export const settings = { export const settings = {
distanceUnits: dexieSettingStore<'metric' | 'imperial'>('distanceUnits', 'metric'), distanceUnits: dexieSettingStore<'metric' | 'imperial' | 'nautical'>('distanceUnits', 'metric'),
velocityUnits: dexieSettingStore<'speed' | 'pace'>('velocityUnits', 'speed'), velocityUnits: dexieSettingStore<'speed' | 'pace'>('velocityUnits', 'speed'),
temperatureUnits: dexieSettingStore<'celsius' | 'fahrenheit'>('temperatureUnits', 'celsius'), temperatureUnits: dexieSettingStore<'celsius' | 'fahrenheit'>('temperatureUnits', 'celsius'),
elevationProfile: dexieSettingStore('elevationProfile', true), elevationProfile: dexieSettingStore('elevationProfile', true),

View file

@ -16,6 +16,10 @@ export function metersToFeet(value: number) {
return value * 3.28084; return value * 3.28084;
} }
export function kilometersToNauticalMiles(value: number) {
return value * 0.539957;
}
export function celsiusToFahrenheit(value: number) { export function celsiusToFahrenheit(value: number) {
return value * 1.8 + 32; return value * 1.8 + 32;
} }
@ -93,15 +97,35 @@ export function getTemperatureWithUnits(value: number, convert: boolean = true)
// Get the units // Get the units
export function getDistanceUnits() { export function getDistanceUnits() {
return get(distanceUnits) === 'metric' ? get(_)('units.kilometers') : get(_)('units.miles'); switch (get(distanceUnits)) {
case 'metric':
return get(_)('units.kilometers');
case 'imperial':
return get(_)('units.miles');
case 'nautical':
return get(_)('units.nautical_miles');
}
} }
export function getVelocityUnits() { export function getVelocityUnits() {
if (get(velocityUnits) === 'speed') { if (get(velocityUnits) === 'speed') {
return get(distanceUnits) === 'metric' ? get(_)('units.kilometers_per_hour') : get(_)('units.miles_per_hour'); switch (get(distanceUnits)) {
case 'metric':
return get(_)('units.kilometers_per_hour');
case 'imperial':
return get(_)('units.miles_per_hour');
case 'nautical':
return get(_)('units.knots');
}
} else { } else {
return get(distanceUnits) === 'metric' ? get(_)('units.minutes_per_kilometer') : get(_)('units.minutes_per_mile'); switch (get(distanceUnits)) {
case 'metric':
return get(_)('units.minutes_per_kilometer');
case 'imperial':
return get(_)('units.minutes_per_mile');
case 'nautical':
return get(_)('units.minutes_per_nautical_mile');
}
} }
} }
@ -127,7 +151,14 @@ export function getTemperatureUnits() {
// Convert only the value // Convert only the value
export function getConvertedDistance(value: number) { export function getConvertedDistance(value: number) {
return get(distanceUnits) === 'metric' ? value : kilometersToMiles(value); switch (get(distanceUnits)) {
case 'metric':
return value;
case 'imperial':
return kilometersToMiles(value);
case 'nautical':
return kilometersToNauticalMiles(value);
}
} }
export function getConvertedElevation(value: number) { export function getConvertedElevation(value: number) {
@ -136,9 +167,23 @@ export function getConvertedElevation(value: number) {
export function getConvertedVelocity(value: number) { export function getConvertedVelocity(value: number) {
if (get(velocityUnits) === 'speed') { if (get(velocityUnits) === 'speed') {
return get(distanceUnits) === 'metric' ? value : kilometersToMiles(value); switch (get(distanceUnits)) {
case 'metric':
return value;
case 'imperial':
return milesToKilometers(value);
case 'nautical':
return kilometersToNauticalMiles(value);
}
} else { } else {
return get(distanceUnits) === 'metric' ? distancePerHourToSecondsPerDistance(value) : distancePerHourToSecondsPerDistance(kilometersToMiles(value)); switch (get(distanceUnits)) {
case 'metric':
return distancePerHourToSecondsPerDistance(value);
case 'imperial':
return distancePerHourToSecondsPerDistance(kilometersToMiles(value));
case 'nautical':
return distancePerHourToSecondsPerDistance(kilometersToNauticalMiles(value));
}
} }
} }

View file

@ -41,6 +41,7 @@
"distance_units": "Distance units", "distance_units": "Distance units",
"metric": "Metric", "metric": "Metric",
"imperial": "Imperial", "imperial": "Imperial",
"nautical": "Nautical",
"velocity_units": "Velocity units", "velocity_units": "Velocity units",
"temperature_units": "Temperature units", "temperature_units": "Temperature units",
"celsius": "Celsius", "celsius": "Celsius",
@ -363,12 +364,15 @@
"feet": "ft", "feet": "ft",
"kilometers": "km", "kilometers": "km",
"miles": "mi", "miles": "mi",
"nautical_miles": "nm",
"celsius": "°C", "celsius": "°C",
"fahrenheit": "°F", "fahrenheit": "°F",
"kilometers_per_hour": "km/h", "kilometers_per_hour": "km/h",
"miles_per_hour": "mph", "miles_per_hour": "mph",
"minutes_per_kilometer": "min/km", "minutes_per_kilometer": "min/km",
"minutes_per_mile": "min/mi", "minutes_per_mile": "min/mi",
"minutes_per_nautical_mile": "min/nm",
"knots": "kn",
"heartrate": "bpm", "heartrate": "bpm",
"cadence": "rpm", "cadence": "rpm",
"power": "W" "power": "W"