Rex
Rex is a simple i18n adapter interface for Crystal. It allows a shard to define translatable text, enabling apps that require the shard to use any i18n shard of choice as backend.
Installation
-
Add the dependency to your
shard.yml:dependencies: rex: github: GrottoPress/rex -
Run
shards update -
Require Rex:
# ... require "rex" # ...
Usage
-
Call the i18n helpers in your shard as required:
# Translation Rex.t(:some_text, name: "Ama") Rex.t("some_text", {name: "John"}) Rex.t("some.text", 45, "Judith") Rex.t(:another_text) # Localization Rex.l(Time.utc) Rex.l(123_456, :arg) -
The consumer application defines their adapter:
# ->>> src/config/i18n.cr require "some_i18n_shard" struct SomeAppI18nAdapter include Rex::Adapter def translate(text : String | Symbol, *args) : String # You may use any i18n shard as backend Somei18nShard.translate(text, *args) end def localize(value, *args) : String # You may use any i18n shard as backend Somei18nShard.localize(value, *args) end end -
The consumer application then configures Rex to use this adapter:
# ->>> src/config/i18n.cr Rex.configure do |settings| settings.adapter = SomeAppI18nAdapter.new endThe consumer application sets up translations according to whatever backend they are using.
Testing
Rex comes with Rex::DevAdapter which may be used for tests:
# ->>> spec/my_app/some_spec.cr
Rex.temp_config(adapter: Rex::DevAdapter.new) do
# ...
# `Rex::DevAdapter` returns the text passed to `Rex.t` unchanged
Rex.t(:some_text, {name: "Kwame"}).should(eq "some_text")
# ...
end
Development
Run tests with crystal spec.
Contributing
- Fork it
- Switch to the
masterbranch:git checkout master - Create your feature branch:
git checkout -b my-new-feature - Make your changes, updating changelog and documentation as appropriate.
- Commit your changes:
git commit - Push to the branch:
git push origin my-new-feature - Submit a new Pull Request against the
GrottoPress:masterbranch.