Packages
ex_cldr
0.5.2
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/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_locales do
Enum.each Cldr.Config.known_locales(), &install_locale/1
:ok
end
@doc """
Install all available locales.
"""
def install_all_locales do
Enum.each Cldr.Config.all_locales(), &install_locale/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(locale, options \\ []) do
if !locale_installed?(locale) or options[:force] do
ensure_client_dirs_exist!(client_locales_dir())
Application.ensure_started(:inets)
Application.ensure_started(:ssl)
do_install_locale(locale, locale in Cldr.Config.all_locales())
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(locale, false) do
raise Cldr.UnknownLocaleError,
"Failed to install the locale #{inspect locale}. The locale is not known."
end
defp do_install_locale(locale, true) do
require Logger
output_file_name = [client_locales_dir(), "/", locale_filename(locale)]
|> :erlang.iolist_to_binary
url = String.to_charlist("#{base_url()}#{locale_filename(locale)}")
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}"
{:ok, output_file_name}
{_, {{_version, code, message}, _headers, _body}} ->
Logger.error "Failed to download locale #{inspect locale} 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}. 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
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