2011-01-31 28 views
14

Tôi đã tự hỏi nếu nó có thể có nhiều file trong một miền địa phương, có thể tổ chức trong các thư mục và vẫn sử dụng các bí danh YAML, ví dụ:Rails i18n nhiều file aliasing

trong một tập tin phổ biến:

# config/locales/common/en.yml 
en: 
    first_name: &first_name "First name" 
    last_name: &last_name "Last name" 

và trong một tập tin cụ thể hơn:

# config/locales/models/user/en.yml 
en: 
    helpers: 
    label: 
     user: 
     first_name: *first_name 
     last_name: *last_name 

Điều này sẽ giúp giảm thiểu dịch và thay đổi trong các bản dịch. trong cấu hình đường ray của tôi, tôi đặt nó để tải tất cả các tập tin miền địa phương trong thư mục con. Thiết lập này không hoạt động đối với tôi, tôi nhận được lỗi bí danh không đúng khi tôi tải trang.

Tôi đã thử tập lệnh init biên dịch tất cả en.yml thành một và chỉ sử dụng một tệp đó và bí danh hoạt động và tất cả, nhưng tôi không thể hợp nhất các khóa. Ví dụ, nếu tôi có một "người trợ giúp" trong một số tập tin khác, nó chỉ sử dụng bất cứ điều gì đã được chỉ định cuối cùng (trên thực tế, "vi" cũng bị ghi đè) thay vì hợp nhất các phím.

Hoặc có mô hình tốt hơn cho tất cả điều này không? Cảm ơn nhiều!

Trả lời

5

Các mẫu mặc định để tổ chức các miền địa phương được trình bày ở đây:

http://guides.rubyonrails.org/i18n.html#organization-of-locale-files

+0

Cảm ơn bạn đã trả lời! Tôi đã đi qua hướng dẫn đó, và điều đó tương tự như cách tôi tổ chức nó. Tuy nhiên, tôi dường như không thể làm điều bí danh như tôi muốn ở trên với thiết lập được đề xuất. Đó là điểm chính của tôi, là làm thế nào để thực hiện bí danh trên nhiều tệp t8n. Cám ơn bạn một lần nữa! – janechii

5

Cố gắng thay thế trong application.rb giá trị mặc định của * config.i18n.load_path * tham số với điều đó:

config.i18n.load_path += Dir[Rails.root.join('config/locales/**/*.yml').to_s] 

Nó phù hợp với tôi.

+1

Skydan, cảm ơn cho đầu vào! thật không may, điều đó không có tác dụng với tôi. Xin lưu ý rằng tôi đang sử dụng bí danh YAML. Không có bí danh, nó sẽ hoạt động tốt như bạn đã nói. Một năm sau câu hỏi ban đầu và tôi vẫn chưa tìm được giải pháp lý tưởng. tôi vừa lặp lại các bản dịch. – janechii

4

Theo tôi hiểu, bạn muốn có nhiều tệp .yml và vẫn có tính năng hợp nhất.

Thật không may là không thể vì cách thức hoạt động của Rails.

nền kỹ thuật:

Có hai bước quan trọng được thực hiện bởi hai hệ thống chưa được nối:

  • Mỗi tập tin .yml được nạp riêng sử dụng một thư viện YAML. Đó là nơi các neo và bí danh được giải quyết. Các nút trùng lặp không được phép trong bước này, tức là mỗi nút ghi đè một nút trước đó có cùng tên và cấp độ gốc.
  • Các băm kết quả sau đó được hợp nhất bởi Rails bằng Ruby. Đó là nơi các nút YAML được hợp nhất và nhân đôi từ các tệp khác nhau được cho phép.

Đó là lý do tại sao các neo và bí danh không thể mở rộng nhiều tệp. Mặt khác, bạn có một tính năng hợp nhất gọn gàng không được hỗ trợ bởi YAML.

Nói cách khác: Biên dịch mọi thứ thành một tệp khổng lồ, bạn sẽ có được tính năng "bí danh toàn cầu", nhưng bạn sẽ mất tính năng hợp nhất. Bạn có thể có một hoặc khác, nhưng không phải cả hai. Về phương diện bảo trì, phương pháp tiếp cận nhiều tập tin chắc chắn dễ chịu hơn.


PS: Tất nhiên sự trùng lặp như trong ví dụ của bạn làm cho tôi co rúm người lại, quá, nhưng nó tốt hơn để tập trung vào phím DRY và một cấu trúc quan trọng tốt hơn trên dịch DRY.

Đó là vì bản dịch thường thay đổi theo thời gian: Điều tương tự trong giai đoạn đầu của ứng dụng có thể hơi khác sau khi ứng dụng của bạn phát triển. Có lẽ tại một số nơi, nó phải là "Tên" và ở một nơi khác, nó phải là "Nhập tên của bạn, xin vui lòng".

Tôi cũng có thể tưởng tượng rằng có một "bản dịch chính" không hoạt động đối với mọi ngôn ngữ, về ngữ pháp và ngữ cảnh khác không có liên quan đến tiếng Anh.

Vì vậy, lời khuyên cá nhân của tôi sẽ là: Gắn với phương pháp được đề xuất bởi Rails (nghĩa là nhiều tệp) và bỏ qua một số trùng lặp không thể tránh khỏi.