diff --git a/po/fr.po b/po/fr.po index 8f4910f..29f8f52 100644 --- a/po/fr.po +++ b/po/fr.po @@ -291,6 +291,10 @@ msgstr "Traduire les conditions" msgid "Temperature Unit" msgstr "Unité de température" +#: weather-settings.js +msgid "Wind Speed Unit" +msgstr "Unité de vitesse du vent" + #: weather-settings.js msgid "Position in Panel" msgstr "Position sur le panel" diff --git a/src/extension.js b/src/extension.js index b9a10c5..0bccf98 100644 --- a/src/extension.js +++ b/src/extension.js @@ -49,6 +49,7 @@ const PopupMenu = imports.ui.popupMenu; // Settings const WEATHER_SETTINGS_SCHEMA = 'org.gnome.shell.extensions.weather'; const WEATHER_UNIT_KEY = 'unit'; +const WEATHER_WIND_SPEED_UNIT_KEY = 'wind-speed-unit'; const WEATHER_CITY_KEY = 'city'; const WEATHER_ACTUAL_CITY_KEY = 'actual-city'; const WEATHER_TRANSLATE_CONDITION_KEY = 'translate-condition'; @@ -63,12 +64,24 @@ const WeatherUnits = { CELSIUS: 0, FAHRENHEIT: 1 } + +const WeatherWindSpeedUnits = { + KPH: 0, + MPH: 1, + MPS: 2, + KNOTS: 3 +} + const WeatherPosition = { CENTER: 0, RIGHT: 1, LEFT: 2 } +const WEATHER_CONV_MPH_IN_MPS = 2.23693629; +const WEATHER_CONV_KPH_IN_MPS = 3.6; +const WEATHER_CONV_KNOTS_IN_MPS = 1.94384449; + // Soup session (see https://bugzilla.gnome.org/show_bug.cgi?id=661323#c64) (Simon Legner) const _httpSession = new Soup.SessionAsync(); Soup.Session.prototype.add_feature.call(_httpSession, new Soup.ProxyResolverDefault()); @@ -221,6 +234,20 @@ WeatherMenuButton.prototype = { this._settings.set_enum(WEATHER_UNIT_KEY,v); }, + get _wind_speed_units() + { + if(!this._settings) + this.loadConfig(); + return this._settings.get_enum(WEATHER_WIND_SPEED_UNIT_KEY); + }, + + set _wind_speed_units(v) + { + if(!this._settings) + this.loadConfig(); + this._settings.set_enum(WEATHER_WIND_SPEED_UNIT_KEY,v); + }, + get _cities() { if(!this._settings) @@ -739,10 +766,47 @@ global.log(a); this._currentWeatherTemperature.text = temperature + ' ' + this.unit_to_unicode(); this._currentWeatherHumidity.text = humidity; this._currentWeatherPressure.text = pressure + ' ' + pressure_unit; - this._currentWeatherWind.text = (wind_direction && wind > 0 ? wind_direction + ' ' : '') + wind + ' ' + wind_unit; this._currentWeatherSunrise.text = sunrise; this._currentWeatherSunset.text = sunset; + // Override wind units with our preference + // Need to consider what units the Yahoo API has returned it in + switch (this._wind_speed_units) { + case WeatherWindSpeedUnits.KPH: + // Round to whole units + if (this._units == WeatherUnits.FAHRENHEIT) { + wind = Math.round (wind / WEATHER_CONV_MPH_IN_MPS * WEATHER_CONV_KPH_IN_MPS); + wind_unit = 'km/h'; + } + // Otherwise no conversion needed - already in correct units + break; + case WeatherWindSpeedUnits.MPH: + // Round to whole units + if (this._units == WeatherUnits.CELSIUS) { + wind = Math.round (wind / WEATHER_CONV_KPH_IN_MPS * WEATHER_CONV_MPH_IN_MPS); + wind_unit = 'mph'; + } + // Otherwise no conversion needed - already in correct units + break; + case WeatherWindSpeedUnits.MPS: + // Precision to one decimal place as 1 m/s is quite a large unit + if (this._units == WeatherUnits.CELSIUS) + wind = Math.round ((wind / WEATHER_CONV_KPH_IN_MPS) * 10)/ 10; + else + wind = Math.round ((wind / WEATHER_CONV_MPH_IN_MPS) * 10)/ 10; + wind_unit = 'm/s'; + break; + case WeatherWindSpeedUnits.KNOTS: + // Round to whole units + if (this._units == WeatherUnits.CELSIUS) + wind = Math.round (wind / WEATHER_CONV_KPH_IN_MPS * WEATHER_CONV_KNOTS_IN_MPS); + else + wind = Math.round (wind / WEATHER_CONV_MPH_IN_MPS * WEATHER_CONV_KNOTS_IN_MPS); + wind_unit = 'knots'; + break; + } + this._currentWeatherWind.text = (wind_direction && wind > 0 ? wind_direction + ' ' : '') + wind + ' ' + wind_unit; + // Refresh forecast let date_string = [_('Today'), _('Tomorrow')]; for (let i = 0; i <= 1; i++) { diff --git a/src/org.gnome.shell.extensions.weather.gschema.xml.in b/src/org.gnome.shell.extensions.weather.gschema.xml.in index 78e75d2..58a0a1c 100644 --- a/src/org.gnome.shell.extensions.weather.gschema.xml.in +++ b/src/org.gnome.shell.extensions.weather.gschema.xml.in @@ -3,6 +3,12 @@ + + + + + + @@ -10,9 +16,14 @@ - 'celsius' + 'fahrenheit' <_summary>Temperature Unit + + 'mph' + <_summary>Wind Speed Units + <_description>Choose the units used for wind speed. Allowed values are 'kph', 'mph', 'm/s' or 'knots'. + 'Cambridge, MA' <_summary>City to be displayed diff --git a/src/weather-settings.js.in b/src/weather-settings.js.in index 4896138..dc5319f 100644 --- a/src/weather-settings.js.in +++ b/src/weather-settings.js.in @@ -33,6 +33,7 @@ const _ = Gettext.gettext; const WEATHER_SETTINGS_SCHEMA = 'org.gnome.shell.extensions.weather'; const WEATHER_UNIT_KEY = 'unit'; +const WEATHER_WIND_SPEED_UNIT_KEY = 'wind-speed-unit'; const WEATHER_CITY_KEY = 'city'; const WEATHER_ACTUAL_CITY_KEY = 'actual-city'; const WEATHER_TRANSLATE_CONDITION_KEY = 'translate-condition'; @@ -180,6 +181,20 @@ WeatherSetting.prototype = this.Settings.set_enum(WEATHER_UNIT_KEY,arguments[0]); }, + get wind_speed_unit() + { + if(!this.Settings) + this.loadConfig(); + return this.Settings.get_enum(WEATHER_WIND_SPEED_UNIT_KEY); + }, + + set wind_speed_unit(v) + { + if(!this.Settings) + this.loadConfig(); + this.Settings.set_enum(WEATHER_WIND_SPEED_UNIT_KEY,v); + }, + get city() { if(!this.Settings) @@ -471,6 +486,8 @@ WeatherSetting.prototype = this.initConfigWidget(); this.addLabel(_("Temperature Unit")); this.addComboBox(["°C","°F"],"units"); + this.addLabel(_("Wind Speed Unit")); + this.addComboBox(["km/h","mph","m/s","knots"],"wind_speed_unit"); this.addLabel(_("Position in Panel")); this.addComboBox([_("Center"),_("Right"),_("Left")],"position_in_panel"); this.addLabel(_("Translate Conditions"));