Add gettext capability to template and menu resources #239
@ -2,6 +2,7 @@ package config
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"net/url"
 | 
			
		||||
	"strings"
 | 
			
		||||
 | 
			
		||||
	"git.grassecon.net/urdt/ussd/initializers"
 | 
			
		||||
)
 | 
			
		||||
@ -20,6 +21,7 @@ const (
 | 
			
		||||
 | 
			
		||||
var (
 | 
			
		||||
	defaultLanguage		   = "eng"
 | 
			
		||||
	languages []string
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
var (
 | 
			
		||||
@ -39,8 +41,27 @@ var (
 | 
			
		||||
	VoucherDataURL      string
 | 
			
		||||
	CheckAliasURL       string
 | 
			
		||||
	DefaultLanguage	    string
 | 
			
		||||
	Languages	[]string
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
func setLanguage() error {
 | 
			
		||||
	defaultLanguage = initializers.GetEnv("DEFAULT_LANGUAGE", defaultLanguage)
 | 
			
		||||
	languages = strings.Split(initializers.GetEnv("LANGUAGES", defaultLanguage), ",")
 | 
			
		||||
	haveDefaultLanguage := false
 | 
			
		||||
	for i, v := range(languages) {
 | 
			
		||||
		languages[i] = strings.ReplaceAll(v, " ", "")
 | 
			
		||||
		if languages[i] == defaultLanguage {
 | 
			
		||||
			haveDefaultLanguage = true
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if !haveDefaultLanguage {
 | 
			
		||||
		languages = append([]string{defaultLanguage}, languages...)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func setBase() error {
 | 
			
		||||
	var err error
 | 
			
		||||
 | 
			
		||||
@ -56,8 +77,6 @@ func setBase() error {
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return err
 | 
			
		||||
	}
 | 
			
		||||
	
 | 
			
		||||
	defaultLanguage = initializers.GetEnv("DEFAULT_LANGUAGE", defaultLanguage)
 | 
			
		||||
	return nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@ -67,6 +86,10 @@ func LoadConfig() error {
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return err
 | 
			
		||||
	}
 | 
			
		||||
	err = setLanguage()
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return err
 | 
			
		||||
	}
 | 
			
		||||
	CreateAccountURL, _ = url.JoinPath(custodialURLBase, createAccountPath)
 | 
			
		||||
	TrackStatusURL, _ = url.JoinPath(custodialURLBase, trackStatusPath)
 | 
			
		||||
	BalanceURL, _ = url.JoinPath(custodialURLBase, balancePathPrefix)
 | 
			
		||||
@ -77,6 +100,7 @@ func LoadConfig() error {
 | 
			
		||||
	VoucherDataURL, _ = url.JoinPath(dataURLBase, voucherDataPathPrefix)
 | 
			
		||||
	CheckAliasURL, _ = url.JoinPath(dataURLBase, AliasPrefix)
 | 
			
		||||
	DefaultLanguage = defaultLanguage
 | 
			
		||||
	Languages = languages
 | 
			
		||||
 | 
			
		||||
	return nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										126
									
								
								devtools/lang/main.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										126
									
								
								devtools/lang/main.go
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,126 @@
 | 
			
		||||
package main
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"flag"
 | 
			
		||||
	"fmt"
 | 
			
		||||
	"os"
 | 
			
		||||
	"path"
 | 
			
		||||
	"strings"
 | 
			
		||||
 | 
			
		||||
	"git.defalsify.org/vise.git/logging"
 | 
			
		||||
	"git.defalsify.org/vise.git/lang"
 | 
			
		||||
	"git.grassecon.net/urdt/ussd/config"
 | 
			
		||||
	"git.grassecon.net/urdt/ussd/initializers"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
const (
 | 
			
		||||
	
 | 
			
		||||
	changeHeadSrc = `LOAD reset_account_authorized 0
 | 
			
		||||
LOAD reset_incorrect 0
 | 
			
		||||
CATCH incorrect_pin flag_incorrect_pin 1
 | 
			
		||||
CATCH pin_entry flag_account_authorized 0
 | 
			
		||||
` 
 | 
			
		||||
 | 
			
		||||
	selectSrc = `LOAD set_language 6
 | 
			
		||||
RELOAD set_language
 | 
			
		||||
CATCH terms flag_account_created 0
 | 
			
		||||
MOVE language_changed
 | 
			
		||||
`
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
var (
 | 
			
		||||
	logg = logging.NewVanilla()
 | 
			
		||||
	mouts string
 | 
			
		||||
	incmps string
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
func init() {
 | 
			
		||||
	initializers.LoadEnvVariables()
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func toLanguageLabel(ln lang.Language) string {
 | 
			
		||||
	s := ln.Name
 | 
			
		||||
	v := strings.Split(s, " (")
 | 
			
		||||
	if len(v) > 1 {
 | 
			
		||||
		s = v[0]
 | 
			
		||||
	}
 | 
			
		||||
	return s
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func toLanguageKey(ln lang.Language) string {
 | 
			
		||||
	s := toLanguageLabel(ln)
 | 
			
		||||
	return strings.ToLower(s)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func main() {
 | 
			
		||||
	var srcDir string
 | 
			
		||||
 | 
			
		||||
	flag.StringVar(&srcDir, "o", ".", "resource dir write to")
 | 
			
		||||
	flag.Parse()
 | 
			
		||||
 | 
			
		||||
	logg.Infof("start command", "dir", srcDir)
 | 
			
		||||
 | 
			
		||||
	err := config.LoadConfig()
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		fmt.Fprintf(os.Stderr, "config load error: %v", err)
 | 
			
		||||
		os.Exit(1)
 | 
			
		||||
	}
 | 
			
		||||
	logg.Tracef("using languages", "lang", config.Languages)
 | 
			
		||||
 | 
			
		||||
	for i, v := range(config.Languages) {
 | 
			
		||||
		ln, err := lang.LanguageFromCode(v)
 | 
			
		||||
		if err != nil {
 | 
			
		||||
			fmt.Fprintf(os.Stderr, "error parsing language: %s", v)
 | 
			
		||||
			os.Exit(1)
 | 
			
		||||
		}
 | 
			
		||||
		n := i + 1
 | 
			
		||||
		s := toLanguageKey(ln)
 | 
			
		||||
		mouts += fmt.Sprintf("MOUT %s %v\n", s, n)
 | 
			
		||||
		//incmp += fmt.Sprintf("INCMP set_%s %u\n", 
 | 
			
		||||
		v = "set_" + ln.Code
 | 
			
		||||
		incmps += fmt.Sprintf("INCMP %s %v\n", v, n)
 | 
			
		||||
 | 
			
		||||
		p := path.Join(srcDir, v)
 | 
			
		||||
		w, err := os.OpenFile(p, os.O_WRONLY | os.O_CREATE | os.O_TRUNC, 0600)
 | 
			
		||||
		if err != nil {
 | 
			
		||||
			fmt.Fprintf(os.Stderr, "failed open language set template output: %v", err)
 | 
			
		||||
			os.Exit(1)
 | 
			
		||||
		}
 | 
			
		||||
		s = toLanguageLabel(ln)
 | 
			
		||||
		defer w.Close()
 | 
			
		||||
		_, err = w.Write([]byte(s))
 | 
			
		||||
		if err != nil {
 | 
			
		||||
			fmt.Fprintf(os.Stderr, "failed write select language vis output: %v", err)
 | 
			
		||||
			os.Exit(1)
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	src := mouts + "HALT\n" + incmps
 | 
			
		||||
	src += "INCMP . *\n"
 | 
			
		||||
 | 
			
		||||
	p := path.Join(srcDir, "select_language.vis")
 | 
			
		||||
	w, err := os.OpenFile(p, os.O_WRONLY | os.O_CREATE | os.O_TRUNC, 0600)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		fmt.Fprintf(os.Stderr, "failed open select language vis output: %v", err)
 | 
			
		||||
		os.Exit(1)
 | 
			
		||||
	}
 | 
			
		||||
	defer w.Close()
 | 
			
		||||
	_, err = w.Write([]byte(src))
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		fmt.Fprintf(os.Stderr, "failed write select language vis output: %v", err)
 | 
			
		||||
		os.Exit(1)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	src = changeHeadSrc + src
 | 
			
		||||
	p = path.Join(srcDir, "change_language.vis")
 | 
			
		||||
	w, err = os.OpenFile(p, os.O_WRONLY | os.O_CREATE | os.O_TRUNC, 0600)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		fmt.Fprintf(os.Stderr, "failed open select language vis output: %v", err)
 | 
			
		||||
		os.Exit(1)
 | 
			
		||||
	}
 | 
			
		||||
	defer w.Close()
 | 
			
		||||
	_, err = w.Write([]byte(src))
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		fmt.Fprintf(os.Stderr, "failed write select language vis output: %v", err)
 | 
			
		||||
		os.Exit(1)
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
		Loading…
	
		Reference in New Issue
	
	Block a user