feat: add Japanese (ja-JP) language support (#1537)

* feat: add Japanese (ja-JP) language support

- Add comprehensive Japanese translation file (ja-JP.ts)
- Update i18n configuration to include Japanese locale
- Add Japanese language option to login and register page dropdowns
- Implement Japanese language detection and switching logic
- Maintain fallback to en-US for missing translations in flexible components

Co-Authored-By: Junyan Qin <Chin>, 秦骏言 in Chinese, you can call me my english name Rock Chin. <rockchinq@gmail.com>

* perf: ui for ja-JP

---------

Co-authored-by: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com>
Co-authored-by: Junyan Qin <Chin>, 秦骏言 in Chinese, you can call me my english name Rock Chin. <rockchinq@gmail.com>
This commit is contained in:
devin-ai-integration[bot]
2025-06-16 21:30:57 +08:00
committed by GitHub
parent 208273c0dd
commit 56c686cd5a
5 changed files with 256 additions and 1 deletions

View File

@@ -65,7 +65,7 @@
}
.sidebarChildContainer {
width: 9rem;
width: 9.8rem;
height: 3rem;
padding-left: 1.6rem;
font-size: 1rem;

View File

@@ -64,6 +64,9 @@ export default function Login() {
if (i18n.language === 'zh-CN' || i18n.language === 'zh-Hans') {
setCurrentLanguage('zh-Hans');
localStorage.setItem('langbot_language', 'zh-Hans');
} else if (i18n.language === 'ja' || i18n.language === 'ja-JP') {
setCurrentLanguage('ja-JP');
localStorage.setItem('langbot_language', 'ja-JP');
} else {
setCurrentLanguage('en-US');
localStorage.setItem('langbot_language', 'en-US');
@@ -80,6 +83,8 @@ export default function Login() {
let lang = 'zh-Hans';
if (language === 'zh-CN') {
lang = 'zh-Hans';
} else if (language === 'ja' || language === 'ja-JP') {
lang = 'ja-JP';
} else {
lang = 'en-US';
}
@@ -159,6 +164,7 @@ export default function Login() {
<SelectContent>
<SelectItem value="zh-Hans"></SelectItem>
<SelectItem value="en-US">English</SelectItem>
<SelectItem value="ja-JP"></SelectItem>
</SelectContent>
</Select>
</div>

View File

@@ -63,6 +63,9 @@ export default function Register() {
if (i18n.language === 'zh-CN' || i18n.language === 'zh-Hans') {
setCurrentLanguage('zh-Hans');
localStorage.setItem('langbot_language', 'zh-Hans');
} else if (i18n.language === 'ja' || i18n.language === 'ja-JP') {
setCurrentLanguage('ja-JP');
localStorage.setItem('langbot_language', 'ja-JP');
} else {
setCurrentLanguage('en-US');
localStorage.setItem('langbot_language', 'en-US');
@@ -79,6 +82,8 @@ export default function Register() {
let lang = 'zh-Hans';
if (language === 'zh-CN') {
lang = 'zh-Hans';
} else if (language === 'ja' || language === 'ja-JP') {
lang = 'ja-JP';
} else {
lang = 'en-US';
}
@@ -144,6 +149,7 @@ export default function Register() {
<SelectContent>
<SelectItem value="zh-Hans"></SelectItem>
<SelectItem value="en-US">English</SelectItem>
<SelectItem value="ja-JP"></SelectItem>
</SelectContent>
</Select>
</div>

View File

@@ -6,6 +6,7 @@ import LanguageDetector from 'i18next-browser-languagedetector';
import enUS from './locales/en-US';
import zhHans from './locales/zh-Hans';
import jaJP from './locales/ja-JP';
i18n
.use(LanguageDetector)
@@ -18,6 +19,9 @@ i18n
'zh-Hans': {
translation: zhHans,
},
'ja-JP': {
translation: jaJP,
},
},
fallbackLng: 'zh-Hans',
debug: process.env.NODE_ENV === 'development',

View File

@@ -0,0 +1,239 @@
const jaJP = {
common: {
login: 'ログイン',
logout: 'ログアウト',
email: 'メールアドレス',
password: 'パスワード',
welcome: 'LangBot へおかえりなさい 👋',
continueToLogin: 'ログインしてください',
loginSuccess: 'ログインに成功しました',
loginFailed:
'ログインに失敗しました。メールアドレスまたはパスワードをご確認ください',
enterEmail: 'メールアドレスを入力',
enterPassword: 'パスワードを入力',
invalidEmail: '有効なメールアドレスを入力してください',
emptyPassword: 'パスワードを入力してください',
language: '言語',
helpDocs: 'ヘルプドキュメント',
create: '作成',
edit: '編集',
delete: '削除',
add: '追加',
select: '選択してください',
cancel: 'キャンセル',
submit: '送信',
error: 'エラー',
success: '成功',
save: '保存',
saving: '保存中...',
confirm: '確認',
confirmDelete: '削除の確認',
deleteConfirmation: '本当に削除しますか?',
selectOption: 'オプションを選択',
required: '必須',
enable: '有効にする',
name: '名前',
description: '説明',
close: '閉じる',
deleteSuccess: '削除に成功しました',
deleteError: '削除に失敗しました:',
addRound: 'ラウンドを追加',
copySuccess: 'コピーに成功しました',
test: 'テスト',
},
notFound: {
title: 'ページが見つかりません',
description:
'お探しのページは存在しないようです。入力したURLが正しいか確認するか、ホームページに戻ってください。',
back: '戻る',
home: 'ホームに戻る',
help: 'ヘルプドキュメントを見る',
},
models: {
title: 'モデル設定',
description: 'パイプラインで使用できるモデルを設定・管理',
createModel: 'モデルを作成',
editModel: 'モデルを編集',
getModelListError: 'モデルリストの取得に失敗しました:',
modelName: 'モデル名',
modelProvider: 'モデルプロバイダー',
modelBaseURL: 'ベースURL',
modelAbilities: 'モデル機能',
saveSuccess: '保存に成功しました',
saveError: '保存に失敗しました:',
createSuccess: '作成に成功しました',
createError: '作成に失敗しました:',
deleteSuccess: '削除に成功しました',
deleteError: '削除に失敗しました:',
deleteConfirmation: '本当にこのモデルを削除しますか?',
modelNameRequired: 'モデル名は必須です',
modelProviderRequired: 'モデルプロバイダーは必須です',
requestURLRequired: 'リクエストURLは必須です',
apiKeyRequired: 'APIキーは必須です',
keyNameRequired: 'キー名は必須です',
mustBeValidNumber: '有効な数値である必要があります',
mustBeTrueOrFalse: 'true または false である必要があります',
requestURL: 'リクエストURL',
apiKey: 'APIキー',
abilities: '機能',
selectModelAbilities: 'モデル機能を選択',
visionAbility: '視覚機能',
functionCallAbility: '関数呼び出し',
extraParameters: '追加パラメータ',
addParameter: 'パラメータを追加',
keyName: 'キー名',
type: 'タイプ',
value: '値',
string: '文字列',
number: '数値',
boolean: 'ブール値',
extraParametersDescription:
'リクエストボディに追加されるパラメータmax_tokens、temperature、top_p など)',
selectModelProvider: 'モデルプロバイダーを選択',
modelProviderDescription: 'プロバイダーが提供するモデル名をご入力ください',
selectModel: 'モデルを選択してください',
testSuccess: 'テストに成功しました',
testError: 'テストに失敗しました。モデル設定を確認してください',
},
bots: {
title: 'ボット',
description:
'ボットの作成と管理を行います。LangBotと各プラットフォームを接続するためのエントリーポイントです',
createBot: 'ボットを作成',
editBot: 'ボットを編集',
getBotListError: 'ボットリストの取得に失敗しました:',
botName: 'ボット名',
botDescription: 'ボットの説明',
botNameRequired: 'ボット名は必須です',
botDescriptionRequired: 'ボットの説明は必須です',
adapterRequired: 'アダプターは必須です',
defaultDescription: 'ボット',
getBotConfigError: 'ボット設定の取得に失敗しました:',
saveSuccess: '保存に成功しました',
saveError: '保存に失敗しました:',
createSuccess:
'作成が完了しました。有効化するか、パイプラインの設定を行ってください',
createError: '作成に失敗しました:',
deleteSuccess: '削除に成功しました',
deleteError: '削除に失敗しました:',
deleteConfirmation: '本当にこのボットを削除しますか?',
platformAdapter: 'プラットフォーム/アダプター選択',
selectAdapter: 'アダプターを選択',
adapterConfig: 'アダプター設定',
bindPipeline: 'パイプラインを紐付け',
selectPipeline: 'パイプラインを選択',
botLogTitle: 'ボットログ',
enableAutoRefresh: '自動更新を有効にする',
session: 'セッション',
yesterday: '昨日',
earlier: 'それ以前',
dateFormat: '{{month}}月{{day}}日',
setBotEnableError: 'ボットの有効状態の設定に失敗しました',
log: 'ログ',
},
plugins: {
title: 'プラグイン',
description: 'LangBotの機能を拡張するプラグインをインストール・設定',
createPlugin: 'プラグインを作成',
editPlugin: 'プラグインを編集',
installed: 'インストール済み',
marketplace: 'プラグインマーケット',
arrange: '並び替え',
install: 'インストール',
installFromGithub: 'GitHubからプラグインをインストール',
onlySupportGithub: '現在はGitHubからのインストールのみサポートしています',
enterGithubLink: 'プラグインのGitHubリンクを入力してください',
installing: 'プラグインをインストール中...',
installSuccess: 'プラグインのインストールに成功しました',
installFailed: 'プラグインのインストールに失敗しました:',
searchPlugin: 'プラグインを検索',
sortBy: '並び順',
mostStars: 'スター数順',
recentlyAdded: '最近追加',
recentlyUpdated: '最近更新',
noMatchingPlugins: '一致するプラグインが見つかりません',
loading: '読み込み中...',
getPluginListError: 'プラグインリストの取得に失敗しました:',
noPluginInstalled: 'プラグインがインストールされていません',
pluginConfig: 'プラグイン設定',
pluginSort: 'プラグインの並び替え',
pluginSortDescription:
'プラグインの順序は、同一イベント内での処理順序に影響します。カードをドラッグして並び替えが可能です',
pluginSortSuccess: 'プラグインの並び替えに成功しました',
pluginSortError: 'プラグインの並び替えに失敗しました:',
pluginNoConfig: 'プラグインに設定項目がありません。',
deleting: '削除中...',
deletePlugin: 'プラグインを削除',
cancel: 'キャンセル',
saveConfig: '設定を保存',
saving: '保存中...',
confirmDeletePlugin:
'プラグイン「{{author}}/{{name}}」を削除してもよろしいですか?',
confirmDelete: '削除を確認',
deleteError: '削除に失敗しました:',
close: '閉じる',
deleteConfirm: '削除の確認',
modifyFailed: '変更に失敗しました:',
eventCount: 'イベント:{{count}}',
toolCount: 'ツール:{{count}}',
starCount: 'スター:{{count}}',
},
pipelines: {
title: 'パイプライン',
description:
'メッセージイベントの処理フローを定義し、ボットに紐付けて使用するパイプラインです',
createPipeline: 'パイプラインを作成',
editPipeline: 'パイプラインを編集',
chat: 'チャット',
getPipelineListError: 'パイプラインリストの取得に失敗しました:',
daysAgo: '日前',
today: '今日',
updateTime: '更新日時',
defaultBadge: 'デフォルト',
basicInfo: '基本情報',
aiCapabilities: 'AI機能',
triggerConditions: 'トリガー条件',
safetyControls: '安全制御',
outputProcessing: '出力処理',
nameRequired: '名前は必須です',
descriptionRequired: '説明は必須です',
createSuccess:
'作成が完了しました。パイプラインの詳細パラメータを設定してください',
createError: '作成に失敗しました:',
saveSuccess: '保存に成功しました',
saveError: '保存に失敗しました:',
deleteConfirmation:
'本当にこのパイプラインを削除しますか?このパイプラインに紐付けられたボットは動作しなくなります。',
defaultPipelineCannotDelete: 'デフォルトパイプラインは削除できません',
debugDialog: {
title: 'パイプラインのチャット',
selectPipeline: 'パイプラインを選択',
sessionType: 'セッションタイプ',
privateChat: 'プライベートチャット',
groupChat: 'グループチャット',
send: '送信',
reset: '会話をリセット',
inputPlaceholder: 'メッセージを入力...',
noMessages: 'メッセージがありません',
userMessage: 'ユーザー',
botMessage: 'ボット',
sendFailed: '送信に失敗しました',
resetSuccess: '会話がリセットされました',
resetFailed: 'リセットに失敗しました',
loadMessagesFailed: 'メッセージの読み込みに失敗しました',
loadPipelinesFailed: 'パイプラインの読み込みに失敗しました',
atTips: 'ボットをメンション',
},
},
register: {
title: 'LangBot を初期化 👋',
description: 'これはLangBotの初回起動です',
adminAccountNote:
'入力したメールアドレスとパスワードが初期管理者アカウントになります',
register: '登録',
initSuccess: '初期化に成功しました。ログインしてください',
initFailed: '初期化に失敗しました:',
},
};
export default jaJP;