You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
79 lines
2.2 KiB
79 lines
2.2 KiB
4 years ago
|
// //////////////////////////////////////////////////////////////////////////////
|
||
|
//
|
||
|
// Reports on missing localized strings
|
||
|
//
|
||
|
// usage:
|
||
|
//
|
||
|
// node app/scripts/missing-locale-strings.js [<locale>] [--verbose]
|
||
|
//
|
||
|
// This script will report on any missing localized strings. It will compare the
|
||
|
// chosen locale (or all locales, if none is chosen) with the `en` locale, and
|
||
|
// report the coverage percentage.
|
||
|
//
|
||
|
// The optional '--verbose' argument will print the key for each localized string
|
||
|
// to the console.
|
||
|
//
|
||
|
// //////////////////////////////////////////////////////////////////////////////
|
||
|
|
||
|
const log = require('loglevel')
|
||
|
const localeIndex = require('../app/_locales/index.json')
|
||
|
const { compareLocalesForMissingItems, getLocale } = require('./lib/locales')
|
||
|
|
||
|
log.setDefaultLevel('info')
|
||
|
|
||
|
let verbose = false
|
||
|
let specifiedLocale
|
||
|
for (const arg of process.argv.slice(2)) {
|
||
|
if (arg === '--verbose') {
|
||
|
verbose = true
|
||
|
} else {
|
||
|
specifiedLocale = arg
|
||
|
}
|
||
|
}
|
||
|
|
||
|
main().catch((error) => {
|
||
|
log.error(error)
|
||
|
process.exit(1)
|
||
|
})
|
||
|
|
||
|
async function main() {
|
||
|
if (specifiedLocale === 'en') {
|
||
|
throw new Error(
|
||
|
`Can't compare 'en' locale to itself to find missing messages`,
|
||
|
)
|
||
|
} else if (specifiedLocale) {
|
||
|
await reportMissingMessages(specifiedLocale)
|
||
|
} else {
|
||
|
const localeCodes = localeIndex
|
||
|
.filter((localeMeta) => localeMeta.code !== 'en')
|
||
|
.map((localeMeta) => localeMeta.code)
|
||
|
|
||
|
for (const code of localeCodes) {
|
||
|
await reportMissingMessages(code)
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
async function reportMissingMessages(code) {
|
||
|
const englishLocale = await getLocale('en')
|
||
|
const targetLocale = await getLocale(code)
|
||
|
|
||
|
const missingItems = compareLocalesForMissingItems({
|
||
|
base: englishLocale,
|
||
|
subject: targetLocale,
|
||
|
})
|
||
|
|
||
|
const englishEntryCount = Object.keys(englishLocale).length
|
||
|
const coveragePercent =
|
||
|
(100 * (englishEntryCount - missingItems.length)) / englishEntryCount
|
||
|
|
||
|
log.info(`**${code}**: ${coveragePercent.toFixed(2)}% coverage`)
|
||
|
if (missingItems.length && verbose) {
|
||
|
console.log(`**${code}**: ${missingItems.length} missing messages`)
|
||
|
log.info('Extra items that should not be localized:')
|
||
|
missingItems.forEach(function (key) {
|
||
|
log.info(` - [ ] ${key}`)
|
||
|
})
|
||
|
}
|
||
|
}
|