Received: from malur.postgresql.org ([217.196.149.56]) by arkaria.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.96) (envelope-from ) id 1wfXX6-005VME-1B for pgsql-hackers@arkaria.postgresql.org; Fri, 03 Jul 2026 06:37:52 +0000 Received: from localhost ([127.0.0.1] helo=malur.postgresql.org) by malur.postgresql.org with esmtp (Exim 4.96) (envelope-from ) id 1wfXX4-005sH2-0G for pgsql-hackers@arkaria.postgresql.org; Fri, 03 Jul 2026 06:37:50 +0000 Received: from magus.postgresql.org ([2a02:c0:301:0:ffff::29]) by malur.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.96) (envelope-from ) id 1wfXX3-005sGt-2S for pgsql-hackers@lists.postgresql.org; Fri, 03 Jul 2026 06:37:49 +0000 Received: from mail-pf1-x42e.google.com ([2607:f8b0:4864:20::42e]) by magus.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 (Exim 4.98.2) (envelope-from ) id 1wfXX1-00000001Qsr-1hkt for pgsql-hackers@lists.postgresql.org; Fri, 03 Jul 2026 06:37:49 +0000 Received: by mail-pf1-x42e.google.com with SMTP id d2e1a72fcca58-84592b55832so154221b3a.3 for ; Thu, 02 Jul 2026 23:37:46 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1783060665; x=1783665465; darn=lists.postgresql.org; h=content-transfer-encoding:mime-version:user-agent:from:subject:to :message-id:date:from:to:cc:subject:date:message-id:reply-to; bh=nXEK8th+qk23SgCV3tlqXcd2dYspZB/aeOREzugb6IA=; b=itC8XggLm26wMkNuaAGCs0d3FMU5IcwToDoamUDTAuK/Oe5FFVJbfFZX8L8zcJG1H+ Vv8LDaOthpiHXA975xciR8b0EjuuNDogESAJ9hBW18E/GLVLbyUb8A+tSY1eABuB8bae KezCUarTInVS3SlGTQbEFOfeadP7T0WbHyeRe59xrU3grpesbP4rIJOFfm4vUK5WnhZ/ oh8U7lW9aX1vyQiBIKmYHQfWf2kkitZcQzN0EuAHr6nbsje/VMuKfLguREcDct8zHg35 uKF6Elhdr8fAtsktXuna3T6bi5okFQaHWt/efC18DRO5CSQw+PZDw498tnM3fd1ES9ei Betg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1783060665; x=1783665465; h=content-transfer-encoding:mime-version:user-agent:from:subject:to :message-id:date:x-gm-gg:x-gm-message-state:from:to:cc:subject:date :message-id:reply-to; bh=nXEK8th+qk23SgCV3tlqXcd2dYspZB/aeOREzugb6IA=; b=LX6zmwrgLLVe1+/OEEHu1+rRy/JkjSg+OneU5wslxuY0vj7K2OpIC2gZB+MwCNCos7 RzaOaVa1oraxPkmk9t9eVOPxAbqN5bFjq7/IAr3ac0BDLRcSYeV5dkBrGpkkfbcF8YQF VyYHoHpsEQkV8oxUrPDwXVBmIKBpX0Hg2wK+6RJ6OAdCz1fEcn8hGyMDV57h+OMs7QXw UGTU7sPquHNSjo8OGfLAE13siSQZi0XhDeNkFXVO3vWqZtq4p4F0Cpow0/aeaCEzNeUK x8FiRRyBhR2KAm42P5bCncjp+Q/k72JSa8Ez7aTBm9OoywrNYpHyqcXofmQfSs4jqmE/ Braw== X-Gm-Message-State: AOJu0YyxmjaKsEM+bRkVFh/AZJbu8US9+/4++sz1XvYjiosEZ+fwJ6Ha iQjZuKRQ2jLg0r1r055pJ2YFQ6m+Gt2/VXn3jXpbTAAvviFJJvUbta8PVeRvsQ== X-Gm-Gg: AfdE7ckFOdGwdapq8o7mkhdkuTL34PzrVl2XH8Z7QAslAmHPuZZ13/JN7A5ZIO09Hso iLjCjHdXNCPBNDL16mot0Y+REKR39nHe2Z0AykiLDfp8q5h/RTP4P6q4O01nHUKe6GeQq8ffRao kAAzYduDeCVk/bNthsPnPzxHidWzDQizug1yfybGiX17sjE/3/3IwDXVjgblFXpEo7iFbyxe78q IISKbGXWw3G5GbHvGJjVeqdtIxtzWndTZEdyctrwJYwq5A+9mnenFgHPz8xnfgGOpA2hh/7wcbs OfDgt1lq0Hdc8czG0HXDZlAuJcqlh3/DneghRU5RYw3C6+8kqTOsQ4oPFebupNCgc7lau1v181U e8vOSEMX8nIzN4qXfRpdvYQ4QhYRzv4Nkb/y6uGwaWQ/3fNG31e1C/WwoWmtX1OGemkPK/y+KDN XntH8URzel3IxusJBYGDLA9oY8wsCqJxEifK5NxpyGGZ1Dh6Jq/Vpq8mp2D8U1 X-Received: by 2002:aa7:9063:0:b0:845:e1a3:1076 with SMTP id d2e1a72fcca58-847c098898cmr9504500b3a.56.1783060664712; Thu, 02 Jul 2026 23:37:44 -0700 (PDT) Received: from localhost (KD036014041111.ppp-bb.dion.ne.jp. [36.14.41.111]) by smtp.gmail.com with ESMTPSA id d2e1a72fcca58-847e7adb4b0sm580444b3a.59.2026.07.02.23.37.43 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 02 Jul 2026 23:37:43 -0700 (PDT) Date: Fri, 03 Jul 2026 15:37:42 +0900 (JST) Message-Id: <20260703.153742.1355839543750682384.horikyota.ntt@gmail.com> To: pgsql-hackers@lists.postgresql.org Subject: Mark class_descr strings for translation From: Kyotaro Horiguchi User-Agent: Mew version 6.8 on Emacs 29.4 Mime-Version: 1.0 Content-Type: Multipart/Mixed; boundary="--Next_Part(Fri_Jul__3_15_37_42_2026_665)--" Content-Transfer-Encoding: 7bit List-Id: List-Help: List-Subscribe: List-Post: List-Owner: List-Archive: Archived-At: Precedence: bulk ----Next_Part(Fri_Jul__3_15_37_42_2026_665)-- Content-Type: Text/Plain; charset=iso-2022-jp Content-Transfer-Encoding: 7bit Hello, While working on the translation, I encountered the following message. pg_depend.c:809 > if (!HeapTupleIsValid(tuple)) > ereport(ERROR, > (errcode(ERRCODE_UNDEFINED_OBJECT), > errmsg("referenced %s was concurrently dropped", > get_object_class_descr(classId)))); As you can see, it is a user-facing message, which embeds the return value from get_object_class_descr(), which returns ObjectPropertyType.class_descr, which is described as "for internal error messages" in objectaddress.c. As a result, the resulting message in Japanese becomes rather unnatural. > 参照先の foreign-data wrapper は並行して削除されました The attached patch marks the class_descr strings for translation, so that the message can be translated. I'm not entirely sure whether this is the right direction, but since class_descr is already used in messages intended to be read by humans, even if they are not necessarily user-facing, it seems reasonable to me. With that change, the message above becomes: > 参照先の外部データラッパは並行して削除されました One concern I have is that this may be somewhat easy to overlook, since it requires remembering to wrap the return value in _() rather than translating a string literal. That said, I don't expect this pattern to be used very often, so I don't think it is a significant problem. By the way, I also noticed that we have two spellings, "foreign-data wrapper" and "foreign data wrapper". I looked through the documentation for the canonical spelling, but found both spellings used on the same page, so I couldn't determine which one is preferred. Regards, -- Kyotaro Horiguchi NTT Open Source Software Center ----Next_Part(Fri_Jul__3_15_37_42_2026_665)-- Content-Type: Text/X-Patch; charset=us-ascii Content-Transfer-Encoding: 7bit Content-Disposition: attachment; filename="v1-0001-Mark-object-class-descriptions-for-translation.patch" From eefafd614f171e07cb1ec57922bf7facbbf83a7c Mon Sep 17 00:00:00 2001 From: Kyotaro Horiguchi Date: Fri, 3 Jul 2026 15:06:04 +0900 Subject: [PATCH v1] Mark object class descriptions for translation ObjectPropertyType.class_descr was originally intended for internal error messages, but is now also used in a translated error message. Mark the object class descriptions for translation and translate the return value of get_object_class_descr(). --- src/backend/catalog/objectaddress.c | 88 ++++++++++++++--------------- src/backend/catalog/pg_depend.c | 2 +- 2 files changed, 45 insertions(+), 45 deletions(-) diff --git a/src/backend/catalog/objectaddress.c b/src/backend/catalog/objectaddress.c index af0e4703616..12dc76b712a 100644 --- a/src/backend/catalog/objectaddress.c +++ b/src/backend/catalog/objectaddress.c @@ -100,8 +100,8 @@ */ typedef struct { - const char *class_descr; /* string describing the catalog, for internal - * error messages */ + const char *class_descr; /* string describing the catalog, for error + * messages */ Oid class_oid; /* oid of catalog */ Oid oid_index_oid; /* oid of index on system oid column */ SysCacheIdentifier oid_catcache_id; /* id of catcache on system oid column */ @@ -124,7 +124,7 @@ typedef struct static const ObjectPropertyType ObjectProperty[] = { { - "access method", + gettext_noop("access method"), AccessMethodRelationId, AmOidIndexId, AMOID, @@ -138,7 +138,7 @@ static const ObjectPropertyType ObjectProperty[] = true }, { - "access method operator", + gettext_noop("access method operator"), AccessMethodOperatorRelationId, AccessMethodOperatorOidIndexId, SYSCACHEID_INVALID, @@ -152,7 +152,7 @@ static const ObjectPropertyType ObjectProperty[] = false }, { - "access method procedure", + gettext_noop("access method procedure"), AccessMethodProcedureRelationId, AccessMethodProcedureOidIndexId, SYSCACHEID_INVALID, @@ -166,7 +166,7 @@ static const ObjectPropertyType ObjectProperty[] = false }, { - "cast", + gettext_noop("cast"), CastRelationId, CastOidIndexId, SYSCACHEID_INVALID, @@ -180,7 +180,7 @@ static const ObjectPropertyType ObjectProperty[] = false }, { - "collation", + gettext_noop("collation"), CollationRelationId, CollationOidIndexId, COLLOID, @@ -194,7 +194,7 @@ static const ObjectPropertyType ObjectProperty[] = true }, { - "constraint", + gettext_noop("constraint"), ConstraintRelationId, ConstraintOidIndexId, CONSTROID, @@ -208,7 +208,7 @@ static const ObjectPropertyType ObjectProperty[] = false }, { - "conversion", + gettext_noop("conversion"), ConversionRelationId, ConversionOidIndexId, CONVOID, @@ -222,7 +222,7 @@ static const ObjectPropertyType ObjectProperty[] = true }, { - "database", + gettext_noop("database"), DatabaseRelationId, DatabaseOidIndexId, DATABASEOID, @@ -236,7 +236,7 @@ static const ObjectPropertyType ObjectProperty[] = true }, { - "default ACL", + gettext_noop("default ACL"), DefaultAclRelationId, DefaultAclOidIndexId, SYSCACHEID_INVALID, @@ -250,7 +250,7 @@ static const ObjectPropertyType ObjectProperty[] = false }, { - "extension", + gettext_noop("extension"), ExtensionRelationId, ExtensionOidIndexId, SYSCACHEID_INVALID, @@ -264,7 +264,7 @@ static const ObjectPropertyType ObjectProperty[] = true }, { - "foreign-data wrapper", + gettext_noop("foreign-data wrapper"), ForeignDataWrapperRelationId, ForeignDataWrapperOidIndexId, FOREIGNDATAWRAPPEROID, @@ -278,7 +278,7 @@ static const ObjectPropertyType ObjectProperty[] = true }, { - "foreign server", + gettext_noop("foreign server"), ForeignServerRelationId, ForeignServerOidIndexId, FOREIGNSERVEROID, @@ -292,7 +292,7 @@ static const ObjectPropertyType ObjectProperty[] = true }, { - "function", + gettext_noop("function"), ProcedureRelationId, ProcedureOidIndexId, PROCOID, @@ -306,7 +306,7 @@ static const ObjectPropertyType ObjectProperty[] = false }, { - "language", + gettext_noop("language"), LanguageRelationId, LanguageOidIndexId, LANGOID, @@ -320,7 +320,7 @@ static const ObjectPropertyType ObjectProperty[] = true }, { - "large object metadata", + gettext_noop("large object metadata"), LargeObjectMetadataRelationId, LargeObjectMetadataOidIndexId, SYSCACHEID_INVALID, @@ -334,7 +334,7 @@ static const ObjectPropertyType ObjectProperty[] = false }, { - "operator class", + gettext_noop("operator class"), OperatorClassRelationId, OpclassOidIndexId, CLAOID, @@ -348,7 +348,7 @@ static const ObjectPropertyType ObjectProperty[] = true }, { - "operator", + gettext_noop("operator"), OperatorRelationId, OperatorOidIndexId, OPEROID, @@ -362,7 +362,7 @@ static const ObjectPropertyType ObjectProperty[] = false }, { - "operator family", + gettext_noop("operator family"), OperatorFamilyRelationId, OpfamilyOidIndexId, OPFAMILYOID, @@ -376,7 +376,7 @@ static const ObjectPropertyType ObjectProperty[] = true }, { - "property graph element", + gettext_noop("property graph element"), PropgraphElementRelationId, PropgraphElementObjectIndexId, PROPGRAPHELOID, @@ -390,7 +390,7 @@ static const ObjectPropertyType ObjectProperty[] = false }, { - "property graph element label", + gettext_noop("property graph element label"), PropgraphElementLabelRelationId, PropgraphElementLabelObjectIndexId, -1, @@ -404,7 +404,7 @@ static const ObjectPropertyType ObjectProperty[] = false }, { - "property graph label", + gettext_noop("property graph label"), PropgraphLabelRelationId, PropgraphLabelObjectIndexId, PROPGRAPHLABELOID, @@ -418,7 +418,7 @@ static const ObjectPropertyType ObjectProperty[] = false }, { - "property graph label property", + gettext_noop("property graph label property"), PropgraphLabelPropertyRelationId, PropgraphLabelPropertyObjectIndexId, -1, @@ -432,7 +432,7 @@ static const ObjectPropertyType ObjectProperty[] = false }, { - "property graph property", + gettext_noop("property graph property"), PropgraphPropertyRelationId, PropgraphPropertyObjectIndexId, -1, @@ -446,7 +446,7 @@ static const ObjectPropertyType ObjectProperty[] = false }, { - "role", + gettext_noop("role"), AuthIdRelationId, AuthIdOidIndexId, AUTHOID, @@ -460,7 +460,7 @@ static const ObjectPropertyType ObjectProperty[] = true }, { - "role membership", + gettext_noop("role membership"), AuthMemRelationId, AuthMemOidIndexId, SYSCACHEID_INVALID, @@ -474,7 +474,7 @@ static const ObjectPropertyType ObjectProperty[] = true }, { - "rule", + gettext_noop("rule"), RewriteRelationId, RewriteOidIndexId, SYSCACHEID_INVALID, @@ -488,7 +488,7 @@ static const ObjectPropertyType ObjectProperty[] = false }, { - "schema", + gettext_noop("schema"), NamespaceRelationId, NamespaceOidIndexId, NAMESPACEOID, @@ -502,7 +502,7 @@ static const ObjectPropertyType ObjectProperty[] = true }, { - "relation", + gettext_noop("relation"), RelationRelationId, ClassOidIndexId, RELOID, @@ -516,7 +516,7 @@ static const ObjectPropertyType ObjectProperty[] = true }, { - "tablespace", + gettext_noop("tablespace"), TableSpaceRelationId, TablespaceOidIndexId, TABLESPACEOID, @@ -530,7 +530,7 @@ static const ObjectPropertyType ObjectProperty[] = true }, { - "transform", + gettext_noop("transform"), TransformRelationId, TransformOidIndexId, TRFOID, @@ -544,7 +544,7 @@ static const ObjectPropertyType ObjectProperty[] = false }, { - "trigger", + gettext_noop("trigger"), TriggerRelationId, TriggerOidIndexId, SYSCACHEID_INVALID, @@ -558,7 +558,7 @@ static const ObjectPropertyType ObjectProperty[] = false }, { - "policy", + gettext_noop("policy"), PolicyRelationId, PolicyOidIndexId, SYSCACHEID_INVALID, @@ -572,7 +572,7 @@ static const ObjectPropertyType ObjectProperty[] = false }, { - "event trigger", + gettext_noop("event trigger"), EventTriggerRelationId, EventTriggerOidIndexId, EVENTTRIGGEROID, @@ -586,7 +586,7 @@ static const ObjectPropertyType ObjectProperty[] = true }, { - "text search configuration", + gettext_noop("text search configuration"), TSConfigRelationId, TSConfigOidIndexId, TSCONFIGOID, @@ -600,7 +600,7 @@ static const ObjectPropertyType ObjectProperty[] = true }, { - "text search dictionary", + gettext_noop("text search dictionary"), TSDictionaryRelationId, TSDictionaryOidIndexId, TSDICTOID, @@ -614,7 +614,7 @@ static const ObjectPropertyType ObjectProperty[] = true }, { - "text search parser", + gettext_noop("text search parser"), TSParserRelationId, TSParserOidIndexId, TSPARSEROID, @@ -628,7 +628,7 @@ static const ObjectPropertyType ObjectProperty[] = true }, { - "text search template", + gettext_noop("text search template"), TSTemplateRelationId, TSTemplateOidIndexId, TSTEMPLATEOID, @@ -642,7 +642,7 @@ static const ObjectPropertyType ObjectProperty[] = true, }, { - "type", + gettext_noop("type"), TypeRelationId, TypeOidIndexId, TYPEOID, @@ -656,7 +656,7 @@ static const ObjectPropertyType ObjectProperty[] = true }, { - "publication", + gettext_noop("publication"), PublicationRelationId, PublicationObjectIndexId, PUBLICATIONOID, @@ -670,7 +670,7 @@ static const ObjectPropertyType ObjectProperty[] = true }, { - "subscription", + gettext_noop("subscription"), SubscriptionRelationId, SubscriptionObjectIndexId, SUBSCRIPTIONOID, @@ -684,7 +684,7 @@ static const ObjectPropertyType ObjectProperty[] = true }, { - "extended statistics", + gettext_noop("extended statistics"), StatisticExtRelationId, StatisticExtOidIndexId, STATEXTOID, @@ -698,7 +698,7 @@ static const ObjectPropertyType ObjectProperty[] = true }, { - "user mapping", + gettext_noop("user mapping"), UserMappingRelationId, UserMappingOidIndexId, USERMAPPINGOID, diff --git a/src/backend/catalog/pg_depend.c b/src/backend/catalog/pg_depend.c index 9a7a401aced..0d28d34412d 100644 --- a/src/backend/catalog/pg_depend.c +++ b/src/backend/catalog/pg_depend.c @@ -810,7 +810,7 @@ dependencyLockAndCheckObject(Oid classId, Oid objectId) ereport(ERROR, (errcode(ERRCODE_UNDEFINED_OBJECT), errmsg("referenced %s was concurrently dropped", - get_object_class_descr(classId)))); + _(get_object_class_descr(classId))))); systable_endscan(scan); table_close(rel, AccessShareLock); -- 2.52.0 ----Next_Part(Fri_Jul__3_15_37_42_2026_665)----