OneThird CMSでは、2つの多国語対応の方法を用意しています
一つは、多国語対応プラグインを利用する方法です
多国語対応プラグインは、v1.2xまで標準プラグインとして同梱されていましたが、v1.3x以降、拡張プラグインとなりました
多国語対応プラグインは、無制限の言語数に対応しています
利用するには、以下のコードスニペットを/files/1/plugin/plugin.phpに追加してください
$params['prefix_list'] = array('en'); // ex. array('en','jp',...) $plugin_ar[ LANG_PAGE_ID ] = array( 'selector' => "multi_language" , 'title' => "multi language page" , 'add_page' => true , 'php' => "multi_language" ); $plugin_ar[ LANG_DATA_ID ] = array( 'selector' => "multi_language" , 'php' => "multi_language" , 'static' => array("p{page}.html","en/p{page}.html") );
download : multi_language.zip
利用するには、多国語対応したいページのページタイプを通常の1番から185番に変更してください
しかし多国語対応には多額の翻訳費用がかかり、実務ベースでは通常英語ページと日本語ページのに言語
多くても3言語程度となっています
そこで、もっと簡単なもう一つの方法を推奨しています
もう一つの方法は、ページ内のメタデータに翻訳情報を保存する方法です
以下のコードスニペットを/files/1/plugin/plugin.phpに追加することにより簡単に多国語ページ変更することができます
$params['prefix_list'] = array('en'); // ex. array('en','jp',...) $params['hook']['after_read_page'][] = 'after_read_page_multi_language'; function after_read_page_multi_language(&$page_ar) { global $html,$params,$ut; $lang = trim($params['url_prefix'],' /'); $edit_mode = isset($_GET['mode']) && $_GET['mode'] == 'edit'; $k = array_search($lang,$params['prefix_list']); if ($k !== false) { if (isset($page_ar['meta']['lang'][$lang]['contents'])) { $page_ar['contents'] = $page_ar['meta']['lang'][$lang]['contents']; } else { if (!$edit_mode) { $page_ar['contents'] = "<p style='color:red'>This page has not been translated yet.</p>".$page_ar['contents']; } } if (isset($page_ar['meta']['lang'][$lang]['title'])) { $page_ar['title'] = $page_ar['meta']['lang'][$lang]['title']; } $params['hook']['before_modified'][] = 'before_modified_page_multi_language'; } else { if (check_rights() && isset($page_ar['id'])) { $params['add-blockmenu'][] = "<input type='button' value='eng' class='onethird-button mini' onclick='location.href=\"{$ut->link($page_ar['id'],"prefix:en/")}\"' />"; } } } function before_modified_page_multi_language(&$new_ar) { global $params,$ut; if (isset($_POST['draft'])) { return true; } $lang = trim($params['url_prefix'],' /'); $new_ar['meta']['lang'][$lang]['contents'] = $new_ar['contents']; unset($new_ar['contents']); $new_ar['meta']['lang'][$lang]['title'] = $new_ar['title']; unset($new_ar['title']); $new_ar['metadata'] = serialize64($new_ar['meta']); unset($new_ar['meta']); if (mod_data_items($new_ar)) { if (isset($params['top_page'])) { header("Location: {$ut->link()}"); } else { if ($new_ar['block_type'] == 5) { header("Location: {$ut->link($new_ar['link'])}"); } else { header("Location: {$ut->link($new_ar['id'])}"); } } exit(); } exit_proc(400, 'Save-Error'); }
使用するには、対応したい言語一覧を、$params['prefix_list']にprefixを記載し、URLに$params['prefix_list']に記載したprefixを含めアクセスしてください
翻訳がある場合は、翻訳が表示されない場合は、翻訳がない旨の警告文と日本語ページが表示されます
編集すると、その言語のデータが編集できます
多国語対応プラグインでは、対応したいページタイプを全て変更する必要がありますが、この方法ですと英語翻訳を追加したいページだけ英語表記にする事ができます
ただしこの方法では、ページ内メタデータを利用しているため、極端に文章量が多い場合や、メタ情報に入りきらない量の多国語に対応することができません
また、メタデータを利用しているため通常のページ内検索では検索にかからないという欠点もあります
ですが、三ヶ国語程度の通常文章量であれば問題無いと思いますし、サイト内検索を使用しない場合は問題ありません
(サイト内検索が必要な場合は、メタデータを対象にしたページ内検索プラグインを利用することができます)
各リンクへのリンク先自動調整について
OneThird CMSでは、内部リンクは全てタグ($linkタグまたは$ut->linkタグ)で記載するルールとなっています
$linkタグまたは、$ut->linkを利用していれば、英語ページからの各ページヘのリンクは自動調整されます
例:
http://test.com/sample1.html 内に http://test.com/sample2.html へリンクされている場合
http://test.com/en/sample1.html を開いた場合
http://test.com/sample2.html は 自動的に http://test.com/en/sample2.html に書き換えられる
上記方法は、多国語プラグインのように翻訳対象のページを個別に作成しなくても一括で行うことができます
しかし翻訳に際しては、個別に翻訳を行う必要があり、非常に面倒です
そこで、Google翻訳機能を取り込みもっと簡単に手間を掛けずに翻訳するすることができます
本サイトでも採用している方法です
OneThird CMSでは、SEO対策として本来のページURL以外でアクセスされた場合自動的にカノニカル設定を行います
ところが、英語対応ページをオリジナルのページと考え日本語ページのカノニカルを貼るか英語ページのカノニカルを貼るか微妙なところです
OneThird CMSではなにもしないと、英語ページのURLは日本語ページのカノニカルを設定します
これをやりたくない場合は以下の様なコードを追加してください
$params['hook']['before_expand'][] = "multi_language_canonical"; function multi_language_canonical() { global $params,$ut; if ($params['url_prefix'] == 'en') { $params['canonical'] = $ut->link($params['page']['id'],'prefix:en'); } }