shithub: hugo

Download patch

ref: 506820435cacb39ce7bb1835f46a15e913b95828
parent: 49972d07925604fea45afe1ace7b5dcc6efc30bf
author: Bjørn Erik Pedersen <bjorn.erik.pedersen@gmail.com>
date: Fri Oct 9 06:00:50 EDT 2020

lang/i18n: Fix for language code case issue with pt-br etc.

Fixes #7804

--- a/htesting/test_helpers.go
+++ b/htesting/test_helpers.go
@@ -51,10 +51,11 @@
 
 }
 
-var rnd = rand.New(rand.NewSource(time.Now().UnixNano()))
+// Rnd is used only for testing.
+var Rnd = rand.New(rand.NewSource(time.Now().UnixNano()))
 
-func RandIntn(n int) int {
-	return rnd.Intn(n)
+func RandBool() bool {
+	return Rnd.Intn(2) != 0
 }
 
 // DiffStringSlices returns the difference between two string slices.
--- /dev/null
+++ b/hugolib/language_test.go
@@ -1,0 +1,57 @@
+// Copyright 2020 The Hugo Authors. All rights reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+package hugolib
+
+import (
+	"fmt"
+	"strings"
+	"testing"
+
+	"github.com/gohugoio/hugo/htesting"
+
+	qt "github.com/frankban/quicktest"
+)
+
+func TestI18n(t *testing.T) {
+
+	c := qt.New(t)
+
+	//https://github.com/gohugoio/hugo/issues/7804
+	c.Run("pt-br should be case insensitive", func(c *qt.C) {
+		b := newTestSitesBuilder(c)
+		langCode := func() string {
+			c := "pt-br"
+			if htesting.RandBool() {
+				c = strings.ToUpper(c)
+			}
+			return c
+		}
+
+		b.WithConfigFile(`toml`, fmt.Sprintf(`
+baseURL = "https://example.com"
+defaultContentLanguage = "%s"
+
+[languages]
+[languages.%s]
+weight = 1
+`, langCode(), langCode()))
+
+		b.WithI18n(fmt.Sprintf("i18n/%s.toml", langCode()), `hello.one = "Hello"`)
+		b.WithTemplates("index.html", `Hello: {{ i18n "hello" 1 }}`)
+		b.WithContent("p1.md", "")
+		b.Build(BuildCfg{})
+
+		b.AssertFileContent("public/index.html", "Hello: Hello")
+	})
+}
--- a/langs/config.go
+++ b/langs/config.go
@@ -36,7 +36,7 @@
 
 func LoadLanguageSettings(cfg config.Provider, oldLangs Languages) (c LanguagesConfig, err error) {
 
-	defaultLang := cfg.GetString("defaultContentLanguage")
+	defaultLang := strings.ToLower(cfg.GetString("defaultContentLanguage"))
 	if defaultLang == "" {
 		defaultLang = "en"
 		cfg.Set("defaultContentLanguage", defaultLang)
--- a/langs/i18n/i18n.go
+++ b/langs/i18n/i18n.go
@@ -66,12 +66,11 @@
 func (t Translator) initFuncs(bndl *i18n.Bundle) {
 	enableMissingTranslationPlaceholders := t.cfg.GetBool("enableMissingTranslationPlaceholders")
 	for _, lang := range bndl.LanguageTags() {
-
 		currentLang := lang
 		currentLangStr := currentLang.String()
-		currentLangKey := strings.TrimPrefix(currentLangStr, artificialLangTagPrefix)
+		// This may be pt-BR; make it case insensitive.
+		currentLangKey := strings.ToLower(strings.TrimPrefix(currentLangStr, artificialLangTagPrefix))
 		localizer := i18n.NewLocalizer(bndl, currentLangStr)
-
 		t.translateFuncs[currentLangKey] = func(translationID string, templateData interface{}) string {
 
 			var pluralCount interface{}
--- a/langs/i18n/i18n_test.go
+++ b/langs/i18n/i18n_test.go
@@ -226,6 +226,18 @@
 		expected:     "Show Me The Money",
 		expectedFlag: "Show Me The Money",
 	},
+	// https: //github.com/gohugoio/hugo/issues/7804
+	{
+		name: "lang-with-hyphen",
+		data: map[string][]byte{
+			"pt-br.toml": []byte(`foo.one =  "abc"`),
+		},
+		args:         1,
+		lang:         "pt-br",
+		id:           "foo",
+		expected:     "abc",
+		expectedFlag: "abc",
+	},
 }
 
 func doTestI18nTranslate(t testing.TB, test i18nTest, cfg config.Provider) string {
--- a/resources/transform_test.go
+++ b/resources/transform_test.go
@@ -152,7 +152,7 @@
 
 		// The transformed file should only be published if RelPermalink
 		// or Permalink is called.
-		n := htesting.RandIntn(3)
+		n := htesting.Rnd.Intn(3)
 		shouldExist := true
 		switch n {
 		case 0: