hugo/hugolib/multilingual.go
Alexandre Bourget ec33732fbe Add multilingual support in Hugo
Implements:
* support to render:
  * content/post/whatever.en.md to /en/2015/12/22/whatever/index.html
  * content/post/whatever.fr.md to /fr/2015/12/22/whatever/index.html
* gets enabled when `Multilingual:` is specified in config.
* support having language switchers in templates, that know
  where the translated page is (with .Page.Translations)
  (when you're on /en/about/, you can have a "Francais" link pointing to
   /fr/a-propos/)
  * all translations are in the `.Page.Translations` map, including the current one.
* easily tweak themes to support Multilingual mode
* renders in a single swift, no need for two config files.

Adds a couple of variables useful for multilingual sites

Adds documentation (content/multilingual.md)

Added language prefixing for all URL generation/permalinking see in the
code base.

Implements i18n. Leverages the great github.com/nicksnyder/go-i18n lib.. thanks Nick.
* Adds "i18n" and "T" template functions..
2016-09-06 18:32:15 +03:00

49 lines
1.2 KiB
Go

package hugolib
import (
"github.com/spf13/cast"
"github.com/spf13/viper"
)
type Multilingual struct {
enabled bool
config *viper.Viper
Languages []string
}
func (ml *Multilingual) GetString(key string) string { return cast.ToString(ml.Get(key)) }
func (ml *Multilingual) GetStringMap(key string) map[string]interface{} {
return cast.ToStringMap(ml.Get(key))
}
func (ml *Multilingual) GetStringMapString(key string) map[string]string {
return cast.ToStringMapString(ml.Get(key))
}
func (ml *Multilingual) Get(key string) interface{} {
if ml != nil && ml.config != nil && ml.config.IsSet(key) {
return ml.config.Get(key)
}
return viper.Get(key)
}
func (s *Site) SetMultilingualConfig(currentLang string, orderedLanguages []string, langConfigs map[string]interface{}) {
conf := viper.New()
for k, val := range cast.ToStringMap(langConfigs[currentLang]) {
conf.Set(k, val)
}
conf.Set("CurrentLanguage", currentLang)
ml := &Multilingual{
enabled: len(langConfigs) > 0,
config: conf,
Languages: orderedLanguages,
}
viper.Set("Multilingual", ml.enabled)
s.Multilingual = ml
}
func (s *Site) multilingualEnabled() bool {
return s.Multilingual != nil && s.Multilingual.enabled
}