Skip to content

Commit 38e0003

Browse files
authored
feat: show progress details when translating (#91)
1 parent 7d6b798 commit 38e0003

File tree

6 files changed

+24
-9
lines changed

6 files changed

+24
-9
lines changed

.changeset/calm-radios-glow.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
"replexica": patch
3+
---
4+
5+
show progress in percent while translating

demo/classic/json/en.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"home": {
33
"title/main": "Replexica",
4-
"description/dev": "Replexica is an AI-powered localization-as-a-service platform for modern SaaS."
4+
"description/dev": "Replexica is an AI-powered localization-as-a-service platform for modern SaaS."
55
}
66
}

demo/classic/json/es.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"home": {
33
"title/main": "Replexica",
4-
"description/dev": "Replexica es una plataforma de localización como servicio impulsada por IA para SaaS modernos."
4+
"description/dev": "Replexica es una plataforma de localización como servicio potenciada por IA para SaaS modernos."
55
}
66
}

packages/cli/src/i18n.ts

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -62,7 +62,9 @@ export default new Command()
6262
const processor = createBucketProcessor(bucketType, bucketPath, translatorFn);
6363

6464
const translatable = await processor.load(sourceLocale);
65-
const translated = await processor.translate(translatable, sourceLocale, targetLocale);
65+
const translated = await processor.translate(translatable, sourceLocale, targetLocale, progress => {
66+
bucketSpinner.text = `Translating from ${sourceLocale} to ${targetLocale}... ${progress.toFixed(1)}%`;
67+
});
6668

6769
await processor.save(targetLocale, translated);
6870
bucketSpinner.succeed(`Translation from ${sourceLocale} to ${targetLocale} completed.`);

packages/cli/src/services/bucket/base.ts

Lines changed: 13 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,8 @@ import _ from "lodash";
22
import fs from 'fs';
33
import { BucketPayload, BucketTranslatorFn, IBucketProcessor } from "./core.js";
44

5+
const CHUNK_SIZE = 25;
6+
57
export abstract class BaseBucketProcessor implements IBucketProcessor {
68
constructor(
79
protected bucketPath: string,
@@ -24,20 +26,26 @@ export abstract class BaseBucketProcessor implements IBucketProcessor {
2426
return result;
2527
}
2628

27-
async translate(payload: BucketPayload, sourceLocale: string, targetLocale: string): Promise<BucketPayload> {
29+
async translate(payload: BucketPayload, sourceLocale: string, targetLocale: string, onProgress?: (progress: number) => void): Promise<BucketPayload> {
2830
// The data contains key-value pairs, so let's translate
29-
// the values in batches of 20 keys max.
3031
const resultData: Record<string, any> = {};
3132

3233
const keys = Object.keys(payload.data);
33-
const batches = _.chunk(keys, 20);
34+
const batches = _.chunk(keys, CHUNK_SIZE);
35+
const totalBatches = batches.length;
36+
37+
let completedBatches = 0;
38+
3439
for (const batch of batches) {
3540
const partialData = _.pick(payload.data, batch);
3641
const partialPayload = { data: partialData, meta: payload.meta };
3742
const partialResult = await this.translator(sourceLocale, targetLocale, partialPayload);
3843
_.merge(resultData, partialResult);
44+
completedBatches++;
45+
46+
const progress = (completedBatches / totalBatches) * 100;
47+
onProgress?.(progress);
3948
}
40-
4149
const result = { data: resultData, meta: payload.meta };
4250
return result;
4351
}
@@ -57,7 +65,7 @@ export abstract class BaseBucketProcessor implements IBucketProcessor {
5765
protected async _preSave(payload: BucketPayload, locale: string): Promise<BucketPayload> {
5866
return payload;
5967
}
60-
68+
6169
protected async _loadData(locale: string): Promise<Record<string, any>> {
6270
const filePath = this._resolveDataFilePath(locale);
6371
const exists = await fs.existsSync(filePath);

packages/cli/src/services/bucket/core.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ export type BucketTranslatorFn = {
2121

2222
export interface IBucketProcessor {
2323
load(locale: string): Promise<BucketPayload>;
24-
translate(payload: BucketPayload, sourceLocale: string, targetLocale: string): Promise<BucketPayload>;
24+
translate(payload: BucketPayload, sourceLocale: string, targetLocale: string, onProgress?: (progress: number) => void): Promise<BucketPayload>;
2525
save(locale: string, payload: BucketPayload): Promise<BucketPayload>;
2626
}
2727

0 commit comments

Comments
 (0)