@@ -347,7 +347,8 @@ export default class I18N extends AdminForthPlugin {
347347 } ) ;
348348 }
349349
350- async bulkTranslate ( { selectedIds } : { selectedIds : string [ ] } ) {
350+ // returns translated count
351+ async bulkTranslate ( { selectedIds } : { selectedIds : string [ ] } ) : Promise < number > {
351352
352353 const needToTranslateByLang : Partial <
353354 Record <
@@ -382,26 +383,33 @@ export default class I18N extends AdminForthPlugin {
382383 const maxKeysInOneReq = 10 ;
383384
384385 const updateStrings : Record < string , {
385- updates : any , category : string , strId : string
386+ updates : any ,
387+ category : string ,
388+ strId : string ,
389+ translatedStr : string
386390 } > = { } ;
387391
388- const translateToLang = async ( langIsoCode : LanguageCode , strings : { en_string : string , category : string } [ ] ) => {
389-
392+ const translateToLang = async ( langIsoCode : LanguageCode , strings : { en_string : string , category : string } [ ] , plurals = false ) : Promise < number > => {
393+ if ( strings . length === 0 ) {
394+ return 0 ;
395+ }
390396
391397 if ( strings . length > maxKeysInOneReq ) {
398+ let totalTranslated = 0 ;
392399 for ( let i = 0 ; i < strings . length ; i += maxKeysInOneReq ) {
393400 const slicedStrings = strings . slice ( i , i + maxKeysInOneReq ) ;
394- await translateToLang ( langIsoCode , slicedStrings ) ;
401+ console . log ( '🪲🔪slicedStrings ' , slicedStrings ) ;
402+ totalTranslated += await translateToLang ( langIsoCode , slicedStrings , plurals ) ;
395403 }
396- return ;
404+ return totalTranslated ;
397405 }
398406 const lang = langIsoCode ;
399407
400- const isSlavikPlural = Object . keys ( SLAVIC_PLURAL_EXAMPLES ) . includes ( lang ) ;
408+ const requestSlavicPlurals = Object . keys ( SLAVIC_PLURAL_EXAMPLES ) . includes ( lang ) && plurals ;
401409
402410 const prompt = `
403411I need to translate strings in JSON to ${ lang } language from English for my web app.
404- ${ isSlavikPlural ? `If string contains '|' it means it is plural form, you should provide 4 translations (zero | singular | 2-4 | 5+) e.g. ${ SLAVIC_PLURAL_EXAMPLES [ lang ] } ` : '' }
412+ ${ requestSlavicPlurals ? `You should provide 4 translations (in format zero | singular | 2-4 | 5+) e.g. ${ SLAVIC_PLURAL_EXAMPLES [ lang ] } ` : '' }
405413Keep keys, as is, write translation into values! Here are the strings:
406414
407415\`\`\`json
442450 return ;
443451 }
444452 res = JSON . parse ( res ) ;
445- for ( const [ enStr , translatedStr ] of Object . entries ( res ) ) {
453+
454+
455+ for ( const [ enStr , translatedStr ] of Object . entries ( res ) as [ string , string ] [ ] ) {
446456 const translationsTargeted = translations . filter ( t => t [ this . enFieldName ] === enStr ) ;
447457 // might be several with same en_string
448458 for ( const translation of translationsTargeted ) {
449- translation [ this . trFieldNames [ lang ] ] = translatedStr ;
459+ // translation[this.trFieldNames[lang]] = translatedStr;
450460 // process.env.HEAVY_DEBUG && console.log(`🪲translated to ${lang} ${translation.en_string}, ${translatedStr}`)
451- if ( ! updateStrings [ enStr ] ) {
452- updateStrings [ enStr ] = {
461+ if ( ! updateStrings [ translation [ this . primaryKeyFieldName ] ] ) {
462+
463+ updateStrings [ translation [ this . primaryKeyFieldName ] ] = {
453464 updates : { } ,
465+ translatedStr,
454466 category : translation [ this . options . categoryFieldName ] ,
455467 strId : translation [ this . primaryKeyFieldName ] ,
456468 } ;
457469 }
458- updateStrings [ enStr ] . updates [ this . trFieldNames [ lang ] ] = translatedStr ;
470+ updateStrings [
471+ translation [ this . primaryKeyFieldName ]
472+ ] . updates [ this . trFieldNames [ lang ] ] = translatedStr ;
459473 }
460474 }
461475
476+ return res . length ;
462477 }
463478
464479 const langsInvolved = new Set ( Object . keys ( needToTranslateByLang ) ) ;
465480
481+ let totalTranslated = 0 ;
466482 await Promise . all ( Object . entries ( needToTranslateByLang ) . map ( async ( [ lang , strings ] : [ LanguageCode , { en_string : string , category : string } [ ] ] ) => {
467- await translateToLang ( lang , strings ) ;
483+ // first translate without plurals
484+ const stringsWithoutPlurals = strings . filter ( s => ! s . en_string . includes ( '|' ) ) ;
485+ totalTranslated += await translateToLang ( lang , stringsWithoutPlurals , false ) ;
486+
487+ const stringsWithPlurals = strings . filter ( s => s . en_string . includes ( '|' ) ) ;
488+ totalTranslated += await translateToLang ( lang , stringsWithPlurals , true ) ;
468489 } ) ) ;
469490
470491 await Promise . all (
488509 }
489510 }
490511
512+ return totalTranslated ;
513+
491514 }
492515
493516 async processExtractedMessages ( adminforth : IAdminForth , filePath : string ) {
0 commit comments