Saya ingin memberi teks yang terlihat seperti ini:
Sudah mendaftar? Gabung!
Perhatikan bahwa ada link di teks tersebut. Pada contoh ini, ini menunjuk ke google - pada kenyataannya itu akan mengarah ke aplikasi saya log_in_path
.
Saya telah menemukan dua cara untuk melakukan ini, tetapi tidak satupun dari mereka terlihat "benar".
Cara pertama yang saya tahu melibatkan memiliki ini milik saya en.yml
:
log_in_message: "Already signed up? <a href='{{url}}'>Log in!</a>"
Dan menurut saya:
<p> <%= t('log_in_message', :url => login_path) %> </p>
Ini berfungsi , tetapi memiliki <a href=...</a>
bagian pada en.yml
tidak terlihat sangat bersih bagi saya.
Opsi lain yang saya tahu adalah menggunakan tampilan yang dilokalkan - login.en.html.erb
, dan login.es.html.erb
.
Ini juga terasa tidak benar karena satu-satunya baris yang berbeda adalah baris yang disebutkan di atas; sisa tampilan (~ 30 baris) akan diulangi untuk semua tampilan. Ini tidak akan terlalu KERING.
Saya kira saya bisa menggunakan "parsial yang dilokalkan" tetapi itu tampaknya terlalu konyol; Saya rasa saya lebih suka opsi pertama untuk memiliki begitu banyak file tampilan kecil.
Jadi pertanyaan saya adalah: apakah ada cara yang "tepat" untuk menerapkan ini?
Jawaban:
en.yml
login.html.erb
sumber
%{href}
dalam string terjemahan YAML. Selain itu, karena keluaran secara otomatis di-escape, Anda perlu menentukanraw
atau.html_safe
secara eksplisit, atau menambahkan akhiran kunci terjemahan Anda dengan_html
, karena inlogin_message_html
dan escaping akan dilewati secara otomatis.t('string')
identik dengant("string")
. Mereka sama saja.t('some.key', link: link_to()).html_safe
Memisahkan teks dan tautan dalam file locale.yml berfungsi untuk sementara waktu tetapi dengan teks yang lebih panjang sulit untuk diterjemahkan dan dipelihara karena tautan berada dalam item terjemahan terpisah (seperti dalam jawaban Simones). Jika Anda mulai memiliki banyak string / terjemahan dengan tautan, Anda dapat mengeringkannya sedikit lagi.
Saya membuat satu pembantu di application_helper.rb saya:
Di en.yml saya:
Dan menurut saya:
Dengan cara ini, lebih mudah untuk menerjemahkan pesan karena teks tautan juga didefinisikan dengan jelas di file locale.yml.
sumber
This is a %{link:link to Google}
. Ini memungkinkan Anda memiliki banyak tautan dalam satu string, menangani XSS, dan mengizinkan terjemahan bertingkat. Silakanflash
pesan di Rails 3+ lakukan seperti iniview_context.it(key, ...)
Saya mengambil larutan hollis dan membuat permata memanggilnya
it
. Mari kita lihat contohnya:Lalu
Untuk lebih jelasnya, lihat https://github.com/iGEL/it .
sumber
Dalam en.yml
Di de.yml
di new.html.erb [diasumsikan]
sumber
Terima kasih banyak, holli, telah membagikan pendekatan ini. Ini bekerja seperti pesona bagi saya. Akan memilih Anda jika saya bisa, tetapi ini adalah posting pertama saya jadi saya kurang memiliki reputasi yang tepat ... Sebagai tambahan dari teka-teki: Masalah yang saya sadari dengan pendekatan Anda adalah bahwa itu masih tidak akan berhasil dari dalam pengontrol. Saya melakukan beberapa penelitian dan menggabungkan pendekatan Anda dengan pendekatan dari Glenn di rubypond .
Inilah yang saya dapatkan:
Lihat helper, misalnya application_helper.rb
Di pengontrol:
Di locale.yml:
Dalam tampilan:
Semoga posting ini membuat saya mendapat reputasi untuk memilih Anda, holli :) Setiap umpan balik diterima.
sumber
Kami memiliki yang berikut ini:
atau lebih eksplisit:
lalu di ApplicationController.rb saja
Diberikan kunci di
en.yml
file sepertidapat digunakan di ERB sebagai
harus menghasilkan
sumber
Saya ingin sedikit lebih fleksibel daripada hanya menambahkan tautan ke pesan flash dari file YAML (misalnya nama pengguna yang masuk, dll.) Jadi saya ingin menggunakan notasi ERB dalam string.
Seperti yang saya gunakan,
bootstrap_flash
jadi saya memodifikasi kode pembantu sebagai berikut untuk memecahkan kode string ERB sebelum menampilkan:Kemudian dimungkinkan untuk menggunakan string seperti berikut (menggunakan devise):
Ini mungkin tidak berfungsi untuk semua situasi dan mungkin ada argumen bahwa definisi kode dan string tidak boleh dicampur (terutama dari perspektif KERING), tetapi ini tampaknya berfungsi dengan baik untuk saya. Kode harus dapat beradaptasi untuk banyak situasi lain, bit penting adalah sebagai berikut:
sumber
Menurut saya cara sederhana untuk melakukannya adalah dengan melakukan:
sumber
Kenapa tidak menggunakan cara pertama, tapi membaginya seperti
Lalu
sumber