From 418fa225400940e5cd8e14ab2dbb72593cf76360 Mon Sep 17 00:00:00 2001
From: "github-merge-queue[bot]"
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 e52ca76a12..7c3136130d 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 5696f39764..3e509d8910 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 f8019ea1ac..cbffbca1bf 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 441c576eb5..4a7fa9e762 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 e87d24d0fa..0beb94d284 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 54ed9638e8..adaa9e4a61 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 02c832e6c6..3d65309ee2 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 3ea6cd5908..e20acb67b2 100644
--- a/Plausible.ClickhouseRepo.html
+++ b/Plausible.ClickhouseRepo.html
@@ -879,23 +879,23 @@ pool to disconnect within the given interval.
diff --git a/Plausible.DataMigration.ClickhouseRepo.html b/Plausible.DataMigration.ClickhouseRepo.html
index 91b41670b1..9236951437 100644
--- a/Plausible.DataMigration.ClickhouseRepo.html
+++ b/Plausible.DataMigration.ClickhouseRepo.html
@@ -1196,23 +1196,23 @@ pool to disconnect within the given interval.See
-Similar to insert_all/2
but with the following differences:
- accepts rows as streams or lists
- sends rows as a chunked request
- doesn't autogenerate ids or does any other preprocessing
Example:
Repo.query!("create table ecto_ch_demo(a UInt64, b String) engine Null")
+Similar to insert_all/2
but with the following differences:
- accepts rows as streams or lists
- sends rows as a chunked request
- doesn't autogenerate ids or does any other preprocessing
Example:
Repo.query!("create table ecto_ch_demo(a UInt64, b String) engine Null")
-defmodule Demo do
+defmodule Demo do
use Ecto.Schema
@primary_key false
- schema "ecto_ch_demo" do
+ schema "ecto_ch_demo" do
field :a, Ch, type: "UInt64"
field :b, :string
- end
-end
+ end
+end
-rows = Stream.map(1..100_000, fn i -> %{a: i, b: to_string(i)} end)
-{100_000, nil} = Repo.insert_stream(Demo, rows)
+rows = Stream.map(1..100_000, fn i -> %{a: i, b: to_string(i)} end)
+{100_000, nil} = Repo.insert_stream(Demo, rows)
# schemaless
-{100_000, nil} = Repo.insert_stream("ecto_ch_demo", rows, types: [a: Ch.Types.u64(), b: :string])
+{100_000, nil} = Repo.insert_stream("ecto_ch_demo", rows, types: [a: Ch.Types.u64(), b: :string])
diff --git a/Plausible.Exports.html b/Plausible.Exports.html
index 411d3023b6..5b1e797a40 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 8c88ff33ae..aac7dbe83b 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 fe8bb1eb73..763869ed53 100644
--- a/Plausible.ImportDeletionRepo.html
+++ b/Plausible.ImportDeletionRepo.html
@@ -1187,23 +1187,23 @@ pool to disconnect within the given interval.See
-Similar to insert_all/2
but with the following differences:
- accepts rows as streams or lists
- sends rows as a chunked request
- doesn't autogenerate ids or does any other preprocessing
Example:
Repo.query!("create table ecto_ch_demo(a UInt64, b String) engine Null")
+Similar to insert_all/2
but with the following differences:
- accepts rows as streams or lists
- sends rows as a chunked request
- doesn't autogenerate ids or does any other preprocessing
Example:
Repo.query!("create table ecto_ch_demo(a UInt64, b String) engine Null")
-defmodule Demo do
+defmodule Demo do
use Ecto.Schema
@primary_key false
- schema "ecto_ch_demo" do
+ schema "ecto_ch_demo" do
field :a, Ch, type: "UInt64"
field :b, :string
- end
-end
+ end
+end
-rows = Stream.map(1..100_000, fn i -> %{a: i, b: to_string(i)} end)
-{100_000, nil} = Repo.insert_stream(Demo, rows)
+rows = Stream.map(1..100_000, fn i -> %{a: i, b: to_string(i)} end)
+{100_000, nil} = Repo.insert_stream(Demo, rows)
# schemaless
-{100_000, nil} = Repo.insert_stream("ecto_ch_demo", rows, types: [a: Ch.Types.u64(), b: :string])
+{100_000, nil} = Repo.insert_stream("ecto_ch_demo", rows, types: [a: Ch.Types.u64(), b: :string])
diff --git a/Plausible.Imported.CSVImporter.html b/Plausible.Imported.CSVImporter.html
index ad8922ef43..fe7907b13f 100644
--- a/Plausible.Imported.CSVImporter.html
+++ b/Plausible.Imported.CSVImporter.html
@@ -257,13 +257,13 @@ or from local storage for which it uses iex> date_range([
-...> %{"filename" => "imported_devices_20190101_20210101.csv"},
+Extracts min/max date range from a list of uploads.
Examples:
iex> date_range([
+...> %{"filename" => "imported_devices_20190101_20210101.csv"},
...> "pages_20200101_20220101.csv"
-...> ])
-Date.range(~D[2019-01-01], ~D[2022-01-01])
+...> ])
+Date.range(~D[2019-01-01], ~D[2022-01-01])
-iex> date_range([])
+iex> date_range([])
nil
@@ -292,13 +292,13 @@ or from local storage for which it uses iex> extract_table("my_data.csv")
+Extracts the table name from the provided filename.
Raises if the filename doesn't conform to the expected format.
Examples:
iex> extract_table("my_data.csv")
** (ArgumentError) invalid filename
-iex> extract_table("imported_devices_00010101_20250101.csv")
+iex> extract_table("imported_devices_00010101_20250101.csv")
"imported_devices"
-iex> extract_table("devices_00010101_20250101.csv")
+iex> extract_table("devices_00010101_20250101.csv")
"imported_devices"
@@ -321,8 +321,8 @@ or from local storage for which it uses
-Returns local directory for CSV imports storage.
Builds upon $DATA_DIR
, $PERSISTENT_CACHE_DIR
or $DEFAULT_DATA_DIR
(if set) and falls back to /tmp.
$DEFAULT_DATA_DIR
is set to /var/lib/plausible
in container images.
Examples:
iex> local_dir = local_dir(_site_id = 37)
-iex> String.ends_with?(local_dir, "/plausible-imports/37")
+Returns local directory for CSV imports storage.
Builds upon $DATA_DIR
, $PERSISTENT_CACHE_DIR
or $DEFAULT_DATA_DIR
(if set) and falls back to /tmp.
$DEFAULT_DATA_DIR
is set to /var/lib/plausible
in container images.
Examples:
iex> local_dir = local_dir(_site_id = 37)
+iex> String.ends_with?(local_dir, "/plausible-imports/37")
true
@@ -382,14 +382,14 @@ or from local storage for which it uses iex> parse_filename!("my_data.csv")
+Extracts table name and min/max dates from the filename.
Examples:
iex> parse_filename!("my_data.csv")
** (ArgumentError) invalid filename
-iex> parse_filename!("imported_devices_00010101_20250101.csv")
-{"imported_devices", ~D[0001-01-01], ~D[2025-01-01]}
+iex> parse_filename!("imported_devices_00010101_20250101.csv")
+{"imported_devices", ~D[0001-01-01], ~D[2025-01-01]}
-iex> parse_filename!("devices_00010101_20250101.csv")
-{"imported_devices", ~D[0001-01-01], ~D[2025-01-01]}
+iex> parse_filename!("devices_00010101_20250101.csv")
+{"imported_devices", ~D[0001-01-01], ~D[2025-01-01]}
@@ -417,13 +417,13 @@ or from local storage for which it uses iex> valid_filename?("my_data.csv")
+Checks if the provided filename conforms to the expected format.
Examples:
iex> valid_filename?("my_data.csv")
false
-iex> valid_filename?("imported_devices_00010101_20250101.csv")
+iex> valid_filename?("imported_devices_00010101_20250101.csv")
true
-iex> valid_filename?("devices_00010101_20250101.csv")
+iex> valid_filename?("devices_00010101_20250101.csv")
true
diff --git a/Plausible.Imported.Importer.html b/Plausible.Imported.Importer.html
index 5fca35d049..eba10152b8 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 56a66eda25..ee90b5f112 100644
--- a/Plausible.IngestRepo.html
+++ b/Plausible.IngestRepo.html
@@ -1217,23 +1217,23 @@ pool to disconnect within the given interval.See
-Similar to insert_all/2
but with the following differences:
- accepts rows as streams or lists
- sends rows as a chunked request
- doesn't autogenerate ids or does any other preprocessing
Example:
Repo.query!("create table ecto_ch_demo(a UInt64, b String) engine Null")
+Similar to insert_all/2
but with the following differences:
- accepts rows as streams or lists
- sends rows as a chunked request
- doesn't autogenerate ids or does any other preprocessing
Example:
Repo.query!("create table ecto_ch_demo(a UInt64, b String) engine Null")
-defmodule Demo do
+defmodule Demo do
use Ecto.Schema
@primary_key false
- schema "ecto_ch_demo" do
+ schema "ecto_ch_demo" do
field :a, Ch, type: "UInt64"
field :b, :string
- end
-end
+ end
+end
-rows = Stream.map(1..100_000, fn i -> %{a: i, b: to_string(i)} end)
-{100_000, nil} = Repo.insert_stream(Demo, rows)
+rows = Stream.map(1..100_000, fn i -> %{a: i, b: to_string(i)} end)
+{100_000, nil} = Repo.insert_stream(Demo, rows)
# schemaless
-{100_000, nil} = Repo.insert_stream("ecto_ch_demo", rows, types: [a: Ch.Types.u64(), b: :string])
+{100_000, nil} = Repo.insert_stream("ecto_ch_demo", rows, types: [a: Ch.Types.u64(), b: :string])
diff --git a/Plausible.S3.html b/Plausible.S3.html
index d8a679957d..68b31cc47e 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 ab3d3b0dc3..0c2c9d574a 100644
--- a/Plausible.Stats.Filters.html
+++ b/Plausible.Stats.Filters.html
@@ -396,14 +396,14 @@ does not handle AND/OR/NOT!
Examples:
-iex> Filters.parse("{\"page\":\"/blog/**\"}")
-[[:matches_wildcard, "event:page", ["/blog/**"]]]
+iex> Filters.parse("{\"page\":\"/blog/**\"}")
+[[:matches_wildcard, "event:page", ["/blog/**"]]]
-iex> Filters.parse("visit:browser!=Chrome")
-[[:is_not, "visit:browser", ["Chrome"]]]
+iex> Filters.parse("visit:browser!=Chrome")
+[[:is_not, "visit:browser", ["Chrome"]]]
-iex> Filters.parse(nil)
-[]
+iex> Filters.parse(nil)
+[]
diff --git a/Plausible.Stats.SQL.Fragments.html b/Plausible.Stats.SQL.Fragments.html
index 588c96787d..c4b0348f25 100644
--- a/Plausible.Stats.SQL.Fragments.html
+++ b/Plausible.Stats.SQL.Fragments.html
@@ -668,12 +668,12 @@ boundary, not_before
is returned.not_before
boundary is set to the past Saturday, which is before the
weekstart, therefore the cap does not apply. > this_wednesday = ~D[2022-11-09]
> past_saturday = ~D[2022-11-05]
- > weekstart_not_before(this_wednesday, past_saturday)
+ > weekstart_not_before(this_wednesday, past_saturday)
~D[2022-11-07]
In this other example, the fragment returns Tuesday and not the weekstart.
The not_before
boundary is set to Tuesday, which is past the weekstart,
therefore the cap applies.
> this_wednesday = ~D[2022-11-09]
> this_tuesday = ~D[2022-11-08]
- > weekstart_not_before(this_wednesday, this_tuesday)
+ > weekstart_not_before(this_wednesday, this_tuesday)
~D[2022-11-08]
diff --git a/Plausible.epub b/Plausible.epub
index ae2eb33e2ceeec458c9babf4a6a17f6aea785a21..e41f185e2e1b0eaf06242b10a2e79c17f3690a70 100644
GIT binary patch
delta 141766
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