Đôi khi, bài đăng trên blog hay nhất xuất phát từ nhu cầu tự gãi ngứa của chính bạn. Và bài đăng trên blog hôm nay là một ví dụ về điều đó!
Bạn có thể biết Devise — một giải pháp xác thực phổ biến cho các ứng dụng Rails. Khi làm việc với Devise, tôi thấy rằng việc thiết lập và chạy bản dịch phức tạp hơn tôi dự đoán. Trước đây, tôi ước rằng có một danh sách kiểm tra có thể giúp hướng dẫn tôi trong suốt quá trình.
Vì vậy, đây là - cho tôi và bạn trong tương lai - Danh sách kiểm tra quốc tế hóa Devise cuối cùng!
Khi nào (Không) sử dụng Đá quý devise-i18n?
Chính sách của Devise là không làm cho các chuỗi trong chế độ xem Devise có thể dịch được. Tất cả các dây đều được mã hóa cứng. Kudo cho những người tạo ra đá quý devise-i18n, giúp tất cả các mẫu Devise có thể dịch được và cũng cung cấp các bản dịch có nguồn gốc từ cộng đồng. Đối với các ứng dụng quốc tế, nơi bạn cần hỗ trợ đa ngôn ngữ, đá quý devise-i18n là giải pháp dễ dàng nhất.
Tuy nhiên, gem devise-i18n chọn theo sát văn bản Devise nhất có thể. Nhưng văn bản mà Devise cung cấp không nhất quán để bắt đầu. Và vì bản dịch theo nghĩa đen sẽ không bao giờ tạo ra ngôn ngữ trôi chảy, tôi liên tục điều chỉnh các bản dịch (và sao chép tệp giữa các dự án). Đó là một cuộc đấu tranh liên tục vì thật khó để có được tất cả các bản dịch nhất quán khi xem xét một chuỗi hoặc một chế độ xem tại một thời điểm.
Do đó, chất lượng bản dịch của i18n-devise gem không đạt được tiêu chuẩn cần thiết cho các dự án đơn ngữ, chỉ dùng tiếng Hà Lan của tôi.
Một nhược điểm khác của việc sử dụng gem arrises với các chế độ xem tùy chỉnh. Ngay cả khi nó chỉ liên quan đến việc tạo kiểu, mỗi bản cập nhật của đá quý devise-i18n chạm vào bất kỳ thay đổi nào mà Devise thực hiện đối với các chế độ xem, sẽ có nghĩa là bạn phải sửa chữa mọi thứ. Bạn sẽ cần phải tạo lại các chế độ xem và áp dụng các tùy chỉnh hoặc bạn sẽ phải sao chép / dán các thay đổi vào chế độ xem của mình. Nhân tiện, vấn đề này không được giải quyết bằng cách tiếp cận trong danh sách kiểm tra bên dưới, nhưng cũng không khó giải quyết hơn nếu không có đá quý devise-i18n. 🤷♀
🇳🇱 Một món ăn Hà Lan
Tôi quyết định tạo một tệp bản dịch tiếng Hà Lan tốt đẹp cho Devise và không bao giờ phải lo lắng về nó nữa. Nghe giống như một điều trị? Bạn có thể tìm thấy tệp bản dịch mới và cải tiến trên GitHub. Xem bước 3 trong danh sách kiểm tra. Cơ sở lý luận cho mỗi quyết định dịch thuật được giải thích trong hồ sơ.
Danh sách kiểm tra cuối cùng
Bây giờ chúng ta đang bay một mình với bản dịch:nl, hãy bắt đầu với tất cả các chi tiết và bắt đầu các hộp kiểm.
Lưu ý rằng điều này giả định rằng bạn đã có một ứng dụng sẵn sàng, với Devise được thêm và cài đặt với Mô hình người dùng và các chế độ xem Devise được tạo. Nếu bạn đang viết mã:đây là điểm bắt đầu. Và lưu ý rằng nl
trong *.nl.yml
có thể được thay thế bằng ngôn ngữ bạn chọn và Người dùng và:người dùng đó có thể được thay thế bằng tên kiểu máy bạn sử dụng trong Devise.
Bước một:Đặt ngôn ngữ
Thêm :nl
với các ngôn ngữ có sẵn (nếu bạn không có quan điểm chính xác về vấn đề này, hãy bắt đầu bằng việc đưa nó vào application.rb
bây giờ). Bây giờ bạn có thể đặt nó làm mặc định.
# application.rb
config.i18n.available_locales = [:nl, :en]
config.i18n.default_locale = :nl
Có các tùy chọn tốt hơn, có lẽ rõ ràng hơn để đặt ngôn ngữ hơn là thêm nó vào application.rb
. Kiểm tra hướng dẫn về Rails i18n sau khi đọc bài đăng này để chọn tùy chọn phù hợp với bạn nhất.
Bước hai:Thêm bản dịch Rails
Thêm tệp dịch Rails:nl để xử lý các chuỗi trong giao diện không dành riêng cho Devise (đặc biệt là các thông báo lỗi xác thực Rails).
Bước 3:Các phím Devise
Dịch các phím Devise sang :nl
:thêm Bản dịch tiếng Hà Lan mới và cải tiến! (Liên kết phía trên 🇳🇱)
Bước Bốn:Tạo các tệp dạng xem. *. yml
Thêm tiếng Hà Lan và tiếng Anh .yml
tệp cho các chế độ xem, views.*.yml
. Có một ví dụ về tệp views.nl.yml đã hoàn thành trong repo, phản ánh các bước 4, 6 và 7.
#example views.nl.yml
nl:
devise:
# to be filled in later with Devise scopes:
# registrations:
# new:
# forget_password: Wachtwoord vergeten?
Bước 5:Thuộc tính Bản ghi Hoạt động
Bây giờ, hãy thêm bản dịch cho các nhãn của thuộc tính Bản ghi Hoạt động, như email và mật khẩu. Chỉ dịch những cái mà người dùng và người dùng quản trị thấy, cho từng mô-đun mà bạn đã triển khai. Không cần dịch tên mã thông báo và những thứ khác (như đá quý i18n). Đây là những gì tôi cho là hữu ích 'có thể dịch được':
# 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
Lưu ý rằng :email
và :password
giá trị giảm xuống. Đó là do các chỉnh sửa đối với thông báo lỗi Rails ở bước 7.
Bây giờ, hãy đặt các khóa vào active_record.*.yml
.
Bước 6:Kiểm tra mọi chế độ xem Devise
Tiếp theo, tất cả các mẫu và chuỗi dành riêng cho Devise cần phải được i18n-ed với các bản dịch tương ứng. Tự mình làm là một công việc khó chịu. Trước khi tìm hiểu kỹ, hãy xem một trong các phím tắt này có phù hợp với bạn không:
-
Bạn có thể sử dụng viên ngọc 118n-devise cho các khung nhìn, nhưng bạn vẫn phải sao chép các khóa từ
.yml
của viên ngọc đó các tệp vào.yml
trong dự án của bạn các tập tin. Đá quý xen kẽ chúng trongdevise.*.yml
, nhưng chúng tôi không muốn ghi đè bản dịch tiếng Hà Lan mới hay của mình. Và nếu bạn đã tạo kiểu cho các khung nhìn Devise, bạn cũng cần phải sao chép kiểu. Đúng vậy. -
Nếu bạn đã có các dự án i18n-ed, bạn có thể sao chép các tệp dạng xem. (Nhược điểm tương tự với tùy chọn này như trong tùy chọn trước.)
-
Sử dụng repo cho các ví dụ về một số chế độ xem mà tôi đã sử dụng trong dự án mới nhất của mình.
Hoặc giải quyết nó một lần và mãi mãi:hãy tạo một tập hợp các tệp mà bạn có thể sử dụng từ bây giờ, chính xác theo cách bạn muốn. Các ví dụ trong bước trước là phiên bản đầu tiên của riêng tôi; họ có thể giúp bạn bắt đầu công việc của riêng bạn. Xem danh sách kiểm tra nhỏ bên dưới để biết tất cả các yêu cầu.
Danh sách kiểm tra nhỏ cho các biểu mẫu phát triển
- Các chuỗi không phải là các chuỗi Bản ghi Hoạt động cần phải có 118n-ed và có các khóa và bản dịch (phạm vi phù hợp) (được lưu trữ trong các chế độ xem
views.*.yml
chẳng hạn. tệp — xem ví dụ). - Lưu ý rằng các bản dịch tiếng Hà Lan, khi thêm bản dịch của bạn, nhất quán với
devise.nl.yml
mới . - Bỏ qua các nhãn giảm dần; chúng sẽ được viết hoa đúng cách trong bước 7.
- Nếu bạn đã có các thư từ i18n-ed, điều đó không sao. Nếu không, bạn có thể bỏ qua chúng cho đến bước 8.
- Các chế độ xem Devise sau đây cần phải được dịch bằng Rails translate (
t
) người trợ giúp:-
devise/views/shared/_links
một phần:tất cả các tên liên kết; -
devise/views/shared/_errors
một phần (kể từ Devise 4.6) - Trong biểu mẫu Devise cho từng mô-đun bạn sử dụng:tất cả các chuỗi không phải là nhãn cho các thuộc tính Active Record.
-
Bước 7:Thông báo lỗi Active Record
Tiếp theo, chúng ta cần chỉnh sửa các thông báo lỗi Active Record có liên quan đến chức năng Devise. Như "mật khẩu không được để trống" và các xác thực khác.
Vấn đề là, bây giờ chúng tôi đã nâng cấp các bản dịch Devise, các thông báo Active Record cũng cần được điều chỉnh vì sự không nhất quán trong phong cách đang thực sự hiển thị. Vì vậy, tôi cũng đã chỉnh sửa chúng, tuân theo các quy tắc tương tự như đối với bản dịch Devise và đảm bảo rằng chúng nhất quán.
Bạn sẽ thấy rằng định dạng của thông báo đã thay đổi:từ "% {thuộc tính}% {message}" thành "% {message}". Bây giờ chúng tôi đang tham chiếu thuộc tính trong chuỗi đã dịch thay vì buộc nó ở đầu chuỗi, giúp cho việc xác minh các thông điệp tiếng Hà Lan dễ dàng hơn rất nhiều. Tôi thà có sự trùng lặp hơn là đưa ra những thông điệp đôi khi kỳ lạ.
Định dạng thư mới là lý do tại sao ở bước 5, các thuộc tính email và mật khẩu cần được giảm bớt:trong các thông báo lỗi, chúng có thể xuất hiện ở bất kỳ đâu trong một câu.
Tôi cũng đã thay thế :taken
thông điệp. Chính sách Devise là không tiết lộ nếu địa chỉ email là "không tìm thấy" hoặc "không hợp lệ". Tôi đã mở rộng chính sách đó cho Rails 'taken
tin nhắn.
Xem tệp này nếu bạn muốn làm theo kiểu thư mới. Sau đó, thay thế phần tương ứng của Rails error: messages:
các khóa trong nl.yml
gốc tập tin. Một lưu ý:khi bạn thêm xác thực cho không có đầu vào nào liên quan đến Devise, vui lòng kiểm tra kỹ xem thông báo lỗi có còn hợp lý hay không. (Tôi cần điều tra thêm; tôi chỉ kiểm tra những cái có liên quan đến Devise.)
Bước 8:Sửa các nhãn mà chúng ta vừa phá vỡ
Trong bước 5, chúng tôi đã giảm bớt các bản dịch email và mật khẩu để sử dụng trong các thông báo lỗi mới. Bây giờ chúng tôi cần sửa giao diện của chúng trong nhãn . Có một số tùy chọn, nhưng tùy chọn tôi thích nhất là thêm các khóa 'nhãn' riêng biệt.
Điều này thêm một số trùng lặp cho các khóa người dùng, nhưng nó giữ cho các nhãn trong biểu mẫu luôn sạch sẽ.
# 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
Lưu ý rằng đã có :helpers
phạm vi trong nl.yml
gốc . Nói chung, bạn nên giữ các khóa cho một phạm vi cùng nhau, để dễ dàng tra cứu (bởi con người).
Những thay đổi khác mà chúng tôi cần thực hiện rất đơn giản. Không có bất ngờ lớn nào sẽ xuất hiện kể từ đây. 🎉.
Bước 9:Cập nhật các liên kết điều hướng
Tìm tất cả các liên kết trỏ đến Devise (suy nghĩ điều hướng) và i18n chúng bằng Rails t
người trợ giúp.
Tôi muốn giữ những thứ đó ở đâu đó trong phạm vi Devise của .yml. Ví dụ:tôi sẽ thêm t(".devise.sign_out")
để có :sign_out
trong cùng phạm vi với :sign_up
và :sign_in
(xem các tệp ví dụ).
Bước 10:Dịch các thư.
Dịch các chế độ xem bưu phẩm. Có một số tùy chọn:
-
Bạn có thể 'i18n' mọi chuỗi và tên liên kết, giống như chúng ta đã làm ở bước 6 với các chế độ xem khác. Bạn có thể muốn thêm một
mailer.*.yml
riêng biệt . -
Hoặc bạn có thể thêm các chế độ xem bưu phẩm riêng biệt cho từng ngôn ngữ:
devise/mailer/reset_password.nl.html.erb
vàdevise/mailer/reset_password.en.html.erb
. Mỗi người có văn bản riêng của họ. Rails sẽ chọn một cái khớp với ngôn ngữ được đặt.
Được rồi! Bây giờ tất cả các chuỗi Devise đã được dịch đúng cách. Yay!
Sau khi chăm sóc:Declutter
Trong ví dụ về chế độ xem của tôi, tôi đã trích xuất các khóa được chia sẻ (như :forgot_password
) và thu thập chúng trong phạm vi sáng chế chung. Điều này giúp thay đổi chúng dễ dàng hơn, nhưng Rails không thể tự động tìm thấy chúng, vì vậy chúng tôi cần cú pháp chi tiết (t("devise.forgot_password")
), vì cú pháp dấu chấm (t(".new_confirmation_mail")
) sẽ không hoạt động.
Nếu bạn sử dụng active_record.*.yml
, nên thu thập tất cả các khóa có phạm vi bản ghi đang hoạt động vào tệp đó. Di chuyển các khóa Active Record từ Rails *.yml
các tệp vào active_record.*.yml
tương ứng .
Chúng tôi cũng có hai cặp *.yml
các tệp sao chép devise:
phạm vi. Cân nhắc trộn các khóa từ chế độ xem Devise vào devise.*.yml
lượt xem. Đó là những gì đá quý Devise-i18n làm, và tôi thích nó. Bạn sẽ làm như thế này:
# mixing the view scopes into devise.nl.yml
nl:
devise:
confirmations:
...
registrations:
...
edit:
...
new:
...
Một số tinh chỉnh và mẹo
- Tôi không phải là người yêu thích tiêu đề trong thông báo lỗi ('x lỗi đã cấm người dùng này lưu'), vì vậy tôi đã xóa tiêu đề đó khỏi
errors
một phần. - Nếu bạn đặt
default_locale
thành:nl
, Rails sẽ 'nhân hóa' các phím nếu nó không thể tìm thấy bản dịch. Vì vậy,t(:some_untranslated_key)
sẽ hiển thị dưới dạngSome Untranslated Key
trong chế độ xem. - Với đá quý I18n-task, bạn có thể xóa các khóa không sử dụng và thêm các khóa bị thiếu. Đó là một công cụ tuyệt vời! Tuy nhiên, IDE của tôi có hỗ trợ i18n tuyệt vời và đối với tôi, quy trình làm việc nhanh hơn cả gem.
Chia tay là một nỗi buồn ngọt ngào
Một lời cuối cùng nhanh chóng trước khi chúng tôi chia tay. Khi tôi bắt đầu cuộc hành trình này, tôi không mong đợi nó sẽ thành công như mong đợi. Tôi rất vui vì giờ tôi đã biết sự phức tạp đến từ đâu. Và tương lai tôi và bạn bây giờ có một danh sách tất cả những thay đổi cần thiết. Tuyệt vời!
Nhưng ngay cả với danh sách kiểm tra này trong tay, hãy suy nghĩ trước khi hành động:có lẽ thật đáng sống với những bản dịch kém tối ưu trong một thời gian…