From 0adb6af9f40b020a2e7a9e730dfcfb7f71c9ecb4 Mon Sep 17 00:00:00 2001 From: Tim Riley Date: Sat, 23 May 2026 16:00:59 +1000 Subject: [PATCH] Add i18n to Gemfile and generate i18n files --- CHANGELOG.md | 1 + lib/hanami/cli/generators/app/slice.rb | 6 ++++++ lib/hanami/cli/generators/gem/app.rb | 1 + lib/hanami/cli/generators/gem/app/gemfile.erb | 1 + lib/hanami/cli/generators/i18n.yml | 3 +++ .../hanami/cli/commands/app/generate/slice_spec.rb | 9 +++++++++ spec/unit/hanami/cli/commands/gem/new_spec.rb | 12 ++++++++++++ 7 files changed, 33 insertions(+) create mode 100644 lib/hanami/cli/generators/i18n.yml diff --git a/CHANGELOG.md b/CHANGELOG.md index a9a4dd1c..0e97d136 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -9,6 +9,7 @@ and this project adheres to [Break Versioning](https://www.taoensso.com/break-ve ### Added +- Add `i18n` gem to the default `Gemfile`, and generate a placeholder `config/i18n/en.yml` for the app and each generated slice. (@timriley) - Add `--name` option to `hanami new`, to specify a custom module namespace while using the positional argument as the directory path. For example, `hanami new my_bookshelf --name=bookshelf` creates the app in `my_bookshelf/` with `Bookshelf` as the module name. (@aaronmallen in #387) - Add `--template-engine` option to `hanami generate` and `hanami new` to specify which template engine should be used for generated template files. Supports `erb`, `haml` and `slim`. (@katafrakt in #280, #389, #390) - Add `--test` option to `hanami new` to specify which test framework to use. Supports `rspec` (default) and `minitest`. (@timriley in #399) diff --git a/lib/hanami/cli/generators/app/slice.rb b/lib/hanami/cli/generators/app/slice.rb index 51e754aa..f6d70d04 100644 --- a/lib/hanami/cli/generators/app/slice.rb +++ b/lib/hanami/cli/generators/app/slice.rb @@ -85,6 +85,12 @@ def call(app, slice, url, force: false, **opts) # rubocop:disable Metrics/AbcSiz force: ) + fs.create( + fs.join(directory, "config", "i18n", "en.yml"), + File.read(File.join(__dir__, "..", "i18n.yml")), + force: + ) + if Hanami.bundled?("dry-operation") RubyClassFile.new( fs: fs, diff --git a/lib/hanami/cli/generators/gem/app.rb b/lib/hanami/cli/generators/gem/app.rb index 29aaa501..f7916ca1 100644 --- a/lib/hanami/cli/generators/gem/app.rb +++ b/lib/hanami/cli/generators/gem/app.rb @@ -53,6 +53,7 @@ def generate_app(app, context) # rubocop:disable Metrics/AbcSize fs.create("config/settings.rb", t("settings.erb", context)) fs.create("config/routes.rb", t("routes.erb", context)) fs.create("config/puma.rb", t("puma.erb", context)) + fs.create("config/i18n/en.yml", File.read(File.join(__dir__, "..", "i18n.yml"))) fs.create("lib/tasks/.keep", t("keep.erb", context)) fs.create("lib/#{app}/types.rb", t("types.erb", context)) diff --git a/lib/hanami/cli/generators/gem/app/gemfile.erb b/lib/hanami/cli/generators/gem/app/gemfile.erb index 81c1484b..20488f6b 100644 --- a/lib/hanami/cli/generators/gem/app/gemfile.erb +++ b/lib/hanami/cli/generators/gem/app/gemfile.erb @@ -22,6 +22,7 @@ source "<%= gem_source %>" gem "dry-types", "~> 1.7" gem "dry-operation", ">= 1.0.1" gem "dry-validation", "~> 1.11" +gem "i18n", "~> 1.14" gem "puma", ">= 7.1" gem "rake" <%- if generate_sqlite? -%> diff --git a/lib/hanami/cli/generators/i18n.yml b/lib/hanami/cli/generators/i18n.yml new file mode 100644 index 00000000..0a9b0aee --- /dev/null +++ b/lib/hanami/cli/generators/i18n.yml @@ -0,0 +1,3 @@ +# Add your translations here. See https://hanakai.org/learn/hanami/i18n for details. +en: + hello: "Hello" diff --git a/spec/unit/hanami/cli/commands/app/generate/slice_spec.rb b/spec/unit/hanami/cli/commands/app/generate/slice_spec.rb index f198278f..4cc253ee 100644 --- a/spec/unit/hanami/cli/commands/app/generate/slice_spec.rb +++ b/spec/unit/hanami/cli/commands/app/generate/slice_spec.rb @@ -193,6 +193,15 @@ class Operation < Test::Operation expect(fs.read("slices/#{slice}/templates/layouts/app.html.erb")).to eq(layout) expect(output).to include("Created slices/#{slice}/templates/layouts/app.html.erb") + # slices/admin/config/i18n/en.yml + i18n = <<~EXPECTED + # Add your translations here. See https://hanakai.org/learn/hanami/i18n for details. + en: + hello: "Hello" + EXPECTED + expect(fs.read("slices/#{slice}/config/i18n/en.yml")).to eq(i18n) + expect(output).to include("Created slices/#{slice}/config/i18n/en.yml") + # slices/admin/assets/js/app.js app_js = <<~EXPECTED import "../css/app.css"; diff --git a/spec/unit/hanami/cli/commands/gem/new_spec.rb b/spec/unit/hanami/cli/commands/gem/new_spec.rb index 869840d3..05ab93e1 100644 --- a/spec/unit/hanami/cli/commands/gem/new_spec.rb +++ b/spec/unit/hanami/cli/commands/gem/new_spec.rb @@ -168,6 +168,7 @@ gem "dry-types", "~> 1.7" gem "dry-operation", ">= 1.0.1" gem "dry-validation", "~> 1.11" + gem "i18n", "~> 1.14" gem "puma", ">= 7.1" gem "rake" gem "sqlite3" @@ -401,6 +402,15 @@ class Routes < Hanami::Routes expect(fs.read("config/puma.rb")).to eq(puma) expect(output).to include("Created config/puma.rb") + # config/i18n/en.yml + i18n = <<~EXPECTED + # Add your translations here. See https://hanakai.org/learn/hanami/i18n for details. + en: + hello: "Hello" + EXPECTED + expect(fs.read("config/i18n/en.yml")).to eq(i18n) + expect(output).to include("Created config/i18n/en.yml") + # lib/tasks/.keep tasks_keep = <<~EXPECTED EXPECTED @@ -574,6 +584,7 @@ class Operation < Dry::Operation gem "dry-types", "~> 1.7" gem "dry-operation", ">= 1.0.1" gem "dry-validation", "~> 1.11" + gem "i18n", "~> 1.14" gem "puma", ">= 7.1" gem "rake" gem "sqlite3" @@ -737,6 +748,7 @@ class Operation < Dry::Operation gem "dry-types", "~> 1.7" gem "dry-operation", ">= 1.0.1" gem "dry-validation", "~> 1.11" + gem "i18n", "~> 1.14" gem "puma", ">= 7.1" gem "rake" gem "sqlite3"