defmodule <%= web_namespace %>.ErrorHelpers do
  @moduledoc """
  Conveniences for translating and building error messages.
  """
<%= if html do %>
  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
<% 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(<%= web_namespace %>.Gettext, "errors", msg, msg, count, opts)
    else
      Gettext.dgettext(<%= web_namespace %>.Gettext, "errors", msg, opts)
    end
  end
end

defmodule <%= web_namespace %>.ErrorHelpers do
  @moduledoc """
  Conveniences for translating and building error messages.
  """
<%= if html do %>
  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
<% end %>
  @doc """
  Translates an error message using gettext.
  """
  def translate_error({msg, opts}) do
    # When using gettext, we typically pass the strings we want
    # to translate as a static argument:
    #
    #     # Translate "is invalid" in the "errors" domain
    #     dgettext "errors", "is invalid"
    #
    #     # Translate the number of files with plural rules
    #     dngettext "errors", "1 file", "%{count} files", count
    #
    # Because the error messages we show in our forms and APIs
    # are defined inside Ecto, we need to translate them dynamically.
    # This requires us to call the Gettext module passing our gettext
    # backend as first argument.
    #
    # Note we use the "errors" domain, which means translations
    # should be written to the errors.po file. The :count option is
    # set by Ecto and indicates we should also apply plural rules.
    if count = opts[:count] do
      Gettext.dngettext(<%= web_namespace %>.Gettext, "errors", msg, msg, count, opts)
    else
      Gettext.dgettext(<%= web_namespace %>.Gettext, "errors", msg, opts)
    end
  end
end

Improve description of the gettext usage
Improve description of the gettext usage
rafbgarcia/phoenix,Joe-noh/phoenix,dmarkow/phoenix,nshafer/phoenix,pap/phoenix,mobileoverlord/phoenix,gjaldon/phoenix,rafbgarcia/phoenix,korobkov/phoenix,dmarkow/phoenix,0x00evil/phoenix,evax/phoenix,Gazler/phoenix,Kosmas/phoenix,Gazler/phoenix,gjaldon/phoenix,pap/phoenix,optikfluffel/phoenix,rafbgarcia/phoenix,evax/phoenix,jwarwick/phoenix,michalmuskala/phoenix,mschae/phoenix,eksperimental/phoenix,keathley/phoenix,bsmr-erlang/phoenix,bsmr-erlang/phoenix,0x00evil/phoenix,trarbr/phoenix,keathley/phoenix,nshafer/phoenix,mitchellhenke/phoenix,stevedomin/phoenix,korobkov/phoenix,trarbr/phoenix,phoenixframework/phoenix,0x00evil/phoenix,stevedomin/phoenix,Kosmas/phoenix,nshafer/phoenix,mschae/phoenix,jwarwick/phoenix,Joe-noh/phoenix,phoenixframework/phoenix,phoenixframework/phoenix,mobileoverlord/phoenix,optikfluffel/phoenix,michalmuskala/phoenix,mitchellhenke/phoenix,optikfluffel/phoenix,eksperimental/phoenix