Giter Club home page Giter Club logo

i18n-backend-side_by_side's Introduction

i18n-backend-side_by_side

Tests Status Gem Version

Tired of jumping between language files when translating keys? Stop jumping and have all the languages side by side.

This gem is a subclass of the default I18n::Backend::Simple backend. It changes the way translations get loaded from files in order to support specifying the language code anywhere along the key path as opposed to the root key. This allows for all languages being defined next to each other, making it easier to translate between them.

How It Works

Let's assume your app supports English, Spanish, and German. You probably have one file per language:

locales/
  view.en.yml
  view.es.yml
  view.de.yml

The files might look something like this (e.g. locales/en.yml):

en:
  view:
    title: Welcome
    inbox:
      zero: You have no messages
      one: You have one message
      other: 'You have %{count} messages'

Whenever you have to add or modify a key, you have to edit all files. Also, you can't see all translations at once for a specific key. With this gem you can merge all the files and specify the translation for a key at that key:

_:
  view:
    title:
      _en: Welcome
      _es: Bienvenido
      _de: Willkommen
    common_message: This string is available for all languages
    inbox:
      _en:
        zero: You have no messages
        one: You have one message
        other: 'You have %{count} messages'
      _es:
        zero: No tiene mensajes
        one: Tienes un mensaje
        other: 'Tienes %{count} messajes'
      _de:
        zero: Du hast keine Nachrichten
        one: Du hast eine Nachricht
        other: 'Du hast %{count} Nachrichten'

Two things to note here:

  1. The root key is an underscore. Omitting it results in the file being processed as a regular translation file, without support for side-by-side translations.

  2. The language codes are prefixed with an underscore. This is needed in order to distinguish a language code key from a normal key. This also means that regular keys can't start with an underscore.

When the files get loaded, they're transformed on the fly to the original format by moving the language code to the beginning of the key path:

_.foo.bar._en            => en.foo.bar
_.foo.bar._en-UK.abc.xyz => en-UK.foo.bar.abc.xyz

Installation

Add this line to your application's Gemfile:

gem 'i18n-backend-side_by_side'

Set up I18n to use an instance of this backend:

I18n.backend = I18n::Backend::SideBySide.new

That's it. Continue using I18n as you're used to. Happy translating!

Authors

i18n-backend-side_by_side's People

Contributors

fphilipe avatar thibaudgg avatar pmukerji avatar westonganger avatar

Stargazers

 avatar Asad Akbar avatar  avatar  avatar Robert Audi avatar Paul Fioravanti avatar Thomas Stockschläder avatar Yanhao Yang avatar Kyrre Havik avatar Federico avatar Faruk Celik avatar Chris avatar Anton Semenov avatar Jimmy Chen avatar Michael avatar Clayton Parker avatar Cristiano Betta avatar Mohamad Abras avatar Sam avatar Josh Teneycke avatar Jun Lin avatar Dan Palmer avatar Peter Rhoades avatar Danielle Cushing avatar Ole J. Rosendahl avatar Jonathon Jones avatar Yury Druzhkov avatar  avatar Kenn Ejima avatar Felipe Orlando avatar  avatar Eugeny avatar  avatar Hugo Campos avatar Igor Zubkov avatar Eyüp Atiş avatar Steve Hill avatar Anderson Bravalheri avatar Dmitry Polushkin avatar Martin Spickermann avatar Richardson Dackam avatar Xurxo Méndez Pérez avatar Alexey Trofimenko avatar René Koller avatar Māris Cīlītis avatar  avatar Evelyn Pai avatar Vedi avatar Moritz Meenen avatar  avatar

Watchers

 avatar  avatar James Cloos avatar

i18n-backend-side_by_side's Issues

Support Translations keys with only one language

If a project currently only has one translation but is starting to add more it might be beneficial to be able to support the following addition:

_:
  common:
    welcome:
      _en: Welcome
      _es: Bienvenido
      _de: Willkommen
    subject: Subject ### Interpret this line as the default locale or for all locales

Issue with partial pluralized translation

Won't work when only one language is not pluralized.

Example:

        body:
          one:
            _en: Someone
          other:
            _en: Someones
          _it: Qualcuno
Puma caught this error: undefined method `each' for #<String:0x00007f9aaec287b0> (NoMethodError)
/Users/nrako/.gem/ruby/2.5.1/gems/i18n-backend-side_by_side-1.0.0/lib/i18n/backend/side_by_side.rb:34:in `_process'
/Users/nrako/.gem/ruby/2.5.1/gems/i18n-backend-side_by_side-1.0.0/lib/i18n/backend/side_by_side.rb:34:in `block in _process'
/Users/nrako/.gem/ruby/2.5.1/gems/i18n-backend-side_by_side-1.0.0/lib/i18n/backend/side_by_side.rb:34:in `each'
/Users/nrako/.gem/ruby/2.5.1/gems/i18n-backend-side_by_side-1.0.0/lib/i18n/backend/side_by_side.rb:34:in `_process'
/Users/nrako/.gem/ruby/2.5.1/gems/i18n-backend-side_by_side-1.0.0/lib/i18n/backend/side_by_side.rb:34:in `block in _process'
/Users/nrako/.gem/ruby/2.5.1/gems/i18n-backend-side_by_side-1.0.0/lib/i18n/backend/side_by_side.rb:34:in `each'
/Users/nrako/.gem/ruby/2.5.1/gems/i18n-backend-side_by_side-1.0.0/lib/i18n/backend/side_by_side.rb:34:in `_process'
/Users/nrako/.gem/ruby/2.5.1/gems/i18n-backend-side_by_side-1.0.0/lib/i18n/backend/side_by_side.rb:34:in `block in _process'
/Users/nrako/.gem/ruby/2.5.1/gems/i18n-backend-side_by_side-1.0.0/lib/i18n/backend/side_by_side.rb:34:in `each'
/Users/nrako/.gem/ruby/2.5.1/gems/i18n-backend-side_by_side-1.0.0/lib/i18n/backend/side_by_side.rb:34:in `_process'
/Users/nrako/.gem/ruby/2.5.1/gems/i18n-backend-side_by_side-1.0.0/lib/i18n/backend/side_by_side.rb:34:in `block in _process'
/Users/nrako/.gem/ruby/2.5.1/gems/i18n-backend-side_by_side-1.0.0/lib/i18n/backend/side_by_side.rb:34:in `each'
/Users/nrako/.gem/ruby/2.5.1/gems/i18n-backend-side_by_side-1.0.0/lib/i18n/backend/side_by_side.rb:34:in `_process'
/Users/nrako/.gem/ruby/2.5.1/gems/i18n-backend-side_by_side-1.0.0/lib/i18n/backend/side_by_side.rb:34:in `block in _process'
/Users/nrako/.gem/ruby/2.5.1/gems/i18n-backend-side_by_side-1.0.0/lib/i18n/backend/side_by_side.rb:34:in `each'
/Users/nrako/.gem/ruby/2.5.1/gems/i18n-backend-side_by_side-1.0.0/lib/i18n/backend/side_by_side.rb:34:in `_process'
/Users/nrako/.gem/ruby/2.5.1/gems/i18n-backend-side_by_side-1.0.0/lib/i18n/backend/side_by_side.rb:20:in `load_file'
/Users/nrako/.gem/ruby/2.5.1/gems/i18n-0.9.5/lib/i18n/backend/base.rb:15:in `block in load_translations'
/Users/nrako/.gem/ruby/2.5.1/gems/i18n-0.9.5/lib/i18n/backend/base.rb:15:in `each'
/Users/nrako/.gem/ruby/2.5.1/gems/i18n-0.9.5/lib/i18n/backend/base.rb:15:in `load_translations'
/Users/nrako/.gem/ruby/2.5.1/gems/i18n-0.9.5/lib/i18n/backend/simple.rb:63:in `init_translations'
/Users/nrako/.gem/ruby/2.5.1/gems/i18n-0.9.5/lib/i18n/backend/simple.rb:77:in `lookup'
/Users/nrako/.gem/ruby/2.5.1/gems/i18n-0.9.5/lib/i18n/backend/base.rb:29:in `translate'
/Users/nrako/.gem/ruby/2.5.1/gems/i18n-0.9.5/lib/i18n/backend/fallbacks.rb:47:in `block (2 levels) in translate'
/Users/nrako/.gem/ruby/2.5.1/gems/i18n-0.9.5/lib/i18n/backend/fallbacks.rb:46:in `catch'
/Users/nrako/.gem/ruby/2.5.1/gems/i18n-0.9.5/lib/i18n/backend/fallbacks.rb:46:in `block in translate'
/Users/nrako/.gem/ruby/2.5.1/gems/i18n-0.9.5/lib/i18n/backend/fallbacks.rb:44:in `each'
/Users/nrako/.gem/ruby/2.5.1/gems/i18n-0.9.5/lib/i18n/backend/fallbacks.rb:44:in `translate'
/Users/nrako/.gem/ruby/2.5.1/gems/i18n-0.9.5/lib/i18n.rb:169:in `block in translate'
/Users/nrako/.gem/ruby/2.5.1/gems/i18n-0.9.5/lib/i18n.rb:165:in `catch'
/Users/nrako/.gem/ruby/2.5.1/gems/i18n-0.9.5/lib/i18n.rb:165:in `translate'
(erb):51:in `render_form'
/Users/nrako/.rubies/ruby-2.5.1/lib/ruby/2.5.0/erb.rb:876:in `eval'
/Users/nrako/.rubies/ruby-2.5.1/lib/ruby/2.5.0/erb.rb:876:in `result'
/Users/nrako/.gem/ruby/2.5.1/gems/honeybadger-2.7.2/lib/honeybadger/rack/user_feedback.rb:49:in `render_form'
/Users/nrako/.gem/ruby/2.5.1/gems/honeybadger-2.7.2/lib/honeybadger/rack/user_feedback.rb:29:in `call'
/Users/nrako/.gem/ruby/2.5.1/gems/honeybadger-2.7.2/lib/honeybadger/rack/user_informer.rb:18:in `call'
/Users/nrako/.gem/ruby/2.5.1/gems/xipio-1.0.0/lib/xipio/middleware.rb:10:in `call'
/Users/nrako/.gem/ruby/2.5.1/gems/rack-cors-1.0.1/lib/rack/cors.rb:93:in `call'
/Users/nrako/.gem/ruby/2.5.1/gems/webpacker-3.0.2/lib/webpacker/dev_server_proxy.rb:17:in `perform_request'
/Users/nrako/.gem/ruby/2.5.1/gems/rack-proxy-0.6.2/lib/rack/proxy.rb:57:in `call'
/Users/nrako/.gem/ruby/2.5.1/gems/railties-5.1.6/lib/rails/engine.rb:522:in `call'
/Users/nrako/.gem/ruby/2.5.1/gems/railties-5.1.6/lib/rails/railtie.rb:185:in `public_send'
/Users/nrako/.gem/ruby/2.5.1/gems/railties-5.1.6/lib/rails/railtie.rb:185:in `method_missing'
/Users/nrako/.gem/ruby/2.5.1/gems/rack-status-1.0.0/lib/rack/status.rb:13:in `call'
/Users/nrako/.gem/ruby/2.5.1/gems/puma-3.10.0/lib/puma/configuration.rb:225:in `call'
/Users/nrako/.gem/ruby/2.5.1/gems/puma-3.10.0/lib/puma/server.rb:605:in `handle_request'
/Users/nrako/.gem/ruby/2.5.1/gems/puma-3.10.0/lib/puma/server.rb:437:in `process_client'
/Users/nrako/.gem/ruby/2.5.1/gems/puma-3.10.0/lib/puma/server.rb:301:in `block in run'
/Users/nrako/.gem/ruby/2.5.1/gems/puma-3.10.0/lib/puma/thread_pool.rb:120:in `block in spawn_thread'

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.