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.

Per mostrare 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]

Questa configurazione indica a Rails che:

  • L’inglese (:en) è la lingua predefinita
  • L’app supporta inglese, spagnolo e tedesco
  • Gli utenti possono passare da una di queste tre lingue all’altra

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

Questo crea URL specifici per il locale per la tua applicazione Rails. Gli utenti possono accedere a diverse versioni linguistiche modificando il parametro locale nell’URL.

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 codice:

  • Legge il locale dal parametro dell’URL
  • Ritorna al locale predefinito se non è presente alcun parametro
  • Assicura 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 globali hanno bisogno di un modo per passare da una lingua all’altra. Rails rende tutto questo semplice perché il metodo default_url_options in ApplicationController include automaticamente il locale corrente in tutti gli URL generati.

Ciò significa che puoi creare un selettore di lingua 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, il selettore viene aggiunto 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 la modifica
  • Rails renderizza la pagina nella nuova lingua

Poiché hai definito default_url_options in ApplicationController, Rails include automaticamente il locale in tutti i link generati. Ciò significa che il locale persiste mentre gli utenti navigano nella tua app. 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

Rails utilizza l’helper integrato I18n.t (o semplicemente t) per cercare le stringhe nei tuoi file di traduzione.

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>

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.

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 memorizza queste definizioni nella directory config/locales/.

Aggiungere le chiavi al tuo file inglese

I file di traduzione di Rails utilizzano una semplice struttura chiave-valore. 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"

In questa struttura i18n di Rails:

  • en è il codice della lingua (inglese)
  • hello, current_time e refresh sono chiavi di traduzione
  • Le stringhe a destra sono il testo effettivo
  • %{time} è un placeholder per contenuti dinamici (interpolazione)

Questo è il tuo file sorgente. Contiene tutto il testo nella tua lingua predefinita. Più avanti in questo tutorial, userai PTC per generare automaticamente le versioni in spagnolo, tedesco e altre lingue.

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

Le tue viste Rails sono ora internazionalizzate, ma che dire di JavaScript? Rails non estrae automaticamente il testo dai file JavaScript. Se la tua applicazione ha testo lato client come avvisi, tooltip o messaggi di conferma, devi aggiungerli al tuo file di traduzione inglese.

Ad esempio, per tradurre un popup di conferma, aggiungi la stringa a config/locales/en.yml:

# 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 della tua applicazione memorizzato nel file YAML. Invece di tradurre manualmente centinaia di stringhe, puoi usare Private Translation Cloud (PTC).

PTC usa l’IA per tradurre automaticamente i tuoi file YAML di Rails preservandone la struttura e le chiavi. Puoi iniziare con la prova gratuita, che ti permette di tradurre 20.000 parole in due lingue a scelta, senza bisogno di una carta di credito. In seguito, pagherai solo per quello che traduci (senza costi di abbonamento).

Una volta caricato e tradotto il primo file, puoi passare a un flusso di lavoro di localizzazione continua:

Per questa guida, abbiamo utilizzato l’integrazione Git per un flusso di lavoro completamente automatizzato. PTC si è connesso al nostro repository, ha creato versioni tradotte come es.yml e de.yml e ha aperto una pull request con i nuovi file nella stessa cartella.

Una volta unita la pull request, Rails carica automaticamente le traduzioni. Quando gli utenti cambiano lingua, la tua app mostra il testo corretto.

Per una guida completa alla configurazione, 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.

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