New Upstream Release - golang-github-nicksnyder-go-i18n.v2

Ready changes

Summary

Merged new upstream version: 2.2.1 (was: 2.2.0).

Resulting package

Built on 2023-04-06T23:58 (took 6m16s)

The resulting binary packages can be installed (if you have the apt repository enabled) by running one of:

apt install -t fresh-releases golang-github-nicksnyder-go-i18n.v2-dev

Lintian Result

Diff

diff --git a/.github/README.zh-Hans.md b/.github/README.zh-Hans.md
new file mode 100644
index 0000000..bd71f10
--- /dev/null
+++ b/.github/README.zh-Hans.md
@@ -0,0 +1,145 @@
+# go-i18n ![Build status](https://github.com/nicksnyder/go-i18n/workflows/Build/badge.svg) [![Report card](https://goreportcard.com/badge/github.com/nicksnyder/go-i18n)](https://goreportcard.com/report/github.com/nicksnyder/go-i18n) [![codecov](https://codecov.io/gh/nicksnyder/go-i18n/branch/master/graph/badge.svg)](https://codecov.io/gh/nicksnyder/go-i18n) [![Sourcegraph](https://sourcegraph.com/github.com/nicksnyder/go-i18n/-/badge.svg)](https://sourcegraph.com/github.com/nicksnyder/go-i18n?badge)
+
+go-i18n 是一个帮助您将 Go 程序翻译成多种语言的 Go [包](#package-i18n) 和 [命令](#command-goi18n)。
+
+- 支持 [Unicode Common Locale Data Repository (CLDR)](https://www.unicode.org/cldr/charts/28/supplemental/language_plural_rules.html) 中所有 200 多种语言的 [复数字符](http://cldr.unicode.org/index/cldr-spec/plural-rules)。
+  - 代码和测试是从 [CLDR 数据](http://cldr.unicode.org/index/downloads) 中 [自动生成](https://github.com/nicksnyder/go-i18n/tree/main/v2/internal/plural/codegen) 的。
+- 使用 [text/template](http://golang.org/pkg/text/template/) 语法支持带有命名变量的字符串。
+- 支持任何格式的消息文件(例如:JSON、TOML、YAML)。
+
+<strong align="center">
+<samp>
+
+[**English**](../README.md) · [**简体中文**](README.zh-Hans.md)
+
+</samp>
+</strong>
+
+## Package i18n
+
+[![GoDoc](https://godoc.org/github.com/nicksnyder/go-i18n?status.svg)](https://godoc.org/github.com/nicksnyder/go-i18n/v2/i18n)
+
+i18n 包支持根据一组语言环境首选项查找消息。
+
+```go
+import "github.com/nicksnyder/go-i18n/v2/i18n"
+```
+
+创建一个 Bundle 以在应用程序的整个生命周期中使用。
+
+```go
+bundle := i18n.NewBundle(language.English)
+```
+
+在初始化期间将翻译加载到您的 bundle 中。
+
+```go
+bundle.RegisterUnmarshalFunc("toml", toml.Unmarshal)
+bundle.LoadMessageFile("es.toml")
+```
+
+```go
+// 如果使用 go:embed
+//go:embed locale.*.toml
+var LocaleFS embed.FS
+
+bundle.RegisterUnmarshalFunc("toml", toml.Unmarshal)
+bundle.LoadMessageFileFS(LocaleFS, "locale.es.toml")
+```
+
+创建一个 Localizer 以用于一组语言首选项。
+
+```go
+func(w http.ResponseWriter, r *http.Request) {
+    lang := r.FormValue("lang")
+    accept := r.Header.Get("Accept-Language")
+    localizer := i18n.NewLocalizer(bundle, lang, accept)
+}
+```
+
+使用 Localizer 查找消息。
+
+```go
+localizer.Localize(&i18n.LocalizeConfig{
+    DefaultMessage: &i18n.Message{
+        ID: "PersonCats",
+        One: "{{.Name}} has {{.Count}} cat.",
+        Other: "{{.Name}} has {{.Count}} cats.",
+    },
+    TemplateData: map[string]interface{}{
+        "Name": "Nick",
+        "Count": 2,
+    },
+    PluralCount: 2,
+}) // Nick has 2 cats.
+```
+
+## goi18n 命令
+
+[![GoDoc](https://godoc.org/github.com/nicksnyder/go-i18n?status.svg)](https://godoc.org/github.com/nicksnyder/go-i18n/v2/goi18n)
+
+goi18n 命令管理 i18n 包使用的消息文件。
+
+```
+go get -u github.com/nicksnyder/go-i18n/v2/goi18n
+goi18n -help
+```
+
+### 提取消息
+
+使用 `goi18n extract` 将 Go 源文件中的所有 i18n.Message 结构文字提取到消息文件中以进行翻译。
+
+```toml
+# active.en.toml
+[PersonCats]
+description = "The number of cats a person has"
+one = "{{.Name}} has {{.Count}} cat."
+other = "{{.Name}} has {{.Count}} cats."
+```
+
+### 翻译一种新语言
+
+1. 为您要添加的语言创建一个空消息文件(例如:`translate.es.toml`)。
+2. 运行 `goi18n merge active.en.toml translate.es.toml` 以填充 `translate.es.toml` 要翻译的消息。
+
+   ```toml
+   # translate.es.toml
+   [HelloPerson]
+   hash = "sha1-5b49bfdad81fedaeefb224b0ffc2acc58b09cff5"
+   other = "Hello {{.Name}}"
+   ```
+
+3. 翻译完成 `translate.es.toml` 后,将其重命名为 `active.es.toml``。
+
+   ```toml
+   # active.es.toml
+   [HelloPerson]
+   hash = "sha1-5b49bfdad81fedaeefb224b0ffc2acc58b09cff5"
+   other = "Hola {{.Name}}"
+   ```
+
+4. 加载 `active.es.toml` 到您的 bundle 中。
+
+   ```go
+   bundle.RegisterUnmarshalFunc("toml", toml.Unmarshal)
+   bundle.LoadMessageFile("active.es.toml")
+   ```
+
+### 翻译新消息
+
+如果您在程序中添加了新消息:
+
+1. 运行 `goi18n extract` 以使用新消息更新 `active.en.toml`。
+2. 运行 `goi18n merge active.*.toml` 以生成更新的 `translate.*.toml` 文件。
+3. 翻译 `translate.*.toml` 文件中的所有消息。
+4. 运行 `goi18n merge active.*.toml translate.*.toml` 将翻译后的消息合并到 active 消息文件中。
+
+## 有关更多信息和示例:
+
+- 阅读 [文档](https://godoc.org/github.com/nicksnyder/go-i18n/v2)。
+- 查看 [代码示例](https://github.com/nicksnyder/go-i18n/blob/main/v2/i18n/example_test.go) 和 [测试](https://github.com/nicksnyder/go-i18n/blob/main/v2/i18n/localizer_test.go)。
+- 查看一个示例 [程序](https://github.com/nicksnyder/go-i18n/tree/main/v2/example)。
+
+## 许可证
+
+go-i18n 在 MIT 许可下可用。有关更多信息,请参阅 [许可证](LICENSE) 文件。
diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml
index 55d9460..e505baf 100644
--- a/.github/workflows/build.yml
+++ b/.github/workflows/build.yml
@@ -6,12 +6,12 @@ jobs:
   build:
     name: Build
     runs-on: ubuntu-latest
-    if: (github.event_name == 'push' && github.repository_owner == 'nicksnyder') || (github.event_name == 'pull_request' && github.repository_owner != 'nicksnyder')
+    if: (github.event_name == 'push' && github.ref == 'refs/heads/main') || github.event_name == 'pull_request'
     steps:
       - name: Install Go
         uses: actions/setup-go@v2
         with:
-          go-version: 1.15.2
+          go-version: 1.19.3
       - name: Git checkout
         uses: actions/checkout@v2
       - name: Build
@@ -25,15 +25,15 @@ jobs:
         run: go test -race -coverprofile=coverage.txt -covermode=atomic ./...
       - name: Upload coverage
         uses: codecov/codecov-action@v1
-  build_1_9_7:
-    name: Build with Go 1.9.7
+  build_1_12:
+    name: Build with Go 1.12.17
     runs-on: ubuntu-latest
-    if: (github.event_name == 'push' && github.repository_owner == 'nicksnyder') || (github.event_name == 'pull_request' && github.repository_owner != 'nicksnyder')
+    if: (github.event_name == 'push' && github.ref == 'refs/heads/main') || github.event_name == 'pull_request'
     steps:
       - name: Install Go
         uses: actions/setup-go@v2
         with:
-          go-version: 1.9.7
+          go-version: 1.12.17
       - name: Git checkout
         uses: actions/checkout@v2
         with:
diff --git a/.github/workflows/goreleaser.yml b/.github/workflows/goreleaser.yml
index a4da704..3148e4d 100644
--- a/.github/workflows/goreleaser.yml
+++ b/.github/workflows/goreleaser.yml
@@ -18,7 +18,7 @@ jobs:
         name: Set up Go
         uses: actions/setup-go@v2
         with:
-          go-version: '^1.15.2'
+          go-version: '^1.19.3'
       -
         name: Release
         uses: goreleaser/goreleaser-action@v2
diff --git a/.github/workflows/lsif-go.yml b/.github/workflows/lsif-go.yml
index 6ab74e0..7e56f79 100644
--- a/.github/workflows/lsif-go.yml
+++ b/.github/workflows/lsif-go.yml
@@ -10,5 +10,7 @@ jobs:
       - uses: actions/checkout@v1
       - name: Generate LSIF data
         run: lsif-go
+        working-directory: v2
       - name: Upload LSIF data to Sourcegraph.com
         run: src lsif upload -github-token=${{ secrets.GITHUB_TOKEN }} -ignore-upload-failure
+        working-directory: v2
diff --git a/README.md b/README.md
index d292ea3..4136bae 100644
--- a/README.md
+++ b/README.md
@@ -2,12 +2,21 @@
 
 go-i18n is a Go [package](#package-i18n) and a [command](#command-goi18n) that helps you translate Go programs into multiple languages.
 
-- Supports [pluralized strings](http://cldr.unicode.org/index/cldr-spec/plural-rules) for all 200+ languages in the [Unicode Common Locale Data Repository (CLDR)](http://www.unicode.org/cldr/charts/28/supplemental/language_plural_rules.html).
-  - Code and tests are [automatically generated](https://github.com/nicksnyder/go-i18n/tree/master/i18n/language/codegen) from [CLDR data](http://cldr.unicode.org/index/downloads).
+- Supports [pluralized strings](http://cldr.unicode.org/index/cldr-spec/plural-rules) for all 200+ languages in the [Unicode Common Locale Data Repository (CLDR)](https://www.unicode.org/cldr/charts/28/supplemental/language_plural_rules.html).
+  - Code and tests are [automatically generated](https://github.com/nicksnyder/go-i18n/tree/main/v2/internal/plural/codegen) from [CLDR data](http://cldr.unicode.org/index/downloads).
 - Supports strings with named variables using [text/template](http://golang.org/pkg/text/template/) syntax.
 - Supports message files of any format (e.g. JSON, TOML, YAML).
 
-## Package i18n [![GoDoc](http://godoc.org/github.com/nicksnyder/go-i18n?status.svg)](http://godoc.org/github.com/nicksnyder/go-i18n/v2/i18n)
+<strong align="center">
+<samp>
+
+[**English**](README.md) · [**简体中文**](.github/README.zh-Hans.md)
+
+</samp>
+</strong>
+
+## Package i18n
+[![GoDoc](https://godoc.org/github.com/nicksnyder/go-i18n?status.svg)](https://godoc.org/github.com/nicksnyder/go-i18n/v2/i18n)
 
 The i18n package provides support for looking up messages according to a set of locale preferences.
 
@@ -28,6 +37,15 @@ bundle.RegisterUnmarshalFunc("toml", toml.Unmarshal)
 bundle.LoadMessageFile("es.toml")
 ```
 
+```go
+// If use go:embed
+//go:embed locale.*.toml
+var LocaleFS embed.FS
+
+bundle.RegisterUnmarshalFunc("toml", toml.Unmarshal)
+bundle.LoadMessageFileFS(LocaleFS, "locale.es.toml")
+```
+
 Create a Localizer to use for a set of language preferences.
 
 ```go
@@ -55,7 +73,8 @@ localizer.Localize(&i18n.LocalizeConfig{
 }) // Nick has 2 cats.
 ```
 
-## Command goi18n [![GoDoc](http://godoc.org/github.com/nicksnyder/go-i18n?status.svg)](http://godoc.org/github.com/nicksnyder/go-i18n/v2/goi18n)
+## Command goi18n
+[![GoDoc](https://godoc.org/github.com/nicksnyder/go-i18n?status.svg)](https://godoc.org/github.com/nicksnyder/go-i18n/v2/goi18n)
 
 The goi18n command manages message files used by the i18n package.
 
@@ -115,9 +134,9 @@ If you have added new messages to your program:
 
 ## For more information and examples:
 
-- Read the [documentation](http://godoc.org/github.com/nicksnyder/go-i18n/v2).
-- Look at the [code examples](https://github.com/nicksnyder/go-i18n/blob/master/v2/i18n/example_test.go) and [tests](https://github.com/nicksnyder/go-i18n/blob/master/v2/i18n/localizer_test.go).
-- Look at an example [application](https://github.com/nicksnyder/go-i18n/tree/master/v2/example).
+- Read the [documentation](https://godoc.org/github.com/nicksnyder/go-i18n/v2).
+- Look at the [code examples](https://github.com/nicksnyder/go-i18n/blob/main/v2/i18n/example_test.go) and [tests](https://github.com/nicksnyder/go-i18n/blob/main/v2/i18n/localizer_test.go).
+- Look at an example [application](https://github.com/nicksnyder/go-i18n/tree/main/v2/example).
 
 ## License
 
diff --git a/debian/changelog b/debian/changelog
index dff649d..a715a51 100644
--- a/debian/changelog
+++ b/debian/changelog
@@ -1,3 +1,12 @@
+golang-github-nicksnyder-go-i18n.v2 (2.2.1-1) UNRELEASED; urgency=low
+
+  * New upstream release.
+  * Drop patch 0001-Update-test-to-new-error-message-in-go-1.16-260.patch,
+    present upstream.
+  * New upstream release.
+
+ -- Debian Janitor <janitor@jelmer.uk>  Thu, 06 Apr 2023 23:52:45 -0000
+
 golang-github-nicksnyder-go-i18n.v2 (2.1.2-1) unstable; urgency=medium
 
   * New upstream version 2.1.2
diff --git a/debian/patches/0001-Update-test-to-new-error-message-in-go-1.16-260.patch b/debian/patches/0001-Update-test-to-new-error-message-in-go-1.16-260.patch
deleted file mode 100644
index dd36e3a..0000000
--- a/debian/patches/0001-Update-test-to-new-error-message-in-go-1.16-260.patch
+++ /dev/null
@@ -1,44 +0,0 @@
-From dadad2bdb2a713748df0717eddd54495150cfb58 Mon Sep 17 00:00:00 2001
-From: William Wilson <william.wilson@canonical.com>
-Date: Wed, 23 Jun 2021 18:37:51 -0500
-Subject: [PATCH] Update test to new error message in go 1.16 (#260)
-
----
- v2/internal/template_test.go | 7 ++++---
- 1 file changed, 4 insertions(+), 3 deletions(-)
-
-diff --git a/v2/internal/template_test.go b/v2/internal/template_test.go
-index 2f5d991..4f569b9 100644
---- a/v2/internal/template_test.go
-+++ b/v2/internal/template_test.go
-@@ -1,6 +1,7 @@
- package internal
- 
- import (
-+	"strings"
- 	"testing"
- 	"text/template"
- )
-@@ -45,7 +46,7 @@ func TestExecute(t *testing.T) {
- 			template: &Template{
- 				Src: "hello {{",
- 			},
--			err:      "template: :1: unexpected unclosed action in command",
-+			err:      "unclosed action",
- 			noallocs: true,
- 		},
- 	}
-@@ -53,8 +54,8 @@ func TestExecute(t *testing.T) {
- 	for _, test := range tests {
- 		t.Run(test.template.Src, func(t *testing.T) {
- 			result, err := test.template.Execute(test.funcs, test.data)
--			if actual := str(err); actual != test.err {
--				t.Errorf("expected err %q; got %q", test.err, actual)
-+			if actual := str(err); !strings.Contains(str(err), test.err) {
-+				t.Errorf("expected err %q to contain %q", actual, test.err)
- 			}
- 			if result != test.result {
- 				t.Errorf("expected result %q; got %q", test.result, result)
--- 
-2.34.0
-
diff --git a/debian/patches/series b/debian/patches/series
index 736f6e2..e69de29 100644
--- a/debian/patches/series
+++ b/debian/patches/series
@@ -1 +0,0 @@
-0001-Update-test-to-new-error-message-in-go-1.16-260.patch
diff --git a/v2/go.mod b/v2/go.mod
index 447a685..2d607b1 100644
--- a/v2/go.mod
+++ b/v2/go.mod
@@ -1,9 +1,9 @@
 module github.com/nicksnyder/go-i18n/v2
 
-go 1.9
+go 1.12
 
 require (
-	github.com/BurntSushi/toml v0.3.1
-	golang.org/x/text v0.3.3
+	github.com/BurntSushi/toml v1.0.0
+	golang.org/x/text v0.4.0
 	gopkg.in/yaml.v2 v2.3.0
 )
diff --git a/v2/go.sum b/v2/go.sum
index 96bf3d7..5674dff 100644
--- a/v2/go.sum
+++ b/v2/go.sum
@@ -1,8 +1,31 @@
-github.com/BurntSushi/toml v0.3.1 h1:WXkYYl6Yr3qBf1K79EBnL4mak0OimBfB0XUf9Vl28OQ=
-github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=
-golang.org/x/text v0.3.3 h1:cokOdA+Jmi5PJGXLlLllQSgYigAEfHXJAERHVMaCc2k=
+github.com/BurntSushi/toml v1.0.0 h1:dtDWrepsVPfW9H/4y7dDgFc2MBUSeJhlaDtK13CxFlU=
+github.com/BurntSushi/toml v1.0.0/go.mod h1:CxXYINrC8qIiEnFrOxCa7Jy5BFHlXnUU2pbicEuybxQ=
+github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY=
+golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
+golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=
+golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4=
+golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
+golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=
+golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c=
+golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
+golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
+golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
+golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
+golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=
+golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
 golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
+golang.org/x/text v0.3.7 h1:olpwvP2KacW1ZWvsR7uQhoyTYvKAupfQrRGBFM352Gk=
+golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ=
+golang.org/x/text v0.4.0 h1:BrVqGRd7+k1DiOgtnFvAkoQEWQvBc25ouMJM6429SFg=
+golang.org/x/text v0.4.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8=
 golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
+golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
+golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc=
+golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
 gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM=
 gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
 gopkg.in/yaml.v2 v2.3.0 h1:clyUAQHOM3G0M3f5vQj7LuJrETvjVot3Z5el9nffUtU=
diff --git a/v2/i18n/bundlefs.go b/v2/i18n/bundlefs.go
new file mode 100644
index 0000000..50c794b
--- /dev/null
+++ b/v2/i18n/bundlefs.go
@@ -0,0 +1,18 @@
+// +build go1.16
+
+package i18n
+
+import (
+	"io/fs"
+)
+
+// LoadMessageFileFS is like LoadMessageFile but instead of reading from the
+// hosts operating system's file system it reads from the fs file system.
+func (b *Bundle) LoadMessageFileFS(fsys fs.FS, path string) (*MessageFile, error) {
+	buf, err := fs.ReadFile(fsys, path)
+	if err != nil {
+		return nil, err
+	}
+
+	return b.ParseMessageFileBytes(buf, path)
+}
diff --git a/v2/i18n/localizer.go b/v2/i18n/localizer.go
index 17261e2..256cd49 100644
--- a/v2/i18n/localizer.go
+++ b/v2/i18n/localizer.go
@@ -9,6 +9,15 @@ import (
 )
 
 // Localizer provides Localize and MustLocalize methods that return localized messages.
+// Localize and MustLocalize methods use a language.Tag matching algorithm based
+// on the best possible value. This algorithm may cause an unexpected language.Tag returned
+// value depending on the order of the tags stored in memory. For example, if the bundle
+// used to create a Localizer instance ingested locales following this order
+// ["en-US", "en-GB", "en-IE", "en"] and the locale "en" is asked, the underlying matching
+// algorithm will return "en-US" thinking it is the best match possible. More information
+// about the algorithm in this Github issue: https://github.com/golang/go/issues/49176.
+// There is additionnal informations inside the Go code base:
+// https://github.com/golang/text/blob/master/language/match.go#L142
 type Localizer struct {
 	// bundle contains the messages that can be returned by the Localizer.
 	bundle *Bundle
diff --git a/v2/internal/plural/codegen/README.md b/v2/internal/plural/codegen/README.md
index 41a0094..f1f5ff8 100644
--- a/v2/internal/plural/codegen/README.md
+++ b/v2/internal/plural/codegen/README.md
@@ -1,6 +1,6 @@
 # How to upgrade CLDR data
 
 1.  Go to http://cldr.unicode.org/index/downloads to find the latest version.
-1.  Download the latest version of cldr-common (e.g. http://unicode.org/Public/cldr/37/cldr-common-37.0.zip)
+1.  Download the latest version of cldr-common (e.g. https://unicode.org/Public/cldr/39/cldr-common-39.0.zip)
 1.  Unzip and copy `common/supplemental/plurals.xml` to this directory.
 1.  Run `generate.sh`.
diff --git a/v2/internal/template_test.go b/v2/internal/template_test.go
index 2f5d991..4f569b9 100644
--- a/v2/internal/template_test.go
+++ b/v2/internal/template_test.go
@@ -1,6 +1,7 @@
 package internal
 
 import (
+	"strings"
 	"testing"
 	"text/template"
 )
@@ -45,7 +46,7 @@ func TestExecute(t *testing.T) {
 			template: &Template{
 				Src: "hello {{",
 			},
-			err:      "template: :1: unexpected unclosed action in command",
+			err:      "unclosed action",
 			noallocs: true,
 		},
 	}
@@ -53,8 +54,8 @@ func TestExecute(t *testing.T) {
 	for _, test := range tests {
 		t.Run(test.template.Src, func(t *testing.T) {
 			result, err := test.template.Execute(test.funcs, test.data)
-			if actual := str(err); actual != test.err {
-				t.Errorf("expected err %q; got %q", test.err, actual)
+			if actual := str(err); !strings.Contains(str(err), test.err) {
+				t.Errorf("expected err %q to contain %q", actual, test.err)
 			}
 			if result != test.result {
 				t.Errorf("expected result %q; got %q", test.result, result)

Debdiff

[The following lists of changes regard files as different if they have different names, permissions or owners.]

Files in second set of .debs but not in first

-rw-r--r--  root/root   /usr/share/gocode/src/github.com/nicksnyder/go-i18n/v2/i18n/bundlefs.go

No differences were encountered in the control files

More details

Full run details