@@ -2,6 +2,8 @@ import _ from "lodash";
22import fs from 'fs' ;
33import { BucketPayload , BucketTranslatorFn , IBucketProcessor } from "./core.js" ;
44
5+ const CHUNK_SIZE = 25 ;
6+
57export 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 ) ;
0 commit comments