Skip to main content

Rails i18n: pilnīgs Ruby on Rails internacionalizācijas ceļvedis

No pirmā lokāles faila līdz produkcijai: konfigurējiet Rails I18n, izmantojiet palīgfunkciju t(), apstrādājiet CLDR daudzskaitli, novērsiet biežākās problēmas un pievienojiet viedas lokāļu atkāpšanās ķēdes.

1

Izprotiet Rails I18n arhitektūru

Rails ietver I18n gem. Tulkojumu faili atrodas config/locales/ direktorijā kā YAML (noklusējums) vai Ruby faili. Ietvars skatos, kontrolleros, modeļos un pasta sūtītājos nodrošina palīgfunkciju t() (I18n.translate aizstājvārdu). Rails I18n ir apzināti vienkāršs — tas uzreiz apstrādā pamata tulkošanu, interpolāciju un daudzskaitli.

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 automātiski ielādē visus .yml un .rb failus no config/locales/. Varat tos kārtot pēc saviem ieskatiem — pēc valodas (en.yml, de.yml), funkcijas (en/users.yml, en/orders.yml) vai abējādi (en/users.yml, de/users.yml). Rails palaišanas laikā sapludina visus failus.
2

Konfigurējiet lokāles iestatījumus

Failā config/application.rb vai inicializatorā iestatiet default_locale, available_locales un atkāpšanās darbību. ApplicationController konfigurējiet lokāles noteikšanu, izmantojot before_action, lai iestatītu lokāli no URL, sesijas, sīkfaila vai Accept-Language galvenes.

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"
I18n.locale iestatīšana before_action ir droša katram pieprasījumam, bet I18n.default_locale iestatīšana izpildlaikā ir globāla un ietekmē visus pavedienus. Pieprasījuma tvēruma lokāles izmaiņām vienmēr izmantojiet I18n.locale (lokālu pavedienam), nekad I18n.default_locale.
3

Izmantojiet palīgfunkciju t()

Palīgfunkcija t() ir pieejama visur Rails — skatos, kontrolleros, modeļos, pasta sūtītājos un darbos. Tā pieņem atslēgu, neobligātus interpolācijas mainīgos un tādas opcijas kā noklusējuma vērtības un tvērums. Skatos Rails atbalsta slinkos uzmeklējumus, kas automātiski piesaista atslēgas pašreizējam kontrollerim un darbībai.

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

Apstrādājiet daudzskaitli

Rails I18n izmanto CLDR daudzskaitļa kategorijas: zero, one, two, few, many, other. Angļu valodai nepieciešamas tikai one un other, bet citām valodām vajag vairāk formu. Definējiet daudzskaitļa tulkojumus kā ligzdotas YAML atslēgas zem tām skaita kategorijām, kas nepieciešamas jūsu mērķvalodām.

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) %>
Ja aktīvajai lokālei trūkst nepieciešamās daudzskaitļa kategorijas, Rails izmet I18n::InvalidPluralizationData. Ja krievu lokālē definētas tikai one un other formas (nokopētas no angļu valodas), tādi skaitļi kā 2, 3 un 4 izraisīs avāriju, jo krievu valodai nepieciešama kategorija few. Vienmēr definējiet visas katras valodas CLDR kategorijas.
5

Pievienot lokalizāciju atkāpšanās ķēdes

Rails iebūvētais I18n.fallbacks nodrošina tikai pamata atkāpšanos no reģionālās uz noklusējuma lokāli. Ja pt-BR lietotājam trūkst atslēgas, viņš redz angļu valodu, nevis pt-PT. rails-locale-chain pievieno konfigurējamas dziļās sapludināšanas ķēdes, lai reģionu lietotāji vienmēr redzētu tuvāko pieejamo tulkojumu.

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 ietver vairāk nekā 75 iebūvētas atkāpšanās ķēdes 11 valodu saimēm. Pievienojiet to Gemfile, konfigurējiet inicializatorā, un reģionu lietotāji angļu valodas iztrūkumu vietā uzreiz redzēs vecāklokāles tulkojumus.
6

Automatizēt tulkošanu

Kad Rails I18n iestatīšana ir pabeigta, tulkojiet YAML lokāļu failus ar MI. i18n Agent dabiski atbalsta YAML — norādiet tam avota lokāles failu, un tas ģenerēs visas mērķvalodas, saglabājot ligzdotas atslēgas, interpolācijas mainīgos un daudzskaitļa formas.

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
Tulkojiet pakāpeniski — pievienojot jaunas atslēgas, tulkojiet tikai izmaiņas. Tas saglabā esošos tulkojumus un novērš nemainīto virkņu atkārtotu ģenerēšanu.

Biežākās kļūdas

InvalidPluralizationData kļūdas

Rails avarē ar I18n::InvalidPluralizationData, ja trūkst nepieciešamās CLDR daudzskaitļa kategorijas. Visbiežāk tas notiek, kad angļu daudzskaitļa formas (one/other) tiek kopētas valodām, kam vajag vairāk kategoriju (krievu valodai vajag few, arābu — zero/two/few/many). Instalējiet rails-i18n pareizām CLDR kārtulām un definējiet visas kategorijas.

Slinkie uzmeklējumi ārpus skatiem

Slinkie uzmeklējumi (t('.key')) darbojas tikai skatos, kuros Rails zina kontrolleri un darbību. Izmantojot t('.key') modelī, pasta sūtītājā vai pakalpojuma objektā, tiek atgriezta trūkstoša tulkojuma kļūda. Ārpus skatiem izmantojiet pilnas atslēgas (t('users.show.key')).

YAML sintakses kļūdas sabojā visus tulkojumus

Viena YAML sintakses kļūda (nepareiza atkāpe, pēdiņās neietvertas speciālās rakstzīmes, tabulācijas zīme atstarpju vietā) neļauj ielādēt visu lokāles failu. Visi tulkojumi šajā failā atgriež trūkstošas atslēgas kļūdas. CI vidē pārbaudiet YAML failus ar analizatoru un lieciet pēdiņās virknes, kas satur kolus, iekavas vai sākuma speciālās rakstzīmes.

Izmēģiniet i18n Agent tūlīt

Nometiet tulkošanas failu šeit

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

vai noklikšķiniet, lai izvēlētos

Mērķa valodas

Reģistrācija nav vajadzīgaTūlītēja tāme

Rails i18n bieži uzdotie jautājumi