日本語の改行が変な位置に入る — 行頭に「、」「」」が来る不具合
日本語のテキストボックスが折り返され、なぜとは言えなくても何かがおかしいと感じる。行頭に「、」や「。」だけが来ている、「」」のような閉じ括弧が前の文字なしで行頭にぽつんと取り残されている、あるいは「っ」や「ょ」のような小書きのかなが行頭から始まっている。どれも誤字でも誤訳でもありません。単語自体は正しいのです。改行の位置そのものが、日本語の組版で禁止されている場所に入ってしまっているのです。
これは「なんとなく変」という感覚ではなく、禁則処理という実在する名前のついたルールで定義されています。実際のルールを知っていれば、本物の不具合と誤検知を区別でき、闇雲に文言を変えて偶然うまく折り返るのを待つのではなく、本当の直し方にたどり着けます。
禁則処理が実際に禁止していること
禁則処理は、改行時に特定の位置に来てはいけない文字を2種類定義しています。行頭禁則は、特定の文字が行の先頭に来ることを禁止するもので、その文字が来るはずだった改行位置は前の行の末尾に留まるようずらされます。
- 閉じ括弧類は行頭に来てはいけない: 」』)〉》 などの閉じ括弧・閉じ引用符
- 文末の句読点は行頭に来てはいけない: 。と、
- 小書きのかな(捨て仮名・拗音)は行頭に来てはいけない: っ ゃ ゅ ょ ぁ ぃ ぅ ぇ ぉ、および長音記号ー
行末禁則と、取り残された閉じ括弧
対になるルールが行末禁則で、特定の開き文字が行の末尾に来ることを禁止します。開き括弧「や『は行の最後の文字になってはいけません。それが囲むはずの文章と視覚的に切り離されてしまうからです。禁則処理を正しく適用しているレンダラーは、行末に来てしまうはずの開き括弧を、その次の文字ごと次の行の先頭に送るか、あるいはその手前で行を短くして括弧と本文が離れないようにします。
「閉じ括弧だけが行頭に取り残される」という症状は、まさにこの行頭禁則の適用漏れです。レンダラーが「」を新しい行の先頭に置くことを許してしまい、前の行の内容を締めくくる位置に引き戻していない状態です。
スペース基準の折り返しが日本語には無力な理由
多くのテキスト描画システムは、どこで改行できるかをスペース文字を探すことで決めます。英語や多くのラテン文字言語では単語の境界がそうなっているからです。日本語のテキストには単語間にスペースがまったくないため、スペース検出だけを前提にした折り返しアルゴリズムは日本語文字列の中に有効な改行位置を見つけられず、折り返しに失敗するか、禁則処理を一切考慮しない任意の文字境界で強制的に折り返してしまいます。
正しい日本語の改行には、禁則処理を直接理解しているレンダラーか、テキストレイアウトエンジンのCJK改行モードが明示的に有効化されていることが必要です。これは英語の文字列だけで作られテストされたコンポーネントから自動的に得られるものではありません。
/* CSSの改行挙動はプロパティごとに異なる */
.jp-text {
line-break: strict; /* より厳格な禁則処理ルールを適用する */
overflow-wrap: normal; /* 単語途中の強制改行はしない */
}用語が翻訳後に単語の途中で分断される理由
少し別だが関連する症状として、本来1行に収まってほしい商品名や単位、複合語が2行にまたがって分断されることがあります。これは技術的には禁則ルールに違反していません。禁則処理はあくまで句読点や小書きのかなを対象とするルールであって、通常の単語の結束性を保証するものではないからです。そして日本語には英語のような「この一続きの文字はひとつの単語だから改行するな」という組み込みの概念がそもそもありません。そもそも単語境界を示すスペースが存在しないためです。ある用語を絶対に分断したくないなら、それは明示的にマークする必要があります — 分断禁止のspanで囲む、あるいはゼロ幅の禁則マーカーを挿入するなどです。レンダラーが自動的に推測してくれるものではありません。
原文に埋め込まれた強制改行が翻訳後に破綻する理由
まったく別の原因として、一部の原文文字列には、原文言語のレイアウトでの改行位置を手動で制御するために、リテラルな改行文字が直接埋め込まれていることがあります。この改行文字は翻訳を経ても変更されずそのまま残りますが、翻訳後のテキストは長さも自然な改行位置も原文とは異なるため、埋め込まれた強制改行はもはや翻訳後のテキストが本来折り返るべき位置とは無関係な場所に着地します。その結果、上で説明したような行頭・行末禁則違反がまさに起きやすくなります。強制された改行位置は禁則処理とはそもそも何の関係もない場所に置かれているからです。
- 対処: 翻訳対象になる文字列からは埋め込みの改行文字を取り除き、禁則処理を有効にしたレイアウトに自然に折り返させる
- UI上どうしても手動改行が必要な場合は、原文言語の改行位置が翻訳後も通用すると仮定せず、言語ごとに改行位置を指定する
実機で確認すべきこと
機械的なチェックでは、機械的に見つかるケースを検出できます。翻訳対象の文字列に埋め込みの改行文字がないか検索する、描画側で禁則処理(またはCJK改行モード)がそもそも有効になっているかを確認する、といった具合です。しかし唯一信頼できる最終確認は、実際にゲームが使う実機・実プラットフォームで、実際に使われるコンテナ幅で描画されたテキストを目視することです。改行は正確な幅・フォント・ポイントサイズに依存するため、幅の広いデバッグ表示ではきれいに折り返っていた文字列が、実際の出荷UIで使われる狭いボックスに収まった途端、禁則処理に違反することがあります。