diff --git a/application/src/components/dashboard/Header.tsx b/application/src/components/dashboard/Header.tsx
index 0e0815d..143789a 100644
--- a/application/src/components/dashboard/Header.tsx
+++ b/application/src/components/dashboard/Header.tsx
@@ -129,6 +129,9 @@ export const Header = ({
setLanguage("de")} className={language === "de" ? "bg-accent" : ""}>
{t("Deutsch")}
+ setLanguage("ja")} className={language === "ja" ? "bg-accent" : ""}>
+ {t("japanese")}
+
diff --git a/application/src/translations/index.ts b/application/src/translations/index.ts
index e087b36..8ae73b8 100644
--- a/application/src/translations/index.ts
+++ b/application/src/translations/index.ts
@@ -1,13 +1,15 @@
import enTranslations from './en';
import kmTranslations from './km';
import deTranslations from './de';
+import jaTranslations from './ja';
-export type Language = "en" | "km" | "de";
+export type Language = "en" | "km" | "de" | "ja";
export const translations = {
en: enTranslations,
km: kmTranslations,
de: deTranslations,
+ ja: jaTranslations,
};
// Type for accessing translations by module and key
diff --git a/application/src/translations/ja/about.ts b/application/src/translations/ja/about.ts
new file mode 100644
index 0000000..b8965f1
--- /dev/null
+++ b/application/src/translations/ja/about.ts
@@ -0,0 +1,17 @@
+import { AboutTranslations } from '../types/about';
+
+export const aboutTranslations: AboutTranslations = {
+ aboutCheckcle: "Checkcleについて",
+ systemDescription: "Checkcleは、サーバーとサービスの健全性に関するリアルタイム監視、インシデント管理、運用の透明性を提供するオープンソースの監視スタックです。MIT ライセンスの下で公開されています。",
+ systemVersion: "システムバージョン",
+ license: "ライセンス",
+ mitLicense: "MIT ライセンス",
+ links: "リンク",
+ viewOnGithub: "GitHubで表示",
+ viewDocumentation: "ドキュメントを表示",
+ followOnX: "Xでフォロー",
+ joinDiscord: "Discordに参加",
+ quickActions: "クイックアクション",
+ quickActionsDescription: "一般的な監視操作と機能に素早くアクセスできます。開始するには、以下のアクションを選択してください。",
+ quickTips: "クイックヒント",
+};
\ No newline at end of file
diff --git a/application/src/translations/ja/common.ts b/application/src/translations/ja/common.ts
new file mode 100644
index 0000000..dedc536
--- /dev/null
+++ b/application/src/translations/ja/common.ts
@@ -0,0 +1,29 @@
+import { CommonTranslations } from '../types/common';
+
+export const commonTranslations: CommonTranslations = {
+ welcome: "ようこそ",
+ logout: "ログアウト",
+ language: "言語",
+ english: "English",
+ khmer: "Khmer",
+ german: "Deutsch",
+ japanese: "日本語",
+ goodMorning: "おはようございます",
+ goodAfternoon: "こんにちは",
+ goodEvening: "こんばんは",
+ profile: "プロファイル",
+ settings: "設定",
+ documentation: "ドキュメント",
+ notifications: "通知",
+ close: "閉じる",
+ cancel: "キャンセル",
+ view: "表示",
+ edit: "編集",
+ delete: "削除",
+ status: "ステータス",
+ time: "時間",
+ title: "タイトル",
+ description: "説明",
+ success: "成功",
+ error: "エラー",
+};
\ No newline at end of file
diff --git a/application/src/translations/ja/incident.ts b/application/src/translations/ja/incident.ts
new file mode 100644
index 0000000..b591f3c
--- /dev/null
+++ b/application/src/translations/ja/incident.ts
@@ -0,0 +1,54 @@
+import { IncidentTranslations } from '../types/incident';
+
+export const incidentTranslations: IncidentTranslations = {
+ incidentManagement: 'インシデント管理',
+ incidentsManagementDesc: 'サービスのインシデントとその解決を追跡・管理する',
+ unresolvedIncidents: '未解決',
+ resolvedIncidents: '解決済み',
+ activeIncidents: 'アクティブなインシデント',
+ criticalIssues: '重要な問題',
+ avgResolutionTime: '平均解決時間',
+ noIncidents: 'アクティブなインシデントはありません',
+ createIncident: 'インシデントを作成',
+ investigating: '調査中',
+ identified: '特定済み',
+ monitoring: '監視中',
+ resolved: '解決済み',
+ scheduleIncidentManagement: 'スケジュール・インシデント管理',
+ incidentName: 'インシデント名',
+ incidentStatus: 'インシデントステータス',
+ highPriority: '高優先度',
+ configurationSettings: '設定',
+ incidentCreatedSuccess: 'インシデントが正常に作成されました',
+ basicInfo: '基本情報',
+ serviceId: 'サービスID',
+ assignedTo: '担当者',
+ unassigned: '未割り当て',
+ timeline: 'タイムライン',
+ incidentTime: 'インシデント発生時刻',
+ resolutionTime: '解決時刻',
+ systems: 'システム',
+ noSystems: '影響を受けるシステムはありません',
+ impactAnalysis: '影響分析',
+ rootCause: '根本原因',
+ resolutionSteps: '解決手順',
+ lessonsLearned: '学んだ教訓',
+ resolutionDetails: '解決詳細',
+ assignment: '割り当て',
+ download: 'ダウンロード',
+ downloadPdf: 'PDFダウンロード',
+ print: '印刷',
+ confidentialNote: 'この文書は機密情報であり、内部使用のみを目的としています。',
+ generatedOn: '生成日時',
+ enterResolutionSteps: 'インシデント解決のために取った手順を入力してください',
+ enterLessonsLearned: 'このインシデントから学んだ教訓を入力してください',
+ editIncident: 'インシデントを編集',
+ editIncidentDesc: 'このインシデントの詳細を更新',
+ updating: '更新中...',
+ update: '更新',
+ create: '作成',
+ creating: '作成中...',
+ configuration: '設定',
+ failedToUpdateStatus: 'ステータスの更新に失敗しました',
+ inProgress: '進行中',
+};
\ No newline at end of file
diff --git a/application/src/translations/ja/index.ts b/application/src/translations/ja/index.ts
new file mode 100644
index 0000000..1359325
--- /dev/null
+++ b/application/src/translations/ja/index.ts
@@ -0,0 +1,24 @@
+import { Translations } from '../types';
+import { commonTranslations } from './common';
+import { menuTranslations } from './menu';
+import { loginTranslations } from './login';
+import { aboutTranslations } from './about';
+import { servicesTranslations } from './services';
+import { maintenanceTranslations } from './maintenance';
+import { incidentTranslations } from './incident';
+import { sslTranslations } from './ssl';
+import { settingsTranslations } from './settings';
+
+const jaTranslations: Translations = {
+ common: commonTranslations,
+ menu: menuTranslations,
+ login: loginTranslations,
+ about: aboutTranslations,
+ services: servicesTranslations,
+ maintenance: maintenanceTranslations,
+ incident: incidentTranslations,
+ ssl: sslTranslations,
+ settings: settingsTranslations
+};
+
+export default jaTranslations;
\ No newline at end of file
diff --git a/application/src/translations/ja/login.ts b/application/src/translations/ja/login.ts
new file mode 100644
index 0000000..8a923ea
--- /dev/null
+++ b/application/src/translations/ja/login.ts
@@ -0,0 +1,22 @@
+import { LoginTranslations } from '../types/login';
+
+export const loginTranslations: LoginTranslations = {
+ signInToYourAccount: "アカウントにサインイン",
+ dontHaveAccount: "アカウントをお持ちでない場合",
+ createOne: "作成する",
+ signInWithGoogle: "Googleでサインイン",
+ orContinueWith: "または",
+ email: "メール",
+ password: "パスワード",
+ forgot: "忘れた場合",
+ signIn: "サインイン",
+ signingIn: "サインイン中...",
+ loginSuccessful: "ログイン成功",
+ loginSuccessMessage: "正常にログインしました。",
+ loginFailed: "ログイン失敗",
+ authenticationFailed: "認証に失敗しました",
+ bySigningIn: "サインインすることで、",
+ termsAndConditions: "利用規約",
+ and: "と",
+ privacyPolicy: "プライバシーポリシー",
+};
\ No newline at end of file
diff --git a/application/src/translations/ja/maintenance.ts b/application/src/translations/ja/maintenance.ts
new file mode 100644
index 0000000..393d3ab
--- /dev/null
+++ b/application/src/translations/ja/maintenance.ts
@@ -0,0 +1,67 @@
+import { MaintenanceTranslations } from '../types/maintenance';
+
+export const maintenanceTranslations: MaintenanceTranslations = {
+ scheduledMaintenance: 'スケジュール済みメンテナンス',
+ scheduledMaintenanceDesc: 'システムとサービスの計画されたメンテナンスウィンドウを表示・管理',
+ upcomingMaintenance: '予定',
+ ongoingMaintenance: '実行中',
+ completedMaintenance: '完了',
+ createMaintenanceWindow: 'メンテナンス作成',
+ totalScheduledHours: '総スケジュール時間',
+ maintenanceName: 'メンテナンス名',
+ maintenanceStatus: 'ステータス',
+ scheduledStart: 'スケジュール開始',
+ scheduledEnd: 'スケジュール終了',
+ affectedServices: '影響を受けるサービス',
+ impact: '影響',
+ minor: '軽微',
+ major: '重要',
+ critical: '重大',
+ none: 'なし',
+ actions: 'アクション',
+ scheduled: 'スケジュール済み',
+ inprogress: '進行中',
+ completed: '完了',
+ cancelled: 'キャンセル',
+ markAsInProgress: '進行中としてマーク',
+ markAsCompleted: '完了としてマーク',
+ markAsCancelled: 'キャンセルとしてマーク',
+ confirmDelete: '削除確認',
+ deleteMaintenanceConfirmation: 'このメンテナンスウィンドウを削除してもよろしいですか?',
+ thisActionCannotBeUndone: 'この操作は元に戻せません。',
+ maintenanceDeleted: 'メンテナンス削除完了',
+ maintenanceDeletedDesc: 'メンテナンスウィンドウが正常に削除されました。',
+ errorDeletingMaintenance: 'メンテナンスウィンドウの削除中にエラーが発生しました。',
+ statusUpdated: 'ステータス更新完了',
+ maintenanceStatusUpdated: 'メンテナンスステータスが正常に更新されました。',
+ errorUpdatingMaintenanceStatus: 'メンテナンスステータスの更新中にエラーが発生しました。',
+ createMaintenance: 'メンテナンス作成',
+ createMaintenanceDesc: 'サービスの新しいメンテナンスウィンドウをスケジュール',
+ enterTitle: 'メンテナンスタイトルを入力',
+ enterDescription: 'メンテナンスの詳細説明を入力',
+ startTime: '開始時刻',
+ endTime: '終了時刻',
+ selectDate: '日付を選択',
+ enterAffectedServices: '影響を受けるサービスを入力',
+ separateServicesWithComma: '複数のサービスはカンマで区切ってください',
+ priority: '優先度',
+ selectPriority: '優先度を選択',
+ selectStatus: 'ステータスを選択',
+ selectImpact: '影響を選択',
+ notifySubscribers: '購読者に通知',
+ notifySubscribersDesc: 'このメンテナンスが開始されたときに全購読者に通知を送信',
+ maintenanceCreated: 'メンテナンス作成完了',
+ maintenanceCreatedDesc: 'メンテナンスウィンドウが正常にスケジュールされました。',
+ errorCreatingMaintenance: 'メンテナンスウィンドウの作成中にエラーが発生しました。',
+ errorFetchingMaintenanceData: 'メンテナンスデータの取得中にエラーが発生しました。',
+ low: '低',
+ medium: '中',
+ high: '高',
+ created: '作成済み',
+ lastUpdated: '最終更新',
+ subscribersWillBeNotified: 'メンテナンス開始時に購読者に通知されます',
+ noNotifications: '通知は送信されません',
+ noScheduledMaintenance: 'スケジュール済みメンテナンスなし',
+ noMaintenanceWindows: 'この期間にメンテナンスウィンドウはありません。「メンテナンス作成」ボタンをクリックして作成してください。',
+ maintenanceCreatedSuccess: 'メンテナンスウィンドウが正常に作成されました',
+};
\ No newline at end of file
diff --git a/application/src/translations/ja/menu.ts b/application/src/translations/ja/menu.ts
new file mode 100644
index 0000000..cda8377
--- /dev/null
+++ b/application/src/translations/ja/menu.ts
@@ -0,0 +1,20 @@
+import { MenuTranslations } from '../types/menu';
+
+export const menuTranslations: MenuTranslations = {
+ uptimeMonitoring: "稼働監視",
+ instanceMonitoring: "インスタンス監視",
+ sslDomain: "SSL・ドメイン",
+ scheduleIncident: "スケジュール・インシデント",
+ operationalPage: "運用ページ",
+ reports: "レポート",
+ regionalMonitoring: "地域監視",
+ settingPanel: "設定パネル",
+ generalSettings: "一般設定",
+ userManagement: "ユーザー管理",
+ notificationSettings: "通知設定",
+ alertsTemplates: "アラートテンプレート",
+ rolesManagement: "ロール管理",
+ dataRetention: "データ保持",
+ backupSettings: "バックアップ設定",
+ aboutSystem: "システム情報",
+};
\ No newline at end of file
diff --git a/application/src/translations/ja/services.ts b/application/src/translations/ja/services.ts
new file mode 100644
index 0000000..668a644
--- /dev/null
+++ b/application/src/translations/ja/services.ts
@@ -0,0 +1,11 @@
+import { ServicesTranslations } from '../types/services';
+
+export const servicesTranslations: ServicesTranslations = {
+ serviceName: "サービス名",
+ serviceType: "サービスタイプ",
+ serviceStatus: "サービスステータス",
+ responseTime: "応答時間",
+ uptime: "稼働時間",
+ lastChecked: "最終チェック",
+ noServices: "フィルタ条件に一致するサービスがありません。",
+};
\ No newline at end of file
diff --git a/application/src/translations/ja/settings.ts b/application/src/translations/ja/settings.ts
new file mode 100644
index 0000000..8c4ec80
--- /dev/null
+++ b/application/src/translations/ja/settings.ts
@@ -0,0 +1,51 @@
+import { SettingsTranslations } from '../types/settings';
+
+export const settingsTranslations: SettingsTranslations = {
+ // タブ
+ systemSettings: "システム設定",
+ mailSettings: "メール設定",
+
+ // システム設定
+ appName: "アプリケーション名",
+ appURL: "アプリケーションURL",
+ senderName: "送信者名",
+ senderEmail: "送信者メールアドレス",
+ hideControls: "コントロールを非表示",
+
+ // メール設定
+ smtpSettings: "SMTP設定",
+ smtpEnabled: "SMTPを有効にする",
+ smtpHost: "SMTPホスト",
+ smtpPort: "SMTPポート",
+ smtpUsername: "SMTPユーザー名",
+ smtpPassword: "SMTPパスワード",
+ smtpAuthMethod: "認証方式",
+ enableTLS: "TLSを有効にする",
+ localName: "ローカル名",
+
+ // テストメール
+ testEmail: "テストメール",
+ sendTestEmail: "テストメールを送信",
+ emailTemplate: "メールテンプレート",
+ verification: "認証",
+ passwordReset: "パスワードリセット",
+ confirmEmailChange: "メールアドレス変更確認",
+ otp: "OTP",
+ loginAlert: "ログインアラート",
+ authCollection: "認証コレクション",
+ selectCollection: "コレクションを選択",
+ toEmailAddress: "宛先メールアドレス",
+ enterEmailAddress: "メールアドレスを入力",
+ sending: "送信中...",
+
+ // アクションとステータス
+ save: "変更を保存",
+ saving: "保存中...",
+ settingsUpdated: "設定が正常に更新されました",
+ errorSavingSettings: "設定の保存中にエラーが発生しました",
+ errorFetchingSettings: "設定の読み込み中にエラーが発生しました",
+ testConnection: "接続テスト",
+ testingConnection: "接続テスト中...",
+ connectionSuccess: "接続成功",
+ connectionFailed: "接続失敗"
+};
\ No newline at end of file
diff --git a/application/src/translations/ja/ssl.ts b/application/src/translations/ja/ssl.ts
new file mode 100644
index 0000000..0dbf247
--- /dev/null
+++ b/application/src/translations/ja/ssl.ts
@@ -0,0 +1,106 @@
+import { SSLTranslations } from '../types/ssl';
+
+export const sslTranslations: SSLTranslations = {
+ // ページとセクションタイトル
+ sslDomainManagement: "SSL・ドメイン管理",
+ monitorSSLCertificates: "ドメインのSSL証明書を監視・管理",
+ addSSLCertificate: "SSL証明書を追加",
+ editSSLCertificate: "SSL証明書を編集",
+ deleteSSLCertificate: "SSL証明書を削除",
+ sslCertificateDetails: "SSL証明書詳細",
+ detailedInfo: "詳細情報:",
+
+ // ステータス関連
+ valid: "有効",
+ expiringSoon: "期限切れ間近",
+ expired: "期限切れ",
+ pending: "保留中",
+
+ // 統計とカード
+ validCertificates: "有効な証明書",
+ expiringSoonCertificates: "期限切れ間近",
+ expiredCertificates: "期限切れ証明書",
+
+ // フォームフィールド
+ domain: "ドメイン",
+ domainName: "ドメイン名",
+ domainCannotChange: "ドメインは作成後変更できません",
+ warningThreshold: "警告閾値",
+ warningThresholdDays: "警告閾値(日)",
+ expiryThreshold: "期限切れ閾値",
+ expiryThresholdDays: "期限切れ閾値(日)",
+ notificationChannel: "通知チャンネル",
+ chooseChannel: "通知チャンネルを選択",
+ whereToSend: "通知の送信先",
+ daysBeforeExpiration: "期限切れ前の警告を受信する日数",
+ daysBeforeCritical: "期限切れ前の重要アラートを受信する日数",
+ getNotifiedExpiration: "証明書の期限切れが近い時に通知を受信",
+ getNotifiedCritical: "証明書の期限切れが非常に近い時に通知を受信",
+
+ // テーブルヘッダーとフィールド
+ issuer: "発行者",
+ expirationDate: "有効期限",
+ daysLeft: "残り日数",
+ status: "ステータス",
+ lastNotified: "最終通知",
+ actions: "アクション",
+ validFrom: "有効開始日",
+ validUntil: "有効終了日",
+ validityDays: "有効期間",
+ organization: "組織",
+ commonName: "コモンネーム",
+ serialNumber: "シリアル番号",
+ algorithm: "アルゴリズム",
+ subjectAltNames: "サブジェクト代替名",
+
+ // ボタンとアクション
+ addDomain: "ドメインを追加",
+ refreshAll: "全て更新",
+ cancel: "キャンセル",
+ addCertificate: "証明書を追加",
+ check: "チェック",
+ view: "表示",
+ edit: "編集",
+ delete: "削除",
+ close: "閉じる",
+ saveChanges: "変更を保存",
+ updating: "更新中",
+
+ // 詳細ビューのセクション
+ basicInformation: "基本情報",
+ validity: "有効性",
+ issuerInfo: "発行者情報",
+ technicalDetails: "技術的詳細",
+ monitoringConfig: "監視設定",
+ recordInfo: "レコード情報",
+
+ // 通知とメッセージ
+ sslCertificateAdded: "SSL証明書が正常に追加されました",
+ sslCertificateUpdated: "SSL証明書が正常に更新されました",
+ sslCertificateDeleted: "SSL証明書が正常に削除されました",
+ sslCertificateRefreshed: "{domain}のSSL証明書が正常に更新されました",
+ allCertificatesRefreshed: "全{count}件の証明書が正常に更新されました",
+ someCertificatesFailed: "{success}件の証明書が更新され、{failed}件が失敗しました",
+ failedToAddCertificate: "SSL証明書の追加に失敗しました",
+ failedToLoadCertificates: "SSL証明書の読み込みに失敗しました",
+ failedToUpdateCertificate: "SSL証明書の更新に失敗しました",
+ failedToDeleteCertificate: "SSL証明書の削除に失敗しました",
+ failedToCheckCertificate: "SSL証明書のチェックに失敗しました",
+ noCertificatesToRefresh: "更新する証明書がありません",
+ startingRefreshAll: "{count}件の証明書の更新を開始しています",
+ checkingSSLCertificate: "SSL証明書をチェック中...",
+ deleteConfirmation: "以下の証明書を削除してもよろしいですか?",
+ deleteWarning: "この操作は元に戻せません。証明書が完全に削除されます。",
+
+ // その他
+ unknown: "不明",
+ never: "なし",
+ none: "なし",
+ loadingChannels: "チャンネル読み込み中...",
+ noChannelsFound: "通知チャンネルが見つかりません",
+ noSSLCertificates: "SSL証明書が見つかりません",
+ created: "作成日",
+ lastUpdated: "最終更新",
+ lastNotification: "最終通知",
+ collectionId: "コレクションID"
+};
\ No newline at end of file