Skip to main content

Rails i18n: teljes Ruby on Rails nemzetköziesítési útmutató

Az első területifájltól az éles környezetig: állítsa be a Rails I18n rendszert, használja a t() segédet, kezelje a CLDR többes számot, javítsa a gyakori hibákat, és adjon intelligens területi tartalékláncokat.

1

A Rails I18n architektúrájának megértése

A Rails beépítve tartalmazza az I18n gemet. A fordításfájlok a config/locales/ könyvtárban vannak YAML (alapértelmezett) vagy Ruby formátumban. A keretrendszer t() segédet (az I18n.translate álnevét) biztosít nézetekben, vezérlőkben, modellekben és levelezőkben. A Rails I18n egyszerű: alapból fordítást, interpolációt és többes számot kezel.

config/application.rb
# Rails includes i18n out of the box via the i18n gem
# config/application.rb
module MyApp
  class Application < Rails::Application
    # Default locale
    config.i18n.default_locale = :en

    # Available locales
    config.i18n.available_locales = [:en, :de, :ja, :es, :fr, :'pt-BR']

    # Fallback to default locale when translation is missing
    config.i18n.fallbacks = true

    # Load translations from nested directories
    config.i18n.load_path += Dir[Rails.root.join('config', 'locales', '**', '*.{rb,yml}')]
  end
end
config/routes.rb
# config/routes.rb
Rails.application.routes.draw do
  scope "/:locale", locale: /en|de|ja|es|fr|pt-BR/ do
    root "home#index"
    resources :products
  end

  root "home#index"
end

# app/controllers/application_controller.rb
class ApplicationController < ActionController::Base
  around_action :switch_locale

  private

  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
A Rails automatikusan betölt minden .yml és .rb fájlt a config/locales/ könyvtárból. Tetszőlegesen rendezheti — nyelv (en.yml, de.yml), funkció (en/users.yml, en/orders.yml) vagy mindkettő szerint (en/users.yml, de/users.yml). Induláskor minden fájl egyesül.
2

Területi beállítások konfigurálása

Állítsa be a default_locale, available_locales és tartalékviselkedés értékeket a config/application.rb fájlban vagy inicializálóban. Az ApplicationController before_action hívásával állítsa be a területet URL, munkamenet, cookie vagy Accept-Language fejléc alapján.

config/locales/en.yml
# config/locales/en.yml
en:
  nav:
    home: "Home"
    about: "About"
    settings: "Settings"
  greeting: "Hello, %{name}!"
  cart:
    item_count:
      one: "%{count} item"
      other: "%{count} items"

# config/locales/de.yml
de:
  nav:
    home: "Startseite"
    about: "Über uns"
    settings: "Einstellungen"
  greeting: "Hallo, %{name}!"
  cart:
    item_count:
      one: "%{count} Artikel"
      other: "%{count} Artikel"
Az I18n.locale beállítása before_action hívásban kérésenként biztonságos, az I18n.default_locale futásidejű módosítása azonban globális, és minden szálra hat. Kéréshez mindig a szálspecifikus I18n.locale értéket használja, soha ne az I18n.default_locale értéket.
3

A t() segéd használata

A t() segéd mindenhol elérhető Railsben — nézetekben, vezérlőkben, modellekben, levelezőkben és feladatokban. Kulcsot, választható interpolációs változókat, alapértelmezett értéket és hatókört fogad. Nézetekben a Rails támogat lusta keresést, amely automatikusan az aktuális vezérlőhöz és művelethez rendeli a kulcsot.

app/views/example.html.erb
# In views (ERB)
<h1><%= t('nav.home') %></h1>
<p><%= t('greeting', name: @user.name) %></p>

# In controllers
flash[:notice] = t('flash.product_created')

# In models
validates :name, presence: { message: I18n.t('errors.blank') }

# With HTML (safe)
<%= t('terms_html', link: link_to(t('terms_link'), '/terms')) %>
4

Többes szám kezelése

A Rails I18n CLDR-kategóriákat használ: zero, one, two, few, many, other. Az angolhoz csak one és other kell, más nyelvekhez több alak. A célnyelvhez szükséges kategóriák alatt egymásba ágyazott YAML-kulcsokként adja meg a fordításokat.

Plural forms
# In YAML:
en:
  cart:
    item_count:
      zero: "No items"
      one: "%{count} item"
      other: "%{count} items"

# Arabic (6 forms):
ar:
  cart:
    item_count:
      zero: "لا عناصر"
      one: "عنصر واحد"
      two: "عنصران"
      few: "%{count} عناصر"
      many: "%{count} عنصرًا"
      other: "%{count} عنصر"

# Usage in views:
<%= t('cart.item_count', count: @cart.items.size) %>
A Rails I18n::InvalidPluralizationData hibát dob, ha az aktív területhez hiányzik egy szükséges kategória. Ha az orosz terület csak az angolból másolt one és other alakot tartalmazza, a 2, 3, 4 összeomlást okoz, mert az orosz few kategóriát igényel. Nyelvenként minden CLDR-kategóriát adjon meg.
5

Területi tartalékláncok hozzáadása

A Rails beépített I18n.fallbacks eleme csak alapvető regionális–alapértelmezett tartalékot kínál. Egy hiányzó kulccsal találkozó pt-BR felhasználó pt-PT helyett angolt lát. A rails-locale-chain beállítható mély egyesítésű láncokat ad, így mindig a legközelebbi fordítás jelenik meg.

Lazy lookups
# Lazy lookups use the controller/action as scope
# app/views/products/index.html.erb
# Instead of t('products.index.title'), just use:
<h1><%= t('.title') %></h1>
<p><%= t('.description') %></p>

# Rails looks up: products.index.title and products.index.description

# config/locales/en.yml
en:
  products:
    index:
      title: "All Products"
      description: "Browse our catalog"
A rails-locale-chain 11 nyelvcsalád több mint 75 láncát tartalmazza. Adja a Gemfile-hoz, állítsa be inicializálóban, és a regionális felhasználók angol hézagok helyett azonnal szülőterületi fordítást látnak.
6

Fordítások automatizálása

A Rails I18n beállítása után fordítsa le YAML-területifájljait mesterséges intelligenciával. Az i18n Agent natívan támogatja a YAML-t — a forrásfájlból az egymásba ágyazott kulcsok, interpolációs változók és alakok megőrzésével létrehozza a célnyelveket.

config/initializers/locale_chain.rb
# Gemfile
gem 'rails-locale-chain'

# config/initializers/locale_chain.rb
Rails.application.config.i18n.fallbacks = {
  'pt-BR': ['pt', 'en'],
  'zh-Hant-TW': ['zh-Hant', 'zh', 'en'],
  'es-419': ['es', 'en'],
}

# The gem deep-merges translations across the chain
# pt-BR -> pt -> en
# Missing keys in pt-BR are filled from pt, then en
Fordítson fokozatosan — új kulcsok hozzáadásakor csak a különbséget fordítsa le. Így megmaradnak a meglévő fordítások, és nem generálódnak újra változatlan szövegek.

Gyakori buktatók

InvalidPluralizationData hibák

A Rails I18n::InvalidPluralizationData hibával összeomlik, ha hiányzik egy szükséges CLDR-kategória. Leggyakrabban akkor, amikor az angol one/other alakokat több kategóriát igénylő nyelvre másolják (orosz: few; arab: zero/two/few/many). Telepítse a rails-i18n csomagot, és adja meg az összes kategóriát.

Lusta keresés nézeteken kívül

A lusta t('.key') keresés csak nézetekben működik, ahol a Rails ismeri a vezérlőt és műveletet. Modellben, levelezőben vagy szolgáltatásban hiányzó fordítás hibát ad. Nézeten kívül teljes kulcsot használjon: t('users.show.key').

A YAML-szintaxishibák minden fordítást megszakítanak

Egyetlen YAML-szintaxishiba (hibás behúzás, idézőjel nélküli különleges karakter, szóköz helyett tabulátor) megakadályozza a teljes fájl betöltését. Minden kulcs hiányzó fordítás hibát ad. Ellenőrizze a YAML-t CI-ben linterrel, és idézőjelezze a kettőspontot, zárójelet vagy kezdő különleges karaktert tartalmazó szövegeket.

Try i18n Agent Now

Drop your translation file here

JSON, YAML, PO, XML, CSV, Markdown, Properties

or click to browse

Target languages

No signup requiredInstant estimate

Rails i18n – gyakori kérdések