...

Source file src/github.com/chai2010/gettext-go/fs_os.go

Documentation: github.com/chai2010/gettext-go

     1  // Copyright 2013 ChaiShushan <chaishushan{AT}gmail.com>. All rights reserved.
     2  // Use of this source code is governed by a BSD-style
     3  // license that can be found in the LICENSE file.
     4  
     5  package gettext
     6  
     7  import (
     8  	"archive/zip"
     9  	"bytes"
    10  	"fmt"
    11  	"io/ioutil"
    12  	"os"
    13  	"sort"
    14  	"strings"
    15  )
    16  
    17  type osFS struct {
    18  	root string
    19  }
    20  
    21  func newOsFS(root string) FileSystem {
    22  	// locale zip file
    23  	if fi, err := os.Stat(root); err == nil && !fi.IsDir() {
    24  		if strings.HasSuffix(strings.ToLower(root), ".zip") {
    25  			if x, err := ioutil.ReadFile(root); err == nil {
    26  				if r, err := zip.NewReader(bytes.NewReader(x), int64(len(x))); err == nil {
    27  					return ZipFS(r, root)
    28  				}
    29  			}
    30  		}
    31  		if strings.HasSuffix(strings.ToLower(root), ".json") {
    32  			if x, err := ioutil.ReadFile(root); err == nil {
    33  				if fs, err := newJson(x, root); err == nil {
    34  					return fs
    35  				}
    36  			}
    37  		}
    38  	}
    39  
    40  	// locale dir
    41  	return &osFS{root: root}
    42  }
    43  
    44  func (p *osFS) LocaleList() []string {
    45  	list, err := ioutil.ReadDir(p.root)
    46  	if err != nil {
    47  		return nil
    48  	}
    49  	ssMap := make(map[string]bool)
    50  	for _, dir := range list {
    51  		if dir.IsDir() {
    52  			ssMap[dir.Name()] = true
    53  		}
    54  	}
    55  	var locales = make([]string, 0, len(ssMap))
    56  	for s := range ssMap {
    57  		locales = append(locales, s)
    58  	}
    59  	sort.Strings(locales)
    60  	return locales
    61  }
    62  
    63  func (p *osFS) LoadMessagesFile(domain, locale, ext string) ([]byte, error) {
    64  	trName := p.makeMessagesFileName(domain, locale, ext)
    65  	rcData, err := ioutil.ReadFile(trName)
    66  	if err != nil {
    67  		return nil, err
    68  	}
    69  	return rcData, nil
    70  }
    71  
    72  func (p *osFS) LoadResourceFile(domain, locale, name string) ([]byte, error) {
    73  	rcName := p.makeResourceFileName(domain, locale, name)
    74  	rcData, err := ioutil.ReadFile(rcName)
    75  	if err != nil {
    76  		return nil, err
    77  	}
    78  	return rcData, nil
    79  }
    80  
    81  func (p *osFS) String() string {
    82  	return "gettext.localfs(" + p.root + ")"
    83  }
    84  
    85  func (p *osFS) makeMessagesFileName(domain, lang, ext string) string {
    86  	return fmt.Sprintf("%s/%s/LC_MESSAGES/%s%s", p.root, lang, domain, ext)
    87  }
    88  
    89  func (p *osFS) makeResourceFileName(domain, lang, name string) string {
    90  	return fmt.Sprintf("%s/%s/LC_RESOURCE/%s/%s", p.root, lang, domain, name)
    91  }
    92  

View as plain text