2011-07-22 18 views
5

Çeviri aramalarını yerleştirmenin bir yolu var mı? Böyle bir şey:Raylar I18n iç içe çeviri tuşları

en: 
    uh_oh: 'Uh Oh!' 
    error1: :'uh_oh' + ' There was a big error!' 
    error2: :'uh_oh' + ' There was another big error!' 
I18n.t('error1') #=> 'Uh Oh! There was a big error!' 
I18n.t('error2') #=> 'Uh Oh! There was another big error!' 

bu varyasyonları bir demet çalıştı ve aynı zamanda yerine YAML bir Ruby çeviri dosyasını kullanarak denedim. Not Bu çalışır o:

en: 
    uh_oh: 'Uh Oh!' 
    error1: :'uh_oh' 
Ben error1 ek metin eklerseniz
I18n.t('error1') #=> 'Uh Oh!' 

Ama uh_oh tercüme almaz.

Temelde hep böyle, genel terimler geçmek zorunda kalmamak istiyorum:

en: 
    uh_oh: 'Uh Oh!' 
    error1: '%{uh_oh} There was a big error!' 
uh_oh gibi genel terimler için
I18n.t('error1', {uh_oh: I18n.t('uh_oh')}) 

, interpolasyon error1 her çağrı için aynı (ve diğer bir uh_oh'u kullanan anahtar), bu yüzden enterpolasyon yapılacak bir dizgeyi geçmek gerçekten mantıklı değil. Bunun yerine aşağıdakileri yapmanız daha kolay olacaktır ve error1 çeviri ortak anahtar çeviri özen olurdu:

I18n.t('error1') 

cevap

4

soruna cevap vermeyeceğim (Ben i18n ile mümkün olduğunu sanmıyorum gem ama yanlış olabilir). Bu yaklaşımı benimsememeniz ve size [1] arka plan olarak link vermemelisiniz. Geliştiriciler olarak, kalıpları görmek ve DRY'yi korumak için ortak kod çıkarmak doğaldır. Bu, uygun çevirileri önlediği için birden fazla dil ile uğraşırken çok uzak bir adımdır. Her dil, aynı cümle yapısını ingilizce olarak takip etmiyor ve ikame ettiğiniz şey, cümlenin geri kalanıyla aynı fikirde olmak için değişebilir.

Çalıştığım bir sitede Fransızca sorunumuz var. Bir yer adı içeren cümlelerimiz var ve bu İngilizce'de basittir. "% {location_name} mülk", yer adı ne olursa olsun çalışır. Bununla birlikte, Fransızca'da, konumun bir şehir, bir bölge, bir bölge olup olmamasına ve adın sesli harfle başlayıp başlamadığına bağlı olarak farklı yapılara ihtiyacınız vardır.

[1] http://www.multilingual.com/articleDetail.php?id=594

+0

Farklı cümle yapıları ve dil bilgisi kuralları hakkında ne kastettiğinizi biliyorum. Ancak, bir çeviri anahtar/değer çiftinden (örneğin sorduğum gibi) veya açıkça ileterek bir değişkenin değerini almak, her dilin dosyasındaki tümceyi nasıl yapılandırdığınızı değiştirmez. –

+0

Doğru, yine de yine de cinsiyet konusunda dikkatli olmanız gerekiyor. Bunun için kendi yardımcınızı yazmanız gerektiğini düşünüyorum. Yani anahtarlarınızı aşağıdaki gibi yapın: 'tuşu:"! some.key! foo bar "' I18n.t sarıcınızın anahtarı alacağı yere gidin, sonra aramayı arayın ve yerine koyun. – chrismcg

+0

Bunu özel bir i18n arka ucu olarak da yapın. – chrismcg

0

o I18n bir "sembolik" olarak adlandırdığı özel bir durum çünkü "I18n.t ('HATA1')" kendisi tarafından ikame yapabilirsiniz sebep. Ne yazık ki, tek bir tam ikameden daha fazlasını yapmayacaktır.

Bu sorunu çözmek için iki çözüm görüyorum. Birincisi, I18n'nin çıktısı üzerinde tam kontrole sahip olmamanız ve tercüme edilen mesajların tüketilmesinin (Rails gibi) yayılmasının mümkün olmadığı durumlarda zor olabilir. En iyi bahis muhtemelen I18n.t işlevini geçersiz kılar.

Diğer bir seçenek I18n arka ucunda bir lambda saklama özelliğinden yararlanmaktır. Ne yazık ki, bu, yalnızca temel dizeleri desteklediğinden, birleştirilmiş çeviriyi YAML dosyasında saklayamayacağınız anlamına gelir.

en: 
    error: "There was a big error [%{arg}]!" 

Ve şimdi ondan önce uh_oh çevirisine ile aramak istediğiniz: Örnek olarak

, çeviri YAML biz hata mesajlarından birini olabilir.

translam = lambda { |key,opts| "Uh Oh! #{I18n.t(opts[:for],opts)}" } 
I18n.backend.store_translations(:en,:uh_oh => translam) 

Şimdi "uh_oh" tercüme ve ona çevirmek istiyorsak hata vermek artı argümanlar o gerekebilir edebilirsiniz:

I18n.t(:uh_oh, for: :error, arg: 42)) #=> 'Uh Oh! There was a big error [42]!' 
Biz I18n arka uç içine uh_oh ile kombinasyon çevirisini saklamak gerekir
İlgili konular