Skip to content
Permalink
Browse files
tpl/lang: Add new localized versions of lang.FormatNumber etc.
Fixes #8820
  • Loading branch information
bep committed Jul 29, 2021
1 parent 726fe9c commit 7907d24ba16fc5a80930c1aabf5144e684ff7f29
@@ -28,15 +28,15 @@ func TestTimeFormatter(t *testing.T) {
june06 = june06.Add(7777 * time.Second)

c.Run("Norsk nynorsk", func(c *qt.C) {
f := NewTimeFormatter(translators.Get("nn"))
f := NewTimeFormatter(translators.GetTranslator("nn"))

c.Assert(f.Format(june06, "Monday Jan 2 2006"), qt.Equals, "onsdag juni 6 2018")
c.Assert(f.Format(june06, "Mon January 2 2006"), qt.Equals, "on. juni 6 2018")
c.Assert(f.Format(june06, "Mon Mon"), qt.Equals, "on. on.")
})

c.Run("Custom layouts Norsk nynorsk", func(c *qt.C) {
f := NewTimeFormatter(translators.Get("nn"))
f := NewTimeFormatter(translators.GetTranslator("nn"))

c.Assert(f.Format(june06, ":date_full"), qt.Equals, "onsdag 6. juni 2018")
c.Assert(f.Format(june06, ":date_long"), qt.Equals, "6. juni 2018")
@@ -51,7 +51,7 @@ func TestTimeFormatter(t *testing.T) {
})

c.Run("Custom layouts English", func(c *qt.C) {
f := NewTimeFormatter(translators.Get("en"))
f := NewTimeFormatter(translators.GetTranslator("en"))

c.Assert(f.Format(june06, ":date_full"), qt.Equals, "Wednesday, June 6, 2018")
c.Assert(f.Format(june06, ":date_long"), qt.Equals, "June 6, 2018")
@@ -66,7 +66,7 @@ func TestTimeFormatter(t *testing.T) {
})

c.Run("English", func(c *qt.C) {
f := NewTimeFormatter(translators.Get("en"))
f := NewTimeFormatter(translators.GetTranslator("en"))

c.Assert(f.Format(june06, "Monday Jan 2 2006"), qt.Equals, "Wednesday Jun 6 2018")
c.Assert(f.Format(june06, "Mon January 2 2006"), qt.Equals, "Wed June 6 2018")
@@ -88,7 +88,7 @@ func BenchmarkTimeFormatter(b *testing.B) {
})

b.Run("Localized", func(b *testing.B) {
f := NewTimeFormatter(translators.Get("nn"))
f := NewTimeFormatter(translators.GetTranslator("nn"))
b.ResetTimer()
for i := 0; i < b.N; i++ {
got := f.Format(june06, "Monday Jan 2 2006")
@@ -99,7 +99,7 @@ func BenchmarkTimeFormatter(b *testing.B) {
})

b.Run("Localized Custom", func(b *testing.B) {
f := NewTimeFormatter(translators.Get("nn"))
f := NewTimeFormatter(translators.GetTranslator("nn"))
b.ResetTimer()
for i := 0; i < b.N; i++ {
got := f.Format(june06, ":date_medium")
@@ -134,7 +134,7 @@ Or individually access EXIF data with dot access, e.g.:
{{ end }}
```

Some fields may need to be formatted with [`lang.NumFmt`]({{< relref "functions/numfmt" >}}) function to prevent display like `Aperture: 2.278934289` instead of `Aperture: 2.28`.
Some fields may need to be formatted with [`lang.FormatNumberCustom`]({{< relref "functions/lang" >}}) function to prevent display like `Aperture: 2.278934289` instead of `Aperture: 2.28`.

#### Exif fields

@@ -1,29 +1,22 @@
---
title: lang.NumFmt
description: "Formats a number with a given precision using the requested `negative`, `decimal`, and `grouping` options. The `options` parameter is a string consisting of `<negative> <decimal> <grouping>`."
godocref: ""
date: 2017-02-01
publishdate: 2017-02-01
lastmod: 2017-08-21
title: lang
package: lang
description: "TODO.."
date: 2021-07-28
categories: [functions]
keywords: [numbers]
menu:
docs:
parent: "functions"
toc: false
signature: ["lang.NumFmt PRECISION NUMBER [OPTIONS [DELIMITER]]"]
workson: []
hugoversion:
relatedfuncs: []
deprecated: false
draft: false
aliases: []
comments:
aliases: ['/functions/numfmt/']
type: 'template-func'
---

The default options value is `- . ,`. The default delimiter within the options
value is a space. If you need to use a space as one of the options, set a
custom delimiter.
custom delimiter.s

Numbers greater than or equal to 5 are rounded up. For example, if precision is set to `0`, `1.5` becomes `2`, and `1.4` becomes `1`.

@@ -19,6 +19,7 @@ deprecated: false
aliases: []
---


`time` converts a timestamp string with an optional default location into a [`time.Time`](https://godoc.org/time#Time) structure so you can access its fields:

```
@@ -1677,6 +1677,9 @@
"caches": {
"_merge": "none"
},
"cascade": {
"_merge": "none"
},
"frontmatter": {
"_merge": "none"
},
@@ -1745,7 +1748,7 @@
"keepDocumentTags": true,
"keepEndTags": true,
"keepQuotes": false,
"keepWhitespace": false
"keepWhitespace": true
},
"css": {
"keepCSS2": true,
@@ -1756,7 +1759,8 @@
"keepVarNames": false
},
"json": {
"precision": 0
"precision": 0,
"keepNumbers": false
},
"svg": {
"precision": 0
@@ -3898,14 +3902,52 @@
}
},
"lang": {
"Merge": {
"Description": "",
"Args": null,
"FormatAccounting": {
"Description": "FormatAccounting returns the currency reprecentation of number for the given currency and precision\nfor the current language in accounting notation.",
"Args": [
"precision",
"currency",
"number"
],
"Aliases": null,
"Examples": null
"Examples": [
[
"{{ 512.5032 | lang.FormatAccounting 2 \"NOK\" }}",
"NOK512.50"
]
]
},
"NumFmt": {
"Description": "NumFmt formats a number with the given precision using the\nnegative, decimal, and grouping options. The `options`\nparameter is a string consisting of `\u003cnegative\u003e \u003cdecimal\u003e \u003cgrouping\u003e`. The\ndefault `options` value is `- . ,`.\n\nNote that numbers are rounded up at 5 or greater.\nSo, with precision set to 0, 1.5 becomes `2`, and 1.4 becomes `1`.",
"FormatCurrency": {
"Description": "FormatCurrency returns the currency reprecentation of number for the given currency and precision\nfor the current language.",
"Args": [
"precision",
"currency",
"number"
],
"Aliases": null,
"Examples": [
[
"{{ 512.5032 | lang.FormatCurrency 2 \"USD\" }}",
"$512.50"
]
]
},
"FormatNumber": {
"Description": "FormatNumber formats number with the given precision for the current language.",
"Args": [
"precision",
"number"
],
"Aliases": null,
"Examples": [
[
"{{ 512.5032 | lang.FormatNumber 2 }}",
"512.50"
]
]
},
"FormatNumberCustom": {
"Description": "FormatNumberCustom formats a number with the given precision using the\nnegative, decimal, and grouping options. The `options`\nparameter is a string consisting of `\u003cnegative\u003e \u003cdecimal\u003e \u003cgrouping\u003e`. The\ndefault `options` value is `- . ,`.\n\nNote that numbers are rounded up at 5 or greater.\nSo, with precision set to 0, 1.5 becomes `2`, and 1.4 becomes `1`.\n\nFor a simpler function that adapts to the current language, see FormatNumberCustom.",
"Args": [
"precision",
"number",
@@ -3914,19 +3956,19 @@
"Aliases": null,
"Examples": [
[
"{{ lang.NumFmt 2 12345.6789 }}",
"{{ lang.FormatNumberCustom 2 12345.6789 }}",
"12,345.68"
],
[
"{{ lang.NumFmt 2 12345.6789 \"- , .\" }}",
"{{ lang.FormatNumberCustom 2 12345.6789 \"- , .\" }}",
"12.345,68"
],
[
"{{ lang.NumFmt 6 -12345.6789 \"- .\" }}",
"{{ lang.FormatNumberCustom 6 -12345.6789 \"- .\" }}",
"-12345.678900"
],
[
"{{ lang.NumFmt 0 -12345.6789 \"- . ,\" }}",
"{{ lang.FormatNumberCustom 0 -12345.6789 \"- . ,\" }}",
"-12,346"
],
[
@@ -3935,6 +3977,32 @@
]
]
},
"FormatPercent": {
"Description": "FormatPercent formats number with the given precision for the current language.\nNote that the number is assumbed to be percent.",
"Args": [
"precision",
"number"
],
"Aliases": null,
"Examples": [
[
"{{ 512.5032 | lang.FormatPercent 2 }}",
"512.50%"
]
]
},
"Merge": {
"Description": "",
"Args": null,
"Aliases": null,
"Examples": null
},
"NumFmt": {
"Description": "",
"Args": null,
"Aliases": null,
"Examples": null
},
"Translate": {
"Description": "Translate returns a translated string for id.",
"Args": [
@@ -0,0 +1,54 @@
{{ $pkg := .Params.package}}
{{ $funcs := index site.Data.docs.tpl.funcs $pkg }}

{{ range $k, $v := $funcs }}
{{ if $v.Description }}
{{ $func := printf "%s.%s" $pkg $k }}
<h2>
<a class="header-link" href="#{{ $func | anchorize | safeURL }}">
<svg class="fill-current o-60 hover-accent-color-light" height="22px" viewBox="0 0 24 24" width="22px" xmlns="http://www.w3.org/2000/svg">
<path d="M0 0h24v24H0z" fill="none"/>
<path d="M3.9 12c0-1.71 1.39-3.1 3.1-3.1h4V7H7c-2.76 0-5 2.24-5 5s2.24 5 5 5h4v-1.9H7c-1.71 0-3.1-1.39-3.1-3.1zM8 13h8v-2H8v2zm9-6h-4v1.9h4c1.71 0 3.1 1.39 3.1 3.1s-1.39 3.1-3.1 3.1h-4V17h4c2.76 0 5-2.24 5-5s-2.24-5-5-5z"/>
</svg>
</a>
{{ $func }}
</h2>
{{ with $v.Description }}
<p class="f4 lh-copy">
{{ . | $.RenderString | safeHTML }}
</p>
{{ end }}
<h4 class="minor mb3 pt2 primary-color-dark">
Syntax
</h4>
<div class="f5 mb4 ph3 pv2 bg-light-gray" style="border-left:4px solid #0594CB;">
{{ $pkg }}.{{ $k }}
{{ with $v.Args }}
<span class="ttu">
{{ delimit $v.Args ", "}}
</span>
{{ end }}
<span></span>
</div>
{{ if $v.Examples }}
<h4 class="minor mb3 pt2 primary-color-dark">
Examples
</h4>
{{ end }}
{{ range $v.Examples }}
{{ $input := index . 0 }}
{{ $result := index . 1 }}
{{ $example := printf "%s ---> %s" $input $result }}

{{ highlight $example "go-html-template" "" }}
{{ end }}
{{ with $v.Aliases }}
<h4 class="minor mb3 pt2 primary-color-dark">
Aliases
</h4>
<p>
{{ delimit . ", "}}
</p>
{{ end }}
{{ end }}
{{ end }}
2 go.mod
@@ -12,7 +12,7 @@ require (
github.com/bep/gitmap v1.1.2
github.com/bep/godartsass v0.12.0
github.com/bep/golibsass v1.0.0
github.com/bep/gotranslators v0.0.0-20210726170149-50377fc92c80
github.com/bep/gotranslators v0.2.0
github.com/bep/gowebp v0.1.0
github.com/bep/tmc v0.5.1
github.com/cli/safeexec v1.0.0
2 go.sum
@@ -136,6 +136,8 @@ github.com/bep/golibsass v1.0.0 h1:gNguBMSDi5yZEZzVZP70YpuFQE3qogJIGUlrVILTmOw=
github.com/bep/golibsass v1.0.0/go.mod h1:DL87K8Un/+pWUS75ggYv41bliGiolxzDKWJAq3eJ1MA=
github.com/bep/gotranslators v0.0.0-20210726170149-50377fc92c80 h1:FuOr7TE02FmHwf0HbOzfN0UyQfHoZd1R3PVuYduFU6U=
github.com/bep/gotranslators v0.0.0-20210726170149-50377fc92c80/go.mod h1:/tUOv4Jdczp4ZggwBAQriNN97HsQdG1Gm+yV0PsIGD8=
github.com/bep/gotranslators v0.2.0 h1:GW0mGPivOY4drd4HwWpn44HXBo5zc5iHdDJZj3yWb/k=
github.com/bep/gotranslators v0.2.0/go.mod h1:fbo6ptvCVYarnHjBm4BvOJX0o18VEvA0slN7xKvqXzc=
github.com/bep/gowebp v0.1.0 h1:4/iQpfnxHyXs3x/aTxMMdOpLEQQhFmF6G7EieWPTQyo=
github.com/bep/gowebp v0.1.0/go.mod h1:ZhFodwdiFp8ehGJpF4LdPl6unxZm9lLFjxD3z2h2AgI=
github.com/bep/tmc v0.5.1 h1:CsQnSC6MsomH64gw0cT5f+EwQDcvZz4AazKunFwTpuI=
@@ -79,3 +79,52 @@ name = "foo-a"

})
}

func TestLanguageNumberFormatting(t *testing.T) {

b := newTestSitesBuilder(t)
b.WithConfigFile("toml", `
baseURL = "https://example.org"
defaultContentLanguage = "en"
defaultContentLanguageInSubDir = true
[languages]
[languages.en]
timeZone="UTC"
weight=10
[languages.nn]
weight=20
`)

b.WithTemplates("index.html", `
FormatNumber: {{ 512.5032 | lang.FormatNumber 2 }}
FormatPercent: {{ 512.5032 | lang.FormatPercent 2 }}
FormatCurrency: {{ 512.5032 | lang.FormatCurrency 2 "USD" }}
FormatAccounting: {{ 512.5032 | lang.FormatAccounting 2 "NOK" }}
FormatNumberCustom: {{ lang.FormatNumberCustom 2 12345.6789 }}
# We renamed this to FormatNumberCustom in 0.87.0.
NumFmt: {{ -98765.4321 | lang.NumFmt 2 }}
`)
b.WithContent("p1.md", "")

b.Build(BuildCfg{})

b.AssertFileContent("public/en/index.html", `
FormatNumber: 512.50
FormatPercent: 512.50%
FormatCurrency: $512.50
FormatAccounting: NOK512.50
FormatNumberCustom: 12,345.68
NumFmt: -98,765.43
`,
)

b.AssertFileContent("public/nn/index.html", "FormatNumber: 512,50\nFormatPercent: 512,50\u00a0%\nFormatCurrency: 512,50\u00a0USD\nFormatAccounting: 512,50\u00a0kr")
}
@@ -97,11 +97,11 @@ func NewLanguage(lang string, cfg config.Provider) *Language {

localCfg := config.New()
compositeConfig := config.NewCompositeConfig(cfg, localCfg)
translator := translators.Get(lang)
translator := translators.GetTranslator(lang)
if translator == nil {
translator = translators.Get(cfg.GetString("defaultContentLanguage"))
translator = translators.GetTranslator(cfg.GetString("defaultContentLanguage"))
if translator == nil {
translator = translators.Get("en")
translator = translators.GetTranslator("en")
}
}

0 comments on commit 7907d24

Please sign in to comment.