@@ -460,11 +460,138 @@ class ThemeSelectionScreen extends ApplyConfiguratorScreen {
460460
461461 onMounted ( ( ) => {
462462 this . state . themes . forEach ( ( theme , idx ) => {
463- $ ( this . themeSVGPreviews [ idx ] . el ) . append ( theme . svg ) ;
463+ const translatedSvg = this . translateSVG ( theme . svg ) ;
464+ $ ( this . themeSVGPreviews [ idx ] . el ) . append ( translatedSvg ) ;
464465 } ) ;
465466 } ) ;
466467 }
467468
469+ translateSVG ( svg ) {
470+ const domParser = new DOMParser ( ) ;
471+ const doc = domParser . parseFromString ( svg , "image/svg+xml" ) ;
472+ doc . querySelectorAll ( "text" ) . forEach ( ( elem ) => {
473+ const sanitizedTextContent = elem . textContent
474+ . trim ( )
475+ . split ( "\n" )
476+ . map ( ( word ) => word . trim ( ) ) ;
477+ var translatedTextContent = sanitizedTextContent . join ( " " ) ;
478+ switch ( translatedTextContent ) {
479+ case "Welcome" :
480+ translatedTextContent = _t ( "Welcome" ) ;
481+ break ;
482+ case "Welcome Message" :
483+ translatedTextContent = _t ( "Welcome Message" ) ;
484+ break ;
485+ case "A Welcome Message" :
486+ translatedTextContent = _t ( "A Welcome Message" ) ;
487+ break ;
488+ case "A Welcoming Message" :
489+ translatedTextContent = _t ( "A Welcoming Message" ) ;
490+ break ;
491+ case "Discover" :
492+ translatedTextContent = _t ( "Discover" ) ;
493+ break ;
494+ case "Section Title" :
495+ translatedTextContent = _t ( "Section Title" ) ;
496+ break ;
497+ case "Entry Title" :
498+ translatedTextContent = _t ( "Entry Title" ) ;
499+ break ;
500+ case "Team Member" :
501+ translatedTextContent = _t ( "Team Member" ) ;
502+ break ;
503+ case "A Section Title" :
504+ translatedTextContent = _t ( "A Section Title" ) ;
505+ break ;
506+ case "A Very Long Title" :
507+ translatedTextContent = _t ( "A Very Long Title" ) ;
508+ break ;
509+ case "A Big Title" :
510+ translatedTextContent = _t ( "A Big Title" ) ;
511+ break ;
512+ case "A Very Long Subtitle" :
513+ translatedTextContent = _t ( "A Very Long Subtitle" ) ;
514+ break ;
515+ case "Block Title" :
516+ translatedTextContent = _t ( "Block Title" ) ;
517+ break ;
518+ case "BLOCK" :
519+ translatedTextContent = _t ( "BLOCK" ) ;
520+ break ;
521+ case "TITLE" :
522+ translatedTextContent = _t ( "TITLE" ) ;
523+ break ;
524+ case "Feature #01" :
525+ translatedTextContent = _t ( "Feature" ) + " #01" ;
526+ break ;
527+ case "Feature #02" :
528+ translatedTextContent = _t ( "Feature" ) + " #02" ;
529+ break ;
530+ case "Feature #03" :
531+ translatedTextContent = _t ( "Feature" ) + " #03" ;
532+ break ;
533+ case "Section Entry" :
534+ translatedTextContent = _t ( "Section Entry" ) ;
535+ break ;
536+ case "Contact Us" :
537+ translatedTextContent = _t ( "Contact Us" ) ;
538+ break ;
539+ case "Contact" :
540+ translatedTextContent = _t ( "Contact" ) ;
541+ break ;
542+ case "Card Title" :
543+ translatedTextContent = _t ( "Card Title" ) ;
544+ break ;
545+ case "Call-To-Action Title" :
546+ translatedTextContent = _t ( "Call-To-Action Title" ) ;
547+ break ;
548+ case "Subtitle #01" :
549+ translatedTextContent = _t ( "Subtitle" ) + " #01" ;
550+ break ;
551+ case "Subtitle #02" :
552+ translatedTextContent = _t ( "Subtitle" ) + " #02" ;
553+ break ;
554+ }
555+
556+ /*
557+ * This code handles translating multiline phrases into languages
558+ * whose corresponding phrases have more words, while keeping the
559+ * same amount of lines
560+ *
561+ * Example: translating Welcome into Messaggio di
562+ * Message Benvenuto
563+ *
564+ * starting phrase = 2 lines, 2 words
565+ * translated phrase = 2 lines, 3 words
566+ */
567+ if ( sanitizedTextContent . length > 1 ) {
568+ const distributedTranslatedTextContent = [ ] ;
569+ const splitTranslatedTextContent = translatedTextContent . split ( / \s / ) ;
570+ const wordsPerLine = Math . ceil (
571+ splitTranslatedTextContent . length / sanitizedTextContent . length
572+ ) ;
573+
574+ for ( let i = 0 ; i < splitTranslatedTextContent . length ; i += wordsPerLine ) {
575+ distributedTranslatedTextContent . push (
576+ splitTranslatedTextContent . slice ( i , i + wordsPerLine ) . join ( " " )
577+ ) ;
578+ }
579+
580+ distributedTranslatedTextContent . forEach ( ( word , index ) => {
581+ elem . querySelectorAll ( "tspan" ) [ index ] . textContent = word ;
582+ } ) ;
583+ } else {
584+ const tspanEl = elem . querySelector ( "tspan" ) ;
585+ if ( tspanEl ) {
586+ tspanEl . textContent = translatedTextContent ;
587+ } else {
588+ elem . textContent = translatedTextContent ;
589+ }
590+ }
591+ } ) ;
592+ return doc . getElementsByTagNameNS ( "http://www.w3.org/2000/svg" , "svg" ) . item ( 0 ) ;
593+ }
594+
468595 async chooseTheme ( themeName ) {
469596 await this . applyConfigurator ( themeName ) ;
470597 }
0 commit comments