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

Rails I18n:3つのクイックヒントと1つのクレイジーな虐待

Railsのi18nライブラリは見た目よりも強力です。翻訳にのみ使用する必要はありません。 i18nライブラリは、表示するテキストを表示する場所から切り離したい場合に便利です。

私がAvvoにいる間、私たちはi18nを使って本当にクールなことをしました。私たちが学んだいくつかの便利なことと、ライブラリの乱用が私たちにとって信じられないほどうまくいったことを共有します。

自動HTMLエスケープ

次のような行がありますか:

<%= raw(t('form.required_field_header')) %>

あなたの見解では? そのrawは必要ありません 、翻訳キーが_htmlで終わる場合 、無料で脱出できます:

<%= t('form.required_field_header_html') %>

シンプルで、他のt()とより一貫性があります 呼び出します。

より便利にロケールにアクセスする

ロケールファイルを作成するとき、おそらくいくつかのキーが同じ親の下にグループ化されます:

en:
  bugs:
    index:
      new_label: "File a new bug"
      edit_label: "edit"
      delete_label: "delete"

これらすべてをまとめて参照するには、できます 完全なキーでそれらを参照します:

<%= t('bugs.index.edit_label') %> | <%= t('bugs.index.delete_label') %>

それはかなり面倒で反復的です。 しかしt() スコープを取得すると便利なため、キーをより便利に参照できます。

<% bugs_scope = 'bugs.index' -%>
<%= t('edit_label', scope: bugs_scope) %> | <%= t('delete_label', scope: bugs_scope) %>

パーシャルに適切な名前を付ける場合は、スコープを指定する必要もありません。

app / views / bugs / index.html.erb
<%= t('.edit_label') %> | <%= t('.delete_label') %>

つまり、.edit_label bugs.index.edit_labelを参照します 、bugs/index.html.erbにいるため 。

ActiveRecordバックエンド

場合によっては、yamlファイルの静的翻訳がプロジェクトで機能しないことがあります。代わりにActiveRecordi18nバックエンドを使用する場合:

config / initializers / locale.rb
require 'i18n/backend/active_record'
I18n.backend = I18n::Backend::ActiveRecord.new

translationsで翻訳を検索できます データベース内のテーブル。 このように、すべての翻訳を事前に定義する必要はありません。代わりに、その場で新しい翻訳を追加できます。

translationsの設定 テーブルには特定の移行が必要です。 i18n-active_recordリポジトリのREADMEには、それを機能させるために必要なすべての情報が含まれています。

オブジェクトタイプ間でパーシャルを共有する

Avvoには、弁護士名簿、弁護士レビュー、および法律上のアドバイスがあります。 しかし、数年前、私たちのサイトには弁護士がいただけではありませんでした。医者や歯科医もいました!

私たちのUIの多くは、これらの職業間で同じでした。しかし、十分に異なっていたため(たとえば、弁護士が「実践分野」と呼んでいるもの、医師が「専門分野」と呼んでいるもの)、かなり醜いコードがなければ同じ見解や部分を共有することは困難です。

最終的には、このためにi18nシステムに頼ろうと考えました。 結局のところ、英国の弁護士は一種です。 英語の方言、そして医者は同じ方法です 。最終的に他の言語の使用をブロックしたくなかったため、en_jdという2つの新しいロケールを作成することにしました。 およびen_md

これは、カスタムi18nバックエンドとして簡単に設定できることがわかりました:

class AvvoI18nStore < I18n::Backend::Simple
  def translate(locale, key, options = {})
    begin
      default = options.delete(:default)
      super(locale, key, options)
    rescue I18n::MissingTranslationData => e
      # fall back to "en" if we can't find anything under "en_jd", etc.
      fallback_locale = locale.to_s.split("_").first
      super(fallback_locale, key, options.merge(:default => default))
    end
  end
end

I18n.backend = AvvoI18nStore.new

また、翻訳の定義も同様に簡単でした:

en_jd:
  practice_area: "practice area"

en_md:
  practice_area: "specialty"

パーシャル全体の翻訳にも最適です(ファイル名に注意してください):

app / views / question / _answer_badge.en_jd.html.erb
<!-- Lawyer badge HTML -->
app / views / question / _answer_badge.en_md.html.erb
<!-- Doctor badge HTML -->

そしてそれはenにさえ落ちました ロケール、共有翻訳の場合:

en:
  leaderboard:
    title: "Leaderboard"

サイトの「Doctors」セクションにいるときに、デフォルトのロケールを:en_mdに変更しました 、およびその逆:

I18n.locale = :en_md

そして、すべてがうまくいきました!

これをお勧めするかどうかはわかりません。さまざまな言語のさまざまな職業を考えると、少しおかしくなります。しかし、私たちがそれをしている間、それは驚くほどうまくいきました。 そして、i18nのようなシンプルなツールがどれだけのパワーを発揮できるかを明らかにします。

このようなものはどこで受け取りますか?

先週、私は初心者から専門家に移行する方法として、特定のテクノロジーを深く掘り下げることについて話しました。これはその別の例です。i18nについて学んだことのほとんどは、RailsガイドとAPIドキュメントを読んで学んだものです。

だから、その余分なステップを踏みます。信頼できるツールを学びましょう。生産性を向上させるだけでなく、他の方法では考えもしなかったまったく新しいカテゴリのソリューションのロックを解除する可能性のある便利なトリックに遭遇することがわかります。


  1. Redisの10の簡単なヒント

    Redisは現在、技術コミュニティで注目を集めています。 Antirezの小さな個人的なプロジェクトから、メモリ内データストレージの業界標準になるまでには長い道のりがあります。これに伴い、Redisを適切に使用するためにほとんどの人が同意できる一連のベストプラクティスが提供されます。以下では、Redisを正しく使用するための10の簡単なヒントを紹介します。 1。キーの使用をやめる* さて、多分あなたに向かって叫ぶことはこの記事を始めるための素晴らしい方法ではありません。しかし、それはおそらく最も重要なポイントです。あまりにも頻繁に、redisインスタンスを見て、簡単なcommandstats

  2. 生産性を高めるための 10 の簡単な Gmail のヒントとコツ

    世界中の 7 人に 1 人が Gmail を使用していますが、彼らも Gmail が提供するさまざまなオプションを認識していません。 Gmail を使用すると、メールをチェックするだけでなく、重要なメールを強調表示したり、ゴミをフィルター処理したり、ユーザーをブロックしたり、さらに多くのことができます。 Gmail はさまざまな機能を提供しますが、それらのほとんどは非表示のユーザーであるため、それらを利用することはできません。この記事では、これらの素晴らしい機能とその使用方法について説明します。これらの機能は、Gmail を整理、管理するのに役立つだけでなく、楽しく簡単な方法で Gmail