who_need_help/lib/who_need_help/locales.ex

39 lines
1.1 KiB
Elixir

defmodule WhoNeedHelp.Locales do
@moduledoc """
Central registry for interface locales supported by the application.
Native language names are intentionally not translated so that people can
recognize their language even when the current interface locale is unknown.
"""
@default "en"
@locales [
%{code: "en", short_name: "EN", native_name: "English"},
%{code: "uk", short_name: "UK", native_name: "Українська"},
%{code: "ru", short_name: "RU", native_name: "Русский"}
]
@codes Enum.map(@locales, & &1.code)
def all, do: @locales
def codes, do: @codes
def default, do: @default
def options, do: Enum.map(@locales, &{&1.native_name, &1.code})
def supported?(locale), do: locale in @codes
def normalize(locale) when is_binary(locale) do
locale
|> String.downcase()
|> String.split(~r/[-_]/, parts: 2)
|> List.first()
|> then(fn candidate -> if supported?(candidate), do: candidate, else: @default end)
end
def normalize(_locale), do: @default
def get(locale) do
normalized = normalize(locale)
Enum.find(@locales, &(&1.code == normalized))
end
end