2012-06-19 4 views
7

Tôi hiện đang viết thư trong RoR 3.2 để gửi thư cần được bản địa hóa dựa trên ngôn ngữ của người dùng. Tôi đã quản lý để hiển thị các chế độ xem được bản địa hóa chính xác nhưng tôi gặp một số khó khăn với một số trường yêu cầu thay đổi ngôn ngữ (như chủ đề). Tôi đã đọc một số bài đăng chống lại việc thay đổi ngôn ngữ trước khi gửi email. Người dùng có nhiều ngôn ngữ khác nhau và điều đó có nghĩa là thay đổi ngôn ngữ của tôi mỗi lần người dùng được gửi email.Ruby on Rails 3.2 Mailer, bản địa hóa trường chủ đề thư

Tôi biết rằng có thể thay đổi ngôn ngữ, gửi email, thay đổi lại ngôn ngữ. Điều này không giống như đường ray. Có cách nào để thực hiện điều này không?

Dưới đây là một đoạn:

class AuthMailer < ActionMailer::Base 
    add_template_helper(ApplicationHelper) 
    default :from => PREDEF_MAIL_ADDRESSES::System[:general] 

    [...] 

    def invite(address, token, locale) 
    @token = token 
    @locale = locale 
    @url = url_for(:controller => "signup_requests", :action => "new", :token => token.key, :locale => locale) 

    mail(:subject => "Invitation", :to => address) do |format| 
     format.html { render ("invite."+locale) } 
     format.text { render ("invite."+locale) } 
    end 
    end 

    [...] 
end 

quan điểm của tôi

auth_mailer 
    invite.en.html.erb 
    invite.en.text.erb 
    invite.it.html.erb 
    invite.it.text.erb 
    ... 

Nói tóm lại, trong trường hợp này, tôi muốn khoanh vùng: đối tượng sử dụng @locale, nhưng không phải bằng cách chạy: I18n.locale = locale

Trả lời

30

Tạm thời thay đổi miền địa phương toàn cầu. Có một phương pháp I18n.with_locale tiện dụng cho điều đó. ActionMailer cũng tự động dịch một chủ đề.

class AuthMailer 
    def invite(address, token, locale) 
    @token = token 
    @locale = locale 
    @url = url_for(:controller => "signup_requests", :action => "new", :token => token.key, :locale => locale) 

    I18n.with_locale(locale) do 
     mail(:to => address) 
    end 
    end 
end 

Trong ngôn ngữ:

en: 
    auth_mailer: 
    invite: 
     subject: Invitation 
+0

tôi chấp nhận câu trả lời của bạn vì nó vỉa hơn Rails-ish – Oktav

+0

tôi đã cố gắng tiếp cận này, nhưng nó mang lại cho tôi một 'NameError: uninitialized UserMailer liên tục :: I18' Bất kỳ manh mối? – piffy

+0

Xin lỗi, tôi đã nhập nhầm I18n, nó có chữ 'n' ở cuối. –

4

bạn sẽ có thể vượt qua một miền địa phương khi bạn gọi i18n như vậy:

mail(:subject => I18n.t("app.invite.subject", :locale => locale), :to => address) do |format| 
    format.html { render ("invite."+locale) } 
    format.text { render ("invite."+locale) } 
end 

Hãy nhớ rằng biến số locale cần phải là biểu tượng.

6

Rails 4 cách:

# config/locales/en.yml 
en: 
    user_mailer: 
    welcome: 
     subject: 'Hello, %{username}' 

# app/mailers/user_mailer.rb 
class UserMailer < ActionMailer::Base 
    def welcome(user) 
    mail(subject: default_i18n_subject(username: user.name)) 
    end 
end 

default_i18n_subject - Dịch các đối tượng sử dụng lớp Rails i18n dưới [mailer_scope, ACTION_NAME] phạm vi. Nếu nó không tìm thấy bản dịch cho đối tượng theo phạm vi được chỉ định, nó sẽ mặc định là phiên bản nhân bản của action_name. Nếu đối tượng có nội suy, bạn có thể truyền chúng thông qua tham số nội suy.