From e3266d74aa035bcdc10a5a1ac63ca00c785951d1 Mon Sep 17 00:00:00 2001 From: kimatata <117462761+kimatata@users.noreply.github.com> Date: Sun, 9 Nov 2025 10:58:01 +0900 Subject: [PATCH] chore: add test to check locale message keys consistency (#329) --- frontend/messages/ja.json | 19 +++++++++--------- frontend/messages/strings.test.ts | 33 +++++++++++++++++++++++++++++++ 2 files changed, 42 insertions(+), 10 deletions(-) create mode 100644 frontend/messages/strings.test.ts diff --git a/frontend/messages/ja.json b/frontend/messages/ja.json index b7fbd88..5b961d6 100644 --- a/frontend/messages/ja.json +++ b/frontend/messages/ja.json @@ -15,7 +15,6 @@ "skipped": "スキップ" }, "Priority": { - "priority": "優先度", "critical": "致", "high": "高", "medium": "中", @@ -136,6 +135,14 @@ "current_password_incorrect": "現在のパスワードが正しくありません", "update_error": "更新に失敗しました" }, + "Health": { + "health_check": "ヘルスチェック", + "status": "ステータス", + "ok": "正常", + "error": "エラー", + "api_server": "APIサーバー", + "unittcms_version": "UnitTCMS バージョン" + }, "Admin": { "user_management": "ユーザー管理", "avatar": "アバター", @@ -154,14 +161,6 @@ "lost_admin_auth": "管理者権限を失いました", "at_least": "最低1人以上の管理者が必要です。" }, - "Health": { - "health_check": "ヘルスチェック", - "status": "ステータス", - "ok": "正常", - "error": "エラー", - "api_server": "APIサーバー", - "unittcms_version": "UnitTCMS バージョン" - }, "Projects": { "project_list": "プロジェクト一覧", "new_project": "新規プロジェクト", @@ -314,8 +313,8 @@ "refresh": "再読み込み", "id": "ID", "title": "タイトル", - "description": "詳細", "please_enter": "タイトルを入力してください", + "description": "詳細", "priority": "優先度", "status": "ステータス", "actions": "アクション", diff --git a/frontend/messages/strings.test.ts b/frontend/messages/strings.test.ts new file mode 100644 index 0000000..45c2809 --- /dev/null +++ b/frontend/messages/strings.test.ts @@ -0,0 +1,33 @@ +import { describe, it, expect } from 'vitest'; +import en from './en.json'; +import ja from './ja.json'; +import ptBR from './pt-BR.json'; + +function getAllKeys(obj: unknown, prefix = ''): string[] { + if (typeof obj !== 'object' || obj === null) return []; + return Object.entries(obj as Record).flatMap(([key, value]) => { + const fullKey = prefix ? `${prefix}.${key}` : key; + if (value && typeof value === 'object' && !Array.isArray(value)) { + return getAllKeys(value, fullKey); + } + return [fullKey]; + }); +} + +describe('Locale message keys consistency', () => { + const locales = [ + { name: 'en', data: en }, + { name: 'ja', data: ja }, + { name: 'pt-BR', data: ptBR }, + ]; + + const base = locales[0]; + const baseKeys = getAllKeys(base.data); + + for (const locale of locales.slice(1)) { + it(`should have the same keys as ${base.name} in ${locale.name}`, () => { + const localeKeys = getAllKeys(locale.data); + expect(localeKeys).toEqual(baseKeys); + }); + } +});