2016-05-14 00:35:16 -04:00
// Copyright 2015 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 tpl
import (
"fmt"
"github.com/nicksnyder/go-i18n/i18n/bundle"
2016-08-09 05:41:56 -04:00
"github.com/spf13/hugo/helpers"
2016-05-14 00:35:16 -04:00
jww "github.com/spf13/jwalterweatherman"
2016-08-09 05:41:56 -04:00
"github.com/spf13/viper"
)
var (
2016-11-05 12:27:40 -04:00
// Logi18nWarnings set to true to print warnings about missing language strings
2016-08-09 05:41:56 -04:00
Logi18nWarnings bool
i18nWarningLogger = helpers . NewDistinctFeedbackLogger ( )
2016-10-24 07:45:30 -04:00
currentLanguage * helpers . Language
2016-05-14 00:35:16 -04:00
)
2016-07-26 08:44:37 -04:00
type translate struct {
translateFuncs map [ string ] bundle . TranslateFunc
2016-05-14 00:35:16 -04:00
2016-07-26 08:44:37 -04:00
current bundle . TranslateFunc
}
2016-09-08 10:04:04 -04:00
var translator * translate
2016-07-26 08:44:37 -04:00
// SetTranslateLang sets the translations language to use during template processing.
// This construction is unfortunate, but the template system is currently global.
2016-10-24 07:45:30 -04:00
func SetTranslateLang ( language * helpers . Language ) error {
currentLanguage = language
if f , ok := translator . translateFuncs [ language . Lang ] ; ok {
2016-09-08 10:04:04 -04:00
translator . current = f
2016-08-09 05:41:56 -04:00
} else {
2016-10-24 07:45:30 -04:00
jww . WARN . Printf ( "Translation func for language %v not found, use default." , language . Lang )
2016-10-24 14:56:00 -04:00
translator . current = translator . translateFuncs [ viper . GetString ( "defaultContentLanguage" ) ]
2016-07-26 08:44:37 -04:00
}
2016-07-26 13:04:10 -04:00
return nil
2016-07-26 08:44:37 -04:00
}
2016-11-05 12:27:40 -04:00
// SetI18nTfuncs sets the language bundle to be used for i18n.
2016-07-26 08:44:37 -04:00
func SetI18nTfuncs ( bndl * bundle . Bundle ) {
2016-09-08 10:04:04 -04:00
translator = & translate { translateFuncs : make ( map [ string ] bundle . TranslateFunc ) }
2016-10-24 14:56:00 -04:00
defaultContentLanguage := viper . GetString ( "defaultContentLanguage" )
2016-08-09 05:41:56 -04:00
var (
defaultT bundle . TranslateFunc
err error
)
defaultT , err = bndl . Tfunc ( defaultContentLanguage )
if err != nil {
jww . WARN . Printf ( "No translation bundle found for default language %q" , defaultContentLanguage )
}
2016-11-06 18:10:32 -05:00
enableMissingTranslationPlaceholders := viper . GetBool ( "enableMissingTranslationPlaceholders" )
2016-07-26 08:44:37 -04:00
for _ , lang := range bndl . LanguageTags ( ) {
2016-08-09 05:41:56 -04:00
currentLang := lang
2016-09-08 10:04:04 -04:00
translator . translateFuncs [ currentLang ] = func ( translationID string , args ... interface { } ) string {
2016-09-18 16:18:13 -04:00
tFunc , err := bndl . Tfunc ( currentLang )
if err != nil {
jww . WARN . Printf ( "could not load translations for language %q (%s), will use default content language.\n" , lang , err )
} else if translated := tFunc ( translationID , args ... ) ; translated != translationID {
2016-08-09 05:41:56 -04:00
return translated
}
if Logi18nWarnings {
i18nWarningLogger . Printf ( "i18n|MISSING_TRANSLATION|%s|%s" , currentLang , translationID )
}
2016-11-06 18:10:32 -05:00
if enableMissingTranslationPlaceholders {
2016-09-18 16:18:13 -04:00
return fmt . Sprintf ( "[i18n] %s" , translationID )
}
2016-08-09 05:41:56 -04:00
if defaultT != nil {
2016-09-09 15:21:16 -04:00
if translated := defaultT ( translationID , args ... ) ; translated != translationID {
return translated
}
2016-08-09 05:41:56 -04:00
}
2016-09-18 16:18:13 -04:00
return ""
2016-08-09 05:41:56 -04:00
}
2016-05-14 00:35:16 -04:00
}
}
2016-11-05 12:27:40 -04:00
func i18nTranslate ( id string , args ... interface { } ) ( string , error ) {
2016-09-08 10:04:04 -04:00
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
2016-05-14 00:35:16 -04:00
}
2016-09-08 10:04:04 -04:00
return translator . current ( id , args ... ) , nil
2016-05-14 00:35:16 -04:00
}