{"id":18103158,"url":"https://github.com/translation/rails","last_synced_at":"2025-05-16T05:03:22.495Z","repository":{"id":15473536,"uuid":"18206976","full_name":"translation/rails","owner":"translation","description":"Rails translation made _('simple').","archived":false,"fork":false,"pushed_at":"2025-02-13T15:38:08.000Z","size":922,"stargazers_count":73,"open_issues_count":0,"forks_count":21,"subscribers_count":6,"default_branch":"master","last_synced_at":"2025-04-01T13:08:18.440Z","etag":null,"topics":["gettext","globalization","i18n","internationalization","localization","rails","ruby","translation"],"latest_commit_sha":null,"homepage":"https://translation.io/rails","language":"Ruby","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/translation.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":"CONTRIBUTING.md","funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2014-03-28T09:22:20.000Z","updated_at":"2025-02-13T15:38:11.000Z","dependencies_parsed_at":"2023-01-14T12:36:52.708Z","dependency_job_id":"39988502-ab3d-4c6b-ad98-1d1d5c285105","html_url":"https://github.com/translation/rails","commit_stats":{"total_commits":417,"total_committers":8,"mean_commits":52.125,"dds":0.302158273381295,"last_synced_commit":"96c8974d6ec0739e9c74f90469418c3780d07fa5"},"previous_names":[],"tags_count":56,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/translation%2Frails","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/translation%2Frails/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/translation%2Frails/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/translation%2Frails/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/translation","download_url":"https://codeload.github.com/translation/rails/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":247867351,"owners_count":21009240,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["gettext","globalization","i18n","internationalization","localization","rails","ruby","translation"],"created_at":"2024-10-31T22:10:41.038Z","updated_at":"2025-04-08T15:04:08.221Z","avatar_url":"https://github.com/translation.png","language":"Ruby","readme":"# [Translation.io](https://translation.io/rails) client for Ruby on Rails\n\n[![Software License](https://img.shields.io/badge/license-MIT-brightgreen.svg?style=flat-square)](LICENSE)\n[![Build Status](https://github.com/translation/rails/actions/workflows/test.yml/badge.svg?branch=master)](https://github.com/translation/rails/actions/workflows/test.yml)\n[![Test Coverage](https://codeclimate.com/github/translation/rails/badges/coverage.svg)](https://codeclimate.com/github/translation/rails/test_coverage)\n[![Gem Version](https://badgen.net/rubygems/v/translation)](https://rubygems.org/gems/translation)\n[![Downloads](https://img.shields.io/gem/dt/translation.svg)](https://rubygems.org/gems/translation)\n\nAdd this gem to localize your **Ruby on Rails** application.\n\nUse the official Rails syntax (with [YAML](#i18n-yaml) files) or use the [GetText](#gettext) syntax.\n\nWrite only the source text, and keep it synchronized with your translators on [Translation.io](https://translation.io/rails).\n\n\u003ca href=\"https://translation.io/rails\"\u003e\n  \u003cimg width=\"720px\" alt=\"Translation.io interface\" src=\"https://translation.io/gifs/translation.gif\"\u003e\n\u003c/a\u003e\n\n[Technical Demo](https://translation.io/videos/rails.mp4) (2.5min)\n\nNeed help? [contact@translation.io](mailto:contact@translation.io)\n\n## Table of contents\n\n * [Localization syntaxes](#localization-syntaxes)\n   * [I18n (YAML)](#i18n-yaml)\n   * [GetText](#gettext)\n * [Installation](#installation)\n * [Usage](#usage)\n   * [Sync](#sync)\n   * [Sync and Show Purgeable](#sync-and-show-purgeable)\n   * [Sync and Purge](#sync-and-purge)\n * [Manage Languages](#manage-languages)\n   * [Add or Remove Language](#add-or-remove-language)\n   * [Edit Language](#edit-language)\n   * [Custom Languages](#custom-languages)\n   * [Fallbacks](#fallbacks)\n * [Change the current locale](#change-the-current-locale)\n   * [Globally](#globally)\n   * [Locally](#locally)\n * [Frontend Localization](#frontend-localization)\n   * [Using this Gem](#using-this-gem)\n   * [Using our official React \u0026 JavaScript package](#using-our-official-react--javascript-package)\n * [Continuous Integration](#continuous-integration)\n * [Advanced Configuration Options](#advanced-configuration-options)\n   * [Disable GetText or YAML](#disable-gettext-or-yaml)\n   * [Ignored YAML keys](#ignored-yaml-keys)\n   * [Custom localization key prefixes](#custom-localization-key-prefixes)\n   * [Source file formats (for GetText)](#source-file-formats-for-gettext)\n   * [Gems with GetText strings](#gems-with-gettext-strings)\n   * [Paths where locales are stored (not recommended)](#paths-where-locales-are-stored-not-recommended)\n   * [GetText Object Class Monkey-Patching](#gettext-object-class-monkey-patching)\n * [Pure Ruby (without Rails)](#pure-ruby-without-rails)\n * [Testing](#testing)\n * [Contributing](#contributing)\n * [List of clients for Translation.io](#list-of-clients-for-translationio)\n   * [Ruby on Rails (Ruby)](#ruby-on-rails-ruby)\n   * [Laravel (PHP)](#laravel-php)\n   * [React, React Native and JavaScript](#react-react-native-and-javascript)\n   * [Angular](#angular)\n   * [Others](#others)\n * [License](#license)\n\n## Localization syntaxes\n\n### I18n (YAML)\n\nThe default [Rails Internationalization API](https://guides.rubyonrails.org/i18n.html).\n\n~~~ruby\n# Regular\nt('inbox.title')\n\n# Pluralization\nt('inbox.message', count: n)\n\n# Interpolation\nt('inbox.hello', name: @user.name)\n~~~\n\nWith the source YAML file:\n\n~~~yaml\nen:\n  inbox:\n    title:   'Title to be translated'\n    message:\n      zero:  'no messages'\n      one:   'one message'\n      other: '%{count} messages'\n    hello:   'Hello %{name}'\n~~~\n\nYou can keep your source YAML file automatically updated using [i18n-tasks](https://github.com/glebm/i18n-tasks).\n\n### GetText\n\nThis gem adds the GetText support to Rails. We [strongly suggest](https://translation.io/blog/gettext-is-better-than-rails-i18n)\nthat you use GetText to translate your application since it allows an easier and more complete syntax.\n\nMoreover, you won't need to create and manage any YAML file since your code will be\nautomatically scanned for any string to translate.\n\n~~~ruby\n# Regular\n_(\"Text to be translated\")\n\n# Pluralization\nn_(\"Singular text\", \"Plural text\", number)\n\n# Regular with context\np_(\"context\", \"Text to be translated\")\n\n# Pluralization with context\nnp_(\"context\", \"Singular text\", \"Plural text\", number)\n\n# Interpolations\n_('%{city1} is bigger than %{city2}') % { city1: \"NYC\", city2: \"BXL\" }\n~~~\n\nMore information about GetText syntax [here](https://github.com/ruby-gettext/gettext#usage).\n\n## Installation\n\n 1. Add the gem to your project's Gemfile:\n\n~~~ruby\ngem 'translation'\n~~~\n\n 2. Create a new translation project [from the UI](https://translation.io/rails).\n 3. Copy the initializer into your Rails app (`config/initializers/translation.rb`)\n\nThe initializer looks like this:\n\n~~~ruby\nTranslationIO.configure do |config|\n  config.api_key        = 'abcdefghijklmnopqrstuvwxyz012345'\n  config.source_locale  = 'en'\n  config.target_locales = ['fr', 'nl', 'de', 'es']\nend\n~~~\n\n 4. Initialize your project and push existing translations to Translation.io with:\n\n~~~bash\nbundle exec rake translation:init\n~~~\n\nIf you need to add or remove languages in the future, please read our\n[documentation](https://translation.io/blog/adding-target-languages) about that.\n\n## Usage\n\n### Sync\n\nTo send new translatable keys/strings and get new translations from Translation.io, simply run:\n\n~~~bash\nbundle exec rake translation:sync\n~~~\n\n### Sync and Show Purgeable\n\nIf you need to find out what are the unused keys/strings from Translation.io, using the current branch as reference:\n\n~~~bash\nbundle exec rake translation:sync_and_show_purgeable\n~~~\n\nAs the name says, this operation will also perform a sync at the same time.\n\n### Sync and Purge\n\nIf you need to remove unused keys/strings from Translation.io, using the current branch as reference:\n\n~~~bash\nbundle exec rake translation:sync_and_purge\n~~~\n\nAs the name says, this operation will also perform a sync at the same time.\n\nWarning: all keys that are not present in the current local branch\nwill be **permanently deleted from Translation.io**.\n\n## Manage Languages\n\n### Add or Remove Language\n\nYou can add or remove a language by updating `config.target_locales = []` in your\n`config/initializers/translation.rb` file, and executing `rake translation:sync`.\n\nIf you want to add a new language with existing translations (ex. if you already have\na translated YAML file in your project), you will need to create a new project on\nTranslation.io and run `rake translation:init` for them to appear.\n\n### Edit Language\n\nTo edit existing languages while keeping their translations (e.g. changing from `en` to `en-US`).\n\n 1. Create a new project on Translation.io with the correct languages.\n 2. Adapt `config/initializers/translation.rb` (new API key and languages)\n 3. Adapt language names and root keys of the YAML files in your project (optional: adapt GetText directories and `.po` headers)\n 4. Execute `rake translation:init` and check that everything went fine.\n 5. Invite your collaborators in the new project.\n 6. Remove the old project.\n\nSince you created a new project, the translation history and tags will unfortunately be lost.\n\n### Custom Languages\n\nCustom languages are convenient if you want to customize translations for a specific customer\nor another instance of your application.\n\nA custom language is always be derived from an [existing language](https://translation.io/docs/languages).\nIts structure should be like:\n\n~~~ruby\n\"#{existing_language_code}-#{custom_text}\"\n~~~\n\nwhere `custom_text` can only contain alphabetic characters and `-`.\n\nExamples: `en-microsoft` or `fr-BE-custom`.\n\n### Fallbacks\n\nIf a translation is missing for a regional (`fr-BE`) or custom (`fr-microsoft`)\nlanguage, then it will fallback to the main language (`fr`).\n\nLocale fallbacks will work as expected with both [I18n (YAML)](#i18n-yaml) \nand [GetText](#gettext) syntaxes.\n\nA good way to leverage this feature is to ignore sentences from a regional language\nthat would have the same translation as the main language (usually most of them).\nIt's way easier to maintain the project over time if only 10% of the regional sentences\nneed to be adapted.\n\nNote that fallbacks are chained, so `fr-BE-custom` will fallback to `fr-BE` that will\nfallback to `fr`.\n\nJust make sure to add `config.i18n.fallbacks = true` to your `config/application.rb` file.\nYou can find more information about this\n[here](https://guides.rubyonrails.org/configuring.html#configuring-i18n).\n\n## Change the current locale\n\n### Globally\n\nThe easiest way to change the current locale is with `set_locale`.\n\n~~~ruby\nclass ApplicationController \u003c ActionController::Base\n  before_action :set_locale\n\n  [...]\nend\n~~~\n\nFirst time the user will connect, it will automatically set the locale extracted\nfrom the user's browser `HTTP_ACCEPT_LANGUAGE` value, and keep it in the session between\nrequests.\n\nUpdate the current locale by redirecting the user to https://yourdomain.com?locale=fr\nor even https://yourdomain.com/fr if you scoped your routes like this:\n\n~~~ruby\nscope \"/:locale\", :constraints =\u003e { locale: /[a-z]{2}/ } do\n  resources :pages\nend\n~~~\n\nThe `set_locale` code is [here](https://github.com/translation/rails/blob/master/lib/translation_io/controller.rb#L3),\nfeel free to override it with your own locale management.\n\nDon't forget to define your available locales with\n[I18n.available_locales](https://guides.rubyonrails.org/i18n.html#setup-the-rails-application-for-internationalization).\n\nMore examples here: https://translation.io/blog/set-current-locale-in-your-rails-app\n\n### Locally\n\nThis command will change the locale for both [I18n (YAML)](#i18n-yaml) and [GetText](#gettext):\n\n~~~ruby\nI18n.locale = 'fr'\n~~~\n\nYou can call it several times in the same page if you want to switch between languages.\n\nMore examples here: https://translation.io/blog/rails-i18n-with-locale\n\n## Frontend Localization\n\n### Using this Gem\n\nThis gem is also able to cover frontend localization (React, Vue, ...).\n\nThere are several ways to pass the translation strings from the backend\nto the frontend: JavaScript serialization, `data-` HTML attributes, JSON files etc.\n\nThe easiest strategy when dealing with React/Vue would be to pass the corresponding\ntranslations as props when mounting the components.\n\nAssuming that you use [reactjs/react-rails](https://github.com/reactjs/react-rails),\nit would look like this if you want to use [I18n (YAML)](#i18n-yaml) syntax:\n\n~~~erb\n\u003c%= \nreact_component(\"MyComponent\", {\n  :user_id =\u003e current_user.id,\n  :i18n    =\u003e YAML.load_file(\"config/locales/#{I18n.locale}.yml\")[I18n.locale.to_s][\"my_component\"]\n}) \n%\u003e\n~~~\n\nYour `en.yml` should look like this:\n\n~~~yaml\nen:\n  my_component:\n    your_name: Your name\n    title: Title\n~~~\n\nYou can also directly use the [GetText](#gettext) syntax:\n\n~~~erb\n\u003c%= \nreact_component(\"MyComponent\", {\n  :user_id =\u003e current_user.id,\n  :i18n =\u003e {\n    :your_name =\u003e _('Your name'),\n    :title     =\u003e _('Title')\n  }\n}) \n%\u003e\n~~~\n\nIn both case, in your React component, you can simply call\n`this.props.i18n.yourName` and your text will be localized with the current locale.\n\n**Notes:**\n\n * You can also structure the i18n props with multiple levels of depth and pass the subtree as props to each of your sub-components.\n * It also works great with server-side rendering of your components (`:prerender =\u003e true`).\n\n### Using our official React \u0026 JavaScript package\n\nAs Translation.io is directly integrated in the great\n[Lingui](https://lingui.dev/) internationalization framework,\nyou can also consider frontend localization as a completely different\nlocalization project.\n\nPlease read more about this on:\n\n * Website: [https://translation.io/lingui](https://translation.io/lingui)\n * GitHub page: [https://github.com/translation/lingui](https://github.com/translation/lingui)\n\n## Continuous Integration\n\nIf you want fresh translations in your Continuous Integration workflow, you may\nfind yourself calling `bundle exec rake translation:sync` very frequently.\n\nSince this task can't be concurrently executed\n(we have a [mutex](https://en.wikipedia.org/wiki/Mutual_exclusion) strategy with\na queue but it returns an error under heavy load), we implemented this\nthreadsafe readonly task:\n\n~~~bash\nbundle exec rake translation:sync_readonly\n~~~\n\nThis task will prevent your CI from failing and still provide new translations. But\nbe aware that it won't send new keys from your code to Translation.io so you\nstill need to call `bundle exec rake translation:sync` at some point during\ndevelopment.\n\n## Advanced Configuration Options\n\nThe `TranslationIO.configure` block in `config/initializers/translation.rb` can take several optional configuration options.\n\nSome options are described below but for an exhaustive list, please refer to [config.rb](https://github.com/translation/rails/blob/master/lib/translation_io/config.rb).\n\n### Disable GetText or YAML\n\nIf you want to only use YAML files and totally ignore GetText syntax, use:\n\n~~~ruby\nTranslationIO.configure do |config|\n  ...\n  config.disable_gettext = true\n  ...\nend\n~~~\n\nIn contrast, if you only want to synchronize GetText files and leave the YAML\nfiles unchanged, use:\n\n~~~ruby\nTranslationIO.configure do |config|\n  ...\n  config.disable_yaml = true\n  ...\nend\n~~~\n\n### Ignored YAML keys\n\nSometimes you would like to ignore some YAML keys coming from gems or so.\n\nYou can use the `ignored_key_prefixes` array with a mix or strings and \nregular expressions.\n\nFor example:\n\n~~~ruby\nTranslationIO.configure do |config|\n  ...\n  config.ignored_key_prefixes = [\n    'number.human',\n    'admin',\n    'errors.messages',\n    'activerecord.errors.messages',\n    'will_paginate',\n    'helpers.page_entries_info',\n    'views.pagination',\n    'enumerize.visibility',\n    /\\.code$/\n  ]\n  ...\nend\n~~~\n\n### Custom localization key prefixes\n\nRails YAML files contain not only translation strings but also localization values (integers, arrays, booleans)\nin the same place and that's bad. For example: date formats, number separators, default\ncurrency or measure units, etc.\n\nA translator is supposed to translate, not localize. That's not his role to choose how you want your dates or\nnumbers to be displayed, right? Moreover, this special keys often contain special constructions (e.g.,\nwith percent signs or spaces) that he might break.\n\nWe think localization is part of the configuration of the app and it should not reach the translator UI at all.\nThat's why these localization keys are detected and separated on a dedicated YAML file with Translation.io.\n\nWe automatically treat [known localization keys](https://github.com/translation/rails/blob/master/lib/translation_io/yaml_entry.rb), but if you would like\nto add some more, use the `localization_key_prefixes` option.\n\nFor example:\n\n~~~ruby\nTranslationIO.configure do |config|\n  ...\n  config.localization_key_prefixes = ['my_gem.date.formats']\n  ...\nend\n~~~\n\n### Source file formats (for GetText)\n\nIf you are using GetText and you want to manage other file formats than:\n\n * `rb`, `ruby` and `rabl` for Ruby.\n * `erb` and `inky` for Ruby templating.\n * `haml` and `mjmlhaml` for [HAML](https://haml.info/).\n * `slim` and `mjmlslim` for [SLIM](https://github.com/slim-template/slim).\n\nJust add them in your configuration file like this:\n\n~~~ruby\nTranslationIO.configure do |config|\n  ...\n  config.source_formats      \u003c\u003c 'rb2'\n  config.erb_source_formats  \u003c\u003c 'erb2'\n  config.haml_source_formats \u003c\u003c 'haml2'\n  config.slim_source_formats \u003c\u003c 'slim2'\n  ...\nend\n~~~\n\n### Gems with GetText strings\n\nPublic gems usually don't make use of GetText strings, but if you created and localized your own gems\nwith the GetText syntax, you'll want to be able to synchronize them:\n\n~~~ruby\nTranslationIO.configure do |config|\n  ...\n  config.parsed_gems = ['your_gem_name']\n  ...\nend\n~~~\n\n### Paths where locales are stored (not recommended)\n\nYou can specify where your GetText and YAML files are on disk:\n\n~~~ruby\nTranslationIO.configure do |config|\n  ...\n  config.locales_path      = 'some/path' # defaults to config/locales/gettext\n  config.yaml_locales_path = 'some/path' # defaults to config/locales\n  ...\nend\n~~~\n\n### GetText Object Class Monkey-Patching\n\nGetText methods (`_('')`, etc.) are available everywhere in your application.\nThis is made by extending the global `Object` class.\n\nYou can disable the built-in `Object` monkey-patching if you\nprefer a more granular approach:\n\n~~~ruby\nTranslationIO.configure do |config|\n  ...\n  config.gettext_object_delegate = false\n  ...\nend\n~~~\n\nDon't forget to manually include the GetText methods where needed:\n\n~~~ruby\nclass Contact \u003c ApplicationRecord\n  extend TranslationIO::Proxy\nend\n~~~\n\n## Pure Ruby (without Rails)\n\nThis gem was created specifically for Rails, but you can also use it in a pure Ruby project by making some arrangements:\n\n~~~ruby\n  require 'rubygems'\n  require 'active_support/all'\n  require 'yaml'\n\n  class FakeConfig\n    def after_initialize\n    end\n    def development?\n      false\n    end\n  end\n\n  module Rails\n    class Railtie\n      def self.rake_tasks\n        yield\n      end\n\n      def self.initializer(*args)\n      end\n\n      def self.config\n        ::FakeConfig.new\n      end\n    end\n\n    def self.env\n      ::FakeConfig.new\n    end\n  end\n\n  task :environment do\n  end\n\n  require 'translation'\n\n  I18n.load_path += Dir[File.join('i18n', '**', '*.{yml,yaml}')]\n\n  # Put your configuration here:\n  TranslationIO.configure do |config|\n    config.yaml_locales_path = 'i18n'\n    config.api_key           = ''\n    config.source_locale     = 'en'\n    config.target_locales    = ['nl', 'de']\n    config.metadata_path     = 'i18n/.translation_io'\n  end\n~~~\n\n(Thanks [@kubaw](https://github.com/kubaw) for this snippet!)\n\n## Testing\n\nTo run the specs:\n\n~~~bash\nbundle exec rspec\n~~~\n\n## Contributing\n\nPlease read the [CONTRIBUTING](CONTRIBUTING.md) file.\n\n## List of clients for Translation.io\n\nThe following clients are officially supported by [Translation.io](https://translation.io)\nand are well documented.\n\nSome of these implementations (and other non-officially supported ones)\nwere started by contributors for their own translation projects.\nWe are thankful to all contributors for their hard work!\n\n### Ruby on Rails (Ruby)\n\nOfficially supported on [https://translation.io/rails](https://translation.io/rails)\n\n * GitHub: https://github.com/translation/rails\n * RubyGems: https://rubygems.org/gems/translation/\n\nCredits: [@aurels](https://github.com/aurels), [@michaelhoste](https://github.com/michaelhoste)\n\n### Laravel (PHP)\n\nOfficially supported on [https://translation.io/laravel](https://translation.io/laravel)\n\n * GitHub: https://github.com/translation/laravel\n * Packagist: https://packagist.org/packages/tio/laravel\n\nCredits: [@armandsar](https://github.com/armandsar), [@michaelhoste](https://github.com/michaelhoste)\n\n### React, React Native and JavaScript\n\nOfficially supported on [https://translation.io/lingui](https://translation.io/lingui)\n\nTranslation.io is directly integrated in the great\n[Lingui](https://lingui.dev/) internationalization project.\n\n * GitHub: https://github.com/translation/lingui\n * NPM: https://www.npmjs.com/package/@translation/lingui\n\n### Angular\n\nOfficially supported on [https://translation.io/angular](https://translation.io/angular)\n\n * GitHub: https://github.com/translation/angular\n * NPM: https://www.npmjs.com/package/@translation/angular\n \nCredits: [@SimonCorellia](https://github.com/SimonCorellia), [@didier-84](https://github.com/didier-84), [@michaelhoste](https://github.com/michaelhoste)\n\n### Others\n\nIf you want to create a new client for your favorite language or framework, please read our\n[Create a Translation.io Library](https://translation.io/docs/create-library)\nguide and use the special\n[init](https://translation.io/docs/create-library#initialization) and\n[sync](https://translation.io/docs/create-library#synchronization) endpoints.\n\nYou can also use the more [traditional API](https://translation.io/docs/api).\n\nFeel free to contact us on [contact@translation.io](mailto:contact@translation.io)\nif you need some help or if you want to share your library.\n\n## License\n\nThe [translation gem](https://rubygems.org/gems/translation) in released under MIT license by\n[Aurélien Malisart](https://aurelien.malisart.be) and [Michaël Hoste](https://80limit.com) (see [LICENSE](LICENSE) file).\n\n(c) [https://translation.io](https://translation.io) / [contact@translation.io](mailto:contact@translation.io)\n","funding_links":[],"categories":[],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ftranslation%2Frails","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Ftranslation%2Frails","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ftranslation%2Frails/lists"}