rsc.io/sampler@v1.3.0 -- .mod -- module "rsc.io/sampler" require "golang.org/x/text" v0.0.0-20170915032832-14c0d48ead0c -- .info -- {"Version":"v1.3.0","Name":"0cc034b51e57ed7832d4c67d526f75a900996e5c","Short":"0cc034b51e57","Time":"2018-02-13T19:05:03Z"} -- glass.go -- // Copyright 2018 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. // Translations from Frank da Cruz, Ethan Mollick, and many others. // See http://kermitproject.org/utf8.html. // http://www.oocities.org/nodotus/hbglass.html // https://en.wikipedia.org/wiki/I_Can_Eat_Glass package sampler var glass = newText(` English: en: I can eat glass and it doesn't hurt me. French: fr: Je peux manger du verre, ça ne me fait pas mal. Spanish: es: Puedo comer vidrio, no me hace daño. `) -- glass_test.go -- // Copyright 2018 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. package sampler import ( "testing" "golang.org/x/text/language" _ "rsc.io/testonly" ) var glassTests = []struct { prefs []language.Tag text string }{ { []language.Tag{language.Make("en-US"), language.Make("fr")}, "I can eat glass and it doesn't hurt me.", }, { []language.Tag{language.Make("fr"), language.Make("en-US")}, "Je peux manger du verre, ça ne me fait pas mal.", }, } func TestGlass(t *testing.T) { for _, tt := range glassTests { text := Glass(tt.prefs...) if text != tt.text { t.Errorf("Glass(%v) = %q, want %q", tt.prefs, text, tt.text) } } } -- go.mod -- module "rsc.io/sampler" require "golang.org/x/text" v0.0.0-20170915032832-14c0d48ead0c -- hello.go -- // Copyright 2018 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. // Translations by Google Translate. package sampler var hello = newText(` English: en: Hello, world. French: fr: Bonjour le monde. Spanish: es: Hola Mundo. `) -- hello_test.go -- // Copyright 2018 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. package sampler import ( "testing" "golang.org/x/text/language" ) var helloTests = []struct { prefs []language.Tag text string }{ { []language.Tag{language.Make("en-US"), language.Make("fr")}, "Hello, world.", }, { []language.Tag{language.Make("fr"), language.Make("en-US")}, "Bonjour le monde.", }, } func TestHello(t *testing.T) { for _, tt := range helloTests { text := Hello(tt.prefs...) if text != tt.text { t.Errorf("Hello(%v) = %q, want %q", tt.prefs, text, tt.text) } } } -- sampler.go -- // Copyright 2018 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. // Package sampler shows simple texts. package sampler // import "rsc.io/sampler" import ( "os" "strings" "golang.org/x/text/language" ) // DefaultUserPrefs returns the default user language preferences. // It consults the $LC_ALL, $LC_MESSAGES, and $LANG environment // variables, in that order. func DefaultUserPrefs() []language.Tag { var prefs []language.Tag for _, k := range []string{"LC_ALL", "LC_MESSAGES", "LANG"} { if env := os.Getenv(k); env != "" { prefs = append(prefs, language.Make(env)) } } return prefs } // Hello returns a localized greeting. // If no prefs are given, Hello uses DefaultUserPrefs. func Hello(prefs ...language.Tag) string { if len(prefs) == 0 { prefs = DefaultUserPrefs() } return hello.find(prefs) } // Glass returns a localized silly phrase. // If no prefs are given, Glass uses DefaultUserPrefs. func Glass(prefs ...language.Tag) string { if len(prefs) == 0 { prefs = DefaultUserPrefs() } return glass.find(prefs) } // A text is a localized text. type text struct { byTag map[string]string matcher language.Matcher } // newText creates a new localized text, given a list of translations. func newText(s string) *text { t := &text{ byTag: make(map[string]string), } var tags []language.Tag for _, line := range strings.Split(s, "\n") { line = strings.TrimSpace(line) if line == "" { continue } f := strings.Split(line, ": ") if len(f) != 3 { continue } tag := language.Make(f[1]) tags = append(tags, tag) t.byTag[tag.String()] = f[2] } t.matcher = language.NewMatcher(tags) return t } // find finds the text to use for the given language tag preferences. func (t *text) find(prefs []language.Tag) string { tag, _, _ := t.matcher.Match(prefs...) s := t.byTag[tag.String()] if strings.HasPrefix(s, "RTL ") { s = "\u200F" + strings.TrimPrefix(s, "RTL ") + "\u200E" } return s }