Skip to content

Commit 41e063c

Browse files
committed
feat(translation): connect with ifrc translation service
1 parent 87d61c9 commit 41e063c

28 files changed

+1158
-636
lines changed

.github/workflows/ci.yml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,8 @@ env:
1313
APP_RISK_API_ENDPOINT: 'https://go-risk-staging.northeurope.cloudapp.azure.com/api/v1/'
1414
APP_TINY_API_KEY: 'dummy-api-key'
1515
APP_TITLE: 'IFRC Go Test'
16+
APP_TRANSLATION_API_ENDPOINT: 'https://ifrc-translationapi.azurewebsites.net/'
17+
APP_TRANSLATION_API_KEY: 'dummy-translation-api-key'
1618

1719
concurrency:
1820
group: ${{ github.workflow }}-${{ github.ref }}

app/env.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,10 @@ export default defineConfig({
1616
return value as ('production' | 'staging' | 'testing' | `alpha-${number}` | 'development' | 'APP_ENVIRONMENT_PLACEHOLDER');
1717
},
1818
APP_API_ENDPOINT: Schema.string({ format: 'url', protocol: true, tld: false }),
19+
20+
APP_TRANSLATION_API_ENDPOINT: Schema.string({ format: 'url', protocol: true, tld: false }),
21+
APP_TRANSLATION_API_KEY: Schema.string(),
22+
1923
APP_ADMIN_URL: Schema.string.optional({ format: 'url', protocol: true, tld: false }),
2024
APP_MAPBOX_ACCESS_TOKEN: Schema.string(),
2125
APP_TINY_API_KEY: Schema.string(),

app/package.json

Lines changed: 11 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -13,12 +13,16 @@
1313
"translatte": "tsx scripts/translatte/main.ts",
1414
"translatte:generate": "pnpm translatte generate-migration ../translationMigrations ./src/**/i18n.json ../packages/ui/src/**/i18n.json",
1515
"translatte:lint": "pnpm translatte lint ./src/**/i18n.json ../packages/ui/src/**/i18n.json",
16-
"initialize:type": "mkdir -p generated/ && pnpm initialize:type:go-api && pnpm initialize:type:risk-api",
16+
"translatte:lint-migrations": "pnpm translatte lint-migrations ../translationMigrations",
17+
"initialize:type": "mkdir -p generated/ && pnpm initialize:type:go-api && pnpm initialize:type:risk-api && pnpm initialize:type:translations",
1718
"initialize:type:go-api": "test -f ./generated/types.ts && true || cp types.stub.ts ./generated/types.ts",
1819
"initialize:type:risk-api": "test -f ./generated/riskTypes.ts && true || cp types.stub.ts ./generated/riskTypes.ts",
19-
"generate:type": "pnpm generate:type:go-api && pnpm generate:type:risk-api",
20+
"initialize:type:translations": "test -f ./generated/translationTypes.ts && true || cp types.stub.ts ./generated/translationTypes.ts",
21+
"generate:type": "pnpm generate:type:go-api && pnpm generate:type:risk-api && pnpm generate:type:translations",
2022
"generate:type:go-api": "openapi-typescript ../go-api/assets/openapi-schema.yaml -o ./generated/types.ts --alphabetize",
21-
"generate:type:risk-api": "dotenv -- cross-var openapi-typescript ../go-risk-module-api/openapi-schema.yaml -o ./generated/riskTypes.ts --alphabetize",
23+
"generate:type:risk-api": "openapi-typescript ../go-risk-module-api/openapi-schema.yaml -o ./generated/riskTypes.ts --alphabetize",
24+
"generate:type:translations": "dotenv -- cross-var openapi-typescript \"%APP_TRANSLATION_API_ENDPOINT%swagger/v1/swagger.json\" -o ./generated/translationTypes.ts --alphabetize",
25+
"postgenerate:type:translations": "tsx scripts/fix-generated.ts",
2226
"prestart": "pnpm initialize:type",
2327
"start": "pnpm -F @ifrc-go/ui build && vite",
2428
"prebuild": "pnpm initialize:type",
@@ -29,7 +33,7 @@
2933
"prelint:js": "pnpm initialize:type",
3034
"lint:js": "eslint src",
3135
"lint:css": "stylelint \"./src/**/*.css\"",
32-
"lint:translation": "pnpm translatte:lint",
36+
"lint:translation": "pnpm translatte:lint && pnpm translatte:lint-migrations",
3337
"lint": "pnpm lint:js && pnpm lint:css && pnpm lint:translation",
3438
"lint:fix": "pnpm lint:js --fix && pnpm lint:css --fix",
3539
"test": "vitest",
@@ -48,7 +52,7 @@
4852
"@togglecorp/toggle-request": "^1.0.0-beta.3",
4953
"@turf/bbox": "^6.5.0",
5054
"@turf/buffer": "^6.5.0",
51-
"exceljs": "^4.3.0",
55+
"exceljs": "^4.4.0",
5256
"file-saver": "^2.0.5",
5357
"html-to-image": "^1.11.11",
5458
"mapbox-gl": "^1.13.0",
@@ -57,7 +61,8 @@
5761
"react": "^18.2.0",
5862
"react-dom": "^18.2.0",
5963
"react-router-dom": "^6.18.0",
60-
"sanitize-html": "^2.10.0"
64+
"sanitize-html": "^2.10.0",
65+
"xlsx": "^0.18.5"
6166
},
6267
"devDependencies": {
6368
"@eslint/eslintrc": "^3.2.0",

app/scripts/fix-generated.ts

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
import { readFileSync, writeFileSync } from 'fs';
2+
3+
const path = 'generated/translationTypes.ts';
4+
5+
const content = readFileSync(path, 'utf-8');
6+
7+
// If already added, skip
8+
writeFileSync(path, `// eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-nocheck\n${content}`);
9+
console.log('✔ Added // @ts-nocheck to translationTypes.ts');

app/scripts/translatte/commands/applyMigrations.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -129,7 +129,7 @@ async function applyMigrations(
129129

130130
const migrationFilesAttrs = await getMigrationFilesAttrs(projectPath, migrationFilePath);
131131
const selectedMigrationFilesAttrs = from
132-
? migrationFilesAttrs.filter((item) => (item.migrationName > from))
132+
? migrationFilesAttrs.filter((item) => (item.migrationFileName > from))
133133
: migrationFilesAttrs;
134134

135135
console.info(`Found ${selectedMigrationFilesAttrs.length} migration files`);
@@ -139,7 +139,7 @@ async function applyMigrations(
139139
}
140140

141141
const selectedMigrations = await readMigrations(
142-
selectedMigrationFilesAttrs.map((migration) => migration.fileName),
142+
selectedMigrationFilesAttrs.map((migration) => migration.filePath),
143143
);
144144

145145
const lastMigration = selectedMigrations[selectedMigrations.length - 1];

app/scripts/translatte/commands/clearServerStrings.ts

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,11 @@
1-
import { listToGroupList } from "@togglecorp/fujs";
1+
import { isTruthyString, listToGroupList } from "@togglecorp/fujs";
22
import { fetchServerState, postLanguageStrings, writeFilePromisify } from "../utils";
33

44
async function clearServerStrings(apiUrl: string, authToken: string) {
55
const serverStrings = await fetchServerState(apiUrl, authToken);
66

77
const bulkActions = listToGroupList(
8-
serverStrings,
8+
serverStrings.filter(({ page_name }) => isTruthyString(page_name)),
99
({ language }) => language,
1010
({ key, page_name }) => ({
1111
action: "delete" as const,
@@ -19,7 +19,7 @@ async function clearServerStrings(apiUrl: string, authToken: string) {
1919
response: object,
2020
}[] = [];
2121

22-
console.log('Pusing delete actions for en...')
22+
console.log('Pushing delete actions for en...')
2323
const enResponse = await postLanguageStrings(
2424
'en',
2525
bulkActions.en,
@@ -31,7 +31,7 @@ async function clearServerStrings(apiUrl: string, authToken: string) {
3131
logs.push({ responseFor: 'en', response: enResponseJson });
3232

3333

34-
console.log('Pusing delete actions for fr...')
34+
console.log('Pushing delete actions for fr...')
3535
const frResponse = await postLanguageStrings(
3636
'fr',
3737
bulkActions.fr,
@@ -42,7 +42,7 @@ async function clearServerStrings(apiUrl: string, authToken: string) {
4242
const frResponseJson = await frResponse.json();
4343
logs.push({ responseFor: 'fr', response: frResponseJson });
4444

45-
console.log('Pusing delete actions for es...')
45+
console.log('Pushing delete actions for es...')
4646
const esResponse = await postLanguageStrings(
4747
'es',
4848
bulkActions.es,
@@ -52,7 +52,7 @@ async function clearServerStrings(apiUrl: string, authToken: string) {
5252
const esResponseJson = await esResponse.json();
5353
logs.push({ responseFor: 'es', response: esResponseJson });
5454

55-
console.log('Pusing delete actions for ar...')
55+
console.log('Pushing delete actions for ar...')
5656
const arResponse = await postLanguageStrings(
5757
'ar',
5858
bulkActions.ar,

app/scripts/translatte/commands/exportServerStringsToExcel.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import xlsx from 'exceljs';
22

33
import { fetchServerState } from "../utils";
4-
import { isFalsyString, listToGroupList, listToMap, mapToList } from '@togglecorp/fujs';
4+
import { isFalsyString, isTruthyString, listToGroupList, listToMap, mapToList } from '@togglecorp/fujs';
55

66
async function exportServerStringsToExcel(
77
apiUrl: string,
@@ -35,7 +35,7 @@ async function exportServerStringsToExcel(
3535

3636
const keyGroupedStrings = mapToList(
3737
listToGroupList(
38-
serverStrings,
38+
serverStrings.filter(({ page_name, key }) => isTruthyString(page_name) && isTruthyString(key)),
3939
({ page_name, key }) => `${page_name}:${key}`,
4040
),
4141
(list) => {

app/scripts/translatte/commands/generateMigration.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -132,7 +132,7 @@ async function generate(
132132
const selectedMigrationFilesAttrs = migrationFilesAttrs;
133133
console.info(`Found ${selectedMigrationFilesAttrs.length} migration files`);
134134
const selectedMigrations = await readMigrations(
135-
selectedMigrationFilesAttrs.map((migration) => migration.fileName),
135+
selectedMigrationFilesAttrs.map((migration) => migration.filePath),
136136
);
137137
const mergedMigrationActions = merge(
138138
selectedMigrations.map((migration) => migration.content),
@@ -170,7 +170,7 @@ async function generate(
170170
const lastMigration = migrationFilesAttrs[migrationFilesAttrs.length - 1];
171171

172172
const migrationContent: MigrationFileContent = {
173-
parent: lastMigration?.migrationName,
173+
parent: lastMigration?.migrationFileName,
174174
actions: migrationActionItems,
175175
}
176176

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
import { listToGroupList } from '@togglecorp/fujs';
2+
import { getMigrationFilesAttrs } from '../utils';
3+
4+
async function lintMigrations(projectPath: string, path: string) {
5+
const migrationFileAttrs = await getMigrationFilesAttrs(projectPath, path);
6+
console.info(`Found ${migrationFileAttrs.length} migration files.`);
7+
8+
const migrationGroups = listToGroupList(
9+
migrationFileAttrs,
10+
({ migrationName }) => migrationName,
11+
);
12+
13+
const duplicates = Object.values(migrationGroups).filter((group) => group.length > 1);
14+
15+
if (duplicates.length > 0) {
16+
const duplicateStr = duplicates.map((duplicate) => (
17+
duplicate.map(({ migrationName }) => migrationName).join(' <> ')
18+
)).join('\n');
19+
20+
console.info(duplicateStr);
21+
22+
throw `Error: found divirging migrations!`;
23+
}
24+
25+
console.info('All good! No divirging migrations!');
26+
}
27+
28+
export default lintMigrations;

app/scripts/translatte/commands/listMigrations.test.ts

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -37,12 +37,12 @@ testWithTmpDir('test listMigrations', async ({ tmpdir }) => {
3737
(await getMigrationFilesAttrs(
3838
tmpdir,
3939
'migrations',
40-
)).map((item) => ({ ...item, fileName: undefined })),
40+
)).map(({ migrationFileName, num, timestamp }) => ({ migrationFileName, num, timestamp })),
4141
).toEqual([
42-
{ migrationName: '001-1000000000000.json', num: '001', timestamp: '1000000000000' },
43-
{ migrationName: '002-1000000000000.json', num: '002', timestamp: '1000000000000' },
44-
{ migrationName: '003-1000000000000.json', num: '003', timestamp: '1000000000000' },
45-
{ migrationName: '004-1000000000000.json', num: '004', timestamp: '1000000000000' },
46-
{ migrationName: '005-1000000000000.json', num: '005', timestamp: '1000000000000' },
42+
{ migrationFileName: '001-1000000000000.json', num: '001', timestamp: '1000000000000' },
43+
{ migrationFileName: '002-1000000000000.json', num: '002', timestamp: '1000000000000' },
44+
{ migrationFileName: '003-1000000000000.json', num: '003', timestamp: '1000000000000' },
45+
{ migrationFileName: '004-1000000000000.json', num: '004', timestamp: '1000000000000' },
46+
{ migrationFileName: '005-1000000000000.json', num: '005', timestamp: '1000000000000' },
4747
]);
4848
});

0 commit comments

Comments
 (0)