fall back to English on corrupt content files (#32629)
This commit is contained in:
@@ -1,6 +1,20 @@
|
||||
import path from 'path'
|
||||
import fs from 'fs/promises'
|
||||
import Page from './page.js'
|
||||
|
||||
import languages from './languages.js'
|
||||
import Page, { FrontmatterErrorsError } from './page.js'
|
||||
|
||||
// If you run `export DEBUG_TRANSLATION_FALLBACKS=true` in your terminal,
|
||||
// every time a translation file fails to initialize we fall back to English
|
||||
// and write a warning to stdout.
|
||||
const DEBUG_TRANSLATION_FALLBACKS = Boolean(
|
||||
JSON.parse(process.env.DEBUG_TRANSLATION_FALLBACKS || 'false')
|
||||
)
|
||||
// If you don't want to fall back to English automatically on corrupt
|
||||
// translation files, set `export THROW_TRANSLATION_ERRORS=true`
|
||||
const THROW_TRANSLATION_ERRORS = Boolean(
|
||||
JSON.parse(process.env.THROW_TRANSLATION_ERRORS || 'false')
|
||||
)
|
||||
|
||||
// Module level cache
|
||||
const _basePaths = new Map()
|
||||
@@ -30,11 +44,39 @@ export default async function createTree(originalPath, langObj) {
|
||||
const relativePath = filepath.replace(`${basePath}/`, '')
|
||||
|
||||
// Initialize the Page! This is where the file reads happen.
|
||||
const page = await Page.init({
|
||||
basePath,
|
||||
relativePath,
|
||||
languageCode: langObj.code,
|
||||
})
|
||||
let page
|
||||
try {
|
||||
page = await Page.init({
|
||||
basePath,
|
||||
relativePath,
|
||||
languageCode: langObj.code,
|
||||
})
|
||||
} catch (err) {
|
||||
if (
|
||||
!THROW_TRANSLATION_ERRORS &&
|
||||
err instanceof FrontmatterErrorsError &&
|
||||
langObj.code !== 'en'
|
||||
) {
|
||||
// Something corrupt in the `.md` file caused it to throw an
|
||||
// error from reading it in. Let's "gracefully" recover by
|
||||
// swapping this one out for the English content and pretend it
|
||||
// exists in this other language.
|
||||
const englishBasePath = getBasePath(languages.en.dir)
|
||||
page = await Page.init({
|
||||
basePath: englishBasePath,
|
||||
relativePath,
|
||||
languageCode: langObj.code,
|
||||
})
|
||||
if (DEBUG_TRANSLATION_FALLBACKS) {
|
||||
console.warn(
|
||||
`Unable to initialized ${path.join(basePath, relativePath)} due to frontmatter errors. ` +
|
||||
`Will proceed with using ${path.join(englishBasePath, relativePath)} instead.`
|
||||
)
|
||||
}
|
||||
} else {
|
||||
throw err
|
||||
}
|
||||
}
|
||||
|
||||
if (!page) {
|
||||
// Do not throw an error if Early Access is not available.
|
||||
|
||||
Reference in New Issue
Block a user