48 lines
921 B
Elixir
48 lines
921 B
Elixir
defmodule Localizator.Translitor do
|
|
@typedoc """
|
|
Locale
|
|
"""
|
|
@type locale :: String.t()
|
|
@type to :: locale
|
|
|
|
@typedoc """
|
|
Translitor service
|
|
"""
|
|
@type translitor :: Atom.t()
|
|
|
|
@typedoc """
|
|
Transliters list
|
|
"""
|
|
@type translitors :: [translitor]
|
|
|
|
@typedoc """
|
|
Translition resource
|
|
"""
|
|
@type resource :: String.t() | Map.t() | List.t()
|
|
@type source :: resource
|
|
@type result :: resource
|
|
|
|
@typedoc """
|
|
Error Message
|
|
"""
|
|
@type message :: String.t()
|
|
|
|
@spec list() :: translitors
|
|
def list(), do: Application.get_env(:localizator, :translitors)
|
|
|
|
defp translitors() do
|
|
list()
|
|
|> Enum.map(fn translitor -> {translitor.locale(), translitor} end)
|
|
|> Map.new()
|
|
end
|
|
|
|
@spec convert(source, locale) :: {:ok, result} | {:error, message}
|
|
def convert(source, locale) do
|
|
translitor =
|
|
translitors()
|
|
|> Map.get(locale)
|
|
|
|
translitor.convert(source)
|
|
end
|
|
end
|