Ruby
 Computer >> コンピューター >  >> プログラミング >> Ruby

Deviseを適切に国際化するための究極のチェックリスト

時々、最高のブログ投稿はあなた自身のかゆみを掻く必要性から来ます。そして、今日のブログ投稿はその一例です!

Railsアプリケーションで人気のある認証ソリューションであるDeviseをご存知でしょう。 Deviseを使用していると、翻訳を立ち上げて実行するのが予想よりも複雑であることがわかりました。過去の私は、プロセスをガイドするのに役立つチェックリストがあることを望んでいました。

これが、将来の私とあなたのために、究極のDevise国際化チェックリストです!

いつ(しない)devise-i18n Gemを使用しますか?

Deviseのポリシーは、Deviseビューの文字列を翻訳可能にしないことです。すべての文字列はハードコーディングされています。 devise-i18n gemの作成者に称賛を送ります。これにより、すべてのDeviseテンプレートが翻訳可能になり、コミュニティからの翻訳も提供されます。多言語サポートが必要な国際的なアプリの場合、devise-i18ngemが最も簡単なソリューションです。

ただし、devise-i18n gemは、Deviseのテキストにできるだけ厳密に従うことを明示的に選択します。しかし、Deviseが提供するテキストは、そもそも一貫性がありません。そして、直訳は決して流暢な言語を生成しないので、私は常に翻訳を微調整しています(そしてプロジェクト間でファイルをコピーしています)。一度に1つの文字列または1つのビューを表示する場合、すべての翻訳の一貫性を保つのは難しいため、これは継続的な苦労です。

その結果、i18n-devise gemの翻訳の品質は、私の単一言語のオランダ語のみのプロジェクトに必要な基準に達していません。

宝石を使用することのもう1つの欠点は、カスタマイズされたビューで発生します。スタイリングだけに関係している場合でも、Deviseがビューに加えた変更に影響を与えるdevise-i18n gemを更新するたびに、問題を修正する必要があります。ビューを再生成してカスタマイズを適用するか、変更をコピーしてビューに貼り付ける必要があります。ちなみに、この問題は以下のチェックリストのアプローチでは解決されませんが、devise-i18ngemなしで解決することも難しくありません。 🤷‍♀

🇳🇱オランダの御馳走

Devise用に素敵なオランダ語翻訳ファイルを1つ作成することにしました。これについては、もう心配する必要はありません。御馳走のように聞こえますか?新しく改良された翻訳ファイルは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:views。*。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:アクティブレコードの属性

次に、電子メールやパスワードなどのActiveRecord属性のラベルの翻訳を追加します。実装したモジュールごとに、ユーザーと管理者ユーザーに表示されるものだけを翻訳します。トークン名などを翻訳する必要はありません(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固有のテンプレートと文字列を、対応する翻訳でi18n化する必要があります。自分でやるのは面倒な仕事です。それに飛び込む前に、これらのショートカットの1つがあなたのために働くかどうか確かめてください:

  • ビューに118n-devisegemを使用することもできますが、それでもgemの.ymlからキーをコピーする必要があります。 プロジェクトの.ymlにファイルを追加します ファイル。宝石はそれらをdevise.*.ymlにインターリーブします 、しかし、私たちは私たちの素敵な新しいオランダ語の翻訳を上書きしたくありません。また、Deviseビューのスタイルを設定した場合は、スタイルもコピーする必要があります。ユグ語。

  • すでにi18n-edプロジェクトがある場合は、ビューファイルをコピーできます。 (これには、前のオプションと同じ欠点があります。)

  • 最新のプロジェクトで使用したいくつかのビューの例については、リポジトリを使用してください。

または、それを完全に解決します。頭を下げて、これから使用できる一連のファイルを、希望どおりに作成します。前のステップの例は、私自身の最初のバージョンです。彼らはあなたがあなた自身をキックスタートするのを助けるかもしれません。すべての要件については、以下のミニチェックリストを確認してください。

デバイスフォームのミニチェックリスト

  • Active Record文字列ではない文字列は、118n-edであり、(適切なスコープの)キーと翻訳(たとえば、views.*.ymlに格納されている)を持っている必要があります。 ファイル-例を参照)。
  • オランダ語の翻訳を追加する場合は、新しいdevise.nl.ymlと一致するように注意してください。 。
  • 小文字のラベルは無視してください。手順7で適切に大文字になります。
  • すでにメーラーi18n-edをお持ちの場合は、問題ありません。そうでない場合は、手順8まで無視してかまいません。
  • 次のDeviseビューは、Rails translate(t)を使用して翻訳可能にする必要があります。 )ヘルパー:
    • devise/views/shared/_links 部分的:すべてのリンク名;
    • devise/views/shared/_errors 部分的(Devise 4.6以降)
    • 使用する各モジュールのDeviseフォーム:ActiveRecord属性のラベルではないすべての文字列。

ステップ7:ActiveRecordのエラーメッセージ

次に、Devise機能に関連するActiveRecordエラーメッセージを微調整する必要があります。 「パスワードを空白にすることはできません」などの検証。

問題は、Deviseの翻訳をアップグレードしたので、スタイルの不一致が実際に示されているため、ActiveRecordメッセージも微調整する必要があるということです。そこで、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:ナビゲーションリンクを更新する

Deviseを指すすべてのリンクを見つけ(ナビゲーションを考えてください)、Rails tでそれらを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からActiveRecordキーを移動します 対応するactive_record.*.ymlにファイルを追加します 。

*.ymlのペアも2つあります devise: 範囲。 Deviseビューのキーをdevise.*.ymlに混在させることを検討してください ビュー。それはDevise-i18nの宝石が行うことであり、私はそれが好きです。あなたはこのようにします:

# 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よりも迅速なワークフローであることがわかりました。

別れはとても甘い悲しみです

別れる前の簡単な最後の言葉。私がこの旅を始めたとき、私はそれが実際のように多くの仕事になるとは思っていませんでした。複雑さがどこから来ているのかがわかってとてもうれしいです。そして、将来私とあなたは今、必要なすべての変更のリストを持っています。ウーフー!

ただし、このチェックリストが手元にある場合でも、行動を起こす前に考えてください。しばらくの間、最適性の低い翻訳を使用する価値があるかもしれません…


  1. 究極の Windows 10 付箋メモ

    Windows 10 の付箋はとても快適です。特に一時的、即時、またはランダムな目的で、ウェブサイトや職場の誰かからメモを取る必要があるときはいつでも、付箋をよく使用します.間違いなく、Windows 10 の付箋アプリは Windows 10 の最大の機能の 1 つであり、便利な付箋のトリックとヒントを知っていれば、おそらく最高のメモ作成アプリの 1 つです。したがって、Windows 10 の付箋アプリを初めて使用する場合でも、頻繁に使用している場合でも、Windows 10 の付箋に関するこれらのヒントとコツを気に入るはずです。 しかし、まずは基本を理解しましょう 付箋を追加するには、

  2. TweakPass:究極のパスワード マネージャー

    パスワードを付箋に保存したり、生年月日、結婚記念日、誰かの名前などの最も一般的なパスワードを使用して、別のパスワードを忘れないようにする時代は終わりました。侵害の 80% は不適切なパスワードまたはパスワードの繰り返しが原因であるため、各アカウントに一意のパスワードを設定することが不可欠です。個々のログインごとに、できるだけ多くのサイトに固有のパスワードを設定できるようになりました。 TweakPass は、Tweaking Technologies によって設計されたユニークなソフトウェアの 1 つで、毎分新しいユーザーにリーチしています。 パスワード マネージャーとは パスワード マネー