Cldr v0.12.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

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: %{},
    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'"}
}

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"}]

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.

If not valid language tags are found, the tuple {:error, reason} is returned.

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.

If no valid language tags are found, an exception is raised.

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

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

Example

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