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