VSCode拡張機能「 i18n Alliy 」を使って 多言語対応の開発生産性を劇的に飛躍させる


# はじめに

近年はグロバール化が進んでおり、プロダクトに関してもグローバル対応が求められるケースが増えています。

グローバル対応を実現するにあたって基本的にはi18nなどを使って自前で実装するか、
外部のツールやサービスを利用するかの2択になると思います。

i18nを使って自前実装するにしろ、外部サービスを利用するにしろ、そのプロダクトが置かれている環境(フェーズや予算など)を考慮して最適な判断をするのが大切ですよね。

ちなみにそれぞれのメリットデメリットは下記のような感じかなと思います。
<table>
  <thead>
    <tr>
      <th></th> <th>i18nで実装</th><th>外部ツールを利用</th>
    </tr>
  </thead>
  <tr　>
    <td> メリット </td> <td>費用を抑えられる。</td><td>開発工数を抑えられる。
    </td>
  </tr>
  <tr>
    <td> デメリット </td> <td>コードの可読性低下。開発運用が大変。</td><td>費用が高い(年間数十~数百万円)。</td>
  </tr>
</table>

i18nを使ったことがある人なら共感いただけると思いますが、i18nのライブラリなどによる多言語対応はコードの可読性の低下や運用の面で色々と大変な部分がありますよね。
そこをボトルネックと感じる方も多いのではないでしょうか。

今回ご紹介する i18n Alliy はそのようなお悩みを解消し、開発生産性を高く維持したままノンストレスに多言語対応の導入や運用を手助けするツールになっています。

僕も実際に使ってみてもうこのツールを手放せなくなりました(笑)

# i18n Alliy とは？
i18nを使った開発の手助けをしてくれるVSCodeの拡張機能です。
※Cursorでも問題なく使えます。

2024/11現在で600,000ダウンロード超えとなっており世界中で多く利用されています。

https://github.com/lokalise/i18n-ally



## i18n Alliyのサポートフレームワーク
Svelteに限らず、Vue,React,Angularなど主要なフロントフレームワークがサポート対象となっています。

https://github.com/lokalise/i18n-ally/wiki/Supported-Frameworks
## i18n Alliyのインストール方法


まずは i18n Allyをインストールしてください

https://marketplace.visualstudio.com/items?itemName=Lokalise.i18n-ally

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/617821/29ef052c-c044-f268-184b-3362dbb1e694.png)

## i18n Alliyの主要機能3つ紹介

## 1. 何が表示されるのか一目でわかるようになる
jsonファイルまで飛ぶことなく一目で何が表示されるのかを確認できます。


### 拡張機能を入れる前はこんな感じ
`{$t('UserForm.enterName')}`で表示される言語は、`en.json`と`ja.json`をそれぞれみに行く必要がある。。。。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/617821/4b476f13-bcc4-d069-4aa7-3784d5a9cce4.png)

`{$t('UserForm.enterName')}` の箇所で内部的にjsonファイルから該当するkeyのvalueを見つけてここで表示してくれる(便利!)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/617821/f6a7ed02-4b22-0e41-442e-4503a1b42757.png)


VSCodeの右下の表示言語設定で表示言語を変えると
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/617821/dab192c8-273f-b430-b5d4-16721e322b61.png)

ファイル上で表示する言語も変えてくれる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/617821/4d31887b-1c70-7c5f-b1bc-9900285818d2.png)


## 2. ホバーで翻訳リスト表示とジャンプができる
`{$t('UserForm.enterName')}`の部分日本語と英語でそれぞれどのような表示になるか確認や編集したいケースありますよね。そんな時に便利な機能になります。

ホバーをするとその言語で設定されている内容を一目で確認することができます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/617821/0817d848-b1f9-a1b0-e4a2-c4dcd946c60b.png)

さらに英語だけちょっと表現を変えたいってきもありますよね。
そんな時は「↗︎」のマークをクリックすると下記のように該当のjsonファイルの定義箇所に直接ジャンプすることができます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/617821/eace1c9f-fc3f-e61a-2dd8-da2753c1d1e5.png)


### 3. プロジェクト全体の翻訳の進捗や漏れを確認できる

サイドバーにて様々な機能を提供しています。
この後特に便利な機能だけをピックアップして説明します。


## 現在のファイル
こちらの箇所では現在開いているファイルに関して翻訳周りの内容の分析や確認が可能です。



![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/617821/35e06c28-b800-fd49-22c3-70b2ddd269be.png)

- `Key in use`
    - どのような言語で、どのようなkey、どのようなvalueが定義されているか確認できます。
- `keys not found`
    - 表示ファイル上で参照しているが、jsonファイル上でそのkey/valueの実装が定義されていない場合にエラーとして表示されます
    - 今回の場合`{$t('UserCreate.message')}`という実装がされていますが、これにマッチする内容が`en.json`,`ja.json`ともに定義されていないためにエラーとして教えてくれています

- `Hard-coded strings [beta]`
    - i18nを使っておらず、ハードコーディングされたままのstringを検知して教えてくれます
    - 今回の場合`<div>新規作成</div>`の箇所が翻訳対応漏れで、ハードコーディングされたままでそれを検知して教えてくれています。



## 使用状況レポート
ファイル単位だけではなく、システム(プロジェクト)全体の翻訳状況の確認ができます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/617821/1d51ba7a-98e0-0398-e2c6-4fdf8e26a16d.png)

- 使用されている翻訳の全体像がわかる
    - 今回の場合現在22このkeyを使って翻訳していることがわかります。　
<br>


- 使用されていない翻訳がわかる
    - ja.jsonで`"hoge": {"hoge": "hoge"}`と定義しているがどこからも使われていないことがわかります
<br>


- 参照されているが定義されていない翻訳がわかる
    - svelteファイル上で`{$t('UserCreate.messae')}`と`{$t('UserCreate.createForm')}`を参照しているが該当するkey/valueが存在しないことがわかります。




# 最後に

今まではi18nでの多言語対応となるとコードの可読性低下や思わぬデグレのリスクなどがあり、「できれば使いたくないな・・」という感情が少なからずありました。

ただi18n Alliyを使うことで以前まで感じていたネガティブな部分が解消されノンストレスに多言語対応を進めることができています。

外部サービスは高くて使えない。MVP実装だから手軽に多言語対応したい。そんなケースでは i18n Alliyを使った多言語対応をしみてはいかがでしょうか。より気軽に多言語対応を進めめられるはずです。