Uluslararası pazarlama

URL'lerden JavaScript'e Rails Uluslararasılaştırılması

URL'lerden JavaScript'e Rails Uluslararasılaştırılması
Elizabeth Pokorny
Yazan:
Elizabeth Pokorny
Gözden geçiren:
Güncelleme:
18 Mayıs 2026

Raylı gemiler, uluslararasılaşma çerçevesi entegre edilmiştir. Başlamak için daha fazla fazla şeye ihtiyacınız yok – I18n API yığının bir parçasıdır ve temel konuları iyi yönetir: statik dizeleri çevirmek, tarih ve sayıları biçimlendirmek ve yerel çoğulmayı yönetmek.

Ama "dahili olmak" "tam" demek değildir. Gereksinimleriniz yerelleştirilmiş URL'ler, JavaScript çevirileri veya çok dilli SEO'ya kadar uzandığında, Rails'in doğal olarak sağladığı şeyin dışında çalışmış olursunuz. Bu boşluklar kasıtlı mimari kararlar gerektirir.

Her iki katmanı da gözden geçirelim: Rails I18n API Yönetme konularını ve nerede inşa etmeniz – ya da devretmeniz gerektiğini belirtir.

i18n hangi rayları kapsar ve nerede durur

The I18n API size iki temel yöntem sunar: I18n.t dizeleri çevirmek için ve I18n.l tarih ve sayıları yerelleştirmek için. Her ikisi de config/locales/'de YAML veya Ruby dosyalarından okuyor ve Rails onları başlatıldığında otomatik olarak yüklüyor.

Kutudan çıktığı gibi, bu statik kullanıcı arayüzü dizeleri, tarih ve sayı biçimlendirmeleri ile ActiveRecord doğrulama mesajlarını kapsar. Çoğu tek dilden tek dile proje için bu yeterli paket sunar.

Daha ileri gittikçe boşluklar hızla ortaya çıkıyor.

Rails I18n'in URL yapısı hakkında bir görüşü yoktur: yerelleştirilmiş rotalar, alt alan tespiti veya yol önekleri yoktur. Veritabanında depolanan içerik gibi ürün isimleri veya blog yazıları gibi bir sisteme sahip değildir. JavaScript dosyaları tamamen pipeline'ın dışında kalıyor. Ve çok dilli SEO, örneğin hreflang etiketleri, çevrilmiş sümüklü böcekler ve dile özgü site haritaları gibi şeyler, çerçevenin dokunmadığı ayrı çalışmalar gerektirir.

İnşaat yapmadan önce sınırın nerede olduğunu bilmeniz gerekir.

I18n Vakfı'nın Kurulması

Raylar-i18n mücevheriyle başlayabilirsiniz.

Rails sadece İngilizce yerel verilerini gönderir, bu yüzden I18n.l(Date.today) İngilizce olmayan yerel verilerde başarısız olur ve Aktif Kayıt doğrulama mesajları gibi çerçeve seviyesindeki dizilerle mevcut yerel veriler bağımsız olarak İngilizce kalır.

# Gemfile

 gem "raylar-i18n"

Sonra uygulama varsayılan ayarlarını yapılandır:

# config/application.rb

config.i18n.default_locale = :en

config.i18n.available_locales = [:en, :fr]

config.i18n.enforce_available_locales = doğru

enforce_available_locales = true, uygulamanız o listenin dışında bir yerel ayarını ayarlamaya çalışırsa hata oluşturur. Bu olmadan, bir yazım hatası veya yanlış oluşturulmuş URL parametresi sessizce desteklenmeyen bir yerel üretimi ayarlar.

Modern Rails bir seviye derinlikte tarar ama genellikle derin iç içe klasörleri ( config/locales/views/products/) kaçırır. Bu satırı eklemek, uygulamanız büyüdükçe her alt dizinin dahil edilmesini sağlar:

config.i18n.load_path += Dir[Rails.root.join("config", "locales", "**", "*.{ rb,yml}")]

Bu, çeviri dosyalarını alan adına göre bölmenize olanak tanır:

yapılandırma/locales/  
 en/    
 models.yml    
 views.yml    
 mailers.yml  
 fr/    
 models.yml    
 views.yml    
 mailers.yml

⚠️ YAML, doğru ve yanlış gibi değerleri boolean olarak ayrıştırır. Eğer onları kelimesi kelimesine alıntı yapmanız gerekiyorsa, açıkça alıntılayın. Modern Ruby/YAML versiyonları artık evet ve hayır dizeleri olarak ele alıyor, ancak uyumluluk için alıntı yapmak güvenli bir alışkanlık olarak kalıyor:

en:  
 Cevaplar:    
 Onay: "Evet" Olumsuz    
		: "Hayır"

Bu, yalnızca bir çeviri "evet" yerine true döndürdüğünde ve görünümünüz hiçbir şey vermediğinde ya da daha kötüsü, diziyi "doğru" olarak gösterdiğinde ortaya çıkan bir hata sınıfını yakalıyor.

Çeviri Yardımcıları ve Görünümlerde Tembel Arama

Görünümlerde, t ve l sürekli kullanacağınız iki yardımcı karakterdir.

l, tarihleri, saatleri ve sayıları mevcut bölgeye göre yerelleştirir. Rails-i18n yüklüldüğünde, 100+ yerel için format tanımları da dahil edilir. Eğer bu olmadan, İngilizce olmayan bir yerde l(Date.today) çağırıldığında genellikle 'çeviri eksik' dizesi veya biçimlendirilmemiş bir tarih döner, çünkü Rails gerekli yerel format kalıplarına sahip değildir.

<%= l(Date.today) %>

<%= l(Date.today, format: :long) %>

t telleri anahtara göre çevirir. Tam formu t("products.index.title"), ancak görünümlerde tembel arama kısaltmasını kullanabilirsiniz:

<%= t(".title") %>

Öndeki nokta, Rails'e mevcut görüş yoluna göre anahtarı çözmesini söyler. app/views/products/index.html.erb içinde t(".title") otomatik olarak t("products.index.title") olarak genişler. Anahtarları kısa tutar ve ekstra çaba harcamadan tutarlı bir adlandırma geleneğini uygular.

For interpolation, use %{variable} in your YAML and pass the value as a keyword argument:

en:  
	welcome: "Hello, %{name}"
<%= t(".welcome", name: current_user.name) %>

Eğer bir çeviri güvendiğiniz HTML içeriyorsa, anahtar adının üzerine _html ekleyin. Raylar, html_safe çağrısı gerektirmeden otomatik olarak güvenli işaretler.

en:  
	notice_html: "Please <strong>confirm</strong> your email."

Tembel arama sadece Raylar görüş yolunu çıkarabildiğinde işe yarar, yani arka plan işlerinde çalışmaz ve API Kontrolörler. Bu bağlamlarda, her seferinde tam anahtarı kullanın.

Bir Loken Tespit Stratejisi Seçmek

Herhangi bir yerel tespit kodu yazmadan önce bir strateji seçin. Beş ana yaklaşım vardır ve doğru olanı uygulamanızın yapısına ve SEO gereksinimlerine bağlıdır.

Strateji Örnek Kimler için uygun
URL parametresi /products?locale=fr İç araçlar, hızlı prototiplemeler
Yol öneki /fr/ürünler Çok dilli SEO gerektiren halka açık siteler
Alt alan adı fr.example.com Belirgin bölgesel markalar
Özet example.fr Zaten sahip olduğunuz ülkeye özgü alan adları
DB tercihi Kullanıcı kaydında saklanır Kullanıcı ayarlarıyla kimlik doğrulamalı uygulamalar

Yol öneki, örneğin /fr/products, halka açık Rails uygulamaları için en yaygın seçenektir. Her URL'de yerel olarak açık bir şekilde korunur ve arama motorları bu dile bağımsız olarak indeksleyebiliyor.

Alt alan ve TLD stratejileri, daha güçlü bir bölgesel kimlik istediğinizde iyi çalışır, ancak DNS yapılandırması ve SSL sertifikası yükü ekler.

/products?locale=fr gibi URL parametreleri, SEO'nun önemi olmayan iç araçlar için uygundur.

Veritabanı tarafından saklanan tercihler , yerel konumun URL'yi değil, kullanıcıyı takip ettiği doğrulanmış uygulamalar için çalışır.

Hangi stratejiyi seçerseniz seçin, ince üretim hatalarına yol açan bir uygulama hatası var: I18n.locale = doğrudan kullanmak.

# Don't do this

before_action { I18n.locale = params[:locale] }

I18n.locale = Thread.current'e yazar.

Eğer bir Puma web sunucusu kullanıyorsanız, bu isimler arasında iş parçacıklarını yeniden kullanır. Bir istek yerel olarak belirlenmezse, önceki isteğin geride bıraktığı şeyi devralır.

Tek bir iş parçacığı ile yerel geliştirmede bu asla ortaya çıkmaz. Üretimde, tekrarlanması zor ve izlenmesi zor olan aralıklı yanlış dil yanıtlarına yol açar.

Bunun yerine I18n.with_locale around_action içinde kullanın:

around_action :switch_locale d


ef switch_locale(&action)  
 locale = paramlar[:locale] || I18n.default_locale  
 I18n.with_locale(locale, &action)
Son

with_locale, talep nasıl bittiğine bakılmaksızın, blok çıktıktan sonra önceki yerel konumu geri getirir.

Yerel Rotaların ve Alt Alan Algılamanın Uygulanması

Yollarınızı /:locale altında kapsama salın ve default_url_options geçersiz kılın ki Rails otomatik olarak mevcut locale'i her URL yardımcısına önde göndersin:

# config/routes.rb
scope "/:locale" do
  resources :products
  root "home#index"
end

# app/controllers/application_controller.rb
around_action :switch_locale

def switch_locale(&action)
  locale = params[:locale]
  # Fallback to default if the param is missing or unsupported
  valid_locale = I18n.available_locales.map(&:to_s).include?(locale) ? locale : I18n.default_locale
  I18n.with_locale(valid_locale, &action)
end

def default_url_options
  { locale: I18n.locale }
end

default_url_options ayarlandığında, mevcut yerel :fr olduğunda products_path otomatik olarak /fr/products olarak render edilir.

Varsayılan yerel olarak ön ekin çıkarılmasını istiyorsanız, segmenti "(:locale)" kapsamıyla isteğe bağlı yapın. Bu İngilizce için /products , Fransızca için /fr/products olarak hizmet veriyor, ancak belirsizlik katıyor. /about gibi bir yol, rota sıranıza bağlı olarak ya eksik bir konuma ya da about adlı bir kontrolcüye eşleşebilir.

Alt alan algısı için request.subdomains.first adresini okuyun ve herhangi bir şey ayarlamadan önce available_locales ile doğrulayın:

def extract_locale_from_subdomain
 alt domain = request.subdomains.first
  Subdomain.blank ise  nil  döndür? || subdomain == "www"
 alt alan adı ise I18n.available_locales.map(&:to_s).include?( alt alan)
Son

www kontrolü, bunun bir bölge olarak ele alınmasını engelliyor. Localhost'ta request.subdomains boş bir dizi döndürür, bu yüzden alt alan tanımı geliştirmede başarısız olur, ta ki bir Pow sunucusu kullanmıyorsanız veya /etc/host'a giriş eklemedikçe.

Ayrı ayrı yapılandırmak gereken bir şey: ApplicationController'da tanımlanan default_url_options posta gönderilerine veya arka plan işlerine yayılmaz. Bu bağlamlar için açıkça ayarlayın:

Rails.application.routes.default_url_options = { host: "example.com", locale: :en }

Yerel rotalar URL yapısını verir, ancak hreflang etiketleri, çevrilmiş sluglar ve çok dilli site haritaları bu kurulumdan sonra tamamen manuel olarak kalır.

Weglot'nin ters proxy entegrasyonu bu katmanı otomatik olarak yönetir, ek yapılandırma olmadan hreflang etiketleri ve dile özgü URL'ler oluşturur.

Çoğulma, Geri Dönüşler ve raylar-i18n Mücevheri

İngilizce çoğul kullanımı basittir. Bir form tekil, biri diğer her şey için.

en:
  messages:
    one: "%{count} message"
    other: "%{count} messages"

Çoğu dil o kadar basit değildir.

Örneğin, Bulgarca'da düzenli çoğul ve erkil biçimdeki bazı kelimeler için özel bir "sayma çoğulu" bulunur. Yani ден (gün) normalde дни (birçok gün) olur, sayıldığında два дена (iki gün) olur.

bg:
  cities:
    one: "%{count} ден"
    few: "%{count} дена"
    many: "%{count} дни"

Rails-i18n olmadan Rails bu kurallar hakkında hiçbir bilgiye sahip değildir. Bulgarca çevirileriniz ya hata yapar ya da her sayımda diğer forma geri döner.

Taş, 100+ yer için çoğulma mantığı sunuyor, böylece Bulgarca, Rusça, Arapça, Lehçe ve İngilizce çoğul kuralları olmayan diğer dillerde işler doğru çözülüyor.

Yedek önlemler ayrı bir endişe ve varsayılan olarak kapalı. Bunlar olmadan, eksik olan herhangi bir çeviri anahtarı, üretimde eksik bir çeviri dizesini oluşturur. İşte bu tür şeyler gönderilir ve ekran görüntülerinde görünür.

Geri dönüşleri etkinleştirin ve config/application.rb içinde varsayılan bir hedef tanımlayın:

config.i18n.fallbacks = [I18n.default_locale]

Geri dönüşler = doğrudursa, mevcut konumda eksik bir anahtar default_locale'a geri döner. Bölgesel varyantlar için açık zincirler tanımlayabilirsiniz:

config.i18n.fallbacks = { "fr-CA": :fr, "en-GB": :en }

Bunu erken ayarlayın. Üretimde kısmi çevirileri olan bir uygulamaya yedekleme davranışını aktarmak, başlangıçta kurmaktan daha zor.

Uyarıcı Denetleyicilere ve JavaScript'e Çeviriler Aktarma

JavaScript'in Rails I18n boru hattına erişimi yoktur.

Çeviri dosyalarınız ile Stimulus kontrolcüleriniz arasında t-helper, YAML yükleyici veya yerleşik köprü yok. Çevirileri sunucu tarafından açıkça iletmeniz gerekiyor.

Teşvik için en basit yaklaşım değerlerdir API. Çeviriyi denetleyicide bir değer olarak tanımlayın, HTML'de ayarlayın ve JavaScript'te okuyun:

# app/views/products/index.html.erb
<div data-controller="notification"
     data-notification-message-value="<%= t('.success_message') %>">

Değer, standart t yardımcısı kullanılarak sunucu tarafında render edilir, böylece mevcut yerel otomatik olarak saygı gösterir. JavaScript tarafında, bunu statik bir değer olarak ilan edin ve değerleri üzerinden okuyun API:

// app/javascript/controllers/notification_controller.js
export default class extends Controller {
  static values = { message: String }

  show() {
    alert(this.messageValue)
  }
}

Her çeviri açıkça ve ihtiyacı olan kontrolcüye göre kapsamlıdır. Hiçbir şey küresel kapsama sızmıyor.

Bir denetleyici aynı anda birden fazla çeviriye ihtiyaç duyuyorsa, bunları bir JSON veri özniteliği olarak paketlemek, her dizim için ayrı değer tanımları eklemekten daha temizdir:

<div data-controller="cart"
     data-cart-i18n-value="<%= { add: t('.add'), remove: t('.remove') }.to_json %>">

JavaScript tarafında, i18n'i bir Nesne değeri olarak ilan edin ve bireysel anahtarlara doğrudan erişin:

static values = { i18n: Object }

add() {
  console.log(this.i18nValue.add)
}

JavaScript'in birçok denetleyicide geniş çeviri erişimi gerektirdiği uygulamalar için, i18n-js gem YAML dosyalarınızı I18n.t("key") olarak sorgulayabileceğiniz bir JavaScript nesnesine dışa aktarır.

İşliyor, ama bir derleme adımı ekliyor ve tüm çeviri setinizi istemciye gönderiyor. İlk iki desen tekrara başladığında kullanın, varsayılan olarak değil.

Turbo Frames kullanıldığında, bir Turbo Frame'in src URL'si yerel ön eki çıkarıyorsa, talep genellikle Routing Error (404) ile başarısız olur çünkü kapsam "/:locale" deseninizle eşleşmez. Çerçeve kaynakları için her zaman yerel farkında yol yardımcıları kullanın.

Bu bir Turbo hatası değil. Bunun yerine, bu bir yönlendirme gözden saçırmasıdır ve yerel algılama bölümündeki around_action, çerçevedeki her URL yerel farkında yol yardımcısı kullandığı sürece bunu engeller.

Weglot'nin ters proxy'si tamamen farklı bir yaklaşım benimser. Sayfa yüklendikten sonra render edilen DOM'u çevirir, böylece Stimulus tarafından render edilen içerik ve dinamik olarak eklenen dizilerle bu kablolama olmadan kapsanır.

I18n'nin Hangi Rayları Çıkarıyor

Raylar I18n'in işlediği üç kategori tamamen dışındadır:

  • Rails i18n'de çok dilli SEO dizileri çevirir ancak hreflang etiketleri, dile özgü site haritaları veya çevrilmiş meta veriler üretmez. Bu görevler, i18n kurulumunun ötesinde manuel iş gerektirir.
  • Veritabanında saklanan içerik, örneğin ürün isimleri ve blog yazıları, YAML dosyalarında saklanamaz. Mobility mücevher bunun için önerilir, çünkü birden fazla depolama arka uçunu destekliyor. Traco , sütun başına çevirilere sahip küçük modeller için daha hafif bir alternatiftir.
  • Rails'taki çeviri iş akışı YAML dosyalarına dayanır. Çeviri sürecinin yönetimi, inceleme döngülerini, güncellemeleri ve çevirileri uygulama ile senkronize tutması çerçeve dışında yapılmalıdır.

Weglot Tüm bunları kod katmanı yerine çıkış katmanında ele alır:

  • Rails I18n pipeline ile entegre olmak yerine, uygulamanızın ürettiği render edilmiş HTML'i çeviriyor. Bu, veritabanı içeriği, JavaScript ile render edilen dizileri ve statik çevirilerin hepsinin aynı şekilde ele alındığı anlamına gelir.
  • Çok dilli SEO/GEO da dahil edilir: hreflang etiketleri, çevrili URL'ler ve site haritaları otomatik olarak oluşturulur.
  • Çevirici iş akışı ise WeglotYAML dışa aktarma döngüleri yerine gösteriş paneline sahiptir.

Bununla birlikte, değerlendirmeden önce bilmeye değer birkaç sınırlama var:

  • The JavaScript snippet entegrasyon SEO indeksli değildir; Çevirilmiş sayfaların aramada görünmesi için ters proxy kurulumuna ihtiyacınız var.
  • Mevcut bir CDN veya Nginx yapılandırmanız varsa faydalı olan özel Alt Dizin yönlendirme sadece Kurumsal kullanıma uygundur.
  • Kod tabanınıza entegre edilmiş çevirilerin aksine, Weglot çevirilmiş içeriğin görünürlüğünü sağlamak için aktif abonelik gereklidir.

Raylarınızı Seçmek i18n Mimarisi

Her Rails i18n uygulaması, aynı kararların yaklaşık aynı sırayla alınmasına dayanıyor.

Öncelikle, herhangi bir yerel tanımlama kodu yazmadan önce URL stratejinizi seçin. Yol segmentleri çoğu halka açık uygulama için çalışır. Alt alanlar, bölgesel kimlik önemli olduğunda mantıklıdır. Veritabanı tarafından saklanan tercihler, yerel konumun URL yerine kullanıcıyı takip ettiği kimlik doğrulamalı uygulamalara uygundur.

İkinci olarak, JavaScript'in nasıl çeviri aldığına karar verin. Teşvik değerleri API Çoğu vakayı kapsar. JSON nitelikleri, bir denetleyicinin aynı anda birden fazla dize ihtiyaç duyduğunda çalışır.

Üçüncüsü, ne inşa ettiğinize manuel olarak karar verin. Rails statik telleri iyi idare ediyor. SEO katmanı, çevirmen iş akışı ve veritabanı içeriği ayrı kararlar gerektirir. Her birini oluşturabilir veya çıkış katmanını aşağıdaki gibi bir araca devredebilirsiniz Weglot ve mühendislik zamanını uygulamanın kendisine odaklayın.

Çıkış katmanını tamamen atlayın. Deneyin Weglot 14 gün ücretsiz ve çok dilli SEO/GEO, çevrilmiş URL'ler ve i18n kodunuza dokunmadan otomatik içerik algılama elde edin.

yön simgesi
Weglot'u keşfedin

Sitelerini Weglot ile çeviren 110.000'den fazla markaya katılın

Web sitenizi yapay zeka ile anında çevirin, insan düzenlemeleriyle iyileştirin ve dakikalar içinde yayına alın.

Bu makalede şunları inceleyeceğiz:
Roket simgesi

Başlamaya hazır mısınız?

Weglot'un gücünü anlamanın en iyi yolu, onu bizzat görmektir. Hiçbir taahhüt olmadan ücretsiz deneyin.

Web sitenizi henüz bağlamaya hazır değilseniz, kontrol panelinizde bir demo web sitesi mevcuttur.

Beğenebileceğiniz diğer yazılar

SSS simgesi

Sıkça sorulan sorular

Hiçbir öğe bulunamadı.

Mavi ok

Mavi ok

Mavi ok