8

Tôi đang sử dụng đá quý và muốn dịch thư xác nhận. Tôi đã có mẫu và bưu phẩm ghi đè của riêng tôi phương pháp:Tạo mẫu thư riêng và bản địa hóa riêng

class LocalizedDeviseMailer < Devise::Mailer 
    def confirmation_instructions(record, locale) 
    @locale = locale 
    super 
    end 
end 

Vì vậy, trong mẫu của tôi, tôi có thể làm một cái gì đó như thế:

I18n.locale = @locale 

Và sau đó:

t("it.really.works") 

Nhưng tôi don 't biết làm thế nào để vượt qua biến của tôi với miền địa phương để phương pháp gửi thư. Cách tốt nhất để làm điều đó là gì? Bất kỳ trợ giúp sẽ được đánh giá cao.

Trả lời

1

Tôi nghĩ cách đơn giản nhất để làm điều đó là thêm nó vào bản ghi. Vì vậy, bạn có thể thêm một cột locale trong tài khoản của bạn hoặc Juste thêm một attr_accessor :locale trong mô hình tài khoản của bạn

Vì vậy, bạn chỉ cần xác định miền địa phương này trong hồ sơ của bạn và sử dụng nó với I18n.locale = record.locale

8

lập mưu là cung cấp nội địa hóa của mẫu tử "nguyên bản".

có một cái nhìn tại các mã nguồn devise

https://github.com/plataformatec/devise/blob/master/lib/devise/mailers/helpers.rb Trong tập tin này được giải thích như thế nào để bản địa hoá đối tượng (để được thêm vào các file miền địa phương của bạn)

# Setup a subject doing an I18n lookup. At first, it attemps to set a subject 
    # based on the current mapping: 
    # 
    # en: 
    #  devise: 
    #  mailer: 
    #   confirmation_instructions: 
    #   user_subject: '...' 
    # 

Đây là sau đó mẫu thân mà bạn cần bản địa hóa như bất kỳ html.erb nào khác

https://github.com/plataformatec/devise/blob/master/app/views/devise/mailer/confirmation_instructions.html.erb

Đẹp kết thúc nếu người dùng mới của bạn sẽ sign_up bằng cách sử dụng http://yoursite/it/users/sign_up hoặc http://yoursite/en/users/sign_up (như bạn thường làm trong các tuyến đường cho ứng dụng đã bản địa hóa) chủ đề và thư được bản địa hóa tốt (trong trường hợp trước bằng tiếng Ý, tiếng Anh sau này) sẽ được gửi.

+0

Cảm ơn bạn đã trả lời. Tôi đã cố gắng giải pháp đó, nhưng nó không thành công khi tôi đã không có miền địa phương trong đường dẫn và các mẫu là tùy chỉnh (được thực hiện bởi tôi, không được cung cấp bởi devise). Thật không may, tôi không thể thay đổi định tuyến, vì vậy có lẽ chỉ có giải pháp là thêm trường địa phương trong Mô hình người dùng. – zachar

+0

Bạn có thể chỉ định ngôn ngữ mặc định trong các tuyến đường của mình http://guides.rubyonrails.org/i18n.html 'scope" (: locale) ",: locale =>/en | it/do tài nguyên: người dùng kết thúc' và mẫu tùy chỉnh của bạn sẽ được sử dụng thay thế (mẫu được ghi đè từ' đường dẫn tạo ra: lượt xem ') –

+1

tất nhiên, nhưng tôi không được phép làm điều đó trong dự án này. Nó không phụ thuộc vào tôi lần này. Dù sao, cảm ơn sự giúp đỡ. Tôi đã phải thêm thuộc tính miền địa phương vào mô hình người dùng, và bây giờ nó hoạt động giống như một sự quyến rũ. – zachar

6

Tôi khuyên bạn nên thêm cột locale vào Mô hình người dùng và sử dụng bưu phẩm của riêng bạn. Bằng cách này bạn cũng linh hoạt hơn, nếu bạn dự định đặt các bảng định kiểu của riêng bạn và các trường from hoặc thêm các thư bổ sung.

trong config/initializer/devise.rb:

Devise.setup do |config| 
    ... 
    config.mailer = "UserMailer" 
    ... 
end 

trong app/mailers/user_mailer.rb

class UserMailer < Devise::Mailer 
    default from: "[email protected]" 

    def confirmation_instructions(user) 
    @user = user 
    set_locale(@user) 
    mail to: @user.email 
    end 

    def reset_password_instructions(user) 
    @user = user 
    set_locale(@user) 
    mail to: @user.email 
    end 

    def unlock_instructions(user) 
    @user = user 
    set_locale(@user) 
    mail to: @user.email 
    end 

    private 
    def set_locale(user) 
    I18n.locale = user.locale || I18n.default_locale 
    end 
end 
+1

Đây có phải là chữ ký phương thức đúng để tạo ra 3.1rc2 không? def reset_password_instructions (người dùng, mã thông báo, opts = {}) –

+1

@IvailoBardarov tôi vừa chỉnh sửa nó để sử dụng các chữ ký thích hợp với bản phát hành mới nhất –

0

hơn Một cách là thêm initializer:

require 'devise/mailer' 

module Devise 
    class Mailer 
    module Localized 
     %w(
     confirmation_instructions 
     reset_password_instructions 
     unlock_instructions 
    ).each do |method| 
     define_method(method) do |resource, *args| 
      I18n.with_locale(resource.try(:locale)) do 
      super(resource, *args) 
      end 
     end 
     end 
    end 

    prepend Localized 
    end 
end 

Đối với ruby ​​< 2.1 bạn có thể sử dụng mối quan tâm với alias_method_chain.

Các vấn đề liên quan