3 ポイント 投稿者 GN⁺ 2023-08-24 | 1件のコメント | WhatsAppで共有
  • HTMLの dir="auto" 属性 ひとつだけで、入力欄とテキストエリアでヘブライ語・アラビア語・ウルドゥー語のような RTL(右から左)言語 を自動サポート
  • これまでは文字検出用リスナーの作成、サードパーティライブラリの利用、dir="right" への手動切り替えなど、手作業で複雑な方法 しか知られていなかった
  • "textarea rtl" の検索結果のどこにも dir="auto" への言及がなく、直接手を入れる必要がある問題だと誤解 されてきた
  • 実際に適用してみると、別途低レベルな言語解析なしで すぐに正しく動作
  • 小さな変更だが大きな違いを生み、世界中のユーザーがアプリを使えるかどうかを左右する 国際化(i18n)の重要要素

RTLサポートの難しさ

  • Standard Notes では初期の頃からヘブライ語、アラビア語、ウルドゥー語など RTL言語のサポート 要望があったが、実装難易度が高そうに見えて先送りされてきた
  • 検討するたびに、Unicode・ASCII などのエンコーディングを低レベルで扱う 言語解析作業 のように見えて避けていた
  • 数か月ごとに同じ話題が繰り返されたが、毎回返ってくる助言は同じだった
    • 文字パーサーを自作する
    • サードパーティライブラリを使う
    • dir="right" を適用する

検索の限界

  • "textarea rtl"、"textarea right to left" などで検索しても、結果に dir="auto" がまったく出てこない
  • その代わり、dir="rtl" をタグに書けという Stack Overflow の回答や、Twitter のサードパーティライブラリばかりが表示された
  • 検索結果の1ページ目だけを信じて 直接手を入れる必要がある問題だと決めつけ、優先順位で後回しになり続けた

解決策の発見

  • 数週間前、再び検索していたところ、ある GitHub の投稿で「textarea に dir="auto" を追加するだけでよい」というコメントを見つけた
  • 1年間解決策を探していた問題が、たった1行で解決 した
  • 実際に適用してみたところ、不具合なく完璧に動作 した

適用方法

  • 入力欄・テキストエリアに属性を1行追加するだけ
    • <textarea dir='auto'> שלום, עתיד. </textarea>
  • 入力値に応じてテキスト方向が 自動判定 される
  • 参考までに、MDN の dir 属性ドキュメントに関連説明がある

1件のコメント

 
GN⁺ 2023-08-24
Hacker Newsのコメント
  • 入力欄やtextareaのテキストレンダリングを直す簡単な方法ではあるが、送信されたテキストを表示する要素にも同じ処理が必要になる
    そして双方向テキスト、たとえばアラビア語の段落の中に英語の製品名が出てくるようなケースに出会うと、まったく別の複雑さが出てくる
    Chromeには現在、dir='auto'のある入力欄でRTLテキストのレンダリングに影響するリグレッションバグがあるが、修正はすでに展開されており、次のリリースに含まれる予定

  • MDNはいつも助けてくれる: https://developer.mozilla.org/en-US/docs/Web/HTML/Global_att...

  • 世界はアメリカの外にもあるが、サイトの性質によっては必ずしも対応が必要とは限らない
    自分はアメリカ人でも英語ネイティブでもないが、自分が使うサイトの99%では、ユーザー名や投稿でRTL文字を許可しなくてもまったく問題ない
    これがブラウザやOSのレベルで解決されていないなら、自分がそれをサポートする義務はほとんどないと思う
    そしてこれは少数派を抑圧しようという話ではない

    • 個人プロジェクトで他言語対応を考えるたびに、この点を思い出す
      ざっと検索すると英語話者は8億4千万人ほどらしいし、1人で作る立場なら世界の1/10に使ってもらえるだけでもかなり悪くない
      より多くの人をサポートしようと範囲を広げるのは良いことだが、必ずそうしなければならないわけではない
    • ニッチなユースケースへの対応が簡単で、保守負担も小さいなら、単に面白いから入れてみる価値はある
  • 「Googleの最初の結果ページは決して嘘をつかない」とは、問題解決に役立つ話はあるが、先に座っておいたほうがいい。たぶん悲しくなるから

    • その文を文字どおりに受け取ったようだ
      「Googleの最初の結果ページは決して嘘をつかない…」という表現は、その後に出てくる「Googleは入力欄のRTLサポートについて私たちに嘘をついてきた」という文から見ても、ほぼ確実に皮肉だったと思う
  • 残念ながら、Webサイトと紐づいたCodePenはどちらもソースのレンダリングがかなりひどい。ピリオドの位置が間違っていて、レンダリングされたHTML自体は問題ない
    これはUnicode双方向アルゴリズムがいつものように失敗したように見える
    HTMLタグ、つまり<>の間全体を、内部的にはLTRの原子的な単位としてレンダリングしつつ、周囲の文字方向には影響しない特別なアルゴリズムが必要そうだ
    この例では、アルゴリズムは.<シーケンスの途中で方向を切り替えられる必要がある

    • ここでUnicode双方向アルゴリズムは失敗しているのではなく、設計どおりに動作している
      ソースコード断片の基本方向はLTRだが、ヘブライ語テキストのせいで方向が混在している
      句読点は弱い方向性しか持たないため、ピリオドはRTL区間の終端に現れ、基本方向がLTRなのでその「終端」は右側を意味する
      混在方向のコンテンツを正しくレンダリングさせるには、特定の方向区間がどこで始まりどこで終わるかを示す双方向制御文字を入れる必要があることが多い
      ただしこの場合、それを入れると実際の入力例のレンダリングを壊してしまう可能性があるので、入れるのは適切ではない
  • 関連して、ここ数年で論理プロパティ/値のサポートが成熟してきた
    これはtop/left/bottom/rightのような方向ベースのプロパティの代替で、コンテンツやテキスト方向の切り替えに合わせて適応できる
    https://developer.mozilla.org/en-US/docs/Web/CSS/CSS_logical...

    • こうした考え方はモバイルプラットフォームではずっと前から標準だった。たとえばiOSのleadingtrailingのようなものだ
      Webにも入ってきたのはうれしいし、言語非依存のUIを作ることがずっと現実的な作業になった
  • textareaとBiDiテキストのほぼ思いつく限りの組み合わせで検索すると、https://www.w3.org/International/talks/1602-omanが上位リンクの1つに出てくる
    その中の「What if you don't know the direction in advance」セクションにもすぐ出てくる: https://www.w3.org/International/talks/1602-oman/#advance
    問題は、筆者がこの分野に詳しくなく、ここでの検索語としてBiDiが正しいことすら知らなかったらしい点だ。これは「bi-directional text」の略で、特定の書字方向を指定したくないときに使う言葉だ
    「検索結果が間違っていた」と考えたことも責めたくはない。RTLで検索したなら、その結果はその問いに対しては正しいが、この分野をもう少し知らないとそれはわからない
    インターネット上の回答に頼ることの限界が出ている。インターネットは自分が何を知らないかを知らない
    BiDiを長く扱ってきた人に聞けば、最初の質問の1つは「RTLのことですか、それともBiDiのことですか?」になる可能性が高い
    可能ならソフトウェアより人に聞いたほうがいい。特にその分野に詳しくないときはなおさらだ

    • 内輪の略語でその分野を門番のように扱って筆者を見下すより、この問題がより広く知られるきっかけを作った点を前向きに見ることもできる
  • フォーム送信時にテキスト入力の方向性も一緒に含められる興味深い属性dirnameへのリンクも追加してよさそう: https://developer.mozilla.org/en-US/docs/Web/HTML/Attributes...

  • ブラウザを作るなら、明示的な指定がない場合はdir="auto"を前提にせよ、という公益広告を打ちたい

    • ユーザー入力用のフォームコントロールは一種の別文書なので、そのデフォルトとしてはそちらのほうが理にかなっているかもしれないが、すべての要素のデフォルト値としては非常にまずい
      ユーザーが特定の言語で入力することがわかっているなら、それも最善のデフォルトではないかもしれない。もちろん、間違った指定をするよりはましだ
  • 少し関連するが、最近Vimにはテキストを右から左にする:set rlがあることを知った
    元に戻すには:set norlを使えばよい

    • おお、かなりクールだし、英語でもそういうふうにタイプしてみるのは地味に楽しい。思ったより長くやってしまった
    • 古いVimにはアラビア語モードで起動するvim -Aもある。どう使うのかは知らないが、何らかの入力メソッドを使うようだ
    • :set tdはどうだろう?