Packages
ex_cldr
0.0.4
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.
Retired package: Deprecated
Current section
Files
Jump to
Current section
Files
lib/mix/support/install.ex
defmodule Cldr.Install do
@moduledoc """
Support for installing locales on demand.
When installed as a package on from [hex](http://hex.pm), `Cldr` has only
the default locale, "en", 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.
"""
@doc """
Install all the configured locales.
"""
def install_known_locales do
ensure_client_dirs_exist!(client_locale_dir())
Enum.each Cldr.known_locales(), &install_locale/1
:ok
end
@doc """
Install all available locales.
"""
def install_all_locales do
ensure_client_dirs_exist!(client_locale_dir())
Enum.each Cldr.all_locales(), &install_locale/1
:ok
end
@doc """
Download the requested locale from github into the
client app data directory.
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 http 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(locale, options \\ []) do
if !locale_installed?(locale) or options[:force] do
ensure_client_dirs_exist!(client_locale_dir())
Application.ensure_started(:inets)
Application.ensure_started(:ssl)
do_install_locale(locale, locale in Cldr.all_locales())
end
end
def do_install_locale(locale, false) do
raise Cldr.UnknownLocaleError,
"Requested locale #{inspect locale} is not known."
end
def do_install_locale(locale, true) do
IO.write "Downloading and installing locale #{inspect locale} ... "
locale_file_name = "#{locale}.json"
url = "#{base_url()}#{locale_file_name}" |> String.to_charlist
case :httpc.request(url) do
{:ok, {{_version, 200, 'OK'}, _headers, body}} ->
output_file_name = "#{client_locale_dir()}/#{locale_file_name}"
File.write!(output_file_name, :erlang.list_to_binary(body))
IO.puts "done."
{:ok, output_file_name}
{_, {{_version, code, message}, _headers, _body}} ->
IO.puts "error!"
raise RuntimeError,
message: "Couldn't download locale #{inspect locale}. " <>
"HTTP Error: (#{code}) #{inspect message}\nURL: #{inspect url}"
end
end
@doc """
Builds the base url to retrieve a locale file from github.
The url is build 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.
"""
@base_url "https://raw.githubusercontent.com/kipcole9/cldr/"
def base_url do
version = "v" <> Cldr.Mixfile.project[:version]
branch = if String.contains?(version, "-dev"), do: "master", else: version
@base_url <> branch <> "/priv/cldr/locales/"
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
!!Cldr.Config.locale_path(locale)
end
@doc """
Returns the directory where the client app stores `Cldr` data
"""
def client_data_dir do
Cldr.Config.data_dir()
end
@doc """
Returns the directory into which locale files are stored
for a client application.
The directory is relative to the configured data directory for
a client application. That is typically `./priv/cldr`
so that locales typically get stored in `./priv/cldr/locales`.
"""
def client_locale_dir do
"#{client_data_dir()}/locales"
end
def client_locale_file(locale) do
Path.join(client_locale_dir(), "#{locale}.json")
end
@doc """
Returns the directory where `Cldr` stores the core CLDR data
"""
def cldr_data_dir do
Path.join(Cldr.Config.cldr_home(), "/priv/cldr")
end
@doc """
Returns the directory where `Cldr` stores locales that can be
used in a client app.
Current strategy is to only package the "en" locale in `Cldr`
itself and that any other locales are downloaded when configured
and the client app is compiled with `Cldr` as a `dep`.
"""
def cldr_locale_dir do
Path.join(cldr_data_dir(), "/locales")
end
@doc """
Returns the path of the consolidated locale file stored in the `Cldr`
package (not the client application).
Since these consolidated files go in the github repo we consoldiate
them into the `Cldr` data directory which is
`Cldr.Config.cldr_home() <> /priv/cldr/locales`.
"""
def consolidated_locale_file(locale) do
Path.join(cldr_locale_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
paths = String.split(dir, "/")
|> Enum.reject(&(&1 == ""))
|> Enum.map(&(String.replace_prefix(&1, "", "/")))
do_ensure_client_dirs(paths)
end
defp do_ensure_client_dirs([h | []]) do
create_dir(h)
end
defp do_ensure_client_dirs([h | t]) do
create_dir(h)
do_ensure_client_dirs([h <> hd(t) | tl(t)])
end
defp create_dir(dir) do
case File.mkdir(dir) do
:ok ->
:ok
{:error, :eexist} ->
:ok
{:error, :eisdir} ->
:ok
{:error, code} ->
raise RuntimeError,
message: "Couldn't create #{dir}: #{inspect code}"
end
end
end