PostgreSQL Challenge Joining Multiple Tables Into One Row In Stored Procedure/Function

I am facing a little challenge, which I don’t know how to elegantly solve using DB only.

I have two tables , let’s say

CREATE TABLE "article" (
	"created" TIMESTAMPTZ NOT NULL DEFAULT 'now()',
	"created_by" TEXT NOT NULL DEFAULT 'unknown',
	"modified" TIMESTAMPTZ NOT NULL DEFAULT 'now()',
	"modified_by" TEXT NOT NULL DEFAULT 'unknown',
	"article_id" INTEGER NOT NULL,
	"category_id" INTEGER NULL DEFAULT NULL,
	"gallery_id" INTEGER NULL DEFAULT NULL,
	PRIMARY KEY ("article_id")
);
CREATE TABLE "article_content" (
	"created" TIMESTAMPTZ NOT NULL DEFAULT 'now()',
	"created_by" TEXT NOT NULL DEFAULT 'unknown',
	"modified" TIMESTAMPTZ NOT NULL DEFAULT 'now()',
	"modified_by" TEXT NOT NULL DEFAULT 'unknown',
	"ac_id" INTEGER NOT NULL,
	"language_id" INTEGER NULL DEFAULT NULL,
	"article_id" INTEGER NULL DEFAULT NULL,
	"slug" TEXT NULL DEFAULT NULL,
	"title" TEXT NOT NULL,
	"content" TEXT NULL DEFAULT NULL,
	"keywords" TEXT NULL DEFAULT NULL,
	"description" TEXT NULL DEFAULT NULL,
	"gallery_id" INTEGER NULL DEFAULT NULL,
	"add_content" JSONB NULL DEFAULT NULL,
	PRIMARY KEY ("ac_id"),
	CONSTRAINT "article_content_state_code_fkey" FOREIGN KEY ("state_code") REFERENCES "const"."article_state" ("code") ON UPDATE NO ACTION ON DELETE NO ACTION
);
CREATE TABLE "language" (
	"language_id" INTEGER NOT NULL,
	"code" TEXT NOT NULL,
	"name" TEXT NOT NULL,
	PRIMARY KEY ("language_id"),
	UNIQUE INDEX "language_code_key" ("code"),
	CONSTRAINT "language_code_check" CHECK (((length(code) = 5)))
);

When a user creates an article, it has data that’s universal for all languages such as gallery, documents, files, category, and etc.
But then there are data that are language-specific such as title, description, keywords, and etc.
User can create an article, which is , for example, only in English, but then there can be articles, which are translated into multiple languages.

In admin, I want to show the list of all articles in a table that looks like this:

article_id | cz_title | en_title | de_title
1 | Novinka-1 | News-1 | Aktualiten-1
2 | Novinka-2 | - | -
3 | - | News-3 | -

Is there a way to get a result from DB that looks like this

article_id | gallery_id | ...other universal columns | cz_title | en_title | de_title | {LANGUAGE}_{TITLE}
 
Where {LANGUAGE} is based on language_id from the table language
Where {TITLE} is based on title from the table article_content

Or is there any smarter way of doing this?

I couldn’t think of anything better

select  a.created
       ,a.created_by
       ,a.modified
       ,a.modified_by
       ,a.article_id
       ,a.category_id
       ,a.article_type_code
       ,a.gallery_id
       ,a.article_code
       ,(
            select json_object_agg(d.language_id, row_to_json(d))
            from (
                        select *
                        from article_content ac
                        where ac.article_id = a.article_id
                    ) d
        ) as article_content
    from article a