ไลบรารี 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) %>
หากคุณตั้งชื่อบางส่วนของคุณดี คุณไม่จำเป็นต้องระบุขอบเขต:
<%= t('.edit_label') %> | <%= t('.delete_label') %>
นั่นคือ .edit_label
ข้อมูลอ้างอิง bugs.index.edit_label
เพราะคุณอยู่ใน bugs/index.html.erb
.
แบ็กเอนด์ ActiveRecord
บางครั้ง การแปลแบบคงที่ในไฟล์ yaml ก็ใช้ไม่ได้กับโปรเจ็กต์ของคุณ หากคุณใช้แบ็กเอนด์ ActiveRecord i18n แทน:
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"
มันใช้งานได้ดีสำหรับการแปลบางส่วนทั้งหมดเช่นกัน (โปรดสังเกตชื่อไฟล์):
<!-- Lawyer badge HTML -->
<!-- Doctor badge HTML -->
และมันก็ถอยกลับไปที่ en
สถานที่สำหรับการแปลที่ใช้ร่วมกัน:
en:
leaderboard:
title: "Leaderboard"
เมื่อคุณอยู่ในส่วน "แพทย์" ของไซต์ เราได้เปลี่ยนภาษาเริ่มต้นเป็น :en_md
และในทางกลับกัน:
I18n.locale = :en_md
และทุกอย่างก็ใช้งานได้!
ฉันไม่แน่ใจว่าฉันจะแนะนำสิ่งนี้ เป็นเรื่องบ้าๆ บอๆ เมื่อนึกถึงอาชีพต่างๆ ที่มีภาษาต่างกัน แต่มันทำงานได้ดีอย่างน่าอัศจรรย์ในขณะที่เราทำมัน และเผยให้เห็นว่าเครื่องมือง่ายๆ ที่ใช้พลังงานอย่าง i18n สามารถมีได้มากเพียงใด
คุณไปรับสิ่งนี้ที่ไหน
เมื่อสัปดาห์ที่แล้ว ฉันได้พูดคุยเกี่ยวกับการลงลึกในเทคโนโลยีเฉพาะเพื่อเปลี่ยนจากมือใหม่มาเป็นผู้เชี่ยวชาญ นี่เป็นอีกตัวอย่างหนึ่ง:สิ่งที่เราเรียนรู้เกี่ยวกับ i18n ส่วนใหญ่ เราเรียนรู้จากการอ่านคู่มือ Rails และเอกสาร API
ดังนั้นใช้ขั้นตอนพิเศษนั้น เรียนรู้เครื่องมือที่คุณไว้วางใจเป็นอย่างดี คุณจะพบว่าคุณจะพบกับความสะดวกและกลเม็ดต่างๆ ที่ไม่เพียงแต่ทำให้คุณมีผลงานมากขึ้นเท่านั้น แต่ยังอาจปลดล็อกหมวดหมู่โซลูชันใหม่ๆ ที่คุณไม่เคยคิดมาก่อน