From c60a5e047428fb59880c25ccfe24e7a659b4e98f Mon Sep 17 00:00:00 2001 From: Virgil Date: Thu, 2 Apr 2026 05:40:52 +0000 Subject: [PATCH] fix(i18n): flag missing translations in Translate Co-Authored-By: Virgil --- i18n.go | 2 +- i18n_test.go | 11 +++++++++++ service.go | 16 +++++++++++++++- service_test.go | 15 +++++++++++++++ 4 files changed, 42 insertions(+), 2 deletions(-) diff --git a/i18n.go b/i18n.go index 4bb14d2..810ea25 100644 --- a/i18n.go +++ b/i18n.go @@ -21,7 +21,7 @@ func Translate(messageID string, args ...any) core.Result { if svc := Default(); svc != nil { return svc.Translate(messageID, args...) } - return core.Result{Value: messageID, OK: true} + return core.Result{Value: messageID, OK: false} } // Raw translates without i18n.* namespace magic. diff --git a/i18n_test.go b/i18n_test.go index b86b4f5..14debce 100644 --- a/i18n_test.go +++ b/i18n_test.go @@ -52,6 +52,17 @@ func TestTranslate_Good(t *testing.T) { assert.Equal(t, "y", result.Value) } +func TestTranslate_Good_MissingKey(t *testing.T) { + svc, err := New() + require.NoError(t, err) + _ = Init() + SetDefault(svc) + + result := Translate("nonexistent.translation.key") + require.False(t, result.OK) + assert.Equal(t, "nonexistent.translation.key", result.Value) +} + // --- Package-level Raw() --- func TestRaw_Good(t *testing.T) { diff --git a/service.go b/service.go index 8fd85a3..c1fdb5f 100644 --- a/service.go +++ b/service.go @@ -378,7 +378,8 @@ func (s *Service) T(messageID string, args ...any) string { // Translate translates a message by its ID and returns a Core result. func (s *Service) Translate(messageID string, args ...any) core.Result { - return core.Result{Value: s.T(messageID, args...), OK: true} + value := s.T(messageID, args...) + return core.Result{Value: value, OK: translateOK(messageID, value)} } // resolveDirect performs exact-key lookup in the current language, its base @@ -829,6 +830,19 @@ func (s *Service) AddLoader(loader Loader) error { return nil } +func translateOK(messageID, value string) bool { + if value == "" { + return false + } + if value == messageID { + return false + } + if value == "["+messageID+"]" { + return false + } + return true +} + // LoadFS loads additional locale files from a filesystem. // Deprecated: Use AddLoader(NewFSLoader(fsys, dir)) instead for proper grammar handling. func (s *Service) LoadFS(fsys fs.FS, dir string) error { diff --git a/service_test.go b/service_test.go index 16f69b4..dd7ca79 100644 --- a/service_test.go +++ b/service_test.go @@ -94,6 +94,21 @@ func TestServiceTranslate(t *testing.T) { var _ core.Translator = (*Service)(nil) } +func TestServiceTranslateMissingKey(t *testing.T) { + svc, err := New() + if err != nil { + t.Fatalf("New() failed: %v", err) + } + + result := svc.Translate("missing.translation.key") + if result.OK { + t.Fatalf("Translate(missing.translation.key) returned OK, want false: %#v", result) + } + if got, want := result.Value, "missing.translation.key"; got != want { + t.Fatalf("Translate(missing.translation.key) = %#v, want %q", got, want) + } +} + func TestServiceTDirectKeys(t *testing.T) { svc, err := New() if err != nil { -- 2.45.3