Lost in translation
Rails i18n web interface
Translate your apps with pleasure (sort of...) and for free. It's simple i18n web interface, build on top of twitter bootstrap, that one may find helpful in translating app by non-technicals.
Highly inspired by Copycopter by thoughtbot.
Features
- Runs with your app - no need for external services
- Support for array types, (ie.
date.abbr_day_names
) - Versioning translations - you can always check, how value did look like in past
- Possibility to synchronize translations between environments or apps
- Easy to install - works as an engine, comes with simple generator
- You can always export all translations to plain old YAML file
- Has build in wysiwyg editor (jQuery TE)
- Translating apps directly in frontend (see bellow)
- (On request) stores paths where translation keys were called
- (On request) is able to show all translation keys used to render current page
Screenshots
Check wiki: Screenshots
Installation
- Add
lit
gem to yourGemfile
ruby gem 'lit'
For Ruby < 1.9 use gem 'lit', '= 0.2.4'
, as next versions introduced new ruby hash syntax.
run
bundle install
run installation generator
bundle exec rails g lit:install
(for production/staging environmentredis
is suggested as key value engine.hash
will not work in multi process environment)Add
config.i18n.available_locales = [...]
toapplication.rb
- it's required to precompile appropriate language flags in lit backend.After doing above and restarting app, point your browser to
http://app/lit
Profit!
You may want to take a look at generated initializer in config/initializers/lit.rb
and change some default configuration options.
So... again - what is it and how to use it?
Lit is Rails engine - it runs in it's own namespace, by default it's avaulable under /lit
. It provides UI for managing translations of your app.
Once you call I18n.t()
function from your views, Lit is asked whether it has or not proper value for it. If translation is present in database and is available for Lit, it's served back. If it does not exists, record is automatically created in database with initial value provided in default
option key. If default
key is not present, value nil
is saved to database. When app is starting, Lit will preload all keys from your local config/locale/*.yml
files - this is why app startup may take a while.
To optimize translation key lookup, Lit can use different cache engines. For production with many workers redis
is suggested, for local development hash
will be fine (hash
is stored in memory, so if you have many workers and will update translation value in backend, only one worker will have proper translation in it's cache - db will be updated anyway).
Keys ending with _html
have auto wysiwyg support.
You can also export translations using rake task
$ rake lit:export
You may also give it extra env variables to limit the export results.
$ LOCALES=en,de rake lit:export
0.2 -> 0.3 upgrade guide
- Specify exact lit version in your Gemfile:
gem 'lit', '~> 0.3.0'
- Run
bundle update lit
- Add
config.i18n.available_locales
to yourapplication.rb
(see 3rd point from Installation info) - Add
config.i18n.enforce_available_locales = true
config to yourapplication.rb
- Compare your current
lit.rb
initializer with template.
On-site live translations
- Add
Lit::FrontendHelper
to yourApplicationController
helper Lit::FrontendHelper
In you layout file include lit assets
<% if admin_user_signed_in? %> <%= lit_frontend_assets %> <% end %>
You're good to go - now log in to lit (if required) and open your frontend in separate tab (to have session persisted). On the bottom-right of your page you should see "Enable / disable lit highlight" - after enabling it you'll be able to click and translate phrases directly in your frontend
Once enabled, all translations called via
t
helper function be rendered inside<span />
tag, what may break your layout (ie if you're using translated values as button values or as placeholders, etc). To avoid that addskip_lit: true
tot()
call or useI18n.t
.
Storing request info
Include
Lit::Concerns::RequestInfoStore
concern in yourApplicationController
include Lit::Concerns::RequestInfoStore
In lit initializer (
lit.rb
) setstore_request_info
config to true
Lit.store_request_info = true
- Lit authorized user must be signed in for this feature to work!
Showing called translations in frontend
Add
Lit::FrontendHelper
in yourApplicationController
include Lit::FrontendHelper
Include
Lit::Concerns::RequestKeysStore
concern in yourApplicationController
include Lit::Concerns::RequestKeysStore
On the bottom of you layout file call
lit_translations_info
helper function<%= lit_translations_info %>
From now on you'll be able to see all translation keys that were used to render current page. This feature works great with on-site live translations!
Lit authorized user must be signed in for this feature to work!
ToDo
- ~~Versioning~~
- ~~API~~
- ~~Synchronization between environments~~
- Rewrite initializer
- ~~Rewrite exporter (which is now code from copycopter)~~
- ~~Support for array types (ie.
date.abbr_day_names
)~~ - ~~Generator~~
- ~~Support for wysiwyg~~
- ~~Better cache~~
- ~~Support for other key value providers (ie. Redis does not support Array types in easy way)~~ (not applicable, as array storage works now with redis).
- Integration with ActiveAdmin
- Support for Proc defaults (like in
I18n.t('not_exising_keys', default: lambda{|_, options| 'text'})
)
Testing
For local testing Appraisal gem comes into play, run tests via: bundle exec appraisal rails-4.2 rake test
.
Please remember to edit test/dummy/config/database.yml
file
License
Lit is free software, and may be redistributed under the terms specified in the MIT-LICENSE file.