shithub: hugo

Download patch

ref: fe0c270577325dcd08d5e21faa42c5288a205f93
parent: 5ef45bec63b157eb8e1bd3a6a4c6cb1e98a43a94
author: Bjørn Erik Pedersen <[email protected]>
date: Thu Sep 8 13:04:04 EDT 2016

Reset the i18n func map on reload

Also improve the error message on missing resource bundles.

--- a/helpers/general.go
+++ b/helpers/general.go
@@ -229,6 +229,11 @@
 // DistinctErrorLog cann be used to avoid spamming the logs with errors.
 var DistinctErrorLog = NewDistinctErrorLogger()
 
+// InitLoggers sets up the global distinct loggers.
+func InitLoggers() {
+	DistinctErrorLog = NewDistinctErrorLogger()
+}
+
 // Deprecated logs ERROR logs about a deprecation, but only once for a given set of arguments' values.
 func Deprecated(object, item, alternative string) {
 	//	deprecatedLogger.Printf("%s's %s is deprecated and will be removed in Hugo %s. Use %s instead.", object, item, NextHugoReleaseVersion(), alternative)
--- a/hugolib/hugo_sites.go
+++ b/hugolib/hugo_sites.go
@@ -276,6 +276,8 @@
 		s.resetBuildState()
 	}
 
+	helpers.InitLoggers()
+
 	changed, err := firstSite.reBuild(events)
 
 	if err != nil {
--- a/tpl/template_i18n.go
+++ b/tpl/template_i18n.go
@@ -33,21 +33,22 @@
 	current bundle.TranslateFunc
 }
 
-var translater *translate = &translate{translateFuncs: make(map[string]bundle.TranslateFunc)}
+var translator *translate
 
 // SetTranslateLang sets the translations language to use during template processing.
 // This construction is unfortunate, but the template system is currently global.
 func SetTranslateLang(lang string) error {
-	if f, ok := translater.translateFuncs[lang]; ok {
-		translater.current = f
+	if f, ok := translator.translateFuncs[lang]; ok {
+		translator.current = f
 	} else {
 		jww.WARN.Printf("Translation func for language %v not found, use default.", lang)
-		translater.current = translater.translateFuncs[viper.GetString("DefaultContentLanguage")]
+		translator.current = translator.translateFuncs[viper.GetString("DefaultContentLanguage")]
 	}
 	return nil
 }
 
 func SetI18nTfuncs(bndl *bundle.Bundle) {
+	translator = &translate{translateFuncs: make(map[string]bundle.TranslateFunc)}
 	defaultContentLanguage := viper.GetString("DefaultContentLanguage")
 	var (
 		defaultT bundle.TranslateFunc
@@ -66,10 +67,10 @@
 
 		if err != nil {
 			jww.WARN.Printf("could not load translations for language %q (%s), will use default content language.\n", lang, err)
-			translater.translateFuncs[currentLang] = defaultT
+			translator.translateFuncs[currentLang] = defaultT
 			continue
 		}
-		translater.translateFuncs[currentLang] = func(translationID string, args ...interface{}) string {
+		translator.translateFuncs[currentLang] = func(translationID string, args ...interface{}) string {
 			if translated := tFunc(translationID, args...); translated != translationID {
 				return translated
 			}
@@ -85,8 +86,9 @@
 }
 
 func I18nTranslate(id string, args ...interface{}) (string, error) {
-	if translater == nil || translater.current == nil {
-		return "", fmt.Errorf("i18n not initialized, have you configured everything properly?")
+	if translator == nil || translator.current == nil {
+		helpers.DistinctErrorLog.Printf("i18n not initialized, check that you have language file (in i18n) that matches the site language or the default language.")
+		return "", nil
 	}
-	return translater.current(id, args...), nil
+	return translator.current(id, args...), nil
 }