From a0368d6d48a53da041333c6fee699185febb4e7d 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])
Give
Queries the ClickHouse database for the monthly pageview usage. If the given user's
subscription is active
, past_due
, or a deleted
(but not yet expired), a map
-with the following structure is returned:
%{
- current_cycle: usage_cycle(),
- last_cycle: usage_cycle(),
- penultimate_cycle: usage_cycle()
-}
In all other cases of the subscription status (or a free_10k
subscription which
-does not have a last_bill_date
defined) - the following structure is returned:
%{last_30_days: usage_cycle()}
Given only a user as input, the usage is queried from across all the sites that the +with the following structure is returned:
%{
+ current_cycle: usage_cycle(),
+ last_cycle: usage_cycle(),
+ penultimate_cycle: usage_cycle()
+}
In all other cases of the subscription status (or a free_10k
subscription which
+does not have a last_bill_date
defined) - the following structure is returned:
%{last_30_days: usage_cycle()}
Given only a user as input, the usage is queried from across all the sites that the
user owns. Alternatively, given an optional argument of site_ids
, the usage from
across all those sites is queried instead.
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 @@ wuth an error tuple for each invalid tag added at the end of the list.
Example
-iex> Cldr.AcceptLanguage.parse("da,zh-TW;q=0.3", 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 @@ wuth 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 6dc5f7205..40968eb64 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 3b53f8a92..ea50845d1 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 b5bf2d929..c01c8c3f2 100644
--- a/Plausible.Cldr.Number.Cardinal.html
+++ b/Plausible.Cldr.Number.Cardinal.html
@@ -455,31 +455,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 916fa4ede..5d7280dbb 100644
--- a/Plausible.Cldr.Number.Format.html
+++ b/Plausible.Cldr.Number.Format.html
@@ -468,7 +468,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¤)",
@@ -478,7 +478,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",
@@ -535,7 +535,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 bbd796665..160422cee 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 86951d554..3dea17569 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"}}
@@ -613,20 +613,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.
@@ -673,16 +673,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 4c3fe13ef..6b775c2a1 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,14 +1294,14 @@ 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")
-{:error,
- {Cldr.UnknownLocaleError,
- "Locale #Cldr.LanguageTag<de [validated]> does not map to a known gettext locale name"}}
+iex> Plausible.Cldr.put_gettext_locale(~l"de")
+{:error,
+ {Cldr.UnknownLocaleError,
+ "Locale #Cldr.LanguageTag<de [validated]> does not map to a known gettext locale name"}}
@@ -1345,29 +1345,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"}}
@@ -1416,10 +1416,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」"
@@ -1550,47 +1550,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"}}
@@ -1660,23 +1660,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 973907a8c..3fce5c3a7 100644
--- a/Plausible.ClickhouseRepo.html
+++ b/Plausible.ClickhouseRepo.html
@@ -845,23 +845,23 @@ pool to disconnect within the given interval.
diff --git a/Plausible.DataMigration.Repo.html b/Plausible.DataMigration.Repo.html
index 244c5725a..02a5f851e 100644
--- a/Plausible.DataMigration.Repo.html
+++ b/Plausible.DataMigration.Repo.html
@@ -1152,23 +1152,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.Geo.html b/Plausible.Geo.html
index 050ca2f2d..c9a3a0baf 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"
@@ -301,8 +301,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
@@ -331,21 +331,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",
@@ -354,12 +354,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",
@@ -368,20 +368,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",
@@ -390,13 +390,13 @@ asynchronously."pt-BR" => "EUA",
"ru" => "США",
"zh-CN" => "美国"
- }
- },
- "subdivisions" => [
- %{
+ }
+ },
+ "subdivisions" => [
+ %{
"geoname_id" => 5332921,
"iso_code" => "CA",
- "names" => %{
+ "names" => %{
"de" => "Kalifornien",
"en" => "California",
"es" => "California",
@@ -405,10 +405,10 @@ asynchronously."pt-BR" => "Califórnia",
"ru" => "Калифорния",
"zh-CN" => "加州"
- }
- }
- ]
-}
+ }
+ }
+ ]
+}
diff --git a/Plausible.ImportDeletionRepo.html b/Plausible.ImportDeletionRepo.html
index 68eee6310..ec6b81b6f 100644
--- a/Plausible.ImportDeletionRepo.html
+++ b/Plausible.ImportDeletionRepo.html
@@ -1143,23 +1143,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.IngestRepo.html b/Plausible.IngestRepo.html
index 43661c198..8b29a7893 100644
--- a/Plausible.IngestRepo.html
+++ b/Plausible.IngestRepo.html
@@ -1143,23 +1143,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.Stats.FilterParser.html b/Plausible.Stats.FilterParser.html
index 552cf96c3..19d00c5ce 100644
--- a/Plausible.Stats.FilterParser.html
+++ b/Plausible.Stats.FilterParser.html
@@ -207,14 +207,14 @@ Pages
Examples:
-
iex> FilterParser.parse_filters("{\"page\":\"/blog/**\"}")
-%{"page" => "/blog/**"}
+iex> FilterParser.parse_filters("{\"page\":\"/blog/**\"}")
+%{"page" => "/blog/**"}
-iex> FilterParser.parse_filters("visit:browser!=Chrome")
-%{"visit:browser" => {:is_not, "Chrome"}}
+iex> FilterParser.parse_filters("visit:browser!=Chrome")
+%{"visit:browser" => {:is_not, "Chrome"}}
-iex> FilterParser.parse_filters(nil)
-%{}
+iex> FilterParser.parse_filters(nil)
+%{}
diff --git a/Plausible.epub b/Plausible.epub
index c147d0efd393532076c2d1676420b878195f98f7..992ff99e91ee3f2eb6608f62fe48360a4c394f64 100644
GIT binary patch
delta 126021
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