最近、多言語サイト作ってばかりの Katz です。

おそらく、今後もいろいろ TIPS が出て来るであろうと思いますので、Part 1 と命名しました。

弊社では、翻訳ソリューションの提供や、多言語サイト制作の構築サポートの提供も行っております。

 

さて、concrete5 で多言語サイトを制作するにあたって、ちょっと自分でもハマったことがあり、それは他の人でもハマりそうだったので、それを共有いたします。テンプレートの実装と、翻訳ファイルについてです。

このメモは、 concrete5 サイトの多言語の基本がわかっている人向け、サイトのテンプレート制作や、多言語の設定を行う人向けに書いています。

この事象は 5.7.5.9 で確認しました。

 

前提条件

サイト構成

日本語トップ
┣ 日本語 サブページ
┃ ┣ 日本語 サブページ
・・・
┃ ┗ 日本語 サブページ
┣ 日本語 サブページ
・・・
┣ 英語トップ
┃ ┣ 英語 サブページ
┃ ┣ 英語 サブページ
・・・
┃ ┗ 英語 サブページ
┗ 中国語 トップ
   ┣ 中国語 サブページ
   ┣ 中国語 サブページ
・・・
   ┗ 中国語 サブページ

  • 日本語トップページはルート
  • 英語・中国語トップは第1階層に設置
  • 第2階層には日本語ページの第1階層ページも混在
  • 日本語と英語・中国語は階層レベルが変わる

concrete5 既知の仕様や追加カスタマイズ

  • ページ一斉コピー機能が使えない
  • 言語において階層レベルが一緒ではないので、階層レベルでなにかするときは追加カスタマイズが必要
    • 例:パンくずを表示させる時、「トップ」のリンク先をどう表示するか
  • concrete5 は英語ベース。日本語文字列をハードコーディングして表示していた場合は、その文字列を英語ベースに変更する必要あり

今回の多言語でハマったこと3つ

では、concrete5 多言語化でハマったことを共有します。

 

1: トピック名の表示で多言語表示のバグ

concrete5.7.5.9 まで、ちょっとしたミスが有り、正常に表示されていませんでした。

5.7.5.9 以降のバージョンでは修正されていますが、5.7.5.9 以前の場合は

getAttribute('【ページ属性ハンドル】'); //ページリストの時は $c が $page
$topic = $topic[0]->treeNodeTopicName;
echo tc('TopicName', $topic);
?>

てな感じで、tc() 関数を使って、TopicName の翻訳を使う支持をする必要があります。
そして、v8 では正常に翻訳された文字列が出力されるので、
** V8 以降にアップグレードした後であれば **
echo tc('TopicName', $topic);echo $topic; に戻してやってもいいです

 

2: 重複した文字列に注意

concrete5 では gettext と呼ばれる、メジャーな翻訳システムをベースにした ZendTransaltion が採用しています。

.po ファイルというテキストファイルで翻訳データを入力し、.mo という機械語にコンパイルされたファイルを生成し高速に翻訳を行います。

ベースとなる文字列に対応する翻訳先の文字列を検索し、それを表示するというものです。

しかし、欠点は、同じ文字列をベースに他の文字列に翻訳することが出来ません。

今回は「Company」という文字列が引っかかってしまいました!

Company だと、concrete5 では「会社」という訳文がすでに登録されています。

今回関わったとあるサイトで、ナビゲーション部分で、英語では「Company」だったのが、日本語では「会社情報」という文字列になっていました。

この「Company」の翻訳文は、特色 (Testimonial) ブロックで使用されています。しかし、この関わったサイトは特色ブロックは使用しないことになったので、セーフ。

下記の手順で、コアの日本語ファイルを書き換え、元のファイルを削除しました。

 

  • concrete5 の Translation GitHub から、ja_JP.mo ファイルを取得。「core-dev-57」フォルダに 5.7 系の最新版が入っています。一旦すべてのレポジトリZIPファイルを緑色のボタンからダウンロードしています。
  • 「core-dev-57」フォルダのja_JP.po を取得して
  • /application/languages/ja_JP/LC_MESSAGES/messages.po として保存
  • 一般的なテキストエディタを使って削除したい文字列の行を手動で削除
  • 念のために元の messages.mo をバックアップ保存
  • PoEdit ツール や Gettext シェルを使用して messages.mo ファイルを上書き生成。
    • PoEdit を使うとデフォルトでファイルを開いて保存するだけで mo ファイルを生成してくれるので便利
  • 再生成した messages.mo ファイルを concrete5 にアップロードして保存
  • concrete5 の、管理画面 - システムと設定 - 最適化 - キャッシュをクリア からキャッシュをクリア

3: トップ階層では、翻訳インターフェースの文字列が使えない

concrete5 では、/application/ 配下の翻訳可能な文字列を一斉にスキャンし、concrete5 の管理画面で翻訳文を入力すると多言語化してくれるという、PoEdit などのソフトウエア要らずで対応できる機能がついています。

この機能では、/application/languages/site/ディレクトリ以下に、po と mo ファイルを自動生成

しかし、上記、前提条件で、日本語サイトがトップディレクトリに存在してしまっていると、なぜか /application/languages/site/ の翻訳データを読みに行かなくなりました。

しかし、/application/languages/ja_JP/LC_MESSAGES/messages.mo のコアの日本語翻訳ファイルのデータは読みに行っていたので、こちらに追加翻訳を入れることにします。

上記で生成した テキストエディタで/application/languages/site/ja_JP.po を開き、/application/languages/ja_JP/LC_MESSAGES/messages.po に追加された翻訳を部分をコピペします。そして PoEdit などで /application/languages/ja_JP/LC_MESSAGES/messages.mo ファイルを生成し、サーバーにアップ。concrete5 のキャッシュをクリアしました。

 

以上、concrete5 多言語化でハマった3つのことでした。

この事象は 5.7.5.9 で確認しました。