Computer >> คอมพิวเตอร์ >  >> การเขียนโปรแกรม >> Ruby

Rails I18n:3 เคล็ดลับง่ายๆ และ 1 Crazy Abuse

ไลบรารี i18n ของ Rails มีประสิทธิภาพมากกว่าที่เห็น คุณไม่จำเป็นต้องใช้เพื่อแปลเท่านั้น ห้องสมุด i18n มีประโยชน์ทุกที่ที่คุณต้องการแยกข้อความที่คุณแสดงออกจากที่ที่คุณแสดง

ในขณะที่ฉันอยู่ที่ Avvo เราใช้ i18n เพื่อทำสิ่งที่เจ๋งจริงๆ ฉันจะแบ่งปันบางสิ่งที่เราเรียนรู้มาซึ่งมีประโยชน์ ร่วมกับการใช้ห้องสมุดในทางที่ผิดอย่างบ้าคลั่งซึ่งจบลงด้วยผลดีอย่างเหลือเชื่อสำหรับเรา

การหลีกเลี่ยง HTML อัตโนมัติ

คุณมีเส้นที่มีลักษณะดังนี้:

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

ในมุมมองของคุณ? คุณไม่จำเป็นต้องมี raw เพราะหากคีย์การแปลของคุณลงท้ายด้วย _html , คุณสามารถหลบหนีได้ฟรี:

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

เรียบง่ายและสอดคล้องกับ t() . อื่นๆ ของคุณ โทร.

การเข้าถึงสถานที่สะดวกยิ่งขึ้น

เมื่อคุณสร้างไฟล์ locale คุณอาจมีคีย์บางตัวที่จัดกลุ่มภายใต้พาเรนต์เดียวกัน:

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

ในการอ้างอิงกลุ่มสิ่งเหล่านี้ทั้งหมด คุณ สามารถ อ้างอิงโดยคีย์เต็ม:

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

มันค่อนข้างน่ารำคาญและซ้ำซาก แต่ t() ใช้ขอบเขตอย่างเป็นประโยชน์ เพื่อให้คุณสามารถอ้างอิงคีย์ได้สะดวกยิ่งขึ้น:

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

หากคุณตั้งชื่อบางส่วนของคุณดี คุณไม่จำเป็นต้องระบุขอบเขต:

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

นั่นคือ .edit_label ข้อมูลอ้างอิง bugs.index.edit_label เพราะคุณอยู่ใน bugs/index.html.erb .

แบ็กเอนด์ ActiveRecord

บางครั้ง การแปลแบบคงที่ในไฟล์ yaml ก็ใช้ไม่ได้กับโปรเจ็กต์ของคุณ หากคุณใช้แบ็กเอนด์ ActiveRecord i18n แทน:

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

คุณสามารถค้นหาคำแปลใน translations ตารางในฐานข้อมูลของคุณ ด้วยวิธีนี้ คุณไม่จำเป็นต้องกำหนดคำแปลทั้งหมดล่วงหน้า คุณสามารถเพิ่มคำแปลใหม่ได้ทันที

การตั้งค่า translations ตารางต้องมีการโยกย้ายเฉพาะ README บน repo i18n-active_record มีข้อมูลทั้งหมดที่คุณต้องการเพื่อให้มันทำงาน

การแบ่งปันบางส่วนระหว่างประเภทวัตถุ

ที่ Avvo เรามีไดเร็กทอรีทนายความ บทวิจารณ์ทนายความ และคำแนะนำทางกฎหมาย แต่เมื่อสองสามปีก่อน เราไม่ได้มีแค่ทนายความในไซต์ของเรา เรามีแพทย์และทันตแพทย์ด้วย!

UI ของเราส่วนใหญ่เหมือนกันระหว่างอาชีพเหล่านี้ แต่พอมีความแตกต่างกัน (เช่น สิ่งที่นักกฎหมายเรียกว่า "พื้นที่ฝึกหัด" แพทย์เรียกว่า "ความชำนาญพิเศษ") ซึ่งเป็นเรื่องยากที่จะแบ่งปันความคิดเห็นหรือความเห็นที่เหมือนกันบางส่วนโดยไม่มีโค้ดที่น่าเกลียด

ในที่สุด เราก็คิดที่จะลองพึ่งพาระบบ i18n เพื่อสิ่งนี้ อย่างไรก็ตาม นักกฎหมายชาวอังกฤษ แบบ ภาษาถิ่นของอังกฤษและปริญญาเอกก็เช่นเดียวกัน . เราไม่ต้องการปิดกั้นตัวเองจากการใช้ภาษาอื่นในที่สุด เราจึงตัดสินใจสร้างสองภาษาใหม่:en_jd และ en_md .

กลายเป็นว่าง่ายต่อการตั้งค่าเป็นแบ็กเอนด์ i18n ที่กำหนดเอง:

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

และการกำหนดคำแปลก็ง่ายเช่นกัน:

en_jd:
  practice_area: "practice area"

en_md:
  practice_area: "specialty"

มันใช้งานได้ดีสำหรับการแปลบางส่วนทั้งหมดเช่นกัน (โปรดสังเกตชื่อไฟล์):

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

และมันก็ถอยกลับไปที่ en สถานที่สำหรับการแปลที่ใช้ร่วมกัน:

en:
  leaderboard:
    title: "Leaderboard"

เมื่อคุณอยู่ในส่วน "แพทย์" ของไซต์ เราได้เปลี่ยนภาษาเริ่มต้นเป็น :en_md และในทางกลับกัน:

I18n.locale = :en_md

และทุกอย่างก็ใช้งานได้!

ฉันไม่แน่ใจว่าฉันจะแนะนำสิ่งนี้ เป็นเรื่องบ้าๆ บอๆ เมื่อนึกถึงอาชีพต่างๆ ที่มีภาษาต่างกัน แต่มันทำงานได้ดีอย่างน่าอัศจรรย์ในขณะที่เราทำมัน และเผยให้เห็นว่าเครื่องมือง่ายๆ ที่ใช้พลังงานอย่าง i18n สามารถมีได้มากเพียงใด

คุณไปรับสิ่งนี้ที่ไหน

เมื่อสัปดาห์ที่แล้ว ฉันได้พูดคุยเกี่ยวกับการลงลึกในเทคโนโลยีเฉพาะเพื่อเปลี่ยนจากมือใหม่มาเป็นผู้เชี่ยวชาญ นี่เป็นอีกตัวอย่างหนึ่ง:สิ่งที่เราเรียนรู้เกี่ยวกับ i18n ส่วนใหญ่ เราเรียนรู้จากการอ่านคู่มือ Rails และเอกสาร API

ดังนั้นใช้ขั้นตอนพิเศษนั้น เรียนรู้เครื่องมือที่คุณไว้วางใจเป็นอย่างดี คุณจะพบว่าคุณจะพบกับความสะดวกและกลเม็ดต่างๆ ที่ไม่เพียงแต่ทำให้คุณมีผลงานมากขึ้นเท่านั้น แต่ยังอาจปลดล็อกหมวดหมู่โซลูชันใหม่ๆ ที่คุณไม่เคยคิดมาก่อน