メインコンテンツにスキップ

ArtinTech Solution

A Multilingual, Right-to-Left Newspaper Reader in Laravel

電子版を求める新聞の多くは、ベンガル語、ヒンディー語、ウルドゥー語、アラビア語で発行されています。ベンガル語の1面の上に英語のツールバーが並ぶべきではありません。Inkfold 1.1では、閲覧サイト全体をベンガル語、ヒンディー語、アラビア語に翻訳し、右から左のレイアウトにも対応しました。運営スタッフが使う編集画面は英語のままです。

表示される文字列はすべて1つの関数を通す

最初の作業はいちばん地味なものでした。公開サイトのすべての文字列をLaravelの __() に、複数形を trans_choice() に、日付をCarbonの translatedFormat() に通すようにしました。これで「Monday, 26 October」は別テンプレートなしで「সোমবার, 26 অক্টোবর」になります。翻訳は言語ごとのシンプルなJSONファイルで、英語の文をキーにしています。あとでフランス語やウルドゥー語を加えるなら、ファイルを1つコピーして値を訳すだけです。

言語の決め方

小さなミドルウェアが、リクエストごとに次の順で言語を決めます。セッションに保存された訪問者自身の選択、ログイン中の読者のアカウントに保存された言語、複数言語を提供している場合のブラウザの Accept-Language ヘッダー、そして最後にサイトの既定言語です。編集画面へのリクエストはこのミドルウェアを通りません。提供する言語は発行元が設定で選びます。

英語・ベンガル語・ヒンディー語・アラビア語を選べるInkfold編集画面の言語設定
編集部が提供言語と既定言語を選びます。

新聞は反転させずに右から左へ

各言語は設定に書字方向を持ち、レイアウトがそれをページの dir 属性に書き込みます。インターフェースの大半はそれだけで追従します。残りは専用のRTLルールが受け持ちます。サイドパネルが左右入れ替わり、前後の矢印が反転し、記事ウィンドウの「○面に続く」の表示が反対側に移ります。

意図的に反転させないものが1つあります。紙面そのものです。ベンガル語や英語の新聞は左から右に印刷されているので、周囲の画面が右から左に読まれても、ページ順と記事の位置は印刷どおりでなければなりません。紙面のコンテナは direction: ltr を保つので、クリックできる記事の座標は常に正確です。

アラビア語の右から左の画面で表示したInkfold電子版リーダー
画面はアラビア語、紙面は印刷どおり。

フォントは使用中の言語の分だけ

ベンガル文字、デーヴァナーガリー文字、アラビア文字には専用のフォントが必要です。すべてを全訪問者に読み込ませても重くなるだけなので、レイアウトは使用中の言語のNotoフォントだけを読み込み、CSS変数でフォントスタックに加えます。

翻訳漏れがあると失敗するテスト

翻訳は静かに古くなります。誰かがボタンを追加し、JSONファイルの更新を忘れるのです。現在は機能テストが閲覧サイトのテンプレートから翻訳対象の文字列を拾い出し、どれか1つでも言語ファイルに欠けていれば失敗します。このテストで意外な問題も見つかりました。「Pagination」というキーが、大文字と小文字を区別しないファイルシステム上でLaravel自身の pagination.php として解決され、配列が返っていたのです。翻訳ファイル名と同じキーは避けましょう。

ポイント

  • 公開テキストはすべて __() を通し、翻訳は原文をキーにしたJSONに置く。
  • 言語はセッション、アカウント、ブラウザ、既定値の順で決める。
  • 文書に dir を設定して必要なRTLルールを書き、印刷物はその方向のままにする。
  • 特殊な文字のフォントは使用中の言語だけ読み込み、文字列の欠落をテストする。

シリーズ前回はService Workerによるオフライン閲覧でした。Inkfoldのデモ の上部で言語を切り替えられます。ソフトウェアは Charming Theme で入手できます。

ベンガル語やアラビア語、複数言語に対応したLaravelやWordPressのサイトが必要ですか?ご相談ください — ArtinTech Solution は毎週のように多言語サイトを構築しています。

Share this article

コメントを残す

メールアドレスが公開されることはありません。 ※ が付いている欄は必須項目です