Svelte/SvelteKit で i18n 多言語対応を行う

`Svekte/SvelteKit` でアプリケーションを開発していると、多言語での対応が必要になってくることも多いと思います。

今回の記事では、`Svekte/SvelteKit` で多言語対応をする初期設定の流れについて解説できればと思います。

## 多言語対応ライブラリ

svelte, i18n あたりで検索すると、以下の 2 つのライブラリが見つかりました。

* https://www.npmjs.com/package/svelte-i18n

* https://www.npmjs.com/package/sveltekit-i18n

今回の記事では、`sveltekit-i18n` のライブラリを使って、実際に i18n 多言語対応をしてみたいと思います。

## 多言語対応実装用のプロジェクトを用意する

多言語対応を動かすプロジェクトを用意します。

ここでは、以下の SvelteKit のページのデモアプリを使ってみます。

* https://kit.svelte.jp/

```console
$ npm create svelte@latest my-app
```

SvelteKit の demo アプリを使用し、TypeScript を使用する形にしました。

```
◇  Which Svelte app template?
x  SvelteKit demo app
x
◇  Add type checking with TypeScript?
x  Yes, using TypeScript syntax
```

```console
$ cd my-app
$ npm install
````

この状態で以下コマンドを実行し、

```
$ npm run dev
```

以下にアクセスすることで、デモアプリが表示されると思います。

* http://<アプリが動いているサーバーのホスト名>:5173/

## ライブラリのインストール

以下コマンドで `sveltekit-i18n` のライブラリをインストールします。

```
$ npm i sveltekit-i18n
```

## 多言語表示処理を動かしてみる

`src/lib/translations` のディレクトリを作ります。言語関連の設定が入ります。

```console
$ mkdir src/lib/translations
```

`src/lib/translations/en` および `src/lib/translations/ja` のディレクトリを作ります。英語と日本語の実際の表示内容が入ります。

```console
$ mkdir src/lib/translations/en
$ mkdir src/lib/translations/ja
```

`src/lib/translations/en/common.json` のファイルを作って、以下を記述します。

```json
{
	"welcome": "Welcome to SvelteKit App!"
}
```

`src/lib/translations/ja/common.json` のファイルを作って、以下を記述します。

```json
{
	"welcome": "SvelteKit のアプリへようこそ！"
}
```

`src/lib/translations/translations.ts` のファイルを作って、以下を記述します。

```typescript
import i18n from 'sveltekit-i18n';

/** @type {import('sveltekit-i18n').Config} */
const config = ({
  loaders: [
    {
      locale: 'en',
      key: 'common',
      loader: async () => (
        await import('./en/common.json')
      ).default,
    },
    {
      locale: 'ja',
      key: 'common',
      loader: async () => (
        await import('./ja/common.json')
      ).default,
    },
  ],
});

export const { t, locale, locales, loading, loadTranslations } = new i18n(config);
```

`src/routes/+layout.svelte` にて、言語設定を読み込む記述を追加します。

```javascript
<script>
	import Header from './Header.svelte';
	import './styles.css';

	// 以下 import を追加
	import { loadTranslations } from '$lib/translations/translations';

	// 言語読み込み設定を追加
	const defaultLanguage = "en"
	loadTranslations(defaultLanguage, "/"); 
</script>
```

`src/routes/+page.svelte` にて　`<script>` の中に以下 import 文を入れます。 

```javascript
import { t } from '$lib/translations/translations';
```

また、同ファイルにて、`{$t('common.welcome')}` の形で言語に応じた文言を画面上に表示する設定を追加します。

```html
<section>
	<h1>
		<span class="welcome">
			<picture>
				<source srcset={welcome} type="image/webp" />
				<img src={welcome_fallback} alt="Welcome" />
			</picture>
		</span>

		to your new<br />SvelteKit app
	</h1>

	<!-- ここで言語に応じた文言を表示してみる -->
	<p>{$t('common.welcome')}</p>

	<h2>
		try editing <strong>src/routes/+page.svelte</strong>
	</h2>

	<Counter />
</section>
```


ここまで出来たら、以下のように英語版の文言が表示されることを確認できると思います。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1435607/dc594d2d-fad4-dcc5-7495-6219e30aae5e.png" width="70%">

次に、`src/routes/+layout.svelte` にて、言語を日本語にしてみます。

```javascript
const defaultLanguage = "ja"
```

すると、以下のように日本語版の文言が表示されることを確認できると思います。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1435607/34fddb6a-3d47-137a-3d15-4257040daceb.png" width="70%">

これで多言語対応の最初の一歩が踏み出せたかなと思います。

## 動的に言語を切り替えてみる

一旦、`src/routes/+layout.svelte` にて、デフォルト言語を英語に戻しておきます。

```javascript
const defaultLanguage = "en"
```

`src/routes/+page.svelte` の　`<script>` の中の import 文を更新し、language の変数および変更時の関数を定義します。

locale.set で言語を設定することで、画面上の言語情報が更新される動きになると思われます。

```javascript
<script>
    ...
    import { t, locale } from '$lib/translations/translations';

    let language = "en";
    const onChange = () => {
    	locale.set(language);
    }
</script>
```

言語に応じた文言の表示部分の下あたりに、言語を選択するプルダウンを設置します。

```html
	<!-- ここで言語の文言を表示してみる -->
	<p>{$t('common.welcome')}</p>

    <!-- 言語選択用のプルダウン -->
	<select bind:value={language} on:change={onChange}>
			<option value="en">en</option> 
			<option value="ja">ja</option> 
	</select>
 ```

すると、以下のような画面となり、プルダウンで言語を切り替えた際、その言語に応じた文言が画面上に表示されることを確認できると思います。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1435607/80b48c5b-8767-25d3-cb5f-db2ae6c95140.png" width="70%">

## さいごに

今回は、`sveltekit-i18n` のライブラリを使って、実際に i18n 多言語対応をする基本的な流れについてまとめてみました。

この記事が誰かの一助になれば幸いです。