Received: from mail.netlandish.com (mail.netlandish.com [174.136.98.166])
	by code.netlandish.com (Postfix) with ESMTP id 4505C214
	for <~netlandish/links-dev@lists.code.netlandish.com>; Thu, 26 Mar 2026 23:46:58 +0000 (UTC)
Received-SPF: Pass (mailfrom) identity=mailfrom; client-ip=209.85.128.173; helo=mail-yw1-f173.google.com; envelope-from=peter@netlandish.com; receiver=<UNKNOWN> 
Authentication-Results: mail.netlandish.com;
	dkim=pass (1024-bit key; unprotected) header.d=netlandish.com header.i=@netlandish.com header.b=LrWybKYy
Received: from mail-yw1-f173.google.com (mail-yw1-f173.google.com [209.85.128.173])
	by mail.netlandish.com (Postfix) with ESMTP id 404DD1D642C
	for <~netlandish/links-dev@lists.code.netlandish.com>; Thu, 26 Mar 2026 23:46:55 +0000 (UTC)
Received: by mail-yw1-f173.google.com with SMTP id 00721157ae682-79827d28fc4so16461267b3.1
        for <~netlandish/links-dev@lists.code.netlandish.com>; Thu, 26 Mar 2026 16:46:55 -0700 (PDT)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed;
        d=netlandish.com; s=google; t=1774568815; x=1775173615; darn=lists.code.netlandish.com;
        h=content-transfer-encoding:mime-version:message-id:date:subject:cc
         :to:from:from:to:cc:subject:date:message-id:reply-to;
        bh=Vh1D+jLoG6d29GAjQnLLm6RRL008OIok32OK0bOJ9uQ=;
        b=LrWybKYyZtc5X8jWJZmWl8a9JdbW+LcN2a4C6vdRthmFtuGQV2VtB9uMXMBXTl9q1W
         5qhbrBwdPQO9N7UJYhSZ11dmd5FY1T3hB1ILr/n8T1awX5cC2qpsyVfq6bNUsR5iu/3h
         u74XBTnJzJQHXQ1wlnJbMbDp22C1ew5/HmosQ=
X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed;
        d=1e100.net; s=20251104; t=1774568815; x=1775173615;
        h=content-transfer-encoding:mime-version:message-id:date:subject:cc
         :to:from:x-gm-gg:x-gm-message-state:from:to:cc:subject:date
         :message-id:reply-to;
        bh=Vh1D+jLoG6d29GAjQnLLm6RRL008OIok32OK0bOJ9uQ=;
        b=CdTDXav8o/uko0d2iPhpD2cYNhI7q/trv0TFySBjOn5iop04vSczXTA2kCtxPEHMWE
         rwV5LBWWyM4/L68E/SrQrchmss4Sx/4gEC6dmuL4/2o4QTwFsYyMzSsZLpRyVlihXkLU
         z7cZZGRv206WMNCqDNi6mhsblNwwM+A2mGpAedOHzgOul7J41EGzFTiWSwzuAE41vGJW
         sstYj8XKSCoJ5/6lsXYzTqpNRsAX8CBWgaJO11ayc88YOnkvKhzmD7IvPdzQl2pAtD0J
         EACXVAsyfYmSrTkNIWmwrVEYm1HTxv7Lf5c4ad8GEre5tIKtj8Ho28gEsllXNobyge5f
         GWbQ==
X-Gm-Message-State: AOJu0YwdNF65SafGL+wLwjA1FmiwGR/hJkyTXhZbGoTZP1FXeTsnazHr
	aKi4GEEP1DsKqfee+Bs1bxdYe6t85WH/aeG1VSXVuplwK3ziRJQrvngfbWPLyvwRSXFkBdJZDDv
	PRUCVvSs=
X-Gm-Gg: ATEYQzwymmlnIHcskA12KlHsTDl/UOh+4uMTdmKZmCAXU1aP6hLvptTN3b20cy5Pp4r
	nvfTn+49/9hPvXacRsWc7ohSYB9ycBZ0KtRg9kSDRthMZQPQjajbd4N4hpK2vWnzvmVcySMbHHK
	hpFmPq8voSLNeMhqo+KXMxBVQgyAQq/jGDmBrbfEY2YU2rzwwvTCfpCeNTdot/9yxGp14uldmRm
	KL5N9tY31Z0WjTVHlwPkyQ/lbCBpUEDdJHk/Uk6z1V6Aqgb/FOe7zhrBd90OZbo7cNROlMpcxma
	+eNo+RCqu1F2UyhsL8vhEB8CLtkk1+8Ql877/FpNItWl2K5nQFZ7SJxXiE1JXgT4d0o+WAOdUvQ
	4KX7R1/yH7E8wXQSJL0p7RhotUYvbDLmJKDhKrk8ogOsMwNWl34R8eHLbwMy1BJiJXKIJ7Hg0yd
	FG5b4xDDDoMVkMxzLuSVaFQg==
X-Received: by 2002:a05:690c:e3ee:b0:79a:3a33:954 with SMTP id 00721157ae682-79bde061427mr3045717b3.50.1774568814936;
        Thu, 26 Mar 2026 16:46:54 -0700 (PDT)
Received: from localhost ([186.77.196.106])
        by smtp.gmail.com with ESMTPSA id 00721157ae682-79b10c6ec37sm21451387b3.1.2026.03.26.16.46.54
        (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256);
        Thu, 26 Mar 2026 16:46:54 -0700 (PDT)
From: Peter Sanchez <peter@netlandish.com>
To: ~netlandish/links-dev@lists.code.netlandish.com
Cc: Peter Sanchez <peter@netlandish.com>
Subject: [PATCH links] translations: fix error when translations default catalog was overwritten
Date: Thu, 26 Mar 2026 17:46:44 -0600
Message-ID: <20260326234652.20283-1-peter@netlandish.com>
X-Mailer: git-send-email 2.52.0
MIME-Version: 1.0
Content-Transfer-Encoding: 8bit

Changelog-fixed: translations bug where catalog was overwritten and
 translations failed to show Spanish
---
 internal/localizer/localizer.go | 12 +++---------
 internal/translations/appcat.go | 24 ++++++++++++++++++++++++
 2 files changed, 27 insertions(+), 9 deletions(-)
 create mode 100644 internal/translations/appcat.go

diff --git a/internal/localizer/localizer.go b/internal/localizer/localizer.go
index 62a268d..bb4c803 100644
--- a/internal/localizer/localizer.go
+++ b/internal/localizer/localizer.go
@@ -7,11 +7,7 @@ import (
 
 	"netlandish.com/x/gobwebs/core"
 
-	// Import the internal/translations so that it's init() function
-	// is run. It's really important that we do this here so that the
-	// default message catalog is updated to use our translations
-	// *before* we initialize the message.Printer instances below.
-	_ "links/internal/translations"
+	trans "links/internal/translations"
 
 	"github.com/labstack/echo/v4"
 	"golang.org/x/text/language"
@@ -39,14 +35,12 @@ func (l *Localizer) Translate(key message.Reference, args ...any) string {
 // catalog named Gatalog
 var locales = []Localizer{
 	{
-		// Spanish
 		ID:      "es",
-		printer: message.NewPrinter(language.MustParse("es")),
+		printer: message.NewPrinter(language.MustParse("es"), message.Catalog(trans.AppCatalog)),
 	},
 	{
-		// English
 		ID:      "en",
-		printer: message.NewPrinter(language.MustParse("en")),
+		printer: message.NewPrinter(language.MustParse("en"), message.Catalog(trans.AppCatalog)),
 	},
 }
 
diff --git a/internal/translations/appcat.go b/internal/translations/appcat.go
new file mode 100644
index 0000000..27cde5a
--- /dev/null
+++ b/internal/translations/appcat.go
@@ -0,0 +1,24 @@
+package translations
+
+import (
+	"golang.org/x/text/language"
+	"golang.org/x/text/message/catalog"
+)
+
+// AppCatalog is the application-specific translation catalog.
+// Exported so the localizer can bind printers explicitly,
+// avoiding DefaultCatalog races with gobwebs' catalog.
+var AppCatalog catalog.Catalog
+
+func init() {
+	dict := map[string]catalog.Dictionary{
+		"en": &dictionary{index: enIndex, data: enData},
+		"es": &dictionary{index: esIndex, data: esData},
+	}
+	fallback := language.MustParse("en")
+	cat, err := catalog.NewFromMap(dict, catalog.Fallback(fallback))
+	if err != nil {
+		panic(err)
+	}
+	AppCatalog = cat
+}
-- 
2.52.0

