Skip to main content

Rails i18n: Komplett veiledning i internasjonalisering av Ruby on Rails

Fra den første språkfilen til produksjon: Konfigurer Rails I18n, bruk t()-hjelperen, håndter CLDR-flertallsbøying, rett vanlige fallgruver og legg til smarte reservekjeder for språkvarianter.

1

Forstå arkitekturen i Rails I18n

Rails leveres med I18n-gemmen innebygd. Oversettelsesfilene ligger i config/locales/ som YAML-filer (standard) eller Ruby-filer. Rammeverket tilbyr t()-hjelperen (et alias for I18n.translate) i visninger, kontrollere, modeller og e-postklasser. Rails I18n er enkelt med hensikt – det håndterer grunnleggende oversettelse, interpolering og flertallsbøying direkte.

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
Rails laster automatisk inn alle .yml- og .rb-filer fra config/locales/. Du kan organisere dem som du vil – etter språk (en.yml, de.yml), etter funksjon (en/users.yml, en/orders.yml) eller begge deler (en/users.yml, de/users.yml). Rails slår sammen alle filene ved oppstart.
2

Konfigurer språkinnstillingene

Angi default_locale, available_locales og reserveatferd i config/application.rb eller en initialiseringsfil. Konfigurer registrering av språkvariant i ApplicationController ved å bruke before_action til å angi språkvarianten fra nettadressen, økten, informasjonskapselen eller Accept-Language-hodet.

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"
Det er trygt å angi I18n.locale i en before_action for hver forespørsel, men å angi I18n.default_locale under kjøring er globalt og påvirker alle tråder. Bruk alltid I18n.locale (trådlokal) for endringer av språkvariant som gjelder én forespørsel, aldri I18n.default_locale.
3

Bruk t()-hjelperen

t()-hjelperen er tilgjengelig overalt i Rails – i visninger, kontrollere, modeller, e-postklasser og jobber. Den tar imot en nøkkel, valgfrie interpoleringsvariabler og alternativer som standardverdier og virkeområde. I visninger støtter Rails relative oppslag som automatisk avgrenser nøklene til gjeldende kontroller og handling.

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

Håndter flertallsbøying

Rails I18n bruker CLDR-kategoriene for flertall: zero, one, two, few, many, other. Engelsk trenger bare one og other, men andre språk trenger flere former. Definer flertallsoversettelser som nøstede YAML-nøkler under count-kategoriene målspråkene krever.

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) %>
Rails utløser I18n::InvalidPluralizationData hvis en nødvendig flertallskategori mangler for den aktive språkvarianten. Hvis den russiske språkvarianten bare definerer one og other (kopiert fra engelsk), vil antall som 2, 3, 4 føre til krasj fordi russisk krever kategorien few. Definer alltid alle CLDR-kategoriene for hvert språk.
5

Legg til reservekjeder for språkvarianter

Den innebygde I18n.fallbacks-funksjonen i Rails gir bare en grunnleggende reserve fra en regional språkvariant til standardspråket. En pt-BR-bruker ser engelsk i stedet for pt-PT når en nøkkel mangler. rails-locale-chain legger til konfigurerbare kjeder med dyp sammenslåing, slik at regionale brukere alltid ser den nærmeste tilgjengelige oversettelsen.

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"
rails-locale-chain leveres med 75+ innebygde reservekjeder som dekker 11 språkfamilier. Legg den til i Gemfile, konfigurer den i en initialiseringsfil, og regionale brukere vil umiddelbart se oversettelser fra den overordnede språkvarianten i stedet for manglende tekst som erstattes med engelsk.
6

Automatiser oversettelser

Når oppsettet av Rails I18n er fullført, kan du oversette YAML-språkfilene med AI. i18n Agent støtter YAML direkte – pek verktøyet mot kildespråkfilen, så genererer det alle målspråkene og bevarer nøstede nøkler, interpoleringsvariabler og flertallsformer.

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
Oversett trinnvis – når du legger til nye nøkler, oversetter du bare endringene. Dette bevarer eksisterende oversettelser og unngår å generere uendrede strenger på nytt.

Vanlige fallgruver

InvalidPluralizationData-feil

Rails krasjer med I18n::InvalidPluralizationData når en nødvendig CLDR-kategori for flertall mangler. Dette skjer oftest når engelske flertallsformer (one/other) kopieres til språk som trenger flere kategorier (russisk trenger few, arabisk trenger zero/two/few/many). Installer rails-i18n for riktige CLDR-regler, og definer alle kategoriene.

Relative oppslag utenfor visninger

Relative oppslag (t('.key')) fungerer bare i visninger der Rails kjenner kontrolleren og handlingen. Bruk av t('.key') i en modell, e-postklasse eller tjeneste returnerer en feil om manglende oversettelse. Bruk fullstendige nøkler (t('users.show.key')) utenfor visninger.

YAML-syntaksfeil ødelegger alle oversettelser

Én enkelt YAML-syntaksfeil (feil innrykk, spesialtegn uten anførselstegn eller tabulator i stedet for mellomrom) hindrer hele språkfilen i å lastes inn. Alle oversettelsene i filen returnerer feil om manglende nøkler. Valider YAML-filene med en syntakskontroll i CI, og sett strenger som inneholder kolon, hakeparenteser eller innledende spesialtegn, i anførselstegn.

Prøv i18n Agent nå

Slipp oversettelsesfilen din her

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

eller klikk for å bla gjennom

Målspråk

Ingen registrering krevesUmiddelbart estimat

Vanlige spørsmål om Rails i18n