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
endQuesto 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
endQuesto 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_localein 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):
<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_timeerefreshsono 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:
- Integrazione con GitHub, GitLab o Bitbucket: connetti il tuo repository. PTC trova i tuoi file YAML, li traduce e ti invia una richiesta di merge con i nuovi file di lingua.
- API/CLI: integra nella tua pipeline CI/CD utilizzando l’API di PTC. Visualizza un repository Rails di esempio con GitHub Actions.
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.
Come localizzo date e ore?
Rails fornisce l’helper l (abbreviazione di localize) per formattare date e ore secondo le convenzioni di ogni locale:
<%= l Time.now, format: :long %>La gem rails-i18n che hai installato fornisce formati di data e ora predefiniti per molte lingue, inclusi i nomi dei mesi tradotti e la formattazione specifica per il locale. Puoi anche definire formati personalizzati nei tuoi file YAML.
Come localizzo numeri e valute?
Rails include helper per formattare numeri e valute in base al locale:
<%= number_to_currency(100, locale: :es) %> <!-- €100.00 -->
<%= number_with_delimiter(1000000) %> <!-- 1,000,000 -->
Questi helper rispettano le convenzioni specifiche del locale per i separatori decimali, i delimitatori delle migliaia e i simboli di valuta.
Posso creare file di vista diversi per ogni lingua?
Sì. Per le pagine con contenuti significativamente diversi per ogni locale, puoi creare file di vista separati:
app/views/pages/
about.html.erb <!-- Default -->
about.es.html.erb <!-- Spanish version -->
about.de.html.erb <!-- German version -->
Rails renderizza automaticamente la vista appropriata in base al locale corrente.
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.
