Una lunga strada verso le lingue
È da un po' di tempo che ho lanciato un'idea che sembrava interessante oltre che stimolante: cosa sarebbe necessario per ottenere il supporto multilingue per la mia app Web con la minima manutenzione possibile? Considerando anche i costi come un vincolo principale (questo sito non pubblica annunci e non utilizza alcun tracciamento, quindi qui non ci sono entrate in entrata), come sarebbe una soluzione valida?
Il programma
Tutto inizia e finisce con il motore di traduzione da utilizzare. Grazie all'utilizzo di Ubuntu come uno dei miei driver quotidiani, una volta ho scoperto una simpatica app nell'app store chiamata "Argos translate", che è un motore di traduzione open source costruito sugli ultimi modelli ML simili a quelli che alimentano DeepL . Se non conosci DeepL, è un ottimo traduttore da utilizzare gratuitamente sul loro sito web.
Ma torniamo ad Argos: dopo aver dato un'occhiata al relativo repository, ho visto che è disponibile anche una libreria python OSS, che si adatterebbe perfettamente a un ambiente self-hosted. Dopo aver giocato per un breve periodo di tempo, ho deciso di dare un'occhiata ad alcuni traduttori tramite offerte SaaS, poiché l'intero processo di rata di argos translate non ha funzionato così bene come speravo.
Ho quindi impostato su un altro servizio, Cloud Translations di GCP che offre 500.000 caratteri gratis al mese e poi addebita dei soldi ogni 1.000.000.
Si tratta di memorizzare nella cache
Grazie alla configurazione di Next.js con ISG (generazione incrementale del sito) posso chiamare le traduzioni per ogni pagina su richiesta, il che semplifica notevolmente la pianificazione poiché non è necessario eseguire un'unica distribuzione con tutte le traduzioni contemporaneamente.
Tuttavia non ero sicuro di come gestire la memorizzazione nella cache delle stringhe tradotte. Certo, la rete edge di Vercel (dove è ospitata questa PWA) può assolutamente sfruttare questa attività. Ma volevo che le implementazioni fossero indipendenti dalle traduzioni. motivo per cui ho creato un ulteriore livello di memorizzazione nella cache tramite una semplice istanza di Firestore, anch'essa ospitata su GCP.
La sfida più grande è stata l'analisi e la sostituzione del contenuto del blocco per ogni articolo. Se non lo sai. Il contenuto del blocco descrive il corpo effettivo dell'articolo, che viene creato da me in un CMS. Al momento della traduzione, quei blocchi non sono in testo semplice ma piuttosto ciascuno incorporato in una struttura dati speciale per consentire l'archiviazione di informazioni semantiche o metadati. Rilevare in modo affidabile + tradurre solo le stringhe pertinenti è stata una delle parti più grandi di questa implementazione.
Un uomo, 12+ lingue
Le lingue (attualmente) supportate sono:
- "it": inglese
- "de": tedesco
- "fr": francese
- "es": spagnolo
- "eo": Esperanto
- "el": greco
- "ja": giapponese
- "ru": russo
- "ciao": hindi
- "lui": ebraico
- "tr": turco
- "af": afrikaans
- "ar": arabo
- "ko": coreano
Per testare le diverse varianti, inserisci semplicemente il codice della lingua dopo l'URL di base. Ad esempio: "https://flaming.codes/fr". E questo è tutto!
Riassumendo la mia implementazione, la configurazione si presenta così:
- ogni pagina viene costruita staticamente almeno ogni 4 ore, ma solo su richiesta; questo significa che un nuovo lavoro di traduzione viene svolto al massimo ogni 4 ore per un determinato sito
- le traduzioni stesse vengono prima caricate da Firestore; solo se non c'è nulla disponibile, le stringhe vengono tradotte + memorizzate nella cache in Firestore
Questa configurazione funziona così bene che non userò alcuna traduzione in modo classico, ad es. creando manualmente file json che conservano le coppie chiave-valore. Userò l'API Cloud Translation per tutto ciò che deve essere internazionalizzato, rendendolo completamente dinamico. Grazie a queste modifiche, la PWA ha circa 430 pagine al momento della stesura.
Ogni pagina viene tradotta dall'inglese in altre 13 lingue, che rappresentano quelle più parlate e quelle che si trovano in tutto il mondo tra di loro. Vediamo come si evolverà!
- Tom