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 (
Logi18nWarnings bool
i18nWarningLogger = helpers . NewDistinctFeedbackLogger ( )
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.
func SetTranslateLang ( lang string ) error {
2016-09-08 10:04:04 -04:00
if f , ok := translator . translateFuncs [ lang ] ; ok {
translator . current = f
2016-08-09 05:41:56 -04:00
} else {
jww . WARN . Printf ( "Translation func for language %v not found, use default." , lang )
2016-09-08 10:04:04 -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
}
func SetI18nTfuncs ( bndl * bundle . Bundle ) {
2016-09-08 10:04:04 -04:00
translator = & translate { translateFuncs : make ( map [ string ] bundle . TranslateFunc ) }
2016-08-09 05:41:56 -04:00
defaultContentLanguage := viper . GetString ( "DefaultContentLanguage" )
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-07-26 08:44:37 -04:00
for _ , lang := range bndl . LanguageTags ( ) {
2016-08-09 05:41:56 -04:00
currentLang := lang
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 )
2016-09-08 10:04:04 -04:00
translator . translateFuncs [ currentLang ] = defaultT
2016-07-26 08:44:37 -04:00
continue
}
2016-09-08 10:04:04 -04:00
translator . translateFuncs [ currentLang ] = func ( translationID string , args ... interface { } ) string {
2016-08-09 05:41:56 -04:00
if translated := tFunc ( translationID , args ... ) ; translated != translationID {
return translated
}
if Logi18nWarnings {
i18nWarningLogger . Printf ( "i18n|MISSING_TRANSLATION|%s|%s" , currentLang , translationID )
}
if defaultT != nil {
return defaultT ( translationID , args ... )
}
return fmt . Sprintf ( "[i18n] %s" , translationID )
}
2016-05-14 00:35:16 -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
}