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