Computer >> Máy Tính >  >> Lập trình >> Ruby

Rails I18n:3 Mẹo nhanh và 1 Lạm dụng điên rồ

Thư viện i18n của Rails mạnh hơn vẻ ngoài của nó. Bạn không cần chỉ sử dụng nó để dịch. Thư viện i18n hữu ích ở bất kỳ đâu bạn muốn tách văn bản bạn hiển thị khỏi nơi bạn hiển thị nó.

Trong khi tôi ở Avvo, chúng tôi đã sử dụng i18n để làm một số việc thực sự thú vị. Tôi sẽ chia sẻ một vài điều mà chúng tôi học được đã có ích, cùng với việc lạm dụng thư viện một cách điên cuồng, cuối cùng lại mang lại hiệu quả vô cùng tốt cho chúng tôi.

Tự động thoát HTML

Bạn có dòng nào giống như sau:

<%= raw(t('form.required_field_header')) %>

trong quan điểm của bạn? Bạn không cần raw đó , bởi vì nếu khóa dịch của bạn kết thúc bằng _html , bạn được thoát miễn phí:

<%= t('form.required_field_header_html') %>

Đơn giản và nhất quán hơn với t() khác của bạn cuộc gọi.

Truy cập ngôn ngữ thuận tiện hơn

Khi bạn tạo các tệp ngôn ngữ của mình, có thể bạn sẽ có một số khóa của mình được nhóm dưới cùng một khóa mẹ:

en:
  bugs:
    index:
      new_label: "File a new bug"
      edit_label: "edit"
      delete_label: "delete"

Để tham khảo một loạt tất cả những điều này cùng nhau, bạn có thể tham khảo chúng bằng khóa đầy đủ của chúng:

<%= t('bugs.index.edit_label') %> | <%= t('bugs.index.delete_label') %>

Điều đó khá khó chịu và lặp đi lặp lại. Nhưng t() có một phạm vi hữu ích, vì vậy bạn có thể tham chiếu các khóa thuận tiện hơn:

<% bugs_scope = 'bugs.index' -%>
<%= t('edit_label', scope: bugs_scope) %> | <%= t('delete_label', scope: bugs_scope) %>

Nếu bạn đặt tên cho các bên của mình tốt, bạn thậm chí không cần chỉ định phạm vi:

app / views / bug / index.html.erb
<%= t('.edit_label') %> | <%= t('.delete_label') %>

Đó là, .edit_label tham chiếu bugs.index.edit_label , bởi vì bạn đang ở trong bugs/index.html.erb .

Phần phụ trợ ActiveRecord

Đôi khi, các bản dịch tĩnh trong tệp yaml sẽ không hoạt động cho dự án của bạn. Nếu bạn sử dụng chương trình phụ trợ ActiveRecord i18n thay thế:

config / initializers / locale.rb
require 'i18n/backend/active_record'
I18n.backend = I18n::Backend::ActiveRecord.new

bạn có thể tra cứu bản dịch trong translations bảng trong cơ sở dữ liệu của bạn. Bằng cách này, bạn không phải xác định trước tất cả các bản dịch của mình. Thay vào đó, bạn có thể nhanh chóng thêm các bản dịch mới.

Thiết lập translations bảng yêu cầu một sự di chuyển cụ thể. README trên repo i18n-active_record có tất cả thông tin bạn cần để nó hoạt động.

Chia sẻ các phần giữa các loại đối tượng

Tại Avvo, chúng tôi có thư mục luật sư, đánh giá của luật sư và tư vấn pháp lý. Nhưng một vài năm trước, chúng tôi không chỉ có luật sư trên trang web của mình. Chúng tôi cũng có bác sĩ và nha sĩ!

Rất nhiều giao diện người dùng của chúng tôi giống nhau giữa các nghề này. Nhưng đã đủ khác (ví dụ:cái mà luật sư gọi là “khu vực hành nghề”, bác sĩ gọi là “chuyên khoa”), rằng sẽ khó có thể chia sẻ cùng quan điểm hoặc thành phần mà không có một đoạn mã khá xấu xí nào đó.

Cuối cùng, chúng tôi nghĩ về việc cố gắng dựa vào hệ thống i18n cho việc này. Rốt cuộc, lawyerese tiếng Anh là loại phương ngữ tiếng Anh và ngôn ngữ học thuyết cũng giống như vậy . Cuối cùng, chúng tôi không muốn ngăn mình sử dụng các ngôn ngữ khác, vì vậy chúng tôi quyết định tạo hai ngôn ngữ mới:en_jden_md .

Điều này hóa ra lại dễ dàng thiết lập làm chương trình phụ trợ i18n tùy chỉnh:

class AvvoI18nStore < I18n::Backend::Simple
  def translate(locale, key, options = {})
    begin
      default = options.delete(:default)
      super(locale, key, options)
    rescue I18n::MissingTranslationData => e
      # fall back to "en" if we can't find anything under "en_jd", etc.
      fallback_locale = locale.to_s.split("_").first
      super(fallback_locale, key, options.merge(:default => default))
    end
  end
end

I18n.backend = AvvoI18nStore.new

Và việc xác định bản dịch thật dễ dàng:

en_jd:
  practice_area: "practice area"

en_md:
  practice_area: "specialty"

Nó cũng hoạt động tốt để dịch toàn bộ phần (lưu ý tên tệp):

app / views / question / _answer_badge.en_jd.html.erb
<!-- Lawyer badge HTML -->
app / views / question / _answer_badge.en_md.html.erb
<!-- Doctor badge HTML -->

Và nó thậm chí còn rơi trở lại en ngôn ngữ, cho các bản dịch được chia sẻ:

en:
  leaderboard:
    title: "Leaderboard"

Khi bạn ở trong phần “Bác sĩ” của trang web, chúng tôi đã thay đổi ngôn ngữ mặc định thành :en_md và ngược lại:

I18n.locale = :en_md

Và mọi thứ đều hoạt động!

Tôi không chắc mình sẽ giới thiệu điều này. Có một chút điên rồ khi nghĩ về các ngành nghề khác nhau có ngôn ngữ khác nhau. Nhưng nó hoạt động tốt một cách đáng kinh ngạc trong khi chúng tôi làm việc đó. Và nó cho thấy các công cụ đơn giản như i18n có thể có bao nhiêu năng lượng.

Bạn lấy những thứ này ở đâu?

Tuần trước, tôi đã nói về việc nghiên cứu sâu vào các công nghệ cụ thể như một cách để chuyển từ một người mới bắt đầu thành một chuyên gia. Đây là một ví dụ khác về điều đó:hầu hết những gì chúng tôi học được về i18n mà chúng tôi học được từ việc đọc hướng dẫn Rails và tài liệu API.

Vì vậy, hãy thực hiện thêm bước đó. Tìm hiểu kỹ các công cụ mà bạn dựa vào. Bạn sẽ thấy rằng bạn sẽ gặp phải những tiện ích và thủ thuật không chỉ giúp bạn làm việc hiệu quả hơn mà còn có thể mở khóa các danh mục giải pháp hoàn toàn mới mà bạn thậm chí chưa từng nghĩ đến.