Cldr v1.3.2 Cldr.AcceptLanguage View Source

Tokenizer and parser for HTTP Accept-Language header values as defined in rfc2616.

The Accept-Language request-header field is similar to Accept, but restricts the set of natural languages that are preferred as a response to the request. Language tags function are provided in Cldr.LanguageTag.

The format of an Accept-Language header is as follows in ABNF format:

   Accept-Language = "Accept-Language" ":"
                     1#( language-range [ ";" "q" "=" qvalue ] )
   language-range  = ( ( 1*8ALPHA *( "-" 1*8ALPHA ) ) | "*" )

Each language-range MAY be given an associated quality value which represents an estimate of the user’s preference for the languages specified by that range. The quality value defaults to “q=1”. For example,

   Accept-Language: da, en-gb;q=0.8, en;q=0.7

would mean: “I prefer Danish, but will accept British English and other types of English.”

Link to this section Summary

Functions

Parse an Accept-Language string and return the best match for a configured Cldr locale

Filters the returned results of parse/1 to return only the error tuples

Parses an Accept-Language header value in its string or tokenized form to return a tuple of the form {:ok, [{quality, %Cldr.LanguageTag{}}, ...]} sorted by quality

Parses an Accept-Language header value in its string or tokenized form to produce a list of tuples of the form [{quality, %Cldr.LanguageTag{}}, ...] sorted by quality in decending order

Splits the language ranges for an Accept-Language header value into tuples {quality, language}

Link to this section Functions

Link to this function best_match(accept_language) View Source
best_match(String.t()) ::
  {:ok, Cldr.LanguageTag.t()} |
  {:error, {Cldr.AcceptLanguageError, String.t()}}

Parse an Accept-Language string and return the best match for a configured Cldr locale.

  • accept_langauge is a string representing an accept language header

Returns:

  • {:ok, language_tag} or

  • {:error, reason}

Examples

iex> Cldr.AcceptLanguage.best_match "da;q=0.1,zh-TW;q=0.3"
{
  :ok,
  %Cldr.LanguageTag{
    canonical_locale_name: "zh-Hant-TW",
    cldr_locale_name: "zh-Hant",
    extensions: %{},
    language: "zh",
    locale: %{},
    private_use: [],
    rbnf_locale_name: "zh-Hant",
    requested_locale_name: "zh-TW",
    script: "Hant",
    territory: "TW",
    transform: %{},
    variant: nil
  }
}

iex> Cldr.AcceptLanguage.best_match "en,zh-TW;q=0.3"
{:ok, %Cldr.LanguageTag{
  canonical_locale_name: "en-Latn-US",
  cldr_locale_name: "en",
  extensions: %{},
  gettext_locale_name: "en",
  language: "en",
  locale: %{},
  private_use: [],
  rbnf_locale_name: "en",
  requested_locale_name: "en",
  script: "Latn",
  territory: "US",
  transform: %{},
  variant: nil
}}

iex> Cldr.AcceptLanguage.best_match "xx,yy;q=0.3"
{
  :error,
  {Cldr.NoMatchingLocale,
   "No configured locale could be matched to \"xx,yy;q=0.3\""}
}

iex> Cldr.AcceptLanguage.best_match "x"
{
  :error,
  {Cldr.AcceptLanguageError,
   "Could not parse language tag.  Error was detected at 'x'"}
}
Link to this function errors(parse_result) View Source
errors([tuple(), ...]) :: [{:error, {Cldr.InvalidLanguageTag, String.t()}}, ...]

Filters the returned results of parse/1 to return only the error tuples.

Example

iex> Cldr.AcceptLanguage.parse!("da,zh-TW;q=0.3,X") |> Cldr.AcceptLanguage.errors
[{:error,
  {Cldr.InvalidLanguageTag,
   "Could not parse language tag.  Error was detected at 'x'"}, "x"}]
Link to this function parse(tokens) View Source
parse([{float(), String.t()}, ...] | String.t()) :: {:ok, [{float(), Cldr.LanguageTag.t()} | {:error, {Cldr.InvalidLanguageTag, String.t()}}, ...]}

Parses an Accept-Language header value in its string or tokenized form to return a tuple of the form {:ok, [{quality, %Cldr.LanguageTag{}}, ...]} sorted by quality.

  • accept-language is any string in the format defined by rfc2616

Returns:

  • {:ok, [{quality, language_tag}, ...]} or

  • {:error, {Cldr.AcceptLanguageError, String.t}}

If at least one valid language tag is found but errors are also detected on one more more tags, an {ok, list} tuple is returned wuth an error tuple for each invalid tag added at the end of the list.

Example

iex> Cldr.AcceptLanguage.parse "da,zh-TW;q=0.3"
{:ok,
  [{1.0,
    %Cldr.LanguageTag{canonical_locale_name: "da-Latn-DK",
     cldr_locale_name: "da", extensions: %{}, language: "da",
     locale: %{}, private_use: [], rbnf_locale_name: "da",
     territory: "DK", requested_locale_name: "da", script: "Latn",
     transform: %{}, variant: nil}},
   {0.3,
    %Cldr.LanguageTag{canonical_locale_name: "zh-Hant-TW",
     cldr_locale_name: "zh-Hant", extensions: %{}, language: "zh",
     locale: %{}, private_use: [], rbnf_locale_name: "zh-Hant",
     territory: "TW", requested_locale_name: "zh-TW", script: "Hant",
     transform: %{}, variant: nil}}]}


iex> Cldr.AcceptLanguage.parse "X"
{:error,
 {Cldr.AcceptLanguageError,
  "Could not parse language tag.  Error was detected at 'x'"}}

iex> Cldr.AcceptLanguage.parse "da,zh-TW;q=0.3,X"
{:ok,
  [{1.0,
    %Cldr.LanguageTag{canonical_locale_name: "da-Latn-DK",
     cldr_locale_name: "da", extensions: %{}, language: "da",
     locale: %{}, private_use: [], rbnf_locale_name: "da",
     territory: "DK", requested_locale_name: "da", script: "Latn",
     transform: %{}, variant: nil}},
   {0.3,
    %Cldr.LanguageTag{canonical_locale_name: "zh-Hant-TW",
     cldr_locale_name: "zh-Hant", extensions: %{}, language: "zh",
     locale: %{}, private_use: [], rbnf_locale_name: "zh-Hant",
     territory: "TW", requested_locale_name: "zh-TW", script: "Hant",
     transform: %{}, variant: nil}},
   {:error,
    {Cldr.InvalidLanguageTag,
     "Could not parse language tag.  Error was detected at 'x'"},
    "x"}]}

Parses an Accept-Language header value in its string or tokenized form to produce a list of tuples of the form [{quality, %Cldr.LanguageTag{}}, ...] sorted by quality in decending order.

  • accept-language is any string in the format defined by rfc2616

Returns:

If at least one valid language tag is found but errors are also detected on one more more tags, an {ok, list} tuple is returned wuth an error tuple for each invalid tag added at the end of the list.

Example

iex> Cldr.AcceptLanguage.parse! "da,zh-TW;q=0.3"
[{1.0,
   %Cldr.LanguageTag{canonical_locale_name: "da-Latn-DK",
    cldr_locale_name: "da", extensions: %{}, language: "da",
    locale: %{}, private_use: [], rbnf_locale_name: "da", territory: "DK",
    requested_locale_name: "da", script: "Latn", transform: %{},
    variant: nil}},
  {0.3,
   %Cldr.LanguageTag{canonical_locale_name: "zh-Hant-TW",
    cldr_locale_name: "zh-Hant", extensions: %{}, language: "zh",
    locale: %{}, private_use: [], rbnf_locale_name: "zh-Hant",
    territory: "TW", requested_locale_name: "zh-TW", script: "Hant",
    transform: %{}, variant: nil}}]


Cldr.AcceptLanguage.parse! "X"
** (Cldr.AcceptLanguageError) Could not parse language tag.  Error was detected at 'x'
    (ex_cldr) lib/cldr/accept_language.ex:168: Cldr.AcceptLanguage.parse!/1

iex> Cldr.AcceptLanguage.parse! "da,zh-TW;q=0.3,X"
[{1.0,
   %Cldr.LanguageTag{canonical_locale_name: "da-Latn-DK",
    cldr_locale_name: "da", extensions: %{}, language: "da",
    locale: %{}, private_use: [], rbnf_locale_name: "da", territory: "DK",
    requested_locale_name: "da", script: "Latn", transform: %{},
    variant: nil}},
  {0.3,
   %Cldr.LanguageTag{canonical_locale_name: "zh-Hant-TW",
    cldr_locale_name: "zh-Hant", extensions: %{}, language: "zh",
    locale: %{}, private_use: [], rbnf_locale_name: "zh-Hant",
    territory: "TW", requested_locale_name: "zh-TW", script: "Hant",
    transform: %{}, variant: nil}},
  {:error,
   {Cldr.InvalidLanguageTag,
    "Could not parse language tag.  Error was detected at 'x'"}, "x"}]
Link to this function tokenize(accept_language) View Source
tokenize(String.t()) :: [{float(), String.t()}, ...]

Splits the language ranges for an Accept-Language header value into tuples {quality, language}.

  • accept-language is any string in the format defined by rfc2616

Example

iex> Cldr.AcceptLanguage.tokenize "da,zh-TW;q=0.3"
[{1.0, "da"}, {0.3, "zh-tw"}]