認証キーの大文字小文字処理を改善し、ドイツ語の「E-Mail」表記を修正
Devise 5.0で導入された認証キーの小文字化処理が、ドイツ語の「E-Mail」を「e-mail」に変換してしまう問題を修正しました。文字列全体を小文字化するのではなく、最初の1文字のみを小文字化することで、英語の文法エラーとドイツ語の表記ルールの両方に対応しています。
背景
#4834 で導入された downcase 処理は、英語のフラッシュメッセージで「Email」が文中に現れる際の文法的な違和感を解消する目的でした。しかし、この変更によりドイツ語の「E-Mail」が文頭であっても「e-mail」に変換されてしまい、ドイツ語の正式な表記ルールに反する結果となりました。#5820 がこの問題を報告しています。
ドイツ語では「E-Mail」は固有名詞として扱われ、文頭でも大文字の「E」を維持する必要があります。一方、英語では文中の「email」は小文字が適切です。
技術的な変更
lib/devise/failure_app.rb の i18n_message メソッドが修正され、認証キーの最初の1文字のみを小文字化する処理に変更されました。
変更前:
human_keys = (auth_keys.respond_to?(:keys) ? auth_keys.keys : auth_keys).map { |key|
scope_class.human_attribute_name(key).downcase
}
変更後:
human_keys = (auth_keys.respond_to?(:keys) ? auth_keys.keys : auth_keys).map { |key|
human_key = scope_class.human_attribute_name(key)
human_key.respond_to?(:downcase_first) ? human_key.downcase_first : human_key[0].downcase + human_key[1..]
}
Rails 7.1以降で利用可能な downcase_first メソッドを優先的に使用し、それ以前のバージョンでは文字列操作で同等の処理を実現しています。この変更により、「E-Mail」は「e-Mail」となり、文頭で使用される際には大文字に戻されます。
新たに追加された test/support/locale/de.yml では、ドイツ語のロケール設定と認証エラーメッセージが定義されています:
de:
activerecord:
attributes:
user:
email: E-Mail
devise:
failure:
invalid: "%{authentication_keys} oder Passwort ist ungültig."
対応するテストケースも test/failure_app_test.rb に追加され、ドイツ語ロケールでのメッセージが「E-Mail oder Passwort ist ungültig.」と正しく表示されることを検証しています。
設計判断
文字列全体の変換ではなく、最初の1文字のみを処理する方式 が採用されました。
PR本文では、今後同様のエッジケースが発生した場合、元の値と小文字化された値の両方を補間値として提供し、各言語で適切な方を選択できるようにする可能性が言及されています。しかし現時点では、最小限の変更で両言語に対応できる現行の方式が選ばれました。
Rails 7.0のサポートを考慮し、downcase_first メソッドの有無を判定する条件分岐が含まれています。これにより、新旧両方のRailsバージョンで一貫した動作を保証しています。
本修正は、i18nにおける言語固有の表記ルールへの配慮と、既存の文法改善の両立を実現した変更です。最初の1文字のみを小文字化することで、英語の自然な文法とドイツ語の正式な表記ルールの両方に対応し、多言語対応アプリケーションにおける認証メッセージの品質を向上させています。