Add gettext capability to template and menu resources #239
@ -2,6 +2,7 @@ package config
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
import (
 | 
					import (
 | 
				
			||||||
	"net/url"
 | 
						"net/url"
 | 
				
			||||||
 | 
						"strings"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	"git.grassecon.net/urdt/ussd/initializers"
 | 
						"git.grassecon.net/urdt/ussd/initializers"
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
@ -20,6 +21,7 @@ const (
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
var (
 | 
					var (
 | 
				
			||||||
	defaultLanguage		   = "eng"
 | 
						defaultLanguage		   = "eng"
 | 
				
			||||||
 | 
						languages []string
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
var (
 | 
					var (
 | 
				
			||||||
@ -39,8 +41,27 @@ var (
 | 
				
			|||||||
	VoucherDataURL      string
 | 
						VoucherDataURL      string
 | 
				
			||||||
	CheckAliasURL       string
 | 
						CheckAliasURL       string
 | 
				
			||||||
	DefaultLanguage	    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 {
 | 
					func setBase() error {
 | 
				
			||||||
	var err error
 | 
						var err error
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -56,8 +77,6 @@ func setBase() error {
 | 
				
			|||||||
	if err != nil {
 | 
						if err != nil {
 | 
				
			||||||
		return err
 | 
							return err
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	
 | 
					 | 
				
			||||||
	defaultLanguage = initializers.GetEnv("DEFAULT_LANGUAGE", defaultLanguage)
 | 
					 | 
				
			||||||
	return nil
 | 
						return nil
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -67,6 +86,10 @@ func LoadConfig() error {
 | 
				
			|||||||
	if err != nil {
 | 
						if err != nil {
 | 
				
			||||||
		return err
 | 
							return err
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
						err = setLanguage()
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							return err
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
	CreateAccountURL, _ = url.JoinPath(custodialURLBase, createAccountPath)
 | 
						CreateAccountURL, _ = url.JoinPath(custodialURLBase, createAccountPath)
 | 
				
			||||||
	TrackStatusURL, _ = url.JoinPath(custodialURLBase, trackStatusPath)
 | 
						TrackStatusURL, _ = url.JoinPath(custodialURLBase, trackStatusPath)
 | 
				
			||||||
	BalanceURL, _ = url.JoinPath(custodialURLBase, balancePathPrefix)
 | 
						BalanceURL, _ = url.JoinPath(custodialURLBase, balancePathPrefix)
 | 
				
			||||||
@ -77,6 +100,7 @@ func LoadConfig() error {
 | 
				
			|||||||
	VoucherDataURL, _ = url.JoinPath(dataURLBase, voucherDataPathPrefix)
 | 
						VoucherDataURL, _ = url.JoinPath(dataURLBase, voucherDataPathPrefix)
 | 
				
			||||||
	CheckAliasURL, _ = url.JoinPath(dataURLBase, AliasPrefix)
 | 
						CheckAliasURL, _ = url.JoinPath(dataURLBase, AliasPrefix)
 | 
				
			||||||
	DefaultLanguage = defaultLanguage
 | 
						DefaultLanguage = defaultLanguage
 | 
				
			||||||
 | 
						Languages = languages
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	return nil
 | 
						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