CSS的アラビア語対応

## とある日の出向先にて

お客様 : 平井さん、(ウェブの技術で)アラビア語対応ってできる？
ひらい : アラビア語対応……ですか…… 🤔

※ グローバル展開されているプロダクトを開発していました。

ということでアラビア語対応やってみました〜✈️🏜️🐫

## アラビア語って？

**فإنه العربية**
こんな言語です。どうやらアラビア語は右から読むらしい。

他にもヘブライ語とかも右から読みます。
**עברית**

appleのサイトのサウジアラビア版
[https://www.apple.com/sa-ar/](https://www.apple.com/sa-ar/)
フッターの箇所が顕著に特徴が現れていますね。

ではどう実装するのか？
見ていきましょう......✨

## 実装方法

### HTMLのdir属性

要素の属性にdir属性というものがあります。
dirは**DIRection**つまり(読む)方向を決める属性です。
参照URL : [https://developer.mozilla.org/en-US/docs/Web/HTML/Global_attributes/dir](https://developer.mozilla.org/en-US/docs/Web/HTML/Global_attributes/dir)

ある程度の文章の向きは、
ユーザーエージェントが自動で言語を読み取っていい感じにはしてくれるらしい。

因みにltrは**LeftToRight**、rtlは**RightToLeft**の略です。

ただ…… **Edge と Internet Explorerがサポートされておらず**

断念 😇

### クラスを付ける

これが一番無難な方法でした。
実装方法は

1. is-rtl(みたいな)クラスをbodyに付ける。
2. JavaScriptでクラスの付け替えを行う。
3. rtl用のCSSを用意する。
4. rtl用のCSSで上書きしていく。

こんな感じ。

因みになぜ言語ごとにHTMLを分けなかったかと言うと、

- デザイン変更があったときにすべて言語ののHTMLを見直すのは大変
- 文言を入れる箇所は各国の翻訳されたJSONファイルを使用していたため、分ける必要がなかった

一見簡単そうに見えますが、初期段階のCSS設計を間違えてしまうと
一気にCSSがスパゲッティ化してしますので注意が必要です 💡

### CSS的解決

#### 文字の位置を右寄せに変更

これは簡単。

```css
text-align: right;
```

と入れるだけ。

#### 文字の読む方向を右からにする

上とニュアンスは似ているかもしれませんが、text-alignの役割は文章を右に寄せるだけです。
読む方向も右からに指定する必要があります。
directionといプロパティなのですが、上に挙げたHTMLのdir属性とは異なります。
こちらはEdge も Internet Explorerも対応されているので心置きなく使えます💡

#### 左から右指定

```css
direction: ltr;
```

結果
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/498647/f3a781a2-ef4d-a5da-804b-4deb31aac6e3.png)

#### 右から左指定

```
direction: rtl;
```

結果
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/498647/9833483a-7c8b-bf72-208b-d757ca52f701.png)


お分かりいただけただろうか。

#### 横並びの要素をどうするか

ここが少し悩みどころでした。 まず、横並びにするプロパティを挙げてみましょう 📝

#### display

- inline
- inline-block
- table, table-cell
- flex
- inline-flex
- grid
- inline-grid

#### float(+ 親に clearfix or overflow: hidden)

- left
- right

この中で、CSSだけで並び順を変更できるのは

- display: flex
- display: inline-flex
- display: grid
- display: inline-grid
- float

です。

実装結果はこんな感じ

<p class="codepen" data-height="265" data-theme-id="default" data-default-tab="css,result" data-user="saeka-hirai" data-slug-hash="qBEMZLe" style="height: 265px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;" data-pen-title="comparing CSS rtl properties">
  <span>See the Pen <a href="https://codepen.io/saeka-hirai/pen/qBEMZLe">
  comparing CSS rtl properties</a> by saeka-hirai (<a href="https://codepen.io/saeka-hirai">@saeka-hirai</a>)
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<script async src="https://static.codepen.io/assets/embed/ei.js"></script>

更に絞り込むと、 flexboxが1番適任だと思い、採用 🎉

#### flexbox採用理由

flexboxのpropertyで使用する

- flex-direction: row-reverse
- flex-direction: column-reverse

が明瞭(reverseって言ってるから直感的)でかつ書くソース量が少ない。
とてもスマート。素晴らしい😘

他の方法を不採用にした理由も併せて書いておきますね 📝

#### grid不採用理由

- gridはorderで要素一個ずつに対して順番を指定する必要があるため、柔軟性に欠ける<br>(要素が増える度CSSの記述を変えないといけない)
- Internet Explorerが対応されてなかった(当時は)

#### float不採用理由

- clearfixやoverflowなど前後間の要素に対するケアが必要になってくるので、<br>堅牢性が落ちてしまう
- floatを扱えるエンジニアが少ない w (まだflexのほうが事故りにくい)

因みにflexとinline-flexの違いはblockとinlineの違いと似ているので
使用箇所によってうまく使い分けましょう〜！

## まとめ

アラビア語対応するときは、

- text-align: right;
- direction: rtl;
- flex-direction: row-reverse;

を上手く組み合わせて実装していきましょう😘

ブラウザによる実装レベルを知りたい場合は
[caniuse](https://caniuse.com/)というサービスを使うとわかりやすいですよ〜！