code: func Parse(locale, text string, args ...interface{}) (r string, err error) {
  	var data interface{}
  	if len(args) > 0 {
  		data = args[0]
  	}
  
  	mutex.RLock()
  	tmpl := parseTextCache[text]
  	mutex.RUnlock()
  
  	p := parser{locale: locale, data: data}
  	funcs := template.FuncMap{"p": p.parsePlural}
  	for i := range args {
  		arg := args[i]
  		funcs[fmt.Sprintf("cldr_arg_%d", i+1)] = func() interface{} { return arg }
  	}
  	if tmpl == nil {
  		for i := range args {
  			text = strings.Replace(text, fmt.Sprintf("{{$%d}}", i+1), fmt.Sprintf("{{cldr_arg_%d}}", i+1), -1)
  		}
  		tmpl = template.New("").Funcs(parseFuncMap).Funcs(funcs)
  		tmpl, err = tmpl.Parse(text)
  		if err != nil {
  			return
  		}
  		mutex.Lock()
  		parseTextCache[text] = tmpl
  		mutex.Unlock()
  	} else {
  		tmpl = tmpl.Funcs(funcs)
  	}
  
  	var buf bytes.Buffer
  	if err = tmpl.Execute(&buf, data); err != nil {
  		return
  	}
  	r = buf.String()
  	return
  }
docs: // TODO: rename to T and add helper in Locale