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
Current section
Files
lib/cldr/gettext/plural.ex
if Code.ensure_loaded?(Gettext) do
defmodule Cldr.Gettext.Plural do
@moduledoc """
Defines a Plural module for Gettext that uses the `Cldr` plural rules.
"""
@behaviour Gettext.Plural
alias Cldr.Number.Cardinal
alias Cldr.LanguageTag
@doc """
Returns how many plural forms exist for a given locale.
* `locale` is either a locale name in the list `Cldr.known_locales/0` or
a `%LanguageTag{}` as returned by `Cldr.Locale.new/1`
## Examples
iex> Cldr.Gettext.Plural.nplurals("pl")
3
iex> Cldr.Gettext.Plural.nplurals("en")
2
"""
@spec nplurals(Locale.name | LanguageTag.t) :: non_neg_integer
def nplurals(locale_name) do
with \
{:ok, _locale} <- Cldr.validate_locale(locale_name)
do
Cardinal.plural_rules_for(locale_name) |> Enum.count
else
{:error, _reason} -> apply(Gettext.Plural, :nplurals, [locale_name])
end
end
@doc """
Returns to what plural form a given number belongs to in a given
locale.
* `locale` is either a locale name in the list `Cldr.known_locales/0` or
a `%LanguageTag{}` as returned by `Cldr.Locale.new/1`
## Examples
iex> Cldr.Gettext.Plural.plural("pl", 1)
0
iex> Cldr.Gettext.Plural.plural("pl", 2)
1
iex> Cldr.Gettext.Plural.plural("pl", 5)
2
iex> Cldr.Gettext.Plural.plural("pl", 112)
2
iex> Cldr.Gettext.Plural.plural("en", 1)
0
iex> Cldr.Gettext.Plural.plural("en", 2)
1
iex> Cldr.Gettext.Plural.plural("en", 112)
1
"""
@spec plural(Locale.name | LanguageTag.t, number) :: non_neg_integer
def plural(%LanguageTag{cldr_locale_name: cldr_locale_name}, n) do
plural(cldr_locale_name, n)
end
def plural(locale_name, n) do
with \
{:ok, locale} <- Cldr.validate_locale(locale_name)
do
rule = Cardinal.plural_rule(n, locale)
n = Cardinal.plural_rules_for(locale_name) |> Enum.count
gettext_return(rule, n)
else
{:error, _reason} -> apply(Gettext.Plural, :plural, [locale_name, n])
end
end
defp gettext_return(:zero, _n), do: 0
defp gettext_return(:one, _n), do: 1
defp gettext_return(:two, _n), do: 2
defp gettext_return(:few, _n), do: 3
defp gettext_return(:many, _n), do: 4
# Since :other is the catch-all it should
# return a number 1 greater than the number
# of rules defined in Cldr
defp gettext_return(:other, n), do: n - 1
end
end