i18n: Support unknown language codes

Fixes #3564
This commit is contained in:
Bjørn Erik Pedersen 2017-11-06 09:33:24 +01:00
parent 550cec0b1f
commit 23ba779fab
2 changed files with 74 additions and 10 deletions

View file

@ -14,15 +14,24 @@
package i18n package i18n
import ( import (
"path/filepath"
"testing" "testing"
"github.com/gohugoio/hugo/tpl/tplimpl"
"github.com/spf13/afero"
"github.com/gohugoio/hugo/deps"
"io/ioutil" "io/ioutil"
"os" "os"
"github.com/gohugoio/hugo/helpers"
"log" "log"
"github.com/gohugoio/hugo/config" "github.com/gohugoio/hugo/config"
"github.com/nicksnyder/go-i18n/i18n/bundle" "github.com/gohugoio/hugo/hugofs"
jww "github.com/spf13/jwalterweatherman" jww "github.com/spf13/jwalterweatherman"
"github.com/spf13/viper" "github.com/spf13/viper"
"github.com/stretchr/testify/require" "github.com/stretchr/testify/require"
@ -137,22 +146,54 @@ var i18nTests = []i18nTest{
expected: "hello", expected: "hello",
expectedFlag: "[i18n] 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 { 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 { for file, content := range test.data {
err := i18nBundle.ParseTranslationFileBytes(file, content) err := afero.WriteFile(fs.Source, filepath.Join("i18n", file), []byte(content), 0755)
if err != nil { assert.NoError(err)
t.Errorf("Error parsing translation file: %s", err)
}
} }
translator := NewTranslator(i18nBundle, cfg, logger) assert.NoError(d.LoadResources())
f := translator.Func(test.lang) f := tp.t.Func(test.lang)
translated := f(test.id, test.args) return f(test.id, test.args)
return translated
}
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) { func TestI18nTranslate(t *testing.T) {

View file

@ -14,11 +14,13 @@
package i18n package i18n
import ( import (
"errors"
"fmt" "fmt"
"github.com/gohugoio/hugo/deps" "github.com/gohugoio/hugo/deps"
"github.com/gohugoio/hugo/source" "github.com/gohugoio/hugo/source"
"github.com/nicksnyder/go-i18n/i18n/bundle" "github.com/nicksnyder/go-i18n/i18n/bundle"
"github.com/nicksnyder/go-i18n/i18n/language"
) )
// TranslationProvider provides translation handling, i.e. loading // TranslationProvider provides translation handling, i.e. loading
@ -48,6 +50,27 @@ func (tp *TranslationProvider) Update(d *deps.Deps) error {
i18nBundle := bundle.New() 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 _, currentSource := range sources {
for _, r := range currentSource.Files() { for _, r := range currentSource.Files() {
err := i18nBundle.ParseTranslationFileBytes(r.LogicalName(), r.Bytes()) err := i18nBundle.ParseTranslationFileBytes(r.LogicalName(), r.Bytes())