Closed jwietelmann closed 5 years ago
Upon further investigation, the scope of this issue may have expanded. Extracting errors in Phoenix is a little more complex than anticipated because the code for doing so actually resides inside the generated project rather than in the phoenix libs themselves.
Might have to figure out some kind of inject-with-macro situation in order to get this to work properly with translation and all.
Here are the example files:
gettext.ex
defmodule MyWeb.Gettext do
@moduledoc """
A module providing Internationalization with a gettext-based API.
By using [Gettext](https://hexdocs.pm/gettext),
your module gains a set of macros for translations, for example:
import MyWeb.Gettext
# Simple translation
gettext "Here is the string to translate"
# Plural translation
ngettext "Here is the string to translate",
"Here are the strings to translate",
3
# Domain-based translation
dgettext "errors", "Here is the error message to translate"
See the [Gettext Docs](https://hexdocs.pm/gettext) for detailed usage.
"""
use Gettext, otp_app: :my
end
error_helpers.ex
defmodule MyWeb.ErrorHelpers do
@moduledoc """
Conveniences for translating and building error messages.
"""
use Phoenix.HTML
@doc """
Generates tag for inlined form input errors.
"""
def error_tag(form, field) do
Enum.map(Keyword.get_values(form.errors, field), fn (error) ->
content_tag :span, translate_error(error), class: "help-block"
end)
end
@doc """
Translates an error message using gettext.
"""
def translate_error({msg, opts}) do
# Because error messages were defined within Ecto, we must
# call the Gettext module passing our Gettext backend. We
# also use the "errors" domain as translations are placed
# in the errors.po file.
# Ecto will pass the :count keyword if the error message is
# meant to be pluralized.
# On your own code and templates, depending on whether you
# need the message to be pluralized or not, this could be
# written simply as:
#
# dngettext "errors", "1 file", "%{count} files", count
# dgettext "errors", "is invalid"
#
if count = opts[:count] do
Gettext.dngettext(MyWeb.Gettext, "errors", msg, msg, count, opts)
else
Gettext.dgettext(MyWeb.Gettext, "errors", msg, opts)
end
end
end
No macros needed. This can be resolved by adding in a config pointing to the ErrorHelpers module. That's one way to solve it at least
This has been addressed in #38 pending next publish of the package.
Done and published! Closing this out.