View Source Get Started with AshTrans

Installation

First, add the dependency to your mix.exs file

{:ash_trans, "~> 0.1.0"}

and add :ash_trans to your .formatter.exs

import_deps: [..., :ash_trans]

Adding to a resource

To add translations to a resource, add the extension to the resource:

use Ash.Resource,
  extensions: [..., AshTrans.Resource]

translations do
  # Add public or add :translations to action accept list
  public? true
  # Add the fields you want to translate
  fields [:name, :description]
  # Add the locales, except the default locale
  locales [:it]
end

If you are using Cldr, add the provider to your Cldr module:

use Cldr,
  providers: [AshTrans],
  locales: ["it", "en"]

Then use the provider function for a locale list with the default excluded:

translations do
  locales MyApp.Cldr.AshTrans.locale_names()
end

To translate a resource, just do this:

# If you have Cldr
MyApp.Cldr.AshTrans.translate(resource)
# If you don't have Cldr
AshTrans.translate(resource, locale)

You can also translate just a field:

# If you have Cldr
MyApp.Cldr.AshTrans.translate_field(resource, field)
# If you don't have Cldr
AshTrans.translate_field(resource, field, locale)

Using with AshPhoenix

To use with AshPhoenix, there is a helper provided to add the required forms:

# Or Form.for_create
Form.for_update(activity_price_category, :update,
  # This is necessary, alternatively you can define them manually
  forms: [auto?: true],
  prepare_source: fn changeset ->
    # For the language selection later
    Ash.Changeset.set_argument(changeset, :locale, MyApp.Cldr.get_locale().cldr_locale_name)
  end
)
|> AshTrans.add_forms(locales)
# If you are using Cldr
# |> AshTrans.add_forms(Cldr.AshTrans.locale_names())

Example

<.input
  type="select"
  label={gettext("Language")}
  field={@form[:locale]}
  options={
    Enum.map(MyApp.Cldr.known_locale_names(), &{MyApp.Cldr.LocaleDisplay.display_name!(&1), &1})
  }
/>

<.input
  class={hide_input?(@form[:locale]) && "hidden"}
  label={gettext("Name")}
  field={@form[:name]}
/>

<.inputs_for :let={translations} field={@form[:translations]}>
  <.inputs_for
    :let={field}
    :for={locale <- MyApp.Cldr.AshTrans.locale_names()}
    field={translations[locale]}
  >
    <.input
      class={hide_translation_input?(@form[:locale], locale) && "hidden"}
      label={gettext("Name")}
      field={field[:name]}
    />
  </.inputs_for>
</.inputs_for>
defp hide_input?(field) do
  field.value &&
    to_string(field.value) != to_string(MyApp.Cldr.default_locale().cldr_locale_name)
end

defp hide_translation_input?(field, locale) do
  !field.value || to_string(field.value) != to_string(locale)
end