Skip to content

Commit

Permalink
Add translator scripts
Browse files Browse the repository at this point in the history
  • Loading branch information
barshathakuri committed Mar 19, 2024
1 parent 427e74e commit b0dff9f
Show file tree
Hide file tree
Showing 2 changed files with 95 additions and 1 deletion.
13 changes: 12 additions & 1 deletion .unimportedrc.json
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,18 @@
"#assets/content/operational_timeline_title.svg?react",
"#assets/content/operational_timeline_body.svg?react"
],
"ignoreUnused": ["@tinymce/tinymce-react", "@mapbox/mapbox-gl-draw"],
"ignoreUnused": [
"@tinymce/tinymce-react",
"@mapbox/mapbox-gl-draw",
"@apollo/client",
"@graphql-codegen/introspection",
"@graphql-codegen/typescript-operations",
"@togglecorp/re-map",
"@turf/bbox",
"@turf/buffer",
"graphql-request",
"sanitize-html"
],
"extensions": [".ts", ".js", ".tsx", ".jsx"],
"aliases": {
"#assets/*": ["./src/assets/*"],
Expand Down
83 changes: 83 additions & 0 deletions scripts/translator.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,83 @@
import { isDefined, listToMap, mapToList } from '@togglecorp/fujs';
import fg from 'fast-glob';
import { readFile } from 'fs';
import { join } from 'path';
import { cwd, exit } from 'process';
import { promisify } from 'util';

const glob = fg.glob;

const readFilePromisify = promisify(readFile);

function getDuplicates(
list,
keySelector,
) {
if (!list) {
return undefined;
}
const counts = listToMap(
list,
keySelector,
(_, key, __, acc) => {
const value = acc[key];
return isDefined(value) ? value + 1 : 1;
},
);

return list
.filter((item) => counts[keySelector(item)] > 1)
.sort((foo, bar) => keySelector(foo).localeCompare(keySelector(bar)));
}

const currentDir = cwd();
const fullPath = join(currentDir, 'src/**/i18n.json');
console.info('Searching in', fullPath);

const files = await glob(fullPath, { ignore: ['node_modules'], absolute: true });
console.info(`Found ${files.length} i18n.json files.`);

const translationsPromise = files.map(async (file) => {
const fileDescriptor = await readFilePromisify(file);
const filename = `.${file.slice(currentDir.length)}`;
try {
return {
file: filename,
content: JSON.parse(fileDescriptor.toString()),
};
} catch (e) {
console.error(`Error while parsing JSON for ${filename}`);
exit(1);
}
});
const translations = await Promise.all(translationsPromise);

const strings = translations.flatMap((translation) => {
const { file, content } = translation;

return mapToList(
content.strings,
(item, key) => ({
file,
namespace: content.namespace,
key,
value: item,
}),
);
});

const namespaces = new Set(strings.map((item) => item.namespace));

console.info(`Found ${namespaces.size} namespaces.`);
console.info(`Found ${strings.length} strings.`);

const duplicates = getDuplicates(
strings,
(string) => `${string.namespace}:${string.key}`,
);

console.error(`Found ${duplicates.length} duplicated strings.`);
if (duplicates.length > 0) {
console.info(JSON.stringify(duplicates, null, 2));
exit(2);
}

0 comments on commit b0dff9f

Please sign in to comment.