実装Read this article in English

日本語の改行処理 — 分かち書きの発想はそのまま使えない

英語向けに作られたテキスト折り返しは、スペースを単語の区切りとして使い、行の幅に収まる単語まで詰めて次の単語で改行します。日本語の文にはその区切りとなるスペースがそもそも存在しません。この前提の違いに気づかないまま実装されたUIは、日本語テキストが1つの巨大な「単語」として扱われて折り返しがまったく起きず、コンテナの外にはみ出し続けるか、逆にスペースが1つもないので毎文字ごとに強制的に切られ、禁則を無視した崩れた改行になります。

禁則処理という文字単位のルール

日本語の正しい折り返しは、単語ではなく文字を単位に行い、そこに禁則処理(禁則処理)と呼ばれる規則を適用します。行頭に来てはいけない文字と、行末に来てはいけない文字が、それぞれ決まっています。

  • 行頭禁則 — 句読点(、。)、閉じ括弧類、促音や拗音などの小書きの仮名(っ・ゃ・ゅ・ょ など)、長音記号(ー)といった文字は、行の先頭に来てはならない。前の行の末尾に送り込む(ぶら下げる)か、直前の文字と一緒に折り返す。
  • 行末禁則 — 開き括弧類は、行の末尾に来てはならない。次の行の先頭に送る。

なぜ手動改行は翻訳後に壊れるか

英語話者の開発者は、見た目のよい位置に手動で改行(`\n`)を入れたくなりがちです。ダイアログの2行目がちょうど良い位置で切れるように、というような理由で。しかしこの改行位置は英語の語順と文の長さに合わせて選ばれたものです。翻訳が入ると、語順も文の長さもまったく変わるため、元の改行位置には意味がなくなります。

最悪の場合、その手動改行が単語の途中や、日本語では行頭に来てはいけない文字の直前に来てしまい、禁則を破った不自然な改行が固定されてしまいます。しかもこれは文字列の折り返しシステムがどれだけ優秀でも直せません。改行そのものが翻訳可能なテキストの中に埋め込まれてしまっているからです。

実践的な対策

対応は難しい話ではなく、原則をはっきりさせるだけです。

  • 使用しているテキスト描画システムの、CJK対応の折り返し機能を使う。多くのゲームエンジンやUIフレームワークは、文字単位での折り返しと禁則処理をサポートするモードを持っている。単語単位の折り返しをそのまま流用しない。
  • 可能な限り、翻訳対象の文字列の中にハードコードされた改行を含めない。改行はレイアウト側で動的に決まるべきもので、原文の見た目に合わせて固定すべきものではない。どうしても改行が必要な場合(見出しの意図的な2行構成など)は、言語ごとに改行位置を差し替えられるようにしておく。
  • 実機・実データでテストする。ダミーテキストやローマ字の仮翻訳ではなく、実際の日本語訳文で折り返しと禁則が正しく機能しているかを確認する。

関連記事