From 67fe3bd716eebbcbc91c1d4edcbe0f39f6371632 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 b50c8ae762..5799f7e28b 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 b12a630b88..a3d49cbe7b 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 75cbcc8ef1..2d90bf7461 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 364925b60a..7964e52911 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 314245a785..cdf8daeb55 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 a389cff11a..717079048f 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 1a11acf7fa..190a8e4232 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 182a3f760a..e59879e2fe 100644
--- a/Plausible.ClickhouseRepo.html
+++ b/Plausible.ClickhouseRepo.html
@@ -879,23 +879,23 @@ pool to disconnect within the given interval.
diff --git a/Plausible.DataMigration.Repo.html b/Plausible.DataMigration.Repo.html
index 31dc6d0d2f..70e161cca5 100644
--- a/Plausible.DataMigration.Repo.html
+++ b/Plausible.DataMigration.Repo.html
@@ -1196,23 +1196,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 a17cec9da3..ee103fb59a 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 d7665902ca..0eae745acf 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 36c9a595a2..9b39fee2f3 100644
--- a/Plausible.ImportDeletionRepo.html
+++ b/Plausible.ImportDeletionRepo.html
@@ -1187,23 +1187,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 9ee86d999b..58dddf2cca 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
, $PERSISTENT_CACHE_DIR
or $DEFAULT_DATA_DIR
(if set) and falls back to /tmp.
$DEFAULT_DATA_DIR
is set to /var/lib/plausible
in container images.
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
, $PERSISTENT_CACHE_DIR
or $DEFAULT_DATA_DIR
(if set) and falls back to /tmp.
$DEFAULT_DATA_DIR
is set to /var/lib/plausible
in container images.
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 286cdd7ad1..a17dd5a645 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 f3fe572e67..391986f716 100644
--- a/Plausible.IngestRepo.html
+++ b/Plausible.IngestRepo.html
@@ -1217,23 +1217,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 09ea98af54..24aa3b2685 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 eb67f30c9c..0c318c28ae 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 c724c58f90..7bd4e8ff3e 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 c13be939d618b66be9967ef10187299209b3df25..ca21b841a5b68e2f661a20a52a949ec9d6f059dc 100644
GIT binary patch
delta 145338
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