🎉

Omeka Sテーマの多言語化

に公開

はじめに

Omeka Sのテーマ開発において、多言語化の実装方法に関する日本語の情報は限られています。本記事では、Omeka Sのカスタムテーマを多言語対応させる具体的な手順と、実装時の注意点について解説します。

目次

  1. Omeka Sの翻訳システムの仕組み
  2. テーマの多言語化に必要なファイル
  3. ステップバイステップガイド
  4. よくある間違いと解決方法
  5. 実装例
  6. トラブルシューティング

1. Omeka Sの翻訳システムの仕組み

Omeka Sはgettextという標準的な翻訳システムを使用しています。このシステムでは:

  • .poファイル:人間が読み書きできる翻訳ソースファイル
  • .moファイル:コンパイル済みのバイナリファイル(実際に使用される)
  • $translate()関数:PHPテンプレート内で翻訳を適用

2. テーマの多言語化に必要なファイル

必要なディレクトリ構造

your-theme/
├── config/
│   └── theme.ini          # 重要:has_translations = "true"を追加
├── language/
│   ├── template.pot       # 翻訳テンプレート(オプション)
│   ├── ja.po             # 日本語翻訳ソース
│   └── ja.mo             # 日本語翻訳バイナリ
└── view/
    └── (各種テンプレートファイル)

3. ステップバイステップガイド

ステップ1:theme.iniの設定

config/theme.iniファイルの[info]セクションに以下の行を追加します:

[info]
name = "Your Theme Name"
version = "1.0.0"
author = "Your Name"
description = "Theme description"
omeka_version_constraint = "^4.1.0"
has_translations = "true"  # ← この行が重要!

⚠️ 重要: has_translations = "true"がないと、翻訳ファイルが読み込まれません。

ステップ2:翻訳ファイルの作成

2.1 POファイルの作成

language/ja.poを作成します:

msgid ""
msgstr ""
"Project-Id-Version: Your Theme Name\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2025-01-13 12:00+0900\n"
"PO-Revision-Date: 2025-01-13 12:00+0900\n"
"Last-Translator: Your Name\n"
"Language-Team: Japanese\n"
"Language: ja\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=1; plural=0;\n"

# ナビゲーション
msgid "Home"
msgstr "ホーム"

msgid "Browse"
msgstr "閲覧"

msgid "Search"
msgstr "検索"

# 検索結果
msgid "No Results Found"
msgstr "検索結果がありません"

msgid "%1$d %2$s"
msgstr "%1$d%2$s"

msgid "items"
msgstr "件のアイテム"

2.2 MOファイルのコンパイル

POファイルをMOファイルにコンパイルします:

# msgfmtコマンドのインストール(必要な場合)
# Mac: brew install gettext
# Ubuntu/Debian: sudo apt-get install gettext
# CentOS/RHEL: sudo yum install gettext

# コンパイル
msgfmt -o language/ja.mo language/ja.po

ステップ3:テンプレートでの翻訳の使用

PHPテンプレート内での使用

<?php
// 基本的な使用方法
echo $this->translate('Search');

// 変数を使う場合
$translate = $this->plugin('translate');
echo $translate('Search');

// sprintf形式での使用
echo sprintf($translate('%1$d %2$s'), $count, $translate('items'));
?>

実装例

<!-- view/search/results-header-footer.phtml -->
<div class="btn-group">
    <button type="button" aria-label="<?= $translate('Grid view') ?>">
        <span><?= $translate('Grid') ?></span>
    </button>
    <button type="button" aria-label="<?= $translate('List view') ?>">
        <span><?= $translate('List') ?></span>
    </button>
</div>

4. よくある間違いと解決方法

❌ 間違い1:Module.phpを作成する

// 不要!テーマには必要ありません
class Module extends AbstractModule { ... }

解決: テーマではModule.phpは不要です。has_translations = "true"だけで十分です。

❌ 間違い2:大文字・小文字の不一致

// POファイル
msgid "Grid"
msgstr "グリッド"

// PHPテンプレート
<?= $translate('grid') ?>  // 動作しない!

解決: 翻訳キーは大文字・小文字を区別します。必ず一致させてください。

❌ 間違い3:言語コードの間違い

# 間違い
language/ja_JP.po  # Omeka Sは ja_JP を認識しない場合がある

# 正解
language/ja.po     # シンプルな言語コードを使用

5. 実装例

言語バッジの多言語表示

<?php
// 言語コードを言語名に変換
$languageNames = [
    'en' => $translate('English'),
    'ja' => $translate('Japanese'),
    'fr' => $translate('French'),
    'de' => $translate('German'),
    'es' => $translate('Spanish'),
];

$languageDisplay = isset($languageNames[$valueLang]) 
    ? $languageNames[$valueLang] 
    : strtoupper($valueLang);
?>
<span class="badge bg-secondary"><?= $escape($languageDisplay) ?></span>

アイテム数の表示

<?php
// "7 items" → "7件のアイテム"
$count = 7;
$label = $translate('items');
echo sprintf($translate('%1$d %2$s'), $count, $label);
?>

6. トラブルシューティング

翻訳が反映されない場合のチェックリスト

  1. theme.iniの確認

    grep "has_translations" config/theme.ini
    # 出力: has_translations = "true"
    
  2. MOファイルの確認

    file language/ja.mo
    # 出力: GNU message catalog...
    
  3. キャッシュのクリア

    • ブラウザ:Ctrl+Shift+R(Windows/Linux)、Cmd+Shift+R(Mac)
    • Docker使用時:コンテナを再起動
    docker-compose restart
    
  4. 言語設定の確認

    • Omeka S管理画面 → サイト設定 → 言語を「日本語」に設定
    • ユーザー設定 → 言語を「日本語」に設定

デバッグ方法

// 現在の言語を確認
<?php echo $this->lang(); ?>

// 翻訳が機能しているか確認
<?php 
$test = $this->translate('Test');
echo "Original: Test, Translated: $test";
?>

まとめ

Omeka Sテーマの多言語化は、以下の3つのステップで実現できます:

  1. theme.inihas_translations = "true"を追加
  2. language/ディレクトリに翻訳ファイルを配置
  3. テンプレート内で$translate()関数を使用

Module.phpやmodule.config.phpは不要で、シンプルな設定で多言語化が可能です。

参考リンク


この記事は実際のOmeka Sテーマ開発経験に基づいて作成されました。バージョン4.1.0で動作確認済みです。

Discussion