aprs.me/lib/aprsme_web/weather_units.ex

101 lines
2.6 KiB
Elixir

defmodule AprsmeWeb.WeatherUnits do
@moduledoc """
Handles weather unit conversions and formatting based on locale.
Supports imperial (US) and metric (international) units.
"""
alias Aprsme.Convert
@doc """
Determines the unit system based on locale.
Returns :imperial for US, :metric for most other countries.
"""
def unit_system(locale) when is_binary(locale) do
case locale do
# Default to imperial for English
"en" -> :imperial
# Spanish-speaking countries mostly use metric
"es" -> :metric
# Germany uses metric
"de" -> :metric
# France uses metric
"fr" -> :metric
# Default to metric for unknown locales
_ -> :metric
end
end
def unit_system(nil), do: :imperial
def unit_system(_), do: :imperial
@doc """
Converts temperature from Fahrenheit to Celsius if needed.
Returns the temperature in the appropriate unit for the locale.
"""
def format_temperature(temp, locale) when is_number(temp) do
case unit_system(locale) do
:imperial -> {temp, "°F"}
:metric -> {Convert.f_to_c(temp), "°C"}
end
end
def format_temperature(temp, _locale), do: {temp, "°F"}
@doc """
Converts wind speed from mph to km/h if needed.
Returns the wind speed in the appropriate unit for the locale.
"""
def format_wind_speed(speed, locale) when is_number(speed) do
case unit_system(locale) do
:imperial -> {speed, "mph"}
:metric -> {Convert.mph_to_kph(speed), "km/h"}
end
end
def format_wind_speed(speed, _locale), do: {speed, "mph"}
@doc """
Converts rain from inches to mm if needed.
Returns the rain amount in the appropriate unit for the locale.
"""
def format_rain(rain, locale) when is_number(rain) do
case unit_system(locale) do
:imperial -> {rain, "in"}
:metric -> {Convert.inches_to_mm(rain), "mm"}
end
end
def format_rain(rain, _locale), do: {rain, "in"}
@doc """
Formats pressure (keeps hPa for all locales as it's standard).
"""
def format_pressure(pressure, _locale) when is_number(pressure) do
{pressure, "hPa"}
end
def format_pressure(pressure, _locale), do: {pressure, "hPa"}
@doc """
Gets the appropriate unit labels for the locale.
"""
def unit_labels(locale) do
case unit_system(locale) do
:imperial ->
%{
temperature: "°F",
wind_speed: "mph",
rain: "in",
pressure: "hPa"
}
:metric ->
%{
temperature: "°C",
wind_speed: "km/h",
rain: "mm",
pressure: "hPa"
}
end
end
end