2010-09-29 20 views
29

'daki yml dosyalarından tüm çeviriler nasıl alınacağını tahmin ediyorum Rails, tüm ayrıştırılmış çeviriler yml dosyalarını bir dizi dizi/karma içinde saklar. Buna erişmenin bir yolu var mı? ÖrneğinRails I18n

, bir dosyaya yasiyorsaniz:

en: 
    test_string: "testing this" 
    warning: "This is just an example 

Ben böyle bir şey yapabilir miyiz, I18n.translations_store [: tr] [: test_string]? Yml dosyasını YAML :: load ile ayrıştırabilirim, fakat benim durumumda, yml dosyalarını organizasyon için alt klasörlere böldüm, ve eminim ki raylar hepsini zaten tamamladı.

cevap

53

Arka uçta özel bir yöntem çağırmalısınız. Bu Erişmenize nasıl: bu eski soru dolaşıp insanlar için

translations = I18n.backend.send(:translations) 
translations[:en][:test_string] # => "testing this" 
+22

Arka uç başlatılmamışsa, diğer bir deyişle henüz kullanmadıysanız, 'çeviriler 'boş olacağını unutmayın. Yeni bir konsol açarsanız ve çevirileri yüklemeye çalışırsanız bunu göreceksiniz. I18n.t (: foo); çeviriler = I18n.backend.send (: çeviriler) '(bir' foo' çevirisine sahip olmasanız bile). Eminim daha iyi bir yol var. –

+0

Teşekkür ederim, @HenrikN, günümü kurtardın. – lifecoder

+10

Çok teşekkürler. Arka uç henüz başlamamışsa ve karma boşsa, bu şekilde şu şekilde başlatabilirsiniz: I18n.backend.initialized? 0 – Robin

2

Varsayılan I18n arka ucu, çevirileri size göstermeyen I18n :: Backend :: Simple'dir. (I18.backend.translations korumalı bir yöntemdir.)

Bu genelde iyi bir fikir değildir, ancak bu bilgiye gerçekten ihtiyacınız varsa ve dosyayı ayrıştıramazsanız, arka uç sınıfını genişletebilirsiniz.

class I18n::Backend::Simple 
    def translations_store 
    translations 
    end 
end 

Ardından çözümlenen çeviri yaptırmak için I18n.backend.translations_store çağırabilir. Muhtemelen uzun vadeli bir strateji olarak buna güvenmemeniz gerekir, ancak şu anda ihtiyacınız olan bilgiyi size ulaştıracaktır.

0

, korumalı yöntemleri çağırmadan gerektirmeyen bir çözüm yoktur. aşağıdaki gibi yml dosyasını değiştirin:

Şimdi
nl: &all 

    ... translations here ... 

    all: 
    <<: *all 

sadece otomatik başlatma ve (geliştirme modunda korunan ararsanız olmaz bir şey çevirileri yeniden yararı vardır I18n.t("all") kullanarak tüm çevirileri çıkarabilir . yöntemleri)

15

olarak 8xx8 yorumuna başına, daha basit bir versiyonu:

I18n.t(:foo) 
I18n.backend.send(:translations)[:en][:test_string] 

I18n.t(".")[:test_string] 

Bu azaltıcılar, hem çevirileri ön yüklemeye hem de yerel ayarı belirtmeye gerek duyar.

+0

Bu benim için en iyi çözüm oldu '18n.t (".") '. Teşekkürler. – jordelver

0

'Eğer bir tırmık görev yapıyoruz Eğer ortamı eklemeyi unutmayın, yoksa I18n::Fallbacks maalesef yapabilirsiniz kullanıyorsanız aksi takdirde config/locales/

require "./config/environment.rb" # Do not forget this 

namespace :i18n do 
    desc "Import I18n to I18n_active_record" 
    task :setup do 
    I18n.t(:foo) 
    translations = I18n.backend.send(:translations) 
    end 
end 
2

altında yaşadığı kendi yerel ayarları yüklenmiyor t I18n.t('.')'u sadece mevcut mevcut yerel ayarını (örn. 'tr-GB') döndürdüğü ve geri dönüş yerellerinden (örn. 'en') hiçbir şey döndürmediğinden kullanın. Bunu yapmak için geri dönüşler üzerinde yineleyebilir ve bunları birleştirmek için deep_merge!'u kullanabilirsiniz.

module I18n 
    class << self 
    def all 
     fallbacks[I18n.locale].reverse.reduce({}) do |translations, fallback| 
     translations.deep_merge!(backend.translate(fallback, '.')) 
     end 
    end 
    end 
end