Current section
Files
Jump to
Current section
Files
lib/ecto_gettext.ex
defmodule EctoGettext do
@moduledoc """
EctoGettext - library for localization Ecto validation errors with using Gettext
### Example:
import EctoGettext
localize_validations(MyApp.Gettext, errors)
"""
@doc """
Get a list of errors and return a new list with translated errors
"""
@spec localize_validations(module, list) :: list
def localize_validations(module, errors) do
errors
|> Enum.map(fn elem -> localize(module, elem) end)
end
defp localize(module, error) do
{attr, message} = error
{Gettext.dgettext(module, "attributes", Atom.to_string(attr)), set_message(module, message)}
end
defp numbers, do: ~w(1 2 3 4 5 6 7 8 9)
defp set_message(module, message) do
message = String.downcase(message)
cond do
String.starts_with?(message, "should be") ->
Gettext.dgettext(module, "errors", format_message(message), count: parse_number(message))
true ->
Gettext.dgettext(module, "errors", message)
end
end
defp format_message(message) do
message
|> String.graphemes
|> Enum.filter(fn elem -> !Enum.member?(numbers, elem) end)
|> Enum.join
|> String.split(" ", trim: true)
|> List.insert_at(4, "%{count}")
|> Enum.join(" ")
end
defp parse_number(message) do
message
|> String.graphemes
|> Enum.filter(fn elem -> Enum.member?(numbers, elem) end)
|> Enum.join
|> String.to_integer
end
end