提交 d77db729 编写于 作者: K Kyle Bai 提交者: Sebastian Florek

Add support for Traditional Chinese translation (#2309)

* Init Traditional Chinese(zh-TW) translation

* Update Traditional Chinese translation

* Fix stiff and typo translation

* Update locale handler to support new locale

* Remove unsupported locale directory test case
上级 e3850637
{
"translations": [
{"file": "messages-en.xtb", "key": "en"},
{"file": "messages-zh.xtb", "key": "zh"},
{"file": "messages-ja.xtb", "key": "ja"}
{"file": "messages-en.xtb", "key": "en"},
{"file": "messages-zh-tw.xtb", "key": "zh-tw"},
{"file": "messages-zh.xtb", "key": "zh"},
{"file": "messages-ja.xtb", "key": "ja"}
]
}
此差异已折叠。
......@@ -19,6 +19,7 @@ import (
"io/ioutil"
"net/http"
"os"
"strings"
"github.com/golang/glog"
"golang.org/x/text/language"
......@@ -40,7 +41,7 @@ type Translation struct {
// LocaleHandler serves different localized versions of the frontend application
// based on the Accept-Language header.
type LocaleHandler struct {
SupportedLocales []string
SupportedLocales []language.Tag
}
// CreateLocaleHandler loads the localization configuration and constructs a LocaleHandler.
......@@ -48,16 +49,16 @@ func CreateLocaleHandler() *LocaleHandler {
locales, err := getSupportedLocales("./locale_conf.json")
if err != nil {
glog.Warningf("Error when loading the localization configuration. Dashboard will not be localized. %s", err)
locales = []string{}
locales = []language.Tag{}
}
return &LocaleHandler{SupportedLocales: locales}
}
func getSupportedLocales(configFile string) ([]string, error) {
func getSupportedLocales(configFile string) ([]language.Tag, error) {
// read config file
localesFile, err := ioutil.ReadFile(configFile)
if err != nil {
return []string{}, err
return []language.Tag{}, err
}
// unmarshall
......@@ -68,9 +69,9 @@ func getSupportedLocales(configFile string) ([]string, error) {
}
// filter locale keys
result := []string{}
result := []language.Tag{}
for _, translation := range localization.Translations {
result = append(result, translation.Key)
result = append(result, language.Make(translation.Key))
}
return result, nil
}
......@@ -93,19 +94,22 @@ func (handler *LocaleHandler) determineLocalizedDir(locale string) string {
return defaultDir
}
for _, tag := range tags {
matchedLocale := ""
for _, l := range handler.SupportedLocales {
locales := handler.SupportedLocales
tag, _, confidence := language.NewMatcher(locales).Match(tags...)
matchedLocale := strings.ToLower(tag.String())
if confidence != language.Exact {
matchedLocale = ""
for _, l := range locales {
base, _ := tag.Base()
if l == base.String() {
matchedLocale = l
break
if l.String() == base.String() {
matchedLocale = l.String()
}
}
localeDir := "./public/" + matchedLocale
if matchedLocale != "" && handler.dirExists(localeDir) {
return localeDir
}
}
localeDir := "./public/" + matchedLocale
if matchedLocale != "" && handler.dirExists(localeDir) {
return localeDir
}
return defaultDir
}
......
......@@ -20,12 +20,22 @@ import (
"os"
"reflect"
"testing"
"golang.org/x/text/language"
)
func languageMake(locales []string) []language.Tag {
result := []language.Tag{}
for _, locale := range locales {
result = append(result, language.Make(locale))
}
return result
}
func TestGetSupportedLocales(t *testing.T) {
cases := []struct {
localization Localization
expected []string
expected []language.Tag
}{
{
Localization{
......@@ -34,11 +44,11 @@ func TestGetSupportedLocales(t *testing.T) {
{File: "ja/index.html", Key: "ja"},
},
},
[]string{"en", "ja"},
languageMake([]string{"en", "ja"}),
},
{
Localization{},
[]string{},
[]language.Tag{},
},
}
......@@ -67,7 +77,7 @@ func TestDetermineLocale(t *testing.T) {
}{
{
&LocaleHandler{
SupportedLocales: []string{"en", "ja"},
SupportedLocales: languageMake([]string{"en", "ja"}),
},
false,
"en",
......@@ -75,7 +85,7 @@ func TestDetermineLocale(t *testing.T) {
},
{
&LocaleHandler{
SupportedLocales: []string{"en", "ja"},
SupportedLocales: languageMake([]string{"en", "ja"}),
},
false,
"de",
......@@ -83,7 +93,7 @@ func TestDetermineLocale(t *testing.T) {
},
{
&LocaleHandler{
SupportedLocales: []string{"en", "ja"},
SupportedLocales: languageMake([]string{"en", "ja"}),
},
false,
"ja",
......@@ -91,7 +101,7 @@ func TestDetermineLocale(t *testing.T) {
},
{
&LocaleHandler{
SupportedLocales: []string{"en", "ja"},
SupportedLocales: languageMake([]string{"en", "ja"}),
},
true,
"ja",
......@@ -99,7 +109,7 @@ func TestDetermineLocale(t *testing.T) {
},
{
&LocaleHandler{
SupportedLocales: []string{"en", "ja"},
SupportedLocales: languageMake([]string{"en", "ja"}),
},
true,
"ja,en-US;q=0.8,en;q=0.6",
......@@ -107,7 +117,7 @@ func TestDetermineLocale(t *testing.T) {
},
{
&LocaleHandler{
SupportedLocales: []string{"en", "ja"},
SupportedLocales: languageMake([]string{"en", "ja"}),
},
true,
"af,ja,en-US;q=0.8,en;q=0.6",
......@@ -115,7 +125,7 @@ func TestDetermineLocale(t *testing.T) {
},
{
&LocaleHandler{
SupportedLocales: []string{"en", "ja"},
SupportedLocales: languageMake([]string{"en", "ja"}),
},
true,
"af,en-US;q=0.8,en;q=0.6",
......@@ -123,12 +133,60 @@ func TestDetermineLocale(t *testing.T) {
},
{
&LocaleHandler{
SupportedLocales: []string{"en", "ja"},
SupportedLocales: languageMake([]string{"en", "ja"}),
},
true,
"",
defaultDir,
},
{
&LocaleHandler{
SupportedLocales: languageMake([]string{"en", "zh-tw", "zh-hk", "zh", "ar-dz"}),
},
true,
"en",
"./public/en",
},
{
&LocaleHandler{
SupportedLocales: languageMake([]string{"en", "zh-tw", "zh-hk", "zh", "ar-dz"}),
},
true,
"zh",
"./public/zh",
},
{
&LocaleHandler{
SupportedLocales: languageMake([]string{"en", "zh-tw", "zh-hk", "zh", "ar-dz"}),
},
true,
"zh-cn",
"./public/zh",
},
{
&LocaleHandler{
SupportedLocales: languageMake([]string{"en", "zh-tw", "zh-hk", "zh", "ar-dz"}),
},
true,
"ar",
"./public/en",
},
{
&LocaleHandler{
SupportedLocales: languageMake([]string{"en", "zh-tw", "zh-hk", "zh", "ar-dz"}),
},
true,
"ar-bh",
"./public/en",
},
{
&LocaleHandler{
SupportedLocales: languageMake([]string{"en", "zh-tw", "zh", "ar-dz"}),
},
true,
"af,zh-HK,zh;q=0.8,en;q=0.6",
"./public/zh",
},
}
for _, c := range cases {
......@@ -139,7 +197,7 @@ func TestDetermineLocale(t *testing.T) {
t.Fatalf("%s", err)
}
for _, lang := range c.handler.SupportedLocales {
err = os.Mkdir("./public/"+lang, 0777)
err = os.Mkdir("./public/"+lang.String(), 0777)
if err != nil {
t.Fatalf("%s", err)
}
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册