diff --git a/src/datasources/keyword-api.ts b/src/datasources/keyword-api.ts index d2e795a..4f8ed6c 100644 --- a/src/datasources/keyword-api.ts +++ b/src/datasources/keyword-api.ts @@ -1,11 +1,14 @@ import { SQLDataSource } from 'datasource-sql'; import { Keyword, KeywordType } from '../types/keyword-types'; +import { TextsAPI } from './texts-api'; const MINUTE = 60; export class KeywordAPI extends SQLDataSource { - constructor(config) { + textsApi: TextsAPI; + constructor(config, textsApi) { super(config); + this.textsApi = textsApi; } getType(data: any) { @@ -98,18 +101,8 @@ ORDER BY keywords.value }); } } + await this.textsApi.translateKeyword(keywordId, name); return keywordId; } } - -/* -category keywords: -SELECT category_keyword.category_id, keywords.value -FROM category_keyword -JOIN keywords ON category_keyword.keyword_id = keywords.id; - -texts: - FROM categorydata cd - JOIN categorydatakeys cdk ON cd.datakey_id = cdk.id -*/ diff --git a/src/datasources/texts-api.ts b/src/datasources/texts-api.ts index f8f8bb4..a1f1c9e 100644 --- a/src/datasources/texts-api.ts +++ b/src/datasources/texts-api.ts @@ -14,6 +14,31 @@ export class TextsAPI extends SQLDataSource { this.marketLocaleApi = marketLocaleApi; } + async translateKeyword(keywordId: number, keyword: string): Promise { + const locales = await this.marketLocaleApi.getLocales(); + for (let i = 0; i < locales.length; i++) { + let langCode = this.getLanguageCode(locales[i]); + // If we have a fallback locale we skip translating + if (locales[i].fallbackId) { + continue; + } + const input: TranslateInput = { + text: keyword, + targetLanguageCode: langCode, + sourceLanguageCode: 'en', + }; + const translated = await translateText(input); + + const res = await this.knex('keywords_i18n') + .insert({ + value: translated, + keyword_id: keywordId, + locale_id: locales[i].id, + }) + .returning('*'); + } + } + async translateProductName( name: string, oldPath: string, diff --git a/src/index.ts b/src/index.ts index c9940cd..9abd514 100644 --- a/src/index.ts +++ b/src/index.ts @@ -40,7 +40,7 @@ const imageServerApi = new ImageServerApi(); const interiorsLambdaApi = new InteriorsLambdaAPI(); const interiorApi = new InteriorAPI(knexConfig, imageServerApi); const printProductDefaultsApi = new PrintProductDefaultsAPI(knexConfig); -const keywordApi = new KeywordAPI(knexConfig); +const keywordApi = new KeywordAPI(knexConfig, textsApi); const orderApi = new OrderAPI(knexConfig); const productApi = new ProductAPI( knexConfig, diff --git a/translate_all_keywords.js b/translate_all_keywords.js new file mode 100644 index 0000000..36fb043 --- /dev/null +++ b/translate_all_keywords.js @@ -0,0 +1,59 @@ +const { + TranslateClient, + TranslateTextCommand, +} = require('@aws-sdk/client-translate'); + +const db = require('knex')({ + client: 'pg', + connection: 'postgresql://fondberg:@docker.for.mac.localhost/photowall', + searchPath: ['public'], +}); + +async function translateText(input) { + const translateClient = new TranslateClient({ + region: 'eu-west-1', + }); + + const translateTextCommand = new TranslateTextCommand({ + SourceLanguageCode: input.sourceLanguageCode ?? 'auto', + TargetLanguageCode: input.targetLanguageCode, + Text: input.text, + }); + + return translateClient + .send(translateTextCommand) + .then((resp) => resp.TranslatedText); +} + +function getLanguageCode(locale) { + let langCode = locale.value.substr(0, 2); + return langCode == 'nn' ? 'no' : langCode; +} + +async function translate(locales, keyword) { + for (let i = 0; i < locales.length; i++) { + const langCode = getLanguageCode(locales[i]); + const input = { + text: keyword.value, + targetLanguageCode: langCode, + }; + const translated = await translateText(input); + console.log(keyword.value + ' : ' + translated); + const res = await db('keywords_i18n') + .insert({ + value: translated, + keyword_id: keyword.id, + locale_id: locales[i].id, + }) + .returning('*'); + } +} + +async function main() { + const locales = await db.select().table('locales').whereNull('fallback_id'); + const keywords = await db.select().table('keywords'); + for (let i = 0; i < keywords.length; i++) { + await translate(locales, keywords[i]); + } +} +main();