Hello community!
Yesterday I tried for a while to translate errors that comes from AshJsonApi controllers (which are AshJsonApi.Error structs, often built from other error structs such as Ash.Error.Changes.InvalidAttribute if I understood well).
What I used to achieve is to take precedence on AshJsonApi errors implemented in the lib, with dumb errors just for the try, such as this one:
defimpl AshJsonApi.ToJsonApiError, for: Ash.Error.Changes.InvalidAttribute do
def to_json_api_error(error) do
dbg("HERE")
%AshJsonApi.Error{
id: Ash.UUID.generate(),
status_code: AshJsonApi.Error.class_to_status(error.class),
code: "panic",
title: "Panic",
detail: error.message
meta: Map.new(error.vars)
}
end
end
But the tradoffs of this new implementation are:
-
I get a compiler warning:
warning: redefining module AshJsonApi.ToJsonApiError.Ash.Error.Changes.InvalidAttribute (current version loaded from _build/dev/lib/ash_json_api/ebin/Elixir.AshJsonApi.ToJsonApiError.Ash.Error.Changes.InvalidAttribute.beam)│16 │ defimpl AshJsonApi.ToJsonApiError, for: Ash.Error.Changes.InvalidAttribute do│ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~│└─ lib/prepair/to_ash_json_api_error.ex:16: AshJsonApi.ToJsonApiError.Ash.Error.Changes.InvalidAttribute (module) -
I will lost eventual updates on the own library errors implementation
-
I do not manage to translate the error message with gettext (no compiler errors / warnings, but the displayed error is not yet the custom one I wrote, so it shows there is a problem in my implementation of the AshJsonApi.ToJsonApiError protocol):
defimpl AshJsonApi.ToJsonApiError, for: Ash.Error.Changes.InvalidAttribute do use Gettext, backend: PrepairWeb.Gettext def to_json_api_error(error) do dbg("HERE") %AshJsonApi.Error{ id: Ash.UUID.generate(), status_code: AshJsonApi.Error.class_to_status(error.class), code: "panic", title: "Panic", detail: dgettext( "errors", "must have the @ sign and no spaces" ), meta: Map.new(error.vars) } end end
I’ve searched on solutions but haven’t found one for now. The nearest to my problem thread I’ve read is this one: Translating Ash Error messages but I haven’t found a solution in it.
Does some of you already implemented translations for AshJsonApi errors?
To add more context, I can say for instance that this translations does work for AshErrors (not AshJsonApi) displayed in the Phoenix Liveview frontend:
defmodule Prepair.ValidationMacros do
defmacro validate_email() do
quote do
use Gettext, backend: PrepairWeb.Gettext
validate match(
:email,
~S/^[a-zA-Z0-9_.+-]+@[a-zA-Z0-9-]+.[a-zA-Z0-9-.]+$/
) do
on [:create, :update]
message dgettext("errors", "must have the @ sign and no spaces")
end
But I wonder why the AshJsonApi error which comes from the Ash error triggered by that validation doesn’t send a translated error to the API.






















