1
0
Fork 0

feat: Added script to handle strapi translations

This commit is contained in:
Joost De Cock 2022-05-20 13:00:34 +02:00
parent 7d97b8d33c
commit 2cab244947
3 changed files with 59 additions and 16 deletions

3
.gitignore vendored
View file

@ -1,5 +1,8 @@
# See https://help.github.com/ignore-files/ for more about ignoring files. # See https://help.github.com/ignore-files/ for more about ignoring files.
# .env
.env
# Specifics # Specifics
export export
packages/plugin-theme/src/bundle.css.js packages/plugin-theme/src/bundle.css.js

3
example.env Normal file
View file

@ -0,0 +1,3 @@
# Copy this file to .env and adapt it if you want to run `npm run strapi:translate`
STRAPI_USERNAME="someone@freesewing.org"
STRAPI_PASSWORD="superSecretPasswordHere"

View file

@ -1,8 +1,8 @@
import 'dotenv/config'
import axios from 'axios' import axios from 'axios'
const strapiHost = 'https://posts.freesewing.org' const strapiHost = 'https://posts.freesewing.org'
const languages = ['en', 'de', 'fr', 'es', 'nl'] const languages = ['en', 'de', 'fr', 'es', 'nl']
const token = "include your JWT token here (steal it from your browser after logging in to strapi)"
const uris = { const uris = {
showcaseposts: `${strapiHost}/showcaseposts?_limit=-1`, showcaseposts: `${strapiHost}/showcaseposts?_limit=-1`,
@ -39,10 +39,31 @@ const suffix = {
* and add a (translated) [in English] to the title of posts. * and add a (translated) [in English] to the title of posts.
*/ */
/*
* We need to login and get the JWT token
*/
const login = async () => {
let result
const data = {
email: process.env.FS_STRAPI_USERNAME,
password: process.env.FS_STRAPI_PASSWORD,
}
try {
result = await axios.post(`${strapiHost}/admin/login`, data)
if (result?.data?.data?.token) return result.data.data.token
}
catch(err) {
console.log(err)
return false
}
return false
}
/* /*
* Helper method for Authorization header * Helper method for Authorization header
*/ */
const bearer = () => ({ const bearer = token => ({
headers: { Authorization: 'Bearer ' + token } headers: { Authorization: 'Bearer ' + token }
}) })
@ -73,7 +94,7 @@ const getContent = async (type) => {
/* /*
* Adds translations for a showcase post * Adds translations for a showcase post
*/ */
const addShowcasepostTranslations = item => { const addShowcasepostTranslations = (item, token) => {
const promises = [] const promises = []
for (const lang of languages) { for (const lang of languages) {
if (lang !== 'en') { if (lang !== 'en') {
@ -86,8 +107,9 @@ const addShowcasepostTranslations = item => {
title: `${item.content.title} [${suffix[lang]}]`, title: `${item.content.title} [${suffix[lang]}]`,
body: item.content.body, body: item.content.body,
caption: item.content.caption, caption: item.content.caption,
translated: false,
}, },
bearer() bearer(token)
) )
.then(res => { .then(res => {
}) })
@ -105,7 +127,7 @@ const addShowcasepostTranslations = item => {
/* /*
* Adds translations for a blog post * Adds translations for a blog post
*/ */
const addBlogpostTranslations = item => { const addBlogpostTranslations = (item, token) => {
const promises = [] const promises = []
for (const lang of languages) { for (const lang of languages) {
if (lang !== 'en') { if (lang !== 'en') {
@ -119,8 +141,9 @@ const addBlogpostTranslations = item => {
linktitle: item.content.linktitle, linktitle: item.content.linktitle,
body: item.content.body, body: item.content.body,
caption: item.content.caption, caption: item.content.caption,
translated: false,
}, },
bearer() bearer(token)
) )
.then(res => { .then(res => {
}) })
@ -138,7 +161,7 @@ const addBlogpostTranslations = item => {
/* /*
* Adds translations for an author item * Adds translations for an author item
*/ */
const addAuthorTranslations = item => { const addAuthorTranslations = (item, token) => {
const promises = [] const promises = []
for (const lang of languages) { for (const lang of languages) {
if (lang !== 'en') { if (lang !== 'en') {
@ -150,7 +173,7 @@ const addAuthorTranslations = item => {
locale: lang, locale: lang,
about: item.content.about about: item.content.about
}, },
bearer() bearer(token)
) )
.then(res => { .then(res => {
}) })
@ -168,7 +191,7 @@ const addAuthorTranslations = item => {
/* /*
* Adds translations for a maker item * Adds translations for a maker item
*/ */
const addMakerTranslations = item => { const addMakerTranslations = (item, token) => {
const promises = [] const promises = []
for (const lang of languages) { for (const lang of languages) {
if (lang !== 'en') { if (lang !== 'en') {
@ -180,7 +203,7 @@ const addMakerTranslations = item => {
locale: lang, locale: lang,
about: item.content.about about: item.content.about
}, },
bearer() bearer(token)
) )
.then(res => { .then(res => {
}) })
@ -198,23 +221,37 @@ const addMakerTranslations = item => {
/* /*
* One method to call that will add translations * One method to call that will add translations
*/ */
const addTranslations = async (type, content) => { const addTranslations = async (type, content, token) => {
if (type === 'showcaseposts') return await addShowcasepostTranslations(content) if (type === 'showcaseposts') return await addShowcasepostTranslations(content, token)
if (type === 'blogposts') return await addBlogpostTranslations(content) if (type === 'blogposts') return await addBlogpostTranslations(content, token)
if (type === 'makers') return await addMakerTranslations(content) if (type === 'makers') return await addMakerTranslations(content, token)
if (type === 'authors') return await addAuthorTranslations(content) if (type === 'authors') return await addAuthorTranslations(content, token)
return false return false
} }
const getToWork = async () => { const getToWork = async () => {
if (!process.env.FS_STRAPI_USERNAME || !process.env.FS_STRAPI_PASSWORD) {
console.log(`
You need to set the following environment variables to run this script:
- FS_STRAPI_USERNAME
- FS_STRAPi_PASSWORD
`)
process.exit()
}
const token = await login()
if (!token) {
console.log('Failed to login to strapi')
process.exit()
}
const content = {} const content = {}
const translations = languages.length - 1 const translations = languages.length - 1
for (const type of Object.keys(uris)) { for (const type of Object.keys(uris)) {
console.log(`Loading ${type} from Strapi`) console.log(`Loading ${type} from Strapi`)
content[type] = await getContent(type) content[type] = await getContent(type)
for (const item of Object.values(content[type])) { for (const item of Object.values(content[type])) {
await addTranslations(type, item) await addTranslations(type, item, token)
} }
} }