i18nize 0.4.5 → 0.5.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 554c7500faf755b35e18493fdb4f69b2a14e3554448644979c8065f5e8ba4d3e
4
- data.tar.gz: 50c639f8e40929e7376ecc207e6a422e071c5526de8c100ee01c10c03e6cefc9
3
+ metadata.gz: ecaecd54d2f036282dddadfefe26591090c54272cf6a5646fb12d53367509795
4
+ data.tar.gz: '08adc947c1a7b46f2f7e3dc486d3429bb9e404ed9d7b61ab683a6813ee45cbd2'
5
5
  SHA512:
6
- metadata.gz: e3430a473e47b1d4837d1f0f5343c461695ac1be8ca8225e6a02be4326754dae424ccb6477555e258487aaffef0d7e389b1873908c27bd67f0f8f9995fb3811e
7
- data.tar.gz: be813068492685523dd09fa531fe174642a7850f193b9c36082448744764350e45ff1d14ff49386a7d04dd06afc302b8c4073ddcf0ee4c6c57a4f81ced6160fe
6
+ metadata.gz: 0a32cac5c9df881264c7ae1688345410efa5ed64d8a3481526f83d2f4ef84f888af4e83fdce0af2da09f9f2594918d2606ffe31bd3c66e4a7af84f823c2443eb
7
+ data.tar.gz: 68fa3a1028e87cf9965e20be6ab5b663c438b0b27ec3269fc8fc7a4543a59551f832d206e416cf79784e38cca474be09aa9ddc47d208bd581cf0aa830f0d4ce5
data/CHANGELOG.md CHANGED
@@ -1,5 +1,96 @@
1
+ # Changelog
2
+
1
3
  ## [Unreleased]
2
4
 
3
- ## [0.1.0] - 2025-07-30
5
+ ---
6
+
7
+ ### Added
8
+ ### Changed
9
+ ### Removed
10
+ ### Fixed
11
+
12
+ ---
13
+
14
+ ---
15
+
16
+ ## [0.5.0] - 2025-09-08
17
+ ### Added
18
+ - **Conflict policy**: source locale is now treated as the source of truth.
19
+ If the target locale has a scalar where a nested hash is required, the scalar is **overwritten** with the correct structure from the source.
20
+ - **Pluralization support**: automatic handling of `one`, `other`, and related plural keys. Scalars can be coerced into plural hashes.
21
+ - **Placeholder preservation**: `%{count}` and other I18n-style placeholders are protected from being altered by DeepL.
22
+ - Improved file name detection for `.yml` and `.yaml` formats, including names like `app.en.yml`.
23
+
24
+ ### Changed
25
+ - Default behaviour: conflicts are no longer skipped or raise errors, but are resolved by overwriting with source locale values.
26
+
27
+ ### Removed
28
+ - **Rake task `i18nize:translate`** has been removed.
29
+ Use the CLI instead:
30
+ ```bash
31
+ i18nize cs
32
+ i18nize cs --from en
33
+ i18nize cs --missing
34
+ ```
35
+
36
+ ### Fixed
37
+
38
+ * Eliminated `IndexError: string not matched` errors when attempting to insert into scalar values.
39
+
40
+ ---
41
+
42
+ ## \[0.4.4] - 2025-09-08
43
+
44
+ ### Added
45
+
46
+ * CLI option `--missing [FROM]` to list missing keys without translating.
47
+
48
+ * `i18nize cs --missing` → shows missing Czech keys (from English).
49
+ * `i18nize cs --missing de` → shows missing Czech keys (from German).
50
+
51
+ ---
52
+
53
+ ## \[0.4.2.1] - 2025-09-08
54
+
55
+ ### Fixed
56
+
57
+ * Correct requires for `Translator` and `Inserter` inside CLI (prevented `NameError`).
58
+
59
+ ---
60
+
61
+ ## \[0.4.2] - 2025-09-08
62
+
63
+ ### Added
64
+
65
+ * `.env` file support (via `dotenv` if present).
66
+ * Improved CLI error messages.
67
+
68
+ ---
69
+
70
+ ## \[0.4.1] - 2025-09-08
71
+
72
+ ### Fixed
73
+
74
+ * File path normalization for top-level locales (`en.yml` → `cs.yml`).
75
+ * Safer regex for file name replacement.
76
+
77
+ ---
78
+
79
+ ## \[0.4.0] - 2025-08-25
80
+
81
+ ### Added
82
+
83
+ * Standalone CLI (`i18nize <locale>`) — no need to call only via Rake.
84
+ * Basic `--from` option for source language.
85
+
86
+ ---
87
+
88
+ ## \[0.1.0] - 2025-07-30
89
+
90
+ ### Added
4
91
 
5
- - Initial release
92
+ * Initial release.
93
+ * DeepL translation of missing keys.
94
+ * Character count estimation and confirmation prompt.
95
+ * Automatic creation of target locale files.
96
+ * Rake task `i18nize:translate[locale]`.
data/README.md CHANGED
@@ -1,19 +1,18 @@
1
1
  # i18nize
2
2
 
3
- 🧠 Automatically fills in missing I18n YAML keys using DeepL translation API.
3
+ 🧠 Automatically fills in missing I18n YAML keys using DeepL translation API.
4
4
  Designed to streamline multi-language support in Ruby and Rails projects.
5
5
 
6
-
7
6
  ## ✨ Features
8
7
 
9
- - Detects missing or empty translation keys in locale files
10
- - Supports multiple YAML files and nested directories (e.g. `config/locales/api/en.yml`)
11
- - Automatically translates from a source locale (default: `en`) to a target (e.g. `cs`)
12
- - Integrates with DeepL API (Free or Pro)
13
- - Safely merges translations into corresponding `*.yml` files
14
- - Includes character count check with confirmation
15
- - CLI via Rake task
16
-
8
+ * Detects missing or empty translation keys in locale files
9
+ * Supports multiple YAML files and nested directories (e.g. `config/locales/api/en.yml`)
10
+ * Automatically translates from a source locale (**default: `en`**) to a target (e.g. `cs`)
11
+ * Integrates with DeepL API (Free or Pro)
12
+ * Safely merges translations into corresponding `*.yml` files
13
+ * Handles structural conflicts by overwriting target with source truth
14
+ * Character count check with confirmation prompt
15
+ * CLI (`i18nize`)
17
16
 
18
17
  ## 🔧 Installation
19
18
 
@@ -21,7 +20,7 @@ Add this line to your application's Gemfile:
21
20
 
22
21
  ```ruby
23
22
  gem "i18nize"
24
- ````
23
+ ```
25
24
 
26
25
  Then run:
27
26
 
@@ -35,61 +34,70 @@ Or install manually:
35
34
  gem install i18nize
36
35
  ```
37
36
 
38
-
39
37
  ## 🚀 Usage
40
38
 
41
39
  ### 1. Set your DeepL API key
42
40
 
43
- Create a `.env` or export it in your shell:
41
+ Create a `.env` file (loaded automatically if you use `dotenv`) or export it in your shell:
44
42
 
45
43
  ```bash
46
44
  export DEEPL_API_KEY=your-api-key
47
45
  export DEEPL_ENDPOINT=https://api.deepl.com/v2/translate # Only if you are using a DeepL Pro account
48
46
  ```
49
47
 
50
- > You can use the [Free DeepL API](https://www.deepl.com/pro#developer)
51
-
52
-
48
+ 👉 You can use the [Free DeepL API](https://www.deepl.com/pro#developer).
53
49
 
54
- ### 2. Run the translation task
50
+ ### 2. Run translations via CLI
55
51
 
56
52
  ```bash
57
- bundle exec rake "i18nize:translate[language]"
53
+ # Translate from en → cs
54
+ i18nize cs
55
+
56
+ # Translate from de → fr
57
+ i18nize fr --from de
58
58
  ```
59
59
 
60
60
  💬 This will:
61
61
 
62
- * Scan config/locales/**/*en.yml (English is the default source language)
63
- * Detect which `language.yml` files are missing keys
62
+ * Scan `config/locales/**/*en.yml` (or your chosen source language)
63
+ * Detect which `cs.yml` files are missing keys
64
64
  * Use DeepL to translate missing values
65
- * Write them to the appropriate files (e.g. `config/locales/errors/language.yml`)
65
+ * Write them to the appropriate files (creating them if needed)
66
+
67
+ ### 3. Show missing keys only
68
+
69
+ ```bash
70
+ # Missing cs keys (source en)
71
+ i18nize cs --missing
72
+
73
+ # Missing cs keys (source de)
74
+ i18nize cs --missing de
75
+ ```
66
76
 
77
+ This mode only lists missing keys, no translations are written.
67
78
 
68
79
 
69
80
  ## 🛡️ Character limit check
70
81
 
71
- Before translating, the task will:
82
+ Before translating, the CLI:
72
83
 
73
- * Count the total number of characters to be translated
74
- * Warn if the count exceeds **500,000** (DeepL Free monthly limit)
75
- * Ask for confirmation:
84
+ * Counts the total number of characters
85
+ * Warns if the count exceeds **500,000** (DeepL Free monthly limit)
86
+ * Asks for confirmation:
76
87
 
77
88
  ```text
78
89
  [i18nize] Estimated character count: 43125
79
90
  Proceed with translation? [y/N]:
80
91
  ```
81
92
 
82
-
83
-
84
93
  ## 🗂️ Locale file support
85
94
 
86
- * Files are grouped per folder and matched:
95
+ * Files are matched by name:
87
96
 
88
- * `config/locales/api/en.yml` → `config/locales/api/cs.yml`
89
- * `config/locales/en.devise.yml` → `config/locales/cs.devise.yml`
97
+ * `config/locales/api/en.yml` → `config/locales/api/cs.yml`
98
+ * `config/locales/en.devise.yml` → `config/locales/cs.devise.yml`
90
99
  * Missing files are created automatically
91
-
92
-
100
+ * If a scalar exists where a nested structure is required, **it is overwritten by source locale structure**
93
101
 
94
102
  ## 🧩 Example structure
95
103
 
@@ -102,7 +110,13 @@ config/locales/
102
110
  │ └── cs.yml
103
111
  ```
104
112
 
105
- After running `rake i18nize:translate[cs]`, the gem will create:
113
+ After running:
114
+
115
+ ```bash
116
+ i18nize cs
117
+ ```
118
+
119
+ the gem will create:
106
120
 
107
121
  ```
108
122
  config/locales/api/cs.yml
@@ -114,16 +128,19 @@ With keys translated from `api/en.yml`.
114
128
 
115
129
  ## 📦 Configuration
116
130
 
117
- For now, configuration is via method arguments and `ENV["DEEPL_API_KEY"]`.
118
- Optional future support: `.i18nize.yml`.
131
+ For now, configuration is via CLI flags and environment variables:
119
132
 
133
+ * `--from LANG` (default `en`)
134
+ * `--missing [FROM]` (list missing keys only)
135
+ * `DEEPL_API_KEY` (required)
136
+ * `DEEPL_ENDPOINT` (optional, only for Pro)
120
137
 
138
+ ---
121
139
 
122
140
  ## 🔍 TODO
123
141
 
124
- * Test suite (RSpec)
125
- * YAML key sorting and format preservation
126
- * Smart overwrite protection
127
- * Changeable source language
128
-
142
+ * RSpec test suite
143
+ * YAML key sorting / format preservation
144
+ * Richer conflict resolution strategies (configurable overwrite / skip)
145
+ * Use custom char limit
129
146
 
@@ -15,15 +15,14 @@ module I18nize
15
15
  dirname = File.dirname(from_path)
16
16
  filename = File.basename(from_path)
17
17
 
18
- expected_to_filename =
19
- filename.sub(/(^|[._])#{Regexp.escape(from_locale)}\.yml$/, "\\1#{to_locale}.yml")
20
-
21
- to_path =
22
- if dirname == "." || dirname.empty?
23
- expected_to_filename
24
- else
25
- File.join(dirname, expected_to_filename)
26
- end
18
+ locale_re = /(^|[._])#{Regexp.escape(from_locale)}\.(ya?ml)$/
19
+ expected_to_filename = filename.sub(locale_re) { "#{Regexp.last_match(1)}#{to_locale}.#{Regexp.last_match(2)}" }
20
+
21
+ to_path = if dirname == "." || dirname.empty?
22
+ expected_to_filename
23
+ else
24
+ File.join(dirname, expected_to_filename)
25
+ end
27
26
 
28
27
  to_keys = to_data[to_path] || {}
29
28
 
@@ -6,32 +6,32 @@ require_relative "comparer"
6
6
 
7
7
  module I18nize
8
8
  class Inserter
9
+ CONFLICT_POLICY = :overwrite # :overwrite | :skip
10
+
9
11
  def self.insert_missing(from_locale: "en", to_locale:, base_path: "config/locales", translator: nil)
10
12
  missing_data = Comparer.missing_translations(from_locale: from_locale, to_locale: to_locale)
11
13
 
12
14
  if translator
13
15
  char_count = missing_data.character_count
14
16
  puts "\n\e[33m[i18nize] Estimated character count: #{char_count}\e[0m"
15
-
16
- if char_count > 500_000
17
- puts "\e[31m[i18nize] Warning: DeepL Free has a 500,000 character monthly limit.\e[0m"
18
- end
19
-
17
+ puts "\e[31m[i18nize] Warning: DeepL Free has a 500,000 character monthly limit.\e[0m" if char_count > 500_000
20
18
  print "\e[36mProceed with translation? [y/N]: \e[0m"
21
- answer = $stdin.gets.strip.downcase
22
-
19
+ answer = $stdin.gets.to_s.strip.downcase
23
20
  unless answer == "y"
24
21
  puts "\e[90m[i18nize] Aborted by user.\e[0m"
25
22
  return
26
23
  end
27
24
  end
28
25
 
26
+ overwrites = []
27
+
29
28
  missing_data.data.each do |from_rel_path, translations|
30
29
  dirname = File.dirname(from_rel_path)
31
30
  filename = File.basename(from_rel_path)
32
31
 
33
- new_filename = filename.sub(/^#{from_locale}\.yml$/, "#{to_locale}.yml")
34
- to_rel_path = File.join(dirname, new_filename)
32
+ locale_re = /(^|[._])#{Regexp.escape(from_locale)}\.(ya?ml)$/
33
+ new_filename = filename.sub(locale_re) { "#{Regexp.last_match(1)}#{to_locale}.#{Regexp.last_match(2)}" }
34
+ to_rel_path = dirname == "." || dirname.empty? ? new_filename : File.join(dirname, new_filename)
35
35
  to_full_path = File.join(base_path, to_rel_path)
36
36
 
37
37
  existing = File.exist?(to_full_path) ? YAML.load_file(to_full_path) : {}
@@ -39,16 +39,16 @@ module I18nize
39
39
 
40
40
  translation_map =
41
41
  if translator
42
- en_values = translations.values
43
- translated_values = translator.translate_texts(en_values)
44
- translations.keys.zip(translated_values.values).to_h
42
+ src_values = translations.values
43
+ translated_values = translator.translate_texts(src_values) # => pole!
44
+ translations.keys.zip(translated_values).to_h
45
45
  else
46
46
  translations
47
47
  end
48
48
 
49
- translation_map.each do |key, value|
50
- path = key.sub(/^#{from_locale}\./, "").split(".")
51
- insert_nested(existing[to_locale], path, value)
49
+ translation_map.each do |full_key, value|
50
+ path = full_key.sub(/^#{Regexp.escape(from_locale)}\./, "").split(".")
51
+ insert_nested(existing[to_locale], path, value, overwrites, to_rel_path, to_locale, CONFLICT_POLICY)
52
52
  end
53
53
 
54
54
  FileUtils.mkdir_p(File.dirname(to_full_path))
@@ -56,16 +56,41 @@ module I18nize
56
56
 
57
57
  puts "\e[32m[i18nize] Inserted #{translation_map.size} keys into #{to_full_path}\e[0m"
58
58
  end
59
+
60
+ if overwrites.any?
61
+ puts "\n\e[33m[i18nize] Overwrote #{overwrites.size} scalar node(s) to create nested structure:\e[0m"
62
+ overwrites.each do |c|
63
+ puts " \e[33m- #{c[:file]}: #{c[:locale]}.#{c[:path].join('.')}\e[0m (was: #{c[:existing_class]})"
64
+ end
65
+ end
59
66
  end
60
67
 
61
- def self.insert_nested(base, keys, value)
68
+ # conflict_policy: :overwrite (replace scalar with {}), :skip (leave as is)
69
+ def self.insert_nested(base, keys, value, overwrites, file, locale, conflict_policy)
62
70
  key = keys.shift
63
- base[key] ||= {}
64
71
 
65
72
  if keys.empty?
66
73
  base[key] = value
74
+ return true
75
+ end
76
+
77
+ cur = base[key]
78
+
79
+ case cur
80
+ when nil
81
+ base[key] = {}
82
+ insert_nested(base[key], keys, value, overwrites, file, locale, conflict_policy)
83
+ when Hash
84
+ insert_nested(cur, keys, value, overwrites, file, locale, conflict_policy)
67
85
  else
68
- insert_nested(base[key], keys, value)
86
+ if conflict_policy == :overwrite
87
+ overwrites << { file: file, locale: locale, path: [key, *keys], existing_class: cur.class.to_s }
88
+ base[key] = {}
89
+ insert_nested(base[key], keys, value, overwrites, file, locale, conflict_policy)
90
+ else
91
+ # :skip
92
+ false
93
+ end
69
94
  end
70
95
  end
71
96
  end
@@ -1,5 +1,4 @@
1
1
  # frozen_string_literal: true
2
-
3
2
  require "net/http"
4
3
  require "uri"
5
4
  require "json"
@@ -7,42 +6,44 @@ require "json"
7
6
  module I18nize
8
7
  class Translator
9
8
  ENDPOINT = ENV.fetch("DEEPL_ENDPOINT", "https://api-free.deepl.com/v2/translate")
9
+ PLACEHOLDER_RE = /%{\s*[^}]+\s*}/
10
10
 
11
11
  def initialize(auth_key:, from_lang: "EN", to_lang:)
12
- @auth_key = auth_key
12
+ @auth_key = auth_key
13
13
  @from_lang = from_lang
14
- @to_lang = to_lang
14
+ @to_lang = to_lang
15
15
  end
16
16
 
17
17
  def translate_texts(texts)
18
- return {} if texts.empty?
18
+ return [] if texts.empty?
19
+
20
+ placeholders = []
21
+ protected = texts.map do |t|
22
+ t.to_s.gsub(PLACEHOLDER_RE) do |m|
23
+ idx = placeholders.size
24
+ placeholders << m
25
+ "__I18NIZE_PLH_#{idx}__"
26
+ end
27
+ end
19
28
 
20
29
  uri = URI(ENDPOINT)
21
-
22
- # Opakující se text parametry
23
30
  body_params = [
24
31
  ["auth_key", @auth_key],
25
32
  ["source_lang", @from_lang],
26
33
  ["target_lang", @to_lang],
27
- ] + texts.map { |text| ["text", text] }
34
+ ] + protected.map { |text| ["text", text] }
28
35
 
29
- request = Net::HTTP::Post.new(uri)
30
- request["Content-Type"] = "application/x-www-form-urlencoded"
31
- request.body = URI.encode_www_form(body_params)
36
+ req = Net::HTTP::Post.new(uri)
37
+ req["Content-Type"] = "application/x-www-form-urlencoded"
38
+ req.body = URI.encode_www_form(body_params)
32
39
 
33
- response = Net::HTTP.start(uri.hostname, uri.port, use_ssl: true) do |http|
34
- http.request(request)
35
- end
40
+ res = Net::HTTP.start(uri.hostname, uri.port, use_ssl: true) { |h| h.request(req) }
41
+ raise "DeepL API Error: #{res.code} - #{res.body}" unless res.is_a?(Net::HTTPSuccess)
36
42
 
37
- unless response.is_a?(Net::HTTPSuccess)
38
- raise "DeepL API Error: #{response.code} - #{response.body}"
39
- end
40
-
41
- json = JSON.parse(response.body)
42
- translated = json["translations"].map { |t| t["text"] }
43
+ json = JSON.parse(res.body)
44
+ out = json["translations"].map { |t| t["text"] }
43
45
 
44
- Hash[texts.zip(translated)]
46
+ out.map { |s| s.gsub(/__I18NIZE_PLH_(\d+)__/) { placeholders[$1.to_i] } }
45
47
  end
46
48
  end
47
49
  end
48
-
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module I18nize
4
- VERSION = "0.4.5"
4
+ VERSION = "0.5.1"
5
5
  end
metadata CHANGED
@@ -1,16 +1,27 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: i18nize
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.4.5
4
+ version: 0.5.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - nikolas2145
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2025-09-08 00:00:00.000000000 Z
11
+ date: 2025-09-09 00:00:00.000000000 Z
12
12
  dependencies: []
13
- description: ''
13
+ description: "i18nize helps Ruby and Rails projects stay multilingual by automatically
14
+ filling in \nmissing translations in I18n YAML locale files. It scans for missing
15
+ or empty keys \nacross nested locale structures, and uses the DeepL API (Free or
16
+ Pro) to translate \nthem from a chosen source locale (default: en).\n\nFeatures:\n-
17
+ Detects and lists missing translation keys\n- Automatically translates and inserts
18
+ values into the correct YAML files\n- Supports nested directories and multiple locale
19
+ files (e.g. config/locales/api/en.yml)\n- Preserves I18n placeholders such as %{count}\n-
20
+ Handles pluralization branches (one, other, etc.)\n- Source locale is treated as
21
+ the single source of truth (conflicts are resolved by overwrite)\n- Simple CLI:
22
+ `i18nize <locale>` or `i18nize <locale> --missing`\n\nThis gem streamlines the translation
23
+ workflow, making it easier to maintain \nconsistent, up-to-date locale files across
24
+ large Ruby on Rails applications.\n"
14
25
  email:
15
26
  - nikolas2145@gmail.com
16
27
  executables:
@@ -18,11 +29,6 @@ executables:
18
29
  extensions: []
19
30
  extra_rdoc_files: []
20
31
  files:
21
- - ".idea/.gitignore"
22
- - ".idea/git_toolbox_prj.xml"
23
- - ".idea/i18nize.iml"
24
- - ".idea/material_theme_project_new.xml"
25
- - ".idea/vcs.xml"
26
32
  - ".rspec"
27
33
  - ".rubocop.yml"
28
34
  - CHANGELOG.md
@@ -66,5 +72,5 @@ requirements: []
66
72
  rubygems_version: 3.4.19
67
73
  signing_key:
68
74
  specification_version: 4
69
- summary: Auto-translates missing I18n keys in YAML files using DeepL.
75
+ summary: Automatic DeepL-powered translations for I18n YAML files
70
76
  test_files: []
data/.idea/.gitignore DELETED
@@ -1,8 +0,0 @@
1
- # Default ignored files
2
- /shelf/
3
- /workspace.xml
4
- # Editor-based HTTP Client requests
5
- /httpRequests/
6
- # Datasource local storage ignored files
7
- /dataSources/
8
- /dataSources.local.xml
@@ -1,15 +0,0 @@
1
- <?xml version="1.0" encoding="UTF-8"?>
2
- <project version="4">
3
- <component name="GitToolBoxProjectSettings">
4
- <option name="commitMessageIssueKeyValidationOverride">
5
- <BoolValueOverride>
6
- <option name="enabled" value="true" />
7
- </BoolValueOverride>
8
- </option>
9
- <option name="commitMessageValidationEnabledOverride">
10
- <BoolValueOverride>
11
- <option name="enabled" value="true" />
12
- </BoolValueOverride>
13
- </option>
14
- </component>
15
- </project>
data/.idea/i18nize.iml DELETED
@@ -1,53 +0,0 @@
1
- <?xml version="1.0" encoding="UTF-8"?>
2
- <module version="4">
3
- <component name="ModuleRunConfigurationManager">
4
- <shared />
5
- </component>
6
- <component name="RakeTasksCache-v2">
7
- <option name="myRootTask">
8
- <RakeTaskImpl id="rake">
9
- <subtasks>
10
- <RakeTaskImpl description="Build i18nize-0.4.0.gem into the pkg directory" fullCommand="build" id="build" />
11
- <RakeTaskImpl id="build">
12
- <subtasks>
13
- <RakeTaskImpl description="Generate SHA512 checksum of i18nize-0.4.0.gem into the checksums directory" fullCommand="build:checksum" id="checksum" />
14
- </subtasks>
15
- </RakeTaskImpl>
16
- <RakeTaskImpl description="Remove any temporary products" fullCommand="clean" id="clean" />
17
- <RakeTaskImpl description="Remove any generated files" fullCommand="clobber" id="clobber" />
18
- <RakeTaskImpl id="i18nize">
19
- <subtasks>
20
- <RakeTaskImpl description="Auto-translate missing I18n keys using DeepL (usage: rake 'i18nize:translate[cs]')" fullCommand="i18nize:translate[to_locale]" id="translate[to_locale]" />
21
- <RakeTaskImpl description="" fullCommand="i18nize:translate" id="translate" />
22
- </subtasks>
23
- </RakeTaskImpl>
24
- <RakeTaskImpl description="Build and install i18nize-0.4.0.gem into system gems" fullCommand="install" id="install" />
25
- <RakeTaskImpl id="install">
26
- <subtasks>
27
- <RakeTaskImpl description="Build and install i18nize-0.4.0.gem into system gems without network access" fullCommand="install:local" id="local" />
28
- </subtasks>
29
- </RakeTaskImpl>
30
- <RakeTaskImpl description="Create tag v0.4.0 and build and push i18nize-0.4.0.gem to https://rubygems.org" fullCommand="release[remote]" id="release[remote]" />
31
- <RakeTaskImpl description="Run RuboCop" fullCommand="rubocop" id="rubocop" />
32
- <RakeTaskImpl id="rubocop">
33
- <subtasks>
34
- <RakeTaskImpl description="Autocorrect RuboCop offenses (only when it's safe)" fullCommand="rubocop:autocorrect" id="autocorrect" />
35
- <RakeTaskImpl description="Autocorrect RuboCop offenses (safe and unsafe)" fullCommand="rubocop:autocorrect_all" id="autocorrect_all" />
36
- <RakeTaskImpl description="" fullCommand="rubocop:auto_correct" id="auto_correct" />
37
- </subtasks>
38
- </RakeTaskImpl>
39
- <RakeTaskImpl description="Run RSpec code examples" fullCommand="spec" id="spec" />
40
- <RakeTaskImpl description="" fullCommand="default" id="default" />
41
- <RakeTaskImpl description="" fullCommand="release" id="release" />
42
- <RakeTaskImpl id="release">
43
- <subtasks>
44
- <RakeTaskImpl description="" fullCommand="release:guard_clean" id="guard_clean" />
45
- <RakeTaskImpl description="" fullCommand="release:rubygem_push" id="rubygem_push" />
46
- <RakeTaskImpl description="" fullCommand="release:source_control_push" id="source_control_push" />
47
- </subtasks>
48
- </RakeTaskImpl>
49
- </subtasks>
50
- </RakeTaskImpl>
51
- </option>
52
- </component>
53
- </module>
@@ -1,12 +0,0 @@
1
- <?xml version="1.0" encoding="UTF-8"?>
2
- <project version="4">
3
- <component name="MaterialThemeProjectNewConfig">
4
- <option name="metadata">
5
- <MTProjectMetadataState>
6
- <option name="migrated" value="true" />
7
- <option name="pristineConfig" value="false" />
8
- <option name="userId" value="-151e60b4:18eb353ec10:-7ffc" />
9
- </MTProjectMetadataState>
10
- </option>
11
- </component>
12
- </project>
data/.idea/vcs.xml DELETED
@@ -1,6 +0,0 @@
1
- <?xml version="1.0" encoding="UTF-8"?>
2
- <project version="4">
3
- <component name="VcsDirectoryMappings">
4
- <mapping directory="$PROJECT_DIR$" vcs="Git" />
5
- </component>
6
- </project>