Packages
ex_cldr
2.0.0-rc.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 - obsolete release candidate
Current section
Files
Jump to
Current section
Files
lib/cldr/gettext/plural.ex
defmodule Cldr.Gettext.Plural do
@moduledoc false
def define_gettext_plurals_module(config) do
quote location: :keep do
defmodule Gettext.Plural do
@moduledoc """
Defines a Plural module for Gettext that uses the `Cldr` plural rules.
"""
@behaviour :"Elixir.Gettext.Plural"
@dialyzer [no_match: [gettext_return: 2]]
alias Cldr.LanguageTag
alias Cldr.Locale
alias unquote(config.backend).Number.Cardinal
@doc """
Returns how many plural forms exist for a given locale.
* `locale` is either a locale name in the list `#{unquote(inspect(config.backend))}.known_locales/0` or
a `%LanguageTag{}` as returned by `Cldr.Locale.new/2`
## Examples
iex> #{inspect(__MODULE__)}.nplurals("pl")
4
iex> #{inspect(__MODULE__)}.nplurals("en")
2
"""
@spec nplurals(Locale.locale_name()) :: pos_integer
def nplurals(locale_name) when is_binary(locale_name) do
with {:ok, _locale} <- unquote(config.backend).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 `#{unquote(inspect(config.backend))}.known_locales/0` or
a `%LanguageTag{}` as returned by `Cldr.Locale.new/2`
## Examples
iex> #{inspect(__MODULE__)}.plural("pl", 1)
1
iex> #{inspect(__MODULE__)}.plural("pl", 2)
3
iex> #{inspect(__MODULE__)}.plural("pl", 5)
4
iex> #{inspect(__MODULE__)}.plural("pl", 112)
4
iex> #{inspect(__MODULE__)}.plural("en", 1)
1
iex> #{inspect(__MODULE__)}.plural("en", 2)
1
iex> #{inspect(__MODULE__)}.plural("en", 112)
1
"""
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} <- unquote(config.backend).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
end
end