From 76a18d414fe44a812bb3d8c21f2d81707aab0846 Mon Sep 17 00:00:00 2001 From: kenta yamamoto Date: Fri, 17 Oct 2025 21:37:37 +0900 Subject: [PATCH] feat(login): add Japanese localization for login frontend app (#10811) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit # Which Problems Are Solved - Japanese users cannot use the Login UI in their native language, as only other locales (English, German, Italian, Spanish, Polish, Chinese, Russian, Turkish) are currently supported - The Login UI language selection does not include Japanese as an option # How the Problems Are Solved - Updated the `LANGS` array in `apps/login/src/lib/i18n.ts` to include Japanese (`{ name: "日本語", code: "ja" }`) - Enables Japanese language selection in the Login UI through browser language detection or manual locale setting # Additional Changes - No additional changes were necessary as other components (Console, email notifications, common messages, Go templates) already have Japanese locale support (`ja.json`/`ja.yaml` files exist) # Additional Context - This contribution enhances ZITADEL's internationalization support for Japanese-speaking users - The translation follows the same structure and key naming conventions as existing locale files - Testing can be performed by setting browser language to Japanese or using `NEXT_LOCALE=ja` cookie Co-authored-by: Max Peintner (cherry picked from commit 27c248fa110fae6668bec3dc48dbe388db44cda1) --- apps/login/locales/ja.json | 333 +++++++++++++++++++++++++++++++++++++ apps/login/src/lib/i18n.ts | 4 + 2 files changed, 337 insertions(+) create mode 100644 apps/login/locales/ja.json diff --git a/apps/login/locales/ja.json b/apps/login/locales/ja.json new file mode 100644 index 00000000000..5e5abeb215b --- /dev/null +++ b/apps/login/locales/ja.json @@ -0,0 +1,333 @@ +{ + "common": { + "back": "戻る", + "title": "ZITADELでログイン" + }, + "accounts": { + "title": "アカウント", + "description": "使用するアカウントを選択してください。", + "addAnother": "別のアカウントを追加", + "noResults": "アカウントが見つかりません", + "verified": "認証済み", + "expired": "期限切れ" + }, + "logout": { + "title": "ログアウト", + "description": "セッションを終了するアカウントをクリックしてください", + "noResults": "アカウントが見つかりません", + "clear": "セッション終了", + "verifiedAt": "最後のアクティブ: {time}", + "success": { + "title": "ログアウト完了", + "description": "正常にログアウトしました。" + } + }, + "loginname": { + "title": "お帰りなさい!", + "description": "ログイン情報を入力してください。", + "register": "新規ユーザー登録", + "submit": "続行", + "labels": { + "loginname": "ログイン名", + "username": "ユーザー名", + "usernameOrPhoneNumber": "ユーザー名または電話番号", + "usernameOrEmail": "ユーザー名またはメールアドレス" + }, + "required": { + "loginName": "必須項目です" + } + }, + "password": { + "verify": { + "title": "パスワード", + "description": "パスワードを入力してください。", + "resetPassword": "パスワードをリセット", + "submit": "続行", + "labels": { + "password": "パスワード" + }, + "required": { + "password": "必須項目です" + } + }, + "set": { + "title": "パスワード設定", + "description": "アカウントのパスワードを設定してください", + "codeSent": "確認コードをメールアドレスに送信しました。", + "noCodeReceived": "コードが届きませんか?", + "resend": "コードを再送信", + "submit": "続行", + "labels": { + "code": "コード", + "newPassword": "新しいパスワード", + "confirmPassword": "パスワード確認" + }, + "required": { + "code": "必須項目です", + "newPassword": "パスワードを入力してください!", + "confirmPassword": "必須項目です" + } + }, + "change": { + "title": "パスワード変更", + "description": "アカウントのパスワードを設定してください", + "submit": "続行", + "labels": { + "newPassword": "新しいパスワード", + "confirmPassword": "パスワード確認" + }, + "required": { + "newPassword": "新しいパスワードを入力してください!", + "confirmPassword": "必須項目です" + } + } + }, + "idp": { + "title": "SSOでサインイン", + "description": "以下のプロバイダーを選択してサインインしてください", + "orSignInWith": "または次でサインイン", + "signInWithApple": "Appleでサインイン", + "signInWithGoogle": "Googleでサインイン", + "signInWithAzureAD": "AzureADでサインイン", + "signInWithGithub": "GitHubでサインイン", + "signInWithGitlab": "GitLabでサインイン", + "loginSuccess": { + "title": "ログイン成功", + "description": "正常にログインしました!" + }, + "linkingSuccess": { + "title": "アカウント連携完了", + "description": "アカウントの連携が完了しました!" + }, + "registerSuccess": { + "title": "登録完了", + "description": "正常に登録されました!" + }, + "loginError": { + "title": "ログイン失敗", + "description": "ログインの際にエラーが発生しました。" + }, + "linkingError": { + "title": "アカウント連携失敗", + "description": "アカウント連携の際にエラーが発生しました。" + }, + "completeRegister": { + "title": "データを完成させる", + "description": "メールアドレスと名前を入力して登録を完了してください。" + } + }, + "ldap": { + "title": "LDAPログイン", + "description": "LDAP認証情報を入力してください。", + "submit": "続行", + "labels": { + "username": "ユーザー名", + "password": "パスワード" + }, + "required": { + "username": "必須項目です", + "password": "必須項目です" + } + }, + "mfa": { + "verify": { + "title": "本人確認", + "description": "以下の要素の中から一つを選択してください。", + "noResults": "設定可能な二要素認証がありません。" + }, + "set": { + "title": "二要素認証の設定", + "description": "以下の二要素認証の中から一つを選択してください。", + "skip": "スキップ" + } + }, + "otp": { + "verify": { + "title": "二要素認証", + "totpDescription": "認証アプリからコードを入力してください。", + "smsDescription": "SMSで受信したコードを入力してください。", + "emailDescription": "メールで受信したコードを入力してください。", + "noCodeReceived": "コードが届きませんか?", + "resendCode": "コードを再送信", + "submit": "続行", + "labels": { + "code": "コード" + }, + "required": { + "code": "必須項目です" + } + }, + "set": { + "title": "二要素認証の設定", + "totpDescription": "認証アプリでQRコードをスキャンしてください。", + "smsDescription": "SMSでコードを受信する電話番号を入力してください。", + "emailDescription": "メールでコードを受信するメールアドレスを入力してください。", + "totpRegisterDescription": "QRコードをスキャンするか、URLに手動でアクセスしてください。", + "submit": "続行", + "labels": { + "code": "コード" + }, + "required": { + "code": "必須項目です" + } + } + }, + "passkey": { + "verify": { + "title": "パスキーで認証", + "description": "デバイスが指紋、顔、または画面ロックの入力を求めます", + "usePassword": "パスワードを使用", + "submit": "続行" + }, + "set": { + "title": "パスキーの設定", + "description": "デバイスが指紋、顔、または画面ロックの入力を求めます", + "info": { + "description": "パスキーは、指紋やApple FaceIDなどのデバイス上の認証方法です。", + "link": "パスワードレス認証" + }, + "skip": "スキップ", + "submit": "続行" + } + }, + "u2f": { + "verify": { + "title": "二要素認証", + "description": "デバイスでアカウントを確認してください。" + }, + "set": { + "title": "二要素認証の設定", + "description": "デバイスを二要素認証として設定します。", + "submit": "続行" + } + }, + "register": { + "methods": { + "passkey": "パスキー", + "password": "パスワード" + }, + "disabled": { + "title": "登録が無効", + "description": "登録が無効になっています。管理者にお問い合わせください。" + }, + "missingdata": { + "title": "データが不足", + "description": "登録するにはメールアドレス、姓、名を入力してください。" + }, + "title": "登録", + "description": "ZITADELアカウントを作成します。", + "noMethodAvailableWarning": "使用可能な認証方法がありません。管理者にお問い合わせください。", + "selectMethod": "認証に使用する方法を選択してください", + "agreeTo": "登録するには利用規約に同意する必要があります", + "termsOfService": "利用規約", + "privacyPolicy": "プライバシーポリシー", + "submit": "続行", + "password": { + "title": "パスワード設定", + "description": "アカウントのパスワードを設定してください", + "submit": "続行", + "labels": { + "password": "パスワード", + "confirmPassword": "パスワード確認" + }, + "required": { + "password": "パスワードを入力してください!", + "confirmPassword": "必須項目です" + } + }, + "labels": { + "firstname": "名", + "lastname": "姓", + "email": "メールアドレス" + }, + "required": { + "firstname": "必須項目です", + "lastname": "必須項目です", + "email": "必須項目です" + } + }, + "invite": { + "title": "ユーザー招待", + "description": "招待するユーザーのメールアドレスと名前を入力してください。", + "info": "ユーザーには詳細な手順が記載されたメールが送信されます。", + "notAllowed": "設定によりユーザーを招待できません。", + "submit": "続行", + "success": { + "title": "ユーザーを招待しました", + "description": "メールが正常に送信されました。", + "verified": "ユーザーが招待され、既にメールアドレスが確認済みです。", + "notVerifiedYet": "ユーザーが招待されました。詳細な手順が記載されたメールを受信します。", + "submit": "別のユーザーを招待" + } + }, + "signedin": { + "title": "ようこそ {user}さん!", + "description": "サインインしました。", + "continue": "続行", + "error": { + "title": "エラー", + "description": "サインインの際にエラーが発生しました。" + } + }, + "verify": { + "userIdMissing": "ユーザーIDが指定されていません!", + "successTitle": "ユーザー確認完了", + "successDescription": "ユーザーの確認が正常に完了しました。", + "setupAuthenticator": "認証の設定", + "verify": { + "title": "ユーザー確認", + "description": "確認メールに記載されたコードを入力してください。", + "noCodeReceived": "コードが届きませんか?", + "resendCode": "コードを再送信", + "codeSent": "確認コードをメールアドレスに送信しました。", + "submit": "続行", + "labels": { + "code": "コード" + }, + "required": { + "code": "必須項目です" + } + } + }, + "authenticator": { + "title": "認証方法を選択", + "description": "認証に使用する方法を選択してください", + "noMethodsAvailable": "使用可能な認証方法がありません", + "allSetup": "認証の設定は既に完了しています!", + "linkWithIDP": "またはIDプロバイダーと連携" + }, + "device": { + "usercode": { + "title": "デバイスコード", + "description": "アプリまたはデバイスに表示されるコードを入力してください。", + "submit": "続行", + "labels": { + "code": "コード" + }, + "required": { + "code": "必須項目です" + } + }, + "request": { + "title": "{appName}が接続を要求しています", + "description": "{appName}は以下にアクセスします:", + "disclaimer": "「許可」をクリックすることで、{appName}とZitadelがそれぞれの利用規約およびプライバシーポリシーに従ってあなたの情報を使用することを許可します。このアクセスはいつでも取り消すことができます。", + "submit": "許可", + "deny": "拒否" + }, + "scope": { + "openid": "本人確認を行います。", + "email": "メールアドレスを表示します。", + "profile": "すべてのプロフィール情報を表示します。", + "offline_access": "アカウントへのオフラインアクセスを許可します。" + } + }, + "error": { + "noUserCode": "ユーザーコードが指定されていません!", + "noDeviceRequest": "デバイスリクエストが見つかりません。", + "unknownContext": "ユーザーのコンテキストを取得できませんでした。最初にユーザー名を入力するか、検索パラメータとしてloginNameを指定してください。", + "sessionExpired": "現在のセッションが期限切れです。再度ログインしてください。", + "failedLoading": "データの読み込みに失敗しました。再試行してください。", + "tryagain": "再試行" + } +} diff --git a/apps/login/src/lib/i18n.ts b/apps/login/src/lib/i18n.ts index 780d9a98f2c..73697df2365 100644 --- a/apps/login/src/lib/i18n.ts +++ b/apps/login/src/lib/i18n.ts @@ -36,6 +36,10 @@ export const LANGS: Lang[] = [ name: "Türkçe", code: "tr", }, + { + name: "日本語", + code: "ja", + }, ]; export const LANGUAGE_COOKIE_NAME = "NEXT_LOCALE";