Packages
ex_cldr
0.11.0
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.Math
alias Cldr.LanguageTag
alias Cldr.Locale
@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.locale_name) :: non_neg_integer
def nplurals(locale_name) when is_binary(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.locale_name | LanguageTag.t, Math.number_or_decimal)
:: non_neg_integer | {:error, String.t}
def plural(%LanguageTag{cldr_locale_name: cldr_locale_name}, n) do
plural(cldr_locale_name, n)
end
def plural(locale_name, n) when is_binary(locale_name) 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