Skip to content

Commit

Permalink
support json file
Browse files Browse the repository at this point in the history
  • Loading branch information
chai2010 committed Apr 13, 2020
1 parent f71853d commit 8d91d6e
Show file tree
Hide file tree
Showing 5 changed files with 139 additions and 3 deletions.
21 changes: 21 additions & 0 deletions example_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -69,3 +69,24 @@ func Example_multiLang() {
// 来自"Hi"包的问候: 你好, 世界!(ctx:code.google.com/p/gettext-go/examples/hi.SayHi)
// 來自"Hi"包的問候: 你好, 世界!(ctx:code.google.com/p/gettext-go/examples/hi.SayHi)
}

func Example_json() {
const jsonData = `{
"zh_CN": {
"LC_MESSAGES": {
"hello.json": [{
"msgctxt" : "",
"msgid" : "Hello, world!",
"msgid_plural": "",
"msgstr" : ["你好, 世界!"]
}]
}
}
}`

gettext := gettext.New("hello", "???", jsonData).SetLanguage("zh_CN")
fmt.Println(gettext.Gettext("Hello, world!"))

// Output:
// 你好, 世界!
}
9 changes: 6 additions & 3 deletions fs.go
Original file line number Diff line number Diff line change
Expand Up @@ -33,13 +33,19 @@ func NewFS(name string, x interface{}) FileSystem {
if r, err := zip.NewReader(bytes.NewReader(x), int64(len(x))); err == nil {
return ZipFS(r, name)
}
if fs, err := newJson(x, name); err == nil {
return fs
}
case string:
if len(x) == 0 {
return OS(name)
}
if r, err := zip.NewReader(bytes.NewReader([]byte(x)), int64(len(x))); err == nil {
return ZipFS(r, name)
}
if fs, err := newJson([]byte(x), name); err == nil {
return fs
}
case FileSystem:
return x
}
Expand All @@ -66,9 +72,6 @@ type nilFS struct {
func (p *nilFS) LocaleList() []string {
return nil
}
func (p *nilFS) DomainList(locale string) []string {
return nil
}

func (p *nilFS) LoadMessagesFile(domain, lang, ext string) ([]byte, error) {
return nil, fmt.Errorf("not found")
Expand Down
66 changes: 66 additions & 0 deletions fs_json.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,66 @@
// Copyright 2020 ChaiShushan <chaishushan{AT}gmail.com>. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.

package gettext

import (
"encoding/json"
"fmt"
"sort"
)

type jsonFS struct {
name string
x map[string]struct {
LC_MESSAGES map[string][]struct {
MsgContext string `json:"msgctxt"` // msgctxt context
MsgId string `json:"msgid"` // msgid untranslated-string
MsgIdPlural string `json:"msgid_plural"` // msgid_plural untranslated-string-plural
MsgStr []string `json:"msgstr"` // msgstr translated-string
}
LC_RESOURCE map[string]map[string]string
}
}

func isJsonData() bool {
return false
}

func newJson(jsonData []byte, name string) (*jsonFS, error) {
p := &jsonFS{name: name}
if err := json.Unmarshal(jsonData, &p.x); err != nil {
return nil, err
}

return p, nil
}

func (p *jsonFS) LocaleList() []string {
var ss []string
for lang := range p.x {
ss = append(ss, lang)
}
sort.Strings(ss)
return ss
}

func (p *jsonFS) LoadMessagesFile(domain, lang, ext string) ([]byte, error) {
if v, ok := p.x[lang]; ok {
if v, ok := v.LC_MESSAGES[domain+ext]; ok {
return json.Marshal(v)
}
}
return nil, fmt.Errorf("not found")
}
func (p *jsonFS) LoadResourceFile(domain, lang, name string) ([]byte, error) {
if v, ok := p.x[lang]; ok {
if v, ok := v.LC_RESOURCE[domain]; ok {
return []byte(v[name]), nil
}
}
return nil, fmt.Errorf("not found")
}
func (p *jsonFS) String() string {
return "gettext.nilfs(" + p.name + ")"
}
9 changes: 9 additions & 0 deletions locale.go
Original file line number Diff line number Diff line change
Expand Up @@ -114,6 +114,15 @@ func (p *_Locale) syncTrMap() {
}
}

// try load json file
if data, err := p.fs.LoadMessagesFile(p.domain, p.lang, ".json"); err == nil {
if tr, err := newJsonTranslator(p.lang, fmt.Sprintf("%s_%s.json", p.domain, p.lang), data); err == nil {
p.trMap[trMapKey] = tr
p.trCurrent = tr
return
}
}

// no po/mo file
p.trMap[trMapKey] = nilTranslator
p.trCurrent = nilTranslator
Expand Down
37 changes: 37 additions & 0 deletions tr.go
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,8 @@
package gettext

import (
"encoding/json"

"github.com/chai2010/gettext-go/mo"
"github.com/chai2010/gettext-go/plural"
"github.com/chai2010/gettext-go/po"
Expand Down Expand Up @@ -80,6 +82,41 @@ func newPoTranslator(name string, data []byte) (*translator, error) {
return tr, nil
}

func newJsonTranslator(lang, name string, jsonData []byte) (*translator, error) {
var msgList []struct {
MsgContext string `json:"msgctxt"` // msgctxt context
MsgId string `json:"msgid"` // msgid untranslated-string
MsgIdPlural string `json:"msgid_plural"` // msgid_plural untranslated-string-plural
MsgStr []string `json:"msgstr"` // msgstr translated-string
}
if err := json.Unmarshal(jsonData, &msgList); err != nil {
return nil, err
}

var tr = &translator{
MessageMap: make(map[string]mo.Message),
PluralFormula: plural.Formula(lang),
}

for _, v := range msgList {
var v_MsgStr string
var v_MsgStrPlural = v.MsgStr

if len(v.MsgStr) != 0 {
v_MsgStr = v.MsgStr[0]
}

tr.MessageMap[tr.makeMapKey(v.MsgContext, v.MsgId)] = mo.Message{
MsgContext: v.MsgContext,
MsgId: v.MsgId,
MsgIdPlural: v.MsgIdPlural,
MsgStr: v_MsgStr,
MsgStrPlural: v_MsgStrPlural,
}
}
return tr, nil
}

func (p *translator) PGettext(msgctxt, msgid string) string {
return p.findMsgStr(msgctxt, msgid)
}
Expand Down

0 comments on commit 8d91d6e

Please sign in to comment.