Keycloakの多言語対応の最新状況

[NRI OpenStandia (IAM編) Advent Calendar 2024](https://qiita.com/advent-calendar/2024/nri-openstandia-iam)の24日目は、Keycloakの多言語対応の最新状況について紹介します。

# Keycloakの多言語対応

Keycloakはデフォルトでは英語のみの表示モードになっています。例えば、Keycloakを新規にインストールして起動し、管理コンソールにログインしようとすると、ログイン画面は必ず英語です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/35233/f628c1c5-5b92-c12d-2a82-7665ea8f40e4.png)

これは、管理コンソールの「master」レルム内の「Realm settings > Localization」にて、デフォルト`Disabled`が設定されているためです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/35233/f6b43052-46b4-7de6-499a-c9adf19cec2f.png)


これを`Enabled`に変更することで、「Supported locales」と「Default locale」の設定が可能になります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/35233/4cc09b44-71ee-0497-fcb0-3929c79281d3.png)

例えば、上記のように`Japanese`を「Supported locales」に追加して保存し、再度管理コンソールへのログイン画面を開くと以下のように日本語表示となります（ブラウザの言語設定に応じて送信される`Accept-Language`ヘッダーを参照して、自動的に日本語となります[^1]）。

[^1]:`Accept-Language`ヘッダーが利用できない場合は、レルムの「Default locale」設定が利用されます。また、他の要素でも表示言語は決まります。詳細な決定ロジックは、公式ドキュメント（https://www.keycloak.org/docs/26.0.7/server_admin/index.html#_user_locale_selection ）を参照してください。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/35233/ce1a194a-5f3b-bb5a-c324-4daaadd0e050.png)

「master」レルムにて多言語を有効化すると、管理コンソールも設定した言語で表示されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/35233/254f7fca-b69f-4a92-b068-ee2241769268.png)

「master」レルム用のアカウントコンソールも同様です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/35233/08f26363-5d92-cc89-c939-ec1443675549.png)

その他のレルムは、レルム単位で多言語を有効化することで、そのレルムのログイン画面やアカウントコンソールが多言語表示になります。

しかしお気付きでしょうか・・・？ **日本語表示としたときに、部分的に翻訳されていない箇所があちこちにありますよね・・？** 多言語対応の状況は言語ごとにバラバラであり、2024年12月時点では日本語もまだ対応しきれていない箇所があるのです。

:::note info
なお、未翻訳や誤訳、自分たちの使い方にフィットしない訳の場合に、Keycloak利用者側でメッセージを差し替えることも可能です。大きく以下の2つの方法があります。

- テーマを作成してメッセージを差し替える
- 管理コンソールからメッセージを差し替える

後者の方法は、テーマを作らなくてもよいので本当に文言だけ調整したい場合は非常に便利です。「Realm settings > Localization > Realm overrides」から言語とメッセージごとに設定可能です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/35233/d19b8e1b-295f-d1b0-ed77-cdaaf5500c09.png)

例えばログイン画面の「ユーザー名またはメールアドレス」を差し替える場合は、`usernameOrEmail`キーに値を設定します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/35233/de3cf5ae-0084-23e0-5326-9821e9d416b1.png)


そうするとKeycloakの再起動なしに即反映されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/35233/db942a45-0dc6-605a-1e39-5857dbec5add.png)

※メッセージのキーは、「Realm settings > Localization > Effective message bundles」から検索可能です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/35233/970cb935-f1ca-d338-6563-625f4e8e97f4.png)


:::


# 多言語化の歴史

KeycloakはUIのメッセージを言語ごとのプロパティファイル形式で管理しています。例えば、 https://github.com/keycloak/keycloak/tree/8525be6b33f5d81d18f626cca706c9d2adb74b60/themes/src/main/resources-community/theme/base/login/messages ではログイン画面のメッセージが管理されています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/35233/a5362cbc-6f83-f297-59a3-98d22fc936ab.png)


長らく、各言語対応に興味のある方が時折プルリクエストを送り、このプロパティファイルの新規追加（言語追加）や更新を行っていました。例えば、日本語対応は2016年に筆者が以下のプルリクエストを作成して対応を開始しました。

https://github.com/keycloak/keycloak/pull/3118

そして継続的にプロパティファイルを最新化するプルリクエストがあり、メンテンナンスが行われています（OpenStandiaの[@k-tamura](https://github.com/k-tamura)さんが積極的に対応してくれています）。

https://github.com/keycloak/keycloak/pull/7077


# 多言語対応に関するディスカッション

2021年12月21日に、以下のディスカッションが作成されました。現状の多言語対応の作業を楽にするために、専用のプラットフォームを使ったらどうか？という提案です。

https://github.com/keycloak/keycloak/discussions/9270

長らくこのディスカッションは放置されていましたが、2023年7月に突如Keycloakメンテナーからコメントがあり、 **[Weblate](https://weblate.org/ja/)** を使った方式にしようぜ！という流れに一気になりました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/35233/9cd33d85-ca0c-bbd7-973c-56bbc35cb306.png)

そしてWeblateを使ったワークフローへと徐々に変更されていきます。そこで日本語のWeblateによる翻訳対応も、日立製作所の[@y-tabata](https://github.com/y-tabata)さんと一緒に進めることになりました。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/35233/5b3ae782-6243-22b6-6297-48735506bd45.png)



# Weblateによる多言語対応

以下に、[Weblate](https://weblate.org/ja/)を使った多言語対応のガイドが整備されています。

https://github.com/keycloak/keycloak/blob/main/docs/translation.md

ここに書かれているように、翻訳に協力して頂ける方は[Weblate](https://weblate.org/ja/)でアカウント作成し、[Keycloakの翻訳チーム](https://hosted.weblate.org/projects/keycloak/)に参加します。

後は、Weblate上でひたすら翻訳をするだけです！:writing_hand::writing_hand::writing_hand:

以前のプロパティファイルベースの翻訳のように、GitHubにプルリクエストを出す必要はありません。エンジニアではない方でも翻訳のコントリビューションが非常にしやすくなったと思います。

https://hosted.weblate.org/projects/keycloak/

なお、このサイトにアクセスすると、言語ごとの現在の翻訳状況を見ることができます。この記事を執筆している時点だと、日本語はWeblate対応している言語の中でも一番翻訳率は低く、これから頑張っていく所存です・・・！

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/35233/809c4416-f623-c200-d3f9-7ccd39bf9324.png)


# Weblateを使った日本語翻訳作業

実際にどんな感じで日本語への翻訳作業ができるのか軽く紹介します。


## 概要ページ

日本語翻訳の概要ページです。ここで全体の状況を確認できます。

https://hosted.weblate.org/projects/keycloak/-/ja/

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/35233/c5b9768f-6579-62a9-99ff-95056725ddd1.png)


コンポーネントごとの![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/35233/61b08f2f-bd9e-255e-9843-f77533437186.png)などをクリックすると、翻訳ページを開くことができます。

## 翻訳ページ

開いた翻訳ページで実際に翻訳作業を行います。

:::note warn
画面上部に以下のメッセージが出ている場合は「貢献者同意条項への同意」が必要です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/35233/a495699e-bd13-519e-3adb-ec8777115540.png)

「貢献者同意条項の表示」をクリックすると同意画面が開きます。内容を読んで同意して頂ける場合は進めてください。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/35233/1662b393-b098-6e1c-f31c-f2bfff63d979.png)
:::


未翻訳のものは「日本語」のテキストエリアが空になっているので、ここに翻訳を入力して「保存して次へ」または「保存のみ」ボタンをクリックして保存するだけです！

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/35233/5687c3eb-71ec-b19f-0a06-41c335069e4f.png)


## 検索ページ

検索ページです。ここで原文メッセージや翻訳メッセージなどで対象を検索することができます。

https://hosted.weblate.org/projects/keycloak/-/ja/#search

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/35233/b4291d4c-77e3-618c-4b22-cda8955f37b0.png)


試しに「翻訳文」で「アクセストークン」を検索してみました（「フィルター」に`target:アクセストークン`と入力します）。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/35233/6e283862-0b8f-41f9-98c4-e6a45a4497c4.png)

20件ヒットした模様です。**Keycloakを使っていて、翻訳が間違っているんじゃないか！？と思った時にはこれで検索してサクッと修正提案していただけると、非常に助かります:bow:**。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/35233/32c465f4-0a22-a83f-999d-27507213b0d9.png)


# おわりに

本記事では、Keycloakの多言語対応の最新状況として、翻訳プラットフォームであるWeblateを使ったワークフローに変更されていることを紹介しました。Weblateを使うことで、翻訳のためにGitやGitHubを使う必要もなくなりましたので、エンジニア以外の方でも参加しやすくなったのではないかと思います。 **「OSSに何かコントリビューションしてみたい・・・」** と考えている方にとって、翻訳は非常に取り組みやすい最初の一歩になるでしょう。興味を持たれた方は是非ご協力をお願いします！