101 lines
2.6 KiB
Elixir
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
|