rsc.io/[email protected]
-- .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
}