package templatestrings import ( "os" "path/filepath" "gopkg.in/yaml.v3" ) type TemplateStrings struct { templateStrings map[string]map[string]string defaultVariant string } // Load the strings from the specified files into memory func InitTemplateStrings(stringsDir string, fileExt string, defaultVariant string, otherVariants ...string) (*TemplateStrings, error) { ts := &TemplateStrings{ map[string]map[string]string{}, defaultVariant, } // Load strings variants := append(otherVariants, defaultVariant) for _, variant := range variants { if _, ok := ts.templateStrings[variant]; ok { // Already loaded continue } variantStrings := map[string]string{} f, err := os.Open(filepath.Join(stringsDir, variant+fileExt)) if err != nil { if os.IsNotExist(err) { continue } return nil, err } err = yaml.NewDecoder(f).Decode(variantStrings) if err != nil { return nil, err } ts.templateStrings[variant] = variantStrings } return ts, nil } // Get a string // input: lang, name or just name (uses default) func (ts *TemplateStrings) GetTemplateStringVariant(input ...string) (result string) { var lang, name string if l := len(input); l == 1 { // Use default variant lang = ts.defaultVariant name = input[0] } else if l == 2 { // Use specified variant lang = input[0] name = input[1] } else { // Wrong number of input strings return "" } m, ok := ts.templateStrings[lang] if !ok { m = ts.templateStrings[ts.defaultVariant] } result, ok = m[name] if !ok { result = ts.templateStrings[ts.defaultVariant][name] } return } // Get a func to use for templates func (ts *TemplateStrings) GetTemplateStringVariantFunc() func(...string) string { return func(s ...string) string { return ts.GetTemplateStringVariant(s...) } }