多言語化できない部分を多言語化する [Bogo プラグイン]

An aerial view of a city at night

カテゴリー :

, ,

Bogo は多言語サイトを作るのに便利なプラグインです。しかし、Bogo でも多言語化できていない部分が幾つかあります。

その部分について、多言語表示するように修正しました。その内容について説明します。

なお、今回の修正は functions.php では対応できず、WordPress 本体や Yoast SEO プラグインのソースファイルを修正する方法で対処しました。もし今回の修正に取り組む場合には、WordPress 全体のバックアップを行ってから作業する事をお勧めします。

ページ言語切替

Bogo で多言語化できていない部分

Bogo プラグインで殆どの部分は多言語化できています。しかし、元となる言語の日本語が一部の部分に残っています。今回は、その部分を多言語化します。

具体的には、

  • サイトのキャッチフレーズ (Site Tagline) ブロック
  • トップページの <head> 内の <title> タグ
  • トップページの <head> 内の構造化データ (schema.org)

について、日本語表示になっている部分を多言語化します。

サイトのキャッチフレーズ (Site Tagline) ブロック

管理メニューの「言語 (Languages)」「テキストの翻訳 (Terms Translation)」の中に項目があるので置き換わってくれるものと思っていましたが、サイトのキャッチフレーズ (Site Tagline) ブロックの文章はページのロケールが変わっても自動で置き換わってくれません。

応急的に、サイトのキャッチフレーズブロックを使用せず、通常のテキストで入力したものを Block Visibility プラグインで言語に合わせて表示させていました。

今回はその原因を調べて、WordPress 本体のソースファイルを修正する事によって対処できました。

Diff
--- site-tagline.php.orig       2025-02-15 20:55:32.476074037 +0900
+++ site-tagline.php    2025-02-15 15:43:41.950994484 +0900
@@ -15,7 +15,12 @@
  * @return string The render.
  */
 function render_block_core_site_tagline( $attributes ) {
-       $site_tagline = get_bloginfo( 'description' );
+       /* 20250215 get_bloginfo -> bloginfo From */
+       ob_start();
+       bloginfo('description');
+       $site_tagline = ob_get_clean();
+       /* 20250215 get_bloginfo -> bloginfo End */
+       //$site_tagline = get_bloginfo( 'description' );
        if ( ! $site_tagline ) {
                return;
        }
wp-includes/blocks/site-tagline.php

サイトのキャッチフレーズが置き換わらない原因については、以下のページに記載されています。

bloginfo関数では翻訳後の値が、get_bloginfo関数では翻訳前の値が扱われることに注意しつつ、そのことを利用します。

サイトのキャッチフレーズの読み込みに get_bloginfo 関数を使用している場合には、多言語化された文章ではなくオリジナルの (今回であれば日本語の) 文章が返されます。その為、サイトのキャッチフレーズブロックの表示が多言語に置き換わりませんでした。

上記の patch は、site-tagline.php の get_bloginfo(‘descripsion’) で読み込んでいる部分を、bloginfo(‘description’) に置き換えます。そのまま置き換えは出来ないので、ob_start() と ob_get_clean() を使用して文字列を受け取っています。

この patch を当てる事によって、サイトのキャッチフレーズブロックが多言語化されます。

なお、このブログのサイト名は各言語共に英語表記ですので、今回は対処しませんでした。同様の方法で対処できるはずです。

<title> タグ及び構造化データの不具合

キャッチフレーズブロックを対処すれば、見た目上は多言語化された状態となります。

しかし、Chrome デベロッパーツールで HTML を見ると、所々に日本語が残っていました。

一つは <title> タグです。どの言語でも日本語が表示されていました。

HTML
<title>Clairvoyance Power - ~千里の道も一歩から~</title>
<title> tag

もう一つは構造化データです。データの JSON ファイル内で一部が日本語になっていました。

JSON
"@graph": [
    {
        "@type": "CollectionPage",
        "@id": "https://clairvoyance-power.com/",
        "url": "https://clairvoyance-power.com/",
        "name": "Clairvoyance Power - ~千里の道も一歩から~",
        "isPartOf": {
            "@id": "https://clairvoyance-power.com/#website"
        },
        "about": {
            "@id": "https://clairvoyance-power.com/#/schema/person/fb4fd70540149e2fdea9e6ae8eabab1e"
        },
        "breadcrumb": {
            "@id": "https://clairvoyance-power.com/#breadcrumb"
        },
        "inLanguage": "zh-Hans"
    },
<script type=”application/ld+json” class=”yoast-schema-graph”>
JSON
{
    "@type": "WebSite",
    "@id": "https://clairvoyance-power.com/#website",
    "url": "https://clairvoyance-power.com/",
    "name": "Clairvoyance Power",
    "description": "~千里の道も一歩から~",
    ... snip ...
    "inLanguage": "zh-Hans"
},
<script type=”application/ld+json” class=”yoast-schema-graph”>

38行目を見ると言語が簡体中国語になっている事が分かります。本来なら中国語のサイトのキャッチフレーズを表示して欲しいのですが日本語が表示されています。

<title> タグ及び構造化データの対処

これらの部分は、Yoast SEO プラグインで出力しています。前記のページに Yoast SEO プラグインでの対処方法が書かれていますが、その内容では構造化データの部分は多言語に置き換わりませんでした。

今回は、Yoast SEO プラグインのソースファイルを修正して対応します。3箇所あります。get_bloginfo() の代わりに bloginfo() を使うように修正しています。

Diff
--- class-wpseo-replace-vars.php.orig   2025-02-15 20:41:57.707080317 +0900
+++ class-wpseo-replace-vars.php        2025-02-15 20:27:59.292149230 +0900
@@ -495,8 +495,13 @@
                static $replacement;

                if ( ! isset( $replacement ) ) {
+                       /* 20250215 get_bloginfo -> bloginfo */
+                       ob_start();
+                       bloginfo('description');
+                       $desc = ob_get_clean();
                        $description = wp_strip_all_tags( $desc );
-                       $description = wp_strip_all_tags( get_bloginfo( 'description' ) );
+                       //$description = wp_strip_all_tags( get_bloginfo( 'description' ) );
+                       /* 20250215 get_bloginfo -> bloginfo */
                        if ( $description !== '' ) {
                                $replacement = $description;
                        }
wp-content/plugins/wordpress-seo/inc/class-wpseo-replace-vars.php
Diff
--- website.php.orig    2025-02-15 20:47:52.567204942 +0900
+++ website.php 2025-02-15 20:26:47.784325248 +0900
@@ -24,13 +24,19 @@
         * @return array Website data blob.
         */
        public function generate() {
+               /* 20250215 get_bloginfo -> bloginfo */
+               ob_start();
+               bloginfo('description');
+               $desc = ob_get_clean();
                $data = [
                        '@type'       => 'WebSite',
                        '@id'         => $this->context->site_url . Schema_IDs::WEBSITE_HASH,
                        'url'         => $this->context->site_url,
                        'name'        => $this->helpers->schema->html->smart_strip_tags( $this->context->site_name ),
-                       'description' => \get_bloginfo( 'description' ),
+                       'description' => $desc,
+               //      'description' => \get_bloginfo( 'description' ),
                ];
+               /* 20250215 get_bloginfo -> bloginfo */

                if ( $this->context->site_represents_reference ) {
                        $data['publisher'] = $this->context->site_represents_reference;
wp-content/plugins/wordpress-seo/src/generators/schema/website.php
Diff
--- rss-footer-embed.php.orig   2025-02-15 20:52:54.467462231 +0900
+++ rss-footer-embed.php        2025-02-15 20:16:14.979891023 +0900
@@ -165,11 +165,17 @@
                        $author_link = \sprintf( $link_template, \esc_url( \get_author_posts_url( $post->post_author ) ), \esc_html( \get_the_author() ) );
                }

+               /* 20250215 get_bloginfo -> bloginfo */
+               ob_start();
+               bloginfo('description');
+               $desc = ob_get_clean();
+
                return [
                        '%%AUTHORLINK%%'   => $author_link,
                        '%%POSTLINK%%'     => \sprintf( $link_template, \esc_url( \get_permalink() ), \esc_html( \get_the_title() ) ),
                        '%%BLOGLINK%%'     => \sprintf( $link_template, \esc_url( \get_bloginfo( 'url' ) ), \esc_html( \get_bloginfo( 'name' ) ) ),
-                       '%%BLOGDESCLINK%%' => \sprintf( $link_template, \esc_url( \get_bloginfo( 'url' ) ), \esc_html( \get_bloginfo( 'name' ) ) . ' - ' . \esc_html( \get_bloginfo( 'description' ) ) ),
+               //      '%%BLOGDESCLINK%%' => \sprintf( $link_template, \esc_url( \get_bloginfo( 'url' ) ), \esc_html( \get_bloginfo( 'name' ) ) . ' - ' . \esc_html( \get_bloginfo( 'description' ) ) ),
+                       '%%BLOGDESCLINK%%' => \sprintf( $link_template, \esc_url( \get_bloginfo( 'url' ) ), \esc_html( \get_bloginfo( 'name' ) ) . ' - ' . \esc_html( $desc ) ),
                ];
        }
wp-content/plugins/wordpress-seo/src/integrations/front-end/rss-footer-embed.php

<title> タグ及び構造化データの対処結果

Yoast SEO のソースファイルを修正する事により、<title> タグと構造化データの部分が多言語化されました。

HTML
<title>Clairvoyance Power - 千里之行,始于足下 -</title>
<title>
JSON
"@graph": [
    {
        "@type": "CollectionPage",
        "@id": "https://clairvoyance-power.com/",
        "url": "https://clairvoyance-power.com/",
        "name": "Clairvoyance Power - 千里之行,始于足下 -",
        "isPartOf": {
            "@id": "https://clairvoyance-power.com/#website"
        },
        "about": {
            "@id": "https://clairvoyance-power.com/#/schema/person/fb4fd70540149e2fdea9e6ae8eabab1e"
        },
        "breadcrumb": {
            "@id": "https://clairvoyance-power.com/#breadcrumb"
        },
        "inLanguage": "zh-Hans"
    },
<script type=”application/ld+json” class=”yoast-schema-graph”>
JSON
{
    "@type": "WebSite",
    "@id": "https://clairvoyance-power.com/#website",
    "url": "https://clairvoyance-power.com/",
    "name": "Clairvoyance Power",
    "description": "- 千里之行,始于足下 -",
    ... snip ...
    "inLanguage": "zh-Hans"
},
<script type=”application/ld+json” class=”yoast-schema-graph”>

簡体中国語の場合には、その言語のサイトのキャッチフレーズが表示されています。

結び

この記事では、Bogo プラグインでも多言語化されない部分について多言語化しました。

  • サイトのキャッチフレーズ (Site Tagline) ブロック
  • トップページの <head><title> タグ
  • トップページの <head> の構造化データ (schema.org)

個別投稿ページは多言語化されていましたので対処不要です。

サイト名についても多言語化している場合には反映されません。今回と同じ方法で対処できるはずです。

このサイトを立ち上げて多言語化に取り組んでからずっと疑問に感じていた事を解決できました。とはいえ、ソースファイルの修正はアップデートで元に戻ってしまいます。

今後は、別の対処方法が無いか探してみます。

Comments

“多言語化できない部分を多言語化する [Bogo プラグイン]” への1件のコメント

  1. […] 多言語化できない部分を多言語化する [Bogo プラグイン] | Clairvoyance PowerBogo でも多言語化できない部分を多言語化しました。Tagline と title タグと構造化データです。clairvoyance-power.com […]

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です