2012-02-13 43 views
7

Bất kỳ ai cũng có một số mẹo về cách dịch các liên kết mô hình trong Rails?Dịch liên kết mô hình Rails - không hoạt động

Ví dụ: Tôi có mô hình Người có thể có nhiều Điện thoại. Tuy nhiên, một người cần có ít nhất một điện thoại. Tôi không thể dịch xác nhận đó. Điều tốt nhất tôi có thể làm được điều này:

validates_presence_of :phones, :message => "At least one phone is required." 

Và trên YAML, tôi thay thế dòng này để bỏ qua %{attribute}:

format: ! '%{message}' 

Bằng cách này chỉ thông điệp của tôi được hiển thị, và tôi tránh un- tên trường đã dịch sẽ được hiển thị.

Điều này khiến tôi rất đau đầu, bởi vì một số đá quý đơn giản không cho phép tôi vượt qua :message => "something describing the error", vì vậy tôi muốn cấu hình tất cả các thông báo lỗi thông qua YAML của tôi.

Ngoài ra, với một số mô hình, tôi có thể dịch thuộc tính của chúng, trong khi với những người khác thì không. Ví dụ:

activerecord: 
    attributes: 
    additional_info: 
     account_manager: "Manager" 

Công trình này hoạt động. Tôi có thể thấy trên biểu mẫu "Người quản lý" của tôi. Tuy nhiên, khi trường này có lỗi, Rails sẽ hiển thị nó là "Additional info account manager can't be blank".

Tôi cố gắng này:

activerecord:   
    errors: 
    models: 
     additional_info: 
     attributes: 
      account_manager: "Manager" 

Nhưng không may mắn.

Tôi đã đọc tài liệu, nhưng không có đầu mối về lý do tại sao nó xảy ra.

Trả lời

9

Rails 3.2 đã thay đổi hành vi này. Cách tôi đã đăng trước đó không được chấp nhận.

Bây giờ, để dịch các liên kết, cần phải thêm dấu gạch chéo (thay vì lồng tất cả mọi thứ). Vì vậy, thay vì điều này:

activerecord: 
     attributes: 
     person: 
      additional_info: 
      account_manager: "Manager" 

Các đúng bây giờ là:

activerecord: 
     attributes: 
     person: 
      additional_info/account_manager: "Manager" 

Ngoài ra, tôi đã tìm ra rằng has_many hiệp hội đang được dịch khác nhau từ đó. Nếu bạn muốn dịch đó, ví dụ sau đây có thể giúp:

activerecord: 
     attributes: 
     emails: 
      address: "E-mail field" 

Thay vì tên mô hình, như tôi đã làm ở trên, bạn cần phải vượt qua tên hiệp hội, trong trường hợp này emails.

Kiểm tra nhận xét này và kéo theo yêu cầu cho biết thêm:

https://github.com/rails/rails/commit/c19bd4f88ea5cf56b2bc8ac0b97f59c5c89dbff7#commitcomment-619858

https://github.com/rails/rails/pull/3859

+0

tôi đã suy nghĩ một cái gì đó như thế này, nhưng không may mắn với vị trí chính xác của các mặt hàng và không may mắn về cách tìm nó, nhờ !, rất cảm kích – Alexis

7

Dưới đây là những con đường quan trọng có giá trị trong Rails 4.1:

# Basic Attribute on Model 
activerecord: 
    attributes: 
    #{model_class.model_name.i18n_key}: 
     #{attribute_name}: 
     "Localized Value" 

# Attribute on Nested Model 
activerecord: 
    attributes: 
    #{model_class.model_name.i18n_key}/#{association_name}: 
     #{attribute_name}: 
     "Localized Value" 
    #{association_name}: 
     #{attribute_name}: 
     "Fallback Localized Value" 

Vì vậy, với mô hình này (trong đó có các i18n_key của :person):

class Person 
    has_many :friends 
end 

Bạn muốn có những định nghĩa ngôn ngữ:

activerecord: 
    attributes: 
    person: 
     first_name: 
     "My Name" 
    person/friends: 
     first_name: 
     "My Friend's Name" 
    friends: 
     first_name: 
     "A Friend's Name" 

Nếu mô hình của bạn là một không gian tên, chẳng hạn như:

class MyApp::Person 
    has_many :friends 
end 

các i18n_key trở thành :my_app/person/ của bạn bắt đầu quan trọng để mặc ra:

activerecord: 
    attributes: 
    my_app/person: 
     first_name: 
     "My Name" 
    my_app/person/friends: 
     first_name: 
     "My Friend's Name" 
    friends: 
     first_name: 
     "A Friend's Name" 
Các vấn đề liên quan