Packages
ex_cldr
0.0.13
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/list.ex
defmodule Cldr.List do
@moduledoc """
`Cldr` incudes patterns that enable list to be catenated together
to form a grammatically correct language construct for a given locale.
If we have a list of days like `["Monday", "Tuesday", "Wednesday"]`
then we can format that list for a given locale by:
iex> Cldr.List.to_string(["Monday", "Tuesday", "Wednesday"], locale: "en")
"Monday, Tuesday, and Wednesday"
"""
@type pattern_type :: :standard | :unit | :unit_narrow | :unit_short
@default_style :standard
@doc """
Formats a list into a string according to the list pattern rules for a locale.
* `list` is any list of of terms that can be passed through `Kernel.to_string/1`
* `options` are:
* `locale` is any configured locale. See `Cldr.known_locales()`. The default
is `locale: Cldr.get_locale()`
* `format` is one of those returned by
`Cldr.List.list_pattern_types_for/1`. The default is `format: :standard`
## Examples
iex> Cldr.List.to_string(["a", "b", "c"], locale: "en")
"a, b, and c"
iex> Cldr.List.to_string(["a", "b", "c"], locale: "en", format: :unit_narrow)
"a b c"
iex> Cldr.List.to_string(["a", "b", "c"], locale: "fr")
"a, b et c"
iex> Cldr.List.to_string([1,2,3,4,5,6])
"1, 2, 3, 4, 5, and 6"
iex> Cldr.List.to_string(["a"])
"a"
iex> Cldr.List.to_string([1,2])
"1 and 2"
"""
@spec to_string(List.t, Keyword.t) :: String.t
# For when the list is empty
def to_string(list, options \\ [])
def to_string([], _options) do
""
end
def to_string(list, options) do
{locale, format} = normalize_options(options)
to_string(list, locale, format)
end
# For when the list is empty
defp to_string([], _locale, _pattern_type) do
""
end
# For when there is one element only
defp to_string([first], _locale, _pattern_type) do
Kernel.to_string(first)
end
# For when there are two elements only
defp to_string([first, last], locale, pattern_type) do
pattern = list_patterns_for(locale)[pattern_type][:"2"]
pattern
|> String.replace("{0}", Kernel.to_string(first))
|> String.replace("{1}", Kernel.to_string(last))
end
# For when there are three elements only
defp to_string([first, middle, last], locale, pattern_type) do
first_pattern = list_patterns_for(locale)[pattern_type][:start]
last_pattern = list_patterns_for(locale)[pattern_type][:end]
last = last_pattern
|> String.replace("{0}", Kernel.to_string(middle))
|> String.replace("{1}", Kernel.to_string(last))
first_pattern
|> String.replace("{0}", Kernel.to_string(first))
|> String.replace("{1}", Kernel.to_string(last))
end
# For when there are more than 3 elements
defp to_string([first | rest], locale, pattern_type) do
first_pattern = list_patterns_for(locale)[pattern_type][:start]
first_pattern
|> String.replace("{0}", Kernel.to_string(first))
|> String.replace("{1}", do_to_string(rest, locale, pattern_type))
end
# When there are only two left (ie last)
defp do_to_string([first, last], locale, pattern_type) do
last_pattern = list_patterns_for(locale)[pattern_type][:end]
last_pattern
|> String.replace("{0}", Kernel.to_string(first))
|> String.replace("{1}", Kernel.to_string(last))
end
# For the middle elements
defp do_to_string([first | rest], locale, pattern_type) do
middle_pattern = list_patterns_for(locale)[pattern_type][:middle]
middle_pattern
|> String.replace("{0}", Kernel.to_string(first))
|> String.replace("{1}", do_to_string(rest, locale, pattern_type))
end
@spec list_patterns_for(Cldr.locale) :: Map.t
@spec list_pattern_styles_for(Cldr.locale) :: [atom]
Enum.each Cldr.known_locales, fn (locale) ->
patterns = Cldr.Locale.get_locale(locale).list_formats
pattern_names = Map.keys(patterns)
@doc """
Returns the list patterns for a locale.
List patterns provide rules for combining multiple
items into a language format appropriate for a locale.
## Example
iex> Cldr.List.list_patterns_for "en"
%{standard: %{"2": "{0} and {1}", end: "{0}, and {1}",
middle: "{0}, {1}", start: "{0}, {1}"},
standard_short: %{"2": "{0} and {1}", end: "{0}, and {1}",
middle: "{0}, {1}", start: "{0}, {1}"},
unit: %{"2": "{0}, {1}", end: "{0}, {1}", middle: "{0}, {1}",
start: "{0}, {1}"},
unit_narrow: %{"2": "{0} {1}", end: "{0} {1}", middle: "{0} {1}",
start: "{0} {1}"},
unit_short: %{"2": "{0}, {1}", end: "{0}, {1}", middle: "{0}, {1}",
start: "{0}, {1}"}}
"""
def list_patterns_for(unquote(locale)) do
unquote(Macro.escape(patterns))
end
@doc """
Returns the styles of list patterns available for a locale.
Returns a list of `atom`s of of the list format styles that are
available in CLDR for a locale.
## Example
iex> Cldr.List.list_pattern_styles_for("en")
[:standard, :standard_short, :unit, :unit_narrow, :unit_short]
"""
def list_pattern_styles_for(unquote(locale)) do
unquote(pattern_names)
end
end
defp normalize_options(options) do
locale = options[:locale] || Cldr.get_locale()
format = options[:format] || @default_style
verify_locale!(locale)
verify_format!(locale, format)
{locale, format}
end
defp verify_locale!(locale) do
if !Cldr.known_locale?(locale) do
raise Cldr.UnknownLocaleError,
"The locale #{inspect locale} is not known."
end
end
defp verify_format!(locale, format) do
if !(format in list_pattern_styles_for(locale)) do
raise ArgumentError, message:
"The list format style #{inspect format} is not known."
end
end
end