ExI18n

hex.pm versionBuild StatusCoverage StatusDeps Status

ExI18n is key-based internationalization library for Elixir.

Installation

Add exi18n to your list of dependencies and to applications in mix.exs:

# mix.exs
def deps do
[
{:exi18n, "~> 0.6.0"},
]
end
def application do
[applications: [:exi18n]]
end

Configuration

Add configuration to your config/config.exs:

# config.exs
config :exi18n,
default_locale: "en",
locales: ~w(en),
fallback: false,
loader: :yml,
loader_options: %{path: "priv/locales"}
var_prefix: "%{",
var_suffix: "}",

Configuration parameters

OptionDescriptionDefault
default_localeDefault locale in your application."en"
localesSupported locales.["en"]
fallbackFallback to default locale if translation empty.false
loaderTranslation loader. Supported types: :yml, :http, MyApp.Loader.:yml
loader_optionsTranslation loader options.%{}
var_prefixPrefix for values in translations."%{"
var_suffixSuffix for values in translations."}"

Loaders

YAML

This loader will use yaml files from path to load translations.

Module

ExI18n.Loader.YAML

Dependencies
# mix.exs
def deps do
[
{:exi18n, "~> 0.6.0"},
{:yaml_elixir, "~> 1.3.0"},
]
end
def application do
[applications: [
:exi18n,
:yaml_elixir,
]]
end
Configuration
OptionRequiredDescription
pathYesPath to locale files.
# config.exs
config :exi18n,
loader: :yml,
loader_options: %{
path: "priv/locales"
}

HTTP

This loader will call API to fetch translations.

Module

ExI18n.Loader.HTTP

Dependencies
# mix.exs
def deps do
[
{:exi18n, "~> 0.6.0"},
{:tesla, "~> 0.6.0"},
{:poison, ">= 1.0.0"}, # for JSON middleware
]
end
def application do
[applications: [
:exi18n,
]]
end
Configuration
OptionRequiredDescription
urlYesTranslations API endpoint.
adapterNoAdapter for Tesla. Default: :httpc. Tesla Adapters
adapter_optionsNoOptions for adapter.
headersNoHeaders passed with request to API.
middlewaresNoList of middlewares you want to use. Tesla middlewares
rootNoRoot key in response that contians translations.
# config.exs
config :exi18n,
loader: :http,
loader_options: %{
url: "https://www.example.com/translations",
adapter: Tesla.Adapter.Httpc,
adapter_options: nil,
headers: %{"Authorization" => "Bearer <token>"},
middlewares: [
{Tesla.Middleware.JSON, nil},
{MyApp.Middleware, %{option: "option"}},
],
root: false
}

Custom

Module

MyApp.Loader

Make sure that your custom loader has load/2 function that accepts locale and options as parameters and returns Map with translations.

Example:

defmodule MyApp.Loader do
def load(locale, _options) do
%{
"en" => %{...},
"de" => %{...}
}[locale]
end
end
Dependencies
# mix.exs
def deps do
[
{:exi18n, "~> 0.6.0"},
]
end
def application do
[applications: [
:exi18n,
]]
end
Configuration
# config.exs
config :exi18n,
loader: MyApp.Loader,
loader_options: %{my_config: "value"}

Documentation

https://hexdocs.pm/exi18n