My tricks for i18n in Rails
I hate working with i18n. Refactoring partials, rename controllers, actions and many other simple tasks becomes really a pain in the ass, when you have to deal with many translations and locales.
Luckily there's this great gem, that makes our life easier. :D
It's main features are to manage unused translations, add missing one, but also propagate a certain translation to other or new locales.
Over these simple but useful features, i18n-tasks gem provides also a set of composable tasks that are very useful to mass-rename, insert or delete data from locales.
Unfortunately these features are not really straight forward, so I created a small cheatsheet with a few examples, with a short explanation.
Mass move a translation tree
It moves all articles.filters.*
branch under articles.filter_data.*
.
i18n-tasks data -f yaml | i18n-tasks tree-filter articles.filters.* | i18n-tasks tree-rename-key *.filters filter_data | i18n-tasks data-merge
i18n-tasks data -f yaml | i18n-tasks tree-filter articles.filters.* | i18n-tasks data-remove
Example data set:
articles:
filters:
some_key: some value
some_other_key: some value
...
Output:
articles:
filter_data:
some_key: some value
some_other_key: some value
Explanation
It's composed in two parts. The first one copies articles.filters.*
to articles.filter_data.*
i18n-tasks data -y yaml
outputs all data as yaml. (any locale you have installed in your project).i18n-tasks tree-filter [pattern]
filters the previously outputted data given a pattern. In my example, it gets only children ofarticles.filter
i18n-tasks tree-rename-key [pattern] [new_value]
renames everything that starts with .filters with the wordfilter_data
. Take care: it renames only the last word of the chain. If your pattern is `.a.b.c.d, only **d** will get renamed. For instance, if you want to rename both **c** and **d**, you have to call
tree-rename-key` two times.data-merge
merges the current data with the one in your locale database
The second part instead deletes the original articles.filters.*
:
-
data-remove
: removes the filtered data from your locale database.
EDIT: As i18n-tasks v0.9.8 this can be replaced by:
i18n-tasks mv articles.filters articles.filter_data
Thanks @glebm in the comments below!
Create a new tree branch
Creates a branch with key my.new.tree
in your en
locale:
echo 'en.my.new.tree' | i18n-tasks tree-convert -f keys -t yaml | i18n-tasks tree-set-value Hello | i18n-tasks data-merge
Output
en:
my:
new:
tree: Hello
Explanation
echo "en.my.new.tree"
: Prints/passes to next pipe that stringi18n-tasks tree-convert
converts one format to another. Valid formats arekeys
,yaml
andjson
. In this case, translates the stringen.my.new.tree
in a yaml tree.i18n-tasks tree-set-value Hello
Sets the value of the current tree to "Hello"i18n-tasks data-merge
Merge the result with your locale database.
Written by ProGM
Related protips
2 Responses
Great tips! I love that you're using the commands in a way I never imagined they could be used (especially the Create a new tree branch example!).
I've just released v0.9.8 that adds 3 new tasks: mv
, rm
, and tree-mv
.
They make mass-renaming much simpler and also allow for moving and merging the keys.
The first example in the article is now just:
i18n-tasks mv articles.filters articles.filter_data
Thank you @glebm ! I updated the article, introducing your update! <3