Spaces:
Build error
Build error
/** | |
* Pre-commit hook script to check for translation completeness | |
* This script ensures that all translation keys have entries for all supported languages | |
*/ | |
const fs = require('fs'); | |
const path = require('path'); | |
// Load the translation file | |
const translationJsonPath = path.join(__dirname, '../src/i18n/translation.json'); | |
const translationJson = require(translationJsonPath); | |
// Load the available languages from the i18n index file | |
const i18nIndexPath = path.join(__dirname, '../src/i18n/index.ts'); | |
const i18nIndexContent = fs.readFileSync(i18nIndexPath, 'utf8'); | |
// Extract the language codes from the AvailableLanguages array | |
const languageCodesRegex = /\{ label: "[^"]+", value: "([^"]+)" \}/g; | |
const supportedLanguageCodes = []; | |
let match; | |
while ((match = languageCodesRegex.exec(i18nIndexContent)) !== null) { | |
supportedLanguageCodes.push(match[1]); | |
} | |
// Track missing and extra translations | |
const missingTranslations = {}; | |
const extraLanguages = {}; | |
let hasErrors = false; | |
// Check each translation key | |
Object.entries(translationJson).forEach(([key, translations]) => { | |
// Get the languages available for this key | |
const availableLanguages = Object.keys(translations); | |
// Find missing languages for this key | |
const missing = supportedLanguageCodes.filter( | |
(langCode) => !availableLanguages.includes(langCode) | |
); | |
if (missing.length > 0) { | |
missingTranslations[key] = missing; | |
hasErrors = true; | |
} | |
// Find extra languages for this key | |
const extra = availableLanguages.filter( | |
(langCode) => !supportedLanguageCodes.includes(langCode) | |
); | |
if (extra.length > 0) { | |
extraLanguages[key] = extra; | |
hasErrors = true; | |
} | |
}); | |
// Generate detailed error message if there are missing translations | |
if (Object.keys(missingTranslations).length > 0) { | |
console.error('\x1b[31m%s\x1b[0m', 'ERROR: Missing translations detected'); | |
console.error(`Found ${Object.keys(missingTranslations).length} translation keys with missing languages:`); | |
Object.entries(missingTranslations).forEach(([key, langs]) => { | |
console.error(`- Key "${key}" is missing translations for: ${langs.join(', ')}`); | |
}); | |
console.error('\nPlease add the missing translations before committing.'); | |
} | |
// Generate detailed error message if there are extra languages | |
if (Object.keys(extraLanguages).length > 0) { | |
console.error('\x1b[31m%s\x1b[0m', 'ERROR: Extra languages detected'); | |
console.error(`Found ${Object.keys(extraLanguages).length} translation keys with extra languages not in AvailableLanguages:`); | |
Object.entries(extraLanguages).forEach(([key, langs]) => { | |
console.error(`- Key "${key}" has translations for unsupported languages: ${langs.join(', ')}`); | |
}); | |
console.error('\nPlease remove the extra languages before committing.'); | |
} | |
// Exit with error code if there are issues | |
if (hasErrors) { | |
process.exit(1); | |
} else { | |
console.log('\x1b[32m%s\x1b[0m', 'All translation keys have complete language coverage!'); | |
} |