From 23ba779fab90ce45cddd68b4f49a2515ce6d4878 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bj=C3=B8rn=20Erik=20Pedersen?= Date: Mon, 6 Nov 2017 09:33:24 +0100 Subject: [PATCH] i18n: Support unknown language codes Fixes #3564 --- i18n/i18n_test.go | 61 +++++++++++++++++++++++++++++++------ i18n/translationProvider.go | 23 ++++++++++++++ 2 files changed, 74 insertions(+), 10 deletions(-) diff --git a/i18n/i18n_test.go b/i18n/i18n_test.go index 6a9d362b0..057fc35e9 100644 --- a/i18n/i18n_test.go +++ b/i18n/i18n_test.go @@ -14,15 +14,24 @@ package i18n import ( + "path/filepath" "testing" + "github.com/gohugoio/hugo/tpl/tplimpl" + + "github.com/spf13/afero" + + "github.com/gohugoio/hugo/deps" + "io/ioutil" "os" + "github.com/gohugoio/hugo/helpers" + "log" "github.com/gohugoio/hugo/config" - "github.com/nicksnyder/go-i18n/i18n/bundle" + "github.com/gohugoio/hugo/hugofs" jww "github.com/spf13/jwalterweatherman" "github.com/spf13/viper" "github.com/stretchr/testify/require" @@ -137,22 +146,54 @@ var i18nTests = []i18nTest{ expected: "hello", expectedFlag: "[i18n] hello", }, + // Unknown language code should get its plural spec from en + { + data: map[string][]byte{ + "en.toml": []byte(`[readingTime] +one ="one minute read" +other = "{{.Count}} minutes read"`), + "klingon.toml": []byte(`[readingTime] +one = "eitt minutt med lesing" +other = "{{ .Count }} minuttar lesing"`), + }, + args: 3, + lang: "klingon", + id: "readingTime", + expected: "3 minuttar lesing", + expectedFlag: "3 minuttar lesing", + }, } func doTestI18nTranslate(t *testing.T, test i18nTest, cfg config.Provider) string { - i18nBundle := bundle.New() + assert := require.New(t) + fs := hugofs.NewMem(cfg) + tp := NewTranslationProvider() + depsCfg := newDepsConfig(tp, cfg, fs) + d, err := deps.New(depsCfg) + assert.NoError(err) for file, content := range test.data { - err := i18nBundle.ParseTranslationFileBytes(file, content) - if err != nil { - t.Errorf("Error parsing translation file: %s", err) - } + err := afero.WriteFile(fs.Source, filepath.Join("i18n", file), []byte(content), 0755) + assert.NoError(err) } - translator := NewTranslator(i18nBundle, cfg, logger) - f := translator.Func(test.lang) - translated := f(test.id, test.args) - return translated + assert.NoError(d.LoadResources()) + f := tp.t.Func(test.lang) + return f(test.id, test.args) + +} + +func newDepsConfig(tp *TranslationProvider, cfg config.Provider, fs *hugofs.Fs) deps.DepsCfg { + l := helpers.NewLanguage("en", cfg) + l.Set("i18nDir", "i18n") + return deps.DepsCfg{ + Language: l, + Cfg: cfg, + Fs: fs, + Logger: logger, + TemplateProvider: tplimpl.DefaultTemplateProvider, + TranslationProvider: tp, + } } func TestI18nTranslate(t *testing.T) { diff --git a/i18n/translationProvider.go b/i18n/translationProvider.go index 9947d3ce5..e0eb89134 100644 --- a/i18n/translationProvider.go +++ b/i18n/translationProvider.go @@ -14,11 +14,13 @@ package i18n import ( + "errors" "fmt" "github.com/gohugoio/hugo/deps" "github.com/gohugoio/hugo/source" "github.com/nicksnyder/go-i18n/i18n/bundle" + "github.com/nicksnyder/go-i18n/i18n/language" ) // TranslationProvider provides translation handling, i.e. loading @@ -48,6 +50,27 @@ func (tp *TranslationProvider) Update(d *deps.Deps) error { i18nBundle := bundle.New() + en := language.GetPluralSpec("en") + if en == nil { + return errors.New("The English language has vanished like an old oak table!") + } + var newLangs []string + + for _, currentSource := range sources { + for _, r := range currentSource.Files() { + currentSpec := language.GetPluralSpec(r.BaseFileName()) + if currentSpec == nil { + // This may is a language code not supported by go-i18n, it may be + // Klingon or ... not even a fake language. Make sure it works. + newLangs = append(newLangs, r.BaseFileName()) + } + } + } + + if len(newLangs) > 0 { + language.RegisterPluralSpec(newLangs, en) + } + for _, currentSource := range sources { for _, r := range currentSource.Files() { err := i18nBundle.ParseTranslationFileBytes(r.LogicalName(), r.Bytes())