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

รายการตรวจสอบขั้นสูงสุดเพื่อพัฒนาอุปกรณ์ให้เป็นสากลอย่างเหมาะสม

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

คุณอาจรู้จัก 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 ที่ยอดเยี่ยม และสำหรับฉันที่กลายเป็นเวิร์กโฟลว์ที่เร็วกว่าอัญมณี

การจากลาเป็นความเศร้าที่แสนหวาน

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

แต่ถึงแม้จะมีรายการตรวจสอบนี้อยู่ในมือ ให้คิดก่อนทำ:บางทีมันอาจจะคุ้มค่าที่จะอยู่กับการแปลที่เหมาะสมน้อยกว่าชั่วขณะหนึ่ง…