fix(langpack): sync WebK catalog alias support

This commit is contained in:
iamxvbaba 2026-07-25 14:08:43 +08:00
parent 9ef746d45e
commit a785ae7491
7 changed files with 313 additions and 8 deletions

View file

@ -2,11 +2,13 @@ package langpack
import (
"context"
"errors"
"os"
"path/filepath"
"strings"
"testing"
"telesrv/internal/domain"
"telesrv/internal/store/memory"
)
@ -205,8 +207,8 @@ func TestSeedDirectoryReconcilesManifest(t *testing.T) {
t.Fatalf("reconcile removed file = %d, %v", seeded, err)
}
languages, err = service.ListLanguages(ctx, "tdesktop")
if err != nil || len(languages) != 0 {
t.Fatalf("languages after removal = %+v, err %v", languages, err)
if !errors.Is(err, domain.ErrLangPackInvalid) || len(languages) != 0 {
t.Fatalf("languages after removal = %+v, err %v, want ErrLangPackInvalid", languages, err)
}
}

View file

@ -70,6 +70,9 @@ func (s *Service) GetDifference(ctx context.Context, langPack, langCode string,
if s == nil || s.packs == nil {
return domain.LangPack{LangPack: packName, LangCode: code, FromVersion: fromVersion}, nil
}
if err := s.validateLanguage(ctx, packName, code); err != nil {
return domain.LangPack{}, err
}
var (
pack domain.LangPack
err error
@ -96,6 +99,9 @@ func (s *Service) GetStrings(ctx context.Context, langPack, langCode string, key
if s == nil || s.packs == nil {
return domain.LangPack{LangPack: packName, LangCode: code}, nil
}
if err := s.validateLanguage(ctx, packName, code); err != nil {
return domain.LangPack{}, err
}
pack, err := s.effectivePack(ctx, packName, code)
if err != nil {
return domain.LangPack{}, err
@ -123,7 +129,14 @@ func (s *Service) ListLanguages(ctx context.Context, langPack string) ([]domain.
if s == nil || s.packs == nil {
return nil, nil
}
return s.cachedLanguages(ctx, packName)
languages, err := s.cachedLanguages(ctx, packName)
if err != nil {
return nil, err
}
if len(languages) == 0 {
return nil, domain.ErrLangPackInvalid
}
return languages, nil
}
func normalizePack(langPack string) string {
@ -131,6 +144,9 @@ func normalizePack(langPack string) string {
if pack == "" {
return "tdesktop"
}
if pack == "web" {
return "webk"
}
return pack
}
@ -262,6 +278,22 @@ func (s *Service) cachedLanguages(ctx context.Context, langPack string) ([]domai
}
}
func (s *Service) validateLanguage(ctx context.Context, langPack, langCode string) error {
languages, err := s.cachedLanguages(ctx, langPack)
if err != nil {
return err
}
if len(languages) == 0 {
return domain.ErrLangPackInvalid
}
for _, language := range languages {
if normalizeCode(language.LangCode) == langCode {
return nil
}
}
return domain.ErrLangCodeNotSupported
}
func (s *Service) brandPack(pack domain.LangPack) domain.LangPack {
for i := range pack.Strings {
item := &pack.Strings[i]

View file

@ -2,6 +2,7 @@ package langpack
import (
"context"
"errors"
"sync"
"testing"
"time"
@ -11,6 +12,106 @@ import (
"telesrv/internal/store/memory"
)
func TestServiceNormalizesWebAliasAndRejectsUnknownCatalogEntries(t *testing.T) {
ctx := context.Background()
packs := memory.NewLangPackStore()
svc := NewService(packs)
for _, pack := range []domain.LangPack{
{
LangPack: "webk",
LangCode: "en",
Version: 7,
Strings: []domain.LangPackString{{Key: "lng_settings_language", Value: "Language"}},
},
{
LangPack: "webk",
LangCode: "zh-hans",
Version: 9,
Strings: []domain.LangPackString{{Key: "lng_settings_language", Value: "语言"}},
},
} {
if err := packs.UpsertPack(ctx, pack); err != nil {
t.Fatalf("seed %s/%s: %v", pack.LangPack, pack.LangCode, err)
}
}
languages, err := svc.ListLanguages(ctx, " WEB ")
if err != nil {
t.Fatalf("list web languages: %v", err)
}
if len(languages) != 2 || findLanguage(languages, "zh-hans") == nil {
t.Fatalf("web languages = %+v, want canonical webk catalog", languages)
}
full, err := svc.GetLangPack(ctx, "web", "ZH_HANS")
if err != nil {
t.Fatalf("get web langpack: %v", err)
}
if full.LangPack != "webk" || full.LangCode != "zh-hans" || full.Version != 9 || stringValue(full.Strings, "lng_settings_language") != "语言" {
t.Fatalf("web langpack = %+v, want canonical webk/zh-hans", full)
}
diff, err := svc.GetDifference(ctx, "web", "zh-hans", 1)
if err != nil {
t.Fatalf("get web difference: %v", err)
}
if diff.LangPack != "webk" || diff.FromVersion != 1 || len(diff.Strings) != 1 {
t.Fatalf("web difference = %+v, want canonical webk delta", diff)
}
selected, err := svc.GetStrings(ctx, "web", "zh-hans", []string{"lng_settings_language"})
if err != nil {
t.Fatalf("get web strings: %v", err)
}
if selected.LangPack != "webk" || stringValue(selected.Strings, "lng_settings_language") != "语言" {
t.Fatalf("web strings = %+v, want selected webk string", selected)
}
invalidPackCalls := map[string]func() error{
"list": func() error {
_, err := svc.ListLanguages(ctx, "web-invalid")
return err
},
"full": func() error {
_, err := svc.GetLangPack(ctx, "web-invalid", "en")
return err
},
"difference": func() error {
_, err := svc.GetDifference(ctx, "web-invalid", "en", 1)
return err
},
"strings": func() error {
_, err := svc.GetStrings(ctx, "web-invalid", "en", []string{"key"})
return err
},
}
for name, call := range invalidPackCalls {
if err := call(); !errors.Is(err, domain.ErrLangPackInvalid) {
t.Fatalf("%s invalid pack error = %v, want ErrLangPackInvalid", name, err)
}
}
unsupportedCodeCalls := map[string]func() error{
"full": func() error {
_, err := svc.GetLangPack(ctx, "web", "fr")
return err
},
"difference": func() error {
_, err := svc.GetDifference(ctx, "web", "fr", 1)
return err
},
"strings": func() error {
_, err := svc.GetStrings(ctx, "web", "fr", []string{"key"})
return err
},
}
for name, call := range unsupportedCodeCalls {
if err := call(); !errors.Is(err, domain.ErrLangCodeNotSupported) {
t.Fatalf("%s unsupported code error = %v, want ErrLangCodeNotSupported", name, err)
}
}
}
func TestServiceNormalizesWebARawLangCode(t *testing.T) {
ctx := context.Background()
packs := memory.NewLangPackStore()