Chainlitの日本語UI設定ファイル

Chainlitはチャット型AIアプリを構築するためのオープンソースのPythonパッケージで、生成AIを活用したチャットアプリを作ることができます。
Productionでの活用が想定されており、生成AIによる回答作成の中間処理を表示できたり、LangChain/Autogen/Haystackなど生成AI関連で人気のあるフレームワークをChainlitに統合する機能もあります。
ChainlitのUIは英語なので日本語に変更してみました。

# 日本語設定ファイルの作成
.chainlit/translations/ja.jsonを作成して以下の内容を記入します。必要に応じて表現を変更してください。

```ja.json
{
    "components": {
        "atoms": {
            "buttons": {
                "userButton": {
                    "menu": {
                        "settings": "設定",
                        "settingsKey": "S",
                        "APIKeys": "APIキー",
                        "logout": "ログアウト"
                    }
                }
            }
        },
        "molecules": {
            "newChatButton": {
                "newChat": "新しいチャット"
            },
            "tasklist": {
                "TaskList": {
                    "title": "\ud83d\uddd2\ufe0f タスクリスト",
                    "loading": "読み込み中...",
                    "error": "エラーが発生しました"
                }
            },
            "attachments": {
                "cancelUpload": "アップロードをキャンセル",
                "removeAttachment": "添付ファイルを削除"
            },
            "newChatDialog": {
                "createNewChat": "新しいチャットを作成しますか？",
                "clearChat": "現在のメッセージをクリアして新しいチャットを開始します。",
                "cancel": "キャンセル",
                "confirm": "確認"
            },
            "settingsModal": {
                "settings": "設定",
                "expandMessages": "メッセージを展開する",
                "hideChainOfThought": "思考の連鎖を隠す",
                "darkMode": "ダークモード"
            },
            "detailsButton": {
                "using": "処理中",
                "used": ""
            },
            "auth": {
                "authLogin": {
                    "title": "アプリにアクセスするにはログインしてください。",
                    "form": {
                        "email": "メールアドレス",
                        "password": "パスワード",
                        "noAccount": "アカウントを持っていませんか？",
                        "alreadyHaveAccount": "すでにアカウントをお持ちですか？",
                        "signup": "サインアップ",
                        "signin": "サインイン",
                        "or": "または",
                        "continue": "ログイン",
                        "forgotPassword": "パスワードをお忘れですか？",
                        "passwordMustContain": "パスワードには以下が含まれている必要があります：",
                        "emailRequired": "メールアドレスは必須項目です",
                        "passwordRequired": "パスワードは必須項目です"
                    },
                    "error": {
                        "default": "サインインできません。",
                        "signin": "異なるアカウントでサインインしてみてください。",
                        "oauthsignin": "異なるアカウントでサインインしてみてください。",
                        "redirect_uri_mismatch": "リダイレクトURIがOAuthアプリの設定と一致していません。",
                        "oauthcallbackerror": "異なるアカウントでサインインしてみてください。",
                        "oauthcreateaccount": "異なるアカウントでサインインしてみてください。",
                        "emailcreateaccount": "異なるアカウントでサインインしてみてください。",
                        "callback": "異なるアカウントでサインインしてみてください。",
                        "oauthaccountnotlinked": "本人確認のため、元々使用していたアカウントでサインインしてください。",
                        "emailsignin": "メールの送信に失敗しました。",
                        "emailverify": "メールアドレスを確認してください。新しいメールが送信されました。",
                        "credentialssignin": "サインインに失敗しました。提供した情報が正しいか確認してください。",
                        "sessionrequired": "このページにアクセスするにはサインインしてください。"
                    }
                },
                "authVerifyEmail": {
                    "almostThere": "もう少しです！メールを送信しました：",
                    "verifyEmailLink": "メール内のリンクをクリックしてサインアップを完了してください。",
                    "didNotReceive": "メールが見つかりませんか？",
                    "resendEmail": "メールを再送信",
                    "goBack": "戻る",
                    "emailSent": "メールが正常に送信されました。",
                    "verifyEmail": "メールアドレスを確認してください"
                },
                "providerButton": {
                    "continue": "{{provider}}で続行",
                    "signup": "{{provider}}でサインアップ"
                },
                "authResetPassword": {
                    "newPasswordRequired": "新しいパスワードは必須項目です",
                    "passwordsMustMatch": "パスワードが一致しません",
                    "confirmPasswordRequired": "確認用パスワードは必須項目です",
                    "newPassword": "新しいパスワード",
                    "confirmPassword": "確認用パスワード",
                    "resetPassword": "パスワードをリセット"
                },
                "authForgotPassword": {
                    "email": "メールアドレス",
                    "emailRequired": "メールアドレスは必須項目です",
                    "emailSent": "{{email}}宛にパスワードをリセットするための手順が記載されたメールを確認してください。",
                    "enterEmail": "メールアドレスを入力してください。パスワードをリセットする手順をお送りします。",
                    "resendEmail": "メールを再送信",
                    "continue": "続行",
                    "goBack": "戻る"
                }
            }
        },
        "organisms": {
            "chat": {
                "history": {
                    "index": {
                        "showHistory": "履歴を表示",
                        "lastInputs": "最後の入力",
                        "noInputs": "データがありません...",
                        "loading": "読み込み中..."
                    }
                },
                "inputBox": {
                    "input": {
                        "placeholder": "ここにメッセージを入力..."
                    },
                    "speechButton": {
                        "start": "録音を開始",
                        "stop": "録音を停止"
                    },
                    "SubmitButton": {
                        "sendMessage": "メッセージを送信",
                        "stopTask": "タスクを停止"
                    },
                    "UploadButton": {
                        "attachFiles": "ファイルを添付"
                    },
                    "waterMark": {
                        "text": "Built with"
                    }
                },
                "Messages": {
                    "index": {
                        "running": "実行中",
                        "executedSuccessfully": "正常に実行されました",
                        "failed": "失敗",
                        "feedbackUpdated": "フィードバックが更新されました",
                        "updating": "更新中"
                    }
                },
                "dropScreen": {
                    "dropYourFilesHere": "ここにファイルをドロップしてください"
                },
                "index": {
                    "failedToUpload": "アップロードに失敗しました",
                    "cancelledUploadOf": "次のファイルのアップロードをキャンセルしました：",
                    "couldNotReachServer": "サーバーに接続できませんでした",
                    "continuingChat": "前回のチャットを続ける"
                },
                "settings": {
                    "settingsPanel": "設定パネル",
                    "reset": "リセット",
                    "cancel": "キャンセル",
                    "confirm": "確認"
                }
            },
            "threadHistory": {
                "sidebar": {
                    "filters": {
                        "FeedbackSelect": {
                            "feedbackAll": "フィードバック：全て",
                            "feedbackPositive": "フィードバック：ポジティブ",
                            "feedbackNegative": "フィードバック：ネガティブ"
                        },
                        "SearchBar": {
                            "search": "検索"
                        }
                    },
                    "DeleteThreadButton": {
                        "confirmMessage": "このスレッドとそのメッセージおよび要素を削除します。",
                        "cancel": "キャンセル",
                        "confirm": "確認",
                        "deletingChat": "チャットを削除中",
                        "chatDeleted": "チャットが削除されました"
                    },
                    "index": {
                        "pastChats": "過去のチャット"
                    },
                    "ThreadList": {
                        "empty": "空です...",
                        "today": "今日",
                        "yesterday": "昨日",
                        "previous7days": "過去7日間",
                        "previous30days": "過去30日間"
                    },
                    "TriggerButton": {
                        "closeSidebar": "サイドバーを閉じる",
                        "openSidebar": "サイドバーを開く"
                    }
                },
                "Thread": {
                    "backToChat": "チャットに戻る",
                    "chatCreatedOn": "チャット作成日"
                }
            },
            "header": {
                "chat": "チャット",
                "readme": "Readme"
            }
        }
    },
    "hooks": {
        "useLLMProviders": {
            "failedToFetchProviders": "プロバイダーの取得に失敗しました："
        }
    },
    "pages": {
        "Design": {},
        "Env": {
            "savedSuccessfully": "保存が成功しました",
            "requiredApiKeys": "必要なAPIキー",
            "requiredApiKeysInfo": "このアプリを使用するには、以下のAPIキーが必要です。キーはデバイスのローカルストレージに保存されます。"
        },
        "Page": {
            "notPartOfProject": "このプロジェクトの一部ではありません。"
        },
        "ResumeButton": {
            "resumeChat": "チャットを再開"
        }
    }
}

```

# Chainlitアプリの起動
アプリを起動するとメニューやボタンが日本語で表示されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/248948/423893e6-08e9-d5b4-06b1-01944b03da1d.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/248948/ba2fd591-01f6-ab90-8f25-2938ff0f06b8.png)

以上です。