Skip to content

Commit

Permalink
Merge remote-tracking branch 'upstream/feat/rf-1267-update-crowdin-wo…
Browse files Browse the repository at this point in the history
…rkflow-with-pre-translate' into next
  • Loading branch information
yeager-eren committed Feb 18, 2024
2 parents 5d1fd74 + acf72d5 commit 508bde6
Show file tree
Hide file tree
Showing 3 changed files with 48 additions and 46 deletions.
2 changes: 1 addition & 1 deletion .github/workflows/crowdin.yml
Original file line number Diff line number Diff line change
Expand Up @@ -47,7 +47,7 @@ jobs:
token: ${{ secrets.CROWDIN_PERSONAL_TOKEN }}

- name: Crowdin pre-translation
run: node ./scripts/crowdin/pretranslate.mjs
run: node ./scripts/crowdin/command.mjs

- name: Crowdin pull translations
uses: crowdin/github-action@v1
Expand Down
7 changes: 7 additions & 0 deletions scripts/common/errors.mjs
Original file line number Diff line number Diff line change
Expand Up @@ -97,3 +97,10 @@ export class CustomScriptError extends Error {
super(msg);
}
}

export class CrowdinError extends Error {
name = 'CrowdinError';
constructor(msg) {
super(msg);
}
}
85 changes: 40 additions & 45 deletions scripts/crowdin/pretranslate.mjs → scripts/crowdin/command.mjs
Original file line number Diff line number Diff line change
@@ -1,14 +1,15 @@
const projectId = process.env.CROWDIN_PROJECT_ID;
const token = process.env.CROWDIN_PERSONAL_TOKEN;
import { CrowdinError } from "../common/errors.mjs";

const BASE_URL = `https://api.crowdin.com/api/v2/projects/${projectId}`;
const preTranslateURL = `${BASE_URL}/pre-translations`;
const PROJECT_ID = process.env.CROWDIN_PROJECT_ID;
const TOKEN = process.env.CROWDIN_PERSONAL_TOKEN;

const BASE_URL = `https://api.crowdin.com/api/v2`;
const BASE_PROJECT_URL = `${BASE_URL}/projects/${PROJECT_ID}`;
const REQUEST_INTERVAL_TIMEOUT = 10_000;
const MAXIMUM_REQUEST_RETRIES = 12;
const MAXIMUM_PRETRANSLATION_STATUS_CHECK = 20;

const requestData = {
method: 'mt',
engineId: 438272,
autoApproveOption: 'all',
duplicateTranslations: false,
skipApprovedTranslations: true,
Expand All @@ -18,36 +19,36 @@ const requestData = {

const getMachineTranslationEngineID = async () => {
try {
const response = await fetch('https://api.crowdin.com/api/v2/mts', {
const response = await fetch(`${BASE_URL}/mts`, {
headers: {
Authorization: `Bearer ${token}`,
Authorization: `Bearer ${TOKEN}`,
},
});

if (!response.ok) {
throw new Error(`Failed to get target language ids`);
throw 'Failed to get machine translation data';
}

const responseData = await response.json();
const engineId = responseData.data[0].data.id;

return engineId;
} catch (error) {
console.error('Error:', error);
throw error;
console.error('Error:', error);
throw new CrowdinError(error);
}
};

const getLanguageIds = async () => {
try {
const response = await fetch(`${BASE_URL}`, {
const response = await fetch(BASE_PROJECT_URL, {
headers: {
Authorization: `Bearer ${token}`,
Authorization: `Bearer ${TOKEN}`,
},
});

if (!response.ok) {
throw new Error(`Failed to get target language ids`);
throw 'Failed to get target language ids';
}

const responseData = await response.json();
Expand All @@ -56,20 +57,20 @@ const getLanguageIds = async () => {
return languageIds;
} catch (error) {
console.error('Error:', error);
throw error;
throw new CrowdinError(error);
}
};

const getSourceFileId = async () => {
try {
const response = await fetch(`${BASE_URL}/files`, {
const response = await fetch(`${BASE_PROJECT_URL}/files`, {
headers: {
Authorization: `Bearer ${token}`,
Authorization: `Bearer ${TOKEN}`,
},
});

if (!response.ok) {
throw new Error(`Failed to get source file id`);
throw 'Failed to get source file id';
}

const responseData = await response.json();
Expand All @@ -78,17 +79,20 @@ const getSourceFileId = async () => {
return sourceFileId;
} catch (error) {
console.error('Error:', error);
throw error;
throw new CrowdinError(error);
}
};

const sendPreTranslateRequest = async ({ sourceFileId, languageIds }) => {
try {
const response = await fetch(preTranslateURL, {
const engineId = await getMachineTranslationEngineID();
console.log('engineId', engineId);
requestData.engineId = engineId ;
const response = await fetch(`${BASE_PROJECT_URL}/pre-translations`, {
method: 'POST',
headers: {
'Content-Type': 'application/json',
Authorization: `Bearer ${token}`,
Authorization: `Bearer ${TOKEN}`,
},
body: JSON.stringify({
...requestData,
Expand All @@ -98,10 +102,7 @@ const sendPreTranslateRequest = async ({ sourceFileId, languageIds }) => {
});

if (!response.ok) {
console.log({ sourceFileId, languageIds });
throw new Error(
`Failed to initiate pre-translation. Status: ${response.status}`
);
throw `Failed to initiate pre-translation. Status: ${response.status}`;
}

const responseData = await response.json();
Expand All @@ -110,28 +111,26 @@ const sendPreTranslateRequest = async ({ sourceFileId, languageIds }) => {
return preTranslationId;
} catch (error) {
console.error('Error:', error);
throw error;
throw new CrowdinError(error);
}
};

const checkPreTranslateStatus = async (preTranslationId) => {
const maxAttempts = MAXIMUM_REQUEST_RETRIES;
const maxAttempts = MAXIMUM_PRETRANSLATION_STATUS_CHECK;
let attempt = 0;

const delay = (ms) => new Promise((resolve) => setTimeout(resolve, ms));

while (attempt < maxAttempts) {
try {
const response = await fetch(`${preTranslateURL}/${preTranslationId}`, {
const response = await fetch(`${BASE_PROJECT_URL}/pre-translations/${preTranslationId}`, {
headers: {
Authorization: `Bearer ${token}`,
Authorization: `Bearer ${TOKEN}`,
},
});

if (!response.ok) {
throw new Error(
`Failed to get pre-translation status. Status: ${response.status}`
);
throw `Failed to get pre-translation status. Status: ${response.status}`;
}

const responseData = await response.json();
Expand All @@ -150,25 +149,21 @@ const checkPreTranslateStatus = async (preTranslationId) => {
}
} catch (error) {
console.error('Error:', error);
throw error;
throw new CrowdinError(error);
}
}

throw new Error(
'Timeout: Pre-translation did not succeed within the specified time.'
);
throw new CrowdinError('Timeout: Pre-translation did not succeed within the specified time.');
};

(async () => {
try {
const [sourceFileId, languageIds] = await Promise.all([
getSourceFileId(),
getLanguageIds(),
]);
const preTranslationId = await sendPreTranslateRequest({
sourceFileId,
languageIds,
});
if(!PROJECT_ID || !PROJECT_ID){
throw new CrowdinError('environments are not set correctly');
}
const [sourceFileId, languageIds] = await Promise.all([getSourceFileId(), getLanguageIds()]);
console.log('sourceFileId', sourceFileId);
console.log('languageIds', languageIds);
const preTranslationId = await sendPreTranslateRequest({ sourceFileId, languageIds });
await checkPreTranslateStatus(preTranslationId);
} catch (error) {
console.error('Error:', error);
Expand Down

0 comments on commit 508bde6

Please sign in to comment.