Packages

ex_cldr

0.8.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.

Retired package: Deprecated

Current section

Files

Jump to
ex_cldr lib cldr locale.ex
Raw

lib/cldr/locale.ex

defmodule Cldr.Locale do
@moduledoc """
Parse and process locale json as defined by [Unicode](http://unicode.org/reports/tr35/#Unicode_Language_and_Locale_Identifiers)
"""
alias Cldr.LanguageTag
import Cldr.Helpers
@typedoc "The name of a locale in a string format"
@type name :: String.t
def new(locale_name) when is_binary(locale_name) do
canonical_language_tag!(locale_name)
end
def canonical_language_tag(locale_name) when is_binary(locale_name) do
case LanguageTag.parse(locale_name) do
{:ok, language_tag} ->
canonical_language_tag(language_tag)
{:error, reason} ->
{:error, reason}
end
end
def canonical_language_tag(%LanguageTag{} = language_tag) do
canonical_tag =
language_tag
|> substitute_aliases
|> add_likely_subtags
canonical_tag =
canonical_tag
|> Map.put(:requested_locale_name, locale_name_from(language_tag))
|> Map.put(:canonical_locale_name, locale_name_from(canonical_tag))
|> set_cldr_locale_name
|> set_rbnf_locale_name
{:ok, canonical_tag}
end
def canonical_language_tag!(language_tag) do
case canonical_language_tag(language_tag) do
{:ok, tag} -> tag
{:error, {exception, reason}} -> raise exception, reason
end
end
defp set_cldr_locale_name(%LanguageTag{} = language_tag) do
cldr_locale_name = cldr_locale_name(language_tag)
%{language_tag | cldr_locale_name: cldr_locale_name}
end
defp set_rbnf_locale_name(%LanguageTag{} = language_tag) do
rbnf_locale_name = rbnf_locale_name(language_tag)
%{language_tag | rbnf_locale_name: rbnf_locale_name}
end
def cldr_locale_name(%LanguageTag{language: language, script: script,
region: region, variant: variant} = language_tag) do
Cldr.known_locale(locale_name_from(language, script, region, variant)) ||
Cldr.known_locale(locale_name_from(language, nil, region, variant)) ||
Cldr.known_locale(locale_name_from(language, script, nil, variant)) ||
Cldr.known_locale(locale_name_from(language, nil, nil, variant)) ||
Cldr.known_locale(language_tag.requested_locale_name) ||
nil
end
def rbnf_locale_name(%LanguageTag{language: language, script: script,
region: region} = language_tag) do
Cldr.known_rbnf_locale(locale_name_from(language, script, region, nil)) ||
Cldr.known_rbnf_locale(locale_name_from(language, nil, region, nil)) ||
Cldr.known_rbnf_locale(locale_name_from(language, script, nil, nil)) ||
Cldr.known_rbnf_locale(locale_name_from(language, nil, nil, nil)) ||
Cldr.known_rbnf_locale(language_tag.requested_locale_name) ||
nil
end
@spec normalize_locale_name(name) :: name
def normalize_locale_name(name) do
String.replace(name, "_", "-")
end
def locale_name_from(%LanguageTag{language: language, script: script,
region: region, variant: variant}) do
locale_name_from(language, script, region, variant)
end
def locale_name_from(language, script, region, variant) do
[language, script, region, variant]
|> Enum.reject(&is_nil/1)
|> Enum.join("-")
end
@doc """
Given a source locale X, to return a locale Y where the aliases
have been substituted with their non-deprecated alternatives.
* Replace any deprecated subtags with their canonical values using the alias
data. Use the first value in the replacement list, if
it exists. Language tag replacements may have multiple parts, such as
`sh``sr_Latn` or `mo``ro_MD`. In such a case, the original script and/or
region are retained if there is one. Thus `sh_Arab_AQ``sr_Arab_AQ`, not
`sr_Latn_AQ`.
* Remove the script code 'Zzzz' and the region code 'ZZ' if they occur.
* Get the components of the cleaned-up source tag (languages, scripts, and
regions), plus any variants and extensions.
## Examples
iex> Cldr.Locale.substitute_aliases Cldr.LanguageTag.Parser.parse!("en-US")
%Cldr.LanguageTag{extensions: %{}, language: "en", locale: %{}, private_use: [],
region: "US", script: nil, transform: %{}, variant: nil}
iex> Cldr.Locale.substitute_aliases Cldr.LanguageTag.Parser.parse!("sh_Arab_AQ")
%Cldr.LanguageTag{extensions: %{}, language: "sr", locale: [], private_use: [],
region: "AQ", script: "Arab", transform: %{}, variant: nil}
iex> Cldr.Locale.substitute_aliases Cldr.LanguageTag.Parser.parse!("sh_AQ")
%Cldr.LanguageTag{extensions: %{}, language: "sr", locale: [], private_use: [],
region: "AQ", script: "Latn", transform: %{}, variant: nil}
iex> Cldr.Locale.substitute_aliases Cldr.LanguageTag.Parser.parse!("mo")
%Cldr.LanguageTag{extensions: %{}, language: "ro", locale: [], private_use: [],
region: "MD", script: nil, transform: %{}, variant: nil}
"""
def substitute_aliases(%LanguageTag{} = language_tag) do
language_tag
|> substitute(:language)
|> substitute(:script)
|> substitute(:region)
|> merge(language_tag)
|> remove_unknown(:script)
|> remove_unknown(:region)
end
defp substitute(%LanguageTag{language: language}, :language) do
aliases(language, :language) || %LanguageTag{}
end
defp substitute(%LanguageTag{script: script} = language_tag, :script) do
%{language_tag | script: aliases(script, :script) || script}
end
defp substitute(%LanguageTag{region: region} = language_tag, :region) do
%{language_tag | region: aliases(region, :region) || region}
end
defp merge(alias_tag, original_language_tag) do
Map.merge(alias_tag, original_language_tag, fn
:language, v_alias, v_original ->
if empty?(v_alias), do: v_original, else: v_alias
_k, v_alias, v_original ->
if empty?(v_original), do: v_alias, else: v_original
end)
end
defp remove_unknown(%LanguageTag{script: "Zzzz"} = language_tag, :script) do
%{language_tag | script: nil}
end
defp remove_unknown(%LanguageTag{} = language_tag, :script), do: language_tag
defp remove_unknown(%LanguageTag{region: "ZZ"} = language_tag, :region) do
%{language_tag | region: nil}
end
defp remove_unknown(%LanguageTag{} = language_tag, :region), do: language_tag
@doc """
Given a source locale X, to return a locale Y where the empty subtags
have been filled in by the most likely subtags.
This is written as X ⇒ Y ("X maximizes to Y").
A subtag is called empty if it is a missing script or region subtag, or it is
a base language subtag with the value `und`. In the description below,
a subscript on a subtag x indicates which tag it is from: x<sub>s</sub> is in the
source, x<sub>m</sub> is in a match, and x<sub>r</sub> is in the final result.
This operation is performed in the following way:
### Lookup
Lookup each of the following in order, and stop on the first match:
* language<sub>s</sub>-script<sub>s</sub>-region<sub>s</sub>
* language<sub>s</sub>-region<sub>s</sub>
* language<sub>s</sub>-script<sub>s</sub>
* language<sub>s</sub>
* und-script<sub>s</sub>
### Return
* If there is no match,either return
* an error value, or
* the match for `und`
* Otherwise there is a match = language<sub>m</sub>-script<sub>m</sub>-region<sub>m</sub>
* Let x<sub>r</sub> = x<sub>s</sub> if x<sub>s</sub> is not empty, and x<sub>m</sub> otherwise.
* Return the language tag composed of language<sub>r</sub>-script<sub>r</sub>-region<sub>r</sub> + variants + extensions .
## Example
iex> Cldr.Locale.add_likely_subtags Cldr.LanguageTag.parse!("zh-SG")
%Cldr.LanguageTag{extensions: %{}, language: "zh", locale: [], private_use: [],
region: "SG", script: "Hans", transform: %{}, variant: nil}
"""
def add_likely_subtags(%LanguageTag{language: language, script: script, region: region} = language_tag) do
subtags = likely_subtags(locale_name_from(language, script, region, nil)) ||
likely_subtags(locale_name_from(language, nil, region, nil)) ||
likely_subtags(locale_name_from(language, script, nil, nil)) ||
likely_subtags(locale_name_from(language, nil, nil, nil)) ||
likely_subtags(locale_name_from("und", script, nil, nil)) ||
likely_subtags(locale_name_from("und", nil, nil, nil))
Map.merge(subtags, language_tag, fn _k, v1, v2 -> if empty?(v2), do: v1, else: v2 end)
end
def locale_error(locale_name) when is_binary(locale_name) do
{Cldr.UnknownLocaleError, "The locale #{inspect locale_name} is not known."}
end
def locale_error(%LanguageTag{requested_locale_name: requested_locale_name}) do
locale_error(requested_locale_name)
end
def alias_error(locale_name, alias_name) do
{Cldr.UnknownLocaleError, "The locale #{inspect locale_name} and its " <>
"alias #{inspect alias_name} are not known."}
end
@aliases Cldr.Config.aliases
def aliases do
@aliases
end
@alias_keys Map.keys(@aliases)
def aliases(key, type) when type in @alias_keys do
aliases()
|> Map.get(type)
|> Map.get(key)
end
@likely_subtags Cldr.Config.likely_subtags
def likely_subtags do
@likely_subtags
end
def likely_subtags(locale_string) do
Map.get(likely_subtags(), locale_string)
end
end