때때로 최고의 블로그 게시물은 가려운 부분을 긁을 필요에서 나옵니다. 그리고 오늘의 블로그 게시물이 그 예입니다!
Rails 애플리케이션에 널리 사용되는 인증 솔루션인 Devise를 알고 있을 것입니다. Devise와 함께 일할 때 번역을 시작하고 실행하는 것이 내가 예상했던 것보다 더 복잡하다는 것을 알게 되었습니다. 과거에는 프로세스를 안내하는 데 도움이 될 수 있는 체크리스트가 있었으면 했습니다.
미래의 나와 당신을 위한 최고의 Devise 국제화 체크리스트가 여기 있습니다!
devise-i18n 보석을 언제(안) 사용하나요?
Devise의 정책은 Devise 보기의 문자열을 번역 가능하게 만들지 않는 것입니다. 모든 문자열은 하드 코딩되어 있습니다. 모든 Devise 템플릿을 번역 가능하게 만들고 커뮤니티 소스 번역도 제공하는 devise-i18n gem의 제작자에게 감사를 전합니다. 다국어 지원이 필요한 해외 앱의 경우 devise-i18n gem이 가장 쉬운 솔루션입니다.
그러나 devise-i18n gem은 명시적으로 Devise 텍스트를 최대한 가깝게 따르도록 선택합니다. 그러나 Devise가 제공하는 텍스트는 처음부터 일관성이 없습니다. 그리고 문자 그대로의 번역은 결코 유창한 언어를 만들어내지 못하기 때문에 저는 계속해서 번역을 수정하고 있습니다(프로젝트 간에 파일 복사). 한 번에 하나의 문자열이나 하나의 보기를 볼 때 모든 번역을 일관성 있게 유지하기가 어렵기 때문에 계속해서 어려움을 겪고 있습니다.
그 결과, i18n-devise gem의 번역 품질이 내 네덜란드어만 사용하는 단일 언어 프로젝트에 필요한 표준에 미치지 못합니다.
gem 사용의 또 다른 단점은 사용자 정의된 보기에서 발생합니다. 스타일링과 관련이 있는 경우에도 Devise가 뷰에 적용한 모든 변경 사항을 다루는 devise-i18n gem의 모든 업데이트는 문제를 수정해야 함을 의미합니다. 보기를 다시 생성하고 사용자 정의를 적용하거나 보기에 변경 사항을 복사/붙여넣기해야 합니다. 그런데 이 문제는 아래 체크리스트의 접근 방식으로는 해결되지 않지만, devise-i18n gem 없이 해결하는 것 역시 어렵지 않습니다. 🤷♀
🇳🇱 네덜란드 음식
나는 Devise를 위한 멋진 네덜란드어 번역 파일을 만들기로 결정했고 다시는 그것에 대해 걱정할 필요가 없습니다. 대접처럼 들리나요? GitHub에서 새롭고 향상된 번역 파일을 찾을 수 있습니다. 체크리스트의 3단계를 참조하십시오. 각 번역 결정의 근거는 파일에 설명되어 있습니다.
궁극의 체크리스트
이제 우리는 :nl 번역으로 단독 비행을 하고 있으므로 모든 세부 정보를 시작하고 확인란을 시작하겠습니다.
이것은 앱이 준비되어 있고 사용자 모델과 함께 Devise가 추가 및 설치되고 Devise 보기가 생성되었다고 가정합니다. 함께 코딩하는 경우:이것이 시작점입니다. 그리고 nl
*.nl.yml
에서 선택한 언어로 대체할 수 있으며 해당 User 및 :user는 Devise에서 사용하는 모델 이름으로 대체할 수 있습니다.
1단계:언어 설정
:nl
추가 사용 가능한 로케일로 (문제에 대해 강한 의견이 없으면 application.rb
에 넣는 것으로 시작하십시오. 지금은). 이제 기본값으로 설정할 수 있습니다.
# application.rb
config.i18n.available_locales = [:nl, :en]
config.i18n.default_locale = :nl
application.rb
에 로케일을 추가하는 것보다 로케일을 설정하는 더 나은, 아마도 더 깔끔한 옵션이 있습니다. . 이 게시물을 읽은 후 Rails i18n 가이드를 확인하여 가장 적합한 옵션을 선택하세요.
2단계:Rails 번역 추가
Rails :nl 번역 파일을 추가하여 인터페이스에서 Devise에 고유하지 않은 문자열(특히 Rails 유효성 검사 오류 메시지)을 처리합니다.
3단계:키 고안
Devise 키를 :nl
로 변환 :새롭고 향상된 네덜란드어 번역을 추가하세요! (위 링크 🇳🇱)
4단계:보기.*.yml 파일 만들기
네덜란드어 및 영어 .yml
추가 보기용 파일, views.*.yml
. 4, 6, 7단계를 반영하여 리포지토리에 완성된 views.nl.yml 파일의 예가 있습니다.
#example views.nl.yml
nl:
devise:
# to be filled in later with Devise scopes:
# registrations:
# new:
# forget_password: Wachtwoord vergeten?
5단계:활성 레코드 속성
이제 이메일 및 비밀번호와 같은 활성 레코드 속성의 레이블에 대한 번역을 추가합니다. 구현한 각 모듈에 대해 사용자와 관리자에게 표시되는 항목만 번역합니다. i18n gem과 같이 토큰 이름 등을 번역할 필요가 없습니다. 다음은 유용한 '번역 가능' 항목입니다.
# 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
:email
및 :password
값은 소문자로 표시됩니다. 7단계에서 Rails 오류 메시지를 수정했기 때문입니다.
지금은 active_record.*.yml
에 키를 넣습니다. .
6단계:모든 Devise 보기 확인
다음으로, 모든 Devise 특정 템플릿과 문자열은 해당 번역으로 i18n-ed해야 합니다. 스스로 하는 것은 성가신 일입니다. 자세히 알아보기 전에 다음 단축키 중 하나가 적합한지 확인하세요.
-
보기에 118n-devise gem을 사용할 수 있지만 여전히 gem의
.yml
에서 키를 복사해야 합니다. 프로젝트의.yml
에 파일 파일. gem은devise.*.yml
에 삽입합니다. , 하지만 우리는 우리의 멋진 새 네덜란드어 번역을 덮어쓰고 싶지 않습니다. 그리고 Devise 뷰의 스타일을 지정했다면 스타일도 복사해야 합니다. 응. -
이미 i18n-ed 프로젝트가 있는 경우 보기 파일을 복사할 수 있습니다. (이전 옵션과 동일한 단점이 있습니다.)
-
최근 프로젝트에서 사용한 몇 가지 보기의 예를 보려면 리포지토리를 사용하세요.
또는 한 번에 해결하십시오. 머리를 숙이고 지금부터 사용할 수 있는 파일 세트를 원하는 대로 정확하게 만드십시오. 이전 단계의 예제는 제 첫 번째 버전입니다. 그들은 당신이 당신의 자신을 시작하는 데 도움이 될 수 있습니다. 모든 요구 사항은 아래의 미니 체크리스트를 확인하세요.
디바이스 양식을 위한 미니 체크리스트
- 액티브 레코드 문자열이 아닌 문자열은 118n-ed여야 하며 (적절한 범위의) 키와 번역이 있어야 합니다(예:
views.*.yml
에 저장됨). 파일 - 예 참조). - 네덜란드어 번역을 추가할 때 새로운
devise.nl.yml
과 일치하도록 주의하십시오. . - 소문자 라벨을 무시합니다. 7단계에서 대문자로 표시됩니다.
- 이미 메일러 i18n-ed가 있다면 괜찮습니다. 그렇지 않은 경우 8단계까지 무시할 수 있습니다.
- 다음 Devise 보기는 Rails 번역(
t
) 도우미:devise/views/shared/_links
부분:모든 링크 이름;devise/views/shared/_errors
부분적(디바이스 4.6 이후)- 사용하는 각 모듈에 대한 Devise 양식:Active Record 속성에 대한 레이블이 아닌 모든 문자열.
7단계:활성 레코드 오류 메시지
다음으로, Devise 기능과 관련된 Active Record 오류 메시지를 조정해야 합니다. "비밀번호는 비워둘 수 없습니다" 및 기타 유효성 검사와 같습니다.
문제는 이제 우리가 Devise 번역을 업그레이드했으므로 스타일의 불일치가 실제로 표시되기 때문에 Active Record 메시지도 조정해야 한다는 것입니다. 그래서 저도 Devise 번역과 동일한 규칙을 따르고 일관성을 유지하도록 수정했습니다.
메시지 형식이 "%{attribute} %{message}"에서 "%{message}"로 변경된 것을 볼 수 있습니다. 이제 우리는 문자열의 시작 부분에 강제로 지정하는 대신 번역된 문자열 내에서 속성을 참조하고 있어 네덜란드어 메시지를 멋지게 꾸미기가 훨씬 쉽습니다. 나는 가끔 이상한 메시지를 참는 것보다 중복을 가지고 있습니다.
새로운 메시지 형식은 5단계에서 이메일 및 비밀번호 속성을 줄여야 하는 이유입니다. 오류 메시지에서 문장 내 어디에나 나타날 수 있습니다.
:taken
도 교체했습니다. 메시지. Devise 정책은 이메일 주소가 '찾을 수 없음' 또는 '잘못된' 경우 공개하지 않는 것입니다. 해당 정책을 Rails의 taken
으로 확장했습니다. 메시지.
새 메시지 스타일을 따르려면 이 파일을 참조하십시오. 그런 다음 Rails error: messages:
의 해당 부분을 바꿉니다. 원래 nl.yml
의 키 파일. 한 가지 주의 사항:없음 Devise 관련 입력에 대한 유효성 검사를 추가할 때 오류 메시지가 여전히 의미가 있는지 다시 확인하십시오. (추가 조사가 필요해서 디바이스와 관련된 것만 확인했습니다.)
8단계:방금 깨뜨린 라벨 수정
5단계에서 새 오류 메시지에 사용할 이메일 및 비밀번호 번역을 축소했습니다. 이제 라벨에서 모양을 수정해야 합니다. . 여러 가지 옵션이 있지만 가장 마음에 드는 것은 별도의 '레이블' 키를 추가하는 것입니다.
이렇게 하면 사용자 키에 대한 중복이 추가되지만 양식의 레이블은 깨끗하게 유지됩니다.
# 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
의 범위 . 일반적으로 사람이 쉽게 조회할 수 있도록 범위에 대한 키를 함께 유지하는 것이 좋습니다.
다른 변경 사항은 간단합니다. 여기서부터 큰 놀라움은 없을 것입니다. 🎉.
9단계:탐색 링크 업데이트
Rails t
를 사용하여 Devise(탐색을 생각함) 및 i18n을 가리키는 모든 링크를 찾습니다. 도우미.
나는 그것들을 .yml의 Devise 범위 어딘가에 유지하는 것을 좋아합니다. 예를 들어 t(".devise.sign_out")
를 추가합니다. :sign_out
:sign_up
과 동일한 범위에서 및 :sign_in
(예시 파일 참조).
10단계:우편물을 번역합니다.
메일러 보기를 번역합니다. 몇 가지 옵션이 있습니다.
-
다른 보기에서 6단계에서 했던 것처럼 모든 문자열과 링크 이름을 'i18n'할 수 있습니다. 별도의
mailer.*.yml
을 추가할 수 있습니다. . -
또는 각 로케일에 대해 별도의 메일러 보기를 추가할 수 있습니다.
devise/mailer/reset_password.nl.html.erb
및devise/mailer/reset_password.en.html.erb
. 각각의 텍스트가 있습니다. Rails는 설정된 로케일과 일치하는 것을 선택합니다.
괜찮은! 이제 모든 Devise 문자열이 올바르게 번역되었습니다. 예!
애프터 케어:디클러터
내 보기 예에서 공유 키를 추출했습니다(예::forgot_password
) 일반 고안 범위에서 수집했습니다. 이렇게 하면 변경하기가 더 쉽지만 Rails는 자동으로 찾을 수 없으므로 자세한 구문이 필요합니다(t("devise.forgot_password")
), 점 구문(t(".new_confirmation_mail")
) 작동하지 않습니다.
active_record.*.yml
로 가시면 , 활성 레코드 범위가 있는 모든 키를 해당 파일에 수집하는 것이 좋습니다. Rails *.yml
에서 활성 레코드 키를 이동합니다. 파일을 해당 active_record.*.yml
에 넣습니다. .
또한 두 쌍의 *.yml
이 있습니다. devise:
를 복제하는 파일 범위. Devise 보기의 키를 devise.*.yml
에 혼합하는 것을 고려하십시오. 견해. 이것이 Devise-i18n gem이 하는 일이고 저는 그것을 좋아합니다. 다음과 같이 하면 됩니다.
# mixing the view scopes into devise.nl.yml
nl:
devise:
confirmations:
...
registrations:
...
edit:
...
new:
...
몇 가지 수정 사항 및 팁
- 저는 오류 메시지('x 오류가 이 사용자를 저장할 수 없음')의 헤더를 좋아하지 않으므로
errors
에서 해당 헤더를 제거했습니다. 부분적입니다. default_locale
을 설정하면:nl
로 , Rails는 번역을 찾을 수 없는 경우 키를 '인간화'합니다. 따라서t(:some_untranslated_key)
Some Untranslated Key
로 표시됩니다. 보기에서.- I18n-tasks gem을 사용하면 사용하지 않는 키를 정리하고 누락된 키를 추가할 수 있습니다. 훌륭한 도구입니다! 하지만 제 IDE는 i18n을 지원하므로 gem보다 워크플로가 더 빠른 것으로 나타났습니다.
이별은 달콤한 슬픔입니다
헤어지기 전 마지막 한마디. 이 여행을 시작했을 때 나는 그것이 밝혀진 것만큼 많은 일이 될 것이라고 기대하지 않았습니다. 이제 복잡성이 어디에서 오는지 알게 되어 매우 기쁩니다. 그리고 미래의 나와 당신은 이제 필요한 모든 변경 사항의 목록을 갖게 되었습니다. 우후!
하지만 이 체크리스트를 가지고 있더라도 행동하기 전에 생각해보세요. 잠시 동안 덜 최적의 번역으로 살 가치가 있을지도 모릅니다...