rex
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_key, name: "Ama") Rex.t("some_key", {name: "John"}) Rex.t("some.key", 45, "Judith") Rex.t(:another_key) # 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(key : String | Symbol, *args) : String # You may use any i18n shard as backend Somei18nShard.translate(key, *args) end def localize(value, *args) : String # You may use any i18n shard as backend Somei18nShard.localize(value, *args) end # You may add more `#translate` and `#localize` overloads # as needed end
- 
The consumer application configures Rex to use this adapter: # ->>> src/config/i18n.cr Rex.configure do |settings| settings.adapter = SomeAppI18nAdapter.new endIf the i18n backend evaluates translations at compile time (eg: Rosetta), the application should define a Rex.tmacro instead:# ->>> src/config/i18n.cr module Rex macro t(text, **named_args) Rosetta.find({{ text.id.stringify }}) .t({{ named_args unless named_args.empty? }}) end end
- 
The 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 key passed to `Rex.t` unchanged
  Rex.t(:some_key, {name: "Kwame"}).should(eq "some_key")
  # ...
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.