🎉
Omeka Sテーマの多言語化
はじめに
Omeka Sのテーマ開発において、多言語化の実装方法に関する日本語の情報は限られています。本記事では、Omeka Sのカスタムテーマを多言語対応させる具体的な手順と、実装時の注意点について解説します。
目次
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. トラブルシューティング
翻訳が反映されない場合のチェックリスト
-
theme.iniの確認
grep "has_translations" config/theme.ini # 出力: has_translations = "true"
-
MOファイルの確認
file language/ja.mo # 出力: GNU message catalog...
-
キャッシュのクリア
- ブラウザ:Ctrl+Shift+R(Windows/Linux)、Cmd+Shift+R(Mac)
- Docker使用時:コンテナを再起動
docker-compose restart
-
言語設定の確認
- Omeka S管理画面 → サイト設定 → 言語を「日本語」に設定
- ユーザー設定 → 言語を「日本語」に設定
デバッグ方法
// 現在の言語を確認
<?php echo $this->lang(); ?>
// 翻訳が機能しているか確認
<?php
$test = $this->translate('Test');
echo "Original: Test, Translated: $test";
?>
まとめ
Omeka Sテーマの多言語化は、以下の3つのステップで実現できます:
-
theme.ini
にhas_translations = "true"
を追加 -
language/
ディレクトリに翻訳ファイルを配置 - テンプレート内で
$translate()
関数を使用
Module.phpやmodule.config.phpは不要で、シンプルな設定で多言語化が可能です。
参考リンク
この記事は実際のOmeka Sテーマ開発経験に基づいて作成されました。バージョン4.1.0で動作確認済みです。
Discussion