langs/i18n: Fix i18n .Count regression
authorBjørn Erik Pedersen <bjorn.erik.pedersen@gmail.com>
Tue, 6 Oct 2020 18:32:52 +0000 (20:32 +0200)
committerBjørn Erik Pedersen <bjorn.erik.pedersen@gmail.com>
Tue, 6 Oct 2020 22:32:21 +0000 (00:32 +0200)
Fixes #7787

langs/i18n/i18n.go
langs/i18n/i18n_test.go

index 922b06367e0e37fd8750d4993c25ed26f63b50d5..83144b89c7bfea4b4f125ae90b0b8966ae89d61e 100644 (file)
@@ -74,19 +74,24 @@ func (t Translator) initFuncs(bndl *i18n.Bundle) {
 
                t.translateFuncs[currentLangKey] = func(translationID string, templateData interface{}) string {
 
+                       var pluralCount interface{}
+
                        if templateData != nil {
                                tp := reflect.TypeOf(templateData)
                                if hreflect.IsNumber(tp.Kind()) {
+                                       pluralCount = templateData
                                        // This was how go-i18n worked in v1.
                                        templateData = map[string]interface{}{
                                                "Count": templateData,
                                        }
+
                                }
                        }
 
                        translated, translatedLang, err := localizer.LocalizeWithTag(&i18n.LocalizeConfig{
                                MessageID:    translationID,
                                TemplateData: templateData,
+                               PluralCount:  pluralCount,
                        })
 
                        if err == nil && currentLang == translatedLang {
index d9215952a569d9883d8fca8a1ff1af7a1b4d202d..51134a7d05d338bd72308add65b5c6ff0941715f 100644 (file)
@@ -14,6 +14,7 @@
 package i18n
 
 import (
+       "fmt"
        "path/filepath"
        "testing"
 
@@ -125,6 +126,35 @@ var i18nTests = []i18nTest{
                expected:     "¡Hola, 50 gente!",
                expectedFlag: "¡Hola, 50 gente!",
        },
+       // https://github.com/gohugoio/hugo/issues/7787
+       {
+               name: "readingTime-one",
+               data: map[string][]byte{
+                       "en.toml": []byte(`[readingTime]
+one = "One minute to read"
+other = "{{ .Count }} minutes to read"
+`),
+               },
+               args:         1,
+               lang:         "en",
+               id:           "readingTime",
+               expected:     "One minute to read",
+               expectedFlag: "One minute to read",
+       },
+       {
+               name: "readingTime-many",
+               data: map[string][]byte{
+                       "en.toml": []byte(`[readingTime]
+one = "One minute to read"
+other = "{{ .Count }} minutes to read"
+`),
+               },
+               args:         21,
+               lang:         "en",
+               id:           "readingTime",
+               expected:     "21 minutes to read",
+               expectedFlag: "21 minutes to read",
+       },
        // Same id and translation in current language
        // https://github.com/gohugoio/hugo/issues/2607
        {
@@ -242,13 +272,15 @@ func TestI18nTranslate(t *testing.T) {
                v.Set("enableMissingTranslationPlaceholders", enablePlaceholders)
 
                for _, test := range i18nTests {
-                       if enablePlaceholders {
-                               expected = test.expectedFlag
-                       } else {
-                               expected = test.expected
-                       }
-                       actual = doTestI18nTranslate(t, test, v)
-                       c.Assert(actual, qt.Equals, expected)
+                       c.Run(fmt.Sprintf("%s-%t", test.name, enablePlaceholders), func(c *qt.C) {
+                               if enablePlaceholders {
+                                       expected = test.expectedFlag
+                               } else {
+                                       expected = test.expected
+                               }
+                               actual = doTestI18nTranslate(t, test, v)
+                               c.Assert(actual, qt.Equals, expected)
+                       })
                }
        }
 }