hugo/commands/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

42 lines
992 B
Go

package commands
import (
"sort"
"github.com/spf13/cast"
"github.com/spf13/viper"
)
var langConfigs map[string]interface{}
var langConfigsList langConfigsSortable
func readMultilingualConfiguration() {
multilingual := viper.GetStringMap("Multilingual")
if len(multilingual) == 0 {
langConfigsList = append(langConfigsList, "")
return
}
langConfigs = make(map[string]interface{})
for lang, config := range multilingual {
langConfigs[lang] = config
langConfigsList = append(langConfigsList, lang)
}
sort.Sort(langConfigsList)
}
type langConfigsSortable []string
func (p langConfigsSortable) Len() int { return len(p) }
func (p langConfigsSortable) Less(i, j int) bool { return weightForLang(p[i]) < weightForLang(p[j]) }
func (p langConfigsSortable) Swap(i, j int) { p[i], p[j] = p[j], p[i] }
func weightForLang(lang string) int {
conf := langConfigs[lang]
if conf == nil {
return 0
}
m := cast.ToStringMap(conf)
return cast.ToInt(m["weight"])
}