From e5d939f6f53ec3facd8a7230a40577ecffeaddd7 Mon Sep 17 00:00:00 2001
From: ukutaht
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 b6003549c..b9f10e092 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 e36c30e73..f27448d4c 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 ce20b0e41..5e4a30d79 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 f3841a908..33b51cb0c 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 a94673068..cd7329239 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 56e3d8067..24743fb85 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 a926980fd..df4f6ca67 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 6cc0c6e56..3976a4517 100644
--- a/Plausible.ClickhouseRepo.html
+++ b/Plausible.ClickhouseRepo.html
@@ -855,23 +855,23 @@ pool to disconnect within the given interval.
diff --git a/Plausible.DataMigration.Repo.html b/Plausible.DataMigration.Repo.html
index 6ed0df4c5..3c451436b 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 cc9fdba55..7ed812aa2 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 2bd829e50..6d146695a 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 bd59c42be..8d26c6b4f 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 a466789ce..fc358422b 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 f288334fb..e47069f0a 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 f131377fe..881bebfc6 100644
--- a/Plausible.IngestRepo.html
+++ b/Plausible.IngestRepo.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.S3.html b/Plausible.S3.html
index 997718fd6..a3c145c74 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 3a9a5b67f..acc56b413 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 c88b08a86..7b224be3c 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 8bd357ecf502b1e5eac35d0dc57f15ede5a76099..d027c8eae58579b602c4800f4209ac97c7d2f8ac 100644
GIT binary patch
delta 146044
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