...
Text file
src/cmd/go/testdata/mod/rsc.io_sampler_v1.2.0.txt
1rsc.io/sampler@v1.2.0
2
3-- .mod --
4module "rsc.io/sampler"
5
6require "golang.org/x/text" v0.0.0-20170915032832-14c0d48ead0c
7-- .info --
8{"Version":"v1.2.0","Name":"25f24110b153246056eccc14a3a4cd81afaff586","Short":"25f24110b153","Time":"2018-02-13T18:13:45Z"}
9-- go.mod --
10module "rsc.io/sampler"
11
12require "golang.org/x/text" v0.0.0-20170915032832-14c0d48ead0c
13-- hello.go --
14// Copyright 2018 The Go Authors. All rights reserved.
15// Use of this source code is governed by a BSD-style
16// license that can be found in the LICENSE file.
17
18// Translations by Google Translate.
19
20package sampler
21
22var hello = newText(`
23
24English: en: Hello, world.
25French: fr: Bonjour le monde.
26Spanish: es: Hola Mundo.
27
28`)
29-- hello_test.go --
30// Copyright 2018 The Go Authors. All rights reserved.
31// Use of this source code is governed by a BSD-style
32// license that can be found in the LICENSE file.
33
34package sampler
35
36import (
37 "testing"
38
39 "golang.org/x/text/language"
40)
41
42var helloTests = []struct {
43 prefs []language.Tag
44 text string
45}{
46 {
47 []language.Tag{language.Make("en-US"), language.Make("fr")},
48 "Hello, world.",
49 },
50 {
51 []language.Tag{language.Make("fr"), language.Make("en-US")},
52 "Bonjour la monde.",
53 },
54}
55
56func TestHello(t *testing.T) {
57 for _, tt := range helloTests {
58 text := Hello(tt.prefs...)
59 if text != tt.text {
60 t.Errorf("Hello(%v) = %q, want %q", tt.prefs, text, tt.text)
61 }
62 }
63}
64-- sampler.go --
65// Copyright 2018 The Go Authors. All rights reserved.
66// Use of this source code is governed by a BSD-style
67// license that can be found in the LICENSE file.
68
69// Package sampler shows simple texts.
70package sampler // import "rsc.io/sampler"
71
72import (
73 "os"
74 "strings"
75
76 "golang.org/x/text/language"
77)
78
79// DefaultUserPrefs returns the default user language preferences.
80// It consults the $LC_ALL, $LC_MESSAGES, and $LANG environment
81// variables, in that order.
82func DefaultUserPrefs() []language.Tag {
83 var prefs []language.Tag
84 for _, k := range []string{"LC_ALL", "LC_MESSAGES", "LANG"} {
85 if env := os.Getenv(k); env != "" {
86 prefs = append(prefs, language.Make(env))
87 }
88 }
89 return prefs
90}
91
92// Hello returns a localized greeting.
93// If no prefs are given, Hello uses DefaultUserPrefs.
94func Hello(prefs ...language.Tag) string {
95 if len(prefs) == 0 {
96 prefs = DefaultUserPrefs()
97 }
98 return hello.find(prefs)
99}
100
101// A text is a localized text.
102type text struct {
103 byTag map[string]string
104 matcher language.Matcher
105}
106
107// newText creates a new localized text, given a list of translations.
108func newText(s string) *text {
109 t := &text{
110 byTag: make(map[string]string),
111 }
112 var tags []language.Tag
113 for _, line := range strings.Split(s, "\n") {
114 line = strings.TrimSpace(line)
115 if line == "" {
116 continue
117 }
118 f := strings.Split(line, ": ")
119 if len(f) != 3 {
120 continue
121 }
122 tag := language.Make(f[1])
123 tags = append(tags, tag)
124 t.byTag[tag.String()] = f[2]
125 }
126 t.matcher = language.NewMatcher(tags)
127 return t
128}
129
130// find finds the text to use for the given language tag preferences.
131func (t *text) find(prefs []language.Tag) string {
132 tag, _, _ := t.matcher.Match(prefs...)
133 s := t.byTag[tag.String()]
134 if strings.HasPrefix(s, "RTL ") {
135 s = "\u200F" + strings.TrimPrefix(s, "RTL ") + "\u200E"
136 }
137 return s
138}
View as plain text