multilingual.go (2170B)
1 // Copyright 2019 The Hugo Authors. All rights reserved. 2 // 3 // Licensed under the Apache License, Version 2.0 (the "License"); 4 // you may not use this file except in compliance with the License. 5 // You may obtain a copy of the License at 6 // http://www.apache.org/licenses/LICENSE-2.0 7 // 8 // Unless required by applicable law or agreed to in writing, software 9 // distributed under the License is distributed on an "AS IS" BASIS, 10 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 11 // See the License for the specific language governing permissions and 12 // limitations under the License. 13 14 package hugolib 15 16 import ( 17 "errors" 18 "sync" 19 20 "github.com/gohugoio/hugo/langs" 21 22 "github.com/gohugoio/hugo/config" 23 ) 24 25 // Multilingual manages the all languages used in a multilingual site. 26 type Multilingual struct { 27 Languages langs.Languages 28 29 DefaultLang *langs.Language 30 31 langMap map[string]*langs.Language 32 langMapInit sync.Once 33 } 34 35 // Language returns the Language associated with the given string. 36 func (ml *Multilingual) Language(lang string) *langs.Language { 37 ml.langMapInit.Do(func() { 38 ml.langMap = make(map[string]*langs.Language) 39 for _, l := range ml.Languages { 40 ml.langMap[l.Lang] = l 41 } 42 }) 43 return ml.langMap[lang] 44 } 45 46 func getLanguages(cfg config.Provider) langs.Languages { 47 if cfg.IsSet("languagesSorted") { 48 return cfg.Get("languagesSorted").(langs.Languages) 49 } 50 51 return langs.Languages{langs.NewDefaultLanguage(cfg)} 52 } 53 54 func newMultiLingualFromSites(cfg config.Provider, sites ...*Site) (*Multilingual, error) { 55 languages := make(langs.Languages, len(sites)) 56 57 for i, s := range sites { 58 if s.language == nil { 59 return nil, errors.New("missing language for site") 60 } 61 languages[i] = s.language 62 } 63 64 defaultLang := cfg.GetString("defaultContentLanguage") 65 66 if defaultLang == "" { 67 defaultLang = "en" 68 } 69 70 return &Multilingual{Languages: languages, DefaultLang: langs.NewLanguage(defaultLang, cfg)}, nil 71 } 72 73 func (ml *Multilingual) enabled() bool { 74 return len(ml.Languages) > 1 75 } 76 77 func (s *Site) multilingualEnabled() bool { 78 if s.h == nil { 79 return false 80 } 81 return s.h.multilingual != nil && s.h.multilingual.enabled() 82 }