Цикл Gulp неправильно отображает тег locale в шаблоне Nunjucks

#javascript #gulp #locale #nunjucks #gulp-nunjucks-render

#javascript #gulp #locale #nunjucks #gulp-nunjucks-render

Вопрос:

Я создал задачу gulp для создания четырех страниц на основе одного и того же шаблона для разных языков / локалей. Локалями являются: en-US , en-CA , en-NZ и en-AU . Раньше это была просто простая задача, написанная четыре раза — по одному разу для каждой локали, с внесением изменений вручную.

en-AU это базовый URL (без префикса), а остальные — website.com/en-us/ etc.

Вот задача Gulp:

 let localeList = Object.keys(config.locales);
let localePaths = Object.values(config.locales);

gulp.task('contentful:blog-page', () => {
    return loadBlogArticles()
      .then((res) => {
        for ( locale in localeList ) {
            var path = `pages/${localePaths[locale].toLowerCase()}` 
            
            if (localeList[locale] === 'enAU') {
                path = 'pages'
            }

            gulp.src('pages/templates/blog.njk')
            .pipe(data(() => ({ items: res.items.map(toBlogArticle(res.includes.Entry, res.includes.Asset)), locale: config.locales[localeList[locale]] })))
            .pipe(nunjucksRender({ path: [config.paths.pages.templates] }))
            .pipe(gulp.dest(path))
        }
      }
      )
      .catch((err) => Promise.reject(new Error(`failed fetching blog articles from contentful: ${err.message ? err.message : JSON.stringify(err)}`)))
});
 

Хотя он сгенерировал все страницы в их правильных подкаталогах, locale: config.locales[localeList[locale]] это вызывает у меня проблемы.

Он устанавливает все локали en-US на странице блога, но если я добавлю console.log(config.locales[localeList[locale]]) в цикл, он распечатает их отдельно, как и должно быть. Это очень озадачивает.

Любая помощь будет оценена!

Комментарии:

1. Это классическая ошибка с закрытием. Используйте let в своем for цикле для locale var, это должно решить вашу проблему.

2. Спасибо, я попробую — где именно я должен использовать let? Должен ли я объявлять его в начале цикла for?

3. где вы его инициализируете — for (let locale...

4. Интересно, что, похоже, это также работает с решением, которое я прокомментировал ниже. Спасибо!

Ответ №1:

Это была ошибка закрытия — добавление let localeKey = localeList[locale] и замена других экземпляров localeList[locale] with localeKey , казалось, решили проблему.

Решаемая благодаря комментарию Леши ниже