皆さま、いかがお過ごしでしょうか。歌乃です。

当サイトは、たまに複数言語(と言っても英語と日本語だけ)で記事を掲載しています。

これとか、https://www.mayonakanouta.com/en/blog/windows-phone-uninstall
これとかね、https://www.mayonakanouta.com/en/blog/steam-vr-home

当サイトを構築しているGravというCMSはもともと多言語に対応したCMSなのですが、所謂「かゆいところに手が届かない」パターンが存在します。


多言語対応基本

サイトの設定で多言語に対応(言語を複数指定する、例えば en, ja など)させた場合、管理画面のページ編集で言語を選択できるようになります。

通常は日本語で記事を書くと思いますが、書いた記事を作成したい言語(英語など)で保存すると、同じ内容の(日本語の)記事が作成したい言語のページとして新規保存されます。

あとは記事の内容やタイトル(メタタグなどもあればそちらも)を翻訳して保存すればOKです。


多言語対応初心者向け

まずは簡単なところから。

Gravの各プラグインやテーマファイルには languages.yaml というファイルが存在します。

grav-multilanguage-01

中身は画像の通り対応する定数に各言語のTEXTを記述する形になっています。

日本語訳が存在しない場合は ja: セクションを追加することで(サイトの多言語化が有効になっていれば)日本語に対応させることができます。

以下のような感じです。

ja:
    THEME_LEARN2_GITHUB_EDIT_THIS_PAGE: このページを編集
    THEME_LEARN2_GITHUB_NOTE: 不具合を見つけましたか?このドキュメントを改善できると思いますか?
    THEME_LEARN2_CLEAR_HISTORY: 履歴消去
    THEME_LEARN2_BUILT_WITH_GRAV: Built with <a href="http://getgrav.org">Grav</a> - The Modern Flat File CMS
    THEME_LEARN2_SEARCH_DOCUMENTATION: 見出しの検索
en:
    THEME_LEARN2_GITHUB_EDIT_THIS_PAGE: edit this page
    THEME_LEARN2_GITHUB_NOTE: Found errors? Think you can improve this documentation?
    THEME_LEARN2_CLEAR_HISTORY: Clear History
    THEME_LEARN2_BUILT_WITH_GRAV: Built with <a href="http://getgrav.org">Grav</a> - The Modern Flat File CMS
    THEME_LEARN2_SEARCH_DOCUMENTATION: Search Documentation
cn:
    THEME_LEARN2_GITHUB_EDIT_THIS_PAGE: 编辑此页
    THEME_LEARN2_GITHUB_NOTE: 发现错误?请帮忙改进,谢谢!
~~~

上記の場合(当サイトの場合)、日本語がデフォルト言語になっているため一番上に記述していますが、英語がデフォルトの言語(通常はこちら)の場合は en: セクションの下に ja: セクションを置いてください。


多言語対応中級者向け

つぎはちょっとわかりにくいです。

サイトのタイトルを多言語化したい場合です。

サイトタイトルのデータは user > config > site.yaml に保存(記述)されています。

site.yaml を編集すればサイトタイトルは変わりますが、多言語対応にはなりません。


言語ファイルの上書き

こういった場合は、user ディレクトリの配下に「languages」ディレクトリを追加し、その中に「languages.yaml」ファイルを作成して、言語をオーバーライドします。

プラグインやテーマと同じ仕様ですね。

このファイルの中に必要な定数(変数)を記述します。

ja:
  site:
    title: 真夜中の歌声
en:
  site:
    title: Midnight Melody

ここで注意が必要なのは、設定ファイルに書かれた定数(変数)そのままではなく、テンプレート内で使用される定数(変数)の形に合わせて記述するという点です。

サイトタイトルはテンプレート内で「site.title」として呼び出されているので、設定ファイルに展開する場合は上記のように「ja: site: title: タイトル内容」と記述する必要があります。

Twigテンプレートを修正(|t フィルターを適用)

さらに、テンプレート内では変数がそのまま使用されていて、多言語対応になっていない場合があるので、そちらも確認・修正が必要です。

~~~
    <title>{% if header.title %}{{ header.title }} | {% endif %}{{ site.title }}</title>
    # 以下のように修正する
    <title>{% if header.title %}{{ header.title }} | {% endif %}{{ "site.title"|t }}</title>
~~~    

Gravが用意している |t Twig フィルターを使用して翻訳を実現します。


多言語対応上級者向け

初級向け、中級向けを総合した方法です。

翻訳したいTEXT部分がテンプレートに埋め込みだった場合などはこの方法を使用します。


言語ファイルに定数を追加する

language設定ファイルに新しい定数(変数)を追加します。定数は他と被っていないなら自由に命名していいと思います。

ja:
    THEME_LEARN2_GITHUB_EDIT_THIS_PAGE: このページを編集
    THEME_LEARN2_GITHUB_NOTE: 不具合を見つけましたか?このドキュメントを改善できると思いますか?
    THEME_LEARN2_CLEAR_HISTORY: 履歴消去
    THEME_LEARN2_BUILT_WITH_GRAV: Built with <a href="http://getgrav.org">Grav</a> - The Modern Flat File CMS
    THEME_LEARN2_SEARCH_DOCUMENTATION: 見出しの検索
# 新しい定数を追加する
    THEME_LEARN2_DOC_NEXT: 次の記事
    THEME_LEARN2_DOC_PRIOR: 前の記事
    THEME_LEARN2_CONTINUE: 続きを読む...
en:
    THEME_LEARN2_GITHUB_EDIT_THIS_PAGE: edit this page
    THEME_LEARN2_GITHUB_NOTE: Found errors? Think you can improve this documentation?
    THEME_LEARN2_CLEAR_HISTORY: Clear History
    THEME_LEARN2_BUILT_WITH_GRAV: Built with <a href="http://getgrav.org">Grav</a> - The Modern Flat File CMS
    THEME_LEARN2_SEARCH_DOCUMENTATION: Search Documentation
# 対応する(表示したい)言語すべてで、設定が必要
    THEME_LEARN2_DOC_NEXT: Next document
    THEME_LEARN2_DOC_PRIOR: Prior document
    THEME_LEARN2_CONTINUE: Continue Reading...
cn:
    THEME_LEARN2_GITHUB_EDIT_THIS_PAGE: 编辑此页
    THEME_LEARN2_GITHUB_NOTE: 发现错误?请帮忙改进,谢谢!
~~~


Twigテンプレートを対応させる

翻訳したいTEXTが埋め込まれている部分を定数に置き換えます。

~~~
    <div class="pagesibling">
        {% if not page.isFirst %}
            <a class="anext" href="{{ page.nextSibling.url }}"><i class="fa fa-chevron-left"></i>Next post</a>
            // 埋め込まれた文字列部分を定数に置き換える。|t フィルターを忘れずに。
            <a class="anext" href="{{ page.nextSibling.url }}"><i class="fa fa-chevron-left"></i>{{ "THEME_LEARN2_DOC_NEXT"|t }}</a>
        {% endif %}
~~~

これで、言語を切り替えた際にテンプレート内の文字列が置き換わるようになります。

該当する文字列の存在するテンプレートすべてでこの作業をおこなう必要があります



ちゃんと翻訳(意味の通る文章に)できているかは永遠の謎 ( ゚Д゚)

Post If you feel like it, I would be happy if you could post it.