39 lines
1.1 KiB
Elixir
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
|