diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index f839814..74d08c1 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -2,6 +2,7 @@ name: CI on: pull_request: + branches: [main] push: branches: [main] @@ -9,8 +10,7 @@ jobs: lint: runs-on: ubuntu-latest steps: - - name: Checkout code - uses: actions/checkout@v4 + - uses: actions/checkout@v4 - name: Set up Ruby uses: ruby/setup-ruby@v1 @@ -32,6 +32,9 @@ jobs: - rails_7_1 - rails_7_2 - rails_main + exclude: + - ruby: "3.1" + gemfile: rails_main services: postgres: @@ -57,8 +60,7 @@ jobs: - name: Install packages run: sudo apt-get update && sudo apt-get install --no-install-recommends -y google-chrome-stable curl libjemalloc2 libsqlite3-0 libvips - - name: Checkout code - uses: actions/checkout@v4 + - uses: actions/checkout@v4 - name: Set up Ruby uses: ruby/setup-ruby@v1 @@ -70,11 +72,3 @@ jobs: run: | bin/rails db:test:prepare bin/rails test - - - name: Keep screenshots from failed system tests - uses: actions/upload-artifact@v4 - if: failure() - with: - name: screenshots - path: ${{ github.workspace }}/tmp/screenshots - if-no-files-found: ignore diff --git a/app/controllers/rosetta/locales/translations/missing_controller.rb b/app/controllers/rosetta/locales/translations/missing_controller.rb index d320956..601e9fc 100644 --- a/app/controllers/rosetta/locales/translations/missing_controller.rb +++ b/app/controllers/rosetta/locales/translations/missing_controller.rb @@ -3,7 +3,7 @@ class Locales::Translations::MissingController < Locales::TranslationsController private def scope - TranslationKey.with_missing_translation(@locale) + Locale.default_locale.text_entries.missing_translation(@locale) end end end diff --git a/app/controllers/rosetta/locales/translations_controller.rb b/app/controllers/rosetta/locales/translations_controller.rb index e8e3a9a..c08d88b 100644 --- a/app/controllers/rosetta/locales/translations_controller.rb +++ b/app/controllers/rosetta/locales/translations_controller.rb @@ -3,7 +3,7 @@ class Locales::TranslationsController < ApplicationController include LocaleScoped def index - @pagy, @translation_keys = pagy(scope) + @pagy, @text_entries = pagy(scope) render "rosetta/locales/translations/index" end @@ -11,7 +11,7 @@ def index private def scope - TranslationKey.with_translation(@locale) + TextEntry.with_translated_version(@locale).where(locale: Locale.default_locale) end end end diff --git a/app/controllers/rosetta/translations_controller.rb b/app/controllers/rosetta/translations_controller.rb index 169006f..a82996a 100644 --- a/app/controllers/rosetta/translations_controller.rb +++ b/app/controllers/rosetta/translations_controller.rb @@ -2,25 +2,25 @@ module Rosetta class TranslationsController < ApplicationController include LocaleScoped - before_action :set_translation_key + before_action :set_text_entry def edit end def update - @translation_key.update(translation_key_params) + @text_entry.update(text_entry_params) - render partial: "rosetta/locales/translations/translation_key", locals: { translation_key: @translation_key } + render partial: "rosetta/text_entries/text_entry_with_translation", locals: { text_entry: @text_entry } end private - def set_translation_key - @translation_key = TranslationKey.find(params[:translation_key_id]) + def set_text_entry + @text_entry = TextEntry.find(params[:text_entry_id]) end - def translation_key_params - params.require(:translation_key).permit(:"value_#{@locale.code}") + def text_entry_params + params.require(:text_entry).permit(:"content_#{@locale.code}") end end end diff --git a/app/jobs/rosetta/autodiscovery_job.rb b/app/jobs/rosetta/autodiscovery_job.rb index df476a4..ee18d30 100644 --- a/app/jobs/rosetta/autodiscovery_job.rb +++ b/app/jobs/rosetta/autodiscovery_job.rb @@ -4,8 +4,8 @@ class AutodiscoveryJob < Rosetta::ApplicationJob discard_on ActiveRecord::RecordNotUnique - def perform(value) - TranslationKey.create!(value: value) + def perform(content) + TextEntry.create!(content: content, locale: Locale.default_locale) end end end diff --git a/app/jobs/rosetta/purge_job.rb b/app/jobs/rosetta/purge_job.rb new file mode 100644 index 0000000..0cbb502 --- /dev/null +++ b/app/jobs/rosetta/purge_job.rb @@ -0,0 +1,11 @@ +module Rosetta + class PurgeJob < Rosetta::ApplicationJob + queue_as { Rosetta.config.queues[:purge] } + + discard_on ActiveRecord::RecordNotFound + + def perform(text_entry) + text_entry.purge + end + end +end diff --git a/app/models/rosetta/locale.rb b/app/models/rosetta/locale.rb index e88b416..4230273 100644 --- a/app/models/rosetta/locale.rb +++ b/app/models/rosetta/locale.rb @@ -8,8 +8,7 @@ class Locale < ApplicationRecord validates :code, uniqueness: true validates :code, format: { with: CODE_FORMAT, message: "must only contain letters separated by an optional dash" } - has_many :translations, dependent: :destroy - + has_many :text_entries, dependent: :destroy after_create_commit :notify_translated_models class << self diff --git a/app/models/rosetta/text_entry.rb b/app/models/rosetta/text_entry.rb new file mode 100644 index 0000000..a78c2f5 --- /dev/null +++ b/app/models/rosetta/text_entry.rb @@ -0,0 +1,22 @@ +module Rosetta + class TextEntry < ApplicationRecord + include Translated + + translate_in_all_locales + + belongs_to :locale + + def self.create_later(content) + AutodiscoveryJob.perform_later(content) + end + + def purge + destroy + rescue ActiveRecord::InvalidForeignKey + end + + def purge_later + PurgeJob.perform_later(self) + end + end +end diff --git a/app/models/rosetta/translation.rb b/app/models/rosetta/translation.rb index a393b71..fdceb74 100644 --- a/app/models/rosetta/translation.rb +++ b/app/models/rosetta/translation.rb @@ -1,6 +1,15 @@ module Rosetta class Translation < ApplicationRecord - belongs_to :locale, class_name: "Rosetta::Locale", inverse_of: :translations - belongs_to :translation_key, class_name: "Rosetta::TranslationKey", inverse_of: :translations + belongs_to :target_locale, class_name: "Rosetta::Locale" + belongs_to :from, class_name: "Rosetta::TextEntry" + belongs_to :to, class_name: "Rosetta::TextEntry" + + after_destroy_commit :purge_orphaned_text_entries_later + + private + + def purge_orphaned_text_entries_later + to.purge_later + end end end diff --git a/app/models/rosetta/translation_key.rb b/app/models/rosetta/translation_key.rb deleted file mode 100644 index cccc3ae..0000000 --- a/app/models/rosetta/translation_key.rb +++ /dev/null @@ -1,11 +0,0 @@ -module Rosetta - class TranslationKey < ApplicationRecord - include Translated - - translated_in_all_locales - - def self.create_later(value) - AutodiscoveryJob.perform_later(value) - end - end -end diff --git a/app/views/rosetta/locales/translations/_navigation.html.erb b/app/views/rosetta/locales/translations/_navigation.html.erb index ce98c6b..da2ac71 100644 --- a/app/views/rosetta/locales/translations/_navigation.html.erb +++ b/app/views/rosetta/locales/translations/_navigation.html.erb @@ -6,7 +6,7 @@ <%= tab_link_to locale_translations_missing_index_path(@locale) do %> Missing <% end %> diff --git a/app/views/rosetta/locales/translations/index.html.erb b/app/views/rosetta/locales/translations/index.html.erb index eafea57..1068686 100644 --- a/app/views/rosetta/locales/translations/index.html.erb +++ b/app/views/rosetta/locales/translations/index.html.erb @@ -33,15 +33,16 @@ - + <%= render( - collection: @translation_keys, - partial: "rosetta/locales/translations/translation_key") %> + collection: @text_entries, + as: :text_entry, + partial: "rosetta/text_entries/text_entry_with_translation") %>
Translation KeyText Entry Translation
diff --git a/app/views/rosetta/locales/translations/_translation_key.html.erb b/app/views/rosetta/text_entries/_text_entry_with_translation.html.erb similarity index 50% rename from app/views/rosetta/locales/translations/_translation_key.html.erb rename to app/views/rosetta/text_entries/_text_entry_with_translation.html.erb index c878845..5035b39 100644 --- a/app/views/rosetta/locales/translations/_translation_key.html.erb +++ b/app/views/rosetta/text_entries/_text_entry_with_translation.html.erb @@ -1,13 +1,13 @@ - <%= translation_key.value %> + <%= text_entry.content %> - <%= turbo_frame_tag dom_id(translation_key) do %> - <%= translation_key.public_send("#{@locale.code}_translation")&.value %> + <%= turbo_frame_tag dom_id(text_entry) do %> + <%= text_entry.content_in(@locale) %> <% end %> diff --git a/app/views/rosetta/translations/edit.html.erb b/app/views/rosetta/translations/edit.html.erb index 9454e6c..18a9018 100644 --- a/app/views/rosetta/translations/edit.html.erb +++ b/app/views/rosetta/translations/edit.html.erb @@ -1,10 +1,10 @@ -<%= turbo_frame_tag dom_id(@translation_key) do %> - <%= form_with model: @translation_key, url: translation_key_translation_path(@translation_key), method: :patch, class: "relative" do |f| %> +<%= turbo_frame_tag dom_id(@text_entry) do %> + <%= form_with model: @text_entry, url: text_entry_translation_path(@text_entry), method: :patch, class: "relative" do |f| %> <%= hidden_field_tag :locale_id, @locale.id %>
- <%= f.label :"value_#{@locale.code}", "Translation", class: "sr-only" %> - <%= f.text_area :"value_#{@locale.code}", row: 3, autofocus: true, placeholder: "Enter your translation", class: "block w-full resize-none border-0 bg-transparent py-1.5 text-gray-900 placeholder:text-gray-400 focus:ring-0 sm:text-sm sm:leading-6" %> + <%= f.label :"content_#{@locale.code}", "Translation", class: "sr-only" %> + <%= f.text_area :"content_#{@locale.code}", row: 3, autofocus: true, placeholder: "Enter your translation", class: "block w-full resize-none border-0 bg-transparent py-1.5 text-gray-900 placeholder:text-gray-400 focus:ring-0 sm:text-sm sm:leading-6" %>