Guida all’internazionalizzazione (i18n) e alla localizzazione di Rails

Configura Rails i18n e la localizzazione per la tua app. Organizza i file di traduzione, passa da una lingua all’altra e automatizza le traduzioni con l’IA.

Questa guida copre l’intero flusso di lavoro per l’internazionalizzazione di Rails: configurazione di i18n, organizzazione dei file di traduzione YAML, gestione dei contenuti dinamici e automazione delle traduzioni. Tocca anche la localizzazione software in senso più ampio, perché preparare la tua app Rails per la traduzione è solo una parte del processo per distribuire un prodotto che funzioni per utenti in altre lingue.

Per mostrarti come funziona in pratica l’internazionalizzazione di Rails, abbiamo creato una piccola applicazione demo in Ruby on Rails. L’app mostra l’ora corrente del server con un pulsante di aggiornamento e include un semplice selettore di lingua.

Puoi applicare questi concetti alla tua applicazione Rails esistente, oppure creare una nuova app Rails con rails new YourAppName e svilupparla insieme a noi.

Per il codice sorgente completo, consulta GitHub: Rails i18n Demo App

Configurazione dell’internazionalizzazione di Rails (i18n)

L’internazionalizzazione di Rails richiede tre passaggi di configurazione: impostare i locale disponibili, aggiungere il locale ai tuoi URL e fare in modo che Rails carichi il locale corretto per ogni richiesta. Ti consigliamo inoltre di installare la gem rails-i18n, che fornisce dati sui locale come i nomi dei mesi tradotti, le regole di pluralizzazione e i messaggi di errore predefiniti di Rails.

Imposta i locale disponibili

Per prima cosa, in config/application.rb, indica a Rails quali lingue deve supportare l’app e imposta un locale predefinito:

config.i18n.default_locale = :en
config.i18n.available_locales = [:en, :es, :de]

Questo indica a Rails che l’inglese è la lingua predefinita e che l’app supporta inglese, spagnolo e tedesco. Puoi aggiungere tutti i codici lingua di cui hai bisogno.

Aggiungere il locale agli URL

Successivamente, aggiungi il locale all’URL in modo che ogni lingua abbia il proprio percorso, come /en/time o /es/time:

# config/routes.rb
scope "/:locale" do
  get '/time', to: 'home#index', as: :time_display
end

Configurare il cambio di lingua

Infine, in app/controllers/application_controller.rb, assicurati che Rails carichi il locale corretto dall’URL e lo includa in tutti i link:

class ApplicationController < ActionController::Base
  around_action :switch_locale

  def switch_locale(&action)
    locale = params[:locale] || I18n.default_locale
    I18n.with_locale(locale, &action)
  end

  def default_url_options
    { locale: I18n.locale }
  end
end

Questo legge il locale dal parametro URL, torna al locale predefinito se non ne è presente nessuno e garantisce che tutti gli URL generati includano il locale corrente.

Installare la gem rails-i18n

La gem rails-i18n fornisce dati sui locale per più lingue, inclusi i nomi dei mesi tradotti, le regole di pluralizzazione e i messaggi di errore predefiniti di Rails. Questo ti evita di dover tradurre tu stesso queste stringhe standard.

Aggiungila al tuo Gemfile:

gem 'rails-i18n'

Quindi esegui:

bundle install

Rails è ora completamente configurato per l’internazionalizzazione.

Aggiungere un selettore di lingua

Ora che la tua app Rails supporta più locale, i tuoi utenti hanno bisogno di un modo per passare da una lingua all’altra. Poiché il metodo default_url_options in ApplicationController include automaticamente il locale corrente in tutti gli URL generati, puoi creare un selettore che aggiorna solo il parametro locale mantenendo l’utente sulla stessa pagina.

Creare l’interfaccia utente del selettore di lingua

Aggiungi il selettore di lingua al tuo file di layout. Nella nostra app demo, va in app/views/layouts/application.html.erb:

<nav>
  <%= link_to "English", url_for(locale: :en) %> |
  <%= link_to "Español", url_for(locale: :es) %> |
  <%= link_to "Deutsch", url_for(locale: :de) %>
</nav>

Ogni link utilizza url_for(locale: :locale_code) per generare un URL con il locale specificato. Quando un utente clicca su un link, il metodo switch_locale in ApplicationController rileva il cambiamento e Rails visualizza la pagina nella nuova lingua.

Poiché default_url_options è definito, il locale persiste mentre gli utenti navigano. Non è necessario aggiungere manualmente i parametri locale a ogni link.

Personalizzare lo stile del selettore di lingua

Puoi personalizzare lo stile del selettore di lingua in app/assets/stylesheets/application.css per adattarlo al tuo design. L’app demo include uno stile di base per rendere il selettore visibile e facile da usare.

Impostare le chiavi di traduzione nelle viste di Rails

Prima di poter tradurre la tua app, tutto il testo rivolto all’utente deve risiedere nei file i18n di Rails invece di essere codificato direttamente (hard-coded). Rails fornisce il metodo helper t (abbreviazione di translate) per cercare e visualizzare le stringhe tradotte.

Sostituire il testo codificato con chiavi di traduzione

Il testo codificato direttamente non apparirà nel tuo file YAML, il che significa che non potrà essere tradotto in seguito. Usa sempre le chiavi di traduzione per qualsiasi testo rivolto all’utente.

Corretto (utilizzando chiavi di traduzione):

ERB
<h1><%= t(:hello) %></h1>
<p><%= t(:current_time, time: @time) %></p>
<button id="click-me"><%= t(:refresh) %></button>

Non corretto (testo hard-coded):

<h1>Hello</h1>
<p>Current time: <%= @time %></p>
<button>Refresh</button>

Usare l’interpolazione nelle traduzioni

Hai notato il parametro time: @time nell’esempio sopra? Si chiama interpolazione — ti permette di inserire valori dinamici nelle tue traduzioni. La stringa di traduzione nel tuo file YAML utilizza %{time} come placeholder:

current_time: "Current time: %{time}"

Quando chiami l’helper t con time: @time, Rails sostituisce %{time} con il valore effettivo. Puoi usare qualsiasi nome di variabile desideri, assicurati solo che corrispondano tra il file YAML e la tua vista.

Lazy Lookup per un codice più pulito

Quando le tue chiavi di traduzione sono organizzate per corrispondere alla struttura delle cartelle delle tue viste, Rails ti permette di usare una scorciatoia chiamata lazy lookup. Invece di scrivere l’intero percorso della chiave, usa un punto iniziale:

<!-- Instead of this: -->
<%= t('home.index.hello') %>

<!-- You can write this: -->
<%= t('.hello') %>

Rails controlla in quale file di vista ti trovi (home/index.html.erb) e aggiunge automaticamente home.index. davanti alla tua chiave. Questo mantiene il tuo codice più pulito e rende più facile spostare le viste. Se rinomini o sposti una vista, i percorsi di lazy lookup si aggiornano automaticamente.

Creare e organizzare i file di traduzione

Ora che hai aggiunto le chiavi di traduzione alle tue viste, devi definire quelle chiavi in un file YAML. Rails le memorizza nella directory config/locales/.

Aggiungi le chiavi al file della lingua di origine

Apri config/locales/en.yml e aggiungi le chiavi a cui hai fatto riferimento nelle tue viste:

# config/locales/en.yml
en:
  hello: "Hello"
  current_time: "Current time: %{time}"
  refresh: "Refresh"

Questo è il tuo file di origine — contiene tutto il testo nella tua lingua predefinita. Le chiavi a sinistra sono quelle a cui fanno riferimento le tue viste; le stringhe a destra sono quelle che vengono visualizzate.

Organizzare le chiavi con l’annidamento

Per usare il lazy lookup (la scorciatoia .hello della sezione precedente), organizza le tue chiavi in modo che corrispondano alla struttura delle cartelle delle tue viste:

en:
  home:
    index:
      hello: "Hello"
      current_time: "Current time: %{time}"
      refresh: "Refresh"

Questo raggruppa tutte le traduzioni per app/views/home/index.html.erb sotto home.index. Ora puoi usare t('.hello') in quella vista invece di t('home.index.hello').

Man mano che la tua applicazione Rails cresce, puoi anche creare namespace per le traduzioni condivise (come shared.navigation per i menu) per mantenere le cose organizzate, ma questo è opzionale.

Aggiungere stringhe JavaScript allo YAML

Rails non estrae automaticamente il testo dai file JavaScript. Se la tua app ha testo lato client come avvisi, tooltip o messaggi di conferma, aggiungili al tuo file di traduzione inglese:

# config/locales/en.yml
en:
  confirm: "Are you sure?"

A questo punto, il tuo file en.yml contiene tutto il testo che appare nella tua app, sia nelle viste Rails che in JavaScript.

Quando utilizzi PTC per tradurre la tua applicazione (trattato nella sezione successiva), queste stringhe JavaScript verranno tradotte insieme a tutto il resto.

Tradurre app Rails con PTC

Ora è il momento di ottenere le traduzioni per tutto il testo nel tuo file YAML. Invece di tradurre manualmente centinaia di stringhe, puoi usare Private Translation Cloud (PTC).

PTC utilizza l’AI per tradurre i tuoi file YAML preservandone la struttura, le chiavi e i placeholder. Puoi iniziare con la prova gratuita, che ti permette di tradurre 20.000 parole in due lingue qualsiasi — senza carta di credito. Dopodiché, paghi solo per ciò che traduci.

Se vuoi sapere quali sono i costi per il tuo progetto prima di registrarti, il calcolatore dei prezzi ti fornisce una stima immediata.

Dopo la registrazione, un wizard di configurazione ti guida attraverso alcuni rapidi passaggi: caricamento del tuo file YAML e impostazione dei percorsi di output, selezione delle lingue di destinazione e aggiunta di una breve descrizione della tua applicazione e del suo pubblico. Per una guida completa, consulta la nostra Guida introduttiva.

Convertire le traduzioni per JavaScript

Ora che hai i file YAML tradotti da PTC, devi rendere tali traduzioni disponibili per JavaScript. JavaScript non può leggere direttamente i file YAML: ha bisogno di file JSON.

Installare i18n-js

La gem i18n-js converte i tuoi file di traduzione YAML nel formato JSON leggibile dai browser.

Aggiungi la gem al tuo Gemfile:

gem 'i18n-js'

Quindi esegui:

bundle install

Dopo l’installazione, inizializza la gem:

i18n init

Questo genera un file di configurazione. Aggiornalo per esportare le traduzioni in public/locales.json:

# config/i18n.rb
require "i18n-js"

I18n::JS.config do |config|
  config.export_i18n_js = false
  config.translations_path = "public/locales.json"
end

Esportare le traduzioni in JSON

Esegui il comando di esportazione per generare il file JSON:

i18n export

Questo legge tutti i tuoi file YAML (en.yml, es.yml, de.yml) e crea public/locales.json con tutte le traduzioni in un formato utilizzabile da JavaScript.

Caricare le traduzioni in JavaScript

Rails 7+ include Importmap per la gestione delle dipendenze JavaScript senza bundler.

Fissa la libreria i18n-js in config/importmap.rb:

# config/importmap.rb
pin "i18n-js", to: "https://esm.sh/i18n-js@latest/dist/import/index.js"
pin "load_locale", to: "load_locale.js"

Crea una funzione di caricamento in app/javascript/load_locale.js:

// app/javascript/load_locale.js
export async function loadLocale() {
  const response = await fetch('/locales.json');
  const data = await response.json();
  return data;
}

Questa funzione recupera il file JSON contenente tutte le tue traduzioni.

Usare le traduzioni in JavaScript

Passa il locale corrente a JavaScript aggiungendolo al tag <body> nel tuo layout:

<!-- app/views/layouts/application.html.erb -->
<body data-locale="<%= I18n.locale %>">

Quindi importa i18n-js e usa le traduzioni nel tuo JavaScript:

// app/javascript/application.js
import { I18n } from "i18n-js"
import { loadLocale } from "./load_locale"

document.addEventListener('turbo:load', async () => {
  // Load all translations
  const translations = await loadLocale()
  const i18n = new I18n(translations)

  // Set the locale from the body tag
  i18n.locale = document.body.dataset['locale']

  // Use translations in your JavaScript
  if (confirm(i18n.t('confirm'))) {
    // User clicked OK
  }
})

Il metodo i18n.t() funziona come l’helper t di Rails. Quando gli utenti cambiano lingua, JavaScript utilizza automaticamente le traduzioni corrette dall’attributo data-locale.

Traduzione dei contenuti del database

La sezione precedente ti ha mostrato come tradurre le stringhe statiche nei tuoi file YAML. Se la tua app memorizza contenuti nel database, come articoli di blog, descrizioni di prodotti o qualsiasi cosa creata tramite un CMS, quelle stringhe non appariranno nei tuoi file YAML e non possono essere tradotte allo stesso modo.

Per i contenuti del database, puoi utilizzare direttamente l’API PTC. Funziona inviando i tuoi contenuti a PTC, quindi recuperando le traduzioni una volta pronte. Puoi utilizzare un URL di callback in modo che PTC notifichi la tua app quando le traduzioni sono complete, oppure verificare lo stato da un job in background.

Consulta tutti i passaggi nella guida alla traduzione di contenuti dinamici in Rails.

Altre funzionalità di Rails i18n

Questa guida ha trattato il flusso di lavoro principale dell’internazionalizzazione di Rails: configurazione di i18n, organizzazione delle traduzioni e automazione del processo di traduzione. Rails i18n include funzionalità aggiuntive di cui potresti aver bisogno man mano che la tua applicazione cresce.

Pronto a tradurre la tua app Rails?

Inizia la tua prova gratuita di 30 giorni con PTC e ottieni 20.000 parole tradotte in due lingue, senza carta di credito.

Scorri verso l'alto