From 7cfb20b0d10164803d7858dd0e2fa2f38c4ddf89 Mon Sep 17 00:00:00 2001 From: Bilka Date: Tue, 12 Mar 2024 19:02:04 +0100 Subject: [PATCH 1/3] Fix unescaped interpolated reserved key in help text --- config/locales/en.yml | 6 ++---- config/locales/ru.yml | 6 ++---- lib/i18n/tasks/command/options/common.rb | 2 +- 3 files changed, 5 insertions(+), 9 deletions(-) diff --git a/config/locales/en.yml b/config/locales/en.yml index b641571a..c335c8d3 100644 --- a/config/locales/en.yml +++ b/config/locales/en.yml @@ -16,12 +16,10 @@ en: data_format: 'Data format: %{valid_text}.' keep_order: Keep the order of the keys key_pattern: Filter by key pattern (e.g. 'common.*') - key_pattern_to_rename: Full key (pattern) to rename. Required locale: :i18n_tasks.common.locale locale_to_translate_from: Locale to translate from locales_filter: 'Locale(s) to process. Special: base' missing_types: 'Filter by types: %{valid}' - new_key_name: New name, interpolates original name as %{key}. Required nostdin: Do not read from stdin out_format: 'Output format: %{valid_text}' pattern_router: 'Use pattern router: keys moved per config data.write' @@ -30,8 +28,8 @@ en: the config setting if set. translation_backend: Translation backend (google or deepl) value: >- - Value. Interpolates: %{value}, %{human_key}, %{key}, %{default}, %{value_or_human_key}, - %{value_or_default_or_human_key} + Value. Interpolates: %%{value}, %%{human_key}, %%{key}, %%{default}, %%{value_or_human_key}, + %%{value_or_default_or_human_key} desc: add_missing: add missing keys to locale data, optionally match a pattern check_consistent_interpolations: verify that all translations use correct interpolation variables diff --git a/config/locales/ru.yml b/config/locales/ru.yml index eab026d6..eda1246b 100644 --- a/config/locales/ru.yml +++ b/config/locales/ru.yml @@ -13,22 +13,20 @@ ru: data_format: 'Формат данных: %{valid_text}.' keep_order: Keep the order of the keys key_pattern: Маска ключа (например, common.*) - key_pattern_to_rename: Полный ключ (шаблон) для переименования. Необходимый параметр. locale: 'Язык. По умолчанию: base' locale_to_translate_from: 'Язык, с которого переводить (по умолчанию: base)' locales_filter: >- Список языков для обработки, разделенный запятыми (,). По умолчанию: все. Специальное значение: base. missing_types: 'Типы недостающих переводов: %{valid}. По умолчанию: все' - new_key_name: Новое имя, интерполирует оригинальное название как %{key}. Необходимый параметр. nostdin: Не читать дерево из стандартного ввода out_format: 'Формат вывода: %{valid_text}.' pattern_router: 'Использовать pattern_router: ключи распределятся по файлам согласно data.write' strict: Не угадывать динамические использования ключей, например `t("category.#{category.key}")` translation_backend: Движок перевода (google или deepl) value: >- - Значение, интерполируется с %{value}, %{human_key}, %{key}, %{default}, %{value_or_human_key}, - %{value_or_default_or_human_key} + Значение, интерполируется с %%{value}, %%{human_key}, %%{key}, %%{default}, %%{value_or_human_key}, + %%{value_or_default_or_human_key} desc: add_missing: добавить недостающие ключи к переводам check_consistent_interpolations: убедитесь, что во всех переводах используются правильные diff --git a/lib/i18n/tasks/command/options/common.rb b/lib/i18n/tasks/command/options/common.rb index ad24d2bb..554805d5 100644 --- a/lib/i18n/tasks/command/options/common.rb +++ b/lib/i18n/tasks/command/options/common.rb @@ -26,7 +26,7 @@ module Common arg :value, '-v', '--value VALUE', - t('i18n_tasks.cmd.args.desc.value') + t('i18n_tasks.cmd.args.desc.value', dummy: 'value') # Dummy value is workaround for https://github.com/ruby-i18n/i18n/issues/689 arg :config, '-c', From 6f512ba5e80f569bcbaf710601971dd90dc23629 Mon Sep 17 00:00:00 2001 From: Bilka Date: Tue, 12 Mar 2024 19:03:06 +0100 Subject: [PATCH 2/3] Ignore escaped interpolations in inconsistent interpolations check --- lib/i18n/tasks/interpolations.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/i18n/tasks/interpolations.rb b/lib/i18n/tasks/interpolations.rb index f67384fa..ba3db883 100644 --- a/lib/i18n/tasks/interpolations.rb +++ b/lib/i18n/tasks/interpolations.rb @@ -5,7 +5,7 @@ module Interpolations class << self attr_accessor :variable_regex end - @variable_regex = /%{[^}]+}/.freeze + @variable_regex = /(? Date: Tue, 7 May 2024 10:43:09 +0200 Subject: [PATCH 3/3] Add test for escaped interpolations in inconsisten interpolation check --- spec/interpolations_spec.rb | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/spec/interpolations_spec.rb b/spec/interpolations_spec.rb index bb4e2579..32afe9d1 100644 --- a/spec/interpolations_spec.rb +++ b/spec/interpolations_spec.rb @@ -5,8 +5,14 @@ RSpec.describe 'Interpolations' do let!(:task) { I18n::Tasks::BaseTask.new } - let(:base_keys) { { 'a' => 'hello %{world}', 'b' => 'foo', 'c' => { 'd' => 'hello %{name}' }, 'e' => 'ok' } } - let(:test_keys) { { 'a' => 'hello', 'b' => 'foo %{bar}', 'c' => { 'd' => 'hola %{amigo}' }, 'e' => 'ok' } } + let(:base_keys) do + { 'a' => 'hello %{world}', 'b' => 'foo', 'c' => { 'd' => 'hello %{name}' }, 'e' => 'ok', 'f' => '%%{escaped}', + 'g' => 'okay' } + end + let(:test_keys) do + { 'a' => 'hello', 'b' => 'foo %{bar}', 'c' => { 'd' => 'hola %{amigo}' }, 'e' => 'ok', 'f' => 'okay', + 'g' => '%%{ignored}' } + end around do |ex| TestCodebase.setup(