Skip to content

r18n/r18n-rails

Repository files navigation

R18n for Rails

Cirrus CI - Base Branch Build Status Codecov branch Code Climate Depfu License Gem

R18n-rails is a gem to add out-of-box R18n support to Rails I18n.

It is a wrapper for R18n Rails API and R18n core libraries. See R18n core documentation for more information.

Features

R18n for Rails is fully compatible with Rails I18n, and add extra features:

  • Nice Ruby-style syntax.
  • Filters.
  • Model Translation (or any Ruby object).
  • Auto-detect user locales.
  • Flexible locales.
  • Total flexibility.

See full features in main README.

How To

  1. Add r18n-rails gem to your Gemfile:

    gem 'r18n-rails'
    

    Now R18n will auto-detect user locales.

  2. Define your way to set locale manually. R18n will find it in params[:locale] or session[:locale]. Best way is a put optional locale prefix to URLs:

    match ':controller/:action'
    match ':locale/:controller/:action'
  3. Print available translations, to choose from them manually (and to help search engines):

    %ul
      - r18n.available_locales.each do |locale|
        %li
          %a( href="/#{locale.code}/" )= locale.title
  4. Translations in I18n format are stored in config/locales/%{locale}.yml:

    en:
      user:
        name: "User name is %{name}"
        count:
          zero: "No users"
          one:  "One user"
          many: "%{count} users"

    Translations in R18n format go to app/i18n/%{locale}.yml:

    user:
      name: User name is %1
      count: !!pl
        0: No users
        1: 1 user
        n: '%1 users'
  5. Use translated messages in views. You can use Rails I18n syntax:

    t 'user.name',  name: 'John'
    t 'user.count', count: 5

    or R18n syntax:

    t.user.name(name: 'John') # for Rails I18n named variables
    t.user.name('John')       # for R18n variables
    t.user.count(5)
  6. Print dates and numbers in user's tradition:

    l Date.today, :standard #=> "2009-12-20"
    l Time.now,   :full     #=> "20th of December, 2009 12:00"
    l 1234.5                #=> "1,234.5"
  7. Translate models. You can use R18n::Translated mixin for any Ruby class, not only for ActiveRecord models

    1. Add to migration columns for each of the supported locales, named as %{name}_%{locale}:

      t.string :title_en
      t.string :title_ru
      
      t.string :text_en
      t.string :text_ru
    2. Add R18n::Translated mixin to model:

      class Post < ActiveRecord::Base
        include R18n::Translated
    3. Call translations method in model with all columns to be translated:

      translations :title, :text

      Now model will have virtual methods title, text, title= and text=, which will call title_ru or title_en and etc based on current user locales.

  8. Download translations for Rails system messages (validation, etc) from svenfuchs/rails-i18n and put them to config/locales/ (because them use Rails I18n format).

  9. Add your own translations filters to app/i18n/filters.rb:

    R18n::Filters.add('gender') do |translation, config, user|
      translation[user.gender]
    end

    And use in translations:

    log:
      signup: !!gender
        male: Он зарегистрировался
        female: Она зарегистрировалась

    and application:

    t.log.signup(user)

License

R18n is licensed under the GNU Lesser General Public License version 3. You can read it in LICENSE file or in www.gnu.org/licenses/lgpl-3.0.html.

Author

Andrey “A.I.” Sitnik [email protected]