Packages
ex_cldr
1.4.1
2.47.5
2.47.4
2.47.3
2.47.2
2.47.1
2.47.0
2.46.0
2.45.2
2.45.1
2.45.0
2.44.1
2.44.0
2.43.2
2.43.1
2.43.0
2.42.0
2.41.1
2.41.0
2.40.4
2.40.3
2.40.2
2.40.1
2.40.0
2.39.2
2.39.1
2.39.0
2.38.1
2.38.0
2.37.5
2.37.4
2.37.3
retired
2.37.2
2.37.1
2.37.0
2.36.0
2.35.1
2.35.0
retired
2.34.2
2.34.1
2.34.0
2.33.2
2.33.1
2.33.1-rc.0
2.33.0
2.32.1
2.32.0
2.31.0
2.30.0
2.29.0
2.28.0
2.27.1
2.27.0
retired
2.26.3
2.26.2
2.26.1
2.26.0
2.25.0
2.24.2
2.24.1
2.24.0
2.24.0-rc.6
2.24.0-rc.5
2.24.0-rc.4
2.24.0-rc.3
2.24.0-rc.2
2.24.0-rc.1
2.24.0-rc.0
2.23.2
2.23.1
2.23.0
2.22.1
2.22.0
2.21.0
2.20.0
2.20.0-rc.3
2.20.0-rc.2
2.20.0-rc.1
2.20.0-rc.0
2.19.1
2.19.0
2.18.2
2.18.1
2.18.0
2.18.0-rc.0
2.17.2
2.17.1
2.17.0
2.16.2
2.16.1
2.16.1-rc.0
2.16.0
2.15.0
2.14.1
2.14.0
2.14.0-rc.0
2.13.0
2.12.1
2.12.0
2.11.1
2.11.0
2.10.2
2.10.1
2.10.0
retired
2.9.0
2.8.1
2.8.0
2.7.2
2.7.1
2.7.0
2.6.2
2.6.1
2.6.0
2.5.0
2.4.3
2.4.2
2.4.1
2.4.0
2.3.2
2.3.1
2.3.0
2.2.7
2.2.6
2.2.5
2.2.4
2.2.3
2.2.2
2.2.1
2.2.0
2.1.0
2.0.4
2.0.3
2.0.2
2.0.1
2.0.0
2.0.0-rc.3
retired
2.0.0-rc.2
retired
2.0.0-rc.1
retired
2.0.0-rc.0
retired
1.8.2
1.8.1
1.8.0
1.7.1
1.7.0
1.6.4
1.6.3
1.6.2
1.6.1
1.6.0
1.5.2
1.5.1
1.5.0
1.4.5
1.4.4
1.4.3
1.4.2
1.4.1
1.4.0
retired
1.4.0-rc.3
retired
1.4.0-rc.2
retired
1.4.0-rc.1
retired
1.4.0-rc.0
retired
1.3.2
1.3.1
1.3.0
1.2.0
1.1.0
1.0.0
1.0.0-rc.3
retired
1.0.0-rc.2
retired
1.0.0-rc.1
retired
1.0.0-rc.0
retired
0.13.1
0.13.0
0.12.2
retired
0.12.1
retired
0.12.0
retired
0.11.0
retired
0.10.0
retired
0.9.0
retired
0.8.3
retired
0.8.2
retired
0.8.1
retired
0.8.0
retired
0.7.0
retired
0.6.2
retired
0.6.1
retired
0.6.0
retired
0.5.2
retired
0.5.1
retired
0.5.0
retired
0.4.2
retired
0.4.1
retired
0.4.0
retired
0.3.0
retired
0.2.1
retired
0.2.0
retired
0.1.3
retired
0.1.2
retired
0.1.1
retired
0.1.0
retired
0.0.20
retired
0.0.19
retired
0.0.18
retired
0.0.17
retired
0.0.16
retired
0.0.15
retired
0.0.14
retired
0.0.13
retired
0.0.12
retired
0.0.11
retired
0.0.10
retired
0.0.8
retired
0.0.7
retired
0.0.6
retired
0.0.5
retired
0.0.4
retired
0.0.3
retired
Common Locale Data Repository (CLDR) functions for Elixir to localize and format numbers, dates, lists, messages, languages, territories and units with support for over 700 locales for internationalized (i18n) and localized (L10N) applications.
Current section
Files
Jump to
Current section
Files
lib/cldr/install.ex
defmodule Cldr.Install do
@moduledoc """
Provides functions for installing locales.
When installed as a package on from [hex](http://hex.pm), `Cldr` has only
the default locales `["en", "root"]` installed and configured.
When other locales are added to the configuration `Cldr` will attempt to
download the locale from [github](https://github.com/kipcole9/cldr)
during compilation.
If `Cldr` is installed from github directly then all locales are already
installed.
"""
import Cldr.Macros, only: [docp: 1]
defdelegate client_data_dir(), to: Cldr.Config
defdelegate client_locales_dir(), to: Cldr.Config
defdelegate locale_filename(locale), to: Cldr.Config
@doc """
Install all the configured locales.
"""
def install_known_locale_names do
Enum.each(Cldr.Config.known_locale_names(), &install_locale_name/1)
:ok
end
@doc """
Install all available locales.
"""
def install_all_locale_names do
Enum.each(Cldr.Config.all_locale_names(), &install_locale_name/1)
:ok
end
@doc """
Download the requested locale from github into the
client application's cldr data directory.
* `locale` is any locale returned by `Cldr.known_locales/0`
* `options` is a keyword list. Currently the only supported
option is `:force` which defaults to `false`. If `truthy` the
locale will be installed or re-installed.
The data directory is typically `./priv/cldr/locales`.
This function is intended to be invoked during application
compilation when a valid locale is configured but is not yet
installed in the application.
An https request to the master github repository for `Cldr` is made
to download the correct version of the locale file which is then
written to the configured data directory.
"""
def install_locale_name(locale_name, options \\ []) do
if !locale_installed?(locale_name) or options[:force] do
ensure_client_dirs_exist!(client_locales_dir())
Application.ensure_started(:inets)
Application.ensure_started(:ssl)
do_install_locale_name(locale_name, locale_name in Cldr.Config.all_locale_names())
else
:already_installed
end
end
# Normally a library function shouldn't raise an exception (thats up
# to the client app) but we install locales only at compilation time
# and an exception then is the appropriate response.
defp do_install_locale_name(locale_name, false) do
raise Cldr.UnknownLocaleError,
"Failed to install the locale named #{inspect(locale_name)}. The locale name is not known."
end
defp do_install_locale_name(locale_name, true) do
require Logger
output_file_name =
[client_locales_dir(), "/", locale_filename(locale_name)]
|> :erlang.iolist_to_binary()
url = String.to_charlist("#{base_url()}#{locale_filename(locale_name)}")
case :httpc.request(url) do
{:ok, {{_version, 200, 'OK'}, _headers, body}} ->
output_file_name
|> File.write!(:erlang.list_to_binary(body))
Logger.info("Downloaded locale #{inspect(locale_name)}")
{:ok, output_file_name}
{_, {{_version, code, message}, _headers, _body}} ->
Logger.error(
"Failed to download locale #{inspect(locale_name)} from #{url}. " <>
"HTTP Error: (#{code}) #{inspect(message)}"
)
{:error, code}
{:error, {:failed_connect, [{_, {host, _port}}, {_, _, sys_message}]}} ->
Logger.error(
"Failed to connect to #{inspect(host)} to download " <>
"locale #{inspect(locale_name)}. Reason: #{inspect(sys_message)}"
)
{:error, sys_message}
end
end
docp("""
Builds the base url to retrieve a locale file from github.
The url is built using the version number of the `Cldr` application.
If the version is a `-dev` version then the locale file is downloaded
from the master branch.
This requires that a branch is tagged with the version number before creating
a release or publishing to hex.
""")
@base_url "https://raw.githubusercontent.com/kipcole9/cldr/"
defp base_url do
[@base_url, branch_from_version(), "/priv/cldr/locales/"]
|> :erlang.iolist_to_binary()
end
# Returns the version of ex_cldr
defp app_version do
cond do
spec = Application.spec(:ex_cldr) ->
Keyword.get(spec, :vsn) |> :erlang.list_to_binary()
Code.ensure_loaded?(Cldr.Mixfile) ->
Keyword.get(Cldr.Mixfile.project(), :version)
true ->
:error
end
end
# Get the git branch name based upon the app version
defp branch_from_version do
version = app_version()
if String.contains?(version, "-dev") do
"master"
else
"v#{version}"
end
end
@doc """
Returns a `boolean` indicating if the requested locale is installed.
No checking of the validity of the `locale` itself is performed. The
check is based upon whether there is a locale file installed in the
client application or in `Cldr` itself.
"""
def locale_installed?(locale) do
case Cldr.Config.locale_path(locale) do
{:ok, _path} -> true
_ -> false
end
end
@doc """
Returns the full pathname of the locale's json file.
* `locale` is any locale returned by `Cldr.known_locales/0`
No checking of locale validity is performed.
"""
def client_locale_file(locale) do
Path.join(client_locales_dir(), "#{locale}.json")
end
# Create the client app locales directory and any directories
# that don't exist above it.
defp ensure_client_dirs_exist!(dir) do
File.mkdir_p(dir)
end
end