Skip to content

Commit

Permalink
update to work with generic jsons
Browse files Browse the repository at this point in the history
  • Loading branch information
gabriel-logan committed Jun 2, 2024
1 parent 206a2dd commit 65fa7a3
Show file tree
Hide file tree
Showing 7 changed files with 147 additions and 318 deletions.
2 changes: 1 addition & 1 deletion package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "azure-translator-code",
"version": "1.1.0",
"version": "1.1.1",
"description": "Azure Cognitive Services Translator Text API Code for Use with Common Languages",
"author": {
"name": "Gabriel Logan"
Expand Down
125 changes: 0 additions & 125 deletions src/addInto/index.ts

This file was deleted.

3 changes: 2 additions & 1 deletion src/index.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
import translateToMultipleFolders from './translateToMultipleFolders';
import translateToUnicFolder from './translateToUnicFolder';
import updateTranslationsMulti from './updateTranslationMulti';
import translate from './translate';

export { translateToMultipleFolders, translateToUnicFolder, updateTranslationsMulti };
export { translateToMultipleFolders, translateToUnicFolder, updateTranslationsMulti, translate };
80 changes: 80 additions & 0 deletions src/translate/index.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,80 @@
import axios from 'axios';
import { v4 as uuidv4 } from 'uuid';

/**
* Represents the type of a translation object.
*/
type TranslationType = {
[key: string]: string | TranslationType;
};

async function translateText(
text: string,
from: string,
to: string,
endpoint: string,
key: string,
location: string,
) {
return axios({
baseURL: endpoint,
url: '/translate',
method: 'post',
headers: {
'Ocp-Apim-Subscription-Key': key,
'Ocp-Apim-Subscription-Region': location,
'Content-type': 'application/json',
'X-ClientTraceId': uuidv4().toString(),
},
params: {
'api-version': '3.0',
from: from,
to: to,
},
data: [
{
text: text,
},
],
responseType: 'json',
});
}

/**
* Translates a JSON object from one language to another using the Azure Translator service.
* @param key - The Azure Translator subscription key.
* @param endpoint - The Azure Translator endpoint URL.
* @param location - The Azure Translator subscription region.
* @param fromLang - The language code of the source language.
* @param toLang - The language code of the target language.
* @param jsonFile - The JSON object to be translated.
* @returns A Promise that resolves to the translated JSON object.
*/
export default async function translate(
key: string,
endpoint: string,
location: string,
fromLang: string,
toLang: string,
jsonFile: TranslationType,
): Promise<TranslationType> {
const translatedJson: TranslationType = {};

for (const [jsonKey, jsonValue] of Object.entries(jsonFile)) {
if (typeof jsonValue === 'string') {
const response = await translateText(jsonValue, fromLang, toLang, endpoint, key, location);
translatedJson[jsonKey] = response.data[0].translations[0].text;
} else {
translatedJson[jsonKey] = await translate(
key,
endpoint,
location,
fromLang,
toLang,
jsonValue,
);
}
}

return translatedJson;
}
55 changes: 33 additions & 22 deletions src/translateToMultipleFolders/index.ts
Original file line number Diff line number Diff line change
@@ -1,11 +1,11 @@
import axios from 'axios';
import { v4 as uuidv4 } from 'uuid';
import fs from 'fs';
import path from 'path';
import * as fs from 'fs';
import * as path from 'path';

interface TranslationType {
translation: Record<string, string>;
}
type TranslationType = {
[key: string]: string | TranslationType;
};

/**
* @param key Your key from azure translator, something like: 'sds12312a213aaaa9b2d0c37eds37b'
Expand Down Expand Up @@ -67,8 +67,6 @@ export default function translateToMultipleFolders(
fs.mkdirSync(traducoesDir, { recursive: true }); // Use { recursive: true } para criar pastas recursivamente, se necessário
}

const { translation } = jsonFile;

function translateText(text: string, from: string, to: string) {
return axios({
baseURL: endpoint,
Expand All @@ -94,20 +92,31 @@ export default function translateToMultipleFolders(
});
}

async function translateAndSave(lang: string) {
const translations: Record<string, string> = {};
async function translateAndSave(lang: string, obj: TranslationType, currentPath: string = '') {
const translations: Record<string, unknown> = {};

for (const key in translation) {
try {
const response = await translateText(translation[key], fromLang, lang);
const translatedText = response.data[0].translations[0].text;
translations[key] = translatedText;
console.log(`Translating ${translation[key]} to ${lang} \n\n`);
} catch (error) {
if (error instanceof Error) {
console.error(`Error translating "${key}" to ${lang}: ${error.message} \n`);
} else {
console.error(`An error occurred within the error (: \n`);
for (const key in obj) {
const newPath = currentPath ? `${currentPath}.${key}` : key;

if (typeof obj[key] === 'object' && obj[key] !== null) {
const nestedTranslations = await translateAndSave(
lang,
obj[key] as TranslationType,
newPath,
);
translations[key] = nestedTranslations;
} else {
try {
const response = await translateText(obj[key] as string, fromLang, lang);
const translatedText = response.data[0].translations[0].text;
translations[key] = translatedText;
console.log(`Translating ${obj[key]} to ${lang} \n\n`);
} catch (error) {
if (error instanceof Error) {
console.error(`Error translating "${newPath}" to ${lang}: ${error.message} \n`);
} else {
console.error(`An error occurred within the error (: \n`);
}
}
}
}
Expand All @@ -119,12 +128,14 @@ export default function translateToMultipleFolders(
}

const outputFileName = path.join(langDir, `${lang}.json`);
fs.writeFileSync(outputFileName, JSON.stringify({ translation: translations }, null, 4));
fs.writeFileSync(outputFileName, JSON.stringify(translations, null, 4));
console.log(`Translations for ${lang} saved in ${outputFileName} \n\n`);

return translations;
}

async function translateAndSaveAll() {
const translationPromises = toLangs.map((lang) => translateAndSave(lang));
const translationPromises = toLangs.map((lang) => translateAndSave(lang, jsonFile));

await Promise.all(translationPromises);
}
Expand Down
Loading

0 comments on commit 65fa7a3

Please sign in to comment.