package message
import (
"io"
"os"
_ "golang.org/x/text/feature/plural"
"golang.org/x/text/internal/number"
"golang.org/x/text/language"
"golang.org/x/text/message/catalog"
)
type Printer struct {
tag language .Tag
toDecimal number .Formatter
toScientific number .Formatter
cat catalog .Catalog
}
type options struct {
cat catalog .Catalog
}
type Option func (o *options )
func Catalog (c catalog .Catalog ) Option {
return func (o *options ) { o .cat = c }
}
func NewPrinter (t language .Tag , opts ...Option ) *Printer {
options := &options {
cat : DefaultCatalog ,
}
for _ , o := range opts {
o (options )
}
p := &Printer {
tag : t ,
cat : options .cat ,
}
p .toDecimal .InitDecimal (t )
p .toScientific .InitScientific (t )
return p
}
func (p *Printer ) Sprint (a ...interface {}) string {
pp := newPrinter (p )
pp .doPrint (a )
s := pp .String ()
pp .free ()
return s
}
func (p *Printer ) Fprint (w io .Writer , a ...interface {}) (n int , err error ) {
pp := newPrinter (p )
pp .doPrint (a )
n64 , err := io .Copy (w , &pp .Buffer )
pp .free ()
return int (n64 ), err
}
func (p *Printer ) Print (a ...interface {}) (n int , err error ) {
return p .Fprint (os .Stdout , a ...)
}
func (p *Printer ) Sprintln (a ...interface {}) string {
pp := newPrinter (p )
pp .doPrintln (a )
s := pp .String ()
pp .free ()
return s
}
func (p *Printer ) Fprintln (w io .Writer , a ...interface {}) (n int , err error ) {
pp := newPrinter (p )
pp .doPrintln (a )
n64 , err := io .Copy (w , &pp .Buffer )
pp .free ()
return int (n64 ), err
}
func (p *Printer ) Println (a ...interface {}) (n int , err error ) {
return p .Fprintln (os .Stdout , a ...)
}
func (p *Printer ) Sprintf (key Reference , a ...interface {}) string {
pp := newPrinter (p )
lookupAndFormat (pp , key , a )
s := pp .String ()
pp .free ()
return s
}
func (p *Printer ) Fprintf (w io .Writer , key Reference , a ...interface {}) (n int , err error ) {
pp := newPrinter (p )
lookupAndFormat (pp , key , a )
n , err = w .Write (pp .Bytes ())
pp .free ()
return n , err
}
func (p *Printer ) Printf (key Reference , a ...interface {}) (n int , err error ) {
pp := newPrinter (p )
lookupAndFormat (pp , key , a )
n , err = os .Stdout .Write (pp .Bytes ())
pp .free ()
return n , err
}
func lookupAndFormat(p *printer , r Reference , a []interface {}) {
p .fmt .Reset (a )
switch v := r .(type ) {
case string :
if p .catContext .Execute (v ) == catalog .ErrNotFound {
p .Render (v )
return
}
case key :
if p .catContext .Execute (v .id ) == catalog .ErrNotFound &&
p .catContext .Execute (v .fallback ) == catalog .ErrNotFound {
p .Render (v .fallback )
return
}
default :
panic ("key argument is not a Reference" )
}
}
type rawPrinter struct {
p *printer
}
func (p rawPrinter ) Render (msg string ) { p .p .WriteString (msg ) }
func (p rawPrinter ) Arg (i int ) interface {} { return nil }
func (p *printer ) Arg (i int ) interface {} {
i --
if uint (i ) < uint (len (p .fmt .Args )) {
return p .fmt .Args [i ]
}
return nil
}
func (p *printer ) Render (msg string ) {
p .doPrintf (msg )
}
type Reference interface {
}
func Key (id string , fallback string ) Reference {
return key {id , fallback }
}
type key struct {
id, fallback string
}
The pages are generated with Golds v0.8.2 . (GOOS=linux GOARCH=amd64)
Golds is a Go 101 project developed by Tapir Liu .
PR and bug reports are welcome and can be submitted to the issue list .
Please follow @zigo_101 (reachable from the left QR code) to get the latest news of Golds .