From e97d2fbe6d93d607a0eba414fb5e71760dcfe322 Mon Sep 17 00:00:00 2001
From: zoldar
See
- Similar to Example: Similar to Example:insert_all/2
but with the following differences:Repo.query!("create table ecto_ch_demo(a UInt64, b String) engine Null")
+
insert_all/2
but with the following differences:
+{100_000, nil} = Repo.insert_stream("ecto_ch_demo", rows, types: [a: Ch.Types.u64(), b: :string])Repo.query!("create table ecto_ch_demo(a UInt64, b String) engine Null")
-defmodule Demo do
+defmodule Demo do
use Ecto.Schema
@primary_key false
- schema "ecto_ch_demo" do
+ schema "ecto_ch_demo" do
field :a, Ch, type: "UInt64"
field :b, :string
- end
-end
+ end
+end
-rows = Stream.map(1..100_000, fn i -> %{a: i, b: to_string(i)} end)
-{100_000, nil} = Repo.insert_stream(Demo, rows)
+rows = Stream.map(1..100_000, fn i -> %{a: i, b: to_string(i)} end)
+{100_000, nil} = Repo.insert_stream(Demo, rows)
# schemaless
-{100_000, nil} = Repo.insert_stream("ecto_ch_demo", rows, types: [a: Ch.Types.u64(), b: :string])
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 + 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."
@@ -261,54 +261,54 @@ a configuredExamples
-iex> Plausible.Cldr.AcceptLanguage.best_match("da;q=0.1,zh-TW;q=0.3", TestBackend.Cldr)
-{:ok,
- %Cldr.LanguageTag{
+iex> Plausible.Cldr.AcceptLanguage.best_match("da;q=0.1,zh-TW;q=0.3", TestBackend.Cldr)
+{:ok,
+ %Cldr.LanguageTag{
backend: TestBackend.Cldr,
canonical_locale_name: "zh-TW",
cldr_locale_name: :"zh-Hant",
- language_subtags: [],
- extensions: %{},
+ language_subtags: [],
+ extensions: %{},
gettext_locale_name: nil,
language: "zh",
- locale: %{},
- private_use: [],
+ locale: %{},
+ private_use: [],
rbnf_locale_name: :"zh-Hant",
requested_locale_name: "zh-TW",
script: :Hant,
territory: :TW,
- transform: %{},
- language_variants: []
- }}
+ transform: %{},
+ language_variants: []
+ }}
-iex> Plausible.Cldr.AcceptLanguage.best_match("da;q=0.1,zh-TW;q=0.3", TestBackend.Cldr)
-{:ok,
- %Cldr.LanguageTag{
+iex> Plausible.Cldr.AcceptLanguage.best_match("da;q=0.1,zh-TW;q=0.3", TestBackend.Cldr)
+{:ok,
+ %Cldr.LanguageTag{
backend: TestBackend.Cldr,
canonical_locale_name: "zh-TW",
cldr_locale_name: :"zh-Hant",
- language_subtags: [],
- extensions: %{},
+ language_subtags: [],
+ extensions: %{},
gettext_locale_name: nil,
language: "zh",
- locale: %{},
- private_use: [],
+ locale: %{},
+ private_use: [],
rbnf_locale_name: :"zh-Hant",
requested_locale_name: "zh-TW",
script: :Hant,
territory: :TW,
- transform: %{},
- language_variants: []
- }}
+ transform: %{},
+ language_variants: []
+ }}
-iex> Plausible.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> Plausible.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> Plausible.Cldr.AcceptLanguage.best_match("invalid_tag")
-{:error, {Cldr.LanguageTag.ParseError,
- "Expected a BCP47 language tag. Could not parse the remaining \"g\" starting at position 11"}}
+iex> Plausible.Cldr.AcceptLanguage.best_match("invalid_tag")
+{:error, {Cldr.LanguageTag.ParseError,
+ "Expected a BCP47 language tag. Could not parse the remaining \"g\" starting at position 11"}}
@@ -369,95 +369,95 @@ with 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", TestBackend.Cldr)
-{:ok,
- [
- {1.0,
- %Cldr.LanguageTag{
+iex> Cldr.AcceptLanguage.parse("da,zh-TW;q=0.3", TestBackend.Cldr)
+{:ok,
+ [
+ {1.0,
+ %Cldr.LanguageTag{
backend: TestBackend.Cldr,
canonical_locale_name: "da",
cldr_locale_name: :da,
- language_subtags: [],
- extensions: %{},
+ language_subtags: [],
+ extensions: %{},
gettext_locale_name: nil,
language: "da",
- locale: %{},
- private_use: [],
+ locale: %{},
+ private_use: [],
rbnf_locale_name: :da,
requested_locale_name: "da",
script: :Latn,
territory: :DK,
- transform: %{},
- language_variants: []
- }},
- {0.3,
- %Cldr.LanguageTag{
+ transform: %{},
+ language_variants: []
+ }},
+ {0.3,
+ %Cldr.LanguageTag{
backend: TestBackend.Cldr,
canonical_locale_name: "zh-TW",
cldr_locale_name: :"zh-Hant",
- language_subtags: [],
- extensions: %{},
+ language_subtags: [],
+ extensions: %{},
gettext_locale_name: nil,
language: "zh",
- locale: %{},
- private_use: [],
+ locale: %{},
+ private_use: [],
rbnf_locale_name: :"zh-Hant",
requested_locale_name: "zh-TW",
script: :Hant,
territory: :TW,
- transform: %{},
- language_variants: []
- }}
- ]}
+ transform: %{},
+ language_variants: []
+ }}
+ ]}
-iex> Plausible.Cldr.AcceptLanguage.parse("invalid_tag")
-{:error,
- {Cldr.LanguageTag.ParseError,
- "Expected a BCP47 language tag. Could not parse the remaining \"g\" starting at position 11"}}
+iex> Plausible.Cldr.AcceptLanguage.parse("invalid_tag")
+{:error,
+ {Cldr.LanguageTag.ParseError,
+ "Expected a BCP47 language tag. Could not parse the remaining \"g\" starting at position 11"}}
-iex> Plausible.Cldr.AcceptLanguage.parse("da,zh-TW;q=0.3,invalid_tag")
-{:ok,
- [
- {1.0,
- %Cldr.LanguageTag{
+iex> Plausible.Cldr.AcceptLanguage.parse("da,zh-TW;q=0.3,invalid_tag")
+{:ok,
+ [
+ {1.0,
+ %Cldr.LanguageTag{
backend: TestBackend.Cldr,
canonical_locale_name: "da",
cldr_locale_name: :da,
- language_subtags: [],
- extensions: %{},
+ language_subtags: [],
+ extensions: %{},
gettext_locale_name: nil,
language: "da",
- locale: %{},
- private_use: [],
+ locale: %{},
+ private_use: [],
rbnf_locale_name: :da,
requested_locale_name: "da",
script: :Latn,
territory: :DK,
- transform: %{},
- language_variants: []
- }},
- {0.3,
- %Cldr.LanguageTag{
+ transform: %{},
+ language_variants: []
+ }},
+ {0.3,
+ %Cldr.LanguageTag{
backend: TestBackend.Cldr,
canonical_locale_name: "zh-TW",
cldr_locale_name: :"zh-Hant",
- language_subtags: [],
- extensions: %{},
+ language_subtags: [],
+ extensions: %{},
gettext_locale_name: nil,
language: "zh",
- locale: %{},
- private_use: [],
+ locale: %{},
+ private_use: [],
rbnf_locale_name: :"zh-Hant",
requested_locale_name: "zh-TW",
script: :Hant,
territory: :TW,
- transform: %{},
- language_variants: []
- }},
- {:error,
- {Cldr.LanguageTag.ParseError,
- "Expected a BCP47 language tag. Could not parse the remaining \"g\" starting at position 11"}}
- ]}
+ transform: %{},
+ language_variants: []
+ }},
+ {:error,
+ {Cldr.LanguageTag.ParseError,
+ "Expected a BCP47 language tag. Could not parse the remaining \"g\" starting at position 11"}}
+ ]}
@@ -502,92 +502,92 @@ with an error tuple for each invalid tag added at the end of the list.
Example
-iex> Plausible.Cldr.AcceptLanguage.parse!("da,zh-TW;q=0.3")
-[
- {1.0,
- %Cldr.LanguageTag{
+iex> Plausible.Cldr.AcceptLanguage.parse!("da,zh-TW;q=0.3")
+[
+ {1.0,
+ %Cldr.LanguageTag{
backend: TestBackend.Cldr,
canonical_locale_name: "da",
cldr_locale_name: :da,
- language_subtags: [],
- extensions: %{},
+ language_subtags: [],
+ extensions: %{},
gettext_locale_name: nil,
language: "da",
- locale: %{},
- private_use: [],
+ locale: %{},
+ private_use: [],
rbnf_locale_name: :da,
requested_locale_name: "da",
script: :Latn,
territory: :DK,
- transform: %{},
- language_variants: []
- }},
- {0.3,
- %Cldr.LanguageTag{
+ transform: %{},
+ language_variants: []
+ }},
+ {0.3,
+ %Cldr.LanguageTag{
backend: TestBackend.Cldr,
canonical_locale_name: "zh-TW",
cldr_locale_name: :"zh-Hant",
- language_subtags: [],
- extensions: %{},
+ language_subtags: [],
+ extensions: %{},
gettext_locale_name: nil,
language: "zh",
- locale: %{},
- private_use: [],
+ locale: %{},
+ private_use: [],
rbnf_locale_name: :"zh-Hant",
requested_locale_name: "zh-TW",
script: :Hant,
territory: :TW,
- transform: %{},
- language_variants: []
- }}
-]
+ transform: %{},
+ language_variants: []
+ }}
+]
Plausible.Cldr.AcceptLanguage.parse! "invalid_tag"
** (Cldr.AcceptLanguageError) "Expected a BCP47 language tag. Could not parse the remaining "g" starting at position 11
(ex_cldr) lib/cldr/accept_language.ex:304: Cldr.AcceptLanguage.parse!/1
-iex> Plausible.Cldr.AcceptLanguage.parse!("da,zh-TW;q=0.3,invalid_tag")
-[
- {1.0,
- %Cldr.LanguageTag{
+iex> Plausible.Cldr.AcceptLanguage.parse!("da,zh-TW;q=0.3,invalid_tag")
+[
+ {1.0,
+ %Cldr.LanguageTag{
backend: TestBackend.Cldr,
canonical_locale_name: "da",
cldr_locale_name: :da,
- language_subtags: [],
- extensions: %{},
+ language_subtags: [],
+ extensions: %{},
gettext_locale_name: nil,
language: "da",
- locale: %{},
- private_use: [],
+ locale: %{},
+ private_use: [],
rbnf_locale_name: :da,
requested_locale_name: "da",
script: :Latn,
territory: :DK,
- transform: %{},
- language_variants: []
- }},
- {0.3,
- %Cldr.LanguageTag{
+ transform: %{},
+ language_variants: []
+ }},
+ {0.3,
+ %Cldr.LanguageTag{
backend: TestBackend.Cldr,
canonical_locale_name: "zh-TW",
cldr_locale_name: :"zh-Hant",
- language_subtags: [],
- extensions: %{},
+ language_subtags: [],
+ extensions: %{},
gettext_locale_name: nil,
language: "zh",
- locale: %{},
- private_use: [],
+ locale: %{},
+ private_use: [],
rbnf_locale_name: :"zh-Hant",
requested_locale_name: "zh-TW",
script: :Hant,
territory: :TW,
- transform: %{},
- language_variants: []
- }},
- {:error,
- {Cldr.LanguageTag.ParseError,
- "Expected a BCP47 language tag. Could not parse the remaining \"g\" starting at position 11"}}
-]
+ transform: %{},
+ language_variants: []
+ }},
+ {:error,
+ {Cldr.LanguageTag.ParseError,
+ "Expected a BCP47 language tag. Could not parse the remaining \"g\" starting at position 11"}}
+]
diff --git a/Plausible.Cldr.Currency.html b/Plausible.Cldr.Currency.html
index 2e2081cb1..f41a0e102 100644
--- a/Plausible.Cldr.Currency.html
+++ b/Plausible.Cldr.Currency.html
@@ -419,11 +419,11 @@ The default is :all
. See FJD: %Cldr.Currency{
+ %{ FJD: %Cldr.Currency{
cash_digits: 2,
cash_rounding: 0,
code: "FJD",
- count: %{one: "Fijian dollar", other: "Fijian dollars"},
+ count: %{one: "Fijian dollar", other: "Fijian dollars"},
digits: 2,
from: nil,
iso_digits: 2,
@@ -433,12 +433,12 @@ The default is :all
. See symbol: "FJD",
tender: true,
to: nil
- },
- SUR: %Cldr.Currency{
+ },
+ SUR: %Cldr.Currency{
cash_digits: 2,
cash_rounding: 0,
code: "SUR",
- count: %{one: "Soviet rouble", other: "Soviet roubles"},
+ count: %{one: "Soviet rouble", other: "Soviet roubles"},
digits: 2,
from: nil,
iso_digits: nil,
@@ -448,7 +448,7 @@ The default is :all
. See symbol: "SUR",
tender: true,
to: nil
- },
+ },
...
}}
@@ -499,11 +499,11 @@ The default is :all
. See Example
MyApp.Cldr.Currency.currencies_for_locale!("en")
- => %{
FJD: %Cldr.Currency{
+ => %{FJD: %Cldr.Currency{
cash_digits: 2,
cash_rounding: 0,
code: "FJD",
- count: %{one: "Fijian dollar", other: "Fijian dollars"},
+ count: %{one: "Fijian dollar", other: "Fijian dollars"},
digits: 2,
from: nil,
iso_digits: 2,
@@ -513,12 +513,12 @@ The default is :all
. See symbol: "FJD",
tender: true,
to: nil
-},
-SUR: %Cldr.Currency{
+},
+SUR: %Cldr.Currency{
cash_digits: 2,
cash_rounding: 0,
code: "SUR",
- count: %{one: "Soviet rouble", other: "Soviet roubles"},
+ count: %{one: "Soviet rouble", other: "Soviet roubles"},
digits: 2,
from: nil,
iso_digits: nil,
@@ -528,7 +528,7 @@ The default is :all
. See symbol: "SUR",
tender: true,
to: nil
-},
+},
...
}
@@ -586,13 +586,13 @@ or a
Examples
-iex> Plausible.Cldr.Currency.currency_for_code("AUD")
-{:ok,
- %Cldr.Currency{
+iex> Plausible.Cldr.Currency.currency_for_code("AUD")
+{:ok,
+ %Cldr.Currency{
cash_digits: 2,
cash_rounding: 0,
code: "AUD",
- count: %{one: "Australian dollar", other: "Australian dollars"},
+ count: %{one: "Australian dollar", other: "Australian dollars"},
digits: 2,
iso_digits: 2,
name: "Australian Dollar",
@@ -600,15 +600,15 @@ or a rounding: 0,
symbol: "A$",
tender: true
-}}
+}}
-iex> Plausible.Cldr.Currency.currency_for_code("THB")
-{:ok,
- %Cldr.Currency{
+iex> Plausible.Cldr.Currency.currency_for_code("THB")
+{:ok,
+ %Cldr.Currency{
cash_digits: 2,
cash_rounding: 0,
code: "THB",
- count: %{one: "Thai baht", other: "Thai baht"},
+ count: %{one: "Thai baht", other: "Thai baht"},
digits: 2,
iso_digits: 2,
name: "Thai Baht",
@@ -616,7 +616,7 @@ or a rounding: 0,
symbol: "THB",
tender: true
-}}
+}}
@@ -675,12 +675,12 @@ or a
Examples
-iex> Plausible.Cldr.Currency.currency_for_code!("AUD")
-%Cldr.Currency{
+iex> Plausible.Cldr.Currency.currency_for_code!("AUD")
+%Cldr.Currency{
cash_digits: 2,
cash_rounding: 0,
code: "AUD",
- count: %{one: "Australian dollar", other: "Australian dollars"},
+ count: %{one: "Australian dollar", other: "Australian dollars"},
digits: 2,
iso_digits: 2,
name: "Australian Dollar",
@@ -688,14 +688,14 @@ or a rounding: 0,
symbol: "A$",
tender: true
-}
+}
-iex> Plausible.Cldr.Currency.currency_for_code!("THB")
-%Cldr.Currency{
+iex> Plausible.Cldr.Currency.currency_for_code!("THB")
+%Cldr.Currency{
cash_digits: 2,
cash_rounding: 0,
code: "THB",
- count: %{one: "Thai baht", other: "Thai baht"},
+ count: %{one: "Thai baht", other: "Thai baht"},
digits: 2,
iso_digits: 2,
name: "Thai Baht",
@@ -703,7 +703,7 @@ or a rounding: 0,
symbol: "THB",
tender: true
-}
+}
@@ -744,15 +744,15 @@ or a
Examples
-iex> {:ok, locale} = Plausible.Cldr.validate_locale("en")
+iex> {:ok, locale} = Plausible.Cldr.validate_locale("en")
iex> Plausible.Cldr.Currency.currency_from_locale locale
:USD
-iex> {:ok, locale} = Plausible.Cldr.validate_locale("en-AU")
+iex> {:ok, locale} = Plausible.Cldr.validate_locale("en-AU")
iex> Plausible.Cldr.Currency.currency_from_locale locale
:AUD
-iex> Plausible.Cldr.Currency.currency_from_locale("en-GB")
+iex> Plausible.Cldr.Currency.currency_from_locale("en-GB")
:GBP
@@ -796,14 +796,14 @@ or a
Example
-iex> MyApp.Cldr.Currency.currency_history_for_locale("en")
-{:ok,
- %{
- USD: %{from: ~D[1792-01-01], to: nil},
- USN: %{tender: false},
- USS: %{from: nil, tender: false, to: ~D[2014-03-01]}
- }
-}
+iex> MyApp.Cldr.Currency.currency_history_for_locale("en")
+{:ok,
+ %{
+ USD: %{from: ~D[1792-01-01], to: nil},
+ USN: %{tender: false},
+ USS: %{from: nil, tender: false, to: ~D[2014-03-01]}
+ }
+}
@@ -862,9 +862,9 @@ The default is :all
. See Example
-MyApp.Cldr.Currency.currency_strings("en")
-=> {:ok,
- %{
+MyApp.Cldr.Currency.currency_strings("en")
+=> {:ok,
+ %{
"mexican silver pesos" => :MXP,
"sudanese dinar" => :SDD,
"bad" => :BAD,
@@ -874,7 +874,7 @@ The default is :all
. See "guyanaese dollars" => :GYD,
"equatorial guinean ekwele" => :GQE,
...
- }}
+ }}
@@ -933,8 +933,8 @@ The default is :all
. See Example
-MyApp.Cldr.Currency.currency_strings!("en")
-=> %{
+MyApp.Cldr.Currency.currency_strings!("en")
+=> %{
"mexican silver pesos" => :MXP,
"sudanese dinar" => :SDD,
"bad" => :BAD,
@@ -944,7 +944,7 @@ The default is :all
. See "guyanaese dollars" => :GYD,
"equatorial guinean ekwele" => :GQE,
...
- }
+ }
@@ -982,10 +982,10 @@ or a
Example
-iex> MyApp.Cldr.Currency.current_currency_from_locale("en")
+iex> MyApp.Cldr.Currency.current_currency_from_locale("en")
:USD
-iex> MyApp.Cldr.Currency.current_currency_from_locale("en-AU")
+iex> MyApp.Cldr.Currency.current_currency_from_locale("en-AU")
:AUD
@@ -1033,7 +1033,7 @@ mapping is returned for that territory.Example
-iex> Plausible.Cldr.Currency.current_territory_currencies()
+iex> Plausible.Cldr.Currency.current_territory_currencies()
@@ -1125,11 +1125,11 @@ currency codeExamples
-iex> Plausible.Cldr.Currency.known_currency_code("AUD")
-{:ok, :AUD}
+iex> Plausible.Cldr.Currency.known_currency_code("AUD")
+{:ok, :AUD}
-iex> Plausible.Cldr.Currency.known_currency_code("GGG")
-{:error, {Cldr.UnknownCurrencyError, "The currency \"GGG\" is invalid"}}
+iex> Plausible.Cldr.Currency.known_currency_code("GGG")
+{:error, {Cldr.UnknownCurrencyError, "The currency \"GGG\" is invalid"}}
@@ -1176,13 +1176,13 @@ currency codeExamples
-iex> Plausible.Cldr.Currency.known_currency_code?("AUD")
+iex> Plausible.Cldr.Currency.known_currency_code?("AUD")
true
-iex> Plausible.Cldr.Currency.known_currency_code?("GGG")
+iex> Plausible.Cldr.Currency.known_currency_code?("GGG")
false
-iex> Plausible.Cldr.Currency.known_currency_code?(:XCV)
+iex> Plausible.Cldr.Currency.known_currency_code?(:XCV)
false
@@ -1217,7 +1217,7 @@ currency codeExample
-iex> Plausible.Cldr.Currency.known_currency_codes()
+iex> Plausible.Cldr.Currency.known_currency_codes()
@@ -1276,14 +1276,14 @@ such as 0.05
. Optional.Example
-iex> Plausible.Cldr.Currency.new(:XAE, name: "Custom Name", digits: 0)
-{:ok,
- %Cldr.Currency{
+iex> Plausible.Cldr.Currency.new(:XAE, name: "Custom Name", digits: 0)
+{:ok,
+ %Cldr.Currency{
alt_code: :XAE,
cash_digits: 0,
cash_rounding: nil,
code: :XAE,
- count: %{other: "Custom Name"},
+ count: %{other: "Custom Name"},
digits: 0,
from: nil,
iso_digits: 0,
@@ -1293,11 +1293,11 @@ such as 0.05
. Optional.symbol
: "XAE",
tender: false,
to: nil
- }}
-iex> MyApp.Cldr.Currency.new(:XAH, name: "Custom Name")
-{:error, "Required options are missing. Required options are [:name, :digits]"}
-iex> Plausible.Cldr.Currency.new(:XAE, name: "XAE", digits: 0)
-{:error, {Cldr.CurrencyAlreadyDefined, "Currency :XAE is already defined."}}
+ }}
+iex> MyApp.Cldr.Currency.new(:XAH, name: "Custom Name")
+{:error, "Required options are missing. Required options are [:name, :digits]"}
+iex> Plausible.Cldr.Currency.new(:XAE, name: "XAE", digits: 0)
+{:error, {Cldr.CurrencyAlreadyDefined, "Currency :XAE is already defined."}}
@@ -1355,20 +1355,20 @@ default is Plaus
Examples
-iex> Plausible.Cldr.Currency.pluralize(1, :USD)
-{:ok, "US dollar"}
+iex> Plausible.Cldr.Currency.pluralize(1, :USD)
+{:ok, "US dollar"}
-iex> Plausible.Cldr.Currency.pluralize(3, :USD)
-{:ok, "US dollars"}
+iex> Plausible.Cldr.Currency.pluralize(3, :USD)
+{:ok, "US dollars"}
-iex> Plausible.Cldr.Currency.pluralize(12, :USD, locale: "zh")
-{:ok, "美元"}
+iex> Plausible.Cldr.Currency.pluralize(12, :USD, locale: "zh")
+{:ok, "美元"}
-iex> Plausible.Cldr.Currency.pluralize(12, :USD, locale: "fr")
-{:ok, "dollars des États-Unis"}
+iex> Plausible.Cldr.Currency.pluralize(12, :USD, locale: "fr")
+{:ok, "dollars des États-Unis"}
-iex> Plausible.Cldr.Currency.pluralize(1, :USD, locale: "fr")
-{:ok, "dollar des États-Unis"}
+iex> Plausible.Cldr.Currency.pluralize(1, :USD, locale: "fr")
+{:ok, "dollar des États-Unis"}
@@ -1410,8 +1410,8 @@ or a
Example
-iex> MyApp.Cldr.Currency.strings_for_currency :AUD,("en")
-["a$", "australian dollars", "aud", "australian dollar"]
+iex> MyApp.Cldr.Currency.strings_for_currency :AUD,("en")
+["a$", "australian dollars", "aud", "australian dollar"]
diff --git a/Plausible.Cldr.Locale.html b/Plausible.Cldr.Locale.html
index 92f0ee142..9669c28db 100644
--- a/Plausible.Cldr.Locale.html
+++ b/Plausible.Cldr.Locale.html
@@ -326,16 +326,16 @@ this specific locale..Examples
-iex> Plausible.Cldr.Locale.fallback_locale_names(:"fr-CA")
-{:ok, [:"fr-CA", :fr, :und]}
+iex> Plausible.Cldr.Locale.fallback_locale_names(:"fr-CA")
+{:ok, [:"fr-CA", :fr, :und]}
# Fallbacks are typically formed by progressively
# stripping variant, territory and script from the
# given locale name. But not always - there are
# certain fallbacks that take a different path.
-iex> Plausible.Cldr.Locale.fallback_locale_names(:nb)
-{:ok, [:nb, :no, :und]}
+iex> Plausible.Cldr.Locale.fallback_locale_names(:nb)
+{:ok, [:nb, :no, :und]}
@@ -389,20 +389,20 @@ this specific locale.Examples
-Plausible.Cldr.Locale.fallback_locales(:"fr-CA")
-=> {:ok,
- [#Cldr.LanguageTag<fr-CA [validated]>, #Cldr.LanguageTag<fr [validated]>,
- #Cldr.LanguageTag<und [validated]>]}
+Plausible.Cldr.Locale.fallback_locales(:"fr-CA")
+=> {:ok,
+ [#Cldr.LanguageTag<fr-CA [validated]>, #Cldr.LanguageTag<fr [validated]>,
+ #Cldr.LanguageTag<und [validated]>]}
# Fallbacks are typically formed by progressively
# stripping variant, territory and script from the
# given locale name. But not always - there are
# certain fallbacks that take a different path.
-Plausible.Cldr.Locale.fallback_locales(:nb))
-=> {:ok,
- [#Cldr.LanguageTag<nb [validated]>, #Cldr.LanguageTag<no [validated]>,
- #Cldr.LanguageTag<und [validated]>]}
+Plausible.Cldr.Locale.fallback_locales(:nb))
+=> {:ok,
+ [#Cldr.LanguageTag<nb [validated]>, #Cldr.LanguageTag<no [validated]>,
+ #Cldr.LanguageTag<und [validated]>]}
@@ -533,15 +533,15 @@ generic top-level domain names.Examples
iex> Plausible.Cldr.Locale.locale_from_host "a.b.com.au"
-Elixir.Plausible.Cldr.validate_locale(:"en-AU")
+Elixir.Plausible.Cldr.validate_locale(:"en-AU")
-iex> Plausible.Cldr.Locale.locale_from_host("a.b.com.tv")
-{:error,
- {Cldr.UnknownLocaleError, "No locale was identified for territory \"tv\""}}
+iex> Plausible.Cldr.Locale.locale_from_host("a.b.com.tv")
+{:error,
+ {Cldr.UnknownLocaleError, "No locale was identified for territory \"tv\""}}
-iex> Plausible.Cldr.Locale.locale_from_host("a.b.com")
-{:error,
- {Cldr.UnknownLocaleError, "No locale was identified for territory \"com\""}}
+iex> Plausible.Cldr.Locale.locale_from_host("a.b.com")
+{:error,
+ {Cldr.UnknownLocaleError, "No locale was identified for territory \"com\""}}
@@ -683,12 +683,12 @@ be a territory.Examples
-iex> Cldr.Locale.territory_from_host("a.b.com.au")
-{:ok, :AU}
+iex> Cldr.Locale.territory_from_host("a.b.com.au")
+{:ok, :AU}
-iex> Cldr.Locale.territory_from_host("a.b.com")
-{:error,
- {Cldr.UnknownLocaleError, "No locale was identified for territory \"com\""}}
+iex> Cldr.Locale.territory_from_host("a.b.com")
+{:error,
+ {Cldr.UnknownLocaleError, "No locale was identified for territory \"com\""}}
diff --git a/Plausible.Cldr.Number.Cardinal.html b/Plausible.Cldr.Number.Cardinal.html
index 01fecb6c4..67d6cb00d 100644
--- a/Plausible.Cldr.Number.Cardinal.html
+++ b/Plausible.Cldr.Number.Cardinal.html
@@ -461,31 +461,31 @@ The valid substitution keys are :zero
, Examples
-iex> Plausible.Cldr.Number.Cardinal.pluralize 1, "en", %{one: "one"}
+iex> Plausible.Cldr.Number.Cardinal.pluralize 1, "en", %{one: "one"}
"one"
-iex> Plausible.Cldr.Number.Cardinal.pluralize 2, "en", %{one: "one"}
+iex> Plausible.Cldr.Number.Cardinal.pluralize 2, "en", %{one: "one"}
nil
-iex> Plausible.Cldr.Number.Cardinal.pluralize 2, "en", %{one: "one", two: "two", other: "other"}
+iex> Plausible.Cldr.Number.Cardinal.pluralize 2, "en", %{one: "one", two: "two", other: "other"}
"other"
-iex> Plausible.Cldr.Number.Cardinal.pluralize 22, "en", %{one: "one", two: "two", other: "other"}
+iex> Plausible.Cldr.Number.Cardinal.pluralize 22, "en", %{one: "one", two: "two", other: "other"}
"other"
-iex> Plausible.Cldr.Number.Cardinal.pluralize Decimal.new(1), "en", %{one: "one"}
+iex> Plausible.Cldr.Number.Cardinal.pluralize Decimal.new(1), "en", %{one: "one"}
"one"
-iex> Plausible.Cldr.Number.Cardinal.pluralize Decimal.new(2), "en", %{one: "one"}
+iex> Plausible.Cldr.Number.Cardinal.pluralize Decimal.new(2), "en", %{one: "one"}
nil
-iex> Plausible.Cldr.Number.Cardinal.pluralize Decimal.new(2), "en", %{one: "one", two: "two"}
+iex> Plausible.Cldr.Number.Cardinal.pluralize Decimal.new(2), "en", %{one: "one", two: "two"}
nil
-iex> Plausible.Cldr.Number.Cardinal.pluralize 1..10, "ar", %{one: "one", few: "few", other: "other"}
+iex> Plausible.Cldr.Number.Cardinal.pluralize 1..10, "ar", %{one: "one", few: "few", other: "other"}
"few"
-iex> Plausible.Cldr.Number.Cardinal.pluralize 1..10, "en", %{one: "one", few: "few", other: "other"}
+iex> Plausible.Cldr.Number.Cardinal.pluralize 1..10, "en", %{one: "one", few: "few", other: "other"}
"other"
diff --git a/Plausible.Cldr.Number.Format.html b/Plausible.Cldr.Number.Format.html
index 0d4e83186..32806daa7 100644
--- a/Plausible.Cldr.Number.Format.html
+++ b/Plausible.Cldr.Number.Format.html
@@ -465,7 +465,7 @@ to precompile all the known formats at compile time.Example
#=> Plausible.Cldr.Number.Format.Format.decimal_format_list
-["#", "#,##,##0%",
+["#", "#,##,##0%",
"#,##,##0.###", "#,##,##0.00¤", "#,##,##0.00¤;(#,##,##0.00¤)",
"#,##,##0 %", "#,##0%", "#,##0.###", "#,##0.00 ¤",
"#,##0.00 ¤;(#,##0.00 ¤)", "#,##0.00¤", "#,##0.00¤;(#,##0.00¤)",
@@ -475,7 +475,7 @@ to precompile all the known formats at compile time."000 B ¤"
, "000 E ¤", "000 K ¤", "000 MRD ¤", "000 Md ¤", "000 Mio'.' ¤",
"000 Mio ¤", "000 Mld ¤", "000 Mln ¤", "000 Mn ¤", "000 Mrd'.' ¤",
"000 Mrd ¤", "000 Mr ¤", "000 M ¤", "000 NT ¤", "000 N ¤", "000 Tn ¤",
-"000 Tr ¤", ...]
+"000 Tr ¤", ...]
iex> Plausible.Cldr.Number.Format.decimal_format_list_for(:en)
-{:ok, ["#,##0%", "#,##0.###", "#,##0.00", "#,##0.00;(#,##0.00)","#E0",
+iex> Plausible.Cldr.Number.Format.decimal_format_list_for(:en)
+{:ok, ["#,##0%", "#,##0.###", "#,##0.00", "#,##0.00;(#,##0.00)","#E0",
"0 billion", "0 million", "0 thousand",
"0 trillion", "00 billion", "00 million", "00 thousand", "00 trillion",
"000 billion", "000 million", "000 thousand", "000 trillion", "000B", "000K",
@@ -532,7 +532,7 @@ the known formats at compile time. Its use is not otherwise recommended."¤#,##0.00", "¤#,##0.00;(¤#,##0.00)", "¤000B", "¤000K", "¤000M",
"¤000T", "¤00B", "¤00K", "¤00M", "¤00T", "¤0B", "¤0K", "¤0M", "¤0T",
"¤ #,##0.00", "¤ #,##0.00;(¤ #,##0.00)", "¤ 000B", "¤ 000K", "¤ 000M",
- "¤ 000T", "¤ 00B", "¤ 00K", "¤ 00M", "¤ 00T", "¤ 0B", "¤ 0K", "¤ 0M", "¤ 0T"]}
+ "¤ 000T", "¤ 00B", "¤ 00K", "¤ 00M", "¤ 00T", "¤ 0B", "¤ 0K", "¤ 0M", "¤ 0T"]}
Plausible.Cld
Examples
-iex> Plausible.Cldr.Number.Format.default_grouping_for(:en)
-{:ok, %{fraction: %{first: 0, rest: 0}, integer: %{first: 3, rest: 3}}}
+iex> Plausible.Cldr.Number.Format.default_grouping_for(:en)
+{:ok, %{fraction: %{first: 0, rest: 0}, integer: %{first: 3, rest: 3}}}
Plausible.Cld
Examples
-iex> Plausible.Cldr.Number.Format.default_grouping_for!(:en)
-%{fraction: %{first: 0, rest: 0}, integer: %{first: 3, rest: 3}}
+iex> Plausible.Cldr.Number.Format.default_grouping_for!(:en)
+%{fraction: %{first: 0, rest: 0}, integer: %{first: 3, rest: 3}}
percent: "#,##0 %",
scientific: "#E0",
standard: "#,##0.###"
- currency_short: [{"1000", [one: "0 k ¤", other: "0 k ¤"]},
- {"10000", [one: "00 k ¤", other: "00 k ¤"]},
- {"100000", [one: "000 k ¤", other: "000 k ¤"]},
- {"1000000", [one: "0 M ¤", other: "0 M ¤"]},
- {"10000000", [one: "00 M ¤", other: "00 M ¤"]},
- {"100000000", [one: "000 M ¤", other: "000 M ¤"]},
- {"1000000000", [one: "0 Md ¤", other: "0 Md ¤"]},
- {"10000000000", [one: "00 Md ¤", other: "00 Md ¤"]},
- {"100000000000", [one: "000 Md ¤", other: "000 Md ¤"]},
- {"1000000000000", [one: "0 Bn ¤", other: "0 Bn ¤"]},
- {"10000000000000", [one: "00 Bn ¤", other: "00 Bn ¤"]},
- {"100000000000000", [one: "000 Bn ¤", other: "000 Bn ¤"]}],
+ currency_short: [{"1000", [one: "0 k ¤", other: "0 k ¤"]},
+ {"10000", [one: "00 k ¤", other: "00 k ¤"]},
+ {"100000", [one: "000 k ¤", other: "000 k ¤"]},
+ {"1000000", [one: "0 M ¤", other: "0 M ¤"]},
+ {"10000000", [one: "00 M ¤", other: "00 M ¤"]},
+ {"100000000", [one: "000 M ¤", other: "000 M ¤"]},
+ {"1000000000", [one: "0 Md ¤", other: "0 Md ¤"]},
+ {"10000000000", [one: "00 Md ¤", other: "00 Md ¤"]},
+ {"100000000000", [one: "000 Md ¤", other: "000 Md ¤"]},
+ {"1000000000000", [one: "0 Bn ¤", other: "0 Bn ¤"]},
+ {"10000000000000", [one: "00 Bn ¤", other: "00 Bn ¤"]},
+ {"100000000000000", [one: "000 Bn ¤", other: "000 Bn ¤"]}],
...
}
Plausible.Cld
Examples
-iex> Plausible.Cldr.Number.Format.minimum_grouping_digits_for("en")
-{:ok, 1}
+iex> Plausible.Cldr.Number.Format.minimum_grouping_digits_for("en")
+{:ok, 1}
Plausible.Cld
Examples
-iex> Plausible.Cldr.Number.Format.minimum_grouping_digits_for!("en")
+iex> Plausible.Cldr.Number.Format.minimum_grouping_digits_for!("en")
1
:zero
, Examples
-iex> Plausible.Cldr.Number.Ordinal.pluralize 1, :en, %{one: "one"}
+iex> Plausible.Cldr.Number.Ordinal.pluralize 1, :en, %{one: "one"}
"one"
-iex> Plausible.Cldr.Number.Ordinal.pluralize 2, :en, %{one: "one"}
+iex> Plausible.Cldr.Number.Ordinal.pluralize 2, :en, %{one: "one"}
nil
-iex> Plausible.Cldr.Number.Ordinal.pluralize 2, :en, %{one: "one", two: "two"}
+iex> Plausible.Cldr.Number.Ordinal.pluralize 2, :en, %{one: "one", two: "two"}
"two"
-iex> Plausible.Cldr.Number.Ordinal.pluralize 22, :en, %{one: "one", two: "two", other: "other"}
+iex> Plausible.Cldr.Number.Ordinal.pluralize 22, :en, %{one: "one", two: "two", other: "other"}
"two"
-iex> Plausible.Cldr.Number.Ordinal.pluralize Decimal.new(1), :en, %{one: "one"}
+iex> Plausible.Cldr.Number.Ordinal.pluralize Decimal.new(1), :en, %{one: "one"}
"one"
-iex> Plausible.Cldr.Number.Ordinal.pluralize Decimal.new(2), :en, %{one: "one"}
+iex> Plausible.Cldr.Number.Ordinal.pluralize Decimal.new(2), :en, %{one: "one"}
nil
-iex> Plausible.Cldr.Number.Ordinal.pluralize Decimal.new(2), :en, %{one: "one", two: "two"}
+iex> Plausible.Cldr.Number.Ordinal.pluralize Decimal.new(2), :en, %{one: "one", two: "two"}
"two"
-iex> Plausible.Cldr.Number.Ordinal.pluralize 1..10, "ar", %{one: "one", few: "few", other: "other"}
+iex> Plausible.Cldr.Number.Ordinal.pluralize 1..10, "ar", %{one: "one", few: "few", other: "other"}
"other"
-iex> Plausible.Cldr.Number.Ordinal.pluralize 1..10, "en", %{one: "one", few: "few", other: "other"}
+iex> Plausible.Cldr.Number.Ordinal.pluralize 1..10, "en", %{one: "one", few: "few", other: "other"}
"other"
diff --git a/Plausible.Cldr.Number.Symbol.html b/Plausible.Cldr.Number.Symbol.html
index c836da941..d589dccbd 100644
--- a/Plausible.Cldr.Number.Symbol.html
+++ b/Plausible.Cldr.Number.Symbol.html
@@ -378,9 +378,9 @@ is Plausible.Cld
Example:
-iex> Plausible.Cldr.Number.Symbol.number_symbols_for(:th)
-{:ok, %{
- latn: %Cldr.Number.Symbol{
+iex> Plausible.Cldr.Number.Symbol.number_symbols_for(:th)
+{:ok, %{
+ latn: %Cldr.Number.Symbol{
decimal: ".",
exponential: "E",
group: ",",
@@ -393,8 +393,8 @@ is Plausible.Cld
plus_sign: "+",
superscripting_exponent: "×",
time_separator: ":"
- },
- thai: %Cldr.Number.Symbol{
+ },
+ thai: %Cldr.Number.Symbol{
decimal: ".",
exponential: "E",
group: ",",
@@ -407,8 +407,8 @@ is Plausible.Cld
plus_sign: "+",
superscripting_exponent: "×",
time_separator: ":"
- }
- }}
+ }
+ }}
diff --git a/Plausible.Cldr.Number.System.html b/Plausible.Cldr.Number.System.html
index dd86b8c0a..5ee668b7e 100644
--- a/Plausible.Cldr.Number.System.html
+++ b/Plausible.Cldr.Number.System.html
@@ -317,23 +317,23 @@ it is returned as is.Examples
iex> Plausible.Cldr.Number.System.number_system_for "th", :latn
-{:ok, %{digits: "0123456789", type: :numeric}}
+{:ok, %{digits: "0123456789", type: :numeric}}
iex> Plausible.Cldr.Number.System.number_system_for "en", :default
-{:ok, %{digits: "0123456789", type: :numeric}}
+{:ok, %{digits: "0123456789", type: :numeric}}
iex> Plausible.Cldr.Number.System.number_system_for "he", :traditional
-{:ok, %{rules: "hebrew", type: :algorithmic}}
+{:ok, %{rules: "hebrew", type: :algorithmic}}
iex> Plausible.Cldr.Number.System.number_system_for "en", :native
-{:ok, %{digits: "0123456789", type: :numeric}}
+{:ok, %{digits: "0123456789", type: :numeric}}
iex> Plausible.Cldr.Number.System.number_system_for "en", :finance
-{
+{
:error,
- {Cldr.UnknownNumberSystemError,
- "The number system :finance is unknown for the locale named :en. Valid number systems are %{default: :latn, native: :latn}"}
-}
+ {Cldr.UnknownNumberSystemError,
+ "The number system :finance is unknown for the locale named :en. Valid number systems are %{default: :latn, native: :latn}"}
+}
@@ -424,10 +424,10 @@ or a Examples
iex> Plausible.Cldr.Number.System.number_system_names_for "en"
-{:ok, [:latn]}
+{:ok, [:latn]}
iex> Plausible.Cldr.Number.System.number_system_names_for "zz"
-{:error, {Cldr.InvalidLanguageError, "The language \"zz\" is invalid"}}
+{:error, {Cldr.InvalidLanguageError, "The language \"zz\" is invalid"}}
@@ -509,13 +509,13 @@ or a Examples
iex> Plausible.Cldr.Number.System.number_systems_for "en"
-{:ok, %{default: :latn, native: :latn}}
+{:ok, %{default: :latn, native: :latn}}
iex> Plausible.Cldr.Number.System.number_systems_for "th"
-{:ok, %{default: :latn, native: :thai}}
+{:ok, %{default: :latn, native: :thai}}
iex> Plausible.Cldr.Number.System.number_systems_for "zz"
-{:error, {Cldr.InvalidLanguageError, "The language \"zz\" is invalid"}}
+{:error, {Cldr.InvalidLanguageError, "The language \"zz\" is invalid"}}
@@ -614,20 +614,20 @@ actual system name.Examples
-ex> Plausible.Cldr.Number.System.system_name_from(:default, "en")
-{:ok, :latn}
+ex> Plausible.Cldr.Number.System.system_name_from(:default, "en")
+{:ok, :latn}
-iex> Plausible.Cldr.Number.System.system_name_from("latn", "en")
-{:ok, :latn}
+iex> Plausible.Cldr.Number.System.system_name_from("latn", "en")
+{:ok, :latn}
-iex> Plausible.Cldr.Number.System.system_name_from(:native, "en")
-{:ok, :latn}
+iex> Plausible.Cldr.Number.System.system_name_from(:native, "en")
+{:ok, :latn}
-iex> Plausible.Cldr.Number.System.system_name_from(:nope, "en")
-{
+iex> Plausible.Cldr.Number.System.system_name_from(:nope, "en")
+{
:error,
- {Cldr.UnknownNumberSystemError, "The number system :nope is unknown"}
-}
Note that return value is not guaranteed to be a valid
+
{Cldr.UnknownNumberSystemError, "The number system :nope is unknown"}
+}
Note that return value is not guaranteed to be a valid
number system for the given locale as demonstrated in the third example.
@@ -674,16 +674,16 @@ is recommended.Examples
iex> Plausible.Cldr.Number.System.to_system 123456, :hebr
-{:ok, "קכ״ג׳תנ״ו"}
+{:ok, "קכ״ג׳תנ״ו"}
iex> Plausible.Cldr.Number.System.to_system 123, :hans
-{:ok, "一百二十三"}
+{:ok, "一百二十三"}
iex> Plausible.Cldr.Number.System.to_system 123, :hant
-{:ok, "一百二十三"}
+{:ok, "一百二十三"}
iex> Plausible.Cldr.Number.System.to_system 123, :hansfin
-{:ok, "壹佰贰拾叁"}
+{:ok, "壹佰贰拾叁"}
To configure these transliteration pairs, add the to the use Cldr
configuration
-in a backend module:
defmodule MyApp.Cldr do
+in a backend module:defmodule MyApp.Cldr do
use Cldr,
- locale: ["en", "fr", "th"],
+ locale: ["en", "fr", "th"],
default_locale: "en",
- precompile_transliterations: [{:latn, :thai}, {:arab, :thai}]
-end
Where each tuple in the list configures one transliteration map. In this example, two maps are
+
precompile_transliterations: [{:latn, :thai}, {:arab, :thai}]
+end
Where each tuple in the list configures one transliteration map. In this example, two maps are
configured: from :latn
to :thai
and from :arab
to :thai
.
A list of configurable number systems is returned by Cldr.Number.System.numeric_systems/0
.
If a transliteration is requested between two number pairs that have not been configured for precompilation, a warning is logged.
Examples
-iex> Plausible.Cldr.Number.Transliterate.transliterate("123556")
+iex> Plausible.Cldr.Number.Transliterate.transliterate("123556")
"123556"
-iex> Plausible.Cldr.Number.Transliterate.transliterate("123,556.000", "fr", :default)
+iex> Plausible.Cldr.Number.Transliterate.transliterate("123,556.000", "fr", :default)
"123 556,000"
-iex> Plausible.Cldr.Number.Transliterate.transliterate("123556", "th", :default)
+iex> Plausible.Cldr.Number.Transliterate.transliterate("123556", "th", :default)
"123556"
-iex> Plausible.Cldr.Number.Transliterate.transliterate("123556", "th", "thai")
+iex> Plausible.Cldr.Number.Transliterate.transliterate("123556", "th", "thai")
"๑๒๓๕๕๖"
-iex> Plausible.Cldr.Number.Transliterate.transliterate("123556", "th", :native)
+iex> Plausible.Cldr.Number.Transliterate.transliterate("123556", "th", :native)
"๑๒๓๕๕๖"
-iex> Plausible.Cldr.Number.Transliterate.transliterate("Some number is: 123556", "th", "thai")
+iex> Plausible.Cldr.Number.Transliterate.transliterate("Some number is: 123556", "th", "thai")
"Some number is: ๑๒๓๕๕๖"
diff --git a/Plausible.Cldr.Number.html b/Plausible.Cldr.Number.html
index dbcb2bf54..9829a89b9 100644
--- a/Plausible.Cldr.Number.html
+++ b/Plausible.Cldr.Number.html
@@ -441,19 +441,19 @@ using the Elixir standard library functions.
Examples
-iex> Plausible.Cldr.Number.parse("+1.000,34", locale: "de")
-{:ok, 1000.34}
+iex> Plausible.Cldr.Number.parse("+1.000,34", locale: "de")
+{:ok, 1000.34}
-iex> Plausible.Cldr.Number.parse("-1_000_000.34")
-{:ok, -1000000.34}
+iex> Plausible.Cldr.Number.parse("-1_000_000.34")
+{:ok, -1000000.34}
-iex> Plausible.Cldr.Number.parse("1.000", locale: "de", number: :integer)
-{:ok, 1000}
+iex> Plausible.Cldr.Number.parse("1.000", locale: "de", number: :integer)
+{:ok, 1000}
-iex> Plausible.Cldr.Number.parse("+1.000,34", locale: "de", number: :integer)
-{:error,
- {Cldr.Number.ParseError,
- "The string \"+1.000,34\" could not be parsed as a number"}}
+iex> Plausible.Cldr.Number.parse("+1.000,34", locale: "de", number: :integer)
+{:error,
+ {Cldr.Number.ParseError,
+ "The string \"+1.000,34\" could not be parsed as a number"}}
@@ -525,17 +525,17 @@ financial instruments.
Examples
-iex> Plausible.Cldr.Number.scan("100 US dollars")
+iex> Plausible.Cldr.Number.scan("100 US dollars")
...> |> Plausible.Cldr.Number.resolve_currencies
-[100, :USD]
+[100, :USD]
-iex> Plausible.Cldr.Number.scan("100 eurosports")
-...> |> Plausible.Cldr.Number.resolve_currencies(fuzzy: 0.75)
-[100, :EUR]
+iex> Plausible.Cldr.Number.scan("100 eurosports")
+...> |> Plausible.Cldr.Number.resolve_currencies(fuzzy: 0.75)
+[100, :EUR]
-iex> Plausible.Cldr.Number.scan("100 dollars des États-Unis")
-...> |> Plausible.Cldr.Number.resolve_currencies(locale: "fr")
-[100, :USD]
+iex> Plausible.Cldr.Number.scan("100 dollars des États-Unis")
+...> |> Plausible.Cldr.Number.resolve_currencies(locale: "fr")
+[100, :USD]
@@ -612,19 +612,19 @@ financial instruments.Examples
-iex> Plausible.Cldr.Number.resolve_currency("US dollars")
-[:USD]
+iex> Plausible.Cldr.Number.resolve_currency("US dollars")
+[:USD]
-iex> Plausible.Cldr.Number.resolve_currency("100 eurosports", fuzzy: 0.75)
-[:EUR]
+iex> Plausible.Cldr.Number.resolve_currency("100 eurosports", fuzzy: 0.75)
+[:EUR]
-iex> Plausible.Cldr.Number.resolve_currency("dollars des États-Unis", locale: "fr")
-[:USD]
+iex> Plausible.Cldr.Number.resolve_currency("dollars des États-Unis", locale: "fr")
+[:USD]
-iex> Plausible.Cldr.Number.resolve_currency("not a known currency", locale: "fr")
-{:error,
- {Cldr.UnknownCurrencyError,
- "The currency \"not a known currency\" is unknown or not supported"}}
+iex> Plausible.Cldr.Number.resolve_currency("not a known currency", locale: "fr")
+{:error,
+ {Cldr.UnknownCurrencyError,
+ "The currency \"not a known currency\" is unknown or not supported"}}
@@ -688,13 +688,13 @@ The default is options[:backend].get_locale()
Examples
iex> Plausible.Cldr.Number.resolve_per "11%"
-["11", :percent]
+["11", :percent]
iex> Plausible.Cldr.Number.resolve_per "% of linguists"
-[:percent, " of linguists"]
+[:percent, " of linguists"]
iex> Plausible.Cldr.Number.resolve_per "% of linguists %"
-[:percent, " of linguists ", :percent]
+[:percent, " of linguists ", :percent]
@@ -751,9 +751,9 @@ The default is options[:backend].get_locale()
Examples
-iex> Plausible.Cldr.Number.scan("100%")
-...> |> Plausible.Cldr.Number.resolve_pers()
-[100, :percent]
+iex> Plausible.Cldr.Number.scan("100%")
+...> |> Plausible.Cldr.Number.resolve_pers()
+[100, :percent]
iex> Plausible.Cldr.Number.scan("£1_000_000.34")
-["£", 1000000.34]
+iex> Plausible.Cldr.Number.scan("£1_000_000.34")
+["£", 1000000.34]
-iex> Plausible.Cldr.Number.scan("I want £1_000_000 dollars")
-["I want £", 1000000, " dollars"]
+iex> Plausible.Cldr.Number.scan("I want £1_000_000 dollars")
+["I want £", 1000000, " dollars"]
-iex> Plausible.Cldr.Number.scan("The prize is 23")
-["The prize is ", 23]
+iex> Plausible.Cldr.Number.scan("The prize is 23")
+["The prize is ", 23]
-iex> Plausible.Cldr.Number.scan("The lottery number is 23 for the next draw")
-["The lottery number is ", 23, " for the next draw"]
+iex> Plausible.Cldr.Number.scan("The lottery number is 23 for the next draw")
+["The lottery number is ", 23, " for the next draw"]
-iex> Plausible.Cldr.Number.scan("The loss is -1.000 euros", locale: "de", number: :integer)
-["The loss is ", -1000, " euros"]
+iex> Plausible.Cldr.Number.scan("The loss is -1.000 euros", locale: "de", number: :integer)
+["The loss is ", -1000, " euros"]
iex> Plausible.Cldr.Number.to_approx_string 1234
-{:ok, "~1,234"}
+{:ok, "~1,234"}
iex> Plausible.Cldr.Number.to_at_least_string 1234
-{:ok, "1,234+"}
+{:ok, "1,234+"}
iex> Plausible.Cldr.Number.to_at_most_string 1234
-{:ok, "≤1,234"}
+{:ok, "≤1,234"}
iex> Plausible.Cldr.Number.to_range_string 1234..5678
-{:ok, "1,234–5,678"}
+{:ok, "1,234–5,678"}
iex> Cldr.Number.to_string(100, format: :currency, currency: :USD, wrapper: fn
...> string, :currency_symbol -> "<span class=\"symbol\">" <> string <> "</span>"
...> string, :number -> "<span class=\"number\">" <> string <> "</span>"
...> string, :currency_space -> "<span>" <> string <> "</span>"
...> string, _other -> string
-...> end)
-{:ok, "<span class=\"symbol\">$</span><span class=\"number\">100.00</span>"}
It is also possible and recommended to use the Phoenix.HTML.Tag.content_tag/3
+
It is also possible and recommended to use the Phoenix.HTML.Tag.content_tag/3
function if wrapping HTML tags since these will ensure HTML entities are
-correctly encoded. For example:
iex> Cldr.Number.to_string(100, format: :currency, currency: :USD, wrapper: fn
-...> string, :currency_symbol -> Phoenix.HTML.Tag.content_tag(:span, string, class: "symbol")
-...> string, :number -> Phoenix.HTML.Tag.content_tag(:span, string, class: "number")
-...> string, :currency_space -> Phoenix.HTML.Tag.content_tag(:span, string)
+correctly encoded. For example:iex> Cldr.Number.to_string(100, format: :currency, currency: :USD, wrapper: fn
+...> string, :currency_symbol -> Phoenix.HTML.Tag.content_tag(:span, string, class: "symbol")
+...> string, :number -> Phoenix.HTML.Tag.content_tag(:span, string, class: "number")
+...> string, :currency_space -> Phoenix.HTML.Tag.content_tag(:span, string)
...> string, _other -> string
-...> end)
-{:ok, "<span class=\"symbol\">$</span><span class=\"number\">100.00</span>"}
When formatting a number the format is parsed into format elements that might include
+
...> end)
+{:ok, "<span class=\"symbol\">$</span><span class=\"number\">100.00</span>"}
When formatting a number the format is parsed into format elements that might include a currency symbol, a literal string, inserted text between a currency symbol and the currency amount, a percent sign, the number itself and several other elements. In some cases it is helpful to be apply specific formatting to each element. @@ -1168,80 +1168,80 @@ inserted in the final formatted number.
iex> Plausible.Cldr.Number.to_string 12345
-{:ok, "12,345"}
+{:ok, "12,345"}
iex> Plausible.Cldr.Number.to_string 12345, locale: "fr"
-{:ok, "12 345"}
+{:ok, "12 345"}
iex> Plausible.Cldr.Number.to_string 1345.32, currency: :EUR, locale: "es", minimum_grouping_digits: 1
-{:ok, "1.345,32 €"}
+{:ok, "1.345,32 €"}
iex> Plausible.Cldr.Number.to_string 1345.32, currency: :EUR, locale: "es"
-{:ok, "1345,32 €"}
+{:ok, "1345,32 €"}
iex> Plausible.Cldr.Number.to_string 12345, locale: "fr", currency: "USD"
-{:ok, "12 345,00 $US"}
+{:ok, "12 345,00 $US"}
iex> Plausible.Cldr.Number.to_string 12345, format: "#E0"
-{:ok, "1.2345E4"}
+{:ok, "1.2345E4"}
iex> Plausible.Cldr.Number.to_string 12345, format: :accounting, currency: "THB"
-{:ok, "THB 12,345.00"}
+{:ok, "THB 12,345.00"}
iex> Plausible.Cldr.Number.to_string -12345, format: :accounting, currency: "THB"
-{:ok, "(THB 12,345.00)"}
+{:ok, "(THB 12,345.00)"}
iex> Plausible.Cldr.Number.to_string 12345, format: :accounting, currency: "THB",
...> locale: "th"
-{:ok, "฿12,345.00"}
+{:ok, "฿12,345.00"}
iex> Plausible.Cldr.Number.to_string 12345, format: :accounting, currency: "THB",
...> locale: "th", number_system: :native
-{:ok, "฿๑๒,๓๔๕.๐๐"}
+{:ok, "฿๑๒,๓๔๕.๐๐"}
iex> Plausible.Cldr.Number.to_string 1244.30, format: :long
-{:ok, "1 thousand"}
+{:ok, "1 thousand"}
iex> Plausible.Cldr.Number.to_string 1244.30, format: :long, currency: "USD"
-{:ok, "1,244 US dollars"}
+{:ok, "1,244 US dollars"}
iex> Plausible.Cldr.Number.to_string 1244.30, format: :short
-{:ok, "1K"}
+{:ok, "1K"}
iex> Plausible.Cldr.Number.to_string 1244.30, format: :short, currency: "EUR"
-{:ok, "€1K"}
+{:ok, "€1K"}
iex> Plausible.Cldr.Number.to_string 1234, format: :spellout
-{:ok, "one thousand two hundred thirty-four"}
+{:ok, "one thousand two hundred thirty-four"}
iex> Plausible.Cldr.Number.to_string 1234, format: :spellout_verbose
-{:ok, "one thousand two hundred and thirty-four"}
+{:ok, "one thousand two hundred and thirty-four"}
iex> Plausible.Cldr.Number.to_string 1989, format: :spellout_year
-{:ok, "nineteen eighty-nine"}
+{:ok, "nineteen eighty-nine"}
iex> Plausible.Cldr.Number.to_string 123, format: :ordinal
-{:ok, "123rd"}
+{:ok, "123rd"}
iex> Plausible.Cldr.Number.to_string 123, format: :roman
-{:ok, "CXXIII"}
+{:ok, "CXXIII"}
iex> Plausible.Cldr.Number.to_string 123, locale: "th-u-nu-thai"
-{:ok, "๑๒๓"}
An error tuple {:error, reason}
will be returned if an error is detected.
-The two most likely causes of an error return are:
iex> Plausible.Cldr.Number.to_string(12345, format: "0#")
- {:error, {Cldr.FormatCompileError,
- "Decimal format compiler: syntax error before: \"#\""}}
locale
and
+The two most likely causes of an error return are: iex> Plausible.Cldr.Number.to_string(12345, format: "0#")
+ {:error, {Cldr.FormatCompileError,
+ "Decimal format compiler: syntax error before: \"#\""}}
locale
and
number_system
. This happens typically when the number system is
:algorithmic
rather than the more common :numeric
. In this case the error
-return looks like: iex> Plausible.Cldr.Number.to_string(1234, locale: "he", number_system: "hebr", format: :percent)
- {:error, {Cldr.UnknownFormatError,
- "The locale :he with number system :hebr does not define a format :percent"}}
+return looks like: iex> Plausible.Cldr.Number.to_string(1234, locale: "he", number_system: "hebr", format: :percent)
+ {:error, {Cldr.UnknownFormatError,
+ "The locale :he with number system :hebr does not define a format :percent"}}
iex> Plausible.Cldr.Number.validate_number_system "en", :latn
-{:ok, :latn}
+{:ok, :latn}
iex> Plausible.Cldr.Number.validate_number_system "en", :default
-{:ok, :latn}
+{:ok, :latn}
iex> Plausible.Cldr.Number.validate_number_system "en", :unknown
-{:error,
- {Cldr.UnknownNumberSystemError, "The number system :unknown is unknown"}}
+{:error,
+ {Cldr.UnknownNumberSystemError, "The number system :unknown is unknown"}}
iex> Plausible.Cldr.Number.validate_number_system "zz", :default
-{:error, {Cldr.InvalidLanguageError, "The language \"zz\" is invalid"}}
+{:error, {Cldr.InvalidLanguageError, "The language \"zz\" is invalid"}}
Functions to implement the number system rule-based-number-format rules of CLDR.
These rules are defined only on the "und" locale and represent specialised number formatting.
The standard public API for RBNF is via the Cldr.Number.to_string/2
function.
The functions on this module are defined at compile time based upon the RBNF rules -defined in the Unicode CLDR data repository. Available rules are identified by:
iex> Plausible.Cldr.Rbnf.NumberSystem.rule_sets(:und)
-...> |> Enum.sort()
-[
+defined in the Unicode CLDR data repository. Available rules are identified by:iex> Plausible.Cldr.Rbnf.NumberSystem.rule_sets(:und)
+...> |> Enum.sort()
+[
:armenian_lower,
:armenian_upper,
:cyrillic_lower,
@@ -161,9 +161,9 @@ defined in the Unicode CLDR data repository. Available rules are identified by:
:roman_upper,
:tamil,
:zz_default
-]
A rule can then be invoked on an available rule_set. For example
iex> Plausible.Cldr.Rbnf.NumberSystem.roman_upper(123, :und)
-"CXXIII"
This particular call is equivalent to the call through the public API of:
iex> Plausible.Cldr.Number.to_string(123, format: :roman)
-{:ok, "CXXIII"}
+]
A rule can then be invoked on an available rule_set. For example
iex> Plausible.Cldr.Rbnf.NumberSystem.roman_upper(123, :und)
+"CXXIII"
This particular call is equivalent to the call through the public API of:
iex> Plausible.Cldr.Number.to_string(123, format: :roman)
+{:ok, "CXXIII"}
Functions to implement the ordinal rule-based-number-format rules of CLDR.
As CLDR notes, the data is incomplete or non-existent for many languages. It is considered complete for English however.
The standard public API for RBNF is via the Cldr.Number.to_string/2
function.
The functions on this module are defined at compile time based upon the RBNF rules -defined in the Unicode CLDR data repository. Available rules are identified by:
iex> Plausible.Cldr.Rbnf.Ordinal.rule_sets(:en)
-[:digits_ordinal]
+defined in the Unicode CLDR data repository. Available rules are identified by:iex> Plausible.Cldr.Rbnf.Ordinal.rule_sets(:en)
+[:digits_ordinal]
-iex> Plausible.Cldr.Rbnf.Ordinal.rule_sets("fr")
-...> |> Enum.sort()
-[
+iex> Plausible.Cldr.Rbnf.Ordinal.rule_sets("fr")
+...> |> Enum.sort()
+[
:digits_ordinal,
:digits_ordinal_feminine,
:digits_ordinal_feminine_plural,
:digits_ordinal_masculine,
:digits_ordinal_masculine_plural
-]
A rule can then be invoked on an available rule_set. For example
iex> Plausible.Cldr.Rbnf.Ordinal.digits_ordinal(123, :en)
-"123rd"
This call is equivalent to the call through the public API of:
iex> Plausible.Cldr.Number.to_string(123, format: :ordinal)
-{:ok, "123rd"}
+]
A rule can then be invoked on an available rule_set. For example
iex> Plausible.Cldr.Rbnf.Ordinal.digits_ordinal(123, :en)
+"123rd"
This call is equivalent to the call through the public API of:
iex> Plausible.Cldr.Number.to_string(123, format: :ordinal)
+{:ok, "123rd"}
Functions to implement the spellout rule-based-number-format rules of CLDR.
As CLDR notes, the data is incomplete or non-existent for many languages. It is considered complete for English however.
The standard public API for RBNF is via the Cldr.Number.to_string/2
function.
The functions on this module are defined at compile time based upon the RBNF rules -defined in the Unicode CLDR data repository. Available rules are identified by:
iex> Plausible.Cldr.Rbnf.Spellout.rule_sets("en")
-...> |> Enum.sort()
-[
+defined in the Unicode CLDR data repository. Available rules are identified by:iex> Plausible.Cldr.Rbnf.Spellout.rule_sets("en")
+...> |> Enum.sort()
+[
:spellout_cardinal,
:spellout_cardinal_verbose,
:spellout_numbering,
@@ -155,9 +155,9 @@ defined in the Unicode CLDR data repository. Available rules are identified by:
:spellout_numbering_year,
:spellout_ordinal,
:spellout_ordinal_verbose
-]
A rule can then be invoked on an available rule_set. For example:
iex> Plausible.Cldr.Rbnf.Spellout.spellout_ordinal(123, "en")
-"one hundred twenty-third"
This call is equivalent to the call through the public API of:
iex> Plausible.Cldr.Number.to_string(123, format: :spellout)
-{:ok, "one hundred twenty-three"}
+]
A rule can then be invoked on an available rule_set. For example:
iex> Plausible.Cldr.Rbnf.Spellout.spellout_ordinal(123, "en")
+"one hundred twenty-third"
This call is equivalent to the call through the public API of:
iex> Plausible.Cldr.Number.to_string(123, format: :spellout)
+{:ok, "one hundred twenty-three"}
iex> Plausible.Cldr.default_locale()
-%Cldr.LanguageTag{
+iex> Plausible.Cldr.default_locale()
+%Cldr.LanguageTag{
backend: Plausible.Cldr,
canonical_locale_name: "en-001",
cldr_locale_name: :"en-001",
- language_subtags: [],
- extensions: %{},
+ language_subtags: [],
+ extensions: %{},
gettext_locale_name: "en",
language: "en",
- locale: %{},
- private_use: [],
+ locale: %{},
+ private_use: [],
rbnf_locale_name: :en,
requested_locale_name: "en-001",
script: :Latn,
territory: :"001",
- transform: %{},
- language_variants: []
-}
+ transform: %{},
+ language_variants: []
+}
iex> Plausible.Cldr.default_territory()
+iex> Plausible.Cldr.default_territory()
:"001"
iex> Plausible.Cldr.ellipsis("And furthermore")
+iex> Plausible.Cldr.ellipsis("And furthermore")
"And furthermore…"
-iex> Plausible.Cldr.ellipsis(["And furthermore", "there is much to be done"], locale: :ja)
+iex> Plausible.Cldr.ellipsis(["And furthermore", "there is much to be done"], locale: :ja)
"And furthermore…there is much to be done"
-iex> Plausible.Cldr.ellipsis("And furthermore", format: :word)
+iex> Plausible.Cldr.ellipsis("And furthermore", format: :word)
"And furthermore …"
-iex> Plausible.Cldr.ellipsis(["And furthermore", "there is much to be done"], locale: :ja, format: :word)
+iex> Plausible.Cldr.ellipsis(["And furthermore", "there is much to be done"], locale: :ja, format: :word)
"And furthermore … there is much to be done"
@@ -715,23 +715,23 @@ take an optional locale parameter for which a locale is not supplied.
Example
-iex> Plausible.Cldr.put_locale("pl")
-iex> Plausible.Cldr.get_locale()
-%Cldr.LanguageTag{
+iex> Plausible.Cldr.put_locale("pl")
+iex> Plausible.Cldr.get_locale()
+%Cldr.LanguageTag{
backend: Elixir.Plausible.Cldr,
canonical_locale_name: "pl",
cldr_locale_name: :pl,
- extensions: %{},
+ extensions: %{},
language: "pl",
- locale: %{},
- private_use: [],
+ locale: %{},
+ private_use: [],
rbnf_locale_name: :pl,
territory: :PL,
requested_locale_name: "pl",
script: :Latn,
- transform: %{},
- language_variants: []
- }
+ transform: %{},
+ language_variants: []
+ }
@@ -818,10 +818,10 @@ take an optional locale parameter for which a locale is not supplied.
Examples
-iex> Plausible.Cldr.known_gettext_locale_name("en")
+iex> Plausible.Cldr.known_gettext_locale_name("en")
"en"
-iex> Plausible.Cldr.known_gettext_locale_name("en-SA")
+iex> Plausible.Cldr.known_gettext_locale_name("en-SA")
false
@@ -864,10 +864,10 @@ name is configured and available in Gettext.Examples
-iex> Plausible.Cldr.known_gettext_locale_name?("en")
+iex> Plausible.Cldr.known_gettext_locale_name?("en")
true
-iex> Plausible.Cldr.known_gettext_locale_name?("!!")
+iex> Plausible.Cldr.known_gettext_locale_name?("!!")
false
@@ -941,10 +941,10 @@ to return the first known locale name from a list.Examples
-iex> Plausible.Cldr.known_locale_name(:"en-AU")
+iex> Plausible.Cldr.known_locale_name(:"en-AU")
:"en-AU"
-iex> Plausible.Cldr.known_locale_name(:"en-SA")
+iex> Plausible.Cldr.known_locale_name(:"en-SA")
false
@@ -986,10 +986,10 @@ name is configured and available in Cldr.Examples
-iex> Plausible.Cldr.known_locale_name?(:en)
+iex> Plausible.Cldr.known_locale_name?(:en)
true
-iex> Plausible.Cldr.known_locale_name?(:"!!")
+iex> Plausible.Cldr.known_locale_name?(:"!!")
false
@@ -1043,8 +1043,8 @@ in this module or in
Example
-iex> Plausible.Cldr.known_number_system_types()
-[:default, :finance, :native, :traditional]
+iex> Plausible.Cldr.known_number_system_types()
+[:default, :finance, :native, :traditional]
@@ -1109,10 +1109,10 @@ and has RBNF rules defined.
Examples
-iex> Plausible.Cldr.known_rbnf_locale_name(:en)
+iex> Plausible.Cldr.known_rbnf_locale_name(:en)
:en
-iex> Plausible.Cldr.known_rbnf_locale_name(:"en-SA")
+iex> Plausible.Cldr.known_rbnf_locale_name(:"en-SA")
false
@@ -1155,10 +1155,10 @@ rules based number formats (RBNF).Examples
-iex> Plausible.Cldr.known_rbnf_locale_name?(:en)
+iex> Plausible.Cldr.known_rbnf_locale_name?(:en)
true
-iex> Plausible.Cldr.known_rbnf_locale_name?(:"!!")
+iex> Plausible.Cldr.known_rbnf_locale_name?(:"!!")
false
@@ -1294,18 +1294,18 @@ CLDR backend defined by the t:Cldr.LanguageTag
is se
Examples
iex> import Cldr.LanguageTag.Sigil
-iex> Plausible.Cldr.put_gettext_locale(~l"en")
-{:ok, "en"}
+iex> Plausible.Cldr.put_gettext_locale(~l"en")
+{:ok, "en"}
iex> import Cldr.LanguageTag.Sigil
-iex> Plausible.Cldr.put_gettext_locale(~l"de")
-{
+iex> Plausible.Cldr.put_gettext_locale(~l"de")
+{
:error,
- {
+ {
Cldr.UnknownLocaleError,
"Locale TestBackend.Cldr.Locale.new!(\"de-DE\") does not map to a known gettext locale name"
- }
-}
+ }
+}
@@ -1349,29 +1349,29 @@ of a language tag.
Examples
-iex> Plausible.Cldr.put_locale("en")
-{:ok,
- %Cldr.LanguageTag{
+iex> Plausible.Cldr.put_locale("en")
+{:ok,
+ %Cldr.LanguageTag{
backend: Plausible.Cldr,
canonical_locale_name: "en",
cldr_locale_name: :en,
- language_subtags: [],
- extensions: %{},
+ language_subtags: [],
+ extensions: %{},
gettext_locale_name: "en",
language: "en",
- locale: %{},
- private_use: [],
+ locale: %{},
+ private_use: [],
rbnf_locale_name: :en,
requested_locale_name: "en",
script: :Latn,
territory: :US,
- transform: %{},
- language_variants: []
- }}
+ transform: %{},
+ language_variants: []
+ }}
-iex> Plausible.Cldr.put_locale("invalid-locale!")
-{:error, {Cldr.LanguageTag.ParseError,
- "Expected a BCP47 language tag. Could not parse the remaining \"!\" starting at position 15"}}
+iex> Plausible.Cldr.put_locale("invalid-locale!")
+{:error, {Cldr.LanguageTag.ParseError,
+ "Expected a BCP47 language tag. Could not parse the remaining \"!\" starting at position 15"}}
@@ -1420,10 +1420,10 @@ The default is Examples
-iex> Plausible.Cldr.quote("Quoted String")
+iex> Plausible.Cldr.quote("Quoted String")
"“Quoted String”"
-iex> Plausible.Cldr.quote("Quoted String", locale: :ja)
+iex> Plausible.Cldr.quote("Quoted String", locale: :ja)
"「Quoted String」"
@@ -1554,47 +1554,47 @@ of a language tag.Examples
-iex> Plausible.Cldr.validate_locale(:en)
-{:ok,
-%Cldr.LanguageTag{
+iex> Plausible.Cldr.validate_locale(:en)
+{:ok,
+%Cldr.LanguageTag{
backend: Plausible.Cldr,
canonical_locale_name: "en",
cldr_locale_name: :en,
- extensions: %{},
+ extensions: %{},
gettext_locale_name: "en",
language: "en",
- locale: %{},
- private_use: [],
+ locale: %{},
+ private_use: [],
rbnf_locale_name: :en,
requested_locale_name: "en",
script: :Latn,
territory: :US,
- transform: %{},
- language_variants: []
-}}
+ transform: %{},
+ language_variants: []
+}}
-iex> Plausible.Cldr.validate_locale Plausible.Cldr.default_locale()
-{:ok,
-%Cldr.LanguageTag{
+iex> Plausible.Cldr.validate_locale Plausible.Cldr.default_locale()
+{:ok,
+%Cldr.LanguageTag{
backend: Plausible.Cldr,
canonical_locale_name: "en-001",
cldr_locale_name: :"en-001",
- extensions: %{},
+ extensions: %{},
gettext_locale_name: "en",
language: "en",
- locale: %{},
- private_use: [],
+ locale: %{},
+ private_use: [],
rbnf_locale_name: :en,
requested_locale_name: "en-001",
script: :Latn,
territory: :"001",
- transform: %{},
- language_variants: []
-}}
+ transform: %{},
+ language_variants: []
+}}
-iex> Plausible.Cldr.validate_locale("zzz")
-{:error, {Cldr.InvalidLanguageError, "The language \"zzz\" is invalid"}}
+iex> Plausible.Cldr.validate_locale("zzz")
+{:error, {Cldr.InvalidLanguageError, "The language \"zzz\" is invalid"}}
@@ -1664,23 +1664,23 @@ of a language tag.Examples
-iex> Plausible.Cldr.validate_number_system_type(:default)
-{:ok, :default}
+iex> Plausible.Cldr.validate_number_system_type(:default)
+{:ok, :default}
-iex> Plausible.Cldr.validate_number_system_type(:traditional)
-{:ok, :traditional}
+iex> Plausible.Cldr.validate_number_system_type(:traditional)
+{:ok, :traditional}
-iex> Plausible.Cldr.validate_number_system_type(:latn)
-{
+iex> Plausible.Cldr.validate_number_system_type(:latn)
+{
:error,
- {Cldr.UnknownNumberSystemTypeError, "The number system type :latn is unknown"}
-}
+ {Cldr.UnknownNumberSystemTypeError, "The number system type :latn is unknown"}
+}
-iex> Plausible.Cldr.validate_number_system_type("bork")
-{
+iex> Plausible.Cldr.validate_number_system_type("bork")
+{
:error,
- {Cldr.UnknownNumberSystemTypeError, "The number system type \"bork\" is invalid"}
-}
+ {Cldr.UnknownNumberSystemTypeError, "The number system type \"bork\" is invalid"}
+}
diff --git a/Plausible.ClickhouseRepo.html b/Plausible.ClickhouseRepo.html
index 92bde2abf..13454561e 100644
--- a/Plausible.ClickhouseRepo.html
+++ b/Plausible.ClickhouseRepo.html
@@ -845,23 +845,23 @@ pool to disconnect within the given interval.
diff --git a/Plausible.DataMigration.Repo.html b/Plausible.DataMigration.Repo.html
index d31f31718..96af1378d 100644
--- a/Plausible.DataMigration.Repo.html
+++ b/Plausible.DataMigration.Repo.html
@@ -1162,23 +1162,23 @@ pool to disconnect within the given interval.See
-Similar to insert_all/2
but with the following differences:
- accepts rows as streams or lists
- sends rows as a chunked request
- doesn't autogenerate ids or does any other preprocessing
Example:
Repo.query!("create table ecto_ch_demo(a UInt64, b String) engine Null")
+Similar to insert_all/2
but with the following differences:
- accepts rows as streams or lists
- sends rows as a chunked request
- doesn't autogenerate ids or does any other preprocessing
Example:
Repo.query!("create table ecto_ch_demo(a UInt64, b String) engine Null")
-defmodule Demo do
+defmodule Demo do
use Ecto.Schema
@primary_key false
- schema "ecto_ch_demo" do
+ schema "ecto_ch_demo" do
field :a, Ch, type: "UInt64"
field :b, :string
- end
-end
+ end
+end
-rows = Stream.map(1..100_000, fn i -> %{a: i, b: to_string(i)} end)
-{100_000, nil} = Repo.insert_stream(Demo, rows)
+rows = Stream.map(1..100_000, fn i -> %{a: i, b: to_string(i)} end)
+{100_000, nil} = Repo.insert_stream(Demo, rows)
# schemaless
-{100_000, nil} = Repo.insert_stream("ecto_ch_demo", rows, types: [a: Ch.Types.u64(), b: :string])
+{100_000, nil} = Repo.insert_stream("ecto_ch_demo", rows, types: [a: Ch.Types.u64(), b: :string])
diff --git a/Plausible.Exports.html b/Plausible.Exports.html
index dd4b4ff44..5a5e79686 100644
--- a/Plausible.Exports.html
+++ b/Plausible.Exports.html
@@ -381,7 +381,7 @@ tables into the format of imported_*
tables for a we
-Renders export archive filename.
Examples:
iex> archive_filename("plausible.io", _created_on = ~D[2024-12-31])
+Renders export archive filename.
Examples:
iex> archive_filename("plausible.io", _created_on = ~D[2024-12-31])
"plausible_io_20241231.zip"
@@ -404,10 +404,10 @@ tables into the format of imported_*
tables for a we
-Safely renders content disposition for an arbitrary export filename.
Examples:
iex> content_disposition("plausible_io_20241231.zip")
+Safely renders content disposition for an arbitrary export filename.
Examples:
iex> content_disposition("plausible_io_20241231.zip")
"attachment; filename=\"plausible_io_20241231.zip\""
-iex> content_disposition("📊.zip")
+iex> content_disposition("📊.zip")
"attachment; filename=\"plausible-export.zip\"; filename*=utf-8''%F0%9F%93%8A.zip"
@@ -726,14 +726,14 @@ tables into the format of imported_*
tables for a we
-Creates a streamable Zip archive from the provided (named) Ecto queries.
Example usage:
{:ok, pool} = Ch.start_link(pool_size: 1)
+Creates a streamable Zip archive from the provided (named) Ecto queries.
Example usage:
{:ok, pool} = Ch.start_link(pool_size: 1)
-DBConnection.run(pool, fn conn ->
+DBConnection.run(pool, fn conn ->
conn
- |> stream_archive(export_queries(_site_id = 1), format: "CSVWithNames")
- |> Stream.into(File.stream!("export.zip"))
- |> Stream.run()
-end)
+ |> stream_archive(export_queries(_site_id = 1), format: "CSVWithNames")
+ |> Stream.into(File.stream!("export.zip"))
+ |> Stream.run()
+end)
diff --git a/Plausible.Geo.html b/Plausible.Geo.html
index 4995f6ea3..c68592409 100644
--- a/Plausible.Geo.html
+++ b/Plausible.Geo.html
@@ -260,8 +260,8 @@ and MaxMind license key.
Examples
- In the case of a DB-IP database:
iex> database_type()
-"DBIP-City-Lite"
In the case of a MaxMind database:
iex> database_type()
+ In the case of a DB-IP database:
iex> database_type()
+"DBIP-City-Lite"
In the case of a MaxMind database:
iex> database_type()
"GeoLite2-City"
@@ -302,8 +302,8 @@ asynchronously.
Examples
- Loading from a local file:
iex> load_db(path: "/etc/plausible/dbip-city.mmdb")
-:ok
Downloading a MaxMind DB (this license key is no longer active):
iex> load_db(license_key: "LNpsJCCKPis6XvBP", edition: "GeoLite2-City", async: true)
+ Loading from a local file:
iex> load_db(path: "/etc/plausible/dbip-city.mmdb")
+:ok
Downloading a MaxMind DB (this license key is no longer active):
iex> load_db(license_key: "LNpsJCCKPis6XvBP", edition: "GeoLite2-City", async: true)
:ok
@@ -332,21 +332,21 @@ asynchronously.
Examples
-iex> lookup("8.7.6.5")
-%{
- "city" => %{
+iex> lookup("8.7.6.5")
+%{
+ "city" => %{
"geoname_id" => 5349755,
- "names" => %{
+ "names" => %{
"de" => "Fontana",
"en" => "Fontana",
"ja" => "フォンタナ",
"ru" => "Фонтана"
- }
- },
- "continent" => %{
+ }
+ },
+ "continent" => %{
"code" => "NA",
"geoname_id" => 6255149,
- "names" => %{
+ "names" => %{
"de" => "Nordamerika",
"en" => "North America",
"es" => "Norteamérica",
@@ -355,12 +355,12 @@ asynchronously."pt-BR" => "América do Norte",
"ru" => "Северная Америка",
"zh-CN" => "北美洲"
- }
- },
- "country" => %{
+ }
+ },
+ "country" => %{
"geoname_id" => 6252001,
"iso_code" => "US",
- "names" => %{
+ "names" => %{
"de" => "Vereinigte Staaten",
"en" => "United States",
"es" => "Estados Unidos",
@@ -369,20 +369,20 @@ asynchronously."pt-BR" => "EUA",
"ru" => "США",
"zh-CN" => "美国"
- }
- },
- "location" => %{
+ }
+ },
+ "location" => %{
"accuracy_radius" => 50,
"latitude" => 34.1211,
"longitude" => -117.4362,
"metro_code" => 803,
"time_zone" => "America/Los_Angeles"
- },
- "postal" => %{"code" => "92336"},
- "registered_country" => %{
+ },
+ "postal" => %{"code" => "92336"},
+ "registered_country" => %{
"geoname_id" => 6252001,
"iso_code" => "US",
- "names" => %{
+ "names" => %{
"de" => "Vereinigte Staaten",
"en" => "United States",
"es" => "Estados Unidos",
@@ -391,13 +391,13 @@ asynchronously."pt-BR" => "EUA",
"ru" => "США",
"zh-CN" => "美国"
- }
- },
- "subdivisions" => [
- %{
+ }
+ },
+ "subdivisions" => [
+ %{
"geoname_id" => 5332921,
"iso_code" => "CA",
- "names" => %{
+ "names" => %{
"de" => "Kalifornien",
"en" => "California",
"es" => "California",
@@ -406,10 +406,10 @@ asynchronously."pt-BR" => "Califórnia",
"ru" => "Калифорния",
"zh-CN" => "加州"
- }
- }
- ]
-}
+ }
+ }
+ ]
+}
diff --git a/Plausible.ImportDeletionRepo.html b/Plausible.ImportDeletionRepo.html
index b7ada0c0e..dbb78cf92 100644
--- a/Plausible.ImportDeletionRepo.html
+++ b/Plausible.ImportDeletionRepo.html
@@ -1153,23 +1153,23 @@ pool to disconnect within the given interval.See
-Similar to insert_all/2
but with the following differences:
- accepts rows as streams or lists
- sends rows as a chunked request
- doesn't autogenerate ids or does any other preprocessing
Example:
Repo.query!("create table ecto_ch_demo(a UInt64, b String) engine Null")
+Similar to insert_all/2
but with the following differences:
- accepts rows as streams or lists
- sends rows as a chunked request
- doesn't autogenerate ids or does any other preprocessing
Example:
Repo.query!("create table ecto_ch_demo(a UInt64, b String) engine Null")
-defmodule Demo do
+defmodule Demo do
use Ecto.Schema
@primary_key false
- schema "ecto_ch_demo" do
+ schema "ecto_ch_demo" do
field :a, Ch, type: "UInt64"
field :b, :string
- end
-end
+ end
+end
-rows = Stream.map(1..100_000, fn i -> %{a: i, b: to_string(i)} end)
-{100_000, nil} = Repo.insert_stream(Demo, rows)
+rows = Stream.map(1..100_000, fn i -> %{a: i, b: to_string(i)} end)
+{100_000, nil} = Repo.insert_stream(Demo, rows)
# schemaless
-{100_000, nil} = Repo.insert_stream("ecto_ch_demo", rows, types: [a: Ch.Types.u64(), b: :string])
+{100_000, nil} = Repo.insert_stream("ecto_ch_demo", rows, types: [a: Ch.Types.u64(), b: :string])
diff --git a/Plausible.Imported.CSVImporter.html b/Plausible.Imported.CSVImporter.html
index 1c12ef245..7cfc85840 100644
--- a/Plausible.Imported.CSVImporter.html
+++ b/Plausible.Imported.CSVImporter.html
@@ -257,13 +257,13 @@ or from local storage for which it uses iex> date_range([
-...> %{"filename" => "imported_devices_20190101_20210101.csv"},
+Extracts min/max date range from a list of uploads.
Examples:
iex> date_range([
+...> %{"filename" => "imported_devices_20190101_20210101.csv"},
...> "pages_20200101_20220101.csv"
-...> ])
-Date.range(~D[2019-01-01], ~D[2022-01-01])
+...> ])
+Date.range(~D[2019-01-01], ~D[2022-01-01])
-iex> date_range([])
+iex> date_range([])
nil
@@ -292,13 +292,13 @@ or from local storage for which it uses iex> extract_table("my_data.csv")
+Extracts the table name from the provided filename.
Raises if the filename doesn't conform to the expected format.
Examples:
iex> extract_table("my_data.csv")
** (ArgumentError) invalid filename
-iex> extract_table("imported_devices_00010101_20250101.csv")
+iex> extract_table("imported_devices_00010101_20250101.csv")
"imported_devices"
-iex> extract_table("devices_00010101_20250101.csv")
+iex> extract_table("devices_00010101_20250101.csv")
"imported_devices"
@@ -321,8 +321,8 @@ or from local storage for which it uses
-Returns local directory for CSV imports storage.
Builds upon $DATA_DIR
or $PERSISTENT_CACHE_DIR
(if set) and falls back to /tmp
Examples:
iex> local_dir = local_dir(_site_id = 37)
-iex> String.ends_with?(local_dir, "/plausible-imports/37")
+Returns local directory for CSV imports storage.
Builds upon $DATA_DIR
or $PERSISTENT_CACHE_DIR
(if set) and falls back to /tmp
Examples:
iex> local_dir = local_dir(_site_id = 37)
+iex> String.ends_with?(local_dir, "/plausible-imports/37")
true
@@ -382,14 +382,14 @@ or from local storage for which it uses iex> parse_filename!("my_data.csv")
+Extracts table name and min/max dates from the filename.
Examples:
iex> parse_filename!("my_data.csv")
** (ArgumentError) invalid filename
-iex> parse_filename!("imported_devices_00010101_20250101.csv")
-{"imported_devices", ~D[0001-01-01], ~D[2025-01-01]}
+iex> parse_filename!("imported_devices_00010101_20250101.csv")
+{"imported_devices", ~D[0001-01-01], ~D[2025-01-01]}
-iex> parse_filename!("devices_00010101_20250101.csv")
-{"imported_devices", ~D[0001-01-01], ~D[2025-01-01]}
+iex> parse_filename!("devices_00010101_20250101.csv")
+{"imported_devices", ~D[0001-01-01], ~D[2025-01-01]}
@@ -417,13 +417,13 @@ or from local storage for which it uses iex> valid_filename?("my_data.csv")
+Checks if the provided filename conforms to the expected format.
Examples:
iex> valid_filename?("my_data.csv")
false
-iex> valid_filename?("imported_devices_00010101_20250101.csv")
+iex> valid_filename?("imported_devices_00010101_20250101.csv")
true
-iex> valid_filename?("devices_00010101_20250101.csv")
+iex> valid_filename?("devices_00010101_20250101.csv")
true
diff --git a/Plausible.Imported.Importer.html b/Plausible.Imported.Importer.html
index 22e4aab6b..fb881d28f 100644
--- a/Plausible.Imported.Importer.html
+++ b/Plausible.Imported.Importer.html
@@ -183,30 +183,30 @@ scope of importer logic and is expected to be implemented separately.
In case it's necessary to run the whole import job fully synchronously, the
Plausible.Workers.ImportAnalytics
worker sends an Oban.Notifier
message
-on completion, failure or transient failure of the import.
A basic usage scenario looks like this:
{:ok, job} = Plausible.Imported.NoopImporter.new_import(
+on completion, failure or transient failure of the import.A basic usage scenario looks like this:
{:ok, job} = Plausible.Imported.NoopImporter.new_import(
site,
user,
start_date: ~D[2005-01-01],
- end_date: Date.utc_today(),
+ end_date: Date.utc_today(),
# this option is necessary to setup the calling process as listener
listen?: true
-)
+)
-import_id = job.args[:import_id]
+import_id = job.args[:import_id]
-receive do
- {:notification, :analytics_imports_jobs, %{"event" => "complete", "import_id" => ^import_id}} ->
- IO.puts("Job completed")
+receive do
+ {:notification, :analytics_imports_jobs, %{"event" => "complete", "import_id" => ^import_id}} ->
+ IO.puts("Job completed")
- {:notification, :analytics_imports_jobs, %{"event" => "transient_fail", "import_id" => ^import_id}} ->
- IO.puts("Job failed transiently")
+ {:notification, :analytics_imports_jobs, %{"event" => "transient_fail", "import_id" => ^import_id}} ->
+ IO.puts("Job failed transiently")
- {:notification, :analytics_imports_jobs, %{"event" => "fail", "import_id" => ^import_id}} ->
- IO.puts("Job failed permanently")
-after
+ {:notification, :analytics_imports_jobs, %{"event" => "fail", "import_id" => ^import_id}} ->
+ IO.puts("Job failed permanently")
+after
15_000 ->
- IO.puts("Job didn't finish in 15 seconds")
-end
In a more realistic scenario, job scheduling will be done inside a GenServer process
+
IO.puts("Job didn't finish in 15 seconds")
+end
In a more realistic scenario, job scheduling will be done inside a GenServer process
like LiveView, where notifications can be listened for via handle_info/2
.
diff --git a/Plausible.IngestRepo.html b/Plausible.IngestRepo.html
index fdcbb0717..5d4ed0062 100644
--- a/Plausible.IngestRepo.html
+++ b/Plausible.IngestRepo.html
@@ -1183,23 +1183,23 @@ pool to disconnect within the given interval.See
-Similar to insert_all/2
but with the following differences:
- accepts rows as streams or lists
- sends rows as a chunked request
- doesn't autogenerate ids or does any other preprocessing
Example:
Repo.query!("create table ecto_ch_demo(a UInt64, b String) engine Null")
+Similar to insert_all/2
but with the following differences:
- accepts rows as streams or lists
- sends rows as a chunked request
- doesn't autogenerate ids or does any other preprocessing
Example:
Repo.query!("create table ecto_ch_demo(a UInt64, b String) engine Null")
-defmodule Demo do
+defmodule Demo do
use Ecto.Schema
@primary_key false
- schema "ecto_ch_demo" do
+ schema "ecto_ch_demo" do
field :a, Ch, type: "UInt64"
field :b, :string
- end
-end
+ end
+end
-rows = Stream.map(1..100_000, fn i -> %{a: i, b: to_string(i)} end)
-{100_000, nil} = Repo.insert_stream(Demo, rows)
+rows = Stream.map(1..100_000, fn i -> %{a: i, b: to_string(i)} end)
+{100_000, nil} = Repo.insert_stream(Demo, rows)
# schemaless
-{100_000, nil} = Repo.insert_stream("ecto_ch_demo", rows, types: [a: Ch.Types.u64(), b: :string])
+{100_000, nil} = Repo.insert_stream("ecto_ch_demo", rows, types: [a: Ch.Types.u64(), b: :string])
diff --git a/Plausible.S3.html b/Plausible.S3.html
index 211ebb12b..7eb37f4ab 100644
--- a/Plausible.S3.html
+++ b/Plausible.S3.html
@@ -316,7 +316,7 @@ The URL expires in 300 seconds, which should be enough for a redirect.
In
Returns the pre-configured S3 bucket for CSV exports.
config :plausible, Plausible.S3,
- exports_bucket: System.fetch_env!("S3_EXPORTS_BUCKET")
Example:
iex> exports_bucket()
+ exports_bucket: System.fetch_env!("S3_EXPORTS_BUCKET")
Example:
iex> exports_bucket()
"test-exports"
@@ -348,8 +348,8 @@ The URL expires in 300 seconds, which should be enough for a redirect.In
-
Returns access_key_id
and secret_access_key
to be used by ClickHouse during imports from S3.
Example:
iex> import_clickhouse_credentials()
-%{access_key_id: "minioadmin", secret_access_key: "minioadmin"}
+Returns access_key_id
and secret_access_key
to be used by ClickHouse during imports from S3.
Example:
iex> import_clickhouse_credentials()
+%{access_key_id: "minioadmin", secret_access_key: "minioadmin"}
@@ -371,9 +371,9 @@ The URL expires in 300 seconds, which should be enough for a redirect.In
-Presigns an upload for an imported file.
In the current implementation the bucket always goes into the path component.
Example:
iex> upload = import_presign_upload(_site_id = 123, _filename = "imported_browsers.csv")
-iex> true = String.ends_with?(upload.s3_url, "/test-imports/123/imported_browsers.csv")
-iex> true = String.contains?(upload.presigned_url, "/test-imports/123/imported_browsers.csv?X-Amz-Algorithm=AWS4-HMAC-SHA256&")
+Presigns an upload for an imported file.
In the current implementation the bucket always goes into the path component.
Example:
iex> upload = import_presign_upload(_site_id = 123, _filename = "imported_browsers.csv")
+iex> true = String.ends_with?(upload.s3_url, "/test-imports/123/imported_browsers.csv")
+iex> true = String.contains?(upload.presigned_url, "/test-imports/123/imported_browsers.csv?X-Amz-Algorithm=AWS4-HMAC-SHA256&")
@@ -402,7 +402,7 @@ The URL expires in 300 seconds, which should be enough for a redirect.In
Returns the pre-configured S3 bucket for CSV imports.
config :plausible, Plausible.S3,
- imports_bucket: System.fetch_env!("S3_IMPORTS_BUCKET")
Example:
iex> imports_bucket()
+ imports_bucket: System.fetch_env!("S3_IMPORTS_BUCKET")
Example:
iex> imports_bucket()
"test-imports"
diff --git a/Plausible.Stats.Filters.html b/Plausible.Stats.Filters.html
index 47ee43af6..53ecd993c 100644
--- a/Plausible.Stats.Filters.html
+++ b/Plausible.Stats.Filters.html
@@ -283,14 +283,14 @@ Pages
Examples:
-iex> Filters.parse("{\"page\":\"/blog/**\"}")
-[[:matches, "event:page", ["/blog/**"]]]
+iex> Filters.parse("{\"page\":\"/blog/**\"}")
+[[:matches, "event:page", ["/blog/**"]]]
-iex> Filters.parse("visit:browser!=Chrome")
-[[:is_not, "visit:browser", ["Chrome"]]]
+iex> Filters.parse("visit:browser!=Chrome")
+[[:is_not, "visit:browser", ["Chrome"]]]
-iex> Filters.parse(nil)
-[]
+iex> Filters.parse(nil)
+[]
diff --git a/Plausible.Stats.SQL.Fragments.html b/Plausible.Stats.SQL.Fragments.html
index 1c8b47827..6f70a5447 100644
--- a/Plausible.Stats.SQL.Fragments.html
+++ b/Plausible.Stats.SQL.Fragments.html
@@ -668,12 +668,12 @@ boundary, not_before
is returned.not_before
boundary is set to the past Saturday, which is before the
weekstart, therefore the cap does not apply. > this_wednesday = ~D[2022-11-09]
> past_saturday = ~D[2022-11-05]
- > weekstart_not_before(this_wednesday, past_saturday)
+ > weekstart_not_before(this_wednesday, past_saturday)
~D[2022-11-07]
In this other example, the fragment returns Tuesday and not the weekstart.
The not_before
boundary is set to Tuesday, which is past the weekstart,
therefore the cap applies.
> this_wednesday = ~D[2022-11-09]
> this_tuesday = ~D[2022-11-08]
- > weekstart_not_before(this_wednesday, this_tuesday)
+ > weekstart_not_before(this_wednesday, this_tuesday)
~D[2022-11-08]
diff --git a/Plausible.epub b/Plausible.epub
index de92595a0d022aea65c6d7b4fb6bde29e8a00cef..aacd78cf228f6be28a82688af4dabb6dbf2c77e6 100644
GIT binary patch
delta 142210
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\bM=>foT9)ph5
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