package templatestrings import ( "errors" "io/fs" "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) { return InitTemplateStringsFS(os.DirFS("."), stringsDir, fileExt, defaultVariant, otherVariants...) } // Load the strings from the specified files using a file system into memory func InitTemplateStringsFS(filesystem fs.FS, stringsDir string, fileExt string, defaultVariant string, otherVariants ...string) (*TemplateStrings, error) { ts := &TemplateStrings{ map[string]map[string]string{}, defaultVariant, } // Check directory if stat, err := fs.Stat(filesystem, stringsDir); err != nil { return nil, err } else if !stat.IsDir() { return nil, errors.New("specified directory is no dir") } // Load strings variants := append(otherVariants, defaultVariant) for _, variant := range variants { // Check if variant is empty if variant == "" { return nil, errors.New("language variant needs to have a name") } // Check if variant already loaded if _, ok := ts.templateStrings[variant]; ok { continue } fb, err := fs.ReadFile(filesystem, filepath.Join(stringsDir, variant+fileExt)) if err != nil { // Just ignore the file continue } variantStrings := map[string]string{} if err = yaml.Unmarshal(fb, variantStrings); err != nil { // Error loading YAML return nil, err } ts.templateStrings[variant] = variantStrings } // Checks if len(ts.templateStrings) == 0 { return nil, errors.New("no variants initialized") } if _, ok := ts.templateStrings[ts.defaultVariant]; !ok { return nil, errors.New("default variant not loaded") } return ts, nil } // Get a string // input: language, name or just name (uses default language) 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 empty string 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 function to use in templates func (ts *TemplateStrings) GetTemplateStringVariantFunc() func(...string) string { return func(s ...string) string { return ts.GetTemplateStringVariant(s...) } }