บางครั้ง โพสต์บล็อกที่ดีที่สุดมาจากความจำเป็นในการเกาของคุณเอง และบล็อกโพสต์วันนี้ก็เป็นตัวอย่างให้เห็น!
คุณอาจรู้จัก Devise—โซลูชันการพิสูจน์ตัวตนยอดนิยมสำหรับแอปพลิเคชัน Rails เมื่อทำงานกับ Devise ฉันพบว่าการแปลและดำเนินการนั้นซับซ้อนกว่าที่ฉันคาดไว้ ที่ผ่านมาฉันอยากให้มีรายการตรวจสอบที่สามารถช่วยแนะนำฉันตลอดกระบวนการ
ดังนั้นนี่คือ - สำหรับฉันและคุณ - รายการตรวจสอบ Devise Internationalization ขั้นสูงสุด!
เมื่อ (ไม่) ใช้อัญมณีประดิษฐ์-i18n?
นโยบายของประดิษฐ์คือไม่ให้สตริงในมุมมองประดิษฐ์สามารถแปลได้ สตริงทั้งหมดได้รับการฮาร์ดโค้ด ขอชื่นชมผู้สร้าง devise-i18n gem ซึ่งทำให้เทมเพลต Devise ทั้งหมดสามารถแปลได้และยังให้การแปลที่มาจากชุมชน สำหรับแอปต่างประเทศที่คุณต้องการการสนับสนุนหลายภาษา devise-i18n gem เป็นวิธีแก้ปัญหาที่ง่ายที่สุด
อย่างไรก็ตาม อัญมณี devise-i18n เลือกที่จะติดตามข้อความประดิษฐ์อย่างใกล้ชิดที่สุดเท่าที่จะเป็นไปได้ แต่ข้อความที่ Devise ให้มานั้นไม่สอดคล้องกันตั้งแต่แรก และเนื่องจากการแปลตามตัวอักษรจะไม่สร้างภาษาที่คล่องแคล่ว ฉันจึงปรับแต่งการแปลอย่างต่อเนื่อง (และคัดลอกไฟล์ระหว่างโครงการ) นั่นเป็นการต่อสู้อย่างต่อเนื่องเพราะเป็นเรื่องยากที่จะให้คำแปลทั้งหมดสอดคล้องกันเมื่อดูทีละสตริงหรือทีละมุมมอง
ด้วยเหตุนี้ คุณภาพของการแปล i18n-devise gem จึงไม่เป็นไปตามมาตรฐานที่จำเป็นสำหรับโปรเจ็กต์เดียวที่ใช้ภาษาดัตช์เท่านั้น
ข้อเสียอีกประการของการใช้อัญมณีมาพร้อมกับมุมมองที่กำหนดเอง แม้ว่าจะเกี่ยวกับสไตล์เท่านั้น การอัปเดตทุกครั้งของ gem devise-i18n ที่เปลี่ยนแปลงใดๆ ที่ Devise สร้างขึ้นกับมุมมอง หมายความว่าคุณต้องแก้ไขสิ่งต่างๆ คุณจะต้องสร้างมุมมองใหม่และใช้การปรับแต่ง หรือคุณจะต้องคัดลอก/วางการเปลี่ยนแปลงลงในมุมมองของคุณ ปัญหานี้ไม่ได้รับการแก้ไขด้วยวิธีการในรายการตรวจสอบด้านล่าง แต่ก็ไม่ยากที่จะแก้ไขหากไม่มี devise-i18n gem 🤷♀
🇳🇱 อาหารดัตช์
ฉันตัดสินใจสร้างไฟล์แปลภาษาดัตช์หนึ่งไฟล์สำหรับ Devise และไม่ต้องกังวลกับมันอีก เสียงเหมือนการรักษา? คุณสามารถค้นหาไฟล์การแปลใหม่และปรับปรุงได้ที่ GitHub ดูขั้นตอนที่ 3 ในรายการตรวจสอบ เหตุผลสำหรับการตัดสินใจแปลแต่ละครั้งมีอธิบายไว้ในไฟล์
รายการตรวจสอบที่ดีที่สุด
ตอนนี้เรากำลังบินเดี่ยวด้วยการแปล :nl มาเริ่มกันที่รายละเอียดทั้งหมดและเริ่มกาเครื่องหมายที่ช่อง
โปรดทราบว่าสิ่งนี้ถือว่าคุณมีแอพพร้อม โดยที่ Devise เพิ่มและติดตั้งด้วยโมเดลผู้ใช้ และสร้างมุมมอง Devise หากคุณกำลังเข้ารหัส:นี่คือจุดเริ่มต้น และสังเกตว่า nl
ใน *.nl.yml
สามารถแทนที่ด้วยภาษาที่คุณเลือก และ User และ :user สามารถแทนที่ด้วยชื่อรุ่นที่คุณใช้ใน Devise
ขั้นตอนที่หนึ่ง:ตั้งค่าสถานที่
เพิ่ม :nl
ไปยังสถานที่ที่มีอยู่ (หากคุณไม่มีความคิดเห็นที่ชัดเจนเกี่ยวกับเรื่องนี้ ให้เริ่มด้วยการใส่ลงใน application.rb
สำหรับตอนนี้). ตอนนี้คุณสามารถตั้งค่าเป็นค่าเริ่มต้นได้
# application.rb
config.i18n.available_locales = [:nl, :en]
config.i18n.default_locale = :nl
มีตัวเลือกที่ดีกว่าและสะอาดกว่าในการตั้งค่าสถานที่มากกว่าการเพิ่มลงใน application.rb
. ตรวจสอบคู่มือ Rails i18n หลังจากอ่านโพสต์นี้เพื่อเลือกตัวเลือกที่เหมาะสมกับคุณที่สุด
ขั้นตอนที่สอง:เพิ่มการแปล Rails
เพิ่มไฟล์การแปล Rails :nl เพื่อดูแลสตริงในอินเทอร์เฟซที่ไม่เฉพาะเจาะจงของ Devise (โดยเฉพาะข้อความแสดงข้อผิดพลาดในการตรวจสอบความถูกต้องของ Rails)
ขั้นตอนที่สาม:กุญแจแห่งการประดิษฐ์
แปลคีย์ประดิษฐ์เป็น :nl
:เพิ่มการแปลดัตช์ใหม่และปรับปรุง! (ลิงก์ด้านบน 🇳🇱)
ขั้นตอนที่สี่:สร้างมุมมอง * ไฟล์ .yml
เพิ่มภาษาดัตช์และอังกฤษ .yml
ไฟล์สำหรับการดู views.*.yml
. มีตัวอย่างของไฟล์ views.nl.yml ที่เสร็จสิ้นแล้วใน repo ซึ่งสะท้อนถึงขั้นตอนที่ 4, 6 และ 7
#example views.nl.yml
nl:
devise:
# to be filled in later with Devise scopes:
# registrations:
# new:
# forget_password: Wachtwoord vergeten?
ขั้นตอนที่ห้า:คุณลักษณะ Active Record
ตอนนี้ เพิ่มการแปลสำหรับป้ายกำกับของแอตทริบิวต์ Active Record เช่น อีเมลและรหัสผ่าน แปลเฉพาะข้อมูลที่ผู้ใช้และผู้ดูแลระบบเห็น สำหรับแต่ละโมดูลที่คุณใช้งาน ไม่จำเป็นต้องแปลชื่อโทเค็นและอื่น ๆ (อย่างที่อัญมณี i18n ทำ) นี่คือสิ่งที่ฉันคิดว่ามีประโยชน์ 'แปล':
# In: active_record.nl.yml
# translating the labels that map to User attributes
nl:
activerecord:
attributes:
user:
current_password: Huidig wachtwoord
email: e-mailadres
password: wachtwoord
password_confirmation: Wachtwoord bevestigen
remember_me: Ingelogd blijven?
models:
user: Gebruiker
โปรดทราบว่า :อีเมล
และ :รหัสผ่าน
ค่าจะถูกลดขนาดลง นั่นเป็นเพราะการปรับแต่งข้อความแสดงข้อผิดพลาด Rails ในขั้นตอนที่ 7
ตอนนี้ ใส่คีย์ใน active_record.*.yml
.
ขั้นตอนที่หก:ตรวจสอบทุกมุมมองอุปกรณ์
ถัดไป เทมเพลตและสตริงเฉพาะของ Devise ทั้งหมดจะต้องเป็นแบบ i18n-ed พร้อมคำแปลที่เกี่ยวข้อง การทำด้วยตัวเองเป็นงานที่น่ารำคาญ ก่อนที่คุณจะดำดิ่งลงไป ให้ดูว่าทางลัดเหล่านี้ใช้ได้ผลสำหรับคุณหรือไม่:
-
คุณสามารถใช้อัญมณี 118n-devise สำหรับมุมมองได้ แต่คุณยังต้องคัดลอกคีย์จาก
.yml
ของอัญมณี ไฟล์ลงใน.yml
. ของโปรเจ็กต์ของคุณ ไฟล์. อัญมณีแทรกซ้อนในdevise.*.yml
แต่เราไม่ต้องการเขียนทับการแปลภาษาดัตช์ใหม่ที่ดีของเรา และหากคุณกำหนดสไตล์ให้กับมุมมองประดิษฐ์ คุณจะต้องคัดลอกสไตล์ด้วยเช่นกัน อุ้ย -
หากคุณมีโปรเจ็กต์ i18n-ed อยู่แล้ว คุณสามารถคัดลอกไฟล์มุมมองได้ (ข้อเสียเช่นเดียวกับตัวเลือกก่อนหน้านี้)
-
ใช้ repo เพื่อดูตัวอย่างบางมุมมองที่ฉันใช้ในโครงการล่าสุด
หรือแก้ปัญหาทันทีและสำหรับทั้งหมด:มุ่งหน้าลงสร้างชุดของไฟล์ที่คุณสามารถใช้ได้ตั้งแต่นี้เป็นต้นไปในแบบที่คุณต้องการให้เป็นอย่างแท้จริง ตัวอย่างในขั้นตอนก่อนหน้านี้เป็นเวอร์ชันแรกของฉันเอง พวกเขาอาจช่วยให้คุณเริ่มต้นได้เอง ตรวจสอบรายการตรวจสอบขนาดเล็กด้านล่างสำหรับข้อกำหนดทั้งหมด
รายการตรวจสอบขนาดเล็กสำหรับแบบฟอร์มประดิษฐ์
- สตริงที่ไม่ใช่สตริง Active Record ต้องเป็น 118n-ed และมีคีย์และการแปล (กำหนดขอบเขตอย่างเหมาะสม) (เก็บไว้ใน
views.*.yml
เช่นviews.*.yml
ไฟล์—ดูตัวอย่าง) - โปรดระวังว่าการแปลดัตช์เมื่อคุณเพิ่มคำแปลของคุณเอง จะสอดคล้องกับ
devise.nl.yml
ใหม่ . - ละเว้นป้ายกำกับที่ลดขนาดลง จะเป็นตัวพิมพ์ใหญ่อย่างถูกต้องในขั้นตอนที่ 7
- ถ้าคุณมีจดหมาย i18n-ed อยู่แล้ว ก็ไม่เป็นไร หากไม่เป็นเช่นนั้น คุณอาจเพิกเฉยได้จนถึงขั้นตอนที่ 8
- มุมมอง Devise ต่อไปนี้จำเป็นต้องแปลได้ด้วย Rails translate (
t
) ผู้ช่วย:ประดิษฐ์/ดู/shared/_links
บางส่วน:ชื่อลิงค์ทั้งหมด;- The
ประดิษฐ์/ดู/shared/_errors
บางส่วน (ตั้งแต่ Devise 4.6) - ในแบบฟอร์มประดิษฐ์สำหรับแต่ละโมดูลที่คุณใช้:สตริงทั้งหมดที่ไม่ใช่ป้ายกำกับสำหรับแอตทริบิวต์ Active Record
ขั้นตอนที่เจ็ด:ข้อความแสดงข้อผิดพลาดของ Active Record
ต่อไป เราต้องปรับแต่งข้อความแสดงข้อผิดพลาด Active Record ที่เกี่ยวข้องกับฟังก์ชัน Devise เช่น "รหัสผ่านต้องไม่เว้นว่าง" และการตรวจสอบความถูกต้องอื่นๆ
ประเด็นคือตอนนี้เราได้อัปเกรดการแปล Devise แล้ว ข้อความ Active Record ก็จำเป็นต้องปรับแต่งเช่นกัน เนื่องจากความไม่สอดคล้องกันในสไตล์กำลังแสดงให้เห็นจริงๆ ฉันก็เลยปรับแต่งมันด้วย ทำตามกฎเดียวกันกับการแปลของ Devise และทำให้แน่ใจว่ามันสอดคล้องกัน
คุณจะเห็นว่ารูปแบบของข้อความเปลี่ยนไป:จาก "%{attribute} %{message}" เป็น "%{message}" ตอนนี้ เรากำลังอ้างอิงแอตทริบิวต์ภายในสตริงที่แปลแล้ว แทนที่จะบังคับที่จุดเริ่มต้นของสตริง ทำให้ง่ายต่อการปรับแต่งข้อความภาษาดัตช์ ฉันค่อนข้างมีความซ้ำซ้อนมากกว่าที่จะทนกับข้อความแปลก ๆ ในบางครั้ง
รูปแบบข้อความใหม่เป็นสาเหตุว่าทำไม ในขั้นตอนที่ 5 แอตทริบิวต์อีเมลและรหัสผ่านจำเป็นต้องลดขนาดลง:ในข้อความแสดงข้อผิดพลาด สิ่งเหล่านี้สามารถปรากฏที่ใดก็ได้ภายในประโยค
ฉันยังแทนที่ :taken
ข้อความ. นโยบายประดิษฐ์จะไม่เปิดเผยว่าที่อยู่อีเมล 'ไม่พบ' หรือ 'ไม่ถูกต้อง' ฉันขยายนโยบายนั้นไปยัง ที่ถ่าย
. ของ Rails ข้อความ
ดูไฟล์นี้หากคุณต้องการทำตามรูปแบบข้อความใหม่ จากนั้นแทนที่ส่วนที่เกี่ยวข้องของ ข้อผิดพลาด:ข้อความ:
คีย์ในต้นฉบับ nl.yml
ไฟล์. ข้อแม้หนึ่งข้อ:เมื่อคุณเพิ่มการตรวจสอบสำหรับข้อมูลที่ไม่เกี่ยวกับอุปกรณ์ โปรดตรวจสอบอีกครั้งว่าข้อความแสดงข้อผิดพลาดยังสมเหตุสมผลหรือไม่ (ฉันต้องตรวจสอบเพิ่มเติม ฉันตรวจสอบเฉพาะสิ่งที่เกี่ยวข้องกับ Devise)
ขั้นตอนที่แปด:แก้ไขป้ายกำกับที่เราเพิ่งพัง
ในขั้นตอนที่ 5 เราย่อการแปลอีเมลและรหัสผ่านเพื่อใช้ในข้อความแสดงข้อผิดพลาดใหม่ ตอนนี้เราต้องแก้ไขลักษณะที่ปรากฏของพวกเขาใน ป้ายกำกับ . มีหลายตัวเลือก แต่ตัวเลือกที่ฉันชอบที่สุดคือการเพิ่มคีย์ 'label' แยกกัน
สิ่งนี้จะเพิ่มการทำซ้ำสำหรับคีย์ผู้ใช้ แต่จะทำให้ป้ายกำกับในแบบฟอร์มสะอาด
# in active_record.nl.yml add the label helper keys:
nl:
activerecord:
attributes:
user:
current_password: Huidig wachtwoord
email: e-mailadres
password: wachtwoord
password_confirmation: Herhaal het wachtwoord
remember_me: Wil je ingelogd blijven?
models:
user: Gebruiker
helpers:
label:
user:
email: Emailadres
password: Wachtwoord
โปรดทราบว่ามี :helpers
. อยู่แล้ว ขอบเขตในต้นฉบับ nl.yml
. โดยทั่วไป คุณควรเก็บคีย์สำหรับขอบเขตไว้ด้วยกัน เพื่อให้ค้นหาได้ง่าย (โดยมนุษย์)
การเปลี่ยนแปลงอื่นๆ ที่เราต้องทำนั้นตรงไปตรงมา จากนี้ไปจะไม่มีเซอร์ไพรส์ใหญ่ๆ เกิดขึ้น 🎉.
ขั้นตอนที่เก้า:อัปเดตลิงก์การนำทาง
ค้นหาลิงก์ทั้งหมดที่ชี้ไปที่ Devise (คิดว่าการนำทาง) และ i18n ลิงก์เหล่านั้นด้วย Rails t
ตัวช่วย
ฉันชอบเก็บมันไว้ที่ไหนสักแห่งในขอบเขตของ Devise ของ .yml ตัวอย่างเช่น ฉันจะเพิ่ม t(".devise.sign_out")
ให้มี :sign_out
ในขอบเขตเดียวกับ :sign_up
และ :sign_in
(ดูไฟล์ตัวอย่าง)
ขั้นตอนที่สิบ:แปลจดหมาย
แปลมุมมองจดหมาย มีตัวเลือกดังต่อไปนี้:
-
คุณสามารถ 'i18n' ทุกสตริงและชื่อลิงก์ได้ เช่นเดียวกับที่เราทำในขั้นตอนที่ 6 กับมุมมองอื่นๆ คุณอาจต้องการเพิ่ม
mailer.*.yml
. แยกต่างหาก . -
หรือคุณสามารถเพิ่มมุมมองจดหมายแยกกันสำหรับแต่ละสถานที่:
devise/mailer/reset_password.nl.html.erb
และdevise/mailer/reset_password.en.html.erb
. แต่ละคนมีข้อความของตัวเอง Rails จะเลือกอันที่ตรงกับโลแคลที่ตั้งไว้
ไม่เป็นอะไร! ตอนนี้สตริง Devise ทั้งหมดได้รับการแปลอย่างถูกต้องแล้ว เย้!
การดูแลหลังการ:Declutter
ในตัวอย่างมุมมองของฉัน ฉันแยกคีย์ที่ใช้ร่วมกัน (เช่น :forgot_password
) และรวบรวมไว้ในขอบเขตการประดิษฐ์ทั่วไป สิ่งนี้ทำให้เปลี่ยนได้ง่ายขึ้น แต่ Rails ไม่พบโดยอัตโนมัติ ดังนั้นเราจึงต้องใช้ไวยากรณ์ verbose (t("devise.forgot_password")
) เนื่องจากรูปแบบจุด (t(".new_confirmation_mail")
) จะไม่ทำงาน
หากคุณใช้ active_record.*.yml
การรวบรวมคีย์ทั้งหมดที่มีขอบเขตเร็กคอร์ดที่ใช้งานอยู่ในไฟล์นั้นเป็นเรื่องที่สมเหตุสมผล ย้ายคีย์ Active Record จาก Rails *.yml
ไฟล์ลงใน active_record.*.yml
. ที่เกี่ยวข้อง .
เรายังมี *.yml
. สองคู่ ไฟล์ที่ซ้ำ ประดิษฐ์:
ขอบเขต. ลองผสมคีย์จากมุมมองประดิษฐ์ลงใน devise.*.yml
มุมมอง นี่คือสิ่งที่อัญมณี Devise-i18n ทำ และฉันชอบมัน ให้ทำดังนี้:
# mixing the view scopes into devise.nl.yml
nl:
devise:
confirmations:
...
registrations:
...
edit:
...
new:
...
การปรับแต่งและเคล็ดลับบางประการ
- ฉันไม่ใช่แฟนของส่วนหัวในข้อความแสดงข้อผิดพลาด ('ข้อผิดพลาด x ไม่อนุญาตให้ผู้ใช้รายนี้ถูกบันทึก') ดังนั้นฉันจึงลบออกจาก
ข้อผิดพลาด
บางส่วน. - หากคุณตั้งค่า
default_locale
ถึง:nl
, Rails จะ 'ทำให้มีมนุษยธรรม' คีย์หากไม่สามารถหาคำแปลได้ ดังนั้นt(:some_untranslated_key)
จะแสดงเป็นบางคีย์ที่ไม่ได้แปล
ในมุมมอง - ด้วย I18n-tasks gem คุณสามารถล้างคีย์ที่ไม่ได้ใช้และเพิ่มคีย์ที่หายไป เป็นเครื่องมือที่ยอดเยี่ยม! อย่างไรก็ตาม IDE ของฉันมีการรองรับ i18n ที่ยอดเยี่ยม และสำหรับฉันที่กลายเป็นเวิร์กโฟลว์ที่เร็วกว่าอัญมณี
การจากลาเป็นความเศร้าที่แสนหวาน
คำสุดท้ายสั้นๆ ก่อนที่เราจะจากกัน เมื่อฉันเริ่มการเดินทางครั้งนี้ ฉันไม่ได้คาดหวังว่างานจะออกมามากเท่าที่ควร ฉันมีความสุขมากที่ตอนนี้ฉันรู้แล้วว่าความซับซ้อนมาจากไหน และในอนาคตฉันและคุณมีรายการการเปลี่ยนแปลงทั้งหมดที่จำเป็นแล้ว วู้ฮู้!
แต่ถึงแม้จะมีรายการตรวจสอบนี้อยู่ในมือ ให้คิดก่อนทำ:บางทีมันอาจจะคุ้มค่าที่จะอยู่กับการแปลที่เหมาะสมน้อยกว่าชั่วขณะหนึ่ง…