From c751e958725a76aa0a7359ab8b1de4b5f4a456b3 Mon Sep 17 00:00:00 2001
From: mayel Perform a DELETE request. See Perform a DELETE request. See Perform a DELETE request. See Perform a DELETE request. See Perform a GET request. See Perform a GET request. See Perform a GET request. See Perform a GET request. See Perform a HEAD request. See Perform a HEAD request. See Perform a HEAD request. See Perform a HEAD request. See Perform a OPTIONS request. See Perform a OPTIONS request. See Perform a OPTIONS request. See Perform a OPTIONS request. See Perform a PATCH request. See Perform a PATCH request. See Perform a PATCH request. See Perform a PATCH request. See Perform a POST request. See Perform a POST request. See Perform a POST request. See Perform a POST request. See Perform a PUT request. See Perform a PUT request. See Perform a PUT request. See Perform a PUT request. See Perform a TRACE request. See Perform a TRACE request. See Perform a TRACE request. See Perform a TRACE request. See ACLs represent fully populated access control rules that can be reused.
-Can be reused to secure multiple objects, thus exists independently of any object. The table doesn't have any fields of its own:delete(client, url, opts)
-request/1
or request/2
for options definition.
+delete("/users")
-delete("/users", query: [scope: "admin"])
-delete(client, "/users")
-delete(client, "/users", query: [scope: "admin"])
-delete(client, "/users", body: %{name: "Jon"})
request/1
or request/2
for options definition.delete("/users")
+delete("/users", query: [scope: "admin"])
+delete(client, "/users")
+delete(client, "/users", query: [scope: "admin"])
+delete(client, "/users", body: %{name: "Jon"})
delete!(client, url, opts)
-request!/1
or request!/2
for options definition.
+delete!("/users")
-delete!("/users", query: [scope: "admin"])
-delete!(client, "/users")
-delete!(client, "/users", query: [scope: "admin"])
-delete!(client, "/users", body: %{name: "Jon"})
request!/1
or request!/2
for options definition.delete!("/users")
+delete!("/users", query: [scope: "admin"])
+delete!(client, "/users")
+delete!(client, "/users", query: [scope: "admin"])
+delete!(client, "/users", body: %{name: "Jon"})
get(client, url, opts)
-request/1
or request/2
for options definition.
+get("/users")
-get("/users", query: [scope: "admin"])
-get(client, "/users")
-get(client, "/users", query: [scope: "admin"])
-get(client, "/users", body: %{name: "Jon"})
request/1
or request/2
for options definition.get("/users")
+get("/users", query: [scope: "admin"])
+get(client, "/users")
+get(client, "/users", query: [scope: "admin"])
+get(client, "/users", body: %{name: "Jon"})
get!(client, url, opts)
-request!/1
or request!/2
for options definition.
+get!("/users")
-get!("/users", query: [scope: "admin"])
-get!(client, "/users")
-get!(client, "/users", query: [scope: "admin"])
-get!(client, "/users", body: %{name: "Jon"})
request!/1
or request!/2
for options definition.get!("/users")
+get!("/users", query: [scope: "admin"])
+get!(client, "/users")
+get!(client, "/users", query: [scope: "admin"])
+get!(client, "/users", body: %{name: "Jon"})
head(client, url, opts)
-request/1
or request/2
for options definition.
+head("/users")
-head("/users", query: [scope: "admin"])
-head(client, "/users")
-head(client, "/users", query: [scope: "admin"])
-head(client, "/users", body: %{name: "Jon"})
request/1
or request/2
for options definition.head("/users")
+head("/users", query: [scope: "admin"])
+head(client, "/users")
+head(client, "/users", query: [scope: "admin"])
+head(client, "/users", body: %{name: "Jon"})
head!(client, url, opts)
-request!/1
or request!/2
for options definition.
+head!("/users")
-head!("/users", query: [scope: "admin"])
-head!(client, "/users")
-head!(client, "/users", query: [scope: "admin"])
-head!(client, "/users", body: %{name: "Jon"})
request!/1
or request!/2
for options definition.head!("/users")
+head!("/users", query: [scope: "admin"])
+head!(client, "/users")
+head!(client, "/users", query: [scope: "admin"])
+head!(client, "/users", body: %{name: "Jon"})
options(client, url, opts)
-request/1
or request/2
for options definition.
+options("/users")
-options("/users", query: [scope: "admin"])
-options(client, "/users")
-options(client, "/users", query: [scope: "admin"])
-options(client, "/users", body: %{name: "Jon"})
request/1
or request/2
for options definition.options("/users")
+options("/users", query: [scope: "admin"])
+options(client, "/users")
+options(client, "/users", query: [scope: "admin"])
+options(client, "/users", body: %{name: "Jon"})
options!(client, url, opts)
-request!/1
or request!/2
for options definition.
+options!("/users")
-options!("/users", query: [scope: "admin"])
-options!(client, "/users")
-options!(client, "/users", query: [scope: "admin"])
-options!(client, "/users", body: %{name: "Jon"})
request!/1
or request!/2
for options definition.options!("/users")
+options!("/users", query: [scope: "admin"])
+options!(client, "/users")
+options!(client, "/users", query: [scope: "admin"])
+options!(client, "/users", body: %{name: "Jon"})
patch(client, url, body, opts)
-request/1
or request/2
for options definition.
+patch("/users", %{name: "Jon"})
-patch("/users", %{name: "Jon"}, query: [scope: "admin"])
-patch(client, "/users", %{name: "Jon"})
-patch(client, "/users", %{name: "Jon"}, query: [scope: "admin"])
request/1
or request/2
for options definition.patch("/users", %{name: "Jon"})
+patch("/users", %{name: "Jon"}, query: [scope: "admin"])
+patch(client, "/users", %{name: "Jon"})
+patch(client, "/users", %{name: "Jon"}, query: [scope: "admin"])
patch!(client, url, body, opts)
-request!/1
or request!/2
for options definition.
+patch!("/users", %{name: "Jon"})
-patch!("/users", %{name: "Jon"}, query: [scope: "admin"])
-patch!(client, "/users", %{name: "Jon"})
-patch!(client, "/users", %{name: "Jon"}, query: [scope: "admin"])
request!/1
or request!/2
for options definition.patch!("/users", %{name: "Jon"})
+patch!("/users", %{name: "Jon"}, query: [scope: "admin"])
+patch!(client, "/users", %{name: "Jon"})
+patch!(client, "/users", %{name: "Jon"}, query: [scope: "admin"])
post(client, url, body, opts)
-request/1
or request/2
for options definition.
+post("/users", %{name: "Jon"})
-post("/users", %{name: "Jon"}, query: [scope: "admin"])
-post(client, "/users", %{name: "Jon"})
-post(client, "/users", %{name: "Jon"}, query: [scope: "admin"])
request/1
or request/2
for options definition.post("/users", %{name: "Jon"})
+post("/users", %{name: "Jon"}, query: [scope: "admin"])
+post(client, "/users", %{name: "Jon"})
+post(client, "/users", %{name: "Jon"}, query: [scope: "admin"])
post!(client, url, body, opts)
-request!/1
or request!/2
for options definition.
+post!("/users", %{name: "Jon"})
-post!("/users", %{name: "Jon"}, query: [scope: "admin"])
-post!(client, "/users", %{name: "Jon"})
-post!(client, "/users", %{name: "Jon"}, query: [scope: "admin"])
request!/1
or request!/2
for options definition.post!("/users", %{name: "Jon"})
+post!("/users", %{name: "Jon"}, query: [scope: "admin"])
+post!(client, "/users", %{name: "Jon"})
+post!(client, "/users", %{name: "Jon"}, query: [scope: "admin"])
put(client, url, body, opts)
-request/1
or request/2
for options definition.
+put("/users", %{name: "Jon"})
-put("/users", %{name: "Jon"}, query: [scope: "admin"])
-put(client, "/users", %{name: "Jon"})
-put(client, "/users", %{name: "Jon"}, query: [scope: "admin"])
request/1
or request/2
for options definition.put("/users", %{name: "Jon"})
+put("/users", %{name: "Jon"}, query: [scope: "admin"])
+put(client, "/users", %{name: "Jon"})
+put(client, "/users", %{name: "Jon"}, query: [scope: "admin"])
put!(client, url, body, opts)
-request!/1
or request!/2
for options definition.
+put!("/users", %{name: "Jon"})
-put!("/users", %{name: "Jon"}, query: [scope: "admin"])
-put!(client, "/users", %{name: "Jon"})
-put!(client, "/users", %{name: "Jon"}, query: [scope: "admin"])
request!/1
or request!/2
for options definition.put!("/users", %{name: "Jon"})
+put!("/users", %{name: "Jon"}, query: [scope: "admin"])
+put!(client, "/users", %{name: "Jon"})
+put!(client, "/users", %{name: "Jon"}, query: [scope: "admin"])
request(client \\ %Tesla.Client{}, options)
Examples
-
ExampleApi.request(method: :get, url: "/users/path")
+
+ExampleApi.get("/users/1")
+ExampleApi.post(client, "/users", %{name: "Jon"})ExampleApi.request(method: :get, url: "/users/path")
# use shortcut methods
-ExampleApi.get("/users/1")
-ExampleApi.post(client, "/users", %{name: "Jon"})
trace(client, url, opts)
-request/1
or request/2
for options definition.
+trace("/users")
-trace("/users", query: [scope: "admin"])
-trace(client, "/users")
-trace(client, "/users", query: [scope: "admin"])
-trace(client, "/users", body: %{name: "Jon"})
request/1
or request/2
for options definition.trace("/users")
+trace("/users", query: [scope: "admin"])
+trace(client, "/users")
+trace(client, "/users", query: [scope: "admin"])
+trace(client, "/users", body: %{name: "Jon"})
trace!(client, url, opts)
-request!/1
or request!/2
for options definition.
+trace!("/users")
-trace!("/users", query: [scope: "admin"])
-trace!(client, "/users")
-trace!(client, "/users", query: [scope: "admin"])
-trace!(client, "/users", body: %{name: "Jon"})
request!/1
or request!/2
for options definition.trace!("/users")
+trace!("/users", query: [scope: "admin"])
+trace!(client, "/users")
+trace!(client, "/users", query: [scope: "admin"])
+trace!(client, "/users", body: %{name: "Jon"})
+Can be reused to secure multiple objects, thus exists independently of any object.has_many(:grants, Grant)
-has_many(:controlled, Controlled)
The table doesn't have any fields of its own:
has_many(:grants, Grant)
+has_many(:controlled, Controlled)
diff --git a/Bonfire.Common.Errors.html b/Bonfire.Common.Errors.html
index bace01c4238..936cc64c5bc 100644
--- a/Bonfire.Common.Errors.html
+++ b/Bonfire.Common.Errors.html
@@ -495,12 +495,12 @@ iex> Exception.format_mfa(Foo, :bar, 1)
-{Foo, :bar, "Foo.bar/1"}
-iex> Exception.format_mfa(Foo, :bar, [])
-{Foo, :bar, "Foo.bar()"}
-iex> Exception.format_mfa(nil, :bar, [])
-{nil, :bar, "nil.bar()"}
Anonymous functions are reported as -func/arity-anonfn-count-, +
iex> Exception.format_mfa(Foo, :bar, 1)
+{Foo, :bar, "Foo.bar/1"}
+iex> Exception.format_mfa(Foo, :bar, [])
+{Foo, :bar, "Foo.bar()"}
+iex> Exception.format_mfa(nil, :bar, [])
+{nil, :bar, "nil.bar()"}
Anonymous functions are reported as -func/arity-anonfn-count-, where func is the name of the enclosing function. Convert to "anonymous fn in func/arity"
diff --git a/Bonfire.Common.Localise.Cldr.AcceptLanguage.html b/Bonfire.Common.Localise.Cldr.AcceptLanguage.html index 10134e89d75..d445f94739f 100644 --- a/Bonfire.Common.Localise.Cldr.AcceptLanguage.html +++ b/Bonfire.Common.Localise.Cldr.AcceptLanguage.html @@ -142,7 +142,7 @@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."
@@ -255,54 +255,54 @@iex> Bonfire.Common.Localise.Cldr.AcceptLanguage.best_match("da;q=0.1,zh-TW;q=0.3", TestBackend.Cldr)
-{:ok,
- %Cldr.LanguageTag{
+iex> Bonfire.Common.Localise.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> Bonfire.Common.Localise.Cldr.AcceptLanguage.best_match("da;q=0.1,zh-TW;q=0.3", TestBackend.Cldr)
-{:ok,
- %Cldr.LanguageTag{
+iex> Bonfire.Common.Localise.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: []
- }}
-
-iex> Bonfire.Common.Localise.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> Bonfire.Common.Localise.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"}}
+ transform: %{},
+ language_variants: []
+ }}
+
+iex> Bonfire.Common.Localise.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> Bonfire.Common.Localise.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> 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: []
- }}
- ]}
-
-iex> Bonfire.Common.Localise.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> Bonfire.Common.Localise.Cldr.AcceptLanguage.parse("da,zh-TW;q=0.3,invalid_tag")
-{:ok,
- [
- {1.0,
- %Cldr.LanguageTag{
+ transform: %{},
+ language_variants: []
+ }}
+ ]}
+
+iex> Bonfire.Common.Localise.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> Bonfire.Common.Localise.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"}}
+ ]}
iex> Bonfire.Common.Localise.Cldr.AcceptLanguage.parse!("da,zh-TW;q=0.3")
-[
- {1.0,
- %Cldr.LanguageTag{
+iex> Bonfire.Common.Localise.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: []
+ }}
+]
Bonfire.Common.Localise.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> Bonfire.Common.Localise.Cldr.AcceptLanguage.parse!("da,zh-TW;q=0.3,invalid_tag")
-[
- {1.0,
- %Cldr.LanguageTag{
+iex> Bonfire.Common.Localise.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"}}
+]
iex> Bonfire.Common.Localise.Cldr.Calendar.calendar_from_locale "en-GB"
-{:ok, Cldr.Calendar.GB}
+{:ok, Cldr.Calendar.GB}
iex> Bonfire.Common.Localise.Cldr.Calendar.calendar_from_locale "en-GB-u-ca-gregory"
-{:ok, Cldr.Calendar.Gregorian}
+{:ok, Cldr.Calendar.Gregorian}
iex> Bonfire.Common.Localise.Cldr.Calendar.calendar_from_locale "en"
-{:ok, Cldr.Calendar.US}
+{:ok, Cldr.Calendar.US}
iex> Bonfire.Common.Localise.Cldr.Calendar.calendar_from_locale "fa-IR"
-{:ok, Cldr.Calendar.Persian}
+{:ok, Cldr.Calendar.Persian}
iex> Bonfire.Common.Localise.Cldr.Calendar.calendar_from_territory :US
-{:ok, Cldr.Calendar.Gregorian}
+{:ok, Cldr.Calendar.Gregorian}
iex> Bonfire.Common.Localise.Cldr.Calendar.calendar_from_territory :XX
-{:error, {Cldr.UnknownTerritoryError, "The territory :XX is unknown"}}
iex: MyApp.Cldr.Calendar.strftime_options!
-[
- am_pm_names: #Function<0.32021692/1 in MyApp.Cldr.Calendar.strftime_options/2>,
- month_names: #Function<1.32021692/1 in MyApp.Cldr.Calendar.strftime_options/2>,
- abbreviated_month_names: #Function<2.32021692/1 in MyApp.Cldr.Calendar.strftime_options/2>,
- day_of_week_names: #Function<3.32021692/1 in MyApp.Cldr.Calendar.strftime_options/2>,
- abbreviated_day_of_week_names: #Function<4.32021692/1 in MyApp.Cldr.Calendar.strftime_options/2>
-]
iex: NimbleStrftime.format(Date.today(), MyApp.Cldr.Calendar.strftime_options!())
+iex: NimbleStrftime.format(Date.today(), MyApp.Cldr.Calendar.strftime_options!())
MyApp.Cldr.Currency.currencies_for_locale("en") => {:ok, - %{
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,
@@ -427,12 +427,12 @@ currencies_for_locale(locale, only \\ :all,
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,
@@ -442,7 +442,7 @@ currencies_for_locale(locale, only \\ :all,
symbol: "SUR",
tender: true,
to: nil
- },
+ },
...
}}
@@ -493,11 +493,11 @@ currencies_for_locale!(locale, only \\ :all
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,
@@ -507,12 +507,12 @@ currencies_for_locale!(locale, only \\ :all
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,
@@ -522,7 +522,7 @@ currencies_for_locale!(locale, only \\ :all
symbol: "SUR",
tender: true,
to: nil
-},
+},
...
}
@@ -580,13 +580,13 @@ currency_for_code(currency_or_currency_code
Examples
-iex> Bonfire.Common.Localise.Cldr.Currency.currency_for_code("AUD")
-{:ok,
- %Cldr.Currency{
+iex> Bonfire.Common.Localise.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",
@@ -594,15 +594,15 @@ currency_for_code(currency_or_currency_code
rounding: 0,
symbol: "A$",
tender: true
-}}
+}}
-iex> Bonfire.Common.Localise.Cldr.Currency.currency_for_code("THB")
-{:ok,
- %Cldr.Currency{
+iex> Bonfire.Common.Localise.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",
@@ -610,7 +610,7 @@ currency_for_code(currency_or_currency_code
rounding: 0,
symbol: "THB",
tender: true
-}}
+}}
@@ -669,12 +669,12 @@ currency_for_code!(currency_or_currency_cod
Examples
-iex> Bonfire.Common.Localise.Cldr.Currency.currency_for_code!("AUD")
-%Cldr.Currency{
+iex> Bonfire.Common.Localise.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",
@@ -682,14 +682,14 @@ currency_for_code!(currency_or_currency_cod
rounding: 0,
symbol: "A$",
tender: true
-}
+}
-iex> Bonfire.Common.Localise.Cldr.Currency.currency_for_code!("THB")
-%Cldr.Currency{
+iex> Bonfire.Common.Localise.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",
@@ -697,7 +697,7 @@ currency_for_code!(currency_or_currency_cod
rounding: 0,
symbol: "THB",
tender: true
-}
+}
@@ -738,15 +738,15 @@ currency_from_locale(locale)
Examples
-iex> {:ok, locale} = Bonfire.Common.Localise.Cldr.validate_locale("en")
+iex> {:ok, locale} = Bonfire.Common.Localise.Cldr.validate_locale("en")
iex> Bonfire.Common.Localise.Cldr.Currency.currency_from_locale locale
:USD
-iex> {:ok, locale} = Bonfire.Common.Localise.Cldr.validate_locale("en-AU")
+iex> {:ok, locale} = Bonfire.Common.Localise.Cldr.validate_locale("en-AU")
iex> Bonfire.Common.Localise.Cldr.Currency.currency_from_locale locale
:AUD
-iex> Bonfire.Common.Localise.Cldr.Currency.currency_from_locale("en-GB")
+iex> Bonfire.Common.Localise.Cldr.Currency.currency_from_locale("en-GB")
:GBP
@@ -790,14 +790,14 @@ currency_history_for_locale(language_tag)
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]}
+ }
+}
@@ -856,9 +856,9 @@ currency_strings(locale, only \\ :all, exce
Example
-MyApp.Cldr.Currency.currency_strings("en")
-=> {:ok,
- %{
+MyApp.Cldr.Currency.currency_strings("en")
+=> {:ok,
+ %{
"mexican silver pesos" => :MXP,
"sudanese dinar" => :SDD,
"bad" => :BAD,
@@ -868,7 +868,7 @@ currency_strings(locale, only \\ :all, exce
"guyanaese dollars" => :GYD,
"equatorial guinean ekwele" => :GQE,
...
- }}
+ }}
@@ -927,8 +927,8 @@ currency_strings!(locale_name, only \\ :all
Example
-MyApp.Cldr.Currency.currency_strings!("en")
-=> %{
+MyApp.Cldr.Currency.currency_strings!("en")
+=> %{
"mexican silver pesos" => :MXP,
"sudanese dinar" => :SDD,
"bad" => :BAD,
@@ -938,7 +938,7 @@ currency_strings!(locale_name, only \\ :all
"guyanaese dollars" => :GYD,
"equatorial guinean ekwele" => :GQE,
...
- }
+ }
@@ -976,10 +976,10 @@ current_currency_from_locale(locale)
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
@@ -1027,7 +1027,7 @@ current_territory_currencies()
Example
-iex> Bonfire.Common.Localise.Cldr.Currency.current_territory_currencies()
+iex> Bonfire.Common.Localise.Cldr.Currency.current_territory_currencies()
@@ -1119,11 +1119,11 @@ known_currency_code(currency_code)
Examples
-iex> Bonfire.Common.Localise.Cldr.Currency.known_currency_code("AUD")
-{:ok, :AUD}
+iex> Bonfire.Common.Localise.Cldr.Currency.known_currency_code("AUD")
+{:ok, :AUD}
-iex> Bonfire.Common.Localise.Cldr.Currency.known_currency_code("GGG")
-{:error, {Cldr.UnknownCurrencyError, "The currency \"GGG\" is invalid"}}
+iex> Bonfire.Common.Localise.Cldr.Currency.known_currency_code("GGG")
+{:error, {Cldr.UnknownCurrencyError, "The currency \"GGG\" is invalid"}}
@@ -1170,13 +1170,13 @@ known_currency_code?(currency_code)
Examples
-iex> Bonfire.Common.Localise.Cldr.Currency.known_currency_code?("AUD")
+iex> Bonfire.Common.Localise.Cldr.Currency.known_currency_code?("AUD")
true
-iex> Bonfire.Common.Localise.Cldr.Currency.known_currency_code?("GGG")
+iex> Bonfire.Common.Localise.Cldr.Currency.known_currency_code?("GGG")
false
-iex> Bonfire.Common.Localise.Cldr.Currency.known_currency_code?(:XCV)
+iex> Bonfire.Common.Localise.Cldr.Currency.known_currency_code?(:XCV)
false
@@ -1211,7 +1211,7 @@ known_currency_codes()
Example
-iex> Bonfire.Common.Localise.Cldr.Currency.known_currency_codes()
+iex> Bonfire.Common.Localise.Cldr.Currency.known_currency_codes()
@@ -1270,14 +1270,14 @@ new(currency, options \\ [])
Example
-iex> Bonfire.Common.Localise.Cldr.Currency.new(:XAE, name: "Custom Name", digits: 0)
-{:ok,
- %Cldr.Currency{
+iex> Bonfire.Common.Localise.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,
@@ -1287,11 +1287,11 @@ new(currency, options \\ [])
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> Bonfire.Common.Localise.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> Bonfire.Common.Localise.Cldr.Currency.new(:XAE, name: "XAE", digits: 0)
+{:error, {Cldr.CurrencyAlreadyDefined, "Currency :XAE is already defined."}}
@@ -1349,20 +1349,20 @@ pluralize(number, currency, options \\ [])<
Examples
-iex> Bonfire.Common.Localise.Cldr.Currency.pluralize(1, :USD)
-{:ok, "US dollar"}
+iex> Bonfire.Common.Localise.Cldr.Currency.pluralize(1, :USD)
+{:ok, "US dollar"}
-iex> Bonfire.Common.Localise.Cldr.Currency.pluralize(3, :USD)
-{:ok, "US dollars"}
+iex> Bonfire.Common.Localise.Cldr.Currency.pluralize(3, :USD)
+{:ok, "US dollars"}
-iex> Bonfire.Common.Localise.Cldr.Currency.pluralize(12, :USD, locale: "zh")
-{:ok, "美元"}
+iex> Bonfire.Common.Localise.Cldr.Currency.pluralize(12, :USD, locale: "zh")
+{:ok, "美元"}
-iex> Bonfire.Common.Localise.Cldr.Currency.pluralize(12, :USD, locale: "fr")
-{:ok, "dollars des États-Unis"}
+iex> Bonfire.Common.Localise.Cldr.Currency.pluralize(12, :USD, locale: "fr")
+{:ok, "dollars des États-Unis"}
-iex> Bonfire.Common.Localise.Cldr.Currency.pluralize(1, :USD, locale: "fr")
-{:ok, "dollar des États-Unis"}
+iex> Bonfire.Common.Localise.Cldr.Currency.pluralize(1, :USD, locale: "fr")
+{:ok, "dollar des États-Unis"}
@@ -1404,8 +1404,8 @@ strings_for_currency(currency, locale)
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/Bonfire.Common.Localise.Cldr.Date.Interval.html b/Bonfire.Common.Localise.Cldr.Date.Interval.html
index 8c007b416b5..5c783d221eb 100644
--- a/Bonfire.Common.Localise.Cldr.Date.Interval.html
+++ b/Bonfire.Common.Localise.Cldr.Date.Interval.html
@@ -296,30 +296,30 @@ to_string(from, to, options)
Examples
iex> Bonfire.Common.Localise.Cldr.Date.Interval.to_string ~D[2020-01-01], ~D[2020-12-31]
-{:ok, "Jan 1 – Dec 31, 2020"}
+{:ok, "Jan 1 – Dec 31, 2020"}
iex> Bonfire.Common.Localise.Cldr.Date.Interval.to_string ~D[2020-01-01], ~D[2020-01-12]
-{:ok, "Jan 1 – 12, 2020"}
+{:ok, "Jan 1 – 12, 2020"}
iex> Bonfire.Common.Localise.Cldr.Date.Interval.to_string ~D[2020-01-01], ~D[2020-01-12],
...> format: :long
-{:ok, "Wed, Jan 1 – Sun, Jan 12, 2020"}
+{:ok, "Wed, Jan 1 – Sun, Jan 12, 2020"}
iex> Bonfire.Common.Localise.Cldr.Date.Interval.to_string ~D[2020-01-01], ~D[2020-12-01],
...> format: :long, style: :year_and_month
-{:ok, "January – December 2020"}
+{:ok, "January – December 2020"}
iex> Bonfire.Common.Localise.Cldr.Date.Interval.to_string ~D[2020-01-01], ~D[2020-01-12],
...> format: :short
-{:ok, "1/1/2020 – 1/12/2020"}
+{:ok, "1/1/2020 – 1/12/2020"}
iex> Bonfire.Common.Localise.Cldr.Date.Interval.to_string ~D[2020-01-01], ~D[2020-01-12],
...> format: :long, locale: "fr"
-{:ok, "mer. 1 – dim. 12 janv. 2020"}
+{:ok, "mer. 1 – dim. 12 janv. 2020"}
iex> Bonfire.Common.Localise.Cldr.Date.Interval.to_string ~D[2020-01-01], ~D[2020-01-12],
...> format: :long, locale: "th", number_system: :thai
-{:ok, "พ. ๑ ม.ค. – อา. ๑๒ ม.ค. ๒๐๒๐"}
+
{:ok, "พ. ๑ ม.ค. – อา. ๑๒ ม.ค. ๒๐๒๐"}
@@ -396,17 +396,17 @@ to_string!(from, to, options)
Examples
-iex> Bonfire.Common.Localise.Cldr.Date.Interval.to_string! Date.range(~D[2020-01-01], ~D[2020-12-31])
+iex> Bonfire.Common.Localise.Cldr.Date.Interval.to_string! Date.range(~D[2020-01-01], ~D[2020-12-31])
"Jan 1 – Dec 31, 2020"
-iex> Bonfire.Common.Localise.Cldr.Date.Interval.to_string! Date.range(~D[2020-01-01], ~D[2020-01-12])
+iex> Bonfire.Common.Localise.Cldr.Date.Interval.to_string! Date.range(~D[2020-01-01], ~D[2020-01-12])
"Jan 1 – 12, 2020"
-iex> Bonfire.Common.Localise.Cldr.Date.Interval.to_string! Date.range(~D[2020-01-01], ~D[2020-01-12]),
+iex> Bonfire.Common.Localise.Cldr.Date.Interval.to_string! Date.range(~D[2020-01-01], ~D[2020-01-12]),
...> format: :long
"Wed, Jan 1 – Sun, Jan 12, 2020"
-iex> Bonfire.Common.Localise.Cldr.Date.Interval.to_string! Date.range(~D[2020-01-01], ~D[2020-12-01]),
+iex> Bonfire.Common.Localise.Cldr.Date.Interval.to_string! Date.range(~D[2020-01-01], ~D[2020-12-01]),
...> format: :long, style: :year_and_month
"January – December 2020"
@@ -414,11 +414,11 @@ to_string!(from, to, options)
iex> Bonfire.Common.Localise.Cldr.Date.Interval.to_string! ~I"2020-01/12"
"Jan 1 – Dec 31, 2020"
-iex> Bonfire.Common.Localise.Cldr.Date.Interval.to_string! Date.range(~D[2020-01-01], ~D[2020-01-12]),
+iex> Bonfire.Common.Localise.Cldr.Date.Interval.to_string! Date.range(~D[2020-01-01], ~D[2020-01-12]),
...> format: :short
"1/1/2020 – 1/12/2020"
-iex> Bonfire.Common.Localise.Cldr.Date.Interval.to_string! Date.range(~D[2020-01-01], ~D[2020-01-12]),
+iex> Bonfire.Common.Localise.Cldr.Date.Interval.to_string! Date.range(~D[2020-01-01], ~D[2020-01-12]),
...> format: :long, locale: "fr"
"mer. 1 – dim. 12 janv. 2020"
diff --git a/Bonfire.Common.Localise.Cldr.Date.html b/Bonfire.Common.Localise.Cldr.Date.html
index cc2c943c240..a769711fc1b 100644
--- a/Bonfire.Common.Localise.Cldr.Date.html
+++ b/Bonfire.Common.Localise.Cldr.Date.html
@@ -242,22 +242,22 @@ to_string(date, options \\ [])
Examples
iex> Bonfire.Common.Localise.Cldr.Date.to_string ~D[2017-07-10], format: :medium, locale: "en"
-{:ok, "Jul 10, 2017"}
+{:ok, "Jul 10, 2017"}
iex> Bonfire.Common.Localise.Cldr.Date.to_string ~D[2017-07-10], locale: "en"
-{:ok, "Jul 10, 2017"}
+{:ok, "Jul 10, 2017"}
iex> Bonfire.Common.Localise.Cldr.Date.to_string ~D[2017-07-10], format: :full, locale: "en"
-{:ok, "Monday, July 10, 2017"}
+{:ok, "Monday, July 10, 2017"}
iex> Bonfire.Common.Localise.Cldr.Date.to_string ~D[2017-07-10], format: :short, locale: "en"
-{:ok, "7/10/17"}
+{:ok, "7/10/17"}
iex> Bonfire.Common.Localise.Cldr.Date.to_string ~D[2017-07-10], format: :short, locale: "fr"
-{:ok, "10/07/2017"}
+{:ok, "10/07/2017"}
iex> Bonfire.Common.Localise.Cldr.Date.to_string ~D[2017-07-10], format: :long, locale: "af"
-{:ok, "10 Julie 2017"}
+{:ok, "10 Julie 2017"}
iex> Bonfire.Common.Localise.Cldr.DateTime.Format.calendars_for(:en)
-{:ok, [:buddhist, :chinese, :coptic, :dangi, :ethiopic, :ethiopic_amete_alem,
+iex> Bonfire.Common.Localise.Cldr.DateTime.Format.calendars_for(:en)
+{:ok, [:buddhist, :chinese, :coptic, :dangi, :ethiopic, :ethiopic_amete_alem,
:generic, :gregorian, :hebrew, :indian, :islamic, :islamic_civil,
- :islamic_rgsa, :islamic_tbla, :islamic_umalqura, :japanese, :persian, :roc]}
+ :islamic_rgsa, :islamic_tbla, :islamic_umalqura, :japanese, :persian, :roc]}
iex> Bonfire.Common.Localise.Cldr.DateTime.Format.date_formats(:en)
-{:ok, %Cldr.Date.Formats{
+iex> Bonfire.Common.Localise.Cldr.DateTime.Format.date_formats(:en)
+{:ok, %Cldr.Date.Formats{
full: "EEEE, MMMM d, y",
long: "MMMM d, y",
medium: "MMM d, y",
short: "M/d/yy"
-}}
+}}
-iex> Bonfire.Common.Localise.Cldr.DateTime.Format.date_formats(:en, :buddhist)
-{:ok, %Cldr.Date.Formats{
+iex> Bonfire.Common.Localise.Cldr.DateTime.Format.date_formats(:en, :buddhist)
+{:ok, %Cldr.Date.Formats{
full: "EEEE, MMMM d, y G",
long: "MMMM d, y G",
medium: "MMM d, y G",
short: "M/d/y GGGGG"
-}}
+}}
iex> Bonfire.Common.Localise.Cldr.DateTime.Format.date_time_at_formats(:en)
-{:ok, %Cldr.DateTime.Formats{
+iex> Bonfire.Common.Localise.Cldr.DateTime.Format.date_time_at_formats(:en)
+{:ok, %Cldr.DateTime.Formats{
full: "{1} 'at' {0}",
long: "{1} 'at' {0}",
medium: "{1}, {0}",
- short: "{1}, {0}"}
-}
+ short: "{1}, {0}"}
+}
-iex> Bonfire.Common.Localise.Cldr.DateTime.Format.date_time_at_formats(:en, :buddhist)
-{:ok, %Cldr.DateTime.Formats{
+iex> Bonfire.Common.Localise.Cldr.DateTime.Format.date_time_at_formats(:en, :buddhist)
+{:ok, %Cldr.DateTime.Formats{
full: "{1} 'at' {0}",
long: "{1} 'at' {0}",
medium: "{1}, {0}",
- short: "{1}, {0}"}
-}
+ short: "{1}, {0}"}
+}
iex> Bonfire.Common.Localise.Cldr.DateTime.Format.date_time_available_formats "en"
-{
+{
:ok,
- %{
+ %{
d: "d",
h: "h a",
hm: "h:mm a",
@@ -626,7 +626,7 @@ date_time_available_formats(locale \\ Bonfi
hmv: "h:mm a v",
ms: "mm:ss",
y: "y",
- yw: %{one: "'week' w 'of' Y", other: "'week' w 'of' Y"},
+ yw: %{one: "'week' w 'of' Y", other: "'week' w 'of' Y"},
Bh: "h B",
Bhm: "h:mm B",
Bhms: "h:mm:ss B",
@@ -652,7 +652,7 @@ date_time_available_formats(locale \\ Bonfi
MEd: "E, M/d",
MMM: "LLL",
MMMEd: "E, MMM d",
- MMMMW: %{one: "'week' W 'of' MMMM", other: "'week' W 'of' MMMM"},
+ MMMMW: %{one: "'week' W 'of' MMMM", other: "'week' W 'of' MMMM"},
MMMMd: "MMMM d",
MMMd: "MMM d",
Md: "M/d",
@@ -665,8 +665,8 @@ date_time_available_formats(locale \\ Bonfi
yMd: "M/d/y",
yQQQ: "QQQ y",
yQQQQ: "QQQQ y"
- }
-}
+ }
+}
iex> Bonfire.Common.Localise.Cldr.DateTime.Format.date_time_formats(:en)
-{:ok, %Cldr.DateTime.Formats{
+iex> Bonfire.Common.Localise.Cldr.DateTime.Format.date_time_formats(:en)
+{:ok, %Cldr.DateTime.Formats{
full: "{1}, {0}",
long: "{1}, {0}",
medium: "{1}, {0}",
short: "{1}, {0}"
-}}
+}}
-iex> Bonfire.Common.Localise.Cldr.DateTime.Format.date_time_formats(:en, :buddhist)
-{:ok, %Cldr.DateTime.Formats{
+iex> Bonfire.Common.Localise.Cldr.DateTime.Format.date_time_formats(:en, :buddhist)
+{:ok, %Cldr.DateTime.Formats{
full: "{1}, {0}",
long: "{1}, {0}",
medium: "{1}, {0}",
short: "{1}, {0}"
-}}
+}}
iex> Bonfire.Common.Localise.Cldr.DateTime.Format.date_time_interval_fallback :en, :gregorian
-[0, " – ", 1]
+[0, " – ", 1]
iex> Bonfire.Common.Localise.Cldr.DateTime.Format.gmt_format :en
-{:ok, ["GMT", 0]}
+{:ok, ["GMT", 0]}
iex> Bonfire.Common.Localise.Cldr.DateTime.Format.gmt_zero_format :en
-{:ok, "GMT"}
+{:ok, "GMT"}
iex> Bonfire.Common.Localise.Cldr.DateTime.Format.gmt_zero_format :fr
-{:ok, "UTC"}
+{:ok, "UTC"}
iex> Bonfire.Common.Localise.Cldr.DateTime.Format.hour_format "en"
-{:ok, {"+HH:mm", "-HH:mm"}}
+{:ok, {"+HH:mm", "-HH:mm"}}
iex> Bonfire.Common.Localise.Cldr.DateTime.Format.time_formats(:en)
-{:ok, %Cldr.Time.Formats{
+iex> Bonfire.Common.Localise.Cldr.DateTime.Format.time_formats(:en)
+{:ok, %Cldr.Time.Formats{
full: "h:mm:ss a zzzz",
long: "h:mm:ss a z",
medium: "h:mm:ss a",
short: "h:mm a"
-}}
+}}
-iex> Bonfire.Common.Localise.Cldr.DateTime.Format.time_formats(:en, :buddhist)
-{:ok, %Cldr.Time.Formats{
+iex> Bonfire.Common.Localise.Cldr.DateTime.Format.time_formats(:en, :buddhist)
+{:ok, %Cldr.Time.Formats{
full: "h:mm:ss a zzzz",
long: "h:mm:ss a z",
medium: "h:mm:ss a",
short: "h:mm a"
-}}
+}}
iex> Bonfire.Common.Localise.Cldr.DateTime.Formatter.format ~U[2017-09-03 10:23:00.0Z], "yy/MM/dd hh:MM", "en"
-{:ok, "17/09/03 10:09"}
+{:ok, "17/09/03 10:09"}
iex> Bonfire.Common.Localise.Cldr.DateTime.Interval.to_string ~U[2020-01-01 00:00:00.0Z],
...> ~U[2020-12-31 10:00:00.0Z]
-{:ok, "Jan 1, 2020, 12:00:00 AM – Dec 31, 2020, 10:00:00 AM"}
+{:ok, "Jan 1, 2020, 12:00:00 AM – Dec 31, 2020, 10:00:00 AM"}
iex> Bonfire.Common.Localise.Cldr.DateTime.Interval.to_string ~U[2020-01-01 00:00:00.0Z], nil
-{:ok, "Jan 1, 2020, 12:00:00 AM –"}
+{:ok, "Jan 1, 2020, 12:00:00 AM –"}
iex> Bonfire.Common.Localise.Cldr.DateTime.Relative.to_string(-1)
-{:ok, "1 second ago"}
+iex> Bonfire.Common.Localise.Cldr.DateTime.Relative.to_string(-1)
+{:ok, "1 second ago"}
-iex> Bonfire.Common.Localise.Cldr.DateTime.Relative.to_string(1)
-{:ok, "in 1 second"}
+iex> Bonfire.Common.Localise.Cldr.DateTime.Relative.to_string(1)
+{:ok, "in 1 second"}
-iex> Bonfire.Common.Localise.Cldr.DateTime.Relative.to_string(1, unit: :day)
-{:ok, "tomorrow"}
+iex> Bonfire.Common.Localise.Cldr.DateTime.Relative.to_string(1, unit: :day)
+{:ok, "tomorrow"}
-iex> Bonfire.Common.Localise.Cldr.DateTime.Relative.to_string(1, unit: :day, locale: "fr")
-{:ok, "demain"}
+iex> Bonfire.Common.Localise.Cldr.DateTime.Relative.to_string(1, unit: :day, locale: "fr")
+{:ok, "demain"}
-iex> Bonfire.Common.Localise.Cldr.DateTime.Relative.to_string(1, unit: :day, style: :narrow)
-{:ok, "tomorrow"}
+iex> Bonfire.Common.Localise.Cldr.DateTime.Relative.to_string(1, unit: :day, style: :narrow)
+{:ok, "tomorrow"}
-iex> Bonfire.Common.Localise.Cldr.DateTime.Relative.to_string(1234, unit: :year)
-{:ok, "in 1,234 years"}
+iex> Bonfire.Common.Localise.Cldr.DateTime.Relative.to_string(1234, unit: :year)
+{:ok, "in 1,234 years"}
-iex> Bonfire.Common.Localise.Cldr.DateTime.Relative.to_string(1234, unit: :year, locale: "fr")
-{:ok, "dans 1 234 ans"}
+iex> Bonfire.Common.Localise.Cldr.DateTime.Relative.to_string(1234, unit: :year, locale: "fr")
+{:ok, "dans 1 234 ans"}
-iex> Bonfire.Common.Localise.Cldr.DateTime.Relative.to_string(31)
-{:ok, "in 31 seconds"}
+iex> Bonfire.Common.Localise.Cldr.DateTime.Relative.to_string(31)
+{:ok, "in 31 seconds"}
-iex> Bonfire.Common.Localise.Cldr.DateTime.Relative.to_string(~D[2017-04-29], relative_to: ~D[2017-04-26])
-{:ok, "in 3 days"}
+iex> Bonfire.Common.Localise.Cldr.DateTime.Relative.to_string(~D[2017-04-29], relative_to: ~D[2017-04-26])
+{:ok, "in 3 days"}
-iex> Bonfire.Common.Localise.Cldr.DateTime.Relative.to_string(310, style: :short, locale: "fr")
-{:ok, "dans 5 min"}
+iex> Bonfire.Common.Localise.Cldr.DateTime.Relative.to_string(310, style: :short, locale: "fr")
+{:ok, "dans 5 min"}
-iex> Bonfire.Common.Localise.Cldr.DateTime.Relative.to_string(310, style: :narrow, locale: "fr")
-{:ok, "+5 min"}
+iex> Bonfire.Common.Localise.Cldr.DateTime.Relative.to_string(310, style: :narrow, locale: "fr")
+{:ok, "+5 min"}
iex> Bonfire.Common.Localise.Cldr.DateTime.Relative.to_string 2, unit: :wed, style: :short, locale: "en"
-{:ok, "in 2 Wed."}
+{:ok, "in 2 Wed."}
iex> Bonfire.Common.Localise.Cldr.DateTime.Relative.to_string 1, unit: :wed, style: :short
-{:ok, "next Wed."}
+{:ok, "next Wed."}
iex> Bonfire.Common.Localise.Cldr.DateTime.Relative.to_string -1, unit: :wed, style: :short
-{:ok, "last Wed."}
+{:ok, "last Wed."}
iex> Bonfire.Common.Localise.Cldr.DateTime.Relative.to_string -1, unit: :wed
-{:ok, "last Wednesday"}
+{:ok, "last Wednesday"}
iex> Bonfire.Common.Localise.Cldr.DateTime.Relative.to_string -1, unit: :quarter
-{:ok, "last quarter"}
+{:ok, "last quarter"}
iex> Bonfire.Common.Localise.Cldr.DateTime.Relative.to_string -1, unit: :mon, locale: "fr"
-{:ok, "lundi dernier"}
+{:ok, "lundi dernier"}
-iex> Bonfire.Common.Localise.Cldr.DateTime.Relative.to_string(~D[2017-04-29], unit: :ziggeraut)
-{:error, {Cldr.UnknownTimeUnit,
- "Unknown time unit :ziggeraut. Valid time units are [:day, :fri, :hour, :minute, :mon, :month, :quarter, :sat, :second, :sun, :thu, :tue, :wed, :week, :year]"}}
+iex> Bonfire.Common.Localise.Cldr.DateTime.Relative.to_string(~D[2017-04-29], unit: :ziggeraut)
+{:error, {Cldr.UnknownTimeUnit,
+ "Unknown time unit :ziggeraut. Valid time units are [:day, :fri, :hour, :minute, :mon, :month, :quarter, :sat, :second, :sun, :thu, :tue, :wed, :week, :year]"}}
iex> {:ok, datetime} = DateTime.from_naive(~N[2000-01-01 23:59:59.0], "Etc/UTC")
+iex> {:ok, datetime} = DateTime.from_naive(~N[2000-01-01 23:59:59.0], "Etc/UTC")
iex> Bonfire.Common.Localise.Cldr.DateTime.to_string datetime
-{:ok, "Jan 1, 2000, 11:59:59 PM"}
+{:ok, "Jan 1, 2000, 11:59:59 PM"}
iex> Bonfire.Common.Localise.Cldr.DateTime.to_string datetime, locale: "en"
-{:ok, "Jan 1, 2000, 11:59:59 PM"}
+{:ok, "Jan 1, 2000, 11:59:59 PM"}
iex> Bonfire.Common.Localise.Cldr.DateTime.to_string datetime, format: :long, locale: "en"
-{:ok, "January 1, 2000, 11:59:59 PM UTC"}
+{:ok, "January 1, 2000, 11:59:59 PM UTC"}
iex> Bonfire.Common.Localise.Cldr.DateTime.to_string datetime, format: :hms, locale: "en"
-{:ok, "11:59:59 PM"}
+{:ok, "11:59:59 PM"}
iex> Bonfire.Common.Localise.Cldr.DateTime.to_string datetime, format: :full, locale: "en"
-{:ok, "Saturday, January 1, 2000, 11:59:59 PM GMT"}
+{:ok, "Saturday, January 1, 2000, 11:59:59 PM GMT"}
iex> Bonfire.Common.Localise.Cldr.DateTime.to_string datetime, format: :full, locale: "fr"
-{:ok, "samedi 1 janvier 2000, 23:59:59 UTC"}
+{:ok, "samedi 1 janvier 2000, 23:59:59 UTC"}
iex> {:ok, datetime} = DateTime.from_naive(~N[2000-01-01 23:59:59.0], "Etc/UTC")
+iex> {:ok, datetime} = DateTime.from_naive(~N[2000-01-01 23:59:59.0], "Etc/UTC")
iex> Bonfire.Common.Localise.Cldr.DateTime.to_string! datetime, locale: "en"
"Jan 1, 2000, 11:59:59 PM"
iex> Bonfire.Common.Localise.Cldr.DateTime.to_string! datetime, format: :long, locale: "en"
diff --git a/Bonfire.Common.Localise.Cldr.Interval.html b/Bonfire.Common.Localise.Cldr.Interval.html
index 24bfffa2cad..1f1e53d11d7 100644
--- a/Bonfire.Common.Localise.Cldr.Interval.html
+++ b/Bonfire.Common.Localise.Cldr.Interval.html
@@ -306,11 +306,11 @@ to_string(interval, options)
iex> use CalendarInterval
iex> Bonfire.Common.Localise.Cldr.Interval.to_string ~I"2020-01-01/12",
...> format: :long
-{:ok, "Wed, Jan 1 – Sun, Jan 12, 2020"}
+{:ok, "Wed, Jan 1 – Sun, Jan 12, 2020"}
-iex> Bonfire.Common.Localise.Cldr.Interval.to_string Date.range(~D[2020-01-01], ~D[2020-12-31]),
+iex> Bonfire.Common.Localise.Cldr.Interval.to_string Date.range(~D[2020-01-01], ~D[2020-12-31]),
...> format: :long
-{:ok, "Wed, Jan 1 – Thu, Dec 31, 2020"}
+{:ok, "Wed, Jan 1 – Thu, Dec 31, 2020"}
iex> Bonfire.Common.Localise.Cldr.Interval.to_string ~D[2020-01-01], ~D[2020-12-31]
-{:ok, "Jan 1 – Dec 31, 2020"}
+{:ok, "Jan 1 – Dec 31, 2020"}
iex> Bonfire.Common.Localise.Cldr.Interval.to_string ~D[2020-01-01], ~D[2020-01-12]
-{:ok, "Jan 1 – 12, 2020"}
+{:ok, "Jan 1 – 12, 2020"}
iex> Bonfire.Common.Localise.Cldr.Interval.to_string ~D[2020-01-01], ~D[2020-01-12],
...> format: :long
-{:ok, "Wed, Jan 1 – Sun, Jan 12, 2020"}
+{:ok, "Wed, Jan 1 – Sun, Jan 12, 2020"}
iex> Bonfire.Common.Localise.Cldr.Interval.to_string ~D[2020-01-01], ~D[2020-12-01],
...> format: :long, style: :year_and_month
-{:ok, "January – December 2020"}
+{:ok, "January – December 2020"}
iex> use CalendarInterval
iex> Bonfire.Common.Localise.Cldr.Interval.to_string ~I"2020-01-01/12",
...> format: :long
-{:ok, "Wed, Jan 1 – Sun, Jan 12, 2020"}
+{:ok, "Wed, Jan 1 – Sun, Jan 12, 2020"}
iex> Bonfire.Common.Localise.Cldr.Interval.to_string ~U[2020-01-01 00:00:00.0Z], ~U[2020-12-01 10:05:00.0Z],
...> format: :long
-{:ok, "January 1, 2020, 12:00:00 AM UTC – December 1, 2020, 10:05:00 AM UTC"}
+{:ok, "January 1, 2020, 12:00:00 AM UTC – December 1, 2020, 10:05:00 AM UTC"}
iex> Bonfire.Common.Localise.Cldr.Interval.to_string ~U[2020-01-01 00:00:00.0Z], ~U[2020-01-01 10:05:00.0Z],
...> format: :long
-{:ok, "January 1, 2020, 12:00:00 AM UTC – 10:05:00 AM UTC"}
+{:ok, "January 1, 2020, 12:00:00 AM UTC – 10:05:00 AM UTC"}
> Bonfire.Common.Localise.Cldr.Language.Language.available_languages(:en)
-["aa", "ab", "ace", "ach", "ada", "ady", "ae", "aeb", "af", "afh", "agq", "ain",
+> Bonfire.Common.Localise.Cldr.Language.Language.available_languages(:en)
+["aa", "ab", "ace", "ach", "ada", "ady", "ae", "aeb", "af", "afh", "agq", "ain",
"ak", "akk", "akz", "ale", "aln", "alt", "am", "an", "ang", "anp", "ar",
"ar-001", "arc", "arn", "aro", "arp", "arq", "ars", "arw", "ary", "arz", "as",
"asa", "ase", "ast", "av", "avk", "awa", "ay", "az", "ba", "bal", "ban", "bar",
-"bas", "bax", "bbc", "bbj", ...]
+"bas", "bax", "bbc", "bbj", ...]
> Bonfire.Common.Localise.Cldr.Language.Language.known_languages(:en)
-%{"bez" => %{standard: "Bena"}, "lo" => %{standard: "Lao"},
-"kha" => %{standard: "Khasi"}, "eo" => %{standard: "Esperanto"},
-"rm" => %{standard: "Romansh"}, "ja" => %{standard: "Japanese"},
-"sw-CD" => %{standard: "Congo Swahili"},
-"pdc" => %{standard: "Pennsylvania German"}, "om" => %{standard: "Oromo"},
-"jut" => %{standard: "Jutish"}, "lij" => %{standard: "Ligurian"},
-"kut" => %{standard: "Kutenai"}, "vep" => %{standard: "Veps"},
-"yao" => %{standard: "Yao"}, "gez" => %{standard: "Geez"},
-"cr" => %{standard: "Cree"}, "ne" => %{standard: "Nepali"},
-"zbl" => %{standard: "Blissymbols"}, "ae" => %{standard: "Avestan"},
-"rof" => %{standard: "Rombo"}, "tkl" => %{standard: "Tokelau"},
-"rgn" => %{standard: "Romagnol"}, "el" => %{standard: "Greek"},
-"myv" => %{standard: "Erzya"}, "smj" => %{standard: "Lule Sami"},
-"fo" => %{standard: "Faroese"}, "ii" => %{standard: "Sichuan Yi"},
-"bum" => %{standard: "Bulu"}, "za" => %{standard: "Zhuang"},
-"raj" => %{standard: "Rajasthani"}, "mrj" => %{standard: "Western Mari"},
-"stq" => %{standard: "Saterland Frisian"}, "hu" => %{standard: "Hungarian"},
-"mga" => %{standard: "Middle Irish"}, "bej" => %{standard: "Beja"},
-"yue" => %{standard: "Cantonese"}, "xog" => %{standard: "Soga"},
-"ttt" => %{standard: "Muslim Tat"}, "uga" => %{standard: "Ugaritic"},
-"rup" => %{standard: "Aromanian"},
-"crs" => %{standard: "Seselwa Creole French"}, "oc" => %{standard: "Occitan"},
-"chp" => %{standard: "Chipewyan"}, "zen" => %{standard: "Zenaga"},
-"kmb" => %{standard: "Kimbundu"}, "nr" => %{standard: "South Ndebele"},
-"tiv" => %{standard: "Tiv"}, "aln" => %{standard: "Gheg Albanian"},
-"sh" => %{standard: "Serbo-Croatian"}, "fil" => %{...}, ...}
+> Bonfire.Common.Localise.Cldr.Language.Language.known_languages(:en)
+%{"bez" => %{standard: "Bena"}, "lo" => %{standard: "Lao"},
+"kha" => %{standard: "Khasi"}, "eo" => %{standard: "Esperanto"},
+"rm" => %{standard: "Romansh"}, "ja" => %{standard: "Japanese"},
+"sw-CD" => %{standard: "Congo Swahili"},
+"pdc" => %{standard: "Pennsylvania German"}, "om" => %{standard: "Oromo"},
+"jut" => %{standard: "Jutish"}, "lij" => %{standard: "Ligurian"},
+"kut" => %{standard: "Kutenai"}, "vep" => %{standard: "Veps"},
+"yao" => %{standard: "Yao"}, "gez" => %{standard: "Geez"},
+"cr" => %{standard: "Cree"}, "ne" => %{standard: "Nepali"},
+"zbl" => %{standard: "Blissymbols"}, "ae" => %{standard: "Avestan"},
+"rof" => %{standard: "Rombo"}, "tkl" => %{standard: "Tokelau"},
+"rgn" => %{standard: "Romagnol"}, "el" => %{standard: "Greek"},
+"myv" => %{standard: "Erzya"}, "smj" => %{standard: "Lule Sami"},
+"fo" => %{standard: "Faroese"}, "ii" => %{standard: "Sichuan Yi"},
+"bum" => %{standard: "Bulu"}, "za" => %{standard: "Zhuang"},
+"raj" => %{standard: "Rajasthani"}, "mrj" => %{standard: "Western Mari"},
+"stq" => %{standard: "Saterland Frisian"}, "hu" => %{standard: "Hungarian"},
+"mga" => %{standard: "Middle Irish"}, "bej" => %{standard: "Beja"},
+"yue" => %{standard: "Cantonese"}, "xog" => %{standard: "Soga"},
+"ttt" => %{standard: "Muslim Tat"}, "uga" => %{standard: "Ugaritic"},
+"rup" => %{standard: "Aromanian"},
+"crs" => %{standard: "Seselwa Creole French"}, "oc" => %{standard: "Occitan"},
+"chp" => %{standard: "Chipewyan"}, "zen" => %{standard: "Zenaga"},
+"kmb" => %{standard: "Kimbundu"}, "nr" => %{standard: "South Ndebele"},
+"tiv" => %{standard: "Tiv"}, "aln" => %{standard: "Gheg Albanian"},
+"sh" => %{standard: "Serbo-Croatian"}, "fil" => %{...}, ...}
iex> Bonfire.Common.Localise.Cldr.Language.Language.to_string("eo")
-{:ok, "Esperanto"}
+iex> Bonfire.Common.Localise.Cldr.Language.Language.to_string("eo")
+{:ok, "Esperanto"}
Cldr backend module that formats lists.
If we have a list of days like ["Monday", "Tuesday", "Wednesday"]
-then we can format that list for a given locale by:
iex> Bonfire.Common.Localise.Cldr.List.to_string(["Monday", "Tuesday", "Wednesday"], locale: "en")
-{:ok, "Monday, Tuesday, and Wednesday"}
+then we can format that list for a given locale by:iex> Bonfire.Common.Localise.Cldr.List.to_string(["Monday", "Tuesday", "Wednesday"], locale: "en")
+{:ok, "Monday, Tuesday, and Wednesday"}
iex> Bonfire.Common.Localise.Cldr.List.intersperse(["a", "b", "c"], locale: "en")
-{:ok, ["a", ", ", "b", ", and ", "c"]}
+iex> Bonfire.Common.Localise.Cldr.List.intersperse(["a", "b", "c"], locale: "en")
+{:ok, ["a", ", ", "b", ", and ", "c"]}
-iex> Bonfire.Common.Localise.Cldr.List.intersperse(["a", "b", "c"], locale: "en", format: :unit_narrow)
-{:ok, ["a", " ", "b", " ", "c"]}
+iex> Bonfire.Common.Localise.Cldr.List.intersperse(["a", "b", "c"], locale: "en", format: :unit_narrow)
+{:ok, ["a", " ", "b", " ", "c"]}
-iex> Bonfire.Common.Localise.Cldr.List.intersperse(["a", "b", "c"], locale: "fr")
-{:ok, ["a", ", ", "b", " et ", "c"]}
+iex> Bonfire.Common.Localise.Cldr.List.intersperse(["a", "b", "c"], locale: "fr")
+{:ok, ["a", ", ", "b", " et ", "c"]}
-iex> Bonfire.Common.Localise.Cldr.List.intersperse([1,2,3,4,5,6])
-{:ok, [1, ", ", 2, ", ", 3, ", ", 4, ", ", 5, ", and ", 6]}
+iex> Bonfire.Common.Localise.Cldr.List.intersperse([1,2,3,4,5,6])
+{:ok, [1, ", ", 2, ", ", 3, ", ", 4, ", ", 5, ", and ", 6]}
-iex> Bonfire.Common.Localise.Cldr.List.intersperse(["a"])
-{:ok, ["a"]}
+iex> Bonfire.Common.Localise.Cldr.List.intersperse(["a"])
+{:ok, ["a"]}
-iex> Bonfire.Common.Localise.Cldr.List.intersperse([1,2])
-{:ok, [1, " and ", 2]}
+iex> Bonfire.Common.Localise.Cldr.List.intersperse([1,2])
+{:ok, [1, " and ", 2]}
iex> Bonfire.Common.Localise.Cldr.List.intersperse!(["a", "b", "c"], locale: "en")
-["a", ", ", "b", ", and ", "c"]
+iex> Bonfire.Common.Localise.Cldr.List.intersperse!(["a", "b", "c"], locale: "en")
+["a", ", ", "b", ", and ", "c"]
-iex> Bonfire.Common.Localise.Cldr.List.intersperse!(["a", "b", "c"], locale: "en", format: :unit_narrow)
-["a", " ", "b", " ", "c"]
+iex> Bonfire.Common.Localise.Cldr.List.intersperse!(["a", "b", "c"], locale: "en", format: :unit_narrow)
+["a", " ", "b", " ", "c"]
iex> Bonfire.Common.Localise.Cldr.List.list_formats_for(:en)
-[:or, :or_narrow, :or_short, :standard, :standard_narrow, :standard_short,
- :unit, :unit_narrow, :unit_short]
+iex> Bonfire.Common.Localise.Cldr.List.list_formats_for(:en)
+[:or, :or_narrow, :or_short, :standard, :standard_narrow, :standard_short,
+ :unit, :unit_narrow, :unit_short]
iex> Bonfire.Common.Localise.Cldr.List.list_patterns_for(:en)
-%{
- or: %{
- 2 => [0, " or ", 1],
- end: [0, ", or ", 1],
- middle: [0, ", ", 1],
- start: [0, ", ", 1]
- },
- or_narrow: %{
- 2 => [0, " or ", 1],
- end: [0, ", or ", 1],
- middle: [0, ", ", 1],
- start: [0, ", ", 1]
- },
- or_short: %{
- 2 => [0, " or ", 1],
- end: [0, ", or ", 1],
- middle: [0, ", ", 1],
- start: [0, ", ", 1]
- },
- standard: %{
- 2 => [0, " and ", 1],
- end: [0, ", and ", 1],
- middle: [0, ", ", 1],
- start: [0, ", ", 1]
- },
- standard_narrow: %{
- 2 => [0, ", ", 1],
- end: [0, ", ", 1],
- middle: [0, ", ", 1],
- start: [0, ", ", 1]
- },
- standard_short: %{
- 2 => [0, " & ", 1],
- end: [0, ", & ", 1],
- middle: [0, ", ", 1],
- start: [0, ", ", 1]
- },
- unit: %{
- 2 => [0, ", ", 1],
- end: [0, ", ", 1],
- middle: [0, ", ", 1],
- start: [0, ", ", 1]
- },
- unit_narrow: %{
- 2 => [0, " ", 1],
- end: [0, " ", 1],
- middle: [0, " ", 1],
- start: [0, " ", 1]
- },
- unit_short: %{
- 2 => [0, ", ", 1],
- end: [0, ", ", 1],
- middle: [0, ", ", 1],
- start: [0, ", ", 1]
- }
-}
+iex> Bonfire.Common.Localise.Cldr.List.list_patterns_for(:en)
+%{
+ or: %{
+ 2 => [0, " or ", 1],
+ end: [0, ", or ", 1],
+ middle: [0, ", ", 1],
+ start: [0, ", ", 1]
+ },
+ or_narrow: %{
+ 2 => [0, " or ", 1],
+ end: [0, ", or ", 1],
+ middle: [0, ", ", 1],
+ start: [0, ", ", 1]
+ },
+ or_short: %{
+ 2 => [0, " or ", 1],
+ end: [0, ", or ", 1],
+ middle: [0, ", ", 1],
+ start: [0, ", ", 1]
+ },
+ standard: %{
+ 2 => [0, " and ", 1],
+ end: [0, ", and ", 1],
+ middle: [0, ", ", 1],
+ start: [0, ", ", 1]
+ },
+ standard_narrow: %{
+ 2 => [0, ", ", 1],
+ end: [0, ", ", 1],
+ middle: [0, ", ", 1],
+ start: [0, ", ", 1]
+ },
+ standard_short: %{
+ 2 => [0, " & ", 1],
+ end: [0, ", & ", 1],
+ middle: [0, ", ", 1],
+ start: [0, ", ", 1]
+ },
+ unit: %{
+ 2 => [0, ", ", 1],
+ end: [0, ", ", 1],
+ middle: [0, ", ", 1],
+ start: [0, ", ", 1]
+ },
+ unit_narrow: %{
+ 2 => [0, " ", 1],
+ end: [0, " ", 1],
+ middle: [0, " ", 1],
+ start: [0, " ", 1]
+ },
+ unit_short: %{
+ 2 => [0, ", ", 1],
+ end: [0, ", ", 1],
+ middle: [0, ", ", 1],
+ start: [0, ", ", 1]
+ }
+}
iex> Bonfire.Common.Localise.Cldr.List.to_string(["a", "b", "c"], locale: "en")
-{:ok, "a, b, and c"}
+iex> Bonfire.Common.Localise.Cldr.List.to_string(["a", "b", "c"], locale: "en")
+{:ok, "a, b, and c"}
-iex> Bonfire.Common.Localise.Cldr.List.to_string(["a", "b", "c"], locale: "en", format: :unit_narrow)
-{:ok, "a b c"}
+iex> Bonfire.Common.Localise.Cldr.List.to_string(["a", "b", "c"], locale: "en", format: :unit_narrow)
+{:ok, "a b c"}
-iex> Bonfire.Common.Localise.Cldr.List.to_string(["a", "b", "c"], locale: "fr")
-{:ok, "a, b et c"}
+iex> Bonfire.Common.Localise.Cldr.List.to_string(["a", "b", "c"], locale: "fr")
+{:ok, "a, b et c"}
-iex> Bonfire.Common.Localise.Cldr.List.to_string([1,2,3,4,5,6])
-{:ok, "1, 2, 3, 4, 5, and 6"}
+iex> Bonfire.Common.Localise.Cldr.List.to_string([1,2,3,4,5,6])
+{:ok, "1, 2, 3, 4, 5, and 6"}
-iex> Bonfire.Common.Localise.Cldr.List.to_string(["a"])
-{:ok, "a"}
+iex> Bonfire.Common.Localise.Cldr.List.to_string(["a"])
+{:ok, "a"}
-iex> Bonfire.Common.Localise.Cldr.List.to_string([1,2])
-{:ok, "1 and 2"}
+iex> Bonfire.Common.Localise.Cldr.List.to_string([1,2])
+{:ok, "1 and 2"}
iex> Bonfire.Common.Localise.Cldr.List.to_string!(["a", "b", "c"], locale: "en")
+iex> Bonfire.Common.Localise.Cldr.List.to_string!(["a", "b", "c"], locale: "en")
"a, b, and c"
-iex> Bonfire.Common.Localise.Cldr.List.to_string!(["a", "b", "c"], locale: "en", format: :unit_narrow)
+iex> Bonfire.Common.Localise.Cldr.List.to_string!(["a", "b", "c"], locale: "en", format: :unit_narrow)
"a b c"
iex> Bonfire.Common.Localise.Cldr.Locale.fallback_locale_names(:"fr-CA")
-{:ok, [:"fr-CA", :fr, :und]}
+iex> Bonfire.Common.Localise.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> Bonfire.Common.Localise.Cldr.Locale.fallback_locale_names(:nb)
-{:ok, [:nb, :no, :und]}
+iex> Bonfire.Common.Localise.Cldr.Locale.fallback_locale_names(:nb)
+{:ok, [:nb, :no, :und]}
Bonfire.Common.Localise.Cldr.Locale.fallback_locales(:"fr-CA")
-=> {:ok,
- [#Cldr.LanguageTag<fr-CA [validated]>, #Cldr.LanguageTag<fr [validated]>,
- #Cldr.LanguageTag<und [validated]>]}
+Bonfire.Common.Localise.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.
-Bonfire.Common.Localise.Cldr.Locale.fallback_locales(:nb))
-=> {:ok,
- [#Cldr.LanguageTag<nb [validated]>, #Cldr.LanguageTag<no [validated]>,
- #Cldr.LanguageTag<und [validated]>]}
+Bonfire.Common.Localise.Cldr.Locale.fallback_locales(:nb))
+=> {:ok,
+ [#Cldr.LanguageTag<nb [validated]>, #Cldr.LanguageTag<no [validated]>,
+ #Cldr.LanguageTag<und [validated]>]}
iex> Bonfire.Common.Localise.Cldr.Locale.locale_from_host "a.b.com.au"
-Elixir.Bonfire.Common.Localise.Cldr.validate_locale(:"en-AU")
+Elixir.Bonfire.Common.Localise.Cldr.validate_locale(:"en-AU")
-iex> Bonfire.Common.Localise.Cldr.Locale.locale_from_host("a.b.com.tv")
-{:error,
- {Cldr.UnknownLocaleError, "No locale was identified for territory \"tv\""}}
+iex> Bonfire.Common.Localise.Cldr.Locale.locale_from_host("a.b.com.tv")
+{:error,
+ {Cldr.UnknownLocaleError, "No locale was identified for territory \"tv\""}}
-iex> Bonfire.Common.Localise.Cldr.Locale.locale_from_host("a.b.com")
-{:error,
- {Cldr.UnknownLocaleError, "No locale was identified for territory \"com\""}}
+iex> Bonfire.Common.Localise.Cldr.Locale.locale_from_host("a.b.com")
+{:error,
+ {Cldr.UnknownLocaleError, "No locale was identified for territory \"com\""}}
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\""}}
iex> Bonfire.Common.Localise.Cldr.Number.Cardinal.pluralize 1, "en", %{one: "one"}
+iex> Bonfire.Common.Localise.Cldr.Number.Cardinal.pluralize 1, "en", %{one: "one"}
"one"
-iex> Bonfire.Common.Localise.Cldr.Number.Cardinal.pluralize 2, "en", %{one: "one"}
+iex> Bonfire.Common.Localise.Cldr.Number.Cardinal.pluralize 2, "en", %{one: "one"}
nil
-iex> Bonfire.Common.Localise.Cldr.Number.Cardinal.pluralize 2, "en", %{one: "one", two: "two", other: "other"}
+iex> Bonfire.Common.Localise.Cldr.Number.Cardinal.pluralize 2, "en", %{one: "one", two: "two", other: "other"}
"other"
-iex> Bonfire.Common.Localise.Cldr.Number.Cardinal.pluralize 22, "en", %{one: "one", two: "two", other: "other"}
+iex> Bonfire.Common.Localise.Cldr.Number.Cardinal.pluralize 22, "en", %{one: "one", two: "two", other: "other"}
"other"
-iex> Bonfire.Common.Localise.Cldr.Number.Cardinal.pluralize Decimal.new(1), "en", %{one: "one"}
+iex> Bonfire.Common.Localise.Cldr.Number.Cardinal.pluralize Decimal.new(1), "en", %{one: "one"}
"one"
-iex> Bonfire.Common.Localise.Cldr.Number.Cardinal.pluralize Decimal.new(2), "en", %{one: "one"}
+iex> Bonfire.Common.Localise.Cldr.Number.Cardinal.pluralize Decimal.new(2), "en", %{one: "one"}
nil
-iex> Bonfire.Common.Localise.Cldr.Number.Cardinal.pluralize Decimal.new(2), "en", %{one: "one", two: "two"}
+iex> Bonfire.Common.Localise.Cldr.Number.Cardinal.pluralize Decimal.new(2), "en", %{one: "one", two: "two"}
nil
-iex> Bonfire.Common.Localise.Cldr.Number.Cardinal.pluralize 1..10, "ar", %{one: "one", few: "few", other: "other"}
+iex> Bonfire.Common.Localise.Cldr.Number.Cardinal.pluralize 1..10, "ar", %{one: "one", few: "few", other: "other"}
"few"
-iex> Bonfire.Common.Localise.Cldr.Number.Cardinal.pluralize 1..10, "en", %{one: "one", few: "few", other: "other"}
+iex> Bonfire.Common.Localise.Cldr.Number.Cardinal.pluralize 1..10, "en", %{one: "one", few: "few", other: "other"}
"other"
#=> Bonfire.Common.Localise.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¤)",
@@ -472,7 +472,7 @@ decimal_format_list()
"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> Bonfire.Common.Localise.Cldr.Number.Format.decimal_format_list_for(:en)
-{:ok, ["#,##0%", "#,##0.###", "#,##0.00", "#,##0.00;(#,##0.00)","#E0",
+iex> Bonfire.Common.Localise.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",
@@ -529,7 +529,7 @@ decimal_format_list_for(locale \\ Bonfire.C
"¤#,##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"]}
iex> Bonfire.Common.Localise.Cldr.Number.Format.default_grouping_for(:en)
-{:ok, %{fraction: %{first: 0, rest: 0}, integer: %{first: 3, rest: 3}}}
+iex> Bonfire.Common.Localise.Cldr.Number.Format.default_grouping_for(:en)
+{:ok, %{fraction: %{first: 0, rest: 0}, integer: %{first: 3, rest: 3}}}
iex> Bonfire.Common.Localise.Cldr.Number.Format.default_grouping_for!(:en)
-%{fraction: %{first: 0, rest: 0}, integer: %{first: 3, rest: 3}}
+iex> Bonfire.Common.Localise.Cldr.Number.Format.default_grouping_for!(:en)
+%{fraction: %{first: 0, rest: 0}, integer: %{first: 3, rest: 3}}
iex> Bonfire.Common.Localise.Cldr.Number.Format.minimum_grouping_digits_for("en")
-{:ok, 1}
+iex> Bonfire.Common.Localise.Cldr.Number.Format.minimum_grouping_digits_for("en")
+{:ok, 1}
iex> Bonfire.Common.Localise.Cldr.Number.Format.minimum_grouping_digits_for!("en")
+iex> Bonfire.Common.Localise.Cldr.Number.Format.minimum_grouping_digits_for!("en")
1
iex> Bonfire.Common.Localise.Cldr.Number.Ordinal.pluralize 1, :en, %{one: "one"}
+iex> Bonfire.Common.Localise.Cldr.Number.Ordinal.pluralize 1, :en, %{one: "one"}
"one"
-iex> Bonfire.Common.Localise.Cldr.Number.Ordinal.pluralize 2, :en, %{one: "one"}
+iex> Bonfire.Common.Localise.Cldr.Number.Ordinal.pluralize 2, :en, %{one: "one"}
nil
-iex> Bonfire.Common.Localise.Cldr.Number.Ordinal.pluralize 2, :en, %{one: "one", two: "two"}
+iex> Bonfire.Common.Localise.Cldr.Number.Ordinal.pluralize 2, :en, %{one: "one", two: "two"}
"two"
-iex> Bonfire.Common.Localise.Cldr.Number.Ordinal.pluralize 22, :en, %{one: "one", two: "two", other: "other"}
+iex> Bonfire.Common.Localise.Cldr.Number.Ordinal.pluralize 22, :en, %{one: "one", two: "two", other: "other"}
"two"
-iex> Bonfire.Common.Localise.Cldr.Number.Ordinal.pluralize Decimal.new(1), :en, %{one: "one"}
+iex> Bonfire.Common.Localise.Cldr.Number.Ordinal.pluralize Decimal.new(1), :en, %{one: "one"}
"one"
-iex> Bonfire.Common.Localise.Cldr.Number.Ordinal.pluralize Decimal.new(2), :en, %{one: "one"}
+iex> Bonfire.Common.Localise.Cldr.Number.Ordinal.pluralize Decimal.new(2), :en, %{one: "one"}
nil
-iex> Bonfire.Common.Localise.Cldr.Number.Ordinal.pluralize Decimal.new(2), :en, %{one: "one", two: "two"}
+iex> Bonfire.Common.Localise.Cldr.Number.Ordinal.pluralize Decimal.new(2), :en, %{one: "one", two: "two"}
"two"
-iex> Bonfire.Common.Localise.Cldr.Number.Ordinal.pluralize 1..10, "ar", %{one: "one", few: "few", other: "other"}
+iex> Bonfire.Common.Localise.Cldr.Number.Ordinal.pluralize 1..10, "ar", %{one: "one", few: "few", other: "other"}
"other"
-iex> Bonfire.Common.Localise.Cldr.Number.Ordinal.pluralize 1..10, "en", %{one: "one", few: "few", other: "other"}
+iex> Bonfire.Common.Localise.Cldr.Number.Ordinal.pluralize 1..10, "en", %{one: "one", few: "few", other: "other"}
"other"
diff --git a/Bonfire.Common.Localise.Cldr.Number.Symbol.html b/Bonfire.Common.Localise.Cldr.Number.Symbol.html
index 7524922e885..4fb02b4871b 100644
--- a/Bonfire.Common.Localise.Cldr.Number.Symbol.html
+++ b/Bonfire.Common.Localise.Cldr.Number.Symbol.html
@@ -372,9 +372,9 @@ number_symbols_for(locale \\ Bonfire.Common
Example:
-iex> Bonfire.Common.Localise.Cldr.Number.Symbol.number_symbols_for(:th)
-{:ok, %{
- latn: %Cldr.Number.Symbol{
+iex> Bonfire.Common.Localise.Cldr.Number.Symbol.number_symbols_for(:th)
+{:ok, %{
+ latn: %Cldr.Number.Symbol{
decimal: ".",
exponential: "E",
group: ",",
@@ -387,8 +387,8 @@ number_symbols_for(locale \\ Bonfire.Common
plus_sign: "+",
superscripting_exponent: "×",
time_separator: ":"
- },
- thai: %Cldr.Number.Symbol{
+ },
+ thai: %Cldr.Number.Symbol{
decimal: ".",
exponential: "E",
group: ",",
@@ -401,8 +401,8 @@ number_symbols_for(locale \\ Bonfire.Common
plus_sign: "+",
superscripting_exponent: "×",
time_separator: ":"
- }
- }}
+ }
+ }}
diff --git a/Bonfire.Common.Localise.Cldr.Number.System.html b/Bonfire.Common.Localise.Cldr.Number.System.html
index 823fcb92667..75a57492040 100644
--- a/Bonfire.Common.Localise.Cldr.Number.System.html
+++ b/Bonfire.Common.Localise.Cldr.Number.System.html
@@ -311,23 +311,23 @@ number_system_for(locale, system_name)
Examples
iex> Bonfire.Common.Localise.Cldr.Number.System.number_system_for "th", :latn
-{:ok, %{digits: "0123456789", type: :numeric}}
+{:ok, %{digits: "0123456789", type: :numeric}}
iex> Bonfire.Common.Localise.Cldr.Number.System.number_system_for "en", :default
-{:ok, %{digits: "0123456789", type: :numeric}}
+{:ok, %{digits: "0123456789", type: :numeric}}
iex> Bonfire.Common.Localise.Cldr.Number.System.number_system_for "he", :traditional
-{:ok, %{rules: "hebrew", type: :algorithmic}}
+{:ok, %{rules: "hebrew", type: :algorithmic}}
iex> Bonfire.Common.Localise.Cldr.Number.System.number_system_for "en", :native
-{:ok, %{digits: "0123456789", type: :numeric}}
+{:ok, %{digits: "0123456789", type: :numeric}}
iex> Bonfire.Common.Localise.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}"}
+}
iex> Bonfire.Common.Localise.Cldr.Number.System.number_system_names_for "en"
-{:ok, [:latn]}
+{:ok, [:latn]}
iex> Bonfire.Common.Localise.Cldr.Number.System.number_system_names_for "zz"
-{:error, {Cldr.InvalidLanguageError, "The language \"zz\" is invalid"}}
+{:error, {Cldr.InvalidLanguageError, "The language \"zz\" is invalid"}}
iex> Bonfire.Common.Localise.Cldr.Number.System.number_systems_for "en"
-{:ok, %{default: :latn, native: :latn}}
+{:ok, %{default: :latn, native: :latn}}
iex> Bonfire.Common.Localise.Cldr.Number.System.number_systems_for "th"
-{:ok, %{default: :latn, native: :thai}}
+{:ok, %{default: :latn, native: :thai}}
iex> Bonfire.Common.Localise.Cldr.Number.System.number_systems_for "zz"
-{:error, {Cldr.InvalidLanguageError, "The language \"zz\" is invalid"}}
+{:error, {Cldr.InvalidLanguageError, "The language \"zz\" is invalid"}}
ex> Bonfire.Common.Localise.Cldr.Number.System.system_name_from(:default, "en")
-{:ok, :latn}
+ex> Bonfire.Common.Localise.Cldr.Number.System.system_name_from(:default, "en")
+{:ok, :latn}
-iex> Bonfire.Common.Localise.Cldr.Number.System.system_name_from("latn", "en")
-{:ok, :latn}
+iex> Bonfire.Common.Localise.Cldr.Number.System.system_name_from("latn", "en")
+{:ok, :latn}
-iex> Bonfire.Common.Localise.Cldr.Number.System.system_name_from(:native, "en")
-{:ok, :latn}
+iex> Bonfire.Common.Localise.Cldr.Number.System.system_name_from(:native, "en")
+{:ok, :latn}
-iex> Bonfire.Common.Localise.Cldr.Number.System.system_name_from(:nope, "en")
-{
+iex> Bonfire.Common.Localise.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.
iex> Bonfire.Common.Localise.Cldr.Number.System.to_system 123456, :hebr
-{:ok, "קכ״ג׳תנ״ו"}
+{:ok, "קכ״ג׳תנ״ו"}
iex> Bonfire.Common.Localise.Cldr.Number.System.to_system 123, :hans
-{:ok, "一百二十三"}
+{:ok, "一百二十三"}
iex> Bonfire.Common.Localise.Cldr.Number.System.to_system 123, :hant
-{:ok, "一百二十三"}
+{:ok, "一百二十三"}
iex> Bonfire.Common.Localise.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.
iex> Bonfire.Common.Localise.Cldr.Number.Transliterate.transliterate("123556")
+iex> Bonfire.Common.Localise.Cldr.Number.Transliterate.transliterate("123556")
"123556"
-iex> Bonfire.Common.Localise.Cldr.Number.Transliterate.transliterate("123,556.000", "fr", :default)
+iex> Bonfire.Common.Localise.Cldr.Number.Transliterate.transliterate("123,556.000", "fr", :default)
"123 556,000"
-iex> Bonfire.Common.Localise.Cldr.Number.Transliterate.transliterate("123556", "th", :default)
+iex> Bonfire.Common.Localise.Cldr.Number.Transliterate.transliterate("123556", "th", :default)
"123556"
-iex> Bonfire.Common.Localise.Cldr.Number.Transliterate.transliterate("123556", "th", "thai")
+iex> Bonfire.Common.Localise.Cldr.Number.Transliterate.transliterate("123556", "th", "thai")
"๑๒๓๕๕๖"
-iex> Bonfire.Common.Localise.Cldr.Number.Transliterate.transliterate("123556", "th", :native)
+iex> Bonfire.Common.Localise.Cldr.Number.Transliterate.transliterate("123556", "th", :native)
"๑๒๓๕๕๖"
-iex> Bonfire.Common.Localise.Cldr.Number.Transliterate.transliterate("Some number is: 123556", "th", "thai")
+iex> Bonfire.Common.Localise.Cldr.Number.Transliterate.transliterate("Some number is: 123556", "th", "thai")
"Some number is: ๑๒๓๕๕๖"
diff --git a/Bonfire.Common.Localise.Cldr.Number.html b/Bonfire.Common.Localise.Cldr.Number.html
index 573febcfd66..187e6899586 100644
--- a/Bonfire.Common.Localise.Cldr.Number.html
+++ b/Bonfire.Common.Localise.Cldr.Number.html
@@ -435,19 +435,19 @@ parse(string, options \\ [])
Examples
-iex> Bonfire.Common.Localise.Cldr.Number.parse("+1.000,34", locale: "de")
-{:ok, 1000.34}
+iex> Bonfire.Common.Localise.Cldr.Number.parse("+1.000,34", locale: "de")
+{:ok, 1000.34}
-iex> Bonfire.Common.Localise.Cldr.Number.parse("-1_000_000.34")
-{:ok, -1000000.34}
+iex> Bonfire.Common.Localise.Cldr.Number.parse("-1_000_000.34")
+{:ok, -1000000.34}
-iex> Bonfire.Common.Localise.Cldr.Number.parse("1.000", locale: "de", number: :integer)
-{:ok, 1000}
+iex> Bonfire.Common.Localise.Cldr.Number.parse("1.000", locale: "de", number: :integer)
+{:ok, 1000}
-iex> Bonfire.Common.Localise.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> Bonfire.Common.Localise.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"}}
@@ -519,17 +519,17 @@ resolve_currencies(list, options \\ [])
Examples
-iex> Bonfire.Common.Localise.Cldr.Number.scan("100 US dollars")
+iex> Bonfire.Common.Localise.Cldr.Number.scan("100 US dollars")
...> |> Bonfire.Common.Localise.Cldr.Number.resolve_currencies
-[100, :USD]
+[100, :USD]
-iex> Bonfire.Common.Localise.Cldr.Number.scan("100 eurosports")
-...> |> Bonfire.Common.Localise.Cldr.Number.resolve_currencies(fuzzy: 0.75)
-[100, :EUR]
+iex> Bonfire.Common.Localise.Cldr.Number.scan("100 eurosports")
+...> |> Bonfire.Common.Localise.Cldr.Number.resolve_currencies(fuzzy: 0.75)
+[100, :EUR]
-iex> Bonfire.Common.Localise.Cldr.Number.scan("100 dollars des États-Unis")
-...> |> Bonfire.Common.Localise.Cldr.Number.resolve_currencies(locale: "fr")
-[100, :USD]
+iex> Bonfire.Common.Localise.Cldr.Number.scan("100 dollars des États-Unis")
+...> |> Bonfire.Common.Localise.Cldr.Number.resolve_currencies(locale: "fr")
+[100, :USD]
@@ -606,19 +606,19 @@ resolve_currency(string, options \\ [])
Examples
-iex> Bonfire.Common.Localise.Cldr.Number.resolve_currency("US dollars")
-[:USD]
+iex> Bonfire.Common.Localise.Cldr.Number.resolve_currency("US dollars")
+[:USD]
-iex> Bonfire.Common.Localise.Cldr.Number.resolve_currency("100 eurosports", fuzzy: 0.75)
-[:EUR]
+iex> Bonfire.Common.Localise.Cldr.Number.resolve_currency("100 eurosports", fuzzy: 0.75)
+[:EUR]
-iex> Bonfire.Common.Localise.Cldr.Number.resolve_currency("dollars des États-Unis", locale: "fr")
-[:USD]
+iex> Bonfire.Common.Localise.Cldr.Number.resolve_currency("dollars des États-Unis", locale: "fr")
+[:USD]
-iex> Bonfire.Common.Localise.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> Bonfire.Common.Localise.Cldr.Number.resolve_currency("not a known currency", locale: "fr")
+{:error,
+ {Cldr.UnknownCurrencyError,
+ "The currency \"not a known currency\" is unknown or not supported"}}
@@ -682,13 +682,13 @@ resolve_per(string, options \\ [])
Examples
iex> Bonfire.Common.Localise.Cldr.Number.resolve_per "11%"
-["11", :percent]
+["11", :percent]
iex> Bonfire.Common.Localise.Cldr.Number.resolve_per "% of linguists"
-[:percent, " of linguists"]
+[:percent, " of linguists"]
iex> Bonfire.Common.Localise.Cldr.Number.resolve_per "% of linguists %"
-[:percent, " of linguists ", :percent]
+ [:percent, " of linguists ", :percent]
iex> Bonfire.Common.Localise.Cldr.Number.scan("100%")
-...> |> Bonfire.Common.Localise.Cldr.Number.resolve_pers()
-[100, :percent]
+iex> Bonfire.Common.Localise.Cldr.Number.scan("100%")
+...> |> Bonfire.Common.Localise.Cldr.Number.resolve_pers()
+[100, :percent]
iex> Bonfire.Common.Localise.Cldr.Number.scan("£1_000_000.34")
-["£", 1000000.34]
+iex> Bonfire.Common.Localise.Cldr.Number.scan("£1_000_000.34")
+["£", 1000000.34]
-iex> Bonfire.Common.Localise.Cldr.Number.scan("I want £1_000_000 dollars")
-["I want £", 1000000, " dollars"]
+iex> Bonfire.Common.Localise.Cldr.Number.scan("I want £1_000_000 dollars")
+["I want £", 1000000, " dollars"]
-iex> Bonfire.Common.Localise.Cldr.Number.scan("The prize is 23")
-["The prize is ", 23]
+iex> Bonfire.Common.Localise.Cldr.Number.scan("The prize is 23")
+["The prize is ", 23]
-iex> Bonfire.Common.Localise.Cldr.Number.scan("The lottery number is 23 for the next draw")
-["The lottery number is ", 23, " for the next draw"]
+iex> Bonfire.Common.Localise.Cldr.Number.scan("The lottery number is 23 for the next draw")
+["The lottery number is ", 23, " for the next draw"]
-iex> Bonfire.Common.Localise.Cldr.Number.scan("The loss is -1.000 euros", locale: "de", number: :integer)
-["The loss is ", -1000, " euros"]
+iex> Bonfire.Common.Localise.Cldr.Number.scan("The loss is -1.000 euros", locale: "de", number: :integer)
+["The loss is ", -1000, " euros"]
iex> Bonfire.Common.Localise.Cldr.Number.to_approx_string 1234
-{:ok, "~1,234"}
+{:ok, "~1,234"}
iex> Bonfire.Common.Localise.Cldr.Number.to_at_least_string 1234
-{:ok, "1,234+"}
+{:ok, "1,234+"}
iex> Bonfire.Common.Localise.Cldr.Number.to_at_most_string 1234
-{:ok, "≤1,234"}
+{:ok, "≤1,234"}
iex> Bonfire.Common.Localise.Cldr.Number.to_range_string 1234..5678
-{:ok, "1,234–5,678"}
+{:ok, "1,234–5,678"}
Wrapping elements is particularly useful when formatting a number with a currency symbol and the requirement is to have different HTML formatting -applied to the symbol than the number. For example:
iex> Cldr.Number.to_string(100, format: :currency, currency: :USD, wrapper: fn
+applied to the symbol than the number. For example: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
+
...> 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
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. @@ -1162,80 +1162,80 @@
iex> Bonfire.Common.Localise.Cldr.Number.to_string 12345
-{:ok, "12,345"}
+{:ok, "12,345"}
iex> Bonfire.Common.Localise.Cldr.Number.to_string 12345, locale: "fr"
-{:ok, "12 345"}
+{:ok, "12 345"}
iex> Bonfire.Common.Localise.Cldr.Number.to_string 1345.32, currency: :EUR, locale: "es", minimum_grouping_digits: 1
-{:ok, "1.345,32 €"}
+{:ok, "1.345,32 €"}
iex> Bonfire.Common.Localise.Cldr.Number.to_string 1345.32, currency: :EUR, locale: "es"
-{:ok, "1345,32 €"}
+{:ok, "1345,32 €"}
iex> Bonfire.Common.Localise.Cldr.Number.to_string 12345, locale: "fr", currency: "USD"
-{:ok, "12 345,00 $US"}
+{:ok, "12 345,00 $US"}
iex> Bonfire.Common.Localise.Cldr.Number.to_string 12345, format: "#E0"
-{:ok, "1.2345E4"}
+{:ok, "1.2345E4"}
iex> Bonfire.Common.Localise.Cldr.Number.to_string 12345, format: :accounting, currency: "THB"
-{:ok, "THB 12,345.00"}
+{:ok, "THB 12,345.00"}
iex> Bonfire.Common.Localise.Cldr.Number.to_string -12345, format: :accounting, currency: "THB"
-{:ok, "(THB 12,345.00)"}
+{:ok, "(THB 12,345.00)"}
iex> Bonfire.Common.Localise.Cldr.Number.to_string 12345, format: :accounting, currency: "THB",
...> locale: "th"
-{:ok, "฿12,345.00"}
+{:ok, "฿12,345.00"}
iex> Bonfire.Common.Localise.Cldr.Number.to_string 12345, format: :accounting, currency: "THB",
...> locale: "th", number_system: :native
-{:ok, "฿๑๒,๓๔๕.๐๐"}
+{:ok, "฿๑๒,๓๔๕.๐๐"}
iex> Bonfire.Common.Localise.Cldr.Number.to_string 1244.30, format: :long
-{:ok, "1 thousand"}
+{:ok, "1 thousand"}
iex> Bonfire.Common.Localise.Cldr.Number.to_string 1244.30, format: :long, currency: "USD"
-{:ok, "1,244 US dollars"}
+{:ok, "1,244 US dollars"}
iex> Bonfire.Common.Localise.Cldr.Number.to_string 1244.30, format: :short
-{:ok, "1K"}
+{:ok, "1K"}
iex> Bonfire.Common.Localise.Cldr.Number.to_string 1244.30, format: :short, currency: "EUR"
-{:ok, "€1K"}
+{:ok, "€1K"}
iex> Bonfire.Common.Localise.Cldr.Number.to_string 1234, format: :spellout
-{:ok, "one thousand two hundred thirty-four"}
+{:ok, "one thousand two hundred thirty-four"}
iex> Bonfire.Common.Localise.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> Bonfire.Common.Localise.Cldr.Number.to_string 1989, format: :spellout_year
-{:ok, "nineteen eighty-nine"}
+{:ok, "nineteen eighty-nine"}
iex> Bonfire.Common.Localise.Cldr.Number.to_string 123, format: :ordinal
-{:ok, "123rd"}
+{:ok, "123rd"}
iex> Bonfire.Common.Localise.Cldr.Number.to_string 123, format: :roman
-{:ok, "CXXIII"}
+{:ok, "CXXIII"}
iex> Bonfire.Common.Localise.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> Bonfire.Common.Localise.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> Bonfire.Common.Localise.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> Bonfire.Common.Localise.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> Bonfire.Common.Localise.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> Bonfire.Common.Localise.Cldr.Number.validate_number_system "en", :latn
-{:ok, :latn}
+{:ok, :latn}
iex> Bonfire.Common.Localise.Cldr.Number.validate_number_system "en", :default
-{:ok, :latn}
+{:ok, :latn}
iex> Bonfire.Common.Localise.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> Bonfire.Common.Localise.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> Bonfire.Common.Localise.Cldr.Rbnf.NumberSystem.rule_sets(:und)
-...> |> Enum.sort()
-[
+defined in the Unicode CLDR data repository. Available rules are identified by:iex> Bonfire.Common.Localise.Cldr.Rbnf.NumberSystem.rule_sets(:und)
+...> |> Enum.sort()
+[
:armenian_lower,
:armenian_upper,
:cyrillic_lower,
@@ -155,9 +155,9 @@
:roman_upper,
:tamil,
:zz_default
-]
A rule can then be invoked on an available rule_set. For example
iex> Bonfire.Common.Localise.Cldr.Rbnf.NumberSystem.roman_upper(123, :und)
-"CXXIII"
This particular call is equivalent to the call through the public API of:
iex> Bonfire.Common.Localise.Cldr.Number.to_string(123, format: :roman)
-{:ok, "CXXIII"}
+]
A rule can then be invoked on an available rule_set. For example
iex> Bonfire.Common.Localise.Cldr.Rbnf.NumberSystem.roman_upper(123, :und)
+"CXXIII"
This particular call is equivalent to the call through the public API of:
iex> Bonfire.Common.Localise.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> Bonfire.Common.Localise.Cldr.Rbnf.Ordinal.rule_sets(:en)
-[:digits_ordinal]
+defined in the Unicode CLDR data repository. Available rules are identified by:iex> Bonfire.Common.Localise.Cldr.Rbnf.Ordinal.rule_sets(:en)
+[:digits_ordinal]
-iex> Bonfire.Common.Localise.Cldr.Rbnf.Ordinal.rule_sets("fr")
-...> |> Enum.sort()
-[
+iex> Bonfire.Common.Localise.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> Bonfire.Common.Localise.Cldr.Rbnf.Ordinal.digits_ordinal(123, :en)
-"123rd"
This call is equivalent to the call through the public API of:
iex> Bonfire.Common.Localise.Cldr.Number.to_string(123, format: :ordinal)
-{:ok, "123rd"}
+]
A rule can then be invoked on an available rule_set. For example
iex> Bonfire.Common.Localise.Cldr.Rbnf.Ordinal.digits_ordinal(123, :en)
+"123rd"
This call is equivalent to the call through the public API of:
iex> Bonfire.Common.Localise.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> Bonfire.Common.Localise.Cldr.Rbnf.Spellout.rule_sets("en")
-...> |> Enum.sort()
-[
+defined in the Unicode CLDR data repository. Available rules are identified by:iex> Bonfire.Common.Localise.Cldr.Rbnf.Spellout.rule_sets("en")
+...> |> Enum.sort()
+[
:spellout_cardinal,
:spellout_cardinal_verbose,
:spellout_numbering,
@@ -149,9 +149,9 @@
:spellout_numbering_year,
:spellout_ordinal,
:spellout_ordinal_verbose
-]
A rule can then be invoked on an available rule_set. For example:
iex> Bonfire.Common.Localise.Cldr.Rbnf.Spellout.spellout_ordinal(123, "en")
-"one hundred twenty-third"
This call is equivalent to the call through the public API of:
iex> Bonfire.Common.Localise.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> Bonfire.Common.Localise.Cldr.Rbnf.Spellout.spellout_ordinal(123, "en")
+"one hundred twenty-third"
This call is equivalent to the call through the public API of:
iex> Bonfire.Common.Localise.Cldr.Number.to_string(123, format: :spellout)
+{:ok, "one hundred twenty-three"}
iex> Bonfire.Common.Localise.Cldr.Time.Interval.to_string ~T[10:00:00], ~T[10:03:00], format: :short
-{:ok, "10 – 10 AM"}
+{:ok, "10 – 10 AM"}
iex> Bonfire.Common.Localise.Cldr.Time.Interval.to_string ~T[10:00:00], ~T[10:03:00], format: :medium
-{:ok, "10:00 – 10:03 AM"}
+{:ok, "10:00 – 10:03 AM"}
iex> Bonfire.Common.Localise.Cldr.Time.Interval.to_string ~T[10:00:00], ~T[10:03:00], format: :long
-{:ok, "10:00 – 10:03 AM"}
+{:ok, "10:00 – 10:03 AM"}
iex> Bonfire.Common.Localise.Cldr.Time.Interval.to_string ~T[10:00:00], ~T[10:03:00],
...> format: :long, style: :flex
-{:ok, "10:00 – 10:03 in the morning"}
+{:ok, "10:00 – 10:03 in the morning"}
iex> Bonfire.Common.Localise.Cldr.Time.Interval.to_string ~U[2020-01-01 00:00:00.0Z], ~U[2020-01-01 10:00:00.0Z],
...> format: :long, style: :flex
-{:ok, "12:00 – 10:00 in the morning"}
+{:ok, "12:00 – 10:00 in the morning"}
iex> Bonfire.Common.Localise.Cldr.Time.Interval.to_string ~U[2020-01-01 00:00:00.0Z], ~U[2020-01-01 10:00:00.0Z],
...> format: :long, style: :zone
-{:ok, "12:00 – 10:00 AM Etc/UTC"}
+{:ok, "12:00 – 10:00 AM Etc/UTC"}
iex> Bonfire.Common.Localise.Cldr.Time.Interval.to_string ~T[10:00:00], ~T[10:03:00],
...> format: :long, style: :flex, locale: "th"
-{:ok, "10:00 – 10:03 ในตอนเช้า"}
+{:ok, "10:00 – 10:03 ในตอนเช้า"}
iex> Bonfire.Common.Localise.Cldr.Time.Interval.to_string ~T[10:00:00], nil
-{:ok, "10:00:00 AM –"}
+{:ok, "10:00:00 AM –"}
iex> Cldr.Time.to_string ~T[07:35:13.215217]
-{:ok, "7:35:13 AM"}
+{:ok, "7:35:13 AM"}
iex> Cldr.Time.to_string ~T[07:35:13.215217], format: :short
-{:ok, "7:35 AM"}
+{:ok, "7:35 AM"}
iex> Cldr.Time.to_string ~T[07:35:13.215217], format: :medium, locale: "fr"
-{:ok, "07:35:13"}
+{:ok, "07:35:13"}
iex> Cldr.Time.to_string ~T[07:35:13.215217], format: :medium
-{:ok, "7:35:13 AM"}
+{:ok, "7:35:13 AM"}
-iex> {:ok, datetime} = DateTime.from_naive(~N[2000-01-01 23:59:59.0], "Etc/UTC")
+iex> {:ok, datetime} = DateTime.from_naive(~N[2000-01-01 23:59:59.0], "Etc/UTC")
iex> Cldr.Time.to_string datetime, format: :long
-{:ok, "11:59:59 PM UTC"}
+{:ok, "11:59:59 PM UTC"}
iex> unit = Cldr.Unit.new!(1.83, :meter)
-iex> Bonfire.Common.Localise.Cldr.Unit.localize(unit, usage: :person_height, territory: :US)
-[
- Cldr.Unit.new!(:foot, 6, usage: :person_height),
- Cldr.Unit.new!(:inch, "0.04724409448818897637795275598", usage: :person_height)
-]
+iex> unit = Cldr.Unit.new!(1.83, :meter)
+iex> Bonfire.Common.Localise.Cldr.Unit.localize(unit, usage: :person_height, territory: :US)
+[
+ Cldr.Unit.new!(:foot, 6, usage: :person_height),
+ Cldr.Unit.new!(:inch, "0.04724409448818897637795275598", usage: :person_height)
+]
iex> Bonfire.Common.Localise.Cldr.Unit.parse "1kg"
-Cldr.Unit.new(1, :kilogram)
+Cldr.Unit.new(1, :kilogram)
iex> Bonfire.Common.Localise.Cldr.Unit.parse "1 tages", locale: "de"
-Cldr.Unit.new(1, :day)
+Cldr.Unit.new(1, :day)
iex> Bonfire.Common.Localise.Cldr.Unit.parse "1 tag", locale: "de"
-Cldr.Unit.new(1, :day)
+Cldr.Unit.new(1, :day)
-iex> Bonfire.Common.Localise.Cldr.Unit.parse("42 millispangels")
-{:error, {Cldr.UnknownUnitError, "Unknown unit was detected at \"spangels\""}}
+iex> Bonfire.Common.Localise.Cldr.Unit.parse("42 millispangels")
+{:error, {Cldr.UnknownUnitError, "Unknown unit was detected at \"spangels\""}}
iex> Bonfire.Common.Localise.Cldr.Unit.parse! "1kg"
-Cldr.Unit.new!(1, :kilogram)
+Cldr.Unit.new!(1, :kilogram)
iex> Bonfire.Common.Localise.Cldr.Unit.parse! "1 tages", locale: "de"
-Cldr.Unit.new!(1, :day)
+Cldr.Unit.new!(1, :day)
-iex> Bonfire.Common.Localise.Cldr.Unit.parse!("42 candela per lux")
-Cldr.Unit.new!(42, "candela per lux")
+iex> Bonfire.Common.Localise.Cldr.Unit.parse!("42 candela per lux")
+Cldr.Unit.new!(42, "candela per lux")
-iex> Bonfire.Common.Localise.Cldr.Unit.parse!("42 millispangels")
+iex> Bonfire.Common.Localise.Cldr.Unit.parse!("42 millispangels")
** (Cldr.UnknownUnitError) Unknown unit was detected at "spangels"
iex> Bonfire.Common.Localise.Cldr.Unit.parse_unit_name "kg"
-{:ok, :kilogram}
+{:ok, :kilogram}
iex> Bonfire.Common.Localise.Cldr.Unit.parse_unit_name "w"
-{:ok, :watt}
+{:ok, :watt}
iex> Bonfire.Common.Localise.Cldr.Unit.parse_unit_name "w", only: :duration
-{:ok, :week}
+{:ok, :week}
-iex> Bonfire.Common.Localise.Cldr.Unit.parse_unit_name "m", only: [:year, :month, :day]
-{:ok, :month}
+iex> Bonfire.Common.Localise.Cldr.Unit.parse_unit_name "m", only: [:year, :month, :day]
+{:ok, :month}
iex> Bonfire.Common.Localise.Cldr.Unit.parse_unit_name "tages", locale: "de"
-{:ok, :day}
+{:ok, :day}
iex> Bonfire.Common.Localise.Cldr.Unit.parse_unit_name "tag", locale: "de"
-{:ok, :day}
+{:ok, :day}
-iex> Bonfire.Common.Localise.Cldr.Unit.parse_unit_name("millispangels")
-{:error, {Cldr.UnknownUnitError, "Unknown unit was detected at \"spangels\""}}
+iex> Bonfire.Common.Localise.Cldr.Unit.parse_unit_name("millispangels")
+{:error, {Cldr.UnknownUnitError, "Unknown unit was detected at \"spangels\""}}
iex> meter = Cldr.Unit.new!(:meter, 1)
+iex> meter = Cldr.Unit.new!(:meter, 1)
iex> Bonfire.Common.Localise.Cldr.Unit.preferred_units meter, locale: "en-US", usage: :person_height
-{:ok, [:foot, :inch], []}
+{:ok, [:foot, :inch], []}
iex> Bonfire.Common.Localise.Cldr.Unit.preferred_units meter, locale: "en-US", usage: :person
-{:ok, [:inch], []}
+{:ok, [:inch], []}
iex> Bonfire.Common.Localise.Cldr.Unit.preferred_units meter, locale: "en-AU", usage: :person
-{:ok, [:centimeter], []}
+{:ok, [:centimeter], []}
iex> Bonfire.Common.Localise.Cldr.Unit.preferred_units meter, locale: "en-US", usage: :road
-{:ok, [:foot], [round_nearest: 1]}
+{:ok, [:foot], [round_nearest: 1]}
iex> Bonfire.Common.Localise.Cldr.Unit.preferred_units meter, locale: "en-AU", usage: :road
-{:ok, [:meter], [round_nearest: 1]}
+{:ok, [:meter], [round_nearest: 1]}
iex> meter = Cldr.Unit.new!(:meter, 2)
+iex> meter = Cldr.Unit.new!(:meter, 2)
iex> Bonfire.Common.Localise.Cldr.Unit.preferred_units! meter, locale: "en-US", usage: :person_height
-[:foot, :inch]
+[:foot, :inch]
iex> Bonfire.Common.Localise.Cldr.Unit.preferred_units! meter, locale: "en-AU", usage: :person
-[:centimeter]
+[:centimeter]
iex> Bonfire.Common.Localise.Cldr.Unit.preferred_units! meter, locale: "en-US", usage: :road
-[:foot]
+[:foot]
iex> Bonfire.Common.Localise.Cldr.Unit.preferred_units! meter, locale: "en-AU", usage: :road
-[:meter]
+[:meter]
iex> Bonfire.Common.Localise.Cldr.Unit.to_iolist Cldr.Unit.new!(:gallon, 123)
-{:ok, ["123", " gallons"]}
+iex> Bonfire.Common.Localise.Cldr.Unit.to_iolist Cldr.Unit.new!(:gallon, 123)
+{:ok, ["123", " gallons"]}
iex> Bonfire.Common.Localise.Cldr.Unit.to_iolist! 123, unit: :gallon
-["123", " gallons"]
+["123", " gallons"]
iex> Bonfire.Common.Localise.Cldr.Unit.to_string Cldr.Unit.new!(:gallon, 123)
-{:ok, "123 gallons"}
+iex> Bonfire.Common.Localise.Cldr.Unit.to_string Cldr.Unit.new!(:gallon, 123)
+{:ok, "123 gallons"}
-iex> Bonfire.Common.Localise.Cldr.Unit.to_string Cldr.Unit.new!(:gallon, 1)
-{:ok, "1 gallon"}
+iex> Bonfire.Common.Localise.Cldr.Unit.to_string Cldr.Unit.new!(:gallon, 1)
+{:ok, "1 gallon"}
-iex> Bonfire.Common.Localise.Cldr.Unit.to_string Cldr.Unit.new!(:gallon, 1), locale: "af"
-{:ok, "1 gelling"}
+iex> Bonfire.Common.Localise.Cldr.Unit.to_string Cldr.Unit.new!(:gallon, 1), locale: "af"
+{:ok, "1 gelling"}
-iex> Bonfire.Common.Localise.Cldr.Unit.to_string Cldr.Unit.new!(:gallon, 1), locale: "af-NA"
-{:ok, "1 gelling"}
+iex> Bonfire.Common.Localise.Cldr.Unit.to_string Cldr.Unit.new!(:gallon, 1), locale: "af-NA"
+{:ok, "1 gelling"}
-iex> Bonfire.Common.Localise.Cldr.Unit.to_string Cldr.Unit.new!(:gallon, 1), locale: "bs"
-{:ok, "1 galon"}
+iex> Bonfire.Common.Localise.Cldr.Unit.to_string Cldr.Unit.new!(:gallon, 1), locale: "bs"
+{:ok, "1 galon"}
-iex> Bonfire.Common.Localise.Cldr.Unit.to_string Cldr.Unit.new!(:gallon, 1234), format: :long
-{:ok, "1 thousand gallons"}
+iex> Bonfire.Common.Localise.Cldr.Unit.to_string Cldr.Unit.new!(:gallon, 1234), format: :long
+{:ok, "1 thousand gallons"}
-iex> Bonfire.Common.Localise.Cldr.Unit.to_string Cldr.Unit.new!(:gallon, 1234), format: :short
-{:ok, "1K gallons"}
+iex> Bonfire.Common.Localise.Cldr.Unit.to_string Cldr.Unit.new!(:gallon, 1234), format: :short
+{:ok, "1K gallons"}
-iex> Bonfire.Common.Localise.Cldr.Unit.to_string Cldr.Unit.new!(:megahertz, 1234)
-{:ok, "1,234 megahertz"}
+iex> Bonfire.Common.Localise.Cldr.Unit.to_string Cldr.Unit.new!(:megahertz, 1234)
+{:ok, "1,234 megahertz"}
-iex> Bonfire.Common.Localise.Cldr.Unit.to_string Cldr.Unit.new!(:megahertz, 1234), style: :narrow
-{:ok, "1,234MHz"}
+iex> Bonfire.Common.Localise.Cldr.Unit.to_string Cldr.Unit.new!(:megahertz, 1234), style: :narrow
+{:ok, "1,234MHz"}
-iex> Bonfire.Common.Localise.Cldr.Unit.to_string Cldr.Unit.new!(:megabyte, 1234), locale: "en", style: :unknown
-{:error, {Cldr.UnknownFormatError, "The unit style :unknown is not known."}}
+iex> Bonfire.Common.Localise.Cldr.Unit.to_string Cldr.Unit.new!(:megabyte, 1234), locale: "en", style: :unknown
+{:error, {Cldr.UnknownFormatError, "The unit style :unknown is not known."}}
iex> Bonfire.Common.Localise.Cldr.default_locale()
-%Cldr.LanguageTag{
+iex> Bonfire.Common.Localise.Cldr.default_locale()
+%Cldr.LanguageTag{
backend: Bonfire.Common.Localise.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> Bonfire.Common.Localise.Cldr.default_territory()
+iex> Bonfire.Common.Localise.Cldr.default_territory()
:"001"
iex> Bonfire.Common.Localise.Cldr.ellipsis("And furthermore")
+iex> Bonfire.Common.Localise.Cldr.ellipsis("And furthermore")
"And furthermore…"
-iex> Bonfire.Common.Localise.Cldr.ellipsis(["And furthermore", "there is much to be done"], locale: :ja)
+iex> Bonfire.Common.Localise.Cldr.ellipsis(["And furthermore", "there is much to be done"], locale: :ja)
"And furthermore…there is much to be done"
-iex> Bonfire.Common.Localise.Cldr.ellipsis("And furthermore", format: :word)
+iex> Bonfire.Common.Localise.Cldr.ellipsis("And furthermore", format: :word)
"And furthermore …"
-iex> Bonfire.Common.Localise.Cldr.ellipsis(["And furthermore", "there is much to be done"], locale: :ja, format: :word)
+iex> Bonfire.Common.Localise.Cldr.ellipsis(["And furthermore", "there is much to be done"], locale: :ja, format: :word)
"And furthermore … there is much to be done"
@@ -709,23 +709,23 @@ get_locale()
Example
-iex> Bonfire.Common.Localise.Cldr.put_locale("pl")
-iex> Bonfire.Common.Localise.Cldr.get_locale()
-%Cldr.LanguageTag{
+iex> Bonfire.Common.Localise.Cldr.put_locale("pl")
+iex> Bonfire.Common.Localise.Cldr.get_locale()
+%Cldr.LanguageTag{
backend: Elixir.Bonfire.Common.Localise.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: []
+ }
@@ -812,10 +812,10 @@ known_gettext_locale_name(locale_name)
Examples
-iex> Bonfire.Common.Localise.Cldr.known_gettext_locale_name("en")
+iex> Bonfire.Common.Localise.Cldr.known_gettext_locale_name("en")
"en"
-iex> Bonfire.Common.Localise.Cldr.known_gettext_locale_name("en-SA")
+iex> Bonfire.Common.Localise.Cldr.known_gettext_locale_name("en-SA")
false
@@ -858,10 +858,10 @@ known_gettext_locale_name?(locale_name)
Examples
-iex> Bonfire.Common.Localise.Cldr.known_gettext_locale_name?("en")
+iex> Bonfire.Common.Localise.Cldr.known_gettext_locale_name?("en")
true
-iex> Bonfire.Common.Localise.Cldr.known_gettext_locale_name?("!!")
+iex> Bonfire.Common.Localise.Cldr.known_gettext_locale_name?("!!")
false
@@ -935,10 +935,10 @@ known_locale_name(locale_name)
Examples
-iex> Bonfire.Common.Localise.Cldr.known_locale_name(:"en-AU")
+iex> Bonfire.Common.Localise.Cldr.known_locale_name(:"en-AU")
:"en-AU"
-iex> Bonfire.Common.Localise.Cldr.known_locale_name(:"en-SA")
+iex> Bonfire.Common.Localise.Cldr.known_locale_name(:"en-SA")
false
@@ -980,10 +980,10 @@ known_locale_name?(locale_name)
Examples
-iex> Bonfire.Common.Localise.Cldr.known_locale_name?(:en)
+iex> Bonfire.Common.Localise.Cldr.known_locale_name?(:en)
true
-iex> Bonfire.Common.Localise.Cldr.known_locale_name?(:"!!")
+iex> Bonfire.Common.Localise.Cldr.known_locale_name?(:"!!")
false
@@ -1037,8 +1037,8 @@ known_number_system_types()
Example
-iex> Bonfire.Common.Localise.Cldr.known_number_system_types()
-[:default, :finance, :native, :traditional]
+iex> Bonfire.Common.Localise.Cldr.known_number_system_types()
+[:default, :finance, :native, :traditional]
@@ -1103,10 +1103,10 @@ known_rbnf_locale_name(locale_name)
Examples
-iex> Bonfire.Common.Localise.Cldr.known_rbnf_locale_name(:en)
+iex> Bonfire.Common.Localise.Cldr.known_rbnf_locale_name(:en)
:en
-iex> Bonfire.Common.Localise.Cldr.known_rbnf_locale_name(:"en-SA")
+iex> Bonfire.Common.Localise.Cldr.known_rbnf_locale_name(:"en-SA")
false
@@ -1149,10 +1149,10 @@ known_rbnf_locale_name?(locale_name)
Examples
-iex> Bonfire.Common.Localise.Cldr.known_rbnf_locale_name?(:en)
+iex> Bonfire.Common.Localise.Cldr.known_rbnf_locale_name?(:en)
true
-iex> Bonfire.Common.Localise.Cldr.known_rbnf_locale_name?(:"!!")
+iex> Bonfire.Common.Localise.Cldr.known_rbnf_locale_name?(:"!!")
false
@@ -1288,14 +1288,14 @@ put_gettext_locale(locale)
Examples
iex> import Cldr.LanguageTag.Sigil
-iex> Bonfire.Common.Localise.Cldr.put_gettext_locale(~l"en")
-{:ok, "en"}
+iex> Bonfire.Common.Localise.Cldr.put_gettext_locale(~l"en")
+{:ok, "en"}
iex> import Cldr.LanguageTag.Sigil
-iex> Bonfire.Common.Localise.Cldr.put_gettext_locale(~l"de")
-{:error,
- {Cldr.UnknownLocaleError,
- "Locale #Cldr.LanguageTag<de [validated]> does not map to a known gettext locale name"}}
+iex> Bonfire.Common.Localise.Cldr.put_gettext_locale(~l"de")
+{:error,
+ {Cldr.UnknownLocaleError,
+ "Locale #Cldr.LanguageTag<de [validated]> does not map to a known gettext locale name"}}
@@ -1339,29 +1339,29 @@ put_locale(locale_name)
Examples
-iex> Bonfire.Common.Localise.Cldr.put_locale("en")
-{:ok,
- %Cldr.LanguageTag{
+iex> Bonfire.Common.Localise.Cldr.put_locale("en")
+{:ok,
+ %Cldr.LanguageTag{
backend: Bonfire.Common.Localise.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> Bonfire.Common.Localise.Cldr.put_locale("invalid-locale!")
-{:error, {Cldr.LanguageTag.ParseError,
- "Expected a BCP47 language tag. Could not parse the remaining \"!\" starting at position 15"}}
+iex> Bonfire.Common.Localise.Cldr.put_locale("invalid-locale!")
+{:error, {Cldr.LanguageTag.ParseError,
+ "Expected a BCP47 language tag. Could not parse the remaining \"!\" starting at position 15"}}
@@ -1410,10 +1410,10 @@ quote(string, options \\ [])
Examples
-iex> Bonfire.Common.Localise.Cldr.quote("Quoted String")
+iex> Bonfire.Common.Localise.Cldr.quote("Quoted String")
"“Quoted String”"
-iex> Bonfire.Common.Localise.Cldr.quote("Quoted String", locale: :ja)
+iex> Bonfire.Common.Localise.Cldr.quote("Quoted String", locale: :ja)
"「Quoted String」"
@@ -1544,47 +1544,47 @@ validate_locale(locale)
Examples
-iex> Bonfire.Common.Localise.Cldr.validate_locale(:en)
-{:ok,
-%Cldr.LanguageTag{
+iex> Bonfire.Common.Localise.Cldr.validate_locale(:en)
+{:ok,
+%Cldr.LanguageTag{
backend: Bonfire.Common.Localise.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> Bonfire.Common.Localise.Cldr.validate_locale Bonfire.Common.Localise.Cldr.default_locale()
-{:ok,
-%Cldr.LanguageTag{
+iex> Bonfire.Common.Localise.Cldr.validate_locale Bonfire.Common.Localise.Cldr.default_locale()
+{:ok,
+%Cldr.LanguageTag{
backend: Bonfire.Common.Localise.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> Bonfire.Common.Localise.Cldr.validate_locale("zzz")
-{:error, {Cldr.InvalidLanguageError, "The language \"zzz\" is invalid"}}
+iex> Bonfire.Common.Localise.Cldr.validate_locale("zzz")
+{:error, {Cldr.InvalidLanguageError, "The language \"zzz\" is invalid"}}
@@ -1654,23 +1654,23 @@ validate_number_system_type(number_system_t
Examples
-iex> Bonfire.Common.Localise.Cldr.validate_number_system_type(:default)
-{:ok, :default}
+iex> Bonfire.Common.Localise.Cldr.validate_number_system_type(:default)
+{:ok, :default}
-iex> Bonfire.Common.Localise.Cldr.validate_number_system_type(:traditional)
-{:ok, :traditional}
+iex> Bonfire.Common.Localise.Cldr.validate_number_system_type(:traditional)
+{:ok, :traditional}
-iex> Bonfire.Common.Localise.Cldr.validate_number_system_type(:latn)
-{
+iex> Bonfire.Common.Localise.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> Bonfire.Common.Localise.Cldr.validate_number_system_type("bork")
-{
+iex> Bonfire.Common.Localise.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/Bonfire.Common.Localise.Gettext.Helpers.html b/Bonfire.Common.Localise.Gettext.Helpers.html
index cced5a131fc..7d6da449e37 100644
--- a/Bonfire.Common.Localise.Gettext.Helpers.html
+++ b/Bonfire.Common.Localise.Gettext.Helpers.html
@@ -143,9 +143,9 @@
# Simple translation
usage:
- <%= l("Hello") %>
- <%= l("Hello %{name}", name: "Bookchin") %>
- <%= l("Hi", [], "test context") %>
+ <%= l("Hello") %>
+ <%= l("Hello %{name}", name: "Bookchin") %>
+ <%= l("Hi", [], "test context") %>
output:
@@ -157,8 +157,8 @@
# Plural translation
usage:
- <%= lp("Hi friend", "Hi friends", 2) %>
- <%= lp("Hiya %{user_or_users}", "Hiyas %{user_or_users}", 1, [user_or_users: "Bookchin"], "test context") %>
+ <%= lp("Hi friend", "Hi friends", 2) %>
+ <%= lp("Hiya %{user_or_users}", "Hiyas %{user_or_users}", 1, [user_or_users: "Bookchin"], "test context") %>
output:
Hi friends
diff --git a/Bonfire.Common.Localise.Gettext.Plural.html b/Bonfire.Common.Localise.Gettext.Plural.html
index 8d857e54b8a..0011b35d8ad 100644
--- a/Bonfire.Common.Localise.Gettext.Plural.html
+++ b/Bonfire.Common.Localise.Gettext.Plural.html
@@ -221,10 +221,10 @@ nplurals(locale_name)
Examples
-iex> Bonfire.Common.Localise.Gettext.Plural.nplurals("pl")
+iex> Bonfire.Common.Localise.Gettext.Plural.nplurals("pl")
4
-iex> Bonfire.Common.Localise.Gettext.Plural.nplurals("en")
+iex> Bonfire.Common.Localise.Gettext.Plural.nplurals("en")
2
@@ -262,28 +262,28 @@ plural(locale, n)
Examples
-iex> Bonfire.Common.Localise.Gettext.Plural.plural("pl", 1)
+iex> Bonfire.Common.Localise.Gettext.Plural.plural("pl", 1)
0
-iex> Bonfire.Common.Localise.Gettext.Plural.plural("pl", 2)
+iex> Bonfire.Common.Localise.Gettext.Plural.plural("pl", 2)
1
-iex> Bonfire.Common.Localise.Gettext.Plural.plural("pl", 5)
+iex> Bonfire.Common.Localise.Gettext.Plural.plural("pl", 5)
2
-iex> Bonfire.Common.Localise.Gettext.Plural.plural("pl", 112)
+iex> Bonfire.Common.Localise.Gettext.Plural.plural("pl", 112)
2
-iex> Bonfire.Common.Localise.Gettext.Plural.plural("en", 1)
+iex> Bonfire.Common.Localise.Gettext.Plural.plural("en", 1)
0
-iex> Bonfire.Common.Localise.Gettext.Plural.plural("en", 2)
+iex> Bonfire.Common.Localise.Gettext.Plural.plural("en", 2)
1
-iex> Bonfire.Common.Localise.Gettext.Plural.plural("en", 112)
+iex> Bonfire.Common.Localise.Gettext.Plural.plural("en", 112)
1
-iex> Bonfire.Common.Localise.Gettext.Plural.plural("en_GB", 112)
+iex> Bonfire.Common.Localise.Gettext.Plural.plural("en_GB", 112)
1
diff --git a/Bonfire.Common.Test.Interactive.html b/Bonfire.Common.Test.Interactive.html
index 2cae10587a3..ca36abc7764 100644
--- a/Bonfire.Common.Test.Interactive.html
+++ b/Bonfire.Common.Test.Interactive.html
@@ -141,11 +141,11 @@
fcwatch | mix test --stale --listen-on-stdin
to watch for
code changes and run stale tests, but with more control and
without the starting time penalty.
Note that watching requires fswatch on your system.
-Eg on Mac run brew install fswatch
.
To use it, in your project's .iex
file add:
unless GenServer.whereis(Bonfire.Common.Test.Interactive) do
- {:ok, pid} = Bonfire.Common.Test.Interactive.start_link()
+Eg on Mac run brew install fswatch
.To use it, in your project's .iex
file add:
unless GenServer.whereis(Bonfire.Common.Test.Interactive) do
+ {:ok, pid} = Bonfire.Common.Test.Interactive.start_link()
# Process will not exit when the iex goes out
- Process.unlink(pid)
-end
+ Process.unlink(pid)
+end
import Bonfire.Common.Test.Interactive.Helpers
Then to call iex
and run tests just do:
MIX_ENV=test iex -S mix
The Bonfire.Common.Test.Interactive.Helpers
allows to call f
and s
and a
to run failed, stale and all tests respectively.
You can call w
to watch tests and uw
to unwatch.
diff --git a/Bonfire.Data.Assort.Ranked.html b/Bonfire.Data.Assort.Ranked.html
index 958869d2081..c312cddc6f5 100644
--- a/Bonfire.Data.Assort.Ranked.html
+++ b/Bonfire.Data.Assort.Ranked.html
@@ -137,15 +137,15 @@
-A reusable table to link child or related items and also rank sibling items.
Usage (for global ranking, otherwise you should specify scope):
{:ok, first} = Bonfire.Data.Assort.Ranked.changeset(%{item_id: "01FGTH48ZZD08ADBHQ260KYJHW"}) |> repo().insert
-second = Bonfire.Data.Assort.Ranked.changeset(%{item_id: "01FGTH0N3YPBS5MNNAEAEVV54J"}) |> repo().insert
+A reusable table to link child or related items and also rank sibling items.
Usage (for global ranking, otherwise you should specify scope):
{:ok, first} = Bonfire.Data.Assort.Ranked.changeset(%{item_id: "01FGTH48ZZD08ADBHQ260KYJHW"}) |> repo().insert
+second = Bonfire.Data.Assort.Ranked.changeset(%{item_id: "01FGTH0N3YPBS5MNNAEAEVV54J"}) |> repo().insert
import Ecto.Query
-Bonfire.Data.Assort.Ranked |> order_by(:rank) |> repo().all
+Bonfire.Data.Assort.Ranked |> order_by(:rank) |> repo().all
-first |> Bonfire.Data.Assort.Ranked.changeset(%{rank_set: :last}) |> repo().update
+first |> Bonfire.Data.Assort.Ranked.changeset(%{rank_set: :last}) |> repo().update
-Bonfire.Data.Assort.Ranked |> order_by(:rank) |> repo().all
+Bonfire.Data.Assort.Ranked |> order_by(:rank) |> repo().all
diff --git a/Bonfire.Files.html b/Bonfire.Files.html
index e3375b91e67..cef84246130 100644
--- a/Bonfire.Files.html
+++ b/Bonfire.Files.html
@@ -141,10 +141,10 @@
your own - a Bonfire.Files.Definition
is an extension of Waffle.Definition
,
however the allowed_media_types/0
and max_file_size/0
callback are added,
with which you need to define what media types are accepted for these types of uploads.
-(You can also return :all
to accept all media types).
To use the uploader:
iex> {:ok, media} = Bonfire.Files.upload(MyUploader, context, %{path: "./150.png"})
+(You can also return :all
to accept all media types).To use the uploader:
iex> {:ok, media} = Bonfire.Files.upload(MyUploader, context, %{path: "./150.png"})
iex> media.media_type
"image/png"
-iex> Bonfire.Files.remote_url(MyUploader, media)
+iex> Bonfire.Files.remote_url(MyUploader, media)
"/uploads/my/01F3AY6JV30G06BY4DR9BTW5EH"
diff --git a/Bonfire.Me.Accounts.SecondFactors.html b/Bonfire.Me.Accounts.SecondFactors.html
index 3bec0f0c3f1..3f33629f081 100644
--- a/Bonfire.Me.Accounts.SecondFactors.html
+++ b/Bonfire.Me.Accounts.SecondFactors.html
@@ -301,8 +301,8 @@ changeset(totp \\ %AuthSecondFactor{}, attr
Examples
-iex> changeset(%AuthSecondFactor{secret: <<...>>}, code: "123456")
-%Ecto.Changeset{data: %AuthSecondFactor{}}
+iex> changeset(%AuthSecondFactor{secret: <<...>>}, code: "123456")
+%Ecto.Changeset{data: %AuthSecondFactor{}}
diff --git a/EctoSparkles.DataMigration.html b/EctoSparkles.DataMigration.html
index 10c484624a2..ac0843c609c 100644
--- a/EctoSparkles.DataMigration.html
+++ b/EctoSparkles.DataMigration.html
@@ -137,36 +137,36 @@
-A behaviour implemented by our data migrations (generally backfills).
Based on A microframework for backfill migrations in Elixir's Ecto, in turn based on David Bernheisel's template for deterministic backfills.
A data migration using this behaviour may look like this (which you can put simply put in Ecto migrations, eg. priv/repo/migrations/priv/repo/migrations/20231019004944_data_onboarding_step.exs
):
defmodule MyApp.Repo.Migrations.BackfillOnboardingStep do
+A behaviour implemented by our data migrations (generally backfills).
Based on A microframework for backfill migrations in Elixir's Ecto, in turn based on David Bernheisel's template for deterministic backfills.
A data migration using this behaviour may look like this (which you can put simply put in Ecto migrations, eg. priv/repo/migrations/priv/repo/migrations/20231019004944_data_onboarding_step.exs
):
defmodule MyApp.Repo.Migrations.BackfillOnboardingStep do
alias EctoSparkles.DataMigration
use DataMigration
@impl DataMigration
- def base_query do
+ def base_query do
# NOTE: This works in cases where:
# 1. The data can be queried with a condition that not longer applies after the migration ran, so you can repeatedly query the data and update the data until the query result is empty. For example, if a column is currently null and will be updated to not be null, then you can query for the null records and pick up where you left off.
# 2. The migration is written in such a way that it can be ran several times on the same data without causing data loss or duplication (or crashing).
- from(u in "users", # Notice how we do not use Ecto schemas here.
- where: is_nil(u.onboarding_step),
- select: %{id: u.id}
- )
- end
+ from(u in "users", # Notice how we do not use Ecto schemas here.
+ where: is_nil(u.onboarding_step),
+ select: %{id: u.id}
+ )
+ end
@impl DataMigration
- def config do
- %DataMigration.Config{batch_size: 100, throttle_ms: 1_000, repo: MyApp.Repo}
- end
+ def config do
+ %DataMigration.Config{batch_size: 100, throttle_ms: 1_000, repo: MyApp.Repo}
+ end
@impl DataMigration
- def migrate(results) do
- Enum.each(results, fn %{id: user_id} ->
+ def migrate(results) do
+ Enum.each(results, fn %{id: user_id} ->
# hooks into a context module, which is more likely to be kept up to date as the app evolves, to avoid having to update old migrations
user_id
- |> MyApp.Users.set_onboarding_step!()
- end)
- end
-end
+ |> MyApp.Users.set_onboarding_step!()
+ end)
+ end
+end
diff --git a/EctoSparkles.SanitiseStrings.html b/EctoSparkles.SanitiseStrings.html
index 884bc61a859..3dc973eb5d6 100644
--- a/EctoSparkles.SanitiseStrings.html
+++ b/EctoSparkles.SanitiseStrings.html
@@ -269,26 +269,26 @@ strip_all_tags(changeset, opts \\ [])
Examples
-iex> attrs = %{string_field: "<script>Bad</script>"}
+iex> attrs = %{string_field: "<script>Bad</script>"}
iex> result_changeset =
...> attrs
-...> |> FakeEctoSchema.changeset()
-...> |> EctoSparkles.SanitiseStrings.strip_all_tags()
+...> |> FakeEctoSchema.changeset()
+...> |> EctoSparkles.SanitiseStrings.strip_all_tags()
iex> result_changeset.changes
-%{string_field: "Bad"}
Fields can be exempted from sanitization via the :except
option.
iex> attrs = %{string_field: "<script>Bad</script>"}
+%{string_field: "Bad"}
Fields can be exempted from sanitization via the :except
option.
iex> attrs = %{string_field: "<script>Bad</script>"}
iex> result_changeset =
...> attrs
-...> |> FakeEctoSchema.changeset()
-...> |> EctoSparkles.SanitiseStrings.strip_all_tags(except: [:string_field])
+...> |> FakeEctoSchema.changeset()
+...> |> EctoSparkles.SanitiseStrings.strip_all_tags(except: [:string_field])
iex> result_changeset.changes
-%{string_field: "<script>Bad</script>"}
+
%{string_field: "<script>Bad</script>"}
You can also specify a specific scrubber (by passing a function as reference):
-
ies> attrs
...> |> FakeEctoSchema.changeset()
-...> |> EctoSparkles.SanitiseStrings.sanitise_strings(scrubber: HtmlSanitizeEx.Scrubber.html5/1)
+ies> attrs
...> |> FakeEctoSchema.changeset()
+...> |> EctoSparkles.SanitiseStrings.sanitise_strings(scrubber: HtmlSanitizeEx.Scrubber.html5/1)
diff --git a/EctoSparkles.html b/EctoSparkles.html
index d6a1aa32ca0..90924b4bbe2 100644
--- a/EctoSparkles.html
+++ b/EctoSparkles.html
@@ -137,14 +137,14 @@
-query_filter
brings convenience and shortens the boilterplate of ecto queries
Common filters available include:
preload
- Preloads fields onto the query resultsstart_date
- Query for items inserted after this dateend_date
- Query for items inserted before this datebefore
- Get items with IDs before this valueafter
- Get items with IDs after this valueids
- Get items with a list of idsfirst
- Gets the first n itemslast
- Gets the last n itemslimit
- Gets the first n itemsoffset
- Offsets limit by n itemssearch
- Warning: This requires schemas using this to have a &by_search(query, val)
function
You are also able to filter on any natural field of a model, as well as use
- gte/gt
- lte/lt
- like/ilike
- is_nil/not(is_nil)
query_filter(User, %{name: %{ilike: "steve"}})
-query_filter(User, %{name: %{ilike: "steve"}}, :last_name, :asc)
-query_filter(User, %{name: %{age: %{gte: 18, lte: 30}}})
-query_filter(User, %{name: %{is_banned: %{!=: nil}}})
-query_filter(User, %{name: %{is_banned: %{==: nil}}})
-
-my_query = query_filter(User, %{name: "Billy"})
-query_filter(my_query, %{last_name: "Joe"})
+query_filter
brings convenience and shortens the boilterplate of ecto queries
Common filters available include:
preload
- Preloads fields onto the query resultsstart_date
- Query for items inserted after this dateend_date
- Query for items inserted before this datebefore
- Get items with IDs before this valueafter
- Get items with IDs after this valueids
- Get items with a list of idsfirst
- Gets the first n itemslast
- Gets the last n itemslimit
- Gets the first n itemsoffset
- Offsets limit by n itemssearch
- Warning: This requires schemas using this to have a &by_search(query, val)
function
You are also able to filter on any natural field of a model, as well as use
- gte/gt
- lte/lt
- like/ilike
- is_nil/not(is_nil)
query_filter(User, %{name: %{ilike: "steve"}})
+query_filter(User, %{name: %{ilike: "steve"}}, :last_name, :asc)
+query_filter(User, %{name: %{age: %{gte: 18, lte: 30}}})
+query_filter(User, %{name: %{is_banned: %{!=: nil}}})
+query_filter(User, %{name: %{is_banned: %{==: nil}}})
+
+my_query = query_filter(User, %{name: "Billy"})
+query_filter(my_query, %{last_name: "Joe"})
@@ -241,11 +241,11 @@ join_preload(query, associations)
import Ecto.Query
Invoice
-|> join(:left, [i], assoc(i, :customer), as: :customer)
-|> join(:left, [i, c], assoc(c, :account), as: :account)
-|> join(:left, [i], assoc(i, :lines), as: :lines)
-|> preload([lines: v, customers: c, account: a], lines: v, customer: {c, [a: account]})
-|> Repo.all()
+
|> join(:left, [i], assoc(i, :customer), as: :customer)
+|> join(:left, [i, c], assoc(c, :account), as: :account)
+|> join(:left, [i], assoc(i, :lines), as: :lines)
+|> preload([lines: v, customers: c, account: a], lines: v, customer: {c, [a: account]})
+|> Repo.all()
@@ -253,9 +253,9 @@ join_preload(query, associations)
import EctoSparkles
Invoice
-|> join_preload([:customer, :account])
-|> join_preload([:lines])
-|> Repo.all()
+|> join_preload([:customer, :account])
+|> join_preload([:lines])
+|> Repo.all()
@@ -281,13 +281,13 @@ proload(query, qual \\ :left, associations)
-AKA join_preload++
. It's more powerful, but it does it with more (and different!) syntax.
e.g.
proload(query, activity: [
+AKA join_preload++
. It's more powerful, but it does it with more (and different!) syntax.
e.g.
proload(query, activity: [
:verb, :boost_count, :like_count, :replied,
# relations under object will have their aliases prefixed with object_, i.e.
# :object_message, :object_post, :object_post_content
# the original names will still be used for the associations.
- object: {"object_", [:message, :post, :post_content]}
-])
+ object: {"object_", [:message, :post, :post_content]}
+])
diff --git a/Flexto.html b/Flexto.html
index c7d247959f3..6e9f9df4492 100644
--- a/Flexto.html
+++ b/Flexto.html
@@ -199,35 +199,35 @@ flex_schema(otp_app)
Adds additional associations dynamically from app config.
Reads config for the given OTP application, under the name of the
current module. Each key maps to an Ecto.Schema function:
belongs_to
field
has_many
has_one
many_to_many
Each of these keys should map to a keyword list where the key is the
-name of the field or association and the value is one of:
- A type
- A tuple of type and options (keyword list)
Example Schema:
defmodule My.Schema do
+name of the field or association and the value is one of:- A type
- A tuple of type and options (keyword list)
Example Schema:
defmodule My.Schema do
use Ecto.Schema
- import Flexto, only: [flex_schema: 1]
+ import Flexto, only: [flex_schema: 1]
- schema "my_table" do
+ schema "my_table" do
field :name, :string # just normal schema things
- flex_schema(:my_app) # boom! give me the stuff
- end
-end
Example configuration:
config :my_app, My.Schema,
- belongs_to: [
+ flex_schema(:my_app) # boom! give me the stuff
+ end
+end
Example configuration:
config :my_app, My.Schema,
+ belongs_to: [
foo: Foo, # belongs_to :foo, Foo
- bar: {Bar, type: :integer}, # belongs_to :bar, Bar, type: :integer
- ],
- field: [
+ bar: {Bar, type: :integer}, # belongs_to :bar, Bar, type: :integer
+ ],
+ field: [
foo: :string, # field :foo, :string
- bar: {:integer, default: 4}, # field :foo, :integer, default: 4
- ],
- has_one: [
+ bar: {:integer, default: 4}, # field :foo, :integer, default: 4
+ ],
+ has_one: [
foo: Foo, # has_one :foo, Foo
- bar: {Bar, foreign_key: :the_bar_id}, # has_one :bar, Bar, foreign_key: :the_bar_id
- ]
- has_many: [
+ bar: {Bar, foreign_key: :the_bar_id}, # has_one :bar, Bar, foreign_key: :the_bar_id
+ ]
+ has_many: [
foo: Foo, # has_many :foo, Foo
- bar: {Bar, foreign_key: :the_bar_id}, # has_many :bar, Bar, foreign_key: :the_bar_id
- ]
- many_to_many: [
+ bar: {Bar, foreign_key: :the_bar_id}, # has_many :bar, Bar, foreign_key: :the_bar_id
+ ]
+ many_to_many: [
foo: Foo, # many_to_many :foo, Foo
- bar: {Bar, join_through: FooBar}, # many_to_many :bar, Bar, :join_through: FooBar
- ]
This one won't work very well because we define foo
and bar
5
+
bar: {Bar, join_through: FooBar}, # many_to_many :bar, Bar, :join_through: FooBar
+ ]
This one won't work very well because we define foo
and bar
5
times each, but I think you get the point.
Reading of configuration is done during compile time. The relations
will be baked in during compilation, thus:
- Do not expect this to work in runtime config.
- You will need to rebuild all dependencies which use this macro
when you change their configuration.
diff --git a/Mix.Tasks.Bonfire.Account.New.html b/Mix.Tasks.Bonfire.Account.New.html
index ea76d87ee07..01b36267319 100644
--- a/Mix.Tasks.Bonfire.Account.New.html
+++ b/Mix.Tasks.Bonfire.Account.New.html
@@ -143,7 +143,7 @@
Usage
-mix bonfire.account.new [email@address]
You will be prompted for a password and an email if it was not provided.
+mix bonfire.account.new [email@address]
You will be prompted for a password and an email if it was not provided.
diff --git a/Mix.Tasks.Bonfire.Localise.Extract.html b/Mix.Tasks.Bonfire.Localise.Extract.html
index b77d4335773..026fe80ec3b 100644
--- a/Mix.Tasks.Bonfire.Localise.Extract.html
+++ b/Mix.Tasks.Bonfire.Localise.Extract.html
@@ -137,7 +137,7 @@
-Extracts translations by recompiling the Elixir source code.
mix gettext.extract [OPTIONS]
Translations are extracted into POT (Portable Object Template) files (with a
+
Extracts translations by recompiling the Elixir source code.
mix gettext.extract [OPTIONS]
Translations are extracted into POT (Portable Object Template) files (with a
.pot
extension). The location of these files is determined by the :otp_app
and :priv
options given by Gettext modules when they call use Gettext
. One
POT file is generated for each translation domain.
It is possible to give the --merge
option to perform merging
diff --git a/Mix.Tasks.Bonfire.Secrets.html b/Mix.Tasks.Bonfire.Secrets.html
index 5b14b2df8fd..761423ea2a0 100644
--- a/Mix.Tasks.Bonfire.Secrets.html
+++ b/Mix.Tasks.Bonfire.Secrets.html
@@ -137,7 +137,7 @@
-Generates secrets and prints to the terminal.
mix bonfire.secrets [length]
By default, it generates keys 64 characters long.
+
Generates secrets and prints to the terminal.
mix bonfire.secrets [length]
By default, it generates keys 64 characters long.
The minimum value for length
is 32.
diff --git a/Paginator.html b/Paginator.html
index 02d8d56049d..0303f3bd91d 100644
--- a/Paginator.html
+++ b/Paginator.html
@@ -144,10 +144,10 @@
Usage
-defmodule MyApp.Repo do
+defmodule MyApp.Repo do
use Ecto.Repo, otp_app: :my_app
use Paginator
-end
+
end
@@ -160,29 +160,29 @@
Example
-defmodule MyApp.Repo do
+defmodule MyApp.Repo do
use Ecto.Repo, otp_app: :my_app
use Paginator,
limit: 10, # sets the default limit to 10
maximum_limit: 100, # sets the maximum limit to 100
include_total_count: true, # include total count by default
total_count_primary_key_field: :uuid # sets the total_count_primary_key_field to uuid for calculate total_count
-end
Note that these values can be still be overriden when paginate/3
is called.
+
end
Note that these values can be still be overriden when paginate/3
is called.
Use without macros
If you wish to avoid use of macros or you wish to use a different name for
-the pagination function you can define your own function like so:
defmodule MyApp.Repo do
+the pagination function you can define your own function like so:defmodule MyApp.Repo do
use Ecto.Repo, otp_app: :my_app
- def my_paginate_function(queryable, opts \ [], repo_opts \ []) do
- defaults = [limit: 10] # Default options of your choice here
- opts = Keyword.merge(defaults, opts)
- Paginator.paginate(queryable, opts, __MODULE__, repo_opts)
- end
-end
+ def my_paginate_function(queryable, opts \ [], repo_opts \ []) do
+ defaults = [limit: 10] # Default options of your choice here
+ opts = Keyword.merge(defaults, opts)
+ Paginator.paginate(queryable, opts, __MODULE__, repo_opts)
+ end
+end
@@ -317,36 +317,36 @@ paginate(queryable, opts, repo_opts)
Simple example
-query = from(p in Post, order_by: [asc: p.inserted_at, asc: p.id], select: p)
+query = from(p in Post, order_by: [asc: p.inserted_at, asc: p.id], select: p)
-Repo.paginate(query, cursor_fields: [:inserted_at, :id], limit: 50)
+
Repo.paginate(query, cursor_fields: [:inserted_at, :id], limit: 50)
Example with using custom sort directions per field
-query = from(p in Post, order_by: [asc: p.inserted_at, desc: p.id], select: p)
+query = from(p in Post, order_by: [asc: p.inserted_at, desc: p.id], select: p)
-Repo.paginate(query, cursor_fields: [inserted_at: :asc, id: :desc], limit: 50)
+
Repo.paginate(query, cursor_fields: [inserted_at: :asc, id: :desc], limit: 50)
Example with sorting on columns in joined tables
-from(
+from(
p in Post,
as: :posts,
- join: a in assoc(p, :author),
+ join: a in assoc(p, :author),
as: :author,
- preload: [author: a],
+ preload: [author: a],
select: p,
- order_by: [
- {:asc, a.name},
- {:asc, p.id}
- ]
-)
+ order_by: [
+ {:asc, a.name},
+ {:asc, p.id}
+ ]
+)
-Repo.paginate(query, cursor_fields: [{{:author, :name}, :asc}, id: :asc], limit: 50)
When sorting on columns in joined tables it is necessary to use named bindings. In
+
Repo.paginate(query, cursor_fields: [{{:author, :name}, :asc}, id: :asc], limit: 50)
When sorting on columns in joined tables it is necessary to use named bindings. In
this case we name it author
. In the cursor_fields
we refer to this named binding
and its column name.
To build the cursor Paginator uses the returned Ecto.Schema. When using a joined
column the returned Ecto.Schema won't have the value of the joined column
@@ -361,32 +361,32 @@
paginate(queryable, opts, repo_opts)
Example
-from(
+from(
p in Post,
as: :posts,
- join: a in assoc(p, :author),
+ join: a in assoc(p, :author),
as: :author,
- join: c in assoc(a, :company),
+ join: c in assoc(a, :company),
as: :company,
- preload: [author: a],
+ preload: [author: a],
select: p,
- order_by: [
- {:asc, a.name},
- {:asc, p.id}
- ]
-)
-
-Repo.paginate(query,
- cursor_fields: [{{:company, :name}, :asc}, id: :asc],
- fetch_cursor_value_fun: fn
- post, {{:company, name}, _} ->
+ order_by: [
+ {:asc, a.name},
+ {:asc, p.id}
+ ]
+)
+
+Repo.paginate(query,
+ cursor_fields: [{{:company, :name}, :asc}, id: :asc],
+ fetch_cursor_value_fun: fn
+ post, {{:company, name}, _} ->
post.author.company.name
post, field ->
- Paginator.default_fetch_cursor_value(post, field)
- end,
+ Paginator.default_fetch_cursor_value(post, field)
+ end,
limit: 50
-)
+)
@@ -441,10 +441,10 @@ cursor_for_record(record, cursor_fields, fe
Example
-iex> Paginator.cursor_for_record(%Paginator.Customer{id: 1}, [:id])
+iex> Paginator.cursor_for_record(%Paginator.Customer{id: 1}, [:id])
"g3QAAAABZAACaWRhAQ=="
-iex> Paginator.cursor_for_record(%Paginator.Customer{id: 1, name: "Alice"}, [id: :asc, name: :desc])
+iex> Paginator.cursor_for_record(%Paginator.Customer{id: 1, name: "Alice"}, [id: :asc, name: :desc])
"g3QAAAACZAACaWRhAWQABG5hbWVtAAAABUFsaWNl"
@@ -483,10 +483,10 @@ default_fetch_cursor_value(schema, field)
Example
-iex> Paginator.default_fetch_cursor_value(%Paginator.Customer{id: 1}, :id)
+iex> Paginator.default_fetch_cursor_value(%Paginator.Customer{id: 1}, :id)
1
-iex> Paginator.default_fetch_cursor_value(%Paginator.Customer{id: 1, address: %Paginator.Address{city: "London"}}, {:address, :city})
+iex> Paginator.default_fetch_cursor_value(%Paginator.Customer{id: 1, address: %Paginator.Address{city: "London"}}, {:address, :city})
"London"
diff --git a/Pointers.Mixin.html b/Pointers.Mixin.html
index 8e3cf8ee6c8..581e87cc32e 100644
--- a/Pointers.Mixin.html
+++ b/Pointers.Mixin.html
@@ -151,16 +151,16 @@
Declaring a mixin table type
-defmodule My.Mixin do
+defmodule My.Mixin do
use Pointers.Mixin,
otp_app: :my_app,
source: "postgres_table_name"
- mixin_schema do
+ mixin_schema do
field :is_awesome, :boolean
- end
-end
+ end
+end
diff --git a/Pointers.Pointable.html b/Pointers.Pointable.html
index 15ebd0c719f..51e44a9c05a 100644
--- a/Pointers.Pointable.html
+++ b/Pointers.Pointable.html
@@ -148,9 +148,9 @@
source: "my_table", # default name of table in database
table_id: "01EBTVSZJ6X02J01R1XWWPWGZW" # unique ULID to identify table
-pointable_schema do
+pointable_schema do
# ... fields go here, if any
-end
+
end
diff --git a/Pointers.Virtual.html b/Pointers.Virtual.html
index b900a446c70..a8d0c1656c7 100644
--- a/Pointers.Virtual.html
+++ b/Pointers.Virtual.html
@@ -151,9 +151,9 @@
source: "my_table", # default name of view in database
table_id: "01EBTVSZJ6X02J01R1XWWPWGZW" # valid ULID to identify virtual
-virtual_schema do
+virtual_schema do
# ... `has_one`, `has_many`, or *virtual* fields ONLY go here.
-end
+
end
diff --git a/Voodoo.html b/Voodoo.html
index 858dfa0add8..1cdfc9a8a41 100644
--- a/Voodoo.html
+++ b/Voodoo.html
@@ -206,14 +206,14 @@ def_reverse_router(name, opts)
Generates a reverse router function with the given name based upon a
compiled(!) phoenix router module.
Must be used outside of the router module, or else the router won't
-be compiled yet and we won't be able to look up the routes.
Generated function wraps the existing phoenix helpers.
defmodule MyAppWeb.Router do
+be compiled yet and we won't be able to look up the routes.Generated function wraps the existing phoenix helpers.
defmodule MyAppWeb.Router do
use MyAppWeb, :router
# ...
-end
-defmodule MyAppWeb.Router.Reverse do
- import Voodoo, only: [def_reverse_router: 2]
+end
+defmodule MyAppWeb.Router.Reverse do
+ import Voodoo, only: [def_reverse_router: 2]
def_reverse_router :path, for: MyAppWeb.Router
-end
+end
diff --git a/architecture.html b/architecture.html
index a50e87a235c..da4e0c48d28 100644
--- a/architecture.html
+++ b/architecture.html
@@ -164,9 +164,9 @@
Code Structure
-The code is broadly composed namespaces such as these, many of which are packaged as "extensions" which live in separate git repositories, which are included in the app by way of mix dependencies:
Bonfire.*
- Core application logic (very little code).Bonfire.*.*
- Bonfire extensions (eg Bonfire.Social.Posts
) containing mostly context modules, APIs, and routesBonfire.Data.*
- Extensions containing database schemas and migrations Bonfire.UI.*
- UI component extensionsBonfire.*.*.LiveHandler
- Backend logic to handle events in the frontendBonfire.Editor.*
(pluggable text editors, eg. CKEditor for WYSIWYG markdown input)Bonfire.GraphQL.*
- Optional GraphQL APIBonfire.Federate.*
- Optional Federation hooksActivityPub
- ActivityPub S2S models, logic and various helper modules ActivityPub.Web
- ActivityPub S2S REST endpoints, activity ingestion and push federation facilities ValueFlows.*
- economic extensions implementing the ValueFlows vocabulary
Contexts are were we put any core logic. A context often is circumscribed to providing logic for a particular object type (e. g. Bonfire.Social.Posts
implements Bonfire.Data.Social.Post
).
All Bonfire objects use an ULID as their primary key. We use the Pointers
library (with extra logic in Bonfire.Common.Pointers
) to reference any object by its primary key without knowing what type it is beforehand. This is very useful as it allows for example following or liking many different types of objects (as opposed to say only a user or a post) and this approach allows us to store the context of the like/follow by only storing its primary key (see Bonfire.Data.Social.Follow
) for an example.
Context modules usually have one/2
, many/2
, and many_paginated/1
functions for fetching objects, which in turn call a query/2
function. These take a keyword list as filters (and an optional opts
argument) allowing objects to be fetched by arbitrary criteria.
Examples:
Users.one(username: "bob") # Fetching by username
-Posts.many_paginated(by: "01E9TQP93S8XFSV2ZATX1FQ528") # List a page of posts by its author
-EconomicResources.many(deleted: true) # List any deleted resources
Context modules also have functions for creating, updating and deleting objects, as well as hooks for federating or indexing in the search engine.
Here is an incomplete sample of some of current extensions and modules:
Bonfire.Me.Accounts
(for managing and querying local user accounts)Bonfire.Me.Users
(for managing and querying both local and remote user identities and profiles)Bonfire.Boundaries
(for managing and querying circles, ACLs, permissions...)Bonfire.Social.FeedActivities
, Bonfire.Social.Feeds
and Bonfire.Social.Activities
(for managing and querying activities and feeds)Bonfire.Social.Posts
and Bonfire.Social.PostContents
(for managing and querying posts)Bonfire.Social.Threads
(for managing and querying threads and comments)Bonfire.Social.Flags
(for managing and querying flags)Bonfire.Social.Follows
(for managing and querying follows)Bonfire.Classify
(for managing and querying categories, topics, and the like)Bonfire.Tag
(for managing and querying tags and mentions)Bonfire.Geolocate
(for managing and querying locations and geographical coordinates)Bonfire.Quantify
(for managing and querying units and measures)
Additional extensions, libraries, and modules
Bonfire.Common
and Bonfire.Common.Utils
(stuff that gets used everywhere)Bonfire.Application
(OTP application)Bonfire.Me.Characters
(a shared abstraction over users, organisations, categories, and other objects that need to have feeds and behave as an actor in ActivityPub land)Bonfire.Federate.ActivityPub
and ActivityPub
(ActivityPub integration)Bonfire.Search
(local search indexing and search API, powered by Meili)Bonfire.Mailer
, Bonfire.Me.Mails
, and Bamboo
(for rendering and sending emails)Bonfire.Files
, Waffle
, TreeMagic
and TwinkleStar
(for managing uploaded content)Bonfire.GraphQL
(GraphQL API abstractions)Queery
and Bonfire.Repo.Query
(Helpers for making queries on the database)Bonfire.Repo
(Ecto repository)Flexto
(to extend DB schemas in config, especially useful for adding associations)AbsintheClient
(for querying the API from within the server)
+
The code is broadly composed namespaces such as these, many of which are packaged as "extensions" which live in separate git repositories, which are included in the app by way of mix dependencies:
Bonfire.*
- Core application logic (very little code).Bonfire.*.*
- Bonfire extensions (eg Bonfire.Social.Posts
) containing mostly context modules, APIs, and routesBonfire.Data.*
- Extensions containing database schemas and migrations Bonfire.UI.*
- UI component extensionsBonfire.*.*.LiveHandler
- Backend logic to handle events in the frontendBonfire.Editor.*
(pluggable text editors, eg. CKEditor for WYSIWYG markdown input)Bonfire.GraphQL.*
- Optional GraphQL APIBonfire.Federate.*
- Optional Federation hooksActivityPub
- ActivityPub S2S models, logic and various helper modules ActivityPub.Web
- ActivityPub S2S REST endpoints, activity ingestion and push federation facilities ValueFlows.*
- economic extensions implementing the ValueFlows vocabulary
Contexts are were we put any core logic. A context often is circumscribed to providing logic for a particular object type (e. g. Bonfire.Social.Posts
implements Bonfire.Data.Social.Post
).
All Bonfire objects use an ULID as their primary key. We use the Pointers
library (with extra logic in Bonfire.Common.Pointers
) to reference any object by its primary key without knowing what type it is beforehand. This is very useful as it allows for example following or liking many different types of objects (as opposed to say only a user or a post) and this approach allows us to store the context of the like/follow by only storing its primary key (see Bonfire.Data.Social.Follow
) for an example.
Context modules usually have one/2
, many/2
, and many_paginated/1
functions for fetching objects, which in turn call a query/2
function. These take a keyword list as filters (and an optional opts
argument) allowing objects to be fetched by arbitrary criteria.
Examples:
Users.one(username: "bob") # Fetching by username
+Posts.many_paginated(by: "01E9TQP93S8XFSV2ZATX1FQ528") # List a page of posts by its author
+EconomicResources.many(deleted: true) # List any deleted resources
Context modules also have functions for creating, updating and deleting objects, as well as hooks for federating or indexing in the search engine.
Here is an incomplete sample of some of current extensions and modules:
Bonfire.Me.Accounts
(for managing and querying local user accounts)Bonfire.Me.Users
(for managing and querying both local and remote user identities and profiles)Bonfire.Boundaries
(for managing and querying circles, ACLs, permissions...)Bonfire.Social.FeedActivities
, Bonfire.Social.Feeds
and Bonfire.Social.Activities
(for managing and querying activities and feeds)Bonfire.Social.Posts
and Bonfire.Social.PostContents
(for managing and querying posts)Bonfire.Social.Threads
(for managing and querying threads and comments)Bonfire.Social.Flags
(for managing and querying flags)Bonfire.Social.Follows
(for managing and querying follows)Bonfire.Classify
(for managing and querying categories, topics, and the like)Bonfire.Tag
(for managing and querying tags and mentions)Bonfire.Geolocate
(for managing and querying locations and geographical coordinates)Bonfire.Quantify
(for managing and querying units and measures)
Additional extensions, libraries, and modules
Bonfire.Common
and Bonfire.Common.Utils
(stuff that gets used everywhere)Bonfire.Application
(OTP application)Bonfire.Me.Characters
(a shared abstraction over users, organisations, categories, and other objects that need to have feeds and behave as an actor in ActivityPub land)Bonfire.Federate.ActivityPub
and ActivityPub
(ActivityPub integration)Bonfire.Search
(local search indexing and search API, powered by Meili)Bonfire.Mailer
, Bonfire.Me.Mails
, and Bamboo
(for rendering and sending emails)Bonfire.Files
, Waffle
, TreeMagic
and TwinkleStar
(for managing uploaded content)Bonfire.GraphQL
(GraphQL API abstractions)Queery
and Bonfire.Repo.Query
(Helpers for making queries on the database)Bonfire.Repo
(Ecto repository)Flexto
(to extend DB schemas in config, especially useful for adding associations)AbsintheClient
(for querying the API from within the server)
diff --git a/bonfire-flavoured-elixir.html b/bonfire-flavoured-elixir.html
index 330e08ea963..9e55d812378 100644
--- a/bonfire-flavoured-elixir.html
+++ b/bonfire-flavoured-elixir.html
@@ -141,33 +141,33 @@
Arrows
The Elixir |> ("pipe") operator is one of the things that seems to get people excited about elixir. Probably in part because you then don't have to keep coming up with function names. Unfortunately it's kind of limiting.
-The moment you need to pipe a parameter into a position that isn't the first one, it breaks down and you have to drop out of the pipeline format or write a secondary function to handle it.
Not any more! By simply inserting ...
where you would like the value to be inserted, Arrows
will override where it is placed. This allows you to keep on piping while accommodating that function with the annoying argument order. Arrows
was inspired by an existing library. Here is part of the test suite in lieu of examples:
defmodule ArrowsTest do
+The moment you need to pipe a parameter into a position that isn't the first one, it breaks down and you have to drop out of the pipeline format or write a secondary function to handle it.Not any more! By simply inserting ...
where you would like the value to be inserted, Arrows
will override where it is placed. This allows you to keep on piping while accommodating that function with the annoying argument order. Arrows
was inspired by an existing library. Here is part of the test suite in lieu of examples:
defmodule ArrowsTest do
use ExUnit.Case
use Arrows
- def double(x), do: x * 2
- def double_fst(x, _), do: x * 2
- def double_snd(_, x), do: x * 2
- def add_snd_thd(_, x, y), do: x + y
-
- test "|>" do
- assert 4 == (2 |> double)
- assert 4 == (2 |> double())
- assert 4 == (2 |> double(...))
- assert 8 == (2 |> double(double(...)))
- assert 4 == (2 |> double_fst(1))
- assert 4 == (2 |> double_fst(..., 1))
- assert 8 == (2 |> double_fst(double(...), 1))
- assert 4 == (2 |> double_snd(1, ...))
- assert 8 == (2 |> double_snd(1, double(...)))
- assert 3 == (2 |> add_snd_thd(1, ..., 1))
- assert 4 == (2 |> add_snd_thd(1, ..., ...))
- assert 6 == (2 |> add_snd_thd(1, ..., double(...)))
- for x <- [:yes, 2, nil, false] do
- assert {:ok, x} == (x |> {:ok, ...})
- end
- end
-end
A few little extra features you might notice here:
- You can move the parameter into a subexpression, as in
2 |> double_fst(double(...), 1)
where double will be called before the parameter is passed to double_fst
. - You can use
...
multiple times, substituting it in multiple places. - The right hand side need not even be a function call, you can use any expression with
...
.
+
def double(x), do: x * 2
+ def double_fst(x, _), do: x * 2
+ def double_snd(_, x), do: x * 2
+ def add_snd_thd(_, x, y), do: x + y
+
+ test "|>" do
+ assert 4 == (2 |> double)
+ assert 4 == (2 |> double())
+ assert 4 == (2 |> double(...))
+ assert 8 == (2 |> double(double(...)))
+ assert 4 == (2 |> double_fst(1))
+ assert 4 == (2 |> double_fst(..., 1))
+ assert 8 == (2 |> double_fst(double(...), 1))
+ assert 4 == (2 |> double_snd(1, ...))
+ assert 8 == (2 |> double_snd(1, double(...)))
+ assert 3 == (2 |> add_snd_thd(1, ..., 1))
+ assert 4 == (2 |> add_snd_thd(1, ..., ...))
+ assert 6 == (2 |> add_snd_thd(1, ..., double(...)))
+ for x <- [:yes, 2, nil, false] do
+ assert {:ok, x} == (x |> {:ok, ...})
+ end
+ end
+end
A few little extra features you might notice here:
- You can move the parameter into a subexpression, as in
2 |> double_fst(double(...), 1)
where double will be called before the parameter is passed to double_fst
. - You can use
...
multiple times, substituting it in multiple places. - The right hand side need not even be a function call, you can use any expression with
...
.
@@ -181,14 +181,14 @@
Untangle
provides replacements for the macros in Elixir's Logger
module and the IO.inspect
function to output code location information. The first argument will be inspect
ed and the second (where provided) will be used as a label:
iex(1)> import Untangle
Untangle
-iex(2)> debug(:no, "the answer is") # log at debug
-11:19:09.915 [debug] [iex:2] the answer is: :no
+iex(2)> debug(:no, "the answer is") # log at debug
+11:19:09.915 [debug] [iex:2] the answer is: :no
:no
-iex(3)> dump(%{a: :map}, "it") # inspect something on stdout
-[iex:3] it: %{a: :map}
-%{a: :map}
When used in a code file, the location information becomes slightly more useful, e.g.:
[lib/test_untangle.ex:15@Test.Untangle.example/2] Here's an empty list: []
You may also notice from the iex output that it returns its first argument. This makes it ideal for
-inserting into a pipeline for debugging purposes:
do_something()
-|> debug("output of do_something/0")
When you are done debugging something, the location of the debug statement is already in the output so you know where to remove it or comment it out! Bliss!
You will find the codebase uses this a lot, though the debugs are frequently commented out. Just uncomment the ones that would help you with a particular debugging task and you're off.
+
iex(3)> dump(%{a: :map}, "it") # inspect something on stdout
+[iex:3] it: %{a: :map}
+%{a: :map}
When used in a code file, the location information becomes slightly more useful, e.g.:
[lib/test_untangle.ex:15@Test.Untangle.example/2] Here's an empty list: []
You may also notice from the iex output that it returns its first argument. This makes it ideal for
+inserting into a pipeline for debugging purposes:
do_something()
+|> debug("output of do_something/0")
When you are done debugging something, the location of the debug statement is already in the output so you know where to remove it or comment it out! Bliss!
You will find the codebase uses this a lot, though the debugs are frequently commented out. Just uncomment the ones that would help you with a particular debugging task and you're off.
diff --git a/bonfire_umbrella.epub b/bonfire_umbrella.epub
index 738a4aef784689120bd5d5befb75b37ea47157e3..9db614a897f08d79088b0bf1127e4a2fa4601e94 100644
GIT binary patch
delta 310600
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