forked from toolshed/abra
		
	
		
			
				
	
	
		
			97 lines
		
	
	
		
			2.9 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
			
		
		
	
	
			97 lines
		
	
	
		
			2.9 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
/*
 | 
						|
 * Copyright (c) 2018 DeineAgentur UG https://www.deineagentur.com. All rights reserved.
 | 
						|
 * Licensed under the MIT License. See LICENSE file in the project root for full license information.
 | 
						|
 */
 | 
						|
 | 
						|
package gotext
 | 
						|
 | 
						|
import (
 | 
						|
	"errors"
 | 
						|
	"io/fs"
 | 
						|
	"os"
 | 
						|
)
 | 
						|
 | 
						|
// Translator interface is used by Locale and Po objects.Translator
 | 
						|
// It contains all methods needed to parse translation sources and obtain corresponding translations.
 | 
						|
// Also implements gob.GobEncoder/gob.DobDecoder interfaces to allow serialization of Locale objects.
 | 
						|
type Translator interface {
 | 
						|
	ParseFile(f string)
 | 
						|
	Parse(buf []byte)
 | 
						|
	Get(str string, vars ...interface{}) string
 | 
						|
	GetN(str, plural string, n int, vars ...interface{}) string
 | 
						|
	GetC(str, ctx string, vars ...interface{}) string
 | 
						|
	GetNC(str, plural string, n int, ctx string, vars ...interface{}) string
 | 
						|
 | 
						|
	MarshalBinary() ([]byte, error)
 | 
						|
	UnmarshalBinary([]byte) error
 | 
						|
	GetDomain() *Domain
 | 
						|
}
 | 
						|
 | 
						|
// AppendTranslator interface is used by Locale and Po objects.
 | 
						|
// It contains all methods needed to parse translation sources and to append entries to the object.
 | 
						|
type AppendTranslator interface {
 | 
						|
	Translator
 | 
						|
	Append(b []byte, str string, vars ...interface{}) []byte
 | 
						|
	AppendN(b []byte, str, plural string, n int, vars ...interface{}) []byte
 | 
						|
	AppendC(b []byte, str, ctx string, vars ...interface{}) []byte
 | 
						|
	AppendNC(b []byte, str, plural string, n int, ctx string, vars ...interface{}) []byte
 | 
						|
}
 | 
						|
 | 
						|
// TranslatorEncoding is used as intermediary storage to encode Translator objects to Gob.
 | 
						|
type TranslatorEncoding struct {
 | 
						|
	// Headers storage
 | 
						|
	Headers HeaderMap
 | 
						|
 | 
						|
	// Language header
 | 
						|
	Language string
 | 
						|
 | 
						|
	// Plural-Forms header
 | 
						|
	PluralForms string
 | 
						|
 | 
						|
	// Parsed Plural-Forms header values
 | 
						|
	Nplurals int
 | 
						|
	Plural   string
 | 
						|
 | 
						|
	// Storage
 | 
						|
	Translations map[string]*Translation
 | 
						|
	Contexts     map[string]map[string]*Translation
 | 
						|
}
 | 
						|
 | 
						|
// GetTranslator is used to recover a Translator object after unmarshalling the TranslatorEncoding object.
 | 
						|
// Internally uses a Po object as it should be switchable with Mo objects without problem.
 | 
						|
// External Translator implementations should be able to serialize into a TranslatorEncoding object in order to
 | 
						|
// deserialize into a Po-compatible object.
 | 
						|
func (te *TranslatorEncoding) GetTranslator() Translator {
 | 
						|
	po := NewPo()
 | 
						|
	po.domain = NewDomain()
 | 
						|
	po.domain.Headers = te.Headers
 | 
						|
	po.domain.Language = te.Language
 | 
						|
	po.domain.PluralForms = te.PluralForms
 | 
						|
	po.domain.nplurals = te.Nplurals
 | 
						|
	po.domain.plural = te.Plural
 | 
						|
	po.domain.translations = te.Translations
 | 
						|
	po.domain.contextTranslations = te.Contexts
 | 
						|
 | 
						|
	return po
 | 
						|
}
 | 
						|
 | 
						|
// getFileData reads a file and returns the byte slice after doing some basic sanity checking
 | 
						|
func getFileData(f string, filesystem fs.FS) ([]byte, error) {
 | 
						|
	if filesystem != nil {
 | 
						|
		return fs.ReadFile(filesystem, f)
 | 
						|
	}
 | 
						|
 | 
						|
	// Check if file exists
 | 
						|
	info, err := os.Stat(f)
 | 
						|
	if err != nil {
 | 
						|
		return nil, err
 | 
						|
	}
 | 
						|
 | 
						|
	// Check that isn't a directory
 | 
						|
	if info.IsDir() {
 | 
						|
		return nil, errors.New("cannot parse a directory")
 | 
						|
	}
 | 
						|
 | 
						|
	return os.ReadFile(f)
 | 
						|
}
 |