From 8cb43d06db213eb8c2a6639c824d4568f1d8faf7 Mon Sep 17 00:00:00 2001
From: aerosol
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 b344d4470..86bed0ab2 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 8efd4d3de..ff811fe4a 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 f00d98be2..270578b53 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 5f1e97955..9a961a7db 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 a8755a03c..e69784f9e 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 6f440c583..5f3ba800d 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 5bad6325e..1c6687fab 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 f97940301..b9c1fe29a 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 f35279e89..1a14ff38b 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 3e91473a7..23edbc5cf 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 41c13868b..55fbb8383 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 13cee5807..7410b9bbe 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 2f53041cc..a39abb256 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 b4553d225..77584d6aa 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 588b2394a..05a193e11 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 a118450be..62ce822e5 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 1b4d89b96..6e8f0ca2e 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.epub b/Plausible.epub
index 88308db0ae17888a2ed882b7f4f329e8a806e459..c0fa1a8a34fd4cefa1d2da41588e03f19c4bd920 100644
GIT binary patch
delta 140320
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