Packages
localize
0.25.0
1.0.0-rc.6
1.0.0-rc.5
1.0.0-rc.4
1.0.0-rc.3
1.0.0-rc.2
1.0.0-rc.1
1.0.0-rc.0
0.50.0
0.49.0
0.48.0
0.47.0
0.46.0
0.45.0
0.44.0
0.41.3
0.41.2
0.41.1
0.41.0
0.40.0
0.39.0
0.38.0
0.37.0
0.36.0
0.35.0
0.34.0
0.33.0
0.32.0
0.31.0
0.30.1
0.30.0
retired
0.29.0
0.28.0
0.27.0
0.26.0
0.25.0
0.24.0
0.23.0
0.22.0
0.21.0
0.20.0
0.19.0
0.18.0
0.16.0
0.15.0
0.14.0
0.13.0
0.12.0
0.11.0
0.10.0
0.9.0
0.8.0
0.7.0
0.6.0
0.5.0
0.4.0
0.3.0
0.2.0
0.1.0
0.1.0-alpha.1
Localization (parsing, formatting) of numbers, dates/time/calendar, units of measure, messages and lists. Includes localized collation.
Current section
Files
Jump to
Current section
Files
lib/localize/collation/tailoring/locale_defaults.ex
defmodule Localize.Collation.Tailoring.LocaleDefaults do
@moduledoc """
Preset collation option defaults for common locales.
Maps BCP47 language tags to their standard collation option overrides
as defined by CLDR. These defaults are applied before any explicit
BCP47 `-u-` extension keys.
"""
@locale_defaults %{
"cu" => [case_first: :upper],
"da" => [case_first: :upper],
"mt" => [case_first: :upper],
"nb" => [case_first: :upper],
"nn" => [case_first: :upper],
"no" => [case_first: :upper]
}
@locale_type_defaults %{
"de" => :standard,
"es" => :standard
}
@doc """
Get option overrides for a locale.
### Arguments
* `locale` - a BCP47 locale string (e.g., `"da"`, `"de-AT"`, `"sv-SE"`).
### Returns
A keyword list of option overrides, or an empty list if no defaults exist.
### Examples
iex> Localize.Collation.Tailoring.LocaleDefaults.options_for("da")
[case_first: :upper]
iex> Localize.Collation.Tailoring.LocaleDefaults.options_for("en")
[]
"""
@spec options_for(String.t()) :: keyword()
def options_for(locale) when is_binary(locale) do
language = extract_language(locale)
case Map.get(@locale_defaults, language) do
nil -> options_from_parent(language)
defaults -> defaults
end
end
defp options_from_parent(language) do
case Localize.validate_locale(language) do
{:ok, tag} ->
case Localize.Locale.parent(tag) do
{:ok, parent_tag} ->
parent_lang = parent_tag.language |> to_string()
if parent_lang != language and parent_lang != "und" do
options_for(parent_lang)
else
[]
end
{:error, _} ->
[]
end
{:error, _} ->
[]
end
end
@doc """
Get the default collation type for a locale.
### Arguments
* `locale` - a BCP47 locale string.
### Returns
The default collation type atom for the locale, or `:standard`.
### Examples
iex> Localize.Collation.Tailoring.LocaleDefaults.default_type("de")
:standard
iex> Localize.Collation.Tailoring.LocaleDefaults.default_type("es")
:standard
"""
@spec default_type(String.t()) :: atom()
def default_type(locale) when is_binary(locale) do
language = extract_language(locale)
Map.get(@locale_type_defaults, language, :standard)
end
@doc """
Extract the language subtag from a BCP47 locale string.
### Arguments
* `locale` - a BCP47 locale string.
### Returns
The lowercase language subtag string.
### Examples
iex> Localize.Collation.Tailoring.LocaleDefaults.extract_language("de-AT-u-co-phonebk")
"de"
iex> Localize.Collation.Tailoring.LocaleDefaults.extract_language("sv")
"sv"
"""
@spec extract_language(String.t()) :: String.t()
def extract_language(locale) do
locale
|> String.split("-", parts: 2)
|> hd()
|> String.downcase()
end
end