Packages
ex_cldr
0.8.3
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
priv/cldr/rfc5646.abnf
!!!
require Logger
def normalize(input) when is_list(input) do
to_string(input)
end
def normalize(input) do
input
end
def normalize_list([list]) do
normalize(list)
end
def normalize_list(list) when is_list(list) do
Enum.map(list, &normalize/1)
end
def normalize_list(list) do
list
end
def normalize_tuples(list) do
Enum.map(list, fn {k, v} ->
{normalize(k), normalize_list(v)}
end)
end
def return_value(key, state, string_values, _values, _rule) do
[v] = string_values
{:ok, Map.put(state, key, normalize(v)), v}
end
def accumulate_value(key, state, string_values, _values, _rule) do
[v] = string_values
value = normalize(v)
case Map.get(state, key) do
nil ->
{:ok, Map.put(state, key, value), value}
[_h | _t] = state_value ->
{:ok, Map.put(state, key, state_value ++ [value]), value}
state_value ->
{:ok, Map.put(state, key, [state_value, value]), value}
end
end
def tuples(values) do
values
|> List.flatten
|> Enum.reject(&is_integer/1)
end
!!!
language-tag = langtag ; normal language tags
/ privateuse ; private use tag
/ grandfathered ; grandfathered tags
langtag = language
["-" script]
["-" region]
*("-" variant)
*("-" extensions)
["-" privateuse]
language = 2*3ALPHA ; shortest ISO 639 code
;["-" extlang] ; sometimes followed by
; extended language subtags
/ 4ALPHA ; or reserved for future use
/ 5*8ALPHA !!! # or registered language subtag
return_value(:language, state, string_values, values, rule)
!!!
extlang = 3ALPHA ; selected ISO 639 codes
*2("-" 3ALPHA) ; permanently reserved
script = 4ALPHA !!! # ISO 15924 code
return_value(:script, state, string_values, values, rule)
!!!
region = 2ALPHA ; ISO 3166-1 code
/ 3DIGIT !!! # UN M.49 code
return_value(:region, state, string_values, values, rule)
!!!
variant = 5*8alphanum ; registered variants
/ (DIGIT 3alphanum) !!!
accumulate_value(:variant, state, string_values, values, rule)
!!!
extensions = locale / transform / extension !!!
_ = rule
_ = string_values
state = if values == [[[[]]]] do
state
else
[[[{extension, values}]]] = values
extensions = Map.put(state.extensions, extension, normalize_list(values))
Map.put(state, :extensions, extensions)
end
{:ok, state, []}
!!!
extension = singleton 1*("-" (2*8alphanum)) !!!
_ = rule
_ = string_values
[extension | values] = :string.split(:lists.flatten(values), '-', :all)
{:ok, state, {normalize(extension), values}}
!!!
; The following is the syntax for the extensions managed
; by CLDR. These are extensions "u" for locale and "t"
; for transforms
locale = "u" (1*("-" keyword) / 1*("-" attribute) *("-" keyword)) !!!
_ = rule
_ = string_values
keywords = tuples(values) |> normalize_tuples |> Enum.into(%{})
{:ok, %{state | locale: keywords}, []}
!!!
transform = "t" (1*("-" keyword)) !!!
_ = rule
_ = string_values
keywords = tuples(values) |> normalize_tuples |> Enum.into(%{})
{:ok, %{state | transform: keywords}, []}
!!!
keyword = key ["-" type] !!!
_ = rule
_ = string_values
[key | values] = :string.split(:lists.flatten(values), '-', :all)
{:ok, state, {normalize(key), values}}
!!!
key = 2alphanum !!!
_ = rule
_ = string_values
{:ok, state, normalize(:lists.flatten(values))}
!!!
type = 3*8alphanum *("-" 3*8alphanum) !!!
_ = rule
_ = string_values
{:ok, state, normalize(:lists.flatten(values))}
!!!
attribute = 3*8alphanum !!!
_ = rule
_ = string_values
{:ok, state, {:attributes, normalize_list(:string.split(:lists.flatten(values), '-', :all))}}
!!!
; Single alphanumerics
; "x" reserved for private use
; "u" reserved for CLDR use as locale
; "t" reserved for CLDR use as tranforms
singleton = DIGIT ; 0 - 9
/ %x41-53 ; A - S
/ %x56-57 ; V - W
/ %x59-5A ; Y - Z
/ %x61-73 ; a - s
/ %x76-77 ; v - w
/ %x79-7A ; y - z
privateuse = "x" 1*("-" (1*8alphanum)) !!!
_ = rule
_ = string_values
[_x | values] = :string.split(:lists.flatten(values), '-', :all)
{:ok, %{state | private_use: normalize_list(values)}, []}
!!!
grandfathered = irregular ; non-redundant tags registered
/ regular ; during the RFC 3066 era
irregular = "en-GB-oed" ; irregular tags do not match
/ "i-ami" ; the 'langtag' production and
/ "i-bnn" ; would not otherwise be
/ "i-default" ; considered 'well-formed'
/ "i-enochian" ; These tags are all valid,
/ "i-hak" ; but most are deprecated
/ "i-klingon" ; in favor of more modern
/ "i-lux" ; subtags or subtag
/ "i-mingo" ; combination
/ "i-navajo"
/ "i-pwn"
/ "i-tao"
/ "i-tay"
/ "i-tsu"
/ "sgn-BE-FR"
/ "sgn-BE-NL"
/ "sgn-CH-DE"
regular = "art-lojban" ; these tags match the 'langtag'
/ "cel-gaulish" ; production, but their subtags
/ "no-bok" ; are not extended language
/ "no-nyn" ; or variant subtags: their meaning
/ "zh-guoyu" ; is defined by their registration
/ "zh-hakka" ; and all of these are deprecated
/ "zh-min" ; in favor of a more modern
/ "zh-min-nan" ; subtag or sequence of subtags
/ "zh-xiang"
alphanum = (ALPHA / DIGIT) ; letters and numbers
DIGIT = %x30-39
ALPHA = %x41-5A / %x61-7A