mirror of
				https://github.com/TeaOSLab/EdgeCommon.git
				synced 2025-11-04 05:00:24 +08:00 
			
		
		
		
	
		
			
				
	
	
		
			106 lines
		
	
	
		
			2.1 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
			
		
		
	
	
			106 lines
		
	
	
		
			2.1 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
// Copyright 2023 GoEdge CDN goedge.cdn@gmail.com. All rights reserved. Official site: https://goedge.cn .
 | 
						|
 | 
						|
package langs
 | 
						|
 | 
						|
import (
 | 
						|
	"fmt"
 | 
						|
	"strings"
 | 
						|
)
 | 
						|
 | 
						|
var defaultManager = NewManager()
 | 
						|
 | 
						|
type Manager struct {
 | 
						|
	langMap         map[string]*Lang // lang code => *Lang, lang code must be in lowercase
 | 
						|
	defaultLangCode string
 | 
						|
}
 | 
						|
 | 
						|
func NewManager() *Manager {
 | 
						|
	return &Manager{
 | 
						|
		langMap:         map[string]*Lang{},
 | 
						|
		defaultLangCode: "zh-cn",
 | 
						|
	}
 | 
						|
}
 | 
						|
 | 
						|
func DefaultManager() *Manager {
 | 
						|
	return defaultManager
 | 
						|
}
 | 
						|
 | 
						|
func (this *Manager) AddLang(code string) *Lang {
 | 
						|
	var lang = NewLang(code)
 | 
						|
	this.langMap[code] = lang
 | 
						|
	return lang
 | 
						|
}
 | 
						|
 | 
						|
func (this *Manager) HasLang(code string) bool {
 | 
						|
	_, ok := this.langMap[code]
 | 
						|
	return ok
 | 
						|
}
 | 
						|
 | 
						|
func (this *Manager) GetLang(code string) (lang *Lang, ok bool) {
 | 
						|
	lang, ok = this.langMap[code]
 | 
						|
	return
 | 
						|
}
 | 
						|
 | 
						|
func (this *Manager) MatchLang(code string) (matchedCode string) {
 | 
						|
	// lookup exact match
 | 
						|
	code = strings.ToLower(code)
 | 
						|
	_, ok := this.langMap[code]
 | 
						|
	if ok {
 | 
						|
		return code
 | 
						|
	}
 | 
						|
 | 
						|
	// lookup language family, such as en-us, en
 | 
						|
	if strings.Contains(code, "-") {
 | 
						|
		code, _, _ = strings.Cut(code, "-")
 | 
						|
	}
 | 
						|
	for rawCode := range this.langMap {
 | 
						|
		if strings.HasPrefix(rawCode, code+"-") { // en-us vs en
 | 
						|
			return rawCode
 | 
						|
		}
 | 
						|
	}
 | 
						|
 | 
						|
	return this.DefaultLang()
 | 
						|
}
 | 
						|
 | 
						|
func (this *Manager) SetDefaultLang(code string) {
 | 
						|
	this.defaultLangCode = code
 | 
						|
}
 | 
						|
 | 
						|
func (this *Manager) DefaultLang() string {
 | 
						|
	if len(this.defaultLangCode) > 0 {
 | 
						|
		return this.defaultLangCode
 | 
						|
	}
 | 
						|
	return "zh-cn"
 | 
						|
}
 | 
						|
 | 
						|
// GetMessage
 | 
						|
// message: name: %s, age: %d, salary: %.2f
 | 
						|
func (this *Manager) GetMessage(langCode string, messageCode MessageCode, args ...any) string {
 | 
						|
	var lang = this.langMap[langCode]
 | 
						|
	if lang == nil && len(this.defaultLangCode) > 0 {
 | 
						|
		lang = this.langMap[this.defaultLangCode]
 | 
						|
	}
 | 
						|
	if lang == nil {
 | 
						|
		return ""
 | 
						|
	}
 | 
						|
 | 
						|
	var message = lang.Get(messageCode)
 | 
						|
	if len(message) == 0 {
 | 
						|
		// try to get message from default lang
 | 
						|
		if lang.code != this.defaultLangCode {
 | 
						|
			var defaultLang = this.langMap[this.defaultLangCode]
 | 
						|
			if defaultLang != nil {
 | 
						|
				return defaultLang.Get(messageCode)
 | 
						|
			}
 | 
						|
		}
 | 
						|
 | 
						|
		return ""
 | 
						|
	}
 | 
						|
 | 
						|
	if len(args) == 0 {
 | 
						|
		return message
 | 
						|
	}
 | 
						|
 | 
						|
	return fmt.Sprintf(message, args...)
 | 
						|
}
 |