Skip to content

Translate Rails Action Text rich text with Mobility.

License

Notifications You must be signed in to change notification settings

sedubois/mobility-actiontext

Repository files navigation

Mobility Action Text

Gem Version Build Status

Translate Rails Action Text rich text with Mobility.

Installation

  1. Install Action Text.

  2. Install Mobility without tables.

  3. Execute bundle add mobility-actiontext

  4. Run this migration:

class TranslateRichTexts < ActiveRecord::Migration[7.1]
  def change
    # or null: true to allow untranslated rich text
    add_column :action_text_rich_texts, :locale, :string, null: false

    remove_index :action_text_rich_texts,
                 column: [:record_type, :record_id, :name],
                 name: :index_action_text_rich_texts_uniqueness,
                 unique: true
    add_index :action_text_rich_texts,
              [:record_type, :record_id, :name, :locale],
              name: :index_action_text_rich_texts_uniqueness,
              unique: true
  end
end

Usage

# app/models/message.rb
class Message < ApplicationRecord
+  extend Mobility
+
-  has_rich_text :content
+  translates :content, backend: :action_text
end

Plain text

Although the main purpose of the action_text_rich_texts table is to store rich text, this gem allows using it for plain text as well. This could be useful to consolidate all text in a single table and to remove the need to migrate data when converting between one and the other.

# app/models/message.rb
class Message < ApplicationRecord
   extend Mobility

+  translates :title, backend: :action_text, plain: true
   translates :content, backend: :action_text
end

Implementation note

Action Text's rich text content is saved in its own model that can be associated with any existing Active Record model using a polymorphic relation. Likewise, Mobility's KeyValue backend allows to translate any model using a polymorphic relation. This gem makes use of this similarity by combining both features in a single step, thus offering rich text "for free", i.e. in theory at no extra performance cost compared to untranslated rich text or translated plain text.

This is done through the Mobility::Backends::ActionText::Translation model extending ActionText::RichText. This model is backed by Action Text's existing action_text_rich_texts table and its existing name, body and record attributes, to which is added a new locale attribute.

Read more on the genesis of this gem.

Development

After checking out the repo, run bundle install to install dependencies.

Execute tests by running:

cd test_app
bundle install
bundle exec rails test

To release a new version, update lib/mobility/action_text/version.rb and CHANGELOG.md, run bundle && cd test_app && bundle, commit, then run bundle exec rake release. This will create a git tag for the version, push git commits and the created tag, and push the .gem file to rubygems.org.

Contributing

Bug reports and pull requests are welcome on GitHub at https://github.com/sedubois/mobility-actiontext.

License

The gem is available as open source under the terms of the MIT License.