mirror of
https://github.com/golang/go
synced 2024-11-19 03:34:41 -07:00
203 lines
4.7 KiB
Plaintext
203 lines
4.7 KiB
Plaintext
|
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
|
||
|
}
|