Ctrl K
ComunidadGuías…

internal/domain/langpack.go

Rama main · réplica de lectura del repositorio original.

Archivo original ↗Preguntar a KiBot
package domain

import "errors"

var (
	// ErrLangPackInvalid means the language pack catalog requested by the client does not exist.
	ErrLangPackInvalid = errors.New("lang pack invalid")
	// ErrLangCodeNotSupported means the language pack catalog exists but contains no entry for the requested language code.
	ErrLangCodeNotSupported = errors.New("lang code not supported")
)

// LangPack is a client language pack query result.
type LangPack struct {
	LangPack    string
	LangCode    string
	FromVersion int
	Version     int
	Strings     []LangPackString
}

// LangPackSeed is the full language pack file inventory obtained from one startup scan.
type LangPackSeed struct {
	Catalog string
	Scopes  []string
	Packs   []LangPackSeedEntry
}

// LangPackSeedEntry records one language pack file, its source hash and normalized content hash.
type LangPackSeedEntry struct {
	Pack         LangPack
	SourceHash   string
	ContentHash  string
	StringsCount int
	// Size/ModTime are the source file's byte count and modification time (Unix nanoseconds). The old hash is
	// reused only when both and the filename version are unchanged; an old inventory lacking stat metadata must re-verify the file content first.
	Size          int64
	ModTime       int64
	ContentLoaded bool
}

// LangPackSeedCatalog is the inventory snapshot from the last successful reconciliation, usable to skip parsing unchanged files.
type LangPackSeedCatalog struct {
	Catalog string                     `json:"catalog"`
	Scopes  []string                   `json:"scopes"`
	Packs   []LangPackSeedCatalogEntry `json:"packs"`
}

// LangPackSeedCatalogEntry stores only the bounded metadata needed to tell whether the source file changed.
type LangPackSeedCatalogEntry struct {
	LangPack     string `json:"lang_pack"`
	LangCode     string `json:"lang_code"`
	Version      int    `json:"version"`
	SourceHash   string `json:"source_hash"`
	ContentHash  string `json:"content_hash"`
	StringsCount int    `json:"strings_count"`
	Size         int64  `json:"size,omitempty"`
	ModTime      int64  `json:"mod_time,omitempty"`
}

// CatalogSnapshot compresses one scan result into a persistable inventory snapshot.
func (seed LangPackSeed) CatalogSnapshot() LangPackSeedCatalog {
	state := LangPackSeedCatalog{
		Catalog: seed.Catalog,
		Scopes:  append([]string(nil), seed.Scopes...),
		Packs:   make([]LangPackSeedCatalogEntry, 0, len(seed.Packs)),
	}
	for _, entry := range seed.Packs {
		state.Packs = append(state.Packs, LangPackSeedCatalogEntry{
			LangPack:     entry.Pack.LangPack,
			LangCode:     entry.Pack.LangCode,
			Version:      entry.Pack.Version,
			SourceHash:   entry.SourceHash,
			ContentHash:  entry.ContentHash,
			StringsCount: entry.StringsCount,
			Size:         entry.Size,
			ModTime:      entry.ModTime,
		})
	}
	return state
}

// SameSeedCatalogSnapshot compares whether two inventories match field by field (including file size and modification time).
func SameSeedCatalogSnapshot(a, b LangPackSeedCatalog) bool {
	if a.Catalog != b.Catalog || len(a.Scopes) != len(b.Scopes) || len(a.Packs) != len(b.Packs) {
		return false
	}
	for i := range a.Scopes {
		if a.Scopes[i] != b.Scopes[i] {
			return false
		}
	}
	for i := range a.Packs {
		if a.Packs[i] != b.Packs[i] {
			return false
		}
	}
	return true
}

// LangPackLanguage is the language metadata returned by langpack.getLanguages/getLanguage.
type LangPackLanguage struct {
	LangPack        string
	LangCode        string
	Name            string
	NativeName      string
	BaseLangCode    string
	PluralCode      string
	Official        bool
	Rtl             bool
	Beta            bool
	StringsCount    int
	TranslatedCount int
	TranslationsURL string
}

// LangPackString is a normal or plural-form string in a language pack.
type LangPackString struct {
	Key        string
	Value      string
	Pluralized bool
	ZeroValue  string
	OneValue   string
	TwoValue   string
	FewValue   string
	ManyValue  string
	OtherValue string
	Deleted    bool
}