Current section

Files

Jump to
ash_translation lib ash_trans.ex
Raw

lib/ash_trans.ex

defmodule AshTranslation do
@moduledoc false
def cldr_backend_provider(config) do
module = __MODULE__
backend = config.backend
info = AshTranslation.Resource.Info
quote location: :keep, bind_quoted: [module: module, backend: backend, info: info] do
defmodule AshTranslation do
def translate(resource) do
locale = unquote(backend).get_locale().cldr_locale_name
unquote(module).translate(resource, locale)
end
def translate_field(resource, field) do
locale = unquote(backend).get_locale().cldr_locale_name
unquote(module).translate_field(resource, field, locale)
end
def locale_names() do
known_locales = unquote(backend).known_locale_names()
default_locale = unquote(backend).default_locale().cldr_locale_name
Enum.reject(known_locales, &(&1 == default_locale))
end
end
end
end
def add_forms(form, locales, path \\ [])
def add_forms(%{action: :create} = form, locales, path) do
do_add_forms(form, locales, path)
end
def add_forms(form, locales, path) do
keys = for key <- path ++ [:translations], do: Access.key(key)
if get_in(form.original_data, keys) do
form
else
do_add_forms(form, locales, path)
end
end
defp do_add_forms(form, locales, path) do
form = AshPhoenix.Form.add_form(form, path ++ [:translations])
Enum.reduce(locales, form, fn locale, form ->
AshPhoenix.Form.add_form(form, path ++ [:translations, locale])
end)
end
def translate(%{translations: translations} = resource, locale)
when map_size(translations) > 0 do
translations = Map.get(resource.translations, locale) || %{}
resource =
Ash.Resource.Info.relationships(resource)
|> Enum.filter(fn
%Ash.Resource.Relationships.BelongsTo{} -> false
_ -> true
end)
|> Enum.reduce(resource, fn relationship, resource ->
Map.update!(resource, relationship.name, fn
field when is_list(field) -> Enum.map(field, &translate(&1, locale))
field -> translate(field, locale)
end)
end)
AshTranslation.Resource.Info.translations_fields!(resource)
|> Enum.reduce(resource, fn field, resource ->
Map.update!(resource, field, fn original ->
Map.get(translations, field) || original
end)
end)
end
def translate(resource, _locale) do
resource
end
def translate_field(%{translations: translations} = resource, field, locale)
when map_size(translations) > 0 do
translations = Map.get(resource.translations, locale) || %{}
Map.get(translations, field) || Map.get(resource, field)
end
def translate_field(resource, _field, _locale) do
resource
end
end