
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.
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.
# 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
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
endKonfigurē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
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"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.
# 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')) %>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.
# 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) %>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 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"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.
# 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 enBiežākās kļūdas
InvalidPluralizationData kļūdas
Slinkie uzmeklējumi ārpus skatiem
YAML sintakses kļūdas sabojā visus tulkojumus
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