forked from toolshed/abra
		
	
		
			
				
	
	
		
			97 lines
		
	
	
		
			2.4 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
			
		
		
	
	
			97 lines
		
	
	
		
			2.4 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
| /*
 | |
|  * Copyright (c) 2018 DeineAgentur UG https://www.deineagentur.com. All rights reserved.
 | |
|  * Licensed under the MIT License. See LICENSE file in the project root for full license information.
 | |
|  */
 | |
| 
 | |
| package gotext
 | |
| 
 | |
| import (
 | |
| 	"fmt"
 | |
| 	"regexp"
 | |
| 	"strings"
 | |
| )
 | |
| 
 | |
| var re = regexp.MustCompile(`%\(([a-zA-Z0-9_]+)\)[.0-9]*[svTtbcdoqXxUeEfFgGp]`)
 | |
| 
 | |
| // SimplifiedLocale simplified locale like " en_US"/"de_DE "/en_US.UTF-8/zh_CN/zh_TW/el_GR@euro/... to en_US, de_DE, zh_CN, el_GR...
 | |
| func SimplifiedLocale(lang string) string {
 | |
| 	// en_US/en_US.UTF-8/zh_CN/zh_TW/el_GR@euro/...
 | |
| 	if idx := strings.Index(lang, ":"); idx != -1 {
 | |
| 		lang = lang[:idx]
 | |
| 	}
 | |
| 	if idx := strings.Index(lang, "@"); idx != -1 {
 | |
| 		lang = lang[:idx]
 | |
| 	}
 | |
| 	if idx := strings.Index(lang, "."); idx != -1 {
 | |
| 		lang = lang[:idx]
 | |
| 	}
 | |
| 	return strings.TrimSpace(lang)
 | |
| }
 | |
| 
 | |
| // FormatString applies text formatting only when needed to parse variables.
 | |
| func FormatString(str string, vars ...interface{}) string {
 | |
| 	if len(vars) > 0 {
 | |
| 		return fmt.Sprintf(str, vars...)
 | |
| 	}
 | |
| 
 | |
| 	return str
 | |
| }
 | |
| 
 | |
| // Appendf applies text formatting only when needed to parse variables.
 | |
| func Appendf(b []byte, str string, vars ...interface{}) []byte {
 | |
| 	if len(vars) > 0 {
 | |
| 		return fmt.Appendf(b, str, vars...)
 | |
| 	}
 | |
| 
 | |
| 	return append(b, str...)
 | |
| }
 | |
| 
 | |
| // NPrintf support named format
 | |
| // NPrintf("%(name)s is Type %(type)s", map[string]interface{}{"name": "Gotext", "type": "struct"})
 | |
| func NPrintf(format string, params map[string]interface{}) {
 | |
| 	f, p := parseSprintf(format, params)
 | |
| 	fmt.Printf(f, p...)
 | |
| }
 | |
| 
 | |
| // Sprintf support named format
 | |
| //
 | |
| //	Sprintf("%(name)s is Type %(type)s", map[string]interface{}{"name": "Gotext", "type": "struct"})
 | |
| func Sprintf(format string, params map[string]interface{}) string {
 | |
| 	f, p := parseSprintf(format, params)
 | |
| 	return fmt.Sprintf(f, p...)
 | |
| }
 | |
| 
 | |
| func parseSprintf(format string, params map[string]interface{}) (string, []interface{}) {
 | |
| 	f, n := reformatSprintf(format)
 | |
| 	var p []interface{}
 | |
| 	for _, v := range n {
 | |
| 		p = append(p, params[v])
 | |
| 	}
 | |
| 	return f, p
 | |
| }
 | |
| 
 | |
| func reformatSprintf(f string) (string, []string) {
 | |
| 	m := re.FindAllStringSubmatch(f, -1)
 | |
| 	i := re.FindAllStringSubmatchIndex(f, -1)
 | |
| 
 | |
| 	ord := []string{}
 | |
| 	for _, v := range m {
 | |
| 		ord = append(ord, v[1])
 | |
| 	}
 | |
| 
 | |
| 	pair := []int{0}
 | |
| 	for _, v := range i {
 | |
| 		pair = append(pair, v[2]-1)
 | |
| 		pair = append(pair, v[3]+1)
 | |
| 	}
 | |
| 	pair = append(pair, len(f))
 | |
| 	plen := len(pair)
 | |
| 
 | |
| 	out := ""
 | |
| 	for n := 0; n < plen; n += 2 {
 | |
| 		out += f[pair[n]:pair[n+1]]
 | |
| 	}
 | |
| 
 | |
| 	return out, ord
 | |
| }
 |